summaryrefslogtreecommitdiff
path: root/TAO/orbsvcs/orbsvcs
diff options
context:
space:
mode:
authorWilliam R. Otte <wotte@dre.vanderbilt.edu>2006-07-24 15:50:21 +0000
committerWilliam R. Otte <wotte@dre.vanderbilt.edu>2006-07-24 15:50:21 +0000
commit3aff90f4a822fcf5d902bbfbcc9fa931d6191a8c (patch)
tree197c810e5f5bce17b1233a7cb8d7b50c0bcd25e2 /TAO/orbsvcs/orbsvcs
parent6b846cf03c0bcbd8c276cb0af61a181e5f98eaae (diff)
downloadATCD-3aff90f4a822fcf5d902bbfbcc9fa931d6191a8c.tar.gz
Repo restructuring
Diffstat (limited to 'TAO/orbsvcs/orbsvcs')
-rw-r--r--TAO/orbsvcs/orbsvcs/ATLAS.idl88
-rw-r--r--TAO/orbsvcs/orbsvcs/AV.mpc85
-rw-r--r--TAO/orbsvcs/orbsvcs/AV.rc30
-rw-r--r--TAO/orbsvcs/orbsvcs/AV/AVStreams_i.cpp5309
-rw-r--r--TAO/orbsvcs/orbsvcs/AV/AVStreams_i.h1536
-rw-r--r--TAO/orbsvcs/orbsvcs/AV/AVStreams_i.i62
-rw-r--r--TAO/orbsvcs/orbsvcs/AV/AV_Core.cpp1186
-rw-r--r--TAO/orbsvcs/orbsvcs/AV/AV_Core.h181
-rw-r--r--TAO/orbsvcs/orbsvcs/AV/AV_Pluggable_Framework.html377
-rw-r--r--TAO/orbsvcs/orbsvcs/AV/AV_export.h40
-rw-r--r--TAO/orbsvcs/orbsvcs/AV/Endpoint_Strategy.cpp435
-rw-r--r--TAO/orbsvcs/orbsvcs/AV/Endpoint_Strategy.h190
-rw-r--r--TAO/orbsvcs/orbsvcs/AV/Endpoint_Strategy_T.cpp837
-rw-r--r--TAO/orbsvcs/orbsvcs/AV/Endpoint_Strategy_T.h293
-rw-r--r--TAO/orbsvcs/orbsvcs/AV/Fill_ACE_QoS.cpp75
-rw-r--r--TAO/orbsvcs/orbsvcs/AV/Fill_ACE_QoS.h86
-rw-r--r--TAO/orbsvcs/orbsvcs/AV/FlowSpec_Entry.cpp1018
-rw-r--r--TAO/orbsvcs/orbsvcs/AV/FlowSpec_Entry.h359
-rw-r--r--TAO/orbsvcs/orbsvcs/AV/FlowSpec_Entry.i347
-rw-r--r--TAO/orbsvcs/orbsvcs/AV/Flows_T.cpp252
-rw-r--r--TAO/orbsvcs/orbsvcs/AV/Flows_T.h130
-rw-r--r--TAO/orbsvcs/orbsvcs/AV/MCast.cpp220
-rw-r--r--TAO/orbsvcs/orbsvcs/AV/MCast.h117
-rw-r--r--TAO/orbsvcs/orbsvcs/AV/MCast.i17
-rw-r--r--TAO/orbsvcs/orbsvcs/AV/Policy.cpp150
-rw-r--r--TAO/orbsvcs/orbsvcs/AV/Policy.h176
-rw-r--r--TAO/orbsvcs/orbsvcs/AV/Policy.i81
-rw-r--r--TAO/orbsvcs/orbsvcs/AV/Protocol_Factory.cpp131
-rw-r--r--TAO/orbsvcs/orbsvcs/AV/Protocol_Factory.h103
-rw-r--r--TAO/orbsvcs/orbsvcs/AV/QoS_UDP.cpp1537
-rw-r--r--TAO/orbsvcs/orbsvcs/AV/QoS_UDP.h306
-rw-r--r--TAO/orbsvcs/orbsvcs/AV/QoS_UDP.i81
-rw-r--r--TAO/orbsvcs/orbsvcs/AV/README27
-rw-r--r--TAO/orbsvcs/orbsvcs/AV/RTCP.cpp826
-rw-r--r--TAO/orbsvcs/orbsvcs/AV/RTCP.h256
-rw-r--r--TAO/orbsvcs/orbsvcs/AV/RTCP_Channel.cpp364
-rw-r--r--TAO/orbsvcs/orbsvcs/AV/RTCP_Channel.h223
-rw-r--r--TAO/orbsvcs/orbsvcs/AV/RTCP_Packet.cpp1212
-rw-r--r--TAO/orbsvcs/orbsvcs/AV/RTCP_Packet.h405
-rw-r--r--TAO/orbsvcs/orbsvcs/AV/RTP.cpp785
-rw-r--r--TAO/orbsvcs/orbsvcs/AV/RTP.h423
-rw-r--r--TAO/orbsvcs/orbsvcs/AV/Resource_Factory.h54
-rw-r--r--TAO/orbsvcs/orbsvcs/AV/SCTP_SEQ.cpp932
-rw-r--r--TAO/orbsvcs/orbsvcs/AV/SCTP_SEQ.h308
-rw-r--r--TAO/orbsvcs/orbsvcs/AV/TCP.cpp721
-rw-r--r--TAO/orbsvcs/orbsvcs/AV/TCP.h283
-rw-r--r--TAO/orbsvcs/orbsvcs/AV/Transport.cpp682
-rw-r--r--TAO/orbsvcs/orbsvcs/AV/Transport.h345
-rw-r--r--TAO/orbsvcs/orbsvcs/AV/Transport.i111
-rw-r--r--TAO/orbsvcs/orbsvcs/AV/UDP.cpp1094
-rw-r--r--TAO/orbsvcs/orbsvcs/AV/UDP.h296
-rw-r--r--TAO/orbsvcs/orbsvcs/AV/UDP.i32
-rw-r--r--TAO/orbsvcs/orbsvcs/AV/default_resource.cpp107
-rw-r--r--TAO/orbsvcs/orbsvcs/AV/default_resource.h66
-rw-r--r--TAO/orbsvcs/orbsvcs/AV/global.h33
-rw-r--r--TAO/orbsvcs/orbsvcs/AV/md5.h49
-rw-r--r--TAO/orbsvcs/orbsvcs/AV/md5c.cpp326
-rw-r--r--TAO/orbsvcs/orbsvcs/AV/media_timer.cpp95
-rw-r--r--TAO/orbsvcs/orbsvcs/AV/media_timer.h69
-rw-r--r--TAO/orbsvcs/orbsvcs/AV/ntp-time.h97
-rw-r--r--TAO/orbsvcs/orbsvcs/AV/sfp.cpp1336
-rw-r--r--TAO/orbsvcs/orbsvcs/AV/sfp.h306
-rw-r--r--TAO/orbsvcs/orbsvcs/AVStreams.idl795
-rw-r--r--TAO/orbsvcs/orbsvcs/CSI.idl201
-rw-r--r--TAO/orbsvcs/orbsvcs/CSIIOP.idl153
-rw-r--r--TAO/orbsvcs/orbsvcs/Channel_Clients_T.cpp41
-rw-r--r--TAO/orbsvcs/orbsvcs/Channel_Clients_T.h99
-rw-r--r--TAO/orbsvcs/orbsvcs/Channel_Clients_T.i19
-rw-r--r--TAO/orbsvcs/orbsvcs/Concurrency/CC_Lock.cpp246
-rw-r--r--TAO/orbsvcs/orbsvcs/Concurrency/CC_Lock.h148
-rw-r--r--TAO/orbsvcs/orbsvcs/Concurrency/CC_LockSet.cpp330
-rw-r--r--TAO/orbsvcs/orbsvcs/Concurrency/CC_LockSet.h199
-rw-r--r--TAO/orbsvcs/orbsvcs/Concurrency/CC_LockSetFactory.cpp62
-rw-r--r--TAO/orbsvcs/orbsvcs/Concurrency/CC_LockSetFactory.h68
-rw-r--r--TAO/orbsvcs/orbsvcs/Concurrency/Concurrency_Loader.cpp88
-rw-r--r--TAO/orbsvcs/orbsvcs/Concurrency/Concurrency_Loader.h74
-rw-r--r--TAO/orbsvcs/orbsvcs/Concurrency/Concurrency_Utils.cpp126
-rw-r--r--TAO/orbsvcs/orbsvcs/Concurrency/Concurrency_Utils.h77
-rw-r--r--TAO/orbsvcs/orbsvcs/Concurrency/concurrency_export.h40
-rw-r--r--TAO/orbsvcs/orbsvcs/Concurrency/concurrency_serv_export.h40
-rw-r--r--TAO/orbsvcs/orbsvcs/Concurrency/concurrency_skel_export.h40
-rw-r--r--TAO/orbsvcs/orbsvcs/CosConcurrency.mpc106
-rw-r--r--TAO/orbsvcs/orbsvcs/CosConcurrency.rc30
-rw-r--r--TAO/orbsvcs/orbsvcs/CosConcurrencyControl.idl199
-rw-r--r--TAO/orbsvcs/orbsvcs/CosEvent.mpc135
-rw-r--r--TAO/orbsvcs/orbsvcs/CosEvent.rc30
-rw-r--r--TAO/orbsvcs/orbsvcs/CosEvent/CEC_ConsumerAdmin.cpp141
-rw-r--r--TAO/orbsvcs/orbsvcs/CosEvent/CEC_ConsumerAdmin.h157
-rw-r--r--TAO/orbsvcs/orbsvcs/CosEvent/CEC_ConsumerAdmin.i39
-rw-r--r--TAO/orbsvcs/orbsvcs/CosEvent/CEC_ConsumerControl.cpp62
-rw-r--r--TAO/orbsvcs/orbsvcs/CosEvent/CEC_ConsumerControl.h99
-rw-r--r--TAO/orbsvcs/orbsvcs/CosEvent/CEC_Default_Factory.cpp1403
-rw-r--r--TAO/orbsvcs/orbsvcs/CosEvent/CEC_Default_Factory.h231
-rw-r--r--TAO/orbsvcs/orbsvcs/CosEvent/CEC_Default_Factory.i32
-rw-r--r--TAO/orbsvcs/orbsvcs/CosEvent/CEC_Defaults.h127
-rw-r--r--TAO/orbsvcs/orbsvcs/CosEvent/CEC_Dispatching.cpp64
-rw-r--r--TAO/orbsvcs/orbsvcs/CosEvent/CEC_Dispatching.h119
-rw-r--r--TAO/orbsvcs/orbsvcs/CosEvent/CEC_Dispatching_Task.cpp156
-rw-r--r--TAO/orbsvcs/orbsvcs/CosEvent/CEC_Dispatching_Task.h165
-rw-r--r--TAO/orbsvcs/orbsvcs/CosEvent/CEC_Dispatching_Task.i85
-rw-r--r--TAO/orbsvcs/orbsvcs/CosEvent/CEC_DynamicImplementation.cpp179
-rw-r--r--TAO/orbsvcs/orbsvcs/CosEvent/CEC_DynamicImplementation.h84
-rw-r--r--TAO/orbsvcs/orbsvcs/CosEvent/CEC_DynamicImplementation.i19
-rw-r--r--TAO/orbsvcs/orbsvcs/CosEvent/CEC_EventChannel.cpp241
-rw-r--r--TAO/orbsvcs/orbsvcs/CosEvent/CEC_EventChannel.h316
-rw-r--r--TAO/orbsvcs/orbsvcs/CosEvent/CEC_EventChannel.i205
-rw-r--r--TAO/orbsvcs/orbsvcs/CosEvent/CEC_Event_Loader.cpp536
-rw-r--r--TAO/orbsvcs/orbsvcs/CosEvent/CEC_Event_Loader.h110
-rw-r--r--TAO/orbsvcs/orbsvcs/CosEvent/CEC_Factory.cpp14
-rw-r--r--TAO/orbsvcs/orbsvcs/CosEvent/CEC_Factory.h235
-rw-r--r--TAO/orbsvcs/orbsvcs/CosEvent/CEC_MT_Dispatching.cpp108
-rw-r--r--TAO/orbsvcs/orbsvcs/CosEvent/CEC_MT_Dispatching.h100
-rw-r--r--TAO/orbsvcs/orbsvcs/CosEvent/CEC_ProxyPullConsumer.cpp423
-rw-r--r--TAO/orbsvcs/orbsvcs/CosEvent/CEC_ProxyPullConsumer.h158
-rw-r--r--TAO/orbsvcs/orbsvcs/CosEvent/CEC_ProxyPullConsumer.i42
-rw-r--r--TAO/orbsvcs/orbsvcs/CosEvent/CEC_ProxyPullSupplier.cpp389
-rw-r--r--TAO/orbsvcs/orbsvcs/CosEvent/CEC_ProxyPullSupplier.h182
-rw-r--r--TAO/orbsvcs/orbsvcs/CosEvent/CEC_ProxyPullSupplier.i43
-rw-r--r--TAO/orbsvcs/orbsvcs/CosEvent/CEC_ProxyPushConsumer.cpp397
-rw-r--r--TAO/orbsvcs/orbsvcs/CosEvent/CEC_ProxyPushConsumer.h210
-rw-r--r--TAO/orbsvcs/orbsvcs/CosEvent/CEC_ProxyPushConsumer.i50
-rw-r--r--TAO/orbsvcs/orbsvcs/CosEvent/CEC_ProxyPushSupplier.cpp983
-rw-r--r--TAO/orbsvcs/orbsvcs/CosEvent/CEC_ProxyPushSupplier.h233
-rw-r--r--TAO/orbsvcs/orbsvcs/CosEvent/CEC_ProxyPushSupplier.i98
-rw-r--r--TAO/orbsvcs/orbsvcs/CosEvent/CEC_Pulling_Strategy.cpp13
-rw-r--r--TAO/orbsvcs/orbsvcs/CosEvent/CEC_Pulling_Strategy.h71
-rw-r--r--TAO/orbsvcs/orbsvcs/CosEvent/CEC_Reactive_ConsumerControl.cpp492
-rw-r--r--TAO/orbsvcs/orbsvcs/CosEvent/CEC_Reactive_ConsumerControl.h213
-rw-r--r--TAO/orbsvcs/orbsvcs/CosEvent/CEC_Reactive_ConsumerControl.i23
-rw-r--r--TAO/orbsvcs/orbsvcs/CosEvent/CEC_Reactive_Pulling_Strategy.cpp204
-rw-r--r--TAO/orbsvcs/orbsvcs/CosEvent/CEC_Reactive_Pulling_Strategy.h151
-rw-r--r--TAO/orbsvcs/orbsvcs/CosEvent/CEC_Reactive_Pulling_Strategy.i15
-rw-r--r--TAO/orbsvcs/orbsvcs/CosEvent/CEC_Reactive_SupplierControl.cpp537
-rw-r--r--TAO/orbsvcs/orbsvcs/CosEvent/CEC_Reactive_SupplierControl.h229
-rw-r--r--TAO/orbsvcs/orbsvcs/CosEvent/CEC_Reactive_SupplierControl.i34
-rw-r--r--TAO/orbsvcs/orbsvcs/CosEvent/CEC_SupplierAdmin.cpp105
-rw-r--r--TAO/orbsvcs/orbsvcs/CosEvent/CEC_SupplierAdmin.h127
-rw-r--r--TAO/orbsvcs/orbsvcs/CosEvent/CEC_SupplierAdmin.i23
-rw-r--r--TAO/orbsvcs/orbsvcs/CosEvent/CEC_SupplierControl.cpp67
-rw-r--r--TAO/orbsvcs/orbsvcs/CosEvent/CEC_SupplierControl.h112
-rw-r--r--TAO/orbsvcs/orbsvcs/CosEvent/CEC_TypedConsumerAdmin.cpp135
-rw-r--r--TAO/orbsvcs/orbsvcs/CosEvent/CEC_TypedConsumerAdmin.h129
-rw-r--r--TAO/orbsvcs/orbsvcs/CosEvent/CEC_TypedConsumerAdmin.i24
-rw-r--r--TAO/orbsvcs/orbsvcs/CosEvent/CEC_TypedEvent.cpp9
-rw-r--r--TAO/orbsvcs/orbsvcs/CosEvent/CEC_TypedEvent.h69
-rw-r--r--TAO/orbsvcs/orbsvcs/CosEvent/CEC_TypedEvent.i30
-rw-r--r--TAO/orbsvcs/orbsvcs/CosEvent/CEC_TypedEventChannel.cpp597
-rw-r--r--TAO/orbsvcs/orbsvcs/CosEvent/CEC_TypedEventChannel.h393
-rw-r--r--TAO/orbsvcs/orbsvcs/CosEvent/CEC_TypedEventChannel.i205
-rw-r--r--TAO/orbsvcs/orbsvcs/CosEvent/CEC_TypedProxyPushConsumer.cpp450
-rw-r--r--TAO/orbsvcs/orbsvcs/CosEvent/CEC_TypedProxyPushConsumer.h210
-rw-r--r--TAO/orbsvcs/orbsvcs/CosEvent/CEC_TypedProxyPushConsumer.i21
-rw-r--r--TAO/orbsvcs/orbsvcs/CosEvent/CEC_TypedSupplierAdmin.cpp111
-rw-r--r--TAO/orbsvcs/orbsvcs/CosEvent/CEC_TypedSupplierAdmin.h109
-rw-r--r--TAO/orbsvcs/orbsvcs/CosEvent/CEC_TypedSupplierAdmin.i15
-rw-r--r--TAO/orbsvcs/orbsvcs/CosEvent/event_export.h40
-rw-r--r--TAO/orbsvcs/orbsvcs/CosEvent/event_serv_export.h40
-rw-r--r--TAO/orbsvcs/orbsvcs/CosEvent/event_skel_export.h40
-rw-r--r--TAO/orbsvcs/orbsvcs/CosEventChannelAdmin.idl246
-rw-r--r--TAO/orbsvcs/orbsvcs/CosEventComm.idl177
-rw-r--r--TAO/orbsvcs/orbsvcs/CosEvent_Serv.rc30
-rw-r--r--TAO/orbsvcs/orbsvcs/CosEvent_Skel.rc30
-rw-r--r--TAO/orbsvcs/orbsvcs/CosLifeCycle.idl127
-rw-r--r--TAO/orbsvcs/orbsvcs/CosLifeCycle.mpc32
-rw-r--r--TAO/orbsvcs/orbsvcs/CosLifeCycle.rc30
-rw-r--r--TAO/orbsvcs/orbsvcs/CosLoadBalancing.idl202
-rw-r--r--TAO/orbsvcs/orbsvcs/CosLoadBalancing.mpc50
-rw-r--r--TAO/orbsvcs/orbsvcs/CosLoadBalancing.rc30
-rw-r--r--TAO/orbsvcs/orbsvcs/CosNaming.idl291
-rw-r--r--TAO/orbsvcs/orbsvcs/CosNaming.mpc48
-rw-r--r--TAO/orbsvcs/orbsvcs/CosNaming.rc30
-rw-r--r--TAO/orbsvcs/orbsvcs/CosNaming_Serv.mpc53
-rw-r--r--TAO/orbsvcs/orbsvcs/CosNaming_Serv.rc30
-rw-r--r--TAO/orbsvcs/orbsvcs/CosNaming_Skel.mpc35
-rw-r--r--TAO/orbsvcs/orbsvcs/CosNaming_Skel.rc30
-rw-r--r--TAO/orbsvcs/orbsvcs/CosNotification.idl390
-rw-r--r--TAO/orbsvcs/orbsvcs/CosNotification.mpc267
-rw-r--r--TAO/orbsvcs/orbsvcs/CosNotification.rc30
-rw-r--r--TAO/orbsvcs/orbsvcs/CosNotification_Serv.rc30
-rw-r--r--TAO/orbsvcs/orbsvcs/CosNotification_Skel.rc30
-rw-r--r--TAO/orbsvcs/orbsvcs/CosNotifyChannelAdmin.idl1027
-rw-r--r--TAO/orbsvcs/orbsvcs/CosNotifyComm.idl387
-rw-r--r--TAO/orbsvcs/orbsvcs/CosNotifyFilter.idl505
-rw-r--r--TAO/orbsvcs/orbsvcs/CosProperty.idl413
-rw-r--r--TAO/orbsvcs/orbsvcs/CosProperty.mpc120
-rw-r--r--TAO/orbsvcs/orbsvcs/CosProperty.rc30
-rw-r--r--TAO/orbsvcs/orbsvcs/CosPropertyService.idl16
-rw-r--r--TAO/orbsvcs/orbsvcs/CosTime.mpc33
-rw-r--r--TAO/orbsvcs/orbsvcs/CosTime.rc30
-rw-r--r--TAO/orbsvcs/orbsvcs/CosTrading.idl522
-rw-r--r--TAO/orbsvcs/orbsvcs/CosTrading.mpc133
-rw-r--r--TAO/orbsvcs/orbsvcs/CosTrading.rc30
-rw-r--r--TAO/orbsvcs/orbsvcs/CosTradingDynamic.idl50
-rw-r--r--TAO/orbsvcs/orbsvcs/CosTradingRepos.idl159
-rw-r--r--TAO/orbsvcs/orbsvcs/CosTrading_Serv.rc30
-rw-r--r--TAO/orbsvcs/orbsvcs/CosTrading_Skel.rc30
-rw-r--r--TAO/orbsvcs/orbsvcs/CosTypedEventChannelAdmin.idl62
-rw-r--r--TAO/orbsvcs/orbsvcs/CosTypedEventComm.idl32
-rw-r--r--TAO/orbsvcs/orbsvcs/DsEventLogAdmin.idl56
-rw-r--r--TAO/orbsvcs/orbsvcs/DsEventLogAdmin.mpc108
-rw-r--r--TAO/orbsvcs/orbsvcs/DsEventLogAdmin.rc30
-rw-r--r--TAO/orbsvcs/orbsvcs/DsLogAdmin.idl337
-rw-r--r--TAO/orbsvcs/orbsvcs/DsLogAdmin.mpc137
-rw-r--r--TAO/orbsvcs/orbsvcs/DsLogAdmin.rc30
-rw-r--r--TAO/orbsvcs/orbsvcs/DsLogNotification.idl112
-rw-r--r--TAO/orbsvcs/orbsvcs/DsNotifyLogAdmin.idl66
-rw-r--r--TAO/orbsvcs/orbsvcs/DsNotifyLogAdmin.mpc110
-rw-r--r--TAO/orbsvcs/orbsvcs/DsNotifyLogAdmin.rc30
-rw-r--r--TAO/orbsvcs/orbsvcs/ESF/ESF_Busy_Lock.cpp64
-rw-r--r--TAO/orbsvcs/orbsvcs/ESF/ESF_Busy_Lock.h80
-rw-r--r--TAO/orbsvcs/orbsvcs/ESF/ESF_Busy_Lock.i13
-rw-r--r--TAO/orbsvcs/orbsvcs/ESF/ESF_Copy_On_Read.cpp120
-rw-r--r--TAO/orbsvcs/orbsvcs/ESF/ESF_Copy_On_Read.h74
-rw-r--r--TAO/orbsvcs/orbsvcs/ESF/ESF_Copy_On_Write.cpp208
-rw-r--r--TAO/orbsvcs/orbsvcs/ESF/ESF_Copy_On_Write.h184
-rw-r--r--TAO/orbsvcs/orbsvcs/ESF/ESF_Copy_On_Write.i41
-rw-r--r--TAO/orbsvcs/orbsvcs/ESF/ESF_Defaults.h37
-rw-r--r--TAO/orbsvcs/orbsvcs/ESF/ESF_Delayed_Changes.cpp216
-rw-r--r--TAO/orbsvcs/orbsvcs/ESF/ESF_Delayed_Changes.h160
-rw-r--r--TAO/orbsvcs/orbsvcs/ESF/ESF_Delayed_Changes.i38
-rw-r--r--TAO/orbsvcs/orbsvcs/ESF/ESF_Delayed_Command.cpp97
-rw-r--r--TAO/orbsvcs/orbsvcs/ESF/ESF_Delayed_Command.h187
-rw-r--r--TAO/orbsvcs/orbsvcs/ESF/ESF_Delayed_Command.i47
-rw-r--r--TAO/orbsvcs/orbsvcs/ESF/ESF_Immediate_Changes.cpp49
-rw-r--r--TAO/orbsvcs/orbsvcs/ESF/ESF_Immediate_Changes.h69
-rw-r--r--TAO/orbsvcs/orbsvcs/ESF/ESF_Immediate_Changes.i48
-rw-r--r--TAO/orbsvcs/orbsvcs/ESF/ESF_Peer_Admin.cpp58
-rw-r--r--TAO/orbsvcs/orbsvcs/ESF/ESF_Peer_Admin.h108
-rw-r--r--TAO/orbsvcs/orbsvcs/ESF/ESF_Peer_Workers.cpp53
-rw-r--r--TAO/orbsvcs/orbsvcs/ESF/ESF_Peer_Workers.h107
-rw-r--r--TAO/orbsvcs/orbsvcs/ESF/ESF_Peer_Workers.i31
-rw-r--r--TAO/orbsvcs/orbsvcs/ESF/ESF_Proxy_Admin.cpp110
-rw-r--r--TAO/orbsvcs/orbsvcs/ESF/ESF_Proxy_Admin.h167
-rw-r--r--TAO/orbsvcs/orbsvcs/ESF/ESF_Proxy_Admin.i32
-rw-r--r--TAO/orbsvcs/orbsvcs/ESF/ESF_Proxy_Collection.cpp20
-rw-r--r--TAO/orbsvcs/orbsvcs/ESF/ESF_Proxy_Collection.h174
-rw-r--r--TAO/orbsvcs/orbsvcs/ESF/ESF_Proxy_List.cpp93
-rw-r--r--TAO/orbsvcs/orbsvcs/ESF/ESF_Proxy_List.h88
-rw-r--r--TAO/orbsvcs/orbsvcs/ESF/ESF_Proxy_List.i25
-rw-r--r--TAO/orbsvcs/orbsvcs/ESF/ESF_Proxy_RB_Tree.cpp91
-rw-r--r--TAO/orbsvcs/orbsvcs/ESF/ESF_Proxy_RB_Tree.h114
-rw-r--r--TAO/orbsvcs/orbsvcs/ESF/ESF_Proxy_RB_Tree.i69
-rw-r--r--TAO/orbsvcs/orbsvcs/ESF/ESF_Proxy_RefCount_Guard.cpp29
-rw-r--r--TAO/orbsvcs/orbsvcs/ESF/ESF_Proxy_RefCount_Guard.h79
-rw-r--r--TAO/orbsvcs/orbsvcs/ESF/ESF_Proxy_RefCount_Guard.i18
-rw-r--r--TAO/orbsvcs/orbsvcs/ESF/ESF_RefCount_Guard.cpp14
-rw-r--r--TAO/orbsvcs/orbsvcs/ESF/ESF_RefCount_Guard.h67
-rw-r--r--TAO/orbsvcs/orbsvcs/ESF/ESF_RefCount_Guard.i22
-rw-r--r--TAO/orbsvcs/orbsvcs/ESF/ESF_Shutdown_Proxy.cpp33
-rw-r--r--TAO/orbsvcs/orbsvcs/ESF/ESF_Shutdown_Proxy.h52
-rw-r--r--TAO/orbsvcs/orbsvcs/ESF/ESF_Shutdown_Proxy.i12
-rw-r--r--TAO/orbsvcs/orbsvcs/ESF/ESF_Worker.cpp22
-rw-r--r--TAO/orbsvcs/orbsvcs/ESF/ESF_Worker.h67
-rw-r--r--TAO/orbsvcs/orbsvcs/ESF/esf_export.h40
-rw-r--r--TAO/orbsvcs/orbsvcs/ETCL.mpc33
-rw-r--r--TAO/orbsvcs/orbsvcs/ETCL.rc30
-rw-r--r--TAO/orbsvcs/orbsvcs/ETCL/ETCL.ll161
-rw-r--r--TAO/orbsvcs/orbsvcs/ETCL/ETCL.rc30
-rw-r--r--TAO/orbsvcs/orbsvcs/ETCL/ETCL.yy261
-rw-r--r--TAO/orbsvcs/orbsvcs/ETCL/ETCL_Constraint.cpp956
-rw-r--r--TAO/orbsvcs/orbsvcs/ETCL/ETCL_Constraint.h430
-rw-r--r--TAO/orbsvcs/orbsvcs/ETCL/ETCL_Constraint.inl330
-rw-r--r--TAO/orbsvcs/orbsvcs/ETCL/ETCL_Constraint_Visitor.h70
-rw-r--r--TAO/orbsvcs/orbsvcs/ETCL/ETCL_Interpreter.cpp112
-rw-r--r--TAO/orbsvcs/orbsvcs/ETCL/ETCL_Interpreter.h110
-rw-r--r--TAO/orbsvcs/orbsvcs/ETCL/ETCL_l.cpp1884
-rw-r--r--TAO/orbsvcs/orbsvcs/ETCL/ETCL_l.cpp.diff511
-rw-r--r--TAO/orbsvcs/orbsvcs/ETCL/ETCL_y.cpp1295
-rw-r--r--TAO/orbsvcs/orbsvcs/ETCL/ETCL_y.cpp.diff607
-rw-r--r--TAO/orbsvcs/orbsvcs/ETCL/ETCL_y.h45
-rw-r--r--TAO/orbsvcs/orbsvcs/ETCL/ETCL_y.h.diff25
-rw-r--r--TAO/orbsvcs/orbsvcs/ETCL/README12
-rw-r--r--TAO/orbsvcs/orbsvcs/ETCL/etcl_export.h40
-rw-r--r--TAO/orbsvcs/orbsvcs/Event/ECG_Adapters.cpp19
-rw-r--r--TAO/orbsvcs/orbsvcs/Event/ECG_Adapters.h79
-rw-r--r--TAO/orbsvcs/orbsvcs/Event/ECG_Address_Server_Base.h42
-rw-r--r--TAO/orbsvcs/orbsvcs/Event/ECG_CDR_Message_Receiver.cpp608
-rw-r--r--TAO/orbsvcs/orbsvcs/Event/ECG_CDR_Message_Receiver.h318
-rw-r--r--TAO/orbsvcs/orbsvcs/Event/ECG_CDR_Message_Receiver.i51
-rw-r--r--TAO/orbsvcs/orbsvcs/Event/ECG_CDR_Message_Sender.cpp340
-rw-r--r--TAO/orbsvcs/orbsvcs/Event/ECG_CDR_Message_Sender.h190
-rw-r--r--TAO/orbsvcs/orbsvcs/Event/ECG_CDR_Message_Sender.i56
-rw-r--r--TAO/orbsvcs/orbsvcs/Event/ECG_Complex_Address_Server.cpp170
-rw-r--r--TAO/orbsvcs/orbsvcs/Event/ECG_Complex_Address_Server.h118
-rw-r--r--TAO/orbsvcs/orbsvcs/Event/ECG_Complex_Address_Server.i17
-rw-r--r--TAO/orbsvcs/orbsvcs/Event/ECG_ConsumerEC_Control.cpp42
-rw-r--r--TAO/orbsvcs/orbsvcs/Event/ECG_ConsumerEC_Control.h83
-rw-r--r--TAO/orbsvcs/orbsvcs/Event/ECG_Defaults.h79
-rw-r--r--TAO/orbsvcs/orbsvcs/Event/ECG_Mcast_EH.cpp303
-rw-r--r--TAO/orbsvcs/orbsvcs/Event/ECG_Mcast_EH.h294
-rw-r--r--TAO/orbsvcs/orbsvcs/Event/ECG_Mcast_EH.i63
-rw-r--r--TAO/orbsvcs/orbsvcs/Event/ECG_Mcast_Gateway.cpp705
-rw-r--r--TAO/orbsvcs/orbsvcs/Event/ECG_Mcast_Gateway.h290
-rw-r--r--TAO/orbsvcs/orbsvcs/Event/ECG_Mcast_Gateway.i34
-rw-r--r--TAO/orbsvcs/orbsvcs/Event/ECG_Reactive_ConsumerEC_Control.cpp253
-rw-r--r--TAO/orbsvcs/orbsvcs/Event/ECG_Reactive_ConsumerEC_Control.h133
-rw-r--r--TAO/orbsvcs/orbsvcs/Event/ECG_Reconnect_ConsumerEC_Control.cpp319
-rw-r--r--TAO/orbsvcs/orbsvcs/Event/ECG_Reconnect_ConsumerEC_Control.h147
-rw-r--r--TAO/orbsvcs/orbsvcs/Event/ECG_Simple_Address_Server.cpp38
-rw-r--r--TAO/orbsvcs/orbsvcs/Event/ECG_Simple_Address_Server.h69
-rw-r--r--TAO/orbsvcs/orbsvcs/Event/ECG_Simple_Address_Server.i17
-rw-r--r--TAO/orbsvcs/orbsvcs/Event/ECG_Simple_Mcast_EH.cpp98
-rw-r--r--TAO/orbsvcs/orbsvcs/Event/ECG_Simple_Mcast_EH.h96
-rw-r--r--TAO/orbsvcs/orbsvcs/Event/ECG_UDP_EH.cpp89
-rw-r--r--TAO/orbsvcs/orbsvcs/Event/ECG_UDP_EH.h110
-rw-r--r--TAO/orbsvcs/orbsvcs/Event/ECG_UDP_EH.i13
-rw-r--r--TAO/orbsvcs/orbsvcs/Event/ECG_UDP_Out_Endpoint.cpp83
-rw-r--r--TAO/orbsvcs/orbsvcs/Event/ECG_UDP_Out_Endpoint.h108
-rw-r--r--TAO/orbsvcs/orbsvcs/Event/ECG_UDP_Out_Endpoint.i37
-rw-r--r--TAO/orbsvcs/orbsvcs/Event/ECG_UDP_Receiver.cpp250
-rw-r--r--TAO/orbsvcs/orbsvcs/Event/ECG_UDP_Receiver.h239
-rw-r--r--TAO/orbsvcs/orbsvcs/Event/ECG_UDP_Receiver.i106
-rw-r--r--TAO/orbsvcs/orbsvcs/Event/ECG_UDP_Sender.cpp236
-rw-r--r--TAO/orbsvcs/orbsvcs/Event/ECG_UDP_Sender.h230
-rw-r--r--TAO/orbsvcs/orbsvcs/Event/ECG_UDP_Sender.inl96
-rw-r--r--TAO/orbsvcs/orbsvcs/Event/EC_And_Filter.cpp170
-rw-r--r--TAO/orbsvcs/orbsvcs/Event/EC_And_Filter.h89
-rw-r--r--TAO/orbsvcs/orbsvcs/Event/EC_Basic_Factory.cpp262
-rw-r--r--TAO/orbsvcs/orbsvcs/Event/EC_Basic_Factory.h120
-rw-r--r--TAO/orbsvcs/orbsvcs/Event/EC_Basic_Filter_Builder.cpp203
-rw-r--r--TAO/orbsvcs/orbsvcs/Event/EC_Basic_Filter_Builder.h81
-rw-r--r--TAO/orbsvcs/orbsvcs/Event/EC_Basic_Filter_Builder.i14
-rw-r--r--TAO/orbsvcs/orbsvcs/Event/EC_Bitmask_Filter.cpp122
-rw-r--r--TAO/orbsvcs/orbsvcs/Event/EC_Bitmask_Filter.h107
-rw-r--r--TAO/orbsvcs/orbsvcs/Event/EC_Busy_Lock.cpp64
-rw-r--r--TAO/orbsvcs/orbsvcs/Event/EC_Busy_Lock.h66
-rw-r--r--TAO/orbsvcs/orbsvcs/Event/EC_Busy_Lock.i13
-rw-r--r--TAO/orbsvcs/orbsvcs/Event/EC_Channel_Destroyer.cpp30
-rw-r--r--TAO/orbsvcs/orbsvcs/Event/EC_Channel_Destroyer.h46
-rw-r--r--TAO/orbsvcs/orbsvcs/Event/EC_Conjunction_Filter.cpp209
-rw-r--r--TAO/orbsvcs/orbsvcs/Event/EC_Conjunction_Filter.h113
-rw-r--r--TAO/orbsvcs/orbsvcs/Event/EC_ConsumerAdmin.cpp41
-rw-r--r--TAO/orbsvcs/orbsvcs/Event/EC_ConsumerAdmin.h81
-rw-r--r--TAO/orbsvcs/orbsvcs/Event/EC_ConsumerControl.cpp42
-rw-r--r--TAO/orbsvcs/orbsvcs/Event/EC_ConsumerControl.h83
-rw-r--r--TAO/orbsvcs/orbsvcs/Event/EC_Default_Factory.cpp1003
-rw-r--r--TAO/orbsvcs/orbsvcs/Event/EC_Default_Factory.h201
-rw-r--r--TAO/orbsvcs/orbsvcs/Event/EC_Default_Factory.i59
-rw-r--r--TAO/orbsvcs/orbsvcs/Event/EC_Default_ProxyConsumer.cpp192
-rw-r--r--TAO/orbsvcs/orbsvcs/Event/EC_Default_ProxyConsumer.h85
-rw-r--r--TAO/orbsvcs/orbsvcs/Event/EC_Default_ProxySupplier.cpp228
-rw-r--r--TAO/orbsvcs/orbsvcs/Event/EC_Default_ProxySupplier.h82
-rw-r--r--TAO/orbsvcs/orbsvcs/Event/EC_Defaults.h144
-rw-r--r--TAO/orbsvcs/orbsvcs/Event/EC_Disjunction_Filter.cpp163
-rw-r--r--TAO/orbsvcs/orbsvcs/Event/EC_Disjunction_Filter.h90
-rw-r--r--TAO/orbsvcs/orbsvcs/Event/EC_Dispatching.cpp14
-rw-r--r--TAO/orbsvcs/orbsvcs/Event/EC_Dispatching.h84
-rw-r--r--TAO/orbsvcs/orbsvcs/Event/EC_Dispatching_Task.cpp210
-rw-r--r--TAO/orbsvcs/orbsvcs/Event/EC_Dispatching_Task.h199
-rw-r--r--TAO/orbsvcs/orbsvcs/Event/EC_Dispatching_Task.i95
-rw-r--r--TAO/orbsvcs/orbsvcs/Event/EC_Event_Channel.cpp37
-rw-r--r--TAO/orbsvcs/orbsvcs/Event/EC_Event_Channel.h62
-rw-r--r--TAO/orbsvcs/orbsvcs/Event/EC_Event_Channel_Base.cpp353
-rw-r--r--TAO/orbsvcs/orbsvcs/Event/EC_Event_Channel_Base.h377
-rw-r--r--TAO/orbsvcs/orbsvcs/Event/EC_Event_Channel_Base.i206
-rw-r--r--TAO/orbsvcs/orbsvcs/Event/EC_Factory.cpp14
-rw-r--r--TAO/orbsvcs/orbsvcs/Event/EC_Factory.h169
-rw-r--r--TAO/orbsvcs/orbsvcs/Event/EC_Filter.cpp130
-rw-r--r--TAO/orbsvcs/orbsvcs/Event/EC_Filter.h225
-rw-r--r--TAO/orbsvcs/orbsvcs/Event/EC_Filter.i45
-rw-r--r--TAO/orbsvcs/orbsvcs/Event/EC_Filter_Builder.cpp33
-rw-r--r--TAO/orbsvcs/orbsvcs/Event/EC_Filter_Builder.h92
-rw-r--r--TAO/orbsvcs/orbsvcs/Event/EC_Filter_Builder.i12
-rw-r--r--TAO/orbsvcs/orbsvcs/Event/EC_Gateway.cpp32
-rw-r--r--TAO/orbsvcs/orbsvcs/Event/EC_Gateway.h71
-rw-r--r--TAO/orbsvcs/orbsvcs/Event/EC_Gateway_IIOP.cpp715
-rw-r--r--TAO/orbsvcs/orbsvcs/Event/EC_Gateway_IIOP.h255
-rw-r--r--TAO/orbsvcs/orbsvcs/Event/EC_Gateway_IIOP_Factory.cpp212
-rw-r--r--TAO/orbsvcs/orbsvcs/Event/EC_Gateway_IIOP_Factory.h115
-rw-r--r--TAO/orbsvcs/orbsvcs/Event/EC_Gateway_IIOP_Factory.i19
-rw-r--r--TAO/orbsvcs/orbsvcs/Event/EC_Gateway_Sched.cpp82
-rw-r--r--TAO/orbsvcs/orbsvcs/Event/EC_Gateway_Sched.h59
-rw-r--r--TAO/orbsvcs/orbsvcs/Event/EC_Group_Scheduling.cpp32
-rw-r--r--TAO/orbsvcs/orbsvcs/Event/EC_Group_Scheduling.h56
-rw-r--r--TAO/orbsvcs/orbsvcs/Event/EC_Group_Scheduling.inl7
-rw-r--r--TAO/orbsvcs/orbsvcs/Event/EC_Kokyu_Dispatching.cpp210
-rw-r--r--TAO/orbsvcs/orbsvcs/Event/EC_Kokyu_Dispatching.h147
-rw-r--r--TAO/orbsvcs/orbsvcs/Event/EC_Kokyu_Dispatching.i42
-rw-r--r--TAO/orbsvcs/orbsvcs/Event/EC_Kokyu_Factory.cpp272
-rw-r--r--TAO/orbsvcs/orbsvcs/Event/EC_Kokyu_Factory.h78
-rw-r--r--TAO/orbsvcs/orbsvcs/Event/EC_Kokyu_Factory.i15
-rw-r--r--TAO/orbsvcs/orbsvcs/Event/EC_Kokyu_Filter.cpp313
-rw-r--r--TAO/orbsvcs/orbsvcs/Event/EC_Kokyu_Filter.h127
-rw-r--r--TAO/orbsvcs/orbsvcs/Event/EC_Kokyu_Filter_Builder.cpp513
-rw-r--r--TAO/orbsvcs/orbsvcs/Event/EC_Kokyu_Filter_Builder.h89
-rw-r--r--TAO/orbsvcs/orbsvcs/Event/EC_Kokyu_Filter_Builder.i15
-rw-r--r--TAO/orbsvcs/orbsvcs/Event/EC_Kokyu_Scheduling.cpp99
-rw-r--r--TAO/orbsvcs/orbsvcs/Event/EC_Kokyu_Scheduling.h77
-rw-r--r--TAO/orbsvcs/orbsvcs/Event/EC_Kokyu_Scheduling.i14
-rw-r--r--TAO/orbsvcs/orbsvcs/Event/EC_Lifetime_Utils.cpp7
-rw-r--r--TAO/orbsvcs/orbsvcs/Event/EC_Lifetime_Utils.h217
-rw-r--r--TAO/orbsvcs/orbsvcs/Event/EC_Lifetime_Utils.i179
-rw-r--r--TAO/orbsvcs/orbsvcs/Event/EC_Lifetime_Utils_T.cpp51
-rw-r--r--TAO/orbsvcs/orbsvcs/Event/EC_Lifetime_Utils_T.h203
-rw-r--r--TAO/orbsvcs/orbsvcs/Event/EC_Lifetime_Utils_T.i340
-rw-r--r--TAO/orbsvcs/orbsvcs/Event/EC_MT_Dispatching.cpp92
-rw-r--r--TAO/orbsvcs/orbsvcs/Event/EC_MT_Dispatching.h98
-rw-r--r--TAO/orbsvcs/orbsvcs/Event/EC_Masked_Type_Filter.cpp128
-rw-r--r--TAO/orbsvcs/orbsvcs/Event/EC_Masked_Type_Filter.h93
-rw-r--r--TAO/orbsvcs/orbsvcs/Event/EC_Negation_Filter.cpp114
-rw-r--r--TAO/orbsvcs/orbsvcs/Event/EC_Negation_Filter.h86
-rw-r--r--TAO/orbsvcs/orbsvcs/Event/EC_Null_Factory.cpp241
-rw-r--r--TAO/orbsvcs/orbsvcs/Event/EC_Null_Factory.h116
-rw-r--r--TAO/orbsvcs/orbsvcs/Event/EC_Null_Scheduling.cpp39
-rw-r--r--TAO/orbsvcs/orbsvcs/Event/EC_Null_Scheduling.h60
-rw-r--r--TAO/orbsvcs/orbsvcs/Event/EC_Null_Scheduling.i7
-rw-r--r--TAO/orbsvcs/orbsvcs/Event/EC_ObserverStrategy.cpp516
-rw-r--r--TAO/orbsvcs/orbsvcs/Event/EC_ObserverStrategy.h362
-rw-r--r--TAO/orbsvcs/orbsvcs/Event/EC_ObserverStrategy.i81
-rw-r--r--TAO/orbsvcs/orbsvcs/Event/EC_Per_Supplier_Filter.cpp213
-rw-r--r--TAO/orbsvcs/orbsvcs/Event/EC_Per_Supplier_Filter.h122
-rw-r--r--TAO/orbsvcs/orbsvcs/Event/EC_Per_Supplier_Filter.i14
-rw-r--r--TAO/orbsvcs/orbsvcs/Event/EC_Prefix_Filter_Builder.cpp158
-rw-r--r--TAO/orbsvcs/orbsvcs/Event/EC_Prefix_Filter_Builder.h72
-rw-r--r--TAO/orbsvcs/orbsvcs/Event/EC_Prefix_Filter_Builder.i14
-rw-r--r--TAO/orbsvcs/orbsvcs/Event/EC_Priority_Dispatching.cpp141
-rw-r--r--TAO/orbsvcs/orbsvcs/Event/EC_Priority_Dispatching.h90
-rw-r--r--TAO/orbsvcs/orbsvcs/Event/EC_Priority_Scheduling.cpp100
-rw-r--r--TAO/orbsvcs/orbsvcs/Event/EC_Priority_Scheduling.h76
-rw-r--r--TAO/orbsvcs/orbsvcs/Event/EC_Priority_Scheduling.i14
-rw-r--r--TAO/orbsvcs/orbsvcs/Event/EC_ProxyConsumer.cpp310
-rw-r--r--TAO/orbsvcs/orbsvcs/Event/EC_ProxyConsumer.h238
-rw-r--r--TAO/orbsvcs/orbsvcs/Event/EC_ProxyConsumer.i71
-rw-r--r--TAO/orbsvcs/orbsvcs/Event/EC_ProxySupplier.cpp535
-rw-r--r--TAO/orbsvcs/orbsvcs/Event/EC_ProxySupplier.h231
-rw-r--r--TAO/orbsvcs/orbsvcs/Event/EC_ProxySupplier.i99
-rw-r--r--TAO/orbsvcs/orbsvcs/Event/EC_Proxy_Disconnector.cpp47
-rw-r--r--TAO/orbsvcs/orbsvcs/Event/EC_Proxy_Disconnector.h76
-rw-r--r--TAO/orbsvcs/orbsvcs/Event/EC_QOS_Info.cpp9
-rw-r--r--TAO/orbsvcs/orbsvcs/Event/EC_QOS_Info.h70
-rw-r--r--TAO/orbsvcs/orbsvcs/Event/EC_QOS_Info.i23
-rw-r--r--TAO/orbsvcs/orbsvcs/Event/EC_RTCORBA_Dispatching.cpp106
-rw-r--r--TAO/orbsvcs/orbsvcs/Event/EC_RTCORBA_Dispatching.h82
-rw-r--r--TAO/orbsvcs/orbsvcs/Event/EC_RTCORBA_Factory.cpp276
-rw-r--r--TAO/orbsvcs/orbsvcs/Event/EC_RTCORBA_Factory.h123
-rw-r--r--TAO/orbsvcs/orbsvcs/Event/EC_Reactive_ConsumerControl.cpp276
-rw-r--r--TAO/orbsvcs/orbsvcs/Event/EC_Reactive_ConsumerControl.h155
-rw-r--r--TAO/orbsvcs/orbsvcs/Event/EC_Reactive_ConsumerControl.i13
-rw-r--r--TAO/orbsvcs/orbsvcs/Event/EC_Reactive_Dispatching.cpp45
-rw-r--r--TAO/orbsvcs/orbsvcs/Event/EC_Reactive_Dispatching.h65
-rw-r--r--TAO/orbsvcs/orbsvcs/Event/EC_Reactive_SupplierControl.cpp266
-rw-r--r--TAO/orbsvcs/orbsvcs/Event/EC_Reactive_SupplierControl.h166
-rw-r--r--TAO/orbsvcs/orbsvcs/Event/EC_Reactive_SupplierControl.i13
-rw-r--r--TAO/orbsvcs/orbsvcs/Event/EC_Reactive_Timeout_Generator.cpp56
-rw-r--r--TAO/orbsvcs/orbsvcs/Event/EC_Reactive_Timeout_Generator.h70
-rw-r--r--TAO/orbsvcs/orbsvcs/Event/EC_Sched_Factory.cpp225
-rw-r--r--TAO/orbsvcs/orbsvcs/Event/EC_Sched_Factory.h71
-rw-r--r--TAO/orbsvcs/orbsvcs/Event/EC_Sched_Factory.i13
-rw-r--r--TAO/orbsvcs/orbsvcs/Event/EC_Sched_Filter.cpp283
-rw-r--r--TAO/orbsvcs/orbsvcs/Event/EC_Sched_Filter.h129
-rw-r--r--TAO/orbsvcs/orbsvcs/Event/EC_Sched_Filter_Builder.cpp335
-rw-r--r--TAO/orbsvcs/orbsvcs/Event/EC_Sched_Filter_Builder.h89
-rw-r--r--TAO/orbsvcs/orbsvcs/Event/EC_Sched_Filter_Builder.i14
-rw-r--r--TAO/orbsvcs/orbsvcs/Event/EC_Scheduling_Strategy.cpp14
-rw-r--r--TAO/orbsvcs/orbsvcs/Event/EC_Scheduling_Strategy.h73
-rw-r--r--TAO/orbsvcs/orbsvcs/Event/EC_SupplierAdmin.cpp39
-rw-r--r--TAO/orbsvcs/orbsvcs/Event/EC_SupplierAdmin.h73
-rw-r--r--TAO/orbsvcs/orbsvcs/Event/EC_SupplierControl.cpp42
-rw-r--r--TAO/orbsvcs/orbsvcs/Event/EC_SupplierControl.h81
-rw-r--r--TAO/orbsvcs/orbsvcs/Event/EC_Supplier_Filter.cpp29
-rw-r--r--TAO/orbsvcs/orbsvcs/Event/EC_Supplier_Filter.h151
-rw-r--r--TAO/orbsvcs/orbsvcs/Event/EC_Supplier_Filter.i15
-rw-r--r--TAO/orbsvcs/orbsvcs/Event/EC_Supplier_Filter_Builder.cpp13
-rw-r--r--TAO/orbsvcs/orbsvcs/Event/EC_Supplier_Filter_Builder.h67
-rw-r--r--TAO/orbsvcs/orbsvcs/Event/EC_TPC_Dispatching.cpp198
-rw-r--r--TAO/orbsvcs/orbsvcs/Event/EC_TPC_Dispatching.h85
-rw-r--r--TAO/orbsvcs/orbsvcs/Event/EC_TPC_Dispatching_Task.cpp22
-rw-r--r--TAO/orbsvcs/orbsvcs/Event/EC_TPC_Dispatching_Task.h34
-rw-r--r--TAO/orbsvcs/orbsvcs/Event/EC_TPC_Factory.cpp124
-rw-r--r--TAO/orbsvcs/orbsvcs/Event/EC_TPC_Factory.h67
-rw-r--r--TAO/orbsvcs/orbsvcs/Event/EC_TPC_ProxyConsumer.cpp55
-rw-r--r--TAO/orbsvcs/orbsvcs/Event/EC_TPC_ProxyConsumer.h50
-rw-r--r--TAO/orbsvcs/orbsvcs/Event/EC_TPC_ProxySupplier.cpp76
-rw-r--r--TAO/orbsvcs/orbsvcs/Event/EC_TPC_ProxySupplier.h64
-rw-r--r--TAO/orbsvcs/orbsvcs/Event/EC_TPC_ProxySupplier.i17
-rw-r--r--TAO/orbsvcs/orbsvcs/Event/EC_Timeout_Filter.cpp171
-rw-r--r--TAO/orbsvcs/orbsvcs/Event/EC_Timeout_Filter.h120
-rw-r--r--TAO/orbsvcs/orbsvcs/Event/EC_Timeout_Filter.i19
-rw-r--r--TAO/orbsvcs/orbsvcs/Event/EC_Timeout_Generator.cpp61
-rw-r--r--TAO/orbsvcs/orbsvcs/Event/EC_Timeout_Generator.h101
-rw-r--r--TAO/orbsvcs/orbsvcs/Event/EC_Timeout_Generator.i12
-rw-r--r--TAO/orbsvcs/orbsvcs/Event/EC_Trivial_Supplier_Filter.cpp112
-rw-r--r--TAO/orbsvcs/orbsvcs/Event/EC_Trivial_Supplier_Filter.h109
-rw-r--r--TAO/orbsvcs/orbsvcs/Event/EC_Type_Filter.cpp150
-rw-r--r--TAO/orbsvcs/orbsvcs/Event/EC_Type_Filter.h81
-rw-r--r--TAO/orbsvcs/orbsvcs/Event/EC_UDP_Admin.cpp30
-rw-r--r--TAO/orbsvcs/orbsvcs/Event/EC_UDP_Admin.h60
-rw-r--r--TAO/orbsvcs/orbsvcs/Event/event_export.h40
-rw-r--r--TAO/orbsvcs/orbsvcs/Event/event_serv_export.h40
-rw-r--r--TAO/orbsvcs/orbsvcs/Event/event_skel_export.h40
-rw-r--r--TAO/orbsvcs/orbsvcs/Event/rtcorba_event_export.h40
-rw-r--r--TAO/orbsvcs/orbsvcs/Event/rtkokyu_event_export.h56
-rw-r--r--TAO/orbsvcs/orbsvcs/Event/sched_event_export.h40
-rw-r--r--TAO/orbsvcs/orbsvcs/Event_Forwarder.idl50
-rw-r--r--TAO/orbsvcs/orbsvcs/Event_Service_Constants.h84
-rw-r--r--TAO/orbsvcs/orbsvcs/Event_Utilities.cpp221
-rw-r--r--TAO/orbsvcs/orbsvcs/Event_Utilities.h256
-rw-r--r--TAO/orbsvcs/orbsvcs/Event_Utilities.i152
-rw-r--r--TAO/orbsvcs/orbsvcs/FTORB.mpc89
-rw-r--r--TAO/orbsvcs/orbsvcs/FTRT.idl82
-rw-r--r--TAO/orbsvcs/orbsvcs/FTRT_GroupManager.idl71
-rw-r--r--TAO/orbsvcs/orbsvcs/FT_CORBA.idl352
-rw-r--r--TAO/orbsvcs/orbsvcs/FT_CORBA_ORB.idl136
-rw-r--r--TAO/orbsvcs/orbsvcs/FT_FaultDetectorFactory.idl119
-rw-r--r--TAO/orbsvcs/orbsvcs/FT_Notifier.idl62
-rw-r--r--TAO/orbsvcs/orbsvcs/FT_Replica.idl51
-rw-r--r--TAO/orbsvcs/orbsvcs/FT_ReplicationManager.idl75
-rw-r--r--TAO/orbsvcs/orbsvcs/FaultTolerance.mpc43
-rw-r--r--TAO/orbsvcs/orbsvcs/FaultTolerance.rc30
-rw-r--r--TAO/orbsvcs/orbsvcs/FaultTolerance/FT_ClientORBInitializer.cpp115
-rwxr-xr-xTAO/orbsvcs/orbsvcs/FaultTolerance/FT_ClientORBInitializer.h73
-rw-r--r--TAO/orbsvcs/orbsvcs/FaultTolerance/FT_ClientORB_export.h60
-rwxr-xr-xTAO/orbsvcs/orbsvcs/FaultTolerance/FT_ClientPolicyFactory.cpp34
-rwxr-xr-xTAO/orbsvcs/orbsvcs/FaultTolerance/FT_ClientPolicyFactory.h61
-rwxr-xr-xTAO/orbsvcs/orbsvcs/FaultTolerance/FT_ClientPolicy_i.cpp193
-rwxr-xr-xTAO/orbsvcs/orbsvcs/FaultTolerance/FT_ClientPolicy_i.h165
-rwxr-xr-xTAO/orbsvcs/orbsvcs/FaultTolerance/FT_ClientPolicy_i.inl55
-rw-r--r--TAO/orbsvcs/orbsvcs/FaultTolerance/FT_ClientRequest_Interceptor.cpp441
-rw-r--r--TAO/orbsvcs/orbsvcs/FaultTolerance/FT_ClientRequest_Interceptor.h150
-rwxr-xr-xTAO/orbsvcs/orbsvcs/FaultTolerance/FT_ClientService_Activate.cpp81
-rwxr-xr-xTAO/orbsvcs/orbsvcs/FaultTolerance/FT_ClientService_Activate.h73
-rw-r--r--TAO/orbsvcs/orbsvcs/FaultTolerance/FT_Endpoint_Selector_Factory.cpp60
-rw-r--r--TAO/orbsvcs/orbsvcs/FaultTolerance/FT_Endpoint_Selector_Factory.h76
-rw-r--r--TAO/orbsvcs/orbsvcs/FaultTolerance/FT_IOGR_Property.cpp428
-rw-r--r--TAO/orbsvcs/orbsvcs/FaultTolerance/FT_IOGR_Property.h147
-rw-r--r--TAO/orbsvcs/orbsvcs/FaultTolerance/FT_IOGR_Property.inl35
-rw-r--r--TAO/orbsvcs/orbsvcs/FaultTolerance/FT_Invocation_Endpoint_Selectors.cpp235
-rw-r--r--TAO/orbsvcs/orbsvcs/FaultTolerance/FT_Invocation_Endpoint_Selectors.h96
-rw-r--r--TAO/orbsvcs/orbsvcs/FaultTolerance/FT_ORBInitializer.cpp140
-rw-r--r--TAO/orbsvcs/orbsvcs/FaultTolerance/FT_ORBInitializer.h79
-rw-r--r--TAO/orbsvcs/orbsvcs/FaultTolerance/FT_ORB_Utils_export.h60
-rw-r--r--TAO/orbsvcs/orbsvcs/FaultTolerance/FT_PolicyFactory.cpp38
-rw-r--r--TAO/orbsvcs/orbsvcs/FaultTolerance/FT_PolicyFactory.h63
-rw-r--r--TAO/orbsvcs/orbsvcs/FaultTolerance/FT_Policy_i.cpp259
-rw-r--r--TAO/orbsvcs/orbsvcs/FaultTolerance/FT_Policy_i.h217
-rw-r--r--TAO/orbsvcs/orbsvcs/FaultTolerance/FT_Policy_i.inl80
-rwxr-xr-xTAO/orbsvcs/orbsvcs/FaultTolerance/FT_ServerORBInitializer.cpp100
-rwxr-xr-xTAO/orbsvcs/orbsvcs/FaultTolerance/FT_ServerORBInitializer.h74
-rw-r--r--TAO/orbsvcs/orbsvcs/FaultTolerance/FT_ServerORB_export.h60
-rwxr-xr-xTAO/orbsvcs/orbsvcs/FaultTolerance/FT_ServerPolicyFactory.cpp34
-rwxr-xr-xTAO/orbsvcs/orbsvcs/FaultTolerance/FT_ServerPolicyFactory.h60
-rw-r--r--TAO/orbsvcs/orbsvcs/FaultTolerance/FT_ServerPolicy_i.cpp82
-rwxr-xr-xTAO/orbsvcs/orbsvcs/FaultTolerance/FT_ServerPolicy_i.h96
-rwxr-xr-xTAO/orbsvcs/orbsvcs/FaultTolerance/FT_ServerPolicy_i.inl28
-rw-r--r--TAO/orbsvcs/orbsvcs/FaultTolerance/FT_ServerRequest_Interceptor.cpp237
-rw-r--r--TAO/orbsvcs/orbsvcs/FaultTolerance/FT_ServerRequest_Interceptor.h138
-rwxr-xr-xTAO/orbsvcs/orbsvcs/FaultTolerance/FT_ServerService_Activate.cpp55
-rwxr-xr-xTAO/orbsvcs/orbsvcs/FaultTolerance/FT_ServerService_Activate.h65
-rw-r--r--TAO/orbsvcs/orbsvcs/FaultTolerance/FT_Service_Activate.cpp79
-rw-r--r--TAO/orbsvcs/orbsvcs/FaultTolerance/FT_Service_Activate.h19
-rw-r--r--TAO/orbsvcs/orbsvcs/FaultTolerance/FT_Service_Callbacks.cpp325
-rw-r--r--TAO/orbsvcs/orbsvcs/FaultTolerance/FT_Service_Callbacks.h107
-rw-r--r--TAO/orbsvcs/orbsvcs/FaultTolerance/fault_tol_export.h40
-rw-r--r--TAO/orbsvcs/orbsvcs/FaultTolerance/ftconf.h42
-rw-r--r--TAO/orbsvcs/orbsvcs/FtRtEvent.mpc83
-rw-r--r--TAO/orbsvcs/orbsvcs/FtRtEvent/ClientORB/FTRT_ClientORB_Initializer.cpp35
-rw-r--r--TAO/orbsvcs/orbsvcs/FtRtEvent/ClientORB/FTRT_ClientORB_Initializer.h65
-rw-r--r--TAO/orbsvcs/orbsvcs/FtRtEvent/ClientORB/FTRT_ClientORB_Interceptor.cpp161
-rw-r--r--TAO/orbsvcs/orbsvcs/FtRtEvent/ClientORB/FTRT_ClientORB_Interceptor.h90
-rw-r--r--TAO/orbsvcs/orbsvcs/FtRtEvent/ClientORB/FTRT_ClientORB_Loader.cpp107
-rw-r--r--TAO/orbsvcs/orbsvcs/FtRtEvent/ClientORB/FTRT_ClientORB_Loader.h57
-rw-r--r--TAO/orbsvcs/orbsvcs/FtRtEvent/ClientORB/ftrt_clientorb_export.h60
-rw-r--r--TAO/orbsvcs/orbsvcs/FtRtEvent/EventChannel/AMI_Primary_Replication_Strategy.cpp222
-rw-r--r--TAO/orbsvcs/orbsvcs/FtRtEvent/EventChannel/AMI_Primary_Replication_Strategy.h67
-rw-r--r--TAO/orbsvcs/orbsvcs/FtRtEvent/EventChannel/AMI_Replication_Strategy.cpp71
-rw-r--r--TAO/orbsvcs/orbsvcs/FtRtEvent/EventChannel/AMI_Replication_Strategy.h59
-rw-r--r--TAO/orbsvcs/orbsvcs/FtRtEvent/EventChannel/Basic_Replication_Strategy.cpp158
-rw-r--r--TAO/orbsvcs/orbsvcs/FtRtEvent/EventChannel/Basic_Replication_Strategy.h59
-rw-r--r--TAO/orbsvcs/orbsvcs/FtRtEvent/EventChannel/ConnectionHandler_T.cpp96
-rw-r--r--TAO/orbsvcs/orbsvcs/FtRtEvent/EventChannel/ConnectionHandler_T.h75
-rw-r--r--TAO/orbsvcs/orbsvcs/FtRtEvent/EventChannel/Dynamic_Bitset.cpp125
-rw-r--r--TAO/orbsvcs/orbsvcs/FtRtEvent/EventChannel/Dynamic_Bitset.h76
-rw-r--r--TAO/orbsvcs/orbsvcs/FtRtEvent/EventChannel/Dynamic_Bitset.inl69
-rw-r--r--TAO/orbsvcs/orbsvcs/FtRtEvent/EventChannel/FTEC_Become_Primary_Listener.cpp11
-rw-r--r--TAO/orbsvcs/orbsvcs/FtRtEvent/EventChannel/FTEC_Become_Primary_Listener.h31
-rw-r--r--TAO/orbsvcs/orbsvcs/FtRtEvent/EventChannel/FTEC_ConsumerAdmin.cpp51
-rw-r--r--TAO/orbsvcs/orbsvcs/FtRtEvent/EventChannel/FTEC_ConsumerAdmin.h73
-rw-r--r--TAO/orbsvcs/orbsvcs/FtRtEvent/EventChannel/FTEC_Event_Channel.cpp428
-rw-r--r--TAO/orbsvcs/orbsvcs/FtRtEvent/EventChannel/FTEC_Event_Channel.h184
-rw-r--r--TAO/orbsvcs/orbsvcs/FtRtEvent/EventChannel/FTEC_Event_Channel_Impl.cpp582
-rw-r--r--TAO/orbsvcs/orbsvcs/FtRtEvent/EventChannel/FTEC_Event_Channel_Impl.h135
-rw-r--r--TAO/orbsvcs/orbsvcs/FtRtEvent/EventChannel/FTEC_Factory.cpp56
-rw-r--r--TAO/orbsvcs/orbsvcs/FtRtEvent/EventChannel/FTEC_Factory.h49
-rw-r--r--TAO/orbsvcs/orbsvcs/FtRtEvent/EventChannel/FTEC_Fault_Listener.h29
-rw-r--r--TAO/orbsvcs/orbsvcs/FtRtEvent/EventChannel/FTEC_Group_Manager.cpp378
-rw-r--r--TAO/orbsvcs/orbsvcs/FtRtEvent/EventChannel/FTEC_Group_Manager.h80
-rw-r--r--TAO/orbsvcs/orbsvcs/FtRtEvent/EventChannel/FTEC_ORBInitializer.cpp68
-rw-r--r--TAO/orbsvcs/orbsvcs/FtRtEvent/EventChannel/FTEC_ORBInitializer.h42
-rw-r--r--TAO/orbsvcs/orbsvcs/FtRtEvent/EventChannel/FTEC_ProxyConsumer.cpp134
-rw-r--r--TAO/orbsvcs/orbsvcs/FtRtEvent/EventChannel/FTEC_ProxyConsumer.h67
-rw-r--r--TAO/orbsvcs/orbsvcs/FtRtEvent/EventChannel/FTEC_ProxySupplier.cpp202
-rw-r--r--TAO/orbsvcs/orbsvcs/FtRtEvent/EventChannel/FTEC_ProxySupplier.h72
-rw-r--r--TAO/orbsvcs/orbsvcs/FtRtEvent/EventChannel/FTEC_SupplierAdmin.cpp49
-rw-r--r--TAO/orbsvcs/orbsvcs/FtRtEvent/EventChannel/FTEC_SupplierAdmin.h79
-rw-r--r--TAO/orbsvcs/orbsvcs/FtRtEvent/EventChannel/FTRTEC_ServiceActivate.h11
-rw-r--r--TAO/orbsvcs/orbsvcs/FtRtEvent/EventChannel/FT_ProxyAdmin_Base.cpp52
-rw-r--r--TAO/orbsvcs/orbsvcs/FtRtEvent/EventChannel/FT_ProxyAdmin_Base.h53
-rw-r--r--TAO/orbsvcs/orbsvcs/FtRtEvent/EventChannel/FT_ProxyAdmin_T.cpp145
-rw-r--r--TAO/orbsvcs/orbsvcs/FtRtEvent/EventChannel/FT_ProxyAdmin_T.h58
-rw-r--r--TAO/orbsvcs/orbsvcs/FtRtEvent/EventChannel/Fault_Detector.cpp75
-rw-r--r--TAO/orbsvcs/orbsvcs/FtRtEvent/EventChannel/Fault_Detector.h64
-rw-r--r--TAO/orbsvcs/orbsvcs/FtRtEvent/EventChannel/Fault_Detector_Loader.cpp90
-rw-r--r--TAO/orbsvcs/orbsvcs/FtRtEvent/EventChannel/Fault_Detector_Loader.h59
-rw-r--r--TAO/orbsvcs/orbsvcs/FtRtEvent/EventChannel/Fault_Detector_T.cpp65
-rw-r--r--TAO/orbsvcs/orbsvcs/FtRtEvent/EventChannel/Fault_Detector_T.h48
-rw-r--r--TAO/orbsvcs/orbsvcs/FtRtEvent/EventChannel/Fault_Listener.h33
-rw-r--r--TAO/orbsvcs/orbsvcs/FtRtEvent/EventChannel/ForwardCtrlServerInterceptor.cpp260
-rw-r--r--TAO/orbsvcs/orbsvcs/FtRtEvent/EventChannel/ForwardCtrlServerInterceptor.h65
-rw-r--r--TAO/orbsvcs/orbsvcs/FtRtEvent/EventChannel/FtEventServiceInterceptor.cpp340
-rw-r--r--TAO/orbsvcs/orbsvcs/FtRtEvent/EventChannel/FtEventServiceInterceptor.h100
-rw-r--r--TAO/orbsvcs/orbsvcs/FtRtEvent/EventChannel/GroupInfoPublisher.cpp175
-rw-r--r--TAO/orbsvcs/orbsvcs/FtRtEvent/EventChannel/GroupInfoPublisher.h83
-rw-r--r--TAO/orbsvcs/orbsvcs/FtRtEvent/EventChannel/IOGR_Maker.cpp269
-rw-r--r--TAO/orbsvcs/orbsvcs/FtRtEvent/EventChannel/IOGR_Maker.h75
-rw-r--r--TAO/orbsvcs/orbsvcs/FtRtEvent/EventChannel/Identification_Service.cpp100
-rw-r--r--TAO/orbsvcs/orbsvcs/FtRtEvent/EventChannel/Identification_Service.h57
-rw-r--r--TAO/orbsvcs/orbsvcs/FtRtEvent/EventChannel/ObjectGroupManagerHandler.cpp71
-rw-r--r--TAO/orbsvcs/orbsvcs/FtRtEvent/EventChannel/ObjectGroupManagerHandler.h61
-rw-r--r--TAO/orbsvcs/orbsvcs/FtRtEvent/EventChannel/ProxyConsumerStateWorker.cpp36
-rw-r--r--TAO/orbsvcs/orbsvcs/FtRtEvent/EventChannel/ProxyConsumerStateWorker.h43
-rw-r--r--TAO/orbsvcs/orbsvcs/FtRtEvent/EventChannel/ProxySupplierStateWorker.cpp38
-rw-r--r--TAO/orbsvcs/orbsvcs/FtRtEvent/EventChannel/ProxySupplierStateWorker.h43
-rw-r--r--TAO/orbsvcs/orbsvcs/FtRtEvent/EventChannel/Replication_Service.cpp210
-rw-r--r--TAO/orbsvcs/orbsvcs/FtRtEvent/EventChannel/Replication_Service.h85
-rw-r--r--TAO/orbsvcs/orbsvcs/FtRtEvent/EventChannel/Replication_Strategy.cpp35
-rw-r--r--TAO/orbsvcs/orbsvcs/FtRtEvent/EventChannel/Replication_Strategy.h76
-rw-r--r--TAO/orbsvcs/orbsvcs/FtRtEvent/EventChannel/Request_Context_Repository.cpp316
-rw-r--r--TAO/orbsvcs/orbsvcs/FtRtEvent/EventChannel/Request_Context_Repository.h116
-rw-r--r--TAO/orbsvcs/orbsvcs/FtRtEvent/EventChannel/SCTP_Fault_Detector.cpp96
-rw-r--r--TAO/orbsvcs/orbsvcs/FtRtEvent/EventChannel/SCTP_Fault_Detector.h86
-rw-r--r--TAO/orbsvcs/orbsvcs/FtRtEvent/EventChannel/Set_Update_Interceptor.cpp168
-rw-r--r--TAO/orbsvcs/orbsvcs/FtRtEvent/EventChannel/Set_Update_Interceptor.h86
-rw-r--r--TAO/orbsvcs/orbsvcs/FtRtEvent/EventChannel/Update_Manager.cpp61
-rw-r--r--TAO/orbsvcs/orbsvcs/FtRtEvent/EventChannel/Update_Manager.h52
-rw-r--r--TAO/orbsvcs/orbsvcs/FtRtEvent/EventChannel/UpdateableHandler.cpp100
-rw-r--r--TAO/orbsvcs/orbsvcs/FtRtEvent/EventChannel/UpdateableHandler.h60
-rw-r--r--TAO/orbsvcs/orbsvcs/FtRtEvent/EventChannel/create_persistent_poa.cpp49
-rw-r--r--TAO/orbsvcs/orbsvcs/FtRtEvent/EventChannel/create_persistent_poa.h30
-rw-r--r--TAO/orbsvcs/orbsvcs/FtRtEvent/EventChannel/ftrtec_export.h60
-rw-r--r--TAO/orbsvcs/orbsvcs/FtRtEvent/EventChannel/replace_key.cpp35
-rw-r--r--TAO/orbsvcs/orbsvcs/FtRtEvent/Utils/FTEC_Gateway.cpp523
-rw-r--r--TAO/orbsvcs/orbsvcs/FtRtEvent/Utils/FTEC_Gateway.h82
-rw-r--r--TAO/orbsvcs/orbsvcs/FtRtEvent/Utils/FTEC_Gateway.inl16
-rw-r--r--TAO/orbsvcs/orbsvcs/FtRtEvent/Utils/Log.cpp29
-rw-r--r--TAO/orbsvcs/orbsvcs/FtRtEvent/Utils/Log.h48
-rw-r--r--TAO/orbsvcs/orbsvcs/FtRtEvent/Utils/Log.inl51
-rw-r--r--TAO/orbsvcs/orbsvcs/FtRtEvent/Utils/Safe_InputCDR.cpp9
-rw-r--r--TAO/orbsvcs/orbsvcs/FtRtEvent/Utils/Safe_InputCDR.h40
-rw-r--r--TAO/orbsvcs/orbsvcs/FtRtEvent/Utils/Safe_InputCDR.inl23
-rw-r--r--TAO/orbsvcs/orbsvcs/FtRtEvent/Utils/ScopeGuard.h300
-rw-r--r--TAO/orbsvcs/orbsvcs/FtRtEvent/Utils/UUID.cpp167
-rw-r--r--TAO/orbsvcs/orbsvcs/FtRtEvent/Utils/UUID.h123
-rw-r--r--TAO/orbsvcs/orbsvcs/FtRtEvent/Utils/UUID.inl58
-rw-r--r--TAO/orbsvcs/orbsvcs/FtRtEvent/Utils/activate_with_id.h43
-rw-r--r--TAO/orbsvcs/orbsvcs/FtRtEvent/Utils/ftrtevent_export.h73
-rw-r--r--TAO/orbsvcs/orbsvcs/FtRtEvent/Utils/resolve_init.h73
-rw-r--r--TAO/orbsvcs/orbsvcs/FtRtecEventChannelAdmin.idl194
-rw-r--r--TAO/orbsvcs/orbsvcs/FtRtecEventComm.idl32
-rw-r--r--TAO/orbsvcs/orbsvcs/GSSUP.idl63
-rw-r--r--TAO/orbsvcs/orbsvcs/HTIOP.idl30
-rw-r--r--TAO/orbsvcs/orbsvcs/HTIOP.mpc29
-rw-r--r--TAO/orbsvcs/orbsvcs/HTIOP/HTIOP_Acceptor.cpp889
-rw-r--r--TAO/orbsvcs/orbsvcs/HTIOP/HTIOP_Acceptor.h239
-rw-r--r--TAO/orbsvcs/orbsvcs/HTIOP/HTIOP_Acceptor.i28
-rw-r--r--TAO/orbsvcs/orbsvcs/HTIOP/HTIOP_Acceptor_Impl.cpp322
-rw-r--r--TAO/orbsvcs/orbsvcs/HTIOP/HTIOP_Acceptor_Impl.h156
-rw-r--r--TAO/orbsvcs/orbsvcs/HTIOP/HTIOP_Completion_Handler.cpp181
-rw-r--r--TAO/orbsvcs/orbsvcs/HTIOP/HTIOP_Completion_Handler.h99
-rw-r--r--TAO/orbsvcs/orbsvcs/HTIOP/HTIOP_Connection_Handler.cpp289
-rw-r--r--TAO/orbsvcs/orbsvcs/HTIOP/HTIOP_Connection_Handler.h135
-rw-r--r--TAO/orbsvcs/orbsvcs/HTIOP/HTIOP_Connector.cpp420
-rw-r--r--TAO/orbsvcs/orbsvcs/HTIOP/HTIOP_Connector.h137
-rw-r--r--TAO/orbsvcs/orbsvcs/HTIOP/HTIOP_Connector_Impl.cpp62
-rw-r--r--TAO/orbsvcs/orbsvcs/HTIOP/HTIOP_Connector_Impl.h128
-rw-r--r--TAO/orbsvcs/orbsvcs/HTIOP/HTIOP_Endpoint.cpp225
-rw-r--r--TAO/orbsvcs/orbsvcs/HTIOP/HTIOP_Endpoint.h162
-rw-r--r--TAO/orbsvcs/orbsvcs/HTIOP/HTIOP_Endpoint.i79
-rw-r--r--TAO/orbsvcs/orbsvcs/HTIOP/HTIOP_Export.h54
-rw-r--r--TAO/orbsvcs/orbsvcs/HTIOP/HTIOP_Factory.cpp146
-rw-r--r--TAO/orbsvcs/orbsvcs/HTIOP/HTIOP_Factory.h99
-rw-r--r--TAO/orbsvcs/orbsvcs/HTIOP/HTIOP_Profile.cpp473
-rw-r--r--TAO/orbsvcs/orbsvcs/HTIOP/HTIOP_Profile.h151
-rw-r--r--TAO/orbsvcs/orbsvcs/HTIOP/HTIOP_Transport.cpp456
-rw-r--r--TAO/orbsvcs/orbsvcs/HTIOP/HTIOP_Transport.h168
-rw-r--r--TAO/orbsvcs/orbsvcs/HTIOP/README.txt154
-rw-r--r--TAO/orbsvcs/orbsvcs/HTIOP/htiop_endpoints.pidl42
-rw-r--r--TAO/orbsvcs/orbsvcs/HTIOP/htiop_endpointsC.cpp222
-rw-r--r--TAO/orbsvcs/orbsvcs/HTIOP/htiop_endpointsC.h199
-rw-r--r--TAO/orbsvcs/orbsvcs/IFRService.mpc21
-rw-r--r--TAO/orbsvcs/orbsvcs/IFRService.rc30
-rw-r--r--TAO/orbsvcs/orbsvcs/IFRService/AbstractInterfaceDef_i.cpp62
-rw-r--r--TAO/orbsvcs/orbsvcs/IFRService/AbstractInterfaceDef_i.h81
-rw-r--r--TAO/orbsvcs/orbsvcs/IFRService/AliasDef_i.cpp141
-rw-r--r--TAO/orbsvcs/orbsvcs/IFRService/AliasDef_i.h101
-rw-r--r--TAO/orbsvcs/orbsvcs/IFRService/ArrayDef_i.cpp279
-rw-r--r--TAO/orbsvcs/orbsvcs/IFRService/ArrayDef_i.h148
-rw-r--r--TAO/orbsvcs/orbsvcs/IFRService/AttributeDef_i.cpp397
-rw-r--r--TAO/orbsvcs/orbsvcs/IFRService/AttributeDef_i.h152
-rw-r--r--TAO/orbsvcs/orbsvcs/IFRService/ComponentContainer_i.cpp569
-rw-r--r--TAO/orbsvcs/orbsvcs/IFRService/ComponentContainer_i.h144
-rw-r--r--TAO/orbsvcs/orbsvcs/IFRService/ComponentDef_i.cpp794
-rw-r--r--TAO/orbsvcs/orbsvcs/IFRService/ComponentDef_i.h249
-rw-r--r--TAO/orbsvcs/orbsvcs/IFRService/ComponentModuleDef_i.cpp23
-rw-r--r--TAO/orbsvcs/orbsvcs/IFRService/ComponentModuleDef_i.h63
-rw-r--r--TAO/orbsvcs/orbsvcs/IFRService/ComponentRepository_i.cpp245
-rw-r--r--TAO/orbsvcs/orbsvcs/IFRService/ComponentRepository_i.h129
-rw-r--r--TAO/orbsvcs/orbsvcs/IFRService/ConstantDef_i.cpp313
-rw-r--r--TAO/orbsvcs/orbsvcs/IFRService/ConstantDef_i.h132
-rw-r--r--TAO/orbsvcs/orbsvcs/IFRService/ConsumesDef_i.cpp34
-rw-r--r--TAO/orbsvcs/orbsvcs/IFRService/ConsumesDef_i.h68
-rw-r--r--TAO/orbsvcs/orbsvcs/IFRService/Contained_i.cpp1259
-rw-r--r--TAO/orbsvcs/orbsvcs/IFRService/Contained_i.h236
-rw-r--r--TAO/orbsvcs/orbsvcs/IFRService/Container_i.cpp2684
-rw-r--r--TAO/orbsvcs/orbsvcs/IFRService/Container_i.h479
-rw-r--r--TAO/orbsvcs/orbsvcs/IFRService/EmitsDef_i.cpp32
-rw-r--r--TAO/orbsvcs/orbsvcs/IFRService/EmitsDef_i.h68
-rw-r--r--TAO/orbsvcs/orbsvcs/IFRService/EnumDef_i.cpp163
-rw-r--r--TAO/orbsvcs/orbsvcs/IFRService/EnumDef_i.h101
-rw-r--r--TAO/orbsvcs/orbsvcs/IFRService/EventDef_i.cpp101
-rw-r--r--TAO/orbsvcs/orbsvcs/IFRService/EventDef_i.h102
-rw-r--r--TAO/orbsvcs/orbsvcs/IFRService/EventPortDef_i.cpp200
-rw-r--r--TAO/orbsvcs/orbsvcs/IFRService/EventPortDef_i.h123
-rw-r--r--TAO/orbsvcs/orbsvcs/IFRService/ExceptionDef_i.cpp351
-rw-r--r--TAO/orbsvcs/orbsvcs/IFRService/ExceptionDef_i.h124
-rw-r--r--TAO/orbsvcs/orbsvcs/IFRService/ExtAbstractInterfaceDef_i.cpp43
-rw-r--r--TAO/orbsvcs/orbsvcs/IFRService/ExtAbstractInterfaceDef_i.h70
-rw-r--r--TAO/orbsvcs/orbsvcs/IFRService/ExtAttributeDef_i.cpp315
-rw-r--r--TAO/orbsvcs/orbsvcs/IFRService/ExtAttributeDef_i.h133
-rw-r--r--TAO/orbsvcs/orbsvcs/IFRService/ExtInterfaceDef_i.cpp29
-rw-r--r--TAO/orbsvcs/orbsvcs/IFRService/ExtInterfaceDef_i.h65
-rw-r--r--TAO/orbsvcs/orbsvcs/IFRService/ExtLocalInterfaceDef_i.cpp43
-rw-r--r--TAO/orbsvcs/orbsvcs/IFRService/ExtLocalInterfaceDef_i.h70
-rw-r--r--TAO/orbsvcs/orbsvcs/IFRService/ExtValueDef_i.cpp975
-rw-r--r--TAO/orbsvcs/orbsvcs/IFRService/ExtValueDef_i.h135
-rw-r--r--TAO/orbsvcs/orbsvcs/IFRService/FactoryDef_i.cpp32
-rw-r--r--TAO/orbsvcs/orbsvcs/IFRService/FactoryDef_i.h66
-rw-r--r--TAO/orbsvcs/orbsvcs/IFRService/FinderDef_i.cpp31
-rw-r--r--TAO/orbsvcs/orbsvcs/IFRService/FinderDef_i.h67
-rw-r--r--TAO/orbsvcs/orbsvcs/IFRService/FixedDef_i.cpp152
-rw-r--r--TAO/orbsvcs/orbsvcs/IFRService/FixedDef_i.h133
-rw-r--r--TAO/orbsvcs/orbsvcs/IFRService/HomeDef_i.cpp1058
-rw-r--r--TAO/orbsvcs/orbsvcs/IFRService/HomeDef_i.h286
-rw-r--r--TAO/orbsvcs/orbsvcs/IFRService/IDLType_i.cpp21
-rw-r--r--TAO/orbsvcs/orbsvcs/IFRService/IDLType_i.h75
-rw-r--r--TAO/orbsvcs/orbsvcs/IFRService/IFR_BaseS.cpp7987
-rw-r--r--TAO/orbsvcs/orbsvcs/IFRService/IFR_BaseS.h1261
-rw-r--r--TAO/orbsvcs/orbsvcs/IFRService/IFR_BaseS.inl414
-rw-r--r--TAO/orbsvcs/orbsvcs/IFRService/IFR_BaseS_T.cpp49
-rw-r--r--TAO/orbsvcs/orbsvcs/IFRService/IFR_BaseS_T.h927
-rw-r--r--TAO/orbsvcs/orbsvcs/IFRService/IFR_BaseS_T.inl1512
-rw-r--r--TAO/orbsvcs/orbsvcs/IFRService/IFR_BasicS.cpp23928
-rw-r--r--TAO/orbsvcs/orbsvcs/IFRService/IFR_BasicS.h7898
-rw-r--r--TAO/orbsvcs/orbsvcs/IFRService/IFR_BasicS.inl9663
-rw-r--r--TAO/orbsvcs/orbsvcs/IFRService/IFR_BasicS_T.cpp49
-rw-r--r--TAO/orbsvcs/orbsvcs/IFRService/IFR_BasicS_T.h7971
-rw-r--r--TAO/orbsvcs/orbsvcs/IFRService/IFR_BasicS_T.inl13439
-rw-r--r--TAO/orbsvcs/orbsvcs/IFRService/IFR_ComponentsS.cpp14264
-rw-r--r--TAO/orbsvcs/orbsvcs/IFRService/IFR_ComponentsS.h5119
-rw-r--r--TAO/orbsvcs/orbsvcs/IFRService/IFR_ComponentsS.inl6972
-rw-r--r--TAO/orbsvcs/orbsvcs/IFRService/IFR_ComponentsS_T.cpp49
-rw-r--r--TAO/orbsvcs/orbsvcs/IFRService/IFR_ComponentsS_T.h5387
-rw-r--r--TAO/orbsvcs/orbsvcs/IFRService/IFR_ComponentsS_T.inl9019
-rw-r--r--TAO/orbsvcs/orbsvcs/IFRService/IFR_ExtendedS.cpp7501
-rw-r--r--TAO/orbsvcs/orbsvcs/IFRService/IFR_ExtendedS.h2140
-rw-r--r--TAO/orbsvcs/orbsvcs/IFRService/IFR_ExtendedS.inl2232
-rw-r--r--TAO/orbsvcs/orbsvcs/IFRService/IFR_ExtendedS_T.cpp49
-rw-r--r--TAO/orbsvcs/orbsvcs/IFRService/IFR_ExtendedS_T.h2032
-rw-r--r--TAO/orbsvcs/orbsvcs/IFRService/IFR_ExtendedS_T.inl3342
-rw-r--r--TAO/orbsvcs/orbsvcs/IFRService/IFR_Service_Loader.cpp100
-rw-r--r--TAO/orbsvcs/orbsvcs/IFRService/IFR_Service_Loader.h76
-rw-r--r--TAO/orbsvcs/orbsvcs/IFRService/IFR_Service_Utils.cpp1445
-rw-r--r--TAO/orbsvcs/orbsvcs/IFRService/IFR_Service_Utils.h258
-rw-r--r--TAO/orbsvcs/orbsvcs/IFRService/IFR_Service_Utils_T.cpp389
-rw-r--r--TAO/orbsvcs/orbsvcs/IFRService/IFR_Service_Utils_T.h125
-rw-r--r--TAO/orbsvcs/orbsvcs/IFRService/IFR_macro.h51
-rw-r--r--TAO/orbsvcs/orbsvcs/IFRService/IRObject_i.cpp89
-rw-r--r--TAO/orbsvcs/orbsvcs/IFRService/IRObject_i.h99
-rw-r--r--TAO/orbsvcs/orbsvcs/IFRService/InterfaceAttrExtension_i.cpp343
-rw-r--r--TAO/orbsvcs/orbsvcs/IFRService/InterfaceAttrExtension_i.h97
-rw-r--r--TAO/orbsvcs/orbsvcs/IFRService/InterfaceDef_i.cpp1285
-rw-r--r--TAO/orbsvcs/orbsvcs/IFRService/InterfaceDef_i.h236
-rw-r--r--TAO/orbsvcs/orbsvcs/IFRService/LocalInterfaceDef_i.cpp62
-rw-r--r--TAO/orbsvcs/orbsvcs/IFRService/LocalInterfaceDef_i.h78
-rw-r--r--TAO/orbsvcs/orbsvcs/IFRService/ModuleDef_i.cpp111
-rw-r--r--TAO/orbsvcs/orbsvcs/IFRService/ModuleDef_i.h94
-rw-r--r--TAO/orbsvcs/orbsvcs/IFRService/NativeDef_i.cpp66
-rw-r--r--TAO/orbsvcs/orbsvcs/IFRService/NativeDef_i.h79
-rw-r--r--TAO/orbsvcs/orbsvcs/IFRService/OperationDef_i.cpp750
-rw-r--r--TAO/orbsvcs/orbsvcs/IFRService/OperationDef_i.h184
-rw-r--r--TAO/orbsvcs/orbsvcs/IFRService/Options.cpp122
-rw-r--r--TAO/orbsvcs/orbsvcs/IFRService/Options.h95
-rw-r--r--TAO/orbsvcs/orbsvcs/IFRService/PrimitiveDef_i.cpp142
-rw-r--r--TAO/orbsvcs/orbsvcs/IFRService/PrimitiveDef_i.h100
-rw-r--r--TAO/orbsvcs/orbsvcs/IFRService/ProvidesDef_i.cpp161
-rw-r--r--TAO/orbsvcs/orbsvcs/IFRService/ProvidesDef_i.h101
-rw-r--r--TAO/orbsvcs/orbsvcs/IFRService/PublishesDef_i.cpp30
-rw-r--r--TAO/orbsvcs/orbsvcs/IFRService/PublishesDef_i.h67
-rw-r--r--TAO/orbsvcs/orbsvcs/IFRService/RecursDef_i.cpp47
-rw-r--r--TAO/orbsvcs/orbsvcs/IFRService/RecursDef_i.h68
-rw-r--r--TAO/orbsvcs/orbsvcs/IFRService/Repository_i.cpp1150
-rw-r--r--TAO/orbsvcs/orbsvcs/IFRService/Repository_i.h386
-rw-r--r--TAO/orbsvcs/orbsvcs/IFRService/SequenceDef_i.cpp269
-rw-r--r--TAO/orbsvcs/orbsvcs/IFRService/SequenceDef_i.h150
-rw-r--r--TAO/orbsvcs/orbsvcs/IFRService/StringDef_i.cpp131
-rw-r--r--TAO/orbsvcs/orbsvcs/IFRService/StringDef_i.h112
-rw-r--r--TAO/orbsvcs/orbsvcs/IFRService/StructDef_i.cpp317
-rw-r--r--TAO/orbsvcs/orbsvcs/IFRService/StructDef_i.h113
-rw-r--r--TAO/orbsvcs/orbsvcs/IFRService/TypedefDef_i.cpp82
-rw-r--r--TAO/orbsvcs/orbsvcs/IFRService/TypedefDef_i.h75
-rw-r--r--TAO/orbsvcs/orbsvcs/IFRService/UnionDef_i.cpp486
-rw-r--r--TAO/orbsvcs/orbsvcs/IFRService/UnionDef_i.h153
-rw-r--r--TAO/orbsvcs/orbsvcs/IFRService/UsesDef_i.cpp214
-rw-r--r--TAO/orbsvcs/orbsvcs/IFRService/UsesDef_i.h122
-rw-r--r--TAO/orbsvcs/orbsvcs/IFRService/ValueBoxDef_i.cpp140
-rw-r--r--TAO/orbsvcs/orbsvcs/IFRService/ValueBoxDef_i.h101
-rw-r--r--TAO/orbsvcs/orbsvcs/IFRService/ValueDef_i.cpp1857
-rw-r--r--TAO/orbsvcs/orbsvcs/IFRService/ValueDef_i.h353
-rw-r--r--TAO/orbsvcs/orbsvcs/IFRService/ValueMemberDef_i.cpp224
-rw-r--r--TAO/orbsvcs/orbsvcs/IFRService/ValueMemberDef_i.h132
-rw-r--r--TAO/orbsvcs/orbsvcs/IFRService/WstringDef_i.cpp131
-rw-r--r--TAO/orbsvcs/orbsvcs/IFRService/WstringDef_i.h113
-rw-r--r--TAO/orbsvcs/orbsvcs/IFRService/concrete_classes.h54
-rw-r--r--TAO/orbsvcs/orbsvcs/IFRService/ifr_service_export.h40
-rw-r--r--TAO/orbsvcs/orbsvcs/IOR_Multicast.cpp321
-rw-r--r--TAO/orbsvcs/orbsvcs/IOR_Multicast.h114
-rw-r--r--TAO/orbsvcs/orbsvcs/LB_ORT.idl28
-rw-r--r--TAO/orbsvcs/orbsvcs/LifeCycle/lifecycle_export.h40
-rw-r--r--TAO/orbsvcs/orbsvcs/LifeCycleService.idl83
-rw-r--r--TAO/orbsvcs/orbsvcs/LoadBalancing/LB_CPU_Load_Average_Monitor.cpp244
-rw-r--r--TAO/orbsvcs/orbsvcs/LoadBalancing/LB_CPU_Load_Average_Monitor.h103
-rw-r--r--TAO/orbsvcs/orbsvcs/LoadBalancing/LB_CPU_Utilization_Monitor.cpp170
-rw-r--r--TAO/orbsvcs/orbsvcs/LoadBalancing/LB_CPU_Utilization_Monitor.h100
-rw-r--r--TAO/orbsvcs/orbsvcs/LoadBalancing/LB_ClientComponent.cpp70
-rw-r--r--TAO/orbsvcs/orbsvcs/LoadBalancing/LB_ClientComponent.h68
-rw-r--r--TAO/orbsvcs/orbsvcs/LoadBalancing/LB_ClientORBInitializer.cpp43
-rw-r--r--TAO/orbsvcs/orbsvcs/LoadBalancing/LB_ClientORBInitializer.h78
-rw-r--r--TAO/orbsvcs/orbsvcs/LoadBalancing/LB_ClientRequestInterceptor.cpp114
-rw-r--r--TAO/orbsvcs/orbsvcs/LoadBalancing/LB_ClientRequestInterceptor.h114
-rw-r--r--TAO/orbsvcs/orbsvcs/LoadBalancing/LB_Component.cpp146
-rw-r--r--TAO/orbsvcs/orbsvcs/LoadBalancing/LB_Component.h70
-rw-r--r--TAO/orbsvcs/orbsvcs/LoadBalancing/LB_IORInterceptor.cpp189
-rw-r--r--TAO/orbsvcs/orbsvcs/LoadBalancing/LB_IORInterceptor.h152
-rw-r--r--TAO/orbsvcs/orbsvcs/LoadBalancing/LB_LeastLoaded.cpp641
-rw-r--r--TAO/orbsvcs/orbsvcs/LoadBalancing/LB_LeastLoaded.h229
-rw-r--r--TAO/orbsvcs/orbsvcs/LoadBalancing/LB_LeastLoaded.inl27
-rw-r--r--TAO/orbsvcs/orbsvcs/LoadBalancing/LB_LoadAlert.cpp42
-rw-r--r--TAO/orbsvcs/orbsvcs/LoadBalancing/LB_LoadAlert.h87
-rw-r--r--TAO/orbsvcs/orbsvcs/LoadBalancing/LB_LoadAlert.inl16
-rw-r--r--TAO/orbsvcs/orbsvcs/LoadBalancing/LB_LoadAlertInfo.cpp16
-rw-r--r--TAO/orbsvcs/orbsvcs/LoadBalancing/LB_LoadAlertInfo.h54
-rw-r--r--TAO/orbsvcs/orbsvcs/LoadBalancing/LB_LoadAlertMap.h46
-rw-r--r--TAO/orbsvcs/orbsvcs/LoadBalancing/LB_LoadAlert_Handler.cpp52
-rw-r--r--TAO/orbsvcs/orbsvcs/LoadBalancing/LB_LoadAlert_Handler.h76
-rw-r--r--TAO/orbsvcs/orbsvcs/LoadBalancing/LB_LoadAverage.cpp454
-rw-r--r--TAO/orbsvcs/orbsvcs/LoadBalancing/LB_LoadAverage.h184
-rw-r--r--TAO/orbsvcs/orbsvcs/LoadBalancing/LB_LoadAverage.inl26
-rw-r--r--TAO/orbsvcs/orbsvcs/LoadBalancing/LB_LoadListMap.h46
-rw-r--r--TAO/orbsvcs/orbsvcs/LoadBalancing/LB_LoadManager.cpp1295
-rw-r--r--TAO/orbsvcs/orbsvcs/LoadBalancing/LB_LoadManager.h519
-rw-r--r--TAO/orbsvcs/orbsvcs/LoadBalancing/LB_LoadMap.h46
-rw-r--r--TAO/orbsvcs/orbsvcs/LoadBalancing/LB_LoadMinimum.cpp664
-rw-r--r--TAO/orbsvcs/orbsvcs/LoadBalancing/LB_LoadMinimum.h208
-rw-r--r--TAO/orbsvcs/orbsvcs/LoadBalancing/LB_LoadMinimum.inl26
-rw-r--r--TAO/orbsvcs/orbsvcs/LoadBalancing/LB_Location_Index_Map.h44
-rw-r--r--TAO/orbsvcs/orbsvcs/LoadBalancing/LB_MemberLocator.cpp76
-rw-r--r--TAO/orbsvcs/orbsvcs/LoadBalancing/LB_MemberLocator.h92
-rw-r--r--TAO/orbsvcs/orbsvcs/LoadBalancing/LB_MonitorMap.h42
-rw-r--r--TAO/orbsvcs/orbsvcs/LoadBalancing/LB_ORBInitializer.cpp94
-rw-r--r--TAO/orbsvcs/orbsvcs/LoadBalancing/LB_ORBInitializer.h110
-rw-r--r--TAO/orbsvcs/orbsvcs/LoadBalancing/LB_ObjectReferenceFactory.cpp258
-rw-r--r--TAO/orbsvcs/orbsvcs/LoadBalancing/LB_ObjectReferenceFactory.h179
-rw-r--r--TAO/orbsvcs/orbsvcs/LoadBalancing/LB_Pull_Handler.cpp84
-rw-r--r--TAO/orbsvcs/orbsvcs/LoadBalancing/LB_Pull_Handler.h73
-rw-r--r--TAO/orbsvcs/orbsvcs/LoadBalancing/LB_Random.cpp180
-rw-r--r--TAO/orbsvcs/orbsvcs/LoadBalancing/LB_Random.h124
-rw-r--r--TAO/orbsvcs/orbsvcs/LoadBalancing/LB_RoundRobin.cpp171
-rw-r--r--TAO/orbsvcs/orbsvcs/LoadBalancing/LB_RoundRobin.h127
-rw-r--r--TAO/orbsvcs/orbsvcs/LoadBalancing/LB_ServerRequestInterceptor.cpp182
-rw-r--r--TAO/orbsvcs/orbsvcs/LoadBalancing/LB_ServerRequestInterceptor.h125
-rw-r--r--TAO/orbsvcs/orbsvcs/LoadBalancing/LB_conf.h45
-rw-r--r--TAO/orbsvcs/orbsvcs/LoadBalancing/LoadBalancing_export.h40
-rw-r--r--TAO/orbsvcs/orbsvcs/LoadBalancing/README35
-rw-r--r--TAO/orbsvcs/orbsvcs/Log/BasicLogFactory_i.cpp147
-rw-r--r--TAO/orbsvcs/orbsvcs/Log/BasicLogFactory_i.h109
-rw-r--r--TAO/orbsvcs/orbsvcs/Log/BasicLog_i.cpp93
-rw-r--r--TAO/orbsvcs/orbsvcs/Log/BasicLog_i.h101
-rw-r--r--TAO/orbsvcs/orbsvcs/Log/EventLogConsumer.cpp100
-rw-r--r--TAO/orbsvcs/orbsvcs/Log/EventLogConsumer.h102
-rw-r--r--TAO/orbsvcs/orbsvcs/Log/EventLogFactory_i.cpp253
-rw-r--r--TAO/orbsvcs/orbsvcs/Log/EventLogFactory_i.h152
-rw-r--r--TAO/orbsvcs/orbsvcs/Log/EventLogNotification.cpp52
-rw-r--r--TAO/orbsvcs/orbsvcs/Log/EventLogNotification.h92
-rw-r--r--TAO/orbsvcs/orbsvcs/Log/EventLog_i.cpp139
-rw-r--r--TAO/orbsvcs/orbsvcs/Log/EventLog_i.h135
-rw-r--r--TAO/orbsvcs/orbsvcs/Log/Hash_Iterator_i.cpp110
-rw-r--r--TAO/orbsvcs/orbsvcs/Log/Hash_Iterator_i.h95
-rw-r--r--TAO/orbsvcs/orbsvcs/Log/Hash_LogRecordStore.cpp832
-rw-r--r--TAO/orbsvcs/orbsvcs/Log/Hash_LogRecordStore.h399
-rw-r--r--TAO/orbsvcs/orbsvcs/Log/Hash_LogStore.cpp269
-rw-r--r--TAO/orbsvcs/orbsvcs/Log/Hash_LogStore.h130
-rw-r--r--TAO/orbsvcs/orbsvcs/Log/Hash_Persistence_Strategy.cpp25
-rw-r--r--TAO/orbsvcs/orbsvcs/Log/Hash_Persistence_Strategy.h59
-rw-r--r--TAO/orbsvcs/orbsvcs/Log/Iterator_i.cpp73
-rw-r--r--TAO/orbsvcs/orbsvcs/Log/Iterator_i.h91
-rw-r--r--TAO/orbsvcs/orbsvcs/Log/LogActivator.cpp58
-rw-r--r--TAO/orbsvcs/orbsvcs/Log/LogActivator.h78
-rw-r--r--TAO/orbsvcs/orbsvcs/Log/LogMgr_i.cpp296
-rw-r--r--TAO/orbsvcs/orbsvcs/Log/LogMgr_i.h202
-rw-r--r--TAO/orbsvcs/orbsvcs/Log/LogNotification.cpp418
-rw-r--r--TAO/orbsvcs/orbsvcs/Log/LogNotification.h185
-rw-r--r--TAO/orbsvcs/orbsvcs/Log/LogRecordStore.cpp17
-rw-r--r--TAO/orbsvcs/orbsvcs/Log/LogRecordStore.h269
-rw-r--r--TAO/orbsvcs/orbsvcs/Log/LogStore.h108
-rw-r--r--TAO/orbsvcs/orbsvcs/Log/Log_Compaction_Handler.cpp66
-rw-r--r--TAO/orbsvcs/orbsvcs/Log/Log_Compaction_Handler.h66
-rw-r--r--TAO/orbsvcs/orbsvcs/Log/Log_Constraint_Interpreter.cpp49
-rw-r--r--TAO/orbsvcs/orbsvcs/Log/Log_Constraint_Interpreter.h70
-rw-r--r--TAO/orbsvcs/orbsvcs/Log/Log_Constraint_Visitors.cpp1347
-rw-r--r--TAO/orbsvcs/orbsvcs/Log/Log_Constraint_Visitors.h130
-rw-r--r--TAO/orbsvcs/orbsvcs/Log/Log_Flush_Handler.cpp59
-rw-r--r--TAO/orbsvcs/orbsvcs/Log/Log_Flush_Handler.h66
-rw-r--r--TAO/orbsvcs/orbsvcs/Log/Log_Persistence_Strategy.h61
-rw-r--r--TAO/orbsvcs/orbsvcs/Log/Log_i.cpp1859
-rw-r--r--TAO/orbsvcs/orbsvcs/Log/Log_i.h509
-rw-r--r--TAO/orbsvcs/orbsvcs/Log/NotifyLogConsumer.cpp144
-rw-r--r--TAO/orbsvcs/orbsvcs/Log/NotifyLogConsumer.h117
-rw-r--r--TAO/orbsvcs/orbsvcs/Log/NotifyLogFactory_i.cpp462
-rw-r--r--TAO/orbsvcs/orbsvcs/Log/NotifyLogFactory_i.h281
-rw-r--r--TAO/orbsvcs/orbsvcs/Log/NotifyLogNotification.cpp88
-rw-r--r--TAO/orbsvcs/orbsvcs/Log/NotifyLogNotification.h108
-rw-r--r--TAO/orbsvcs/orbsvcs/Log/NotifyLog_i.cpp371
-rw-r--r--TAO/orbsvcs/orbsvcs/Log/NotifyLog_i.h240
-rw-r--r--TAO/orbsvcs/orbsvcs/Log/RTEventLogConsumer.cpp68
-rw-r--r--TAO/orbsvcs/orbsvcs/Log/RTEventLogConsumer.h95
-rw-r--r--TAO/orbsvcs/orbsvcs/Log/RTEventLogFactory_i.cpp242
-rw-r--r--TAO/orbsvcs/orbsvcs/Log/RTEventLogFactory_i.h141
-rw-r--r--TAO/orbsvcs/orbsvcs/Log/RTEventLogNotification.cpp90
-rw-r--r--TAO/orbsvcs/orbsvcs/Log/RTEventLogNotification.h93
-rw-r--r--TAO/orbsvcs/orbsvcs/Log/RTEventLog_i.cpp166
-rw-r--r--TAO/orbsvcs/orbsvcs/Log/RTEventLog_i.h138
-rw-r--r--TAO/orbsvcs/orbsvcs/Log/eventlog_export.h37
-rw-r--r--TAO/orbsvcs/orbsvcs/Log/eventlog_serv_export.h37
-rw-r--r--TAO/orbsvcs/orbsvcs/Log/eventlog_skel_export.h37
-rw-r--r--TAO/orbsvcs/orbsvcs/Log/log_export.h39
-rw-r--r--TAO/orbsvcs/orbsvcs/Log/log_serv_export.h39
-rw-r--r--TAO/orbsvcs/orbsvcs/Log/log_skel_export.h41
-rw-r--r--TAO/orbsvcs/orbsvcs/Log/notifylog_export.h37
-rw-r--r--TAO/orbsvcs/orbsvcs/Log/notifylog_serv_export.h37
-rw-r--r--TAO/orbsvcs/orbsvcs/Log/notifylog_skel_export.h37
-rw-r--r--TAO/orbsvcs/orbsvcs/Log/rteventlog_export.h37
-rw-r--r--TAO/orbsvcs/orbsvcs/Log/rteventlog_serv_export.h37
-rw-r--r--TAO/orbsvcs/orbsvcs/Log/rteventlog_skel_export.h37
-rw-r--r--TAO/orbsvcs/orbsvcs/Makefile.am6166
-rw-r--r--TAO/orbsvcs/orbsvcs/Metrics.idl331
-rw-r--r--TAO/orbsvcs/orbsvcs/Metrics/Metrics_FrameManager.cpp14
-rw-r--r--TAO/orbsvcs/orbsvcs/Metrics/Metrics_FrameManager.h37
-rw-r--r--TAO/orbsvcs/orbsvcs/Metrics/Metrics_FrameManager.i9
-rw-r--r--TAO/orbsvcs/orbsvcs/Metrics/Metrics_FrameManager_T.cpp14
-rw-r--r--TAO/orbsvcs/orbsvcs/Metrics/Metrics_FrameManager_T.h277
-rw-r--r--TAO/orbsvcs/orbsvcs/Metrics/Metrics_FrameManager_T.i821
-rw-r--r--TAO/orbsvcs/orbsvcs/Metrics/Metrics_LocalCache.cpp12
-rw-r--r--TAO/orbsvcs/orbsvcs/Metrics/Metrics_LocalCache.h115
-rw-r--r--TAO/orbsvcs/orbsvcs/Metrics/Metrics_LocalCache.i10
-rw-r--r--TAO/orbsvcs/orbsvcs/Metrics/Metrics_LocalCache_T.cpp488
-rw-r--r--TAO/orbsvcs/orbsvcs/Metrics/Metrics_LocalCache_T.h329
-rw-r--r--TAO/orbsvcs/orbsvcs/Metrics/Metrics_Logger.cpp871
-rw-r--r--TAO/orbsvcs/orbsvcs/Metrics/Metrics_Logger.h224
-rw-r--r--TAO/orbsvcs/orbsvcs/Metrics/Metrics_UpcallMonitor.cpp23
-rw-r--r--TAO/orbsvcs/orbsvcs/Metrics/Metrics_UpcallMonitor.h264
-rw-r--r--TAO/orbsvcs/orbsvcs/Metrics/Metrics_UpcallMonitor.i381
-rw-r--r--TAO/orbsvcs/orbsvcs/Metrics/Metrics_UpcallMonitor_T.cpp28
-rw-r--r--TAO/orbsvcs/orbsvcs/Metrics/Metrics_UpcallMonitor_T.h164
-rw-r--r--TAO/orbsvcs/orbsvcs/Metrics/Metrics_UpcallMonitor_T.i263
-rw-r--r--TAO/orbsvcs/orbsvcs/Metrics/Metrics_Utils.cpp534
-rw-r--r--TAO/orbsvcs/orbsvcs/Metrics/Metrics_Utils.h187
-rw-r--r--TAO/orbsvcs/orbsvcs/Metrics/Metrics_Utils.i39
-rw-r--r--TAO/orbsvcs/orbsvcs/Metrics/metrics_export.h50
-rw-r--r--TAO/orbsvcs/orbsvcs/Naming/Bindings_Iterator_T.cpp232
-rw-r--r--TAO/orbsvcs/orbsvcs/Naming/Bindings_Iterator_T.h145
-rw-r--r--TAO/orbsvcs/orbsvcs/Naming/Entries.cpp127
-rw-r--r--TAO/orbsvcs/orbsvcs/Naming/Entries.h139
-rw-r--r--TAO/orbsvcs/orbsvcs/Naming/Flat_File_Persistence.cpp361
-rw-r--r--TAO/orbsvcs/orbsvcs/Naming/Flat_File_Persistence.h95
-rw-r--r--TAO/orbsvcs/orbsvcs/Naming/Hash_Naming_Context.cpp680
-rw-r--r--TAO/orbsvcs/orbsvcs/Naming/Hash_Naming_Context.h280
-rw-r--r--TAO/orbsvcs/orbsvcs/Naming/Naming_Client.cpp67
-rw-r--r--TAO/orbsvcs/orbsvcs/Naming/Naming_Client.h78
-rw-r--r--TAO/orbsvcs/orbsvcs/Naming/Naming_Context_Interface.cpp539
-rw-r--r--TAO/orbsvcs/orbsvcs/Naming/Naming_Context_Interface.h422
-rw-r--r--TAO/orbsvcs/orbsvcs/Naming/Naming_Loader.cpp98
-rw-r--r--TAO/orbsvcs/orbsvcs/Naming/Naming_Loader.h71
-rw-r--r--TAO/orbsvcs/orbsvcs/Naming/Naming_Server.cpp768
-rw-r--r--TAO/orbsvcs/orbsvcs/Naming/Naming_Server.h239
-rw-r--r--TAO/orbsvcs/orbsvcs/Naming/Naming_Service_Container.cpp392
-rw-r--r--TAO/orbsvcs/orbsvcs/Naming/Naming_Service_Container.h234
-rw-r--r--TAO/orbsvcs/orbsvcs/Naming/Persistent_Context_Index.cpp310
-rw-r--r--TAO/orbsvcs/orbsvcs/Naming/Persistent_Context_Index.h171
-rw-r--r--TAO/orbsvcs/orbsvcs/Naming/Persistent_Entries.cpp208
-rw-r--r--TAO/orbsvcs/orbsvcs/Naming/Persistent_Entries.h233
-rw-r--r--TAO/orbsvcs/orbsvcs/Naming/Persistent_Naming_Context.cpp541
-rw-r--r--TAO/orbsvcs/orbsvcs/Naming/Persistent_Naming_Context.h273
-rw-r--r--TAO/orbsvcs/orbsvcs/Naming/README69
-rw-r--r--TAO/orbsvcs/orbsvcs/Naming/Storable.cpp25
-rw-r--r--TAO/orbsvcs/orbsvcs/Naming/Storable.h165
-rw-r--r--TAO/orbsvcs/orbsvcs/Naming/Storable.inl170
-rw-r--r--TAO/orbsvcs/orbsvcs/Naming/Storable_Naming_Context.cpp1584
-rw-r--r--TAO/orbsvcs/orbsvcs/Naming/Storable_Naming_Context.h474
-rw-r--r--TAO/orbsvcs/orbsvcs/Naming/Storable_Naming_Context_Activator.cpp125
-rw-r--r--TAO/orbsvcs/orbsvcs/Naming/Storable_Naming_Context_Activator.h91
-rw-r--r--TAO/orbsvcs/orbsvcs/Naming/Transient_Naming_Context.cpp344
-rw-r--r--TAO/orbsvcs/orbsvcs/Naming/Transient_Naming_Context.h204
-rw-r--r--TAO/orbsvcs/orbsvcs/Naming/naming_export.h40
-rw-r--r--TAO/orbsvcs/orbsvcs/Naming/naming_serv_export.h40
-rw-r--r--TAO/orbsvcs/orbsvcs/Naming/naming_skel_export.h40
-rw-r--r--TAO/orbsvcs/orbsvcs/Naming/nsconf.h45
-rw-r--r--TAO/orbsvcs/orbsvcs/Notify/Admin.cpp222
-rw-r--r--TAO/orbsvcs/orbsvcs/Notify/Admin.h126
-rw-r--r--TAO/orbsvcs/orbsvcs/Notify/Admin.inl54
-rw-r--r--TAO/orbsvcs/orbsvcs/Notify/AdminProperties.cpp94
-rw-r--r--TAO/orbsvcs/orbsvcs/Notify/AdminProperties.h133
-rw-r--r--TAO/orbsvcs/orbsvcs/Notify/AdminProperties.inl85
-rw-r--r--TAO/orbsvcs/orbsvcs/Notify/AllocTracker.h81
-rw-r--r--TAO/orbsvcs/orbsvcs/Notify/Any/AnyEvent.cpp140
-rw-r--r--TAO/orbsvcs/orbsvcs/Notify/Any/AnyEvent.h121
-rw-r--r--TAO/orbsvcs/orbsvcs/Notify/Any/CosEC_ProxyPushConsumer.cpp90
-rw-r--r--TAO/orbsvcs/orbsvcs/Notify/Any/CosEC_ProxyPushConsumer.h86
-rw-r--r--TAO/orbsvcs/orbsvcs/Notify/Any/CosEC_ProxyPushSupplier.cpp65
-rw-r--r--TAO/orbsvcs/orbsvcs/Notify/Any/CosEC_ProxyPushSupplier.h89
-rw-r--r--TAO/orbsvcs/orbsvcs/Notify/Any/ProxyPushConsumer.cpp134
-rw-r--r--TAO/orbsvcs/orbsvcs/Notify/Any/ProxyPushConsumer.h96
-rw-r--r--TAO/orbsvcs/orbsvcs/Notify/Any/ProxyPushSupplier.cpp110
-rw-r--r--TAO/orbsvcs/orbsvcs/Notify/Any/ProxyPushSupplier.h98
-rw-r--r--TAO/orbsvcs/orbsvcs/Notify/Any/PushConsumer.cpp118
-rw-r--r--TAO/orbsvcs/orbsvcs/Notify/Any/PushConsumer.h78
-rw-r--r--TAO/orbsvcs/orbsvcs/Notify/Any/PushSupplier.cpp65
-rw-r--r--TAO/orbsvcs/orbsvcs/Notify/Any/PushSupplier.h63
-rw-r--r--TAO/orbsvcs/orbsvcs/Notify/Bit_Vector.cpp114
-rw-r--r--TAO/orbsvcs/orbsvcs/Notify/Bit_Vector.h81
-rw-r--r--TAO/orbsvcs/orbsvcs/Notify/Buffering_Strategy.cpp266
-rw-r--r--TAO/orbsvcs/orbsvcs/Notify/Buffering_Strategy.h121
-rw-r--r--TAO/orbsvcs/orbsvcs/Notify/Builder.cpp592
-rw-r--r--TAO/orbsvcs/orbsvcs/Notify/Builder.h175
-rw-r--r--TAO/orbsvcs/orbsvcs/Notify/Consumer.cpp702
-rw-r--r--TAO/orbsvcs/orbsvcs/Notify/Consumer.h195
-rw-r--r--TAO/orbsvcs/orbsvcs/Notify/Consumer.inl27
-rw-r--r--TAO/orbsvcs/orbsvcs/Notify/ConsumerAdmin.cpp488
-rw-r--r--TAO/orbsvcs/orbsvcs/Notify/ConsumerAdmin.h254
-rw-r--r--TAO/orbsvcs/orbsvcs/Notify/Consumer_Map.h43
-rw-r--r--TAO/orbsvcs/orbsvcs/Notify/Container_T.cpp65
-rw-r--r--TAO/orbsvcs/orbsvcs/Notify/Container_T.h82
-rw-r--r--TAO/orbsvcs/orbsvcs/Notify/Container_T.inl13
-rw-r--r--TAO/orbsvcs/orbsvcs/Notify/CosNotify_Initializer.cpp17
-rw-r--r--TAO/orbsvcs/orbsvcs/Notify/CosNotify_Initializer.h44
-rw-r--r--TAO/orbsvcs/orbsvcs/Notify/CosNotify_Service.cpp314
-rw-r--r--TAO/orbsvcs/orbsvcs/Notify/CosNotify_Service.h95
-rw-r--r--TAO/orbsvcs/orbsvcs/Notify/Default_Factory.cpp197
-rw-r--r--TAO/orbsvcs/orbsvcs/Notify/Default_Factory.h101
-rw-r--r--TAO/orbsvcs/orbsvcs/Notify/Delivery_Request.cpp103
-rw-r--r--TAO/orbsvcs/orbsvcs/Notify/Delivery_Request.h135
-rw-r--r--TAO/orbsvcs/orbsvcs/Notify/Delivery_Request.inl27
-rw-r--r--TAO/orbsvcs/orbsvcs/Notify/ETCL_Filter.cpp448
-rw-r--r--TAO/orbsvcs/orbsvcs/Notify/ETCL_Filter.h175
-rw-r--r--TAO/orbsvcs/orbsvcs/Notify/ETCL_FilterFactory.cpp81
-rw-r--r--TAO/orbsvcs/orbsvcs/Notify/ETCL_FilterFactory.h94
-rw-r--r--TAO/orbsvcs/orbsvcs/Notify/Event.cpp84
-rw-r--r--TAO/orbsvcs/orbsvcs/Notify/Event.h139
-rw-r--r--TAO/orbsvcs/orbsvcs/Notify/Event.inl43
-rw-r--r--TAO/orbsvcs/orbsvcs/Notify/EventChannel.cpp685
-rw-r--r--TAO/orbsvcs/orbsvcs/Notify/EventChannel.h254
-rw-r--r--TAO/orbsvcs/orbsvcs/Notify/EventChannelFactory.cpp564
-rw-r--r--TAO/orbsvcs/orbsvcs/Notify/EventChannelFactory.h207
-rw-r--r--TAO/orbsvcs/orbsvcs/Notify/EventType.cpp180
-rw-r--r--TAO/orbsvcs/orbsvcs/Notify/EventType.h107
-rw-r--r--TAO/orbsvcs/orbsvcs/Notify/EventType.inl19
-rw-r--r--TAO/orbsvcs/orbsvcs/Notify/EventTypeSeq.cpp317
-rw-r--r--TAO/orbsvcs/orbsvcs/Notify/EventTypeSeq.h88
-rw-r--r--TAO/orbsvcs/orbsvcs/Notify/Event_Manager.cpp309
-rw-r--r--TAO/orbsvcs/orbsvcs/Notify/Event_Manager.h136
-rw-r--r--TAO/orbsvcs/orbsvcs/Notify/Event_Map_Entry_T.cpp58
-rw-r--r--TAO/orbsvcs/orbsvcs/Notify/Event_Map_Entry_T.h101
-rw-r--r--TAO/orbsvcs/orbsvcs/Notify/Event_Map_Entry_T.inl31
-rw-r--r--TAO/orbsvcs/orbsvcs/Notify/Event_Map_T.cpp166
-rw-r--r--TAO/orbsvcs/orbsvcs/Notify/Event_Map_T.h123
-rw-r--r--TAO/orbsvcs/orbsvcs/Notify/Event_Map_T.inl56
-rw-r--r--TAO/orbsvcs/orbsvcs/Notify/Event_Persistence_Factory.cpp13
-rw-r--r--TAO/orbsvcs/orbsvcs/Notify/Event_Persistence_Factory.h54
-rw-r--r--TAO/orbsvcs/orbsvcs/Notify/Event_Persistence_Strategy.h51
-rw-r--r--TAO/orbsvcs/orbsvcs/Notify/Factory.h136
-rw-r--r--TAO/orbsvcs/orbsvcs/Notify/FilterAdmin.cpp204
-rw-r--r--TAO/orbsvcs/orbsvcs/Notify/FilterAdmin.h117
-rw-r--r--TAO/orbsvcs/orbsvcs/Notify/FilterAdmin.inl39
-rw-r--r--TAO/orbsvcs/orbsvcs/Notify/FilterFactory.h49
-rw-r--r--TAO/orbsvcs/orbsvcs/Notify/Find_Worker_T.cpp49
-rw-r--r--TAO/orbsvcs/orbsvcs/Notify/Find_Worker_T.h77
-rw-r--r--TAO/orbsvcs/orbsvcs/Notify/Find_Worker_T.inl14
-rw-r--r--TAO/orbsvcs/orbsvcs/Notify/ID_Factory.cpp22
-rw-r--r--TAO/orbsvcs/orbsvcs/Notify/ID_Factory.h62
-rw-r--r--TAO/orbsvcs/orbsvcs/Notify/ID_Factory.inl24
-rw-r--r--TAO/orbsvcs/orbsvcs/Notify/Method_Request.cpp62
-rw-r--r--TAO/orbsvcs/orbsvcs/Notify/Method_Request.h75
-rw-r--r--TAO/orbsvcs/orbsvcs/Notify/Method_Request_Dispatch.cpp304
-rw-r--r--TAO/orbsvcs/orbsvcs/Notify/Method_Request_Dispatch.h170
-rw-r--r--TAO/orbsvcs/orbsvcs/Notify/Method_Request_Event.cpp102
-rw-r--r--TAO/orbsvcs/orbsvcs/Notify/Method_Request_Event.h104
-rw-r--r--TAO/orbsvcs/orbsvcs/Notify/Method_Request_Lookup.cpp233
-rw-r--r--TAO/orbsvcs/orbsvcs/Notify/Method_Request_Lookup.h140
-rw-r--r--TAO/orbsvcs/orbsvcs/Notify/Method_Request_Shutdown.cpp35
-rw-r--r--TAO/orbsvcs/orbsvcs/Notify/Method_Request_Shutdown.h58
-rw-r--r--TAO/orbsvcs/orbsvcs/Notify/Method_Request_Updates.cpp59
-rw-r--r--TAO/orbsvcs/orbsvcs/Notify/Method_Request_Updates.h90
-rw-r--r--TAO/orbsvcs/orbsvcs/Notify/Method_Request_Updates_T.cpp28
-rw-r--r--TAO/orbsvcs/orbsvcs/Notify/Method_Request_Updates_T.h81
-rw-r--r--TAO/orbsvcs/orbsvcs/Notify/Method_Request_Updates_T.inl36
-rw-r--r--TAO/orbsvcs/orbsvcs/Notify/Name_Value_Pair.cpp216
-rw-r--r--TAO/orbsvcs/orbsvcs/Notify/Name_Value_Pair.h102
-rw-r--r--TAO/orbsvcs/orbsvcs/Notify/Notify_Constraint_Interpreter.cpp49
-rw-r--r--TAO/orbsvcs/orbsvcs/Notify/Notify_Constraint_Interpreter.h65
-rw-r--r--TAO/orbsvcs/orbsvcs/Notify/Notify_Constraint_Visitors.cpp1465
-rw-r--r--TAO/orbsvcs/orbsvcs/Notify/Notify_Constraint_Visitors.h168
-rw-r--r--TAO/orbsvcs/orbsvcs/Notify/Notify_Default_CO_Factory.cpp17
-rw-r--r--TAO/orbsvcs/orbsvcs/Notify/Notify_Default_CO_Factory.h48
-rw-r--r--TAO/orbsvcs/orbsvcs/Notify/Notify_Default_Collection_Factory.cpp17
-rw-r--r--TAO/orbsvcs/orbsvcs/Notify/Notify_Default_Collection_Factory.h47
-rw-r--r--TAO/orbsvcs/orbsvcs/Notify/Notify_Default_EMO_Factory.cpp17
-rw-r--r--TAO/orbsvcs/orbsvcs/Notify/Notify_Default_EMO_Factory.h45
-rw-r--r--TAO/orbsvcs/orbsvcs/Notify/Notify_Default_POA_Factory.cpp17
-rw-r--r--TAO/orbsvcs/orbsvcs/Notify/Notify_Default_POA_Factory.h44
-rw-r--r--TAO/orbsvcs/orbsvcs/Notify/Notify_EventChannelFactory_i.cpp41
-rw-r--r--TAO/orbsvcs/orbsvcs/Notify/Notify_EventChannelFactory_i.h44
-rw-r--r--TAO/orbsvcs/orbsvcs/Notify/Notify_Extensions.cpp12
-rw-r--r--TAO/orbsvcs/orbsvcs/Notify/Notify_Extensions.h33
-rw-r--r--TAO/orbsvcs/orbsvcs/Notify/Object.cpp372
-rw-r--r--TAO/orbsvcs/orbsvcs/Notify/Object.h221
-rw-r--r--TAO/orbsvcs/orbsvcs/Notify/Object.inl97
-rw-r--r--TAO/orbsvcs/orbsvcs/Notify/POA_Helper.cpp218
-rw-r--r--TAO/orbsvcs/orbsvcs/Notify/POA_Helper.h115
-rw-r--r--TAO/orbsvcs/orbsvcs/Notify/POA_Helper.inl13
-rw-r--r--TAO/orbsvcs/orbsvcs/Notify/Peer.cpp125
-rw-r--r--TAO/orbsvcs/orbsvcs/Notify/Peer.h85
-rw-r--r--TAO/orbsvcs/orbsvcs/Notify/Persistent_File_Allocator.cpp400
-rw-r--r--TAO/orbsvcs/orbsvcs/Notify/Persistent_File_Allocator.h208
-rw-r--r--TAO/orbsvcs/orbsvcs/Notify/Properties.cpp44
-rw-r--r--TAO/orbsvcs/orbsvcs/Notify/Properties.h155
-rw-r--r--TAO/orbsvcs/orbsvcs/Notify/Properties.inl151
-rw-r--r--TAO/orbsvcs/orbsvcs/Notify/Property.h49
-rw-r--r--TAO/orbsvcs/orbsvcs/Notify/PropertySeq.cpp65
-rw-r--r--TAO/orbsvcs/orbsvcs/Notify/PropertySeq.h77
-rw-r--r--TAO/orbsvcs/orbsvcs/Notify/PropertySeq.inl22
-rw-r--r--TAO/orbsvcs/orbsvcs/Notify/Property_Boolean.cpp47
-rw-r--r--TAO/orbsvcs/orbsvcs/Notify/Property_Boolean.h89
-rw-r--r--TAO/orbsvcs/orbsvcs/Notify/Property_Boolean.inl62
-rw-r--r--TAO/orbsvcs/orbsvcs/Notify/Property_T.cpp137
-rw-r--r--TAO/orbsvcs/orbsvcs/Notify/Property_T.h170
-rw-r--r--TAO/orbsvcs/orbsvcs/Notify/Property_T.inl77
-rw-r--r--TAO/orbsvcs/orbsvcs/Notify/Proxy.cpp199
-rw-r--r--TAO/orbsvcs/orbsvcs/Notify/Proxy.h139
-rw-r--r--TAO/orbsvcs/orbsvcs/Notify/Proxy.inl40
-rw-r--r--TAO/orbsvcs/orbsvcs/Notify/ProxyConsumer.cpp204
-rw-r--r--TAO/orbsvcs/orbsvcs/Notify/ProxyConsumer.h105
-rw-r--r--TAO/orbsvcs/orbsvcs/Notify/ProxyConsumer.inl26
-rw-r--r--TAO/orbsvcs/orbsvcs/Notify/ProxyConsumer_T.cpp84
-rw-r--r--TAO/orbsvcs/orbsvcs/Notify/ProxyConsumer_T.h86
-rw-r--r--TAO/orbsvcs/orbsvcs/Notify/ProxySupplier.cpp166
-rw-r--r--TAO/orbsvcs/orbsvcs/Notify/ProxySupplier.h101
-rw-r--r--TAO/orbsvcs/orbsvcs/Notify/ProxySupplier.inl26
-rw-r--r--TAO/orbsvcs/orbsvcs/Notify/ProxySupplier_T.cpp227
-rw-r--r--TAO/orbsvcs/orbsvcs/Notify/ProxySupplier_T.h161
-rw-r--r--TAO/orbsvcs/orbsvcs/Notify/Proxy_T.cpp165
-rw-r--r--TAO/orbsvcs/orbsvcs/Notify/Proxy_T.h161
-rw-r--r--TAO/orbsvcs/orbsvcs/Notify/QoSProperties.cpp218
-rw-r--r--TAO/orbsvcs/orbsvcs/Notify/QoSProperties.h120
-rw-r--r--TAO/orbsvcs/orbsvcs/Notify/QoSProperties.inl163
-rw-r--r--TAO/orbsvcs/orbsvcs/Notify/README51
-rw-r--r--TAO/orbsvcs/orbsvcs/Notify/RT_Builder.cpp73
-rw-r--r--TAO/orbsvcs/orbsvcs/Notify/RT_Builder.h50
-rw-r--r--TAO/orbsvcs/orbsvcs/Notify/RT_Factory.cpp131
-rw-r--r--TAO/orbsvcs/orbsvcs/Notify/RT_Factory.h100
-rw-r--r--TAO/orbsvcs/orbsvcs/Notify/RT_Notify_Service.cpp98
-rw-r--r--TAO/orbsvcs/orbsvcs/Notify/RT_Notify_Service.h61
-rw-r--r--TAO/orbsvcs/orbsvcs/Notify/RT_POA_Helper.cpp166
-rw-r--r--TAO/orbsvcs/orbsvcs/Notify/RT_POA_Helper.h63
-rw-r--r--TAO/orbsvcs/orbsvcs/Notify/RT_Properties.cpp22
-rw-r--r--TAO/orbsvcs/orbsvcs/Notify/RT_Properties.h68
-rw-r--r--TAO/orbsvcs/orbsvcs/Notify/RT_Properties.inl31
-rw-r--r--TAO/orbsvcs/orbsvcs/Notify/Random_File.cpp161
-rw-r--r--TAO/orbsvcs/orbsvcs/Notify/Random_File.h94
-rw-r--r--TAO/orbsvcs/orbsvcs/Notify/Reactive_Task.cpp59
-rw-r--r--TAO/orbsvcs/orbsvcs/Notify/Reactive_Task.h77
-rw-r--r--TAO/orbsvcs/orbsvcs/Notify/Reactive_Task.inl13
-rw-r--r--TAO/orbsvcs/orbsvcs/Notify/Reconnect_Worker_T.cpp41
-rw-r--r--TAO/orbsvcs/orbsvcs/Notify/Reconnect_Worker_T.h54
-rw-r--r--TAO/orbsvcs/orbsvcs/Notify/Reconnection_Registry.cpp257
-rw-r--r--TAO/orbsvcs/orbsvcs/Notify/Reconnection_Registry.h100
-rw-r--r--TAO/orbsvcs/orbsvcs/Notify/Refcountable.cpp252
-rw-r--r--TAO/orbsvcs/orbsvcs/Notify/Refcountable.h99
-rw-r--r--TAO/orbsvcs/orbsvcs/Notify/Refcountable_Guard_T.cpp14
-rw-r--r--TAO/orbsvcs/orbsvcs/Notify/Refcountable_Guard_T.h89
-rw-r--r--TAO/orbsvcs/orbsvcs/Notify/Refcountable_Guard_T.inl91
-rw-r--r--TAO/orbsvcs/orbsvcs/Notify/Routing_Slip.cpp933
-rw-r--r--TAO/orbsvcs/orbsvcs/Notify/Routing_Slip.h242
-rw-r--r--TAO/orbsvcs/orbsvcs/Notify/Routing_Slip_Persistence_Manager.cpp804
-rw-r--r--TAO/orbsvcs/orbsvcs/Notify/Routing_Slip_Persistence_Manager.h267
-rw-r--r--TAO/orbsvcs/orbsvcs/Notify/Routing_Slip_Queue.cpp112
-rw-r--r--TAO/orbsvcs/orbsvcs/Notify/Routing_Slip_Queue.h93
-rw-r--r--TAO/orbsvcs/orbsvcs/Notify/Save_Persist_Worker_T.cpp47
-rw-r--r--TAO/orbsvcs/orbsvcs/Notify/Save_Persist_Worker_T.h63
-rw-r--r--TAO/orbsvcs/orbsvcs/Notify/Seq_Worker_T.cpp38
-rw-r--r--TAO/orbsvcs/orbsvcs/Notify/Seq_Worker_T.h72
-rw-r--r--TAO/orbsvcs/orbsvcs/Notify/Seq_Worker_T.inl15
-rw-r--r--TAO/orbsvcs/orbsvcs/Notify/Sequence/SequenceProxyPushConsumer.cpp139
-rw-r--r--TAO/orbsvcs/orbsvcs/Notify/Sequence/SequenceProxyPushConsumer.h102
-rw-r--r--TAO/orbsvcs/orbsvcs/Notify/Sequence/SequenceProxyPushSupplier.cpp108
-rw-r--r--TAO/orbsvcs/orbsvcs/Notify/Sequence/SequenceProxyPushSupplier.h99
-rw-r--r--TAO/orbsvcs/orbsvcs/Notify/Sequence/SequencePushConsumer.cpp297
-rw-r--r--TAO/orbsvcs/orbsvcs/Notify/Sequence/SequencePushConsumer.h94
-rw-r--r--TAO/orbsvcs/orbsvcs/Notify/Sequence/SequencePushSupplier.cpp56
-rw-r--r--TAO/orbsvcs/orbsvcs/Notify/Sequence/SequencePushSupplier.h61
-rw-r--r--TAO/orbsvcs/orbsvcs/Notify/Service.cpp15
-rw-r--r--TAO/orbsvcs/orbsvcs/Notify/Service.h84
-rw-r--r--TAO/orbsvcs/orbsvcs/Notify/Standard_Event_Persistence.cpp234
-rw-r--r--TAO/orbsvcs/orbsvcs/Notify/Standard_Event_Persistence.h134
-rw-r--r--TAO/orbsvcs/orbsvcs/Notify/Structured/RT_StructuredProxyPushSupplier.cpp81
-rw-r--r--TAO/orbsvcs/orbsvcs/Notify/Structured/RT_StructuredProxyPushSupplier.h63
-rw-r--r--TAO/orbsvcs/orbsvcs/Notify/Structured/StructuredEvent.cpp142
-rw-r--r--TAO/orbsvcs/orbsvcs/Notify/Structured/StructuredEvent.h112
-rw-r--r--TAO/orbsvcs/orbsvcs/Notify/Structured/StructuredProxyPushConsumer.cpp135
-rw-r--r--TAO/orbsvcs/orbsvcs/Notify/Structured/StructuredProxyPushConsumer.h105
-rw-r--r--TAO/orbsvcs/orbsvcs/Notify/Structured/StructuredProxyPushSupplier.cpp111
-rw-r--r--TAO/orbsvcs/orbsvcs/Notify/Structured/StructuredProxyPushSupplier.h103
-rw-r--r--TAO/orbsvcs/orbsvcs/Notify/Structured/StructuredPushConsumer.cpp101
-rw-r--r--TAO/orbsvcs/orbsvcs/Notify/Structured/StructuredPushConsumer.h81
-rw-r--r--TAO/orbsvcs/orbsvcs/Notify/Structured/StructuredPushSupplier.cpp55
-rw-r--r--TAO/orbsvcs/orbsvcs/Notify/Structured/StructuredPushSupplier.h62
-rw-r--r--TAO/orbsvcs/orbsvcs/Notify/Subscription_Change_Worker.cpp29
-rw-r--r--TAO/orbsvcs/orbsvcs/Notify/Subscription_Change_Worker.h54
-rw-r--r--TAO/orbsvcs/orbsvcs/Notify/Supplier.cpp41
-rw-r--r--TAO/orbsvcs/orbsvcs/Notify/Supplier.h70
-rw-r--r--TAO/orbsvcs/orbsvcs/Notify/Supplier.inl13
-rw-r--r--TAO/orbsvcs/orbsvcs/Notify/SupplierAdmin.cpp430
-rw-r--r--TAO/orbsvcs/orbsvcs/Notify/SupplierAdmin.h219
-rw-r--r--TAO/orbsvcs/orbsvcs/Notify/Supplier_Map.h37
-rw-r--r--TAO/orbsvcs/orbsvcs/Notify/ThreadPool_Task.cpp200
-rw-r--r--TAO/orbsvcs/orbsvcs/Notify/ThreadPool_Task.h98
-rw-r--r--TAO/orbsvcs/orbsvcs/Notify/Timer.h56
-rw-r--r--TAO/orbsvcs/orbsvcs/Notify/Timer_Queue.cpp48
-rw-r--r--TAO/orbsvcs/orbsvcs/Notify/Timer_Queue.h70
-rw-r--r--TAO/orbsvcs/orbsvcs/Notify/Timer_Reactor.cpp50
-rw-r--r--TAO/orbsvcs/orbsvcs/Notify/Timer_Reactor.h66
-rw-r--r--TAO/orbsvcs/orbsvcs/Notify/Topology_Factory.h54
-rw-r--r--TAO/orbsvcs/orbsvcs/Notify/Topology_Loader.cpp20
-rw-r--r--TAO/orbsvcs/orbsvcs/Notify/Topology_Loader.h84
-rw-r--r--TAO/orbsvcs/orbsvcs/Notify/Topology_Object.cpp151
-rw-r--r--TAO/orbsvcs/orbsvcs/Notify/Topology_Object.h213
-rw-r--r--TAO/orbsvcs/orbsvcs/Notify/Topology_Object.inl26
-rw-r--r--TAO/orbsvcs/orbsvcs/Notify/Topology_Saver.cpp16
-rw-r--r--TAO/orbsvcs/orbsvcs/Notify/Topology_Saver.h114
-rw-r--r--TAO/orbsvcs/orbsvcs/Notify/Worker_Task.cpp22
-rw-r--r--TAO/orbsvcs/orbsvcs/Notify/Worker_Task.h71
-rw-r--r--TAO/orbsvcs/orbsvcs/Notify/XML_Loader.cpp234
-rw-r--r--TAO/orbsvcs/orbsvcs/Notify/XML_Loader.h87
-rw-r--r--TAO/orbsvcs/orbsvcs/Notify/XML_Saver.cpp203
-rw-r--r--TAO/orbsvcs/orbsvcs/Notify/XML_Saver.h87
-rw-r--r--TAO/orbsvcs/orbsvcs/Notify/XML_Topology_Factory.cpp162
-rw-r--r--TAO/orbsvcs/orbsvcs/Notify/XML_Topology_Factory.h85
-rw-r--r--TAO/orbsvcs/orbsvcs/Notify/notify_export.h40
-rw-r--r--TAO/orbsvcs/orbsvcs/Notify/notify_persist_export.h60
-rw-r--r--TAO/orbsvcs/orbsvcs/Notify/notify_serv_export.h40
-rw-r--r--TAO/orbsvcs/orbsvcs/Notify/notify_skel_export.h40
-rw-r--r--TAO/orbsvcs/orbsvcs/Notify/rt_notify_export.h39
-rw-r--r--TAO/orbsvcs/orbsvcs/NotifyExt.idl184
-rw-r--r--TAO/orbsvcs/orbsvcs/Null_MediaCtrl.idl5
-rw-r--r--TAO/orbsvcs/orbsvcs/PortableGroup.idl323
-rw-r--r--TAO/orbsvcs/orbsvcs/PortableGroup.mpc40
-rw-r--r--TAO/orbsvcs/orbsvcs/PortableGroup.rc30
-rw-r--r--TAO/orbsvcs/orbsvcs/PortableGroup/GOA.cpp711
-rw-r--r--TAO/orbsvcs/orbsvcs/PortableGroup/GOA.h329
-rw-r--r--TAO/orbsvcs/orbsvcs/PortableGroup/MIOP.cpp29
-rw-r--r--TAO/orbsvcs/orbsvcs/PortableGroup/MIOP.h45
-rw-r--r--TAO/orbsvcs/orbsvcs/PortableGroup/PG_Default_Property_Validator.cpp151
-rw-r--r--TAO/orbsvcs/orbsvcs/PortableGroup/PG_Default_Property_Validator.h86
-rw-r--r--TAO/orbsvcs/orbsvcs/PortableGroup/PG_FactoryRegistry.cpp733
-rw-r--r--TAO/orbsvcs/orbsvcs/PortableGroup/PG_FactoryRegistry.h263
-rw-r--r--TAO/orbsvcs/orbsvcs/PortableGroup/PG_Factory_Map.h46
-rw-r--r--TAO/orbsvcs/orbsvcs/PortableGroup/PG_Factory_Set.h58
-rw-r--r--TAO/orbsvcs/orbsvcs/PortableGroup/PG_GenericFactory.cpp780
-rw-r--r--TAO/orbsvcs/orbsvcs/PortableGroup/PG_GenericFactory.h248
-rw-r--r--TAO/orbsvcs/orbsvcs/PortableGroup/PG_Group_Factory.cpp232
-rw-r--r--TAO/orbsvcs/orbsvcs/PortableGroup/PG_Group_Factory.h184
-rw-r--r--TAO/orbsvcs/orbsvcs/PortableGroup/PG_Group_Guard.cpp59
-rw-r--r--TAO/orbsvcs/orbsvcs/PortableGroup/PG_Group_Guard.h93
-rw-r--r--TAO/orbsvcs/orbsvcs/PortableGroup/PG_Location_Equal_To.cpp11
-rw-r--r--TAO/orbsvcs/orbsvcs/PortableGroup/PG_Location_Equal_To.h59
-rw-r--r--TAO/orbsvcs/orbsvcs/PortableGroup/PG_Location_Equal_To.inl15
-rw-r--r--TAO/orbsvcs/orbsvcs/PortableGroup/PG_Location_Hash.cpp13
-rw-r--r--TAO/orbsvcs/orbsvcs/PortableGroup/PG_Location_Hash.h53
-rw-r--r--TAO/orbsvcs/orbsvcs/PortableGroup/PG_Location_Hash.inl25
-rw-r--r--TAO/orbsvcs/orbsvcs/PortableGroup/PG_Location_Map.h54
-rw-r--r--TAO/orbsvcs/orbsvcs/PortableGroup/PG_MemberInfo.cpp18
-rw-r--r--TAO/orbsvcs/orbsvcs/PortableGroup/PG_MemberInfo.h62
-rw-r--r--TAO/orbsvcs/orbsvcs/PortableGroup/PG_Null_Property_Validator.cpp30
-rw-r--r--TAO/orbsvcs/orbsvcs/PortableGroup/PG_Null_Property_Validator.h67
-rw-r--r--TAO/orbsvcs/orbsvcs/PortableGroup/PG_ObjectGroupManager.cpp871
-rw-r--r--TAO/orbsvcs/orbsvcs/PortableGroup/PG_ObjectGroupManager.h314
-rw-r--r--TAO/orbsvcs/orbsvcs/PortableGroup/PG_ObjectGroup_Map.h84
-rw-r--r--TAO/orbsvcs/orbsvcs/PortableGroup/PG_Object_Adapter_Factory.cpp48
-rw-r--r--TAO/orbsvcs/orbsvcs/PortableGroup/PG_Object_Adapter_Factory.h47
-rw-r--r--TAO/orbsvcs/orbsvcs/PortableGroup/PG_Object_Group.cpp896
-rw-r--r--TAO/orbsvcs/orbsvcs/PortableGroup/PG_Object_Group.h382
-rw-r--r--TAO/orbsvcs/orbsvcs/PortableGroup/PG_Object_Group_Manipulator.cpp190
-rw-r--r--TAO/orbsvcs/orbsvcs/PortableGroup/PG_Object_Group_Manipulator.h123
-rw-r--r--TAO/orbsvcs/orbsvcs/PortableGroup/PG_Operators.cpp33
-rw-r--r--TAO/orbsvcs/orbsvcs/PortableGroup/PG_Operators.h50
-rw-r--r--TAO/orbsvcs/orbsvcs/PortableGroup/PG_Properties_Encoder.cpp67
-rw-r--r--TAO/orbsvcs/orbsvcs/PortableGroup/PG_Properties_Encoder.h101
-rw-r--r--TAO/orbsvcs/orbsvcs/PortableGroup/PG_Properties_Encoder.inl64
-rw-r--r--TAO/orbsvcs/orbsvcs/PortableGroup/PG_Properties_Support.cpp151
-rw-r--r--TAO/orbsvcs/orbsvcs/PortableGroup/PG_Properties_Support.h214
-rw-r--r--TAO/orbsvcs/orbsvcs/PortableGroup/PG_PropertyManager.cpp368
-rw-r--r--TAO/orbsvcs/orbsvcs/PortableGroup/PG_PropertyManager.h192
-rw-r--r--TAO/orbsvcs/orbsvcs/PortableGroup/PG_Property_Set.cpp360
-rw-r--r--TAO/orbsvcs/orbsvcs/PortableGroup/PG_Property_Set.h200
-rw-r--r--TAO/orbsvcs/orbsvcs/PortableGroup/PG_Property_Set_Find.h55
-rw-r--r--TAO/orbsvcs/orbsvcs/PortableGroup/PG_Property_Utils.cpp82
-rw-r--r--TAO/orbsvcs/orbsvcs/PortableGroup/PG_Property_Utils.h57
-rw-r--r--TAO/orbsvcs/orbsvcs/PortableGroup/PG_Servant_Dispatcher.cpp70
-rw-r--r--TAO/orbsvcs/orbsvcs/PortableGroup/PG_Servant_Dispatcher.h72
-rw-r--r--TAO/orbsvcs/orbsvcs/PortableGroup/PG_Utils.cpp176
-rw-r--r--TAO/orbsvcs/orbsvcs/PortableGroup/PG_Utils.h59
-rw-r--r--TAO/orbsvcs/orbsvcs/PortableGroup/PG_conf.h64
-rw-r--r--TAO/orbsvcs/orbsvcs/PortableGroup/PortableGroup_Acceptor_Registry.cpp191
-rw-r--r--TAO/orbsvcs/orbsvcs/PortableGroup/PortableGroup_Acceptor_Registry.h117
-rw-r--r--TAO/orbsvcs/orbsvcs/PortableGroup/PortableGroup_Loader.cpp83
-rw-r--r--TAO/orbsvcs/orbsvcs/PortableGroup/PortableGroup_Loader.h68
-rw-r--r--TAO/orbsvcs/orbsvcs/PortableGroup/PortableGroup_ORBInitializer.cpp71
-rw-r--r--TAO/orbsvcs/orbsvcs/PortableGroup/PortableGroup_ORBInitializer.h61
-rw-r--r--TAO/orbsvcs/orbsvcs/PortableGroup/PortableGroup_Request_Dispatcher.cpp61
-rw-r--r--TAO/orbsvcs/orbsvcs/PortableGroup/PortableGroup_Request_Dispatcher.h70
-rw-r--r--TAO/orbsvcs/orbsvcs/PortableGroup/Portable_Group_Map.cpp180
-rw-r--r--TAO/orbsvcs/orbsvcs/PortableGroup/Portable_Group_Map.h139
-rw-r--r--TAO/orbsvcs/orbsvcs/PortableGroup/README43
-rw-r--r--TAO/orbsvcs/orbsvcs/PortableGroup/UIPMC_Acceptor.cpp354
-rw-r--r--TAO/orbsvcs/orbsvcs/PortableGroup/UIPMC_Acceptor.h160
-rw-r--r--TAO/orbsvcs/orbsvcs/PortableGroup/UIPMC_Acceptor.i29
-rw-r--r--TAO/orbsvcs/orbsvcs/PortableGroup/UIPMC_Connection_Handler.cpp267
-rw-r--r--TAO/orbsvcs/orbsvcs/PortableGroup/UIPMC_Connection_Handler.h149
-rw-r--r--TAO/orbsvcs/orbsvcs/PortableGroup/UIPMC_Connector.cpp215
-rw-r--r--TAO/orbsvcs/orbsvcs/PortableGroup/UIPMC_Connector.h99
-rw-r--r--TAO/orbsvcs/orbsvcs/PortableGroup/UIPMC_Endpoint.cpp150
-rw-r--r--TAO/orbsvcs/orbsvcs/PortableGroup/UIPMC_Endpoint.h129
-rw-r--r--TAO/orbsvcs/orbsvcs/PortableGroup/UIPMC_Endpoint.i52
-rw-r--r--TAO/orbsvcs/orbsvcs/PortableGroup/UIPMC_Factory.cpp99
-rw-r--r--TAO/orbsvcs/orbsvcs/PortableGroup/UIPMC_Factory.h72
-rw-r--r--TAO/orbsvcs/orbsvcs/PortableGroup/UIPMC_Message_Block_Data_Iterator.cpp89
-rw-r--r--TAO/orbsvcs/orbsvcs/PortableGroup/UIPMC_Message_Block_Data_Iterator.h70
-rw-r--r--TAO/orbsvcs/orbsvcs/PortableGroup/UIPMC_Profile.cpp800
-rw-r--r--TAO/orbsvcs/orbsvcs/PortableGroup/UIPMC_Profile.h165
-rw-r--r--TAO/orbsvcs/orbsvcs/PortableGroup/UIPMC_Transport.cpp613
-rw-r--r--TAO/orbsvcs/orbsvcs/PortableGroup/UIPMC_Transport.h131
-rw-r--r--TAO/orbsvcs/orbsvcs/PortableGroup/UIPMC_Wait_Never.cpp53
-rw-r--r--TAO/orbsvcs/orbsvcs/PortableGroup/UIPMC_Wait_Never.h58
-rw-r--r--TAO/orbsvcs/orbsvcs/PortableGroup/miopconf.h41
-rw-r--r--TAO/orbsvcs/orbsvcs/PortableGroup/portablegroup_export.h40
-rw-r--r--TAO/orbsvcs/orbsvcs/PortableGroup_Simple_DS.idl41
-rw-r--r--TAO/orbsvcs/orbsvcs/Property/CosPropertyService_i.cpp1888
-rw-r--r--TAO/orbsvcs/orbsvcs/Property/CosPropertyService_i.h621
-rw-r--r--TAO/orbsvcs/orbsvcs/Property/property_export.h40
-rw-r--r--TAO/orbsvcs/orbsvcs/Property/property_serv_export.h40
-rw-r--r--TAO/orbsvcs/orbsvcs/Property/property_skel_export.h40
-rw-r--r--TAO/orbsvcs/orbsvcs/RTCORBAEvent.mpc27
-rw-r--r--TAO/orbsvcs/orbsvcs/RTCosScheduling.idl107
-rw-r--r--TAO/orbsvcs/orbsvcs/RTCosScheduling.mpc24
-rw-r--r--TAO/orbsvcs/orbsvcs/RTCosScheduling/RTCosScheduling_ClientScheduler_i.cpp524
-rw-r--r--TAO/orbsvcs/orbsvcs/RTCosScheduling/RTCosScheduling_ClientScheduler_i.h218
-rw-r--r--TAO/orbsvcs/orbsvcs/RTCosScheduling/RTCosScheduling_PCP_Manager.cpp519
-rw-r--r--TAO/orbsvcs/orbsvcs/RTCosScheduling/RTCosScheduling_PCP_Manager.h316
-rw-r--r--TAO/orbsvcs/orbsvcs/RTCosScheduling/RTCosScheduling_PCP_Manager.i98
-rw-r--r--TAO/orbsvcs/orbsvcs/RTCosScheduling/RTCosScheduling_ServerScheduler_i.cpp766
-rw-r--r--TAO/orbsvcs/orbsvcs/RTCosScheduling/RTCosScheduling_ServerScheduler_i.h316
-rw-r--r--TAO/orbsvcs/orbsvcs/RTCosScheduling/RTCosScheduling_ServerScheduler_i.i39
-rw-r--r--TAO/orbsvcs/orbsvcs/RTCosScheduling/RTCosScheduling_export.h60
-rw-r--r--TAO/orbsvcs/orbsvcs/RTEvent.mpc55
-rw-r--r--TAO/orbsvcs/orbsvcs/RTEvent.rc30
-rw-r--r--TAO/orbsvcs/orbsvcs/RTEventLogAdmin.idl56
-rw-r--r--TAO/orbsvcs/orbsvcs/RTEventLogAdmin.mpc107
-rw-r--r--TAO/orbsvcs/orbsvcs/RTEvent_Serv.mpc99
-rw-r--r--TAO/orbsvcs/orbsvcs/RTEvent_Serv.rc30
-rw-r--r--TAO/orbsvcs/orbsvcs/RTEvent_Skel.mpc44
-rw-r--r--TAO/orbsvcs/orbsvcs/RTEvent_Skel.rc30
-rw-r--r--TAO/orbsvcs/orbsvcs/RTKokyuEvent.mpc24
-rw-r--r--TAO/orbsvcs/orbsvcs/RTSched.mpc32
-rw-r--r--TAO/orbsvcs/orbsvcs/RTSched.rc30
-rw-r--r--TAO/orbsvcs/orbsvcs/RTSchedEvent.mpc25
-rw-r--r--TAO/orbsvcs/orbsvcs/RTSchedEvent.rc30
-rw-r--r--TAO/orbsvcs/orbsvcs/RT_Notification.mpc26
-rw-r--r--TAO/orbsvcs/orbsvcs/RT_Notification.rc30
-rw-r--r--TAO/orbsvcs/orbsvcs/RtecBase.idl92
-rw-r--r--TAO/orbsvcs/orbsvcs/RtecDefaultEventData.idl78
-rw-r--r--TAO/orbsvcs/orbsvcs/RtecEventChannelAdmin.idl393
-rw-r--r--TAO/orbsvcs/orbsvcs/RtecEventComm.idl175
-rw-r--r--TAO/orbsvcs/orbsvcs/RtecScheduler.idl496
-rw-r--r--TAO/orbsvcs/orbsvcs/RtecUDPAdmin.idl61
-rw-r--r--TAO/orbsvcs/orbsvcs/Runtime_Scheduler.cpp594
-rw-r--r--TAO/orbsvcs/orbsvcs/Runtime_Scheduler.h288
-rw-r--r--TAO/orbsvcs/orbsvcs/SL3CSI.idl353
-rw-r--r--TAO/orbsvcs/orbsvcs/SL3TCPIP.idl203
-rw-r--r--TAO/orbsvcs/orbsvcs/SL3TLS.idl350
-rw-r--r--TAO/orbsvcs/orbsvcs/SSLIOP.idl98
-rw-r--r--TAO/orbsvcs/orbsvcs/SSLIOP.mpc29
-rw-r--r--TAO/orbsvcs/orbsvcs/SSLIOP.rc30
-rw-r--r--TAO/orbsvcs/orbsvcs/SSLIOP/IIOP_SSL_Acceptor.cpp39
-rw-r--r--TAO/orbsvcs/orbsvcs/SSLIOP/IIOP_SSL_Acceptor.h86
-rw-r--r--TAO/orbsvcs/orbsvcs/SSLIOP/IIOP_SSL_Connection_Handler.cpp90
-rw-r--r--TAO/orbsvcs/orbsvcs/SSLIOP/IIOP_SSL_Connection_Handler.h122
-rw-r--r--TAO/orbsvcs/orbsvcs/SSLIOP/IIOP_SSL_Connection_Handler.inl33
-rw-r--r--TAO/orbsvcs/orbsvcs/SSLIOP/IIOP_SSL_Connector.cpp288
-rw-r--r--TAO/orbsvcs/orbsvcs/SSLIOP/IIOP_SSL_Connector.h104
-rw-r--r--TAO/orbsvcs/orbsvcs/SSLIOP/IIOP_SSL_Transport.cpp54
-rw-r--r--TAO/orbsvcs/orbsvcs/SSLIOP/IIOP_SSL_Transport.h90
-rw-r--r--TAO/orbsvcs/orbsvcs/SSLIOP/SSLIOP_Accept_Strategy.cpp66
-rw-r--r--TAO/orbsvcs/orbsvcs/SSLIOP/SSLIOP_Accept_Strategy.h98
-rw-r--r--TAO/orbsvcs/orbsvcs/SSLIOP/SSLIOP_Acceptor.cpp684
-rw-r--r--TAO/orbsvcs/orbsvcs/SSLIOP/SSLIOP_Acceptor.h169
-rw-r--r--TAO/orbsvcs/orbsvcs/SSLIOP/SSLIOP_Acceptor.i14
-rw-r--r--TAO/orbsvcs/orbsvcs/SSLIOP/SSLIOP_ClientCredentials.cpp142
-rw-r--r--TAO/orbsvcs/orbsvcs/SSLIOP/SSLIOP_ClientCredentials.h153
-rw-r--r--TAO/orbsvcs/orbsvcs/SSLIOP/SSLIOP_Connection_Handler.cpp445
-rw-r--r--TAO/orbsvcs/orbsvcs/SSLIOP/SSLIOP_Connection_Handler.h202
-rw-r--r--TAO/orbsvcs/orbsvcs/SSLIOP/SSLIOP_Connection_Handler.i29
-rw-r--r--TAO/orbsvcs/orbsvcs/SSLIOP/SSLIOP_Connector.cpp862
-rw-r--r--TAO/orbsvcs/orbsvcs/SSLIOP/SSLIOP_Connector.h162
-rw-r--r--TAO/orbsvcs/orbsvcs/SSLIOP/SSLIOP_Credentials.cpp267
-rw-r--r--TAO/orbsvcs/orbsvcs/SSLIOP/SSLIOP_Credentials.h186
-rw-r--r--TAO/orbsvcs/orbsvcs/SSLIOP/SSLIOP_Credentials.inl21
-rw-r--r--TAO/orbsvcs/orbsvcs/SSLIOP/SSLIOP_CredentialsAcquirer.cpp388
-rw-r--r--TAO/orbsvcs/orbsvcs/SSLIOP/SSLIOP_CredentialsAcquirer.h154
-rw-r--r--TAO/orbsvcs/orbsvcs/SSLIOP/SSLIOP_CredentialsAcquirerFactory.cpp30
-rw-r--r--TAO/orbsvcs/orbsvcs/SSLIOP/SSLIOP_CredentialsAcquirerFactory.h65
-rw-r--r--TAO/orbsvcs/orbsvcs/SSLIOP/SSLIOP_Current.cpp197
-rw-r--r--TAO/orbsvcs/orbsvcs/SSLIOP/SSLIOP_Current.h177
-rw-r--r--TAO/orbsvcs/orbsvcs/SSLIOP/SSLIOP_Current.inl40
-rw-r--r--TAO/orbsvcs/orbsvcs/SSLIOP/SSLIOP_Current_Impl.cpp128
-rw-r--r--TAO/orbsvcs/orbsvcs/SSLIOP/SSLIOP_Current_Impl.h113
-rw-r--r--TAO/orbsvcs/orbsvcs/SSLIOP/SSLIOP_Current_Impl.inl26
-rw-r--r--TAO/orbsvcs/orbsvcs/SSLIOP/SSLIOP_EVP_PKEY.cpp76
-rw-r--r--TAO/orbsvcs/orbsvcs/SSLIOP/SSLIOP_EVP_PKEY.h79
-rw-r--r--TAO/orbsvcs/orbsvcs/SSLIOP/SSLIOP_Endpoint.cpp382
-rw-r--r--TAO/orbsvcs/orbsvcs/SSLIOP/SSLIOP_Endpoint.h256
-rw-r--r--TAO/orbsvcs/orbsvcs/SSLIOP/SSLIOP_Endpoint.i70
-rw-r--r--TAO/orbsvcs/orbsvcs/SSLIOP/SSLIOP_Export.h40
-rw-r--r--TAO/orbsvcs/orbsvcs/SSLIOP/SSLIOP_Factory.cpp614
-rw-r--r--TAO/orbsvcs/orbsvcs/SSLIOP/SSLIOP_Factory.h141
-rw-r--r--TAO/orbsvcs/orbsvcs/SSLIOP/SSLIOP_Invocation_Interceptor.cpp175
-rw-r--r--TAO/orbsvcs/orbsvcs/SSLIOP/SSLIOP_Invocation_Interceptor.h148
-rw-r--r--TAO/orbsvcs/orbsvcs/SSLIOP/SSLIOP_ORBInitializer.cpp248
-rw-r--r--TAO/orbsvcs/orbsvcs/SSLIOP/SSLIOP_ORBInitializer.h100
-rw-r--r--TAO/orbsvcs/orbsvcs/SSLIOP/SSLIOP_OpenSSL_st_T.cpp17
-rw-r--r--TAO/orbsvcs/orbsvcs/SSLIOP/SSLIOP_OpenSSL_st_T.h139
-rw-r--r--TAO/orbsvcs/orbsvcs/SSLIOP/SSLIOP_OpenSSL_st_T.inl165
-rw-r--r--TAO/orbsvcs/orbsvcs/SSLIOP/SSLIOP_OwnCredentials.cpp77
-rw-r--r--TAO/orbsvcs/orbsvcs/SSLIOP/SSLIOP_OwnCredentials.h121
-rw-r--r--TAO/orbsvcs/orbsvcs/SSLIOP/SSLIOP_Profile.cpp357
-rw-r--r--TAO/orbsvcs/orbsvcs/SSLIOP/SSLIOP_Profile.h179
-rw-r--r--TAO/orbsvcs/orbsvcs/SSLIOP/SSLIOP_SSL.h85
-rw-r--r--TAO/orbsvcs/orbsvcs/SSLIOP/SSLIOP_TargetCredentials.cpp134
-rw-r--r--TAO/orbsvcs/orbsvcs/SSLIOP/SSLIOP_TargetCredentials.h129
-rw-r--r--TAO/orbsvcs/orbsvcs/SSLIOP/SSLIOP_Transport.cpp385
-rw-r--r--TAO/orbsvcs/orbsvcs/SSLIOP/SSLIOP_Transport.h159
-rw-r--r--TAO/orbsvcs/orbsvcs/SSLIOP/SSLIOP_Util.cpp58
-rw-r--r--TAO/orbsvcs/orbsvcs/SSLIOP/SSLIOP_Util.h65
-rw-r--r--TAO/orbsvcs/orbsvcs/SSLIOP/SSLIOP_X509.h84
-rw-r--r--TAO/orbsvcs/orbsvcs/SSLIOP/params_dup.c19
-rw-r--r--TAO/orbsvcs/orbsvcs/SSLIOP/params_dup.h44
-rw-r--r--TAO/orbsvcs/orbsvcs/SSLIOP/ssl_endpoints.pidl33
-rw-r--r--TAO/orbsvcs/orbsvcs/SSLIOP/ssl_endpointsC.cpp165
-rw-r--r--TAO/orbsvcs/orbsvcs/SSLIOP/ssl_endpointsC.h158
-rw-r--r--TAO/orbsvcs/orbsvcs/Sched/Config_Scheduler.cpp674
-rw-r--r--TAO/orbsvcs/orbsvcs/Sched/Config_Scheduler.h318
-rw-r--r--TAO/orbsvcs/orbsvcs/Sched/DynSched.cpp2423
-rw-r--r--TAO/orbsvcs/orbsvcs/Sched/DynSched.h544
-rw-r--r--TAO/orbsvcs/orbsvcs/Sched/DynSched.i113
-rw-r--r--TAO/orbsvcs/orbsvcs/Sched/Reconfig_Sched_Utils.cpp1808
-rw-r--r--TAO/orbsvcs/orbsvcs/Sched/Reconfig_Sched_Utils.h669
-rw-r--r--TAO/orbsvcs/orbsvcs/Sched/Reconfig_Sched_Utils_T.cpp1085
-rw-r--r--TAO/orbsvcs/orbsvcs/Sched/Reconfig_Sched_Utils_T.h490
-rw-r--r--TAO/orbsvcs/orbsvcs/Sched/Reconfig_Scheduler.h38
-rw-r--r--TAO/orbsvcs/orbsvcs/Sched/Reconfig_Scheduler_T.cpp3218
-rw-r--r--TAO/orbsvcs/orbsvcs/Sched/Reconfig_Scheduler_T.h777
-rw-r--r--TAO/orbsvcs/orbsvcs/Sched/SchedEntry.cpp938
-rw-r--r--TAO/orbsvcs/orbsvcs/Sched/SchedEntry.h648
-rw-r--r--TAO/orbsvcs/orbsvcs/Sched/SchedEntry.i447
-rw-r--r--TAO/orbsvcs/orbsvcs/Sched/Scheduler.cpp271
-rw-r--r--TAO/orbsvcs/orbsvcs/Sched/Scheduler.h300
-rw-r--r--TAO/orbsvcs/orbsvcs/Sched/Scheduler_Generic.cpp269
-rw-r--r--TAO/orbsvcs/orbsvcs/Sched/Scheduler_Generic.h140
-rw-r--r--TAO/orbsvcs/orbsvcs/Sched/Strategy_Scheduler.cpp1394
-rw-r--r--TAO/orbsvcs/orbsvcs/Sched/Strategy_Scheduler.h505
-rw-r--r--TAO/orbsvcs/orbsvcs/Sched/sched_export.h40
-rw-r--r--TAO/orbsvcs/orbsvcs/Scheduler_Factory.cpp795
-rw-r--r--TAO/orbsvcs/orbsvcs/Scheduler_Factory.h280
-rw-r--r--TAO/orbsvcs/orbsvcs/Scheduler_Factory.i21
-rw-r--r--TAO/orbsvcs/orbsvcs/Scheduler_Utilities.cpp12
-rw-r--r--TAO/orbsvcs/orbsvcs/Scheduler_Utilities.h68
-rw-r--r--TAO/orbsvcs/orbsvcs/Scheduler_Utilities.i40
-rw-r--r--TAO/orbsvcs/orbsvcs/Security.idl358
-rw-r--r--TAO/orbsvcs/orbsvcs/Security.mpc42
-rw-r--r--TAO/orbsvcs/orbsvcs/Security.rc30
-rw-r--r--TAO/orbsvcs/orbsvcs/Security/CSI_Utils.cpp69
-rw-r--r--TAO/orbsvcs/orbsvcs/Security/CSI_Utils.h56
-rw-r--r--TAO/orbsvcs/orbsvcs/Security/SL2_EstablishTrustPolicy.cpp63
-rw-r--r--TAO/orbsvcs/orbsvcs/Security/SL2_EstablishTrustPolicy.h106
-rw-r--r--TAO/orbsvcs/orbsvcs/Security/SL2_QOPPolicy.cpp61
-rw-r--r--TAO/orbsvcs/orbsvcs/Security/SL2_QOPPolicy.h103
-rw-r--r--TAO/orbsvcs/orbsvcs/Security/SL3_ContextEstablishmentPolicy.cpp126
-rw-r--r--TAO/orbsvcs/orbsvcs/Security/SL3_ContextEstablishmentPolicy.h134
-rw-r--r--TAO/orbsvcs/orbsvcs/Security/SL3_CredentialsAcquirerFactory.cpp14
-rw-r--r--TAO/orbsvcs/orbsvcs/Security/SL3_CredentialsAcquirerFactory.h68
-rw-r--r--TAO/orbsvcs/orbsvcs/Security/SL3_CredentialsCurator.cpp284
-rw-r--r--TAO/orbsvcs/orbsvcs/Security/SL3_CredentialsCurator.h176
-rw-r--r--TAO/orbsvcs/orbsvcs/Security/SL3_ObjectCredentialsPolicy.cpp65
-rw-r--r--TAO/orbsvcs/orbsvcs/Security/SL3_ObjectCredentialsPolicy.h110
-rw-r--r--TAO/orbsvcs/orbsvcs/Security/SL3_PolicyFactory.cpp63
-rw-r--r--TAO/orbsvcs/orbsvcs/Security/SL3_PolicyFactory.h82
-rw-r--r--TAO/orbsvcs/orbsvcs/Security/SL3_SecurityCurrent.cpp60
-rw-r--r--TAO/orbsvcs/orbsvcs/Security/SL3_SecurityCurrent.h152
-rw-r--r--TAO/orbsvcs/orbsvcs/Security/SL3_SecurityCurrent.inl26
-rw-r--r--TAO/orbsvcs/orbsvcs/Security/SL3_SecurityCurrent_Impl.cpp16
-rw-r--r--TAO/orbsvcs/orbsvcs/Security/SL3_SecurityCurrent_Impl.h85
-rw-r--r--TAO/orbsvcs/orbsvcs/Security/SL3_SecurityManager.cpp84
-rw-r--r--TAO/orbsvcs/orbsvcs/Security/SL3_SecurityManager.h119
-rw-r--r--TAO/orbsvcs/orbsvcs/Security/Security_Current.cpp97
-rw-r--r--TAO/orbsvcs/orbsvcs/Security/Security_Current.h149
-rw-r--r--TAO/orbsvcs/orbsvcs/Security/Security_Current.inl26
-rw-r--r--TAO/orbsvcs/orbsvcs/Security/Security_Current_Impl.cpp15
-rw-r--r--TAO/orbsvcs/orbsvcs/Security/Security_Current_Impl.h95
-rw-r--r--TAO/orbsvcs/orbsvcs/Security/Security_ORBInitializer.cpp240
-rw-r--r--TAO/orbsvcs/orbsvcs/Security/Security_ORBInitializer.h106
-rw-r--r--TAO/orbsvcs/orbsvcs/Security/Security_PolicyFactory.cpp159
-rw-r--r--TAO/orbsvcs/orbsvcs/Security/Security_PolicyFactory.h73
-rw-r--r--TAO/orbsvcs/orbsvcs/Security/security_export.h40
-rw-r--r--TAO/orbsvcs/orbsvcs/SecurityAdmin.idl143
-rw-r--r--TAO/orbsvcs/orbsvcs/SecurityLevel1.idl31
-rw-r--r--TAO/orbsvcs/orbsvcs/SecurityLevel2.idl274
-rw-r--r--TAO/orbsvcs/orbsvcs/SecurityLevel3.idl2037
-rw-r--r--TAO/orbsvcs/orbsvcs/SecurityReplaceable.idl237
-rw-r--r--TAO/orbsvcs/orbsvcs/Shutdown_Utilities.cpp97
-rw-r--r--TAO/orbsvcs/orbsvcs/Shutdown_Utilities.h71
-rw-r--r--TAO/orbsvcs/orbsvcs/Svc_Utils.mpc34
-rw-r--r--TAO/orbsvcs/orbsvcs/Svc_Utils.rc30
-rw-r--r--TAO/orbsvcs/orbsvcs/TAO_CosConcurrency.pc.in11
-rw-r--r--TAO/orbsvcs/orbsvcs/TAO_CosConcurrency_Serv.pc.in11
-rw-r--r--TAO/orbsvcs/orbsvcs/TAO_CosConcurrency_Skel.pc.in11
-rw-r--r--TAO/orbsvcs/orbsvcs/TAO_CosEvent.pc.in11
-rw-r--r--TAO/orbsvcs/orbsvcs/TAO_CosEvent_Serv.pc.in11
-rw-r--r--TAO/orbsvcs/orbsvcs/TAO_CosEvent_Skel.pc.in11
-rw-r--r--TAO/orbsvcs/orbsvcs/TAO_CosLifeCycle.pc.in11
-rw-r--r--TAO/orbsvcs/orbsvcs/TAO_CosLoadBalancing.pc.in11
-rw-r--r--TAO/orbsvcs/orbsvcs/TAO_CosNaming.pc.in11
-rw-r--r--TAO/orbsvcs/orbsvcs/TAO_CosNaming_Serv.pc.in11
-rw-r--r--TAO/orbsvcs/orbsvcs/TAO_CosNaming_Skel.pc.in11
-rw-r--r--TAO/orbsvcs/orbsvcs/TAO_CosNotification.pc.in11
-rw-r--r--TAO/orbsvcs/orbsvcs/TAO_CosNotification_Serv.pc.in11
-rw-r--r--TAO/orbsvcs/orbsvcs/TAO_CosNotification_Skel.pc.in11
-rw-r--r--TAO/orbsvcs/orbsvcs/TAO_CosProperty.pc.in11
-rw-r--r--TAO/orbsvcs/orbsvcs/TAO_CosProperty_Serv.pc.in11
-rw-r--r--TAO/orbsvcs/orbsvcs/TAO_CosProperty_Skel.pc.in11
-rw-r--r--TAO/orbsvcs/orbsvcs/TAO_CosTime.pc.in11
-rw-r--r--TAO/orbsvcs/orbsvcs/TAO_CosTrading.pc.in11
-rw-r--r--TAO/orbsvcs/orbsvcs/TAO_CosTrading_Serv.pc.in11
-rw-r--r--TAO/orbsvcs/orbsvcs/TAO_CosTrading_Skel.pc.in11
-rw-r--r--TAO/orbsvcs/orbsvcs/TAO_DsEventLogAdmin.pc.in11
-rw-r--r--TAO/orbsvcs/orbsvcs/TAO_DsEventLogAdmin_Serv.pc.in11
-rw-r--r--TAO/orbsvcs/orbsvcs/TAO_DsEventLogAdmin_Skel.pc.in11
-rw-r--r--TAO/orbsvcs/orbsvcs/TAO_DsLogAdmin.pc.in11
-rw-r--r--TAO/orbsvcs/orbsvcs/TAO_DsLogAdmin_Serv.pc.in11
-rw-r--r--TAO/orbsvcs/orbsvcs/TAO_DsLogAdmin_Skel.pc.in11
-rw-r--r--TAO/orbsvcs/orbsvcs/TAO_DsNotifyLogAdmin.pc.in11
-rw-r--r--TAO/orbsvcs/orbsvcs/TAO_DsNotifyLogAdmin_Serv.pc.in11
-rw-r--r--TAO/orbsvcs/orbsvcs/TAO_DsNotifyLogAdmin_Skel.pc.in11
-rw-r--r--TAO/orbsvcs/orbsvcs/TAO_ETCL.pc.in11
-rw-r--r--TAO/orbsvcs/orbsvcs/TAO_FTORB_Utils.pc.in11
-rw-r--r--TAO/orbsvcs/orbsvcs/TAO_FT_ClientORB.pc.in11
-rw-r--r--TAO/orbsvcs/orbsvcs/TAO_FT_ServerORB.pc.in11
-rw-r--r--TAO/orbsvcs/orbsvcs/TAO_FaultTolerance.pc.in11
-rw-r--r--TAO/orbsvcs/orbsvcs/TAO_PortableGroup.pc.in11
-rw-r--r--TAO/orbsvcs/orbsvcs/TAO_RTEvent.pc.in11
-rw-r--r--TAO/orbsvcs/orbsvcs/TAO_RTEventLogAdmin.pc.in11
-rw-r--r--TAO/orbsvcs/orbsvcs/TAO_RTEventLogAdmin_Serv.pc.in11
-rw-r--r--TAO/orbsvcs/orbsvcs/TAO_RTEventLogAdmin_Skel.pc.in11
-rw-r--r--TAO/orbsvcs/orbsvcs/TAO_RTEvent_Serv.pc.in11
-rw-r--r--TAO/orbsvcs/orbsvcs/TAO_RTEvent_Skel.pc.in11
-rw-r--r--TAO/orbsvcs/orbsvcs/TAO_Svc_Utils.pc.in11
-rw-r--r--TAO/orbsvcs/orbsvcs/Time/TAO_TIO.cpp288
-rw-r--r--TAO/orbsvcs/orbsvcs/Time/TAO_TIO.h95
-rw-r--r--TAO/orbsvcs/orbsvcs/Time/TAO_Time_Service_Clerk.cpp181
-rw-r--r--TAO/orbsvcs/orbsvcs/Time/TAO_Time_Service_Clerk.h141
-rw-r--r--TAO/orbsvcs/orbsvcs/Time/TAO_Time_Service_Server.cpp127
-rw-r--r--TAO/orbsvcs/orbsvcs/Time/TAO_Time_Service_Server.h87
-rw-r--r--TAO/orbsvcs/orbsvcs/Time/TAO_UTO.cpp246
-rw-r--r--TAO/orbsvcs/orbsvcs/Time/TAO_UTO.h119
-rw-r--r--TAO/orbsvcs/orbsvcs/Time/Timer_Helper.cpp156
-rw-r--r--TAO/orbsvcs/orbsvcs/Time/Timer_Helper.h80
-rw-r--r--TAO/orbsvcs/orbsvcs/Time/time_export.h40
-rw-r--r--TAO/orbsvcs/orbsvcs/TimeBase.idl16
-rw-r--r--TAO/orbsvcs/orbsvcs/TimeService.idl179
-rw-r--r--TAO/orbsvcs/orbsvcs/Time_Utilities.cpp22
-rw-r--r--TAO/orbsvcs/orbsvcs/Time_Utilities.h111
-rw-r--r--TAO/orbsvcs/orbsvcs/Time_Utilities.i103
-rw-r--r--TAO/orbsvcs/orbsvcs/Trader/Constraint_Interpreter.cpp255
-rw-r--r--TAO/orbsvcs/orbsvcs/Trader/Constraint_Interpreter.h166
-rw-r--r--TAO/orbsvcs/orbsvcs/Trader/Constraint_Nodes.cpp930
-rw-r--r--TAO/orbsvcs/orbsvcs/Trader/Constraint_Nodes.h358
-rw-r--r--TAO/orbsvcs/orbsvcs/Trader/Constraint_Tokens.h49
-rw-r--r--TAO/orbsvcs/orbsvcs/Trader/Constraint_Visitors.cpp1204
-rw-r--r--TAO/orbsvcs/orbsvcs/Trader/Constraint_Visitors.h449
-rw-r--r--TAO/orbsvcs/orbsvcs/Trader/Constraint_l.cpp1790
-rw-r--r--TAO/orbsvcs/orbsvcs/Trader/Constraint_y.cpp900
-rw-r--r--TAO/orbsvcs/orbsvcs/Trader/Interpreter.cpp101
-rw-r--r--TAO/orbsvcs/orbsvcs/Trader/Interpreter.h107
-rw-r--r--TAO/orbsvcs/orbsvcs/Trader/Interpreter_Utils.cpp56
-rw-r--r--TAO/orbsvcs/orbsvcs/Trader/Interpreter_Utils.h100
-rw-r--r--TAO/orbsvcs/orbsvcs/Trader/Interpreter_Utils_T.cpp52
-rw-r--r--TAO/orbsvcs/orbsvcs/Trader/Interpreter_Utils_T.h23
-rw-r--r--TAO/orbsvcs/orbsvcs/Trader/Locking.h46
-rw-r--r--TAO/orbsvcs/orbsvcs/Trader/Offer_Database.cpp389
-rw-r--r--TAO/orbsvcs/orbsvcs/Trader/Offer_Database.h211
-rw-r--r--TAO/orbsvcs/orbsvcs/Trader/Offer_Iterators.cpp322
-rw-r--r--TAO/orbsvcs/orbsvcs/Trader/Offer_Iterators.h298
-rw-r--r--TAO/orbsvcs/orbsvcs/Trader/Offer_Iterators_T.cpp97
-rw-r--r--TAO/orbsvcs/orbsvcs/Trader/Offer_Iterators_T.h96
-rw-r--r--TAO/orbsvcs/orbsvcs/Trader/Service_Type_Repository.cpp695
-rw-r--r--TAO/orbsvcs/orbsvcs/Trader/Service_Type_Repository.h327
-rw-r--r--TAO/orbsvcs/orbsvcs/Trader/Trader.cpp866
-rw-r--r--TAO/orbsvcs/orbsvcs/Trader/Trader.h525
-rw-r--r--TAO/orbsvcs/orbsvcs/Trader/Trader_Constraint_Visitors.cpp84
-rw-r--r--TAO/orbsvcs/orbsvcs/Trader/Trader_Constraint_Visitors.h63
-rw-r--r--TAO/orbsvcs/orbsvcs/Trader/Trader_Interfaces.cpp1940
-rw-r--r--TAO/orbsvcs/orbsvcs/Trader/Trader_Interfaces.h1019
-rw-r--r--TAO/orbsvcs/orbsvcs/Trader/Trader_T.cpp325
-rw-r--r--TAO/orbsvcs/orbsvcs/Trader/Trader_T.h278
-rw-r--r--TAO/orbsvcs/orbsvcs/Trader/Trader_Utils.cpp1535
-rw-r--r--TAO/orbsvcs/orbsvcs/Trader/Trader_Utils.h783
-rw-r--r--TAO/orbsvcs/orbsvcs/Trader/Trading_Loader.cpp512
-rw-r--r--TAO/orbsvcs/orbsvcs/Trader/Trading_Loader.h116
-rw-r--r--TAO/orbsvcs/orbsvcs/Trader/constraint.l136
-rw-r--r--TAO/orbsvcs/orbsvcs/Trader/constraint.y139
-rw-r--r--TAO/orbsvcs/orbsvcs/Trader/trading_export.h40
-rw-r--r--TAO/orbsvcs/orbsvcs/Trader/trading_serv_export.h40
-rw-r--r--TAO/orbsvcs/orbsvcs/Trader/trading_skel_export.h40
-rw-r--r--TAO/orbsvcs/orbsvcs/ec_typed_events.mpb21
-rw-r--r--TAO/orbsvcs/orbsvcs/ec_typed_events_idl.mpb16
-rw-r--r--TAO/orbsvcs/orbsvcs/ec_typed_events_serv.mpb15
-rw-r--r--TAO/orbsvcs/orbsvcs/ec_typed_events_skel.mpb32
-rw-r--r--TAO/orbsvcs/orbsvcs/miop.idl55
-rw-r--r--TAO/orbsvcs/orbsvcs/orbsvcs.mwc6
-rw-r--r--TAO/orbsvcs/orbsvcs/sfp.idl124
-rw-r--r--TAO/orbsvcs/orbsvcs/svc_utils_export.h40
1656 files changed, 430774 insertions, 0 deletions
diff --git a/TAO/orbsvcs/orbsvcs/ATLAS.idl b/TAO/orbsvcs/orbsvcs/ATLAS.idl
new file mode 100644
index 00000000000..c313ef474c6
--- /dev/null
+++ b/TAO/orbsvcs/orbsvcs/ATLAS.idl
@@ -0,0 +1,88 @@
+// -*- IDL -*-
+
+//=============================================================================
+/**
+ * @file ATLAS.idl
+ *
+ * $Id$
+ *
+ * IDL for Authorization Token Layer Acquisition Service (ATLAS).
+ *
+ * @author Object Management Group
+ */
+//=============================================================================
+
+
+#ifndef _ATLAS_IDL_
+#define _ATLAS_IDL_
+
+#include <TimeBase.idl>
+#include <CosNaming.idl>
+#include <CSI.idl>
+#include <CSIIOP.idl>
+
+#pragma prefix "omg.org"
+
+module ATLAS {
+ typedef sequence<TimeBase::UtcT, 1> ExpiryTime;
+ typedef sequence<CSI::IdentityToken, 1> IdTokenOption;
+
+ struct AuthTokenData {
+ IdTokenOption ident_token;
+ CSI::AuthorizationToken auth_token;
+ ExpiryTime expiry_time;
+ };
+
+ exception IllegalTokenRequest {
+ unsigned long the_errnum;
+ string the_reason;
+ };
+
+ exception TokenOkay {};
+
+ interface AuthTokenDispenser {
+ AuthTokenData get_my_authorization_token ()
+ raises (IllegalTokenRequest);
+
+ AuthTokenData translate_authorization_token (
+ in CSI::IdentityToken the_subject,
+ in CSI::AuthorizationToken the_token)
+ raises (IllegalTokenRequest,
+ TokenOkay);
+ };
+
+ struct CosNamingLocator {
+ CosNaming::NamingContext name_service;
+ CosNaming::Name the_name;
+ };
+
+ //
+ // This type specifies a string encoded in UTF-8 form [IETF RFC 2044].
+ //
+ typedef sequence<octet> UTF8String;
+ typedef CosNaming::NamingContextExt::URLString URLocator;
+
+ typedef unsigned long ATLASLocatorType;
+
+ const ATLASLocatorType ATLASCosNaming = 1;
+ const ATLASLocatorType ATLASURL = 2;
+ const ATLASLocatorType ATLASObject = 3;
+
+ union ATLASLocator switch (ATLASLocatorType)
+ {
+ case ATLASCosNaming: CosNamingLocator naming_locator;
+ case ATLASURL: URLocator the_url;
+ case ATLASObject: AuthTokenDispenser the_depenser;
+ };
+
+ typedef sequence<octet> ATLASCacheId;
+
+ struct ATLASProfile {
+ ATLASLocator the_locator;
+ ATLASCacheId the_cache_id;
+ };
+
+ const CSIIOP::ServiceConfigurationSyntax SCS_ATLAS = 3;
+};
+
+#endif // _ATLAS_IDL_
diff --git a/TAO/orbsvcs/orbsvcs/AV.mpc b/TAO/orbsvcs/orbsvcs/AV.mpc
new file mode 100644
index 00000000000..1a2b0bdadab
--- /dev/null
+++ b/TAO/orbsvcs/orbsvcs/AV.mpc
@@ -0,0 +1,85 @@
+// -*- MPC -*-
+// $Id$
+
+project(AV) : orbsvcslib, core, property_serv, naming, qos, tao_versioning_idl_defaults {
+ avoids += ace_for_tao
+ sharedname = TAO_AV
+ idlflags += -Wb,export_macro=TAO_AV_Export -Wb,export_include=orbsvcs/AV/AV_export.h
+ dynamicflags = TAO_AV_BUILD_DLL
+ tagchecks += AV
+ pch_header =
+ pch_source =
+
+ IDL_Files {
+ AVStreams.idl
+ Null_MediaCtrl.idl
+ sfp.idl
+ }
+
+ Source_Files(ORBSVCS_COMPONENTS) {
+ AV {
+ AVStreamsC.cpp
+ AVStreamsS.cpp
+ Null_MediaCtrlC.cpp
+ Null_MediaCtrlS.cpp
+ sfpC.cpp
+ sfpS.cpp
+ AV/AVStreams_i.cpp
+ AV/AV_Core.cpp
+ AV/Endpoint_Strategy.cpp
+ AV/Endpoint_Strategy_T.cpp
+ AV/Fill_ACE_QoS.cpp
+ AV/FlowSpec_Entry.cpp
+ AV/Flows_T.cpp
+ AV/MCast.cpp
+ AV/md5c.cpp
+ AV/Policy.cpp
+ AV/Protocol_Factory.cpp
+ AV/QoS_UDP.cpp
+ AV/RTCP.cpp
+ AV/RTCP_Channel.cpp
+ AV/RTCP_Packet.cpp
+ AV/RTP.cpp
+ AV/TCP.cpp
+ AV/Transport.cpp
+ AV/UDP.cpp
+ AV/default_resource.cpp
+ AV/media_timer.cpp
+ AV/sfp.cpp
+ AV/SCTP_SEQ.cpp
+ }
+ }
+
+ Header_Files {
+ AV/AVStreams_i.h
+ AV/AV_Core.h
+ AV/AV_export.h
+ AV/Endpoint_Strategy.h
+ AV/Endpoint_Strategy_T.h
+ AV/Fill_ACE_QoS.h
+ AV/FlowSpec_Entry.h
+ AV/Flows_T.h
+ AV/MCast.h
+ AV/md5.h
+ AV/Policy.h
+ AV/Protocol_Factory.h
+ AV/QoS_UDP.h
+ AV/RTCP.h
+ AV/RTCP_Channel.h
+ AV/RTCP_Packet.h
+ AV/RTP.h
+ AV/Resource_Factory.h
+ AV/UDP.h
+ AV/default_resource.h
+ AV/global.h
+ AV/media_timer.h
+ AV/ntp-time.h
+ AV/sfp.h
+ AV/SCTP_SEQ.h
+ }
+ Template_Files {
+ AV/Endpoint_Strategy_T.cpp
+ AV/Flows_T.cpp
+ }
+
+}
diff --git a/TAO/orbsvcs/orbsvcs/AV.rc b/TAO/orbsvcs/orbsvcs/AV.rc
new file mode 100644
index 00000000000..f781e232026
--- /dev/null
+++ b/TAO/orbsvcs/orbsvcs/AV.rc
@@ -0,0 +1,30 @@
+#include "..\..\tao\Version.h"
+
+1 VERSIONINFO
+ FILEVERSION TAO_MAJOR_VERSION,TAO_MINOR_VERSION,TAO_BETA_VERSION,0
+ PRODUCTVERSION TAO_MAJOR_VERSION,TAO_MINOR_VERSION,TAO_BETA_VERSION,0
+ FILEFLAGSMASK 0x3fL
+ FILEFLAGS 0x0L
+ FILEOS 0x4L
+ FILETYPE 0x1L
+ FILESUBTYPE 0x0L
+BEGIN
+ BLOCK "StringFileInfo"
+ BEGIN
+ BLOCK "040904B0"
+ BEGIN
+ VALUE "FileDescription", "AV\0"
+ VALUE "FileVersion", TAO_VERSION "\0"
+ VALUE "InternalName", "TAO_AVDLL\0"
+ VALUE "LegalCopyright", "\0"
+ VALUE "LegalTrademarks", "\0"
+ VALUE "OriginalFilename", "TAO_AV.DLL\0"
+ VALUE "ProductName", "ORBSVCS\0"
+ VALUE "ProductVersion", TAO_VERSION "\0"
+ END
+ END
+ BLOCK "VarFileInfo"
+ BEGIN
+ VALUE "Translation", 0x409, 1200
+ END
+END
diff --git a/TAO/orbsvcs/orbsvcs/AV/AVStreams_i.cpp b/TAO/orbsvcs/orbsvcs/AV/AVStreams_i.cpp
new file mode 100644
index 00000000000..3b21cf04246
--- /dev/null
+++ b/TAO/orbsvcs/orbsvcs/AV/AVStreams_i.cpp
@@ -0,0 +1,5309 @@
+// $Id$
+
+// ============================================================================
+//
+// = LIBRARY
+// cos
+//
+// = FILENAME
+// AVStreams_i.cpp
+//
+// = AUTHOR
+// Sumedh Mungee <sumedh@cs.wustl.edu>
+// Nagarajan Surendran <naga@cs.wustl.edu>
+//
+// ============================================================================
+
+#include "orbsvcs/AV/AVStreams_i.h"
+#include "orbsvcs/AV/sfp.h"
+#include "orbsvcs/AV/MCast.h"
+#include "orbsvcs/AV/RTCP.h"
+
+#include "tao/debug.h"
+#include "tao/ORB_Core.h"
+#include "tao/AnyTypeCode/Any.h"
+#include "ace/OS_NS_arpa_inet.h"
+
+#if !defined (__ACE_INLINE__)
+#include "orbsvcs/AV/AVStreams_i.i"
+#endif /* __ACE_INLINE__ */
+
+ACE_RCSID (AV,
+ AVStreams_i,
+ "$Id$")
+
+TAO_BEGIN_VERSIONED_NAMESPACE_DECL
+
+//------------------------------------------------------------
+// TAO_AV_Qos
+//------------------------------------------------------------
+
+TAO_AV_QoS::TAO_AV_QoS (void)
+{
+}
+
+TAO_AV_QoS::TAO_AV_QoS (AVStreams::streamQoS &stream_qos)
+{
+ this->set (stream_qos);
+}
+
+int
+TAO_AV_QoS::convert (AVStreams::streamQoS &/*network_qos*/)
+{
+ return -1;
+}
+
+
+// ----------------------------------------------------------------------
+// AV_Null_MediaCtrl
+// ----------------------------------------------------------------------
+AV_Null_MediaCtrl::AV_Null_MediaCtrl (void)
+{
+}
+
+AV_Null_MediaCtrl::~AV_Null_MediaCtrl (void)
+{
+}
+
+
+// ----------------------------------------------------------------------
+// TAO_Basic_StreamCtrl
+// ----------------------------------------------------------------------
+
+// Constructor
+TAO_Basic_StreamCtrl::TAO_Basic_StreamCtrl (void)
+ :flow_count_ (0)
+{
+}
+
+
+// Stop the transfer of data of the stream
+// Empty the_spec means apply operation to all flows
+void
+TAO_Basic_StreamCtrl::stop (const AVStreams::flowSpec &flow_spec
+ ACE_ENV_ARG_DECL)
+ ACE_THROW_SPEC ((CORBA::SystemException,
+ AVStreams::noSuchFlow))
+{
+ ACE_TRY
+ {
+ // @@Call stop on the Related MediaCtrl. call stop on the flow
+ // connections.
+ if (this->flow_connection_map_.current_size () > 0)
+ {
+ if (flow_spec.length () > 0)
+ for (u_int i=0;i<flow_spec.length ();i++)
+ {
+ char *flowname = TAO_AV_Core::get_flowname (flow_spec[i]);
+ ACE_CString flow_name_key (flowname);
+ AVStreams::FlowConnection_var flow_connection_entry;
+ if (this->flow_connection_map_.find (flow_name_key,
+ flow_connection_entry) == 0)
+ {
+ flow_connection_entry->stop (ACE_ENV_SINGLE_ARG_PARAMETER);
+ ACE_TRY_CHECK;
+ }
+ }
+ else
+ {
+ // call stop on all the flows.
+ FlowConnection_Map_Iterator iterator (this->flow_connection_map_);
+ FlowConnection_Map_Entry *entry;
+ for (;iterator.next (entry) != 0;iterator.advance ())
+ {
+ entry->int_id_->stop (ACE_ENV_SINGLE_ARG_PARAMETER);
+ ACE_TRY_CHECK;
+ }
+ }
+ }
+ }
+ ACE_CATCHANY
+ {
+ ACE_PRINT_EXCEPTION (ACE_ANY_EXCEPTION, "TAO_Basic_StreamCtrl::stop");
+ return;
+ }
+ ACE_ENDTRY;
+ ACE_CHECK;
+}
+
+// Start the transfer of data in the stream.
+// Empty the_spec means apply operation to all flows
+void
+TAO_Basic_StreamCtrl::start (const AVStreams::flowSpec &flow_spec
+ ACE_ENV_ARG_DECL)
+ ACE_THROW_SPEC ((CORBA::SystemException,
+ AVStreams::noSuchFlow))
+{
+ ACE_TRY
+ {
+ // @@Call start on the Related MediaCtrl.
+
+ // call start on the flow connections.
+ if (this->flow_connection_map_.current_size () > 0)
+ {
+ if (flow_spec.length () > 0)
+ for (u_int i = 0; i < flow_spec.length (); i++)
+ {
+ char *flowname = TAO_AV_Core::get_flowname (flow_spec[i]);
+ ACE_CString flow_name_key (flowname);
+ FlowConnection_Map::ENTRY *flow_connection_entry = 0;
+ if (this->flow_connection_map_.find (flow_name_key,
+ flow_connection_entry) == 0)
+ {
+ flow_connection_entry->int_id_->start (ACE_ENV_SINGLE_ARG_PARAMETER);
+ ACE_TRY_CHECK;
+ }
+ }
+ else
+ {
+ // call start on all the flows.
+ FlowConnection_Map_Iterator iterator (this->flow_connection_map_);
+ FlowConnection_Map_Entry *entry = 0;
+ for (;iterator.next (entry) != 0;iterator.advance ())
+ {
+ entry->int_id_->start (ACE_ENV_SINGLE_ARG_PARAMETER);
+ ACE_TRY_CHECK;
+ }
+ }
+ }
+ }
+ ACE_CATCHANY
+ {
+ ACE_PRINT_EXCEPTION (ACE_ANY_EXCEPTION, "TAO_Basic_StreamCtrl::start");
+ return;
+ }
+ ACE_ENDTRY;
+ ACE_CHECK;
+}
+
+// Tears down the stream. This will close the connection, and delete
+// the streamendpoint and vdev associated with this stream Empty
+// the_spec means apply operation to all flows
+
+void
+TAO_Basic_StreamCtrl::destroy (const AVStreams::flowSpec &flow_spec
+ ACE_ENV_ARG_DECL)
+ ACE_THROW_SPEC ((CORBA::SystemException,
+ AVStreams::noSuchFlow))
+{
+ ACE_TRY
+ {
+ // call stop on the flow connections.
+ if (this->flow_connection_map_.current_size () > 0)
+ {
+ if (flow_spec.length () > 0)
+ {
+ for (u_int i=0;i<flow_spec.length ();i++)
+ {
+ char *flowname = TAO_AV_Core::get_flowname (flow_spec[i]);
+ ACE_CString flow_name_key (flowname);
+ FlowConnection_Map::ENTRY *flow_connection_entry = 0;
+ if (this->flow_connection_map_.find (flow_name_key, flow_connection_entry) == 0)
+ {
+ flow_connection_entry->int_id_->destroy (ACE_ENV_SINGLE_ARG_PARAMETER);
+ ACE_TRY_CHECK;
+ }
+ }
+ }
+ else
+ {
+ // call destroy on all the flows.
+ FlowConnection_Map_Iterator iterator (this->flow_connection_map_);
+ FlowConnection_Map_Entry *entry = 0;
+ for (;iterator.next (entry) != 0;iterator.advance ())
+ {
+ entry->int_id_->destroy (ACE_ENV_SINGLE_ARG_PARAMETER);
+ ACE_TRY_CHECK;
+ }
+ }
+ }
+ }
+ ACE_CATCHANY
+ {
+ ACE_PRINT_EXCEPTION (ACE_ANY_EXCEPTION, "TAO_Basic_StreamCtrl::destroy");
+ return;
+ }
+ ACE_ENDTRY;
+ ACE_CHECK;
+}
+
+// Changes the QoS associated with the stream
+// Empty the_spec means apply operation to all flows
+CORBA::Boolean
+
+TAO_Basic_StreamCtrl::modify_QoS (AVStreams::streamQoS & /*new_qos*/,
+ const AVStreams::flowSpec &/*flowspec*/
+ ACE_ENV_ARG_DECL_NOT_USED)
+ ACE_THROW_SPEC ((CORBA::SystemException,
+ AVStreams::noSuchFlow,
+ AVStreams::QoSRequestFailed))
+{
+ return 1;
+}
+
+// Used by StreamEndPoint and VDev to inform StreamCtrl of events.
+// E.g., loss of flow, reestablishment of flow, etc..
+void
+TAO_Basic_StreamCtrl::push_event (const struct CosPropertyService::Property &/*the_event*/
+ ACE_ENV_ARG_DECL_NOT_USED)
+ ACE_THROW_SPEC ((CORBA::SystemException))
+{
+ if (TAO_debug_level > 0)
+ ACE_DEBUG ((LM_DEBUG, "\n(%P|%t) Recieved event \""));
+}
+
+// Sets the flow protocol status.
+void
+TAO_Basic_StreamCtrl::set_FPStatus (const AVStreams::flowSpec &flow_spec,
+ const char *fp_name,
+ const CORBA::Any &fp_settings
+ ACE_ENV_ARG_DECL)
+ ACE_THROW_SPEC ((CORBA::SystemException,
+ AVStreams::noSuchFlow,
+ AVStreams::FPError))
+
+{
+ if (!CORBA::is_nil (this->sep_a_.in ()))
+ {
+ this->sep_a_->set_FPStatus (flow_spec, fp_name, fp_settings ACE_ENV_ARG_PARAMETER);
+ ACE_CHECK;
+ }
+}
+
+// Gets the flow connection.
+CORBA::Object_ptr
+TAO_Basic_StreamCtrl::get_flow_connection (const char *flow_name
+ ACE_ENV_ARG_DECL)
+ ACE_THROW_SPEC ((CORBA::SystemException,
+ AVStreams::noSuchFlow,
+ AVStreams::notSupported))
+{
+ ACE_CString flow_name_key (flow_name);
+ AVStreams::FlowConnection_var flow_connection_entry;
+
+ if (this->flow_connection_map_.find (flow_name_key, flow_connection_entry) == 0){
+ return flow_connection_entry._retn();
+ }
+ else{
+ if (TAO_debug_level > 0) ACE_DEBUG ((LM_DEBUG, "(%N,%l) Cannot find flow: %s\n", flow_name ));
+ ACE_THROW_RETURN (AVStreams::noSuchFlow (), CORBA::Object::_nil ());
+ }
+}
+
+// Sets the flow connection.
+void
+TAO_Basic_StreamCtrl::set_flow_connection (const char *flow_name,
+ CORBA::Object_ptr flow_connection_obj
+ ACE_ENV_ARG_DECL)
+ ACE_THROW_SPEC ((CORBA::SystemException,
+ AVStreams::noSuchFlow,
+ AVStreams::notSupported))
+{
+ AVStreams::FlowConnection_var flow_connection;
+ ACE_TRY
+ {
+ flow_connection = AVStreams::FlowConnection::_narrow (flow_connection_obj ACE_ENV_ARG_PARAMETER);
+ ACE_TRY_CHECK;
+ }
+ ACE_CATCHANY
+ {
+ ACE_PRINT_EXCEPTION (ACE_ANY_EXCEPTION, "TAO_Basic_StreamCtrl::set_flow_connection");
+ return;
+ }
+ ACE_ENDTRY;
+ ACE_CHECK;
+ // add the flowname and the flowconnection to the hashtable.
+ this->flows_.length (this->flow_count_ + 1);
+ this->flows_ [this->flow_count_++] = CORBA::string_dup (flow_name);
+ ACE_CString flow_name_key (flow_name);
+ if (this->flow_connection_map_.bind (flow_name_key, flow_connection) != 0)
+ {
+ if (TAO_debug_level > 0) ACE_DEBUG ((LM_DEBUG, "(%N,%l) Cannot find flow: %s\n", flow_name ));
+ ACE_THROW (AVStreams::noSuchFlow ());// is this right?
+ }
+}
+
+TAO_Basic_StreamCtrl::~TAO_Basic_StreamCtrl (void)
+{
+}
+
+// ----------------------------------------------------------------------
+// TAO_Negotiator
+// ----------------------------------------------------------------------
+
+CORBA::Boolean
+TAO_Negotiator::negotiate (AVStreams::Negotiator_ptr /* remote_negotiator */,
+ const AVStreams::streamQoS &/* qos_spec */
+ ACE_ENV_ARG_DECL_NOT_USED)
+ ACE_THROW_SPEC ((CORBA::SystemException))
+{
+ ACE_DEBUG ((LM_DEBUG,
+ "TAO_Negotiator::negotiate\n"));
+ return 0;
+}
+
+// ----------------------------------------------------------------------
+// MMDevice_Map_Hash_Key
+// ----------------------------------------------------------------------
+
+const int MMDevice_Map_Hash_Key::hash_maximum_ = 10000;
+
+//default constructor.
+MMDevice_Map_Hash_Key::MMDevice_Map_Hash_Key (void)
+{
+ this->mmdevice_ = AVStreams::MMDevice::_nil ();
+}
+
+// constructor.
+MMDevice_Map_Hash_Key::MMDevice_Map_Hash_Key (AVStreams::MMDevice_ptr mmdevice)
+{
+ this->mmdevice_ = AVStreams::MMDevice::_duplicate (mmdevice);
+}
+
+// copy constructor.
+MMDevice_Map_Hash_Key::MMDevice_Map_Hash_Key (const MMDevice_Map_Hash_Key& hash_key)
+{
+ this->mmdevice_ = AVStreams::MMDevice::_duplicate (hash_key.mmdevice_);
+}
+
+// destructor.
+MMDevice_Map_Hash_Key::~MMDevice_Map_Hash_Key (void)
+{
+ CORBA::release (this->mmdevice_);
+}
+
+bool
+MMDevice_Map_Hash_Key::operator == (const MMDevice_Map_Hash_Key &hash_key) const
+{
+ CORBA::Boolean result = 0;
+ ACE_DECLARE_NEW_CORBA_ENV;
+ ACE_TRY
+ {
+ result =
+ this->mmdevice_->_is_equivalent (hash_key.mmdevice_
+ ACE_ENV_ARG_PARAMETER);
+ ACE_TRY_CHECK;
+ }
+ ACE_CATCHANY
+ {
+ ACE_PRINT_EXCEPTION (ACE_ANY_EXCEPTION, "MMDevice_Map_Hash_Key::operator == ");
+ return false;
+ }
+ ACE_ENDTRY;
+ ACE_CHECK_RETURN (false);
+
+ return result;
+}
+
+bool
+operator < (const MMDevice_Map_Hash_Key &left,
+ const MMDevice_Map_Hash_Key &right)
+{
+ bool result = false;
+
+ ACE_DECLARE_NEW_CORBA_ENV;
+ ACE_TRY
+ {
+ const CORBA::ULong left_hash =
+ left.mmdevice_->_hash (left.hash_maximum_
+ ACE_ENV_ARG_PARAMETER);
+ ACE_TRY_CHECK;
+
+ const CORBA::ULong right_hash =
+ right.mmdevice_->_hash (right.hash_maximum_
+ ACE_ENV_ARG_PARAMETER);
+ ACE_TRY_CHECK;
+
+ result = left_hash < right_hash;
+ }
+ ACE_CATCHANY
+ {
+ ACE_PRINT_EXCEPTION (ACE_ANY_EXCEPTION,
+ "operator < for MMDevice_Map_Hash_Key");
+ return false;
+ }
+ ACE_ENDTRY;
+ ACE_CHECK_RETURN (false);
+
+ return result;
+}
+
+u_long
+MMDevice_Map_Hash_Key::hash (void) const
+{
+ u_long result = 0;
+ ACE_DECLARE_NEW_CORBA_ENV;
+ ACE_TRY
+ {
+ result = this->mmdevice_->_hash (this->hash_maximum_
+ ACE_ENV_ARG_PARAMETER);
+ ACE_TRY_CHECK;
+ }
+ ACE_CATCHANY
+ {
+ ACE_PRINT_EXCEPTION (ACE_ANY_EXCEPTION, "MMDevice_Map_Hash_Key::hash");
+ return 0;
+ }
+ ACE_ENDTRY;
+ ACE_CHECK_RETURN (0);
+ return result;
+}
+
+// ----------------------------------------------------------------------
+// TAO_StreamCtrl
+// ----------------------------------------------------------------------
+
+TAO_StreamCtrl::TAO_StreamCtrl (void)
+ :mcastconfigif_ (0)
+{
+ ACE_DECLARE_NEW_CORBA_ENV;
+ ACE_TRY
+ {
+ this->streamctrl_ = this->_this (ACE_ENV_SINGLE_ARG_PARAMETER);
+ ACE_TRY_CHECK;
+ char buf [BUFSIZ];
+ int result = ACE_OS::hostname (buf, BUFSIZ);
+ unsigned long ipaddr = 0;
+ if (result == 0)
+ ipaddr = ACE_OS::inet_addr (buf);
+ this->source_id_ = TAO_AV_RTCP::alloc_srcid (ipaddr);
+ }
+ ACE_CATCHANY
+ {
+ ACE_PRINT_EXCEPTION (ACE_ANY_EXCEPTION, "TAO_StreamCtrl::TAO_StreamCtrl");
+ }
+ ACE_ENDTRY;
+ ACE_CHECK;
+}
+
+TAO_StreamCtrl::~TAO_StreamCtrl (void)
+{
+ delete this->mcastconfigif_;
+}
+
+
+// Stop the transfer of data of the stream
+// Empty the_spec means apply operation to all flows
+void
+TAO_StreamCtrl::stop (const AVStreams::flowSpec &flow_spec
+ ACE_ENV_ARG_DECL)
+ ACE_THROW_SPEC ((CORBA::SystemException,
+ AVStreams::noSuchFlow))
+{
+ ACE_TRY
+ {
+ TAO_Basic_StreamCtrl::stop (flow_spec ACE_ENV_ARG_PARAMETER);
+ ACE_TRY_CHECK;
+ if (this->flow_connection_map_.current_size () > 0)
+ return;
+ MMDevice_Map_Iterator a_iterator (this->mmdevice_a_map_);
+ MMDevice_Map::ENTRY *entry = 0;
+ for (;a_iterator.next (entry)!= 0;a_iterator.advance ())
+ {
+ entry->int_id_.sep_->stop (flow_spec ACE_ENV_ARG_PARAMETER);
+ ACE_TRY_CHECK;
+ }
+ MMDevice_Map_Iterator b_iterator (this->mmdevice_b_map_);
+ for (;b_iterator.next (entry)!= 0;b_iterator.advance ())
+ {
+ entry->int_id_.sep_->stop (flow_spec ACE_ENV_ARG_PARAMETER);
+ ACE_TRY_CHECK;
+ }
+ }
+ ACE_CATCHANY
+ {
+ ACE_PRINT_EXCEPTION (ACE_ANY_EXCEPTION, "TAO_Basic_StreamCtrl::stop");
+ return;
+ }
+ ACE_ENDTRY;
+ ACE_CHECK;
+}
+
+// Start the transfer of data in the stream.
+// Empty the_spec means apply operation to all flows
+void
+TAO_StreamCtrl::start (const AVStreams::flowSpec &flow_spec
+ ACE_ENV_ARG_DECL)
+ ACE_THROW_SPEC ((CORBA::SystemException,
+ AVStreams::noSuchFlow))
+{
+ ACE_TRY
+ {
+ TAO_Basic_StreamCtrl::start (flow_spec ACE_ENV_ARG_PARAMETER);
+ ACE_TRY_CHECK;
+ if (this->flow_connection_map_.current_size () > 0)
+ return;
+
+ MMDevice_Map_Iterator a_iterator (this->mmdevice_a_map_);
+ MMDevice_Map::ENTRY *entry = 0;
+ for (;a_iterator.next (entry)!= 0;a_iterator.advance ())
+ {
+ entry->int_id_.sep_->start (flow_spec ACE_ENV_ARG_PARAMETER);
+ ACE_TRY_CHECK;
+ }
+ MMDevice_Map_Iterator b_iterator (this->mmdevice_b_map_);
+ for (;b_iterator.next (entry)!= 0;b_iterator.advance ())
+ {
+ entry->int_id_.sep_->start (flow_spec ACE_ENV_ARG_PARAMETER);
+ ACE_TRY_CHECK;
+ }
+ }
+ ACE_CATCHANY
+ {
+ ACE_PRINT_EXCEPTION (ACE_ANY_EXCEPTION, "TAO_StreamCtrl::start");
+ return;
+ }
+ ACE_ENDTRY;
+ ACE_CHECK;
+}
+
+// Tears down the stream. This will close the connection, and delete
+// the streamendpoint and vdev associated with this stream
+// Empty the_spec means apply operation to all flows
+void
+TAO_StreamCtrl::destroy (const AVStreams::flowSpec &flow_spec
+ ACE_ENV_ARG_DECL)
+ ACE_THROW_SPEC ((CORBA::SystemException,
+ AVStreams::noSuchFlow))
+{
+ ACE_TRY
+ {
+ TAO_Basic_StreamCtrl::destroy (flow_spec ACE_ENV_ARG_PARAMETER);
+ ACE_TRY_CHECK;
+ if (this->flow_connection_map_.current_size () > 0)
+ return;
+
+ MMDevice_Map_Iterator a_iterator (this->mmdevice_a_map_);
+ MMDevice_Map::ENTRY *entry = 0;
+ for (;a_iterator.next (entry)!= 0;a_iterator.advance ())
+ {
+ entry->int_id_.sep_->destroy (flow_spec ACE_ENV_ARG_PARAMETER);
+ ACE_TRY_CHECK;
+ }
+ MMDevice_Map_Iterator b_iterator (this->mmdevice_b_map_);
+ for (;b_iterator.next (entry)!= 0;b_iterator.advance ())
+ {
+ entry->int_id_.sep_->destroy (flow_spec ACE_ENV_ARG_PARAMETER);
+ ACE_TRY_CHECK;
+ }
+ }
+ ACE_CATCHANY
+ {
+ ACE_PRINT_EXCEPTION (ACE_ANY_EXCEPTION, "TAO_StreamCtrl::destroy");
+ return;
+ }
+ ACE_ENDTRY;
+ ACE_CHECK;
+
+ int result = TAO_AV_Core::deactivate_servant (this);
+ if (result < 0)
+ if (TAO_debug_level > 0) ACE_DEBUG ((LM_DEBUG, "TAO_StreamCtrl::destroy failed\n"));
+}
+
+// request the two MMDevices to create vdev and stream endpoints. save
+// the references returned.
+
+// The interaction diagram for this method is on page 13 of the spec
+CORBA::Boolean
+TAO_StreamCtrl::bind_devs (AVStreams::MMDevice_ptr a_party,
+ AVStreams::MMDevice_ptr b_party,
+ AVStreams::streamQoS &the_qos,
+ const AVStreams::flowSpec &the_flows
+ ACE_ENV_ARG_DECL)
+ ACE_THROW_SPEC ((CORBA::SystemException,
+ AVStreams::streamOpFailed,
+ AVStreams::noSuchFlow,
+ AVStreams::QoSRequestFailed))
+{
+ ACE_TRY
+ {
+ if (CORBA::is_nil (a_party) && CORBA::is_nil (b_party))
+ ACE_ERROR_RETURN ((LM_ERROR, "Both parties are nil\n"), 0);
+ // Check to see if we have non-nil parties to bind!
+ if (TAO_debug_level > 0)
+ if (CORBA::is_nil (a_party) ||
+ CORBA::is_nil (b_party))
+ if (TAO_debug_level > 0)
+ ACE_DEBUG ((LM_DEBUG,
+ "(%P|%t) TAO_StreamCtrl::bind_devs: "
+ "a_party or b_party is null"
+ "Multicast mode\n"));
+
+ // Request a_party to create the endpoint and vdev
+ CORBA::Boolean met_qos;
+ CORBA::String_var named_vdev;
+
+ if (!CORBA::is_nil (a_party))
+ {
+ MMDevice_Map_Hash_Key find_key (a_party);
+ MMDevice_Map_Entry find_entry;
+ int result =
+ this->mmdevice_a_map_.find (find_key, find_entry);
+ if (result == 0)
+ {
+ if (TAO_debug_level > 0)
+ {
+ // Already in the map.
+ if (TAO_debug_level > 0)
+ ACE_DEBUG ((LM_DEBUG, "mmdevice a_party is already bound\n"));
+ }
+ return 1;
+ }
+ else
+ {
+ this->sep_a_ =
+ a_party-> create_A (this->streamctrl_.in (),
+ this->vdev_a_.out (),
+ the_qos,
+ met_qos,
+ named_vdev.inout (),
+ the_flows
+ ACE_ENV_ARG_PARAMETER);
+ ACE_TRY_CHECK;
+
+ if (TAO_debug_level > 0)
+ ACE_DEBUG ((LM_DEBUG, "(%P|%t) TAO_StreamCtrl::create_A: succeeded\n"));
+ // Define ourselves as the related_streamctrl property of the sep.
+ CORBA::Any streamctrl_any;
+ streamctrl_any <<= this->streamctrl_.in ();
+ this->sep_a_->define_property ("Related_StreamCtrl",
+ streamctrl_any
+ ACE_ENV_ARG_PARAMETER);
+ ACE_TRY_CHECK;
+
+ CORBA::Any vdev_a_any;
+ vdev_a_any <<= this->vdev_a_.in ();
+ this->sep_a_->define_property ("Related_VDev",
+ vdev_a_any
+ ACE_ENV_ARG_PARAMETER);
+ ACE_TRY_CHECK;
+
+ CORBA::Any streamendpoint_a_any;
+ streamendpoint_a_any <<= this->sep_a_.in ();
+ this->vdev_a_->define_property ("Related_StreamEndpoint",
+ streamendpoint_a_any
+ ACE_ENV_ARG_PARAMETER);
+
+ ACE_TRY_CHECK;
+
+ CORBA::Any mmdevice_a_any;
+ mmdevice_a_any <<= a_party;
+ this->vdev_a_->define_property ("Related_MMDevice",
+ mmdevice_a_any
+ ACE_ENV_ARG_PARAMETER);
+ ACE_TRY_CHECK;
+
+ // add the mmdevice, sep and vdev to the map.
+ MMDevice_Map_Entry map_entry;
+ MMDevice_Map_Hash_Key key (a_party);
+ map_entry.sep_ = AVStreams::StreamEndPoint_A::_duplicate (this->sep_a_.in ());
+ map_entry.vdev_ = AVStreams::VDev::_duplicate (this->vdev_a_.in ());
+ map_entry.flowspec_ = the_flows;
+ map_entry.qos_ = the_qos;
+ result =
+ this->mmdevice_a_map_.bind (key, map_entry);
+ if (result < 0)
+ if (TAO_debug_level > 0)
+ ACE_DEBUG ((LM_DEBUG, "Error binding mmdevice entry in the a_map"));
+ }
+ }
+ // Request b_party to create the endpoint and vdev
+ if (!CORBA::is_nil (b_party))
+ {
+ MMDevice_Map_Hash_Key find_key (b_party);
+ MMDevice_Map_Entry find_entry;
+ int result =
+ this->mmdevice_b_map_.find (find_key, find_entry);
+ if (result == 0)
+ {
+ // Already in the map.
+ if (TAO_debug_level > 0) ACE_DEBUG ((LM_DEBUG, "mmdevice b_party is already bound\n"));
+ return 1;
+ }
+ else
+ {
+ this->sep_b_ =
+ b_party-> create_B (this->streamctrl_.in (),
+ this->vdev_b_.out (),
+ the_qos,
+ met_qos,
+ named_vdev.inout (),
+ the_flows
+ ACE_ENV_ARG_PARAMETER);
+ ACE_TRY_CHECK;
+
+ if (TAO_debug_level > 0) ACE_DEBUG ((LM_DEBUG, "(%P|%t) TAO_StreamCtrl::create_B: succeeded\n"));
+
+ if (TAO_debug_level > 0) ACE_DEBUG ((LM_DEBUG,
+ "\n(%P|%t)stream_endpoint_b_ = %s",
+ TAO_ORB_Core_instance ()->orb ()->object_to_string (this->sep_b_.in ()
+ ACE_ENV_ARG_PARAMETER)));
+ ACE_TRY_CHECK;
+ // Define ourselves as the related_streamctrl property of the sep.
+ CORBA::Any streamctrl_any;
+ streamctrl_any <<= this->streamctrl_.in ();
+ this->sep_b_->define_property ("Related_StreamCtrl",
+ streamctrl_any
+ ACE_ENV_ARG_PARAMETER);
+ ACE_TRY_CHECK;
+
+ CORBA::Any vdev_b_any;
+ vdev_b_any <<= this->vdev_b_.in ();
+ this->sep_b_->define_property ("Related_VDev",
+ vdev_b_any
+ ACE_ENV_ARG_PARAMETER);
+ ACE_TRY_CHECK;
+
+ CORBA::Any streamendpoint_b_any;
+ streamendpoint_b_any <<= this->sep_b_.in ();
+ this->vdev_b_->define_property ("Related_StreamEndpoint",
+ streamendpoint_b_any
+ ACE_ENV_ARG_PARAMETER);
+
+ ACE_TRY_CHECK;
+
+ CORBA::Any mmdevice_b_any;
+ mmdevice_b_any <<= b_party;
+ this->vdev_b_->define_property ("Related_MMDevice",
+ mmdevice_b_any
+ ACE_ENV_ARG_PARAMETER);
+ ACE_TRY_CHECK;
+ // add the mmdevice, sep and vdev to the map.
+ MMDevice_Map_Entry map_entry;
+ MMDevice_Map_Hash_Key key (b_party);
+ map_entry.sep_ = AVStreams::StreamEndPoint::_duplicate (this->sep_b_.in ());
+ map_entry.vdev_ = AVStreams::VDev::_duplicate(this->vdev_b_.in ());
+ map_entry.flowspec_ = the_flows;
+ map_entry.qos_ = the_qos;
+ int result =
+ this->mmdevice_b_map_.bind (key, map_entry);
+ if (result < 0)
+ if (TAO_debug_level > 0) ACE_DEBUG ((LM_DEBUG, "Error binding mmdevice entry in the b_map"));
+ }
+ }
+
+ // Tell the endpoints about each other.
+ if ((!CORBA::is_nil (a_party)) && (!CORBA::is_nil (b_party)))
+ {
+ CORBA::Any sep_a_peer_any;
+ CORBA::Any sep_b_peer_any;
+
+ sep_a_peer_any <<= this->sep_b_.in();
+ sep_b_peer_any <<= this->sep_a_.in();
+ this->sep_a_->define_property ("PeerAdapter",
+ sep_a_peer_any
+ ACE_ENV_ARG_PARAMETER);
+ ACE_TRY_CHECK;
+
+ this->sep_b_->define_property ("PeerAdapter",
+ sep_b_peer_any
+ ACE_ENV_ARG_PARAMETER);
+ ACE_TRY_CHECK;
+ }
+
+ // In the full profile case there's no VDev.
+ if (CORBA::is_nil (b_party) && (!CORBA::is_nil (this->vdev_a_.in ())))
+ {
+ // Now set the source id for this A endpoint.
+ // If the sep contains flow producers then set the source ids for those
+ // instead.
+ ACE_TRY_EX (set_source_id)
+ {
+ CORBA::Any_ptr flows_any = this->sep_a_->get_property_value ("Flows"
+ ACE_ENV_ARG_PARAMETER);
+ ACE_TRY_CHECK_EX (set_source_id);
+ AVStreams::flowSpec_var flows;
+ *flows_any >>= flows.out ();
+ for (CORBA::ULong i=0; i< flows->length ();++i)
+ {
+ CORBA::Object_var fep_obj =
+ this->sep_a_->get_fep (flows [i] ACE_ENV_ARG_PARAMETER);
+ ACE_TRY_CHECK_EX (set_source_id);
+ ACE_TRY_EX (producer_check)
+ {
+ AVStreams::FlowProducer_var producer =
+ AVStreams::FlowProducer::_narrow (fep_obj.in ()
+ ACE_ENV_ARG_PARAMETER);
+ ACE_TRY_CHECK_EX (producer_check);
+ producer->set_source_id (this->source_id_++);
+ }
+ ACE_CATCHANY
+ {
+ if (TAO_debug_level > 0)
+ ACE_DEBUG ((LM_DEBUG, " %s ", static_cast<char const*>(flows[i])));
+
+ ACE_PRINT_EXCEPTION (ACE_ANY_EXCEPTION, "producer_check: not a producer");
+
+ }
+ ACE_ENDTRY;
+ ACE_CHECK_RETURN (0);
+ }
+ }
+ ACE_CATCHANY
+ {
+ // Since the full profile failed try setting the source id
+ // for the sep instead.
+ // @@Naga: What do we do if in the light profile the sep has
+ // many producers who do not have flow interfaces. Then
+ // the streamctrl has to give an array of source ids to
+ // the sep.
+ this->sep_a_->set_source_id (this->source_id_++
+ ACE_ENV_ARG_PARAMETER);
+ ACE_TRY_CHECK;
+ }
+ ACE_ENDTRY;
+ ACE_CHECK_RETURN (0);
+ if (!this->mcastconfigif_)
+ {
+ ACE_NEW_RETURN (this->mcastconfigif_,
+ TAO_MCastConfigIf,
+ 0);
+ // @@: Deactivating the object thru poa means calling remove_ref after _this.
+ this->mcastconfigif_ptr_ = this->mcastconfigif_->_this (ACE_ENV_SINGLE_ARG_PARAMETER);
+ ACE_TRY_CHECK;
+ }
+ // Multicast source being added.
+ CORBA::Boolean result = this->vdev_a_->set_Mcast_peer (this->streamctrl_.in (),
+ this->mcastconfigif_ptr_.in (),
+ the_qos,
+ the_flows
+ ACE_ENV_ARG_PARAMETER);
+ if (!result)
+ ACE_ERROR_RETURN ((LM_ERROR, "set_Mcast_peer failed\n"), 0);
+ }
+
+ if (CORBA::is_nil (a_party))
+ {
+ if (!CORBA::is_nil (this->vdev_b_.in ()))
+ {
+ // Multicast sink being added.
+ if (!this->mcastconfigif_)
+ ACE_ERROR_RETURN ((LM_ERROR, "first add a source and then a sink\n"), 0);
+ this->mcastconfigif_->set_peer (this->vdev_b_.in (),
+ the_qos,
+ the_flows
+ ACE_ENV_ARG_PARAMETER);
+ ACE_TRY_CHECK;
+ }
+
+ int connect_leaf_success = 0;
+ ACE_TRY_EX (connect_leaf)
+ {
+ // @@: define null interfaces for Atm so that they can be implemented once
+ // ACE adds support for ATM multicast.
+ connect_leaf_success = this->sep_a_->connect_leaf (this->sep_b_.in (),
+ the_qos,
+ the_flows
+ ACE_ENV_ARG_PARAMETER);
+ ACE_TRY_CHECK_EX (connect_leaf);
+ connect_leaf_success = 1;
+ }
+ ACE_CATCH (AVStreams::notSupported, ex)
+ {
+ if (TAO_debug_level > 0) ACE_DEBUG ((LM_DEBUG, "connect_leaf failed\n"));
+ connect_leaf_success = 0;
+ }
+ ACE_CATCHANY
+ {
+ ACE_PRINT_EXCEPTION (ACE_ANY_EXCEPTION, "TAO_StreamCtrl::bind_devs");
+ }
+ ACE_ENDTRY;
+ ACE_CHECK_RETURN (0);
+ if (!connect_leaf_success)
+ {
+ if (TAO_debug_level > 0)
+ ACE_DEBUG ((LM_DEBUG,"TAO_StreamCtrl::bind_devs Multiconnect\n"));
+ AVStreams::flowSpec connect_flows = the_flows;
+ this->sep_a_->multiconnect (the_qos, connect_flows ACE_ENV_ARG_PARAMETER);
+ ACE_TRY_CHECK;
+ this->sep_b_->multiconnect (the_qos, connect_flows ACE_ENV_ARG_PARAMETER);
+ ACE_TRY_CHECK;
+ }
+ }
+
+ if (!CORBA::is_nil (a_party) && !CORBA::is_nil (b_party))
+ {
+ // Check to see if the MMDevice contains FDev objects
+ // If it contains FDev objects, then we are using the
+ // Full profile, and we want to call bind() instead
+ // of connect() on the the streamctrl
+ if( a_party->is_property_defined("Flows") &&
+ b_party->is_property_defined("Flows") )
+ {
+ if (TAO_debug_level > 0) {
+ ACE_DEBUG ((LM_DEBUG, "(%N,%l) Full profile, invoking bind()\n"));
+ }
+
+ // It is full profile
+ // we have feps in the sep then dont call connect
+ // instead call bind on the streamctrl.
+ this->bind (this->sep_a_.in (),
+ this->sep_b_.in (),
+ the_qos,
+ the_flows
+ ACE_ENV_ARG_PARAMETER);
+ ACE_TRY_CHECK;
+
+
+
+ }
+ // This is the light profile, call connect()
+ else if (!CORBA::is_nil (this->vdev_a_.in ()) && !CORBA::is_nil (this->vdev_b_.in ()))
+ {
+ if (TAO_debug_level > 0) {
+ ACE_DEBUG ((LM_DEBUG, "(%N,%l) Light profile, invoking connect()\n"));
+ }
+
+ // Tell the 2 VDev's about one another
+ this->vdev_a_->set_peer (this->streamctrl_.in (),
+ this->vdev_b_.in (),
+ the_qos,
+ the_flows
+ ACE_ENV_ARG_PARAMETER);
+
+ ACE_TRY_CHECK;
+ this->vdev_b_->set_peer (this->streamctrl_.in (),
+ this->vdev_a_.in (),
+ the_qos,
+ the_flows
+ ACE_ENV_ARG_PARAMETER);
+
+ ACE_TRY_CHECK;
+
+ // Now connect the streams together. This will
+ // establish the connection
+ CORBA::Boolean result =
+ this->sep_a_->connect (this->sep_b_.in (),
+ the_qos,
+ the_flows
+ ACE_ENV_ARG_PARAMETER);
+ ACE_TRY_CHECK;
+ if (result == 0)
+ ACE_ERROR_RETURN ((LM_ERROR, "sep_a->connect (sep_b) failed\n"), 0);
+ }
+ }
+ }
+ ACE_CATCHANY
+ {
+ ACE_PRINT_EXCEPTION (ACE_ANY_EXCEPTION, "TAO_StreamCtrl::bind_devs");
+ return 0;
+ }
+ ACE_ENDTRY;
+ ACE_CHECK_RETURN (0);
+ return 1;
+}
+
+// Used to establish a connection between two endpoints
+// directly, i.e. without a MMDevice
+CORBA::Boolean
+TAO_StreamCtrl::bind (AVStreams::StreamEndPoint_A_ptr sep_a,
+ AVStreams::StreamEndPoint_B_ptr sep_b,
+ AVStreams::streamQoS &stream_qos,
+ const AVStreams::flowSpec &flow_spec
+ ACE_ENV_ARG_DECL)
+ ACE_THROW_SPEC ((CORBA::SystemException,
+ AVStreams::streamOpFailed,
+ AVStreams::noSuchFlow,
+ AVStreams::QoSRequestFailed))
+{
+ this->sep_a_ = AVStreams::StreamEndPoint_A::_duplicate(sep_a);
+ this->sep_b_ = AVStreams::StreamEndPoint_B::_duplicate(sep_b);
+
+ int result = 0;
+ ACE_TRY
+ {
+ if (CORBA::is_nil (sep_a_.in() ) ||
+ CORBA::is_nil (sep_b_.in() ))
+ ACE_ERROR_RETURN ((LM_ERROR,
+ "(%P|%t) TAO_StreamCtrl::bind:"
+ "a_party or b_party null!"),
+ 0);
+
+ // Define each other as their peers.
+ CORBA::Any sep_any;
+ sep_any <<= sep_b;
+ sep_a_->define_property ("PeerAdapter",
+ sep_any
+ ACE_ENV_ARG_PARAMETER);
+ ACE_TRY_CHECK;
+ sep_any <<= sep_a;
+ sep_b_->define_property ("PeerAdapter",
+ sep_any
+ ACE_ENV_ARG_PARAMETER);
+ ACE_TRY_CHECK;
+ // since its full profile we do the viable stream setup algorithm.
+ // get the flows for the A streamendpoint.
+ // the flows spec is empty and hence we do a exhaustive match.
+ AVStreams::flowSpec a_flows, b_flows;
+ CORBA::Any_var flows_any;
+ flows_any = sep_a_->get_property_value ("Flows" ACE_ENV_ARG_PARAMETER);
+ ACE_TRY_CHECK;
+ AVStreams::flowSpec *temp_flows;
+ flows_any.in () >>= temp_flows;
+ a_flows = *temp_flows;
+ flows_any = sep_b_->get_property_value ("Flows" ACE_ENV_ARG_PARAMETER);
+ ACE_TRY_CHECK;
+ flows_any.in () >>= temp_flows;
+ b_flows = *temp_flows;
+ u_int i;
+ FlowEndPoint_Map *a_fep_map;
+ FlowEndPoint_Map *b_fep_map;
+ ACE_NEW_RETURN (a_fep_map,
+ FlowEndPoint_Map,
+ 0);
+ ACE_NEW_RETURN (b_fep_map,
+ FlowEndPoint_Map,
+ 0);
+ for (i=0;i<a_flows.length ();i++)
+ {
+ const char *flowname = a_flows[i];
+ // get the flowendpoint references.
+ CORBA::Object_var fep_obj =
+ sep_a_->get_fep (flowname
+ ACE_ENV_ARG_PARAMETER);
+ ACE_TRY_CHECK;
+ AVStreams::FlowEndPoint_var fep =
+ AVStreams::FlowEndPoint::_narrow (fep_obj.in ()
+ ACE_ENV_ARG_PARAMETER);
+ ACE_TRY_CHECK;
+ ACE_CString fep_key (flowname);
+ result = a_fep_map->bind (fep_key, fep);
+ if (result == -1)
+ if (TAO_debug_level > 0) ACE_DEBUG ((LM_DEBUG, "TAO_StreamCtrl::bind failed for %s\n", flowname));
+ }
+ // get the flowendpoints for streamendpoint_b
+ for (i=0;i<b_flows.length ();i++)
+ {
+ const char *flowname = b_flows[i];
+ // get the flowendpoint references.
+ CORBA::Object_var fep_obj =
+ sep_b->get_fep (flowname
+ ACE_ENV_ARG_PARAMETER);
+ ACE_TRY_CHECK;
+ AVStreams::FlowEndPoint_var fep =
+ AVStreams::FlowEndPoint::_narrow (fep_obj.in ()
+ ACE_ENV_ARG_PARAMETER);
+ ACE_TRY_CHECK;
+ ACE_CString fep_key (flowname);
+ result = b_fep_map->bind (fep_key, fep);
+ if (result == -1)
+ if (TAO_debug_level > 0) ACE_DEBUG ((LM_DEBUG, "TAO_StreamCtrl::bind failed for %s\n", flowname));
+ }
+ FlowEndPoint_Map *map_a = 0, *map_b = 0;
+ if (flow_spec.length () == 0)
+ {
+ map_a = a_fep_map;
+ map_b = b_fep_map;
+ }
+ else
+ {
+ FlowEndPoint_Map *spec_fep_map_a, *spec_fep_map_b;
+ ACE_NEW_RETURN (spec_fep_map_a,
+ FlowEndPoint_Map,
+ 0);
+ ACE_NEW_RETURN (spec_fep_map_b,
+ FlowEndPoint_Map,
+ 0);
+ for (i=0; i< flow_spec.length ();i++)
+ {
+ TAO_Forward_FlowSpec_Entry *entry = 0;
+ ACE_NEW_RETURN (entry,
+ TAO_Forward_FlowSpec_Entry,
+ 0);
+ entry->parse (flow_spec[i]);
+ ACE_CString fep_key (entry->flowname ());
+ AVStreams::FlowEndPoint_var fep;
+ result = a_fep_map->find (fep_key, fep);
+ if (result == -1)
+ ACE_ERROR_RETURN ((LM_ERROR, "Fep not found on A side for flowname: %s\n", flow_spec[i]), 0);
+
+ result = spec_fep_map_a->bind (fep_key, fep);
+ if (result == -1)
+ if (TAO_debug_level > 0) ACE_DEBUG ((LM_DEBUG, "Bind failed for %s\n", flow_spec[i]));
+
+ result = b_fep_map->find (fep_key, fep);
+ if (result == -1)
+ ACE_ERROR_RETURN ((LM_ERROR, "Fep not found on B side for flowname: %s\n", flow_spec[i]), 0);
+
+ result = spec_fep_map_b->bind (fep_key, fep);
+ if (result == -1)
+ if (TAO_debug_level > 0) ACE_DEBUG ((LM_DEBUG, "Bind failed for %s\n", flow_spec[i]));
+ }
+ map_a = spec_fep_map_a;
+ map_b = spec_fep_map_b;
+ }
+
+ TAO_AV_QoS qos (stream_qos);
+ // Now go thru the list of flow endpoint and match them.
+ // uses the first match policy.
+ FlowEndPoint_Map_Iterator a_feps_iterator (*map_a);
+ FlowEndPoint_Map_Entry *a_feps_entry, *b_feps_entry;
+ ACE_TRY_EX (flow_connect)
+ {
+
+ for (;a_feps_iterator.next (a_feps_entry) != 0;
+ a_feps_iterator.advance ())
+ {
+ AVStreams::FlowEndPoint_var fep_a = a_feps_entry->int_id_;
+ AVStreams::FlowEndPoint_var connected_to =
+ fep_a->get_connected_fep (ACE_ENV_SINGLE_ARG_PARAMETER);
+ ACE_TRY_CHECK_EX (flow_connect);
+
+ if (!CORBA::is_nil (connected_to.in ()))
+ {
+ // Skip this one, it is already connected...
+ continue;
+ }
+
+ FlowEndPoint_Map_Iterator b_feps_iterator (*map_b);
+ for (;b_feps_iterator.next (b_feps_entry) != 0;
+ b_feps_iterator.advance ())
+ {
+ AVStreams::FlowEndPoint_var fep_b = b_feps_entry->int_id_;
+ AVStreams::FlowConnection_var flow_connection;
+
+ AVStreams::FlowEndPoint_var connected_to =
+ fep_b->get_connected_fep (ACE_ENV_SINGLE_ARG_PARAMETER);
+ ACE_TRY_CHECK_EX (flow_connect);
+
+ if (!CORBA::is_nil (connected_to.in ()))
+ {
+ // Skip this one, it is already connected...
+ continue;
+ }
+
+ if (fep_a->is_fep_compatible (fep_b.in()
+ ACE_ENV_ARG_PARAMETER) == 1)
+ {
+ ACE_TRY_CHECK_EX (flow_connect);
+ // assume that flow names are same so that we
+ // can use either of them.
+ CORBA::Object_var flow_connection_obj;
+ CORBA::Any_var flowname_any =
+ fep_a->get_property_value ("FlowName"
+ ACE_ENV_ARG_PARAMETER);
+ ACE_TRY_CHECK_EX (flow_connect);
+ const char *flowname = 0;
+ flowname_any.in () >>= flowname;
+ ACE_TRY_EX (flow_connection)
+ {
+ flow_connection_obj =
+ this->get_flow_connection (flowname
+ ACE_ENV_ARG_PARAMETER);
+ ACE_TRY_CHECK_EX (flow_connection);
+ flow_connection =
+ AVStreams::FlowConnection::_narrow (flow_connection_obj.in ()
+ ACE_ENV_ARG_PARAMETER);
+ ACE_TRY_CHECK_EX (flow_connection);
+ }
+ ACE_CATCHANY
+ {
+ TAO_FlowConnection *flowConnection;
+ ACE_NEW_RETURN (flowConnection,
+ TAO_FlowConnection,
+ 0);
+ flow_connection = flowConnection->_this (ACE_ENV_SINGLE_ARG_PARAMETER);
+ ACE_TRY_CHECK_EX (flow_connect);
+ this->set_flow_connection (flowname,
+ flow_connection.in ()
+ ACE_ENV_ARG_PARAMETER);
+ ACE_TRY_CHECK_EX (flow_connect);
+ }
+ ACE_ENDTRY;
+ ACE_CHECK_RETURN (0);
+
+ // make sure that a_feps is flow_producer
+ // and b_feps is flow_consumer
+ // There should be a way to find which flow
+ // endpoint is producer and which is
+ // consumer.
+
+ AVStreams::FlowProducer_var producer;
+ AVStreams::FlowConsumer_var consumer;
+
+ ACE_TRY_EX (producer_check)
+ {
+ producer =
+ AVStreams::FlowProducer::_narrow (fep_a.in()
+ ACE_ENV_ARG_PARAMETER);
+ ACE_TRY_CHECK_EX (producer_check);
+ consumer =
+ AVStreams::FlowConsumer::_narrow (fep_b.in()
+ ACE_ENV_ARG_PARAMETER);
+ ACE_TRY_CHECK_EX (producer_check);
+
+ // If the types don't match then try in
+ // the opposite order
+ if (CORBA::is_nil (producer.in ()))
+ {
+ producer =
+ AVStreams::FlowProducer::_narrow (fep_b.in()
+ ACE_ENV_ARG_PARAMETER);
+ ACE_TRY_CHECK_EX (producer_check);
+ consumer =
+ AVStreams::FlowConsumer::_narrow (fep_a.in()
+ ACE_ENV_ARG_PARAMETER);
+ ACE_TRY_CHECK_EX (producer_check);
+ }
+ // At this point they should both be
+ // non-nil
+ // @@ raise an exception (which one?) if
+ // this is not true...
+ ACE_ASSERT (!CORBA::is_nil (producer.in ()));
+ ACE_ASSERT (!CORBA::is_nil (consumer.in ()));
+ }
+ ACE_CATCHANY
+ {
+ //Yamuna : Recheck this
+ ACE_RE_THROW;//_EX (producer_check);
+ }
+ ACE_ENDTRY;
+ ACE_CHECK_RETURN (0);
+ CORBA::String_var fep_a_name, fep_b_name;
+ flowname_any = fep_a->get_property_value ("FlowName"
+ ACE_ENV_ARG_PARAMETER);
+ const char *temp_name;
+ flowname_any.in () >>= temp_name;
+ fep_a_name = CORBA::string_dup (temp_name);
+ flowname_any = fep_b->get_property_value ("FlowName"
+ ACE_ENV_ARG_PARAMETER);
+ flowname_any.in () >>= temp_name;
+ fep_b_name = CORBA::string_dup (temp_name);
+ AVStreams::QoS flow_qos;
+ flow_qos.QoSType = fep_a_name;
+ flow_qos.QoSParams.length (0);
+ result = qos.get_flow_qos (fep_a_name.in (), flow_qos);
+ if (result == -1)
+ {
+ flow_qos.QoSType = fep_b_name;
+ result = qos.get_flow_qos (fep_b_name.in (),
+ flow_qos);
+ if (result == -1 && TAO_debug_level > 0)
+ ACE_DEBUG ((LM_DEBUG,
+ "No QoS Specified for this flow <%s>\n", flowname));
+ }
+ flow_connection->connect (producer.in (),
+ consumer.in (),
+ flow_qos
+ ACE_ENV_ARG_PARAMETER);
+ ACE_TRY_CHECK_EX (flow_connect);
+ }
+ }
+ }
+ }
+ ACE_CATCHANY
+ {
+ ACE_PRINT_EXCEPTION (ACE_ANY_EXCEPTION,
+ "TAO_StreamCtrl::bind:flow_connect block");
+ return 0;
+ }
+ ACE_ENDTRY;
+ ACE_CHECK_RETURN (0);
+ }
+ ACE_CATCHANY
+ {
+ // error was thrown because one of the streamendpoints is light profile.
+ // Now connect the streams together
+ this->sep_a_->connect (this->sep_b_.in (),
+ stream_qos,
+ flow_spec
+ ACE_ENV_ARG_PARAMETER);
+ ACE_TRY_CHECK;
+ }
+ ACE_ENDTRY;
+ ACE_CHECK_RETURN (0);
+ return 1;
+}
+
+void
+TAO_StreamCtrl::unbind (ACE_ENV_SINGLE_ARG_DECL)
+ ACE_THROW_SPEC ((CORBA::SystemException,
+ AVStreams::streamOpFailed))
+{
+ ACE_TRY
+ {
+ if (this->flow_connection_map_.current_size () > 0)
+ return;
+
+ AVStreams::flowSpec flow_spec;
+ flow_spec.length(0);
+
+ MMDevice_Map_Iterator a_iterator (this->mmdevice_a_map_);
+ MMDevice_Map::ENTRY *entry = 0;
+ for (;a_iterator.next (entry)!= 0;a_iterator.advance ())
+ {
+ entry->int_id_.sep_->destroy (flow_spec ACE_ENV_ARG_PARAMETER);
+ ACE_TRY_CHECK;
+ }
+ MMDevice_Map_Iterator b_iterator (this->mmdevice_b_map_);
+ for (;b_iterator.next (entry)!= 0;b_iterator.advance ())
+ {
+ entry->int_id_.sep_->destroy (flow_spec ACE_ENV_ARG_PARAMETER);
+ ACE_TRY_CHECK;
+ }
+ }
+ ACE_CATCHANY
+ {
+ ACE_PRINT_EXCEPTION (ACE_ANY_EXCEPTION, "TAO_StreamCtrl::unbind");
+ return;
+ }
+ ACE_ENDTRY;
+ ACE_CHECK;
+}
+
+void
+TAO_StreamCtrl::unbind_party (AVStreams::StreamEndPoint_ptr /* the_ep */,
+ const AVStreams::flowSpec &/* the_spec */
+ ACE_ENV_ARG_DECL_NOT_USED)
+ ACE_THROW_SPEC ((CORBA::SystemException,
+ AVStreams::streamOpFailed,
+ AVStreams::noSuchFlow))
+{
+}
+
+void
+TAO_StreamCtrl::unbind_dev (AVStreams::MMDevice_ptr /* dev */,
+ const AVStreams::flowSpec & /* the_spec */
+ ACE_ENV_ARG_DECL_NOT_USED)
+ ACE_THROW_SPEC ((CORBA::SystemException,
+ AVStreams::streamOpFailed,
+ AVStreams::noSuchFlow))
+{
+}
+
+AVStreams::VDev_ptr
+TAO_StreamCtrl::get_related_vdev (AVStreams::MMDevice_ptr adev,
+ AVStreams::StreamEndPoint_out sep
+ ACE_ENV_ARG_DECL_NOT_USED)
+ ACE_THROW_SPEC ((CORBA::SystemException,
+ AVStreams::streamOpFailed))
+{
+ MMDevice_Map_Hash_Key key (adev);
+ MMDevice_Map_Entry entry;
+ int result = -1;
+ result = this->mmdevice_a_map_.find (key, entry);
+ if (result < 0)
+ {
+ result = this->mmdevice_a_map_.find (key, entry);
+ if (result < 0)
+ return AVStreams::VDev::_nil ();
+ }
+ sep = AVStreams::StreamEndPoint::_duplicate (entry.sep_.in ());
+ return AVStreams::VDev::_duplicate (entry.vdev_.in ());
+}
+
+CORBA::Boolean
+
+TAO_StreamCtrl::modify_QoS (AVStreams::streamQoS &new_qos,
+ const AVStreams::flowSpec &the_spec
+ ACE_ENV_ARG_DECL)
+ ACE_THROW_SPEC ((CORBA::SystemException,
+ AVStreams::noSuchFlow,
+ AVStreams::QoSRequestFailed))
+{
+ if (TAO_debug_level > 0)
+ ACE_DEBUG ((LM_DEBUG,
+ "TAO_StreamCtrl::modify_QoS\n"));
+
+
+ if (this->mcastconfigif_ != 0)
+ {
+ // call modify_Qos on the root VDev which is the mcast configif.
+ if (TAO_debug_level > 0) ACE_DEBUG ((LM_DEBUG, "Cannot Modify the Qos for multipoint streams\n"));
+ }
+ else
+ {
+ ACE_TRY
+ {
+ AVStreams::flowSpec in_flowspec;
+ AVStreams::flowSpec out_flowspec;
+
+ in_flowspec.length (0);
+ out_flowspec.length (0);
+
+ int in_index = 0;
+ int out_index = 0;
+
+ AVStreams::flowSpec flowspec;
+ if (the_spec.length () == 0)
+ {
+ // Apply modify_qos to all the flows
+ flowspec = this->flows_;
+ MMDevice_Map_Iterator iterator (this->mmdevice_a_map_);
+ MMDevice_Map::ENTRY *entry = 0;
+ for (;iterator.next (entry) != 0;iterator.advance ())
+ {
+ flowspec = entry->int_id_.flowspec_;
+ }
+ }
+ else
+ {
+ flowspec = the_spec;
+ }
+
+ if (TAO_debug_level > 0)
+ ACE_DEBUG ((LM_DEBUG,
+ "TAO_StreamCtrl::modify_QoS\n"));
+
+
+ for (u_int i=0;i < flowspec.length ();i++)
+ {
+ TAO_Forward_FlowSpec_Entry entry;
+ entry.parse (flowspec [i]);
+ int direction = entry.direction ();
+ if (direction == 0)
+ {
+ in_flowspec.length (in_index + 1);
+ in_flowspec [in_index++] = CORBA::string_dup (entry.entry_to_string ());
+ }
+ else
+ {
+ out_flowspec.length (out_index + 1);
+ out_flowspec [out_index++] = CORBA::string_dup (entry.entry_to_string ());
+ }
+ }
+
+ if (in_flowspec.length () != 0)
+ {
+ this->vdev_a_->modify_QoS (new_qos, in_flowspec ACE_ENV_ARG_PARAMETER);
+ ACE_TRY_CHECK;
+ }
+
+ if (out_flowspec.length () != 0)
+ {
+ this->vdev_b_->modify_QoS (new_qos, out_flowspec ACE_ENV_ARG_PARAMETER);
+ ACE_TRY_CHECK;
+ }
+ }
+ ACE_CATCHANY
+ {
+ ACE_PRINT_EXCEPTION (ACE_ANY_EXCEPTION, "TAO_StreamCtrl::modify_QoS");
+ return 0;
+ }
+ ACE_ENDTRY;
+ ACE_CHECK_RETURN (0);
+
+ }
+ return 1;
+}
+
+// ----------------------------------------------------------------------
+// TAO_MCastConfigIf
+// ----------------------------------------------------------------------
+
+TAO_MCastConfigIf::TAO_MCastConfigIf (void)
+ :peer_list_iterator_ (peer_list_)
+{
+}
+
+TAO_MCastConfigIf::~TAO_MCastConfigIf (void)
+{
+ //no-op
+}
+
+// In future this should be a multicast message instead of point-to-point unicasts.
+CORBA::Boolean
+TAO_MCastConfigIf::set_peer (CORBA::Object_ptr peer,
+ AVStreams::streamQoS & qos,
+ const AVStreams::flowSpec & flow_spec
+ ACE_ENV_ARG_DECL)
+ ACE_THROW_SPEC ((CORBA::SystemException,
+ AVStreams::QoSRequestFailed,
+ AVStreams::streamOpFailed))
+{
+ ACE_TRY
+ {
+ Peer_Info *info;
+ ACE_NEW_RETURN (info,
+ Peer_Info,
+ 0);
+ info->peer_ = AVStreams::VDev::_narrow (peer ACE_ENV_ARG_PARAMETER);
+ ACE_TRY_CHECK;
+ info->qos_ = qos;
+ info->flow_spec_ = flow_spec;
+ this->peer_list_.insert_tail (info);
+ }
+ ACE_CATCHANY
+ {
+ ACE_PRINT_EXCEPTION (ACE_ANY_EXCEPTION, "TAO_MCastConfigIf::set_peer");
+ return 0;
+ }
+ ACE_ENDTRY;
+ ACE_CHECK_RETURN (0);
+ return 1;
+}
+
+// In future this should be a multicast message instead of point-to-point unicasts.
+void
+TAO_MCastConfigIf::configure (const CosPropertyService::Property & a_configuration
+ ACE_ENV_ARG_DECL)
+ ACE_THROW_SPEC ((CORBA::SystemException))
+{
+ Peer_Info *info;
+ ACE_TRY
+ {
+ for (this->peer_list_iterator_.first ();
+ (info = this->peer_list_iterator_.next ()) != 0;
+ this->peer_list_iterator_.advance ())
+ {
+ info->peer_->configure (a_configuration ACE_ENV_ARG_PARAMETER);
+ ACE_TRY_CHECK;
+ }
+ }
+ ACE_CATCHANY
+ {
+ ACE_PRINT_EXCEPTION (ACE_ANY_EXCEPTION, "TAO_MCastConfigIf::set_configure");
+ return;
+ }
+ ACE_ENDTRY;
+ ACE_CHECK;
+}
+
+
+void
+TAO_MCastConfigIf::set_initial_configuration (const CosPropertyService::Properties &initial
+ ACE_ENV_ARG_DECL_NOT_USED)
+ ACE_THROW_SPEC ((CORBA::SystemException))
+{
+ this->initial_configuration_ = initial;
+}
+
+// In future this should be a multicast message instead of point-to-point unicasts.
+void
+TAO_MCastConfigIf::set_format (const char * flowName,
+ const char * format_name
+ ACE_ENV_ARG_DECL)
+ ACE_THROW_SPEC ((CORBA::SystemException,
+ AVStreams::notSupported))
+{
+ Peer_Info *info;
+ ACE_TRY
+ {
+ for (this->peer_list_iterator_.first ();
+ (info = this->peer_list_iterator_.next ()) != 0;
+ this->peer_list_iterator_.advance ())
+ {
+ if (this->in_flowSpec (info->flow_spec_, flowName))
+ {
+ info->peer_->set_format (flowName, format_name ACE_ENV_ARG_PARAMETER);
+ ACE_TRY_CHECK;
+ }
+ }
+ }
+ ACE_CATCHANY
+ {
+ ACE_PRINT_EXCEPTION (ACE_ANY_EXCEPTION, "TAO_MCastConfigIf::set_format");
+ return;
+ }
+ ACE_ENDTRY;
+ ACE_CHECK;
+}
+
+// In future this should be a multicast message instead of point-to-point unicasts.
+void
+TAO_MCastConfigIf::set_dev_params (const char * flowName,
+ const CosPropertyService::Properties & new_params
+ ACE_ENV_ARG_DECL)
+ ACE_THROW_SPEC ((CORBA::SystemException,
+ AVStreams::PropertyException,
+ AVStreams::streamOpFailed))
+{
+ Peer_Info *info;
+ ACE_TRY
+ {
+
+ for (this->peer_list_iterator_.first ();
+ (info = this->peer_list_iterator_.next ()) != 0;
+ this->peer_list_iterator_.advance ())
+ {
+ if (this->in_flowSpec (info->flow_spec_, flowName))
+ {
+ info->peer_->set_dev_params (flowName, new_params ACE_ENV_ARG_PARAMETER);
+ ACE_TRY_CHECK;
+ }
+ }
+ }
+ ACE_CATCHANY
+ {
+ ACE_PRINT_EXCEPTION (ACE_ANY_EXCEPTION, "TAO_MCastConfigIf::set_dev_params");
+ return;
+ }
+ ACE_ENDTRY;
+ ACE_CHECK;
+}
+
+int
+TAO_MCastConfigIf::in_flowSpec (const AVStreams::flowSpec& flow_spec, const char *flow_name)
+{
+ size_t len = ACE_OS::strlen (flow_name);
+ for (CORBA::ULong i = 0; i < flow_spec.length (); i++)
+ if (ACE_OS::strncmp (flow_spec[i], flow_name, len) == 0)
+ {
+ return 1;
+ }
+ return 0;
+}
+
+// ----------------------------------------------------------------------
+// TAO_Base_StreamEndPoint
+// ----------------------------------------------------------------------
+
+TAO_Base_StreamEndPoint::TAO_Base_StreamEndPoint (void)
+ : protocol_object_set_ (0)
+{
+}
+
+TAO_Base_StreamEndPoint::~TAO_Base_StreamEndPoint (void)
+{
+}
+
+int
+TAO_Base_StreamEndPoint::handle_close (void)
+{
+ // This method should not be defined, but EGCS complains endlessly
+ // about it.
+ return -1;
+}
+
+int
+TAO_Base_StreamEndPoint::handle_open (void)
+{
+ return 0;
+}
+
+int
+TAO_Base_StreamEndPoint::handle_stop (const AVStreams::flowSpec &
+ ACE_ENV_ARG_DECL_NOT_USED)
+{
+ return 0;
+}
+
+int
+TAO_Base_StreamEndPoint::handle_start (const AVStreams::flowSpec &
+ ACE_ENV_ARG_DECL_NOT_USED)
+{
+ return 0;
+}
+
+int
+TAO_Base_StreamEndPoint::handle_destroy (const AVStreams::flowSpec &
+ ACE_ENV_ARG_DECL_NOT_USED)
+{
+ return 0;
+}
+
+// The following function is for backward compatibility.
+CORBA::Boolean
+TAO_Base_StreamEndPoint::handle_preconnect (AVStreams::flowSpec &)
+{
+ return 1;
+}
+
+// The following function is for backward compatibility.
+CORBA::Boolean
+TAO_Base_StreamEndPoint::handle_postconnect (AVStreams::flowSpec &)
+{
+
+ while (!this->is_protocol_object_set ())
+ TAO_AV_CORE::instance ()->orb ()->perform_work ();
+ return 1;
+}
+
+// The following function is for backward compatibility.
+CORBA::Boolean
+TAO_Base_StreamEndPoint::handle_connection_requested (AVStreams::flowSpec &
+ ACE_ENV_ARG_DECL_NOT_USED)
+{
+ return 1;
+}
+
+int
+TAO_Base_StreamEndPoint::set_protocol_object (const char * /*flowname*/,
+ TAO_AV_Protocol_Object * /*sfp_object*/)
+{
+ return -1;
+}
+
+void
+TAO_Base_StreamEndPoint::protocol_object_set (void)
+{
+ this->protocol_object_set_ = 1;
+}
+
+
+int
+TAO_Base_StreamEndPoint::is_protocol_object_set (void)
+{
+ return this->protocol_object_set_;
+}
+
+int
+TAO_Base_StreamEndPoint::get_callback (const char * /*flowname*/,
+ TAO_AV_Callback *&/*sfp_callback*/)
+{
+ return -1;
+}
+
+int
+TAO_Base_StreamEndPoint::get_control_callback (const char * /*flowname*/,
+ TAO_AV_Callback *&/*sfp_callback*/)
+{
+ return -1;
+}
+
+void
+TAO_Base_StreamEndPoint::set_flow_handler (const char *flowname,
+ TAO_AV_Flow_Handler *handler)
+{
+ if(TAO_debug_level > 1)
+ {
+ ACE_DEBUG ((LM_DEBUG, "(%N,%l) TAO_Base_StreamEndPoint::set_flow_handler(), flowname: %s\n", flowname));
+ }
+ ACE_CString flow_name_key (flowname);
+ if (this->flow_handler_map_.bind (flow_name_key, handler) != 0)
+ ACE_ERROR ((LM_ERROR,
+ "Error in storing flow handler\n"));
+}
+
+void
+TAO_Base_StreamEndPoint::set_control_flow_handler (const char *flowname,
+ TAO_AV_Flow_Handler *handler)
+{
+ ACE_CString flow_name_key (flowname);
+ if (this->control_flow_handler_map_.bind (flow_name_key, handler) != 0)
+ ACE_ERROR ((LM_ERROR,
+ "Error in storing control flow handler\n"));
+}
+
+// ----------------------------------------------------------------------
+// TAO_StreamEndPoint
+// ----------------------------------------------------------------------
+
+// constructor.
+
+TAO_StreamEndPoint::TAO_StreamEndPoint (void)
+ :flow_count_ (0),
+ flow_num_ (0),
+ mcast_port_ (ACE_DEFAULT_MULTICAST_PORT+1)
+{
+ //is->mcast_addr_ = ACE_OS::inet_addr (ACE_DEFAULT_MULTICAST_ADDR);
+ this->mcast_addr_.set (ACE_DEFAULT_MULTICAST_ADDR);
+ if (TAO_debug_level > 0) ACE_DEBUG ((LM_DEBUG, "TAO_StreamEndPoint::TAO_StreamEndPoint::mcast_addr = %s", this->mcast_addr_.c_str ()));
+ // this->handle_open ();
+}
+
+
+CORBA::Boolean
+TAO_StreamEndPoint::connect (AVStreams::StreamEndPoint_ptr responder,
+ AVStreams::streamQoS &qos,
+ const AVStreams::flowSpec &the_spec
+ ACE_ENV_ARG_DECL)
+ ACE_THROW_SPEC ((CORBA::SystemException,
+ AVStreams::noSuchFlow,
+ AVStreams::QoSRequestFailed,
+ AVStreams::streamOpFailed))
+{
+ if (TAO_debug_level > 0)
+ ACE_DEBUG ((LM_DEBUG, "TAO_StreamEndPoint::Connect ()\n"));
+ CORBA::Boolean retv = 0;
+ this->peer_sep_ = AVStreams::StreamEndPoint::_duplicate (responder);
+ ACE_TRY_EX (negotiate)
+ {
+ if (!CORBA::is_nil (this->negotiator_.in ()))
+ {
+ ACE_DEBUG ((LM_DEBUG,
+ "NEGOTIATOR AVIALABLE\n"));
+
+ CORBA::Any_var negotiator_any = responder->get_property_value ("Negotiator");
+
+ AVStreams::Negotiator_ptr peer_negotiator;
+ negotiator_any.in () >>= peer_negotiator;
+ if (!CORBA::is_nil (peer_negotiator))
+ {
+ CORBA::Boolean result =
+ this->negotiator_->negotiate (peer_negotiator,
+ qos
+ ACE_ENV_ARG_PARAMETER);
+ ACE_TRY_CHECK_EX (negotiate);
+ if (!result)
+ if (TAO_debug_level > 0)
+ ACE_DEBUG ((LM_DEBUG, "TAO_StreamEndPoint::Connect (): negotiate failed\n"));
+ }
+ }
+ }
+ ACE_CATCHANY
+ {
+ ACE_PRINT_EXCEPTION (ACE_ANY_EXCEPTION, "TAO_StreamEndPoint::negotiate");
+ }
+ ACE_ENDTRY;
+ ACE_CHECK_RETURN (0);
+
+ ACE_TRY_EX (available_protocols)
+ {
+ if (this->protocols_.length () > 0)
+ {
+ // choose protocols based on what the remote endpoint can support.
+ CORBA::Any_var protocols_any =
+ responder->get_property_value ("AvailableProtocols" ACE_ENV_ARG_PARAMETER);
+ ACE_TRY_CHECK_EX (available_protocols);
+ AVStreams::protocolSpec peer_protocols;
+ AVStreams::protocolSpec *temp_protocols;
+ protocols_any.in () >>= temp_protocols;
+ peer_protocols = *temp_protocols;
+ for (u_int i=0;i<peer_protocols.length ();i++)
+ {
+ for (u_int j=0;j<this->protocols_.length ();j++)
+ if (ACE_OS::strcmp (peer_protocols [i],
+ this->protocols_[j]) == 0)
+ {
+ // we'll agree upon the first protocol that matches.
+ this->protocol_ = CORBA::string_dup (peer_protocols [i]);
+ break;
+ }
+ }
+ }
+ }
+ ACE_CATCHANY
+ {
+ if (TAO_debug_level > 0) ACE_DEBUG ((LM_DEBUG, "Availableprotocols property not defined\n"));
+ }
+ ACE_ENDTRY;
+ ACE_CHECK_RETURN (0);
+ ACE_TRY
+ {
+ AVStreams::streamQoS network_qos;
+ if (qos.length () > 0)
+ {
+ if (TAO_debug_level > 0)
+ ACE_DEBUG ((LM_DEBUG,
+ "QoS is Specified\n"));
+
+ int result = this->translate_qos (qos,
+ network_qos);
+ if (result != 0)
+ if (TAO_debug_level > 0)
+ ACE_DEBUG ((LM_DEBUG,
+ "QoS translation failed\n"));
+
+ this->qos ().set (network_qos);
+ }
+
+
+ AVStreams::flowSpec flow_spec (the_spec);
+ this->handle_preconnect (flow_spec);
+
+ if (TAO_debug_level > 0)
+ ACE_DEBUG ((LM_DEBUG,
+ "TAO_StreamEndPoint::connect: flow_spec_length = %d\n",
+ flow_spec.length ()));
+ u_int i;
+ for (i=0;i<flow_spec.length ();i++)
+ {
+ TAO_Forward_FlowSpec_Entry *entry = 0;
+ ACE_NEW_RETURN (entry,
+ TAO_Forward_FlowSpec_Entry,
+ 0);
+
+ if (entry->parse (flow_spec[i]) == -1)
+ return 0;
+
+ if (TAO_debug_level > 0)
+ ACE_DEBUG ((LM_DEBUG, "TAO_StreamEndPoint::Connect: %s\n", entry->entry_to_string ()));
+
+ this->forward_flow_spec_set.insert (entry);
+ }
+
+ int result =TAO_AV_CORE::instance ()->init_forward_flows (this,
+ this->forward_flow_spec_set,
+ TAO_AV_Core::TAO_AV_ENDPOINT_A,
+ flow_spec);
+
+
+ if (result < 0)
+ ACE_ERROR_RETURN ((LM_ERROR, "%N:%l TAO_AV_Core::init_forward_flows failed\n"), 0);
+
+
+ AVStreams::StreamEndPoint_var streamendpoint = this->_this (ACE_ENV_SINGLE_ARG_PARAMETER);
+ ACE_TRY_CHECK;
+
+ retv = responder->request_connection (streamendpoint.in (),
+ 0,
+ network_qos,
+ flow_spec
+ ACE_ENV_ARG_PARAMETER);
+ ACE_TRY_CHECK;
+
+ if (TAO_debug_level > 0)
+ ACE_DEBUG ((LM_DEBUG, "%N:%l request_connection returned %d\n", retv));
+
+ if (retv == 0)
+ return retv;
+ for (i=0;i<flow_spec.length ();i++)
+ {
+ TAO_Reverse_FlowSpec_Entry *entry = 0;
+ ACE_NEW_RETURN (entry,
+ TAO_Reverse_FlowSpec_Entry,
+ 0);
+ if (entry->parse (flow_spec[i]) == -1)
+ ACE_ERROR_RETURN ((LM_ERROR,
+ "Reverse_Flow_Spec_Set::parse failed\n"),
+ 0);
+
+ if (TAO_debug_level > 0)
+ ACE_DEBUG ((LM_DEBUG,
+ "TAO_StreamEndPoint::Connect: Reverse Flow Spec %s\n",
+ entry->entry_to_string ()));
+
+ this->reverse_flow_spec_set.insert (entry);
+ }
+
+ result = TAO_AV_CORE::instance ()->init_reverse_flows (this,
+ this->forward_flow_spec_set,
+ this->reverse_flow_spec_set,
+ TAO_AV_Core::TAO_AV_ENDPOINT_A);
+ if (result < 0)
+ ACE_ERROR_RETURN ((LM_ERROR,
+ "TAO_AV_Core::init_reverse_flows failed\n"),
+ 0);
+
+ // Make the upcall to the app
+ retv = this->handle_postconnect (flow_spec);
+ }
+ ACE_CATCHANY
+ {
+ ACE_PRINT_EXCEPTION (ACE_ANY_EXCEPTION, "TAO_StreamEndPoint::connect");
+ return 0;
+ }
+ ACE_ENDTRY;
+ ACE_CHECK_RETURN (0);
+ return retv;
+}
+
+int
+TAO_StreamEndPoint::translate_qos (const AVStreams::streamQoS& application_qos,
+ AVStreams::streamQoS& network_qos)
+{
+ u_int len = application_qos.length ();
+ network_qos.length (len);
+ for (u_int i=0;i<len;i++)
+ {
+ network_qos [i].QoSType = application_qos [i].QoSType;
+ network_qos [i].QoSParams = application_qos [i].QoSParams;
+ }
+ return 0;
+}
+
+// Stop the physical flow of data on the stream
+// Empty the_spec --> apply to all flows
+
+void
+TAO_StreamEndPoint::stop (const AVStreams::flowSpec &flow_spec
+ ACE_ENV_ARG_DECL)
+ ACE_THROW_SPEC ((CORBA::SystemException,
+ AVStreams::noSuchFlow))
+{
+ // Make the upcall into the app
+ this->handle_stop (flow_spec ACE_ENV_ARG_PARAMETER);
+ ACE_CHECK;
+
+ if (flow_spec.length () > 0)
+ {
+
+ for (u_int i=0;i<flow_spec.length ();i++)
+ {
+ TAO_AV_FlowSpecSetItor end = this->forward_flow_spec_set.end ();
+ for (TAO_AV_FlowSpecSetItor begin = this->forward_flow_spec_set.begin ();
+ begin != end; ++begin)
+ {
+ TAO_Forward_FlowSpec_Entry entry;
+ entry.parse (flow_spec[i]);
+ if (ACE_OS::strcmp ((*begin)->flowname (), entry.flowname ()) == 0)
+ {
+ TAO_FlowSpec_Entry *entry = *begin;
+ // (*begin)->protocol_object ()->stop ();
+ if (entry->handler() != 0)
+ entry->handler ()->stop (entry->role ());
+ if (entry->control_handler () != 0)
+ entry->control_handler ()->stop (entry->role ());
+ break;
+ }
+ }
+ }
+ }
+ else
+ {
+ TAO_AV_FlowSpecSetItor end = this->forward_flow_spec_set.end ();
+ for (TAO_AV_FlowSpecSetItor begin = this->forward_flow_spec_set.begin ();
+ begin != end; ++begin)
+ {
+ TAO_FlowSpec_Entry *entry = *begin;
+ // entry->protocol_object ()->stop ();
+ if (entry->handler() != 0)
+ entry->handler ()->stop (entry->role ());
+ if (entry->control_handler () != 0)
+ entry->control_handler ()->stop (entry->role ());
+ }
+ }
+}
+
+// Start the physical flow of data on the stream
+// Empty the_spec --> apply to all flows
+void
+TAO_StreamEndPoint::start (const AVStreams::flowSpec &flow_spec
+ ACE_ENV_ARG_DECL)
+ ACE_THROW_SPEC ((CORBA::SystemException,
+ AVStreams::noSuchFlow))
+{
+ if (TAO_debug_level > 0) ACE_DEBUG ((LM_DEBUG, "TAO_StreamEndPoint::start\n"));
+ // Make the upcall into the app
+ this->handle_start (flow_spec ACE_ENV_ARG_PARAMETER);
+ ACE_CHECK;
+
+ if (flow_spec.length () > 0)
+ {
+ // Now call start on all the flow handlers.
+ for (u_int i=0;i<flow_spec.length ();i++)
+ {
+ TAO_AV_FlowSpecSetItor end = this->forward_flow_spec_set.end ();
+ for (TAO_AV_FlowSpecSetItor forward_begin = this->forward_flow_spec_set.begin ();
+ forward_begin != end; ++forward_begin)
+ {
+ TAO_FlowSpec_Entry *entry = *forward_begin;
+ if (ACE_OS::strcmp (entry->flowname (), flow_spec [i]) == 0)
+ {
+ // entry->protocol_object ()->start ();
+ if (entry->handler () != 0)
+ {
+ entry->handler ()->start (entry->role ());
+ }
+ if (entry->control_handler () != 0)
+ {
+ entry->control_handler ()->start (entry->role ());
+ }
+ }
+ }
+
+ end = this->reverse_flow_spec_set.end ();
+ for (TAO_AV_FlowSpecSetItor reverse_begin = this->reverse_flow_spec_set.begin ();
+ reverse_begin != end; ++reverse_begin)
+ {
+ TAO_FlowSpec_Entry *entry = *reverse_begin;
+ if (ACE_OS::strcmp (entry->flowname (), flow_spec [i]) == 0)
+ {
+ // entry->protocol_object ()->start ();
+ if (entry->handler () != 0)
+ {
+ entry->handler ()->start (entry->role ());
+ }
+ if (entry->control_handler () != 0)
+ {
+ entry->control_handler ()->start (entry->role ());
+ }
+ }
+ }
+ }
+ }
+ else
+ {
+ TAO_AV_FlowSpecSetItor end = this->forward_flow_spec_set.end ();
+ for (TAO_AV_FlowSpecSetItor forwardbegin = this->forward_flow_spec_set.begin ();
+ forwardbegin != end; ++forwardbegin)
+ {
+ TAO_FlowSpec_Entry *entry = *forwardbegin;
+ if (entry->handler () != 0)
+ {
+ entry->handler ()->start (entry->role ());
+ }
+ if (entry->control_handler () != 0)
+ {
+ entry->control_handler ()->start (entry->role ());
+ }
+ }
+
+ end = this->reverse_flow_spec_set.end ();
+ for (TAO_AV_FlowSpecSetItor reversebegin = this->reverse_flow_spec_set.begin ();
+ reversebegin != end; ++reversebegin)
+ {
+ TAO_FlowSpec_Entry *entry = *reversebegin;
+ // entry->protocol_object ()->start ();
+ if (entry->handler () != 0)
+ {
+ entry->handler ()->start (entry->role ());
+ }
+ if (entry->control_handler () != 0)
+ {
+ entry->control_handler ()->start (entry->role ());
+ }
+ }
+ }
+}
+
+// Close the connection
+void
+TAO_StreamEndPoint::destroy (const AVStreams::flowSpec &flow_spec
+ ACE_ENV_ARG_DECL)
+ ACE_THROW_SPEC ((CORBA::SystemException,
+ AVStreams::noSuchFlow))
+{
+ CORBA::Any_var vdev_any = this->get_property_value ("Related_VDev"
+ ACE_ENV_ARG_PARAMETER);
+
+ AVStreams::VDev_ptr vdev;
+
+ vdev_any.in() >>= vdev;
+ CORBA::Any_var mc_any = vdev->get_property_value ("Related_MediaCtrl"
+ ACE_ENV_ARG_PARAMETER);
+
+ // The Related_MediaCtrl property was inserted as a CORBA::Object, so we
+ // must extract it as the same type.
+ CORBA::Object_var obj;
+ mc_any.in() >>= CORBA::Any::to_object( obj.out() );
+
+ AVStreams::MediaControl_var media_ctrl =
+ AVStreams::MediaControl::_narrow( obj.in() );
+
+ // deactivate the associated vdev and media ctrl
+
+ if ( !CORBA::is_nil( vdev ) )
+ {
+ PortableServer::ServantBase_var vdev_servant =
+ TAO_AV_CORE::instance()->poa()->reference_to_servant ( vdev );
+ TAO_AV_Core::deactivate_servant (vdev_servant.in());
+ }
+
+ if ( !CORBA::is_nil ( media_ctrl.in () ) )
+ {
+ PortableServer::ServantBase_var mc_servant =
+ TAO_AV_CORE::instance()->poa()->reference_to_servant (media_ctrl.in());
+ TAO_AV_Core::deactivate_servant (mc_servant.in());
+ }
+
+ int result = TAO_AV_Core::deactivate_servant (this);
+ if (result < 0)
+ if (TAO_debug_level > 0) ACE_DEBUG ((LM_DEBUG, "TAO_StreamEndPoint::destroy failed\n"));
+
+ if (flow_spec.length () > 0)
+ {
+ for (u_int i=0;i<flow_spec.length ();i++)
+ {
+ {
+ TAO_AV_FlowSpecSetItor end = this->forward_flow_spec_set.end ();
+ for (TAO_AV_FlowSpecSetItor begin = this->forward_flow_spec_set.begin ();
+ begin != end; ++begin)
+ {
+ TAO_FlowSpec_Entry *entry = *begin;
+ TAO_Tokenizer flow_name (flow_spec [i], '\\');
+ if (ACE_OS::strcmp (entry->flowname (), flow_name[0]) == 0)
+ {
+ if (entry->protocol_object ())
+ {
+ entry->protocol_object ()->destroy ();
+ }
+ break;
+ }
+ }
+ }
+ {
+ TAO_AV_FlowSpecSetItor end = this->reverse_flow_spec_set.end ();
+ for (TAO_AV_FlowSpecSetItor begin = this->reverse_flow_spec_set.begin ();
+ begin != end; ++begin)
+ {
+ TAO_FlowSpec_Entry *entry = *begin;
+ TAO_Tokenizer flow_name (flow_spec [i], '\\');
+ if (ACE_OS::strcmp (entry->flowname (), flow_name[0]) == 0)
+ {
+ if (entry->protocol_object ())
+ {
+ entry->protocol_object ()->destroy ();
+ }
+ break;
+ }
+ }
+ }
+ }
+ }
+ else
+ {
+ {
+ TAO_AV_FlowSpecSetItor end = this->forward_flow_spec_set.end ();
+ for (TAO_AV_FlowSpecSetItor begin = this->forward_flow_spec_set.begin ();
+ begin != end; ++begin)
+ {
+ TAO_FlowSpec_Entry *entry = *begin;
+ if (entry->protocol_object ())
+ {
+ entry->protocol_object ()->stop ();
+
+ ACE_CString control_flowname =
+ TAO_AV_Core::get_control_flowname (entry->flowname ());
+ TAO_AV_CORE::instance()->remove_acceptor(entry->flowname());
+ TAO_AV_CORE::instance()->remove_acceptor(control_flowname.c_str());
+
+ entry->protocol_object ()->destroy ();
+ }
+ }
+ }
+ {
+ TAO_AV_FlowSpecSetItor end = this->reverse_flow_spec_set.end ();
+ for (TAO_AV_FlowSpecSetItor begin = this->reverse_flow_spec_set.begin ();
+ begin != end; ++begin)
+ {
+ TAO_FlowSpec_Entry *entry = *begin;
+ if (entry->protocol_object ())
+ {
+ entry->protocol_object ()->stop ();
+
+ ACE_CString control_flowname =
+ TAO_AV_Core::get_control_flowname (entry->flowname ());
+ TAO_AV_CORE::instance()->remove_connector(entry->flowname());
+ TAO_AV_CORE::instance()->remove_connector(control_flowname.c_str());
+ entry->protocol_object ()->destroy ();
+
+ }
+ }
+ }
+ }
+
+ // Make the upcall into the app
+ // this->handle_destroy (the_spec ACE_ENV_ARG_PARAMETER);
+ //
+}
+
+// Called by our peer endpoint, requesting us to establish
+// a connection
+CORBA::Boolean
+TAO_StreamEndPoint::request_connection (AVStreams::StreamEndPoint_ptr /*initiator*/,
+ CORBA::Boolean /*is_mcast*/,
+ AVStreams::streamQoS &qos,
+ AVStreams::flowSpec &flow_spec
+ ACE_ENV_ARG_DECL)
+ ACE_THROW_SPEC ((CORBA::SystemException,
+ AVStreams::streamOpDenied,
+ AVStreams::noSuchFlow,
+ AVStreams::QoSRequestFailed,
+ AVStreams::FPError))
+
+{
+ if (TAO_debug_level > 0)
+ ACE_DEBUG ((LM_DEBUG,
+ "\n(%P|%t) TAO_StreamEndPoint::request_connection called"));
+
+ int result = 0;
+ ACE_TRY
+ {
+ AVStreams::streamQoS network_qos;
+ if (qos.length () > 0)
+ {
+ if (TAO_debug_level > 0)
+ ACE_DEBUG ((LM_DEBUG,
+ "QoS is Specified\n"));
+
+ int result = this->translate_qos (qos, network_qos);
+ if (result != 0)
+ if (TAO_debug_level > 0)
+ ACE_DEBUG ((LM_DEBUG, "QoS translation failed\n"));
+
+ this->qos ().set (network_qos);
+ }
+
+ if (TAO_debug_level > 0)
+ ACE_DEBUG ((LM_DEBUG,
+ "\n(%P|%t) TAO_StreamEndPoint::request_connection: "
+ "flowspec has length = %d and the strings are:\n",
+ flow_spec.length ()));
+ CORBA::ULong i;
+
+ for (i=0;i<flow_spec.length ();i++)
+ {
+ TAO_Forward_FlowSpec_Entry *entry = 0;
+ ACE_NEW_RETURN (entry,
+ TAO_Forward_FlowSpec_Entry,
+ 0);
+
+ CORBA::String_var string_entry = CORBA::string_dup (flow_spec[i]);
+
+ if(TAO_debug_level > 0)
+ ACE_DEBUG(( LM_DEBUG,
+ "%N:%l Parsing flow spec: [%s]\n",
+ string_entry.in ()));
+
+ if (entry->parse (string_entry.in ()) == -1)
+ {
+ if (TAO_debug_level > 0)
+ ACE_DEBUG ((LM_DEBUG,
+ "%N:%l Error parsing flow_spec: [%s]\n",
+ string_entry.in ()));
+ return 0;
+ }
+ if (TAO_debug_level > 0)
+ ACE_DEBUG ((LM_DEBUG,
+ "TAO_StreamEndPoint::request_connection flow spec [%s]\n",
+ entry->entry_to_string ()));
+
+ this->forward_flow_spec_set.insert (entry);
+ }
+
+ result = TAO_AV_CORE::instance ()->init_forward_flows (this,
+ this->forward_flow_spec_set,
+ TAO_AV_Core::TAO_AV_ENDPOINT_B,
+ flow_spec);
+
+ if (result < 0)
+ return 0;
+
+ // Make the upcall to the app
+ result = this->handle_connection_requested (flow_spec ACE_ENV_ARG_PARAMETER);
+ ACE_TRY_CHECK;
+ }
+ ACE_CATCHANY
+ {
+ ACE_PRINT_EXCEPTION (ACE_ANY_EXCEPTION,
+ "TAO_StreamEndpoint::request_connection");
+ return 0;
+ }
+ ACE_ENDTRY;
+ ACE_CHECK_RETURN (0);
+ return result;
+}
+
+int
+TAO_StreamEndPoint::change_qos (AVStreams::streamQoS &new_qos,
+ const AVStreams::flowSpec &the_flows
+ ACE_ENV_ARG_DECL_NOT_USED)
+{
+ if (TAO_debug_level > 0)
+ ACE_DEBUG ((LM_DEBUG,
+ "TAO_StreamEndPoint::change_qos\n"));
+
+ TAO_AV_QoS qos (new_qos);
+ for (int i = 0; (unsigned) i < the_flows.length (); i++)
+ {
+ TAO_Forward_FlowSpec_Entry entry;
+ entry.parse (the_flows [i]);
+ ACE_CString flow_name_key (entry.flowname ());
+ Flow_Handler_Map_Entry *handler_entry;
+ if (this->flow_handler_map_.find (flow_name_key,
+ handler_entry) == 0)
+ {
+ AVStreams::QoS flow_qos;
+ if (qos.get_flow_qos (entry.flowname (), flow_qos) != 0)
+ ACE_DEBUG ((LM_DEBUG,
+ "New QoS for the flow %s is not specified\n",
+ entry.flowname ()));
+ int result;
+ result = handler_entry->int_id_->change_qos (flow_qos);
+ if (result != 0)
+ ACE_ERROR_RETURN ((LM_ERROR,
+ "Modifying QoS Failed\n"),
+ -1);
+
+ }
+ }
+ return 0;
+}
+
+// Refers to modification of transport QoS.
+CORBA::Boolean
+TAO_StreamEndPoint::modify_QoS (AVStreams::streamQoS &new_qos,
+ const AVStreams::flowSpec &the_flows
+ ACE_ENV_ARG_DECL)
+ ACE_THROW_SPEC ((CORBA::SystemException,
+ AVStreams::noSuchFlow,
+ AVStreams::QoSRequestFailed))
+{
+ if (TAO_debug_level > 0)
+ ACE_DEBUG ((LM_DEBUG,
+ "TAO_StreamEndPoint::modify_QoS\n"));
+
+ int result = this->change_qos (new_qos, the_flows ACE_ENV_ARG_PARAMETER);
+ ACE_CHECK_RETURN (0);
+
+ if (result != 0)
+ return 0;
+
+ return 1;
+
+}
+
+// Sets the list of protocols this streamendpoint can understand.
+
+CORBA::Boolean
+TAO_StreamEndPoint::set_protocol_restriction (const AVStreams::protocolSpec &protocols
+ ACE_ENV_ARG_DECL)
+ ACE_THROW_SPEC ((CORBA::SystemException))
+{
+ ACE_TRY
+ {
+ CORBA::Any protocol_restriction_any;
+
+ protocol_restriction_any <<= protocols;
+ this->define_property ("ProtocolRestriction",
+ protocol_restriction_any
+ ACE_ENV_ARG_PARAMETER);
+ ACE_TRY_CHECK;
+ this->protocols_ = protocols;
+ }
+ ACE_CATCHANY
+ {
+ ACE_PRINT_EXCEPTION (ACE_ANY_EXCEPTION, "TAO_StreamEndPoint::set_protocol_restriction");
+ return 0;
+ }
+ ACE_ENDTRY;
+ ACE_CHECK_RETURN (0);
+ return 1;
+}
+
+
+void
+TAO_StreamEndPoint::disconnect (const AVStreams::flowSpec &the_spec
+ ACE_ENV_ARG_DECL_NOT_USED)
+ ACE_THROW_SPEC ((CORBA::SystemException,
+ AVStreams::noSuchFlow,
+ AVStreams::streamOpFailed))
+{
+ ACE_UNUSED_ARG (the_spec);
+}
+
+// Sets the status of the flow protocol.
+
+void
+TAO_StreamEndPoint::set_FPStatus (const AVStreams::flowSpec &/*the_spec*/,
+ const char *fp_name,
+ const CORBA::Any &fp_settings
+ ACE_ENV_ARG_DECL_NOT_USED)
+ ACE_THROW_SPEC ((CORBA::SystemException,
+ AVStreams::noSuchFlow,
+ AVStreams::FPError))
+{
+ if (ACE_OS::strcmp (fp_name, "SFP1.0") != 0)
+ return;
+ fp_settings >>= this->sfp_status_;
+ // @@Naga: We should call set_FPStatus on all the protocol objects.
+}
+
+
+CORBA::Object_ptr
+TAO_StreamEndPoint::get_fep (const char *flow_name
+ ACE_ENV_ARG_DECL_NOT_USED)
+ ACE_THROW_SPEC ((CORBA::SystemException,
+ AVStreams::notSupported,
+ AVStreams::noSuchFlow))
+{
+ ACE_CString fep_name_key (flow_name);
+ AVStreams::FlowEndPoint_var fep_entry;
+ if (this->fep_map_.find (fep_name_key, fep_entry) == 0)
+ return fep_entry._retn();
+ return 0;
+}
+
+char*
+TAO_StreamEndPoint::add_fep_i_add_property (AVStreams::FlowEndPoint_ptr fep
+ ACE_ENV_ARG_DECL)
+ ACE_THROW_SPEC ((CORBA::SystemException,
+ AVStreams::notSupported,
+ AVStreams::streamOpFailed))
+{
+ ACE_CString flow_name;
+
+ ACE_TRY
+ {
+ // exception implies the flow name is not defined and is system
+ // generated.
+ flow_name = "flow";
+ char tmp[255];
+ ACE_OS::sprintf (tmp, "%u", this->flow_num_++);
+ flow_name += tmp;
+
+ CORBA::Any flowname_any;
+ flowname_any <<= flow_name.c_str ();
+ fep->define_property ("Flow",
+ flowname_any
+ ACE_ENV_ARG_PARAMETER);
+ ACE_TRY_CHECK;
+ }
+ ACE_CATCHANY
+ {
+ ACE_PRINT_EXCEPTION (ACE_ANY_EXCEPTION,
+ "TAO_StreamEndPoint::add_fep");
+ return 0;
+ }
+ ACE_ENDTRY;
+ return ACE_OS::strdup( flow_name.c_str () );
+}
+
+char*
+TAO_StreamEndPoint::add_fep_i (AVStreams::FlowEndPoint_ptr fep
+ ACE_ENV_ARG_DECL)
+ ACE_THROW_SPEC ((CORBA::SystemException,
+ AVStreams::notSupported,
+ AVStreams::streamOpFailed))
+{
+ CORBA::String_var flow_name;
+ ACE_TRY
+ {
+ CORBA::Any_var flow_name_any =
+ fep->get_property_value ("FlowName" ACE_ENV_ARG_PARAMETER);
+ ACE_TRY_CHECK;
+
+ const char *tmp;
+ flow_name_any >>= tmp;
+ flow_name = CORBA::string_dup (tmp);
+ }
+ ACE_CATCHANY
+ {
+ flow_name =
+ this->add_fep_i_add_property (fep ACE_ENV_ARG_PARAMETER);
+ ACE_CHECK_RETURN (0);
+ }
+ ACE_ENDTRY;
+ return flow_name._retn ();
+}
+
+char *
+TAO_StreamEndPoint::add_fep (CORBA::Object_ptr fep_obj
+ ACE_ENV_ARG_DECL)
+ ACE_THROW_SPEC ((CORBA::SystemException,
+ AVStreams::notSupported,
+ AVStreams::streamOpFailed))
+{
+ AVStreams::FlowEndPoint_var fep =
+ AVStreams::FlowEndPoint::_narrow (fep_obj ACE_ENV_ARG_PARAMETER);
+ ACE_CHECK_RETURN (0);
+
+ CORBA::String_var flow_name =
+ this->add_fep_i (fep.in () ACE_ENV_ARG_PARAMETER);
+ ACE_CHECK_RETURN (0);
+
+ ACE_TRY
+ {
+ fep->lock (ACE_ENV_SINGLE_ARG_PARAMETER);
+ ACE_TRY_CHECK;
+ // Add it to the sequence of flowNames supported.
+ // put the flowname and the flowendpoint in a hashtable.
+ ACE_CString fep_name_key (CORBA::string_dup (flow_name.in ()));
+ if (this->fep_map_.bind (fep_name_key, AVStreams::FlowEndPoint::_duplicate (fep.in ())) != 0)
+ {
+ ACE_THROW_RETURN (AVStreams::streamOpFailed (), 0);
+ }
+ // increment the flow count.
+ this->flow_count_++;
+ this->flows_.length (this->flow_count_);
+ this->flows_[this->flow_count_-1] = flow_name;
+ // define/modify the "Flows" property.
+ CORBA::Any flows_any;
+ flows_any <<= this->flows_;
+ this->define_property ("Flows",
+ flows_any
+ ACE_ENV_ARG_PARAMETER);
+ ACE_TRY_CHECK;
+ }
+ ACE_CATCHANY
+ {
+ ACE_PRINT_EXCEPTION (ACE_ANY_EXCEPTION, "TAO_StreamEndPoint::add_fep");
+ return 0;
+ }
+ ACE_ENDTRY;
+ return flow_name._retn ();
+}
+
+
+void
+TAO_StreamEndPoint::remove_fep (const char *flow_name
+ ACE_ENV_ARG_DECL)
+ ACE_THROW_SPEC ((CORBA::SystemException,
+ AVStreams::notSupported,
+ AVStreams::streamOpFailed))
+{
+ ACE_TRY
+ {
+ ACE_CString fep_name_key (flow_name);
+ AVStreams::FlowEndPoint_var fep_entry;
+ // Remove the fep from the hash table.
+ if (this->fep_map_.unbind (fep_name_key, fep_entry)!= 0)
+ ACE_THROW (AVStreams::streamOpFailed ());
+ // redefine the "Flows" property
+ AVStreams::flowSpec new_flows (this->flows_.length ());
+ for (u_int i=0, j=0 ; i <this->flows_.length (); i++)
+ if (ACE_OS::strcmp (flow_name, this->flows_[i]) != 0)
+ new_flows[j++] = this->flows_[i];
+
+ CORBA::Any flows;
+ flows <<= new_flows;
+ this->flows_ = new_flows;
+ this->define_property ("Flows",
+ flows
+ ACE_ENV_ARG_PARAMETER);
+ ACE_TRY_CHECK;
+ }
+ ACE_CATCHANY
+ {
+ ACE_PRINT_EXCEPTION (ACE_ANY_EXCEPTION, "TAO_StreamEndPoint::remove_fep");
+ }
+ ACE_ENDTRY;
+ ACE_CHECK;
+}
+
+// Sets the negotiator object.
+void
+TAO_StreamEndPoint::set_negotiator (AVStreams::Negotiator_ptr new_negotiator
+ ACE_ENV_ARG_DECL)
+ ACE_THROW_SPEC ((CORBA::SystemException))
+{
+ ACE_TRY
+ {
+ CORBA::Any negotiator;
+ negotiator <<= new_negotiator;
+ this->define_property ("Negotiator",
+ negotiator
+ ACE_ENV_ARG_PARAMETER);
+ ACE_TRY_CHECK;
+ this->negotiator_ = AVStreams::Negotiator::_duplicate (new_negotiator);
+ }
+ ACE_CATCHANY
+ {
+ ACE_PRINT_EXCEPTION (ACE_ANY_EXCEPTION, "TAO_StreamEndPoint::set_negotiator");
+ }
+ ACE_ENDTRY;
+ ACE_CHECK;
+}
+
+
+// Sets the public key used for this streamendpoint.
+void
+TAO_StreamEndPoint::set_key (const char *flow_name,
+ const AVStreams::key & the_key
+ ACE_ENV_ARG_DECL)
+ ACE_THROW_SPEC ((CORBA::SystemException))
+{
+ ACE_TRY
+ {
+ this->key_ = the_key;
+ CORBA::Any PublicKey;
+ PublicKey <<= the_key;
+ char PublicKey_property [BUFSIZ];
+ ACE_OS::sprintf (PublicKey_property, "%s_PublicKey", flow_name);
+ this->define_property (PublicKey_property,
+ PublicKey
+ ACE_ENV_ARG_PARAMETER);
+ ACE_TRY_CHECK;
+ }
+ ACE_CATCHANY
+ {
+ ACE_PRINT_EXCEPTION (ACE_ANY_EXCEPTION, "TAO_StreamEndPoint::set_key");
+ }
+ ACE_ENDTRY;
+ ACE_CHECK;
+}
+
+// Set the source id.
+void
+TAO_StreamEndPoint::set_source_id (CORBA::Long source_id
+ ACE_ENV_ARG_DECL_NOT_USED)
+ ACE_THROW_SPEC ((CORBA::SystemException))
+{
+ this->source_id_ = source_id;
+}
+
+CORBA::Boolean
+TAO_StreamEndPoint::multiconnect (AVStreams::streamQoS &/*the_qos*/,
+ AVStreams::flowSpec &/*flow_spec*/
+ ACE_ENV_ARG_DECL_NOT_USED)
+{
+ if (TAO_debug_level > 0)
+ ACE_DEBUG ((LM_DEBUG, "TAO_StreamEndPoint::multiconnect\n"));
+ return 0;
+}
+
+TAO_StreamEndPoint::~TAO_StreamEndPoint (void)
+{
+ //this->handle_close ();
+ TAO_AV_FlowSpecSetItor begin = this->forward_flow_spec_set.begin ();
+ TAO_AV_FlowSpecSetItor end = this->forward_flow_spec_set.end ();
+
+ int i=0;
+ // @@ Naga: Will the iterator always give the entries in the order of insertion.
+ // or is it an implementation fact of ACE containers.
+ for ( ; begin != end; ++begin, ++i)
+ {
+// if (i >= FLOWSPEC_MAX)
+// {
+ TAO_FlowSpec_Entry *entry = *begin;
+ delete entry;
+ // }
+ }
+ begin = this->reverse_flow_spec_set.begin ();
+ end = this->reverse_flow_spec_set.end ();
+ i = 0;
+ for (; begin != end; ++begin)
+ {
+// if (i >= FLOWSPEC_MAX)
+// {
+ TAO_FlowSpec_Entry *entry = *begin;
+ delete entry;
+ // }
+ }
+}
+
+
+// ----------------------------------------------------------------------
+// TAO_StreamEndPoint_A
+// ----------------------------------------------------------------------
+
+TAO_StreamEndPoint_A::TAO_StreamEndPoint_A (void)
+{
+ if (TAO_debug_level > 0) ACE_DEBUG ((LM_DEBUG, "(%P|%t) TAO_StreamEndPoint_A::TAO_StreamEndPoint_A: created\n"));
+}
+
+// IP Multicast style connect.
+CORBA::Boolean
+TAO_StreamEndPoint_A::multiconnect (AVStreams::streamQoS &stream_qos,
+ AVStreams::flowSpec &flow_spec
+ ACE_ENV_ARG_DECL)
+ ACE_THROW_SPEC ((CORBA::SystemException,
+ AVStreams::noSuchFlow,
+ AVStreams::QoSRequestFailed,
+ AVStreams::streamOpFailed))
+{
+ if (TAO_debug_level > 0) ACE_DEBUG ((LM_DEBUG, "TAO_StreamEndPointA::multiconnect\n"));
+ ACE_TRY
+ {
+ int result = 0;
+ TAO_AV_QoS qos (stream_qos);
+ for (u_int i=0;i< flow_spec.length ();i++)
+ {
+ TAO_Forward_FlowSpec_Entry *forward_entry = 0;
+ ACE_NEW_RETURN (forward_entry,
+ TAO_Forward_FlowSpec_Entry,
+ 0);
+ forward_entry->parse (flow_spec[i]);
+ ACE_CString mcast_key (forward_entry->flowname ());
+ AVStreams::FlowEndPoint_var flow_endpoint;
+
+ // @@Naga: There is a problem in the full profile case for multiconnect. Since
+ // multiconnect on sep_a is called everytime a sink is added and if called for
+ // the same flow twice, the following code will just call add producer on the flow connection.
+ // It is however very hard to find out if the flow producer is already in the flow connection
+ // since comparing object references will not work and the flowproducer reference is
+ // generated by _narrow. Our only hope is that _narrow on the same fep will return the same
+ // pointer for the flowproducer in which case we can find out if the flowproducer exists in
+ // fep set for that flowconnection.
+ if (this->fep_map_.find (mcast_key, flow_endpoint) == 0)
+ {
+ ACE_TRY_EX (narrow)
+ {
+ AVStreams::QoS flow_qos;
+ result = qos.get_flow_qos (forward_entry->flowname (), flow_qos);
+ if (result < 0)
+ if (TAO_debug_level > 0) ACE_DEBUG ((LM_DEBUG, "QoS not found for %s\n", forward_entry->flowname ()));
+ // Narrow it to FlowProducer.
+ AVStreams::FlowProducer_var producer;
+ producer = AVStreams::FlowProducer::_narrow (flow_endpoint.in() ACE_ENV_ARG_PARAMETER);
+ //
+ ACE_TRY_CHECK_EX (narrow);
+ // Else narrow succeeeded.
+ if (!CORBA::is_nil (producer.in ()))
+ {
+ AVStreams::FlowConnection_var flow_connection;
+ ACE_TRY_EX (flow_connection)
+ {
+ if (CORBA::is_nil (this->streamctrl_.in ()))
+ {
+ CORBA::Any_var streamctrl_any;
+ streamctrl_any = this->get_property_value ("Related_StreamCtrl"
+ ACE_ENV_ARG_PARAMETER);
+ ACE_TRY_CHECK;
+ AVStreams::StreamCtrl_ptr streamctrl;
+ streamctrl_any.in () >>= streamctrl;
+ this->streamctrl_ = AVStreams::StreamCtrl::_duplicate (streamctrl);
+ }
+
+ CORBA::Object_var flow_connection_obj =
+ this->streamctrl_->get_flow_connection (forward_entry->flowname ()
+ ACE_ENV_ARG_PARAMETER);
+ ACE_TRY_CHECK_EX (flow_connection);
+ flow_connection = AVStreams::FlowConnection::_narrow (flow_connection_obj.in ()
+ ACE_ENV_ARG_PARAMETER);
+ ACE_TRY_CHECK_EX (flow_connection);
+ }
+ ACE_CATCHANY
+ {
+ TAO_FlowConnection *flowConnection;
+ ACE_NEW_RETURN (flowConnection,
+ TAO_FlowConnection,
+ 0);
+ //@@ Strategize the multicast address allocation.
+ flowConnection->set_mcast_addr (this->mcast_addr_, this->mcast_port_);
+ this->mcast_port_++;
+ flowConnection->set_protocol (forward_entry->carrier_protocol_str ());
+ flow_connection = flowConnection->_this (ACE_ENV_SINGLE_ARG_PARAMETER);
+ ACE_TRY_CHECK;
+ this->streamctrl_->set_flow_connection (forward_entry->flowname (),
+ flow_connection.in ()
+ ACE_ENV_ARG_PARAMETER);
+ ACE_TRY_CHECK;
+ }
+ ACE_ENDTRY;
+ ACE_CHECK_RETURN (0);
+ if (ACE_OS::strcmp (forward_entry->flow_protocol_str (), "") != 0)
+ {
+ CORBA::Any fp_settings;
+ flow_connection->use_flow_protocol (forward_entry->flow_protocol_str (),
+ fp_settings
+ ACE_ENV_ARG_PARAMETER);
+ ACE_TRY_CHECK;
+ }
+ result = flow_connection->add_producer (producer.in (),
+ flow_qos
+ ACE_ENV_ARG_PARAMETER);
+ ACE_TRY_CHECK;
+ if (result == 0)
+ ACE_ERROR_RETURN ((LM_ERROR, "TAO_StreamEndPoint_A::multiconnect: add_producer failed\n"), 0);
+ }
+ }
+ ACE_CATCHANY
+ {
+ // Narrow failed and since its not a flowproducer its an error.
+ ACE_PRINT_EXCEPTION (ACE_ANY_EXCEPTION, "FlowProducer::_narrow");
+ ACE_ERROR_RETURN ((LM_ERROR, "sep_a doesn't contain a flowproducer"), 0);
+ }
+ ACE_ENDTRY;
+ ACE_CHECK_RETURN (0);
+ }
+ else
+ {
+ ACE_INET_Addr *mcast_addr;
+ TAO_FlowSpec_Entry *entry = 0;
+ result = this->mcast_entry_map_.find (mcast_key, entry);
+ if (result == 0)
+ {
+ mcast_addr = dynamic_cast<ACE_INET_Addr *> (entry->address ());
+ char str_addr [BUFSIZ];
+ result = mcast_addr->addr_to_string (str_addr, BUFSIZ);
+ if (result < 0)
+ ACE_ERROR_RETURN ((LM_ERROR, "TAO_StreamEndPointA::multiconnect ::addr_to_string failed\n"), 0);
+ if (TAO_debug_level > 0) ACE_DEBUG ((LM_DEBUG, "TAO_StreamEndPoint_A::multiconnect:%s\n", str_addr));
+ TAO_Forward_FlowSpec_Entry new_entry (entry->flowname (),
+ entry->direction_str (),
+ entry->format (),
+ entry->flow_protocol_str (),
+ entry->carrier_protocol_str (),
+ entry->address ());
+ flow_spec[i] = CORBA::string_dup (new_entry.entry_to_string ());
+ }
+ else
+ {
+
+ switch (forward_entry->direction ())
+ {
+ case TAO_FlowSpec_Entry::TAO_AV_DIR_IN:
+ {
+ ACE_NEW_RETURN (mcast_addr,
+ ACE_INET_Addr,
+ 0);
+ mcast_addr->set (this->mcast_port_, this->mcast_addr_.c_str ());
+ this->mcast_port_++;
+ char buf[BUFSIZ];
+ mcast_addr->addr_to_string (buf, BUFSIZ);
+ if (TAO_debug_level > 0) ACE_DEBUG ((LM_DEBUG, "%s\n", buf));
+ TAO_Forward_FlowSpec_Entry *new_entry;
+ ACE_NEW_RETURN (new_entry,
+ TAO_Forward_FlowSpec_Entry (forward_entry->flowname (),
+ forward_entry->direction_str (),
+ forward_entry->format (),
+ forward_entry->flow_protocol_str (),
+ forward_entry->carrier_protocol_str (),
+ mcast_addr),
+ 0);
+ flow_spec[i] = CORBA::string_dup (new_entry->entry_to_string ());
+ //new_entry->is_multicast (1);
+
+ this->forward_flow_spec_set.insert (new_entry);
+ TAO_AV_Acceptor_Registry *acceptor_registry = TAO_AV_CORE::instance ()->acceptor_registry ();
+ result = acceptor_registry->open (this,
+ TAO_AV_CORE::instance (),
+ this->forward_flow_spec_set);
+ if (result < 0)
+ ACE_ERROR_RETURN ((LM_ERROR, "Acceptor_Registry::open failed\n"), 0);
+ result = this->mcast_entry_map_.bind (mcast_key, new_entry);
+ if (result < 0)
+ ACE_ERROR_RETURN ((LM_ERROR, "mcast_entry::bind failed"), 0);
+ }
+ break;
+ case TAO_FlowSpec_Entry::TAO_AV_DIR_OUT:
+ // OUT implies we're the sink.
+ break;
+ default:
+ break;
+ }
+ }
+ }
+ }
+ }
+ ACE_CATCHANY
+ {
+ ACE_PRINT_EXCEPTION (ACE_ANY_EXCEPTION, "TAO_StreamEndPoint_A::multiconnect");
+ return 0;
+ }
+ ACE_ENDTRY;
+ ACE_CHECK_RETURN (0);
+ return 1;
+}
+
+// ATM style Multicast is not supported yet.
+CORBA::Boolean
+TAO_StreamEndPoint_A::connect_leaf (AVStreams::StreamEndPoint_B_ptr /* the_ep */,
+ AVStreams::streamQoS & /* the_qos */,
+ const AVStreams::flowSpec & /* the_flows */
+ ACE_ENV_ARG_DECL)
+ ACE_THROW_SPEC ((CORBA::SystemException,
+ AVStreams::streamOpFailed,
+ AVStreams::noSuchFlow,
+ AVStreams::QoSRequestFailed,
+ AVStreams::notSupported))
+{
+ ACE_THROW_RETURN (AVStreams::notSupported (), 0);
+}
+
+// Multicast not supported yet.
+void
+TAO_StreamEndPoint_A::disconnect_leaf (AVStreams::StreamEndPoint_B_ptr /* the_ep */,
+ const AVStreams::flowSpec & /* theSpec */
+ ACE_ENV_ARG_DECL)
+
+ ACE_THROW_SPEC ((CORBA::SystemException,
+ AVStreams::streamOpFailed,
+ AVStreams::noSuchFlow,
+ AVStreams::notSupported))
+{
+
+ ACE_THROW (AVStreams::notSupported ());
+
+}
+
+TAO_StreamEndPoint_A::~TAO_StreamEndPoint_A (void)
+{
+}
+
+// ----------------------------------------------------------------------
+// TAO_StreamEndPoint_B
+// ----------------------------------------------------------------------
+
+TAO_StreamEndPoint_B::TAO_StreamEndPoint_B (void)
+{
+ if (TAO_debug_level > 0) ACE_DEBUG ((LM_DEBUG,
+ "\n(%P|%t) TAO_StreamEndPoint_B::TAO_StreamEndPoint_B: created"));
+}
+
+CORBA::Boolean
+TAO_StreamEndPoint_B::multiconnect (AVStreams::streamQoS &stream_qos,
+ AVStreams::flowSpec &flow_spec
+ ACE_ENV_ARG_DECL)
+ ACE_THROW_SPEC ((CORBA::SystemException,
+ AVStreams::streamOpFailed,
+ AVStreams::noSuchFlow,
+ AVStreams::QoSRequestFailed,
+ AVStreams::FPError))
+{
+ if (TAO_debug_level > 0) ACE_DEBUG ((LM_DEBUG, "TAO_StreamEndPoint_B::multiconnect\n"));
+ ACE_TRY
+ {
+ int result = 0;
+ TAO_AV_QoS qos (stream_qos);
+ for (u_int i=0;i< flow_spec.length ();i++)
+ {
+ TAO_Forward_FlowSpec_Entry *forward_entry;
+ ACE_NEW_RETURN (forward_entry,
+ TAO_Forward_FlowSpec_Entry,
+ 0);
+ forward_entry->parse (flow_spec[i]);
+ ACE_CString mcast_key (forward_entry->flowname ());
+ AVStreams::FlowEndPoint_var flow_endpoint;
+ if (this->fep_map_.find (mcast_key, flow_endpoint ) == 0)
+ {
+ AVStreams::FlowConsumer_var consumer;
+ ACE_TRY_EX (narrow)
+ {
+ consumer = AVStreams::FlowConsumer::_narrow (flow_endpoint.in () ACE_ENV_ARG_PARAMETER);
+ ACE_TRY_CHECK_EX (narrow);
+ }
+ ACE_CATCHANY
+ {
+ ACE_PRINT_EXCEPTION (ACE_ANY_EXCEPTION, "FlowConsumer::_narrow");
+ ACE_ERROR_RETURN ((LM_ERROR, "sep_b doesn't contain a flowconsumer"), 0);
+ }
+ ACE_ENDTRY;
+ ACE_CHECK_RETURN (0);
+ AVStreams::QoS flow_qos;
+ result = qos.get_flow_qos (forward_entry->flowname (), flow_qos);
+ if (result < 0)
+ if (TAO_debug_level > 0) ACE_DEBUG ((LM_DEBUG, "QoS not found for %s", forward_entry->flowname ()));
+ AVStreams::FlowConnection_var flow_connection;
+ ACE_TRY_EX (flow_connection)
+ {
+ if (CORBA::is_nil (this->streamctrl_.in ()))
+ {
+ CORBA::Any_var streamctrl_any;
+ streamctrl_any = this->get_property_value ("Related_StreamCtrl"
+ ACE_ENV_ARG_PARAMETER);
+ ACE_TRY_CHECK;
+ AVStreams::StreamCtrl_ptr streamctrl;
+ streamctrl_any.in () >>= streamctrl;
+ this->streamctrl_ = AVStreams::StreamCtrl::_duplicate (streamctrl);
+ }
+ CORBA::Object_var flow_connection_obj =
+ this->streamctrl_->get_flow_connection (forward_entry->flowname ()
+ ACE_ENV_ARG_PARAMETER);
+ ACE_TRY_CHECK_EX (flow_connection);
+ flow_connection = AVStreams::FlowConnection::_narrow (flow_connection_obj.in ()
+ ACE_ENV_ARG_PARAMETER);
+ ACE_TRY_CHECK_EX (flow_connection);
+ }
+ ACE_CATCHANY
+ {
+ ACE_PRINT_EXCEPTION (ACE_ANY_EXCEPTION, "TAO_StreamEndPoint_B::multiconnect::get_flow_connection");
+ return 0;
+ }
+ ACE_ENDTRY;
+ ACE_CHECK_RETURN (0);
+ result = flow_connection->add_consumer (consumer.in (),
+ flow_qos
+ ACE_ENV_ARG_PARAMETER);
+ ACE_TRY_CHECK;
+ if (result == 0)
+ ACE_ERROR_RETURN ((LM_ERROR, "TAO_StreamEndPoint_B::multiconnect:add_consumer failed\n"), 0);
+ }
+ else
+ {
+ TAO_FlowSpec_Entry *mcast_entry = 0;
+ ACE_INET_Addr *mcast_addr;
+ mcast_addr = dynamic_cast<ACE_INET_Addr *> (forward_entry->address ());
+ if (mcast_addr == 0)
+ ACE_ERROR_RETURN ((LM_ERROR, "TAO_StreamEndPoint_B::multiconnect::Address missing in flowspec_entry\n"), 0);
+ result = this->mcast_entry_map_.find (mcast_key, mcast_entry);
+ if (result == 0)
+ {
+ ACE_ERROR_RETURN ((LM_ERROR, "TAO_StreamEndPoint_B::multiconnect::handler already found\n"), 0);
+ }
+ else
+ {
+ switch (forward_entry->direction ())
+ {
+ case TAO_FlowSpec_Entry::TAO_AV_DIR_IN:
+ {
+ // IN means we're the sink.
+ // @@ We have to take care of this.
+ // result = this->make_dgram_mcast_flow_handler (mcast_dgram);
+ // if (result < 0)
+ // return 0;
+
+ this->forward_flow_spec_set.insert (forward_entry);
+ TAO_AV_Connector_Registry *connector_registry = TAO_AV_CORE::instance ()->connector_registry ();
+ result = connector_registry->open (this,
+ TAO_AV_CORE::instance (),
+ this->forward_flow_spec_set);
+ if (result < 0)
+ ACE_ERROR_RETURN ((LM_ERROR, "connector_registry::open failed\n"), 0);
+ result = this->mcast_entry_map_.bind (mcast_key, forward_entry);
+ if (result < 0)
+ ACE_ERROR_RETURN ((LM_ERROR, "dgram_mcast_handler::bind failed"), 0);
+ }
+ break;
+ case TAO_FlowSpec_Entry::TAO_AV_DIR_OUT:
+ // OUT implies we're the source., which is an error.
+ break;
+ default:
+ break;
+ }
+ }
+ }
+ }
+ }
+ ACE_CATCHANY
+ {
+ ACE_PRINT_EXCEPTION (ACE_ANY_EXCEPTION, "TAO_StreamEndPoint_B::multiconnect");
+ return 0;
+ }
+ ACE_ENDTRY;
+ ACE_CHECK_RETURN (0);
+ return 1;
+}
+
+TAO_StreamEndPoint_B::~TAO_StreamEndPoint_B (void)
+{
+}
+
+// ----------------------------------------------------------------------
+// TAO_VDev
+// ----------------------------------------------------------------------
+
+TAO_VDev::TAO_VDev (void)
+{
+ if (TAO_debug_level > 0) ACE_DEBUG ((LM_DEBUG,
+ "(%P|%t) TAO_VDev::TAO_VDev: created\n"));
+}
+
+// StreamCtrl will call this to give us a reference to itself, and to
+// our peer vdev..
+CORBA::Boolean
+TAO_VDev::set_peer (AVStreams::StreamCtrl_ptr the_ctrl,
+ AVStreams::VDev_ptr the_peer_dev,
+ AVStreams::streamQoS &the_qos,
+ const AVStreams::flowSpec &the_spec
+ ACE_ENV_ARG_DECL)
+ ACE_THROW_SPEC ((CORBA::SystemException,
+ AVStreams::noSuchFlow,
+ AVStreams::QoSRequestFailed,
+ AVStreams::streamOpFailed))
+{
+ ACE_UNUSED_ARG (the_qos);
+ ACE_UNUSED_ARG (the_spec);
+
+ CORBA::Boolean result = 0;
+ ACE_TRY
+ {
+ if (TAO_debug_level > 0)
+ ACE_DEBUG ((LM_DEBUG, "(%P|%t) TAO_VDev::set_peer: called\n"));
+
+
+ CORBA::Any anyval;
+ anyval <<= the_peer_dev;
+ this->define_property ("Related_VDev",
+ anyval
+ ACE_ENV_ARG_PARAMETER);
+
+ ACE_TRY_CHECK;
+
+ this->streamctrl_ = AVStreams::StreamCtrl::_duplicate (the_ctrl);
+ this->peer_ = AVStreams::VDev::_duplicate (the_peer_dev);
+
+ CORBA::Any_var anyptr;
+ anyptr = this->peer_->get_property_value ("Related_MediaCtrl"
+ ACE_ENV_ARG_PARAMETER);
+ ACE_TRY_CHECK;
+
+ CORBA::Object_ptr media_ctrl_obj = 0;
+
+ anyptr.in () >>= CORBA::Any::to_object(media_ctrl_obj);
+ ACE_TRY_CHECK;
+
+ result = this->set_media_ctrl (media_ctrl_obj ACE_ENV_ARG_PARAMETER);
+ ACE_TRY_CHECK;
+ }
+ ACE_CATCHANY
+ {
+ ACE_PRINT_EXCEPTION (ACE_ANY_EXCEPTION, "TAO_VDev::set_peer");
+ return 0;
+ }
+ ACE_ENDTRY;
+ ACE_CHECK_RETURN (0);
+ return result;
+}
+
+CORBA::Boolean
+TAO_VDev::set_media_ctrl (CORBA::Object_ptr media_ctrl
+ ACE_ENV_ARG_DECL_NOT_USED)
+
+{
+ // since the media ctrl is not stored or used, delete it.
+
+ CORBA::release( media_ctrl);
+
+ return 1;
+}
+
+// Sets the multicast VDev peer.
+CORBA::Boolean
+TAO_VDev::set_Mcast_peer (AVStreams::StreamCtrl_ptr /* the_ctrl */,
+ AVStreams::MCastConfigIf_ptr mcast_peer,
+ AVStreams::streamQoS &/* the_qos */,
+ const AVStreams::flowSpec &/* the_spec */
+ ACE_ENV_ARG_DECL_NOT_USED)
+ ACE_THROW_SPEC ((CORBA::SystemException,
+ AVStreams::noSuchFlow,
+ AVStreams::QoSRequestFailed,
+ AVStreams::streamOpFailed))
+{
+ this->mcast_peer_ = AVStreams::MCastConfigIf::_duplicate (mcast_peer);
+ return 1;
+}
+
+// applications should override this to handle configuration changes.
+void
+TAO_VDev::configure (const CosPropertyService::Property &/*the_config_mesg*/
+ ACE_ENV_ARG_DECL_NOT_USED)
+ ACE_THROW_SPEC ((CORBA::SystemException,
+ AVStreams::PropertyException,
+ AVStreams::streamOpFailed))
+{
+}
+
+// sets the media format used for the flowname as a property.
+void
+TAO_VDev::set_format (const char *flowName,
+ const char *format_name
+ ACE_ENV_ARG_DECL)
+ ACE_THROW_SPEC ((CORBA::SystemException,
+ AVStreams::notSupported))
+{
+ ACE_TRY
+ {
+ if (flowName == 0 || format_name == 0)
+ ACE_ERROR ((LM_ERROR, "TAO_VDev::set_format: flowName or format_name is null\n"));
+ char format_property [BUFSIZ];
+ ACE_OS::sprintf (format_property, "%s_currFormat", flowName);
+ CORBA::Any format;
+ format <<= format_name;
+ this->define_property (format_property,
+ format
+ ACE_ENV_ARG_PARAMETER);
+ ACE_TRY_CHECK;
+ }
+ ACE_CATCHANY
+ {
+ ACE_PRINT_EXCEPTION (ACE_ANY_EXCEPTION, "TAO_VDev::set_format");
+ return;
+ }
+ ACE_ENDTRY;
+ ACE_CHECK;
+ return;
+}
+
+// sets the device parameters for the flowname as a property.
+void
+TAO_VDev::set_dev_params (const char *flowName,
+ const CosPropertyService::Properties &new_params
+ ACE_ENV_ARG_DECL)
+ ACE_THROW_SPEC ((CORBA::SystemException,
+ AVStreams::PropertyException,
+ AVStreams::streamOpFailed))
+{
+ ACE_TRY
+ {
+ if (flowName == 0)
+ ACE_ERROR ((LM_ERROR, "TAO_VDev::set_dev_params:flowName is null\n"));
+ char devParams_property[BUFSIZ];
+ ACE_OS::sprintf (devParams_property, "%s_devParams", flowName);
+ CORBA::Any devParams;
+ devParams <<= new_params;
+ this->define_property (devParams_property,
+ devParams
+ ACE_ENV_ARG_PARAMETER);
+ ACE_TRY_CHECK;
+ }
+ ACE_CATCHANY
+ {
+ ACE_PRINT_EXCEPTION (ACE_ANY_EXCEPTION, "TAO_VDev::set_dev_params");
+ return;
+ }
+ ACE_ENDTRY;
+ ACE_CHECK;
+ return;
+}
+
+// QoS Modification should be handled by the application currently.
+CORBA::Boolean
+TAO_VDev::modify_QoS (AVStreams::streamQoS &the_qos,
+ const AVStreams::flowSpec &flowspec
+ ACE_ENV_ARG_DECL)
+ ACE_THROW_SPEC ((CORBA::SystemException,
+ AVStreams::noSuchFlow,
+ AVStreams::QoSRequestFailed))
+{
+ if (TAO_debug_level > 0)
+ ACE_DEBUG ((LM_DEBUG,
+ "TAO_VDev::modify_QoS\n"));
+
+ if (flowspec.length () != 0)
+ {
+ TAO_Forward_FlowSpec_Entry entry;
+ entry.parse (flowspec [0]);
+ int direction = entry.direction ();
+ if (direction == 0)
+ {
+ AVStreams::StreamEndPoint_A_ptr sep_a;
+
+ CORBA::Any_ptr streamendpoint_a_any =
+ this->get_property_value ("Related_StreamEndpoint"
+ ACE_ENV_ARG_PARAMETER);
+ ACE_CHECK_RETURN (0);
+
+ *streamendpoint_a_any >>= sep_a;
+ if (sep_a != 0)
+ {
+ sep_a->modify_QoS (the_qos, flowspec ACE_ENV_ARG_PARAMETER);
+ ACE_CHECK_RETURN (0);
+ }
+ else ACE_DEBUG ((LM_DEBUG,
+ "Stream EndPoint Not Found\n"));
+ }
+ else
+ {
+ AVStreams::StreamEndPoint_B_ptr sep_b;
+
+ CORBA::Any_ptr streamendpoint_b_any =
+ this->get_property_value ("Related_StreamEndpoint"
+ ACE_ENV_ARG_PARAMETER);
+ ACE_CHECK_RETURN (0);
+ *streamendpoint_b_any >>= sep_b;
+ sep_b->modify_QoS (the_qos, flowspec ACE_ENV_ARG_PARAMETER);
+ ACE_CHECK_RETURN (0);
+ }
+ }
+ return 1;
+}
+
+TAO_VDev::~TAO_VDev (void)
+{
+}
+
+// ----------------------------------------------------------------------
+// TAO_MMDevice
+// ----------------------------------------------------------------------
+
+
+TAO_MMDevice::TAO_MMDevice (TAO_AV_Endpoint_Strategy *endpoint_strategy)
+ : endpoint_strategy_ (endpoint_strategy),
+ flow_count_ (0),
+ flow_num_ (0),
+ stream_ctrl_ (0)
+{
+}
+
+// create a streamctrl which is colocated with me, use that streamctrl
+// to bind the peer_device with me.
+AVStreams::StreamCtrl_ptr
+TAO_MMDevice::bind (AVStreams::MMDevice_ptr peer_device,
+ AVStreams::streamQoS &the_qos,
+ CORBA::Boolean_out is_met,
+ const AVStreams::flowSpec &the_spec
+ ACE_ENV_ARG_DECL)
+ ACE_THROW_SPEC ((CORBA::SystemException,
+ AVStreams::streamOpFailed,
+ AVStreams::noSuchFlow,
+ AVStreams::QoSRequestFailed))
+{
+ AVStreams::StreamCtrl_ptr streamctrl (AVStreams::StreamCtrl::_nil ());
+ ACE_TRY
+ {
+ ACE_UNUSED_ARG (is_met);
+ ACE_NEW_RETURN (this->stream_ctrl_,
+ TAO_StreamCtrl,
+ 0);
+ AVStreams::MMDevice_var mmdevice = this->_this (ACE_ENV_SINGLE_ARG_PARAMETER);
+ ACE_TRY_CHECK;
+ this->stream_ctrl_->bind_devs (peer_device,
+ mmdevice.in (),
+ the_qos,
+ the_spec
+ ACE_ENV_ARG_PARAMETER);
+ ACE_TRY_CHECK;
+ streamctrl = this->stream_ctrl_->_this (ACE_ENV_SINGLE_ARG_PARAMETER);
+ ACE_TRY_CHECK;
+ }
+ ACE_CATCHANY
+ {
+ ACE_PRINT_EXCEPTION (ACE_ANY_EXCEPTION, "TAO_MMDevice::bind");
+ return streamctrl;
+ }
+ ACE_ENDTRY;
+ ACE_CHECK_RETURN (streamctrl);
+ return streamctrl;
+}
+
+// Multicast is not supported yet.
+AVStreams::StreamCtrl_ptr
+TAO_MMDevice::bind_mcast (AVStreams::MMDevice_ptr first_peer,
+ AVStreams::streamQoS &the_qos,
+ CORBA::Boolean_out is_met,
+ const AVStreams::flowSpec &the_spec
+ ACE_ENV_ARG_DECL_NOT_USED)
+ ACE_THROW_SPEC ((CORBA::SystemException,
+ AVStreams::streamOpFailed,
+ AVStreams::noSuchFlow,
+ AVStreams::QoSRequestFailed))
+{
+ ACE_UNUSED_ARG (first_peer);
+ ACE_UNUSED_ARG (the_qos);
+ ACE_UNUSED_ARG (is_met);
+ ACE_UNUSED_ARG (the_spec);
+
+ return 0;
+}
+
+AVStreams::StreamEndPoint_ptr
+TAO_MMDevice::create_A_B (MMDevice_Type type,
+ AVStreams::StreamCtrl_ptr streamctrl,
+ AVStreams::VDev_out the_vdev,
+ AVStreams::streamQoS &the_qos,
+ CORBA::Boolean_out met_qos,
+ char *&/*named_vdev*/,
+ const AVStreams::flowSpec &flow_spec
+ ACE_ENV_ARG_DECL)
+{
+ AVStreams::StreamEndPoint_A_ptr sep_a (AVStreams::StreamEndPoint_A::_nil ());
+ AVStreams::StreamEndPoint_B_ptr sep_b (AVStreams::StreamEndPoint_B::_nil ());
+ AVStreams::StreamEndPoint_ptr sep (AVStreams::StreamEndPoint::_nil ());
+ ACE_TRY
+ {
+ switch (type)
+ {
+ case MMDEVICE_A:
+ {
+ if (this->endpoint_strategy_->create_A (sep_a,
+ the_vdev
+ ACE_ENV_ARG_PARAMETER) == -1)
+ ACE_ERROR_RETURN ((LM_ERROR,
+ "TAO_MMDevice::create_A_B (%P|%t) - "
+ "error in create_A\n"),
+ 0);
+ sep = sep_a;
+ }
+ break;
+ case MMDEVICE_B:
+ {
+ if (this->endpoint_strategy_->create_B (sep_b,
+ the_vdev
+ ACE_ENV_ARG_PARAMETER) == -1)
+ ACE_ERROR_RETURN ((LM_ERROR,
+ "TAO_MMDevice::create_A_B (%P|%t) - "
+ "error in create_B\n"),
+ 0);
+ sep = sep_b;
+ }
+ break;
+ default:
+ break;
+ }
+ ACE_TRY_CHECK;
+ if (this->fdev_map_.current_size () > 0)
+ {
+ TAO_AV_QoS qos (the_qos);
+ // create flowendpoints from the FDevs.
+ for (u_int i=0;i<flow_spec.length ();i++)
+ {
+ TAO_Forward_FlowSpec_Entry forward_entry;
+ forward_entry.parse (flow_spec[i]);
+ ACE_CString flow_key (forward_entry.flowname ());
+ AVStreams::FDev_var flow_dev;
+ AVStreams::FlowConnection_var flowconnection;
+ ACE_TRY_EX (flowconnection)
+ {
+ // Get the flowconnection for this flow.
+ //static int blah = 0; if(blah == 1){blah=0; abort();}else{blah=1;}
+ CORBA::Object_var flowconnection_obj =
+ streamctrl->get_flow_connection (forward_entry.flowname () ACE_ENV_ARG_PARAMETER);
+ ACE_TRY_CHECK_EX (flowconnection);
+ printf("successfully called get_flow_connection\n");
+ if (!CORBA::is_nil (flowconnection_obj.in ()))
+ {
+ flowconnection = AVStreams::FlowConnection::_narrow (flowconnection_obj.in ()
+ ACE_ENV_ARG_PARAMETER);
+ ACE_TRY_CHECK_EX (flowconnection);
+ }
+ }
+ ACE_CATCH(AVStreams::noSuchFlow, nsf)
+ {
+ TAO_FlowConnection *flowConnection;
+ ACE_NEW_RETURN (flowConnection,
+ TAO_FlowConnection,
+ 0);
+ flowconnection = flowConnection->_this (ACE_ENV_SINGLE_ARG_PARAMETER);
+ ACE_TRY_CHECK;
+ streamctrl->set_flow_connection (forward_entry.flowname(),
+ flowconnection.in ()
+ ACE_ENV_ARG_PARAMETER);
+ ACE_TRY_CHECK;
+ }
+ ACE_CATCHANY
+ {
+ //if (TAO_debug_level >= 0)
+ ACE_PRINT_EXCEPTION (ACE_ANY_EXCEPTION, "TAO_MMDevice::create_a::get_flow_connection");
+ }
+ ACE_ENDTRY;
+ ACE_CHECK_RETURN (0);
+
+ int result = this->fdev_map_.find (flow_key, flow_dev);
+ if (result < 0)
+ ACE_ERROR_RETURN ((LM_ERROR, "(%N,%l) fdev_map::find failed\n"), 0);
+
+ CORBA::String_var named_fdev;
+ AVStreams::FlowEndPoint_var flow_endpoint;
+ AVStreams::QoS flow_qos;
+ result = qos.get_flow_qos (forward_entry.flowname (), flow_qos);
+ if (result < 0)
+ if (TAO_debug_level > 0) ACE_DEBUG ((LM_DEBUG, "(%N,%l) get_flow_qos failed for %s\n", forward_entry.flowname ()));
+ switch (forward_entry.direction ())
+ {
+ case TAO_FlowSpec_Entry::TAO_AV_DIR_IN:
+ {
+ switch (type)
+ {
+ case MMDEVICE_A:
+ {
+ // In implies flow is from A to B and
+ // hence A is the producer for this flow and B is the consumer for this flow.
+ // We have to create a producer from the FDev for this flow.
+ flow_endpoint =
+ flow_dev->create_producer (flowconnection.in (),
+ flow_qos,
+ met_qos,
+ named_fdev.inout ()
+ ACE_ENV_ARG_PARAMETER);
+ }
+ break;
+ case MMDEVICE_B:
+ {
+ flow_endpoint =
+ flow_dev->create_consumer (flowconnection.in (),
+ flow_qos,
+ met_qos,
+ named_fdev.inout ()
+ ACE_ENV_ARG_PARAMETER);
+ }
+ break;
+ }
+ ACE_TRY_CHECK;
+ }
+ break;
+ case TAO_FlowSpec_Entry::TAO_AV_DIR_OUT:
+ {
+ switch (type)
+ {
+ case MMDEVICE_A:
+ {
+ // OUT implies flow is from B to A and
+ // hence B is the producer for this flow and A is the consumer for this flow.
+ // We have to create a consumer from the FDev for this flow.
+ flow_endpoint =
+ flow_dev->create_consumer (flowconnection.in (),
+ flow_qos,
+ met_qos,
+ named_fdev.inout ()
+ ACE_ENV_ARG_PARAMETER);
+ }
+ break;
+ case MMDEVICE_B:
+ {
+ // In implies flow is from A to B and
+ // hence A is the producer for this flow and B is the consumer for this flow.
+ // We have to create a producer from the FDev for this flow.
+ flow_endpoint =
+ flow_dev->create_producer (flowconnection.in (),
+ flow_qos,
+ met_qos,
+ named_fdev.inout ()
+ ACE_ENV_ARG_PARAMETER);
+ }
+ break;
+ }
+ ACE_TRY_CHECK;
+ }
+ break;
+ default:
+ break;
+ }
+ CORBA::Any flowname_any;
+ flowname_any <<= forward_entry.flowname ();
+ flow_endpoint->define_property ("FlowName", flowname_any ACE_ENV_ARG_PARAMETER);
+ ACE_TRY_CHECK;
+ sep->add_fep (flow_endpoint.in ()
+ ACE_ENV_ARG_PARAMETER);
+ ACE_TRY_CHECK;
+ }
+ }
+ }
+ ACE_CATCHANY
+ {
+ ACE_PRINT_EXCEPTION (ACE_ANY_EXCEPTION, "TAO_MMDevice::create_A");
+ return sep;
+ }
+ ACE_ENDTRY;
+ ACE_CHECK_RETURN (sep);
+ return sep;
+}
+
+AVStreams::StreamEndPoint_A_ptr
+TAO_MMDevice::create_A (AVStreams::StreamCtrl_ptr streamctrl,
+ AVStreams::VDev_out the_vdev,
+ AVStreams::streamQoS &stream_qos,
+ CORBA::Boolean_out met_qos,
+ char *&named_vdev,
+ const AVStreams::flowSpec &flow_spec
+ ACE_ENV_ARG_DECL)
+ ACE_THROW_SPEC ((CORBA::SystemException,
+ AVStreams::streamOpFailed,
+ AVStreams::streamOpDenied,
+ AVStreams::notSupported,
+ AVStreams::QoSRequestFailed,
+ AVStreams::noSuchFlow))
+{
+ AVStreams::StreamEndPoint_A_ptr sep_a = 0;
+ AVStreams::StreamEndPoint_var sep;
+ ACE_TRY
+ {
+ sep = this->create_A_B (MMDEVICE_A, streamctrl, the_vdev, stream_qos, met_qos, named_vdev, flow_spec ACE_ENV_ARG_PARAMETER);
+ ACE_TRY_CHECK;
+ sep_a = AVStreams::StreamEndPoint_A::_narrow (sep.in() ACE_ENV_ARG_PARAMETER);
+ ACE_TRY_CHECK;
+
+ ACE_ASSERT( !CORBA::is_nil( sep_a ) );
+ }
+ ACE_CATCHANY
+ {
+ ACE_PRINT_EXCEPTION (ACE_ANY_EXCEPTION, "TAO_MMDevice::create_A");
+ return sep_a;
+ }
+ ACE_ENDTRY;
+
+ return sep_a;
+}
+
+
+AVStreams::StreamEndPoint_B_ptr
+TAO_MMDevice::create_B (AVStreams::StreamCtrl_ptr streamctrl,
+ AVStreams::VDev_out the_vdev,
+ AVStreams::streamQoS &stream_qos,
+ CORBA::Boolean_out met_qos,
+ char *&named_vdev,
+ const AVStreams::flowSpec &flow_spec
+ ACE_ENV_ARG_DECL)
+ ACE_THROW_SPEC ((CORBA::SystemException,
+ AVStreams::streamOpFailed,
+ AVStreams::streamOpDenied,
+ AVStreams::notSupported,
+ AVStreams::QoSRequestFailed,
+ AVStreams::noSuchFlow))
+{
+ AVStreams::StreamEndPoint_B_ptr sep_b = AVStreams::StreamEndPoint_B::_nil ();
+ AVStreams::StreamEndPoint_var sep;
+
+ ACE_TRY
+ {
+ sep = this->create_A_B (MMDEVICE_B, streamctrl, the_vdev, stream_qos, met_qos, named_vdev, flow_spec ACE_ENV_ARG_PARAMETER);
+ ACE_TRY_CHECK;
+ sep_b = AVStreams::StreamEndPoint_B::_narrow (sep.in() ACE_ENV_ARG_PARAMETER);
+ ACE_TRY_CHECK;
+
+ ACE_ASSERT ( !CORBA::is_nil( sep_b ) );
+ }
+ ACE_CATCHANY
+ {
+ ACE_PRINT_EXCEPTION (ACE_ANY_EXCEPTION, "TAO_MMDevice::create_B");
+ return sep_b;
+ }
+ ACE_ENDTRY;
+ ACE_CHECK_RETURN (sep_b);
+ return sep_b;
+}
+
+
+// destroys the streamendpoint and the Vdev.
+void
+TAO_MMDevice::destroy (AVStreams::StreamEndPoint_ptr /* the_ep */,
+ const char * /* vdev_name */
+ ACE_ENV_ARG_DECL_NOT_USED)
+ ACE_THROW_SPEC ((CORBA::SystemException,
+ AVStreams::notSupported))
+{
+ // Remove self from POA. Because of reference counting, the POA
+ // will automatically delete the servant when all pending requests
+ // on this servant are complete.
+ int result = TAO_AV_Core::deactivate_servant (this);
+ if (result < 0)
+ if (TAO_debug_level > 0) ACE_DEBUG ((LM_DEBUG, "TAO_MMDevice::destroy failed\n"));
+}
+
+char *
+TAO_MMDevice::add_fdev_i (AVStreams::FDev_ptr fdev
+ ACE_ENV_ARG_DECL)
+ ACE_THROW_SPEC ((CORBA::SystemException,
+ AVStreams::notSupported,
+ AVStreams::streamOpFailed))
+{
+ char* tmp;
+ ACE_NEW_RETURN (tmp,
+ char[64],
+ 0);
+ CORBA::String_var flow_name = tmp;
+
+ ACE_TRY
+ {
+ // exception implies the flow name is not defined and is system
+ // generated.
+ ACE_OS::sprintf (tmp, "flow%d", flow_num_++);
+ CORBA::Any flowname_any;
+ flowname_any <<= flow_name.in ();
+ fdev->define_property ("Flow", flowname_any ACE_ENV_ARG_PARAMETER);
+ ACE_TRY_CHECK;
+ }
+ ACE_CATCHANY
+ {
+ ACE_PRINT_EXCEPTION (ACE_ANY_EXCEPTION, "TAO_MMDevice::add_fdev");
+ return 0;
+ }
+ ACE_ENDTRY;
+ return flow_name._retn ();
+}
+
+// Adds the fdev object to the MMDevice.
+char *
+TAO_MMDevice::add_fdev (CORBA::Object_ptr fdev_obj
+ ACE_ENV_ARG_DECL)
+ ACE_THROW_SPEC ((CORBA::SystemException,
+ AVStreams::notSupported,
+ AVStreams::streamOpFailed))
+{
+ CORBA::String_var flow_name;
+ AVStreams::FDev_var fdev;
+ ACE_TRY_EX (flow_name)
+ {
+ CORBA::Any_ptr flow_name_any;
+ fdev = AVStreams::FDev::_narrow (fdev_obj ACE_ENV_ARG_PARAMETER);
+ ACE_TRY_CHECK_EX (flow_name);
+
+ if (CORBA::is_nil (fdev.in ()))
+ return 0;
+
+
+ flow_name_any = fdev->get_property_value ("Flow" ACE_ENV_ARG_PARAMETER);
+ ACE_TRY_CHECK_EX (flow_name);
+
+ const char *tmp;
+ *flow_name_any >>= tmp;
+ flow_name = CORBA::string_dup (tmp);
+ }
+ ACE_CATCHANY
+ {
+ flow_name =
+ this->add_fdev_i (fdev.in () ACE_ENV_ARG_PARAMETER);
+ ACE_CHECK_RETURN (0);
+ }
+ ACE_ENDTRY;
+ ACE_CHECK_RETURN (0);
+
+
+ // Add it to the sequence of flowNames supported.
+ // put the flowname and the fdev in a hashtable.
+ ACE_CString fdev_name_key ( flow_name.in () );
+
+
+ if ( (this->fdev_map_.bind (fdev_name_key, fdev )) != 0)
+ ACE_THROW_RETURN (AVStreams::streamOpFailed (), 0);
+ // increment the flow count.
+ this->flow_count_++;
+ this->flows_.length (this->flow_count_);
+ this->flows_ [this->flow_count_-1] = flow_name;
+ // define/modify the "Flows" property.
+ CORBA::Any flows_any;
+ flows_any <<= this->flows_;
+ ACE_TRY_EX (flows)
+ {
+ this->define_property ("Flows",
+ flows_any
+ ACE_ENV_ARG_PARAMETER);
+ ACE_TRY_CHECK_EX (flows);
+ }
+ ACE_CATCHANY
+ {
+ ACE_PRINT_EXCEPTION (ACE_ANY_EXCEPTION, "TAO_MMDevice::add_fdev");
+ return 0;
+ }
+ ACE_ENDTRY;
+ ACE_CHECK_RETURN (0);
+ return flow_name._retn ();
+}
+
+// Gets the FDev object associated with this flow.
+CORBA::Object_ptr
+TAO_MMDevice::get_fdev (const char *flow_name
+ ACE_ENV_ARG_DECL_NOT_USED)
+ ACE_THROW_SPEC ((CORBA::SystemException,
+ AVStreams::notSupported,
+ AVStreams::noSuchFlow))
+{
+
+ ACE_CString fdev_name_key (flow_name);
+ AVStreams::FDev_var fdev_entry;
+ if (this->fdev_map_.find (fdev_name_key, fdev_entry) == 0)
+ return fdev_entry._retn() ;
+ return 0;
+}
+
+// Removes the fdev from this MMDevice.
+void
+TAO_MMDevice::remove_fdev (const char *flow_name
+ ACE_ENV_ARG_DECL)
+ ACE_THROW_SPEC ((CORBA::SystemException,
+ AVStreams::notSupported,
+ AVStreams::noSuchFlow,
+ AVStreams::streamOpFailed))
+{
+ ACE_TRY
+ {
+ ACE_CString fdev_name_key (flow_name);
+ AVStreams::FDev_var fdev_entry;
+ // Remove the fep from the hash table.
+ if (this->fdev_map_.unbind (fdev_name_key, fdev_entry)!= 0)
+ ACE_THROW (AVStreams::streamOpFailed ());
+
+ AVStreams::flowSpec new_flows (this->flows_.length ());
+ for (u_int i=0, j=0 ; i <this->flows_.length (); i++)
+ if (ACE_OS::strcmp (flow_name, this->flows_[i]) != 0)
+ new_flows[j++] = this->flows_[i];
+
+ CORBA::Any flows;
+ flows <<= new_flows;
+ this->flows_ = new_flows;
+ this->define_property ("Flows",
+ flows
+ ACE_ENV_ARG_PARAMETER);
+ ACE_TRY_CHECK;
+ }
+ ACE_CATCHANY
+ {
+ ACE_PRINT_EXCEPTION (ACE_ANY_EXCEPTION, "TAO_MMDevice::remove_fdev");
+ }
+ ACE_ENDTRY;
+ ACE_CHECK;
+}
+
+// destructor.
+TAO_MMDevice::~TAO_MMDevice (void)
+{
+ delete this->stream_ctrl_;
+}
+
+//------------------------------------------------------------------
+// TAO_FlowConnection
+//------------------------------------------------------------------
+
+// default constructor.
+TAO_FlowConnection::TAO_FlowConnection (void)
+ :fp_name_ (CORBA::string_dup ("")),
+ ip_multicast_ (0)
+{
+}
+
+// int
+// TAO_FlowConnection::set_mcast_addr (ACE_UINT32 mcast_addr, u_short mcast_port)
+// {
+// this->mcast_addr_ = mcast_addr;
+// this->mcast_port_ = mcast_port;
+// return 0;
+// }
+
+int
+TAO_FlowConnection::set_mcast_addr (ACE_CString mcast_addr, u_short mcast_port)
+{
+ this->mcast_addr_ = mcast_addr;
+ this->mcast_port_ = mcast_port;
+ return 0;
+}
+
+void
+TAO_FlowConnection::set_protocol (const char *protocol)
+{
+ this->protocol_ = protocol;
+}
+
+// stop this flow.
+void
+TAO_FlowConnection::stop (ACE_ENV_SINGLE_ARG_DECL)
+ ACE_THROW_SPEC ((CORBA::SystemException))
+{
+ ACE_TRY
+ {
+ FlowProducer_SetItor producer_begin = this->flow_producer_set_.begin
+ ();
+ for (FlowProducer_SetItor producer_end =
+ this->flow_producer_set_.end ();
+ producer_begin != producer_end; ++producer_begin)
+ {
+ (*producer_begin)->stop (ACE_ENV_SINGLE_ARG_PARAMETER);
+ ACE_TRY_CHECK;
+ }
+ FlowConsumer_SetItor consumer_begin = this->flow_consumer_set_.begin
+ ();
+ for (FlowConsumer_SetItor consumer_end =
+ this->flow_consumer_set_.end ();
+ consumer_begin != consumer_end; ++consumer_begin)
+ {
+ (*consumer_begin)->stop (ACE_ENV_SINGLE_ARG_PARAMETER);
+ ACE_TRY_CHECK;
+ }
+ }
+ ACE_CATCHANY
+ {
+ ACE_PRINT_EXCEPTION (ACE_ANY_EXCEPTION, "TAO_FlowConnection::stop");
+ return;
+ }
+ ACE_ENDTRY;
+ ACE_CHECK;
+}
+
+// start this flow.
+void
+TAO_FlowConnection::start (ACE_ENV_SINGLE_ARG_DECL)
+ ACE_THROW_SPEC ((CORBA::SystemException))
+{
+ ACE_TRY
+ {
+ FlowConsumer_SetItor consumer_begin = this->flow_consumer_set_.begin
+ ();
+ for (FlowConsumer_SetItor consumer_end =
+ this->flow_consumer_set_.end ();
+ consumer_begin != consumer_end; ++consumer_begin)
+ {
+ (*consumer_begin)->start (ACE_ENV_SINGLE_ARG_PARAMETER);
+ ACE_TRY_CHECK;
+ }
+ FlowProducer_SetItor producer_begin = this->flow_producer_set_.begin
+ ();
+ for (FlowProducer_SetItor producer_end =
+ this->flow_producer_set_.end ();
+ producer_begin != producer_end; ++producer_begin)
+ {
+ (*producer_begin)->start (ACE_ENV_SINGLE_ARG_PARAMETER);
+ ACE_TRY_CHECK;
+ }
+ }
+ ACE_CATCHANY
+ {
+ ACE_PRINT_EXCEPTION (ACE_ANY_EXCEPTION, "TAO_FlowConnection::start");
+ return;
+ }
+ ACE_ENDTRY;
+ ACE_CHECK;
+}
+
+// destroy this flow.
+void
+TAO_FlowConnection::destroy (ACE_ENV_SINGLE_ARG_DECL)
+ ACE_THROW_SPEC ((CORBA::SystemException))
+{
+ ACE_TRY
+ {
+ FlowProducer_SetItor producer_begin = this->flow_producer_set_.begin
+ ();
+ for (FlowProducer_SetItor producer_end =
+ this->flow_producer_set_.end ();
+ producer_begin != producer_end; ++producer_begin)
+ {
+ (*producer_begin)->destroy (ACE_ENV_SINGLE_ARG_PARAMETER);
+ ACE_TRY_CHECK;
+ }
+ FlowConsumer_SetItor consumer_begin = this->flow_consumer_set_.begin
+ ();
+ for (FlowConsumer_SetItor consumer_end =
+ this->flow_consumer_set_.end ();
+ consumer_begin != consumer_end; ++consumer_begin)
+ {
+ (*consumer_begin)->destroy (ACE_ENV_SINGLE_ARG_PARAMETER);
+ ACE_TRY_CHECK;
+ }
+ }
+ ACE_CATCHANY
+ {
+ ACE_PRINT_EXCEPTION (ACE_ANY_EXCEPTION, "TAO_FlowConnection::destroy");
+ return;
+ }
+ ACE_ENDTRY;
+ ACE_CHECK;
+ int result = TAO_AV_Core::deactivate_servant (this);
+ if (result < 0)
+ if (TAO_debug_level > 0) ACE_DEBUG ((LM_DEBUG, "TAO_FlowConnection::destroy failed\n"));
+}
+
+// modify the QoS for this flow.
+CORBA::Boolean
+TAO_FlowConnection::modify_QoS (AVStreams::QoS & new_qos
+ ACE_ENV_ARG_DECL_NOT_USED)
+ ACE_THROW_SPEC ((CORBA::SystemException,
+ AVStreams::QoSRequestFailed))
+{
+ ACE_UNUSED_ARG (new_qos);
+ return 0;
+}
+
+// use the specified flow protocol for this flow.
+CORBA::Boolean
+TAO_FlowConnection::use_flow_protocol (const char * fp_name,
+ const CORBA::Any & fp_settings
+ ACE_ENV_ARG_DECL)
+ ACE_THROW_SPEC ((CORBA::SystemException,
+ AVStreams::FPError,
+ AVStreams::notSupported))
+{
+ this->fp_name_ = fp_name;
+ this->fp_settings_ = fp_settings;
+ FlowProducer_SetItor producer_begin = this->flow_producer_set_.begin
+ ();
+ for (FlowProducer_SetItor producer_end =
+ this->flow_producer_set_.end ();
+ producer_begin != producer_end; ++producer_begin)
+ {
+ (*producer_begin)->use_flow_protocol
+ (fp_name, fp_settings ACE_ENV_ARG_PARAMETER);
+ ACE_CHECK_RETURN (0);
+ }
+ FlowConsumer_SetItor consumer_begin = this->flow_consumer_set_.begin
+ ();
+ for (FlowConsumer_SetItor consumer_end =
+ this->flow_consumer_set_.end ();
+ consumer_begin != consumer_end; ++consumer_begin)
+ {
+ (*consumer_begin)->use_flow_protocol
+ (fp_name, fp_settings ACE_ENV_ARG_PARAMETER);
+ ACE_CHECK_RETURN (0);
+ }
+ return 1;
+}
+
+void
+TAO_FlowConnection::push_event (const AVStreams::streamEvent & the_event
+ ACE_ENV_ARG_DECL_NOT_USED)
+ ACE_THROW_SPEC ((CORBA::SystemException))
+{
+ ACE_UNUSED_ARG (the_event);
+}
+
+CORBA::Boolean
+TAO_FlowConnection::connect_devs (AVStreams::FDev_ptr a_party,
+ AVStreams::FDev_ptr b_party,
+ AVStreams::QoS & flow_qos
+ ACE_ENV_ARG_DECL)
+ ACE_THROW_SPEC ((CORBA::SystemException,
+ AVStreams::streamOpFailed,
+ AVStreams::streamOpDenied,
+ AVStreams::QoSRequestFailed))
+{
+ CORBA::Boolean result = 0;
+ ACE_TRY
+ {
+ AVStreams::FlowConnection_var flowconnection = this->_this (ACE_ENV_SINGLE_ARG_PARAMETER);
+ ACE_TRY_CHECK;
+ CORBA::Boolean met_qos;
+ CORBA::String_var named_fdev ((const char *)"");
+ AVStreams::FlowProducer_var producer =
+ a_party->create_producer (flowconnection.in (),
+ flow_qos,
+ met_qos,
+ named_fdev.inout ()
+ ACE_ENV_ARG_PARAMETER);
+ ACE_TRY_CHECK;
+ AVStreams::FlowConsumer_var consumer =
+ b_party->create_consumer (flowconnection.in (),
+ flow_qos,
+ met_qos,
+ named_fdev.inout ()
+ ACE_ENV_ARG_PARAMETER);
+ ACE_TRY_CHECK;
+ result = this->connect (producer.in (),
+ consumer.in (),
+ flow_qos
+ ACE_ENV_ARG_PARAMETER);
+ ACE_TRY_CHECK;
+ }
+ ACE_CATCHANY
+ {
+ ACE_PRINT_EXCEPTION (ACE_ANY_EXCEPTION, "TAO_FlowConnection::connect_devs");
+ return 0;
+ }
+ ACE_ENDTRY;
+ ACE_CHECK_RETURN (0);
+ return result;
+}
+
+// connect the producer and the consumer
+CORBA::Boolean
+TAO_FlowConnection::connect (AVStreams::FlowProducer_ptr producer,
+ AVStreams::FlowConsumer_ptr consumer,
+ AVStreams::QoS & the_qos
+ ACE_ENV_ARG_DECL)
+ ACE_THROW_SPEC ((CORBA::SystemException,
+ AVStreams::formatMismatch,
+ AVStreams::FEPMismatch,
+ AVStreams::alreadyConnected))
+{
+ ACE_TRY
+ {
+
+ AVStreams::FlowProducer_ptr flow_producer =
+ AVStreams::FlowProducer::_duplicate (producer);
+ AVStreams::FlowConsumer_ptr flow_consumer =
+ AVStreams::FlowConsumer::_duplicate (consumer);
+
+ this->flow_producer_set_.insert (flow_producer);
+ this->flow_consumer_set_.insert (flow_consumer);
+ AVStreams::FlowConnection_var flowconnection =
+ this->_this (ACE_ENV_SINGLE_ARG_PARAMETER);
+ ACE_TRY_CHECK;
+
+ flow_producer->set_peer (flowconnection.in (),
+ flow_consumer,
+ the_qos
+ ACE_ENV_ARG_PARAMETER);
+ ACE_TRY_CHECK;
+
+ flow_consumer->set_peer (flowconnection.in (),
+ flow_producer,
+ the_qos
+ ACE_ENV_ARG_PARAMETER);
+ ACE_TRY_CHECK;
+
+ char *consumer_address =
+ flow_consumer->go_to_listen (the_qos,
+ 0, // false for is_mcast
+ flow_producer,
+ this->fp_name_.inout ()
+ ACE_ENV_ARG_PARAMETER);
+ ACE_TRY_CHECK;
+
+ if (ACE_OS::strcmp (consumer_address, "") == 0)
+ {
+ // Consumer is not willing to listen, so try the producer.
+ consumer_address = flow_producer->go_to_listen (the_qos,
+ 0, // false for is_mcast
+ flow_consumer,
+ this->fp_name_.inout ()
+ ACE_ENV_ARG_PARAMETER);
+ ACE_TRY_CHECK;
+ flow_consumer->connect_to_peer (the_qos,
+ consumer_address,
+ this->fp_name_.inout ()
+ ACE_ENV_ARG_PARAMETER);
+ ACE_TRY_CHECK;
+ // @@ Naga: We have to find means to set the reverse channel for the producer.
+ // Its broken in the point-to_point case for UDP.
+ }
+ else
+ {
+ if (TAO_debug_level > 0) ACE_DEBUG ((LM_DEBUG, "TAO_FlowConnection::connect_to_peer addres: %s", consumer_address));
+ flow_producer->connect_to_peer (the_qos,
+ consumer_address,
+ this->fp_name_.inout ()
+ ACE_ENV_ARG_PARAMETER);
+ ACE_TRY_CHECK;
+ }
+ }
+ ACE_CATCHANY
+ {
+ ACE_PRINT_EXCEPTION (ACE_ANY_EXCEPTION, "TAO_FlowConnection::connect");
+ }
+ ACE_ENDTRY;
+ ACE_CHECK_RETURN (0);
+ return 1;
+}
+
+
+CORBA::Boolean
+TAO_FlowConnection::disconnect (ACE_ENV_SINGLE_ARG_DECL_NOT_USED)
+ ACE_THROW_SPEC ((CORBA::SystemException))
+{
+ return 0;
+}
+
+CORBA::Boolean
+TAO_FlowConnection::add_producer (AVStreams::FlowProducer_ptr producer,
+ AVStreams::QoS & the_qos
+ ACE_ENV_ARG_DECL)
+ ACE_THROW_SPEC ((CORBA::SystemException,
+ AVStreams::alreadyConnected,
+ AVStreams::notSupported))
+{
+ ACE_TRY
+ {
+ AVStreams::FlowProducer_ptr flow_producer =
+ AVStreams::FlowProducer::_duplicate (producer);
+ // @@Naga:Sometimes the same producer could be added with a different object reference.
+ // There's no portable way of comparing obj refs. but we have to do this till we find
+ // a permanent solution.For eg. 2 different flowproducers for the same flow in a
+ // Multipoint to Multipoint binding will have the same flowname and hence cannot be
+ // used for resolving ties.
+ FlowProducer_SetItor begin = this->flow_producer_set_.begin ();
+ FlowProducer_SetItor end = this->flow_producer_set_.end ();
+ for (; begin != end; ++begin)
+ {
+ if ((*begin)->_is_equivalent (producer
+ ACE_ENV_ARG_PARAMETER))
+ // producer exists in the set, a duplicate.
+ ACE_ERROR_RETURN ((LM_WARNING, "TAO_FlowConnection::add_producer: producer already exists\n"), 1);
+ }
+ // We need to check the return value of the insert into the flow producer
+ // set, since multiconnect could be called many times which will lead to
+ // a call to add_producer every time a sink is added. If the producer is already
+ // present in our list we just return immediately.
+ int result = this->flow_producer_set_.insert (flow_producer);
+ if (result == 1)
+ {
+ // producer exists in the set, a duplicate.
+ ACE_ERROR_RETURN ((LM_WARNING, "TAO_FlowConnection::add_producer: producer already exists\n"), 1);
+ }
+ CORBA::Boolean met_qos;
+ char mcast_address[BUFSIZ];
+ if (this->producer_address_.in () == 0)
+ {
+ ACE_INET_Addr mcast_addr;
+ mcast_addr.set (this->mcast_port_,
+ this->mcast_addr_.c_str ()
+ );
+
+ char buf [BUFSIZ];
+ mcast_addr.addr_to_string (buf, BUFSIZ);
+ ACE_OS::sprintf (mcast_address, "%s=%s", this->protocol_.in (), buf);
+ }
+ else
+ {
+ ACE_OS::strcpy (mcast_address, this->producer_address_.in ());
+ }
+ char *address = flow_producer->connect_mcast (the_qos,
+ met_qos,
+ mcast_address,
+ this->fp_name_.in ()
+ ACE_ENV_ARG_PARAMETER);
+
+ ACE_TRY_CHECK;
+ if (this->producer_address_.in () == 0)
+ {
+ TAO_Forward_FlowSpec_Entry entry ("", "", "", "", address);
+ if (entry.address () != 0)
+ {
+ // Internet multicasting is in use.
+ this->producer_address_ = address;
+ }
+ else
+ {
+ // ATM Multicasting is in use.
+ this->ip_multicast_ = 0;
+ }
+ }
+ // set the multicast peer.
+ if (CORBA::is_nil (this->mcastconfigif_.in ()))
+ {
+ ACE_NEW_RETURN (this->mcastconfigif_i_,
+ TAO_MCastConfigIf,
+ 0);
+ this->mcastconfigif_ = this->mcastconfigif_i_->_this (ACE_ENV_SINGLE_ARG_PARAMETER);
+ ACE_TRY_CHECK;
+ }
+ AVStreams::FlowConnection_var flowconnection = this->_this (ACE_ENV_SINGLE_ARG_PARAMETER);
+ ACE_TRY_CHECK;
+ flow_producer->set_Mcast_peer (flowconnection.in (),
+ this->mcastconfigif_.in (),
+ the_qos
+ ACE_ENV_ARG_PARAMETER);
+ ACE_TRY_CHECK;
+ }
+ ACE_CATCHANY
+ {
+ ACE_PRINT_EXCEPTION (ACE_ANY_EXCEPTION, "TAO_FlowConnection::add_producer");
+ return 0;
+ }
+ ACE_ENDTRY;
+ ACE_CHECK_RETURN (0);
+ return 1;
+}
+
+CORBA::Boolean
+TAO_FlowConnection::add_consumer (AVStreams::FlowConsumer_ptr consumer,
+ AVStreams::QoS & the_qos
+ ACE_ENV_ARG_DECL)
+ ACE_THROW_SPEC ((CORBA::SystemException,
+ AVStreams::alreadyConnected))
+{
+ ACE_TRY
+ {
+ AVStreams::FlowConsumer_ptr flow_consumer =
+ AVStreams::FlowConsumer::_duplicate (consumer);
+ FlowConsumer_SetItor begin = this->flow_consumer_set_.begin ();
+ FlowConsumer_SetItor end = this->flow_consumer_set_.end ();
+ for (; begin != end; ++begin)
+ {
+ if ((*begin)->_is_equivalent (consumer
+ ACE_ENV_ARG_PARAMETER))
+ // Consumer exists in the set, a duplicate.
+ ACE_ERROR_RETURN ((LM_WARNING, "TAO_FlowConnection::add_Consumer: Consumer already exists\n"), 1);
+ }
+ int result = this->flow_consumer_set_.insert (flow_consumer);
+ if (result == 1)
+ {
+ // consumer exists in the set, a duplicate.
+ ACE_ERROR_RETURN ((LM_WARNING, "TAO_FlowConnection::add_consumer: consumer already exists\n"), 1);
+ }
+
+ FlowProducer_SetItor producer_begin = this->flow_producer_set_.begin ();
+ // @@Lets take that the first entry as the only producer. We're
+ // not sure if we can have multiple flow producers in a
+ // flowconnection. We can have multiple producer in the MtM binding,
+ // in which case the first producer that gets added is the leader.
+ AVStreams::FlowProducer_ptr flow_producer = (*producer_begin);
+
+ AVStreams::protocolSpec protocols (1);
+ protocols.length (1);
+ protocols [0] = CORBA::string_dup (this->producer_address_.in ());
+
+ if (!this->ip_multicast_)
+ {
+ flow_consumer->set_protocol_restriction (protocols
+ ACE_ENV_ARG_PARAMETER);
+ ACE_TRY_CHECK;
+ char * address =
+ flow_consumer->go_to_listen (the_qos,
+ 1,
+ flow_producer,
+ this->fp_name_.inout ()
+ ACE_ENV_ARG_PARAMETER);
+ ACE_TRY_CHECK;
+ CORBA::Boolean is_met;
+ flow_producer->connect_mcast (the_qos,
+ is_met,
+ address,
+ this->fp_name_.inout ()
+ ACE_ENV_ARG_PARAMETER);
+ ACE_TRY_CHECK;
+ }
+ else
+ {
+ // The spec says go_to_listen is called with the multicast
+ // address returned from the connect_mcast call called
+ // during add_producer. But go_to_listen doesn't have a
+ // address parameter. I guess it should be connect_to_peer.
+ // IP Multicasting.
+ flow_consumer->connect_to_peer (the_qos,
+ this->producer_address_.in (),
+ this->fp_name_.inout ()
+ ACE_ENV_ARG_PARAMETER);
+
+ // char * address =
+ // flow_consumer->go_to_listen (the_qos,
+ // 1,
+ // flow_producer,
+ // this->fp_name_.inout ()
+ // ACE_ENV_ARG_PARAMETER);
+
+ // ACE_TRY_CHECK;
+ }
+ if (CORBA::is_nil (this->mcastconfigif_.in ()))
+ ACE_ERROR_RETURN ((LM_ERROR, "TAO_FlowConnection::add_consumer: first add a producer and then a consumer\n"), 0);
+ // @@ Is this the right place to do set_peer?
+ AVStreams::flowSpec flow_spec;
+ AVStreams::streamQoS stream_qos (1);
+ stream_qos.length (1);
+ stream_qos [0] = the_qos;
+ this->mcastconfigif_->set_peer (flow_consumer,
+ stream_qos,
+ flow_spec
+ ACE_ENV_ARG_PARAMETER);
+ ACE_TRY_CHECK;
+ }
+ ACE_CATCHANY
+ {
+ ACE_PRINT_EXCEPTION (ACE_ANY_EXCEPTION, "TAO_FlowConnection::add_consumer");
+ return 0;
+ }
+ ACE_ENDTRY;
+ ACE_CHECK_RETURN (0);
+ return 1;
+}
+
+CORBA::Boolean
+TAO_FlowConnection::drop (AVStreams::FlowEndPoint_ptr target
+ ACE_ENV_ARG_DECL_NOT_USED)
+ ACE_THROW_SPEC ((CORBA::SystemException,
+ AVStreams::notConnected))
+{
+ ACE_UNUSED_ARG (target);
+ return 0;
+}
+
+// -----------------------------------------------------------------
+// TAO_FlowEndPoint
+// -----------------------------------------------------------------
+
+//default constructor.
+TAO_FlowEndPoint::TAO_FlowEndPoint (void)
+ :lock_ (0)
+{
+}
+
+TAO_FlowEndPoint::TAO_FlowEndPoint (const char *flowname,
+ AVStreams::protocolSpec &protocols,
+ const char *format)
+{
+ this->open (flowname, protocols, format);
+}
+
+void
+TAO_FlowEndPoint::set_flow_handler (const char * /*flowname*/,
+ TAO_AV_Flow_Handler * /*handler*/)
+{
+}
+
+int
+TAO_FlowEndPoint::open (const char *flowname,
+ AVStreams::protocolSpec &protocols,
+ const char *format)
+{
+ this->flowname_ = flowname;
+ this->format_ = format;
+
+ if (TAO_debug_level > 0) ACE_DEBUG ((LM_DEBUG, "TAO_FlowEndPoint::open\n"));
+ ACE_DECLARE_NEW_CORBA_ENV;
+ ACE_TRY
+ {
+ CORBA::Any flowname_any;
+ flowname_any <<= flowname;
+ this->define_property ("FlowName",
+ flowname_any
+ ACE_ENV_ARG_PARAMETER);
+ ACE_TRY_CHECK;
+ this->set_format (format
+ ACE_ENV_ARG_PARAMETER);
+ ACE_TRY_CHECK;
+ this->protocol_addresses_ = protocols;
+ AVStreams::protocolSpec protocol_spec (protocols.length ());
+ protocol_spec.length (protocols.length ());
+ if (TAO_debug_level > 0) ACE_DEBUG ((LM_DEBUG, "%N:%l\n"));
+ for (u_int i=0;i<protocols.length ();i++)
+ {
+ CORBA::String_var address = CORBA::string_dup (protocols [i]);
+ TAO_Forward_FlowSpec_Entry entry ("", "", "", "", address.in ());
+ protocol_spec [i] = CORBA::string_dup (entry.carrier_protocol_str ());
+ if (TAO_debug_level > 0)
+ ACE_DEBUG ((LM_DEBUG,
+ "[%s]\n",
+ static_cast<char const*>(protocol_spec[i])));
+ }
+ this->set_protocol_restriction (protocol_spec
+ ACE_ENV_ARG_PARAMETER);
+ ACE_TRY_CHECK;
+ }
+ ACE_CATCHANY
+ {
+ ACE_PRINT_EXCEPTION (ACE_ANY_EXCEPTION, "TAO_FlowEndPoint::open");
+ return -1;
+ }
+ ACE_ENDTRY;
+ ACE_CHECK_RETURN (-1);
+ return 0;
+}
+
+
+int
+TAO_FlowEndPoint::set_flowname (const char *flowname)
+{
+ this->flowname_ = flowname;
+ return 0;
+}
+
+// used by one flowconnection so that multiple connections cant use
+// the same flowendpoint.
+CORBA::Boolean
+TAO_FlowEndPoint::lock (ACE_ENV_SINGLE_ARG_DECL_NOT_USED)
+ ACE_THROW_SPEC ((CORBA::SystemException))
+{
+ // lock the current flowendpoint
+
+ if (this->lock_)
+ return 0;
+ this->lock_ = 1;
+ return 1;
+}
+
+// unlocks the flowendpoint , becomes free to be used in another flow.
+void
+TAO_FlowEndPoint::unlock (ACE_ENV_SINGLE_ARG_DECL_NOT_USED)
+ ACE_THROW_SPEC ((CORBA::SystemException))
+{
+ this->lock_ = 0;
+}
+
+
+void
+TAO_FlowEndPoint::destroy (ACE_ENV_SINGLE_ARG_DECL_NOT_USED)
+ ACE_THROW_SPEC ((CORBA::SystemException))
+{
+ int result = TAO_AV_Core::deactivate_servant (this);
+ if (result < 0)
+ if (TAO_debug_level > 0) ACE_DEBUG ((LM_DEBUG, "TAO_StreamEndPoint::destroy failed\n"));
+ TAO_AV_FlowSpecSetItor end = this->flow_spec_set_.end ();
+ for (TAO_AV_FlowSpecSetItor begin = this->flow_spec_set_.begin ();
+ begin != end; ++begin)
+ (*begin)->protocol_object ()->destroy ();
+}
+
+AVStreams::StreamEndPoint_ptr
+TAO_FlowEndPoint::related_sep (ACE_ENV_SINGLE_ARG_DECL_NOT_USED)
+ ACE_THROW_SPEC ((CORBA::SystemException))
+{
+
+ return AVStreams::StreamEndPoint::_duplicate (this->related_sep_.in ());
+}
+
+void
+TAO_FlowEndPoint::related_sep (AVStreams::StreamEndPoint_ptr related_sep
+ ACE_ENV_ARG_DECL_NOT_USED)
+ ACE_THROW_SPEC ((CORBA::SystemException))
+{
+ this->related_sep_ = AVStreams::StreamEndPoint::_duplicate (related_sep);
+}
+
+AVStreams::FlowConnection_ptr
+TAO_FlowEndPoint::related_flow_connection (ACE_ENV_SINGLE_ARG_DECL_NOT_USED)
+ ACE_THROW_SPEC ((CORBA::SystemException))
+{
+ return AVStreams::FlowConnection::_duplicate (this->related_flow_connection_.in ());
+}
+
+void
+TAO_FlowEndPoint::related_flow_connection (AVStreams::FlowConnection_ptr related_flow_connection
+ ACE_ENV_ARG_DECL_NOT_USED)
+ ACE_THROW_SPEC ((CORBA::SystemException))
+{
+ this->related_flow_connection_ = AVStreams::FlowConnection::_duplicate (related_flow_connection);
+}
+
+// returns the connected peer for this flow
+AVStreams::FlowEndPoint_ptr
+TAO_FlowEndPoint::get_connected_fep (ACE_ENV_SINGLE_ARG_DECL_NOT_USED)
+ ACE_THROW_SPEC ((CORBA::SystemException,
+ AVStreams::notConnected,
+ AVStreams::notSupported))
+{
+ return AVStreams::FlowEndPoint::_duplicate (this->peer_fep_.in ());
+}
+
+CORBA::Boolean
+TAO_FlowEndPoint::use_flow_protocol (const char * fp_name,
+ const CORBA::Any &
+ ACE_ENV_ARG_DECL)
+ ACE_THROW_SPEC ((CORBA::SystemException,
+ AVStreams::FPError,
+ AVStreams::notSupported))
+{
+ ACE_TRY
+ {
+ // Define the property called FlowProtocol
+ CORBA::Any flowname_property;
+ flowname_property <<= fp_name;
+ this->define_property ("FlowProtocol",
+ flowname_property
+ ACE_ENV_ARG_PARAMETER);
+ ACE_TRY_CHECK;
+ }
+ ACE_CATCHANY
+ {
+ ACE_PRINT_EXCEPTION (ACE_ANY_EXCEPTION, "TAO_FlowEndPoint::use_flow_protocol");
+ return 0;
+ }
+ ACE_ENDTRY;
+ ACE_CHECK_RETURN (0);
+ return 1;
+}
+
+void
+TAO_FlowEndPoint::set_format (const char * format
+ ACE_ENV_ARG_DECL)
+ ACE_THROW_SPEC ((CORBA::SystemException,
+ AVStreams::notSupported))
+{
+ this->format_ = format;
+ ACE_TRY
+ {
+ // make this a property so that is_fep_compatible can query this and
+ // check if 2 flowendpoints are compatible.
+ CORBA::Any format_val;
+ format_val <<= format;
+ this->define_property ("Format",
+ format_val
+ ACE_ENV_ARG_PARAMETER);
+ ACE_TRY_CHECK;
+ }
+ ACE_CATCHANY
+ {
+ ACE_PRINT_EXCEPTION (ACE_ANY_EXCEPTION, "TAO_FlowEndpoint::set_format");
+ }
+ ACE_ENDTRY;
+ ACE_CHECK;
+}
+
+void
+TAO_FlowEndPoint::set_dev_params (const CosPropertyService::Properties & new_settings
+ ACE_ENV_ARG_DECL)
+ ACE_THROW_SPEC ((CORBA::SystemException,
+ AVStreams::PropertyException,
+ AVStreams::streamOpFailed))
+{
+ this->dev_params_ = new_settings;
+ ACE_TRY
+ {
+ CORBA::Any DevParams_property;
+ DevParams_property <<= new_settings;
+ this->define_property ("DevParams",
+ DevParams_property
+ ACE_ENV_ARG_PARAMETER);
+ ACE_TRY_CHECK;
+ }
+ ACE_CATCHANY
+ {
+ ACE_PRINT_EXCEPTION (ACE_ANY_EXCEPTION, "TAO_FlowEndPoint::set_dev_params");
+ }
+ ACE_ENDTRY;
+ ACE_CHECK;
+}
+
+void
+TAO_FlowEndPoint::set_protocol_restriction (const AVStreams::protocolSpec & protocols
+ ACE_ENV_ARG_DECL)
+ ACE_THROW_SPEC ((CORBA::SystemException,
+ AVStreams::notSupported))
+{
+ ACE_TRY
+ {
+ u_int i = 0;
+ if (TAO_debug_level > 0) ACE_DEBUG ((LM_DEBUG, "%N:%l\n"));
+ for (i=0;i<protocols.length ();i++)
+ {
+ const char *protocol = (protocols)[i];
+ if (TAO_debug_level > 0) ACE_DEBUG ((LM_DEBUG, "%s\n", protocol));
+ }
+ CORBA::Any AvailableProtocols_property;
+ AvailableProtocols_property <<= protocols;
+ this->define_property ("AvailableProtocols",
+ AvailableProtocols_property
+ ACE_ENV_ARG_PARAMETER);
+ ACE_TRY_CHECK;
+ AVStreams::protocolSpec *temp_spec;
+ CORBA::Any_var temp_any = this->get_property_value ("AvailableProtocols"
+ ACE_ENV_ARG_PARAMETER);
+ ACE_TRY_CHECK;
+ temp_any.in () >>= temp_spec;
+ if (TAO_debug_level > 0) ACE_DEBUG ((LM_DEBUG, "%N:%l\n"));
+ for (i=0;i<temp_spec->length ();i++)
+ {
+ const char *protocol = (*temp_spec)[i];
+ if (TAO_debug_level > 0) ACE_DEBUG ((LM_DEBUG, "%s\n", protocol));
+ }
+ this->protocols_ = protocols;
+ }
+ ACE_CATCHANY
+ {
+ ACE_PRINT_EXCEPTION (ACE_ANY_EXCEPTION, "TAO_FlowEndpoint::set_protocol_restriction");
+ }
+ ACE_ENDTRY;
+ ACE_CHECK;
+}
+
+CORBA::Boolean
+TAO_FlowEndPoint::is_fep_compatible (AVStreams::FlowEndPoint_ptr peer_fep
+ ACE_ENV_ARG_DECL)
+ ACE_THROW_SPEC ((CORBA::SystemException,
+ AVStreams::formatMismatch,
+ AVStreams::deviceQosMismatch))
+{
+ const char *exception_message = "";
+ ACE_TRY
+ {
+ // check whether the passed flowendpoint is compatible with this flowendpoint.
+ // should we check for the availableFormats and choose one format.
+ // get my format value
+ CORBA::Any_var format_ptr;
+ CORBA::String_var my_format, peer_format;
+
+ exception_message = "TAO_FlowEndPoint::is_fep_compatible - Format";
+ format_ptr = this->get_property_value ("Format"
+ ACE_ENV_ARG_PARAMETER);
+ ACE_TRY_CHECK;
+
+ const char *temp_format;
+ format_ptr.in () >>= temp_format;
+ my_format = CORBA::string_dup (temp_format);
+ // get my peer's format value
+ exception_message = "TAO_FlowEndPoint::is_fep_compatible - Format[2]";
+ format_ptr = peer_fep->get_property_value ("Format"
+ ACE_ENV_ARG_PARAMETER);
+ ACE_TRY_CHECK;
+ format_ptr.in () >>= temp_format;
+ peer_format = CORBA::string_dup (temp_format);
+ if (ACE_OS::strcmp (my_format.in (),
+ peer_format.in ()) != 0)
+ return 0;
+
+ // since formats are same, check for a common protocol
+ CORBA::Any_var AvailableProtocols_ptr;
+ AVStreams::protocolSpec my_protocol_spec, peer_protocol_spec;
+ AVStreams::protocolSpec *temp_protocols;;
+
+ exception_message =
+ "TAO_FlowEndPoint::is_fep_compatible - AvailableProtocols";
+ AvailableProtocols_ptr = this->get_property_value ("AvailableProtocols"
+ ACE_ENV_ARG_PARAMETER);
+ ACE_TRY_CHECK;
+ AvailableProtocols_ptr.in () >>= temp_protocols;
+ my_protocol_spec = *temp_protocols;
+
+ exception_message =
+ "TAO_FlowEndPoint::is_fep_compatible - AvailableProtocols[2]";
+ AvailableProtocols_ptr = peer_fep->get_property_value ("AvailableProtocols"
+ ACE_ENV_ARG_PARAMETER);
+ ACE_TRY_CHECK;
+ AvailableProtocols_ptr.in () >>= temp_protocols;
+ peer_protocol_spec = *temp_protocols;
+
+ int protocol_match = 0;
+ for (u_int i=0;i<my_protocol_spec.length ();i++)
+ {
+ CORBA::String_var my_protocol_string;
+ for (u_int j=0;j<peer_protocol_spec.length ();j++)
+ {
+ CORBA::String_var peer_protocol_string;
+ my_protocol_string = CORBA::string_dup (my_protocol_spec[i]);
+ peer_protocol_string = CORBA::string_dup (peer_protocol_spec[j]);
+ if (ACE_OS::strcmp (my_protocol_string.in (), peer_protocol_string.in ()) == 0)
+ {
+ protocol_match = 1;
+ break;
+ }
+ }
+ if (protocol_match)
+ break;
+ }
+ if (!protocol_match)
+ return 0;
+ }
+ ACE_CATCH (CosPropertyService::PropertyNotFound, nf)
+ {
+ ACE_PRINT_EXCEPTION (nf,
+ exception_message);
+ }
+ ACE_CATCHANY
+ {
+ ACE_PRINT_EXCEPTION (ACE_ANY_EXCEPTION,
+ "TAO_FlowEndPoint::is_fep_compatible");
+ return 0;
+ }
+ ACE_ENDTRY;
+ ACE_CHECK_RETURN (0);
+ return 1;
+}
+
+CORBA::Boolean
+TAO_FlowEndPoint::set_peer (AVStreams::FlowConnection_ptr /* the_fc */,
+ AVStreams::FlowEndPoint_ptr the_peer_fep,
+ AVStreams::QoS & /* the_qos */
+ ACE_ENV_ARG_DECL_NOT_USED)
+ ACE_THROW_SPEC ((CORBA::SystemException,
+ AVStreams::QoSRequestFailed,
+ AVStreams::streamOpFailed))
+{
+ this->peer_fep_ =
+ AVStreams::FlowEndPoint::_duplicate (the_peer_fep);
+ return 1;
+}
+
+CORBA::Boolean
+TAO_FlowEndPoint::set_Mcast_peer (AVStreams::FlowConnection_ptr /* the_fc */,
+ AVStreams::MCastConfigIf_ptr mcast_peer,
+ AVStreams::QoS & /* the_qos */
+ ACE_ENV_ARG_DECL_NOT_USED)
+ ACE_THROW_SPEC ((CORBA::SystemException,
+ AVStreams::QoSRequestFailed))
+{
+ this->mcast_peer_ = AVStreams::MCastConfigIf::_duplicate (mcast_peer);
+ return 0;
+}
+
+char *
+TAO_FlowEndPoint::go_to_listen_i (TAO_FlowSpec_Entry::Role role,
+ AVStreams::QoS & /*the_qos*/,
+ CORBA::Boolean /*is_mcast*/,
+ AVStreams::FlowEndPoint_ptr peer_fep,
+ char *& flowProtocol
+ ACE_ENV_ARG_DECL)
+ ACE_THROW_SPEC ((CORBA::SystemException,
+ AVStreams::failedToListen,
+ AVStreams::FPError,
+ AVStreams::QoSRequestFailed))
+{
+ char direction [BUFSIZ];
+ switch (role)
+ {
+ case TAO_FlowSpec_Entry::TAO_AV_PRODUCER:
+ ACE_OS::strcpy (direction, "IN");
+ break;
+ case TAO_FlowSpec_Entry::TAO_AV_CONSUMER:
+ ACE_OS::strcpy (direction, "OUT");
+ break;
+ default:
+ break;
+ }
+ AVStreams::protocolSpec my_protocol_spec, peer_protocol_spec;
+ AVStreams::protocolSpec *temp_protocols;
+ CORBA::Any_var AvailableProtocols_ptr =
+ peer_fep->get_property_value ("AvailableProtocols"
+ ACE_ENV_ARG_PARAMETER);
+ ACE_CHECK_RETURN (0);
+ AvailableProtocols_ptr.in () >>= temp_protocols;
+ peer_protocol_spec = *temp_protocols;
+ AvailableProtocols_ptr =
+ this->get_property_value ("AvailableProtocols"
+ ACE_ENV_ARG_PARAMETER);
+ ACE_CHECK_RETURN (0);
+ AvailableProtocols_ptr.in () >>= temp_protocols;
+ my_protocol_spec = *temp_protocols;
+ int protocol_match = 0;
+ CORBA::String_var listen_protocol;
+ u_int i =0;
+ for (i=0;i<my_protocol_spec.length ();i++)
+ {
+ CORBA::String_var my_protocol_string;
+ for (u_int j=0;j<peer_protocol_spec.length ();j++)
+ {
+ CORBA::String_var peer_protocol_string;
+ my_protocol_string = CORBA::string_dup (my_protocol_spec[i]);
+ peer_protocol_string = CORBA::string_dup (peer_protocol_spec[j]);
+ if (ACE_OS::strcmp (my_protocol_string.in (), peer_protocol_string.in ()) == 0)
+ {
+ listen_protocol = my_protocol_string;
+ protocol_match = 1;
+ break;
+ }
+ }
+ if (protocol_match)
+ break;
+ }
+ if (!protocol_match)
+ ACE_ERROR_RETURN ((LM_ERROR, "TAO_FlowEndPoint::go_to_listen failed: no protoocol match\n"), 0);
+
+ for (u_int j=0;j<this->protocol_addresses_.length ();j++)
+ if (ACE_OS::strncmp (this->protocol_addresses_ [j], listen_protocol.in (), ACE_OS::strlen (listen_protocol.in ())) == 0)
+ {
+ // Now listen on that protocol.
+ TAO_Forward_FlowSpec_Entry *entry;
+ ACE_NEW_RETURN (entry,
+ TAO_Forward_FlowSpec_Entry (this->flowname_.in (),
+ direction,
+ this->format_.in (),
+ flowProtocol,
+ this->protocol_addresses_ [j]),
+ 0);
+
+ TAO_AV_Acceptor_Registry *acceptor_registry = TAO_AV_CORE::instance ()->acceptor_registry ();
+ this->flow_spec_set_.insert (entry);
+ int result = acceptor_registry->open (this,
+ TAO_AV_CORE::instance (),
+ this->flow_spec_set_);
+ if (result < 0)
+ return 0;
+ char *listen_address = entry->get_local_addr_str ();
+ char *address;
+ ACE_NEW_RETURN (address,
+ char [BUFSIZ],
+ 0);
+ ACE_OS::sprintf (address, "%s=%s", listen_protocol.in (), listen_address);
+ return address;
+ }
+ return 0;
+}
+
+
+CORBA::Boolean
+TAO_FlowEndPoint::connect_to_peer_i (TAO_FlowSpec_Entry::Role role,
+ AVStreams::QoS & /*the_qos*/,
+ const char * address,
+ const char * use_flow_protocol
+ ACE_ENV_ARG_DECL_NOT_USED)
+ ACE_THROW_SPEC ((CORBA::SystemException,
+ AVStreams::failedToConnect,
+ AVStreams::FPError,
+ AVStreams::QoSRequestFailed))
+{
+ char direction [BUFSIZ];
+ switch (role)
+ {
+ case TAO_FlowSpec_Entry::TAO_AV_PRODUCER:
+ ACE_OS::strcpy (direction, "IN");
+ break;
+ case TAO_FlowSpec_Entry::TAO_AV_CONSUMER:
+ ACE_OS::strcpy (direction, "OUT");
+ break;
+ default:
+ break;
+ }
+ TAO_Forward_FlowSpec_Entry *entry;
+ ACE_NEW_RETURN (entry,
+ TAO_Forward_FlowSpec_Entry (this->flowname_.in (),
+ direction,
+ this->format_.in (),
+ use_flow_protocol,
+ address),
+ 0);
+ this->flow_spec_set_.insert (entry);
+ TAO_AV_Connector_Registry *connector_registry = TAO_AV_CORE::instance ()->connector_registry ();
+ int result = connector_registry->open (this,
+ TAO_AV_CORE::instance (),
+ this->flow_spec_set_);
+ if (result < 0)
+ ACE_ERROR_RETURN ((LM_ERROR, "TAO_FlowEndPoint::connector_registry::open failed\n"), 0);
+ this->reverse_channel_ = entry->get_local_addr_str ();
+ return 1;
+}
+
+int
+TAO_FlowEndPoint::set_protocol_object (const char * /*flowname*/,
+ TAO_AV_Protocol_Object * /*object*/)
+{
+ return 0;
+}
+
+
+// ------------------------------------------------------------
+// TAO_FlowProducer class
+// ------------------------------------------------------------
+
+//default constructor
+TAO_FlowProducer::TAO_FlowProducer (void)
+{
+}
+
+TAO_FlowProducer::TAO_FlowProducer (const char *flowname,
+ AVStreams::protocolSpec protocols,
+ const char *format)
+{
+ this->open (flowname, protocols, format);
+}
+
+// gets the reverse channel for feedback.
+char *
+TAO_FlowProducer::get_rev_channel (const char * /*pcol_name*/
+ ACE_ENV_ARG_DECL_NOT_USED)
+ ACE_THROW_SPEC ((CORBA::SystemException))
+{
+ return 0;
+}
+
+// The start, stop and destroy are to be handled by the application.
+void
+TAO_FlowProducer::stop (ACE_ENV_SINGLE_ARG_DECL_NOT_USED)
+ ACE_THROW_SPEC ((CORBA::SystemException))
+{
+ TAO_AV_FlowSpecSetItor end = this->flow_spec_set_.end ();
+ for (TAO_AV_FlowSpecSetItor begin = this->flow_spec_set_.begin ();
+ begin != end; ++begin)
+ {
+ TAO_FlowSpec_Entry *entry = (*begin);
+ entry->handler ()->stop (TAO_FlowSpec_Entry::TAO_AV_PRODUCER);
+ }
+}
+
+void
+TAO_FlowProducer::start (ACE_ENV_SINGLE_ARG_DECL_NOT_USED)
+ ACE_THROW_SPEC ((CORBA::SystemException))
+{
+ TAO_AV_FlowSpecSetItor end = this->flow_spec_set_.end ();
+ for (TAO_AV_FlowSpecSetItor begin = this->flow_spec_set_.begin ();
+ begin != end; ++begin)
+ {
+ TAO_FlowSpec_Entry *entry = (*begin);
+ if (entry->handler () != 0)
+ {
+ entry->handler ()->start (TAO_FlowSpec_Entry::TAO_AV_PRODUCER);
+ }
+ if (entry->control_handler () != 0)
+ {
+ entry->control_handler ()->start (TAO_FlowSpec_Entry::TAO_AV_PRODUCER);
+ }
+ }
+}
+
+char *
+TAO_FlowProducer::go_to_listen (AVStreams::QoS & the_qos,
+ CORBA::Boolean is_mcast,
+ AVStreams::FlowEndPoint_ptr peer_fep,
+ char *& flowProtocol
+ ACE_ENV_ARG_DECL)
+ ACE_THROW_SPEC ((CORBA::SystemException,
+ AVStreams::failedToListen,
+ AVStreams::FPError,
+ AVStreams::QoSRequestFailed))
+{
+ return this->go_to_listen_i (TAO_FlowSpec_Entry::TAO_AV_PRODUCER,
+ the_qos,
+ is_mcast,
+ peer_fep,
+ flowProtocol
+ ACE_ENV_ARG_PARAMETER);
+}
+
+CORBA::Boolean
+TAO_FlowProducer::connect_to_peer (AVStreams::QoS & the_qos,
+ const char * address,
+ const char * use_flow_protocol
+ ACE_ENV_ARG_DECL)
+ ACE_THROW_SPEC ((CORBA::SystemException,
+ AVStreams::failedToConnect,
+ AVStreams::FPError,
+ AVStreams::QoSRequestFailed))
+{
+ return this->connect_to_peer_i (TAO_FlowSpec_Entry::TAO_AV_PRODUCER,
+ the_qos,
+ address,
+ use_flow_protocol
+ ACE_ENV_ARG_PARAMETER);
+}
+// Connect to a IP multicast address.
+char *
+TAO_FlowProducer::connect_mcast (AVStreams::QoS & /* the_qos */,
+ CORBA::Boolean_out /* is_met */,
+ const char *address,
+ const char * use_flow_protocol
+ ACE_ENV_ARG_DECL_NOT_USED)
+ ACE_THROW_SPEC ((CORBA::SystemException,
+ AVStreams::failedToConnect,
+ AVStreams::notSupported,
+ AVStreams::FPError,
+ AVStreams::QoSRequestFailed))
+{
+ // The address variable gives the multicast address to subscribe to.
+ for (u_int i=0;i<this->protocols_.length ();i++)
+ {
+ // choose the protocol which supports multicast.
+ }
+
+ if (address == 0)
+ if (TAO_debug_level > 0)
+ ACE_DEBUG ((LM_DEBUG, "TAO_FlowProducer::connect_mcast address is 0\n"));
+ TAO_Forward_FlowSpec_Entry *entry;
+ ACE_NEW_RETURN (entry,
+ TAO_Forward_FlowSpec_Entry(this->flowname_.in (),
+ "IN",
+ this->format_.in (),
+ use_flow_protocol,
+ address),
+ 0);
+
+ this->flow_spec_set_.insert (entry);
+ TAO_AV_Acceptor_Registry *acceptor_registry =
+ TAO_AV_CORE::instance ()->acceptor_registry ();
+ int result = acceptor_registry->open (this,
+ TAO_AV_CORE::instance (),
+ this->flow_spec_set_);
+ if (result < 0)
+ ACE_ERROR_RETURN ((LM_ERROR, "TAO_FlowProducer::connect_mcast:acceptor_registry open failed\n"), 0);
+ // Now remove our handler from the reactor since we're a producer and dont want to get called for
+ // multicast packets.
+ ACE_Event_Handler *event_handler = entry->handler ()->event_handler ();
+ event_handler->reactor ()->remove_handler (event_handler,
+ ACE_Event_Handler::READ_MASK);
+ return CORBA::string_dup (address);
+}
+
+// sets the key for this flow.
+void
+TAO_FlowProducer::set_key (const AVStreams::key & the_key
+ ACE_ENV_ARG_DECL)
+ ACE_THROW_SPEC ((CORBA::SystemException))
+{
+ ACE_TRY
+ {
+ CORBA::Any anyval;
+ anyval <<= the_key;
+ this->define_property ("PublicKey",
+ anyval
+ ACE_ENV_ARG_PARAMETER);
+ ACE_TRY_CHECK;
+ }
+ ACE_CATCHANY
+ {
+ ACE_PRINT_EXCEPTION (ACE_ANY_EXCEPTION, "TAO_FlowProducer::set_key");
+ }
+ ACE_ENDTRY;
+ ACE_CHECK;
+}
+
+// source id to be used to distinguish this source from others.
+void
+TAO_FlowProducer::set_source_id (CORBA::Long source_id
+ ACE_ENV_ARG_DECL_NOT_USED)
+ ACE_THROW_SPEC ((CORBA::SystemException))
+{
+ this->source_id_ = source_id;
+}
+
+// ------------------------------------------------------------
+// TAO_FlowConsumer
+// ------------------------------------------------------------
+
+
+// default constructor.
+TAO_FlowConsumer::TAO_FlowConsumer (void)
+{
+}
+
+TAO_FlowConsumer::TAO_FlowConsumer (const char *flowname,
+ AVStreams::protocolSpec protocols,
+ const char *format)
+{
+ this->open (flowname, protocols, format);
+}
+
+// The start, stop and destroy are to be handled by the application.
+void
+TAO_FlowConsumer::stop (ACE_ENV_SINGLE_ARG_DECL_NOT_USED)
+ ACE_THROW_SPEC ((CORBA::SystemException))
+{
+ TAO_AV_FlowSpecSetItor end = this->flow_spec_set_.end ();
+ for (TAO_AV_FlowSpecSetItor begin = this->flow_spec_set_.begin ();
+ begin != end; ++begin)
+ (*begin)->handler ()->stop (TAO_FlowSpec_Entry::TAO_AV_CONSUMER);
+}
+
+void
+TAO_FlowConsumer::start (ACE_ENV_SINGLE_ARG_DECL_NOT_USED)
+ ACE_THROW_SPEC ((CORBA::SystemException))
+{
+ TAO_AV_FlowSpecSetItor end = this->flow_spec_set_.end ();
+ for (TAO_AV_FlowSpecSetItor begin = this->flow_spec_set_.begin ();
+ begin != end; ++begin)
+ {
+ (*begin)->handler ()->start (TAO_FlowSpec_Entry::TAO_AV_CONSUMER);
+ }
+}
+
+char *
+TAO_FlowConsumer::go_to_listen (AVStreams::QoS & the_qos,
+ CORBA::Boolean is_mcast,
+ AVStreams::FlowEndPoint_ptr peer_fep,
+ char *& flowProtocol
+ ACE_ENV_ARG_DECL)
+ ACE_THROW_SPEC ((CORBA::SystemException,
+ AVStreams::failedToListen,
+ AVStreams::FPError,
+ AVStreams::QoSRequestFailed))
+{
+ return this->go_to_listen_i (TAO_FlowSpec_Entry::TAO_AV_CONSUMER,
+ the_qos,
+ is_mcast,
+ peer_fep,
+ flowProtocol
+ ACE_ENV_ARG_PARAMETER);
+}
+
+CORBA::Boolean
+TAO_FlowConsumer::connect_to_peer (AVStreams::QoS & the_qos,
+ const char * address,
+ const char * use_flow_protocol
+ ACE_ENV_ARG_DECL)
+ ACE_THROW_SPEC ((CORBA::SystemException,
+ AVStreams::failedToConnect,
+ AVStreams::FPError,
+ AVStreams::QoSRequestFailed))
+{
+ return this->connect_to_peer_i (TAO_FlowSpec_Entry::TAO_AV_CONSUMER,
+ the_qos,
+ address,
+ use_flow_protocol
+ ACE_ENV_ARG_PARAMETER);
+}
+
+//------------------------------------------------------------
+// TAO_Tokenizer
+//------------------------------------------------------------
+TAO_Tokenizer::TAO_Tokenizer (const char *string, char delimiter)
+ :token_array_ (10),
+ count_ (0)
+{
+ this->parse (string, delimiter);
+}
+
+TAO_Tokenizer::~TAO_Tokenizer ()
+{
+ for (unsigned int i=0; i<this->num_tokens_; i++)
+ CORBA::string_free (this->token_array_[i]);
+}
+
+
+int
+TAO_Tokenizer::parse (const char *string, char delimiter)
+{
+ ACE_CString new_string (string);
+ u_int pos =0;
+ ACE_CString::size_type slash_pos = 0;
+ u_int count = 0;
+ int result;
+ while (pos < new_string.length ())
+ {
+ slash_pos = new_string.find (delimiter, pos);
+ ACE_CString substring;
+ if (slash_pos != new_string.npos)
+ {
+ substring = new_string.substring (pos,
+ slash_pos - pos);
+ pos = slash_pos + 1;
+ }
+ else
+ {
+ substring = new_string.substring (pos);
+ pos = static_cast<int> (new_string.length ());
+ }
+ char *token = CORBA::string_dup (substring.c_str ());
+ result = this->token_array_.set (token, count);
+ if (result == -1)
+ {
+ this->token_array_.size (this->token_array_.size ()*2);
+ result = this->token_array_.set (token, count);
+ if (result == -1)
+ ACE_ERROR_RETURN ((LM_ERROR, "TAO_Tokenizer::parse error"), -1);
+ }
+ count++;
+ }
+
+ /*
+ ACE_OS::strcpy (this->string_ , string);
+ char delimiter_str [2] = {0, 0};
+ delimiter_str [0] = delimiter;
+ char *token = ACE_OS::strtok (this->string_, delimiter_str);
+
+ while (token != 0)
+ {
+ result = this->token_array_.set (token, count);
+ if (result == -1)
+ {
+ this->token_array_.size (this->token_array_.size ()*2);
+ result = this->token_array_.set (token, count);
+ if (result == -1)
+ ACE_ERROR_RETURN ((LM_ERROR, "TAO_Tokenizer::parse error"), -1);
+ }
+ token = ACE_OS::strtok (0, delimiter_str);
+ count++;
+ }
+ */
+ this->num_tokens_ = count;
+ return 0;
+}
+
+char*
+TAO_Tokenizer::token (void)
+{
+ if (count_ < num_tokens_)
+ return CORBA::string_dup (this->token_array_[this->count_++]);
+ else
+ return 0;
+}
+
+int
+TAO_Tokenizer::num_tokens (void)
+{
+ return static_cast<int> (this->num_tokens_);
+}
+
+const char *
+TAO_Tokenizer::operator [] (size_t index) const
+{
+ if (index >= this->num_tokens_)
+ return 0;
+
+ return this->token_array_[index];
+}
+
+TAO_END_VERSIONED_NAMESPACE_DECL
diff --git a/TAO/orbsvcs/orbsvcs/AV/AVStreams_i.h b/TAO/orbsvcs/orbsvcs/AV/AVStreams_i.h
new file mode 100644
index 00000000000..8e23294c9bc
--- /dev/null
+++ b/TAO/orbsvcs/orbsvcs/AV/AVStreams_i.h
@@ -0,0 +1,1536 @@
+// -*- C++ -*-
+
+//=============================================================================
+/**
+ * @file AVStreams_i.h
+ *
+ * $Id$
+ *
+ * @author Sumedh Mungee <sumedh@cs.wustl.edu>
+ * @author Nagarajan Surendran <naga@cs.wustl.edu>
+ */
+//=============================================================================
+
+#ifndef AVSTREAMS_I_H
+#define AVSTREAMS_I_H
+#include /**/ "ace/pre.h"
+
+#include "orbsvcs/AV/AV_Core.h"
+
+#include "orbsvcs/AV/AV_export.h"
+#include "orbsvcs/CosPropertyS.h"
+#include "orbsvcs/AVStreamsS.h"
+#include "orbsvcs/Property/CosPropertyService_i.h"
+#include "orbsvcs/CosNamingC.h"
+#include "orbsvcs/AV/AV_Core.h"
+#include "orbsvcs/AV/Endpoint_Strategy.h"
+#include "orbsvcs/Null_MediaCtrlS.h"
+#include "orbsvcs/AV/FlowSpec_Entry.h"
+
+#include "ace/OS.h"
+#include "ace/SOCK_Dgram_Mcast.h"
+#include "ace/ATM_Addr.h"
+#include "ace/Containers_T.h"
+#include "ace/Process.h"
+#include "ace/SOCK_CODgram.h"
+#include "ace/SOCK_Connector.h"
+#include "ace/Connector.h"
+#include "ace/Acceptor.h"
+#include "ace/SOCK_Stream.h"
+#include "ace/Svc_Handler.h"
+#include "ace/SOCK_Acceptor.h"
+
+#define FLOWSPEC_MAX 5
+// for the Hash_Map helper classes.
+
+TAO_BEGIN_VERSIONED_NAMESPACE_DECL
+
+typedef ACE_Hash_Map_Manager <ACE_CString,AVStreams::FlowEndPoint_var,ACE_Null_Mutex> FlowEndPoint_Map;
+typedef ACE_Hash_Map_Entry <ACE_CString,AVStreams::FlowEndPoint_var> FlowEndPoint_Map_Entry;
+typedef ACE_Hash_Map_Iterator <ACE_CString,AVStreams::FlowEndPoint_var,ACE_Null_Mutex> FlowEndPoint_Map_Iterator;
+
+typedef ACE_Hash_Map_Manager <ACE_CString,TAO_AV_Flow_Handler*,ACE_Null_Mutex> Flow_Handler_Map;
+typedef ACE_Hash_Map_Entry <ACE_CString,TAO_AV_Flow_Handler*> Flow_Handler_Map_Entry;
+typedef ACE_Hash_Map_Iterator <ACE_CString,TAO_AV_Flow_Handler*,ACE_Null_Mutex> Flow_Handler_Map_Iterator;
+
+
+
+class TAO_AV_Export AV_Null_MediaCtrl
+ : public virtual POA_Null_MediaCtrl
+{
+public:
+ AV_Null_MediaCtrl (void);
+
+protected:
+
+ virtual ~AV_Null_MediaCtrl (void);
+
+};
+
+/**
+ * @class TAO_Basic_StreamCtrl
+ * @brief Base class for StreamCtrl, implements basic stream start
+ * and stop functionality.
+ */
+class TAO_AV_Export TAO_Basic_StreamCtrl
+ : public virtual POA_AVStreams::Basic_StreamCtrl,
+ public virtual TAO_PropertySet
+{
+
+public:
+ /// Default Constructor
+ TAO_Basic_StreamCtrl (void);
+
+ /// Stop the transfer of data of the stream
+ /// Empty the_spec means apply operation to all flows
+ virtual void stop (const AVStreams::flowSpec &the_spec
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS)
+ ACE_THROW_SPEC ((CORBA::SystemException,
+ AVStreams::noSuchFlow));
+
+ /// Start the transfer of data in the stream.
+ /// Empty the_spec means apply operation to all flows
+ virtual void start (const AVStreams::flowSpec &the_spec
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS)
+ ACE_THROW_SPEC ((CORBA::SystemException,
+ AVStreams::noSuchFlow));
+
+ /**
+ * Tears down the stream. This will close the connection, and delete
+ * the streamendpoint and vdev associated with this stream
+ * Empty the_spec means apply operation to all flows
+ */
+ virtual void destroy (const AVStreams::flowSpec &the_spec
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS)
+ ACE_THROW_SPEC ((CORBA::SystemException,
+ AVStreams::noSuchFlow));
+
+ /// Changes the QoS associated with the stream
+ /// Empty the_spec means apply operation to all flows
+ virtual CORBA::Boolean modify_QoS (AVStreams::streamQoS &new_qos,
+ const AVStreams::flowSpec &the_spec
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS)
+ ACE_THROW_SPEC ((CORBA::SystemException,
+ AVStreams::noSuchFlow,
+ AVStreams::QoSRequestFailed));
+
+ /// Used by StreamEndPoint and VDev to inform StreamCtrl of events.
+ /// E.g., loss of flow, reestablishment of flow, etc..
+ virtual void push_event (const struct CosPropertyService::Property & the_event
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS)
+ ACE_THROW_SPEC ((CORBA::SystemException));
+
+ /// Used to control the flow protocol parameters.
+ virtual void set_FPStatus (const AVStreams::flowSpec &the_spec,
+ const char *fp_name,
+ const CORBA::Any &fp_settings
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS)
+ ACE_THROW_SPEC ((CORBA::SystemException,
+ AVStreams::noSuchFlow,
+ AVStreams::FPError));
+
+ /// Not implemented in the light profile, will raise the notsupported
+ /// exception
+ virtual CORBA::Object_ptr get_flow_connection (const char *flow_name
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS)
+ ACE_THROW_SPEC ((CORBA::SystemException,
+ AVStreams::noSuchFlow,
+ AVStreams::notSupported));
+
+ /// Not implemented in the light profile, will raise the notsupported
+ /// exception
+ virtual void set_flow_connection (const char *flow_name,
+ CORBA::Object_ptr flow_connection
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS)
+ ACE_THROW_SPEC ((CORBA::SystemException,
+ AVStreams::noSuchFlow,
+ AVStreams::notSupported));
+
+protected:
+
+ /// Destructor.
+ virtual ~TAO_Basic_StreamCtrl (void);
+
+
+ /// The Virtual Devices for this stream
+ AVStreams::VDev_var vdev_a_;
+ AVStreams::VDev_var vdev_b_;
+
+ /// The Endpoints for this stream
+ AVStreams::StreamEndPoint_A_var sep_a_;
+ AVStreams::StreamEndPoint_B_var sep_b_;
+
+ /// Hash table for the flow names and its corresponding flowconnection object reference.
+ typedef ACE_Hash_Map_Manager <ACE_CString,AVStreams::FlowConnection_var,ACE_Null_Mutex> FlowConnection_Map;
+ typedef ACE_Hash_Map_Iterator <ACE_CString,AVStreams::FlowConnection_var,ACE_Null_Mutex> FlowConnection_Map_Iterator;
+ typedef ACE_Hash_Map_Entry <ACE_CString,AVStreams::FlowConnection_var> FlowConnection_Map_Entry;
+ FlowConnection_Map flow_connection_map_;
+ AVStreams::FlowConnection_seq flowConnections_;
+
+ ///sequence of flow names.
+ u_int flow_count_;
+ AVStreams::flowSpec flows_;
+};
+
+class TAO_AV_Export TAO_Negotiator
+ : public POA_AVStreams::Negotiator
+{
+public:
+ virtual CORBA::Boolean negotiate (AVStreams::Negotiator_ptr remote_negotiator,
+ const AVStreams::streamQoS &qos_spec
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS)
+ ACE_THROW_SPEC ((CORBA::SystemException));
+};
+
+class TAO_MCastConfigIf;
+
+class TAO_AV_Export MMDevice_Map_Hash_Key
+{
+public:
+ /// default constructor.
+ MMDevice_Map_Hash_Key (void);
+
+ /// constructor.
+ MMDevice_Map_Hash_Key (AVStreams::MMDevice_ptr mmdevice);
+
+ /// copy constructor.
+ MMDevice_Map_Hash_Key (const MMDevice_Map_Hash_Key&);
+
+ /// destructor.
+ ~MMDevice_Map_Hash_Key (void);
+
+ /// operator== needed by ACE_Hash_Map_Manager.
+ bool operator == (const MMDevice_Map_Hash_Key &hash_key) const;
+
+ /// operator== needed by ACE_Hash_Map_Manager.
+ friend bool operator < (const MMDevice_Map_Hash_Key &left,
+ const MMDevice_Map_Hash_Key &right);
+
+ /// hash function for this mmdevice.
+ u_long hash (void) const;
+
+ static const int hash_maximum_;
+protected:
+ AVStreams::MMDevice_ptr mmdevice_;
+};
+
+/**
+ * @class TAO_StreamCtrl
+ * @brief Implementation the A/V StreamCtrl class. this class
+ * is used to control the stream. It should be subclassed
+ * by applications that want to provide more control features.
+ */
+class TAO_AV_Export TAO_StreamCtrl
+ : public virtual POA_AVStreams::StreamCtrl,
+ public virtual TAO_Basic_StreamCtrl
+{
+
+public:
+
+ /// Default Constructor
+ TAO_StreamCtrl (void);
+
+ /// virtual destructor.
+ virtual ~TAO_StreamCtrl (void);
+
+ /// Stop the transfer of data of the stream
+ /// Empty the_spec means apply operation to all flows
+ virtual void stop (const AVStreams::flowSpec &the_spec
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS)
+ ACE_THROW_SPEC ((CORBA::SystemException,
+ AVStreams::noSuchFlow));
+
+ /// Start the transfer of data in the stream.
+ /// Empty the_spec means apply operation to all flows
+ virtual void start (const AVStreams::flowSpec &the_spec
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS)
+ ACE_THROW_SPEC ((CORBA::SystemException,
+ AVStreams::noSuchFlow));
+
+ /**
+ * Tears down the stream. This will close the connection, and delete
+ * the streamendpoint and vdev associated with this stream
+ * Empty the_spec means apply operation to all flows
+ */
+ virtual void destroy (const AVStreams::flowSpec &the_spec
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS)
+ ACE_THROW_SPEC ((CORBA::SystemException,
+ AVStreams::noSuchFlow));
+
+ /**
+ * Establish a stream between a_party and b_party,
+ * with qos the_qos, and for the flows in the_flows
+ * if the_flows is empty, bind all the flows
+ * Causes a connection to be established between the StreamEndpoints.
+ * Returns success/failure
+ */
+ virtual CORBA::Boolean bind_devs (AVStreams::MMDevice_ptr a_party,
+ AVStreams::MMDevice_ptr b_party,
+ AVStreams::streamQoS& the_qos,
+ const AVStreams::flowSpec& the_flows
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS)
+ ACE_THROW_SPEC ((CORBA::SystemException,
+ AVStreams::streamOpFailed,
+ AVStreams::noSuchFlow,
+ AVStreams::QoSRequestFailed));
+
+ /**
+ * Establish a connection between two streamendpoints. This can
+ * be used if the streamendpoints have been created independent of
+ * a MMDevice
+ */
+ virtual CORBA::Boolean bind (AVStreams::StreamEndPoint_A_ptr a_party,
+ AVStreams::StreamEndPoint_B_ptr b_party,
+ AVStreams::streamQoS &the_qos,
+ const AVStreams::flowSpec &the_flows
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS)
+ ACE_THROW_SPEC ((CORBA::SystemException,
+ AVStreams::streamOpFailed,
+ AVStreams::noSuchFlow,
+ AVStreams::QoSRequestFailed));
+
+ virtual void unbind_dev (AVStreams::MMDevice_ptr dev,
+ const AVStreams::flowSpec & the_spec
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS)
+ ACE_THROW_SPEC ((CORBA::SystemException,
+ AVStreams::streamOpFailed,
+ AVStreams::noSuchFlow));
+
+ /// Unbind the_ep from the stream. Empty the_spec means apply to all flows.
+ virtual void unbind_party (AVStreams::StreamEndPoint_ptr the_ep,
+ const AVStreams::flowSpec &the_spec
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS)
+ ACE_THROW_SPEC ((CORBA::SystemException,
+ AVStreams::streamOpFailed,
+ AVStreams::noSuchFlow));
+
+ /// unbind the stream. Same effect as Basic_StreamCtrl::destroy ()
+ virtual void unbind (ACE_ENV_SINGLE_ARG_DECL_WITH_DEFAULTS)
+ ACE_THROW_SPEC ((CORBA::SystemException,
+ AVStreams::streamOpFailed));
+
+ virtual AVStreams::VDev_ptr get_related_vdev (AVStreams::MMDevice_ptr adev,
+ AVStreams::StreamEndPoint_out sep
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS)
+ ACE_THROW_SPEC ((CORBA::SystemException,
+ AVStreams::streamOpFailed));
+
+ /// Changes the QoS associated with the stream
+ /// Empty the_spec means apply operation to all flows
+ virtual CORBA::Boolean modify_QoS (AVStreams::streamQoS &new_qos,
+ const AVStreams::flowSpec &the_spec
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS)
+ ACE_THROW_SPEC ((CORBA::SystemException,
+ AVStreams::noSuchFlow,
+ AVStreams::QoSRequestFailed));
+
+protected:
+
+ struct MMDevice_Map_Entry
+ {
+ AVStreams::StreamEndPoint_var sep_;
+ AVStreams::VDev_var vdev_;
+ AVStreams::flowSpec flowspec_;
+ AVStreams::streamQoS qos_;
+ };
+
+ typedef ACE_Hash_Map_Manager <MMDevice_Map_Hash_Key,MMDevice_Map_Entry,ACE_Null_Mutex> MMDevice_Map;
+ typedef ACE_Hash_Map_Iterator <MMDevice_Map_Hash_Key,MMDevice_Map_Entry,ACE_Null_Mutex> MMDevice_Map_Iterator;
+
+ MMDevice_Map mmdevice_a_map_;
+ MMDevice_Map mmdevice_b_map_;
+ TAO_MCastConfigIf *mcastconfigif_;
+ AVStreams::MCastConfigIf_var mcastconfigif_ptr_;
+ AVStreams::StreamCtrl_var streamctrl_;
+ CORBA::ULong source_id_;
+};
+
+class TAO_AV_Export TAO_MCastConfigIf
+ : public virtual POA_AVStreams::MCastConfigIf,
+ public virtual TAO_PropertySet
+{
+public:
+
+ enum Peer_Interface {VDEV = 0, FLOWENDPOINT=1};
+ struct Peer_Info
+ {
+ AVStreams::VDev_var peer_;
+ AVStreams::FlowEndPoint_var fep_;
+ AVStreams::streamQoS qos_;
+ AVStreams::flowSpec flow_spec_;
+ Peer_Interface interface_;
+ };
+
+ /// Default constructor.
+ TAO_MCastConfigIf (void);
+
+ /// Dtor
+ ~TAO_MCastConfigIf (void);
+
+ virtual CORBA::Boolean set_peer (CORBA::Object_ptr peer,
+ AVStreams::streamQoS & the_qos,
+ const AVStreams::flowSpec & the_spec
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS)
+ ACE_THROW_SPEC ((CORBA::SystemException,
+ AVStreams::QoSRequestFailed,
+ AVStreams::streamOpFailed));
+
+ virtual void configure (const CosPropertyService::Property & a_configuration
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS)
+ ACE_THROW_SPEC ((CORBA::SystemException));
+
+ virtual void set_initial_configuration (const CosPropertyService::Properties & initial
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS)
+ ACE_THROW_SPEC ((CORBA::SystemException));
+
+ virtual void set_format (const char * flowName,
+ const char * format_name
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS)
+ ACE_THROW_SPEC ((CORBA::SystemException,
+ AVStreams::notSupported));
+
+ virtual void set_dev_params (const char * flowName,
+ const CosPropertyService::Properties & new_params
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS)
+
+ ACE_THROW_SPEC ((CORBA::SystemException,
+ AVStreams::PropertyException,
+ AVStreams::streamOpFailed));
+
+protected:
+ /// checks whether the flowname is in the flow_spec.
+ int in_flowSpec (const AVStreams::flowSpec& flow_spec, const char *flow_name);
+
+ /// Multicast socket.
+ ACE_SOCK_Dgram_Mcast sock_mcast_;
+
+ /// Initial configuration to be distributed to all B parties when they join.
+ CosPropertyService::Properties initial_configuration_;
+
+ ACE_DLList<Peer_Info> peer_list_;
+ ACE_DLList_Iterator<Peer_Info> peer_list_iterator_;
+};
+
+/**
+ * @class TAO_AV_QoS
+ * @brief Class for getting and setting the QoS characteristics of
+ * an AV Stream.
+ */
+class TAO_AV_Export TAO_AV_QoS
+{
+public:
+ /// constructor.
+ TAO_AV_QoS (void);
+
+ /// constructor taking a stream qos parameter.
+ TAO_AV_QoS (AVStreams::streamQoS &stream_qos);
+
+ /// sets the maps with the QoS paramter.
+ int set (AVStreams::streamQoS &stream_qos);
+
+ /// gets the flow_qos.
+ int get_flow_qos (const char *flowname,AVStreams::QoS &flow_qos);
+
+ /// converts the application level QoS to Network-level QoS.
+ int convert (AVStreams::streamQoS &network_qos);
+
+
+protected:
+ /// Stream Qos.
+ AVStreams::streamQoS stream_qos_;
+
+ ACE_Hash_Map_Manager<ACE_CString,AVStreams::QoS,ACE_Null_Mutex> qos_map_;
+};
+
+
+// Forward declarations.
+class TAO_AV_TCP_Flow_Handler;
+class TAO_AV_UDP_Flow_Handler;
+class TAO_AV_UDP_MCast_Flow_Handler;
+class TAO_AV_Protocol_Object;
+class TAO_AV_Callback;
+class TAO_AV_SourceManager;
+class TAO_AV_Source;
+class TAO_AV_RTP_State;
+class TAO_AV_Flow_Handler;
+
+/**
+ * @class TAO_Base_StreamEndPoint
+ *
+ * Base class for the A/V StreamEndPoint class. this class
+ * is used to control the stream. It should be subclassed
+ * by applications that want to provide more control features.
+ */
+class TAO_AV_Export TAO_Base_StreamEndPoint
+ :public virtual TAO_PropertySet
+{
+
+ // @@Naga: Rename this class to TAO_Base_EndPoint since both stream and flowendpoints derive from it.
+public:
+ TAO_Base_StreamEndPoint (void);
+ virtual ~TAO_Base_StreamEndPoint (void);
+
+ /// called when streamendpoint is instantiated
+ virtual int handle_open (void);
+
+ /// called when streamendpoint is being destructed
+ virtual int handle_close (void);
+
+ /// Application needs to define this
+ virtual int handle_stop (const AVStreams::flowSpec &the_spec
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS);
+
+ /// Application needs to define this
+ virtual int handle_start (const AVStreams::flowSpec &the_spec
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS);
+
+ /// Application needs to define this
+ virtual int handle_destroy (const AVStreams::flowSpec &the_spec
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS);
+
+ /// Application needs to define this
+ virtual CORBA::Boolean handle_preconnect (AVStreams::flowSpec &the_spec);
+
+ /// Application needs to define this
+ virtual CORBA::Boolean handle_postconnect (AVStreams::flowSpec &the_spec);
+
+ /// Application needs to define this
+ virtual CORBA::Boolean handle_connection_requested (AVStreams::flowSpec &the_spec
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS);
+
+ virtual int get_callback (const char *flowname,
+ TAO_AV_Callback *&callback);
+
+ virtual int get_control_callback (const char *flowname,
+ TAO_AV_Callback *&callback);
+
+ virtual int set_protocol_object (const char *flowname,
+ TAO_AV_Protocol_Object *object);
+
+ virtual void set_flow_handler (const char *flowname,
+ TAO_AV_Flow_Handler *handler);
+
+ virtual void set_control_flow_handler (const char *flowname,
+ TAO_AV_Flow_Handler *handler);
+
+ TAO_AV_QoS &qos (void);
+
+ void protocol_object_set (void);
+ int is_protocol_object_set (void);
+
+protected:
+
+ TAO_AV_QoS qos_;
+ Flow_Handler_Map flow_handler_map_;
+ Flow_Handler_Map control_flow_handler_map_;
+ int protocol_object_set_;
+};
+
+// Forward declarations.
+class TAO_AV_Acceptor;
+class TAO_AV_Connector;
+class TAO_Forward_FlowSpec_Entry;
+class TAO_Reverse_FlowSpec_Entry;
+
+/**
+ * @class TAO_StreamEndPoint
+ * @brief The Stream EndPoint. Used to implement one endpoint of a stream
+ * that implements the transport layer.
+ */
+class TAO_AV_Export TAO_StreamEndPoint
+ : public virtual POA_AVStreams::StreamEndPoint,
+ public virtual TAO_Base_StreamEndPoint
+{
+
+public:
+ /// Constructor
+ TAO_StreamEndPoint (void);
+
+ /// Stop the stream. Empty the_spec means, for all the flows
+ virtual void stop (const AVStreams::flowSpec &the_spec
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS)
+ ACE_THROW_SPEC ((CORBA::SystemException,
+ AVStreams::noSuchFlow));
+
+ /// Start the stream, Empty the_spec means, for all the flows
+ virtual void start (const AVStreams::flowSpec &the_spec
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS)
+ ACE_THROW_SPEC ((CORBA::SystemException,
+ AVStreams::noSuchFlow));
+
+ /// Destroy the stream, Empty the_spec means, for all the flows
+ virtual void destroy (const AVStreams::flowSpec &the_spec
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS)
+ ACE_THROW_SPEC ((CORBA::SystemException,
+ AVStreams::noSuchFlow));
+
+ /// Called by StreamCtrl. responder is the peer to connect to
+ virtual CORBA::Boolean connect (AVStreams::StreamEndPoint_ptr responder,
+ AVStreams::streamQoS& qos_spec,
+ const AVStreams::flowSpec& the_spec
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS)
+ ACE_THROW_SPEC ((CORBA::SystemException,
+ AVStreams::noSuchFlow,
+ AVStreams::QoSRequestFailed,
+ AVStreams::streamOpFailed));
+
+ /// Called by the peer StreamEndPoint. The flow_spec indicates the
+ /// flows (which contain transport addresses etc.)
+ virtual CORBA::Boolean request_connection (AVStreams::StreamEndPoint_ptr initiator,
+ CORBA::Boolean is_mcast,
+ AVStreams::streamQoS &qos,
+ AVStreams::flowSpec &the_spec
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS)
+ ACE_THROW_SPEC ((CORBA::SystemException,
+ AVStreams::streamOpDenied,
+ AVStreams::noSuchFlow,
+ AVStreams::QoSRequestFailed,
+ AVStreams::FPError));
+
+ /// Change the transport qos on a stream
+ virtual CORBA::Boolean modify_QoS (AVStreams::streamQoS &new_qos,
+ const AVStreams::flowSpec &the_flows
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS)
+ ACE_THROW_SPEC ((CORBA::SystemException,
+ AVStreams::noSuchFlow,
+ AVStreams::QoSRequestFailed));
+
+ virtual int change_qos (AVStreams::streamQoS &new_qos,
+ const AVStreams::flowSpec &the_flows
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS);
+
+ /// Used to restrict the set of protocols
+ virtual CORBA::Boolean set_protocol_restriction (const AVStreams::protocolSpec &the_pspec
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS)
+ ACE_THROW_SPEC ((CORBA::SystemException));
+
+ /// disconnect the flows
+ virtual void disconnect (const AVStreams::flowSpec &the_spec
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS)
+ ACE_THROW_SPEC ((CORBA::SystemException,
+ AVStreams::noSuchFlow,
+ AVStreams::streamOpFailed));
+
+ /// Used to control the flow
+ virtual void set_FPStatus (const AVStreams::flowSpec &the_spec,
+ const char *fp_name,
+ const CORBA::Any &fp_settings
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS)
+ ACE_THROW_SPEC ((CORBA::SystemException,
+ AVStreams::noSuchFlow,
+ AVStreams::FPError));
+
+ /// Not implemented in the light profile, throws notsupported
+ virtual CORBA::Object_ptr get_fep (const char *flow_name
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS)
+ ACE_THROW_SPEC ((CORBA::SystemException,
+ AVStreams::notSupported,
+ AVStreams::noSuchFlow));
+
+ /// Not implemented in the light profile, throws notsupported
+ virtual char * add_fep (CORBA::Object_ptr the_fep
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS)
+ ACE_THROW_SPEC ((CORBA::SystemException,
+ AVStreams::notSupported,
+ AVStreams::streamOpFailed));
+
+ /// Not implemented in the light profile, throws notsupported
+ virtual void remove_fep (const char *fep_name
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS)
+ ACE_THROW_SPEC ((CORBA::SystemException,
+ AVStreams::notSupported,
+ AVStreams::streamOpFailed));
+
+ /// Used to "attach" a negotiator to the endpoint
+ virtual void set_negotiator (AVStreams::Negotiator_ptr new_negotiator
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS)
+ ACE_THROW_SPEC ((CORBA::SystemException));
+
+ /// Used for public key encryption.
+ virtual void set_key (const char *flow_name,
+ const AVStreams::key & the_key
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS)
+ ACE_THROW_SPEC ((CORBA::SystemException));
+
+ /// Used to set a unique id for packets sent by this streamendpoint
+ virtual void set_source_id (CORBA::Long source_id
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS)
+ ACE_THROW_SPEC ((CORBA::SystemException));
+
+ /// Destructor
+ virtual ~TAO_StreamEndPoint (void);
+
+ CORBA::Boolean multiconnect (AVStreams::streamQoS &the_qos,
+ AVStreams::flowSpec &the_spec
+ ACE_ENV_ARG_DECL);
+
+protected:
+ /// Helper methods to implement add_fep()
+ char* add_fep_i (AVStreams::FlowEndPoint_ptr fep
+ ACE_ENV_ARG_DECL)
+ ACE_THROW_SPEC ((CORBA::SystemException,
+ AVStreams::notSupported,
+ AVStreams::streamOpFailed));
+ char* add_fep_i_add_property (AVStreams::FlowEndPoint_ptr fep
+ ACE_ENV_ARG_DECL)
+ ACE_THROW_SPEC ((CORBA::SystemException,
+ AVStreams::notSupported,
+ AVStreams::streamOpFailed));
+
+ /// translate from application level to network level qos.
+ int translate_qos (const AVStreams::streamQoS& application_qos,
+ AVStreams::streamQoS& network_qos);
+
+ /// Count of the number of flows in this streamendpoint, used to
+ /// generate unique names for the flows.
+ u_int flow_count_;
+
+ /// current flow number used for system generation of flow names.
+ u_int flow_num_;
+
+ /// hash table for the flownames and its corresponding flowEndpoint reference.
+ FlowEndPoint_Map fep_map_;
+
+ /// sequence of supported flow names.
+ AVStreams::flowSpec flows_;
+
+ /// source id used for multicast.
+ CORBA::Long source_id_;
+
+ /// our local negotiator for QoS.
+ AVStreams::Negotiator_var negotiator_;
+
+ /// Our available list of protocols.
+ AVStreams::protocolSpec protocols_;
+
+ /// Chosen protocol for this streamendpoint based on availableprotocols property.
+ CORBA::String_var protocol_;
+
+ /// Key used for encryption.
+ AVStreams::key key_;
+
+/// TAO_Forward_FlowSpec_Entry forward_entries_ [FLOWSPEC_MAX];
+/// TAO_Reverse_FlowSpec_Entry reverse_entries_ [FLOWSPEC_MAX];
+ u_short mcast_port_;
+ ACE_CString mcast_addr_;
+ ACE_Hash_Map_Manager <ACE_CString, TAO_FlowSpec_Entry*,ACE_Null_Mutex> mcast_entry_map_;
+ TAO_AV_FlowSpecSet forward_flow_spec_set;
+ TAO_AV_FlowSpecSet reverse_flow_spec_set;
+ AVStreams::StreamEndPoint_var peer_sep_;
+ AVStreams::SFPStatus *sfp_status_;
+ AVStreams::StreamCtrl_var streamctrl_;
+};
+
+/**
+ * @class TAO_StreamEndPoint_A
+ * @brief The "A" side of a streamendpoint
+ */
+class TAO_AV_Export TAO_StreamEndPoint_A :
+ public virtual POA_AVStreams::StreamEndPoint_A,
+ public virtual TAO_StreamEndPoint
+{
+
+public:
+ /// Constructor
+ TAO_StreamEndPoint_A (void);
+
+ /// Used for ATM-style multicast
+ virtual CORBA::Boolean multiconnect (AVStreams::streamQoS &the_qos,
+ AVStreams::flowSpec &the_spec
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS)
+ ACE_THROW_SPEC ((CORBA::SystemException,
+ AVStreams::noSuchFlow,
+ AVStreams::QoSRequestFailed,
+ AVStreams::streamOpFailed));
+
+ /// Used for ATM-style multicast
+ virtual CORBA::Boolean connect_leaf (AVStreams::StreamEndPoint_B_ptr the_ep,
+ AVStreams::streamQoS &the_qos,
+ const AVStreams::flowSpec &the_flows
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS)
+ ACE_THROW_SPEC ((CORBA::SystemException,
+ AVStreams::streamOpFailed,
+ AVStreams::noSuchFlow,
+ AVStreams::QoSRequestFailed,
+ AVStreams::notSupported));
+
+ /// Used to remove a multicast leaf
+ virtual void disconnect_leaf (AVStreams::StreamEndPoint_B_ptr the_ep,
+ const AVStreams::flowSpec &theSpec
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS)
+ ACE_THROW_SPEC ((CORBA::SystemException,
+ AVStreams::streamOpFailed,
+ AVStreams::noSuchFlow,
+ AVStreams::notSupported));
+
+ /// Destructor
+ virtual ~TAO_StreamEndPoint_A (void);
+
+};
+
+// For backward compatibility.
+#define TAO_Client_StreamEndPoint TAO_StreamEndPoint_A
+#define TAO_Server_StreamEndPoint TAO_StreamEndPoint_B
+
+/**
+ * @class TAO_StreamEndPoint_B
+ * @brief The "B" side of a streamendpoint
+ */
+class TAO_AV_Export TAO_StreamEndPoint_B :
+ public virtual POA_AVStreams::StreamEndPoint_B,
+ public virtual TAO_StreamEndPoint
+{
+ // = DESCRIPTION
+ // The "B" side of a streamendpoint
+public:
+ /// Constructor
+ TAO_StreamEndPoint_B (void);
+
+ /// Used for internet-style multicast
+ virtual CORBA::Boolean multiconnect (AVStreams::streamQoS &the_qos,
+ AVStreams::flowSpec &the_spec
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS)
+ ACE_THROW_SPEC ((CORBA::SystemException,
+ AVStreams::streamOpFailed,
+ AVStreams::noSuchFlow,
+ AVStreams::QoSRequestFailed,
+ AVStreams::FPError));
+
+ /// Destructor
+ virtual ~TAO_StreamEndPoint_B (void);
+};
+
+/**
+ * @class TAO_VDev
+ * @brief Implements the VDev interface. One of these is created per
+ * connection, and represents device-specific parameters.
+ */
+class TAO_AV_Export TAO_VDev
+ :public virtual TAO_PropertySet,
+ public virtual POA_AVStreams::VDev
+{
+
+public:
+ /// Default Constructor
+ TAO_VDev (void);
+
+ /// Called to tell the vdev who the streamctrl, peer vdev is
+ virtual CORBA::Boolean set_peer (AVStreams::StreamCtrl_ptr the_ctrl,
+ AVStreams::VDev_ptr the_peer_dev,
+ AVStreams::streamQoS &the_qos,
+ const AVStreams::flowSpec &the_spec
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS)
+ ACE_THROW_SPEC ((CORBA::SystemException,
+ AVStreams::noSuchFlow,
+ AVStreams::QoSRequestFailed,
+ AVStreams::streamOpFailed));
+
+ /// Used to set the streamctrl and multicast device
+ virtual CORBA::Boolean set_Mcast_peer (AVStreams::StreamCtrl_ptr the_ctrl,
+ AVStreams::MCastConfigIf_ptr a_mcastconfigif,
+ AVStreams::streamQoS &the_qos,
+ const AVStreams::flowSpec &the_spec
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS)
+ ACE_THROW_SPEC ((CORBA::SystemException,
+ AVStreams::noSuchFlow,
+ AVStreams::QoSRequestFailed,
+ AVStreams::streamOpFailed));
+
+ /// Called by the peer VDev to configure the device (catch all)
+ virtual void configure (const CosPropertyService::Property &the_config_mesg
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS)
+ ACE_THROW_SPEC ((CORBA::SystemException,
+ AVStreams::PropertyException,
+ AVStreams::streamOpFailed));
+
+ /// Used to set a format on a flowname
+ virtual void set_format (const char *flowName,
+ const char *format_name
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS)
+ ACE_THROW_SPEC ((CORBA::SystemException,
+ AVStreams::notSupported));
+
+ /// Used to set device parameters
+ virtual void set_dev_params (const char *flowName,
+ const CosPropertyService::Properties &new_params
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS)
+ ACE_THROW_SPEC ((CORBA::SystemException,
+ AVStreams::PropertyException,
+ AVStreams::streamOpFailed));
+
+ /// Called to change QoS of the device
+ virtual CORBA::Boolean modify_QoS (AVStreams::streamQoS &the_qos,
+ const AVStreams::flowSpec &the_spec
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS)
+ ACE_THROW_SPEC ((CORBA::SystemException,
+ AVStreams::noSuchFlow,
+ AVStreams::QoSRequestFailed));
+
+protected:
+ /// Destructor for a servant should be protected or private.
+ /// Use _remove_ref() to delete this servant.
+ virtual ~TAO_VDev (void);
+
+ /// hook called after set_peer is done to set the media ctrl of the peer vdev.
+ virtual CORBA::Boolean set_media_ctrl (CORBA::Object_ptr media_ctrl
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS);
+
+ /// My stream controller
+ AVStreams::StreamCtrl_var streamctrl_;
+
+ /// My peer
+ AVStreams::VDev_var peer_;
+
+ /// The multicast VDev peer.
+ AVStreams::MCastConfigIf_var mcast_peer_;
+};
+
+class TAO_AV_Endpoint_Strategy;
+
+/**
+ * @class TAO_MMDevice
+ * @brief Implements a factory to create Endpoints and VDevs
+ */
+class TAO_AV_Export TAO_MMDevice
+ :public virtual POA_AVStreams::MMDevice,
+ public virtual TAO_PropertySet
+{
+
+public:
+
+ /// Constructor
+ enum MMDevice_Type {MMDEVICE_A = 0,MMDEVICE_B = 1};
+ TAO_MMDevice (TAO_AV_Endpoint_Strategy *endpoint_strategy_);
+
+ virtual AVStreams::StreamEndPoint_ptr create_A_B (MMDevice_Type type,
+ AVStreams::StreamCtrl_ptr the_requester,
+ AVStreams::VDev_out the_vdev,
+ AVStreams::streamQoS &the_qos,
+ CORBA::Boolean_out met_qos,
+ char *&named_vdev,
+ const AVStreams::flowSpec &the_spec
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS);
+
+ /// Can be used to request the MMDevice to create a new StreamCtrl,
+ /// and call bind_devs on it
+ virtual AVStreams::StreamCtrl_ptr bind (AVStreams::MMDevice_ptr peer_device,
+ AVStreams::streamQoS &the_qos,
+ CORBA::Boolean_out is_met,
+ const AVStreams::flowSpec &the_spec
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS)
+ ACE_THROW_SPEC ((CORBA::SystemException,
+ AVStreams::streamOpFailed,
+ AVStreams::noSuchFlow,
+ AVStreams::QoSRequestFailed));
+
+ /// Multicast bind
+ virtual AVStreams::StreamCtrl_ptr bind_mcast (AVStreams::MMDevice_ptr first_peer,
+ AVStreams::streamQoS &the_qos,
+ CORBA::Boolean_out is_met,
+ const AVStreams::flowSpec &the_spec
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS)
+ ACE_THROW_SPEC ((CORBA::SystemException,
+ AVStreams::streamOpFailed,
+ AVStreams::noSuchFlow,
+ AVStreams::QoSRequestFailed));
+
+ /// Called by StreamCtrl to create a "A" type streamandpoint and vdev
+ virtual AVStreams::StreamEndPoint_A_ptr create_A (AVStreams::StreamCtrl_ptr the_requester,
+ AVStreams::VDev_out the_vdev,
+ AVStreams::streamQoS &the_qos,
+ CORBA::Boolean_out met_qos,
+ char *&named_vdev,
+ const AVStreams::flowSpec &the_spec
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS)
+ ACE_THROW_SPEC ((CORBA::SystemException,
+ AVStreams::streamOpFailed,
+ AVStreams::streamOpDenied,
+ AVStreams::notSupported,
+ AVStreams::QoSRequestFailed,
+ AVStreams::noSuchFlow));
+
+ /// Called by StreamCtrl to create a "B" type streamandpoint and vdev
+ virtual AVStreams::StreamEndPoint_B_ptr create_B (AVStreams::StreamCtrl_ptr the_requester,
+ AVStreams::VDev_out the_vdev,
+ AVStreams::streamQoS &the_qos,
+ CORBA::Boolean_out met_qos,
+ char *&named_vdev,
+ const AVStreams::flowSpec &the_spec
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS)
+ ACE_THROW_SPEC ((CORBA::SystemException,
+ AVStreams::streamOpFailed,
+ AVStreams::streamOpDenied,
+ AVStreams::notSupported,
+ AVStreams::QoSRequestFailed,
+ AVStreams::noSuchFlow));
+
+ /// Remove the StreamEndPoint and the related vdev
+ virtual void destroy (AVStreams::StreamEndPoint_ptr the_ep,
+ const char *vdev_name
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS)
+ ACE_THROW_SPEC ((CORBA::SystemException,
+ AVStreams::notSupported));
+
+ /// Not supported in the light profile, raises notsupported
+ virtual char * add_fdev (CORBA::Object_ptr the_fdev
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS)
+ ACE_THROW_SPEC ((CORBA::SystemException,
+ AVStreams::notSupported,
+ AVStreams::streamOpFailed));
+
+ /// Not supported in the light profile, raises notsupported
+ virtual CORBA::Object_ptr get_fdev (const char *flow_name
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS)
+ ACE_THROW_SPEC ((CORBA::SystemException,
+ AVStreams::notSupported,
+ AVStreams::noSuchFlow));
+
+ /// Not supported in the light profile, raises notsupported
+ virtual void remove_fdev (const char *flow_name
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS)
+ ACE_THROW_SPEC ((CORBA::SystemException,
+ AVStreams::notSupported,
+ AVStreams::noSuchFlow,
+ AVStreams::streamOpFailed));
+
+ /// Destructor
+ virtual ~TAO_MMDevice (void);
+
+protected:
+ /// Helper method to implement add_fdev()
+ char* add_fdev_i (AVStreams::FDev_ptr fdev
+ ACE_ENV_ARG_DECL)
+ ACE_THROW_SPEC ((CORBA::SystemException,
+ AVStreams::notSupported,
+ AVStreams::streamOpFailed));
+
+protected:
+
+ TAO_AV_Endpoint_Strategy *endpoint_strategy_;
+
+ /// Count of the number of flows in this MMDevice , used to
+ /// generate unique names for the flows.
+ u_int flow_count_;
+
+ /// current flow number used for system generation of flow names.
+ u_int flow_num_;
+
+ typedef ACE_Hash_Map_Manager <ACE_CString,AVStreams::FDev_var,ACE_Null_Mutex> FDev_Map;
+ typedef ACE_Hash_Map_Iterator <ACE_CString,AVStreams::FDev_var,ACE_Null_Mutex> FDev_Map_Iterator;
+ typedef ACE_Hash_Map_Entry <ACE_CString,AVStreams::FDev_var> FDev_Map_Entry;
+
+ /// hash table for the flownames and its corresponding flowEndpoint
+ /// reference.
+ FDev_Map fdev_map_;
+
+ /// sequence of supported flow names.
+ AVStreams::flowSpec flows_;
+
+ TAO_StreamCtrl *stream_ctrl_;
+};
+
+class TAO_FlowConsumer;
+class TAO_FlowProducer;
+
+/**
+ * @class TAO_FlowConnection
+ * @brief This class currently supports only one producer and one
+ * consumer per flow.
+ */
+class TAO_AV_Export TAO_FlowConnection
+ : public virtual POA_AVStreams::FlowConnection,
+ public virtual TAO_PropertySet
+{
+
+public:
+ /// default constructor.
+ TAO_FlowConnection (void);
+
+ /// stop this flow.
+ virtual void stop (ACE_ENV_SINGLE_ARG_DECL_WITH_DEFAULTS)
+ ACE_THROW_SPEC ((CORBA::SystemException));
+
+ /// start this flow.
+ virtual void start (ACE_ENV_SINGLE_ARG_DECL_WITH_DEFAULTS)
+ ACE_THROW_SPEC ((CORBA::SystemException));
+
+ /// destroy this flow.
+ virtual void destroy (ACE_ENV_SINGLE_ARG_DECL_WITH_DEFAULTS)
+ ACE_THROW_SPEC ((CORBA::SystemException));
+
+ /// modify the QoS for this flow.
+ virtual CORBA::Boolean modify_QoS (AVStreams::QoS & new_qos
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS)
+ ACE_THROW_SPEC ((CORBA::SystemException,
+ AVStreams::QoSRequestFailed));
+
+ /// use the specified flow protocol for this flow.
+ virtual CORBA::Boolean use_flow_protocol (const char * fp_name,
+ const CORBA::Any & fp_settings
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS)
+ ACE_THROW_SPEC ((CORBA::SystemException,
+ AVStreams::FPError,
+ AVStreams::notSupported));
+
+ /// pushes an event , to be handled by the application.
+ virtual void push_event (const AVStreams::streamEvent & the_event
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS)
+ ACE_THROW_SPEC ((CORBA::SystemException));
+
+
+ /// connect 2 Flow Devices.
+ virtual CORBA::Boolean connect_devs (AVStreams::FDev_ptr a_party,
+ AVStreams::FDev_ptr b_party,
+ AVStreams::QoS & the_qos
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS)
+ ACE_THROW_SPEC ((CORBA::SystemException,
+ AVStreams::streamOpFailed,
+ AVStreams::streamOpDenied,
+ AVStreams::QoSRequestFailed));
+
+ /// Connect a flow producer and consumer under this flow connection.
+ virtual CORBA::Boolean connect (AVStreams::FlowProducer_ptr flow_producer,
+ AVStreams::FlowConsumer_ptr flow_consumer,
+ AVStreams::QoS & the_qos
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS)
+ ACE_THROW_SPEC ((CORBA::SystemException,
+ AVStreams::formatMismatch,
+ AVStreams::FEPMismatch,
+ AVStreams::alreadyConnected));
+
+ /// disconnect this flow connection.
+ virtual CORBA::Boolean disconnect (ACE_ENV_SINGLE_ARG_DECL_WITH_DEFAULTS)
+ ACE_THROW_SPEC ((CORBA::SystemException));
+
+ /// adds the producer to this flow connection.
+ virtual CORBA::Boolean add_producer (AVStreams::FlowProducer_ptr flow_producer,
+ AVStreams::QoS & the_qos
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS)
+ ACE_THROW_SPEC ((CORBA::SystemException,
+ AVStreams::alreadyConnected,
+ AVStreams::notSupported));
+
+ /// adds a consumer to this flow connection.
+ virtual CORBA::Boolean add_consumer (AVStreams::FlowConsumer_ptr flow_consumer,
+ AVStreams::QoS & the_qos
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS)
+ ACE_THROW_SPEC ((CORBA::SystemException,
+ AVStreams::alreadyConnected));
+
+ /// drops a flow endpoint from the flow.
+ virtual CORBA::Boolean drop (AVStreams::FlowEndPoint_ptr target
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS)
+ ACE_THROW_SPEC ((CORBA::SystemException,
+ AVStreams::notConnected));
+
+ int set_mcast_addr (ACE_CString addr,u_short port);
+ void set_protocol (const char *protocol);
+protected:
+ typedef ACE_Unbounded_Set<AVStreams::FlowProducer_ptr> FlowProducer_Set;
+ typedef ACE_Unbounded_Set_Iterator<AVStreams::FlowProducer_ptr> FlowProducer_SetItor;
+ typedef ACE_Unbounded_Set<AVStreams::FlowConsumer_ptr> FlowConsumer_Set;
+ typedef ACE_Unbounded_Set_Iterator<AVStreams::FlowConsumer_ptr> FlowConsumer_SetItor;
+
+ /// The multicast address returned by the producer.
+ FlowProducer_Set flow_producer_set_;
+ FlowConsumer_Set flow_consumer_set_;
+ CORBA::String_var fp_name_;
+ CORBA::Any fp_settings_;
+ CORBA::String_var producer_address_;
+
+ /// IP Multicasting is used.
+ int ip_multicast_;
+ TAO_MCastConfigIf *mcastconfigif_i_;
+ AVStreams::MCastConfigIf_var mcastconfigif_;
+ u_short mcast_port_;
+ ACE_CString mcast_addr_;
+ CORBA::String_var protocol_;
+};
+
+/**
+ * @class TAO_FlowEndPoint
+ * @brief This class is used per flow e.g video flow and an audio flow
+ * to encapsulate the transport details.
+ */
+class TAO_AV_Export TAO_FlowEndPoint :
+ public virtual POA_AVStreams::FlowEndPoint,
+ public virtual TAO_Base_StreamEndPoint
+{
+
+public:
+
+ ///default constructor.
+ TAO_FlowEndPoint (void);
+
+ TAO_FlowEndPoint (const char *flowname,
+ AVStreams::protocolSpec &protocols,
+ const char *format);
+
+ int open (const char *flowname,
+ AVStreams::protocolSpec &protocols,
+ const char *format);
+
+ int set_flowname (const char *flowname);
+
+ virtual void set_flow_handler (const char *flowname,
+ TAO_AV_Flow_Handler *handler);
+
+ virtual int set_protocol_object (const char *flowname,
+ TAO_AV_Protocol_Object *object);
+
+ /// lock the flow endpoint for a particular flow.
+ virtual CORBA::Boolean lock (ACE_ENV_SINGLE_ARG_DECL_WITH_DEFAULTS)
+ ACE_THROW_SPEC ((CORBA::SystemException));
+
+ /// unlock the flow endpoint for subsequent use.
+ virtual void unlock (ACE_ENV_SINGLE_ARG_DECL_WITH_DEFAULTS)
+ ACE_THROW_SPEC ((CORBA::SystemException));
+
+
+ /// destroy this flow.
+ virtual void destroy (ACE_ENV_SINGLE_ARG_DECL_WITH_DEFAULTS)
+ ACE_THROW_SPEC ((CORBA::SystemException));
+
+ /// get method for the related streamendpoint under which this
+ /// flowendpoint is.
+ virtual AVStreams::StreamEndPoint_ptr related_sep(ACE_ENV_SINGLE_ARG_DECL_WITH_DEFAULTS)
+ ACE_THROW_SPEC ((CORBA::SystemException));
+
+ /// set method for the related streamendpoint under which this
+ /// flowendpoint is.
+ virtual void related_sep (AVStreams::StreamEndPoint_ptr related_sep
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS)
+ ACE_THROW_SPEC ((CORBA::SystemException));
+
+ virtual AVStreams::FlowConnection_ptr related_flow_connection(ACE_ENV_SINGLE_ARG_DECL_WITH_DEFAULTS)
+ ACE_THROW_SPEC ((CORBA::SystemException));
+
+ // accessor for the related flow connection attribute.
+
+ /// set method for the related flow connection attribute.
+ virtual void related_flow_connection (AVStreams::FlowConnection_ptr related_flow_connection
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS)
+ ACE_THROW_SPEC ((CORBA::SystemException));
+
+ /// returns the other flowendpoint to which this is connected.
+ virtual AVStreams::FlowEndPoint_ptr get_connected_fep (ACE_ENV_SINGLE_ARG_DECL_WITH_DEFAULTS)
+ ACE_THROW_SPEC ((CORBA::SystemException,
+ AVStreams::notConnected,
+ AVStreams::notSupported));
+
+ //// use the specified flow protocol.
+ virtual CORBA::Boolean use_flow_protocol (const char * fp_name,
+ const CORBA::Any & fp_settings
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS)
+ ACE_THROW_SPEC ((CORBA::SystemException,
+ AVStreams::FPError,
+ AVStreams::notSupported));
+
+ /// sets the data format.
+ virtual void set_format (const char * format
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS)
+ ACE_THROW_SPEC ((CORBA::SystemException,
+ AVStreams::notSupported));
+
+ /// sets the device parameters.
+ virtual void set_dev_params (const CosPropertyService::Properties & new_settings
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS)
+ ACE_THROW_SPEC ((CORBA::SystemException,
+ AVStreams::PropertyException,
+ AVStreams::streamOpFailed));
+
+ /// sets the list of protocols to be used.
+ virtual void set_protocol_restriction (const AVStreams::protocolSpec & the_spec
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS)
+ ACE_THROW_SPEC ((CORBA::SystemException,
+ AVStreams::notSupported));
+
+ /// checks whether the passed flowendpoint is compatible with this.
+ virtual CORBA::Boolean is_fep_compatible (AVStreams::FlowEndPoint_ptr fep
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS)
+ ACE_THROW_SPEC ((CORBA::SystemException,
+ AVStreams::formatMismatch,
+ AVStreams::deviceQosMismatch));
+
+ /// sets the peer flowendpoint.
+ virtual CORBA::Boolean set_peer (AVStreams::FlowConnection_ptr the_fc,
+ AVStreams::FlowEndPoint_ptr the_peer_fep,
+ AVStreams::QoS & the_qos
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS)
+ ACE_THROW_SPEC ((CORBA::SystemException,
+ AVStreams::QoSRequestFailed,
+ AVStreams::streamOpFailed));
+
+ /// sets the multicast peer flowendpoint, not implemented.
+ virtual CORBA::Boolean set_Mcast_peer (AVStreams::FlowConnection_ptr the_fc,
+ AVStreams::MCastConfigIf_ptr a_mcastconfigif,
+ AVStreams::QoS & the_qos
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS)
+ ACE_THROW_SPEC ((CORBA::SystemException,
+ AVStreams::QoSRequestFailed));
+
+
+ /**
+ * This should be implemented in both the FlowProducer and consumer and hence is
+ * pure virtual since we need to know the role of the flowendpoint to create appropriate
+ * protocol objects. eg. in SFP to create Producer Object/ Consumer Object.
+ */
+ virtual CORBA::Boolean connect_to_peer (AVStreams::QoS & the_qos,
+ const char * address,
+ const char * use_flow_protocol
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS)
+ ACE_THROW_SPEC ((CORBA::SystemException,
+ AVStreams::failedToConnect,
+ AVStreams::FPError,
+ AVStreams::QoSRequestFailed)) = 0;
+
+ /// connect to the peer endpoint.
+ virtual CORBA::Boolean connect_to_peer_i (TAO_FlowSpec_Entry::Role role,
+ AVStreams::QoS & the_qos,
+ const char * address,
+ const char * use_flow_protocol
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS)
+ ACE_THROW_SPEC ((CORBA::SystemException,
+ AVStreams::failedToConnect,
+ AVStreams::FPError,
+ AVStreams::QoSRequestFailed));
+
+ /**
+ * This should be implemented in both the FlowProducer and consumer and hence is
+ * pure virtual since we need to know the role of the flowendpoint to create appropriate
+ * protocol objects. eg. in SFP to create Producer Object/ Consumer Object.
+ */
+ virtual char * go_to_listen (AVStreams::QoS & the_qos,
+ CORBA::Boolean is_mcast,
+ AVStreams::FlowEndPoint_ptr peer,
+ char *& flowProtocol
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS)
+ ACE_THROW_SPEC ((CORBA::SystemException,
+ AVStreams::failedToListen,
+ AVStreams::FPError,
+ AVStreams::QoSRequestFailed)) = 0;
+
+ /// listen request from the peer.
+ virtual char * go_to_listen_i (TAO_FlowSpec_Entry::Role role,
+ AVStreams::QoS & the_qos,
+ CORBA::Boolean is_mcast,
+ AVStreams::FlowEndPoint_ptr peer,
+ char *& flowProtocol
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS)
+ ACE_THROW_SPEC ((CORBA::SystemException,
+ AVStreams::failedToListen,
+ AVStreams::FPError,
+ AVStreams::QoSRequestFailed));
+
+
+protected:
+ /// The related streamendpoint.
+ AVStreams::StreamEndPoint_var related_sep_;
+
+ /// The related flow connection reference
+ AVStreams::FlowConnection_var related_flow_connection_;
+
+ /// The peer flowendpoint reference.
+ AVStreams::FlowEndPoint_var peer_fep_;
+
+ /// Available protocols for this flowendpoint.
+ AVStreams::protocolSpec protocols_;
+
+ /// Address information for the protocols.
+ AVStreams::protocolSpec protocol_addresses_;
+
+ /// The multicast peer endpoint.
+ AVStreams::MCastConfigIf_var mcast_peer_;
+
+ /// Lock.
+ CORBA::Boolean lock_;
+
+ CORBA::String_var format_;
+ CORBA::String_var flowname_;
+ CosPropertyService::Properties dev_params_;
+ TAO_AV_FlowSpecSet flow_spec_set_;
+ CORBA::String_var reverse_channel_;
+};
+
+class TAO_AV_Export TAO_FlowProducer:
+ public virtual POA_AVStreams::FlowProducer,
+ public virtual TAO_FlowEndPoint
+{
+public:
+ /// default constructor
+ TAO_FlowProducer (void);
+
+ TAO_FlowProducer (const char *flowname,
+ AVStreams::protocolSpec protocols,
+ const char *format);
+
+ /**
+ * get the reverse channel, to be used for feedback for protocols like UDP.
+ * @@Naga: In the spec this is defined in the TAO_FlowProducer but it seems more reasonable for this
+ * to be in a FlowEndPoint since any of the flowendpoints can be made to listen. So in the case of
+ * UDP if the producer is listening and the consumer connects (logically) then the producer needs to
+ * know the reverse channel on its peer fep to send data to.
+ */
+ virtual char * get_rev_channel (const char * pcol_name
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS)
+ ACE_THROW_SPEC ((CORBA::SystemException));
+
+ /// stop this flow, to be overridden by the application.
+ virtual void stop (ACE_ENV_SINGLE_ARG_DECL_WITH_DEFAULTS)
+ ACE_THROW_SPEC ((CORBA::SystemException));
+
+ /// start this flow, to be overridden by the application.
+ virtual void start (ACE_ENV_SINGLE_ARG_DECL_WITH_DEFAULTS)
+ ACE_THROW_SPEC ((CORBA::SystemException));
+
+ virtual char * go_to_listen (AVStreams::QoS & the_qos,
+ CORBA::Boolean is_mcast,
+ AVStreams::FlowEndPoint_ptr peer,
+ char *& flowProtocol
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS)
+ ACE_THROW_SPEC ((CORBA::SystemException,
+ AVStreams::failedToListen,
+ AVStreams::FPError,
+ AVStreams::QoSRequestFailed));
+
+ virtual CORBA::Boolean connect_to_peer (AVStreams::QoS & the_qos,
+ const char * address,
+ const char * use_flow_protocol
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS)
+ ACE_THROW_SPEC ((CORBA::SystemException,
+ AVStreams::failedToConnect,
+ AVStreams::FPError,
+ AVStreams::QoSRequestFailed));
+
+ /// connect to the multicast address, not implemented.
+ virtual char * connect_mcast (AVStreams::QoS & the_qos,
+ CORBA::Boolean_out is_met,
+ const char * address,
+ const char * use_flow_protocol
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS)
+ ACE_THROW_SPEC ((CORBA::SystemException,
+ AVStreams::failedToConnect,
+ AVStreams::notSupported,
+ AVStreams::FPError,
+ AVStreams::QoSRequestFailed));
+
+
+
+ /// sets the public key to be used for encryption of the data.
+ virtual void set_key (const AVStreams::key & the_key
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS)
+ ACE_THROW_SPEC ((CORBA::SystemException));
+
+ /// sets the source id of this flow producer so that it can be used
+ /// to distinguish this producer from others in the multicast case.
+ virtual void set_source_id (CORBA::Long source_id
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS)
+ ACE_THROW_SPEC ((CORBA::SystemException));
+
+protected:
+ /// source id of this producer.
+ CORBA::Long source_id_;
+ CORBA::String_var peer_address_;
+};
+
+class TAO_AV_Export TAO_FlowConsumer :
+ public virtual POA_AVStreams::FlowConsumer,
+ public virtual TAO_FlowEndPoint
+{
+public:
+ /// default constructor.
+ TAO_FlowConsumer (void);
+
+ TAO_FlowConsumer (const char *flowname,
+ AVStreams::protocolSpec protocols,
+ const char *format);
+
+ /// stop this flow, to be overridden by the application.
+ virtual void stop (ACE_ENV_SINGLE_ARG_DECL_WITH_DEFAULTS)
+ ACE_THROW_SPEC ((CORBA::SystemException));
+
+ /// start this flow, to be overridden by the application.
+ virtual void start (ACE_ENV_SINGLE_ARG_DECL_WITH_DEFAULTS)
+ ACE_THROW_SPEC ((CORBA::SystemException));
+
+ virtual char * go_to_listen (AVStreams::QoS & the_qos,
+ CORBA::Boolean is_mcast,
+ AVStreams::FlowEndPoint_ptr peer,
+ char *& flowProtocol
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS)
+ ACE_THROW_SPEC ((CORBA::SystemException,
+ AVStreams::failedToListen,
+ AVStreams::FPError,
+ AVStreams::QoSRequestFailed));
+
+ virtual CORBA::Boolean connect_to_peer (AVStreams::QoS & the_qos,
+ const char * address,
+ const char * use_flow_protocol
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS)
+ ACE_THROW_SPEC ((CORBA::SystemException,
+ AVStreams::failedToConnect,
+ AVStreams::FPError,
+ AVStreams::QoSRequestFailed));
+};
+
+/**
+ * @class TAO_MediaControl
+ * @brief Abstract Mediacontrol class.
+ * The following are to be handled by the specialized media control
+ * for the specific media like camera, speaker.
+ */
+class TAO_AV_Export TAO_MediaControl
+ :public virtual POA_AVStreams::MediaControl
+{
+
+public:
+ /// default constructor
+ TAO_MediaControl (void);
+
+ virtual AVStreams::Position get_media_position (AVStreams::PositionOrigin an_origin,
+ AVStreams::PositionKey a_key
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS)
+ ACE_THROW_SPEC ((CORBA::SystemException,
+ AVStreams::MediaControl::PostionKeyNotSupported)) =0;
+
+ virtual void set_media_position (const AVStreams::Position & a_position
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS)
+ ACE_THROW_SPEC ((CORBA::SystemException,
+ AVStreams::MediaControl::PostionKeyNotSupported,
+ AVStreams::InvalidPosition)) =0;
+
+ virtual void start (const AVStreams::Position & a_position
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS)
+ ACE_THROW_SPEC ((CORBA::SystemException,
+ AVStreams::InvalidPosition)) =0;
+
+ virtual void pause (const AVStreams::Position & a_position
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS)
+ ACE_THROW_SPEC ((CORBA::SystemException,
+ AVStreams::InvalidPosition)) =0;
+
+ virtual void resume (const AVStreams::Position & a_position
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS)
+ ACE_THROW_SPEC ((CORBA::SystemException,
+ AVStreams::InvalidPosition)) =0;
+
+ virtual void stop (const AVStreams::Position & a_position
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS)
+ ACE_THROW_SPEC ((CORBA::SystemException,
+ AVStreams::InvalidPosition)) =0;
+
+};
+
+TAO_END_VERSIONED_NAMESPACE_DECL
+
+#include "orbsvcs/AV/Transport.h"
+
+#if defined (__ACE_INLINE__)
+#include "tao/debug.h"
+#include "orbsvcs/AV/AVStreams_i.i"
+#endif /* __ACE_INLINE__ */
+
+#include "orbsvcs/AV/Flows_T.h"
+
+#include /**/ "ace/post.h"
+#endif /* AVSTREAMS_I_H */
diff --git a/TAO/orbsvcs/orbsvcs/AV/AVStreams_i.i b/TAO/orbsvcs/orbsvcs/AV/AVStreams_i.i
new file mode 100644
index 00000000000..81731c09f05
--- /dev/null
+++ b/TAO/orbsvcs/orbsvcs/AV/AVStreams_i.i
@@ -0,0 +1,62 @@
+// -*- C++ -*-
+//
+// $Id$
+
+TAO_BEGIN_VERSIONED_NAMESPACE_DECL
+
+ACE_INLINE
+TAO_AV_QoS &
+TAO_Base_StreamEndPoint::qos (void)
+{
+ return this->qos_;
+}
+
+ACE_INLINE
+int
+TAO_AV_QoS::set (AVStreams::streamQoS &stream_qos)
+{
+ this->stream_qos_ = stream_qos;
+
+ for (u_int j=0;j<this->stream_qos_.length ();j++)
+ {
+ ACE_CString qos_key (CORBA::string_dup (this->stream_qos_[j].QoSType));
+ int result = this->qos_map_.bind (qos_key,this->stream_qos_[j]);
+ if (result < 0)
+ ACE_ERROR_RETURN ((LM_ERROR,
+ "(%N,%l) TAO_AV_QoS::set qos_map::bind failed\n"),-1);
+ }
+ return 0;
+}
+
+
+ACE_INLINE
+int
+TAO_AV_QoS::get_flow_qos (const char *flowname,
+ AVStreams::QoS &flow_qos)
+{
+ int result = this->qos_map_.find (flowname,
+ flow_qos);
+
+ if (result < 0)
+ {
+ if (TAO_debug_level > 0 ) {
+ ACE_DEBUG((LM_DEBUG, "(%N,%l) qos_map contains the flows:\n"));
+
+ ACE_Hash_Map_Manager<ACE_CString,AVStreams::QoS,ACE_Null_Mutex>::ITERATOR iter
+ = qos_map_.begin();
+
+ while( iter != qos_map_.end() )
+ {
+ ACE_DEBUG((LM_DEBUG, " %s\n", (*iter).ext_id_.c_str() ));
+ ++iter;
+ }
+
+ ACE_DEBUG ((LM_DEBUG,
+ "(%N,%l) TAO_AV_QOS::get_flow_qos qos_map::find failed for %s\n", flowname));
+ }
+ return -1;
+ }
+ return 0;
+}
+
+TAO_END_VERSIONED_NAMESPACE_DECL
diff --git a/TAO/orbsvcs/orbsvcs/AV/AV_Core.cpp b/TAO/orbsvcs/orbsvcs/AV/AV_Core.cpp
new file mode 100644
index 00000000000..830f8fe5e98
--- /dev/null
+++ b/TAO/orbsvcs/orbsvcs/AV/AV_Core.cpp
@@ -0,0 +1,1186 @@
+// $Id$
+
+#include "orbsvcs/AV/AV_Core.h"
+#include "orbsvcs/AV/FlowSpec_Entry.h"
+#include "orbsvcs/AV/Transport.h"
+#include "orbsvcs/AV/Protocol_Factory.h"
+#include "orbsvcs/AV/UDP.h"
+#include "orbsvcs/AV/TCP.h"
+#include "orbsvcs/AV/RTP.h"
+#include "orbsvcs/AV/RTCP.h"
+#include "orbsvcs/AV/sfp.h"
+#include "orbsvcs/AV/default_resource.h"
+
+#if defined (ACE_HAS_RAPI) || defined (ACE_HAS_WINSOCK2_GQOS)
+#include "orbsvcs/AV/QoS_UDP.h"
+#endif /* ACE_HAS_RAPI || ACE_HAS_WINSOCK2_GQOS */
+
+#if defined (ACE_HAS_SCTP)
+#include "orbsvcs/AV/SCTP_SEQ.h"
+#endif // ACE_HAS_SCTP
+
+#include "tao/debug.h"
+#include "tao/ORB_Core.h"
+
+#include "ace/Dynamic_Service.h"
+
+TAO_BEGIN_VERSIONED_NAMESPACE_DECL
+
+//------------------------------------------------------------
+// TAO_AV_Core
+//------------------------------------------------------------
+
+TAO_AV_Core::TAO_AV_Core (void)
+ :connector_registry_ (0),
+ acceptor_registry_ (0)
+{
+ ACE_NEW (this->connector_registry_,
+ TAO_AV_Connector_Registry
+ );
+ ACE_NEW (this->acceptor_registry_,
+ TAO_AV_Acceptor_Registry
+ );
+}
+
+TAO_AV_Core::~TAO_AV_Core (void)
+{
+ delete this->connector_registry_;
+ delete this->acceptor_registry_;
+
+ TAO_AV_TransportFactorySetItor transport_iter =
+ this->transport_factories_.begin();
+
+ while (transport_iter != this->transport_factories_.end())
+ {
+ if ((*transport_iter)->factory()->ref_count != 1)
+ {
+ delete (*transport_iter)->factory();
+ }
+ delete (*transport_iter);
+ transport_iter++;
+ }
+
+ TAO_AV_Flow_ProtocolFactorySetItor flow_iter =
+ this->flow_protocol_factories_.begin();
+
+ while (flow_iter != this->flow_protocol_factories_.end())
+ {
+ if ((*flow_iter)->factory()->ref_count != 1)
+ {
+ delete (*flow_iter)->factory();
+ }
+ delete (*flow_iter);
+
+ flow_iter++;
+ }
+}
+
+CORBA::ORB_ptr
+TAO_AV_Core::orb (void)
+{
+ return this->orb_.in ();
+}
+
+void
+TAO_AV_Core::orb (CORBA::ORB_ptr orb)
+{
+ this->orb_ = orb;
+}
+
+PortableServer::POA_ptr
+TAO_AV_Core::poa (void)
+{
+ return this->poa_.in ();
+}
+
+void
+TAO_AV_Core::poa (PortableServer::POA_ptr poa)
+{
+ this->poa_ = poa;
+}
+
+TAO_AV_Connector_Registry*
+TAO_AV_Core::connector_registry (void)
+{
+ return this->connector_registry_;
+}
+
+TAO_AV_Acceptor_Registry*
+TAO_AV_Core::acceptor_registry (void)
+{
+ return this->acceptor_registry_;
+}
+
+TAO_AV_TransportFactorySet *
+TAO_AV_Core::transport_factories (void)
+{
+ return &this->transport_factories_;
+}
+
+TAO_AV_Flow_ProtocolFactorySet*
+TAO_AV_Core::flow_protocol_factories (void)
+{
+ return &this->flow_protocol_factories_;
+}
+
+int
+TAO_AV_Core::stop_run (void)
+{
+ this->stop_run_ = 1;
+ return 0;
+}
+
+int
+TAO_AV_Core::run (void)
+{
+ this->stop_run_ = 0;
+ while (!this->stop_run_ && this->orb_->work_pending ())
+ this->orb_->perform_work ();
+ return 0;
+}
+
+void
+TAO_AV_Core::reactor (ACE_Reactor *r)
+{
+ this->reactor_ = r;
+}
+
+ACE_Reactor *
+TAO_AV_Core::reactor (void)
+{
+ return this->reactor_;
+}
+
+
+int
+TAO_AV_Core::init (CORBA::ORB_ptr orb,
+ PortableServer::POA_ptr poa
+ ACE_ENV_ARG_DECL_NOT_USED)
+{
+ if (TAO_debug_level > 0) ACE_DEBUG ((LM_DEBUG,"TAO_AV_Core::init "));
+ this->orb_ = CORBA::ORB::_duplicate (orb);
+ this->poa_ = PortableServer::POA::_duplicate (poa);
+ this->reactor (this->orb_->orb_core ()->reactor ());
+ this->init_transport_factories ();
+ this->init_flow_protocol_factories ();
+ return 0;
+}
+
+int
+TAO_AV_Core::init_forward_flows (TAO_Base_StreamEndPoint *endpoint,
+ TAO_AV_FlowSpecSet &flow_spec_set,
+ TAO_AV_Core::EndPoint direction,
+ AVStreams::flowSpec &flow_spec)
+{
+ if (TAO_debug_level > 0)
+ ACE_DEBUG ((LM_DEBUG,
+ "TAO_AV_Core::init_forward_flows\n"));
+
+ TAO_AV_FlowSpecSet address_flow_set;
+ TAO_AV_FlowSpecSet flow_set;
+ TAO_AV_FlowSpecSetItor end = flow_spec_set.end ();
+ for (TAO_AV_FlowSpecSetItor start = flow_spec_set.begin ();
+ start != end; ++start)
+ {
+ TAO_FlowSpec_Entry *entry = (*start);
+ switch (direction)
+ {
+ case TAO_AV_Core::TAO_AV_ENDPOINT_B:
+ {
+ switch (entry->direction ())
+ {
+ case TAO_FlowSpec_Entry::TAO_AV_DIR_IN:
+ {
+ entry->role (TAO_FlowSpec_Entry::TAO_AV_CONSUMER);
+ break;
+ }
+ case TAO_FlowSpec_Entry::TAO_AV_DIR_OUT:
+ {
+ entry->role (TAO_FlowSpec_Entry::TAO_AV_PRODUCER);
+ break;
+ }
+ }
+ break;
+ }
+ case TAO_AV_Core::TAO_AV_ENDPOINT_A:
+ {
+ switch (entry->direction ())
+ {
+ case TAO_FlowSpec_Entry::TAO_AV_DIR_IN:
+ entry->role (TAO_FlowSpec_Entry::TAO_AV_PRODUCER);
+ break;
+ case TAO_FlowSpec_Entry::TAO_AV_DIR_OUT:
+ entry->role (TAO_FlowSpec_Entry::TAO_AV_CONSUMER);
+ break;
+ }
+ break;
+ }
+ default:
+ break;
+ }
+ ACE_Addr *address = entry->address ();
+ if (address != 0)
+ {
+ if (TAO_debug_level > 0)
+ ACE_DEBUG ((LM_DEBUG,
+ "address given for flow %s\n",
+ entry->flowname ()));
+
+ address_flow_set.insert (entry);
+ }
+ else
+ flow_set.insert (entry);
+ } //End of For Loop
+
+
+ int result = -1;
+ switch (direction)
+ {
+ case TAO_AV_Core::TAO_AV_ENDPOINT_A:
+ if (address_flow_set.size () > 0)
+ {
+ result = this->acceptor_registry_->open (endpoint,
+ this,
+ address_flow_set);
+ if (result < 0)
+ ACE_ERROR_RETURN ((LM_ERROR,
+ "TAO_AV_Core::init_forward_flows::acceptor_registry::open failed\n"),
+ -1);
+ TAO_AV_FlowSpecSetItor end = address_flow_set.end ();
+ for (TAO_AV_FlowSpecSetItor start = address_flow_set.begin ();
+ start != end; ++start)
+ {
+ TAO_FlowSpec_Entry *entry = (*start);
+ switch (entry->direction ())
+ {
+ case TAO_FlowSpec_Entry::TAO_AV_DIR_IN:
+ {
+ if (entry->handler () != 0)
+ {
+ //Yamuna:PLEASE CHECK THIS LATER
+#if defined ACE_HAS_RAPI || defined (ACE_HAS_WINSOCK2_GQOS)
+ // For IN flows on the A side we should remove the handlers from the reactor.
+ ACE_Event_Handler *event_handler = entry->handler ()->event_handler ();
+
+ if (event_handler->reactor () != 0)
+ {
+ result = event_handler->reactor ()->remove_handler (event_handler,
+ ACE_Event_Handler::READ_MASK);
+
+ if (result < 0)
+ if (TAO_debug_level > 0)
+ ACE_DEBUG ((LM_DEBUG,
+ "TAO_AV_Core::init_forward_flows: remove_handler failed\n"));
+ }
+#endif //ACE_HAS_RAPI || ACE_HAS_WINSOCK2_GQOS
+ }
+ }
+ default:
+ break;
+ }
+ // Now if the address_set has been changed due to the addition of a control entry we should
+ // add that to the flow_spec_set also.
+ if (flow_spec_set.find (entry) < 0)
+ {
+ // entry doesn't exist so add it.
+ flow_spec_set.insert (entry);
+ // size_t len = flow_spec.length ();
+ // flow_spec.length (len+1);
+ // flow_spec [len] = entry->entry_to_string ();
+ }
+ }
+ }
+ break;
+ case TAO_AV_Core::TAO_AV_ENDPOINT_B:
+ {
+ if (address_flow_set.size () > 0)
+ {
+ ACE_DEBUG ((LM_DEBUG,
+ "(%N,%l) This connector registry is called\n"));
+
+ result = this->connector_registry_->open (endpoint,
+ this,
+ address_flow_set);
+ if (result == -1)
+ ACE_ERROR_RETURN ((LM_ERROR,"TAO_AV_Core::init_Forward_flows: connector_registry open failed\n"),-1);
+ TAO_AV_FlowSpecSetItor end = address_flow_set.end ();
+ for (TAO_AV_FlowSpecSetItor start = address_flow_set.begin ();
+ start != end; ++start)
+ {
+ TAO_FlowSpec_Entry *entry = (*start);
+ switch (entry->direction ())
+ {
+ case TAO_FlowSpec_Entry::TAO_AV_DIR_OUT:
+ {
+ if (entry->handler () != 0)
+ {
+ // @@Naga: This wont be called in the case of Full Profile.
+ // For IN flows on the A side we should remove the handlers from the reactor.
+ ACE_Event_Handler *event_handler = entry->handler ()->event_handler ();
+ result = event_handler->reactor ()->remove_handler (event_handler,
+ ACE_Event_Handler::READ_MASK);
+ if (result < 0)
+ if (TAO_debug_level > 0) ACE_DEBUG ((LM_DEBUG,"TAO_AV_Core::init_forward_flows: remove_handler failed\n"));
+ }
+ }
+ default:
+ break;
+ }
+ // Now if the address_set has been changed due to the addition of a control entry we should
+ // add that to the flow_spec_set also.
+ if (flow_spec_set.find (entry) < 0)
+ {
+ // entry doesn't exist so add it.
+ flow_spec_set.insert (entry);
+ }
+ }
+ }
+ if (flow_set.size () > 0)
+ {
+ TAO_AV_FlowSpecSet tmp_flow_set (flow_set);
+ flow_set.reset ();
+ TAO_AV_FlowSpecSetItor end = tmp_flow_set.end ();
+ TAO_AV_FlowSpecSetItor start = tmp_flow_set.begin ();
+ for (; start != end; ++start)
+ {
+ TAO_FlowSpec_Entry *entry = *start;
+ TAO_FlowSpec_Entry *new_entry;
+ ACE_CString dir;
+ if (entry->direction () == 0)
+ dir += "IN";
+ else if (entry->direction () == 1)
+ dir += "OUT";
+ if (entry->get_peer_addr () != 0)
+ {
+ ACE_NEW_RETURN (new_entry,
+ TAO_Forward_FlowSpec_Entry (entry->flowname (),
+ dir.c_str (),
+ entry->format (),
+ entry->flow_protocol_str (),
+ entry->carrier_protocol_str (),
+ entry->get_peer_addr (),
+ entry->control_address ()),
+ -1);
+ }
+ else
+ {
+ ACE_NEW_RETURN (new_entry,
+ TAO_Forward_FlowSpec_Entry (entry->flowname (),
+ dir.c_str (),
+ entry->format (),
+ entry->flow_protocol_str (),
+ entry->carrier_protocol_str (),
+ entry->address (),
+ entry->control_address ()),
+ -1);
+ }
+ flow_set.insert (new_entry);
+ }
+ result = this->acceptor_registry_->open (endpoint,
+ this,
+ flow_set);
+ if (result == -1)
+ ACE_ERROR_RETURN ((LM_ERROR,"TAO_AV_Core::init_Forward_flows: Acceptor_registry open failed\n"),-1);
+ end = address_flow_set.end ();
+ start = address_flow_set.begin ();
+ for (; start != end; ++start)
+ {
+ TAO_FlowSpec_Entry *entry = (*start);
+ switch (entry->direction ())
+ {
+ case TAO_FlowSpec_Entry::TAO_AV_DIR_OUT:
+ {
+ if (entry->handler () != 0)
+ {
+ // For IN flows on the A side we should remove the handlers from the reactor.
+ ACE_Event_Handler *event_handler = entry->handler ()->event_handler ();
+ result = event_handler->reactor ()->remove_handler (event_handler,
+ ACE_Event_Handler::READ_MASK);
+ if (result < 0)
+ if (TAO_debug_level > 0) ACE_DEBUG ((LM_DEBUG,"TAO_AV_Core::init_forward_flows: remove_handler failed\n"));
+ }
+ }
+ default:
+ break;
+ }
+ // Now if the address_set has been changed due to the addition of a control entry we should
+ // add that to the flow_spec_set also.
+ if (flow_spec_set.find (entry) < 0)
+ {
+ // entry doesn't exist so add it.
+ flow_spec_set.insert (entry);
+ }
+ }
+ }
+
+ AVStreams::flowSpec new_flowspec (static_cast<CORBA::ULong> (flow_spec_set.size ()));
+ int i=0;
+ TAO_AV_FlowSpecSetItor connect_end = address_flow_set.end ();
+ TAO_AV_FlowSpecSetItor connect = address_flow_set.begin ();
+ for (;connect != connect_end; ++connect)
+ {
+ ACE_Addr *local_addr;
+ ACE_Addr *local_control_addr;
+ local_addr = (*connect)->get_local_addr ();
+ local_control_addr = (*connect)->get_local_control_addr ();
+ if (local_addr != 0)
+ {
+ TAO_Reverse_FlowSpec_Entry entry ((*connect)->flowname (),
+ (*connect)->direction_str (),
+ (*connect)->format (),
+ (*connect)->flow_protocol_str (),
+ (*connect)->carrier_protocol_str (),
+ local_addr,
+ local_control_addr);
+ /*
+ ACE_Addr *addr;
+ if ((addr = (*connect)->get_peer_addr ()) != 0)
+ {
+ entry.set_peer_addr (addr);
+ };
+ */
+ int len = new_flowspec.length ();
+ if (i == len)
+ new_flowspec.length (len+1);
+ new_flowspec [i++] = entry.entry_to_string ();
+ if (TAO_debug_level > 0)
+ ACE_DEBUG ((LM_DEBUG, "reverse Flow Spec Is %s\n", entry.entry_to_string ()));
+ }
+ }
+ connect_end = flow_set.end ();
+ for (connect = flow_set.begin ();
+ connect != connect_end; ++connect)
+ {
+ ACE_Addr *local_addr;
+ ACE_Addr *local_control_addr;
+ local_addr = (*connect)->get_local_addr ();
+ local_control_addr = (*connect)->get_local_control_addr ();
+ if (local_addr != 0)
+ {
+ TAO_Reverse_FlowSpec_Entry entry ((*connect)->flowname (),
+ (*connect)->direction_str (),
+ (*connect)->format (),
+ (*connect)->flow_protocol_str (),
+ (*connect)->carrier_protocol_str (),
+ local_addr,
+ local_control_addr);
+
+ int len = new_flowspec.length ();
+ if (i == len)
+ new_flowspec.length (len+1);
+ new_flowspec [i++] = entry.entry_to_string ();
+ }
+ }
+ // Change the reverse flow spec to be sent.
+ // int index = flow_spec.length () + 1;
+ int index = new_flowspec.length ();
+ flow_spec.length (index);
+ for (i = 0; i < index; i++)
+ {
+ flow_spec [i] = new_flowspec [i];
+ }
+ }
+ break;
+ default:
+ break;
+ }
+ return 0;
+}
+
+int
+TAO_AV_Core::init_reverse_flows (TAO_Base_StreamEndPoint *endpoint,
+ TAO_AV_FlowSpecSet &forward_flow_spec_set,
+ TAO_AV_FlowSpecSet &reverse_flow_spec_set,
+ TAO_AV_Core::EndPoint direction)
+{
+ if (TAO_debug_level > 0) ACE_DEBUG ((LM_DEBUG,"(%P|%t)TAO_AV_Core::init_reverse_flows\n"));
+ TAO_AV_FlowSpecSet acceptor_flow_set;
+ TAO_AV_FlowSpecSet connector_flow_set;
+ TAO_AV_FlowSpecSetItor end = reverse_flow_spec_set.end ();
+ TAO_AV_FlowSpecSetItor start = reverse_flow_spec_set.begin ();
+ for (;start != end; ++start)
+ {
+ TAO_FlowSpec_Entry *entry = (*start);
+ ACE_Addr *address = entry->address ();
+ switch (direction)
+ {
+ case TAO_AV_Core::TAO_AV_ENDPOINT_B:
+ {
+ switch (entry->direction ())
+ {
+ case TAO_FlowSpec_Entry::TAO_AV_DIR_IN:
+ entry->role (TAO_FlowSpec_Entry::TAO_AV_CONSUMER);
+ break;
+ case TAO_FlowSpec_Entry::TAO_AV_DIR_OUT:
+ entry->role (TAO_FlowSpec_Entry::TAO_AV_PRODUCER);
+ break;
+ }
+ break;
+ }
+ case TAO_AV_Core::TAO_AV_ENDPOINT_A:
+ {
+ switch (entry->direction ())
+ {
+ case TAO_FlowSpec_Entry::TAO_AV_DIR_IN:
+ entry->role (TAO_FlowSpec_Entry::TAO_AV_PRODUCER);
+ break;
+ case TAO_FlowSpec_Entry::TAO_AV_DIR_OUT:
+ entry->role (TAO_FlowSpec_Entry::TAO_AV_CONSUMER);
+ break;
+ }
+ break;
+ }
+ default: break;
+ }
+
+ if (address != 0)
+ {
+ if (this->get_acceptor (entry->flowname ())!= 0)
+ {
+ ACE_Addr *address = entry->address ();
+ TAO_FlowSpec_Entry *forward_entry =
+ this->get_flow_spec_entry (forward_flow_spec_set,
+ entry->flowname ());
+ if (forward_entry != 0)
+ forward_entry->set_peer_addr (address);
+ }
+ else
+ connector_flow_set.insert (entry);
+ }
+ }
+ int result = -1;
+ switch (direction)
+ {
+
+ case TAO_AV_Core::TAO_AV_ENDPOINT_A:
+ {
+ result = this->connector_registry_->open (endpoint,
+ this,
+ connector_flow_set);
+ }
+ break;
+ default:
+ break;
+ }
+ if (result == -1)
+ ACE_ERROR_RETURN ((LM_ERROR,"acceptor_registry::open"),-1);
+ return 0;
+}
+
+TAO_FlowSpec_Entry *
+TAO_AV_Core::get_flow_spec_entry (TAO_AV_FlowSpecSet &flow_spec_set,
+ const char *flowname)
+{
+ TAO_AV_FlowSpecSetItor end = flow_spec_set.end ();
+ TAO_AV_FlowSpecSetItor begin = flow_spec_set.begin ();
+ for (;
+ begin != end;
+ ++begin)
+ {
+ if (ACE_OS::strcmp ((*begin)->flowname (),flowname) == 0)
+ return (*begin);
+ }
+ return 0;
+}
+
+TAO_AV_Acceptor*
+TAO_AV_Core::get_acceptor (const char *flowname)
+{
+
+ ACE_TRY_NEW_ENV
+ {
+
+ TAO_AV_AcceptorSetItor acceptor = this->acceptor_registry_->begin ();
+ ACE_TRY_CHECK;
+
+ TAO_AV_AcceptorSetItor end =
+ this->acceptor_registry_->end ();
+
+ for (;acceptor != end; ++acceptor)
+ {
+ if (ACE_OS::strcmp ((*acceptor)->flowname (),flowname) == 0)
+ return *acceptor;
+ }
+ }
+ ACE_CATCHANY
+ {
+ ACE_PRINT_EXCEPTION (ACE_ANY_EXCEPTION, "TAO_AV_Core::get_acceptor");
+ }
+ ACE_ENDTRY;
+ return 0;
+}
+
+int
+TAO_AV_Core::remove_acceptor (const char *flowname)
+{
+
+ ACE_TRY_NEW_ENV
+ {
+
+ TAO_AV_AcceptorSetItor acceptor = this->acceptor_registry_->begin ();
+ ACE_TRY_CHECK;
+
+ TAO_AV_AcceptorSetItor end =
+ this->acceptor_registry_->end ();
+
+ for (;acceptor != end; ++acceptor)
+ {
+ if (ACE_OS::strcmp ((*acceptor)->flowname (),flowname) == 0)
+ {
+ this->acceptor_registry_->close (*acceptor);
+ return 0;
+ }
+ }
+ }
+ ACE_CATCHANY
+ {
+ ACE_PRINT_EXCEPTION (ACE_ANY_EXCEPTION, "TAO_AV_Core::get_acceptor");
+ }
+ ACE_ENDTRY;
+ return -1;
+}
+
+TAO_AV_Connector*
+TAO_AV_Core::get_connector (const char *flowname)
+{
+ TAO_AV_ConnectorSetItor connector =
+ this->connector_registry_->begin ();
+ TAO_AV_ConnectorSetItor end =
+ this->connector_registry_->end ();
+
+ for (;connector != end; ++connector)
+ {
+ if (ACE_OS::strcmp ((*connector)->flowname (),flowname) == 0)
+ return *connector;
+ }
+ return 0;
+}
+
+int
+TAO_AV_Core::remove_connector (const char *flowname)
+{
+ TAO_AV_ConnectorSetItor connector =
+ this->connector_registry_->begin ();
+ TAO_AV_ConnectorSetItor end =
+ this->connector_registry_->end ();
+
+ for (;connector != end; ++connector)
+ {
+ if (ACE_OS::strcmp ((*connector)->flowname (),flowname) == 0)
+ {
+ this->connector_registry_->close (*connector);
+ return 0;
+ }
+ }
+ return -1;
+}
+
+TAO_AV_Flow_Protocol_Factory *
+TAO_AV_Core::get_flow_protocol_factory(const char *flow_protocol)
+{
+ if (flow_protocol == 0)
+ return 0;
+
+ for (TAO_AV_Flow_ProtocolFactorySetItor control_flow_factory =
+ this->flow_protocol_factories_.begin ();
+ control_flow_factory !=
+ this->flow_protocol_factories_.end ();
+ ++control_flow_factory)
+ {
+ if ((*control_flow_factory)->factory ()->match_protocol (flow_protocol))
+ {
+ return (*control_flow_factory)->factory ();
+ }
+ }
+
+ // Not found.
+ return 0;
+}
+
+TAO_AV_Transport_Factory *
+TAO_AV_Core::get_transport_factory(const char *transport_protocol)
+{
+ if (transport_protocol == 0)
+ return 0;
+
+ for (TAO_AV_TransportFactorySetItor transport_factory =
+ this->transport_factories_.begin ();
+ transport_factory != this->transport_factories_.end ();
+ ++transport_factory)
+ {
+ if ((*transport_factory)->factory ()->match_protocol (transport_protocol))
+ {
+ return (*transport_factory)->factory ();
+ }
+ }
+
+ // Not found.
+ return 0;
+}
+
+int
+TAO_AV_Core::load_default_transport_factories (void)
+{
+ const char *udp_factory_str = "UDP_Factory";
+ const char *tcp_factory_str = "TCP_Factory";
+
+ TAO_AV_Transport_Factory *udp_factory = 0;
+ TAO_AV_Transport_Item *udp_item = 0;
+
+ udp_factory =
+ ACE_Dynamic_Service<TAO_AV_Transport_Factory>::instance (udp_factory_str);
+ if (udp_factory == 0)
+ {
+ if (TAO_debug_level)
+ ACE_ERROR ((LM_WARNING,
+ "(%P|%t) WARNING - No %s found in Service Repository."
+ " Using default instance.\n",
+ "UDP Factory"));
+
+ ACE_NEW_RETURN (udp_factory,
+ TAO_AV_UDP_Factory,
+ -1);
+ }
+ else udp_factory->ref_count = 1;
+
+ ACE_NEW_RETURN (udp_item, TAO_AV_Transport_Item ("UDP_Factory"), -1);
+ udp_item->factory (udp_factory);
+
+ this->transport_factories_.insert (udp_item);
+
+ TAO_AV_Transport_Factory *tcp_factory = 0;
+ TAO_AV_Transport_Item *tcp_item = 0;
+
+ tcp_factory =
+ ACE_Dynamic_Service<TAO_AV_Transport_Factory>::instance (tcp_factory_str);
+ if (tcp_factory == 0)
+ {
+ if (TAO_debug_level)
+ ACE_ERROR ((LM_WARNING,
+ "(%P|%t) WARNING - No %s found in Service Repository."
+ " Using default instance.\n",
+ "TCP Factory"));
+
+ ACE_NEW_RETURN (tcp_factory,
+ TAO_AV_TCP_Factory,
+ -1);
+ }
+ else tcp_factory->ref_count = 1;
+
+ ACE_NEW_RETURN (tcp_item, TAO_AV_Transport_Item ("TCP_Factory"), -1);
+ tcp_item->factory (tcp_factory);
+
+ this->transport_factories_.insert (tcp_item);
+
+#if defined (ACE_HAS_RAPI) || defined (ACE_HAS_WINSOCK2_GQOS)
+ const char *udp_qos_factory_str = "UDP_QoS_Factory";
+
+ TAO_AV_Transport_Factory *udp_qos_factory = 0;
+ TAO_AV_Transport_Item *udp_qos_item = 0;
+
+ udp_qos_factory =
+ ACE_Dynamic_Service<TAO_AV_Transport_Factory>::instance (udp_qos_factory_str);
+ if (udp_qos_factory == 0)
+ {
+ if (TAO_debug_level)
+ ACE_ERROR ((LM_WARNING,
+ "(%P|%t) WARNING - No %s found in Service Repository."
+ " Using default instance.\n",
+ "UDP QoS Factory"));
+
+ ACE_NEW_RETURN (udp_qos_factory,
+ TAO_AV_UDP_QoS_Factory,
+ -1);
+ }
+ else udp_qos_factory->ref_count = 1;
+
+ ACE_NEW_RETURN (udp_qos_item,
+ TAO_AV_Transport_Item ("UDP_QoS_Factory"),
+ -1);
+
+ udp_qos_item->factory (udp_qos_factory);
+
+ this->transport_factories_.insert (udp_qos_item);
+#endif /* ACE_HAS_RAPI || ACE_HAS_WINSOCK2_GQOS */
+
+#if defined ACE_HAS_SCTP
+ const char *sctp_seq_factory_str = "SCTP_SEQ_Factory";
+
+ TAO_AV_Transport_Factory *sctp_seq_factory = 0;
+ TAO_AV_Transport_Item *sctp_seq_item = 0;
+
+ sctp_seq_factory =
+ ACE_Dynamic_Service<TAO_AV_Transport_Factory>::instance (sctp_seq_factory_str);
+ if (sctp_seq_factory == 0)
+ {
+ if (TAO_debug_level)
+ ACE_ERROR ((LM_WARNING,
+ "(%P|%t) WARNING - No %s found in Service Repository."
+ " Using default instance.\n",
+ "SCTP SEQ Factory"));
+
+ ACE_NEW_RETURN (sctp_seq_factory,
+ TAO_AV_SCTP_SEQ_Factory,
+ -1);
+ }
+ else sctp_seq_factory->ref_count = 1;
+
+ ACE_NEW_RETURN (sctp_seq_item,
+ TAO_AV_Transport_Item ("SCTP_SEQ_Factory"),
+ -1);
+
+ sctp_seq_item->factory (sctp_seq_factory);
+
+ this->transport_factories_.insert (sctp_seq_item);
+#endif /* ACE_HAS_SCTP */
+
+ return 0;
+}
+
+int
+TAO_AV_Core::init_transport_factories (void)
+{
+ TAO_AV_TransportFactorySetItor end = this->transport_factories_.end ();
+ TAO_AV_TransportFactorySetItor factory = this->transport_factories_.begin ();
+
+
+ if (factory == end)
+ {
+ if (TAO_debug_level > 0)
+ ACE_DEBUG ((LM_DEBUG,
+ "Loading default transport protocols\n"));
+ this->load_default_transport_factories ();
+ }
+ else
+ {
+ for (; factory != end; factory++)
+ {
+ const ACE_CString &name = (*factory)->name ();
+ if (TAO_debug_level > 0)
+ ACE_DEBUG ((LM_DEBUG,
+ "%s \n",
+ name.c_str ()));
+
+ (*factory)->factory (
+ ACE_Dynamic_Service<TAO_AV_Transport_Factory>::instance (name.c_str ()));
+ if ((*factory)->factory () == 0)
+ {
+ ACE_ERROR_RETURN ((LM_ERROR,
+ ACE_TEXT ("TAO (%P|%t) Unable to load ")
+ ACE_TEXT ("protocol <%s>, %p\n"),
+ name.c_str (), ""),
+ -1);
+ }
+ (*factory)->factory ()->ref_count = 1;
+
+ if (TAO_debug_level > 0)
+ {
+ ACE_DEBUG ((LM_DEBUG,
+ ACE_TEXT ("TAO (%P|%t) Loaded protocol <%s>\n"),
+ name.c_str ()));
+ }
+ }
+ }
+
+ return 0;
+}
+
+int
+TAO_AV_Core::load_default_flow_protocol_factories (void)
+{
+ const char *udp_flow = "UDP_Flow_Factory";
+ const char *tcp_flow = "TCP_Flow_Factory";
+ const char *rtp_flow = "RTP_Flow_Factory";
+ const char *rtcp_flow = "RTCP_Flow_Factory";
+ const char *sfp_flow = "SFP_Flow_Factory";
+
+ TAO_AV_Flow_Protocol_Factory *udp_flow_factory = 0;
+ TAO_AV_Flow_Protocol_Item *udp_item = 0;
+
+ udp_flow_factory =
+ ACE_Dynamic_Service<TAO_AV_Flow_Protocol_Factory>::instance (udp_flow);
+ if (udp_flow_factory == 0)
+ {
+ if (TAO_debug_level)
+ ACE_ERROR ((LM_WARNING,
+ "(%P|%t) WARNING - No %s found in Service Repository."
+ " Using default instance.\n",
+ "UDP Flow Factory"));
+
+ ACE_NEW_RETURN (udp_flow_factory,
+ TAO_AV_UDP_Flow_Factory,
+ -1);
+ }
+ else udp_flow_factory->ref_count = 1;
+
+ ACE_NEW_RETURN (udp_item, TAO_AV_Flow_Protocol_Item ("UDP_Flow_Factory"), -1);
+ udp_item->factory (udp_flow_factory);
+
+ this->flow_protocol_factories_.insert (udp_item);
+
+#if defined (ACE_HAS_RAPI) || defined (ACE_HAS_WINSOCK2_GQOS)
+
+ const char *udp_qos_flow = "UDP_QoS_Flow_Factory";
+ TAO_AV_Flow_Protocol_Factory *udp_qos_flow_factory = 0;
+ TAO_AV_Flow_Protocol_Item *udp_qos_flow_item = 0;
+
+ udp_qos_flow_factory =
+ ACE_Dynamic_Service<TAO_AV_Flow_Protocol_Factory>::instance (udp_qos_flow);
+ if (udp_qos_flow_factory == 0)
+ {
+ if (TAO_debug_level)
+ ACE_ERROR ((LM_WARNING,
+ "(%P|%t) WARNING - No %s found in Service Repository."
+ " Using default instance.\n",
+ "UDP QoS Flow Factory"));
+
+ ACE_NEW_RETURN (udp_qos_flow_factory,
+ TAO_AV_UDP_QoS_Flow_Factory,
+ -1);
+ }
+ else udp_qos_flow_factory->ref_count = 1;
+
+ ACE_NEW_RETURN (udp_qos_flow_item, TAO_AV_Flow_Protocol_Item ("UDP_QoS_Flow_Factory"), -1);
+ udp_qos_flow_item->factory (udp_qos_flow_factory);
+
+ this->flow_protocol_factories_.insert (udp_qos_flow_item);
+
+#endif /* defined (ACE_HAS_RAPI) || defined (ACE_HAS_WINSOCK2_GQOS) */
+
+#if defined ACE_HAS_SCTP
+
+ const char *sctp_seq_flow = "SCTP_SEQ_Flow_Factory";
+ TAO_AV_Flow_Protocol_Factory *sctp_seq_flow_factory = 0;
+ TAO_AV_Flow_Protocol_Item *sctp_seq_flow_item = 0;
+
+ sctp_seq_flow_factory =
+ ACE_Dynamic_Service<TAO_AV_Flow_Protocol_Factory>::instance (sctp_seq_flow);
+ if (sctp_seq_flow_factory == 0)
+ {
+ if (TAO_debug_level)
+ ACE_ERROR ((LM_WARNING,
+ "(%P|%t) WARNING - No %s found in Service Repository."
+ " Using default instance.\n",
+ "SCTP SEQ Flow Factory"));
+
+ ACE_NEW_RETURN (sctp_seq_flow_factory,
+ TAO_AV_SCTP_SEQ_Flow_Factory,
+ -1);
+ }
+ else sctp_seq_flow_factory->ref_count = 1;
+
+ ACE_NEW_RETURN (sctp_seq_flow_item, TAO_AV_Flow_Protocol_Item ("SCTP_SEQ_Flow_Factory"), -1);
+ sctp_seq_flow_item->factory (sctp_seq_flow_factory);
+
+ this->flow_protocol_factories_.insert (sctp_seq_flow_item);
+
+#endif /* ACE_HAS_SCTP */
+
+ TAO_AV_Flow_Protocol_Factory *tcp_flow_factory = 0;
+ TAO_AV_Flow_Protocol_Item *tcp_item = 0;
+
+ tcp_flow_factory =
+ ACE_Dynamic_Service<TAO_AV_Flow_Protocol_Factory>::instance (tcp_flow);
+ if (tcp_flow_factory == 0)
+ {
+ if (TAO_debug_level)
+ ACE_ERROR ((LM_WARNING,
+ "(%P|%t) WARNING - No %s found in Service Repository."
+ " Using default instance.\n",
+ "TCP Flow Factory"));
+
+ ACE_NEW_RETURN (tcp_flow_factory,
+ TAO_AV_TCP_Flow_Factory,
+ -1);
+ }
+ else tcp_flow_factory->ref_count = 1;
+
+ ACE_NEW_RETURN (tcp_item, TAO_AV_Flow_Protocol_Item ("TCP_Flow_Factory"), -1);
+ tcp_item->factory (tcp_flow_factory);
+
+ this->flow_protocol_factories_.insert (tcp_item);
+
+ TAO_AV_Flow_Protocol_Factory *rtp_flow_factory = 0;
+ TAO_AV_Flow_Protocol_Item *rtp_item = 0;
+
+ rtp_flow_factory =
+ ACE_Dynamic_Service<TAO_AV_Flow_Protocol_Factory>::instance (rtp_flow);
+ if (rtp_flow_factory == 0)
+ {
+ if (TAO_debug_level)
+ ACE_ERROR ((LM_WARNING,
+ "(%P|%t) WARNING - No %s found in Service Repository."
+ " Using default instance.\n",
+ "RTP Flow Factory"));
+
+ ACE_NEW_RETURN (rtp_flow_factory,
+ TAO_AV_RTP_Flow_Factory,
+ -1);
+ }
+ else rtp_flow_factory->ref_count = 1;
+
+ ACE_NEW_RETURN (rtp_item, TAO_AV_Flow_Protocol_Item ("RTP_Flow_Factory"), -1);
+ rtp_item->factory (rtp_flow_factory);
+
+ this->flow_protocol_factories_.insert (rtp_item);
+
+ TAO_AV_Flow_Protocol_Factory *rtcp_flow_factory = 0;
+ TAO_AV_Flow_Protocol_Item *rtcp_item = 0;
+
+ rtcp_flow_factory =
+ ACE_Dynamic_Service<TAO_AV_Flow_Protocol_Factory>::instance (rtcp_flow);
+ if (rtcp_flow_factory == 0)
+ {
+ if (TAO_debug_level)
+ ACE_ERROR ((LM_WARNING,
+ "(%P|%t) WARNING - No %s found in Service Repository."
+ " Using default instance.\n",
+ "RTCP Flow Factory"));
+
+ ACE_NEW_RETURN (rtcp_flow_factory,
+ TAO_AV_RTCP_Flow_Factory,
+ -1);
+ }
+ else rtcp_flow_factory->ref_count = 1;
+
+ ACE_NEW_RETURN (rtcp_item, TAO_AV_Flow_Protocol_Item ("RTCP_Flow_Factory"), -1);
+ rtcp_item->factory (rtcp_flow_factory);
+
+ this->flow_protocol_factories_.insert (rtcp_item);
+
+ TAO_AV_Flow_Protocol_Factory *sfp_flow_factory = 0;
+ TAO_AV_Flow_Protocol_Item *sfp_item = 0;
+
+ sfp_flow_factory =
+ ACE_Dynamic_Service<TAO_AV_Flow_Protocol_Factory>::instance (sfp_flow);
+ if (sfp_flow_factory == 0)
+ {
+ if (TAO_debug_level)
+ ACE_ERROR ((LM_WARNING,
+ "(%P|%t) WARNING - No %s found in Service Repository."
+ " Using default instance.\n",
+ "SFP Flow Factory"));
+
+ ACE_NEW_RETURN (sfp_flow_factory,
+ TAO_AV_SFP_Factory,
+ -1);
+ }
+ else sfp_flow_factory->ref_count = 1;
+
+ ACE_NEW_RETURN (sfp_item, TAO_AV_Flow_Protocol_Item ("SFP_Flow_Factory"), -1);
+ sfp_item->factory (sfp_flow_factory);
+
+ this->flow_protocol_factories_.insert (sfp_item);
+
+ return 0;
+}
+
+int
+TAO_AV_Core::init_flow_protocol_factories (void)
+{
+ TAO_AV_Flow_ProtocolFactorySetItor end = this->flow_protocol_factories_.end ();
+ TAO_AV_Flow_ProtocolFactorySetItor factory = this->flow_protocol_factories_.begin ();
+
+ if (factory == end)
+ {
+ ACE_DEBUG ((LM_DEBUG,
+ "Loading default flow protocol factories\n"));
+
+ this->load_default_flow_protocol_factories ();
+ }
+ else
+ {
+ for (; factory != end; factory++)
+ {
+ const ACE_CString &name = (*factory)->name ();
+ if (TAO_debug_level > 0)
+ ACE_DEBUG ((LM_DEBUG,
+ "%s \n",
+ name.c_str ()));
+
+ (*factory)->factory (
+ ACE_Dynamic_Service<TAO_AV_Flow_Protocol_Factory>::instance (name.c_str ()));
+ if ((*factory)->factory () == 0)
+ {
+ ACE_ERROR_RETURN ((LM_ERROR,
+ ACE_TEXT ("TAO (%P|%t) Unable to load ")
+ ACE_TEXT ("protocol <%s>, %p\n"),
+ name.c_str (), ""),
+ -1);
+ }
+
+ (*factory)->factory ()->ref_count = 1;
+
+ if (TAO_debug_level > 0)
+ {
+ ACE_DEBUG ((LM_DEBUG,
+ ACE_TEXT ("TAO (%P|%t) Loaded protocol <%s>\n"),
+ name.c_str ()));
+ }
+ }
+ }
+
+ return 0;
+}
+
+/* static */
+int
+TAO_AV_Core::deactivate_servant (PortableServer::Servant servant)
+{
+ // Because of reference counting, the POA will automatically delete
+ // the servant when all pending requests on this servant are
+ // complete.
+
+ ACE_DECLARE_NEW_CORBA_ENV;
+ ACE_TRY
+ {
+ PortableServer::POA_var poa = servant->_default_POA (ACE_ENV_SINGLE_ARG_PARAMETER);
+ ACE_TRY_CHECK;
+
+ PortableServer::ObjectId_var id = poa->servant_to_id (servant
+ ACE_ENV_ARG_PARAMETER);
+ ACE_TRY_CHECK;
+
+ poa->deactivate_object (id.in ()
+ ACE_ENV_ARG_PARAMETER);
+ ACE_TRY_CHECK;
+ }
+ ACE_CATCHANY
+ {
+ ACE_PRINT_EXCEPTION (ACE_ANY_EXCEPTION, "deactivate_servant");
+ return -1;
+ }
+ ACE_ENDTRY;
+ ACE_CHECK_RETURN (-1);
+ return 0;
+}
+
+/* static */
+char *
+TAO_AV_Core::get_flowname (const char *flow_spec_entry_str)
+{
+ ACE_CString flow_spec_entry (flow_spec_entry_str);
+ ACE_CString::size_type slash_pos = flow_spec_entry.find ('\\');
+ ACE_CString flow_name;
+ if (slash_pos != flow_spec_entry.npos)
+ flow_name = flow_spec_entry.substring (0, slash_pos);
+ else
+ flow_name = flow_spec_entry_str;
+ return CORBA::string_dup (flow_name.c_str ());
+}
+
+ACE_CString
+TAO_AV_Core::get_control_flowname(const char *flowname)
+{
+ ACE_CString control_flowname;
+ control_flowname = "c_";
+ control_flowname = control_flowname + flowname;
+
+ return flowname;
+}
+
+#if defined (ACE_HAS_EXPLICIT_STATIC_TEMPLATE_MEMBER_INSTANTIATION)
+template ACE_Singleton<TAO_AV_Core, ACE_Null_Mutex> *ACE_Singleton<TAO_AV_Core, ACE_Null_Mutex>::singleton_;
+#endif /* ACE_HAS_EXPLICIT_STATIC_TEMPLATE_MEMBER_INSTANTIATION */
+
+TAO_END_VERSIONED_NAMESPACE_DECL
diff --git a/TAO/orbsvcs/orbsvcs/AV/AV_Core.h b/TAO/orbsvcs/orbsvcs/AV/AV_Core.h
new file mode 100644
index 00000000000..4a8f29aa137
--- /dev/null
+++ b/TAO/orbsvcs/orbsvcs/AV/AV_Core.h
@@ -0,0 +1,181 @@
+// -*- C++ -*-
+
+//=============================================================================
+/**
+ * @file AV_Core.h
+ *
+ * $Id$
+ *
+ * @author Nagarajan Surendran <naga@cs.wustl.edu>
+ */
+//=============================================================================
+
+#ifndef TAO_AV_CORE_H
+#define TAO_AV_CORE_H
+#include /**/ "ace/pre.h"
+
+#include "orbsvcs/AV/AV_export.h"
+#include "orbsvcs/AVStreamsC.h"
+
+#include "tao/PortableServer/PortableServer.h"
+
+#include "ace/Singleton.h"
+#include "ace/Unbounded_Set.h"
+#include "ace/Null_Mutex.h"
+
+ACE_BEGIN_VERSIONED_NAMESPACE_DECL
+class ACE_Reactor;
+ACE_END_VERSIONED_NAMESPACE_DECL
+
+TAO_BEGIN_VERSIONED_NAMESPACE_DECL
+
+class TAO_Base_StreamEndPoint;
+class TAO_AV_Connector_Registry;
+class TAO_AV_Acceptor_Registry;
+class TAO_AV_Acceptor;
+class TAO_AV_Connector;
+class TAO_FlowSpec_Entry;
+class TAO_AV_Transport_Item;
+class TAO_AV_Transport_Factory;
+class TAO_AV_Flow_Protocol_Item;
+class TAO_AV_Flow_Protocol_Factory;
+
+typedef ACE_Unbounded_Set <TAO_FlowSpec_Entry*> TAO_AV_FlowSpecSet;
+typedef ACE_Unbounded_Set_Iterator <TAO_FlowSpec_Entry*> TAO_AV_FlowSpecSetItor;
+
+typedef ACE_Unbounded_Set<TAO_AV_Transport_Item*> TAO_AV_TransportFactorySet;
+typedef ACE_Unbounded_Set_Iterator<TAO_AV_Transport_Item*> TAO_AV_TransportFactorySetItor;
+
+// typedefs for containers containing the list of loaded Flow_Protocol factories.
+typedef ACE_Unbounded_Set<TAO_AV_Flow_Protocol_Item*> TAO_AV_Flow_ProtocolFactorySet;
+typedef ACE_Unbounded_Set_Iterator<TAO_AV_Flow_Protocol_Item*> TAO_AV_Flow_ProtocolFactorySetItor;
+
+/**
+ * @class TAO_AV_Core
+ * @brief This class encapsulates access to the TAO AV Core's resources
+ * and its state.
+ */
+class TAO_AV_Export TAO_AV_Core
+{
+public:
+ enum EndPoint {TAO_AV_ENDPOINT_A,TAO_AV_ENDPOINT_B};
+
+ enum Protocol
+ {
+ TAO_AV_NOPROTOCOL = -1,
+ TAO_AV_TCP = 0,
+ TAO_AV_UDP = 1,
+ TAO_AV_AAL5 = 2,
+ TAO_AV_AAL3_4 = 3,
+ TAO_AV_AAL1 = 4,
+ TAO_AV_RTP_UDP = 5,
+ TAO_AV_RTP_AAL5 = 6,
+ TAO_AV_IPX = 7,
+ TAO_AV_SFP_UDP = 8,
+ TAO_AV_UDP_MCAST = 9,
+ TAO_AV_RTP_UDP_MCAST = 10,
+ TAO_AV_SFP_UDP_MCAST = 11,
+ TAO_AV_QOS_UDP = 12,
+ TAO_AV_USERDEFINED_UDP = 13,
+ TAO_AV_USERDEFINED_UDP_MCAST = 14,
+ TAO_AV_SCTP_SEQ = 15
+ };
+
+ enum Flow_Component
+ {
+ TAO_AV_DATA = 1,
+ TAO_AV_CONTROL = 2,
+ TAO_AV_BOTH = 3
+ };
+
+ /// Default constructor.
+ TAO_AV_Core (void);
+
+ /// Destructor.
+ ~TAO_AV_Core (void);
+
+ int init (CORBA::ORB_ptr orb,
+ PortableServer::POA_ptr poa
+ ACE_ENV_ARG_DECL);
+ int run (void);
+ int stop_run (void);
+ int init_forward_flows (TAO_Base_StreamEndPoint *endpoint,
+ TAO_AV_FlowSpecSet &flow_spec_set,
+ EndPoint direction,
+ AVStreams::flowSpec &flow_spec);
+ int init_reverse_flows (TAO_Base_StreamEndPoint *endpoint,
+ TAO_AV_FlowSpecSet &forward_flow_spec_set,
+ TAO_AV_FlowSpecSet &reverse_flow_spec_set,
+ EndPoint direction);
+ int init_transport_factories (void);
+ int init_flow_protocol_factories (void);
+
+ int load_default_transport_factories (void);
+ int load_default_flow_protocol_factories (void);
+
+ /// = Get the acceptor registry
+ TAO_AV_Acceptor *get_acceptor (const char *flowname);
+ TAO_AV_Connector *get_connector (const char *flowname);
+ int remove_acceptor (const char *flowname);
+ int remove_connector (const char *flowname);
+ TAO_AV_Connector_Registry *connector_registry (void);
+ TAO_FlowSpec_Entry *get_flow_spec_entry (TAO_AV_FlowSpecSet &flow_spec_set,
+ const char *flowname);
+ TAO_AV_Acceptor_Registry *acceptor_registry (void);
+
+ // = Get the protocol factories
+ /// = Set/get the <ACE_Reactor>.
+ TAO_AV_Flow_Protocol_Factory *get_flow_protocol_factory(const char *flow_protocol);
+ TAO_AV_Transport_Factory *get_transport_factory(const char *transport_protocol);
+ TAO_AV_Flow_ProtocolFactorySet *flow_protocol_factories (void);
+ TAO_AV_TransportFactorySet *transport_factories (void);
+ void reactor (ACE_Reactor *r);
+ ACE_Reactor *reactor (void);
+ CORBA::ORB_ptr orb (void);
+ void orb (CORBA::ORB_ptr orb_);
+ PortableServer::POA_ptr poa (void);
+ void poa (PortableServer::POA_ptr poa_);
+
+ static int deactivate_servant (PortableServer::Servant servant);
+ static char *get_flowname (const char *flow_spec_entry_str);
+ static ACE_CString get_control_flowname(const char *flowname);
+
+protected:
+ /// The connector registry which all active connecters must register
+ /// themselves with.
+ TAO_AV_Connector_Registry *connector_registry_;
+
+ /// The registry which maintains a list of acceptor factories for each
+ /// loaded protocol.
+ TAO_AV_Acceptor_Registry *acceptor_registry_;
+
+ /// Pointer to the list of transports loaded into this AV_Core instance.
+ TAO_AV_TransportFactorySet transport_factories_;
+
+ /// Pointer to the list of flow protocol loaded into this AV_Core instance.
+ TAO_AV_Flow_ProtocolFactorySet flow_protocol_factories_;
+
+ ACE_Reactor *reactor_;
+ CORBA::ORB_var orb_;
+ PortableServer::POA_var poa_;
+ CORBA::Boolean stop_run_;
+};
+
+#if defined (__BORLANDC__)
+# if !defined (TAO_AV_BUILD_DLL)
+# pragma option push -Jgx
+# endif
+#endif
+TAO_AV_SINGLETON_DECLARE (ACE_Singleton, TAO_AV_Core, ACE_Null_Mutex)
+#if defined (__BORLANDC__)
+# if !defined(TAO_AV_BUILD_DLL)
+# pragma option pop
+# endif
+#endif
+
+typedef ACE_Singleton<TAO_AV_Core, ACE_Null_Mutex> TAO_AV_CORE;
+
+TAO_END_VERSIONED_NAMESPACE_DECL
+
+#include /**/ "ace/post.h"
+#endif /* TAO_AV_CORE_H */
diff --git a/TAO/orbsvcs/orbsvcs/AV/AV_Pluggable_Framework.html b/TAO/orbsvcs/orbsvcs/AV/AV_Pluggable_Framework.html
new file mode 100644
index 00000000000..ca4db983b3c
--- /dev/null
+++ b/TAO/orbsvcs/orbsvcs/AV/AV_Pluggable_Framework.html
@@ -0,0 +1,377 @@
+<!$Id$>
+<!doctype html public "-//w3c//dtd html 4.0 transitional//en">
+<html>
+<head>
+ <meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1">
+ <meta name="GENERATOR" content="Mozilla/4.75 [en] (X11; U; Linux 2.2.16-22 i686) [Netscape]">
+</head>
+<body text="#000000" bgcolor="#FFFFFF" link="#0000EE" vlink="#551A8B" alink="#FF0000">
+
+<center>
+<h1>
+Implementing Pluggable Protocol in TAO AV Streaming Service</h1></center>
+
+<center>
+<h4>
+<a href="mailto:naga@cs.wustl.edu">Nagarajan Surendran </a>and <a href="mailto:yamuna@cs.wustl.edu">Yamuna
+Krishnamurthy</a></h4></center>
+
+<center>Center for Distributed Object Computing
+<br>Washington University in St.Louis</center>
+
+<hr WIDTH="100%">
+<h3>
+Overview</h3>
+Traditionally DOC Middleware has provided facilities to design application-level
+objects at a higher level of abstraction, away from low-level details of
+network programming and distribution. The aspect of multimedia application
+that could benefit from this is an interoperable standard design of multimedia
+interfaces defined in IDL. The OMG A/V Specification defines such a set
+of interfaces which helps in type-safe ,robust and flexible applications.
+Also as proved in our earlier work,ORBs with IIOP implementation cannot
+be used for streaming multimedia data since they're optimized for request-response
+semantics. To circumvent this the application developer will have to use
+Out of Band data connection to stream the data while using the ORB to negotiate
+QoS, bind type-safe devices and explore their properties.
+<p>Also it is important for a Multimedia framework to have the ability
+to support different transports and be able to plug and configure them
+dynamically and statically .For example, a wireless link based application
+may want to use the Wireless link protocol to stream the data. RTP is gaining
+wide significance as the Transport protocol for streaming Audio and Video
+Data over the Internet. Our framework provides an implementation of RTP/RTCP
+for the audio/video profile. RTP is internet-centric and doesn't provide
+facilities to transport&nbsp; IDL-defined flows. SFP is a Simple Flow Protocol
+specified by the OMG for A/V Streaming and it can be mapped to different
+transports like UDP, RTP and ATM AAL5. Our framework provides an implementation
+of SFP that runs over UDP and multicast UDP.
+<p>The OMG specification defines the flow specification syntax that is
+to be used for the bind_devs calls for connection establishment. It defines
+the protocol names and also the syntax for specifying the transport/flow
+protocol information but it doesn't define any interfaces for the protocol
+implementation as such. Our framework bridges this gap by defining a uniform
+API&nbsp; for the different flow protocols like RTP and SFP while taking
+care of the variations using a Policy interface. We solve this with our
+Pluggable Protocol Framework using design patterns like Layer,
+<br>Acceptor, Connector, Facade and Abstract Factory. Please look at this
+<a href="http://www.cs.wustl.edu/~naga/pluggable_av.ps.gz">paper</a>
+for more documentation on the TAO AV Service Pluggable Protocol Framework.
+<p>
+<hr WIDTH="100%">
+<h3>
+Implementing the Pluggable Protocol</h3>
+In order to add a new pluggable transport and flow protocol to the AVStreams
+framework, without making changes to the framework itself, the pluggable
+protocol must implement the following components of the Pluggable Protocol
+framework:
+<h4>
+The Transport Protocol Components</h4>
+
+<h4>
+<i>Acceptor and Connector:&nbsp;</i></h4>
+These are implementations of the Acceptor and Connector design patterns.
+In the case of connectionless protocols like UDP, calling accept and connect
+will result in the creation of handlers immediately.
+<p>The pluggable transport protocol implementation should inherit from
+the following abstract classes declared in <a href="./Transport.h">&lt;orbsvcs/orbsvcs/AV/Transport.h>:</a>
+<p>/**
+<br>&nbsp;* @class TAO_AV_Acceptor
+<br>&nbsp;* @brief
+<br>&nbsp;*/
+<br>class TAO_AV_Export TAO_AV_Acceptor
+<br>{
+<br>public:
+<br>&nbsp; TAO_AV_Acceptor (void);
+<br>&nbsp; virtual ~TAO_AV_Acceptor (void);
+<br>&nbsp; virtual int open (TAO_Base_StreamEndPoint *endpoint,
+<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
+TAO_AV_Core *av_core,
+<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
+TAO_FlowSpec_Entry *entry,
+<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
+TAO_AV_Flow_Protocol_Factory *factory) = 0;
+<p>&nbsp; virtual int open_default (TAO_Base_StreamEndPoint *endpoint,
+<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
+TAO_AV_Core *av_core,
+<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
+TAO_FlowSpec_Entry *entry,
+<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
+TAO_AV_Flow_Protocol_Factory *factory) = 0;
+<p>&nbsp; const char *flowname ();
+<br>&nbsp; virtual int close (void) = 0;
+<br>protected:
+<br>&nbsp; ACE_CString flowname_;
+<br>&nbsp; TAO_AV_Core *av_core_;
+<br>&nbsp; ACE_Addr *address_;
+<br>};
+<br>&nbsp;
+<p>/**
+<br>&nbsp;* @class TAO_AV_Connector
+<br>&nbsp;* @brief
+<br>&nbsp;*/
+<br>class TAO_AV_Export TAO_AV_Connector
+<br>{
+<br>public:
+<br>&nbsp; TAO_AV_Connector (void);
+<br>&nbsp; virtual ~TAO_AV_Connector (void);
+<br>&nbsp; const char *flowname (void);
+<p>&nbsp; virtual int open (TAO_Base_StreamEndPoint *endpoint,
+<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
+TAO_AV_Core *av_core,
+<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
+TAO_AV_Flow_Protocol_Factory *factory) = 0;
+<p>&nbsp; virtual int connect (TAO_FlowSpec_Entry *entry,
+<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
+TAO_AV_Transport *&amp;transport) = 0;
+<p>&nbsp; virtual int close (void) = 0;
+<br>protected:
+<br>&nbsp; ACE_CString flowname_;
+<br>};
+<br>&nbsp;
+<br>&nbsp;
+<h4>
+<i>Transport and Transport Factory:</i></h4>
+The transport class provides a common interface for different protocols
+for performing operations like open, close, send and recv. The trasnport
+factory is an interface for creating acceptors and connectors.
+<p>The pluggable transport protocol implementation should inherit from
+the following abstract classes declared in&nbsp;<a href="./Transport.h">
+&lt;orbsvcs/orbsvcs/AV/Transport.h>:</a><i></i>
+<p>/**
+<br>&nbsp;* @class TAO_AV_Transport
+<br>&nbsp;* @brief A Base class for the different transport protocols.
+<br>&nbsp;*&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; All the different
+transports should derive and implement
+<br>&nbsp;*&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; the open,close,send
+and recv methods.
+<br>&nbsp;*/
+<br>class TAO_AV_Export TAO_AV_Transport
+<br>{
+<br>public:
+<br>&nbsp; TAO_AV_Transport (void);
+<p>&nbsp; virtual ~TAO_AV_Transport (void);
+<p>&nbsp; virtual int open (ACE_Addr *address) = 0;
+<p>&nbsp; virtual int close (void) = 0;
+<p>&nbsp; virtual int mtu (void) = 0;
+<br>&nbsp; virtual ACE_Addr *get_peer_addr (void) = 0;
+<br>&nbsp; virtual ACE_Addr *get_local_addr (void);
+<p>&nbsp; virtual ssize_t send (const ACE_Message_Block *mblk,
+<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
+ACE_Time_Value *s = 0) = 0;
+<p>&nbsp; /// Write the contents of the buffer of length len to the connection.
+<br>&nbsp; virtual ssize_t send (const char *buf,
+<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
+size_t len,
+<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
+ACE_Time_Value *s = 0) = 0;
+<p>&nbsp; /// Write the contents of iovcnt iovec's to the connection.
+<br>&nbsp; virtual ssize_t send (const iovec *iov,
+<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
+int iovcnt,
+<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
+ACE_Time_Value *s = 0) = 0;
+<p>&nbsp; /// Read len bytes from into buf.
+<br>&nbsp; virtual ssize_t recv (char *buf,
+<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
+size_t len,
+<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
+ACE_Time_Value *s = 0) = 0;
+<p>&nbsp; /// Read len bytes from into buf using flags.
+<br>&nbsp; virtual ssize_t recv (char *buf,
+<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
+size_t len,
+<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
+int flags,
+<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
+ACE_Time_Value *s = 0) = 0;
+<p>&nbsp; ///&nbsp; Read received data into the iovec buffers.
+<br>&nbsp; virtual ssize_t recv (iovec *iov,
+<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
+int iovcnt,
+<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
+ACE_Time_Value *s = 0) = 0;
+<p>};
+<br>&nbsp;
+<p>/**
+<br>&nbsp;* @class TAO_AV_Transport_Factory
+<br>&nbsp;* @brief
+<br>&nbsp;*/
+<br>class TAO_AV_Export TAO_AV_Transport_Factory : public ACE_Service_Object
+<br>{
+<br>public:
+<br>&nbsp; /// Initialization hook.
+<br>&nbsp; TAO_AV_Transport_Factory (void);
+<br>&nbsp; virtual ~TAO_AV_Transport_Factory (void);
+<br>&nbsp; virtual int init (int argc, char *argv[]);
+<br>&nbsp; virtual int match_protocol (const char *protocol_string);
+<br>&nbsp; virtual TAO_AV_Acceptor *make_acceptor (void);
+<br>&nbsp; virtual TAO_AV_Connector *make_connector (void);
+<br>};
+<br>&nbsp;
+<h4>
+<i>Flow handler :</i></h4>
+All the transport handlers derive from the&nbsp; TAO_AV_Flow_Handler which
+has methods to start and stop and provide flow specific functionality for
+timeout upcalls to the Callbacks.
+<p>The pluggable transport protocol implementation should inherit from
+the following abstract class declared in<a href="./Transport.h">
+&lt;orbsvcs/orbsvcs/AV/Transport.h>:</a>
+<p>/**
+<br>&nbsp;* @class TAO_AV_Flow_Handler
+<br>&nbsp;* @brief
+<br>&nbsp;*/
+<br>class TAO_AV_Export TAO_AV_Flow_Handler
+<br>{
+<br>public:
+<br>&nbsp; /// Constructor.
+<br>&nbsp; TAO_AV_Flow_Handler (void);
+<p>&nbsp; /// Start/stop the flow handler.
+<br>&nbsp; virtual int start (TAO_FlowSpec_Entry::Role role);
+<br>&nbsp; virtual int stop&nbsp; (TAO_FlowSpec_Entry::Role role);
+<p>&nbsp; /// Schedule timer. Uses the get_timeout method on the callback.
+<br>&nbsp; virtual int schedule_timer (void);
+<p>&nbsp; /// get the transport.
+<br>&nbsp; TAO_AV_Transport *transport (void);
+<p>&nbsp; /// set/get protocol_object.
+<br>&nbsp; TAO_AV_Protocol_Object* protocol_object (void);
+<br>&nbsp; void protocol_object (TAO_AV_Protocol_Object *protocol_object);
+<p>&nbsp; /// set the callback.
+<br>&nbsp; void callback (TAO_AV_Callback *callback);
+<p>&nbsp; /// Handle timeout. called from reactor.
+<br>&nbsp; int handle_timeout (const ACE_Time_Value &amp;tv, const void
+*arg = 0);
+<p>&nbsp; /// set the remote address.
+<br>&nbsp; virtual int set_remote_address (ACE_Addr *address);
+<p>&nbsp; /// get the underlying event handler. To be overridden by the
+derived clases.
+<br>&nbsp; virtual ACE_Event_Handler* event_handler (void) = 0;
+<p>&nbsp; virtual int change_qos (AVStreams::QoS);
+<p>protected:
+<br>&nbsp; TAO_AV_Transport *transport_;
+<br>&nbsp; TAO_AV_Callback *callback_;
+<br>&nbsp; TAO_AV_Protocol_Object *protocol_object_;
+<br>&nbsp; long timer_id_;
+<br>&nbsp; ACE_Reactor *reactor_;
+<br>&nbsp; void *timeout_arg_;
+<br>};
+<br>&nbsp;
+<h3>
+The Flow&nbsp;Protocol Components</h3>
+
+<h4>
+<i>Flow Protocol Factory:</i></h4>
+The&nbsp; flow protocol factory is an interface for creating flow protocol
+objects.
+<p>The pluggable flow protocol implementation should inherit from the following
+abstract class declared in <a href="./Protocol_Factory.h">&lt;orbsvcs/orbsvcs/AV/Protocol_Factory>:</a>
+<p>/**
+<br>&nbsp;* @class TAO_AV_Flow_Protocol_Factory
+<br>&nbsp;* @brief
+<br>&nbsp;*/
+<br>class TAO_AV_Export TAO_AV_Flow_Protocol_Factory : public ACE_Service_Object
+<br>{
+<br>public:
+<br>&nbsp; /// Initialization hook.
+<br>&nbsp; TAO_AV_Flow_Protocol_Factory (void);
+<br>&nbsp; virtual ~TAO_AV_Flow_Protocol_Factory (void);
+<br>&nbsp; virtual int init (int argc, char *argv[]);
+<br>&nbsp; virtual int match_protocol (const char *flow_string);
+<br>&nbsp; virtual TAO_AV_Protocol_Object* make_protocol_object (TAO_FlowSpec_Entry
+*entry,
+<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
+TAO_Base_StreamEndPoint *endpoint,
+<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
+TAO_AV_Flow_Handler *handler,
+<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
+TAO_AV_Transport *transport);
+<br>&nbsp; virtual const char *control_flow_factory (void);
+<br>};
+<br>&nbsp;
+<h4>
+<i>Protocol Object:</i></h4>
+This is a concrete implementation providing the flow protocol functionality.
+Applications use this interface to send frames and the Protocol_Object
+uses application specified&nbsp; Callback objects to deliver frames.
+<p>The pluggable flow protocol implementation should inherit from the following
+abstract class declared in <a href="./Protocol_Factory.h">&lt;orbsvcs/orbsvcs/AV/Protocol_Factory>:</a>
+<p>/**
+<br>&nbsp;* @class TAO_AV_Protocol_Object
+<br>&nbsp;* @brief
+<br>&nbsp;*/
+<br>class TAO_AV_Export TAO_AV_Protocol_Object
+<br>{
+<br>public:
+<br>&nbsp; TAO_AV_Protocol_Object (void);
+<p>&nbsp; /// constructor.
+<br>&nbsp; TAO_AV_Protocol_Object (TAO_AV_Callback *callback,
+<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
+TAO_AV_Transport *transport);
+<p>&nbsp; /// Destructor
+<br>&nbsp; virtual ~TAO_AV_Protocol_Object (void);
+<p>&nbsp; virtual int open (TAO_AV_Callback *callback,
+<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
+TAO_AV_Transport *transport);
+<p>&nbsp; virtual int handle_input (void) = 0;
+<p>&nbsp; /// Called on a control object.
+<br>&nbsp; virtual int handle_control_input (ACE_Message_Block *control_frame,
+<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
+const ACE_Addr &amp;peer_address);
+<p>&nbsp; /// set/get policies.
+<br>&nbsp; virtual int set_policies (const TAO_AV_PolicyList &amp;policy_list);
+<br>&nbsp; virtual TAO_AV_PolicyList get_policies (void);
+<p>&nbsp; /// start/stop the flow.
+<br>&nbsp; virtual int start (void);
+<br>&nbsp; virtual int stop (void);
+<p>&nbsp; /// send a data frame.
+<br>&nbsp; virtual int send_frame (ACE_Message_Block *frame,
+<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
+TAO_AV_frame_info *frame_info = 0) = 0;
+<p>&nbsp; /// send a frame in iovecs.
+<br>&nbsp; virtual int send_frame (const iovec *iov,
+<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
+int iovcnt,
+<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
+TAO_AV_frame_info *frame_info = 0) = 0;
+<p>&nbsp; virtual int send_frame (const char *buf,
+<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
+size_t len) = 0;
+<p>&nbsp; /// end the stream.
+<br>&nbsp; virtual void control_object (TAO_AV_Protocol_Object *object);
+<br>&nbsp; virtual int destroy (void) = 0;
+<br>&nbsp; TAO_AV_Transport *transport (void);
+<br>protected:
+<br>&nbsp; TAO_AV_Transport *transport_;
+<br>&nbsp; TAO_AV_PolicyList policy_list_;
+<br>&nbsp; TAO_AV_Callback *callback_;
+<br>};
+<p>For an example of how all the above components are implemented refer
+to the implementation of the UDP transport <a href="./UDP.h">&lt;orbsvcs/orbsvcs/AV/UDP.h>&nbsp;</a>
+and&nbsp;<a href="./UDP.cpp">&lt;orbsvcs/orbsvcs/AV/UDP.cpp></a>
+<p>
+<hr WIDTH="100%">
+<h3>
+Using a Pluggable Protocol</h3>
+Once the TAO&nbsp;AV&nbsp;pluggable transport and flow protocols are implemented
+they can be loaded into the AV&nbsp;Streams framework by adding their entries
+to the Service Configurator file (eg. svc.conf) for that protocol:
+<p>A typical svc.conf will look like this:
+<p>dynamic TAO_AV_Resource_Factory Service_Object * TAO_AV:_make_TAO_AV_Resource_Factory()
+""
+<br>dynamic ATM_Factory Service_Object * TAO_AV:_make_TAO_AV_ATM_Factory()
+""
+<br>static TAO_AV_Resource_Factory "-AVTransportFactory ATM_Factory"
+<br>dynamic SFP_Factory Service_Object * TAO_AV:_make_TAO_AV_SFP_Factory()
+""
+<br>static TAO_AV_Resource_Factory "-AVFlowProtocolFactory SFP_Factory"
+<p>The TAO_AV_Resource_Factory is a the default resource factory that helps
+to load the different transport and flow protocols to the corresponding
+factory sets.
+<p><b><i>NOTE: The TAO_AV_Resource_Factory must be loaded in order to load
+the pluggable protocols, ie. the first statement shown above is mandatory
+to load the protocols.</i></b><b><i></i></b>
+<p>The above entries show how to add a transport factory eg. ATM&nbsp;Factory
+and a flow protocol factory eg. SFP&nbsp;Factory. The -AVTransportFactory
+option causes the specified transport protocol factory to be loaded into
+the AV Core and the -AVFlowProtocolFactory option causes the specified
+flow protocol factory to be loaded into the AV&nbsp;Core.
+</body>
+</html>
diff --git a/TAO/orbsvcs/orbsvcs/AV/AV_export.h b/TAO/orbsvcs/orbsvcs/AV/AV_export.h
new file mode 100644
index 00000000000..bfabf3dcde8
--- /dev/null
+++ b/TAO/orbsvcs/orbsvcs/AV/AV_export.h
@@ -0,0 +1,40 @@
+
+// -*- C++ -*-
+// $Id$
+// Definition for Win32 Export directives.
+// This file is generated automatically by generate_export_file.pl
+// ------------------------------
+#ifndef TAO_AV_EXPORT_H
+#define TAO_AV_EXPORT_H
+
+#include "ace/config-all.h"
+
+#if defined (TAO_AS_STATIC_LIBS)
+# if !defined (TAO_AV_HAS_DLL)
+# define TAO_AV_HAS_DLL 0
+# endif /* ! TAO_AV_HAS_DLL */
+#else
+# if !defined (TAO_AV_HAS_DLL)
+# define TAO_AV_HAS_DLL 1
+# endif /* ! TAO_AV_HAS_DLL */
+#endif
+
+#if defined (TAO_AV_HAS_DLL) && (TAO_AV_HAS_DLL == 1)
+# if defined (TAO_AV_BUILD_DLL)
+# define TAO_AV_Export ACE_Proper_Export_Flag
+# define TAO_AV_SINGLETON_DECLARATION(T) ACE_EXPORT_SINGLETON_DECLARATION (T)
+# define TAO_AV_SINGLETON_DECLARE(SINGLETON_TYPE, CLASS, LOCK) ACE_EXPORT_SINGLETON_DECLARE(SINGLETON_TYPE, CLASS, LOCK)
+# else /* TAO_AV_BUILD_DLL */
+# define TAO_AV_Export ACE_Proper_Import_Flag
+# define TAO_AV_SINGLETON_DECLARATION(T) ACE_IMPORT_SINGLETON_DECLARATION (T)
+# define TAO_AV_SINGLETON_DECLARE(SINGLETON_TYPE, CLASS, LOCK) ACE_IMPORT_SINGLETON_DECLARE(SINGLETON_TYPE, CLASS, LOCK)
+# endif /* TAO_AV_BUILD_DLL */
+#else /* TAO_AV_HAS_DLL == 1 */
+# define TAO_AV_Export
+# define TAO_AV_SINGLETON_DECLARATION(T)
+# define TAO_AV_SINGLETON_DECLARE(SINGLETON_TYPE, CLASS, LOCK)
+#endif /* TAO_AV_HAS_DLL == 1 */
+
+#endif /* TAO_AV_EXPORT_H */
+
+// End of auto generated file.
diff --git a/TAO/orbsvcs/orbsvcs/AV/Endpoint_Strategy.cpp b/TAO/orbsvcs/orbsvcs/AV/Endpoint_Strategy.cpp
new file mode 100644
index 00000000000..4d15bdd853a
--- /dev/null
+++ b/TAO/orbsvcs/orbsvcs/AV/Endpoint_Strategy.cpp
@@ -0,0 +1,435 @@
+// $Id$
+
+// ============================================================================
+//
+// = LIBRARY
+// cos
+//
+// = FILENAME
+// Endpoint_Strategy.cpp
+//
+// = AUTHOR
+// Sumedh Mungee <sumedh@cs.wustl.edu>
+//
+//
+// ============================================================================
+
+#include "orbsvcs/AV/Endpoint_Strategy.h"
+
+#include "tao/debug.h"
+#include "tao/ORB_Core.h"
+
+#include "ace/Process_Semaphore.h"
+
+ACE_RCSID(AV, Endpoint_Strategy, "$Id$")
+
+TAO_BEGIN_VERSIONED_NAMESPACE_DECL
+
+// ----------------------------------------------------------------------
+// TAO_AV_Endpoint_Strategy
+// ----------------------------------------------------------------------
+
+// Constructor
+TAO_AV_Endpoint_Strategy::TAO_AV_Endpoint_Strategy (void)
+{
+}
+
+// Destructor.
+TAO_AV_Endpoint_Strategy::~TAO_AV_Endpoint_Strategy (void)
+{
+
+}
+
+// The base class defines the "failure" case, so that unless the
+// subclasses override this, the call will fail. This is done so that
+// subclasses need only define the calls that they want to support,
+// and the remaining calls will fail automagically
+int
+TAO_AV_Endpoint_Strategy::create_A (AVStreams::StreamEndPoint_A_ptr & /* stream_endpoint */,
+ AVStreams::VDev_ptr & /* vdev */
+ ACE_ENV_ARG_DECL_NOT_USED)
+{
+ ACE_ERROR_RETURN ((LM_ERROR,
+ "(%P|%t) Error creating A endpoint\n"),
+ -1);
+}
+
+// The base class defines the "failure" case, so that unless the
+// subclasses override this, the call will fail. This is done so that
+// subclasses need only define the calls that they want to support,
+// and the remaining calls will fail automagically
+int
+TAO_AV_Endpoint_Strategy::create_B (AVStreams::StreamEndPoint_B_ptr & /* stream_endpoint */,
+ AVStreams::VDev_ptr & /*vdev */
+ ACE_ENV_ARG_DECL_NOT_USED)
+{
+ ACE_ERROR_RETURN ((LM_ERROR,
+ "(%P|%t) Error creating B endpoint\n"),
+ -1);
+}
+
+
+// ----------------------------------------------------------------------
+// TAO_AV_Endpoint_Process_Strategy
+// ----------------------------------------------------------------------
+
+// Constructor
+TAO_AV_Endpoint_Process_Strategy::TAO_AV_Endpoint_Process_Strategy (ACE_Process_Options *process_options)
+ : process_options_ (process_options),
+ pid_ (-1)
+{
+ ACE_OS::hostname (this->host_,
+ sizeof this->host_);
+}
+
+// Destructor.
+TAO_AV_Endpoint_Process_Strategy::~TAO_AV_Endpoint_Process_Strategy (void)
+{
+}
+
+// Spawns the process, and waits for it to finish booting.
+// Then uses bind_to_naming_service, get_stream_endpoint, and get_vdev
+// to get the object references to the various objects created in the
+// child
+int
+TAO_AV_Endpoint_Process_Strategy::activate (void)
+{
+ ACE_Process process;
+
+ // Create a new process to contain this endpoint
+ this->pid_ = process.spawn (*this->process_options_);
+
+ // Process creation failed
+ if (this->pid_ == -1)
+ ACE_ERROR_RETURN ((LM_ERROR,
+ "(%P|%t) ACE_Process:: spawn failed: %p\n",
+ "spawn"),
+ -1);
+
+ // Create a unique semaphore name, using my hostname, and pid.
+ char sem_str [BUFSIZ];
+
+ // create a unique semaphore name
+ ACE_OS::sprintf (sem_str,
+ "%s:%s:%ld",
+ "TAO_AV_Process_Semaphore",
+ this->host_,
+ static_cast<long int> (this->pid_));
+
+ ACE_DEBUG ((LM_DEBUG,
+ "(%P|%t) semaphore is %s\n",
+ sem_str));
+ // Create the semaphore
+ ACE_Process_Semaphore semaphore (0, // 0 means that the
+ // semaphore is locked initially
+ sem_str);
+
+ // wait until the child finishes booting
+ while (1)
+ {
+ if (semaphore.acquire () == -1)
+ {
+ // See if my child process is still alive -- if not, return an error
+ if (ACE_OS::kill (this->pid_,
+ 0) == -1)
+ ACE_ERROR_RETURN ((LM_ERROR,
+ "(%P|%t) Process_Strategy: Process being waited on died unexpectedly.\n"),
+ -1);
+ // if we were not interrupted due to a EINTR, break
+ if (errno != EINTR)
+ break;
+ }
+ else
+ break;
+ }
+
+ // The job of the semaphore is done, remove it.
+ if (semaphore.remove () == -1)
+ ACE_ERROR_RETURN ((LM_ERROR,
+ "(%P|%t) semaphore remove failed: %p\n",
+ "remove"),
+ -1);
+
+ ACE_DECLARE_NEW_CORBA_ENV;
+ ACE_TRY
+ {
+ // Get ourselves a Naming service
+ this->bind_to_naming_service (ACE_ENV_SINGLE_ARG_PARAMETER);
+ ACE_TRY_CHECK;
+
+ // Get the stream endpoint created by the child from the naming service
+ this->get_stream_endpoint (ACE_ENV_SINGLE_ARG_PARAMETER);
+ ACE_TRY_CHECK;
+
+ // Get the Vdev created by the child from the naming service
+ this->get_vdev (ACE_ENV_SINGLE_ARG_PARAMETER);
+ ACE_TRY_CHECK;
+ }
+ ACE_CATCHANY
+ {
+ ACE_PRINT_EXCEPTION (ACE_ANY_EXCEPTION,"TAO_AV_Endpoint_Process_Strategy::activate");
+ return -1;
+ }
+ ACE_ENDTRY;
+ ACE_CHECK_RETURN (-1);
+ return 0;
+}
+
+// Get ourselves a Naming service reference
+int
+TAO_AV_Endpoint_Process_Strategy::bind_to_naming_service (ACE_ENV_SINGLE_ARG_DECL)
+{
+ ACE_TRY
+ {
+ if (CORBA::is_nil (this->naming_context_.in ()) == 0)
+ return 0;
+
+ CORBA::Object_var naming_obj =
+ TAO_ORB_Core_instance ()->orb ()->resolve_initial_references ("NameService" ACE_ENV_ARG_PARAMETER);
+ ACE_TRY_CHECK;
+
+ if (CORBA::is_nil (naming_obj.in ()))
+ ACE_ERROR_RETURN ((LM_ERROR,
+ " (%P|%t) Unable to resolve the Name Service.\n"),
+ -1);
+ this->naming_context_ =
+ CosNaming::NamingContext::_narrow (naming_obj.in ()
+ ACE_ENV_ARG_PARAMETER);
+ ACE_TRY_CHECK;
+ }
+ ACE_CATCHANY
+ {
+ ACE_PRINT_EXCEPTION (ACE_ANY_EXCEPTION,"TAO_AV_Endpoint_Process_Strategy::bind_to_naming_service");
+ return -1;
+ }
+ ACE_ENDTRY;
+ ACE_CHECK_RETURN (-1);
+ return 0;
+}
+
+// Get the VDev created in the child process from the namingservice
+int
+TAO_AV_Endpoint_Process_Strategy::get_vdev (ACE_ENV_SINGLE_ARG_DECL)
+{
+ ACE_TRY
+ {
+ char vdev_name [BUFSIZ];
+ ACE_OS::sprintf (vdev_name,
+ "%s:%s:%ld",
+ "VDev",
+ this->host_,
+ (long) this->pid_);
+
+ if (TAO_debug_level > 0) ACE_DEBUG ((LM_DEBUG,"(%P|%t)%s\n",vdev_name));
+
+ // Create the name
+ CosNaming::Name VDev_Name (1);
+ VDev_Name.length (1);
+ VDev_Name [0].id = CORBA::string_dup (vdev_name);
+
+ // Get the CORBA::Object
+ CORBA::Object_var vdev =
+ this->naming_context_->resolve (VDev_Name
+ ACE_ENV_ARG_PARAMETER);
+ ACE_TRY_CHECK;
+
+ // Narrow it
+ this->vdev_ =
+ AVStreams::VDev::_narrow (vdev.in ()
+ ACE_ENV_ARG_PARAMETER);
+ ACE_TRY_CHECK;
+
+ // Check if valid
+ if (CORBA::is_nil (this->vdev_.in() ))
+ ACE_ERROR_RETURN ((LM_ERROR,
+ " could not resolve Stream_Endpoint_B in Naming service <%s>\n"),
+ -1);
+ }
+ ACE_CATCHANY
+ {
+ ACE_PRINT_EXCEPTION (ACE_ANY_EXCEPTION,"TAO_AV_Endpoint_Process_Strategy::get_vdev");
+ return -1;
+ }
+ ACE_ENDTRY;
+ ACE_CHECK_RETURN (-1);
+ return 0;
+}
+
+// ----------------------------------------------------------------------
+// TAO_AV_Endpoint_Process_Strategy_A
+// ----------------------------------------------------------------------
+
+// Constructor
+TAO_AV_Endpoint_Process_Strategy_A::TAO_AV_Endpoint_Process_Strategy_A (ACE_Process_Options *process_options)
+ : TAO_AV_Endpoint_Process_Strategy (process_options)
+{
+}
+
+// Destructor
+TAO_AV_Endpoint_Process_Strategy_A::~TAO_AV_Endpoint_Process_Strategy_A (void)
+{
+}
+
+// the "A" type endpoint creator
+int
+TAO_AV_Endpoint_Process_Strategy_A::create_A (AVStreams::StreamEndPoint_A_ptr &stream_endpoint,
+ AVStreams::VDev_ptr &vdev
+ ACE_ENV_ARG_DECL_NOT_USED)
+{
+ // use the baseclass activate
+ if (this->activate () == -1)
+ ACE_ERROR_RETURN ((LM_ERROR,
+ "(%P|%t) TAO_AV_Endpoint_Process_Strategy: Error in activate ()\n"),
+ -1);
+
+ // return the object references
+ stream_endpoint = AVStreams::StreamEndPoint_A::_duplicate( this->stream_endpoint_a_.in() );
+ vdev = AVStreams::VDev::_duplicate( this->vdev_.in() );
+ return 0;
+
+}
+
+// Gets the stream endpoint object reference from the naming service
+int
+TAO_AV_Endpoint_Process_Strategy_A::get_stream_endpoint (ACE_ENV_SINGLE_ARG_DECL)
+{
+ ACE_TRY
+ {
+ char stream_endpoint_name[BUFSIZ];
+ ACE_OS::sprintf (stream_endpoint_name,
+ "%s:%s:%ld",
+ "Stream_Endpoint_A",
+ this->host_,
+ (long) this->pid_);
+
+ if (TAO_debug_level > 0) ACE_DEBUG ((LM_DEBUG,"(%P|%t)%s\n",stream_endpoint_name));
+
+ // Create the name
+ CosNaming::Name Stream_Endpoint_A_Name (1);
+
+ Stream_Endpoint_A_Name.length (1);
+ Stream_Endpoint_A_Name [0].id = CORBA::string_dup (stream_endpoint_name);
+
+ // Get the CORBA::Object
+ CORBA::Object_var stream_endpoint_a =
+ this->naming_context_->resolve (Stream_Endpoint_A_Name
+ ACE_ENV_ARG_PARAMETER);
+ ACE_TRY_CHECK;
+
+ // Narrow the reference
+ this->stream_endpoint_a_ =
+ AVStreams::StreamEndPoint_A::_narrow (stream_endpoint_a.in ()
+ ACE_ENV_ARG_PARAMETER);
+ ACE_TRY_CHECK;
+
+ // Check for validity
+ if (CORBA::is_nil (this->stream_endpoint_a_.in() ))
+ ACE_ERROR_RETURN ((LM_ERROR,
+ " could not resolve Stream_Endpoint_A in Naming service <%s>\n"),
+ -1);
+ }
+ ACE_CATCHANY
+ {
+ ACE_PRINT_EXCEPTION (ACE_ANY_EXCEPTION,"TAO_AV_Endpoint_Process_Strategy_A::get_stream_endpoint");
+ return -1;
+ }
+ ACE_ENDTRY;
+ ACE_CHECK_RETURN (-1);
+ return 0;
+}
+
+// ----------------------------------------------------------------------
+// TAO_AV_Endpoint_Process_Strategy_B
+// ----------------------------------------------------------------------
+
+// Constructor
+TAO_AV_Endpoint_Process_Strategy_B::TAO_AV_Endpoint_Process_Strategy_B (ACE_Process_Options *process_options)
+ : TAO_AV_Endpoint_Process_Strategy (process_options)
+{
+}
+
+// Destructor
+TAO_AV_Endpoint_Process_Strategy_B::~TAO_AV_Endpoint_Process_Strategy_B (void)
+{
+}
+
+// Creates and returns a "B" type endpoint
+int
+TAO_AV_Endpoint_Process_Strategy_B::create_B (AVStreams::StreamEndPoint_B_ptr &stream_endpoint,
+ AVStreams::VDev_ptr &vdev
+ ACE_ENV_ARG_DECL)
+{
+ ACE_TRY
+ {
+ if (this->activate () == -1)
+ ACE_ERROR_RETURN ((LM_ERROR,
+ "(%P|%t) TAO_AV_Endpoint_Process_Strategy: Error in activate ()\n"),
+ -1);
+
+ if (TAO_debug_level > 0) ACE_DEBUG ((LM_DEBUG,"(%P|%t)TAO_AV_Endpoint_Process_Strategy_B::create_B ()\n: stream_endpoint is:%s\n",
+ TAO_ORB_Core_instance ()->orb ()->object_to_string (this->stream_endpoint_b_.in()
+ ACE_ENV_ARG_PARAMETER)));
+ ACE_TRY_CHECK;
+ stream_endpoint = AVStreams::StreamEndPoint_B::_duplicate ( this->stream_endpoint_b_.in() );
+ vdev = AVStreams::VDev::_duplicate( this->vdev_.in() );
+ }
+ ACE_CATCHANY
+ {
+ ACE_PRINT_EXCEPTION (ACE_ANY_EXCEPTION,"TAO_AV_Endpoint_Process_Strategy_B::create_B\n");
+ return -1;
+ }
+ ACE_ENDTRY;
+ ACE_CHECK_RETURN (-1);
+ return 0;
+}
+
+// Gets the B type stream_endpoint from the Naming service
+int
+TAO_AV_Endpoint_Process_Strategy_B::get_stream_endpoint (ACE_ENV_SINGLE_ARG_DECL)
+{
+ ACE_TRY
+ {
+ char stream_endpoint_name[BUFSIZ];
+ ACE_OS::sprintf (stream_endpoint_name,
+ "%s:%s:%ld",
+ "Stream_Endpoint_B",
+ this->host_,
+ (long) this->pid_);
+
+ if (TAO_debug_level > 0) ACE_DEBUG ((LM_DEBUG,"(%P|%t)%s\n",stream_endpoint_name));
+
+ // Create the name
+ CosNaming::Name Stream_Endpoint_B_Name (1);
+
+ Stream_Endpoint_B_Name.length (1);
+ Stream_Endpoint_B_Name [0].id = CORBA::string_dup (stream_endpoint_name);
+
+ // Get the CORBA::Object reference
+ CORBA::Object_var stream_endpoint_b =
+ this->naming_context_->resolve (Stream_Endpoint_B_Name
+ ACE_ENV_ARG_PARAMETER);
+ ACE_TRY_CHECK;
+
+ // Narrow the reference
+ this->stream_endpoint_b_ =
+ AVStreams::StreamEndPoint_B::_narrow (stream_endpoint_b.in ()
+ ACE_ENV_ARG_PARAMETER);
+ ACE_TRY_CHECK;
+
+ // Check for validity
+ if (CORBA::is_nil (this->stream_endpoint_b_.in() ))
+ ACE_ERROR_RETURN ((LM_ERROR,
+ " could not resolve Stream_Endpoint_B in Naming service <%s>\n"),
+ -1);
+ }
+ ACE_CATCHANY
+ {
+ ACE_PRINT_EXCEPTION (ACE_ANY_EXCEPTION,"TAO_AV_Endpoint_Process_Strategy_B::get_stream_endpoint");
+ return -1;
+ }
+ ACE_ENDTRY;
+ ACE_CHECK_RETURN (-1);
+ return 0;
+}
+
+TAO_END_VERSIONED_NAMESPACE_DECL
diff --git a/TAO/orbsvcs/orbsvcs/AV/Endpoint_Strategy.h b/TAO/orbsvcs/orbsvcs/AV/Endpoint_Strategy.h
new file mode 100644
index 00000000000..2cc9158853b
--- /dev/null
+++ b/TAO/orbsvcs/orbsvcs/AV/Endpoint_Strategy.h
@@ -0,0 +1,190 @@
+// -*- C++ -*-
+
+//=============================================================================
+/**
+ * @file Endpoint_Strategy.h
+ *
+ * $Id$
+ *
+ * @author Sumedh Mungee <sumedh@cs.wustl.edu>
+ */
+//=============================================================================
+
+
+#ifndef TAO_AV_ENDPOINT_STRATEGY_H
+#define TAO_AV_ENDPOINT_STRATEGY_H
+#include /**/ "ace/pre.h"
+
+#include "orbsvcs/AV/AVStreams_i.h"
+#include "ace/os_include/os_netdb.h"
+
+// This is to remove "inherits via dominance" warnings from MSVC.
+// MSVC is being a little too paranoid.
+#if defined (_MSC_VER)
+# pragma warning(push)
+# pragma warning (disable : 4250)
+#endif /* _MSC_VER */
+
+ACE_BEGIN_VERSIONED_NAMESPACE_DECL
+class ACE_Process_Options;
+ACE_END_VERSIONED_NAMESPACE_DECL
+
+TAO_BEGIN_VERSIONED_NAMESPACE_DECL
+
+/**
+ * @class TAO_AV_Endpoint_Strategy
+ *
+ * Base class to define various endpoint strategies
+ * used by the MMDevice to create the Endpoint and Vdev
+ */
+class TAO_AV_Export TAO_AV_Endpoint_Strategy
+{
+
+public:
+ /// Constructor
+ TAO_AV_Endpoint_Strategy (void);
+
+ /// Destructor
+ virtual ~TAO_AV_Endpoint_Strategy (void);
+
+ /// Called by the MMDevice, when it needs to create an A type endpoint
+ virtual int create_A (AVStreams::StreamEndPoint_A_ptr &stream_endpoint,
+ AVStreams::VDev_ptr &vdev
+ ACE_ENV_ARG_DECL);
+
+ /// Called by the MMDevice, when it needs to create an B type endpoint
+ virtual int create_B (AVStreams::StreamEndPoint_B_ptr &stream_endpoint,
+ AVStreams::VDev_ptr &vdev
+ ACE_ENV_ARG_DECL);
+
+protected:
+ /// The "A" stream endpoint
+ AVStreams::StreamEndPoint_A_var stream_endpoint_a_;
+
+ /// The "B" stream endpoint
+ AVStreams::StreamEndPoint_B_var stream_endpoint_b_;
+
+ /// The vdev
+ AVStreams::VDev_var vdev_;
+
+};
+
+// ----------------------------------------------------------------------
+/**
+ * @class TAO_AV_Endpoint_Process_Strategy
+ * @brief Process-based strategy for creating endpoints.
+ * Abstract base class.
+ */
+class TAO_AV_Export TAO_AV_Endpoint_Process_Strategy
+ : public TAO_AV_Endpoint_Strategy
+{
+
+public:
+ /// Constructor. The process_options contain the name and arguments
+ /// for the process to be created
+ TAO_AV_Endpoint_Process_Strategy (ACE_Process_Options *process_options);
+
+ /// Destructor.
+ virtual ~TAO_AV_Endpoint_Process_Strategy (void);
+
+ /// creates a new child process, and waits on a semaphore
+ /// until the child process has finished creating the endpoints
+ virtual int activate (void);
+
+protected:
+ /// Bind to the naming service
+ virtual int bind_to_naming_service (ACE_ENV_SINGLE_ARG_DECL);
+
+ /**
+ * Get the object reference for the newly created stream
+ * endpoint (which will be in the child process)
+ * Subclasses will define the functionality for this
+ */
+ virtual int get_stream_endpoint (ACE_ENV_SINGLE_ARG_DECL) = 0;
+
+ /// Get the Vdev object reference for the newly created
+ /// endpoint
+ virtual int get_vdev (ACE_ENV_SINGLE_ARG_DECL);
+
+ /// Naming context
+ CosNaming::NamingContext_var naming_context_;
+
+ /// Name and arguments for the process to be created
+ ACE_Process_Options *process_options_;
+
+ /// name of this host used for resolving unique names.
+ char host_[MAXHOSTNAMELEN];
+
+ /// My child's process id.
+ pid_t pid_;
+};
+
+
+// ----------------------------------------------------------------------
+
+/**
+ * @class TAO_AV_Endpoint_Process_Strategy_A
+ * @brief Process-based strategy to create "A" type endpoints
+ */
+class TAO_AV_Export TAO_AV_Endpoint_Process_Strategy_A
+ : public TAO_AV_Endpoint_Process_Strategy
+{
+
+public:
+ /// Constructor
+ TAO_AV_Endpoint_Process_Strategy_A (ACE_Process_Options *process_options);
+
+ /// Destructor.
+ virtual ~TAO_AV_Endpoint_Process_Strategy_A (void);
+
+protected:
+ /// Creates an "A" type stream endpoint, and a vdev
+ virtual int create_A (AVStreams::StreamEndPoint_A_ptr &stream_endpoint,
+ AVStreams::VDev_ptr &vdev
+ ACE_ENV_ARG_DECL);
+
+ /// Gets the "A" type stream endpoint from the child process
+ virtual int get_stream_endpoint (ACE_ENV_SINGLE_ARG_DECL);
+
+};
+
+// ----------------------------------------------------------------------
+
+/**
+ * @class TAO_AV_Endpoint_Process_Strategy_B
+ * @brief Process-based strategy to create "B" type endpoints
+ */
+class TAO_AV_Export TAO_AV_Endpoint_Process_Strategy_B
+ : public TAO_AV_Endpoint_Process_Strategy
+{
+
+public:
+ /// Constructor
+ TAO_AV_Endpoint_Process_Strategy_B (ACE_Process_Options *process_options);
+
+ /// Destructor.
+ virtual ~TAO_AV_Endpoint_Process_Strategy_B (void);
+
+protected:
+ /// Creates a "B" type stream endpoint, and a vdev
+ virtual int create_B (AVStreams::StreamEndPoint_B_ptr &stream_endpoint,
+ AVStreams::VDev_ptr &vdev
+ ACE_ENV_ARG_DECL);
+
+
+ /// Gets the object reference of the "B" type streamendpoint.
+ virtual int get_stream_endpoint (ACE_ENV_SINGLE_ARG_DECL);
+
+};
+
+TAO_END_VERSIONED_NAMESPACE_DECL
+
+// Include the templates here.
+#include "orbsvcs/AV/Endpoint_Strategy_T.h"
+
+#if defined(_MSC_VER)
+#pragma warning(pop)
+#endif /* _MSC_VER */
+
+#include /**/ "ace/post.h"
+#endif /* TAO_AV_ENDPOINT_STRATEGY_H */
diff --git a/TAO/orbsvcs/orbsvcs/AV/Endpoint_Strategy_T.cpp b/TAO/orbsvcs/orbsvcs/AV/Endpoint_Strategy_T.cpp
new file mode 100644
index 00000000000..b52287ef621
--- /dev/null
+++ b/TAO/orbsvcs/orbsvcs/AV/Endpoint_Strategy_T.cpp
@@ -0,0 +1,837 @@
+// $Id$
+
+#ifndef TAO_AV_ENDPOINT_STRATEGY_T_CPP
+#define TAO_AV_ENDPOINT_STRATEGY_T_CPP
+
+#include "orbsvcs/AV/Endpoint_Strategy_T.h"
+
+#include "tao/debug.h"
+
+#include "ace/Process_Semaphore.h"
+#include "ace/OS_NS_unistd.h"
+
+
+TAO_BEGIN_VERSIONED_NAMESPACE_DECL
+
+// ----------------------------------------------------------------------
+// TAO_AV_Endpoint_Reactive_Strategy
+// ----------------------------------------------------------------------
+
+template <class T_StreamEndpoint, class T_VDev , class T_MediaCtrl>
+TAO_AV_Endpoint_Reactive_Strategy <T_StreamEndpoint, T_VDev, T_MediaCtrl>::TAO_AV_Endpoint_Reactive_Strategy (void)
+ : stream_endpoint_a_servant_(0), stream_endpoint_b_servant_(0), vdev_servant_(0),
+ media_ctrl_servant_(0)
+{
+}
+
+template <class T_StreamEndpoint, class T_VDev, class T_MediaCtrl>
+TAO_AV_Endpoint_Reactive_Strategy <T_StreamEndpoint, T_VDev, T_MediaCtrl>::~TAO_AV_Endpoint_Reactive_Strategy (void)
+{
+ // Do not allow exceptions to escape from the destructor
+ ACE_DECLARE_NEW_CORBA_ENV;
+ ACE_TRY
+ {
+ if(this->stream_endpoint_a_servant_ )
+ {
+ stream_endpoint_a_servant_->_remove_ref (
+ ACE_ENV_SINGLE_ARG_PARAMETER);
+ ACE_TRY_CHECK;
+ }
+
+ if(this->stream_endpoint_b_servant_)
+ {
+ stream_endpoint_b_servant_->_remove_ref (
+ ACE_ENV_SINGLE_ARG_PARAMETER);
+ ACE_TRY_CHECK;
+ }
+
+ if(this->vdev_servant_)
+ {
+ vdev_servant_->_remove_ref (
+ ACE_ENV_SINGLE_ARG_PARAMETER);
+ ACE_TRY_CHECK;
+ }
+
+ if(this->media_ctrl_servant_)
+ {
+ media_ctrl_servant_->_remove_ref (
+ ACE_ENV_SINGLE_ARG_PARAMETER);
+ ACE_TRY_CHECK;
+ }
+ }
+ ACE_CATCHANY
+ {
+ }
+# if defined (ACE_HAS_EXCEPTIONS) \
+ && defined (ACE_HAS_BROKEN_UNEXPECTED_EXCEPTIONS)
+ ACE_CATCHALL
+ {
+ }
+# endif /* ACE_HAS_EXCEPTIONS && ACE_HAS_BROKEN_UNEXPECTED_EXCEPTIONS */
+ ACE_ENDTRY;
+
+}
+
+// Create, activate the objects with the POA
+template <class T_StreamEndpoint, class T_VDev , class T_MediaCtrl>
+int
+TAO_AV_Endpoint_Reactive_Strategy <T_StreamEndpoint, T_VDev, T_MediaCtrl>::activate (void)
+{
+ ACE_DECLARE_NEW_CORBA_ENV;
+ ACE_TRY
+ {
+ this->activate_stream_endpoint (ACE_ENV_SINGLE_ARG_PARAMETER);
+ ACE_TRY_CHECK;
+ if (TAO_debug_level > 0) ACE_DEBUG ((LM_DEBUG,"(%P|%t)TAO_AV_Endpoint_Reactive_Strategy::activated stream_endpoint\n"));
+
+ this->activate_vdev (ACE_ENV_SINGLE_ARG_PARAMETER);
+ ACE_TRY_CHECK;
+ if (TAO_debug_level > 0) ACE_DEBUG ((LM_DEBUG,"(%P|%t)TAO_AV_Endpoint_Reactive_Strategy::activated vdev\n"));
+
+ this->activate_mediactrl (ACE_ENV_SINGLE_ARG_PARAMETER);
+ ACE_TRY_CHECK;
+ if (TAO_debug_level > 0) ACE_DEBUG ((LM_DEBUG,"(%P|%t)TAO_AV_Endpoint_Reactive_Strategy::activated mediactrl\n"));
+ }
+ ACE_CATCHANY
+ {
+ ACE_PRINT_EXCEPTION (ACE_ANY_EXCEPTION,"TAO_Endpoint_Reactive_Strategy::activate");
+ return -1;
+ }
+ ACE_ENDTRY;
+ ACE_CHECK_RETURN (-1);
+ return 0;
+}
+
+template <class T_StreamEndpoint, class T_VDev , class T_MediaCtrl>
+char *
+TAO_AV_Endpoint_Reactive_Strategy <T_StreamEndpoint, T_VDev, T_MediaCtrl>::activate_with_poa (PortableServer::Servant servant ACE_ENV_ARG_DECL)
+{
+
+ PortableServer::ObjectId_var id =
+ this->poa_->activate_object (servant
+ ACE_ENV_ARG_PARAMETER);
+ ACE_CHECK_RETURN (0);
+
+ CORBA::Object_var obj =
+ this->poa_->id_to_reference (id.in ()
+ ACE_ENV_ARG_PARAMETER);
+ ACE_CHECK_RETURN (0);
+
+ CORBA::String_var str =
+ this->orb_->object_to_string (obj.in ()
+ ACE_ENV_ARG_PARAMETER);
+ ACE_CHECK_RETURN (0);
+
+ return str._retn ();
+}
+
+
+// Activate VDev into the POA
+template <class T_StreamEndpoint, class T_VDev , class T_MediaCtrl>
+int
+TAO_AV_Endpoint_Reactive_Strategy <T_StreamEndpoint, T_VDev, T_MediaCtrl>::activate_vdev (ACE_ENV_SINGLE_ARG_DECL)
+{
+ ACE_TRY
+ {
+ // Bridge pattern. Allow subclasses to override this behavior
+ T_VDev *vdev = 0;
+ if (this->make_vdev (vdev) == -1)
+ return -1;
+
+ // Activate the object under the root poa.
+// CORBA::String_var vdev_ior = this->activate_with_poa (vdev,
+// ACE_ENV_ARG_PARAMETER);
+// ACE_TRY_CHECK;
+// if (TAO_debug_level > 0) ACE_DEBUG ((LM_DEBUG,"(%P|%t)TAO_AV_Endpoint_Reactive_Strategy::activate_vdev, vdev ior is:%s\n",
+// vdev_ior. in ()));
+
+ // Save the object reference, so that create_A can return it
+ this->vdev_ = vdev->_this (ACE_ENV_SINGLE_ARG_PARAMETER);
+ ACE_TRY_CHECK;
+ }
+ ACE_CATCHANY
+ {
+ ACE_PRINT_EXCEPTION (ACE_ANY_EXCEPTION,"TAO_AV_Endpoint_Reactive_Strategy::activate_vdev");
+ return -1;
+ }
+ ACE_ENDTRY;
+ ACE_CHECK_RETURN (-1);
+ return 0;
+}
+
+
+// Activate the media_controller
+template <class T_StreamEndpoint, class T_VDev , class T_MediaCtrl>
+int
+TAO_AV_Endpoint_Reactive_Strategy <T_StreamEndpoint, T_VDev, T_MediaCtrl>::activate_mediactrl (ACE_ENV_SINGLE_ARG_DECL)
+{
+ ACE_TRY
+ {
+ // Bridge pattern. Subclasses can override this
+ if (this->make_mediactrl ( media_ctrl_servant_ ) == -1)
+ return -1;
+
+ // Associate the media controller object reference with the vdev, as per the OMG spec
+ CORBA::Any anyval;
+ media_ctrl_obj_
+ = media_ctrl_servant_->_this (ACE_ENV_SINGLE_ARG_PARAMETER);
+ ACE_TRY_CHECK;
+
+ anyval <<= media_ctrl_obj_.in();
+
+ ACE_TRY_CHECK;
+
+ this->vdev_->define_property ("Related_MediaCtrl",
+ anyval
+ ACE_ENV_ARG_PARAMETER);
+
+ ACE_TRY_CHECK;
+ }
+ ACE_CATCHANY
+ {
+ ACE_PRINT_EXCEPTION (ACE_ANY_EXCEPTION,"TAO_AV_Endpoint_Reactive_Strategy::activate_mediactrl");
+ return -1;
+ }
+ ACE_ENDTRY;
+ ACE_CHECK_RETURN (-1);
+ return 0;
+}
+
+// Bridge method
+template <class T_StreamEndpoint, class T_VDev , class T_MediaCtrl>
+int
+TAO_AV_Endpoint_Reactive_Strategy<T_StreamEndpoint, T_VDev, T_MediaCtrl>::make_stream_endpoint (T_StreamEndpoint *&stream_endpoint)
+{
+ ACE_NEW_RETURN (stream_endpoint,
+ T_StreamEndpoint,
+ -1);
+ return 0;
+}
+
+// Bridge method
+template <class T_StreamEndpoint, class T_VDev , class T_MediaCtrl>
+int
+TAO_AV_Endpoint_Reactive_Strategy<T_StreamEndpoint, T_VDev, T_MediaCtrl>::make_vdev (T_VDev *&vdev)
+{
+ ACE_NEW_RETURN (vdev,
+ T_VDev,
+ -1);
+ return 0;
+}
+
+// Bridge method
+template <class T_StreamEndpoint, class T_VDev , class T_MediaCtrl>
+int
+TAO_AV_Endpoint_Reactive_Strategy<T_StreamEndpoint, T_VDev, T_MediaCtrl>::make_mediactrl (T_MediaCtrl *&media_ctrl)
+{
+ ACE_NEW_RETURN (media_ctrl,
+ T_MediaCtrl,
+ -1);
+ return 0;
+}
+
+
+// ----------------------------------------------------------------------
+
+// ----------------------------------------------------------------------
+// TAO_AV_Endpoint_Reactive_Strategy_A
+// ----------------------------------------------------------------------
+
+//Constructor
+template <class T_StreamEndpoint, class T_VDev , class T_MediaCtrl>
+TAO_AV_Endpoint_Reactive_Strategy_A <T_StreamEndpoint, T_VDev, T_MediaCtrl>::TAO_AV_Endpoint_Reactive_Strategy_A (void)
+{
+}
+
+
+// Destructor
+template <class T_StreamEndpoint, class T_VDev , class T_MediaCtrl>
+TAO_AV_Endpoint_Reactive_Strategy_A <T_StreamEndpoint, T_VDev, T_MediaCtrl>::~TAO_AV_Endpoint_Reactive_Strategy_A (void)
+{
+}
+
+
+template <class T_StreamEndpoint, class T_VDev , class T_MediaCtrl>
+int
+TAO_AV_Endpoint_Reactive_Strategy_A <T_StreamEndpoint, T_VDev, T_MediaCtrl>::init (CORBA::ORB_ptr orb, PortableServer::POA_ptr poa)
+{
+ this->orb_ = CORBA::ORB::_duplicate (orb);
+ this->poa_ = PortableServer::POA::_duplicate (poa);
+ return 0;
+}
+
+// Creates an "A" type streamendpoint, and a vdev and returns the
+// object references
+template <class T_StreamEndpoint, class T_VDev , class T_MediaCtrl>
+int
+TAO_AV_Endpoint_Reactive_Strategy_A<T_StreamEndpoint, T_VDev, T_MediaCtrl>::create_A (AVStreams::StreamEndPoint_A_ptr &stream_endpoint,
+ AVStreams::VDev_ptr &vdev
+ ACE_ENV_ARG_DECL_NOT_USED/* ACE_ENV_SINGLE_ARG_PARAMETER */)
+{
+ if (this->activate () == -1)
+ ACE_ERROR_RETURN ((LM_ERROR,
+ "(%P|%t) TAO_AV_Endpoint_Reactive_Strategy_A: Error in activate ()\n"),
+ -1);
+
+ stream_endpoint = AVStreams::StreamEndPoint_A::_duplicate( this->stream_endpoint_a_.in() );
+ vdev = AVStreams::VDev::_duplicate( this->vdev_.in() );
+ return 0;
+
+}
+
+// Put the stream_endpoint into the POA
+template <class T_StreamEndpoint, class T_VDev , class T_MediaCtrl>
+int
+TAO_AV_Endpoint_Reactive_Strategy_A <T_StreamEndpoint, T_VDev, T_MediaCtrl>::activate_stream_endpoint (ACE_ENV_SINGLE_ARG_DECL)
+{
+ ACE_TRY
+ {
+
+ // Use the bridge method
+ if (this->make_stream_endpoint (this->stream_endpoint_a_servant_) == -1)
+ return -1;
+
+ // Save the object references, so that create_a can return them
+ this->stream_endpoint_a_ = this->stream_endpoint_a_servant_->_this (ACE_ENV_SINGLE_ARG_PARAMETER);
+ ACE_TRY_CHECK;
+ }
+ ACE_CATCHANY
+ {
+ ACE_PRINT_EXCEPTION (ACE_ANY_EXCEPTION,"TAO_AV_Endpoint_Reactive_Strategy_A::activate_stream_endpoint");
+ return -1;
+ }
+ ACE_ENDTRY;
+ ACE_CHECK_RETURN (-1);
+ return 0;
+}
+
+// ----------------------------------------------------------------------
+// TAO_AV_Endpoint_Reactive_Strategy_B
+// ----------------------------------------------------------------------
+
+
+// Constructor
+template <class T_StreamEndpoint, class T_VDev , class T_MediaCtrl>
+TAO_AV_Endpoint_Reactive_Strategy_B <T_StreamEndpoint, T_VDev, T_MediaCtrl>::TAO_AV_Endpoint_Reactive_Strategy_B (void)
+{
+}
+
+// Destructor
+template <class T_StreamEndpoint, class T_VDev , class T_MediaCtrl>
+TAO_AV_Endpoint_Reactive_Strategy_B <T_StreamEndpoint, T_VDev, T_MediaCtrl>::~TAO_AV_Endpoint_Reactive_Strategy_B (void)
+{
+}
+
+
+template <class T_StreamEndpoint, class T_VDev , class T_MediaCtrl>
+int
+TAO_AV_Endpoint_Reactive_Strategy_B <T_StreamEndpoint, T_VDev, T_MediaCtrl>::init (CORBA::ORB_ptr orb, PortableServer::POA_ptr poa)
+{
+ this->orb_ = CORBA::ORB::_duplicate (orb);
+ this->poa_ = PortableServer::POA::_duplicate (poa);
+ return 0;
+}
+
+// Activate stream_endpoint
+template <class T_StreamEndpoint, class T_VDev , class T_MediaCtrl>
+int
+TAO_AV_Endpoint_Reactive_Strategy_B <T_StreamEndpoint, T_VDev, T_MediaCtrl>::activate_stream_endpoint (ACE_ENV_SINGLE_ARG_DECL)
+{
+ ACE_TRY
+ {
+ if (this->make_stream_endpoint ( this->stream_endpoint_b_servant_ ) == -1)
+ return -1;
+
+ this->stream_endpoint_b_ = this->stream_endpoint_b_servant_->_this (ACE_ENV_SINGLE_ARG_PARAMETER);
+ ACE_TRY_CHECK;
+ }
+ ACE_CATCHANY
+ {
+ ACE_PRINT_EXCEPTION (ACE_ANY_EXCEPTION,"TAO_AV_Endpoint_Reactive_Strategy_B::activate_stream_endpoint");
+ return -1;
+ }
+ ACE_ENDTRY;
+ ACE_CHECK_RETURN (-1);
+ return 0;
+}
+
+// Returns a "B" type stream_endpoint and a vdev
+template <class T_StreamEndpoint, class T_VDev , class T_MediaCtrl>
+int
+TAO_AV_Endpoint_Reactive_Strategy_B<T_StreamEndpoint, T_VDev, T_MediaCtrl>::create_B (AVStreams::StreamEndPoint_B_ptr &stream_endpoint,
+ AVStreams::VDev_ptr &vdev
+ ACE_ENV_ARG_DECL_NOT_USED/* ACE_ENV_SINGLE_ARG_PARAMETER */)
+{
+ if (this->activate () == -1)
+ ACE_ERROR_RETURN ((LM_ERROR,
+ "(%P|%t) TAO_AV_Endpoint_Reactive_Strategy_B: Error in activate ()\n"),
+ -1);
+
+ stream_endpoint = AVStreams::StreamEndPoint_B::_duplicate( this->stream_endpoint_b_.in() );
+ vdev = AVStreams::VDev::_duplicate( this->vdev_.in() );
+
+ return 0;
+}
+
+// ----------------------------------------------------------------------
+// TAO_AV_Child_Process
+// ----------------------------------------------------------------------
+
+// Constructor
+template <class T_StreamEndpoint_B, class T_VDev , class T_MediaCtrl>
+TAO_AV_Child_Process <T_StreamEndpoint_B, T_VDev, T_MediaCtrl>::TAO_AV_Child_Process ()
+ : stream_endpoint_name_ (0),
+ pid_ (-1)
+{
+ this->pid_ = ACE_OS::getpid ();
+ if (this->pid_ == 0)
+ ACE_ERROR ((LM_ERROR,"getpid () failed\n"));
+ ACE_OS::hostname (this->host_,
+ sizeof this->host_);
+}
+
+// Initializes the ORB, activates the objects, and release the semaphore
+template <class T_StreamEndpoint_B, class T_VDev , class T_MediaCtrl>
+int
+TAO_AV_Child_Process <T_StreamEndpoint_B, T_VDev, T_MediaCtrl>::init (int argc,
+ char **argv,
+ CORBA::ORB_ptr orb,
+ PortableServer::POA_ptr poa)
+{
+ ACE_DECLARE_NEW_CORBA_ENV;
+ ACE_TRY
+ {
+ this->orb_ = orb;
+
+ this->poa_ = poa;
+
+ // create the objects and activate them in the poa
+ this->activate_objects (argc,
+ argv
+ ACE_ENV_ARG_PARAMETER);
+ ACE_TRY_CHECK;
+
+ // Get ourselves a naming_service object reference
+ this->bind_to_naming_service (ACE_ENV_SINGLE_ARG_PARAMETER);
+ ACE_TRY_CHECK;
+
+ // Register the vdev with the naming service
+ this->register_vdev (ACE_ENV_SINGLE_ARG_PARAMETER);
+ ACE_TRY_CHECK;
+
+ // register the stream_endpoing with the naming_service
+ this->register_stream_endpoint (ACE_ENV_SINGLE_ARG_PARAMETER);
+ ACE_TRY_CHECK;
+ }
+ ACE_CATCHANY
+ {
+ ACE_PRINT_EXCEPTION (ACE_ANY_EXCEPTION,"TAO_Child_Process");
+ return -1;
+ }
+ ACE_ENDTRY;
+
+ // release the semaphore the parent is waiting on
+ if (this->release_semaphore () == -1)
+ ACE_ERROR_RETURN ((LM_ERROR,
+ "(%P|%t) Error releasing semaphores\n"),
+ -1);
+
+ return 0;
+}
+
+template <class T_StreamEndpoint, class T_VDev , class T_MediaCtrl>
+char *
+TAO_AV_Child_Process <T_StreamEndpoint, T_VDev, T_MediaCtrl>::activate_with_poa (PortableServer::Servant servant
+ ACE_ENV_ARG_DECL)
+{
+
+ PortableServer::ObjectId_var id =
+ this->poa_->activate_object (servant
+ ACE_ENV_ARG_PARAMETER);
+ ACE_CHECK_RETURN (0);
+
+ CORBA::Object_var obj =
+ this->poa_->id_to_reference (id.in ()
+ ACE_ENV_ARG_PARAMETER);
+ ACE_CHECK_RETURN (0);
+
+ CORBA::String_var str =
+ this->orb_->object_to_string (obj.in ()
+ ACE_ENV_ARG_PARAMETER);
+ ACE_CHECK_RETURN (0);
+
+ return str._retn ();
+}
+
+// initializes the orb, and activates the objects
+template <class T_StreamEndpoint, class T_VDev , class T_MediaCtrl>
+int
+TAO_AV_Child_Process <T_StreamEndpoint, T_VDev, T_MediaCtrl>::activate_objects (int /*argc*/,
+ char ** /*argv*/
+ ACE_ENV_ARG_DECL)
+{
+ ACE_TRY
+ {
+ // bridge method to make a new stream endpoint
+ if (this->make_stream_endpoint (this->stream_endpoint_) == -1)
+ return -1;
+
+ // bridge method to make a new vdev
+ if (this->make_vdev (this->vdev_) == -1)
+ return -1;
+
+ // bridge method to make a new media controller
+ if (this->make_mediactrl (this->media_ctrl_) == -1)
+ return -1;
+
+ // activate the stream_endpoint
+ CORBA::String_var stream_endpoint_ior = this->activate_with_poa (this->stream_endpoint_
+ ACE_ENV_ARG_PARAMETER);
+ ACE_TRY_CHECK;
+ if (TAO_debug_level > 0) ACE_DEBUG ((LM_DEBUG,
+ "(%P|%t)TAO_AV_Child_Process::activate_objects,stream_endpoint_ior :%s\n",
+ stream_endpoint_ior.in ()));
+
+ // activate the vdev
+ CORBA::String_var vdev_ior = this->activate_with_poa (this->vdev_
+ ACE_ENV_ARG_PARAMETER);
+ ACE_TRY_CHECK;
+ if (TAO_debug_level > 0) ACE_DEBUG ((LM_DEBUG,
+ "(%P|%t)TAO_AV_Child_Process::activate_objects, vdev ior is :%s\n",
+ vdev_ior.in ()));
+
+ // activate the media controller
+ CORBA::String_var media_ctrl_ior = this->activate_with_poa (this->media_ctrl_
+ ACE_ENV_ARG_PARAMETER);
+
+ ACE_TRY_CHECK;
+ if (TAO_debug_level > 0) ACE_DEBUG ((LM_DEBUG,"(%P|%t)TAO_AV_Child_Process::activate_objects,media_ctrl_ior is: %s\n",media_ctrl_ior.in ()));
+ }
+ ACE_CATCHANY
+ {
+ ACE_PRINT_EXCEPTION (ACE_ANY_EXCEPTION,"TAO_AV_Child_Process::init ");
+ return -1;
+ }
+ ACE_ENDTRY;
+ ACE_CHECK_RETURN (-1);
+ return 0;
+}
+
+// Bind to the namingservice
+template <class T_StreamEndpoint, class T_VDev , class T_MediaCtrl>
+int
+TAO_AV_Child_Process <T_StreamEndpoint, T_VDev, T_MediaCtrl>::bind_to_naming_service (ACE_ENV_SINGLE_ARG_DECL)
+{
+ ACE_TRY
+ {
+ CORBA::Object_var naming_obj =
+ this->orb_->resolve_initial_references ("NameService" ACE_ENV_ARG_PARAMETER);
+ ACE_TRY_CHECK;
+ if (CORBA::is_nil (naming_obj.in ()))
+ ACE_ERROR_RETURN ((LM_ERROR,
+ " (%P|%t) Unable to resolve the Name Service.\n"),
+ -1);
+ // if (TAO_debug_level > 0) ACE_DEBUG ((LM_DEBUG, "(%P|%t) %s:%d\n", __FILE__, __LINE__));
+ this->naming_context_ =
+ CosNaming::NamingContext::_narrow (naming_obj.in ()
+ ACE_ENV_ARG_PARAMETER);
+ ACE_TRY_CHECK;
+ }
+ ACE_CATCHANY
+ {
+ ACE_PRINT_EXCEPTION (ACE_ANY_EXCEPTION,"TAO_AV_Child_Process::bind_to_naming_service");
+ return -1;
+ }
+ ACE_ENDTRY;
+ ACE_CHECK_RETURN (-1);
+ return 0;
+}
+
+// register the vdev with the naming service
+template <class T_StreamEndpoint, class T_VDev , class T_MediaCtrl>
+int
+TAO_AV_Child_Process <T_StreamEndpoint, T_VDev, T_MediaCtrl>::register_vdev (ACE_ENV_SINGLE_ARG_DECL)
+{
+ ACE_TRY
+ {
+ char vdev_name [BUFSIZ];
+ ACE_OS::sprintf (vdev_name,
+ "%s:%s:%ld",
+ "VDev",
+ this->host_,
+ static_cast<long> (this->pid_));
+
+ if (TAO_debug_level > 0) ACE_DEBUG ((LM_DEBUG,"(%P|%t)%s\n",vdev_name));
+ // create the name
+ this->vdev_name_.length (1);
+ this->vdev_name_ [0].id = CORBA::string_dup (vdev_name);
+
+ // make the media controller a property of the vdev
+ CORBA::Any media_ctrl_property;
+ media_ctrl_obj_ =
+ this->media_ctrl_->_this (ACE_ENV_SINGLE_ARG_PARAMETER);
+ ACE_TRY_CHECK;
+
+ this->vdev_->define_property ("Related_MediaCtrl",
+ media_ctrl_obj_.in()
+ ACE_ENV_ARG_PARAMETER);
+ ACE_TRY_CHECK;
+
+ vdev_obj_ = this->vdev_->_this (ACE_ENV_SINGLE_ARG_PARAMETER);
+ ACE_TRY_CHECK;
+
+ ACE_TRY_CHECK;
+ ACE_TRY_EX (bind)
+ {
+ // Register the vdev with the naming server.
+ this->naming_context_->bind (this->vdev_name_,
+ vdev_obj_.in()
+ ACE_ENV_ARG_PARAMETER);
+ ACE_TRY_CHECK_EX (bind);
+ }
+ ACE_CATCH (CosNaming::NamingContext::AlreadyBound,ex)
+ {
+ // If the object was already there, replace the older reference
+ // with this one
+ this->naming_context_->rebind (this->vdev_name_,
+ vdev_obj_.in()
+ ACE_ENV_ARG_PARAMETER);
+ ACE_TRY_CHECK;
+ }
+ ACE_CATCHANY
+ {
+ ACE_PRINT_EXCEPTION (ACE_ANY_EXCEPTION,"TAO_AV_Child_Process::register_vdev");
+ return -1;
+ }
+ ACE_ENDTRY;
+ ACE_CHECK_RETURN (-1);
+ }
+ ACE_CATCHANY
+ {
+ ACE_PRINT_EXCEPTION (ACE_ANY_EXCEPTION,"TAO_AV_Child_Process::register_vdev");
+ return -1;
+ }
+ ACE_ENDTRY;
+ ACE_CHECK_RETURN (-1);
+ return 0;
+}
+
+// run the orb event look
+template <class T_StreamEndpoint_B, class T_VDev , class T_MediaCtrl>
+int
+TAO_AV_Child_Process <T_StreamEndpoint_B, T_VDev, T_MediaCtrl>::run (ACE_Time_Value *tv)
+{
+ ACE_DECLARE_NEW_CORBA_ENV;
+ ACE_TRY
+ {
+ this->orb_->run (tv ACE_ENV_ARG_PARAMETER);
+ ACE_TRY_CHECK;
+ }
+ ACE_CATCHANY
+ {
+ ACE_PRINT_EXCEPTION (ACE_ANY_EXCEPTION,"orb.run ()");
+ return -1;
+ }
+ ACE_ENDTRY;
+ return 0;
+}
+
+// release the semaphore the parent is waiting on
+template <class T_StreamEndpoint_B, class T_VDev , class T_MediaCtrl>
+int
+TAO_AV_Child_Process <T_StreamEndpoint_B, T_VDev, T_MediaCtrl>::release_semaphore ()
+{
+ char sem_str [BUFSIZ];
+
+ long pid = this->pid_;
+ sprintf (sem_str,
+ "%s:%s:%ld",
+ "TAO_AV_Process_Semaphore",
+ this->host_,
+ pid);
+
+ if (TAO_debug_level > 0) ACE_DEBUG ((LM_DEBUG,
+ "(%P|%t) semaphore is %s\n",
+ sem_str));
+
+ // Release the lock on which the server is waiting
+ ACE_Process_Semaphore semaphore (0, // 0 means that the semaphore is
+ // initially locked
+ sem_str);
+
+ if (semaphore.release () == -1)
+ ACE_ERROR_RETURN ((LM_ERROR,
+ "(%P|%t) Error releasing semaphore %s: %p\n",
+ sem_str,
+ "semaphore.release ()"),
+ -1);
+
+ return 0;
+}
+
+// register the stream_endpoint with the naming service
+template <class T_StreamEndpoint, class T_VDev , class T_MediaCtrl>
+int
+TAO_AV_Child_Process <T_StreamEndpoint, T_VDev, T_MediaCtrl>::register_stream_endpoint (ACE_ENV_SINGLE_ARG_DECL)
+{
+ CORBA::Object_ptr stream_endpoint_obj = CORBA::Object::_nil ();
+ ACE_TRY
+ {
+ stream_endpoint_obj = this->stream_endpoint_->_this (ACE_ENV_SINGLE_ARG_PARAMETER);
+ ACE_TRY_CHECK;
+
+ // Create a name for the video control object
+ // subclasses can define their own name for the streamendpoint
+ // Register the stream endpoint object with the naming server.
+ this->naming_context_->bind (this->stream_endpoint_name_,
+ stream_endpoint_obj
+ ACE_ENV_ARG_PARAMETER);
+ ACE_TRY_CHECK;
+ }
+ ACE_CATCH (CosNaming::NamingContext::AlreadyBound,ex)
+ {
+ // if the name was already there, replace the reference with the new one
+ this->naming_context_->rebind (this->stream_endpoint_name_,
+ stream_endpoint_obj
+ ACE_ENV_ARG_PARAMETER);
+ ACE_TRY_CHECK;
+ }
+ ACE_CATCHANY
+ {
+ ACE_PRINT_EXCEPTION (ACE_ANY_EXCEPTION,"TAO_Endpoint_Reactive_Strategy::activate");
+ return -1;
+ }
+ ACE_ENDTRY;
+ ACE_CHECK_RETURN (-1);
+ return 0;
+}
+
+// Bridge method to make a new stream_endpoint
+template <class T_StreamEndpoint, class T_VDev , class T_MediaCtrl>
+int
+TAO_AV_Child_Process<T_StreamEndpoint, T_VDev, T_MediaCtrl>::make_stream_endpoint (T_StreamEndpoint *&stream_endpoint)
+{
+ ACE_NEW_RETURN (stream_endpoint,
+ T_StreamEndpoint,
+ -1);
+ return 0;
+}
+
+// Bridge method to make a new vdev
+template <class T_StreamEndpoint, class T_VDev , class T_MediaCtrl>
+int
+TAO_AV_Child_Process<T_StreamEndpoint, T_VDev, T_MediaCtrl>::make_vdev (T_VDev *&vdev)
+{
+ ACE_NEW_RETURN (vdev,
+ T_VDev,
+ -1);
+ return 0;
+}
+
+// Bridge method to make a new media controller
+template <class T_StreamEndpoint, class T_VDev , class T_MediaCtrl>
+int
+TAO_AV_Child_Process<T_StreamEndpoint, T_VDev, T_MediaCtrl>::make_mediactrl (T_MediaCtrl *&media_ctrl)
+{
+ if (TAO_debug_level > 0) ACE_DEBUG ((LM_DEBUG,"(%P|%t) TAO_AV_Child_Process::make_mediactrl ()\n"));
+ ACE_NEW_RETURN (media_ctrl,
+ T_MediaCtrl,
+ -1);
+ return 0;
+}
+
+
+template <class T_StreamEndpoint, class T_VDev , class T_MediaCtrl>
+int
+TAO_AV_Child_Process<T_StreamEndpoint, T_VDev, T_MediaCtrl>::unbind_names (void)
+{
+ // Remove the names from the naming service
+ ACE_DECLARE_NEW_CORBA_ENV;
+ ACE_TRY
+ {
+ if (CORBA::is_nil (this->naming_context_.in ()) == 0)
+ return 0;
+ this->naming_context_->unbind (this->stream_endpoint_name_
+ ACE_ENV_ARG_PARAMETER);
+ ACE_TRY_CHECK;
+
+ this->naming_context_->unbind (this->vdev_name_
+ ACE_ENV_ARG_PARAMETER);
+ ACE_TRY_CHECK;
+ }
+ ACE_CATCHANY
+ {
+ ACE_PRINT_EXCEPTION (ACE_ANY_EXCEPTION,"TAO_Endpoint_Process_Strategy::activate");
+ return -1;
+ }
+ ACE_ENDTRY;
+ ACE_CHECK_RETURN (-1);
+ return 0;
+}
+
+// %% its not clear whether we should be deleting the objects, since
+// if the application overrides the make_mediactrl methods etc.,
+// then, we may not own these objects.
+// For now, we dont delete the objects, since they exist for the
+// lifetime of the process anyway
+template <class T_StreamEndpoint, class T_VDev , class T_MediaCtrl>
+TAO_AV_Child_Process<T_StreamEndpoint, T_VDev, T_MediaCtrl>::~TAO_AV_Child_Process ()
+{
+ this->unbind_names ();
+}
+
+// ----------------------------------------------------------------------
+// TAO_AV_Child_Process_A
+// ----------------------------------------------------------------------
+
+// Define the name of the stream_endpoint, as used to register with
+// the naming service
+template <class T_StreamEndpoint, class T_VDev , class T_MediaCtrl>
+TAO_AV_Child_Process_A<T_StreamEndpoint, T_VDev, T_MediaCtrl>::TAO_AV_Child_Process_A ()
+{
+ char stream_endpoint_name[BUFSIZ];
+ ACE_OS::sprintf (stream_endpoint_name,
+ "%s:%s:%ld",
+ "Stream_Endpoint_A",
+ this->host_,
+ static_cast<long> (this->pid_));
+
+ if (TAO_debug_level > 0) ACE_DEBUG ((LM_DEBUG,"(%P|%t)%s\n",stream_endpoint_name));
+ this->stream_endpoint_name_.length (1);
+ this->stream_endpoint_name_ [0].id = CORBA::string_dup (stream_endpoint_name);
+}
+
+template <class T_StreamEndpoint, class T_VDev , class T_MediaCtrl>
+TAO_AV_Child_Process_A <T_StreamEndpoint, T_VDev, T_MediaCtrl>::~TAO_AV_Child_Process_A ()
+{
+}
+
+// ----------------------------------------------------------------------
+// TAO_AV_Child_Process_B
+// ----------------------------------------------------------------------
+
+// Define the name of the stream_endpoint, as used to register with
+// the naming service
+template <class T_StreamEndpoint, class T_VDev , class T_MediaCtrl>
+TAO_AV_Child_Process_B<T_StreamEndpoint, T_VDev, T_MediaCtrl>::TAO_AV_Child_Process_B ()
+{
+ char stream_endpoint_name[BUFSIZ];
+ ACE_OS::sprintf (stream_endpoint_name,
+ "%s:%s:%ld",
+ "Stream_Endpoint_B",
+ this->host_,
+ static_cast<long> (this->pid_));
+
+ if (TAO_debug_level > 0) ACE_DEBUG ((LM_DEBUG,"(%P|%t)%s\n",stream_endpoint_name));
+ this->stream_endpoint_name_.length (1);
+ this->stream_endpoint_name_ [0].id = CORBA::string_dup (stream_endpoint_name);
+}
+
+template <class T_StreamEndpoint, class T_VDev , class T_MediaCtrl>
+TAO_AV_Child_Process_B<T_StreamEndpoint, T_VDev, T_MediaCtrl>::~TAO_AV_Child_Process_B ()
+{
+}
+
+TAO_END_VERSIONED_NAMESPACE_DECL
+
+#endif /* TAO_AV_ENDPOINT_STRATEGY_T_CPP */
diff --git a/TAO/orbsvcs/orbsvcs/AV/Endpoint_Strategy_T.h b/TAO/orbsvcs/orbsvcs/AV/Endpoint_Strategy_T.h
new file mode 100644
index 00000000000..45210da5406
--- /dev/null
+++ b/TAO/orbsvcs/orbsvcs/AV/Endpoint_Strategy_T.h
@@ -0,0 +1,293 @@
+// -*- C++ -*-
+
+//=============================================================================
+/**
+ * @file Endpoint_Strategy_T.h
+ *
+ * $Id$
+ *
+ * @author Sumedh Mungee <sumedh@cs.wustl.edu>
+ * @author Nagarajan Surendran <naga@cs.wustl.edu>
+ */
+//=============================================================================
+
+#ifndef TAO_AV_ENDPOINT_STRATEGY_T_H
+#define TAO_AV_ENDPOINT_STRATEGY_T_H
+#include /**/ "ace/pre.h"
+
+#include "orbsvcs/AV/Endpoint_Strategy.h"
+
+TAO_BEGIN_VERSIONED_NAMESPACE_DECL
+
+/**
+ * @class TAO_AV_Endpoint_Reactive_Strategy
+ * @brief Reactive strategy base class
+ */
+template <class T_StreamEndpoint, class T_VDev , class T_MediaCtrl>
+class TAO_AV_Endpoint_Reactive_Strategy
+: public TAO_AV_Endpoint_Strategy
+{
+
+protected:
+ // Constructor
+
+ /// Constructor
+ TAO_AV_Endpoint_Reactive_Strategy (void);
+
+ /// Destructor.
+ virtual ~TAO_AV_Endpoint_Reactive_Strategy (void);
+
+ /// creates and activates the streamendpoint, vdev, and mediacontrol
+ virtual int activate (void);
+
+ /// activates the stream_endpoint with the POA
+ virtual int activate_stream_endpoint (ACE_ENV_SINGLE_ARG_DECL) = 0;
+
+ /// activates the vdev with the POA
+ virtual int activate_vdev (ACE_ENV_SINGLE_ARG_DECL);
+
+ /// activates the media controller with the POA
+ virtual int activate_mediactrl (ACE_ENV_SINGLE_ARG_DECL);
+
+ /// Bridge method to create a vdev, a la Acceptor. Applications
+ /// can override this
+ virtual int make_vdev (T_VDev *&vdev);
+
+ /// Bridge method to create a stream_endpoint, a la Acceptor. Applications
+ /// can override this
+ virtual int make_stream_endpoint (T_StreamEndpoint *&stream_endpoint);
+
+ /// Bridge method to create a media_ctrl, a la Acceptor. Applications
+ /// can override this
+ virtual int make_mediactrl (T_MediaCtrl *&media_ctrl);
+
+
+ char* activate_with_poa (PortableServer::Servant servant ACE_ENV_ARG_DECL);
+
+ CORBA::ORB_var orb_;
+
+ PortableServer::POA_var poa_;
+
+ CORBA::Object_var media_ctrl_obj_;
+
+ T_StreamEndpoint *stream_endpoint_a_servant_;
+
+ T_StreamEndpoint *stream_endpoint_b_servant_;
+
+ T_VDev *vdev_servant_;
+
+ T_MediaCtrl *media_ctrl_servant_;
+};
+// ----------------------------------------------------------------------
+
+/**
+ * @class TAO_AV_Endpoint_Reactive_Strategy_A
+ * @brief Reactive strategy
+ */
+template <class T_StreamEndpoint, class T_VDev , class T_MediaCtrl>
+class TAO_AV_Endpoint_Reactive_Strategy_A
+ : public TAO_AV_Endpoint_Reactive_Strategy<T_StreamEndpoint, T_VDev , T_MediaCtrl>
+{
+
+public:
+
+ TAO_AV_Endpoint_Reactive_Strategy_A (void);
+
+ /// Constructor
+ int init (CORBA::ORB_ptr orb, PortableServer::POA_ptr poa);
+
+ /// Destructor.
+ virtual ~TAO_AV_Endpoint_Reactive_Strategy_A (void);
+
+ /// Overrides the base class stream_endpoint activator, to activate
+ /// an "A" type endpoint
+ virtual int activate_stream_endpoint (ACE_ENV_SINGLE_ARG_DECL);
+
+ /// Called by the MMDevice, when it needs to create an A type endpoint
+ virtual int create_A (AVStreams::StreamEndPoint_A_ptr &stream_endpoint,
+ AVStreams::VDev_ptr &vdev
+ ACE_ENV_ARG_DECL);
+
+};
+
+// ----------------------------------------------------------------------
+/**
+ * @class TAO_AV_Endpoint_Reactive_Strategy_B
+ * @brief Reactive strategy
+ */
+template <class T_StreamEndpoint, class T_Vdev , class T_MediaCtrl>
+class TAO_AV_Endpoint_Reactive_Strategy_B
+ : public TAO_AV_Endpoint_Reactive_Strategy <T_StreamEndpoint, T_Vdev, T_MediaCtrl>
+{
+
+public:
+
+ /// Constructor
+ TAO_AV_Endpoint_Reactive_Strategy_B (void);
+
+ /// Destructor.
+ virtual ~TAO_AV_Endpoint_Reactive_Strategy_B (void);
+
+ int init (CORBA::ORB_ptr orb, PortableServer::POA_ptr poa);
+
+ /// Overrides the base class stream_endpoint activator, to activate
+ /// a "B" type endpoint
+ virtual int activate_stream_endpoint (ACE_ENV_SINGLE_ARG_DECL);
+
+ /// Called by the MMDevice, when it needs to create a B type endpoint
+ virtual int create_B (AVStreams::StreamEndPoint_B_ptr &stream_endpoint,
+ AVStreams::VDev_ptr &vdev
+ ACE_ENV_ARG_DECL);
+};
+
+// ----------------------------------------------------------------------
+
+/**
+ * @class TAO_AV_Child_Process
+ *
+ * @brief Helper class for the child process created in
+ * TAO_AV_Endpoint_Process_Strategy
+ */
+template <class T_StreamEndpoint, class T_VDev , class T_MediaCtrl>
+class TAO_AV_Child_Process
+{
+
+public:
+ /// Constructor
+ TAO_AV_Child_Process ();
+
+ /// Destructor
+ virtual ~TAO_AV_Child_Process ();
+
+ /// Initializes the ORB, creates and activates the
+ /// T_StreamEndpoint, T_VDev, T_MediaCtrl in the POA
+ int init (int argc, char **argv, CORBA::ORB_ptr orb, PortableServer::POA_ptr poa);
+
+ /// runs the ORB event loop
+ int run (ACE_Time_Value *tv = 0);
+
+protected:
+ /**
+ * Creates the objects and inserts them into the Naming
+ * Service, so the parent can pick the IOR's and
+ * return them to the client
+ */
+ int activate_objects (int argc,
+ char **argv
+ ACE_ENV_ARG_DECL);
+
+ ///activate the servant with the poa
+ char* activate_with_poa (PortableServer::Servant servant ACE_ENV_ARG_DECL);
+
+ /// Removes the vdev and streamendpoint names from the naming service.
+ int unbind_names (void);
+
+ /// Binds to the naming service
+ int bind_to_naming_service (ACE_ENV_SINGLE_ARG_DECL);
+
+ /// Registers vdev with the naming service
+ int register_vdev (ACE_ENV_SINGLE_ARG_DECL);
+
+ /// Registers stream_endpoint with the naming service
+ int register_stream_endpoint (ACE_ENV_SINGLE_ARG_DECL);
+
+ /// Releases the semaphore on which the parent is waiting on
+ int release_semaphore ();
+
+ /// Bridge method to create a vdev, a la Acceptor. Applications
+ /// can override this
+ virtual int make_vdev (T_VDev *&vdev);
+
+ /// Bridge method to create a stream_endpoint, a la Acceptor. Applications
+ /// can override this
+ virtual int make_stream_endpoint (T_StreamEndpoint *&stream_endpoint);
+
+ /// Bridge method to create a media_ctrl, a la Acceptor. Applications
+ /// can override this
+ virtual int make_mediactrl (T_MediaCtrl *&media_ctrl);
+
+ /// The root Naming Context of the TAO naming service
+ CosNaming::NamingContext_var naming_context_;
+
+ /// Name of the vdev
+ CosNaming::Name vdev_name_;
+
+ /// Name of the stream_endpoint
+ CosNaming::Name stream_endpoint_name_;
+
+ /// The stream endpoint member
+ T_StreamEndpoint *stream_endpoint_;
+
+ /// The virtual device
+ T_VDev *vdev_;
+
+ /// Virtual device CORBA object reference
+ CORBA::Object_var vdev_obj_;
+
+ /// Media controller
+ T_MediaCtrl *media_ctrl_;
+
+ // Media controller CORBA object reference
+ CORBA::Object_var media_ctrl_obj_;
+
+ /// pid of this process
+ pid_t pid_;
+
+ /// Name of the host.
+ char host_[MAXHOSTNAMELEN];
+
+ CORBA::ORB_ptr orb_;
+
+ PortableServer::POA_ptr poa_;
+
+};
+
+// ----------------------------------------------------------------------
+/**
+ * @class TAO_AV_Child_Process_A
+ * @brief Helper class for the child process created in TAO_AV_Child_Process
+ */
+template <class T_StreamEndpoint, class T_VDev , class T_MediaCtrl>
+class TAO_AV_Child_Process_A
+ : public TAO_AV_Child_Process <T_StreamEndpoint, T_VDev, T_MediaCtrl>
+{
+
+public:
+ /// Constructor.
+ TAO_AV_Child_Process_A (void);
+
+ /// Destructor.
+ virtual ~TAO_AV_Child_Process_A (void);
+};
+
+// ----------------------------------------------------------------------
+
+/**
+ * @class TAO_AV_Child_Process_B
+ * @brief Helper class for the child process created in TAO_AV_Child_Process
+ */
+template <class T_StreamEndpoint, class T_VDev , class T_MediaCtrl>
+class TAO_AV_Child_Process_B
+ : public TAO_AV_Child_Process <T_StreamEndpoint, T_VDev, T_MediaCtrl>
+{
+
+public:
+ /// Constructor.
+ TAO_AV_Child_Process_B (void);
+
+ /// Destructor.
+ virtual ~TAO_AV_Child_Process_B (void);
+};
+
+TAO_END_VERSIONED_NAMESPACE_DECL
+
+#if defined (ACE_TEMPLATES_REQUIRE_SOURCE)
+#include "orbsvcs/AV/Endpoint_Strategy_T.cpp"
+#endif /*ACE_TEMPLATES_REQUIRE_SOURCE */
+
+#if defined (ACE_TEMPLATES_REQUIRE_PRAGMA)
+#pragma implementation ("Endpoint_Strategy_T.cpp")
+#endif /* ACE_TEMPLATES_REQUIRE_PRAGMA */
+
+#include /**/ "ace/post.h"
+#endif /* TAO_AV_ENDPOINT_STRATEGY_T_H */
diff --git a/TAO/orbsvcs/orbsvcs/AV/Fill_ACE_QoS.cpp b/TAO/orbsvcs/orbsvcs/AV/Fill_ACE_QoS.cpp
new file mode 100644
index 00000000000..e7cca074af3
--- /dev/null
+++ b/TAO/orbsvcs/orbsvcs/AV/Fill_ACE_QoS.cpp
@@ -0,0 +1,75 @@
+// $Id$
+
+#include "orbsvcs/AV/Fill_ACE_QoS.h"
+
+#if defined (ACE_HAS_RAPI) || defined (ACE_HAS_WINSOCK2_GQOS)
+
+ACE_RCSID(QOS, Fill_ACE_QoS,"$Id$")
+
+TAO_BEGIN_VERSIONED_NAMESPACE_DECL
+
+const iovec Fill_ACE_QoS::iov_ = {0,0};
+
+Fill_ACE_QoS::Fill_ACE_QoS (void)
+{
+ ACE_NEW (this->default_traffic_,
+ ACE_Flow_Spec (ACE_QOS_NOT_SPECIFIED,
+ ACE_QOS_NOT_SPECIFIED,
+ ACE_QOS_NOT_SPECIFIED,
+ ACE_QOS_NOT_SPECIFIED,
+ ACE_QOS_NOT_SPECIFIED,
+ ACE_SERVICETYPE_NOTRAFFIC,
+ ACE_QOS_NOT_SPECIFIED,
+ ACE_QOS_NOT_SPECIFIED,
+ 25,
+ 1));
+}
+
+// destructor.
+Fill_ACE_QoS::~Fill_ACE_QoS (void)
+{}
+
+int
+Fill_ACE_QoS::fill_simplex_receiver_qos (ACE_QoS &ace_qos,
+ ACE_Flow_Spec *ace_flow_spec)
+{
+ ace_qos.receiving_flowspec (ace_flow_spec);
+ ace_qos.sending_flowspec ((this->default_traffic_));
+ ace_qos.provider_specific (Fill_ACE_QoS::iov_);
+
+ return 0;
+}
+
+
+int
+Fill_ACE_QoS::fill_simplex_sender_qos (ACE_QoS &ace_qos,
+ ACE_Flow_Spec *sender_flow_spec)
+{
+ ace_qos.receiving_flowspec ((this->default_traffic_));
+ ace_qos.sending_flowspec (sender_flow_spec);
+ ace_qos.provider_specific (Fill_ACE_QoS::iov_);
+
+ return 0;
+}
+
+int
+Fill_ACE_QoS::fill_duplex_qos (ACE_QoS &ace_qos,
+ ACE_Flow_Spec *recv_flow_spec,
+ ACE_Flow_Spec *sender_flow_spec)
+{
+ ace_qos.receiving_flowspec (recv_flow_spec);
+ ace_qos.sending_flowspec (sender_flow_spec);
+ ace_qos.provider_specific (Fill_ACE_QoS::iov_);
+
+ return 0;
+}
+
+Fill_ACE_QoS::FLOW_SPEC_HASH_MAP&
+Fill_ACE_QoS::map (void)
+{
+ return this->flow_spec_map_;
+}
+
+TAO_END_VERSIONED_NAMESPACE_DECL
+
+#endif /* ACE_HAS_RAPI || ACE_HAS_WINSOCK2_GQOS */
diff --git a/TAO/orbsvcs/orbsvcs/AV/Fill_ACE_QoS.h b/TAO/orbsvcs/orbsvcs/AV/Fill_ACE_QoS.h
new file mode 100644
index 00000000000..ede10e0e1ec
--- /dev/null
+++ b/TAO/orbsvcs/orbsvcs/AV/Fill_ACE_QoS.h
@@ -0,0 +1,86 @@
+// -*- C++ -*-
+
+//=============================================================================
+/**
+ * @file Fill_ACE_QoS.h
+ *
+ * $Id$
+ *
+ * @author Vishal Kachroo <vishal@cs.wustl.edu>
+ */
+//=============================================================================
+
+
+#ifndef FILL_ACE_QOS_H
+#define FILL_ACE_QOS_H
+
+#include "ace/config-all.h"
+
+#if defined (ACE_HAS_RAPI) || defined (ACE_HAS_WINSOCK2_GQOS)
+
+#include "tao/Versioned_Namespace.h"
+
+#include "ace/SString.h"
+#include "ace/Hash_Map_Manager_T.h"
+#include "ace/Synch.h"
+#include "ace/ACE.h"
+#include "ace/OS_QoS.h"
+
+TAO_BEGIN_VERSIONED_NAMESPACE_DECL
+
+/**
+ * @class Fill_ACE_QoS
+ *
+ * This class helps users to add new flow specs and provides
+ * utility functions for filling up the flow specs for simplex/duplex
+ * sessions.
+ */
+class Fill_ACE_QoS
+{
+
+public:
+ typedef ACE_Hash_Map_Manager <ACE_CString, ACE_Flow_Spec *, ACE_Null_Mutex> FLOW_SPEC_HASH_MAP;
+
+ //Initialization and termination methods.
+ /// constructor.
+ Fill_ACE_QoS (void);
+
+ /// destructor.
+ ~Fill_ACE_QoS (void);
+
+ /// To be used by receivers. Fills the receiver qos and sets the
+ /// sender qos to NO_TRAFFIC.
+ int fill_simplex_receiver_qos (ACE_QoS &ace_qos,
+ ACE_Flow_Spec *recv_flow_spec);
+
+ /// To be used by senders. Fills the sender qos and sets the receiver
+ /// qos to NO_TRAFFIC.
+ int fill_simplex_sender_qos (ACE_QoS &ace_qos,
+ ACE_Flow_Spec *recv_flow_spec);
+
+ /// To be used by applications that wish to be both receivers and
+ /// senders.
+ int fill_duplex_qos (ACE_QoS &ace_qos,
+ ACE_Flow_Spec *recv_flow_spec,
+ ACE_Flow_Spec *sender_flow_spec);
+
+ /// Returns the hash map of flowspecs indexed by flowspec name.
+ FLOW_SPEC_HASH_MAP& map (void);
+
+private:
+
+ // The Service Provider is currently set to NULL for all ACE_QoS.
+ static const iovec iov_;
+
+ // A NO_TRAFFIC flow spec. Senders set the receiving qos to this
+ // while the receivers set the sending qos to this.
+ ACE_Flow_Spec *default_traffic_;
+
+ // A list of flowspecs indexed by the flowspec name.
+ FLOW_SPEC_HASH_MAP flow_spec_map_;
+};
+
+TAO_END_VERSIONED_NAMESPACE_DECL
+
+#endif /* ACE_HAS_RAPI || ACE_HAS_WINSOCK2_GQOS */
+#endif /* FILL_ACE_QOS_H */
diff --git a/TAO/orbsvcs/orbsvcs/AV/FlowSpec_Entry.cpp b/TAO/orbsvcs/orbsvcs/AV/FlowSpec_Entry.cpp
new file mode 100644
index 00000000000..76476dafb8b
--- /dev/null
+++ b/TAO/orbsvcs/orbsvcs/AV/FlowSpec_Entry.cpp
@@ -0,0 +1,1018 @@
+// $Id$
+
+//------------------------------------------------------------
+// TAO_FlowSpec_Entry
+//------------------------------------------------------------
+
+#include "orbsvcs/AV/FlowSpec_Entry.h"
+#include "orbsvcs/AV/Protocol_Factory.h"
+
+#include "tao/debug.h"
+
+#include "ace/OS_NS_strings.h"
+
+#if !defined (__ACE_INLINE__)
+#include "orbsvcs/AV/FlowSpec_Entry.i"
+#endif /* __ACE_INLINE__ */
+
+TAO_BEGIN_VERSIONED_NAMESPACE_DECL
+
+// constructor.
+TAO_FlowSpec_Entry::TAO_FlowSpec_Entry (void)
+ :address_ (0),
+ clean_up_address_ (0),
+ control_address_ (0),
+ clean_up_control_address_ (0),
+ address_str_ (),
+ format_ (),
+ direction_ (TAO_AV_INVALID),
+ direction_str_ (),
+ flowname_ (),
+ protocol_ (TAO_AV_Core::TAO_AV_NOPROTOCOL),
+ carrier_protocol_ (),
+ flow_protocol_ (),
+ use_flow_protocol_ (0),
+ entry_ (),
+ is_multicast_ (0),
+ delete_peer_addr_ (false),
+ peer_addr_ (0),
+ local_sec_addr_ (0),
+ num_local_sec_addrs_ (0),
+ peer_sec_addr_ (0),
+ num_peer_sec_addrs_ (0),
+ peer_control_addr_ (0),
+ local_addr_ (0),
+ local_control_addr_ (0),
+ transport_ (0),
+ control_transport_ (0),
+ handler_ (0),
+ control_handler_ (0),
+ protocol_object_ (0),
+ control_protocol_object_ (0),
+ role_ (TAO_AV_INVALID_ROLE)
+{
+}
+
+// constructor.
+TAO_FlowSpec_Entry::TAO_FlowSpec_Entry (const char *flowname,
+ const char *direction,
+ const char *format_name,
+ const char *flow_protocol,
+ const char *carrier_protocol,
+ ACE_Addr *fwd_address,
+ //ACE_Addr *peer_address,
+ ACE_Addr *control_address)
+ :address_ (fwd_address),
+ clean_up_address_ (0),
+ control_address_ (control_address),
+ clean_up_control_address_ (0),
+ address_str_ (),
+ format_ (format_name),
+ direction_str_ (direction ),
+ flowname_ ( flowname ),
+ carrier_protocol_ ( carrier_protocol ),
+ flow_protocol_ ( flow_protocol ),
+ use_flow_protocol_ (0),
+ entry_ (),
+ is_multicast_ (0),
+ delete_peer_addr_ (false),
+ peer_addr_ (0),
+ local_sec_addr_ (0),
+ num_local_sec_addrs_ (0),
+ peer_sec_addr_ (0),
+ num_peer_sec_addrs_ (0),
+ peer_control_addr_ (0),
+ local_addr_ (0),
+ local_control_addr_ (0),
+ transport_ (0),
+ control_transport_ (0),
+ handler_ (0),
+ control_handler_ (0),
+ protocol_object_ (0),
+ control_protocol_object_ (0),
+ role_ (TAO_AV_INVALID_ROLE)
+{
+ this->set_protocol ();
+ this->set_direction (this->direction_str_.c_str());
+ this->parse_flow_protocol_string (this->flow_protocol_.c_str() );
+}
+
+TAO_FlowSpec_Entry::TAO_FlowSpec_Entry (const char *flowname,
+ const char *direction,
+ const char *format_name,
+ const char *flow_protocol,
+ const char *address)
+ //const char *peer_address)
+ :address_ (0),
+ clean_up_address_ (0),
+ control_address_ (0),
+ clean_up_control_address_ (0),
+ address_str_ ( address ),
+ format_ ( format_name ),
+ direction_str_ ( direction ),
+ flowname_ ( flowname ),
+ carrier_protocol_ (),
+ flow_protocol_ ( flow_protocol ),
+ use_flow_protocol_ (0),
+ entry_ (),
+ is_multicast_ (0),
+ peer_addr_ (0),
+ local_sec_addr_ (0),
+ num_local_sec_addrs_ (0),
+ peer_sec_addr_ (0),
+ num_peer_sec_addrs_ (0),
+ peer_control_addr_ (0),
+ local_addr_ (0),
+ local_control_addr_ (0),
+ transport_ (0),
+ control_transport_ (0),
+ handler_ (0),
+ control_handler_ (0),
+ protocol_object_ (0),
+ control_protocol_object_ (0),
+ role_ (TAO_AV_INVALID_ROLE)
+{
+ this->parse_flow_protocol_string (this->flow_protocol_.c_str() );
+ this->parse_address (this->address_str_.c_str(), TAO_AV_Core::TAO_AV_DATA);
+ this->set_direction (this->direction_str_.c_str());
+}
+
+// Destructor.
+TAO_FlowSpec_Entry::~TAO_FlowSpec_Entry (void)
+{
+ if (this->delete_peer_addr_)
+ delete this->peer_addr_;
+
+ if (this->clean_up_address_)
+ delete address_;
+ if (this->clean_up_control_address_)
+ delete control_address_;
+ if (local_control_addr_ != 0)
+ delete local_control_addr_;
+}
+
+int
+TAO_FlowSpec_Entry::set_protocol (void)
+{
+ if (!this->use_flow_protocol_)
+ {
+ if (ACE_OS::strcasecmp (this->carrier_protocol_.c_str(),"TCP") == 0)
+ this->protocol_ = TAO_AV_Core::TAO_AV_TCP;
+ else if (ACE_OS::strcasecmp (this->carrier_protocol_.c_str(),"SCTP_SEQ") == 0)
+ this->protocol_ = TAO_AV_Core::TAO_AV_SCTP_SEQ;
+ else if (ACE_OS::strcasecmp (this->carrier_protocol_.c_str(),"UDP") == 0)
+ this->protocol_ = TAO_AV_Core::TAO_AV_UDP;
+ else if (ACE_OS::strcasecmp (this->carrier_protocol_.c_str(),"QoS_UDP") == 0)
+ this->protocol_ = TAO_AV_Core::TAO_AV_QOS_UDP;
+ else if (ACE_OS::strcasecmp (this->carrier_protocol_.c_str(),"AAL5") == 0)
+ this->protocol_ = TAO_AV_Core::TAO_AV_AAL5;
+ else if (ACE_OS::strcasecmp (this->carrier_protocol_.c_str(),"AAL3_4") == 0)
+ this->protocol_ = TAO_AV_Core::TAO_AV_AAL3_4;
+ else if (ACE_OS::strcasecmp (this->carrier_protocol_.c_str(),"AAL1") == 0)
+ this->protocol_ = TAO_AV_Core::TAO_AV_AAL1;
+ else if (ACE_OS::strcasecmp (this->carrier_protocol_.c_str(),"RTP/UDP") == 0){
+ this->protocol_ = TAO_AV_Core::TAO_AV_UDP;
+ flow_protocol_ = "RTP";
+ }
+ else if (ACE_OS::strcasecmp (this->carrier_protocol_.c_str(),"RTP/AAL5") == 0)
+ this->protocol_ = TAO_AV_Core::TAO_AV_RTP_AAL5;
+ else if (ACE_OS::strcasecmp (this->carrier_protocol_.c_str(),"IPX") == 0)
+ this->protocol_ = TAO_AV_Core::TAO_AV_IPX;
+ else
+ {
+ this->protocol_ = TAO_AV_Core::TAO_AV_NOPROTOCOL;
+ return -1;
+ }
+ }
+ else
+ {
+ if (ACE_OS::strcasecmp (this->carrier_protocol_.c_str(),"UDP") == 0)
+ {
+ if (ACE_OS::strncasecmp (this->flow_protocol_.c_str (),"sfp",3) == 0)
+ {
+ this->protocol_ = TAO_AV_Core::TAO_AV_SFP_UDP;
+ }
+ else this->protocol_ = TAO_AV_Core::TAO_AV_USERDEFINED_UDP;
+ }
+ else
+ {
+ this->protocol_ = TAO_AV_Core::TAO_AV_NOPROTOCOL;
+ return -1;
+ }
+ }
+
+ if (this->address_ != 0)
+ {
+ if (TAO_debug_level > 0)
+ ACE_DEBUG ((LM_DEBUG, "TAO_FlowSpec_Entry::set_protocol address is not 0\n"));
+ ACE_INET_Addr *inet_addr = dynamic_cast<ACE_INET_Addr*> (this->address_);
+ char buf[BUFSIZ];
+ inet_addr->addr_to_string (buf,BUFSIZ);
+ if (TAO_debug_level > 0)
+ ACE_DEBUG ((LM_DEBUG,"TAO_FlowSpec_Entry::set_protocol:%s %x\n",buf, inet_addr->get_ip_address ()));
+ if (IN_CLASSD (inet_addr->get_ip_address ()))
+ {
+ this->is_multicast_ = 1;
+ switch (this->protocol_)
+ {
+ case TAO_AV_Core::TAO_AV_UDP:
+ this->protocol_ = TAO_AV_Core::TAO_AV_UDP_MCAST;
+ break;
+ case TAO_AV_Core::TAO_AV_RTP_UDP:
+ this->protocol_ = TAO_AV_Core::TAO_AV_RTP_UDP_MCAST;
+ break;
+ case TAO_AV_Core::TAO_AV_SFP_UDP:
+ this->protocol_ = TAO_AV_Core::TAO_AV_SFP_UDP_MCAST;
+ break;
+ case TAO_AV_Core::TAO_AV_USERDEFINED_UDP:
+ this->protocol_ = TAO_AV_Core::TAO_AV_USERDEFINED_UDP_MCAST;
+ break;
+ default:
+ break;
+ }
+ }
+ }
+ return 0;
+}
+
+int
+TAO_FlowSpec_Entry::parse_address (const char *address,
+ TAO_AV_Core::Flow_Component flow_comp)
+{
+ if (TAO_debug_level > 0)
+ ACE_DEBUG ((LM_DEBUG, "TAO_FlowSpec_Entry::parse_address [%s]\n", address));
+
+ if (address == 0)
+ return 0;
+ if (ACE_OS::strcmp (address,"") == 0)
+ return 0;
+ TAO_Tokenizer protocol_tokenizer (address,'=');
+
+ this->carrier_protocol_ = protocol_tokenizer[0];
+
+ int result = this->set_protocol ();
+ if (result < 0)
+ return result;
+
+ if (protocol_tokenizer [1] != 0)
+ {
+ ACE_DEBUG ((LM_DEBUG,
+ "Protocol tokenixer is not null\n"));
+ if ((flow_comp == TAO_AV_Core::TAO_AV_DATA) ||
+ //(flow_comp == TAO_AV_Core::TAO_AV_BOTH) ||
+ (flow_comp == TAO_AV_Core::TAO_AV_CONTROL) )
+ {
+ ACE_CString addr;
+ if (this->protocol_ == TAO_AV_Core::TAO_AV_SCTP_SEQ)
+ {
+ TAO_Tokenizer addr_token (protocol_tokenizer [1], ';');
+
+ ACE_DEBUG ((LM_DEBUG,
+ "Number of local sec addresses = %d\n",
+ addr_token.num_tokens () - 1));
+
+ if (addr_token.num_tokens () != 0)
+ {
+ addr += addr_token [0];
+ ACE_NEW_RETURN (local_sec_addr_, char* [addr_token.num_tokens () - 1],-1);
+ for (int j = 1; j <= addr_token.num_tokens () - 1; j++)
+ {
+ ACE_DEBUG ((LM_DEBUG,
+ "adding addresses to sequence %s\n",
+ addr_token [j]));
+
+ local_sec_addr_ [j-1] = CORBA::string_dup (addr_token [j]);
+ }
+ num_local_sec_addrs_ = addr_token.num_tokens () - 1;
+ }
+ }
+ else addr += protocol_tokenizer[1];
+
+
+ switch (this->protocol_)
+ {
+ case TAO_AV_Core::TAO_AV_SFP_UDP:
+ case TAO_AV_Core::TAO_AV_USERDEFINED_UDP:
+ case TAO_AV_Core::TAO_AV_RTP_UDP:
+ case TAO_AV_Core::TAO_AV_TCP:
+ case TAO_AV_Core::TAO_AV_SCTP_SEQ:
+ case TAO_AV_Core::TAO_AV_UDP:
+ case TAO_AV_Core::TAO_AV_QOS_UDP:
+ {
+ if (flow_comp == TAO_AV_Core::TAO_AV_DATA)
+ this->address_str_ = addr;
+ ACE_INET_Addr *inet_addr;
+ ACE_NEW_RETURN (inet_addr,
+ ACE_INET_Addr (addr.c_str() ),
+ -1);
+ if (flow_comp == TAO_AV_Core::TAO_AV_DATA)
+ {
+ this->clean_up_address_ = 1;
+ this->address_ = inet_addr;
+ }
+ else
+ {
+ this->clean_up_control_address_ = 1;
+ this->control_address_ = inet_addr;
+ }
+
+ if (IN_CLASSD (inet_addr->get_ip_address ()))
+ {
+ if (TAO_debug_level > 0)
+ ACE_DEBUG ((LM_DEBUG, "TAO_FlowSpec_Entry::parse_address is multicast\n"));
+
+ this->is_multicast_ = 1;
+ switch (this->protocol_)
+ {
+ case TAO_AV_Core::TAO_AV_UDP:
+ this->protocol_ = TAO_AV_Core::TAO_AV_UDP_MCAST;
+ break;
+ case TAO_AV_Core::TAO_AV_RTP_UDP:
+ this->protocol_ = TAO_AV_Core::TAO_AV_RTP_UDP_MCAST;
+ break;
+ case TAO_AV_Core::TAO_AV_SFP_UDP:
+ this->protocol_ = TAO_AV_Core::TAO_AV_SFP_UDP_MCAST;
+ break;
+ case TAO_AV_Core::TAO_AV_USERDEFINED_UDP:
+ this->protocol_ = TAO_AV_Core::TAO_AV_USERDEFINED_UDP_MCAST;
+ break;
+ default:
+ break;
+ }
+ }
+ }
+ break;
+ default:
+ if (TAO_debug_level > 0) ACE_DEBUG ((LM_DEBUG,"ATM support not added yet\n"));
+ }
+ }
+ else
+ {
+ ACE_DEBUG ((LM_DEBUG,
+ "AV BOTH %s \n",
+ protocol_tokenizer[1]));
+
+ TAO_Tokenizer address_tokenizer (protocol_tokenizer[1], ':');
+ TAO_Tokenizer port_tokenizer (address_tokenizer[1], ';');
+ ACE_CString addr;
+ addr += address_tokenizer[0];
+ addr += ":";
+ addr += port_tokenizer[0];
+
+ if (this->protocol_ == TAO_AV_Core::TAO_AV_SCTP_SEQ)
+ {
+
+ ACE_DEBUG ((LM_DEBUG,
+ "Number of local sec addresses = %d\n",
+ port_tokenizer.num_tokens () - 1));
+
+ if (port_tokenizer.num_tokens () - 1 != 0)
+ {
+ ACE_NEW_RETURN (local_sec_addr_, char* [port_tokenizer.num_tokens () - 1],-1);
+ for (int j = 1; j <= port_tokenizer.num_tokens () - 1; j++)
+ {
+ ACE_DEBUG ((LM_DEBUG,
+ "adding addresses to sequence %s\n",
+ port_tokenizer [j]));
+
+ local_sec_addr_ [j-1] = CORBA::string_dup (port_tokenizer [j]);
+ }
+ num_local_sec_addrs_ = port_tokenizer.num_tokens () - 1;
+ }
+ }
+
+ short control_port = static_cast<short> (ACE_OS::atoi(port_tokenizer[0])) + 1;
+ char control_port_str[6];
+ sprintf (control_port_str, "%d", control_port);
+
+ ACE_CString control_addr = "";
+ if (ACE_OS::strcasecmp (this->carrier_protocol_.c_str(),"RTP/UDP") == 0)
+ {
+ control_addr += address_tokenizer[0];
+ control_addr += ":";
+ if (port_tokenizer[1] != 0)
+ control_addr += port_tokenizer[1];
+ else
+ control_addr += control_port_str;
+ }
+
+ switch (this->protocol_)
+ {
+ case TAO_AV_Core::TAO_AV_SFP_UDP:
+ case TAO_AV_Core::TAO_AV_USERDEFINED_UDP:
+ case TAO_AV_Core::TAO_AV_RTP_UDP:
+ case TAO_AV_Core::TAO_AV_TCP:
+ case TAO_AV_Core::TAO_AV_SCTP_SEQ:
+ case TAO_AV_Core::TAO_AV_UDP:
+ case TAO_AV_Core::TAO_AV_QOS_UDP:
+ {
+ this->address_str_ = addr;
+ ACE_INET_Addr *inet_addr;
+ ACE_NEW_RETURN (inet_addr,
+ ACE_INET_Addr (addr.c_str() ),
+ -1);
+ this->clean_up_address_ = 1;
+ this->address_ = inet_addr;
+
+ if (ACE_OS::strcasecmp (this->carrier_protocol_.c_str(),"RTP/UDP") == 0)
+ {
+ ACE_INET_Addr *control_inet_addr;
+ ACE_NEW_RETURN (control_inet_addr,
+ ACE_INET_Addr (control_addr.c_str() ),
+ -1);
+ this->clean_up_control_address_ = 1;
+ this->control_address_ = control_inet_addr;
+ }
+
+ if (IN_CLASSD (inet_addr->get_ip_address ()))
+ {
+ if (TAO_debug_level > 0)
+ ACE_DEBUG ((LM_DEBUG, "TAO_FlowSpec_Entry::parse_address is multicast\n"));
+
+ this->is_multicast_ = 1;
+ switch (this->protocol_)
+ {
+ case TAO_AV_Core::TAO_AV_UDP:
+ this->protocol_ = TAO_AV_Core::TAO_AV_UDP_MCAST;
+ break;
+ case TAO_AV_Core::TAO_AV_RTP_UDP:
+ this->protocol_ = TAO_AV_Core::TAO_AV_RTP_UDP_MCAST;
+ break;
+ case TAO_AV_Core::TAO_AV_SFP_UDP:
+ this->protocol_ = TAO_AV_Core::TAO_AV_SFP_UDP_MCAST;
+ break;
+ case TAO_AV_Core::TAO_AV_USERDEFINED_UDP:
+ this->protocol_ = TAO_AV_Core::TAO_AV_USERDEFINED_UDP_MCAST;
+ break;
+ default:
+ break;
+ }
+ }
+ }
+ break;
+ default:
+ if (TAO_debug_level > 0) ACE_DEBUG ((LM_DEBUG,"ATM support not added yet\n"));
+ }
+ }
+ }
+ ACE_DEBUG ((LM_DEBUG,
+ "Return from parse address\n"));
+ return 0;
+}
+
+char *
+TAO_FlowSpec_Entry::get_local_addr_str (void)
+{
+ if (this->local_addr_ == 0)
+ return 0;
+
+ switch (this->local_addr_->get_type ())
+ {
+ case AF_INET:
+ {
+ char *buf;
+ ACE_NEW_RETURN (buf,
+ char [BUFSIZ],
+ 0);
+
+ ACE_INET_Addr *inet_addr = dynamic_cast<ACE_INET_Addr *> (this->local_addr_);
+ inet_addr->addr_to_string (buf,BUFSIZ);
+ ACE_CString cstring (buf, 0, 0);
+
+ return cstring.rep ();
+ }
+ default:
+ ACE_ERROR_RETURN ((LM_ERROR,"Address family not supported"),0);
+ }
+}
+
+//------------------------------------------------------------
+// TAO_Forward_FlowSpec_Entry
+//------------------------------------------------------------
+
+// default constructor.
+TAO_Forward_FlowSpec_Entry::TAO_Forward_FlowSpec_Entry (void)
+{
+ // no-op.
+}
+
+// constructor to construct the entry from the arguments.
+TAO_Forward_FlowSpec_Entry::TAO_Forward_FlowSpec_Entry (const char *flowname,
+ const char *direction,
+ const char *format_name ,
+ const char *flow_protocol ,
+ const char *carrier_protocol ,
+ ACE_Addr *address,
+ ACE_Addr *control_address )
+ :TAO_FlowSpec_Entry (flowname,
+ direction,
+ format_name,
+ flow_protocol,
+ carrier_protocol,
+ address,
+ control_address)
+{
+ // no-op.
+}
+
+// constructor to construct the entry from the arguments.
+TAO_Forward_FlowSpec_Entry::TAO_Forward_FlowSpec_Entry (const char *flowname,
+ const char *direction,
+ const char *format_name ,
+ const char *flow_protocol ,
+ const char *address )
+ :TAO_FlowSpec_Entry (flowname,
+ direction,
+ format_name,
+ flow_protocol,
+ address)
+{
+ // no-op.
+}
+
+TAO_Forward_FlowSpec_Entry::~TAO_Forward_FlowSpec_Entry (void)
+{
+ // no-op.
+}
+
+int
+TAO_Forward_FlowSpec_Entry::parse (const char *flowSpec_entry)
+{
+ TAO_Tokenizer tokenizer (flowSpec_entry,'\\');
+
+ this->flowname_ = tokenizer [TAO_AV_FLOWNAME];
+
+ if (TAO_debug_level > 0)
+ ACE_DEBUG ((LM_DEBUG,
+ "TAO_Forward_FlowSpec_Entry::parse [%s]\n",
+ flowSpec_entry));
+
+ if (tokenizer [TAO_AV_DIRECTION] != 0)
+ this->set_direction (tokenizer [TAO_AV_DIRECTION]);
+
+ if (tokenizer [TAO_AV_FORMAT] != 0)
+ this->format_ = tokenizer [TAO_AV_FORMAT];
+
+ if (tokenizer [TAO_AV_ADDRESS] != 0)
+ if (this->parse_address (tokenizer [TAO_AV_ADDRESS], TAO_AV_Core::TAO_AV_BOTH) < 0)
+ return -1;
+
+ if (tokenizer [TAO_AV_PEER_ADDR] != 0)
+ {
+ ACE_INET_Addr *addr = 0;
+
+
+ if (this->protocol_ == TAO_AV_Core::TAO_AV_SCTP_SEQ)
+ {
+ TAO_Tokenizer addr_token (tokenizer [TAO_AV_PEER_ADDR], ';');
+
+ ACE_DEBUG ((LM_DEBUG,
+ "Number of peer sec addresses = %d\n",
+ addr_token.num_tokens () - 1));
+
+ if (addr_token.num_tokens () != 0)
+ {
+ ACE_NEW_RETURN (addr,
+ ACE_INET_Addr (addr_token [0]),
+ 0);
+
+ ACE_NEW_RETURN (peer_sec_addr_, char* [addr_token.num_tokens () - 1],-1);
+ for (int j = 1; j <= addr_token.num_tokens () - 1; j++)
+ {
+ ACE_DEBUG ((LM_DEBUG,
+ "adding addresses to sequence %s\n",
+ addr_token [j]));
+
+ peer_sec_addr_ [j-1] = CORBA::string_dup (addr_token [j]);
+ }
+ num_peer_sec_addrs_ = addr_token.num_tokens () - 1;
+ }
+ }
+ else
+ {
+ ACE_NEW_RETURN (addr,
+ ACE_INET_Addr (tokenizer [TAO_AV_PEER_ADDR]),
+ 0);
+ }
+ this->delete_peer_addr_ = true;
+ this->peer_addr_ = addr;
+
+ char buf [BUFSIZ];
+ addr->addr_to_string (buf, BUFSIZ);
+ ACE_DEBUG ((LM_DEBUG,
+ "Peer Address %s \n",
+ buf));
+
+ }
+
+ if (tokenizer [TAO_AV_FLOW_PROTOCOL] != 0)
+ if (this->parse_flow_protocol_string (tokenizer [TAO_AV_FLOW_PROTOCOL]) < 0)
+ return -1;
+
+ return 0;
+}
+
+TAO_FlowSpec_Entry::Role
+TAO_Forward_FlowSpec_Entry::role (void)
+{
+ if (this->role_ != TAO_AV_INVALID_ROLE)
+ return this->role_;
+
+ switch (this->direction_)
+ {
+ case TAO_AV_DIR_IN:
+ // Forward IN means we're the Source.
+ return TAO_AV_PRODUCER;
+ case TAO_AV_DIR_OUT:
+ // Forward out means we're the sink.
+ return TAO_AV_CONSUMER;
+ default:
+ return TAO_AV_INVALID_ROLE;
+ }
+}
+
+const char *
+TAO_Forward_FlowSpec_Entry::entry_to_string (void)
+{
+ if (this->flowname_.length() == 0)
+ return "";
+
+ char address [BUFSIZ];
+ ACE_CString address_str;
+ ACE_CString peer_address_str;
+
+ if (this->address_ != 0)
+ {
+ switch (this->protocol_)
+ {
+ case TAO_AV_Core::TAO_AV_SFP_UDP:
+ case TAO_AV_Core::TAO_AV_SFP_UDP_MCAST:
+ case TAO_AV_Core::TAO_AV_USERDEFINED_UDP:
+ case TAO_AV_Core::TAO_AV_USERDEFINED_UDP_MCAST:
+ case TAO_AV_Core::TAO_AV_RTP_UDP:
+ case TAO_AV_Core::TAO_AV_RTP_UDP_MCAST:
+ case TAO_AV_Core::TAO_AV_UDP:
+ case TAO_AV_Core::TAO_AV_QOS_UDP:
+ case TAO_AV_Core::TAO_AV_UDP_MCAST:
+ case TAO_AV_Core::TAO_AV_TCP:
+ case TAO_AV_Core::TAO_AV_SCTP_SEQ:
+ {
+ ACE_INET_Addr *inet_addr = dynamic_cast<ACE_INET_Addr*> (this->address_);
+ inet_addr->addr_to_string (address,BUFSIZ);
+ }
+ break;
+ default:
+ break;
+ }
+ ACE_CString cstring (address);
+
+ address_str = this->carrier_protocol_;
+ address_str += "=";
+ address_str += cstring;
+
+ if (this->protocol_ == TAO_AV_Core::TAO_AV_SCTP_SEQ)
+ {
+ for (int i = 0; i < this->num_local_sec_addrs_; i++)
+ {
+ address_str += ";";
+ address_str += this->local_sec_addr_ [i];
+ }
+ }
+
+ }
+ else
+ {
+ address_str = this->carrier_protocol_;
+ }
+
+
+ if ( (this->address_ != 0) &&
+ (this->control_address_ == 0) &&
+ (ACE_OS::strncasecmp (this->flow_protocol_.c_str(), "RTP", 3) == 0))
+ {
+ u_short control_port;
+
+ switch (this->protocol_)
+ {
+ case TAO_AV_Core::TAO_AV_SFP_UDP:
+ case TAO_AV_Core::TAO_AV_SFP_UDP_MCAST:
+ case TAO_AV_Core::TAO_AV_USERDEFINED_UDP:
+ case TAO_AV_Core::TAO_AV_USERDEFINED_UDP_MCAST:
+ case TAO_AV_Core::TAO_AV_RTP_UDP:
+ case TAO_AV_Core::TAO_AV_RTP_UDP_MCAST:
+ case TAO_AV_Core::TAO_AV_UDP:
+ case TAO_AV_Core::TAO_AV_QOS_UDP:
+ case TAO_AV_Core::TAO_AV_UDP_MCAST:
+ case TAO_AV_Core::TAO_AV_TCP:
+ case TAO_AV_Core::TAO_AV_SCTP_SEQ:
+ {
+ ACE_INET_Addr *inet_addr = dynamic_cast<ACE_INET_Addr*> (this->address_);
+ control_port = inet_addr->get_port_number() + 1;
+ ACE_INET_Addr *inet_control_addr;
+ ACE_NEW_RETURN (inet_control_addr,
+ ACE_INET_Addr (control_port, inet_addr->get_host_addr ()),
+ "");
+ this->control_address_ = inet_control_addr;
+ }
+ break;
+ default:
+ break;
+ }
+ }
+
+
+ if (this->peer_addr_ != 0)
+ {
+ switch (this->protocol_)
+ {
+ case TAO_AV_Core::TAO_AV_SFP_UDP:
+ case TAO_AV_Core::TAO_AV_SFP_UDP_MCAST:
+ case TAO_AV_Core::TAO_AV_USERDEFINED_UDP:
+ case TAO_AV_Core::TAO_AV_USERDEFINED_UDP_MCAST:
+ case TAO_AV_Core::TAO_AV_RTP_UDP:
+ case TAO_AV_Core::TAO_AV_RTP_UDP_MCAST:
+ case TAO_AV_Core::TAO_AV_UDP:
+ case TAO_AV_Core::TAO_AV_QOS_UDP:
+ case TAO_AV_Core::TAO_AV_UDP_MCAST:
+ case TAO_AV_Core::TAO_AV_TCP:
+ case TAO_AV_Core::TAO_AV_SCTP_SEQ:
+ {
+ ACE_INET_Addr *inet_addr = dynamic_cast<ACE_INET_Addr*> (this->peer_addr_);
+ inet_addr->addr_to_string (address,BUFSIZ);
+ //inet_addr->get_host_name (address, BUFSIZ);
+
+ //cstring += ACE_OS::itoa (address, BUFSIZ, inet_addr->get_port_number ());
+
+ }
+ break;
+ default:
+ break;
+ }
+
+ ACE_CString cstring (address);
+
+ //peer_address_str = this->carrier_protocol_;
+ //peer_address_str += "=";
+ peer_address_str += cstring;
+
+ if (this->protocol_ == TAO_AV_Core::TAO_AV_SCTP_SEQ)
+ {
+ for (int i = 0; i < this->num_peer_sec_addrs_; i++)
+ {
+ peer_address_str += ";";
+ peer_address_str += this->peer_sec_addr_ [i];
+ }
+ }
+
+ }
+
+ if (this->control_address_ != 0)
+ {
+ u_short control_port = 0;
+
+ switch (this->protocol_)
+ {
+ case TAO_AV_Core::TAO_AV_SFP_UDP:
+ case TAO_AV_Core::TAO_AV_SFP_UDP_MCAST:
+ case TAO_AV_Core::TAO_AV_USERDEFINED_UDP:
+ case TAO_AV_Core::TAO_AV_USERDEFINED_UDP_MCAST:
+ case TAO_AV_Core::TAO_AV_RTP_UDP:
+ case TAO_AV_Core::TAO_AV_RTP_UDP_MCAST:
+ case TAO_AV_Core::TAO_AV_UDP:
+ case TAO_AV_Core::TAO_AV_QOS_UDP:
+ case TAO_AV_Core::TAO_AV_UDP_MCAST:
+ case TAO_AV_Core::TAO_AV_TCP:
+ case TAO_AV_Core::TAO_AV_SCTP_SEQ:
+ {
+ ACE_INET_Addr *inet_addr = dynamic_cast<ACE_INET_Addr*> (this->control_address_);
+ control_port = inet_addr->get_port_number();
+ }
+ break;
+ default:
+ break;
+ }
+
+ address_str += ";";
+ char port_str[10];
+ sprintf(port_str, "%u", control_port);
+ address_str += port_str;
+ }
+
+ this->entry_ = this->flowname_;
+ this->entry_ += "\\";
+ this->entry_ += this->direction_str_;
+ this->entry_ += "\\";
+ this->entry_ += this->format_;
+ this->entry_ += "\\";
+ this->entry_ += this->flow_protocol_;
+ this->entry_ += "\\";
+ this->entry_ += address_str;
+
+ if (this->peer_addr_ != 0)
+ {
+ this->entry_ += "\\";
+ this->entry_ += peer_address_str;
+ }
+ else ACE_DEBUG ((LM_DEBUG,
+ "No peer address specified\n"));
+
+ if (TAO_debug_level > 0)
+ ACE_DEBUG ((LM_DEBUG,"Forward entry_to_string: entry = %s\n",this->entry_.c_str()));
+
+ return this->entry_.c_str();
+}
+
+//------------------------------------------------------------
+// TAO_Reverse_FlowSpec_Entry
+//------------------------------------------------------------
+
+//default constructor.
+TAO_Reverse_FlowSpec_Entry::TAO_Reverse_FlowSpec_Entry (void)
+{
+ // no-op
+}
+
+// constructor to construct an entry from the arguments.
+TAO_Reverse_FlowSpec_Entry::TAO_Reverse_FlowSpec_Entry (const char *flowname,
+ const char *direction,
+ const char *format_name ,
+ const char *flow_protocol ,
+ const char *carrier_protocol,
+ ACE_Addr *address,
+ ACE_Addr *control_address )
+ :TAO_FlowSpec_Entry (flowname,
+ direction,
+ format_name,
+ flow_protocol,
+ carrier_protocol,
+ address,
+ control_address)
+{
+ // no-op
+}
+
+// constructor to construct an entry from the arguments.
+TAO_Reverse_FlowSpec_Entry::TAO_Reverse_FlowSpec_Entry (const char *flowname,
+ const char *direction,
+ const char *format_name ,
+ const char *flow_protocol ,
+ const char *address)
+ :TAO_FlowSpec_Entry (flowname,
+ direction,
+ format_name,
+ flow_protocol,
+ address)
+{
+ // no-op.
+}
+
+TAO_Reverse_FlowSpec_Entry::~TAO_Reverse_FlowSpec_Entry (void)
+{
+ // no-op.
+}
+
+TAO_FlowSpec_Entry::Role
+TAO_Reverse_FlowSpec_Entry::role (void)
+{
+ if (this->role_ != TAO_AV_INVALID_ROLE)
+ return this->role_;
+ switch (this->direction_)
+ {
+ case TAO_AV_DIR_IN:
+ // Forward IN means we're the Source.
+ return TAO_AV_CONSUMER;
+ case TAO_AV_DIR_OUT:
+ // Forward out means we're the sink.
+ return TAO_AV_PRODUCER;
+ default:
+ return TAO_AV_INVALID_ROLE;
+ }
+}
+
+int
+TAO_Reverse_FlowSpec_Entry::parse (const char *flowSpec_entry)
+{
+ TAO_Tokenizer tokenizer (flowSpec_entry,'\\');
+ this->flowname_ = tokenizer [TAO_AV_FLOWNAME];
+
+ if (TAO_debug_level > 0)
+ ACE_DEBUG ((LM_DEBUG,
+ "TAO_Reverse_FlowSpec_Entry::parse [%s]\n",
+ flowSpec_entry));
+
+ if (tokenizer [TAO_AV_ADDRESS] != 0)
+ if (this->parse_address (tokenizer [TAO_AV_ADDRESS], TAO_AV_Core::TAO_AV_BOTH) < 0)
+ return -1;
+
+ if (tokenizer [TAO_AV_FLOW_PROTOCOL] != 0)
+ if (this->parse_flow_protocol_string (tokenizer [TAO_AV_FLOW_PROTOCOL]) < 0)
+ return -1;
+
+// if (tokenizer [TAO_AV_DIRECTION] != 0)
+// this->set_direction (tokenizer [TAO_AV_DIRECTION]);
+
+// if (tokenizer [TAO_AV_FORMAT] != 0)
+// this->format_ = tokenizer [TAO_AV_FORMAT];
+
+ return 0;
+}
+
+
+const char *
+TAO_Reverse_FlowSpec_Entry::entry_to_string (void)
+{
+ if (this->flowname_.length() == 0)
+ return "";
+
+ char address [BUFSIZ];
+ ACE_CString address_str;
+ if (this->address_ != 0)
+ {
+ switch (this->protocol_)
+ {
+ case TAO_AV_Core::TAO_AV_RTP_UDP:
+ case TAO_AV_Core::TAO_AV_UDP:
+ case TAO_AV_Core::TAO_AV_QOS_UDP:
+ case TAO_AV_Core::TAO_AV_UDP_MCAST:
+ case TAO_AV_Core::TAO_AV_TCP:
+ case TAO_AV_Core::TAO_AV_SCTP_SEQ:
+ case TAO_AV_Core::TAO_AV_SFP_UDP:
+ case TAO_AV_Core::TAO_AV_USERDEFINED_UDP:
+ {
+ ACE_INET_Addr *inet_addr = dynamic_cast<ACE_INET_Addr*> (this->address_);
+ inet_addr->addr_to_string (address,BUFSIZ);
+ }
+ break;
+ default:
+ break;
+ }
+ ACE_CString cstring (address);
+
+ address_str = this->carrier_protocol_;
+ address_str += "=";
+ address_str += cstring;
+
+ if (this->protocol_ == TAO_AV_Core::TAO_AV_SCTP_SEQ)
+ {
+ for (int i = 0; i < this->num_local_sec_addrs_; i++)
+ {
+ address_str += ";";
+ address_str += this->local_sec_addr_ [i];
+ }
+ }
+
+ }
+ else
+ {
+ address_str = "";
+ }
+
+ if (this->control_address_ != 0)
+ {
+ u_short control_port = 0;
+
+
+ switch (this->protocol_)
+ {
+ case TAO_AV_Core::TAO_AV_SFP_UDP:
+ case TAO_AV_Core::TAO_AV_SFP_UDP_MCAST:
+ case TAO_AV_Core::TAO_AV_USERDEFINED_UDP:
+ case TAO_AV_Core::TAO_AV_USERDEFINED_UDP_MCAST:
+ case TAO_AV_Core::TAO_AV_RTP_UDP:
+ case TAO_AV_Core::TAO_AV_RTP_UDP_MCAST:
+ case TAO_AV_Core::TAO_AV_UDP:
+ case TAO_AV_Core::TAO_AV_QOS_UDP:
+ case TAO_AV_Core::TAO_AV_UDP_MCAST:
+ case TAO_AV_Core::TAO_AV_TCP:
+ case TAO_AV_Core::TAO_AV_SCTP_SEQ:
+ {
+ ACE_INET_Addr *inet_addr = dynamic_cast<ACE_INET_Addr*> (this->control_address_);
+ control_port = inet_addr->get_port_number();
+ }
+ break;
+ default:
+ break;
+ }
+
+ address_str += ";";
+ char port_str[10];
+ sprintf(port_str, "%u", control_port);
+ address_str += port_str;
+
+ }
+
+ this->entry_ = this->flowname_;
+ this->entry_ += "\\";
+ this->entry_ += address_str;
+ this->entry_ += "\\";
+ this->entry_ += this->flow_protocol_;
+// this->entry_ += "\\";
+// this->entry_ += this->direction_str_;
+// this->entry_ += "\\";
+// this->entry_ += format_;
+
+ if (TAO_debug_level > 0) ACE_DEBUG ((LM_DEBUG,"Reverse entry_to_string: entry = %s\n",this->entry_.c_str() ));
+ return this->entry_.c_str();
+}
+
+TAO_END_VERSIONED_NAMESPACE_DECL
diff --git a/TAO/orbsvcs/orbsvcs/AV/FlowSpec_Entry.h b/TAO/orbsvcs/orbsvcs/AV/FlowSpec_Entry.h
new file mode 100644
index 00000000000..58f018bc45e
--- /dev/null
+++ b/TAO/orbsvcs/orbsvcs/AV/FlowSpec_Entry.h
@@ -0,0 +1,359 @@
+// -*- C++ -*-
+
+// ============================================================================
+/**
+ * @file FlowSpec_Entry.h
+ *
+ * $Id$
+ *
+ * @author Nagarajan Surendran <naga@cs.wustl.edu>
+ *
+ */
+// ============================================================================
+
+#ifndef TAO_AV_FLOWSPEC_ENTRY_H
+#define TAO_AV_FLOWSPEC_ENTRY_H
+#include /**/ "ace/pre.h"
+
+#include "orbsvcs/AV/AV_export.h"
+#include "orbsvcs/AV/AV_Core.h"
+#include "ace/Addr.h"
+#include "ace/Containers.h"
+#include "ace/SString.h"
+
+
+TAO_BEGIN_VERSIONED_NAMESPACE_DECL
+
+/**
+ * @class TAO_Tokenizer
+ * @brief
+ */
+class TAO_AV_Export TAO_Tokenizer
+{
+public:
+ /// constructor.
+ TAO_Tokenizer (const char *string,char delimiter);
+
+ /// destructor.
+ ~TAO_Tokenizer (void);
+
+ /// parses the string and tokenizes it.
+ int parse (const char *string,char delimiter);
+
+ /// Returns the next token.
+ char *token (void);
+
+ /// Number of tokens.
+ int num_tokens (void);
+
+ const char *operator [] (size_t index) const;
+
+protected:
+ ACE_Array<char*> token_array_;
+ size_t count_;
+ size_t num_tokens_;
+ char string_ [BUFSIZ];
+};
+
+// Forward declaration.
+class TAO_AV_Transport;
+class TAO_AV_Flow_Handler;
+class TAO_AV_Protocol_Object;
+
+/**
+ * @class TAO_FlowSpec_Entry
+ * @brief A helper entry class in the flow spec sequence passed to
+ * bind_devs.
+ */
+class TAO_AV_Export TAO_FlowSpec_Entry
+{
+public:
+
+ enum Direction
+ {
+ TAO_AV_INVALID = -1,
+ TAO_AV_DIR_IN = 0,
+ TAO_AV_DIR_OUT = 1
+ };
+
+ enum Role
+ {
+ TAO_AV_INVALID_ROLE = -1,
+ TAO_AV_PRODUCER = 0,
+ TAO_AV_CONSUMER = 1
+ };
+
+ /// default constructor.
+ TAO_FlowSpec_Entry (void);
+
+ /// constructor to construct an entry from the arguments.
+ TAO_FlowSpec_Entry (const char *flowname,
+ const char *direction,
+ const char *format_name,
+ const char *flow_protocol,
+ const char *carrier_protocol,
+ ACE_Addr *fwd_address,
+ //ACE_Addr *peer_address,
+ ACE_Addr *control_address = 0);
+
+ TAO_FlowSpec_Entry (const char *flowname,
+ const char *direction,
+ const char *format_name,
+ const char *flow_protocol,
+ const char *fwd_address);
+ //const char *peer_address);
+
+ /// construct the entry from a string specified by the flowSpec grammar.
+ virtual int parse (const char* flowSpec_entry) = 0;
+
+ /// virtual destructor.
+ virtual ~TAO_FlowSpec_Entry (void);
+
+ /// accessor to the direction.
+ int direction (void);
+
+ virtual Role role (void) = 0;
+ void role (Role role);
+ /// accessor to string version of direction .
+ const char * direction_str (void) const;
+
+ /// accessor to the flow protocol string.
+ const char *flow_protocol_str (void) const;
+
+ /// set the flow protocol string.
+ void flow_protocol_str (const char *flow_protocol_str);
+
+ /// accessor to address of the carrier protocol.
+ //ACE_Addr *fwd_address (void);
+ ACE_Addr *address (void);
+ ACE_Addr *control_address (void);
+ void address (ACE_Addr *address);
+ void control_address (ACE_Addr *address);
+
+ /// Address in string format i. hostname:port.
+ const char *address_str (void) const;
+ // const char * peer_address_str (void) const;
+
+ /// accessor to carrier protocol i.e TCP,UDP,RTP/UDP.
+ TAO_AV_Core::Protocol carrier_protocol (void);
+
+ /// accessor to string version of carrier protocol.
+ const char * carrier_protocol_str (void) const;
+
+ /// accessor to format to be used for this flow.
+ const char *format (void) const;
+
+ /// accessor to name of this flow.
+ const char *flowname (void) const;
+
+ /// converts the entry to a string.
+ virtual const char *entry_to_string (void) = 0;
+
+ int set_peer_addr (ACE_Addr *peer_addr);
+ ACE_Addr *get_peer_addr (void);
+ int set_peer_control_addr (ACE_Addr *peer_control_addr);
+ ACE_Addr *get_peer_control_addr (void);
+
+ int set_local_sec_addr (char** local_sec_addr, int size);
+ char** get_local_sec_addr (void);
+ int num_local_sec_addrs (void);
+
+ int set_peer_sec_addr (char** peer_sec_addr, int size);
+ char** get_peer_sec_addr (void);
+ int num_peer_sec_addrs (void);
+
+ int set_local_addr (ACE_Addr *local_addr);
+ ACE_Addr *get_local_addr (void);
+ char *get_local_addr_str (void);
+ int set_local_control_addr (ACE_Addr *local_control_addr);
+ ACE_Addr *get_local_control_addr (void);
+ char *get_local_control_addr_str (void);
+
+ TAO_AV_Transport *transport (void);
+ void transport (TAO_AV_Transport *transport);
+ TAO_AV_Transport *control_transport (void);
+ void control_transport (TAO_AV_Transport *control_transport);
+
+ TAO_AV_Flow_Handler* handler (void);
+ void handler (TAO_AV_Flow_Handler *handler);
+ TAO_AV_Flow_Handler* control_handler (void);
+ void control_handler (TAO_AV_Flow_Handler *control_handler);
+
+ TAO_AV_Protocol_Object* protocol_object (void);
+ void protocol_object (TAO_AV_Protocol_Object *object);
+ TAO_AV_Protocol_Object* control_protocol_object (void);
+ void control_protocol_object (TAO_AV_Protocol_Object *object);
+
+ /// sets the address for this flow.
+ int parse_address (const char *format_string,
+ TAO_AV_Core::Flow_Component flow_component);
+
+ /// returns true for a multicast address.
+ int is_multicast (void);
+
+protected:
+
+ /// parses the flow protocol string with tokens separated by :
+ int parse_flow_protocol_string (const char *flow_options_string);
+
+ /// sets the direction flag.
+ int set_direction (const char *direction_string);
+
+ /// sets the protocol_ enum from the carrier_protocol_ string.
+ int set_protocol (void);
+
+ /// Addr information for the carrier protocol.
+ ACE_Addr *address_;
+ int clean_up_address_; // added to clean up a memory leak
+ ACE_Addr *control_address_;
+ int clean_up_control_address_; // added to clean up a memory leak
+
+ /// Fwd Addr in string format i.e hostname:port.
+ ACE_CString address_str_;
+
+ /// Peer Addr in string format i.e hostname:port.
+ ACE_CString peer_address_str_;
+
+ /// format string.
+ ACE_CString format_;
+
+ /// Direction of this flow.
+ Direction direction_;
+
+ /// string representation of the direction.
+ ACE_CString direction_str_;
+
+ /// name of this flow.
+ ACE_CString flowname_;
+
+ /// name of the protocol used.
+ TAO_AV_Core::Protocol protocol_;
+
+ /// carrier protocol string.
+ ACE_CString carrier_protocol_;
+
+ /// flow protocol string.
+ ACE_CString flow_protocol_;
+
+ int use_flow_protocol_;
+
+ /// The flowspec entry;
+ ACE_CString entry_;
+
+ int is_multicast_;
+ bool delete_peer_addr_;
+ ACE_Addr *peer_addr_;
+ char** local_sec_addr_;
+ int num_local_sec_addrs_;
+ char** peer_sec_addr_;
+ int num_peer_sec_addrs_;
+ ACE_Addr *peer_control_addr_;
+ ACE_Addr *local_addr_;
+ ACE_Addr *local_control_addr_;
+ TAO_AV_Transport *transport_;
+ TAO_AV_Transport *control_transport_;
+ TAO_AV_Flow_Handler *handler_;
+ TAO_AV_Flow_Handler *control_handler_;
+ TAO_AV_Protocol_Object *protocol_object_;
+ TAO_AV_Protocol_Object *control_protocol_object_;
+ Role role_;
+};
+
+
+/**
+ * @class TAO_Forward_FlowSpec_Entry
+ */
+class TAO_AV_Export TAO_Forward_FlowSpec_Entry
+ : public TAO_FlowSpec_Entry
+{
+public:
+ enum Position {TAO_AV_FLOWNAME = 0,
+ TAO_AV_DIRECTION = 1,
+ TAO_AV_FORMAT = 2,
+ TAO_AV_FLOW_PROTOCOL = 3,
+ TAO_AV_ADDRESS = 4,
+ TAO_AV_PEER_ADDR = 5};
+
+ /// default constructor.
+ TAO_Forward_FlowSpec_Entry (void);
+
+ /// constructor to construct an entry from the arguments.
+ TAO_Forward_FlowSpec_Entry (const char *flowname,
+ const char *direction,
+ const char *format_name,
+ const char *flow_protocol,
+ const char *carrier_protocol,
+ ACE_Addr *address,
+ ACE_Addr *control_address = 0);
+
+ TAO_Forward_FlowSpec_Entry (const char *flowname,
+ const char *direction,
+ const char *format_name,
+ const char *flow_protocol,
+ const char *address);
+
+ virtual ~TAO_Forward_FlowSpec_Entry (void);
+
+ /// converts the entry to a string.
+ virtual const char *entry_to_string (void);
+
+ virtual Role role (void);
+
+ /// construct the entry from a string specified by the flowSpec grammar.
+ virtual int parse (const char* flowSpec_entry);
+};
+
+/**
+ * @class TAO_Reverse_FlowSpec_Entry
+ * @brief
+ */
+class TAO_AV_Export TAO_Reverse_FlowSpec_Entry
+ :public TAO_FlowSpec_Entry
+{
+public:
+ enum Position {TAO_AV_FLOWNAME = 0,
+ TAO_AV_ADDRESS = 1,
+ TAO_AV_FLOW_PROTOCOL = 2,
+ TAO_AV_DIRECTION = 3,
+ TAO_AV_FORMAT = 4};
+
+ // default constructor.
+ TAO_Reverse_FlowSpec_Entry (void);
+
+ // constructor to construct an entry from the arguments.
+ TAO_Reverse_FlowSpec_Entry (const char *flowname,
+ const char *direction,
+ const char *format_name,
+ const char *flow_protocol,
+ const char *carrier_protocol,
+ ACE_Addr *address,
+ ACE_Addr *control_address = 0);
+
+ // Takes the address in protocol=endpoint form.
+ TAO_Reverse_FlowSpec_Entry (const char *flowname,
+ const char *direction,
+ const char *format_name,
+ const char *flow_protocol,
+ const char *address);
+
+ virtual ~TAO_Reverse_FlowSpec_Entry (void);
+
+ /// converts the entry to a string.
+ virtual const char *entry_to_string (void);
+
+ virtual Role role (void);
+
+ /// construct the entry from a string specified by the flowSpec grammar.
+ virtual int parse (const char* flowSpec_entry);
+};
+
+TAO_END_VERSIONED_NAMESPACE_DECL
+
+#include "orbsvcs/AV/Transport.h"
+
+#if defined (__ACE_INLINE__)
+#include "orbsvcs/AV/FlowSpec_Entry.i"
+#endif /* __ACE_INLINE__ */
+
+#include /**/ "ace/post.h"
+#endif /* TAO_AV_FLOWSPEC_ENTRY_H */
diff --git a/TAO/orbsvcs/orbsvcs/AV/FlowSpec_Entry.i b/TAO/orbsvcs/orbsvcs/AV/FlowSpec_Entry.i
new file mode 100644
index 00000000000..3af4438dd98
--- /dev/null
+++ b/TAO/orbsvcs/orbsvcs/AV/FlowSpec_Entry.i
@@ -0,0 +1,347 @@
+// -*- C++ -*-
+//
+// $Id$
+
+#include "ace/OS_NS_strings.h"
+
+TAO_BEGIN_VERSIONED_NAMESPACE_DECL
+
+ACE_INLINE
+int
+TAO_FlowSpec_Entry::set_direction (const char *direction)
+{
+ this->direction_str_ = direction;
+ if (direction == 0)
+ {
+ this->direction_ = TAO_AV_INVALID;
+ return -1;
+ }
+ if (ACE_OS::strcasecmp (direction,"in") == 0)
+ this->direction_ = TAO_AV_DIR_IN;
+ else if (ACE_OS::strcasecmp (direction,"out") == 0)
+ this->direction_ = TAO_AV_DIR_OUT;
+ return 0;
+}
+
+ACE_INLINE
+int
+TAO_FlowSpec_Entry::parse_flow_protocol_string (const char *flow_string)
+{
+ if (flow_string == 0)
+ return 0;
+
+ if (ACE_OS::strcmp (flow_string,"") == 0)
+ return 0;
+
+ this->use_flow_protocol_ = 1;
+ // do some flow protocol processing.
+ this->flow_protocol_ = flow_string;
+
+ return 0;
+}
+
+ACE_INLINE
+int
+TAO_FlowSpec_Entry::direction (void)
+{
+ return this->direction_;
+}
+
+ACE_INLINE
+const char *
+TAO_FlowSpec_Entry::direction_str (void) const
+{
+ return this->direction_str_.c_str();
+}
+
+ACE_INLINE
+const char *
+TAO_FlowSpec_Entry::flow_protocol_str (void) const
+{
+ return this->flow_protocol_.c_str();
+}
+
+ACE_INLINE
+void
+TAO_FlowSpec_Entry::flow_protocol_str (const char *str)
+{
+ this->flow_protocol_ = CORBA::string_dup (str);
+}
+
+ACE_INLINE
+TAO_AV_Core::Protocol
+TAO_FlowSpec_Entry::carrier_protocol (void)
+{
+ return this->protocol_;
+}
+
+ACE_INLINE
+const char *
+TAO_FlowSpec_Entry::carrier_protocol_str (void) const
+{
+ return this->carrier_protocol_.c_str();
+}
+
+ACE_INLINE
+ACE_Addr *
+TAO_FlowSpec_Entry::address (void)
+{
+ return this->address_;
+}
+
+ACE_INLINE
+void
+TAO_FlowSpec_Entry::address (ACE_Addr *addr)
+{
+ this->address_ = addr;
+}
+
+ACE_INLINE
+ACE_Addr *
+TAO_FlowSpec_Entry::control_address (void)
+{
+ return this->control_address_;
+}
+
+ACE_INLINE
+void
+TAO_FlowSpec_Entry::control_address (ACE_Addr *addr)
+{
+ this->control_address_ = addr;
+}
+
+ACE_INLINE
+const char *
+TAO_FlowSpec_Entry::address_str (void) const
+{
+ return this->address_str_.c_str();
+}
+
+ACE_INLINE
+const char*
+TAO_FlowSpec_Entry::format (void) const
+{
+ return this->format_.c_str();
+}
+
+ACE_INLINE
+const char *
+TAO_FlowSpec_Entry::flowname (void) const
+{
+ return this->flowname_.c_str();
+}
+
+
+ACE_INLINE
+int
+TAO_FlowSpec_Entry::set_peer_addr (ACE_Addr *peer_addr)
+{
+ if (this->delete_peer_addr_)
+ delete this->peer_addr_;
+
+ this->delete_peer_addr_ = false;
+ this->peer_addr_ = peer_addr;
+
+ if (this->handler_ != 0)
+ this->handler_->set_remote_address (peer_addr);
+ return 0;
+}
+
+ACE_INLINE
+ACE_Addr *
+TAO_FlowSpec_Entry::get_peer_addr (void)
+{
+ return this->peer_addr_;
+}
+
+ACE_INLINE
+int
+TAO_FlowSpec_Entry::set_local_addr (ACE_Addr *local_addr)
+{
+ this->local_addr_ = local_addr;
+ return 0;
+}
+
+ACE_INLINE
+int
+TAO_FlowSpec_Entry::set_local_control_addr (ACE_Addr *local_addr)
+{
+ this->local_control_addr_ = local_addr;
+ return 0;
+}
+
+ACE_INLINE
+ACE_Addr*
+TAO_FlowSpec_Entry::get_local_addr (void)
+{
+ return this->local_addr_;
+}
+
+ACE_INLINE
+ACE_Addr*
+TAO_FlowSpec_Entry::get_local_control_addr (void)
+{
+ return this->local_control_addr_;
+}
+
+ACE_INLINE
+int
+TAO_FlowSpec_Entry::set_local_sec_addr (char** local_sec_addr,
+ int size)
+{
+ this->local_sec_addr_ = local_sec_addr;
+ this->num_local_sec_addrs_ = size;
+ return 0;
+}
+
+ACE_INLINE
+char**
+TAO_FlowSpec_Entry::get_local_sec_addr (void)
+{
+ return this->local_sec_addr_;
+}
+
+ACE_INLINE
+int
+TAO_FlowSpec_Entry::num_local_sec_addrs (void)
+{
+ return this->num_local_sec_addrs_;
+}
+
+ACE_INLINE
+int
+TAO_FlowSpec_Entry::set_peer_sec_addr (char** peer_sec_addr,
+ int size)
+{
+ this->peer_sec_addr_ = peer_sec_addr;
+ this->num_peer_sec_addrs_ = size;
+ return 0;
+}
+
+ACE_INLINE
+char**
+TAO_FlowSpec_Entry::get_peer_sec_addr (void)
+{
+ return this->peer_sec_addr_;
+}
+
+ACE_INLINE
+int
+TAO_FlowSpec_Entry::num_peer_sec_addrs (void)
+{
+ return this->num_peer_sec_addrs_;
+}
+
+ACE_INLINE
+TAO_AV_Transport*
+TAO_FlowSpec_Entry::transport (void)
+{
+ return this->transport_;
+}
+
+ACE_INLINE
+void
+TAO_FlowSpec_Entry::transport (TAO_AV_Transport *transport)
+{
+ this->transport_ = transport;
+}
+
+ACE_INLINE
+TAO_AV_Transport*
+TAO_FlowSpec_Entry::control_transport (void)
+{
+ return this->control_transport_;
+}
+
+ACE_INLINE
+void
+TAO_FlowSpec_Entry::control_transport (TAO_AV_Transport *control_transport)
+{
+ this->control_transport_ = control_transport;
+}
+
+ACE_INLINE
+TAO_AV_Flow_Handler *
+TAO_FlowSpec_Entry::handler (void)
+{
+ return this->handler_;
+}
+
+ACE_INLINE
+TAO_AV_Flow_Handler *
+TAO_FlowSpec_Entry::control_handler (void)
+{
+ return this->control_handler_;
+}
+
+ACE_INLINE
+void
+TAO_FlowSpec_Entry::handler (TAO_AV_Flow_Handler *handler)
+{
+ this->handler_ = handler;
+
+// // Now remove the handler from the reactor if the handler is for a producer.
+// switch (this->role ())
+// {
+// case TAO_AV_PRODUCER:
+// {
+// ACE_Event_Handler *event_handler = handler->event_handler ();
+// int result = event_handler->reactor ()->remove_handler (event_handler,
+// ACE_Event_Handler::READ_MASK);
+// if (result < 0)
+// ACE_ERROR ((LM_ERROR,"TAO_FlowSpec_Entry::handler\n"));
+// break;
+// }
+// }
+}
+
+ACE_INLINE
+void
+TAO_FlowSpec_Entry::control_handler (TAO_AV_Flow_Handler *handler)
+{
+ this->control_handler_ = handler;
+}
+
+ACE_INLINE
+TAO_AV_Protocol_Object*
+TAO_FlowSpec_Entry::protocol_object (void)
+{
+ return this->protocol_object_;
+}
+
+ACE_INLINE
+void
+TAO_FlowSpec_Entry::protocol_object (TAO_AV_Protocol_Object *object)
+{
+ this->protocol_object_ = object;
+}
+
+ACE_INLINE
+TAO_AV_Protocol_Object*
+TAO_FlowSpec_Entry::control_protocol_object (void)
+{
+ return this->control_protocol_object_;
+}
+
+ACE_INLINE
+void
+TAO_FlowSpec_Entry::control_protocol_object (TAO_AV_Protocol_Object *object)
+{
+ this->control_protocol_object_ = object;
+}
+
+ACE_INLINE
+int
+TAO_FlowSpec_Entry::is_multicast (void)
+{
+ return this->is_multicast_;
+}
+
+ACE_INLINE
+void
+TAO_FlowSpec_Entry::role (TAO_FlowSpec_Entry::Role role)
+{
+ this->role_ = role;
+}
+
+TAO_END_VERSIONED_NAMESPACE_DECL
diff --git a/TAO/orbsvcs/orbsvcs/AV/Flows_T.cpp b/TAO/orbsvcs/orbsvcs/AV/Flows_T.cpp
new file mode 100644
index 00000000000..c2e6683d223
--- /dev/null
+++ b/TAO/orbsvcs/orbsvcs/AV/Flows_T.cpp
@@ -0,0 +1,252 @@
+//$Id$
+
+#ifndef TAO_AV_FLOWS_T_CPP
+#define TAO_AV_FLOWS_T_CPP
+
+#include "orbsvcs/AV/Flows_T.h"
+#include "tao/debug.h"
+
+TAO_BEGIN_VERSIONED_NAMESPACE_DECL
+
+// ------------------------------------------------------------
+// TAO_FDev
+// ------------------------------------------------------------
+
+// default constructor
+template <class T_Producer, class T_Consumer>
+TAO_FDev<T_Producer, T_Consumer>::TAO_FDev (void)
+{
+}
+
+template <class T_Producer, class T_Consumer>
+TAO_FDev<T_Producer, T_Consumer>::TAO_FDev (const char *flowname)
+ :flowname_ (flowname)
+{
+ ACE_DECLARE_NEW_CORBA_ENV;
+ ACE_TRY
+ {
+ CORBA::Any flowname_any;
+ flowname_any <<= flowname;
+ this->define_property ("Flow",
+ flowname_any
+ ACE_ENV_ARG_PARAMETER);
+ ACE_TRY_CHECK;
+ }
+ ACE_CATCHANY
+ {
+ ACE_PRINT_EXCEPTION (ACE_ANY_EXCEPTION,"TAO_FDev::TAO_FDev");
+ }
+ ACE_ENDTRY;
+ ACE_CHECK;
+}
+
+template <class T_Producer, class T_Consumer>
+TAO_FDev<T_Producer, T_Consumer>::~TAO_FDev (void)
+{
+ //no-op
+}
+
+template <class T_Producer, class T_Consumer>
+const char *
+TAO_FDev<T_Producer, T_Consumer>::flowname (void)
+{
+ return this->flowname_.in ();
+}
+
+template <class T_Producer, class T_Consumer>
+void
+TAO_FDev<T_Producer, T_Consumer>::flowname (const char *flow_name)
+{
+ ACE_DECLARE_NEW_CORBA_ENV;
+ ACE_TRY
+ {
+ CORBA::Any flowname_any;
+ flowname_any <<= flow_name;
+ this->define_property ("Flow",
+ flowname_any
+ ACE_ENV_ARG_PARAMETER);
+ ACE_TRY_CHECK;
+ }
+ ACE_CATCHANY
+ {
+ ACE_PRINT_EXCEPTION (ACE_ANY_EXCEPTION,"TAO_FDev::flowname");
+ }
+ ACE_ENDTRY;
+ ACE_CHECK;
+ this->flowname_ = flow_name;
+}
+
+template <class T_Producer, class T_Consumer>
+AVStreams::FlowProducer_ptr
+TAO_FDev<T_Producer, T_Consumer>::create_producer (AVStreams::FlowConnection_ptr the_requester,
+ AVStreams::QoS & the_qos,
+ CORBA::Boolean_out met_qos,
+ char *& named_fdev
+ ACE_ENV_ARG_DECL)
+ ACE_THROW_SPEC ((CORBA::SystemException,
+ AVStreams::streamOpFailed,
+ AVStreams::streamOpDenied,
+ AVStreams::notSupported,
+ AVStreams::QoSRequestFailed))
+{
+ // call the bridge method.
+ return this->make_producer (the_requester,
+ the_qos,
+ met_qos,
+ named_fdev
+ ACE_ENV_ARG_PARAMETER);
+}
+
+template <class T_Producer, class T_Consumer>
+// hook for the applications to override the creation process.
+AVStreams::FlowProducer_ptr
+TAO_FDev<T_Producer, T_Consumer>::make_producer (AVStreams::FlowConnection_ptr /* the_requester */,
+ AVStreams::QoS & /* the_qos */,
+ CORBA::Boolean_out /* met_qos */,
+ char *& /* named_fdev */
+ ACE_ENV_ARG_DECL)
+{
+ AVStreams::FlowProducer_ptr producer = AVStreams::FlowProducer::_nil ();
+ ACE_TRY
+ {
+ // Activate the producer implementation under the Root POA.
+ T_Producer *producer_i;
+ ACE_NEW_RETURN (producer_i, T_Producer, 0);
+ this->producer_list_.insert_tail (producer_i);
+ producer = producer_i->_this (ACE_ENV_SINGLE_ARG_PARAMETER);
+ ACE_TRY_CHECK;
+ }
+ ACE_CATCHANY
+ {
+ ACE_PRINT_EXCEPTION (ACE_ANY_EXCEPTION,"TAO_FDev::make_producer");
+ return producer;
+ }
+ ACE_ENDTRY;
+ ACE_CHECK_RETURN (producer);
+ return producer;
+}
+
+template <class T_Producer, class T_Consumer>
+// hook for the applications to override the consumer creation.
+AVStreams::FlowConsumer_ptr
+TAO_FDev<T_Producer, T_Consumer>::make_consumer (AVStreams::FlowConnection_ptr /* the_requester */,
+ AVStreams::QoS & /* the_qos */,
+ CORBA::Boolean_out /* met_qos */,
+ char *& /* named_fdev */
+ ACE_ENV_ARG_DECL)
+{
+ AVStreams::FlowConsumer_ptr consumer = AVStreams::FlowConsumer::_nil ();
+ ACE_TRY
+ {
+ // Activate the consumer implementation under the Root POA.
+ T_Consumer *consumer_i;
+ ACE_NEW_RETURN (consumer_i, T_Consumer, 0 );
+
+ this->consumer_list_.insert_tail (consumer_i);
+ consumer = consumer_i->_this (ACE_ENV_SINGLE_ARG_PARAMETER);
+ ACE_TRY_CHECK;
+ }
+ ACE_CATCHANY
+ {
+ ACE_PRINT_EXCEPTION (ACE_ANY_EXCEPTION,"TAO_FDev::make_consumer");
+ return consumer;
+ }
+ ACE_ENDTRY;
+ ACE_CHECK_RETURN (consumer);
+ return consumer;
+}
+
+template <class T_Producer, class T_Consumer>
+AVStreams::FlowConsumer_ptr
+TAO_FDev<T_Producer, T_Consumer>::create_consumer (AVStreams::FlowConnection_ptr the_requester,
+ AVStreams::QoS & the_qos,
+ CORBA::Boolean_out met_qos,
+ char *& named_fdev
+ ACE_ENV_ARG_DECL)
+ ACE_THROW_SPEC ((CORBA::SystemException,
+ AVStreams::streamOpFailed,
+ AVStreams::streamOpDenied,
+ AVStreams::notSupported,
+ AVStreams::QoSRequestFailed))
+{
+ return this->make_consumer (the_requester,
+ the_qos,
+ met_qos,
+ named_fdev
+ ACE_ENV_ARG_PARAMETER);
+}
+
+template <class T_Producer, class T_Consumer>
+// not implemented yet.
+AVStreams::FlowConnection_ptr
+TAO_FDev<T_Producer, T_Consumer>::bind (AVStreams::FDev_ptr peer_device,
+ AVStreams::QoS & the_qos,
+ CORBA::Boolean_out is_met
+ ACE_ENV_ARG_DECL)
+ ACE_THROW_SPEC ((CORBA::SystemException,
+ AVStreams::streamOpFailed,
+ AVStreams::QoSRequestFailed))
+{
+ ACE_UNUSED_ARG (peer_device);
+ ACE_UNUSED_ARG (the_qos);
+ ACE_UNUSED_ARG (is_met);
+ ACE_CHECK_RETURN (0);
+ return 0;
+}
+
+template <class T_Producer, class T_Consumer>
+// multicast is not supported yet.
+AVStreams::FlowConnection_ptr
+TAO_FDev<T_Producer, T_Consumer>::bind_mcast (AVStreams::FDev_ptr first_peer,
+ AVStreams::QoS & the_qos,
+ CORBA::Boolean_out is_met
+ ACE_ENV_ARG_DECL)
+ ACE_THROW_SPEC ((CORBA::SystemException,
+ AVStreams::streamOpFailed,
+ AVStreams::QoSRequestFailed))
+{
+ ACE_UNUSED_ARG (first_peer);
+ ACE_UNUSED_ARG (the_qos);
+ ACE_UNUSED_ARG (is_met);
+ ACE_CHECK_RETURN (0);
+ return 0;
+}
+
+template <class T_Producer, class T_Consumer>
+void
+TAO_FDev<T_Producer, T_Consumer>::destroy (AVStreams::FlowEndPoint_ptr /* the_ep */,
+ const char * /* fdev_name */
+ ACE_ENV_ARG_DECL_NOT_USED)
+ ACE_THROW_SPEC ((CORBA::SystemException,
+ AVStreams::notSupported))
+{
+ // @@ Shouldn't the parameters be made use of!
+ // Destroy/delete all the producers and consumers.
+
+ TAO_FlowProducer *producer_i;
+
+ for (PRODUCER_LIST_ITERATOR producer_list_iterator (this->producer_list_);
+ (producer_i = producer_list_iterator.next ()) != 0;
+ producer_list_iterator.advance ())
+ {
+ TAO_AV_Core::deactivate_servant (producer_i);
+ delete producer_i;
+ }
+
+ TAO_FlowConsumer *consumer_i;
+
+ for (CONSUMER_LIST_ITERATOR consumer_list_iterator (this->consumer_list_);
+ (consumer_i = consumer_list_iterator.next ()) != 0;
+ consumer_list_iterator.advance ())
+ {
+ TAO_AV_Core::deactivate_servant (consumer_i);
+ delete consumer_i;
+ }
+ int result = TAO_AV_Core::deactivate_servant (this);
+ if (result < 0)
+ if (TAO_debug_level > 0) ACE_DEBUG ((LM_DEBUG,"TAO_StreamEndPoint::destroy failed\n"));
+}
+
+TAO_END_VERSIONED_NAMESPACE_DECL
+
+#endif /* TAO_AV_FLOWS_T_CPP */
diff --git a/TAO/orbsvcs/orbsvcs/AV/Flows_T.h b/TAO/orbsvcs/orbsvcs/AV/Flows_T.h
new file mode 100644
index 00000000000..d0810ab65e1
--- /dev/null
+++ b/TAO/orbsvcs/orbsvcs/AV/Flows_T.h
@@ -0,0 +1,130 @@
+// -*- C++ -*-
+
+//=============================================================================
+/**
+ * @file Flows_T.h
+ *
+ * $Id$
+ *
+ * @author Nagarajan Surendran <naga@cs.wustl.edu>
+ */
+//=============================================================================
+
+
+#ifndef TAO_AV_FLOWS_T_H
+#define TAO_AV_FLOWS_T_H
+#include /**/ "ace/pre.h"
+
+#include "orbsvcs/AV/AVStreams_i.h"
+
+TAO_BEGIN_VERSIONED_NAMESPACE_DECL
+
+/**
+ * @class TAO_FDev
+ * @brief Implementation of the AV/Streams Flow Device.
+ * A FlowConnection is used to bind FDevs for flows,
+ * much like how a StreamCtrl is used to bind MMDevices for streams.
+ */
+template <class T_Producer, class T_Consumer>
+class TAO_FDev :
+ public virtual POA_AVStreams::FDev,
+ public virtual TAO_PropertySet
+{
+public:
+ /// default constructor
+ TAO_FDev (void);
+
+ /// constructor taking a flowname.
+ TAO_FDev (const char *flowname);
+
+ /// Destructor..
+ ~TAO_FDev (void);
+
+ /// set/get the flowname.
+ /// create a flow producer object.
+ const char *flowname (void);
+ void flowname (const char *flowname);
+ AVStreams::FlowProducer_ptr create_producer (AVStreams::FlowConnection_ptr the_requester,
+ AVStreams::QoS & the_qos,
+ CORBA::Boolean_out met_qos,
+ char *& named_fdev
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS)
+ ACE_THROW_SPEC ((CORBA::SystemException,
+ AVStreams::streamOpFailed,
+ AVStreams::streamOpDenied,
+ AVStreams::notSupported,
+ AVStreams::QoSRequestFailed));
+
+ /// bridge method for the application to override the producer object
+ /// creation. Default implementation creates a TAO_FlowProducer.
+ virtual AVStreams::FlowProducer_ptr make_producer (AVStreams::FlowConnection_ptr the_requester,
+ AVStreams::QoS & the_qos,
+ CORBA::Boolean_out met_qos,
+ char *& named_fdev
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS);
+
+ /// create a flow consumer object.
+ virtual AVStreams::FlowConsumer_ptr create_consumer (AVStreams::FlowConnection_ptr the_requester,
+ AVStreams::QoS & the_qos,
+ CORBA::Boolean_out met_qos,
+ char *& named_fdev
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS)
+ ACE_THROW_SPEC ((CORBA::SystemException,
+ AVStreams::streamOpFailed,
+ AVStreams::streamOpDenied,
+ AVStreams::notSupported,
+ AVStreams::QoSRequestFailed));
+
+ /// bridge method for the application to override the consumer object
+ /// creation. Default implementation creates a TAO_FlowConsumer.
+ virtual AVStreams::FlowConsumer_ptr make_consumer (AVStreams::FlowConnection_ptr the_requester,
+ AVStreams::QoS & the_qos,
+ CORBA::Boolean_out met_qos,
+ char *& named_fdev
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS);
+
+ /// bind this FDev with another FDev.
+ virtual AVStreams::FlowConnection_ptr bind (AVStreams::FDev_ptr peer_device,
+ AVStreams::QoS & the_qos,
+ CORBA::Boolean_out is_met
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS)
+ ACE_THROW_SPEC ((CORBA::SystemException,
+ AVStreams::streamOpFailed,
+ AVStreams::QoSRequestFailed));
+
+ /// multicast bind is not implemented yet.
+ virtual AVStreams::FlowConnection_ptr bind_mcast (AVStreams::FDev_ptr first_peer,
+ AVStreams::QoS & the_qos,
+ CORBA::Boolean_out is_met
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS)
+ ACE_THROW_SPEC ((CORBA::SystemException,
+ AVStreams::streamOpFailed,
+ AVStreams::QoSRequestFailed));
+
+ /// destroys this FDev.
+ virtual void destroy (AVStreams::FlowEndPoint_ptr the_ep,
+ const char * fdev_name
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS)
+ ACE_THROW_SPEC ((CORBA::SystemException,
+ AVStreams::notSupported));
+
+protected:
+ ACE_DLList <TAO_FlowProducer> producer_list_;
+ typedef ACE_DLList_Iterator <TAO_FlowProducer> PRODUCER_LIST_ITERATOR;
+ ACE_DLList <TAO_FlowConsumer> consumer_list_;
+ typedef ACE_DLList_Iterator <TAO_FlowConsumer> CONSUMER_LIST_ITERATOR;
+ CORBA::String_var flowname_;
+};
+
+TAO_END_VERSIONED_NAMESPACE_DECL
+
+#if defined (ACE_TEMPLATES_REQUIRE_SOURCE)
+#include "orbsvcs/AV/Flows_T.cpp"
+#endif /*ACE_TEMPLATES_REQUIRE_SOURCE */
+
+#if defined (ACE_TEMPLATES_REQUIRE_PRAGMA)
+#pragma implementation ("Flows_T.cpp")
+#endif /* ACE_TEMPLATES_REQUIRE_PRAGMA */
+
+#include /**/ "ace/post.h"
+#endif /* TAO_AV_FLOWS_T_H */
diff --git a/TAO/orbsvcs/orbsvcs/AV/MCast.cpp b/TAO/orbsvcs/orbsvcs/AV/MCast.cpp
new file mode 100644
index 00000000000..5ccb9148c4f
--- /dev/null
+++ b/TAO/orbsvcs/orbsvcs/AV/MCast.cpp
@@ -0,0 +1,220 @@
+// $Id$
+
+#include "orbsvcs/AV/MCast.h"
+#include "orbsvcs/AV/AVStreams_i.h"
+#include "tao/debug.h"
+
+#if !defined (__ACE_INLINE__)
+#include "orbsvcs/AV/MCast.i"
+#endif /* __ACE_INLINE__ */
+
+TAO_BEGIN_VERSIONED_NAMESPACE_DECL
+
+//------------------------------------------------------------
+//TAO_AV_UDP_MCast_Flow_Handler
+//------------------------------------------------------------
+
+TAO_AV_UDP_MCast_Flow_Handler::TAO_AV_UDP_MCast_Flow_Handler (void)
+{
+ ACE_NEW (transport_,
+ TAO_AV_UDP_MCast_Transport (this));
+ ACE_NEW (dgram_mcast_,
+ ACE_SOCK_Dgram_Mcast);
+}
+
+TAO_AV_UDP_MCast_Flow_Handler::~TAO_AV_UDP_MCast_Flow_Handler (void)
+{
+ delete this->transport_;
+ delete this->dgram_mcast_;
+}
+
+
+int
+TAO_AV_UDP_MCast_Flow_Handler::handle_input (ACE_HANDLE /*fd*/)
+{
+ return this->protocol_object_->handle_input ();
+// return 0;
+}
+
+int
+TAO_AV_UDP_MCast_Flow_Handler::handle_timeout (const ACE_Time_Value &tv,
+ const void *arg)
+{
+ return TAO_AV_Flow_Handler::handle_timeout (tv,arg);
+}
+
+ACE_HANDLE
+TAO_AV_UDP_MCast_Flow_Handler::get_handle (void) const
+{
+ if (TAO_debug_level > 0) ACE_DEBUG ((LM_DEBUG,"TAO_AV_UDP_MCast_Flow_Handler::get_handle "));
+ return this->get_mcast_socket ()->get_handle () ;
+}
+
+void
+TAO_AV_UDP_MCast_Flow_Handler::set_peer_addr (ACE_INET_Addr *peer_addr)
+{
+ this->peer_addr_ = peer_addr;
+}
+
+//------------------------------------------------------------
+// TAO_AV_UDP_MCast_Transport
+//------------------------------------------------------------
+
+TAO_AV_UDP_MCast_Transport::TAO_AV_UDP_MCast_Transport (void)
+ :handler_ (0)
+{
+}
+
+TAO_AV_UDP_MCast_Transport::TAO_AV_UDP_MCast_Transport (TAO_AV_UDP_MCast_Flow_Handler *handler)
+ :handler_ (handler)
+{
+}
+
+TAO_AV_UDP_MCast_Transport::~TAO_AV_UDP_MCast_Transport (void)
+{
+}
+
+int
+TAO_AV_UDP_MCast_Transport::open (ACE_Addr * /*address*/)
+{
+ return 0;
+}
+
+int
+TAO_AV_UDP_MCast_Transport::close (void)
+{
+ return 0;
+}
+
+
+ACE_Addr*
+TAO_AV_UDP_MCast_Transport::get_peer_addr (void)
+{
+ return &this->peer_addr_;
+}
+
+ACE_Addr*
+TAO_AV_UDP_MCast_Transport::get_local_addr (void)
+{
+ this->handler_->get_mcast_socket ()->get_local_addr (this->local_addr_);
+ return &this->local_addr_;
+}
+
+ssize_t
+TAO_AV_UDP_MCast_Transport::send (const ACE_Message_Block *mblk, ACE_Time_Value *)
+{
+ // For the most part this was copied from GIOP::send_request and
+ // friends.
+
+ iovec iov[ACE_IOV_MAX];
+ int iovcnt = 0;
+ ssize_t n = 0;
+ ssize_t nbytes = 0;
+
+ for (const ACE_Message_Block *i = mblk;
+ i != 0;
+ i = i->cont ())
+ {
+ // Make sure there is something to send!
+ if (i->length () > 0)
+ {
+ iov[iovcnt].iov_base = i->rd_ptr ();
+ iov[iovcnt].iov_len = static_cast<u_long> (i->length ());
+ iovcnt++;
+
+ // The buffer is full make a OS call. @@ TODO this should
+ // be optimized on a per-platform basis, for instance, some
+ // platforms do not implement writev() there we should copy
+ // the data into a buffer and call send_n(). In other cases
+ // there may be some limits on the size of the iovec, there
+ // we should set ACE_IOV_MAX to that limit.
+ if (iovcnt == ACE_IOV_MAX)
+ {
+ n = this->handler_->get_mcast_socket ()->send ((const iovec *) iov,
+ iovcnt);
+
+ if (n < 1)
+ return n;
+
+ nbytes += n;
+ iovcnt = 0;
+ }
+ }
+ }
+
+ // Check for remaining buffers to be sent!
+ if (iovcnt != 0)
+ {
+ n = this->handler_->get_mcast_socket ()->send ((const iovec *) iov,
+ iovcnt);
+ if (n < 1)
+ return n;
+
+ nbytes += n;
+ }
+
+ return nbytes;
+}
+
+ssize_t
+TAO_AV_UDP_MCast_Transport::send (const char *buf,
+ size_t len,
+ ACE_Time_Value *)
+{
+// if (TAO_debug_level > 0) ACE_DEBUG ((LM_DEBUG,"TAO_AV_UDP_MCast_Transport::send "));
+// char addr [BUFSIZ];
+// this->peer_addr_.addr_to_string (addr,BUFSIZ);
+// if (TAO_debug_level > 0) ACE_DEBUG ((LM_DEBUG,"to %s\n",addr));
+
+ return this->handler_->get_mcast_socket ()->send (buf, len);
+
+}
+
+ssize_t
+TAO_AV_UDP_MCast_Transport::send (const iovec *iov,
+ int iovcnt,
+ ACE_Time_Value *)
+{
+ return this->handler_->get_mcast_socket ()->send (iov,
+ iovcnt,
+ 0);
+
+}
+
+int
+TAO_AV_UDP_MCast_Transport::mtu (void)
+{
+ return ACE_MAX_DGRAM_SIZE;
+}
+
+
+ssize_t
+TAO_AV_UDP_MCast_Transport::recv (char *buf,
+ size_t len,
+ ACE_Time_Value *)
+{
+ return this->handler_->get_mcast_socket ()->recv (buf, len,this->peer_addr_);
+}
+
+ssize_t
+TAO_AV_UDP_MCast_Transport::recv (char *buf,
+ size_t len,
+ int flags,
+ ACE_Time_Value *timeout)
+{
+ return this->handler_->get_mcast_socket ()->recv (buf,
+ len,
+ this->peer_addr_,
+ flags,
+ timeout);
+}
+
+ssize_t
+TAO_AV_UDP_MCast_Transport::recv (iovec *iov,
+ int /*iovcnt*/,
+ ACE_Time_Value *timeout)
+{
+ return handler_->get_mcast_socket ()->recv (iov,this->peer_addr_,0,timeout);
+}
+
+TAO_END_VERSIONED_NAMESPACE_DECL
diff --git a/TAO/orbsvcs/orbsvcs/AV/MCast.h b/TAO/orbsvcs/orbsvcs/AV/MCast.h
new file mode 100644
index 00000000000..fde288896ed
--- /dev/null
+++ b/TAO/orbsvcs/orbsvcs/AV/MCast.h
@@ -0,0 +1,117 @@
+// -*- C++ -*-
+
+//=============================================================================
+/**
+ * @file MCast.h
+ *
+ * $Id$
+ *
+ * @author Nagarajan Surendran <naga@cs.wustl.edu>
+ */
+//=============================================================================
+
+
+#ifndef TAO_AV_MCAST_H
+#define TAO_AV_MCAST_H
+#include /**/ "ace/pre.h"
+
+#include "orbsvcs/AV/FlowSpec_Entry.h"
+#include "orbsvcs/AV/Protocol_Factory.h"
+#include "ace/INET_Addr.h"
+#include "ace/SOCK_Dgram_Mcast.h"
+
+TAO_BEGIN_VERSIONED_NAMESPACE_DECL
+
+class TAO_AV_UDP_MCast_Flow_Handler;
+
+/**
+ * @class TAO_AV_UDP_MCast_Transport
+ * @brief A transport abstraction for Multicast dgram sockets.
+ * Uses the ACE_SOCK_Dgram_Mcast to send data.
+ */
+class TAO_AV_UDP_MCast_Transport
+ :public TAO_AV_Transport
+{
+
+public:
+ TAO_AV_UDP_MCast_Transport (void);
+
+ TAO_AV_UDP_MCast_Transport (TAO_AV_UDP_MCast_Flow_Handler *handler);
+
+ virtual ~TAO_AV_UDP_MCast_Transport (void);
+
+ virtual int open (ACE_Addr *address);
+
+ virtual int close (void);
+
+ virtual int mtu (void);
+
+ /// Write the complete Message_Block chain to the connection.
+ virtual ACE_Addr *get_peer_addr (void);
+ virtual ACE_Addr *get_local_addr (void);
+ virtual ssize_t send (const ACE_Message_Block *mblk,
+ ACE_Time_Value *s = 0);
+
+ /// Write the contents of the buffer of length len to the connection.
+ virtual ssize_t send (const char *buf,
+ size_t len,
+ ACE_Time_Value *s = 0);
+
+ /// Write the contents of iovcnt iovec's to the connection.
+ virtual ssize_t send (const iovec *iov,
+ int iovcnt,
+ ACE_Time_Value *s = 0);
+
+ /// Read len bytes from into buf.
+ virtual ssize_t recv (char *buf,
+ size_t len,
+ ACE_Time_Value *s = 0);
+
+ /// Read len bytes from into buf using flags.
+ virtual ssize_t recv (char *buf,
+ size_t len,
+ int flags,
+ ACE_Time_Value *s = 0);
+
+ /// Read received data into the iovec buffers.
+ virtual ssize_t recv (iovec *iov,
+ int iovcnt,
+ ACE_Time_Value *s = 0);
+protected:
+ TAO_AV_UDP_MCast_Flow_Handler *handler_;
+ ACE_INET_Addr peer_addr_;
+ ACE_INET_Addr local_addr_;
+};
+
+/**
+ * @class TAO_AV_UDP_MCast_Flow_Handler
+ * @brief Flow Handler for data sent over multicast sockets.
+ */
+class TAO_AV_UDP_MCast_Flow_Handler
+ :public virtual TAO_AV_Flow_Handler,
+ public virtual ACE_Event_Handler
+{
+public:
+ /// Ctor
+ /// Dtor
+ TAO_AV_UDP_MCast_Flow_Handler (void);
+ virtual ~TAO_AV_UDP_MCast_Flow_Handler (void);
+ virtual ACE_HANDLE get_handle (void) const;
+ virtual int handle_input (ACE_HANDLE fd);
+ virtual int handle_timeout (const ACE_Time_Value &tv, const void *arg = 0);
+ ACE_SOCK_Dgram_Mcast *get_mcast_socket (void) const;
+ virtual ACE_Event_Handler* event_handler (void){ return this; }
+ void set_peer_addr (ACE_INET_Addr *peer_addr);
+protected:
+ ACE_INET_Addr *peer_addr_;
+ ACE_SOCK_Dgram_Mcast *dgram_mcast_;
+};
+
+TAO_END_VERSIONED_NAMESPACE_DECL
+
+#if defined(__ACE_INLINE__)
+#include "orbsvcs/AV/MCast.i"
+#endif /* __ACE_INLINE__ */
+
+#include /**/ "ace/post.h"
+#endif /* TAO_AV_MCAST_H */
diff --git a/TAO/orbsvcs/orbsvcs/AV/MCast.i b/TAO/orbsvcs/orbsvcs/AV/MCast.i
new file mode 100644
index 00000000000..08d994f23ed
--- /dev/null
+++ b/TAO/orbsvcs/orbsvcs/AV/MCast.i
@@ -0,0 +1,17 @@
+// -*- C++ -*-
+//
+// $Id$
+
+TAO_BEGIN_VERSIONED_NAMESPACE_DECL
+
+//------------------------------------------------------------
+// TAO_AV_UDP_MCast_Flow_Handler
+//-----------------------------------------------------------
+
+ACE_INLINE ACE_SOCK_Dgram_Mcast *
+TAO_AV_UDP_MCast_Flow_Handler::get_mcast_socket (void) const
+{
+ return this->dgram_mcast_;
+}
+
+TAO_END_VERSIONED_NAMESPACE_DECL
diff --git a/TAO/orbsvcs/orbsvcs/AV/Policy.cpp b/TAO/orbsvcs/orbsvcs/AV/Policy.cpp
new file mode 100644
index 00000000000..0fa94820c07
--- /dev/null
+++ b/TAO/orbsvcs/orbsvcs/AV/Policy.cpp
@@ -0,0 +1,150 @@
+// $Id$
+
+#include "orbsvcs/AV/FlowSpec_Entry.h"
+#include "tao/debug.h"
+#include "orbsvcs/AV/Policy.h"
+
+#if !defined(__ACE_INLINE__)
+#include "orbsvcs/AV/Policy.i"
+#endif /* __ACE_INLINE__ */
+
+TAO_BEGIN_VERSIONED_NAMESPACE_DECL
+
+TAO_AV_Policy::TAO_AV_Policy (CORBA::ULong type)
+ :type_ (type)
+{
+}
+
+TAO_AV_SSRC_Policy::TAO_AV_SSRC_Policy (CORBA::ULong ssrc)
+ :TAO_AV_Policy (TAO_AV_SSRC_POLICY),
+ ssrc_ (ssrc)
+{
+}
+
+TAO_AV_Payload_Type_Policy::TAO_AV_Payload_Type_Policy (int payload_type)
+ :TAO_AV_Policy (TAO_AV_PAYLOAD_TYPE_POLICY),
+ payload_type_ (payload_type)
+{
+}
+
+// TAO_AV_RTP_Sdes_Policy
+TAO_AV_RTCP_Sdes_Policy::TAO_AV_RTCP_Sdes_Policy (void)
+ :TAO_AV_Policy (TAO_AV_RTCP_SDES_POLICY)
+{
+}
+
+TAO_AV_SFP_Credit_Policy::TAO_AV_SFP_Credit_Policy (void)
+ :TAO_AV_Policy (TAO_AV_SFP_CREDIT_POLICY)
+{
+}
+
+// TAO_AV_Callback
+TAO_AV_Callback::TAO_AV_Callback (void)
+ :protocol_object_ (0)
+{
+}
+
+TAO_AV_Callback::~TAO_AV_Callback (void)
+{
+}
+
+int
+TAO_AV_Callback::open (TAO_AV_Protocol_Object *object,
+ TAO_AV_Flow_Handler *handler)
+{
+ this->protocol_object_ = object;
+ this->handler_ = handler;
+ handler->callback (this);
+ return 0;
+}
+
+int
+TAO_AV_Callback::handle_start (void)
+{
+ if (TAO_debug_level > 0) ACE_DEBUG ((LM_DEBUG,"TAO_AV_Callback::handle_start\n"));
+ return -1;
+}
+
+int
+TAO_AV_Callback::handle_stop (void)
+{
+ if (TAO_debug_level > 0) ACE_DEBUG ((LM_DEBUG,"TAO_AV_Callback::handle_stop\n"));
+ return -1;
+}
+
+int
+TAO_AV_Callback::receive_frame (ACE_Message_Block * /*frame*/,
+ TAO_AV_frame_info *,
+ const ACE_Addr &)
+{
+ if (TAO_debug_level > 0) ACE_DEBUG ((LM_DEBUG,"TAO_AV_Callback::receive_frame\n"));
+ return -1;
+}
+
+int
+TAO_AV_Callback::receive_control_frame (ACE_Message_Block *,
+ const ACE_Addr& )
+{
+ return 0;
+}
+
+int
+TAO_AV_Callback::handle_destroy (void)
+{
+ if (TAO_debug_level > 0) ACE_DEBUG ((LM_DEBUG,"TAO_AV_Callback::handle_end_stream\n"));
+ return -1;
+}
+
+void
+TAO_AV_Callback::get_timeout (ACE_Time_Value *& tv,
+ void *& /*arg*/)
+{
+ if (TAO_debug_level > 0) ACE_DEBUG ((LM_DEBUG,"TAO_AV_Callback::get_timeout\n"));
+ tv = 0;
+}
+
+int
+TAO_AV_Callback::handle_timeout (void * /*arg*/)
+{
+ if (TAO_debug_level > 0) ACE_DEBUG ((LM_DEBUG,"TAO_AV_Callback::handle_timeout\n"));
+ return 0;
+}
+
+TAO_AV_PolicyList
+TAO_AV_Callback::get_policies (void)
+{
+ TAO_AV_PolicyList list;
+ return list;
+}
+
+// TAO_AV_Transport*
+// TAO_AV_Callback::transport (void)
+// {
+// return this->transport_;
+// }
+
+// void
+// TAO_AV_Callback::transport (TAO_AV_Transport *transport)
+// {
+// this->transport_ = transport;
+// }
+
+TAO_AV_Protocol_Object*
+TAO_AV_Callback::protocol_object (void)
+{
+ return this->protocol_object_;
+}
+
+// void
+// TAO_AV_Callback::protocol_object (TAO_AV_Protocol_Object *object)
+// {
+// this->protocol_object_ = object;
+// }
+
+int
+TAO_AV_Callback::schedule_timer (void)
+{
+ return this->handler_->schedule_timer ();
+}
+
+TAO_END_VERSIONED_NAMESPACE_DECL
diff --git a/TAO/orbsvcs/orbsvcs/AV/Policy.h b/TAO/orbsvcs/orbsvcs/AV/Policy.h
new file mode 100644
index 00000000000..a34a9604e22
--- /dev/null
+++ b/TAO/orbsvcs/orbsvcs/AV/Policy.h
@@ -0,0 +1,176 @@
+// -*- C++ -*-
+
+//=============================================================================
+/**
+ * @file Policy.h
+ *
+ * $Id$
+ *
+ * @author Nagarajan Surendran <naga@cs.wustl.edu>
+ */
+//=============================================================================
+
+
+#ifndef TAO_AV_POLICY_H
+#define TAO_AV_POLICY_H
+
+#include /**/ "ace/pre.h"
+
+#include "ace/Addr.h"
+#include "tao/Basic_Types.h"
+#include "tao/CORBA_String.h"
+#include "tao/Sequence_T.h"
+#include "ace/Time_Value.h"
+#include "orbsvcs/AV/AV_export.h"
+
+
+ACE_BEGIN_VERSIONED_NAMESPACE_DECL
+class ACE_Message_Block;
+ACE_END_VERSIONED_NAMESPACE_DECL
+
+TAO_BEGIN_VERSIONED_NAMESPACE_DECL
+
+struct TAO_AV_frame_info
+{
+ CORBA::Boolean boundary_marker;
+ CORBA::Octet format;
+ // @@ Shouldn't this be a string.
+ CORBA::ULong timestamp;
+ CORBA::ULong ssrc;
+ CORBA::ULong sequence_num;
+};
+
+#define TAO_AV_SSRC_POLICY 100
+#define TAO_AV_PAYLOAD_TYPE_POLICY 101
+#define TAO_AV_TIMEOUT_POLICY 102
+#define TAO_AV_RTCP_SDES_POLICY 103
+#define TAO_AV_SFP_CREDIT_POLICY 104
+
+struct TAO_AV_RTCP_Sdes
+{
+ CORBA::String_var name_;
+ CORBA::String_var value_;
+};
+
+class TAO_AV_Export TAO_AV_Policy
+{
+public:
+ TAO_AV_Policy (CORBA::ULong type);
+ CORBA::ULong type (void);
+protected:
+ CORBA::ULong type_;
+};
+
+class TAO_AV_Export TAO_AV_SSRC_Policy : public TAO_AV_Policy
+{
+public:
+ TAO_AV_SSRC_Policy (CORBA::ULong ssrc = 0);
+ CORBA::ULong value (void);
+ void value (CORBA::ULong ssrc);
+protected:
+ CORBA::ULong ssrc_;
+};
+
+class TAO_AV_Export TAO_AV_Payload_Type_Policy : public TAO_AV_Policy
+{
+public:
+ TAO_AV_Payload_Type_Policy (int payload_type = -1);
+ int value (void);
+ void value (int pt);
+protected:
+ int payload_type_;
+};
+
+class TAO_AV_Export TAO_AV_RTCP_Sdes_Policy : public TAO_AV_Policy
+{
+public:
+ TAO_AV_RTCP_Sdes_Policy (void);
+ TAO_AV_RTCP_Sdes &value (void);
+ void value (const TAO_AV_RTCP_Sdes& sdes_val);
+protected:
+ TAO_AV_RTCP_Sdes sdes_;
+};
+
+class TAO_AV_Export TAO_AV_SFP_Credit_Policy : public TAO_AV_Policy
+{
+public:
+ TAO_AV_SFP_Credit_Policy (void);
+ int value (void);
+ void value (int val);
+protected:
+ int value_;
+};
+
+typedef TAO::unbounded_value_sequence<TAO_AV_Policy*> TAO_AV_PolicyList;
+
+class TAO_AV_Protocol_Object;
+class TAO_AV_Transport;
+class TAO_AV_Flow_Handler;
+
+/**
+ * @class TAO_AV_Callback
+ *
+ * @brief Callback class that the user will be implementing for receiving
+ * frames from the network and also for timer events.
+ */
+class TAO_AV_Export TAO_AV_Callback
+{
+public:
+ TAO_AV_Callback (void);
+ virtual ~TAO_AV_Callback (void);
+
+ /// Called for opening the callback.
+ int open (TAO_AV_Protocol_Object *object,
+ TAO_AV_Flow_Handler *handler);
+
+ /// Called during Streamctrl->start.
+ virtual int handle_start (void);
+
+ /// Called during Streamctrl->stop.
+ virtual int handle_stop (void);
+
+ /// Called during timeout for Flow Producers.
+ virtual int handle_timeout (void *arg);
+
+ virtual int schedule_timer (void);
+
+ virtual int receive_frame (ACE_Message_Block *frame,
+ TAO_AV_frame_info *frame_info = 0,
+ const ACE_Addr &address = ACE_Addr::sap_any);
+
+ // Called when a frame arrives for a FlowConsumer.
+
+ /// address from which the frame was received.
+ virtual int receive_control_frame (ACE_Message_Block *frame,
+ const ACE_Addr &address = ACE_Addr::sap_any);
+
+ /// Called during Streamctrl->destroy i.e tear_down of the stream
+ virtual int handle_destroy (void);
+
+ /**
+ * Called to get the timeout. If tv is 0 then the framework stop
+ * calling this. This will be called during the start of the frame
+ * and also if schedule_timer is called to get the timeout.
+ */
+ virtual void get_timeout (ACE_Time_Value *&tv,
+ void *&arg);
+
+ /// Accessor to protocol object.
+ TAO_AV_Protocol_Object *protocol_object (void);
+
+ /// get the policies for the protocol object.
+ virtual TAO_AV_PolicyList get_policies (void);
+protected:
+ TAO_AV_Protocol_Object *protocol_object_;
+ TAO_AV_Flow_Handler *handler_;
+};
+
+TAO_END_VERSIONED_NAMESPACE_DECL
+
+#if defined(__ACE_INLINE__)
+#include "orbsvcs/AV/Policy.i"
+#endif /* __ACE_INLINE__ */
+
+#include /**/ "ace/post.h"
+
+#endif /* TAO_AV_POLICY_H */
diff --git a/TAO/orbsvcs/orbsvcs/AV/Policy.i b/TAO/orbsvcs/orbsvcs/AV/Policy.i
new file mode 100644
index 00000000000..3ff570e0e6f
--- /dev/null
+++ b/TAO/orbsvcs/orbsvcs/AV/Policy.i
@@ -0,0 +1,81 @@
+// -*- C++ -*-
+//
+// $Id$
+
+TAO_BEGIN_VERSIONED_NAMESPACE_DECL
+
+//--------------------------------------------------
+// TAO_AV_Policy
+//--------------------------------------------------
+
+ACE_INLINE CORBA::ULong
+TAO_AV_Policy::type (void)
+{
+ return this->type_;
+}
+
+//--------------------------------------------------
+// TAO_AV_SSRC_Policy
+//--------------------------------------------------
+
+ACE_INLINE CORBA::ULong
+TAO_AV_SSRC_Policy::value (void)
+{
+ return this->ssrc_;
+}
+
+
+ACE_INLINE void
+TAO_AV_SSRC_Policy::value (CORBA::ULong ssrc)
+{
+ this->ssrc_ = ssrc;
+}
+
+//--------------------------------------------------
+// TAO_AV_Payload_Type_Policy
+//--------------------------------------------------
+ACE_INLINE void
+TAO_AV_Payload_Type_Policy::value (int pt)
+{
+ this->payload_type_ = pt;
+}
+
+ACE_INLINE int
+TAO_AV_Payload_Type_Policy::value (void)
+{
+ return this->payload_type_;
+}
+
+
+// TAO_AV_RTCP_Sdes_Policy
+ACE_INLINE TAO_AV_RTCP_Sdes &
+TAO_AV_RTCP_Sdes_Policy::value (void)
+{
+ return this->sdes_;
+}
+
+ACE_INLINE void
+TAO_AV_RTCP_Sdes_Policy::value (const TAO_AV_RTCP_Sdes &sdes_val)
+{
+ this->sdes_ = sdes_val;
+}
+
+//----------------------------------------------------------------------
+// TAO_AV_SFP_Credit_Policy
+//----------------------------------------------------------------------
+
+ACE_INLINE
+void
+TAO_AV_SFP_Credit_Policy::value (int credit)
+{
+ this->value_ = credit;
+}
+
+ACE_INLINE
+int
+TAO_AV_SFP_Credit_Policy::value (void)
+{
+ return this->value_;
+}
+
+TAO_END_VERSIONED_NAMESPACE_DECL
diff --git a/TAO/orbsvcs/orbsvcs/AV/Protocol_Factory.cpp b/TAO/orbsvcs/orbsvcs/AV/Protocol_Factory.cpp
new file mode 100644
index 00000000000..55f5767c9ca
--- /dev/null
+++ b/TAO/orbsvcs/orbsvcs/AV/Protocol_Factory.cpp
@@ -0,0 +1,131 @@
+// $Id$
+
+
+#include "orbsvcs/AV/Protocol_Factory.h"
+#include "tao/debug.h"
+#include "ace/Dynamic_Service.h"
+
+
+TAO_BEGIN_VERSIONED_NAMESPACE_DECL
+
+// TAO_AV_Flow_Protocol_Factory
+TAO_AV_Flow_Protocol_Factory::TAO_AV_Flow_Protocol_Factory (void)
+{
+}
+
+TAO_AV_Flow_Protocol_Factory::~TAO_AV_Flow_Protocol_Factory (void)
+{
+}
+
+int
+TAO_AV_Flow_Protocol_Factory::init (int /* argc */,
+ char * /* argv */ [])
+{
+ return -1;
+}
+
+int
+TAO_AV_Flow_Protocol_Factory::match_protocol (const char * /* protocol_string */)
+{
+ return 0;
+}
+
+TAO_AV_Protocol_Object*
+TAO_AV_Flow_Protocol_Factory::make_protocol_object (TAO_FlowSpec_Entry * /* entry */,
+ TAO_Base_StreamEndPoint * /* endpoint */ ,
+ TAO_AV_Flow_Handler * /* handler */,
+ TAO_AV_Transport * /* transport */)
+{
+ return 0;
+}
+
+const char *
+TAO_AV_Flow_Protocol_Factory::control_flow_factory (void)
+{
+ return 0;
+}
+
+//----------------------------------------------------------------------
+// TAO_AV_Protocol_Object
+//----------------------------------------------------------------------
+TAO_AV_Protocol_Object::TAO_AV_Protocol_Object (void)
+ :transport_ (0),
+ callback_ (0)
+{
+ // no-op.
+}
+
+TAO_AV_Protocol_Object::TAO_AV_Protocol_Object (TAO_AV_Callback *callback,
+ TAO_AV_Transport *transport)
+ :transport_ (transport),
+ callback_ (callback)
+{
+ // no-op.
+}
+
+int
+TAO_AV_Protocol_Object::open (TAO_AV_Callback *callback,
+ TAO_AV_Transport *transport)
+{
+ this->callback_ = callback;
+ this->transport_ = transport;
+ return 0;
+}
+
+TAO_AV_Protocol_Object::~TAO_AV_Protocol_Object (void)
+{
+}
+
+int
+TAO_AV_Protocol_Object::start (void)
+{
+ return this->callback_->handle_start ();
+}
+
+int
+TAO_AV_Protocol_Object::stop (void)
+{
+ return this->callback_->handle_stop ();
+}
+
+int
+TAO_AV_Protocol_Object::set_policies (const TAO_AV_PolicyList &policy_list)
+{
+ this->policy_list_ = policy_list;
+ return 0;
+}
+
+TAO_AV_PolicyList
+TAO_AV_Protocol_Object::get_policies (void)
+{
+ return this->policy_list_;
+}
+
+TAO_AV_Transport*
+TAO_AV_Protocol_Object::transport (void)
+{
+ return this->transport_;
+}
+
+// void
+// TAO_AV_Protocol_Object::transport (TAO_AV_Transport *transport)
+// {
+// this->transport_ = transport;
+// }
+
+void
+TAO_AV_Protocol_Object::control_object (TAO_AV_Protocol_Object * /* object */)
+{
+ return;
+}
+
+int
+TAO_AV_Protocol_Object::handle_control_input (ACE_Message_Block *,
+ const ACE_Addr &)
+{
+ if (TAO_debug_level > 0)
+ ACE_DEBUG ((LM_DEBUG,"TAO_AV_Protocol_Object::handle_control_input\n"));
+ return 0;
+}
+
+TAO_END_VERSIONED_NAMESPACE_DECL
diff --git a/TAO/orbsvcs/orbsvcs/AV/Protocol_Factory.h b/TAO/orbsvcs/orbsvcs/AV/Protocol_Factory.h
new file mode 100644
index 00000000000..f18774d3006
--- /dev/null
+++ b/TAO/orbsvcs/orbsvcs/AV/Protocol_Factory.h
@@ -0,0 +1,103 @@
+// -*- C++ -*-
+
+//=============================================================================
+/**
+ * @file Protocol_Factory.h
+ *
+ * $Id$
+ *
+ * @author Nagarajan Surendran <naga@cs.wustl.edu>
+ */
+//=============================================================================
+
+
+#ifndef TAO_AV_PROTOCOL_FACTORY_T_H
+#define TAO_AV_PROTOCOL_FACTORY_T_H
+#include /**/ "ace/pre.h"
+
+#include "orbsvcs/AV/FlowSpec_Entry.h"
+#include "orbsvcs/AV/Policy.h"
+
+#include "ace/Service_Object.h"
+
+TAO_BEGIN_VERSIONED_NAMESPACE_DECL
+
+/**
+ * @class TAO_AV_Protocol_Object
+ * @brief
+ */
+class TAO_AV_Export TAO_AV_Protocol_Object
+{
+public:
+ TAO_AV_Protocol_Object (void);
+
+ /// constructor.
+ TAO_AV_Protocol_Object (TAO_AV_Callback *callback,
+ TAO_AV_Transport *transport);
+
+ /// Destructor
+ virtual ~TAO_AV_Protocol_Object (void);
+
+ virtual int open (TAO_AV_Callback *callback,
+ TAO_AV_Transport *transport);
+
+ virtual int handle_input (void) = 0;
+
+ /// Called on a control object.
+ virtual int handle_control_input (ACE_Message_Block *control_frame,
+ const ACE_Addr &peer_address);
+
+ /// set/get policies.
+ virtual int set_policies (const TAO_AV_PolicyList &policy_list);
+ virtual TAO_AV_PolicyList get_policies (void);
+
+ /// start/stop the flow.
+ virtual int start (void);
+ virtual int stop (void);
+
+ /// send a data frame.
+ virtual int send_frame (ACE_Message_Block *frame,
+ TAO_AV_frame_info *frame_info = 0) = 0;
+
+ /// send a frame in iovecs.
+ virtual int send_frame (const iovec *iov,
+ int iovcnt,
+ TAO_AV_frame_info *frame_info = 0) = 0;
+
+ virtual int send_frame (const char *buf,
+ size_t len) = 0;
+
+ /// end the stream.
+ virtual void control_object (TAO_AV_Protocol_Object *object);
+ virtual int destroy (void) = 0;
+ TAO_AV_Transport *transport (void);
+protected:
+ TAO_AV_Transport *transport_;
+ TAO_AV_PolicyList policy_list_;
+ TAO_AV_Callback *callback_;
+};
+
+/**
+ * @class TAO_AV_Flow_Protocol_Factory
+ * @brief
+ */
+class TAO_AV_Export TAO_AV_Flow_Protocol_Factory : public ACE_Service_Object
+{
+public:
+ /// Initialization hook.
+ TAO_AV_Flow_Protocol_Factory (void);
+ virtual ~TAO_AV_Flow_Protocol_Factory (void);
+ virtual int init (int argc, char *argv[]);
+ virtual int match_protocol (const char *flow_string);
+ virtual TAO_AV_Protocol_Object* make_protocol_object (TAO_FlowSpec_Entry *entry,
+ TAO_Base_StreamEndPoint *endpoint,
+ TAO_AV_Flow_Handler *handler,
+ TAO_AV_Transport *transport);
+ virtual const char *control_flow_factory (void);
+ int ref_count;
+};
+
+TAO_END_VERSIONED_NAMESPACE_DECL
+
+#include /**/ "ace/post.h"
+#endif /* TAO_AV_PROTOCOL_FACTORY_T_H */
diff --git a/TAO/orbsvcs/orbsvcs/AV/QoS_UDP.cpp b/TAO/orbsvcs/orbsvcs/AV/QoS_UDP.cpp
new file mode 100644
index 00000000000..19aba484619
--- /dev/null
+++ b/TAO/orbsvcs/orbsvcs/AV/QoS_UDP.cpp
@@ -0,0 +1,1537 @@
+// $Id$
+
+
+#include "orbsvcs/AV/QoS_UDP.h"
+
+#if defined (ACE_HAS_RAPI) || defined (ACE_HAS_WINSOCK2_GQOS)
+
+#include "orbsvcs/AV/UDP.h"
+#include "orbsvcs/AV/AVStreams_i.h"
+#include "orbsvcs/AV/MCast.h"
+#include "orbsvcs/AV/Fill_ACE_QoS.h"
+
+#if !defined (__ACE_INLINE__)
+#include "orbsvcs/AV/QoS_UDP.i"
+#endif /* __ACE_INLINE__ */
+
+//------------------------------------------------------------
+// TAO_AV_UDP_Flow_Handler
+//------------------------------------------------------------
+
+static int resv_error = 0;
+static int resv_confirm = 0;
+
+TAO_BEGIN_VERSIONED_NAMESPACE_DECL
+
+int
+FillQoSParams (ACE_QoS_Params &qos_params,
+ iovec* iov,
+ ACE_QoS* qos)
+{
+ qos_params.callee_data (iov);
+ qos_params.caller_data (0);
+ qos_params.socket_qos (qos);
+ qos_params.group_socket_qos (0);
+ qos_params.flags (ACE_JL_BOTH);
+
+ return 0;
+}
+
+TAO_AV_UDP_QoS_Session_Helper::TAO_AV_UDP_QoS_Session_Helper (void)
+{
+
+}
+
+TAO_AV_UDP_QoS_Session_Helper::~TAO_AV_UDP_QoS_Session_Helper (void)
+{
+}
+
+int
+TAO_AV_UDP_QoS_Session_Helper::set_qos (ACE_Flow_Spec &ace_flow_spec,
+ TAO_AV_UDP_QoS_Flow_Handler *handler)
+{
+ ACE_QoS* ace_qos = 0;
+
+ ACE_NEW_RETURN (ace_qos,
+ ACE_QoS,
+ -1);
+
+ Fill_ACE_QoS fill_ace_qos;
+
+ if (handler->flowspec_entry ()->role () == TAO_FlowSpec_Entry::TAO_AV_PRODUCER)
+ {
+ if (fill_ace_qos.fill_simplex_sender_qos (*ace_qos,
+ &ace_flow_spec) !=0)
+ ACE_ERROR_RETURN ((LM_ERROR,
+ "Unable to fill simplex sender qos (%N|%l)\n"),
+ -1);
+ else
+ if (TAO_debug_level > 0)
+ ACE_DEBUG ((LM_DEBUG,
+ "Filled up the Sender QoS parameters\n"));
+ }
+ else if (handler->flowspec_entry ()->role () == TAO_FlowSpec_Entry::TAO_AV_CONSUMER)
+ {
+ if (fill_ace_qos.fill_simplex_receiver_qos (*ace_qos,
+ &ace_flow_spec) !=0)
+ ACE_ERROR_RETURN ((LM_ERROR,
+ "Unable to fill simplex receiver qos (%N|%l)\n"),
+ -1);
+ else
+ if (TAO_debug_level > 0)
+ ACE_DEBUG ((LM_DEBUG,
+ "Filled up the Receiver QoS parameters\n"));
+
+ }
+
+ ACE_QoS_Manager qos_manager = handler->get_socket ()->qos_manager ();
+
+ // Set the QoS for the session. Replaces the ioctl () call that
+ // was being made previously.
+ if (handler->qos_session ()->qos (handler->get_socket (),
+ &qos_manager,
+ *ace_qos) == -1)
+ ACE_ERROR_RETURN ((LM_ERROR,
+ "Unable to set QoS (%N|%l)\n"),
+ -1);
+ else
+ ACE_DEBUG ((LM_DEBUG,
+ "Setting QOS succeeds\n"));
+
+ return 0;
+}
+
+ACE_QoS_Session *
+TAO_AV_UDP_QoS_Session_Helper::open_qos_session (TAO_AV_UDP_QoS_Flow_Handler *handler,
+ ACE_INET_Addr &addr)
+{
+ ACE_QoS_Params qos_params;
+
+ ACE_QoS* ace_qos = 0;
+
+ FillQoSParams (qos_params,
+ 0,
+ ace_qos);
+
+
+ // Create a QoS Session Factory.
+ ACE_QoS_Session_Factory session_factory;
+
+ // Ask the factory to create a QoS session.
+ ACE_QoS_Session *qos_session = session_factory.create_session ();
+
+ // Create a destination address for the QoS session. The same
+ // address should be used for the subscribe call later. A copy
+ // is made below only to distinguish the two usages of the dest
+ // address.
+ ACE_INET_Addr dest_addr (addr);
+
+ // A QoS session is defined by the 3-tuple [DestAddr, DestPort,
+ // Protocol]. Initialize the QoS session.
+ if (qos_session->open (dest_addr,
+ IPPROTO_UDP) == -1)
+ ACE_ERROR_RETURN ((LM_ERROR,
+ "Error in opening the QoS session\n"),
+ 0);
+ else
+ ACE_DEBUG ((LM_DEBUG,
+ "QoS session opened successfully\n"));
+
+ if (handler->flowspec_entry ()->role () == TAO_FlowSpec_Entry::TAO_AV_PRODUCER)
+ {
+ // This is a sender
+ qos_session->flags (ACE_QoS_Session::ACE_QOS_SENDER);
+ }
+ else if (handler->flowspec_entry ()->role () == TAO_FlowSpec_Entry::TAO_AV_CONSUMER)
+ {
+ // This is a receiver
+ qos_session->flags (ACE_QoS_Session::ACE_QOS_RECEIVER);
+ }
+
+ return qos_session;
+}
+
+int
+TAO_AV_UDP_QoS_Session_Helper::activate_qos_handler (ACE_QoS_Session *qos_session,
+ TAO_AV_UDP_QoS_Flow_Handler *handler)
+{
+ ACE_QoS_Decorator* qos_decorator;
+
+ // Decorate the above handler with QoS functionality.
+ ACE_NEW_RETURN (qos_decorator,
+ ACE_QoS_Decorator (handler,
+ qos_session,
+ handler->av_core ()->reactor ()),
+ -1);
+
+ // Initialize the Decorator.
+ if (qos_decorator->init () != 0)
+ ACE_ERROR_RETURN ((LM_ERROR,
+ "QoS Decorator init () failed (%N|%l)\n"),
+ -1);
+
+ // Register the decorated Event Handler with the Reactor.
+ int result = handler->av_core ()->reactor ()->register_handler (qos_decorator,
+ ACE_Event_Handler::QOS_MASK |
+ ACE_Event_Handler::READ_MASK);
+ if (result == -1)
+ ACE_ERROR_RETURN ((LM_ERROR,
+ "Error in registering the Decorator with the Reactor (%N|%l)\n"),
+ -1);
+
+ return 0;
+
+}
+
+TAO_AV_UDP_QoS_Flow_Handler::TAO_AV_UDP_QoS_Flow_Handler (void)
+{
+ ACE_NEW (this->transport_,
+ TAO_AV_UDP_QoS_Transport (this));
+}
+
+TAO_AV_UDP_QoS_Flow_Handler::~TAO_AV_UDP_QoS_Flow_Handler (void)
+{
+ delete this->transport_;
+}
+
+TAO_AV_Transport *
+TAO_AV_UDP_QoS_Flow_Handler::transport (void)
+{
+ return this->transport_;
+}
+
+int
+TAO_AV_UDP_QoS_Flow_Handler::handle_input (ACE_HANDLE /*fd*/)
+{
+ this->protocol_object_->handle_input ();
+ return 0;
+}
+
+int
+TAO_AV_UDP_QoS_Flow_Handler::translate (CosPropertyService::Properties &qos_params,
+ ACE_Flow_Spec *ace_flow_spec)
+{
+ for (unsigned int i = 0;
+ i < qos_params.length ();
+ i++)
+ {
+ if (ACE_OS::strcmp (qos_params [i].property_name, "Service_Type") == 0)
+ {
+ CORBA::Short type;
+ qos_params [i].property_value >>= type;
+ ace_flow_spec->service_type (type);
+ }
+ else if (ACE_OS::strcmp (qos_params [i].property_name, "Token_Rate") == 0)
+ {
+ CORBA::ULong tok_rate;
+ qos_params [i].property_value >>= tok_rate;
+ ace_flow_spec->token_rate (tok_rate);
+ }
+ else if (ACE_OS::strcmp (qos_params [i].property_name, "Token_Bucket_Size") == 0)
+ {
+ CORBA::ULong tok_buck_size;
+ qos_params [i].property_value >>= tok_buck_size;
+ ace_flow_spec->token_bucket_size (tok_buck_size);
+ }
+ else if (ACE_OS::strcmp (qos_params [i].property_name, "Peak_Bandwidth") == 0)
+ {
+ CORBA::ULong peak_bw;
+ qos_params [i].property_value >>= peak_bw;
+ ace_flow_spec->peak_bandwidth (peak_bw);
+ }
+ else if (ACE_OS::strcmp (qos_params [i].property_name, "Latency") == 0)
+ {
+ CORBA::ULong lat;
+ qos_params [i].property_value >>= lat;
+ ace_flow_spec->latency (lat);
+ }
+ else if (ACE_OS::strcmp (qos_params [i].property_name, "Delay_Variation") == 0)
+ {
+ CORBA::ULong delay_var;
+ qos_params [i].property_value >>= delay_var;
+ ace_flow_spec->delay_variation (delay_var);
+ }
+ else if (ACE_OS::strcmp (qos_params [i].property_name, "Max_SDU_Size") == 0)
+ {
+ CORBA::ULong max_sdu;
+ qos_params [i].property_value >>= max_sdu;
+ ace_flow_spec->max_sdu_size (max_sdu);
+ }
+ else if (ACE_OS::strcmp (qos_params [i].property_name, "Minimum_Policed_Size") == 0)
+ {
+ CORBA::ULong min_pol_size;
+ qos_params [i].property_value >>= min_pol_size;
+ ace_flow_spec->minimum_policed_size (min_pol_size);
+ }
+ else if (ACE_OS::strcmp (qos_params [i].property_name, "TTL") == 0)
+ {
+ CORBA::ULong ttl;
+ qos_params [i].property_value >>= ttl;
+ ace_flow_spec->ttl (ttl);
+ }
+ else if (ACE_OS::strcmp (qos_params [i].property_name, "Priority") == 0)
+ {
+ CORBA::ULong priority;
+ qos_params [i].property_value >>= priority;
+ ace_flow_spec->priority (priority);
+ }
+ }
+
+ return 0;
+}
+
+int
+TAO_AV_UDP_QoS_Flow_Handler::translate (ACE_Flow_Spec *ace_flow_spec,
+ CosPropertyService::Properties &qos_params)
+{
+ qos_params.length (9);
+
+ qos_params [0].property_name = CORBA::string_dup ("Service_Type");
+ qos_params [0].property_value <<= (CORBA::Short) ace_flow_spec->service_type ();
+
+ qos_params [1].property_name = CORBA::string_dup ("Token_Rate");
+ qos_params [1].property_value <<= (CORBA::ULong) ace_flow_spec->token_rate ();
+
+ qos_params [2].property_name = CORBA::string_dup ("Token_Bucket_Size");
+ qos_params [2].property_value <<= (CORBA::ULong) ace_flow_spec->token_bucket_size ();
+
+ qos_params [3].property_name = CORBA::string_dup ("Peak_Bandwidth");
+ qos_params [3].property_value <<= (CORBA::ULong) ace_flow_spec->peak_bandwidth ();
+
+ qos_params [4].property_name = CORBA::string_dup ("Latency");
+ qos_params [4].property_value <<= (CORBA::ULong) ace_flow_spec->latency ();
+
+ qos_params [5].property_name = CORBA::string_dup ("Delay_Variation");
+ qos_params [5].property_value <<= (CORBA::ULong) ace_flow_spec->delay_variation ();
+
+ qos_params [6].property_name = CORBA::string_dup ("Max_SDU_Size");
+ qos_params [6].property_value <<= (CORBA::ULong) ace_flow_spec->max_sdu_size ();
+
+ qos_params [7].property_name = CORBA::string_dup ("Minimum_Policed_Size");
+ qos_params [7].property_value <<= (CORBA::ULong) ace_flow_spec->minimum_policed_size ();
+
+ qos_params [8].property_name = CORBA::string_dup ("TTL");
+ qos_params [8].property_value <<= (CORBA::ULong) ace_flow_spec->ttl ();
+
+ return 0;
+}
+
+int
+TAO_AV_UDP_QoS_Flow_Handler::handle_qos (ACE_HANDLE /*fd*/)
+{
+
+ ACE_DECLARE_NEW_CORBA_ENV;
+ if (TAO_debug_level > 0)
+ ACE_DEBUG ((LM_DEBUG,
+ "(%N,%l) TAO_AV_UDP_QoS_Flow_Handler::handle_qos\n"));
+
+ if (this->qos_session_->update_qos () == -1)
+ ACE_ERROR_RETURN ((LM_ERROR,
+ "Error in updating QoS\n"),
+ -1);
+ else
+ {
+ if(TAO_debug_level > 0)
+ ACE_DEBUG ((LM_DEBUG,
+ "(%N,%l) Updating QOS succeeds.\n"));
+ }
+
+ if (this->qos_session_->rsvp_event_type () == ACE_QoS_Session::RSVP_RESV_ERROR)
+ {
+ resv_error = 1;
+ }
+
+ if (this->qos_session_->rsvp_event_type () == ACE_QoS_Session::RSVP_RESV_CONFIRM)
+ {
+ resv_confirm = 1;
+ }
+
+ if (this->qos_session_->flags () == ACE_QoS_Session::ACE_QOS_SENDER)
+ {
+ if (this->qos_session_->rsvp_event_type () == ACE_QoS_Session::RSVP_RESV_EVENT)
+ {
+ if( TAO_debug_level > 0 )
+ {
+ ACE_DEBUG ((LM_DEBUG,
+ "(%N,%l) Resv Event Received\n"));
+ }
+ if (!CORBA::is_nil (this->negotiator_))
+ {
+ if( TAO_debug_level > 0 )
+ {
+ ACE_DEBUG ((LM_DEBUG,
+ "(%N,%l) Negotiator Specified\n"));
+ }
+
+ AVStreams::streamQoS new_qos;
+ ACE_Flow_Spec *ace_flow_spec =
+ this->qos_session_->qos ().sending_flowspec ();
+
+ if (ace_flow_spec != 0)
+ {
+ new_qos.length (1);
+ this->translate (ace_flow_spec,
+ new_qos [0].QoSParams);
+ }
+
+ AVStreams::Negotiator_var remote_negotiator;
+ this->negotiator_->negotiate (remote_negotiator.in (),
+ new_qos
+ ACE_ENV_ARG_PARAMETER);
+ }
+ }
+ }
+ else if (this->qos_session_->flags () == ACE_QoS_Session::ACE_QOS_RECEIVER)
+ {
+ if (this->qos_session_->rsvp_event_type () == ACE_QoS_Session::RSVP_PATH_EVENT)
+ {
+ ACE_QoS_Manager qos_manager =
+ this->get_socket ()->qos_manager ();
+
+ ACE_QoS ace_qos = this->qos_session_->qos ();
+
+ this->qos_session_->qos (this->get_socket (),
+ &qos_manager,
+ ace_qos);
+ }
+ }
+
+ return 0;
+}
+
+int
+TAO_AV_UDP_QoS_Flow_Handler::change_qos (AVStreams::QoS new_qos)
+{
+ if( TAO_debug_level > 0 )
+ {
+ ACE_DEBUG ((LM_DEBUG,
+ "(%N,%l) TAO_AV_UDP_QoS_Flow_Handler::change_qos\n"));
+ }
+
+ ACE_QoS* ace_qos = 0;
+
+ ACE_NEW_RETURN (ace_qos,
+ ACE_QoS,
+ -1);
+
+ if (new_qos.QoSParams.length () != 0)
+ {
+ ACE_DEBUG ((LM_DEBUG,
+ "New QoS Params are not Empty\n"));
+
+ ACE_Flow_Spec *ace_flow_spec;
+
+ ACE_NEW_RETURN (ace_flow_spec,
+ ACE_Flow_Spec,
+ -1);
+
+ this->translate (new_qos.QoSParams,
+ ace_flow_spec);
+
+
+ Fill_ACE_QoS fill_ace_qos;
+
+ if (this->qos_session_->flags () == ACE_QoS_Session::ACE_QOS_SENDER)
+ {
+ if (fill_ace_qos.fill_simplex_sender_qos (*ace_qos,
+ ace_flow_spec) !=0)
+ ACE_ERROR_RETURN ((LM_ERROR,
+ "Unable to fill simplex sender qos\n"),
+ -1);
+ else
+ {
+ if( TAO_debug_level > 0 )
+ ACE_DEBUG ((LM_DEBUG,
+ "(%N,%l) Filled up the Sender QoS parameters\n"));
+ }
+ }
+ else if (this->qos_session_->flags () == ACE_QoS_Session::ACE_QOS_RECEIVER)
+ {
+ if (fill_ace_qos.fill_simplex_receiver_qos (*ace_qos,
+ ace_flow_spec) !=0)
+ ACE_ERROR_RETURN ((LM_ERROR,
+ "Unable to fill simplex receiver qos\n"),
+ -1);
+ else
+ {
+ if( TAO_debug_level > 0 )
+ ACE_DEBUG ((LM_DEBUG,
+ "(%N,%l) Filled up the Receiver QoS parameters\n"));
+ }
+
+ }
+
+ ACE_QoS_Params qos_params;
+ FillQoSParams (qos_params,
+ 0,
+ ace_qos);
+ }
+
+ ACE_QoS_Manager qos_manager =
+ this->get_socket ()->qos_manager ();
+
+ int result = this->qos_session_->qos (this->get_socket (),
+ &qos_manager,
+ *ace_qos);
+ if (result != 0)
+ return result;
+
+ return 0;
+}
+
+int
+TAO_AV_UDP_QoS_Flow_Handler::handle_timeout (const ACE_Time_Value &tv,
+ const void *arg)
+{
+ return TAO_AV_Flow_Handler::handle_timeout (tv,arg);
+}
+
+int
+TAO_AV_UDP_QoS_Flow_Handler::set_remote_address (ACE_Addr *address)
+{
+
+ if (TAO_debug_level > 0)
+ {
+ char buf [BUFSIZ];
+ ACE_INET_Addr *remote_addr = dynamic_cast<ACE_INET_Addr*> (address);
+ remote_addr->addr_to_string (buf,
+ BUFSIZ);
+
+ ACE_DEBUG ((LM_DEBUG,
+ "(%N,%l) TAO_AV_UDP_QoS_Flow_Handler::set_remote_address %s\n",
+ buf));
+ }
+
+
+ ACE_INET_Addr *inet_addr =
+ dynamic_cast<ACE_INET_Addr*> (address);
+
+ this->peer_addr_ = *inet_addr;
+
+ TAO_AV_UDP_QoS_Transport *transport =
+ dynamic_cast<TAO_AV_UDP_QoS_Transport*> (this->transport_);
+
+ if (this->entry_->role () == TAO_FlowSpec_Entry::TAO_AV_PRODUCER)
+ {
+
+ TAO_AV_UDP_QoS_Session_Helper helper;
+
+ this->qos_session_ = helper.open_qos_session (this,
+ *inet_addr);
+
+ if (this->qos_session_ == 0)
+ ACE_ERROR_RETURN ((LM_ERROR,
+ "QoS Session Open Failed (%N|%l)\n"),
+ -1);
+
+ ACE_INET_Addr local_addr;
+ this->get_socket ()->get_local_addr (local_addr);
+
+ ACE_INET_Addr* src_addr;
+ ACE_NEW_RETURN (src_addr,
+ ACE_INET_Addr (local_addr.get_port_number (),
+ local_addr.get_host_name ()),
+ -1);
+
+ this->qos_session_->source_addr (src_addr);
+
+ if (helper.activate_qos_handler (this->qos_session_,
+ this) == -1)
+ ACE_ERROR_RETURN ((LM_ERROR,
+ "Activating QoS Handler Failed (%N|%l)\n"),
+ -1);
+ }
+ return transport->set_remote_address (*inet_addr);
+}
+
+
+ACE_HANDLE
+TAO_AV_UDP_QoS_Flow_Handler::get_handle (void) const
+{
+ if (TAO_debug_level > 0)
+ ACE_DEBUG ((LM_DEBUG,
+ "(%N,%l) TAO_AV_UDP_QoS_Flow_Handler::get_handle:%d\n",
+ this->qos_sock_dgram_.get_handle ()));
+
+ return this->qos_sock_dgram_.get_handle () ;
+}
+
+//------------------------------------------------------------
+// TAO_AV_UDP_Transport
+//------------------------------------------------------------
+
+TAO_AV_UDP_QoS_Transport::TAO_AV_UDP_QoS_Transport (void)
+ :handler_ (0)
+{
+}
+
+TAO_AV_UDP_QoS_Transport::TAO_AV_UDP_QoS_Transport (TAO_AV_UDP_QoS_Flow_Handler *handler)
+ :handler_ (handler),
+ addr_ (0)
+{
+}
+
+TAO_AV_UDP_QoS_Transport::~TAO_AV_UDP_QoS_Transport (void)
+{
+}
+
+int
+TAO_AV_UDP_QoS_Transport::set_remote_address (const ACE_INET_Addr &address)
+{
+ this->peer_addr_ = address;
+ return 0;
+}
+
+int
+TAO_AV_UDP_QoS_Transport::open (ACE_Addr * /*address*/)
+{
+ return 0;
+}
+
+int
+TAO_AV_UDP_QoS_Transport::close (void)
+{
+ return 0;
+}
+
+int
+TAO_AV_UDP_QoS_Transport::mtu (void)
+{
+ return ACE_MAX_DGRAM_SIZE;
+}
+
+ACE_Addr*
+TAO_AV_UDP_QoS_Transport::get_peer_addr (void)
+{
+ return &this->peer_addr_;
+}
+
+ssize_t
+TAO_AV_UDP_QoS_Transport::send (const ACE_Message_Block *mblk,
+ ACE_Time_Value *)
+{
+ // For the most part this was copied from GIOP::send_request and
+ // friends.
+
+ iovec iov[IOV_MAX];
+ int iovcnt = 0;
+ ssize_t n = 0;
+ ssize_t nbytes = 0;
+
+ for (const ACE_Message_Block *i = mblk;
+ i != 0;
+ i = i->cont ())
+ {
+ // Make sure there is something to send!
+ if (i->length () > 0)
+ {
+ iov[iovcnt].iov_base = i->rd_ptr ();
+ iov[iovcnt].iov_len = static_cast<u_long> (i->length ());
+ iovcnt++;
+
+ // The buffer is full make a OS call. @@ TODO this should
+ // be optimized on a per-platform basis, for instance, some
+ // platforms do not implement writev() there we should copy
+ // the data into a buffer and call send_n(). In other cases
+ // there may be some limits on the size of the iovec, there
+ // we should set IOV_MAX to that limit.
+
+ size_t bytes_sent = 0;
+
+ if (iovcnt == IOV_MAX)
+ {
+ if (this->handler_->get_socket ()->send (iov,
+ 1,
+ bytes_sent,
+ 0,
+ this->handler_->qos_session ()->dest_addr (),
+ 0,
+ 0) == -1)
+ ACE_ERROR_RETURN ((LM_ERROR,
+ "Error in dgram_mcast.send () (%N|%l)\n"),
+ -1);
+ else
+ if (TAO_debug_level > 0)
+ ACE_DEBUG ((LM_DEBUG,
+ "Using ACE_OS::sendto () : Bytes sent : %d",
+ bytes_sent));
+
+ if (n < 1)
+ return n;
+
+ nbytes += bytes_sent;
+ iovcnt = 0;
+ }
+ }
+ }
+
+ size_t bytes_sent = 0;
+
+ // Check for remaining buffers to be sent!
+ if (iovcnt != 0)
+ {
+ if (this->handler_->get_socket ()->send (iov,
+ 1,
+ bytes_sent,
+ 0,
+ this->handler_->qos_session ()->dest_addr (),
+ 0,
+ 0) == -1)
+ ACE_ERROR_RETURN ((LM_ERROR,
+ "Error in dgram_mcast.send ()\n"),
+ -1);
+ else
+ if( TAO_debug_level > 0)
+ ACE_DEBUG ((LM_DEBUG,
+ "(%N,%l) Using ACE_OS::sendto () : Bytes sent : %d",
+ bytes_sent));
+
+ if (n < 1)
+ return n;
+
+ nbytes += bytes_sent;
+ }
+
+ return nbytes;
+}
+
+ssize_t
+TAO_AV_UDP_QoS_Transport::send (const char *buf,
+ size_t len,
+ ACE_Time_Value *)
+{
+ if (TAO_debug_level > 0)
+ ACE_DEBUG ((LM_DEBUG,
+ "(%N,%l) TAO_AV_UDP_QoS_Transport::send "));
+
+ char addr [BUFSIZ];
+ this->peer_addr_.addr_to_string (addr,BUFSIZ);
+ if (TAO_debug_level > 0)
+ ACE_DEBUG ((LM_DEBUG,
+ "(%N,%l) to %s\n",
+ addr));
+
+ return this->handler_->get_socket ()->send (buf,
+ len,
+ this->handler_->qos_session ()->dest_addr (),
+ 0,
+ 0,
+ 0);
+}
+
+ssize_t
+TAO_AV_UDP_QoS_Transport::send (const iovec *iov,
+ int /*iovcnt*/,
+ ACE_Time_Value *)
+{
+ size_t bytes_sent = 0;
+ if (this->handler_->get_socket ()->send (iov,
+ 1,
+ bytes_sent,
+ 0,
+ this->handler_->qos_session ()->dest_addr (),
+ 0,
+ 0) == -1)
+ ACE_ERROR_RETURN ((LM_ERROR,
+ "Error in dgram_mcast.send ()\n"),
+ -1);
+ else
+ {
+ if( TAO_debug_level > 0)
+ ACE_DEBUG ((LM_DEBUG,
+ "(%N,%l) Using ACE_OS::sendto () : Bytes sent : %d",
+ bytes_sent));
+ }
+
+
+ return bytes_sent;
+}
+
+ssize_t
+TAO_AV_UDP_QoS_Transport::recv (char *buf,
+ size_t len,
+ ACE_Time_Value *)
+{
+ return this->handler_->get_socket ()->recv (buf, len,this->peer_addr_);
+}
+
+ssize_t
+TAO_AV_UDP_QoS_Transport::recv (char *buf,
+ size_t len,
+ int flags,
+ ACE_Time_Value *timeout)
+{
+ return this->handler_->get_socket ()->recv (buf,
+ len,
+ this->peer_addr_,
+ flags,
+ timeout);
+}
+
+ssize_t
+TAO_AV_UDP_QoS_Transport::recv (iovec *iov,
+ int /*iovcnt*/,
+ ACE_Time_Value *timeout)
+{
+ return handler_->get_socket ()->recv (iov,this->peer_addr_,0,timeout);
+}
+
+
+//------------------------------------------------------------
+// TAO_AV_UDP_Acceptor
+//------------------------------------------------------------
+
+TAO_AV_UDP_QoS_Acceptor::TAO_AV_UDP_QoS_Acceptor (void)
+{
+}
+
+TAO_AV_UDP_QoS_Acceptor::~TAO_AV_UDP_QoS_Acceptor (void)
+{
+}
+
+int
+TAO_AV_UDP_QoS_Acceptor::activate_svc_handler (TAO_AV_UDP_QoS_Flow_Handler *handler)
+{
+ int result = 0;
+
+ if (TAO_debug_level > 0)
+ ACE_DEBUG ((LM_DEBUG,
+ "(%N,%l) Acceptor Svc Handler QOS ENABLED \n"));
+
+ TAO_AV_UDP_QoS_Session_Helper helper;
+
+ result = helper.activate_qos_handler (handler->qos_session (),
+ handler);
+ if (result == -1)
+ ACE_ERROR_RETURN ((LM_ERROR,
+ "Error in registering the Decorator with the Reactor\n"),
+ -1);
+
+ return result;
+}
+
+int
+TAO_AV_UDP_QoS_Acceptor::open (TAO_Base_StreamEndPoint *endpoint,
+ TAO_AV_Core *av_core,
+ TAO_FlowSpec_Entry *entry,
+ TAO_AV_Flow_Protocol_Factory *factory,
+ TAO_AV_Core::Flow_Component flow_comp)
+{
+ ACE_UNUSED_ARG (flow_comp);
+
+ if (TAO_debug_level > 0)
+ ACE_DEBUG ((LM_DEBUG,
+ "(%N,%l) TAO_AV_UDP_QoS_Acceptor::open "));
+
+ this->av_core_ = av_core;
+ this->endpoint_ = endpoint;
+ this->entry_ = entry;
+
+
+ this->flow_protocol_factory_ = factory;
+ this->flowname_ = entry->flowname ();
+ ACE_INET_Addr *inet_addr = (ACE_INET_Addr *) entry->address ();
+// inet_addr->set (inet_addr->get_port_number (),
+// inet_addr->get_host_name ());
+ char buf[BUFSIZ];
+ inet_addr->addr_to_string (buf,
+ BUFSIZ);
+ if (TAO_debug_level > 0)
+ ACE_DEBUG ((LM_DEBUG,
+ "(%N,%l) TAO_AV_UDP_QoS_Acceptor::open: %s",
+ buf));
+
+ int result = this->open_i (inet_addr);
+
+ if (result < 0)
+ return result;
+
+ return 0;
+}
+
+int
+TAO_AV_UDP_QoS_Acceptor::open_default (TAO_Base_StreamEndPoint *endpoint,
+ TAO_AV_Core *av_core,
+ TAO_FlowSpec_Entry *entry,
+ TAO_AV_Flow_Protocol_Factory *factory,
+ TAO_AV_Core::Flow_Component flow_comp)
+{
+ ACE_UNUSED_ARG (flow_comp);
+
+ this->av_core_ = av_core;
+ this->endpoint_ = endpoint;
+ this->entry_ = entry;
+ this->flow_protocol_factory_ = factory;
+ this->flowname_ = entry->flowname ();
+ char buf [BUFSIZ];
+ ACE_OS::hostname (buf,
+ BUFSIZ);
+ qos_acceptor_addr_.set((u_short)0, buf);
+/* ACE_INET_Addr *address;
+ ACE_NEW_RETURN (address,
+ ACE_INET_Addr ("0"),
+ -1);
+
+ address->addr_to_string (buf,
+ BUFSIZ);*/
+ ACE_DEBUG ((LM_DEBUG,
+ "(%N,%l) ADDRESS IS %s:%d\n",
+ buf, qos_acceptor_addr_.get_port_number() ));
+
+ int result = this->open_i (&qos_acceptor_addr_);
+ if (result < 0)
+ return result;
+ return 0;
+}
+
+
+int
+TAO_AV_UDP_QoS_Acceptor::open_i (ACE_INET_Addr *inet_addr)
+{
+ ACE_DECLARE_NEW_CORBA_ENV;
+ int result = 0;
+
+ // TAO_AV_Callback *callback = 0;
+ // this->endpoint_->get_callback (this->flowname_.c_str (),
+ // callback);
+ ACE_INET_Addr *local_addr;
+
+ ACE_NEW_RETURN (local_addr,
+ ACE_INET_Addr (*inet_addr),
+ -1);
+
+ ACE_QoS_Params qos_params;
+
+ ACE_QoS* ace_qos = 0;
+
+ FillQoSParams (qos_params,
+ 0,
+ ace_qos);
+
+
+ TAO_AV_UDP_QoS_Flow_Handler* handler;
+ ACE_NEW_RETURN (handler,
+ TAO_AV_UDP_QoS_Flow_Handler,
+ -1);
+
+
+ TAO_AV_Flow_Handler *flow_handler = 0;
+ flow_handler = handler;
+
+ handler->endpoint (this->endpoint_);
+ handler->flowspec_entry (this->entry_);
+ handler->av_core (this->av_core_);
+
+ if (this->entry_->role () == TAO_FlowSpec_Entry::TAO_AV_CONSUMER)
+ {
+
+ TAO_AV_UDP_QoS_Session_Helper helper;
+
+ int result = handler->get_socket ()->open (*inet_addr,
+ qos_params,
+ AF_INET,
+ 0,
+ 0,
+ 0,
+ ACE_OVERLAPPED_SOCKET_FLAG
+ | ACE_FLAG_MULTIPOINT_C_LEAF
+ | ACE_FLAG_MULTIPOINT_D_LEAF,
+ 1);
+
+ if (result < 0)
+ ACE_ERROR_RETURN ((LM_ERROR,
+ "TAO_AV_QOS_UDP_MCast_Acceptor data socket open failed (%N|%l)\n"),
+ -1);
+
+ result = handler->get_socket ()->get_local_addr (*local_addr);
+ if (result < 0)
+ ACE_ERROR_RETURN ((LM_ERROR,
+ "Error in getting Local Address (%N|%l)\n"),
+ -1);
+
+ // Create a destination address for the QoS session. The same
+ // address should be used for the subscribe call later. A copy
+ // is made below only to distinguish the two usages of the dest
+ // address.
+ ACE_INET_Addr dest_addr;
+ dest_addr.set (local_addr->get_port_number (),
+ local_addr->get_host_name ());
+
+ char dest_buf [BUFSIZ];
+ dest_addr.addr_to_string (dest_buf,
+ BUFSIZ);
+
+ if (TAO_debug_level > 0)
+ ACE_DEBUG ((LM_DEBUG,
+ "Session Address is %s\n",
+ dest_buf));
+
+ this->qos_session_ = helper.open_qos_session (handler,
+ dest_addr);
+
+ if (this->qos_session_ == 0)
+ ACE_ERROR_RETURN ((LM_ERROR,
+ "QoS Session Open Failed (%N|%l)\n"),
+ -1);
+
+ handler->qos_session (this->qos_session_);
+
+ if (this->activate_svc_handler (handler) == -1)
+ ACE_ERROR_RETURN ((LM_ERROR,
+ "Activate Svc Handler Failed (%N|%l)\n"),
+ -1);
+
+ AVStreams::QoS qos;
+ int qos_available = this->endpoint_->qos ().get_flow_qos (this->flowname_.c_str (),
+ qos);
+
+ if (qos_available == 0)
+ {
+
+ ACE_Flow_Spec *ace_flow_spec = 0;
+ ACE_NEW_RETURN (ace_flow_spec,
+ ACE_Flow_Spec,
+ -1);
+
+ handler->translate (qos.QoSParams,
+ ace_flow_spec);
+
+ if (helper.set_qos (*ace_flow_spec,
+ handler) == -1)
+
+ ACE_ERROR_RETURN ((LM_ERROR,
+ "Set QoS Failed (%N|%l)\n"),
+ -1);
+ }
+ }
+ else
+ {
+
+ int result = handler->get_socket ()->open (*inet_addr,
+ qos_params,
+ AF_INET,
+ 0,
+ 0,
+ 0,
+ ACE_OVERLAPPED_SOCKET_FLAG
+ | ACE_FLAG_MULTIPOINT_C_LEAF
+ | ACE_FLAG_MULTIPOINT_D_LEAF,
+ 1);
+
+ if (result < 0)
+ ACE_ERROR_RETURN ((LM_ERROR,
+ "TAO_AV_QOS_UDP_MCast_Acceptor data socket open failed (%N|%l)\n"),
+ -1);
+ }
+
+ TAO_AV_Protocol_Object *object =
+ this->flow_protocol_factory_->make_protocol_object (this->entry_,
+ this->endpoint_,
+ flow_handler,
+ flow_handler->transport ());
+ flow_handler->protocol_object (object);
+
+ AVStreams::Negotiator_ptr negotiator;
+
+ ACE_TRY_EX (negotiator)
+ {
+ CORBA::Any_ptr negotiator_any =
+ this->endpoint_->get_property_value ("Negotiator"
+ ACE_ENV_ARG_PARAMETER);
+ ACE_TRY_CHECK_EX (negotiator);
+
+ *negotiator_any >>= negotiator;
+ handler->negotiator (negotiator);
+ }
+ ACE_CATCHANY
+ {
+ ACE_DEBUG ((LM_DEBUG,
+ "(%N,%l) Negotiator Not Found \n"));
+ }
+ ACE_ENDTRY;
+
+ this->endpoint_->set_flow_handler (this->flowname_.c_str (),flow_handler);
+ this->entry_->protocol_object (object);
+
+ result = handler->get_socket ()->get_local_addr (*local_addr);
+ if (result < 0)
+ ACE_ERROR_RETURN ((LM_ERROR,"TAO_AV_Dgram_Connector::open: get_local_addr failed\n"),result);
+ local_addr->set (local_addr->get_port_number (),
+ local_addr->get_host_name ());
+
+ if (TAO_debug_level > 0)
+ {
+ char buf [BUFSIZ];
+ local_addr->addr_to_string (buf,
+ BUFSIZ);
+ ACE_DEBUG ((LM_DEBUG,
+ "Local Address is %s\n",
+ buf));
+ }
+
+ this->entry_->set_local_addr (local_addr);
+ this->entry_->handler (flow_handler);
+
+ return 0;
+
+}
+
+int
+TAO_AV_UDP_QoS_Acceptor::close (void)
+{
+ return 0;
+}
+
+//------------------------------------------------------------
+// TAO_AV_UDP_Connector
+//------------------------------------------------------------
+TAO_AV_UDP_QoS_Connector::TAO_AV_UDP_QoS_Connector (void)
+{
+}
+
+TAO_AV_UDP_QoS_Connector::~TAO_AV_UDP_QoS_Connector (void)
+{
+}
+
+int
+TAO_AV_UDP_QoS_Connector::open (TAO_Base_StreamEndPoint *endpoint,
+ TAO_AV_Core *av_core,
+ TAO_AV_Flow_Protocol_Factory *factory)
+
+{
+ if (TAO_debug_level > 0)
+ ACE_DEBUG ((LM_DEBUG,
+ "TAO_AV_UDP_QoS_Connector::open "));
+
+ this->endpoint_ = endpoint;
+ this->av_core_ = av_core;
+ this->flow_protocol_factory_ = factory;
+ return 0;
+}
+
+// int
+// TAO_AV_UDP_QoS_Connector::translate (CosPropertyService::Properties &qos_params,
+// ACE_Flow_Spec *ace_flow_spec)
+// {
+// for (unsigned int i = 0;
+// i < qos_params.length ();
+// i++)
+// {
+// if (ACE_OS::strcmp (qos_params [i].property_name, "Service_Type") == 0)
+// {
+// CORBA::Short type;
+// qos_params [i].property_value >>= type;
+// ace_flow_spec->service_type (type);
+// }
+// else if (ACE_OS::strcmp (qos_params [i].property_name, "Token_Rate") == 0)
+// {
+// CORBA::ULong tok_rate;
+// qos_params [i].property_value >>= tok_rate;
+// ace_flow_spec->token_rate (tok_rate);
+// }
+// else if (ACE_OS::strcmp (qos_params [i].property_name, "Token_Bucket_Rate") == 0)
+// {
+// CORBA::ULong tok_buck_size;
+// qos_params [i].property_value >>= tok_buck_size;
+// ace_flow_spec->token_bucket_size (tok_buck_size);
+// }
+// else if (ACE_OS::strcmp (qos_params [i].property_name, "Peak_Bandwidth") == 0)
+// {
+// CORBA::ULong peak_bw;
+// qos_params [i].property_value >>= peak_bw;
+// ace_flow_spec->peak_bandwidth (peak_bw);
+// }
+// else if (ACE_OS::strcmp (qos_params [i].property_name, "Latency") == 0)
+// {
+// CORBA::ULong lat;
+// qos_params [i].property_value >>= lat;
+// ace_flow_spec->latency (lat);
+// }
+// else if (ACE_OS::strcmp (qos_params [i].property_name, "Delay_Variation") == 0)
+// {
+// CORBA::ULong delay_var;
+// qos_params [i].property_value >>= delay_var;
+// ace_flow_spec->delay_variation (delay_var);
+// }
+
+// }
+
+// return 0;
+// }
+
+
+int
+TAO_AV_UDP_QoS_Connector::connect (TAO_FlowSpec_Entry *entry,
+ TAO_AV_Transport *&transport,
+ TAO_AV_Core::Flow_Component flow_comp)
+{
+ ACE_UNUSED_ARG (flow_comp);
+
+ ACE_DECLARE_NEW_CORBA_ENV;
+ int result = 0;
+ this->entry_ = entry;
+ this->flowname_ = entry->flowname ();
+
+ ACE_INET_Addr *local_addr;
+
+ if (entry->get_peer_addr () != 0)
+ {
+ local_addr = dynamic_cast<ACE_INET_Addr*> (entry->get_peer_addr ());
+ }
+ else
+ ACE_NEW_RETURN (local_addr,
+ ACE_INET_Addr ("0"),
+ -1);
+
+ TAO_AV_Flow_Handler *flow_handler = 0;
+
+ TAO_AV_UDP_QoS_Flow_Handler *handler;
+ ACE_NEW_RETURN (handler,
+ TAO_AV_UDP_QoS_Flow_Handler,
+ -1);
+
+ flow_handler = handler;
+
+ handler->endpoint (this->endpoint_);
+ handler->flowspec_entry (this->entry_);
+ handler->av_core (this->av_core_);
+
+ ACE_INET_Addr *inet_addr = dynamic_cast<ACE_INET_Addr*> (entry->address ());
+
+ ACE_QoS_Params qos_params;
+
+ ACE_QoS* ace_qos = 0;
+
+ FillQoSParams (qos_params,
+ 0,
+ ace_qos);
+
+ result = handler->get_socket ()->open (*local_addr,
+ qos_params,
+ AF_INET,
+ 0,
+ 0,
+ 0,
+ ACE_OVERLAPPED_SOCKET_FLAG
+ | ACE_FLAG_MULTIPOINT_C_LEAF
+ | ACE_FLAG_MULTIPOINT_D_LEAF,
+ 1);
+
+ if (result < 0)
+ ACE_ERROR_RETURN ((LM_ERROR,
+ "Data socket open failed (%N|%l)\n"),
+ -1);
+
+ result = handler->get_socket ()->get_local_addr (*local_addr);
+
+
+ ACE_INET_Addr *session_addr = 0;
+ if (this->entry_->role () == TAO_FlowSpec_Entry::TAO_AV_CONSUMER)
+ {
+ ACE_NEW_RETURN (session_addr,
+ ACE_INET_Addr,
+ -1);
+
+ session_addr->set (local_addr->get_port_number (),
+ local_addr->get_host_name ());
+
+ }
+ else
+ {
+ session_addr = inet_addr;
+ }
+
+ char sess_buf [BUFSIZ];
+ session_addr->addr_to_string (sess_buf,
+ BUFSIZ);
+
+ if (TAO_debug_level > 0)
+ ACE_DEBUG ((LM_DEBUG,
+ "Session Address is %s\n",
+ sess_buf));
+
+ // Create a destination address for the QoS session. The same
+ // address should be used for the subscribe call later. A copy
+ // is made below only to distinguish the two usages of the dest
+ // address.
+ ACE_INET_Addr dest_addr (*session_addr);
+
+ TAO_AV_UDP_QoS_Session_Helper helper;
+
+ this->qos_session_ = helper.open_qos_session (handler,
+ *session_addr);
+
+ if (this->qos_session_ == 0)
+ ACE_ERROR_RETURN ((LM_ERROR,
+ "QoS Session Open Failed (%N|%l)\n"),
+ -1);
+ else
+ ACE_DEBUG ((LM_DEBUG,
+ "QoS session opened successfully\n"));
+
+ if (this->entry_->role () == TAO_FlowSpec_Entry::TAO_AV_PRODUCER)
+ {
+ //this->qos_session_->source_port (local_addr->get_port_number ());
+ ACE_INET_Addr* src_addr;
+ ACE_NEW_RETURN (src_addr,
+ ACE_INET_Addr (local_addr->get_port_number (),
+ local_addr->get_host_name ()),
+ -1);
+
+ this->qos_session_->source_addr (src_addr);
+
+ }
+
+ handler->qos_session (this->qos_session_);
+
+ this->qos_manager_ =
+ handler->get_socket ()->qos_manager ();
+
+ AVStreams::QoS qos;
+
+ int qos_available = this->endpoint_->qos ().get_flow_qos (this->flowname_.c_str (),
+ qos);
+ if (qos_available == 0)
+ {
+
+ ACE_Flow_Spec* ace_flow_spec;
+ ACE_NEW_RETURN (ace_flow_spec,
+ ACE_Flow_Spec,
+ -1);
+
+ handler->translate (qos.QoSParams,
+ ace_flow_spec);
+
+ if (helper.set_qos (*ace_flow_spec,
+ handler) == -1)
+ ACE_ERROR_RETURN ((LM_ERROR,
+ "Unable to set QoS (%N|%l)\n"),
+ -1);
+ else
+ {
+ if( TAO_debug_level > 0)
+ ACE_DEBUG ((LM_DEBUG,
+ "(%N,%l) Setting QOS succeeds.\n"));
+ }
+ }
+
+ TAO_AV_Protocol_Object *object =
+ this->flow_protocol_factory_->make_protocol_object (this->entry_,
+ this->endpoint_,
+ flow_handler,
+ flow_handler->transport ());
+
+ AVStreams::Negotiator_ptr negotiator;
+
+ ACE_TRY_EX (negotiator)
+ {
+ CORBA::Any_ptr negotiator_any =
+ this->endpoint_->get_property_value ("Negotiator"
+ ACE_ENV_ARG_PARAMETER);
+ ACE_TRY_CHECK_EX (negotiator);
+
+ *negotiator_any >>= negotiator;
+ handler->negotiator (negotiator);
+ }
+ ACE_CATCHANY
+ {
+ ACE_DEBUG ((LM_DEBUG,
+ "Negotiator not found for flow %s\n",
+ this->entry_->flowname ()));
+ }
+ ACE_ENDTRY;
+
+ flow_handler->protocol_object (object);
+
+ this->endpoint_->set_flow_handler (this->flowname_.c_str (),flow_handler);
+ this->entry_->protocol_object (object);
+
+ result = handler->get_socket ()->get_local_addr (*local_addr);
+ if (result < 0)
+ ACE_ERROR_RETURN ((LM_ERROR,
+ "Get local addr failed (%N|%l)\n"),
+ result);
+
+ local_addr->set (local_addr->get_port_number (),
+ local_addr->get_host_name ());
+
+ if (TAO_debug_level > 0)
+ {
+ char buf[BUFSIZ];
+ local_addr->addr_to_string (buf,
+ BUFSIZ);
+
+ ACE_DEBUG ((LM_DEBUG,
+ "Local Address is %s\n",
+ buf));
+ }
+
+ entry->set_local_addr (local_addr);
+ entry->handler (flow_handler);
+ transport = flow_handler->transport ();
+
+ // call activate svc handler.
+ return this->activate_svc_handler (handler);
+}
+
+int
+TAO_AV_UDP_QoS_Connector::activate_svc_handler (TAO_AV_UDP_QoS_Flow_Handler *handler)
+{
+ int result = 0;
+
+ TAO_AV_UDP_QoS_Session_Helper helper;
+
+ result = helper.activate_qos_handler (this->qos_session_,
+ handler);
+
+ if (result == -1)
+ ACE_ERROR_RETURN ((LM_ERROR,
+ "(%N,%l) Error in registering the Decorator with the Reactor\n"),
+ -1);
+
+ return result;
+}
+
+int
+TAO_AV_UDP_QoS_Connector::close (void)
+{
+ return 0;
+}
+
+//------------------------------------------------------------
+// TAO_AV_UDP_Protocol_Factory
+//------------------------------------------------------------
+
+TAO_AV_UDP_QoS_Factory::TAO_AV_UDP_QoS_Factory (void)
+{
+ if (TAO_debug_level > 0)
+ ACE_DEBUG ((LM_DEBUG,
+ "TAO_AV_UDP_QoS_Factory::TAO_AV_UDP_QoS_Factory\n"));
+}
+
+TAO_AV_UDP_QoS_Factory::~TAO_AV_UDP_QoS_Factory (void)
+{
+}
+
+int
+TAO_AV_UDP_QoS_Factory::match_protocol (const char *protocol_string)
+{
+ if (TAO_debug_level > 0)
+ ACE_DEBUG ((LM_DEBUG,
+ "TAO_AV_UDP_QoS_Factory::match_protocol\n"));
+
+ if (ACE_OS::strcasecmp (protocol_string,"QoS_UDP") == 0)
+ return 1;
+ return 0;
+}
+
+TAO_AV_Acceptor*
+TAO_AV_UDP_QoS_Factory::make_acceptor (void)
+{
+ if (TAO_debug_level > 0)
+ ACE_DEBUG ((LM_DEBUG,
+ "TAO_AV_UDP_QoS_Factory::make_acceptor "));
+
+ TAO_AV_Acceptor *acceptor = 0;
+ ACE_NEW_RETURN (acceptor,
+ TAO_AV_UDP_QoS_Acceptor,
+ 0);
+ return acceptor;
+}
+
+TAO_AV_Connector*
+TAO_AV_UDP_QoS_Factory::make_connector (void)
+{
+ if (TAO_debug_level > 0)
+ ACE_DEBUG ((LM_DEBUG,
+ "TAO_AV_UDP_QoS_Factory::make_connector "));
+
+ TAO_AV_Connector *connector = 0;
+ ACE_NEW_RETURN (connector,
+ TAO_AV_UDP_QoS_Connector,
+ 0);
+ return connector;
+}
+
+int
+TAO_AV_UDP_QoS_Factory::init (int /* argc */,
+ char * /* argv */ [])
+{
+ return 0;
+}
+
+
+//------------------------------------------------------------
+// TAO_AV_UDP_Flow_Factory
+//------------------------------------------------------------
+TAO_AV_UDP_QoS_Flow_Factory::TAO_AV_UDP_QoS_Flow_Factory (void)
+{
+ if (TAO_debug_level > 0)
+ ACE_DEBUG ((LM_DEBUG,
+ "TAO_AV_UDP_QoS_Flow_Factory::TAO_AV_UDP_QoS_Flow_Factory\n"));
+}
+
+TAO_AV_UDP_QoS_Flow_Factory::~TAO_AV_UDP_QoS_Flow_Factory (void)
+{
+}
+
+int
+TAO_AV_UDP_QoS_Flow_Factory::init (int /* argc */,
+ char * /* argv */ [])
+{
+ return 0;
+}
+
+int
+TAO_AV_UDP_QoS_Flow_Factory::match_protocol (const char *flow_string)
+{
+ if (ACE_OS::strcasecmp (flow_string,"QoS_UDP") == 0)
+ return 1;
+ return 0;
+}
+
+TAO_AV_Protocol_Object*
+TAO_AV_UDP_QoS_Flow_Factory::make_protocol_object (TAO_FlowSpec_Entry *entry,
+ TAO_Base_StreamEndPoint *endpoint,
+ TAO_AV_Flow_Handler *handler,
+ TAO_AV_Transport *transport)
+{
+ TAO_AV_Callback *callback = 0;
+ endpoint->get_callback (entry->flowname (),
+ callback);
+
+
+ TAO_AV_UDP_Object *object = 0;
+ ACE_NEW_RETURN (object,
+ TAO_AV_UDP_Object (callback,
+ transport),
+ 0);
+ callback->open (object,
+ handler);
+ endpoint->set_protocol_object (entry->flowname (),
+ object);
+ return object;
+}
+
+TAO_END_VERSIONED_NAMESPACE_DECL
+
+ACE_FACTORY_DEFINE (TAO_AV, TAO_AV_UDP_QoS_Flow_Factory)
+ACE_STATIC_SVC_DEFINE (TAO_AV_UDP_QoS_Flow_Factory,
+ ACE_TEXT ("UDP_QoS_Flow_Factory"),
+ ACE_SVC_OBJ_T,
+ &ACE_SVC_NAME (TAO_AV_UDP_QoS_Flow_Factory),
+ ACE_Service_Type::DELETE_THIS |
+ ACE_Service_Type::DELETE_OBJ,
+ 0)
+
+ACE_FACTORY_DEFINE (TAO_AV, TAO_AV_UDP_QoS_Factory)
+
+ACE_STATIC_SVC_DEFINE (TAO_AV_UDP_QoS_Factory,
+ ACE_TEXT ("UDP_QoS_Factory"),
+ ACE_SVC_OBJ_T,
+ &ACE_SVC_NAME (TAO_AV_UDP_QoS_Factory),
+ ACE_Service_Type::DELETE_THIS |
+ ACE_Service_Type::DELETE_OBJ,
+ 0)
+
+#endif /* ACE_HAS_RAPI || ACE_HAS_WINSOCK2_GQOS */
diff --git a/TAO/orbsvcs/orbsvcs/AV/QoS_UDP.h b/TAO/orbsvcs/orbsvcs/AV/QoS_UDP.h
new file mode 100644
index 00000000000..7100217f263
--- /dev/null
+++ b/TAO/orbsvcs/orbsvcs/AV/QoS_UDP.h
@@ -0,0 +1,306 @@
+// -*- C++ -*-
+
+// $Id$
+// ============================================================================
+//
+// = LIBRARY
+// ORBSVCS AVStreams
+//
+// = FILENAME
+// UDP.h
+//
+// = AUTHOR
+// Yamuna Krishnamurthy <yamuna@cs.wustl.edu>
+//
+// ============================================================================
+
+#ifndef TAO_AV_QOS_UDP_H
+#define TAO_AV_QOS_UDP_H
+#include /**/ "ace/pre.h"
+
+
+#include "ace/config-all.h"
+
+#if defined (ACE_HAS_RAPI) || defined (ACE_HAS_WINSOCK2_GQOS)
+
+#include "orbsvcs/AV/Protocol_Factory.h"
+
+#include "ace/OS.h"
+#include "ace/Service_Config.h"
+#include "ace/QoS/QoS_Session_Factory.h"
+#include "ace/QoS/QoS_Decorator.h"
+#include "ace/QoS/SOCK_Dgram_Mcast_QoS.h"
+
+TAO_BEGIN_VERSIONED_NAMESPACE_DECL
+
+class TAO_AV_Export TAO_AV_UDP_QoS_Factory : public TAO_AV_Transport_Factory
+{
+public:
+ TAO_AV_UDP_QoS_Factory (void);
+ virtual ~TAO_AV_UDP_QoS_Factory (void);
+ virtual int init (int argc, char *argv[]);
+ // Initialization hook.
+ virtual int match_protocol (const char *protocol_string);
+ virtual TAO_AV_Acceptor *make_acceptor (void);
+ virtual TAO_AV_Connector *make_connector (void);
+};
+
+class TAO_AV_UDP_QoS_Flow_Handler;
+
+/**
+ * @class TAO_AV_UDP_QoS_Transport
+ *
+ * @brief A transport abstraction for udp sockets.
+ *
+ * Uses the ACE_SOCK_Dgram to send the data.
+ */
+class TAO_AV_UDP_QoS_Transport
+ :public TAO_AV_Transport
+{
+public:
+ TAO_AV_UDP_QoS_Transport (void);
+
+ TAO_AV_UDP_QoS_Transport (TAO_AV_UDP_QoS_Flow_Handler *handler);
+
+ virtual ~TAO_AV_UDP_QoS_Transport (void);
+
+ virtual int open (ACE_Addr *addr);
+
+ virtual int close (void);
+
+ virtual int mtu (void);
+
+ virtual ACE_Addr *get_peer_addr (void);
+
+ virtual int set_remote_address (const ACE_INET_Addr &address);
+
+ /// Write the complete Message_Block chain to the connection.
+ virtual ssize_t send (const ACE_Message_Block *mblk,
+ ACE_Time_Value *s = 0);
+
+ /// Write the contents of the buffer of length len to the connection.
+ virtual ssize_t send (const char *buf,
+ size_t len,
+ ACE_Time_Value *s = 0);
+
+ /// Write the contents of iovcnt iovec's to the connection.
+ virtual ssize_t send (const iovec *iov,
+ int iovcnt,
+ ACE_Time_Value *s = 0);
+
+ /// Read len bytes from into buf.
+ virtual ssize_t recv (char *buf,
+ size_t len,
+ ACE_Time_Value *s = 0);
+
+ /// Read len bytes from into buf using flags.
+ virtual ssize_t recv (char *buf,
+ size_t len,
+ int flags,
+ ACE_Time_Value *s = 0);
+
+ /// Read received data into the iovec buffers.
+ virtual ssize_t recv (iovec *iov,
+ int iovcnt,
+ ACE_Time_Value *s = 0);
+protected:
+ TAO_AV_UDP_QoS_Flow_Handler *handler_;
+ ACE_Addr *addr_;
+ ACE_INET_Addr peer_addr_;
+};
+
+class TAO_AV_UDP_QoS_Flow_Handler
+ :public virtual TAO_AV_Flow_Handler,
+ public virtual ACE_Event_Handler
+{
+public:
+ /// Constructor.
+ TAO_AV_UDP_QoS_Flow_Handler (void);
+ /// Destructor.
+ ~TAO_AV_UDP_QoS_Flow_Handler (void);
+ int open (ACE_Addr &address);
+ virtual TAO_AV_Transport *transport (void);
+ virtual int set_remote_address (ACE_Addr *address);
+ virtual ACE_HANDLE get_handle (void) const;
+ virtual int handle_input (ACE_HANDLE fd);
+ virtual int handle_timeout (const ACE_Time_Value &tv, const void *arg = 0);
+ virtual int change_qos (AVStreams::QoS);
+ /// Handles a QoS event. Right now, just
+ /// prints a message.
+ virtual int handle_qos (ACE_HANDLE fd);
+ ACE_SOCK_Dgram_Mcast_QoS *get_socket (void);
+ virtual ACE_Event_Handler* event_handler (void){ return this; }
+ virtual ACE_QoS_Session* qos_session (void);
+ virtual void qos_session (ACE_QoS_Session *qos_session);
+
+ int translate (ACE_Flow_Spec *ace_flow_spec,
+ CosPropertyService::Properties &qos_params);
+ int translate (CosPropertyService::Properties &qos_params,
+ ACE_Flow_Spec *ace_flow_spec);
+
+ void negotiator (AVStreams::Negotiator_ptr);
+
+ void endpoint (TAO_Base_StreamEndPoint *endpoint);
+ TAO_Base_StreamEndPoint* endpoint (void);
+
+ void flowspec_entry (TAO_FlowSpec_Entry *entry);
+ TAO_FlowSpec_Entry* flowspec_entry (void);
+
+ void av_core (TAO_AV_Core *avcore);
+ TAO_AV_Core* av_core (void);
+
+protected:
+ TAO_AV_Core *av_core_;
+ ACE_INET_Addr peer_addr_;
+ ACE_SOCK_Dgram_Mcast_QoS qos_sock_dgram_;
+ ACE_QoS_Session *qos_session_;
+ TAO_FlowSpec_Entry *entry_;
+ TAO_Base_StreamEndPoint *endpoint_;
+ AVStreams::Negotiator_ptr negotiator_;
+};
+
+class TAO_AV_UDP_QoS_Acceptor
+ :public TAO_AV_Acceptor
+{
+public:
+ TAO_AV_UDP_QoS_Acceptor (void);
+ virtual ~TAO_AV_UDP_QoS_Acceptor (void);
+ virtual int open (TAO_Base_StreamEndPoint *endpoint,
+ TAO_AV_Core *av_core,
+ TAO_FlowSpec_Entry *entry,
+ TAO_AV_Flow_Protocol_Factory *factory,
+ TAO_AV_Core::Flow_Component flow_comp =
+ TAO_AV_Core::TAO_AV_DATA);
+
+ virtual int open_default (TAO_Base_StreamEndPoint *endpoint,
+ TAO_AV_Core *av_core,
+ TAO_FlowSpec_Entry *entry,
+ TAO_AV_Flow_Protocol_Factory *factory,
+ TAO_AV_Core::Flow_Component flow_comp =
+ TAO_AV_Core::TAO_AV_DATA);
+
+ virtual int open_i (ACE_INET_Addr *address);
+
+ virtual int close (void);
+
+ virtual int activate_svc_handler (TAO_AV_UDP_QoS_Flow_Handler *handler);
+
+
+protected:
+ TAO_Base_StreamEndPoint *endpoint_;
+ TAO_FlowSpec_Entry *entry_;
+ TAO_AV_Flow_Protocol_Factory *flow_protocol_factory_;
+ ACE_QoS_Session *qos_session_;
+ ACE_QoS_Manager qos_manager_;
+ ACE_INET_Addr qos_acceptor_addr_;
+};
+
+class TAO_AV_UDP_QoS_Connector
+ :public TAO_AV_Connector
+{
+public:
+ TAO_AV_UDP_QoS_Connector (void);
+ ~TAO_AV_UDP_QoS_Connector (void);
+ virtual int open (TAO_Base_StreamEndPoint *endpoint,
+ TAO_AV_Core *av_core,
+ TAO_AV_Flow_Protocol_Factory *factory);
+
+ virtual int connect (TAO_FlowSpec_Entry *entry,
+ TAO_AV_Transport *&transport,
+ TAO_AV_Core::Flow_Component flow_comp =
+ TAO_AV_Core::TAO_AV_DATA);
+ virtual int activate_svc_handler (TAO_AV_UDP_QoS_Flow_Handler *handler);
+ virtual int close (void);
+
+ int translate (CosPropertyService::Properties &qos_params,
+ ACE_Flow_Spec *ace_flow_spec);
+
+protected:
+ TAO_Base_StreamEndPoint *endpoint_;
+ TAO_AV_Core *av_core_;
+ TAO_FlowSpec_Entry *entry_;
+ TAO_AV_Flow_Protocol_Factory *flow_protocol_factory_;
+ ACE_QoS_Session *qos_session_;
+ ACE_QoS_Manager qos_manager_;
+};
+
+// class TAO_AV_Export TAO_AV_UDP_Object : public TAO_AV_Protocol_Object
+// {
+// public:
+// TAO_AV_UDP_Object (TAO_AV_Callback *callback,
+// TAO_AV_Transport *transport = 0);
+
+// virtual ~TAO_AV_UDP_Object (void);
+// // Dtor
+
+// virtual int handle_input (void);
+
+// virtual int send_frame (ACE_Message_Block *frame,
+// TAO_AV_frame_info *frame_info = 0);
+// // send a data frame.
+
+// virtual int send_frame (const iovec *iov,
+// int iovcnt,
+// TAO_AV_frame_info *frame_info = 0);
+
+// virtual int destroy (void);
+// // end the stream.
+
+// private:
+// ACE_Message_Block frame_;
+// // Pre-allocated memory to receive the data...
+// };
+
+class TAO_AV_UDP_QoS_Flow_Factory : public TAO_AV_Flow_Protocol_Factory
+{
+public:
+ TAO_AV_UDP_QoS_Flow_Factory (void);
+ virtual ~TAO_AV_UDP_QoS_Flow_Factory (void);
+ virtual int init (int argc, char *argv[]);
+ // Initialization hook.
+ virtual int match_protocol (const char *flow_string);
+ TAO_AV_Protocol_Object* make_protocol_object (TAO_FlowSpec_Entry *entry,
+ TAO_Base_StreamEndPoint *endpoint,
+ TAO_AV_Flow_Handler *handler,
+ TAO_AV_Transport *transport);
+};
+
+/// Helper class to create qos sessions,
+/// activate qos handlers and set qos
+/// (For separation of concerns)
+class TAO_AV_UDP_QoS_Session_Helper
+{
+public:
+ TAO_AV_UDP_QoS_Session_Helper (void);
+ ~TAO_AV_UDP_QoS_Session_Helper (void);
+
+ /// Open a QoS Session with the specified address
+ ACE_QoS_Session* open_qos_session (TAO_AV_UDP_QoS_Flow_Handler *handler,
+ ACE_INET_Addr &addr);
+
+ /// Activate the QoS handler to receive QoS events
+ int activate_qos_handler (ACE_QoS_Session *qos_session,
+ TAO_AV_UDP_QoS_Flow_Handler *handler);
+
+ /// Set the required QoS for the session
+ int set_qos (ACE_Flow_Spec& ace_flow_spec,
+ TAO_AV_UDP_QoS_Flow_Handler *handler);
+};
+
+TAO_END_VERSIONED_NAMESPACE_DECL
+
+ACE_STATIC_SVC_DECLARE (TAO_AV_UDP_QoS_Flow_Factory)
+ACE_FACTORY_DECLARE (TAO_AV, TAO_AV_UDP_QoS_Flow_Factory)
+
+ACE_STATIC_SVC_DECLARE (TAO_AV_UDP_QoS_Factory)
+ACE_FACTORY_DECLARE (TAO_AV, TAO_AV_UDP_QoS_Factory)
+
+
+#if defined(__ACE_INLINE__)
+#include "orbsvcs/AV/QoS_UDP.i"
+#endif /* __ACE_INLINE__ */
+
+#endif /* ACE_HAS_RAPI || ACE_HAS_WINSOCK2_GQOS */
+
+#include /**/ "ace/post.h"
+#endif /* TAO_AV_QOS_UDP_H */
diff --git a/TAO/orbsvcs/orbsvcs/AV/QoS_UDP.i b/TAO/orbsvcs/orbsvcs/AV/QoS_UDP.i
new file mode 100644
index 00000000000..9ae1b828b0f
--- /dev/null
+++ b/TAO/orbsvcs/orbsvcs/AV/QoS_UDP.i
@@ -0,0 +1,81 @@
+// -*- C++ -*-
+//
+// $Id$
+
+TAO_BEGIN_VERSIONED_NAMESPACE_DECL
+
+//----------------------------------------------------------------------
+// TAO_AV_UDP_Flow_Handler
+//----------------------------------------------------------------------
+
+ACE_INLINE
+ACE_SOCK_Dgram_Mcast_QoS *
+TAO_AV_UDP_QoS_Flow_Handler::get_socket (void)
+{
+ return &this->qos_sock_dgram_;
+}
+
+ACE_INLINE
+int
+TAO_AV_UDP_QoS_Flow_Handler::open (ACE_Addr &address)
+{
+ // return this->qos_sock_dgram_.open (address);
+ ACE_UNUSED_ARG( address );
+ return 0;
+}
+
+ACE_INLINE ACE_QoS_Session*
+TAO_AV_UDP_QoS_Flow_Handler::qos_session (void)
+{
+ return this->qos_session_;
+}
+
+ACE_INLINE void
+TAO_AV_UDP_QoS_Flow_Handler::qos_session (ACE_QoS_Session *qos_session)
+{
+ this->qos_session_ = qos_session;
+}
+
+ACE_INLINE void
+TAO_AV_UDP_QoS_Flow_Handler::negotiator (AVStreams::Negotiator_ptr negotiator)
+{
+ this->negotiator_ = AVStreams::Negotiator::_duplicate (negotiator);
+}
+
+ACE_INLINE void
+TAO_AV_UDP_QoS_Flow_Handler::endpoint (TAO_Base_StreamEndPoint *endpoint)
+{
+ this->endpoint_ = endpoint;
+}
+
+ACE_INLINE TAO_Base_StreamEndPoint *
+TAO_AV_UDP_QoS_Flow_Handler::endpoint (void)
+{
+ return this->endpoint_;
+}
+
+ACE_INLINE void
+TAO_AV_UDP_QoS_Flow_Handler::flowspec_entry (TAO_FlowSpec_Entry *entry)
+{
+ this->entry_ = entry;
+}
+
+ACE_INLINE TAO_FlowSpec_Entry *
+TAO_AV_UDP_QoS_Flow_Handler::flowspec_entry (void)
+{
+ return this->entry_;
+}
+
+ACE_INLINE void
+TAO_AV_UDP_QoS_Flow_Handler::av_core (TAO_AV_Core *avcore)
+{
+ this->av_core_ = avcore;
+}
+
+ACE_INLINE TAO_AV_Core *
+TAO_AV_UDP_QoS_Flow_Handler::av_core (void)
+{
+ return this->av_core_;
+}
+
+TAO_END_VERSIONED_NAMESPACE_DECL
diff --git a/TAO/orbsvcs/orbsvcs/AV/README b/TAO/orbsvcs/orbsvcs/AV/README
new file mode 100644
index 00000000000..e3482716a80
--- /dev/null
+++ b/TAO/orbsvcs/orbsvcs/AV/README
@@ -0,0 +1,27 @@
+// $Id$
+
+TAO Audio/Video Streaming service
+---------------------------------
+
+
+This is a prototype implementation of the CORBA "Control and
+Management of A/V streams" specification, that defines various
+interfaces for controlling multimedia streams.
+
+This directory contains the following files
+
+AVStreams_i.{h,cpp}: Implementation of the A/V handshake specification, as well
+ as base classes for the various interfaces defined in the spec.
+
+Endpoint_Strategy.{h,cpp}: Implementation of various multimedia endpoint activation strategies.
+
+A complete distributed audio/video streaming application that
+illustrates the use of the various components defined above is
+available in the following directory:
+
+TAO/orbsvcs/tests/AVStreams/mpeg/source/
+
+
+Sumedh Mungee <sumedh@cs.wustl.edu>
+Nagarajan Surendran <naga@cs.wustl.edu>
+
diff --git a/TAO/orbsvcs/orbsvcs/AV/RTCP.cpp b/TAO/orbsvcs/orbsvcs/AV/RTCP.cpp
new file mode 100644
index 00000000000..e0466db3a3c
--- /dev/null
+++ b/TAO/orbsvcs/orbsvcs/AV/RTCP.cpp
@@ -0,0 +1,826 @@
+/**
+ * Copyright (c) 1994-1995 Regents of the University of California.
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in the
+ * documentation and/or other materials provided with the distribution.
+ * 3. All advertising materials mentioning features or use of this software
+ * must display the following acknowledgement:
+ * This product includes software developed by the University of
+ * California, Berkeley and the Network Research Group at
+ * Lawrence Berkeley Laboratory.
+ * 4. Neither the name of the University nor of the Laboratory may be used
+ * to endorse or promote products derived from this software without
+ * specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
+ * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
+ * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+ * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+ * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGE.
+ */
+
+// $Id$
+#include "orbsvcs/AV/ntp-time.h"
+#include "orbsvcs/AV/RTCP.h"
+#include "orbsvcs/AV/media_timer.h"
+#include "tao/debug.h"
+#include "orbsvcs/AV/global.h"
+#include "orbsvcs/AV/md5.h"
+
+#include "orbsvcs/AV/RTCP_Packet.h"
+#include "ace/OS_NS_time.h"
+#include "ace/OS_NS_strings.h"
+
+TAO_BEGIN_VERSIONED_NAMESPACE_DECL
+
+int
+TAO_AV_RTCP_Callback::receive_control_frame (ACE_Message_Block *data,
+ const ACE_Addr &peer_address)
+{
+ int length = static_cast<int> (data->length ());
+ int more = length;
+ char *buf_ptr = data->rd_ptr ();
+ char first_rtcp_packet = 1;
+ RTCP_Channel_In *c;
+
+ // This code performs the RTCP Header validity checks detailed in RFC 1889
+ // Appendix A.2
+
+ while (more > 0)
+ {
+ // the second byte of the control packet is the type
+ switch ((unsigned char)buf_ptr[length - more + 1])
+ {
+ case RTCP_PT_SR:
+ {
+ RTCP_SR_Packet sr(&buf_ptr[length-more],
+ &more);
+
+ if (!sr.is_valid(first_rtcp_packet))
+ ACE_DEBUG ((LM_DEBUG,
+ "TAO_AV_RTCP_Callback::receive_control_frame - "
+ "warning invalid rtcp packet\n"));
+
+ if (this->inputs_.find (sr.ssrc (), c) == -1)
+ {
+ ACE_NEW_RETURN (c,
+ RTCP_Channel_In (sr.ssrc (),
+ &peer_address),
+ -1);
+ this->inputs_.bind (sr.ssrc (), c);
+ }
+ c->updateStatistics (&sr);
+
+ if (TAO_debug_level > 0)
+ sr.dump ();
+ break;
+ }
+ case RTCP_PT_RR:
+ {
+ RTCP_RR_Packet rr(&buf_ptr[length-more],
+ &more);
+
+ if (!rr.is_valid(first_rtcp_packet))
+ ACE_DEBUG ((LM_DEBUG,
+ "TAO_AV_RTCP_Callback::receive_control_frame - "
+ "warning invalid rtcp packet\n"));
+
+ if (this->inputs_.find (rr.ssrc (), c) == -1)
+ {
+ ACE_NEW_RETURN (c,
+ RTCP_Channel_In (rr.ssrc (),
+ &peer_address),
+ -1);
+ this->inputs_.bind (rr.ssrc (), c);
+ }
+
+ c->updateStatistics (&rr);
+
+ if (TAO_debug_level > 0)
+ rr.dump ();
+ break;
+ }
+ case RTCP_PT_SDES:
+ {
+ RTCP_SDES_Packet sdes (&buf_ptr[length-more],
+ &more);
+
+ if (!sdes.is_valid(first_rtcp_packet))
+ ACE_DEBUG ((LM_DEBUG,
+ "TAO_AV_RTCP_Callback::receive_control_frame - "
+ "warning invalid rtcp packet\n"));
+
+ if (TAO_debug_level > 0)
+ sdes.dump ();
+ break;
+ }
+ case RTCP_PT_BYE:
+ {
+ RTCP_BYE_Packet bye (&buf_ptr[length-more],
+ &more);
+
+ if (!bye.is_valid(first_rtcp_packet))
+ ACE_DEBUG ((LM_DEBUG,
+ "TAO_AV_RTCP_Callback::receive_control_frame - "
+ "warning invalid rtcp packet\n"));
+
+ // Inform the listener that a source(s) has left the session
+ ACE_UINT32 *ssrc_list;
+ unsigned char length;
+
+ bye.ssrc_list(&ssrc_list, length);
+
+ for (int i=0; i<length; i++)
+ {
+ RTCP_Channel_In *c = 0;
+
+ // remove the channel from the list
+ this->inputs_.unbind(ssrc_list[i], c);
+
+ if (c != 0)
+ delete c;
+ }
+
+ if (TAO_debug_level > 0)
+ bye.dump ();
+
+ break;
+ }
+ case RTCP_PT_APP:
+ // If we receive one of these, ignore it.
+ ACE_DEBUG ((LM_DEBUG,
+ "TAO_AV_RTCP_Callback::receive_control_frame - "
+ "APP packet - ignore\n"));
+ more -= (4 + (ACE_UINT16)buf_ptr[length - more + 2]);
+ break;
+ default:
+ ACE_DEBUG ((LM_DEBUG,
+ "TAO_AV_RTCP_Callback::receive_control_frame - "
+ "UNKNOWN packet type %u; ignore the rest\n",
+ (int)buf_ptr[length - more + 1]));
+ more = 0;
+ }
+
+ first_rtcp_packet = 0;
+
+ }
+
+ if (more != 0)
+ ACE_DEBUG ((LM_DEBUG,
+ "TAO_AV_RTCP_Callback::receive_control_frame - "
+ "Error in overall packet length\n"));
+ return 0;
+}
+
+ACE_INT32 random32 (int);
+
+ACE_UINT32
+TAO_AV_RTCP::alloc_srcid (ACE_UINT32 addr)
+{
+ md5_string s;
+
+ s.type = addr;
+ s.tv = ACE_OS::gettimeofday ();
+ s.pid = ACE_OS::getpid();
+ s.pgid = ACE_OS::getpgid(s.pid);
+ s.ppid = ACE_OS::getppid();
+ s.uid = ACE_OS::getuid();
+ s.gid = ACE_OS::getgid();
+
+ unsigned char *string_val = (unsigned char *) &s;
+ int length = sizeof(s);
+
+ MD5_CTX context;
+ union
+ {
+ char c[16];
+ u_long x[4];
+ } digest;
+ ACE_UINT32 r;
+ int i;
+
+ MD5Init (&context);
+ MD5Update (&context, string_val, length);
+ MD5Final ((unsigned char*)&digest, &context);
+ r=0;
+ for (i=0; i<3; i++)
+ r ^= digest.x[i];
+
+ return r;
+
+/* used to be this
+ ACE_Time_Value tv = ACE_OS::gettimeofday ();
+ ACE_UINT32 srcid = ACE_UINT32 (tv.sec () + tv.usec ());
+ srcid += (ACE_UINT32)ACE_OS::getuid();
+ srcid += (ACE_UINT32)ACE_OS::getpid();
+ srcid += addr;
+ return (srcid);
+*/
+}
+
+
+double
+TAO_AV_RTCP::rtcp_interval (int members,
+ int senders,
+ double rtcp_bw,
+ int we_sent,
+ int packet_size,
+ int *avg_rtcp_size,
+ int initial)
+{
+ // Minimum time between RTCP packets from this site (in sec.).
+ // This time prevents the reports from 'clumping' when sessions
+ // are small and the law of large numbers isn't helping to smooth
+ // out the traffic. It also keeps the report interval from
+ // becoming ridiculously small during transient outages like a
+ // network partition.
+// double const RTCP_MIN_TIME = 5.0; (from RTP.h)
+
+ // Fraction of the RTCP bandwidth to be shared among active
+ // senders. (This fraction was chosen so that in a typical
+ // session with one or two active senders, the computed report
+ // time would be roughly equal to the minimum report time so that
+ // we don't unnecessarily slow down receiver reports.) The
+ // receiver fraction must be 1 - the sender fraction.
+// double const RTCP_SENDER_BW_FRACTION = 0.25; (from RTP.h)
+// double const RTCP_RCVR_BW_FRACTION = (1-RTCP_SENDER_BW_FRACTION); (from RTP.h)
+
+ // Gain (smoothing constant) for the low-pass filter that
+ // estimates the average RTCP packet size
+// double const RTCP_SIZE_GAIN = (1.0/16.0); (from RTP.h)
+
+ double t;
+ double rtcp_min_time = RTCP_MIN_RPT_TIME;
+ int n; // number of members for computation
+
+ // Very first call at application start-up uses half the min
+ // delay for quicker notification while still allowing some time
+ // before reporting for randomization and to learn about other
+ // sources so the report interval will converge to the correct
+ // interval more quickly. The average RTCP size is initialized
+ // to 128 octets which is conservative (it assumes everyone else
+ // is generating SRs instead of RRs: 20 IP + 8 UDP + 52 SR + 48
+ // SDES CNAME).
+ if (initial)
+ {
+ // initialize the random number generator
+ ACE_OS::srand(ACE_OS::time(0L));
+
+ rtcp_min_time /= 2;
+ *avg_rtcp_size = 128;
+ }
+
+ // If there were active senders, give them at least a minimum
+ // share of the RTCP bandwidth. Otherwise all participants share
+ // the RTCP bandwidth equally.
+ n = members;
+ if ((senders > 0) && (senders < members*RTCP_SENDER_BW_FRACTION))
+ {
+ if (we_sent)
+ {
+ rtcp_bw *= RTCP_SENDER_BW_FRACTION;
+ n = senders;
+ }
+ else
+ {
+ rtcp_bw *= RTCP_RECEIVER_BW_FRACTION;
+ n -= senders;
+ }
+ }
+
+ // Update the average size estimate by the size of the report
+ // packet we just sent.
+ *avg_rtcp_size += (int)((packet_size - *avg_rtcp_size)*RTCP_SIZE_GAIN);
+
+ // The effective number of sites times the average packet size is
+ // the total number of octets sent when each site sends a report.
+ // Dividing this by the effective bandwidth gives the time
+ // interval over which those packets must be sent in order to
+ // meet the bandwidth target, with a minimum enforced. In that
+ // time interval we send one report so this time is also our
+ // average time between reports.
+ t = (*avg_rtcp_size) * n / rtcp_bw;
+ if (t < rtcp_min_time)
+ t = rtcp_min_time;
+
+ // To avoid traffic bursts from unintended synchronization with
+ // other sites, we then pick our actual next report interval as a
+ // random number uniformly distributed between 0.5*t and 1.5*t.
+
+ // TODO: this may not be right. need a random number between 0 and 1
+ int max_rand = 32768;
+
+ return t * ((double)ACE_OS::rand()/max_rand + 0.5);
+// return t * (drand48() + 0.5);
+}
+
+
+
+// TAO_AV_RTCP_Flow_Factory
+TAO_AV_RTCP_Flow_Factory::TAO_AV_RTCP_Flow_Factory (void)
+{
+}
+
+TAO_AV_RTCP_Flow_Factory::~TAO_AV_RTCP_Flow_Factory (void)
+{
+}
+
+int
+TAO_AV_RTCP_Flow_Factory::match_protocol (const char *flow_string)
+{
+ if (ACE_OS::strncasecmp (flow_string,"RTCP",4) == 0)
+ return 1;
+
+ return 0;
+}
+
+int
+TAO_AV_RTCP_Flow_Factory::init (int /* argc */,
+ char * /* argv */ [])
+{
+ return 0;
+}
+
+TAO_AV_Protocol_Object*
+TAO_AV_RTCP_Flow_Factory::make_protocol_object (TAO_FlowSpec_Entry * /*entry*/,
+ TAO_Base_StreamEndPoint * /*endpoint*/,
+ TAO_AV_Flow_Handler *handler,
+ TAO_AV_Transport *transport)
+{
+ TAO_AV_Callback *client_cb = 0;
+ TAO_AV_RTCP_Callback *rtcp_cb = 0;
+
+ // TODO: need to handle a client callback at some point
+// endpoint->get_control_callback (entry->flowname (),
+// client_cb);
+
+ TAO_AV_Protocol_Object *object = 0;
+ ACE_NEW_RETURN (object,
+ TAO_AV_RTCP_Object (client_cb,
+ rtcp_cb,
+ transport),
+ 0);
+
+ rtcp_cb->open (object, handler);
+
+ return object;
+}
+
+// TAO_AV_RTCP_Object
+int
+TAO_AV_RTCP_Object::handle_input (void)
+{
+ size_t bufsiz = 2*this->transport_->mtu ();
+ ACE_Message_Block data (bufsiz);
+
+ int n = this->transport_->recv (data.rd_ptr (),bufsiz);
+ if (n == 0)
+ {
+ if (TAO_debug_level > 0)
+ ACE_DEBUG ((LM_ERROR, "TAO_AV_RTCP::handle_input:connection closed\n"));
+ return -1;
+ }
+ if (n < 0)
+ {
+ if (TAO_debug_level > 0)
+ ACE_DEBUG ((LM_ERROR,"TAO_AV_RTCP::handle_input:recv error\n"));
+ return -1;
+ }
+ data.wr_ptr (n);
+ ACE_Addr *peer_addr = this->transport_->get_peer_addr ();
+ this->callback_->receive_control_frame (&data,*peer_addr);
+ return 0;
+}
+
+int
+TAO_AV_RTCP_Object::send_frame (ACE_Message_Block *frame,
+ TAO_AV_frame_info * /*frame_info*/)
+{
+ return this->transport_->send (frame);
+}
+
+int
+TAO_AV_RTCP_Object::send_frame (const iovec *iov,
+ int iovcnt,
+ TAO_AV_frame_info * /*frame_info*/)
+{
+ return this->transport_->send (iov,
+ iovcnt);
+}
+
+int
+TAO_AV_RTCP_Object::send_frame (const char*,
+ size_t)
+{
+ return 0;
+}
+
+TAO_AV_RTCP_Object::TAO_AV_RTCP_Object (TAO_AV_Callback *client_cb,
+ TAO_AV_RTCP_Callback *&rtcp_cb,
+ TAO_AV_Transport *transport)
+ :TAO_AV_Protocol_Object (&rtcp_cb_, transport)
+{
+ rtcp_cb = &this->rtcp_cb_;
+ this->client_cb_ = client_cb;
+
+}
+
+TAO_AV_RTCP_Object::~TAO_AV_RTCP_Object (void)
+{
+}
+
+int
+TAO_AV_RTCP_Object::destroy (void)
+{
+ this->callback_->handle_destroy ();
+ delete this;
+
+ return 0;
+}
+
+int
+TAO_AV_RTCP_Object::set_policies (const TAO_AV_PolicyList &/*policy_list*/)
+{
+ return -1;
+}
+
+int
+TAO_AV_RTCP_Object::start (void)
+{
+ return this->callback_->handle_start ();
+}
+
+int
+TAO_AV_RTCP_Object::stop (void)
+{
+ return this->callback_->handle_stop ();
+}
+
+int
+TAO_AV_RTCP_Object::handle_control_input (ACE_Message_Block *frame,
+ const ACE_Addr &peer_address)
+{
+ return this->callback_->receive_frame (frame,
+ 0,
+ peer_address);
+}
+
+int
+TAO_AV_RTCP_Object::handle_control_output (ACE_Message_Block *frame)
+{
+ TAO_AV_RTCP_Callback *cb = dynamic_cast<TAO_AV_RTCP_Callback*> (this->callback_);
+
+ return cb->send_frame (frame);
+}
+
+void
+TAO_AV_RTCP_Object::ts_offset (ACE_UINT32 ts_offset)
+{
+ TAO_AV_RTCP_Callback *cb = dynamic_cast<TAO_AV_RTCP_Callback*> (this->callback_);
+ cb->ts_offset (ts_offset);
+}
+
+// TAO_AV_RTCP_Callback
+TAO_AV_RTCP_Callback::TAO_AV_RTCP_Callback (void)
+ :is_initial_timeout_(1),
+ packet_size_(0)
+{
+ char cname[256];
+ char host[256];
+ ACE_OS::hostname(host, sizeof(host));
+
+ // TODO: determine username auto-magically?
+ ACE_OS::sprintf(cname, "username@%s", host);
+
+ this->output_.cname(cname);
+}
+
+TAO_AV_RTCP_Callback::~TAO_AV_RTCP_Callback (void)
+{
+}
+
+void
+TAO_AV_RTCP_Callback::schedule (int ms)
+{
+ this->timeout_ = ms;
+}
+
+int
+TAO_AV_RTCP_Callback::handle_start (void)
+{
+ return 0;
+}
+
+int
+TAO_AV_RTCP_Callback::handle_stop (void)
+{
+ return this->send_report(1);
+}
+
+int
+TAO_AV_RTCP_Callback::handle_timeout (void * /*arg*/)
+{
+ return this->send_report(0);
+}
+
+int
+TAO_AV_RTCP_Callback::send_report (int bye)
+{
+ // get the RTCP control object in order to get the ssrc
+ TAO_AV_RTCP_Object *rtcp_prot_obj = dynamic_cast<TAO_AV_RTCP_Object*> (this->protocol_object_);
+ ACE_UINT32 my_ssrc = rtcp_prot_obj->ssrc ();
+
+ RTCP_Packet *cp;
+ RTCP_SDES_Packet sdes;
+ ACE_CString value = "";
+ ACE_CString note = "";
+ unsigned char sdes_type = 0;
+ RTCP_BYE_Packet *bye_packet = 0; // only used for bye
+ ACE_UINT32 ssrc_list[1]; // only used for bye
+
+ // get an iterator for the incoming channels.
+ ACE_Hash_Map_Iterator<ACE_UINT32, RTCP_Channel_In*, ACE_Null_Mutex> iter (this->inputs_);
+ iter = this->inputs_.begin();
+
+ // first send an SR/RR
+ RR_Block *blocks = 0;
+ RR_Block *b_iter = 0;
+ RR_Block *b_ptr = 0;
+
+ while (iter != this->inputs_.end() )
+ {
+ if (!b_iter)
+ {
+ b_ptr = (*iter).int_id_->getRRBlock ();
+ if (b_ptr)
+ {
+ blocks = b_ptr;
+ b_iter = b_ptr;
+ }
+ }
+ else
+ {
+ b_ptr = (*iter).int_id_->getRRBlock ();
+ if (b_ptr)
+ {
+ b_iter->next_ = b_ptr;
+ }
+ }
+
+ iter++;
+ }
+
+ if (b_iter)
+ b_iter->next_ = 0;
+
+ if (this->output_.active ())
+ {
+ // get the NTP timestamp
+ ACE_Time_Value unix_now = ACE_OS::gettimeofday ();
+ TAO_AV_RTCP::ntp64 ntp_now = ntp64time (unix_now);
+ ACE_UINT32 rtp_ts = unix_now.sec () * 8000 + unix_now.usec () / 125 +
+ this->timestamp_offset_;
+ ACE_NEW_RETURN(cp,
+ RTCP_SR_Packet (my_ssrc,
+ ntp_now.upper,
+ ntp_now.lower,
+ rtp_ts,
+ this->output_.packets_sent (),
+ this->output_.octets_sent (),
+ blocks),
+ -1);
+ }
+ else
+ {
+ ACE_NEW_RETURN(cp,
+ RTCP_RR_Packet (my_ssrc,
+ blocks),
+ -1);
+ }
+
+ /*
+ * We always send a cname plus one other sdes
+ * There's a schedule for what we send sequenced by sdes_seq_:
+ * - send 'email' every 0th & 4th packet
+ * - send 'note' every 2nd packet
+ * - send 'tool' every 6th packet
+ * - send 'name' in all the odd slots
+ * (if 'note' is not the empty string, we switch the roles
+ * of name & note)
+ */
+
+ // TODO: need capability to change these settings
+ switch (this->sdes_count_%8)
+ {
+ case 0:
+ case 4:
+ value = "tao-users@wustl.edu";
+ sdes_type = RTCP_SDES_EMAIL;
+ break;
+ case 2:
+ if (note.length () > 0)
+ {
+ value = "Joe User";
+ sdes_type = RTCP_SDES_NAME;
+ }
+ else
+ {
+ value = "An important note...";
+ sdes_type = RTCP_SDES_NOTE;
+ }
+ break;
+ case 6:
+ value = "TAO A/V Service";
+ sdes_type = RTCP_SDES_TOOL;
+ break;
+ case 1:
+ case 3:
+ case 5:
+ case 7:
+ if (note.length () == 0)
+ {
+ value = "Joe User";
+ sdes_type = RTCP_SDES_NAME;
+ }
+ else
+ {
+ value = "An important note...";
+ sdes_type = RTCP_SDES_NOTE;
+ }
+ break;
+ }
+
+ ++this->sdes_count_;
+
+ sdes.add_item (my_ssrc,
+ RTCP_SDES_CNAME,
+ static_cast<unsigned char> (ACE_OS::strlen(this->output_.cname())),
+ this->output_.cname());
+ if (bye)
+ {
+ ssrc_list[0] = rtcp_prot_obj->ssrc ();
+
+ ACE_NEW_RETURN (bye_packet,
+ RTCP_BYE_Packet(ssrc_list,
+ sizeof(ssrc_list)/sizeof(ssrc_list[0]),
+ "Got bored."),
+ -1);
+ }
+ else
+ {
+ unsigned char length = (unsigned char)(value.length() & 0xFF);
+ sdes.add_item (my_ssrc, sdes_type, length, value.c_str ());
+ }
+
+ // create the message block
+ char *cp_ptr;
+ char *sdes_ptr;
+ char *bye_ptr = 0;
+ ACE_UINT16 cp_length;
+ ACE_UINT16 sdes_length;
+ ACE_UINT16 bye_length = 0;
+ cp->get_packet_data (&cp_ptr, cp_length);
+ sdes.get_packet_data (&sdes_ptr, sdes_length);
+ if (bye_packet)
+ bye_packet->get_packet_data(&bye_ptr, bye_length);
+
+ ACE_Message_Block mb (cp_length + sdes_length + bye_length);
+
+ memcpy (mb.wr_ptr (), cp_ptr, cp_length);
+ mb.wr_ptr (cp_length);
+ memcpy (mb.wr_ptr (), sdes_ptr, sdes_length);
+ mb.wr_ptr (sdes_length);
+ if (bye_length)
+ {
+ memcpy (mb.wr_ptr (), bye_ptr, bye_length);
+ mb.wr_ptr (bye_length);
+ }
+
+ // send the report
+ this->protocol_object_->send_frame (&mb);
+
+ this->packet_size_ = cp_length + sdes_length + bye_length;
+
+ delete cp;
+ if (bye_packet)
+ delete bye_packet;
+
+ return 0;
+}
+
+void
+//TAO_AV_RTCP_Callback::get_timeout (ACE_Time_Value *tv,
+TAO_AV_RTCP_Callback::get_timeout (ACE_Time_Value *&tv,
+ void *& /*arg*/)
+{
+ int senders = 0;
+ int members = 1; // count self as member
+
+ // TODO: this should be 5% of the session bw
+ double rtcp_bw = 1000;
+ double interval;
+
+ ACE_Hash_Map_Iterator<ACE_UINT32, RTCP_Channel_In*, ACE_Null_Mutex> iter (this->inputs_);
+ iter = this->inputs_.begin();
+
+ if (this->output_.active ())
+ senders++;
+
+ // determine the number of senders and members of this session
+ while (iter != this->inputs_.end ())
+ {
+ if ((*iter).int_id_->active ())
+ {
+ if ((*iter).int_id_->sender ())
+ senders++;
+ members++;
+ }
+ iter++;
+ }
+
+ // Here we do the RTCP timeout calculation.
+ interval = TAO_AV_RTCP::rtcp_interval (members, // members
+ senders, // senders
+ rtcp_bw, // rtcp_bw
+ this->output_.active (), // we_sent
+ this->packet_size_, // packet_size
+ &this->avg_rtcp_size_, // avg_rtcp_size
+ this->is_initial_timeout_); // initial)
+
+ this->is_initial_timeout_ = 0;
+
+ ACE_NEW (tv,
+ ACE_Time_Value);
+
+ tv->sec ((int)interval);
+ tv->usec ((int)((interval - (int)interval) * 1000000));
+}
+
+int
+TAO_AV_RTCP_Callback::handle_destroy (void)
+{
+ return 0;
+}
+
+int
+TAO_AV_RTCP_Callback::receive_frame (ACE_Message_Block *frame,
+ TAO_AV_frame_info *,
+ const ACE_Addr &peer_address)
+{
+ RTCP_Channel_In *c;
+
+ RTP_Packet packet (frame->rd_ptr(), static_cast<int> (frame->length()));
+
+ if (this->inputs_.find (packet.ssrc(), c) < 0)
+ {
+ ACE_NEW_RETURN (c,
+ RTCP_Channel_In (packet.ssrc(),
+ &peer_address),
+ -1);
+
+ this->inputs_.bind (packet.ssrc(), c);
+ }
+
+ c->recv_rtp_packet (frame, &peer_address);
+ return 0;
+}
+
+int
+TAO_AV_RTCP_Callback::send_frame (ACE_Message_Block *frame)
+{
+ RTP_Packet packet (frame->rd_ptr(), static_cast<int> (frame->length()));
+ this->output_.updateStatistics (&packet);
+
+ return 0;
+}
+
+void
+TAO_AV_RTCP_Callback::ts_offset (ACE_UINT32 offset)
+{
+ this->timestamp_offset_ = offset;
+}
+
+TAO_END_VERSIONED_NAMESPACE_DECL
+
+ACE_FACTORY_DEFINE (TAO_AV, TAO_AV_RTCP_Flow_Factory)
+ACE_STATIC_SVC_DEFINE (TAO_AV_RTCP_Flow_Factory,
+ ACE_TEXT ("RTCP_Flow_Factory"),
+ ACE_SVC_OBJ_T,
+ &ACE_SVC_NAME (TAO_AV_RTCP_Flow_Factory),
+ ACE_Service_Type::DELETE_THIS |
+ ACE_Service_Type::DELETE_OBJ,
+ 0)
+
diff --git a/TAO/orbsvcs/orbsvcs/AV/RTCP.h b/TAO/orbsvcs/orbsvcs/AV/RTCP.h
new file mode 100644
index 00000000000..58688376837
--- /dev/null
+++ b/TAO/orbsvcs/orbsvcs/AV/RTCP.h
@@ -0,0 +1,256 @@
+// -*- C++ -*-
+
+/**
+ * Copyright (c) 1993-1994 The Regents of the University of California.
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in the
+ * documentation and/or other materials provided with the distribution.
+ * 3. All advertising materials mentioning features or use of this software
+ * must display the following acknowledgement:
+ * This product includes software developed by the University of
+ * California, Berkeley and the Network Research Group at
+ * Lawrence Berkeley Laboratory.
+ * 4. Neither the name of the University nor of the Laboratory may be used
+ * to endorse or promote products derived from this software without
+ * specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
+ * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
+ * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+ * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+ * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGE.
+ */
+
+//=============================================================================
+/**
+ * @file RTCP.h
+ *
+ * $Id$
+ *
+ * @author Nagarajan Surendran <naga@cs.wustl.edu>
+ */
+//=============================================================================
+
+
+#ifndef TAO_AV_RTCP_H
+#define TAO_AV_RTCP_H
+#include /**/ "ace/pre.h"
+
+#include "orbsvcs/AV/RTCP_Channel.h"
+
+// FUZZ: disable check_for_math_include
+
+#include "orbsvcs/AV/AVStreams_i.h"
+#include "orbsvcs/AV/UDP.h"
+#include "orbsvcs/AV/RTP.h"
+#include "ace/Hash_Map_Manager_T.h"
+#include <math.h>
+#include <stdlib.h>
+
+TAO_BEGIN_VERSIONED_NAMESPACE_DECL
+
+class TAO_AV_RTCP_Callback;
+
+/**
+ * @class TAO_AV_RTCP
+ * @brief Encapsulate the header format for the Real Time Control
+ * Protocol (RTCP)
+ */
+class TAO_AV_Export TAO_AV_RTCP
+{
+public:
+ struct rtcphdr
+ {
+ ACE_UINT16 rh_flags; /* T:2 P:1 CNT:5 PT:8 */
+ ACE_UINT16 rh_len; /* length of message (in bytes) */
+ ACE_UINT32 rh_ssrc; /* synchronization src id */
+ };
+
+ struct ntp64
+ {
+ ACE_UINT32 upper; /* more significant 32 bits */
+ ACE_UINT32 lower; /* less significant 32 bits */
+ };
+
+ struct md5_string
+ {
+ int type;
+ ACE_Time_Value tv;
+ pid_t pid;
+ pid_t pgid;
+ pid_t ppid;
+ uid_t uid;
+ gid_t gid;
+ };
+
+ static void send_report (ACE_Message_Block *mb);
+
+ static ACE_UINT32 alloc_srcid (ACE_UINT32 addr);
+
+ static double rtcp_interval (int members,
+ int senders,
+ double rtcp_bw,
+ int we_sent,
+ int packet_size,
+ int *avg_rtcp_size,
+ int initial);
+};
+
+
+
+/**
+ * @class TAO_AV_RTCP_Flow_Factory
+ * @brief
+ */
+class TAO_AV_Export TAO_AV_RTCP_Flow_Factory
+ :public TAO_AV_Flow_Protocol_Factory
+{
+public:
+ TAO_AV_RTCP_Flow_Factory (void);
+ virtual ~TAO_AV_RTCP_Flow_Factory (void);
+ virtual int init (int argc, char *argv[]);
+ virtual int match_protocol (const char *flow_string);
+ virtual TAO_AV_Protocol_Object* make_protocol_object (TAO_FlowSpec_Entry *entry,
+ TAO_Base_StreamEndPoint *endpoint,
+ TAO_AV_Flow_Handler *handler,
+ TAO_AV_Transport *transport);
+};
+
+class TAO_AV_Callback;
+
+
+/**
+ * @class TAO_AV_RTCP_Callback
+ * @brief TAO_AV_Callback for RTCP protocol
+ */
+class TAO_AV_Export TAO_AV_RTCP_Callback : public TAO_AV_Callback
+{
+public:
+ /// RTCP callback.
+ TAO_AV_RTCP_Callback (void);
+
+ /// virtual destructor.
+ virtual ~TAO_AV_RTCP_Callback (void);
+
+ /// Called during Streamctrl->start.
+ virtual int handle_start (void);
+
+ /// Called during Streamctrl->stop.
+ virtual int handle_stop (void);
+
+ /// Called during timeout for Flow Producers.
+ virtual int handle_timeout (void *arg);
+
+ /// Called when a frame arrives for a FlowConsumer.
+ virtual int receive_frame (ACE_Message_Block *frame,
+ TAO_AV_frame_info *frame_info = 0,
+ const ACE_Addr &peer_address = ACE_Addr::sap_any);
+ int send_frame (ACE_Message_Block *frame);
+
+ virtual int receive_control_frame (ACE_Message_Block *frame,
+ const ACE_Addr &peer_address = ACE_Addr::sap_any);
+
+ /// Called during Streamctrl->destroy i.e tear_down of the stream
+ /// @@coryan:Call it handle_destroy or handle_close.
+ virtual int handle_destroy (void);
+
+ /// Called to get the timeout. If tv is 0 then the framework stop
+ /// calling this.
+ virtual void get_timeout (ACE_Time_Value *&tv,
+ void *&arg);
+
+ int send_report(int bye);
+ void schedule (int ms);
+ TAO_AV_RTP_State *state (void);
+ void ts_offset (ACE_UINT32 offset);
+
+protected:
+ ACE_Hash_Map_Manager<ACE_UINT32, RTCP_Channel_In*, ACE_Null_Mutex> inputs_;
+ RTCP_Channel_Out output_;
+ int timeout_;
+ int timestamp_offset_;
+ int sdes_count_;
+
+ int is_initial_timeout_;
+ int avg_rtcp_size_;
+ int packet_size_;
+};
+
+class RTP_Packet;
+
+
+/**
+ * @class TAO_AV_RTCP_Object
+ * @brief TAO_AV_Protocol_Object for RTCP protocol
+ */
+class TAO_AV_Export TAO_AV_RTCP_Object
+ : public TAO_AV_Protocol_Object
+{
+public:
+ /// constructor.
+ TAO_AV_RTCP_Object (TAO_AV_Callback *client_cb,
+ TAO_AV_RTCP_Callback *&rtcp_cb,
+ TAO_AV_Transport *transport = 0);
+
+ /// Destructor
+ virtual ~TAO_AV_RTCP_Object (void);
+
+ virtual int handle_input (void);
+ virtual int handle_control_input (ACE_Message_Block *frame,
+ const ACE_Addr &peer_address);
+ virtual int handle_control_output (ACE_Message_Block *frame);
+
+ /// set/get policies.
+ virtual int set_policies (const TAO_AV_PolicyList &policy_list);
+
+ /// start/stop the flow.
+ virtual int start (void);
+ virtual int stop (void);
+
+ /// send a data frame.
+ virtual int send_frame (ACE_Message_Block *frame,
+ TAO_AV_frame_info *frame_info = 0);
+
+ /// send a frame in iovecs.
+ virtual int send_frame (const iovec *iov,
+ int iovcnt,
+ TAO_AV_frame_info *frame_info = 0);
+
+ virtual int send_frame (const char*buf,
+ size_t len);
+
+ /// end the stream.
+ virtual int destroy (void);
+
+ void ssrc (ACE_UINT32 ssrc) {this->ssrc_ = ssrc; }
+ ACE_UINT32 ssrc (void) { return this->ssrc_; }
+
+ void ts_offset (ACE_UINT32 ts_offset);
+
+
+private:
+ TAO_AV_Callback *client_cb_;
+ TAO_AV_RTCP_Callback rtcp_cb_;
+ ACE_UINT32 ssrc_;
+};
+
+TAO_END_VERSIONED_NAMESPACE_DECL
+
+ACE_STATIC_SVC_DECLARE (TAO_AV_RTCP_Flow_Factory)
+ACE_FACTORY_DECLARE (TAO_AV, TAO_AV_RTCP_Flow_Factory)
+
+#include /**/ "ace/post.h"
+#endif /* TAO_AV_RTCP_H */
diff --git a/TAO/orbsvcs/orbsvcs/AV/RTCP_Channel.cpp b/TAO/orbsvcs/orbsvcs/AV/RTCP_Channel.cpp
new file mode 100644
index 00000000000..7011dab5371
--- /dev/null
+++ b/TAO/orbsvcs/orbsvcs/AV/RTCP_Channel.cpp
@@ -0,0 +1,364 @@
+// $Id$
+
+#include "orbsvcs/AV/RTCP_Channel.h"
+#include "orbsvcs/AV/RTP.h"
+#include "tao/debug.h"
+
+TAO_BEGIN_VERSIONED_NAMESPACE_DECL
+
+RTCP_Channel_In::RTCP_Channel_In (ACE_UINT32 ssrc,
+ const ACE_Addr *peer_addr)
+ : remote_ssrc_ (ssrc),
+ cname_ (""),
+ transit_ (0),
+ jitter_ (0.0),
+ first_data_packet_ (1),
+ ntp_ts_msw_ (0),
+ ntp_ts_lsw_ (0),
+ last_sr_time_ (0),
+ active_ (0),
+ no_data_counter_ (0),
+ data_since_last_report_ (0)
+{
+ const ACE_INET_Addr *const_inet_addr = dynamic_cast<const ACE_INET_Addr*> (peer_addr);
+
+ ACE_INET_Addr *inet_addr;
+ ACE_NEW (inet_addr,
+ ACE_INET_Addr (*const_inet_addr));
+
+ this->peer_address_ = inet_addr;
+}
+
+RTCP_Channel_In::~RTCP_Channel_In(void)
+{
+ delete this->peer_address_;
+}
+
+void
+RTCP_Channel_In::updateStatistics(RTP_Packet* dataPkt)
+{
+ ACE_Time_Value current_time;
+ ACE_UINT32 arrival;
+ int transit, d;
+
+ this->active_ = 0;
+
+ // determine if the source has been declared valid
+ if (update_seq(dataPkt->sn ()) == 0)
+ return;
+
+ // Set initial values if this is the first data packet.
+ if (this->first_data_packet_)
+ {
+ // store the initial timestamp
+ this->init_time_stamp_ = dataPkt->ts ();
+ this->init_local_time_ = ACE_OS::gettimeofday ();
+ this->first_data_packet_ = 0;
+ }
+
+ // Get the current time.
+ current_time = ACE_OS::gettimeofday ();
+
+ unsigned int samples_per_sec;
+ double samples_per_usec;
+
+
+ switch (dataPkt->pt())
+ {
+ case RTP_PT_PCMU:
+ case RTP_PT_CELP:
+ case RTP_PT_G721:
+ case RTP_PT_GSM:
+ case RTP_PT_DVI:
+ case RTP_PT_LPC:
+ case RTP_PT_PCMA:
+ case RTP_PT_G722:
+ samples_per_sec = 8000;
+ break;
+ case RTP_PT_L16_STEREO:
+ case RTP_PT_L16_MONO:
+ samples_per_sec = 44100;
+ break;
+ default:
+ samples_per_sec = 1000000;
+ };
+
+ samples_per_usec = samples_per_sec/1000000.0;
+
+ // Calculate the current timestamp.
+ arrival = (ACE_UINT32)((current_time.sec () -
+ this->init_local_time_.sec ()) * samples_per_sec +
+ ((double)(current_time.usec () -
+ (double)this->init_local_time_.usec ()) * samples_per_usec) +
+ this->init_time_stamp_);
+
+
+ // jitter calc from RFC 1889 app a.8
+ transit = arrival - dataPkt->ts ();
+ d = transit - this->transit_;
+ this->transit_ = transit;
+ if (d < 0)
+ d = -d;
+
+ // Calculate the inter-arrival jitter.
+ this->jitter_ += (1./16.)*((double)d - this->jitter_);
+
+ // Indicate that data has been received since the last report.
+ this->data_since_last_report_ = 1;
+
+ // Store the payload type.
+ this->payload_type_ = dataPkt->pt ();
+}
+
+int
+RTCP_Channel_In::updateStatistics(RTCP_SR_Packet *sr)
+{
+ // calculate the last SR time in 1/65536 sec.
+ ACE_Time_Value now = ACE_OS::gettimeofday ();
+ this->last_sr_time_ = (ACE_UINT32)
+ (now.sec () * 65536 +
+ now.usec () * 0.065536);
+
+ this->ntp_ts_msw_ = sr->ntp_ts_msw ();
+ this->ntp_ts_lsw_ = sr->ntp_ts_lsw ();
+
+ return 0;
+}
+
+int
+RTCP_Channel_In::updateStatistics(RTCP_RR_Packet * /*rr*/)
+{
+ return 0;
+}
+
+void
+RTCP_Channel_In::init_seq(ACE_UINT16 seq)
+{
+ this->base_seq_ = seq - 1;
+ this->max_seq_ = seq;
+ this->bad_seq_ = RTP_SEQ_MOD + 1;
+ this->cycles_ = 0;
+ this->received_ = 0;
+ this->received_prior_ = 0;
+ this->expected_prior_ = 0;
+}
+
+int
+RTCP_Channel_In::update_seq(ACE_UINT16 seq)
+{
+ // The following is taken from RFC 1889 Appendix A.1
+ ACE_UINT16 udelta = seq - this->max_seq_;
+ const int MAX_DROPOUT = 3000;
+ const int MAX_MISORDER = 100;
+ const int MIN_SEQUENTIAL = 2;
+
+ // Source is not valid until MIN_SEQUENTIAL packets with
+ // sequential sequence numbers have been received.
+ if (this->probation_)
+ {
+ // packet is in sequence
+ if (seq == this->max_seq_ + (ACE_UINT16)1)
+ {
+ this->probation_ --;
+ this->max_seq_ = seq;
+ if (this->probation_ == 0)
+ {
+ this->init_seq(seq);
+ this->received_++;
+ return 1;
+ }
+ }
+ else
+ {
+ this->probation_ = MIN_SEQUENTIAL - 1;
+ this->max_seq_ = seq;
+ }
+ return 0;
+ }
+ else if (udelta < MAX_DROPOUT)
+ {
+ // in order, with permissible gap
+ if (seq < this->max_seq_)
+ {
+ // seq number wrapped - count another 64k cycle
+ this->cycles_+=RTP_SEQ_MOD;
+ }
+ this->max_seq_ = seq;
+ }
+ else if (udelta <= RTP_SEQ_MOD - MAX_MISORDER)
+ {
+ // the sequence number made a large jump
+ ACE_UINT32 temp = seq; // Borland reports a warning on the next line
+ // without this line.
+ if (temp == this->bad_seq_)
+ {
+ // two sequential packets, assume the other side restarted without
+ // telling us so just re-sync
+ // (i.e., pretend this was the first packet).
+ this->init_seq (seq);
+
+ if (TAO_debug_level > 0)
+ ACE_DEBUG ((LM_DEBUG,
+ "RTCP_Channel_In: large jump in sequence number",
+ "; init seq\n"));
+ }
+ else
+ {
+ this->bad_seq_ = (seq+1)&(RTP_SEQ_MOD-1);
+ return 0;
+ }
+ }
+ else
+ {
+ // dup or reordered packet
+ }
+ this->received_++;
+
+ return 1;
+}
+
+void
+RTCP_Channel_In::recv_rtp_packet(ACE_Message_Block *mb,
+ const ACE_Addr *peer_address)
+{
+ if (*peer_address != *this->peer_address_)
+ ACE_DEBUG ((LM_DEBUG,
+ "RTCP_Channel_In::recv_rtp_packet - possible loop/collision detected"));
+
+ RTP_Packet data_packet(mb->rd_ptr (), static_cast<int> (mb->length ()));
+
+ // make sure the packet is valid
+ if (data_packet.is_valid ())
+ this->updateStatistics(&data_packet);
+ else
+ ACE_DEBUG ((LM_DEBUG,
+ "RTCP_Channel_In::recvDataPacket - invalid RTP packet\n"));
+}
+
+
+RR_Block *
+RTCP_Channel_In::getRRBlock(void)
+{
+ // If no data has been received since the last report, don't create a block.
+ if (!this->data_since_last_report_)
+ {
+ this->no_data_counter_++;
+
+ // make the source inactive if significant time has passed since last report
+ if (this->no_data_counter_ == 32)
+ this->active_ = 0;
+
+ return 0;
+ }
+
+ this->no_data_counter_ = 0;
+
+ RR_Block *local_block_ptr = 0;
+
+ ACE_NEW_RETURN (local_block_ptr,
+ RR_Block,
+ 0);
+
+ ACE_OS::memset(local_block_ptr, 0, sizeof(RR_Block));
+
+ // Set the ssrc of the source this report is for.
+ local_block_ptr->ssrc_ = this->remote_ssrc_;
+
+ // Calculate packets expected/lost (from RFC 1889 Appendix A.3)
+ ACE_UINT32 extended_max;
+ ACE_UINT32 expected;
+ ACE_UINT32 expected_interval;
+ ACE_UINT32 received_interval;
+ int lost_interval;
+
+ extended_max = this->cycles_ + this->max_seq_;
+ expected = extended_max - this->base_seq_ + 1;
+
+ local_block_ptr->lost_ = expected - this->received_;
+ expected_interval = expected - this->expected_prior_;
+ this->expected_prior_ = expected;
+ received_interval = this->received_ - this->received_prior_;
+ this->received_prior_ = this->received_;
+ lost_interval = expected_interval - received_interval;
+
+ if ((expected_interval == 0) || (lost_interval <= 0))
+ local_block_ptr->fraction_ = 0;
+ else
+ local_block_ptr->fraction_ = (lost_interval << 8) / expected_interval;
+
+
+ local_block_ptr->last_seq_ = extended_max;
+
+ // taken from RFC 1889 App A.8
+ local_block_ptr->jitter_ = (ACE_UINT32)this->jitter_;
+
+ // calculate the last SR timestamp (lsr)
+ local_block_ptr->lsr_ = ((this->ntp_ts_msw_ & 0xFFFF) << 16) |
+ ((this->ntp_ts_lsw_ & 0xFFFF0000) >> 16);
+
+ // calculate the delay since last SR (dlsr)
+ ACE_Time_Value now = ACE_OS::gettimeofday ();
+ ACE_UINT32 now32 = (ACE_UINT32)
+ (now.sec () * 65536 +
+ now.usec () * 0.065536);
+
+ local_block_ptr->dlsr_ = now32 - this->last_sr_time_;
+
+ // indicate that no data has been received since the last report
+ this->data_since_last_report_ = 0;
+
+ return local_block_ptr;
+}
+
+RTCP_Channel_Out::RTCP_Channel_Out(void)
+ :cname_ ("cname"),
+ active_ (0),
+ timestamp_ (0),
+ timestamp_offset_ (0),
+ packets_sent_ (0),
+ octets_sent_ (0)
+{
+}
+
+RTCP_Channel_Out::~RTCP_Channel_Out(void)
+{
+}
+
+void
+RTCP_Channel_Out::updateStatistics (RTP_Packet *data_packet)
+{
+ // indicate that this source is active
+ this->active_ = 1;
+
+ // Update various counters.
+ this->octets_sent_ += data_packet->payload_size();
+ this->packets_sent_ ++;
+ this->seq_num_ = data_packet->sn ();
+ this->timestamp_ = data_packet->ts ();
+}
+
+ACE_UINT32
+RTCP_Channel_Out::timestamp (void)
+{
+ return this->timestamp_;
+}
+
+ACE_UINT32
+RTCP_Channel_Out::packets_sent (void)
+{
+ return this->packets_sent_;
+}
+
+ACE_UINT32
+RTCP_Channel_Out::octets_sent (void)
+{
+ return this->octets_sent_;
+}
+
+char
+RTCP_Channel_Out::active (void)
+{
+ return this->active_;
+}
+
+TAO_END_VERSIONED_NAMESPACE_DECL
diff --git a/TAO/orbsvcs/orbsvcs/AV/RTCP_Channel.h b/TAO/orbsvcs/orbsvcs/AV/RTCP_Channel.h
new file mode 100644
index 00000000000..a9d717a33b0
--- /dev/null
+++ b/TAO/orbsvcs/orbsvcs/AV/RTCP_Channel.h
@@ -0,0 +1,223 @@
+// $Id$
+
+#ifndef RTCP_CHANNEL_INCLUDE
+#define RTCP_CHANNEL_INCLUDE
+
+#include /**/ "ace/pre.h"
+
+#include "orbsvcs/AV/RTP.h"
+#include "orbsvcs/AV/RTCP_Packet.h"
+
+#include "ace/Message_Block.h"
+#include "ace/SString.h"
+
+TAO_BEGIN_VERSIONED_NAMESPACE_DECL
+
+/**
+ * @class RTCP_Channel_In
+ * @brief The RTCP_Channel_In class represents a single incoming data channel,
+ * or stream. The class has several responsibilities. When the class is
+ * instantiated, the incoming RTP traffic must be declared a valid source based
+ * on the RTP packets received. Once declared valie, this class is responsible
+ * for keeping up with reception statistics and other information. When an SR
+ * or RR is created (outside of this class), this class is used to get the
+ * Receiver Report block for this particular stream.
+ */
+
+class RTCP_Channel_In
+{
+public:
+ /// Constructor for an incoming channel. Requires the synchronization source
+ /// id and address of the sender.
+ RTCP_Channel_In(ACE_UINT32 ssrc,
+ const ACE_Addr *addr);
+
+ /// Destructor
+ ~RTCP_Channel_In(void);
+
+ /// This operation takes the incoming ACE_Message_Block, converts it to an
+ /// RTP_Packet and calls updateStatistics. It also uses compares the peer_addr
+ /// to the stored peer_address_ to check for loops.
+ void recv_rtp_packet (ACE_Message_Block *mb,
+ const ACE_Addr *peer_addr);
+
+ /// Takes statistics of incoming RTP traffic and creates a receiver report block.
+ RR_Block *getRRBlock(void);
+
+ /// Returns the delay since last sender report.
+ ACE_UINT32 dlsr (void);
+
+ /// Returns the last sender report timestamp.
+ ACE_UINT32 lsr (void);
+
+ /// Updates channel information with incoming sender report.
+ int updateStatistics(RTCP_SR_Packet *sr);
+
+ /// Updates channel information with incoming receiver report.
+ int updateStatistics(RTCP_RR_Packet *rr);
+
+ /// Returns 1 if data has been sent since the last report, 0 if not.
+ int sender (void) { return this->data_since_last_report_; }
+
+ /// Returns 1 if this is an active source, 0 if not.
+ int active (void) { return this->active_; }
+
+private:
+ /// Don't want default constructor.
+ RTCP_Channel_In(void);
+
+ /// Don't want copy constructor.
+ RTCP_Channel_In(const RTCP_Channel_In &ch);
+
+ /// The synchronization source id of the source this channel represents.
+ ACE_UINT32 remote_ssrc_;
+
+ /// The canonical name of the source this channel represents.
+ ACE_CString cname_;
+
+ // Used to declare a source valid
+ /// The highest sequence number seen.
+ ACE_UINT16 max_seq_;
+
+ /// The shifted count of sequence number cycles (ie when sequence number wraps)
+ ACE_UINT32 cycles_;
+
+ /// The first sequence number received.
+ ACE_UINT32 base_seq_;
+
+ /// last 'bad' sequence number + 1
+ ACE_UINT32 bad_seq_;
+
+ /// The number of in sequence packets until a source is declared valid.
+ ACE_UINT32 probation_;
+
+ /// The number of packets received.
+ ACE_UINT32 received_;
+
+ /// The packet expected at last interval.
+ ACE_UINT32 expected_prior_;
+
+ /// The packet received at last interval.
+ ACE_UINT32 received_prior_;
+
+ /// The last transit time.
+ ACE_UINT32 transit_;
+
+ /// The inter-arrival jitter measured in timestamp units.
+ double jitter_;
+
+ // Used for jitter calculations
+ /// Flag to indicate the first data packet received.
+ char first_data_packet_;
+
+ /// The first timestamp received.
+ ACE_UINT32 init_time_stamp_;
+
+ /// The local time that the initial packet was received.
+ ACE_Time_Value init_local_time_;
+
+ /// The address that the first RTP packet was received from.
+ ACE_Addr *peer_address_;
+
+ /// The most significant word of the last sender report NTP timestamp.
+ ACE_UINT32 ntp_ts_msw_;
+
+ /// The least significant word of the last sender report NTP timestamp.
+ ACE_UINT32 ntp_ts_lsw_;
+
+ /// The last sender report RTP timestamp.
+ ACE_UINT32 rtp_ts_;
+
+ /// The last time a sender report was received in 1/65536 seconds.
+ /// Used to calculate DLSR.
+ ACE_UINT32 last_sr_time_;
+
+ /// Flag to indicate whether or not the source is active.
+ int active_;
+
+ /// This is a counter to indicate the number of reporting intervals that have
+ /// passed since data has been received. After 32, declare the source inactive.
+ int no_data_counter_;
+
+ /// This flag indicates that data has been received since the last report was
+ /// sent.
+ char data_since_last_report_;
+
+ /// The RTP payload type.
+ int payload_type_;
+
+ /// This operation is used update statistics for the incoming RTP packet.
+ void updateStatistics(RTP_Packet *pkt);
+
+ /// This is called when the first RTP packet is received.
+ void init_seq(ACE_UINT16 seq);
+
+ /// This is called when each RTP packet is received. It is used to declare
+ /// a source as valid.
+ int update_seq(ACE_UINT16 seq);
+};
+
+/**
+ * @class RTCP_Channel_Out
+ * @brief The RTCP_Channel_Out class represents a single outgoing data channel,
+ * or stream. It keeps track of statistics such as number of packets sent and
+ * number of bytes sent.
+ */
+
+class RTCP_Channel_Out
+{
+public:
+ /// Constructor.
+ RTCP_Channel_Out(void);
+
+ /// Destructor.
+ ~RTCP_Channel_Out(void);
+
+ /// Update the channel statistics each time an RTP packet is sent.
+ void updateStatistics (RTP_Packet *pkt);
+
+ /// Returns the timestamp of the last RTP packet sent.
+ ACE_UINT32 timestamp (void);
+
+ /// Returns the number of packets sent.
+ ACE_UINT32 packets_sent (void);
+
+ /// Returns the number of octets sent.
+ ACE_UINT32 octets_sent (void);
+
+ /// Sets the canonical name of the source.
+ void cname (const char *cname) { this->cname_ = cname; }
+
+ /// Returns the canonical name of the source.
+ const char *cname (void) { return this->cname_.c_str(); }
+
+ /// Returns whether or not this source is active.
+ char active (void);
+
+private:
+ /// Holds the canonical name for this channel.
+ ACE_CString cname_;
+
+ /// Flag to indicate whether or not this channel is active.
+ char active_;
+
+ /// The sequence number of the last RTP packet sent.
+ unsigned int seq_num_;
+
+ /// The timestamp of the last RTP packet sent.
+ unsigned int timestamp_;
+
+ /// The initial offset of the timestamp.
+ unsigned int timestamp_offset_;
+
+ /// The total number of packets sent.
+ unsigned int packets_sent_;
+
+ /// The total numbef of octets sent.
+ unsigned int octets_sent_;
+};
+
+TAO_END_VERSIONED_NAMESPACE_DECL
+
+#include /**/ "ace/post.h"
+#endif /* RTCP_CHANNEL_INCLUDE */
diff --git a/TAO/orbsvcs/orbsvcs/AV/RTCP_Packet.cpp b/TAO/orbsvcs/orbsvcs/AV/RTCP_Packet.cpp
new file mode 100644
index 00000000000..8ef82e30bb3
--- /dev/null
+++ b/TAO/orbsvcs/orbsvcs/AV/RTCP_Packet.cpp
@@ -0,0 +1,1212 @@
+// $Id$
+#include "orbsvcs/AV/RTCP_Packet.h"
+#include "orbsvcs/AV/RTP.h"
+
+TAO_BEGIN_VERSIONED_NAMESPACE_DECL
+
+RTCP_Packet::RTCP_Packet(void)
+{
+ this->chd_.ver_ = 2;
+ this->chd_.count_ = 0;
+ this->chd_.pad_ = 0;
+ this->chd_.length_ = 0;
+ this->packet_data_ = 0;
+}
+
+RTCP_Packet::RTCP_Packet(char* buffer)
+{
+ // Parse the common part of the control packet header.
+ this->chd_.ver_ = (buffer[0] & 0xC0) >> 6;
+
+ if (this->chd_.ver_ != RTP_VERSION)
+ ACE_DEBUG ((LM_DEBUG,
+ "RTCP_Packet::RTCP_Packet version incorrect"));
+
+ this->chd_.pad_ = (buffer[0] & 0x20) >> 5;
+ this->chd_.count_ = buffer[0] & 0x1F;
+ this->chd_.pt_ = buffer[1];
+ this->chd_.length_ = ntohs(*(ACE_UINT16*)&buffer[2]);
+ this->packet_data_ = 0;
+}
+
+RTCP_Packet::~RTCP_Packet(void)
+{
+}
+
+void
+RTCP_Packet::get_packet_data(char **buffer, ACE_UINT16 &length)
+{
+ length = static_cast<ACE_UINT16> (this->packet_size());
+
+ // buiidPacket is defined for each child of RTCP_Packet
+ // buildPacket creates a snapshot of the RTCP packet in the buffer pktData
+ this->build_packet ();
+
+ *buffer = this->packet_data_;
+}
+
+int
+RTCP_Packet::is_valid (char is_first)
+{
+ // make sure the RTP version is correct
+ if (this->chd_.ver_ != RTP_VERSION)
+ return 0;
+
+ // these checks are only for the first RTCP packet in a compound packet
+ if (is_first)
+ {
+ // the payload type must be RR or SR
+ if ((this->chd_.pt_ != RTCP_PT_SR) && (this->chd_.pt_ != RTCP_PT_RR))
+ return 0;
+
+ // the padding bit must not be set
+ if (this->chd_.pad_ != 0)
+ return 0;
+ }
+
+ return 1;
+
+}
+
+/*
+ * RTCP_BYE_Packet
+ */
+
+RTCP_BYE_Packet::RTCP_BYE_Packet(ACE_UINT32 *ssrc_list,
+ unsigned char length,
+ const char *text)
+{
+ this->chd_.ver_ = 2;
+ this->chd_.count_ = length;
+ this->chd_.pt_ = RTCP_PT_BYE;
+
+ if (length)
+ {
+ ACE_NEW (this->ssrc_list_,
+ ACE_UINT32[length]);
+
+ this->ssrc_list_length_ = length;
+
+ for (int i=0; i<length; i++)
+ this->ssrc_list_[i] = ssrc_list[i];
+ }
+
+ // Optional - if there is a reason for leaving, store it.
+ // The reason is padded with extra zeros because the packet must
+ // end on an even 32-bit boundary.
+ memset(this->reason_, 0, sizeof(this->reason_));
+ if (text)
+ {
+ size_t text_length = ACE_OS::strlen(text);
+ memcpy(this->reason_, text, text_length);
+ this->reason_length_ = static_cast<unsigned char> (text_length);
+ }
+ else
+ this->reason_length_ = 0;
+
+ // Set the packet length
+ this->chd_.length_ = static_cast<ACE_UINT16> (this->chd_.count_ + (this->reason_length_+1)/4);
+ if ((this->reason_length_+1)%4)
+ this->chd_.length_++;
+
+ this->packet_data_ = 0;
+}
+
+//==============================================================================
+
+RTCP_BYE_Packet::RTCP_BYE_Packet(char* buffer, int *len)
+ : RTCP_Packet(buffer)
+{
+ unsigned int index = 0;
+ unsigned int j;
+
+ // The common part of the header is initialized in the parent.
+ index=4;
+
+ ACE_NEW (this->ssrc_list_,
+ ACE_UINT32[this->chd_.count_]);
+ this->ssrc_list_length_ = this->chd_.count_;
+
+ // Store the source ids of the sources leaving the session
+ for (j=0; j<this->chd_.count_; j++)
+ {
+ this->ssrc_list_[j] = ntohl(*(ACE_UINT32*)&buffer[index]);
+ index+=4;
+ }
+
+ // Optional - store the reason for leaving
+ unsigned int temp = this->chd_.length_; // Borland reports a warning on the
+ // following line with out this.
+ memset(this->reason_, 0, sizeof(this->reason_));
+ if (temp > this->chd_.count_)
+ {
+ this->reason_length_ = buffer[index];
+ index++;
+ memcpy(this->reason_, &buffer[index], this->reason_length_);
+ index+=this->reason_length_;
+
+ }
+ else
+ this->reason_length_ = 0;
+
+ // Decrement the length by the size of this message. This is necessary
+ // because multiple RTCP packets may be contained in a single UDP packet.
+ *len-=(chd_.length_+1)*4;
+
+ this->packet_data_ = 0;
+}
+
+//==============================================================================
+
+RTCP_BYE_Packet::~RTCP_BYE_Packet(void)
+{
+ if (this->ssrc_list_)
+ delete []this->ssrc_list_;
+ if (this->packet_data_)
+ delete []this->packet_data_;
+}
+
+//==============================================================================
+
+unsigned int
+RTCP_BYE_Packet::packet_size(void)
+{
+ ACE_UINT16 size = static_cast<ACE_UINT16> ((1+chd_.count_) * 4);
+
+ if (this->reason_length_ > 0)
+ {
+ size += this->reason_length_ + 1;
+ if (size%4)
+ size += 4 - size%4; // pad with zeros to even 32 bit bound
+ }
+
+ return size;
+}
+
+//==============================================================================
+
+void
+RTCP_BYE_Packet::ssrc_list(ACE_UINT32 **ssrc_list, unsigned char &length)
+{
+ *ssrc_list = this->ssrc_list_;
+ length = this->ssrc_list_length_;
+}
+
+//==============================================================================
+
+const char *
+RTCP_BYE_Packet::reason (void)
+{
+ ACE_CString reason = (const char *)this->reason_;
+
+ return reason.c_str();
+}
+
+//==============================================================================
+
+void
+RTCP_BYE_Packet::build_packet(void)
+{
+ unsigned int index;
+ unsigned int i;
+
+ if (this->packet_data_)
+ delete []this->packet_data_;
+
+ ACE_NEW (this->packet_data_,
+ char[this->packet_size()]);
+
+ index = 0;
+ this->packet_data_[index] = static_cast<char> ((this->chd_.ver_ << 6) |
+ (this->chd_.pad_ << 5) |
+ this->chd_.count_);
+ index++;
+ this->packet_data_[index] = this->chd_.pt_;
+ index++;
+ *((ACE_UINT16*)&this->packet_data_[index]) = htons(this->chd_.length_);
+ index+=2;
+
+ for (i=0; i<this->chd_.count_; i++)
+ {
+ *((ACE_UINT32*)&this->packet_data_[index]) = htonl(this->ssrc_list_[i]);
+ index+=4;
+ }
+
+ if (this->reason_)
+ {
+ this->packet_data_[index] = this->reason_length_;
+ index++;
+ memcpy(&this->packet_data_[index], this->reason_, this->reason_length_);
+ index += this->reason_length_;
+ while (index < this->packet_size())
+ {
+ this->packet_data_[index] = 0;
+ index ++;
+ }
+ }
+}
+
+void
+RTCP_BYE_Packet::dump (void)
+{
+ ACE_DEBUG ((LM_DEBUG,
+ "\nRTCP_BYE_Packet:: from ssrc(s) "));
+ for (int i=0; i< this->ssrc_list_length_; i++)
+ ACE_DEBUG ((LM_DEBUG,
+ "%u ",
+ this->ssrc_list_[i]));
+ ACE_DEBUG ((LM_DEBUG,
+ "\n Reason '%s'\n",
+ this->reason_));
+}
+
+RTCP_RR_Packet::RTCP_RR_Packet(ACE_UINT32 ssrc, RR_Block *blocks)
+{
+ RR_Block *block_ptr = blocks;
+
+ this->chd_.count_ = 0;
+ this->chd_.ver_ = 2;
+ this->chd_.pt_ = RTCP_PT_RR;
+ this->ssrc_ = ssrc;
+ this->rr_ = blocks;
+
+ while (block_ptr)
+ {
+ this->chd_.count_++;
+
+ // Can only have 31 receiver reports
+ if (this->chd_.count_ == 31)
+ {
+ block_ptr->next_ = 0;
+ break;
+ }
+
+ block_ptr = block_ptr->next_;
+ }
+
+ this->chd_.length_ = static_cast<ACE_UINT16> (1+6*(this->chd_.count_)); // + profile specific extensions ??
+
+ this->packet_data_ = 0;
+}
+
+//==============================================================================
+
+RTCP_RR_Packet::RTCP_RR_Packet (char* buffer,
+ int *len)
+ :RTCP_Packet (buffer)
+{
+ unsigned int i = 0;
+ RR_Block *local_block_ptr = 0;
+
+ this->rr_ = 0;
+
+ // The common part of the header is initialized in the parent.
+ i=4;
+ this->ssrc_ = ntohl(*(ACE_UINT32*)&buffer[i]);
+ i+=4;
+ for (unsigned int j=0; j<this->chd_.count_; j++)
+ {
+ if (j==0)
+ {
+ ACE_NEW (this->rr_,
+ RR_Block);
+ local_block_ptr = this->rr_;
+ }
+ else
+ {
+ ACE_NEW (local_block_ptr->next_,
+ RR_Block);
+ local_block_ptr = local_block_ptr->next_;
+ }
+
+ local_block_ptr->next_ = 0;
+ local_block_ptr->ssrc_ = ntohl(*(ACE_UINT32*)&buffer[i]);
+ i+=4;
+ ACE_UINT32 temp = ntohl(*(ACE_UINT32*)&buffer[i]);
+ local_block_ptr->fraction_ = (temp&0xff000000) >> 24;
+ local_block_ptr->lost_ = temp & 0x00ffffff;
+ i+=4;
+ local_block_ptr->last_seq_ = ntohl(*(ACE_UINT32*)&buffer[i]);
+ i+=4;
+ local_block_ptr->jitter_ = ntohl(*(ACE_UINT32*)&buffer[i]);
+ i+=4;
+ local_block_ptr->lsr_ = ntohl(*(ACE_UINT32*)&buffer[i]);
+ i+=4;
+ local_block_ptr->dlsr_ = ntohl(*(ACE_UINT32*)&buffer[i]);
+ i+=4;
+ }
+
+ *len-=(this->chd_.length_+1)*4;
+
+ this->packet_data_ = 0;
+}
+
+//==============================================================================
+
+RTCP_RR_Packet::~RTCP_RR_Packet(void)
+{
+ RR_Block *prev;
+
+ if (this->rr_)
+ {
+ while (this->rr_)
+ {
+ prev = this->rr_;
+ this->rr_ = this->rr_->next_;
+ delete prev;
+ }
+ }
+
+ if (this->packet_data_)
+ delete []this->packet_data_;
+}
+
+//==============================================================================
+
+unsigned int
+RTCP_RR_Packet::packet_size(void)
+{
+ ACE_UINT16 size = static_cast<ACE_UINT16> ((2+this->chd_.count_*6) * 4);
+ return size;
+}
+
+//==============================================================================
+
+void
+RTCP_RR_Packet::build_packet(void)
+{
+ int index;
+ RR_Block *local_block_ptr;
+
+ if (this->packet_data_)
+ delete []this->packet_data_;
+
+ ACE_NEW (this->packet_data_,
+ char [this->packet_size ()]);
+
+ index = 0;
+ this->packet_data_[index] = static_cast<char> ((this->chd_.ver_ << 6) |
+ (this->chd_.pad_ << 5) |
+ this->chd_.count_);
+ index++;
+ this->packet_data_[index] = chd_.pt_;
+ index++;
+ *((ACE_UINT16*)&this->packet_data_[index]) = htons(chd_.length_);
+ index+=2;
+ *((ACE_UINT32*)&this->packet_data_[index]) = htonl(this->ssrc_);
+ index+=4;
+
+ local_block_ptr = this->rr_;
+ while (local_block_ptr)
+ {
+ *((ACE_UINT32*)&this->packet_data_[index]) = htonl(local_block_ptr->ssrc_);
+ index+=4;
+ ACE_UINT32 temp = htonl((local_block_ptr->fraction_&0xff) << 24) &
+ local_block_ptr->lost_;
+ *((ACE_UINT32*)&this->packet_data_[index]) = temp;
+ index+=4;
+ *((ACE_UINT32*)&this->packet_data_[index]) = htonl(local_block_ptr->last_seq_);
+ index+=4;
+ *((ACE_UINT32*)&this->packet_data_[index]) = htonl(local_block_ptr->jitter_);
+ index+=4;
+ *((ACE_UINT32*)&this->packet_data_[index]) = htonl(local_block_ptr->lsr_);
+ index+=4;
+ *((ACE_UINT32*)&this->packet_data_[index]) = htonl(local_block_ptr->dlsr_);
+ index+=4;
+ local_block_ptr = local_block_ptr->next_;
+ }
+}
+
+void
+RTCP_RR_Packet::dump (void)
+{
+ RR_Block *b = this->rr_;
+ int count = 1;
+
+ ACE_DEBUG ((LM_DEBUG,
+ "\nRTCP_RR_Packet:: from %u - %d rr blocks follow.\n",
+ this->ssrc_,
+ this->chd_.count_));
+
+ while (b)
+ {
+ ACE_DEBUG ((LM_DEBUG,
+ " Block %d: ssrc %u; frac %u; lost %u; last seq %u\n",
+ count,
+ b->ssrc_,
+ b->fraction_,
+ b->lost_,
+ b->last_seq_));
+ ACE_DEBUG ((LM_DEBUG,
+ " jitter %u; lsr %u; dlsr %u;\n",
+ b->jitter_,
+ b->lsr_,
+ b->dlsr_));
+
+ b = b->next_;
+ ++count;
+ }
+}
+
+
+RTCP_SDES_Packet::RTCP_SDES_Packet(void) :
+ RTCP_Packet ()
+{
+ this->chd_.pt_ = RTCP_PT_SDES;
+ this->chunk_ = 0;
+ this->packet_data_ = 0;
+ this->num_chunks_ = 0;
+// this->num_items_ = 0;
+}
+
+//==============================================================================
+
+RTCP_SDES_Packet::RTCP_SDES_Packet(char* buffer, int *len):
+ RTCP_Packet (buffer)
+{
+ unsigned int i;
+ sdesChunk_t *cp = 0; // pointer to chunk
+ sdesItem_t *ip = 0; // pointer to item
+
+ // The common part of the control packet header is processed
+ // in the parent. It is 4 bytes long.
+
+ i=4;
+ for (unsigned int j=0; j<this->chd_.count_; j++)
+ {
+ if (j==0)
+ {
+ ACE_NEW (this->chunk_,
+ sdesChunk_t);
+ cp = this->chunk_;
+
+ this->num_chunks_ = 1;
+ }
+ else
+ {
+ ACE_NEW (cp->next_,
+ sdesChunk_t);
+ cp = cp->next_;
+
+ this->num_chunks_++;
+ }
+ cp->next_ = 0;
+ cp->item_ = 0;
+ cp->ssrc_ = ntohl(*(ACE_UINT32*)&buffer[i]);
+ i+=4;
+
+ while (buffer[i]!=RTCP_SDES_END)
+ {
+ if (!cp->item_)
+ {
+ ACE_NEW (cp->item_,
+ sdesItem_t);
+ ip = cp->item_;
+
+// this->num_items_ = 1;
+ }
+ else
+ {
+ ACE_NEW (ip->next_,
+ sdesItem_t);
+ ip = ip->next_;
+
+// this->num_items_++;
+ }
+ ip->next_ = 0;
+ ip->type_ = buffer[i];
+ i++;
+ if (ip->type_ != RTCP_SDES_PRIV)
+ {
+ ip->info_.standard_.length_ = buffer[i];
+ i++;
+ ACE_NEW (ip->info_.standard_.data_,
+ char[ip->info_.standard_.length_+1]);
+ memcpy(ip->info_.standard_.data_,
+ &buffer[i],
+ ip->info_.standard_.length_);
+ ip->info_.standard_.data_[ip->info_.standard_.length_] = 0;
+ i+=ip->info_.standard_.length_;
+ }
+ else
+ {
+ ip->info_.priv_.name_length_ = buffer[i];
+ i++;
+ ip->info_.priv_.data_length_ = buffer[i];
+ i++;
+ ACE_NEW (ip->info_.priv_.name_,
+ char[ip->info_.priv_.name_length_+1]);
+ memcpy(ip->info_.priv_.name_,
+ &buffer[i],
+ ip->info_.priv_.name_length_);
+ ip->info_.priv_.name_[ip->info_.priv_.name_length_] = 0;
+ i+=ip->info_.priv_.name_length_;
+ ACE_NEW (ip->info_.priv_.data_,
+ char[ip->info_.priv_.data_length_+1]);
+ memcpy(ip->info_.priv_.data_,
+ &buffer[i],
+ ip->info_.priv_.data_length_);
+ ip->info_.priv_.data_[ip->info_.priv_.data_length_] = 0;
+ i+=ip->info_.priv_.data_length_;
+ }
+ }
+ i++; // each chunk ends with a zero (END) item
+ // each chunk must end on an even 32 bit boundary
+ while (i%4) i++;
+ }
+
+ *len-=(this->chd_.length_+1)*4;
+
+ this->packet_data_ = 0;
+}
+
+//==============================================================================
+
+RTCP_SDES_Packet::~RTCP_SDES_Packet(void)
+{
+ sdesChunk_t *cp; // pointer to chunk
+ sdesChunk_t *cpprev;
+ sdesItem_t *ip; // pointer to item
+ sdesItem_t *ipprev;
+
+ cp = this->chunk_;
+ while (cp)
+ {
+ ip = cp->item_;
+ while (ip)
+ {
+ ipprev = ip;
+ ip = ip->next_;
+ if (ipprev->type_ != RTCP_SDES_PRIV)
+ {
+ delete []ipprev->info_.standard_.data_;
+ }
+ else
+ {
+ delete []ipprev->info_.priv_.name_;
+ delete []ipprev->info_.priv_.data_;
+ }
+
+ delete ipprev;
+ }
+ cpprev = cp;
+ cp = cp->next_;
+ delete cpprev;
+ }
+
+ if (this->packet_data_)
+ delete []this->packet_data_;
+}
+
+//==============================================================================
+
+void
+RTCP_SDES_Packet::add_chunk(ACE_UINT32 ssrc)
+{
+ sdesChunk_t *cp = 0; // pointer to chunk
+
+ // If this is the first chunk.
+ if (chd_.count_ == 0)
+ {
+ ACE_NEW (this->chunk_,
+ sdesChunk_t);
+ this->chunk_->next_ = 0;
+ this->chunk_->item_ = 0;
+ cp = this->chunk_;
+ }
+ else
+ {
+ cp = this->chunk_;
+ while (cp->next_)
+ cp = cp->next_;
+
+ ACE_NEW (cp->next_,
+ sdesChunk_t);
+ cp = cp->next_;
+ cp->next_ = 0;
+ cp->item_ = 0;
+ }
+ cp->ssrc_ = ssrc; // store the source
+ chd_.count_++; // increment the source count
+}
+
+//==============================================================================
+
+void
+RTCP_SDES_Packet::add_item (ACE_UINT32 ssrc,
+ unsigned char type,
+ unsigned char length,
+ const char *data)
+{
+ sdesChunk_t *cp; // pointer to chunk
+ sdesItem_t *ip; // pointer to item
+
+ if (this->chunk_ == 0)
+ {
+ this->add_chunk(ssrc);
+ }
+
+ cp = this->chunk_;
+
+ while (cp != 0)
+ {
+ if (cp->ssrc_ == ssrc)
+ {
+ break;
+ }
+
+ if (!cp->next_)
+ {
+ this->add_chunk(ssrc);
+ cp = cp->next_;
+ break;
+ }
+
+ cp = cp->next_;
+ }
+
+ ip = cp->item_;
+
+ if (ip == 0)
+ {
+ ACE_NEW (cp->item_,
+ sdesItem_t);
+
+ ip = cp->item_;
+ ip->next_= 0;
+ }
+ else
+ {
+ while (ip->next_)
+ {
+ ip = ip->next_;
+ }
+
+ ACE_NEW (ip->next_,
+ sdesItem_t);
+
+ ip = ip->next_;
+ ip->next_ = 0;
+ }
+
+ ip->type_ = type;
+
+ ip->info_.standard_.length_ = length;
+
+ ACE_NEW (ip->info_.standard_.data_,
+ char[length]);
+
+ memcpy(ip->info_.standard_.data_, data, length);
+}
+
+//==============================================================================
+
+void
+RTCP_SDES_Packet::add_priv_item (ACE_UINT32 ssrc,
+ unsigned char nameLength,
+ const char* name,
+ unsigned char dataLength,
+ const char* data)
+{
+ sdesChunk_t *cp; // pointer to chunk
+ sdesItem_t *ip; // pointer to item
+
+ if (this->chunk_ == 0)
+ {
+ this->add_chunk(ssrc);
+ }
+
+ cp = this->chunk_;
+
+ while (cp != 0)
+ {
+ if (cp->ssrc_ == ssrc)
+ {
+ break;
+ }
+
+ if (!cp->next_)
+ {
+ this->add_chunk(ssrc);
+ cp = cp->next_;
+ break;
+ }
+
+ cp = cp->next_;
+ }
+
+ ip = cp->item_;
+
+ if (ip == 0)
+ {
+ ACE_NEW (cp->item_,
+ sdesItem_t);
+
+ ip = cp->item_;
+ ip->next_ = 0;
+ }
+ else
+ {
+ while (ip->next_)
+ {
+ ip = ip->next_;
+ }
+
+ ACE_NEW (ip->next_,
+ sdesItem_t);
+
+ ip = ip->next_;
+ ip->next_ = 0;
+ }
+
+ ip->type_ = RTCP_SDES_PRIV;
+
+ ip->info_.priv_.name_length_ = nameLength;
+ ip->info_.priv_.data_length_ = dataLength;
+
+ ACE_NEW (ip->info_.priv_.name_,
+ char[nameLength]);
+
+ ACE_NEW (ip->info_.priv_.data_,
+ char[dataLength]);
+
+ memcpy(ip->info_.priv_.name_, name, nameLength);
+ memcpy(ip->info_.priv_.data_, data, dataLength);
+}
+
+//==============================================================================
+
+unsigned int
+RTCP_SDES_Packet::packet_size(void)
+{
+ int size;
+ sdesChunk_t *cp; // pointer to chunk
+ sdesItem_t *ip; // pointer to item
+
+ // Determine the size of the packet.
+ size = 4; // size of common header data in octets
+
+ cp = this->chunk_;
+ while (cp)
+ {
+ size += 4; // size of ssrc
+ ip = cp->item_;
+
+ while (ip && (ip->type_ != 0))
+ {
+ if (ip->type_ != RTCP_SDES_PRIV)
+ {
+ size += 2 + ip->info_.standard_.length_; // size of item
+ }
+ else
+ {
+ size += 3 + ip->info_.priv_.name_length_ + ip->info_.priv_.data_length_;
+ }
+ ip = ip->next_;
+ }
+ size += 4 - size%4; // pad with zeros to even 32 bit bound
+ cp = cp->next_;
+ }
+
+ chd_.length_ = static_cast<ACE_UINT16> (size/4 - 1);
+
+ return size;
+}
+
+//==============================================================================
+
+void
+RTCP_SDES_Packet::build_packet(void)
+{
+ sdesChunk_t *cp; // pointer to chunk
+ sdesItem_t *ip; // pointer to item
+ int index, i;
+
+ if (this->packet_data_)
+ delete this->packet_data_;
+
+ ACE_NEW (this->packet_data_,
+ char[this->packet_size()]);
+
+ index = 0;
+ this->packet_data_[index] = static_cast<char> ((chd_.ver_ << 6) |
+ (chd_.pad_ << 5) |
+ chd_.count_);
+ index++;
+ this->packet_data_[index] = chd_.pt_;
+ index++;
+ *((ACE_UINT16*)&this->packet_data_[index]) = htons(chd_.length_);
+ index+=2;
+
+ cp = this->chunk_;
+ while (cp)
+ {
+ *((ACE_UINT32*)&this->packet_data_[index]) = htonl(cp->ssrc_);
+ index+=4;
+
+ ip = cp->item_;
+ while (ip && (ip->type_ != 0))
+ {
+ this->packet_data_[index] = ip->type_;
+ index++;
+ if (ip->type_ != RTCP_SDES_PRIV)
+ {
+ this->packet_data_[index] = ip->info_.standard_.length_;
+ index++;
+ for (i=0; i<ip->info_.standard_.length_; i++)
+ {
+ this->packet_data_[index] = ip->info_.standard_.data_[i];
+ index++;
+ }
+ }
+ else
+ {
+ this->packet_data_[index] = ip->info_.priv_.name_length_;
+ index++;
+ this->packet_data_[index] = ip->info_.priv_.data_length_;
+ index++;
+ for (i=0; i<ip->info_.priv_.name_length_; i++)
+ {
+ this->packet_data_[index] = ip->info_.priv_.name_[i];
+ index++;
+ }
+ for (i=0; i<ip->info_.priv_.data_length_; i++)
+ {
+ this->packet_data_[index] = ip->info_.priv_.data_[i];
+ index++;
+ }
+ }
+
+ ip = ip->next_;
+ }
+
+ this->packet_data_[index] = 0;
+ index++;
+
+ i=1;
+ while ((index)%4)
+ { // pad chunk with zeros to 32 bit bound
+ this->packet_data_[index] = 0;
+ index++;
+ i++;
+ }
+
+ // Store the number of bytes added. TODO: do we need this
+ // this->packet_data_[index - 1] = i;
+
+ cp = cp->next_;
+ }
+}
+
+void
+RTCP_SDES_Packet::dump (void)
+{
+ sdesItem_t *ip;
+
+ ACE_DEBUG ((LM_DEBUG,
+ "\nRTCP_SDES_Packet:: "));
+
+ if (this->num_chunks_ != 1)
+ {
+ ACE_DEBUG ((LM_DEBUG,
+ "Mixers not currently supported.\n"));
+ return;
+ }
+
+ ACE_DEBUG ((LM_DEBUG,
+ "from ssrc %u\n",
+ this->chunk_->ssrc_));
+
+ // Loop through all of the items.
+ ip = this->chunk_->item_;
+
+ while (ip)
+ {
+ // If there is no data to store, continue.
+ if (ip->info_.standard_.length_ == 0)
+ {
+ ip = ip->next_;
+ continue;
+ }
+
+ switch (ip->type_)
+ {
+ case RTCP_SDES_END:
+ break;
+ case RTCP_SDES_CNAME:
+ ACE_DEBUG ((LM_DEBUG,
+ " CNAME '%s'\n",
+ ip->info_.standard_.data_));
+ break;
+ case RTCP_SDES_NAME:
+ ACE_DEBUG ((LM_DEBUG,
+ " NAME '%s'\n",
+ ip->info_.standard_.data_));
+ break;
+ case RTCP_SDES_EMAIL:
+ ACE_DEBUG ((LM_DEBUG,
+ " EMAIL '%s'\n",
+ ip->info_.standard_.data_));
+ break;
+ case RTCP_SDES_PHONE:
+ ACE_DEBUG ((LM_DEBUG,
+ " PHONE '%s'\n",
+ ip->info_.standard_.data_));
+ break;
+ case RTCP_SDES_LOC:
+ ACE_DEBUG ((LM_DEBUG,
+ " LOC '%s'\n",
+ ip->info_.standard_.data_));
+ break;
+ case RTCP_SDES_TOOL:
+ ACE_DEBUG ((LM_DEBUG,
+ " TOOL '%s'\n",
+ ip->info_.standard_.data_));
+ break;
+ case RTCP_SDES_NOTE:
+ ACE_DEBUG ((LM_DEBUG,
+ " NOTE '%s'\n",
+ ip->info_.standard_.data_));
+ break;
+ case RTCP_SDES_PRIV:
+ ACE_DEBUG ((LM_DEBUG,
+ " '%s' '%s'\n",
+ ip->info_.priv_.name_,
+ ip->info_.priv_.data_));
+ break;
+ }
+ ip = ip->next_;
+ }
+
+}
+
+RTCP_SR_Packet::RTCP_SR_Packet(ACE_UINT32 ssrc,
+ ACE_UINT32 ntp_ts_msw,
+ ACE_UINT32 ntp_ts_lsw,
+ ACE_UINT32 timestamp,
+ ACE_UINT32 packets_sent,
+ ACE_UINT32 octets_sent,
+ RR_Block *blocks)
+{
+ RR_Block *block_ptr= 0;
+ chd_.count_ = 0;
+ chd_.ver_ = 2;
+ chd_.pt_ = RTCP_PT_SR;
+
+ this->ssrc_ = ssrc;
+ this->ntp_ts_msw_ = ntp_ts_msw;
+ this->ntp_ts_lsw_ = ntp_ts_lsw;
+ this->rtp_ts_ = timestamp;
+ this->psent_ = packets_sent;
+ this->osent_ = octets_sent;
+ this->rr_ = blocks;
+
+ block_ptr = blocks;
+
+ while (block_ptr)
+ {
+ chd_.count_++;
+
+ // Can only have 31 receiver reports
+ if (this->chd_.count_ == 31)
+ {
+ block_ptr->next_ = 0;
+ break;
+ }
+
+ block_ptr = block_ptr->next_;
+ }
+
+ this->chd_.length_ = static_cast<ACE_UINT16> (6 + 6*(chd_.count_)); //+profile specific extensions ??
+
+ this->packet_data_ = 0;
+}
+
+//==============================================================================
+
+RTCP_SR_Packet::RTCP_SR_Packet (char* buffer,
+ int *len)
+ : RTCP_Packet (buffer)
+{
+ unsigned int i = 0;
+ RR_Block *local_block_ptr = 0;
+
+ this->rr_ = 0;
+
+ // The common part of the header is initialized in the parent.
+ i=4;
+ this->ssrc_ = ntohl(*(ACE_UINT32*)&buffer[i]);
+ i+=4;
+ this->ntp_ts_msw_ = ntohl(*(ACE_UINT32*)&buffer[i]);
+ i+=4;
+ this->ntp_ts_lsw_ = ntohl(*(ACE_UINT32*)&buffer[i]);
+ i+=4;
+ this->rtp_ts_ = ntohl(*(ACE_UINT32*)&buffer[i]);
+ i+=4;
+ this->psent_ = ntohl(*(ACE_UINT32*)&buffer[i]);
+ i+=4;
+ this->osent_ = ntohl(*(ACE_UINT32*)&buffer[i]);
+ i+=4;
+ for (unsigned int j=0; j<this->chd_.count_; j++)
+ {
+ if (j==0)
+ {
+ ACE_NEW (local_block_ptr,
+ RR_Block);
+ this->rr_ = local_block_ptr;
+ }
+ else
+ {
+ ACE_NEW (local_block_ptr->next_,
+ RR_Block);
+ local_block_ptr = local_block_ptr->next_;
+ }
+
+ local_block_ptr->next_ = 0;
+ local_block_ptr->ssrc_ = ntohl(*(ACE_UINT32*)&buffer[i]);
+ i+=4;
+ ACE_UINT32 temp = ntohl(*(ACE_UINT32*)&buffer[i]);
+ local_block_ptr->fraction_ = (temp&0xff000000) >> 24;
+ local_block_ptr->lost_ = temp & 0x00ffffff;
+ i+=4;
+ local_block_ptr->last_seq_ = ntohl(*(ACE_UINT32*)&buffer[i]);
+ i+=4;
+ local_block_ptr->jitter_ = ntohl(*(ACE_UINT32*)&buffer[i]);
+ i+=4;
+ local_block_ptr->lsr_ = ntohl(*(ACE_UINT32*)&buffer[i]);
+ i+=4;
+ local_block_ptr->dlsr_ = ntohl(*(ACE_UINT32*)&buffer[i]);
+ i+=4;
+ }
+
+ *len-=(this->chd_.length_+1)*4;
+
+ this->packet_data_ = 0;
+}
+
+//==============================================================================
+
+RTCP_SR_Packet::~RTCP_SR_Packet(void)
+{
+ RR_Block *prev;
+
+ if (this->rr_)
+ {
+ while (this->rr_)
+ {
+ prev = this->rr_;
+ this->rr_ = this->rr_->next_;
+ delete prev;
+ }
+ }
+
+ if (this->packet_data_)
+ delete []this->packet_data_;
+}
+
+//==============================================================================
+
+unsigned int RTCP_SR_Packet::packet_size (void)
+{
+ ACE_UINT16 size = static_cast<ACE_UINT16> ((2+chd_.count_*6) * 4); // + profile specific extensions ?
+ size += 20; // the first line is the same as RR; 20 more bytes for SR
+
+ return size;
+}
+
+//==============================================================================
+
+void RTCP_SR_Packet::build_packet(void)
+{
+ int index = 0;
+ RR_Block *local_block_ptr;
+
+ if (this->packet_data_)
+ delete []this->packet_data_;
+
+ ACE_NEW (this->packet_data_,
+ char[this->packet_size()]);
+
+ this->packet_data_[index] = static_cast<char> ((this->chd_.ver_ << 6) |
+ (this->chd_.pad_ << 5) |
+ this->chd_.count_);
+ index++;
+ this->packet_data_[index] = this->chd_.pt_;
+ index++;
+ *((ACE_UINT16*)&this->packet_data_[index]) = htons(this->chd_.length_);
+ index+=2;
+ *((ACE_UINT32*)&this->packet_data_[index]) = htonl(this->ssrc_);
+ index+=4;
+ *((ACE_UINT32*)&this->packet_data_[index]) = htonl(this->ntp_ts_msw_);
+ index+=4;
+ *((ACE_UINT32*)&this->packet_data_[index]) = htonl(this->ntp_ts_lsw_);
+ index+=4;
+ *((ACE_UINT32*)&this->packet_data_[index]) = htonl(this->rtp_ts_);
+ index+=4;
+ *((ACE_UINT32*)&this->packet_data_[index]) = htonl(this->psent_);
+ index+=4;
+ *((ACE_UINT32*)&this->packet_data_[index]) = htonl(this->osent_);
+ index+=4;
+
+ local_block_ptr = this->rr_;
+ while (local_block_ptr)
+ {
+ *((ACE_UINT32*)&this->packet_data_[index]) = htonl(local_block_ptr->ssrc_);
+ index+=4;
+ ACE_UINT32 temp = htonl((local_block_ptr->fraction_&0xff) << 24) &
+ local_block_ptr->lost_;
+ *((ACE_UINT32*)&this->packet_data_[index]) = temp;
+ index+=4;
+ *((ACE_UINT32*)&this->packet_data_[index]) = htonl(local_block_ptr->last_seq_);
+ index+=4;
+ *((ACE_UINT32*)&this->packet_data_[index]) = htonl(local_block_ptr->jitter_);
+ index+=4;
+ *((ACE_UINT32*)&this->packet_data_[index]) = htonl(local_block_ptr->lsr_);
+ index+=4;
+ *((ACE_UINT32*)&this->packet_data_[index]) = htonl(local_block_ptr->dlsr_);
+ index+=4;
+ local_block_ptr = local_block_ptr->next_;
+ }
+}
+
+void
+RTCP_SR_Packet::dump (void)
+{
+ RR_Block *b = this->rr_;
+ int count = 1;
+
+ ACE_DEBUG ((LM_DEBUG,
+ "\nRTCP_SR_Packet:: from %u - %d rr blocks follow.\n",
+ this->ssrc_,
+ this->chd_.count_));
+ ACE_DEBUG ((LM_DEBUG,
+ " NTP(sec) %u.%u; RTP ts %u\n",
+ this->ntp_ts_msw_,
+ this->ntp_ts_lsw_,
+ this->rtp_ts_));
+ ACE_DEBUG ((LM_DEBUG,
+ " packets sent %u; octets sent %u\n",
+ this->psent_,
+ this->osent_));
+
+ while (b)
+ {
+ ACE_DEBUG ((LM_DEBUG,
+ " Block %d: ssrc %u; frac %u; lost %u; last seq %u\n",
+ count,
+ b->ssrc_,
+ b->fraction_,
+ b->lost_,
+ b->last_seq_));
+ ACE_DEBUG ((LM_DEBUG,
+ " jitter %u; lsr %u; dlsr %u;\n",
+ b->jitter_,
+ b->lsr_,
+ b->dlsr_));
+
+ b = b->next_;
+ ++count;
+ }
+}
+
+TAO_END_VERSIONED_NAMESPACE_DECL
diff --git a/TAO/orbsvcs/orbsvcs/AV/RTCP_Packet.h b/TAO/orbsvcs/orbsvcs/AV/RTCP_Packet.h
new file mode 100644
index 00000000000..696378258af
--- /dev/null
+++ b/TAO/orbsvcs/orbsvcs/AV/RTCP_Packet.h
@@ -0,0 +1,405 @@
+// -*- C++ -*-
+
+// $Id$
+
+#ifndef RTCP_PACKET_INCLUDE
+#define RTCP_PACKET_INCLUDE
+
+#include /**/ "ace/pre.h"
+
+#include "tao/orbconf.h"
+#include "tao/Versioned_Namespace.h"
+
+
+TAO_BEGIN_VERSIONED_NAMESPACE_DECL
+
+/**
+ * @struct RTCP_Common_Header
+ * @brief This is the header data that is common to all RTCP messages.
+ */
+typedef struct
+{
+ /// the RTP version being used
+ unsigned int ver_:2;
+
+ /// indicates whether or not the end of the packet is padded with zeros
+ unsigned int pad_:1;
+
+ /// this value varies by packet type
+ unsigned int count_:5;
+
+ /// RTCP packet type (eg BYE, SR, RR, SDES)
+ unsigned int pt_:8;
+
+ /// packet length in words without this word
+ ACE_UINT16 length_;
+} RTCP_Common_Header;
+
+/**
+ * @class RTCP_Packet
+ * @brief This is an abstract class from which all RTCP packet types are derived.
+ * It contains code used to validate the RTCP packet.
+ */
+
+class RTCP_Packet
+{
+public:
+ /// Constructor for outgoing RTCP packets.
+ RTCP_Packet(void);
+
+ /// Constructor for incoming RTCP packets.
+ RTCP_Packet(char *buffer);
+
+ /// Destructor
+ virtual ~RTCP_Packet();
+
+ /// Returns a pointer to a local buffer containing the packet.
+ void get_packet_data(char **buffer, ACE_UINT16 &length);
+
+ /// Returns the size of the packet.
+ /// Defined in child class.
+ virtual unsigned int packet_size(void) = 0;
+
+ /// Checks the validity of an RTCP packet. RTCP packets can be sent
+ /// together in a compound packet and is_first indicates the first packet
+ /// in a compound packet
+ int is_valid (char is_first);
+
+protected:
+ /// Header data common to all RTCP packets.
+ RTCP_Common_Header chd_;
+
+ /// Buffer to hold byte representation of the RTCP packet.
+ char *packet_data_;
+
+ /// Used to create the byte representation of the RTCP packet.
+ /// Defined in child class.
+ virtual void build_packet(void) = 0;
+};
+
+/**
+ * @class RTCP_BYE_Packet
+ * @brief The BYE RTCP packet is sent by a party when leaving an RTP session.
+ */
+
+class RTCP_BYE_Packet : public RTCP_Packet
+{
+public:
+ /// Constructor for outgoing BYE RTCP packets.
+ /// Takes a synchronization source id list, the list length (1 for non-mixers),
+ /// and an optional reason for leaving the session.
+ RTCP_BYE_Packet (ACE_UINT32 *srcList,
+ unsigned char length,
+ const char* text=0);
+
+ /// Constructor for incoming BYE RTCP packets.
+ RTCP_BYE_Packet (char *buffer,
+ int *len);
+
+ /// Destructor.
+ virtual ~RTCP_BYE_Packet (void);
+
+ /// Returns the size of the packet in bytes.
+ unsigned int packet_size (void);
+
+ /// Returns a pointer to a local list of synchronization source ids that are
+ /// leaving the session.
+ void ssrc_list (ACE_UINT32 **ssrc_list,
+ unsigned char &length);
+
+ /// Returns the reason for leaving the session.
+ const char *reason (void);
+
+ /// Prints the contents of the packet.
+ void dump (void);
+
+private:
+ /// Used to create the byte representation of the RTCP packet.
+ void build_packet();
+
+ /// List of synchronization source ids that are leaving the session.
+ ACE_UINT32 *ssrc_list_;
+
+ /// The number of ssrc's that are leaving the session (1 for non-mixers).
+ unsigned char ssrc_list_length_;
+
+ /// An optional reason for leaving the session.
+ char reason_[256];
+
+ /// The number of bytes in the reason for leaving the session.
+ unsigned char reason_length_;
+};
+
+/**
+ * @struct RR_Block
+ * @brief The receiver report block encapsulates the data that represents the
+ * reception statistics for a particular stream.
+ */
+
+struct RR_Block
+{
+ /// The synchronization source id of the source of the data.
+ ACE_UINT32 ssrc_;
+
+ /// The fraction of RTP data packets lost since the previous SR or RR was sent.
+ unsigned int fraction_:8;
+
+ /// The cumulative number of packets lost.
+ int lost_:24;
+
+ /// The highest extended sequence number received in an RTP packet.
+ ACE_UINT32 last_seq_;
+
+ /// An estimate of the statistical variance of the RTP data packet interarrival
+ /// time measured in timestamp units.
+ ACE_UINT32 jitter_;
+
+ /// The middle 32 bits of the NTP timestamp received in the most recent sender
+ /// report.
+ ACE_UINT32 lsr_;
+
+ /// The delay in 1/65536 seconds since receiving the last sender report.
+ ACE_UINT32 dlsr_;
+
+ /// Link to the next receiver report block.
+ RR_Block *next_;
+};
+
+/**
+ * @class RTCP_RR_Packet
+ * @brief The Receiver Report packet is sent by all members of a session that
+ * are not sending data. It contains a list of RR_Block to represent each
+ * source this party is receiving data from.
+ */
+
+class RTCP_RR_Packet : public RTCP_Packet
+{
+public:
+ /// Constructor for incoming receiver reports.
+ RTCP_RR_Packet (char *buffer, int* len);
+
+ /// Constructor for outgoing receiver reports.
+ RTCP_RR_Packet (ACE_UINT32 ssrc, RR_Block *blocks);
+
+ /// Destructor.
+ virtual ~RTCP_RR_Packet (void);
+
+ /// Returns the size of the packet in bytes.
+ unsigned int packet_size(void);
+
+ /// Returns the synchronization source id of the source sending this packet.
+ ACE_INT32 ssrc (void) { return this->ssrc_; }
+
+ /// Prints the contents of the packet.
+ void dump (void);
+
+private:
+ /// Used to create the byte representation of the RTCP packet.
+ void build_packet(void);
+
+ /// The synchronization source id of the sender of this report.
+ ACE_UINT32 ssrc_;
+
+ /// A linked list of the receiver report block(s) being sent.
+ RR_Block *rr_;
+};
+
+typedef struct sdesItem_s sdesItem_t;
+
+/**
+ * @struct sdesItem_s
+ * @brief This is a linked list of structures containing source description
+ * 'items' such as canonical name, email, location etc.
+ */
+
+struct sdesItem_s
+{
+ /// link to next item.
+ sdesItem_t *next_;
+
+ /// Type of item (eg canonical name).
+ unsigned char type_;
+
+ union
+ {
+ struct
+ {
+ /// Length of an item (in octets).
+ unsigned char length_;
+
+ /// Item text, not null-terminated.
+ char *data_;
+ } standard_;
+ struct
+ {
+ /// Length of the name of an item (in octets).
+ unsigned char name_length_;
+
+ /// Length of the item data (in octets).
+ unsigned char data_length_;
+
+ /// The name of the item, not null-terminated.
+ char *name_;
+
+ /// Item data, not null-terminated.
+ char *data_;
+ } priv_;
+ } info_;
+};
+
+typedef struct sdesChunk_s sdesChunk_t;
+
+/**
+ * @struct sdesChunk_s
+ * @brief This is a linked list of structures containing groups of source
+ * description items. A group of items for a particular synchronization source
+ * id is referred to as a 'chunk'.
+ */
+struct sdesChunk_s
+{
+ /// Link to next item.
+ sdesChunk_t *next_;
+
+ /// The synchronization source id that this chunk describes.
+ ACE_UINT32 ssrc_;
+
+ /// A linked list of items to describe this source.
+ sdesItem_t *item_;
+};
+
+/**
+ * @class RTCP_SDES_Packet
+ * @brief The Source Description packet is sent by all members of a session.
+ * At a minimum, the canonical name (or CNAME) is sent with each RTCP packet.
+ * Other items such as name, email, or location are included less frequently.
+ */
+class RTCP_SDES_Packet : public RTCP_Packet
+{
+public:
+ /// Constructor for incoming SDES packets.
+ RTCP_SDES_Packet(char* buffer, int *len);
+
+ /// Constructor for outgoing SDES packets.
+ RTCP_SDES_Packet(void);
+
+ /// Destructor.
+ virtual ~RTCP_SDES_Packet(void);
+
+ /// This will add a standard item of type and length for the ssrc specified.
+ /// When the first item for a ssrc is added, a chunk is created. Subsequent
+ /// items for that ssrc are added to the same chunk. New chunks are created
+ /// for each unique ssrc.
+ void add_item(ACE_UINT32 ssrc,
+ unsigned char type,
+ unsigned char length,
+ const char* data);
+
+ /// This will add a private item using the name and data for the ssrc specified.
+ /// When the first item for a ssrc is added, a chunk is created. Subsequent
+ /// items for that ssrc are added to the same chunk. New chunks are created
+ /// for each unique ssrc.
+ void add_priv_item(ACE_UINT32 ssrc,
+ unsigned char nameLength,
+ const char *name,
+ unsigned char dataLength,
+ const char *data);
+
+ /// Returns the size of the packet in bytes.
+ unsigned int packet_size(void);
+
+ /// Prints the contents of the packet.
+ void dump (void);
+
+ /// This returns the synchronization source id for this packet. This assumes
+ /// that this source is only receiving messages from end systems (i.e. only
+ /// one source id per SDES)
+ ACE_UINT32 ssrc (void) { return this->chunk_->ssrc_; }
+
+private:
+ /// Used to create the byte representation of the RTCP packet.
+ void build_packet(void);
+
+ /// Add a chunk to the packet.
+ void add_chunk(ACE_UINT32 ssrc);
+
+ /// The number of chunks contained in this packet.
+ /// 1 for end systems, 1+ for mixers
+ unsigned long num_chunks_;
+
+// unsigned long num_items_;
+
+ /// A linked list of chunks for this packet (only 1 for non-mixers).
+ sdesChunk_t *chunk_;
+};
+
+/**
+ * @class RTCP_SR_Packet
+ * @brief The Sender Report packet is sent by all members of a session that
+ * are sending data. It contains statistics on the data being sent out. It
+ * also contains a list of RR_Block to represent each source this party is
+ * receiving data from.
+ */
+
+class RTCP_SR_Packet : public RTCP_Packet
+{
+public:
+ /// Constructor for incoming SR packets.
+ RTCP_SR_Packet(char *buffer, int *len);
+
+ /// Constructor for outgoing SR packets.
+ RTCP_SR_Packet(ACE_UINT32 ssrcVal,
+ ACE_UINT32 ntpMSByte,
+ ACE_UINT32 ntpLSByte,
+ ACE_UINT32 timestamp,
+ ACE_UINT32 pktsSent,
+ ACE_UINT32 octetsSent,
+ RR_Block *rrBlocks);
+
+ /// Destructor
+ virtual ~RTCP_SR_Packet(void);
+
+ /// Returns the size of the packet in bytes.
+ unsigned int packet_size(void);
+
+ /// Returns the synchronization source id for the sender of this packet.
+ ACE_UINT32 ssrc (void) { return this->ssrc_; }
+
+ /// Returns the most significant word of the NTP timestamp.
+ ACE_UINT32 ntp_ts_msw (void) { return this->ntp_ts_msw_; }
+
+ /// Returns the least significant word of the NTP timestamp.
+ ACE_UINT32 ntp_ts_lsw (void) { return this->ntp_ts_lsw_; }
+
+ /// Prints the contents of the packet.
+ void dump (void);
+
+private:
+ /// Used to create the byte representation of the RTCP packet.
+ void build_packet(void);
+
+ /// The synchronization source id of the sender generating this report.
+ ACE_UINT32 ssrc_;
+
+ /// The most significant word of the NTP timestamp.
+ ACE_UINT32 ntp_ts_msw_;
+
+ /// The least significant word of the NTP timestamp.
+ ACE_UINT32 ntp_ts_lsw_;
+
+ /// The RTP timestamp
+ ACE_UINT32 rtp_ts_;
+
+ /// The total number of packets sent.
+ ACE_UINT32 psent_;
+
+ /// The total number of octets sent.
+ ACE_UINT32 osent_;
+
+ /// A linked list of receiver report blocks.
+ RR_Block *rr_;
+};
+
+TAO_END_VERSIONED_NAMESPACE_DECL
+
+#include /**/ "ace/post.h"
+#endif /* RTCP_PACKET_INCLUDE */
diff --git a/TAO/orbsvcs/orbsvcs/AV/RTP.cpp b/TAO/orbsvcs/orbsvcs/AV/RTP.cpp
new file mode 100644
index 00000000000..4e53a5f63e5
--- /dev/null
+++ b/TAO/orbsvcs/orbsvcs/AV/RTP.cpp
@@ -0,0 +1,785 @@
+/*
+ * Copyright (c) 1994-1995 Regents of the University of California.
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in the
+ * documentation and/or other materials provided with the distribution.
+ * 3. All advertising materials mentioning features or use of this software
+ * must display the following acknowledgement:
+ * This product includes software developed by the University of
+ * California, Berkeley and the Network Research Group at
+ * Lawrence Berkeley Laboratory.
+ * 4. Neither the name of the University nor of the Laboratory may be used
+ * to endorse or promote products derived from this software without
+ * specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
+ * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
+ * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+ * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+ * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGE.
+ */
+
+// $Id$
+
+#include "orbsvcs/AV/RTP.h"
+#include "orbsvcs/AV/RTCP.h"
+
+#include "tao/debug.h"
+#include "ace/OS_NS_arpa_inet.h"
+#include "ace/OS_NS_strings.h"
+
+TAO_BEGIN_VERSIONED_NAMESPACE_DECL
+
+// RTP_Packet
+
+// Constructor for RTP packets received
+RTP_Packet::RTP_Packet(char* buffer, int length)
+{
+ // skip the standard header info
+ int index = 12;
+
+ memcpy(this->packet_, buffer, length);
+
+ for (int j=0; j<(int)this->cc(); j++)
+ {
+ this->host_byte_order_csrc_list_[j] = ntohl(*(ACE_UINT32*)&buffer[index]);
+ index+=4;
+ }
+
+ // ignore the header extension if there is one
+ if (this->ext())
+ {
+ index+=2;
+ int extension_data_size = ntohs(*(ACE_UINT16*)&buffer[index]);
+ index+=2;
+ index+=extension_data_size;
+
+ this->extension_bytes_ = 4 + extension_data_size;
+ }
+ else
+ this->extension_bytes_ = 0;
+
+ this->packet_size_ = static_cast<ACE_UINT16> (length);
+ this->payload_size_ = static_cast<ACE_UINT16> (length-index);
+
+ // This is necessary only for payload types that have 16 bit values to correct
+ // the network byte ordering.
+ if ((this->pt() == RTP_PT_L16_OTHER) ||
+ (this->pt() == RTP_PT_L16_STEREO) ||
+ (this->pt() == RTP_PT_L16_MONO))
+ {
+ for (int i=0; i < payload_size_; i+=2)
+ {
+ *(ACE_UINT16*)&this->host_byte_order_payload_[i] = ntohs(*(ACE_UINT16*)&this->packet_[index]);
+ index+=2;
+ }
+ }
+ else
+ for (int i=0; i<this->payload_size_; i++)
+ {
+ this->host_byte_order_payload_[i] = this->packet_[index];
+ index++;
+ }
+}
+
+RTP_Packet::RTP_Packet(unsigned char padding,
+ unsigned char marker,
+ unsigned char payload_type,
+ ACE_UINT32 seq_num,
+ ACE_UINT32 timestamp,
+ ACE_UINT32 ssrc,
+ unsigned char csrc_count,
+ ACE_UINT32 *csrc_list,
+ char *data,
+ ACE_UINT16 data_size)
+ :extension_bytes_(0)
+{
+ //size of header (in octets) without contributing sources
+ ACE_UINT16 size = 3*4;
+ int index = 0;
+
+ if (data_size > RTP_MTU-12)
+ {
+ data_size = RTP_MTU-12;
+ ACE_DEBUG ((LM_DEBUG, "\n(%N,%l) RTP_Packet: Warning - packet truncated\n"));
+ }
+
+ if (csrc_count > 15)
+ csrc_count = 15; // Only 15 contributing sources can be specified.
+
+ if (csrc_list != 0)
+ for (unsigned char i=0; i<csrc_count; i++)
+ {
+ size+=4;
+ this->host_byte_order_csrc_list_[i] = csrc_list[i];
+ }
+
+ this->packet_size_ = size + data_size;
+
+ index = 0;
+ this->packet_[index] = ((RTP_VERSION & 0x3) << 6) |
+ ((padding & 0x1) << 5) |
+ ((0 & 0x1) << 4) | // extension bit
+ ((csrc_count & 0xf));
+
+ index++;
+ this->packet_[index] = ((marker & 0x1) << 7 ) |
+ ((payload_type & 0x7f));
+ index++;
+ *((ACE_UINT16*)&this->packet_[index]) = (ACE_UINT16)htons(static_cast<u_short> (seq_num));
+ index+=2;
+ *((ACE_UINT32*)&this->packet_[index]) = (ACE_UINT32)htonl(timestamp);
+ index+=4;
+ *((ACE_UINT32*)&this->packet_[index]) = htonl(ssrc);
+ index+=4;
+
+ for (int i=0; i<csrc_count; i++)
+ {
+ *((ACE_UINT32*)&this->packet_[index]) = htonl(this->host_byte_order_csrc_list_[i]);
+ index+=4;
+ }
+
+ memcpy (this->host_byte_order_payload_, data, data_size);
+
+ this->payload_size_ = data_size;
+
+ // Correct byte ordering for multi-byte payload types.
+ if ((this->pt() == RTP_PT_L16_OTHER) ||
+ (this->pt() == RTP_PT_L16_STEREO) ||
+ (this->pt() == RTP_PT_L16_MONO))
+ {
+ for (int i=0; i<this->payload_size_; i+=2)
+ {
+ *(ACE_UINT16*)&this->packet_[index] = htons(*(ACE_UINT16*)&data[i]);
+ index+=2;
+ }
+ }
+ else
+ for (int i=0; i<this->payload_size_; i++)
+ {
+ this->packet_[index] = data[i];
+ index++;
+ }
+}
+
+RTP_Packet::~RTP_Packet(void)
+{
+}
+
+ACE_UINT16
+RTP_Packet::packet_size(void)
+{
+ return this->packet_size_;
+}
+
+ACE_UINT16
+RTP_Packet::payload_size(void)
+{
+ return this->payload_size_;
+}
+
+unsigned int
+RTP_Packet::ver (void)
+{
+ return ( this->packet_[0] & 0xC0 ) >> 6;
+}
+
+unsigned int
+RTP_Packet::pad (void)
+{
+ return ( this->packet_[0] & 0x20 ) >> 5;
+}
+
+unsigned int
+RTP_Packet::ext (void)
+{
+ return ( this->packet_[0] & 0x10 ) >> 4;
+}
+
+unsigned int
+RTP_Packet::cc (void)
+{
+ return ( this->packet_[0] & 0x0F ) ;
+}
+
+unsigned int
+RTP_Packet::mrk (void)
+{
+ return ( this->packet_[1] & 0x80 ) >> 7;
+}
+
+unsigned int
+RTP_Packet::pt (void)
+{
+ return ( this->packet_[1] & 0x7F ) ;
+}
+
+ACE_UINT16
+RTP_Packet::sn (void)
+{
+ return ntohs(*(ACE_UINT16*)(&this->packet_[2])) ;
+}
+
+ACE_UINT32
+RTP_Packet::ts (void)
+{
+ return ntohl(*(ACE_UINT32*)(&this->packet_[4])) ;
+}
+
+ACE_UINT32
+RTP_Packet::ssrc (void)
+{
+ return ntohl(*(ACE_UINT32*)(&this->packet_[8])) ;
+}
+
+unsigned int
+RTP_Packet::ext_bytes (void)
+{
+ return this->extension_bytes_;
+}
+
+void
+RTP_Packet::get_frame_info (TAO_AV_frame_info *frame_info)
+{
+ frame_info->timestamp = this->mrk();
+ frame_info->timestamp = this->ts();
+ frame_info->ssrc = this->ssrc();
+ frame_info->sequence_num = this->sn();
+ frame_info->format = static_cast<CORBA::Octet> (this->pt());
+}
+
+int
+RTP_Packet::is_valid (void)
+{
+ // taken from RFC 1889 - Appendix A.1
+
+ // make sure the RTP version is correct
+ if (this->ver() != RTP_VERSION)
+ return 0;
+
+ // make sure the payload type is not SR or RR
+ if ((this->pt() == RTCP_PT_SR) || (this->pt() == RTCP_PT_RR))
+ return 0;
+
+ // if the p bit is set, the last octet of the packet must contain a valid
+ // octet count, in particular, less than the total packet length minus
+ // the header size.
+ if (this->pad() != 0)
+ if ((unsigned int)this->packet_[this->packet_size_] >=
+ (this->packet_size_ - (12 + this->cc() + this->extension_bytes_)))
+ return 0;
+
+ // If there is an extension, it is ignored (taken care of in constructor)
+
+ // The length of the packet must be consistent with CC and payload type (if
+ // payloads have a known length)
+
+ return 1;
+}
+
+void
+RTP_Packet::get_csrc_list (ACE_UINT32 **csrc_list, ACE_UINT16 &length)
+{
+ *csrc_list = this->host_byte_order_csrc_list_;
+ length = static_cast<ACE_UINT16> (this->cc ());
+}
+
+void
+RTP_Packet::get_payload (char **payload, ACE_UINT16 &length)
+{
+ *payload = this->host_byte_order_payload_ ;
+ length = this->payload_size_;
+}
+
+void
+RTP_Packet::get_packet_data (char **packet, ACE_UINT16 &length)
+{
+ *packet = this->packet_;
+ length = this->packet_size_;
+}
+
+
+// TAO_AV_RTP_Object
+
+int
+TAO_AV_RTP_Object::handle_input (void)
+{
+ TAO_AV_frame_info frame_info;
+
+ if (TAO_debug_level > 1)
+ ACE_DEBUG ((LM_DEBUG,
+ "\nTAO_AV_RTP_Object::handle_input\n"));
+
+ // Handles the incoming RTP packet input.
+ this->frame_.rd_ptr (this->frame_.base ());
+
+ int n = this->transport_->recv (this->frame_.rd_ptr (),
+ this->frame_.size ());
+ if (n == 0)
+ ACE_ERROR_RETURN ( (LM_ERROR,"TAO_AV_RTP::handle_input:connection closed\n"),-1);
+ if (n < 0)
+ {
+ if ((errno == EADDRNOTAVAIL) || (errno == ECONNRESET))
+ {
+ this->connection_gone_ = 1;
+ return -1;
+ }
+ else
+ ACE_ERROR_RETURN ( (LM_ERROR,"TAO_AV_RTP::handle_input:recv error\n"),-1);
+ }
+
+ this->frame_.wr_ptr (this->frame_.rd_ptr () + n);
+ ACE_Addr *addr = this->transport_->get_peer_addr ();
+
+ if(this->control_object_)
+ this->control_object_->handle_control_input (&this->frame_, *addr);
+
+ // Get payload that has been converted to host byte order
+ char *data_ptr;
+ ACE_UINT16 length;
+ RTP_Packet rtp_packet(this->frame_.rd_ptr (),
+ static_cast<int> (this->frame_.length ()));
+
+ rtp_packet.get_frame_info (&frame_info);
+ rtp_packet.get_payload(&data_ptr, length);
+
+ this->frame_.rd_ptr (this->frame_.base ());
+ memcpy (this->frame_.rd_ptr (), data_ptr, length);
+ this->frame_.wr_ptr (this->frame_.rd_ptr() + length);
+
+ this->callback_->receive_frame (&this->frame_, &frame_info, *addr);
+
+ return 0;
+}
+
+int
+TAO_AV_RTP_Object::send_frame (ACE_Message_Block *frame,
+ TAO_AV_frame_info *frame_info)
+{
+// ACE_Addr *addr = this->transport_->get_peer_addr ();
+
+ if (this->connection_gone_)
+ {
+ errno = ECONNRESET;
+ return -1;
+ }
+
+ int result = -1;
+ RTP_Packet *rtp_packet;
+ ACE_UINT32 csrc_count = 0; // Assume for now no mixers/translators
+ ACE_UINT32 *csrc_list = 0;
+
+ if (frame_info != 0)
+ {
+ if (frame_info->format != this->format_)
+ ACE_DEBUG ((LM_DEBUG,
+ "TAO_AV_RTP_Object::send_frame - error: format type mismatch"));
+ if (frame_info->ssrc != 0)
+ this->ssrc_ = frame_info->ssrc;
+
+ TAO_AV_RTCP_Object *rtcp_prot_obj = dynamic_cast<TAO_AV_RTCP_Object*> (this->control_object_);
+ // set the ssrc on the control object so the RTCP traffic can be matched
+ // to the RTP traffic
+ rtcp_prot_obj->ssrc(this->ssrc_);
+
+ ACE_NEW_RETURN (rtp_packet,
+ RTP_Packet (0, // padding
+ frame_info->boundary_marker, // marker
+ static_cast<unsigned char> (this->format_), // payload type
+ frame_info->sequence_num, // sequence num
+ frame_info->timestamp, // time stamp
+ this->ssrc_, // ssrc
+ static_cast<unsigned char> (csrc_count), // csrc count
+ csrc_list, // csrc list
+ frame->rd_ptr (), // data
+ (ACE_UINT16)frame->length ()),// data size
+ -1);
+
+ frame_info->sequence_num ++;
+ }
+ else
+ {
+ // TODO: For periodic RTP packets (constant rate), the RFC suggests
+ // increasing the clock by the number of samples each frame rather
+ // than relying on the system time
+
+ // The RFC specifies at least one timestamp unit per sample as well as a
+ // random offset. It used to be in milliseconds so I left it that way
+ // for non-audio streams.
+ unsigned int samples_per_sec;
+ double samples_per_usec;
+
+ switch (this->format_)
+ {
+ case RTP_PT_PCMU:
+ case RTP_PT_CELP:
+ case RTP_PT_G721:
+ case RTP_PT_GSM:
+ case RTP_PT_DVI:
+ case RTP_PT_LPC:
+ case RTP_PT_PCMA:
+ case RTP_PT_G722:
+ samples_per_sec = 8000;
+ break;
+ case RTP_PT_L16_STEREO:
+ case RTP_PT_L16_MONO:
+ samples_per_sec = 44100;
+ break;
+ default:
+ samples_per_sec = 1000000;
+ };
+
+ samples_per_usec = samples_per_sec/1000000.0;
+
+ ACE_Time_Value now = ACE_OS::gettimeofday();
+
+ ACE_UINT32 ts = (ACE_UINT32)
+ (now.sec () * samples_per_sec +
+ ((double)now.usec () * samples_per_usec) +
+ this->timestamp_offset_);
+
+ ACE_NEW_RETURN (rtp_packet,
+ RTP_Packet (0, // padding
+ 0, // marker
+ static_cast<unsigned char> (this->format_), // payload type
+ this->sequence_num_, // sequence num
+ ts, // time stamp
+ this->ssrc_, // ssrc
+ static_cast<unsigned char> (csrc_count), // csrc count
+ csrc_list, // csrc list
+ frame->rd_ptr (), // data
+ (ACE_UINT16)frame->length ()),// data size
+ -1);
+
+ this->sequence_num_ ++;
+ }
+
+ char *data_ptr;
+ ACE_UINT16 data_length;
+ rtp_packet->get_packet_data (&data_ptr, data_length);
+
+ ACE_Message_Block mb (data_ptr, data_length);
+ mb.wr_ptr (data_length);
+
+ result = this->transport_->send (&mb);
+ if (result < 0)
+ ACE_ERROR_RETURN ( (LM_ERROR,"TAO_AV_RTP::send_frame failed\n"),result);
+
+ TAO_AV_RTCP_Object *rtcp_prot_obj = dynamic_cast<TAO_AV_RTCP_Object*> (this->control_object_);
+ if (rtcp_prot_obj)
+ rtcp_prot_obj->handle_control_output (&mb);
+
+ delete rtp_packet;
+
+ return 0;
+}
+
+int
+TAO_AV_RTP_Object::send_frame (const iovec *iov,
+ int iovcnt,
+ TAO_AV_frame_info *frame_info)
+{
+ int result = -1;
+ RTP_Packet *rtp_packet = 0;
+ ACE_UINT32 csrc_count = 0; // Assume for now no mixers/translators
+ ACE_UINT32 *csrc_list = 0;
+
+ if (this->connection_gone_)
+ {
+ errno = ECONNRESET;
+ return -1;
+ }
+
+ if (frame_info != 0)
+ {
+ if (frame_info->format != this->format_)
+ ACE_DEBUG ((LM_DEBUG,
+ "TAO_AV_RTP_Object::send_frame - error: format type mismatch"));
+ this->sequence_num_ = static_cast<ACE_UINT16> (frame_info->sequence_num);
+ if (frame_info->ssrc != 0)
+ this->ssrc_ = frame_info->ssrc;
+
+ TAO_AV_RTCP_Object *rtcp_prot_obj = dynamic_cast<TAO_AV_RTCP_Object*> (this->control_object_);
+ // set the ssrc on the control object so the RTCP traffic can be matched
+ // to the RTP traffic
+ rtcp_prot_obj->ssrc(this->ssrc_);
+ ACE_UINT16 data_size = static_cast<ACE_UINT16> (iov[0].iov_len);
+
+ ACE_NEW_RETURN (rtp_packet,
+ RTP_Packet (0, // padding
+ frame_info->boundary_marker, // marker
+ static_cast<unsigned char> (this->format_), // payload type
+ frame_info->sequence_num, // sequence num
+ frame_info->timestamp, // time stamp
+ this->ssrc_, // ssrc
+ static_cast<unsigned char> (csrc_count), // csrc count
+ csrc_list, // csrc list
+ (char *)iov[0].iov_base, // data
+ data_size), // data size
+ -1);
+
+ frame_info->sequence_num ++;
+ }
+ else
+ {
+ // TODO: For periodic RTP packets (constant rate), the RFC suggests
+ // increasing the clock by the number of samples each frame rather
+ // than relying on the system time
+
+ // The RFC specifies at least one timestamp unit per sample as well as a
+ // random offset. It used to be in milliseconds so I left it that way
+ // for non-audio streams.
+
+ unsigned int samples_per_sec;
+ double samples_per_usec;
+
+ switch (this->format_)
+ {
+ case RTP_PT_PCMU:
+ case RTP_PT_CELP:
+ case RTP_PT_G721:
+ case RTP_PT_GSM:
+ case RTP_PT_DVI:
+ case RTP_PT_LPC:
+ case RTP_PT_PCMA:
+ case RTP_PT_G722:
+ samples_per_sec = 8000;
+ break;
+ case RTP_PT_L16_STEREO:
+ case RTP_PT_L16_MONO:
+ samples_per_sec = 44100;
+ break;
+ default:
+ samples_per_sec = 1000000;
+ };
+
+ samples_per_usec = samples_per_sec/1000000.0;
+
+ ACE_Time_Value now = ACE_OS::gettimeofday();
+
+ ACE_UINT32 ts = (ACE_UINT32)
+ (now.sec () * samples_per_sec +
+ ((double)now.usec () * samples_per_usec) +
+ this->timestamp_offset_);
+ ACE_UINT16 data_size = static_cast<ACE_UINT16> (iov[0].iov_len);
+
+ ACE_NEW_RETURN (rtp_packet,
+ RTP_Packet (0, // padding
+ 0, // marker
+ static_cast<unsigned char> (this->format_), // payload type
+ this->sequence_num_, // sequence num
+ ts, // time stamp
+ this->ssrc_, // ssrc
+ static_cast<unsigned char> (csrc_count), // csrc count
+ csrc_list, // csrc list
+ (char *)iov[0].iov_base, // data
+ data_size), // data size
+ -1);
+
+ this->sequence_num_ ++;
+ }
+
+ char *data_ptr;
+ ACE_UINT16 data_length;
+ rtp_packet->get_packet_data (&data_ptr, data_length);
+
+ iovec send_iov[ACE_IOV_MAX];
+ send_iov [0].iov_base = data_ptr;
+ send_iov [0].iov_len = data_length;
+ for (int i=1;i<iovcnt; i++)
+ send_iov [i] = iov [i];
+ result = this->transport_->send (send_iov, iovcnt);
+
+ delete rtp_packet;
+
+ if (result < 0)
+ ACE_ERROR_RETURN ((LM_ERROR,"TAO_AV_RTP::send_frame failed\n"),result);
+
+ return 0;
+}
+
+int
+TAO_AV_RTP_Object::send_frame (const char*,
+ size_t)
+{
+ return 0;
+}
+
+
+TAO_AV_RTP_Object::TAO_AV_RTP_Object (TAO_AV_Callback *callback,
+ TAO_AV_Transport *transport)
+ :TAO_AV_Protocol_Object (callback,transport),
+ control_object_ (0),
+ connection_gone_ (0)
+{
+ this->sequence_num_ = static_cast<ACE_UINT16> (ACE_OS::rand ());
+ this->timestamp_offset_ = ACE_OS::rand ();
+
+ char buf [BUFSIZ];
+ int result = ACE_OS::hostname (buf, BUFSIZ);
+ unsigned long ipaddr = 0;
+ if (result == 0)
+ ipaddr = ACE_OS::inet_addr (buf);
+ this->ssrc_ = TAO_AV_RTCP::alloc_srcid (ipaddr);
+
+ this->frame_.size (2 * this->transport_->mtu ());
+}
+
+TAO_AV_RTP_Object::~TAO_AV_RTP_Object (void)
+{
+}
+
+int
+TAO_AV_RTP_Object::destroy (void)
+{
+ if(this->control_object_)
+ this->control_object_->destroy ();
+
+ this->callback_->handle_destroy ();
+ delete this;
+
+ return 0;
+}
+
+int
+TAO_AV_RTP_Object::set_policies (const TAO_AV_PolicyList &policy_list)
+{
+ this->policy_list_ = policy_list;
+ CORBA::ULong const num_policies = this->policy_list_.length ();
+ TAO_AV_Policy *policy = 0;
+
+ for (u_int i=0; i< num_policies;i++)
+ {
+ policy = this->policy_list_ [i];
+ switch (policy->type ())
+ {
+ case TAO_AV_PAYLOAD_TYPE_POLICY:
+ {
+ TAO_AV_Payload_Type_Policy *payload_policy =
+ static_cast<TAO_AV_Payload_Type_Policy *> (policy);
+ if (payload_policy == 0)
+ ACE_ERROR_RETURN ( (LM_ERROR,"TAO_AV_RTP_Object::send_frame:Payload policy not defined\n"),-1);
+ this->format_ = payload_policy->value ();
+ }
+ break;
+ case TAO_AV_SSRC_POLICY:
+ {
+ TAO_AV_SSRC_Policy *ssrc_policy =
+ static_cast<TAO_AV_SSRC_Policy *> (policy);
+ if (ssrc_policy == 0)
+ ACE_ERROR_RETURN ( (LM_ERROR,"TAO_AV_RTP_Object::send_frame:SSRC policy not defined\n"),-1);
+ this->ssrc_ = ssrc_policy->value ();;
+ }
+ break;
+ default:
+ break;
+ }
+ }
+
+ return 0;
+}
+
+void
+TAO_AV_RTP_Object::control_object (TAO_AV_Protocol_Object *object)
+{
+ this->control_object_ = object;
+ TAO_AV_RTCP_Object *rtcp_prot_obj = dynamic_cast<TAO_AV_RTCP_Object*> (this->control_object_);
+ rtcp_prot_obj->ssrc (this->ssrc_);
+ rtcp_prot_obj->ts_offset (this->timestamp_offset_);
+}
+
+int
+TAO_AV_RTP_Object::start (void)
+{
+ this->control_object_->start ();
+ return this->callback_->handle_start ();
+}
+
+int
+TAO_AV_RTP_Object::stop (void)
+{
+ this->control_object_->stop ();
+ return this->callback_->handle_stop ();
+}
+
+// TAO_AV_RTP_Flow_Factory
+TAO_AV_RTP_Flow_Factory::TAO_AV_RTP_Flow_Factory (void)
+{
+}
+
+TAO_AV_RTP_Flow_Factory::~TAO_AV_RTP_Flow_Factory (void)
+{
+}
+
+int
+TAO_AV_RTP_Flow_Factory::init (int /* argc */,
+ char * /* argv */ [])
+{
+ return 0;
+}
+
+TAO_AV_Protocol_Object*
+TAO_AV_RTP_Flow_Factory::make_protocol_object (TAO_FlowSpec_Entry *entry,
+ TAO_Base_StreamEndPoint *endpoint,
+ TAO_AV_Flow_Handler *handler,
+ TAO_AV_Transport *transport)
+{
+ TAO_AV_Callback *callback = 0;
+
+ if( endpoint->get_callback (entry->flowname (), callback) ) {
+ ACE_ERROR_RETURN ((LM_ERROR, "(%N,%l) Invalid callback\n"), 0);
+ }
+
+ TAO_AV_Protocol_Object *object = 0;
+ ACE_NEW_RETURN (object,
+ TAO_AV_RTP_Object (callback,
+ transport),
+ 0);
+ callback->open (object,
+ handler);
+ endpoint->set_protocol_object (entry->flowname (),
+ object);
+
+ endpoint->protocol_object_set ();
+ return object;
+}
+
+int
+TAO_AV_RTP_Flow_Factory::match_protocol (const char *flow_string)
+{
+ if (ACE_OS::strncasecmp (flow_string,"RTP",3) == 0)
+ {
+ return 1;
+ }
+ return 0;
+}
+
+const char *
+TAO_AV_RTP_Flow_Factory::control_flow_factory (void)
+{
+ return "RTCP";
+}
+
+TAO_END_VERSIONED_NAMESPACE_DECL
+
+ACE_FACTORY_DEFINE (TAO_AV, TAO_AV_RTP_Flow_Factory)
+ACE_STATIC_SVC_DEFINE (TAO_AV_RTP_Flow_Factory,
+ ACE_TEXT ("RTP_Flow_Factory"),
+ ACE_SVC_OBJ_T,
+ &ACE_SVC_NAME (TAO_AV_RTP_Flow_Factory),
+ ACE_Service_Type::DELETE_THIS |
+ ACE_Service_Type::DELETE_OBJ,
+ 0)
diff --git a/TAO/orbsvcs/orbsvcs/AV/RTP.h b/TAO/orbsvcs/orbsvcs/AV/RTP.h
new file mode 100644
index 00000000000..8cc883386a4
--- /dev/null
+++ b/TAO/orbsvcs/orbsvcs/AV/RTP.h
@@ -0,0 +1,423 @@
+// -*- C++ -*-
+
+/*-
+ * Copyright (c) 1993-1994 The Regents of the University of California.
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in the
+ * documentation and/or other materials provided with the distribution.
+ * 3. All advertising materials mentioning features or use of this software
+ * must display the following acknowledgement:
+ * This product includes software developed by the University of
+ * California, Berkeley and the Network Research Group at
+ * Lawrence Berkeley Laboratory.
+ * 4. Neither the name of the University nor of the Laboratory may be used
+ * to endorse or promote products derived from this software without
+ * specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
+ * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
+ * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+ * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+ * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGE.
+ */
+
+
+//=============================================================================
+/**
+ * @file RTP.h
+ *
+ * $Id$
+ *
+ * @author Nagarajan Surendran <naga@cs.wustl.edu>
+ */
+//=============================================================================
+
+
+#ifndef TAO_AV_RTP_H
+#define TAO_AV_RTP_H
+#include /**/ "ace/pre.h"
+
+#include "orbsvcs/AV/AV_export.h"
+#include "orbsvcs/AV/Protocol_Factory.h"
+
+#include "ace/Service_Config.h"
+
+
+#define RTP_PT_BVC 22 /* Berkeley video codec */
+
+/* RTP standard content encodings for video */
+#define RTP_PT_RGB8 23 /* 8-bit dithered RGB */
+#define RTP_PT_HDCC 24 /* SGI proprietary */
+#define RTP_PT_CELLB 25 /* Sun CellB */
+#define RTP_PT_JPEG 26 /* JPEG */
+#define RTP_PT_CUSEEME 27 /* Cornell CU-SeeMe */
+#define RTP_PT_NV 28 /* Xerox PARC nv */
+#define RTP_PT_PICW 29 /* BB&N PictureWindow */
+#define RTP_PT_CPV 30 /* Concept/Bolter/Viewpoint codec */
+#define RTP_PT_H261 31 /* ITU H.261 */
+#define RTP_PT_MPEG 32 /* MPEG-I & MPEG-II */
+#define RTP_PT_MP2T 33 /* MPEG-II either audio or video */
+
+/* backward compat hack for decoding RTPv1 ivs streams */
+#define RTP_PT_H261_COMPAT 127
+
+/* RTP standard content encodings for audio */
+#define RTP_PT_PCMU 0 /* 8k */
+#define RTP_PT_CELP 1 /* 8k */
+#define RTP_PT_G721 2 /* 8k */
+#define RTP_PT_GSM 3 /* 8k */
+#define RTP_PT_DVI 5 /* 8k */
+#define RTP_PT_LPC 7 /* 8k */
+#define RTP_PT_PCMA 8 /* 8k */
+#define RTP_PT_G722 9 /* 8k */
+#define RTP_PT_L16_STEREO 10 /* 44.1k */
+#define RTP_PT_L16_MONO 11 /* 44.1k */
+
+/* TODO: keep??
+ non-standard encodings for audio
+ */
+#define RTP_PT_L16_OTHER 23 /* */
+
+/* Offset from UNIX's epoch to the NTP epoch in seconds (NTP's JAN_1970) */
+#define RTP_EPOCH_OFFSET 2208988800UL
+#define RTP_VERSION 2
+
+#define RTP_M 0x0080 /* Marker: significant event <e.g. frame boundary> */
+#define RTP_P 0x2000 /* Padding is present */
+#define RTP_X 0x1000 /* Extension Header is present */
+
+
+#define RTCP_PT_SR 200 /* sender report */
+#define RTCP_PT_RR 201 /* receiver report */
+#define RTCP_PT_SDES 202 /* source description */
+#define RTCP_SDES_END 0 /* indicates the end of the sdes message */
+#define RTCP_SDES_CNAME 1 /* official name (mandatory) */
+#define RTCP_SDES_NAME 2 /* personal name (optional) */
+#define RTCP_SDES_EMAIL 3 /* e-mail addr (optional) */
+#define RTCP_SDES_PHONE 4 /* telephone # (optional) */
+#define RTCP_SDES_LOC 5 /* geographical location */
+#define RTCP_SDES_TOOL 6 /* name/(vers) of app */
+#define RTCP_SDES_NOTE 7 /* transient messages */
+#define RTCP_SDES_PRIV 8 /* private SDES extensions */
+#define RTCP_PT_BYE 203 /* end of participation */
+#define RTCP_PT_APP 204 /* application specific functions */
+
+#define RTCP_SDES_MIN 1
+
+#define RTP_SEQ_MOD (1<<16)
+
+
+/*
+ * Parameters controling the RTCP report rate timer.
+ */
+#define RTCP_SESSION_BW_FRACTION (0.05)
+#define RTCP_MIN_RPT_TIME (5.)
+#define RTCP_SENDER_BW_FRACTION (0.25)
+#define RTCP_RECEIVER_BW_FRACTION (1. - RTCP_SENDER_BW_FRACTION)
+#define RTCP_SIZE_GAIN (1./8.)
+
+/*
+ * Largest (user-level) packet size generated by our rtp applications.
+ * Individual video formats may use smaller mtu's.
+ */
+#define RTP_MTU 2*ACE_MAX_DGRAM_SIZE
+
+#define MAXHDR 24
+
+#include "orbsvcs/AV/Policy.h"
+#include "orbsvcs/AV/FlowSpec_Entry.h"
+#include "orbsvcs/AV/MCast.h"
+
+TAO_BEGIN_VERSIONED_NAMESPACE_DECL
+
+//------------------------------------------------------------
+// TAO_AV_RTP
+//------------------------------------------------------------
+
+/**
+ * @class TAO_AV_RTP
+ * @brief Encapsulate the Real Time Protocol (RTP) header format.
+ */
+class TAO_AV_Export TAO_AV_RTP
+{
+public:
+ /* Basic RTP header */
+ struct rtphdr
+ {
+ ACE_UINT16 rh_flags; /* T:2 P:1 X:1 CC:4 M:1 PT:7 */
+ ACE_UINT16 rh_seqno; /* sequence number */
+ ACE_UINT32 rh_ts; /* media-specific time stamp */
+ ACE_UINT32 rh_ssrc; /* synchronization src id */
+ /* data sources follow per cc */
+ };
+
+ /*
+ * Motion JPEG encapsulation.
+ *
+ * 0 1 2 3
+ * 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1
+ * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
+ * | MBZ | frag offset |
+ * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
+ * | Type | Q | Width | Height |
+ * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
+ *
+ * Type = Index into a table of predefined JPEG parameters
+ * Width = Width of input in 8-pixel blocks
+ * Height = Height of input in 8-pixel blocks
+ * Q = Quality factor (0-100 = std, >100 = custom)
+ * Frag offset = The byte offset into the frame for the data in
+ * this packet
+ */
+ struct jpeghdr
+ {
+ ACE_UINT32 off; /* fragment offset */
+ unsigned char type; /* id of jpeg decoder params */
+ unsigned char q; /* quantization factor (or table id) */
+ unsigned char width; /* 1/8 frame width */
+ unsigned char height; /* 1/8 frame height */
+ };
+
+ /*
+ * NV encapsulation.
+ */
+ struct nvhdr
+ {
+ ACE_UINT16 width;
+ ACE_UINT16 height;
+ /* nv data */
+ };
+
+ /*
+ * CellB encapsulation.
+ */
+ struct cellbhdr
+ {
+ ACE_UINT16 x;
+ ACE_UINT16 y;
+ ACE_UINT16 width;
+ ACE_UINT16 height;
+ /* cells */
+ };
+
+ /*
+ * H.261 encapsulation.
+ * See Internet draft.
+ *
+ * 0 1 2 3
+ * 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1
+ * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
+ * |SBIT |EBIT |I|V| GOBN | MBAP | QUANT | HMVD | VMVD |
+ * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
+ */
+#ifdef notdef
+ struct h261hdr
+ {
+ ACE_UINT16 flags;
+ ACE_UINT16 off;
+ };
+#endif
+
+ struct bvchdr
+ {
+ unsigned char version;
+ unsigned char pad;
+ unsigned char width;
+ unsigned char height;
+ ACE_UINT32 quant;
+ unsigned char sbit;
+ unsigned char ebit;
+ ACE_UINT16 blkno;
+ };
+
+};
+
+/**
+ * @class RTP_Packet
+ * @brief This class encapsulates all the necessary information to break down
+ * or build up an RTP data packet as well as operations to access all data
+ * items in the packet.
+ */
+class RTP_Packet
+{
+public:
+ /// Constructor for incoming RTP packets.
+ RTP_Packet(char* buffer,
+ int length);
+
+ /// Constructor for outgoing RTP packets
+ RTP_Packet(unsigned char padding,
+ unsigned char marker,
+ unsigned char payloadType,
+ ACE_UINT32 sequenceNumber,
+ ACE_UINT32 timeStamp,
+ ACE_UINT32 syncSource,
+ unsigned char contribSourcCount,
+ ACE_UINT32 contribSourceList[],
+ char *data,
+ ACE_UINT16 dataSize);
+
+ /// Destructor
+ ~RTP_Packet(void);
+
+ /// Returns the size of the RTP packet in bytes.
+ ACE_UINT16 packet_size(void);
+
+ /// Returns the size of the payload in bytes.
+ ACE_UINT16 payload_size(void);
+
+ /// Populates the passed in frame_info.
+ void get_frame_info (TAO_AV_frame_info *frame_info);
+
+ /// Returns 1 if packet is valid and 0 if not.
+ int is_valid (void);
+
+ /// Returns the RTP version of the packet.
+ unsigned int ver (void);
+
+ /// Returns 1 if the padding bit is set, 0 if not.
+ unsigned int pad (void);
+
+ /// Returns 1 if the header extension bit is set, 0 if not.
+ unsigned int ext (void);
+
+ /// Returns the number of bytes in the header extension or 0 if no extension.
+ unsigned int ext_bytes (void);
+
+ /// Returns the contributing source count.
+ /// This should only be non-zero for mixers.
+ unsigned int cc (void);
+
+ /// Returns 1 if the marker bit is set, 0 if not.
+ unsigned int mrk (void);
+
+ /// Returns the payload type of the packet.
+ unsigned int pt (void);
+
+ /// Returns the sequence number of the packet.
+ ACE_UINT16 sn (void);
+
+ /// Returns the timestamp of the packet.
+ ACE_UINT32 ts (void);
+
+ /// Returns the synchronization source id of the packet.
+ ACE_UINT32 ssrc (void);
+
+ /// Returns a pointer to the local contributing source list and its length.
+ /// This should be empty except for mixers.
+ /// RTP_Packet retains ownership.
+ void get_csrc_list (ACE_UINT32 **csrc_list, ACE_UINT16 &length);
+
+ /// Returns a pointer to the locally stored payload and its size in bytes.
+ /// The payload is returned in host byte order.
+ /// RTP_Packet retains ownership.
+ void get_payload (char **payload, ACE_UINT16 &size);
+
+ /// Returns a pointer to the locally stored rtp packet and its size in bytes.
+ /// RTP_Packet retains ownership.
+ void get_packet_data (char **packet, ACE_UINT16 &size);
+
+private:
+ /// Local buffer to hold the RTP packet.
+ char packet_[RTP_MTU];
+
+ /// Local buffer to hold the contributing source list with the values stored
+ /// in host byte order.
+ ACE_UINT32 host_byte_order_csrc_list_[15];
+
+ /// Local buffer to hold the payload with the values stored in host byte order.
+ char host_byte_order_payload_[RTP_MTU];
+
+ /// The number of bytes in the header extension - 0 if no extension.
+ unsigned int extension_bytes_;
+
+ /// The size of the overall data packet.
+ ACE_UINT16 packet_size_;
+
+ /// The size of the payload portion of the packet.
+ ACE_UINT16 payload_size_;
+};
+
+/**
+ * @class TAO_AV_RTP_Object
+ * @brief TAO_AV_Protocol_object for the RTP protocol
+ */
+class TAO_AV_Export TAO_AV_RTP_Object : public TAO_AV_Protocol_Object
+{
+public:
+ TAO_AV_RTP_Object (TAO_AV_Callback *callback,
+ TAO_AV_Transport *transport);
+
+ virtual ~TAO_AV_RTP_Object (void);
+
+ virtual int start (void);
+ virtual int stop (void);
+ virtual int handle_input (void);
+ virtual int send_frame (ACE_Message_Block *frame,
+ TAO_AV_frame_info *frame_info = 0);
+
+ virtual int send_frame (const iovec *iov,
+ int iovcnt,
+ TAO_AV_frame_info *frame_info = 0);
+
+ virtual int send_frame (const char*buf,
+ size_t len);
+
+ virtual int destroy (void);
+ virtual int set_policies (const TAO_AV_PolicyList &policy_list);
+ virtual void control_object (TAO_AV_Protocol_Object *object);
+
+protected:
+ ACE_UINT16 sequence_num_;
+ ACE_UINT32 timestamp_offset_;
+ int format_;
+ ACE_UINT32 ssrc_;
+ TAO_AV_Protocol_Object *control_object_;
+
+ /// Pre-allocated memory to receive the data...
+ ACE_Message_Block frame_;
+
+ int connection_gone_;
+};
+
+
+
+/**
+ * @class TAO_AV_RTP_Flow_Factory
+ * @brief
+ */
+class TAO_AV_Export TAO_AV_RTP_Flow_Factory : public TAO_AV_Flow_Protocol_Factory
+{
+public:
+ /// Initialization hook.
+ TAO_AV_RTP_Flow_Factory (void);
+ virtual ~TAO_AV_RTP_Flow_Factory (void);
+ virtual int init (int argc, char *argv[]);
+ virtual int match_protocol (const char *flow_string);
+ virtual TAO_AV_Protocol_Object* make_protocol_object (TAO_FlowSpec_Entry *entry,
+ TAO_Base_StreamEndPoint *endpoint,
+ TAO_AV_Flow_Handler *handler,
+ TAO_AV_Transport *transport);
+ virtual const char*control_flow_factory (void);
+};
+
+TAO_END_VERSIONED_NAMESPACE_DECL
+
+ACE_STATIC_SVC_DECLARE (TAO_AV_RTP_Flow_Factory)
+ACE_FACTORY_DECLARE (TAO_AV, TAO_AV_RTP_Flow_Factory)
+
+#include /**/ "ace/post.h"
+#endif /* TAO_AV_RTP_H */
diff --git a/TAO/orbsvcs/orbsvcs/AV/Resource_Factory.h b/TAO/orbsvcs/orbsvcs/AV/Resource_Factory.h
new file mode 100644
index 00000000000..a14a9087531
--- /dev/null
+++ b/TAO/orbsvcs/orbsvcs/AV/Resource_Factory.h
@@ -0,0 +1,54 @@
+// -*- C++ -*-
+
+//=============================================================================
+/**
+ * @file Resource_Factory.h
+ * $Id$
+ *
+ * @author Yamuna Krishnamurthy
+ */
+//=============================================================================
+
+
+#ifndef TAO_AV_DEFAULT_RESOURCE_FACTORY_H
+#define TAO_AV_DEFAULT_RESOURCE_FCATORY_H
+#include /**/ "ace/pre.h"
+
+#include "orbsvcs/AV/AVStreams_i.h"
+
+#if !defined (ACE_LACKS_PRAGMA_ONCE)
+# pragma once
+#endif /* ACE_LACKS_PRAGMA_ONCE */
+
+#include "ace/Service_Config.h"
+
+TAO_BEGIN_VERSIONED_NAMESPACE_DECL
+
+/**
+ * @class TAO_AV_Resource_Factory
+ *
+ * @brief TAO AV Streams default resource factory abstract
+ * The AV Streams resource factory loads the
+ * pluggable transport and flow protocol factories
+ * in the corresponding factory sets.
+ *
+ *
+ */
+class TAO_AV_Export TAO_AV_Resource_Factory
+: public ACE_Service_Object
+{
+public:
+
+ /**
+ * @name Service Configurator Hooks
+ */
+ //@{
+ /// Dynamic linking hook
+ virtual int init (int argc, char *argv[]) = 0;
+
+};
+
+TAO_END_VERSIONED_NAMESPACE_DECL
+
+#include /**/ "ace/post.h"
+#endif /* TAO_AV_DEFAULT_RESOURCE_FACTORY_H */
diff --git a/TAO/orbsvcs/orbsvcs/AV/SCTP_SEQ.cpp b/TAO/orbsvcs/orbsvcs/AV/SCTP_SEQ.cpp
new file mode 100644
index 00000000000..1197d709257
--- /dev/null
+++ b/TAO/orbsvcs/orbsvcs/AV/SCTP_SEQ.cpp
@@ -0,0 +1,932 @@
+// $Id$
+
+#include "orbsvcs/AV/SCTP_SEQ.h"
+
+#if defined (ACE_HAS_SCTP)
+
+#include "orbsvcs/AV/AVStreams_i.h"
+#include "ace/Multihomed_INET_Addr.h"
+#include "tao/debug.h"
+#include "ace/Arg_Shifter.h"
+
+ACE_RCSID (AV,
+ SCTP_SEQ,
+ "SCTP_SEQ.cpp,v 1.3 2003/11/05 21:06:53 yamuna Exp")
+
+TAO_BEGIN_VERSIONED_NAMESPACE_DECL
+
+//------------------------------------------------------------
+// TAO_AV_SCTP_SEQ_Transport
+//------------------------------------------------------------
+
+TAO_AV_SCTP_SEQ_Transport::TAO_AV_SCTP_SEQ_Transport (void)
+ :handler_ (0)
+{
+}
+
+TAO_AV_SCTP_SEQ_Transport::TAO_AV_SCTP_SEQ_Transport (TAO_AV_SCTP_SEQ_Flow_Handler *handler)
+ :handler_ (handler)
+{
+}
+
+TAO_AV_SCTP_SEQ_Transport::~TAO_AV_SCTP_SEQ_Transport (void)
+{
+}
+
+int
+TAO_AV_SCTP_SEQ_Transport::open (ACE_Addr * /*address*/)
+{
+ return 0;
+}
+
+int
+TAO_AV_SCTP_SEQ_Transport::close (void)
+{
+ return 0;
+}
+
+int
+TAO_AV_SCTP_SEQ_Transport::mtu (void)
+{
+ return 0;
+}
+
+ACE_Addr*
+TAO_AV_SCTP_SEQ_Transport::get_peer_addr (void)
+{
+ return 0;
+}
+
+ssize_t
+TAO_AV_SCTP_SEQ_Transport::send (const ACE_Message_Block *mblk, ACE_Time_Value *)
+{
+ // For the most part this was copied from GIOP::send_request and
+ // friends.
+
+ // ACE_Time_Value timeout;
+
+ iovec iov[ACE_IOV_MAX];
+ int iovcnt = 0;
+ ssize_t n = 0;
+ ssize_t nbytes = 0;
+
+ for (const ACE_Message_Block *i = mblk;
+ i != 0;
+ i = i->cont ())
+ {
+ // Make sure there is something to send!
+ if (i->length () > 0)
+ {
+ iov[iovcnt].iov_base = i->rd_ptr ();
+ iov[iovcnt].iov_len = static_cast<u_long> (i->length ());
+ iovcnt++;
+
+ // The buffer is full make a OS call. @@ TODO this should
+ // be optimized on a per-platform basis, for instance, some
+ // platforms do not implement writev() there we should copy
+ // the data into a buffer and call send_n(). In other cases
+ // there may be some limits on the size of the iovec, there
+ // we should set ACE_IOV_MAX to that limit.
+ if (iovcnt == ACE_IOV_MAX)
+ {
+ n = this->handler_->peer ().sendv_n ((const iovec *) iov,
+ iovcnt);
+ //&timeout);
+ if (n < 1)
+ return n;
+
+ nbytes += n;
+ iovcnt = 0;
+ }
+ }
+ }
+
+ // Check for remaining buffers to be sent!
+ if (iovcnt != 0)
+ {
+ n = this->handler_->peer ().sendv_n ((const iovec *) iov,
+ iovcnt);
+ if (n < 1)
+ return n;
+
+ nbytes += n;
+ }
+
+ return nbytes;
+}
+
+ssize_t
+TAO_AV_SCTP_SEQ_Transport::send (const char *buf,
+ size_t len,
+ ACE_Time_Value *)
+{
+ return this->handler_->peer ().send_n (buf, len);
+}
+
+ssize_t
+TAO_AV_SCTP_SEQ_Transport::send (const iovec *iov,
+ int iovcnt,
+ ACE_Time_Value *)
+{
+ return this->handler_->peer ().sendv_n (iov,
+ iovcnt);
+}
+
+ssize_t
+TAO_AV_SCTP_SEQ_Transport::recv (char *buf,
+ size_t len,
+ ACE_Time_Value *)
+{
+ return this->handler_->peer ().recv (buf, len);
+}
+
+ssize_t
+TAO_AV_SCTP_SEQ_Transport::recv (char *buf,
+ size_t len,
+ int flags,
+ ACE_Time_Value *)
+{
+ return this->handler_->peer ().recv (buf,
+ len,
+ flags);
+}
+
+ssize_t
+TAO_AV_SCTP_SEQ_Transport::recv (iovec *iov,
+ int iovcnt,
+ ACE_Time_Value *)
+{
+ return handler_->peer ().recvv_n (iov, iovcnt);
+}
+
+//------------------------------------------------------------
+// TAO_AV_SCTP_SEQ_Base_Acceptor
+//------------------------------------------------------------
+
+int
+TAO_AV_SCTP_SEQ_Base_Acceptor::acceptor_open (TAO_AV_SCTP_SEQ_Acceptor *acceptor,
+ ACE_Reactor *reactor,
+ const ACE_INET_Addr &local_addr,
+ TAO_FlowSpec_Entry *entry)
+{
+ ACE_DEBUG ((LM_DEBUG,
+ "In base acceptor open"));
+
+ this->acceptor_ = acceptor;
+ this->reactor_ = reactor;
+ this->entry_ = entry;
+
+ ACE_UINT32 local_ip_addr [entry->num_local_sec_addrs ()];
+ ACE_INET_Addr ip_addr;
+ char** addrs = entry->get_local_sec_addr ();
+ for (int i = 0; i < entry->num_local_sec_addrs (); i++)
+ {
+ ACE_CString addr_str (addrs[i]);
+ addr_str += ":";
+ ip_addr.set (addr_str.c_str ());
+ local_ip_addr [i] = ip_addr.get_ip_address ();
+ }
+
+
+ ACE_Multihomed_INET_Addr multi_addr;
+ multi_addr.set (local_addr.get_port_number (),
+ local_addr.get_ip_address (),
+ 1,
+ local_ip_addr,
+ entry->num_local_sec_addrs ());
+
+ char buf[BUFSIZ];
+ multi_addr.addr_to_string (buf,
+ BUFSIZ);
+
+ if (TAO_debug_level > 0)
+ ACE_DEBUG ((LM_DEBUG,
+ "TAO_AV_SCTP_SEQ_Base_Acceptor::open: %s",
+ buf
+ ));
+
+ int result = this->open (multi_addr,reactor);
+ if (result < 0)
+ ACE_ERROR_RETURN ((LM_ERROR,"TAO_AV_SCTP_SEQ_Base_Acceptor::open failed\n"),-1);
+
+ return 0;
+}
+
+int
+TAO_AV_SCTP_SEQ_Base_Acceptor::make_svc_handler (TAO_AV_SCTP_SEQ_Flow_Handler *&handler)
+{
+ int result = this->acceptor_->make_svc_handler (handler);
+ if (result < 0)
+ return result;
+ handler->reactor (this->reactor_);
+ this->entry_->handler (handler);
+
+ return 0;
+}
+
+//------------------------------------------------------------
+// TAO_AV_SCTP_SEQ_Acceptor
+//------------------------------------------------------------
+
+TAO_AV_SCTP_SEQ_Acceptor::TAO_AV_SCTP_SEQ_Acceptor (void)
+{
+}
+
+TAO_AV_SCTP_SEQ_Acceptor::~TAO_AV_SCTP_SEQ_Acceptor (void)
+{
+}
+
+int
+TAO_AV_SCTP_SEQ_Acceptor::make_svc_handler (TAO_AV_SCTP_SEQ_Flow_Handler *&sctp_handler)
+{
+ if (TAO_debug_level > 0)
+ ACE_DEBUG ((LM_DEBUG,
+ "TAO_AV_SCTP_SEQ_Acceptor::make_svc_handler\n"
+ ));
+
+ if (this->endpoint_ != 0)
+ {
+ ACE_NEW_RETURN (sctp_handler,
+ TAO_AV_SCTP_SEQ_Flow_Handler,
+ -1);
+
+ TAO_AV_Protocol_Object *object =
+ this->flow_protocol_factory_->make_protocol_object (this->entry_,
+ this->endpoint_,
+ sctp_handler,
+ sctp_handler->transport ());
+
+ sctp_handler->protocol_object (object);
+ this->endpoint_->set_flow_handler (this->flowname_.c_str (),sctp_handler);
+ this->entry_->protocol_object (object);
+ this->entry_->handler (sctp_handler);
+ }
+ return 0;
+}
+
+int
+TAO_AV_SCTP_SEQ_Acceptor::open (TAO_Base_StreamEndPoint *endpoint,
+ TAO_AV_Core *av_core,
+ TAO_FlowSpec_Entry *entry,
+ TAO_AV_Flow_Protocol_Factory *factory,
+ TAO_AV_Core::Flow_Component flow_comp)
+{
+ this->flow_protocol_factory_ = factory;
+
+ this->av_core_ = av_core;
+ this->endpoint_ = endpoint;
+ this->entry_ = entry;
+
+ if (flow_comp == TAO_AV_Core::TAO_AV_CONTROL)
+ this->flowname_ = TAO_AV_Core::get_control_flowname (entry->flowname ());
+ else
+ this->flowname_ = entry->flowname ();
+
+ ACE_Addr *address = entry->address ();
+
+ ACE_INET_Addr *inet_addr = (ACE_INET_Addr *) address;
+
+ char buf[BUFSIZ];
+ inet_addr->addr_to_string (buf,
+ BUFSIZ);
+
+ if (TAO_debug_level > 0)
+ ACE_DEBUG ((LM_DEBUG,
+ "TAO_AV_SCTP_SEQ_Acceptor::open: %s",
+ buf
+ ));
+
+ //Add code for reading multihomed addresses and pass the multihomed
+ //addr to the following method. ACE_Multihomed_addr derives from
+ //ACE_INET_Addr, hence this should not be an issue.
+ int result = this->acceptor_.acceptor_open (this,
+ av_core->reactor (),
+ *inet_addr,
+ entry);
+ if (result < 0)
+ ACE_ERROR_RETURN ((LM_ERROR,
+ "TAO_AV_SCTP_SEQ_Acceptor::open failed"),
+ -1);
+
+ entry->set_local_addr (address);
+ return 0;
+}
+
+int
+TAO_AV_SCTP_SEQ_Acceptor::open_default (TAO_Base_StreamEndPoint *endpoint,
+ TAO_AV_Core *av_core,
+ TAO_FlowSpec_Entry *entry,
+ TAO_AV_Flow_Protocol_Factory *factory,
+ TAO_AV_Core::Flow_Component flow_comp)
+{
+ this->flow_protocol_factory_ = factory;
+ this->av_core_ = av_core;
+ this->endpoint_ = endpoint;
+ this->entry_ = entry;
+ if (flow_comp == TAO_AV_Core::TAO_AV_CONTROL)
+ this->flowname_ = TAO_AV_Core::get_control_flowname (entry->flowname());
+ else
+ this->flowname_ = entry->flowname ();
+
+ ACE_INET_Addr *address;
+ ACE_NEW_RETURN (address,
+ ACE_INET_Addr ("0"),
+ -1);
+
+ int result = this->acceptor_.acceptor_open (this,
+ av_core->reactor (),
+ *address,
+ entry);
+
+
+ if (result < 0)
+ ACE_ERROR_RETURN ((LM_ERROR,
+ "TAO_AV_SCTP_SEQ_Acceptor::open failed"),
+ -1);
+
+ this->acceptor_.acceptor ().get_local_addr (*address);
+
+ address->set (address->get_port_number (),
+ address->get_host_name ());
+
+ char buf[BUFSIZ];
+ address->addr_to_string (buf,BUFSIZ);
+
+ if (TAO_debug_level > 0)
+ ACE_DEBUG ((LM_DEBUG,
+ "TAO_AV_SCTP_SEQ_Acceptor::open_default: %s\n",
+ buf));
+
+ entry->set_local_addr (address);
+
+ return 0;
+}
+
+
+int
+TAO_AV_SCTP_SEQ_Acceptor::close (void)
+{
+ return 0;
+}
+
+//------------------------------------------------------------
+// TAO_AV_SCTP_SEQ_Base_Connector
+//------------------------------------------------------------
+
+int
+TAO_AV_SCTP_SEQ_Base_Connector::connector_open (TAO_AV_SCTP_SEQ_Connector *connector,
+ ACE_Reactor *reactor)
+{
+ this->connector_ = connector;
+ this->reactor_ = reactor;
+
+ int result = this->open (reactor);
+ if (result < 0)
+ ACE_ERROR_RETURN ((LM_ERROR,"TAO_AV_SCTP_SEQ_Base_Connector::open failed\n"),-1);
+ return 0;
+}
+
+int
+TAO_AV_SCTP_SEQ_Base_Connector::make_svc_handler (TAO_AV_SCTP_SEQ_Flow_Handler *&sctp_handler)
+{
+ int result =
+ this->connector_->make_svc_handler (sctp_handler);
+ if (result < 0)
+ return result;
+ sctp_handler->reactor (this->reactor_);
+ return 0;
+}
+
+int
+TAO_AV_SCTP_SEQ_Base_Connector::connector_connect (TAO_AV_SCTP_SEQ_Flow_Handler *&handler,
+ const ACE_Multihomed_INET_Addr &remote_addr,
+ const ACE_Multihomed_INET_Addr &local_addr)
+{
+ int result = this->connect (handler,
+ remote_addr,
+ 0,
+ local_addr);
+
+ if (result < 0)
+ ACE_ERROR_RETURN ((LM_ERROR,"TAO_AV_SCTP_SEQ_Base_Connector::connect failed\n"),-1);
+ return 0;
+}
+
+//------------------------------------------------------------
+// TAO_AV_SCTP_SEQ_Connector
+//------------------------------------------------------------
+TAO_AV_SCTP_SEQ_Connector::TAO_AV_SCTP_SEQ_Connector (void)
+{
+}
+
+TAO_AV_SCTP_SEQ_Connector::~TAO_AV_SCTP_SEQ_Connector (void)
+{
+}
+
+int
+TAO_AV_SCTP_SEQ_Connector::make_svc_handler (TAO_AV_SCTP_SEQ_Flow_Handler *&sctp_handler)
+{
+ if (TAO_debug_level > 0)
+ ACE_DEBUG ((LM_DEBUG,"TAO_AV_SCTP_SEQ_Connector::make_svc_handler\n"));
+
+ // TAO_AV_Callback *callback = 0;
+ if (this->endpoint_ != 0)
+ {
+ // this->endpoint_->get_callback (this->flowname_.c_str (),
+ // callback);
+ ACE_NEW_RETURN (sctp_handler,
+ // TAO_AV_SCTP_SEQ_Flow_Handler (callback),
+ TAO_AV_SCTP_SEQ_Flow_Handler,
+ -1);
+ TAO_AV_Protocol_Object *object =
+ this->flow_protocol_factory_->make_protocol_object (this->entry_,
+ this->endpoint_,
+ sctp_handler,
+ sctp_handler->transport ());
+ sctp_handler->protocol_object (object);
+ // callback->protocol_object (object);
+ // this->endpoint_->set_protocol_object (this->flowname_.c_str (),
+ // object);
+ this->endpoint_->set_flow_handler (this->flowname_.c_str (),sctp_handler);
+ this->entry_->protocol_object (object);
+ this->entry_->handler (sctp_handler);
+ }
+ return 0;
+}
+
+int
+TAO_AV_SCTP_SEQ_Connector::open (TAO_Base_StreamEndPoint *endpoint,
+ TAO_AV_Core *av_core,
+ TAO_AV_Flow_Protocol_Factory *factory)
+
+{
+ this->endpoint_ = endpoint;
+ this->flow_protocol_factory_ = factory;
+ if (TAO_debug_level > 0)
+ ACE_DEBUG ((LM_DEBUG,"TAO_AV_SCTP_SEQ_Connector::open "));
+ int result = this->connector_.connector_open(this,
+ av_core->reactor ());
+ return result;
+}
+
+int
+TAO_AV_SCTP_SEQ_Connector::connect (TAO_FlowSpec_Entry *entry,
+ TAO_AV_Transport *&transport,
+ TAO_AV_Core::Flow_Component flow_comp)
+{
+ this->entry_ = entry;
+ if (flow_comp == TAO_AV_Core::TAO_AV_CONTROL)
+ this->flowname_ = TAO_AV_Core::get_control_flowname (entry->flowname ());
+ else
+ this->flowname_ = entry->flowname ();
+ ACE_Addr *remote_addr = entry->address ();
+ ACE_INET_Addr *inet_addr = dynamic_cast<ACE_INET_Addr *> (remote_addr);
+ TAO_AV_SCTP_SEQ_Flow_Handler *handler = 0;
+
+ ACE_Multihomed_INET_Addr remote_multi_addr;
+ remote_multi_addr.set (inet_addr->get_port_number (),
+ inet_addr->get_ip_address (),
+ 1,
+ 0,
+ 0);
+
+ ACE_Multihomed_INET_Addr local_addr; //This can be a multihomed address
+ ACE_INET_Addr *addr;
+ if (entry->get_peer_addr () != 0)
+ {
+ addr = dynamic_cast<ACE_INET_Addr *> (entry->get_peer_addr ());
+ }
+ else
+ {
+ ACE_NEW_RETURN (addr,
+ ACE_INET_Addr ("0"),
+ -1);
+ }
+
+ ACE_UINT32 local_ip_addr [entry->num_peer_sec_addrs ()];
+ ACE_INET_Addr ip_addr;
+ char** addrs = entry->get_peer_sec_addr ();
+ for (int i = 0; i < entry->num_peer_sec_addrs (); i++)
+ {
+ ACE_CString addr_str (addrs[i]);
+ addr_str += ":";
+ ip_addr.set (addr_str.c_str ());
+ local_ip_addr [i] = ip_addr.get_ip_address ();
+ }
+
+ if (entry->num_peer_sec_addrs () != 0)
+ local_addr.set (addr->get_port_number (),
+ addr->get_ip_address (),
+ 1,
+ local_ip_addr,
+ entry->num_peer_sec_addrs ());
+ else
+ local_addr.set (addr->get_port_number (),
+ addr->get_ip_address (),
+ 1,
+ 0,
+ entry->num_peer_sec_addrs ());
+
+
+ int result = this->connector_.connector_connect (handler,
+ remote_multi_addr,
+ local_addr);
+
+ if (result < 0)
+ ACE_ERROR_RETURN ((LM_ERROR,"TAO_AV_SCTP_SEQ_connector::connect failed\n"),-1);
+ entry->handler (handler);
+ transport = handler->transport ();
+
+ if (TAO_debug_level > 0)
+ {
+ ACE_DEBUG ((LM_DEBUG,
+ "Local Addrs\n"));
+ char buf [BUFSIZ];
+ size_t size = BUFSIZ;
+ ACE_INET_Addr *peer_addrs = 0;
+ ACE_NEW_RETURN (peer_addrs,ACE_INET_Addr [size], -1);
+ handler->peer ().get_local_addrs (peer_addrs, size);
+ for (unsigned int i=0; i < size;i++)
+ {
+ peer_addrs [i].addr_to_string (buf,
+ BUFSIZ);
+ ACE_DEBUG ((LM_DEBUG,
+ "%s %d\n",
+ buf,
+ size));
+ }
+
+ ACE_DEBUG ((LM_DEBUG,
+ "Remote Addrs\n"));
+
+ size = BUFSIZ;
+ handler->peer ().get_remote_addrs (peer_addrs, size);
+ for (unsigned int i=0; i < size;i++)
+ {
+ peer_addrs [i].addr_to_string (buf,
+ BUFSIZ);
+ ACE_DEBUG ((LM_DEBUG,
+ "%s %d\n",
+ buf,
+ size));
+ }
+ //delete peer_addrs;
+ }
+
+ return 0;
+}
+
+int
+TAO_AV_SCTP_SEQ_Connector::close (void)
+{
+ return 0;
+}
+
+//------------------------------------------------------------
+// TAO_AV_SCTP_SEQ_Protocol_Factory
+//------------------------------------------------------------
+
+
+TAO_AV_SCTP_SEQ_Factory::TAO_AV_SCTP_SEQ_Factory (void)
+{
+}
+
+TAO_AV_SCTP_SEQ_Factory::~TAO_AV_SCTP_SEQ_Factory (void)
+{
+}
+
+
+int
+TAO_AV_SCTP_SEQ_Factory::match_protocol (const char *protocol_string)
+{
+ if (ACE_OS::strcasecmp (protocol_string,"SCTP_SEQ") == 0)
+ return 1;
+ return 0;
+}
+
+TAO_AV_Acceptor*
+TAO_AV_SCTP_SEQ_Factory::make_acceptor (void)
+{
+ if (TAO_debug_level > 0)
+ ACE_DEBUG ((LM_DEBUG,"TAO_AV_SCTP_SEQ_Factory::make_acceptor\n"));
+ TAO_AV_Acceptor *acceptor = 0;
+ ACE_NEW_RETURN (acceptor,
+ TAO_AV_SCTP_SEQ_Acceptor,
+ 0);
+ return acceptor;
+}
+
+TAO_AV_Connector*
+TAO_AV_SCTP_SEQ_Factory::make_connector (void)
+{
+ if (TAO_debug_level > 0)
+ ACE_DEBUG ((LM_DEBUG,"TAO_AV_SCTP_SEQ_Factory::make_connector\n"));
+ TAO_AV_Connector *connector = 0;
+ ACE_NEW_RETURN (connector,
+ TAO_AV_SCTP_SEQ_Connector,
+ 0);
+ return connector;
+}
+
+
+int
+TAO_AV_SCTP_SEQ_Factory::init (int,
+ char *[])
+{
+
+ return 0;
+}
+
+//------------------------------------------------------------
+// TAO_AV_SCTP_SEQ_Object
+//------------------------------------------------------------
+
+int
+TAO_AV_SCTP_SEQ_Object::handle_input (void)
+{
+ int n = this->transport_->recv (this->frame_.rd_ptr (),
+ this->frame_.size ());
+ if (n == -1)
+ ACE_ERROR_RETURN ((LM_ERROR,"TAO_AV_SCTP_SEQ_Flow_Handler::handle_input recv failed\n"),-1);
+ if (n == 0)
+ ACE_ERROR_RETURN ((LM_ERROR,"TAO_AV_SCTP_SEQ_Flow_Handler::handle_input connection closed\n"),-1);
+ this->frame_.wr_ptr (this->frame_.rd_ptr () + n);
+
+ return this->callback_->receive_frame (&this->frame_);
+}
+
+int
+TAO_AV_SCTP_SEQ_Object::send_frame (ACE_Message_Block *frame,
+ TAO_AV_frame_info * /*frame_info*/)
+{
+ int result = this->transport_->send (frame);
+ return result;
+}
+
+int
+TAO_AV_SCTP_SEQ_Object::send_frame (const iovec *iov,
+ int iovcnt,
+ TAO_AV_frame_info * /*frame_info*/)
+{
+ return this->transport_->send (iov,iovcnt);
+}
+
+int
+TAO_AV_SCTP_SEQ_Object::send_frame (const char*buf,
+ size_t len)
+{
+ int result = this->transport_->send (buf, len, 0);
+ return result;
+}
+
+
+TAO_AV_SCTP_SEQ_Object::TAO_AV_SCTP_SEQ_Object (TAO_AV_Callback *callback,
+ TAO_AV_Transport *transport)
+ :TAO_AV_Protocol_Object (callback,transport)
+{
+ // @@ Is this a good size?
+ this->frame_.size (BUFSIZ);
+}
+
+TAO_AV_SCTP_SEQ_Object::~TAO_AV_SCTP_SEQ_Object (void)
+{
+ // No-op
+}
+int
+TAO_AV_SCTP_SEQ_Object::destroy (void)
+{
+ this->callback_->handle_destroy ();
+ delete this;
+ return 0;
+}
+
+//------------------------------------------------------------
+// TAO_AV_SCTP_SEQ_Flow_Handler
+//------------------------------------------------------------
+
+TAO_AV_SCTP_SEQ_Flow_Handler::TAO_AV_SCTP_SEQ_Flow_Handler (TAO_AV_Callback * /*callback*/)
+ // :TAO_AV_Flow_Handler (callback)
+{
+ ACE_NEW (this->transport_,
+ TAO_AV_SCTP_SEQ_Transport (this));
+}
+
+TAO_AV_SCTP_SEQ_Flow_Handler::~TAO_AV_SCTP_SEQ_Flow_Handler (void)
+{
+ delete this->transport_;
+}
+
+TAO_AV_Transport *
+TAO_AV_SCTP_SEQ_Flow_Handler::transport (void)
+{
+ return this->transport_;
+}
+
+int
+TAO_AV_SCTP_SEQ_Flow_Handler::change_qos (AVStreams::QoS qos)
+{
+ if( TAO_debug_level > 0 )
+ {
+ ACE_DEBUG ((LM_DEBUG,
+ "(%N,%l) TAO_AV_SCTP_SEQ_Flow_Handler::change_qos\n"));
+ }
+
+ unsigned int i=0;
+
+ int ret = 0;
+ CORBA::Long dscp = 0;
+ CORBA::Long ecn = 0;
+ int dscp_flag=0;
+ for(i=0; i < qos.QoSParams.length(); i++)
+ {
+
+ if( ACE_OS::strcmp( qos.QoSParams[i].property_name.in(), "Diffserv_Codepoint") == 0)
+ {
+ qos.QoSParams[i].property_value >>= dscp;
+ ACE_DEBUG ((LM_DEBUG,
+ "DSCP %d\n",
+ dscp));
+ dscp_flag=1;
+ // DSCP value can only be 6 bits wide
+ if(!((dscp >= 0) && (dscp <= 63)))
+ {
+ dscp_flag = 0;
+ ACE_DEBUG((LM_DEBUG, "(%N,%l) ECN value can only be (0-3) not %d\n", ecn));
+ return -1;
+ }
+ }
+
+ if( ACE_OS::strcmp( qos.QoSParams[i].property_name.in(), "ECN") == 0)
+ {
+ qos.QoSParams[i].property_value >>= ecn;
+ // ECN value can only occupy bits 6 and 7 of the
+ // IP Diffserv byte
+ if(!((ecn >= 0) && (ecn <= 3)))
+ {
+ ACE_DEBUG((LM_DEBUG, "(%N,%l) ECN value can only be (0-3) not %d\n", ecn));
+ ecn = 0;
+ }
+
+ }
+ }
+ // Set the Diffserv byte only if we specified
+ // the Diffserv Codepoint (DSCP) or ECN via QoSParams
+ // passed into this method
+ if(dscp_flag || ecn)
+ {
+ int tos;
+ tos = (int)(dscp << 2);
+ if(ecn)
+ {
+ tos |= ecn;
+ }
+ ret = this->peer ().set_option(IPPROTO_IP, IP_TOS, (int *)&tos , (int)sizeof(tos));
+
+ if(TAO_debug_level > 0)
+ {
+ ACE_DEBUG((LM_DEBUG, "(%N,%l) set tos: ret: %d %d\n", tos, ret));
+ }
+ }
+
+ if(TAO_debug_level > 0)
+ {
+ if(ret < 0 )
+ {
+ ACE_DEBUG((LM_DEBUG, "(%N,%l) errno: %p\n"));
+ }
+ }
+ return ret;
+}
+
+int
+TAO_AV_SCTP_SEQ_Flow_Handler::open (void * /*arg*/)
+{
+ ACE_CDR::Long nodelay = 1;
+
+#if defined (SCTP_NODELAY)
+ if (this->peer ().set_option (IPPROTO_SCTP,
+ SCTP_NODELAY,
+ (void *) &nodelay,
+ sizeof (nodelay)) == -1)
+ ACE_ERROR_RETURN ((LM_ERROR,
+ "NODELAY failed\n"),
+ -1);
+#endif /* SCTP_NODELAY */
+
+ // Called by the <Strategy_Acceptor> when the handler is completely
+ // connected.
+ ACE_INET_Addr addr;
+
+ if (this->peer ().get_remote_addr (addr) == -1)
+ return -1;
+
+ char server[MAXHOSTNAMELEN + 16];
+
+ (void) addr.addr_to_string (server, sizeof (server));
+
+ if (TAO_debug_level > 0)
+ if (TAO_debug_level > 0)
+ ACE_DEBUG ((LM_DEBUG,
+ "(%P|%t) connection to server <%s> on %d\n",
+ server, this->peer ().get_handle ()));
+
+ this->peer ().disable (ACE_NONBLOCK);
+
+ // Register the handler with the reactor.
+ if (this->reactor ()
+ && this->reactor ()->register_handler
+ (this,
+ ACE_Event_Handler::READ_MASK) == -1)
+ ACE_ERROR_RETURN ((LM_ERROR,
+ ACE_TEXT ("%p\n"),
+ ACE_TEXT ("unable to register client handler")),
+ -1);
+ return 0;
+}
+
+int
+TAO_AV_SCTP_SEQ_Flow_Handler::handle_input (ACE_HANDLE /*fd*/)
+{
+ return this->protocol_object_->handle_input ();
+}
+
+int
+TAO_AV_SCTP_SEQ_Flow_Handler::handle_timeout (const ACE_Time_Value &tv,
+ const void *arg)
+{
+ return TAO_AV_Flow_Handler::handle_timeout (tv,arg);
+}
+
+
+//------------------------------------------------------------
+// TAO_AV_SCTP_SEQ_Flow_Factory
+//------------------------------------------------------------
+TAO_AV_SCTP_SEQ_Flow_Factory::TAO_AV_SCTP_SEQ_Flow_Factory (void)
+{
+}
+
+TAO_AV_SCTP_SEQ_Flow_Factory::~TAO_AV_SCTP_SEQ_Flow_Factory (void)
+{
+}
+
+int
+TAO_AV_SCTP_SEQ_Flow_Factory::init (int /* argc */,
+ char * /* argv */ [])
+{
+ return 0;
+}
+
+int
+TAO_AV_SCTP_SEQ_Flow_Factory::match_protocol (const char *flow_string)
+{
+ if (ACE_OS::strcasecmp (flow_string,"SCTP_SEQ") == 0)
+ return 1;
+ return 0;
+}
+
+TAO_AV_Protocol_Object*
+TAO_AV_SCTP_SEQ_Flow_Factory::make_protocol_object (TAO_FlowSpec_Entry *entry,
+ TAO_Base_StreamEndPoint *endpoint,
+ TAO_AV_Flow_Handler *handler,
+ TAO_AV_Transport *transport)
+{
+ TAO_AV_Callback *callback = 0;
+ if( endpoint->get_callback (entry->flowname (), callback) ) {
+ ACE_ERROR_RETURN ((LM_ERROR, "(%N,%l) Invalid callback\n"), 0);
+ }
+
+ TAO_AV_SCTP_SEQ_Object *object = 0;
+ ACE_NEW_RETURN (object,
+ TAO_AV_SCTP_SEQ_Object (callback,
+ transport),
+ 0);
+ callback->open (object,
+ handler);
+ endpoint->set_protocol_object (entry->flowname (),
+ object);
+
+ endpoint->protocol_object_set ();
+ return object;
+}
+
+TAO_END_VERSIONED_NAMESPACE_DECL
+
+ACE_FACTORY_DEFINE (TAO_AV, TAO_AV_SCTP_SEQ_Flow_Factory)
+ACE_STATIC_SVC_DEFINE (TAO_AV_SCTP_SEQ_Flow_Factory,
+ ACE_TEXT ("SCTP_SEQ_Flow_Factory"),
+ ACE_SVC_OBJ_T,
+ &ACE_SVC_NAME (TAO_AV_SCTP_SEQ_Flow_Factory),
+ ACE_Service_Type::DELETE_THIS |
+ ACE_Service_Type::DELETE_OBJ,
+ 0)
+
+ACE_FACTORY_DEFINE (TAO_AV, TAO_AV_SCTP_SEQ_Factory)
+ACE_STATIC_SVC_DEFINE (TAO_AV_SCTP_SEQ_Factory,
+ ACE_TEXT ("SCTP_SEQ_Factory"),
+ ACE_SVC_OBJ_T,
+ &ACE_SVC_NAME (TAO_AV_SCTP_SEQ_Factory),
+ ACE_Service_Type::DELETE_THIS |
+ ACE_Service_Type::DELETE_OBJ,
+ 0)
+
+#endif // ACE_HAS_SCTP
diff --git a/TAO/orbsvcs/orbsvcs/AV/SCTP_SEQ.h b/TAO/orbsvcs/orbsvcs/AV/SCTP_SEQ.h
new file mode 100644
index 00000000000..4e3ec871b71
--- /dev/null
+++ b/TAO/orbsvcs/orbsvcs/AV/SCTP_SEQ.h
@@ -0,0 +1,308 @@
+// -*- C++ -*-
+
+//=============================================================================
+/**
+ * @file SCTP_SEQ.h
+ *
+ * $Id$
+ *
+ * @author Yamuna Krishnamurthy <yamuna@oomworks.com>
+ */
+//=============================================================================
+
+#ifndef TAO_AV_SCTP_SEQ_H
+#define TAO_AV_SCTP_SEQ_H
+#include /**/ "ace/pre.h"
+
+#include "ace/config-all.h"
+
+#if defined (ACE_HAS_SCTP)
+
+#include "ace/Auto_Ptr.h"
+#include "ace/Service_Config.h"
+#include "orbsvcs/AV/Protocol_Factory.h"
+#include "ace/SOCK_SEQPACK_Association.h"
+#include "ace/SOCK_SEQPACK_Acceptor.h"
+#include "ace/SOCK_SEQPACK_Connector.h"
+
+extern "C" {
+#include <netinet/sctp.h>
+};
+
+TAO_BEGIN_VERSIONED_NAMESPACE_DECL
+
+typedef ACE_Unbounded_Set <ACE_CString> Interface_Seq;
+typedef ACE_Unbounded_Set_Iterator <ACE_CString> Interface_Seq_Itor;
+
+//typedef auto_ptr <Interface_Seq> Interface_Seq_Ptr;
+typedef ACE_Hash_Map_Manager <ACE_CString,Interface_Seq,ACE_Null_Mutex> Secondary_Addr_Map;
+typedef ACE_Hash_Map_Entry <ACE_CString,Interface_Seq> Secondary_Addr_Map_Entry;
+typedef ACE_Hash_Map_Iterator <ACE_CString,Interface_Seq,ACE_Null_Mutex> Secondary_Addr_Map_Iterator;
+
+/**
+ * @class TAO_AV_SCTP_SEQ_Factory
+ */
+class TAO_AV_Export TAO_AV_SCTP_SEQ_Factory : public TAO_AV_Transport_Factory
+{
+public:
+ /// Initialization hook.
+ TAO_AV_SCTP_SEQ_Factory (void);
+ virtual ~TAO_AV_SCTP_SEQ_Factory (void);
+ virtual int init (int argc, char *argv[]);
+ virtual int match_protocol (const char *protocol_string);
+ virtual TAO_AV_Acceptor *make_acceptor (void);
+ virtual TAO_AV_Connector *make_connector (void);
+};
+
+class TAO_AV_SCTP_SEQ_Flow_Handler;
+
+/**
+ * @class TAO_AV_SCTP_SEQ_Transport
+ * @brief A transport abstraction for udp sockets.
+ * Uses the ACE_SOCK_Dgram to send the data.
+ */
+class TAO_AV_Export TAO_AV_SCTP_SEQ_Transport
+ :public TAO_AV_Transport
+{
+public:
+ TAO_AV_SCTP_SEQ_Transport (void);
+
+ TAO_AV_SCTP_SEQ_Transport (TAO_AV_SCTP_SEQ_Flow_Handler *handler);
+
+ virtual ~TAO_AV_SCTP_SEQ_Transport (void);
+ virtual int open (ACE_Addr *addr);
+
+ virtual int close (void);
+
+ virtual int mtu (void);
+
+ virtual ACE_Addr *get_peer_addr (void);
+
+ /// Write the complete Message_Block chain to the connection.
+ virtual ssize_t send (const ACE_Message_Block *mblk,
+ ACE_Time_Value *s = 0);
+
+ /// Write the contents of the buffer of length len to the connection.
+ virtual ssize_t send (const char *buf,
+ size_t len,
+ ACE_Time_Value *s = 0);
+
+ /// Write the contents of iovcnt iovec's to the connection.
+ virtual ssize_t send (const iovec *iov,
+ int iovcnt,
+ ACE_Time_Value *s = 0);
+
+ /// Read len bytes from into buf.
+ virtual ssize_t recv (char *buf,
+ size_t len,
+ ACE_Time_Value *s = 0);
+
+ /// Read len bytes from into buf using flags.
+ virtual ssize_t recv (char *buf,
+ size_t len,
+ int flags,
+ ACE_Time_Value *s = 0);
+
+ /// Read received data into the iovec buffers.
+ virtual ssize_t recv (iovec *iov,
+ int iovcnt,
+ ACE_Time_Value *s = 0);
+
+ TAO_AV_SCTP_SEQ_Flow_Handler *handler (void) { return this->handler_; }
+
+protected:
+ TAO_AV_SCTP_SEQ_Flow_Handler *handler_;
+ ACE_Addr *addr_;
+ ACE_INET_Addr peer_addr_;
+};
+
+/**
+ * @class TAO_AV_SCTP_SEQ_Flow_Handler
+ */
+class TAO_AV_SCTP_SEQ_Flow_Handler
+ :public virtual TAO_AV_Flow_Handler,
+ public ACE_Svc_Handler <ACE_SOCK_SEQPACK_ASSOCIATION, ACE_NULL_SYNCH>
+{
+public:
+ TAO_AV_SCTP_SEQ_Flow_Handler (TAO_AV_Callback *callback = 0);
+ virtual ~TAO_AV_SCTP_SEQ_Flow_Handler (void);
+ virtual TAO_AV_Transport *transport (void);
+ virtual int open (void * = 0);
+ virtual int handle_input (ACE_HANDLE fd);
+ virtual int handle_timeout (const ACE_Time_Value &tv, const void *arg = 0);
+ virtual ACE_Event_Handler* event_handler (void){ return this; }
+ /// Change the QoS
+ virtual int change_qos (AVStreams::QoS);
+
+protected:
+ TAO_AV_Core *av_core_;
+};
+
+class TAO_AV_SCTP_SEQ_Acceptor;
+
+/**
+ * @class TAO_AV_SCTP_SEQ_Base_Acceptor
+ */
+class TAO_AV_SCTP_SEQ_Base_Acceptor :public ACE_Acceptor <TAO_AV_SCTP_SEQ_Flow_Handler,ACE_SOCK_SEQPACK_ACCEPTOR>
+{
+ public:
+ virtual int acceptor_open (TAO_AV_SCTP_SEQ_Acceptor *acceptor,
+ ACE_Reactor *reactor,
+ const ACE_INET_Addr &local_addr,
+ TAO_FlowSpec_Entry *entry);
+ virtual int make_svc_handler (TAO_AV_SCTP_SEQ_Flow_Handler *& handler);
+ protected:
+ TAO_AV_SCTP_SEQ_Acceptor *acceptor_;
+ ACE_Reactor *reactor_;
+ TAO_FlowSpec_Entry *entry_;
+};
+
+/**
+ * @class TAO_AV_SCTP_SEQ_Acceptor
+ * @brief
+ */
+class TAO_AV_Export TAO_AV_SCTP_SEQ_Acceptor
+ :public TAO_AV_Acceptor
+{
+public:
+ TAO_AV_SCTP_SEQ_Acceptor (void);
+ virtual ~TAO_AV_SCTP_SEQ_Acceptor (void);
+ virtual int open (TAO_Base_StreamEndPoint *endpoint,
+ TAO_AV_Core *av_core,
+ TAO_FlowSpec_Entry *entry,
+ TAO_AV_Flow_Protocol_Factory *factory,
+ TAO_AV_Core::Flow_Component flow_comp =
+ TAO_AV_Core::TAO_AV_DATA);
+
+ virtual int open_default (TAO_Base_StreamEndPoint *endpoint,
+ TAO_AV_Core *av_core,
+ TAO_FlowSpec_Entry *entry,
+ TAO_AV_Flow_Protocol_Factory *factory,
+ TAO_AV_Core::Flow_Component flow_comp =
+ TAO_AV_Core::TAO_AV_DATA);
+
+ virtual int close (void);
+ virtual int make_svc_handler (TAO_AV_SCTP_SEQ_Flow_Handler *&handler);
+
+protected:
+ ACE_INET_Addr *address_;
+ TAO_AV_SCTP_SEQ_Base_Acceptor acceptor_;
+ TAO_Base_StreamEndPoint *endpoint_;
+ TAO_FlowSpec_Entry *entry_;
+ TAO_AV_Flow_Protocol_Factory *flow_protocol_factory_;
+};
+
+class TAO_AV_SCTP_SEQ_Connector;
+
+/**
+ * @class TAO_AV_Base_Connector
+ */
+class TAO_AV_SCTP_SEQ_Base_Connector : public ACE_Connector <TAO_AV_SCTP_SEQ_Flow_Handler,ACE_SOCK_SEQPACK_CONNECTOR>
+{
+public:
+ // To avoid warnings of open and connect hiding the base class functions these have to renamed.
+ int connector_open (TAO_AV_SCTP_SEQ_Connector *connector,
+ ACE_Reactor *reactor);
+ int connector_connect (TAO_AV_SCTP_SEQ_Flow_Handler *&handler,
+ const ACE_Multihomed_INET_Addr &remote_addr,
+ const ACE_Multihomed_INET_Addr &local_addr);
+ virtual int make_svc_handler (TAO_AV_SCTP_SEQ_Flow_Handler *& handler);
+protected:
+ TAO_AV_SCTP_SEQ_Connector *connector_;
+ ACE_Reactor *reactor_;
+};
+
+/**
+ * @class TAO_AV_SCTP_SEQ_Connector
+ * @brief
+ */
+class TAO_AV_SCTP_SEQ_Connector : public TAO_AV_Connector
+{
+public:
+ TAO_AV_SCTP_SEQ_Connector (void);
+ virtual ~TAO_AV_SCTP_SEQ_Connector (void);
+
+ virtual int open (TAO_Base_StreamEndPoint *endpoint,
+ TAO_AV_Core *av_core,
+ TAO_AV_Flow_Protocol_Factory *factory);
+
+ virtual int connect (TAO_FlowSpec_Entry *entry,
+ TAO_AV_Transport *&transport,
+ TAO_AV_Core::Flow_Component flow_comp =
+ TAO_AV_Core::TAO_AV_DATA);
+ virtual int close (void);
+ virtual int make_svc_handler (TAO_AV_SCTP_SEQ_Flow_Handler *&handler);
+protected:
+ TAO_AV_Core *av_core_;
+ TAO_AV_SCTP_SEQ_Base_Connector connector_;
+ TAO_Base_StreamEndPoint *endpoint_;
+ TAO_FlowSpec_Entry *entry_;
+ TAO_AV_Flow_Protocol_Factory *flow_protocol_factory_;
+};
+
+/**
+ * @class TAO_AV_SCTP_SEQ_Object
+ * @brief TAO_AV_Protocol_Object for the User Datagram Protocol (SCTP_SEQ)
+ */
+class TAO_AV_Export TAO_AV_SCTP_SEQ_Object : public TAO_AV_Protocol_Object
+{
+public:
+ TAO_AV_SCTP_SEQ_Object (TAO_AV_Callback *callback,
+ TAO_AV_Transport *transport = 0);
+
+ /// Dtor
+ virtual ~TAO_AV_SCTP_SEQ_Object (void);
+
+ virtual int handle_input (void);
+
+ /// send a data frame.
+ virtual int send_frame (ACE_Message_Block *frame,
+ TAO_AV_frame_info *frame_info = 0);
+
+ virtual int send_frame (const iovec *iov,
+ int iovcnt,
+ TAO_AV_frame_info *frame_info = 0);
+
+ virtual int send_frame (const char*buf,
+ size_t len);
+
+ /// end the stream.
+ virtual int destroy (void);
+
+private:
+ /// Pre-allocated memory to receive the data...
+ ACE_Message_Block frame_;
+};
+
+/**
+ * @class TAO_AV_SCTP_SEQ_Flow_Factory
+ * @brief
+ */
+class TAO_AV_Export TAO_AV_SCTP_SEQ_Flow_Factory : public TAO_AV_Flow_Protocol_Factory
+{
+public:
+ /// Initialization hook.
+ TAO_AV_SCTP_SEQ_Flow_Factory (void);
+ virtual ~TAO_AV_SCTP_SEQ_Flow_Factory (void);
+ virtual int init (int argc, char *argv[]);
+ virtual int match_protocol (const char *flow_string);
+ TAO_AV_Protocol_Object* make_protocol_object (TAO_FlowSpec_Entry *entry,
+ TAO_Base_StreamEndPoint *endpoint,
+ TAO_AV_Flow_Handler *handler,
+ TAO_AV_Transport *transport);
+};
+
+TAO_END_VERSIONED_NAMESPACE_DECL
+
+ACE_STATIC_SVC_DECLARE (TAO_AV_SCTP_SEQ_Flow_Factory)
+ACE_FACTORY_DECLARE (TAO_AV, TAO_AV_SCTP_SEQ_Flow_Factory)
+
+ACE_STATIC_SVC_DECLARE (TAO_AV_SCTP_SEQ_Factory)
+ACE_FACTORY_DECLARE (TAO_AV, TAO_AV_SCTP_SEQ_Factory)
+
+
+#endif // ACE_HAS_SCTP
+
+#include /**/ "ace/post.h"
+
+#endif /* TAO_AV_SCTP_SEQ_H */
diff --git a/TAO/orbsvcs/orbsvcs/AV/TCP.cpp b/TAO/orbsvcs/orbsvcs/AV/TCP.cpp
new file mode 100644
index 00000000000..1ed5739a2de
--- /dev/null
+++ b/TAO/orbsvcs/orbsvcs/AV/TCP.cpp
@@ -0,0 +1,721 @@
+// $Id$
+
+#include "orbsvcs/AV/TCP.h"
+#include "orbsvcs/AV/AVStreams_i.h"
+
+#include "tao/debug.h"
+#include "ace/OS_NS_strings.h"
+
+TAO_BEGIN_VERSIONED_NAMESPACE_DECL
+
+//------------------------------------------------------------
+// TAO_AV_TCP_Transport
+//------------------------------------------------------------
+
+TAO_AV_TCP_Transport::TAO_AV_TCP_Transport (void)
+ :handler_ (0)
+{
+}
+
+TAO_AV_TCP_Transport::TAO_AV_TCP_Transport (TAO_AV_TCP_Flow_Handler *handler)
+ :handler_ (handler)
+{
+}
+
+TAO_AV_TCP_Transport::~TAO_AV_TCP_Transport (void)
+{
+}
+
+int
+TAO_AV_TCP_Transport::open (ACE_Addr * /*address*/)
+{
+ return 0;
+}
+
+int
+TAO_AV_TCP_Transport::close (void)
+{
+ return 0;
+}
+
+int
+TAO_AV_TCP_Transport::mtu (void)
+{
+ return -1;
+}
+
+ACE_Addr*
+TAO_AV_TCP_Transport::get_peer_addr (void)
+{
+ return 0;
+}
+
+ssize_t
+TAO_AV_TCP_Transport::send (const ACE_Message_Block *mblk, ACE_Time_Value *)
+{
+ // For the most part this was copied from GIOP::send_request and
+ // friends.
+
+ iovec iov[ACE_IOV_MAX];
+ int iovcnt = 0;
+ ssize_t n = 0;
+ ssize_t nbytes = 0;
+
+ for (const ACE_Message_Block *i = mblk;
+ i != 0;
+ i = i->cont ())
+ {
+ // Make sure there is something to send!
+ if (i->length () > 0)
+ {
+ iov[iovcnt].iov_base = i->rd_ptr ();
+ iov[iovcnt].iov_len = static_cast<u_long> (i->length ());
+ iovcnt++;
+
+ // The buffer is full make a OS call. @@ TODO this should
+ // be optimized on a per-platform basis, for instance, some
+ // platforms do not implement writev() there we should copy
+ // the data into a buffer and call send_n(). In other cases
+ // there may be some limits on the size of the iovec, there
+ // we should set ACE_IOV_MAX to that limit.
+ if (iovcnt == ACE_IOV_MAX)
+ {
+ n = this->handler_->peer ().sendv_n ((const iovec *) iov,
+ iovcnt);
+ if (n < 1)
+ return n;
+
+ nbytes += n;
+ iovcnt = 0;
+ }
+ }
+ }
+
+ // Check for remaining buffers to be sent!
+ if (iovcnt != 0)
+ {
+ n = this->handler_->peer ().sendv_n ((const iovec *) iov,
+ iovcnt);
+ if (n < 1)
+ return n;
+
+ nbytes += n;
+ }
+
+ return nbytes;
+}
+
+ssize_t
+TAO_AV_TCP_Transport::send (const char *buf,
+ size_t len,
+ ACE_Time_Value *)
+{
+ return this->handler_->peer ().send_n (buf, len);
+}
+
+ssize_t
+TAO_AV_TCP_Transport::send (const iovec *iov,
+ int iovcnt,
+ ACE_Time_Value *)
+{
+ return this->handler_->peer ().sendv_n ((const iovec *) iov,
+ iovcnt);
+}
+
+ssize_t
+TAO_AV_TCP_Transport::recv (char *buf,
+ size_t len,
+ ACE_Time_Value *)
+{
+ return this->handler_->peer ().recv (buf, len);
+}
+
+ssize_t
+TAO_AV_TCP_Transport::recv (char *buf,
+ size_t len,
+ int flags,
+ ACE_Time_Value *)
+{
+ return this->handler_->peer ().recv (buf,
+ len,
+ flags);
+}
+
+ssize_t
+TAO_AV_TCP_Transport::recv (iovec *iov,
+ int iovcnt,
+ ACE_Time_Value *)
+{
+ return handler_->peer ().recvv_n (iov, iovcnt);
+}
+
+//------------------------------------------------------------
+// TAO_AV_TCP_Protocol_Factory
+//------------------------------------------------------------
+
+TAO_AV_TCP_Factory::TAO_AV_TCP_Factory (void)
+{
+}
+
+TAO_AV_TCP_Factory::~TAO_AV_TCP_Factory (void)
+{
+}
+
+int
+TAO_AV_TCP_Factory::init (int /* argc */,
+ char * /* argv */ [])
+{
+ return 0;
+}
+
+int
+TAO_AV_TCP_Factory::match_protocol (const char *protocol_string)
+{
+ if (ACE_OS::strcasecmp (protocol_string,"TCP") == 0)
+ return 1;
+ return 0;
+}
+
+TAO_AV_Acceptor*
+TAO_AV_TCP_Factory::make_acceptor (void)
+{
+ if (TAO_debug_level > 0) ACE_DEBUG ((LM_DEBUG,"TAO_AV_TCP_Factory::make_acceptor "));
+ TAO_AV_Acceptor *acceptor = 0;
+ ACE_NEW_RETURN (acceptor,
+ TAO_AV_TCP_Acceptor,
+ 0);
+ return acceptor;
+}
+
+TAO_AV_Connector*
+TAO_AV_TCP_Factory::make_connector (void)
+{
+ if (TAO_debug_level > 0) ACE_DEBUG ((LM_DEBUG,"TAO_AV_TCP_Factory::make_connector "));
+ TAO_AV_Connector *connector = 0;
+ ACE_NEW_RETURN (connector,
+ TAO_AV_TCP_Connector,
+ 0);
+ return connector;
+}
+
+//------------------------------------------------------------
+// TAO_AV_TCP_Object
+//------------------------------------------------------------
+
+int
+TAO_AV_TCP_Object::handle_input (void)
+{
+ int n = this->transport_->recv (this->frame_.rd_ptr (),
+ this->frame_.size ());
+ if (n == -1)
+ ACE_ERROR_RETURN ((LM_ERROR,"TAO_AV_TCP_Flow_Handler::handle_input recv failed\n"),-1);
+ if (n == 0)
+ ACE_ERROR_RETURN ((LM_ERROR,"TAO_AV_TCP_Flow_Handler::handle_input connection closed\n"),-1);
+ this->frame_.wr_ptr (this->frame_.rd_ptr () + n);
+
+ return this->callback_->receive_frame (&this->frame_);
+}
+
+int
+TAO_AV_TCP_Object::send_frame (ACE_Message_Block *frame,
+ TAO_AV_frame_info * /*frame_info*/)
+{
+ int result = this->transport_->send (frame);
+ return result;
+}
+
+int
+TAO_AV_TCP_Object::send_frame (const iovec *iov,
+ int iovcnt,
+ TAO_AV_frame_info * /*frame_info*/)
+{
+ return this->transport_->send (iov,iovcnt);
+}
+
+int
+TAO_AV_TCP_Object::send_frame (const char*buf,
+ size_t len)
+{
+ int result = this->transport_->send (buf, len, 0);
+ return result;
+}
+
+
+TAO_AV_TCP_Object::TAO_AV_TCP_Object (TAO_AV_Callback *callback,
+ TAO_AV_Transport *transport)
+ :TAO_AV_Protocol_Object (callback,transport)
+{
+ // @@ Is this a good size?
+ this->frame_.size (BUFSIZ);
+}
+
+TAO_AV_TCP_Object::~TAO_AV_TCP_Object (void)
+{
+ // No-op
+}
+int
+TAO_AV_TCP_Object::destroy (void)
+{
+ this->callback_->handle_destroy ();
+ delete this;
+ return 0;
+}
+
+//------------------------------------------------------------
+// TAO_AV_TCP_Flow_Factory
+//------------------------------------------------------------
+TAO_AV_TCP_Flow_Factory::TAO_AV_TCP_Flow_Factory (void)
+{
+}
+
+TAO_AV_TCP_Flow_Factory::~TAO_AV_TCP_Flow_Factory (void)
+{
+}
+
+int
+TAO_AV_TCP_Flow_Factory::init (int /* argc */,
+ char * /* argv */ [])
+{
+ return 0;
+}
+
+int
+TAO_AV_TCP_Flow_Factory::match_protocol (const char *flow_string)
+{
+ if (ACE_OS::strcasecmp (flow_string,"TCP") == 0)
+ return 1;
+ return 0;
+}
+
+TAO_AV_Protocol_Object*
+TAO_AV_TCP_Flow_Factory::make_protocol_object (TAO_FlowSpec_Entry *entry,
+ TAO_Base_StreamEndPoint *endpoint,
+ TAO_AV_Flow_Handler *handler,
+ TAO_AV_Transport *transport)
+{
+ TAO_AV_Callback *callback = 0;
+ if (endpoint->get_callback (entry->flowname (), callback))
+ {
+ ACE_ERROR_RETURN ((LM_ERROR, "(%N,%l) Invalid callback\n"), 0);
+ }
+
+ TAO_AV_TCP_Object *object = 0;
+ ACE_NEW_RETURN (object,
+ TAO_AV_TCP_Object (callback,
+ transport),
+ 0);
+ callback->open (object,
+ handler);
+ endpoint->set_protocol_object (entry->flowname (),
+ object);
+
+ endpoint->protocol_object_set ();
+
+ return object;
+}
+
+//------------------------------------------------------------
+// TAO_AV_TCP_Base_Connector
+//------------------------------------------------------------
+
+int
+TAO_AV_TCP_Base_Connector::connector_open (TAO_AV_TCP_Connector *connector,
+ ACE_Reactor *reactor)
+{
+ this->connector_ = connector;
+ this->reactor_ = reactor;
+
+ int result = ACE_Connector <TAO_AV_TCP_Flow_Handler,ACE_SOCK_CONNECTOR>::open (reactor);
+ if (result < 0)
+ ACE_ERROR_RETURN ((LM_ERROR,"TAO_AV_TCP_Base_Connector::open failed\n"),-1);
+ return 0;
+}
+
+int
+TAO_AV_TCP_Base_Connector::make_svc_handler (TAO_AV_TCP_Flow_Handler *&tcp_handler)
+{
+ int const result =
+ this->connector_->make_svc_handler (tcp_handler);
+ if (result < 0)
+ return result;
+ tcp_handler->reactor (this->reactor_);
+ return 0;
+}
+
+int
+TAO_AV_TCP_Base_Connector::connector_connect (TAO_AV_TCP_Flow_Handler *&handler,
+ const ACE_INET_Addr &remote_addr)
+{
+ int const result =
+ ACE_Connector <TAO_AV_TCP_Flow_Handler,ACE_SOCK_CONNECTOR>::connect (handler,
+ remote_addr);
+ if (result < 0)
+ ACE_ERROR_RETURN ((LM_ERROR,"TAO_AV_TCP_Base_Connector::connect failed\n"),-1);
+ return 0;
+}
+
+//------------------------------------------------------------
+// TAO_AV_TCP_Connector
+//------------------------------------------------------------
+TAO_AV_TCP_Connector::TAO_AV_TCP_Connector (void)
+{
+}
+
+TAO_AV_TCP_Connector::~TAO_AV_TCP_Connector (void)
+{
+}
+
+int
+TAO_AV_TCP_Connector::make_svc_handler (TAO_AV_TCP_Flow_Handler *&tcp_handler)
+{
+ if (TAO_debug_level > 0) ACE_DEBUG ((LM_DEBUG,"TAO_AV_TCP_Connector::make_svc_handler\n"));
+ // TAO_AV_Callback *callback = 0;
+ if (this->endpoint_ != 0)
+ {
+// this->endpoint_->get_callback (this->flowname_.c_str (),
+// callback);
+ ACE_NEW_RETURN (tcp_handler,
+ // TAO_AV_TCP_Flow_Handler (callback),
+ TAO_AV_TCP_Flow_Handler,
+ -1);
+ TAO_AV_Protocol_Object *object =
+ this->flow_protocol_factory_->make_protocol_object (this->entry_,
+ this->endpoint_,
+ tcp_handler,
+ tcp_handler->transport ());
+ tcp_handler->protocol_object (object);
+ // callback->protocol_object (object);
+// this->endpoint_->set_protocol_object (this->flowname_.c_str (),
+// object);
+ this->endpoint_->set_flow_handler (this->flowname_.c_str (),tcp_handler);
+ this->entry_->protocol_object (object);
+ this->entry_->handler (tcp_handler);
+ }
+ return 0;
+}
+
+int
+TAO_AV_TCP_Connector::open (TAO_Base_StreamEndPoint *endpoint,
+ TAO_AV_Core *av_core,
+ TAO_AV_Flow_Protocol_Factory *factory)
+
+{
+ this->endpoint_ = endpoint;
+ this->flow_protocol_factory_ = factory;
+ if (TAO_debug_level > 0) ACE_DEBUG ((LM_DEBUG,"TAO_AV_TCP_Connector::open "));
+ int result = this->connector_.connector_open(this,
+ av_core->reactor ());
+ return result;
+}
+
+int
+TAO_AV_TCP_Connector::connect (TAO_FlowSpec_Entry *entry,
+ TAO_AV_Transport *&transport,
+ TAO_AV_Core::Flow_Component flow_comp)
+{
+ this->entry_ = entry;
+ if (flow_comp == TAO_AV_Core::TAO_AV_CONTROL)
+ this->flowname_ = TAO_AV_Core::get_control_flowname (entry->flowname ());
+ else
+ this->flowname_ = entry->flowname ();
+ ACE_Addr *remote_addr = entry->address ();
+ ACE_INET_Addr *inet_addr = dynamic_cast<ACE_INET_Addr *> (remote_addr);
+ TAO_AV_TCP_Flow_Handler *handler = 0;
+ int result = this->connector_.connector_connect (handler,
+ *inet_addr);
+ if (result < 0)
+ ACE_ERROR_RETURN ((LM_ERROR,"TAO_AV_TCP_connector::connect failed\n"),-1);
+ entry->handler (handler);
+ transport = handler->transport ();
+ return 0;
+}
+
+int
+TAO_AV_TCP_Connector::close (void)
+{
+ return 0;
+}
+
+//------------------------------------------------------------
+// TAO_AV_TCP_Base_Connector
+//------------------------------------------------------------
+
+int
+TAO_AV_TCP_Base_Acceptor::acceptor_open (TAO_AV_TCP_Acceptor *acceptor,
+ ACE_Reactor *reactor,
+ const ACE_INET_Addr &local_addr,
+ TAO_FlowSpec_Entry *entry)
+{
+ this->acceptor_ = acceptor;
+ this->reactor_ = reactor;
+ this->entry_ = entry;
+
+ int const result =
+ ACE_Acceptor <TAO_AV_TCP_Flow_Handler,ACE_SOCK_ACCEPTOR>::open (local_addr,reactor);
+ if (result < 0)
+ ACE_ERROR_RETURN ((LM_ERROR,"TAO_AV_TCP_Base_Connector::open failed\n"),-1);
+ return 0;
+}
+
+int
+TAO_AV_TCP_Base_Acceptor::make_svc_handler (TAO_AV_TCP_Flow_Handler *&handler)
+{
+ int const result = this->acceptor_->make_svc_handler (handler);
+ if (result < 0)
+ return result;
+ handler->reactor (this->reactor_);
+ this->entry_->handler (handler);
+ return 0;
+}
+
+
+//------------------------------------------------------------
+// TAO_AV_TCP_Acceptor
+//------------------------------------------------------------
+
+TAO_AV_TCP_Acceptor::TAO_AV_TCP_Acceptor (void)
+{
+}
+
+TAO_AV_TCP_Acceptor::~TAO_AV_TCP_Acceptor (void)
+{
+}
+
+int
+TAO_AV_TCP_Acceptor::make_svc_handler (TAO_AV_TCP_Flow_Handler *&tcp_handler)
+{
+ if (TAO_debug_level > 0)
+ ACE_DEBUG ((LM_DEBUG,
+ "TAO_AV_TCP_Acceptor::make_svc_handler\n"
+ ));
+
+ if (this->endpoint_ != 0)
+ {
+ ACE_NEW_RETURN (tcp_handler,
+ TAO_AV_TCP_Flow_Handler,
+ -1);
+
+ TAO_AV_Protocol_Object *object =
+ this->flow_protocol_factory_->make_protocol_object (this->entry_,
+ this->endpoint_,
+ tcp_handler,
+ tcp_handler->transport ());
+
+ tcp_handler->protocol_object (object);
+
+ this->endpoint_->set_flow_handler (this->flowname_.c_str (),tcp_handler);
+ this->entry_->protocol_object (object);
+ this->entry_->handler (tcp_handler);
+ }
+ return 0;
+}
+
+int
+TAO_AV_TCP_Acceptor::open (TAO_Base_StreamEndPoint *endpoint,
+ TAO_AV_Core *av_core,
+ TAO_FlowSpec_Entry *entry,
+ TAO_AV_Flow_Protocol_Factory *factory,
+ TAO_AV_Core::Flow_Component flow_comp)
+{
+ this->flow_protocol_factory_ = factory;
+
+ if (TAO_debug_level > 0)
+ ACE_DEBUG ((LM_DEBUG,
+ "TAO_AV_TCP_Acceptor::open "));
+
+ this->av_core_ = av_core;
+ this->endpoint_ = endpoint;
+ this->entry_ = entry;
+ if (flow_comp == TAO_AV_Core::TAO_AV_CONTROL)
+ this->flowname_ = TAO_AV_Core::get_control_flowname (entry->flowname ());
+ else
+ this->flowname_ = entry->flowname ();
+ ACE_Addr *address = entry->address ();
+
+ ACE_INET_Addr *inet_addr = (ACE_INET_Addr *) address;
+
+ inet_addr->set (inet_addr->get_port_number (),
+ inet_addr->get_host_name ());
+
+ char buf[BUFSIZ];
+ inet_addr->addr_to_string (buf,
+ BUFSIZ);
+
+ if (TAO_debug_level > 0)
+ ACE_DEBUG ((LM_DEBUG,
+ "TAO_AV_TCP_Acceptor::open: %s",
+ buf
+ ));
+
+ int result = this->acceptor_.acceptor_open (this,
+ av_core->reactor (),
+ *inet_addr,
+ entry);
+
+ if (result < 0)
+ ACE_ERROR_RETURN ((LM_ERROR,
+ "TAO_AV_TCP_Acceptor::open failed"),
+ -1);
+
+ entry->set_local_addr (address);
+ return 0;
+}
+
+int
+TAO_AV_TCP_Acceptor::open_default (TAO_Base_StreamEndPoint *endpoint,
+ TAO_AV_Core *av_core,
+ TAO_FlowSpec_Entry *entry,
+ TAO_AV_Flow_Protocol_Factory *factory,
+ TAO_AV_Core::Flow_Component flow_comp)
+{
+ this->flow_protocol_factory_ = factory;
+ this->av_core_ = av_core;
+ this->endpoint_ = endpoint;
+ this->entry_ = entry;
+ if (flow_comp == TAO_AV_Core::TAO_AV_CONTROL)
+ this->flowname_ = TAO_AV_Core::get_control_flowname (entry->flowname());
+ else
+ this->flowname_ = entry->flowname ();
+
+ ACE_INET_Addr *address = 0;
+ ACE_NEW_RETURN (address,
+ ACE_INET_Addr ("0"),
+ -1);
+
+ int result = this->acceptor_.acceptor_open (this,
+ av_core->reactor (),
+ *address,
+ entry);
+
+
+ if (result < 0)
+ ACE_ERROR_RETURN ((LM_ERROR,
+ "TAO_AV_TCP_Acceptor::open failed"),
+ -1);
+
+ this->acceptor_.acceptor ().get_local_addr (*address);
+
+ address->set (address->get_port_number (),
+ address->get_host_name ());
+
+ char buf[BUFSIZ];
+ address->addr_to_string (buf,BUFSIZ);
+
+ if (TAO_debug_level > 0)
+ ACE_DEBUG ((LM_DEBUG,
+ "TAO_AV_TCP_Acceptor::open_default: %s\n",
+ buf));
+
+ entry->set_local_addr (address);
+
+ return 0;
+}
+
+
+int
+TAO_AV_TCP_Acceptor::close (void)
+{
+ return 0;
+}
+
+//------------------------------------------------------------
+// TAO_AV_TCP_Flow_Handler
+//------------------------------------------------------------
+
+TAO_AV_TCP_Flow_Handler::TAO_AV_TCP_Flow_Handler (TAO_AV_Callback * /*callback*/)
+ // :TAO_AV_Flow_Handler (callback)
+{
+ ACE_NEW (this->transport_,
+ TAO_AV_TCP_Transport (this));
+}
+
+TAO_AV_TCP_Flow_Handler::~TAO_AV_TCP_Flow_Handler (void)
+{
+ delete this->transport_;
+}
+
+TAO_AV_Transport *
+TAO_AV_TCP_Flow_Handler::transport (void)
+{
+ return this->transport_;
+}
+
+int
+TAO_AV_TCP_Flow_Handler::open (void * /*arg*/)
+{
+
+#if defined (TCP_NODELAY)
+ int nodelay = 1;
+
+ if (this->peer ().set_option (IPPROTO_TCP,
+ TCP_NODELAY,
+ (void *) &nodelay,
+ sizeof (nodelay)) == -1)
+ ACE_ERROR_RETURN ((LM_ERROR,
+ "NODELAY failed\n"),
+ -1);
+#endif /* TCP_NODELAY */
+
+ // Called by the <Strategy_Acceptor> when the handler is completely
+ // connected.
+ ACE_INET_Addr addr;
+
+ if (this->peer ().get_remote_addr (addr) == -1)
+ return -1;
+
+ char server[MAXHOSTNAMELEN + 16];
+
+ (void) addr.addr_to_string (server, sizeof (server));
+
+ if (TAO_debug_level > 0)
+ if (TAO_debug_level > 0) ACE_DEBUG ((LM_DEBUG,
+ "(%P|%t) connection to server <%s> on %d\n",
+ server, this->peer ().get_handle ()));
+
+ this->peer ().enable (ACE_NONBLOCK);
+ // Register the handler with the reactor.
+ if (this->reactor ()
+ && this->reactor ()->register_handler
+ (this,
+ ACE_Event_Handler::READ_MASK) == -1)
+ ACE_ERROR_RETURN ((LM_ERROR,
+ ACE_TEXT ("%p\n"),
+ ACE_TEXT ("unable to register client handler")),
+ -1);
+ return 0;
+}
+
+int
+TAO_AV_TCP_Flow_Handler::handle_input (ACE_HANDLE /*fd*/)
+{
+ return this->protocol_object_->handle_input ();
+}
+
+int
+TAO_AV_TCP_Flow_Handler::handle_timeout (const ACE_Time_Value &tv,
+ const void *arg)
+{
+ return TAO_AV_Flow_Handler::handle_timeout (tv,arg);
+}
+
+TAO_END_VERSIONED_NAMESPACE_DECL
+
+ACE_STATIC_SVC_DEFINE (TAO_AV_TCP_Flow_Factory,
+ ACE_TEXT ("TCP_Flow_Factory"),
+ ACE_SVC_OBJ_T,
+ &ACE_SVC_NAME (TAO_AV_TCP_Flow_Factory),
+ ACE_Service_Type::DELETE_THIS |
+ ACE_Service_Type::DELETE_OBJ,
+ 0)
+
+ACE_FACTORY_DEFINE (TAO_AV, TAO_AV_TCP_Flow_Factory)
+
+ACE_STATIC_SVC_DEFINE (TAO_AV_TCP_Factory,
+ ACE_TEXT ("TCP_Factory"),
+ ACE_SVC_OBJ_T,
+ &ACE_SVC_NAME (TAO_AV_TCP_Factory),
+ ACE_Service_Type::DELETE_THIS |
+ ACE_Service_Type::DELETE_OBJ,
+ 0)
+
+ACE_FACTORY_DEFINE (TAO_AV, TAO_AV_TCP_Factory)
diff --git a/TAO/orbsvcs/orbsvcs/AV/TCP.h b/TAO/orbsvcs/orbsvcs/AV/TCP.h
new file mode 100644
index 00000000000..1f51a7329be
--- /dev/null
+++ b/TAO/orbsvcs/orbsvcs/AV/TCP.h
@@ -0,0 +1,283 @@
+// -*- C++ -*-
+
+//=============================================================================
+/**
+ * @file TCP.h
+ *
+ * $Id$
+ *
+ * @author Nagarajan Surendran <naga@cs.wustl.edu>
+ */
+//=============================================================================
+
+
+#ifndef TAO_AV_TCP_H
+#define TAO_AV_TCP_H
+#include /**/ "ace/pre.h"
+
+#include "orbsvcs/AV/Protocol_Factory.h"
+#include "orbsvcs/AV/FlowSpec_Entry.h"
+
+#include "ace/Service_Config.h"
+#include "ace/Svc_Handler.h"
+
+TAO_BEGIN_VERSIONED_NAMESPACE_DECL
+
+/**
+ * @class TAO_AV_TCP_Factory
+ * @brief
+ */
+class TAO_AV_Export TAO_AV_TCP_Factory : public TAO_AV_Transport_Factory
+{
+public:
+ /// Initialization hook.
+ TAO_AV_TCP_Factory (void);
+ virtual ~TAO_AV_TCP_Factory (void);
+ virtual int init (int argc, char *argv[]);
+ virtual int match_protocol (const char *protocol_string);
+ virtual TAO_AV_Acceptor *make_acceptor (void);
+ virtual TAO_AV_Connector *make_connector (void);
+};
+
+class TAO_AV_TCP_Flow_Handler;
+
+/**
+ * @class TAO_AV_TCP_Transport
+ * @brief A transport abstraction for socket streams.
+ * Uses the ACE_SOCK_Stream to send the data.
+ */
+class TAO_AV_TCP_Transport
+ : public TAO_AV_Transport
+{
+
+public:
+ TAO_AV_TCP_Transport (void);
+
+ TAO_AV_TCP_Transport (TAO_AV_TCP_Flow_Handler *handler);
+
+ virtual ~TAO_AV_TCP_Transport (void);
+
+ virtual int open (ACE_Addr *address);
+
+ virtual int close (void);
+
+ virtual int mtu (void);
+
+ virtual ACE_Addr *get_peer_addr (void);
+
+ /// Write the complete Message_Block chain to the connection.
+ virtual ssize_t send (const ACE_Message_Block *mblk,
+ ACE_Time_Value *s = 0);
+
+ /// Write the contents of the buffer of length len to the connection.
+ virtual ssize_t send (const char *buf,
+ size_t len,
+ ACE_Time_Value *s = 0);
+
+ /// Write the contents of iovcnt iovec's to the connection.
+ virtual ssize_t send (const iovec *iov,
+ int iovcnt,
+ ACE_Time_Value *s = 0);
+
+ /// Read len bytes from into buf.
+ virtual ssize_t recv (char *buf,
+ size_t len,
+ ACE_Time_Value *s = 0);
+
+ /// Read len bytes from into buf using flags.
+ virtual ssize_t recv (char *buf,
+ size_t len,
+ int flags,
+ ACE_Time_Value *s = 0);
+
+ /// Read received data into the iovec buffers.
+ virtual ssize_t recv (iovec *iov,
+ int iovcnt,
+ ACE_Time_Value *s = 0);
+protected:
+ TAO_AV_TCP_Flow_Handler *handler_;
+};
+
+/**
+ * @class TAO_AV_TCP_Flow_Handler
+ * @brief
+ */
+class TAO_AV_TCP_Flow_Handler
+ :public virtual TAO_AV_Flow_Handler,
+ public virtual ACE_Svc_Handler <ACE_SOCK_STREAM, ACE_NULL_SYNCH>
+{
+public:
+ TAO_AV_TCP_Flow_Handler (TAO_AV_Callback *callback = 0);
+ virtual ~TAO_AV_TCP_Flow_Handler (void);
+ virtual TAO_AV_Transport *transport (void);
+ virtual int open (void * = 0);
+ virtual int handle_input (ACE_HANDLE fd);
+ virtual int handle_timeout (const ACE_Time_Value &tv, const void *arg = 0);
+ virtual ACE_Event_Handler* event_handler (void){ return this; }
+protected:
+ TAO_AV_Core *av_core_;
+};
+
+class TAO_AV_TCP_Acceptor;
+
+/**
+ * @class TAO_AV_TCP_Base_Acceptor
+ * @brief
+ */
+class TAO_AV_TCP_Base_Acceptor : public ACE_Acceptor <TAO_AV_TCP_Flow_Handler,ACE_SOCK_ACCEPTOR>
+{
+public:
+ virtual int acceptor_open (TAO_AV_TCP_Acceptor *acceptor,
+ ACE_Reactor *reactor,
+ const ACE_INET_Addr &local_addr,
+ TAO_FlowSpec_Entry *entry);
+ virtual int make_svc_handler (TAO_AV_TCP_Flow_Handler *& handler);
+protected:
+ TAO_AV_TCP_Acceptor *acceptor_;
+ ACE_Reactor *reactor_;
+ TAO_FlowSpec_Entry *entry_;
+};
+
+/**
+ * @class TAO_AV_TCP_Acceptor
+ * @brief
+ */
+class TAO_AV_TCP_Acceptor : public TAO_AV_Acceptor
+{
+public:
+ TAO_AV_TCP_Acceptor (void);
+ virtual ~TAO_AV_TCP_Acceptor (void);
+
+ virtual int open (TAO_Base_StreamEndPoint *endpoint,
+ TAO_AV_Core *av_core,
+ TAO_FlowSpec_Entry *entry,
+ TAO_AV_Flow_Protocol_Factory *factory,
+ TAO_AV_Core::Flow_Component flow_component =
+ TAO_AV_Core::TAO_AV_DATA);
+
+ virtual int open_default (TAO_Base_StreamEndPoint *endpoint,
+ TAO_AV_Core *av_core,
+ TAO_FlowSpec_Entry *entry,
+ TAO_AV_Flow_Protocol_Factory *factory,
+ TAO_AV_Core::Flow_Component flow_component =
+ TAO_AV_Core::TAO_AV_DATA);
+
+ virtual int close (void);
+ virtual int make_svc_handler (TAO_AV_TCP_Flow_Handler *&handler);
+protected:
+ TAO_AV_TCP_Base_Acceptor acceptor_;
+ TAO_FlowSpec_Entry *entry_;
+ TAO_Base_StreamEndPoint *endpoint_;
+ TAO_AV_Flow_Protocol_Factory *flow_protocol_factory_;
+};
+
+class TAO_AV_TCP_Connector;
+
+/**
+ * @class TAO_AV_Base_Connector
+ * @brief
+ */
+class TAO_AV_TCP_Base_Connector : public ACE_Connector <TAO_AV_TCP_Flow_Handler,ACE_SOCK_CONNECTOR>
+{
+public:
+ // To avoid warnings of open and connect hiding the base class functions these have to renamed.
+ int connector_open (TAO_AV_TCP_Connector *connector,
+ ACE_Reactor *reactor);
+ int connector_connect (TAO_AV_TCP_Flow_Handler *&handler,
+ const ACE_INET_Addr &remote_addr);
+ virtual int make_svc_handler (TAO_AV_TCP_Flow_Handler *& handler);
+protected:
+ TAO_AV_TCP_Connector *connector_;
+ ACE_Reactor *reactor_;
+};
+
+/**
+ * @class TAO_AV_TCP_Connector
+ * @brief
+ */
+class TAO_AV_TCP_Connector : public TAO_AV_Connector
+{
+public:
+ TAO_AV_TCP_Connector (void);
+ virtual ~TAO_AV_TCP_Connector (void);
+
+ virtual int open (TAO_Base_StreamEndPoint *endpoint,
+ TAO_AV_Core *av_core,
+ TAO_AV_Flow_Protocol_Factory *factory);
+
+ virtual int connect (TAO_FlowSpec_Entry *entry,
+ TAO_AV_Transport *&transport,
+ TAO_AV_Core::Flow_Component flow_comp =
+ TAO_AV_Core::TAO_AV_DATA);
+ virtual int close (void);
+ virtual int make_svc_handler (TAO_AV_TCP_Flow_Handler *&handler);
+protected:
+ TAO_AV_Core *av_core_;
+ TAO_AV_TCP_Base_Connector connector_;
+ TAO_Base_StreamEndPoint *endpoint_;
+ TAO_FlowSpec_Entry *entry_;
+ TAO_AV_Flow_Protocol_Factory *flow_protocol_factory_;
+};
+
+/**
+ * @class TAO_AV_TCP_Object
+ * @brief TAO_AV_Protocol_Object for Transmission Control Protocol (TCP)
+ */
+class TAO_AV_Export TAO_AV_TCP_Object : public TAO_AV_Protocol_Object
+{
+public:
+ TAO_AV_TCP_Object (TAO_AV_Callback *callback,
+ TAO_AV_Transport *transport = 0);
+
+ /// Dtor
+ virtual ~TAO_AV_TCP_Object (void);
+
+ virtual int handle_input (void);
+
+ /// send a data frame.
+ virtual int send_frame (ACE_Message_Block *frame,
+ TAO_AV_frame_info *frame_info = 0);
+
+ virtual int send_frame (const iovec *iov,
+ int iovcnt,
+ TAO_AV_frame_info *frame_info = 0);
+
+ virtual int send_frame (const char*buf,
+ size_t len);
+
+ /// end the stream.
+ virtual int destroy (void);
+
+private:
+ /// Pre-allocated memory to receive the data...
+ ACE_Message_Block frame_;
+};
+
+/**
+ * @class TAO_AV_TCP_Flow_Factory
+ * @brief
+ */
+class TAO_AV_TCP_Flow_Factory : public TAO_AV_Flow_Protocol_Factory
+{
+public:
+ /// Initialization hook.
+ TAO_AV_TCP_Flow_Factory (void);
+ virtual ~TAO_AV_TCP_Flow_Factory (void);
+ virtual int init (int argc, char *argv[]);
+ virtual int match_protocol (const char *flow_string);
+ TAO_AV_Protocol_Object* make_protocol_object (TAO_FlowSpec_Entry *entry,
+ TAO_Base_StreamEndPoint *endpoint,
+ TAO_AV_Flow_Handler *handler,
+ TAO_AV_Transport *transport);
+};
+
+TAO_END_VERSIONED_NAMESPACE_DECL
+
+ACE_STATIC_SVC_DECLARE (TAO_AV_TCP_Flow_Factory)
+ACE_FACTORY_DECLARE (TAO_AV, TAO_AV_TCP_Flow_Factory)
+
+ACE_STATIC_SVC_DECLARE (TAO_AV_TCP_Factory)
+ACE_FACTORY_DECLARE (TAO_AV, TAO_AV_TCP_Factory)
+
+#include /**/ "ace/post.h"
+#endif /* TAO_AV_TCP_H */
diff --git a/TAO/orbsvcs/orbsvcs/AV/Transport.cpp b/TAO/orbsvcs/orbsvcs/AV/Transport.cpp
new file mode 100644
index 00000000000..03047ef23e6
--- /dev/null
+++ b/TAO/orbsvcs/orbsvcs/AV/Transport.cpp
@@ -0,0 +1,682 @@
+// $Id$
+
+#include "orbsvcs/AV/AVStreams_i.h"
+#include "orbsvcs/AV/sfp.h"
+#include "orbsvcs/AV/MCast.h"
+#include "orbsvcs/AV/RTCP.h"
+#include "orbsvcs/AV/RTP.h"
+#include "orbsvcs/AV/UDP.h"
+#include "orbsvcs/AV/TCP.h"
+#include "orbsvcs/AV/FlowSpec_Entry.h"
+#include "orbsvcs/AV/AV_Core.h"
+
+#if defined (ACE_HAS_RAPI) || defined (ACE_HAS_WINSOCK2_GQOS)
+#include "orbsvcs/AV/QoS_UDP.h"
+#endif /* defined (ACE_HAS_RAPI) || defined (ACE_HAS_WINSOCK2_GQOS) */
+
+#include "tao/debug.h"
+
+#include "ace/Dynamic_Service.h"
+
+#if !defined (__ACE_INLINE__)
+#include "orbsvcs/AV/Transport.i"
+#endif /* __ACE_INLINE__ */
+
+
+TAO_BEGIN_VERSIONED_NAMESPACE_DECL
+
+//------------------------------------------------------------
+// TAO_AV_Transport_Item
+//------------------------------------------------------------
+TAO_AV_Transport_Item::TAO_AV_Transport_Item (const ACE_CString &name)
+ : name_ (name),
+ factory_ (0)
+{
+}
+
+//------------------------------------------------------------
+// TAO_AV_Transport_Item
+//------------------------------------------------------------
+TAO_AV_Flow_Protocol_Item::TAO_AV_Flow_Protocol_Item (const ACE_CString &name)
+ : name_ (name),
+ factory_ (0)
+{
+}
+
+//------------------------------------------------------------
+// TAO_AV_Connector_Registry
+//------------------------------------------------------------
+
+TAO_AV_Connector_Registry::TAO_AV_Connector_Registry (void)
+{
+}
+
+int
+TAO_AV_Connector_Registry::open (TAO_Base_StreamEndPoint *endpoint,
+ TAO_AV_Core* av_core,
+ TAO_AV_FlowSpecSet &flow_spec_set)
+{
+
+ TAO_AV_FlowSpecSetItor last_flowspec = flow_spec_set.end ();
+
+ for (TAO_AV_FlowSpecSetItor flow_spec = flow_spec_set.begin ();
+ flow_spec != last_flowspec;
+ ++flow_spec)
+ {
+ TAO_FlowSpec_Entry *entry = (*flow_spec);
+ ACE_Addr *address = entry->address ();
+ const char *flow_protocol = entry->flow_protocol_str ();
+ const char *transport_protocol = entry->carrier_protocol_str ();
+
+ if (ACE_OS::strcmp (flow_protocol,"") == 0)
+ flow_protocol = transport_protocol;
+
+ if (address == 0)
+ {
+ // Protocol was specified without an endpoint. According to
+ // the "iioploc" spec, this is valid. As such, we extend
+ // this feature to all pluggable protocols. All TAO
+ // pluggable protocols are expected to have the ability to
+ // create a default endpoint.
+
+ ACE_ERROR_RETURN ((LM_ERROR,
+ "Protocol was specified without an endpoint\n"),
+ -1);
+ }
+ else
+ {
+ TAO_AV_Flow_Protocol_Factory *flow_factory =
+ av_core->get_flow_protocol_factory (flow_protocol);
+ TAO_AV_Transport_Factory *transport_factory =
+ av_core->get_transport_factory (transport_protocol);
+
+ if ((flow_factory != 0) && (transport_factory != 0))
+ {
+ // @@Naga:Instead of making a new connector every time we should try and see if a connector exists
+ // for this transport already and hence we can reuse it.
+
+ TAO_AV_Connector *connector = transport_factory->make_connector ();
+
+ if (connector != 0)
+ {
+ // add connector to list.
+ this->connectors_.insert (connector);
+
+ if (connector->open (endpoint,
+ av_core,
+ flow_factory) == -1)
+ return -1;
+
+ TAO_AV_Transport *transport = 0;
+ if (connector->connect (entry,
+ transport,
+ TAO_AV_Core::TAO_AV_DATA) == -1)
+ return -1;
+ entry->transport (transport);
+ }
+ else
+ ACE_ERROR_RETURN ((LM_ERROR,
+ "(%P|%t) Unable to create an "
+ "connector for <%s>\n",
+ entry->flowname ()),
+ -1);
+
+ // Now see if the flow factory has a control flow factory.
+ TAO_AV_Flow_Protocol_Factory *control_flow_factory =
+ av_core->get_flow_protocol_factory(flow_factory->control_flow_factory ());
+
+ if (control_flow_factory != 0)
+ {
+ TAO_AV_Connector *control_connector =
+ transport_factory->make_connector ();
+
+ if (control_connector != 0)
+ {
+ // add connector to list.
+ this->connectors_.insert (control_connector);
+
+ if (control_connector->open (endpoint,
+ av_core,
+ control_flow_factory) == -1)
+ return -1;
+
+ TAO_AV_Transport *control_transport = 0;
+ if (control_connector->connect (entry,
+ control_transport,
+ TAO_AV_Core::TAO_AV_CONTROL) == -1)
+ return -1;
+ entry->control_transport (control_transport);
+
+ // Now set the control object on the data flow object.
+ entry->protocol_object ()->control_object (entry->control_protocol_object ());
+ }
+ else
+ ACE_ERROR_RETURN ((LM_ERROR,
+ "(%P|%t) Unable to create an "
+ "connector for <%s>\n",
+ entry->flowname ()),
+ -1);
+ }
+ }
+ }
+ }
+ return 0;
+}
+
+int
+TAO_AV_Connector_Registry::close (TAO_AV_Connector *connector)
+{
+ this->connectors_.remove (connector);
+
+ if (connector != 0)
+ delete connector;
+ return 0;
+}
+
+int
+TAO_AV_Connector_Registry::close_all (void)
+{
+ for (TAO_AV_ConnectorSetItor i = this->connectors_.begin ();
+ i != this->connectors_.end ();
+ ++i)
+ {
+ if (*i != 0)
+ continue;
+
+ (*i)->close ();
+
+ this->close (*i);
+ }
+
+ this->connectors_.reset ();
+ return 0;
+}
+
+TAO_AV_Connector_Registry::~TAO_AV_Connector_Registry (void)
+{
+ this->close_all ();
+}
+
+//------------------------------------------------------------
+// TAO_AV_Acceptor_Registry
+//------------------------------------------------------------
+
+TAO_AV_Acceptor_Registry::TAO_AV_Acceptor_Registry (void)
+{
+}
+
+TAO_AV_Acceptor_Registry::~TAO_AV_Acceptor_Registry (void)
+{
+ this->close_all();
+}
+
+int
+TAO_AV_Acceptor_Registry::open (TAO_Base_StreamEndPoint *endpoint,
+ TAO_AV_Core *av_core,
+ TAO_AV_FlowSpecSet &flow_spec_set)
+{
+ int retv = 0;
+
+ if (TAO_debug_level > 0)
+ ACE_DEBUG ((LM_DEBUG,
+ "TAO_AV_Acceptor_Registry::open \n"));
+
+ TAO_AV_FlowSpecSetItor last_flowspec
+ = flow_spec_set.end ();
+
+ for (TAO_AV_FlowSpecSetItor flow_spec = flow_spec_set.begin ();
+ flow_spec != last_flowspec;
+ ++flow_spec)
+ {
+ TAO_FlowSpec_Entry *entry = (*flow_spec);
+ ACE_Addr *address = entry->address ();
+ const char *flow_protocol = entry->flow_protocol_str ();
+ const char *transport_protocol = entry->carrier_protocol_str ();
+
+ if (ACE_OS::strcmp (flow_protocol,"") == 0)
+ flow_protocol = transport_protocol;
+
+ if (TAO_debug_level > 0) ACE_DEBUG ((LM_DEBUG,
+ "TAO_AV_Acceptor_Registry::protocol for flow %s is %s\n",
+ entry->flowname (),
+ transport_protocol));
+
+ if (address == 0)
+ {
+ retv = this->open_default (endpoint,
+ av_core,
+ entry);
+ if(retv < 0)
+ return retv;
+ continue;
+ }
+ else
+ {
+ TAO_AV_Flow_Protocol_Factory *flow_factory =
+ av_core->get_flow_protocol_factory (flow_protocol);
+
+ if (flow_protocol != 0)
+ {
+ TAO_AV_Transport_Factory *transport_factory =
+ av_core->get_transport_factory (transport_protocol);
+
+ if (transport_protocol != 0)
+ {
+ TAO_AV_Acceptor *acceptor = transport_factory->make_acceptor ();
+ if (acceptor != 0)
+ {
+ // add acceptor to list.
+ this->acceptors_.insert (acceptor);
+
+ if (acceptor->open (endpoint,
+ av_core,
+ entry,
+ flow_factory,
+ TAO_AV_Core::TAO_AV_DATA) == -1)
+ return -1;
+
+ TAO_AV_Flow_Protocol_Factory *control_flow_factory =
+ av_core->get_flow_protocol_factory (flow_factory->control_flow_factory ());
+
+ if (control_flow_factory != 0)
+ {
+ TAO_AV_Acceptor *acceptor = transport_factory->make_acceptor ();
+ if (acceptor != 0)
+ {
+ if (acceptor->open (endpoint,
+ av_core,
+ entry,
+ control_flow_factory,
+ TAO_AV_Core::TAO_AV_CONTROL) == -1)
+ return -1;
+ // add acceptor to list.
+ this->acceptors_.insert (acceptor);
+
+ entry->protocol_object ()->control_object (entry->control_protocol_object ());
+
+ }
+ else
+ ACE_ERROR_RETURN ((LM_ERROR,
+ "(%P|%t) Unable to create an "
+ "acceptor for <%s>\n",
+ entry->flowname ()),
+ -1);
+ }
+ }
+ else
+ ACE_ERROR_RETURN ((LM_ERROR,
+ "(%P|%t) Unable to create an "
+ "acceptor for <%s>\n",
+ entry->flowname ()),
+ -1);
+ }
+ }
+ }
+ }
+ return 0;
+}
+
+int
+TAO_AV_Acceptor_Registry::open_default (TAO_Base_StreamEndPoint *endpoint,
+ TAO_AV_Core *av_core,
+ TAO_FlowSpec_Entry *entry)
+{
+ if (TAO_debug_level > 0)
+ ACE_DEBUG ((LM_DEBUG,
+ "TAO_AV_Acceptor_Registry::open_default "));
+
+ // No endpoints were specified, we let each protocol pick its own
+ // default...
+
+ const char *flow_protocol = entry->flow_protocol_str ();
+ const char *transport_protocol = entry->carrier_protocol_str ();
+
+ if (ACE_OS::strcmp (flow_protocol,"") == 0)
+ flow_protocol = transport_protocol;
+
+ TAO_AV_Flow_Protocol_Factory *flow_factory =
+ av_core->get_flow_protocol_factory (flow_protocol);
+
+ // No matching flow protocol.
+ if (flow_factory == 0)
+ ACE_ERROR_RETURN ((LM_ERROR,
+ "TAO (%P|%t) (%N,%l) Unable to match protocol prefix "
+ "for <%s>\n",
+ flow_protocol),
+ -1);
+
+ if (TAO_debug_level > 0)
+ ACE_DEBUG((LM_DEBUG, "(%N,%l) Matched flow_protocol: %s, Looking for transport protocol: %s\n", flow_protocol, transport_protocol));
+
+ TAO_AV_Transport_Factory *transport_factory =
+ av_core->get_transport_factory (transport_protocol);
+
+ if (transport_factory == 0)
+ ACE_ERROR_RETURN ((LM_ERROR,
+ "TAO (%P|%t) (%N,%l) Unable to match protocol prefix "
+ "for <%s>\n",
+ transport_protocol),
+ -1);
+
+ // make an acceptor
+ TAO_AV_Acceptor *acceptor =
+ transport_factory->make_acceptor();
+
+ if (acceptor == 0)
+ ACE_ERROR_RETURN ((LM_ERROR,
+ "TAO (%P|%t) unable to create "
+ "an acceptor for <%d>\n",
+ transport_protocol),
+ -1);
+
+ if (acceptor->open_default (endpoint,
+ av_core,
+ entry,
+ flow_factory,
+ TAO_AV_Core::TAO_AV_DATA) == -1)
+ ACE_ERROR_RETURN ((LM_ERROR,
+ "TAO (%P|%t) unable to open "
+ "default acceptor for <%s>%p\n",
+ flow_protocol),
+ -1);
+
+ this->acceptors_.insert (acceptor);
+
+ const char *control_flow_factory_name = flow_factory->control_flow_factory ();
+
+ if (control_flow_factory_name != 0)
+ {
+
+ TAO_AV_Flow_Protocol_Factory *control_flow_factory =
+ av_core->get_flow_protocol_factory (control_flow_factory_name);
+
+ if (control_flow_factory == 0)
+ ACE_ERROR_RETURN ((LM_ERROR,
+ "TAO (%P|%t) Unable to match control flow "
+ "for <%s>\n",
+ control_flow_factory_name),
+ -1);
+
+ TAO_AV_Acceptor *control_acceptor = transport_factory->make_acceptor ();
+
+ if (control_acceptor == 0)
+ ACE_ERROR_RETURN ((LM_ERROR,
+ "TAO (%P|%t) unable to create "
+ "an acceptor for <%d>\n",
+ transport_protocol),
+ -1);
+
+ if (control_acceptor->open_default (endpoint,
+ av_core,
+ entry,
+ control_flow_factory,
+ TAO_AV_Core::TAO_AV_CONTROL) == -1)
+ ACE_ERROR_RETURN ((LM_ERROR,
+ "TAO (%P|%t) unable to open "
+ "default acceptor for <%s>%p\n",
+ transport_protocol),
+ -1);
+
+ this->acceptors_.insert (control_acceptor);
+
+ entry->protocol_object ()->control_object (entry->control_protocol_object ());
+ }
+
+ if (this->acceptors_.size () == 0)
+ {
+ if (TAO_debug_level > 0)
+ ACE_ERROR ((LM_ERROR,
+ "TAO (%P%t) cannot create any default acceptor\n"));
+ return -1;
+ }
+
+ return 0;
+}
+
+int
+TAO_AV_Acceptor_Registry::close (TAO_AV_Acceptor *acceptor)
+{
+ this->acceptors_.remove (acceptor);
+ delete acceptor;
+
+ return 0;
+}
+
+int
+TAO_AV_Acceptor_Registry::close_all (void)
+{
+ for (TAO_AV_AcceptorSetItor i = this->acceptors_.begin ();
+ i != this->acceptors_.end ();
+ ++i)
+ {
+ if (*i == 0)
+ continue;
+
+ (*i)->close ();
+
+ delete *i;
+ }
+
+ this->acceptors_.reset ();
+ return 0;
+}
+
+//----------------------------------------------------------------------
+// TAO_AV_Transport
+//----------------------------------------------------------------------
+
+TAO_AV_Transport::TAO_AV_Transport (void)
+{
+}
+
+// Virtual destructor.
+TAO_AV_Transport::~TAO_AV_Transport (void)
+{
+}
+
+ACE_Addr*
+TAO_AV_Transport::get_local_addr (void)
+{
+ return 0;
+}
+
+//----------------------------------------------------------------------
+// TAO_AV_Flow_Handler
+//----------------------------------------------------------------------
+
+//TAO_AV_Flow_Handler::TAO_AV_Flow_Handler (TAO_AV_Callback *callback)
+TAO_AV_Flow_Handler::TAO_AV_Flow_Handler (void)
+ :transport_ (0),
+ callback_ (0),
+ protocol_object_ (0),
+ timer_id_ (-1)
+{
+}
+
+TAO_AV_Flow_Handler::~TAO_AV_Flow_Handler(void)
+{
+ // cancel the timer (if there is one)
+ this->cancel_timer();
+}
+
+int
+TAO_AV_Flow_Handler::set_remote_address (ACE_Addr * /* address */)
+{
+ return 0;
+}
+
+int
+TAO_AV_Flow_Handler::start (TAO_FlowSpec_Entry::Role role)
+{
+ this->callback_->handle_start ();
+ switch (role)
+ {
+ // only for producer we register for the timeout.
+ case TAO_FlowSpec_Entry::TAO_AV_PRODUCER:
+ {
+ this->schedule_timer ();
+ }
+ break;
+ default:
+ break;
+ }
+ return 0;
+}
+
+int
+TAO_AV_Flow_Handler::schedule_timer (void)
+{
+ ACE_Event_Handler *event_handler = this->event_handler ();
+ ACE_Time_Value *tv = 0;
+
+ this->callback_->get_timeout (tv, this->timeout_arg_);
+ if (tv == 0)
+ return 0;
+
+ this->timer_id_ =
+ TAO_AV_CORE::instance()->reactor ()->schedule_timer (event_handler,
+ 0,
+ *tv);
+
+ if (this->timer_id_ < 0)
+ return -1;
+
+ return 0;
+}
+
+
+int
+TAO_AV_Flow_Handler::cancel_timer (void)
+{
+ if (this->timer_id_ != -1)
+ return TAO_AV_CORE::instance()->reactor ()->cancel_timer (this->timer_id_);
+ else
+ return 0;
+}
+
+
+int
+TAO_AV_Flow_Handler::stop (TAO_FlowSpec_Entry::Role role)
+{
+ this->callback_->handle_stop ();
+ switch (role)
+ {
+ case TAO_FlowSpec_Entry::TAO_AV_PRODUCER:
+ {
+ int result = this->event_handler ()->reactor ()->cancel_timer (this->timer_id_);
+ if (result < 0)
+ if (TAO_debug_level > 0) ACE_DEBUG ((LM_DEBUG,"TAO_AV_Flow_Handler::stop:cancel_timer failed\n"));
+ }
+ break;
+ default:
+ break;
+ }
+ return 0;
+}
+
+int
+TAO_AV_Flow_Handler::handle_timeout (const ACE_Time_Value & /*tv*/,
+ const void * /*arg*/)
+{
+ int result = this->callback_->handle_timeout (this->timeout_arg_);
+ if (result < 0)
+ return result;
+ ACE_Event_Handler *event_handler = this->event_handler ();
+ ACE_Time_Value *timeout = 0;
+
+ this->callback_->get_timeout (timeout, this->timeout_arg_);
+ if (timeout == 0)
+ return 0;
+
+ this->timer_id_ = event_handler->reactor ()->schedule_timer (event_handler,
+ 0,
+ *timeout);
+
+ if (this->timer_id_ < 0)
+ return -1;
+
+ return 0;
+}
+
+int
+TAO_AV_Flow_Handler::change_qos (AVStreams::QoS)
+{
+ return 0;
+}
+
+TAO_AV_Transport*
+TAO_AV_Flow_Handler::transport (void)
+{
+ return this->transport_;
+}
+
+void
+TAO_AV_Flow_Handler::protocol_object (TAO_AV_Protocol_Object *protocol_object)
+{
+ this->protocol_object_ = protocol_object;
+}
+
+TAO_AV_Protocol_Object*
+TAO_AV_Flow_Handler::protocol_object (void)
+{
+ return this->protocol_object_;
+}
+
+void
+TAO_AV_Flow_Handler::callback (TAO_AV_Callback *callback)
+{
+ this->callback_ = callback;
+}
+
+// TAO_AV_Connector
+TAO_AV_Connector::TAO_AV_Connector (void)
+{
+}
+
+TAO_AV_Connector::~TAO_AV_Connector (void)
+{
+}
+
+// TAO_AV_Acceptor
+TAO_AV_Acceptor::TAO_AV_Acceptor (void)
+{
+}
+
+TAO_AV_Acceptor::~TAO_AV_Acceptor (void)
+{
+}
+
+TAO_AV_Transport_Factory::TAO_AV_Transport_Factory (void)
+{
+}
+
+TAO_AV_Transport_Factory::~TAO_AV_Transport_Factory (void)
+{
+}
+
+int
+TAO_AV_Transport_Factory::init (int /* argc */,
+ char * /* argv */ [])
+{
+ return -1;
+}
+
+int
+TAO_AV_Transport_Factory::match_protocol (const char * /* protocol_string */)
+{
+ return 0;
+}
+
+TAO_AV_Acceptor *
+TAO_AV_Transport_Factory::make_acceptor (void)
+{
+ return 0;
+}
+
+TAO_AV_Connector *
+TAO_AV_Transport_Factory::make_connector (void)
+{
+ return 0;
+}
+
+TAO_END_VERSIONED_NAMESPACE_DECL
diff --git a/TAO/orbsvcs/orbsvcs/AV/Transport.h b/TAO/orbsvcs/orbsvcs/AV/Transport.h
new file mode 100644
index 00000000000..e494a20b9d4
--- /dev/null
+++ b/TAO/orbsvcs/orbsvcs/AV/Transport.h
@@ -0,0 +1,345 @@
+// -*- C++ -*-
+
+//=============================================================================
+/**
+ * @file Transport.h
+ *
+ * $Id$
+ *
+ * @author Nagarajan Surendran <naga@cs.wustl.edu>
+ */
+//=============================================================================
+
+
+#ifndef TAO_AV_TRANSPORT_H
+#define TAO_AV_TRANSPORT_H
+#include /**/ "ace/pre.h"
+
+
+#include "orbsvcs/AV/FlowSpec_Entry.h"
+#include "orbsvcs/AV/AV_Core.h"
+
+#include "orbsvcs/AV/AV_export.h"
+
+#include "ace/Service_Object.h"
+#include "ace/Acceptor.h"
+#include "ace/SOCK_Acceptor.h"
+#include "ace/SOCK_Connector.h"
+#include "ace/Connector.h"
+#include "ace/Addr.h"
+#include "ace/SOCK_Dgram.h"
+
+
+TAO_BEGIN_VERSIONED_NAMESPACE_DECL
+
+// Forward declarations.
+class TAO_AV_Core;
+class TAO_AV_Transport_Factory;
+class TAO_AV_Protocol_Object;
+class TAO_AV_Callback;
+class TAO_AV_Transport;
+
+/**
+ * @class TAO_AV_Transport_Item
+ * @brief
+ */
+class TAO_AV_Export TAO_AV_Transport_Item
+{
+public:
+ /// creator method, the Transport name can only be set when the
+ /// object is created.
+ TAO_AV_Transport_Item (const ACE_CString &name);
+
+ /// return a reference to the character representation of the Transport
+ /// factories name.
+ const ACE_CString &name (void);
+
+ /// return a pointer to the Transport factory.
+ TAO_AV_Transport_Factory *factory (void);
+
+ /// set the factory pointer's valus.
+ void factory (TAO_AV_Transport_Factory *factory);
+
+private:
+ /// Transport factory name.
+ ACE_CString name_;
+
+ /// pointer to factory object.
+ TAO_AV_Transport_Factory *factory_;
+};
+
+
+
+
+class TAO_AV_Flow_Protocol_Factory;
+
+/**
+ * @class TAO_AV_Flow_Protocol_Item
+ * @brief
+ */
+class TAO_AV_Export TAO_AV_Flow_Protocol_Item
+{
+public:
+ /// creator method, the Flow_Protocol name can only be set when the
+ /// object is created.
+ TAO_AV_Flow_Protocol_Item (const ACE_CString &name);
+
+ /// return a reference to the character representation of the Flow_Protocol
+ /// factories name.
+ const ACE_CString &name (void);
+
+ /// return a pointer to the Flow_Protocol factory.
+ TAO_AV_Flow_Protocol_Factory *factory (void);
+
+ /// set the factory pointer's valus.
+ void factory (TAO_AV_Flow_Protocol_Factory *factory);
+
+private:
+ /// Flow_Protocol factory name.
+ ACE_CString name_;
+
+ /// pointer to factory object.
+ TAO_AV_Flow_Protocol_Factory *factory_;
+};
+
+
+/**
+ * @class TAO_AV_Flow_Handler
+ * @brief
+ */
+class TAO_AV_Export TAO_AV_Flow_Handler
+{
+public:
+ /// Constructor.
+ TAO_AV_Flow_Handler (void);
+
+ virtual ~TAO_AV_Flow_Handler (void);
+ /// Start/stop the flow handler.
+ virtual int start (TAO_FlowSpec_Entry::Role role);
+ virtual int stop (TAO_FlowSpec_Entry::Role role);
+
+ /// Schedule timer. Uses the get_timeout method on the callback.
+ virtual int schedule_timer (void);
+ virtual int cancel_timer (void);
+
+ /// get the transport.
+ TAO_AV_Transport *transport (void);
+
+ /// set/get protocol_object.
+ TAO_AV_Protocol_Object* protocol_object (void);
+ void protocol_object (TAO_AV_Protocol_Object *protocol_object);
+
+ /// set the callback.
+ void callback (TAO_AV_Callback *callback);
+
+ /// Handle timeout. called from reactor.
+ virtual int handle_timeout (const ACE_Time_Value &tv, const void *arg = 0);
+
+ /// set the remote address.
+ virtual int set_remote_address (ACE_Addr *address);
+
+ /// get the underlying event handler. To be overridden by the derived clases.
+ virtual ACE_Event_Handler* event_handler (void) = 0;
+
+ virtual int change_qos (AVStreams::QoS);
+
+protected:
+ TAO_AV_Transport *transport_;
+ TAO_AV_Callback *callback_;
+ TAO_AV_Protocol_Object *protocol_object_;
+ long timer_id_;
+ ACE_Reactor *reactor_;
+ void *timeout_arg_;
+};
+
+// Transports
+/**
+ * @class TAO_AV_Transport
+ * @brief A Base class for the different transport protocols.
+ * All the different transports should derive and implement
+ * the open,close,send and recv methods.
+ */
+class TAO_AV_Export TAO_AV_Transport
+{
+public:
+ TAO_AV_Transport (void);
+
+ virtual ~TAO_AV_Transport (void);
+
+ virtual int open (ACE_Addr *address) = 0;
+
+ virtual int close (void) = 0;
+
+ /// Write the complete Message_Block chain to the connection.
+ virtual int mtu (void) = 0;
+ virtual ACE_Addr *get_peer_addr (void) = 0;
+ virtual ACE_Addr *get_local_addr (void);
+ virtual ssize_t send (const ACE_Message_Block *mblk,
+ ACE_Time_Value *s = 0) = 0;
+
+ /// Write the contents of the buffer of length len to the connection.
+ virtual ssize_t send (const char *buf,
+ size_t len,
+ ACE_Time_Value *s = 0) = 0;
+
+ /// Write the contents of iovcnt iovec's to the connection.
+ virtual ssize_t send (const iovec *iov,
+ int iovcnt,
+ ACE_Time_Value *s = 0) = 0;
+
+ /// Read len bytes from into buf.
+ virtual ssize_t recv (char *buf,
+ size_t len,
+ ACE_Time_Value *s = 0) = 0;
+
+ /// Read len bytes from into buf using flags.
+ virtual ssize_t recv (char *buf,
+ size_t len,
+ int flags,
+ ACE_Time_Value *s = 0) = 0;
+
+ /// Read received data into the iovec buffers.
+ virtual ssize_t recv (iovec *iov,
+ int iovcnt,
+ ACE_Time_Value *s = 0) = 0;
+
+};
+
+class TAO_Base_StreamEndPoint;
+class TAO_AV_Core;
+class TAO_FlowSpec_Entry;
+
+/**
+ * @class TAO_AV_Acceptor
+ * @brief
+ */
+class TAO_AV_Export TAO_AV_Acceptor
+{
+public:
+ TAO_AV_Acceptor (void);
+ virtual ~TAO_AV_Acceptor (void);
+ virtual int open (TAO_Base_StreamEndPoint *endpoint,
+ TAO_AV_Core *av_core,
+ TAO_FlowSpec_Entry *entry,
+ TAO_AV_Flow_Protocol_Factory *factory,
+ TAO_AV_Core::Flow_Component flow_comp) = 0;
+
+ virtual int open_default (TAO_Base_StreamEndPoint *endpoint,
+ TAO_AV_Core *av_core,
+ TAO_FlowSpec_Entry *entry,
+ TAO_AV_Flow_Protocol_Factory *factory,
+ TAO_AV_Core::Flow_Component flow_comp) = 0;
+
+ const char *flowname ();
+ virtual int close (void) = 0;
+protected:
+ ACE_CString flowname_;
+ TAO_AV_Core *av_core_;
+ ACE_Addr *address_;
+};
+
+/**
+ * @class TAO_AV_Connector
+ * @brief
+ */
+class TAO_AV_Export TAO_AV_Connector
+{
+public:
+ TAO_AV_Connector (void);
+ virtual ~TAO_AV_Connector (void);
+ const char *flowname (void);
+
+ virtual int open (TAO_Base_StreamEndPoint *endpoint,
+ TAO_AV_Core *av_core,
+ TAO_AV_Flow_Protocol_Factory *factory) = 0;
+
+ virtual int connect (TAO_FlowSpec_Entry *entry,
+ TAO_AV_Transport *&transport,
+ TAO_AV_Core::Flow_Component flow_component) = 0;
+
+ virtual int close (void) = 0;
+protected:
+ ACE_CString flowname_;
+};
+
+
+typedef ACE_Unbounded_Set<TAO_AV_Connector*> TAO_AV_ConnectorSet;
+typedef ACE_Unbounded_Set_Iterator<TAO_AV_Connector*> TAO_AV_ConnectorSetItor;
+
+/**
+ * @class TAO_AV_Connector_Registry
+ * @brief
+ */
+class TAO_AV_Export TAO_AV_Connector_Registry
+{
+public:
+ /**
+ * int connect (TAO_FlowSpec_Entry *flowspec,
+ * TAO_AV_Transport *&transport);
+ * TAO_AV_Connector *get_connector (TAO_AV_Core::Protocol protocol);
+ * Return the connector bridges
+ */
+ TAO_AV_Connector_Registry (void);
+ ~TAO_AV_Connector_Registry (void);
+ int open (TAO_Base_StreamEndPoint *endpoint,
+ TAO_AV_Core *av_core,
+ TAO_AV_FlowSpecSet &flow_spec_set);
+ int close (TAO_AV_Connector *connector);
+ int close_all (void);
+ TAO_AV_ConnectorSetItor begin (void);
+ TAO_AV_ConnectorSetItor end (void);
+protected:
+ TAO_AV_ConnectorSet connectors_;
+};
+
+typedef ACE_Unbounded_Set<TAO_AV_Acceptor*> TAO_AV_AcceptorSet;
+typedef ACE_Unbounded_Set_Iterator<TAO_AV_Acceptor*> TAO_AV_AcceptorSetItor;
+
+/**
+ * @class TAO_AV_Acceptor_Registry
+ * @brief
+ */
+class TAO_AV_Export TAO_AV_Acceptor_Registry
+{
+public:
+ TAO_AV_Acceptor_Registry (void);
+ ~TAO_AV_Acceptor_Registry (void);
+ int open (TAO_Base_StreamEndPoint *endpoint,
+ TAO_AV_Core *av_core,
+ TAO_AV_FlowSpecSet &flow_spec_set);
+ int close (TAO_AV_Acceptor *acceptor);
+ int close_all (void);
+ TAO_AV_AcceptorSetItor begin (void);
+ TAO_AV_AcceptorSetItor end (void);
+protected:
+ int open_default (TAO_Base_StreamEndPoint *endpoint,
+ TAO_AV_Core *av_core,
+ TAO_FlowSpec_Entry *entry);
+ TAO_AV_AcceptorSet acceptors_;
+};
+
+/**
+ * @class TAO_AV_Transport_Factory
+ * @brief
+ */
+class TAO_AV_Export TAO_AV_Transport_Factory : public ACE_Service_Object
+{
+public:
+ /// Initialization hook.
+ TAO_AV_Transport_Factory (void);
+ virtual ~TAO_AV_Transport_Factory (void);
+ virtual int init (int argc, char *argv[]);
+ virtual int match_protocol (const char *protocol_string);
+ virtual TAO_AV_Acceptor *make_acceptor (void);
+ virtual TAO_AV_Connector *make_connector (void);
+ int ref_count;
+};
+
+TAO_END_VERSIONED_NAMESPACE_DECL
+
+#if defined (__ACE_INLINE__)
+#include "orbsvcs/AV/Transport.i"
+#endif /* __ACE_INLINE__ */
+
+#include /**/ "ace/post.h"
+#endif /* TAO_AV_TRANSPORT_H */
diff --git a/TAO/orbsvcs/orbsvcs/AV/Transport.i b/TAO/orbsvcs/orbsvcs/AV/Transport.i
new file mode 100644
index 00000000000..c05c2474e2b
--- /dev/null
+++ b/TAO/orbsvcs/orbsvcs/AV/Transport.i
@@ -0,0 +1,111 @@
+// -*- C++ -*-
+//
+// $Id$
+
+TAO_BEGIN_VERSIONED_NAMESPACE_DECL
+
+//------------------------------------------------------------
+// TAO_AV_Transport_Item
+//------------------------------------------------------------
+ACE_INLINE
+const ACE_CString &
+TAO_AV_Transport_Item::name (void)
+{
+ return this->name_;
+}
+
+ACE_INLINE
+TAO_AV_Transport_Factory *
+TAO_AV_Transport_Item::factory (void)
+{
+ return this->factory_;
+}
+
+ACE_INLINE
+void
+TAO_AV_Transport_Item::factory (TAO_AV_Transport_Factory *factory)
+{
+ this->factory_ = factory;
+}
+
+
+//------------------------------------------------------------
+// TAO_AV_Flow_Protocol_Item
+//------------------------------------------------------------
+ACE_INLINE
+const ACE_CString &
+TAO_AV_Flow_Protocol_Item::name (void)
+{
+ return this->name_;
+}
+
+ACE_INLINE
+TAO_AV_Flow_Protocol_Factory *
+TAO_AV_Flow_Protocol_Item::factory (void)
+{
+ return this->factory_;
+}
+
+ACE_INLINE
+void
+TAO_AV_Flow_Protocol_Item::factory (TAO_AV_Flow_Protocol_Factory *factory)
+{
+ this->factory_ = factory;
+}
+
+//------------------------------------------------------------
+// TAO_AV_Connector_Registry
+//------------------------------------------------------------
+
+ACE_INLINE
+TAO_AV_ConnectorSetItor
+TAO_AV_Connector_Registry::begin (void)
+{
+ return this->connectors_.begin ();
+}
+
+ACE_INLINE
+TAO_AV_ConnectorSetItor
+TAO_AV_Connector_Registry::end (void)
+{
+ return this->connectors_.end ();
+}
+
+//------------------------------------------------------------
+// TAO_AV_Acceptor_Registry
+//------------------------------------------------------------
+ACE_INLINE
+TAO_AV_AcceptorSetItor
+TAO_AV_Acceptor_Registry::begin (void)
+{
+ return this->acceptors_.begin ();
+}
+
+ACE_INLINE
+TAO_AV_AcceptorSetItor
+TAO_AV_Acceptor_Registry::end (void)
+{
+ return this->acceptors_.end ();
+}
+
+//------------------------------------------------------------
+// TAO_AV_Acceptor
+//------------------------------------------------------------
+ACE_INLINE
+const char *
+TAO_AV_Acceptor::flowname (void)
+{
+ return this->flowname_.c_str ();
+}
+
+//------------------------------------------------------------
+// TAO_AV_Connector
+//------------------------------------------------------------
+ACE_INLINE
+const char *
+TAO_AV_Connector::flowname (void)
+{
+ return this->flowname_.c_str ();
+}
+
+TAO_END_VERSIONED_NAMESPACE_DECL
diff --git a/TAO/orbsvcs/orbsvcs/AV/UDP.cpp b/TAO/orbsvcs/orbsvcs/AV/UDP.cpp
new file mode 100644
index 00000000000..827079c3c90
--- /dev/null
+++ b/TAO/orbsvcs/orbsvcs/AV/UDP.cpp
@@ -0,0 +1,1094 @@
+// $Id$
+
+#include "orbsvcs/AV/UDP.h"
+#include "orbsvcs/AV/AVStreams_i.h"
+#include "orbsvcs/AV/MCast.h"
+
+#include "tao/debug.h"
+#include "ace/OS_NS_strings.h"
+
+#if !defined (__ACE_INLINE__)
+#include "orbsvcs/AV/UDP.i"
+#endif /* __ACE_INLINE__ */
+
+ACE_RCSID (AV,
+ UDP,
+ "$Id$")
+
+TAO_BEGIN_VERSIONED_NAMESPACE_DECL
+
+//------------------------------------------------------------
+// TAO_AV_UDP_Flow_Handler
+//------------------------------------------------------------
+
+TAO_AV_UDP_Flow_Handler::TAO_AV_UDP_Flow_Handler (void)
+{
+ ACE_NEW (this->transport_,
+ TAO_AV_UDP_Transport (this));
+}
+
+TAO_AV_UDP_Flow_Handler::~TAO_AV_UDP_Flow_Handler (void)
+{
+ // remove the event handler from the reactor.
+ TAO_AV_CORE::instance()->reactor ()->remove_handler (this->event_handler(),
+ ACE_Event_Handler::READ_MASK);
+
+ // close the socket.
+ this->close ();
+ delete this->transport_;
+}
+
+TAO_AV_Transport *
+TAO_AV_UDP_Flow_Handler::transport (void)
+{
+ return this->transport_;
+}
+
+int
+TAO_AV_UDP_Flow_Handler::handle_input (ACE_HANDLE /*fd*/)
+{
+ return this->protocol_object_->handle_input ();
+}
+
+int
+TAO_AV_UDP_Flow_Handler::handle_timeout (const ACE_Time_Value &tv,
+ const void *arg)
+{
+ return TAO_AV_Flow_Handler::handle_timeout (tv,arg);
+}
+
+int
+TAO_AV_UDP_Flow_Handler::set_remote_address (ACE_Addr *address)
+{
+ if (TAO_debug_level > 0)
+ ACE_DEBUG ((LM_DEBUG,"TAO_AV_UDP_Flow_Handler::set_remote_address\n"));
+
+ ACE_INET_Addr *inet_addr = dynamic_cast<ACE_INET_Addr*> (address);
+ this->peer_addr_ = *inet_addr;
+ TAO_AV_UDP_Transport *transport = dynamic_cast<TAO_AV_UDP_Transport*> (this->transport_);
+
+ return transport->set_remote_address (*inet_addr);
+}
+
+
+ACE_HANDLE
+TAO_AV_UDP_Flow_Handler::get_handle (void) const
+{
+ if (TAO_debug_level > 0)
+ ACE_DEBUG ((LM_DEBUG,
+ "TAO_AV_UDP_Flow_Handler::get_handle:%d\n",
+ this->sock_dgram_.get_handle ()));
+
+ return this->sock_dgram_.get_handle () ;
+}
+
+int
+TAO_AV_UDP_Flow_Handler::change_qos(AVStreams::QoS qos)
+{
+ if( TAO_debug_level > 0 )
+ {
+ ACE_DEBUG ((LM_DEBUG,
+ "(%N,%l) TAO_AV_UDP_Flow_Handler::change_qos\n"));
+ }
+
+ unsigned int i=0;
+
+ int ret = 0;
+ CORBA::Long dscp = 0;
+ CORBA::Long ecn = 0;
+ int dscp_flag=0;
+ for(i=0; i < qos.QoSParams.length(); i++)
+ {
+
+ if( ACE_OS::strcmp( qos.QoSParams[i].property_name.in(), "Diffserv_Codepoint") == 0)
+ {
+ qos.QoSParams[i].property_value >>= dscp;
+ dscp_flag=1;
+ // DSCP value can only be 6 bits wide
+ if(!((dscp >= 0) && (dscp <= 63)))
+ {
+ dscp_flag = 0;
+ ACE_DEBUG((LM_DEBUG, "(%N,%l) ECN value can only be (0-3) not %d\n", ecn));
+ return -1;
+ }
+ }
+
+ if( ACE_OS::strcmp( qos.QoSParams[i].property_name.in(), "ECN") == 0)
+ {
+ qos.QoSParams[i].property_value >>= ecn;
+ // ECN value can only occupy bits 6 and 7 of the
+ // IP Diffserv byte
+ if(!((ecn >= 0) && (ecn <= 3)))
+ {
+ ACE_DEBUG((LM_DEBUG, "(%N,%l) ECN value can only be (0-3) not %d\n", ecn));
+ ecn = 0;
+ }
+
+ }
+ }
+ // Set the Diffserv byte only if we specified
+ // the Diffserv Codepoint (DSCP) or ECN via QoSParams
+ // passed into this method
+ if(dscp_flag || ecn)
+ {
+ int tos;
+ tos = (int)(dscp << 2);
+ if(ecn)
+ {
+ tos |= ecn;
+ }
+ ret = sock_dgram_.set_option(IPPROTO_IP, IP_TOS, (int *)&tos , (int)sizeof(tos));
+
+ if(TAO_debug_level > 1)
+ {
+ ACE_DEBUG((LM_DEBUG, "(%N,%l) set tos: ret: %d\n", ret));
+ }
+ }
+
+ if(TAO_debug_level > 1)
+ {
+ if(ret < 0 )
+ {
+ ACE_DEBUG((LM_DEBUG, "(%N,%l) errno: %p\n"));
+ }
+ }
+ return ret;
+}
+
+//------------------------------------------------------------
+// TAO_AV_UDP_Transport
+//------------------------------------------------------------
+
+TAO_AV_UDP_Transport::TAO_AV_UDP_Transport (void)
+ :handler_ (0)
+{
+}
+
+TAO_AV_UDP_Transport::TAO_AV_UDP_Transport (TAO_AV_UDP_Flow_Handler *handler)
+ :handler_ (handler),
+ addr_ (0)
+{
+}
+
+TAO_AV_UDP_Transport::~TAO_AV_UDP_Transport (void)
+{
+}
+
+int
+TAO_AV_UDP_Transport::set_remote_address (const ACE_INET_Addr &address)
+{
+ this->peer_addr_ = address;
+ return 0;
+}
+
+int
+TAO_AV_UDP_Transport::open (ACE_Addr * /*address*/)
+{
+ return 0;
+}
+
+int
+TAO_AV_UDP_Transport::close (void)
+{
+ return 0;
+}
+
+int
+TAO_AV_UDP_Transport::mtu (void)
+{
+ return 65535;
+}
+
+ACE_Addr*
+TAO_AV_UDP_Transport::get_peer_addr (void)
+{
+ return &this->peer_addr_;
+}
+
+ssize_t
+TAO_AV_UDP_Transport::send (const ACE_Message_Block *mblk, ACE_Time_Value *)
+{
+ // For the most part this was copied from GIOP::send_request and
+ // friends.
+
+ iovec iov[ACE_IOV_MAX];
+ int iovcnt = 0;
+ ssize_t n = 0;
+ ssize_t nbytes = 0;
+
+ for (const ACE_Message_Block *i = mblk;
+ i != 0;
+ i = i->cont ())
+ {
+ // Make sure there is something to send!
+ if (i->length () > 0)
+ {
+ iov[iovcnt].iov_base = i->rd_ptr ();
+ iov[iovcnt].iov_len = static_cast<u_long> (i->length ());
+ iovcnt++;
+
+ // The buffer is full make a OS call. @@ TODO this should
+ // be optimized on a per-platform basis, for instance, some
+ // platforms do not implement writev() there we should copy
+ // the data into a buffer and call send_n(). In other cases
+ // there may be some limits on the size of the iovec, there
+ // we should set ACE_IOV_MAX to that limit.
+ if (iovcnt == ACE_IOV_MAX)
+ {
+ n = this->handler_->get_socket ()->send ((const iovec *) iov,
+ iovcnt,
+ this->peer_addr_);
+
+ if (n < 1)
+ return n;
+
+ nbytes += n;
+ iovcnt = 0;
+ }
+ }
+ }
+
+ // Check for remaining buffers to be sent!
+ if (iovcnt != 0)
+ {
+ n = this->handler_->get_socket ()->send ((const iovec *) iov,
+ iovcnt,
+ this->peer_addr_);
+
+ if (n < 1)
+ return n;
+
+ nbytes += n;
+ }
+
+ return nbytes;
+}
+
+ssize_t
+TAO_AV_UDP_Transport::send (const char *buf,
+ size_t len,
+ ACE_Time_Value *)
+{
+ if (TAO_debug_level > 0) ACE_DEBUG ((LM_DEBUG,"TAO_AV_UDP_Transport::send "));
+ char addr [BUFSIZ];
+ this->peer_addr_.addr_to_string (addr,BUFSIZ);
+ if (TAO_debug_level > 0) ACE_DEBUG ((LM_DEBUG,"to %s\n",addr));
+
+ return this->handler_->get_socket ()->send (buf, len,this->peer_addr_);
+}
+
+ssize_t
+TAO_AV_UDP_Transport::send (const iovec *iov,
+ int iovcnt,
+ ACE_Time_Value *)
+{
+ return this->handler_->get_socket ()->send ((const iovec *) iov,
+ iovcnt,
+ this->peer_addr_);
+
+}
+
+ssize_t
+TAO_AV_UDP_Transport::recv (char *buf,
+ size_t len,
+ ACE_Time_Value *)
+{
+ return this->handler_->get_socket ()->recv (buf, len,this->peer_addr_);
+}
+
+ssize_t
+TAO_AV_UDP_Transport::recv (char *buf,
+ size_t len,
+ int flags,
+ ACE_Time_Value *timeout)
+{
+ return this->handler_->get_socket ()->recv (buf,
+ len,
+ this->peer_addr_,
+ flags,
+ timeout);
+}
+
+ssize_t
+TAO_AV_UDP_Transport::recv (iovec *iov,
+ int /*iovcnt*/,
+ ACE_Time_Value *timeout)
+{
+ return handler_->get_socket ()->recv (iov,this->peer_addr_,0,timeout);
+}
+
+
+//------------------------------------------------------------
+// TAO_AV_UDP_Acceptor
+//------------------------------------------------------------
+
+TAO_AV_UDP_Acceptor::TAO_AV_UDP_Acceptor (void)
+ : address_ (0),
+ control_inet_address_ (0)
+{
+}
+
+TAO_AV_UDP_Acceptor::~TAO_AV_UDP_Acceptor (void)
+{
+ if (this->flow_component_ == TAO_AV_Core::TAO_AV_CONTROL)
+ delete this->entry_->control_handler ();
+
+ delete this->address_;
+ delete this->control_inet_address_;
+}
+
+int
+TAO_AV_UDP_Acceptor::activate_svc_handler (TAO_AV_Flow_Handler *handler)
+{
+ ACE_Event_Handler *event_handler = handler->event_handler ();
+ int result = this->av_core_->reactor ()->register_handler (event_handler,
+ ACE_Event_Handler::READ_MASK);
+
+ if (this->flow_component_ == TAO_AV_Core::TAO_AV_CONTROL)
+ handler->schedule_timer ();
+
+ return result;
+}
+
+int
+TAO_AV_UDP_Acceptor::open (TAO_Base_StreamEndPoint *endpoint,
+ TAO_AV_Core *av_core,
+ TAO_FlowSpec_Entry *entry,
+ TAO_AV_Flow_Protocol_Factory *factory,
+ TAO_AV_Core::Flow_Component flow_comp)
+{
+ if (TAO_debug_level > 0) ACE_DEBUG ((LM_DEBUG,"TAO_AV_UDP_Acceptor::open\n"));
+ this->av_core_ = av_core;
+ this->endpoint_ = endpoint;
+ this->entry_ = entry;
+ this->flow_component_ = flow_comp;
+ this->flow_protocol_factory_ = factory;
+ ACE_INET_Addr *inet_addr;
+ if (flow_comp == TAO_AV_Core::TAO_AV_CONTROL)
+ {
+ this->flowname_ = TAO_AV_Core::get_control_flowname (entry->flowname ());
+ inet_addr = (ACE_INET_Addr *) entry->control_address ();
+ }
+ else
+ {
+ this->flowname_ = entry->flowname ();
+ inet_addr = (ACE_INET_Addr *) entry->address ();
+ }
+
+ if (inet_addr != 0)
+ {
+ char buf[BUFSIZ];
+ inet_addr->addr_to_string (buf,
+ BUFSIZ);
+
+ if (TAO_debug_level > 0)
+ ACE_DEBUG ((LM_DEBUG,
+ "TAO_AV_UDP_Acceptor::open: %s\n",
+ buf));
+ }
+
+ int result = this->open_i (inet_addr, 0);
+
+ if (result < 0)
+ return result;
+ return 0;
+}
+
+int
+TAO_AV_UDP_Acceptor::open_default (TAO_Base_StreamEndPoint *endpoint,
+ TAO_AV_Core *av_core,
+ TAO_FlowSpec_Entry *entry,
+ TAO_AV_Flow_Protocol_Factory *factory,
+ TAO_AV_Core::Flow_Component flow_comp)
+{
+ this->av_core_ = av_core;
+ this->endpoint_ = endpoint;
+ this->entry_ = entry;
+ this->flow_component_ = flow_comp;
+ this->flow_protocol_factory_ = factory;
+ if (flow_comp == TAO_AV_Core::TAO_AV_CONTROL)
+ {
+ this->flowname_ = TAO_AV_Core::get_control_flowname (entry->flowname ());
+ }
+ else
+ {
+ this->flowname_ = entry->flowname ();
+ ACE_NEW_RETURN (this->address_,
+ ACE_INET_Addr ("0"),
+ -1);
+ }
+
+ int result = this->open_i (this->address_, 1);
+ if (result < 0)
+ return result;
+
+ return 0;
+}
+
+int
+TAO_AV_UDP_Acceptor::open_i (ACE_INET_Addr *inet_addr,
+ int is_default_addr)
+{
+ int result = -1;
+ ACE_INET_Addr *local_addr = 0;
+
+ TAO_AV_Flow_Handler *flow_handler = 0;
+
+ // if using a default address and this is the control flow component, the
+ // handler and local address are already set in the flow spec entry
+ if (is_default_addr &&
+ (this->flow_component_ == TAO_AV_Core::TAO_AV_CONTROL) &&
+ (ACE_OS::strcasecmp(this->entry_->flow_protocol_str (), "RTP") == 0))
+ {
+ flow_handler = this->entry_->control_handler ();
+
+ local_addr = dynamic_cast<ACE_INET_Addr*> (this->entry_->get_local_control_addr ());
+ }
+ else
+ {
+ // this variable is only used for RTP/UDP; RFC 1889 requires an even/odd
+ // consecutive port pair
+ int get_new_port = 1;
+
+ while (get_new_port)
+ {
+ // assume the ports will be OK
+ get_new_port = 0;
+
+ result = TAO_AV_UDP_Connection_Setup::setup (flow_handler,
+ inet_addr,
+ local_addr,
+ this->entry_->is_multicast (),
+ TAO_AV_UDP_Connection_Setup::ACCEPTOR);
+
+ if (result < 0)
+ {
+ ACE_DEBUG((LM_DEBUG,"(%N,%l) Error during connection setup: %d\n", result));
+ }
+
+ local_addr->set (local_addr->get_port_number (),
+ local_addr->get_host_name ());
+
+ if (is_default_addr)
+ {
+ if ((ACE_OS::strcasecmp(this->entry_->flow_protocol_str (), "RTP") == 0) &&
+ (this->flow_component_ == TAO_AV_Core::TAO_AV_DATA))
+ {
+ if (is_default_addr && local_addr->get_port_number ()%2 != 0)
+ {
+ // RTP port should be even
+ delete local_addr;
+ delete flow_handler;
+ get_new_port = 1;
+ }
+ else
+ {
+ ACE_INET_Addr *local_control_addr;
+ TAO_AV_Flow_Handler *control_flow_handler = 0;
+
+ ACE_NEW_RETURN (this->control_inet_address_,
+ ACE_INET_Addr ("0"),
+ -1);
+
+ TAO_AV_UDP_Connection_Setup::setup(control_flow_handler,
+ this->control_inet_address_,
+ local_control_addr,
+ this->entry_->is_multicast (),
+ TAO_AV_UDP_Connection_Setup::ACCEPTOR);
+
+ if (local_control_addr->get_port_number () !=
+ local_addr->get_port_number () +1)
+ {
+ delete this->control_inet_address_;
+ delete local_addr;
+ delete flow_handler;
+ delete local_control_addr;
+ delete control_flow_handler;
+ get_new_port = 1;
+ }
+ else
+ {
+ this->entry_->control_address (this->control_inet_address_);
+ this->entry_->set_local_control_addr (local_control_addr);
+ this->entry_->control_handler (control_flow_handler);
+ }
+ }
+ }
+ }
+ }
+ }
+
+ TAO_AV_Protocol_Object *object =
+ this->flow_protocol_factory_->make_protocol_object (this->entry_,
+ this->endpoint_,
+ flow_handler,
+ flow_handler->transport ());
+ flow_handler->protocol_object (object);
+
+ if (this->flow_component_ == TAO_AV_Core::TAO_AV_DATA)
+ {
+ this->endpoint_->set_flow_handler (this->flowname_.c_str (),flow_handler);
+
+ this->entry_->protocol_object (object);
+ this->entry_->set_local_addr (local_addr);
+ this->entry_->handler (flow_handler);
+ //this->entry_->address (inet_addr);
+ this->entry_->address (local_addr);
+ }
+ else
+ {
+ this->endpoint_->set_control_flow_handler (this->flowname_.c_str (),flow_handler);
+
+ this->entry_->control_protocol_object (object);
+ this->entry_->set_local_control_addr (local_addr);
+ this->entry_->control_handler (flow_handler);
+ }
+
+ char buf[BUFSIZ];
+ local_addr->addr_to_string (buf,BUFSIZ);
+ if (TAO_debug_level > 0)
+ ACE_DEBUG ((LM_DEBUG,
+ "TAO_AV_UDP_ACCEPTOR::open:%s \n",
+ buf));
+
+ // call activate svc handler.
+ return this->activate_svc_handler (flow_handler);
+}
+
+int
+TAO_AV_UDP_Acceptor::close (void)
+{
+ return 0;
+}
+
+//------------------------------------------------------------
+// TAO_AV_UDP_Connector
+//------------------------------------------------------------
+TAO_AV_UDP_Connector::TAO_AV_UDP_Connector (void)
+ : control_inet_address_ (0)
+{
+}
+
+TAO_AV_UDP_Connector::~TAO_AV_UDP_Connector (void)
+{
+ if (this->flow_component_ == TAO_AV_Core::TAO_AV_CONTROL)
+ {
+ delete this->entry_->control_handler ();
+ }
+
+ if (this->control_inet_address_ != 0)
+ delete this->control_inet_address_;
+}
+
+int
+TAO_AV_UDP_Connector::open (TAO_Base_StreamEndPoint *endpoint,
+ TAO_AV_Core *av_core,
+ TAO_AV_Flow_Protocol_Factory *factory)
+
+{
+ if (TAO_debug_level > 0) ACE_DEBUG ((LM_DEBUG,"TAO_AV_UDP_Connector::open "));
+ this->endpoint_ = endpoint;
+ this->av_core_ = av_core;
+ this->flow_protocol_factory_ = factory;
+ return 0;
+}
+
+int
+TAO_AV_UDP_Connector::connect (TAO_FlowSpec_Entry *entry,
+ TAO_AV_Transport *&transport,
+ TAO_AV_Core::Flow_Component flow_component)
+{
+ ACE_INET_Addr *local_addr = 0;
+ ACE_INET_Addr *control_inet_addr = 0;
+
+ this->entry_ = entry;
+ this->flow_component_ = flow_component;
+
+ ACE_INET_Addr *inet_addr;
+
+ if (flow_component == TAO_AV_Core::TAO_AV_CONTROL)
+ {
+ this->flowname_ = TAO_AV_Core::get_control_flowname (entry->flowname());
+ inet_addr = dynamic_cast<ACE_INET_Addr*> (entry->control_address ());
+ }
+ else
+ {
+ this->flowname_ = entry->flowname ();
+ inet_addr = dynamic_cast<ACE_INET_Addr*> (entry->address ());
+ control_inet_addr = dynamic_cast<ACE_INET_Addr*> (entry->control_address ());
+ }
+
+ TAO_AV_Flow_Handler *flow_handler = 0;
+
+ // if this is the control flow component, the
+ // handler and local address are already set in the flow spec entry
+ if ((flow_component == TAO_AV_Core::TAO_AV_CONTROL) &&
+ (ACE_OS::strcasecmp(this->entry_->flow_protocol_str (), "RTP") == 0) &&
+ !entry->is_multicast ())
+ {
+ flow_handler = this->entry_->control_handler ();
+ flow_handler->set_remote_address (inet_addr);
+
+ local_addr = dynamic_cast<ACE_INET_Addr*> (this->entry_->get_local_control_addr ());
+ }
+ else
+ {
+ // this variable is only used for RTP/UDP; RFC 1889 requires an even/odd
+ // consecutive port pair
+ int get_new_port = 1;
+
+ while (get_new_port)
+ {
+ // assume the ports will be OK
+ get_new_port = 0;
+
+ ACE_Addr *addr;
+ if ((addr = entry->get_peer_addr ()) != 0)
+ {
+ local_addr = dynamic_cast<ACE_INET_Addr*> (addr);
+ char buf [BUFSIZ];
+ local_addr->addr_to_string (buf, BUFSIZ);
+ }
+
+ TAO_AV_UDP_Connection_Setup::setup (flow_handler,
+ inet_addr,
+ local_addr,
+ entry->is_multicast (),
+ TAO_AV_UDP_Connection_Setup::CONNECTOR);
+
+ if ((ACE_OS::strcasecmp(this->entry_->flow_protocol_str (), "RTP") == 0) &&
+ (flow_component == TAO_AV_Core::TAO_AV_DATA) &&
+ !entry->is_multicast ())
+ {
+ if (local_addr->get_port_number ()%2 != 0)
+ {
+ // RTP port should be even
+ delete local_addr;
+ delete flow_handler;
+ get_new_port = 1;
+ }
+ else
+ {
+ ACE_INET_Addr *local_control_addr;
+ TAO_AV_Flow_Handler *control_flow_handler = 0;
+
+ if (entry->is_multicast ())
+ control_inet_addr = dynamic_cast<ACE_INET_Addr*> (entry->control_address ()) ;
+ else
+ {
+
+ if (local_addr != 0)
+ {
+ char buf [BUFSIZ];
+ ACE_CString addr_str (local_addr->get_host_name ());
+ addr_str += ":";
+ addr_str += ACE_OS::itoa (local_addr->get_port_number () + 1, buf, 10);
+ ACE_NEW_RETURN (local_control_addr,
+ ACE_INET_Addr (addr_str.c_str ()),
+ -1);
+ local_control_addr->addr_to_string (buf, BUFSIZ);
+ }
+
+
+ if (entry->control_address () == 0)
+ ACE_NEW_RETURN (this->control_inet_address_,
+ ACE_INET_Addr ("0"),
+ -1);
+ else
+ control_inet_address_ = dynamic_cast<ACE_INET_Addr*> (entry->control_address ());
+ }
+
+ TAO_AV_UDP_Connection_Setup::setup (control_flow_handler,
+ control_inet_addr,
+ local_control_addr,
+ entry->is_multicast (),
+ TAO_AV_UDP_Connection_Setup::CONNECTOR);
+
+ if (local_control_addr->get_port_number () !=
+ local_addr->get_port_number () +1)
+ {
+ delete local_addr;
+ delete flow_handler;
+ delete local_control_addr;
+ delete control_flow_handler;
+ get_new_port = 1;
+ }
+ else
+ {
+ this->entry_->set_local_control_addr (local_control_addr);
+ this->entry_->control_handler (control_flow_handler);
+ }
+ }
+ }
+ }
+ }
+
+ TAO_AV_Protocol_Object *object =
+ this->flow_protocol_factory_->make_protocol_object (this->entry_,
+ this->endpoint_,
+ flow_handler,
+ flow_handler->transport ());
+
+ flow_handler->protocol_object (object);
+
+ if (flow_component == TAO_AV_Core::TAO_AV_DATA)
+ {
+ this->endpoint_->set_flow_handler (this->flowname_.c_str (),
+ flow_handler);
+ this->entry_->protocol_object (object);
+ entry->set_local_addr (local_addr);
+ entry->handler (flow_handler);
+ transport = flow_handler->transport ();
+ }
+ else
+ {
+ this->endpoint_->set_control_flow_handler (this->flowname_.c_str (),
+ flow_handler);
+ this->entry_->control_protocol_object (object);
+ entry->set_local_control_addr (local_addr);
+ entry->control_handler (flow_handler);
+ transport = flow_handler->transport ();
+ }
+
+ char buf[BUFSIZ];
+ local_addr->addr_to_string (buf,BUFSIZ);
+
+ if (TAO_debug_level > 0)
+ ACE_DEBUG ((LM_DEBUG,"TAO_AV_UDP_CONNECTOR::connect:%s \n",buf));
+
+ // call activate svc handler.
+ return this->activate_svc_handler (flow_handler);
+}
+
+int
+TAO_AV_UDP_Connector::activate_svc_handler (TAO_AV_Flow_Handler *handler)
+{
+ ACE_Event_Handler *event_handler = handler->event_handler ();
+ int result = this->av_core_->reactor ()->register_handler (event_handler,
+ ACE_Event_Handler::READ_MASK);
+
+ if (this->flow_component_ == TAO_AV_Core::TAO_AV_CONTROL)
+ handler->schedule_timer ();
+
+ return result;
+}
+
+int
+TAO_AV_UDP_Connector::close (void)
+{
+ return 0;
+}
+
+//------------------------------------------------------------
+// TAO_AV_UDP_Connection_Setup
+//------------------------------------------------------------
+
+int
+TAO_AV_UDP_Connection_Setup::setup (TAO_AV_Flow_Handler *&flow_handler,
+ ACE_INET_Addr *inet_addr,
+ ACE_INET_Addr *&local_addr,
+ int is_multicast,
+ ConnectionType ct)
+{
+ int result;
+
+ if (is_multicast)
+ {
+ TAO_AV_UDP_MCast_Flow_Handler *handler;
+ ACE_NEW_RETURN (handler,
+ TAO_AV_UDP_MCast_Flow_Handler,
+ -1);
+
+ flow_handler = handler;
+
+ result = handler->get_mcast_socket ()->subscribe (*inet_addr);
+ if (result < 0)
+ ACE_ERROR_RETURN ((LM_ERROR,"TAO_AV_UDP_MCast_connector::open failed\n"),-1);
+
+ // Now disable Multicast loopback.
+ // @@Should we make this a policy?
+#if defined (ACE_HAS_IP_MULTICAST)
+ if (handler->get_mcast_socket ()->set_option (IP_MULTICAST_LOOP,
+ 0) < 0)
+ if (TAO_debug_level > 0)
+ ACE_DEBUG ((LM_DEBUG,"TAO_AV_UDP_MCast_Acceptor::multicast loop disable failed\n"));
+ // @@ This should also be policies.
+#endif /*ACE_HAS_IP_MULTICAST*/
+
+ int bufsize = 80 * 1024;
+ if (handler->get_mcast_socket ()->ACE_SOCK::set_option (SOL_SOCKET,
+ SO_RCVBUF,
+ (char *)&bufsize,
+ sizeof(bufsize)) < 0)
+ {
+ bufsize = 32 * 1024;
+ if (handler->get_mcast_socket ()->ACE_SOCK::set_option (SOL_SOCKET,
+ SO_RCVBUF,
+ (char *)&bufsize,
+ sizeof(bufsize)) < 0)
+ perror("SO_RCVBUF");
+ }
+ ACE_NEW_RETURN (local_addr,
+ ACE_INET_Addr ("0"),
+ -1);
+
+ if (ct == ACCEPTOR)
+ {
+ result = handler->get_mcast_socket ()->get_local_addr (*local_addr);
+ if (result < 0)
+ ACE_ERROR_RETURN ((LM_ERROR,"TAO_AV_Dgram_Connector::open: get_local_addr failed\n"),result);
+
+ local_addr->set (local_addr->get_port_number (),
+ local_addr->get_host_name ());
+ handler->set_peer_addr (local_addr);
+ }
+ }
+ else
+ {
+ if (local_addr == 0)
+ ACE_NEW_RETURN (local_addr,
+ ACE_INET_Addr ("0"),
+ -1);
+
+ TAO_AV_UDP_Flow_Handler *handler;
+ ACE_NEW_RETURN (handler,
+ TAO_AV_UDP_Flow_Handler,
+ -1);
+
+ flow_handler = handler;
+
+ if (ct == ACCEPTOR)
+ result = handler->open (*inet_addr);
+ else
+ result = handler->open (*local_addr);
+ if (result < 0)
+ ACE_ERROR_RETURN ((LM_ERROR,"handler::open failed\n"),-1);
+
+ // set the socket buffer sizes to 64k.
+ int sndbufsize = ACE_DEFAULT_MAX_SOCKET_BUFSIZ;
+ int rcvbufsize = ACE_DEFAULT_MAX_SOCKET_BUFSIZ;
+
+ if (handler->get_socket ()->set_option (SOL_SOCKET,
+ SO_SNDBUF,
+ (void *) &sndbufsize,
+ sizeof (sndbufsize)) == -1
+ && errno != ENOTSUP)
+ return 0;
+ else if (handler->get_socket ()->set_option (SOL_SOCKET,
+ SO_RCVBUF,
+ (void *) &rcvbufsize,
+ sizeof (rcvbufsize)) == -1
+ && errno != ENOTSUP)
+ return 0;
+
+ if (ct == CONNECTOR)
+ handler->set_remote_address (inet_addr);
+
+ result = handler->get_socket ()->get_local_addr (*local_addr);
+
+ local_addr->set (local_addr->get_port_number (),
+ local_addr->get_host_name ());
+
+ char buf [BUFSIZ];
+ local_addr->addr_to_string (buf, BUFSIZ);
+
+ if (result < 0)
+ ACE_ERROR_RETURN ((LM_ERROR,"TAO_AV_Dgram_Connector::open: get_local_addr failed\n"),result);
+ }
+
+ return 1;
+}
+
+//------------------------------------------------------------
+// TAO_AV_UDP_Protocol_Factory
+//------------------------------------------------------------
+
+TAO_AV_UDP_Factory::TAO_AV_UDP_Factory (void)
+{
+}
+
+TAO_AV_UDP_Factory::~TAO_AV_UDP_Factory (void)
+{
+}
+
+int
+TAO_AV_UDP_Factory::match_protocol (const char *protocol_string)
+{
+ if (ACE_OS::strcasecmp (protocol_string,"UDP") == 0)
+ return 1;
+ if (ACE_OS::strcasecmp (protocol_string,"RTP/UDP") == 0)
+ return 1;
+ return 0;
+}
+
+TAO_AV_Acceptor*
+TAO_AV_UDP_Factory::make_acceptor (void)
+{
+ if (TAO_debug_level > 0) ACE_DEBUG ((LM_DEBUG,"TAO_AV_UDP_Factory::make_acceptor\n"));
+ TAO_AV_Acceptor *acceptor = 0;
+ ACE_NEW_RETURN (acceptor,
+ TAO_AV_UDP_Acceptor,
+ 0);
+ return acceptor;
+}
+
+TAO_AV_Connector*
+TAO_AV_UDP_Factory::make_connector (void)
+{
+ if (TAO_debug_level > 0) ACE_DEBUG ((LM_DEBUG,"TAO_AV_UDP_Factory::make_connector\n"));
+ TAO_AV_Connector *connector = 0;
+ ACE_NEW_RETURN (connector,
+ TAO_AV_UDP_Connector,
+ 0);
+ return connector;
+}
+
+int
+TAO_AV_UDP_Factory::init (int /* argc */,
+ char * /* argv */ [])
+{
+ return 0;
+}
+
+//------------------------------------------------------------
+// TAO_AV_UDP_Object
+//------------------------------------------------------------
+
+int
+TAO_AV_UDP_Object::handle_input (void)
+{
+ int n = this->transport_->recv (this->frame_.rd_ptr (),
+ this->frame_.size ());
+ if (n == -1)
+ ACE_ERROR_RETURN ((LM_ERROR,"(%N,%l) TAO_AV_UDP_Flow_Handler::handle_input recv failed: errno: %m\n"),-1);
+
+ this->frame_.wr_ptr (this->frame_.rd_ptr () + n);
+
+ return this->callback_->receive_frame (&this->frame_);
+}
+
+int
+TAO_AV_UDP_Object::send_frame (ACE_Message_Block *frame,
+ TAO_AV_frame_info * /*frame_info*/)
+{
+ if (TAO_debug_level > 0) ACE_DEBUG ((LM_DEBUG,"TAO_AV_UDP_Object::send_frame\n"));
+ int result = this->transport_->send (frame);
+ if (result < 0)
+ return result;
+ return 0;
+}
+
+int
+TAO_AV_UDP_Object::send_frame (const iovec *iov,
+ int iovcnt,
+ TAO_AV_frame_info * /*frame_info*/)
+{
+ int result = this->transport_->send (iov,iovcnt);
+ if (result < 0)
+ return result;
+ return 0;
+}
+
+int
+TAO_AV_UDP_Object::send_frame (const char*buf,
+ size_t len)
+{
+ int result = this->transport_->send (buf, len, 0);
+ if (result < 0)
+ return result;
+ return 0;
+}
+
+TAO_AV_UDP_Object::TAO_AV_UDP_Object (TAO_AV_Callback *callback,
+ TAO_AV_Transport *transport)
+ :TAO_AV_Protocol_Object (callback,transport)
+{
+ this->frame_.size (this->transport_->mtu ());
+}
+
+TAO_AV_UDP_Object::~TAO_AV_UDP_Object (void)
+{
+ //no-op
+}
+
+int
+TAO_AV_UDP_Object::destroy (void)
+{
+ this->callback_->handle_destroy ();
+ delete this;
+
+ return 0;
+}
+
+
+//------------------------------------------------------------
+// TAO_AV_UDP_Flow_Factory
+//------------------------------------------------------------
+TAO_AV_UDP_Flow_Factory::TAO_AV_UDP_Flow_Factory (void)
+{
+}
+
+TAO_AV_UDP_Flow_Factory::~TAO_AV_UDP_Flow_Factory (void)
+{
+}
+
+int
+TAO_AV_UDP_Flow_Factory::init (int /* argc */,
+ char * /* argv */ [])
+{
+ return 0;
+}
+
+int
+TAO_AV_UDP_Flow_Factory::match_protocol (const char *flow_string)
+{
+ if (ACE_OS::strcasecmp (flow_string,"UDP") == 0)
+ return 1;
+ return 0;
+}
+
+TAO_AV_Protocol_Object*
+TAO_AV_UDP_Flow_Factory::make_protocol_object (TAO_FlowSpec_Entry *entry,
+ TAO_Base_StreamEndPoint *endpoint,
+ TAO_AV_Flow_Handler *handler,
+ TAO_AV_Transport *transport)
+{
+ TAO_AV_Callback *callback = 0;
+ if( endpoint->get_callback (entry->flowname (), callback) ) {
+ ACE_ERROR_RETURN ((LM_ERROR, "(%N,%l) Invalid callback\n"), 0);
+ }
+
+ TAO_AV_UDP_Object *object = 0;
+ ACE_NEW_RETURN (object,
+ TAO_AV_UDP_Object (callback,
+ transport),
+ 0);
+ callback->open (object,
+ handler);
+ endpoint->set_protocol_object (entry->flowname (),
+ object);
+
+ endpoint->protocol_object_set ();
+
+ return object;
+}
+
+TAO_END_VERSIONED_NAMESPACE_DECL
+
+ACE_FACTORY_DEFINE (TAO_AV, TAO_AV_UDP_Flow_Factory)
+ACE_STATIC_SVC_DEFINE (TAO_AV_UDP_Flow_Factory,
+ ACE_TEXT ("UDP_Flow_Factory"),
+ ACE_SVC_OBJ_T,
+ &ACE_SVC_NAME (TAO_AV_UDP_Flow_Factory),
+ ACE_Service_Type::DELETE_THIS |
+ ACE_Service_Type::DELETE_OBJ,
+ 0)
+
+ACE_FACTORY_DEFINE (TAO_AV, TAO_AV_UDP_Factory)
+ACE_STATIC_SVC_DEFINE (TAO_AV_UDP_Factory,
+ ACE_TEXT ("UDP_Factory"),
+ ACE_SVC_OBJ_T,
+ &ACE_SVC_NAME (TAO_AV_UDP_Factory),
+ ACE_Service_Type::DELETE_THIS |
+ ACE_Service_Type::DELETE_OBJ,
+ 0)
diff --git a/TAO/orbsvcs/orbsvcs/AV/UDP.h b/TAO/orbsvcs/orbsvcs/AV/UDP.h
new file mode 100644
index 00000000000..f582af25ec7
--- /dev/null
+++ b/TAO/orbsvcs/orbsvcs/AV/UDP.h
@@ -0,0 +1,296 @@
+// -*- C++ -*-
+
+//=============================================================================
+/**
+ * @file UDP.h
+ *
+ * $Id$
+ *
+ * @author Nagarajan Surendran <naga@cs.wustl.edu>
+ */
+//=============================================================================
+
+
+#ifndef TAO_AV_UDP_H
+#define TAO_AV_UDP_H
+
+#include /**/ "ace/pre.h"
+
+#include "orbsvcs/AV/Protocol_Factory.h"
+
+#include "ace/Service_Config.h"
+
+TAO_BEGIN_VERSIONED_NAMESPACE_DECL
+
+/**
+ * @class TAO_AV_UDP_Factory
+ * @brief
+ */
+class TAO_AV_Export TAO_AV_UDP_Factory : public TAO_AV_Transport_Factory
+{
+public:
+ /// Initialization hook.
+ TAO_AV_UDP_Factory (void);
+ virtual ~TAO_AV_UDP_Factory (void);
+ virtual int init (int argc, char *argv[]);
+ virtual int match_protocol (const char *protocol_string);
+ virtual TAO_AV_Acceptor *make_acceptor (void);
+ virtual TAO_AV_Connector *make_connector (void);
+};
+
+class TAO_AV_UDP_Flow_Handler;
+
+/**
+ * @class TAO_AV_UDP_Transport
+ * @brief A transport abstraction for udp sockets.
+ * Uses the ACE_SOCK_Dgram to send the data.
+ */
+class TAO_AV_Export TAO_AV_UDP_Transport
+ :public TAO_AV_Transport
+{
+
+public:
+ TAO_AV_UDP_Transport (void);
+
+ TAO_AV_UDP_Transport (TAO_AV_UDP_Flow_Handler *handler);
+
+ virtual ~TAO_AV_UDP_Transport (void);
+ virtual int open (ACE_Addr *addr);
+
+ virtual int close (void);
+
+ virtual int mtu (void);
+
+ virtual ACE_Addr *get_peer_addr (void);
+
+ virtual int set_remote_address (const ACE_INET_Addr &address);
+
+ /// Write the complete Message_Block chain to the connection.
+ virtual ssize_t send (const ACE_Message_Block *mblk,
+ ACE_Time_Value *s = 0);
+
+ /// Write the contents of the buffer of length len to the connection.
+ virtual ssize_t send (const char *buf,
+ size_t len,
+ ACE_Time_Value *s = 0);
+
+ /// Write the contents of iovcnt iovec's to the connection.
+ virtual ssize_t send (const iovec *iov,
+ int iovcnt,
+ ACE_Time_Value *s = 0);
+
+ /// Read len bytes from into buf.
+ virtual ssize_t recv (char *buf,
+ size_t len,
+ ACE_Time_Value *s = 0);
+
+ /// Read len bytes from into buf using flags.
+ virtual ssize_t recv (char *buf,
+ size_t len,
+ int flags,
+ ACE_Time_Value *s = 0);
+
+ /// Read received data into the iovec buffers.
+ virtual ssize_t recv (iovec *iov,
+ int iovcnt,
+ ACE_Time_Value *s = 0);
+
+ TAO_AV_UDP_Flow_Handler *handler (void) { return this->handler_; }
+
+protected:
+ TAO_AV_UDP_Flow_Handler *handler_;
+ ACE_Addr *addr_;
+ ACE_INET_Addr peer_addr_;
+};
+
+/**
+ * @class TAO_AV_UDP_Flow_Handler
+ * @brief Flow Handler for UDP flows.
+ */
+class TAO_AV_Export TAO_AV_UDP_Flow_Handler
+ :public virtual TAO_AV_Flow_Handler,
+ public virtual ACE_Event_Handler
+{
+public:
+ ///Ctor
+ /// Dtor
+ TAO_AV_UDP_Flow_Handler (void);
+ virtual ~TAO_AV_UDP_Flow_Handler (void);
+ int open (ACE_Addr &address);
+ int close (void);
+ virtual TAO_AV_Transport *transport (void);
+ virtual int set_remote_address (ACE_Addr *address);
+ virtual ACE_HANDLE get_handle (void) const;
+ virtual int handle_input (ACE_HANDLE fd);
+ virtual int handle_timeout (const ACE_Time_Value &tv, const void *arg = 0);
+ const ACE_SOCK_Dgram *get_socket (void) const;
+ virtual ACE_Event_Handler* event_handler (void){ return this; }
+ /// Change the QoS
+ virtual int change_qos (AVStreams::QoS);
+
+protected:
+ TAO_AV_Core *av_core_;
+ ACE_INET_Addr peer_addr_;
+ ACE_SOCK_Dgram sock_dgram_;
+};
+
+/**
+ * @class TAO_AV_UDP_Acceptor
+ * @brief
+ */
+class TAO_AV_Export TAO_AV_UDP_Acceptor
+ :public TAO_AV_Acceptor
+{
+public:
+ TAO_AV_UDP_Acceptor (void);
+ virtual ~TAO_AV_UDP_Acceptor (void);
+ virtual int open (TAO_Base_StreamEndPoint *endpoint,
+ TAO_AV_Core *av_core,
+ TAO_FlowSpec_Entry *entry,
+ TAO_AV_Flow_Protocol_Factory *factory,
+ TAO_AV_Core::Flow_Component flow_comp =
+ TAO_AV_Core::TAO_AV_DATA);
+
+ virtual int open_default (TAO_Base_StreamEndPoint *endpoint,
+ TAO_AV_Core *av_core,
+ TAO_FlowSpec_Entry *entry,
+ TAO_AV_Flow_Protocol_Factory *factory,
+ TAO_AV_Core::Flow_Component flow_comp =
+ TAO_AV_Core::TAO_AV_DATA);
+
+ virtual int open_i (ACE_INET_Addr *address, int is_default_open);
+
+ virtual int close (void);
+ virtual int activate_svc_handler (TAO_AV_Flow_Handler *handler);
+
+
+protected:
+ ACE_INET_Addr *address_;
+ ACE_INET_Addr *control_inet_address_;
+ TAO_Base_StreamEndPoint *endpoint_;
+ TAO_FlowSpec_Entry *entry_;
+ TAO_AV_Flow_Protocol_Factory *flow_protocol_factory_;
+ TAO_AV_Core::Flow_Component flow_component_;
+
+
+};
+
+/**
+ * @class TAO_AV_UDP_Connector
+ * @brief
+ */
+class TAO_AV_Export TAO_AV_UDP_Connector
+ :public TAO_AV_Connector
+{
+public:
+ TAO_AV_UDP_Connector (void);
+ ~TAO_AV_UDP_Connector (void);
+ virtual int open (TAO_Base_StreamEndPoint *endpoint,
+ TAO_AV_Core *av_core,
+ TAO_AV_Flow_Protocol_Factory *factory);
+
+ virtual int connect (TAO_FlowSpec_Entry *entry,
+ TAO_AV_Transport *&transport,
+ TAO_AV_Core::Flow_Component flow_comp =
+ TAO_AV_Core::TAO_AV_DATA);
+ virtual int activate_svc_handler (TAO_AV_Flow_Handler *handler);
+ virtual int close (void);
+protected:
+ ACE_INET_Addr *control_inet_address_;
+ TAO_Base_StreamEndPoint *endpoint_;
+ TAO_AV_Core *av_core_;
+ TAO_FlowSpec_Entry *entry_;
+ TAO_AV_Flow_Protocol_Factory *flow_protocol_factory_;
+ TAO_AV_Core::Flow_Component flow_component_;
+
+};
+
+/**
+ * @class TAO_AV_UDP_Connection_Setup
+ * @brief This class is a helper for the TAO_AV_UDP_Acceptor and
+ * TAO_AV_UDP_Connector. It basically just reduces duplicate code. It takes
+ * the address of the peer in the connection, whether or not it is a multicast
+ * connection, and whether it is a connector or acceptor; and creates the local
+ * address and flow handler associated with the connection.
+ */
+class TAO_AV_Export TAO_AV_UDP_Connection_Setup
+{
+public:
+ /// Indicates whether this setup is for a Connector or an Acceptor
+ enum ConnectionType {CONNECTOR, ACCEPTOR};
+
+ static int setup (TAO_AV_Flow_Handler *&flow_handler,
+ ACE_INET_Addr *inet_addr,
+ ACE_INET_Addr *&local_addr,
+ int is_multicast,
+ ConnectionType ct);
+};
+
+/**
+ * @class TAO_AV_UDP_Object
+ * @brief TAO_AV_Protocol_Object for the User Datagram Protocol (UDP)
+ */
+class TAO_AV_Export TAO_AV_UDP_Object : public TAO_AV_Protocol_Object
+{
+public:
+ TAO_AV_UDP_Object (TAO_AV_Callback *callback,
+ TAO_AV_Transport *transport = 0);
+
+ /// Dtor
+ virtual ~TAO_AV_UDP_Object (void);
+
+ virtual int handle_input (void);
+
+ /// send a data frame.
+ virtual int send_frame (ACE_Message_Block *frame,
+ TAO_AV_frame_info *frame_info = 0);
+
+ virtual int send_frame (const iovec *iov,
+ int iovcnt,
+ TAO_AV_frame_info *frame_info = 0);
+
+ virtual int send_frame (const char*buf,
+ size_t len);
+
+ /// end the stream.
+ virtual int destroy (void);
+
+private:
+ /// Pre-allocated memory to receive the data...
+ ACE_Message_Block frame_;
+};
+
+/**
+ * @class TAO_AV_UDP_Flow_Factory
+ * @brief
+ */
+class TAO_AV_Export TAO_AV_UDP_Flow_Factory : public TAO_AV_Flow_Protocol_Factory
+{
+public:
+ /// Initialization hook.
+ TAO_AV_UDP_Flow_Factory (void);
+ virtual ~TAO_AV_UDP_Flow_Factory (void);
+ virtual int init (int argc, char *argv[]);
+ virtual int match_protocol (const char *flow_string);
+ TAO_AV_Protocol_Object* make_protocol_object (TAO_FlowSpec_Entry *entry,
+ TAO_Base_StreamEndPoint *endpoint,
+ TAO_AV_Flow_Handler *handler,
+ TAO_AV_Transport *transport);
+};
+
+TAO_END_VERSIONED_NAMESPACE_DECL
+
+ACE_STATIC_SVC_DECLARE (TAO_AV_UDP_Flow_Factory)
+ACE_FACTORY_DECLARE (TAO_AV, TAO_AV_UDP_Flow_Factory)
+
+ACE_STATIC_SVC_DECLARE (TAO_AV_UDP_Factory)
+ACE_FACTORY_DECLARE (TAO_AV, TAO_AV_UDP_Factory)
+
+
+#if defined(__ACE_INLINE__)
+#include "orbsvcs/AV/UDP.i"
+#endif /* __ACE_INLINE__ */
+
+#include /**/ "ace/post.h"
+
+#endif /* TAO_AV_UDP_H */
diff --git a/TAO/orbsvcs/orbsvcs/AV/UDP.i b/TAO/orbsvcs/orbsvcs/AV/UDP.i
new file mode 100644
index 00000000000..72025b94dd5
--- /dev/null
+++ b/TAO/orbsvcs/orbsvcs/AV/UDP.i
@@ -0,0 +1,32 @@
+// -*- C++ -*-
+//
+// $Id$
+
+TAO_BEGIN_VERSIONED_NAMESPACE_DECL
+
+//----------------------------------------------------------------------
+// TAO_AV_UDP_Flow_Handler
+//----------------------------------------------------------------------
+
+ACE_INLINE
+const ACE_SOCK_Dgram *
+TAO_AV_UDP_Flow_Handler::get_socket (void) const
+{
+ return &this->sock_dgram_;
+}
+
+ACE_INLINE
+int
+TAO_AV_UDP_Flow_Handler::open (ACE_Addr &address)
+{
+ return this->sock_dgram_.open (address);
+}
+
+ACE_INLINE
+int
+TAO_AV_UDP_Flow_Handler::close (void)
+{
+ return this->sock_dgram_.close ();
+}
+
+TAO_END_VERSIONED_NAMESPACE_DECL
diff --git a/TAO/orbsvcs/orbsvcs/AV/default_resource.cpp b/TAO/orbsvcs/orbsvcs/AV/default_resource.cpp
new file mode 100644
index 00000000000..708bfd80308
--- /dev/null
+++ b/TAO/orbsvcs/orbsvcs/AV/default_resource.cpp
@@ -0,0 +1,107 @@
+// $Id$
+
+#include "orbsvcs/AV/default_resource.h"
+
+#include "tao/ORB_Core.h"
+#include "tao/debug.h"
+#include "ace/OS_NS_strings.h"
+
+TAO_BEGIN_VERSIONED_NAMESPACE_DECL
+
+TAO_AV_Default_Resource_Factory::TAO_AV_Default_Resource_Factory (void)
+{
+ if (TAO_debug_level > 0)
+ ACE_DEBUG ((LM_DEBUG,
+ "TAO_AV_Default_Resource_Factory::TAO_AV_Default_Resource_Factory %d\n"));
+}
+
+TAO_AV_Default_Resource_Factory::~TAO_AV_Default_Resource_Factory (void)
+{
+ TAO_AV_TransportFactorySetItor t_end = TAO_AV_CORE::instance ()->transport_factories ()->end ();
+ for (TAO_AV_TransportFactorySetItor tfiterator =
+ TAO_AV_CORE::instance ()->transport_factories ()->begin ();
+ tfiterator != t_end;
+ ++tfiterator)
+ delete *tfiterator;
+
+ TAO_AV_CORE::instance ()->transport_factories ()->reset ();
+
+ TAO_AV_Flow_ProtocolFactorySetItor fp_end = TAO_AV_CORE::instance ()->flow_protocol_factories ()->end ();
+ for (TAO_AV_Flow_ProtocolFactorySetItor pfiterator =
+ TAO_AV_CORE::instance ()->flow_protocol_factories ()->begin ();
+ pfiterator != fp_end;
+ ++pfiterator)
+ delete *pfiterator;
+
+ TAO_AV_CORE::instance ()->flow_protocol_factories ()->reset ();
+
+ if (TAO_debug_level > 0)
+ ACE_DEBUG ((LM_DEBUG,
+ "TAO_AV_Default_Resource_Factory::~TAO_AV_Default_Resource_Factory\n"));
+}
+
+int
+TAO_AV_Default_Resource_Factory::init (int argc, char *argv[])
+{
+ if (TAO_debug_level > 0)
+ ACE_DEBUG ((LM_DEBUG,
+ "TAO_AV_Default_Resource_Factory::init\n"));
+
+ int curarg = 0;
+
+ for (curarg = 0; curarg < argc; ++curarg)
+ {
+ if (ACE_OS::strcasecmp (argv[curarg],
+ "-AVTransportFactory") == 0)
+ {
+ TAO_AV_TransportFactorySet *tset = TAO_AV_CORE::instance ()->transport_factories ();
+ curarg++;
+ if (curarg < argc)
+ {
+ TAO_AV_Transport_Item *item = 0;
+ ACE_NEW_RETURN (item,
+ TAO_AV_Transport_Item (argv[curarg]),
+ -1);
+ if (tset->insert (item) == -1)
+ ACE_ERROR ((LM_ERROR,
+ ACE_TEXT ("(%P|%t) Unable to add transport factories for %s: %p\n"),
+ argv[curarg]));
+ }
+ }
+ else if (ACE_OS::strcasecmp (argv[curarg],
+ "-AVFlowProtocolFactory") == 0)
+ {
+ TAO_AV_Flow_ProtocolFactorySet *fpset = TAO_AV_CORE::instance ()->flow_protocol_factories ();
+ curarg++;
+ if (curarg < argc)
+ {
+ TAO_AV_Flow_Protocol_Item *item = 0;
+ ACE_NEW_RETURN (item,
+ TAO_AV_Flow_Protocol_Item (argv[curarg]),
+ -1);
+ if (fpset->insert (item) == -1)
+ ACE_ERROR ((LM_ERROR,
+ ACE_TEXT ("(%P|%t) Unable to add flow protocol factories for %s: %p\n"),
+ argv[curarg]));
+ }
+ }
+
+ }
+ return 0;
+}
+
+TAO_END_VERSIONED_NAMESPACE_DECL
+
+
+// ****************************************************************
+
+ACE_STATIC_SVC_DEFINE (TAO_AV_Default_Resource_Factory,
+ ACE_TEXT ("AV_Default_Resource_Factory"),
+ ACE_SVC_OBJ_T,
+ &ACE_SVC_NAME (TAO_AV_Default_Resource_Factory),
+ ACE_Service_Type::DELETE_THIS
+ | ACE_Service_Type::DELETE_OBJ,
+ 0)
+ACE_FACTORY_DEFINE (TAO_AV, TAO_AV_Default_Resource_Factory)
+
+// ****************************************************************
diff --git a/TAO/orbsvcs/orbsvcs/AV/default_resource.h b/TAO/orbsvcs/orbsvcs/AV/default_resource.h
new file mode 100644
index 00000000000..0bf2a7b930f
--- /dev/null
+++ b/TAO/orbsvcs/orbsvcs/AV/default_resource.h
@@ -0,0 +1,66 @@
+// -*- C++ -*-
+
+//=============================================================================
+/**
+ * @file default_resource.h
+ *
+ * $Id$
+ *
+ * @author Yamuna Krishnamurthy
+ */
+//=============================================================================
+
+
+#ifndef TAO_AV_DEFAULT_RESOURCE_H
+#define TAO_AV_DEFAULT_RESOURCE_H
+#include /**/ "ace/pre.h"
+
+#include "orbsvcs/AV/AVStreams_i.h"
+#include "orbsvcs/AV/Resource_Factory.h"
+
+#if !defined (ACE_LACKS_PRAGMA_ONCE)
+# pragma once
+#endif /* ACE_LACKS_PRAGMA_ONCE */
+
+#include "ace/Service_Config.h"
+
+TAO_BEGIN_VERSIONED_NAMESPACE_DECL
+
+/**
+ * @class TAO_AV_Default_Resource_Factory
+ *
+ * @brief TAO AV Streams default resource factory
+ * The AV Streams resource factory loads the
+ * pluggable transport and flow protocol factories
+ * in the corresponding factory sets.
+ *
+ *
+ */
+
+class TAO_AV_Export TAO_AV_Default_Resource_Factory
+ : public TAO_AV_Resource_Factory
+{
+public:
+
+ /// Constructor.
+ TAO_AV_Default_Resource_Factory (void);
+
+ /// Destructor.
+ virtual ~TAO_AV_Default_Resource_Factory (void);
+
+ /**
+ * @name Service Configurator Hooks
+ */
+ //@{
+ /// Dynamic linking hook
+ virtual int init (int argc, char *argv[]);
+
+};
+
+TAO_END_VERSIONED_NAMESPACE_DECL
+
+ACE_STATIC_SVC_DECLARE_EXPORT (TAO_AV, TAO_AV_Default_Resource_Factory)
+ACE_FACTORY_DECLARE (TAO_AV, TAO_AV_Default_Resource_Factory)
+
+#include /**/ "ace/post.h"
+#endif /* TAO_AV_DEFAULT_RESOURCE_H */
diff --git a/TAO/orbsvcs/orbsvcs/AV/global.h b/TAO/orbsvcs/orbsvcs/AV/global.h
new file mode 100644
index 00000000000..bcc4d2fa15a
--- /dev/null
+++ b/TAO/orbsvcs/orbsvcs/AV/global.h
@@ -0,0 +1,33 @@
+/* $Id$ */
+/* GLOBAL.H - RSAREF types and constants
+ */
+
+/* PROTOTYPES should be set to one if and only if the compiler supports
+ function argument prototyping.
+The following makes PROTOTYPES default to 0 if it has not already
+ been defined with C compiler flags.
+ */
+#ifndef PROTOTYPES
+#define PROTOTYPES 0
+#endif
+
+/* POINTER defines a generic pointer type */
+typedef unsigned char *POINTER;
+
+#if !defined(INTEGRITY)
+/* UINT2 defines a two byte word */
+typedef unsigned short int UINT2;
+
+/* UINT4 defines a four byte word */
+typedef unsigned long int UINT4;
+#endif
+
+/* PROTO_LIST is defined depending on how PROTOTYPES is defined above.
+If using PROTOTYPES, then PROTO_LIST returns the list, otherwise it
+ returns an empty list.
+ */
+#if PROTOTYPES
+#define PROTO_LIST(list) list
+#else
+#define PROTO_LIST(list) ()
+#endif
diff --git a/TAO/orbsvcs/orbsvcs/AV/md5.h b/TAO/orbsvcs/orbsvcs/AV/md5.h
new file mode 100644
index 00000000000..4bcb01b04b4
--- /dev/null
+++ b/TAO/orbsvcs/orbsvcs/AV/md5.h
@@ -0,0 +1,49 @@
+/* $Id$ */
+
+/* MD5.H - header file for MD5C.C
+ */
+
+/* Copyright (C) 1991-2, RSA Data Security, Inc. Created 1991. All
+rights reserved.
+
+License to copy and use this software is granted provided that it
+is identified as the "RSA Data Security, Inc. MD5 Message-Digest
+Algorithm" in all material mentioning or referencing this software
+or this function.
+
+License is also granted to make and use derivative works provided
+that such works are identified as "derived from the RSA Data
+Security, Inc. MD5 Message-Digest Algorithm" in all material
+mentioning or referencing the derived work.
+
+RSA Data Security, Inc. makes no representations concerning either
+the merchantability of this software or the suitability of this
+software for any particular purpose. It is provided "as is"
+without express or implied warranty of any kind.
+
+These notices must be retained in any copies of any part of this
+documentation and/or software.
+ */
+
+/* MD5 context. */
+typedef struct {
+ UINT4 state[4]; /* state (ABCD) */
+ UINT4 count[2]; /* number of bits, modulo 2^64 (lsb first) */
+ unsigned char buffer[64]; /* input buffer */
+} MD5_CTX;
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/* void MD5Init PROTO_LIST ((MD5_CTX *)); */
+void MD5Init (MD5_CTX *context);
+/* void MD5Update PROTO_LIST */
+/* ((MD5_CTX *, unsigned char *, unsigned int)); */
+void MD5Update (MD5_CTX *context, unsigned char *input, unsigned int inputLen);
+/* void MD5Final PROTO_LIST ((unsigned char [16], MD5_CTX *)); */
+void MD5Final (unsigned char digest[16], MD5_CTX *context);
+
+#ifdef __cplusplus
+}
+#endif
diff --git a/TAO/orbsvcs/orbsvcs/AV/md5c.cpp b/TAO/orbsvcs/orbsvcs/AV/md5c.cpp
new file mode 100644
index 00000000000..aa4a99f8fb3
--- /dev/null
+++ b/TAO/orbsvcs/orbsvcs/AV/md5c.cpp
@@ -0,0 +1,326 @@
+/* MD5C.C - RSA Data Security, Inc., MD5 message-digest algorithm
+ */
+
+/* Copyright (C) 1991-2, RSA Data Security, Inc. Created 1991. All
+rights reserved.
+
+License to copy and use this software is granted provided that it
+is identified as the "RSA Data Security, Inc. MD5 Message-Digest
+Algorithm" in all material mentioning or referencing this software
+or this function.
+
+License is also granted to make and use derivative works provided
+that such works are identified as "derived from the RSA Data
+Security, Inc. MD5 Message-Digest Algorithm" in all material
+mentioning or referencing the derived work.
+
+RSA Data Security, Inc. makes no representations concerning either
+the merchantability of this software or the suitability of this
+software for any particular purpose. It is provided "as is"
+without express or implied warranty of any kind.
+
+These notices must be retained in any copies of any part of this
+documentation and/or software.
+ */
+
+/* $Id$ */
+
+#include "orbsvcs/AV/global.h"
+#include "orbsvcs/AV/md5.h"
+
+/* Constants for MD5Transform routine.
+ */
+
+#define S11 7
+#define S12 12
+#define S13 17
+#define S14 22
+#define S21 5
+#define S22 9
+#define S23 14
+#define S24 20
+#define S31 4
+#define S32 11
+#define S33 16
+#define S34 23
+#define S41 6
+#define S42 10
+#define S43 15
+#define S44 21
+
+/*static void MD5Transform PROTO_LIST ((UINT4 [4], unsigned char [64]));
+static void Encode PROTO_LIST
+ ((unsigned char *, UINT4 *, unsigned int));
+static void Decode PROTO_LIST
+ ((UINT4 *, unsigned char *, unsigned int));
+static void MD5_memcpy PROTO_LIST ((POINTER, POINTER, unsigned int));
+static void MD5_memset PROTO_LIST ((POINTER, int, unsigned int));*/
+static void MD5Transform (UINT4 [4], unsigned char [64]);
+static void Encode (unsigned char *, UINT4 *, unsigned int);
+static void Decode (UINT4 *, unsigned char *, unsigned int);
+static void MD5_memcpy (POINTER, POINTER, unsigned int);
+static void MD5_memset (POINTER, int, unsigned int);
+
+static unsigned char PADDING[64] = {
+ 0x80, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0
+};
+
+/* F, G, H and I are basic MD5 functions.
+ */
+#define F(x, y, z) (((x) & (y)) | ((~x) & (z)))
+#define G(x, y, z) (((x) & (z)) | ((y) & (~z)))
+#define H(x, y, z) ((x) ^ (y) ^ (z))
+#define I(x, y, z) ((y) ^ ((x) | (~z)))
+
+/* ROTATE_LEFT rotates x left n bits.
+ */
+#define ROTATE_LEFT(x, n) (((x) << (n)) | ((x) >> (32-(n))))
+
+/* FF, GG, HH, and II transformations for rounds 1, 2, 3, and 4.
+Rotation is separate from addition to prevent recomputation.
+ */
+#define FF(a, b, c, d, x, s, ac) { \
+ (a) += F ((b), (c), (d)) + (x) + (UINT4)(ac); \
+ (a) = ROTATE_LEFT ((a), (s)); \
+ (a) += (b); \
+ }
+#define GG(a, b, c, d, x, s, ac) { \
+ (a) += G ((b), (c), (d)) + (x) + (UINT4)(ac); \
+ (a) = ROTATE_LEFT ((a), (s)); \
+ (a) += (b); \
+ }
+#define HH(a, b, c, d, x, s, ac) { \
+ (a) += H ((b), (c), (d)) + (x) + (UINT4)(ac); \
+ (a) = ROTATE_LEFT ((a), (s)); \
+ (a) += (b); \
+ }
+#define II(a, b, c, d, x, s, ac) { \
+ (a) += I ((b), (c), (d)) + (x) + (UINT4)(ac); \
+ (a) = ROTATE_LEFT ((a), (s)); \
+ (a) += (b); \
+ }
+
+/* MD5 initialization. Begins an MD5 operation, writing a new context.
+ */
+void MD5Init (MD5_CTX *context)
+{
+ context->count[0] = context->count[1] = 0;
+ /* Load magic initialization constants.
+*/
+ context->state[0] = 0x67452301;
+ context->state[1] = 0xefcdab89;
+ context->state[2] = 0x98badcfe;
+ context->state[3] = 0x10325476;
+}
+
+/* MD5 block update operation. Continues an MD5 message-digest
+ operation, processing another message block, and updating the
+ context.
+ */
+void MD5Update (MD5_CTX *context, unsigned char *input, unsigned int inputLen)
+{
+ unsigned int i, index, partLen;
+
+ /* Compute number of bytes mod 64 */
+ index = (unsigned int)((context->count[0] >> 3) & 0x3F);
+
+ /* Update number of bits */
+ if ((context->count[0] += ((UINT4)inputLen << 3))
+
+ < ((UINT4)inputLen << 3))
+ context->count[1]++;
+ context->count[1] += ((UINT4)inputLen >> 29);
+
+ partLen = 64 - index;
+
+ /* Transform as many times as possible.
+*/
+ if (inputLen >= partLen) {
+ MD5_memcpy
+ ((POINTER)&context->buffer[index], (POINTER)input, partLen);
+ MD5Transform (context->state, context->buffer);
+
+ for (i = partLen; i + 63 < inputLen; i += 64)
+ MD5Transform (context->state, &input[i]);
+
+ index = 0;
+ }
+ else
+ i = 0;
+
+ /* Buffer remaining input */
+ MD5_memcpy
+ ((POINTER)&context->buffer[index], (POINTER)&input[i],
+ inputLen-i);
+}
+
+/* MD5 finalization. Ends an MD5 message-digest operation, writing the
+ the message digest and zeroizing the context.
+ */
+void MD5Final (unsigned char digest[16], MD5_CTX *context)
+{
+ unsigned char bits[8];
+ unsigned int index, padLen;
+
+ /* Save number of bits */
+ Encode (bits, context->count, 8);
+
+ /* Pad out to 56 mod 64.
+*/
+ index = (unsigned int)((context->count[0] >> 3) & 0x3f);
+ padLen = (index < 56) ? (56 - index) : (120 - index);
+ MD5Update (context, PADDING, padLen);
+
+ /* Append length (before padding) */
+ MD5Update (context, bits, 8);
+
+ /* Store state in digest */
+ Encode (digest, context->state, 16);
+
+ /* Zeroize sensitive information.
+*/
+ MD5_memset ((POINTER)context, 0, sizeof (*context));
+}
+
+/* MD5 basic transformation. Transforms state based on block.
+ */
+static void MD5Transform (UINT4 state[4], unsigned char block[64])
+{
+ UINT4 a = state[0], b = state[1], c = state[2], d = state[3], x[16];
+
+ Decode (x, block, 64);
+
+ /* Round 1 */
+ FF (a, b, c, d, x[ 0], S11, 0xd76aa478); /* 1 */
+ FF (d, a, b, c, x[ 1], S12, 0xe8c7b756); /* 2 */
+ FF (c, d, a, b, x[ 2], S13, 0x242070db); /* 3 */
+ FF (b, c, d, a, x[ 3], S14, 0xc1bdceee); /* 4 */
+ FF (a, b, c, d, x[ 4], S11, 0xf57c0faf); /* 5 */
+ FF (d, a, b, c, x[ 5], S12, 0x4787c62a); /* 6 */
+ FF (c, d, a, b, x[ 6], S13, 0xa8304613); /* 7 */
+ FF (b, c, d, a, x[ 7], S14, 0xfd469501); /* 8 */
+ FF (a, b, c, d, x[ 8], S11, 0x698098d8); /* 9 */
+ FF (d, a, b, c, x[ 9], S12, 0x8b44f7af); /* 10 */
+ FF (c, d, a, b, x[10], S13, 0xffff5bb1); /* 11 */
+ FF (b, c, d, a, x[11], S14, 0x895cd7be); /* 12 */
+ FF (a, b, c, d, x[12], S11, 0x6b901122); /* 13 */
+ FF (d, a, b, c, x[13], S12, 0xfd987193); /* 14 */
+ FF (c, d, a, b, x[14], S13, 0xa679438e); /* 15 */
+ FF (b, c, d, a, x[15], S14, 0x49b40821); /* 16 */
+
+ /* Round 2 */
+ GG (a, b, c, d, x[ 1], S21, 0xf61e2562); /* 17 */
+ GG (d, a, b, c, x[ 6], S22, 0xc040b340); /* 18 */
+ GG (c, d, a, b, x[11], S23, 0x265e5a51); /* 19 */
+ GG (b, c, d, a, x[ 0], S24, 0xe9b6c7aa); /* 20 */
+ GG (a, b, c, d, x[ 5], S21, 0xd62f105d); /* 21 */
+ GG (d, a, b, c, x[10], S22, 0x2441453); /* 22 */
+ GG (c, d, a, b, x[15], S23, 0xd8a1e681); /* 23 */
+ GG (b, c, d, a, x[ 4], S24, 0xe7d3fbc8); /* 24 */
+ GG (a, b, c, d, x[ 9], S21, 0x21e1cde6); /* 25 */
+ GG (d, a, b, c, x[14], S22, 0xc33707d6); /* 26 */
+ GG (c, d, a, b, x[ 3], S23, 0xf4d50d87); /* 27 */
+
+ GG (b, c, d, a, x[ 8], S24, 0x455a14ed); /* 28 */
+ GG (a, b, c, d, x[13], S21, 0xa9e3e905); /* 29 */
+ GG (d, a, b, c, x[ 2], S22, 0xfcefa3f8); /* 30 */
+ GG (c, d, a, b, x[ 7], S23, 0x676f02d9); /* 31 */
+ GG (b, c, d, a, x[12], S24, 0x8d2a4c8a); /* 32 */
+
+ /* Round 3 */
+ HH (a, b, c, d, x[ 5], S31, 0xfffa3942); /* 33 */
+ HH (d, a, b, c, x[ 8], S32, 0x8771f681); /* 34 */
+ HH (c, d, a, b, x[11], S33, 0x6d9d6122); /* 35 */
+ HH (b, c, d, a, x[14], S34, 0xfde5380c); /* 36 */
+ HH (a, b, c, d, x[ 1], S31, 0xa4beea44); /* 37 */
+ HH (d, a, b, c, x[ 4], S32, 0x4bdecfa9); /* 38 */
+ HH (c, d, a, b, x[ 7], S33, 0xf6bb4b60); /* 39 */
+ HH (b, c, d, a, x[10], S34, 0xbebfbc70); /* 40 */
+ HH (a, b, c, d, x[13], S31, 0x289b7ec6); /* 41 */
+ HH (d, a, b, c, x[ 0], S32, 0xeaa127fa); /* 42 */
+ HH (c, d, a, b, x[ 3], S33, 0xd4ef3085); /* 43 */
+ HH (b, c, d, a, x[ 6], S34, 0x4881d05); /* 44 */
+ HH (a, b, c, d, x[ 9], S31, 0xd9d4d039); /* 45 */
+ HH (d, a, b, c, x[12], S32, 0xe6db99e5); /* 46 */
+ HH (c, d, a, b, x[15], S33, 0x1fa27cf8); /* 47 */
+ HH (b, c, d, a, x[ 2], S34, 0xc4ac5665); /* 48 */
+
+ /* Round 4 */
+ II (a, b, c, d, x[ 0], S41, 0xf4292244); /* 49 */
+ II (d, a, b, c, x[ 7], S42, 0x432aff97); /* 50 */
+ II (c, d, a, b, x[14], S43, 0xab9423a7); /* 51 */
+ II (b, c, d, a, x[ 5], S44, 0xfc93a039); /* 52 */
+ II (a, b, c, d, x[12], S41, 0x655b59c3); /* 53 */
+ II (d, a, b, c, x[ 3], S42, 0x8f0ccc92); /* 54 */
+ II (c, d, a, b, x[10], S43, 0xffeff47d); /* 55 */
+ II (b, c, d, a, x[ 1], S44, 0x85845dd1); /* 56 */
+ II (a, b, c, d, x[ 8], S41, 0x6fa87e4f); /* 57 */
+ II (d, a, b, c, x[15], S42, 0xfe2ce6e0); /* 58 */
+ II (c, d, a, b, x[ 6], S43, 0xa3014314); /* 59 */
+ II (b, c, d, a, x[13], S44, 0x4e0811a1); /* 60 */
+ II (a, b, c, d, x[ 4], S41, 0xf7537e82); /* 61 */
+ II (d, a, b, c, x[11], S42, 0xbd3af235); /* 62 */
+ II (c, d, a, b, x[ 2], S43, 0x2ad7d2bb); /* 63 */
+ II (b, c, d, a, x[ 9], S44, 0xeb86d391); /* 64 */
+
+ state[0] += a;
+ state[1] += b;
+ state[2] += c;
+ state[3] += d;
+
+ /* Zeroize sensitive information.
+
+*/
+ MD5_memset ((POINTER)x, 0, sizeof (x));
+}
+
+/* Encodes input (UINT4) into output (unsigned char). Assumes len is
+ a multiple of 4.
+ */
+static void Encode (unsigned char *output, UINT4 *input, unsigned int len)
+{
+ unsigned int i, j;
+
+ for (i = 0, j = 0; j < len; i++, j += 4) {
+ output[j] = (unsigned char)(input[i] & 0xff);
+ output[j+1] = (unsigned char)((input[i] >> 8) & 0xff);
+ output[j+2] = (unsigned char)((input[i] >> 16) & 0xff);
+ output[j+3] = (unsigned char)((input[i] >> 24) & 0xff);
+ }
+}
+
+/* Decodes input (unsigned char) into output (UINT4). Assumes len is
+ a multiple of 4.
+ */
+static void Decode (UINT4 *output, unsigned char *input, unsigned int len)
+{
+ unsigned int i, j;
+
+ for (i = 0, j = 0; j < len; i++, j += 4)
+ output[i] = ((UINT4)input[j]) | (((UINT4)input[j+1]) << 8) |
+ (((UINT4)input[j+2]) << 16) | (((UINT4)input[j+3]) << 24);
+}
+
+/* Note: Replace "for loop" with standard memcpy if possible.
+ */
+
+static void MD5_memcpy (POINTER output, POINTER input, unsigned int len)
+{
+ unsigned int i;
+
+ for (i = 0; i < len; i++)
+
+ output[i] = input[i];
+}
+
+/* Note: Replace "for loop" with standard memset if possible.
+ */
+static void MD5_memset (POINTER output, int value, unsigned int len)
+{
+ unsigned int i;
+
+ for (i = 0; i < len; i++)
+ ((char *)output)[i] = (char)value;
+}
diff --git a/TAO/orbsvcs/orbsvcs/AV/media_timer.cpp b/TAO/orbsvcs/orbsvcs/AV/media_timer.cpp
new file mode 100644
index 00000000000..1a5b9cd1e42
--- /dev/null
+++ b/TAO/orbsvcs/orbsvcs/AV/media_timer.cpp
@@ -0,0 +1,95 @@
+//$Id$
+/*
+ * Copyright (c) 1995 Regents of the University of California.
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in the
+ * documentation and/or other materials provided with the distribution.
+ * 3. All advertising materials mentioning features or use of this software
+ * must display the following acknowledgement:
+ * This product includes software developed by the Computer Systems
+ * Engineering Group at Lawrence Berkeley Laboratory.
+ * 4. Neither the name of the University nor of the Laboratory may be used
+ * to endorse or promote products derived from this software without
+ * specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
+ * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
+ * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+ * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+ * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGE.
+ */
+
+/*
+static const char rcsid[] =
+ "@(#) $Header$";
+*/
+
+#include "orbsvcs/AV/media_timer.h"
+#include "ace/Time_Value.h"
+#include "ace/OS_NS_sys_time.h"
+#include "ace/OS_NS_stdlib.h"
+
+TAO_BEGIN_VERSIONED_NAMESPACE_DECL
+
+MediaTimer* MediaTimer::instance_;
+
+MediaTimer::MediaTimer()
+{
+ instance_ = this;
+ offset_ = ACE_OS::rand ();
+}
+
+MediaTimer::~MediaTimer()
+{
+ instance_ = 0;
+}
+
+/*
+ * Default media timestamp -- convert unix system clock
+ * into a 90Khz timestamp. Grabbers override this virtual
+ * method if they can provide their own time base.
+ *
+ * XXX
+ * We save the corresponding unix time stamp to handle the
+ * unix_ts() call the transmitter will make to get the correspondence
+ * between the media timestamp & unix time.
+ */
+ACE_UINT32 MediaTimer::media_ts()
+{
+ //timeval tv;
+ ACE_Time_Value tv = ACE_OS::gettimeofday();
+ ACE_UINT32 u = tv.usec ();
+ u = (u << 3) + u; /* x 9 */
+ /* sec * 90Khz + (usec * 90Khz) / 1e6 */
+ u = tv.sec () * 90000 + (u / 100);
+ return (u + offset_);
+}
+
+/*
+ * compute media time corresponding to the current unix time.
+ * in this generic routine, this is the same as media_ts() but,
+ * if a grabber has hardware or kernel timestamping, this routine
+ * must compute the correspondence between the hardware timestamp
+ * and the unix clock and appropriately offset the timestamp to
+ * correspond to the current clock. (This information if vital
+ * for cross-media synchronization.)
+ */
+ACE_UINT32 MediaTimer::ref_ts()
+{
+ return (media_ts());
+}
+
+TAO_END_VERSIONED_NAMESPACE_DECL
diff --git a/TAO/orbsvcs/orbsvcs/AV/media_timer.h b/TAO/orbsvcs/orbsvcs/AV/media_timer.h
new file mode 100644
index 00000000000..e7e060d5cb4
--- /dev/null
+++ b/TAO/orbsvcs/orbsvcs/AV/media_timer.h
@@ -0,0 +1,69 @@
+// -*- C++ -*-
+
+// $Id$
+
+/*
+ * Copyright (c) 1995 Regents of the University of California.
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in the
+ * documentation and/or other materials provided with the distribution.
+ * 3. All advertising materials mentioning features or use of this software
+ * must display the following acknowledgement:
+ * This product includes software developed by the Computer Systems
+ * Engineering Group at Lawrence Berkeley Laboratory.
+ * 4. Neither the name of the University nor of the Laboratory may be used
+ * to endorse or promote products derived from this software without
+ * specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
+ * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
+ * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+ * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+ * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGE.
+ *
+ * @(#) $Header$
+ */
+
+#ifndef TAO_AV_MEDIA_TIMER_H
+#define TAO_AV_MEDIA_TIMER_H
+#include /**/ "ace/pre.h"
+
+#include "tao/orbconf.h"
+#include "tao/Versioned_Namespace.h"
+
+//long random (void);
+
+TAO_BEGIN_VERSIONED_NAMESPACE_DECL
+
+class MediaTimer
+{
+ public:
+ MediaTimer();
+ virtual ~MediaTimer();
+ static inline MediaTimer* instance() { return (instance_); }
+ virtual ACE_UINT32 media_ts();
+ virtual ACE_UINT32 ref_ts();
+ inline ACE_UINT32 offset() const { return (offset_); }
+ private:
+ static MediaTimer* instance_;
+ protected:
+ ACE_UINT32 offset_; /* random offset */
+};
+
+TAO_END_VERSIONED_NAMESPACE_DECL
+
+#include /**/ "ace/post.h"
+#endif /* TAO_AV_MEDIA_TIMER_H */
diff --git a/TAO/orbsvcs/orbsvcs/AV/ntp-time.h b/TAO/orbsvcs/orbsvcs/AV/ntp-time.h
new file mode 100644
index 00000000000..11dcd720911
--- /dev/null
+++ b/TAO/orbsvcs/orbsvcs/AV/ntp-time.h
@@ -0,0 +1,97 @@
+// -*- C++ -*-
+
+// $Id$
+/*
+ * Copyright (c) 1995 The Regents of the University of California.
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in the
+ * documentation and/or other materials provided with the distribution.
+ * 3. All advertising materials mentioning features or use of this software
+ * must display the following acknowledgement:
+ * This product includes software developed by the Network Research
+ * Group at Lawrence Berkeley National Laboratory.
+ * 4. Neither the name of the University nor of the Laboratory may be used
+ * to endorse or promote products derived from this software without
+ * specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
+ * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
+ * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+ * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+ * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGE.
+ */
+
+#ifndef TAO_AV_NTP_TIME_H
+#define TAO_AV_NTP_TIME_H
+#include /**/ "ace/pre.h"
+
+#include "orbsvcs/AV/RTCP.h"
+
+/*
+ * convert microseconds to fraction of second * 2^32 (i.e., the lsw of
+ * a 64-bit ntp timestamp). This routine uses the factorization
+ * 2^32/10^6 = 4096 + 256 - 1825/32 which results in a max conversion
+ * error of 3 * 10^-7 and an average error of half that.
+ */
+ACE_INLINE u_int usec2ntp(u_int usec)
+{
+ u_int const t = (usec * 1825) >> 5;
+ return ((usec << 12) + (usec << 8) - t);
+}
+
+/*
+ * Number of seconds between 1-Jan-1900 and 1-Jan-1970
+ */
+const ACE_UINT32 GETTIMEOFDAY_TO_NTP_OFFSET = 2208988800U;
+
+/*
+ * Return a 64-bit ntp timestamp (UTC time relative to Jan 1, 1970).
+ * gettimeofday conveniently gives us the correct reference -- we just
+ * need to convert sec+usec to a 64-bit fixed point (with binary point
+ * at bit 32).
+ */
+ACE_INLINE TAO_AV_RTCP::ntp64
+ntp64time (timeval tv)
+{
+ TAO_AV_RTCP::ntp64 n;
+ n.upper = (u_int)tv.tv_sec + GETTIMEOFDAY_TO_NTP_OFFSET;
+ n.lower = usec2ntp((u_int)tv.tv_usec);
+ return (n);
+}
+
+ACE_INLINE ACE_UINT32
+ntptime (timeval t)
+{
+ u_int s = (u_int)t.tv_sec + GETTIMEOFDAY_TO_NTP_OFFSET;
+ return (s << 16 | usec2ntp((u_int)t.tv_usec) >> 16);
+}
+
+ACE_INLINE ACE_UINT32
+ntptime()
+{
+ //
+ ACE_Time_Value tim_v = ACE_OS::gettimeofday();
+ //struct timeval tv = (timeval) tim_v;
+ return (ntptime ((timeval) tim_v));
+}
+
+ACE_INLINE timeval unixtime()
+{
+ ACE_Time_Value tv = ACE_OS::gettimeofday();
+ return ((timeval) tv);
+}
+#include /**/ "ace/post.h"
+#endif /* TAO_AV_NTP_TIME_H */
diff --git a/TAO/orbsvcs/orbsvcs/AV/sfp.cpp b/TAO/orbsvcs/orbsvcs/AV/sfp.cpp
new file mode 100644
index 00000000000..2f3d578b3a4
--- /dev/null
+++ b/TAO/orbsvcs/orbsvcs/AV/sfp.cpp
@@ -0,0 +1,1336 @@
+// $Id$
+
+#include "orbsvcs/AV/sfp.h"
+#include "tao/debug.h"
+#include "ace/ARGV.h"
+#include "ace/OS_NS_strings.h"
+
+TAO_BEGIN_VERSIONED_NAMESPACE_DECL
+
+// default arguments to pass to use for the ORB
+const char TAO_SFP_Base::TAO_SFP_ORB_ARGUMENTS[] = "-ORBObjRefStyle URL";
+
+// SFP magic numbers
+const char TAO_SFP_Base::TAO_SFP_MAGIC_NUMBER[] = "=SFP";
+const char TAO_SFP_Base::TAO_SFP_FRAGMENT_MAGIC_NUMBER[] = "FRAG";
+const char TAO_SFP_Base::TAO_SFP_START_MAGIC_NUMBER[] = "=STA";
+const char TAO_SFP_Base::TAO_SFP_CREDIT_MAGIC_NUMBER[] = "=CRE";
+const char TAO_SFP_Base::TAO_SFP_STARTREPLY_MAGIC_NUMBER[] = "=STR";
+
+// SFP version 1.0
+const unsigned char TAO_SFP_Base::TAO_SFP_MAJOR_VERSION = 1;
+const unsigned char TAO_SFP_Base::TAO_SFP_MINOR_VERSION = 0;
+
+// lengths of various SFP headers
+const unsigned char TAO_SFP_Base::TAO_SFP_FRAME_HEADER_LEN = 12;
+const unsigned char TAO_SFP_Base::TAO_SFP_MESSAGE_SIZE_OFFSET = 8;
+const unsigned char TAO_SFP_Base::TAO_SFP_FRAGMENT_SIZE_OFFSET = 16;
+
+u_int TAO_SFP_Base::frame_header_len;
+u_int TAO_SFP_Base::start_reply_len;
+u_int TAO_SFP_Base::start_len;
+u_int TAO_SFP_Base::credit_len;
+u_int TAO_SFP_Base::fragment_len;
+
+bool
+operator< (const TAO_SFP_Fragment_Node& left,
+ const TAO_SFP_Fragment_Node& right)
+{
+ return left.fragment_info_.frag_number < right.fragment_info_.frag_number;
+}
+
+
+//------------------------------------------------------------
+// TAO_SFP_Base
+//------------------------------------------------------------
+
+TAO_SFP_Base::TAO_SFP_Base (void)
+{
+ TAO_OutputCDR output_cdr;
+ flowProtocol::frameHeader frame_header;
+ flowProtocol::fragment fragment;
+ flowProtocol::credit credit;
+ flowProtocol::Start start;
+ flowProtocol::StartReply start_reply;
+
+ // fill in the default frameHeader fields.
+ frame_header.magic_number [0] = '=';
+ frame_header.magic_number [1] = 'S';
+ frame_header.magic_number [2] = 'F';
+ frame_header.magic_number [3] = 'P';
+ frame_header.flags = TAO_ENCAP_BYTE_ORDER;
+ output_cdr.reset ();
+ if (!(output_cdr << frame_header))
+ {
+ ACE_ERROR ((LM_ERROR, "TAO_SFP constructor\n"));
+ return;
+ }
+
+ frame_header_len = static_cast<u_int> (output_cdr.total_length ());
+ // fill in the default fragment message fields.
+ fragment.magic_number [0] = 'F';
+ fragment.magic_number [1] = 'R';
+ fragment.magic_number [2] = 'A';
+ fragment.magic_number [3] = 'G';
+ output_cdr.reset ();
+ if (!(output_cdr << fragment))
+ {
+ ACE_ERROR ((LM_ERROR, "TAO_SFP constructor\n"));
+ return;
+ }
+
+ fragment_len = static_cast<u_int> (output_cdr.total_length ());
+ // fill in the default Start message fields.
+ start.magic_number [0] = '=';
+ start.magic_number [1] = 'S';
+ start.magic_number [2] = 'T';
+ start.magic_number [3] = 'A';
+ start.major_version = TAO_SFP_Base::TAO_SFP_MAJOR_VERSION;
+ start.minor_version = TAO_SFP_Base::TAO_SFP_MINOR_VERSION;
+ start.flags = 0;
+ output_cdr.reset ();
+ if (!(output_cdr << start))
+ {
+ ACE_ERROR ((LM_ERROR, "TAO_SFP constructor\n"));
+ return;
+ }
+
+ start_len = static_cast<u_int> (output_cdr.total_length ());
+ // fill in the default StartReply message fields.
+ start_reply.magic_number [0] = '=';
+ start_reply.magic_number [1] = 'S';
+ start_reply.magic_number [2] = 'T';
+ start_reply.magic_number [3] = 'R';
+ start_reply.flags = 0;
+ output_cdr.reset ();
+ if (!(output_cdr << start_reply))
+ {
+ ACE_ERROR ((LM_ERROR, "TAO_SFP constructor\n"));
+ return;
+ }
+
+ start_reply_len = static_cast<u_int> (output_cdr.total_length ());
+
+ // fill in the default Credit message fields.
+ credit.magic_number [0] = '=';
+ credit.magic_number [1] = 'C';
+ credit.magic_number [2] = 'R';
+ credit.magic_number [3] = 'E';
+ output_cdr.reset ();
+
+ if (!(output_cdr << credit))
+ {
+ ACE_ERROR ((LM_ERROR, "TAO_SFP constructor\n"));
+ return;
+ }
+ credit_len = static_cast<u_int> (output_cdr.total_length ());
+}
+
+int
+TAO_SFP_Base::handle_input (TAO_AV_Transport *transport,
+ TAO_SFP_Frame_State &state,
+ TAO_AV_frame_info *&frame_info)
+{
+ int result;
+ flowProtocol::MsgType msg_type;
+ result = TAO_SFP_Base::peek_message_type (transport,
+ msg_type);
+ if (result < 0)
+ return result;
+ // TAO_InputCDR &input = state.cdr;
+ switch (msg_type)
+ {
+ case flowProtocol::SimpleFrame_Msg:
+ case flowProtocol::Frame_Msg:
+ {
+ result = TAO_SFP_Base::peek_frame_header (transport,
+ state.frame_header_,
+ state.cdr);
+ if (result < 0)
+ return result;
+ int result =TAO_SFP_Base::read_frame (transport,
+ state.frame_header_,
+ state,
+ frame_info);
+ if (result < 0)
+ return result;
+ break;
+ }
+ case flowProtocol::Fragment_Msg:
+ {
+ result = TAO_SFP_Base::peek_fragment_header (transport,
+ state.fragment_,
+ state.cdr);
+ if (result < 0)
+ return result;
+ if (TAO_debug_level > 0) ACE_DEBUG ((LM_DEBUG,"Fragment received\n"));
+ result = TAO_SFP_Base::read_fragment (transport,
+ state.fragment_,
+ state,
+ frame_info);
+ if (result < 0)
+ return result;
+ break;
+ }
+ case flowProtocol::EndofStream_Msg:
+ {
+ result = TAO_SFP_Base::read_endofstream_message (transport,
+ state.frame_header_,
+ state.cdr);
+ if (result < 0)
+ return result;
+ break;
+ }
+ default:
+ break;
+ }
+ return 0;
+}
+
+int
+TAO_SFP_Base::read_frame (TAO_AV_Transport *transport,
+ flowProtocol::frameHeader &frame_header,
+ TAO_SFP_Frame_State &state,
+ TAO_AV_frame_info *&frame_info)
+{
+ ACE_Message_Block *message_block = 0;
+ int result = -1;
+
+ if (TAO_debug_level > 0)
+ ACE_DEBUG ((LM_DEBUG,"Reading simple frame\n"));
+ // Check to see what the length of the message is.
+ int byte_order = frame_header.flags & 0x1;
+ int message_len = frame_header.message_size;
+
+// ACE_NEW_RETURN (message_block,
+// ACE_Message_Block (message_len),
+// 0);
+ state.static_frame_.rd_ptr (state.static_frame_.base ());
+ state.static_frame_.wr_ptr (state.static_frame_.base ());
+ int n = transport->recv (state.static_frame_.rd_ptr (),message_len);
+ if (n == -1)
+ ACE_ERROR_RETURN ((LM_ERROR,"SFP::handle_input -peek"),0);
+ else if (n==0)
+ ACE_ERROR_RETURN ((LM_ERROR,"SFP::handle_input -peek"),0);
+ else if (n != message_len)
+ ACE_ERROR_RETURN ((LM_ERROR,"SFP::read_simple_frame:message truncated\n"),0);
+ message_block = &state.static_frame_;
+ // print the buffer.
+ // this->dump_buf (message,n);
+ // skip over the frame header.
+ message_block->rd_ptr (frame_header_len);
+ message_block->wr_ptr (n);
+ CORBA::ULong ssrc = 0;
+ TAO_SFP_Fragment_Table_Entry *fragment_entry = 0;
+ if (frame_header.flags & 0x2)
+ {
+ if (TAO_debug_level > 0)
+ ACE_DEBUG ((LM_DEBUG,"fragmented frame:0th fragment\n"));
+ state.more_fragments_ = 1;
+ ACE_Message_Block *data = 0;
+ switch (frame_header.message_type)
+ {
+ case flowProtocol::Frame_Msg:
+ {
+ // read the frame info.
+ ACE_Message_Block frame_info_mb (message_len-frame_header_len+ACE_CDR::MAX_ALIGNMENT);
+ ACE_CDR::mb_align (&frame_info_mb);
+ frame_info_mb.copy (message_block->rd_ptr (),
+ message_block->length ());
+ // print the buffer.
+ // this->dump_buf (message_block->rd_ptr (),16);
+ TAO_InputCDR frame_info_cdr (&frame_info_mb,byte_order);
+ frame_info_cdr >> state.frame_;
+ if (TAO_debug_level > 0)
+ ACE_DEBUG ((LM_DEBUG,
+ "frame.timestamp = %d, "
+ "frame.synchsource = %d, "
+ "frame.sequence_num = %d\n",
+ state.frame_.timestamp,
+ state.frame_.synchSource,
+ state.frame_.sequence_num));
+ ssrc = state.frame_.synchSource;
+ // The remaining message in the CDR stream is the fragment
+ // data for frag.0
+ data = frame_info_cdr.start ()->clone ();
+ break;
+ }
+ case flowProtocol::SimpleFrame_Msg:
+ {
+ data = message_block->clone ();
+ break;
+ }
+ case flowProtocol::SequencedFrame_Msg:
+ break;
+ case flowProtocol::SpecialFrame_Msg:
+ break;
+ }
+ if (TAO_debug_level > 0)
+ ACE_DEBUG ((LM_DEBUG,"Length of 0th fragment= %d\n",data->length ()));
+ TAO_SFP_Fragment_Table *fragment_table = 0;
+ result = state.fragment_table_map_.find (ssrc,fragment_table);
+ if (result != 0)
+ {
+ ACE_NEW_RETURN (fragment_table,
+ TAO_SFP_Fragment_Table,
+ -1);
+ result = state.fragment_table_map_.bind (ssrc,fragment_table);
+ if (result < 0)
+ ACE_ERROR_RETURN ((LM_ERROR,
+ "TAO_SFP_Base::read_frame: "
+ "fragment_table_map:bind failed\n"),-1);
+ }
+
+ TAO_SFP_Fragment_Node *new_node;
+ ACE_NEW_RETURN (new_node,
+ TAO_SFP_Fragment_Node,
+ 0);
+ new_node->fragment_info_.frag_sz = static_cast<CORBA::ULong> (data->length ());
+ new_node->fragment_info_.frag_number = 0;
+ if (state.frame_.source_ids.length () > 0)
+ new_node->fragment_info_.source_id = state.frame_.source_ids [0];
+ else
+ new_node->fragment_info_.source_id = 0;
+ new_node->data_ = data;
+ // TAO_SFP_Base::dump_buf (data->rd_ptr (),data->length ());
+ if (fragment_table->find (state.frame_.sequence_num,fragment_entry) == 0)
+ {
+ // This case can happen where a nth (n > 0)fragment is
+ // received before the 0th fragment.
+ if (TAO_debug_level > 0)
+ ACE_DEBUG ((LM_DEBUG,
+ "fragment table entry found for 0th fragment:\n"));
+ result = fragment_entry->fragment_set_.insert (*new_node);
+ if (result != 0)
+ ACE_ERROR_RETURN ((LM_ERROR,
+ "insert for 0th fragment failed\n"),0);
+ // enter the frame info.
+
+ // check if all the fragments have been received.
+ state.frame_block_ =
+ TAO_SFP_Base::check_all_fragments (fragment_entry);
+ if (state.frame_block_ != 0)
+ state.more_fragments_ = 0;
+ }
+ else
+ {
+ if (TAO_debug_level > 0)
+ ACE_DEBUG ((LM_DEBUG,
+ "fragment table entry not found for 0th fragment\n"));
+ TAO_SFP_Fragment_Table_Entry *new_entry;
+ ACE_NEW_RETURN (new_entry,
+ TAO_SFP_Fragment_Table_Entry,
+ 0);
+ result = new_entry->fragment_set_.insert (*new_node);
+ if (result != 0)
+ ACE_ERROR_RETURN ((LM_ERROR,"insert for 0th fragment failed\n"),0);
+ fragment_entry = new_entry;
+ // not found. so bind a new entry.
+ result = fragment_table->bind (state.frame_.sequence_num,new_entry);
+ if (result != 0)
+ ACE_ERROR_RETURN ((LM_ERROR,"fragment table bind failed\n"),0);
+ if (frame_header.message_type & 4 )
+ fragment_entry->frame_info.boundary_marker = 1;
+ switch (frame_header.message_type)
+ {
+ case flowProtocol::Frame_Msg:
+ fragment_entry->frame_info.ssrc = state.frame_.synchSource;
+ fragment_entry->frame_info.timestamp = state.frame_.timestamp;
+ fragment_entry->frame_info.sequence_num = state.frame_.sequence_num;
+ break;
+ case flowProtocol::SimpleFrame_Msg:
+ fragment_entry->frame_info.ssrc =
+ fragment_entry->frame_info.timestamp =
+ fragment_entry->frame_info.sequence_num = 0;
+ break;
+ }
+ return 0;
+ }
+ }
+ else
+ {
+ state.more_fragments_ = 0;
+ state.frame_block_ = message_block;
+ }
+ if (state.more_fragments_ == 0)
+ {
+ if (fragment_entry != 0)
+ {
+ ACE_NEW_RETURN (frame_info,
+ TAO_AV_frame_info,
+ -1);
+ *frame_info = fragment_entry->frame_info;
+ }
+ }
+ return 0;
+}
+
+int
+TAO_SFP_Base::read_fragment (TAO_AV_Transport *transport,
+ flowProtocol::fragment &fragment,
+ TAO_SFP_Frame_State &state,
+ TAO_AV_frame_info *&frame_info)
+{
+ TAO_SFP_Fragment_Table_Entry *fragment_entry = 0;
+ int result = -1;
+
+ if (TAO_debug_level > 0) ACE_DEBUG ((LM_DEBUG,"frag_number = %d, frag_size = %d,source_id = %d sequnce_num = %d\n",
+ fragment.frag_number,fragment.frag_sz,fragment.source_id,fragment.sequence_num));
+
+ ACE_Message_Block *data;
+ ACE_NEW_RETURN (data,
+ ACE_Message_Block(fragment.frag_sz),
+ -1);
+
+ // Read the fragment.
+ int n = transport->recv (data->wr_ptr (),fragment.frag_sz);
+ if ((n == -1) || (n==0))
+ ACE_ERROR_RETURN ((LM_ERROR,"TAO_SFP::read_fragment:%p",""),-1);
+ // move past the fragment header.
+ data->rd_ptr (fragment_len);
+ data->wr_ptr (n);
+ // TAO_SFP_Base::dump_buf (data->rd_ptr (),data->length ());
+ if (TAO_debug_level > 0) ACE_DEBUG ((LM_DEBUG,"length of %dth fragment is: %d\n",
+ fragment.frag_number,
+ data->length ()));
+
+ TAO_SFP_Fragment_Node *new_node;
+ ACE_NEW_RETURN (new_node,
+ TAO_SFP_Fragment_Node,
+ -1);
+ new_node->fragment_info_ = fragment;
+ new_node->data_ = data;
+ TAO_SFP_Fragment_Table *fragment_table = 0;
+ result = state.fragment_table_map_.find (fragment.source_id,fragment_table);
+ if (result != 0)
+ {
+ ACE_NEW_RETURN (fragment_table,
+ TAO_SFP_Fragment_Table,
+ -1);
+ result = state.fragment_table_map_.bind (fragment.source_id,fragment_table);
+ if (result < 0)
+ ACE_ERROR_RETURN ((LM_ERROR,"TAO_SFP_Base::read_fragment:fragment_table_map:bind failed\n"),-1);
+ }
+ if (fragment_table->find (fragment.sequence_num,fragment_entry) == 0)
+ {
+ // Already an entry exists. Traverse the list and insert it at the right place.
+ result = fragment_entry->fragment_set_.insert (*new_node);
+ if (result != 0)
+ ACE_ERROR_RETURN ((LM_ERROR,"insert for %dth node failed\n",fragment.frag_number),-1);
+ // check if all the fragments have been received.
+ }
+ else
+ {
+ ACE_NEW_RETURN (fragment_entry,
+ TAO_SFP_Fragment_Table_Entry,
+ -1);
+ fragment_entry->fragment_set_.insert (*new_node);
+ // bind a new entry for this sequence number.
+ result = fragment_table->bind (fragment.sequence_num,fragment_entry);
+ if (result != 0)
+ ACE_ERROR_RETURN ((LM_ERROR,"bind for %dth fragment failed\n",
+ fragment.frag_number),-1);
+ }
+ if (!(fragment.flags & 0x2))
+ {
+ if (TAO_debug_level > 0) ACE_DEBUG ((LM_DEBUG,"Last fragment received\n"));
+ // if bit 1 is not set then there are
+ // no more fragments.
+ fragment_entry->last_received_ = 1;
+ // since fragment number starts from 0 to n-1 we add 1.
+ fragment_entry->num_fragments_ = fragment.frag_number + 1;
+ }
+
+
+ state.frame_block_ = check_all_fragments (fragment_entry);
+ if (state.frame_block_ != 0)
+ {
+ state.more_fragments_ = 0;
+ ACE_NEW_RETURN (frame_info,
+ TAO_AV_frame_info,
+ -1);
+ *frame_info = fragment_entry->frame_info;
+ }
+ return 0;
+}
+
+ACE_Message_Block*
+TAO_SFP_Base::check_all_fragments (TAO_SFP_Fragment_Table_Entry *fragment_entry)
+{
+ if (TAO_debug_level > 0) ACE_DEBUG ((LM_DEBUG,"table size: %d, num_fragments: %d\n",fragment_entry->fragment_set_.size (),fragment_entry->num_fragments_));
+ // check to see if all the frames have been received.
+ if (fragment_entry->fragment_set_.size () == fragment_entry->num_fragments_)
+ {
+ if (TAO_debug_level > 0) ACE_DEBUG ((LM_DEBUG,"all fragments have been received\n"));
+ // all the fragments have been received
+ // we can now chain the ACE_Message_Blocks in the fragment_set_ and then return them
+ // back.
+ ACE_Message_Block *frame = 0,*head = 0;
+ FRAGMENT_SET_ITERATOR frag_iterator (fragment_entry->fragment_set_);
+ TAO_SFP_Fragment_Node *node;
+ for (;frag_iterator.next (node) != 0;frag_iterator.advance ())
+ {
+ if (!head)
+ head = frame = node->data_;
+ else
+ {
+ frame->cont (node->data_);
+ frame = node->data_;
+ }
+ }
+ return head;
+ }
+ return 0;
+}
+
+CORBA::Boolean
+TAO_SFP_Base::start_frame (CORBA::Octet flags,
+ flowProtocol::MsgType type,
+ TAO_OutputCDR &msg)
+{
+ msg.reset ();
+ flowProtocol::frameHeader frame_header;
+
+ frame_header.magic_number [0] = '=';
+ frame_header.magic_number [1] = 'S';
+ frame_header.magic_number [2] = 'F';
+ frame_header.magic_number [3] = 'P';
+ frame_header.flags = flags;
+ frame_header.message_type = static_cast<CORBA::Octet> (type);
+ frame_header.message_size = 0;
+ if (!(msg << frame_header))
+ return 0;
+ return 1;
+}
+
+CORBA::Boolean
+TAO_SFP_Base::write_start_message (TAO_OutputCDR &msg)
+{
+ flowProtocol::Start start;
+
+ start.magic_number [0] = '=';
+ start.magic_number [1] = 'S';
+ start.magic_number [2] = 'T';
+ start.magic_number [3] = 'A';
+ start.major_version = TAO_SFP_MAJOR_VERSION;
+ start.minor_version = TAO_SFP_MINOR_VERSION;
+ start.flags = 0;
+ if (!(msg << start))
+ return 0;
+ return 1;
+}
+
+CORBA::Boolean
+TAO_SFP_Base::write_start_reply_message (TAO_OutputCDR &msg)
+{
+ flowProtocol::StartReply start_reply;
+
+ start_reply.magic_number [0] = '=';
+ start_reply.magic_number [1] = 'S';
+ start_reply.magic_number [2] = 'T';
+ start_reply.magic_number [3] = 'R';
+ start_reply.flags = 0;
+ if (!(msg << start_reply))
+ return 0;
+ return 1;
+}
+
+CORBA::Boolean
+TAO_SFP_Base::write_credit_message (CORBA::ULong cred_num,
+ TAO_OutputCDR &msg)
+{
+ flowProtocol::credit credit;
+
+ credit.magic_number [0] = '=';
+ credit.magic_number [1] = 'C';
+ credit.magic_number [2] = 'R';
+ credit.magic_number [3] = 'E';
+ credit.cred_num = cred_num;
+ if (!(msg << credit))
+ return 0;
+ return 1;
+}
+
+CORBA::Boolean
+TAO_SFP_Base::write_fragment_message (CORBA::Octet flags,
+ CORBA::ULong fragment_number,
+ CORBA::ULong sequence_number,
+ CORBA::ULong source_id,
+ TAO_OutputCDR &msg)
+{
+ msg.reset ();
+ flowProtocol::fragment fragment;
+
+ fragment.magic_number [0] = 'F';
+ fragment.magic_number [1] = 'R';
+ fragment.magic_number [2] = 'A';
+ fragment.magic_number [3] = 'G';
+ fragment.flags = flags;
+ fragment.frag_number = fragment_number;
+ fragment.sequence_num = sequence_number;
+ fragment.source_id = source_id;
+ if (!(msg << fragment))
+ return 0;
+ return 1;
+}
+
+CORBA::Boolean
+TAO_SFP_Base::write_frame_message (CORBA::ULong timestamp,
+ CORBA::ULong synchSource,
+ flowProtocol::my_seq_ulong source_ids,
+ CORBA::ULong sequence_num,
+ TAO_OutputCDR &msg)
+{
+ flowProtocol::frame frame;
+
+ frame.timestamp = timestamp;
+ frame.synchSource = synchSource;
+ frame.source_ids = source_ids;
+ frame.sequence_num = sequence_num;
+ if (!(msg << frame))
+ return 0;
+ return 1;
+}
+
+int
+TAO_SFP_Base::send_message (TAO_AV_Transport *transport,
+ TAO_OutputCDR &stream,
+ ACE_Message_Block *mb)
+{
+ CORBA::ULong total_len = static_cast<CORBA::ULong> (stream.total_length ());
+ if (mb != 0)
+ {
+ for (ACE_Message_Block *temp = mb;temp != 0;temp = temp->cont ())
+ total_len += static_cast<CORBA::ULong> (temp->length ());
+
+ char *buf = (char *) stream.buffer ();
+ size_t offset = TAO_SFP_MESSAGE_SIZE_OFFSET;
+ // second character distinguished =SFP and FRAG.
+ if (*(buf) == 'F')
+ {
+ // Fragment message.
+ offset = TAO_SFP_FRAGMENT_SIZE_OFFSET;
+ }
+#if !defined (ACE_ENABLE_SWAP_ON_WRITE)
+ *reinterpret_cast<CORBA::ULong *> (buf + offset) = total_len;
+#else
+ if (!stream.do_byte_swap ())
+ *reinterpret_cast<CORBA::ULong *> (buf + offset) = total_len;
+ else
+ ACE_CDR::swap_4 (reinterpret_cast<char *> (&total_len),
+ buf + offset);
+#endif /* ACE_ENABLE_SWAP_ON_WRITE */
+ }
+ // we join the data block with the cdr block.
+ ACE_Message_Block *end = (ACE_Message_Block *)stream.end ();
+ if (end == 0)
+ {
+ // There is only one message block.
+ end = (ACE_Message_Block *)stream.begin ();
+ // TAO_SFP_Base::dump_buf (end->rd_ptr (),end->length ());
+ }
+ end->cont (mb);
+ ssize_t n = transport->send (stream.begin ());
+ if (n == -1)
+ {
+ if (TAO_debug_level > 0) ACE_DEBUG ((LM_DEBUG,
+ "TAO: (%P|%t) closing conn after fault %p\n",
+ "GIOP::send_request ()"));
+ return -1;
+ }
+ // EOF.
+ if (n == 0)
+ {
+ if (TAO_debug_level > 0)
+ ACE_DEBUG ((LM_DEBUG,
+ "TAO: (%P|%t) GIOP::send_request () "
+ "EOF, closing conn:\n"));
+ return -1;
+ }
+ return 1;
+
+}
+
+int
+TAO_SFP_Base::peek_message_type (TAO_AV_Transport *transport,
+ flowProtocol::MsgType &msg_type)
+{
+ char peek_buffer [TAO_SFP_MAGIC_NUMBER_LEN+2];// 2 is for flags + message_type.
+ int peek_len = TAO_SFP_MAGIC_NUMBER_LEN +2;
+ char magic_number [TAO_SFP_MAGIC_NUMBER_LEN+1];
+ ssize_t n =transport->recv (peek_buffer,
+ peek_len,
+ MSG_PEEK);
+ ACE_OS::strncpy (magic_number,
+ peek_buffer,
+ TAO_SFP_MAGIC_NUMBER_LEN);
+ magic_number [TAO_SFP_MAGIC_NUMBER_LEN] = 0;
+ if (n == -1)
+ ACE_ERROR_RETURN ((LM_ERROR,"SFP::handle_input -peek"),-1);
+ else if (n==0)
+ ACE_ERROR_RETURN ((LM_ERROR,"SFP::handle_input -peek"),-1);
+
+ if (ACE_OS::strcmp (magic_number,TAO_SFP_START_MAGIC_NUMBER) == 0)
+ {
+ if (TAO_debug_level > 0) ACE_DEBUG ((LM_DEBUG,"(%P|%t)Start message received\n"));
+ msg_type = flowProtocol::Start_Msg;
+ }
+ else if (ACE_OS::strcmp (magic_number,TAO_SFP_STARTREPLY_MAGIC_NUMBER) == 0)
+ {
+ if (TAO_debug_level > 0) ACE_DEBUG ((LM_DEBUG,"(%P|%t)StartReply message received\n"));
+ msg_type = flowProtocol::StartReply_Msg;
+ }
+ else if (ACE_OS::strcmp (magic_number,TAO_SFP_MAGIC_NUMBER) == 0)
+ {
+ if (TAO_debug_level > 0) ACE_DEBUG ((LM_DEBUG,"(%P|%t) frameHeader received\n"));
+ // msg_type = flowProtocol::SimpleFrame;
+ msg_type = (flowProtocol::MsgType)peek_buffer [TAO_SFP_MESSAGE_TYPE_OFFSET];
+ if (TAO_debug_level > 0) ACE_DEBUG ((LM_DEBUG,"Message Type = %d\n",msg_type));
+ }
+ else if (ACE_OS::strcmp (magic_number,TAO_SFP_FRAGMENT_MAGIC_NUMBER) == 0)
+ {
+ if (TAO_debug_level > 0) ACE_DEBUG ((LM_DEBUG,"(%P|%t) fragment Header received\n"));
+ msg_type = flowProtocol::Fragment_Msg;
+ }
+ else if (ACE_OS::strcmp (magic_number,TAO_SFP_CREDIT_MAGIC_NUMBER) == 0)
+ {
+ if (TAO_debug_level > 0) ACE_DEBUG ((LM_DEBUG,"(%P|%t) credit message received\n"));
+ msg_type = flowProtocol::Credit_Msg;
+ }
+ else
+ ACE_ERROR_RETURN ((LM_ERROR,"TAO_SFP:Invalid magic number\n"),-1);
+ return 0;
+}
+
+int
+TAO_SFP_Base::read_start_message (TAO_AV_Transport *transport,
+ flowProtocol::Start &start,
+ TAO_InputCDR &input)
+{
+ input.grow (start_len);
+ char *buf = input.rd_ptr ();
+ int n = transport->recv (buf,
+ start_len);
+ if (n != static_cast<int> (start_len))
+ ACE_ERROR_RETURN ((LM_ERROR,"%p","TAO_SFP_Base::read_start\n"),0);
+ else
+ {
+ if (!(input >> start))
+ return -1;
+ }
+ return 0;
+}
+
+
+int
+TAO_SFP_Base::read_start_reply_message (TAO_AV_Transport *transport,
+ flowProtocol::StartReply &start_reply,
+ TAO_InputCDR &input)
+{
+ input.grow (start_len);
+ char *buf = input.rd_ptr ();
+ int n = transport->recv (buf,
+ start_reply_len);
+ if (n != static_cast<int> (start_len))
+ ACE_ERROR_RETURN ((LM_ERROR,"%p","TAO_SFP_Base::read_start_reply_message"),0);
+ else
+ {
+ if (!(input >> start_reply))
+ return -1;
+ }
+ return 0;
+}
+
+int
+TAO_SFP_Base::read_credit_message (TAO_AV_Transport *transport,
+ flowProtocol::credit &credit,
+ TAO_InputCDR &input)
+{
+ input.grow (start_len);
+ char *buf = input.rd_ptr ();
+ int n = transport->recv (buf,
+ credit_len);
+ if (n != static_cast<int> (credit_len))
+ ACE_ERROR_RETURN ((LM_ERROR,"%p","TAO_SFP_Base::read_credit_message"),0);
+ else
+ {
+ if (!(input >> credit))
+ return -1;
+ }
+ return 0;
+}
+
+int
+TAO_SFP_Base::read_endofstream_message (TAO_AV_Transport *transport,
+ flowProtocol::frameHeader &endofstream,
+ TAO_InputCDR &input)
+{
+ input.grow (start_len);
+ char *buf = input.rd_ptr ();
+ int n = transport->recv (buf,
+ frame_header_len);
+ if (n != static_cast<int> (frame_header_len))
+ ACE_ERROR_RETURN ((LM_ERROR,"%p","TAO_SFP_Base::read_endofstream_message"),0);
+ else
+ {
+ if (!(input >> endofstream))
+ return -1;
+ }
+ return 0;
+}
+
+int
+TAO_SFP_Base::peek_frame_header (TAO_AV_Transport *transport,
+ flowProtocol::frameHeader &header,
+ TAO_InputCDR &input)
+{
+ input.grow (frame_header_len);
+ char *buf = input.rd_ptr ();
+ int n = transport->recv (buf,
+ frame_header_len,
+ MSG_PEEK);
+ if (n != static_cast<int> (frame_header_len))
+ ACE_ERROR_RETURN ((LM_ERROR,"%p","TAO_SFP_Base::read_endofstream_message"),0);
+ else
+ {
+ if (!(input >> header))
+ return -1;
+ }
+ return 0;
+}
+
+int
+TAO_SFP_Base::peek_fragment_header (TAO_AV_Transport *transport,
+ flowProtocol::fragment &fragment,
+ TAO_InputCDR &input)
+{
+ input.grow (fragment_len);
+ char *buf = input.rd_ptr ();
+ int n = transport->recv (buf,
+ fragment_len,
+ MSG_PEEK);
+ if (n != static_cast<int> (fragment_len))
+ ACE_ERROR_RETURN ((LM_ERROR,"%p","TAO_SFP_Base::read_endofstream_message"),0);
+ else
+ {
+ if (!(input >> fragment))
+ return -1;
+ }
+ return 0;
+}
+
+void
+TAO_SFP_Base::dump_buf (char *buffer,int size)
+{
+ char *buf = buffer;
+ if (TAO_debug_level > 0) ACE_DEBUG ((LM_DEBUG,"\n========================================\n"));
+ for (int i=0;i<size;i++)
+ if (TAO_debug_level > 0) ACE_DEBUG ((LM_DEBUG,"%d ",buf[i]));
+ if (TAO_debug_level > 0) ACE_DEBUG ((LM_DEBUG,"\n========================================\n"));
+}
+
+//------------------------------------------------------------
+// TAO_SFP_Object
+//------------------------------------------------------------
+
+TAO_SFP_Object::TAO_SFP_Object (TAO_AV_Callback *callback,
+ TAO_AV_Transport *transport)
+ :TAO_AV_Protocol_Object (callback,transport),
+ source_id_ (10),
+ max_credit_ (-1),
+ current_credit_ (-1)
+{
+ TAO_SFP_BASE::instance ();
+ this->state_.static_frame_.size (2* this->transport_->mtu ());
+}
+
+TAO_SFP_Object::~TAO_SFP_Object (void)
+{
+ //no-op
+}
+
+int
+TAO_SFP_Object::destroy (void)
+{
+ int result = -1;
+ TAO_OutputCDR out_stream;
+ result = TAO_SFP_Base::start_frame (TAO_ENCAP_BYTE_ORDER,
+ flowProtocol::EndofStream_Msg,
+ out_stream);
+ if (result < 0)
+ return result;
+ result = TAO_SFP_Base::send_message (this->transport_,
+ out_stream);
+ if (result < 0)
+ return result;
+ this->callback_->handle_destroy ();
+ return 0;
+}
+
+int
+TAO_SFP_Object::send_frame (ACE_Message_Block *frame,
+ TAO_AV_frame_info *frame_info)
+{
+ TAO_OutputCDR out_stream;
+ CORBA::Boolean result = 0;
+ if (TAO_debug_level > 0) ACE_DEBUG ((LM_DEBUG,"TAO_SFP_Object::send_frame\n"));
+ CORBA::Octet flags = TAO_ENCAP_BYTE_ORDER;
+ if (this->transport_ == 0)
+ ACE_ERROR_RETURN ((LM_ERROR,"TAO_SFP_Object::send_frame: transport is null\n"),-1);
+ if (this->current_credit_ != 0)
+ {
+ // if we have enough credit then we send.
+ size_t total_length = 0;
+ for (ACE_Message_Block *temp = frame;temp != 0;temp = temp->cont ())
+ total_length += temp->length ();
+ if (TAO_debug_level > 0) ACE_DEBUG ((LM_DEBUG,"total_length of frame=%d\n",total_length));
+ if (total_length < (TAO_SFP_MAX_PACKET_SIZE -TAO_SFP_Base::frame_header_len))
+ {
+ if (frame_info != 0)
+ {
+ if (frame_info->boundary_marker)
+ flags |= 4;
+ CORBA::Boolean result = TAO_SFP_Base::start_frame (flags,
+ flowProtocol::Frame_Msg,
+ out_stream);
+ if (result == 0)
+ return 0;
+ flowProtocol::my_seq_ulong source_ids;
+ source_ids.length (1);
+ source_ids [0] = 0;
+ TAO_SFP_Base::write_frame_message (frame_info->timestamp,
+ frame_info->ssrc,
+ source_ids,
+ this->sequence_num_,
+ out_stream);
+ }
+ else
+ {
+ CORBA::Boolean result = TAO_SFP_Base::start_frame (flags,
+ flowProtocol::SimpleFrame_Msg,
+ out_stream);
+ if (result == 0)
+ return 0;
+ }
+ TAO_SFP_Base::send_message (this->transport_,
+ out_stream,
+ frame);
+ }
+ else // larger frame,fragment and send it.
+ {
+ flags = flags | 2;
+ if (frame_info != 0)
+ {
+ if (frame_info->boundary_marker)
+ flags |= 4;
+ result = TAO_SFP_Base::start_frame (flags,
+ flowProtocol::Frame_Msg,
+ out_stream);
+ if (result == 0)
+ return result;
+ flowProtocol::my_seq_ulong source_ids;
+ source_ids.length (1);
+ source_ids [0] = 0;
+ TAO_SFP_Base::write_frame_message (frame_info->timestamp,
+ frame_info->ssrc,
+ source_ids,
+ this->sequence_num_,
+ out_stream);
+ }
+ else
+ {
+ CORBA::Boolean result = TAO_SFP_Base::start_frame (flags,
+ flowProtocol::SimpleFrame_Msg,
+ out_stream);
+ if (result == 0)
+ return 0;
+ }
+ size_t last_len,current_len;
+ int message_len = static_cast<int> (out_stream.total_length ());
+ ACE_Message_Block *mb = frame;
+ ACE_Message_Block *fragment_mb =
+ this->get_fragment (mb,
+ message_len,
+ last_len,
+ current_len);
+ // This can be either a simpleframe or a sequenced frame,other types of frames.
+ TAO_SFP_Base::send_message (this->transport_,
+ out_stream,
+ fragment_mb);
+ out_stream.reset ();
+ int frag_number = 1;
+ mb->length (last_len);
+ mb->rd_ptr (current_len);
+ // If there is any more data send those as fragments.
+ while (mb != 0)
+ {
+ message_len = TAO_SFP_Base::fragment_len;
+ fragment_mb = this->get_fragment (mb,
+ message_len,
+ last_len,
+ current_len);
+ if (mb == 0)
+ {
+ if (TAO_debug_level > 0) ACE_DEBUG ((LM_DEBUG,"sending the last fragment\n"));
+ // This is the last fragment so clear the fragments bit.
+ flags = TAO_ENCAP_BYTE_ORDER;
+ }
+ if (fragment_mb == 0)
+ break;
+ if (frame_info != 0)
+ {
+ TAO_SFP_Base::write_fragment_message (flags,
+ frag_number++,
+ this->sequence_num_,
+ frame_info->ssrc,
+ out_stream);
+ }
+ else
+ {
+ TAO_SFP_Base::write_fragment_message (flags,
+ frag_number++,
+ this->sequence_num_,
+ 0,
+ out_stream);
+ }
+ // send the fragment now.
+ // without the sleep the fragments gets lost!
+ // probably because the UDP buffer queue on the sender side
+ // is overflown it drops the packets.
+ // XXX: This is a hack.
+ ACE_OS::sleep (1);
+ result = TAO_SFP_Base::send_message (this->transport_,
+ out_stream,
+ fragment_mb);
+ if (mb != 0)
+ {
+ mb->length (last_len);
+ mb->rd_ptr (current_len);
+ }
+ }
+ // Increment the sequence_num after sending the message.
+ this->sequence_num_++;
+ // Also reduce the number of credits.
+ if (this->max_credit_ > 0)
+ this->current_credit_--;
+ }
+ }
+ else
+ {
+ // flow controlled so wait.
+ // A greater than 0 value indicates that flow control is being exercised.
+ return 1;
+ }
+ return 0;
+}
+
+int
+TAO_SFP_Object::send_frame (const iovec * /*iov*/,
+ int /*iovcnt*/,
+ TAO_AV_frame_info * /*frame_info*/)
+{
+ ACE_ERROR_RETURN ((LM_ERROR,"TAO_AV_SFP_Object::send_frame"),-1);
+}
+
+int
+TAO_SFP_Object::send_frame (const char* /*buf*/,
+ size_t /*len*/)
+{
+ return 0;
+}
+
+
+ACE_Message_Block*
+TAO_SFP_Object::get_fragment (ACE_Message_Block *&mb,
+ size_t initial_len,
+ size_t &last_mb_orig_len,
+ size_t &last_mb_current_len)
+{
+ ACE_Message_Block *fragment_mb = 0,*temp_mb = 0;
+ size_t prev_len,last_len = 0;
+ size_t current_len = 0;
+ size_t message_len = initial_len;
+ while (mb != 0)
+ {
+ prev_len = message_len;
+ message_len += mb->length ();
+ if (fragment_mb == 0)
+ fragment_mb = temp_mb = mb->duplicate ();
+ if (message_len > TAO_SFP_MAX_PACKET_SIZE)
+ {
+ // get only the length that we can accomodate.
+ current_len = TAO_SFP_MAX_PACKET_SIZE - prev_len;
+ if (current_len < mb->length ())
+ {
+ // The above condition is an assertion.
+ message_len += (current_len-mb->length ());
+ last_len = mb->length ();
+ mb->length (current_len);
+ temp_mb->length (current_len);
+ }
+ break;
+ }
+ else
+ {
+ // we can accomodate this message block
+ message_len += mb->length ();
+ mb = mb->cont ();
+ temp_mb = temp_mb->cont ();
+ }
+ }
+ last_mb_orig_len = last_len;
+ last_mb_current_len = current_len;
+ return fragment_mb;
+}
+
+int
+TAO_SFP_Object::set_policies (const TAO_AV_PolicyList& policies)
+{
+ TAO_AV_Policy *policy = 0;
+ for (CORBA::ULong i=0;i<policies.length ();i++)
+ {
+ policy = policies[i];
+ switch (policies[i]->type ())
+ {
+
+ case TAO_AV_SFP_CREDIT_POLICY:
+ {
+ TAO_AV_SFP_Credit_Policy *credit_policy =
+ reinterpret_cast<TAO_AV_SFP_Credit_Policy*> (policy);
+ this->max_credit_ = credit_policy->value ();
+ }
+ default:
+ break;
+ }
+ }
+ return 0;
+}
+
+// TAO_SFP_Consumer_Object
+TAO_SFP_Consumer_Object::TAO_SFP_Consumer_Object (TAO_AV_Callback *callback,
+ TAO_AV_Transport *transport,
+ ACE_CString& sfp_options)
+ :TAO_SFP_Object (callback,transport)
+{
+ TAO_AV_PolicyList policies = callback->get_policies ();
+ if (policies.length () == 0)
+ return;
+ this->set_policies (policies);
+ if (this->max_credit_ > 0)
+ {
+ sfp_options = "sfp:1.0:credit=";
+ char buf[10];
+ ACE_OS::sprintf(buf, "%d", this->max_credit_);
+ sfp_options += buf;
+ }
+}
+
+int
+TAO_SFP_Consumer_Object::handle_input (void)
+{
+ if (TAO_debug_level > 0) ACE_DEBUG ((LM_DEBUG,"TAO_SFP_Consumer_Object::handle_input\n"));
+ // This is the entry point for receiving data.
+ TAO_AV_frame_info *frame_info = 0;
+ int result = TAO_SFP_Base::handle_input (this->transport_,
+ this->state_,
+ frame_info);
+ if (result < 0)
+ ACE_ERROR_RETURN ((LM_ERROR,"ERROR in TAO_SFP_Consumer_Object::handle_input"),result);
+ if (this->state_.frame_header_.message_type == flowProtocol::EndofStream_Msg)
+ this->callback_->handle_destroy ();
+ if (this->state_.is_complete ())
+ {
+ this->callback_->receive_frame (this->state_.frame_block_,
+ frame_info);
+ // Now release the memory for the frame.
+ if (this->state_.frame_block_ != &this->state_.static_frame_)
+ {
+ ACE_Message_Block *temp = 0;
+ for (temp = this->state_.frame_block_;
+ temp != 0;
+ temp = temp->cont ())
+ {
+ temp->release ();
+ delete temp;
+ }
+ }
+ this->state_.reset ();
+ }
+ return 0;
+}
+
+TAO_SFP_Producer_Object::TAO_SFP_Producer_Object (TAO_AV_Callback *callback,
+ TAO_AV_Transport *transport,
+ const char *sfp_options)
+ :TAO_SFP_Object (callback,transport),
+ credit_sequence_num_ (0)
+
+{
+ TAO_Tokenizer flow_string (sfp_options,':');
+ if (flow_string [2] != 0)
+ {
+ TAO_Tokenizer options (flow_string[2],'=');
+ if (options [1] != 0)
+ this->max_credit_ = ACE_OS::atoi (options[1]);
+ }
+}
+
+int
+TAO_SFP_Producer_Object::handle_input (void)
+{
+ // A producer can only receive credit messages.
+ int result;
+ flowProtocol::MsgType msg_type = flowProtocol::Start_Msg;
+ result = TAO_SFP_Base::peek_message_type (this->transport_,
+ msg_type);
+ if (result < 0)
+ return result;
+ switch (msg_type)
+ {
+ case flowProtocol::Credit_Msg:
+ {
+ flowProtocol::credit credit;
+ result = TAO_SFP_Base::read_credit_message (this->transport_,
+ credit,
+ this->state_.cdr);
+ if (result < 0)
+ return result;
+ if (!this->credit_sequence_num_)
+ this->credit_sequence_num_ = credit.cred_num;
+ else
+ {
+ // check that the sequence number is above the last sequence number
+ // else its a duplicate credit message so we can ignore it.
+ if (credit.cred_num <= this->credit_sequence_num_)
+ return 0;
+ else // Update our credit now.
+ this->current_credit_ = this->max_credit_;
+ }
+ }
+ break;
+ default:
+ {
+ ACE_Message_Block mb (2*this->transport_->mtu ());
+
+ // Ignore the rest of the message by just reading.
+ this->transport_->recv (mb.rd_ptr (),
+ mb.size ());
+ break;
+ }
+ }
+ return 0;
+}
+
+// TAO_AV_SFP_Factory
+TAO_AV_SFP_Factory::TAO_AV_SFP_Factory (void)
+{
+}
+
+TAO_AV_SFP_Factory::~TAO_AV_SFP_Factory (void)
+{
+}
+
+// Initialization hook from service configurator.
+int
+TAO_AV_SFP_Factory::init (int /*argc*/, char ** /*argv*/)
+{
+ return 0;
+}
+
+int
+TAO_AV_SFP_Factory::match_protocol (const char *flow_string)
+{
+ if (ACE_OS::strncasecmp (flow_string,"sfp",3) == 0)
+ return 1;
+ return 0;
+}
+
+TAO_AV_Protocol_Object*
+TAO_AV_SFP_Factory::make_protocol_object (TAO_FlowSpec_Entry *entry,
+ TAO_Base_StreamEndPoint *endpoint,
+ TAO_AV_Flow_Handler *handler,
+ TAO_AV_Transport *transport)
+{
+ TAO_AV_Protocol_Object *object = 0;
+ TAO_AV_Callback *callback = 0;
+ endpoint->get_callback (entry->flowname (),
+ callback);
+ ACE_CString flow_string( entry->flow_protocol_str () );
+ switch (entry->role ())
+ {
+ case TAO_FlowSpec_Entry::TAO_AV_PRODUCER:
+ {
+ ACE_NEW_RETURN (object,
+ TAO_SFP_Producer_Object (callback,
+ transport,
+ flow_string.c_str() ),
+ 0);
+ }
+ break;
+ case TAO_FlowSpec_Entry::TAO_AV_CONSUMER:
+ {
+
+ ACE_NEW_RETURN (object,
+ TAO_SFP_Consumer_Object (callback,
+ transport,
+ flow_string),
+ 0);
+ entry->flow_protocol_str( flow_string.c_str() );
+ }
+ break;
+ case TAO_FlowSpec_Entry::TAO_AV_INVALID_ROLE:
+ return 0;
+ }
+ callback->open (object,
+ handler);
+ endpoint->set_protocol_object (entry->flowname (),
+ object);
+ return object;
+}
+
+//------------------------------------------------------------
+// TAO_SFP_Frame_State
+//------------------------------------------------------------
+
+TAO_SFP_Frame_State::TAO_SFP_Frame_State (void)
+ :cdr (new ACE_Data_Block (ACE_CDR::DEFAULT_BUFSIZE,
+ ACE_Message_Block::MB_DATA,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0),
+ 0,
+ TAO_ENCAP_BYTE_ORDER),
+ more_fragments_ (0),
+ frame_block_ (0)
+{
+}
+
+CORBA::Boolean
+TAO_SFP_Frame_State::is_complete (void)
+{
+ return (!this->more_fragments_) && (this->frame_block_);
+}
+
+int
+TAO_SFP_Frame_State::reset (void)
+{
+ this->frame_block_ = 0;
+ return 0;
+}
+
+#if defined (ACE_HAS_EXPLICIT_STATIC_TEMPLATE_MEMBER_INSTANTIATION)
+template ACE_Singleton<TAO_SFP_Base, ACE_Thread_Mutex> *ACE_Singleton<TAO_SFP_Base, ACE_Thread_Mutex>::singleton_;
+#endif /* ACE_HAS_EXPLICIT_STATIC_TEMPLATE_MEMBER_INSTANTIATION */
+
+TAO_END_VERSIONED_NAMESPACE_DECL
+
+ACE_FACTORY_DEFINE (TAO_AV, TAO_AV_SFP_Factory)
+ACE_STATIC_SVC_DEFINE (TAO_AV_SFP_Factory,
+ ACE_TEXT ("SFP_Factory"),
+ ACE_SVC_OBJ_T,
+ &ACE_SVC_NAME (TAO_AV_SFP_Factory),
+ ACE_Service_Type::DELETE_THIS |
+ ACE_Service_Type::DELETE_OBJ,
+ 0)
diff --git a/TAO/orbsvcs/orbsvcs/AV/sfp.h b/TAO/orbsvcs/orbsvcs/AV/sfp.h
new file mode 100644
index 00000000000..35ab492f34f
--- /dev/null
+++ b/TAO/orbsvcs/orbsvcs/AV/sfp.h
@@ -0,0 +1,306 @@
+// -*- C++ -*-
+
+// ============================================================================
+/**
+ * @file sfp.h
+ *
+ * $Id$
+ *
+ * @author Nagarajan Surendran <naga@cs.wustl.edu>
+ */
+// ============================================================================
+
+#ifndef TAO_AV_SFP_H
+#define TAO_AV_SFP_H
+#include /**/ "ace/pre.h"
+
+#include "orbsvcs/AV/AV_export.h"
+
+#include "orbsvcs/AV/Policy.h"
+#include "orbsvcs/AV/MCast.h"
+#include "orbsvcs/AV/AVStreams_i.h"
+#include "orbsvcs/AV/UDP.h"
+
+#include "orbsvcs/sfpC.h"
+
+#include "tao/CDR.h"
+
+#include "ace/SOCK_Dgram.h"
+#include "ace/INET_Addr.h"
+
+
+#define TAO_SFP_MAGIC_NUMBER_LEN 4
+#define TAO_SFP_MESSAGE_TYPE_OFFSET 5
+#define TAO_SFP_WRITEV_MAX 128
+
+#define TAO_SFP_MAX_PACKET_SIZE ACE_MAX_DGRAM_SIZE
+
+TAO_BEGIN_VERSIONED_NAMESPACE_DECL
+
+/**
+ * @class TAO_SFP_Fragment_Node
+ * @brief
+ */
+class TAO_SFP_Fragment_Node
+{
+public:
+ TAO_SFP_Fragment_Node (void) : data_ (0) {}
+ flowProtocol::fragment fragment_info_;
+ ACE_Message_Block *data_;
+ friend bool operator< (const TAO_SFP_Fragment_Node& left,
+ const TAO_SFP_Fragment_Node& right);
+};
+
+/**
+ * @class TAO_SFP_Fragment_Table_Entry
+ * @brief
+ */
+class TAO_SFP_Fragment_Table_Entry
+{
+public:
+ TAO_SFP_Fragment_Table_Entry (void)
+ :last_received_ (0),
+ num_fragments_ (0)
+ {}
+ int last_received_;
+ size_t num_fragments_;
+ TAO_AV_frame_info frame_info;
+ ACE_Ordered_MultiSet<TAO_SFP_Fragment_Node> fragment_set_;
+};
+
+typedef ACE_Ordered_MultiSet_Iterator<TAO_SFP_Fragment_Node> FRAGMENT_SET_ITERATOR;
+typedef ACE_Hash_Map_Manager<CORBA::ULong,TAO_SFP_Fragment_Table_Entry*,ACE_Null_Mutex> TAO_SFP_Fragment_Table;
+typedef ACE_Hash_Map_Manager<CORBA::ULong,TAO_SFP_Fragment_Table*,ACE_Null_Mutex> TAO_SFP_Fragment_Table_Map;
+
+/**
+ * @class TAO_SFP_Frame_State
+ * @brief
+ */
+class TAO_AV_Export TAO_SFP_Frame_State
+{
+public:
+ TAO_SFP_Frame_State (void);
+ CORBA::Boolean is_complete (void);
+
+ int reset (void);
+
+ TAO_InputCDR cdr;
+ // This is the InputCDR that will be used to decode the message.
+ flowProtocol::frameHeader frame_header_;
+ flowProtocol::fragment fragment_;
+ flowProtocol::frame frame_;
+ CORBA::Boolean more_fragments_;
+ ACE_Message_Block *frame_block_;
+ // boolean flags indicating that there are more fragments.
+ ACE_Message_Block static_frame_;
+ TAO_SFP_Fragment_Table_Map fragment_table_map_;
+};
+
+class TAO_AV_Transport;
+class TAO_AV_Core;
+
+/**
+ * @class TAO_SFP_Base
+ * @brief
+ */
+class TAO_AV_Export TAO_SFP_Base
+{
+public:
+ // default arguments to pass to use for the ORB
+ static const char TAO_SFP_ORB_ARGUMENTS[];
+
+ // SFP magic numbers
+ static const char TAO_SFP_MAGIC_NUMBER[];
+ static const char TAO_SFP_FRAGMENT_MAGIC_NUMBER[];
+ static const char TAO_SFP_START_MAGIC_NUMBER[];
+ static const char TAO_SFP_CREDIT_MAGIC_NUMBER[];
+ static const char TAO_SFP_STARTREPLY_MAGIC_NUMBER[];
+
+ // SFP version 1.0
+ static const unsigned char TAO_SFP_MAJOR_VERSION;
+ static const unsigned char TAO_SFP_MINOR_VERSION;
+
+ // lengths of various SFP headers
+ static const unsigned char TAO_SFP_FRAME_HEADER_LEN;
+ static const unsigned char TAO_SFP_MESSAGE_SIZE_OFFSET;
+ static const unsigned char TAO_SFP_FRAGMENT_SIZE_OFFSET;
+ static u_int frame_header_len;
+ static u_int start_reply_len;
+ static u_int start_len;
+ static u_int credit_len;
+ static u_int fragment_len;
+
+ enum State
+ {
+ ACTIVE_START,
+ PASSIVE_START,
+ TIMEDOUT_T1,
+ TIMEDOUT_T2,
+ REPLY_RECEIVED,
+ START_RECEIVED
+ };
+
+ TAO_SFP_Base (void);
+ static CORBA::Boolean start_frame (CORBA::Octet flags,
+ flowProtocol::MsgType type,
+ TAO_OutputCDR &msg);
+
+ static CORBA::Boolean write_start_message (TAO_OutputCDR &msg);
+ static CORBA::Boolean write_start_reply_message (TAO_OutputCDR &msg);
+ static CORBA::Boolean write_credit_message (CORBA::ULong cred_num,
+ TAO_OutputCDR &msg);
+ static CORBA::Boolean write_fragment_message (CORBA::Octet flags,
+ CORBA::ULong fragment_number,
+ CORBA::ULong sequence_number,
+ CORBA::ULong source_id,
+ TAO_OutputCDR &msg);
+
+ static CORBA::Boolean write_frame_message (CORBA::ULong timestamp,
+ CORBA::ULong synchSource,
+ flowProtocol::my_seq_ulong source_ids,
+ CORBA::ULong sequence_num,
+ TAO_OutputCDR &msg);
+
+ static int send_message (TAO_AV_Transport *transport,
+ TAO_OutputCDR &stream,
+ ACE_Message_Block *mb = 0);
+ static int peek_message_type (TAO_AV_Transport *transport,
+ flowProtocol::MsgType &type);
+ static int read_start_message (TAO_AV_Transport *transport,
+ flowProtocol::Start &start,
+ TAO_InputCDR &cdr);
+ static int read_start_reply_message (TAO_AV_Transport *transport,
+ flowProtocol::StartReply &start_reply,
+ TAO_InputCDR &cdr);
+ static int read_credit_message (TAO_AV_Transport *transport,
+ flowProtocol::credit &credit,
+ TAO_InputCDR &cdr);
+ static int read_endofstream_message (TAO_AV_Transport *transport,
+ flowProtocol::frameHeader &endofstream,
+ TAO_InputCDR &cdr);
+
+ static int read_frame (TAO_AV_Transport *transport,
+ flowProtocol::frameHeader &frame_header,
+ TAO_SFP_Frame_State &state,
+ TAO_AV_frame_info *&frame_info);
+
+ static int read_fragment (TAO_AV_Transport *transport,
+ flowProtocol::fragment &fragment,
+ TAO_SFP_Frame_State &state,
+ TAO_AV_frame_info *&frame_info);
+
+ static int peek_frame_header (TAO_AV_Transport *transport,
+ flowProtocol::frameHeader &header,
+ TAO_InputCDR &cdr);
+
+ static int peek_fragment_header (TAO_AV_Transport *transport,
+ flowProtocol::fragment &fragment,
+ TAO_InputCDR &cdr);
+
+ static int handle_input (TAO_AV_Transport *transport,
+ TAO_SFP_Frame_State &state,
+ TAO_AV_frame_info *&frame_info);
+
+ static ACE_Message_Block* check_all_fragments (TAO_SFP_Fragment_Table_Entry *fragment_entry);
+
+protected:
+ static void dump_buf (char *buf,int n);
+ // dumps the buffer to the screen.
+};
+
+// Beware the SFP_Base code relies on the Singleton being initialized.
+typedef ACE_Singleton <TAO_SFP_Base,TAO_SYNCH_MUTEX> TAO_SFP_BASE;
+
+/**
+ * @class TAO_SFP_Object
+ * @brief
+ */
+class TAO_AV_Export TAO_SFP_Object : public TAO_AV_Protocol_Object
+{
+public:
+ TAO_SFP_Object (TAO_AV_Callback *callback,
+ TAO_AV_Transport *transport);
+ // We should add a sfp options parameter.
+
+ virtual ~TAO_SFP_Object (void);
+ // Dtor
+
+ virtual int handle_input (void) = 0;
+ virtual int send_frame (ACE_Message_Block *frame,
+ TAO_AV_frame_info *frame_info = 0);
+
+ virtual int send_frame (const iovec *iov,
+ int iovcnt,
+ TAO_AV_frame_info *frame_info = 0);
+
+ virtual int send_frame (const char*buf,
+ size_t len);
+
+ virtual int destroy (void);
+ virtual int set_policies (const TAO_AV_PolicyList &policies);
+
+protected:
+ ACE_Message_Block *get_fragment (ACE_Message_Block *&frame,
+ size_t initial_len,
+ size_t &last_mb_orig_len,
+ size_t &last_mb_current_len);
+ CORBA::ULong sequence_num_;
+ CORBA::ULong source_id_;
+ CORBA::Long max_credit_;
+ CORBA::Long current_credit_;
+ TAO_SFP_Frame_State state_;
+};
+
+/**
+ * @class TAO_SFP_Producer_Object
+ * @brief
+ */
+class TAO_AV_Export TAO_SFP_Producer_Object : public TAO_SFP_Object
+{
+public:
+ TAO_SFP_Producer_Object (TAO_AV_Callback *callback,
+ TAO_AV_Transport *transport,
+ const char *flow_options);
+ virtual int handle_input (void);
+protected:
+ CORBA::ULong credit_sequence_num_;
+};
+
+/**
+ * @class TAO_SFP_Consumer_Object
+ * @brief
+ */
+class TAO_AV_Export TAO_SFP_Consumer_Object : public TAO_SFP_Object
+{
+public:
+ TAO_SFP_Consumer_Object (TAO_AV_Callback *callback,
+ TAO_AV_Transport *transport,
+ ACE_CString& flow_options);
+ virtual int handle_input (void);
+};
+
+/**
+ * @class TAO_AV_SFP_Factory
+ * @brief
+ */
+class TAO_AV_Export TAO_AV_SFP_Factory : public TAO_AV_Flow_Protocol_Factory
+{
+public:
+ TAO_AV_SFP_Factory (void);
+ virtual ~TAO_AV_SFP_Factory (void);
+ virtual int init (int argc, char *argv[]);
+ // Initialization hook.
+ virtual int match_protocol (const char *flow_string);
+ virtual TAO_AV_Protocol_Object* make_protocol_object (TAO_FlowSpec_Entry *entry,
+ TAO_Base_StreamEndPoint *endpoint,
+ TAO_AV_Flow_Handler *handler,
+ TAO_AV_Transport *transport);
+};
+
+TAO_END_VERSIONED_NAMESPACE_DECL
+
+ACE_STATIC_SVC_DECLARE (TAO_AV_SFP_Flow_Factory)
+ACE_FACTORY_DECLARE (TAO_AV, TAO_AV_SFP_Flow_Factory)
+
+#include /**/ "ace/post.h"
+#endif /* TAO_SFP_H */
diff --git a/TAO/orbsvcs/orbsvcs/AVStreams.idl b/TAO/orbsvcs/orbsvcs/AVStreams.idl
new file mode 100644
index 00000000000..1e40c191651
--- /dev/null
+++ b/TAO/orbsvcs/orbsvcs/AVStreams.idl
@@ -0,0 +1,795 @@
+/* -*- C++ -*- */
+//=============================================================================
+/**
+ * @file AVStreams.idl
+ *
+ * $Id$
+ *
+ * @author Sumedh Mungee <sumedh@cs.wustl.edu>
+ * @author Nagarajan Surendran <naga@cs.wustl.edu>
+ */
+//=============================================================================
+
+
+#ifndef TAO_AV_STREAMS_IDL
+#define TAO_AV_STREAMS_IDL
+
+#include "CosProperty.idl"
+
+#pragma prefix "omg.org"
+
+/**
+ * @brief IDL for Control and Management of Audio/Video Streams
+ * Revised Submission.
+ */
+module AVStreams
+{
+
+ /**
+ * @struct QoS
+ * @brief This structure represents QoS for a given type.
+ * E.g. {"video_qos", <"video_framerate", 26>,
+ * <"video_depth", 9>}
+ */
+ struct QoS
+ {
+ string QoSType;
+ /// Name of the Qos type, e.g. "video_qos"
+
+ CosPropertyService::Properties QoSParams;
+ /// Sequence of name value pairs, see e.g. above.
+ };
+
+ /// The QoS of a stream is a sequence of QoS structs (defined above)
+ typedef sequence<QoS> streamQoS;
+
+ /// flowSpec is used to keep transport protocol information Each
+ /// string is one endpoint.
+ typedef sequence<string> flowSpec;
+
+ /// List of protocols supported protocol names registered by OMG.
+ /// e.g., TCP, UDP, AAL5, IPX, RTP
+ typedef sequence<string> protocolSpec;
+
+ /// Used as a key for public-key encryption
+ typedef sequence<octet> key;
+
+ /**
+ * @struct SFPStatus
+ * @brief This structure is defined for SFP1.0 Subsequent versions of
+ * the protocol may specify new structures.
+ */
+ struct SFPStatus
+ {
+ boolean isFormatted;
+ boolean isSpecialFormat;
+ boolean seqNums;
+ boolean timestamps;
+ boolean sourceIndicators;
+ };
+
+ /**
+ * @enum flowState
+ * @brief Represents the state of a flow
+ */
+ enum flowState
+ {
+ stopped,
+ started,
+ dead
+ };
+
+ /**
+ * @enum dirType
+ * @brief The direction of a flow.
+ */
+ enum dirType
+ {
+ dir_in,
+ dir_out
+ };
+
+ /**
+ * @struct flowStatus
+ * @brief Used to store the status of a flow.
+ */
+ struct flowStatus
+ {
+
+ string flowName;
+ dirType directionality;
+ flowState status;
+ SFPStatus theFormat;
+ QoS theQoS;
+ };
+
+ /// Used to convey events, in Basic_StreamCtrl::push_event.
+ typedef CosPropertyService::Property streamEvent;
+
+
+ exception notSupported
+ {
+ /// Used to indicate that an operation is not supported.
+ };
+
+ exception PropertyException
+ {
+ /// Property exception: raised by VDev::configure ().
+ };
+
+ exception FPError
+ {
+ /// An flow protocol related error.
+ string flow_name;
+ };
+
+
+ exception streamOpFailed
+ {
+ /// Raised by operations on streams.
+ string reason;
+ };
+
+ exception streamOpDenied
+ {
+ /// Raised by operations on streams.
+ string reason;
+ };
+
+ exception noSuchFlow
+ {
+ /// Used to indicate that an invalid flow name was used for the
+ /// operation.
+ };
+
+ exception QoSRequestFailed
+ {
+ /// Used to indicate failure in changing QoS.
+ string reason;
+ };
+
+ /**
+ * @interface Basic_StreamCtrl
+ * @brief Base class for StreamCtrl, implements basic stream start
+ * and stop functionality.
+ */
+ interface Basic_StreamCtrl : CosPropertyService::PropertySet {
+
+ // = Empty flowSpec => apply operation to all flows
+ /// Stop the transfer of data of the stream.Empty the_spec means
+ /// apply operation to all flows.
+ void stop (in flowSpec the_spec) raises (noSuchFlow);
+
+ /// Start the transfer of data in the stream. Empty the_spec
+ /// means apply operation to all flows.
+ void start (in flowSpec the_spec) raises (noSuchFlow);
+
+ /// Tears down the stream. This will close the connection, and
+ /// delete the streamendpoint and vdev associated with this
+ /// stream Empty the_spec means apply operation to all flows.
+ void destroy (in flowSpec the_spec) raises (noSuchFlow);
+
+ /// Changes the QoS associated with the stream Empty the_spec
+ /// means apply operation to all flows.
+ boolean modify_QoS (inout streamQoS new_qos,
+ in flowSpec the_spec)
+ raises (noSuchFlow,
+ QoSRequestFailed);
+
+ /// Called by StreamEndPoint when something goes wrong with a
+ /// flow.
+ oneway void push_event (in streamEvent the_event);
+
+ /// Used to control the flow protocol parameters.
+ void set_FPStatus (in flowSpec the_spec,
+ in string fp_name,
+ in any fp_settings)
+ raises (noSuchFlow,
+ FPError);
+
+ /// Not implemented in the light profile, will raise the
+ /// notsupported exception.
+ Object get_flow_connection (in string flow_name)
+ raises (noSuchFlow,
+ notSupported);
+
+ /// Not implemented in the light profile, will raise the
+ /// notsupported exception.
+ void set_flow_connection (in string flow_name,
+ in Object flow_connection)
+ raises (noSuchFlow,
+ notSupported);
+ };
+
+ /**
+ * @interface Negotiator
+ * @brief This interface is used to negotiate QoS between two stream
+ * endpoints.
+ */
+ interface Negotiator
+ {
+ /// Initiates the process of negotiating the qos_spec.
+ boolean negotiate (in Negotiator remote_negotiator,
+ in streamQoS qos_spec);
+ };
+
+ // Forward declarations.
+ interface VDev;
+ interface MMDevice;
+ interface StreamEndPoint;
+ interface StreamEndPoint_A;
+ interface StreamEndPoint_B;
+
+ /**
+ * @interface StreamCtrl
+ * @brief Implementation the A/V StreamCtrl class. this class
+ * is used to control the stream. It should be subclassed
+ * by applications that want to provide more control features.
+ */
+ interface StreamCtrl : Basic_StreamCtrl
+ {
+
+ boolean bind_devs (in MMDevice a_party, in MMDevice b_party,
+ inout streamQoS the_qos,
+ in flowSpec the_flows)
+ raises (streamOpFailed,
+ noSuchFlow,
+ QoSRequestFailed);
+ /// Establish a stream between a_party and b_party, with qos
+ /// the_qos, and for the flows in the_flows if the_flows is
+ /// empty, bind all the flows Causes a connection to be
+ /// established between the StreamEndpoints. Returns
+ /// success/failure
+
+ boolean bind (in StreamEndPoint_A a_party,
+ in StreamEndPoint_B b_party,
+ inout streamQoS the_qos,
+ in flowSpec the_flows)
+ raises (streamOpFailed,
+ noSuchFlow,
+ QoSRequestFailed);
+ /// Establish a connection between two streamendpoints. This can
+ /// be used if the streamendpoints have been created independent
+ /// of a MMDevice
+
+ void unbind_dev(in MMDevice dev, in flowSpec the_spec)
+ raises (streamOpFailed, noSuchFlow);
+
+ /// Unbind the_ep from the stream. Empty the_spec means apply to
+ /// all flows.
+ void unbind_party (in StreamEndPoint the_ep,
+ in flowSpec the_spec)
+ raises (streamOpFailed, noSuchFlow);
+
+ /// unbind the stream. Same effect as Basic_StreamCtrl::destroy ()
+ void unbind ()
+ raises (streamOpFailed);
+
+ VDev get_related_vdev(in MMDevice adev,
+ out StreamEndPoint sep)
+ raises (streamOpFailed);
+
+ };
+
+ /**
+ * @interface MCastConfigIf
+ * @brief Interface for multicasting operations.
+ */
+ interface MCastConfigIf : CosPropertyService::PropertySet{
+ /// Set a peer in the multicast tree.
+ boolean set_peer (in Object peer,
+ inout streamQoS the_qos,
+ in flowSpec the_spec)
+ raises (QoSRequestFailed,
+ streamOpFailed);
+
+ /// Configure the multicast stream.
+ void configure (in CosPropertyService::Property a_configuration);
+
+ /// Sets the initial configuration to be used for all added peers.
+ void set_initial_configuration (in CosPropertyService::Properties initial);
+
+
+ /// Uses <format_name> standardised by OMG and IETF
+ /// Multicasting operations are not supported yet.
+ void set_format (in string flowName,
+ in string format_name)
+ raises (notSupported);
+
+
+ /// Note, some of these device params are standardised by OMG
+ /// Multicasting operations are not supported yet.
+ void set_dev_params (in string flowName,
+ in CosPropertyService::Properties new_params)
+ // raises (CosPropertyService::PropertyException,
+ // streamOpFailed);
+ raises (PropertyException,
+ streamOpFailed);
+
+ };
+
+ /**
+ * @interface StreamEndpoint
+ * @brief The Stream EndPoint. Used to implement one endpoint of a
+ * stream that implements the transport layer.
+ */
+ interface StreamEndPoint : CosPropertyService::PropertySet{
+
+ /// Stop the stream. Empty the_spec means, for all the flows.
+ void stop (in flowSpec the_spec)
+ raises (noSuchFlow);
+
+ /// Start the stream, Empty the_spec means, for all the flows.
+ void start (in flowSpec the_spec)
+ raises (noSuchFlow);
+
+ /// Destroy the stream, Empty the_spec means, for all the flows.
+ void destroy (in flowSpec the_spec)
+ raises (noSuchFlow);
+
+ /// Called by StreamCtrl. responder is the peer to connect with.
+ boolean connect (in StreamEndPoint responder,
+ inout streamQoS qos_spec,
+ in flowSpec the_spec)
+ raises (noSuchFlow,
+ QoSRequestFailed,
+ streamOpFailed);
+
+ /// Called by the peer StreamEndPoint. The flow_spec indicates
+ /// the flows (which contain transport addresses etc.).
+ boolean request_connection (in StreamEndPoint initiator,
+ in boolean is_mcast,
+ inout streamQoS qos,
+ inout flowSpec the_spec)
+ raises (streamOpDenied, noSuchFlow,
+ QoSRequestFailed, FPError);
+
+ /// Change the transport qos on a stream.
+ boolean modify_QoS (inout streamQoS new_qos,
+ in flowSpec the_flows)
+ raises (noSuchFlow,
+ QoSRequestFailed);
+
+ /// Used to restrict the set of protocols.
+ boolean set_protocol_restriction (in protocolSpec the_pspec);
+
+ /// Disconnect the flows.
+ void disconnect(in flowSpec the_spec)
+ raises (noSuchFlow,
+ streamOpFailed);
+
+ /// Used to control the SFP parameters.
+ void set_FPStatus (in flowSpec the_spec,
+ in string fp_name,
+ in any fp_settings)
+ raises (noSuchFlow,
+ FPError);
+
+ /// Not implemented in the light profile, throws notsupported.
+ Object get_fep (in string flow_name)
+ raises (notSupported,
+ noSuchFlow);
+
+ /// Not implemented in the light profile, throws notsupported.
+ string add_fep (in Object the_fep)
+ /// Can fail for reasons {duplicateFepName, duplicateRef}
+ raises (notSupported,
+ streamOpFailed);
+
+ /// Not implemented in the light profile, throws notsupported.
+ void remove_fep (in string fep_name)
+ raises (notSupported,
+ streamOpFailed);
+
+ /// Used to "attach" a negotiator to the endpoint.
+ void set_negotiator (in Negotiator new_negotiator);
+
+ /// Used for public key encryption.
+ void set_key (in string flow_name,
+ in key the_key);
+
+ /// Used to set a unique id for packets sent by this
+ /// streamendpoint.
+ void set_source_id (in long source_id);
+ };
+
+ /**
+ * @interface StreamEndPoint_A
+ * @brief The "A" side of a streamendpoint.
+ */
+ interface StreamEndPoint_A : StreamEndPoint
+ {
+ /// Used for ATM-style multicast.
+ boolean multiconnect (inout streamQoS the_qos,
+ inout flowSpec the_spec)
+ raises (noSuchFlow, QoSRequestFailed, streamOpFailed);
+
+ /// Used for ATM-style multicast.
+ boolean connect_leaf (in StreamEndPoint_B the_ep,
+ inout streamQoS the_qos,
+ in flowSpec the_flows)
+ raises (streamOpFailed, noSuchFlow,
+ QoSRequestFailed, notSupported);
+
+ /// Used for ATM-style multicast.
+ void disconnect_leaf (in StreamEndPoint_B the_ep,
+ in flowSpec theSpec)
+ raises(streamOpFailed, noSuchFlow, notSupported);
+ };
+
+ /**
+ * @interface StreamEndPoint_B
+ * @brief The "B" side of a streamendpoint.
+ */
+ interface StreamEndPoint_B : StreamEndPoint
+ {
+ /// Used for ATM-style multicast.
+ boolean multiconnect (inout streamQoS the_qos,
+ inout flowSpec the_spec)
+ raises (streamOpFailed, noSuchFlow,
+ QoSRequestFailed, FPError);
+
+ };
+
+ /**
+ * @interface VDev
+ * @brief Implements the VDev interface. One of these is created per
+ * connection, and represents device-specific parameters.
+ */
+ interface VDev : CosPropertyService::PropertySet
+ {
+ /// Called to tell the vdev who the streamctrl, peer vdev is.
+ boolean set_peer (in StreamCtrl the_ctrl,
+ in VDev the_peer_dev,
+ inout streamQoS the_qos,
+ in flowSpec the_spec)
+ raises (noSuchFlow,
+ QoSRequestFailed,
+ streamOpFailed);
+
+ /// Used to set the streamctrl and multicast device.
+ boolean set_Mcast_peer (in StreamCtrl the_ctrl,
+ in MCastConfigIf a_mcastconfigif,
+ inout streamQoS the_qos,
+ in flowSpec the_spec)
+ raises (noSuchFlow,
+ QoSRequestFailed,
+ streamOpFailed);
+
+ /// Called by the peer VDev to configure the device (catch all).
+ void configure (in CosPropertyService::Property the_config_mesg)
+ raises (PropertyException,
+ streamOpFailed);
+
+ /// Uses <formatName> standardised by OMG and IETF
+ /// Used to set a format on a flowname.
+ void set_format (in string flowName,
+ in string format_name)
+ raises (notSupported);
+
+ // = Note, some of these device params are standardised by OMG
+ /// Used to set device parameters.
+ void set_dev_params (in string flowName,
+ in CosPropertyService::Properties new_params)
+ raises (PropertyException,
+ streamOpFailed);
+
+ /// Called to change QoS of the device.
+ boolean modify_QoS (inout streamQoS the_qos,
+ in flowSpec the_spec)
+ raises (noSuchFlow,
+ QoSRequestFailed);
+
+
+ };
+
+ /**
+ * @interface MMDevice
+ * @brief Implements a factory to create Endpoints and VDevs.
+ */
+ interface MMDevice : CosPropertyService::PropertySet
+ {
+ /// Called by StreamCtrl to create a "A" type streamendpoint and
+ /// vdev.
+ StreamEndPoint_A create_A (in StreamCtrl the_requester,
+ out VDev the_vdev,
+ inout streamQoS the_qos,
+ out boolean met_qos,
+ inout string named_vdev,
+ in flowSpec the_spec)
+ raises (streamOpFailed,
+ streamOpDenied,
+ notSupported,
+ QoSRequestFailed,
+ noSuchFlow);
+
+ /// Called by StreamCtrl to create a "B" type streamendpoint and
+ /// vdev.
+ StreamEndPoint_B create_B(in StreamCtrl the_requester,
+ out VDev the_vdev,
+ inout streamQoS the_qos,
+ out boolean met_qos,
+ inout string named_vdev,
+ in flowSpec the_spec)
+ raises (streamOpFailed,
+ streamOpDenied,
+ notSupported,
+ QoSRequestFailed,
+ noSuchFlow);
+
+ /// Can be used to request the MMDevice to create a new
+ /// StreamCtrl, and call bind_devs on it.
+ StreamCtrl bind (in MMDevice peer_device,
+ inout streamQoS the_qos,
+ out boolean is_met,
+ in flowSpec the_spec)
+ raises (streamOpFailed,
+ noSuchFlow,
+ QoSRequestFailed);
+
+ /// Multicast bind.
+ StreamCtrl bind_mcast (in MMDevice first_peer,
+ inout streamQoS the_qos,
+ out boolean is_met,
+ in flowSpec the_spec)
+ raises (streamOpFailed,
+ noSuchFlow,
+ QoSRequestFailed);
+
+ /// Remove the StreamEndPoint and the related vdev.
+ void destroy (in StreamEndPoint the_ep,
+ in string vdev_name)
+ // ie VDev not found
+ raises (notSupported);
+
+ /// Not supported in the light profile, raises notsupported.
+ string add_fdev (in Object the_fdev)
+ raises (notSupported,
+ streamOpFailed);
+
+ /// Not supported in the light profile, raises notsupported.
+ Object get_fdev (in string flow_name)
+ raises (notSupported,
+ noSuchFlow);
+
+ /// Not supported in the light profile, raises notsupported.
+ void remove_fdev (in string flow_name)
+ raises (notSupported,
+ noSuchFlow,
+ streamOpFailed);
+ };
+
+ // Define the exceptions.
+ exception protocolNotSupported{};
+ exception formatNotSupported{};
+ exception formatMismatch{};
+ exception FEPMismatch{};
+ exception alreadyConnected{};
+ exception invalidSettings{string settings;};
+ exception notConnected{};
+ exception deviceQosMismatch{};
+ exception failedToConnect{string reason;};
+ exception failedToListen{string reason;};
+
+ // Forward declarations of the interfaces.
+ interface FlowProducer;
+ interface FlowConsumer;
+ interface FlowEndPoint;
+ interface FDev;
+
+ interface FlowConnection : CosPropertyService::PropertySet{
+ void stop();
+ void start();
+ void destroy();
+
+ boolean modify_QoS(inout AVStreams::QoS new_qos)
+ raises (AVStreams::QoSRequestFailed);
+
+ boolean use_flow_protocol(in string fp_name,
+ in any fp_settings)
+ raises (AVStreams::FPError, AVStreams::notSupported);
+
+ oneway void push_event(in AVStreams::streamEvent the_event);
+
+ boolean connect_devs(in FDev a_party, in FDev b_party,
+ inout AVStreams::QoS the_qos)
+ raises (AVStreams::streamOpFailed,
+ AVStreams::streamOpDenied,
+ AVStreams::QoSRequestFailed);
+
+ boolean connect(in FlowProducer flow_producer,
+ in FlowConsumer flow_consumer,
+ inout AVStreams::QoS the_qos)
+ raises (formatMismatch, FEPMismatch, alreadyConnected);
+
+ boolean disconnect();
+
+ // The notSupported exception is raised where
+ // flow cannot have multiple producers
+ boolean add_producer(in FlowProducer flow_producer,
+ inout AVStreams::QoS the_qos)
+ raises (alreadyConnected, AVStreams::notSupported);
+
+ boolean add_consumer(in FlowConsumer flow_consumer,
+ inout AVStreams::QoS the_qos)
+ raises (alreadyConnected);
+
+ boolean drop(in FlowEndPoint target)
+ raises (notConnected);
+ };
+
+ interface FlowEndPoint : CosPropertyService::PropertySet
+ {
+ boolean lock();
+ void unlock();
+
+ void stop();
+ void start();
+ void destroy();
+
+ /// Default is a nil object reference
+ attribute AVStreams::StreamEndPoint related_sep;
+ attribute FlowConnection related_flow_connection;
+
+ FlowEndPoint get_connected_fep()
+ raises (notConnected,AVStreams::notSupported);
+
+ /// syntax of fp_name is <flowProtocol>
+ boolean use_flow_protocol(in string fp_name,
+ in any fp_settings)
+ raises (AVStreams::FPError, AVStreams::notSupported);
+
+ /// set_format() initializes ëformatí
+ /// as current media format e.g. MPEG.
+ void set_format(in string format)
+ raises (AVStreams::notSupported);
+
+ void set_dev_params(in CosPropertyService::Properties new_settings)
+ // raises (CosPropertyService::PropertyException, AVStreams::streamOpFailed);
+ raises (PropertyException, AVStreams::streamOpFailed);
+
+ void set_protocol_restriction(in AVStreams::protocolSpec the_spec)
+ raises (AVStreams::notSupported);
+
+ boolean is_fep_compatible(in FlowEndPoint fep)
+ raises (formatMismatch, deviceQosMismatch);
+
+ boolean set_peer(in FlowConnection the_fc,
+ in FlowEndPoint the_peer_fep,
+ inout AVStreams::QoS the_qos)
+ raises (AVStreams::QoSRequestFailed,
+ AVStreams::streamOpFailed);
+
+ boolean set_Mcast_peer(in FlowConnection the_fc,
+ in AVStreams::MCastConfigIf a_mcastconfigif,
+ inout AVStreams::QoS the_qos)
+ raises (AVStreams::QoSRequestFailed);
+
+ boolean connect_to_peer(inout AVStreams::QoS the_qos,
+ in string address,
+ in string use_flow_protocol) // syntax <flowProtocol>
+ raises(failedToConnect,AVStreams::FPError, AVStreams::QoSRequestFailed);
+
+ /// Needs to know its peer to choose its protocol correctly
+ /// Also to ask for a reverse channel for credit-based flow
+ /// control, if one is required
+ string go_to_listen(inout AVStreams::QoS the_qos,
+ in boolean is_mcast,
+ in FlowEndPoint peer,
+ inout string flowProtocol)// syntax <flowProtocol>
+ // The out value of flowProtocol contains SFP version
+ // supported and all options including "Credit".
+ raises(failedToListen, AVStreams::FPError,
+ AVStreams::QoSRequestFailed);
+ };
+
+ interface FlowProducer : FlowEndPoint
+ {
+ string connect_mcast(inout AVStreams::QoS the_qos,
+ out boolean is_met,
+ in string address,
+ in string use_flow_protocol)
+ raises (failedToConnect,
+ AVStreams::notSupported,
+ AVStreams::FPError,
+ AVStreams::QoSRequestFailed);
+
+ string get_rev_channel(in string pcol_name);
+ void set_key(in AVStreams::key the_key);
+ void set_source_id(in long source_id);
+ };
+
+ interface FlowConsumer : FlowEndPoint
+ {
+ };
+
+ interface FDev : CosPropertyService::PropertySet {
+ FlowProducer create_producer(in FlowConnection the_requester,
+ inout AVStreams::QoS the_qos,
+ out boolean met_qos,
+ inout string named_fdev)
+ raises(AVStreams::streamOpFailed,
+ AVStreams::streamOpDenied,
+ AVStreams::notSupported,
+ AVStreams::QoSRequestFailed);
+
+ FlowConsumer create_consumer(in FlowConnection the_requester,
+ inout AVStreams::QoS the_qos,
+ out boolean met_qos,
+ inout string named_fdev)
+ raises(AVStreams::streamOpFailed,
+ AVStreams::streamOpDenied,
+ AVStreams::notSupported,
+ AVStreams::QoSRequestFailed);
+
+ FlowConnection bind(in FDev peer_device,
+ inout AVStreams::QoS the_qos,
+ out boolean is_met)
+ raises (AVStreams::streamOpFailed,
+ AVStreams::QoSRequestFailed);
+
+ FlowConnection bind_mcast(in FDev first_peer,
+ inout AVStreams::QoS the_qos,
+ out boolean is_met)
+ raises (AVStreams::streamOpFailed,
+ AVStreams::QoSRequestFailed);
+
+ void destroy(in FlowEndPoint the_ep, in string fdev_name)
+ // ie FDev not found
+ raises (AVStreams::notSupported);
+ };
+
+ enum PositionOrigin {
+ AbsolutePosition, RelativePosition, ModuloPosition
+ };
+
+ enum PositionKey {
+ ByteCount, SampleCount, MediaTime
+ };
+
+ struct Position {
+ PositionOrigin origin;
+ PositionKey key;
+ long value;
+ };
+
+ exception PostionKeyNotSupported { PositionKey key;};
+ exception InvalidPosition { PositionKey key;};
+
+ /**
+ * @interface MediaControl
+ * @brief MediaControl interface is similar to ControlledStream
+ * interface in MSS. It can be inherited by flow endpoints or
+ * FlowConnection interfaces.
+ */
+ interface MediaControl{
+
+ exception PostionKeyNotSupported { PositionKey key;};
+
+ Position get_media_position(in PositionOrigin an_origin,
+ in PositionKey a_key)
+ raises (PostionKeyNotSupported);
+
+ void set_media_position(in Position a_position)
+ raises (PostionKeyNotSupported, InvalidPosition);
+
+ void start(in Position a_position)
+ raises(InvalidPosition);
+ void pause(in Position a_position)
+ raises(InvalidPosition);
+ void resume(in Position a_position)
+ raises(InvalidPosition);
+ void stop(in Position a_position)
+ raises(InvalidPosition);
+ };
+
+ // Additional sequences needed for the properties.
+
+ typedef sequence<FlowConnection> FlowConnection_seq;
+ typedef sequence<StreamEndPoint_A> StreamEndPoint_A_seq;
+ typedef sequence<StreamEndPoint_B> StreamEndPoint_B_seq;
+ typedef sequence<FlowEndPoint> FlowEndPoint_seq;
+ typedef sequence<Object> Object_seq;
+};
+
+#endif /* TAO_AV_STREAMS_IDL */
diff --git a/TAO/orbsvcs/orbsvcs/CSI.idl b/TAO/orbsvcs/orbsvcs/CSI.idl
new file mode 100644
index 00000000000..bf19d332c1e
--- /dev/null
+++ b/TAO/orbsvcs/orbsvcs/CSI.idl
@@ -0,0 +1,201 @@
+// -*- IDL -*-
+
+//=============================================================================
+/**
+ * @file CSI.idl
+ *
+ * $Id$
+ *
+ * @author Object Management Group
+ */
+//=============================================================================
+
+
+#ifndef _CSI_IDL_
+#define _CSI_IDL_
+
+// #include <IOP.idl>
+#include "tao/IOP_IOR.pidl"
+
+module IOP
+{
+ const ServiceId SecurityAttributeService = 15;
+};
+
+module CSI {
+ typeprefix CSI "omg.org";
+
+ // The OMG VMCID; same value as CORBA::OMGVMCID. Do not change ever.
+ const unsigned long OMGVMCID = 0x4F4D0;
+
+ // An X509CertificateChain contains an ASN.1 BER encoded SEQUENCE
+ // [1..MAX] OF X.509 certificates encapsulated in a sequence of octets. The
+ // subject's certificate shall come first in the list. Each following
+ // certificate shall directly certify the one preceding it. The ASN.1
+ // representation of Certificate is as defined in [IETF RFC 2459].
+ typedef sequence <octet> X509CertificateChain;
+
+ // an X.501 type name or Distinguished Name encapsulated in a sequence of
+ // octets containing the ASN.1 encoding.
+ typedef sequence <octet> X501DistinguishedName;
+
+ // UTF-8 Encoding of String
+ typedef sequence <octet> UTF8String;
+
+ // ASN.1 Encoding of an OBJECT IDENTIFIER
+ typedef sequence <octet> OID;
+ typedef sequence <OID> OIDList;
+
+ // A sequence of octets containing a GSStoken. Initial context tokens are
+ // ASN.1 encoded as defined in [IETF RFC 2743] Section 3.1,
+ // "Mechanism-Independent token Format", pp. 81-82. Initial context tokens
+ // contain an ASN.1 tag followed by a token length, a mechanism identifier,
+ // and a mechanism-specific token (i.e. a GSSUP::InitialContextToken). The
+ // encoding of all other GSS tokens (e.g. error tokens and final context
+ // tokens) is mechanism dependent.
+ typedef sequence <octet> GSSToken;
+
+ // An encoding of a GSS Mechanism-Independent Exported Name Object as
+ // defined in [IETF RFC 2743] Section 3.2, "GSS Mechanism-Independent
+ // Exported Name Object Format," p. 84.
+ typedef sequence <octet> GSS_NT_ExportedName;
+ typedef sequence <GSS_NT_ExportedName> GSS_NT_ExportedNameList;
+
+ // The MsgType enumeration defines the complete set of service context
+ // message types used by the CSI context management protocols, including
+ // those message types pertaining only to the stateful application of the
+ // protocols (to insure proper alignment of the identifiers between
+ // stateless and stateful implementations). Specifically, the
+ // MTMessageInContext is not sent by stateless clients (although it may
+ // be received by stateless targets).
+ typedef short MsgType;
+
+ const MsgType MTEstablishContext = 0;
+ const MsgType MTCompleteEstablishContext = 1;
+ const MsgType MTContextError = 4;
+ const MsgType MTMessageInContext = 5;
+
+ // The ContextId type is used carry session identifiers. A stateless
+ // application of the service context protocol is indicated by a session
+ // identifier value of 0.
+ typedef unsigned long long ContextId;
+
+ // The AuthorizationElementType defines the contents and encoding of
+ // the_element field of the AuthorizationElement.
+ // The high order 20-bits of each AuthorizationElementType constant
+ // shall contain the Vendor Minor Codeset ID (VMCID) of the
+ // organization that defined the element type. The low order 12 bits
+ // shall contain the organization-scoped element type identifier. The
+ // high-order 20 bits of all element types defined by the OMG shall
+ // contain the VMCID allocated to the OMG (that is, 0x4F4D0).
+ typedef unsigned long AuthorizationElementType;
+
+ // An AuthorizationElementType of X509AttributeCertChain indicates
+ // that the_element field of the AuthorizationElement contains an
+ // ASN.1 BER SEQUENCE composed of an (X.509) AttributeCertificate
+ // followed by a SEQUENCE OF (X.509) Certificate. The two-part
+ // SEQUENCE is encapsulated in an octet stream. The chain of
+ // identity certificates is provided to certify the attribute
+ // certificate. Each certificate in the chain shall directly certify
+ // the one preceding it. The first certificate in the chain shall
+ // certify the attribute certificate. The ASN.1 representation of
+ // (X.509) Certificate is as defined in [IETF RFC 2459]. The ASN.1
+ // representation of (X.509) AttributeCertificate is as defined in
+ // [IETF ID PKIXAC].
+ const AuthorizationElementType X509AttributeCertChain = OMGVMCID | 1;
+
+ typedef sequence <octet> AuthorizationElementContents;
+
+ // The AuthorizationElement contains one element of an authorization token.
+ // Each element of an authorization token is logically a PAC.
+ struct AuthorizationElement {
+ AuthorizationElementType the_type;
+ AuthorizationElementContents the_element;
+ };
+
+ // The AuthorizationToken is made up of a sequence of
+ // AuthorizationElements
+ typedef sequence <AuthorizationElement> AuthorizationToken;
+ typedef unsigned long IdentityTokenType;
+
+ // Additional standard identity token types shall only be defined by the
+ // OMG. All IdentityTokenType constants shall be a power of 2.
+ const IdentityTokenType ITTAbsent = 0;
+ const IdentityTokenType ITTAnonymous = 1;
+ const IdentityTokenType ITTPrincipalName = 2;
+ const IdentityTokenType ITTX509CertChain = 4;
+ const IdentityTokenType ITTDistinguishedName = 8;
+
+ typedef sequence <octet> IdentityExtension;
+
+ union IdentityToken switch ( IdentityTokenType ) {
+ case ITTAbsent: boolean absent;
+ case ITTAnonymous: boolean anonymous;
+ case ITTPrincipalName: GSS_NT_ExportedName principal_name;
+ case ITTX509CertChain: X509CertificateChain certificate_chain;
+ case ITTDistinguishedName: X501DistinguishedName dn;
+ default: IdentityExtension id;
+ };
+
+ struct EstablishContext {
+ ContextId client_context_id;
+ AuthorizationToken authorization_token;
+ IdentityToken identity_token;
+ GSSToken client_authentication_token;
+ };
+
+ struct CompleteEstablishContext {
+ ContextId client_context_id;
+ boolean context_stateful;
+ GSSToken final_context_token;
+ };
+
+ struct ContextError {
+ ContextId client_context_id;
+ long major_status;
+ long minor_status;
+ GSSToken error_token;
+ };
+
+ // Not sent by stateless clients. If received by a stateless server, a
+ // ContextError message should be returned, indicating the session does
+ // not exist.
+ struct MessageInContext {
+ ContextId client_context_id;
+ boolean discard_context;
+ };
+
+ union SASContextBody switch ( MsgType ) {
+ case MTEstablishContext: EstablishContext establish_msg;
+ case MTCompleteEstablishContext: CompleteEstablishContext
+ complete_msg;
+ case MTContextError: ContextError error_msg;
+ case MTMessageInContext: MessageInContext in_context_msg;
+ };
+
+ // The following type represents the string representation of an ASN.1
+ // OBJECT IDENTIFIER (OID). OIDs are represented by the string "oid:"
+ // followed by the integer base 10 representation of the OID separated
+ // by dots. For example, the OID corresponding to the OMG is represented
+ // as: "oid:2.23.130"
+ typedef string StringOID;
+
+ // The GSS Object Identifier for the KRB5 mechanism is:
+ // { iso(1) member-body(2) United States(840) mit(113554) infosys(1)
+ // gssapi(2) krb5(2) }
+ const StringOID KRB5MechOID = "oid:1.2.840.113554.1.2.2";
+
+ // The GSS Object Identifier for name objects of the Mechanism-independent
+ // Exported Name Object type is:
+ // { iso(1) org(3) dod(6) internet(1) security(5) nametypes(6)
+ // gss-api-exported-name(4) }
+ const StringOID GSS_NT_Export_Name_OID = "oid:1.3.6.1.5.6.4";
+
+ // The GSS Object Identifier for the scoped-username name form is:
+ // { iso-itu-t (2) international-organization (23) omg (130) security (1)
+ // naming (2) scoped-username(1) }
+ const StringOID GSS_NT_Scoped_Username_OID = "oid:2.23.130.1.2.1";
+
+}; // CSI
+
+#endif
diff --git a/TAO/orbsvcs/orbsvcs/CSIIOP.idl b/TAO/orbsvcs/orbsvcs/CSIIOP.idl
new file mode 100644
index 00000000000..548ddb0f76d
--- /dev/null
+++ b/TAO/orbsvcs/orbsvcs/CSIIOP.idl
@@ -0,0 +1,153 @@
+// -*- IDL -*-
+
+//=============================================================================
+/**
+ * @file CSIIOP.idl
+ *
+ * $Id$
+ *
+ * @author Object Management Group
+ */
+//=============================================================================
+
+#ifndef _CSIIOP_IDL_
+#define _CSIIOP_IDL_
+
+//#include <tao/IOP.pidl>
+#include "tao/IOP_IOR.pidl"
+#include "CSI.idl"
+//import ::IOP
+//import ::CSI
+
+module IOP
+{
+ const ComponentId TAG_CSI_SEC_MECH_LIST = 33;
+ const ComponentId TAG_NULL_TAG = 34;
+ const ComponentId TAG_SECIOP_SEC_TRANS = 35;
+ const ComponentId TAG_TLS_SEC_TRANS = 36;
+};
+
+module CSIIOP {
+ typeprefix CSIIOP "omg.org";
+
+ // Association options
+ typedef unsigned short AssociationOptions;
+
+ const AssociationOptions NoProtection = 1;
+ const AssociationOptions Integrity = 2;
+ const AssociationOptions Confidentiality = 4;
+ const AssociationOptions DetectReplay = 8;
+ const AssociationOptions DetectMisordering = 16;
+ const AssociationOptions EstablishTrustInTarget = 32;
+ const AssociationOptions EstablishTrustInClient = 64;
+ const AssociationOptions NoDelegation = 128;
+ const AssociationOptions SimpleDelegation = 256;
+ const AssociationOptions CompositeDelegation = 512;
+ const AssociationOptions IdentityAssertion = 1024;
+ const AssociationOptions DelegationByClient = 2048;
+
+ // The high order 20-bits of each ServiceConfigurationSyntax constant
+ // shall contain the Vendor Minor Codeset ID (VMCID) of the
+ // organization that defined the syntax. The low order 12 bits shall
+ // contain the organization-scoped syntax identifier. The high-order 20
+ // bits of all syntaxes defined by the OMG shall contain the VMCID
+ // allocated to the OMG (that is, 0x4F4D0).
+ typedef unsigned long ServiceConfigurationSyntax;
+
+ const ServiceConfigurationSyntax SCS_GeneralNames = CSI::OMGVMCID | 0;
+ const ServiceConfigurationSyntax SCS_GSSExportedName = CSI::OMGVMCID | 1;
+
+ typedef sequence <octet> ServiceSpecificName;
+
+ // The name field of the ServiceConfiguration structure identifies a
+ // privilege authority in the format identified in the syntax field. If the
+ // syntax is SCS_GeneralNames, the name field contains an ASN.1 (BER)
+ // SEQUENCE [1..MAX] OF GeneralName, as defined by the type GeneralNames in
+ // [IETF RFC 2459]. If the syntax is SCS_GSSExportedName, the name field
+ // contains a GSS exported name encoded according to the rules in
+ // [IETF RFC 2743] Section 3.2, "Mechanism-Independent Exported Name
+ // Object Format," p. 84.
+
+ struct ServiceConfiguration {
+ ServiceConfigurationSyntax syntax;
+ ServiceSpecificName name;
+ };
+
+ typedef sequence <ServiceConfiguration> ServiceConfigurationList;
+
+ // The body of the TAG_NULL_TAG component is a sequence of octets of
+ // length 0.
+
+ // type used to define AS layer functionality within a compound mechanism
+ // definition
+
+ struct AS_ContextSec {
+ AssociationOptions target_supports;
+ AssociationOptions target_requires;
+ CSI::OID client_authentication_mech;
+ CSI::GSS_NT_ExportedName target_name;
+ };
+
+ // type used to define SAS layer functionality within a compound mechanism
+ // definition
+
+ struct SAS_ContextSec {
+ AssociationOptions target_supports;
+ AssociationOptions target_requires;
+ ServiceConfigurationList privilege_authorities;
+ CSI::OIDList supported_naming_mechanisms;
+ CSI::IdentityTokenType supported_identity_types;
+ };
+
+ // type used in the body of a TAG_CSI_SEC_MECH_LIST component to
+ // describe a compound mechanism
+
+ struct CompoundSecMech {
+ AssociationOptions target_requires;
+ IOP::TaggedComponent transport_mech;
+ AS_ContextSec as_context_mech;
+ SAS_ContextSec sas_context_mech;
+ };
+
+ typedef sequence <CompoundSecMech> CompoundSecMechanisms;
+
+ // type corresponding to the body of a TAG_CSI_SEC_MECH_LIST
+ // component
+
+ struct CompoundSecMechList {
+ boolean stateful;
+ CompoundSecMechanisms mechanism_list;
+ };
+
+ struct TransportAddress {
+ string host_name;
+ unsigned short port;
+ };
+
+ typedef sequence <TransportAddress> TransportAddressList;
+
+ // Tagged component for configuring SECIOP as a CSIv2 transport mechanism
+
+ const IOP::ComponentId TAG_SECIOP_SEC_TRANS = 35;
+
+ struct SECIOP_SEC_TRANS {
+ AssociationOptions target_supports;
+ AssociationOptions target_requires;
+ CSI::OID mech_oid;
+ CSI::GSS_NT_ExportedName target_name;
+ TransportAddressList addresses;
+ };
+
+ // tagged component for configuring TLS/SSL as a CSIv2 transport mechanism
+
+ const IOP::ComponentId TAG_TLS_SEC_TRANS = 36;
+
+ struct TLS_SEC_TRANS {
+ AssociationOptions target_supports;
+ AssociationOptions target_requires;
+ TransportAddressList addresses;
+ };
+
+}; //CSIIOP
+
+#endif
diff --git a/TAO/orbsvcs/orbsvcs/Channel_Clients_T.cpp b/TAO/orbsvcs/orbsvcs/Channel_Clients_T.cpp
new file mode 100644
index 00000000000..80eeaf1d7ac
--- /dev/null
+++ b/TAO/orbsvcs/orbsvcs/Channel_Clients_T.cpp
@@ -0,0 +1,41 @@
+// $Id$
+
+#ifndef ACE_CHANNEL_CLIENTS_T_CPP
+#define ACE_CHANNEL_CLIENTS_T_CPP
+
+#include "orbsvcs/Channel_Clients_T.h"
+
+#if !defined (__ACE_INLINE__)
+#include "orbsvcs/Channel_Clients_T.i"
+#endif /* __ACE_INLINE__ */
+
+TAO_BEGIN_VERSIONED_NAMESPACE_DECL
+
+template<class TARGET> void
+ACE_PushConsumer_Adapter<TARGET>::push (const RtecEventComm::EventSet& events
+ ACE_ENV_ARG_DECL)
+ ACE_THROW_SPEC ((CORBA::SystemException))
+{
+ target_->push (events ACE_ENV_ARG_PARAMETER);
+}
+
+template<class TARGET> void
+ACE_PushConsumer_Adapter<TARGET>::disconnect_push_consumer (
+ ACE_ENV_SINGLE_ARG_DECL)
+ ACE_THROW_SPEC ((CORBA::SystemException))
+{
+
+ target_->disconnect_push_consumer (ACE_ENV_SINGLE_ARG_PARAMETER);
+}
+
+template<class TARGET> void
+ACE_PushSupplier_Adapter<TARGET>::disconnect_push_supplier (
+ ACE_ENV_SINGLE_ARG_DECL)
+ ACE_THROW_SPEC ((CORBA::SystemException))
+{
+ target_->disconnect_push_supplier (ACE_ENV_SINGLE_ARG_PARAMETER);
+}
+
+TAO_END_VERSIONED_NAMESPACE_DECL
+
+#endif /* ACE_CHANNEL_CLIENTS_T_CPP */
diff --git a/TAO/orbsvcs/orbsvcs/Channel_Clients_T.h b/TAO/orbsvcs/orbsvcs/Channel_Clients_T.h
new file mode 100644
index 00000000000..10071d978ea
--- /dev/null
+++ b/TAO/orbsvcs/orbsvcs/Channel_Clients_T.h
@@ -0,0 +1,99 @@
+// -*- C++ -*-
+
+// $Id$
+
+// ============================================================================
+//
+// = LIBRARY
+// ace
+//
+// = FILENAME
+// Channel_Clients_T
+//
+// = AUTHOR
+// Tim Harrison (harrison@cs.wustl.edu) and
+// Douglas Schmidt (schmidt@cs.wustl.edu)
+//
+// = DESCRIPTION
+// These classes allow applications to be consumer, suppliers, and
+// consumer suppliers, as well as being active objects. This is
+// accomplished with adapters to prevent the use of multiple
+// inheritence (which is this root of all evil.)
+//
+// ============================================================================
+
+#ifndef ACE_CHANNEL_CLIENTS_T_H
+#define ACE_CHANNEL_CLIENTS_T_H
+#include /**/ "ace/pre.h"
+
+#include "orbsvcs/RtecEventCommS.h"
+
+TAO_BEGIN_VERSIONED_NAMESPACE_DECL
+
+/**
+ * @class ACE_PushConsumer_Adapter
+ *
+ * @brief ACE Push Consumer Adapter
+ *
+ * Forwards all calls to the target_.
+ */
+template <class TARGET>
+class ACE_PushConsumer_Adapter : public POA_RtecEventComm::PushConsumer
+{
+public:
+ /// Forwards all calls to @a target.
+ ACE_PushConsumer_Adapter (TARGET *target);
+
+ /// Forwards to target_.
+ virtual void push (const RtecEventComm::EventSet& events
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS)
+ ACE_THROW_SPEC (( CORBA::SystemException));
+
+ /// Forwards to target_.
+ virtual void disconnect_push_consumer (ACE_ENV_SINGLE_ARG_DECL_WITH_DEFAULTS)
+ ACE_THROW_SPEC (( CORBA::SystemException));
+
+private:
+ TARGET *target_;
+};
+
+// ************************************************************
+
+/**
+ * @class ACE_PushSupplier_Adapter
+ *
+ * @brief ACE Push Supplier Adapter
+ *
+ * Forwards all calls to disconnect_push_supplier to the target_.
+ */
+template <class TARGET>
+class ACE_PushSupplier_Adapter : public POA_RtecEventComm::PushSupplier
+{
+public:
+ /// Forwards all calls to <owner>.
+ ACE_PushSupplier_Adapter (TARGET *target);
+
+ /// Forwards to target_.
+ virtual void disconnect_push_supplier (ACE_ENV_SINGLE_ARG_DECL_WITH_DEFAULTS)
+ ACE_THROW_SPEC (( CORBA::SystemException));
+
+private:
+ TARGET *target_;
+};
+
+TAO_END_VERSIONED_NAMESPACE_DECL
+
+#if defined (__ACE_INLINE__)
+#include "orbsvcs/Channel_Clients_T.i"
+#endif /* __ACE_INLINE__ */
+
+#if defined (ACE_TEMPLATES_REQUIRE_SOURCE)
+#include "orbsvcs/Channel_Clients_T.cpp"
+#endif /* ACE_TEMPLATES_REQUIRE_SOURCE */
+
+#if defined (ACE_TEMPLATES_REQUIRE_PRAGMA)
+#pragma implementation ("Channel_Clients_T.cpp")
+#endif /* ACE_TEMPLATES_REQUIRE_PRAGMA */
+
+#include /**/ "ace/post.h"
+#endif /* ACE_CHANNEL_CLIENTS_T_H */
diff --git a/TAO/orbsvcs/orbsvcs/Channel_Clients_T.i b/TAO/orbsvcs/orbsvcs/Channel_Clients_T.i
new file mode 100644
index 00000000000..3c21f6c9bb2
--- /dev/null
+++ b/TAO/orbsvcs/orbsvcs/Channel_Clients_T.i
@@ -0,0 +1,19 @@
+// -*- C++ -*-
+//
+// $Id$
+
+TAO_BEGIN_VERSIONED_NAMESPACE_DECL
+
+template<class TARGET> ACE_INLINE
+ACE_PushConsumer_Adapter<TARGET>::ACE_PushConsumer_Adapter (TARGET *t)
+ : target_ (t)
+{
+}
+
+template<class TARGET> ACE_INLINE
+ACE_PushSupplier_Adapter<TARGET>::ACE_PushSupplier_Adapter (TARGET *t)
+ : target_ (t)
+{
+}
+
+TAO_END_VERSIONED_NAMESPACE_DECL
diff --git a/TAO/orbsvcs/orbsvcs/Concurrency/CC_Lock.cpp b/TAO/orbsvcs/orbsvcs/Concurrency/CC_Lock.cpp
new file mode 100644
index 00000000000..3e62837cfdb
--- /dev/null
+++ b/TAO/orbsvcs/orbsvcs/Concurrency/CC_Lock.cpp
@@ -0,0 +1,246 @@
+// $Id$
+
+// ============================================================================
+//
+// = LIBRARY
+// TAO/orbsvcs/Concurrency_Service
+//
+// = FILENAME
+// CC_Lock.cpp
+//
+// = DESCRIPTION
+// This class implements a lock used by the lock set from the
+// concurrency control service.
+//
+// = AUTHORS
+// Torben Worm <tworm@cs.wustl.edu>
+//
+// ============================================================================
+
+#include "orbsvcs/Concurrency/CC_Lock.h"
+#include "ace/Log_Msg.h"
+
+ACE_RCSID (Concurrency,
+ CC_Lock,
+ "$Id$")
+
+TAO_BEGIN_VERSIONED_NAMESPACE_DECL
+
+CC_Lock::CC_Lock (void)
+ : mode_ (CosConcurrencyControl::intention_read),
+ lock_held_ (0)
+{
+}
+
+CC_Lock::CC_Lock (CosConcurrencyControl::lock_mode mode)
+ : mode_ (mode),
+ lock_held_ (0)
+{
+}
+
+CC_Lock::~CC_Lock (void)
+{
+}
+
+void
+CC_Lock::lock (ACE_ENV_SINGLE_ARG_DECL_NOT_USED)
+{
+ ACE_DEBUG ((LM_DEBUG,
+ "CC_Lock::lock\n"));
+ lock_held_++;
+}
+
+CORBA::Boolean
+CC_Lock::try_lock (ACE_ENV_SINGLE_ARG_DECL)
+{
+ ACE_DEBUG ((LM_DEBUG,
+ "CC_Lock::try_lock. "));
+
+ lock_held_++;
+
+ ACE_DEBUG ((LM_DEBUG,
+ "lock_held_: %i, ",
+ lock_held_));
+
+ int success = 0;//semaphore_.tryacquire ();
+
+ ACE_DEBUG ((LM_DEBUG,
+ "success: %i\n", success));
+
+ if (success == -1)
+ {
+ if (errno == EBUSY)
+ {
+ lock_held_--;
+ return 0;
+ }
+ else
+ ACE_THROW_RETURN (CORBA::INTERNAL (),
+ 0);
+ }
+ ACE_DEBUG ((LM_DEBUG,
+ "lock_held_: %i, ",
+ lock_held_));
+
+ return 1;
+}
+
+void
+CC_Lock::unlock (ACE_ENV_SINGLE_ARG_DECL)
+{
+ ACE_DEBUG ((LM_DEBUG,
+ "CC_Lock::unlock\n"));
+ if (lock_held_ == 0)
+ ACE_THROW (CosConcurrencyControl::LockNotHeld ());
+
+ int success = 0; //semaphore_.release ();
+
+ if (success == -1)
+ ACE_THROW (CORBA::INTERNAL ());
+
+ lock_held_--;
+
+ ACE_DEBUG ((LM_DEBUG,
+ "lock_held_: %i, ",
+ lock_held_));
+}
+
+void
+CC_Lock::change_mode (CosConcurrencyControl::lock_mode new_mode
+ ACE_ENV_ARG_DECL)
+{
+ ACE_DEBUG ((LM_DEBUG,
+ "CC_Lock::change_mode\n"));
+
+ // @@TAO Hmmm, we cannot really do anything at present since there
+ // is only one lock per lock set and that lock is essentially a
+ // write lock
+
+ if (lock_held_ == 0)
+ ACE_THROW (CosConcurrencyControl::LockNotHeld ());
+
+ this->mode_ = new_mode;
+}
+
+void
+CC_Lock::set_mode (CosConcurrencyControl::lock_mode mode)
+{
+ this->mode_ = mode;
+}
+
+CORBA::Boolean
+CC_Lock::Compatible (const CC_Lock &other)
+{
+ return this->Compatible (other.mode_);
+}
+
+CORBA::Boolean
+CC_Lock::Compatible (CosConcurrencyControl::lock_mode mode)
+{
+ return compatible_[this->mode_][mode];
+}
+
+CosConcurrencyControl::lock_mode
+CC_Lock::GetMode (void)
+{
+ return mode_;
+}
+
+int
+CC_Lock::GetLocksHeld (void)
+{
+ return this->lock_held_;
+}
+
+void
+CC_Lock::DecLocksHeld (void)
+{
+ this->lock_held_--;
+}
+
+void
+CC_Lock::dump (void)
+{
+ ACE_DEBUG ((LM_DEBUG,
+ "mode_ %i, lock_held_: %i\n",
+ mode_,
+ lock_held_));
+}
+
+// The check of compatibility is a hard coded table statically
+// allocated. This table must be changed if the number of lock modes
+// or their compatibility are changed. The table here looks different
+// from the table in the spec, this is due to the different ordering
+// of the lock modes in the table and in the enum in the IDL. The
+// first index in the array is the mode held by this lock and the
+// second index is the requested mode.
+// Requested mode
+// Held mode R W U IR IW
+// R X X
+// W X X X X X
+// U X X X X = conflict
+// IR X
+// IW X X X
+//
+CORBA::Boolean CC_Lock::compatible_[NUMBER_OF_LOCK_MODES][NUMBER_OF_LOCK_MODES] ={
+ {1, 0, 1, 1, 0},
+ {0, 0, 0, 0, 0},
+ {1, 0, 0, 1, 0},
+ {1, 0, 1, 1, 1},
+ {0, 0, 0, 1, 1}};
+
+// CC_LockModeterator
+
+CC_LockModeIterator::CC_LockModeIterator (void)
+ : current_ (CosConcurrencyControl::intention_read)
+{
+}
+
+CC_LockModeIterator::~CC_LockModeIterator (void)
+{
+ // Do nothing
+}
+void CC_LockModeIterator::First (void)
+{
+ current_ = CosConcurrencyControl::intention_read;
+}
+
+void CC_LockModeIterator::Next (ACE_ENV_SINGLE_ARG_DECL)
+{
+ switch (current_)
+ {
+ case CosConcurrencyControl::intention_read:
+ current_ = CosConcurrencyControl::read;
+ break;
+ case CosConcurrencyControl::read:
+ current_ = CosConcurrencyControl::upgrade;
+ break;
+ case CosConcurrencyControl::upgrade:
+ current_ = CosConcurrencyControl::intention_write;
+ break;
+ case CosConcurrencyControl::intention_write:
+ current_ = CosConcurrencyControl::write;
+ break;
+ case CosConcurrencyControl::write:
+ ACE_THROW (CORBA::INTERNAL ());
+ default:
+ ACE_THROW (CORBA::INTERNAL ());
+ }
+}
+
+CORBA::Boolean
+CC_LockModeIterator::IsDone (void)
+{
+ if (current_ == CosConcurrencyControl::write)
+ return 1;
+ else
+ return 0;
+}
+
+CosConcurrencyControl::lock_mode
+CC_LockModeIterator::GetLockMode (void)
+{
+ return current_;
+}
+
+TAO_END_VERSIONED_NAMESPACE_DECL
diff --git a/TAO/orbsvcs/orbsvcs/Concurrency/CC_Lock.h b/TAO/orbsvcs/orbsvcs/Concurrency/CC_Lock.h
new file mode 100644
index 00000000000..622f973a9df
--- /dev/null
+++ b/TAO/orbsvcs/orbsvcs/Concurrency/CC_Lock.h
@@ -0,0 +1,148 @@
+// -*- C++ -*-
+
+//=============================================================================
+/**
+ * @file CC_Lock.h
+ *
+ * $Id$
+ *
+ * This class implements a lock used by the lock set from the
+ * concurrency control service
+ *
+ *
+ * @author Torben Worm <tworm@cs.wustl.edu>
+ */
+//=============================================================================
+
+
+#ifndef _CC_LOCK_H
+#define _CC_LOCK_H
+#include /**/ "ace/pre.h"
+
+#include "ace/config-all.h"
+
+#if !defined (ACE_LACKS_PRAGMA_ONCE)
+# pragma once
+#endif /* ACE_LACKS_PRAGMA_ONCE */
+
+#include "orbsvcs/CosConcurrencyControlC.h"
+#include "orbsvcs/Concurrency/concurrency_serv_export.h"
+
+/// This constant defines the number of lock modes. There is really no
+/// way to set this constant dynamically because the nuber of lock
+/// modes are not stated as part of the IDL.
+#define NUMBER_OF_LOCK_MODES 5
+
+TAO_BEGIN_VERSIONED_NAMESPACE_DECL
+
+/**
+ * @class CC_Lock
+ *
+ * @brief CC_Lock
+ *
+ * This class implements the lock concept from the concurrency
+ * control service. The lock holds its mode - this might later
+ * be changed to subclasses depending on the differences of the
+ * locks. At present the is only a lock-pr-thread/client-type
+ * which is essentially a write lock since it is not allowed to
+ * have more than one lock pr. servant in this implementation.
+ */
+class TAO_Concurrency_Serv_Export CC_Lock
+{
+public:
+ /// Creates the lock with mode = intention_read (weakest)
+ CC_Lock (void);
+
+ /// Creates the lock with the desired mode
+ CC_Lock (CosConcurrencyControl::lock_mode mode);
+
+ /// Deletes the lock
+ ~CC_Lock (void);
+
+ /// Acquires this lock. Blocks until lock is obtained
+ void lock (ACE_ENV_SINGLE_ARG_DECL);
+
+ /// Tries to acquire this lock. If it is not possible to acquire the
+ /// lock, false is returned
+ CORBA::Boolean try_lock (ACE_ENV_SINGLE_ARG_DECL);
+
+ /// Releases this lock.
+ void unlock (ACE_ENV_SINGLE_ARG_DECL);
+
+ /// Changes the mode of this lock.
+ void change_mode (CosConcurrencyControl::lock_mode new_mode
+ ACE_ENV_ARG_DECL);
+
+ /// Sets the mode_ of the lock. Used in initialization
+ void set_mode (CosConcurrencyControl::lock_mode mode);
+
+ /// Returns true if this lock is compatible with the other lock.
+ CORBA::Boolean Compatible (const CC_Lock &other);
+
+ /// Returns true is this lock is compatible with the referenced mode.
+ CORBA::Boolean Compatible (CosConcurrencyControl::lock_mode mode);
+
+ /// Returns the mode of the lock.
+ CosConcurrencyControl::lock_mode GetMode (void);
+
+ /// Returns the number of times this lock have been locked
+ int GetLocksHeld(void);
+
+ /// Decrements the number of locks held in this mode. Used by change_mode.
+ void DecLocksHeld(void);
+
+ /// Dumps the state of the object to stdout
+ void dump(void);
+
+protected:
+ /// Holds the lock's mode.
+ CosConcurrencyControl::lock_mode mode_;
+
+private:
+ /// If greater than zero the lock is held (that number of times).
+ int lock_held_;
+
+ /// Defines the compatibility of the locks.
+ static CORBA::Boolean compatible_[NUMBER_OF_LOCK_MODES][NUMBER_OF_LOCK_MODES];
+};
+
+/**
+ * @class CC_LockModeIterator
+ *
+ * @brief CC_LockModeIterator
+ *
+ * This class implements an iterator over the lock modes in
+ * order to make an ordered traversal over the locks from the
+ * weakest (intention read) to the strongest (write).
+ * Ordering: IR -> R -> U -> IW -> W
+ */
+class TAO_Concurrency_Serv_Export CC_LockModeIterator
+{
+public:
+ /// Default constructor
+ CC_LockModeIterator(void);
+
+ /// Destructor
+ ~CC_LockModeIterator(void);
+
+ /// Reset the iterator to the first element
+ void First(void);
+
+ /// Advance the iterator to the next element
+ /// Throws exception if out of range
+ void Next(ACE_ENV_SINGLE_ARG_DECL);
+
+ /// Returns true if the iterator has reached the last element
+ CORBA::Boolean IsDone(void);
+
+ /// Get the current element
+ CosConcurrencyControl::lock_mode GetLockMode(void);
+
+private:
+ CosConcurrencyControl::lock_mode current_;
+};
+
+TAO_END_VERSIONED_NAMESPACE_DECL
+
+#include /**/ "ace/post.h"
+#endif /* !defined (_CC_LOCK_H) */
diff --git a/TAO/orbsvcs/orbsvcs/Concurrency/CC_LockSet.cpp b/TAO/orbsvcs/orbsvcs/Concurrency/CC_LockSet.cpp
new file mode 100644
index 00000000000..91ef3d63be5
--- /dev/null
+++ b/TAO/orbsvcs/orbsvcs/Concurrency/CC_LockSet.cpp
@@ -0,0 +1,330 @@
+// $Id$
+
+// ============================================================================
+//
+// = LIBRARY
+// cos
+//
+// = FILENAME
+// CC_LockSet.cpp
+//
+// = AUTHOR
+// Torben Worm <tworm@cs.wustl.edu>
+//
+// ============================================================================
+
+#include "orbsvcs/Concurrency/CC_LockSet.h"
+
+ACE_RCSID (Concurrency,
+ CC_LockSet,
+ "$Id$")
+
+
+TAO_BEGIN_VERSIONED_NAMESPACE_DECL
+
+// Default constructor.
+
+CC_LockSet::CC_LockSet (void)
+ : related_lockset_ (0)
+{
+ ACE_TRY_NEW_ENV
+ {
+ this->Init (ACE_ENV_SINGLE_ARG_PARAMETER);
+ ACE_TRY_CHECK;
+ }
+ ACE_CATCHANY
+ {
+ ACE_PRINT_EXCEPTION (ACE_ANY_EXCEPTION,
+ "CC_LockSet::CC_LockSet (void)");
+ }
+ ACE_ENDTRY;
+}
+
+// Constructor used to create related lock sets.
+
+CC_LockSet::CC_LockSet (CosConcurrencyControl::LockSet_ptr related)
+ : related_lockset_ (related)
+{
+ ACE_TRY_NEW_ENV
+ {
+ this->Init (ACE_ENV_SINGLE_ARG_PARAMETER);
+ ACE_TRY_CHECK;
+ }
+ ACE_CATCHANY
+ {
+ ACE_PRINT_EXCEPTION (ACE_ANY_EXCEPTION,
+ "CC_LockSet::CC_LockSet (...)");
+ }
+ ACE_ENDTRY;
+}
+
+// Initialization.
+
+void
+CC_LockSet::Init (ACE_ENV_SINGLE_ARG_DECL)
+{
+ // Set the mode of the statically allocated locks
+ lock_[CC_IR] = 0;
+ lock_[CC_R] = 0;
+ lock_[CC_U] = 0;
+ lock_[CC_IW] = 0;
+ lock_[CC_W] = 0;
+
+ // Acquire the semaphore in order to be able to put requests on hold
+ if (semaphore_.acquire () == -1)
+ ACE_THROW (CORBA::INTERNAL ());
+}
+
+// Destructor
+
+CC_LockSet::~CC_LockSet (void)
+{
+}
+
+// Returns true if the requested lock mode is compatible with the
+// modes held. False otherwise.
+
+CORBA::Boolean CC_LockSet::compatible (CC_LockModeEnum mr)
+{
+ for (size_t i = CC_IR; i <= CC_W; i++)
+ if (this->lock_[i] > 0)
+ if (this->compatible_[i][mr] == 0)
+ return 0;
+
+ return 1;
+}
+
+// Locks the lock in the desired mode. Blocks until success.
+
+void
+CC_LockSet::lock (CosConcurrencyControl::lock_mode mode
+ ACE_ENV_ARG_DECL)
+ ACE_THROW_SPEC ((CORBA::SystemException))
+{
+ ACE_DEBUG ((LM_DEBUG, "CC_LockSet::lock\n"));
+
+ CC_LockModeEnum lm = lmconvert (mode);
+
+ // Check to see if the requested mode is compatible with the modes
+ // held so far. If not put the request on hold.
+
+ // @@ It's important to document somewhere that this code relies on
+ // the FIFO properties of ACE_Token!
+ if (this->lock_i (lm) == 1)
+ if (semaphore_.acquire () == -1)
+ ACE_THROW (CORBA::INTERNAL ());
+}
+
+// Tries to lock. If it is not possible false is returned.
+
+CORBA::Boolean
+CC_LockSet::try_lock (CosConcurrencyControl::lock_mode mode
+ ACE_ENV_ARG_DECL_NOT_USED)
+ ACE_THROW_SPEC ((CORBA::SystemException))
+{
+ CC_LockModeEnum lm = lmconvert (mode);
+
+ ACE_DEBUG ((LM_DEBUG,
+ "CC_LockSet::try_lock\n"));
+
+ if (this->try_lock_i (lm) == 0)
+ return 0;
+ else
+ return 1;
+}
+
+// Converts the enum from the spec to the internally (ordered)
+// enum.
+
+CC_LockModeEnum
+CC_LockSet::lmconvert (CosConcurrencyControl::lock_mode mode)
+{
+ switch (mode)
+ {
+ case CosConcurrencyControl::intention_read:
+ return CC_IR;
+ case CosConcurrencyControl::read:
+ return CC_R;
+ case CosConcurrencyControl::upgrade:
+ return CC_U;
+ case CosConcurrencyControl::intention_write:
+ return CC_IW;
+ case CosConcurrencyControl::write:
+ return CC_W;
+ default:
+ return CC_EM;
+ }
+}
+
+// Unlock the lock
+
+void
+CC_LockSet::unlock (CosConcurrencyControl::lock_mode mode
+ ACE_ENV_ARG_DECL)
+ ACE_THROW_SPEC ((CORBA::SystemException,
+ CosConcurrencyControl::LockNotHeld))
+{
+ ACE_DEBUG ((LM_DEBUG,
+ "CC_LockSet::unlock\n"));
+
+ CC_LockModeEnum lm = lmconvert (mode);
+
+ ACE_GUARD (TAO_SYNCH_MUTEX, ace_mon, this->mlock_);
+
+ if (lock_[lm] == 0) // This lock is not held.
+ ACE_THROW (CosConcurrencyControl::LockNotHeld());
+ else
+ lock_[lm]--;
+
+ // If we do not have a lock held in a weaker mode than the
+ // strongest held and we have requests on the semaphore signal
+ // the semaphore.
+ while (lock_queue_.size () > 0)
+ {
+ CC_LockModeEnum lock_on_queue = CC_EM;
+
+ lock_queue_.dequeue_head (lock_on_queue);
+
+ if (compatible (lock_on_queue) == 1)
+ {
+ if (semaphore_.release () == -1)
+ ACE_THROW (CORBA::INTERNAL ());
+ lock_[lock_on_queue]++;
+ }
+ else
+ {
+ lock_queue_.enqueue_head (lock_on_queue);
+ break;
+ }
+ }
+ this->dump ();
+}
+
+// Changes the mode of a held lock.
+
+void
+CC_LockSet::change_mode (CosConcurrencyControl::lock_mode held_mode,
+ CosConcurrencyControl::lock_mode new_mode
+ ACE_ENV_ARG_DECL)
+ ACE_THROW_SPEC ((CORBA::SystemException,
+ CosConcurrencyControl::LockNotHeld))
+{
+ ACE_DEBUG ((LM_DEBUG,
+ "CC_LockSet::change_mode\n"));
+ CC_LockModeEnum lm_held = lmconvert (held_mode);
+ CC_LockModeEnum lm_new = lmconvert (new_mode);
+
+ if (this->lock_held (lm_held) == 0) // This lock is not held
+ ACE_THROW (CosConcurrencyControl::LockNotHeld());
+ else if (this->change_mode_i (lm_held, lm_new)==1)
+ {
+ this->unlock (held_mode ACE_ENV_ARG_PARAMETER);
+ ACE_CHECK;
+
+ if (semaphore_.acquire () == -1)
+ ACE_THROW (CORBA::INTERNAL ());
+ }
+ // this->dump ();
+}
+
+int
+CC_LockSet::lock_i (CC_LockModeEnum lm)
+{
+ ACE_GUARD_RETURN (TAO_SYNCH_MUTEX, ace_mon, this->mlock_, 1);
+ // If the lock is not compatible with the locks we hold allready or
+ // there is lock requests in the queue we cannot grant the lock and
+ // thus we queue the request. Otherwise update the lock count.
+ if (compatible (lm) == 0 || lock_queue_.size () > 0)
+ {
+ // Put the lock mode in the queue
+ lock_queue_.enqueue_tail (lm);
+ this->dump ();
+ return 1; // Lock the semaphore.
+ }
+ else
+ lock_[lm]++;
+
+ this->dump ();
+ return 0;
+}
+
+int
+CC_LockSet::try_lock_i (CC_LockModeEnum lm)
+{
+ ACE_GUARD_RETURN (TAO_SYNCH_MUTEX, ace_mon, this->mlock_, 1);
+ // If the lock we try is compatible with the locks we hold we just
+ // opdates the count. Otherwise we return false.
+ if (compatible (lm) == 0)
+ {
+ this->dump ();
+ return 0;
+ }
+ else
+ lock_[lm]++;
+
+ this->dump ();
+ return 1;
+}
+
+int
+CC_LockSet::change_mode_i (CC_LockModeEnum lm_held,
+ CC_LockModeEnum lm_new)
+{
+ ACE_GUARD_RETURN (TAO_SYNCH_MUTEX, ace_mon, this->mlock_, 1);
+ // If the new mode is compatible with the modes we hold we change
+ // the counts for the two locks. If not we must queue the new
+ // request. We can decrement the count for the old mode without
+ // signalling the semaphore because we know we only check modes
+ // granted this far.
+
+ lock_[lm_held]--;
+
+ if (compatible (lm_new) == 1)
+ {
+ lock_[lm_new]++;
+ this->dump ();
+ return 0;
+ }
+ else
+ {
+ lock_[lm_held]++;
+ lock_queue_.enqueue_tail (lm_new);
+ this->dump ();
+ return 1;
+ }
+}
+
+int
+CC_LockSet::lock_held (CC_LockModeEnum lm)
+{
+ ACE_GUARD_RETURN (TAO_SYNCH_MUTEX, ace_mon, this->mlock_, 1);
+ if (lock_[lm] > 0)
+ return 1;
+ else
+ return 0;
+}
+
+void
+CC_LockSet::dump (void)
+{
+ ACE_DEBUG ((LM_DEBUG,
+ "waiting_calls_: %i, IR: %i, R: %i, U: %i, IW: %i, W: %i\n",
+ lock_queue_.size (),
+ lock_[CC_IR],
+ lock_[CC_R],
+ lock_[CC_U],
+ lock_[CC_IW],
+ lock_[CC_W]));
+}
+
+CORBA::Boolean const
+CC_LockSet::compatible_[NUMBER_OF_LOCK_MODES][NUMBER_OF_LOCK_MODES] =
+ {
+ {1, 1, 1, 1, 0},
+ {1, 1, 1, 0, 0},
+ {1, 1, 0, 0, 0},
+ {1, 0, 0, 1, 0},
+ {0, 0, 0, 0, 0}
+ };
+
+TAO_END_VERSIONED_NAMESPACE_DECL
diff --git a/TAO/orbsvcs/orbsvcs/Concurrency/CC_LockSet.h b/TAO/orbsvcs/orbsvcs/Concurrency/CC_LockSet.h
new file mode 100644
index 00000000000..1d01ebeef27
--- /dev/null
+++ b/TAO/orbsvcs/orbsvcs/Concurrency/CC_LockSet.h
@@ -0,0 +1,199 @@
+// -*- C++ -*-
+
+//=============================================================================
+/**
+ * @file CC_LockSet.h
+ *
+ * $Id$
+ *
+ * This class implements the lock set interface from the
+ * concurrency service.
+ *
+ * In the present implementation the multiple possesion semantics
+ * is implemented for non-transactional clients. In future
+ * versions this should be changed because the multiple possesion
+ * semantics does not apply to non-transactional clients. This
+ * can be accomplished in the following manner:
+ * - Make a class with the same functiallity as the CC_LockSet
+ * class as a base class for both implementations.
+ * - The functionallity that should be separated out in the
+ * subclasses is the compatible function which should always
+ * return false because no locks can be held simultanously with
+ * non-transactional clients.
+ * - Use these classes from the classes that inherits the
+ * servant properties, i.e. the way CC_LockSet does now.
+ *
+ *
+ * @author Torben Worm <tworm@cs.wustl.edu>
+ */
+//=============================================================================
+
+
+#ifndef _CC_LOCKSET_H
+#define _CC_LOCKSET_H
+
+#include /**/ "ace/pre.h"
+
+#include "ace/config-all.h"
+
+#if !defined (ACE_LACKS_PRAGMA_ONCE)
+# pragma once
+#endif /* ACE_LACKS_PRAGMA_ONCE */
+
+#include "ace/Thread_Mutex.h"
+#include "ace/Token.h"
+#include "ace/Unbounded_Queue.h"
+
+#include "orbsvcs/CosConcurrencyControlS.h"
+#include "orbsvcs/Concurrency/concurrency_serv_export.h"
+
+#if defined (lock_held)
+#undef lock_held
+#endif /* lock_held */
+
+/// This constant defines the number of lock modes. There is really no
+/// way to set this constant dynamically because the nuber of lock
+/// modes are not stated as part of the IDL.
+#define NUMBER_OF_LOCK_MODES 5
+
+TAO_BEGIN_VERSIONED_NAMESPACE_DECL
+
+/// Enummeration representing the lock modes. The incoming request is
+/// always converted to this representation. There are two reasons for
+/// this: Firstly the lock modes are ordered from weakest to strongest
+/// in the internal representation, and secondly it is possible to
+/// indicate a 'non-mode' (CC_EM)
+typedef enum {CC_EM=-1, CC_IR=0, CC_R, CC_U, CC_IW, CC_W} CC_LockModeEnum;
+
+/**
+ * @class CC_LockSet
+ *
+ * @brief CC_LockSet
+ *
+ * This class implements the LockSet interface that is part of
+ * the CosConcurrency service. Please consult the idl file for
+ * detailed descriptions apart from the comments in this file At
+ * present the lock set is not really a set, but only one lock.
+ */
+class TAO_Concurrency_Serv_Export CC_LockSet : public POA_CosConcurrencyControl::LockSet
+{
+public:
+
+ // = Initialization and termination methods.
+ /// Default constructor
+ CC_LockSet (void);
+
+ /// Constructor used if create_related is used to create the lock
+ /// set.
+ CC_LockSet (CosConcurrencyControl::LockSet_ptr related);
+
+ /// Destructor.
+ ~CC_LockSet (void);
+
+ // = CosConcurrencyControl methods
+ /// Acquires this lock. Blocks until lock is obtained
+ virtual void lock (CosConcurrencyControl::lock_mode mode
+ ACE_ENV_ARG_DECL)
+ ACE_THROW_SPEC ((CORBA::SystemException));
+
+ /// Tries to acquire this lock. If it is not possible to acquire the
+ /// lock, false is returned
+ virtual CORBA::Boolean try_lock (CosConcurrencyControl::lock_mode mode
+ ACE_ENV_ARG_DECL)
+ ACE_THROW_SPEC ((CORBA::SystemException));
+
+ /// Releases this lock.
+ virtual void unlock (CosConcurrencyControl::lock_mode mode
+ ACE_ENV_ARG_DECL)
+ ACE_THROW_SPEC ((CORBA::SystemException,
+ CosConcurrencyControl::LockNotHeld));
+
+ /// Changes the mode of this lock.
+ virtual void change_mode (CosConcurrencyControl::lock_mode held_mode,
+ CosConcurrencyControl::lock_mode new_mode
+ ACE_ENV_ARG_DECL)
+ ACE_THROW_SPEC ((CORBA::SystemException,
+ CosConcurrencyControl::LockNotHeld));
+
+ // = Debugging methods
+ /// Dump the state of the object to stdout
+ void dump (void);
+
+private:
+ /// Converts the CORBA specification's lock mode to the internal
+ /// representation
+ CC_LockModeEnum lmconvert (CosConcurrencyControl::lock_mode mode);
+
+ /// Initiatlizes the lock set array and acquires the initial
+ /// semaphore.
+ void Init (ACE_ENV_SINGLE_ARG_DECL);
+
+ /// Returns true if the held lock and the requested lock are compatible
+ CORBA::Boolean compatible (CC_LockModeEnum mr);
+
+ // The _i functions below ensures atomical access the the state data
+ // for the lock set. The functions acquires a thread lock in order
+ // to insure consistency within the lock set. The return value
+ // typically indicates whether the current thread should be
+ // suspended or not (by locking the semaphore.
+
+ /// Locks the access to the data and decides whether to lock or
+ /// not. Returns 1 if the semaphore should be locked.
+ int lock_i (CC_LockModeEnum lm);
+
+ // int unlock_i (CosConcurrencyControl::lock_mode lm);
+ // This function is not necessary because we lock access to the data
+ // and unlocks the semaphore until an invalid lock mode is first on
+ // the queue. Thereafter we release the lock.
+
+ /// Locks the access to the data and determines whether to return
+ /// true or false. Returns 1 if true should be returned.
+ int try_lock_i (CC_LockModeEnum lm);
+
+ /// Locks access to the data and determines if the semaphore should
+ /// be locked. Returns 1 if the semaphore should be locked.
+ int change_mode_i (CC_LockModeEnum lm_held,
+ CC_LockModeEnum lm_new);
+
+ /// Locks access ti the data and checks whether the lock is held.
+ int lock_held (CC_LockModeEnum lm);
+
+ /// An array of lock counters that counts how many locks of that type
+ /// that the lock set holds.
+ int lock_[NUMBER_OF_LOCK_MODES];
+
+ // ACE_Thread_Semaphore semaphore_;
+ /**
+ * This is the semaphore for the lock set. The semaphore is used to
+ * queue requests for locks in modes stronger than currently
+ * possible to grant. Note that the <ACE_Token> provides strict
+ * FIFO ordering of acquisition/release of the lock.
+ */
+ ACE_Token semaphore_;
+
+ /**
+ * If this lock set is related to another lock set, this is the
+ * pointer to the related lock set. This is a really simple
+ * solution, but since transactions are not supported in the first
+ * version there should be no reason to drop lock sets together. The
+ * <LockSetCoordinator> is not implemented (it has the
+ * responsibilities of dropping the locks).
+ */
+ CosConcurrencyControl::LockSet_ptr related_lockset_;
+
+ /// Mapping between requested and held lock modes. Used by compatible
+ /// (...). Uses the internal enumeration as indices.
+ static CORBA::Boolean const compatible_[NUMBER_OF_LOCK_MODES][NUMBER_OF_LOCK_MODES];
+
+ /// Lock to ensure that race conditions does not occur.
+ TAO_SYNCH_MUTEX mlock_;
+
+ /// Queue to hold the requested locks not yet granted.
+ ACE_Unbounded_Queue <CC_LockModeEnum> lock_queue_;
+};
+
+TAO_END_VERSIONED_NAMESPACE_DECL
+
+#include /**/ "ace/post.h"
+
+#endif /* _CC_LOCKSET_H */
diff --git a/TAO/orbsvcs/orbsvcs/Concurrency/CC_LockSetFactory.cpp b/TAO/orbsvcs/orbsvcs/Concurrency/CC_LockSetFactory.cpp
new file mode 100644
index 00000000000..dfe17f3913a
--- /dev/null
+++ b/TAO/orbsvcs/orbsvcs/Concurrency/CC_LockSetFactory.cpp
@@ -0,0 +1,62 @@
+//=============================================================================
+/**
+ * @file CC_LockSetFactory.cpp
+ *
+ * $Id$
+ *
+ * @author Torben Worm <tworm@cs.wustl.edu>
+ */
+//=============================================================================
+
+
+#include "orbsvcs/Concurrency/CC_LockSetFactory.h"
+#include "orbsvcs/Concurrency/CC_LockSet.h"
+
+ACE_RCSID(Concurrency, CC_LockSetFactory, "$Id$")
+
+TAO_BEGIN_VERSIONED_NAMESPACE_DECL
+
+// Default constructor
+CC_LockSetFactory::CC_LockSetFactory (void)
+{
+}
+
+// Destructor.
+CC_LockSetFactory::~CC_LockSetFactory (void)
+{
+}
+
+CosConcurrencyControl::LockSet_ptr
+CC_LockSetFactory::create (ACE_ENV_SINGLE_ARG_DECL)
+ ACE_THROW_SPEC ((CORBA::SystemException))
+{
+ CC_LockSet *ls = 0;
+
+ ACE_GUARD_RETURN (TAO_SYNCH_MUTEX, ace_mon, this->lock_, CosConcurrencyControl::LockSet::_nil ());
+
+ ACE_NEW_THROW_EX (ls,
+ CC_LockSet,
+ CORBA::NO_MEMORY());
+ ACE_CHECK_RETURN (CosConcurrencyControl::LockSet::_nil ());
+
+ return ls->_this (ACE_ENV_SINGLE_ARG_PARAMETER);
+}
+
+CosConcurrencyControl::LockSet_ptr
+CC_LockSetFactory::create_related (CosConcurrencyControl::LockSet_ptr which
+ ACE_ENV_ARG_DECL)
+ ACE_THROW_SPEC ((CORBA::SystemException))
+{
+ CC_LockSet *ls = 0;
+
+ ACE_GUARD_RETURN (TAO_SYNCH_MUTEX, ace_mon, this->lock_, CosConcurrencyControl::LockSet::_nil ());
+
+ ACE_NEW_THROW_EX (ls,
+ CC_LockSet (which),
+ CORBA::NO_MEMORY());
+ ACE_CHECK_RETURN (CosConcurrencyControl::LockSet::_nil ());
+
+ return ls->_this (ACE_ENV_SINGLE_ARG_PARAMETER);
+}
+
+TAO_END_VERSIONED_NAMESPACE_DECL
diff --git a/TAO/orbsvcs/orbsvcs/Concurrency/CC_LockSetFactory.h b/TAO/orbsvcs/orbsvcs/Concurrency/CC_LockSetFactory.h
new file mode 100644
index 00000000000..6a02b8ed68d
--- /dev/null
+++ b/TAO/orbsvcs/orbsvcs/Concurrency/CC_LockSetFactory.h
@@ -0,0 +1,68 @@
+// -*- C++ -*-
+
+//=============================================================================
+/**
+ * @file CC_LockSetFactory.h
+ *
+ * $Id$
+ *
+ * This class implements the lock set factory interface from the
+ * concurrency service.
+ *
+ *
+ * @author Torben Worm <tworm@cs.wustl.edu>
+ */
+//=============================================================================
+
+
+#ifndef _CC_LOCKSETFACTORY_H
+#define _CC_LOCKSETFACTORY_H
+
+#include /**/ "ace/pre.h"
+
+#include "orbsvcs/CosConcurrencyControlS.h"
+#include "orbsvcs/Concurrency/concurrency_serv_export.h"
+
+TAO_BEGIN_VERSIONED_NAMESPACE_DECL
+
+/**
+ * @class CC_LockSetFactory
+ *
+ * @brief CC_LockSetFactory
+ *
+ * This class implements the LockSetFactory interface that is
+ * part of the CosConcurrency service. Please consult the idl
+ * file for detailed descriptions apart from the comments in
+ * this file.
+ */
+class TAO_Concurrency_Serv_Export CC_LockSetFactory
+ : public POA_CosConcurrencyControl::LockSetFactory
+{
+public:
+
+ // = Initialization and termination methods.
+ /// Default constructor.
+ CC_LockSetFactory (void);
+
+ /// Destructor.
+ ~CC_LockSetFactory (void);
+
+ virtual CosConcurrencyControl::LockSet_ptr create (
+ ACE_ENV_SINGLE_ARG_DECL)
+ ACE_THROW_SPEC ((CORBA::SystemException));
+
+ virtual CosConcurrencyControl::LockSet_ptr create_related (
+ CosConcurrencyControl::LockSet_ptr which
+ ACE_ENV_ARG_DECL)
+ ACE_THROW_SPEC ((CORBA::SystemException));
+
+private:
+ /// Lock to serialize the access to the factory.
+ TAO_SYNCH_MUTEX lock_;
+};
+
+TAO_END_VERSIONED_NAMESPACE_DECL
+
+#include /**/ "ace/post.h"
+
+#endif /* _CC_LOCKSETFACTORY_H */
diff --git a/TAO/orbsvcs/orbsvcs/Concurrency/Concurrency_Loader.cpp b/TAO/orbsvcs/orbsvcs/Concurrency/Concurrency_Loader.cpp
new file mode 100644
index 00000000000..b12a3a41e57
--- /dev/null
+++ b/TAO/orbsvcs/orbsvcs/Concurrency/Concurrency_Loader.cpp
@@ -0,0 +1,88 @@
+// $Id$
+
+// ================================================================
+// LIBRARY
+// libTAO_CosConcurrency.so
+//
+// DESCRIPTION
+// This class allows for dynamically loading
+// the Concurrency Service.
+//
+// AUTHORS
+// Priyanka Gontla <pgontla@ece.uci.edu>
+// Jaiganesh Balasubramanian <jai@doc.ece.uci.edu>
+// ================================================================
+
+#include "orbsvcs/Concurrency/Concurrency_Loader.h"
+#include "ace/Dynamic_Service.h"
+
+ACE_RCSID (Concurrency, Concurrency_Loader, "$Id$")
+
+TAO_BEGIN_VERSIONED_NAMESPACE_DECL
+
+TAO_Concurrency_Loader::TAO_Concurrency_Loader (void)
+{
+}
+
+TAO_Concurrency_Loader::~TAO_Concurrency_Loader (void)
+{
+}
+
+int
+TAO_Concurrency_Loader::init (int argc, char *argv[])
+{
+ ACE_DECLARE_NEW_CORBA_ENV;
+ ACE_TRY
+ {
+ // Initialize the ORB
+ CORBA::ORB_var orb =
+ CORBA::ORB_init (argc, argv, 0 ACE_ENV_ARG_PARAMETER);
+ ACE_TRY_CHECK;
+
+ // This function call initializes the Concurrency Service
+ CORBA::Object_var object =
+ this->create_object (orb.in (), argc, argv ACE_ENV_ARG_PARAMETER);
+ ACE_TRY_CHECK;
+ }
+ ACE_CATCHANY
+ {
+ // @@ Should we log this???
+ return -1;
+ }
+ ACE_ENDTRY;
+ return 0;
+}
+
+int
+TAO_Concurrency_Loader::fini (void)
+{
+ // Remove the Concurrency Service.
+ this->concurrency_server_.fini();
+ return 0;
+}
+
+CORBA::Object_ptr
+TAO_Concurrency_Loader::create_object (CORBA::ORB_ptr orb,
+ int /* argc */,
+ char * /* argv */ []
+ ACE_ENV_ARG_DECL)
+ ACE_THROW_SPEC ((CORBA::SystemException))
+{
+ CORBA::Object_var object =
+ orb->resolve_initial_references ("RootPOA" ACE_ENV_ARG_PARAMETER);
+ ACE_CHECK_RETURN (CORBA::Object::_nil ());
+ PortableServer::POA_var poa =
+ PortableServer::POA::_narrow (object.in () ACE_ENV_ARG_PARAMETER);
+ ACE_CHECK_RETURN (CORBA::Object::_nil ());
+ PortableServer::POAManager_var poa_manager =
+ poa->the_POAManager (ACE_ENV_SINGLE_ARG_PARAMETER);
+ ACE_CHECK_RETURN (CORBA::Object::_nil ());
+ poa_manager->activate (ACE_ENV_SINGLE_ARG_PARAMETER);
+ ACE_CHECK_RETURN (CORBA::Object::_nil ());
+
+ return this->concurrency_server_.init (orb, poa.in ());
+}
+
+TAO_END_VERSIONED_NAMESPACE_DECL
+
+ACE_FACTORY_DEFINE (TAO_Concurrency_Serv, TAO_Concurrency_Loader)
diff --git a/TAO/orbsvcs/orbsvcs/Concurrency/Concurrency_Loader.h b/TAO/orbsvcs/orbsvcs/Concurrency/Concurrency_Loader.h
new file mode 100644
index 00000000000..b49ae60f6f8
--- /dev/null
+++ b/TAO/orbsvcs/orbsvcs/Concurrency/Concurrency_Loader.h
@@ -0,0 +1,74 @@
+// -*- C++ -*-
+
+// $Id$
+
+// ===========================================================================
+// FILENAME
+// Concurrency_Loader.h
+//
+// DESCRIPTION
+// This class loads the Concurrency Service dynamically
+// either from svc.conf file or <string_to_object> call.
+//
+// AUTHORS
+// Jaiganesh Balasubramanian <jai@doc.ece.uci.edu>
+// Priyanka Gontla <pgontla<ece.uci.edu>
+//
+// ===========================================================================
+
+#ifndef TAO_CONCURRENCY_LOADER_H
+#define TAO_CONCURRENCY_LOADER_H
+
+#include "tao/Object_Loader.h"
+
+#if !defined (ACE_LACKS_PRAGMA_ONCE)
+# pragma once
+#endif /* ACE_LACKS_PRAGMA_ONCE */
+
+#include "orbsvcs/Concurrency/Concurrency_Utils.h"
+
+TAO_BEGIN_VERSIONED_NAMESPACE_DECL
+
+class TAO_Concurrency_Serv_Export TAO_Concurrency_Loader : public TAO_Object_Loader
+{
+public:
+
+ /// Constructor
+ TAO_Concurrency_Loader (void);
+
+ /// Destructor
+ ~TAO_Concurrency_Loader (void);
+
+ /// Called by the Service Configurator framework to initialize the
+ /// Event Service. Defined in <ace/Service_Config.h>
+ virtual int init (int argc, char *argv[]);
+
+ /// Called by the Service Configurator framework to remove the
+ /// Event Service. Defined in <ace/Service_Config.h>
+ virtual int fini (void);
+
+ /// This function call initializes the Concurrency Service given a
+ /// reference to the ORB and the command line parameters.
+ CORBA::Object_ptr create_object (CORBA::ORB_ptr orb,
+ int argc, char *argv[]
+ ACE_ENV_ARG_DECL)
+ ACE_THROW_SPEC ((CORBA::SystemException));
+
+
+ protected:
+ /// Instance of the TAO_Concurrency_Server
+ TAO_Concurrency_Server concurrency_server_;
+
+private:
+
+ // Disallow copying and assignment.
+ TAO_Concurrency_Loader (const TAO_Concurrency_Loader &);
+ TAO_Concurrency_Loader &operator = (const TAO_Concurrency_Loader &);
+
+};
+
+TAO_END_VERSIONED_NAMESPACE_DECL
+
+ACE_FACTORY_DECLARE (TAO_Concurrency_Serv, TAO_Concurrency_Loader)
+
+#endif /* TAO_CONCURRENCY_LOADER_H */
diff --git a/TAO/orbsvcs/orbsvcs/Concurrency/Concurrency_Utils.cpp b/TAO/orbsvcs/orbsvcs/Concurrency/Concurrency_Utils.cpp
new file mode 100644
index 00000000000..570cef2f20f
--- /dev/null
+++ b/TAO/orbsvcs/orbsvcs/Concurrency/Concurrency_Utils.cpp
@@ -0,0 +1,126 @@
+//=============================================================================
+/**
+ * @file Concurrency_Utils.cpp
+ *
+ * $Id$
+ *
+ * @author Torben Worm <tworm@cs.wustl.edu>
+ */
+//=============================================================================
+
+
+#include "ace/streams.h"
+#include "orbsvcs/CosConcurrencyControlC.h"
+#include "tao/debug.h"
+#include "orbsvcs/Concurrency/Concurrency_Utils.h"
+
+ACE_RCSID (Concurrency,
+ Concurrency_Utils,
+ "$Id$")
+
+TAO_BEGIN_VERSIONED_NAMESPACE_DECL
+
+// Default constructor
+TAO_Concurrency_Server::TAO_Concurrency_Server (void)
+{
+}
+
+// Constructor which takes an ORB and POA.
+TAO_Concurrency_Server::TAO_Concurrency_Server (CORBA::ORB_ptr orb,
+ PortableServer::POA_ptr poa)
+{
+ CORBA::Object_var obj = this->init (orb, poa);
+}
+
+// Function to initialize the concurrency server object under the
+// passed orb and poa.
+CORBA::Object_ptr
+TAO_Concurrency_Server::init (CORBA::ORB_ptr orb,
+ PortableServer::POA_ptr poa)
+{
+ CORBA::Object_var obj;
+
+ ACE_TRY_NEW_ENV
+ {
+ // @@ Huh?!?
+
+ this->poa_= PortableServer::POA::_duplicate (poa);
+
+ // Get the naming context ptr to NameService.
+ // ACE_TRY_CHECK;
+
+ PortableServer::ObjectId_var id =
+ PortableServer::string_to_ObjectId ("ConcurrencyService");
+
+ poa->activate_object_with_id (id.in (),
+ &this->lock_set_factory_
+ ACE_ENV_ARG_PARAMETER);
+ ACE_TRY_CHECK;
+
+ // Stringify the objref we'll be implementing, and print it to
+ // stdout. Someone will take that string and give it to a
+ // client. Then release the object.
+ obj =
+ poa->id_to_reference (id.in ()
+ ACE_ENV_ARG_PARAMETER);
+ ACE_TRY_CHECK;
+
+ CORBA::String_var str =
+ orb->object_to_string (obj.in ()
+ ACE_ENV_ARG_PARAMETER);
+ ACE_TRY_CHECK;
+
+ ACE_DEBUG ((LM_DEBUG,
+ "listening as object <%s>\n",
+ str.in ()));
+ }
+ ACE_CATCHANY
+ {
+ ACE_PRINT_EXCEPTION (ACE_ANY_EXCEPTION,
+ "Concurrency Service");
+ return CORBA::Object::_nil ();
+ }
+ ACE_ENDTRY;
+
+ return obj._retn ();
+}
+
+int
+TAO_Concurrency_Server::fini (void)
+{
+ ACE_DECLARE_NEW_CORBA_ENV;
+ ACE_TRY
+ {
+ PortableServer::ObjectId_var id =
+ this->poa_->servant_to_id (&this->lock_set_factory_);
+
+ this->poa_->deactivate_object (id.in ()
+ ACE_ENV_ARG_PARAMETER);
+ ACE_TRY_CHECK;
+ }
+ ACE_CATCHANY
+ {
+ if (TAO_debug_level > 0)
+ {
+ ACE_PRINT_EXCEPTION (ACE_ANY_EXCEPTION,
+ ACE_TEXT ("TAO_Concurrency_Server"));
+ }
+
+ return -1;
+ }
+ ACE_ENDTRY;
+
+ return 0;
+}
+
+CC_LockSetFactory *
+TAO_Concurrency_Server::GetLockSetFactory(void)
+{
+ return &this->lock_set_factory_;
+}
+
+TAO_Concurrency_Server::~TAO_Concurrency_Server (void)
+{
+}
+
+TAO_END_VERSIONED_NAMESPACE_DECL
diff --git a/TAO/orbsvcs/orbsvcs/Concurrency/Concurrency_Utils.h b/TAO/orbsvcs/orbsvcs/Concurrency/Concurrency_Utils.h
new file mode 100644
index 00000000000..bd2b7173f37
--- /dev/null
+++ b/TAO/orbsvcs/orbsvcs/Concurrency/Concurrency_Utils.h
@@ -0,0 +1,77 @@
+// -*- C++ -*-
+
+//=============================================================================
+/**
+ * @file Concurrency_Utils.h
+ *
+ * $Id$
+ *
+ * This class implements a Concurrency Server wrapper class which
+ * holds a number of lock sets. The server must run in the
+ * thread per request concurrency model in order to let the
+ * clients block on the semaphores.
+ *
+ *
+ * @author Torben Worm <tworm@cs.wustl.edu>
+ */
+//=============================================================================
+
+
+#ifndef _CONCURRENCY_SERVER_H
+#define _CONCURRENCY_SERVER_H
+
+#include /**/ "ace/pre.h"
+
+#include "orbsvcs/CosConcurrencyControlC.h"
+#include "orbsvcs/Concurrency/CC_LockSetFactory.h"
+#include "orbsvcs/Concurrency/concurrency_serv_export.h"
+
+
+TAO_BEGIN_VERSIONED_NAMESPACE_DECL
+
+/**
+ * @class TAO_Concurrency_Server
+ *
+ * @brief Defines a wrapper class for the implementation of the
+ * concurrency server.
+ *
+ * This class takes an orb and Poa reference and activates the
+ * concurrency service lock set factory object under them.
+ */
+class TAO_Concurrency_Serv_Export TAO_Concurrency_Server
+{
+public:
+ // = Initialization and termination methods.
+ ///Default constructor.
+ TAO_Concurrency_Server (void);
+
+ /// Takes the POA under which to register the Concurrency Service
+ /// implementation object.
+ TAO_Concurrency_Server (CORBA::ORB_ptr orb,
+ PortableServer::POA_ptr poa);
+
+ /// Destructor.
+ ~TAO_Concurrency_Server (void);
+
+ /// Initialize the concurrency server under the given ORB and POA.
+ CORBA::Object_ptr init (CORBA::ORB_ptr orb,
+ PortableServer::POA_ptr poa);
+
+ /// Cleanup resources.
+ int fini (void);
+
+ /// Get the lock set factory.
+ CC_LockSetFactory *GetLockSetFactory (void);
+
+private:
+ /// This is the lock set factory activated under the POA.
+ CC_LockSetFactory lock_set_factory_;
+
+ /// The POA which the lock set factory servant was registered.
+ PortableServer::POA_var poa_;
+};
+
+TAO_END_VERSIONED_NAMESPACE_DECL
+
+#include /**/ "ace/post.h"
+#endif /* _CONCURRENCY_SERVER_H */
diff --git a/TAO/orbsvcs/orbsvcs/Concurrency/concurrency_export.h b/TAO/orbsvcs/orbsvcs/Concurrency/concurrency_export.h
new file mode 100644
index 00000000000..4406ec2e93f
--- /dev/null
+++ b/TAO/orbsvcs/orbsvcs/Concurrency/concurrency_export.h
@@ -0,0 +1,40 @@
+
+// -*- C++ -*-
+// $Id$
+// Definition for Win32 Export directives.
+// This file is generated automatically by generate_export_file.pl
+// ------------------------------
+#ifndef TAO_CONCURRENCY_EXPORT_H
+#define TAO_CONCURRENCY_EXPORT_H
+
+#include "ace/config-all.h"
+
+#if defined (TAO_AS_STATIC_LIBS)
+# if !defined (TAO_CONCURRENCY_HAS_DLL)
+# define TAO_CONCURRENCY_HAS_DLL 0
+# endif /* ! TAO_CONCURRENCY_HAS_DLL */
+#else
+# if !defined (TAO_CONCURRENCY_HAS_DLL)
+# define TAO_CONCURRENCY_HAS_DLL 1
+# endif /* ! TAO_CONCURRENCY_HAS_DLL */
+#endif
+
+#if defined (TAO_CONCURRENCY_HAS_DLL) && (TAO_CONCURRENCY_HAS_DLL == 1)
+# if defined (TAO_CONCURRENCY_BUILD_DLL)
+# define TAO_Concurrency_Export ACE_Proper_Export_Flag
+# define TAO_CONCURRENCY_SINGLETON_DECLARATION(T) ACE_EXPORT_SINGLETON_DECLARATION (T)
+# define TAO_CONCURRENCY_SINGLETON_DECLARE(SINGLETON_TYPE, CLASS, LOCK) ACE_EXPORT_SINGLETON_DECLARE(SINGLETON_TYPE, CLASS, LOCK)
+# else /* TAO_CONCURRENCY_BUILD_DLL */
+# define TAO_Concurrency_Export ACE_Proper_Import_Flag
+# define TAO_CONCURRENCY_SINGLETON_DECLARATION(T) ACE_IMPORT_SINGLETON_DECLARATION (T)
+# define TAO_CONCURRENCY_SINGLETON_DECLARE(SINGLETON_TYPE, CLASS, LOCK) ACE_IMPORT_SINGLETON_DECLARE(SINGLETON_TYPE, CLASS, LOCK)
+# endif /* TAO_CONCURRENCY_BUILD_DLL */
+#else /* TAO_CONCURRENCY_HAS_DLL == 1 */
+# define TAO_Concurrency_Export
+# define TAO_CONCURRENCY_SINGLETON_DECLARATION(T)
+# define TAO_CONCURRENCY_SINGLETON_DECLARE(SINGLETON_TYPE, CLASS, LOCK)
+#endif /* TAO_CONCURRENCY_HAS_DLL == 1 */
+
+#endif /* TAO_CONCURRENCY_EXPORT_H */
+
+// End of auto generated file.
diff --git a/TAO/orbsvcs/orbsvcs/Concurrency/concurrency_serv_export.h b/TAO/orbsvcs/orbsvcs/Concurrency/concurrency_serv_export.h
new file mode 100644
index 00000000000..fe99ece77aa
--- /dev/null
+++ b/TAO/orbsvcs/orbsvcs/Concurrency/concurrency_serv_export.h
@@ -0,0 +1,40 @@
+
+// -*- C++ -*-
+// $Id$
+// Definition for Win32 Export directives.
+// This file is generated automatically by generate_export_file.pl
+// ------------------------------
+#ifndef TAO_CONCURRENCY_SERV_EXPORT_H
+#define TAO_CONCURRENCY_SERV_EXPORT_H
+
+#include "ace/config-all.h"
+
+#if defined (TAO_AS_STATIC_LIBS)
+# if !defined (TAO_CONCURRENCY_SERV_HAS_DLL)
+# define TAO_CONCURRENCY_SERV_HAS_DLL 0
+# endif /* ! TAO_CONCURRENCY_SERV_HAS_DLL */
+#else
+# if !defined (TAO_CONCURRENCY_SERV_HAS_DLL)
+# define TAO_CONCURRENCY_SERV_HAS_DLL 1
+# endif /* ! TAO_CONCURRENCY_SERV_HAS_DLL */
+#endif
+
+#if defined (TAO_CONCURRENCY_SERV_HAS_DLL) && (TAO_CONCURRENCY_SERV_HAS_DLL == 1)
+# if defined (TAO_CONCURRENCY_SERV_BUILD_DLL)
+# define TAO_Concurrency_Serv_Export ACE_Proper_Export_Flag
+# define TAO_CONCURRENCY_SERV_SINGLETON_DECLARATION(T) ACE_EXPORT_SINGLETON_DECLARATION (T)
+# define TAO_CONCURRENCY_SERV_SINGLETON_DECLARE(SINGLETON_TYPE, CLASS, LOCK) ACE_EXPORT_SINGLETON_DECLARE(SINGLETON_TYPE, CLASS, LOCK)
+# else /* TAO_CONCURRENCY_SERV_BUILD_DLL */
+# define TAO_Concurrency_Serv_Export ACE_Proper_Import_Flag
+# define TAO_CONCURRENCY_SERV_SINGLETON_DECLARATION(T) ACE_IMPORT_SINGLETON_DECLARATION (T)
+# define TAO_CONCURRENCY_SERV_SINGLETON_DECLARE(SINGLETON_TYPE, CLASS, LOCK) ACE_IMPORT_SINGLETON_DECLARE(SINGLETON_TYPE, CLASS, LOCK)
+# endif /* TAO_CONCURRENCY_SERV_BUILD_DLL */
+#else /* TAO_CONCURRENCY_SERV_HAS_DLL == 1 */
+# define TAO_Concurrency_Serv_Export
+# define TAO_CONCURRENCY_SERV_SINGLETON_DECLARATION(T)
+# define TAO_CONCURRENCY_SERV_SINGLETON_DECLARE(SINGLETON_TYPE, CLASS, LOCK)
+#endif /* TAO_CONCURRENCY_SERV_HAS_DLL == 1 */
+
+#endif /* TAO_CONCURRENCY_SERV_EXPORT_H */
+
+// End of auto generated file.
diff --git a/TAO/orbsvcs/orbsvcs/Concurrency/concurrency_skel_export.h b/TAO/orbsvcs/orbsvcs/Concurrency/concurrency_skel_export.h
new file mode 100644
index 00000000000..5894da8e9de
--- /dev/null
+++ b/TAO/orbsvcs/orbsvcs/Concurrency/concurrency_skel_export.h
@@ -0,0 +1,40 @@
+
+// -*- C++ -*-
+// $Id$
+// Definition for Win32 Export directives.
+// This file is generated automatically by generate_export_file.pl
+// ------------------------------
+#ifndef TAO_CONCURRENCY_SKEL_EXPORT_H
+#define TAO_CONCURRENCY_SKEL_EXPORT_H
+
+#include "ace/config-all.h"
+
+#if defined (TAO_AS_STATIC_LIBS)
+# if !defined (TAO_CONCURRENCY_SKEL_HAS_DLL)
+# define TAO_CONCURRENCY_SKEL_HAS_DLL 0
+# endif /* ! TAO_CONCURRENCY_SKEL_HAS_DLL */
+#else
+# if !defined (TAO_CONCURRENCY_SKEL_HAS_DLL)
+# define TAO_CONCURRENCY_SKEL_HAS_DLL 1
+# endif /* ! TAO_CONCURRENCY_SKEL_HAS_DLL */
+#endif
+
+#if defined (TAO_CONCURRENCY_SKEL_HAS_DLL) && (TAO_CONCURRENCY_SKEL_HAS_DLL == 1)
+# if defined (TAO_CONCURRENCY_SKEL_BUILD_DLL)
+# define TAO_Concurrency_Skel_Export ACE_Proper_Export_Flag
+# define TAO_CONCURRENCY_SKEL_SINGLETON_DECLARATION(T) ACE_EXPORT_SINGLETON_DECLARATION (T)
+# define TAO_CONCURRENCY_SKEL_SINGLETON_DECLARE(SINGLETON_TYPE, CLASS, LOCK) ACE_EXPORT_SINGLETON_DECLARE(SINGLETON_TYPE, CLASS, LOCK)
+# else /* TAO_CONCURRENCY_SKEL_BUILD_DLL */
+# define TAO_Concurrency_Skel_Export ACE_Proper_Import_Flag
+# define TAO_CONCURRENCY_SKEL_SINGLETON_DECLARATION(T) ACE_IMPORT_SINGLETON_DECLARATION (T)
+# define TAO_CONCURRENCY_SKEL_SINGLETON_DECLARE(SINGLETON_TYPE, CLASS, LOCK) ACE_IMPORT_SINGLETON_DECLARE(SINGLETON_TYPE, CLASS, LOCK)
+# endif /* TAO_CONCURRENCY_SKEL_BUILD_DLL */
+#else /* TAO_CONCURRENCY_SKEL_HAS_DLL == 1 */
+# define TAO_Concurrency_Skel_Export
+# define TAO_CONCURRENCY_SKEL_SINGLETON_DECLARATION(T)
+# define TAO_CONCURRENCY_SKEL_SINGLETON_DECLARE(SINGLETON_TYPE, CLASS, LOCK)
+#endif /* TAO_CONCURRENCY_SKEL_HAS_DLL == 1 */
+
+#endif /* TAO_CONCURRENCY_SKEL_EXPORT_H */
+
+// End of auto generated file.
diff --git a/TAO/orbsvcs/orbsvcs/CosConcurrency.mpc b/TAO/orbsvcs/orbsvcs/CosConcurrency.mpc
new file mode 100644
index 00000000000..99fab62e680
--- /dev/null
+++ b/TAO/orbsvcs/orbsvcs/CosConcurrency.mpc
@@ -0,0 +1,106 @@
+// -*- MPC -*-
+// $Id$
+
+project(CosConcurrency_IDL): orbsvcslib, core, tao_versioning_idl_defaults {
+ custom_only = 1
+ idlflags += -Wb,stub_export_macro=TAO_Concurrency_Export -Wb,stub_export_include=orbsvcs/Concurrency/concurrency_export.h -Wb,skel_export_macro=TAO_Concurrency_Skel_Export -Wb,skel_export_include=orbsvcs/Concurrency/concurrency_skel_export.h
+
+ IDL_Files {
+ CosConcurrencyControl.idl
+ }
+}
+
+project(CosConcurrency) : orbsvcslib, core {
+ sharedname = TAO_CosConcurrency
+ dynamicflags = TAO_CONCURRENCY_BUILD_DLL
+ tagchecks += Concurrency
+ after += CosConcurrency_IDL
+
+ IDL_Files {
+ }
+
+ Source_Files {
+ CosConcurrencyControlC.cpp
+ }
+
+ Header_Files {
+ CosConcurrencyControlC.h
+ Concurrency/concurrency_export.h
+ }
+
+ Inline_Files {
+ CosConcurrencyControlC.inl
+ }
+
+ Template_Files {
+ }
+
+ // explicit Resource_Files to avoid including _Skel & _Serv rc files.
+ Resource_Files {
+ }
+
+ Pkgconfig_Files {
+ TAO_CosConcurrency.pc.in
+ }
+}
+
+project(CosConcurrency_Skel): orbsvcslib, core, concurrency, portableserver {
+ sharedname = TAO_CosConcurrency_Skel
+ dynamicflags = TAO_CONCURRENCY_SKEL_BUILD_DLL
+ tagchecks += Concurrency
+ after += CosConcurrency_IDL
+
+ IDL_Files {
+ }
+
+ Source_Files {
+ CosConcurrencyControlS.cpp
+ }
+
+ Header_Files {
+ CosConcurrencyControlS.h
+ Concurrency/concurrency_skel_export.h
+ }
+
+ Inline_Files {
+ CosConcurrencyControlS.inl
+ }
+
+ Template_Files {
+ }
+
+ Pkgconfig_Files {
+ TAO_CosConcurrency_Skel.pc.in
+ }
+}
+
+project(CosConcurrency_Serv) : orbsvcslib, core, concurrency_skel {
+ sharedname = TAO_CosConcurrency_Serv
+ dynamicflags = TAO_CONCURRENCY_SERV_BUILD_DLL
+ tagchecks += Concurrency
+
+ IDL_Files {
+ }
+
+ Source_Files {
+ Concurrency
+ }
+
+ Header_Files {
+ Concurrency
+ ^Concurrency/concurrency_export.h
+ ^Concurrency/concurrency_skel_export.h
+ }
+
+ Inline_Files {
+ Concurrency
+ }
+
+ Template_Files {
+ Concurrency
+ }
+
+ Pkgconfig_Files {
+ TAO_CosConcurrency_Serv.pc.in
+ }
+}
diff --git a/TAO/orbsvcs/orbsvcs/CosConcurrency.rc b/TAO/orbsvcs/orbsvcs/CosConcurrency.rc
new file mode 100644
index 00000000000..f331603d81c
--- /dev/null
+++ b/TAO/orbsvcs/orbsvcs/CosConcurrency.rc
@@ -0,0 +1,30 @@
+#include "..\..\tao\Version.h"
+
+1 VERSIONINFO
+ FILEVERSION TAO_MAJOR_VERSION,TAO_MINOR_VERSION,TAO_BETA_VERSION,0
+ PRODUCTVERSION TAO_MAJOR_VERSION,TAO_MINOR_VERSION,TAO_BETA_VERSION,0
+ FILEFLAGSMASK 0x3fL
+ FILEFLAGS 0x0L
+ FILEOS 0x4L
+ FILETYPE 0x1L
+ FILESUBTYPE 0x0L
+BEGIN
+ BLOCK "StringFileInfo"
+ BEGIN
+ BLOCK "040904B0"
+ BEGIN
+ VALUE "FileDescription", "CosConcurrency\0"
+ VALUE "FileVersion", TAO_VERSION "\0"
+ VALUE "InternalName", "TAO_CosConcurrencyDLL\0"
+ VALUE "LegalCopyright", "\0"
+ VALUE "LegalTrademarks", "\0"
+ VALUE "OriginalFilename", "TAO_CosConcurrency.DLL\0"
+ VALUE "ProductName", "ORBSVCS\0"
+ VALUE "ProductVersion", TAO_VERSION "\0"
+ END
+ END
+ BLOCK "VarFileInfo"
+ BEGIN
+ VALUE "Translation", 0x409, 1200
+ END
+END
diff --git a/TAO/orbsvcs/orbsvcs/CosConcurrencyControl.idl b/TAO/orbsvcs/orbsvcs/CosConcurrencyControl.idl
new file mode 100644
index 00000000000..3579be999c3
--- /dev/null
+++ b/TAO/orbsvcs/orbsvcs/CosConcurrencyControl.idl
@@ -0,0 +1,199 @@
+/* -*- C++ -*- */
+// $Id$
+
+// ============================================================================
+//
+// = LIBRARY
+// cos
+//
+// = FILENAME
+// CosTransaction.idl
+//
+// = DESCRIPTION
+// Described in CORBAservices: Common Object Services
+// Specification, chapter 7 The concurrency service description can
+// be downloaded from
+// ftp://www.omg.org/pub/docs/formal/97-11-02.idl
+//
+// = AUTHOR
+// Torben Worm <tworm@cs.wustl.edu>
+//
+// ============================================================================
+
+#ifndef TAO_CONCURRENCY_IDL
+#define TAO_CONCURRENCY_IDL
+
+//CosConcurrencyControl Module, page 7-8
+//Includes the following interfaces:
+// LockCoordinator, LockSet, TransactionalLockSet, LockSetFactory
+
+// The part depending on the transaction service may be included by defining
+// TAO_HAS_TRANSACTION_CONTROL_SERVICE
+
+#ifdef TAO_HAS_TRANSACTION_CONTROL_SERVICE
+#include <CosTransactions.idl>
+#endif /* TAO_HAS_TRANSACTION_CONTROL_SERVICE */
+
+#pragma prefix "omg.org"
+
+module CosConcurrencyControl
+{
+ // = TITLE
+ // CosConcurrencyControl
+ //
+ // = DESCRIPTION
+ // This idl file describes the concurrency control service. The
+ // purpose of the concurrency control service is to mediate
+ // concurrent access to an pbject such that the consistency of
+ // the object is not compromised when accessed by concurrently
+ // executing computations.
+
+ // = These are the different lock types supported by this module.
+
+ // For a description of the compatability between the different lock
+ // types please consult the service description (OMG).
+ enum lock_mode
+ {
+ read,
+ write,
+ upgrade,
+ intention_read,
+ intention_write
+ };
+
+ exception LockNotHeld {};
+ // The LockNotHeld exception is is raised when an operation to
+ // unlock or change the mode of a lock is called and the specified
+ // lock is not held
+
+#ifdef TAO_HAS_TRANSACTION_CONTROL_SERVICE
+ // @@ The lock coordinator is designed for transactional lock sets,
+ // so we don't support it (yet).
+ interface LockCoordinator
+ {
+ // = TITLE
+ // LockCoordinator drops all locks associated with a transaction.
+ // = DESCRIPTION
+ // The LockCoordinator interface enables a transaction service to
+ // drop all locks held by a transaction.
+
+ void drop_locks ();
+ // Releases all the locks held by the transaction. Designet to be
+ // used by transaction service when a transaction commits or aborts.
+ };
+#endif /* TAO_HAS_TRANSACTION_CONTROL_SERVICE */
+
+ interface LockSet
+ {
+ // = TITLE
+ // LockSet inteface to the concurrency service in implicit
+ // mode.
+ //
+ // = DESCRIPTION
+ // Clients operating in the implicit mode
+ // (i.e. non-transactional mode) acquire and release locks
+ // in lock sets throug this interface. The interface only
+ // provides operations to acquire and release locks on
+ // behalf of the calling thread or transaction.
+
+ void lock (in lock_mode mode);
+ // Acquires a lock on the specified lock set in the specified
+ // mode. Blocks until lock is obtained.
+
+ boolean try_lock (in lock_mode mode);
+ // Tries to acquire a lock on the specified lock set. If it is
+ // not possible to acquire the lock false is returned.
+
+ void unlock (in lock_mode mode)
+ raises (LockNotHeld);
+ // Releases a single lock on the specified lock set. A lock can
+ // be held multiple times in the same mode. If the lock is not
+ // held the exception LockNotHeld is raised.
+
+ void change_mode (in lock_mode held_mode,
+ in lock_mode new_mode)
+ raises (LockNotHeld);
+ // Changes the mode of the lock on the specified lock set. If a
+ // conflicting lock is held by another client the call blocks
+ // until the new mode can be granted. If the lock is not held in
+ // the specified mode the exception LockNotHeld is raised.
+
+#ifdef TAO_HAS_TRANSACTION_CONTROL_SERVICE
+ LockCoordinator get_coordinator (in CosTransactions::Coordinator which);
+ // Returns the lock coordinator associated with the specified
+ // transaction.
+#endif /* TAO_HAS_TRANSACTION_CONTROL_SERVICE */
+ };
+
+#ifdef TAO_HAS_TRANSACTION_CONTROL_SERVICE
+ interface TransactionalLockSet
+ {
+ // = TITLE
+ // TransactionalLockSet interface to the concurrency service
+ // in transactional mode.
+ //
+ // = DESCRIPTION
+ // Clients operating in the transactional mode acquire and
+ // release locks in lock sets through this interface. The
+ // interface provides operations identical to the operations
+ // described in the LockSet interface section. The
+ // difference beeing that the coordinator for the
+ // transaction is explicitly passed as a reference to the
+ // operations. Please see the description of the LockSet
+ // interface for a detailed description.
+
+ void lock (in CosTransactions::Coordinator current,
+ in lock_mode mode);
+ // See LockSet::lock
+
+ boolean try_lock (in CosTransactions::Coordinator current,
+ in lock_mode mode);
+ // See LockSet::try_lock
+
+ void unlock (in CosTransactions::Coordinator current,
+ in lock_mode mode)
+ raises (LockNotHeld);
+ // See LockSet::unlock
+
+ void change_mode (in CosTransactions::Coordinator current,
+ in lock_mode held_mode,
+ in lock_mode new_mode)
+ raises (LockNotHeld);
+ // See LockSet::change_mode
+
+ LockCoordinator get_coordinator (in CosTransactions::Coordinator which);
+ // See LockSet::get_coordinator
+ };
+#endif /* TAO_HAS_TRANSACTION_CONTROL_SERVICE */
+
+ interface LockSetFactory
+ {
+ // = TITLE
+ // Factory interface for the LockSet and
+ // TransactionalLockSet interfaces.
+ //
+ // = DESCRIPTION
+ // Factory for creating the lock sets.
+
+ LockSet create ();
+ // Creates a new LockSet and lock coordinator
+ // @@TAO ??? is this correct? Lock coordinators are associated with
+ // transactions. - tworm
+
+ LockSet create_related (in LockSet which);
+ // Creates a lock set related to the specified lock set. Related lock
+ // sets drop their locks together.
+
+#ifdef TAO_HAS_TRANSACTION_CONTROL_SERVICE
+ TransactionalLockSet create_transactional ();
+ // Creates a new TransactionalLockSet and lock coordinator for
+ // transactional mode clients.
+
+ TransactionalLockSet create_transactional_related (in TransactionalLockSet which);
+ // Creates a new transactional lock set related to the specified lock
+ // set. Related lock sets drop locks together.
+#endif /* TAO_HAS_TRANSACTION_CONTROL_SERVICE */
+ };
+};
+
+#endif /* TAO_CONCURRENCY_IDL */
diff --git a/TAO/orbsvcs/orbsvcs/CosEvent.mpc b/TAO/orbsvcs/orbsvcs/CosEvent.mpc
new file mode 100644
index 00000000000..c3666a5ddfe
--- /dev/null
+++ b/TAO/orbsvcs/orbsvcs/CosEvent.mpc
@@ -0,0 +1,135 @@
+// $Id$
+
+project (CosEvent_IDL) : orbsvcslib, core, minimum_corba, ec_typed_events_idl, tao_versioning_idl_defaults {
+ custom_only = 1
+ idlflags += -Wb,stub_export_macro=TAO_Event_Export -Wb,stub_export_include=orbsvcs/CosEvent/event_export.h -Wb,skel_export_macro=TAO_Event_Skel_Export -Wb,skel_export_include=orbsvcs/CosEvent/event_skel_export.h
+
+ IDL_Files {
+ CosEventComm.idl
+ CosEventChannelAdmin.idl
+ }
+}
+
+project (CosEvent) : orbsvcslib, core, minimum_corba, ec_typed_events {
+ sharedname = TAO_CosEvent
+ dynamicflags = TAO_EVENT_BUILD_DLL
+ tagchecks += CosEvent
+ after += CosEvent_IDL
+
+ IDL_Files {
+ }
+
+ Source_Files {
+ CosEventCommC.cpp
+ CosEventChannelAdminC.cpp
+ }
+
+ Header_Files {
+ CosEventCommC.h
+ CosEventChannelAdminC.h
+ CosEvent/event_export.h
+ }
+
+ Inline_Files {
+ CosEventCommC.inl
+ CosEventChannelAdminC.inl
+ }
+
+ Template_Files {
+ }
+
+ // explicit Resource_Files to avoid including _Skel & _Serv rc files.
+ Resource_Files {
+ CosEvent.rc
+ }
+
+ Pkgconfig_Files {
+ TAO_CosEvent.pc.in
+ }
+}
+
+
+project (CosEvent_Skel) : orbsvcslib, core, minimum_corba, event, portableserver, ec_typed_events_skel {
+ sharedname = TAO_CosEvent_Skel
+ dynamicflags = TAO_EVENT_SKEL_BUILD_DLL
+ tagchecks += CosEvent
+
+ IDL_Files {
+ }
+
+ Source_Files {
+ CosEventCommS.cpp
+ CosEventChannelAdminS.cpp
+ }
+
+ Header_Files {
+ CosEventCommS.h
+ CosEventChannelAdminS.h
+ CosEventCommS_T.h
+ CosEventChannelAdminS_T.h
+ CosEvent/event_skel_export.h
+ }
+
+ Inline_Files {
+ CosEventCommS.inl
+ CosEventChannelAdminS.inl
+ CosEventCommS_T.inl
+ CosEventChannelAdminS_T.inl
+ }
+
+ Template_Files {
+ CosEventCommS_T.cpp
+ CosEventChannelAdminS_T.cpp
+ }
+
+ Pkgconfig_Files {
+ TAO_CosEvent_Skel.pc.in
+ }
+}
+
+
+project (CosEvent_Serv) : orbsvcslib, core, minimum_corba, event_skel, ec_typed_events_serv, messaging_optional, naming, svc_utils {
+ sharedname = TAO_CosEvent_Serv
+ dynamicflags = TAO_EVENT_SERV_BUILD_DLL
+ tagchecks += CosEvent
+
+ IDL_Files {
+ }
+
+ Source_Files {
+ CosEvent/CEC_ConsumerAdmin.cpp
+ CosEvent/CEC_ConsumerControl.cpp
+ CosEvent/CEC_Default_Factory.cpp
+ CosEvent/CEC_Dispatching.cpp
+ CosEvent/CEC_Dispatching_Task.cpp
+ CosEvent/CEC_EventChannel.cpp
+ CosEvent/CEC_Event_Loader.cpp
+ CosEvent/CEC_Factory.cpp
+ CosEvent/CEC_MT_Dispatching.cpp
+ CosEvent/CEC_ProxyPullConsumer.cpp
+ CosEvent/CEC_ProxyPullSupplier.cpp
+ CosEvent/CEC_ProxyPushConsumer.cpp
+ CosEvent/CEC_ProxyPushSupplier.cpp
+ CosEvent/CEC_Pulling_Strategy.cpp
+ CosEvent/CEC_Reactive_ConsumerControl.cpp
+ CosEvent/CEC_Reactive_Pulling_Strategy.cpp
+ CosEvent/CEC_Reactive_SupplierControl.cpp
+ CosEvent/CEC_SupplierAdmin.cpp
+ CosEvent/CEC_SupplierControl.cpp
+ }
+
+ Header_Files {
+ CosEvent/CEC_Defaults.h
+ CosEvent/event_serv_export.h
+ }
+
+ Inline_Files {
+ }
+
+ Template_Files {
+ }
+
+ Pkgconfig_Files {
+ TAO_CosEvent_Serv.pc.in
+ }
+}
diff --git a/TAO/orbsvcs/orbsvcs/CosEvent.rc b/TAO/orbsvcs/orbsvcs/CosEvent.rc
new file mode 100644
index 00000000000..ca6c862fa4e
--- /dev/null
+++ b/TAO/orbsvcs/orbsvcs/CosEvent.rc
@@ -0,0 +1,30 @@
+#include "..\..\tao\Version.h"
+
+1 VERSIONINFO
+ FILEVERSION TAO_MAJOR_VERSION,TAO_MINOR_VERSION,TAO_BETA_VERSION,0
+ PRODUCTVERSION TAO_MAJOR_VERSION,TAO_MINOR_VERSION,TAO_BETA_VERSION,0
+ FILEFLAGSMASK 0x3fL
+ FILEFLAGS 0x0L
+ FILEOS 0x4L
+ FILETYPE 0x1L
+ FILESUBTYPE 0x0L
+BEGIN
+ BLOCK "StringFileInfo"
+ BEGIN
+ BLOCK "040904B0"
+ BEGIN
+ VALUE "FileDescription", "CosEvent\0"
+ VALUE "FileVersion", TAO_VERSION "\0"
+ VALUE "InternalName", "TAO_CosEventDLL\0"
+ VALUE "LegalCopyright", "\0"
+ VALUE "LegalTrademarks", "\0"
+ VALUE "OriginalFilename", "TAO_CosEvent.DLL\0"
+ VALUE "ProductName", "ORBSVCS\0"
+ VALUE "ProductVersion", TAO_VERSION "\0"
+ END
+ END
+ BLOCK "VarFileInfo"
+ BEGIN
+ VALUE "Translation", 0x409, 1200
+ END
+END
diff --git a/TAO/orbsvcs/orbsvcs/CosEvent/CEC_ConsumerAdmin.cpp b/TAO/orbsvcs/orbsvcs/CosEvent/CEC_ConsumerAdmin.cpp
new file mode 100644
index 00000000000..298c8981d9d
--- /dev/null
+++ b/TAO/orbsvcs/orbsvcs/CosEvent/CEC_ConsumerAdmin.cpp
@@ -0,0 +1,141 @@
+// $Id$
+
+#include "orbsvcs/CosEvent/CEC_ConsumerAdmin.h"
+#include "orbsvcs/CosEvent/CEC_ProxyPushSupplier.h"
+#include "orbsvcs/CosEvent/CEC_ProxyPullSupplier.h"
+#include "orbsvcs/CosEvent/CEC_ProxyPushConsumer.h"
+#include "orbsvcs/CosEvent/CEC_EventChannel.h"
+
+#include "orbsvcs/ESF/ESF_Shutdown_Proxy.h"
+
+#if ! defined (__ACE_INLINE__)
+#include "orbsvcs/CosEvent/CEC_ConsumerAdmin.i"
+#endif /* __ACE_INLINE__ */
+
+ACE_RCSID (CosEvent,
+ CEC_ConsumerAdmin,
+ "$Id$")
+
+TAO_BEGIN_VERSIONED_NAMESPACE_DECL
+
+TAO_CEC_ConsumerAdmin::TAO_CEC_ConsumerAdmin (TAO_CEC_EventChannel *ec)
+ : event_channel_ (ec),
+ push_admin_ (ec),
+ pull_admin_ (ec)
+{
+ this->default_POA_ =
+ this->event_channel_->consumer_poa ();
+}
+
+TAO_CEC_ConsumerAdmin::~TAO_CEC_ConsumerAdmin (void)
+{
+}
+
+void
+TAO_CEC_ConsumerAdmin::push (const CORBA::Any &event
+ ACE_ENV_ARG_DECL)
+{
+ TAO_CEC_Propagate_Event_Push push_worker (event);
+
+ this->push_admin_.for_each (&push_worker
+ ACE_ENV_ARG_PARAMETER);
+ ACE_CHECK;
+
+ TAO_CEC_Propagate_Event_Pull pull_worker (event);
+
+ this->pull_admin_.for_each (&pull_worker
+ ACE_ENV_ARG_PARAMETER);
+ ACE_CHECK;
+}
+
+void
+TAO_CEC_ConsumerAdmin::connected (TAO_CEC_ProxyPushSupplier *supplier
+ ACE_ENV_ARG_DECL)
+{
+ this->push_admin_.connected (supplier ACE_ENV_ARG_PARAMETER);
+}
+
+void
+TAO_CEC_ConsumerAdmin::reconnected (TAO_CEC_ProxyPushSupplier *supplier
+ ACE_ENV_ARG_DECL)
+{
+ this->push_admin_.reconnected (supplier ACE_ENV_ARG_PARAMETER);
+}
+
+void
+TAO_CEC_ConsumerAdmin::disconnected (TAO_CEC_ProxyPushSupplier *supplier
+ ACE_ENV_ARG_DECL)
+{
+ this->push_admin_.disconnected (supplier ACE_ENV_ARG_PARAMETER);
+}
+
+void
+TAO_CEC_ConsumerAdmin::connected (TAO_CEC_ProxyPullSupplier *supplier
+ ACE_ENV_ARG_DECL)
+{
+ this->pull_admin_.connected (supplier ACE_ENV_ARG_PARAMETER);
+}
+
+void
+TAO_CEC_ConsumerAdmin::reconnected (TAO_CEC_ProxyPullSupplier *supplier
+ ACE_ENV_ARG_DECL)
+{
+ this->pull_admin_.reconnected (supplier ACE_ENV_ARG_PARAMETER);
+}
+
+void
+TAO_CEC_ConsumerAdmin::disconnected (TAO_CEC_ProxyPullSupplier *supplier
+ ACE_ENV_ARG_DECL)
+{
+ this->pull_admin_.disconnected (supplier ACE_ENV_ARG_PARAMETER);
+}
+
+void
+TAO_CEC_ConsumerAdmin::shutdown (ACE_ENV_SINGLE_ARG_DECL)
+{
+ this->push_admin_.shutdown (ACE_ENV_SINGLE_ARG_PARAMETER);
+ ACE_CHECK;
+
+ this->pull_admin_.shutdown (ACE_ENV_SINGLE_ARG_PARAMETER);
+ ACE_CHECK;
+}
+
+CosEventChannelAdmin::ProxyPushSupplier_ptr
+TAO_CEC_ConsumerAdmin::obtain_push_supplier (ACE_ENV_SINGLE_ARG_DECL)
+ ACE_THROW_SPEC ((CORBA::SystemException))
+{
+ return this->push_admin_.obtain (ACE_ENV_SINGLE_ARG_PARAMETER);
+}
+
+CosEventChannelAdmin::ProxyPullSupplier_ptr
+TAO_CEC_ConsumerAdmin::obtain_pull_supplier (ACE_ENV_SINGLE_ARG_DECL)
+ ACE_THROW_SPEC ((CORBA::SystemException))
+{
+ return this->pull_admin_.obtain (ACE_ENV_SINGLE_ARG_PARAMETER);
+}
+
+PortableServer::POA_ptr
+TAO_CEC_ConsumerAdmin::_default_POA (ACE_ENV_SINGLE_ARG_DECL_NOT_USED)
+{
+ return PortableServer::POA::_duplicate (this->default_POA_.in ());
+}
+
+// ****************************************************************
+
+void
+TAO_CEC_Propagate_Event_Push::work (TAO_CEC_ProxyPushSupplier *supplier
+ ACE_ENV_ARG_DECL)
+{
+ supplier->push (this->event_ ACE_ENV_ARG_PARAMETER);
+}
+
+// ****************************************************************
+
+void
+TAO_CEC_Propagate_Event_Pull::work (TAO_CEC_ProxyPullSupplier *supplier
+ ACE_ENV_ARG_DECL)
+{
+ supplier->push (this->event_ ACE_ENV_ARG_PARAMETER);
+}
+
+TAO_END_VERSIONED_NAMESPACE_DECL
diff --git a/TAO/orbsvcs/orbsvcs/CosEvent/CEC_ConsumerAdmin.h b/TAO/orbsvcs/orbsvcs/CosEvent/CEC_ConsumerAdmin.h
new file mode 100644
index 00000000000..529e6a28197
--- /dev/null
+++ b/TAO/orbsvcs/orbsvcs/CosEvent/CEC_ConsumerAdmin.h
@@ -0,0 +1,157 @@
+// -*- C++ -*-
+//=============================================================================
+/**
+ * @file CEC_ConsumerAdmin.h
+ *
+ * $Id$
+ *
+ * @author Carlos O'Ryan (coryan@cs.wustl.edu)
+ */
+//=============================================================================
+
+
+#ifndef TAO_CEC_CONSUMERADMIN_H
+#define TAO_CEC_CONSUMERADMIN_H
+
+#include /**/ "ace/pre.h"
+
+#include "orbsvcs/CosEventChannelAdminS.h"
+
+#if !defined (ACE_LACKS_PRAGMA_ONCE)
+# pragma once
+#endif /* ACE_LACKS_PRAGMA_ONCE */
+
+#include "orbsvcs/ESF/ESF_Proxy_Admin.h"
+
+#include "orbsvcs/CosEvent/CEC_ProxyPushSupplier.h"
+#include "orbsvcs/CosEvent/CEC_ProxyPullSupplier.h"
+#include "orbsvcs/CosEvent/event_serv_export.h"
+
+TAO_BEGIN_VERSIONED_NAMESPACE_DECL
+
+class TAO_CEC_EventChannel;
+
+/**
+ * @class TAO_CEC_ConsumerAdmin
+ *
+ * @brief ConsumerAdmin
+ *
+ * Implements the ConsumerAdmin interface, i.e. the factory for
+ * ProxyPushSupplier objects.
+ * = MEMORY MANAGMENT
+ * It does not assume ownership of the TAO_CEC_EventChannel
+ * object; but it *does* assume ownership of the
+ * TAO_CEC_ProxyPushSupplier_Set object.
+ * = LOCKING
+ * No provisions for locking, access must be serialized
+ * externally.
+ * = TODO
+ */
+class TAO_Event_Serv_Export TAO_CEC_ConsumerAdmin
+ : public POA_CosEventChannelAdmin::ConsumerAdmin
+{
+public:
+ /**
+ * constructor. If <supplier_set> is nil then it builds one using
+ * the <event_channel> argument.
+ * In any case it assumes ownership.
+ */
+ TAO_CEC_ConsumerAdmin (TAO_CEC_EventChannel* event_channel);
+
+ /// destructor...
+ virtual ~TAO_CEC_ConsumerAdmin (void);
+
+ /// For each elements call <worker->work()>.
+ void for_each (TAO_ESF_Worker<TAO_CEC_ProxyPushSupplier> *worker
+ ACE_ENV_ARG_DECL);
+ void for_each (TAO_ESF_Worker<TAO_CEC_ProxyPullSupplier> *worker
+ ACE_ENV_ARG_DECL);
+
+ /// Push the event to all the consumers
+ void push (const CORBA::Any &event
+ ACE_ENV_ARG_DECL);
+
+ /// Used to inform the EC that a Supplier has connected or
+ /// disconnected from it.
+ virtual void connected (TAO_CEC_ProxyPushSupplier*
+ ACE_ENV_ARG_DECL_NOT_USED);
+ virtual void reconnected (TAO_CEC_ProxyPushSupplier*
+ ACE_ENV_ARG_DECL_NOT_USED);
+ virtual void disconnected (TAO_CEC_ProxyPushSupplier*
+ ACE_ENV_ARG_DECL_NOT_USED);
+ virtual void connected (TAO_CEC_ProxyPullSupplier*
+ ACE_ENV_ARG_DECL_NOT_USED);
+ virtual void reconnected (TAO_CEC_ProxyPullSupplier*
+ ACE_ENV_ARG_DECL_NOT_USED);
+ virtual void disconnected (TAO_CEC_ProxyPullSupplier*
+ ACE_ENV_ARG_DECL_NOT_USED);
+
+ /// The event channel is shutting down, inform all the consumers of
+ /// this
+ virtual void shutdown (ACE_ENV_SINGLE_ARG_DECL_NOT_USED);
+
+ // = The CosEventChannelAdmin::ConsumerAdmin methods...
+ virtual CosEventChannelAdmin::ProxyPushSupplier_ptr
+ obtain_push_supplier (ACE_ENV_SINGLE_ARG_DECL_NOT_USED)
+ ACE_THROW_SPEC ((CORBA::SystemException));
+ virtual CosEventChannelAdmin::ProxyPullSupplier_ptr
+ obtain_pull_supplier (ACE_ENV_SINGLE_ARG_DECL_NOT_USED)
+ ACE_THROW_SPEC ((CORBA::SystemException));
+
+ // = The PortableServer::ServantBase methods
+ virtual PortableServer::POA_ptr _default_POA (ACE_ENV_SINGLE_ARG_DECL);
+
+private:
+ /// The Event Channel we belong to
+ TAO_CEC_EventChannel *event_channel_;
+
+ /// Store the default POA.
+ PortableServer::POA_var default_POA_;
+
+ /// Implement the push side of this class
+ TAO_ESF_Proxy_Admin<TAO_CEC_EventChannel,TAO_CEC_ProxyPushSupplier,CosEventChannelAdmin::ProxyPushSupplier> push_admin_;
+
+ /// Implement the pull side of this class
+ TAO_ESF_Proxy_Admin<TAO_CEC_EventChannel,TAO_CEC_ProxyPullSupplier,CosEventChannelAdmin::ProxyPullSupplier> pull_admin_;
+
+};
+
+// ****************************************************************
+
+class TAO_CEC_Propagate_Event_Push : public TAO_ESF_Worker<TAO_CEC_ProxyPushSupplier>
+{
+public:
+ TAO_CEC_Propagate_Event_Push (const CORBA::Any& event);
+
+ void work (TAO_CEC_ProxyPushSupplier *supplier
+ ACE_ENV_ARG_DECL);
+
+private:
+ /// The event
+ CORBA::Any event_;
+};
+
+// ****************************************************************
+
+class TAO_CEC_Propagate_Event_Pull : public TAO_ESF_Worker<TAO_CEC_ProxyPullSupplier>
+{
+public:
+ TAO_CEC_Propagate_Event_Pull (const CORBA::Any& event);
+
+ void work (TAO_CEC_ProxyPullSupplier *supplier
+ ACE_ENV_ARG_DECL);
+
+private:
+ /// The event
+ CORBA::Any event_;
+};
+
+TAO_END_VERSIONED_NAMESPACE_DECL
+
+#if defined (__ACE_INLINE__)
+#include "orbsvcs/CosEvent/CEC_ConsumerAdmin.i"
+#endif /* __ACE_INLINE__ */
+
+#include /**/ "ace/post.h"
+
+#endif /* TAO_CEC_CONSUMERADMIN_H */
diff --git a/TAO/orbsvcs/orbsvcs/CosEvent/CEC_ConsumerAdmin.i b/TAO/orbsvcs/orbsvcs/CosEvent/CEC_ConsumerAdmin.i
new file mode 100644
index 00000000000..d7761a1f51d
--- /dev/null
+++ b/TAO/orbsvcs/orbsvcs/CosEvent/CEC_ConsumerAdmin.i
@@ -0,0 +1,39 @@
+// -*- C++ -*-
+//
+// $Id$
+
+TAO_BEGIN_VERSIONED_NAMESPACE_DECL
+
+ACE_INLINE void
+TAO_CEC_ConsumerAdmin::
+ for_each (TAO_ESF_Worker<TAO_CEC_ProxyPushSupplier> *worker
+ ACE_ENV_ARG_DECL)
+{
+ this->push_admin_.for_each (worker ACE_ENV_ARG_PARAMETER);
+}
+
+ACE_INLINE void
+TAO_CEC_ConsumerAdmin::
+ for_each (TAO_ESF_Worker<TAO_CEC_ProxyPullSupplier> *worker
+ ACE_ENV_ARG_DECL)
+{
+ this->pull_admin_.for_each (worker ACE_ENV_ARG_PARAMETER);
+}
+
+// ****************************************************************
+
+ACE_INLINE
+TAO_CEC_Propagate_Event_Push::TAO_CEC_Propagate_Event_Push (const CORBA::Any& event)
+ : event_ (event)
+{
+}
+
+// ****************************************************************
+
+ACE_INLINE
+TAO_CEC_Propagate_Event_Pull::TAO_CEC_Propagate_Event_Pull (const CORBA::Any& event)
+ : event_ (event)
+{
+}
+
+TAO_END_VERSIONED_NAMESPACE_DECL
diff --git a/TAO/orbsvcs/orbsvcs/CosEvent/CEC_ConsumerControl.cpp b/TAO/orbsvcs/orbsvcs/CosEvent/CEC_ConsumerControl.cpp
new file mode 100644
index 00000000000..5c0068aa874
--- /dev/null
+++ b/TAO/orbsvcs/orbsvcs/CosEvent/CEC_ConsumerControl.cpp
@@ -0,0 +1,62 @@
+// $Id$
+
+#include "orbsvcs/CosEvent/CEC_ConsumerControl.h"
+
+ACE_RCSID (CosEvent,
+ CEC_ConsumerControl,
+ "$Id$")
+
+
+TAO_BEGIN_VERSIONED_NAMESPACE_DECL
+
+TAO_CEC_ConsumerControl::TAO_CEC_ConsumerControl (void)
+{
+}
+
+TAO_CEC_ConsumerControl::~TAO_CEC_ConsumerControl (void)
+{
+}
+
+int
+TAO_CEC_ConsumerControl::activate (void)
+{
+ return 0;
+}
+
+int
+TAO_CEC_ConsumerControl::shutdown (void)
+{
+ return 0;
+}
+
+void
+TAO_CEC_ConsumerControl::consumer_not_exist (TAO_CEC_ProxyPushSupplier *
+ ACE_ENV_ARG_DECL_NOT_USED)
+{
+}
+
+void
+TAO_CEC_ConsumerControl::consumer_not_exist (TAO_CEC_ProxyPullSupplier *
+ ACE_ENV_ARG_DECL_NOT_USED)
+{
+}
+
+void
+TAO_CEC_ConsumerControl::system_exception (TAO_CEC_ProxyPushSupplier *,
+ CORBA::SystemException &
+ ACE_ENV_ARG_DECL_NOT_USED)
+{
+}
+
+bool
+TAO_CEC_ConsumerControl::need_to_disconnect (PortableServer::ServantBase*)
+{
+ return true;
+}
+
+void
+TAO_CEC_ConsumerControl::successful_transmission (PortableServer::ServantBase*)
+{
+}
+
+TAO_END_VERSIONED_NAMESPACE_DECL
diff --git a/TAO/orbsvcs/orbsvcs/CosEvent/CEC_ConsumerControl.h b/TAO/orbsvcs/orbsvcs/CosEvent/CEC_ConsumerControl.h
new file mode 100644
index 00000000000..b0c0f22ceaa
--- /dev/null
+++ b/TAO/orbsvcs/orbsvcs/CosEvent/CEC_ConsumerControl.h
@@ -0,0 +1,99 @@
+// -*- C++ -*-
+
+//=============================================================================
+/**
+ * @file CEC_ConsumerControl.h
+ *
+ * $Id$
+ *
+ * @author Carlos O'Ryan (coryan@cs.wustl.edu)More details can be found in:http://www.cs.wustl.edu/~coryan/EC/index.html
+ */
+//=============================================================================
+
+
+#ifndef TAO_CEC_CONSUMERCONTROL_H
+#define TAO_CEC_CONSUMERCONTROL_H
+
+#include /**/ "ace/pre.h"
+
+#include "orbsvcs/CosEvent/event_serv_export.h"
+
+#if !defined (ACE_LACKS_PRAGMA_ONCE)
+# pragma once
+#endif /* ACE_LACKS_PRAGMA_ONCE */
+
+#include "tao/PortableServer/PortableServer.h"
+
+TAO_BEGIN_VERSIONED_NAMESPACE_DECL
+
+class TAO_CEC_EventChannel;
+class TAO_CEC_ProxyPushSupplier;
+class TAO_CEC_ProxyPullSupplier;
+
+namespace CORBA
+{
+ class SystemException;
+}
+
+/**
+ * @class TAO_CEC_ConsumerControl
+ *
+ * @brief ConsumerControl
+ *
+ * Defines the interface for the consumer control strategy.
+ * This strategy handles misbehaving or failing consumers.
+ * = MEMORY MANAGMENT
+ * = LOCKING
+ * = TODO
+ */
+class TAO_Event_Serv_Export TAO_CEC_ConsumerControl
+{
+public:
+ /// Constructor. It does not assume ownership of the <event_channel>
+ /// parameter.
+ TAO_CEC_ConsumerControl (void);
+
+ /// destructor...
+ virtual ~TAO_CEC_ConsumerControl (void);
+
+ /// Activate any internal threads or timers used to poll the state of
+ /// the consumers
+ virtual int activate (void);
+ virtual int shutdown (void);
+
+ /**
+ * When pushing an event to the consumer a CORBA::OBJECT_NOT_EXIST
+ * exception was raised. The only interpretation is that the object
+ * has been destroyed. The strategy has to (at the very least),
+ * reclaim all the resources attached to that object.
+ */
+ virtual void consumer_not_exist (TAO_CEC_ProxyPushSupplier *proxy
+ ACE_ENV_ARG_DECL_NOT_USED);
+
+ /**
+ * Invoked by helper classes when they detect that a consumer no
+ * longer exists (i.e. _non_existent() returns true and/or the
+ * CORBA::OBJECT_NOT_EXIST exception has been raised).
+ */
+ virtual void consumer_not_exist (TAO_CEC_ProxyPullSupplier *proxy
+ ACE_ENV_ARG_DECL_NOT_USED);
+
+ /// Some system exception was rasied while trying to push an event.
+ virtual void system_exception (TAO_CEC_ProxyPushSupplier *proxy,
+ CORBA::SystemException &
+ ACE_ENV_ARG_DECL_NOT_USED);
+
+ /// Do we need to disconnect this supplier? The parameter type for
+ /// proxy is PortableServer::ServantBase* due to the fact that this
+ /// method will be used for TAO_CEC_ProxyPushSupplier's and
+ /// TAO_CEC_ProxyPullSupplier's.
+ virtual bool need_to_disconnect (PortableServer::ServantBase* proxy);
+
+ /// Allow others to inform us when a send or receive was successful.
+ virtual void successful_transmission (PortableServer::ServantBase* proxy);
+};
+
+TAO_END_VERSIONED_NAMESPACE_DECL
+
+#include /**/ "ace/post.h"
+#endif /* TAO_CEC_CONSUMERCONTROL_H */
diff --git a/TAO/orbsvcs/orbsvcs/CosEvent/CEC_Default_Factory.cpp b/TAO/orbsvcs/orbsvcs/CosEvent/CEC_Default_Factory.cpp
new file mode 100644
index 00000000000..19b4f4d46d6
--- /dev/null
+++ b/TAO/orbsvcs/orbsvcs/CosEvent/CEC_Default_Factory.cpp
@@ -0,0 +1,1403 @@
+// $Id$
+
+#include "orbsvcs/CosEvent/CEC_Default_Factory.h"
+#include "orbsvcs/CosEvent/CEC_MT_Dispatching.h"
+#include "orbsvcs/CosEvent/CEC_Reactive_Pulling_Strategy.h"
+#include "orbsvcs/CosEvent/CEC_ConsumerAdmin.h"
+#include "orbsvcs/CosEvent/CEC_SupplierAdmin.h"
+#include "orbsvcs/CosEvent/CEC_ProxyPushConsumer.h"
+#include "orbsvcs/CosEvent/CEC_ProxyPullConsumer.h"
+#include "orbsvcs/CosEvent/CEC_ProxyPushSupplier.h"
+#include "orbsvcs/CosEvent/CEC_ProxyPullSupplier.h"
+#include "orbsvcs/CosEvent/CEC_EventChannel.h"
+#include "orbsvcs/CosEvent/CEC_Reactive_ConsumerControl.h"
+#include "orbsvcs/CosEvent/CEC_Reactive_SupplierControl.h"
+
+#include "orbsvcs/ESF/ESF_Immediate_Changes.h"
+#include "orbsvcs/ESF/ESF_Delayed_Changes.h"
+#include "orbsvcs/ESF/ESF_Copy_On_Write.h"
+#include "orbsvcs/ESF/ESF_Copy_On_Read.h"
+#include "orbsvcs/ESF/ESF_Proxy_List.h"
+#include "orbsvcs/ESF/ESF_Proxy_RB_Tree.h"
+#include "orbsvcs/Time_Utilities.h"
+
+#include "tao/Messaging/Messaging_RT_PolicyC.h"
+
+#include "ace/Arg_Shifter.h"
+#include "ace/Sched_Params.h"
+#include "ace/OS_NS_strings.h"
+#include "ace/Null_Mutex.h"
+#include "ace/Null_Condition.h"
+#include "ace/Recursive_Thread_Mutex.h"
+
+#if defined (TAO_HAS_TYPED_EVENT_CHANNEL)
+#include "orbsvcs/CosEvent/CEC_TypedConsumerAdmin.h"
+#include "orbsvcs/CosEvent/CEC_TypedSupplierAdmin.h"
+#include "orbsvcs/CosEvent/CEC_TypedEventChannel.h"
+#endif /* TAO_HAS_TYPED_EVENT_CHANNEL */
+
+#if ! defined (__ACE_INLINE__)
+#include "orbsvcs/CosEvent/CEC_Default_Factory.i"
+#endif /* __ACE_INLINE__ */
+
+ACE_RCSID (CosEvent,
+ CEC_Default_Factory,
+ "$Id$")
+
+
+TAO_BEGIN_VERSIONED_NAMESPACE_DECL
+
+TAO_CEC_Default_Factory::~TAO_CEC_Default_Factory (void)
+{
+ if (orbid_dupped_ != 0)
+ {
+ ACE_OS::free (orbid_);
+ }
+}
+
+int
+TAO_CEC_Default_Factory::init_svcs (void)
+{
+ return
+ ACE_Service_Config::static_svcs ()->insert (
+ &ace_svc_desc_TAO_CEC_Default_Factory
+ );
+}
+
+int
+TAO_CEC_Default_Factory::parse_collection_arg (ACE_TCHAR* opt)
+{
+ int collection_type = 0;
+ int synch_type = 0;
+ int iteration_type = 0;
+
+ ACE_TCHAR* aux = 0;
+ for (ACE_TCHAR* arg = ACE_OS::strtok_r (opt, ACE_TEXT(":"), &aux);
+ arg != 0;
+ arg = ACE_OS::strtok_r (0, ACE_TEXT(":"), &aux))
+ {
+ if (ACE_OS::strcasecmp (arg, ACE_TEXT("mt")) == 0)
+ synch_type = 0;
+ else if (ACE_OS::strcasecmp (arg, ACE_TEXT("st")) == 0)
+ synch_type = 1;
+ else if (ACE_OS::strcasecmp (arg, ACE_TEXT("list")) == 0)
+ collection_type = 0;
+ else if (ACE_OS::strcasecmp (arg, ACE_TEXT("rb_tree")) == 0)
+ collection_type = 1;
+ else if (ACE_OS::strcasecmp (arg, ACE_TEXT("immediate")) == 0)
+ iteration_type = 0;
+ else if (ACE_OS::strcasecmp (arg, ACE_TEXT("copy_on_read")) == 0)
+ iteration_type = 1;
+ else if (ACE_OS::strcasecmp (arg, ACE_TEXT("copy_on_write")) == 0)
+ iteration_type = 2;
+ else if (ACE_OS::strcasecmp (arg, ACE_TEXT("delayed")) == 0)
+ iteration_type = 3;
+ else
+ ACE_ERROR ((LM_ERROR,
+ "CEC_Default_Factory - "
+ "unknown collection modifier <%s>\n",
+ arg));
+ }
+ return (synch_type << 8) |(collection_type << 4) | iteration_type;
+}
+
+int
+TAO_CEC_Default_Factory::init (int argc, ACE_TCHAR* argv[])
+{
+ ACE_Arg_Shifter arg_shifter (argc, argv);
+
+ this->dispatching_threads_flags_ =
+ THR_SCHED_DEFAULT|THR_BOUND|THR_NEW_LWP;
+ this->dispatching_threads_priority_ =
+ ACE_THR_PRI_OTHER_DEF;
+
+ while (arg_shifter.is_anything_left ())
+ {
+ const ACE_TCHAR *arg = arg_shifter.get_current ();
+
+ if (ACE_OS::strcasecmp (arg, ACE_TEXT("-CECDispatching")) == 0)
+ {
+ arg_shifter.consume_arg ();
+
+ if (arg_shifter.is_parameter_next ())
+ {
+ const ACE_TCHAR* opt = arg_shifter.get_current ();
+ if (ACE_OS::strcasecmp (opt, ACE_TEXT("reactive")) == 0)
+ {
+ this->dispatching_ = 0;
+ }
+ else if (ACE_OS::strcasecmp (opt, ACE_TEXT("mt")) == 0)
+ {
+ this->dispatching_ = 1;
+ }
+ else
+ {
+ ACE_ERROR ((LM_ERROR,
+ "CEC_Default_Factory - "
+ "unsupported dispatching <%s>\n",
+ opt));
+ }
+ arg_shifter.consume_arg ();
+ }
+ }
+
+ else if (ACE_OS::strcasecmp (arg, ACE_TEXT("-CECDispatchingThreads")) == 0)
+ {
+ arg_shifter.consume_arg ();
+
+ if (arg_shifter.is_parameter_next ())
+ {
+ const ACE_TCHAR* opt = arg_shifter.get_current ();
+ this->dispatching_threads_ = ACE_OS::atoi (opt);
+ arg_shifter.consume_arg ();
+ }
+ }
+
+ else if (ACE_OS::strcasecmp (arg, ACE_TEXT("-CECProxyConsumerCollection")) == 0)
+ {
+ arg_shifter.consume_arg ();
+
+ if (arg_shifter.is_parameter_next ())
+ {
+ const ACE_TCHAR *current_arg = arg_shifter.get_current ();
+ ACE_TCHAR *opt = ACE_OS::strdup (current_arg);
+ this->consumer_collection_ = this->parse_collection_arg (opt);
+ ACE_OS::free (opt);
+ arg_shifter.consume_arg ();
+ }
+ }
+
+ else if (ACE_OS::strcasecmp (arg, ACE_TEXT("-CECProxySupplierCollection")) == 0)
+ {
+ arg_shifter.consume_arg ();
+
+ if (arg_shifter.is_parameter_next ())
+ {
+ const ACE_TCHAR *current_arg = arg_shifter.get_current();
+ ACE_TCHAR* opt = ACE_OS::strdup(current_arg);
+ this->supplier_collection_ =
+ this->parse_collection_arg (opt);
+ ACE_OS::free(opt);
+ arg_shifter.consume_arg ();
+ }
+ }
+
+ else if (ACE_OS::strcasecmp (arg, ACE_TEXT("-CECProxyConsumerLock")) == 0)
+ {
+ arg_shifter.consume_arg ();
+
+ if (arg_shifter.is_parameter_next ())
+ {
+ const ACE_TCHAR* opt = arg_shifter.get_current ();
+ if (ACE_OS::strcasecmp (opt, ACE_TEXT("null")) == 0)
+ {
+ this->consumer_lock_ = 0;
+ }
+ else if (ACE_OS::strcasecmp (opt, ACE_TEXT("thread")) == 0)
+ {
+ this->consumer_lock_ = 1;
+ }
+ else if (ACE_OS::strcasecmp (opt, ACE_TEXT("recursive")) == 0)
+ {
+ this->consumer_lock_ = 2;
+ }
+ else
+ {
+ ACE_ERROR ((LM_ERROR,
+ "CEC_Default_Factory - "
+ "unsupported consumer lock <%s>\n",
+ opt));
+ }
+ arg_shifter.consume_arg ();
+ }
+ }
+
+ else if (ACE_OS::strcasecmp (arg, ACE_TEXT("-CECProxySupplierLock")) == 0)
+ {
+ arg_shifter.consume_arg ();
+
+ if (arg_shifter.is_parameter_next ())
+ {
+ const ACE_TCHAR* opt = arg_shifter.get_current ();
+ if (ACE_OS::strcasecmp (opt, ACE_TEXT("null")) == 0)
+ {
+ this->supplier_lock_ = 0;
+ }
+ else if (ACE_OS::strcasecmp (opt, ACE_TEXT("thread")) == 0)
+ {
+ this->supplier_lock_ = 1;
+ }
+ else if (ACE_OS::strcasecmp (opt, ACE_TEXT("recursive")) == 0)
+ {
+ this->supplier_lock_ = 2;
+ }
+ else
+ {
+ ACE_ERROR ((LM_ERROR,
+ "CEC_Default_Factory - "
+ "unsupported supplier lock <%s>\n",
+ opt));
+ }
+ arg_shifter.consume_arg ();
+ }
+ }
+
+ else if (ACE_OS::strcasecmp (arg, ACE_TEXT("-CECReactivePullingPeriod")) == 0)
+ {
+ arg_shifter.consume_arg ();
+
+ if (arg_shifter.is_parameter_next ())
+ {
+ const ACE_TCHAR* opt = arg_shifter.get_current ();
+ this->reactive_pulling_period_ = ACE_OS::atoi (opt);
+ arg_shifter.consume_arg ();
+ }
+ }
+
+ else if (ACE_OS::strcasecmp (arg, ACE_TEXT("-CECUseORBId")) == 0)
+ {
+ arg_shifter.consume_arg ();
+
+ if (arg_shifter.is_parameter_next ())
+ {
+ // Copy argument for later use
+ this->orbid_ = ACE_OS::strdup(ACE_TEXT_ALWAYS_CHAR(arg_shifter.get_current ()));
+ orbid_dupped_ = 1;
+ arg_shifter.consume_arg ();
+ }
+ }
+
+ else if (ACE_OS::strcasecmp (arg, ACE_TEXT("-CECConsumerControl")) == 0)
+ {
+ arg_shifter.consume_arg ();
+
+ if (arg_shifter.is_parameter_next ())
+ {
+ const ACE_TCHAR* opt = arg_shifter.get_current ();
+ if (ACE_OS::strcasecmp (opt, ACE_TEXT("null")) == 0)
+ {
+ this->consumer_control_ = 0;
+ }
+ else if (ACE_OS::strcasecmp (opt, ACE_TEXT("reactive")) == 0)
+ {
+ this->consumer_control_ = 1;
+ }
+ else
+ {
+ ACE_ERROR ((LM_ERROR,
+ "CEC_Default_Factory - "
+ "unsupported consumer control <%s>\n",
+ opt));
+ }
+ arg_shifter.consume_arg ();
+ }
+ }
+
+ else if (ACE_OS::strcasecmp (arg, ACE_TEXT("-CECSupplierControl")) == 0)
+ {
+ arg_shifter.consume_arg ();
+
+ if (arg_shifter.is_parameter_next ())
+ {
+ const ACE_TCHAR* opt = arg_shifter.get_current ();
+ if (ACE_OS::strcasecmp (opt, ACE_TEXT("null")) == 0)
+ {
+ this->supplier_control_ = 0;
+ }
+ else if (ACE_OS::strcasecmp (opt, ACE_TEXT("reactive")) == 0)
+ {
+ this->supplier_control_ = 1;
+ }
+ else
+ {
+ ACE_ERROR ((LM_ERROR,
+ "CEC_Default_Factory - "
+ "unsupported supplier control <%s>\n",
+ opt));
+ }
+ arg_shifter.consume_arg ();
+ }
+ }
+
+ else if (ACE_OS::strcasecmp (arg, ACE_TEXT("-CECConsumerControlPeriod")) == 0)
+ {
+ arg_shifter.consume_arg ();
+
+ if (arg_shifter.is_parameter_next ())
+ {
+ const ACE_TCHAR* opt = arg_shifter.get_current ();
+ this->consumer_control_period_ = ACE_OS::atoi (opt);
+ arg_shifter.consume_arg ();
+ }
+ }
+
+ else if (ACE_OS::strcasecmp (arg, ACE_TEXT("-CECSupplierControlPeriod")) == 0)
+ {
+ arg_shifter.consume_arg ();
+
+ if (arg_shifter.is_parameter_next ())
+ {
+ const ACE_TCHAR* opt = arg_shifter.get_current ();
+ this->supplier_control_period_ = ACE_OS::atoi (opt);
+ arg_shifter.consume_arg ();
+ }
+ }
+
+ else if (ACE_OS::strcasecmp (arg, ACE_TEXT("-CECConsumerControlTimeout")) == 0 ||
+ ACE_OS::strcasecmp (arg, ACE_TEXT("-CECConsumerControlRoundtripTimeout")) == 0)
+ {
+ arg_shifter.consume_arg ();
+
+ if (arg_shifter.is_parameter_next ())
+ {
+ const ACE_TCHAR* opt = arg_shifter.get_current ();
+ unsigned long timeout_ = ACE_OS::strtoul(opt, 0, 10);
+ this->consumer_control_timeout_.usec(timeout_);
+ arg_shifter.consume_arg ();
+ }
+ }
+
+ else if (ACE_OS::strcasecmp (arg, ACE_TEXT("-CECSupplierControlTimeout")) == 0 ||
+ ACE_OS::strcasecmp (arg, ACE_TEXT("-CECSupplierControlRoundtripTimeout")) == 0)
+ {
+ arg_shifter.consume_arg ();
+
+ if (arg_shifter.is_parameter_next ())
+ {
+ const ACE_TCHAR* opt = arg_shifter.get_current ();
+ unsigned long timeout_ = ACE_OS::strtoul(opt, 0, 10);
+ this->supplier_control_timeout_.usec(timeout_);
+ arg_shifter.consume_arg ();
+ }
+ }
+
+ else if (ACE_OS::strcasecmp (arg, ACE_TEXT("-CECConsumerOperationTimeout")) == 0)
+ {
+ arg_shifter.consume_arg ();
+
+ if (arg_shifter.is_parameter_next ())
+ {
+ const ACE_TCHAR* opt = arg_shifter.get_current ();
+ unsigned long timeout = ACE_OS::strtoul (opt, 0, 10);
+ this->consumer_timeout_.usec (timeout);
+ arg_shifter.consume_arg ();
+ }
+ }
+
+ else if (ACE_OS::strcasecmp (arg, ACE_TEXT("-CECSupplierOperationTimeout")) == 0)
+ {
+ arg_shifter.consume_arg ();
+
+ if (arg_shifter.is_parameter_next ())
+ {
+ const ACE_TCHAR* opt = arg_shifter.get_current ();
+ unsigned long timeout = ACE_OS::strtoul (opt, 0, 10);
+ this->supplier_timeout_.usec (timeout);
+ arg_shifter.consume_arg ();
+ }
+ }
+
+ else if (ACE_OS::strcasecmp (arg, ACE_TEXT("-CECProxyDisconnectRetries")) == 0)
+ {
+ arg_shifter.consume_arg ();
+
+ if (arg_shifter.is_parameter_next ())
+ {
+ const ACE_TCHAR* opt = arg_shifter.get_current ();
+ this->proxy_disconnect_retries_ = ACE_OS::atoi (opt);
+ arg_shifter.consume_arg ();
+ }
+ }
+
+ else if (ACE_OS::strncmp (arg, ACE_TEXT("-CEC"), 3) == 0)
+ {
+ arg_shifter.consume_arg ();
+ ACE_ERROR ((LM_ERROR,
+ "CEC_Default_Factory - "
+ "unknown option <%s>\n",
+ arg));
+ }
+ else
+ {
+ arg_shifter.consume_arg ();
+ ACE_DEBUG ((LM_DEBUG,
+ "CEC_Default_Factory - "
+ "ignoring option <%s>\n",
+ arg));
+ }
+ }
+ return 0;
+}
+
+int
+TAO_CEC_Default_Factory::fini (void)
+{
+ return 0;
+}
+
+// ****************************************************************
+
+TAO_CEC_Dispatching*
+TAO_CEC_Default_Factory::create_dispatching (TAO_CEC_EventChannel *)
+{
+ if (this->dispatching_ == 0)
+ return new TAO_CEC_Reactive_Dispatching ();
+ else if (this->dispatching_ == 1)
+ return new TAO_CEC_MT_Dispatching (this->dispatching_threads_,
+ this->dispatching_threads_flags_,
+ this->dispatching_threads_priority_,
+ this->dispatching_threads_force_active_);
+ return 0;
+}
+
+#if defined (TAO_HAS_TYPED_EVENT_CHANNEL)
+TAO_CEC_Dispatching*
+TAO_CEC_Default_Factory::create_dispatching (TAO_CEC_TypedEventChannel *)
+{
+ if (this->dispatching_ == 0)
+ return new TAO_CEC_Reactive_Dispatching ();
+ else if (this->dispatching_ == 1)
+ return new TAO_CEC_MT_Dispatching (this->dispatching_threads_,
+ this->dispatching_threads_flags_,
+ this->dispatching_threads_priority_,
+ this->dispatching_threads_force_active_);
+ return 0;
+}
+#endif /* TAO_HAS_TYPED_EVENT_CHANNEL */
+
+void
+TAO_CEC_Default_Factory::destroy_dispatching (TAO_CEC_Dispatching *x)
+{
+ delete x;
+}
+
+TAO_CEC_Pulling_Strategy*
+TAO_CEC_Default_Factory::create_pulling_strategy (TAO_CEC_EventChannel *ec)
+{
+ if (this->pulling_strategy_ == 0)
+ {
+ int argc = 0;
+ char **argv = 0;
+ CORBA::ORB_var orb =
+ CORBA::ORB_init (argc, argv, this->orbid_);
+
+ ACE_Time_Value rate (0, this->reactive_pulling_period_);
+ return new TAO_CEC_Reactive_Pulling_Strategy (
+ rate, this->supplier_control_timeout_,
+ ec, orb.in ());
+ }
+ return 0;
+}
+
+void
+TAO_CEC_Default_Factory::destroy_pulling_strategy (TAO_CEC_Pulling_Strategy *x)
+{
+ delete x;
+}
+
+TAO_CEC_ConsumerAdmin*
+TAO_CEC_Default_Factory::create_consumer_admin (TAO_CEC_EventChannel *ec)
+{
+ return new TAO_CEC_ConsumerAdmin (ec);
+}
+
+#if defined (TAO_HAS_TYPED_EVENT_CHANNEL)
+TAO_CEC_TypedConsumerAdmin*
+TAO_CEC_Default_Factory::create_consumer_admin (TAO_CEC_TypedEventChannel *ec)
+{
+ return new TAO_CEC_TypedConsumerAdmin (ec);
+}
+#endif /* TAO_HAS_TYPED_EVENT_CHANNEL */
+
+void
+TAO_CEC_Default_Factory::destroy_consumer_admin (TAO_CEC_ConsumerAdmin *x)
+{
+ delete x;
+}
+
+#if defined (TAO_HAS_TYPED_EVENT_CHANNEL)
+void
+TAO_CEC_Default_Factory::destroy_consumer_admin (TAO_CEC_TypedConsumerAdmin *x)
+{
+ delete x;
+}
+#endif /* TAO_HAS_TYPED_EVENT_CHANNEL */
+
+TAO_CEC_SupplierAdmin*
+TAO_CEC_Default_Factory::create_supplier_admin (TAO_CEC_EventChannel *ec)
+{
+ return new TAO_CEC_SupplierAdmin (ec);
+}
+
+#if defined (TAO_HAS_TYPED_EVENT_CHANNEL)
+TAO_CEC_TypedSupplierAdmin*
+TAO_CEC_Default_Factory::create_supplier_admin (TAO_CEC_TypedEventChannel *ec)
+{
+ return new TAO_CEC_TypedSupplierAdmin (ec);
+}
+#endif /* TAO_HAS_TYPED_EVENT_CHANNEL */
+
+void
+TAO_CEC_Default_Factory::destroy_supplier_admin (TAO_CEC_SupplierAdmin *x)
+{
+ delete x;
+}
+
+#if defined (TAO_HAS_TYPED_EVENT_CHANNEL)
+void
+TAO_CEC_Default_Factory::destroy_supplier_admin (TAO_CEC_TypedSupplierAdmin *x)
+{
+ delete x;
+}
+#endif /* TAO_HAS_TYPED_EVENT_CHANNEL */
+
+TAO_CEC_ProxyPushSupplier*
+TAO_CEC_Default_Factory::create_proxy_push_supplier (TAO_CEC_EventChannel *ec)
+{
+ TAO_CEC_ProxyPushSupplier *created;
+ ACE_Time_Value timeout = this->consumer_control_ ? this->consumer_timeout_
+ : ACE_Time_Value::zero;
+ ACE_NEW_RETURN (created, TAO_CEC_ProxyPushSupplier (ec, timeout), 0);
+ return created;
+}
+
+#if defined (TAO_HAS_TYPED_EVENT_CHANNEL)
+TAO_CEC_ProxyPushSupplier*
+TAO_CEC_Default_Factory::create_proxy_push_supplier (TAO_CEC_TypedEventChannel *ec)
+{
+ TAO_CEC_ProxyPushSupplier *created;
+ ACE_Time_Value timeout = this->consumer_control_ ? this->consumer_timeout_
+ : ACE_Time_Value::zero;
+ ACE_NEW_RETURN (created, TAO_CEC_ProxyPushSupplier (ec, timeout), 0);
+ return created;
+}
+#endif /* TAO_HAS_TYPED_EVENT_CHANNEL */
+
+void
+TAO_CEC_Default_Factory::destroy_proxy_push_supplier (TAO_CEC_ProxyPushSupplier *x)
+{
+ delete x;
+}
+
+TAO_CEC_ProxyPullSupplier*
+TAO_CEC_Default_Factory::create_proxy_pull_supplier (TAO_CEC_EventChannel *ec)
+{
+ TAO_CEC_ProxyPullSupplier *created;
+ ACE_Time_Value timeout = this->consumer_control_ ? this->consumer_timeout_
+ : ACE_Time_Value::zero;
+ ACE_NEW_RETURN (created, TAO_CEC_ProxyPullSupplier (ec, timeout), 0);
+ return created;
+}
+
+void
+TAO_CEC_Default_Factory::destroy_proxy_pull_supplier (TAO_CEC_ProxyPullSupplier *x)
+{
+ delete x;
+}
+
+TAO_CEC_ProxyPushConsumer*
+TAO_CEC_Default_Factory::create_proxy_push_consumer (TAO_CEC_EventChannel *ec)
+{
+ TAO_CEC_ProxyPushConsumer *created;
+ ACE_Time_Value timeout = this->supplier_control_ ? this->supplier_timeout_
+ : ACE_Time_Value::zero;
+ ACE_NEW_RETURN (created, TAO_CEC_ProxyPushConsumer (ec, timeout), 0);
+ return created;
+}
+
+#if defined (TAO_HAS_TYPED_EVENT_CHANNEL)
+TAO_CEC_TypedProxyPushConsumer*
+TAO_CEC_Default_Factory::create_proxy_push_consumer (TAO_CEC_TypedEventChannel *ec)
+{
+ TAO_CEC_TypedProxyPushConsumer *created;
+ ACE_Time_Value timeout = this->supplier_control_ ? this->supplier_timeout_
+ : ACE_Time_Value::zero;
+ ACE_NEW_RETURN (created, TAO_CEC_TypedProxyPushConsumer (ec, timeout), 0);
+ return created;
+}
+#endif /* TAO_HAS_TYPED_EVENT_CHANNEL */
+
+void
+TAO_CEC_Default_Factory::destroy_proxy_push_consumer (TAO_CEC_ProxyPushConsumer *x)
+{
+ delete x;
+}
+
+#if defined (TAO_HAS_TYPED_EVENT_CHANNEL)
+void
+TAO_CEC_Default_Factory::destroy_proxy_push_consumer (TAO_CEC_TypedProxyPushConsumer *x)
+{
+ delete x;
+}
+#endif /* TAO_HAS_TYPED_EVENT_CHANNEL */
+
+TAO_CEC_ProxyPullConsumer*
+TAO_CEC_Default_Factory::create_proxy_pull_consumer (TAO_CEC_EventChannel *ec)
+{
+ TAO_CEC_ProxyPullConsumer *created;
+ ACE_Time_Value timeout = this->supplier_control_ ? this->supplier_timeout_
+ : ACE_Time_Value::zero;
+ ACE_NEW_RETURN (created, TAO_CEC_ProxyPullConsumer (ec, timeout), 0);
+ return created;
+}
+
+void
+TAO_CEC_Default_Factory::destroy_proxy_pull_consumer (TAO_CEC_ProxyPullConsumer *x)
+{
+ delete x;
+}
+
+// These typedefs workaround a SunCC 4.2 bug
+typedef
+ TAO_ESF_Proxy_List<TAO_CEC_ProxyPushConsumer>::Iterator
+ TAO_CEC_PushConsumer_List_Iterator;
+typedef
+ TAO_ESF_Proxy_RB_Tree<TAO_CEC_ProxyPushConsumer>::Iterator
+ TAO_CEC_PushConsumer_RB_Tree_Iterator;
+#if defined (TAO_HAS_TYPED_EVENT_CHANNEL)
+typedef
+ TAO_ESF_Proxy_List<TAO_CEC_TypedProxyPushConsumer>::Iterator
+ TAO_CEC_TypedPushConsumer_List_Iterator;
+typedef
+ TAO_ESF_Proxy_RB_Tree<TAO_CEC_TypedProxyPushConsumer>::Iterator
+ TAO_CEC_TypedPushConsumer_RB_Tree_Iterator;
+#endif /* TAO_HAS_TYPED_EVENT_CHANNEL */
+typedef
+ TAO_ESF_Proxy_List<TAO_CEC_ProxyPullConsumer>::Iterator
+ TAO_CEC_PullConsumer_List_Iterator;
+typedef
+ TAO_ESF_Proxy_RB_Tree<TAO_CEC_ProxyPullConsumer>::Iterator
+ TAO_CEC_PullConsumer_RB_Tree_Iterator;
+typedef
+ TAO_ESF_Proxy_List<TAO_CEC_ProxyPushSupplier>::Iterator
+ TAO_CEC_PushSupplier_List_Iterator;
+typedef
+ TAO_ESF_Proxy_RB_Tree<TAO_CEC_ProxyPushSupplier>::Iterator
+ TAO_CEC_PushSupplier_RB_Tree_Iterator;
+typedef
+ TAO_ESF_Proxy_List<TAO_CEC_ProxyPullSupplier>::Iterator
+ TAO_CEC_PullSupplier_List_Iterator;
+typedef
+ TAO_ESF_Proxy_RB_Tree<TAO_CEC_ProxyPullSupplier>::Iterator
+ TAO_CEC_PullSupplier_RB_Tree_Iterator;
+
+TAO_CEC_ProxyPushConsumer_Collection*
+TAO_CEC_Default_Factory::create_proxy_push_consumer_collection (TAO_CEC_EventChannel *)
+{
+ if (this->consumer_collection_ == 0x000)
+ return new TAO_ESF_Immediate_Changes<TAO_CEC_ProxyPushConsumer,
+ TAO_ESF_Proxy_List<TAO_CEC_ProxyPushConsumer>,
+ TAO_CEC_PushConsumer_List_Iterator,
+ TAO_SYNCH_MUTEX> ();
+ else if (this->consumer_collection_ == 0x001)
+ return new TAO_ESF_Copy_On_Read<TAO_CEC_ProxyPushConsumer,
+ TAO_ESF_Proxy_List<TAO_CEC_ProxyPushConsumer>,
+ TAO_CEC_PushConsumer_List_Iterator,
+ TAO_SYNCH_MUTEX> ();
+ else if (this->consumer_collection_ == 0x002)
+ return new TAO_ESF_Copy_On_Write<TAO_CEC_ProxyPushConsumer,
+ TAO_ESF_Proxy_List<TAO_CEC_ProxyPushConsumer>,
+ TAO_CEC_PushConsumer_List_Iterator,
+ ACE_SYNCH> ();
+ else if (this->consumer_collection_ == 0x003)
+ return new TAO_ESF_Delayed_Changes<TAO_CEC_ProxyPushConsumer,
+ TAO_ESF_Proxy_List<TAO_CEC_ProxyPushConsumer>,
+ TAO_CEC_PushConsumer_List_Iterator,
+ ACE_SYNCH> ();
+ else if (this->consumer_collection_ == 0x010)
+ return new TAO_ESF_Immediate_Changes<TAO_CEC_ProxyPushConsumer,
+ TAO_ESF_Proxy_RB_Tree<TAO_CEC_ProxyPushConsumer>,
+ TAO_CEC_PushConsumer_RB_Tree_Iterator,
+ TAO_SYNCH_MUTEX> ();
+ else if (this->consumer_collection_ == 0x011)
+ return new TAO_ESF_Copy_On_Read<TAO_CEC_ProxyPushConsumer,
+ TAO_ESF_Proxy_RB_Tree<TAO_CEC_ProxyPushConsumer>,
+ TAO_CEC_PushConsumer_RB_Tree_Iterator,
+ TAO_SYNCH_MUTEX> ();
+ else if (this->consumer_collection_ == 0x012)
+ return new TAO_ESF_Copy_On_Write<TAO_CEC_ProxyPushConsumer,
+ TAO_ESF_Proxy_RB_Tree<TAO_CEC_ProxyPushConsumer>,
+ TAO_CEC_PushConsumer_RB_Tree_Iterator,
+ ACE_SYNCH> ();
+ else if (this->consumer_collection_ == 0x013)
+ return new TAO_ESF_Delayed_Changes<TAO_CEC_ProxyPushConsumer,
+ TAO_ESF_Proxy_RB_Tree<TAO_CEC_ProxyPushConsumer>,
+ TAO_CEC_PushConsumer_RB_Tree_Iterator,
+ ACE_SYNCH> ();
+ else if (this->consumer_collection_ == 0x100)
+ return new TAO_ESF_Immediate_Changes<TAO_CEC_ProxyPushConsumer,
+ TAO_ESF_Proxy_List<TAO_CEC_ProxyPushConsumer>,
+ TAO_CEC_PushConsumer_List_Iterator,
+ ACE_Null_Mutex> ();
+ else if (this->consumer_collection_ == 0x101)
+ return new TAO_ESF_Copy_On_Read<TAO_CEC_ProxyPushConsumer,
+ TAO_ESF_Proxy_List<TAO_CEC_ProxyPushConsumer>,
+ TAO_CEC_PushConsumer_List_Iterator,
+ ACE_Null_Mutex> ();
+ else if (this->consumer_collection_ == 0x102)
+ return new TAO_ESF_Copy_On_Write<TAO_CEC_ProxyPushConsumer,
+ TAO_ESF_Proxy_List<TAO_CEC_ProxyPushConsumer>,
+ TAO_CEC_PushConsumer_List_Iterator,
+ ACE_NULL_SYNCH> ();
+ else if (this->consumer_collection_ == 0x103)
+ return new TAO_ESF_Delayed_Changes<TAO_CEC_ProxyPushConsumer,
+ TAO_ESF_Proxy_List<TAO_CEC_ProxyPushConsumer>,
+ TAO_CEC_PushConsumer_List_Iterator,
+ ACE_NULL_SYNCH> ();
+ else if (this->consumer_collection_ == 0x110)
+ return new TAO_ESF_Immediate_Changes<TAO_CEC_ProxyPushConsumer,
+ TAO_ESF_Proxy_RB_Tree<TAO_CEC_ProxyPushConsumer>,
+ TAO_CEC_PushConsumer_RB_Tree_Iterator,
+ ACE_Null_Mutex> ();
+ else if (this->consumer_collection_ == 0x111)
+ return new TAO_ESF_Copy_On_Read<TAO_CEC_ProxyPushConsumer,
+ TAO_ESF_Proxy_RB_Tree<TAO_CEC_ProxyPushConsumer>,
+ TAO_CEC_PushConsumer_RB_Tree_Iterator,
+ ACE_Null_Mutex> ();
+ else if (this->consumer_collection_ == 0x112)
+ return new TAO_ESF_Copy_On_Write<TAO_CEC_ProxyPushConsumer,
+ TAO_ESF_Proxy_RB_Tree<TAO_CEC_ProxyPushConsumer>,
+ TAO_CEC_PushConsumer_RB_Tree_Iterator,
+ ACE_NULL_SYNCH> ();
+ else if (this->consumer_collection_ == 0x113)
+ return new TAO_ESF_Delayed_Changes<TAO_CEC_ProxyPushConsumer,
+ TAO_ESF_Proxy_RB_Tree<TAO_CEC_ProxyPushConsumer>,
+ TAO_CEC_PushConsumer_RB_Tree_Iterator,
+ ACE_NULL_SYNCH> ();
+
+ return 0;
+}
+
+#if defined (TAO_HAS_TYPED_EVENT_CHANNEL)
+TAO_CEC_TypedProxyPushConsumer_Collection*
+TAO_CEC_Default_Factory::create_proxy_push_consumer_collection (TAO_CEC_TypedEventChannel *)
+{
+ if (this->consumer_collection_ == 0x000)
+ return new TAO_ESF_Immediate_Changes<TAO_CEC_TypedProxyPushConsumer,
+ TAO_ESF_Proxy_List<TAO_CEC_TypedProxyPushConsumer>,
+ TAO_CEC_TypedPushConsumer_List_Iterator,
+ TAO_SYNCH_MUTEX> ();
+ else if (this->consumer_collection_ == 0x001)
+ return new TAO_ESF_Copy_On_Read<TAO_CEC_TypedProxyPushConsumer,
+ TAO_ESF_Proxy_List<TAO_CEC_TypedProxyPushConsumer>,
+ TAO_CEC_TypedPushConsumer_List_Iterator,
+ TAO_SYNCH_MUTEX> ();
+ else if (this->consumer_collection_ == 0x002)
+ return new TAO_ESF_Copy_On_Write<TAO_CEC_TypedProxyPushConsumer,
+ TAO_ESF_Proxy_List<TAO_CEC_TypedProxyPushConsumer>,
+ TAO_CEC_TypedPushConsumer_List_Iterator,
+ ACE_SYNCH> ();
+ else if (this->consumer_collection_ == 0x003)
+ return new TAO_ESF_Delayed_Changes<TAO_CEC_TypedProxyPushConsumer,
+ TAO_ESF_Proxy_List<TAO_CEC_TypedProxyPushConsumer>,
+ TAO_CEC_TypedPushConsumer_List_Iterator,
+ ACE_SYNCH> ();
+ else if (this->consumer_collection_ == 0x010)
+ return new TAO_ESF_Immediate_Changes<TAO_CEC_TypedProxyPushConsumer,
+ TAO_ESF_Proxy_RB_Tree<TAO_CEC_TypedProxyPushConsumer>,
+ TAO_CEC_TypedPushConsumer_RB_Tree_Iterator,
+ TAO_SYNCH_MUTEX> ();
+ else if (this->consumer_collection_ == 0x011)
+ return new TAO_ESF_Copy_On_Read<TAO_CEC_TypedProxyPushConsumer,
+ TAO_ESF_Proxy_RB_Tree<TAO_CEC_TypedProxyPushConsumer>,
+ TAO_CEC_TypedPushConsumer_RB_Tree_Iterator,
+ TAO_SYNCH_MUTEX> ();
+ else if (this->consumer_collection_ == 0x012)
+ return new TAO_ESF_Copy_On_Write<TAO_CEC_TypedProxyPushConsumer,
+ TAO_ESF_Proxy_RB_Tree<TAO_CEC_TypedProxyPushConsumer>,
+ TAO_CEC_TypedPushConsumer_RB_Tree_Iterator,
+ ACE_SYNCH> ();
+ else if (this->consumer_collection_ == 0x013)
+ return new TAO_ESF_Delayed_Changes<TAO_CEC_TypedProxyPushConsumer,
+ TAO_ESF_Proxy_RB_Tree<TAO_CEC_TypedProxyPushConsumer>,
+ TAO_CEC_TypedPushConsumer_RB_Tree_Iterator,
+ ACE_SYNCH> ();
+ else if (this->consumer_collection_ == 0x100)
+ return new TAO_ESF_Immediate_Changes<TAO_CEC_TypedProxyPushConsumer,
+ TAO_ESF_Proxy_List<TAO_CEC_TypedProxyPushConsumer>,
+ TAO_CEC_TypedPushConsumer_List_Iterator,
+ ACE_Null_Mutex> ();
+ else if (this->consumer_collection_ == 0x101)
+ return new TAO_ESF_Copy_On_Read<TAO_CEC_TypedProxyPushConsumer,
+ TAO_ESF_Proxy_List<TAO_CEC_TypedProxyPushConsumer>,
+ TAO_CEC_TypedPushConsumer_List_Iterator,
+ ACE_Null_Mutex> ();
+ else if (this->consumer_collection_ == 0x102)
+ return new TAO_ESF_Copy_On_Write<TAO_CEC_TypedProxyPushConsumer,
+ TAO_ESF_Proxy_List<TAO_CEC_TypedProxyPushConsumer>,
+ TAO_CEC_TypedPushConsumer_List_Iterator,
+ ACE_NULL_SYNCH> ();
+ else if (this->consumer_collection_ == 0x103)
+ return new TAO_ESF_Delayed_Changes<TAO_CEC_TypedProxyPushConsumer,
+ TAO_ESF_Proxy_List<TAO_CEC_TypedProxyPushConsumer>,
+ TAO_CEC_TypedPushConsumer_List_Iterator,
+ ACE_NULL_SYNCH> ();
+ else if (this->consumer_collection_ == 0x110)
+ return new TAO_ESF_Immediate_Changes<TAO_CEC_TypedProxyPushConsumer,
+ TAO_ESF_Proxy_RB_Tree<TAO_CEC_TypedProxyPushConsumer>,
+ TAO_CEC_TypedPushConsumer_RB_Tree_Iterator,
+ ACE_Null_Mutex> ();
+ else if (this->consumer_collection_ == 0x111)
+ return new TAO_ESF_Copy_On_Read<TAO_CEC_TypedProxyPushConsumer,
+ TAO_ESF_Proxy_RB_Tree<TAO_CEC_TypedProxyPushConsumer>,
+ TAO_CEC_TypedPushConsumer_RB_Tree_Iterator,
+ ACE_Null_Mutex> ();
+ else if (this->consumer_collection_ == 0x112)
+ return new TAO_ESF_Copy_On_Write<TAO_CEC_TypedProxyPushConsumer,
+ TAO_ESF_Proxy_RB_Tree<TAO_CEC_TypedProxyPushConsumer>,
+ TAO_CEC_TypedPushConsumer_RB_Tree_Iterator,
+ ACE_NULL_SYNCH> ();
+ else if (this->consumer_collection_ == 0x113)
+ return new TAO_ESF_Delayed_Changes<TAO_CEC_TypedProxyPushConsumer,
+ TAO_ESF_Proxy_RB_Tree<TAO_CEC_TypedProxyPushConsumer>,
+ TAO_CEC_TypedPushConsumer_RB_Tree_Iterator,
+ ACE_NULL_SYNCH> ();
+
+ return 0;
+}
+#endif /* TAO_HAS_TYPED_EVENT_CHANNEL */
+
+void
+TAO_CEC_Default_Factory::destroy_proxy_push_consumer_collection (TAO_CEC_ProxyPushConsumer_Collection *x)
+{
+ delete x;
+}
+
+#if defined (TAO_HAS_TYPED_EVENT_CHANNEL)
+void
+TAO_CEC_Default_Factory::destroy_proxy_push_consumer_collection (TAO_CEC_TypedProxyPushConsumer_Collection *x)
+{
+ delete x;
+}
+#endif /* TAO_HAS_TYPED_EVENT_CHANNEL */
+
+TAO_CEC_ProxyPullConsumer_Collection*
+TAO_CEC_Default_Factory::create_proxy_pull_consumer_collection (TAO_CEC_EventChannel *)
+{
+ if (this->consumer_collection_ == 0x000)
+ return new TAO_ESF_Immediate_Changes<TAO_CEC_ProxyPullConsumer,
+ TAO_ESF_Proxy_List<TAO_CEC_ProxyPullConsumer>,
+ TAO_CEC_PullConsumer_List_Iterator,
+ TAO_SYNCH_MUTEX> ();
+ else if (this->consumer_collection_ == 0x001)
+ return new TAO_ESF_Copy_On_Read<TAO_CEC_ProxyPullConsumer,
+ TAO_ESF_Proxy_List<TAO_CEC_ProxyPullConsumer>,
+ TAO_CEC_PullConsumer_List_Iterator,
+ TAO_SYNCH_MUTEX> ();
+ else if (this->consumer_collection_ == 0x002)
+ return new TAO_ESF_Copy_On_Write<TAO_CEC_ProxyPullConsumer,
+ TAO_ESF_Proxy_List<TAO_CEC_ProxyPullConsumer>,
+ TAO_CEC_PullConsumer_List_Iterator,
+ ACE_SYNCH> ();
+ else if (this->consumer_collection_ == 0x003)
+ return new TAO_ESF_Delayed_Changes<TAO_CEC_ProxyPullConsumer,
+ TAO_ESF_Proxy_List<TAO_CEC_ProxyPullConsumer>,
+ TAO_CEC_PullConsumer_List_Iterator,
+ ACE_SYNCH> ();
+ else if (this->consumer_collection_ == 0x010)
+ return new TAO_ESF_Immediate_Changes<TAO_CEC_ProxyPullConsumer,
+ TAO_ESF_Proxy_RB_Tree<TAO_CEC_ProxyPullConsumer>,
+ TAO_CEC_PullConsumer_RB_Tree_Iterator,
+ TAO_SYNCH_MUTEX> ();
+ else if (this->consumer_collection_ == 0x011)
+ return new TAO_ESF_Copy_On_Read<TAO_CEC_ProxyPullConsumer,
+ TAO_ESF_Proxy_RB_Tree<TAO_CEC_ProxyPullConsumer>,
+ TAO_CEC_PullConsumer_RB_Tree_Iterator,
+ TAO_SYNCH_MUTEX> ();
+ else if (this->consumer_collection_ == 0x012)
+ return new TAO_ESF_Copy_On_Write<TAO_CEC_ProxyPullConsumer,
+ TAO_ESF_Proxy_RB_Tree<TAO_CEC_ProxyPullConsumer>,
+ TAO_CEC_PullConsumer_RB_Tree_Iterator,
+ ACE_SYNCH> ();
+ else if (this->consumer_collection_ == 0x013)
+ return new TAO_ESF_Delayed_Changes<TAO_CEC_ProxyPullConsumer,
+ TAO_ESF_Proxy_RB_Tree<TAO_CEC_ProxyPullConsumer>,
+ TAO_CEC_PullConsumer_RB_Tree_Iterator,
+ ACE_SYNCH> ();
+ else if (this->consumer_collection_ == 0x100)
+ return new TAO_ESF_Immediate_Changes<TAO_CEC_ProxyPullConsumer,
+ TAO_ESF_Proxy_List<TAO_CEC_ProxyPullConsumer>,
+ TAO_CEC_PullConsumer_List_Iterator,
+ ACE_Null_Mutex> ();
+ else if (this->consumer_collection_ == 0x101)
+ return new TAO_ESF_Copy_On_Read<TAO_CEC_ProxyPullConsumer,
+ TAO_ESF_Proxy_List<TAO_CEC_ProxyPullConsumer>,
+ TAO_CEC_PullConsumer_List_Iterator,
+ ACE_Null_Mutex> ();
+ else if (this->consumer_collection_ == 0x102)
+ return new TAO_ESF_Copy_On_Write<TAO_CEC_ProxyPullConsumer,
+ TAO_ESF_Proxy_List<TAO_CEC_ProxyPullConsumer>,
+ TAO_CEC_PullConsumer_List_Iterator,
+ ACE_NULL_SYNCH> ();
+ else if (this->consumer_collection_ == 0x103)
+ return new TAO_ESF_Delayed_Changes<TAO_CEC_ProxyPullConsumer,
+ TAO_ESF_Proxy_List<TAO_CEC_ProxyPullConsumer>,
+ TAO_CEC_PullConsumer_List_Iterator,
+ ACE_NULL_SYNCH> ();
+ else if (this->consumer_collection_ == 0x110)
+ return new TAO_ESF_Immediate_Changes<TAO_CEC_ProxyPullConsumer,
+ TAO_ESF_Proxy_RB_Tree<TAO_CEC_ProxyPullConsumer>,
+ TAO_CEC_PullConsumer_RB_Tree_Iterator,
+ ACE_Null_Mutex> ();
+ else if (this->consumer_collection_ == 0x111)
+ return new TAO_ESF_Copy_On_Read<TAO_CEC_ProxyPullConsumer,
+ TAO_ESF_Proxy_RB_Tree<TAO_CEC_ProxyPullConsumer>,
+ TAO_CEC_PullConsumer_RB_Tree_Iterator,
+ ACE_Null_Mutex> ();
+ else if (this->consumer_collection_ == 0x112)
+ return new TAO_ESF_Copy_On_Write<TAO_CEC_ProxyPullConsumer,
+ TAO_ESF_Proxy_RB_Tree<TAO_CEC_ProxyPullConsumer>,
+ TAO_CEC_PullConsumer_RB_Tree_Iterator,
+ ACE_NULL_SYNCH> ();
+ else if (this->consumer_collection_ == 0x113)
+ return new TAO_ESF_Delayed_Changes<TAO_CEC_ProxyPullConsumer,
+ TAO_ESF_Proxy_RB_Tree<TAO_CEC_ProxyPullConsumer>,
+ TAO_CEC_PullConsumer_RB_Tree_Iterator,
+ ACE_NULL_SYNCH> ();
+
+ return 0;
+}
+
+void
+TAO_CEC_Default_Factory::destroy_proxy_pull_consumer_collection (TAO_CEC_ProxyPullConsumer_Collection *x)
+{
+ delete x;
+}
+
+TAO_CEC_ProxyPushSupplier_Collection*
+TAO_CEC_Default_Factory::create_proxy_push_supplier_collection (TAO_CEC_EventChannel *)
+{
+ if (this->supplier_collection_ == 0x000)
+ return new TAO_ESF_Immediate_Changes<TAO_CEC_ProxyPushSupplier,
+ TAO_ESF_Proxy_List<TAO_CEC_ProxyPushSupplier>,
+ TAO_CEC_PushSupplier_List_Iterator,
+ TAO_SYNCH_MUTEX> ();
+ else if (this->supplier_collection_ == 0x001)
+ return new TAO_ESF_Copy_On_Read<TAO_CEC_ProxyPushSupplier,
+ TAO_ESF_Proxy_List<TAO_CEC_ProxyPushSupplier>,
+ TAO_CEC_PushSupplier_List_Iterator,
+ TAO_SYNCH_MUTEX> ();
+ else if (this->supplier_collection_ == 0x002)
+ return new TAO_ESF_Copy_On_Write<TAO_CEC_ProxyPushSupplier,
+ TAO_ESF_Proxy_List<TAO_CEC_ProxyPushSupplier>,
+ TAO_CEC_PushSupplier_List_Iterator,
+ ACE_SYNCH> ();
+ else if (this->supplier_collection_ == 0x003)
+ return new TAO_ESF_Delayed_Changes<TAO_CEC_ProxyPushSupplier,
+ TAO_ESF_Proxy_List<TAO_CEC_ProxyPushSupplier>,
+ TAO_CEC_PushSupplier_List_Iterator,
+ ACE_SYNCH> ();
+ else if (this->supplier_collection_ == 0x010)
+ return new TAO_ESF_Immediate_Changes<TAO_CEC_ProxyPushSupplier,
+ TAO_ESF_Proxy_RB_Tree<TAO_CEC_ProxyPushSupplier>,
+ TAO_CEC_PushSupplier_RB_Tree_Iterator,
+ TAO_SYNCH_MUTEX> ();
+ else if (this->supplier_collection_ == 0x011)
+ return new TAO_ESF_Copy_On_Read<TAO_CEC_ProxyPushSupplier,
+ TAO_ESF_Proxy_RB_Tree<TAO_CEC_ProxyPushSupplier>,
+ TAO_CEC_PushSupplier_RB_Tree_Iterator,
+ TAO_SYNCH_MUTEX> ();
+ else if (this->supplier_collection_ == 0x012)
+ return new TAO_ESF_Copy_On_Write<TAO_CEC_ProxyPushSupplier,
+ TAO_ESF_Proxy_RB_Tree<TAO_CEC_ProxyPushSupplier>,
+ TAO_CEC_PushSupplier_RB_Tree_Iterator,
+ ACE_SYNCH> ();
+ else if (this->supplier_collection_ == 0x013)
+ return new TAO_ESF_Delayed_Changes<TAO_CEC_ProxyPushSupplier,
+ TAO_ESF_Proxy_RB_Tree<TAO_CEC_ProxyPushSupplier>,
+ TAO_CEC_PushSupplier_RB_Tree_Iterator,
+ ACE_SYNCH> ();
+ else if (this->supplier_collection_ == 0x100)
+ return new TAO_ESF_Immediate_Changes<TAO_CEC_ProxyPushSupplier,
+ TAO_ESF_Proxy_List<TAO_CEC_ProxyPushSupplier>,
+ TAO_CEC_PushSupplier_List_Iterator,
+ ACE_Null_Mutex> ();
+ else if (this->supplier_collection_ == 0x101)
+ return new TAO_ESF_Copy_On_Read<TAO_CEC_ProxyPushSupplier,
+ TAO_ESF_Proxy_List<TAO_CEC_ProxyPushSupplier>,
+ TAO_CEC_PushSupplier_List_Iterator,
+ ACE_Null_Mutex> ();
+ else if (this->supplier_collection_ == 0x102)
+ return new TAO_ESF_Copy_On_Write<TAO_CEC_ProxyPushSupplier,
+ TAO_ESF_Proxy_List<TAO_CEC_ProxyPushSupplier>,
+ TAO_CEC_PushSupplier_List_Iterator,
+ ACE_NULL_SYNCH> ();
+ else if (this->supplier_collection_ == 0x103)
+ return new TAO_ESF_Delayed_Changes<TAO_CEC_ProxyPushSupplier,
+ TAO_ESF_Proxy_List<TAO_CEC_ProxyPushSupplier>,
+ TAO_CEC_PushSupplier_List_Iterator,
+ ACE_NULL_SYNCH> ();
+ else if (this->supplier_collection_ == 0x110)
+ return new TAO_ESF_Immediate_Changes<TAO_CEC_ProxyPushSupplier,
+ TAO_ESF_Proxy_RB_Tree<TAO_CEC_ProxyPushSupplier>,
+ TAO_CEC_PushSupplier_RB_Tree_Iterator,
+ ACE_Null_Mutex> ();
+ else if (this->supplier_collection_ == 0x111)
+ return new TAO_ESF_Copy_On_Read<TAO_CEC_ProxyPushSupplier,
+ TAO_ESF_Proxy_RB_Tree<TAO_CEC_ProxyPushSupplier>,
+ TAO_CEC_PushSupplier_RB_Tree_Iterator,
+ ACE_Null_Mutex> ();
+ else if (this->supplier_collection_ == 0x112)
+ return new TAO_ESF_Copy_On_Write<TAO_CEC_ProxyPushSupplier,
+ TAO_ESF_Proxy_RB_Tree<TAO_CEC_ProxyPushSupplier>,
+ TAO_CEC_PushSupplier_RB_Tree_Iterator,
+ ACE_NULL_SYNCH> ();
+ else if (this->supplier_collection_ == 0x113)
+ return new TAO_ESF_Delayed_Changes<TAO_CEC_ProxyPushSupplier,
+ TAO_ESF_Proxy_RB_Tree<TAO_CEC_ProxyPushSupplier>,
+ TAO_CEC_PushSupplier_RB_Tree_Iterator,
+ ACE_NULL_SYNCH> ();
+
+ return 0;
+}
+
+#if defined (TAO_HAS_TYPED_EVENT_CHANNEL)
+TAO_CEC_ProxyPushSupplier_Collection*
+TAO_CEC_Default_Factory::create_proxy_push_supplier_collection (TAO_CEC_TypedEventChannel *)
+{
+ if (this->supplier_collection_ == 0x000)
+ return new TAO_ESF_Immediate_Changes<TAO_CEC_ProxyPushSupplier,
+ TAO_ESF_Proxy_List<TAO_CEC_ProxyPushSupplier>,
+ TAO_CEC_PushSupplier_List_Iterator,
+ TAO_SYNCH_MUTEX> ();
+ else if (this->supplier_collection_ == 0x001)
+ return new TAO_ESF_Copy_On_Read<TAO_CEC_ProxyPushSupplier,
+ TAO_ESF_Proxy_List<TAO_CEC_ProxyPushSupplier>,
+ TAO_CEC_PushSupplier_List_Iterator,
+ TAO_SYNCH_MUTEX> ();
+ else if (this->supplier_collection_ == 0x002)
+ return new TAO_ESF_Copy_On_Write<TAO_CEC_ProxyPushSupplier,
+ TAO_ESF_Proxy_List<TAO_CEC_ProxyPushSupplier>,
+ TAO_CEC_PushSupplier_List_Iterator,
+ ACE_SYNCH> ();
+ else if (this->supplier_collection_ == 0x003)
+ return new TAO_ESF_Delayed_Changes<TAO_CEC_ProxyPushSupplier,
+ TAO_ESF_Proxy_List<TAO_CEC_ProxyPushSupplier>,
+ TAO_CEC_PushSupplier_List_Iterator,
+ ACE_SYNCH> ();
+ else if (this->supplier_collection_ == 0x010)
+ return new TAO_ESF_Immediate_Changes<TAO_CEC_ProxyPushSupplier,
+ TAO_ESF_Proxy_RB_Tree<TAO_CEC_ProxyPushSupplier>,
+ TAO_CEC_PushSupplier_RB_Tree_Iterator,
+ TAO_SYNCH_MUTEX> ();
+ else if (this->supplier_collection_ == 0x011)
+ return new TAO_ESF_Copy_On_Read<TAO_CEC_ProxyPushSupplier,
+ TAO_ESF_Proxy_RB_Tree<TAO_CEC_ProxyPushSupplier>,
+ TAO_CEC_PushSupplier_RB_Tree_Iterator,
+ TAO_SYNCH_MUTEX> ();
+ else if (this->supplier_collection_ == 0x012)
+ return new TAO_ESF_Copy_On_Write<TAO_CEC_ProxyPushSupplier,
+ TAO_ESF_Proxy_RB_Tree<TAO_CEC_ProxyPushSupplier>,
+ TAO_CEC_PushSupplier_RB_Tree_Iterator,
+ ACE_SYNCH> ();
+ else if (this->supplier_collection_ == 0x013)
+ return new TAO_ESF_Delayed_Changes<TAO_CEC_ProxyPushSupplier,
+ TAO_ESF_Proxy_RB_Tree<TAO_CEC_ProxyPushSupplier>,
+ TAO_CEC_PushSupplier_RB_Tree_Iterator,
+ ACE_SYNCH> ();
+ else if (this->supplier_collection_ == 0x100)
+ return new TAO_ESF_Immediate_Changes<TAO_CEC_ProxyPushSupplier,
+ TAO_ESF_Proxy_List<TAO_CEC_ProxyPushSupplier>,
+ TAO_CEC_PushSupplier_List_Iterator,
+ ACE_Null_Mutex> ();
+ else if (this->supplier_collection_ == 0x101)
+ return new TAO_ESF_Copy_On_Read<TAO_CEC_ProxyPushSupplier,
+ TAO_ESF_Proxy_List<TAO_CEC_ProxyPushSupplier>,
+ TAO_CEC_PushSupplier_List_Iterator,
+ ACE_Null_Mutex> ();
+ else if (this->supplier_collection_ == 0x102)
+ return new TAO_ESF_Copy_On_Write<TAO_CEC_ProxyPushSupplier,
+ TAO_ESF_Proxy_List<TAO_CEC_ProxyPushSupplier>,
+ TAO_CEC_PushSupplier_List_Iterator,
+ ACE_NULL_SYNCH> ();
+ else if (this->supplier_collection_ == 0x103)
+ return new TAO_ESF_Delayed_Changes<TAO_CEC_ProxyPushSupplier,
+ TAO_ESF_Proxy_List<TAO_CEC_ProxyPushSupplier>,
+ TAO_CEC_PushSupplier_List_Iterator,
+ ACE_NULL_SYNCH> ();
+ else if (this->supplier_collection_ == 0x110)
+ return new TAO_ESF_Immediate_Changes<TAO_CEC_ProxyPushSupplier,
+ TAO_ESF_Proxy_RB_Tree<TAO_CEC_ProxyPushSupplier>,
+ TAO_CEC_PushSupplier_RB_Tree_Iterator,
+ ACE_Null_Mutex> ();
+ else if (this->supplier_collection_ == 0x111)
+ return new TAO_ESF_Copy_On_Read<TAO_CEC_ProxyPushSupplier,
+ TAO_ESF_Proxy_RB_Tree<TAO_CEC_ProxyPushSupplier>,
+ TAO_CEC_PushSupplier_RB_Tree_Iterator,
+ ACE_Null_Mutex> ();
+ else if (this->supplier_collection_ == 0x112)
+ return new TAO_ESF_Copy_On_Write<TAO_CEC_ProxyPushSupplier,
+ TAO_ESF_Proxy_RB_Tree<TAO_CEC_ProxyPushSupplier>,
+ TAO_CEC_PushSupplier_RB_Tree_Iterator,
+ ACE_NULL_SYNCH> ();
+ else if (this->supplier_collection_ == 0x113)
+ return new TAO_ESF_Delayed_Changes<TAO_CEC_ProxyPushSupplier,
+ TAO_ESF_Proxy_RB_Tree<TAO_CEC_ProxyPushSupplier>,
+ TAO_CEC_PushSupplier_RB_Tree_Iterator,
+ ACE_NULL_SYNCH> ();
+
+ return 0;
+}
+#endif /* TAO_HAS_TYPED_EVENT_CHANNEL */
+
+void
+TAO_CEC_Default_Factory::destroy_proxy_push_supplier_collection (TAO_CEC_ProxyPushSupplier_Collection *x)
+{
+ delete x;
+}
+
+TAO_CEC_ProxyPullSupplier_Collection*
+TAO_CEC_Default_Factory::create_proxy_pull_supplier_collection (TAO_CEC_EventChannel *)
+{
+ if (this->supplier_collection_ == 0x000)
+ return new TAO_ESF_Immediate_Changes<TAO_CEC_ProxyPullSupplier,
+ TAO_ESF_Proxy_List<TAO_CEC_ProxyPullSupplier>,
+ TAO_CEC_PullSupplier_List_Iterator,
+ TAO_SYNCH_MUTEX> ();
+ else if (this->supplier_collection_ == 0x001)
+ return new TAO_ESF_Copy_On_Read<TAO_CEC_ProxyPullSupplier,
+ TAO_ESF_Proxy_List<TAO_CEC_ProxyPullSupplier>,
+ TAO_CEC_PullSupplier_List_Iterator,
+ TAO_SYNCH_MUTEX> ();
+ else if (this->supplier_collection_ == 0x002)
+ return new TAO_ESF_Copy_On_Write<TAO_CEC_ProxyPullSupplier,
+ TAO_ESF_Proxy_List<TAO_CEC_ProxyPullSupplier>,
+ TAO_CEC_PullSupplier_List_Iterator,
+ ACE_SYNCH> ();
+ else if (this->supplier_collection_ == 0x003)
+ return new TAO_ESF_Delayed_Changes<TAO_CEC_ProxyPullSupplier,
+ TAO_ESF_Proxy_List<TAO_CEC_ProxyPullSupplier>,
+ TAO_CEC_PullSupplier_List_Iterator,
+ ACE_SYNCH> ();
+ else if (this->supplier_collection_ == 0x010)
+ return new TAO_ESF_Immediate_Changes<TAO_CEC_ProxyPullSupplier,
+ TAO_ESF_Proxy_RB_Tree<TAO_CEC_ProxyPullSupplier>,
+ TAO_CEC_PullSupplier_RB_Tree_Iterator,
+ TAO_SYNCH_MUTEX> ();
+ else if (this->supplier_collection_ == 0x011)
+ return new TAO_ESF_Copy_On_Read<TAO_CEC_ProxyPullSupplier,
+ TAO_ESF_Proxy_RB_Tree<TAO_CEC_ProxyPullSupplier>,
+ TAO_CEC_PullSupplier_RB_Tree_Iterator,
+ TAO_SYNCH_MUTEX> ();
+ else if (this->supplier_collection_ == 0x012)
+ return new TAO_ESF_Copy_On_Write<TAO_CEC_ProxyPullSupplier,
+ TAO_ESF_Proxy_RB_Tree<TAO_CEC_ProxyPullSupplier>,
+ TAO_CEC_PullSupplier_RB_Tree_Iterator,
+ ACE_SYNCH> ();
+ else if (this->supplier_collection_ == 0x013)
+ return new TAO_ESF_Delayed_Changes<TAO_CEC_ProxyPullSupplier,
+ TAO_ESF_Proxy_RB_Tree<TAO_CEC_ProxyPullSupplier>,
+ TAO_CEC_PullSupplier_RB_Tree_Iterator,
+ ACE_SYNCH> ();
+ else if (this->supplier_collection_ == 0x100)
+ return new TAO_ESF_Immediate_Changes<TAO_CEC_ProxyPullSupplier,
+ TAO_ESF_Proxy_List<TAO_CEC_ProxyPullSupplier>,
+ TAO_CEC_PullSupplier_List_Iterator,
+ ACE_Null_Mutex> ();
+ else if (this->supplier_collection_ == 0x101)
+ return new TAO_ESF_Copy_On_Read<TAO_CEC_ProxyPullSupplier,
+ TAO_ESF_Proxy_List<TAO_CEC_ProxyPullSupplier>,
+ TAO_CEC_PullSupplier_List_Iterator,
+ ACE_Null_Mutex> ();
+ else if (this->supplier_collection_ == 0x102)
+ return new TAO_ESF_Copy_On_Write<TAO_CEC_ProxyPullSupplier,
+ TAO_ESF_Proxy_List<TAO_CEC_ProxyPullSupplier>,
+ TAO_CEC_PullSupplier_List_Iterator,
+ ACE_NULL_SYNCH> ();
+ else if (this->supplier_collection_ == 0x103)
+ return new TAO_ESF_Delayed_Changes<TAO_CEC_ProxyPullSupplier,
+ TAO_ESF_Proxy_List<TAO_CEC_ProxyPullSupplier>,
+ TAO_CEC_PullSupplier_List_Iterator,
+ ACE_NULL_SYNCH> ();
+ else if (this->supplier_collection_ == 0x110)
+ return new TAO_ESF_Immediate_Changes<TAO_CEC_ProxyPullSupplier,
+ TAO_ESF_Proxy_RB_Tree<TAO_CEC_ProxyPullSupplier>,
+ TAO_CEC_PullSupplier_RB_Tree_Iterator,
+ ACE_Null_Mutex> ();
+ else if (this->supplier_collection_ == 0x111)
+ return new TAO_ESF_Copy_On_Read<TAO_CEC_ProxyPullSupplier,
+ TAO_ESF_Proxy_RB_Tree<TAO_CEC_ProxyPullSupplier>,
+ TAO_CEC_PullSupplier_RB_Tree_Iterator,
+ ACE_Null_Mutex> ();
+ else if (this->supplier_collection_ == 0x112)
+ return new TAO_ESF_Copy_On_Write<TAO_CEC_ProxyPullSupplier,
+ TAO_ESF_Proxy_RB_Tree<TAO_CEC_ProxyPullSupplier>,
+ TAO_CEC_PullSupplier_RB_Tree_Iterator,
+ ACE_NULL_SYNCH> ();
+ else if (this->supplier_collection_ == 0x113)
+ return new TAO_ESF_Delayed_Changes<TAO_CEC_ProxyPullSupplier,
+ TAO_ESF_Proxy_RB_Tree<TAO_CEC_ProxyPullSupplier>,
+ TAO_CEC_PullSupplier_RB_Tree_Iterator,
+ ACE_NULL_SYNCH> ();
+
+ return 0;
+}
+
+void
+TAO_CEC_Default_Factory::destroy_proxy_pull_supplier_collection (TAO_CEC_ProxyPullSupplier_Collection *x)
+{
+ delete x;
+}
+
+ACE_Lock*
+TAO_CEC_Default_Factory::create_consumer_lock (void)
+{
+ if (this->consumer_lock_ == 0)
+ return new ACE_Lock_Adapter<ACE_Null_Mutex>;
+ else if (this->consumer_lock_ == 1)
+ return new ACE_Lock_Adapter<TAO_SYNCH_MUTEX> ();
+ else if (this->consumer_lock_ == 2)
+ return new ACE_Lock_Adapter<TAO_SYNCH_RECURSIVE_MUTEX> ();
+ return 0;
+}
+
+void
+TAO_CEC_Default_Factory::destroy_consumer_lock (ACE_Lock* x)
+{
+ delete x;
+}
+
+ACE_Lock*
+TAO_CEC_Default_Factory::create_supplier_lock (void)
+{
+ if (this->supplier_lock_ == 0)
+ return new ACE_Lock_Adapter<ACE_Null_Mutex>;
+ else if (this->supplier_lock_ == 1)
+ return new ACE_Lock_Adapter<TAO_SYNCH_MUTEX> ();
+ else if (this->supplier_lock_ == 2)
+ return new ACE_Lock_Adapter<TAO_SYNCH_RECURSIVE_MUTEX> ();
+ return 0;
+}
+
+void
+TAO_CEC_Default_Factory::destroy_supplier_lock (ACE_Lock* x)
+{
+ delete x;
+}
+
+TAO_CEC_ConsumerControl*
+TAO_CEC_Default_Factory::create_consumer_control (TAO_CEC_EventChannel* ec)
+{
+ if (this->consumer_control_ == 0)
+ return new TAO_CEC_ConsumerControl ();
+ else if (this->consumer_control_ == 1)
+ {
+ int argc = 0;
+ char **argv = 0;
+ CORBA::ORB_var orb =
+ CORBA::ORB_init (argc, argv, this->orbid_);
+
+ ACE_Time_Value rate (0, this->consumer_control_period_);
+ return new TAO_CEC_Reactive_ConsumerControl (
+ rate, this->consumer_control_timeout_,
+ this->proxy_disconnect_retries_,
+ ec, orb.in ());
+ }
+ return 0;
+}
+
+#if defined (TAO_HAS_TYPED_EVENT_CHANNEL)
+TAO_CEC_ConsumerControl*
+TAO_CEC_Default_Factory::create_consumer_control (TAO_CEC_TypedEventChannel* ec)
+{
+ if (this->consumer_control_ == 0)
+ return new TAO_CEC_ConsumerControl ();
+ else if (this->consumer_control_ == 1)
+ {
+ int argc = 0;
+ char **argv = 0;
+ CORBA::ORB_var orb =
+ CORBA::ORB_init (argc, argv, this->orbid_);
+
+ ACE_Time_Value rate (0, this->consumer_control_period_);
+ return new TAO_CEC_Reactive_ConsumerControl (
+ rate, this->consumer_control_timeout_,
+ this->proxy_disconnect_retries_,
+ ec, orb.in ());
+ }
+ return 0;
+}
+#endif /* TAO_HAS_TYPED_EVENT_CHANNEL */
+
+void
+TAO_CEC_Default_Factory::destroy_consumer_control (TAO_CEC_ConsumerControl* x)
+{
+ delete x;
+}
+
+TAO_CEC_SupplierControl*
+TAO_CEC_Default_Factory::create_supplier_control (TAO_CEC_EventChannel* ec)
+{
+ if (this->supplier_control_ == 0)
+ return new TAO_CEC_SupplierControl ();
+ else if (this->supplier_control_ == 1)
+ {
+ int argc = 0;
+ char **argv = 0;
+ CORBA::ORB_var orb =
+ CORBA::ORB_init (argc, argv, this->orbid_);
+
+ ACE_Time_Value rate (0, this->supplier_control_period_);
+ return new TAO_CEC_Reactive_SupplierControl (
+ rate, this->supplier_control_timeout_,
+ this->proxy_disconnect_retries_,
+ ec, orb.in ());
+ }
+ return 0;
+}
+
+#if defined (TAO_HAS_TYPED_EVENT_CHANNEL)
+TAO_CEC_SupplierControl*
+TAO_CEC_Default_Factory::create_supplier_control (TAO_CEC_TypedEventChannel* ec)
+{
+ if (this->supplier_control_ == 0)
+ return new TAO_CEC_SupplierControl ();
+ else if (this->supplier_control_ == 1)
+ {
+ int argc = 0;
+ char **argv = 0;
+ CORBA::ORB_var orb =
+ CORBA::ORB_init (argc, argv, this->orbid_);
+
+ ACE_Time_Value rate (0, this->supplier_control_period_);
+ return new TAO_CEC_Reactive_SupplierControl (
+ rate, this->supplier_control_timeout_,
+ this->proxy_disconnect_retries_,
+ ec, orb.in ());
+ }
+ return 0;
+}
+#endif /* TAO_HAS_TYPED_EVENT_CHANNEL */
+
+void
+TAO_CEC_Default_Factory::destroy_supplier_control (TAO_CEC_SupplierControl* x)
+{
+ delete x;
+}
+
+CORBA::Policy_ptr TAO_CEC_Default_Factory::create_roundtrip_timeout_policy
+(const ACE_Time_Value &timeout)
+{
+ //get the existing orb
+ int fake_argc = 0;
+ CORBA::ORB_var orb = CORBA::ORB_init (fake_argc, 0, this->orbid_);
+
+ CORBA::Any value;
+ TimeBase::TimeT timet;
+ ORBSVCS_Time::Time_Value_to_TimeT (timet, timeout);
+ value <<= timet;
+ return orb->create_policy (Messaging::RELATIVE_RT_TIMEOUT_POLICY_TYPE,
+ value);
+}
+
+TAO_END_VERSIONED_NAMESPACE_DECL
+
+// ****************************************************************
+
+ACE_STATIC_SVC_DEFINE (TAO_CEC_Default_Factory,
+ ACE_TEXT ("CEC_Factory"),
+ ACE_SVC_OBJ_T,
+ &ACE_SVC_NAME (TAO_CEC_Default_Factory),
+ ACE_Service_Type::DELETE_THIS | ACE_Service_Type::DELETE_OBJ,
+ 0)
+ACE_FACTORY_DEFINE (TAO_Event_Serv, TAO_CEC_Default_Factory)
diff --git a/TAO/orbsvcs/orbsvcs/CosEvent/CEC_Default_Factory.h b/TAO/orbsvcs/orbsvcs/CosEvent/CEC_Default_Factory.h
new file mode 100644
index 00000000000..8f072c7bd62
--- /dev/null
+++ b/TAO/orbsvcs/orbsvcs/CosEvent/CEC_Default_Factory.h
@@ -0,0 +1,231 @@
+// -*- C++ -*-
+
+//=============================================================================
+/**
+ * @file CEC_Default_Factory.h
+ *
+ * $Id$
+ *
+ * @author Carlos O'Ryan (coryan@cs.wustl.edu)
+ */
+//=============================================================================
+
+
+#ifndef TAO_CEC_DEFAULT_FACTORY_H
+#define TAO_CEC_DEFAULT_FACTORY_H
+
+#include /**/ "ace/pre.h"
+
+#include "orbsvcs/CosEvent/CEC_Factory.h"
+
+#if !defined (ACE_LACKS_PRAGMA_ONCE)
+# pragma once
+#endif /* ACE_LACKS_PRAGMA_ONCE */
+
+#include "orbsvcs/CosEvent/CEC_Defaults.h"
+
+#include "ace/Service_Config.h"
+#include "ace/Time_Value.h"
+
+TAO_BEGIN_VERSIONED_NAMESPACE_DECL
+
+/**
+ * @class TAO_CEC_Default_Factory
+ *
+ * @brief A generic factory for EC experimentation.
+ *
+ * This class allows the user to experiment with different EC
+ * configurations. Using a command-line like interface the user
+ * can specify which strategies will this factory generate.
+ * Since the class can be dynamically loaded the strategies can be
+ * set in the service configurator file.
+ * = MEMORY MANAGMENT
+ */
+class TAO_Event_Serv_Export TAO_CEC_Default_Factory : public TAO_CEC_Factory
+{
+public:
+ /// Constructor
+ TAO_CEC_Default_Factory (void);
+
+ /// destructor...
+ virtual ~TAO_CEC_Default_Factory (void);
+
+ /// Helper function to register the default factory into the service
+ /// configurator.
+ static int init_svcs (void);
+
+ // = The Service_Object entry points
+ virtual int init (int argc, ACE_TCHAR* argv[]);
+ virtual int fini (void);
+
+ // = The CEC_Factory methods
+ virtual TAO_CEC_Dispatching*
+ create_dispatching (TAO_CEC_EventChannel*);
+ virtual void
+ destroy_dispatching (TAO_CEC_Dispatching*);
+ virtual TAO_CEC_Pulling_Strategy*
+ create_pulling_strategy (TAO_CEC_EventChannel*);
+ virtual void
+ destroy_pulling_strategy (TAO_CEC_Pulling_Strategy*);
+ virtual TAO_CEC_ConsumerAdmin*
+ create_consumer_admin (TAO_CEC_EventChannel*);
+ virtual void
+ destroy_consumer_admin (TAO_CEC_ConsumerAdmin*);
+ virtual TAO_CEC_SupplierAdmin*
+ create_supplier_admin (TAO_CEC_EventChannel*);
+ virtual void
+ destroy_supplier_admin (TAO_CEC_SupplierAdmin*);
+ virtual TAO_CEC_ProxyPushSupplier*
+ create_proxy_push_supplier (TAO_CEC_EventChannel*);
+ virtual void
+ destroy_proxy_push_supplier (TAO_CEC_ProxyPushSupplier*);
+ virtual TAO_CEC_ProxyPullSupplier*
+ create_proxy_pull_supplier (TAO_CEC_EventChannel*);
+ virtual void
+ destroy_proxy_pull_supplier (TAO_CEC_ProxyPullSupplier*);
+ virtual TAO_CEC_ProxyPushConsumer*
+ create_proxy_push_consumer (TAO_CEC_EventChannel*);
+ virtual void
+ destroy_proxy_push_consumer (TAO_CEC_ProxyPushConsumer*);
+ virtual TAO_CEC_ProxyPullConsumer*
+ create_proxy_pull_consumer (TAO_CEC_EventChannel*);
+ virtual void
+ destroy_proxy_pull_consumer (TAO_CEC_ProxyPullConsumer*);
+ virtual TAO_CEC_ProxyPushConsumer_Collection*
+ create_proxy_push_consumer_collection (TAO_CEC_EventChannel*);
+ virtual void
+ destroy_proxy_push_consumer_collection (
+ TAO_CEC_ProxyPushConsumer_Collection*
+ );
+ virtual TAO_CEC_ProxyPullConsumer_Collection*
+ create_proxy_pull_consumer_collection (TAO_CEC_EventChannel*);
+ virtual void
+ destroy_proxy_pull_consumer_collection (
+ TAO_CEC_ProxyPullConsumer_Collection*
+ );
+ virtual TAO_CEC_ProxyPushSupplier_Collection*
+ create_proxy_push_supplier_collection (TAO_CEC_EventChannel*);
+ virtual void
+ destroy_proxy_push_supplier_collection (
+ TAO_CEC_ProxyPushSupplier_Collection*
+ );
+ virtual TAO_CEC_ProxyPullSupplier_Collection*
+ create_proxy_pull_supplier_collection (TAO_CEC_EventChannel*);
+ virtual void
+ destroy_proxy_pull_supplier_collection (
+ TAO_CEC_ProxyPullSupplier_Collection*
+ );
+
+ virtual ACE_Lock* create_consumer_lock (void);
+ virtual void destroy_consumer_lock (ACE_Lock*);
+ virtual ACE_Lock* create_supplier_lock (void);
+ virtual void destroy_supplier_lock (ACE_Lock*);
+
+ virtual TAO_CEC_ConsumerControl*
+ create_consumer_control (TAO_CEC_EventChannel*);
+ virtual void
+ destroy_consumer_control (TAO_CEC_ConsumerControl*);
+ virtual TAO_CEC_SupplierControl*
+ create_supplier_control (TAO_CEC_EventChannel*);
+ virtual void
+ destroy_supplier_control (TAO_CEC_SupplierControl*);
+
+#if defined (TAO_HAS_TYPED_EVENT_CHANNEL)
+ virtual TAO_CEC_Dispatching*
+ create_dispatching (TAO_CEC_TypedEventChannel*);
+ virtual TAO_CEC_TypedConsumerAdmin*
+ create_consumer_admin (TAO_CEC_TypedEventChannel*);
+ virtual void
+ destroy_consumer_admin (TAO_CEC_TypedConsumerAdmin*);
+ virtual TAO_CEC_TypedSupplierAdmin*
+ create_supplier_admin (TAO_CEC_TypedEventChannel*);
+ virtual void
+ destroy_supplier_admin (TAO_CEC_TypedSupplierAdmin*);
+ virtual TAO_CEC_ProxyPushSupplier*
+ create_proxy_push_supplier (TAO_CEC_TypedEventChannel*);
+ virtual TAO_CEC_ProxyPushSupplier_Collection*
+ create_proxy_push_supplier_collection (TAO_CEC_TypedEventChannel*);
+ virtual TAO_CEC_TypedProxyPushConsumer*
+ create_proxy_push_consumer (TAO_CEC_TypedEventChannel*);
+ virtual void
+ destroy_proxy_push_consumer (TAO_CEC_TypedProxyPushConsumer*);
+ virtual TAO_CEC_TypedProxyPushConsumer_Collection*
+ create_proxy_push_consumer_collection (TAO_CEC_TypedEventChannel*);
+ virtual void
+ destroy_proxy_push_consumer_collection (
+ TAO_CEC_TypedProxyPushConsumer_Collection*
+ );
+ virtual TAO_CEC_ConsumerControl*
+ create_consumer_control (TAO_CEC_TypedEventChannel*);
+ virtual TAO_CEC_SupplierControl*
+ create_supplier_control (TAO_CEC_TypedEventChannel*);
+#endif /* TAO_HAS_TYPED_EVENT_CHANNEL */
+
+ virtual CORBA::Policy_ptr
+ create_roundtrip_timeout_policy (const ACE_Time_Value &timeout);
+
+private:
+ /// Parse an argument to set the type of collections used.
+ int parse_collection_arg (ACE_TCHAR* opt);
+
+private:
+ /// Several flags to control the kind of object created.
+ int dispatching_;
+ int pulling_strategy_;
+ int consumer_collection_;
+ int supplier_collection_;
+ int consumer_lock_;
+ int supplier_lock_;
+
+ /// The MT dispatching priority has several arguments that could be
+ /// controlled here...
+ int dispatching_threads_;
+ int dispatching_threads_flags_;
+ int dispatching_threads_priority_;
+ int dispatching_threads_force_active_;
+
+ /// How often (in microseconds) are the pull suppliers polled by the
+ /// reactive pulling strategy.
+ int reactive_pulling_period_;
+
+ /// Use this ORB to locate global resources.
+ char *orbid_;
+
+ /// Indicate ORB ID has been duplicated (memory allocated).
+ int orbid_dupped_;
+
+ /// The consumer and supplier control policies.
+ int consumer_control_;
+ int supplier_control_;
+
+ /// The consumer and supplier control periods in usecs
+ int consumer_control_period_;
+ int supplier_control_period_;
+
+ /// The consumer and supplier control timeout in usecs
+ ACE_Time_Value consumer_control_timeout_;
+ ACE_Time_Value supplier_control_timeout_;
+
+ /// The consumer and supplier operation timeouts.
+ /// Only in effect if the corresponding "reactive control" is enabled.
+ /// Applies the given timeout as the round-trip time policy on the
+ /// object reference.
+ ACE_Time_Value consumer_timeout_;
+ ACE_Time_Value supplier_timeout_;
+
+ /// The number of retries before disconnecting a proxy
+ unsigned int proxy_disconnect_retries_;
+};
+
+TAO_END_VERSIONED_NAMESPACE_DECL
+
+#if defined (__ACE_INLINE__)
+#include "orbsvcs/CosEvent/CEC_Default_Factory.i"
+#endif /* __ACE_INLINE__ */
+
+ACE_STATIC_SVC_DECLARE (TAO_CEC_Default_Factory)
+ACE_FACTORY_DECLARE (TAO_Event_Serv, TAO_CEC_Default_Factory)
+
+#include /**/ "ace/post.h"
+
+#endif /* TAO_CEC_DEFAULT_FACTORY_H */
diff --git a/TAO/orbsvcs/orbsvcs/CosEvent/CEC_Default_Factory.i b/TAO/orbsvcs/orbsvcs/CosEvent/CEC_Default_Factory.i
new file mode 100644
index 00000000000..0dd3d37f8cb
--- /dev/null
+++ b/TAO/orbsvcs/orbsvcs/CosEvent/CEC_Default_Factory.i
@@ -0,0 +1,32 @@
+// -*- C++ -*-
+//
+// $Id$
+
+TAO_BEGIN_VERSIONED_NAMESPACE_DECL
+
+ACE_INLINE
+TAO_CEC_Default_Factory::TAO_CEC_Default_Factory (void)
+ : dispatching_ (TAO_CEC_DEFAULT_DISPATCHING),
+ pulling_strategy_ (TAO_CEC_DEFAULT_PULLING_STRATEGY),
+ consumer_collection_ (TAO_CEC_DEFAULT_CONSUMER_COLLECTION),
+ supplier_collection_ (TAO_CEC_DEFAULT_SUPPLIER_COLLECTION),
+ consumer_lock_ (TAO_CEC_DEFAULT_CONSUMER_LOCK),
+ supplier_lock_ (TAO_CEC_DEFAULT_SUPPLIER_LOCK),
+ dispatching_threads_ (TAO_CEC_DEFAULT_DISPATCHING_THREADS),
+ dispatching_threads_flags_ (TAO_CEC_DEFAULT_DISPATCHING_THREADS_FLAGS),
+ dispatching_threads_priority_ (TAO_CEC_DEFAULT_DISPATCHING_THREADS_PRIORITY),
+ dispatching_threads_force_active_ (TAO_CEC_DEFAULT_DISPATCHING_THREADS_FORCE_ACTIVE),
+ reactive_pulling_period_ (TAO_CEC_DEFAULT_REACTIVE_PULLING_PERIOD),
+ orbid_ ((char*)TAO_CEC_DEFAULT_ORB_ID),
+ orbid_dupped_(0),
+ consumer_control_ (TAO_CEC_DEFAULT_CONSUMER_CONTROL),
+ supplier_control_ (TAO_CEC_DEFAULT_SUPPLIER_CONTROL),
+ consumer_control_period_ (TAO_CEC_DEFAULT_CONSUMER_CONTROL_PERIOD),
+ supplier_control_period_ (TAO_CEC_DEFAULT_SUPPLIER_CONTROL_PERIOD),
+ consumer_control_timeout_ (0, TAO_CEC_DEFAULT_CONSUMER_CONTROL_TIMEOUT),
+ supplier_control_timeout_ (0, TAO_CEC_DEFAULT_SUPPLIER_CONTROL_TIMEOUT),
+ proxy_disconnect_retries_ (TAO_CEC_DEFAULT_PROXY_DISCONNECT_RETRIES)
+{
+}
+
+TAO_END_VERSIONED_NAMESPACE_DECL
diff --git a/TAO/orbsvcs/orbsvcs/CosEvent/CEC_Defaults.h b/TAO/orbsvcs/orbsvcs/CosEvent/CEC_Defaults.h
new file mode 100644
index 00000000000..f7fabae1b16
--- /dev/null
+++ b/TAO/orbsvcs/orbsvcs/CosEvent/CEC_Defaults.h
@@ -0,0 +1,127 @@
+// -*- C++ -*-
+
+//=============================================================================
+/**
+ * @file CEC_Defaults.h
+ *
+ * $Id$
+ *
+ * In this file we set the compile time defaults for the event
+ * channel.
+ *
+ * @author Carlos O'Ryan (coryan@cs.wustl.edu)
+ */
+//=============================================================================
+
+
+#ifndef TAO_CEC_DEFAULTS_H
+#define TAO_CEC_DEFAULTS_H
+
+#include /**/ "ace/pre.h"
+
+#ifndef TAO_CEC_ENABLE_DEBUG_MESSAGES
+#define TAO_CEC_ENABLE_DEBUG_MESSAGES 0
+#endif /* TAO_CEC_ENABLE_DEBUG_MESSAGES */
+
+// Any of the definitions below can be overriden in the config.h file
+// or the compilation line.
+
+// Control consumer and supplier reconnections
+#ifndef TAO_CEC_DEFAULT_CONSUMER_RECONNECT
+# define TAO_CEC_DEFAULT_CONSUMER_RECONNECT 0
+#endif /* TAO_CEC_DEFAULT_CONSUMER_RECONNECT */
+
+#ifndef TAO_CEC_DEFAULT_SUPPLIER_RECONNECT
+#define TAO_CEC_DEFAULT_SUPPLIER_RECONNECT 0
+#endif /* TAO_CEC_DEFAULT_SUPPLIER_RECONNECT */
+
+// Control callbacks when proxies are disconnected
+#ifndef TAO_CEC_DEFAULT_DISCONNECT_CALLBACKS
+# define TAO_CEC_DEFAULT_DISCONNECT_CALLBACKS 0
+#endif /* TAO_CEC_DEFAULT_DISCONNECT_CALLBACKS */
+
+// The defaults for the default factory.
+// The TAO_CEC_Default_Factory is a run-time configurable factory for
+// the event channel. Using the service configurator the user can
+// specify what strategies should the factory produce.
+// This macros control the default values for those strategies.
+//
+#ifndef TAO_CEC_DEFAULT_DISPATCHING
+# define TAO_CEC_DEFAULT_DISPATCHING 0 /* reactive */
+#endif /* TAO_CEC_DEFAULT_DISPATCHING */
+
+#ifndef TAO_CEC_DEFAULT_PULLING_STRATEGY
+# define TAO_CEC_DEFAULT_PULLING_STRATEGY 0 /* reactive */
+#endif /* TAO_CEC_DEFAULT_PULLING_STRATEGY */
+
+#ifndef TAO_CEC_DEFAULT_CONSUMER_COLLECTION
+# define TAO_CEC_DEFAULT_CONSUMER_COLLECTION 0x003 /* delayed MT-safe */
+#endif /* TAO_CEC_DEFAULT_CONSUMER_COLLECTION */
+
+#ifndef TAO_CEC_DEFAULT_SUPPLIER_COLLECTION
+# define TAO_CEC_DEFAULT_SUPPLIER_COLLECTION 0x003 /* delayed MT-safe */
+#endif /* TAO_CEC_DEFAULT_SUPPLIER_COLLECTION */
+
+#ifndef TAO_CEC_DEFAULT_CONSUMER_LOCK
+# define TAO_CEC_DEFAULT_CONSUMER_LOCK 1 /* thread */
+#endif /* TAO_CEC_DEFAULT_CONSUMER_LOCK */
+
+#ifndef TAO_CEC_DEFAULT_SUPPLIER_LOCK
+# define TAO_CEC_DEFAULT_SUPPLIER_LOCK 1 /* thread */
+#endif /* TAO_CEC_DEFAULT_SUPPLIER_LOCK */
+
+#ifndef TAO_CEC_DEFAULT_DISPATCHING_THREADS
+# define TAO_CEC_DEFAULT_DISPATCHING_THREADS 1 /* */
+#endif /* TAO_CEC_DEFAULT_DISPATCHING_THREADS */
+
+#ifndef TAO_CEC_DEFAULT_DISPATCHING_THREADS_FLAGS
+# define TAO_CEC_DEFAULT_DISPATCHING_THREADS_FLAGS THR_NEW_LWP|THR_BOUND|THR_SCHED_DEFAULT
+#endif /* TAO_CEC_DEFAULT_DISPATCHING_THREADS */
+
+#ifndef TAO_CEC_DEFAULT_DISPATCHING_THREADS_PRIORITY
+# define TAO_CEC_DEFAULT_DISPATCHING_THREADS_PRIORITY ACE_THR_PRI_OTHER_DEF
+#endif /* TAO_CEC_DEFAULT_DISPATCHING_THREADS_PRIORITY */
+
+#ifndef TAO_CEC_DEFAULT_DISPATCHING_THREADS_FORCE_ACTIVE
+# define TAO_CEC_DEFAULT_DISPATCHING_THREADS_FORCE_ACTIVE 1
+#endif /* TAO_CEC_DEFAULT_DISPATCHING_THREADS_FORCE_ACTIVE */
+
+#ifndef TAO_CEC_DEFAULT_REACTIVE_PULLING_PERIOD
+# define TAO_CEC_DEFAULT_REACTIVE_PULLING_PERIOD 5000000 /* usecs */
+#endif /* TAO_CEC_DEFAULT_REACTIVE_PULLING_PERIOD */
+
+#ifndef TAO_CEC_DEFAULT_ORB_ID
+# define TAO_CEC_DEFAULT_ORB_ID "" /* */
+#endif /* TAO_CEC_DEFAULT_ORB_ID */
+
+#ifndef TAO_CEC_DEFAULT_CONSUMER_CONTROL
+# define TAO_CEC_DEFAULT_CONSUMER_CONTROL 0 /* null */
+#endif /* TAO_CEC_DEFAULT_CONSUMER_CONTROL */
+
+#ifndef TAO_CEC_DEFAULT_SUPPLIER_CONTROL
+# define TAO_CEC_DEFAULT_SUPPLIER_CONTROL 0 /* null */
+#endif /* TAO_CEC_DEFAULT_SUPPLIER_CONTROL */
+
+#ifndef TAO_CEC_DEFAULT_CONSUMER_CONTROL_PERIOD
+# define TAO_CEC_DEFAULT_CONSUMER_CONTROL_PERIOD 5000000 /* usecs */
+#endif /* TAO_CEC_DEFAULT_CONSUMER_CONTROL_PERIOD */
+
+#ifndef TAO_CEC_DEFAULT_SUPPLIER_CONTROL_PERIOD
+# define TAO_CEC_DEFAULT_SUPPLIER_CONTROL_PERIOD 5000000 /* usecs */
+#endif /* TAO_CEC_DEFAULT_SUPPLIER_CONTROL_PERIOD */
+
+#ifndef TAO_CEC_DEFAULT_CONSUMER_CONTROL_TIMEOUT
+# define TAO_CEC_DEFAULT_CONSUMER_CONTROL_TIMEOUT 10000 /* usecs */
+#endif /* TAO_CEC_DEFAULT_CONSUMER_CONTROL_TIMEOUT */
+
+#ifndef TAO_CEC_DEFAULT_SUPPLIER_CONTROL_TIMEOUT
+# define TAO_CEC_DEFAULT_SUPPLIER_CONTROL_TIMEOUT 10000 /* usecs */
+#endif /* TAO_CEC_DEFAULT_SUPPLIER_CONTROL_TIMEOUT */
+
+#ifndef TAO_CEC_DEFAULT_PROXY_DISCONNECT_RETRIES
+# define TAO_CEC_DEFAULT_PROXY_DISCONNECT_RETRIES 0
+#endif /* TAO_CEC_DEFAULT_PROXY_DISCONNECT_RETRIES */
+
+#include /**/ "ace/post.h"
+
+#endif /* TAO_CEC_DEFAULTS_H */
diff --git a/TAO/orbsvcs/orbsvcs/CosEvent/CEC_Dispatching.cpp b/TAO/orbsvcs/orbsvcs/CosEvent/CEC_Dispatching.cpp
new file mode 100644
index 00000000000..14c6d6c21ca
--- /dev/null
+++ b/TAO/orbsvcs/orbsvcs/CosEvent/CEC_Dispatching.cpp
@@ -0,0 +1,64 @@
+// $Id$
+
+#include "orbsvcs/CosEvent/CEC_Dispatching.h"
+#include "orbsvcs/CosEvent/CEC_ProxyPushSupplier.h"
+
+ACE_RCSID(CosEvent, CEC_Dispatching, "$Id$")
+
+TAO_BEGIN_VERSIONED_NAMESPACE_DECL
+
+TAO_CEC_Dispatching::~TAO_CEC_Dispatching (void)
+{
+}
+
+// ****************************************************************
+
+TAO_CEC_Reactive_Dispatching::TAO_CEC_Reactive_Dispatching (void)
+{
+}
+
+void
+TAO_CEC_Reactive_Dispatching::activate (void)
+{
+}
+
+void
+TAO_CEC_Reactive_Dispatching::shutdown (void)
+{
+}
+
+void
+TAO_CEC_Reactive_Dispatching::push (TAO_CEC_ProxyPushSupplier* proxy,
+ const CORBA::Any& event
+ ACE_ENV_ARG_DECL)
+{
+ proxy->reactive_push_to_consumer (event ACE_ENV_ARG_PARAMETER);
+}
+
+void
+TAO_CEC_Reactive_Dispatching::push_nocopy (TAO_CEC_ProxyPushSupplier* proxy,
+ CORBA::Any& event
+ ACE_ENV_ARG_DECL)
+{
+ proxy->reactive_push_to_consumer (event ACE_ENV_ARG_PARAMETER);
+}
+
+#if defined (TAO_HAS_TYPED_EVENT_CHANNEL)
+void
+TAO_CEC_Reactive_Dispatching::invoke (TAO_CEC_ProxyPushSupplier* proxy,
+ const TAO_CEC_TypedEvent& typed_event
+ ACE_ENV_ARG_DECL)
+{
+ proxy->reactive_invoke_to_consumer (typed_event ACE_ENV_ARG_PARAMETER);
+}
+
+void
+TAO_CEC_Reactive_Dispatching::invoke_nocopy (TAO_CEC_ProxyPushSupplier* proxy,
+ TAO_CEC_TypedEvent& typed_event
+ ACE_ENV_ARG_DECL)
+{
+ proxy->reactive_invoke_to_consumer (typed_event ACE_ENV_ARG_PARAMETER);
+}
+#endif /* TAO_HAS_TYPED_EVENT_CHANNEL */
+
+TAO_END_VERSIONED_NAMESPACE_DECL
diff --git a/TAO/orbsvcs/orbsvcs/CosEvent/CEC_Dispatching.h b/TAO/orbsvcs/orbsvcs/CosEvent/CEC_Dispatching.h
new file mode 100644
index 00000000000..48806cdafba
--- /dev/null
+++ b/TAO/orbsvcs/orbsvcs/CosEvent/CEC_Dispatching.h
@@ -0,0 +1,119 @@
+// -*- C++ -*-
+
+//=============================================================================
+/**
+ * @file CEC_Dispatching.h
+ *
+ * $Id$
+ *
+ * @author Carlos O'Ryan (coryan@cs.wustl.edu)
+ */
+//=============================================================================
+
+
+#ifndef TAO_CEC_DISPATCHING_H
+#define TAO_CEC_DISPATCHING_H
+
+#include /**/ "ace/pre.h"
+
+#include "orbsvcs/CosEventCommC.h"
+
+#include "orbsvcs/CosEvent/event_serv_export.h"
+
+#if !defined (ACE_LACKS_PRAGMA_ONCE)
+# pragma once
+#endif /* ACE_LACKS_PRAGMA_ONCE */
+
+TAO_BEGIN_VERSIONED_NAMESPACE_DECL
+
+class TAO_CEC_ProxyPushSupplier;
+#if defined (TAO_HAS_TYPED_EVENT_CHANNEL)
+class TAO_CEC_TypedEvent;
+#endif /* TAO_HAS_TYPED_EVENT_CHANNEL */
+
+/**
+ * @class TAO_CEC_Dispatching
+ *
+ * @brief Define the interface for the dispatching strategies.
+ *
+ * The EC may be configured with different dispatching strategies,
+ * for instance, it can use a pool of threads to dispatch the
+ * events, or a set of queues with threads at different priorities
+ * for each queue or can simply push the event to the consumer in
+ * FIFO order.
+ */
+class TAO_Event_Serv_Export TAO_CEC_Dispatching
+{
+public:
+ /// destructor...
+ virtual ~TAO_CEC_Dispatching (void);
+
+ /// Initialize all the data structures, activate any internal threads,
+ /// etc.
+ virtual void activate (void) = 0;
+
+ /**
+ * Deactivate any internal threads and cleanup internal data
+ * structures, it should only return once the threads have finished
+ * their jobs.
+ */
+ virtual void shutdown (void) = 0;
+
+ /// The consumer represented by <proxy> should receive <event>.
+ virtual void push (TAO_CEC_ProxyPushSupplier *proxy,
+ const CORBA::Any &event
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS) = 0;
+ virtual void push_nocopy (TAO_CEC_ProxyPushSupplier *proxy,
+ CORBA::Any &event
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS) = 0;
+#if defined (TAO_HAS_TYPED_EVENT_CHANNEL)
+ virtual void invoke (TAO_CEC_ProxyPushSupplier *proxy,
+ const TAO_CEC_TypedEvent &typed_event
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS) = 0;
+ virtual void invoke_nocopy (TAO_CEC_ProxyPushSupplier *proxy,
+ TAO_CEC_TypedEvent &typed_event
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS) = 0;
+#endif /* TAO_HAS_TYPED_EVENT_CHANNEL */
+};
+
+// ****************************************************************
+
+/**
+ * @class TAO_CEC_Reactive_Dispatching
+ *
+ * @brief Dispatch using the caller thread.
+ *
+ * The events are dispatched in FIFO ordering, using the invoking
+ * thread to push the event to the consumer.
+ */
+class TAO_Event_Serv_Export TAO_CEC_Reactive_Dispatching : public TAO_CEC_Dispatching
+{
+public:
+ /// The scheduler is used to find the range of priorities and similar
+ /// info.
+ TAO_CEC_Reactive_Dispatching (void);
+
+ // = The CEC_Dispatching methods.
+ virtual void activate (void);
+ virtual void shutdown (void);
+ virtual void push (TAO_CEC_ProxyPushSupplier *proxy,
+ const CORBA::Any &event
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS);
+ virtual void push_nocopy (TAO_CEC_ProxyPushSupplier *proxy,
+ CORBA::Any &event
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS);
+#if defined (TAO_HAS_TYPED_EVENT_CHANNEL)
+ virtual void invoke (TAO_CEC_ProxyPushSupplier *proxy,
+ const TAO_CEC_TypedEvent &typed_event
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS);
+ virtual void invoke_nocopy (TAO_CEC_ProxyPushSupplier *proxy,
+ TAO_CEC_TypedEvent &typed_event
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS);
+#endif /* TAO_HAS_TYPED_EVENT_CHANNEL */
+};
+
+TAO_END_VERSIONED_NAMESPACE_DECL
+
+#include /**/ "ace/post.h"
+
+#endif /* TAO_CEC_DISPATCHING_H */
diff --git a/TAO/orbsvcs/orbsvcs/CosEvent/CEC_Dispatching_Task.cpp b/TAO/orbsvcs/orbsvcs/CosEvent/CEC_Dispatching_Task.cpp
new file mode 100644
index 00000000000..363d2600717
--- /dev/null
+++ b/TAO/orbsvcs/orbsvcs/CosEvent/CEC_Dispatching_Task.cpp
@@ -0,0 +1,156 @@
+// $Id$
+
+#include "orbsvcs/CosEvent/CEC_Dispatching_Task.h"
+
+#include "tao/ORB_Constants.h"
+#include "ace/OS_NS_errno.h"
+
+
+#if ! defined (__ACE_INLINE__)
+#include "orbsvcs/CosEvent/CEC_Dispatching_Task.i"
+#endif /* __ACE_INLINE__ */
+
+#include "ace/OS_NS_errno.h"
+
+ACE_RCSID (CosEvent,
+ CEC_Dispatching,
+ "$Id$")
+
+TAO_BEGIN_VERSIONED_NAMESPACE_DECL
+
+int
+TAO_CEC_Dispatching_Task::svc (void)
+{
+ int done = 0;
+ while (!done)
+ {
+ ACE_TRY_NEW_ENV
+ {
+ ACE_Message_Block *mb;
+ if (this->getq (mb) == -1)
+ if (ACE_OS::last_error () == ESHUTDOWN)
+ return 0;
+ else
+ ACE_ERROR ((LM_ERROR,
+ "EC (%P|%t) getq error in Dispatching Queue\n"));
+
+ TAO_CEC_Dispatch_Command *command =
+ dynamic_cast<TAO_CEC_Dispatch_Command*> (mb);
+
+ if (command == 0)
+ {
+ ACE_Message_Block::release (mb);
+ continue;
+ }
+
+ int result = command->execute (ACE_ENV_SINGLE_ARG_PARAMETER);
+ ACE_TRY_CHECK;
+
+ ACE_Message_Block::release (mb);
+
+ if (result == -1)
+ done = 1;
+ }
+ ACE_CATCHANY
+ {
+ ACE_PRINT_EXCEPTION (ACE_ANY_EXCEPTION,
+ "EC (%P|%t) exception in dispatching queue");
+ }
+ ACE_ENDTRY;
+ }
+ return 0;
+}
+
+void
+TAO_CEC_Dispatching_Task::push (TAO_CEC_ProxyPushSupplier *proxy,
+ CORBA::Any& event
+ ACE_ENV_ARG_DECL)
+{
+ if (this->allocator_ == 0)
+ this->allocator_ = ACE_Allocator::instance ();
+
+ void* buf = this->allocator_->malloc (sizeof (TAO_CEC_Push_Command));
+
+ if (buf == 0)
+ ACE_THROW (CORBA::NO_MEMORY (TAO::VMCID,
+ CORBA::COMPLETED_NO));
+
+ ACE_Message_Block *mb =
+ new (buf) TAO_CEC_Push_Command (proxy,
+ event,
+ this->data_block_.duplicate (),
+ this->allocator_);
+ this->putq (mb);
+}
+
+#if defined (TAO_HAS_TYPED_EVENT_CHANNEL)
+void
+TAO_CEC_Dispatching_Task::invoke (TAO_CEC_ProxyPushSupplier *proxy,
+ TAO_CEC_TypedEvent& typed_event
+ ACE_ENV_ARG_DECL)
+{
+ if (this->allocator_ == 0)
+ this->allocator_ = ACE_Allocator::instance ();
+
+ void* buf = this->allocator_->malloc (sizeof (TAO_CEC_Invoke_Command));
+
+ if (buf == 0)
+ ACE_THROW (CORBA::NO_MEMORY (TAO::VMCID,
+ CORBA::COMPLETED_NO));
+
+ ACE_Message_Block *mb =
+ new (buf) TAO_CEC_Invoke_Command (proxy,
+ typed_event,
+ this->data_block_.duplicate (),
+ this->allocator_);
+ this->putq (mb);
+}
+#endif /* TAO_HAS_TYPED_EVENT_CHANNEL */
+
+// ****************************************************************
+
+TAO_CEC_Dispatch_Command::~TAO_CEC_Dispatch_Command (void)
+{
+}
+
+// ****************************************************************
+
+int
+TAO_CEC_Shutdown_Task_Command::execute (ACE_ENV_SINGLE_ARG_DECL_NOT_USED)
+{
+ return -1;
+}
+
+// ****************************************************************
+
+TAO_CEC_Push_Command::~TAO_CEC_Push_Command (void)
+{
+ this->proxy_->_decr_refcnt ();
+}
+
+int
+TAO_CEC_Push_Command::execute (ACE_ENV_SINGLE_ARG_DECL)
+{
+ this->proxy_->push_to_consumer (this->event_ ACE_ENV_ARG_PARAMETER);
+ ACE_CHECK_RETURN (-1);
+ return 0;
+}
+
+// ****************************************************************
+
+#if defined (TAO_HAS_TYPED_EVENT_CHANNEL)
+TAO_CEC_Invoke_Command::~TAO_CEC_Invoke_Command (void)
+{
+ this->proxy_->_decr_refcnt ();
+}
+
+int
+TAO_CEC_Invoke_Command::execute (ACE_ENV_SINGLE_ARG_DECL)
+{
+ this->proxy_->invoke_to_consumer (this->typed_event_ ACE_ENV_ARG_PARAMETER);
+ ACE_CHECK_RETURN (-1);
+ return 0;
+}
+#endif /* TAO_HAS_TYPED_EVENT_CHANNEL */
+
+TAO_END_VERSIONED_NAMESPACE_DECL
diff --git a/TAO/orbsvcs/orbsvcs/CosEvent/CEC_Dispatching_Task.h b/TAO/orbsvcs/orbsvcs/CosEvent/CEC_Dispatching_Task.h
new file mode 100644
index 00000000000..fcdcb8a564a
--- /dev/null
+++ b/TAO/orbsvcs/orbsvcs/CosEvent/CEC_Dispatching_Task.h
@@ -0,0 +1,165 @@
+// $Id$
+// -*- C++ -*-
+
+//=============================================================================
+/**
+ * @file CEC_Dispatching_Task.h
+ *
+ * $Id$
+ *
+ * @author Carlos O'Ryan (coryan@cs.wustl.edu)
+ */
+//=============================================================================
+
+
+#ifndef TAO_CEC_DISPATCHING_TASK_H
+#define TAO_CEC_DISPATCHING_TASK_H
+
+#include /**/ "ace/pre.h"
+
+#include "orbsvcs/CosEvent/event_serv_export.h"
+
+#if !defined (ACE_LACKS_PRAGMA_ONCE)
+# pragma once
+#endif /* ACE_LACKS_PRAGMA_ONCE */
+
+#include "orbsvcs/CosEvent/CEC_ProxyPushSupplier.h"
+
+#include "tao/Basic_Types.h"
+
+#include "ace/Message_Block.h"
+#include "ace/Lock_Adapter_T.h"
+#include "ace/Task.h"
+
+#if defined (TAO_HAS_TYPED_EVENT_CHANNEL)
+#include "orbsvcs/CosEvent/CEC_TypedEvent.h"
+#endif /* TAO_HAS_TYPED_EVENT_CHANNEL */
+
+TAO_BEGIN_VERSIONED_NAMESPACE_DECL
+
+/**
+ * @class TAO_CEC_Dispatching_Task
+ *
+ * @brief Implement the dispatching queues for FIFO and Priority
+ * dispatching.
+ *
+ */
+class TAO_Event_Serv_Export TAO_CEC_Dispatching_Task : public ACE_Task<ACE_SYNCH>
+{
+public:
+ /// Constructor
+ TAO_CEC_Dispatching_Task (ACE_Thread_Manager* thr_manager = 0);
+
+ /// Process the events in the queue.
+ virtual int svc (void);
+
+ virtual void push (TAO_CEC_ProxyPushSupplier *proxy,
+ CORBA::Any& event
+ ACE_ENV_ARG_DECL);
+
+#if defined (TAO_HAS_TYPED_EVENT_CHANNEL)
+ virtual void invoke (TAO_CEC_ProxyPushSupplier *proxy,
+ TAO_CEC_TypedEvent& typed_event
+ ACE_ENV_ARG_DECL);
+#endif /* TAO_HAS_TYPED_EVENT_CHANNEL */
+
+private:
+ /// An per-task allocator
+ ACE_Allocator *allocator_;
+
+ /// Helper data structure to minimize memory allocations...
+ ACE_Locked_Data_Block<ACE_Lock_Adapter<TAO_SYNCH_MUTEX> > data_block_;
+};
+
+// ****************************************************************
+
+class TAO_Event_Serv_Export TAO_CEC_Dispatch_Command : public ACE_Message_Block
+{
+public:
+ /// Constructor, it will allocate its own data block
+ TAO_CEC_Dispatch_Command (ACE_Allocator *mb_allocator = 0);
+
+ /// Constructor, it assumes ownership of the data block
+ TAO_CEC_Dispatch_Command (ACE_Data_Block*,
+ ACE_Allocator *mb_allocator = 0);
+
+ /// Destructor
+ virtual ~TAO_CEC_Dispatch_Command (void);
+
+ /// Command callback
+ virtual int execute (ACE_ENV_SINGLE_ARG_DECL_NOT_USED) = 0;
+};
+
+// ****************************************************************
+
+class TAO_Event_Serv_Export TAO_CEC_Shutdown_Task_Command : public TAO_CEC_Dispatch_Command
+{
+public:
+ /// Constructor
+ TAO_CEC_Shutdown_Task_Command (ACE_Allocator *mb_allocator = 0);
+
+ /// Command callback
+ virtual int execute (ACE_ENV_SINGLE_ARG_DECL_NOT_USED);
+};
+
+// ****************************************************************
+
+class TAO_Event_Serv_Export TAO_CEC_Push_Command : public TAO_CEC_Dispatch_Command
+{
+public:
+ /// Constructor
+ TAO_CEC_Push_Command (TAO_CEC_ProxyPushSupplier* proxy,
+ CORBA::Any& event,
+ ACE_Data_Block* data_block,
+ ACE_Allocator *mb_allocator);
+
+ /// Destructor
+ virtual ~TAO_CEC_Push_Command (void);
+
+ /// Command callback
+ virtual int execute (ACE_ENV_SINGLE_ARG_DECL_NOT_USED);
+
+private:
+ /// The proxy
+ TAO_CEC_ProxyPushSupplier* proxy_;
+
+ /// The event
+ CORBA::Any event_;
+};
+
+// ****************************************************************
+
+#if defined (TAO_HAS_TYPED_EVENT_CHANNEL)
+class TAO_Event_Serv_Export TAO_CEC_Invoke_Command : public TAO_CEC_Dispatch_Command
+{
+public:
+ /// Constructor
+ TAO_CEC_Invoke_Command (TAO_CEC_ProxyPushSupplier* proxy,
+ TAO_CEC_TypedEvent& typed_event,
+ ACE_Data_Block* data_block,
+ ACE_Allocator *mb_allocator);
+
+ /// Destructor
+ virtual ~TAO_CEC_Invoke_Command (void);
+
+ /// Command callback
+ virtual int execute (ACE_ENV_SINGLE_ARG_DECL_NOT_USED);
+
+private:
+ /// The proxy
+ TAO_CEC_ProxyPushSupplier* proxy_;
+
+ /// The event
+ TAO_CEC_TypedEvent typed_event_;
+};
+#endif /* TAO_HAS_TYPED_EVENT_CHANNEL */
+
+TAO_END_VERSIONED_NAMESPACE_DECL
+
+#if defined (__ACE_INLINE__)
+#include "orbsvcs/CosEvent/CEC_Dispatching_Task.i"
+#endif /* __ACE_INLINE__ */
+
+#include /**/ "ace/post.h"
+
+#endif /* TAO_CEC_DISPATCHING_TASK_H */
diff --git a/TAO/orbsvcs/orbsvcs/CosEvent/CEC_Dispatching_Task.i b/TAO/orbsvcs/orbsvcs/CosEvent/CEC_Dispatching_Task.i
new file mode 100644
index 00000000000..1432528492a
--- /dev/null
+++ b/TAO/orbsvcs/orbsvcs/CosEvent/CEC_Dispatching_Task.i
@@ -0,0 +1,85 @@
+// -*- C++ -*-
+//
+// $Id$
+
+TAO_BEGIN_VERSIONED_NAMESPACE_DECL
+
+ACE_INLINE
+TAO_CEC_Dispatching_Task::
+TAO_CEC_Dispatching_Task (ACE_Thread_Manager* thr_manager)
+ : ACE_Task<ACE_SYNCH> (thr_manager),
+ allocator_ (0)
+{
+}
+
+// ****************************************************************
+
+ACE_INLINE
+TAO_CEC_Dispatch_Command::TAO_CEC_Dispatch_Command (ACE_Allocator *mb_allocator)
+ : ACE_Message_Block (mb_allocator)
+{
+}
+
+ACE_INLINE
+TAO_CEC_Dispatch_Command::TAO_CEC_Dispatch_Command (ACE_Data_Block *data_block,
+ ACE_Allocator *mb_allocator)
+ : ACE_Message_Block (data_block, 0, mb_allocator)
+{
+}
+
+// ****************************************************************
+
+ACE_INLINE
+TAO_CEC_Shutdown_Task_Command::
+ TAO_CEC_Shutdown_Task_Command (ACE_Allocator *mb_allocator)
+ : TAO_CEC_Dispatch_Command (mb_allocator)
+{
+}
+
+// ****************************************************************
+
+ACE_INLINE
+TAO_CEC_Push_Command::TAO_CEC_Push_Command (TAO_CEC_ProxyPushSupplier* proxy,
+ CORBA::Any& event,
+ ACE_Data_Block* data_block,
+ ACE_Allocator *mb_allocator)
+ : TAO_CEC_Dispatch_Command (data_block, mb_allocator),
+ proxy_ (proxy)
+{
+ //
+ // Efficient copy, steal the buffer from <event>
+ // We cannot do this on the initialization because get_buffer()
+ // could get called first, effectively setting maximum() and
+ // length() to 0!
+ //
+ // @@ TODO
+ this->event_ = event;
+
+ this->proxy_->_incr_refcnt ();
+}
+
+// ****************************************************************
+
+#if defined (TAO_HAS_TYPED_EVENT_CHANNEL)
+ACE_INLINE
+TAO_CEC_Invoke_Command::TAO_CEC_Invoke_Command (TAO_CEC_ProxyPushSupplier* proxy,
+ TAO_CEC_TypedEvent& typed_event,
+ ACE_Data_Block* data_block,
+ ACE_Allocator *mb_allocator)
+ : TAO_CEC_Dispatch_Command (data_block, mb_allocator),
+ proxy_ (proxy)
+{
+ //
+ // Efficient copy, steal the buffer from <event>
+ // We cannot do this on the initialization because get_buffer()
+ // could get called first, effectively setting maximum() and
+ // length() to 0!
+ //
+ // @@ TODO
+ this->typed_event_ = typed_event;
+
+ this->proxy_->_incr_refcnt ();
+}
+#endif /* TAO_HAS_TYPED_EVENT_CHANNEL */
+
+TAO_END_VERSIONED_NAMESPACE_DECL
diff --git a/TAO/orbsvcs/orbsvcs/CosEvent/CEC_DynamicImplementation.cpp b/TAO/orbsvcs/orbsvcs/CosEvent/CEC_DynamicImplementation.cpp
new file mode 100644
index 00000000000..75813fad39b
--- /dev/null
+++ b/TAO/orbsvcs/orbsvcs/CosEvent/CEC_DynamicImplementation.cpp
@@ -0,0 +1,179 @@
+// -*- C++ -*-
+//
+// $Id$
+
+#include "orbsvcs/CosEvent/CEC_DynamicImplementation.h"
+#include "tao/DynamicInterface/Request.h"
+#include "tao/DynamicInterface/Unknown_User_Exception.h"
+#include "tao/debug.h"
+#include "orbsvcs/CosEvent/CEC_TypedEvent.h"
+
+#if !defined(__ACE_INLINE__)
+#include "orbsvcs/CosEvent/CEC_DynamicImplementation.i"
+#endif /* __ACE_INLINE__ */
+
+TAO_BEGIN_VERSIONED_NAMESPACE_DECL
+
+// Destructor
+TAO_CEC_DynamicImplementationServer::~TAO_CEC_DynamicImplementationServer (void)
+{
+}
+
+// The DSI invoke request
+void
+TAO_CEC_DynamicImplementationServer::invoke (CORBA::ServerRequest_ptr request
+ ACE_ENV_ARG_DECL)
+ ACE_THROW_SPEC ((CORBA::SystemException))
+{
+ // Trap the _is_a request
+ if (ACE_OS::strcmp ("_is_a", request->operation () ) == 0)
+ {
+ this->is_a (request ACE_ENV_ARG_PARAMETER);
+ ACE_CHECK;
+ }
+ else
+ {
+ CORBA::NVList_ptr list;
+
+ // Get the operation paramter information from the IFR cache.
+ TAO_CEC_Operation_Params *oper_params =
+ this->typed_event_channel_->find_from_ifr_cache (request->operation () );
+
+ if (oper_params == 0)
+ {
+ if (TAO_debug_level >= 10)
+ {
+ ACE_DEBUG ((LM_DEBUG,
+ ACE_TEXT ("***** Operation not found in IFR cache *****\n")));
+ }
+
+ this->typed_event_channel_->create_list (0, list ACE_ENV_ARG_PARAMETER);
+ ACE_CHECK;
+ }
+ else
+ {
+ // Populate the NVList from the parameter information.
+ this->typed_event_channel_->create_operation_list (oper_params, list
+ ACE_ENV_ARG_PARAMETER);
+ ACE_CHECK;
+
+ // Get the operation arguments. This ahould demarshal correctly.
+ request->arguments (list ACE_ENV_ARG_PARAMETER);
+ ACE_CHECK;
+
+ // Populate the TypedEvent with the list and operation name.
+ TAO_CEC_TypedEvent typed_event (list, request->operation () );
+
+ // Pass the TypedEvent to the TypedProxyPushConsumer
+ this->typed_pp_consumer_->invoke (typed_event ACE_ENV_ARG_PARAMETER);
+ ACE_CHECK;
+ }
+ }
+}
+
+CORBA::RepositoryId
+TAO_CEC_DynamicImplementationServer::_primary_interface (const PortableServer::ObjectId &,
+ PortableServer::POA_ptr
+ ACE_ENV_ARG_DECL_NOT_USED)
+ ACE_THROW_SPEC (())
+{
+ return CORBA::string_dup (repository_id_);
+}
+
+PortableServer::POA_ptr
+TAO_CEC_DynamicImplementationServer::_default_POA (ACE_ENV_SINGLE_ARG_DECL_NOT_USED)
+{
+ return PortableServer::POA::_duplicate (this->poa_.in ());
+}
+
+void
+TAO_CEC_DynamicImplementationServer::is_a (CORBA::ServerRequest_ptr request
+ ACE_ENV_ARG_DECL)
+{
+ CORBA::NVList_ptr list;
+
+ this->typed_event_channel_->create_list (0, list ACE_ENV_ARG_PARAMETER);
+ ACE_CHECK;
+
+ CORBA::Any any_1;
+ any_1._tao_set_typecode(CORBA::_tc_string);
+
+ list->add_value ("value",
+ any_1,
+ CORBA::ARG_IN
+ ACE_ENV_ARG_PARAMETER);
+ ACE_CHECK;
+
+ request->arguments (list
+ ACE_ENV_ARG_PARAMETER);
+ ACE_CHECK;
+
+ CORBA::NamedValue_ptr nv = list->item (0 ACE_ENV_ARG_PARAMETER);
+ ACE_CHECK;
+
+ CORBA::Any_ptr ap = nv->value ();
+ const char *value;
+ *ap >>= value;
+
+ if (TAO_debug_level >= 10)
+ {
+ ACE_DEBUG ((LM_DEBUG,
+ ACE_TEXT ("***** TAO_CEC_DynamicImplementationServer::is_a called with value %s *****\n"),
+ value));
+ }
+
+ const char *object_id =
+ CORBA::_tc_Object->id (ACE_ENV_SINGLE_ARG_PARAMETER);
+ ACE_CHECK;
+
+ if (TAO_debug_level >= 10)
+ {
+ ACE_DEBUG ((LM_DEBUG,
+ ACE_TEXT ("***** is_a using Server's RepositoryId %s *****\n"),
+ this->repository_id_));
+ ACE_DEBUG ((LM_DEBUG,
+ ACE_TEXT ("***** is_a using base interface %s *****\n"),
+ object_id));
+ }
+
+ CORBA::Boolean result = 0;
+ if (ACE_OS::strcmp (value, this->repository_id_) == 0
+ || ACE_OS::strcmp (value, object_id) == 0)
+ {
+ result = 1;
+ }
+ else
+ {
+ CORBA::ULong num = this->typed_event_channel_->number_of_base_interfaces ();
+ for (CORBA::ULong base=0; base<num; base++)
+ {
+ if (TAO_debug_level >= 10)
+ {
+ ACE_DEBUG ((LM_DEBUG,
+ ACE_TEXT ("***** is_a using base interface %s *****\n"),
+ this->typed_event_channel_->base_interfaces (base) ));
+ }
+
+ if (ACE_OS::strcmp (value, this->typed_event_channel_->base_interfaces (base) ) == 0)
+ {
+ result = 1;
+ }
+ }
+ }
+
+ if (TAO_debug_level >= 10)
+ {
+ ACE_DEBUG ((LM_DEBUG,
+ ACE_TEXT ("***** is_a returning %d *****\n"),
+ result));
+ }
+
+ CORBA::Any result_any;
+ CORBA::Any::from_boolean from_boolean (result);
+ result_any <<= from_boolean;
+
+ request->set_result (result_any ACE_ENV_ARG_PARAMETER);
+ ACE_CHECK;
+}
+
+TAO_END_VERSIONED_NAMESPACE_DECL
diff --git a/TAO/orbsvcs/orbsvcs/CosEvent/CEC_DynamicImplementation.h b/TAO/orbsvcs/orbsvcs/CosEvent/CEC_DynamicImplementation.h
new file mode 100644
index 00000000000..98c4b91c1cd
--- /dev/null
+++ b/TAO/orbsvcs/orbsvcs/CosEvent/CEC_DynamicImplementation.h
@@ -0,0 +1,84 @@
+// -*- C++ -*-
+
+//=============================================================================
+/**
+ * @file CEC_DynamicImplementation.h
+ *
+ * $Id$
+ *
+ * @author Jon Astle (jon@astle45.fsnet.co.uk)
+ */
+//=============================================================================
+
+
+#ifndef TAO_CEC_DYNAMICIMPLEMENTATION_H
+#define TAO_CEC_DYNAMICIMPLEMENTATION_H
+
+#include "orbsvcs/CosEvent/CEC_TypedProxyPushConsumer.h"
+#include "orbsvcs/CosEvent/CEC_TypedEventChannel.h"
+#include "tao/DynamicInterface/Server_Request.h"
+#include "tao/DynamicInterface/Dynamic_Implementation.h"
+#include "tao/ORB.h"
+
+
+TAO_BEGIN_VERSIONED_NAMESPACE_DECL
+
+class TAO_CEC_DynamicImplementationServer : public TAO_DynamicImplementation
+{
+ // = TITLE
+ // DSI TAO_CEC_DynamicImplementationServer implementation
+ //
+ // = DESCRIPTION
+ // Implements the DSI impl object
+ //
+public:
+
+ // Constructure
+ TAO_CEC_DynamicImplementationServer (PortableServer::POA_ptr poa,
+ TAO_CEC_TypedProxyPushConsumer *typed_pp_consumer,
+ TAO_CEC_TypedEventChannel *typed_event_channel);
+
+ //Destructor
+ virtual ~TAO_CEC_DynamicImplementationServer (void);
+
+ // = The DynamicImplementation methods.
+ virtual void invoke (CORBA::ServerRequest_ptr request
+ ACE_ENV_ARG_DECL)
+ ACE_THROW_SPEC ((CORBA::SystemException));
+
+ virtual CORBA::RepositoryId _primary_interface (
+ const PortableServer::ObjectId &oid,
+ PortableServer::POA_ptr poa
+ ACE_ENV_ARG_DECL
+ )
+ ACE_THROW_SPEC (());
+
+ virtual PortableServer::POA_ptr _default_POA (
+ ACE_ENV_SINGLE_ARG_DECL
+ );
+
+ // Handles the _is_a call
+ virtual void is_a (CORBA::ServerRequest_ptr request
+ ACE_ENV_ARG_DECL);
+
+private:
+ // The POA
+ PortableServer::POA_var poa_;
+
+ // The Typed Proxy Push Consumer Implementation
+ TAO_CEC_TypedProxyPushConsumer *typed_pp_consumer_;
+
+ // The Typed Event Channel Implementation
+ TAO_CEC_TypedEventChannel *typed_event_channel_;
+
+ // The RepositoryId
+ CORBA::RepositoryId repository_id_;
+};
+
+TAO_END_VERSIONED_NAMESPACE_DECL
+
+#if defined(__ACE_INLINE__)
+#include "orbsvcs/CosEvent/CEC_DynamicImplementation.i"
+#endif /* __ACE_INLINE__ */
+
+#endif /* TAO_CEC_DYNAMICIMPLEMENTATION_H */
diff --git a/TAO/orbsvcs/orbsvcs/CosEvent/CEC_DynamicImplementation.i b/TAO/orbsvcs/orbsvcs/CosEvent/CEC_DynamicImplementation.i
new file mode 100644
index 00000000000..2f1bff715f7
--- /dev/null
+++ b/TAO/orbsvcs/orbsvcs/CosEvent/CEC_DynamicImplementation.i
@@ -0,0 +1,19 @@
+// -*- C++ -*-
+//
+// $Id$
+
+TAO_BEGIN_VERSIONED_NAMESPACE_DECL
+
+ACE_INLINE
+TAO_CEC_DynamicImplementationServer::TAO_CEC_DynamicImplementationServer
+ (PortableServer::POA_ptr poa,
+ TAO_CEC_TypedProxyPushConsumer *typed_pp_consumer,
+ TAO_CEC_TypedEventChannel *typed_event_channel)
+ : poa_ (PortableServer::POA::_duplicate (poa)),
+ typed_pp_consumer_ (typed_pp_consumer),
+ typed_event_channel_ (typed_event_channel),
+ repository_id_ (CORBA::string_dup (typed_event_channel->supported_interface () ))
+{
+}
+
+TAO_END_VERSIONED_NAMESPACE_DECL
diff --git a/TAO/orbsvcs/orbsvcs/CosEvent/CEC_EventChannel.cpp b/TAO/orbsvcs/orbsvcs/CosEvent/CEC_EventChannel.cpp
new file mode 100644
index 00000000000..11fb1dd92d7
--- /dev/null
+++ b/TAO/orbsvcs/orbsvcs/CosEvent/CEC_EventChannel.cpp
@@ -0,0 +1,241 @@
+// $Id$
+
+#include "orbsvcs/CosEvent/CEC_EventChannel.h"
+#include "orbsvcs/CosEvent/CEC_Dispatching.h"
+#include "orbsvcs/CosEvent/CEC_Pulling_Strategy.h"
+#include "orbsvcs/CosEvent/CEC_ConsumerAdmin.h"
+#include "orbsvcs/CosEvent/CEC_SupplierAdmin.h"
+#include "orbsvcs/CosEvent/CEC_ConsumerControl.h"
+#include "orbsvcs/CosEvent/CEC_SupplierControl.h"
+#include "ace/Dynamic_Service.h"
+
+#if ! defined (__ACE_INLINE__)
+#include "orbsvcs/CosEvent/CEC_EventChannel.i"
+#endif /* __ACE_INLINE__ */
+
+ACE_RCSID(CosEvent, CEC_EventChannel, "$Id$")
+
+TAO_BEGIN_VERSIONED_NAMESPACE_DECL
+
+TAO_CEC_EventChannel::
+TAO_CEC_EventChannel (const TAO_CEC_EventChannel_Attributes& attr,
+ TAO_CEC_Factory* factory,
+ int own_factory)
+ : supplier_poa_ (PortableServer::POA::_duplicate (attr.supplier_poa)),
+ consumer_poa_ (PortableServer::POA::_duplicate (attr.consumer_poa)),
+ factory_ (factory),
+ own_factory_ (own_factory),
+ consumer_reconnect_ (attr.consumer_reconnect),
+ supplier_reconnect_ (attr.supplier_reconnect),
+ disconnect_callbacks_ (attr.disconnect_callbacks)
+{
+ if (this->factory_ == 0)
+ {
+ this->factory_ =
+ ACE_Dynamic_Service<TAO_CEC_Factory>::instance ("CEC_Factory");
+ this->own_factory_ = 0;
+ ACE_ASSERT (this->factory_ != 0);
+ }
+
+ this->dispatching_ =
+ this->factory_->create_dispatching (this);
+ this->pulling_strategy_ =
+ this->factory_->create_pulling_strategy (this);
+ this->consumer_admin_ =
+ this->factory_->create_consumer_admin (this);
+ this->supplier_admin_ =
+ this->factory_->create_supplier_admin (this);
+ this->consumer_control_ =
+ this->factory_->create_consumer_control (this);
+ this->supplier_control_ =
+ this->factory_->create_supplier_control (this);
+}
+
+TAO_CEC_EventChannel::~TAO_CEC_EventChannel (void)
+{
+ this->factory_->destroy_dispatching (this->dispatching_);
+ this->dispatching_ = 0;
+
+ this->factory_->destroy_pulling_strategy (this->pulling_strategy_);
+ this->pulling_strategy_ = 0;
+
+ this->factory_->destroy_consumer_admin (this->consumer_admin_);
+ this->consumer_admin_ = 0;
+ this->factory_->destroy_supplier_admin (this->supplier_admin_);
+ this->supplier_admin_ = 0;
+
+ this->factory_->destroy_consumer_control (this->consumer_control_);
+ this->consumer_control_ = 0;
+ this->factory_->destroy_supplier_control (this->supplier_control_);
+ this->supplier_control_ = 0;
+
+ if (this->own_factory_)
+ delete this->factory_;
+}
+
+void
+TAO_CEC_EventChannel::activate (ACE_ENV_SINGLE_ARG_DECL_NOT_USED)
+{
+ this->dispatching_->activate ();
+ this->pulling_strategy_->activate ();
+ this->consumer_control_->activate ();
+ this->supplier_control_->activate ();
+}
+
+void
+TAO_CEC_EventChannel::shutdown (ACE_ENV_SINGLE_ARG_DECL)
+{
+ this->dispatching_->shutdown ();
+ this->pulling_strategy_->shutdown ();
+ this->supplier_control_->shutdown ();
+ this->consumer_control_->shutdown ();
+
+ PortableServer::POA_var consumer_poa =
+ this->consumer_admin_->_default_POA (ACE_ENV_SINGLE_ARG_PARAMETER);
+ ACE_CHECK;
+ PortableServer::ObjectId_var consumer_id =
+ consumer_poa->servant_to_id (this->consumer_admin_ ACE_ENV_ARG_PARAMETER);
+ ACE_CHECK;
+ consumer_poa->deactivate_object (consumer_id.in () ACE_ENV_ARG_PARAMETER);
+ ACE_CHECK;
+
+ PortableServer::POA_var supplier_poa =
+ this->supplier_admin_->_default_POA (ACE_ENV_SINGLE_ARG_PARAMETER);
+ ACE_CHECK;
+ PortableServer::ObjectId_var supplier_id =
+ supplier_poa->servant_to_id (this->supplier_admin_ ACE_ENV_ARG_PARAMETER);
+ ACE_CHECK;
+ supplier_poa->deactivate_object (supplier_id.in () ACE_ENV_ARG_PARAMETER);
+ ACE_CHECK;
+
+ this->supplier_admin_->shutdown (ACE_ENV_SINGLE_ARG_PARAMETER);
+ ACE_CHECK;
+
+ this->consumer_admin_->shutdown (ACE_ENV_SINGLE_ARG_PARAMETER);
+ ACE_CHECK;
+}
+
+void
+TAO_CEC_EventChannel::connected (TAO_CEC_ProxyPushConsumer* consumer
+ ACE_ENV_ARG_DECL)
+{
+ this->supplier_admin_->connected (consumer ACE_ENV_ARG_PARAMETER);
+ ACE_CHECK;
+}
+
+void
+TAO_CEC_EventChannel::reconnected (TAO_CEC_ProxyPushConsumer* consumer
+ ACE_ENV_ARG_DECL)
+{
+ this->supplier_admin_->reconnected (consumer ACE_ENV_ARG_PARAMETER);
+ ACE_CHECK;
+}
+
+void
+TAO_CEC_EventChannel::disconnected (TAO_CEC_ProxyPushConsumer* consumer
+ ACE_ENV_ARG_DECL)
+{
+ this->supplier_admin_->disconnected (consumer ACE_ENV_ARG_PARAMETER);
+ ACE_CHECK;
+}
+
+void
+TAO_CEC_EventChannel::connected (TAO_CEC_ProxyPullConsumer* consumer
+ ACE_ENV_ARG_DECL)
+{
+ this->supplier_admin_->connected (consumer ACE_ENV_ARG_PARAMETER);
+ ACE_CHECK;
+}
+
+void
+TAO_CEC_EventChannel::reconnected (TAO_CEC_ProxyPullConsumer* consumer
+ ACE_ENV_ARG_DECL)
+{
+ this->supplier_admin_->reconnected (consumer ACE_ENV_ARG_PARAMETER);
+ ACE_CHECK;
+}
+
+void
+TAO_CEC_EventChannel::disconnected (TAO_CEC_ProxyPullConsumer* consumer
+ ACE_ENV_ARG_DECL)
+{
+ this->supplier_admin_->disconnected (consumer ACE_ENV_ARG_PARAMETER);
+ ACE_CHECK;
+}
+
+void
+TAO_CEC_EventChannel::connected (TAO_CEC_ProxyPushSupplier* supplier
+ ACE_ENV_ARG_DECL)
+{
+ this->consumer_admin_->connected (supplier ACE_ENV_ARG_PARAMETER);
+ ACE_CHECK;
+}
+
+void
+TAO_CEC_EventChannel::reconnected (TAO_CEC_ProxyPushSupplier* supplier
+ ACE_ENV_ARG_DECL)
+{
+ this->consumer_admin_->reconnected (supplier ACE_ENV_ARG_PARAMETER);
+ ACE_CHECK;
+}
+
+void
+TAO_CEC_EventChannel::disconnected (TAO_CEC_ProxyPushSupplier* supplier
+ ACE_ENV_ARG_DECL)
+{
+ this->consumer_admin_->disconnected (supplier ACE_ENV_ARG_PARAMETER);
+ ACE_CHECK;
+}
+
+void
+TAO_CEC_EventChannel::connected (TAO_CEC_ProxyPullSupplier* supplier
+ ACE_ENV_ARG_DECL)
+{
+ this->consumer_admin_->connected (supplier ACE_ENV_ARG_PARAMETER);
+ ACE_CHECK;
+}
+
+void
+TAO_CEC_EventChannel::reconnected (TAO_CEC_ProxyPullSupplier* supplier
+ ACE_ENV_ARG_DECL)
+{
+ this->consumer_admin_->reconnected (supplier ACE_ENV_ARG_PARAMETER);
+ ACE_CHECK;
+}
+
+void
+TAO_CEC_EventChannel::disconnected (TAO_CEC_ProxyPullSupplier* supplier
+ ACE_ENV_ARG_DECL)
+{
+ this->consumer_admin_->disconnected (supplier ACE_ENV_ARG_PARAMETER);
+ ACE_CHECK;
+}
+
+CosEventChannelAdmin::ConsumerAdmin_ptr
+TAO_CEC_EventChannel::for_consumers (ACE_ENV_SINGLE_ARG_DECL)
+ ACE_THROW_SPEC ((CORBA::SystemException))
+{
+ return this->consumer_admin_->_this (ACE_ENV_SINGLE_ARG_PARAMETER);
+}
+
+CosEventChannelAdmin::SupplierAdmin_ptr
+TAO_CEC_EventChannel::for_suppliers (ACE_ENV_SINGLE_ARG_DECL)
+ ACE_THROW_SPEC ((CORBA::SystemException))
+{
+ return this->supplier_admin_->_this (ACE_ENV_SINGLE_ARG_PARAMETER);
+}
+
+void
+TAO_CEC_EventChannel::destroy (ACE_ENV_SINGLE_ARG_DECL)
+ ACE_THROW_SPEC ((CORBA::SystemException))
+{
+ this->shutdown (ACE_ENV_SINGLE_ARG_PARAMETER);
+}
+
+CORBA::Policy_ptr TAO_CEC_EventChannel::create_roundtrip_timeout_policy
+(const ACE_Time_Value &timeout)
+{
+ return this->factory_->create_roundtrip_timeout_policy (timeout);
+}
+
+TAO_END_VERSIONED_NAMESPACE_DECL
diff --git a/TAO/orbsvcs/orbsvcs/CosEvent/CEC_EventChannel.h b/TAO/orbsvcs/orbsvcs/CosEvent/CEC_EventChannel.h
new file mode 100644
index 00000000000..b25f91e9054
--- /dev/null
+++ b/TAO/orbsvcs/orbsvcs/CosEvent/CEC_EventChannel.h
@@ -0,0 +1,316 @@
+// -*- C++ -*-
+
+//=============================================================================
+/**
+ * @file CEC_EventChannel.h
+ *
+ * $Id$
+ *
+ * @author Carlos O'Ryan (coryan@cs.wustl.edu)
+ *
+ * A new implementation of the COS Event Channel.
+ * This version does not rely on the RTEC in its implementation.
+ *
+ *
+ */
+//=============================================================================
+
+
+#ifndef TAO_CEC_EVENTCHANNEL_H
+#define TAO_CEC_EVENTCHANNEL_H
+
+#include /**/ "ace/pre.h"
+
+#include "orbsvcs/CosEvent/CEC_Factory.h"
+
+#if !defined (ACE_LACKS_PRAGMA_ONCE)
+# pragma once
+#endif /* ACE_LACKS_PRAGMA_ONCE */
+
+#include "orbsvcs/CosEventChannelAdminS.h"
+
+#include "orbsvcs/CosEvent/CEC_Defaults.h"
+#include "orbsvcs/CosEvent/event_serv_export.h"
+#include "ace/Hash_Map_Manager.h"
+
+TAO_BEGIN_VERSIONED_NAMESPACE_DECL
+
+/**
+ * @class TAO_CEC_EventChannel_Attributes
+ *
+ * @brief Defines the construction time attributes for the Event
+ * Channel.
+ *
+ * The event channel implementation is controlled by two
+ * mechanisms:
+ * The CEC_Factory that provides the strategies for the EC
+ * implementation.
+ * The EC attributes that define constants and values required
+ * by the EC construction.
+ * This class encapsulates those constants and values, providing
+ * an easy mechanism to extend the attributes without requiring
+ * changes in the EC constructor.
+ */
+class TAO_Event_Serv_Export TAO_CEC_EventChannel_Attributes
+{
+public:
+ /**
+ * The basic constructor.
+ * The attributes listed as arguments are *required* by the EC, and
+ * no appropiate defaults are available for them.
+ */
+ TAO_CEC_EventChannel_Attributes (PortableServer::POA_ptr supplier_poa,
+ PortableServer::POA_ptr consumer_poa);
+
+ // Most fields are public, there is no need to protect them, in fact
+ // the user should be able to set any values she wants.
+
+ /// Can consumers or suppliers invoke connect_push_* multiple times?
+ int consumer_reconnect;
+ int supplier_reconnect;
+
+ /**
+ * If not zero the event channel will send disconnect callbacks when
+ * a disconnect method is called on a Proxy. In other words, if a
+ * consumer calls disconnect_push_supplier() on its proxy the EC
+ * will invoke disconnect_push_consumer() on the consumer. A
+ * similar thing is done for suppliers.
+ * It is a matter of debate what the spec requires for the regular
+ * event service.
+ */
+ int disconnect_callbacks;
+
+private:
+ /// Only the EC can read the private fields.
+ friend class TAO_CEC_EventChannel;
+
+ /// The POAs
+ PortableServer::POA_ptr supplier_poa;
+ PortableServer::POA_ptr consumer_poa;
+};
+
+/**
+ * @class TAO_CEC_EventChannel
+ *
+ * @brief The CosEventChannelAdmin::EventChannel implementation.
+ *
+ * This class is the Mediator between all the classes in the EC
+ * implementation, its main task is to redirect the messages to
+ * the right components, to hold and manage the lifetime of the
+ * long lived objects (Timer_Module, SupplierAdmin,
+ * ConsumerAdmin and Dispatching) and to provide a simpler
+ * interface to the CEC_Factory.
+ */
+class TAO_Event_Serv_Export TAO_CEC_EventChannel : public POA_CosEventChannelAdmin::EventChannel
+{
+public:
+ class ServantBaseHash
+ {
+ public:
+ u_long operator() (PortableServer::ServantBase* const & ptr) const {
+ return reinterpret_cast<u_long> (ptr);
+ }
+ };
+
+ typedef ACE_Hash_Map_Manager_Ex<PortableServer::ServantBase*,
+ unsigned int,
+ ServantBaseHash,
+ ACE_Equal_To<PortableServer::ServantBase*>,
+ TAO_SYNCH_MUTEX> ServantRetryMap;
+
+ /**
+ * constructor
+ * If <own_factory> is not 0 it assumes ownership of the factory.
+ * If the factory is <nil> it uses the Service_Configurator to load
+ * the Factory, if not found it uses TAO_CEC_Default_Resource_Factory
+ */
+ TAO_CEC_EventChannel (const TAO_CEC_EventChannel_Attributes& attributes,
+ TAO_CEC_Factory* factory = 0,
+ int own_factory = 0);
+
+ /// destructor
+ virtual ~TAO_CEC_EventChannel (void);
+
+ /// Start the internal threads (if any), etc.
+ /// After this call the EC can be used.
+ virtual void activate (ACE_ENV_SINGLE_ARG_DECL_WITH_DEFAULTS);
+
+ /// Shutdown any internal threads, cleanup all the internal
+ /// structures, flush all the messages, etc.
+ virtual void shutdown (ACE_ENV_SINGLE_ARG_DECL_WITH_DEFAULTS);
+
+ /// Access the dispatching module....
+ TAO_CEC_Dispatching* dispatching (void) const;
+
+ /// Access the consumer admin implementation.
+ TAO_CEC_ConsumerAdmin* consumer_admin (void) const;
+
+ /// Access the supplier admin implementation.
+ TAO_CEC_SupplierAdmin* supplier_admin (void) const;
+
+ /// Access the consumer control strategy.
+ TAO_CEC_ConsumerControl* consumer_control (void) const;
+
+ /// Access the supplier control strategy.
+ TAO_CEC_SupplierControl* supplier_control (void) const;
+
+ // = The factory methods, they delegate on the CEC_Factory.
+ /// Create and destroy a ProxyPushSupplier
+ void create_proxy (TAO_CEC_ProxyPushSupplier*&);
+ void destroy_proxy (TAO_CEC_ProxyPushSupplier*);
+
+ /// Create and destroy a ProxyPullSupplier
+ void create_proxy (TAO_CEC_ProxyPullSupplier*&);
+ void destroy_proxy (TAO_CEC_ProxyPullSupplier*);
+
+ /// Create and destroy a ProxyPushConsumer
+ void create_proxy (TAO_CEC_ProxyPushConsumer*&);
+ void destroy_proxy (TAO_CEC_ProxyPushConsumer*);
+
+ /// Create and destroy a ProxyPushConsumer
+ void create_proxy (TAO_CEC_ProxyPullConsumer*&);
+ void destroy_proxy (TAO_CEC_ProxyPullConsumer*);
+
+ /// Create and destroy a the collections used to store
+ /// Proxy*Suppliers
+ void create_proxy_collection (TAO_CEC_ProxyPushSupplier_Collection*&);
+ void destroy_proxy_collection (TAO_CEC_ProxyPushSupplier_Collection*);
+ void create_proxy_collection (TAO_CEC_ProxyPullSupplier_Collection*&);
+ void destroy_proxy_collection (TAO_CEC_ProxyPullSupplier_Collection*);
+
+ /// Create and destroy a the collections used to store
+ /// Proxy*Consumers
+ void create_proxy_collection (TAO_CEC_ProxyPushConsumer_Collection*&);
+ void destroy_proxy_collection (TAO_CEC_ProxyPushConsumer_Collection*);
+ void create_proxy_collection (TAO_CEC_ProxyPullConsumer_Collection*&);
+ void destroy_proxy_collection (TAO_CEC_ProxyPullConsumer_Collection*);
+
+ /// Access the supplier and consumer POAs from the factory.
+ PortableServer::POA_ptr supplier_poa (void);
+ PortableServer::POA_ptr consumer_poa (void);
+
+ /// Locking strategies for the ProxyPushConsumer and
+ /// ProxyPushSupplier objects
+ ACE_Lock* create_consumer_lock (void);
+ void destroy_consumer_lock (ACE_Lock*);
+ ACE_Lock* create_supplier_lock (void);
+ void destroy_supplier_lock (ACE_Lock*);
+
+ /// Used to inform the EC that a Consumer has connected or
+ /// disconnected from it.
+ virtual void connected (TAO_CEC_ProxyPushConsumer*
+ ACE_ENV_ARG_DECL_NOT_USED);
+ virtual void reconnected (TAO_CEC_ProxyPushConsumer*
+ ACE_ENV_ARG_DECL_NOT_USED);
+ virtual void disconnected (TAO_CEC_ProxyPushConsumer*
+ ACE_ENV_ARG_DECL_NOT_USED);
+ virtual void connected (TAO_CEC_ProxyPullConsumer*
+ ACE_ENV_ARG_DECL_NOT_USED);
+ virtual void reconnected (TAO_CEC_ProxyPullConsumer*
+ ACE_ENV_ARG_DECL_NOT_USED);
+ virtual void disconnected (TAO_CEC_ProxyPullConsumer*
+ ACE_ENV_ARG_DECL_NOT_USED);
+
+ /// Used to inform the EC that a Supplier has connected or
+ /// disconnected from it.
+ virtual void connected (TAO_CEC_ProxyPushSupplier*
+ ACE_ENV_ARG_DECL_NOT_USED);
+ virtual void reconnected (TAO_CEC_ProxyPushSupplier*
+ ACE_ENV_ARG_DECL_NOT_USED);
+ virtual void disconnected (TAO_CEC_ProxyPushSupplier*
+ ACE_ENV_ARG_DECL_NOT_USED);
+ virtual void connected (TAO_CEC_ProxyPullSupplier*
+ ACE_ENV_ARG_DECL_NOT_USED);
+ virtual void reconnected (TAO_CEC_ProxyPullSupplier*
+ ACE_ENV_ARG_DECL_NOT_USED);
+ virtual void disconnected (TAO_CEC_ProxyPullSupplier*
+ ACE_ENV_ARG_DECL_NOT_USED);
+
+ // Simple flags to control the EC behavior, set by the application
+ // at construction time.
+
+ /// Can the consumers reconnect to the EC?
+ int consumer_reconnect (void) const;
+
+ /// Can the suppliers reconnect to the EC?
+ int supplier_reconnect (void) const;
+
+ /// Should we send callback disconnect messages when a proxy is
+ /// disconnected by the client
+ int disconnect_callbacks (void) const;
+
+ // = The CosEventChannelAdmin::EventChannel methods...
+ /// The default implementation is:
+ /// this->consumer_admin ()->_this (env);
+ virtual CosEventChannelAdmin::ConsumerAdmin_ptr
+ for_consumers (ACE_ENV_SINGLE_ARG_DECL)
+ ACE_THROW_SPEC ((CORBA::SystemException));
+
+ /// The default implementation is:
+ /// this->supplier_admin ()->_this (env);
+ virtual CosEventChannelAdmin::SupplierAdmin_ptr
+ for_suppliers (ACE_ENV_SINGLE_ARG_DECL)
+ ACE_THROW_SPEC ((CORBA::SystemException));
+
+ /// Commit suicide.
+ virtual void destroy (ACE_ENV_SINGLE_ARG_DECL)
+ ACE_THROW_SPEC ((CORBA::SystemException));
+
+ ServantRetryMap& get_servant_retry_map (void);
+
+ /// Forwarded to the factory
+ CORBA::Policy_ptr
+ create_roundtrip_timeout_policy (const ACE_Time_Value &timeout);
+
+private:
+ /// The POAs used to activate "supplier-side" and "consumer-side"
+ /// objects.
+ PortableServer::POA_var supplier_poa_;
+ PortableServer::POA_var consumer_poa_;
+
+ /**
+ * This is the abstract factory that creates all the objects that
+ * compose an event channel, the event channel simply acts as a
+ * Mediator among them.
+ */
+ TAO_CEC_Factory *factory_;
+
+ /// Flag that indicates if we own the factory.
+ int own_factory_;
+
+ /// The dispatching "module"
+ TAO_CEC_Dispatching *dispatching_;
+
+ /// The pulling strategy
+ TAO_CEC_Pulling_Strategy *pulling_strategy_;
+
+ /// The ConsumerAdmin implementation
+ TAO_CEC_ConsumerAdmin *consumer_admin_;
+
+ /// The SupplierAdmin implementation
+ TAO_CEC_SupplierAdmin *supplier_admin_;
+
+ /// Consumer/Supplier reconnection flags
+ int consumer_reconnect_;
+ int supplier_reconnect_;
+
+ /// If not zero we send callbacks when a proxy is disconnected
+ int disconnect_callbacks_;
+
+ /// Strategies to disconnect misbehaving or destroyed consumers and
+ /// suppliers
+ TAO_CEC_ConsumerControl *consumer_control_;
+ TAO_CEC_SupplierControl *supplier_control_;
+
+ ServantRetryMap retry_map_;
+};
+
+TAO_END_VERSIONED_NAMESPACE_DECL
+
+#if defined (__ACE_INLINE__)
+#include "orbsvcs/CosEvent/CEC_EventChannel.i"
+#endif /* __ACE_INLINE__ */
+
+#include /**/ "ace/post.h"
+
+#endif /* TAO_CEC_EVENT_CHANNEL_H */
diff --git a/TAO/orbsvcs/orbsvcs/CosEvent/CEC_EventChannel.i b/TAO/orbsvcs/orbsvcs/CosEvent/CEC_EventChannel.i
new file mode 100644
index 00000000000..23f8e906f7c
--- /dev/null
+++ b/TAO/orbsvcs/orbsvcs/CosEvent/CEC_EventChannel.i
@@ -0,0 +1,205 @@
+// -*- C++ -*-
+//
+// $Id$
+
+TAO_BEGIN_VERSIONED_NAMESPACE_DECL
+
+ACE_INLINE
+TAO_CEC_EventChannel_Attributes::
+TAO_CEC_EventChannel_Attributes (PortableServer::POA_ptr s_poa,
+ PortableServer::POA_ptr c_poa)
+ : consumer_reconnect (TAO_CEC_DEFAULT_CONSUMER_RECONNECT),
+ supplier_reconnect (TAO_CEC_DEFAULT_SUPPLIER_RECONNECT),
+ disconnect_callbacks (TAO_CEC_DEFAULT_DISCONNECT_CALLBACKS),
+ supplier_poa (s_poa),
+ consumer_poa (c_poa)
+{
+}
+
+ACE_INLINE TAO_CEC_Dispatching*
+TAO_CEC_EventChannel::dispatching (void) const
+{
+ return this->dispatching_;
+}
+
+ACE_INLINE TAO_CEC_ConsumerAdmin*
+TAO_CEC_EventChannel::consumer_admin (void) const
+{
+ return this->consumer_admin_;
+}
+
+ACE_INLINE TAO_CEC_SupplierAdmin*
+TAO_CEC_EventChannel::supplier_admin (void) const
+{
+ return this->supplier_admin_;
+}
+
+ACE_INLINE TAO_CEC_ConsumerControl*
+TAO_CEC_EventChannel::consumer_control (void) const
+{
+ return this->consumer_control_;
+}
+
+ACE_INLINE TAO_CEC_SupplierControl*
+TAO_CEC_EventChannel::supplier_control (void) const
+{
+ return this->supplier_control_;
+}
+
+ACE_INLINE void
+TAO_CEC_EventChannel::create_proxy (TAO_CEC_ProxyPushSupplier* &x)
+{
+ x = this->factory_->create_proxy_push_supplier (this);
+}
+
+ACE_INLINE void
+TAO_CEC_EventChannel::destroy_proxy (TAO_CEC_ProxyPushSupplier* supplier)
+{
+ this->factory_->destroy_proxy_push_supplier (supplier);
+}
+
+ACE_INLINE void
+TAO_CEC_EventChannel::create_proxy (TAO_CEC_ProxyPullSupplier* &x)
+{
+ x = this->factory_->create_proxy_pull_supplier (this);
+}
+
+ACE_INLINE void
+TAO_CEC_EventChannel::destroy_proxy (TAO_CEC_ProxyPullSupplier* supplier)
+{
+ this->factory_->destroy_proxy_pull_supplier (supplier);
+}
+
+ACE_INLINE void
+TAO_CEC_EventChannel::create_proxy (TAO_CEC_ProxyPushConsumer* &x)
+{
+ x = this->factory_->create_proxy_push_consumer (this);
+}
+
+ACE_INLINE void
+TAO_CEC_EventChannel::destroy_proxy (TAO_CEC_ProxyPushConsumer* consumer)
+{
+ this->factory_->destroy_proxy_push_consumer (consumer);
+}
+
+ACE_INLINE void
+TAO_CEC_EventChannel::create_proxy (TAO_CEC_ProxyPullConsumer* &x)
+{
+ x = this->factory_->create_proxy_pull_consumer (this);
+}
+
+ACE_INLINE void
+TAO_CEC_EventChannel::destroy_proxy (TAO_CEC_ProxyPullConsumer* consumer)
+{
+ this->factory_->destroy_proxy_pull_consumer (consumer);
+}
+
+ACE_INLINE void
+TAO_CEC_EventChannel::create_proxy_collection (TAO_CEC_ProxyPushConsumer_Collection* &x)
+{
+ x = this->factory_->create_proxy_push_consumer_collection (this);
+}
+
+ACE_INLINE void
+TAO_CEC_EventChannel::destroy_proxy_collection (TAO_CEC_ProxyPushConsumer_Collection* x)
+{
+ this->factory_->destroy_proxy_push_consumer_collection (x);
+}
+
+ACE_INLINE void
+TAO_CEC_EventChannel::create_proxy_collection (TAO_CEC_ProxyPullConsumer_Collection* &x)
+{
+ x = this->factory_->create_proxy_pull_consumer_collection (this);
+}
+
+ACE_INLINE void
+TAO_CEC_EventChannel::destroy_proxy_collection (TAO_CEC_ProxyPullConsumer_Collection* x)
+{
+ this->factory_->destroy_proxy_pull_consumer_collection (x);
+}
+
+ACE_INLINE void
+TAO_CEC_EventChannel::create_proxy_collection (TAO_CEC_ProxyPushSupplier_Collection* &x)
+{
+ x = this->factory_->create_proxy_push_supplier_collection (this);
+}
+
+ACE_INLINE void
+TAO_CEC_EventChannel::destroy_proxy_collection (TAO_CEC_ProxyPushSupplier_Collection* x)
+{
+ this->factory_->destroy_proxy_push_supplier_collection (x);
+}
+
+ACE_INLINE void
+TAO_CEC_EventChannel::create_proxy_collection (TAO_CEC_ProxyPullSupplier_Collection* &x)
+{
+ x = this->factory_->create_proxy_pull_supplier_collection (this);
+}
+
+ACE_INLINE void
+TAO_CEC_EventChannel::destroy_proxy_collection (TAO_CEC_ProxyPullSupplier_Collection* x)
+{
+ this->factory_->destroy_proxy_pull_supplier_collection (x);
+}
+
+ACE_INLINE PortableServer::POA_ptr
+TAO_CEC_EventChannel::supplier_poa (void)
+{
+ return PortableServer::POA::_duplicate (this->supplier_poa_.in ());
+}
+
+ACE_INLINE PortableServer::POA_ptr
+TAO_CEC_EventChannel::consumer_poa (void)
+{
+ return PortableServer::POA::_duplicate (this->consumer_poa_.in ());
+}
+
+ACE_INLINE ACE_Lock*
+TAO_CEC_EventChannel::create_consumer_lock (void)
+{
+ return this->factory_->create_consumer_lock ();
+}
+
+ACE_INLINE void
+TAO_CEC_EventChannel::destroy_consumer_lock (ACE_Lock* x)
+{
+ this->factory_->destroy_consumer_lock (x);
+}
+
+ACE_INLINE ACE_Lock*
+TAO_CEC_EventChannel::create_supplier_lock (void)
+{
+ return this->factory_->create_supplier_lock ();
+}
+
+ACE_INLINE void
+TAO_CEC_EventChannel::destroy_supplier_lock (ACE_Lock* x)
+{
+ this->factory_->destroy_supplier_lock (x);
+}
+
+ACE_INLINE int
+TAO_CEC_EventChannel::consumer_reconnect (void) const
+{
+ return this->consumer_reconnect_;
+}
+
+ACE_INLINE int
+TAO_CEC_EventChannel::supplier_reconnect (void) const
+{
+ return this->supplier_reconnect_;
+}
+
+ACE_INLINE int
+TAO_CEC_EventChannel::disconnect_callbacks (void) const
+{
+ return this->disconnect_callbacks_;
+}
+
+ACE_INLINE TAO_CEC_EventChannel::ServantRetryMap&
+TAO_CEC_EventChannel::get_servant_retry_map (void)
+{
+ return this->retry_map_;
+}
+
+TAO_END_VERSIONED_NAMESPACE_DECL
diff --git a/TAO/orbsvcs/orbsvcs/CosEvent/CEC_Event_Loader.cpp b/TAO/orbsvcs/orbsvcs/CosEvent/CEC_Event_Loader.cpp
new file mode 100644
index 00000000000..e9a9e726717
--- /dev/null
+++ b/TAO/orbsvcs/orbsvcs/CosEvent/CEC_Event_Loader.cpp
@@ -0,0 +1,536 @@
+// $Id$
+
+//==========================================================================
+// LIBRARY
+// libTAO_CosEvent.so
+//
+// DESCRIPTION
+// This class allows for dynamically loading
+// the Event Service.
+//
+// AUTHOR
+// Priyanka Gontla <pgontla@ece.uci.edu>
+// Carlos O'Ryan <coryan@uci.edu>
+// Jon Astle <jon@astle45.fsnet.co.uk>
+//
+//===========================================================================
+
+#include "orbsvcs/CosEvent/CEC_Event_Loader.h"
+#include "ace/Dynamic_Service.h"
+
+#include "orbsvcs/CosNamingC.h"
+#include "orbsvcs/CosEvent/CEC_EventChannel.h"
+#include "orbsvcs/CosEvent/CEC_Default_Factory.h"
+
+#include "ace/Get_Opt.h"
+#include "ace/Argv_Type_Converter.h"
+#include "ace/OS_NS_stdio.h"
+#include "ace/OS_NS_unistd.h"
+#include "tao/debug.h"
+
+ACE_RCSID (CosEvent,
+ CEC_Event_Loader,
+ "$Id$")
+
+TAO_BEGIN_VERSIONED_NAMESPACE_DECL
+
+TAO_CEC_Event_Loader::TAO_CEC_Event_Loader (void) :
+ attributes_ (0)
+ , factory_ (0)
+ , ec_impl_ (0)
+#if defined (TAO_HAS_TYPED_EVENT_CHANNEL)
+ , typed_attributes_ (0)
+ , typed_ec_impl_ (0)
+#endif /* TAO_HAS_TYPED_EVENT_CHANNEL */
+{
+ // Constructor
+}
+
+TAO_CEC_Event_Loader::~TAO_CEC_Event_Loader (void)
+{
+ // Destructor
+}
+
+int
+TAO_CEC_Event_Loader::init (int argc, ACE_TCHAR *argv[])
+{
+ ACE_DECLARE_NEW_CORBA_ENV;
+ ACE_TRY
+ {
+ // Copy command line parameter.
+ ACE_Argv_Type_Converter command_line(argc, argv);
+
+ // ORB initialization boiler plate...
+ this->orb_=
+ CORBA::ORB_init (command_line.get_argc(), command_line.get_ASCII_argv(), 0 ACE_ENV_ARG_PARAMETER);
+ ACE_TRY_CHECK;
+
+ CORBA::Object_var obj =
+ this->create_object (this->orb_.in (), command_line.get_argc(), command_line.get_TCHAR_argv() ACE_ENV_ARG_PARAMETER);
+ ACE_TRY_CHECK;
+
+ if (CORBA::is_nil (obj.in() ))
+ return -1;
+ }
+ ACE_CATCHANY
+ {
+ ACE_PRINT_EXCEPTION (ACE_ANY_EXCEPTION, argv[0]);
+ return -1;
+ }
+ ACE_ENDTRY;
+ return 0;
+}
+
+
+CORBA::Object_ptr
+TAO_CEC_Event_Loader::create_object (CORBA::ORB_ptr orb,
+ int argc,
+ ACE_TCHAR *argv[]
+ ACE_ENV_ARG_DECL)
+ ACE_THROW_SPEC ((CORBA::SystemException))
+{
+ ACE_TRY
+ {
+ // ****************************************************************
+
+ // @@ Some ideas for improvement (not that you have to implement
+ // them):
+ // - Receive a child POA name from the command line, and create
+ // all the objects in that child POA (easier to destroy stuff
+ // that way).
+ // - Receive an option to register the Event Service with the
+ // _tao_add_to_IOR_table() stuff..
+
+ // Parse the options, check if we should bind with the naming
+ // service and under what name...
+ ACE_Get_Opt get_opt (argc, argv, ACE_TEXT("n:o:p:xrtdb"));
+ int opt;
+ const ACE_TCHAR *service_name = ACE_TEXT("CosEventService");
+ const ACE_TCHAR *ior_file = 0;
+ const ACE_TCHAR *pid_file = 0;
+ this->bind_to_naming_service_ = 1;
+ int use_rebind = 0;
+ int disconnect_callbacks = 0;
+
+#if defined (TAO_HAS_TYPED_EVENT_CHANNEL)
+ // Flag to create a typed event channel
+ int typed_ec = 0;
+ // Flag to destroy the event channel on shutdown
+ int destroy = 0;
+#endif /* TAO_HAS_TYPED_EVENT_CHANNEL */
+
+ while ((opt = get_opt ()) != EOF)
+ {
+ switch (opt)
+ {
+ case 'n':
+ service_name = get_opt.opt_arg ();
+ break;
+
+ case 'o':
+ ior_file = get_opt.opt_arg ();
+ break;
+
+ case 'p':
+ pid_file = get_opt.opt_arg ();
+ break;
+
+ case 'x':
+ this->bind_to_naming_service_ = 0;
+ break;
+
+ case 'r':
+ use_rebind = 1;
+ break;
+
+ case 'b':
+ disconnect_callbacks = 1;
+ break;
+
+#if defined (TAO_HAS_TYPED_EVENT_CHANNEL)
+ case 't':
+ typed_ec = 1;
+ break;
+
+ case 'd':
+ destroy = 1;
+ break;
+#endif /* TAO_HAS_TYPED_EVENT_CHANNEL */
+
+ case '?':
+ default:
+#if defined (TAO_HAS_TYPED_EVENT_CHANNEL)
+ ACE_DEBUG ((LM_DEBUG,
+ ACE_TEXT ("Usage: %s ")
+ ACE_TEXT ("-n service_name ")
+ ACE_TEXT ("-o ior_file_name ")
+ ACE_TEXT ("-p pid_file_name ")
+ ACE_TEXT ("-x [disable naming service bind]")
+ ACE_TEXT ("-r [rebind, no AlreadyBound failures] ")
+ ACE_TEXT ("-b [send callBacks on disconnect] ")
+ ACE_TEXT ("-t [enable typed event channel]")
+ ACE_TEXT ("-d [destroy typed event channelon shutdown] ")
+ ACE_TEXT ("\n"),
+ argv[0]));
+#else
+ ACE_DEBUG ((LM_DEBUG,
+ ACE_TEXT ("Usage: %s ")
+ ACE_TEXT ("-n service_name ")
+ ACE_TEXT ("-o ior_file_name ")
+ ACE_TEXT ("-p pid_file_name ")
+ ACE_TEXT ("-x [disable naming service bind] ")
+ ACE_TEXT ("-r [rebind, no AlreadyBound failures] ")
+ ACE_TEXT ("-b [send callBacks on disconnect] ")
+ ACE_TEXT ("\n"),
+ argv[0]));
+#endif /* TAO_HAS_TYPED_EVENT_CHANNEL */
+ return CORBA::Object::_nil ();
+ }
+ }
+
+ // ***************************************************************
+
+ // POA initialization and activation ...
+ CORBA::Object_var object =
+ orb->resolve_initial_references ("RootPOA" ACE_ENV_ARG_PARAMETER);
+ ACE_TRY_CHECK;
+ PortableServer::POA_var poa =
+ PortableServer::POA::_narrow (object.in () ACE_ENV_ARG_PARAMETER);
+ ACE_TRY_CHECK;
+ PortableServer::POAManager_var poa_manager =
+ poa->the_POAManager (ACE_ENV_SINGLE_ARG_PARAMETER);
+ ACE_TRY_CHECK;
+ poa_manager->activate (ACE_ENV_SINGLE_ARG_PARAMETER);
+ ACE_TRY_CHECK;
+
+
+ // ****************************************************************
+
+ // Control the event loop
+ this->terminate_flag_ = 0;
+
+#if defined (TAO_HAS_TYPED_EVENT_CHANNEL)
+ if (!typed_ec)
+ {
+#endif /* TAO_HAS_TYPED_EVENT_CHANNEL */
+
+ // Create and activate the event service
+ this->attributes_ = new TAO_CEC_EventChannel_Attributes(poa.in (),
+ poa.in ());
+
+ this->attributes_->disconnect_callbacks = disconnect_callbacks;
+
+ this->factory_ = 0;
+
+ this->ec_impl_ = new TAO_CEC_EventChannel (*this->attributes_,
+ this->factory_,
+ this->terminate_flag_);
+
+ this->ec_impl_->activate (ACE_ENV_SINGLE_ARG_PARAMETER);
+ ACE_TRY_CHECK;
+
+ CosEventChannelAdmin::EventChannel_var event_channel =
+ this->ec_impl_->_this (ACE_ENV_SINGLE_ARG_PARAMETER);
+ ACE_TRY_CHECK;
+
+ if (ior_file != 0)
+ {
+ CORBA::String_var ior =
+ orb->object_to_string (event_channel.in () ACE_ENV_ARG_PARAMETER);
+ ACE_TRY_CHECK;
+
+ FILE *iorf = ACE_OS::fopen (ior_file, ACE_TEXT("w"));
+ if (iorf != 0)
+ {
+ ACE_OS::fprintf (iorf, "%s\n", ior.in ());
+ ACE_OS::fclose (iorf);
+ }
+ }
+
+ if (pid_file != 0)
+ {
+ FILE *pidf = ACE_OS::fopen (pid_file, ACE_TEXT("w"));
+ if (pidf != 0)
+ {
+ ACE_OS::fprintf (pidf,
+ "%ld\n",
+ static_cast<long> (ACE_OS::getpid ()));
+ ACE_OS::fclose (pidf);
+ }
+ }
+
+ // ****************************************************************
+
+ this->channel_name_.length (1);
+
+ if (this->bind_to_naming_service_)
+ {
+ CORBA::Object_var obj =
+ orb->resolve_initial_references ("NameService"
+ ACE_ENV_ARG_PARAMETER);
+ ACE_TRY_CHECK;
+
+ this->naming_context_ =
+ CosNaming::NamingContext::_narrow (obj.in ()
+ ACE_ENV_ARG_PARAMETER);
+ ACE_TRY_CHECK;
+
+ this->channel_name_.length (1);
+ this->channel_name_[0].id = CORBA::string_dup (ACE_TEXT_ALWAYS_CHAR(service_name));
+
+ if (use_rebind)
+ {
+ this->naming_context_->rebind (this->channel_name_,
+ event_channel.in ()
+ ACE_ENV_ARG_PARAMETER);
+ ACE_TRY_CHECK;
+ }
+ else
+ {
+ this->naming_context_->bind (this->channel_name_,
+ event_channel.in ()
+ ACE_ENV_ARG_PARAMETER);
+ ACE_TRY_CHECK;
+ }
+ }
+ return CosEventChannelAdmin::EventChannel::_duplicate (event_channel.in () );
+
+#if defined (TAO_HAS_TYPED_EVENT_CHANNEL)
+ }
+ else
+ {
+ // If Typed EC, initialize the IFR, then create and activate the typed event service
+
+ // ****************************************************************
+ // IFR initialization
+ if (TAO_debug_level >= 10)
+ {
+ ACE_DEBUG ((LM_DEBUG,
+ ACE_TEXT ("***** Initializing the IFR connection... *****\n")));
+ }
+
+ CORBA::Repository_var interface_repository;
+
+ CORBA::Object_var ifr_obj_var =
+ orb->resolve_initial_references ("InterfaceRepository" ACE_ENV_ARG_PARAMETER);
+ ACE_TRY_CHECK;
+
+ if (CORBA::is_nil(ifr_obj_var.in () ))
+ {
+ if (TAO_debug_level >= 10)
+ {
+ ACE_DEBUG ((LM_DEBUG,
+ ACE_TEXT ("***** resolve_initial_references for IFR failed\n *****")));
+ }
+ return CORBA::Object::_nil ();
+ }
+ else
+ {
+ interface_repository = CORBA::Repository::_narrow(ifr_obj_var.in ()
+ ACE_ENV_ARG_PARAMETER);
+ ACE_TRY_CHECK;
+
+ if (CORBA::is_nil(interface_repository.in () ))
+ {
+ if (TAO_debug_level >= 10)
+ {
+ ACE_DEBUG ((LM_DEBUG,
+ ACE_TEXT ("***** CORBA::Repository::_narrow failed *****\n")));
+ }
+ return CORBA::Object::_nil ();
+ }
+ else
+ {
+ if (TAO_debug_level >= 10)
+ {
+ ACE_DEBUG ((LM_DEBUG,
+ ACE_TEXT ("***** ...IFR connection completed *****\n")));
+ }
+ }
+ }
+
+ // Create and activate the typed event service
+ this->typed_attributes_ = new TAO_CEC_TypedEventChannel_Attributes(poa.in (),
+ poa.in (),
+ orb,
+ interface_repository.in ());
+ if (destroy == 1)
+ {
+ this->typed_attributes_->destroy_on_shutdown = 1;
+ }
+
+ this->typed_attributes_->disconnect_callbacks = disconnect_callbacks;
+
+ this->factory_ = 0;
+
+ this->typed_ec_impl_ = new TAO_CEC_TypedEventChannel (*this->typed_attributes_,
+ this->factory_,
+ this->terminate_flag_);
+
+ this->typed_ec_impl_->activate (ACE_ENV_SINGLE_ARG_PARAMETER);
+ ACE_TRY_CHECK;
+
+ CosTypedEventChannelAdmin::TypedEventChannel_var event_channel =
+ this->typed_ec_impl_->_this (ACE_ENV_SINGLE_ARG_PARAMETER);
+ ACE_TRY_CHECK;
+
+ if (ior_file != 0)
+ {
+ CORBA::String_var ior =
+ orb->object_to_string (event_channel.in () ACE_ENV_ARG_PARAMETER);
+ ACE_TRY_CHECK;
+
+ FILE *iorf = ACE_OS::fopen (ior_file, ACE_TEXT("w"));
+ if (iorf != 0)
+ {
+ ACE_OS::fprintf (iorf, "%s\n", ior.in ());
+ ACE_OS::fclose (iorf);
+ }
+ }
+
+ if (pid_file != 0)
+ {
+ FILE *pidf = ACE_OS::fopen (pid_file, ACE_TEXT("w"));
+ if (pidf != 0)
+ {
+ ACE_OS::fprintf (pidf,
+ "%ld\n",
+ static_cast<long> (ACE_OS::getpid ()));
+ ACE_OS::fclose (pidf);
+ }
+ }
+
+ // ****************************************************************
+
+ this->channel_name_.length (1);
+
+ if (this->bind_to_naming_service_)
+ {
+ CORBA::Object_var obj =
+ orb->resolve_initial_references ("NameService"
+ ACE_ENV_ARG_PARAMETER);
+ ACE_TRY_CHECK;
+
+ this->naming_context_ =
+ CosNaming::NamingContext::_narrow (obj.in ()
+ ACE_ENV_ARG_PARAMETER);
+ ACE_TRY_CHECK;
+
+ this->channel_name_.length (1);
+ this->channel_name_[0].id = CORBA::string_dup (ACE_TEXT_ALWAYS_CHAR(service_name));
+
+ if (use_rebind)
+ {
+ this->naming_context_->rebind (this->channel_name_,
+ event_channel.in ()
+ ACE_ENV_ARG_PARAMETER);
+ ACE_TRY_CHECK;
+ }
+ else
+ {
+ this->naming_context_->bind (this->channel_name_,
+ event_channel.in ()
+ ACE_ENV_ARG_PARAMETER);
+ ACE_TRY_CHECK;
+ }
+ }
+ return CosTypedEventChannelAdmin::TypedEventChannel::_duplicate (event_channel.in () );
+ }
+#endif /* TAO_HAS_TYPED_EVENT_CHANNEL */
+
+ // ****************************************************************
+ }
+ ACE_CATCHANY
+ {
+ ACE_PRINT_EXCEPTION (ACE_ANY_EXCEPTION, argv[0]);
+ return CORBA::Object::_nil ();
+ }
+ ACE_ENDTRY;
+}
+
+int
+TAO_CEC_Event_Loader::fini (void)
+{
+ // + Since it was activated with _this() you have to do the
+ // canonical:
+ // get_object_id
+ ACE_DECLARE_NEW_CORBA_ENV;
+ ACE_TRY
+ {
+#if defined (TAO_HAS_TYPED_EVENT_CHANNEL)
+ if(this->typed_ec_impl_)
+ {
+ // Release the resources of the Typed Event Channel
+ this->typed_ec_impl_->destroy (ACE_ENV_SINGLE_ARG_PARAMETER);
+ ACE_TRY_CHECK;
+
+ // Deactivate the Typed EC
+ // This will raise an exception if destroy == 1
+ PortableServer::POA_var t_poa =
+ this->typed_ec_impl_->_default_POA (ACE_ENV_SINGLE_ARG_PARAMETER);
+ ACE_TRY_CHECK;
+
+ PortableServer::ObjectId_var t_id =
+ t_poa->servant_to_id (this->typed_ec_impl_ ACE_ENV_ARG_PARAMETER);
+ ACE_TRY_CHECK;
+
+ t_poa->deactivate_object (t_id.in () ACE_ENV_ARG_PARAMETER);
+ ACE_TRY_CHECK;
+ }
+#else
+ // Release the resources of the Event Channel
+ this->ec_impl_->destroy (ACE_ENV_SINGLE_ARG_PARAMETER);
+ ACE_TRY_CHECK;
+
+ // Deactivate the EC
+ PortableServer::POA_var poa =
+ this->ec_impl_->_default_POA (ACE_ENV_SINGLE_ARG_PARAMETER);
+ ACE_TRY_CHECK;
+
+ PortableServer::ObjectId_var id =
+ poa->servant_to_id (this->ec_impl_ ACE_ENV_ARG_PARAMETER);
+ ACE_TRY_CHECK;
+
+ poa->deactivate_object (id.in () ACE_ENV_ARG_PARAMETER);
+ ACE_TRY_CHECK;
+#endif /* TAO_HAS_TYPED_EVENT_CHANNEL */
+ }
+ ACE_CATCHANY
+ {
+ // Do Nothing
+ }
+ ACE_ENDTRY;
+ ACE_CHECK_RETURN (-1);
+
+ ACE_TRY_EX (foo)
+ {
+ // Unbind the Naming Service
+ if (this->bind_to_naming_service_)
+ {
+ this->naming_context_->unbind (this->channel_name_
+ ACE_ENV_ARG_PARAMETER);
+ ACE_TRY_CHECK_EX (foo);
+ }
+
+#if defined (TAO_HAS_TYPED_EVENT_CHANNEL)
+ // Since we created them, we also have to delete them.
+ delete this->typed_attributes_;
+ delete this->typed_ec_impl_;
+#endif /* TAO_HAS_TYPED_EVENT_CHANNEL */
+ delete this->attributes_;
+ delete this->ec_impl_;
+ }
+ ACE_CATCHANY
+ {
+ // Do Nothing
+ return -1;
+ }
+ ACE_ENDTRY;
+ ACE_CHECK_RETURN (-1);
+
+ return 0;
+}
+
+TAO_END_VERSIONED_NAMESPACE_DECL
+
+ACE_FACTORY_DEFINE (TAO_Event_Serv, TAO_CEC_Event_Loader)
diff --git a/TAO/orbsvcs/orbsvcs/CosEvent/CEC_Event_Loader.h b/TAO/orbsvcs/orbsvcs/CosEvent/CEC_Event_Loader.h
new file mode 100644
index 00000000000..28bfe57bad7
--- /dev/null
+++ b/TAO/orbsvcs/orbsvcs/CosEvent/CEC_Event_Loader.h
@@ -0,0 +1,110 @@
+// -*- C++ -*-
+
+/**
+ * @file CEC_Event_Loader.h
+ *
+ * $Id$
+ *
+ * Define a class to dynamically load the COS Event Service.
+ *
+ * @author Priyanka Gontla <pgontla@ece.uci.edu>
+ */
+
+#ifndef TAO_CEC_EVENT_LOADER_H
+#define TAO_CEC_EVENT_LOADER_H
+
+#include "tao/Object_Loader.h"
+
+#if !defined (ACE_LACKS_PRAGMA_ONCE)
+# pragma once
+#endif /* ACE_LACKS_PRAGMA_ONCE */
+
+#include "orbsvcs/CosEvent/CEC_EventChannel.h"
+
+#if defined (TAO_HAS_TYPED_EVENT_CHANNEL)
+#include "orbsvcs/CosEvent/CEC_TypedEventChannel.h"
+#endif /* TAO_HAS_TYPED_EVENT_CHANNEL */
+
+#include "orbsvcs/CosNamingC.h"
+
+#include "ace/Service_Config.h"
+
+TAO_BEGIN_VERSIONED_NAMESPACE_DECL
+
+/**
+ * @class TAO_CEC_Event_Loader
+ *
+ * @brief Dynamically load an instance of the COS Event Service.
+ */
+class TAO_Event_Serv_Export TAO_CEC_Event_Loader : public TAO_Object_Loader
+{
+public:
+ /// Constructor
+ TAO_CEC_Event_Loader (void);
+
+ /// Destructor
+ ~TAO_CEC_Event_Loader (void);
+
+ //@{
+ /**
+ * @name Derived from ACE_Service_Object
+ */
+ virtual int init (int argc, ACE_TCHAR *argv[]);
+ virtual int fini (void);
+ //@}
+
+ //@{
+ /**
+ * @name Derived from TAO_Object_Loader
+ */
+ virtual CORBA::Object_ptr create_object (CORBA::ORB_ptr orb,
+ int argc,
+ ACE_TCHAR *argv[]
+ ACE_ENV_ARG_DECL)
+ ACE_THROW_SPEC ((CORBA::SystemException));
+ //@}
+
+protected:
+ /// Keep a pointer to the underlying ORB.
+ CORBA::ORB_var orb_;
+
+ /// Flag to control the event loop
+ int terminate_flag_;
+
+ /// Attributes used to configure the Event Service properties.
+ TAO_CEC_EventChannel_Attributes *attributes_;
+
+ /// Factory used to configure the Event Service strategies.
+ TAO_CEC_Factory *factory_;
+
+ /// The Event Service implementation class.
+ TAO_CEC_EventChannel *ec_impl_;
+
+#if defined (TAO_HAS_TYPED_EVENT_CHANNEL)
+ /// Attributes used to configure the Typed Event Service properties.
+ TAO_CEC_TypedEventChannel_Attributes *typed_attributes_;
+
+ /// The Typed Event Service implementation class.
+ TAO_CEC_TypedEventChannel *typed_ec_impl_;
+#endif /* TAO_HAS_TYPED_EVENT_CHANNEL */
+
+ /// Naming Context needed if '-x' option is passed
+ CosNaming::NamingContext_var naming_context_;
+
+ /// Flag to check if '-x' option is passed
+ int bind_to_naming_service_;
+
+ /// The name used when binding to the NamingService.
+ CosNaming::Name channel_name_;
+
+private:
+ // Disallow copying and assignment.
+ TAO_CEC_Event_Loader (const TAO_CEC_Event_Loader &);
+ TAO_CEC_Event_Loader &operator= (const TAO_CEC_Event_Loader &);
+};
+
+TAO_END_VERSIONED_NAMESPACE_DECL
+
+ACE_FACTORY_DECLARE (TAO_Event_Serv, TAO_CEC_Event_Loader)
+
+#endif /* TAO_CEC_EVENT_LOADER_H */
diff --git a/TAO/orbsvcs/orbsvcs/CosEvent/CEC_Factory.cpp b/TAO/orbsvcs/orbsvcs/CosEvent/CEC_Factory.cpp
new file mode 100644
index 00000000000..e2ffe759211
--- /dev/null
+++ b/TAO/orbsvcs/orbsvcs/CosEvent/CEC_Factory.cpp
@@ -0,0 +1,14 @@
+// $Id$
+
+#include "orbsvcs/CosEvent/CEC_Factory.h"
+#include "ace/Dynamic_Service.h"
+
+ACE_RCSID(CosEvent, CEC_Factory, "$Id$")
+
+TAO_BEGIN_VERSIONED_NAMESPACE_DECL
+
+TAO_CEC_Factory::~TAO_CEC_Factory (void)
+{
+}
+
+TAO_END_VERSIONED_NAMESPACE_DECL
diff --git a/TAO/orbsvcs/orbsvcs/CosEvent/CEC_Factory.h b/TAO/orbsvcs/orbsvcs/CosEvent/CEC_Factory.h
new file mode 100644
index 00000000000..787bdca5177
--- /dev/null
+++ b/TAO/orbsvcs/orbsvcs/CosEvent/CEC_Factory.h
@@ -0,0 +1,235 @@
+// -*- C++ -*-
+
+//=============================================================================
+/**
+ * @file CEC_Factory.h
+ *
+ * $Id$
+ *
+ * @author Carlos O'Ryan (coryan@cs.wustl.edu)
+ */
+//=============================================================================
+
+
+#ifndef TAO_CEC_FACTORY_H
+#define TAO_CEC_FACTORY_H
+
+#include /**/ "ace/pre.h"
+
+#include "orbsvcs/CosEvent/event_serv_export.h"
+
+#if !defined (ACE_LACKS_PRAGMA_ONCE)
+# pragma once
+#endif /* ACE_LACKS_PRAGMA_ONCE */
+
+#include "ace/Service_Object.h"
+
+#if defined (TAO_HAS_TYPED_EVENT_CHANNEL)
+#include "tao/AnyTypeCode/AnyTypeCode_methods.h"
+#endif
+
+#include "tao/Policy_ForwardC.h"
+#include "tao/Versioned_Namespace.h"
+
+ACE_BEGIN_VERSIONED_NAMESPACE_DECL
+class ACE_Lock;
+ACE_END_VERSIONED_NAMESPACE_DECL
+
+TAO_BEGIN_VERSIONED_NAMESPACE_DECL
+
+class TAO_CEC_EventChannel;
+
+class TAO_CEC_Dispatching;
+class TAO_CEC_Pulling_Strategy;
+class TAO_CEC_ConsumerAdmin;
+class TAO_CEC_SupplierAdmin;
+class TAO_CEC_ProxyPushConsumer;
+class TAO_CEC_ProxyPullConsumer;
+class TAO_CEC_ProxyPushSupplier;
+class TAO_CEC_ProxyPullSupplier;
+template<class PROXY> class TAO_ESF_Proxy_Collection;
+class TAO_CEC_ConsumerControl;
+class TAO_CEC_SupplierControl;
+
+#if defined (TAO_HAS_TYPED_EVENT_CHANNEL)
+class TAO_CEC_TypedEventChannel;
+class TAO_CEC_TypedProxyPushConsumer;
+class TAO_CEC_TypedConsumerAdmin;
+class TAO_CEC_TypedSupplierAdmin;
+#endif /* TAO_HAS_TYPED_EVENT_CHANNEL */
+
+typedef TAO_ESF_Proxy_Collection<TAO_CEC_ProxyPushConsumer> TAO_CEC_ProxyPushConsumer_Collection;
+#if defined (TAO_HAS_TYPED_EVENT_CHANNEL)
+typedef TAO_ESF_Proxy_Collection<TAO_CEC_TypedProxyPushConsumer> TAO_CEC_TypedProxyPushConsumer_Collection;
+#endif /* TAO_HAS_TYPED_EVENT_CHANNEL */
+typedef TAO_ESF_Proxy_Collection<TAO_CEC_ProxyPullConsumer> TAO_CEC_ProxyPullConsumer_Collection;
+typedef TAO_ESF_Proxy_Collection<TAO_CEC_ProxyPushSupplier> TAO_CEC_ProxyPushSupplier_Collection;
+typedef TAO_ESF_Proxy_Collection<TAO_CEC_ProxyPullSupplier> TAO_CEC_ProxyPullSupplier_Collection;
+
+/**
+ * @class TAO_CEC_Factory
+ *
+ * @brief Abstract factory for the CosEventChannel components.
+ *
+ * The CosEventChannel implementation can be configured at
+ * initialization time through several strategies and
+ * components. This class defines the interface of an Abstract
+ * Factory that creates all such components.
+ * = MEMORY MANAGMENT
+ * The objects it creates are owned by this class, the client must
+ * invoke the corresponding destroy() method to release them.
+ * Some implementations may require a different instance for the
+ * CEC_Factory for each instance of a CEC_EventChannel.
+ */
+class TAO_Event_Serv_Export TAO_CEC_Factory : public ACE_Service_Object
+{
+public:
+ /// destructor...
+ virtual ~TAO_CEC_Factory (void);
+
+ /// Create and destroy the dispatching module.
+ virtual TAO_CEC_Dispatching*
+ create_dispatching (TAO_CEC_EventChannel*) = 0;
+#if defined (TAO_HAS_TYPED_EVENT_CHANNEL)
+ virtual TAO_CEC_Dispatching*
+ create_dispatching (TAO_CEC_TypedEventChannel*) = 0;
+#endif /* TAO_HAS_TYPED_EVENT_CHANNEL */
+ virtual void
+ destroy_dispatching (TAO_CEC_Dispatching*) = 0;
+
+ /// Create and destroy the pulling strategy.
+ virtual TAO_CEC_Pulling_Strategy*
+ create_pulling_strategy (TAO_CEC_EventChannel*) = 0;
+ virtual void
+ destroy_pulling_strategy (TAO_CEC_Pulling_Strategy*) = 0;
+
+ /// Create and destroy the consumer admin implementation.
+ virtual TAO_CEC_ConsumerAdmin*
+ create_consumer_admin (TAO_CEC_EventChannel*) = 0;
+ virtual void
+ destroy_consumer_admin (TAO_CEC_ConsumerAdmin*) = 0;
+#if defined (TAO_HAS_TYPED_EVENT_CHANNEL)
+ virtual TAO_CEC_TypedConsumerAdmin*
+ create_consumer_admin (TAO_CEC_TypedEventChannel*) = 0;
+ virtual void
+ destroy_consumer_admin (TAO_CEC_TypedConsumerAdmin*) = 0;
+#endif /* TAO_HAS_TYPED_EVENT_CHANNEL */
+
+ /// Create and destroy the supplier admin implementation.
+ virtual TAO_CEC_SupplierAdmin*
+ create_supplier_admin (TAO_CEC_EventChannel*) = 0;
+ virtual void
+ destroy_supplier_admin (TAO_CEC_SupplierAdmin*) = 0;
+#if defined (TAO_HAS_TYPED_EVENT_CHANNEL)
+ virtual TAO_CEC_TypedSupplierAdmin*
+ create_supplier_admin (TAO_CEC_TypedEventChannel*) = 0;
+ virtual void
+ destroy_supplier_admin (TAO_CEC_TypedSupplierAdmin*) = 0;
+#endif /* TAO_HAS_TYPED_EVENT_CHANNEL */
+
+ /// Create and destroy a ProxyPushSupplier
+ virtual TAO_CEC_ProxyPushSupplier*
+ create_proxy_push_supplier (TAO_CEC_EventChannel*) = 0;
+#if defined (TAO_HAS_TYPED_EVENT_CHANNEL)
+ virtual TAO_CEC_ProxyPushSupplier*
+ create_proxy_push_supplier (TAO_CEC_TypedEventChannel*) = 0;
+#endif /* TAO_HAS_TYPED_EVENT_CHANNEL */
+ virtual void
+ destroy_proxy_push_supplier (TAO_CEC_ProxyPushSupplier*) = 0;
+
+ /// Create and destroy a ProxyPullSupplier
+ virtual TAO_CEC_ProxyPullSupplier*
+ create_proxy_pull_supplier (TAO_CEC_EventChannel*) = 0;
+ virtual void
+ destroy_proxy_pull_supplier (TAO_CEC_ProxyPullSupplier*) = 0;
+
+ /// Create and destroy a ProxyPushConsumer
+ virtual TAO_CEC_ProxyPushConsumer*
+ create_proxy_push_consumer (TAO_CEC_EventChannel*) = 0;
+ virtual void
+ destroy_proxy_push_consumer (TAO_CEC_ProxyPushConsumer*) = 0;
+
+#if defined (TAO_HAS_TYPED_EVENT_CHANNEL)
+ /// Create and destroy a TypedProxyPushConsumer
+ virtual TAO_CEC_TypedProxyPushConsumer*
+ create_proxy_push_consumer (TAO_CEC_TypedEventChannel*) = 0;
+ virtual void
+ destroy_proxy_push_consumer (TAO_CEC_TypedProxyPushConsumer*) = 0;
+#endif /* TAO_HAS_TYPED_EVENT_CHANNEL */
+
+ /// Create and destroy a ProxyPullConsumer
+ virtual TAO_CEC_ProxyPullConsumer*
+ create_proxy_pull_consumer (TAO_CEC_EventChannel*) = 0;
+ virtual void
+ destroy_proxy_pull_consumer (TAO_CEC_ProxyPullConsumer*) = 0;
+
+ /// Create and destroy a collection of TAO_CEC_ProxyPushConsumers
+ virtual TAO_CEC_ProxyPushConsumer_Collection*
+ create_proxy_push_consumer_collection (TAO_CEC_EventChannel*) = 0;
+ virtual void
+ destroy_proxy_push_consumer_collection (TAO_CEC_ProxyPushConsumer_Collection*) = 0;
+
+#if defined (TAO_HAS_TYPED_EVENT_CHANNEL)
+ /// Create and destroy a collection of TAO_CEC_TypedProxyPushConsumers
+ virtual TAO_CEC_TypedProxyPushConsumer_Collection*
+ create_proxy_push_consumer_collection (TAO_CEC_TypedEventChannel*) = 0;
+ virtual void
+ destroy_proxy_push_consumer_collection (TAO_CEC_TypedProxyPushConsumer_Collection*) = 0;
+#endif /* TAO_HAS_TYPED_EVENT_CHANNEL */
+
+ /// Create and destroy a collection of TAO_CEC_ProxyPullConsumers
+ virtual TAO_CEC_ProxyPullConsumer_Collection*
+ create_proxy_pull_consumer_collection (TAO_CEC_EventChannel*) = 0;
+ virtual void
+ destroy_proxy_pull_consumer_collection (TAO_CEC_ProxyPullConsumer_Collection*) = 0;
+
+ /// Create and destroy a collection of TAO_CEC_ProxyPushSuppliers
+ virtual TAO_CEC_ProxyPushSupplier_Collection*
+ create_proxy_push_supplier_collection (TAO_CEC_EventChannel*) = 0;
+#if defined (TAO_HAS_TYPED_EVENT_CHANNEL)
+ virtual TAO_CEC_ProxyPushSupplier_Collection*
+ create_proxy_push_supplier_collection (TAO_CEC_TypedEventChannel*) = 0;
+#endif /* TAO_HAS_TYPED_EVENT_CHANNEL */
+ virtual void
+ destroy_proxy_push_supplier_collection (TAO_CEC_ProxyPushSupplier_Collection*) = 0;
+
+ /// Create and destroy a collection of TAO_CEC_ProxyPullSuppliers
+ virtual TAO_CEC_ProxyPullSupplier_Collection*
+ create_proxy_pull_supplier_collection (TAO_CEC_EventChannel*) = 0;
+ virtual void
+ destroy_proxy_pull_supplier_collection (TAO_CEC_ProxyPullSupplier_Collection*) = 0;
+
+ /// Create and destroy the locking strategies for both
+ /// ProxyPushConsumers and ProxyPushSuppliers
+ virtual ACE_Lock* create_consumer_lock (void) = 0;
+ virtual void destroy_consumer_lock (ACE_Lock*) = 0;
+ virtual ACE_Lock* create_supplier_lock (void) = 0;
+ virtual void destroy_supplier_lock (ACE_Lock*) = 0;
+
+ /// The ConsumerControl and SupplierControl strategies are used to
+ /// discard non-existent consumers and suppliers
+ virtual TAO_CEC_ConsumerControl*
+ create_consumer_control (TAO_CEC_EventChannel*) = 0;
+#if defined (TAO_HAS_TYPED_EVENT_CHANNEL)
+ virtual TAO_CEC_ConsumerControl*
+ create_consumer_control (TAO_CEC_TypedEventChannel*) = 0;
+#endif /* TAO_HAS_TYPED_EVENT_CHANNEL */
+ virtual void
+ destroy_consumer_control (TAO_CEC_ConsumerControl*) = 0;
+ virtual TAO_CEC_SupplierControl*
+ create_supplier_control (TAO_CEC_EventChannel*) = 0;
+#if defined (TAO_HAS_TYPED_EVENT_CHANNEL)
+ virtual TAO_CEC_SupplierControl*
+ create_supplier_control (TAO_CEC_TypedEventChannel*) = 0;
+#endif /* TAO_HAS_TYPED_EVENT_CHANNEL */
+ virtual void
+ destroy_supplier_control (TAO_CEC_SupplierControl*) = 0;
+
+ virtual CORBA::Policy_ptr
+ create_roundtrip_timeout_policy (const ACE_Time_Value &timeout) = 0;
+};
+
+TAO_END_VERSIONED_NAMESPACE_DECL
+
+#include /**/ "ace/post.h"
+#endif /* TAO_CEC_FACTORY_H */
diff --git a/TAO/orbsvcs/orbsvcs/CosEvent/CEC_MT_Dispatching.cpp b/TAO/orbsvcs/orbsvcs/CosEvent/CEC_MT_Dispatching.cpp
new file mode 100644
index 00000000000..41f29d8a59e
--- /dev/null
+++ b/TAO/orbsvcs/orbsvcs/CosEvent/CEC_MT_Dispatching.cpp
@@ -0,0 +1,108 @@
+// $Id$
+
+#include "orbsvcs/CosEvent/CEC_MT_Dispatching.h"
+
+ACE_RCSID(CosEvent, CEC_MT_Dispatching, "$Id$")
+
+TAO_BEGIN_VERSIONED_NAMESPACE_DECL
+
+
+
+
+TAO_CEC_MT_Dispatching::TAO_CEC_MT_Dispatching (int nthreads,
+ int thread_creation_flags,
+ int thread_priority,
+ int force_activate)
+ : nthreads_ (nthreads),
+ thread_creation_flags_ (thread_creation_flags),
+ thread_priority_ (thread_priority),
+ force_activate_ (force_activate),
+ task_ (&this->thread_manager_),
+ active_ (0)
+{
+}
+
+void
+TAO_CEC_MT_Dispatching::activate (void)
+{
+ ACE_GUARD (TAO_SYNCH_MUTEX, ace_mon, this->lock_);
+
+ if (this->active_ != 0)
+ return;
+
+ this->active_ = 1;
+
+ if (this->task_.activate (this->thread_creation_flags_,
+ this->nthreads_,
+ 1,
+ this->thread_priority_) == -1)
+ {
+ if (this->force_activate_ != 0)
+ {
+ if (this->task_.activate (THR_BOUND, this->nthreads_) == -1)
+ ACE_ERROR ((LM_ERROR,
+ "EC (%P|%t) cannot activate dispatching queue"));
+ }
+ }
+}
+
+void
+TAO_CEC_MT_Dispatching::shutdown (void)
+{
+ ACE_GUARD (TAO_SYNCH_MUTEX, ace_mon, this->lock_);
+
+ if (this->active_ == 0)
+ return;
+
+ for (int i = 0; i < this->nthreads_; ++i)
+ {
+ this->task_.putq (new TAO_CEC_Shutdown_Task_Command);
+ }
+ this->thread_manager_.wait ();
+}
+
+void
+TAO_CEC_MT_Dispatching::push (TAO_CEC_ProxyPushSupplier* proxy,
+ const CORBA::Any& event
+ ACE_ENV_ARG_DECL)
+{
+ CORBA::Any event_copy = event;
+ this->push_nocopy (proxy, event_copy ACE_ENV_ARG_PARAMETER);
+}
+
+void
+TAO_CEC_MT_Dispatching::push_nocopy (TAO_CEC_ProxyPushSupplier* proxy,
+ CORBA::Any& event
+ ACE_ENV_ARG_DECL)
+{
+ // Double checked locking....
+ if (this->active_ == 0)
+ this->activate ();
+
+ this->task_.push (proxy, event ACE_ENV_ARG_PARAMETER);
+}
+
+#if defined (TAO_HAS_TYPED_EVENT_CHANNEL)
+void
+TAO_CEC_MT_Dispatching::invoke (TAO_CEC_ProxyPushSupplier* proxy,
+ const TAO_CEC_TypedEvent& typed_event
+ ACE_ENV_ARG_DECL)
+{
+ TAO_CEC_TypedEvent typed_event_copy = typed_event;
+ this->invoke_nocopy (proxy, typed_event_copy ACE_ENV_ARG_PARAMETER);
+}
+
+void
+TAO_CEC_MT_Dispatching::invoke_nocopy (TAO_CEC_ProxyPushSupplier* proxy,
+ TAO_CEC_TypedEvent& typed_event
+ ACE_ENV_ARG_DECL)
+{
+ // Double checked locking....
+ if (this->active_ == 0)
+ this->activate ();
+
+ this->task_.invoke (proxy, typed_event ACE_ENV_ARG_PARAMETER);
+}
+#endif /* TAO_HAS_TYPED_EVENT_CHANNEL */
+
+TAO_END_VERSIONED_NAMESPACE_DECL
diff --git a/TAO/orbsvcs/orbsvcs/CosEvent/CEC_MT_Dispatching.h b/TAO/orbsvcs/orbsvcs/CosEvent/CEC_MT_Dispatching.h
new file mode 100644
index 00000000000..458110cad9a
--- /dev/null
+++ b/TAO/orbsvcs/orbsvcs/CosEvent/CEC_MT_Dispatching.h
@@ -0,0 +1,100 @@
+// -*- C++ -*-
+
+//=============================================================================
+/**
+ * @file CEC_MT_Dispatching.h
+ *
+ * $Id$
+ *
+ * @author Carlos O'Ryan (coryan@cs.wustl.edu)
+ */
+//=============================================================================
+
+
+#ifndef TAO_CEC_MT_DISPATCHING_H
+#define TAO_CEC_MT_DISPATCHING_H
+
+#include /**/ "ace/pre.h"
+
+#include "orbsvcs/CosEvent/CEC_Dispatching.h"
+
+#if !defined (ACE_LACKS_PRAGMA_ONCE)
+# pragma once
+#endif /* ACE_LACKS_PRAGMA_ONCE */
+
+#include "orbsvcs/CosEvent/CEC_Dispatching_Task.h"
+
+TAO_BEGIN_VERSIONED_NAMESPACE_DECL
+
+class TAO_CEC_EventChannel;
+
+/**
+ * @class TAO_CEC_MT_Dispatching
+ *
+ * @brief Dispatching strategy that minimizes mt inversion.
+ *
+ * This strategy uses a single queue, serviced by one or more
+ * threads. It's main purpose is to decouple the suppliers from
+ * the client execution time, specially in the collocated case.
+ */
+class TAO_Event_Serv_Export TAO_CEC_MT_Dispatching : public TAO_CEC_Dispatching
+{
+public:
+ /// Constructor
+ /// It will create <nthreads> servicing threads...
+ TAO_CEC_MT_Dispatching (int nthreads,
+ int thread_creation_flags,
+ int thread_priority,
+ int force_activate);
+
+ // = The EC_Dispatching methods.
+ virtual void activate (void);
+ virtual void shutdown (void);
+ virtual void push (TAO_CEC_ProxyPushSupplier* proxy,
+ const CORBA::Any & event
+ ACE_ENV_ARG_DECL);
+ virtual void push_nocopy (TAO_CEC_ProxyPushSupplier* proxy,
+ CORBA::Any& event
+ ACE_ENV_ARG_DECL);
+#if defined (TAO_HAS_TYPED_EVENT_CHANNEL)
+ virtual void invoke (TAO_CEC_ProxyPushSupplier *proxy,
+ const TAO_CEC_TypedEvent & typed_event
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS);
+ virtual void invoke_nocopy (TAO_CEC_ProxyPushSupplier *proxy,
+ TAO_CEC_TypedEvent & typed_event
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS);
+#endif /* TAO_HAS_TYPED_EVENT_CHANNEL */
+
+private:
+ /// Use our own thread manager.
+ ACE_Thread_Manager thread_manager_;
+
+ /// The number of active tasks
+ int nthreads_;
+
+ /// The flags (THR_BOUND, THR_NEW_LWP, etc.) used to create the
+ /// dispatching threads.
+ int thread_creation_flags_;
+
+ /// The priority of the dispatching threads.
+ int thread_priority_;
+
+ /// If activation at the requested priority fails then we fallback on
+ /// the defaults for thread activation.
+ int force_activate_;
+
+ /// The dispatching task
+ TAO_CEC_Dispatching_Task task_;
+
+ /// Synchronize access to internal data
+ TAO_SYNCH_MUTEX lock_;
+
+ /// Are the threads running?
+ int active_;
+};
+
+TAO_END_VERSIONED_NAMESPACE_DECL
+
+#include /**/ "ace/post.h"
+
+#endif /* TAO_CEC_MT_DISPATCHING_H */
diff --git a/TAO/orbsvcs/orbsvcs/CosEvent/CEC_ProxyPullConsumer.cpp b/TAO/orbsvcs/orbsvcs/CosEvent/CEC_ProxyPullConsumer.cpp
new file mode 100644
index 00000000000..4aedb1f17c0
--- /dev/null
+++ b/TAO/orbsvcs/orbsvcs/CosEvent/CEC_ProxyPullConsumer.cpp
@@ -0,0 +1,423 @@
+// $Id$
+
+#include "orbsvcs/CosEvent/CEC_ProxyPullConsumer.h"
+#include "orbsvcs/CosEvent/CEC_EventChannel.h"
+#include "orbsvcs/CosEvent/CEC_ConsumerAdmin.h"
+#include "orbsvcs/CosEvent/CEC_SupplierControl.h"
+#include "orbsvcs/CosEvent/CEC_ProxyPullSupplier.h"
+
+#include "ace/Reverse_Lock_T.h"
+
+#if ! defined (__ACE_INLINE__)
+#include "orbsvcs/CosEvent/CEC_ProxyPullConsumer.i"
+#endif /* __ACE_INLINE__ */
+
+ACE_RCSID (CosEvent,
+ CEC_ProxyPullConsumer,
+ "$Id$")
+
+TAO_BEGIN_VERSIONED_NAMESPACE_DECL
+
+typedef ACE_Reverse_Lock<ACE_Lock> TAO_CEC_Unlock;
+
+TAO_CEC_ProxyPullConsumer::
+TAO_CEC_ProxyPullConsumer (TAO_CEC_EventChannel* ec,
+ const ACE_Time_Value &timeout)
+ : event_channel_ (ec),
+ timeout_ (timeout),
+ refcount_ (1)
+{
+ this->lock_ =
+ this->event_channel_->create_consumer_lock ();
+
+ this->default_POA_ =
+ this->event_channel_->consumer_poa ();
+
+ this->event_channel_->get_servant_retry_map ().bind (this, 0);
+}
+
+TAO_CEC_ProxyPullConsumer::~TAO_CEC_ProxyPullConsumer (void)
+{
+ this->event_channel_->get_servant_retry_map ().unbind (this);
+ this->event_channel_->destroy_consumer_lock (this->lock_);
+}
+
+void
+TAO_CEC_ProxyPullConsumer::activate (
+ CosEventChannelAdmin::ProxyPullConsumer_ptr &activated_proxy
+ ACE_ENV_ARG_DECL)
+ ACE_THROW_SPEC ((CORBA::SystemException))
+{
+ CosEventChannelAdmin::ProxyPullConsumer_var result;
+ ACE_TRY
+ {
+ result = this->_this (ACE_ENV_SINGLE_ARG_PARAMETER);
+ ACE_TRY_CHECK;
+ }
+ ACE_CATCHANY
+ {
+ result = CosEventChannelAdmin::ProxyPullConsumer::_nil ();
+ }
+ ACE_ENDTRY;
+ activated_proxy = result._retn ();
+}
+
+void
+TAO_CEC_ProxyPullConsumer::deactivate (ACE_ENV_SINGLE_ARG_DECL)
+ ACE_THROW_SPEC ((CORBA::SystemException))
+{
+ ACE_TRY
+ {
+ PortableServer::POA_var poa =
+ this->_default_POA (ACE_ENV_SINGLE_ARG_PARAMETER);
+ ACE_TRY_CHECK;
+ PortableServer::ObjectId_var id =
+ poa->servant_to_id (this ACE_ENV_ARG_PARAMETER);
+ ACE_TRY_CHECK;
+ poa->deactivate_object (id.in () ACE_ENV_ARG_PARAMETER);
+ ACE_TRY_CHECK;
+ }
+ ACE_CATCHANY
+ {
+ // Exceptions here should not be propagated. They usually
+ // indicate that an object is beign disconnected twice, or some
+ // race condition, but not a fault that the user needs to know
+ // about.
+ }
+ ACE_ENDTRY;
+}
+
+// NOTE: There is some amount of duplicated code here, but it is
+// intentional. Mainly we want to avoid locking overhead when
+// possible, thus the code flow is optimized for that case more than
+// for small code.
+
+CORBA::Any*
+TAO_CEC_ProxyPullConsumer::try_pull_from_supplier (
+ CORBA::Boolean_out has_event
+ ACE_ENV_ARG_DECL)
+{
+ has_event = 0;
+ CosEventComm::PullSupplier_var supplier;
+ {
+ ACE_GUARD_THROW_EX (
+ ACE_Lock, ace_mon, *this->lock_,
+ CORBA::INTERNAL ());
+ // @@ CosEventChannelAdmin::EventChannel::SYNCHRONIZATION_ERROR ());
+ ACE_CHECK_RETURN (0);
+
+ if (this->is_connected_i () == 0)
+ return 0; // ACE_THROW (CosEventComm::Disconnected ());????
+
+ supplier =
+ CosEventComm::PullSupplier::_duplicate (this->supplier_.in ());
+
+ // The refcount cannot be zero, because we have at least two
+ // references,
+ }
+
+ CORBA::Any_var any;
+ TAO_CEC_SupplierControl *control =
+ this->event_channel_->supplier_control ();
+
+ ACE_TRY
+ {
+ any = supplier->try_pull (has_event ACE_ENV_ARG_PARAMETER);
+ ACE_TRY_CHECK;
+
+ // Inform the control that we got something from the supplier
+ control->successful_transmission(this);
+ }
+ ACE_CATCH (CORBA::OBJECT_NOT_EXIST, ex)
+ {
+ control->supplier_not_exist (this ACE_ENV_ARG_PARAMETER);
+ ACE_TRY_CHECK;
+ }
+ ACE_CATCH (CORBA::SystemException, sysex)
+ {
+ control->system_exception (this,
+ sysex
+ ACE_ENV_ARG_PARAMETER);
+ ACE_TRY_CHECK;
+ }
+ ACE_CATCHANY
+ {
+ // @@ Should not happen
+ }
+ ACE_ENDTRY;
+ return any._retn ();
+}
+
+CORBA::Any*
+TAO_CEC_ProxyPullConsumer::pull_from_supplier (
+ ACE_ENV_SINGLE_ARG_DECL)
+{
+ CosEventComm::PullSupplier_var supplier;
+ {
+ ACE_GUARD_THROW_EX (
+ ACE_Lock, ace_mon, *this->lock_,
+ CORBA::INTERNAL ());
+ // @@ CosEventChannelAdmin::EventChannel::SYNCHRONIZATION_ERROR ());
+ ACE_CHECK_RETURN (0);
+
+ if (this->is_connected_i () == 0)
+ return 0; // ACE_THROW (CosEventComm::Disconnected ());????
+
+ supplier =
+ CosEventComm::PullSupplier::_duplicate (this->supplier_.in ());
+
+ // The refcount cannot be zero, because we have at least two
+ // references,
+ }
+
+ CORBA::Any_var any;
+ ACE_TRY
+ {
+ any = supplier->pull (ACE_ENV_SINGLE_ARG_PARAMETER);
+ ACE_TRY_CHECK;
+ }
+ ACE_CATCHANY
+ {
+ // @@ This is where the policies for misbehaving suppliers
+ // should kick in.... for the moment just ignore them.
+ }
+ ACE_ENDTRY;
+ return any._retn ();
+}
+
+CORBA::Boolean
+TAO_CEC_ProxyPullConsumer::supplier_non_existent (
+ CORBA::Boolean_out disconnected
+ ACE_ENV_ARG_DECL)
+{
+ CORBA::Object_var supplier;
+ {
+ ACE_GUARD_THROW_EX (
+ ACE_Lock, ace_mon, *this->lock_,
+ CORBA::INTERNAL ());
+ ACE_CHECK_RETURN (0);
+
+ disconnected = 0;
+ if (this->is_connected_i () == 0)
+ {
+ disconnected = 1;
+ return 0;
+ }
+ if (CORBA::is_nil (this->nopolicy_supplier_.in ()))
+ {
+ return 0;
+ }
+ supplier = CORBA::Object::_duplicate (this->nopolicy_supplier_.in ());
+ }
+
+#if (TAO_HAS_MINIMUM_CORBA == 0)
+ return supplier->_non_existent (ACE_ENV_SINGLE_ARG_PARAMETER);
+#else
+ return 0;
+#endif /* TAO_HAS_MINIMUM_CORBA */
+}
+
+void
+TAO_CEC_ProxyPullConsumer::shutdown (ACE_ENV_SINGLE_ARG_DECL)
+{
+ CosEventComm::PullSupplier_var supplier;
+
+ {
+ ACE_GUARD_THROW_EX (
+ ACE_Lock, ace_mon, *this->lock_,
+ CORBA::INTERNAL ());
+ // @@ CosEventChannelAdmin::EventChannel::SYNCHRONIZATION_ERROR ());
+ ACE_CHECK;
+
+ supplier = this->supplier_._retn ();
+ }
+
+ this->deactivate (ACE_ENV_SINGLE_ARG_PARAMETER);
+ ACE_CHECK;
+
+ if (CORBA::is_nil (supplier.in ()))
+ return;
+
+ ACE_TRY
+ {
+ supplier->disconnect_pull_supplier (ACE_ENV_SINGLE_ARG_PARAMETER);
+ ACE_TRY_CHECK;
+ }
+ ACE_CATCHANY
+ {
+ // Ignore exceptions, we must isolate other clients from
+ // failures on this one.
+ }
+ ACE_ENDTRY;
+}
+
+void
+TAO_CEC_ProxyPullConsumer::cleanup_i (void)
+{
+ this->supplier_ =
+ CosEventComm::PullSupplier::_nil ();
+}
+
+CORBA::ULong
+TAO_CEC_ProxyPullConsumer::_incr_refcnt (void)
+{
+ ACE_GUARD_RETURN (ACE_Lock, ace_mon, *this->lock_, 0);
+ return this->refcount_++;
+}
+
+CORBA::ULong
+TAO_CEC_ProxyPullConsumer::_decr_refcnt (void)
+{
+ {
+ ACE_GUARD_RETURN (ACE_Lock, ace_mon, *this->lock_, 0);
+ this->refcount_--;
+ if (this->refcount_ != 0)
+ return this->refcount_;
+ }
+
+ // Notify the event channel
+ this->event_channel_->destroy_proxy (this);
+ return 0;
+}
+
+void
+TAO_CEC_ProxyPullConsumer::connect_pull_supplier (
+ CosEventComm::PullSupplier_ptr pull_supplier
+ ACE_ENV_ARG_DECL)
+ ACE_THROW_SPEC ((CORBA::SystemException,
+ CosEventChannelAdmin::AlreadyConnected))
+{
+ // Nil PullSuppliers are illegal
+ if (CORBA::is_nil (pull_supplier))
+ ACE_THROW (CORBA::BAD_PARAM ());
+
+ {
+ ACE_GUARD_THROW_EX (
+ ACE_Lock, ace_mon, *this->lock_,
+ CORBA::INTERNAL ());
+ // @@ CosEventChannelAdmin::EventChannel::SYNCHRONIZATION_ERROR ());
+ ACE_CHECK;
+
+ if (this->is_connected_i ())
+ {
+ if (this->event_channel_->supplier_reconnect () == 0)
+ ACE_THROW (CosEventChannelAdmin::AlreadyConnected ());
+
+ // Re-connections are allowed, go ahead and disconnect the
+ // consumer...
+ this->cleanup_i ();
+
+ // @@ Please read the comments in CEC_ProxyPullSupplier about
+ // possible race conditions in this area...
+ TAO_CEC_Unlock reverse_lock (*this->lock_);
+
+ {
+ ACE_GUARD_THROW_EX (
+ TAO_CEC_Unlock, ace_mon, reverse_lock,
+ CORBA::INTERNAL ());
+ // @@ CosEventChannelAdmin::EventChannel::SYNCHRONIZATION_ERROR ());
+ ACE_CHECK;
+
+ this->event_channel_->disconnected (this ACE_ENV_ARG_PARAMETER);
+ ACE_CHECK;
+ }
+
+ // What if a second thread connected us after this?
+ if (this->is_connected_i ())
+ return;
+ }
+ this->supplier_ = apply_policy (pull_supplier);
+ }
+
+ // Notify the event channel...
+ this->event_channel_->connected (this ACE_ENV_ARG_PARAMETER);
+}
+
+CosEventComm::PullSupplier_ptr
+TAO_CEC_ProxyPullConsumer::apply_policy (CosEventComm::PullSupplier_ptr pre)
+{
+ this->nopolicy_supplier_ = CosEventComm::PullSupplier::_duplicate (pre);
+#if defined (TAO_HAS_CORBA_MESSAGING) && TAO_HAS_CORBA_MESSAGING != 0
+ CosEventComm::PullSupplier_var post =
+ CosEventComm::PullSupplier::_duplicate (pre);
+ if (this->timeout_ > ACE_Time_Value::zero)
+ {
+ CORBA::PolicyList policy_list;
+ policy_list.length (1);
+ policy_list[0] = this->event_channel_->
+ create_roundtrip_timeout_policy (this->timeout_);
+
+ CORBA::Object_var post_obj = pre->_set_policy_overrides
+ (policy_list, CORBA::ADD_OVERRIDE);
+ post = CosEventComm::PullSupplier::_narrow (post_obj.in ());
+
+ policy_list[0]->destroy ();
+ policy_list.length (0);
+ }
+ return post._retn ();
+#else
+ return CosEventComm::PullSupplier::_duplicate (pre);
+#endif /* TAO_HAS_CORBA_MESSAGING */
+}
+
+void
+TAO_CEC_ProxyPullConsumer::disconnect_pull_consumer (
+ ACE_ENV_SINGLE_ARG_DECL)
+ ACE_THROW_SPEC ((CORBA::SystemException))
+{
+ CosEventComm::PullSupplier_var supplier;
+
+ {
+ ACE_GUARD_THROW_EX (
+ ACE_Lock, ace_mon, *this->lock_,
+ CORBA::INTERNAL ());
+ // @@ CosEventChannelAdmin::EventChannel::SYNCHRONIZATION_ERROR ());
+ ACE_CHECK;
+
+ if (this->is_connected_i () == 0)
+ ACE_THROW (CORBA::BAD_INV_ORDER ()); // @@ add user exception?
+
+ supplier = this->supplier_._retn ();
+
+ this->cleanup_i ();
+ }
+
+ // Notify the event channel...
+ this->event_channel_->disconnected (this ACE_ENV_ARG_PARAMETER);
+ ACE_CHECK;
+
+ if (this->event_channel_->disconnect_callbacks ())
+ {
+ ACE_TRY
+ {
+ supplier->disconnect_pull_supplier (ACE_ENV_SINGLE_ARG_PARAMETER);
+ ACE_TRY_CHECK;
+ }
+ ACE_CATCHANY
+ {
+ // Ignore exceptions, we must isolate other clients from
+ // failures on this one.
+ }
+ ACE_ENDTRY;
+ }
+}
+
+PortableServer::POA_ptr
+TAO_CEC_ProxyPullConsumer::_default_POA (ACE_ENV_SINGLE_ARG_DECL_NOT_USED)
+{
+ return PortableServer::POA::_duplicate (this->default_POA_.in ());
+}
+
+void
+TAO_CEC_ProxyPullConsumer::_add_ref (ACE_ENV_SINGLE_ARG_DECL_NOT_USED)
+{
+ this->_incr_refcnt ();
+}
+
+void
+TAO_CEC_ProxyPullConsumer::_remove_ref (ACE_ENV_SINGLE_ARG_DECL_NOT_USED)
+{
+ this->_decr_refcnt ();
+}
+
+TAO_END_VERSIONED_NAMESPACE_DECL
diff --git a/TAO/orbsvcs/orbsvcs/CosEvent/CEC_ProxyPullConsumer.h b/TAO/orbsvcs/orbsvcs/CosEvent/CEC_ProxyPullConsumer.h
new file mode 100644
index 00000000000..1949abadced
--- /dev/null
+++ b/TAO/orbsvcs/orbsvcs/CosEvent/CEC_ProxyPullConsumer.h
@@ -0,0 +1,158 @@
+// -*- C++ -*-
+
+//=============================================================================
+/**
+ * @file CEC_ProxyPullConsumer.h
+ *
+ * $Id$
+ *
+ * @author Carlos O'Ryan (coryan@cs.wustl.edu)
+ */
+//=============================================================================
+
+#ifndef TAO_CEC_PROXYPULLCONSUMER_H
+#define TAO_CEC_PROXYPULLCONSUMER_H
+
+#include /**/ "ace/pre.h"
+
+#include "orbsvcs/CosEventChannelAdminS.h"
+
+#if !defined (ACE_LACKS_PRAGMA_ONCE)
+# pragma once
+#endif /* ACE_LACKS_PRAGMA_ONCE */
+
+#include "orbsvcs/ESF/ESF_Worker.h"
+#include "orbsvcs/CosEvent/event_serv_export.h"
+
+TAO_BEGIN_VERSIONED_NAMESPACE_DECL
+
+class TAO_CEC_EventChannel;
+class TAO_CEC_Dispatching;
+class TAO_CEC_ProxyPullSupplier;
+
+/**
+ * @class TAO_CEC_ProxyPullConsumer
+ *
+ * @brief ProxyPullConsumer
+ *
+ * Implement the CosEventChannelAdmin::ProxyPullConsumer interface,
+ * remember that this class is used to communicate with a
+ * PullSupplier, so, in effect, this is the ambassador for a
+ * supplier inside the event channel.
+ * = MEMORY MANAGMENT
+ * The object commits suicide when disconnect_pull_consumer() is
+ * called.
+ */
+class TAO_Event_Serv_Export TAO_CEC_ProxyPullConsumer : public POA_CosEventChannelAdmin::ProxyPullConsumer
+{
+public:
+ typedef CosEventChannelAdmin::ProxyPullConsumer_ptr _ptr_type;
+ typedef CosEventChannelAdmin::ProxyPullConsumer_var _var_type;
+
+ /// constructor...
+ TAO_CEC_ProxyPullConsumer (TAO_CEC_EventChannel* event_channel,
+ const ACE_Time_Value &timeout);
+
+ /// destructor...
+ virtual ~TAO_CEC_ProxyPullConsumer (void);
+
+ /// Activate in the POA
+ virtual void activate (
+ CosEventChannelAdmin::ProxyPullConsumer_ptr &activated_proxy
+ ACE_ENV_ARG_DECL)
+ ACE_THROW_SPEC ((CORBA::SystemException));
+
+ /// Deactivate from the POA
+ virtual void deactivate (ACE_ENV_SINGLE_ARG_DECL)
+ ACE_THROW_SPEC ((CORBA::SystemException));
+
+ /// Return 0 if no supplier is connected...
+ CORBA::Boolean is_connected (void) const;
+
+ /// Return the consumer object reference. It returns nil() if it has
+ /// not connected yet.
+ CosEventComm::PullSupplier_ptr supplier (void) const;
+
+ /// Pulls from the supplier, verifies that it is connected.
+ CORBA::Any* try_pull_from_supplier (CORBA::Boolean_out has_event
+ ACE_ENV_ARG_DECL);
+ CORBA::Any* pull_from_supplier (ACE_ENV_SINGLE_ARG_DECL);
+
+ /**
+ * Invoke the _non_existent() pseudo-operation on the supplier. If
+ * it is disconnected then it returns true and sets the
+ * <disconnected> flag.
+ */
+ CORBA::Boolean supplier_non_existent (CORBA::Boolean_out disconnected
+ ACE_ENV_ARG_DECL);
+
+ /// The event channel is shutting down
+ virtual void shutdown (ACE_ENV_SINGLE_ARG_DECL_NOT_USED);
+
+ /// Increment and decrement the reference count.
+ CORBA::ULong _incr_refcnt (void);
+ CORBA::ULong _decr_refcnt (void);
+
+ // = The CosEventChannelAdmin::ProxyPullConsumer methods...
+ virtual void connect_pull_supplier (
+ CosEventComm::PullSupplier_ptr pull_supplier
+ ACE_ENV_ARG_DECL_NOT_USED)
+ ACE_THROW_SPEC ((CORBA::SystemException,
+ CosEventChannelAdmin::AlreadyConnected));
+ virtual void disconnect_pull_consumer (ACE_ENV_SINGLE_ARG_DECL_NOT_USED)
+ ACE_THROW_SPEC ((CORBA::SystemException));
+
+ // = The Servant methods
+ virtual PortableServer::POA_ptr _default_POA (ACE_ENV_SINGLE_ARG_DECL);
+ virtual void _add_ref (ACE_ENV_SINGLE_ARG_DECL_WITH_DEFAULTS);
+ virtual void _remove_ref (ACE_ENV_SINGLE_ARG_DECL_WITH_DEFAULTS);
+
+protected:
+ /// Set the supplier, used by some implementations to change the
+ /// policies used when invoking operations on the supplier.
+ void supplier (CosEventComm::PullSupplier_ptr supplier);
+ void supplier_i (CosEventComm::PullSupplier_ptr supplier);
+
+ /// The private version (without locking) of is_connected().
+ CORBA::Boolean is_connected_i (void) const;
+
+ /// Release the supplier
+ void cleanup_i (void);
+
+ /// Assigns the parameter to both supplier_ and nopolicy_supplier_, and
+ /// applies policies (when appropriate) to supplier_.
+ CosEventComm::PullSupplier_ptr apply_policy
+ (CosEventComm::PullSupplier_ptr s);
+
+private:
+ /// The supplier admin, used for activation and memory managment.
+ TAO_CEC_EventChannel* event_channel_;
+
+ ACE_Time_Value timeout_;
+
+ /// The locking strategy.
+ ACE_Lock* lock_;
+
+ /// The reference count.
+ CORBA::ULong refcount_;
+
+ /// The supplier -- use apply_policy() instead of assigning directly to
+ /// supplier_. This will keep supplier_ and nopolicy_supplier_ in sync.
+ CosEventComm::PullSupplier_var supplier_;
+
+ /// The supplier without any policies applied
+ CosEventComm::PullSupplier_var nopolicy_supplier_;
+
+ /// Store the default POA.
+ PortableServer::POA_var default_POA_;
+};
+
+TAO_END_VERSIONED_NAMESPACE_DECL
+
+#if defined (__ACE_INLINE__)
+#include "orbsvcs/CosEvent/CEC_ProxyPullConsumer.i"
+#endif /* __ACE_INLINE__ */
+
+#include /**/ "ace/post.h"
+
+#endif /* TAO_CEC_PROXYPULLCONSUMER_H */
diff --git a/TAO/orbsvcs/orbsvcs/CosEvent/CEC_ProxyPullConsumer.i b/TAO/orbsvcs/orbsvcs/CosEvent/CEC_ProxyPullConsumer.i
new file mode 100644
index 00000000000..3c22bfb9af4
--- /dev/null
+++ b/TAO/orbsvcs/orbsvcs/CosEvent/CEC_ProxyPullConsumer.i
@@ -0,0 +1,42 @@
+// -*- C++ -*-
+//
+// $Id$
+
+TAO_BEGIN_VERSIONED_NAMESPACE_DECL
+
+ACE_INLINE CORBA::Boolean
+TAO_CEC_ProxyPullConsumer::is_connected_i (void) const
+{
+ return !CORBA::is_nil (this->supplier_.in ());
+}
+
+ACE_INLINE CORBA::Boolean
+TAO_CEC_ProxyPullConsumer::is_connected (void) const
+{
+ ACE_GUARD_RETURN (ACE_Lock, ace_mon, *this->lock_, 0);
+
+ return this->is_connected_i ();
+}
+
+ACE_INLINE CosEventComm::PullSupplier_ptr
+TAO_CEC_ProxyPullConsumer::supplier (void) const
+{
+ ACE_GUARD_RETURN (ACE_Lock, ace_mon, *this->lock_, 0);
+ return CosEventComm::PullSupplier::_duplicate (this->supplier_.in ());
+}
+
+ACE_INLINE void
+TAO_CEC_ProxyPullConsumer::supplier_i (CosEventComm::PullSupplier_ptr supplier)
+{
+ this->supplier_ = supplier;
+}
+
+ACE_INLINE void
+TAO_CEC_ProxyPullConsumer::supplier (CosEventComm::PullSupplier_ptr supplier)
+{
+ ACE_GUARD (ACE_Lock, ace_mon, *this->lock_);
+
+ this->supplier_i (supplier);
+}
+
+TAO_END_VERSIONED_NAMESPACE_DECL
diff --git a/TAO/orbsvcs/orbsvcs/CosEvent/CEC_ProxyPullSupplier.cpp b/TAO/orbsvcs/orbsvcs/CosEvent/CEC_ProxyPullSupplier.cpp
new file mode 100644
index 00000000000..99208b46ef1
--- /dev/null
+++ b/TAO/orbsvcs/orbsvcs/CosEvent/CEC_ProxyPullSupplier.cpp
@@ -0,0 +1,389 @@
+// $Id$
+
+#include "orbsvcs/CosEvent/CEC_ProxyPullSupplier.h"
+#include "orbsvcs/CosEvent/CEC_Dispatching.h"
+#include "orbsvcs/CosEvent/CEC_EventChannel.h"
+
+#include "ace/Reverse_Lock_T.h"
+
+#if ! defined (__ACE_INLINE__)
+#include "orbsvcs/CosEvent/CEC_ProxyPullSupplier.i"
+#endif /* __ACE_INLINE__ */
+
+ACE_RCSID (CosEvent,
+ CEC_ProxyPullSupplier,
+ "$Id$")
+
+TAO_BEGIN_VERSIONED_NAMESPACE_DECL
+
+typedef ACE_Reverse_Lock<ACE_Lock> TAO_CEC_Unlock;
+
+TAO_CEC_ProxyPullSupplier::TAO_CEC_ProxyPullSupplier
+(TAO_CEC_EventChannel* ec, const ACE_Time_Value &timeout)
+ : event_channel_ (ec),
+ timeout_ (timeout),
+ refcount_ (1),
+ connected_ (0),
+ wait_not_empty_ (queue_lock_)
+{
+ this->lock_ =
+ this->event_channel_->create_supplier_lock ();
+
+ this->default_POA_ =
+ this->event_channel_->supplier_poa ();
+
+ this->event_channel_->get_servant_retry_map ().bind (this, 0);
+}
+
+TAO_CEC_ProxyPullSupplier::~TAO_CEC_ProxyPullSupplier (void)
+{
+ this->event_channel_->get_servant_retry_map ().unbind (this);
+ this->event_channel_->destroy_supplier_lock (this->lock_);
+}
+
+void
+TAO_CEC_ProxyPullSupplier::activate (
+ CosEventChannelAdmin::ProxyPullSupplier_ptr &activated_proxy
+ ACE_ENV_ARG_DECL)
+ ACE_THROW_SPEC ((CORBA::SystemException))
+{
+ CosEventChannelAdmin::ProxyPullSupplier_var result;
+ ACE_TRY
+ {
+ result = this->_this (ACE_ENV_SINGLE_ARG_PARAMETER);
+ ACE_TRY_CHECK;
+ }
+ ACE_CATCHANY
+ {
+ result = CosEventChannelAdmin::ProxyPullSupplier::_nil ();
+ }
+ ACE_ENDTRY;
+ activated_proxy = result._retn ();
+}
+
+void
+TAO_CEC_ProxyPullSupplier::deactivate (ACE_ENV_SINGLE_ARG_DECL)
+ ACE_THROW_SPEC ((CORBA::SystemException))
+{
+ ACE_TRY
+ {
+ PortableServer::POA_var poa =
+ this->_default_POA (ACE_ENV_SINGLE_ARG_PARAMETER);
+ ACE_TRY_CHECK;
+ PortableServer::ObjectId_var id =
+ poa->servant_to_id (this ACE_ENV_ARG_PARAMETER);
+ ACE_TRY_CHECK;
+ poa->deactivate_object (id.in () ACE_ENV_ARG_PARAMETER);
+ ACE_TRY_CHECK;
+ }
+ ACE_CATCHANY
+ {
+ // Exceptions here should not be propagated. They usually
+ // indicate that an object is beign disconnected twice, or some
+ // race condition, but not a fault that the user needs to know
+ // about.
+ }
+ ACE_ENDTRY;
+}
+
+void
+TAO_CEC_ProxyPullSupplier::shutdown (ACE_ENV_SINGLE_ARG_DECL)
+{
+ // Save the consumer we where connected to, we need to send a
+ // disconnect message to it.
+ CosEventComm::PullConsumer_var consumer;
+
+ {
+ ACE_GUARD_THROW_EX (
+ ACE_Lock, ace_mon, *this->lock_,
+ CORBA::INTERNAL ());
+ // @@ CosEventChannelAdmin::EventChannel::SYNCHRONIZATION_ERROR ());
+ ACE_CHECK;
+
+ consumer = this->consumer_._retn ();
+ }
+
+ this->deactivate (ACE_ENV_SINGLE_ARG_PARAMETER);
+ ACE_CHECK;
+
+ if (CORBA::is_nil (consumer.in ()))
+ return;
+
+ ACE_TRY
+ {
+ consumer->disconnect_pull_consumer (ACE_ENV_SINGLE_ARG_PARAMETER);
+ ACE_TRY_CHECK;
+ }
+ ACE_CATCHANY
+ {
+ // Ignore exceptions, we must isolate other clients from
+ // problems on this one.
+ }
+ ACE_ENDTRY;
+}
+
+CORBA::Boolean
+TAO_CEC_ProxyPullSupplier::consumer_non_existent (
+ CORBA::Boolean_out disconnected
+ ACE_ENV_ARG_DECL)
+{
+ CORBA::Object_var consumer;
+ {
+ ACE_GUARD_THROW_EX (
+ ACE_Lock, ace_mon, *this->lock_,
+ CORBA::INTERNAL ());
+ ACE_CHECK_RETURN (0);
+
+ disconnected = 0;
+ if (this->is_connected_i () == 0)
+ {
+ disconnected = 1;
+ return 0;
+ }
+ if (CORBA::is_nil (this->nopolicy_consumer_.in ()))
+ {
+ return 0;
+ }
+ consumer = CORBA::Object::_duplicate (this->nopolicy_consumer_.in ());
+ }
+
+#if (TAO_HAS_MINIMUM_CORBA == 0)
+ return consumer->_non_existent (ACE_ENV_SINGLE_ARG_PARAMETER);
+#else
+ return 0;
+#endif /* TAO_HAS_MINIMUM_CORBA */
+}
+
+void
+TAO_CEC_ProxyPullSupplier::push (const CORBA::Any &event
+ ACE_ENV_ARG_DECL_NOT_USED)
+{
+ if (this->is_connected () == 0)
+ return;
+
+ ACE_GUARD (TAO_SYNCH_MUTEX, ace_mon, this->queue_lock_);
+
+ // Ignore errors
+ (void) this->queue_.enqueue_tail (event);
+
+ this->wait_not_empty_.signal ();
+}
+
+CORBA::Any *
+TAO_CEC_ProxyPullSupplier::pull (ACE_ENV_SINGLE_ARG_DECL)
+ ACE_THROW_SPEC ((CORBA::SystemException,
+ CosEventComm::Disconnected))
+{
+ if (this->is_connected () == 0)
+ ACE_THROW_RETURN (CosEventComm::Disconnected (), 0);
+
+ ACE_GUARD_RETURN (TAO_SYNCH_MUTEX, ace_mon, queue_lock_, 0);
+ while (this->queue_.is_empty ())
+ {
+ this->wait_not_empty_.wait ();
+ }
+ CORBA::Any any;
+ if (this->queue_.dequeue_head (any) != 0)
+ {
+ ACE_THROW_RETURN (CORBA::INTERNAL (), 0);
+ }
+ return new CORBA::Any (any);
+}
+
+CORBA::Any *
+TAO_CEC_ProxyPullSupplier::try_pull (CORBA::Boolean_out has_event
+ ACE_ENV_ARG_DECL)
+ ACE_THROW_SPEC ((CORBA::SystemException,CosEventComm::Disconnected))
+{
+ has_event = 0;
+ if (this->is_connected () == 0)
+ ACE_THROW_RETURN (CosEventComm::Disconnected (), 0);
+
+ ACE_GUARD_RETURN (TAO_SYNCH_MUTEX, ace_mon, queue_lock_, 0);
+ CORBA::Any any;
+ if (this->queue_.is_empty ())
+ {
+ any <<= CORBA::Long(0);
+ return new CORBA::Any (any);
+ }
+
+ if (this->queue_.dequeue_head (any) != 0)
+ {
+ ACE_THROW_RETURN (CORBA::INTERNAL (), 0);
+ }
+ has_event = 1;
+ return new CORBA::Any (any);
+}
+
+void
+TAO_CEC_ProxyPullSupplier::cleanup_i (void)
+{
+ this->consumer_ =
+ CosEventComm::PullConsumer::_nil ();
+ this->connected_ = 0;
+}
+
+CORBA::ULong
+TAO_CEC_ProxyPullSupplier::_incr_refcnt (void)
+{
+ ACE_GUARD_RETURN (ACE_Lock, ace_mon, *this->lock_, 0);
+ return this->refcount_++;
+}
+
+CORBA::ULong
+TAO_CEC_ProxyPullSupplier::_decr_refcnt (void)
+{
+ {
+ ACE_GUARD_RETURN (ACE_Lock, ace_mon, *this->lock_, 0);
+ this->refcount_--;
+ if (this->refcount_ != 0)
+ return this->refcount_;
+ }
+
+ // Notify the event channel
+ this->event_channel_->destroy_proxy (this);
+ return 0;
+}
+
+void
+TAO_CEC_ProxyPullSupplier::connect_pull_consumer (
+ CosEventComm::PullConsumer_ptr pull_consumer
+ ACE_ENV_ARG_DECL)
+ ACE_THROW_SPEC ((CORBA::SystemException,
+ CosEventChannelAdmin::AlreadyConnected))
+{
+ {
+ ACE_GUARD_THROW_EX (
+ ACE_Lock, ace_mon, *this->lock_,
+ CORBA::INTERNAL ());
+ // @@ CosEventChannelAdmin::EventChannel::SYNCHRONIZATION_ERROR ());
+ ACE_CHECK;
+
+ if (this->is_connected_i ())
+ {
+ if (this->event_channel_->consumer_reconnect () == 0)
+ ACE_THROW (CosEventChannelAdmin::AlreadyConnected ());
+
+ // Re-connections are allowed....
+ this->cleanup_i ();
+
+ this->consumer_ = apply_policy (pull_consumer);
+ this->connected_ = 1;
+
+ TAO_CEC_Unlock reverse_lock (*this->lock_);
+
+ {
+ ACE_GUARD_THROW_EX (
+ TAO_CEC_Unlock, ace_mon, reverse_lock,
+ CORBA::INTERNAL ());
+ // @@ CosEventChannelAdmin::EventChannel::SYNCHRONIZATION_ERROR ());
+ ACE_CHECK;
+
+ this->event_channel_->reconnected (this ACE_ENV_ARG_PARAMETER);
+ ACE_CHECK;
+ }
+ return;
+ }
+
+ this->consumer_ = apply_policy (pull_consumer);
+ this->connected_ = 1;
+ }
+
+ // Notify the event channel...
+ this->event_channel_->connected (this ACE_ENV_ARG_PARAMETER);
+}
+
+CosEventComm::PullConsumer_ptr
+TAO_CEC_ProxyPullSupplier::apply_policy (CosEventComm::PullConsumer_ptr pre)
+{
+ if (CORBA::is_nil (pre)) return pre;
+ this->nopolicy_consumer_ = CosEventComm::PullConsumer::_duplicate (pre);
+#if defined (TAO_HAS_CORBA_MESSAGING) && TAO_HAS_CORBA_MESSAGING != 0
+ CosEventComm::PullConsumer_var post =
+ CosEventComm::PullConsumer::_duplicate (pre);
+ if (this->timeout_ > ACE_Time_Value::zero)
+ {
+ CORBA::PolicyList policy_list;
+ policy_list.length (1);
+ policy_list[0] = this->event_channel_->
+ create_roundtrip_timeout_policy (this->timeout_);
+
+ CORBA::Object_var post_obj = pre->_set_policy_overrides
+ (policy_list, CORBA::ADD_OVERRIDE);
+ post = CosEventComm::PullConsumer::_narrow(post_obj.in ());
+
+ policy_list[0]->destroy ();
+ policy_list.length (0);
+ }
+ return post._retn ();
+#else
+ return CosEventComm::PullConsumer::_duplicate (pre);
+#endif /* TAO_HAS_CORBA_MESSAGING */
+}
+
+void
+TAO_CEC_ProxyPullSupplier::disconnect_pull_supplier (
+ ACE_ENV_SINGLE_ARG_DECL)
+ ACE_THROW_SPEC ((CORBA::SystemException))
+{
+ CosEventComm::PullConsumer_var consumer;
+
+ {
+ ACE_GUARD_THROW_EX (
+ ACE_Lock, ace_mon, *this->lock_,
+ CORBA::INTERNAL ());
+ // @@ CosEventChannelAdmin::EventChannel::SYNCHRONIZATION_ERROR ());
+ ACE_CHECK;
+
+ if (this->is_connected_i () == 0)
+ ACE_THROW (CORBA::BAD_INV_ORDER ());
+
+ consumer = this->consumer_._retn ();
+
+ this->cleanup_i ();
+ }
+
+ // Notify the event channel....
+ this->event_channel_->disconnected (this ACE_ENV_ARG_PARAMETER);
+ ACE_CHECK;
+
+ if (CORBA::is_nil (consumer.in ()))
+ return;
+
+ if (this->event_channel_->disconnect_callbacks ())
+ {
+ ACE_TRY
+ {
+ consumer->disconnect_pull_consumer (ACE_ENV_SINGLE_ARG_PARAMETER);
+ ACE_TRY_CHECK;
+ }
+ ACE_CATCHANY
+ {
+ // Ignore exceptions, we must isolate other clients from
+ // problems on this one.
+ ACE_PRINT_EXCEPTION (ACE_ANY_EXCEPTION,
+ "ProxySupplier::disconnect_pull_supplier");
+ }
+ ACE_ENDTRY;
+ }
+}
+
+PortableServer::POA_ptr
+TAO_CEC_ProxyPullSupplier::_default_POA (ACE_ENV_SINGLE_ARG_DECL_NOT_USED)
+{
+ return PortableServer::POA::_duplicate (this->default_POA_.in ());
+}
+
+void
+TAO_CEC_ProxyPullSupplier::_add_ref (ACE_ENV_SINGLE_ARG_DECL_NOT_USED)
+{
+ this->_incr_refcnt ();
+}
+
+void
+TAO_CEC_ProxyPullSupplier::_remove_ref (ACE_ENV_SINGLE_ARG_DECL_NOT_USED)
+{
+ this->_decr_refcnt ();
+}
+
+TAO_END_VERSIONED_NAMESPACE_DECL
diff --git a/TAO/orbsvcs/orbsvcs/CosEvent/CEC_ProxyPullSupplier.h b/TAO/orbsvcs/orbsvcs/CosEvent/CEC_ProxyPullSupplier.h
new file mode 100644
index 00000000000..67eca07678f
--- /dev/null
+++ b/TAO/orbsvcs/orbsvcs/CosEvent/CEC_ProxyPullSupplier.h
@@ -0,0 +1,182 @@
+// -*- C++ -*-
+
+//=============================================================================
+/**
+ * @file CEC_ProxyPullSupplier.h
+ *
+ * $Id$
+ *
+ * @author Carlos O'Ryan (coryan@cs.wustl.edu)
+ */
+//=============================================================================
+
+
+#ifndef TAO_CEC_PROXYPULLSUPPLIER_H
+#define TAO_CEC_PROXYPULLSUPPLIER_H
+
+#include /**/ "ace/pre.h"
+
+#include "orbsvcs/CosEventChannelAdminS.h"
+
+#if !defined (ACE_LACKS_PRAGMA_ONCE)
+# pragma once
+#endif /* ACE_LACKS_PRAGMA_ONCE */
+
+#include "ace/Message_Queue.h"
+#include "ace/Condition_Thread_Mutex.h"
+#include "ace/Unbounded_Queue.h"
+
+#include "orbsvcs/CosEvent/event_serv_export.h"
+
+TAO_BEGIN_VERSIONED_NAMESPACE_DECL
+
+class TAO_CEC_EventChannel;
+class TAO_CEC_ProxyPullConsumer;
+
+/**
+ * @class TAO_CEC_ProxyPullSupplier
+ *
+ * @brief ProxyPullSupplier
+ *
+ * Implement the CosEventChannelAdmin::ProxyPullSupplier interface,
+ * remember that this class is used to communicate with a
+ * PullConsumer, so, in effect, this is the ambassador for a
+ * consumer inside the event channel.
+ * = MEMORY MANAGMENT
+ * It does not assume ownership of the TAO_CEC_Dispatching object.
+ * It makes a copy of the ConsumerQOS and the consumer object
+ * reference.
+ * = LOCKING
+ * Locking is strategized, the event channel acts as a factory for
+ * the locking strategies.
+ */
+class TAO_Event_Serv_Export TAO_CEC_ProxyPullSupplier : public POA_CosEventChannelAdmin::ProxyPullSupplier
+{
+public:
+ typedef CosEventChannelAdmin::ProxyPullSupplier_ptr _ptr_type;
+ typedef CosEventChannelAdmin::ProxyPullSupplier_var _var_type;
+
+ /// constructor...
+ TAO_CEC_ProxyPullSupplier (TAO_CEC_EventChannel* event_channel,
+ const ACE_Time_Value &timeout);
+
+ /// destructor...
+ virtual ~TAO_CEC_ProxyPullSupplier (void);
+
+ /// Activate in the POA
+ virtual void activate (
+ CosEventChannelAdmin::ProxyPullSupplier_ptr &activated_proxy
+ ACE_ENV_ARG_DECL)
+ ACE_THROW_SPEC ((CORBA::SystemException));
+
+ /// Deactivate from the POA
+ virtual void deactivate (ACE_ENV_SINGLE_ARG_DECL)
+ ACE_THROW_SPEC ((CORBA::SystemException));
+
+ /// Return 0 if no consumer is connected...
+ CORBA::Boolean is_connected (void) const;
+
+ /**
+ * Return the consumer object reference. It returns nil() if it has
+ * not connected yet.
+ * NOTE: This method does not return a new reference!!! Doing so
+ * will increase the locking overhead on the critical path.
+ */
+ CosEventComm::PullConsumer_ptr consumer (void) const;
+
+ /// The event channel is shutting down
+ virtual void shutdown (ACE_ENV_SINGLE_ARG_DECL);
+
+ /**
+ * Invoke the _non_existent() pseudo-operation on the consumer. If
+ * it is disconnected then it returns true and sets the
+ * <disconnected> flag.
+ */
+ CORBA::Boolean consumer_non_existent (CORBA::Boolean_out disconnected
+ ACE_ENV_ARG_DECL);
+
+ /// Push an event into the queue.
+ void push (const CORBA::Any &event
+ ACE_ENV_ARG_DECL);
+
+ // = The CosEventChannelAdmin::ProxyPullSupplier methods...
+ virtual void connect_pull_consumer (
+ CosEventComm::PullConsumer_ptr pull_consumer
+ ACE_ENV_ARG_DECL_NOT_USED)
+ ACE_THROW_SPEC ((CORBA::SystemException,
+ CosEventChannelAdmin::AlreadyConnected));
+ virtual CORBA::Any * pull (ACE_ENV_SINGLE_ARG_DECL_NOT_USED)
+ ACE_THROW_SPEC ((CORBA::SystemException,CosEventComm::Disconnected));
+ virtual CORBA::Any * try_pull (CORBA::Boolean_out has_event
+ ACE_ENV_ARG_DECL_NOT_USED)
+ ACE_THROW_SPEC ((CORBA::SystemException,CosEventComm::Disconnected));
+ virtual void disconnect_pull_supplier (ACE_ENV_SINGLE_ARG_DECL_NOT_USED)
+ ACE_THROW_SPEC ((CORBA::SystemException));
+
+ /// Increment and decrement the reference count.
+ CORBA::ULong _incr_refcnt (void);
+ CORBA::ULong _decr_refcnt (void);
+
+ // = The Servant methods
+ virtual PortableServer::POA_ptr _default_POA (ACE_ENV_SINGLE_ARG_DECL);
+ virtual void _add_ref (ACE_ENV_SINGLE_ARG_DECL);
+ virtual void _remove_ref (ACE_ENV_SINGLE_ARG_DECL);
+
+protected:
+ /// Set the consumer, used by some implementations to change the
+ /// policies used when invoking operations on the consumer.
+ void consumer (CosEventComm::PullConsumer_ptr consumer);
+ void consumer_i (CosEventComm::PullConsumer_ptr consumer);
+
+ /// The private version (without locking) of is_connected().
+ CORBA::Boolean is_connected_i (void) const;
+
+ /// Release the child and the consumer
+ void cleanup_i (void);
+
+ /// Assigns the parameter to both consumer_ and nopolicy_consumer_, and
+ /// applies policies (when appropriate) to consumer_.
+ CosEventComm::PullConsumer_ptr apply_policy
+ (CosEventComm::PullConsumer_ptr c);
+
+private:
+ /// The Event Channel that owns this object.
+ TAO_CEC_EventChannel* event_channel_;
+
+ ACE_Time_Value timeout_;
+
+ /// The locking strategy.
+ ACE_Lock* lock_;
+
+ /// The reference count.
+ CORBA::ULong refcount_;
+
+ /// The consumer -- use apply_policy() instead of assigning directly to
+ /// consumer_. This will keep consumer_ and nopolicy_consumer_ in sync.
+ CosEventComm::PullConsumer_var consumer_;
+
+ /// The consumer without any policies applied
+ CosEventComm::PullConsumer_var nopolicy_consumer_;
+
+ /// If the flag is not zero then we are connected, notice that the
+ /// consumer can be nil.
+ int connected_;
+
+ /// Store the default POA.
+ PortableServer::POA_var default_POA_;
+
+ /// Use a message queue to pass the
+ TAO_SYNCH_MUTEX queue_lock_;
+ TAO_SYNCH_CONDITION wait_not_empty_;
+ ACE_Unbounded_Queue<CORBA::Any> queue_;
+};
+
+TAO_END_VERSIONED_NAMESPACE_DECL
+
+#if defined (__ACE_INLINE__)
+#include "orbsvcs/CosEvent/CEC_ProxyPullSupplier.i"
+#endif /* __ACE_INLINE__ */
+
+#include /**/ "ace/post.h"
+
+#endif /* TAO_CEC_PROXYPULLSUPPLIER_H */
diff --git a/TAO/orbsvcs/orbsvcs/CosEvent/CEC_ProxyPullSupplier.i b/TAO/orbsvcs/orbsvcs/CosEvent/CEC_ProxyPullSupplier.i
new file mode 100644
index 00000000000..8519794c295
--- /dev/null
+++ b/TAO/orbsvcs/orbsvcs/CosEvent/CEC_ProxyPullSupplier.i
@@ -0,0 +1,43 @@
+// -*- C++ -*-
+//
+// $Id$
+
+TAO_BEGIN_VERSIONED_NAMESPACE_DECL
+
+ACE_INLINE CORBA::Boolean
+TAO_CEC_ProxyPullSupplier::is_connected_i (void) const
+{
+ return this->connected_;
+}
+
+ACE_INLINE CORBA::Boolean
+TAO_CEC_ProxyPullSupplier::is_connected (void) const
+{
+ ACE_GUARD_RETURN (ACE_Lock, ace_mon, *this->lock_, 0);
+
+ return this->is_connected_i ();
+}
+
+ACE_INLINE CosEventComm::PullConsumer_ptr
+TAO_CEC_ProxyPullSupplier::consumer (void) const
+{
+ ACE_GUARD_RETURN (ACE_Lock, ace_mon, *this->lock_, 0);
+
+ return this->consumer_.in ();
+}
+
+ACE_INLINE void
+TAO_CEC_ProxyPullSupplier::consumer_i (CosEventComm::PullConsumer_ptr consumer)
+{
+ this->consumer_ = consumer;
+}
+
+ACE_INLINE void
+TAO_CEC_ProxyPullSupplier::consumer (CosEventComm::PullConsumer_ptr consumer)
+{
+ ACE_GUARD (ACE_Lock, ace_mon, *this->lock_);
+
+ this->consumer_i (consumer);
+}
+
+TAO_END_VERSIONED_NAMESPACE_DECL
diff --git a/TAO/orbsvcs/orbsvcs/CosEvent/CEC_ProxyPushConsumer.cpp b/TAO/orbsvcs/orbsvcs/CosEvent/CEC_ProxyPushConsumer.cpp
new file mode 100644
index 00000000000..dc056d83a65
--- /dev/null
+++ b/TAO/orbsvcs/orbsvcs/CosEvent/CEC_ProxyPushConsumer.cpp
@@ -0,0 +1,397 @@
+// $Id$
+
+#include "orbsvcs/CosEvent/CEC_ProxyPushConsumer.h"
+#include "orbsvcs/CosEvent/CEC_EventChannel.h"
+#include "orbsvcs/CosEvent/CEC_ConsumerAdmin.h"
+#include "orbsvcs/CosEvent/CEC_ProxyPushSupplier.h"
+
+#include "ace/Reverse_Lock_T.h"
+
+#if ! defined (__ACE_INLINE__)
+#include "orbsvcs/CosEvent/CEC_ProxyPushConsumer.i"
+#endif /* __ACE_INLINE__ */
+
+ACE_RCSID (CosEvent,
+ CEC_ProxyPushConsumer,
+ "$Id$")
+
+TAO_BEGIN_VERSIONED_NAMESPACE_DECL
+
+typedef ACE_Reverse_Lock<ACE_Lock> TAO_CEC_Unlock;
+
+TAO_CEC_ProxyPushConsumer::
+TAO_CEC_ProxyPushConsumer (TAO_CEC_EventChannel* ec,
+ const ACE_Time_Value &timeout)
+ : event_channel_ (ec),
+ timeout_(timeout),
+ refcount_ (1),
+ connected_ (false)
+{
+ this->lock_ =
+ this->event_channel_->create_consumer_lock ();
+
+ this->default_POA_ =
+ this->event_channel_->consumer_poa ();
+
+ this->event_channel_->get_servant_retry_map ().bind (this, 0);
+}
+
+TAO_CEC_ProxyPushConsumer::~TAO_CEC_ProxyPushConsumer (void)
+{
+ this->event_channel_->get_servant_retry_map ().unbind (this);
+ this->event_channel_->destroy_consumer_lock (this->lock_);
+}
+
+void
+TAO_CEC_ProxyPushConsumer::activate (
+ CosEventChannelAdmin::ProxyPushConsumer_ptr &activated_proxy
+ ACE_ENV_ARG_DECL)
+ ACE_THROW_SPEC ((CORBA::SystemException))
+{
+ CosEventChannelAdmin::ProxyPushConsumer_var result;
+ ACE_TRY
+ {
+ result = this->_this (ACE_ENV_SINGLE_ARG_PARAMETER);
+ ACE_TRY_CHECK;
+ }
+ ACE_CATCHANY
+ {
+ result = CosEventChannelAdmin::ProxyPushConsumer::_nil ();
+ }
+ ACE_ENDTRY;
+ activated_proxy = result._retn ();
+}
+
+void
+TAO_CEC_ProxyPushConsumer::deactivate (ACE_ENV_SINGLE_ARG_DECL)
+ ACE_THROW_SPEC ((CORBA::SystemException))
+{
+ ACE_TRY
+ {
+ PortableServer::POA_var poa =
+ this->_default_POA (ACE_ENV_SINGLE_ARG_PARAMETER);
+ ACE_TRY_CHECK;
+ PortableServer::ObjectId_var id =
+ poa->servant_to_id (this ACE_ENV_ARG_PARAMETER);
+ ACE_TRY_CHECK;
+ poa->deactivate_object (id.in () ACE_ENV_ARG_PARAMETER);
+ ACE_TRY_CHECK;
+ }
+ ACE_CATCHANY
+ {
+ // Exceptions here should not be propagated. They usually
+ // indicate that an object is beign disconnected twice, or some
+ // race condition, but not a fault that the user needs to know
+ // about.
+ }
+ ACE_ENDTRY;
+}
+
+CORBA::Boolean
+TAO_CEC_ProxyPushConsumer::supplier_non_existent (
+ CORBA::Boolean_out disconnected
+ ACE_ENV_ARG_DECL)
+{
+ CORBA::Object_var supplier;
+ {
+ ACE_GUARD_THROW_EX (
+ ACE_Lock, ace_mon, *this->lock_,
+ CORBA::INTERNAL ());
+ ACE_CHECK_RETURN (0);
+
+ disconnected = false;
+ if (!this->is_connected_i ())
+ {
+ disconnected = true;
+ return false;
+ }
+ if (CORBA::is_nil (this->nopolicy_supplier_.in ()))
+ {
+ return false;
+ }
+ supplier = CORBA::Object::_duplicate (this->nopolicy_supplier_.in ());
+ }
+
+#if (TAO_HAS_MINIMUM_CORBA == 0)
+ return supplier->_non_existent (ACE_ENV_SINGLE_ARG_PARAMETER);
+#else
+ return false;
+#endif /* TAO_HAS_MINIMUM_CORBA */
+}
+
+void
+TAO_CEC_ProxyPushConsumer::shutdown (ACE_ENV_SINGLE_ARG_DECL)
+{
+ CosEventComm::PushSupplier_var supplier;
+
+ {
+ ACE_GUARD_THROW_EX (
+ ACE_Lock, ace_mon, *this->lock_,
+ CORBA::INTERNAL ());
+ // @@ CosEventChannelAdmin::EventChannel::SYNCHRONIZATION_ERROR ());
+ ACE_CHECK;
+
+ supplier = this->supplier_._retn ();
+ this->connected_ = false;
+ }
+
+ this->deactivate (ACE_ENV_SINGLE_ARG_PARAMETER);
+ ACE_CHECK;
+
+ if (CORBA::is_nil (supplier.in ()))
+ return;
+
+ ACE_TRY
+ {
+ supplier->disconnect_push_supplier (ACE_ENV_SINGLE_ARG_PARAMETER);
+ ACE_TRY_CHECK;
+ }
+ ACE_CATCHANY
+ {
+ // Ignore exceptions, we must isolate other clients from
+ // failures on this one.
+ }
+ ACE_ENDTRY;
+}
+
+void
+TAO_CEC_ProxyPushConsumer::cleanup_i (void)
+{
+ this->supplier_ =
+ CosEventComm::PushSupplier::_nil ();
+ this->connected_ = false;
+}
+
+CORBA::ULong
+TAO_CEC_ProxyPushConsumer::_incr_refcnt (void)
+{
+ ACE_GUARD_RETURN (ACE_Lock, ace_mon, *this->lock_, 0);
+ return this->refcount_++;
+}
+
+CORBA::ULong
+TAO_CEC_ProxyPushConsumer::_decr_refcnt (void)
+{
+ {
+ ACE_GUARD_RETURN (ACE_Lock, ace_mon, *this->lock_, 0);
+ --this->refcount_;
+ if (this->refcount_ != 0)
+ return this->refcount_;
+ }
+
+ // Notify the event channel
+ this->event_channel_->destroy_proxy (this);
+ return 0;
+}
+
+void
+TAO_CEC_ProxyPushConsumer::connect_push_supplier (
+ CosEventComm::PushSupplier_ptr push_supplier
+ ACE_ENV_ARG_DECL)
+ ACE_THROW_SPEC ((CORBA::SystemException,
+ CosEventChannelAdmin::AlreadyConnected))
+{
+ {
+ ACE_GUARD_THROW_EX (
+ ACE_Lock, ace_mon, *this->lock_,
+ CORBA::INTERNAL ());
+ // @@ CosEventChannelAdmin::EventChannel::SYNCHRONIZATION_ERROR ());
+ ACE_CHECK;
+
+ if (this->is_connected_i ())
+ {
+ if (this->event_channel_->supplier_reconnect () == 0)
+ ACE_THROW (CosEventChannelAdmin::AlreadyConnected ());
+
+ // Re-connections are allowed, go ahead and disconnect the
+ // consumer...
+ this->cleanup_i ();
+
+ // @@ Please read the comments in CEC_ProxyPushSupplier about
+ // possible race conditions in this area...
+ TAO_CEC_Unlock reverse_lock (*this->lock_);
+
+ {
+ ACE_GUARD_THROW_EX (
+ TAO_CEC_Unlock, ace_mon, reverse_lock,
+ CORBA::INTERNAL ());
+ // @@ CosEventChannelAdmin::EventChannel::SYNCHRONIZATION_ERROR ());
+ ACE_CHECK;
+
+ this->event_channel_->disconnected (this ACE_ENV_ARG_PARAMETER);
+ ACE_CHECK;
+ }
+
+ // What if a second thread connected us after this?
+ if (this->is_connected_i ())
+ return;
+ }
+ this->supplier_ = apply_policy (push_supplier);
+ this->connected_ = true;
+ }
+
+ // Notify the event channel...
+ this->event_channel_->connected (this ACE_ENV_ARG_PARAMETER);
+}
+
+CosEventComm::PushSupplier_ptr
+TAO_CEC_ProxyPushConsumer::apply_policy (CosEventComm::PushSupplier_ptr pre)
+{
+ if (CORBA::is_nil (pre)) return pre;
+ this->nopolicy_supplier_ = CosEventComm::PushSupplier::_duplicate (pre);
+#if defined (TAO_HAS_CORBA_MESSAGING) && TAO_HAS_CORBA_MESSAGING != 0
+ CosEventComm::PushSupplier_var post =
+ CosEventComm::PushSupplier::_duplicate (pre);
+ if (this->timeout_ > ACE_Time_Value::zero)
+ {
+ CORBA::PolicyList policy_list;
+ policy_list.length (1);
+ policy_list[0] = this->event_channel_->
+ create_roundtrip_timeout_policy (this->timeout_);
+
+ CORBA::Object_var post_obj = pre->_set_policy_overrides
+ (policy_list, CORBA::ADD_OVERRIDE);
+ post = CosEventComm::PushSupplier::_narrow(post_obj.in ());
+
+ policy_list[0]->destroy ();
+ policy_list.length (0);
+ }
+ return post._retn ();
+#else
+ return CosEventComm::PushSupplier::_duplicate (pre);
+#endif /* TAO_HAS_CORBA_MESSAGING */
+}
+
+void
+TAO_CEC_ProxyPushConsumer::push (const CORBA::Any& event
+ ACE_ENV_ARG_DECL)
+ ACE_THROW_SPEC ((CORBA::SystemException))
+{
+ TAO_CEC_ProxyPushConsumer_Guard ace_mon (this->lock_,
+ this->refcount_,
+ this->event_channel_,
+ this);
+ if (!ace_mon.locked ())
+ return;
+
+ this->event_channel_->consumer_admin ()->push (event
+ ACE_ENV_ARG_PARAMETER);
+ ACE_CHECK;
+}
+
+void
+TAO_CEC_ProxyPushConsumer::disconnect_push_consumer (
+ ACE_ENV_SINGLE_ARG_DECL)
+ ACE_THROW_SPEC ((CORBA::SystemException))
+{
+ CosEventComm::PushSupplier_var supplier;
+
+ {
+ ACE_GUARD_THROW_EX (
+ ACE_Lock, ace_mon, *this->lock_,
+ CORBA::INTERNAL ());
+ // @@ CosEventChannelAdmin::EventChannel::SYNCHRONIZATION_ERROR ());
+ ACE_CHECK;
+
+ if (!this->is_connected_i ())
+ ACE_THROW (CORBA::BAD_INV_ORDER ()); // @@ add user exception?
+
+ supplier = this->supplier_._retn ();
+
+ this->cleanup_i ();
+ }
+
+ // Notify the event channel...
+ this->event_channel_->disconnected (this ACE_ENV_ARG_PARAMETER);
+ ACE_CHECK;
+
+ if (CORBA::is_nil (supplier.in ()))
+ return;
+
+ if (this->event_channel_->disconnect_callbacks ())
+ {
+ ACE_TRY
+ {
+ supplier->disconnect_push_supplier (ACE_ENV_SINGLE_ARG_PARAMETER);
+ ACE_TRY_CHECK;
+ }
+ ACE_CATCHANY
+ {
+ // Ignore exceptions, we must isolate other clients from
+ // failures on this one.
+ }
+ ACE_ENDTRY;
+ }
+}
+
+PortableServer::POA_ptr
+TAO_CEC_ProxyPushConsumer::_default_POA (ACE_ENV_SINGLE_ARG_DECL_NOT_USED)
+{
+ return PortableServer::POA::_duplicate (this->default_POA_.in ());
+}
+
+void
+TAO_CEC_ProxyPushConsumer::_add_ref (ACE_ENV_SINGLE_ARG_DECL_NOT_USED)
+{
+ this->_incr_refcnt ();
+}
+
+void
+TAO_CEC_ProxyPushConsumer::_remove_ref (ACE_ENV_SINGLE_ARG_DECL_NOT_USED)
+{
+ this->_decr_refcnt ();
+}
+
+// ****************************************************************
+
+TAO_CEC_ProxyPushConsumer_Guard::
+ TAO_CEC_ProxyPushConsumer_Guard (ACE_Lock *lock,
+ CORBA::ULong &refcount,
+ TAO_CEC_EventChannel *ec,
+ TAO_CEC_ProxyPushConsumer *proxy)
+ : lock_ (lock),
+ refcount_ (refcount),
+ event_channel_ (ec),
+ proxy_ (proxy),
+ locked_ (false)
+{
+ ACE_Guard<ACE_Lock> ace_mon (*this->lock_);
+ // If the guard fails there is not much we can do, raising an
+ // exception is wrong, the client has *no* way to handle that kind
+ // of error. Even worse, there is no exception to raise in that
+ // case.
+ // @@ Returning something won't work either, the error should be
+ // logged though!
+
+ if (!proxy->is_connected_i ())
+ return;
+
+ this->locked_ = true;
+ ++this->refcount_;
+}
+
+TAO_CEC_ProxyPushConsumer_Guard::
+ ~TAO_CEC_ProxyPushConsumer_Guard (void)
+{
+ // This access is safe because guard objects are created on the
+ // stack, only one thread has access to them
+ if (!this->locked_)
+ return;
+
+ {
+ ACE_Guard<ACE_Lock> ace_mon (*this->lock_);
+ // If the guard fails there is not much we can do, raising an
+ // exception is wrong, the client has *no* way to handle that kind
+ // of error. Even worse, there is no exception to raise in that
+ // case.
+ // @@ Returning something won't work either, the error should be
+ // logged though!
+
+ --this->refcount_;
+ if (this->refcount_ != 0)
+ return;
+ }
+ this->event_channel_->destroy_proxy (this->proxy_);
+}
+
+TAO_END_VERSIONED_NAMESPACE_DECL
diff --git a/TAO/orbsvcs/orbsvcs/CosEvent/CEC_ProxyPushConsumer.h b/TAO/orbsvcs/orbsvcs/CosEvent/CEC_ProxyPushConsumer.h
new file mode 100644
index 00000000000..a7922405f2a
--- /dev/null
+++ b/TAO/orbsvcs/orbsvcs/CosEvent/CEC_ProxyPushConsumer.h
@@ -0,0 +1,210 @@
+// -*- C++ -*-
+
+//=============================================================================
+/**
+ * @file CEC_ProxyPushConsumer.h
+ *
+ * $Id$
+ *
+ * @author Carlos O'Ryan (coryan@cs.wustl.edu)
+ */
+//=============================================================================
+
+
+#ifndef TAO_CEC_PROXYPUSHCONSUMER_H
+#define TAO_CEC_PROXYPUSHCONSUMER_H
+
+#include /**/ "ace/pre.h"
+
+#include "orbsvcs/CosEventChannelAdminS.h"
+#include "orbsvcs/CosEvent/event_serv_export.h"
+
+#if !defined (ACE_LACKS_PRAGMA_ONCE)
+# pragma once
+#endif /* ACE_LACKS_PRAGMA_ONCE */
+
+#include "orbsvcs/ESF/ESF_Worker.h"
+
+TAO_BEGIN_VERSIONED_NAMESPACE_DECL
+
+class TAO_CEC_EventChannel;
+class TAO_CEC_Dispatching;
+class TAO_CEC_ProxyPushSupplier;
+
+/**
+ * @class TAO_CEC_ProxyPushConsumer
+ *
+ * @brief ProxyPushConsumer
+ *
+ * Implement the CosEventChannelAdmin::ProxyPushConsumer interface,
+ * remember that this class is used to communicate with a
+ * PushSupplier, so, in effect, this is the ambassador for a
+ * supplier inside the event channel.
+ * = MEMORY MANAGMENT
+ * The object commits suicide when disconnect_push_consumer() is
+ * called.
+ */
+class TAO_Event_Serv_Export TAO_CEC_ProxyPushConsumer
+ : public POA_CosEventChannelAdmin::ProxyPushConsumer
+{
+public:
+ typedef CosEventChannelAdmin::ProxyPushConsumer_ptr _ptr_type;
+ typedef CosEventChannelAdmin::ProxyPushConsumer_var _var_type;
+
+ /// constructor...
+ TAO_CEC_ProxyPushConsumer (TAO_CEC_EventChannel* event_channel,
+ const ACE_Time_Value &timeout);
+
+ /// destructor...
+ virtual ~TAO_CEC_ProxyPushConsumer (void);
+
+ /// Activate in the POA
+ virtual void activate (
+ CosEventChannelAdmin::ProxyPushConsumer_ptr &activated_proxy
+ ACE_ENV_ARG_DECL)
+ ACE_THROW_SPEC ((CORBA::SystemException));
+
+ /// Deactivate from the POA
+ virtual void deactivate (ACE_ENV_SINGLE_ARG_DECL)
+ ACE_THROW_SPEC ((CORBA::SystemException));
+
+ /// Return false if no supplier is connected...
+ CORBA::Boolean is_connected (void) const;
+
+ /// Return the consumer object reference. It returns nil() if it has
+ /// not connected yet.
+ CosEventComm::PushSupplier_ptr supplier (void) const;
+
+ /**
+ * Invoke the _non_existent() pseudo-operation on the supplier. If
+ * it is disconnected then it returns true and sets the
+ * <disconnected> flag.
+ */
+ CORBA::Boolean supplier_non_existent (CORBA::Boolean_out disconnected
+ ACE_ENV_ARG_DECL);
+
+ /// The event channel is shutting down
+ virtual void shutdown (ACE_ENV_SINGLE_ARG_DECL_NOT_USED);
+
+ /// Increment and decrement the reference count.
+ CORBA::ULong _incr_refcnt (void);
+ CORBA::ULong _decr_refcnt (void);
+
+ // = The CosEventChannelAdmin::ProxyPushConsumer methods...
+ virtual void connect_push_supplier (
+ CosEventComm::PushSupplier_ptr push_supplier
+ ACE_ENV_ARG_DECL_NOT_USED)
+ ACE_THROW_SPEC ((CORBA::SystemException,
+ CosEventChannelAdmin::AlreadyConnected));
+ virtual void push (const CORBA::Any& event
+ ACE_ENV_ARG_DECL_NOT_USED)
+ ACE_THROW_SPEC ((CORBA::SystemException));
+ virtual void disconnect_push_consumer (ACE_ENV_SINGLE_ARG_DECL_NOT_USED)
+ ACE_THROW_SPEC ((CORBA::SystemException));
+
+ // = The Servant methods
+ virtual PortableServer::POA_ptr _default_POA (ACE_ENV_SINGLE_ARG_DECL);
+ virtual void _add_ref (ACE_ENV_SINGLE_ARG_DECL_WITH_DEFAULTS);
+ virtual void _remove_ref (ACE_ENV_SINGLE_ARG_DECL_WITH_DEFAULTS);
+
+protected:
+ /// Set the supplier, used by some implementations to change the
+ /// policies used when invoking operations on the supplier.
+ void supplier (CosEventComm::PushSupplier_ptr supplier);
+ void supplier_i (CosEventComm::PushSupplier_ptr supplier);
+
+ friend class TAO_CEC_ProxyPushConsumer_Guard;
+ // The guard needs access to the following protected methods.
+
+ /// The private version (without locking) of is_connected().
+ CORBA::Boolean is_connected_i (void) const;
+
+ /// Release the supplier
+ void cleanup_i (void);
+
+ /// Assigns the parameter to both supplier_ and nopolicy_supplier_, and
+ /// applies policies (when appropriate) to supplier_.
+ CosEventComm::PushSupplier_ptr apply_policy
+ (CosEventComm::PushSupplier_ptr s);
+
+private:
+ /// The supplier admin, used for activation and memory managment.
+ TAO_CEC_EventChannel* event_channel_;
+
+ ACE_Time_Value timeout_;
+
+ /// The locking strategy.
+ ACE_Lock* lock_;
+
+ /// The reference count.
+ CORBA::ULong refcount_;
+
+ /// The supplier -- use apply_policy() instead of assigning directly to
+ /// supplier_. This will keep supplier_ and nopolicy_supplier_ in sync.
+ CosEventComm::PushSupplier_var supplier_;
+
+ /// The supplier without any policies applied
+ CosEventComm::PushSupplier_var nopolicy_supplier_;
+
+ /// If the flag is true then we are connected, notice that the
+ /// supplier can be nil.
+ bool connected_;
+
+ /// Store the default POA.
+ PortableServer::POA_var default_POA_;
+};
+
+// ****************************************************************
+
+/**
+ * @class TAO_CEC_ProxyPushConsumer_Guard
+ *
+ * @brief A Guard for the ProxyPushConsumer reference count
+ *
+ * This is a helper class used in the implementation of
+ * ProxyPushConumer. It provides a Guard mechanism to increment
+ * the reference count on the proxy, eliminating the need to hold
+ * mutexes during long operations.
+ */
+class TAO_Event_Serv_Export TAO_CEC_ProxyPushConsumer_Guard
+{
+public:
+ /// Constructor
+ TAO_CEC_ProxyPushConsumer_Guard (ACE_Lock *lock,
+ CORBA::ULong &refcount,
+ TAO_CEC_EventChannel *ec,
+ TAO_CEC_ProxyPushConsumer *proxy);
+
+ /// Destructor
+ ~TAO_CEC_ProxyPushConsumer_Guard (void);
+
+ /// Returns true if the reference count successfully acquired
+ bool locked (void) const;
+
+private:
+ /// The lock used to protect the reference count
+ ACE_Lock *lock_;
+
+ /// The reference count
+ CORBA::ULong &refcount_;
+
+ /// The event channel used to destroy the proxy
+ TAO_CEC_EventChannel *event_channel_;
+
+ /// The proxy whose lifetime is controlled by the reference count
+ TAO_CEC_ProxyPushConsumer *proxy_;
+
+ /// This flag is set to true if the reference count was successfully
+ /// acquired.
+ bool locked_;
+};
+
+TAO_END_VERSIONED_NAMESPACE_DECL
+
+#if defined (__ACE_INLINE__)
+#include "orbsvcs/CosEvent/CEC_ProxyPushConsumer.i"
+#endif /* __ACE_INLINE__ */
+
+#include /**/ "ace/post.h"
+
+#endif /* TAO_CEC_PROXYPUSHCONSUMER_H */
diff --git a/TAO/orbsvcs/orbsvcs/CosEvent/CEC_ProxyPushConsumer.i b/TAO/orbsvcs/orbsvcs/CosEvent/CEC_ProxyPushConsumer.i
new file mode 100644
index 00000000000..422c95863c6
--- /dev/null
+++ b/TAO/orbsvcs/orbsvcs/CosEvent/CEC_ProxyPushConsumer.i
@@ -0,0 +1,50 @@
+// -*- C++ -*-
+//
+// $Id$
+
+TAO_BEGIN_VERSIONED_NAMESPACE_DECL
+
+ACE_INLINE CORBA::Boolean
+TAO_CEC_ProxyPushConsumer::is_connected_i (void) const
+{
+ return this->connected_;
+}
+
+ACE_INLINE CORBA::Boolean
+TAO_CEC_ProxyPushConsumer::is_connected (void) const
+{
+ ACE_GUARD_RETURN (ACE_Lock, ace_mon, *this->lock_, 0);
+
+ return this->is_connected_i ();
+}
+
+ACE_INLINE CosEventComm::PushSupplier_ptr
+TAO_CEC_ProxyPushConsumer::supplier (void) const
+{
+ ACE_GUARD_RETURN (ACE_Lock, ace_mon, *this->lock_, 0);
+ return CosEventComm::PushSupplier::_duplicate (this->supplier_.in ());
+}
+
+ACE_INLINE void
+TAO_CEC_ProxyPushConsumer::supplier_i (CosEventComm::PushSupplier_ptr supplier)
+{
+ this->supplier_ = supplier;
+}
+
+ACE_INLINE void
+TAO_CEC_ProxyPushConsumer::supplier (CosEventComm::PushSupplier_ptr supplier)
+{
+ ACE_GUARD (ACE_Lock, ace_mon, *this->lock_);
+
+ this->supplier_i (supplier);
+}
+
+// ****************************************************************
+
+ACE_INLINE bool
+TAO_CEC_ProxyPushConsumer_Guard::locked (void) const
+{
+ return this->locked_;
+}
+
+TAO_END_VERSIONED_NAMESPACE_DECL
diff --git a/TAO/orbsvcs/orbsvcs/CosEvent/CEC_ProxyPushSupplier.cpp b/TAO/orbsvcs/orbsvcs/CosEvent/CEC_ProxyPushSupplier.cpp
new file mode 100644
index 00000000000..a25b00b5942
--- /dev/null
+++ b/TAO/orbsvcs/orbsvcs/CosEvent/CEC_ProxyPushSupplier.cpp
@@ -0,0 +1,983 @@
+// $Id$
+
+// Force CORBA::release(CORBA::Request...) prototype to be parsed
+// before TAO_Pseudo_{Var,Out}_T templates. All required
+// non-dependent names must be parsed prior to the template in
+// question when using compilers like g++ 3.4.x.
+#include "tao/DynamicInterface/DII_CORBA_methods.h"
+
+#include "orbsvcs/CosEvent/CEC_ProxyPushSupplier.h"
+#include "orbsvcs/CosEvent/CEC_Dispatching.h"
+#include "orbsvcs/CosEvent/CEC_EventChannel.h"
+#include "orbsvcs/CosEvent/CEC_ConsumerControl.h"
+#include "orbsvcs/ESF/ESF_RefCount_Guard.h"
+#include "orbsvcs/ESF/ESF_Proxy_RefCount_Guard.h"
+
+#if defined (TAO_HAS_TYPED_EVENT_CHANNEL)
+#include "orbsvcs/CosEvent/CEC_TypedEvent.h"
+#include "orbsvcs/CosEvent/CEC_TypedEventChannel.h"
+#include "tao/DynamicInterface/Request.h"
+#endif /* TAO_HAS_TYPED_EVENT_CHANNEL */
+
+#include "tao/debug.h"
+#include "ace/Reverse_Lock_T.h"
+
+#if ! defined (__ACE_INLINE__)
+#include "orbsvcs/CosEvent/CEC_ProxyPushSupplier.i"
+#endif /* __ACE_INLINE__ */
+
+ACE_RCSID (CosEvent,
+ CEC_ProxyPushSupplier,
+ "$Id$")
+
+TAO_BEGIN_VERSIONED_NAMESPACE_DECL
+
+typedef ACE_Reverse_Lock<ACE_Lock> TAO_CEC_Unlock;
+
+// TAO_CEC_ProxyPushSupplier Constructure (Un-typed EC)
+TAO_CEC_ProxyPushSupplier::
+TAO_CEC_ProxyPushSupplier (TAO_CEC_EventChannel* ec,
+ const ACE_Time_Value &timeout)
+ : event_channel_ (ec),
+ timeout_ (timeout),
+ refcount_ (1)
+{
+#if defined (TAO_HAS_TYPED_EVENT_CHANNEL)
+ typed_event_channel_ = 0;
+#endif /* TAO_HAS_TYPED_EVENT_CHANNEL */
+
+ this->lock_ =
+ this->event_channel_->create_supplier_lock ();
+
+ this->default_POA_ =
+ this->event_channel_->supplier_poa ();
+
+ this->event_channel_->get_servant_retry_map ().bind (this, 0);
+}
+
+// TAO_CEC_ProxyPushSupplier Constructure (Typed EC)
+#if defined (TAO_HAS_TYPED_EVENT_CHANNEL)
+TAO_CEC_ProxyPushSupplier::
+TAO_CEC_ProxyPushSupplier (TAO_CEC_TypedEventChannel* ec,
+ const ACE_Time_Value &timeout)
+ : timeout_ (timeout),
+ typed_event_channel_ (ec),
+ refcount_ (1)
+{
+ event_channel_ = 0;
+
+ this->lock_ =
+ this->typed_event_channel_->create_supplier_lock ();
+
+ this->default_POA_ =
+ this->typed_event_channel_->typed_supplier_poa ();
+
+ this->typed_event_channel_->get_servant_retry_map ().bind (this, 0);
+}
+#endif /* TAO_HAS_TYPED_EVENT_CHANNEL */
+
+TAO_CEC_ProxyPushSupplier::~TAO_CEC_ProxyPushSupplier (void)
+{
+#if defined (TAO_HAS_TYPED_EVENT_CHANNEL)
+ if (this->is_typed_ec () )
+ {
+ this->typed_event_channel_->get_servant_retry_map ().unbind (this);
+ this->typed_event_channel_->destroy_supplier_lock (this->lock_);
+ }
+ else
+ {
+ this->event_channel_->get_servant_retry_map ().unbind (this);
+ this->event_channel_->destroy_supplier_lock (this->lock_);
+ }
+#else
+ this->event_channel_->get_servant_retry_map ().unbind (this);
+ this->event_channel_->destroy_supplier_lock (this->lock_);
+#endif /* TAO_HAS_TYPED_EVENT_CHANNEL */
+}
+
+void
+TAO_CEC_ProxyPushSupplier::activate (
+ CosEventChannelAdmin::ProxyPushSupplier_ptr &activated_proxy
+ ACE_ENV_ARG_DECL)
+ ACE_THROW_SPEC ((CORBA::SystemException))
+{
+ CosEventChannelAdmin::ProxyPushSupplier_var result;
+ ACE_TRY
+ {
+ result = this->_this (ACE_ENV_SINGLE_ARG_PARAMETER);
+ ACE_TRY_CHECK;
+ }
+ ACE_CATCHANY
+ {
+ result = CosEventChannelAdmin::ProxyPushSupplier::_nil ();
+ }
+ ACE_ENDTRY;
+ activated_proxy = result._retn ();
+}
+
+void
+TAO_CEC_ProxyPushSupplier::deactivate (ACE_ENV_SINGLE_ARG_DECL)
+ ACE_THROW_SPEC ((CORBA::SystemException))
+{
+ ACE_TRY
+ {
+ PortableServer::POA_var poa =
+ this->_default_POA (ACE_ENV_SINGLE_ARG_PARAMETER);
+ ACE_TRY_CHECK;
+ PortableServer::ObjectId_var id =
+ poa->servant_to_id (this ACE_ENV_ARG_PARAMETER);
+ ACE_TRY_CHECK;
+ poa->deactivate_object (id.in () ACE_ENV_ARG_PARAMETER);
+ ACE_TRY_CHECK;
+ }
+ ACE_CATCHANY
+ {
+ // Exceptions here should not be propagated. They usually
+ // indicate that an object is beign disconnected twice, or some
+ // race condition, but not a fault that the user needs to know
+ // about.
+ }
+ ACE_ENDTRY;
+}
+
+void
+TAO_CEC_ProxyPushSupplier::shutdown (ACE_ENV_SINGLE_ARG_DECL)
+{
+#if defined (TAO_HAS_TYPED_EVENT_CHANNEL)
+ if (this->is_typed_ec () )
+ {
+ // Save the consumer we where connected to, we need to send a
+ // disconnect message to it.
+ CosTypedEventComm::TypedPushConsumer_var typed_consumer;
+ {
+ ACE_GUARD_THROW_EX (
+ ACE_Lock, ace_mon, *this->lock_,
+ CORBA::INTERNAL ());
+ // @@ CosEventChannelAdmin::EventChannel::SYNCHRONIZATION_ERROR ());
+ ACE_CHECK;
+
+ typed_consumer = this->typed_consumer_._retn ();
+ }
+
+ this->deactivate (ACE_ENV_SINGLE_ARG_PARAMETER);
+ ACE_CHECK;
+
+ if (CORBA::is_nil (typed_consumer.in ()))
+ return;
+
+ ACE_TRY_EX (typed)
+ {
+ typed_consumer->disconnect_push_consumer (ACE_ENV_SINGLE_ARG_PARAMETER);
+ ACE_TRY_CHECK_EX (typed);
+ }
+ ACE_CATCHANY
+ {
+ // Ignore exceptions, we must isolate other clients from
+ // problems on this one.
+ }
+ ACE_ENDTRY;
+ } /* this->is_typed_ec */
+ else
+ {
+#endif /* TAO_HAS_TYPED_EVENT_CHANNEL */
+
+ // Save the consumer we where connected to, we need to send a
+ // disconnect message to it.
+ CosEventComm::PushConsumer_var consumer;
+
+ {
+ ACE_GUARD_THROW_EX (
+ ACE_Lock, ace_mon, *this->lock_,
+ CORBA::INTERNAL ());
+ // @@ CosEventChannelAdmin::EventChannel::SYNCHRONIZATION_ERROR ());
+ ACE_CHECK;
+
+ consumer = this->consumer_._retn ();
+ }
+
+ this->deactivate (ACE_ENV_SINGLE_ARG_PARAMETER);
+ ACE_CHECK;
+
+ if (CORBA::is_nil (consumer.in ()))
+ return;
+
+ ACE_TRY
+ {
+ consumer->disconnect_push_consumer (ACE_ENV_SINGLE_ARG_PARAMETER);
+ ACE_TRY_CHECK;
+ }
+ ACE_CATCHANY
+ {
+ // Ignore exceptions, we must isolate other clients from
+ // problems on this one.
+ }
+ ACE_ENDTRY;
+#if defined (TAO_HAS_TYPED_EVENT_CHANNEL)
+ } /* ! this->is_typed_ec */
+#endif /* TAO_HAS_TYPED_EVENT_CHANNEL */
+}
+
+typedef TAO_ESF_Proxy_RefCount_Guard<TAO_CEC_EventChannel,TAO_CEC_ProxyPushSupplier> Destroy_Guard;
+
+void
+TAO_CEC_ProxyPushSupplier::push (const CORBA::Any &event
+ ACE_ENV_ARG_DECL)
+{
+ Destroy_Guard auto_destroy (this->refcount_,
+ this->event_channel_,
+ this);
+
+ {
+ ACE_GUARD (ACE_Lock, ace_mon, *this->lock_);
+
+ if (this->is_connected_i () == 0)
+ return;
+
+ TAO_ESF_RefCount_Guard<CORBA::ULong> cnt_mon (this->refcount_);
+
+ {
+ TAO_CEC_Unlock reverse_lock (*this->lock_);
+
+ ACE_GUARD (TAO_CEC_Unlock, ace_mon, reverse_lock);
+ this->event_channel_->dispatching ()->push (this,
+ event
+ ACE_ENV_ARG_PARAMETER);
+ ACE_CHECK;
+ }
+ }
+}
+
+#if defined (TAO_HAS_TYPED_EVENT_CHANNEL)
+typedef TAO_ESF_Proxy_RefCount_Guard<TAO_CEC_TypedEventChannel,TAO_CEC_ProxyPushSupplier> Destroy_Guard_Typed;
+
+void
+TAO_CEC_ProxyPushSupplier::invoke (const TAO_CEC_TypedEvent& typed_event
+ ACE_ENV_ARG_DECL)
+{
+ Destroy_Guard_Typed auto_destroy (this->refcount_,
+ this->typed_event_channel_,
+ this);
+ {
+
+ ACE_GUARD (ACE_Lock, ace_mon, *this->lock_);
+
+ if (this->is_connected_i () == 0)
+ return;
+
+ TAO_ESF_RefCount_Guard<CORBA::ULong> cnt_mon (this->refcount_);
+
+ {
+ TAO_CEC_Unlock reverse_lock (*this->lock_);
+
+ ACE_GUARD (TAO_CEC_Unlock, ace_mon, reverse_lock);
+ this->typed_event_channel_->dispatching ()->invoke (this,
+ typed_event
+ ACE_ENV_ARG_PARAMETER);
+ ACE_CHECK;
+ }
+ }
+}
+#endif /* TAO_HAS_TYPED_EVENT_CHANNEL */
+
+void
+TAO_CEC_ProxyPushSupplier::push_nocopy (CORBA::Any &event
+ ACE_ENV_ARG_DECL)
+{
+ Destroy_Guard auto_destroy (this->refcount_,
+ this->event_channel_,
+ this);
+
+ {
+ ACE_GUARD (ACE_Lock, ace_mon, *this->lock_);
+
+ if (this->is_connected_i () == 0)
+ return;
+
+ TAO_ESF_RefCount_Guard<CORBA::ULong> cnt_mon (this->refcount_);
+
+ {
+ TAO_CEC_Unlock reverse_lock (*this->lock_);
+
+ ACE_GUARD (TAO_CEC_Unlock, ace_mon, reverse_lock);
+ this->event_channel_->dispatching ()->push_nocopy (this,
+ event
+ ACE_ENV_ARG_PARAMETER);
+ ACE_CHECK;
+ }
+ }
+}
+
+void
+TAO_CEC_ProxyPushSupplier::cleanup_i (void)
+{
+ this->consumer_ =
+ CosEventComm::PushConsumer::_nil ();
+#if defined (TAO_HAS_TYPED_EVENT_CHANNEL)
+ this->typed_consumer_ =
+ CosTypedEventComm::TypedPushConsumer::_nil ();
+#endif /* TAO_HAS_TYPED_EVENT_CHANNEL */
+}
+
+CORBA::ULong
+TAO_CEC_ProxyPushSupplier::_incr_refcnt (void)
+{
+ ACE_GUARD_RETURN (ACE_Lock, ace_mon, *this->lock_, 0);
+ return this->refcount_++;
+}
+
+CORBA::ULong
+TAO_CEC_ProxyPushSupplier::_decr_refcnt (void)
+{
+ {
+ ACE_GUARD_RETURN (ACE_Lock, ace_mon, *this->lock_, 0);
+ --this->refcount_;
+ if (this->refcount_ != 0)
+ return this->refcount_;
+ }
+
+ // Notify the event channel
+#if defined (TAO_HAS_TYPED_EVENT_CHANNEL)
+ if (this->is_typed_ec () )
+ {
+ this->typed_event_channel_->destroy_proxy (this);
+ }
+ else
+ {
+ this->event_channel_->destroy_proxy (this);
+ }
+#else
+ this->event_channel_->destroy_proxy (this);
+#endif /* TAO_HAS_TYPED_EVENT_CHANNEL */
+ return 0;
+}
+
+void
+TAO_CEC_ProxyPushSupplier::connect_push_consumer (
+ CosEventComm::PushConsumer_ptr push_consumer
+ ACE_ENV_ARG_DECL)
+ ACE_THROW_SPEC ((CORBA::SystemException,
+ CosEventChannelAdmin::AlreadyConnected,
+ CosEventChannelAdmin::TypeError))
+{
+ // Nil PushConsumers are illegal
+ if (CORBA::is_nil (push_consumer))
+ ACE_THROW (CORBA::BAD_PARAM ());
+
+ {
+
+#if defined (TAO_HAS_TYPED_EVENT_CHANNEL)
+ // Check if we have a typed event channel
+ if (this->is_typed_ec () )
+ {
+ if (TAO_debug_level >= 10)
+ {
+ ACE_DEBUG ((LM_DEBUG,
+ ACE_TEXT ("***** connect_push_consumer, ")
+ ACE_TEXT ("Event channel is typed *****\n")));
+ }
+
+ // Temporary for the TypedPushConsumer and it's Typed interface,
+ // declared and obtained before the Guard to avoid deadlock during the
+ // _is_a (during _narrow) and get_typed_consumer invocations.
+ // They are eventually assigned onto this object inside the Guard.
+ CosTypedEventComm::TypedPushConsumer_var local_typed_consumer =
+ CosTypedEventComm::TypedPushConsumer::_narrow (push_consumer
+ ACE_ENV_ARG_PARAMETER);
+ ACE_CHECK;
+
+ // Obtain the typed object interface from the consumer
+ CORBA::Object_var local_typed_consumer_obj =
+ CORBA::Object::_duplicate (local_typed_consumer->get_typed_consumer (
+ ACE_ENV_SINGLE_ARG_PARAMETER) );
+ ACE_CHECK;
+
+ {
+ ACE_GUARD_THROW_EX (
+ ACE_Lock, ace_mon, *this->lock_,
+ CORBA::INTERNAL ());
+ // @@ CosEventChannelAdmin::EventChannel::SYNCHRONIZATION_ERROR ());
+ ACE_CHECK;
+
+ if (this->is_connected_i ())
+ {
+ if (this->typed_event_channel_->consumer_reconnect () == 0)
+ ACE_THROW (CosEventChannelAdmin::AlreadyConnected ());
+
+ // Re-connections are allowed....
+ this->cleanup_i ();
+
+ this->typed_consumer_ = apply_policy (local_typed_consumer.in () );
+ ACE_CHECK;
+
+ TAO_CEC_Unlock reverse_lock (*this->lock_);
+
+ {
+ ACE_GUARD_THROW_EX (
+ TAO_CEC_Unlock, ace_mon, reverse_lock,
+ CORBA::INTERNAL ());
+ // @@ CosEventChannelAdmin::EventChannel::SYNCHRONIZATION_ERROR ());
+ ACE_CHECK;
+
+ this->typed_event_channel_->reconnected (this ACE_ENV_ARG_PARAMETER);
+ ACE_CHECK;
+ }
+ return;
+
+ }
+
+ this->typed_consumer_ = apply_policy (local_typed_consumer.in () );
+ ACE_CHECK;
+
+ // Store the typed object interface from the consumer
+ this->typed_consumer_obj_ =
+ apply_policy_obj (local_typed_consumer_obj.in () );
+ ACE_CHECK;
+ }
+
+ // Notify the event channel...
+ this->typed_event_channel_->connected (this ACE_ENV_ARG_PARAMETER);
+ ACE_CHECK;
+
+ } /* this->is_typed_ec */
+ else
+ {
+#endif /* TAO_HAS_TYPED_EVENT_CHANNEL */
+
+ if (TAO_debug_level >= 10)
+ {
+ ACE_DEBUG ((LM_DEBUG,
+ ACE_TEXT ("***** connect_push_consumer, ")
+ ACE_TEXT ("Event channel is un-typed *****\n")));
+ }
+
+ {
+
+ ACE_GUARD_THROW_EX (
+ ACE_Lock, ace_mon, *this->lock_,
+ CORBA::INTERNAL ());
+ // @@ CosEventChannelAdmin::EventChannel::SYNCHRONIZATION_ERROR ());
+ ACE_CHECK;
+
+ if (this->is_connected_i ())
+ {
+ if (this->event_channel_->consumer_reconnect () == 0)
+ ACE_THROW (CosEventChannelAdmin::AlreadyConnected ());
+
+ // Re-connections are allowed....
+ this->cleanup_i ();
+
+ this->consumer_ = apply_policy (push_consumer);
+
+ TAO_CEC_Unlock reverse_lock (*this->lock_);
+
+ {
+ ACE_GUARD_THROW_EX (
+ TAO_CEC_Unlock, ace_mon, reverse_lock,
+ CORBA::INTERNAL ());
+ // @@ CosEventChannelAdmin::EventChannel::SYNCHRONIZATION_ERROR ());
+ ACE_CHECK;
+
+ this->event_channel_->reconnected (this ACE_ENV_ARG_PARAMETER);
+ ACE_CHECK;
+ }
+ return;
+ }
+
+ this->consumer_ = apply_policy (push_consumer);
+ }
+
+ // Notify the event channel...
+ this->event_channel_->connected (this ACE_ENV_ARG_PARAMETER);
+ ACE_CHECK;
+
+#if defined (TAO_HAS_TYPED_EVENT_CHANNEL)
+ } /* ! this->is_typed_ec */
+#endif /* TAO_HAS_TYPED_EVENT_CHANNEL */
+ }
+}
+
+CORBA::Object_ptr
+TAO_CEC_ProxyPushSupplier::apply_policy_obj (CORBA::Object_ptr pre)
+{
+#if defined (TAO_HAS_CORBA_MESSAGING) && TAO_HAS_CORBA_MESSAGING != 0
+ CORBA::Object_var post = CORBA::Object::_duplicate (pre);
+ if (this->timeout_ > ACE_Time_Value::zero)
+ {
+ CORBA::PolicyList policy_list;
+ policy_list.length (1);
+ if (this->typed_event_channel_)
+ {
+ policy_list[0] = this->typed_event_channel_->
+ create_roundtrip_timeout_policy (this->timeout_);
+ }
+ else
+ {
+ policy_list[0] = this->event_channel_->
+ create_roundtrip_timeout_policy (this->timeout_);
+ }
+ post = pre->_set_policy_overrides (policy_list, CORBA::ADD_OVERRIDE);
+
+ policy_list[0]->destroy ();
+ policy_list.length (0);
+ }
+ return post._retn ();
+#else
+ return CORBA::Object::_duplicate (pre);
+#endif /* TAO_HAS_CORBA_MESSAGING */
+}
+
+CosEventComm::PushConsumer_ptr
+TAO_CEC_ProxyPushSupplier::apply_policy (CosEventComm::PushConsumer_ptr pre)
+{
+ this->nopolicy_consumer_ = CosEventComm::PushConsumer::_duplicate (pre);
+ CORBA::Object_var post_obj = apply_policy_obj (pre);
+ CosEventComm::PushConsumer_var post =
+ CosEventComm::PushConsumer::_narrow (post_obj.in ());
+ return post._retn ();
+}
+
+#if defined (TAO_HAS_TYPED_EVENT_CHANNEL)
+CosTypedEventComm::TypedPushConsumer_ptr
+TAO_CEC_ProxyPushSupplier::apply_policy
+ (CosTypedEventComm::TypedPushConsumer_ptr pre)
+{
+ this->nopolicy_typed_consumer_ =
+ CosTypedEventComm::TypedPushConsumer::_duplicate (pre);
+ CORBA::Object_var post_obj = apply_policy_obj (pre);
+ CosTypedEventComm::TypedPushConsumer_var post =
+ CosTypedEventComm::TypedPushConsumer::_narrow (post_obj.in ());
+ return post._retn ();
+}
+#endif
+
+void
+TAO_CEC_ProxyPushSupplier::disconnect_push_supplier (
+ ACE_ENV_SINGLE_ARG_DECL)
+ ACE_THROW_SPEC ((CORBA::SystemException))
+{
+ CosEventComm::PushConsumer_var consumer;
+#if defined (TAO_HAS_TYPED_EVENT_CHANNEL)
+ CosTypedEventComm::TypedPushConsumer_var typed_consumer;
+#endif /* TAO_HAS_TYPED_EVENT_CHANNEL */
+
+ {
+ ACE_GUARD_THROW_EX (
+ ACE_Lock, ace_mon, *this->lock_,
+ CORBA::INTERNAL ());
+ // @@ CosEventChannelAdmin::EventChannel::SYNCHRONIZATION_ERROR ());
+ ACE_CHECK;
+
+ if (this->is_connected_i () == 0)
+ ACE_THROW (CORBA::BAD_INV_ORDER ());
+
+#if defined (TAO_HAS_TYPED_EVENT_CHANNEL)
+ if (this->is_typed_ec () )
+ {
+ typed_consumer = this->typed_consumer_._retn ();
+ }
+ else
+ {
+ consumer = this->consumer_._retn ();
+ }
+#else
+ consumer = this->consumer_._retn ();
+#endif /* TAO_HAS_TYPED_EVENT_CHANNEL */
+
+ this->cleanup_i ();
+ }
+
+ // Notify the event channel....
+#if defined (TAO_HAS_TYPED_EVENT_CHANNEL)
+ if (this->is_typed_ec () )
+ {
+ this->typed_event_channel_->disconnected (this ACE_ENV_ARG_PARAMETER);
+ ACE_CHECK;
+ }
+ else
+ {
+ this->event_channel_->disconnected (this ACE_ENV_ARG_PARAMETER);
+ ACE_CHECK;
+ }
+#else
+ this->event_channel_->disconnected (this ACE_ENV_ARG_PARAMETER);
+ ACE_CHECK;
+#endif /* TAO_HAS_TYPED_EVENT_CHANNEL */
+
+ // Disconnect callbacks
+#if defined (TAO_HAS_TYPED_EVENT_CHANNEL)
+ if (this->is_typed_ec () )
+ {
+ if (this->typed_event_channel_->disconnect_callbacks ())
+ {
+ ACE_TRY_EX (typed)
+ {
+ typed_consumer->disconnect_push_consumer (ACE_ENV_SINGLE_ARG_PARAMETER);
+ ACE_TRY_CHECK_EX (typed);
+ }
+ ACE_CATCHANY
+ {
+ // Ignore exceptions, we must isolate other clients from
+ // problems on this one.
+ ACE_PRINT_EXCEPTION (ACE_ANY_EXCEPTION,
+ "ProxySupplier::disconnect_push_supplier");
+ }
+ ACE_ENDTRY;
+ }
+ } /* this->is_typed_ec */
+ else
+ {
+#endif /* TAO_HAS_TYPED_EVENT_CHANNEL */
+
+ if (this->event_channel_->disconnect_callbacks ())
+ {
+ ACE_TRY
+ {
+ consumer->disconnect_push_consumer (ACE_ENV_SINGLE_ARG_PARAMETER);
+ ACE_TRY_CHECK;
+ }
+ ACE_CATCHANY
+ {
+ // Ignore exceptions, we must isolate other clients from
+ // problems on this one.
+ ACE_PRINT_EXCEPTION (ACE_ANY_EXCEPTION,
+ "ProxySupplier::disconnect_push_supplier");
+ }
+ ACE_ENDTRY;
+ }
+
+#if defined (TAO_HAS_TYPED_EVENT_CHANNEL)
+ } /* ! this->is_typed_ec */
+#endif /* TAO_HAS_TYPED_EVENT_CHANNEL */
+}
+
+void
+TAO_CEC_ProxyPushSupplier::push_to_consumer (const CORBA::Any& event
+ ACE_ENV_ARG_DECL)
+{
+ CosEventComm::PushConsumer_var consumer;
+ {
+ ACE_GUARD_THROW_EX (
+ ACE_Lock, ace_mon, *this->lock_,
+ CORBA::INTERNAL ());
+ // @@ CosEventChannelAdmin::EventChannel::SYNCHRONIZATION_ERROR ());
+ ACE_CHECK;
+
+ if (this->is_connected_i () == 0)
+ return; // ACE_THROW (CosEventComm::Disconnected ());????
+
+ consumer =
+ CosEventComm::PushConsumer::_duplicate (this->consumer_.in ());
+ }
+
+ TAO_CEC_ConsumerControl *control =
+ this->event_channel_->consumer_control ();
+ ACE_TRY
+ {
+ consumer->push (event ACE_ENV_ARG_PARAMETER);
+ ACE_TRY_CHECK;
+
+ // Inform the control that we were able to push something
+ control->successful_transmission(this);
+ }
+ ACE_CATCH (CORBA::OBJECT_NOT_EXIST, not_used)
+ {
+ control->consumer_not_exist (this ACE_ENV_ARG_PARAMETER);
+ ACE_TRY_CHECK;
+ }
+ ACE_CATCH (CORBA::SystemException, sysex)
+ {
+ control->system_exception (this,
+ sysex
+ ACE_ENV_ARG_PARAMETER);
+ ACE_TRY_CHECK;
+ }
+ ACE_CATCHANY
+ {
+ // Shouldn't happen, but does not hurt
+ }
+ ACE_ENDTRY;
+}
+
+void
+TAO_CEC_ProxyPushSupplier::reactive_push_to_consumer (
+ const CORBA::Any& event
+ ACE_ENV_ARG_DECL)
+{
+ CosEventComm::PushConsumer_var consumer;
+ {
+ ACE_GUARD (ACE_Lock, ace_mon, *this->lock_);
+ if (this->is_connected_i () == 0)
+ return; // TAO_THROW (CosEventComm::Disconnected ());????
+
+ consumer =
+ CosEventComm::PushConsumer::_duplicate (this->consumer_.in ());
+ }
+
+ TAO_CEC_ConsumerControl *control =
+ this->event_channel_->consumer_control ();
+
+ ACE_TRY
+ {
+ consumer->push (event ACE_ENV_ARG_PARAMETER);
+ ACE_TRY_CHECK;
+
+ // Inform the control that we were able to push something
+ control->successful_transmission(this);
+ }
+ ACE_CATCH (CORBA::OBJECT_NOT_EXIST, not_used)
+ {
+ if (TAO_debug_level >= 4)
+ {
+ ACE_PRINT_EXCEPTION (not_used, "during TAO_CEC_ProxyPushSupplier::reactive_push_to_consumer");
+ }
+ control->consumer_not_exist (this ACE_ENV_ARG_PARAMETER);
+ ACE_TRY_CHECK;
+ }
+ ACE_CATCH (CORBA::SystemException, sysex)
+ {
+ if (TAO_debug_level >= 4)
+ {
+ ACE_PRINT_EXCEPTION (sysex, "during TAO_CEC_ProxyPushSupplier::reactive_push_to_consumer");
+ }
+
+ control->system_exception (this,
+ sysex
+ ACE_ENV_ARG_PARAMETER);
+ ACE_TRY_CHECK;
+ }
+ ACE_CATCHANY
+ {
+ // Shouldn't happen, but does not hurt
+ }
+ ACE_ENDTRY;
+}
+
+#if defined (TAO_HAS_TYPED_EVENT_CHANNEL)
+void
+TAO_CEC_ProxyPushSupplier::invoke_to_consumer (const TAO_CEC_TypedEvent &typed_event
+ ACE_ENV_ARG_DECL)
+{
+ CORBA::Object_var typed_consumer_obj;
+
+ // The DII target request object
+ CORBA::Request_var target_request;
+
+ {
+ ACE_GUARD_THROW_EX (
+ ACE_Lock, ace_mon, *this->lock_,
+ CORBA::INTERNAL ());
+ // @@ CosEventChannelAdmin::EventChannel::SYNCHRONIZATION_ERROR ());
+ ACE_CHECK;
+
+ if (this->is_connected_i () == 0)
+ return; // ACE_THROW (CosEventComm::Disconnected ());????
+
+ typed_consumer_obj =
+ CORBA::Object::_duplicate (this->typed_consumer_obj_.in ());
+ }
+
+ TAO_CEC_ConsumerControl *control =
+ this->typed_event_channel_->consumer_control ();
+
+ // Create the DII request
+ ACE_TRY
+ {
+ typed_consumer_obj_->_create_request (0, // ctx
+ typed_event.operation_,
+ typed_event.list_,
+ 0, // result
+ 0, // exception_list,
+ 0, // context_list,
+ target_request.inout(),
+ 0
+ ACE_ENV_ARG_PARAMETER);
+ ACE_TRY_CHECK;
+
+ // Call the DII invoke for the operation on the target object
+ target_request->invoke (ACE_ENV_SINGLE_ARG_PARAMETER);
+ ACE_TRY_CHECK;
+
+ // Inform the control that we were able to invoke something
+ control->successful_transmission(this);
+ }
+ ACE_CATCH (CORBA::OBJECT_NOT_EXIST, not_used)
+ {
+ if (TAO_debug_level >= 4)
+ {
+ ACE_PRINT_EXCEPTION (not_used, "during TAO_CEC_ProxyPushSupplier::invoke_to_consumer");
+ }
+ control->consumer_not_exist (this ACE_ENV_ARG_PARAMETER);
+ ACE_TRY_CHECK;
+ }
+ ACE_CATCH (CORBA::SystemException, sysex)
+ {
+ if (TAO_debug_level >= 4)
+ {
+ ACE_PRINT_EXCEPTION (sysex, "during TAO_CEC_ProxyPushSupplier::invoke_to_consumer");
+ }
+ control->system_exception (this,
+ sysex
+ ACE_ENV_ARG_PARAMETER);
+ ACE_TRY_CHECK;
+ }
+ ACE_CATCHANY
+ {
+ // Shouldn't happen, but does not hurt
+ if (TAO_debug_level >= 4)
+ {
+ ACE_PRINT_EXCEPTION (ACE_ANY_EXCEPTION,
+ "ACE_ANY_EXCEPTION raised during TAO_CEC_ProxyPushSupplier::invoke_to_consumer");
+ }
+ }
+ ACE_ENDTRY;
+}
+
+void
+TAO_CEC_ProxyPushSupplier::reactive_invoke_to_consumer (
+ const TAO_CEC_TypedEvent& typed_event
+ ACE_ENV_ARG_DECL)
+{
+ CORBA::Object_var typed_consumer_obj;
+
+ // The DII target request object
+ CORBA::Request_var target_request;
+
+ {
+ ACE_GUARD (ACE_Lock, ace_mon, *this->lock_);
+ if (this->is_connected_i () == 0)
+ {
+ return; // TAO_THROW (CosEventComm::Disconnected ());????
+ }
+ if (CORBA::is_nil(this->typed_consumer_obj_.in()))
+ {
+ return; // TAO_THROW ...
+ }
+
+ typed_consumer_obj =
+ CORBA::Object::_duplicate (this->typed_consumer_obj_.in ());
+ }
+
+ TAO_CEC_ConsumerControl *control =
+ this->typed_event_channel_->consumer_control ();
+
+ // Create the DII request
+ ACE_TRY
+ {
+ typed_consumer_obj_->_create_request (0, // ctx
+ typed_event.operation_,
+ typed_event.list_,
+ 0, // result
+ 0, // exception_list,
+ 0, // context_list,
+ target_request.inout(),
+ 0
+ ACE_ENV_ARG_PARAMETER);
+ ACE_TRY_CHECK;
+
+ // Call the DII invoke for the operation on the target object
+ target_request->invoke (ACE_ENV_SINGLE_ARG_PARAMETER);
+ ACE_TRY_CHECK;
+
+ // Inform the control that we were able to invoke something
+ control->successful_transmission(this);
+ }
+ ACE_CATCH (CORBA::OBJECT_NOT_EXIST, not_used)
+ {
+ if (TAO_debug_level >= 4)
+ {
+ ACE_PRINT_EXCEPTION (not_used, "during TAO_CEC_ProxyPushSupplier::reactive_invoke_to_consumer");
+ }
+ control->consumer_not_exist (this ACE_ENV_ARG_PARAMETER);
+ ACE_TRY_CHECK;
+ }
+ ACE_CATCH (CORBA::SystemException, sysex)
+ {
+ if (TAO_debug_level >= 4)
+ {
+ ACE_PRINT_EXCEPTION (sysex, "during TAO_CEC_ProxyPushSupplier::reactive_invoke_to_consumer");
+ }
+ control->system_exception (this,
+ sysex
+ ACE_ENV_ARG_PARAMETER);
+ ACE_TRY_CHECK;
+ }
+ ACE_CATCHANY
+ {
+ if (TAO_debug_level >= 4)
+ {
+ ACE_PRINT_EXCEPTION (ACE_ANY_EXCEPTION,
+ "ACE_ANY_EXCEPTION raised during TAO_CEC_ProxyPushSupplier::reactive_invoke_to_consumer");
+ }
+ }
+ ACE_ENDTRY;
+}
+#endif /* TAO_HAS_TYPED_EVENT_CHANNEL */
+
+CORBA::Boolean
+TAO_CEC_ProxyPushSupplier::consumer_non_existent (
+ CORBA::Boolean_out disconnected
+ ACE_ENV_ARG_DECL)
+{
+ CORBA::Object_var consumer;
+ {
+ ACE_GUARD_THROW_EX (
+ ACE_Lock, ace_mon, *this->lock_,
+ CORBA::INTERNAL ());
+ ACE_CHECK_RETURN (0);
+
+ disconnected = 0;
+ if (this->is_connected_i () == 0)
+ {
+ disconnected = 1;
+ return 0;
+ }
+
+#if defined (TAO_HAS_TYPED_EVENT_CHANNEL)
+ if (this->is_typed_ec () )
+ {
+ if (CORBA::is_nil (this->nopolicy_typed_consumer_.in ()))
+ {
+ return 0;
+ }
+ consumer = CORBA::Object::_duplicate
+ (this->nopolicy_typed_consumer_.in ());
+ }
+ else
+ {
+#endif /* TAO_HAS_TYPED_EVENT_CHANNEL */
+ if (CORBA::is_nil (this->nopolicy_consumer_.in ()))
+ {
+ return 0;
+ }
+ consumer = CORBA::Object::_duplicate (this->nopolicy_consumer_.in ());
+#if defined (TAO_HAS_TYPED_EVENT_CHANNEL)
+ } /* ! this->is_typed_ec */
+#endif /* TAO_HAS_TYPED_EVENT_CHANNEL */
+ }
+
+#if (TAO_HAS_MINIMUM_CORBA == 0)
+ return consumer->_non_existent (ACE_ENV_SINGLE_ARG_PARAMETER);
+#else
+ return 0;
+#endif /* TAO_HAS_MINIMUM_CORBA */
+}
+
+PortableServer::POA_ptr
+TAO_CEC_ProxyPushSupplier::_default_POA (ACE_ENV_SINGLE_ARG_DECL_NOT_USED)
+{
+ return PortableServer::POA::_duplicate (this->default_POA_.in ());
+}
+
+void
+TAO_CEC_ProxyPushSupplier::_add_ref (ACE_ENV_SINGLE_ARG_DECL_NOT_USED)
+{
+ this->_incr_refcnt ();
+}
+
+void
+TAO_CEC_ProxyPushSupplier::_remove_ref (ACE_ENV_SINGLE_ARG_DECL_NOT_USED)
+{
+ this->_decr_refcnt ();
+}
+
+TAO_END_VERSIONED_NAMESPACE_DECL
diff --git a/TAO/orbsvcs/orbsvcs/CosEvent/CEC_ProxyPushSupplier.h b/TAO/orbsvcs/orbsvcs/CosEvent/CEC_ProxyPushSupplier.h
new file mode 100644
index 00000000000..ab39589a301
--- /dev/null
+++ b/TAO/orbsvcs/orbsvcs/CosEvent/CEC_ProxyPushSupplier.h
@@ -0,0 +1,233 @@
+// -*- C++ -*-
+
+//=============================================================================
+/**
+ * @file CEC_ProxyPushSupplier.h
+ *
+ * $Id$
+ *
+ * @author Carlos O'Ryan (coryan@cs.wustl.edu)
+ * @author Jon Astle (jon@astle45.fsnet.co.uk)
+ */
+//=============================================================================
+
+
+#ifndef TAO_CEC_PROXYPUSHSUPPLIER_H
+#define TAO_CEC_PROXYPUSHSUPPLIER_H
+
+#include /**/ "ace/pre.h"
+
+#include "orbsvcs/CosEventChannelAdminS.h"
+
+#if defined (TAO_HAS_TYPED_EVENT_CHANNEL)
+#include "orbsvcs/CosTypedEventChannelAdminS.h"
+#endif /* TAO_HAS_TYPED_EVENT_CHANNEL */
+
+#include "orbsvcs/CosEvent/event_serv_export.h"
+
+#if !defined (ACE_LACKS_PRAGMA_ONCE)
+# pragma once
+#endif /* ACE_LACKS_PRAGMA_ONCE */
+
+TAO_BEGIN_VERSIONED_NAMESPACE_DECL
+
+class TAO_CEC_EventChannel;
+class TAO_CEC_ProxyPushConsumer;
+#if defined (TAO_HAS_TYPED_EVENT_CHANNEL)
+class TAO_CEC_TypedEvent;
+class TAO_CEC_TypedEventChannel;
+#endif /* TAO_HAS_TYPED_EVENT_CHANNEL */
+
+/**
+ * @class TAO_CEC_ProxyPushSupplier
+ *
+ * @brief ProxyPushSupplier
+ *
+ * Implement the CosEventChannelAdmin::ProxyPushSupplier interface,
+ * remember that this class is used to communicate with a
+ * PushConsumer, so, in effect, this is the ambassador for a
+ * consumer inside the event channel.
+ * = MEMORY MANAGMENT
+ * It does not assume ownership of the TAO_CEC_Dispatching object.
+ * It makes a copy of the ConsumerQOS and the consumer object
+ * reference.
+ * = LOCKING
+ * Locking is strategized, the event channel acts as a factory for
+ * the locking strategies.
+ */
+class TAO_Event_Serv_Export TAO_CEC_ProxyPushSupplier : public POA_CosEventChannelAdmin::ProxyPushSupplier
+{
+public:
+ typedef CosEventChannelAdmin::ProxyPushSupplier_ptr _ptr_type;
+ typedef CosEventChannelAdmin::ProxyPushSupplier_var _var_type;
+
+ /// constructor...
+ TAO_CEC_ProxyPushSupplier (TAO_CEC_EventChannel* event_channel,
+ const ACE_Time_Value &timeout);
+
+ /// typed ec constructor
+#if defined (TAO_HAS_TYPED_EVENT_CHANNEL)
+ TAO_CEC_ProxyPushSupplier (TAO_CEC_TypedEventChannel* typed_event_channel,
+ const ACE_Time_Value &timeout);
+#endif /* TAO_HAS_TYPED_EVENT_CHANNEL */
+
+ /// destructor...
+ virtual ~TAO_CEC_ProxyPushSupplier (void);
+
+ /// Activate in the POA
+ virtual void activate (
+ CosEventChannelAdmin::ProxyPushSupplier_ptr &
+ ACE_ENV_ARG_DECL)
+ ACE_THROW_SPEC ((CORBA::SystemException));
+
+ /// Deactivate from the POA
+ virtual void deactivate (ACE_ENV_SINGLE_ARG_DECL)
+ ACE_THROW_SPEC ((CORBA::SystemException));
+
+ /// Return 0 if no consumer is connected...
+ CORBA::Boolean is_connected (void) const;
+
+ /**
+ * Return the consumer object reference. It returns nil() if it has
+ * not connected yet.
+ * NOTE: This method does not return a new reference!!! Doing so
+ * will increase the locking overhead on the critical path.
+ */
+ CosEventComm::PushConsumer_ptr consumer (void) const;
+
+ /// The event channel is shutting down
+ virtual void shutdown (ACE_ENV_SINGLE_ARG_DECL);
+
+ /// Internal methods to push an event to each consumer.
+ virtual void push (const CORBA::Any &event
+ ACE_ENV_ARG_DECL);
+ virtual void push_nocopy (CORBA::Any &event
+ ACE_ENV_ARG_DECL);
+ /// Internal methods to invoke a typed event to each consumer.
+#if defined (TAO_HAS_TYPED_EVENT_CHANNEL)
+ virtual void invoke (const TAO_CEC_TypedEvent& typed_event
+ ACE_ENV_ARG_DECL);
+#endif /* TAO_HAS_TYPED_EVENT_CHANNEL */
+
+ /// Pushes to the consumer, verifies that it is connected.
+ void push_to_consumer (const CORBA::Any &event
+ ACE_ENV_ARG_DECL);
+ void reactive_push_to_consumer (const CORBA::Any &event
+ ACE_ENV_ARG_DECL);
+#if defined (TAO_HAS_TYPED_EVENT_CHANNEL)
+ void invoke_to_consumer (const TAO_CEC_TypedEvent &typed_event
+ ACE_ENV_ARG_DECL);
+ void reactive_invoke_to_consumer (const TAO_CEC_TypedEvent &typed_event
+ ACE_ENV_ARG_DECL);
+#endif /* TAO_HAS_TYPED_EVENT_CHANNEL */
+
+ /**
+ * Invoke the _non_existent() pseudo-operation on the consumer. If
+ * it is disconnected then it returns true and sets the
+ * <disconnected> flag.
+ */
+ CORBA::Boolean consumer_non_existent (CORBA::Boolean_out disconnected
+ ACE_ENV_ARG_DECL);
+
+ // = The CosEventChannelAdmin::ProxyPushSupplier methods...
+ virtual void connect_push_consumer (
+ CosEventComm::PushConsumer_ptr push_consumer
+ ACE_ENV_ARG_DECL_NOT_USED)
+ ACE_THROW_SPEC ((CORBA::SystemException,
+ CosEventChannelAdmin::AlreadyConnected,
+ CosEventChannelAdmin::TypeError));
+ virtual void disconnect_push_supplier (ACE_ENV_SINGLE_ARG_DECL_NOT_USED)
+ ACE_THROW_SPEC ((CORBA::SystemException));
+
+ /// Increment and decrement the reference count.
+ CORBA::ULong _incr_refcnt (void);
+ CORBA::ULong _decr_refcnt (void);
+
+ // = The Servant methods
+ virtual PortableServer::POA_ptr _default_POA (ACE_ENV_SINGLE_ARG_DECL);
+ virtual void _add_ref (ACE_ENV_SINGLE_ARG_DECL);
+ virtual void _remove_ref (ACE_ENV_SINGLE_ARG_DECL);
+
+protected:
+ /// Set the consumer, used by some implementations to change the
+ /// policies used when invoking operations on the consumer.
+ void consumer (CosEventComm::PushConsumer_ptr consumer);
+ void consumer_i (CosEventComm::PushConsumer_ptr consumer);
+#if defined (TAO_HAS_TYPED_EVENT_CHANNEL)
+ void consumer (CosTypedEventComm::TypedPushConsumer_ptr typed_consumer);
+ void consumer_i (CosTypedEventComm::TypedPushConsumer_ptr typed_consumer);
+#endif /* TAO_HAS_TYPED_EVENT_CHANNEL */
+
+ /// The private version (without locking) of is_connected().
+ CORBA::Boolean is_connected_i (void) const;
+
+ /// Release the child and the consumer
+ void cleanup_i (void);
+
+#if defined (TAO_HAS_TYPED_EVENT_CHANNEL)
+ CORBA::Boolean is_typed_ec (void) const;
+#endif /* TAO_HAS_TYPED_EVENT_CHANNEL */
+
+ /// Assigns the parameter to both consumer_ and nopolicy_consumer_, and
+ /// applies policies (when appropriate) to consumer_.
+ CosEventComm::PushConsumer_ptr apply_policy
+ (CosEventComm::PushConsumer_ptr c);
+
+#if defined (TAO_HAS_TYPED_EVENT_CHANNEL)
+ CosTypedEventComm::TypedPushConsumer_ptr apply_policy
+ (CosTypedEventComm::TypedPushConsumer_ptr c);
+#endif
+
+ CORBA::Object_ptr apply_policy_obj (CORBA::Object_ptr c);
+
+private:
+ /// The Event Channel that owns this object.
+ TAO_CEC_EventChannel* event_channel_;
+
+ ACE_Time_Value timeout_;
+
+ /// The Typed Event Channel that owns this object.
+#if defined (TAO_HAS_TYPED_EVENT_CHANNEL)
+ TAO_CEC_TypedEventChannel *typed_event_channel_;
+#endif /* TAO_HAS_TYPED_EVENT_CHANNEL */
+
+ /// The locking strategy.
+ ACE_Lock* lock_;
+
+ /// The reference count.
+ CORBA::ULong refcount_;
+
+ /// The consumer -- use apply_policy() instead of assigning directly to
+ /// consumer_. This will keep consumer_ and nopolicy_consumer_ in sync.
+ CosEventComm::PushConsumer_var consumer_;
+
+ /// The consumer without any policies applied
+ CosEventComm::PushConsumer_var nopolicy_consumer_;
+
+#if defined (TAO_HAS_TYPED_EVENT_CHANNEL)
+ /// The typed consumer -- use apply_policy() instead of assigning directly to
+ /// typed_consumer_. This will keep typed_consumer_ and
+ /// nopolicy_typed_consumer_ in sync.
+ CosTypedEventComm::TypedPushConsumer_var typed_consumer_;
+
+ /// The consumer object returned from get_typed_consumer()
+ CORBA::Object_var typed_consumer_obj_;
+
+ /// The typed consumer without any policies applied
+ CosTypedEventComm::TypedPushConsumer_var nopolicy_typed_consumer_;
+
+#endif /* TAO_HAS_TYPED_EVENT_CHANNEL */
+
+ /// Store the default POA.
+ PortableServer::POA_var default_POA_;
+};
+
+TAO_END_VERSIONED_NAMESPACE_DECL
+
+#if defined (__ACE_INLINE__)
+#include "orbsvcs/CosEvent/CEC_ProxyPushSupplier.i"
+#endif /* __ACE_INLINE__ */
+
+#include /**/ "ace/post.h"
+
+#endif /* TAO_CEC_PROXYPUSHSUPPLIER_H */
diff --git a/TAO/orbsvcs/orbsvcs/CosEvent/CEC_ProxyPushSupplier.i b/TAO/orbsvcs/orbsvcs/CosEvent/CEC_ProxyPushSupplier.i
new file mode 100644
index 00000000000..9f92df16b06
--- /dev/null
+++ b/TAO/orbsvcs/orbsvcs/CosEvent/CEC_ProxyPushSupplier.i
@@ -0,0 +1,98 @@
+// -*- C++ -*-
+//
+// $Id$
+
+TAO_BEGIN_VERSIONED_NAMESPACE_DECL
+
+ACE_INLINE CORBA::Boolean
+TAO_CEC_ProxyPushSupplier::is_connected_i (void) const
+{
+#if defined (TAO_HAS_TYPED_EVENT_CHANNEL)
+ if (this->is_typed_ec ())
+ {
+ return !CORBA::is_nil (this->typed_consumer_.in ());
+ }
+ else
+ {
+ return !CORBA::is_nil (this->consumer_.in ());
+ }
+#else
+ return !CORBA::is_nil (this->consumer_.in ());
+#endif /* TAO_HAS_TYPED_EVENT_CHANNEL */
+}
+
+ACE_INLINE CORBA::Boolean
+TAO_CEC_ProxyPushSupplier::is_connected (void) const
+{
+ ACE_GUARD_RETURN (ACE_Lock, ace_mon, *this->lock_, 0);
+
+ return this->is_connected_i ();
+}
+
+ACE_INLINE CosEventComm::PushConsumer_ptr
+TAO_CEC_ProxyPushSupplier::consumer (void) const
+{
+ ACE_GUARD_RETURN (ACE_Lock, ace_mon, *this->lock_, 0);
+
+#if defined (TAO_HAS_TYPED_EVENT_CHANNEL)
+ if (this->is_typed_ec ())
+ {
+ return this->typed_consumer_.in ();
+ }
+ else
+ {
+ return this->consumer_.in ();
+ }
+#else
+ return this->consumer_.in ();
+#endif /* TAO_HAS_TYPED_EVENT_CHANNEL */
+}
+
+ACE_INLINE void
+TAO_CEC_ProxyPushSupplier::consumer_i (CosEventComm::PushConsumer_ptr consumer)
+{
+ this->consumer_ = consumer;
+}
+
+#if defined (TAO_HAS_TYPED_EVENT_CHANNEL)
+ACE_INLINE void
+TAO_CEC_ProxyPushSupplier::consumer_i (CosTypedEventComm::TypedPushConsumer_ptr typed_consumer)
+{
+ this->typed_consumer_ = typed_consumer;
+}
+#endif /* TAO_HAS_TYPED_EVENT_CHANNEL */
+
+ACE_INLINE void
+TAO_CEC_ProxyPushSupplier::consumer (CosEventComm::PushConsumer_ptr consumer)
+{
+ ACE_GUARD (ACE_Lock, ace_mon, *this->lock_);
+
+ this->consumer_i (consumer);
+}
+
+#if defined (TAO_HAS_TYPED_EVENT_CHANNEL)
+ACE_INLINE void
+TAO_CEC_ProxyPushSupplier::consumer (CosTypedEventComm::TypedPushConsumer_ptr typed_consumer)
+{
+ ACE_GUARD (ACE_Lock, ace_mon, *this->lock_);
+
+ this->consumer_i (typed_consumer);
+}
+#endif /* TAO_HAS_TYPED_EVENT_CHANNEL */
+
+#if defined (TAO_HAS_TYPED_EVENT_CHANNEL)
+ACE_INLINE CORBA::Boolean
+TAO_CEC_ProxyPushSupplier::is_typed_ec (void) const
+{
+ if (this->typed_event_channel_ != 0)
+ {
+ return true;
+ }
+ else
+ {
+ return false;
+ }
+}
+#endif /* TAO_HAS_TYPED_EVENT_CHANNEL */
+
+TAO_END_VERSIONED_NAMESPACE_DECL
diff --git a/TAO/orbsvcs/orbsvcs/CosEvent/CEC_Pulling_Strategy.cpp b/TAO/orbsvcs/orbsvcs/CosEvent/CEC_Pulling_Strategy.cpp
new file mode 100644
index 00000000000..eeb8c998046
--- /dev/null
+++ b/TAO/orbsvcs/orbsvcs/CosEvent/CEC_Pulling_Strategy.cpp
@@ -0,0 +1,13 @@
+// $Id$
+
+#include "orbsvcs/CosEvent/CEC_Pulling_Strategy.h"
+
+ACE_RCSID(CosEvent, CEC_Pulling_Strategy, "$Id$")
+
+TAO_BEGIN_VERSIONED_NAMESPACE_DECL
+
+TAO_CEC_Pulling_Strategy::~TAO_CEC_Pulling_Strategy (void)
+{
+}
+
+TAO_END_VERSIONED_NAMESPACE_DECL
diff --git a/TAO/orbsvcs/orbsvcs/CosEvent/CEC_Pulling_Strategy.h b/TAO/orbsvcs/orbsvcs/CosEvent/CEC_Pulling_Strategy.h
new file mode 100644
index 00000000000..791dda5c1d2
--- /dev/null
+++ b/TAO/orbsvcs/orbsvcs/CosEvent/CEC_Pulling_Strategy.h
@@ -0,0 +1,71 @@
+// -*- C++ -*-
+
+//=============================================================================
+/**
+ * @file CEC_Pulling_Strategy.h
+ *
+ * $Id$
+ *
+ * @author Carlos O'Ryan (coryan@cs.wustl.edu)
+ */
+//=============================================================================
+
+
+#ifndef TAO_CEC_PULLING_STRATEGY_H
+#define TAO_CEC_PULLING_STRATEGY_H
+
+#include /**/ "ace/pre.h"
+
+#include "orbsvcs/CosEvent/event_serv_export.h"
+
+#if !defined (ACE_LACKS_PRAGMA_ONCE)
+# pragma once
+#endif /* ACE_LACKS_PRAGMA_ONCE */
+
+#include "tao/Basic_Types.h"
+
+TAO_BEGIN_VERSIONED_NAMESPACE_DECL
+
+/**
+ * @class TAO_CEC_Pulling_Strategy
+ *
+ * @brief Define the interface for the pulling strategies.
+ *
+ * The EC may be configured with different pulling strategies,
+ * for instance, it can use a pool of threads to dispatch the
+ * events, or a set of queues with threads at different priorities
+ * for each queue or can simply push the event to the consumer in
+ * FIFO order.
+ */
+class TAO_Event_Serv_Export TAO_CEC_Pulling_Strategy
+{
+public:
+ /// destructor...
+ virtual ~TAO_CEC_Pulling_Strategy (void);
+
+ /// Initialize all the data structures, activate any internal threads,
+ /// etc.
+ virtual void activate (void) = 0;
+
+ /**
+ * Deactivate any internal threads and cleanup internal data
+ * structures, it should only return once the threads have finished
+ * their jobs.
+ */
+ virtual void shutdown (void) = 0;
+
+#if 0
+ /// Some strategies may want to keep track of connected consumers.
+ virtual void connected (TAO_CEC_ProxyPullConsumer *
+ ACE_ENV_ARG_DECL_NOT_USED) = 0;
+ virtual void reconnected (TAO_CEC_ProxyPullConsumer *
+ ACE_ENV_ARG_DECL_NOT_USED) = 0;
+ virtual void diconnected (TAO_CEC_ProxyPullConsumer *
+ ACE_ENV_ARG_DECL_NOT_USED) = 0;
+#endif /* 0 */
+};
+
+TAO_END_VERSIONED_NAMESPACE_DECL
+
+#include /**/ "ace/post.h"
+#endif /* TAO_CEC_PULLING_STRATEGY_H */
diff --git a/TAO/orbsvcs/orbsvcs/CosEvent/CEC_Reactive_ConsumerControl.cpp b/TAO/orbsvcs/orbsvcs/CosEvent/CEC_Reactive_ConsumerControl.cpp
new file mode 100644
index 00000000000..934fc6e4c82
--- /dev/null
+++ b/TAO/orbsvcs/orbsvcs/CosEvent/CEC_Reactive_ConsumerControl.cpp
@@ -0,0 +1,492 @@
+// $Id$
+
+// Note: This class controls the behaviour of consumers connected to both
+// the Typed and Un-typed Event Channels. A check must be made in the code
+// to ensure the correct EC is referenced.
+
+#include "orbsvcs/CosEvent/CEC_EventChannel.h"
+#include "orbsvcs/CosEvent/CEC_ConsumerAdmin.h"
+#include "orbsvcs/CosEvent/CEC_Reactive_ConsumerControl.h"
+
+#if defined (TAO_HAS_TYPED_EVENT_CHANNEL)
+#include "orbsvcs/CosEvent/CEC_TypedEventChannel.h"
+#include "orbsvcs/CosEvent/CEC_TypedConsumerAdmin.h"
+#endif /* TAO_HAS_TYPED_EVENT_CHANNEL */
+
+#include "orbsvcs/CosEvent/CEC_ProxyPushSupplier.h"
+#include "orbsvcs/CosEvent/CEC_ProxyPullSupplier.h"
+
+#include "orbsvcs/Time_Utilities.h"
+
+#if defined (TAO_HAS_CORBA_MESSAGING) && TAO_HAS_CORBA_MESSAGING != 0
+#include "tao/Messaging/Messaging.h"
+#endif
+
+#include "tao/ORB_Core.h"
+#include "tao/debug.h"
+#include "ace/Reactor.h"
+
+#if ! defined (__ACE_INLINE__)
+#include "orbsvcs/CosEvent/CEC_Reactive_ConsumerControl.i"
+#endif /* __ACE_INLINE__ */
+
+ACE_RCSID (CosEvent,
+ CEC_Reactive_ConsumerControl,
+ "$Id$")
+
+TAO_BEGIN_VERSIONED_NAMESPACE_DECL
+
+// TAO_CEC_Reactive_ConsumerControl constructor for the Un-typed EC
+TAO_CEC_Reactive_ConsumerControl::
+ TAO_CEC_Reactive_ConsumerControl (const ACE_Time_Value &rate,
+ const ACE_Time_Value &timeout,
+ unsigned int retries,
+ TAO_CEC_EventChannel *ec,
+ CORBA::ORB_ptr orb)
+ : rate_ (rate),
+ timeout_ (timeout),
+ retries_ (retries),
+ adapter_ (this),
+ event_channel_ (ec),
+#if defined (TAO_HAS_TYPED_EVENT_CHANNEL)
+ typed_event_channel_ (0),
+#endif /* TAO_HAS_TYPED_EVENT_CHANNEL */
+ orb_ (CORBA::ORB::_duplicate (orb))
+#if defined (TAO_HAS_CORBA_MESSAGING) && TAO_HAS_CORBA_MESSAGING != 0
+ // Initialise timer_id_ to an invalid timer id, so that in case we don't
+ // schedule a timer, we don't cancel a random timer at shutdown
+ , timer_id_ (-1)
+#endif /* TAO_HAS_CORBA_MESSAGING */
+{
+ this->reactor_ =
+ this->orb_->orb_core ()->reactor ();
+}
+
+// TAO_CEC_Reactive_ConsumerControl constructor for the Typed EC
+#if defined (TAO_HAS_TYPED_EVENT_CHANNEL)
+TAO_CEC_Reactive_ConsumerControl::
+ TAO_CEC_Reactive_ConsumerControl (const ACE_Time_Value &rate,
+ const ACE_Time_Value &timeout,
+ unsigned int retries,
+ TAO_CEC_TypedEventChannel *ec,
+ CORBA::ORB_ptr orb)
+ : rate_ (rate),
+ timeout_ (timeout),
+ retries_ (retries),
+ adapter_ (this),
+ event_channel_ (0),
+ typed_event_channel_ (ec),
+ orb_ (CORBA::ORB::_duplicate (orb))
+#if defined (TAO_HAS_CORBA_MESSAGING) && TAO_HAS_CORBA_MESSAGING != 0
+ // Initialise timer_id_ to an invalid timer id, so that in case we don't
+ // schedule a timer, we don't cancel a random timer at shutdown
+ , timer_id_ (-1)
+#endif /* TAO_HAS_CORBA_MESSAGING */
+{
+ this->reactor_ =
+ this->orb_->orb_core ()->reactor ();
+}
+#endif /* TAO_HAS_TYPED_EVENT_CHANNEL */
+
+TAO_CEC_Reactive_ConsumerControl::~TAO_CEC_Reactive_ConsumerControl (void)
+{
+}
+
+void
+TAO_CEC_Reactive_ConsumerControl::query_consumers (
+ ACE_ENV_SINGLE_ARG_DECL)
+{
+ TAO_CEC_Ping_Push_Consumer push_worker (this);
+
+#if defined (TAO_HAS_TYPED_EVENT_CHANNEL)
+ if (this->typed_event_channel_)
+ {
+ // Typed EC
+ this->typed_event_channel_->typed_consumer_admin ()->for_each (&push_worker
+ ACE_ENV_ARG_PARAMETER);
+ ACE_CHECK;
+ }
+ else
+ {
+#endif /* TAO_HAS_TYPED_EVENT_CHANNEL */
+
+ // Un-typed EC
+ this->event_channel_->consumer_admin ()->for_each (&push_worker
+ ACE_ENV_ARG_PARAMETER);
+ ACE_CHECK;
+
+ TAO_CEC_Ping_Pull_Consumer pull_worker (this);
+ this->event_channel_->consumer_admin ()->for_each (&pull_worker
+ ACE_ENV_ARG_PARAMETER);
+ ACE_CHECK;
+
+#if defined (TAO_HAS_TYPED_EVENT_CHANNEL)
+ }
+#endif /* TAO_HAS_TYPED_EVENT_CHANNEL */
+}
+
+bool
+TAO_CEC_Reactive_ConsumerControl::need_to_disconnect (
+ PortableServer::ServantBase* proxy)
+{
+ bool disconnect = true;
+
+#if defined (TAO_HAS_TYPED_EVENT_CHANNEL)
+ if (this->typed_event_channel_)
+ {
+ // Typed EC
+ TAO_CEC_TypedEventChannel::ServantRetryMap::ENTRY* entry = 0;
+ if (this->typed_event_channel_->
+ get_servant_retry_map ().find (proxy, entry) == 0)
+ {
+ ++entry->int_id_;
+ if (entry->int_id_ <= this->retries_)
+ {
+ disconnect = false;
+ }
+ }
+ }
+ else
+ {
+#endif /* TAO_HAS_TYPED_EVENT_CHANNEL */
+
+ // Un-typed EC
+ TAO_CEC_EventChannel::ServantRetryMap::ENTRY* entry = 0;
+ if (this->event_channel_->
+ get_servant_retry_map ().find (proxy, entry) == 0)
+ {
+ ++entry->int_id_;
+ if (entry->int_id_ <= this->retries_)
+ {
+ disconnect = false;
+ }
+ }
+
+#if defined (TAO_HAS_TYPED_EVENT_CHANNEL)
+ }
+#endif /* TAO_HAS_TYPED_EVENT_CHANNEL */
+
+ return disconnect;
+}
+
+void
+TAO_CEC_Reactive_ConsumerControl::successful_transmission (
+ PortableServer::ServantBase* proxy)
+{
+
+#if defined (TAO_HAS_TYPED_EVENT_CHANNEL)
+ if (this->typed_event_channel_)
+ {
+ // Typed EC
+ TAO_CEC_TypedEventChannel::ServantRetryMap::ENTRY* entry = 0;
+ if (this->typed_event_channel_->
+ get_servant_retry_map ().find (proxy, entry) == 0)
+ {
+ entry->int_id_ = 0;
+ }
+ }
+ else
+ {
+#endif /* TAO_HAS_TYPED_EVENT_CHANNEL */
+
+ // Un-typed EC
+ TAO_CEC_EventChannel::ServantRetryMap::ENTRY* entry = 0;
+ if (this->event_channel_->
+ get_servant_retry_map ().find (proxy, entry) == 0)
+ {
+ entry->int_id_ = 0;
+ }
+
+#if defined (TAO_HAS_TYPED_EVENT_CHANNEL)
+ }
+#endif /* TAO_HAS_TYPED_EVENT_CHANNEL */
+
+}
+
+void
+TAO_CEC_Reactive_ConsumerControl::handle_timeout (
+ const ACE_Time_Value &,
+ const void *)
+{
+ ACE_TRY_NEW_ENV
+ {
+ // Query the state of the Current object *before* we initiate
+ // the iteration...
+ CORBA::PolicyTypeSeq types;
+ CORBA::PolicyList_var policies =
+ this->policy_current_->get_policy_overrides (types
+ ACE_ENV_ARG_PARAMETER);
+ ACE_TRY_CHECK;
+
+ // Change the timeout
+ this->policy_current_->set_policy_overrides (this->policy_list_,
+ CORBA::ADD_OVERRIDE
+ ACE_ENV_ARG_PARAMETER);
+ ACE_TRY_CHECK;
+
+ ACE_TRY_EX (query)
+ {
+ // Query the state of the consumers...
+ this->query_consumers (ACE_ENV_SINGLE_ARG_PARAMETER);
+ ACE_TRY_CHECK_EX (query);
+ }
+ ACE_CATCHANY
+ {
+ // Ignore all exceptions
+ }
+ ACE_ENDTRY;
+
+ this->policy_current_->set_policy_overrides (policies.in (),
+ CORBA::SET_OVERRIDE
+ ACE_ENV_ARG_PARAMETER);
+ ACE_TRY_CHECK;
+ for (CORBA::ULong i = 0; i != policies->length (); ++i)
+ {
+ policies[i]->destroy (ACE_ENV_SINGLE_ARG_PARAMETER);
+ ACE_TRY_CHECK;
+ }
+ }
+ ACE_CATCHANY
+ {
+ // Ignore all exceptions
+ }
+ ACE_ENDTRY;
+}
+
+int
+TAO_CEC_Reactive_ConsumerControl::activate (void)
+{
+#if defined (TAO_HAS_CORBA_MESSAGING) && TAO_HAS_CORBA_MESSAGING != 0
+ ACE_TRY_NEW_ENV
+ {
+ // Get the PolicyCurrent object
+ CORBA::Object_var tmp =
+ this->orb_->resolve_initial_references ("PolicyCurrent"
+ ACE_ENV_ARG_PARAMETER);
+ ACE_TRY_CHECK;
+
+ this->policy_current_ =
+ CORBA::PolicyCurrent::_narrow (tmp.in ()
+ ACE_ENV_ARG_PARAMETER);
+ ACE_TRY_CHECK;
+
+ // Pre-compute the policy list to the set the right timeout
+ // value...
+ // We need to convert the relative timeout into 100's of nano seconds.
+ TimeBase::TimeT timeout;
+ ORBSVCS_Time::Time_Value_to_TimeT (timeout,
+ this->timeout_);
+ CORBA::Any any;
+ any <<= timeout;
+
+ this->policy_list_.length (1);
+ this->policy_list_[0] =
+ this->orb_->create_policy (
+ Messaging::RELATIVE_RT_TIMEOUT_POLICY_TYPE,
+ any
+ ACE_ENV_ARG_PARAMETER);
+ ACE_TRY_CHECK;
+
+ // Only schedule the timer, when the rate is not zero
+ if (this->rate_ != ACE_Time_Value::zero)
+ {
+ // Schedule the timer after these policies has been set, because the
+ // handle_timeout uses these policies, if done in front, the channel
+ // can crash when the timeout expires before initiazation is ready.
+ timer_id_ = this->reactor_->schedule_timer (&this->adapter_,
+ 0,
+ this->rate_,
+ this->rate_);
+ if (timer_id_ == -1)
+ return -1;
+ }
+ }
+ ACE_CATCHANY
+ {
+ return -1;
+ }
+ ACE_ENDTRY;
+#endif /* TAO_HAS_CORBA_MESSAGING */
+
+ return 0;
+}
+
+int
+TAO_CEC_Reactive_ConsumerControl::shutdown (void)
+{
+ int r = 0;
+
+#if defined (TAO_HAS_CORBA_MESSAGING) && TAO_HAS_CORBA_MESSAGING != 0
+ r = this->reactor_->cancel_timer (timer_id_);
+#endif /* TAO_HAS_CORBA_MESSAGING */
+ this->adapter_.reactor (0);
+ return r;
+}
+
+void
+TAO_CEC_Reactive_ConsumerControl::consumer_not_exist (
+ TAO_CEC_ProxyPushSupplier *proxy
+ ACE_ENV_ARG_DECL)
+{
+ ACE_TRY
+ {
+ proxy->disconnect_push_supplier (ACE_ENV_SINGLE_ARG_PARAMETER);
+ ACE_TRY_CHECK;
+
+ if (TAO_debug_level >= 10)
+ {
+ ACE_DEBUG ((LM_DEBUG,
+ ACE_TEXT ("ProxyPushSupplier disconnected due to consumer_not_exist\n")));
+ }
+ }
+ ACE_CATCHANY
+ {
+ ACE_PRINT_EXCEPTION (ACE_ANY_EXCEPTION,
+ ACE_TEXT ("Reactive_ConsumerControl::consumer_not_exist"));
+ // Ignore all exceptions..
+ }
+ ACE_ENDTRY;
+}
+
+void
+TAO_CEC_Reactive_ConsumerControl::consumer_not_exist (
+ TAO_CEC_ProxyPullSupplier *proxy
+ ACE_ENV_ARG_DECL)
+{
+ ACE_TRY
+ {
+ proxy->disconnect_pull_supplier (ACE_ENV_SINGLE_ARG_PARAMETER);
+ ACE_TRY_CHECK;
+ }
+ ACE_CATCHANY
+ {
+ ACE_PRINT_EXCEPTION (ACE_ANY_EXCEPTION,
+ ACE_TEXT ("Reactive_ConsumerControl::consumer_not_exist"));
+ // Ignore all exceptions..
+ }
+ ACE_ENDTRY;
+}
+
+void
+TAO_CEC_Reactive_ConsumerControl::system_exception (
+ TAO_CEC_ProxyPushSupplier *proxy,
+ CORBA::SystemException & /* exception */
+ ACE_ENV_ARG_DECL)
+{
+ ACE_TRY
+ {
+ if (this->need_to_disconnect (proxy))
+ {
+ proxy->disconnect_push_supplier (ACE_ENV_SINGLE_ARG_PARAMETER);
+ ACE_TRY_CHECK;
+
+ if (TAO_debug_level >= 10)
+ {
+ ACE_DEBUG ((LM_DEBUG,
+ ACE_TEXT ("ProxyPushSupplier disconnected due to consumer_not_exist\n")));
+ }
+ }
+ }
+ ACE_CATCHANY
+ {
+ // Ignore all exceptions..
+ }
+ ACE_ENDTRY;
+}
+
+// ****************************************************************
+
+TAO_CEC_ConsumerControl_Adapter::TAO_CEC_ConsumerControl_Adapter (
+ TAO_CEC_Reactive_ConsumerControl *adaptee)
+ : adaptee_ (adaptee)
+{
+}
+
+int
+TAO_CEC_ConsumerControl_Adapter::handle_timeout (
+ const ACE_Time_Value &tv,
+ const void *arg)
+{
+ this->adaptee_->handle_timeout (tv, arg);
+ return 0;
+}
+
+// ****************************************************************
+
+void
+TAO_CEC_Ping_Push_Consumer::work (TAO_CEC_ProxyPushSupplier *supplier
+ ACE_ENV_ARG_DECL)
+{
+ ACE_TRY
+ {
+ CORBA::Boolean disconnected;
+ CORBA::Boolean non_existent =
+ supplier->consumer_non_existent (disconnected
+ ACE_ENV_ARG_PARAMETER);
+ ACE_TRY_CHECK;
+ if (non_existent && !disconnected)
+ {
+ this->control_->consumer_not_exist (supplier ACE_ENV_ARG_PARAMETER);
+ ACE_TRY_CHECK;
+ }
+ }
+ ACE_CATCH (CORBA::OBJECT_NOT_EXIST, ex)
+ {
+ this->control_->consumer_not_exist (supplier ACE_ENV_ARG_PARAMETER);
+ ACE_TRY_CHECK;
+ }
+ ACE_CATCH (CORBA::TRANSIENT, transient)
+ {
+ if (this->control_->need_to_disconnect (supplier))
+ {
+ this->control_->consumer_not_exist (supplier ACE_ENV_ARG_PARAMETER);
+ ACE_TRY_CHECK;
+ }
+ }
+ ACE_CATCHANY
+ {
+ // Ignore all exceptions
+ }
+ ACE_ENDTRY;
+}
+
+// ****************************************************************
+
+void
+TAO_CEC_Ping_Pull_Consumer::work (TAO_CEC_ProxyPullSupplier *supplier
+ ACE_ENV_ARG_DECL)
+{
+ ACE_TRY
+ {
+ CORBA::Boolean disconnected;
+ CORBA::Boolean non_existent =
+ supplier->consumer_non_existent (disconnected
+ ACE_ENV_ARG_PARAMETER);
+ ACE_TRY_CHECK;
+ if (non_existent && !disconnected)
+ {
+ this->control_->consumer_not_exist (supplier ACE_ENV_ARG_PARAMETER);
+ ACE_TRY_CHECK;
+ }
+ }
+ ACE_CATCH (CORBA::OBJECT_NOT_EXIST, ex)
+ {
+ this->control_->consumer_not_exist (supplier ACE_ENV_ARG_PARAMETER);
+ ACE_TRY_CHECK;
+ }
+ ACE_CATCH (CORBA::TRANSIENT, transient)
+ {
+ if (this->control_->need_to_disconnect (supplier))
+ {
+ this->control_->consumer_not_exist (supplier ACE_ENV_ARG_PARAMETER);
+ ACE_TRY_CHECK;
+ }
+ }
+ ACE_CATCHANY
+ {
+ // Ignore all exceptions
+ }
+ ACE_ENDTRY;
+}
+
+TAO_END_VERSIONED_NAMESPACE_DECL
diff --git a/TAO/orbsvcs/orbsvcs/CosEvent/CEC_Reactive_ConsumerControl.h b/TAO/orbsvcs/orbsvcs/CosEvent/CEC_Reactive_ConsumerControl.h
new file mode 100644
index 00000000000..f1cc2e40767
--- /dev/null
+++ b/TAO/orbsvcs/orbsvcs/CosEvent/CEC_Reactive_ConsumerControl.h
@@ -0,0 +1,213 @@
+// -*- C++ -*-
+
+//=============================================================================
+/**
+ * @file CEC_Reactive_ConsumerControl.h
+ *
+ * $Id$
+ *
+ * @author Carlos O'Ryan (coryan@cs.wustl.edu)
+ *
+ * More details can be found in:
+ *
+ * http://doc.ece.uci.edu/~coryan/EC/
+ */
+//=============================================================================
+
+
+#ifndef TAO_CEC_REACTIVE_CONSUMERCONTROL_H
+#define TAO_CEC_REACTIVE_CONSUMERCONTROL_H
+
+#include /**/ "ace/pre.h"
+
+#include "orbsvcs/CosEvent/CEC_ConsumerControl.h"
+
+#if !defined (ACE_LACKS_PRAGMA_ONCE)
+# pragma once
+#endif /* ACE_LACKS_PRAGMA_ONCE */
+
+#include "orbsvcs/ESF/ESF_Worker.h"
+
+#include "tao/ORB.h"
+
+#include "ace/Event_Handler.h"
+
+
+TAO_BEGIN_VERSIONED_NAMESPACE_DECL
+
+class TAO_CEC_EventChannel;
+
+class TAO_CEC_Reactive_ConsumerControl;
+
+#if defined (TAO_HAS_TYPED_EVENT_CHANNEL)
+class TAO_CEC_TypedEventChannel;
+#endif /* TAO_HAS_TYPED_EVENT_CHANNEL */
+
+/**
+ * @class TAO_CEC_ConsumerControl_Adapter
+ *
+ * @brief Forwards timeout events to the Reactive ConsumerControl
+ *
+ * The Reactive ConsumerControl strategy uses the reactor to
+ * periodically wakeup and verify the state of the consumers
+ * registered with the Event Channel.
+ */
+class TAO_Event_Serv_Export TAO_CEC_ConsumerControl_Adapter : public ACE_Event_Handler
+{
+public:
+ /// Constructor
+ TAO_CEC_ConsumerControl_Adapter (TAO_CEC_Reactive_ConsumerControl *adaptee);
+
+ // = Documented in ACE_Event_Handler.
+ virtual int handle_timeout (const ACE_Time_Value &tv,
+ const void *arg = 0);
+
+private:
+ /// The adapted object
+ TAO_CEC_Reactive_ConsumerControl *adaptee_;
+};
+
+/**
+ * @class TAO_CEC_Reactive_ConsumerControl
+ *
+ * @brief ConsumerControl
+ *
+ * Defines the interface for the consumer control strategy.
+ * This strategy handles misbehaving or failing consumers.
+ * = MEMORY MANAGMENT
+ * = LOCKING
+ * = TODO
+ */
+class TAO_Event_Serv_Export TAO_CEC_Reactive_ConsumerControl
+ : public TAO_CEC_ConsumerControl
+{
+public:
+ /// Constructor. It does not assume ownership of the <event_channel>
+ /// parameter.
+ TAO_CEC_Reactive_ConsumerControl (const ACE_Time_Value &rate,
+ const ACE_Time_Value &timeout,
+ unsigned int retries,
+ TAO_CEC_EventChannel *event_channel,
+ CORBA::ORB_ptr orb);
+
+ /// Constructor for the typed ec.
+#if defined (TAO_HAS_TYPED_EVENT_CHANNEL)
+ TAO_CEC_Reactive_ConsumerControl (
+ const ACE_Time_Value &rate,
+ const ACE_Time_Value &timeout,
+ unsigned int retries,
+ TAO_CEC_TypedEventChannel *typed_event_channel,
+ CORBA::ORB_ptr orb
+ );
+#endif /* TAO_HAS_TYPED_EVENT_CHANNEL */
+
+ /// destructor...
+ virtual ~TAO_CEC_Reactive_ConsumerControl (void);
+
+ /// Receive the timeout from the adapter
+ void handle_timeout (const ACE_Time_Value &tv,
+ const void* arg);
+
+ // = Documented in TAO_CEC_ConsumerControl
+ virtual int activate (void);
+ virtual int shutdown (void);
+ virtual void consumer_not_exist (TAO_CEC_ProxyPushSupplier *proxy
+ ACE_ENV_ARG_DECL_NOT_USED);
+ virtual void consumer_not_exist (TAO_CEC_ProxyPullSupplier *proxy
+ ACE_ENV_ARG_DECL_NOT_USED);
+ virtual void system_exception (TAO_CEC_ProxyPushSupplier *proxy,
+ CORBA::SystemException &
+ ACE_ENV_ARG_DECL_NOT_USED);
+
+ /// Do we need to disconnect this supplier? The parameter type for
+ /// proxy is PortableServer::ServantBase* due to the fact that this
+ /// method will be used for TAO_CEC_ProxyPushSupplier's and
+ /// TAO_CEC_ProxyPullSupplier's.
+ virtual bool need_to_disconnect (PortableServer::ServantBase* proxy);
+
+ /// Allow others to inform us when a send or receive was successful.
+ virtual void successful_transmission (PortableServer::ServantBase* proxy);
+
+private:
+ /// Check if the consumers still exists. It is a helper method for
+ /// handle_timeout() to isolate the exceptions.
+ void query_consumers (ACE_ENV_SINGLE_ARG_DECL);
+
+private:
+ /// The polling rate
+ ACE_Time_Value rate_;
+
+ /// The polling timeout
+ ACE_Time_Value timeout_;
+
+ /// The number of retries per proxy until it is disconnected
+ unsigned int retries_;
+
+ /// The Adapter for the reactor events
+ TAO_CEC_ConsumerControl_Adapter adapter_;
+
+ /// The event channel
+ TAO_CEC_EventChannel *event_channel_;
+
+ /// The typed event channel
+#if defined (TAO_HAS_TYPED_EVENT_CHANNEL)
+ TAO_CEC_TypedEventChannel *typed_event_channel_;
+#endif /* TAO_HAS_TYPED_EVENT_CHANNEL */
+
+ /// The ORB
+ CORBA::ORB_var orb_;
+
+ /// To control the timeout policy in the thread
+ CORBA::PolicyCurrent_var policy_current_;
+
+ /// Precomputed policy list to the set timeout.
+ CORBA::PolicyList policy_list_;
+
+ /// The ORB reactor
+ ACE_Reactor *reactor_;
+
+#if defined (TAO_HAS_CORBA_MESSAGING) && TAO_HAS_CORBA_MESSAGING != 0
+ /// The timer id
+ long timer_id_;
+#endif /* TAO_HAS_CORBA_MESSAGING */
+};
+
+// ****************************************************************
+
+class TAO_CEC_Ping_Push_Consumer
+ : public TAO_ESF_Worker<TAO_CEC_ProxyPushSupplier>
+{
+public:
+ TAO_CEC_Ping_Push_Consumer (TAO_CEC_ConsumerControl *control);
+
+ virtual void work (TAO_CEC_ProxyPushSupplier *supplier
+ ACE_ENV_ARG_DECL);
+
+private:
+ TAO_CEC_ConsumerControl *control_;
+};
+
+// ****************************************************************
+
+class TAO_CEC_Ping_Pull_Consumer
+ : public TAO_ESF_Worker<TAO_CEC_ProxyPullSupplier>
+{
+public:
+ TAO_CEC_Ping_Pull_Consumer (TAO_CEC_ConsumerControl *control);
+
+ virtual void work (TAO_CEC_ProxyPullSupplier *supplier
+ ACE_ENV_ARG_DECL);
+
+private:
+ TAO_CEC_ConsumerControl *control_;
+};
+
+TAO_END_VERSIONED_NAMESPACE_DECL
+
+#if defined (__ACE_INLINE__)
+#include "orbsvcs/CosEvent/CEC_Reactive_ConsumerControl.i"
+#endif /* __ACE_INLINE__ */
+
+#include /**/ "ace/post.h"
+
+#endif /* TAO_CEC_CONSUMERCONTROL_H */
diff --git a/TAO/orbsvcs/orbsvcs/CosEvent/CEC_Reactive_ConsumerControl.i b/TAO/orbsvcs/orbsvcs/CosEvent/CEC_Reactive_ConsumerControl.i
new file mode 100644
index 00000000000..cd61d83efce
--- /dev/null
+++ b/TAO/orbsvcs/orbsvcs/CosEvent/CEC_Reactive_ConsumerControl.i
@@ -0,0 +1,23 @@
+// -*- C++ -*-
+//
+// $Id$
+
+TAO_BEGIN_VERSIONED_NAMESPACE_DECL
+
+ACE_INLINE
+TAO_CEC_Ping_Push_Consumer::
+ TAO_CEC_Ping_Push_Consumer (TAO_CEC_ConsumerControl *control)
+ : control_ (control)
+{
+}
+
+// ****************************************************************
+
+ACE_INLINE
+TAO_CEC_Ping_Pull_Consumer::
+ TAO_CEC_Ping_Pull_Consumer (TAO_CEC_ConsumerControl *control)
+ : control_ (control)
+{
+}
+
+TAO_END_VERSIONED_NAMESPACE_DECL
diff --git a/TAO/orbsvcs/orbsvcs/CosEvent/CEC_Reactive_Pulling_Strategy.cpp b/TAO/orbsvcs/orbsvcs/CosEvent/CEC_Reactive_Pulling_Strategy.cpp
new file mode 100644
index 00000000000..55063132e47
--- /dev/null
+++ b/TAO/orbsvcs/orbsvcs/CosEvent/CEC_Reactive_Pulling_Strategy.cpp
@@ -0,0 +1,204 @@
+// $Id$
+
+#include "orbsvcs/CosEvent/CEC_ProxyPullConsumer.h"
+#include "orbsvcs/CosEvent/CEC_EventChannel.h"
+#include "orbsvcs/CosEvent/CEC_SupplierAdmin.h"
+#include "orbsvcs/CosEvent/CEC_ConsumerAdmin.h"
+#include "orbsvcs/CosEvent/CEC_Reactive_Pulling_Strategy.h"
+
+#include "orbsvcs/Time_Utilities.h"
+
+#if defined (TAO_HAS_CORBA_MESSAGING) && TAO_HAS_CORBA_MESSAGING != 0
+#include "tao/Messaging/Messaging.h"
+#endif
+
+#include "tao/ORB_Core.h"
+
+#include "ace/Reactor.h"
+
+#if ! defined (__ACE_INLINE__)
+#include "orbsvcs/CosEvent/CEC_Reactive_Pulling_Strategy.i"
+#endif /* __ACE_INLINE__ */
+
+ACE_RCSID(CosEvent, CEC_Reactive_Pulling_Strategy, "$Id$")
+
+
+TAO_BEGIN_VERSIONED_NAMESPACE_DECL
+
+TAO_CEC_Reactive_Pulling_Strategy::
+ TAO_CEC_Reactive_Pulling_Strategy (const ACE_Time_Value &rate,
+ const ACE_Time_Value &relative_timeout,
+ TAO_CEC_EventChannel *event_channel,
+ CORBA::ORB_ptr orb)
+ : adapter_ (this),
+ rate_ (rate),
+ relative_timeout_ (relative_timeout),
+ event_channel_ (event_channel),
+ orb_ (CORBA::ORB::_duplicate (orb))
+#if defined (TAO_HAS_CORBA_MESSAGING) && TAO_HAS_CORBA_MESSAGING != 0
+ // Initialise timer_id_ to an invalid timer id, so that in case we don't
+ // schedule a timer, we don't cancel a random timer at shutdown
+ , timer_id_ (-1)
+#endif /* TAO_HAS_CORBA_MESSAGING */
+{
+ this->reactor_ =
+ this->orb_->orb_core ()->reactor ();
+}
+
+void
+TAO_CEC_Reactive_Pulling_Strategy::handle_timeout (
+ const ACE_Time_Value &,
+ const void *)
+{
+ ACE_TRY_NEW_ENV
+ {
+ // Query the state of the Current object *before* we initiate
+ // the iteration...
+ CORBA::PolicyTypeSeq types;
+ CORBA::PolicyList_var policies =
+ this->policy_current_->get_policy_overrides (types
+ ACE_ENV_ARG_PARAMETER);
+ ACE_TRY_CHECK;
+
+ // Change the timeout
+ this->policy_current_->set_policy_overrides (this->policy_list_,
+ CORBA::ADD_OVERRIDE
+ ACE_ENV_ARG_PARAMETER);
+ ACE_TRY_CHECK;
+
+ ACE_TRY_EX (query)
+ {
+ TAO_CEC_Pull_Event worker (this->event_channel_->consumer_admin (),
+ this->event_channel_->supplier_control ());
+
+ this->event_channel_->supplier_admin ()->for_each (&worker
+ ACE_ENV_ARG_PARAMETER);
+ ACE_TRY_CHECK_EX (query);
+ }
+ ACE_CATCHANY
+ {
+ // Ignore all exceptions
+ }
+ ACE_ENDTRY;
+
+ this->policy_current_->set_policy_overrides (policies.in (),
+ CORBA::SET_OVERRIDE
+ ACE_ENV_ARG_PARAMETER);
+ ACE_TRY_CHECK;
+ for (CORBA::ULong i = 0; i != policies->length (); ++i)
+ {
+ policies[i]->destroy (ACE_ENV_SINGLE_ARG_PARAMETER);
+ ACE_TRY_CHECK;
+ }
+ }
+ ACE_CATCHANY
+ {
+ // Ignore all exceptions
+ }
+ ACE_ENDTRY;
+}
+
+void
+TAO_CEC_Reactive_Pulling_Strategy::activate (void)
+{
+#if defined (TAO_HAS_CORBA_MESSAGING) && TAO_HAS_CORBA_MESSAGING != 0
+ timer_id_ = this->reactor_->schedule_timer (&this->adapter_,
+ 0,
+ this->rate_,
+ this->rate_);
+ if (timer_id_ == -1)
+ return;
+
+ ACE_TRY_NEW_ENV
+ {
+ // Get the PolicyCurrent object
+ CORBA::Object_var tmp =
+ this->orb_->resolve_initial_references ("PolicyCurrent"
+ ACE_ENV_ARG_PARAMETER);
+ ACE_TRY_CHECK;
+
+ this->policy_current_ =
+ CORBA::PolicyCurrent::_narrow (tmp.in ()
+ ACE_ENV_ARG_PARAMETER);
+ ACE_TRY_CHECK;
+
+ // Pre-compute the policy list to the set the right timeout
+ // value...
+ // We need to convert the relative timeout into 100's of nano seconds.
+ TimeBase::TimeT timeout;
+ ORBSVCS_Time::Time_Value_to_TimeT (timeout,
+ this->relative_timeout_);
+ CORBA::Any any;
+ any <<= timeout;
+
+ this->policy_list_.length (1);
+ this->policy_list_[0] =
+ this->orb_->create_policy (
+ Messaging::RELATIVE_RT_TIMEOUT_POLICY_TYPE,
+ any
+ ACE_ENV_ARG_PARAMETER);
+ ACE_TRY_CHECK;
+ }
+ ACE_CATCHANY
+ {
+ }
+ ACE_ENDTRY;
+#endif /* TAO_HAS_CORBA_MESSAGING */
+}
+
+void
+TAO_CEC_Reactive_Pulling_Strategy::shutdown (void)
+{
+#if defined (TAO_HAS_CORBA_MESSAGING) && TAO_HAS_CORBA_MESSAGING != 0
+ this->reactor_->cancel_timer (timer_id_);
+#endif /* TAO_HAS_CORBA_MESSAGING */
+ this->adapter_.reactor (0);
+}
+
+// ****************************************************************
+
+TAO_CEC_Pulling_Strategy_Adapter::TAO_CEC_Pulling_Strategy_Adapter (
+ TAO_CEC_Reactive_Pulling_Strategy *adaptee)
+ : adaptee_ (adaptee)
+{
+}
+
+int
+TAO_CEC_Pulling_Strategy_Adapter::handle_timeout (
+ const ACE_Time_Value &tv,
+ const void *arg)
+{
+ this->adaptee_->handle_timeout (tv, arg);
+ return 0;
+}
+
+// ****************************************************************
+
+void
+TAO_CEC_Pull_Event::work (TAO_CEC_ProxyPullConsumer *consumer
+ ACE_ENV_ARG_DECL)
+{
+ CORBA::Boolean has_event = 0;
+ CORBA::Any_var any;
+
+ ACE_TRY
+ {
+ any = consumer->try_pull_from_supplier (has_event
+ ACE_ENV_ARG_PARAMETER);
+ ACE_TRY_CHECK;
+ }
+ ACE_CATCHANY
+ {
+ // Ignore all exceptions
+ return;
+ }
+ ACE_ENDTRY;
+
+ if (has_event)
+ {
+ this->consumer_admin_->push (any.in () ACE_ENV_ARG_PARAMETER);
+ ACE_CHECK;
+ }
+}
+
+TAO_END_VERSIONED_NAMESPACE_DECL
diff --git a/TAO/orbsvcs/orbsvcs/CosEvent/CEC_Reactive_Pulling_Strategy.h b/TAO/orbsvcs/orbsvcs/CosEvent/CEC_Reactive_Pulling_Strategy.h
new file mode 100644
index 00000000000..a43c423f3a3
--- /dev/null
+++ b/TAO/orbsvcs/orbsvcs/CosEvent/CEC_Reactive_Pulling_Strategy.h
@@ -0,0 +1,151 @@
+// -*- C++ -*-
+
+//=============================================================================
+/**
+ * @file CEC_Reactive_Pulling_Strategy.h
+ *
+ * $Id$
+ *
+ * @author Carlos O'Ryan (coryan@cs.wustl.edu)
+ */
+//=============================================================================
+
+
+#ifndef TAO_CEC_REACTIVE_PULLING_STRATEGY_H
+#define TAO_CEC_REACTIVE_PULLING_STRATEGY_H
+
+#include /**/ "ace/pre.h"
+
+#include "orbsvcs/CosEvent/CEC_Pulling_Strategy.h"
+
+#if !defined (ACE_LACKS_PRAGMA_ONCE)
+# pragma once
+#endif /* ACE_LACKS_PRAGMA_ONCE */
+
+#include "orbsvcs/ESF/ESF_Worker.h"
+
+#include "tao/ORB.h"
+#include "tao/PolicyC.h"
+
+#include "ace/Event_Handler.h"
+
+
+TAO_BEGIN_VERSIONED_NAMESPACE_DECL
+
+class TAO_CEC_ProxyPullConsumer;
+class TAO_CEC_EventChannel;
+class TAO_CEC_ConsumerAdmin;
+class TAO_CEC_SupplierControl;
+class TAO_CEC_Reactive_Pulling_Strategy;
+
+/**
+ * @class TAO_CEC_Pulling_Strategy_Adapter
+ *
+ * @brief Forwards timeout events to the Reactive Pulling Strategy
+ *
+ * The Reactive Pulling Strategy strategy uses the reactor to
+ * periodically wakeup and try top pull events from each
+ * PullSupplier connected to the EventChannel.
+ */
+class TAO_Event_Serv_Export TAO_CEC_Pulling_Strategy_Adapter : public ACE_Event_Handler
+{
+public:
+ /// Constructor
+ TAO_CEC_Pulling_Strategy_Adapter (TAO_CEC_Reactive_Pulling_Strategy *adaptee);
+
+ // = Documented in ACE_Event_Handler.
+ virtual int handle_timeout (const ACE_Time_Value &tv,
+ const void *arg = 0);
+
+private:
+ /// The adapted object
+ TAO_CEC_Reactive_Pulling_Strategy *adaptee_;
+};
+
+// ****************************************************************
+
+/**
+ * @class TAO_CEC_Reactive_Pulling_Strategy
+ *
+ * @brief Dispatch using the caller thread.
+ *
+ * The events are dispatched in FIFO ordering, using the invoking
+ * thread to push the event to the consumer.
+ */
+class TAO_Event_Serv_Export TAO_CEC_Reactive_Pulling_Strategy : public TAO_CEC_Pulling_Strategy
+{
+public:
+ /// The scheduler is used to find the range of priorities and similar
+ /// info.
+ TAO_CEC_Reactive_Pulling_Strategy (const ACE_Time_Value &rate,
+ const ACE_Time_Value &relative_timeout,
+ TAO_CEC_EventChannel *event_channel,
+ CORBA::ORB_ptr orb);
+
+ /// Receive the timeout from the adapter
+ void handle_timeout (const ACE_Time_Value &tv,
+ const void* arg);
+
+ // = The CEC_Pulling_Strategy methods.
+ virtual void activate (void);
+ virtual void shutdown (void);
+
+private:
+ /// The Adapter for the reactor events
+ TAO_CEC_Pulling_Strategy_Adapter adapter_;
+
+ /// The polling rate
+ ACE_Time_Value rate_;
+
+ /// The relative timeout
+ ACE_Time_Value relative_timeout_;
+
+ /// The event channel
+ TAO_CEC_EventChannel *event_channel_;
+
+ /// The ORB
+ CORBA::ORB_var orb_;
+
+ /// To control the timeout policy in the thread
+ CORBA::PolicyCurrent_var policy_current_;
+
+ /// Precomputed policy list to the set timeout.
+ CORBA::PolicyList policy_list_;
+
+ /// The ORB reactor
+ ACE_Reactor *reactor_;
+
+#if defined (TAO_HAS_CORBA_MESSAGING) && TAO_HAS_CORBA_MESSAGING != 0
+ /// The timer id
+ long timer_id_;
+#endif /* TAO_HAS_CORBA_MESSAGING */
+};
+
+// ****************************************************************
+
+class TAO_CEC_Pull_Event : public TAO_ESF_Worker<TAO_CEC_ProxyPullConsumer>
+{
+public:
+ TAO_CEC_Pull_Event (TAO_CEC_ConsumerAdmin *consumer_admin,
+ TAO_CEC_SupplierControl *control);
+
+ virtual void work (TAO_CEC_ProxyPullConsumer *consumer
+ ACE_ENV_ARG_DECL);
+
+private:
+ /// Used to propagate the events.
+ TAO_CEC_ConsumerAdmin *consumer_admin_;
+
+ /// To report failed or dead suppliers
+ TAO_CEC_SupplierControl *supplier_control_;
+};
+
+TAO_END_VERSIONED_NAMESPACE_DECL
+
+#if defined (__ACE_INLINE__)
+#include "orbsvcs/CosEvent/CEC_Reactive_Pulling_Strategy.i"
+#endif /* __ACE_INLINE__ */
+
+#include /**/ "ace/post.h"
+
+#endif /* TAO_CEC_REACTIVE_PULLING_STRATEGY_H */
diff --git a/TAO/orbsvcs/orbsvcs/CosEvent/CEC_Reactive_Pulling_Strategy.i b/TAO/orbsvcs/orbsvcs/CosEvent/CEC_Reactive_Pulling_Strategy.i
new file mode 100644
index 00000000000..319de5688f5
--- /dev/null
+++ b/TAO/orbsvcs/orbsvcs/CosEvent/CEC_Reactive_Pulling_Strategy.i
@@ -0,0 +1,15 @@
+// -*- C++ -*-
+//
+// $Id$
+
+TAO_BEGIN_VERSIONED_NAMESPACE_DECL
+
+ACE_INLINE
+TAO_CEC_Pull_Event::TAO_CEC_Pull_Event (TAO_CEC_ConsumerAdmin *consumer_admin,
+ TAO_CEC_SupplierControl *control)
+ : consumer_admin_ (consumer_admin),
+ supplier_control_ (control)
+{
+}
+
+TAO_END_VERSIONED_NAMESPACE_DECL
diff --git a/TAO/orbsvcs/orbsvcs/CosEvent/CEC_Reactive_SupplierControl.cpp b/TAO/orbsvcs/orbsvcs/CosEvent/CEC_Reactive_SupplierControl.cpp
new file mode 100644
index 00000000000..b7a49603b36
--- /dev/null
+++ b/TAO/orbsvcs/orbsvcs/CosEvent/CEC_Reactive_SupplierControl.cpp
@@ -0,0 +1,537 @@
+// $Id$
+
+// Note: This class controls the behaviour of suppliers connected to both
+// the Typed and Un-typed Event Channels. A check must be made in the code
+// to ensure the correct EC is referenced.
+
+#include "orbsvcs/CosEvent/CEC_EventChannel.h"
+#include "orbsvcs/CosEvent/CEC_SupplierAdmin.h"
+#include "orbsvcs/CosEvent/CEC_ProxyPushConsumer.h"
+#include "orbsvcs/CosEvent/CEC_Reactive_SupplierControl.h"
+
+#if defined (TAO_HAS_TYPED_EVENT_CHANNEL)
+#include "orbsvcs/CosEvent/CEC_TypedEventChannel.h"
+#include "orbsvcs/CosEvent/CEC_TypedSupplierAdmin.h"
+#include "orbsvcs/CosEvent/CEC_TypedProxyPushConsumer.h"
+#endif /* TAO_HAS_TYPED_EVENT_CHANNEL */
+
+#include "orbsvcs/CosEvent/CEC_ProxyPullConsumer.h"
+
+#include "orbsvcs/Time_Utilities.h"
+
+#if defined (TAO_HAS_CORBA_MESSAGING) && TAO_HAS_CORBA_MESSAGING != 0
+#include "tao/Messaging/Messaging.h"
+#endif
+
+#include "tao/ORB_Core.h"
+
+#include "ace/Reactor.h"
+
+#if ! defined (__ACE_INLINE__)
+#include "orbsvcs/CosEvent/CEC_Reactive_SupplierControl.i"
+#endif /* __ACE_INLINE__ */
+
+ACE_RCSID (CosEvent,
+ CEC_Reactive_SupplierControl,
+ "$Id$")
+
+TAO_BEGIN_VERSIONED_NAMESPACE_DECL
+
+// TAO_CEC_Reactive_SupplierControl constructor for the Un-typed EC
+TAO_CEC_Reactive_SupplierControl::
+ TAO_CEC_Reactive_SupplierControl (const ACE_Time_Value &rate,
+ const ACE_Time_Value &timeout,
+ unsigned int retries,
+ TAO_CEC_EventChannel *ec,
+ CORBA::ORB_ptr orb)
+ : rate_ (rate),
+ timeout_ (timeout),
+ retries_ (retries),
+ adapter_ (this),
+ event_channel_ (ec),
+#if defined (TAO_HAS_TYPED_EVENT_CHANNEL)
+ typed_event_channel_ (0),
+#endif /* TAO_HAS_TYPED_EVENT_CHANNEL */
+ orb_ (CORBA::ORB::_duplicate (orb))
+#if defined (TAO_HAS_CORBA_MESSAGING) && TAO_HAS_CORBA_MESSAGING != 0
+ // Initialise timer_id_ to an invalid timer id, so that in case we don't
+ // schedule a timer, we don't cancel a random timer at shutdown
+ , timer_id_ (-1)
+#endif /* TAO_HAS_CORBA_MESSAGING */
+{
+ this->reactor_ =
+ this->orb_->orb_core ()->reactor ();
+}
+
+// TAO_CEC_Reactive_SupplierControl constructor for the Typed EC
+#if defined (TAO_HAS_TYPED_EVENT_CHANNEL)
+TAO_CEC_Reactive_SupplierControl::
+ TAO_CEC_Reactive_SupplierControl (const ACE_Time_Value &rate,
+ const ACE_Time_Value &timeout,
+ unsigned int retries,
+ TAO_CEC_TypedEventChannel *ec,
+ CORBA::ORB_ptr orb)
+ : rate_ (rate),
+ timeout_ (timeout),
+ retries_ (retries),
+ adapter_ (this),
+ event_channel_ (0),
+ typed_event_channel_ (ec),
+ orb_ (CORBA::ORB::_duplicate (orb))
+#if defined (TAO_HAS_CORBA_MESSAGING) && TAO_HAS_CORBA_MESSAGING != 0
+ // Initialise timer_id_ to an invalid timer id, so that in case we don't
+ // schedule a timer, we don't cancel a random timer at shutdown
+ , timer_id_ (-1)
+#endif /* TAO_HAS_CORBA_MESSAGING */
+{
+ this->reactor_ =
+ this->orb_->orb_core ()->reactor ();
+}
+#endif /* TAO_HAS_TYPED_EVENT_CHANNEL */
+
+TAO_CEC_Reactive_SupplierControl::~TAO_CEC_Reactive_SupplierControl (void)
+{
+}
+
+void
+TAO_CEC_Reactive_SupplierControl::query_suppliers (
+ ACE_ENV_SINGLE_ARG_DECL)
+{
+#if defined (TAO_HAS_TYPED_EVENT_CHANNEL)
+ if (this->typed_event_channel_)
+ {
+ // Typed EC
+ TAO_CEC_Ping_Typed_Push_Supplier push_worker (this);
+
+ this->typed_event_channel_->typed_supplier_admin ()->for_each (&push_worker
+ ACE_ENV_ARG_PARAMETER);
+ ACE_CHECK;
+ }
+ else
+ {
+#endif /* TAO_HAS_TYPED_EVENT_CHANNEL */
+
+ // Un-typed EC
+ TAO_CEC_Ping_Push_Supplier push_worker (this);
+ this->event_channel_->supplier_admin ()->for_each (&push_worker
+ ACE_ENV_ARG_PARAMETER);
+ ACE_CHECK;
+
+ TAO_CEC_Ping_Pull_Supplier pull_worker (this);
+ this->event_channel_->supplier_admin ()->for_each (&pull_worker
+ ACE_ENV_ARG_PARAMETER);
+ ACE_CHECK;
+
+#if defined (TAO_HAS_TYPED_EVENT_CHANNEL)
+ }
+#endif /* TAO_HAS_TYPED_EVENT_CHANNEL */
+}
+
+bool
+TAO_CEC_Reactive_SupplierControl::need_to_disconnect (
+ PortableServer::ServantBase* proxy)
+{
+ bool disconnect = true;
+
+#if defined (TAO_HAS_TYPED_EVENT_CHANNEL)
+ if (this->typed_event_channel_)
+ {
+ // Typed EC
+ TAO_CEC_TypedEventChannel::ServantRetryMap::ENTRY* entry = 0;
+ if (this->typed_event_channel_->
+ get_servant_retry_map ().find (proxy, entry) == 0)
+ {
+ ++entry->int_id_;
+ if (entry->int_id_ <= this->retries_)
+ {
+ disconnect = false;
+ }
+ }
+ }
+ else
+ {
+#endif /* TAO_HAS_TYPED_EVENT_CHANNEL */
+
+ // Un-typed EC
+ TAO_CEC_EventChannel::ServantRetryMap::ENTRY* entry = 0;
+ if (this->event_channel_->
+ get_servant_retry_map ().find (proxy, entry) == 0)
+ {
+ ++entry->int_id_;
+ if (entry->int_id_ <= this->retries_)
+ {
+ disconnect = false;
+ }
+ }
+
+#if defined (TAO_HAS_TYPED_EVENT_CHANNEL)
+ }
+#endif /* TAO_HAS_TYPED_EVENT_CHANNEL */
+
+ return disconnect;
+}
+
+void
+TAO_CEC_Reactive_SupplierControl::successful_transmission (
+ PortableServer::ServantBase* proxy)
+{
+#if defined (TAO_HAS_TYPED_EVENT_CHANNEL)
+ if (this->typed_event_channel_)
+ {
+ // Typed EC
+ TAO_CEC_TypedEventChannel::ServantRetryMap::ENTRY* entry = 0;
+ if (this->typed_event_channel_->
+ get_servant_retry_map ().find (proxy, entry) == 0)
+ {
+ entry->int_id_ = 0;
+ }
+ }
+ else
+ {
+#endif /* TAO_HAS_TYPED_EVENT_CHANNEL */
+
+ // Un-typed EC
+ TAO_CEC_EventChannel::ServantRetryMap::ENTRY* entry = 0;
+ if (this->event_channel_->
+ get_servant_retry_map ().find (proxy, entry) == 0)
+ {
+ entry->int_id_ = 0;
+ }
+
+#if defined (TAO_HAS_TYPED_EVENT_CHANNEL)
+ }
+#endif /* TAO_HAS_TYPED_EVENT_CHANNEL */
+
+}
+
+void
+TAO_CEC_Reactive_SupplierControl::handle_timeout (
+ const ACE_Time_Value &,
+ const void *)
+{
+ ACE_TRY_NEW_ENV
+ {
+ // Query the state of the Current object *before* we initiate
+ // the iteration...
+ CORBA::PolicyTypeSeq types;
+ CORBA::PolicyList_var policies =
+ this->policy_current_->get_policy_overrides (types
+ ACE_ENV_ARG_PARAMETER);
+ ACE_TRY_CHECK;
+
+ // Change the timeout
+ this->policy_current_->set_policy_overrides (this->policy_list_,
+ CORBA::ADD_OVERRIDE
+ ACE_ENV_ARG_PARAMETER);
+ ACE_TRY_CHECK;
+
+ ACE_TRY_EX (query)
+ {
+ // Query the state of the suppliers...
+ this->query_suppliers (ACE_ENV_SINGLE_ARG_PARAMETER);
+ ACE_TRY_CHECK_EX (query);
+ }
+ ACE_CATCHANY
+ {
+ // Ignore all exceptions
+ }
+ ACE_ENDTRY;
+
+ this->policy_current_->set_policy_overrides (policies.in (),
+ CORBA::SET_OVERRIDE
+ ACE_ENV_ARG_PARAMETER);
+ ACE_TRY_CHECK;
+ for (CORBA::ULong i = 0; i != policies->length (); ++i)
+ {
+ policies[i]->destroy (ACE_ENV_SINGLE_ARG_PARAMETER);
+ ACE_TRY_CHECK;
+ }
+ }
+ ACE_CATCHANY
+ {
+ // Ignore all exceptions
+ }
+ ACE_ENDTRY;
+}
+
+int
+TAO_CEC_Reactive_SupplierControl::activate (void)
+{
+#if defined (TAO_HAS_CORBA_MESSAGING) && TAO_HAS_CORBA_MESSAGING != 0
+ ACE_TRY_NEW_ENV
+ {
+ // Get the PolicyCurrent object
+ CORBA::Object_var tmp =
+ this->orb_->resolve_initial_references ("PolicyCurrent"
+ ACE_ENV_ARG_PARAMETER);
+ ACE_TRY_CHECK;
+
+ this->policy_current_ =
+ CORBA::PolicyCurrent::_narrow (tmp.in ()
+ ACE_ENV_ARG_PARAMETER);
+ ACE_TRY_CHECK;
+
+ // Pre-compute the policy list to the set the right timeout
+ // value...
+ // We need to convert the relative timeout into 100's of nano seconds.
+ TimeBase::TimeT timeout;
+ ORBSVCS_Time::Time_Value_to_TimeT (timeout,
+ this->timeout_);
+ CORBA::Any any;
+ any <<= timeout;
+
+ this->policy_list_.length (1);
+ this->policy_list_[0] =
+ this->orb_->create_policy (
+ Messaging::RELATIVE_RT_TIMEOUT_POLICY_TYPE,
+ any
+ ACE_ENV_ARG_PARAMETER);
+ ACE_TRY_CHECK;
+
+ // Only schedule the timer, when the rate is not zero
+ if (this->rate_ != ACE_Time_Value::zero)
+ {
+ // Schedule the timer after these policies has been set, because the
+ // handle_timeout uses these policies, if done in front, the channel
+ // can crash when the timeout expires before initiazation is ready.
+ timer_id_ = this->reactor_->schedule_timer (&this->adapter_,
+ 0,
+ this->rate_,
+ this->rate_);
+ if (timer_id_ == -1)
+ return -1;
+ }
+ }
+ ACE_CATCHANY
+ {
+ return -1;
+ }
+ ACE_ENDTRY;
+#endif /* TAO_HAS_CORBA_MESSAGING */
+
+ return 0;
+}
+
+int
+TAO_CEC_Reactive_SupplierControl::shutdown (void)
+{
+ int r = 0;
+
+#if defined (TAO_HAS_CORBA_MESSAGING) && TAO_HAS_CORBA_MESSAGING != 0
+ r = this->reactor_->cancel_timer (timer_id_);
+#endif /* TAO_HAS_CORBA_MESSAGING */
+ this->adapter_.reactor (0);
+ return r;
+}
+
+void
+TAO_CEC_Reactive_SupplierControl::supplier_not_exist (
+ TAO_CEC_ProxyPushConsumer *proxy
+ ACE_ENV_ARG_DECL)
+{
+ ACE_TRY
+ {
+ proxy->disconnect_push_consumer (ACE_ENV_SINGLE_ARG_PARAMETER);
+ ACE_TRY_CHECK;
+ }
+ ACE_CATCHANY
+ {
+ // Ignore all exceptions..
+ }
+ ACE_ENDTRY;
+}
+
+#if defined (TAO_HAS_TYPED_EVENT_CHANNEL)
+void
+TAO_CEC_Reactive_SupplierControl::supplier_not_exist (
+ TAO_CEC_TypedProxyPushConsumer *proxy
+ ACE_ENV_ARG_DECL)
+{
+ ACE_TRY
+ {
+ proxy->disconnect_push_consumer (ACE_ENV_SINGLE_ARG_PARAMETER);
+ ACE_TRY_CHECK;
+ }
+ ACE_CATCHANY
+ {
+ // Ignore all exceptions..
+ }
+ ACE_ENDTRY;
+}
+#endif /* TAO_HAS_TYPED_EVENT_CHANNEL */
+
+void
+TAO_CEC_Reactive_SupplierControl::supplier_not_exist (
+ TAO_CEC_ProxyPullConsumer *proxy
+ ACE_ENV_ARG_DECL)
+{
+ ACE_TRY
+ {
+ proxy->disconnect_pull_consumer (ACE_ENV_SINGLE_ARG_PARAMETER);
+ ACE_TRY_CHECK;
+ }
+ ACE_CATCHANY
+ {
+ // Ignore all exceptions..
+ }
+ ACE_ENDTRY;
+}
+
+void
+TAO_CEC_Reactive_SupplierControl::system_exception (
+ TAO_CEC_ProxyPullConsumer *proxy,
+ CORBA::SystemException & /* exception */
+ ACE_ENV_ARG_DECL)
+{
+ ACE_TRY
+ {
+ if (this->need_to_disconnect (proxy))
+ {
+ proxy->disconnect_pull_consumer (ACE_ENV_SINGLE_ARG_PARAMETER);
+ ACE_TRY_CHECK;
+ }
+ }
+ ACE_CATCHANY
+ {
+ // Ignore all exceptions..
+ }
+ ACE_ENDTRY;
+}
+
+// ****************************************************************
+
+TAO_CEC_SupplierControl_Adapter::TAO_CEC_SupplierControl_Adapter (
+ TAO_CEC_Reactive_SupplierControl *adaptee)
+ : adaptee_ (adaptee)
+{
+}
+
+int
+TAO_CEC_SupplierControl_Adapter::handle_timeout (
+ const ACE_Time_Value &tv,
+ const void *arg)
+{
+ this->adaptee_->handle_timeout (tv, arg);
+ return 0;
+}
+
+// ****************************************************************
+
+void
+TAO_CEC_Ping_Push_Supplier::work (TAO_CEC_ProxyPushConsumer *consumer
+ ACE_ENV_ARG_DECL)
+{
+ ACE_TRY
+ {
+ CORBA::Boolean disconnected;
+ CORBA::Boolean non_existent =
+ consumer->supplier_non_existent (disconnected
+ ACE_ENV_ARG_PARAMETER);
+ ACE_TRY_CHECK;
+ if (non_existent && !disconnected)
+ {
+ this->control_->supplier_not_exist (consumer ACE_ENV_ARG_PARAMETER);
+ ACE_TRY_CHECK;
+ }
+ }
+ ACE_CATCH (CORBA::OBJECT_NOT_EXIST, ex)
+ {
+ this->control_->supplier_not_exist (consumer ACE_ENV_ARG_PARAMETER);
+ ACE_TRY_CHECK;
+ }
+ ACE_CATCH (CORBA::TRANSIENT, transient)
+ {
+ if (this->control_->need_to_disconnect (consumer))
+ {
+ this->control_->supplier_not_exist (consumer ACE_ENV_ARG_PARAMETER);
+ ACE_TRY_CHECK;
+ }
+ }
+ ACE_CATCHANY
+ {
+ // Ignore all exceptions
+ }
+ ACE_ENDTRY;
+}
+
+// ****************************************************************
+
+#if defined (TAO_HAS_TYPED_EVENT_CHANNEL)
+void
+TAO_CEC_Ping_Typed_Push_Supplier::work (TAO_CEC_TypedProxyPushConsumer *consumer
+ ACE_ENV_ARG_DECL)
+{
+ ACE_TRY
+ {
+ CORBA::Boolean disconnected;
+ CORBA::Boolean non_existent =
+ consumer->supplier_non_existent (disconnected
+ ACE_ENV_ARG_PARAMETER);
+ ACE_TRY_CHECK;
+ if (non_existent && !disconnected)
+ {
+ this->control_->supplier_not_exist (consumer ACE_ENV_ARG_PARAMETER);
+ ACE_TRY_CHECK;
+ }
+ }
+ ACE_CATCH (CORBA::OBJECT_NOT_EXIST, ex)
+ {
+ this->control_->supplier_not_exist (consumer ACE_ENV_ARG_PARAMETER);
+ ACE_TRY_CHECK;
+ }
+ ACE_CATCH (CORBA::TRANSIENT, transient)
+ {
+ if (this->control_->need_to_disconnect (consumer))
+ {
+ this->control_->supplier_not_exist (consumer ACE_ENV_ARG_PARAMETER);
+ ACE_TRY_CHECK;
+ }
+ }
+ ACE_CATCHANY
+ {
+ // Ignore all exceptions
+ }
+ ACE_ENDTRY;
+}
+#endif /* TAO_HAS_TYPED_EVENT_CHANNEL */
+
+// ****************************************************************
+
+void
+TAO_CEC_Ping_Pull_Supplier::work (TAO_CEC_ProxyPullConsumer *consumer
+ ACE_ENV_ARG_DECL)
+{
+ ACE_TRY
+ {
+ CORBA::Boolean disconnected;
+ CORBA::Boolean non_existent =
+ consumer->supplier_non_existent (disconnected
+ ACE_ENV_ARG_PARAMETER);
+ ACE_TRY_CHECK;
+ if (non_existent && !disconnected)
+ {
+ this->control_->supplier_not_exist (consumer ACE_ENV_ARG_PARAMETER);
+ ACE_TRY_CHECK;
+ }
+ }
+ ACE_CATCH (CORBA::OBJECT_NOT_EXIST, ex)
+ {
+ this->control_->supplier_not_exist (consumer ACE_ENV_ARG_PARAMETER);
+ ACE_TRY_CHECK;
+ }
+ ACE_CATCH (CORBA::TRANSIENT, transient)
+ {
+ if (this->control_->need_to_disconnect (consumer))
+ {
+ this->control_->supplier_not_exist (consumer ACE_ENV_ARG_PARAMETER);
+ ACE_TRY_CHECK;
+ }
+ }
+ ACE_CATCHANY
+ {
+ // Ignore all exceptions
+ }
+ ACE_ENDTRY;
+}
+
+TAO_END_VERSIONED_NAMESPACE_DECL
diff --git a/TAO/orbsvcs/orbsvcs/CosEvent/CEC_Reactive_SupplierControl.h b/TAO/orbsvcs/orbsvcs/CosEvent/CEC_Reactive_SupplierControl.h
new file mode 100644
index 00000000000..bd7cbe1fd94
--- /dev/null
+++ b/TAO/orbsvcs/orbsvcs/CosEvent/CEC_Reactive_SupplierControl.h
@@ -0,0 +1,229 @@
+// -*- C++ -*-
+
+//=============================================================================
+/**
+ * @file CEC_Reactive_SupplierControl.h
+ *
+ * $Id$
+ *
+ * @author Carlos O'Ryan (coryan@cs.wustl.edu)
+ *
+ * More details can be found in:
+ *
+ * http://doc.ece.uci.edu/~coryan/EC/
+ */
+//=============================================================================
+
+#ifndef TAO_CEC_REACTIVE_SUPPLIERCONTROL_H
+#define TAO_CEC_REACTIVE_SUPPLIERCONTROL_H
+
+#include /**/ "ace/pre.h"
+
+#include "orbsvcs/CosEvent/CEC_SupplierControl.h"
+
+#if !defined (ACE_LACKS_PRAGMA_ONCE)
+# pragma once
+#endif /* ACE_LACKS_PRAGMA_ONCE */
+
+#include "orbsvcs/ESF/ESF_Worker.h"
+
+#include "tao/ORB.h"
+
+#include "ace/Event_Handler.h"
+
+TAO_BEGIN_VERSIONED_NAMESPACE_DECL
+
+class TAO_CEC_EventChannel;
+class TAO_CEC_Reactive_SupplierControl;
+
+#if defined (TAO_HAS_TYPED_EVENT_CHANNEL)
+class TAO_CEC_TypedEventChannel;
+#endif /* TAO_HAS_TYPED_EVENT_CHANNEL */
+
+/**
+ * @class TAO_CEC_SupplierControl_Adapter
+ *
+ * @brief Forwards timeout events to the Reactive SupplierControl
+ *
+ * The Reactive SupplierControl strategy uses the reactor to
+ * periodically wakeup and verify the state of the suppliers
+ * registered with the Event Channel.
+ */
+class TAO_Event_Serv_Export TAO_CEC_SupplierControl_Adapter
+ : public ACE_Event_Handler
+{
+public:
+ /// Constructor
+ TAO_CEC_SupplierControl_Adapter (TAO_CEC_Reactive_SupplierControl *adaptee);
+
+ // = Documented in ACE_Event_Handler.
+ virtual int handle_timeout (const ACE_Time_Value &tv,
+ const void *arg = 0);
+
+private:
+ /// The adapted object
+ TAO_CEC_Reactive_SupplierControl *adaptee_;
+};
+
+/**
+ * @class TAO_CEC_Reactive_SupplierControl
+ *
+ * @brief SupplierControl
+ *
+ * Defines the interface for the supplier control strategy.
+ * This strategy handles misbehaving or failing suppliers.
+ * = MEMORY MANAGMENT
+ * = LOCKING
+ * = TODO
+ */
+class TAO_Event_Serv_Export TAO_CEC_Reactive_SupplierControl
+ : public TAO_CEC_SupplierControl
+{
+public:
+ /// Constructor. It does not assume ownership of the <event_channel>
+ /// parameter.
+ TAO_CEC_Reactive_SupplierControl (const ACE_Time_Value &rate,
+ const ACE_Time_Value &timeout,
+ unsigned int retries,
+ TAO_CEC_EventChannel *event_channel,
+ CORBA::ORB_ptr orb);
+
+ /// Constructor for the typed ec.
+#if defined (TAO_HAS_TYPED_EVENT_CHANNEL)
+ TAO_CEC_Reactive_SupplierControl (
+ const ACE_Time_Value &rate,
+ const ACE_Time_Value &timeout,
+ unsigned int retries,
+ TAO_CEC_TypedEventChannel *typed_event_channel,
+ CORBA::ORB_ptr orb
+ );
+#endif /* TAO_HAS_TYPED_EVENT_CHANNEL */
+
+ /// destructor...
+ virtual ~TAO_CEC_Reactive_SupplierControl (void);
+
+ /// Receive the timeout from the adapter
+ void handle_timeout (const ACE_Time_Value &tv,
+ const void* arg);
+
+ // = Documented in TAO_CEC_SupplierControl
+ virtual int activate (void);
+ virtual int shutdown (void);
+ virtual void supplier_not_exist (TAO_CEC_ProxyPushConsumer *proxy
+ ACE_ENV_ARG_DECL_NOT_USED);
+#if defined (TAO_HAS_TYPED_EVENT_CHANNEL)
+ virtual void supplier_not_exist (TAO_CEC_TypedProxyPushConsumer *proxy
+ ACE_ENV_ARG_DECL_NOT_USED);
+#endif /* TAO_HAS_TYPED_EVENT_CHANNEL */
+ virtual void supplier_not_exist (TAO_CEC_ProxyPullConsumer *proxy
+ ACE_ENV_ARG_DECL_NOT_USED);
+ virtual void system_exception (TAO_CEC_ProxyPullConsumer *proxy,
+ CORBA::SystemException &
+ ACE_ENV_ARG_DECL_NOT_USED);
+
+ /// Do we need to disconnect this supplier? The parameter type for
+ /// proxy is PortableServer::ServantBase* due to the fact that this
+ /// method will be used for TAO_CEC_ProxyPushSupplier's and
+ /// TAO_CEC_ProxyPullSupplier's.
+ virtual bool need_to_disconnect (PortableServer::ServantBase* proxy);
+
+ /// Allow others to inform us when a send or receive was successful.
+ virtual void successful_transmission (PortableServer::ServantBase* proxy);
+
+private:
+ /// Check if the suppliers still exists. It is a helper method for
+ /// handle_timeout() to isolate the exceptions.
+ void query_suppliers (ACE_ENV_SINGLE_ARG_DECL);
+
+private:
+ /// The polling rate
+ ACE_Time_Value rate_;
+
+ /// The polling timeout
+ ACE_Time_Value timeout_;
+
+ /// The number of retries per proxy until it is disconnected
+ unsigned int retries_;
+
+ /// The Adapter for the reactor events
+ TAO_CEC_SupplierControl_Adapter adapter_;
+
+ /// The event channel
+ TAO_CEC_EventChannel *event_channel_;
+
+ /// The typed event channel
+#if defined (TAO_HAS_TYPED_EVENT_CHANNEL)
+ TAO_CEC_TypedEventChannel *typed_event_channel_;
+#endif /* TAO_HAS_TYPED_EVENT_CHANNEL */
+
+ /// The ORB
+ CORBA::ORB_var orb_;
+
+ /// To control the timeout policy in the thread
+ CORBA::PolicyCurrent_var policy_current_;
+
+ /// Precomputed policy list to the set timeout.
+ CORBA::PolicyList policy_list_;
+
+ /// The ORB reactor
+ ACE_Reactor *reactor_;
+
+#if defined (TAO_HAS_CORBA_MESSAGING) && TAO_HAS_CORBA_MESSAGING != 0
+ /// The timer id
+ long timer_id_;
+#endif /* TAO_HAS_CORBA_MESSAGING */
+};
+
+// ****************************************************************
+
+class TAO_CEC_Ping_Push_Supplier : public TAO_ESF_Worker<TAO_CEC_ProxyPushConsumer>
+{
+public:
+ TAO_CEC_Ping_Push_Supplier (TAO_CEC_SupplierControl *control);
+
+ virtual void work (TAO_CEC_ProxyPushConsumer *consumer
+ ACE_ENV_ARG_DECL);
+
+private:
+ TAO_CEC_SupplierControl *control_;
+};
+
+// ****************************************************************
+
+#if defined (TAO_HAS_TYPED_EVENT_CHANNEL)
+class TAO_CEC_Ping_Typed_Push_Supplier : public TAO_ESF_Worker<TAO_CEC_TypedProxyPushConsumer>
+{
+public:
+ TAO_CEC_Ping_Typed_Push_Supplier (TAO_CEC_SupplierControl *control);
+
+ virtual void work (TAO_CEC_TypedProxyPushConsumer *consumer
+ ACE_ENV_ARG_DECL);
+
+private:
+ TAO_CEC_SupplierControl *control_;
+};
+#endif /* TAO_HAS_TYPED_EVENT_CHANNEL */
+
+// ****************************************************************
+
+class TAO_CEC_Ping_Pull_Supplier : public TAO_ESF_Worker<TAO_CEC_ProxyPullConsumer>
+{
+public:
+ TAO_CEC_Ping_Pull_Supplier (TAO_CEC_SupplierControl *control);
+
+ virtual void work (TAO_CEC_ProxyPullConsumer *consumer
+ ACE_ENV_ARG_DECL);
+
+private:
+ TAO_CEC_SupplierControl *control_;
+};
+
+TAO_END_VERSIONED_NAMESPACE_DECL
+
+#if defined (__ACE_INLINE__)
+#include "orbsvcs/CosEvent/CEC_Reactive_SupplierControl.i"
+#endif /* __ACE_INLINE__ */
+
+#include /**/ "ace/post.h"
+
+#endif /* TAO_CEC_SUPPLIERCONTROL_H */
diff --git a/TAO/orbsvcs/orbsvcs/CosEvent/CEC_Reactive_SupplierControl.i b/TAO/orbsvcs/orbsvcs/CosEvent/CEC_Reactive_SupplierControl.i
new file mode 100644
index 00000000000..e166f46ecf6
--- /dev/null
+++ b/TAO/orbsvcs/orbsvcs/CosEvent/CEC_Reactive_SupplierControl.i
@@ -0,0 +1,34 @@
+// -*- C++ -*-
+//
+// $Id$
+
+TAO_BEGIN_VERSIONED_NAMESPACE_DECL
+
+ACE_INLINE
+TAO_CEC_Ping_Push_Supplier::
+ TAO_CEC_Ping_Push_Supplier (TAO_CEC_SupplierControl *control)
+ : control_ (control)
+{
+}
+
+// ****************************************************************
+
+#if defined (TAO_HAS_TYPED_EVENT_CHANNEL)
+ACE_INLINE
+TAO_CEC_Ping_Typed_Push_Supplier::
+ TAO_CEC_Ping_Typed_Push_Supplier (TAO_CEC_SupplierControl *control)
+ : control_ (control)
+{
+}
+#endif /* TAO_HAS_TYPED_EVENT_CHANNEL */
+
+// ****************************************************************
+
+ACE_INLINE
+TAO_CEC_Ping_Pull_Supplier::
+ TAO_CEC_Ping_Pull_Supplier (TAO_CEC_SupplierControl *control)
+ : control_ (control)
+{
+}
+
+TAO_END_VERSIONED_NAMESPACE_DECL
diff --git a/TAO/orbsvcs/orbsvcs/CosEvent/CEC_SupplierAdmin.cpp b/TAO/orbsvcs/orbsvcs/CosEvent/CEC_SupplierAdmin.cpp
new file mode 100644
index 00000000000..e667fe96e0d
--- /dev/null
+++ b/TAO/orbsvcs/orbsvcs/CosEvent/CEC_SupplierAdmin.cpp
@@ -0,0 +1,105 @@
+// $Id$
+
+#include "orbsvcs/CosEvent/CEC_SupplierAdmin.h"
+#include "orbsvcs/CosEvent/CEC_ProxyPushConsumer.h"
+#include "orbsvcs/CosEvent/CEC_ProxyPullConsumer.h"
+#include "orbsvcs/CosEvent/CEC_EventChannel.h"
+#include "orbsvcs/ESF/ESF_Shutdown_Proxy.h"
+
+#if ! defined (__ACE_INLINE__)
+#include "orbsvcs/CosEvent/CEC_SupplierAdmin.i"
+#endif /* __ACE_INLINE__ */
+
+ACE_RCSID (CosEvent,
+ CEC_SupplierAdmin,
+ "$Id$")
+
+
+TAO_BEGIN_VERSIONED_NAMESPACE_DECL
+
+TAO_CEC_SupplierAdmin::TAO_CEC_SupplierAdmin (TAO_CEC_EventChannel *ec)
+ : event_channel_ (ec),
+ push_admin_ (ec),
+ pull_admin_ (ec)
+{
+ this->default_POA_ =
+ this->event_channel_->supplier_poa ();
+}
+
+TAO_CEC_SupplierAdmin::~TAO_CEC_SupplierAdmin (void)
+{
+}
+
+PortableServer::POA_ptr
+TAO_CEC_SupplierAdmin::_default_POA (ACE_ENV_SINGLE_ARG_DECL_NOT_USED)
+{
+ return PortableServer::POA::_duplicate (this->default_POA_.in ());
+}
+
+void
+TAO_CEC_SupplierAdmin::connected (TAO_CEC_ProxyPushConsumer *consumer
+ ACE_ENV_ARG_DECL)
+{
+ this->push_admin_.connected (consumer ACE_ENV_ARG_PARAMETER);
+}
+
+void
+TAO_CEC_SupplierAdmin::reconnected (TAO_CEC_ProxyPushConsumer *consumer
+ ACE_ENV_ARG_DECL)
+{
+ this->push_admin_.reconnected (consumer ACE_ENV_ARG_PARAMETER);
+}
+
+void
+TAO_CEC_SupplierAdmin::disconnected (TAO_CEC_ProxyPushConsumer *consumer
+ ACE_ENV_ARG_DECL)
+{
+ this->push_admin_.disconnected (consumer ACE_ENV_ARG_PARAMETER);
+}
+
+void
+TAO_CEC_SupplierAdmin::connected (TAO_CEC_ProxyPullConsumer *consumer
+ ACE_ENV_ARG_DECL)
+{
+ this->pull_admin_.connected (consumer ACE_ENV_ARG_PARAMETER);
+}
+
+void
+TAO_CEC_SupplierAdmin::reconnected (TAO_CEC_ProxyPullConsumer *consumer
+ ACE_ENV_ARG_DECL)
+{
+ this->pull_admin_.reconnected (consumer ACE_ENV_ARG_PARAMETER);
+}
+
+void
+TAO_CEC_SupplierAdmin::disconnected (TAO_CEC_ProxyPullConsumer *consumer
+ ACE_ENV_ARG_DECL)
+{
+ this->pull_admin_.disconnected (consumer ACE_ENV_ARG_PARAMETER);
+}
+
+void
+TAO_CEC_SupplierAdmin::shutdown (ACE_ENV_SINGLE_ARG_DECL)
+{
+ this->push_admin_.shutdown (ACE_ENV_SINGLE_ARG_PARAMETER);
+ ACE_CHECK;
+
+ this->pull_admin_.shutdown (ACE_ENV_SINGLE_ARG_PARAMETER);
+ ACE_CHECK;
+}
+
+CosEventChannelAdmin::ProxyPushConsumer_ptr
+TAO_CEC_SupplierAdmin::obtain_push_consumer (ACE_ENV_SINGLE_ARG_DECL)
+ ACE_THROW_SPEC ((CORBA::SystemException))
+{
+ return this->push_admin_.obtain (ACE_ENV_SINGLE_ARG_PARAMETER);
+}
+
+CosEventChannelAdmin::ProxyPullConsumer_ptr
+TAO_CEC_SupplierAdmin::obtain_pull_consumer (ACE_ENV_SINGLE_ARG_DECL)
+ ACE_THROW_SPEC ((CORBA::SystemException))
+{
+ return this->pull_admin_.obtain (ACE_ENV_SINGLE_ARG_PARAMETER);
+}
+
+TAO_END_VERSIONED_NAMESPACE_DECL
diff --git a/TAO/orbsvcs/orbsvcs/CosEvent/CEC_SupplierAdmin.h b/TAO/orbsvcs/orbsvcs/CosEvent/CEC_SupplierAdmin.h
new file mode 100644
index 00000000000..a1e67f65c71
--- /dev/null
+++ b/TAO/orbsvcs/orbsvcs/CosEvent/CEC_SupplierAdmin.h
@@ -0,0 +1,127 @@
+// -*- C++ -*-
+
+//=============================================================================
+/**
+ * @file CEC_SupplierAdmin.h
+ *
+ * $Id$
+ *
+ * @author Carlos O'Ryan (coryan@cs.wustl.edu)
+ *
+ * More details can be found in:
+ *
+ * http://doc.ece.uci.edu/~coryan/EC/
+ */
+//=============================================================================
+
+#ifndef TAO_CEC_SUPPLIERADMIN_H
+#define TAO_CEC_SUPPLIERADMIN_H
+
+#include /**/ "ace/pre.h"
+
+#include "orbsvcs/CosEventChannelAdminS.h"
+
+#if !defined (ACE_LACKS_PRAGMA_ONCE)
+# pragma once
+#endif /* ACE_LACKS_PRAGMA_ONCE */
+
+#include "orbsvcs/ESF/ESF_Proxy_Admin.h"
+
+#include "orbsvcs/CosEvent/CEC_ProxyPushConsumer.h"
+#include "orbsvcs/CosEvent/CEC_ProxyPullConsumer.h"
+#include "orbsvcs/CosEvent/event_serv_export.h"
+
+TAO_BEGIN_VERSIONED_NAMESPACE_DECL
+
+class TAO_CEC_EventChannel;
+
+/**
+ * @class TAO_CEC_SupplierAdmin
+ *
+ * @brief ProxyPushSupplier
+ *
+ * Implement the CosEventChannelAdmin::SupplierAdmin interface.
+ * This class is an Abstract Factory for the
+ * TAO_CEC_ProxyPushConsumer.
+ * = MEMORY MANAGMENT
+ * It does not assume ownership of the TAO_CEC_EventChannel object
+ * = LOCKING
+ * @@ TODO
+ * No provisions for locking, access must be serialized
+ * externally.
+ * = TODO
+ */
+class TAO_Event_Serv_Export TAO_CEC_SupplierAdmin
+ : public POA_CosEventChannelAdmin::SupplierAdmin
+{
+public:
+ /// constructor...
+ TAO_CEC_SupplierAdmin (TAO_CEC_EventChannel* event_channel);
+
+ /// destructor...
+ virtual ~TAO_CEC_SupplierAdmin (void);
+
+ /// For each elements call <worker->work()>.
+ void for_each (TAO_ESF_Worker<TAO_CEC_ProxyPushConsumer> *worker
+ ACE_ENV_ARG_DECL);
+
+ /// For each elements call <worker->work()>.
+ void for_each (TAO_ESF_Worker<TAO_CEC_ProxyPullConsumer> *worker
+ ACE_ENV_ARG_DECL);
+
+ /// Keep track of connected consumers.
+ virtual void connected (TAO_CEC_ProxyPushConsumer*
+ ACE_ENV_ARG_DECL_NOT_USED);
+ virtual void reconnected (TAO_CEC_ProxyPushConsumer*
+ ACE_ENV_ARG_DECL_NOT_USED);
+ virtual void disconnected (TAO_CEC_ProxyPushConsumer*
+ ACE_ENV_ARG_DECL_NOT_USED);
+ virtual void connected (TAO_CEC_ProxyPullConsumer*
+ ACE_ENV_ARG_DECL_NOT_USED);
+ virtual void reconnected (TAO_CEC_ProxyPullConsumer*
+ ACE_ENV_ARG_DECL_NOT_USED);
+ virtual void disconnected (TAO_CEC_ProxyPullConsumer*
+ ACE_ENV_ARG_DECL_NOT_USED);
+
+ /// The event channel is shutting down, inform all the consumers of
+ /// this
+ virtual void shutdown (ACE_ENV_SINGLE_ARG_DECL_NOT_USED);
+
+ // = The CosEventChannelAdmin::SupplierAdmin methods...
+ virtual CosEventChannelAdmin::ProxyPushConsumer_ptr
+ obtain_push_consumer (ACE_ENV_SINGLE_ARG_DECL_NOT_USED)
+ ACE_THROW_SPEC ((CORBA::SystemException));
+ virtual CosEventChannelAdmin::ProxyPullConsumer_ptr
+ obtain_pull_consumer (ACE_ENV_SINGLE_ARG_DECL_NOT_USED)
+ ACE_THROW_SPEC ((CORBA::SystemException));
+
+ // = The PortableServer::ServantBase methods
+ virtual PortableServer::POA_ptr _default_POA (ACE_ENV_SINGLE_ARG_DECL);
+
+private:
+ /// The Event Channel we belong to
+ TAO_CEC_EventChannel *event_channel_;
+
+ /// The push and pull aspects are implemented using these classes
+ TAO_ESF_Proxy_Admin<TAO_CEC_EventChannel,
+ TAO_CEC_ProxyPushConsumer,
+ CosEventChannelAdmin::ProxyPushConsumer>
+ push_admin_;
+ TAO_ESF_Proxy_Admin<TAO_CEC_EventChannel,
+ TAO_CEC_ProxyPullConsumer,
+ CosEventChannelAdmin::ProxyPullConsumer>
+ pull_admin_;
+
+ /// Store the default POA.
+ PortableServer::POA_var default_POA_;
+};
+
+TAO_END_VERSIONED_NAMESPACE_DECL
+
+#if defined (__ACE_INLINE__)
+#include "orbsvcs/CosEvent/CEC_SupplierAdmin.i"
+#endif /* __ACE_INLINE__ */
+
+#include /**/ "ace/post.h"
+
+#endif /* TAO_CEC_SUPPLIERADMIN_H */
diff --git a/TAO/orbsvcs/orbsvcs/CosEvent/CEC_SupplierAdmin.i b/TAO/orbsvcs/orbsvcs/CosEvent/CEC_SupplierAdmin.i
new file mode 100644
index 00000000000..ec420d2c576
--- /dev/null
+++ b/TAO/orbsvcs/orbsvcs/CosEvent/CEC_SupplierAdmin.i
@@ -0,0 +1,23 @@
+// -*- C++ -*-
+//
+// $Id$
+
+TAO_BEGIN_VERSIONED_NAMESPACE_DECL
+
+ACE_INLINE void
+TAO_CEC_SupplierAdmin::
+ for_each (TAO_ESF_Worker<TAO_CEC_ProxyPushConsumer> *worker
+ ACE_ENV_ARG_DECL)
+{
+ this->push_admin_.for_each (worker ACE_ENV_ARG_PARAMETER);
+}
+
+ACE_INLINE void
+TAO_CEC_SupplierAdmin::
+ for_each (TAO_ESF_Worker<TAO_CEC_ProxyPullConsumer> *worker
+ ACE_ENV_ARG_DECL)
+{
+ this->pull_admin_.for_each (worker ACE_ENV_ARG_PARAMETER);
+}
+
+TAO_END_VERSIONED_NAMESPACE_DECL
diff --git a/TAO/orbsvcs/orbsvcs/CosEvent/CEC_SupplierControl.cpp b/TAO/orbsvcs/orbsvcs/CosEvent/CEC_SupplierControl.cpp
new file mode 100644
index 00000000000..e9b79b992cd
--- /dev/null
+++ b/TAO/orbsvcs/orbsvcs/CosEvent/CEC_SupplierControl.cpp
@@ -0,0 +1,67 @@
+// $Id$
+
+#include "orbsvcs/CosEvent/CEC_SupplierControl.h"
+
+ACE_RCSID(CosEvent, CEC_SupplierControl, "$Id$")
+
+TAO_BEGIN_VERSIONED_NAMESPACE_DECL
+
+TAO_CEC_SupplierControl::TAO_CEC_SupplierControl (void)
+{
+}
+
+TAO_CEC_SupplierControl::~TAO_CEC_SupplierControl (void)
+{
+}
+
+int
+TAO_CEC_SupplierControl::activate (void)
+{
+ return 0;
+}
+
+int
+TAO_CEC_SupplierControl::shutdown (void)
+{
+ return 0;
+}
+
+void
+TAO_CEC_SupplierControl::supplier_not_exist (TAO_CEC_ProxyPushConsumer *
+ ACE_ENV_ARG_DECL_NOT_USED)
+{
+}
+
+#if defined (TAO_HAS_TYPED_EVENT_CHANNEL)
+void
+TAO_CEC_SupplierControl::supplier_not_exist (TAO_CEC_TypedProxyPushConsumer *
+ ACE_ENV_ARG_DECL_NOT_USED)
+{
+}
+#endif /* TAO_HAS_TYPED_EVENT_CHANNEL */
+
+void
+TAO_CEC_SupplierControl::supplier_not_exist (TAO_CEC_ProxyPullConsumer *
+ ACE_ENV_ARG_DECL_NOT_USED)
+{
+}
+
+void
+TAO_CEC_SupplierControl::system_exception (TAO_CEC_ProxyPullConsumer *,
+ CORBA::SystemException &
+ ACE_ENV_ARG_DECL_NOT_USED)
+{
+}
+
+bool
+TAO_CEC_SupplierControl::need_to_disconnect (PortableServer::ServantBase*)
+{
+ return true;
+}
+
+void
+TAO_CEC_SupplierControl::successful_transmission (PortableServer::ServantBase*)
+{
+}
+
+TAO_END_VERSIONED_NAMESPACE_DECL
diff --git a/TAO/orbsvcs/orbsvcs/CosEvent/CEC_SupplierControl.h b/TAO/orbsvcs/orbsvcs/CosEvent/CEC_SupplierControl.h
new file mode 100644
index 00000000000..4de8fc0c3f6
--- /dev/null
+++ b/TAO/orbsvcs/orbsvcs/CosEvent/CEC_SupplierControl.h
@@ -0,0 +1,112 @@
+// -*- C++ -*-
+
+//=============================================================================
+/**
+ * @file CEC_SupplierControl.h
+ *
+ * $Id$
+ *
+ * @author Carlos O'Ryan (coryan@cs.wustl.edu)
+ *
+ * More details can be found in:
+ *
+ * http://doc.ece.uci.edu/~coryan/EC/
+ */
+//=============================================================================
+
+
+#ifndef TAO_CEC_SUPPLIERCONTROL_H
+#define TAO_CEC_SUPPLIERCONTROL_H
+
+#include /**/ "ace/pre.h"
+
+#include "orbsvcs/CosEvent/event_serv_export.h"
+
+#if !defined (ACE_LACKS_PRAGMA_ONCE)
+# pragma once
+#endif /* ACE_LACKS_PRAGMA_ONCE */
+
+#include "tao/PortableServer/PortableServer.h"
+#include "tao/Basic_Types.h"
+
+TAO_BEGIN_VERSIONED_NAMESPACE_DECL
+
+class TAO_CEC_EventChannel;
+class TAO_CEC_ProxyPushConsumer;
+class TAO_CEC_ProxyPullConsumer;
+
+#if defined (TAO_HAS_TYPED_EVENT_CHANNEL)
+class TAO_CEC_TypedProxyPushConsumer;
+#endif /* TAO_HAS_TYPED_EVENT_CHANNEL */
+
+namespace CORBA
+{
+ class SystemException;
+}
+
+/**
+ * @class TAO_CEC_SupplierControl
+ *
+ * @brief SupplierControl
+ *
+ * Defines the interface for the supplier control strategy.
+ * This strategy handles misbehaving or failing suppliers.
+ * = MEMORY MANAGMENT
+ * = LOCKING
+ * = TODO
+ */
+class TAO_Event_Serv_Export TAO_CEC_SupplierControl
+{
+public:
+ /// Constructor. It does not assume ownership of the <event_channel>
+ /// parameter.
+ TAO_CEC_SupplierControl (void);
+
+ /// destructor...
+ virtual ~TAO_CEC_SupplierControl (void);
+
+ /// Activate any internal threads or timers used to poll the state of
+ /// the suppliers
+ virtual int activate (void);
+ virtual int shutdown (void);
+
+ /**
+ * Invoked by helper classes when they detect that a supplier does
+ * not exists (i.e. _non_existent() returns true and/or the
+ * CORBA::OBJECT_NOT_EXIST exception has been raised).
+ */
+ virtual void supplier_not_exist (TAO_CEC_ProxyPushConsumer *proxy
+ ACE_ENV_ARG_DECL_NOT_USED);
+
+#if defined (TAO_HAS_TYPED_EVENT_CHANNEL)
+ virtual void supplier_not_exist (TAO_CEC_TypedProxyPushConsumer *proxy
+ ACE_ENV_ARG_DECL_NOT_USED);
+#endif /* TAO_HAS_TYPED_EVENT_CHANNEL */
+
+ /**
+ * Invoked by helper classes when they detect that a supplier does
+ * not exists (i.e. _non_existent() returns true and/or the
+ * CORBA::OBJECT_NOT_EXIST exception has been raised).
+ */
+ virtual void supplier_not_exist (TAO_CEC_ProxyPullConsumer *proxy
+ ACE_ENV_ARG_DECL_NOT_USED);
+
+ /// Some system exception was rasied while trying to push an event.
+ virtual void system_exception (TAO_CEC_ProxyPullConsumer *proxy,
+ CORBA::SystemException &
+ ACE_ENV_ARG_DECL_NOT_USED);
+
+ /// Do we need to disconnect this supplier? The parameter type for
+ /// proxy is PortableServer::ServantBase* due to the fact that this
+ /// method will be used for TAO_CEC_ProxyPushSupplier's and
+ /// TAO_CEC_ProxyPullSupplier's.
+ virtual bool need_to_disconnect (PortableServer::ServantBase* proxy);
+
+ /// Allow others to inform us when a send or receive was successful.
+ virtual void successful_transmission (PortableServer::ServantBase* proxy);
+};
+
+TAO_END_VERSIONED_NAMESPACE_DECL
+
+#include /**/ "ace/post.h"
+#endif /* TAO_CEC_SUPPLIERCONTROL_H */
diff --git a/TAO/orbsvcs/orbsvcs/CosEvent/CEC_TypedConsumerAdmin.cpp b/TAO/orbsvcs/orbsvcs/CosEvent/CEC_TypedConsumerAdmin.cpp
new file mode 100644
index 00000000000..69c08a7b739
--- /dev/null
+++ b/TAO/orbsvcs/orbsvcs/CosEvent/CEC_TypedConsumerAdmin.cpp
@@ -0,0 +1,135 @@
+// -*- C++ -*-
+//
+// $Id$
+
+#include "orbsvcs/CosEvent/CEC_TypedConsumerAdmin.h"
+
+#include "orbsvcs/CosEvent/CEC_TypedEventChannel.h"
+
+#if ! defined (__ACE_INLINE__)
+#include "orbsvcs/CosEvent/CEC_TypedConsumerAdmin.i"
+#endif /* __ACE_INLINE__ */
+
+
+TAO_BEGIN_VERSIONED_NAMESPACE_DECL
+
+// Implementation skeleton constructor
+TAO_CEC_TypedConsumerAdmin::TAO_CEC_TypedConsumerAdmin (TAO_CEC_TypedEventChannel *ec)
+ : typed_event_channel_ (ec),
+ typed_push_admin_ (ec)
+{
+ this->default_POA_ =
+ this->typed_event_channel_->typed_consumer_poa ();
+}
+
+// Implementation skeleton destructor
+TAO_CEC_TypedConsumerAdmin::~TAO_CEC_TypedConsumerAdmin (void)
+{
+}
+
+void
+TAO_CEC_TypedConsumerAdmin::invoke (const TAO_CEC_TypedEvent& typed_event
+ ACE_ENV_ARG_DECL)
+ ACE_THROW_SPEC ((CORBA::SystemException))
+{
+ TAO_CEC_Propagate_Typed_Event typed_event_worker (typed_event, this->typed_event_channel_);
+
+ this->typed_push_admin_.for_each (&typed_event_worker
+ ACE_ENV_ARG_PARAMETER);
+ ACE_CHECK;
+}
+
+void
+TAO_CEC_TypedConsumerAdmin::connected (TAO_CEC_ProxyPushSupplier *supplier
+ ACE_ENV_ARG_DECL)
+{
+ this->typed_push_admin_.connected (supplier ACE_ENV_ARG_PARAMETER);
+}
+
+void
+TAO_CEC_TypedConsumerAdmin::reconnected (TAO_CEC_ProxyPushSupplier *supplier
+ ACE_ENV_ARG_DECL)
+{
+ this->typed_push_admin_.reconnected (supplier ACE_ENV_ARG_PARAMETER);
+}
+
+void
+TAO_CEC_TypedConsumerAdmin::disconnected (TAO_CEC_ProxyPushSupplier *supplier
+ ACE_ENV_ARG_DECL)
+{
+ this->typed_push_admin_.disconnected (supplier ACE_ENV_ARG_PARAMETER);
+}
+
+void
+TAO_CEC_TypedConsumerAdmin::shutdown (ACE_ENV_SINGLE_ARG_DECL)
+{
+ this->typed_push_admin_.shutdown (ACE_ENV_SINGLE_ARG_PARAMETER);
+ ACE_CHECK;
+}
+
+CosTypedEventChannelAdmin::TypedProxyPullSupplier_ptr
+TAO_CEC_TypedConsumerAdmin::obtain_typed_pull_supplier (
+ const char * /*supported_interface*/
+ ACE_ENV_ARG_DECL
+ )
+ ACE_THROW_SPEC ((
+ CORBA::SystemException,
+ CosTypedEventChannelAdmin::InterfaceNotSupported
+ ))
+{
+ ACE_THROW_RETURN (CosTypedEventChannelAdmin::InterfaceNotSupported (), 0);
+}
+
+CosEventChannelAdmin::ProxyPushSupplier_ptr
+TAO_CEC_TypedConsumerAdmin::obtain_typed_push_supplier (
+ const char * uses_interface
+ ACE_ENV_ARG_DECL
+ )
+ ACE_THROW_SPEC ((
+ CORBA::SystemException,
+ CosTypedEventChannelAdmin::NoSuchImplementation
+ ))
+
+{
+ // Register the consumer uses_interface with the EC
+ int result = this->typed_event_channel_->consumer_register_uses_interace (uses_interface ACE_ENV_ARG_PARAMETER);
+ ACE_CHECK_RETURN (0);
+
+ if (result == -1)
+ {
+ ACE_THROW_RETURN (CosTypedEventChannelAdmin::NoSuchImplementation (), 0);
+ }
+
+ return this->typed_push_admin_.obtain (ACE_ENV_SINGLE_ARG_PARAMETER);
+}
+
+CosEventChannelAdmin::ProxyPushSupplier_ptr
+TAO_CEC_TypedConsumerAdmin::obtain_push_supplier (ACE_ENV_SINGLE_ARG_DECL)
+ ACE_THROW_SPEC ((CORBA::SystemException))
+{
+ ACE_THROW_RETURN (CORBA::NO_IMPLEMENT (), 0);
+}
+
+CosEventChannelAdmin::ProxyPullSupplier_ptr
+TAO_CEC_TypedConsumerAdmin::obtain_pull_supplier (ACE_ENV_SINGLE_ARG_DECL)
+ ACE_THROW_SPEC ((CORBA::SystemException))
+{
+ ACE_THROW_RETURN (CORBA::NO_IMPLEMENT (), 0);
+}
+
+PortableServer::POA_ptr
+TAO_CEC_TypedConsumerAdmin::_default_POA (ACE_ENV_SINGLE_ARG_DECL_NOT_USED)
+{
+ return PortableServer::POA::_duplicate (this->default_POA_.in ());
+}
+
+// ****************************************************************
+
+void
+TAO_CEC_Propagate_Typed_Event::work (TAO_CEC_ProxyPushSupplier *supplier
+ ACE_ENV_ARG_DECL)
+{
+ supplier->invoke (this->typed_event_ ACE_ENV_ARG_PARAMETER);
+}
+
+TAO_END_VERSIONED_NAMESPACE_DECL
diff --git a/TAO/orbsvcs/orbsvcs/CosEvent/CEC_TypedConsumerAdmin.h b/TAO/orbsvcs/orbsvcs/CosEvent/CEC_TypedConsumerAdmin.h
new file mode 100644
index 00000000000..72925fb2c00
--- /dev/null
+++ b/TAO/orbsvcs/orbsvcs/CosEvent/CEC_TypedConsumerAdmin.h
@@ -0,0 +1,129 @@
+// -*- C++ -*-
+
+//=============================================================================
+/**
+ * @file CEC_TypedConsumerAdmin.h
+ *
+ * $Id$
+ *
+ * @author Jon Astle (jon@astle45.fsnet.co.uk)
+ *
+ * Based on the untyped version by Carlos O'Ryan (coryan@cs.wustl.edu)
+ */
+//=============================================================================
+
+
+#ifndef TAO_CEC_TYPEDCONSUMERADMIN_H_
+#define TAO_CEC_TYPEDCONSUMERADMIN_H_
+
+#include /**/ "ace/pre.h"
+
+#include "orbsvcs/CosTypedEventChannelAdminS.h"
+
+#if !defined (ACE_LACKS_PRAGMA_ONCE)
+#pragma once
+#endif /* ACE_LACKS_PRAGMA_ONCE */
+
+#include "orbsvcs/ESF/ESF_Proxy_Admin.h"
+
+#include "orbsvcs/CosEvent/CEC_ProxyPushSupplier.h"
+#include "orbsvcs/CosEvent/CEC_TypedEvent.h"
+
+TAO_BEGIN_VERSIONED_NAMESPACE_DECL
+
+class TAO_CEC_TypedEventChannel;
+
+//Class TAO_CEC_TypedConsumerAdmin
+class TAO_Event_Serv_Export TAO_CEC_TypedConsumerAdmin
+ : public POA_CosTypedEventChannelAdmin::TypedConsumerAdmin
+{
+public:
+
+ // Constructor
+ TAO_CEC_TypedConsumerAdmin (TAO_CEC_TypedEventChannel* typed_event_channel);
+
+ // Destructor
+ virtual ~TAO_CEC_TypedConsumerAdmin (void);
+
+ /// For each elements call <worker->work()>.
+ void for_each (TAO_ESF_Worker<TAO_CEC_ProxyPushSupplier> *worker
+ ACE_ENV_ARG_DECL);
+
+ /// Invoke the typed event on all the consumers
+ virtual void invoke (const TAO_CEC_TypedEvent& typed_event
+ ACE_ENV_ARG_DECL)
+ ACE_THROW_SPEC ((CORBA::SystemException));
+
+ /// Used to inform the EC that a Supplier has connected or
+ /// disconnected from it.
+ virtual void connected (TAO_CEC_ProxyPushSupplier*
+ ACE_ENV_ARG_DECL_NOT_USED);
+ virtual void reconnected (TAO_CEC_ProxyPushSupplier*
+ ACE_ENV_ARG_DECL_NOT_USED);
+ virtual void disconnected (TAO_CEC_ProxyPushSupplier*
+ ACE_ENV_ARG_DECL_NOT_USED);
+
+ /// The typed event channel is shutting down, inform all the consumers of
+ /// this
+ virtual void shutdown (ACE_ENV_SINGLE_ARG_DECL_NOT_USED);
+
+ // = The CosTypedEventChannelAdmin::TypedConsumerAdmin methods...
+ virtual CosEventChannelAdmin::ProxyPushSupplier_ptr
+ obtain_typed_push_supplier (const char * uses_interface ACE_ENV_ARG_DECL)
+ ACE_THROW_SPEC ((CORBA::SystemException,
+ CosTypedEventChannelAdmin::NoSuchImplementation));
+ virtual CosTypedEventChannelAdmin::TypedProxyPullSupplier_ptr
+ obtain_typed_pull_supplier (const char * supported_interface ACE_ENV_ARG_DECL)
+ ACE_THROW_SPEC ((CORBA::SystemException,
+ CosTypedEventChannelAdmin::InterfaceNotSupported));
+
+ // = The CosEventChannelAdmin::ConsumerAdmin methods...
+ virtual CosEventChannelAdmin::ProxyPushSupplier_ptr
+ obtain_push_supplier (ACE_ENV_SINGLE_ARG_DECL_NOT_USED)
+ ACE_THROW_SPEC ((CORBA::SystemException));
+
+ virtual CosEventChannelAdmin::ProxyPullSupplier_ptr
+ obtain_pull_supplier (ACE_ENV_SINGLE_ARG_DECL_NOT_USED)
+ ACE_THROW_SPEC ((CORBA::SystemException));
+
+ // = The PortableServer::ServantBase methods
+ virtual PortableServer::POA_ptr _default_POA (ACE_ENV_SINGLE_ARG_DECL);
+
+private:
+ /// The Event Channel we belong to
+ TAO_CEC_TypedEventChannel *typed_event_channel_;
+
+ /// Store the default POA.
+ PortableServer::POA_var default_POA_;
+
+ /// Implement the push side of this class
+ TAO_ESF_Proxy_Admin<TAO_CEC_TypedEventChannel,TAO_CEC_ProxyPushSupplier,CosEventChannelAdmin::ProxyPushSupplier> typed_push_admin_;
+};
+
+// ****************************************************************
+
+class TAO_CEC_Propagate_Typed_Event : public TAO_ESF_Worker<TAO_CEC_ProxyPushSupplier>
+{
+public:
+ TAO_CEC_Propagate_Typed_Event (const TAO_CEC_TypedEvent& typed_event,
+ TAO_CEC_TypedEventChannel* typed_event_channel);
+
+ void work (TAO_CEC_ProxyPushSupplier *supplier
+ ACE_ENV_ARG_DECL);
+
+private:
+ /// The typed event
+ const TAO_CEC_TypedEvent typed_event_;
+
+ /// The typed EC
+ TAO_CEC_TypedEventChannel* typed_event_channel_;
+};
+
+TAO_END_VERSIONED_NAMESPACE_DECL
+
+#if defined (__ACE_INLINE__)
+#include "orbsvcs/CosEvent/CEC_TypedConsumerAdmin.i"
+#endif /* __ACE_INLINE__ */
+
+#include /**/ "ace/post.h"
+#endif /* TAO_CEC_TYPEDCONSUMERADMIN_H_ */
diff --git a/TAO/orbsvcs/orbsvcs/CosEvent/CEC_TypedConsumerAdmin.i b/TAO/orbsvcs/orbsvcs/CosEvent/CEC_TypedConsumerAdmin.i
new file mode 100644
index 00000000000..37a0dd30d28
--- /dev/null
+++ b/TAO/orbsvcs/orbsvcs/CosEvent/CEC_TypedConsumerAdmin.i
@@ -0,0 +1,24 @@
+// -*- C++ -*-
+//
+// $Id$
+
+TAO_BEGIN_VERSIONED_NAMESPACE_DECL
+
+ACE_INLINE void
+TAO_CEC_TypedConsumerAdmin::
+ for_each (TAO_ESF_Worker<TAO_CEC_ProxyPushSupplier> *worker
+ ACE_ENV_ARG_DECL)
+{
+ this->typed_push_admin_.for_each (worker ACE_ENV_ARG_PARAMETER);
+}
+
+ACE_INLINE
+TAO_CEC_Propagate_Typed_Event::TAO_CEC_Propagate_Typed_Event (
+ const TAO_CEC_TypedEvent& typed_event,
+ TAO_CEC_TypedEventChannel* typed_event_channel)
+ : typed_event_ (typed_event),
+ typed_event_channel_ (typed_event_channel)
+{
+}
+
+TAO_END_VERSIONED_NAMESPACE_DECL
diff --git a/TAO/orbsvcs/orbsvcs/CosEvent/CEC_TypedEvent.cpp b/TAO/orbsvcs/orbsvcs/CosEvent/CEC_TypedEvent.cpp
new file mode 100644
index 00000000000..9142e04e6bb
--- /dev/null
+++ b/TAO/orbsvcs/orbsvcs/CosEvent/CEC_TypedEvent.cpp
@@ -0,0 +1,9 @@
+// -*- C++ -*-
+//
+// $Id$
+
+#include "orbsvcs/CosEvent/CEC_TypedEvent.h"
+
+#if ! defined (__ACE_INLINE__)
+#include "orbsvcs/CosEvent/CEC_TypedEvent.i"
+#endif /* __ACE_INLINE__ */
diff --git a/TAO/orbsvcs/orbsvcs/CosEvent/CEC_TypedEvent.h b/TAO/orbsvcs/orbsvcs/CosEvent/CEC_TypedEvent.h
new file mode 100644
index 00000000000..8dff16f8bf1
--- /dev/null
+++ b/TAO/orbsvcs/orbsvcs/CosEvent/CEC_TypedEvent.h
@@ -0,0 +1,69 @@
+// -*- C++ -*-
+
+//=============================================================================
+/**
+ * @file CEC_TypedEvent.h
+ *
+ * $Id$
+ *
+ * @author Jon Astle (jon@astle45.fsnet.co.uk)
+ */
+//=============================================================================
+
+#ifndef TAO_CEC_TYPEDEVENT_H_
+#define TAO_CEC_TYPEDEVENT_H_
+#include /**/ "ace/pre.h"
+
+#include "orbsvcs/CosEvent/event_serv_export.h"
+
+#if !defined (ACE_LACKS_PRAGMA_ONCE)
+#pragma once
+#endif /* ACE_LACKS_PRAGMA_ONCE */
+
+#include "tao/AnyTypeCode/NVList.h"
+#include "tao/CORBA_String.h"
+#include "tao/CORBA_methods.h"
+
+// ****************************************************************
+
+TAO_BEGIN_VERSIONED_NAMESPACE_DECL
+
+/**
+ * @class TAO_CEC_TypedEvent
+ *
+ * @brief Defines the operation and args list for the TypedEvent
+ *
+ * Used to store the TypedEvent as it is passed from the supplier
+ * side to the consumer side, in the TypedEventChannel.
+ */
+
+class TAO_CEC_ProxyPushSupplier;
+
+class TAO_Event_Serv_Export TAO_CEC_TypedEvent
+{
+public:
+ /// constructors...
+ TAO_CEC_TypedEvent (void);
+
+ TAO_CEC_TypedEvent (CORBA::NVList_ptr list,
+ const char * operation);
+
+ TAO_CEC_TypedEvent & operator= (const TAO_CEC_TypedEvent &);
+
+private:
+ /// Only the ProxyPushSupplier can read the private fields.
+ friend class TAO_CEC_ProxyPushSupplier;
+
+ CORBA::NVList_ptr list_;
+ CORBA::String_var operation_;
+};
+
+TAO_END_VERSIONED_NAMESPACE_DECL
+
+#if defined (__ACE_INLINE__)
+#include "orbsvcs/CosEvent/CEC_TypedEvent.i"
+#endif /* __ACE_INLINE__ */
+
+#include /**/ "ace/post.h"
+
+#endif /* TAO_CEC_TYPEDEVENT_H_ */
diff --git a/TAO/orbsvcs/orbsvcs/CosEvent/CEC_TypedEvent.i b/TAO/orbsvcs/orbsvcs/CosEvent/CEC_TypedEvent.i
new file mode 100644
index 00000000000..4c8f0aab997
--- /dev/null
+++ b/TAO/orbsvcs/orbsvcs/CosEvent/CEC_TypedEvent.i
@@ -0,0 +1,30 @@
+// -*- C++ -*-
+//
+// $Id$
+
+TAO_BEGIN_VERSIONED_NAMESPACE_DECL
+
+ACE_INLINE
+TAO_CEC_TypedEvent::TAO_CEC_TypedEvent (void)
+{
+}
+
+ACE_INLINE
+TAO_CEC_TypedEvent::TAO_CEC_TypedEvent (CORBA::NVList_ptr list,
+ const char * operation)
+ : list_ (list),
+ operation_ (operation)
+{
+}
+
+ACE_INLINE
+TAO_CEC_TypedEvent&
+TAO_CEC_TypedEvent::operator= (const TAO_CEC_TypedEvent& other)
+{
+ this->list_ = CORBA::NVList::_duplicate (other.list_);
+ this->operation_ = CORBA::string_dup (other.operation_);
+
+ return *this;
+}
+
+TAO_END_VERSIONED_NAMESPACE_DECL
diff --git a/TAO/orbsvcs/orbsvcs/CosEvent/CEC_TypedEventChannel.cpp b/TAO/orbsvcs/orbsvcs/CosEvent/CEC_TypedEventChannel.cpp
new file mode 100644
index 00000000000..f29d1421580
--- /dev/null
+++ b/TAO/orbsvcs/orbsvcs/CosEvent/CEC_TypedEventChannel.cpp
@@ -0,0 +1,597 @@
+// -*- C++ -*-
+//
+// $Id$
+
+#include "orbsvcs/CosEvent/CEC_TypedEventChannel.h"
+#include "orbsvcs/CosEvent/CEC_Dispatching.h"
+#include "orbsvcs/CosEvent/CEC_TypedConsumerAdmin.h"
+#include "orbsvcs/CosEvent/CEC_TypedSupplierAdmin.h"
+#include "orbsvcs/CosEvent/CEC_ConsumerControl.h"
+#include "orbsvcs/CosEvent/CEC_SupplierControl.h"
+#include "tao/debug.h"
+#include "tao/ORB_Core.h"
+#include "ace/Dynamic_Service.h"
+#include "ace/Reactor.h"
+
+#if ! defined (__ACE_INLINE__)
+#include "orbsvcs/CosEvent/CEC_TypedEventChannel.i"
+#endif /* __ACE_INLINE__ */
+
+
+TAO_BEGIN_VERSIONED_NAMESPACE_DECL
+
+// Implementation skeleton constructor
+TAO_CEC_TypedEventChannel::
+TAO_CEC_TypedEventChannel (const TAO_CEC_TypedEventChannel_Attributes& attr,
+ TAO_CEC_Factory* factory,
+ int own_factory)
+ : typed_supplier_poa_ (PortableServer::POA::_duplicate (attr.typed_supplier_poa)),
+ typed_consumer_poa_ (PortableServer::POA::_duplicate (attr.typed_consumer_poa)),
+ orb_ (CORBA::ORB::_duplicate (attr.orb)),
+ interface_repository_ (CORBA::Repository::_duplicate (attr.interface_repository)),
+ factory_ (factory),
+ own_factory_ (own_factory),
+ consumer_reconnect_ (attr.consumer_reconnect),
+ supplier_reconnect_ (attr.supplier_reconnect),
+ disconnect_callbacks_ (attr.disconnect_callbacks),
+ destroy_on_shutdown_ (attr.destroy_on_shutdown),
+ destroyed_ (0)
+{
+ if (this->factory_ == 0)
+ {
+ this->factory_ =
+ ACE_Dynamic_Service<TAO_CEC_Factory>::instance ("CEC_Factory");
+ this->own_factory_ = 0;
+ ACE_ASSERT (this->factory_ != 0);
+ }
+
+ this->dispatching_ =
+ this->factory_->create_dispatching (this);
+ this->typed_consumer_admin_ =
+ this->factory_->create_consumer_admin (this);
+ this->typed_supplier_admin_ =
+ this->factory_->create_supplier_admin (this);
+ this->consumer_control_ =
+ this->factory_->create_consumer_control (this);
+ this->supplier_control_ =
+ this->factory_->create_supplier_control (this);
+}
+
+// Implementation skeleton destructor
+TAO_CEC_TypedEventChannel::~TAO_CEC_TypedEventChannel (void)
+{
+ this->clear_ifr_cache ();
+ this->interface_description_.close ();
+
+ this->factory_->destroy_dispatching (this->dispatching_);
+ this->dispatching_ = 0;
+
+ this->factory_->destroy_consumer_admin (this->typed_consumer_admin_);
+ this->typed_consumer_admin_ = 0;
+ this->factory_->destroy_supplier_admin (this->typed_supplier_admin_);
+ this->typed_supplier_admin_ = 0;
+
+ if (this->own_factory_)
+ delete this->factory_;
+}
+
+void
+TAO_CEC_TypedEventChannel::activate (ACE_ENV_SINGLE_ARG_DECL_NOT_USED)
+{
+ this->dispatching_->activate ();
+ this->consumer_control_->activate ();
+ this->supplier_control_->activate ();
+}
+
+namespace
+{
+ struct ShutdownHandler : ACE_Event_Handler
+ {
+ ShutdownHandler (CORBA::ORB_ptr orb)
+ : orb_ (CORBA::ORB::_duplicate (orb)) {}
+ CORBA::ORB_var orb_;
+
+ virtual int handle_timeout (const ACE_Time_Value&, const void*)
+ {
+ orb_->shutdown (1);
+ return 0;
+ }
+
+ };
+}
+
+void
+TAO_CEC_TypedEventChannel::shutdown (ACE_ENV_SINGLE_ARG_DECL)
+{
+ this->dispatching_->shutdown ();
+ this->supplier_control_->shutdown ();
+ this->consumer_control_->shutdown ();
+
+ PortableServer::POA_var typed_consumer_poa =
+ this->typed_consumer_admin_->_default_POA (ACE_ENV_SINGLE_ARG_PARAMETER);
+ ACE_CHECK;
+ PortableServer::ObjectId_var typed_consumer_id =
+ typed_consumer_poa->servant_to_id (this->typed_consumer_admin_ ACE_ENV_ARG_PARAMETER);
+ ACE_CHECK;
+ typed_consumer_poa->deactivate_object (typed_consumer_id.in () ACE_ENV_ARG_PARAMETER);
+ ACE_CHECK;
+
+ PortableServer::POA_var typed_supplier_poa =
+ this->typed_supplier_admin_->_default_POA (ACE_ENV_SINGLE_ARG_PARAMETER);
+ ACE_CHECK;
+ PortableServer::ObjectId_var typed_supplier_id =
+ typed_supplier_poa->servant_to_id (this->typed_supplier_admin_ ACE_ENV_ARG_PARAMETER);
+ ACE_CHECK;
+ typed_supplier_poa->deactivate_object (typed_supplier_id.in () ACE_ENV_ARG_PARAMETER);
+ ACE_CHECK;
+
+ this->typed_supplier_admin_->shutdown (ACE_ENV_SINGLE_ARG_PARAMETER);
+ ACE_CHECK;
+
+ this->typed_consumer_admin_->shutdown (ACE_ENV_SINGLE_ARG_PARAMETER);
+ ACE_CHECK;
+
+ if (destroy_on_shutdown_)
+ {
+ // Deactivate the Typed EC
+ PortableServer::POA_var t_poa =
+ this->_default_POA (ACE_ENV_SINGLE_ARG_PARAMETER);
+ ACE_CHECK;
+
+ PortableServer::ObjectId_var t_id =
+ t_poa->servant_to_id (this ACE_ENV_ARG_PARAMETER);
+ ACE_CHECK;
+
+ t_poa->deactivate_object (t_id.in () ACE_ENV_ARG_PARAMETER);
+ ACE_CHECK;
+
+ ACE_Event_Handler *timer;
+ ACE_NEW (timer, ShutdownHandler (this->orb_.in ()));
+ ACE_Reactor *reactor = this->orb_->orb_core ()->reactor ();
+ reactor->schedule_timer (timer, 0, ACE_Time_Value (1));
+ }
+}
+
+void
+TAO_CEC_TypedEventChannel::connected (TAO_CEC_TypedProxyPushConsumer* consumer
+ ACE_ENV_ARG_DECL)
+{
+ this->typed_supplier_admin_->connected (consumer ACE_ENV_ARG_PARAMETER);
+ ACE_CHECK;
+}
+
+void
+TAO_CEC_TypedEventChannel::reconnected (TAO_CEC_TypedProxyPushConsumer* consumer
+ ACE_ENV_ARG_DECL)
+{
+ this->typed_supplier_admin_->reconnected (consumer ACE_ENV_ARG_PARAMETER);
+ ACE_CHECK;
+}
+
+void
+TAO_CEC_TypedEventChannel::disconnected (TAO_CEC_TypedProxyPushConsumer* consumer
+ ACE_ENV_ARG_DECL)
+{
+ this->typed_supplier_admin_->disconnected (consumer ACE_ENV_ARG_PARAMETER);
+ ACE_CHECK;
+}
+
+void
+TAO_CEC_TypedEventChannel::connected (TAO_CEC_ProxyPushSupplier* supplier
+ ACE_ENV_ARG_DECL)
+{
+ this->typed_consumer_admin_->connected (supplier ACE_ENV_ARG_PARAMETER);
+ ACE_CHECK;
+}
+
+void
+TAO_CEC_TypedEventChannel::reconnected (TAO_CEC_ProxyPushSupplier* supplier
+ ACE_ENV_ARG_DECL)
+{
+ this->typed_consumer_admin_->reconnected (supplier ACE_ENV_ARG_PARAMETER);
+ ACE_CHECK;
+}
+
+void
+TAO_CEC_TypedEventChannel::disconnected (TAO_CEC_ProxyPushSupplier* supplier
+ ACE_ENV_ARG_DECL)
+{
+ this->typed_consumer_admin_->disconnected (supplier ACE_ENV_ARG_PARAMETER);
+ ACE_CHECK;
+}
+
+// Find from the ifr cache the operation and return the parameter array pointer.
+TAO_CEC_Operation_Params *
+TAO_CEC_TypedEventChannel::find_from_ifr_cache (const char *operation)
+{
+ TAO_CEC_Operation_Params *found = 0;
+
+ this->interface_description_.find (operation, found);
+
+ return found;
+}
+
+// Insert the operation and its parameters into the ifr cache.
+int
+TAO_CEC_TypedEventChannel::insert_into_ifr_cache (const char *operation_,
+ TAO_CEC_Operation_Params *parameters_)
+{
+ // Make sure that the supplied Object reference is valid,
+ // i.e. not nil.
+ if (operation_ == 0 || parameters_ == 0)
+ {
+ errno = EINVAL;
+ return -1;
+ };
+
+ CORBA::String_var operation = CORBA::string_dup (operation_);
+
+ int result = this->interface_description_.bind (operation.in (), parameters_);
+
+ if (result == 0)
+ {
+ // Transfer ownership to the Object InterfaceDescription map.
+ (void) operation._retn ();
+ }
+
+ return result;
+}
+
+// Clear the ifr cache, freeing up all its contents.
+int
+TAO_CEC_TypedEventChannel::clear_ifr_cache (void)
+{
+ for (Iterator i = this->interface_description_.begin ();
+ i != this->interface_description_.end ();
+ ++i)
+ {
+ if (TAO_debug_level >= 10)
+ {
+ ACE_DEBUG ((LM_DEBUG,
+ ACE_TEXT ("***** Destroying operation %s from ifr cache *****\n"),
+ const_cast<char *> ((*i).ext_id_)));
+ }
+
+ // Deallocate the operation
+ CORBA::string_free (const_cast<char *> ((*i).ext_id_));
+
+ // Destroy the parameter
+ delete ((*i).int_id_);
+ }
+
+ int result = this->interface_description_.unbind_all ();
+
+ return result;
+}
+
+
+// The function performs a lookup_id of the passed interface in the IFR,
+// and then obtains the FullInterfaceDescription.
+// The base interfaces for the interface are stored on this class.
+// All the operations and their parameters are then inserted in the ifr cache.
+// Function returns 0 if successful or -1 on a failure.
+int
+TAO_CEC_TypedEventChannel::cache_interface_description (const char *interface_
+ ACE_ENV_ARG_DECL)
+{
+ ACE_TRY
+ {
+ // Lookup the Interface Name in the IFR
+ CORBA::Contained_var contained =
+ this->interface_repository_->lookup_id (interface_ ACE_ENV_ARG_PARAMETER);
+ ACE_TRY_CHECK;
+
+ // Narrow the interface
+ CORBA::InterfaceDef_var interface =
+ CORBA::InterfaceDef::_narrow (contained.in () ACE_ENV_ARG_PARAMETER);
+ ACE_TRY_CHECK;
+
+ if (CORBA::is_nil (interface.in () ))
+ {
+ if (TAO_debug_level >= 10)
+ {
+ ACE_DEBUG ((LM_DEBUG,
+ ACE_TEXT ("***** CORBA::InterfaceDef::_narrow failed for interface %s *****\n"),
+ interface_));
+ }
+ return -1;
+ }
+ else
+ {
+ // Obtain the full interface description
+ CORBA::InterfaceDef::FullInterfaceDescription_var fid =
+ interface->describe_interface (ACE_ENV_SINGLE_ARG_PARAMETER);
+ ACE_TRY_CHECK;
+
+ // Obtain the base interfaces
+ this->base_interfaces_ = fid->base_interfaces;
+ if (TAO_debug_level >= 10)
+ {
+ for (CORBA::ULong base=0; base<fid->base_interfaces.length(); base++)
+ {
+ ACE_DEBUG ((LM_DEBUG,
+ ACE_TEXT ("***** Base interface %s found on interface %s *****\n"),
+ static_cast<char const*>(fid->base_interfaces[base]),
+ interface_ ));
+ }
+ }
+
+ // Obtain the operations
+ for (CORBA::ULong oper=0; oper<fid->operations.length(); oper++)
+ {
+ if (TAO_debug_level >= 10)
+ {
+ ACE_DEBUG ((LM_DEBUG,
+ ACE_TEXT ("***** Operation %s found on interface %s, num params %d *****\n"),
+ fid->operations[oper].name.in(),
+ interface_,
+ fid->operations[oper].parameters.length() ));
+ }
+
+ // Obtain the parameters
+ CORBA::ULong num_params = fid->operations[oper].parameters.length();
+ TAO_CEC_Operation_Params *oper_params = new TAO_CEC_Operation_Params (num_params);
+
+ for (CORBA::ULong param=0; param<num_params; param++)
+ {
+ oper_params->parameters_[param].name_ = fid->operations[oper].parameters[param].name.in();
+ oper_params->parameters_[param].type_ = fid->operations[oper].parameters[param].type;
+ switch (fid->operations[oper].parameters[param].mode)
+ {
+ case CORBA::PARAM_IN:
+ oper_params->parameters_[param].direction_ = CORBA::ARG_IN;
+ break;
+ case CORBA::PARAM_OUT:
+ oper_params->parameters_[param].direction_ = CORBA::ARG_OUT;
+ break;
+ case CORBA::PARAM_INOUT:
+ oper_params->parameters_[param].direction_ = CORBA::ARG_INOUT;
+ break;
+ }
+
+ if (TAO_debug_level >= 10)
+ {
+ ACE_DEBUG ((LM_DEBUG,
+ ACE_TEXT ("***** Parameter %s found on operation %s *****\n"),
+ oper_params->parameters_[param].name_.in(),
+ fid->operations[oper].name.in() ));
+ }
+ }
+
+ if (TAO_debug_level >= 10)
+ {
+ ACE_DEBUG ((LM_DEBUG,
+ ACE_TEXT ("***** Adding operation %s with %d parameters to the IFR cache *****\n"),
+ fid->operations[oper].name.in(),
+ oper_params->num_params_ ));
+ }
+
+ int result = insert_into_ifr_cache (fid->operations[oper].name.in(), oper_params);
+ if (result != 0)
+ {
+ if (TAO_debug_level >= 10)
+ {
+ ACE_DEBUG ((LM_DEBUG,
+ ACE_TEXT ("***** Adding operation to IFR cache failed *****\n")));
+ }
+ }
+ }
+ }
+ }
+ ACE_CATCH (CORBA::SystemException, sysex)
+ {
+ if (TAO_debug_level >= 4)
+ {
+ ACE_PRINT_EXCEPTION (sysex, "during TAO_CEC_TypedEventChannel::cache_interface_description");
+ }
+ return -1;
+ }
+ ACE_CATCHANY
+ {
+ if (TAO_debug_level >= 4)
+ {
+ ACE_PRINT_EXCEPTION (ACE_ANY_EXCEPTION,
+ "ACE_ANY_EXCEPTION raised during TAO_CEC_TypedEventChannel::cache_interface_description");
+ }
+ return -1;
+ }
+ ACE_ENDTRY;
+ return 0;
+}
+
+// A consumer is attempting to register its uses_interface.
+// Note only a single interface can be registered with this version of the EC.
+// For users that require more than one interface, start another EC.
+// If the passed uses_interface is the same as a registered interface the function returns 0.
+// If an attempt is made to register a second interface, this function will return -1
+// and the TypedConsumerAdmin will throw CosTypedEventChannelAdmin::NoSuchImplementation.
+// If neither a consumer nor a supplier has registered an interface,
+// the function calls cache_interface_description and returns 0 if successful.
+int
+TAO_CEC_TypedEventChannel::consumer_register_uses_interace (const char *uses_interface
+ ACE_ENV_ARG_DECL)
+{
+ // Check if a consumer has already registered an interface with the typed EC
+ if (this->uses_interface_.length() > 0)
+ {
+ // Check if the registered uses_interface_ == the new uses_interface
+ if (this->uses_interface_ == ACE_CString (uses_interface))
+ {
+ return 0;
+ }
+ else
+ {
+ if (TAO_debug_level >= 10)
+ {
+ ACE_DEBUG ((LM_DEBUG,
+ ACE_TEXT ("***** different uses_interface_ already registered *****\n")));
+ }
+ return -1;
+ }
+ }
+
+ // Check if a supplier has already registered an inerface with the typed EC
+ if (this->supported_interface_.length() > 0)
+ {
+ // Check if the registered supported_interface_ == the new uses_interface
+ if (this->supported_interface_ == ACE_CString (uses_interface))
+ {
+ this->uses_interface_ = uses_interface;
+ return 0;
+ }
+ else
+ {
+ if (TAO_debug_level >= 10)
+ {
+ ACE_DEBUG ((LM_DEBUG,
+ ACE_TEXT ("***** different supported_interface_ already registered *****\n")));
+ }
+ return -1;
+ }
+ }
+ else
+ {
+ // Neither a consumer nor a supplier has connected yet
+ int result = cache_interface_description (uses_interface ACE_ENV_ARG_PARAMETER);
+ ACE_CHECK_RETURN (-1);
+
+ if (result == 0)
+ {
+ this->uses_interface_ = uses_interface;
+ }
+ return result;
+ }
+}
+
+// A supplier is attempting to register its supported_interface.
+// Note only a single interface can be registered with this version of the EC.
+// For users that require more than one interface, start another EC.
+// If the passed supported_interface is the same as a registered interface the function returns 0.
+// If an attempt is made to register a second interface, this function will return -1
+// and the TypedSupplierAdmin will throw CosTypedEventChannelAdmin::InterfaceNotSupported.
+// If neither a consumer nor a supplier has registered an interface,
+// the function calls cache_interface_description and returns 0 if successful.
+int
+TAO_CEC_TypedEventChannel::supplier_register_supported_interface (const char *supported_interface
+ ACE_ENV_ARG_DECL)
+{
+ // Check if a supplier has already registered an interface with the typed EC
+ if (this->supported_interface_.length() > 0)
+ {
+ // Check if the registered interface == the new supported_interface
+ if (this->supported_interface_ == ACE_CString (supported_interface))
+ {
+ return 0;
+ }
+ else
+ {
+ if (TAO_debug_level >= 10)
+ {
+ ACE_DEBUG ((LM_DEBUG,
+ ACE_TEXT ("***** different supported_interface_ already registered *****\n")));
+ }
+ return -1;
+ }
+ }
+
+ // Check if a consumer has already registered an inerface with the typed EC
+ if (this->uses_interface_.length() > 0)
+ {
+ // Check if the registered uses_interface_ == the new supported_interface
+ if (this->uses_interface_ == ACE_CString (supported_interface))
+ {
+ this->supported_interface_ = supported_interface;
+ return 0;
+ }
+ else
+ {
+ if (TAO_debug_level >= 10)
+ {
+ ACE_DEBUG ((LM_DEBUG,
+ ACE_TEXT ("***** different uses_interface_ already registered *****\n")));
+ }
+ return -1;
+ }
+ }
+ else
+ {
+ // Neither a consumer nor a supplier has connected yet
+ int result = cache_interface_description (supported_interface ACE_ENV_ARG_PARAMETER);
+ ACE_CHECK_RETURN (-1);
+
+ if (result == 0)
+ {
+ this->supported_interface_ = supported_interface;
+ }
+ return result;
+ }
+}
+
+// Function creates a NVList and populates it from the parameter information.
+void
+TAO_CEC_TypedEventChannel::create_operation_list (TAO_CEC_Operation_Params *oper_params,
+ CORBA::NVList_out new_list
+ ACE_ENV_ARG_DECL)
+{
+ this->orb_->create_list (0, new_list ACE_ENV_ARG_PARAMETER);
+ ACE_CHECK;
+
+ for (CORBA::ULong param=0; param<oper_params->num_params_; param++)
+ {
+
+ CORBA::Any any_1;
+ any_1._tao_set_typecode(oper_params->parameters_[param].type_.in ());
+
+ new_list->add_value (oper_params->parameters_[param].name_. in (),
+ any_1,
+ oper_params->parameters_[param].direction_
+ ACE_ENV_ARG_PARAMETER);
+ ACE_CHECK;
+ }
+}
+
+// Function creates an empty NVList.
+void
+TAO_CEC_TypedEventChannel::create_list (CORBA::Long count,
+ CORBA::NVList_out new_list
+ ACE_ENV_ARG_DECL)
+{
+ this->orb_->create_list (count, new_list ACE_ENV_ARG_PARAMETER);
+ ACE_CHECK;
+}
+
+// The CosTypedEventChannelAdmin::TypedEventChannel methods...
+CosTypedEventChannelAdmin::TypedConsumerAdmin_ptr
+TAO_CEC_TypedEventChannel::for_consumers (ACE_ENV_SINGLE_ARG_DECL)
+ ACE_THROW_SPEC ((CORBA::SystemException))
+{
+ return this->typed_consumer_admin_->_this (ACE_ENV_SINGLE_ARG_PARAMETER);
+}
+
+CosTypedEventChannelAdmin::TypedSupplierAdmin_ptr
+TAO_CEC_TypedEventChannel::for_suppliers (ACE_ENV_SINGLE_ARG_DECL)
+ ACE_THROW_SPEC ((CORBA::SystemException))
+{
+ return this->typed_supplier_admin_->_this (ACE_ENV_SINGLE_ARG_PARAMETER);
+}
+
+void
+TAO_CEC_TypedEventChannel::destroy (ACE_ENV_SINGLE_ARG_DECL)
+ ACE_THROW_SPEC ((CORBA::SystemException))
+{
+ if (!destroyed_)
+ {
+ destroyed_ = 1;
+ this->shutdown (ACE_ENV_SINGLE_ARG_PARAMETER);
+ ACE_CHECK;
+ }
+}
+
+CORBA::Policy_ptr
+TAO_CEC_TypedEventChannel::create_roundtrip_timeout_policy
+(const ACE_Time_Value &timeout)
+{
+ return this->factory_->create_roundtrip_timeout_policy (timeout);
+}
+
+TAO_END_VERSIONED_NAMESPACE_DECL
diff --git a/TAO/orbsvcs/orbsvcs/CosEvent/CEC_TypedEventChannel.h b/TAO/orbsvcs/orbsvcs/CosEvent/CEC_TypedEventChannel.h
new file mode 100644
index 00000000000..d41f719f6d4
--- /dev/null
+++ b/TAO/orbsvcs/orbsvcs/CosEvent/CEC_TypedEventChannel.h
@@ -0,0 +1,393 @@
+// -*- C++ -*-
+
+//=============================================================================
+/**
+ * @file CEC_TypedEventChannel.h
+ *
+ * @author Jon Astle (jon@astle45.fsnet.co.uk)
+ *
+ * $Id$
+ *
+ * A new implementation of the COS Typed Event Channel, based on
+ * the untyped version by Carlos O'Ryan (coryan@cs.wustl.edu)
+ *
+ */
+//=============================================================================
+
+#ifndef TAO_CEC_TYPEDEVENTCHANNEL_H_
+#define TAO_CEC_TYPEDEVENTCHANNEL_H_
+#include /**/ "ace/pre.h"
+
+#include "orbsvcs/CosEvent/event_serv_export.h"
+
+#if !defined (ACE_LACKS_PRAGMA_ONCE)
+#pragma once
+#endif /* ACE_LACKS_PRAGMA_ONCE */
+
+#include "orbsvcs/CosEvent/CEC_Defaults.h"
+
+#include "orbsvcs/CosTypedEventChannelAdminS.h"
+
+#include "orbsvcs/CosEvent/CEC_Factory.h"
+
+#include "tao/IFR_Client/IFR_BasicC.h"
+#include "tao/AnyTypeCode/NVList.h"
+
+#include "ace/Hash_Map_Manager.h"
+#include "ace/Null_Mutex.h"
+#include "ace/SString.h"
+
+TAO_BEGIN_VERSIONED_NAMESPACE_DECL
+
+/**
+ * @class TAO_CEC_TypedEventChannel_Attributes
+ *
+ * @brief Defines the construction time attributes for the Typed
+ * Event Channel.
+ *
+ * The typed event channel implementation is controlled by
+ * two mechanisms:
+ * The CEC_Factory that provides the strategies for the EC
+ * implementation.
+ * The EC attributes that define constants and values required
+ * by the EC construction.
+ * This class encapsulates those constants and values, providing
+ * an easy mechanism to extend the attributes without requiring
+ * changes in the EC constructor.
+ */
+class TAO_Event_Serv_Export TAO_CEC_TypedEventChannel_Attributes
+{
+public:
+ /**
+ * The basic constructor.
+ * The attributes listed as arguments are *required* by the EC, and
+ * no appropiate defaults are available for them.
+ */
+ TAO_CEC_TypedEventChannel_Attributes (PortableServer::POA_ptr typed_supplier_poa,
+ PortableServer::POA_ptr typed_consumer_poa,
+ CORBA::ORB_ptr orb,
+ CORBA::Repository_ptr interface_repository);
+
+ // Most fields are public, there is no need to protect them, in fact
+ // the user should be able to set any values she wants.
+
+ /// Can consumers or suppliers invoke connect_push_* multiple times?
+ int consumer_reconnect;
+ int supplier_reconnect;
+
+ /**
+ * It not zero the event channel will send disconnect callbacks when
+ * a disconnect method is called on a Proxy. In other words, if a
+ * consumer calls disconnect_push_supplier() on its proxy the EC
+ * will invoke disconnect_push_consumer() on the consumer. A
+ * similar thing is done for suppliers.
+ * It is a matter of debate what the spec requires for the regular
+ * event service.
+ */
+ int disconnect_callbacks;
+
+ /**
+ * If not zero the event channel will deactive its Impl and call
+ * orb->shutdown(0), when destoy is invoked.
+ */
+ int destroy_on_shutdown;
+
+private:
+ /// Only the EC can read the private fields.
+ friend class TAO_CEC_TypedEventChannel;
+
+ /// The POAs
+ PortableServer::POA_ptr typed_supplier_poa;
+ PortableServer::POA_ptr typed_consumer_poa;
+
+ /// The ORB
+ CORBA::ORB_ptr orb;
+
+ /// The Interface Repository
+ CORBA::Repository_ptr interface_repository;
+};
+
+class TAO_CEC_Operation_Params;
+
+//Class TAO_CEC_TypedEventChannel
+class TAO_Event_Serv_Export TAO_CEC_TypedEventChannel : public virtual POA_CosTypedEventChannelAdmin::TypedEventChannel
+{
+public:
+ class ServantBaseHash
+ {
+ public:
+ u_long operator() (PortableServer::ServantBase* const & ptr) const {
+ return reinterpret_cast<u_long> (ptr);
+ }
+ };
+
+ typedef ACE_Hash_Map_Manager_Ex<PortableServer::ServantBase*,
+ unsigned int,
+ ServantBaseHash,
+ ACE_Equal_To<PortableServer::ServantBase*>,
+ TAO_SYNCH_MUTEX> ServantRetryMap;
+
+ /**
+ * Constructor
+ * If <own_factory> is not 0 it assumes ownership of the factory.
+ * If the factory is <nil> it uses the Service_Configurator to load
+ * the Factory, if not found it uses TAO_CEC_Default_Resource_Factory
+ */
+ TAO_CEC_TypedEventChannel (const TAO_CEC_TypedEventChannel_Attributes& attributes,
+ TAO_CEC_Factory* factory = 0,
+ int own_factory = 0);
+
+ /// Destructor
+ virtual ~TAO_CEC_TypedEventChannel (void);
+
+ /// Start the internal threads (if any), etc.
+ /// After this call the EC can be used.
+ virtual void activate (ACE_ENV_SINGLE_ARG_DECL_WITH_DEFAULTS);
+
+ /// Shutdown any internal threads, cleanup all the internal
+ /// structures, flush all the messages, etc.
+ virtual void shutdown (ACE_ENV_SINGLE_ARG_DECL_WITH_DEFAULTS);
+
+ /// Access the dispatching module....
+ TAO_CEC_Dispatching* dispatching (void) const;
+
+ /// Access the consumer admin implementation.
+ TAO_CEC_TypedConsumerAdmin* typed_consumer_admin (void) const;
+
+ /// Access the supplier admin implementation.
+ TAO_CEC_TypedSupplierAdmin* typed_supplier_admin (void) const;
+
+ /// Access the consumer control strategy.
+ TAO_CEC_ConsumerControl* consumer_control (void) const;
+
+ /// Access the supplier control strategy.
+ TAO_CEC_SupplierControl* supplier_control (void) const;
+
+ // = The factory methods, they delegate on the CEC_Factory.
+ /// Create and destroy a ProxyPushSupplier
+ void create_proxy (TAO_CEC_ProxyPushSupplier*&);
+ void destroy_proxy (TAO_CEC_ProxyPushSupplier*);
+
+ /// Create and destroy a TypedProxyPushConsumer
+ void create_proxy (TAO_CEC_TypedProxyPushConsumer*&);
+ void destroy_proxy (TAO_CEC_TypedProxyPushConsumer*);
+
+ /// Create and destroy a the collections used to store
+ /// Proxy*Suppliers
+ void create_proxy_collection (TAO_CEC_ProxyPushSupplier_Collection*&);
+ void destroy_proxy_collection (TAO_CEC_ProxyPushSupplier_Collection*);
+
+ /// Create and destroy a the collections used to store
+ /// Proxy*Consumers
+ void create_proxy_collection (TAO_CEC_TypedProxyPushConsumer_Collection*&);
+ void destroy_proxy_collection (TAO_CEC_TypedProxyPushConsumer_Collection*);
+
+ /// Access the supplier and consumer POAs from the factory.
+ PortableServer::POA_ptr typed_supplier_poa (void);
+ PortableServer::POA_ptr typed_consumer_poa (void);
+
+ /// Locking strategies for the ProxyPushConsumer and
+ /// ProxyPushSupplier objects
+ ACE_Lock* create_consumer_lock (void);
+ void destroy_consumer_lock (ACE_Lock*);
+ ACE_Lock* create_supplier_lock (void);
+ void destroy_supplier_lock (ACE_Lock*);
+
+ /// Used to inform the EC that a Consumer has connected or
+ /// disconnected from it.
+ virtual void connected (TAO_CEC_TypedProxyPushConsumer*
+ ACE_ENV_ARG_DECL_NOT_USED);
+ virtual void reconnected (TAO_CEC_TypedProxyPushConsumer*
+ ACE_ENV_ARG_DECL_NOT_USED);
+ virtual void disconnected (TAO_CEC_TypedProxyPushConsumer*
+ ACE_ENV_ARG_DECL_NOT_USED);
+
+ /// Used to inform the EC that a Supplier has connected or
+ /// disconnected from it.
+ virtual void connected (TAO_CEC_ProxyPushSupplier*
+ ACE_ENV_ARG_DECL_NOT_USED);
+ virtual void reconnected (TAO_CEC_ProxyPushSupplier*
+ ACE_ENV_ARG_DECL_NOT_USED);
+ virtual void disconnected (TAO_CEC_ProxyPushSupplier*
+ ACE_ENV_ARG_DECL_NOT_USED);
+
+ /// Can the consumers reconnect to the EC?
+ int consumer_reconnect (void) const;
+
+ /// Can the suppliers reconnect to the EC?
+ int supplier_reconnect (void) const;
+
+ /// Should we send callback disconnect messages when a proxy is
+ /// disconnected by the client
+ int disconnect_callbacks (void) const;
+
+ // Hash map which will operate as a IFR cache for the Supported Interface's operations and parameters
+ typedef ACE_Hash_Map_Manager_Ex<const char *, TAO_CEC_Operation_Params *, ACE_Hash<const char *>, ACE_Equal_To<const char *>, ACE_Null_Mutex> InterfaceDescription;
+ typedef InterfaceDescription::iterator Iterator;
+
+ /// Finds a operation/parameter from the IFR cache
+ TAO_CEC_Operation_Params * find_from_ifr_cache (const char *operation);
+
+ /// Function allows consumer admin to register the uses interface
+ int consumer_register_uses_interace (const char *uses_interface ACE_ENV_ARG_DECL);
+
+ /// Function allows supplier admin to register the supported interface
+ int supplier_register_supported_interface (const char *supported_interface ACE_ENV_ARG_DECL);
+
+ /// Function to return the supported_interface_
+ const char * supported_interface (void) const;
+
+ /// Function to return the base_interfaces_
+ CORBA::RepositoryId base_interfaces (CORBA::ULong index) const;
+
+ /// Function to return the number of base_interfaces_
+ CORBA::ULong number_of_base_interfaces (void) const;
+
+ /// Function populates the NVList from the provide param information
+ virtual void create_operation_list (TAO_CEC_Operation_Params *oper_params,
+ CORBA::NVList_out new_list
+ ACE_ENV_ARG_DECL);
+
+ /// Function creates an empty NVList
+ virtual void create_list (CORBA::Long count,
+ CORBA::NVList_out new_list
+ ACE_ENV_ARG_DECL);
+
+ // = The CosTypedEventChannelAdmin::TypedEventChannel methods...
+ virtual ::CosTypedEventChannelAdmin::TypedConsumerAdmin_ptr
+ for_consumers (ACE_ENV_SINGLE_ARG_DECL)
+ ACE_THROW_SPEC ((CORBA::SystemException));
+
+ virtual ::CosTypedEventChannelAdmin::TypedSupplierAdmin_ptr
+ for_suppliers (ACE_ENV_SINGLE_ARG_DECL)
+ ACE_THROW_SPEC ((CORBA::SystemException));
+
+ virtual void destroy (ACE_ENV_SINGLE_ARG_DECL)
+ ACE_THROW_SPEC ((CORBA::SystemException));
+
+ ServantRetryMap& get_servant_retry_map (void);
+
+ /// Forwarded to the factory
+ CORBA::Policy_ptr
+ create_roundtrip_timeout_policy (const ACE_Time_Value &timeout);
+
+protected:
+ /// Function caches the full interface description from the IFR
+ int cache_interface_description (const char *interface ACE_ENV_ARG_DECL);
+
+ /// Insert a operation/parameter into the IFR cache
+ int insert_into_ifr_cache (const char *operation, TAO_CEC_Operation_Params *parameters);
+
+ /// Function clears the IFR cache
+ int clear_ifr_cache (void);
+
+private:
+ /// The POAs used to activate "supplier-side" and "consumer-side"
+ /// objects.
+ PortableServer::POA_var typed_supplier_poa_;
+ PortableServer::POA_var typed_consumer_poa_;
+
+ /// The ORB
+ CORBA::ORB_var orb_;
+
+ /// Storage of the IFR reference
+ CORBA::Repository_var interface_repository_;
+
+ /**
+ * This is the abstract factory that creates all the objects that
+ * compose an event channel, the event channel simply acts as a
+ * Mediator among them.
+ */
+ TAO_CEC_Factory *factory_;
+
+ /// Flag that indicates if we own the factory.
+ int own_factory_;
+
+ /// The dispatching "module"
+ TAO_CEC_Dispatching *dispatching_;
+
+ /// The ConsumerAdmin implementation
+ TAO_CEC_TypedConsumerAdmin *typed_consumer_admin_;
+
+ /// The SupplierAdmin implementation
+ TAO_CEC_TypedSupplierAdmin *typed_supplier_admin_;
+
+ /// Consumer reconnection flags
+ int consumer_reconnect_;
+
+ /// Supplier reconnection flags
+ int supplier_reconnect_;
+
+ /// If not zero we send callbacks when a proxy is disconnected
+ int disconnect_callbacks_;
+
+ /// If not zero the event channel is destroyed on shutdown
+ int destroy_on_shutdown_;
+
+ /// Set if the event channel has been destroyed
+ int destroyed_;
+
+ /// Strategies to disconnect misbehaving or destroyed consumers and
+ /// suppliers
+ TAO_CEC_ConsumerControl *consumer_control_;
+ ServantRetryMap retry_map_;
+
+ TAO_CEC_SupplierControl *supplier_control_;
+
+ /// The uses_interface_ for the TypedConsumerAdmin.
+ ACE_CString uses_interface_;
+
+ /// The supported_interface_ for the TypedSupplierAdmin.
+ ACE_CString supported_interface_;
+
+ /// The IFR cache for the interface description
+ InterfaceDescription interface_description_;
+
+ /// The supported_interface_ base interfaces
+ CORBA::RepositoryIdSeq base_interfaces_;
+};
+
+
+class TAO_Event_Serv_Export TAO_CEC_Param
+{
+public:
+ /// Constructor
+ TAO_CEC_Param (void);
+
+ /// Destructor
+ ~TAO_CEC_Param (void);
+
+private:
+ /// Only the TypedEventChannel can read the private fields.
+ friend class TAO_CEC_TypedEventChannel;
+
+ CORBA::String_var name_;
+ CORBA::TypeCode_var type_;
+ CORBA::Flags direction_;
+};
+
+
+class TAO_Event_Serv_Export TAO_CEC_Operation_Params
+{
+ /// constructor
+ TAO_CEC_Operation_Params (CORBA::ULong num_params);
+ /// destructor
+ ~TAO_CEC_Operation_Params (void);
+
+private:
+ /// Only the TypedEventChannel can read the private fields.
+ friend class TAO_CEC_TypedEventChannel;
+
+ CORBA::ULong num_params_;
+ TAO_CEC_Param * parameters_;
+};
+
+TAO_END_VERSIONED_NAMESPACE_DECL
+
+#if defined (__ACE_INLINE__)
+#include "orbsvcs/CosEvent/CEC_TypedEventChannel.i"
+#endif /* __ACE_INLINE__ */
+
+#include /**/ "ace/post.h"
+
+#endif /* TAO_CEC_TYPEDEVENTCHANNEL_H_ */
diff --git a/TAO/orbsvcs/orbsvcs/CosEvent/CEC_TypedEventChannel.i b/TAO/orbsvcs/orbsvcs/CosEvent/CEC_TypedEventChannel.i
new file mode 100644
index 00000000000..ec52c543383
--- /dev/null
+++ b/TAO/orbsvcs/orbsvcs/CosEvent/CEC_TypedEventChannel.i
@@ -0,0 +1,205 @@
+// -*- C++ -*-
+//
+// $Id$
+
+TAO_BEGIN_VERSIONED_NAMESPACE_DECL
+
+ACE_INLINE
+TAO_CEC_TypedEventChannel_Attributes::
+TAO_CEC_TypedEventChannel_Attributes (PortableServer::POA_ptr s_poa,
+ PortableServer::POA_ptr c_poa,
+ CORBA::ORB_ptr _orb,
+ CORBA::Repository_ptr _interface_repository)
+ : consumer_reconnect (TAO_CEC_DEFAULT_CONSUMER_RECONNECT),
+ supplier_reconnect (TAO_CEC_DEFAULT_SUPPLIER_RECONNECT),
+ disconnect_callbacks (TAO_CEC_DEFAULT_DISCONNECT_CALLBACKS),
+ destroy_on_shutdown (0),
+ //busy_hwm (TAO_CEC_DEFAULT_BUSY_HWM),
+ //max_write_delay (TAO_CEC_DEFAULT_MAX_WRITE_DELAY),
+ typed_supplier_poa (s_poa),
+ typed_consumer_poa (c_poa),
+ orb (_orb),
+ interface_repository (_interface_repository)
+{
+}
+
+ACE_INLINE TAO_CEC_Dispatching*
+TAO_CEC_TypedEventChannel::dispatching (void) const
+{
+ return this->dispatching_;
+}
+
+ACE_INLINE TAO_CEC_TypedConsumerAdmin*
+TAO_CEC_TypedEventChannel::typed_consumer_admin (void) const
+{
+ return this->typed_consumer_admin_;
+}
+
+ACE_INLINE TAO_CEC_TypedSupplierAdmin*
+TAO_CEC_TypedEventChannel::typed_supplier_admin (void) const
+{
+ return this->typed_supplier_admin_;
+}
+
+ACE_INLINE TAO_CEC_ConsumerControl*
+TAO_CEC_TypedEventChannel::consumer_control (void) const
+{
+ return this->consumer_control_;
+}
+
+ACE_INLINE TAO_CEC_SupplierControl*
+TAO_CEC_TypedEventChannel::supplier_control (void) const
+{
+ return this->supplier_control_;
+}
+
+ACE_INLINE void
+TAO_CEC_TypedEventChannel::create_proxy (TAO_CEC_ProxyPushSupplier* &x)
+{
+ x = this->factory_->create_proxy_push_supplier (this);
+}
+
+ACE_INLINE void
+TAO_CEC_TypedEventChannel::destroy_proxy (TAO_CEC_ProxyPushSupplier* supplier)
+{
+ this->factory_->destroy_proxy_push_supplier (supplier);
+}
+
+ACE_INLINE void
+TAO_CEC_TypedEventChannel::create_proxy (TAO_CEC_TypedProxyPushConsumer* &x)
+{
+ x = this->factory_->create_proxy_push_consumer (this);
+}
+
+ACE_INLINE void
+TAO_CEC_TypedEventChannel::destroy_proxy (TAO_CEC_TypedProxyPushConsumer* consumer)
+{
+ this->factory_->destroy_proxy_push_consumer (consumer);
+}
+
+ACE_INLINE void
+TAO_CEC_TypedEventChannel::create_proxy_collection (TAO_CEC_ProxyPushSupplier_Collection* &x)
+{
+ x = this->factory_->create_proxy_push_supplier_collection (this);
+}
+
+ACE_INLINE void
+TAO_CEC_TypedEventChannel::destroy_proxy_collection (TAO_CEC_ProxyPushSupplier_Collection* x)
+{
+ this->factory_->destroy_proxy_push_supplier_collection (x);
+}
+
+ACE_INLINE void
+TAO_CEC_TypedEventChannel::create_proxy_collection (TAO_CEC_TypedProxyPushConsumer_Collection* &x)
+{
+ x = this->factory_->create_proxy_push_consumer_collection (this);
+}
+
+ACE_INLINE void
+TAO_CEC_TypedEventChannel::destroy_proxy_collection (TAO_CEC_TypedProxyPushConsumer_Collection* x)
+{
+ this->factory_->destroy_proxy_push_consumer_collection (x);
+}
+
+ACE_INLINE PortableServer::POA_ptr
+TAO_CEC_TypedEventChannel::typed_supplier_poa (void)
+{
+ return PortableServer::POA::_duplicate (this->typed_supplier_poa_.in ());
+}
+
+ACE_INLINE PortableServer::POA_ptr
+TAO_CEC_TypedEventChannel::typed_consumer_poa (void)
+{
+ return PortableServer::POA::_duplicate (this->typed_consumer_poa_.in ());
+}
+
+ACE_INLINE ACE_Lock*
+TAO_CEC_TypedEventChannel::create_consumer_lock (void)
+{
+ return this->factory_->create_consumer_lock ();
+}
+
+ACE_INLINE void
+TAO_CEC_TypedEventChannel::destroy_consumer_lock (ACE_Lock* x)
+{
+ this->factory_->destroy_consumer_lock (x);
+}
+
+ACE_INLINE ACE_Lock*
+TAO_CEC_TypedEventChannel::create_supplier_lock (void)
+{
+ return this->factory_->create_supplier_lock ();
+}
+
+ACE_INLINE void
+TAO_CEC_TypedEventChannel::destroy_supplier_lock (ACE_Lock* x)
+{
+ this->factory_->destroy_supplier_lock (x);
+}
+
+ACE_INLINE int
+TAO_CEC_TypedEventChannel::consumer_reconnect (void) const
+{
+ return this->consumer_reconnect_;
+}
+
+ACE_INLINE int
+TAO_CEC_TypedEventChannel::supplier_reconnect (void) const
+{
+ return this->supplier_reconnect_;
+}
+
+ACE_INLINE int
+TAO_CEC_TypedEventChannel::disconnect_callbacks (void) const
+{
+ return this->disconnect_callbacks_;
+}
+
+ACE_INLINE const char *
+TAO_CEC_TypedEventChannel::supported_interface (void) const
+{
+ return this->supported_interface_.c_str ();
+}
+
+ACE_INLINE CORBA::RepositoryId
+TAO_CEC_TypedEventChannel::base_interfaces (CORBA::ULong index) const
+{
+ return const_cast <CORBA::RepositoryId>(this->base_interfaces_[index]);
+}
+
+ACE_INLINE CORBA::ULong
+TAO_CEC_TypedEventChannel::number_of_base_interfaces (void) const
+{
+ return this->base_interfaces_.length ();
+}
+
+ACE_INLINE TAO_CEC_TypedEventChannel::ServantRetryMap&
+TAO_CEC_TypedEventChannel::get_servant_retry_map (void)
+{
+ return this->retry_map_;
+}
+
+ACE_INLINE
+TAO_CEC_Param::TAO_CEC_Param (void)
+{
+}
+
+ACE_INLINE
+TAO_CEC_Param::~TAO_CEC_Param (void)
+{
+}
+
+ACE_INLINE
+TAO_CEC_Operation_Params::TAO_CEC_Operation_Params (CORBA::ULong num_params)
+ : num_params_ (num_params)
+{
+ parameters_ = new TAO_CEC_Param[num_params];
+}
+
+ACE_INLINE
+TAO_CEC_Operation_Params::~TAO_CEC_Operation_Params (void)
+{
+ delete [] parameters_;
+}
+
+TAO_END_VERSIONED_NAMESPACE_DECL
diff --git a/TAO/orbsvcs/orbsvcs/CosEvent/CEC_TypedProxyPushConsumer.cpp b/TAO/orbsvcs/orbsvcs/CosEvent/CEC_TypedProxyPushConsumer.cpp
new file mode 100644
index 00000000000..cdb9787b230
--- /dev/null
+++ b/TAO/orbsvcs/orbsvcs/CosEvent/CEC_TypedProxyPushConsumer.cpp
@@ -0,0 +1,450 @@
+// -*- C++ -*-
+//
+// $Id$
+
+#include "orbsvcs/CosEvent/CEC_TypedProxyPushConsumer.h"
+#include "orbsvcs/CosEvent/CEC_TypedEventChannel.h"
+#include "orbsvcs/CosEvent/CEC_TypedConsumerAdmin.h"
+#include "orbsvcs/CosEvent/CEC_DynamicImplementation.h"
+#include "tao/debug.h"
+
+#if ! defined (__ACE_INLINE__)
+#include "orbsvcs/CosEvent/CEC_TypedProxyPushConsumer.i"
+#endif /* __ACE_INLINE__ */
+
+#include "ace/Reverse_Lock_T.h"
+
+TAO_BEGIN_VERSIONED_NAMESPACE_DECL
+
+typedef ACE_Reverse_Lock<ACE_Lock> TAO_CEC_Unlock;
+
+// Implementation skeleton constructor
+TAO_CEC_TypedProxyPushConsumer::TAO_CEC_TypedProxyPushConsumer
+(TAO_CEC_TypedEventChannel* ec, const ACE_Time_Value &timeout)
+ : typed_event_channel_ (ec),
+ timeout_ (timeout),
+ refcount_ (1),
+ connected_ (0)
+{
+ this->lock_ =
+ this->typed_event_channel_->create_consumer_lock ();
+
+ this->default_POA_ =
+ this->typed_event_channel_->typed_consumer_poa ();
+
+ this->typed_event_channel_->get_servant_retry_map ().bind (this, 0);
+
+ // DSI initialization
+ if (TAO_debug_level >= 10)
+ {
+ ACE_DEBUG ((LM_DEBUG,
+ ACE_TEXT ("***** Initializing the DSI for the new TypedProxyPushConsumer *****\n")));
+ }
+
+ this->dsi_impl_ = new
+ TAO_CEC_DynamicImplementationServer (this->default_POA_.in(),
+ this,
+ this->typed_event_channel_);
+
+ ACE_TRY_NEW_ENV {
+ // tempporary fix, should put this into some init function.
+
+ this->oid_ =
+ this->default_POA_->activate_object (this->dsi_impl_
+ ACE_ENV_ARG_PARAMETER);
+ ACE_TRY_CHECK;
+ }
+ ACE_CATCHALL {
+ }
+ ACE_ENDTRY;
+}
+
+// Implementation skeleton destructor
+TAO_CEC_TypedProxyPushConsumer::~TAO_CEC_TypedProxyPushConsumer (void)
+{
+ ACE_TRY_NEW_ENV {
+ this->default_POA_->deactivate_object (this->oid_.in ()
+ ACE_ENV_ARG_PARAMETER);
+ ACE_TRY_CHECK;
+ }
+ ACE_CATCHALL {
+ }
+ ACE_ENDTRY;
+
+ delete dsi_impl_;
+
+ this->typed_event_channel_->get_servant_retry_map ().unbind (this);
+ this->typed_event_channel_->destroy_consumer_lock (this->lock_);
+}
+
+void
+TAO_CEC_TypedProxyPushConsumer::activate (
+ CosTypedEventChannelAdmin::TypedProxyPushConsumer_ptr &activated_proxy
+ ACE_ENV_ARG_DECL)
+ ACE_THROW_SPEC ((CORBA::SystemException))
+{
+ CosTypedEventChannelAdmin::TypedProxyPushConsumer_var result;
+ ACE_TRY
+ {
+ result = this->_this (ACE_ENV_SINGLE_ARG_PARAMETER);
+ ACE_TRY_CHECK;
+ }
+ ACE_CATCHANY
+ {
+ result = CosTypedEventChannelAdmin::TypedProxyPushConsumer::_nil ();
+ }
+ ACE_ENDTRY;
+ activated_proxy = result._retn ();
+}
+
+void
+TAO_CEC_TypedProxyPushConsumer::deactivate (ACE_ENV_SINGLE_ARG_DECL)
+ ACE_THROW_SPEC ((CORBA::SystemException))
+{
+ ACE_TRY
+ {
+ PortableServer::POA_var poa =
+ this->_default_POA (ACE_ENV_SINGLE_ARG_PARAMETER);
+ ACE_TRY_CHECK;
+ PortableServer::ObjectId_var id =
+ poa->servant_to_id (this ACE_ENV_ARG_PARAMETER);
+ ACE_TRY_CHECK;
+ poa->deactivate_object (id.in () ACE_ENV_ARG_PARAMETER);
+ ACE_TRY_CHECK;
+ }
+ ACE_CATCHANY
+ {
+ // Exceptions here should not be propagated. They usually
+ // indicate that an object is beign disconnected twice, or some
+ // race condition, but not a fault that the user needs to know
+ // about.
+ }
+ ACE_ENDTRY;
+}
+
+CORBA::Boolean
+TAO_CEC_TypedProxyPushConsumer::supplier_non_existent (
+ CORBA::Boolean_out disconnected
+ ACE_ENV_ARG_DECL)
+{
+ CORBA::Object_var supplier;
+ {
+ ACE_GUARD_THROW_EX (
+ ACE_Lock, ace_mon, *this->lock_,
+ CORBA::INTERNAL ());
+ ACE_CHECK_RETURN (0);
+
+ disconnected = 0;
+ if (this->is_connected_i () == 0)
+ {
+ disconnected = 1;
+ return 0;
+ }
+ if (CORBA::is_nil (this->nopolicy_typed_supplier_.in ()))
+ {
+ return 0;
+ }
+ supplier = CORBA::Object::_duplicate
+ (this->nopolicy_typed_supplier_.in ());
+ }
+
+#if (TAO_HAS_MINIMUM_CORBA == 0)
+ return supplier->_non_existent (ACE_ENV_SINGLE_ARG_PARAMETER);
+#else
+ return 0;
+#endif /* TAO_HAS_MINIMUM_CORBA */
+}
+
+void
+TAO_CEC_TypedProxyPushConsumer::shutdown (ACE_ENV_SINGLE_ARG_DECL)
+{
+ CosEventComm::PushSupplier_var supplier;
+
+ {
+ ACE_GUARD_THROW_EX (
+ ACE_Lock, ace_mon, *this->lock_,
+ CORBA::INTERNAL ());
+ // @@ CosEventChannelAdmin::EventChannel::SYNCHRONIZATION_ERROR ());
+ ACE_CHECK;
+
+ supplier = this->typed_supplier_._retn ();
+ this->connected_ = 0;
+ }
+
+ this->deactivate (ACE_ENV_SINGLE_ARG_PARAMETER);
+ ACE_CHECK;
+
+ if (CORBA::is_nil (supplier.in ()))
+ return;
+
+ ACE_TRY
+ {
+ supplier->disconnect_push_supplier (ACE_ENV_SINGLE_ARG_PARAMETER);
+ ACE_TRY_CHECK;
+ }
+ ACE_CATCHANY
+ {
+ // Ignore exceptions, we must isolate other clients from
+ // failures on this one.
+ }
+ ACE_ENDTRY;
+}
+
+void
+TAO_CEC_TypedProxyPushConsumer::cleanup_i (void)
+{
+ this->typed_supplier_ =
+ CosEventComm::PushSupplier::_nil ();
+ this->connected_ = 0;
+}
+
+CORBA::ULong
+TAO_CEC_TypedProxyPushConsumer::_incr_refcnt (void)
+{
+ ACE_GUARD_RETURN (ACE_Lock, ace_mon, *this->lock_, 0);
+ return this->refcount_++;
+}
+
+CORBA::ULong
+TAO_CEC_TypedProxyPushConsumer::_decr_refcnt (void)
+{
+ {
+ ACE_GUARD_RETURN (ACE_Lock, ace_mon, *this->lock_, 0);
+ this->refcount_--;
+ if (this->refcount_ != 0)
+ return this->refcount_;
+ }
+
+ // Notify the event channel
+ this->typed_event_channel_->destroy_proxy (this);
+ return 0;
+}
+
+void
+TAO_CEC_TypedProxyPushConsumer::connect_push_supplier (
+ CosEventComm::PushSupplier_ptr push_supplier
+ ACE_ENV_ARG_DECL)
+ ACE_THROW_SPEC ((CORBA::SystemException,
+ CosEventChannelAdmin::AlreadyConnected))
+{
+ {
+ ACE_GUARD_THROW_EX (
+ ACE_Lock, ace_mon, *this->lock_,
+ CORBA::INTERNAL ());
+ // @@ CosEventChannelAdmin::EventChannel::SYNCHRONIZATION_ERROR ());
+ ACE_CHECK;
+
+ if (this->is_connected_i ())
+ {
+ if (this->typed_event_channel_->supplier_reconnect () == 0)
+ ACE_THROW (CosEventChannelAdmin::AlreadyConnected ());
+
+ // Re-connections are allowed, go ahead and disconnect the
+ // consumer...
+ this->cleanup_i ();
+
+ // @@ Please read the comments in CEC_ProxyPushSupplier about
+ // possible race conditions in this area...
+ TAO_CEC_Unlock reverse_lock (*this->lock_);
+
+ {
+ ACE_GUARD_THROW_EX (
+ TAO_CEC_Unlock, ace_mon, reverse_lock,
+ CORBA::INTERNAL ());
+ // @@ CosEventChannelAdmin::EventChannel::SYNCHRONIZATION_ERROR ());
+ ACE_CHECK;
+
+ this->typed_event_channel_->disconnected (this ACE_ENV_ARG_PARAMETER);
+ ACE_CHECK;
+ }
+
+ // What if a second thread connected us after this?
+ if (this->is_connected_i ())
+ return;
+ }
+ this->typed_supplier_ = apply_policy (push_supplier);
+ this->connected_ = 1;
+ }
+
+ // Notify the event channel...
+ this->typed_event_channel_->connected (this ACE_ENV_ARG_PARAMETER);
+}
+
+CosEventComm::PushSupplier_ptr
+TAO_CEC_TypedProxyPushConsumer::apply_policy
+ (CosEventComm::PushSupplier_ptr pre)
+{
+ if (CORBA::is_nil(pre)) return pre;
+ this->nopolicy_typed_supplier_ =
+ CosEventComm::PushSupplier::_duplicate (pre);
+ CosEventComm::PushSupplier_var post =
+ CosEventComm::PushSupplier::_duplicate (pre);
+ if (this->timeout_ > ACE_Time_Value::zero)
+ {
+ CORBA::PolicyList policy_list;
+ policy_list.length (1);
+ policy_list[0] = this->typed_event_channel_->
+ create_roundtrip_timeout_policy (this->timeout_);
+
+ CORBA::Object_var post_obj = pre->_set_policy_overrides
+ (policy_list, CORBA::ADD_OVERRIDE);
+ post = CosEventComm::PushSupplier::_narrow(post_obj.in ());
+
+ policy_list[0]->destroy ();
+ policy_list.length (0);
+ }
+ return post._retn ();
+}
+
+void
+TAO_CEC_TypedProxyPushConsumer::push (const CORBA::Any& /* event */
+ ACE_ENV_ARG_DECL)
+ ACE_THROW_SPEC ((CORBA::SystemException))
+{
+ ACE_THROW (CORBA::NO_IMPLEMENT ());
+}
+
+void
+TAO_CEC_TypedProxyPushConsumer::disconnect_push_consumer (
+ ACE_ENV_SINGLE_ARG_DECL)
+ ACE_THROW_SPEC ((CORBA::SystemException))
+{
+ CosEventComm::PushSupplier_var supplier;
+
+ {
+ ACE_GUARD_THROW_EX (
+ ACE_Lock, ace_mon, *this->lock_,
+ CORBA::INTERNAL ());
+ // @@ CosEventChannelAdmin::EventChannel::SYNCHRONIZATION_ERROR ());
+ ACE_CHECK;
+
+ if (this->is_connected_i () == 0)
+ ACE_THROW (CORBA::BAD_INV_ORDER ()); // @@ add user exception?
+
+ supplier = this->typed_supplier_._retn ();
+
+ this->cleanup_i ();
+ }
+
+ // Notify the event channel...
+ this->typed_event_channel_->disconnected (this ACE_ENV_ARG_PARAMETER);
+ ACE_CHECK;
+
+ if (!CORBA::is_nil (supplier.in ()))
+ {
+ if (this->typed_event_channel_->disconnect_callbacks ())
+ {
+ ACE_TRY
+ {
+ supplier->disconnect_push_supplier (ACE_ENV_SINGLE_ARG_PARAMETER);
+ ACE_TRY_CHECK;
+ }
+ ACE_CATCHANY
+ {
+ // Ignore exceptions, we must isolate other clients from
+ // failures on this one.
+ }
+ ACE_ENDTRY;
+ }
+ }
+}
+
+PortableServer::POA_ptr
+TAO_CEC_TypedProxyPushConsumer::_default_POA (ACE_ENV_SINGLE_ARG_DECL_NOT_USED)
+{
+ return PortableServer::POA::_duplicate (this->default_POA_.in ());
+}
+
+void
+TAO_CEC_TypedProxyPushConsumer::_add_ref (ACE_ENV_SINGLE_ARG_DECL_NOT_USED)
+{
+ this->_incr_refcnt ();
+}
+
+void
+TAO_CEC_TypedProxyPushConsumer::_remove_ref (ACE_ENV_SINGLE_ARG_DECL_NOT_USED)
+{
+ this->_decr_refcnt ();
+}
+
+CORBA::Object_ptr
+TAO_CEC_TypedProxyPushConsumer::get_typed_consumer (ACE_ENV_SINGLE_ARG_DECL)
+ ACE_THROW_SPEC ((CORBA::SystemException))
+
+{
+ CORBA::Object_var server =
+ default_POA_->id_to_reference (this->oid_.in ()
+ ACE_ENV_ARG_PARAMETER);
+
+ return CORBA::Object::_duplicate (server.in());
+}
+
+void
+TAO_CEC_TypedProxyPushConsumer::invoke (const TAO_CEC_TypedEvent& typed_event
+ ACE_ENV_ARG_DECL)
+ ACE_THROW_SPEC ((CORBA::SystemException))
+{
+ TAO_CEC_TypedProxyPushConsumer_Guard ace_mon (this->lock_,
+ this->refcount_,
+ this->typed_event_channel_,
+ this);
+ if (!ace_mon.locked ())
+ return;
+
+ this->typed_event_channel_->typed_consumer_admin ()->invoke (typed_event
+ ACE_ENV_ARG_PARAMETER);
+}
+
+// ****************************************************************
+
+TAO_CEC_TypedProxyPushConsumer_Guard::
+ TAO_CEC_TypedProxyPushConsumer_Guard (ACE_Lock *lock,
+ CORBA::ULong &refcount,
+ TAO_CEC_TypedEventChannel *ec,
+ TAO_CEC_TypedProxyPushConsumer *proxy)
+ : lock_ (lock),
+ refcount_ (refcount),
+ typed_event_channel_ (ec),
+ proxy_ (proxy),
+ locked_ (0)
+{
+ ACE_Guard<ACE_Lock> ace_mon (*this->lock_);
+ // If the guard fails there is not much we can do, raising an
+ // exception is wrong, the client has *no* way to handle that kind
+ // of error. Even worse, there is no exception to raise in that
+ // case.
+ // @@ Returning something won't work either, the error should be
+ // logged though!
+
+ if (proxy->is_connected_i () == 0)
+ return;
+
+ this->locked_ = 1;
+ this->refcount_++;
+}
+
+TAO_CEC_TypedProxyPushConsumer_Guard::
+ ~TAO_CEC_TypedProxyPushConsumer_Guard (void)
+{
+ // This access is safe because guard objects are created on the
+ // stack, only one thread has access to them
+ if (!this->locked_)
+ return;
+
+ {
+ ACE_Guard<ACE_Lock> ace_mon (*this->lock_);
+ // If the guard fails there is not much we can do, raising an
+ // exception is wrong, the client has *no* way to handle that kind
+ // of error. Even worse, there is no exception to raise in that
+ // case.
+ // @@ Returning something won't work either, the error should be
+ // logged though!
+
+ this->refcount_--;
+ if (this->refcount_ != 0)
+ return;
+ }
+ this->typed_event_channel_->destroy_proxy (this->proxy_);
+}
+
+TAO_END_VERSIONED_NAMESPACE_DECL
diff --git a/TAO/orbsvcs/orbsvcs/CosEvent/CEC_TypedProxyPushConsumer.h b/TAO/orbsvcs/orbsvcs/CosEvent/CEC_TypedProxyPushConsumer.h
new file mode 100644
index 00000000000..9595edd9420
--- /dev/null
+++ b/TAO/orbsvcs/orbsvcs/CosEvent/CEC_TypedProxyPushConsumer.h
@@ -0,0 +1,210 @@
+// -*- C++ -*-
+
+//=============================================================================
+/**
+ * @file CEC_TypedProxyPushConsumer.h
+ *
+ * $Id$
+ *
+ * @author Jon Astle (jon@astle45.fsnet.co.uk)
+ *
+ * Based on the untyped version by Carlos O'Ryan (coryan@cs.wustl.edu)
+ */
+//=============================================================================
+
+
+#ifndef TAO_CEC_TYPEDPROXYPUSHCONSUMER_H_
+#define TAO_CEC_TYPEDPROXYPUSHCONSUMER_H_
+#include /**/ "ace/pre.h"
+
+#include "orbsvcs/CosTypedEventChannelAdminS.h"
+
+#if !defined (ACE_LACKS_PRAGMA_ONCE)
+#pragma once
+#endif /* ACE_LACKS_PRAGMA_ONCE */
+
+#include "orbsvcs/ESF/ESF_Worker.h"
+#include "orbsvcs/CosEvent/event_serv_export.h"
+
+TAO_BEGIN_VERSIONED_NAMESPACE_DECL
+
+class TAO_CEC_TypedEvent;
+class TAO_CEC_TypedEventChannel;
+class TAO_CEC_DynamicImplementationServer;
+
+//Class TAO_CEC_TypedProxyPushConsumer
+class TAO_Event_Serv_Export TAO_CEC_TypedProxyPushConsumer
+ : public virtual POA_CosTypedEventChannelAdmin::TypedProxyPushConsumer
+{
+public:
+ typedef CosTypedEventChannelAdmin::TypedProxyPushConsumer_ptr _ptr_type;
+ typedef CosTypedEventChannelAdmin::TypedProxyPushConsumer_var _var_type;
+
+ //Constructor
+ TAO_CEC_TypedProxyPushConsumer (
+ TAO_CEC_TypedEventChannel* typed_event_channel,
+ const ACE_Time_Value &timeout
+ );
+
+ //Destructor
+ virtual ~TAO_CEC_TypedProxyPushConsumer (void);
+
+ /// Activate in the POA
+ virtual void activate (
+ CosTypedEventChannelAdmin::TypedProxyPushConsumer_ptr &activated_proxy
+ ACE_ENV_ARG_DECL)
+ ACE_THROW_SPEC ((CORBA::SystemException));
+
+ /// Deactivate from the POA
+ virtual void deactivate (ACE_ENV_SINGLE_ARG_DECL)
+ ACE_THROW_SPEC ((CORBA::SystemException));
+
+ /**
+ * Invoke the _non_existent() pseudo-operation on the supplier. If
+ * it is disconnected then it returns true and sets the
+ * <disconnected> flag.
+ */
+ CORBA::Boolean supplier_non_existent (CORBA::Boolean_out disconnected
+ ACE_ENV_ARG_DECL);
+
+ /// The event channel is shutting down
+ virtual void shutdown (ACE_ENV_SINGLE_ARG_DECL_NOT_USED);
+
+ /// Increment and decrement the reference count.
+ CORBA::ULong _incr_refcnt (void);
+ CORBA::ULong _decr_refcnt (void);
+
+ // = The CosEventChannelAdmin::ProxyPushConsumer methods (abstract overloads)...
+ virtual void connect_push_supplier (
+ CosEventComm::PushSupplier_ptr push_supplier
+ ACE_ENV_ARG_DECL_NOT_USED)
+ ACE_THROW_SPEC ((CORBA::SystemException,
+ CosEventChannelAdmin::AlreadyConnected));
+
+ virtual void push (const CORBA::Any& event
+ ACE_ENV_ARG_DECL_NOT_USED)
+ ACE_THROW_SPEC ((CORBA::SystemException));
+
+ virtual void invoke (const TAO_CEC_TypedEvent& typed_event
+ ACE_ENV_ARG_DECL)
+ ACE_THROW_SPEC ((CORBA::SystemException));
+
+ virtual void disconnect_push_consumer (ACE_ENV_SINGLE_ARG_DECL_NOT_USED)
+ ACE_THROW_SPEC ((CORBA::SystemException));
+
+ // = The CosTypedEventComm::TypedPushConsumer methods (abstract overloads)...
+ virtual CORBA::Object_ptr get_typed_consumer (
+ ACE_ENV_SINGLE_ARG_DECL_NOT_USED
+ )
+ ACE_THROW_SPEC ((CORBA::SystemException));
+
+ // = The Servant methods
+ virtual PortableServer::POA_ptr _default_POA (ACE_ENV_SINGLE_ARG_DECL);
+ virtual void _add_ref (ACE_ENV_SINGLE_ARG_DECL_WITH_DEFAULTS);
+ virtual void _remove_ref (ACE_ENV_SINGLE_ARG_DECL_WITH_DEFAULTS);
+
+protected:
+ // The guard needs access to the following protected methods.
+ friend class TAO_CEC_TypedProxyPushConsumer_Guard;
+
+ /// The private version (without locking) of is_connected().
+ CORBA::Boolean is_connected_i (void) const;
+
+ /// Release the supplier
+ void cleanup_i (void);
+
+ /// Assigns the parameter to both supplier_ and nopolicy_supplier_, and
+ /// applies policies (when appropriate) to supplier_.
+ CosEventComm::PushSupplier_ptr apply_policy
+ (CosEventComm::PushSupplier_ptr pre);
+
+private:
+ /// The typed supplier admin, used for activation and memory managment.
+ TAO_CEC_TypedEventChannel* typed_event_channel_;
+
+ ACE_Time_Value timeout_;
+
+ /// The locking strategy.
+ ACE_Lock* lock_;
+
+ /// The reference count.
+ CORBA::ULong refcount_;
+
+ /// The typed supplier -- use apply_policy() instead of assigning directly to
+ /// typed_supplier_. This will keep typed_supplier_ and
+ /// nopolicy_typed_supplier_ in sync.
+ CosEventComm::PushSupplier_var typed_supplier_;
+
+ /// The typed supplier without any policies applied
+ CosEventComm::PushSupplier_var nopolicy_typed_supplier_;
+
+ /// The DSI impl
+ TAO_CEC_DynamicImplementationServer* dsi_impl_;
+
+ /// The DSI Portable Server OID
+ PortableServer::ObjectId_var oid_;
+
+ /// If the flag is not zero then we are connected, notice that the
+ /// supplier can be nil.
+ int connected_;
+
+ /// Store the default POA.
+ PortableServer::POA_var default_POA_;
+};
+
+// ****************************************************************
+
+/**
+ * @class TAO_CEC_TypedProxyPushConsumer_Guard
+ *
+ * @brief A Guard for the TypedProxyPushConsumer reference count
+ *
+ * This is a helper class used in the implementation of
+ * TypedProxyPushConumer. It provides a Guard mechanism to increment
+ * the reference count on the proxy, eliminating the need to hold
+ * mutexes during long operations.
+ */
+class TAO_Event_Serv_Export TAO_CEC_TypedProxyPushConsumer_Guard
+{
+public:
+ /// Constructor
+ TAO_CEC_TypedProxyPushConsumer_Guard (
+ ACE_Lock *lock,
+ CORBA::ULong &refcount,
+ TAO_CEC_TypedEventChannel *ec,
+ TAO_CEC_TypedProxyPushConsumer *proxy
+ );
+
+ /// Destructor
+ ~TAO_CEC_TypedProxyPushConsumer_Guard (void);
+
+ /// Returns 1 if the reference count successfully acquired
+ int locked (void) const;
+
+private:
+ /// The lock used to protect the reference count
+ ACE_Lock *lock_;
+
+ /// The reference count
+ CORBA::ULong &refcount_;
+
+ /// The event channel used to destroy the proxy
+ TAO_CEC_TypedEventChannel *typed_event_channel_;
+
+ /// The proxy whose lifetime is controlled by the reference count
+ TAO_CEC_TypedProxyPushConsumer *proxy_;
+
+ /// This flag is set to 1 if the reference count was successfully
+ /// acquired.
+ int locked_;
+};
+
+TAO_END_VERSIONED_NAMESPACE_DECL
+
+#if defined (__ACE_INLINE__)
+#include "orbsvcs/CosEvent/CEC_TypedProxyPushConsumer.i"
+#endif /* __ACE_INLINE__ */
+
+#include /**/ "ace/post.h"
+
+#endif /* TAO_CEC_TYPEDPROXYPUSHCONSUMER_H_ */
diff --git a/TAO/orbsvcs/orbsvcs/CosEvent/CEC_TypedProxyPushConsumer.i b/TAO/orbsvcs/orbsvcs/CosEvent/CEC_TypedProxyPushConsumer.i
new file mode 100644
index 00000000000..86eee941060
--- /dev/null
+++ b/TAO/orbsvcs/orbsvcs/CosEvent/CEC_TypedProxyPushConsumer.i
@@ -0,0 +1,21 @@
+// -*- C++ -*-
+//
+// $Id$
+
+TAO_BEGIN_VERSIONED_NAMESPACE_DECL
+
+ACE_INLINE CORBA::Boolean
+TAO_CEC_TypedProxyPushConsumer::is_connected_i (void) const
+{
+ return this->connected_;
+}
+
+// ****************************************************************
+
+ACE_INLINE int
+TAO_CEC_TypedProxyPushConsumer_Guard::locked (void) const
+{
+ return this->locked_;
+}
+
+TAO_END_VERSIONED_NAMESPACE_DECL
diff --git a/TAO/orbsvcs/orbsvcs/CosEvent/CEC_TypedSupplierAdmin.cpp b/TAO/orbsvcs/orbsvcs/CosEvent/CEC_TypedSupplierAdmin.cpp
new file mode 100644
index 00000000000..a156440cc16
--- /dev/null
+++ b/TAO/orbsvcs/orbsvcs/CosEvent/CEC_TypedSupplierAdmin.cpp
@@ -0,0 +1,111 @@
+// $Id$
+
+#include "orbsvcs/CosEvent/CEC_TypedSupplierAdmin.h"
+
+#include "orbsvcs/CosEvent/CEC_TypedEventChannel.h"
+
+#if ! defined (__ACE_INLINE__)
+#include "orbsvcs/CosEvent/CEC_TypedSupplierAdmin.i"
+#endif /* __ACE_INLINE__ */
+
+TAO_BEGIN_VERSIONED_NAMESPACE_DECL
+
+// Implementation skeleton constructor
+TAO_CEC_TypedSupplierAdmin::TAO_CEC_TypedSupplierAdmin (TAO_CEC_TypedEventChannel *ec)
+ : typed_event_channel_ (ec),
+ typed_push_admin_ (ec)
+{
+ this->default_POA_ =
+ this->typed_event_channel_->typed_supplier_poa ();
+}
+
+// Implementation skeleton destructor
+TAO_CEC_TypedSupplierAdmin::~TAO_CEC_TypedSupplierAdmin (void)
+{
+}
+
+PortableServer::POA_ptr
+TAO_CEC_TypedSupplierAdmin::_default_POA (ACE_ENV_SINGLE_ARG_DECL_NOT_USED)
+{
+ return PortableServer::POA::_duplicate (this->default_POA_.in ());
+}
+
+void
+TAO_CEC_TypedSupplierAdmin::connected (TAO_CEC_TypedProxyPushConsumer *consumer
+ ACE_ENV_ARG_DECL)
+{
+ this->typed_push_admin_.connected (consumer ACE_ENV_ARG_PARAMETER);
+}
+
+void
+TAO_CEC_TypedSupplierAdmin::reconnected (TAO_CEC_TypedProxyPushConsumer *consumer
+ ACE_ENV_ARG_DECL)
+{
+ this->typed_push_admin_.reconnected (consumer ACE_ENV_ARG_PARAMETER);
+}
+
+void
+TAO_CEC_TypedSupplierAdmin::disconnected (TAO_CEC_TypedProxyPushConsumer *consumer
+ ACE_ENV_ARG_DECL)
+{
+ this->typed_push_admin_.disconnected (consumer ACE_ENV_ARG_PARAMETER);
+}
+
+void
+TAO_CEC_TypedSupplierAdmin::shutdown (ACE_ENV_SINGLE_ARG_DECL)
+{
+ this->typed_push_admin_.shutdown (ACE_ENV_SINGLE_ARG_PARAMETER);
+ ACE_CHECK;
+}
+
+CosTypedEventChannelAdmin::TypedProxyPushConsumer_ptr
+TAO_CEC_TypedSupplierAdmin::obtain_typed_push_consumer (
+ const char * supported_interface
+ ACE_ENV_ARG_DECL
+ )
+ ACE_THROW_SPEC ((
+ CORBA::SystemException,
+ CosTypedEventChannelAdmin::InterfaceNotSupported
+ ))
+
+{
+ int result = this->typed_event_channel_->supplier_register_supported_interface (supported_interface ACE_ENV_ARG_PARAMETER);
+ ACE_CHECK_RETURN (0);
+
+ if (result == -1)
+ {
+ ACE_THROW_RETURN (CosTypedEventChannelAdmin::InterfaceNotSupported (),0);
+ }
+
+ return this->typed_push_admin_.obtain (ACE_ENV_SINGLE_ARG_PARAMETER);
+}
+
+CosEventChannelAdmin::ProxyPullConsumer_ptr
+TAO_CEC_TypedSupplierAdmin::obtain_typed_pull_consumer (
+ const char * /* uses_interface */
+ ACE_ENV_ARG_DECL
+ )
+ ACE_THROW_SPEC ((
+ CORBA::SystemException,
+ CosTypedEventChannelAdmin::NoSuchImplementation
+ ))
+
+{
+ ACE_THROW_RETURN (CosTypedEventChannelAdmin::NoSuchImplementation (), 0);
+}
+
+CosEventChannelAdmin::ProxyPushConsumer_ptr
+TAO_CEC_TypedSupplierAdmin::obtain_push_consumer (ACE_ENV_SINGLE_ARG_DECL)
+ ACE_THROW_SPEC ((CORBA::SystemException))
+{
+ ACE_THROW_RETURN (CORBA::NO_IMPLEMENT (), 0);
+}
+
+CosEventChannelAdmin::ProxyPullConsumer_ptr
+TAO_CEC_TypedSupplierAdmin::obtain_pull_consumer (ACE_ENV_SINGLE_ARG_DECL)
+ ACE_THROW_SPEC ((CORBA::SystemException))
+{
+ ACE_THROW_RETURN (CORBA::NO_IMPLEMENT (), 0);
+}
+
+TAO_END_VERSIONED_NAMESPACE_DECL
diff --git a/TAO/orbsvcs/orbsvcs/CosEvent/CEC_TypedSupplierAdmin.h b/TAO/orbsvcs/orbsvcs/CosEvent/CEC_TypedSupplierAdmin.h
new file mode 100644
index 00000000000..eaa3747387f
--- /dev/null
+++ b/TAO/orbsvcs/orbsvcs/CosEvent/CEC_TypedSupplierAdmin.h
@@ -0,0 +1,109 @@
+// -*- C++ -*-
+
+//=============================================================================
+/**
+ * @file CEC_TypedSupplierAdmin.h
+ *
+ * $Id$
+ *
+ * @author Jon Astle (jon@astle45.fsnet.co.uk)
+ *
+ * Based on the untyped version by Carlos O'Ryan (coryan@cs.wustl.edu)
+ */
+//=============================================================================
+
+
+#ifndef TAO_CEC_TYPEDSUPPLIERADMIN_H_
+#define TAO_CEC_TYPEDSUPPLIERADMIN_H_
+
+#include /**/ "ace/pre.h"
+
+#include "orbsvcs/CosTypedEventChannelAdminS.h"
+
+#if !defined (ACE_LACKS_PRAGMA_ONCE)
+#pragma once
+#endif /* ACE_LACKS_PRAGMA_ONCE */
+
+#include "orbsvcs/ESF/ESF_Proxy_Admin.h"
+
+#include "orbsvcs/CosEvent/CEC_TypedProxyPushConsumer.h"
+
+TAO_BEGIN_VERSIONED_NAMESPACE_DECL
+
+class TAO_CEC_TypedEventChannel;
+
+//Class TAO_CEC_TypedSupplierAdmin
+class TAO_Event_Serv_Export TAO_CEC_TypedSupplierAdmin
+ : public POA_CosTypedEventChannelAdmin::TypedSupplierAdmin
+{
+public:
+ //Constructor
+ TAO_CEC_TypedSupplierAdmin (TAO_CEC_TypedEventChannel* event_channel);
+
+ //Destructor
+ virtual ~TAO_CEC_TypedSupplierAdmin (void);
+
+ /// For each elements call <worker->work()>.
+ void for_each (TAO_ESF_Worker<TAO_CEC_TypedProxyPushConsumer> *worker
+ ACE_ENV_ARG_DECL);
+
+ /// Keep track of connected consumers.
+ virtual void connected (TAO_CEC_TypedProxyPushConsumer*
+ ACE_ENV_ARG_DECL_NOT_USED);
+ virtual void reconnected (TAO_CEC_TypedProxyPushConsumer*
+ ACE_ENV_ARG_DECL_NOT_USED);
+ virtual void disconnected (TAO_CEC_TypedProxyPushConsumer*
+ ACE_ENV_ARG_DECL_NOT_USED);
+
+ /// The typed event channel is shutting down, inform all the consumers of
+ /// this
+ virtual void shutdown (ACE_ENV_SINGLE_ARG_DECL_NOT_USED);
+
+ // = The CosTypedEventChannelAdmin::TypedSupplierAdmin methods...
+ virtual CosTypedEventChannelAdmin::TypedProxyPushConsumer_ptr
+ obtain_typed_push_consumer (const char * supported_interface
+ ACE_ENV_ARG_DECL)
+ ACE_THROW_SPEC ((CORBA::SystemException,
+ CosTypedEventChannelAdmin::InterfaceNotSupported));
+
+ virtual CosEventChannelAdmin::ProxyPullConsumer_ptr
+ obtain_typed_pull_consumer (const char * uses_interface
+ ACE_ENV_ARG_DECL)
+ ACE_THROW_SPEC ((CORBA::SystemException,
+ CosTypedEventChannelAdmin::NoSuchImplementation));
+
+ // = The CosEventChannelAdmin::SupplierAdmin methods...
+ virtual CosEventChannelAdmin::ProxyPushConsumer_ptr
+ obtain_push_consumer (ACE_ENV_SINGLE_ARG_DECL_NOT_USED)
+ ACE_THROW_SPEC ((CORBA::SystemException));
+
+ virtual CosEventChannelAdmin::ProxyPullConsumer_ptr
+ obtain_pull_consumer (ACE_ENV_SINGLE_ARG_DECL_NOT_USED)
+ ACE_THROW_SPEC ((CORBA::SystemException));
+
+ // = The PortableServer::ServantBase methods
+ virtual PortableServer::POA_ptr _default_POA (ACE_ENV_SINGLE_ARG_DECL);
+
+private:
+ /// The Event Channel we belong to
+ TAO_CEC_TypedEventChannel *typed_event_channel_;
+
+ /// Store the default POA.
+ PortableServer::POA_var default_POA_;
+
+ /// The push and pull aspects are implemented using these classes
+ TAO_ESF_Proxy_Admin<TAO_CEC_TypedEventChannel,
+ TAO_CEC_TypedProxyPushConsumer,
+ CosTypedEventChannelAdmin::TypedProxyPushConsumer>
+ typed_push_admin_;
+};
+
+TAO_END_VERSIONED_NAMESPACE_DECL
+
+#if defined (__ACE_INLINE__)
+#include "orbsvcs/CosEvent/CEC_TypedSupplierAdmin.i"
+#endif /* __ACE_INLINE__ */
+
+#include /**/ "ace/post.h"
+
+#endif /* TAO_CEC_TYPEDSUPPLIERADMIN_H_ */
diff --git a/TAO/orbsvcs/orbsvcs/CosEvent/CEC_TypedSupplierAdmin.i b/TAO/orbsvcs/orbsvcs/CosEvent/CEC_TypedSupplierAdmin.i
new file mode 100644
index 00000000000..4a3111bc176
--- /dev/null
+++ b/TAO/orbsvcs/orbsvcs/CosEvent/CEC_TypedSupplierAdmin.i
@@ -0,0 +1,15 @@
+// -*- C++ -*-
+//
+// $Id$
+
+TAO_BEGIN_VERSIONED_NAMESPACE_DECL
+
+ACE_INLINE void
+TAO_CEC_TypedSupplierAdmin::
+ for_each (TAO_ESF_Worker<TAO_CEC_TypedProxyPushConsumer> *worker
+ ACE_ENV_ARG_DECL)
+{
+ this->typed_push_admin_.for_each (worker ACE_ENV_ARG_PARAMETER);
+}
+
+TAO_END_VERSIONED_NAMESPACE_DECL
diff --git a/TAO/orbsvcs/orbsvcs/CosEvent/event_export.h b/TAO/orbsvcs/orbsvcs/CosEvent/event_export.h
new file mode 100644
index 00000000000..5d16512df9b
--- /dev/null
+++ b/TAO/orbsvcs/orbsvcs/CosEvent/event_export.h
@@ -0,0 +1,40 @@
+
+// -*- C++ -*-
+// $Id$
+// Definition for Win32 Export directives.
+// This file is generated automatically by generate_export_file.pl
+// ------------------------------
+#ifndef TAO_EVENT_EXPORT_H
+#define TAO_EVENT_EXPORT_H
+
+#include "ace/config-all.h"
+
+#if defined (TAO_AS_STATIC_LIBS)
+# if !defined (TAO_EVENT_HAS_DLL)
+# define TAO_EVENT_HAS_DLL 0
+# endif /* ! TAO_EVENT_HAS_DLL */
+#else
+# if !defined (TAO_EVENT_HAS_DLL)
+# define TAO_EVENT_HAS_DLL 1
+# endif /* ! TAO_EVENT_HAS_DLL */
+#endif
+
+#if defined (TAO_EVENT_HAS_DLL) && (TAO_EVENT_HAS_DLL == 1)
+# if defined (TAO_EVENT_BUILD_DLL)
+# define TAO_Event_Export ACE_Proper_Export_Flag
+# define TAO_EVENT_SINGLETON_DECLARATION(T) ACE_EXPORT_SINGLETON_DECLARATION (T)
+# define TAO_EVENT_SINGLETON_DECLARE(SINGLETON_TYPE, CLASS, LOCK) ACE_EXPORT_SINGLETON_DECLARE(SINGLETON_TYPE, CLASS, LOCK)
+# else /* TAO_EVENT_BUILD_DLL */
+# define TAO_Event_Export ACE_Proper_Import_Flag
+# define TAO_EVENT_SINGLETON_DECLARATION(T) ACE_IMPORT_SINGLETON_DECLARATION (T)
+# define TAO_EVENT_SINGLETON_DECLARE(SINGLETON_TYPE, CLASS, LOCK) ACE_IMPORT_SINGLETON_DECLARE(SINGLETON_TYPE, CLASS, LOCK)
+# endif /* TAO_EVENT_BUILD_DLL */
+#else /* TAO_EVENT_HAS_DLL == 1 */
+# define TAO_Event_Export
+# define TAO_EVENT_SINGLETON_DECLARATION(T)
+# define TAO_EVENT_SINGLETON_DECLARE(SINGLETON_TYPE, CLASS, LOCK)
+#endif /* TAO_EVENT_HAS_DLL == 1 */
+
+#endif /* TAO_EVENT_EXPORT_H */
+
+// End of auto generated file.
diff --git a/TAO/orbsvcs/orbsvcs/CosEvent/event_serv_export.h b/TAO/orbsvcs/orbsvcs/CosEvent/event_serv_export.h
new file mode 100644
index 00000000000..3bc4d00b86a
--- /dev/null
+++ b/TAO/orbsvcs/orbsvcs/CosEvent/event_serv_export.h
@@ -0,0 +1,40 @@
+
+// -*- C++ -*-
+// $Id$
+// Definition for Win32 Export directives.
+// This file is generated automatically by generate_export_file.pl
+// ------------------------------
+#ifndef TAO_EVENT_SERV_EXPORT_H
+#define TAO_EVENT_SERV_EXPORT_H
+
+#include "ace/config-all.h"
+
+#if defined (TAO_AS_STATIC_LIBS)
+# if !defined (TAO_EVENT_SERV_HAS_DLL)
+# define TAO_EVENT_SERV_HAS_DLL 0
+# endif /* ! TAO_EVENT_SERV_HAS_DLL */
+#else
+# if !defined (TAO_EVENT_SERV_HAS_DLL)
+# define TAO_EVENT_SERV_HAS_DLL 1
+# endif /* ! TAO_EVENT_SERV_HAS_DLL */
+#endif
+
+#if defined (TAO_EVENT_SERV_HAS_DLL) && (TAO_EVENT_SERV_HAS_DLL == 1)
+# if defined (TAO_EVENT_SERV_BUILD_DLL)
+# define TAO_Event_Serv_Export ACE_Proper_Export_Flag
+# define TAO_EVENT_SERV_SINGLETON_DECLARATION(T) ACE_EXPORT_SINGLETON_DECLARATION (T)
+# define TAO_EVENT_SERV_SINGLETON_DECLARE(SINGLETON_TYPE, CLASS, LOCK) ACE_EXPORT_SINGLETON_DECLARE(SINGLETON_TYPE, CLASS, LOCK)
+# else /* TAO_EVENT_SERV_BUILD_DLL */
+# define TAO_Event_Serv_Export ACE_Proper_Import_Flag
+# define TAO_EVENT_SERV_SINGLETON_DECLARATION(T) ACE_IMPORT_SINGLETON_DECLARATION (T)
+# define TAO_EVENT_SERV_SINGLETON_DECLARE(SINGLETON_TYPE, CLASS, LOCK) ACE_IMPORT_SINGLETON_DECLARE(SINGLETON_TYPE, CLASS, LOCK)
+# endif /* TAO_EVENT_SERV_BUILD_DLL */
+#else /* TAO_EVENT_SERV_HAS_DLL == 1 */
+# define TAO_Event_Serv_Export
+# define TAO_EVENT_SERV_SINGLETON_DECLARATION(T)
+# define TAO_EVENT_SERV_SINGLETON_DECLARE(SINGLETON_TYPE, CLASS, LOCK)
+#endif /* TAO_EVENT_SERV_HAS_DLL == 1 */
+
+#endif /* TAO_EVENT_SERV_EXPORT_H */
+
+// End of auto generated file.
diff --git a/TAO/orbsvcs/orbsvcs/CosEvent/event_skel_export.h b/TAO/orbsvcs/orbsvcs/CosEvent/event_skel_export.h
new file mode 100644
index 00000000000..f5194fa05a9
--- /dev/null
+++ b/TAO/orbsvcs/orbsvcs/CosEvent/event_skel_export.h
@@ -0,0 +1,40 @@
+
+// -*- C++ -*-
+// $Id$
+// Definition for Win32 Export directives.
+// This file is generated automatically by generate_export_file.pl
+// ------------------------------
+#ifndef TAO_EVENT_SKEL_EXPORT_H
+#define TAO_EVENT_SKEL_EXPORT_H
+
+#include "ace/config-all.h"
+
+#if defined (TAO_AS_STATIC_LIBS)
+# if !defined (TAO_EVENT_SKEL_HAS_DLL)
+# define TAO_EVENT_SKEL_HAS_DLL 0
+# endif /* ! TAO_EVENT_SKEL_HAS_DLL */
+#else
+# if !defined (TAO_EVENT_SKEL_HAS_DLL)
+# define TAO_EVENT_SKEL_HAS_DLL 1
+# endif /* ! TAO_EVENT_SKEL_HAS_DLL */
+#endif
+
+#if defined (TAO_EVENT_SKEL_HAS_DLL) && (TAO_EVENT_SKEL_HAS_DLL == 1)
+# if defined (TAO_EVENT_SKEL_BUILD_DLL)
+# define TAO_Event_Skel_Export ACE_Proper_Export_Flag
+# define TAO_EVENT_SKEL_SINGLETON_DECLARATION(T) ACE_EXPORT_SINGLETON_DECLARATION (T)
+# define TAO_EVENT_SKEL_SINGLETON_DECLARE(SINGLETON_TYPE, CLASS, LOCK) ACE_EXPORT_SINGLETON_DECLARE(SINGLETON_TYPE, CLASS, LOCK)
+# else /* TAO_EVENT_SKEL_BUILD_DLL */
+# define TAO_Event_Skel_Export ACE_Proper_Import_Flag
+# define TAO_EVENT_SKEL_SINGLETON_DECLARATION(T) ACE_IMPORT_SINGLETON_DECLARATION (T)
+# define TAO_EVENT_SKEL_SINGLETON_DECLARE(SINGLETON_TYPE, CLASS, LOCK) ACE_IMPORT_SINGLETON_DECLARE(SINGLETON_TYPE, CLASS, LOCK)
+# endif /* TAO_EVENT_SKEL_BUILD_DLL */
+#else /* TAO_EVENT_SKEL_HAS_DLL == 1 */
+# define TAO_Event_Skel_Export
+# define TAO_EVENT_SKEL_SINGLETON_DECLARATION(T)
+# define TAO_EVENT_SKEL_SINGLETON_DECLARE(SINGLETON_TYPE, CLASS, LOCK)
+#endif /* TAO_EVENT_SKEL_HAS_DLL == 1 */
+
+#endif /* TAO_EVENT_SKEL_EXPORT_H */
+
+// End of auto generated file.
diff --git a/TAO/orbsvcs/orbsvcs/CosEventChannelAdmin.idl b/TAO/orbsvcs/orbsvcs/CosEventChannelAdmin.idl
new file mode 100644
index 00000000000..88492c0996d
--- /dev/null
+++ b/TAO/orbsvcs/orbsvcs/CosEventChannelAdmin.idl
@@ -0,0 +1,246 @@
+/**
+ * @file CosEventChannelAdmin.idl
+ *
+ * @brief Define the CosEventChannelAdmin module
+ *
+ * $Id$
+ *
+ * Described in CORBAservices: Common Object Services Specification,
+ * chapter 4.
+ *
+ * CosEventChannelAdmin Module, page 4-15 includes the following
+ * interfaces: ProxyPushConsumer, ProxyPullSupplier,
+ * ProxyPullConsumer, ProxyPushSupplier, ConsumerAdmin, SupplierAdmin,
+ * EventChannel
+ *
+ * The Event Service IDL can be downloaded from
+ * ftp://www.omg.org/pub/docs/formal/97-11-02.idl
+ *
+ * The complete specification is available from:
+ * http://www.omg.org/technology/documents/formal/event_service.htm
+ *
+ * @author Pradeep Gore <pradeep@cs.wustl.edu>
+ */
+#ifndef TAO_EVENTCHANNELADMIN_IDL
+#define TAO_EVENTCHANNELADMIN_IDL
+
+#include "CosEventComm.idl"
+
+#pragma prefix "omg.org"
+
+/**
+ * @namespace CosEventChannelAdmin
+ *
+ * @brief Define the interfaces implemented by providers of the CORBA
+ * Event Service.
+ */
+module CosEventChannelAdmin
+{
+ /**
+ * @exception AlreadyConnected
+ *
+ * @brief Exception raised if the user tries to connect to an
+ * already connected proxy
+ */
+ exception AlreadyConnected {};
+
+ /**
+ * @exception TypeError
+ *
+ * @brief Exception raised in Typed Event Services if there is a
+ * mismatch between the proxy and its peer (supplier or consumer.)
+ */
+ exception TypeError {};
+
+ /**
+ * @interface ProxyPushConsumer
+ *
+ * @brief Interface used by push-style suppliers.
+ *
+ * The application can use the methods derived from
+ * CosEventComm::PushConsumer to disconnect from the Event Service
+ * and push events.
+ */
+ interface ProxyPushConsumer : CosEventComm::PushConsumer
+ {
+ /// Connect a push-style supplier to the Event Service
+ /**
+ * Before pushing events into its Proxy the application must call
+ * the following operation.
+ *
+ * @param push_supplier Callback interface, invoked by the Event
+ * Service if it is destroyed while the push-style supplier
+ * is still connected. If the argument is nil the callback
+ * is not invoked.
+ * @throws AlreadyConnected if the operation is called a second
+ * time.
+ */
+ void connect_push_supplier (in CosEventComm::PushSupplier push_supplier)
+ raises (AlreadyConnected);
+ };
+
+ /**
+ * @interface ProxyPushSupplier
+ *
+ * @brief Interface used by push-style consumers
+ *
+ * Push-style consumers used this interface to connect and
+ * disconnect from the Event Service.
+ *
+ * The disconnect_push_supplier() operation, derived from the
+ * CosEventEventComm::PushSupplier interface, is used to disconnect
+ * the ProxyPushSupplier and reclaim all resources attached to it
+ * from the Event Service.
+ */
+ interface ProxyPushSupplier : CosEventComm::PushSupplier
+ {
+ /// Connect a push-style consumer to the Event Service.
+ /**
+ * The following operation must be invoked before the Event
+ * Service can deliver any events to the consumer.
+ *
+ * @param push_consumer The consumer, must be non-nil.
+ * @throws CORBA::BAD_PARAM if the consumer argument is nil.
+ * @throws AlreadyConnected if the operation is called a second
+ * time.
+ * @throws TypeError In Typed Event Services if the consumer does
+ * not match the expected type.
+ */
+ void connect_push_consumer (in CosEventComm::PushConsumer push_consumer)
+ raises (AlreadyConnected, TypeError);
+ };
+
+ /**
+ * @interface ProxyPullSupplier
+ *
+ * @brief Interface used by pull-style consumers.
+ *
+ * Pull-style suppliers use this interface to connect and disconnect
+ * from the Event Service.
+ *
+ * The disconnect_pull_supplier() operation, derived from
+ * CosEventComm::PullSupplier, is used by the application to
+ * disconnect from the Event Service.
+ * The application can use the pull() and try_pull() operations to
+ * pull data from the Event Service.
+ */
+ interface ProxyPullSupplier : CosEventComm::PullSupplier
+ {
+ /// Connect a pull consumer to the Event Service.
+ /**
+ * Applications cannot pull events before this operation is
+ * invoked.
+ *
+ * @param pull_consumer Callback interface used to inform the
+ * the application when the Event Service is destroyed. The
+ * argument can be nil.
+ * @throws AlreadyConnected if the operation is called a second
+ * time.
+ */
+ void connect_pull_consumer (in CosEventComm::PullConsumer pull_consumer)
+ raises (AlreadyConnected);
+ };
+
+ /**
+ * @interface ProxyPullConsumer
+ *
+ * @brief Interface used by pull-style suppliers.
+ *
+ * Pull-style consumers use this interface to connect, disconnect
+ * and pull events from the Event Service.
+ *
+ * The disconnect_pull_consumer() operation, derived from
+ * CosEventEventComm::PullConsumer, is used to disconnect from the
+ * Event Service.
+ */
+ interface ProxyPullConsumer : CosEventComm::PullConsumer
+ {
+ /// Connect a pull supplier to the Event Service.
+ /**
+ * The Event Service will not start pulling events until this
+ * operation is invoked.
+ *
+ * @param pull_supplier Callback interface used to (1) inform the
+ * application when the Event Service is destroyed, and (2) pull
+ * events from the application. The argument cannot be nil.
+ * @throws CORBA::BAD_PARAM if the pull_supplier argument is nil.
+ * @throws AlreadyConnected if the operation is called a second
+ * time.
+ * @throws TypeError In Typed Event Services if the consumer does
+ * not match the expected type.
+ */
+ void connect_pull_supplier (in CosEventComm::PullSupplier pull_supplier)
+ raises (AlreadyConnected, TypeError);
+ };
+
+ /**
+ * @interface ConsumerAdmin
+ *
+ * @brief Abstract Factory used to create proxies for pull-style and
+ * push-style consumers.
+ */
+ interface ConsumerAdmin
+ {
+ /// Create a new ProxyPushSupplier object.
+ ProxyPushSupplier obtain_push_supplier ();
+
+ /// Create a new ProxyPullSupplier object.
+ ProxyPullSupplier obtain_pull_supplier ();
+ };
+
+ /**
+ * @interface SupplierAdmin
+ *
+ * @brief Abstract Factory used to create proxies for pull-style and
+ * push-style suppliers.
+ */
+ interface SupplierAdmin
+ {
+ /// Create a new ProxyPushConsumer object.
+ ProxyPushConsumer obtain_push_consumer ();
+
+ /// Create a new ProxyPullConsumer object.
+ ProxyPullConsumer obtain_pull_consumer ();
+ };
+
+ /**
+ * @interface EventChannel
+ *
+ * @brief Main interface for the Event Service.
+ */
+ interface EventChannel
+ {
+ /// Obtain a ConsumerAdmin interface for this EventChannel
+ /**
+ * Normally a single EventChannel provides a single ConsumerAdmin,
+ * but advanced ECs, for example, those based in the
+ * CosNotification service, can provide multiple ConsumerAdmin
+ * interfaces.
+ */
+ ConsumerAdmin for_consumers ();
+
+ /// Obtain a SupplierAdmin interface for this EventChannel
+ /**
+ * Normally a single EventChannel provides a single SupplierAdmin,
+ * but advanced ECs, for example, those based in the
+ * CosNotification service, can provide multiple SupplierAdmin
+ * interfaces.
+ */
+ SupplierAdmin for_suppliers ();
+
+ /// Destroy the EventChannel
+ /**
+ * Calling this operation destroys the EventChannel, its
+ * ConsumerAdmin and SupplierAdmin interfaces as well as the
+ * proxies obtained from those.
+ * Any consumers or suppliers still connected are notified of the
+ * destruction. In some cases, the process running the
+ * EventChannel is terminated too.
+ */
+ void destroy ();
+ };
+};
+
+#pragma prefix ""
+
+#endif /* TAO_EVENTCHANNELADMIN_IDL */
diff --git a/TAO/orbsvcs/orbsvcs/CosEventComm.idl b/TAO/orbsvcs/orbsvcs/CosEventComm.idl
new file mode 100644
index 00000000000..e97413fa618
--- /dev/null
+++ b/TAO/orbsvcs/orbsvcs/CosEventComm.idl
@@ -0,0 +1,177 @@
+/**
+ * @file CosEventComm.idl
+ *
+ * @brief Define the CosEventComm module
+ *
+ * $Id$
+ *
+ * Described in CORBAservices: Common Object Services Specification,
+ * chapter 4.
+ *
+ * CosEventComm Module, page 4-8 includes the following interfaces:
+ * PushConsumer, PushSupplier, PullSupplier, PullConsumer
+ *
+ * The Event service IDL can be downloaded from
+ * ftp://www.omg.org/pub/docs/formal/97-11-02.idl
+ *
+ * The complete specification is available from:
+ * http://www.omg.org/technology/documents/formal/event_service.htm
+ *
+ * @author Pradeep Gore <pradeep@cs.wustl.edu>
+ */
+
+#ifndef TAO_EVENTCOMM_IDL
+#define TAO_EVENTCOMM_IDL
+
+#pragma prefix "omg.org"
+
+/**
+ * @namespace CosEventComm
+ *
+ * @brief Define the interfaces implemented by users of the CORBA
+ * Event Service.
+ */
+module CosEventComm
+{
+ /**
+ * @exception Disconnected
+ *
+ * @brief Exception raised when a client tries to communicate with
+ * the Event Service after it has disconnected.
+ *
+ * The exception is raised if:
+ *
+ * - If supplier tries to push an event before fully connecting to
+ * the EC.
+ * - A consumer tries to pull an event before fully connecting to
+ * the EC.
+ */
+ exception Disconnected {};
+
+ /**
+ * @interface PushConsumer
+ *
+ * @brief Define the interface implemented by push-style consumers
+ *
+ * A push-style consumer passively receives events from the Event
+ * Service. Applications simply implement this interface, connect
+ * to the Event Service and receive events.
+ */
+ interface PushConsumer
+ {
+ /// Receive one event from the Consumer's peer.
+ /**
+ * A supplier communicates event data to the consumer by
+ * invoking the push operation.
+ * @param data The event
+ * @throws CosEventComm::Disconnected if the object considers
+ * itself no longer connected to its peer.
+ */
+ void push (in any data) raises (Disconnected);
+
+ /// The peer has disconnected from the PushConsumer.
+ /**
+ * The disconnect_push_consumer operation indicates that the peer
+ * has disconnected, for example, because it has been destroyed.
+ * The application can safely release all resources attached to
+ * this consumer and destroy it, no further push() calls should be
+ * expected.
+ */
+ void disconnect_push_consumer ();
+ };
+
+ /**
+ * @interface PushSupplier
+ *
+ * @brief Define the interface implemented by push-style suppliers.
+ *
+ * A push-style supplier actively pushes events into the Event
+ * Service
+ */
+ interface PushSupplier
+ {
+ /// The peer has disconnected from the push-style supplier
+ /**
+ * The disconnect_push_supplier operation indicates that the peer
+ * has disconnected, for example, because it has been destroyed.
+ * The application can safe release all resource attached to this
+ * supplier and destroy it, further attempts to push events into
+ * its peer will fail.
+ */
+ void disconnect_push_supplier ();
+ };
+
+ /**
+ * @interface PullConsumer
+ *
+ * @brief Define the interface implemented by pull-style consumers
+ *
+ * A pull-style consumer actively queries the Event Channel for
+ * events.
+ */
+ interface PullConsumer
+ {
+ /// The peer has disconnected from the pull-style consumer.
+ /**
+ * The disconnect_pull_consumer operation indicates that the peer
+ * has disconnected, for example, because it has been destroyed.
+ * The application can safely release all resources attached to
+ * this consumer and destroy it, any attemps to pull more data
+ * should fail.
+ */
+ void disconnect_pull_consumer ();
+ };
+
+ /**
+ * @interface PullSupplier
+ *
+ * @brief Define the interface implemented by pull-style suppliers.
+ *
+ * A pull-style supplier passively generates events for the Event
+ * Service
+ */
+ interface PullSupplier
+ {
+ /// Pull (blocking) one event from the supplier.
+ /**
+ * The pull operation should block until the next event becomes
+ * available.
+ * @return The next event
+ * @throws CosEventComm::Disconnected if the object considers
+ * itself no longer connected to its peer.
+ */
+ any pull () raises (Disconnected);
+
+ /// Pull (non-blocking) one event from the supplier.
+ /**
+ * The try_pull operation does not block: if the event data is
+ * available, it returns the event data and sets the has_event
+ * parameter to true; if the event is not available, it sets the
+ * has_event parameter to false and the event data is returned
+ * as long with an undefined value.
+ *
+ * @param has_event Set to TRUE if there was another event
+ * available, FALSE otherwise.
+ * @return The next event if one was available, an any containing
+ * a 'long' with an undefined value otherwise.
+ * @throws CosEventComm::Disconnected if the object considers
+ * itself no longer connected to its peer.
+ */
+ any try_pull (out boolean has_event) raises (Disconnected);
+
+ /// The peer has disconnected from the pull-style supplier.
+ /**
+ * The disconnect_pull_supplier operation indicates that the peer
+ * has disconnected, for example, because it has been destroyed.
+ * The application can safe release all resource attached to this
+ * supplier and destroy it, the peer should not make any attempts
+ * to pull more data after this request.
+ */
+ void disconnect_pull_supplier ();
+ };
+
+};
+
+#pragma prefix ""
+
+#endif /* TAO_EVENTCOMM_IDL */
diff --git a/TAO/orbsvcs/orbsvcs/CosEvent_Serv.rc b/TAO/orbsvcs/orbsvcs/CosEvent_Serv.rc
new file mode 100644
index 00000000000..3acf53a2b6a
--- /dev/null
+++ b/TAO/orbsvcs/orbsvcs/CosEvent_Serv.rc
@@ -0,0 +1,30 @@
+#include "..\..\tao\Version.h"
+
+1 VERSIONINFO
+ FILEVERSION TAO_MAJOR_VERSION,TAO_MINOR_VERSION,TAO_BETA_VERSION,0
+ PRODUCTVERSION TAO_MAJOR_VERSION,TAO_MINOR_VERSION,TAO_BETA_VERSION,0
+ FILEFLAGSMASK 0x3fL
+ FILEFLAGS 0x0L
+ FILEOS 0x4L
+ FILETYPE 0x1L
+ FILESUBTYPE 0x0L
+BEGIN
+ BLOCK "StringFileInfo"
+ BEGIN
+ BLOCK "040904B0"
+ BEGIN
+ VALUE "FileDescription", "CosEvent_Serv\0"
+ VALUE "FileVersion", TAO_VERSION "\0"
+ VALUE "InternalName", "TAO_CosEvent_ServDLL\0"
+ VALUE "LegalCopyright", "\0"
+ VALUE "LegalTrademarks", "\0"
+ VALUE "OriginalFilename", "TAO_CosEvent_Serv.DLL\0"
+ VALUE "ProductName", "ORBSVCS\0"
+ VALUE "ProductVersion", TAO_VERSION "\0"
+ END
+ END
+ BLOCK "VarFileInfo"
+ BEGIN
+ VALUE "Translation", 0x409, 1200
+ END
+END
diff --git a/TAO/orbsvcs/orbsvcs/CosEvent_Skel.rc b/TAO/orbsvcs/orbsvcs/CosEvent_Skel.rc
new file mode 100644
index 00000000000..96c8513c4d2
--- /dev/null
+++ b/TAO/orbsvcs/orbsvcs/CosEvent_Skel.rc
@@ -0,0 +1,30 @@
+#include "..\..\tao\Version.h"
+
+1 VERSIONINFO
+ FILEVERSION TAO_MAJOR_VERSION,TAO_MINOR_VERSION,TAO_BETA_VERSION,0
+ PRODUCTVERSION TAO_MAJOR_VERSION,TAO_MINOR_VERSION,TAO_BETA_VERSION,0
+ FILEFLAGSMASK 0x3fL
+ FILEFLAGS 0x0L
+ FILEOS 0x4L
+ FILETYPE 0x1L
+ FILESUBTYPE 0x0L
+BEGIN
+ BLOCK "StringFileInfo"
+ BEGIN
+ BLOCK "040904B0"
+ BEGIN
+ VALUE "FileDescription", "CosEvent_Skel\0"
+ VALUE "FileVersion", TAO_VERSION "\0"
+ VALUE "InternalName", "TAO_CosEvent_SkelDLL\0"
+ VALUE "LegalCopyright", "\0"
+ VALUE "LegalTrademarks", "\0"
+ VALUE "OriginalFilename", "TAO_CosEvent_Skel.DLL\0"
+ VALUE "ProductName", "ORBSVCS\0"
+ VALUE "ProductVersion", TAO_VERSION "\0"
+ END
+ END
+ BLOCK "VarFileInfo"
+ BEGIN
+ VALUE "Translation", 0x409, 1200
+ END
+END
diff --git a/TAO/orbsvcs/orbsvcs/CosLifeCycle.idl b/TAO/orbsvcs/orbsvcs/CosLifeCycle.idl
new file mode 100644
index 00000000000..33b6bdbffed
--- /dev/null
+++ b/TAO/orbsvcs/orbsvcs/CosLifeCycle.idl
@@ -0,0 +1,127 @@
+/* -*- C++ -*- */
+// $Id$
+
+// ============================================================================
+//
+// = LIBRARY
+// cos
+//
+// = FILENAME
+// CosLifeCycle.idl
+//
+// = DESCRIPTION
+// Described in CORBAservices: Common Object Services Specification,
+// chapter 6.
+// The life cycle service description can be downloaded from:
+// ftp://www.omg.org/pub/docs/formal/97-12-13.pdf
+// The original IDL file can be downloaded from:
+// ftp://www.omg.org/pub/docs/formal/97-11-02.idl
+//
+// = AUTHOR
+// OMG, Torben Worm <tworm@cs.wustl.edu>, and Michael Kircher <mk1@cec.wustl.edu>
+//
+// ============================================================================
+
+#ifndef TAO_LIFECYCLE_IDL
+#define TAO_LIFECYCLE_IDL
+
+// OMG IDL for CosLifeCycle Module, page 6-10 in
+// Includes the following interfaces:
+// FactoryFinder, LifeCycleObject, GenericFactory
+
+#include "CosNaming.idl"
+
+#pragma prefix "omg.org"
+
+module CosLifeCycle
+{
+ // = TITLE
+ // CosLifeCycle
+ //
+ // = DESCRIPTION
+ // This idl file describes the life cycle service.
+ // The purpose of the life cycle service is to
+
+ typedef CosNaming::Name Key;
+ typedef Object _Factory;
+ typedef sequence <_Factory> Factories;
+
+ struct NameValuePair
+ {
+ CosNaming::Istring name;
+ any value;
+ };
+
+ typedef sequence <NameValuePair> Criteria;
+
+ exception NoFactory
+ {
+ Key search_key;
+ };
+ exception NotCopyable { string reason; };
+ exception NotMovable { string reason; };
+ exception NotRemovable { string reason; };
+ exception InvalidCriteria
+ {
+ Criteria invalid_criteria;
+ };
+ exception CannotMeetCriteria
+ {
+ Criteria unmet_criteria;
+ };
+
+ interface FactoryFinder
+ {
+ // = TITLE
+ // @@ Please fill in.
+ // = DESCRIPTION
+ // @@ Please fill in.
+
+ Factories find_factories (in Key factory_key)
+ raises (NoFactory);
+ };
+
+ interface LifeCycleObject
+ {
+ // = TITLE
+ // @@ Please fill in.
+ // = DESCRIPTION
+ // @@ Please fill in.
+
+ LifeCycleObject copy (in FactoryFinder there,
+ in Criteria the_criteria)
+ raises (NoFactory, NotCopyable, InvalidCriteria, CannotMeetCriteria);
+ void move (in FactoryFinder there,
+ in Criteria the_criteria)
+ raises (NoFactory, NotMovable, InvalidCriteria, CannotMeetCriteria);
+ void remove ()
+ raises (NotRemovable);
+ };
+
+ interface GenericFactory
+ {
+ // = TITLE
+ // @@ Please fill in.
+ // = DESCRIPTION
+ // @@ Please fill in.
+
+ boolean _supports (in Key k);
+ Object create_object (in Key k,
+ in Criteria the_criteria)
+ raises (NoFactory, InvalidCriteria, CannotMeetCriteria);
+ };
+};
+
+// Criteria, page 6-17:
+/*
+typedef struct NVP
+{
+ CosNaming::Istring name;
+ any value;
+} NameValuePair;
+
+typedef sequence <NameValuePair> Criteria;
+*/
+
+#endif /* TAO_LIFECYCLE_IDL */
+
diff --git a/TAO/orbsvcs/orbsvcs/CosLifeCycle.mpc b/TAO/orbsvcs/orbsvcs/CosLifeCycle.mpc
new file mode 100644
index 00000000000..e6ceedced03
--- /dev/null
+++ b/TAO/orbsvcs/orbsvcs/CosLifeCycle.mpc
@@ -0,0 +1,32 @@
+// -*- MPC -*-
+// $Id$
+
+project(CosLifeCycle) : orbsvcslib, core, naming, portableserver, tao_versioning_idl_defaults {
+ sharedname = TAO_CosLifeCycle
+ idlflags += -Wb,export_macro=TAO_LifeCycle_Export -Wb,export_include=orbsvcs/LifeCycle/lifecycle_export.h
+ dynamicflags = TAO_LIFECYCLE_BUILD_DLL
+ tagchecks += LifeCycle
+ pch_header =
+ pch_source =
+
+ IDL_Files {
+ CosLifeCycle.idl
+ LifeCycleService.idl
+ }
+
+ Source_Files(ORBSVCS_COMPONENTS) {
+ LifeCycle {
+ CosLifeCycleC.cpp
+ CosLifeCycleS.cpp
+ LifeCycleServiceC.cpp
+ LifeCycleServiceS.cpp
+ }
+ }
+
+ Template_Files {
+ }
+
+ Pkgconfig_Files {
+ TAO_CosLifeCycle.pc.in
+ }
+}
diff --git a/TAO/orbsvcs/orbsvcs/CosLifeCycle.rc b/TAO/orbsvcs/orbsvcs/CosLifeCycle.rc
new file mode 100644
index 00000000000..abcd96fbf8b
--- /dev/null
+++ b/TAO/orbsvcs/orbsvcs/CosLifeCycle.rc
@@ -0,0 +1,30 @@
+#include "..\..\tao\Version.h"
+
+1 VERSIONINFO
+ FILEVERSION TAO_MAJOR_VERSION,TAO_MINOR_VERSION,TAO_BETA_VERSION,0
+ PRODUCTVERSION TAO_MAJOR_VERSION,TAO_MINOR_VERSION,TAO_BETA_VERSION,0
+ FILEFLAGSMASK 0x3fL
+ FILEFLAGS 0x0L
+ FILEOS 0x4L
+ FILETYPE 0x1L
+ FILESUBTYPE 0x0L
+BEGIN
+ BLOCK "StringFileInfo"
+ BEGIN
+ BLOCK "040904B0"
+ BEGIN
+ VALUE "FileDescription", "CosLifeCycle\0"
+ VALUE "FileVersion", TAO_VERSION "\0"
+ VALUE "InternalName", "TAO_CosLifeCycleDLL\0"
+ VALUE "LegalCopyright", "\0"
+ VALUE "LegalTrademarks", "\0"
+ VALUE "OriginalFilename", "TAO_CosLifeCycle.DLL\0"
+ VALUE "ProductName", "ORBSVCS\0"
+ VALUE "ProductVersion", TAO_VERSION "\0"
+ END
+ END
+ BLOCK "VarFileInfo"
+ BEGIN
+ VALUE "Translation", 0x409, 1200
+ END
+END
diff --git a/TAO/orbsvcs/orbsvcs/CosLoadBalancing.idl b/TAO/orbsvcs/orbsvcs/CosLoadBalancing.idl
new file mode 100644
index 00000000000..b93e66a11b6
--- /dev/null
+++ b/TAO/orbsvcs/orbsvcs/CosLoadBalancing.idl
@@ -0,0 +1,202 @@
+// -*- IDL -*-
+
+//=============================================================================
+/**
+ * @file CosLoadBalancing.idl
+ *
+ * $Id$
+ *
+ * @author Object Management Group
+ */
+//=============================================================================
+
+
+#ifndef COSLOADBALANCING_IDL
+#define COSLOADBALANCING_IDL
+
+#include "PortableGroup.idl"
+#include "orb.idl"
+
+/**
+ * @class CosLoadBalancing
+ *
+ * @brief This module defines the interfaces and data types used in
+ * TAO's Load Balancing service.
+ * @par
+ * TAO's Load Balancer manages distribution of requests to replicas of
+ * a given Object in an effort to ensure that the applications/hosts
+ * pointed to by the Object reference are as equally loaded as
+ * possible, i.e. load balanced.
+ * @par
+ * The definition of 'load' is application specific, for example, some
+ * applications may choose to load balance access to multiple
+ * dedicated lines, or separate network interfaces, as well as more
+ * traditional load balancing metrics, such as CPU or power load.
+ */
+module CosLoadBalancing
+{
+ typeprefix CosLoadBalancing "tao.lb";
+
+ const IOP::ServiceId LOAD_MANAGED = 123456; // @todo TBA by OMG
+
+ typedef PortableGroup::Location Location;
+ typedef PortableGroup::Properties Properties;
+
+ // Types used for obtaining and/or reporting loads
+ typedef unsigned long LoadId;
+
+ // OMG defined LoadId constants.
+ const LoadId LoadAverage = 0;
+ const LoadId Disk = 1;
+ const LoadId Memory = 2;
+ const LoadId Network = 3;
+ const LoadId RequestsPerSecond = 4;
+
+ struct Load {
+ LoadId id;
+ float value;
+ };
+ typedef sequence<Load> LoadList;
+
+ exception MonitorAlreadyPresent {};
+ exception LocationNotFound {};
+ exception LoadAlertNotFound {};
+ exception LoadAlertAlreadyPresent {};
+ exception LoadAlertNotAdded {};
+
+ exception StrategyNotAdaptive {};
+
+ interface LoadManager;
+
+ interface Strategy
+ {
+ readonly attribute string name;
+
+ Properties get_properties ();
+
+ // Report loads at given location to the LoadManager.
+ void push_loads (in PortableGroup::Location the_location,
+ in LoadList loads)
+ raises (StrategyNotAdaptive);
+
+ // Get loads, if any, at the given location. Load balancing
+ // strategies may use this method to query loads at specific
+ // locations. Returned loads are the effective loads computed by
+ // the Strategy, as opposed to the raw loads maintained by the
+ // LoadManager.
+ LoadList get_loads (in LoadManager load_manager,
+ in PortableGroup::Location the_location)
+ raises (LocationNotFound);
+
+ // Return the next member from the given object group which will
+ // requests will be forward to.
+ Object next_member (in PortableGroup::ObjectGroup object_group,
+ in LoadManager load_manager)
+ raises (PortableGroup::ObjectGroupNotFound,
+ PortableGroup::MemberNotFound);
+
+ // Ask the Strategy to analyze loads, and enable or disable alerts
+ // at object group members residing at appropriate locations.
+ oneway void analyze_loads (in PortableGroup::ObjectGroup object_group,
+ in LoadManager load_manager);
+
+ // The loads at the given location should no longer be considered
+ // when performing load analysis.
+ // void location_removed (in PortableGroup::Location the_location)
+ // raises (LocationNotFound);
+ };
+
+ typedef Strategy CustomStrategy;
+
+ // Property value for built-in load balancing Strategy.
+ struct StrategyInfo
+ {
+ string name;
+ Properties props;
+ };
+
+ interface LoadAlert
+ {
+ // Forward requests back to the load manager via the object group
+ // reference.
+ void enable_alert ();
+
+ // Stop forwarding requests, and begin accepting them again.
+ void disable_alert ();
+ };
+
+ // Interface that all load monitors must implement.
+ interface LoadMonitor
+ {
+ // Retrieve the location at which the LoadMonitor resides.
+ readonly attribute Location the_location;
+
+ // Retrieve the current load at the location LoadMonitor resides.
+ readonly attribute LoadList loads;
+ };
+
+ // Specification of LoadManager Interface
+ interface LoadManager
+ : PortableGroup::PropertyManager,
+ PortableGroup::ObjectGroupManager,
+ PortableGroup::GenericFactory
+ {
+ // For the PUSH load monitoring style.
+ void push_loads (in PortableGroup::Location the_location,
+ in LoadList loads);
+
+ // Return the raw loads at the given location, as opposed to the
+ // potentially different effective loads returned by the
+ // Strategy::get_loads() method.
+ LoadList get_loads (in PortableGroup::Location the_location)
+ raises (LocationNotFound);
+
+ // Inform member at given location of load alert condition.
+ void enable_alert (in PortableGroup::Location the_location)
+ raises (LoadAlertNotFound);
+
+ // Inform member at given location that load alert condition has
+ // passed.
+ void disable_alert (in PortableGroup::Location the_location)
+ raises (LoadAlertNotFound);
+
+ // Register a LoadAlert object for the member at the given
+ // location.
+ void register_load_alert (in PortableGroup::Location the_location,
+ in LoadAlert load_alert)
+ raises (LoadAlertAlreadyPresent,
+ LoadAlertNotAdded);
+
+ // Retrieve the LoadAlert object for the member at the given
+ // location.
+ LoadAlert get_load_alert (in PortableGroup::Location the_location)
+ raises (LoadAlertNotFound);
+
+ // Remove (de-register) the LoadAlert object for the member at the
+ // given location.
+ void remove_load_alert (in PortableGroup::Location the_location)
+ raises (LoadAlertNotFound);
+
+ // The following load monitor methods are only used for the PULL
+ // load monitoring style.
+
+ // Register a LoadMonitor object for "pull" monitoring of the
+ // given location.
+ void register_load_monitor (in PortableGroup::Location the_location,
+ in LoadMonitor load_monitor)
+ raises (MonitorAlreadyPresent);
+
+ // Retrieve the LoadMonitor object for the given location.
+ LoadMonitor get_load_monitor (in PortableGroup::Location the_location)
+ raises (LocationNotFound);
+
+ // Remove (de-register) the LoadMonitor object for the given
+ // location.
+ void remove_load_monitor (in PortableGroup::Location the_location)
+ raises (LocationNotFound);
+
+ };
+
+};
+
+#endif /* COSLOADBALANCING_IDL */
diff --git a/TAO/orbsvcs/orbsvcs/CosLoadBalancing.mpc b/TAO/orbsvcs/orbsvcs/CosLoadBalancing.mpc
new file mode 100644
index 00000000000..7ea375e45af
--- /dev/null
+++ b/TAO/orbsvcs/orbsvcs/CosLoadBalancing.mpc
@@ -0,0 +1,50 @@
+// -*- MPC -*-
+// $Id$
+
+project : orbsvcslib, core, naming, iormanip, portablegroup, ami, minimum_corba, pi, pi_server, iorinterceptor, tao_versioning_idl_defaults {
+ sharedname = TAO_CosLoadBalancing
+ idlflags += -Wb,export_macro=TAO_LoadBalancing_Export -Wb,export_include=orbsvcs/LoadBalancing/LoadBalancing_export.h
+ dynamicflags = TAO_LOADBALANCING_BUILD_DLL
+ tagchecks += CosLoadBalancing
+
+ IDL_Files {
+ CosLoadBalancing.idl
+ LB_ORT.idl
+ }
+
+ Source_Files(ORBSVCS_COMPONENTS) {
+ CosLoadBalancing {
+ CosLoadBalancingC.cpp
+ CosLoadBalancingS.cpp
+ LB_ORTC.cpp
+ LoadBalancing/LB_LeastLoaded.cpp
+ LoadBalancing/LB_LoadMinimum.cpp
+ LoadBalancing/LB_LoadAverage.cpp
+ LoadBalancing/LB_LoadAlert.cpp
+ LoadBalancing/LB_LoadAlertInfo.cpp
+ LoadBalancing/LB_LoadAlert_Handler.cpp
+ LoadBalancing/LB_LoadManager.cpp
+ LoadBalancing/LB_MemberLocator.cpp
+ LoadBalancing/LB_Pull_Handler.cpp
+ LoadBalancing/LB_Random.cpp
+ LoadBalancing/LB_RoundRobin.cpp
+ LoadBalancing/LB_ClientComponent.cpp
+ LoadBalancing/LB_ClientORBInitializer.cpp
+ LoadBalancing/LB_ClientRequestInterceptor.cpp
+ LoadBalancing/LB_ServerRequestInterceptor.cpp
+ LoadBalancing/LB_IORInterceptor.cpp
+ LoadBalancing/LB_ObjectReferenceFactory.cpp
+ LoadBalancing/LB_ORBInitializer.cpp
+ LoadBalancing/LB_Component.cpp
+ LoadBalancing/LB_CPU_Utilization_Monitor.cpp
+ LoadBalancing/LB_CPU_Load_Average_Monitor.cpp
+ }
+ }
+
+ Template_Files {
+ }
+
+ Pkgconfig_Files {
+ TAO_CosLoadBalancing.pc.in
+ }
+}
diff --git a/TAO/orbsvcs/orbsvcs/CosLoadBalancing.rc b/TAO/orbsvcs/orbsvcs/CosLoadBalancing.rc
new file mode 100644
index 00000000000..95b44fda7f1
--- /dev/null
+++ b/TAO/orbsvcs/orbsvcs/CosLoadBalancing.rc
@@ -0,0 +1,30 @@
+#include "..\..\tao\Version.h"
+
+1 VERSIONINFO
+ FILEVERSION TAO_MAJOR_VERSION,TAO_MINOR_VERSION,TAO_BETA_VERSION,0
+ PRODUCTVERSION TAO_MAJOR_VERSION,TAO_MINOR_VERSION,TAO_BETA_VERSION,0
+ FILEFLAGSMASK 0x3fL
+ FILEFLAGS 0x0L
+ FILEOS 0x4L
+ FILETYPE 0x1L
+ FILESUBTYPE 0x0L
+BEGIN
+ BLOCK "StringFileInfo"
+ BEGIN
+ BLOCK "040904B0"
+ BEGIN
+ VALUE "FileDescription", "CosLoadBalancing\0"
+ VALUE "FileVersion", TAO_VERSION "\0"
+ VALUE "InternalName", "TAO_CosLoadBalancingDLL\0"
+ VALUE "LegalCopyright", "\0"
+ VALUE "LegalTrademarks", "\0"
+ VALUE "OriginalFilename", "TAO_CosLoadBalancing.DLL\0"
+ VALUE "ProductName", "ORBSVCS\0"
+ VALUE "ProductVersion", TAO_VERSION "\0"
+ END
+ END
+ BLOCK "VarFileInfo"
+ BEGIN
+ VALUE "Translation", 0x409, 1200
+ END
+END
diff --git a/TAO/orbsvcs/orbsvcs/CosNaming.idl b/TAO/orbsvcs/orbsvcs/CosNaming.idl
new file mode 100644
index 00000000000..78241d6a49d
--- /dev/null
+++ b/TAO/orbsvcs/orbsvcs/CosNaming.idl
@@ -0,0 +1,291 @@
+/* -*- C++ -*- */
+// $Id$
+
+// ============================================================================
+//
+// = LIBRARY
+// cos
+//
+// = FILENAME
+// CosNaming.idl
+//
+// = AUTHOR
+// Marina Spivak <marina@cs.wustl.edu>
+//
+// ============================================================================
+
+#ifndef TAO_NAMING_IDL
+#define TAO_NAMING_IDL
+
+#pragma prefix "omg.org"
+
+module CosNaming
+{
+ // = TITLE
+ // This module provides interface for using COS Naming Service.
+
+ typedef string Istring;
+ // Define a typedef for String. Maybe at some point, <Istring> will
+ // be different to support Internationalization.
+
+ struct NameComponent
+ {
+ // = TITLE
+ // This is a 'simple' name.
+ //
+ // = DESCRIPTION
+ // Both id and kind fields are used in resolving names.
+
+ Istring id;
+ // This is the name that is used to identify object references.
+
+ Istring kind;
+ // Stores any addtional info about the object reference.
+ };
+
+ typedef sequence <NameComponent> Name;
+ // This is a compound name: <c1; c2; c3; cn> where c1 to cn-1 are
+ // the names of the nested contexts, and cn is the name of the
+ // object bound in cn-1.
+
+ enum BindingType
+ {
+ nobject,
+ // object binding.
+
+ ncontext
+ // Naming context binding.
+ };
+
+ struct Binding
+ {
+ Name binding_name;
+ // Simple name, under which an object is bound in a given context.
+
+ BindingType binding_type;
+ // Indicates whether the binding_name identifies a context, and, therefore, can
+ // participate in name resolution.
+ };
+
+ typedef sequence <Binding> BindingList;
+
+ interface BindingIterator;
+ // Forward declaration.
+
+ interface NamingContext
+ {
+ // = TITLE
+ // Interface for managing name bindings and naming contexts.
+
+ // = Exceptions.
+
+ enum NotFoundReason
+ {
+ missing_node,
+ not_context,
+ not_object
+ };
+
+ exception NotFound
+ {
+ // = TITLE
+ // Indicates that the name does not identify a binding.
+
+ NotFoundReason why;
+ Name rest_of_name;
+ };
+
+ exception CannotProceed
+ {
+ // = TITLE
+ // Implementation may throw this exception if some reason it cannot
+ // complete the operation. This is currently not used in TAO.
+
+ NamingContext cxt;
+ Name rest_of_name;
+ };
+
+ exception InvalidName
+ {
+ // = TITLE
+ // A name of length 0 is invalid. Implementations may place
+ // further restrictions.
+ };
+
+ exception AlreadyBound
+ {
+ // = TITLE
+ // Indicates that the specified name is already bound to
+ // some object. Only one object can be bound to a
+ // particular name in an context. To change the binding,
+ // <rebind> and <rebind_context> can be used.
+ };
+
+ exception NotEmpty
+ {
+ // = TITLE
+ // Indicates that the context is not empty.
+ };
+
+ // = Binding operations.
+
+ void bind (in Name n, in Object obj)
+ raises (NotFound, CannotProceed, InvalidName, AlreadyBound);
+ // Create a binding for name <n> and object <obj> in the naming
+ // context. Compound names are treated as follows: ctx->bind
+ // (<c1; c2; c3; cn>, obj) = (ctx->resolve (<c1; c2;
+ // cn-1>))->bind (<cn>, obj) if the there already exists a
+ // binding for the specified name, <AlreadyBound> exception is
+ // thrown. Naming contexts should be bound using <bind_context>
+ // and <rebind_context> in order to participate in name
+ // resolution later.
+
+ void rebind (in Name n, in Object obj)
+ raises (NotFound, CannotProceed, InvalidName);
+ // This is similar to <bind> operation above, except for when
+ // the binding for the specified name already exists in the
+ // specified context. In that case, the existing binding is
+ // replaced with the new one.
+
+ void bind_context (in Name n, in NamingContext nc)
+ raises(NotFound, CannotProceed, InvalidName, AlreadyBound);
+ // This is the version of <bind> specifically for binding naming
+ // contexts, so that they will participate in name resolution
+ // when compound names are passed to be resolved.
+
+ void rebind_context (in Name n, in NamingContext nc)
+ raises (NotFound, CannotProceed, InvalidName);
+ // This is a version of <rebind> specifically for naming
+ // contexts, so that they can participate in name resolution
+ // when compound names are passed.
+
+ // = Resolving names.
+
+ Object resolve (in Name n)
+ raises (NotFound, CannotProceed, InvalidName);
+ // Return object reference that is bound to the name. Compound
+ // name resolve is defined as follows: ctx->resolve (<c1; c2;
+ // cn>) = ctx->resolve (<c1; c2 cn-1>)->resolve (<cn>) The
+ // naming service does not return the type of the object.
+ // Clients are responsible for "narrowing" the object to the
+ // appropriate type.
+
+ // = Unbinding names.
+
+ void unbind (in Name n)
+ raises (NotFound, CannotProceed, InvalidName);
+ // Remove the name binding from the context. When compound
+ // names are used, unbind is defined as follows: ctx->unbind
+ // (<c1; c2; cn>) = (ctx->resolve (<c1; c2; cn-1>))->unbind
+ // (<cn>)
+
+ // = Creating Naming Contexts.
+
+ NamingContext new_context ();
+ // This operation returns a new naming context implemented by
+ // the same naming server in which the operation was invoked.
+ // The context is not bound.
+
+ NamingContext bind_new_context (in Name n)
+ raises (NotFound, AlreadyBound, CannotProceed, InvalidName);
+ // This operation creates a new context and binds it to the name
+ // supplied as an argument. The newly-created context is
+ // implemented by the same server as the context in which it was
+ // bound (the name argument excluding the last component).
+
+ // = Deleting contexts.
+
+ void destroy ()
+ raises (NotEmpty);
+ // Delete the naming context. NOTE: the user should <unbind>
+ // any bindings in which the given context is bound to some
+ // names before invoking <destroy> operation on it.
+
+
+ // = Listing the naming context.
+
+ void list (in unsigned long how_many,
+ out BindingList bl,
+ out BindingIterator bi);
+ // Returns at most the requested number of bindings <how_many>
+ // in <bl>. If the naming context contains additional bindings,
+ // they are returned with a BindingIterator. In the naming
+ // context does not contain any additional bindings <bi>
+ // returned as null.
+ };
+
+ interface BindingIterator
+ {
+ // = TITLE
+ // Interface for iterating over Bindings returned with the
+ // <list> operation.
+
+ boolean next_one (out Binding b);
+ // This operation returns the next binding. If there are no
+ // more bindings false is returned.
+
+ boolean next_n (in unsigned long how_many,
+ out BindingList bl);
+ // This operation returns at most the requested number of
+ // bindings.
+
+ void destroy ();
+ // This operation destroys the iterator.
+ };
+
+ interface NamingContextExt : NamingContext
+ {
+ // = TITLE
+ // Interface for providing operations required to use URLs and
+ // stringified names.
+ //
+ // Reference to: Document orbos/98-10-11 (Interoperable Naming Joint Revised Submission)
+ // Joint Submission by BEA Systems, DSTC, IONA, and Inprise
+
+ typedef string StringName;
+ // Stringified form of a Name.
+
+ typedef string Address;
+ // URL<address> such as myhost.xyz.com.
+
+ typedef string URLString;
+ // Stringified form of a URL<address> componoent.
+
+ StringName to_string (in Name n)
+ raises (InvalidName);
+ // This operation accepts a Name and returns a stringified
+ // name. If the name is invalid, an InvalidName exception is
+ // raised.
+
+ Name to_name (in StringName sn)
+ raises (InvalidName);
+ // This operation returns a Name. If the input stringified
+ // name is syntactically malformed or violates an
+ // implementation limit, an InvalidName exception is
+ // raised.
+
+ exception InvalidAddress {
+ // = TITLE
+ // Indicates that the URL<address> is invalid.
+ };
+
+ URLString to_url (in Address addr,
+ in StringName sn)
+ raises (InvalidAddress, InvalidName);
+ //
+ // It performs any escapes necessary on the stringified name
+ // and returns a fully formed URL string. An exception is
+ // raised if either the protocol or name parameters are invalid.
+
+
+ Object resolve_str (in StringName n)
+ raises (NotFound, CannotProceed, InvalidName);
+ //
+ // This is similar to <resolve> as in the
+ // CosNaming::NamingContext interface, except that it accepts
+ // a stringified name as an argument instead of a Name.
+
+ };
+};
+
+#endif /* TAO_NAMING_IDL */
diff --git a/TAO/orbsvcs/orbsvcs/CosNaming.mpc b/TAO/orbsvcs/orbsvcs/CosNaming.mpc
new file mode 100644
index 00000000000..991012a2a9f
--- /dev/null
+++ b/TAO/orbsvcs/orbsvcs/CosNaming.mpc
@@ -0,0 +1,48 @@
+// -*- MPC -*-
+// $Id$
+
+project(CosNaming_IDL) : orbsvcslib, core, tao_versioning_idl_defaults {
+ custom_only = 1
+ idlflags += -Wb,stub_export_macro=TAO_Naming_Export -Wb,stub_export_include=orbsvcs/Naming/naming_export.h -Wb,skel_export_macro=TAO_Naming_Skel_Export -Wb,skel_export_include=orbsvcs/Naming/naming_skel_export.h
+
+ IDL_Files {
+ CosNaming.idl
+ }
+}
+
+project(CosNaming) : orbsvcslib, core {
+ sharedname = TAO_CosNaming
+ dynamicflags = TAO_NAMING_BUILD_DLL
+ tagchecks += Naming
+ after += CosNaming_IDL
+
+ IDL_Files {
+ }
+
+ Source_Files {
+ CosNamingC.cpp
+ Naming/Naming_Client.cpp
+ }
+
+ Header_Files {
+ CosNamingC.h
+ Naming/Naming_Client.h
+ Naming/naming_export.h
+ }
+
+ Inline_Files {
+ CosNamingC.inl
+ }
+
+ Template_Files {
+ }
+
+ // explicit Resource_Files to avoid including _Skel & _Serv rc files.
+ Resource_Files{
+ CosNaming.rc
+ }
+
+ Pkgconfig_Files {
+ TAO_CosNaming.pc.in
+ }
+}
diff --git a/TAO/orbsvcs/orbsvcs/CosNaming.rc b/TAO/orbsvcs/orbsvcs/CosNaming.rc
new file mode 100644
index 00000000000..f588ff31b1b
--- /dev/null
+++ b/TAO/orbsvcs/orbsvcs/CosNaming.rc
@@ -0,0 +1,30 @@
+#include "..\..\tao\Version.h"
+
+1 VERSIONINFO
+ FILEVERSION TAO_MAJOR_VERSION,TAO_MINOR_VERSION,TAO_BETA_VERSION,0
+ PRODUCTVERSION TAO_MAJOR_VERSION,TAO_MINOR_VERSION,TAO_BETA_VERSION,0
+ FILEFLAGSMASK 0x3fL
+ FILEFLAGS 0x0L
+ FILEOS 0x4L
+ FILETYPE 0x1L
+ FILESUBTYPE 0x0L
+BEGIN
+ BLOCK "StringFileInfo"
+ BEGIN
+ BLOCK "040904B0"
+ BEGIN
+ VALUE "FileDescription", "CosNaming\0"
+ VALUE "FileVersion", TAO_VERSION "\0"
+ VALUE "InternalName", "TAO_CosNamingDLL\0"
+ VALUE "LegalCopyright", "\0"
+ VALUE "LegalTrademarks", "\0"
+ VALUE "OriginalFilename", "TAO_CosNaming.DLL\0"
+ VALUE "ProductName", "ORBSVCS\0"
+ VALUE "ProductVersion", TAO_VERSION "\0"
+ END
+ END
+ BLOCK "VarFileInfo"
+ BEGIN
+ VALUE "Translation", 0x409, 1200
+ END
+END
diff --git a/TAO/orbsvcs/orbsvcs/CosNaming_Serv.mpc b/TAO/orbsvcs/orbsvcs/CosNaming_Serv.mpc
new file mode 100644
index 00000000000..02f81cd7b59
--- /dev/null
+++ b/TAO/orbsvcs/orbsvcs/CosNaming_Serv.mpc
@@ -0,0 +1,53 @@
+// -*- MPC -*-
+//
+// $Id$
+
+project(CosNaming_Serv) : orbsvcslib, core, naming_skel, messaging_optional, svc_utils, iortable {
+ avoids += ace_for_tao // Requires MMAP_Memory_Pool
+ sharedname = TAO_CosNaming_Serv
+ dynamicflags = TAO_NAMING_SERV_BUILD_DLL
+ tagchecks += Naming
+
+ IDL_Files {
+ }
+
+ Source_Files(ORBSVCS_COMPONENTS) {
+ Naming {
+ Naming/Entries.cpp
+ Naming/Flat_File_Persistence.cpp
+ Naming/Hash_Naming_Context.cpp
+ Naming/Naming_Context_Interface.cpp
+ Naming/Naming_Loader.cpp
+ Naming/Naming_Server.cpp
+ Naming/Persistent_Context_Index.cpp
+ Naming/Persistent_Entries.cpp
+ Naming/Persistent_Naming_Context.cpp
+ Naming/Storable.cpp
+ Naming/Storable_Naming_Context.cpp
+ Naming/Storable_Naming_Context_Activator.cpp
+ Naming/Transient_Naming_Context.cpp
+ }
+ }
+
+ Header_Files {
+ Naming/naming_serv_export.h
+ Naming/nsconf.h
+ }
+
+ Template_Files {
+ }
+
+ Pkgconfig_Files {
+ TAO_CosNaming_Serv.pc.in
+ }
+
+ verbatim(gnuace, local) {
+ ## The optimizer in cxx (as of V6.5-014) is broken. Evidence can
+ ## be found in the iterator portion of Simple_Naming test
+ ifeq ($(CXX), cxx)
+ ifeq ($(findstring Tru64, $(ACE_DU_SUBVERSION)), Tru64)
+ OCFLAGS += -O0
+ endif
+ endif
+ }
+}
diff --git a/TAO/orbsvcs/orbsvcs/CosNaming_Serv.rc b/TAO/orbsvcs/orbsvcs/CosNaming_Serv.rc
new file mode 100644
index 00000000000..8a78d7cceae
--- /dev/null
+++ b/TAO/orbsvcs/orbsvcs/CosNaming_Serv.rc
@@ -0,0 +1,30 @@
+#include "..\..\tao\Version.h"
+
+1 VERSIONINFO
+ FILEVERSION TAO_MAJOR_VERSION,TAO_MINOR_VERSION,TAO_BETA_VERSION,0
+ PRODUCTVERSION TAO_MAJOR_VERSION,TAO_MINOR_VERSION,TAO_BETA_VERSION,0
+ FILEFLAGSMASK 0x3fL
+ FILEFLAGS 0x0L
+ FILEOS 0x4L
+ FILETYPE 0x1L
+ FILESUBTYPE 0x0L
+BEGIN
+ BLOCK "StringFileInfo"
+ BEGIN
+ BLOCK "040904B0"
+ BEGIN
+ VALUE "FileDescription", "CosNaming_Serv\0"
+ VALUE "FileVersion", TAO_VERSION "\0"
+ VALUE "InternalName", "TAO_CosNaming_ServDLL\0"
+ VALUE "LegalCopyright", "\0"
+ VALUE "LegalTrademarks", "\0"
+ VALUE "OriginalFilename", "TAO_CosNaming_Serv.DLL\0"
+ VALUE "ProductName", "ORBSVCS\0"
+ VALUE "ProductVersion", TAO_VERSION "\0"
+ END
+ END
+ BLOCK "VarFileInfo"
+ BEGIN
+ VALUE "Translation", 0x409, 1200
+ END
+END
diff --git a/TAO/orbsvcs/orbsvcs/CosNaming_Skel.mpc b/TAO/orbsvcs/orbsvcs/CosNaming_Skel.mpc
new file mode 100644
index 00000000000..c5859a1c573
--- /dev/null
+++ b/TAO/orbsvcs/orbsvcs/CosNaming_Skel.mpc
@@ -0,0 +1,35 @@
+// -*- MPC -*-
+// $Id$
+
+project(CosNaming_Skel) : orbsvcslib, core, naming, portableserver {
+ sharedname = TAO_CosNaming_Skel
+ dynamicflags = TAO_NAMING_SKEL_BUILD_DLL
+ tagchecks += Naming
+
+ IDL_Files {
+ }
+
+ Source_Files {
+ CosNamingS.cpp
+ }
+
+ Header_Files {
+ CosNamingS.h
+ CosNamingS_T.h
+ Naming/naming_skel_export.h
+ }
+
+ Inline_Files {
+ CosNamingS.inl
+ CosNamingS_T.inl
+ }
+
+ Template_Files {
+ CosNamingS_T.cpp
+ }
+
+ Pkgconfig_Files {
+ TAO_CosNaming_Skel.pc.in
+ }
+}
+
diff --git a/TAO/orbsvcs/orbsvcs/CosNaming_Skel.rc b/TAO/orbsvcs/orbsvcs/CosNaming_Skel.rc
new file mode 100644
index 00000000000..4e11b908403
--- /dev/null
+++ b/TAO/orbsvcs/orbsvcs/CosNaming_Skel.rc
@@ -0,0 +1,30 @@
+#include "..\..\tao\Version.h"
+
+1 VERSIONINFO
+ FILEVERSION TAO_MAJOR_VERSION,TAO_MINOR_VERSION,TAO_BETA_VERSION,0
+ PRODUCTVERSION TAO_MAJOR_VERSION,TAO_MINOR_VERSION,TAO_BETA_VERSION,0
+ FILEFLAGSMASK 0x3fL
+ FILEFLAGS 0x0L
+ FILEOS 0x4L
+ FILETYPE 0x1L
+ FILESUBTYPE 0x0L
+BEGIN
+ BLOCK "StringFileInfo"
+ BEGIN
+ BLOCK "040904B0"
+ BEGIN
+ VALUE "FileDescription", "CosNaming_Skel\0"
+ VALUE "FileVersion", TAO_VERSION "\0"
+ VALUE "InternalName", "TAO_CosNaming_SkelDLL\0"
+ VALUE "LegalCopyright", "\0"
+ VALUE "LegalTrademarks", "\0"
+ VALUE "OriginalFilename", "TAO_CosNaming_Skel.DLL\0"
+ VALUE "ProductName", "ORBSVCS\0"
+ VALUE "ProductVersion", TAO_VERSION "\0"
+ END
+ END
+ BLOCK "VarFileInfo"
+ BEGIN
+ VALUE "Translation", 0x409, 1200
+ END
+END
diff --git a/TAO/orbsvcs/orbsvcs/CosNotification.idl b/TAO/orbsvcs/orbsvcs/CosNotification.idl
new file mode 100644
index 00000000000..ae9ed5a4e9b
--- /dev/null
+++ b/TAO/orbsvcs/orbsvcs/CosNotification.idl
@@ -0,0 +1,390 @@
+/**
+ * @file CosNotification.idl
+ *
+ * @brief Define the CosNotification module
+ *
+ * $Id$
+ *
+ * @author Pradeep Gore <pradeep@cs.wustl.edu>
+ */
+
+#ifndef _COS_NOTIFICATION_IDL_
+#define _COS_NOTIFICATION_IDL_
+
+#pragma prefix "omg.org"
+
+/**
+ * @namespace CosNotification
+ *
+ * @brief Define basic data structures used by the Notification
+ * Service
+ */
+module CosNotification
+{
+ /// Dummy typedef for strings, if the intent was to support I18N
+ /// strings the spec should have used wstring
+ typedef string Istring;
+
+ /// Properties are named using a string
+ typedef Istring PropertyName;
+
+ /// Property values are stored using anys
+ typedef any PropertyValue;
+
+ /**
+ * @struct Property
+ *
+ * @brief Define a name/value pair.
+ *
+ * Events are described using named/value sequences, this structure
+ * defines the name/value pair.
+ */
+ struct Property {
+ /// The name
+ PropertyName name;
+ /// The value
+ PropertyValue value;
+ };
+
+ /// Define a sequence of properties.
+ typedef sequence<Property> PropertySeq;
+
+ //@{
+ /**
+ * @name Different kinds of property sequences
+ *
+ * @brief The following are all sequences of Property, but
+ * serve different purposes.
+ */
+ /// Property sequence used for optional header fields
+ typedef PropertySeq OptionalHeaderFields;
+
+ /// Property sequence used for the event body that can be used
+ /// in filtering
+ typedef PropertySeq FilterableEventBody;
+
+ /// Specify quality of service properties
+ typedef PropertySeq QoSProperties;
+
+ /// Specify administrative properties
+ typedef PropertySeq AdminProperties;
+ //@}
+
+ /**
+ * @struct _EventType
+ *
+ * @brief Define event type names.
+ *
+ * Different vertical industries (domains) can define well-known
+ * events (event_types). This structure is used for that purpose
+ */
+ struct _EventType {
+ /// The name of the vertical industry defining the event type.
+ string domain_name;
+ /// The type of event.
+ string type_name;
+ };
+ /// A sequence of event types
+ typedef sequence<_EventType> EventTypeSeq;
+
+ /**
+ * @struct PropertyRange
+ *
+ * @brief A structure to define property ranges.
+ *
+ */
+ struct PropertyRange {
+ /// Lower end of the range
+ PropertyValue low_val;
+ /// High end of the range
+ PropertyValue high_val;
+ };
+
+ /**
+ * @struct NamedPropertyRange
+ *
+ * @brief A named property range
+ */
+ struct NamedPropertyRange {
+ /// The name
+ PropertyName name;
+ /// The range
+ PropertyRange range;
+ };
+ /// A sequence of named property ranges
+ typedef sequence<NamedPropertyRange> NamedPropertyRangeSeq;
+
+ /**
+ * @enum QoSError_code
+ *
+ * @brief Describe QoS errors.
+ */
+ enum QoSError_code {
+ /// The application has requested an unsupported QoS property
+ UNSUPPORTED_PROPERTY,
+ /// The application has requested a QoS property that, though
+ /// supported, cannot be set in the requested scope.
+ UNAVAILABLE_PROPERTY,
+ /// The application has requested a QoS property with an
+ /// unsupported value.
+ UNSUPPORTED_VALUE,
+ /// The application has requested a QoS property with a supported
+ /// value, but unavailable at the requeste scope.
+ UNAVAILABLE_VALUE,
+ /// The property name is unknown or not recognized.
+ BAD_PROPERTY,
+ /// The value type for the requested property is invalid
+ BAD_TYPE,
+ /// The value for the requested property is illegal
+ BAD_VALUE
+ };
+
+ /**
+ * @struct PropertyError
+ *
+ * @brief Describe the problems detected with an application
+ * requested QoS.
+ *
+ * If there are any problems with an application request for QoS the
+ * problems are raised using an exception that contains all the
+ * problems, and a description of the valid values (if they apply).
+ */
+ struct PropertyError {
+ /// Property error description
+ QoSError_code code;
+ /// Property name with a problem
+ PropertyName name;
+ /// Valid range for that property in the Notification Service
+ /// implementation
+ PropertyRange available_range;
+ };
+ /// List of property errors.
+ typedef sequence<PropertyError> PropertyErrorSeq;
+
+ /**
+ * @exception UnsupportedQoS
+ *
+ * @brief Exception used to describe problems with one or more QoS
+ * requests
+ *
+ */
+ exception UnsupportedQoS {
+ /// Complete description of the properties in error
+ PropertyErrorSeq qos_err;
+ };
+
+ /**
+ * @exception UnsupportedAdmin
+ *
+ * @brief Exception used to describe problems with one or more Admin
+ * properties
+ */
+ exception UnsupportedAdmin {
+ /// The complete description of the invalid properties.
+ PropertyErrorSeq admin_err;
+ };
+
+ /**
+ * @struct FixedEventHeader
+ *
+ * @brief Define the 'fixed' part of the event header
+ */
+ struct FixedEventHeader {
+ /// The event type
+ _EventType event_type;
+ /// A (possibly unique) name for the particular event
+ string event_name;
+ };
+
+ /**
+ * @struct EventHeader
+ *
+ * @brief Complete event header
+ */
+ struct EventHeader {
+ /// The fixed part of the event header
+ FixedEventHeader fixed_header;
+ /// The optional part
+ OptionalHeaderFields variable_header;
+ };
+
+ /**
+ * @struct StructuredEvent
+ *
+ * @brief Define structured events
+ */
+ struct StructuredEvent {
+ /// The header
+ EventHeader header;
+ /// The part of the body used for filtering
+ FilterableEventBody filterable_data;
+ /// The part of the body not used for filtering
+ any remainder_of_body;
+ };
+ /// Sequence of events, for batch processing
+ typedef sequence<StructuredEvent> EventBatch;
+
+ //@{
+ /**
+ * @name Constants for QoS Properties
+ *
+ * The following constant declarations define the standard QoS
+ * property names and the associated values each property can take
+ * on. The name/value pairs for each standard property are grouped,
+ * beginning with a string constant defined for the property name,
+ * followed by the values the property can take on.
+ */
+
+ const string EventReliability = "EventReliability";
+ const short BestEffort = 0;
+ const short Persistent = 1;
+
+ /// Can take on the same values as EventReliability
+ const string ConnectionReliability = "ConnectionReliability";
+
+ const string Priority = "Priority";
+ const short LowestPriority = -32767;
+ const short HighestPriority = 32767;
+ const short DefaultPriority = 0;
+
+ /// StartTime takes a value of type TimeBase::UtcT.
+ const string StartTime = "StartTime";
+
+ /// StopTime takes a value of type TimeBase::UtcT.
+ const string StopTime = "StopTime";
+
+ /// Timeout takes on a value of type TimeBase::TimeT
+ const string Timeout = "Timeout";
+
+ const string OrderPolicy = "OrderPolicy";
+ const short AnyOrder = 0;
+ const short FifoOrder = 1;
+ const short PriorityOrder = 2;
+ const short DeadlineOrder = 3;
+
+ /// DiscardPolicy takes on the same values as OrderPolicy, plus
+ const string DiscardPolicy = "DiscardPolicy";
+ const short LifoOrder = 4;
+
+ /// MaximumBatchSize takes on a value of type long
+ const string MaximumBatchSize = "MaximumBatchSize";
+
+ /// PacingInterval takes on a value of type TimeBase::TimeT
+ const string PacingInterval = "PacingInterval";
+
+ /// StartTimeSupported takes on a boolean value
+ const string StartTimeSupported = "StartTimeSupported";
+
+ /// StopTimeSupported takes on a boolean value
+ const string StopTimeSupported = "StopTimeSupported";
+
+ /// MaxEventsPerConsumer takes on a value of type long
+ const string MaxEventsPerConsumer = "MaxEventsPerConsumer";
+
+ //@}
+
+ /**
+ * @interface QoSAdmin
+ *
+ * @brief Interface used to control the QoS properties of an Event
+ * Service components (Channel, Proxy, etc.)
+ *
+ * QoS properties of a channel can be set at different levels,
+ * including the proxies, the ConsumerAdmin and the SupplierAdmin
+ * objects. Each one of those components offers this interface to
+ * allow control over the properties.
+ */
+ interface QoSAdmin {
+ /// Get the current QoS properties
+ /**
+ * The operation returns the properties set:
+ * - At the level queried
+ * - Not set at the level queried but set at a higher-level
+ * - Not set at all but having a default value.
+ */
+ QoSProperties get_qos();
+
+ /// Set the QoS properties
+ /**
+ * @param qos The requested QoS properties
+ * @throws UnsupportedQoS if the requested QoS cannot be
+ * implemented or is invalid. The exception contents describe
+ * the problem(s) in detail.
+ */
+ void set_qos ( in QoSProperties qos)
+ raises ( UnsupportedQoS );
+
+ /// Validate a set of QoS properties
+ /**
+ * @param required_qos the list of properties requested by the
+ * application
+ * @param available_qos If the properties are supported this
+ * argument returns a list of any other properties that
+ * could also be set.
+ * @throws UnsupportedQoS if the requested QoS cannot be
+ * implemented or is invalid. The exception contents describe
+ * the problem(s) in detail.
+ */
+ void validate_qos (in QoSProperties required_qos,
+ out NamedPropertyRangeSeq available_qos )
+ raises ( UnsupportedQoS );
+ };
+
+ //@{
+ /**
+ * @name Constants for Admin Properties
+ *
+ * Admin properties are defined in similar manner as QoS
+ * properties. The only difference is that these properties are
+ * related to channel administration policies, as opposed message
+ * quality of service
+ */
+ /// MaxQueueLength takes on a value of type long
+ const string MaxQueueLength = "MaxQueueLength";
+
+ /// MaxConsumers takes on a value of type long
+ const string MaxConsumers = "MaxConsumers";
+
+ /// MaxSuppliers takes on a value of type long
+ const string MaxSuppliers = "MaxSuppliers";
+
+ /// RejectNewEvents takes on a value of type Boolean
+ const string RejectNewEvents = "RejectNewEvents";
+ //@}
+
+ /**
+ * @interface AdminPropertiesAdmin
+ *
+ * @brief Define the interface to manipulate the Admin properties of
+ * a Notification Service components
+ *
+ * Several Notification Service components have Admin properties,
+ * including the Event Channel, its ConsumerAdmin and SupplierAdmin
+ * objects as well as the proxies. This interface is used to
+ * control the Admin properties of each one of those components.
+ */
+ interface AdminPropertiesAdmin {
+ /// Get the Admin properties
+ /**
+ * The operation returns the properties set:
+ * - At the level queried
+ * - Not set at the level queried but set at a higher-level
+ * - Not set at all but having a default value.
+ */
+ AdminProperties get_admin();
+
+ /// Set the Admin properities
+ /**
+ * @param admin The list of Admin properties requested
+ * @throws UnsupportedAdmin if the requested admin properties
+ * cannot be implemented or are invalid
+ */
+ void set_admin (in AdminProperties admin)
+ raises ( UnsupportedAdmin);
+ };
+
+};
+
+#pragma prefix ""
+
+#endif /* _COS_NOTIFICATION_IDL_ */
diff --git a/TAO/orbsvcs/orbsvcs/CosNotification.mpc b/TAO/orbsvcs/orbsvcs/CosNotification.mpc
new file mode 100644
index 00000000000..87fab05f21c
--- /dev/null
+++ b/TAO/orbsvcs/orbsvcs/CosNotification.mpc
@@ -0,0 +1,267 @@
+// -*- MPC -*-
+// $Id$
+
+project(CosNotification_IDL) : orbsvcslib, core, event, tao_versioning_idl_defaults {
+ custom_only = 1
+ idlflags += -Wb,stub_export_macro=TAO_Notify_Export -Wb,stub_export_include=orbsvcs/Notify/notify_export.h -Wb,skel_export_macro=TAO_Notify_Skel_Export -Wb,skel_export_include=orbsvcs/Notify/notify_skel_export.h
+
+ IDL_Files {
+ CosNotification.idl
+ CosNotifyComm.idl
+ CosNotifyFilter.idl
+ CosNotifyChannelAdmin.idl
+ NotifyExt.idl
+ Event_Forwarder.idl
+ }
+}
+
+project(CosNotification) : orbsvcslib, core, event {
+ sharedname = TAO_CosNotification
+ dynamicflags = TAO_NOTIFY_BUILD_DLL
+ tagchecks += Notify
+ after += CosNotification_IDL
+
+ IDL_Files {
+ }
+
+ Source_Files {
+ CosNotificationC.cpp
+ CosNotifyCommC.cpp
+ CosNotifyFilterC.cpp
+ CosNotifyChannelAdminC.cpp
+ NotifyExtC.cpp
+ Event_ForwarderC.cpp
+ Notify/Notify_Extensions.cpp
+ }
+
+ Header_Files {
+ CosNotificationC.h
+ CosNotifyCommC.h
+ CosNotifyFilterC.h
+ CosNotifyChannelAdminC.h
+ NotifyExtC.h
+ Event_ForwarderC.h
+ Notify/Notify_Extensions.h
+ Notify/notify_export.h
+ }
+
+ Inline_Files {
+ CosNotificationC.inl
+ CosNotifyCommC.inl
+ CosNotifyFilterC.inl
+ CosNotifyChannelAdminC.inl
+ NotifyExtC.inl
+ Event_ForwarderC.inl
+ }
+
+ Template_Files {
+ }
+
+ Resource_Files {
+ CosNotification.rc
+ }
+
+ Pkgconfig_Files {
+ TAO_CosNotification.pc.in
+ }
+}
+
+
+project(CosNotification_Skel) : orbsvcslib, core, notification, event_skel, portableserver {
+ sharedname = TAO_CosNotification_Skel
+ dynamicflags = TAO_NOTIFY_SKEL_BUILD_DLL
+ tagchecks += Notify
+
+ IDL_Files {
+ }
+
+ Source_Files {
+ CosNotificationS.cpp
+ CosNotifyCommS.cpp
+ CosNotifyFilterS.cpp
+ CosNotifyChannelAdminS.cpp
+ NotifyExtS.cpp
+ Event_ForwarderS.cpp
+ }
+
+ Header_Files {
+ CosNotificationS.h
+ CosNotifyCommS.h
+ CosNotifyFilterS.h
+ CosNotifyChannelAdminS.h
+ NotifyExtS.h
+ Event_ForwarderS.h
+
+ CosNotificationS_T.h
+ CosNotifyCommS_T.h
+ CosNotifyFilterS_T.h
+ CosNotifyChannelAdminS_T.h
+ NotifyExtS_T.h
+ Event_ForwarderS_T.h
+
+ Notify/notify_skel_export.h
+ }
+
+ Inline_Files {
+ CosNotificationS.inl
+ CosNotifyCommS.inl
+ CosNotifyFilterS.inl
+ CosNotifyChannelAdminS.inl
+ NotifyExtS.inl
+ Event_ForwarderS.inl
+
+ CosNotificationS_T.inl
+ CosNotifyCommS_T.inl
+ CosNotifyFilterS_T.inl
+ CosNotifyChannelAdminS_T.inl
+ NotifyExtS_T.inl
+ Event_ForwarderS_T.inl
+ }
+
+ Template_Files {
+ CosNotificationS_T.cpp
+ CosNotifyCommS_T.cpp
+ CosNotifyFilterS_T.cpp
+ CosNotifyChannelAdminS_T.cpp
+ NotifyExtS_T.cpp
+ Event_ForwarderS_T.cpp
+ }
+
+ Pkgconfig_Files {
+ TAO_CosNotification_Skel.pc.in
+ }
+}
+
+project(CosNotification_Serv) : orbsvcslib, svc_utils, core, notification_skel, dynamicany, etcl{
+ sharedname = TAO_CosNotification_Serv
+ dynamicflags = TAO_NOTIFY_SERV_BUILD_DLL
+ tagchecks += Notify
+
+ IDL_Files {
+ }
+
+ // The following could be simplified if RT stuff was
+ // put into another subdirectory.
+
+ Source_Files {
+ Notify/Admin.cpp
+ Notify/AdminProperties.cpp
+ Notify/Bit_Vector.cpp
+ Notify/Buffering_Strategy.cpp
+ Notify/Builder.cpp
+ Notify/Consumer.cpp
+ Notify/ConsumerAdmin.cpp
+ Notify/CosNotify_Initializer.cpp
+ Notify/CosNotify_Service.cpp
+ Notify/Default_Factory.cpp
+ Notify/Delivery_Request.cpp
+ Notify/ETCL_Filter.cpp
+ Notify/ETCL_FilterFactory.cpp
+ Notify/Event.cpp
+ Notify/EventChannel.cpp
+ Notify/EventChannelFactory.cpp
+ Notify/EventType.cpp
+ Notify/EventTypeSeq.cpp
+ Notify/Event_Manager.cpp
+ Notify/Event_Persistence_Factory.cpp
+ Notify/FilterAdmin.cpp
+ Notify/ID_Factory.cpp
+ Notify/Method_Request.cpp
+ Notify/Method_Request_Dispatch.cpp
+ Notify/Method_Request_Event.cpp
+ Notify/Method_Request_Lookup.cpp
+ Notify/Method_Request_Shutdown.cpp
+ Notify/Method_Request_Updates.cpp
+ Notify/Name_Value_Pair.cpp
+ Notify/Notify_Constraint_Interpreter.cpp
+ Notify/Notify_Constraint_Visitors.cpp
+ Notify/Notify_Default_Collection_Factory.cpp
+ Notify/Notify_Default_CO_Factory.cpp
+ Notify/Notify_Default_EMO_Factory.cpp
+ Notify/Notify_Default_POA_Factory.cpp
+ Notify/Notify_EventChannelFactory_i.cpp
+ Notify/Object.cpp
+ Notify/Peer.cpp
+ Notify/Persistent_File_Allocator.cpp
+ Notify/POA_Helper.cpp
+ Notify/Properties.cpp
+ Notify/PropertySeq.cpp
+ Notify/Property_Boolean.cpp
+ Notify/Proxy.cpp
+ Notify/ProxyConsumer.cpp
+ Notify/ProxySupplier.cpp
+ Notify/QoSProperties.cpp
+ Notify/Random_File.cpp
+ Notify/Reactive_Task.cpp
+ Notify/Refcountable.cpp
+ Notify/Reconnection_Registry.cpp
+ Notify/Routing_Slip.cpp
+ Notify/Routing_Slip_Persistence_Manager.cpp
+ Notify/Routing_Slip_Queue.cpp
+ Notify/Service.cpp
+ Notify/Subscription_Change_Worker.cpp
+ Notify/Supplier.cpp
+ Notify/SupplierAdmin.cpp
+ Notify/Standard_Event_Persistence.cpp
+ Notify/ThreadPool_Task.cpp
+ Notify/Timer_Queue.cpp
+ Notify/Timer_Reactor.cpp
+ Notify/Topology_Loader.cpp
+ Notify/Topology_Object.cpp
+ Notify/Topology_Saver.cpp
+ Notify/Worker_Task.cpp
+ Notify/Any/AnyEvent.cpp
+ Notify/Any/CosEC_ProxyPushConsumer.cpp
+ Notify/Any/CosEC_ProxyPushSupplier.cpp
+ Notify/Any/ProxyPushConsumer.cpp
+ Notify/Any/ProxyPushSupplier.cpp
+ Notify/Any/PushConsumer.cpp
+ Notify/Any/PushSupplier.cpp
+ Notify/Sequence/SequenceProxyPushConsumer.cpp
+ Notify/Sequence/SequenceProxyPushSupplier.cpp
+ Notify/Sequence/SequencePushConsumer.cpp
+ Notify/Sequence/SequencePushSupplier.cpp
+ Notify/Structured/StructuredEvent.cpp
+ Notify/Structured/StructuredProxyPushConsumer.cpp
+ Notify/Structured/StructuredProxyPushSupplier.cpp
+ Notify/Structured/StructuredPushConsumer.cpp
+ Notify/Structured/StructuredPushSupplier.cpp
+ }
+
+ Header_Files {
+ Notify/notify_serv_export.h
+ }
+
+ Inline_Files {
+ }
+
+ Template_Files {
+ }
+
+ Pkgconfig_Files {
+ TAO_CosNotification_Serv.pc.in
+ }
+
+}
+
+project(CosNotification_Persist) : notification_serv, core, acexml {
+ sharedname = TAO_CosNotification_Persist
+ dynamicflags = TAO_NOTIFY_PERSIST_BUILD_DLL
+
+ IDL_Files {
+ }
+
+ Source_Files {
+ Notify/XML_*.cpp
+ }
+
+ Header_Files {
+ Notify/notify_persist_export.h
+ }
+
+ Inline_Files {
+ }
+
+ Template_Files {
+ }
+}
diff --git a/TAO/orbsvcs/orbsvcs/CosNotification.rc b/TAO/orbsvcs/orbsvcs/CosNotification.rc
new file mode 100644
index 00000000000..f39d9fe9699
--- /dev/null
+++ b/TAO/orbsvcs/orbsvcs/CosNotification.rc
@@ -0,0 +1,30 @@
+#include "..\..\tao\Version.h"
+
+1 VERSIONINFO
+ FILEVERSION TAO_MAJOR_VERSION,TAO_MINOR_VERSION,TAO_BETA_VERSION,0
+ PRODUCTVERSION TAO_MAJOR_VERSION,TAO_MINOR_VERSION,TAO_BETA_VERSION,0
+ FILEFLAGSMASK 0x3fL
+ FILEFLAGS 0x0L
+ FILEOS 0x4L
+ FILETYPE 0x1L
+ FILESUBTYPE 0x0L
+BEGIN
+ BLOCK "StringFileInfo"
+ BEGIN
+ BLOCK "040904B0"
+ BEGIN
+ VALUE "FileDescription", "CosNotification\0"
+ VALUE "FileVersion", TAO_VERSION "\0"
+ VALUE "InternalName", "TAO_CosNotificationDLL\0"
+ VALUE "LegalCopyright", "\0"
+ VALUE "LegalTrademarks", "\0"
+ VALUE "OriginalFilename", "TAO_CosNotification.DLL\0"
+ VALUE "ProductName", "ORBSVCS\0"
+ VALUE "ProductVersion", TAO_VERSION "\0"
+ END
+ END
+ BLOCK "VarFileInfo"
+ BEGIN
+ VALUE "Translation", 0x409, 1200
+ END
+END
diff --git a/TAO/orbsvcs/orbsvcs/CosNotification_Serv.rc b/TAO/orbsvcs/orbsvcs/CosNotification_Serv.rc
new file mode 100644
index 00000000000..c261ee4d0e9
--- /dev/null
+++ b/TAO/orbsvcs/orbsvcs/CosNotification_Serv.rc
@@ -0,0 +1,30 @@
+#include "..\..\tao\Version.h"
+
+1 VERSIONINFO
+ FILEVERSION TAO_MAJOR_VERSION,TAO_MINOR_VERSION,TAO_BETA_VERSION,0
+ PRODUCTVERSION TAO_MAJOR_VERSION,TAO_MINOR_VERSION,TAO_BETA_VERSION,0
+ FILEFLAGSMASK 0x3fL
+ FILEFLAGS 0x0L
+ FILEOS 0x4L
+ FILETYPE 0x1L
+ FILESUBTYPE 0x0L
+BEGIN
+ BLOCK "StringFileInfo"
+ BEGIN
+ BLOCK "040904B0"
+ BEGIN
+ VALUE "FileDescription", "CosNotification_Serv\0"
+ VALUE "FileVersion", TAO_VERSION "\0"
+ VALUE "InternalName", "TAO_CosNotification_ServDLL\0"
+ VALUE "LegalCopyright", "\0"
+ VALUE "LegalTrademarks", "\0"
+ VALUE "OriginalFilename", "TAO_CosNotification_Serv.DLL\0"
+ VALUE "ProductName", "ORBSVCS\0"
+ VALUE "ProductVersion", TAO_VERSION "\0"
+ END
+ END
+ BLOCK "VarFileInfo"
+ BEGIN
+ VALUE "Translation", 0x409, 1200
+ END
+END
diff --git a/TAO/orbsvcs/orbsvcs/CosNotification_Skel.rc b/TAO/orbsvcs/orbsvcs/CosNotification_Skel.rc
new file mode 100644
index 00000000000..534ac2e6d2c
--- /dev/null
+++ b/TAO/orbsvcs/orbsvcs/CosNotification_Skel.rc
@@ -0,0 +1,30 @@
+#include "..\..\tao\Version.h"
+
+1 VERSIONINFO
+ FILEVERSION TAO_MAJOR_VERSION,TAO_MINOR_VERSION,TAO_BETA_VERSION,0
+ PRODUCTVERSION TAO_MAJOR_VERSION,TAO_MINOR_VERSION,TAO_BETA_VERSION,0
+ FILEFLAGSMASK 0x3fL
+ FILEFLAGS 0x0L
+ FILEOS 0x4L
+ FILETYPE 0x1L
+ FILESUBTYPE 0x0L
+BEGIN
+ BLOCK "StringFileInfo"
+ BEGIN
+ BLOCK "040904B0"
+ BEGIN
+ VALUE "FileDescription", "CosNotification_Skel\0"
+ VALUE "FileVersion", TAO_VERSION "\0"
+ VALUE "InternalName", "TAO_CosNotification_SkelDLL\0"
+ VALUE "LegalCopyright", "\0"
+ VALUE "LegalTrademarks", "\0"
+ VALUE "OriginalFilename", "TAO_CosNotification_Skel.DLL\0"
+ VALUE "ProductName", "ORBSVCS\0"
+ VALUE "ProductVersion", TAO_VERSION "\0"
+ END
+ END
+ BLOCK "VarFileInfo"
+ BEGIN
+ VALUE "Translation", 0x409, 1200
+ END
+END
diff --git a/TAO/orbsvcs/orbsvcs/CosNotifyChannelAdmin.idl b/TAO/orbsvcs/orbsvcs/CosNotifyChannelAdmin.idl
new file mode 100644
index 00000000000..b792ae547ff
--- /dev/null
+++ b/TAO/orbsvcs/orbsvcs/CosNotifyChannelAdmin.idl
@@ -0,0 +1,1027 @@
+/**
+ * @file CosNotifyChannelAdmin.idl
+ *
+ * @brief Define the CosNotifyChannel module
+ *
+ * $Id$
+ *
+ * This module is taken from the standard CORBA Notification Service
+ * 1.0, as described in:
+ *
+ * http://www.omg.org/technology/documents/formal/notification_service.htm
+ *
+ * In particular the following two documents were used:
+ * formal/2000-06-20
+ * formal/01-03-03
+ *
+ * @author Pradeep Gore <pradeep@cs.wustl.edu>
+ */
+
+#ifndef _COS_NOTIFY_CHANNEL_ADMIN_IDL_
+#define _COS_NOTIFY_CHANNEL_ADMIN_IDL_
+
+#include "CosNotification.idl"
+#include "CosNotifyFilter.idl"
+#include "CosNotifyComm.idl"
+#include "CosEventChannelAdmin.idl"
+
+#pragma prefix "omg.org"
+
+/**
+ * @namespace CosNotifyChannelAdmin
+ *
+ * @brief Defines the interfaces to connect and manipulate the
+ * Notification Service.
+ */
+module CosNotifyChannelAdmin
+{
+ /**
+ * @exception ConnectionAlreadyActive
+ *
+ * @brief Exception Raised if an attempt is made to resume a
+ * connection that has not been suspended.
+ */
+ exception ConnectionAlreadyActive {};
+
+ /**
+ * @exception ConnectionAlreadyInactive
+ *
+ * @brief Exception raised if an attempt is made to suspend a
+ * connection already suspended.
+ */
+ exception ConnectionAlreadyInactive {};
+
+ /**
+ * @exception NotConnected
+ *
+ * @brief Exception raised if an attempt is made to suspend or
+ * resume a proxy that has not been connected.
+ */
+ exception NotConnected {};
+
+ // Forward declarations
+ interface ConsumerAdmin;
+ interface SupplierAdmin;
+ interface EventChannel;
+ interface EventChannelFactory;
+
+ /**
+ * @enum ProxyType
+ *
+ * @brief Helper typedef to inspect the types of proxies connected
+ * to an EventChannel
+ */
+ enum ProxyType {
+ /// A push-style proxy that uses the 'any' format
+ PUSH_ANY,
+ /// A pull-style proxy that uses the 'any' format
+ PULL_ANY,
+ /// A push-style proxy that uses structured events
+ PUSH_STRUCTURED,
+ /// A pull-style proxy that uses structured events
+ PULL_STRUCTURED,
+ /// A push-style proxy that uses event batches
+ PUSH_SEQUENCE,
+ /// A pull-style proxy that uses event batches
+ PULL_SEQUENCE,
+ /// A typed, push-style proxy
+ PUSH_TYPED,
+ /// A typed, pull-style proxy
+ PULL_TYPED
+ };
+
+ /**
+ * @enum ObtainInfoMode
+ *
+ * @brief Define the modes to fetch subscriptions and publication
+ * lists from the Notification Service.
+ */
+ enum ObtainInfoMode {
+ /// Get all the current subscriptions/publications, do not send
+ /// updates to the peer
+ ALL_NOW_UPDATES_OFF,
+ /// Get all the current subscriptions/publications, send updates
+ /// to the peer
+ ALL_NOW_UPDATES_ON,
+ /// Do not get any of the current subscriptions/publications, do
+ /// not send updates to the peer either
+ NONE_NOW_UPDATES_OFF,
+ /// Do not get any of the current subscriptions/publications, but
+ /// send updates to the peer
+ NONE_NOW_UPDATES_ON
+ };
+
+ /**
+ * @interface ProxyConsumer
+ *
+ * @brief Defines the interface shared by all consumer proxies
+ *
+ * Consumer proxies are used by suppliers to provide events into the
+ * Notification Service, this interface captures the shared
+ * operations in all those proxies.
+ */
+ interface ProxyConsumer
+ : CosNotification::QoSAdmin
+ , CosNotifyFilter::FilterAdmin
+ {
+ /// The style and event format for this proxy
+ readonly attribute ProxyType MyType;
+
+ /// The SupplierAdmin this proxy belongs to
+ readonly attribute SupplierAdmin MyAdmin;
+
+ /// Get the list of event types that this proxy could potentially
+ /// forward to any consumer connected to the EventChannel
+ /**
+ * @param mode Describe how the subscriptions should be fetched
+ * @return The list of current subscriptions, if requested in the
+ * mode argument
+ */
+ CosNotification::EventTypeSeq obtain_subscription_types(
+ in ObtainInfoMode mode );
+
+ /// Validate a list of QoS properties for an event
+ /**
+ * Suppliers can provide events with specific QoS properties, the
+ * following operation allows suppliers to verify if a given set
+ * of QoS properties would be honored by the proxy.
+ *
+ * @param required_qos The QoS properties required by the supplier
+ * @param available_qos If the QoS properties required are
+ * supported this argument returns any other QoS properties that
+ * the application may set without breaking the proxy
+ * capabilities.
+ * @throws CosNotification::UnsupportedQoS if the QoS properties
+ * required cannot be supported. The exception describes the
+ * problems and any legal values in detail.
+ */
+ void validate_event_qos (
+ in CosNotification::QoSProperties required_qos,
+ out CosNotification::NamedPropertyRangeSeq available_qos)
+ raises (CosNotification::UnsupportedQoS);
+ };
+
+ /**
+ * @interface ProxySupplier
+ *
+ * @brief Defines the interface shared by all supplier proxies
+ *
+ * Supplier proxies are used by consumers to communicate with the
+ * Notification Service, this interface captures the shared
+ * operations in all those proxies.
+ */
+ interface ProxySupplier
+ : CosNotification::QoSAdmin
+ , CosNotifyFilter::FilterAdmin
+ {
+ /// The style and event format for this proxy
+ readonly attribute ProxyType MyType;
+
+ /// The ConsumerAdmin this proxy belongs to
+ readonly attribute ConsumerAdmin MyAdmin;
+
+ /// Get and set the mapping filter used to change the priority
+ /// property for this proxy.
+ /**
+ * The filter is initialized to the nil reference
+ */
+ attribute CosNotifyFilter::MappingFilter priority_filter;
+
+ /// Get and set the mapping filter used to change the lifetime
+ /// property for this proxy.
+ /**
+ * The filter is initialized to the nil reference
+ */
+ attribute CosNotifyFilter::MappingFilter lifetime_filter;
+
+ /// Get the list of event types that this proxy could potentially
+ /// forward to its connected supplier
+ /**
+ * @param mode Describe how the publications should be fetched
+ * @return The list of current subscriptions, if requested in the
+ * mode argument
+ */
+ CosNotification::EventTypeSeq obtain_offered_types(
+ in ObtainInfoMode mode );
+
+ /// Validate a list of QoS properties for an event
+ /**
+ * Applications send events with specific QoS properties, the
+ * following operation allows consumers to verify if a given set
+ * of QoS properties would be honored by the proxy.
+ *
+ * @param required_qos The QoS properties required by the supplier
+ * @param available_qos If the QoS properties required are
+ * supported this argument returns any other QoS properties that
+ * the application may set without breaking the proxy
+ * capabilities.
+ * @throws CosNotification::UnsupportedQoS if the QoS properties
+ * required cannot be supported. The exception describes the
+ * problems and any legal values in detail.
+ */
+ void validate_event_qos (
+ in CosNotification::QoSProperties required_qos,
+ out CosNotification::NamedPropertyRangeSeq available_qos)
+ raises (CosNotification::UnsupportedQoS);
+ };
+
+ /**
+ * @interface ProxyPushConsumer
+ *
+ * @brief Defines the interface provided for push-style suppliers
+ * using the 'any' event format.
+ */
+ interface ProxyPushConsumer
+ : ProxyConsumer
+ , CosNotifyComm::PushConsumer
+ {
+ /// Connect a supplier to the proxy
+ /**
+ * Suppliers cannot push events into a ProxyPushConsumer until
+ * this method is invoked.
+ *
+ * @param push_supplier the callback object used to inform the
+ * application if the event channel is destroyed. If the
+ * argument is nil no destroy notification is provided.
+ * @throws CosEventChannelAdmin::AlreadyConnected if the proxy is
+ * already connected, i.e. if this operation is invoked more than
+ * one time.
+ */
+ void connect_any_push_supplier (
+ in CosEventComm::PushSupplier push_supplier)
+ raises(CosEventChannelAdmin::AlreadyConnected);
+ };
+
+ /**
+ * @interface StructuredProxyPushConsumer
+ *
+ * @brief Defines the interface provided for push-style suppliers
+ * using the 'structured' event format.
+ */
+ interface StructuredProxyPushConsumer
+ : ProxyConsumer
+ , CosNotifyComm::StructuredPushConsumer
+ {
+ /// Connect a supplier to the proxy
+ /**
+ * Suppliers cannot push events into a ProxyPushConsumer until
+ * this method is invoked.
+ *
+ * @param push_supplier the callback object used to inform the
+ * application if the event channel is destroyed. If the
+ * argument is nil no destroy notification is provided.
+ * @throws CosEventChannelAdmin::AlreadyConnected if the proxy is
+ * already connected, i.e. if this operation is invoked more than
+ * one time.
+ */
+ void connect_structured_push_supplier (
+ in CosNotifyComm::StructuredPushSupplier push_supplier)
+ raises(CosEventChannelAdmin::AlreadyConnected);
+ };
+
+ /**
+ * @interface SequenceProxyPushConsumer
+ *
+ * @brief Defines the interface provided for push-style suppliers
+ * using the 'batched' event format.
+ */
+ interface SequenceProxyPushConsumer
+ : ProxyConsumer
+ , CosNotifyComm::SequencePushConsumer
+ {
+ /// Connect a supplier to the proxy
+ /**
+ * Suppliers cannot push events into a ProxyPushConsumer until
+ * this method is invoked.
+ *
+ * @param push_supplier the callback object used to inform the
+ * application if the event channel is destroyed. If the
+ * argument is nil no destroy notification is provided.
+ * @throws CosEventChannelAdmin::AlreadyConnected if the proxy is
+ * already connected, i.e. if this operation is invoked more than
+ * one time.
+ */
+ void connect_sequence_push_supplier (
+ in CosNotifyComm::SequencePushSupplier push_supplier)
+ raises(CosEventChannelAdmin::AlreadyConnected);
+ };
+
+#ifdef TAO_HAS_NOTIFY_PULL_INTERFACES
+
+ /**
+ * @interface ProxyPullSupplier
+ *
+ * @brief Defines the interface provided for pull-style consumers
+ * using the 'any' event format.
+ */
+ interface ProxyPullSupplier
+ : ProxySupplier
+ , CosNotifyComm::PullSupplier
+ {
+ /// Connect a consumer to the proxy
+ /**
+ * The consumer cannot pull events until this operation is invoked.
+ *
+ * @param pull_consumer the callback object used to inform the
+ * application if the event channel is destroyed. If the
+ * argument is nil no destroy notification is provided.
+ * @throws CosEventChannelAdmin::AlreadyConnected if the proxy is
+ * already connected, i.e. if this operation is invoked more than
+ * one time.
+ */
+ void connect_any_pull_consumer (
+ in CosEventComm::PullConsumer pull_consumer)
+ raises(CosEventChannelAdmin::AlreadyConnected);
+ };
+
+ /**
+ * @interface StructuredProxyPullSupplier
+ *
+ * @brief Defines the interface provided for pull-style consumers
+ * using the 'structured' event format.
+ */
+ interface StructuredProxyPullSupplier
+ : ProxySupplier
+ , CosNotifyComm::StructuredPullSupplier
+ {
+ /// Connect a consumer to the proxy
+ /**
+ * The consumer cannot pull events until this operation is invoked.
+ *
+ * @param pull_consumer the callback object used to inform the
+ * application if the event channel is destroyed. If the
+ * argument is nil no destroy notification is provided.
+ * @throws CosEventChannelAdmin::AlreadyConnected if the proxy is
+ * already connected, i.e. if this operation is invoked more than
+ * one time.
+ */
+ void connect_structured_pull_consumer (
+ in CosNotifyComm::StructuredPullConsumer pull_consumer)
+ raises(CosEventChannelAdmin::AlreadyConnected);
+ };
+
+ /**
+ * @interface SequenceProxyPullSupplier
+ *
+ * @brief Defines the interface provided for pull-style consumer
+ * using the 'batched' event format.
+ */
+ interface SequenceProxyPullSupplier
+ : ProxySupplier
+ , CosNotifyComm::SequencePullSupplier
+ {
+ /// Connect a consumer to the proxy
+ /**
+ * The consumer cannot pull events until this operation is invoked.
+ *
+ * @param pull_consumer the callback object used to inform the
+ * application if the event channel is destroyed. If the
+ * argument is nil no destroy notification is provided.
+ * @throws CosEventChannelAdmin::AlreadyConnected if the proxy is
+ * already connected, i.e. if this operation is invoked more than
+ * one time.
+ */
+ void connect_sequence_pull_consumer (
+ in CosNotifyComm::SequencePullConsumer pull_consumer)
+ raises(CosEventChannelAdmin::AlreadyConnected);
+ };
+
+ /**
+ * @interface ProxyPullConsumer
+ *
+ * @brief Defines the interface provided for pull-style suppliers
+ * using the 'any' event format.
+ */
+ interface ProxyPullConsumer
+ : ProxyConsumer
+ , CosNotifyComm::PullConsumer
+ {
+ /// Connect a supplier to the proxy
+ /**
+ * The event channel will not pull events from the supplier until
+ * this operation is invoked.
+ *
+ * @param pull_supplier the callback object used to inform the
+ * application if the event channel is destroyed.
+ * @throws CORBA::BAD_PARAM if the pull_supplier argument is nil
+ * @throws CosEventChannelAdmin::AlreadyConnected if the proxy is
+ * already connected, i.e. if this operation is invoked more than
+ * one time.
+ */
+ void connect_any_pull_supplier (
+ in CosEventComm::PullSupplier pull_supplier)
+ raises(CosEventChannelAdmin::AlreadyConnected,
+ CosEventChannelAdmin::TypeError );
+
+ /// Suspend the connection, the event channel will stop pulling
+ /// events.
+ /**
+ * @throws ConnectionAlreadyInactive if the method is invoked
+ * while the connection is suspended
+ * @throws NotConnected if the method is invoked before the
+ * supplier connects
+ */
+ void suspend_connection()
+ raises(ConnectionAlreadyInactive, NotConnected);
+
+ /// Resume the connection, the event channel will start pulling
+ /// events one more.
+ /**
+ * @throws ConnectionAlreadyActive if the method is invoked
+ * while the connection is active
+ * @throws NotConnected if the method is invoked before the
+ * supplier connects
+ */
+ void resume_connection()
+ raises(ConnectionAlreadyActive, NotConnected);
+ };
+
+ /**
+ * @interface StructuredProxyPullConsumer
+ *
+ * @brief Defines the interface provided for pull-style suppliers
+ * using the 'structured' event format.
+ */
+ interface StructuredProxyPullConsumer
+ : ProxyConsumer
+ , CosNotifyComm::StructuredPullConsumer
+ {
+ /// Connect a supplier to the proxy
+ /**
+ * The event channel will not pull events from the supplier until
+ * this operation is invoked.
+ *
+ * @param pull_supplier the callback object used to inform the
+ * application if the event channel is destroyed.
+ * @throws CORBA::BAD_PARAM if the pull_supplier argument is nil
+ * @throws CosEventChannelAdmin::AlreadyConnected if the proxy is
+ * already connected, i.e. if this operation is invoked more than
+ * one time.
+ */
+ void connect_structured_pull_supplier (
+ in CosNotifyComm::StructuredPullSupplier pull_supplier)
+ raises(CosEventChannelAdmin::AlreadyConnected,
+ CosEventChannelAdmin::TypeError );
+
+ /// Suspend the connection, the event channel will stop pulling
+ /// events.
+ /**
+ * @throws ConnectionAlreadyInactive if the method is invoked
+ * while the connection is suspended
+ * @throws NotConnected if the method is invoked before the
+ * supplier connects
+ */
+ void suspend_connection()
+ raises(ConnectionAlreadyInactive, NotConnected);
+
+ /// Resume the connection, the event channel will start pulling
+ /// events one more.
+ /**
+ * @throws ConnectionAlreadyActive if the method is invoked
+ * while the connection is active
+ * @throws NotConnected if the method is invoked before the
+ * supplier connects
+ */
+ void resume_connection()
+ raises(ConnectionAlreadyActive, NotConnected);
+ };
+
+ /**
+ * @interface SequenceProxyPullConsumer
+ *
+ * @brief Defines the interface provided for pull-style suppliers
+ * using the 'batched' event format.
+ */
+ interface SequenceProxyPullConsumer
+ : ProxyConsumer
+ , CosNotifyComm::SequencePullConsumer
+ {
+ /// Connect a supplier to the proxy
+ /**
+ * The event channel will not pull events from the supplier until
+ * this operation is invoked.
+ *
+ * @param pull_supplier the callback object used to inform the
+ * application if the event channel is destroyed.
+ * @throws CORBA::BAD_PARAM if the pull_supplier argument is nil
+ * @throws CosEventChannelAdmin::AlreadyConnected if the proxy is
+ * already connected, i.e. if this operation is invoked more than
+ * one time.
+ */
+ void connect_sequence_pull_supplier (
+ in CosNotifyComm::SequencePullSupplier pull_supplier)
+ raises(CosEventChannelAdmin::AlreadyConnected,
+ CosEventChannelAdmin::TypeError );
+
+ /// Suspend the connection, the event channel will stop pulling
+ /// events.
+ /**
+ * @throws ConnectionAlreadyInactive if the method is invoked
+ * while the connection is suspended
+ * @throws NotConnected if the method is invoked before the
+ * supplier connects
+ */
+ void suspend_connection()
+ raises(ConnectionAlreadyInactive, NotConnected);
+
+ /// Resume the connection, the event channel will start pulling
+ /// events one more.
+ /**
+ * @throws ConnectionAlreadyActive if the method is invoked
+ * while the connection is active
+ * @throws NotConnected if the method is invoked before the
+ * supplier connects
+ */
+ void resume_connection()
+ raises(ConnectionAlreadyActive, NotConnected);
+ };
+#endif /* TAO_HAS_NOTIFY_PULL_INTERFACES */
+
+ /**
+ * @interface ProxyPushSupplier
+ *
+ * @brief Defines the interface provided for push-style consumers
+ * using the 'any' event format.
+ */
+ interface ProxyPushSupplier
+ : ProxySupplier
+ , CosNotifyComm::PushSupplier
+ {
+ /// Connect a consumer to the proxy
+ /**
+ * The event channel will not push events to the consumer until
+ * this operation is invoked.
+ *
+ * @param push_consumer the callback object used to push events to
+ * the application and inform if the event channel is destroyed
+ * @throws CORBA::BAD_PARAM if the push_consumer argument is nil
+ * @throws CosEventChannelAdmin::AlreadyConnected if the proxy is
+ * already connected, i.e. if this operation is invoked more than
+ * one time.
+ */
+ void connect_any_push_consumer (
+ in CosEventComm::PushConsumer push_consumer)
+ raises(CosEventChannelAdmin::AlreadyConnected,
+ CosEventChannelAdmin::TypeError );
+
+ /// Suspend the connection, the event channel will stop pushing
+ /// events to the consumer.
+ /**
+ * @throws ConnectionAlreadyInactive if the method is invoked
+ * while the connection is suspended
+ * @throws NotConnected if the method is invoked before the
+ * supplier connects
+ */
+ void suspend_connection()
+ raises(ConnectionAlreadyInactive, NotConnected);
+
+ /// Resume the connection, the event channel will start pushing
+ /// events to the consumer once more
+ /**
+ * @throws ConnectionAlreadyActive if the method is invoked
+ * while the connection is active
+ * @throws NotConnected if the method is invoked before the
+ * supplier connects
+ */
+ void resume_connection()
+ raises(ConnectionAlreadyActive, NotConnected);
+ };
+
+ /**
+ * @interface StructuredProxyPushSupplier
+ *
+ * @brief Defines the interface provided for push-style consumers
+ * using the 'structured' event format.
+ */
+ interface StructuredProxyPushSupplier
+ : ProxySupplier
+ , CosNotifyComm::StructuredPushSupplier
+ {
+ /// Connect a consumer to the proxy
+ /**
+ * The event channel will not push events to the consumer until
+ * this operation is invoked.
+ *
+ * @param push_consumer the callback object used to push events to
+ * the application and inform if the event channel is destroyed
+ * @throws CORBA::BAD_PARAM if the push_consumer argument is nil
+ * @throws CosEventChannelAdmin::AlreadyConnected if the proxy is
+ * already connected, i.e. if this operation is invoked more than
+ * one time.
+ */
+ void connect_structured_push_consumer (
+ in CosNotifyComm::StructuredPushConsumer push_consumer)
+ raises(CosEventChannelAdmin::AlreadyConnected,
+ CosEventChannelAdmin::TypeError );
+
+ /// Suspend the connection, the event channel will stop pushing
+ /// events to the consumer.
+ /**
+ * @throws ConnectionAlreadyInactive if the method is invoked
+ * while the connection is suspended
+ * @throws NotConnected if the method is invoked before the
+ * supplier connects
+ */
+ void suspend_connection()
+ raises(ConnectionAlreadyInactive, NotConnected);
+
+ /// Resume the connection, the event channel will start pushing
+ /// events to the consumer once more
+ /**
+ * @throws ConnectionAlreadyActive if the method is invoked
+ * while the connection is active
+ * @throws NotConnected if the method is invoked before the
+ * supplier connects
+ */
+ void resume_connection()
+ raises(ConnectionAlreadyActive, NotConnected);
+ };
+
+ /**
+ * @interface SequenceProxyPushSupplier
+ *
+ * @brief Defines the interface provided for push-style consumers
+ * using the 'batched' event format.
+ */
+ interface SequenceProxyPushSupplier
+ : ProxySupplier
+ , CosNotifyComm::SequencePushSupplier
+ {
+ /// Connect a consumer to the proxy
+ /**
+ * The event channel will not push events to the consumer until
+ * this operation is invoked.
+ *
+ * @param push_consumer the callback object used to push events to
+ * the application and inform if the event channel is destroyed
+ * @throws CORBA::BAD_PARAM if the push_consumer argument is nil
+ * @throws CosEventChannelAdmin::AlreadyConnected if the proxy is
+ * already connected, i.e. if this operation is invoked more than
+ * one time.
+ */
+ void connect_sequence_push_consumer (
+ in CosNotifyComm::SequencePushConsumer push_consumer)
+ raises(CosEventChannelAdmin::AlreadyConnected,
+ CosEventChannelAdmin::TypeError );
+
+ /// Suspend the connection, the event channel will stop pushing
+ /// events to the consumer.
+ /**
+ * @throws ConnectionAlreadyInactive if the method is invoked
+ * while the connection is suspended
+ * @throws NotConnected if the method is invoked before the
+ * supplier connects
+ */
+ void suspend_connection()
+ raises(ConnectionAlreadyInactive, NotConnected);
+
+ /// Resume the connection, the event channel will start pushing
+ /// events to the consumer once more
+ /**
+ * @throws ConnectionAlreadyActive if the method is invoked
+ * while the connection is active
+ * @throws NotConnected if the method is invoked before the
+ * supplier connects
+ */
+ void resume_connection()
+ raises(ConnectionAlreadyActive, NotConnected);
+ };
+
+ /// Each proxy is assigned a unique ID by its proxy admin
+ typedef long ProxyID;
+ /// Helper type to query or fetch multiple IDs simulatenously
+ typedef sequence <ProxyID> ProxyIDSeq;
+
+ /**
+ * @enum ClientType
+ *
+ * @brief Helper type used to fetch proxies
+ */
+ enum ClientType {
+ /// The proxy uses the 'any' event format
+ ANY_EVENT,
+ /// The proxy uses the 'structured' event format
+ STRUCTURED_EVENT,
+ /// The proxy uses the 'sequence' (or batch) event format
+ SEQUENCE_EVENT
+ };
+
+ /**
+ * @enum InterFilterGroupOperator
+ *
+ * @brief Define how multiple Filters are considered in a proxy
+ * admin
+ */
+ enum InterFilterGroupOperator {
+ AND_OP,
+ OR_OP
+ };
+
+ /// Each proxy admin is assigned a unique number by its EventChannel
+ typedef long AdminID;
+ /// List of Admin IDs
+ typedef sequence<AdminID> AdminIDSeq;
+
+ /**
+ * @exception AdminNotFound
+ *
+ * @brief Exception raised if a lookup for a specific Admin ID
+ * fails.
+ */
+ exception AdminNotFound {};
+
+ /**
+ * @exception ProxyNotFound
+ *
+ * @brief Exception raised if a lookup for a specific Proxy ID
+ * fails.
+ */
+ exception ProxyNotFound {};
+
+ /**
+ * @struct AdminLimit
+ *
+ * @brief Helper structure to represent a violation of the limits in
+ * a proxy admin.
+ */
+ struct AdminLimit {
+ CosNotification::PropertyName name;
+ CosNotification::PropertyValue value;
+ };
+
+ /**
+ * @exception AdminLimitExceeded
+ *
+ * @brief Exception raised if a limit in a proxy admin is breached
+ */
+ exception AdminLimitExceeded {
+ /// The limit that caused the problem.
+ AdminLimit admin_property_err;
+ };
+
+ /**
+ * @interface ConsumerAdmin
+ *
+ * @brief Interface used to control and obtain the proxies used by
+ * consumers.
+ */
+ interface ConsumerAdmin
+ : CosNotification::QoSAdmin
+ , CosNotifyComm::NotifySubscribe
+ , CosNotifyFilter::FilterAdmin
+ , CosEventChannelAdmin::ConsumerAdmin
+ {
+ /// The ID assigned to this admin by its event channel
+ readonly attribute AdminID MyID;
+
+ /// The event channel this admin belongs to
+ readonly attribute EventChannel MyChannel;
+
+ /// How are multiple filters interpreted
+ readonly attribute InterFilterGroupOperator MyOperator;
+
+ /// A special mapping filter to change the priority property of
+ /// events
+ attribute CosNotifyFilter::MappingFilter priority_filter;
+
+ /// A special mapping filter to change the lifetime property of
+ /// events
+ attribute CosNotifyFilter::MappingFilter lifetime_filter;
+
+ /// Get the complete list of pull proxy suppliers
+ readonly attribute ProxyIDSeq pull_suppliers;
+
+ /// Get the complete list of push proxy suppliers
+ readonly attribute ProxyIDSeq push_suppliers;
+
+ /// Get an specific ProxySupplier
+ /**
+ * @param proxy_id The proxy ID that will be retrieved
+ * @throws ProxyNotFound if the proxy_id is not found in this
+ * ConsumerAdmin
+ */
+ ProxySupplier get_proxy_supplier (in ProxyID proxy_id)
+ raises (ProxyNotFound );
+
+ /// Create a new pull-style proxy supplier
+ /**
+ * @param ctype The event format that the ProxySupplier should
+ * support
+ * @param proxy_id The ID assigned to the new proxy supplier
+ * @return The new ProxySupplier
+ * @throws AdminLimitExceeded if a limit in this admin is reached,
+ * such as the maximum number of proxies.
+ */
+ ProxySupplier obtain_notification_pull_supplier (in ClientType ctype,
+ out ProxyID proxy_id)
+ raises ( AdminLimitExceeded );
+
+ /// Create a new push-style proxy supplier
+ /**
+ * @param ctype The event format that the ProxySupplier should
+ * support
+ * @param proxy_id The ID assigned to the new proxy supplier
+ * @return The new ProxySupplier
+ * @throws AdminLimitExceeded if a limit in this admin is reached,
+ * such as the maximum number of proxies.
+ */
+ ProxySupplier obtain_notification_push_supplier (in ClientType ctype,
+ out ProxyID proxy_id)
+ raises ( AdminLimitExceeded );
+
+ /// Destroy the Admin
+ void destroy();
+ };
+
+ /**
+ * @interface SupplierAdmin
+ *
+ * @brief Interface used to control and obtain the proxies used by
+ * suppliers.
+ */
+ interface SupplierAdmin
+ : CosNotification::QoSAdmin
+ , CosNotifyComm::NotifyPublish
+ , CosNotifyFilter::FilterAdmin
+ , CosEventChannelAdmin::SupplierAdmin
+ {
+ /// The ID assigned to this admin by its event channel
+ readonly attribute AdminID MyID;
+
+ /// The event channel this admin belongs to
+ readonly attribute EventChannel MyChannel;
+
+ /// How are multiple filters interpreted
+ readonly attribute InterFilterGroupOperator MyOperator;
+
+ /// Get the complete list of pull proxy consumers
+ readonly attribute ProxyIDSeq pull_consumers;
+
+ /// Get the complete list of push proxy consumers
+ readonly attribute ProxyIDSeq push_consumers;
+
+ /// Get an specific ProxyConsumer
+ /**
+ * @param proxy_id The proxy ID that will be retrieved
+ * @throws ProxyNotFound if the proxy_id is not found in this
+ * SupplierAdmin
+ */
+ ProxyConsumer get_proxy_consumer (in ProxyID proxy_id )
+ raises ( ProxyNotFound );
+
+ /// Create a new pull-style proxy consumer
+ /**
+ * @param ctype The event format that the ProxyConsumer should
+ * support
+ * @param proxy_id The ID assigned to the new proxy consumer
+ * @return The new ProxyConsumer
+ * @throws AdminLimitExceeded if a limit in this admin is reached,
+ * such as the maximum number of proxies.
+ */
+ ProxyConsumer obtain_notification_pull_consumer (in ClientType ctype,
+ out ProxyID proxy_id)
+ raises ( AdminLimitExceeded );
+
+ /// Create a new push-style proxy consumer
+ /**
+ * @param ctype The event format that the ProxyConsumer should
+ * support
+ * @param proxy_id The ID assigned to the new proxy consumer
+ * @return The new ProxySupplier
+ * @throws AdminLimitExceeded if a limit in this admin is reached,
+ * such as the maximum number of proxies.
+ */
+ ProxyConsumer obtain_notification_push_consumer (in ClientType ctype,
+ out ProxyID proxy_id)
+ raises ( AdminLimitExceeded );
+
+ /// Destroy the Admin
+ void destroy();
+ };
+
+ /**
+ * @interface EventChannel
+ *
+ * @brief Defines the interface to control an use an event channel
+ */
+ interface EventChannel
+ : CosNotification::QoSAdmin
+ , CosNotification::AdminPropertiesAdmin
+ , CosEventChannelAdmin::EventChannel
+ {
+ /// The factory this event channel belongs to
+ readonly attribute EventChannelFactory MyFactory;
+
+ /// The default consumer admin
+ readonly attribute ConsumerAdmin default_consumer_admin;
+
+ /// The default supplier admin
+ readonly attribute SupplierAdmin default_supplier_admin;
+
+ /// The default filter factory for this event channel
+ readonly attribute CosNotifyFilter::FilterFactory default_filter_factory;
+
+ /// Create a new consumer admin
+ /**
+ * @param op Defines how multiple filters would be interpreted in
+ * the new consumer admin
+ * @param id Returns the ID assigned to the new consumer admin
+ * @return The new consumer admin
+ */
+ ConsumerAdmin new_for_consumers(in InterFilterGroupOperator op,
+ out AdminID id );
+
+ /// Create a new supplier admin
+ /**
+ * @param op Defines how multiple filters would be interpreted in
+ * the new supplier admin
+ * @param id Returns the ID assigned to the new supplier admin
+ * @return The new supplier admin
+ */
+ SupplierAdmin new_for_suppliers(in InterFilterGroupOperator op,
+ out AdminID id );
+
+ /// Fetch an specific consumer admin based on its ID
+ /**
+ * @param id The id of the consumer that should be returned
+ * @return The consumer admin assigned the given ID
+ * @throws AdminNotFound if there is no consumer admin with the ID
+ * provided
+ */
+ ConsumerAdmin get_consumeradmin ( in AdminID id )
+ raises (AdminNotFound);
+
+ /// Fetch an specific supplier admin based on its ID
+ /**
+ * @param id The id of the supplier that should be returned
+ * @return The supplier admin assigned the given ID
+ * @throws AdminNotFound if there is no supplier admin with the ID
+ * provided
+ */
+ SupplierAdmin get_supplieradmin ( in AdminID id )
+ raises (AdminNotFound);
+
+ /// Get the IDs of all the consumer admins
+ AdminIDSeq get_all_consumeradmins();
+
+ /// Get the IDs of all the supplier admins
+ AdminIDSeq get_all_supplieradmins();
+ };
+
+ /// Each event channel is assigned a unique ID by its factory
+ typedef long ChannelID;
+
+ /// Helper type used to return the complete list of event channel
+ /// IDs
+ typedef sequence<ChannelID> ChannelIDSeq;
+
+ /**
+ * @exception ChannelNotFound
+ *
+ * @brief Exception raised if an specific ChannelID is not found.
+ */
+ exception ChannelNotFound {};
+
+ /**
+ * @interface EventChannelFactory
+ *
+ * @brief Defines the interface used to build event channels
+ */
+ interface EventChannelFactory {
+ /// Create a new event channel
+ /**
+ * @param initial_qos Configure the initial QoS properties of the
+ * new EventChannel
+ * @param initial_admin Configure the initial Admin properties of
+ * the new EventChannel
+ * @param id Returns the ID assigned to the new EventChannel
+ * @return The new event channel
+ * @throws CosNotification::UnsupportedQoS if the requested QoS
+ * properties cannot be satisfied or are invalid
+ * @throws CosNotification::UnsupportedAdmin if the requested
+ * admin properties cannot be satisfied or are invalid
+ */
+ EventChannel create_channel (in CosNotification::QoSProperties initial_qos,
+ in CosNotification::AdminProperties initial_admin,
+ out ChannelID id)
+ raises(CosNotification::UnsupportedQoS,
+ CosNotification::UnsupportedAdmin );
+
+ /// Get the complete list of event channels in this factory
+ ChannelIDSeq get_all_channels();
+
+ /// Get an event channel given its ID
+ /**
+ * @param id The ID of the event channel the application wants
+ * @return The event channel
+ * @throws ChannelNotFound if the give ID is unknown on this
+ * factory
+ */
+ EventChannel get_event_channel ( in ChannelID id )
+ raises (ChannelNotFound);
+ };
+};
+
+#pragma prefix ""
+
+#endif /* _COS_NOTIFY_CHANNEL_ADMIN_IDL_ */
diff --git a/TAO/orbsvcs/orbsvcs/CosNotifyComm.idl b/TAO/orbsvcs/orbsvcs/CosNotifyComm.idl
new file mode 100644
index 00000000000..59a19564db8
--- /dev/null
+++ b/TAO/orbsvcs/orbsvcs/CosNotifyComm.idl
@@ -0,0 +1,387 @@
+/**
+ * @file CosNotifyComm.idl
+ *
+ * @brief Define the CosNotifyComm module
+ *
+ * $Id$
+ *
+ * This module is taken from the standard CORBA Notification Service
+ * 1.0, as described in:
+ *
+ * http://www.omg.org/technology/documents/formal/notification_service.htm
+ *
+ * In particular the following two documents were used:
+ * formal/2000-06-20
+ * formal/01-03-03
+ *
+ * @author Pradeep Gore <pradeep@cs.wustl.edu>
+ */
+
+#ifndef _COS_NOTIFY_COMM_IDL_
+#define _COS_NOTIFY_COMM_IDL_
+
+#include "CosNotification.idl"
+#include "CosEventComm.idl"
+
+#pragma prefix "omg.org"
+
+/**
+ * @namespace CosNotifyComm
+ *
+ * @brief Define the interfaces implemented by users of the CORBA
+ * Notification Service.
+ */
+module CosNotifyComm
+{
+ /**
+ * @exception InvalidEventType
+ *
+ * @brief Exception raised to indicate that an EventType is
+ * syntactically or semantically invalid.
+ */
+ exception InvalidEventType {
+ /// Type of invalid event
+ CosNotification::_EventType type;
+ };
+
+ /**
+ * @interface NotifyPublish
+ *
+ * @brief Defines interface to report changes in the events
+ * published to a consumer.
+ *
+ * Interfaces that represent consumers (or the consumer aspects of
+ * an Notification Service) provide this interface to receive
+ * notifications in the list of events they support.
+ */
+ interface NotifyPublish {
+ /// Report a change in the list of publications.
+ /**
+ * @param added The list of new event types that the consumer can
+ * expect.
+ * @param removed The list of event types that the consumer should
+ * no longer expect.
+ * @throws InvalidEventType if the one or more event types
+ * provided is invalid
+ */
+ void offer_change (in CosNotification::EventTypeSeq added,
+ in CosNotification::EventTypeSeq removed )
+ raises ( InvalidEventType );
+ };
+
+ /**
+ * @interface NotifySubscribe
+ *
+ * @brief Defines interface to report changes in the events required
+ * from a supplier.
+ *
+ * Interfaces that represent suppliers (or the supplier aspects of
+ * the Notification Service) provide this interface to receive
+ * changes
+ */
+ interface NotifySubscribe {
+ /// Report a change in the list of subscriptions
+ /**
+ * @param added The list of new event types that are interesting
+ * for the supplier's peer.
+ * @param removed The list of event types that are no longer
+ * interesting for the supplier's peer.
+ * @throws InvalidEventType if the one or more event types
+ * provided is invalid
+ */
+ void subscription_change(in CosNotification::EventTypeSeq added,
+ in CosNotification::EventTypeSeq removed )
+ raises ( InvalidEventType );
+ };
+
+ /**
+ * @interface PushConsumer
+ *
+ * @brief Defines the interface used by push-style consumers
+ *
+ * Push-style consumers passively accept events as anys.
+ */
+ interface PushConsumer :
+ NotifyPublish,
+ CosEventComm::PushConsumer {
+ };
+
+#ifdef TAO_HAS_NOTIFY_PULL_INTERFACES
+ /**
+ * @interface PullConsumer
+ *
+ * @brief Defines the interface used by pull-style consumers
+ *
+ * Pull-style consumer actively query the Notification Service to
+ * receive events.
+ */
+ interface PullConsumer :
+ NotifyPublish,
+ CosEventComm::PullConsumer {
+ };
+
+ /**
+ * @interface PullSupplier
+ *
+ * @brief Defines the interface used by pull-style suppliers
+ *
+ * Pull-style suppliers passively provide events to the Notification
+ * Service.
+ */
+ interface PullSupplier :
+ NotifySubscribe,
+ CosEventComm::PullSupplier {
+ };
+#endif /* TAO_HAS_NOTIFY_PULL_INTERFACES */
+ /**
+ * @interface PushSupplier
+ *
+ * @brief Defines the interface used by push-style suppliers
+ *
+ * Push-style suppliers actively provide events to the Notifcation
+ * Service.
+ */
+ interface PushSupplier :
+ NotifySubscribe,
+ CosEventComm::PushSupplier {
+ };
+
+ /**
+ * @interface StructuredPushConsumer
+ *
+ * @brief Defines the interface used by push-style consumers of
+ * structured events
+ *
+ * Push-style consumers passively receive events from the
+ * Notification Service. The events are provided using the
+ * CosNotification::StructuredEvent structure.
+ */
+ interface StructuredPushConsumer : NotifyPublish {
+ /// Receive one structured event
+ /**
+ * This operation is invoked to provide one event to the
+ * consumer.
+ * @throws CosEventComm::Disconnected if the object considers
+ * itself no longer connected to its peer.
+ */
+ void push_structured_event(
+ in CosNotification::StructuredEvent notification)
+ raises(CosEventComm::Disconnected);
+
+ /// The peer has disconnected
+ /**
+ * This operation is invoked by the consumer peer when it wishes
+ * to disconnect. The consumer can safely assume that no more
+ * events will follow this request.
+ */
+ void disconnect_structured_push_consumer();
+ };
+
+#ifdef TAO_HAS_NOTIFY_PULL_INTERFACES
+ /**
+ * @interface StructuredPullConsumer
+ *
+ * @brief Defines the interface used by pull-style consumers of
+ * structured events
+ *
+ * Pull-style consumers actively retrieve events from the
+ * Notification Service. The events use the
+ * CosNotification::StructuredEvent format.
+ */
+ interface StructuredPullConsumer : NotifyPublish {
+ /// The peer has disconnected
+ /**
+ * This operation is invoked by the consumer peer when it wishes
+ * to disconnect. The consumer can safely assume that no more
+ * events will follow this request.
+ */
+ void disconnect_structured_pull_consumer();
+ };
+
+ /**
+ * @interface StructuredPullSupplier
+ *
+ * @brief Defines the interface used by pull-style suppliers of
+ * structured events
+ *
+ * Pull-style suppliers passively generate events for the
+ * Notification Service. The events use the
+ * CosNotification::StructuredEvent format.
+ */
+ interface StructuredPullSupplier : NotifySubscribe {
+ /// Pull (blocking) one event from the supplier.
+ /**
+ * This operation should block until the next event becomes
+ * available.
+ * @throws CosEventComm::Disconnected if the object considers
+ * itself no longer connected to its peer.
+ */
+ CosNotification::StructuredEvent pull_structured_event()
+ raises(CosEventComm::Disconnected);
+
+ /// Pull (non-blocking) one event from the supplier.
+ /**
+ * The try_pull operation does not block: if the event data is
+ * available, it returns the event data and sets the has_event
+ * parameter to true; if the event is not available, it sets the
+ * has_event parameter to false and the event data is returned
+ * as long with an undefined value.
+ * @throws CosEventComm::Disconnected if the object considers
+ * itself no longer connected to its peer.
+ */
+ CosNotification::StructuredEvent try_pull_structured_event(
+ out boolean has_event)
+ raises(CosEventComm::Disconnected);
+
+ /// The peer has disconnected
+ /**
+ * This operation is invoked by the consumer peer when it wishes
+ * to disconnect. The consumer can safely assume that no more
+ * events will follow this request.
+ */
+ void disconnect_structured_pull_supplier();
+ };
+#endif /* TAO_HAS_NOTIFY_PULL_INTERFACES */
+
+ /**
+ * @interface StructuredPushSupplier
+ *
+ * @brief Defines the interface used by push-style suppliers that
+ * provide structure events.
+ *
+ * Push-style suppliers actively provide events, in this case using
+ * the CosEventComm::StructuredEvent format.
+ */
+ interface StructuredPushSupplier : NotifySubscribe {
+ /// The peer has disconnected
+ /**
+ * This operation is invoked by the consumer peer when it wishes
+ * to disconnect. The consumer can safely assume that no more
+ * events will follow this request.
+ */
+ void disconnect_structured_push_supplier();
+ };
+
+ /**
+ * @interface SequencePushConsumer
+ *
+ * @brief Defines the interface used by push-style consumers that
+ * interested in event batches.
+ *
+ * Push-style consumer passively accept events, in this case
+ * multiple events can be delivered simulatneously.
+ */
+ interface SequencePushConsumer : NotifyPublish {
+ /// Receive an event batch
+ /**
+ * This operation is invoked to provide an event batch to the
+ * consumer.
+ * @throws CosEventComm::Disconnected if the object considers
+ * itself no longer connected to its peer.
+ */
+ void push_structured_events(
+ in CosNotification::EventBatch notifications)
+ raises(CosEventComm::Disconnected);
+
+ /// The peer has disconnected
+ /**
+ * This operation is invoked by the consumer peer when it wishes
+ * to disconnect. The consumer can safely assume that no more
+ * events will follow this request.
+ */
+ void disconnect_sequence_push_consumer();
+ };
+
+#ifdef TAO_HAS_NOTIFY_PULL_INTERFACES
+
+/**
+ * @interface SequencePullConsumer
+ *
+ * @brief Defines the interface used by pull-style consumers that
+ * deal with event batches.
+ *
+ * Pull-style consumer actively query the Notification Service for
+ * events, this particular interface can obtain multiple events
+ * simultaneously.
+ */
+ interface SequencePullConsumer : NotifyPublish {
+ /// The peer has disconnected
+ /**
+ * This operation is invoked by the consumer peer when it wishes
+ * to disconnect. The consumer can safely assume that no more
+ * events will follow this request.
+ */
+ void disconnect_sequence_pull_consumer();
+ };
+
+ /**
+ * @interface SequencePullSupplier
+ *
+ * @brief Defines the interface used by pull-style suppliers that
+ * provide event batches.
+ *
+ * Pull-style suppliers passively provide events to the Notification
+ * Service. This particular interface can provide multiple events
+ * simultaneously.
+ */
+ interface SequencePullSupplier : NotifySubscribe {
+ /// Pull (blocking) an event batch from the supplier
+ /**
+ * @param max_number Maximum number of events expected by the
+ * caller.
+ * @throws CosEventComm::Disconnected if the object considers
+ * itself no longer connected to its peer.
+ */
+ CosNotification::EventBatch pull_structured_events(
+ in long max_number )
+ raises(CosEventComm::Disconnected);
+
+ /// Pull (non-blocking) an event batch from the supplier
+ /**
+ * @param max_number Maximum number of events expected by the
+ * caller.
+ * @param has_event Return FALSE if there are no events available,
+ * TRUE otherwise.
+ * @throws CosEventComm::Disconnected if the object considers
+ * itself no longer connected to its peer.
+ */
+ CosNotification::EventBatch try_pull_structured_events(
+ in long max_number,
+ out boolean has_event)
+ raises(CosEventComm::Disconnected);
+
+ /// The peer has disconnected
+ /**
+ * This operation is invoked by the consumer peer when it wishes
+ * to disconnect. The consumer can safely assume that no more
+ * events will follow this request.
+ */
+ void disconnect_sequence_pull_supplier();
+ };
+
+#endif /* TAO_HAS_NOTIFY_PULL_INTERFACES */
+
+ /**
+ * @interface SequencePushSupplier
+ *
+ * @brief Defines the interface used by push-style suppliers that
+ * provide event batches.
+ *
+ * Push-style suppliers actively generate events for the
+ * Notification Service. This particular interface can provide
+ * multiple events simultaneously.
+ */
+ interface SequencePushSupplier : NotifySubscribe {
+ /// The peer has disconnected
+ /**
+ * This operation is invoked by the consumer peer when it wishes
+ * to disconnect. The consumer can safely assume that no more
+ * events will follow this request.
+ */
+ void disconnect_sequence_push_supplier();
+ };
+};
+
+#pragma prefix ""
+
+#endif /* _COS_NOTIFY_COMM_IDL_ */
diff --git a/TAO/orbsvcs/orbsvcs/CosNotifyFilter.idl b/TAO/orbsvcs/orbsvcs/CosNotifyFilter.idl
new file mode 100644
index 00000000000..1326fb193bd
--- /dev/null
+++ b/TAO/orbsvcs/orbsvcs/CosNotifyFilter.idl
@@ -0,0 +1,505 @@
+/**
+ * @file CosNotifyFilter.idl
+ *
+ * @brief Defines the CosNotifyFilter module
+ *
+ * $Id$
+ *
+ * This module is taken from the standard CORBA Notification Service
+ * 1.0, as described in:
+ *
+ * http://www.omg.org/technology/documents/formal/notification_service.htm
+ *
+ * In particular the following two documents were used:
+ * formal/2000-06-20
+ * formal/01-03-03
+ *
+ * @author Pradeep Gore <pradeep@cs.wustl.edu>
+ */
+
+#ifndef _COS_NOTIFY_FILTER_IDL_
+#define _COS_NOTIFY_FILTER_IDL_
+
+#include <orb.idl>
+
+#include "CosNotifyComm.idl"
+
+#pragma prefix "omg.org"
+
+/**
+ * @namespace CosNotifyFilter
+ *
+ * @brief Defines the interfaces used in Event Filtering
+ */
+module CosNotifyFilter
+{
+ /// Constraints are assigned IDs by each Filter object, and can be
+ /// modified using those IDs.
+ typedef long ConstraintID;
+
+ /**
+ * @struct ConstraintExp
+ *
+ * @brief Defines a constraint expression.
+ */
+ struct ConstraintExp {
+ /// The list of event types accepted
+ CosNotification::EventTypeSeq event_types;
+ /// A constraint (or filtering) expression
+ string constraint_expr;
+ };
+
+ /// A sequence of constraint IDs
+ typedef sequence<ConstraintID> ConstraintIDSeq;
+
+ /// A sequence of constraint expressions
+ typedef sequence<ConstraintExp> ConstraintExpSeq;
+
+ /**
+ * @struct ConstraintInfo
+ *
+ * @brief Helper data structure to modify a constraint expression.
+ */
+ struct ConstraintInfo {
+ /// New constraint expression
+ ConstraintExp constraint_expression;
+ /// ID of the expression modified
+ ConstraintID constraint_id;
+ };
+
+ /// Sequence of Constraint infos, modify multiple constraints.
+ typedef sequence<ConstraintInfo> ConstraintInfoSeq;
+
+ /**
+ * @struct MappingConstraintPair
+ *
+ * @brief Helper structure used to modify a mapping constraint
+ * expression.
+ */
+ struct MappingConstraintPair {
+ /// Constraint expression
+ ConstraintExp constraint_expression;
+ /// Value to set in the property if the constraint expression
+ /// matches
+ any result_to_set;
+ };
+
+ /// Sequence of mapping constraint pairs
+ typedef sequence<MappingConstraintPair> MappingConstraintPairSeq;
+
+ /**
+ * @struct MappingConstraintInfo
+ *
+ * @brief Helper structure used to represent a mapping constraint,
+ * its property value and the ID assigned to it in a MappingFilter.
+ */
+ struct MappingConstraintInfo {
+ ConstraintExp constraint_expression;
+ ConstraintID constraint_id;
+ any value;
+ };
+ /// A list of MappingConstraintInfo
+ typedef sequence<MappingConstraintInfo> MappingConstraintInfoSeq;
+
+ /// Each callback object receives a unique ID when it is attached to
+ /// a Filter
+ typedef long CallbackID;
+
+ /// Batch management of callback objects in the Filter interface
+ typedef sequence<CallbackID> CallbackIDSeq;
+
+ /**
+ * @exception UnsupportedFilterableData
+ *
+ * @brief Exception raised when an event with unsupported filtered
+ * data is tested against a Filter.
+ */
+ exception UnsupportedFilterableData {};
+
+ /**
+ * @exception InvalidGrammar
+ *
+ * @brief Exception raised if the filtering expression is using an
+ * invalid grammar.
+ */
+ exception InvalidGrammar {};
+
+ /**
+ * @exception InvalidConstraint
+ *
+ * @brief Exception raised if a constraint's grammar does not match
+ * the Filter grammar.
+ *
+ * The constraint that is deemed invalid is returned as part of the
+ * exception.
+ */
+ exception InvalidConstraint {
+ /// Constraint that caused the problem
+ ConstraintExp constr;
+ };
+
+ /**
+ * @exception DuplicateConstraintID
+ *
+ * @brief Exception raised if a duplicate ID is used while modifying
+ * or removing multiple constraints.
+ */
+ exception DuplicateConstraintID {
+ /// ID causing the problem
+ ConstraintID id;
+ };
+
+ /**
+ * @exception ConstraintNotFound
+ *
+ * @brief Exception raised if a constraint ID is not found while
+ * modifying or removing multiple constraints.
+ */
+ exception ConstraintNotFound {
+ /// ID causing the problem
+ ConstraintID id;
+ };
+
+ /**
+ * @exception CallbackNotFound
+ *
+ * @brief Exception raised if the application tries to remove a
+ * Filter callback that does not exists.
+ */
+ exception CallbackNotFound {};
+
+ /**
+ * @exception InvalidValue
+ *
+ * @brief Exception raised if a modification or addition of a
+ * mapping constraint does not matches the mapping filter type.
+ */
+ exception InvalidValue {
+ /// Constraint expression that cause the problem
+ ConstraintExp constr;
+ /// Value that caused the problem
+ any value;
+ };
+
+ /**
+ * @interface Filter
+ *
+ * @brief Interface used to manipulate and evaluate filters.
+ *
+ * An event filter posseses multiple constraints, each constraint
+ * applies to a limited range of event types, the filter is accepted
+ * if it matches one or more constraint expressions that apply to
+ * its event type.
+ */
+ interface Filter {
+ /// Constraint grammar used in this filter
+ /**
+ * All filtering expressions in the filter should use this
+ * grammar.
+ */
+ readonly attribute string constraint_grammar;
+
+ /// Add constraints to a filter
+ /**
+ * Return the constraints and their IDs.
+ *
+ * @throws InvalidConstraint if one or more constraints contain
+ * invalid an invalid expression in the Filter constraint
+ * grammar.
+ */
+ ConstraintInfoSeq add_constraints (
+ in ConstraintExpSeq constraint_list)
+ raises (InvalidConstraint);
+
+ /// Modify and/or remove multiple constraints in the Filter
+ /**
+ * The operation can raise InvalidConstraint if one or more
+ * constraints contain invalid expressions in the constraint
+ * grammar.
+ *
+ * @param del_list List of constraint IDs to be removed
+ * @param modify_list List of constrained modified
+ *
+ * @throws ConstraintNotFound If one or more of the ConstraintID
+ * supplied are not found.
+ */
+ void modify_constraints (
+ in ConstraintIDSeq del_list,
+ in ConstraintInfoSeq modify_list)
+ raises (InvalidConstraint, ConstraintNotFound);
+
+ /// Obtain the one or more constraints given their IDs
+ /**
+ * @param id_list List of IDs queried
+ *
+ * @throws ConstraintNotFound if one or more of
+ * the ConstraintID supplied are not found.
+ */
+ ConstraintInfoSeq get_constraints(
+ in ConstraintIDSeq id_list)
+ raises (ConstraintNotFound);
+
+ /// The all the constraints in the Filter
+ ConstraintInfoSeq get_all_constraints();
+
+ /// Remove all the constraints from the Filter
+ void remove_all_constraints();
+
+ /// Destroy the Filter
+ void destroy();
+
+ /// Match a regular event against the constraints in the filter
+ /**
+ * @param filterable_data The Notification Service event to be
+ * tested against the constraints in this Filter
+ * @return TRUE if at least one constraint evaluates to TRUE for
+ * the event.
+ * @throws UnsupportedFilterableData if the event contents do not
+ * match the filtering expression, for example, if the
+ * expression for a filterable field expects a string, but the
+ * actual value is a number.
+ */
+ boolean match ( in any filterable_data )
+ raises (UnsupportedFilterableData);
+
+ /// Match a structured event against the constraints in the filter
+ /**
+ * @param filterable_data The Notification Service event to be
+ * tested against the constraints in this Filter
+ * @return TRUE if at least one constraint expression evaluates
+ * to TRUE for the event.
+ * @throws UnsupportedFilterableData if the event contents do not
+ * match the filtering expression, for example, if the
+ * expression for a filterable field expects a string, but the
+ * actual value is a number.
+ */
+ boolean match_structured (
+ in CosNotification::StructuredEvent filterable_data )
+ raises (UnsupportedFilterableData);
+
+ /// Match a typed event against the constraints in the filter
+ /**
+ * @param filterable_data The sequence of properties that make the
+ * filterable portion of the Typed event.
+ * @return TRUE if at least one constraint expression evaluates
+ * to TRUE for the event.
+ * @throws UnsupportedFilterableData if the event contents do not
+ * match the filtering expression, for example, if the
+ * expression for a filterable field expects a string, but the
+ * actual value is a number.
+ */
+ boolean match_typed (
+ in CosNotification::PropertySeq filterable_data )
+ raises (UnsupportedFilterableData);
+
+ /// Add a callback interface to the filter
+ /**
+ * Filters can communicate changes in the list of event types they
+ * potentially accept.
+ *
+ * @param callback the object interested about changes in the
+ * Filter event type list.
+ * @return A unique ID attached to the callback interface.
+ */
+ CallbackID attach_callback (
+ in CosNotifyComm::NotifySubscribe callback);
+
+ /// Remove a callback interface from the filter
+ /**
+ * @param callback The ID of the callback removed
+ *
+ * @throws CallbackNotFound if the callback id supplied is not
+ * found in the internal list of callbacks.
+ */
+ void detach_callback ( in CallbackID callback)
+ raises ( CallbackNotFound );
+
+ /// Return all the callback IDs in the Filter object
+ CallbackIDSeq get_callbacks();
+ };
+
+ /**
+ * @interface MappingFilter
+ *
+ * @brief Mapping filters can be used to change properties of an
+ * event as it traverses the Notification Service.
+ */
+ interface MappingFilter {
+ /// Return the constraint grammar used in the mapping filter
+ readonly attribute string constraint_grammar;
+
+ /// Return the type code for the property affected by this mapping
+ /// filter
+ readonly attribute CORBA::TypeCode value_type;
+
+ /// Return the default value set by this mapping filter
+ /**
+ * The default value is used if there are no mapping constraint
+ * expressions matching the event.
+ */
+ readonly attribute any default_value;
+
+ /// Add multiple mapping constraints to the filter
+ /**
+ * @param pair_list List of constraint expressions and the
+ * corresponding property value
+ *
+ * @return The list of constraint expressions, their values, and
+ * the IDs assigned to them in this Filter.
+ *
+ * @throws InvalidConstraint if one or more constraint expressions
+ * do not match the constraint grammar of this mapping filter
+ * @throws InvalidValue if the value in one or more mapping
+ * constraint pairs does not match the type code for this
+ * mapping filter.
+ */
+ MappingConstraintInfoSeq add_mapping_constraints (
+ in MappingConstraintPairSeq pair_list)
+ raises (InvalidConstraint, InvalidValue);
+
+ /// Modify and/or remove mapping constraints in the filter
+ /**
+ * @param del_list list of constraint IDs that should be removed
+ * @param modify_list list of constraints that would be modified
+ *
+ * @throws InvalidConstraint if one or more constraint expressions
+ * do not match the constraint grammar of this mapping filter
+ * @throws InvalidValue if the value in one or more mapping
+ * constraint pairs does not match the type code for this
+ * mapping filter.
+ * @throws ConstraintNotFound if one or more mapping constraint
+ * IDs are not found in the filter
+ */
+ void modify_mapping_constraints (
+ in ConstraintIDSeq del_list,
+ in MappingConstraintInfoSeq modify_list)
+ raises (InvalidConstraint, InvalidValue, ConstraintNotFound);
+
+ /// Retrieve multiple mapping constraints from the filter
+ /**
+ * @param id_list the list of mapping constraint IDs requested
+ * @return The list of constraint expressions, their values and
+ * IDs.
+ * @throws ConstraintNotFound if one or more mapping constraint
+ * IDs are not found in the filter
+ */
+ MappingConstraintInfoSeq get_mapping_constraints (
+ in ConstraintIDSeq id_list)
+ raises (ConstraintNotFound);
+
+ /// Get all the mapping constraints from the Filter
+ MappingConstraintInfoSeq get_all_mapping_constraints();
+
+ /// Remove all the mapping constraints in the Filter
+ void remove_all_mapping_constraints();
+
+ /// Destroy the mapping filter
+ void destroy();
+
+ /// Test an event against the mapping constraints
+ boolean match ( in any filterable_data,
+ out any result_to_set )
+ raises (UnsupportedFilterableData);
+
+ boolean match_structured (
+ in CosNotification::StructuredEvent filterable_data,
+ out any result_to_set)
+ raises (UnsupportedFilterableData);
+
+ boolean match_typed (
+ in CosNotification::PropertySeq filterable_data,
+ out any result_to_set)
+ raises (UnsupportedFilterableData);
+ };
+
+ /**
+ * @interface FilterFactory
+ *
+ * @brief Create Filter and MappingFilter objects
+ */
+ interface FilterFactory {
+ /// Create a new Filter object
+ /**
+ * @param constraint_grammar The name of the grammar used for this
+ * filter
+ * @throws InvalidGrammar The grammar name provided is invalid or
+ * unsupported
+ */
+ Filter create_filter (in string constraint_grammar)
+ raises (InvalidGrammar);
+
+ /// Create a new MappingFilter object
+ /**
+ * @param constraint_grammar The name of the grammar used for this
+ * filter
+ * @param default_value The default property value used if no
+ * mapping constraint matches
+ * @throws InvalidGrammar The grammar name provided is invalid or
+ * unsupported
+ */
+ MappingFilter create_mapping_filter (
+ in string constraint_grammar,
+ in any default_value)
+ raises(InvalidGrammar);
+ };
+
+ /// Each filter is assigned a unique ID
+ typedef long FilterID;
+
+ /// List of filter IDs
+ typedef sequence<FilterID> FilterIDSeq;
+
+ /**
+ * @exception FilterNotFound
+ *
+ * @brief Exception raised if a filter ID is not found.
+ */
+ exception FilterNotFound {};
+
+ /**
+ * @interface FilterAdmin
+ *
+ * @brief Interface used to modify the Filters attached to a
+ * Notification Service component
+ */
+ interface FilterAdmin {
+ /// Add a filter
+ /**
+ * @param new_filter Filter to be added
+ * @return The ID assigned to the new filter
+ */
+ FilterID add_filter ( in Filter new_filter );
+
+ /// Remove a filter
+ /**
+ * @param filter ID of the filter to be removed
+ * @throws FilterNotFound if the filter ID is not found in this
+ * FilterAdmin
+ */
+ void remove_filter ( in FilterID filter )
+ raises ( FilterNotFound );
+
+ /// Get a filter
+ /**
+ * @param filter ID of the filter returned
+ * @return The filter
+ * @throws FilterNotFound if the filter ID is not found in this
+ * FilterAdmin
+ */
+ Filter get_filter ( in FilterID filter )
+ raises ( FilterNotFound );
+
+ /// Get the IDs of all the filters
+ /**
+ * @return The list of all filter IDs in this component
+ */
+ FilterIDSeq get_all_filters();
+
+ /// Remove all the filters from this component
+ void remove_all_filters();
+ };
+};
+
+#pragma prefix ""
+
+#endif /* _COS_NOTIFY_FILTER_IDL_ */
diff --git a/TAO/orbsvcs/orbsvcs/CosProperty.idl b/TAO/orbsvcs/orbsvcs/CosProperty.idl
new file mode 100644
index 00000000000..47049146af2
--- /dev/null
+++ b/TAO/orbsvcs/orbsvcs/CosProperty.idl
@@ -0,0 +1,413 @@
+// -*-c++-*-
+
+// $Id$
+
+// ================================================================
+//
+// = LIBRARY
+// cos
+//
+// = FILENAME
+// CosProperty.idl
+//
+// = DESCRITION
+// The property service, downloaded from
+// ftp://ftp.omg.org/pub/docs/1995/95-06-01.ps
+//
+// = AUTHOR
+// Alexander Babu Arulanthu <alex@cs.wustl.edu>
+//
+// ================================================================
+
+#ifndef TAO_PROPERTY_IDL
+#define TAO_PROPERTY_IDL
+
+#include <orb.idl>
+
+#pragma prefix "omg.org"
+
+module CosPropertyService
+{
+ // = TITLE
+ // CosPropertyService : To support properties (that are typed
+ // named values dynamically associated with an object, outside
+ // of the type system.
+ //
+ // = DESCRIPTION
+ // The data types and interfaces to deal with property names,
+ // property values, property modes etc.
+
+ // = Data Types.
+
+ typedef string PropertyName;
+
+ struct Property
+ {
+ PropertyName property_name;
+ any property_value;
+ };
+
+ enum PropertyModeType
+ {
+ normal,
+ read_only,
+ fixed_normal,
+ fixed_readonly,
+ undefined
+ };
+
+ struct PropertyDef
+ {
+ PropertyName property_name;
+ any property_value;
+ PropertyModeType property_mode;
+ };
+
+ struct PropertyMode
+ {
+ PropertyName property_name;
+ PropertyModeType property_mode;
+ };
+
+ typedef sequence<PropertyName> PropertyNames;
+ typedef sequence<Property> Properties;
+ typedef sequence<PropertyDef> PropertyDefs;
+ typedef sequence<PropertyMode> PropertyModes;
+ typedef sequence<CORBA::TypeCode> PropertyTypes;
+
+ interface PropertyNamesIterator;
+ interface PropertiesIterator;
+ interface PropertySetFactory;
+ interface PropertySetDef;
+ interface PropertySet;
+
+ // = Exceptions
+
+ exception ConstraintNotSupported {};
+ exception InvalidPropertyName {};
+ exception ConflictingProperty {};
+ exception PropertyNotFound {};
+ exception UnsupportedTypeCode {};
+ exception UnsupportedProperty {};
+ exception UnsupportedMode {};
+ exception FixedProperty {};
+ exception ReadOnlyProperty {};
+
+ enum ExceptionReason
+ {
+ invalid_property_name,
+ conflicting_property,
+ property_not_found,
+ unsupported_type_code,
+ unsupported_property,
+ unsupported_mode,
+ fixed_property,
+ read_only_property
+ };
+
+ struct PropertyException
+ {
+ ExceptionReason reason;
+ PropertyName failing_property_name;
+ };
+
+ typedef sequence<PropertyException> PropertyExceptions;
+
+ exception MultipleExceptions
+ {
+ PropertyExceptions exceptions;
+ };
+
+ // = Interface Definitions.
+
+ interface PropertySetFactory
+ {
+ // = TITLE
+ // Factory class for PropertySet interface.
+ // = DESCRIPTION
+ // Support for creating PropertySets with initial
+ // constraints and properties.
+
+ PropertySet create_propertyset ();
+ // The create_propertyset operation returns a new
+ // PropertySet. It is considered an implementation issue as to
+ // whether the PropertySet contains any initial properties or
+ // has constraints.
+
+ PropertySet create_constrained_propertyset (in PropertyTypes allowed_property_types,
+ in Properties allowed_properties)
+ raises (ConstraintNotSupported);
+ // The create_constrained_propertyset operation allows a client
+ // to create a new PropertySet with specific constraints.
+
+ PropertySet create_initial_propertyset (in Properties initial_properties)
+ raises (MultipleExceptions);
+ // The create_initial_propertyset operation allows a client to
+ // create a new PropertySet with specific initial properties.
+ };
+
+ interface PropertySetDefFactory
+ {
+ // = TITLE
+ // Factory class for PropertySetDef interface.
+ // = DESCRIPTION
+ // Support for creating Propsetdefs with initial constraints
+ // and properties.
+
+ PropertySetDef create_propertysetdef ();
+ // The create_propertysetdef operation returns a new
+ // PropertySetDef.
+
+ PropertySetDef create_constrained_propertysetdef (in PropertyTypes allowed_property_types,
+ in PropertyDefs allowed_property_defs)
+ raises (ConstraintNotSupported);
+ // The create_constrained_propertysetdef operation allows a
+ // client to create a new PropertySetDef with specific
+ // constraints, including property modes.
+
+ PropertySetDef create_initial_propertysetdef (in PropertyDefs initial_property_defs)
+ raises (MultipleExceptions);
+ // The create_initial_propertysetdef operation allows a client
+ // to create a new PropertySetDef with specific initial
+ // properties, including property modes.
+ };
+
+ interface PropertySet
+ {
+ // = TITLE
+ // The PropertySet interface provides operations to define
+ // and modify properties, list and get properties, and
+ // delete properties.
+ //
+ // = DESCRIPTION
+ // Provides support for defining and modifying properties,
+ // getting properties and their names and deleting properties.
+
+ // = Support for defining and modifying properties.
+
+ void define_property (in PropertyName property_name,
+ in any property_value)
+ raises (InvalidPropertyName,
+ ConflictingProperty,
+ UnsupportedTypeCode,
+ UnsupportedProperty,
+ ReadOnlyProperty);
+ // Will modify or add a property to the PropertySet. If the
+ // property already exists, then the property type is checked
+ // before the value is overwritten. If the property does not
+ // exist, then the property is added to the PropertySet.
+
+ void define_properties (in Properties nproperties)
+ raises (MultipleExceptions);
+ // Will modify or add each of the properties in Properties
+ // parameter to the PropertySet. For each property in the list,
+ // if the property already exists, then the property type is
+ // checked before overwriting the value. If the property does
+ // not exist, then the property is added to the PropertySet.
+
+ // = Support for Getting Properties and their Names.
+
+ unsigned long get_number_of_properties ();
+ // Returns the current number of properties associated with this
+ // PropertySet.
+
+ void get_all_property_names (in unsigned long how_many,
+ out PropertyNames property_names,
+ out PropertyNamesIterator rest);
+ // Returns all of the property names currently defined in the
+ // PropertySet. If the PropertySet contains more than how_many
+ // property names, then the remaining property names are put
+ // into the PropertyNamesIterator.
+
+ any get_property_value (in PropertyName property_name)
+ raises (PropertyNotFound,
+ InvalidPropertyName);
+ // Returns the value of a property in the PropertySet.
+
+ boolean get_properties (in PropertyNames property_names,
+ out Properties nproperties);
+ // Returns the values of the properties listed in
+ // property_names.
+
+ void get_all_properties (in unsigned long how_many,
+ out Properties nproperties,
+ out PropertiesIterator rest);
+ // Returns all of the property names currently defined in the
+ // PropertySet. If the PropertySet contains more than how_many
+ // property names, then the remaining property names are put
+ // into the PropertyNamesIterator.
+
+ // = Support for Deleting Properties.
+
+ void delete_property (in PropertyName property_name)
+ raises (PropertyNotFound,
+ InvalidPropertyName,
+ FixedProperty);
+ // Deletes the specified property if it exists from a
+ // PropertySet.
+
+
+ void delete_properties (in PropertyNames property_names)
+ raises (MultipleExceptions);
+ // Deletes the properties defined in the property_names
+ // parameter. This is a batch operation that returns the
+ // MultipleExceptions exception if any delete failed.
+
+ boolean delete_all_properties ();
+ // Variation of delete_properties. Applies to all properties.
+
+ // = Support for Existence Check.
+
+ boolean is_property_defined (in PropertyName property_name)
+ raises (InvalidPropertyName);
+ // The is_property_defined operation returns true if the
+ // property is defined in the PropertySet, and returns false
+ // otherwise.
+ };
+
+ interface PropertySetDef:PropertySet
+ {
+ // = TITLE
+ // Interface to deal with the Property Modes.
+ //
+ // = DESCRIPTION
+ // The PropertySetDef interface is a specialization
+ // (subclass) of the PropertySet interface. The
+ // PropertySetDef interface provides operations to retrieve
+ // PropertySet constraints, define and modify properties
+ // with modes, and to get or set property modes.
+
+ void get_allowed_property_types (out PropertyTypes property_types);
+ // Indicates which types of properties are supported by this
+ // PropertySet. If the output sequence is empty, then there is
+ // no restrictions on the any TypeCode portion of the
+ // property_value field of a Property in this PropertySet,
+ // unless the get_allowed_properties output sequence is not empty.
+
+ void get_allowed_properties (out PropertyDefs property_defs);
+ // Indicates which properties are supported by this
+ // PropertySet. If the output sequence is empty, then there is
+ // no restrictions on the properties that can be in this
+ // PropertySet, unless the get_allowed_property_types output
+ // sequence is not empty.
+
+ void define_property_with_mode (in PropertyName property_name,
+ in any property_value,
+ in PropertyModeType property_mode)
+ raises (InvalidPropertyName,
+ ConflictingProperty,
+ UnsupportedTypeCode,
+ UnsupportedProperty,
+ UnsupportedMode,
+ ReadOnlyProperty);
+ // This operation will modify or add a property to the
+ // PropertySet. If the property already exists, then the
+ // property type is checked before the value is overwritten. The
+ // property mode is also checked to be sure a new value may be
+ // written. If the property does not exist, then the property is
+ // added to the PropertySet. To change the any TypeCode portion
+ // of the property_value of a property, a client must first
+ // delete_property, then invoke the define_property_with_mode.
+
+ void define_properties_with_modes (in PropertyDefs property_defs)
+ raises (MultipleExceptions);
+ // This operation will modify or add each of the properties in
+ // the Properties parameter to the PropertySet. For each
+ // property in the list, if the property already exists, then
+ // the property type is checked before overwriting the
+ // value. The property mode is also checked to be sure a new
+ // value may be written. If the property does not exist, then
+ // the property is added to the PropertySet. This is a batch
+ // operation that returns the MultipleExceptions exception if
+ // any define operation failed.
+
+ // = Support for Getting and Setting Property Modes.
+
+ PropertyModeType get_property_mode (in PropertyName property_name)
+ raises (PropertyNotFound,
+ InvalidPropertyName);
+ // Support for Getting and Setting Property Modes.
+
+ boolean get_property_modes (in PropertyNames property_names,
+ out PropertyModes property_modes);
+ // Support for Getting and Setting Property Modes.
+
+ void set_property_mode (in PropertyName property_name,
+ in PropertyModeType property_mode)
+ raises (InvalidPropertyName,
+ PropertyNotFound,
+ UnsupportedMode);
+ // Sets the mode of a property in the PropertySet.
+
+ void set_property_modes (in PropertyModes property_modes)
+ raises (MultipleExceptions);
+ // Sets the mode for each property in the property_modes
+ // parameter. This is a batch operation that returns the
+ // MultipleExceptions exception if any set failed.
+
+ };
+
+ interface PropertyNamesIterator
+ {
+ // = TITLE
+ // Interface for iterating thru the Property Names.
+ //
+ // = DESCRIPTION
+ // The PropertyNamesIterator interface allows a client to
+ // iterate through the names using the next_one or next_n operations.
+
+ void reset ();
+ // The reset operation resets the position in an iterator to the
+ // first property, if one exists.
+
+ boolean next_one (out PropertyName property_name);
+ // 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.
+
+ boolean next_n (in unsigned long how_many,
+ out PropertyNames property_names);
+ // The next_n operation returns true if an item exists at the
+ // current position in the iterator and the how_many parameter
+ // was set greater than zero. The output is a PropertyNames
+ // sequence with at most the how_many number of names. A return
+ // of false signifies no more items in the iterator.
+
+ void destroy ();
+ // The destroy operation destroys the iterator.
+ };
+
+ interface PropertiesIterator
+ {
+ // = TITLE
+ // Interface for iterating thru the Properties.
+ //
+ // = DESCRIPTION
+ // allows a client to through the name-value pairs using the
+ // next_one or next_n operations.
+
+ void reset ();
+ // The reset operation resets the position in an iterator to the
+ // first property, if one exists.
+
+ boolean next_one (out Property aproperty);
+ // The next_one operation returns true if an item exists at the
+ // current position in the iterator with an output parameter of
+ // a property. A return of false signifies no more items in the
+ // iterator.
+
+ boolean next_n (in unsigned long how_many,
+ out Properties nproperties);
+ // The next_n operation returns true if an item exists at the
+ // current position in the iterator and the how_many parameter
+ // was set greater than zero. The output is a properties
+ // sequence with at most the how_many number of properties. A
+ // return of false signifies no more items in the iterator.
+
+ void destroy ();
+ // The destroy operation destroys the iterator.
+ };
+};
+
+#endif /* TAO_PROPERTY_IDL */
diff --git a/TAO/orbsvcs/orbsvcs/CosProperty.mpc b/TAO/orbsvcs/orbsvcs/CosProperty.mpc
new file mode 100644
index 00000000000..cc73a0a5fc8
--- /dev/null
+++ b/TAO/orbsvcs/orbsvcs/CosProperty.mpc
@@ -0,0 +1,120 @@
+// -*- MPC -*-
+// $Id$
+
+project(CosProperty_IDL) : orbsvcslib, core, tao_versioning_idl_defaults {
+ custom_only = 1
+ idlflags += -Wb,stub_export_macro=TAO_Property_Export -Wb,stub_export_include=orbsvcs/Property/property_export.h -Wb,skel_export_macro=TAO_Property_Skel_Export -Wb,skel_export_include=orbsvcs/Property/property_skel_export.h
+
+ IDL_Files {
+ CosProperty.idl
+
+ // This is a wrappper for backwards compatibility
+ CosPropertyService.idl
+ }
+}
+
+project(CosProperty) : orbsvcslib, core {
+ sharedname = TAO_CosProperty
+ dynamicflags = TAO_PROPERTY_BUILD_DLL
+ tagchecks += Property
+ after += CosProperty_IDL
+
+ IDL_Files {
+ }
+
+ Source_Files {
+ CosPropertyC.cpp
+ CosPropertyServiceC.cpp
+ }
+
+ Header_Files {
+ CosPropertyC.h
+ CosPropertyServiceC.h
+ Property/property_export.h
+ }
+
+ Inline_Files {
+ CosPropertyC.inl
+ CosPropertyServiceC.inl
+ }
+
+ Template_Files {
+ }
+
+ // explicit Resource_Files to avoid including _Skel and _Serv rc files.
+ Resource_Files {
+ }
+
+ Pkgconfig_Files {
+ TAO_CosProperty.pc.in
+ }
+}
+
+project(CosProperty_Skel) : orbsvcslib, core, property, portableserver {
+ sharedname = TAO_CosProperty_Skel
+ dynamicflags = TAO_PROPERTY_SKEL_BUILD_DLL
+ tagchecks += Property
+
+ IDL_Files {
+ }
+
+ Source_Files {
+ CosPropertyS.cpp
+ CosPropertyServiceS.cpp
+ }
+
+ Header_Files {
+ CosPropertyS.h
+ CosPropertyS_T.h
+ CosPropertyServiceS.h
+ CosPropertyServiceS_T.h
+ Property/property_skel_export.h
+ }
+
+ Inline_Files {
+ CosPropertyS.inl
+ CosPropertyS_T.inl
+ CosPropertyServiceS.inl
+ CosPropertyServiceS_T.inl
+ }
+
+ Template_Files {
+ CosPropertyS_T.cpp
+ CosPropertyServiceS_T.cpp
+ }
+
+ Pkgconfig_Files {
+ TAO_CosProperty_Skel.pc.in
+ }
+}
+
+project(CosProperty_Serv) : orbsvcslib, core, property_skel {
+ sharedname = TAO_CosProperty_Serv
+ dynamicflags = TAO_PROPERTY_SERV_BUILD_DLL
+ tagchecks += Property
+
+ IDL_Files {
+ }
+
+ Source_Files {
+ Property
+ }
+
+ Header_Files {
+ Property
+ ^Property/property_export.h
+ ^Property/property_skel_export.h
+ }
+
+ Inline_Files {
+ Property
+ }
+
+ Template_Files {
+ Property
+ }
+
+ Pkgconfig_Files {
+ TAO_CosProperty_Serv.pc.in
+ }
+}
diff --git a/TAO/orbsvcs/orbsvcs/CosProperty.rc b/TAO/orbsvcs/orbsvcs/CosProperty.rc
new file mode 100644
index 00000000000..7ac83c90c20
--- /dev/null
+++ b/TAO/orbsvcs/orbsvcs/CosProperty.rc
@@ -0,0 +1,30 @@
+#include "..\..\tao\Version.h"
+
+1 VERSIONINFO
+ FILEVERSION TAO_MAJOR_VERSION,TAO_MINOR_VERSION,TAO_BETA_VERSION,0
+ PRODUCTVERSION TAO_MAJOR_VERSION,TAO_MINOR_VERSION,TAO_BETA_VERSION,0
+ FILEFLAGSMASK 0x3fL
+ FILEFLAGS 0x0L
+ FILEOS 0x4L
+ FILETYPE 0x1L
+ FILESUBTYPE 0x0L
+BEGIN
+ BLOCK "StringFileInfo"
+ BEGIN
+ BLOCK "040904B0"
+ BEGIN
+ VALUE "FileDescription", "CosProperty\0"
+ VALUE "FileVersion", TAO_VERSION "\0"
+ VALUE "InternalName", "TAO_CosPropertyDLL\0"
+ VALUE "LegalCopyright", "\0"
+ VALUE "LegalTrademarks", "\0"
+ VALUE "OriginalFilename", "TAO_CosProperty.DLL\0"
+ VALUE "ProductName", "ORBSVCS\0"
+ VALUE "ProductVersion", TAO_VERSION "\0"
+ END
+ END
+ BLOCK "VarFileInfo"
+ BEGIN
+ VALUE "Translation", 0x409, 1200
+ END
+END
diff --git a/TAO/orbsvcs/orbsvcs/CosPropertyService.idl b/TAO/orbsvcs/orbsvcs/CosPropertyService.idl
new file mode 100644
index 00000000000..90246368491
--- /dev/null
+++ b/TAO/orbsvcs/orbsvcs/CosPropertyService.idl
@@ -0,0 +1,16 @@
+//
+// $Id$
+//
+
+#ifndef TAO_PROPERTYSERVICE_IDL
+#define TAO_PROPERTYSERVICE_IDL
+
+// Force the IDL compiler to include this file [it does not include
+// empty files]
+#pragma prefix "omg.org"
+
+#include "CosProperty.idl"
+
+#pragma prefix ""
+
+#endif /* TAO_PROPERTYSERVICE_IDL */
diff --git a/TAO/orbsvcs/orbsvcs/CosTime.mpc b/TAO/orbsvcs/orbsvcs/CosTime.mpc
new file mode 100644
index 00000000000..417a1c0d6ff
--- /dev/null
+++ b/TAO/orbsvcs/orbsvcs/CosTime.mpc
@@ -0,0 +1,33 @@
+// -*- MPC -*-
+// $Id$
+
+project(CosTime) : orbsvcslib, svc_utils, core, portableserver, tao_versioning_idl_defaults {
+ sharedname = TAO_CosTime
+ idlflags += -Wb,export_macro=TAO_Time_Export -Wb,export_include=orbsvcs/Time/time_export.h
+ dynamicflags = TAO_TIME_BUILD_DLL
+ tagchecks += Time
+
+ IDL_Files {
+ TimeService.idl
+ }
+
+ Source_Files {
+ TimeServiceC.cpp
+ TimeServiceS.cpp
+ Time
+ }
+
+ Header_Files {
+ Time/time_export.h
+ }
+
+ Inline_Files {
+ }
+
+ Template_Files {
+ }
+
+ Pkgconfig_Files {
+ TAO_CosTime.pc.in
+ }
+}
diff --git a/TAO/orbsvcs/orbsvcs/CosTime.rc b/TAO/orbsvcs/orbsvcs/CosTime.rc
new file mode 100644
index 00000000000..98a8443e7c0
--- /dev/null
+++ b/TAO/orbsvcs/orbsvcs/CosTime.rc
@@ -0,0 +1,30 @@
+#include "..\..\tao\Version.h"
+
+1 VERSIONINFO
+ FILEVERSION TAO_MAJOR_VERSION,TAO_MINOR_VERSION,TAO_BETA_VERSION,0
+ PRODUCTVERSION TAO_MAJOR_VERSION,TAO_MINOR_VERSION,TAO_BETA_VERSION,0
+ FILEFLAGSMASK 0x3fL
+ FILEFLAGS 0x0L
+ FILEOS 0x4L
+ FILETYPE 0x1L
+ FILESUBTYPE 0x0L
+BEGIN
+ BLOCK "StringFileInfo"
+ BEGIN
+ BLOCK "040904B0"
+ BEGIN
+ VALUE "FileDescription", "CosTime\0"
+ VALUE "FileVersion", TAO_VERSION "\0"
+ VALUE "InternalName", "TAO_CosTimeDLL\0"
+ VALUE "LegalCopyright", "\0"
+ VALUE "LegalTrademarks", "\0"
+ VALUE "OriginalFilename", "TAO_CosTime.DLL\0"
+ VALUE "ProductName", "ORBSVCS\0"
+ VALUE "ProductVersion", TAO_VERSION "\0"
+ END
+ END
+ BLOCK "VarFileInfo"
+ BEGIN
+ VALUE "Translation", 0x409, 1200
+ END
+END
diff --git a/TAO/orbsvcs/orbsvcs/CosTrading.idl b/TAO/orbsvcs/orbsvcs/CosTrading.idl
new file mode 100644
index 00000000000..c93ca6bef72
--- /dev/null
+++ b/TAO/orbsvcs/orbsvcs/CosTrading.idl
@@ -0,0 +1,522 @@
+/* -*- C++ -*- */
+
+// ========================================================================
+// $Id$
+//
+// = FILENAME
+// CosTrading.idl
+//
+// = DESCRIPTION
+// Trader Service v1.0 described in CORBAservices: Common Object
+// Services Specification, chapter 16 OMG IDL for Trading Function
+// Module, p 16-74
+//
+// ========================================================================
+
+#ifndef TAO_TRADING_IDL
+#define TAO_TRADING_IDL
+
+#pragma prefix "omg.org"
+
+module CosTrading
+{
+ // forward references to our interfaces
+
+ interface Lookup;
+ interface Register;
+ interface Link;
+ interface Proxy;
+ interface Admin;
+ interface OfferIterator;
+ interface OfferIdIterator;
+
+ // type definitions used in more than one interface
+ typedef string Istring;
+ typedef Object TypeRepository;
+
+ typedef Istring PropertyName;
+ typedef sequence<PropertyName> PropertyNameSeq;
+ typedef any PropertyValue;
+
+ struct Property
+ {
+ PropertyName name;
+ PropertyValue value;
+ };
+ typedef sequence<Property> PropertySeq;
+
+ struct Offer
+ {
+ Object reference;
+ PropertySeq properties;
+ };
+ typedef sequence<Offer> OfferSeq;
+
+ typedef string OfferId;
+ typedef sequence<OfferId> OfferIdSeq;
+
+ typedef Istring ServiceTypeName; // similar structure to IR::Identifier
+
+ typedef Istring Constraint;
+
+ enum FollowOption
+ {
+ local_only,
+ if_no_local,
+ always
+ };
+
+ typedef Istring LinkName;
+ typedef sequence<LinkName> LinkNameSeq;
+ typedef LinkNameSeq TraderName;
+
+ typedef string PolicyName; // policy names restricted to Latin1
+ typedef sequence<PolicyName> PolicyNameSeq;
+ typedef any PolicyValue;
+
+ struct Policy
+ {
+ PolicyName name;
+ PolicyValue value;
+ };
+ typedef sequence<Policy> PolicySeq;
+
+ // exceptions used in more than one interface
+
+ exception UnknownMaxLeft {};
+
+ exception NotImplemented {};
+
+ exception IllegalServiceType
+ {
+ ServiceTypeName type;
+ };
+
+ exception UnknownServiceType
+ {
+ ServiceTypeName type;
+ };
+
+ exception IllegalPropertyName
+ {
+ PropertyName name;
+ };
+
+ exception DuplicatePropertyName
+ {
+ PropertyName name;
+ };
+
+ exception PropertyTypeMismatch
+ {
+ ServiceTypeName type;
+ Property prop;
+ };
+
+ exception MissingMandatoryProperty
+ {
+ ServiceTypeName type;
+ PropertyName name;
+ };
+
+ exception ReadonlyDynamicProperty
+ {
+ ServiceTypeName type;
+ PropertyName name;
+ };
+
+ exception IllegalConstraint
+ {
+ Constraint constr;
+ };
+
+ exception InvalidLookupRef
+ {
+ Lookup target;
+ };
+
+ exception IllegalOfferId
+ {
+ OfferId id;
+ };
+
+ exception UnknownOfferId
+ {
+ OfferId id;
+ };
+
+ exception DuplicatePolicyName
+ {
+ PolicyName name;
+ };
+
+ // the interfaces
+
+ interface TraderComponents
+ {
+ readonly attribute Lookup lookup_if;
+ readonly attribute Register register_if;
+ readonly attribute Link link_if;
+ readonly attribute Proxy proxy_if;
+ readonly attribute Admin admin_if;
+ };
+
+ interface SupportAttributes
+ {
+ readonly attribute boolean supports_modifiable_properties;
+ readonly attribute boolean supports_dynamic_properties;
+ readonly attribute boolean supports_proxy_offers;
+ readonly attribute TypeRepository type_repos;
+ };
+
+ interface ImportAttributes
+ {
+ readonly attribute unsigned long def_search_card;
+ readonly attribute unsigned long max_search_card;
+ readonly attribute unsigned long def_match_card;
+ readonly attribute unsigned long max_match_card;
+ readonly attribute unsigned long def_return_card;
+ readonly attribute unsigned long max_return_card;
+ readonly attribute unsigned long max_list;
+ readonly attribute unsigned long def_hop_count;
+ readonly attribute unsigned long max_hop_count;
+ readonly attribute FollowOption def_follow_policy;
+ readonly attribute FollowOption max_follow_policy;
+ };
+
+ interface LinkAttributes
+ {
+ readonly attribute FollowOption max_link_follow_policy;
+ };
+
+ interface Lookup:TraderComponents,SupportAttributes,ImportAttributes
+ {
+ typedef Istring Preference;
+
+ enum HowManyProps { none, some, all };
+
+ union SpecifiedProps switch ( HowManyProps )
+ {
+ case some: PropertyNameSeq prop_names;
+ };
+
+ exception IllegalPreference {
+ Preference pref;
+ };
+
+ exception IllegalPolicyName {
+ PolicyName name;
+ };
+
+ exception PolicyTypeMismatch {
+ Policy the_policy;
+ };
+
+ exception InvalidPolicyValue {
+ Policy the_policy;
+ };
+
+ void query (in ServiceTypeName type,
+ in Constraint constr,
+ in Preference pref,
+ in PolicySeq policies,
+ in SpecifiedProps desired_props,
+ in unsigned long how_many,
+ out OfferSeq offers,
+ out OfferIterator offer_itr,
+ out PolicyNameSeq limits_applied)
+ raises (IllegalServiceType,
+ UnknownServiceType,
+ IllegalConstraint,
+ IllegalPreference,
+ IllegalPolicyName,
+ PolicyTypeMismatch,
+ InvalidPolicyValue,
+ IllegalPropertyName,
+ DuplicatePropertyName,
+ DuplicatePolicyName);
+ };
+
+ interface Register : TraderComponents, SupportAttributes
+ {
+ struct OfferInfo
+ {
+ Object reference;
+ ServiceTypeName type;
+ PropertySeq properties;
+ };
+
+ exception InvalidObjectRef {
+ Object ref;
+ };
+
+ exception UnknownPropertyName {
+ PropertyName name;
+ };
+
+ exception InterfaceTypeMismatch {
+ ServiceTypeName type;
+ Object reference;
+ };
+
+ exception ProxyOfferId {
+ OfferId id;
+ };
+
+ exception MandatoryProperty {
+ ServiceTypeName type;
+ PropertyName name;
+ };
+
+ exception ReadonlyProperty {
+ ServiceTypeName type;
+ PropertyName name;
+ };
+
+ exception NoMatchingOffers {
+ Constraint constr;
+ };
+
+ exception IllegalTraderName {
+ TraderName name;
+ };
+
+ exception UnknownTraderName {
+ TraderName name;
+ };
+
+ exception RegisterNotSupported {
+ TraderName name;
+ };
+
+ OfferId export (in Object reference,
+ in ServiceTypeName type,
+ in PropertySeq properties)
+ raises (InvalidObjectRef,
+ IllegalServiceType,
+ UnknownServiceType,
+ InterfaceTypeMismatch,
+ IllegalPropertyName, // e.g. prop_name = "<foo-bar"
+ PropertyTypeMismatch,
+ ReadonlyDynamicProperty,
+ MissingMandatoryProperty,
+ DuplicatePropertyName);
+
+ void withdraw (in OfferId id)
+ raises (IllegalOfferId,
+ UnknownOfferId,
+ ProxyOfferId);
+
+ OfferInfo describe (in OfferId id)
+ raises (IllegalOfferId,
+ UnknownOfferId,
+ ProxyOfferId);
+
+ void modify (in OfferId id,
+ in PropertyNameSeq del_list,
+ in PropertySeq modify_list)
+ raises (NotImplemented,
+ IllegalOfferId,
+ UnknownOfferId,
+ ProxyOfferId,
+ IllegalPropertyName,
+ UnknownPropertyName,
+ PropertyTypeMismatch,
+ ReadonlyDynamicProperty,
+ MandatoryProperty,
+ ReadonlyProperty,
+ DuplicatePropertyName);
+
+ void withdraw_using_constraint (in ServiceTypeName type,
+ in Constraint constr)
+ raises (IllegalServiceType,
+ UnknownServiceType,
+ IllegalConstraint,
+ NoMatchingOffers);
+
+ Register resolve (in TraderName name)
+ raises (IllegalTraderName,
+ UnknownTraderName,
+ RegisterNotSupported);
+ };
+
+ interface Link : TraderComponents, SupportAttributes, LinkAttributes
+ {
+ struct LinkInfo
+ {
+ Lookup target;
+ Register target_reg;
+ FollowOption def_pass_on_follow_rule;
+ FollowOption limiting_follow_rule;
+ };
+
+ exception IllegalLinkName {
+ LinkName name;
+ };
+
+ exception UnknownLinkName {
+ LinkName name;
+ };
+
+ exception DuplicateLinkName {
+ LinkName name;
+ };
+
+ exception DefaultFollowTooPermissive {
+ FollowOption def_pass_on_follow_rule;
+ FollowOption limiting_follow_rule;
+ };
+
+ exception LimitingFollowTooPermissive {
+ FollowOption limiting_follow_rule;
+ FollowOption max_link_follow_policy;
+ };
+
+ void add_link (in LinkName name,
+ in Lookup target,
+ in FollowOption def_pass_on_follow_rule,
+ in FollowOption limiting_follow_rule)
+ raises (IllegalLinkName,
+ DuplicateLinkName,
+ InvalidLookupRef, // e.g. nil
+ DefaultFollowTooPermissive,
+ LimitingFollowTooPermissive);
+
+ void remove_link (in LinkName name)
+ raises (IllegalLinkName,
+ UnknownLinkName);
+
+ LinkInfo describe_link (in LinkName name)
+ raises (IllegalLinkName,
+ UnknownLinkName);
+
+ LinkNameSeq list_links ( );
+
+ void modify_link (in LinkName name,
+ in FollowOption def_pass_on_follow_rule,
+ in FollowOption limiting_follow_rule)
+ raises (IllegalLinkName,
+ UnknownLinkName,
+ DefaultFollowTooPermissive,
+ LimitingFollowTooPermissive);
+ };
+
+ interface Proxy : TraderComponents, SupportAttributes
+ {
+ typedef Istring ConstraintRecipe;
+
+ struct ProxyInfo
+ {
+ ServiceTypeName type;
+ Lookup target;
+ PropertySeq properties;
+ boolean if_match_all;
+ ConstraintRecipe recipe;
+ PolicySeq policies_to_pass_on;
+ };
+
+ exception IllegalRecipe {
+ ConstraintRecipe recipe;
+ };
+
+ exception NotProxyOfferId {
+ OfferId id;
+ };
+
+ OfferId export_proxy (in Lookup target,
+ in ServiceTypeName type,
+ in PropertySeq properties,
+ in boolean if_match_all,
+ in ConstraintRecipe recipe,
+ in PolicySeq policies_to_pass_on)
+ raises (IllegalServiceType,
+ UnknownServiceType,
+ InvalidLookupRef, // e.g. nil
+ IllegalPropertyName,
+ PropertyTypeMismatch,
+ ReadonlyDynamicProperty,
+ MissingMandatoryProperty,
+ IllegalRecipe,
+ DuplicatePropertyName,
+ DuplicatePolicyName);
+
+ void withdraw_proxy (in OfferId id)
+ raises (IllegalOfferId,
+ UnknownOfferId,
+ NotProxyOfferId);
+
+ ProxyInfo describe_proxy (in OfferId id)
+ raises (IllegalOfferId,
+ UnknownOfferId,
+ NotProxyOfferId);
+ };
+
+ interface Admin : TraderComponents, SupportAttributes, ImportAttributes, LinkAttributes
+ {
+ typedef sequence<octet> OctetSeq;
+
+ readonly attribute OctetSeq request_id_stem;
+
+ unsigned long set_def_search_card (in unsigned long value);
+ unsigned long set_max_search_card (in unsigned long value);
+
+ unsigned long set_def_match_card (in unsigned long value);
+ unsigned long set_max_match_card (in unsigned long value);
+
+ unsigned long set_def_return_card (in unsigned long value);
+ unsigned long set_max_return_card (in unsigned long value);
+
+ unsigned long set_max_list (in unsigned long value);
+
+ boolean set_supports_modifiable_properties (in boolean value);
+ boolean set_supports_dynamic_properties (in boolean value);
+ boolean set_supports_proxy_offers (in boolean value);
+
+ unsigned long set_def_hop_count (in unsigned long value);
+ unsigned long set_max_hop_count (in unsigned long value);
+
+ FollowOption set_def_follow_policy (in FollowOption policy);
+ FollowOption set_max_follow_policy (in FollowOption policy);
+
+ FollowOption set_max_link_follow_policy (in FollowOption policy);
+
+ TypeRepository set_type_repos (in TypeRepository repository);
+
+ OctetSeq set_request_id_stem (in OctetSeq stem);
+
+ void list_offers (in unsigned long how_many,
+ out OfferIdSeq ids,
+ out OfferIdIterator id_itr)
+ raises (NotImplemented);
+
+ void list_proxies (in unsigned long how_many,
+ out OfferIdSeq ids,
+ out OfferIdIterator id_itr)
+ raises (NotImplemented);
+ };
+
+ interface OfferIterator
+ {
+ unsigned long max_left ()
+ raises (UnknownMaxLeft);
+
+ boolean next_n (in unsigned long n,
+ out OfferSeq offers);
+
+ void destroy ();
+ };
+
+ interface OfferIdIterator
+ {
+ unsigned long max_left ()
+ raises (UnknownMaxLeft);
+
+ boolean next_n (in unsigned long n,
+ out OfferIdSeq ids);
+
+ void destroy ();
+ };
+
+}; /* end module CosTrading */
+
+#endif /* TAO_TRADING_IDL */
diff --git a/TAO/orbsvcs/orbsvcs/CosTrading.mpc b/TAO/orbsvcs/orbsvcs/CosTrading.mpc
new file mode 100644
index 00000000000..ef436ac2479
--- /dev/null
+++ b/TAO/orbsvcs/orbsvcs/CosTrading.mpc
@@ -0,0 +1,133 @@
+// -*- MPC -*-
+// $Id$
+
+project(CosTrading_IDL) : orbsvcslib, core, tao_versioning_idl_defaults {
+ custom_only = 1
+ idlflags += -Wb,stub_export_macro=TAO_Trading_Export -Wb,stub_export_include=orbsvcs/Trader/trading_export.h -Wb,skel_export_macro=TAO_Trading_Skel_Export -Wb,skel_export_include=orbsvcs/Trader/trading_skel_export.h
+
+ IDL_Files {
+ CosTrading.idl
+ CosTradingRepos.idl
+ CosTradingDynamic.idl
+ }
+}
+
+
+project(CosTrading) : orbsvcslib, core {
+ sharedname = TAO_CosTrading
+ dynamicflags = TAO_TRADING_BUILD_DLL
+ tagchecks += Trader
+ after += CosTrading_IDL
+
+ IDL_Files {
+ }
+
+ Source_Files {
+ CosTradingC.cpp
+ CosTradingReposC.cpp
+ CosTradingDynamicC.cpp
+ }
+
+ Header_Files {
+ CosTradingC.h
+ CosTradingReposC.h
+ CosTradingDynamicC.h
+ Trader/trading_export.h
+ }
+
+ Inline_Files {
+ CosTradingC.inl
+ CosTradingReposC.inl
+ CosTradingDynamicC.inl
+ }
+
+ Template_Files {
+ }
+
+ // explicit Resource_Files to avoid including _Skel & _Serv rc files.
+ Resource_Files {
+ CosTrading.rc
+ }
+
+ Pkgconfig_Files {
+ TAO_CosTrading.pc.in
+ }
+}
+
+
+project(CosTrading_Skel) : orbsvcslib, core, trading, portableserver {
+ sharedname = TAO_CosTrading_Skel
+ dynamicflags = TAO_TRADING_SKEL_BUILD_DLL
+ tagchecks += Trader
+
+ IDL_Files {
+ }
+
+ Source_Files {
+ CosTradingS.cpp
+ CosTradingReposS.cpp
+ CosTradingDynamicS.cpp
+ }
+
+ Header_Files {
+ CosTradingS.h
+ CosTradingReposS.h
+ CosTradingDynamicS.h
+
+ CosTradingS_T.h
+ CosTradingReposS_T.h
+ CosTradingDynamicS_T.h
+
+ Trader/trading_skel_export.h
+ }
+
+ Inline_Files {
+ CosTradingS.inl
+ CosTradingReposS.inl
+ CosTradingDynamicS.inl
+
+ CosTradingS_T.inl
+ CosTradingReposS_T.inl
+ CosTradingDynamicS_T.inl
+ }
+
+ Template_Files {
+ CosTradingS_T.cpp
+ CosTradingReposS_T.cpp
+ CosTradingDynamicS_T.cpp
+ }
+
+ Pkgconfig_Files {
+ TAO_CosTrading_Skel.pc.in
+ }
+}
+
+
+project(CosTrading_Serv) : orbsvcslib, core, trading_skel, dynamicany, svc_utils, utils, iortable {
+ sharedname = TAO_CosTrading_Serv
+ dynamicflags = TAO_TRADING_SERV_BUILD_DLL
+ tagchecks += Trader
+ pch_header =
+ pch_source =
+
+ IDL_Files {
+ }
+
+ Source_Files {
+ Trader
+ }
+
+ Header_Files {
+ Trader/trading_serv_export.h
+ }
+
+ Inline_Files {
+ }
+
+ Template_Files {
+ }
+
+ Pkgconfig_Files {
+ TAO_CosTrading_Serv.pc.in
+ }
+}
diff --git a/TAO/orbsvcs/orbsvcs/CosTrading.rc b/TAO/orbsvcs/orbsvcs/CosTrading.rc
new file mode 100644
index 00000000000..4c97fd47c18
--- /dev/null
+++ b/TAO/orbsvcs/orbsvcs/CosTrading.rc
@@ -0,0 +1,30 @@
+#include "..\..\tao\Version.h"
+
+1 VERSIONINFO
+ FILEVERSION TAO_MAJOR_VERSION,TAO_MINOR_VERSION,TAO_BETA_VERSION,0
+ PRODUCTVERSION TAO_MAJOR_VERSION,TAO_MINOR_VERSION,TAO_BETA_VERSION,0
+ FILEFLAGSMASK 0x3fL
+ FILEFLAGS 0x0L
+ FILEOS 0x4L
+ FILETYPE 0x1L
+ FILESUBTYPE 0x0L
+BEGIN
+ BLOCK "StringFileInfo"
+ BEGIN
+ BLOCK "040904B0"
+ BEGIN
+ VALUE "FileDescription", "CosTrading\0"
+ VALUE "FileVersion", TAO_VERSION "\0"
+ VALUE "InternalName", "TAO_CosTradingDLL\0"
+ VALUE "LegalCopyright", "\0"
+ VALUE "LegalTrademarks", "\0"
+ VALUE "OriginalFilename", "TAO_CosTrading.DLL\0"
+ VALUE "ProductName", "ORBSVCS\0"
+ VALUE "ProductVersion", TAO_VERSION "\0"
+ END
+ END
+ BLOCK "VarFileInfo"
+ BEGIN
+ VALUE "Translation", 0x409, 1200
+ END
+END
diff --git a/TAO/orbsvcs/orbsvcs/CosTradingDynamic.idl b/TAO/orbsvcs/orbsvcs/CosTradingDynamic.idl
new file mode 100644
index 00000000000..27ffedbbf35
--- /dev/null
+++ b/TAO/orbsvcs/orbsvcs/CosTradingDynamic.idl
@@ -0,0 +1,50 @@
+/* -*- C++ -*- */
+
+// ========================================================================
+// $Id$
+//
+// = FILENAME
+// CosTradingDynamic.idl
+//
+// = DESCRIPTION
+// Trader Service v1.0 described in CORBAservices: Common Object
+// Services Specification, chapter 16 OMG IDL for Trading Function
+// Module, p 16-74
+//
+// ========================================================================
+
+#ifndef TAO_TRADING_DYNAMIC_IDL
+#define TAO_TRADING_DYNAMIC_IDL
+
+#include <orb.idl>
+#include "CosTrading.idl"
+
+#pragma prefix "omg.org"
+
+// OMG IDL for Dynamic Property Module, p 16-88
+
+module CosTradingDynamic
+{
+
+ exception DPEvalFailure {
+ CosTrading::PropertyName name;
+ CORBA::TypeCode returned_type;
+ any extra_info;
+ };
+
+ interface DynamicPropEval
+ {
+ any evalDP (in CosTrading::PropertyName name,
+ in CORBA::TypeCode returned_type,
+ in any extra_info)
+ raises (DPEvalFailure);
+ };
+
+ struct DynamicProp {
+ DynamicPropEval eval_if;
+ CORBA::TypeCode returned_type;
+ any extra_info;
+ };
+}; /* end module CosTradingDynamic */
+
+#endif /* TAO_TRADING_DYNAMIC_IDL */
diff --git a/TAO/orbsvcs/orbsvcs/CosTradingRepos.idl b/TAO/orbsvcs/orbsvcs/CosTradingRepos.idl
new file mode 100644
index 00000000000..0462030155e
--- /dev/null
+++ b/TAO/orbsvcs/orbsvcs/CosTradingRepos.idl
@@ -0,0 +1,159 @@
+/* -*- C++ -*- */
+
+// ========================================================================
+// $Id$
+//
+// = FILENAME
+// CosTradingRepos.idl
+//
+// = DESCRIPTION
+// Trader Service v1.0 described in CORBAservices: Common Object
+// Services Specification, chapter 16 OMG IDL for Trading Function
+// Module, p 16-74
+//
+// ========================================================================
+
+#ifndef TAO_TRADING_REPOS_IDL
+#define TAO_TRADING_REPOS_IDL
+
+#include <orb.idl>
+#include "CosTrading.idl"
+
+#pragma prefix "omg.org"
+
+// OMG IDL for Service Type Repository Module, p 16-89
+
+module CosTradingRepos
+{
+ interface ServiceTypeRepository
+ {
+ // local types
+ typedef sequence<CosTrading::ServiceTypeName> ServiceTypeNameSeq;
+ enum PropertyMode {
+ PROP_NORMAL, PROP_READONLY,
+ PROP_MANDATORY, PROP_MANDATORY_READONLY
+ };
+ struct PropStruct
+ {
+ CosTrading::PropertyName name;
+ CORBA::TypeCode value_type;
+ PropertyMode mode;
+ };
+ typedef sequence<PropStruct> PropStructSeq;
+
+ typedef CosTrading::Istring Identifier; // IR::Identifier
+
+ struct IncarnationNumber
+ {
+ unsigned long high;
+ unsigned long low;
+ };
+
+ struct TypeStruct
+ {
+ Identifier if_name;
+ PropStructSeq props;
+ ServiceTypeNameSeq super_types;
+ boolean masked;
+ IncarnationNumber incarnation;
+ };
+
+ enum ListOption { all, since };
+ union SpecifiedServiceTypes switch ( ListOption ) {
+ case all: boolean all_;
+ case since: IncarnationNumber incarnation;
+ };
+
+ // local exceptions
+ exception ServiceTypeExists {
+ CosTrading::ServiceTypeName name;
+ };
+
+ exception InterfaceTypeMismatch {
+ CosTrading::ServiceTypeName base_service;
+ Identifier base_if;
+ CosTrading::ServiceTypeName derived_service;
+ Identifier derived_if;
+ };
+
+ exception HasSubTypes {
+ CosTrading::ServiceTypeName the_type;
+ CosTrading::ServiceTypeName sub_type;
+ };
+
+ exception AlreadyMasked {
+ CosTrading::ServiceTypeName name;
+ };
+
+ exception NotMasked {
+ CosTrading::ServiceTypeName name;
+ };
+
+ exception ValueTypeRedefinition {
+ CosTrading::ServiceTypeName type_1;
+ PropStruct definition_1;
+ CosTrading::ServiceTypeName type_2;
+ PropStruct definition_2;
+ };
+
+ exception DuplicateServiceTypeName {
+ CosTrading::ServiceTypeName name;
+ };
+
+ // attributes
+ readonly attribute IncarnationNumber incarnation;
+
+ // operation signatures
+ IncarnationNumber add_type (in CosTrading::ServiceTypeName name,
+ in Identifier if_name,
+ in PropStructSeq props,
+ in ServiceTypeNameSeq super_types)
+ raises (CosTrading::IllegalServiceType,
+ ServiceTypeExists,
+ InterfaceTypeMismatch,
+ CosTrading::IllegalPropertyName,
+ CosTrading::DuplicatePropertyName,
+ ValueTypeRedefinition,
+ CosTrading::UnknownServiceType,
+ DuplicateServiceTypeName);
+
+ void remove_type (in CosTrading::ServiceTypeName name)
+ raises (CosTrading::IllegalServiceType,
+ CosTrading::UnknownServiceType,
+ HasSubTypes);
+
+ ServiceTypeNameSeq list_types (in SpecifiedServiceTypes which_types);
+
+ TypeStruct describe_type (in CosTrading::ServiceTypeName name)
+ raises (CosTrading::IllegalServiceType,
+ CosTrading::UnknownServiceType);
+
+ TypeStruct fully_describe_type (in CosTrading::ServiceTypeName name)
+ raises (CosTrading::IllegalServiceType,
+ CosTrading::UnknownServiceType);
+
+ void mask_type (in CosTrading::ServiceTypeName name)
+ raises (CosTrading::IllegalServiceType,
+ CosTrading::UnknownServiceType,
+ AlreadyMasked);
+
+ void unmask_type (in CosTrading::ServiceTypeName name)
+ raises (CosTrading::IllegalServiceType,
+ CosTrading::UnknownServiceType,
+ NotMasked);
+ };
+}; /* end module CosTradingRepos */
+
+module CosTradingSequences
+{
+ typedef sequence<short> ShortSeq;
+ typedef sequence<unsigned short> UShortSeq;
+ typedef sequence<long> LongSeq;
+ typedef sequence<unsigned long> ULongSeq;
+ typedef sequence<boolean> BooleanSeq;
+ typedef sequence<float> FloatSeq;
+ typedef sequence<double> DoubleSeq;
+ typedef sequence<string> StringSeq;
+};
+
+#endif /* TAO_TRADING_REPOS_IDL */
diff --git a/TAO/orbsvcs/orbsvcs/CosTrading_Serv.rc b/TAO/orbsvcs/orbsvcs/CosTrading_Serv.rc
new file mode 100644
index 00000000000..f079fe2686c
--- /dev/null
+++ b/TAO/orbsvcs/orbsvcs/CosTrading_Serv.rc
@@ -0,0 +1,30 @@
+#include "..\..\tao\Version.h"
+
+1 VERSIONINFO
+ FILEVERSION TAO_MAJOR_VERSION,TAO_MINOR_VERSION,TAO_BETA_VERSION,0
+ PRODUCTVERSION TAO_MAJOR_VERSION,TAO_MINOR_VERSION,TAO_BETA_VERSION,0
+ FILEFLAGSMASK 0x3fL
+ FILEFLAGS 0x0L
+ FILEOS 0x4L
+ FILETYPE 0x1L
+ FILESUBTYPE 0x0L
+BEGIN
+ BLOCK "StringFileInfo"
+ BEGIN
+ BLOCK "040904B0"
+ BEGIN
+ VALUE "FileDescription", "CosTrading_Serv\0"
+ VALUE "FileVersion", TAO_VERSION "\0"
+ VALUE "InternalName", "TAO_CosTrading_ServDLL\0"
+ VALUE "LegalCopyright", "\0"
+ VALUE "LegalTrademarks", "\0"
+ VALUE "OriginalFilename", "TAO_CosTrading_Serv.DLL\0"
+ VALUE "ProductName", "ORBSVCS\0"
+ VALUE "ProductVersion", TAO_VERSION "\0"
+ END
+ END
+ BLOCK "VarFileInfo"
+ BEGIN
+ VALUE "Translation", 0x409, 1200
+ END
+END
diff --git a/TAO/orbsvcs/orbsvcs/CosTrading_Skel.rc b/TAO/orbsvcs/orbsvcs/CosTrading_Skel.rc
new file mode 100644
index 00000000000..587858c0034
--- /dev/null
+++ b/TAO/orbsvcs/orbsvcs/CosTrading_Skel.rc
@@ -0,0 +1,30 @@
+#include "..\..\tao\Version.h"
+
+1 VERSIONINFO
+ FILEVERSION TAO_MAJOR_VERSION,TAO_MINOR_VERSION,TAO_BETA_VERSION,0
+ PRODUCTVERSION TAO_MAJOR_VERSION,TAO_MINOR_VERSION,TAO_BETA_VERSION,0
+ FILEFLAGSMASK 0x3fL
+ FILEFLAGS 0x0L
+ FILEOS 0x4L
+ FILETYPE 0x1L
+ FILESUBTYPE 0x0L
+BEGIN
+ BLOCK "StringFileInfo"
+ BEGIN
+ BLOCK "040904B0"
+ BEGIN
+ VALUE "FileDescription", "CosTrading_Skel\0"
+ VALUE "FileVersion", TAO_VERSION "\0"
+ VALUE "InternalName", "TAO_CosTrading_SkelDLL\0"
+ VALUE "LegalCopyright", "\0"
+ VALUE "LegalTrademarks", "\0"
+ VALUE "OriginalFilename", "TAO_CosTrading_Skel.DLL\0"
+ VALUE "ProductName", "ORBSVCS\0"
+ VALUE "ProductVersion", TAO_VERSION "\0"
+ END
+ END
+ BLOCK "VarFileInfo"
+ BEGIN
+ VALUE "Translation", 0x409, 1200
+ END
+END
diff --git a/TAO/orbsvcs/orbsvcs/CosTypedEventChannelAdmin.idl b/TAO/orbsvcs/orbsvcs/CosTypedEventChannelAdmin.idl
new file mode 100644
index 00000000000..5a809fb1642
--- /dev/null
+++ b/TAO/orbsvcs/orbsvcs/CosTypedEventChannelAdmin.idl
@@ -0,0 +1,62 @@
+
+//=============================================================================
+/**
+* @file CosTypedEventChannelAdmin.idl
+*
+* $Id$
+*
+* @brief Part of the Event Service
+* See http://www.omg.org/docs/formal/01-03-01.pdf
+*/
+//=============================================================================
+
+#ifndef _COS_TYPED_EVENT_CHANNEL_ADMIN_IDL_
+#define _COS_TYPED_EVENT_CHANNEL_ADMIN_IDL_
+
+#include "CosEventChannelAdmin.idl"
+#include "CosTypedEventComm.idl"
+
+#pragma prefix "omg.org"
+
+module CosTypedEventChannelAdmin {
+
+ exception InterfaceNotSupported {};
+ exception NoSuchImplementation {};
+ typedef string Key;
+
+ interface TypedProxyPushConsumer :
+ CosEventChannelAdmin::ProxyPushConsumer,
+ CosTypedEventComm::TypedPushConsumer { };
+
+ interface TypedProxyPullSupplier :
+ CosEventChannelAdmin::ProxyPullSupplier,
+ CosTypedEventComm::TypedPullSupplier { };
+
+ interface TypedSupplierAdmin :
+ CosEventChannelAdmin::SupplierAdmin {
+ TypedProxyPushConsumer obtain_typed_push_consumer(
+ in Key supported_interface)
+ raises(InterfaceNotSupported);
+ CosEventChannelAdmin::ProxyPullConsumer obtain_typed_pull_consumer (
+ in Key uses_interface)
+ raises(NoSuchImplementation);
+ };
+
+ interface TypedConsumerAdmin :
+ CosEventChannelAdmin::ConsumerAdmin {
+ TypedProxyPullSupplier obtain_typed_pull_supplier(
+ in Key supported_interface)
+ raises (InterfaceNotSupported);
+ CosEventChannelAdmin::ProxyPushSupplier obtain_typed_push_supplier(
+ in Key uses_interface)
+ raises(NoSuchImplementation);
+ };
+
+ interface TypedEventChannel {
+ TypedConsumerAdmin for_consumers();
+ TypedSupplierAdmin for_suppliers();
+ void destroy ();
+ };
+};
+
+#endif /* _COS_TYPED_EVENT_CHANNEL_ADMIN_IDL_ */
diff --git a/TAO/orbsvcs/orbsvcs/CosTypedEventComm.idl b/TAO/orbsvcs/orbsvcs/CosTypedEventComm.idl
new file mode 100644
index 00000000000..a210c06d616
--- /dev/null
+++ b/TAO/orbsvcs/orbsvcs/CosTypedEventComm.idl
@@ -0,0 +1,32 @@
+
+//=============================================================================
+/**
+* @file CosTypedEventComm.idl
+*
+* $Id$
+*
+* @brief Part of the Event Service
+* See http://www.omg.org/docs/formal/01-03-01.pdf
+*/
+//=============================================================================
+
+#ifndef _COS_TYPED_EVENT_COMM_IDL_
+#define _COS_TYPED_EVENT_COMM_IDL_
+
+#include "CosEventComm.idl"
+
+#pragma prefix "omg.org"
+
+module CosTypedEventComm {
+
+ interface TypedPushConsumer : CosEventComm::PushConsumer {
+ Object get_typed_consumer();
+ };
+
+ interface TypedPullSupplier : CosEventComm::PullSupplier {
+ Object get_typed_supplier();
+ };
+
+};
+
+#endif // _COS_TYPED_EVENT_COMM_IDL
diff --git a/TAO/orbsvcs/orbsvcs/DsEventLogAdmin.idl b/TAO/orbsvcs/orbsvcs/DsEventLogAdmin.idl
new file mode 100644
index 00000000000..0bebdb87218
--- /dev/null
+++ b/TAO/orbsvcs/orbsvcs/DsEventLogAdmin.idl
@@ -0,0 +1,56 @@
+// $Id$
+
+// ============================================================================
+//
+// = FILENAME
+// DsEventLogAdmin.idl
+//
+// = DESCRIPTION
+// This module defines the EventLog and
+// EventLogFactory interfaces.
+//
+// = AUTHOR
+// D A Hanvey (d.hanvey@qub.ac.uk)
+//
+// ============================================================================
+
+#ifndef DS_EVENT_LOG_ADMIN_IDL
+#define DS_EVENT_LOG_ADMIN_IDL
+
+#include "CosEventChannelAdmin.idl"
+// CORBA Event Service
+
+#include "DsLogAdmin.idl"
+
+#pragma prefix "omg.org"
+
+module DsEventLogAdmin
+{
+ interface EventLog : DsLogAdmin::Log,
+ CosEventChannelAdmin::EventChannel{};
+
+ interface EventLogFactory : DsLogAdmin::LogMgr,
+ CosEventChannelAdmin::ConsumerAdmin
+ {
+ EventLog create (
+ in DsLogAdmin::LogFullActionType full_action,
+ in unsigned long long max_size,
+ in DsLogAdmin::CapacityAlarmThresholdList thresholds,
+ out DsLogAdmin::LogId id
+ ) raises (DsLogAdmin::InvalidLogFullAction,
+ DsLogAdmin::InvalidThreshold);
+
+ EventLog create_with_id (
+ in DsLogAdmin::LogId id,
+ in DsLogAdmin::LogFullActionType full_action,
+ in unsigned long long max_size,
+ in DsLogAdmin::CapacityAlarmThresholdList thresholds
+ ) raises (DsLogAdmin::LogIdAlreadyExists,
+ DsLogAdmin::InvalidLogFullAction,
+ DsLogAdmin::InvalidThreshold);
+
+ };
+
+};
+
+#endif /* DS_EVENT_LOG_ADMIN_IDL */
diff --git a/TAO/orbsvcs/orbsvcs/DsEventLogAdmin.mpc b/TAO/orbsvcs/orbsvcs/DsEventLogAdmin.mpc
new file mode 100644
index 00000000000..4322406dedc
--- /dev/null
+++ b/TAO/orbsvcs/orbsvcs/DsEventLogAdmin.mpc
@@ -0,0 +1,108 @@
+// -*- MPC -*-
+// $Id$
+
+project(DsEventLogAdmin_IDL) : orbsvcslib, core, dslogadmin, event, tao_versioning_idl_defaults {
+ custom_only = 1
+ idlflags += -Wb,stub_export_macro=TAO_EventLog_Export -Wb,stub_export_include=orbsvcs/Log/eventlog_export.h -Wb,skel_export_macro=TAO_EventLog_Skel_Export -Wb,skel_export_include=orbsvcs/Log/eventlog_skel_export.h
+
+ IDL_Files {
+ DsEventLogAdmin.idl
+ }
+}
+
+project(DsEventLogAdmin) : orbsvcslib, core, dslogadmin, event {
+ sharedname = TAO_DsEventLogAdmin
+ dynamicflags = TAO_EVENTLOG_BUILD_DLL
+ tagchecks += EventLog
+ after += DsEventLogAdmin_IDL
+
+ IDL_Files {
+ }
+
+ Source_Files {
+ DsEventLogAdminC.cpp
+ }
+
+ Header_Files {
+ DsEventLogAdminC.h
+ Log/eventlog_export.h
+ }
+
+ Inline_Files {
+ DsEventLogAdminC.inl
+ }
+
+ Template_Files {
+ }
+
+ // explicit Resource_Files to avoid including _Skel & _Serv rc files.
+ Resource_Files {
+ DsEventLogAdmin.rc
+ }
+
+ Pkgconfig_Files {
+ TAO_DsEventLogAdmin.pc.in
+ }
+}
+
+project(DsEventLogAdmin_Skel) : orbsvcslib, core, dseventlogadmin, dslogadmin_skel, event_skel, portableserver {
+ sharedname = TAO_DsEventLogAdmin_Skel
+ dynamicflags = TAO_EVENTLOG_SKEL_BUILD_DLL
+ tagchecks += EventLog
+
+ IDL_Files {
+ }
+
+ Source_Files {
+ DsEventLogAdminS.cpp
+ }
+
+ Header_Files {
+ DsEventLogAdminS.h
+ DsEventLogAdminS_T.h
+ Log/eventlog_skel_export.h
+ }
+
+ Inline_Files {
+ DsEventLogAdminS.inl
+ DsEventLogAdminS_T.inl
+ }
+
+ Template_Files {
+ DsEventLogAdminS_T.cpp
+ }
+
+ Pkgconfig_Files {
+ TAO_DsEventLogAdmin_Skel.pc.in
+ }
+}
+
+project(DsEventLogAdmin_Serv) : orbsvcslib, core, dseventlogadmin_skel, dslogadmin_serv, event_serv {
+ sharedname = TAO_DsEventLogAdmin_Serv
+ dynamicflags = TAO_EVENTLOG_SERV_BUILD_DLL
+ tagchecks += EventLog
+
+ IDL_Files {
+ }
+
+ Source_Files {
+ Log/EventLogConsumer.cpp
+ Log/EventLogFactory_i.cpp
+ Log/EventLogNotification.cpp
+ Log/EventLog_i.cpp
+ }
+
+ Header_Files {
+ Log/eventlog_serv_export.h
+ }
+
+ Inline_Files {
+ }
+
+ Template_Files {
+ }
+
+ Pkgconfig_Files {
+ TAO_DsEventLogAdmin_Serv.pc.in
+ }
+}
diff --git a/TAO/orbsvcs/orbsvcs/DsEventLogAdmin.rc b/TAO/orbsvcs/orbsvcs/DsEventLogAdmin.rc
new file mode 100644
index 00000000000..0fec7155d31
--- /dev/null
+++ b/TAO/orbsvcs/orbsvcs/DsEventLogAdmin.rc
@@ -0,0 +1,30 @@
+#include "..\..\tao\Version.h"
+
+1 VERSIONINFO
+ FILEVERSION TAO_MAJOR_VERSION,TAO_MINOR_VERSION,TAO_BETA_VERSION,0
+ PRODUCTVERSION TAO_MAJOR_VERSION,TAO_MINOR_VERSION,TAO_BETA_VERSION,0
+ FILEFLAGSMASK 0x3fL
+ FILEFLAGS 0x0L
+ FILEOS 0x4L
+ FILETYPE 0x1L
+ FILESUBTYPE 0x0L
+BEGIN
+ BLOCK "StringFileInfo"
+ BEGIN
+ BLOCK "040904B0"
+ BEGIN
+ VALUE "FileDescription", "DsEventLogAdmin\0"
+ VALUE "FileVersion", TAO_VERSION "\0"
+ VALUE "InternalName", "TAO_DsEventLogAdminDLL\0"
+ VALUE "LegalCopyright", "\0"
+ VALUE "LegalTrademarks", "\0"
+ VALUE "OriginalFilename", "TAO_DsEventLogAdmin.DLL\0"
+ VALUE "ProductName", "ORBSVCS\0"
+ VALUE "ProductVersion", TAO_VERSION "\0"
+ END
+ END
+ BLOCK "VarFileInfo"
+ BEGIN
+ VALUE "Translation", 0x409, 1200
+ END
+END
diff --git a/TAO/orbsvcs/orbsvcs/DsLogAdmin.idl b/TAO/orbsvcs/orbsvcs/DsLogAdmin.idl
new file mode 100644
index 00000000000..9e5fa09bae9
--- /dev/null
+++ b/TAO/orbsvcs/orbsvcs/DsLogAdmin.idl
@@ -0,0 +1,337 @@
+// $Id$
+
+// ============================================================================
+//
+// = FILENAME
+// DsLogAdmin.idl
+//
+// = DESCRIPTION
+// This module defines the Log, Iterator, LogMgr and LogFactory
+// interfaces for the OMG's Telecom Event Log Service
+//
+// ============================================================================
+
+#ifndef DS_LOG_ADMIN_IDL
+#define DS_LOG_ADMIN_IDL
+
+#include "tao/TimeBase.pidl"
+// CORBA Time Service
+
+#pragma prefix "omg.org"
+
+module DsLogAdmin
+{
+ exception InvalidParam {string details;};
+ exception InvalidThreshold {};
+ exception InvalidTime {};
+ exception InvalidTimeInterval {};
+ exception InvalidMask {};
+ exception LogIdAlreadyExists {};
+ exception InvalidGrammar{};
+ exception InvalidConstraint{};
+ exception LogFull {short n_records_written;};
+ exception LogOffDuty {};
+ exception LogLocked {};
+ exception LogDisabled {};
+ exception InvalidRecordId {};
+ exception InvalidAttribute {string attr_name; any value;};
+ exception InvalidLogFullAction {};
+
+
+ typedef unsigned long LogId;
+ // LogIds are unique within the scope of the log factory.
+
+ typedef unsigned long long RecordId;
+ // RecordIds are unique within the scope of one log.
+
+ typedef sequence<RecordId> RecordIdList;
+ const string default_grammar = "EXTENDED_TCL";
+ // Default grammar used for log record queries.
+ typedef string Constraint;
+ // A query string
+ typedef TimeBase::TimeT TimeT;
+
+ struct NVPair
+ {
+ string name;
+ any value;
+ };
+ typedef sequence<NVPair> NVList;
+
+ struct TimeInterval
+ {
+ TimeT start;
+ TimeT stop;
+ };
+
+ typedef sequence<TimeInterval> TimeIntervalSeq;
+
+ struct LogRecord
+ {
+ RecordId id;
+ // Unique number assigned by the log
+ TimeT time;
+ // Time when the event is logged
+ NVList attr_list;
+ // List of user defined name/value pairs. Not part of the event
+ // received by the log. Optional.
+ any info;
+ // Event content
+ };
+
+ typedef sequence<LogRecord> RecordList;
+ typedef sequence<any> Anys;
+
+
+ interface Iterator
+ {
+ // = TITLE
+ // Iterator with bulk operation support; returned as a
+ // result of querying the Log
+ //
+ // = DESCRIPTION
+ // Allows clients to iterate over a list of LogRecords
+ // returned from a query () or retrieve () operation
+
+ RecordList get(in unsigned long position,
+ in unsigned long how_many) raises(InvalidParam);
+ // Returns a maximum of <how_many> records, starting from
+ // position <position>
+
+ void destroy();
+ // Destroy the iterator
+ };
+
+ struct AvailabilityStatus
+ {
+ boolean off_duty;
+ boolean log_full;
+ };
+
+ typedef unsigned short LogFullActionType;
+
+ const LogFullActionType wrap = 0;
+ const LogFullActionType halt = 1;
+
+ struct Time24
+ {
+ unsigned short hour;// 0-23
+ unsigned short minute;// 0-59
+ };
+
+ struct Time24Interval
+ {
+ Time24 start;
+ Time24 stop;
+ };
+
+ typedef sequence<Time24Interval> IntervalsOfDay;
+ const unsigned short Sunday = 1;
+ const unsigned short Monday = 2;
+ const unsigned short Tuesday = 4;
+ const unsigned short Wednesday = 8;
+ const unsigned short Thursday = 16;
+ const unsigned short Friday = 32;
+ const unsigned short Saturday = 64;
+ typedef unsigned short DaysOfWeek;// Bit mask of week days
+
+ struct WeekMaskItem
+ {
+ DaysOfWeek days;
+ IntervalsOfDay intervals;
+ };
+
+ typedef sequence<WeekMaskItem> WeekMask;
+ typedef unsigned short Threshold; // 0-100 %
+ typedef sequence<Threshold> CapacityAlarmThresholdList;
+ interface LogMgr;
+
+ enum OperationalState { disabled, enabled };
+ // Logging enabled/disabled. If the log is enabled, it can be
+ // queried. If it is disabled, is may not be.
+
+ enum AdministrativeState { locked, unlocked };
+ // Logging on/off. If the log is locked, new records cannot be
+ // added, but records can be queried.
+
+ enum ForwardingState { on, off };
+ // Forwarding on/off. If forwarding is on, the log should forward
+ // records to other event consumers.
+
+ typedef unsigned short QoSType;
+ typedef sequence<QoSType> QoSList;
+
+ exception UnsupportedQoS { QoSList denied; };
+ const QoSType QoSNone = 0;
+ const QoSType QoSFlush = 1;
+ const QoSType QoSReliability = 2;
+
+
+ interface Log
+ {
+ LogMgr my_factory();
+ // Return the factory of the log
+
+ LogId id();
+ // Return the id of the log
+
+ QoSList get_log_qos();
+ void set_log_qos(in QoSList qos) raises(UnsupportedQoS);
+ // Get or set the list of the QoS properties supported by the log
+
+ unsigned long get_max_record_life();
+ void set_max_record_life(in unsigned long life);
+ // Get and set the record life in seconds (0 == infinite)
+
+ unsigned long long get_max_size();
+ void set_max_size(in unsigned long long size) raises (InvalidParam);
+ // Get and set the maximum size in octets (0 == no limit)
+
+ unsigned long long get_current_size();
+ // Return the current size in octets
+
+ unsigned long long get_n_records();
+ // Return the number of records in the log
+
+ LogFullActionType get_log_full_action();
+ void set_log_full_action(in LogFullActionType action)
+ raises(InvalidLogFullAction);
+ // Get and set the action to be taken when the log reaches its
+ // maximum size
+
+ AdministrativeState get_administrative_state();
+ void set_administrative_state(in AdministrativeState state);
+ // Get and set the administrative state (locked/unlocked)
+
+ ForwardingState get_forwarding_state();
+ void set_forwarding_state(in ForwardingState state);
+ // Get and set the forwarding state (on or off)
+
+ OperationalState get_operational_state();
+ // Returns the operational state (disabled or enabled)
+
+ TimeInterval get_interval();
+ void set_interval(in TimeInterval interval)
+ raises (InvalidTime, InvalidTimeInterval);
+ // Get and set the log duration
+
+ AvailabilityStatus get_availability_status();
+ // Return the availability status (off_duty or log_full)
+
+ CapacityAlarmThresholdList get_capacity_alarm_thresholds();
+ void set_capacity_alarm_thresholds(in CapacityAlarmThresholdList
+ threshs)
+ raises (InvalidThreshold);
+ // Get and set the capacity alarm threshold
+
+
+ WeekMask get_week_mask();
+ void set_week_mask(in WeekMask masks)
+ raises (InvalidTime, InvalidTimeInterval, InvalidMask);
+ // Get and set the weekly scheduling parameters
+
+ RecordList query(in string grammar,
+ in Constraint c,
+ out Iterator i)
+ raises(InvalidGrammar, InvalidConstraint);
+ // Returns all records in the log that match the given
+ // constraint <c>. Note that match () only returns the number
+ // of matches, whereas query () returns the actual matches.
+
+ RecordList retrieve(in TimeT from_time,
+ in long how_many,
+ out Iterator i);
+ // Retrieve <how_many> records from time <from_time> using
+ // iterator <i>. Negative <how_many> indicates backwards
+ // retrieval
+
+ unsigned long match(in string grammar,
+ in Constraint c)
+ raises(InvalidGrammar, InvalidConstraint);
+ // Returns the number of records matching constraint <c>
+
+
+ unsigned long delete_records(in string grammar,
+ in Constraint c)
+ raises(InvalidGrammar, InvalidConstraint);
+ unsigned long delete_records_by_id(in RecordIdList ids);
+ // Delete records matching constraint <c> or with ids in
+ // <ids>. Both operations return the number of records deleted
+
+ void write_records(in Anys records)
+ raises(LogFull, LogOffDuty, LogLocked, LogDisabled);
+ // Write records to the log storage
+
+ void write_recordlist(in RecordList list)
+ raises(LogFull, LogOffDuty, LogLocked, LogDisabled);
+ // Write a list of record ids to storage
+
+ void set_record_attribute(in RecordId id,
+ in NVList attr_list)
+ raises(InvalidRecordId, InvalidAttribute);
+ // Set single record attributes
+
+
+ unsigned long set_records_attribute(in string grammar,
+ in Constraint c,
+ in NVList attr_list)
+ raises(InvalidGrammar, InvalidConstraint, InvalidAttribute);
+ // Set the attributes of all records that matches the
+ // constraints with same attr_list. Returns number of records
+ // whose attributes have been set
+
+ NVList get_record_attribute(in RecordId id)
+ raises(InvalidRecordId);
+ // Get the attributes of the record with id <id>
+
+ Log copy(out LogId id);
+ Log copy_with_id (in LogId id) raises (LogIdAlreadyExists);
+ // Copy the log on which the operation was invoked. copy ()
+ // Returns the unique id of the newly created
+ // log. copy_with_id () attempts to create the new log with
+ // the specified id, but may fail if the id is in use
+
+ void flush() raises (UnsupportedQoS);
+ // Causes all pending events to be written to storage before
+ // flush () returns
+ };
+
+
+ interface BasicLog : Log
+ {
+ void destroy();
+ // Destroy the log object and all contained records
+ };
+
+ typedef sequence<Log> LogList;
+ typedef sequence<LogId> LogIdList;
+
+ interface LogMgr
+ {
+ LogList list_logs();
+ // Lists all logs created by the log factory
+
+ Log find_log(in LogId id);
+ // Returns a reference to the log with the supplied id
+
+ LogIdList list_logs_by_id();
+ // Lists all log ids
+ };
+
+ interface BasicLogFactory : LogMgr
+ {
+ BasicLog create (in LogFullActionType full_action,
+ in unsigned long long max_size,
+ out LogId id)
+ raises (InvalidLogFullAction);
+ // Allows clients to create new BasicLog objects.
+
+ BasicLog create_with_id (in LogId id,
+ in LogFullActionType full_action,
+ in unsigned long long max_size)
+ raises (LogIdAlreadyExists, InvalidLogFullAction);
+ // Same as create (), but allows clients to specify the id
+ };
+};
+
+#endif /* DS_LOG_ADMIN_IDL */
diff --git a/TAO/orbsvcs/orbsvcs/DsLogAdmin.mpc b/TAO/orbsvcs/orbsvcs/DsLogAdmin.mpc
new file mode 100644
index 00000000000..d0d9a4dea5e
--- /dev/null
+++ b/TAO/orbsvcs/orbsvcs/DsLogAdmin.mpc
@@ -0,0 +1,137 @@
+// -*- MPC -*-
+// $Id$
+
+project(DsLogAdmin_IDL) : orbsvcslib, core, tao_versioning_idl_defaults {
+ custom_only = 1
+ idlflags += -Wb,stub_export_macro=TAO_Log_Export -Wb,stub_export_include=orbsvcs/Log/log_export.h -Wb,skel_export_macro=TAO_Log_Skel_Export -Wb,skel_export_include=orbsvcs/Log/log_skel_export.h
+
+ IDL_Files {
+ DsLogAdmin.idl
+ DsLogNotification.idl
+ }
+}
+
+project(DsLogAdmin) : orbsvcslib, core {
+ sharedname = TAO_DsLogAdmin
+ dynamicflags = TAO_LOG_BUILD_DLL
+ tagchecks += Log
+ after += DsLogAdmin_IDL
+
+ IDL_Files {
+ }
+
+ Source_Files {
+ DsLogAdminC.cpp
+ DsLogNotificationC.cpp
+ }
+
+ Header_Files {
+ DsLogAdminC.h
+ DsLogNotificationC.h
+ Log/log_export.h
+ }
+
+ Inline_Files {
+ DsLogAdminC.inl
+ DsLogNotificationC.inl
+ }
+
+ Template_Files {
+ }
+
+ // explicit Resource_Files to avoid including _Skel & _Serv rc files.
+ Resource_Files {
+ DsLogAdmin.rc
+ }
+
+ Pkgconfig_Files {
+ TAO_DsLogAdmin.pc.in
+ }
+}
+
+
+project(DsLogAdmin_Skel) : orbsvcslib, core, dslogadmin, portableserver {
+ sharedname = TAO_DsLogAdmin_Skel
+ dynamicflags = TAO_LOG_SKEL_BUILD_DLL
+ tagchecks += Log
+
+ IDL_Files {
+ }
+
+ Source_Files {
+ DsLogAdminS.cpp
+ DsLogNotificationS.cpp
+ }
+
+ Header_Files {
+ DsLogAdminS.h
+ DsLogNotificationS.h
+
+ DsLogAdminS_T.h
+ DsLogNotificationS_T.h
+
+ Log/log_skel_export.h
+ }
+
+ Inline_Files {
+ DsLogAdminS.inl
+ DsLogNotificationS.inl
+
+ DsLogAdminS_T.inl
+ DsLogNotificationS_T.inl
+ }
+
+ Template_Files {
+ DsLogAdminS_T.cpp
+ DsLogNotificationS_T.cpp
+ }
+
+ Pkgconfig_Files {
+ TAO_DsLogAdmin_Skel.pc.in
+ }
+}
+
+
+project(DsLogAdmin_Serv) : orbsvcslib, core, dslogadmin_skel, dynamicany, etcl, utils, svc_utils {
+ sharedname = TAO_DsLogAdmin_Serv
+ dynamicflags = TAO_LOG_SERV_BUILD_DLL
+ tagchecks += Log
+
+ IDL_Files {
+ }
+
+ Source_Files {
+ Log/BasicLogFactory_i.cpp
+ Log/BasicLog_i.cpp
+ Log/Hash_Iterator_i.cpp
+ Log/Hash_LogRecordStore.cpp
+ Log/Hash_LogStore.cpp
+ Log/Hash_Persistence_Strategy.cpp
+ Log/Iterator_i.cpp
+ Log/LogActivator.cpp
+ Log/LogMgr_i.cpp
+ Log/LogNotification.cpp
+ Log/LogRecordStore.cpp
+ Log/Log_Compaction_Handler.cpp
+ Log/Log_Constraint_Interpreter.cpp
+ Log/Log_Constraint_Visitors.cpp
+ Log/Log_Flush_Handler.cpp
+ Log/Log_i.cpp
+ }
+
+ Header_Files {
+ Log/LogStore.h
+ Log/Log_Persistence_Strategy.h
+ Log/log_serv_export.h
+ }
+
+ Inline_Files {
+ }
+
+ Template_Files {
+ }
+
+ Pkgconfig_Files {
+ TAO_DsLogAdmin_Serv.pc.in
+ }
+}
diff --git a/TAO/orbsvcs/orbsvcs/DsLogAdmin.rc b/TAO/orbsvcs/orbsvcs/DsLogAdmin.rc
new file mode 100644
index 00000000000..d9c4397bc94
--- /dev/null
+++ b/TAO/orbsvcs/orbsvcs/DsLogAdmin.rc
@@ -0,0 +1,30 @@
+#include "..\..\tao\Version.h"
+
+1 VERSIONINFO
+ FILEVERSION TAO_MAJOR_VERSION,TAO_MINOR_VERSION,TAO_BETA_VERSION,0
+ PRODUCTVERSION TAO_MAJOR_VERSION,TAO_MINOR_VERSION,TAO_BETA_VERSION,0
+ FILEFLAGSMASK 0x3fL
+ FILEFLAGS 0x0L
+ FILEOS 0x4L
+ FILETYPE 0x1L
+ FILESUBTYPE 0x0L
+BEGIN
+ BLOCK "StringFileInfo"
+ BEGIN
+ BLOCK "040904B0"
+ BEGIN
+ VALUE "FileDescription", "DsLogAdmin\0"
+ VALUE "FileVersion", TAO_VERSION "\0"
+ VALUE "InternalName", "TAO_DsLogAdminDLL\0"
+ VALUE "LegalCopyright", "\0"
+ VALUE "LegalTrademarks", "\0"
+ VALUE "OriginalFilename", "TAO_DsLogAdmin.DLL\0"
+ VALUE "ProductName", "ORBSVCS\0"
+ VALUE "ProductVersion", TAO_VERSION "\0"
+ END
+ END
+ BLOCK "VarFileInfo"
+ BEGIN
+ VALUE "Translation", 0x409, 1200
+ END
+END
diff --git a/TAO/orbsvcs/orbsvcs/DsLogNotification.idl b/TAO/orbsvcs/orbsvcs/DsLogNotification.idl
new file mode 100644
index 00000000000..ff06d490c53
--- /dev/null
+++ b/TAO/orbsvcs/orbsvcs/DsLogNotification.idl
@@ -0,0 +1,112 @@
+// $Id$
+
+// ============================================================================
+//
+// = FILENAME
+// DsLogNotification.idl
+//
+// = DESCRIPTION
+// This module defines the Log Generated Events module
+// for the OMG's Telecom Event Log Service
+//
+// ============================================================================
+
+#ifndef DS_LOG_NOTIFICATION_IDL
+#define DS_LOG_NOTIFICATION_IDL
+
+#include "DsLogAdmin.idl"
+// CORBA Log Service
+
+#pragma prefix "omg.org"
+
+module DsLogNotification
+{
+
+ typedef DsLogAdmin::Log Log;
+ typedef DsLogAdmin::LogId LogId;
+ typedef DsLogAdmin::Threshold Threshold;
+ typedef TimeBase::TimeT TimeT;
+
+ // definition of ThresholdAlarm, the event generated by Log when
+ // Log reaches its capacity alarm threshold
+
+ typedef unsigned short PerceivedSeverityType;
+
+ const PerceivedSeverityType critical = 0;
+ const PerceivedSeverityType minor = 1;
+ const PerceivedSeverityType cleared = 2;
+
+ struct ThresholdAlarm {
+ Log logref;
+ LogId id;
+ TimeT time;
+ Threshold crossed_value; // the threshold level just being crossed
+ Threshold observed_value; // the current percentage
+ PerceivedSeverityType perceived_severity;
+ };
+
+ // the events generated by
+ // Log when a Log object is created or deleted
+
+ struct ObjectCreation {
+ LogId id;
+ TimeT time;
+ };
+
+ // NOTE: cannot say "typedef ObjectCreation ObjectDeletion because
+ // type would be lost in current C++ mappings for Anys.
+
+ struct ObjectDeletion {
+ LogId id;
+ TimeT time;
+ };
+
+ // definition of AttributeValueChange notification, the event generated by
+ // Log when a Log's attribute has changed
+
+ typedef unsigned short AttributeType;
+ const AttributeType capacityAlarmThreshold = 0;
+ const AttributeType logFullAction = 1;
+ const AttributeType maxLogSize = 2;
+ const AttributeType startTime = 3;
+ const AttributeType stopTime = 4;
+ const AttributeType weekMask = 5;
+ const AttributeType filter = 6;
+ const AttributeType maxRecordLife = 7;
+ const AttributeType qualityOfService = 8;
+
+ struct AttributeValueChange {
+ Log logref;
+ LogId id;
+ TimeT time;
+ AttributeType type;
+ any old_value;
+ any new_value;
+ };
+
+ // definition of StateChange notification, the event generated by
+ // Log when a Log's state has changed
+
+ typedef unsigned short StateType;
+ const StateType administrativeState = 0;
+ const StateType operationalState = 1;
+ const StateType forwardingState = 2;
+
+ struct StateChange {
+ Log logref;
+ LogId id;
+ TimeT time;
+ StateType type;
+ any new_value;
+ };
+
+ struct ProcessingErrorAlarm {
+ // Event generated by a log when a problem occurs within the log.
+ // The highest 20 bits or error_num are reserved for vender
+ // specific Ids.
+ long error_num;
+ string error_string;
+ };
+};
+
+#endif /* DS_LOG_NOTIFICATION_IDL */
diff --git a/TAO/orbsvcs/orbsvcs/DsNotifyLogAdmin.idl b/TAO/orbsvcs/orbsvcs/DsNotifyLogAdmin.idl
new file mode 100644
index 00000000000..36ebae57f5f
--- /dev/null
+++ b/TAO/orbsvcs/orbsvcs/DsNotifyLogAdmin.idl
@@ -0,0 +1,66 @@
+// $Id$
+
+// ============================================================================
+//
+// = FILENAME
+// DsNotifyLogAdmin.idl
+//
+// = DESCRIPTION
+// This module defines the NotifyLog and
+// NotifyLogFactory interfaces.
+//
+// = AUTHOR
+// David Hanvey (d.hanvey@qub.ac.uk)
+//
+// ============================================================================
+
+#ifndef DS_NOTIFY_LOG_ADMIN_IDL
+#define DS_NOTIFY_LOG_ADMIN_IDL
+
+#include "DsEventLogAdmin.idl"
+#include "CosNotifyChannelAdmin.idl"
+#include "CosNotifyFilter.idl"
+#include "CosNotification.idl"
+#pragma prefix "omg.org"
+
+module DsNotifyLogAdmin
+{
+ interface NotifyLog : DsEventLogAdmin::EventLog,
+ CosNotifyChannelAdmin::EventChannel
+ {
+ CosNotifyFilter::Filter get_filter();
+ void set_filter(in CosNotifyFilter::Filter filter);
+ };
+
+ interface NotifyLogFactory : DsLogAdmin::LogMgr,
+ CosNotifyChannelAdmin::ConsumerAdmin
+ {
+ NotifyLog create (
+ in DsLogAdmin::LogFullActionType full_action,
+ in unsigned long long max_size,
+ in DsLogAdmin::CapacityAlarmThresholdList thresholds,
+ in CosNotification::QoSProperties initial_qos,
+ in CosNotification::AdminProperties initial_admin,
+ out DsLogAdmin::LogId id
+ ) raises (DsLogAdmin::InvalidLogFullAction,
+ DsLogAdmin::InvalidThreshold,
+ CosNotification::UnsupportedQoS,
+ CosNotification::UnsupportedAdmin);
+
+ NotifyLog create_with_id (
+ in DsLogAdmin::LogId id,
+ in DsLogAdmin::LogFullActionType full_action,
+ in unsigned long long max_size,
+ in DsLogAdmin::CapacityAlarmThresholdList thresholds,
+ in CosNotification::QoSProperties initial_qos,
+ in CosNotification::AdminProperties initial_admin
+ ) raises (DsLogAdmin::LogIdAlreadyExists,
+ DsLogAdmin::InvalidLogFullAction,
+ DsLogAdmin::InvalidThreshold,
+ CosNotification::UnsupportedQoS,
+ CosNotification::UnsupportedAdmin);
+ };
+
+};
+
+#endif /* DS_NOTIFY_LOG_ADMIN_IDL */
diff --git a/TAO/orbsvcs/orbsvcs/DsNotifyLogAdmin.mpc b/TAO/orbsvcs/orbsvcs/DsNotifyLogAdmin.mpc
new file mode 100644
index 00000000000..bf66701ee09
--- /dev/null
+++ b/TAO/orbsvcs/orbsvcs/DsNotifyLogAdmin.mpc
@@ -0,0 +1,110 @@
+// -*- MPC -*-
+// $Id$
+
+project(DsNotifyLogAdmin_IDL) : orbsvcslib, core, dslogadmin, dseventlogadmin, event, notification, tao_versioning_idl_defaults {
+ custom_only = 1
+ idlflags += -Wb,stub_export_macro=TAO_NotifyLog_Export -Wb,stub_export_include=orbsvcs/Log/notifylog_export.h -Wb,skel_export_macro=TAO_NotifyLog_Skel_Export -Wb,skel_export_include=orbsvcs/Log/notifylog_skel_export.h
+
+ IDL_Files {
+ DsNotifyLogAdmin.idl
+ }
+}
+
+project(DsNotifyLogAdmin) : orbsvcslib, core, dslogadmin, dseventlogadmin, event, notification {
+ sharedname = TAO_DsNotifyLogAdmin
+ dynamicflags = TAO_NOTIFYLOG_BUILD_DLL
+ tagchecks += Log
+ after += DsNotifyLogAdmin_IDL
+
+ IDL_Files {
+ }
+
+ Source_Files {
+ DsNotifyLogAdminC.cpp
+ }
+
+ Header_Files {
+ DsNotifyLogAdminC.h
+ Log/notifylog_export.h
+ }
+
+ Inline_Files {
+ DsNotifyLogAdminC.inl
+ }
+
+ Template_Files {
+ }
+
+ // explicit Resource_Files to avoid including _Skel & _Serv rc files.
+ Resource_Files {
+ DsNotifyLogAdmin.rc
+ }
+
+ Pkgconfig_Files {
+ TAO_DsNotifyLogAdmin.pc.in
+ }
+}
+
+
+project(DsNotifyLogAdmin_Skel) : orbsvcslib, core, dsnotifylogadmin, dseventlogadmin_skel, dslogadmin_skel, event_skel, notification_skel, portableserver {
+ sharedname = TAO_DsNotifyLogAdmin_Skel
+ dynamicflags = TAO_NOTIFYLOG_SKEL_BUILD_DLL
+ tagchecks += Log
+
+ IDL_Files {
+ }
+
+ Source_Files {
+ DsNotifyLogAdminS.cpp
+ }
+
+ Header_Files {
+ DsNotifyLogAdminS.h
+ DsNotifyLogAdminS_T.h
+ Log/notifylog_skel_export.h
+ }
+
+ Inline_Files {
+ DsNotifyLogAdminS.inl
+ DsNotifyLogAdminS_T.inl
+ }
+
+ Template_Files {
+ DsNotifyLogAdminS_T.cpp
+ }
+
+ Pkgconfig_Files {
+ TAO_DsNotifyLogAdmin_Skel.pc.in
+ }
+}
+
+
+project(DsNotifyLogAdmin_Serv) : orbsvcslib, core, dsnotifylogadmin_skel, dslogadmin_serv {
+ sharedname = TAO_DsNotifyLogAdmin_Serv
+ dynamicflags = TAO_NOTIFYLOG_SERV_BUILD_DLL
+ tagchecks += Log
+
+ IDL_Files {
+ }
+
+ Source_Files {
+ Log/NotifyLogConsumer.cpp
+ Log/NotifyLogFactory_i.cpp
+ Log/NotifyLogNotification.cpp
+ Log/NotifyLog_i.cpp
+ }
+
+ Header_Files {
+ Log/notifylog_serv_export.h
+ }
+
+ Inline_Files {
+ }
+
+ Template_Files {
+ }
+
+ Pkgconfig_Files {
+ TAO_DsNotifyLogAdmin_Serv.pc.in
+ }
+}
diff --git a/TAO/orbsvcs/orbsvcs/DsNotifyLogAdmin.rc b/TAO/orbsvcs/orbsvcs/DsNotifyLogAdmin.rc
new file mode 100644
index 00000000000..52b474bacc0
--- /dev/null
+++ b/TAO/orbsvcs/orbsvcs/DsNotifyLogAdmin.rc
@@ -0,0 +1,30 @@
+#include "..\..\tao\Version.h"
+
+1 VERSIONINFO
+ FILEVERSION TAO_MAJOR_VERSION,TAO_MINOR_VERSION,TAO_BETA_VERSION,0
+ PRODUCTVERSION TAO_MAJOR_VERSION,TAO_MINOR_VERSION,TAO_BETA_VERSION,0
+ FILEFLAGSMASK 0x3fL
+ FILEFLAGS 0x0L
+ FILEOS 0x4L
+ FILETYPE 0x1L
+ FILESUBTYPE 0x0L
+BEGIN
+ BLOCK "StringFileInfo"
+ BEGIN
+ BLOCK "040904B0"
+ BEGIN
+ VALUE "FileDescription", "DsNotifyLogAdmin\0"
+ VALUE "FileVersion", TAO_VERSION "\0"
+ VALUE "InternalName", "TAO_DsNotifyLogAdminDLL\0"
+ VALUE "LegalCopyright", "\0"
+ VALUE "LegalTrademarks", "\0"
+ VALUE "OriginalFilename", "TAO_DsNotifyLogAdmin.DLL\0"
+ VALUE "ProductName", "ORBSVCS\0"
+ VALUE "ProductVersion", TAO_VERSION "\0"
+ END
+ END
+ BLOCK "VarFileInfo"
+ BEGIN
+ VALUE "Translation", 0x409, 1200
+ END
+END
diff --git a/TAO/orbsvcs/orbsvcs/ESF/ESF_Busy_Lock.cpp b/TAO/orbsvcs/orbsvcs/ESF/ESF_Busy_Lock.cpp
new file mode 100644
index 00000000000..0cca17fb185
--- /dev/null
+++ b/TAO/orbsvcs/orbsvcs/ESF/ESF_Busy_Lock.cpp
@@ -0,0 +1,64 @@
+// $Id$
+
+#ifndef TAO_ESF_BUSY_LOCK_CPP
+#define TAO_ESF_BUSY_LOCK_CPP
+
+#include "orbsvcs/ESF/ESF_Busy_Lock.h"
+
+#if ! defined (__ACE_INLINE__)
+#include "orbsvcs/ESF/ESF_Busy_Lock.i"
+#endif /* __ACE_INLINE__ */
+
+TAO_BEGIN_VERSIONED_NAMESPACE_DECL
+
+template<class T>
+int TAO_ESF_Busy_Lock_Adapter<T>::remove (void)
+{
+ return 0;
+}
+
+template<class T>
+int TAO_ESF_Busy_Lock_Adapter<T>::acquire (void)
+{
+ return this->adaptee_->busy ();
+}
+
+template<class T>
+int TAO_ESF_Busy_Lock_Adapter<T>::tryacquire (void)
+{
+ return this->adaptee_->busy ();
+}
+
+template<class T>
+int TAO_ESF_Busy_Lock_Adapter<T>::release (void)
+{
+ return this->adaptee_->idle ();
+}
+
+template<class T>
+int TAO_ESF_Busy_Lock_Adapter<T>::acquire_read (void)
+{
+ return this->adaptee_->busy ();
+}
+
+template<class T>
+int TAO_ESF_Busy_Lock_Adapter<T>::acquire_write (void)
+{
+ return this->adaptee_->busy ();
+}
+
+template<class T>
+int TAO_ESF_Busy_Lock_Adapter<T>::tryacquire_read (void)
+{
+ return this->adaptee_->busy ();
+}
+
+template<class T>
+int TAO_ESF_Busy_Lock_Adapter<T>::tryacquire_write (void)
+{
+ return this->adaptee_->busy ();
+}
+
+TAO_END_VERSIONED_NAMESPACE_DECL
+
+#endif /* TAO_ESF_BUSY_LOCK_CPP */
diff --git a/TAO/orbsvcs/orbsvcs/ESF/ESF_Busy_Lock.h b/TAO/orbsvcs/orbsvcs/ESF/ESF_Busy_Lock.h
new file mode 100644
index 00000000000..2c112e4f25e
--- /dev/null
+++ b/TAO/orbsvcs/orbsvcs/ESF/ESF_Busy_Lock.h
@@ -0,0 +1,80 @@
+/* -*- C++ -*- */
+/**
+ * @file ESF_Busy_Lock.h
+ *
+ * $Id$
+ *
+ * @author Carlos O'Ryan (coryan@cs.wustl.edu)
+ *
+ * http://doc.ece.uci.edu/~coryan/EC/index.html
+ */
+
+#ifndef TAO_ESF_BUSY_LOCK_H
+#define TAO_ESF_BUSY_LOCK_H
+
+#include "ace/config-all.h"
+
+#if !defined (ACE_LACKS_PRAGMA_ONCE)
+# pragma once
+#endif /* ACE_LACKS_PRAGMA_ONCE */
+
+TAO_BEGIN_VERSIONED_NAMESPACE_DECL
+
+/// Adapt classes that implement the "busy lock" protocol, to conform
+/// to the ACE Lock interface.
+/**
+ * The ACE Lock interface allows us to use any mutex-like object with
+ * the ACE synchronization components (such as guards, Lock_Adapter,
+ * etc.).
+ * One of the synchronization protocols used in the event services
+ * uses the following protocol:
+ * <UL>
+ * <LI> To acquire the lock the @c busy method of the object is invoked.
+ * <LI> To release the lock the @c idle method of the object is invoked.
+ * <LI> Any changes performed while the lock is held are delayed until
+ * all the locks are released, i.e. the last call to @c idle
+ * executes the changes.
+ * </UL>
+ */
+template<class Adaptee>
+class TAO_ESF_Busy_Lock_Adapter
+{
+public:
+ /// Constructor
+ TAO_ESF_Busy_Lock_Adapter (Adaptee* adaptee);
+
+ /**
+ * @name The ACE_Lock methods
+ *
+ * Check the documentation in ace/Synch.h for details.
+ */
+ //@{
+ int remove (void);
+ int acquire (void);
+ int tryacquire (void);
+ int release (void);
+ int acquire_read (void);
+ int acquire_write (void);
+ int tryacquire_read (void);
+ int tryacquire_write (void);
+ //@}
+
+private:
+ Adaptee* adaptee_;
+};
+
+TAO_END_VERSIONED_NAMESPACE_DECL
+
+#if defined (__ACE_INLINE__)
+#include "orbsvcs/ESF/ESF_Busy_Lock.i"
+#endif /* __ACE_INLINE__ */
+
+#if defined (ACE_TEMPLATES_REQUIRE_SOURCE)
+#include "orbsvcs/ESF/ESF_Busy_Lock.cpp"
+#endif /* ACE_TEMPLATES_REQUIRE_SOURCE */
+
+#if defined (ACE_TEMPLATES_REQUIRE_PRAGMA)
+#pragma implementation ("ESF_Busy_Lock.cpp")
+#endif /* ACE_TEMPLATES_REQUIRE_PRAGMA */
+
+#endif /* TAO_ESF_BUSY_LOCK_H */
diff --git a/TAO/orbsvcs/orbsvcs/ESF/ESF_Busy_Lock.i b/TAO/orbsvcs/orbsvcs/ESF/ESF_Busy_Lock.i
new file mode 100644
index 00000000000..8c39a00c2e9
--- /dev/null
+++ b/TAO/orbsvcs/orbsvcs/ESF/ESF_Busy_Lock.i
@@ -0,0 +1,13 @@
+// -*- C++ -*-
+//
+// $Id$
+
+TAO_BEGIN_VERSIONED_NAMESPACE_DECL
+
+template<class T> ACE_INLINE
+TAO_ESF_Busy_Lock_Adapter<T>::TAO_ESF_Busy_Lock_Adapter (T* adaptee)
+ : adaptee_ (adaptee)
+{
+}
+
+TAO_END_VERSIONED_NAMESPACE_DECL
diff --git a/TAO/orbsvcs/orbsvcs/ESF/ESF_Copy_On_Read.cpp b/TAO/orbsvcs/orbsvcs/ESF/ESF_Copy_On_Read.cpp
new file mode 100644
index 00000000000..ea15a0e703e
--- /dev/null
+++ b/TAO/orbsvcs/orbsvcs/ESF/ESF_Copy_On_Read.cpp
@@ -0,0 +1,120 @@
+// $Id$
+
+#ifndef TAO_ESF_COPY_ON_READ_CPP
+#define TAO_ESF_COPY_ON_READ_CPP
+
+#include "orbsvcs/ESF/ESF_Copy_On_Read.h"
+#include "orbsvcs/ESF/ESF_Worker.h"
+
+TAO_BEGIN_VERSIONED_NAMESPACE_DECL
+
+template<class PROXY, class COLLECTION, class ITERATOR, class ACE_LOCK>
+TAO_ESF_Copy_On_Read<PROXY,COLLECTION,ITERATOR,ACE_LOCK>::
+ TAO_ESF_Copy_On_Read (void)
+{
+}
+
+template<class PROXY, class COLLECTION, class ITERATOR, class ACE_LOCK>
+TAO_ESF_Copy_On_Read<PROXY,COLLECTION,ITERATOR,ACE_LOCK>::
+ TAO_ESF_Copy_On_Read (const COLLECTION &collection)
+ : collection_ (collection)
+{
+}
+
+template<class PROXY, class COLLECTION, class ITERATOR, class ACE_LOCK> void
+TAO_ESF_Copy_On_Read<PROXY,COLLECTION,ITERATOR,ACE_LOCK>::
+ for_each (TAO_ESF_Worker<PROXY> *worker
+ ACE_ENV_ARG_DECL)
+{
+ // @@ Use an allocator for this memory...
+ PROXY **proxies = 0;
+ size_t size = 0;
+ ACE_TRY
+ {
+ {
+ ACE_GUARD (ACE_LOCK, ace_mon, this->lock_);
+
+ size = this->collection_.size ();
+ ACE_NEW (proxies, PROXY*[size]);
+ PROXY **j = proxies;
+
+ for (; j != proxies + size; ++j)
+ *j = 0;
+
+ j = proxies;
+
+ ITERATOR end = this->collection_.end ();
+ for (ITERATOR i = this->collection_.begin (); i != end; ++i)
+ {
+ *j = *i;
+ (*j)->_incr_refcnt ();
+ ++j;
+ }
+ }
+ worker->set_size(size);
+ for (PROXY **j = proxies; j != proxies + size; ++j)
+ {
+ worker->work (*j ACE_ENV_ARG_PARAMETER);
+ ACE_TRY_CHECK;
+ (*j)->_decr_refcnt ();
+ }
+ delete[] proxies;
+ }
+ ACE_CATCHANY
+ {
+ for (PROXY **j = proxies; j != proxies + size; ++j)
+ {
+ if (*j != 0)
+ (*j)->_decr_refcnt ();
+ }
+ delete[] proxies;
+
+ ACE_RE_THROW;
+ }
+ ACE_ENDTRY;
+}
+
+template<class PROXY, class COLLECTION, class ITERATOR, class ACE_LOCK> void
+TAO_ESF_Copy_On_Read<PROXY,COLLECTION,ITERATOR,ACE_LOCK>::
+ connected (PROXY *proxy
+ ACE_ENV_ARG_DECL)
+{
+ ACE_GUARD (ACE_LOCK, ace_mon, this->lock_);
+
+ proxy->_incr_refcnt ();
+ this->collection_.connected (proxy ACE_ENV_ARG_PARAMETER);
+}
+
+template<class PROXY, class COLLECTION, class ITERATOR, class ACE_LOCK> void
+TAO_ESF_Copy_On_Read<PROXY,COLLECTION,ITERATOR,ACE_LOCK>::
+ reconnected (PROXY *proxy
+ ACE_ENV_ARG_DECL)
+{
+ ACE_GUARD (ACE_LOCK, ace_mon, this->lock_);
+
+ proxy->_incr_refcnt ();
+ this->collection_.reconnected (proxy ACE_ENV_ARG_PARAMETER);
+}
+
+template<class PROXY, class COLLECTION, class ITERATOR, class ACE_LOCK> void
+TAO_ESF_Copy_On_Read<PROXY,COLLECTION,ITERATOR,ACE_LOCK>::
+ disconnected (PROXY *proxy
+ ACE_ENV_ARG_DECL)
+{
+ ACE_GUARD (ACE_LOCK, ace_mon, this->lock_);
+
+ this->collection_.disconnected (proxy ACE_ENV_ARG_PARAMETER);
+}
+
+template<class PROXY, class COLLECTION, class ITERATOR, class ACE_LOCK> void
+TAO_ESF_Copy_On_Read<PROXY,COLLECTION,ITERATOR,ACE_LOCK>::
+ shutdown (ACE_ENV_SINGLE_ARG_DECL)
+{
+ ACE_GUARD (ACE_LOCK, ace_mon, this->lock_);
+
+ this->collection_.shutdown (ACE_ENV_SINGLE_ARG_PARAMETER);
+}
+
+TAO_END_VERSIONED_NAMESPACE_DECL
+
+#endif /* TAO_ESF_COPY_ON_READ_CPP */
diff --git a/TAO/orbsvcs/orbsvcs/ESF/ESF_Copy_On_Read.h b/TAO/orbsvcs/orbsvcs/ESF/ESF_Copy_On_Read.h
new file mode 100644
index 00000000000..d5c7c22fcd8
--- /dev/null
+++ b/TAO/orbsvcs/orbsvcs/ESF/ESF_Copy_On_Read.h
@@ -0,0 +1,74 @@
+// -*- C++ -*-
+
+/**
+ * @file ESF_Copy_On_Read.h
+ *
+ * $Id$
+ *
+ * @author Carlos O'Ryan (coryan@cs.wustl.edu)
+ *
+ * http://doc.ece.uci.edu/~coryan/EC/index.html
+ */
+
+#ifndef TAO_ESF_COPY_ON_READ_H
+#define TAO_ESF_COPY_ON_READ_H
+
+#include "orbsvcs/ESF/ESF_Proxy_Collection.h"
+
+#if !defined (ACE_LACKS_PRAGMA_ONCE)
+# pragma once
+#endif /* ACE_LACKS_PRAGMA_ONCE */
+
+TAO_BEGIN_VERSIONED_NAMESPACE_DECL
+
+template<class Target> class TAO_ESF_Worker;
+
+// ****************************************************************
+
+/**
+ * @class TAO_ESF_Copy_On_Read
+ *
+ * @brief Implement the Copy_On_Read protocol
+ *
+ *
+ * The class is parametric on the kind of collection and locking
+ * mechanism used.
+ */
+template<class PROXY, class COLLECTION, class ITERATOR, class ACE_LOCK>
+class TAO_ESF_Copy_On_Read : public TAO_ESF_Proxy_Collection<PROXY>
+{
+public:
+ /// Constructors
+ TAO_ESF_Copy_On_Read (void);
+ TAO_ESF_Copy_On_Read (const COLLECTION &collection);
+
+ // = The TAO_ESF_Proxy_Collection methods
+ virtual void for_each (TAO_ESF_Worker<PROXY> *worker
+ ACE_ENV_ARG_DECL);
+ virtual void connected (PROXY *proxy
+ ACE_ENV_ARG_DECL);
+ virtual void reconnected (PROXY *proxy
+ ACE_ENV_ARG_DECL);
+ virtual void disconnected (PROXY *proxy
+ ACE_ENV_ARG_DECL);
+ virtual void shutdown (ACE_ENV_SINGLE_ARG_DECL);
+
+private:
+ COLLECTION collection_;
+
+ ACE_LOCK lock_;
+};
+
+// ****************************************************************
+
+TAO_END_VERSIONED_NAMESPACE_DECL
+
+#if defined (ACE_TEMPLATES_REQUIRE_SOURCE)
+#include "orbsvcs/ESF/ESF_Copy_On_Read.cpp"
+#endif /* ACE_TEMPLATES_REQUIRE_SOURCE */
+
+#if defined (ACE_TEMPLATES_REQUIRE_PRAGMA)
+#pragma implementation ("ESF_Copy_On_Read.cpp")
+#endif /* ACE_TEMPLATES_REQUIRE_PRAGMA */
+
+#endif /* TAO_ESF_COPY_ON_READ_H */
diff --git a/TAO/orbsvcs/orbsvcs/ESF/ESF_Copy_On_Write.cpp b/TAO/orbsvcs/orbsvcs/ESF/ESF_Copy_On_Write.cpp
new file mode 100644
index 00000000000..169f5eac972
--- /dev/null
+++ b/TAO/orbsvcs/orbsvcs/ESF/ESF_Copy_On_Write.cpp
@@ -0,0 +1,208 @@
+// $Id$
+
+#ifndef TAO_ESF_COPY_ON_WRITE_CPP
+#define TAO_ESF_COPY_ON_WRITE_CPP
+
+#include "orbsvcs/ESF/ESF_Copy_On_Write.h"
+
+#if ! defined (__ACE_INLINE__)
+#include "orbsvcs/ESF/ESF_Copy_On_Write.i"
+#endif /* __ACE_INLINE__ */
+
+#include "tao/Environment.h"
+
+TAO_BEGIN_VERSIONED_NAMESPACE_DECL
+
+template<class COLLECTION, class ITERATOR> CORBA::ULong
+TAO_ESF_Copy_On_Write_Collection<COLLECTION,ITERATOR>::_incr_refcnt (void)
+{
+ // LOCKING: no locking is required, the caller grabs the mutex.
+ return this->refcount_++;
+}
+
+template<class COLLECTION, class ITERATOR> CORBA::ULong
+TAO_ESF_Copy_On_Write_Collection<COLLECTION,ITERATOR>::_decr_refcnt (void)
+{
+ // LOCKING: no locking is required, the caller grabs the mutex.
+ {
+ this->refcount_--;
+ if (this->refcount_ != 0)
+ return this->refcount_;
+ }
+
+ ITERATOR end = this->collection.end ();
+ for (ITERATOR i = this->collection.begin (); i != end; ++i)
+ {
+ (*i)->_decr_refcnt ();
+ }
+
+ delete this;
+ return 0;
+}
+
+// ****************************************************************
+
+template<class PROXY, class COLLECTION, class ITERATOR, ACE_SYNCH_DECL>
+TAO_ESF_Copy_On_Write<PROXY,COLLECTION,ITERATOR,ACE_SYNCH_USE>::
+ TAO_ESF_Copy_On_Write (void)
+ : pending_writes_ (0),
+ writing_ (0),
+ cond_ (mutex_)
+{
+ ACE_NEW (this->collection_, Collection);
+}
+
+template<class PROXY, class COLLECTION, class ITERATOR, ACE_SYNCH_DECL>
+TAO_ESF_Copy_On_Write<PROXY,COLLECTION,ITERATOR,ACE_SYNCH_USE>::
+ ~TAO_ESF_Copy_On_Write (void)
+{
+ ACE_GUARD (ACE_SYNCH_MUTEX_T, ace_mon, this->mutex_);
+
+ while (this->pending_writes_ != 0)
+ this->cond_.wait ();
+
+ this->collection_->_decr_refcnt ();
+ this->collection_ = 0;
+}
+
+template<class PROXY, class COLLECTION, class ITERATOR, ACE_SYNCH_DECL> void
+TAO_ESF_Copy_On_Write<PROXY,COLLECTION,ITERATOR,ACE_SYNCH_USE>::
+ for_each (TAO_ESF_Worker<PROXY> *worker
+ ACE_ENV_ARG_DECL)
+{
+ Read_Guard ace_mon (this->mutex_,
+ this->collection_);
+
+ worker->set_size(ace_mon.collection->collection.size());
+ ITERATOR end = ace_mon.collection->collection.end ();
+ for (ITERATOR i = ace_mon.collection->collection.begin (); i != end; ++i)
+ {
+ worker->work (*i ACE_ENV_ARG_PARAMETER);
+ ACE_CHECK;
+ }
+}
+
+template<class PROXY, class COLLECTION, class ITERATOR, ACE_SYNCH_DECL> void
+TAO_ESF_Copy_On_Write<PROXY,COLLECTION,ITERATOR,ACE_SYNCH_USE>::
+ connected (PROXY *proxy
+ ACE_ENV_ARG_DECL)
+{
+ Write_Guard ace_mon (this->mutex_,
+ this->cond_,
+ this->pending_writes_,
+ this->writing_,
+ this->collection_);
+
+ proxy->_incr_refcnt ();
+ ace_mon.copy->collection.connected (proxy ACE_ENV_ARG_PARAMETER);
+}
+
+template<class PROXY, class COLLECTION, class ITERATOR, ACE_SYNCH_DECL> void
+TAO_ESF_Copy_On_Write<PROXY,COLLECTION,ITERATOR,ACE_SYNCH_USE>::
+ reconnected (PROXY *proxy
+ ACE_ENV_ARG_DECL)
+{
+ Write_Guard ace_mon (this->mutex_,
+ this->cond_,
+ this->pending_writes_,
+ this->writing_,
+ this->collection_);
+
+ proxy->_incr_refcnt ();
+ ace_mon.copy->collection.reconnected (proxy ACE_ENV_ARG_PARAMETER);
+}
+
+template<class PROXY, class COLLECTION, class ITERATOR, ACE_SYNCH_DECL> void
+TAO_ESF_Copy_On_Write<PROXY,COLLECTION,ITERATOR,ACE_SYNCH_USE>::
+ disconnected (PROXY *proxy
+ ACE_ENV_ARG_DECL)
+{
+ Write_Guard ace_mon (this->mutex_,
+ this->cond_,
+ this->pending_writes_,
+ this->writing_,
+ this->collection_);
+
+ ace_mon.copy->collection.disconnected (proxy ACE_ENV_ARG_PARAMETER);
+}
+
+template<class PROXY, class COLLECTION, class ITERATOR, ACE_SYNCH_DECL> void
+TAO_ESF_Copy_On_Write<PROXY,COLLECTION,ITERATOR,ACE_SYNCH_USE>::
+ shutdown (ACE_ENV_SINGLE_ARG_DECL)
+{
+ // We need to perform a copy to follow the protocol.
+ Write_Guard ace_mon (this->mutex_,
+ this->cond_,
+ this->pending_writes_,
+ this->writing_,
+ this->collection_);
+
+ ace_mon.copy->collection.shutdown (ACE_ENV_SINGLE_ARG_PARAMETER);
+}
+
+template<class COLLECTION, class ITERATOR, ACE_SYNCH_DECL>
+TAO_ESF_Copy_On_Write_Write_Guard<COLLECTION,ITERATOR,ACE_SYNCH_USE>::
+ TAO_ESF_Copy_On_Write_Write_Guard (ACE_SYNCH_MUTEX_T &m,
+ ACE_SYNCH_CONDITION_T &c,
+ int &p,
+ int &w,
+ Collection*& cr)
+ : copy (0),
+ mutex (m),
+ cond (c),
+ pending_writes (p),
+ writing_flag (w),
+ collection (cr)
+{
+ {
+ ACE_GUARD (ACE_SYNCH_MUTEX_T, ace_mon, this->mutex);
+
+ this->pending_writes++;
+
+ while (this->writing_flag != 0)
+ this->cond.wait ();
+
+ this->writing_flag = 1;
+ }
+
+ // Copy outside the mutex, because it may take a long time.
+ // Nobody can change it, because it is protected by the
+ // writing_flag.
+
+ // First initialize it (with the correct reference count
+ ACE_NEW (this->copy, Collection);
+ // Copy the contents
+ this->copy->collection = this->collection->collection;
+
+ // Increase the reference counts
+ ITERATOR end = this->copy->collection.end ();
+ for (ITERATOR i = this->copy->collection.begin (); i != end; ++i)
+ {
+ (*i)->_incr_refcnt ();
+ }
+}
+
+template<class COLLECTION, class ITERATOR, ACE_SYNCH_DECL>
+TAO_ESF_Copy_On_Write_Write_Guard<COLLECTION,ITERATOR,ACE_SYNCH_USE>::
+ ~TAO_ESF_Copy_On_Write_Write_Guard (void)
+{
+ Collection *tmp = 0;
+ {
+ ACE_GUARD (ACE_SYNCH_MUTEX_T, ace_mon, this->mutex);
+
+ tmp = this->collection;
+ this->collection = this->copy;
+ this->writing_flag = 0;
+ this->pending_writes--;
+
+ this->cond.signal ();
+ }
+ // Delete outside the mutex, because it may take a long time.
+ tmp->_decr_refcnt ();
+}
+
+// ****************************************************************
+
+TAO_END_VERSIONED_NAMESPACE_DECL
+
+#endif /* TAO_ESF_COPY_ON_WRITE_CPP */
diff --git a/TAO/orbsvcs/orbsvcs/ESF/ESF_Copy_On_Write.h b/TAO/orbsvcs/orbsvcs/ESF/ESF_Copy_On_Write.h
new file mode 100644
index 00000000000..a34659b6e57
--- /dev/null
+++ b/TAO/orbsvcs/orbsvcs/ESF/ESF_Copy_On_Write.h
@@ -0,0 +1,184 @@
+// -*- C++ -*-
+
+/**
+ * @file ESF_Copy_On_Write.h
+ *
+ * $Id$
+ *
+ * @author Carlos O'Ryan (coryan@cs.wustl.edu)
+ *
+ * http://doc.ece.uci.edu/~coryan/EC/index.html
+ */
+
+#ifndef TAO_ESF_COPY_ON_WRITE_H
+#define TAO_ESF_COPY_ON_WRITE_H
+
+#include "orbsvcs/ESF/ESF_Proxy_Collection.h"
+
+#include "tao/Basic_Types.h"
+
+#if !defined (ACE_LACKS_PRAGMA_ONCE)
+# pragma once
+#endif /* ACE_LACKS_PRAGMA_ONCE */
+
+TAO_BEGIN_VERSIONED_NAMESPACE_DECL
+
+template<class COLLECTION, class ITERATOR>
+class TAO_ESF_Copy_On_Write_Collection
+{
+public:
+ TAO_ESF_Copy_On_Write_Collection (void);
+
+ /// Increment the reference count
+ CORBA::ULong _incr_refcnt (void);
+
+ /// Decrement the reference count
+ CORBA::ULong _decr_refcnt (void);
+
+ /// The actual collection
+ COLLECTION collection;
+
+private:
+ /// The reference count
+ CORBA::ULong refcount_;
+};
+
+// ****************************************************************
+
+/**
+ * @class TAO_ESF_Copy_On_Write_Read_Guard
+ *
+ * @brief TAO_ESF_Copy_On_Write_Read_Guard
+ *
+ * This helper class atomically increments the reference count of
+ * a TAO_ESF_Copy_On_Write_Collection and reads the current
+ * collection in the Copy_On_Write class.
+ */
+template<class COLLECTION, class ITERATOR, class ACE_LOCK>
+class TAO_ESF_Copy_On_Write_Read_Guard
+{
+public:
+ /// Constructor
+ typedef TAO_ESF_Copy_On_Write_Collection<COLLECTION,ITERATOR> Collection;
+ TAO_ESF_Copy_On_Write_Read_Guard (ACE_LOCK &mutex,
+ Collection *&collection);
+
+ /// Destructor
+ ~TAO_ESF_Copy_On_Write_Read_Guard (void);
+
+ Collection *collection;
+
+private:
+ ACE_LOCK &mutex;
+};
+
+// ****************************************************************
+
+/**
+ * @class TAO_ESF_Copy_On_Write_Write_Guard
+ *
+ * @brief TAO_ESF_Copy_On_Write_Write_Guard
+ *
+ * This helper class atomically increments the reference count of
+ * a TAO_ESF_Copy_On_Write_Collection and reads the current
+ * collection in the Copy_On_Write class.
+ */
+template<class COLLECTION, class ITERATOR, ACE_SYNCH_DECL>
+class TAO_ESF_Copy_On_Write_Write_Guard
+{
+public:
+ /// Constructor
+ typedef TAO_ESF_Copy_On_Write_Collection<COLLECTION,ITERATOR> Collection;
+ TAO_ESF_Copy_On_Write_Write_Guard (ACE_SYNCH_MUTEX_T &mutex,
+ ACE_SYNCH_CONDITION_T &cond,
+ int &pending_writes,
+ int &writing_flag,
+ Collection*& collection);
+
+ /// Destructor
+ ~TAO_ESF_Copy_On_Write_Write_Guard (void);
+
+ Collection *copy;
+
+private:
+ ACE_SYNCH_MUTEX_T &mutex;
+ ACE_SYNCH_CONDITION_T &cond;
+ int &pending_writes;
+ int &writing_flag;
+ Collection *&collection;
+};
+
+// ****************************************************************
+
+/**
+ * @class TAO_ESF_Copy_On_Write
+ *
+ * @brief TAO_ESF_Copy_On_Write
+ *
+ * Implement the Copy_On_Write protocol
+ * The class is parametric on the kind of collection and locking
+ * mechanism used.
+ */
+template<class PROXY, class COLLECTION, class ITERATOR, ACE_SYNCH_DECL>
+class TAO_ESF_Copy_On_Write : public TAO_ESF_Proxy_Collection<PROXY>
+{
+public:
+ /// Constructor
+ typedef TAO_ESF_Copy_On_Write_Read_Guard<COLLECTION,ITERATOR,ACE_SYNCH_MUTEX_T> Read_Guard;
+ typedef TAO_ESF_Copy_On_Write_Write_Guard<COLLECTION,ITERATOR,ACE_SYNCH_USE> Write_Guard;
+ TAO_ESF_Copy_On_Write (void);
+
+ /// Destructor
+ ~TAO_ESF_Copy_On_Write (void);
+
+ // = The TAO_ESF_Proxy methods
+ virtual void for_each (TAO_ESF_Worker<PROXY> *worker
+ ACE_ENV_ARG_DECL);
+ virtual void connected (PROXY *proxy
+ ACE_ENV_ARG_DECL);
+ virtual void reconnected (PROXY *proxy
+ ACE_ENV_ARG_DECL);
+ virtual void disconnected (PROXY *proxy
+ ACE_ENV_ARG_DECL);
+ virtual void shutdown (ACE_ENV_SINGLE_ARG_DECL);
+
+private:
+ typedef TAO_ESF_Copy_On_Write_Collection<COLLECTION,ITERATOR> Collection;
+
+ /// A mutex to serialize access to the collection pointer.
+ ACE_SYNCH_MUTEX_T mutex_;
+
+ /// Number of pending writes
+ int pending_writes_;
+
+ /**
+ * If non-zero then a thread is changing the collection. Many
+ * threads can use the collection simulatenously, but only one
+ * change it.
+ */
+ int writing_;
+
+ /// A condition variable to wait to synchronize multiple writers.
+ ACE_SYNCH_CONDITION_T cond_;
+
+ /// The collection, with reference counting added
+ Collection *collection_;
+};
+
+// ****************************************************************
+
+TAO_END_VERSIONED_NAMESPACE_DECL
+
+#if defined (__ACE_INLINE__)
+#include "orbsvcs/ESF/ESF_Copy_On_Write.i"
+#endif /* __ACE_INLINE__ */
+
+#if defined (ACE_TEMPLATES_REQUIRE_SOURCE)
+#include "orbsvcs/ESF/ESF_Copy_On_Write.cpp"
+#endif /* ACE_TEMPLATES_REQUIRE_SOURCE */
+
+#if defined (ACE_TEMPLATES_REQUIRE_PRAGMA)
+#pragma implementation ("ESF_Copy_On_Write.cpp")
+#endif /* ACE_TEMPLATES_REQUIRE_PRAGMA */
+
+#endif /* TAO_ESF_COPY_ON_WRITE_H */
diff --git a/TAO/orbsvcs/orbsvcs/ESF/ESF_Copy_On_Write.i b/TAO/orbsvcs/orbsvcs/ESF/ESF_Copy_On_Write.i
new file mode 100644
index 00000000000..d3ad3d108c7
--- /dev/null
+++ b/TAO/orbsvcs/orbsvcs/ESF/ESF_Copy_On_Write.i
@@ -0,0 +1,41 @@
+// -*- C++ -*-
+//
+// $Id$
+
+TAO_BEGIN_VERSIONED_NAMESPACE_DECL
+
+template<class COLLECTION, class ITERATOR> ACE_INLINE
+TAO_ESF_Copy_On_Write_Collection<COLLECTION,ITERATOR>::
+ TAO_ESF_Copy_On_Write_Collection (void)
+ : refcount_ (1)
+{
+}
+
+// ****************************************************************
+
+template<class COLLECTION, class ITERATOR, class ACE_LOCK> ACE_INLINE
+TAO_ESF_Copy_On_Write_Read_Guard<COLLECTION,ITERATOR,ACE_LOCK>::
+ TAO_ESF_Copy_On_Write_Read_Guard (ACE_LOCK &m,
+ Collection*& collection_ref)
+ : collection (0),
+ mutex (m)
+{
+ ACE_GUARD (ACE_LOCK, ace_mon, this->mutex);
+ this->collection = collection_ref;
+ this->collection->_incr_refcnt ();
+}
+
+template<class COLLECTION, class ITERATOR, class ACE_LOCK> ACE_INLINE
+TAO_ESF_Copy_On_Write_Read_Guard<COLLECTION,ITERATOR,ACE_LOCK>::
+ ~TAO_ESF_Copy_On_Write_Read_Guard (void)
+{
+ if (this->collection != 0)
+ {
+ ACE_GUARD (ACE_LOCK, ace_mon, this->mutex);
+ this->collection->_decr_refcnt ();
+ }
+}
+
+// ****************************************************************
+
+TAO_END_VERSIONED_NAMESPACE_DECL
diff --git a/TAO/orbsvcs/orbsvcs/ESF/ESF_Defaults.h b/TAO/orbsvcs/orbsvcs/ESF/ESF_Defaults.h
new file mode 100644
index 00000000000..7eaa3a6d306
--- /dev/null
+++ b/TAO/orbsvcs/orbsvcs/ESF/ESF_Defaults.h
@@ -0,0 +1,37 @@
+// -*- C++ -*-
+/**
+ * @file ESF_Defaults.h
+ *
+ * $Id$
+ *
+ * In this file we set the compile time defaults for the framework.
+ *
+ *
+ * @author Carlos O'Ryan (coryan@cs.wustl.edu)
+ *
+ * http://doc.ece.uci.edu/~coryan/EC/index.html
+ */
+
+#ifndef TAO_ESF_DEFAULTS_H
+#define TAO_ESF_DEFAULTS_H
+
+#ifndef TAO_ESF_ENABLE_DEBUG_MESSAGES
+#define TAO_ESF_ENABLE_DEBUG_MESSAGES 0
+#endif /* TAO_ESF_ENABLE_DEBUG_MESSAGES */
+
+// Control the maximum degree of concurrency tolerated by the EC, some
+// kind of limit is required to avoid starvation of delayed write
+// operations.
+#ifndef TAO_ESF_DEFAULT_BUSY_HWM
+# define TAO_ESF_DEFAULT_BUSY_HWM 1024
+#endif /* TAO_ESF_DEFAULT_BUSY_HWM */
+
+#ifndef TAO_ESF_DEFAULT_MAX_WRITE_DELAY
+# define TAO_ESF_DEFAULT_MAX_WRITE_DELAY 2048
+#endif /* TAO_ESF_DEFAULT_MAX_WRITE_DELAY */
+
+#ifndef TAO_ESF_DEFAULT_ORB_ID
+# define TAO_ESF_DEFAULT_ORB_ID "" /* */
+#endif /* TAO_ESF_DEFAULT_ORB_ID */
+
+#endif /* TAO_ESF_DEFAULTS_H */
diff --git a/TAO/orbsvcs/orbsvcs/ESF/ESF_Delayed_Changes.cpp b/TAO/orbsvcs/orbsvcs/ESF/ESF_Delayed_Changes.cpp
new file mode 100644
index 00000000000..5398387800c
--- /dev/null
+++ b/TAO/orbsvcs/orbsvcs/ESF/ESF_Delayed_Changes.cpp
@@ -0,0 +1,216 @@
+// $Id$
+
+#ifndef TAO_ESF_DELAYED_CHANGES_CPP
+#define TAO_ESF_DELAYED_CHANGES_CPP
+
+#include "orbsvcs/ESF/ESF_Delayed_Changes.h"
+
+#if ! defined (__ACE_INLINE__)
+#include "orbsvcs/ESF/ESF_Delayed_Changes.i"
+#endif /* __ACE_INLINE__ */
+
+#include "orbsvcs/ESF/ESF_Defaults.h"
+#include "orbsvcs/ESF/ESF_Worker.h"
+#include "orbsvcs/ESF/ESF_Delayed_Command.h"
+
+#include "ace/Functor.h"
+
+TAO_BEGIN_VERSIONED_NAMESPACE_DECL
+
+// ****************************************************************
+
+template<class PROXY, class COLLECTION, class ITERATOR, ACE_SYNCH_DECL>
+TAO_ESF_Delayed_Changes<PROXY,COLLECTION,ITERATOR,ACE_SYNCH_USE>::
+ TAO_ESF_Delayed_Changes (void)
+ : lock_ (this),
+ busy_cond_ (busy_lock_),
+ busy_count_ (0),
+ write_delay_count_ (0),
+ busy_hwm_ (TAO_ESF_DEFAULT_BUSY_HWM),
+ max_write_delay_ (TAO_ESF_DEFAULT_MAX_WRITE_DELAY)
+{
+}
+
+template<class PROXY, class COLLECTION, class ITERATOR, ACE_SYNCH_DECL>
+TAO_ESF_Delayed_Changes<PROXY,COLLECTION,ITERATOR,ACE_SYNCH_USE>::
+ TAO_ESF_Delayed_Changes (const COLLECTION &collection)
+ : collection_ (collection),
+ lock_ (this),
+ busy_cond_ (busy_lock_),
+ busy_count_ (0),
+ write_delay_count_ (0),
+ busy_hwm_ (TAO_ESF_DEFAULT_BUSY_HWM),
+ max_write_delay_ (TAO_ESF_DEFAULT_MAX_WRITE_DELAY)
+{
+}
+
+template<class PROXY, class COLLECTION, class ITERATOR, ACE_SYNCH_DECL> void
+TAO_ESF_Delayed_Changes<PROXY,COLLECTION,ITERATOR,ACE_SYNCH_USE>::
+ for_each (TAO_ESF_Worker<PROXY> *worker
+ ACE_ENV_ARG_DECL)
+{
+ ACE_GUARD (Busy_Lock, ace_mon, this->lock_);
+
+ worker->set_size(this->collection_.size());
+ ITERATOR end = this->collection_.end ();
+ for (ITERATOR i = this->collection_.begin (); i != end; ++i)
+ {
+ worker->work (*i ACE_ENV_ARG_PARAMETER);
+ ACE_CHECK;
+
+ }
+}
+
+template<class PROXY, class COLLECTION, class ITERATOR, ACE_SYNCH_DECL> int
+TAO_ESF_Delayed_Changes<PROXY,COLLECTION,ITERATOR,ACE_SYNCH_USE>::
+ busy (void)
+{
+ ACE_GUARD_RETURN (ACE_SYNCH_MUTEX_T, ace_mon, this->busy_lock_, -1);
+
+ while (this->busy_count_ >= this->busy_hwm_
+ || this->write_delay_count_ >= this->max_write_delay_)
+ this->busy_cond_.wait ();
+ this->busy_count_++;
+
+ return 0;
+}
+
+template<class PROXY, class COLLECTION, class ITERATOR, ACE_SYNCH_DECL> int
+TAO_ESF_Delayed_Changes<PROXY,COLLECTION,ITERATOR,ACE_SYNCH_USE>::
+ idle (void)
+{
+ ACE_GUARD_RETURN (ACE_SYNCH_MUTEX_T, ace_mon, this->busy_lock_, -1);
+
+ this->busy_count_--;
+ if (this->busy_count_ == 0)
+ {
+ this->write_delay_count_ = 0;
+ this->execute_delayed_operations ();
+ this->busy_cond_.broadcast ();
+ }
+ return 0;
+}
+
+template<class PROXY, class COLLECTION, class ITERATOR, ACE_SYNCH_DECL> int
+TAO_ESF_Delayed_Changes<PROXY,COLLECTION,ITERATOR,ACE_SYNCH_USE>::
+ execute_delayed_operations (void)
+{
+ while (!this->command_queue_.is_empty ())
+ {
+ ACE_Command_Base* command = 0;
+ this->command_queue_.dequeue_head (command);
+
+ command->execute ();
+
+ delete command;
+ }
+ return 0;
+}
+
+template<class PROXY, class C, class I,ACE_SYNCH_DECL> void
+TAO_ESF_Delayed_Changes<PROXY,C,I,ACE_SYNCH_USE>::
+ connected (PROXY *proxy
+ ACE_ENV_ARG_DECL)
+{
+ ACE_GUARD_THROW_EX (ACE_SYNCH_MUTEX_T, ace_mon, this->busy_lock_,
+ CORBA::INTERNAL ());
+ ACE_CHECK;
+
+ proxy->_incr_refcnt ();
+ if (this->busy_count_ == 0)
+ {
+ // We can add the object immediately
+ this->connected_i (proxy ACE_ENV_ARG_PARAMETER);
+ ACE_CHECK;
+ }
+ else
+ {
+ ACE_Command_Base* command = 0;
+ ACE_NEW (command,
+ Connected_Command (this,
+ proxy));
+ this->command_queue_.enqueue_tail (command);
+ this->write_delay_count_++;
+ }
+}
+
+template<class PROXY, class C, class I,ACE_SYNCH_DECL> void
+TAO_ESF_Delayed_Changes<PROXY,C,I,ACE_SYNCH_USE>::
+ reconnected (PROXY *proxy
+ ACE_ENV_ARG_DECL)
+{
+ ACE_GUARD_THROW_EX (ACE_SYNCH_MUTEX_T, ace_mon, this->busy_lock_,
+ CORBA::INTERNAL ());
+ ACE_CHECK;
+
+ proxy->_incr_refcnt ();
+ if (this->busy_count_ == 0)
+ {
+ // We can reconnect the object immediately
+ this->reconnected_i (proxy ACE_ENV_ARG_PARAMETER);
+ ACE_CHECK;
+ }
+ else
+ {
+ ACE_Command_Base* command;
+ ACE_NEW (command,
+ Reconnected_Command (this,
+ proxy));
+ this->command_queue_.enqueue_tail (command);
+ this->write_delay_count_++;
+ }
+}
+
+template<class PROXY, class C, class I,ACE_SYNCH_DECL> void
+TAO_ESF_Delayed_Changes<PROXY,C,I,ACE_SYNCH_USE>::
+ disconnected (PROXY *proxy
+ ACE_ENV_ARG_DECL)
+{
+ ACE_GUARD_THROW_EX (ACE_SYNCH_MUTEX_T, ace_mon, this->busy_lock_,
+ CORBA::INTERNAL ());
+ ACE_CHECK;
+
+ if (this->busy_count_ == 0)
+ {
+ // We can remove the object immediately
+ this->disconnected_i (proxy ACE_ENV_ARG_PARAMETER);
+ ACE_CHECK;
+ }
+ else
+ {
+ ACE_Command_Base* command;
+ ACE_NEW (command,
+ Disconnected_Command (this,
+ proxy));
+ this->command_queue_.enqueue_tail (command);
+ this->write_delay_count_++;
+ }
+}
+
+template<class PROXY, class C, class I,ACE_SYNCH_DECL> void
+TAO_ESF_Delayed_Changes<PROXY,C,I,ACE_SYNCH_USE>::
+ shutdown (ACE_ENV_SINGLE_ARG_DECL)
+{
+ ACE_GUARD_THROW_EX (ACE_SYNCH_MUTEX_T, ace_mon, this->busy_lock_,
+ CORBA::INTERNAL ());
+ ACE_CHECK;
+
+ if (this->busy_count_ == 0)
+ {
+ // We can shutdown the object immediately
+ this->shutdown_i (ACE_ENV_SINGLE_ARG_PARAMETER);
+ ACE_CHECK;
+ }
+ else
+ {
+ ACE_Command_Base* command;
+ ACE_NEW (command,
+ Shutdown_Command (this));
+ this->command_queue_.enqueue_tail (command);
+ this->write_delay_count_++;
+ }
+}
+
+TAO_END_VERSIONED_NAMESPACE_DECL
+
+#endif /* TAO_ESF_DELAYED_CHANGES_CPP */
diff --git a/TAO/orbsvcs/orbsvcs/ESF/ESF_Delayed_Changes.h b/TAO/orbsvcs/orbsvcs/ESF/ESF_Delayed_Changes.h
new file mode 100644
index 00000000000..2bf47dd49b4
--- /dev/null
+++ b/TAO/orbsvcs/orbsvcs/ESF/ESF_Delayed_Changes.h
@@ -0,0 +1,160 @@
+// -*- C++ -*-
+/**
+ * @file ESF_Delayed_Changes.h
+ *
+ * $Id$
+ *
+ * @author Carlos O'Ryan (coryan@cs.wustl.edu)
+ *
+ * http://doc.ece.uci.edu/~coryan/EC/index.html
+ */
+
+#ifndef TAO_ESF_DELAYED_CHANGES_H
+#define TAO_ESF_DELAYED_CHANGES_H
+
+#include "orbsvcs/ESF/ESF_Proxy_Collection.h"
+
+#if !defined (ACE_LACKS_PRAGMA_ONCE)
+# pragma once
+#endif /* ACE_LACKS_PRAGMA_ONCE */
+
+#include "orbsvcs/ESF/ESF_Busy_Lock.h"
+
+#include "ace/Containers.h"
+
+ACE_BEGIN_VERSIONED_NAMESPACE_DECL
+class ACE_Command_Base;
+ACE_END_VERSIONED_NAMESPACE_DECL
+
+TAO_BEGIN_VERSIONED_NAMESPACE_DECL
+
+template<class Target,class Object> class TAO_ESF_Connected_Command;
+template<class Target,class Object> class TAO_ESF_Disconnected_Command;
+template<class Target,class Object> class TAO_ESF_Reconnected_Command;
+template<class Target> class TAO_ESF_Shutdown_Command;
+
+/**
+ * @class TAO_ESF_Delayed_Changes
+ *
+ * @brief TAO_ESF_Delayed_Operations
+ *
+ * This class implements the Delayed Operations protocol to solve
+ * the concurrency challenges outlined in the documentation of
+ * TAO_ESF_Proxy_Collection.
+ * In short the class delays changes by putting them on an
+ * "operation queue", the operations are stored as command objects
+ * in this queue and executed once the system is quiescent
+ * (i.e. no threads are iterating over the collection).
+ * The algorithm implemented so far is:
+ * - If a thread is using the set then it increases the busy
+ * count, this is done by calling the busy() method. Once the
+ * thread has stopped using the collection the idle() method is
+ * invoked and the busy count is decreased.
+ * A helper class (Busy_Lock) is used to hide this protocol
+ * behind the familiar GUARD idiom.
+ * - If the busy count reaches the busy_hwm then the thread must
+ * wait until the count reaches 0 again.
+ * This can be used to control the maximum concurrency in the
+ * EC, matching it (for example) with the number of
+ * processors. Setting the concurrency to a high value (say one
+ * million) allows for an arbitrary number of threads to execute
+ * concurrently.
+ * - If a modification is posted to the collection we need to
+ * execute it at some point.
+ * Just using the busy_hwm would not work, the HWM may not be
+ * reached ever, so another form of control is needed.
+ * Instead we use another counter, that keeps track of how many
+ * threads have used the set since the modification was
+ * posted. If this number of threads reaches max_write_delay then
+ * we don't allow any more threads to go in, eventually the
+ * thread count reaches 0 and we can proceed with the operations.
+ * - There is one aspect of concurrency that can be problematic: if
+ * thread pushes events as part of an upcall then the same thread
+ * could be counted twice, we need to keep track of the threads
+ * that are dispatching events and not increase (or decrease) the
+ * reference count when a thread iterates twice over the same
+ * set.
+ * This solves the major problems, but there are other issues to
+ * be addressed:
+ * + How do we ensure that the operations are eventually executed?
+ * + How do we simplify the execution of the locking protocol for
+ * clients of this class?
+ * + How do we minimize overhead for single threaded execution?
+ * + How do we minimize the overhead for the cases where the
+ * threads dispatching events don't post changes to the
+ * collection?
+ */
+template<class PROXY, class COLLECTION, class ITERATOR, ACE_SYNCH_DECL>
+class TAO_ESF_Delayed_Changes : public TAO_ESF_Proxy_Collection<PROXY>
+{
+public:
+ TAO_ESF_Delayed_Changes (void);
+ TAO_ESF_Delayed_Changes (const COLLECTION &collection);
+
+ int busy (void);
+ int idle (void);
+ int execute_delayed_operations (void);
+
+ void connected_i (PROXY *proxy
+ ACE_ENV_ARG_DECL);
+ void reconnected_i (PROXY *proxy
+ ACE_ENV_ARG_DECL);
+ void disconnected_i (PROXY *proxy
+ ACE_ENV_ARG_DECL);
+ void shutdown_i (ACE_ENV_SINGLE_ARG_DECL);
+
+ typedef TAO_ESF_Connected_Command<TAO_ESF_Delayed_Changes<PROXY,COLLECTION,ITERATOR,ACE_SYNCH_USE>,PROXY> Connected_Command;
+ typedef TAO_ESF_Reconnected_Command<TAO_ESF_Delayed_Changes<PROXY,COLLECTION,ITERATOR,ACE_SYNCH_USE>,PROXY> Reconnected_Command;
+ typedef TAO_ESF_Disconnected_Command<TAO_ESF_Delayed_Changes<PROXY,COLLECTION,ITERATOR,ACE_SYNCH_USE>,PROXY> Disconnected_Command;
+ typedef TAO_ESF_Shutdown_Command<TAO_ESF_Delayed_Changes<PROXY,COLLECTION,ITERATOR,ACE_SYNCH_USE> > Shutdown_Command;
+
+ // = The TAO_ESF_Proxy methods
+ virtual void for_each (TAO_ESF_Worker<PROXY> *worker
+ ACE_ENV_ARG_DECL);
+ virtual void connected (PROXY *proxy
+ ACE_ENV_ARG_DECL);
+ virtual void reconnected (PROXY *proxy
+ ACE_ENV_ARG_DECL);
+ virtual void disconnected (PROXY *proxy
+ ACE_ENV_ARG_DECL);
+ virtual void shutdown (ACE_ENV_SINGLE_ARG_DECL);
+
+private:
+ COLLECTION collection_;
+
+ typedef TAO_ESF_Busy_Lock_Adapter<TAO_ESF_Delayed_Changes<PROXY,COLLECTION,ITERATOR,ACE_SYNCH_USE> > Busy_Lock;
+
+ Busy_Lock lock_;
+
+ ACE_SYNCH_MUTEX_T busy_lock_;
+
+ ACE_SYNCH_CONDITION_T busy_cond_;
+
+ CORBA::ULong busy_count_;
+
+ CORBA::ULong write_delay_count_;
+
+ /// Control variables for the concurrency policies.
+ CORBA::ULong busy_hwm_;
+ CORBA::ULong max_write_delay_;
+
+ ACE_Unbounded_Queue<ACE_Command_Base*> command_queue_;
+};
+
+// ****************************************************************
+
+TAO_END_VERSIONED_NAMESPACE_DECL
+
+#if defined (__ACE_INLINE__)
+#include "orbsvcs/ESF/ESF_Delayed_Changes.i"
+#endif /* __ACE_INLINE__ */
+
+#if defined (ACE_TEMPLATES_REQUIRE_SOURCE)
+#include "orbsvcs/ESF/ESF_Delayed_Changes.cpp"
+#endif /* ACE_TEMPLATES_REQUIRE_SOURCE */
+
+#if defined (ACE_TEMPLATES_REQUIRE_PRAGMA)
+#pragma implementation ("ESF_Delayed_Changes.cpp")
+#endif /* ACE_TEMPLATES_REQUIRE_PRAGMA */
+
+#endif /* TAO_ESF_DELAYED_CHANGES_H */
diff --git a/TAO/orbsvcs/orbsvcs/ESF/ESF_Delayed_Changes.i b/TAO/orbsvcs/orbsvcs/ESF/ESF_Delayed_Changes.i
new file mode 100644
index 00000000000..4a2192e5a18
--- /dev/null
+++ b/TAO/orbsvcs/orbsvcs/ESF/ESF_Delayed_Changes.i
@@ -0,0 +1,38 @@
+// -*- C++ -*-
+//
+// $Id$
+
+TAO_BEGIN_VERSIONED_NAMESPACE_DECL
+
+template<class PROXY, class C, class I,ACE_SYNCH_DECL> void
+TAO_ESF_Delayed_Changes<PROXY,C,I,ACE_SYNCH_USE>::
+ connected_i (PROXY *proxy
+ ACE_ENV_ARG_DECL)
+{
+ this->collection_.connected (proxy ACE_ENV_ARG_PARAMETER);
+}
+
+template<class PROXY, class C, class I,ACE_SYNCH_DECL> void
+TAO_ESF_Delayed_Changes<PROXY,C,I,ACE_SYNCH_USE>::
+ reconnected_i (PROXY *proxy
+ ACE_ENV_ARG_DECL)
+{
+ this->collection_.reconnected (proxy ACE_ENV_ARG_PARAMETER);
+}
+
+template<class PROXY, class C, class I,ACE_SYNCH_DECL> void
+TAO_ESF_Delayed_Changes<PROXY,C,I,ACE_SYNCH_USE>::
+ disconnected_i (PROXY *proxy
+ ACE_ENV_ARG_DECL)
+{
+ this->collection_.disconnected (proxy ACE_ENV_ARG_PARAMETER);
+}
+
+template<class PROXY, class C, class I,ACE_SYNCH_DECL> void
+TAO_ESF_Delayed_Changes<PROXY,C,I,ACE_SYNCH_USE>::
+ shutdown_i (ACE_ENV_SINGLE_ARG_DECL)
+{
+ this->collection_.shutdown (ACE_ENV_SINGLE_ARG_PARAMETER);
+}
+
+TAO_END_VERSIONED_NAMESPACE_DECL
diff --git a/TAO/orbsvcs/orbsvcs/ESF/ESF_Delayed_Command.cpp b/TAO/orbsvcs/orbsvcs/ESF/ESF_Delayed_Command.cpp
new file mode 100644
index 00000000000..fe0a7812db0
--- /dev/null
+++ b/TAO/orbsvcs/orbsvcs/ESF/ESF_Delayed_Command.cpp
@@ -0,0 +1,97 @@
+// $Id$
+
+#ifndef TAO_ESF_DELAYED_COMMAND_CPP
+#define TAO_ESF_DELAYED_COMMAND_CPP
+
+#include "orbsvcs/ESF/ESF_Delayed_Command.h"
+
+#if ! defined (__ACE_INLINE__)
+#include "orbsvcs/ESF/ESF_Delayed_Command.i"
+#endif /* __ACE_INLINE__ */
+
+TAO_BEGIN_VERSIONED_NAMESPACE_DECL
+
+template<class Target, class Object> int
+TAO_ESF_Connected_Command<Target,Object>::execute (void* arg)
+{
+ if (arg != 0)
+ {
+ ACE_ENV_EMIT_CODE (CORBA::Environment &ACE_TRY_ENV =
+ *static_cast<CORBA::Environment*> (arg));
+ this->target_->connected_i (this->object_
+ ACE_ENV_ARG_PARAMETER);
+ }
+ else
+ {
+ ACE_ENV_EMIT_CODE (ACE_DECLARE_NEW_CORBA_ENV);
+ this->target_->connected_i (this->object_
+ ACE_ENV_ARG_PARAMETER);
+ }
+
+ return 0;
+}
+
+// ****************************************************************
+
+template<class Target, class Object> int
+TAO_ESF_Reconnected_Command<Target,Object>::execute (void* arg)
+{
+ if (arg != 0)
+ {
+ ACE_ENV_EMIT_CODE (CORBA::Environment &ACE_TRY_ENV =
+ *static_cast<CORBA::Environment*> (arg));
+ this->target_->reconnected_i (this->object_
+ ACE_ENV_ARG_PARAMETER);
+ }
+ else
+ {
+ ACE_ENV_EMIT_CODE (ACE_DECLARE_NEW_CORBA_ENV);
+ this->target_->reconnected_i (this->object_
+ ACE_ENV_ARG_PARAMETER);
+ }
+ return 0;
+}
+
+// ****************************************************************
+
+template<class Target, class Object> int
+TAO_ESF_Disconnected_Command<Target,Object>::execute (void* arg)
+{
+ if (arg != 0)
+ {
+ ACE_ENV_EMIT_CODE (CORBA::Environment &ACE_TRY_ENV =
+ *static_cast<CORBA::Environment*> (arg));
+ this->target_->disconnected_i (this->object_
+ ACE_ENV_ARG_PARAMETER);
+ }
+ else
+ {
+ ACE_ENV_EMIT_CODE (ACE_DECLARE_NEW_CORBA_ENV);
+ this->target_->disconnected_i (this->object_
+ ACE_ENV_ARG_PARAMETER);
+ }
+ return 0;
+}
+
+// ****************************************************************
+
+template<class Target> int
+TAO_ESF_Shutdown_Command<Target>::execute (void* arg)
+{
+ if (arg != 0)
+ {
+ ACE_ENV_EMIT_CODE (CORBA::Environment &ACE_TRY_ENV =
+ *static_cast<CORBA::Environment*> (arg));
+ this->target_->shutdown_i (ACE_ENV_SINGLE_ARG_PARAMETER);
+ }
+ else
+ {
+ ACE_ENV_EMIT_CODE (ACE_DECLARE_NEW_CORBA_ENV);
+ this->target_->shutdown_i (ACE_ENV_SINGLE_ARG_PARAMETER);
+ }
+ return 0;
+}
+
+TAO_END_VERSIONED_NAMESPACE_DECL
+
+#endif /* TAO_ESF_DELAYED_COMMAND_CPP */
diff --git a/TAO/orbsvcs/orbsvcs/ESF/ESF_Delayed_Command.h b/TAO/orbsvcs/orbsvcs/ESF/ESF_Delayed_Command.h
new file mode 100644
index 00000000000..a827c4e6415
--- /dev/null
+++ b/TAO/orbsvcs/orbsvcs/ESF/ESF_Delayed_Command.h
@@ -0,0 +1,187 @@
+// -*- C++ -*-
+
+/**
+ * @file ESF_Delayed_Command.h
+ *
+ * $Id$
+ *
+ * @author Carlos O'Ryan (coryan@cs.wustl.edu)
+ *
+ * http://doc.ece.uci.edu/~coryan/EC/index.html
+ */
+
+#ifndef TAO_ESF_DELAYED_COMMAND_H
+#define TAO_ESF_DELAYED_COMMAND_H
+
+#include "ace/Functor.h"
+
+#if !defined (ACE_LACKS_PRAGMA_ONCE)
+# pragma once
+#endif /* ACE_LACKS_PRAGMA_ONCE */
+
+TAO_BEGIN_VERSIONED_NAMESPACE_DECL
+
+/**
+ * @class TAO_ESF_Connected_Command
+ *
+ * @brief Implements a Command object that invokes the connected_i()
+ * method on the target, passing an argument of type Object.
+ *
+ * <H2>Memory Managment</H2>
+ * It does not assume ownership of Object nor the Target
+ * arguments.
+ * Usually allocated from the heap or an allocator; but it is not
+ * self-managed.
+ *
+ * <H2>Locking</H2>
+ * No provisions for locking, access must be serialized
+ * externally.
+ */
+template<class Target, class Object>
+class TAO_ESF_Connected_Command : public ACE_Command_Base
+{
+public:
+ /// constructor...
+ TAO_ESF_Connected_Command (Target *target,
+ Object *object);
+
+ /// The callback method, if the argument is not nil it is interpreted
+ /// as a CORBA::Environment.
+ virtual int execute (void *arg);
+
+private:
+ /// The target
+ Target *target_;
+
+ /// The argument
+ Object *object_;
+};
+
+// ****************************************************************
+
+/**
+ * @class TAO_ESF_Reconnected_Command
+ *
+ * @brief Implements a Command object that invokes the reconnected_i()
+ * method on the target, passing an argument of type Object.
+ *
+ * <H2>Memory Managment</H2>
+ * It does not assume ownership of Object nor the Target
+ * arguments.
+ * Usually allocated from the heap or an allocator; but it is not
+ * self-managed.
+ *
+ * <H2>Locking</H2>
+ * No provisions for locking, access must be serialized
+ * externally.
+ */
+template<class Target, class Object>
+class TAO_ESF_Reconnected_Command : public ACE_Command_Base
+{
+public:
+ /// constructor...
+ TAO_ESF_Reconnected_Command (Target *target,
+ Object *object);
+
+ /// The callback method, if the argument is not nil it is interpreted
+ /// as a CORBA::Environment.
+ virtual int execute (void *arg);
+
+private:
+ /// The target
+ Target *target_;
+
+ /// The argument
+ Object *object_;
+};
+
+// ****************************************************************
+
+/**
+ * @class TAO_ESF_Disconnected_Command
+ *
+ * @brief Implements a Command object that invokes the
+ * disconnected_i() method on the target, passing an argument of type
+ * Object.
+ *
+ * <H2>Memory Managment</H2>
+ * It does not assume ownership of Object nor the Target
+ * arguments.
+ * Usually allocated from the heap or an allocator; but it is not
+ * self-managed.
+ *
+ * <H2>Locking</H2>
+ * No provisions for locking, access must be serialized
+ * externally.
+ */
+template<class Target, class Object>
+class TAO_ESF_Disconnected_Command : public ACE_Command_Base
+{
+public:
+ /// constructor...
+ TAO_ESF_Disconnected_Command (Target *target,
+ Object *object);
+
+ /// The callback method, if the argument is not nil it is interpreted
+ /// as a CORBA::Environment.
+ virtual int execute (void *arg);
+
+private:
+ /// The target
+ Target *target_;
+
+ /// The argument
+ Object *object_;
+};
+
+// ****************************************************************
+
+/**
+ * @class TAO_ESF_Shutdown_Command
+ *
+ * @brief Implements a Command object that invokes the shutdown_i()
+ * method on the target, passing an argument of type Object.
+ *
+ * <H2>Memory Management</H2>
+ * It does not assume ownership of Object nor the Target
+ * arguments.
+ * Usually allocated from the heap or an allocator; but it is not
+ * self-managed.
+ *
+ * <H2>Locking</H2>
+ * No provisions for locking, access must be serialized
+ * externally.
+ */
+template<class Target>
+class TAO_ESF_Shutdown_Command : public ACE_Command_Base
+{
+public:
+ /// constructor...
+ TAO_ESF_Shutdown_Command (Target *target);
+
+ /// The callback method, if the argument is not nil it is interpreted
+ /// as a CORBA::Environment.
+ virtual int execute (void *arg);
+
+private:
+ /// The target
+ Target *target_;
+};
+
+// ****************************************************************
+
+TAO_END_VERSIONED_NAMESPACE_DECL
+
+#if defined (__ACE_INLINE__)
+#include "orbsvcs/ESF/ESF_Delayed_Command.i"
+#endif /* __ACE_INLINE__ */
+
+#if defined (ACE_TEMPLATES_REQUIRE_SOURCE)
+#include "orbsvcs/ESF/ESF_Delayed_Command.cpp"
+#endif /* ACE_TEMPLATES_REQUIRE_SOURCE */
+
+#if defined (ACE_TEMPLATES_REQUIRE_PRAGMA)
+#pragma implementation ("ESF_Delayed_Command.cpp")
+#endif /* ACE_TEMPLATES_REQUIRE_PRAGMA */
+
+#endif /* TAO_ESF_DELAYED_COMMAND_H */
diff --git a/TAO/orbsvcs/orbsvcs/ESF/ESF_Delayed_Command.i b/TAO/orbsvcs/orbsvcs/ESF/ESF_Delayed_Command.i
new file mode 100644
index 00000000000..3ffe5697959
--- /dev/null
+++ b/TAO/orbsvcs/orbsvcs/ESF/ESF_Delayed_Command.i
@@ -0,0 +1,47 @@
+// -*- C++ -*-
+//
+// $Id$
+
+TAO_BEGIN_VERSIONED_NAMESPACE_DECL
+
+template<class Target, class Object>
+TAO_ESF_Connected_Command<Target,Object>::
+ TAO_ESF_Connected_Command (Target *target,
+ Object *object)
+ : target_ (target),
+ object_ (object)
+{
+}
+
+// ****************************************************************
+
+template<class Target, class Object>
+TAO_ESF_Reconnected_Command<Target,Object>::
+ TAO_ESF_Reconnected_Command (Target *target,
+ Object *object)
+ : target_ (target),
+ object_ (object)
+{
+}
+
+// ****************************************************************
+
+template<class Target, class Object>
+TAO_ESF_Disconnected_Command<Target,Object>::
+ TAO_ESF_Disconnected_Command (Target *target,
+ Object *object)
+ : target_ (target),
+ object_ (object)
+{
+}
+
+// ****************************************************************
+
+template<class Target>
+TAO_ESF_Shutdown_Command<Target>::
+ TAO_ESF_Shutdown_Command (Target *target)
+ : target_ (target)
+{
+}
+
+TAO_END_VERSIONED_NAMESPACE_DECL
diff --git a/TAO/orbsvcs/orbsvcs/ESF/ESF_Immediate_Changes.cpp b/TAO/orbsvcs/orbsvcs/ESF/ESF_Immediate_Changes.cpp
new file mode 100644
index 00000000000..c1bbac9dad0
--- /dev/null
+++ b/TAO/orbsvcs/orbsvcs/ESF/ESF_Immediate_Changes.cpp
@@ -0,0 +1,49 @@
+// $Id$
+
+#ifndef TAO_ESF_IMMEDIATE_CHANGES_CPP
+#define TAO_ESF_IMMEDIATE_CHANGES_CPP
+
+#include "orbsvcs/ESF/ESF_Immediate_Changes.h"
+
+#if ! defined (__ACE_INLINE__)
+#include "orbsvcs/ESF/ESF_Immediate_Changes.i"
+#endif /* __ACE_INLINE__ */
+
+#include "orbsvcs/ESF/ESF_Worker.h"
+
+TAO_BEGIN_VERSIONED_NAMESPACE_DECL
+
+// ****************************************************************
+
+template<class PROXY, class C, class ITERATOR, class ACE_LOCK>
+TAO_ESF_Immediate_Changes<PROXY,C,ITERATOR,ACE_LOCK>::
+ TAO_ESF_Immediate_Changes (void)
+{
+}
+
+template<class PROXY, class C, class ITERATOR, class ACE_LOCK>
+TAO_ESF_Immediate_Changes<PROXY,C,ITERATOR,ACE_LOCK>::
+ TAO_ESF_Immediate_Changes (const C &collection)
+ : collection_ (collection)
+{
+}
+
+template<class PROXY, class C, class ITERATOR, class ACE_LOCK> void
+TAO_ESF_Immediate_Changes<PROXY,C,ITERATOR,ACE_LOCK>::
+ for_each (TAO_ESF_Worker<PROXY> *worker
+ ACE_ENV_ARG_DECL)
+{
+ ACE_GUARD (ACE_LOCK, ace_mon, this->lock_);
+
+ worker->set_size(this->collection_.size());
+ ITERATOR end = this->collection_.end ();
+ for (ITERATOR i = this->collection_.begin (); i != end; ++i)
+ {
+ worker->work ((*i) ACE_ENV_ARG_PARAMETER);
+ ACE_CHECK;
+ }
+}
+
+TAO_END_VERSIONED_NAMESPACE_DECL
+
+#endif /* TAO_ESF_IMMEDIATE_CHANGES_CPP */
diff --git a/TAO/orbsvcs/orbsvcs/ESF/ESF_Immediate_Changes.h b/TAO/orbsvcs/orbsvcs/ESF/ESF_Immediate_Changes.h
new file mode 100644
index 00000000000..bcd9b19edd4
--- /dev/null
+++ b/TAO/orbsvcs/orbsvcs/ESF/ESF_Immediate_Changes.h
@@ -0,0 +1,69 @@
+// -*- C++ -*-
+/**
+ * @file ESF_Immediate_Changes.h
+ *
+ * $Id$
+ *
+ * @author Carlos O'Ryan (coryan@cs.wustl.edu)
+ *
+ * http://doc.ece.uci.edu/~coryan/EC/index.html
+ */
+
+#ifndef TAO_ESF_IMMEDIATE_CHANGES_H
+#define TAO_ESF_IMMEDIATE_CHANGES_H
+
+#include "orbsvcs/ESF/ESF_Proxy_Collection.h"
+
+#if !defined (ACE_LACKS_PRAGMA_ONCE)
+# pragma once
+#endif /* ACE_LACKS_PRAGMA_ONCE */
+
+TAO_BEGIN_VERSIONED_NAMESPACE_DECL
+
+/**
+ * @class TAO_ESF_Immediate_Changes
+ *
+ * @brief Implement the Immediate_Changes strategy
+ *
+ */
+template<class PROXY, class COLLECTION, class ITERATOR, class ACE_LOCK>
+class TAO_ESF_Immediate_Changes : public TAO_ESF_Proxy_Collection<PROXY>
+{
+public:
+ TAO_ESF_Immediate_Changes (void);
+ TAO_ESF_Immediate_Changes (const COLLECTION &collection);
+
+ // = The TAO_ESF_Proxy methods
+ virtual void for_each (TAO_ESF_Worker<PROXY> *worker
+ ACE_ENV_ARG_DECL);
+ virtual void connected (PROXY *proxy
+ ACE_ENV_ARG_DECL);
+ virtual void reconnected (PROXY *proxy
+ ACE_ENV_ARG_DECL);
+ virtual void disconnected (PROXY *proxy
+ ACE_ENV_ARG_DECL);
+ virtual void shutdown (ACE_ENV_SINGLE_ARG_DECL);
+
+private:
+ COLLECTION collection_;
+
+ ACE_LOCK lock_;
+};
+
+// ****************************************************************
+
+TAO_END_VERSIONED_NAMESPACE_DECL
+
+#if defined (__ACE_INLINE__)
+#include "orbsvcs/ESF/ESF_Immediate_Changes.i"
+#endif /* __ACE_INLINE__ */
+
+#if defined (ACE_TEMPLATES_REQUIRE_SOURCE)
+#include "orbsvcs/ESF/ESF_Immediate_Changes.cpp"
+#endif /* ACE_TEMPLATES_REQUIRE_SOURCE */
+
+#if defined (ACE_TEMPLATES_REQUIRE_PRAGMA)
+#pragma implementation ("ESF_Immediate_Changes.cpp")
+#endif /* ACE_TEMPLATES_REQUIRE_PRAGMA */
+
+#endif /* TAO_ESF_IMMEDIATE_CHANGES_H */
diff --git a/TAO/orbsvcs/orbsvcs/ESF/ESF_Immediate_Changes.i b/TAO/orbsvcs/orbsvcs/ESF/ESF_Immediate_Changes.i
new file mode 100644
index 00000000000..ac26e4d5800
--- /dev/null
+++ b/TAO/orbsvcs/orbsvcs/ESF/ESF_Immediate_Changes.i
@@ -0,0 +1,48 @@
+// -*- C++ -*-
+//
+// $Id$
+
+TAO_BEGIN_VERSIONED_NAMESPACE_DECL
+
+template<class PROXY, class COLLECTION, class ITERATOR, class ACE_LOCK> void
+TAO_ESF_Immediate_Changes<PROXY,COLLECTION,ITERATOR,ACE_LOCK>::
+ connected (PROXY *proxy
+ ACE_ENV_ARG_DECL)
+{
+ ACE_GUARD (ACE_LOCK, ace_mon, this->lock_);
+
+ proxy->_incr_refcnt ();
+ this->collection_.connected (proxy ACE_ENV_ARG_PARAMETER);
+}
+
+template<class PROXY, class COLLECTION, class ITERATOR, class ACE_LOCK> void
+TAO_ESF_Immediate_Changes<PROXY,COLLECTION,ITERATOR,ACE_LOCK>::
+ reconnected (PROXY *proxy
+ ACE_ENV_ARG_DECL)
+{
+ ACE_GUARD (ACE_LOCK, ace_mon, this->lock_);
+
+ proxy->_incr_refcnt ();
+ this->collection_.reconnected (proxy ACE_ENV_ARG_PARAMETER);
+}
+
+template<class PROXY, class COLLECTION, class ITERATOR, class ACE_LOCK> void
+TAO_ESF_Immediate_Changes<PROXY,COLLECTION,ITERATOR,ACE_LOCK>::
+ disconnected (PROXY *proxy
+ ACE_ENV_ARG_DECL)
+{
+ ACE_GUARD (ACE_LOCK, ace_mon, this->lock_);
+
+ this->collection_.disconnected (proxy ACE_ENV_ARG_PARAMETER);
+}
+
+template<class PROXY, class COLLECTION, class ITERATOR, class ACE_LOCK> void
+TAO_ESF_Immediate_Changes<PROXY,COLLECTION,ITERATOR,ACE_LOCK>::
+ shutdown (ACE_ENV_SINGLE_ARG_DECL)
+{
+ ACE_GUARD (ACE_LOCK, ace_mon, this->lock_);
+
+ this->collection_.shutdown (ACE_ENV_SINGLE_ARG_PARAMETER);
+}
+
+TAO_END_VERSIONED_NAMESPACE_DECL
diff --git a/TAO/orbsvcs/orbsvcs/ESF/ESF_Peer_Admin.cpp b/TAO/orbsvcs/orbsvcs/ESF/ESF_Peer_Admin.cpp
new file mode 100644
index 00000000000..40afd8d452f
--- /dev/null
+++ b/TAO/orbsvcs/orbsvcs/ESF/ESF_Peer_Admin.cpp
@@ -0,0 +1,58 @@
+// $Id$
+
+#ifndef TAO_ESF_PEER_ADMIN_CPP
+#define TAO_ESF_PEER_ADMIN_CPP
+
+#include "orbsvcs/ESF/ESF_Peer_Workers.h"
+
+TAO_BEGIN_VERSIONED_NAMESPACE_DECL
+
+template<class EVENT_CHANNEL, class PROXY, class INTERFACE, class PEER>
+TAO_ESF_Peer_Admin<EVENT_CHANNEL,PROXY,INTERFACE,PEER>::
+ TAO_ESF_Peer_Admin (EVENT_CHANNEL *ec)
+ : TAO_ESF_Proxy_Admin<EVENT_CHANNEL,PROXY,INTERFACE> (ec)
+{
+}
+
+template<class EVENT_CHANNEL, class PROXY, class INTERFACE, class PEER>
+TAO_ESF_Peer_Admin<EVENT_CHANNEL,PROXY,INTERFACE,PEER>::
+ ~TAO_ESF_Peer_Admin (void)
+{
+}
+
+template<class EVENT_CHANNEL, class PROXY, class INTERFACE, class PEER> void
+TAO_ESF_Peer_Admin<EVENT_CHANNEL,PROXY,INTERFACE,PEER>::
+ peer_connected (PEER *peer
+ ACE_ENV_ARG_DECL)
+ ACE_THROW_SPEC ((CORBA::SystemException))
+{
+ TAO_ESF_Peer_Connected<PROXY,PEER> worker (peer);
+
+ this->for_each (&worker ACE_ENV_ARG_PARAMETER);
+}
+
+template<class EVENT_CHANNEL, class PROXY, class INTERFACE, class PEER> void
+TAO_ESF_Peer_Admin<EVENT_CHANNEL,PROXY,INTERFACE,PEER>::
+ peer_reconnected (PEER *peer
+ ACE_ENV_ARG_DECL)
+ ACE_THROW_SPEC ((CORBA::SystemException))
+{
+ TAO_ESF_Peer_Reconnected<PROXY,PEER> worker (peer);
+
+ this->for_each (&worker ACE_ENV_ARG_PARAMETER);
+}
+
+template<class EVENT_CHANNEL, class PROXY, class INTERFACE, class PEER> void
+TAO_ESF_Peer_Admin<EVENT_CHANNEL,PROXY,INTERFACE,PEER>::
+ peer_disconnected (PEER *peer
+ ACE_ENV_ARG_DECL)
+ ACE_THROW_SPEC ((CORBA::SystemException))
+{
+ TAO_ESF_Peer_Disconnected<PROXY,PEER> worker (peer);
+
+ this->for_each (&worker ACE_ENV_ARG_PARAMETER);
+}
+
+TAO_END_VERSIONED_NAMESPACE_DECL
+
+#endif /* TAO_ESF_PEER_ADMIN_CPP */
diff --git a/TAO/orbsvcs/orbsvcs/ESF/ESF_Peer_Admin.h b/TAO/orbsvcs/orbsvcs/ESF/ESF_Peer_Admin.h
new file mode 100644
index 00000000000..95a188cf661
--- /dev/null
+++ b/TAO/orbsvcs/orbsvcs/ESF/ESF_Peer_Admin.h
@@ -0,0 +1,108 @@
+// -*- C++ -*-
+
+/**
+ * @file ESF_Peer_Admin.h
+ *
+ * $Id$
+ *
+ * @author Carlos O'Ryan (coryan@cs.wustl.edu)
+ *
+ * http://doc.ece.uci.edu/~coryan/EC/index.html
+ */
+
+#ifndef TAO_ESF_PEER_ADMIN_H
+#define TAO_ESF_PEER_ADMIN_H
+
+#include "orbsvcs/ESF/ESF_Proxy_Admin.h"
+
+#if !defined (ACE_LACKS_PRAGMA_ONCE)
+# pragma once
+#endif /* ACE_LACKS_PRAGMA_ONCE */
+
+TAO_BEGIN_VERSIONED_NAMESPACE_DECL
+
+/**
+ * @class TAO_ESF_Peer_Admin
+ *
+ * @brief Extend the Proxy_Admin interface to provide methods for
+ * filtering
+ *
+ * Some Event Services that perform filtering have to propagate
+ * the consumer connect/disconnect activities to the suppliers,
+ * and vice-versa.
+ * In that scenario the ESF_Proxy_Admin<> interface is augmented
+ * with connected()/reconnected()/disconnected() operations for
+ * the proxy peers (i.e. the ProxySuppliers for the ProxyConsumers
+ * and vice-versa).
+ *
+ * <H2>Requirements</H2>
+ *
+ * In addition to the requirements imposed by ESF_Proxy_Admin<>
+ * the PROXY interface must implement:
+ *
+ * @verbatim
+ * void connected (PEER *peer ACE_ENV_ARG_DECL_NOT_USED) throw ();
+ * void reconnected (PEER *peer ACE_ENV_ARG_DECL_NOT_USED) throw ();
+ * void disconnected (PEER *peer ACE_ENV_ARG_DECL_NOT_USED) throw ();
+ * @endverbatim
+ *
+ * Similarly, the PEER interface must implement:
+ *
+ * @verbatim
+ * void connected (PROXY *proxy ACE_ENV_ARG_DECL_NOT_USED) throw ();
+ * void reconnected (PROXY *proxy ACE_ENV_ARG_DECL_NOT_USED) throw ();
+ * void disconnected (PROXY *proxy ACE_ENV_ARG_DECL_NOT_USED) throw ();
+ * @endverbatim
+ */
+template<class EVENT_CHANNEL, class PROXY, class INTERFACE, class PEER>
+class TAO_ESF_Peer_Admin : public TAO_ESF_Proxy_Admin<EVENT_CHANNEL,PROXY,INTERFACE>
+{
+public:
+ /// Constructor
+ TAO_ESF_Peer_Admin (EVENT_CHANNEL *ec);
+
+ /// destructor
+ virtual ~TAO_ESF_Peer_Admin (void);
+
+ /**
+ * A <peer> has connected, this is invoked when the peer's client
+ * has invoked the connect_xxx_yyy() method.
+ * The default implementation is a no-op.
+ */
+ virtual void peer_connected (PEER *peer
+ ACE_ENV_ARG_DECL)
+ ACE_THROW_SPEC ((CORBA::SystemException));
+
+ /**
+ * A <peer> has reconnected, i.e. its client has invoked the
+ * connect_xxx_yyy() method, but the peer was connected already.
+ * The default implementation delegates on the collection
+ * <reconnected> method
+ */
+ virtual void peer_reconnected (PEER *peer
+ ACE_ENV_ARG_DECL)
+ ACE_THROW_SPEC ((CORBA::SystemException));
+
+ /**
+ * A <peer> has been disconnected. The default implementation
+ * removes the object from the collection and deactivates the
+ * proxy.
+ */
+ virtual void peer_disconnected (PEER *peer
+ ACE_ENV_ARG_DECL)
+ ACE_THROW_SPEC ((CORBA::SystemException));
+};
+
+// ****************************************************************
+
+TAO_END_VERSIONED_NAMESPACE_DECL
+
+#if defined (ACE_TEMPLATES_REQUIRE_SOURCE)
+#include "orbsvcs/ESF/ESF_Peer_Admin.cpp"
+#endif /* ACE_TEMPLATES_REQUIRE_SOURCE */
+
+#if defined (ACE_TEMPLATES_REQUIRE_PRAGMA)
+#pragma implementation ("ESF_Peer_Admin.cpp")
+#endif /* ACE_TEMPLATES_REQUIRE_PRAGMA */
+
+#endif /* TAO_ESF_PEER_ADMIN_H */
diff --git a/TAO/orbsvcs/orbsvcs/ESF/ESF_Peer_Workers.cpp b/TAO/orbsvcs/orbsvcs/ESF/ESF_Peer_Workers.cpp
new file mode 100644
index 00000000000..354daec8bed
--- /dev/null
+++ b/TAO/orbsvcs/orbsvcs/ESF/ESF_Peer_Workers.cpp
@@ -0,0 +1,53 @@
+// $Id$
+
+#ifndef TAO_ESF_PEER_WORKERS_CPP
+#define TAO_ESF_PEER_WORKERS_CPP
+
+#include "orbsvcs/ESF/ESF_Peer_Workers.h"
+
+#if ! defined (__ACE_INLINE__)
+#include "orbsvcs/ESF/ESF_Peer_Workers.i"
+#endif /* __ACE_INLINE__ */
+
+TAO_BEGIN_VERSIONED_NAMESPACE_DECL
+
+template<class P, class R> void
+TAO_ESF_Peer_Connected<P,R>::work (P *proxy
+ ACE_ENV_ARG_DECL)
+{
+ proxy->connected (this->peer_ ACE_ENV_ARG_PARAMETER);
+ ACE_CHECK; // Shouldn't happen, just following the discipline
+
+ this->peer_->connected (proxy ACE_ENV_ARG_PARAMETER);
+ ACE_CHECK; // Shouldn't happen, just following the discipline
+}
+
+// ****************************************************************
+
+template<class P, class R> void
+TAO_ESF_Peer_Reconnected<P,R>::work (P *proxy
+ ACE_ENV_ARG_DECL)
+{
+ proxy->reconnected (this->peer_ ACE_ENV_ARG_PARAMETER);
+ ACE_CHECK; // Shouldn't happen, just following the discipline
+
+ this->peer_->reconnected (proxy ACE_ENV_ARG_PARAMETER);
+ ACE_CHECK; // Shouldn't happen, just following the discipline
+}
+
+// ****************************************************************
+
+template<class P, class R> void
+TAO_ESF_Peer_Disconnected<P,R>::work (P *proxy
+ ACE_ENV_ARG_DECL)
+{
+ proxy->disconnected (this->peer_ ACE_ENV_ARG_PARAMETER);
+ ACE_CHECK; // Shouldn't happen, just following the discipline
+
+ this->peer_->disconnected (proxy ACE_ENV_ARG_PARAMETER);
+ ACE_CHECK; // Shouldn't happen, just following the discipline
+}
+
+TAO_END_VERSIONED_NAMESPACE_DECL
+
+#endif /* TAO_ESF_PEER_WORKERS_CPP */
diff --git a/TAO/orbsvcs/orbsvcs/ESF/ESF_Peer_Workers.h b/TAO/orbsvcs/orbsvcs/ESF/ESF_Peer_Workers.h
new file mode 100644
index 00000000000..793e41f422e
--- /dev/null
+++ b/TAO/orbsvcs/orbsvcs/ESF/ESF_Peer_Workers.h
@@ -0,0 +1,107 @@
+// -*- C++ -*-
+
+/**
+ * @file ESF_Peer_Workers.h
+ *
+ * $Id$
+ *
+ * @author Carlos O'Ryan (coryan@cs.wustl.edu)
+ *
+ * http://doc.ece.uci.edu/~coryan/ESF/index.html
+ */
+
+#ifndef TAO_ESF_PEER_WORKERS_H
+#define TAO_ESF_PEER_WORKERS_H
+
+#include "orbsvcs/ESF/ESF_Worker.h"
+
+#if !defined (ACE_LACKS_PRAGMA_ONCE)
+# pragma once
+#endif /* ACE_LACKS_PRAGMA_ONCE */
+
+TAO_BEGIN_VERSIONED_NAMESPACE_DECL
+
+/**
+ * @class TAO_ESF_Peer_Connected
+ *
+ * Helper class.
+ * Used to iterate over a Proxy_Collection and invoke:
+ * PROXY->connected (peer);
+ * peer->connected (proxy);
+ */
+template<class PROXY, class PEER>
+class TAO_ESF_Peer_Connected : public TAO_ESF_Worker<PROXY>
+{
+public:
+ TAO_ESF_Peer_Connected (PEER *peer);
+
+ void work (PROXY *proxy
+ ACE_ENV_ARG_DECL);
+
+private:
+ PEER* peer_;
+};
+
+// ****************************************************************
+
+/**
+ * @class TAO_ESF_Peer_Reconnected
+ *
+ * Helper class.
+ * Used to iterate over a Proxy_Collection and invoke:
+ * PROXY->reconnected (peer);
+ * peer->reconnected (proxy);
+ */
+template<class PROXY, class PEER>
+class TAO_ESF_Peer_Reconnected : public TAO_ESF_Worker<PROXY>
+{
+public:
+ TAO_ESF_Peer_Reconnected (PEER *peer);
+
+ void work (PROXY *proxy
+ ACE_ENV_ARG_DECL);
+
+private:
+ PEER* peer_;
+};
+
+// ****************************************************************
+
+/**
+ * @class TAO_ESF_Peer_Disconnected
+ *
+ * Helper class.
+ * Used to iterate over a Proxy_Collection and invoke:
+ * PROXY->disconnected (peer);
+ * peer->disconnected (proxy);
+ */
+template<class PROXY, class PEER>
+class TAO_ESF_Peer_Disconnected : public TAO_ESF_Worker<PROXY>
+{
+public:
+ TAO_ESF_Peer_Disconnected (PEER *peer);
+
+ void work (PROXY *proxy
+ ACE_ENV_ARG_DECL);
+
+private:
+ PEER* peer_;
+};
+
+// ****************************************************************
+
+TAO_END_VERSIONED_NAMESPACE_DECL
+
+#if defined (__ACE_INLINE__)
+#include "orbsvcs/ESF/ESF_Peer_Workers.i"
+#endif /* __ACE_INLINE__ */
+
+#if defined (ACE_TEMPLATES_REQUIRE_SOURCE)
+#include "orbsvcs/ESF/ESF_Peer_Workers.cpp"
+#endif /* ACE_TEMPLATES_REQUIRE_SOURCE */
+
+#if defined (ACE_TEMPLATES_REQUIRE_PRAGMA)
+#pragma implementation ("ESF_Peer_Workers.cpp")
+#endif /* ACE_TEMPLATES_REQUIRE_PRAGMA */
+
+#endif /* TAO_ESF_PEER_WORKERS_H */
diff --git a/TAO/orbsvcs/orbsvcs/ESF/ESF_Peer_Workers.i b/TAO/orbsvcs/orbsvcs/ESF/ESF_Peer_Workers.i
new file mode 100644
index 00000000000..02201bde5d5
--- /dev/null
+++ b/TAO/orbsvcs/orbsvcs/ESF/ESF_Peer_Workers.i
@@ -0,0 +1,31 @@
+// -*- C++ -*-
+//
+// $Id$
+
+TAO_BEGIN_VERSIONED_NAMESPACE_DECL
+
+template<class P, class R>
+TAO_ESF_Peer_Connected<P,R>::TAO_ESF_Peer_Connected (R *peer)
+ : peer_ (peer)
+{
+}
+
+// ****************************************************************
+
+template<class P, class R>
+TAO_ESF_Peer_Reconnected<P,R>::TAO_ESF_Peer_Reconnected (R *peer)
+ : peer_ (peer)
+{
+}
+
+// ****************************************************************
+
+template<class P, class R>
+TAO_ESF_Peer_Disconnected<P,R>::TAO_ESF_Peer_Disconnected (R *peer)
+ : peer_ (peer)
+{
+}
+
+// ****************************************************************
+
+TAO_END_VERSIONED_NAMESPACE_DECL
diff --git a/TAO/orbsvcs/orbsvcs/ESF/ESF_Proxy_Admin.cpp b/TAO/orbsvcs/orbsvcs/ESF/ESF_Proxy_Admin.cpp
new file mode 100644
index 00000000000..8449b48d0b2
--- /dev/null
+++ b/TAO/orbsvcs/orbsvcs/ESF/ESF_Proxy_Admin.cpp
@@ -0,0 +1,110 @@
+// $Id$
+
+#ifndef TAO_ESF_PROXY_ADMIN_CPP
+#define TAO_ESF_PROXY_ADMIN_CPP
+
+#if ! defined (__ACE_INLINE__)
+#include "orbsvcs/ESF/ESF_Proxy_Admin.i"
+#endif /* __ACE_INLINE__ */
+
+#include "orbsvcs/ESF/ESF_Shutdown_Proxy.h"
+
+TAO_BEGIN_VERSIONED_NAMESPACE_DECL
+
+template<class EVENT_CHANNEL, class PROXY, class INTERFACE>
+TAO_ESF_Proxy_Admin<EVENT_CHANNEL,PROXY,INTERFACE>::
+ TAO_ESF_Proxy_Admin (EVENT_CHANNEL *ec)
+ : event_channel_ (ec)
+{
+ this->event_channel_->create_proxy_collection (this->collection_);
+}
+
+template<class EVENT_CHANNEL, class PROXY, class INTERFACE>
+TAO_ESF_Proxy_Admin<EVENT_CHANNEL,PROXY,INTERFACE>::
+ ~TAO_ESF_Proxy_Admin (void)
+{
+ this->event_channel_->destroy_proxy_collection (this->collection_);
+}
+
+template<class EVENT_CHANNEL, class PROXY, class INTERFACE> INTERFACE*
+TAO_ESF_Proxy_Admin<EVENT_CHANNEL,PROXY,INTERFACE>::
+ obtain (ACE_ENV_SINGLE_ARG_DECL)
+ ACE_THROW_SPEC ((CORBA::SystemException))
+{
+ PROXY* proxy;
+ this->event_channel_->create_proxy (proxy);
+
+ TAO_ESF_RefCountedRef<PROXY> holder (proxy);
+
+ ACE_TYPENAME PROXY::_ptr_type r;
+ proxy->activate (r ACE_ENV_ARG_PARAMETER);
+ ACE_CHECK_RETURN (INTERFACE::_nil ());
+
+ ACE_TYPENAME PROXY::_var_type result = r;
+
+ this->collection_->connected (proxy ACE_ENV_ARG_PARAMETER);
+ ACE_CHECK_RETURN (INTERFACE::_nil ());
+
+ return result._retn ();
+}
+
+template<class EVENT_CHANNEL, class PROXY, class INTERFACE> void
+TAO_ESF_Proxy_Admin<EVENT_CHANNEL,PROXY,INTERFACE>::
+ shutdown (ACE_ENV_SINGLE_ARG_DECL)
+ ACE_THROW_SPEC ((CORBA::SystemException))
+{
+ TAO_ESF_Shutdown_Proxy<PROXY> worker;
+
+ this->collection_->for_each (&worker ACE_ENV_ARG_PARAMETER);
+ ACE_CHECK; // Cannot happen, just following the discipline.
+
+ this->collection_->shutdown (ACE_ENV_SINGLE_ARG_PARAMETER);
+}
+
+template<class EVENT_CHANNEL, class PROXY, class INTERFACE> void
+TAO_ESF_Proxy_Admin<EVENT_CHANNEL,PROXY,INTERFACE>::
+ connected (PROXY *
+ ACE_ENV_ARG_DECL_NOT_USED)
+ ACE_THROW_SPEC ((CORBA::SystemException))
+{
+}
+
+template<class EVENT_CHANNEL, class PROXY, class INTERFACE> void
+TAO_ESF_Proxy_Admin<EVENT_CHANNEL,PROXY,INTERFACE>::
+ reconnected (PROXY *proxy
+ ACE_ENV_ARG_DECL)
+ ACE_THROW_SPEC ((CORBA::SystemException))
+{
+ this->collection_->reconnected (proxy ACE_ENV_ARG_PARAMETER);
+}
+
+template<class EVENT_CHANNEL, class PROXY, class INTERFACE> void
+TAO_ESF_Proxy_Admin<EVENT_CHANNEL,PROXY,INTERFACE>::
+ disconnected (PROXY *proxy
+ ACE_ENV_ARG_DECL)
+ ACE_THROW_SPEC ((CORBA::SystemException))
+{
+ proxy->deactivate (ACE_ENV_SINGLE_ARG_PARAMETER);
+ ACE_CHECK; // Cannot happen, just following the discipline.
+
+ ACE_TRY
+ {
+ this->collection_->disconnected (proxy ACE_ENV_ARG_PARAMETER);
+ ACE_TRY_CHECK;
+ }
+ ACE_CATCHANY
+ {
+ // @@ In the future the collections may raise exceptions to
+ // report errors (such as out of memory or things like that).
+ // We must decide how is that info going to be used, and how
+ // would we propagate the exception to the application.
+ // For example: the CosEC has no exceptions for "out of
+ // resources" or something similar, and i've never seen a spec
+ // that has an exception for "could not acquire a mutex".
+ }
+ ACE_ENDTRY;
+}
+
+TAO_END_VERSIONED_NAMESPACE_DECL
+
+#endif /* TAO_ESF_PROXY_ADMIN_CPP */
diff --git a/TAO/orbsvcs/orbsvcs/ESF/ESF_Proxy_Admin.h b/TAO/orbsvcs/orbsvcs/ESF/ESF_Proxy_Admin.h
new file mode 100644
index 00000000000..5c56884654e
--- /dev/null
+++ b/TAO/orbsvcs/orbsvcs/ESF/ESF_Proxy_Admin.h
@@ -0,0 +1,167 @@
+// -*- C++ -*-
+
+/**
+ * @file ESF_Proxy_Admin.h
+ *
+ * $Id$
+ *
+ * @author Carlos O'Ryan (coryan@cs.wustl.edu)
+ *
+ * http://doc.ece.uci.edu/~coryan/EC/index.html
+ */
+
+#ifndef TAO_ESF_PROXY_ADMIN_H
+#define TAO_ESF_PROXY_ADMIN_H
+
+#include "orbsvcs/ESF/ESF_Proxy_Collection.h"
+#include "orbsvcs/ESF/ESF_Worker.h"
+
+#if !defined (ACE_LACKS_PRAGMA_ONCE)
+# pragma once
+#endif /* ACE_LACKS_PRAGMA_ONCE */
+
+TAO_BEGIN_VERSIONED_NAMESPACE_DECL
+
+/**
+ * @class TAO_ESF_Proxy_Admin
+ *
+ * @brief Implement common tasks in the Admin interfaces.
+ *
+ * <H2>Requirements</H2>
+ *
+ * The EVENT_CHANNEL interface must implement:
+ *
+ * @verbatim
+ * void create_proxy (PROXY*&);
+ * // create a new proxy
+ *
+ * void destroy_proxy (PROXY*);
+ * // destroy a proxy
+ *
+ * void create_proxy_collection (TAO_ESF_Proxy_Collection<PROXY>*&);
+ * // create a proxy collection
+ *
+ * void destroy_proxy_collection (TAO_ESF_Proxy_Collection<PROXY>*&);
+ * // destroy a proxy collection
+ * @endverbatim
+ *
+ * In addition to the requirements imposed by
+ * TAO_ESF_Proxy_Collection<>, the PROXY interface must define:
+ *
+ * @verbatim
+ * typename .... _ptr_type;
+ * // The T_ptr for the IDL interface implemented by the PROXY.
+ *
+ * typename .... _var_type;
+ * // The T_var for the IDL interface implemented by the PROXY.
+ *
+ * PROXY::_ptr_type
+ * PROXY::activate (ACE_ENV_SINGLE_ARG_DECL_NOT_USED) throw ();
+ * // activate the proxy and return the object reference
+ * @endverbatim
+ *
+ */
+template<class EVENT_CHANNEL, class PROXY, class INTERFACE>
+class TAO_ESF_Proxy_Admin
+{
+public:
+ /// Constructor, allocate the internal collection
+ TAO_ESF_Proxy_Admin (EVENT_CHANNEL *ec);
+
+ /// Cleanup internal resources, destroy the internal collection
+ virtual ~TAO_ESF_Proxy_Admin (void);
+
+ /// Iterate over its internal collection.
+ void for_each (TAO_ESF_Worker<PROXY> *worker
+ ACE_ENV_ARG_DECL)
+ ACE_THROW_SPEC ((CORBA::SystemException));
+
+ // @todo We should use INTERFACE::_ptr_type or PROXY::_ptr_type, but
+ // the MSVC compiler (v6.0) gets confused when we do so. So we have
+ // to choose for the lesser evil. The code works because TAO uses
+ // pointers to implement the _ptr types, and that is OK because this
+ // code is supposed to run under TAO only.
+ /// Create a new PROXY and activate it.
+ virtual INTERFACE*
+ obtain (ACE_ENV_SINGLE_ARG_DECL_NOT_USED)
+ ACE_THROW_SPEC ((CORBA::SystemException));
+
+ /**
+ * The Event Channel that owns this Admin object is going
+ * down. Invoke <shutdown> on all the proxies, cleanup the
+ * collection and prepare to terminate.
+ */
+ virtual void shutdown (ACE_ENV_SINGLE_ARG_DECL)
+ ACE_THROW_SPEC ((CORBA::SystemException));
+
+ /**
+ * A <proxy> has connected, this is invoked when the proxy's client
+ * has invoked the connect_xxx_yyy() method.
+ * The default implementation is a no-op.
+ */
+ virtual void connected (PROXY *proxy
+ ACE_ENV_ARG_DECL)
+ ACE_THROW_SPEC ((CORBA::SystemException));
+
+ /**
+ * A <proxy> has reconnected, i.e. its client has invoked the
+ * connect_xxx_yyy() method, but the proxy was connected already.
+ * The default implementation delegates on the collection
+ * <reconnected> method
+ */
+ virtual void reconnected (PROXY *proxy
+ ACE_ENV_ARG_DECL)
+ ACE_THROW_SPEC ((CORBA::SystemException));
+
+ /**
+ * A <proxy> has been disconnected. The default implementation
+ * removes the object from the collection and deactivates the
+ * proxy.
+ */
+ virtual void disconnected (PROXY *proxy
+ ACE_ENV_ARG_DECL)
+ ACE_THROW_SPEC ((CORBA::SystemException));
+
+protected:
+ /// The Event Channel we belong to
+ EVENT_CHANNEL *event_channel_;
+
+private:
+ /// Shorthand for the Proxy collection
+ typedef TAO_ESF_Proxy_Collection<PROXY> Collection;
+
+ /// The proxy collection object
+ Collection *collection_;
+};
+
+// ****************************************************************
+template <class COUNTED>
+class TAO_ESF_RefCountedRef
+{
+public:
+ TAO_ESF_RefCountedRef (COUNTED *counted);
+ ~TAO_ESF_RefCountedRef ();
+private:
+ TAO_ESF_RefCountedRef (TAO_ESF_RefCountedRef<COUNTED> const & );
+ TAO_ESF_RefCountedRef& operator= (TAO_ESF_RefCountedRef<COUNTED> const & );
+
+ COUNTED *counted_;
+};
+
+// ****************************************************************
+
+TAO_END_VERSIONED_NAMESPACE_DECL
+
+#if defined (__ACE_INLINE__)
+#include "orbsvcs/ESF/ESF_Proxy_Admin.i"
+#endif /* __ACE_INLINE__ */
+
+#if defined (ACE_TEMPLATES_REQUIRE_SOURCE)
+#include "orbsvcs/ESF/ESF_Proxy_Admin.cpp"
+#endif /* ACE_TEMPLATES_REQUIRE_SOURCE */
+
+#if defined (ACE_TEMPLATES_REQUIRE_PRAGMA)
+#pragma implementation ("ESF_Proxy_Admin.cpp")
+#endif /* ACE_TEMPLATES_REQUIRE_PRAGMA */
+
+#endif /* TAO_ESF_PROXY_ADMIN_H */
diff --git a/TAO/orbsvcs/orbsvcs/ESF/ESF_Proxy_Admin.i b/TAO/orbsvcs/orbsvcs/ESF/ESF_Proxy_Admin.i
new file mode 100644
index 00000000000..882e6c9c056
--- /dev/null
+++ b/TAO/orbsvcs/orbsvcs/ESF/ESF_Proxy_Admin.i
@@ -0,0 +1,32 @@
+// -*- C++ -*-
+//
+// $Id$
+
+TAO_BEGIN_VERSIONED_NAMESPACE_DECL
+
+template<class EC,class P,class I> ACE_INLINE void
+TAO_ESF_Proxy_Admin<EC,P,I>::
+ for_each (TAO_ESF_Worker<P> *worker
+ ACE_ENV_ARG_DECL)
+ ACE_THROW_SPEC ((CORBA::SystemException))
+{
+ this->collection_->for_each (worker ACE_ENV_ARG_PARAMETER);
+}
+
+template <class C>
+ACE_INLINE
+TAO_ESF_RefCountedRef<C>::TAO_ESF_RefCountedRef (C *counted)
+ : counted_ (counted)
+{}
+
+template <class C>
+ACE_INLINE
+TAO_ESF_RefCountedRef<C>::~TAO_ESF_RefCountedRef ()
+{
+ if (this->counted_ != 0)
+ {
+ this->counted_->_decr_refcnt ();
+ }
+}
+
+TAO_END_VERSIONED_NAMESPACE_DECL
diff --git a/TAO/orbsvcs/orbsvcs/ESF/ESF_Proxy_Collection.cpp b/TAO/orbsvcs/orbsvcs/ESF/ESF_Proxy_Collection.cpp
new file mode 100644
index 00000000000..1691a2dcc02
--- /dev/null
+++ b/TAO/orbsvcs/orbsvcs/ESF/ESF_Proxy_Collection.cpp
@@ -0,0 +1,20 @@
+// $Id$
+
+#ifndef TAO_ESF_PROXY_COLLECTION_CPP
+#define TAO_ESF_PROXY_COLLECTION_CPP
+
+#include "orbsvcs/ESF/ESF_Proxy_Collection.h"
+#include "orbsvcs/ESF/ESF_Worker.h"
+
+TAO_BEGIN_VERSIONED_NAMESPACE_DECL
+
+// ****************************************************************
+
+template<class PROXY>
+TAO_ESF_Proxy_Collection<PROXY>::~TAO_ESF_Proxy_Collection (void)
+{
+}
+
+TAO_END_VERSIONED_NAMESPACE_DECL
+
+#endif /* TAO_ESF_PROXY_COLLECTION_CPP */
diff --git a/TAO/orbsvcs/orbsvcs/ESF/ESF_Proxy_Collection.h b/TAO/orbsvcs/orbsvcs/ESF/ESF_Proxy_Collection.h
new file mode 100644
index 00000000000..ceaeda03db0
--- /dev/null
+++ b/TAO/orbsvcs/orbsvcs/ESF/ESF_Proxy_Collection.h
@@ -0,0 +1,174 @@
+// -*- C++ -*-
+
+/**
+ * @file ESF_Proxy_Collection.h
+ *
+ * $Id$
+ *
+ * @author Carlos O'Ryan (coryan@cs.wustl.edu)
+ *
+ * http://doc.ece.uci.edu/~coryan/EC/index.html
+ */
+
+#ifndef TAO_ESF_PROXY_COLLECTION_H
+#define TAO_ESF_PROXY_COLLECTION_H
+#include /**/ "ace/pre.h"
+
+#include "ace/CORBA_macros.h"
+
+#if !defined (ACE_LACKS_PRAGMA_ONCE)
+# pragma once
+#endif /* ACE_LACKS_PRAGMA_ONCE */
+
+TAO_BEGIN_VERSIONED_NAMESPACE_DECL
+
+template<class Target> class TAO_ESF_Worker;
+
+/**
+ * @class TAO_ESF_Proxy_Collection
+ *
+ * @brief ESF_Proxy_Collection
+ *
+ * Many components in an Event Service need to keep a collection
+ * of proxies; these collections must be able to cope with several
+ * concurrency issues:
+ * + Some threads may need to iterate over the collection and
+ * invoke a method on each element. Locking the collection
+ * while this is done is not feasible in all cases: under some
+ * configurations the same thread that is iterating over the
+ * collection may need to make changes to the set.
+ * + A recursive lock does not solve the concurrency problems
+ * because recursive changes to the collection still invalidate
+ * the iterators.
+ *
+ * There are several solutions to this problem (see the VARIANTS)
+ * section, and there is no single one that works bests in all
+ * cases. As usual, we wish the strategize the protocol used to
+ * serialize iterations and changes to the collection. This class
+ * encapsulates that protocol.
+ *
+ * The usual form of the Iterator pattern does not work well in
+ * this case: in several variants the synchronization protocol and
+ * the iteration loop must collaborate to work efficiently.
+ * Exposing an external iterator would require that every other
+ * component in the system can support all the synchronization
+ * protocols. It is possible to hide some of that complexity
+ * using heavy weight iterators, but their use is ackward,
+ * specially since the Koening-style iterators have become more
+ * popular.
+ *
+ * Regular member functions are used to insert, remove and update
+ * members of the collection and to shutdown (i.e. perform final
+ * cleanup operations).
+ *
+ * The class must also collaborate with other components of the
+ * EC to efficiently and safely perform memory managment of the
+ * members in the collection.
+ *
+ * The PROXY object must be reference counted with the following
+ * operations:
+ *
+ * + _incr_refcnt() - increment the reference count.
+ * + _decr_refcnt() - decrement the reference count.
+ *
+ * = VARIANTS
+ *
+ * We identify several sources of variation:
+ *
+ * + Immediate_Changes: in this variant the iteration in performed
+ * while holding some kind of synchronization primitive, such as a
+ * thread mutex, a recursive mutex, a RW lock, etc.
+ * This is only useful in configurations where a separate thread
+ * dispatches the events, and thus, can only be used with real
+ * locks.
+ * + Copy_On_Read: before performing the iteration the collection
+ * is duplicated into a temporary array. Thus no locks are held
+ * during the iteration. This is a very expensive approach, but
+ * useful in many cases.
+ * The kind of lock is also strategized in this case.
+ * + Copy_On_Write: this is very similar to the previous approach,
+ * but the collection is only duplicated when a change is required
+ * while some thread is performing an iteration. The iteration
+ * continues over the original copy, while the changes are
+ * performed in the duplicate. The new copy of the collection is
+ * used for any subsequent operations, the original is discarded
+ * when the last thread using it completes its work.
+ * This approach optimizes for the case where no changes are
+ * is duplicated into a temporary array. Thus no locks are held
+ * during the iteration. This is a very expensive approach, but
+ * useful in many cases.
+ * The kind of lock is also strategized in this case.
+ * + Delayed_Changes: before starting the iteration a counter is
+ * incremented, this counter is used to keep track of the number
+ * of threads concurrently using the collection.
+ * If a thread wants to perform a change to the collection it must
+ * first verify that there are no threads iterating over it. If
+ * there are any threads then the thread queues the modification
+ * for later execution, using the Command pattern.
+ * The kind of lock is strategized, as this approach is used in
+ * single threaded configurations.
+ * There are two main variations:
+ * - An upcall can result in new dispatches: in this case we
+ * have to keep track of a the list of current threads using
+ * a Set, to avoid dead-locks. The design is not complete,
+ * probably similar to the next one.
+ * - Otherwise we just need to control the concurrency using the
+ * algorithm described below.
+ *
+ * It assumes ownership of the proxies added to the collection,
+ * it increases the reference count.
+ *
+ * Locking is provided by derived classes.
+ */
+template<class PROXY>
+class TAO_ESF_Proxy_Collection
+{
+public:
+ /// destructor
+ virtual ~TAO_ESF_Proxy_Collection (void);
+
+ /**
+ * Iterate over the collection and invoke worker->work() for each
+ * member of the collection.
+ * This encapsulates
+ */
+ virtual void for_each (TAO_ESF_Worker<PROXY> *worker
+ ACE_ENV_ARG_DECL) = 0;
+
+ /// Insert a new element into the collection. The collection assumes
+ /// ownership of the element.
+ virtual void connected (PROXY *proxy
+ ACE_ENV_ARG_DECL) = 0;
+
+ /**
+ * Insert an element into the collection. No errors can be raised
+ * if the element is already present.
+ * The collection assumes ownership, i.e. must invoke
+ * <proxy->_decr_refcnt()> if the element is already present in the
+ * collection.
+ */
+ virtual void reconnected (PROXY *proxy
+ ACE_ENV_ARG_DECL) = 0;
+
+ /// Remove an element from the collection.
+ virtual void disconnected (PROXY *proxy
+ ACE_ENV_ARG_DECL) = 0;
+
+ /// The EC is shutting down, must release all the elements.
+ virtual void shutdown (ACE_ENV_SINGLE_ARG_DECL) = 0;
+};
+
+// ****************************************************************
+
+TAO_END_VERSIONED_NAMESPACE_DECL
+
+#if defined (ACE_TEMPLATES_REQUIRE_SOURCE)
+#include "orbsvcs/ESF/ESF_Proxy_Collection.cpp"
+#endif /* ACE_TEMPLATES_REQUIRE_SOURCE */
+
+#if defined (ACE_TEMPLATES_REQUIRE_PRAGMA)
+#pragma implementation ("ESF_Proxy_Collection.cpp")
+#endif /* ACE_TEMPLATES_REQUIRE_PRAGMA */
+
+#include /**/ "ace/post.h"
+#endif /* TAO_ESF_PROXY_COLLECTION_H */
diff --git a/TAO/orbsvcs/orbsvcs/ESF/ESF_Proxy_List.cpp b/TAO/orbsvcs/orbsvcs/ESF/ESF_Proxy_List.cpp
new file mode 100644
index 00000000000..ebe73ce7996
--- /dev/null
+++ b/TAO/orbsvcs/orbsvcs/ESF/ESF_Proxy_List.cpp
@@ -0,0 +1,93 @@
+// $Id$
+
+#ifndef TAO_ESF_PROXY_LIST_CPP
+#define TAO_ESF_PROXY_LIST_CPP
+
+#include "orbsvcs/ESF/ESF_Proxy_List.h"
+
+#if ! defined (__ACE_INLINE__)
+#include "orbsvcs/ESF/ESF_Proxy_List.i"
+#endif /* __ACE_INLINE__ */
+
+TAO_BEGIN_VERSIONED_NAMESPACE_DECL
+
+template<class PROXY>
+TAO_ESF_Proxy_List<PROXY>::TAO_ESF_Proxy_List (void)
+{
+}
+
+template<class PROXY> void
+TAO_ESF_Proxy_List<PROXY>::connected (PROXY *proxy
+ ACE_ENV_ARG_DECL_NOT_USED)
+{
+ int r = this->impl_.insert (proxy);
+ if (r == 0)
+ return;
+
+ if (r == 1)
+ {
+ // @@ Already there, throw some user exception..
+ proxy->_decr_refcnt ();
+ }
+ if (r == -1)
+ {
+ // @@ Cannot insert, running out of memory? throw some other
+ // user exception
+ proxy->_decr_refcnt ();
+ }
+}
+
+template<class PROXY> void
+TAO_ESF_Proxy_List<PROXY>::reconnected (PROXY *proxy
+ ACE_ENV_ARG_DECL_NOT_USED)
+{
+ int r = this->impl_.insert (proxy);
+ if (r == 0)
+ return;
+
+ if (r == 1)
+ {
+ // Reference count is incremented by the callers to [re]connected.
+ // @@ Find out if the protocol could be simplified, and decoupling
+ // increased.
+ proxy->_decr_refcnt ();
+ return;
+ }
+
+ if (r == -1)
+ {
+ // @@ Cannot insert, running out of memory? throw some other
+ // user exception
+ proxy->_decr_refcnt ();
+ }
+}
+
+template<class PROXY> void
+TAO_ESF_Proxy_List<PROXY>::disconnected (PROXY *proxy
+ ACE_ENV_ARG_DECL_NOT_USED)
+{
+ int r = this->impl_.remove (proxy);
+ if (r != 0)
+ {
+ // @@ Cannot remove, throw some other
+ // user exception
+ return;
+ }
+ proxy->_decr_refcnt ();
+}
+
+template<class PROXY> void
+TAO_ESF_Proxy_List<PROXY>::shutdown (ACE_ENV_SINGLE_ARG_DECL_NOT_USED)
+{
+ Iterator end = this->impl_.end ();
+ for (Iterator i = this->impl_.begin (); i != end; ++i)
+ {
+ // Decrement reference count
+ (*i)->_decr_refcnt ();
+ }
+ this->impl_.reset ();
+}
+
+TAO_END_VERSIONED_NAMESPACE_DECL
+
+#endif /* TAO_ESF_PROXY_LIST_CPP */
diff --git a/TAO/orbsvcs/orbsvcs/ESF/ESF_Proxy_List.h b/TAO/orbsvcs/orbsvcs/ESF/ESF_Proxy_List.h
new file mode 100644
index 00000000000..f2697bd7dbf
--- /dev/null
+++ b/TAO/orbsvcs/orbsvcs/ESF/ESF_Proxy_List.h
@@ -0,0 +1,88 @@
+// -*- C++ -*-
+
+/**
+ * @file ESF_Proxy_List.h
+ *
+ * $Id$
+ *
+ * @author Carlos O'Ryan (coryan@cs.wustl.edu)
+ *
+ * http://doc.ece.uci.edu/~coryan/EC/index.html
+ */
+
+#ifndef TAO_ESF_PROXY_LIST_H
+#define TAO_ESF_PROXY_LIST_H
+
+#if !defined (ACE_LACKS_PRAGMA_ONCE)
+# pragma once
+#endif /* ACE_LACKS_PRAGMA_ONCE */
+
+#include "ace/Unbounded_Set.h"
+#include "ace/Containers.h"
+
+TAO_BEGIN_VERSIONED_NAMESPACE_DECL
+
+/// A concrete proxy collection.
+/**
+ * Based on the ACE_Unbounded_Set<> collection, used a double
+ * linked list internally.
+ */
+template<class PROXY>
+class TAO_ESF_Proxy_List
+{
+public:
+ /// A typedef for the underlying implementaiton class
+ typedef ACE_Unbounded_Set<PROXY*> Implementation;
+
+ /// A typedef for the underlying iterator
+ typedef ACE_Unbounded_Set_Iterator<PROXY*> Iterator;
+
+ /// Constructor
+ TAO_ESF_Proxy_List (void);
+
+ /// Return the first element in the collection, or end() if there
+ /// are none
+ ACE_Unbounded_Set_Iterator<PROXY*> begin (void);
+
+ /// Return one past the last element in the collection
+ ACE_Unbounded_Set_Iterator<PROXY*> end (void);
+
+ /// Return the number of elements in the collection
+ size_t size (void) const;
+
+ /// Insert a new element to the collection
+ void connected (PROXY *
+ ACE_ENV_ARG_DECL_NOT_USED);
+
+ /// Insert a new element that could be there already.
+ void reconnected (PROXY *
+ ACE_ENV_ARG_DECL_NOT_USED);
+
+ /// Remove an element from the collection
+ void disconnected (PROXY *
+ ACE_ENV_ARG_DECL_NOT_USED);
+
+ /// Shutdown the collection, i.e. remove all elements and release
+ /// resources
+ void shutdown (ACE_ENV_SINGLE_ARG_DECL_NOT_USED);
+
+private:
+ /// The underlying implementation object
+ ACE_Unbounded_Set<PROXY*> impl_;
+};
+
+TAO_END_VERSIONED_NAMESPACE_DECL
+
+#if defined (__ACE_INLINE__)
+#include "orbsvcs/ESF/ESF_Proxy_List.i"
+#endif /* __ACE_INLINE__ */
+
+#if defined (ACE_TEMPLATES_REQUIRE_SOURCE)
+#include "orbsvcs/ESF/ESF_Proxy_List.cpp"
+#endif /* ACE_TEMPLATES_REQUIRE_SOURCE */
+
+#if defined (ACE_TEMPLATES_REQUIRE_PRAGMA)
+#pragma implementation ("ESF_Proxy_List.cpp")
+#endif /* ACE_TEMPLATES_REQUIRE_PRAGMA */
+
+#endif /* TAO_ESF_PROXY_LIST_H */
diff --git a/TAO/orbsvcs/orbsvcs/ESF/ESF_Proxy_List.i b/TAO/orbsvcs/orbsvcs/ESF/ESF_Proxy_List.i
new file mode 100644
index 00000000000..67d752fdc6c
--- /dev/null
+++ b/TAO/orbsvcs/orbsvcs/ESF/ESF_Proxy_List.i
@@ -0,0 +1,25 @@
+// -*- C++ -*-
+//
+// $Id$
+
+TAO_BEGIN_VERSIONED_NAMESPACE_DECL
+
+template<class PROXY> ACE_INLINE ACE_Unbounded_Set_Iterator<PROXY*>
+TAO_ESF_Proxy_List<PROXY>::begin (void)
+{
+ return this->impl_.begin ();
+}
+
+template<class PROXY> ACE_INLINE ACE_Unbounded_Set_Iterator<PROXY*>
+TAO_ESF_Proxy_List<PROXY>::end (void)
+{
+ return this->impl_.end ();
+}
+
+template<class PROXY> ACE_INLINE size_t
+TAO_ESF_Proxy_List<PROXY>::size (void) const
+{
+ return this->impl_.size ();
+}
+
+TAO_END_VERSIONED_NAMESPACE_DECL
diff --git a/TAO/orbsvcs/orbsvcs/ESF/ESF_Proxy_RB_Tree.cpp b/TAO/orbsvcs/orbsvcs/ESF/ESF_Proxy_RB_Tree.cpp
new file mode 100644
index 00000000000..000b91f27d9
--- /dev/null
+++ b/TAO/orbsvcs/orbsvcs/ESF/ESF_Proxy_RB_Tree.cpp
@@ -0,0 +1,91 @@
+// $Id$
+
+#ifndef TAO_ESF_PROXY_RB_TREE_CPP
+#define TAO_ESF_PROXY_RB_TREE_CPP
+
+#include "orbsvcs/ESF/ESF_Proxy_RB_Tree.h"
+
+#if ! defined (__ACE_INLINE__)
+#include "orbsvcs/ESF/ESF_Proxy_RB_Tree.i"
+#endif /* __ACE_INLINE__ */
+
+TAO_BEGIN_VERSIONED_NAMESPACE_DECL
+
+template<class PROXY>
+TAO_ESF_Proxy_RB_Tree<PROXY>::TAO_ESF_Proxy_RB_Tree (void)
+{
+}
+
+template<class PROXY> void
+TAO_ESF_Proxy_RB_Tree<PROXY>::connected (PROXY *proxy
+ ACE_ENV_ARG_DECL_NOT_USED)
+{
+ int r = this->impl_.bind (proxy, 1);
+ if (r == 0)
+ return;
+
+ if (r == 1)
+ {
+ // @@ Already there, throw some user exception..
+ proxy->_decr_refcnt ();
+ }
+ if (r == -1)
+ {
+ // @@ Cannot insert, running out of memory? throw some other
+ // user exception
+ proxy->_decr_refcnt ();
+ }
+}
+
+template<class PROXY> void
+TAO_ESF_Proxy_RB_Tree<PROXY>::reconnected (PROXY *proxy
+ ACE_ENV_ARG_DECL_NOT_USED)
+{
+ int r = this->impl_.rebind (proxy, 1);
+ if (r == 0)
+ return;
+
+ if (r == 1)
+ {
+ // Reference count is incremented by the callers to [re]connected.
+ // @@ Find out if the protocol could be simplified, and decoupling
+ // increased.
+ proxy->_decr_refcnt ();
+ return;
+ }
+
+ if (r == -1)
+ {
+ proxy->_decr_refcnt ();
+ }
+}
+
+template<class PROXY> void
+TAO_ESF_Proxy_RB_Tree<PROXY>::disconnected (PROXY *proxy
+ ACE_ENV_ARG_DECL_NOT_USED)
+{
+ int r = this->impl_.unbind (proxy);
+ if (r != 0)
+ {
+ // @@ Cannot remove, throw some other
+ // user exception
+ return;
+ }
+ proxy->_decr_refcnt ();
+}
+
+template<class PROXY> void
+TAO_ESF_Proxy_RB_Tree<PROXY>::shutdown (ACE_ENV_SINGLE_ARG_DECL_NOT_USED)
+{
+ Iterator end = this->impl_.end ();
+ for (Iterator i = this->impl_.begin (); i != end; ++i)
+ {
+ // Decrement reference count
+ (*i)->_decr_refcnt ();
+ }
+ this->impl_.clear ();
+}
+
+TAO_END_VERSIONED_NAMESPACE_DECL
+
+#endif /* TAO_ESF_PROXY_RB_TREE_CPP */
diff --git a/TAO/orbsvcs/orbsvcs/ESF/ESF_Proxy_RB_Tree.h b/TAO/orbsvcs/orbsvcs/ESF/ESF_Proxy_RB_Tree.h
new file mode 100644
index 00000000000..e4c6ce6f9a0
--- /dev/null
+++ b/TAO/orbsvcs/orbsvcs/ESF/ESF_Proxy_RB_Tree.h
@@ -0,0 +1,114 @@
+// -*- C++ -*-
+
+/**
+ * @file ESF_Proxy_RB_Tree.h
+ *
+ * $Id$
+ *
+ * @author Carlos O'Ryan (coryan@cs.wustl.edu)
+ *
+ * http://doc.ece.uci.edu/~coryan/EC/index.html
+ */
+
+#ifndef TAO_ESF_PROXY_RB_TREE_H
+#define TAO_ESF_PROXY_RB_TREE_H
+
+#if !defined (ACE_LACKS_PRAGMA_ONCE)
+# pragma once
+#endif /* ACE_LACKS_PRAGMA_ONCE */
+
+#include "ace/RB_Tree.h"
+
+TAO_BEGIN_VERSIONED_NAMESPACE_DECL
+
+/// Iterator class for a ACE_ESF_RB_Tree
+template<class PROXY>
+class TAO_ESF_Proxy_RB_Tree_Iterator
+{
+public:
+ typedef ACE_RB_Tree_Iterator<PROXY *,
+ int,
+ ACE_Less_Than<PROXY*>,
+ ACE_Null_Mutex>
+ Implementation;
+
+ TAO_ESF_Proxy_RB_Tree_Iterator (const Implementation &i);
+
+ bool operator == (const TAO_ESF_Proxy_RB_Tree_Iterator<PROXY> &rhs) const;
+ bool operator != (const TAO_ESF_Proxy_RB_Tree_Iterator<PROXY> &rhs) const;
+ TAO_ESF_Proxy_RB_Tree_Iterator<PROXY>& operator++ (void);
+ TAO_ESF_Proxy_RB_Tree_Iterator<PROXY> operator++ (int);
+ PROXY *operator *(void);
+
+private:
+ Implementation impl_;
+};
+
+// ****************************************************************
+
+/// Concrete Proxy collection based on ACE_RB_Tree
+/**
+ * The Event Service Framework provides several alternatives for the
+ * underlying proxy collections.
+ * This version is based on Red-Black trees that offer good insertion,
+ * removal and lookup performance, but the iteration is slightly
+ * degraded.
+ */
+template<class PROXY>
+class TAO_ESF_Proxy_RB_Tree
+{
+public:
+ /// A typedef for the underlying implementaiton class
+ typedef ACE_RB_Tree<PROXY*,int,ACE_Less_Than<PROXY*>,ACE_Null_Mutex> Implementation;
+
+ /// A typedef for the underlying iterator
+ typedef TAO_ESF_Proxy_RB_Tree_Iterator<PROXY> Iterator;
+
+ /// Constructor
+ TAO_ESF_Proxy_RB_Tree (void);
+
+ /// Return the first element in the collection, or end() if there
+ /// are none
+ TAO_ESF_Proxy_RB_Tree_Iterator<PROXY> begin (void);
+
+ /// Return one past the last element in the collection
+ TAO_ESF_Proxy_RB_Tree_Iterator<PROXY> end (void);
+
+ /// Return the number of elements in the collection
+ size_t size (void) const;
+
+ /// Insert a new element to the collection
+ void connected (PROXY *
+ ACE_ENV_ARG_DECL_NOT_USED);
+
+ /// Insert a new element that could be there already.
+ void reconnected (PROXY *
+ ACE_ENV_ARG_DECL_NOT_USED);
+ /// Remove an element from the collection
+ void disconnected (PROXY *
+ ACE_ENV_ARG_DECL_NOT_USED);
+
+ /// Shutdown the collection, i.e. remove all elements and release
+ /// resources
+ void shutdown (ACE_ENV_SINGLE_ARG_DECL_NOT_USED);
+
+private:
+ /// The underlying implementation object
+ Implementation impl_;
+};
+
+TAO_END_VERSIONED_NAMESPACE_DECL
+
+#if defined (__ACE_INLINE__)
+#include "orbsvcs/ESF/ESF_Proxy_RB_Tree.i"
+#endif /* __ACE_INLINE__ */
+
+#if defined (ACE_TEMPLATES_REQUIRE_SOURCE)
+#include "orbsvcs/ESF/ESF_Proxy_RB_Tree.cpp"
+#endif /* ACE_TEMPLATES_REQUIRE_SOURCE */
+
+#if defined (ACE_TEMPLATES_REQUIRE_PRAGMA)
+#pragma implementation ("ESF_Proxy_RB_Tree.cpp")
+#endif /* ACE_TEMPLATES_REQUIRE_PRAGMA */
+
+#endif /* TAO_ESF_PROXY_RB_TREE_H */
diff --git a/TAO/orbsvcs/orbsvcs/ESF/ESF_Proxy_RB_Tree.i b/TAO/orbsvcs/orbsvcs/ESF/ESF_Proxy_RB_Tree.i
new file mode 100644
index 00000000000..b67178bf7b5
--- /dev/null
+++ b/TAO/orbsvcs/orbsvcs/ESF/ESF_Proxy_RB_Tree.i
@@ -0,0 +1,69 @@
+// -*- C++ -*-
+//
+// $Id$
+
+TAO_BEGIN_VERSIONED_NAMESPACE_DECL
+
+template<class PROXY> ACE_INLINE
+TAO_ESF_Proxy_RB_Tree_Iterator<PROXY>::
+ TAO_ESF_Proxy_RB_Tree_Iterator (const Implementation &i)
+ : impl_ (i)
+{
+}
+
+template<class PROXY> ACE_INLINE bool
+TAO_ESF_Proxy_RB_Tree_Iterator<PROXY>::operator == (
+ const TAO_ESF_Proxy_RB_Tree_Iterator<PROXY> &rhs) const
+{
+ return this->impl_ == rhs.impl_;
+}
+
+template<class PROXY> ACE_INLINE bool
+TAO_ESF_Proxy_RB_Tree_Iterator<PROXY>::operator != (
+ const TAO_ESF_Proxy_RB_Tree_Iterator<PROXY> &rhs) const
+{
+ return this->impl_ != rhs.impl_;
+}
+
+template<class PROXY> ACE_INLINE TAO_ESF_Proxy_RB_Tree_Iterator<PROXY>&
+TAO_ESF_Proxy_RB_Tree_Iterator<PROXY>::operator++ (void)
+{
+ ++this->impl_;
+ return *this;
+}
+
+template<class PROXY> ACE_INLINE TAO_ESF_Proxy_RB_Tree_Iterator<PROXY>
+TAO_ESF_Proxy_RB_Tree_Iterator<PROXY>::operator++ (int)
+{
+ TAO_ESF_Proxy_RB_Tree_Iterator<PROXY> tmp = *this;
+ ++this->impl_;
+ return tmp;
+}
+
+template<class PROXY> ACE_INLINE PROXY*
+TAO_ESF_Proxy_RB_Tree_Iterator<PROXY>::operator *(void)
+{
+ return (*this->impl_).key ();
+}
+
+// ****************************************************************
+
+template<class PROXY> ACE_INLINE TAO_ESF_Proxy_RB_Tree_Iterator<PROXY>
+TAO_ESF_Proxy_RB_Tree<PROXY>::begin (void)
+{
+ return Iterator (this->impl_.begin ());
+}
+
+template<class PROXY> ACE_INLINE TAO_ESF_Proxy_RB_Tree_Iterator<PROXY>
+TAO_ESF_Proxy_RB_Tree<PROXY>::end (void)
+{
+ return Iterator (this->impl_.end ());
+}
+
+template<class PROXY> ACE_INLINE size_t
+TAO_ESF_Proxy_RB_Tree<PROXY>::size (void) const
+{
+ return this->impl_.current_size ();
+}
+
+TAO_END_VERSIONED_NAMESPACE_DECL
diff --git a/TAO/orbsvcs/orbsvcs/ESF/ESF_Proxy_RefCount_Guard.cpp b/TAO/orbsvcs/orbsvcs/ESF/ESF_Proxy_RefCount_Guard.cpp
new file mode 100644
index 00000000000..5e236899e02
--- /dev/null
+++ b/TAO/orbsvcs/orbsvcs/ESF/ESF_Proxy_RefCount_Guard.cpp
@@ -0,0 +1,29 @@
+// $Id$
+
+#ifndef TAO_ESF_PROXY_REFCOUNT_GUARD_CPP
+#define TAO_ESF_PROXY_REFCOUNT_GUARD_CPP
+
+#include "orbsvcs/ESF/ESF_Proxy_RefCount_Guard.h"
+
+#if ! defined (__ACE_INLINE__)
+#include "orbsvcs/ESF/ESF_Proxy_RefCount_Guard.i"
+#endif /* __ACE_INLINE__ */
+
+TAO_BEGIN_VERSIONED_NAMESPACE_DECL
+
+template<class EC, class P>
+TAO_ESF_Proxy_RefCount_Guard<EC,P>::~TAO_ESF_Proxy_RefCount_Guard (void)
+{
+ // Checking for 0 is safe, once the variable reaches 0 the value
+ // will stay there.
+ // @@ But what if the thread is switched to another processor just
+ // after release the mutex?
+ if (this->refcount_ == 0)
+ {
+ this->event_channel_->destroy_proxy (this->proxy_);
+ }
+}
+
+TAO_END_VERSIONED_NAMESPACE_DECL
+
+#endif /* TAO_ESF_PROXY_REFCOUNT_GUARD_CPP */
diff --git a/TAO/orbsvcs/orbsvcs/ESF/ESF_Proxy_RefCount_Guard.h b/TAO/orbsvcs/orbsvcs/ESF/ESF_Proxy_RefCount_Guard.h
new file mode 100644
index 00000000000..7e2f9e4c160
--- /dev/null
+++ b/TAO/orbsvcs/orbsvcs/ESF/ESF_Proxy_RefCount_Guard.h
@@ -0,0 +1,79 @@
+// -*- C++ -*-
+
+/**
+ * @file ESF_Proxy_RefCount_Guard.h
+ *
+ * $Id$
+ *
+ * @author Carlos O'Ryan (coryan@cs.wustl.edu)
+ *
+ * http://doc.ece.uci.edu/~coryan/EC/index.html
+ */
+
+#ifndef TAO_ESF_PROXY_REFCOUNT_GUARD_H
+#define TAO_ESF_PROXY_REFCOUNT_GUARD_H
+
+#include "tao/Basic_Types.h"
+
+#if !defined (ACE_LACKS_PRAGMA_ONCE)
+# pragma once
+#endif /* ACE_LACKS_PRAGMA_ONCE */
+
+TAO_BEGIN_VERSIONED_NAMESPACE_DECL
+
+/**
+ * @class TAO_ESF_Proxy_RefCount_Guard
+ *
+ * @brief Reference count based guard.
+ *
+ * A common idiom used on event services is to increment a
+ * reference count before starting a long running operation.
+ * The system can then execute the operation without any risk of
+ * having the underlying object destroyed. The advantage of using
+ * a reference count is that no mutex or lock needs to be held
+ * while the operation is beign executed.
+ * This class implements that common idiom, but it also adds hooks
+ * to handle scenarios where more than one operation is performed
+ * while holding the reference count.
+ *
+ * @TODO: The type of lock could be parametric
+ */
+template<class EVENT_CHANNEL, class PROXY>
+class TAO_ESF_Proxy_RefCount_Guard
+{
+public:
+ /// Constructor
+ TAO_ESF_Proxy_RefCount_Guard (CORBA::ULong &refcount,
+ EVENT_CHANNEL *ec,
+ PROXY *proxy);
+
+ /// Destructor
+ ~TAO_ESF_Proxy_RefCount_Guard (void);
+
+protected:
+ /// The reference count, if it gets to zero then the object must be
+ /// destroyed
+ CORBA::ULong &refcount_;
+
+ /// The event channel used to destroy the proxy
+ EVENT_CHANNEL *event_channel_;
+
+ /// The proxy whose lifetime is controlled by the reference count
+ PROXY *proxy_;
+};
+
+TAO_END_VERSIONED_NAMESPACE_DECL
+
+#if defined (__ACE_INLINE__)
+#include "orbsvcs/ESF/ESF_Proxy_RefCount_Guard.i"
+#endif /* __ACE_INLINE__ */
+
+#if defined (ACE_TEMPLATES_REQUIRE_SOURCE)
+#include "orbsvcs/ESF/ESF_Proxy_RefCount_Guard.cpp"
+#endif /* ACE_TEMPLATES_REQUIRE_SOURCE */
+
+#if defined (ACE_TEMPLATES_REQUIRE_PRAGMA)
+#pragma implementation ("ESF_Proxy_RefCount_Guard.cpp")
+#endif /* ACE_TEMPLATES_REQUIRE_PRAGMA */
+
+#endif /* TAO_ESF_PROXY_REFCOUNT_GUARD_H */
diff --git a/TAO/orbsvcs/orbsvcs/ESF/ESF_Proxy_RefCount_Guard.i b/TAO/orbsvcs/orbsvcs/ESF/ESF_Proxy_RefCount_Guard.i
new file mode 100644
index 00000000000..d0d4fc80ac1
--- /dev/null
+++ b/TAO/orbsvcs/orbsvcs/ESF/ESF_Proxy_RefCount_Guard.i
@@ -0,0 +1,18 @@
+// -*- C++ -*-
+//
+// $Id$
+
+TAO_BEGIN_VERSIONED_NAMESPACE_DECL
+
+template<class EC, class P> ACE_INLINE
+TAO_ESF_Proxy_RefCount_Guard<EC,P>::
+ TAO_ESF_Proxy_RefCount_Guard (CORBA::ULong &refcount,
+ EC *ec,
+ P *proxy)
+ : refcount_ (refcount),
+ event_channel_ (ec),
+ proxy_ (proxy)
+{
+}
+
+TAO_END_VERSIONED_NAMESPACE_DECL
diff --git a/TAO/orbsvcs/orbsvcs/ESF/ESF_RefCount_Guard.cpp b/TAO/orbsvcs/orbsvcs/ESF/ESF_RefCount_Guard.cpp
new file mode 100644
index 00000000000..ae87b7f97f1
--- /dev/null
+++ b/TAO/orbsvcs/orbsvcs/ESF/ESF_RefCount_Guard.cpp
@@ -0,0 +1,14 @@
+// $Id$
+
+#ifndef TAO_ESF_REFCOUNT_GUARD_CPP
+#define TAO_ESF_REFCOUNT_GUARD_CPP
+
+#include "orbsvcs/ESF/ESF_RefCount_Guard.h"
+
+#if ! defined (__ACE_INLINE__)
+#include "orbsvcs/ESF/ESF_RefCount_Guard.i"
+#endif /* __ACE_INLINE__ */
+
+ACE_RCSID(ESF, ESF_RefCount_Guard, "$Id$")
+
+#endif /* TAO_ESF_REFCOUNT_GUARD_CPP */
diff --git a/TAO/orbsvcs/orbsvcs/ESF/ESF_RefCount_Guard.h b/TAO/orbsvcs/orbsvcs/ESF/ESF_RefCount_Guard.h
new file mode 100644
index 00000000000..84569c79bb6
--- /dev/null
+++ b/TAO/orbsvcs/orbsvcs/ESF/ESF_RefCount_Guard.h
@@ -0,0 +1,67 @@
+// -*- C++ -*-
+
+/**
+ * @file ESF_RefCount_Guard.h
+ *
+ * $Id$
+ *
+ * @author Carlos O'Ryan (coryan@cs.wustl.edu)
+ *
+ * http://doc.ece.uci.edu/~coryan/EC/index.html
+ */
+
+#ifndef TAO_ESF_REFCOUNT_GUARD_H
+#define TAO_ESF_REFCOUNT_GUARD_H
+
+#include "ace/config-all.h"
+
+#if !defined (ACE_LACKS_PRAGMA_ONCE)
+# pragma once
+#endif /* ACE_LACKS_PRAGMA_ONCE */
+
+#include "tao/Versioned_Namespace.h"
+
+TAO_BEGIN_VERSIONED_NAMESPACE_DECL
+
+/**
+ * @class TAO_ESF_RefCount_Guard
+ *
+ * @brief Reference count based guard.
+ *
+ * A common idiom used on event services is to increment a
+ * reference count before starting a long running operation.
+ * The system can then execute the operation without any risk of
+ * having the underlying object destroyed. The advantage of using
+ * a reference count is that no mutex or lock needs to be held
+ * while the operation is beign executed.
+ */
+template<class T>
+class TAO_ESF_RefCount_Guard
+{
+public:
+ /// Constructor
+ TAO_ESF_RefCount_Guard (T &refcount);
+
+ /// Destructor
+ ~TAO_ESF_RefCount_Guard (void);
+
+protected:
+ /// The reference count
+ T &refcount_;
+};
+
+TAO_END_VERSIONED_NAMESPACE_DECL
+
+#if defined (__ACE_INLINE__)
+#include "orbsvcs/ESF/ESF_RefCount_Guard.i"
+#endif /* __ACE_INLINE__ */
+
+#if defined (ACE_TEMPLATES_REQUIRE_SOURCE)
+#include "orbsvcs/ESF/ESF_RefCount_Guard.cpp"
+#endif /* ACE_TEMPLATES_REQUIRE_SOURCE */
+
+#if defined (ACE_TEMPLATES_REQUIRE_PRAGMA)
+#pragma implementation ("ESF_RefCount_Guard.cpp")
+#endif /* ACE_TEMPLATES_REQUIRE_PRAGMA */
+
+#endif /* TAO_ESF_REFCOUNT_GUARD_H */
diff --git a/TAO/orbsvcs/orbsvcs/ESF/ESF_RefCount_Guard.i b/TAO/orbsvcs/orbsvcs/ESF/ESF_RefCount_Guard.i
new file mode 100644
index 00000000000..de454aaefe0
--- /dev/null
+++ b/TAO/orbsvcs/orbsvcs/ESF/ESF_RefCount_Guard.i
@@ -0,0 +1,22 @@
+// -*- C++ -*-
+//
+// $Id$
+
+TAO_BEGIN_VERSIONED_NAMESPACE_DECL
+
+template<class T> ACE_INLINE
+TAO_ESF_RefCount_Guard<T>::
+ TAO_ESF_RefCount_Guard (T &refcount)
+ : refcount_ (refcount)
+{
+ this->refcount_++;
+}
+
+template<class T> ACE_INLINE
+TAO_ESF_RefCount_Guard<T>::
+ ~TAO_ESF_RefCount_Guard (void)
+{
+ this->refcount_--;
+}
+
+TAO_END_VERSIONED_NAMESPACE_DECL
diff --git a/TAO/orbsvcs/orbsvcs/ESF/ESF_Shutdown_Proxy.cpp b/TAO/orbsvcs/orbsvcs/ESF/ESF_Shutdown_Proxy.cpp
new file mode 100644
index 00000000000..a0db9862e3f
--- /dev/null
+++ b/TAO/orbsvcs/orbsvcs/ESF/ESF_Shutdown_Proxy.cpp
@@ -0,0 +1,33 @@
+// $Id$
+
+#ifndef TAO_ESF_SHUTDOWN_PROXY_CPP
+#define TAO_ESF_SHUTDOWN_PROXY_CPP
+
+#include "orbsvcs/ESF/ESF_Shutdown_Proxy.h"
+#include "ace/CORBA_macros.h"
+
+#if ! defined (__ACE_INLINE__)
+#include "orbsvcs/ESF/ESF_Shutdown_Proxy.i"
+#endif /* __ACE_INLINE__ */
+
+TAO_BEGIN_VERSIONED_NAMESPACE_DECL
+
+template<class PROXY> void
+TAO_ESF_Shutdown_Proxy<PROXY>::work (PROXY *proxy
+ ACE_ENV_ARG_DECL)
+{
+ ACE_TRY
+ {
+ proxy->shutdown (ACE_ENV_SINGLE_ARG_PARAMETER);
+ ACE_TRY_CHECK;
+ }
+ ACE_CATCHANY
+ {
+ // Do not propagate any exceptions
+ }
+ ACE_ENDTRY;
+}
+
+TAO_END_VERSIONED_NAMESPACE_DECL
+
+#endif /* TAO_ESF_SHUTDOWN_PROXY_CPP */
diff --git a/TAO/orbsvcs/orbsvcs/ESF/ESF_Shutdown_Proxy.h b/TAO/orbsvcs/orbsvcs/ESF/ESF_Shutdown_Proxy.h
new file mode 100644
index 00000000000..7263e4b2445
--- /dev/null
+++ b/TAO/orbsvcs/orbsvcs/ESF/ESF_Shutdown_Proxy.h
@@ -0,0 +1,52 @@
+// -*- C++ -*-
+
+/**
+ * @file ESF_Shutdown_Proxy.h
+ *
+ * $Id$
+ *
+ * @author Carlos O'Ryan (coryan@cs.wustl.edu)
+ *
+ * http://doc.ece.uci.edu/~coryan/EC/index.html
+ */
+
+
+#ifndef TAO_ESF_SHUTDOWN_PROXY_H
+#define TAO_ESF_SHUTDOWN_PROXY_H
+
+#include "orbsvcs/ESF/ESF_Worker.h"
+
+#if !defined (ACE_LACKS_PRAGMA_ONCE)
+# pragma once
+#endif /* ACE_LACKS_PRAGMA_ONCE */
+
+TAO_BEGIN_VERSIONED_NAMESPACE_DECL
+
+/// A worker to invoke the shutdown method of each proxy.
+template<class PROXY>
+class TAO_ESF_Shutdown_Proxy : public TAO_ESF_Worker<PROXY>
+{
+public:
+ TAO_ESF_Shutdown_Proxy (void);
+
+ void work (PROXY *proxy
+ ACE_ENV_ARG_DECL);
+};
+
+// ****************************************************************
+
+TAO_END_VERSIONED_NAMESPACE_DECL
+
+#if defined (__ACE_INLINE__)
+#include "orbsvcs/ESF/ESF_Shutdown_Proxy.i"
+#endif /* __ACE_INLINE__ */
+
+#if defined (ACE_TEMPLATES_REQUIRE_SOURCE)
+#include "orbsvcs/ESF/ESF_Shutdown_Proxy.cpp"
+#endif /* ACE_TEMPLATES_REQUIRE_SOURCE */
+
+#if defined (ACE_TEMPLATES_REQUIRE_PRAGMA)
+#pragma implementation ("ESF_Shutdown_Proxy.cpp")
+#endif /* ACE_TEMPLATES_REQUIRE_PRAGMA */
+
+#endif /* TAO_ESF_SHUTDOWN_PROXY_H */
diff --git a/TAO/orbsvcs/orbsvcs/ESF/ESF_Shutdown_Proxy.i b/TAO/orbsvcs/orbsvcs/ESF/ESF_Shutdown_Proxy.i
new file mode 100644
index 00000000000..51955993b3d
--- /dev/null
+++ b/TAO/orbsvcs/orbsvcs/ESF/ESF_Shutdown_Proxy.i
@@ -0,0 +1,12 @@
+// -*- C++ -*-
+//
+// $Id$
+
+TAO_BEGIN_VERSIONED_NAMESPACE_DECL
+
+template<class PROXY> ACE_INLINE
+TAO_ESF_Shutdown_Proxy<PROXY>::TAO_ESF_Shutdown_Proxy (void)
+{
+}
+
+TAO_END_VERSIONED_NAMESPACE_DECL
diff --git a/TAO/orbsvcs/orbsvcs/ESF/ESF_Worker.cpp b/TAO/orbsvcs/orbsvcs/ESF/ESF_Worker.cpp
new file mode 100644
index 00000000000..ef8c4ad0f37
--- /dev/null
+++ b/TAO/orbsvcs/orbsvcs/ESF/ESF_Worker.cpp
@@ -0,0 +1,22 @@
+// $Id$
+
+#ifndef TAO_ESF_WORKER_CPP
+#define TAO_ESF_WORKER_CPP
+
+#include "orbsvcs/ESF/ESF_Worker.h"
+
+TAO_BEGIN_VERSIONED_NAMESPACE_DECL
+
+template<class Object>
+TAO_ESF_Worker<Object>::~TAO_ESF_Worker (void)
+{
+}
+
+template<class Object>
+void TAO_ESF_Worker<Object>::set_size (size_t)
+{
+}
+
+TAO_END_VERSIONED_NAMESPACE_DECL
+
+#endif /* TAO_ESF_WORKER_CPP */
diff --git a/TAO/orbsvcs/orbsvcs/ESF/ESF_Worker.h b/TAO/orbsvcs/orbsvcs/ESF/ESF_Worker.h
new file mode 100644
index 00000000000..94041cc6555
--- /dev/null
+++ b/TAO/orbsvcs/orbsvcs/ESF/ESF_Worker.h
@@ -0,0 +1,67 @@
+// -*- C++ -*-
+
+/**
+ * @file ESF_Worker.h
+ *
+ * $Id$
+ *
+ * @author Carlos O'Ryan (coryan@cs.wustl.edu)
+ *
+ * http://doc.ece.uci.edu/~coryan/EC/index.html
+ */
+
+#ifndef TAO_ESF_WORKER_H
+#define TAO_ESF_WORKER_H
+
+#include "ace/CORBA_macros.h"
+#include "ace/os_include/os_stddef.h"
+
+#if !defined (ACE_LACKS_PRAGMA_ONCE)
+# pragma once
+#endif /* ACE_LACKS_PRAGMA_ONCE */
+
+#include "tao/Versioned_Namespace.h"
+
+TAO_BEGIN_VERSIONED_NAMESPACE_DECL
+
+class Object;
+
+namespace CORBA
+{
+ class Environment;
+}
+/// Define the interface for the Worker objects
+/**
+ * The Event Service Framework uses Worker classes to iterate over
+ * collections of proxies.
+ * The following class defines the worker interface, basically users of
+ * the framework implement a worker object and pass it to one
+ * collection. The collection invokes the worker for each element the
+ * colection contains.
+ */
+template<class Object>
+class TAO_ESF_Worker
+{
+public:
+ virtual ~TAO_ESF_Worker (void);
+
+ /// Used by the collection to inform the worker
+ /// the number of proxies in the collection.
+ virtual void set_size(size_t size);
+
+ /// Callback interface.
+ virtual void work (Object *object
+ ACE_ENV_ARG_DECL) = 0;
+};
+
+TAO_END_VERSIONED_NAMESPACE_DECL
+
+#if defined (ACE_TEMPLATES_REQUIRE_SOURCE)
+#include "orbsvcs/ESF/ESF_Worker.cpp"
+#endif /* ACE_TEMPLATES_REQUIRE_SOURCE */
+
+#if defined (ACE_TEMPLATES_REQUIRE_PRAGMA)
+#pragma implementation ("ESF_Worker.cpp")
+#endif /* ACE_TEMPLATES_REQUIRE_PRAGMA */
+
+#endif /* TAO_ESF_WORKER_H */
diff --git a/TAO/orbsvcs/orbsvcs/ESF/esf_export.h b/TAO/orbsvcs/orbsvcs/ESF/esf_export.h
new file mode 100644
index 00000000000..a9c7cd1fd3a
--- /dev/null
+++ b/TAO/orbsvcs/orbsvcs/ESF/esf_export.h
@@ -0,0 +1,40 @@
+
+// -*- C++ -*-
+// $Id$
+// Definition for Win32 Export directives.
+// This file is generated automatically by generate_export_file.pl
+// ------------------------------
+#ifndef TAO_ESF_EXPORT_H
+#define TAO_ESF_EXPORT_H
+
+#include "ace/config-all.h"
+
+#if defined (TAO_AS_STATIC_LIBS)
+# if !defined (TAO_ESF_HAS_DLL)
+# define TAO_ESF_HAS_DLL 0
+# endif /* ! TAO_ESF_HAS_DLL */
+#else
+# if !defined (TAO_ESF_HAS_DLL)
+# define TAO_ESF_HAS_DLL 1
+# endif /* ! TAO_ESF_HAS_DLL */
+#endif
+
+#if defined (TAO_ESF_HAS_DLL) && (TAO_ESF_HAS_DLL == 1)
+# if defined (TAO_ESF_BUILD_DLL)
+# define TAO_ESF_Export ACE_Proper_Export_Flag
+# define TAO_ESF_SINGLETON_DECLARATION(T) ACE_EXPORT_SINGLETON_DECLARATION (T)
+# define TAO_ESF_SINGLETON_DECLARE(SINGLETON_TYPE, CLASS, LOCK) ACE_EXPORT_SINGLETON_DECLARE(SINGLETON_TYPE, CLASS, LOCK)
+# else /* TAO_ESF_BUILD_DLL */
+# define TAO_ESF_Export ACE_Proper_Import_Flag
+# define TAO_ESF_SINGLETON_DECLARATION(T) ACE_IMPORT_SINGLETON_DECLARATION (T)
+# define TAO_ESF_SINGLETON_DECLARE(SINGLETON_TYPE, CLASS, LOCK) ACE_IMPORT_SINGLETON_DECLARE(SINGLETON_TYPE, CLASS, LOCK)
+# endif /* TAO_ESF_BUILD_DLL */
+#else /* TAO_ESF_HAS_DLL == 1 */
+# define TAO_ESF_Export
+# define TAO_ESF_SINGLETON_DECLARATION(T)
+# define TAO_ESF_SINGLETON_DECLARE(SINGLETON_TYPE, CLASS, LOCK)
+#endif /* TAO_ESF_HAS_DLL == 1 */
+
+#endif /* TAO_ESF_EXPORT_H */
+
+// End of auto generated file.
diff --git a/TAO/orbsvcs/orbsvcs/ETCL.mpc b/TAO/orbsvcs/orbsvcs/ETCL.mpc
new file mode 100644
index 00000000000..f7cfd1c9367
--- /dev/null
+++ b/TAO/orbsvcs/orbsvcs/ETCL.mpc
@@ -0,0 +1,33 @@
+// -*- MPC -*-
+// $Id$
+
+project(ETCL) : orbsvcslib, core {
+ sharedname = TAO_ETCL
+ dynamicflags = TAO_ETCL_BUILD_DLL
+ tagchecks += Notify
+ pch_header =
+ pch_source =
+
+ IDL_Files {
+ }
+
+ Source_Files {
+ ETCL
+ }
+
+ Header_Files {
+ ETCL
+ }
+
+ Inline_Files {
+ ETCL
+ }
+
+ Template_Files {
+ ETCL
+ }
+
+ Pkgconfig_Files {
+ TAO_ETCL.pc.in
+ }
+}
diff --git a/TAO/orbsvcs/orbsvcs/ETCL.rc b/TAO/orbsvcs/orbsvcs/ETCL.rc
new file mode 100644
index 00000000000..4a49921ad21
--- /dev/null
+++ b/TAO/orbsvcs/orbsvcs/ETCL.rc
@@ -0,0 +1,30 @@
+#include "..\..\tao\Version.h"
+
+1 VERSIONINFO
+ FILEVERSION TAO_MAJOR_VERSION,TAO_MINOR_VERSION,TAO_BETA_VERSION,0
+ PRODUCTVERSION TAO_MAJOR_VERSION,TAO_MINOR_VERSION,TAO_BETA_VERSION,0
+ FILEFLAGSMASK 0x3fL
+ FILEFLAGS 0x0L
+ FILEOS 0x4L
+ FILETYPE 0x1L
+ FILESUBTYPE 0x0L
+BEGIN
+ BLOCK "StringFileInfo"
+ BEGIN
+ BLOCK "040904B0"
+ BEGIN
+ VALUE "FileDescription", "ETCL\0"
+ VALUE "FileVersion", TAO_VERSION "\0"
+ VALUE "InternalName", "TAO_ETCLDLL\0"
+ VALUE "LegalCopyright", "\0"
+ VALUE "LegalTrademarks", "\0"
+ VALUE "OriginalFilename", "TAO_ETCL.DLL\0"
+ VALUE "ProductName", "ORBSVCS\0"
+ VALUE "ProductVersion", TAO_VERSION "\0"
+ END
+ END
+ BLOCK "VarFileInfo"
+ BEGIN
+ VALUE "Translation", 0x409, 1200
+ END
+END
diff --git a/TAO/orbsvcs/orbsvcs/ETCL/ETCL.ll b/TAO/orbsvcs/orbsvcs/ETCL/ETCL.ll
new file mode 100644
index 00000000000..bfbe15ddd2a
--- /dev/null
+++ b/TAO/orbsvcs/orbsvcs/ETCL/ETCL.ll
@@ -0,0 +1,161 @@
+%option noyywrap
+
+%{
+// ETCL.ll,v 1.5 2005/11/16 07:53:24 ossama Exp
+// ========================================================================
+//
+// = LIBRARY
+// orbsvcs/ECTL
+//
+// = FILENAME
+// ETCL.ll
+//
+// = AUTHOR
+// Carlos O'Ryan <coryan@uci.edu> based on previous work by
+// Seth Widoff <sbw1@cs.wustl.edu>
+//
+// ========================================================================
+
+#include "ace/OS.h"
+
+#include "ETCL_Constraint.h"
+#include "ETCL_y.h"
+
+TAO_BEGIN_VERSIONED_NAMESPACE_DECL
+
+static const char * extract_string(char*);
+
+#define TAO_YY_LEX_DEBUG
+
+#ifdef TAO_CONSTRAINT_DEBUG
+#define TAO_YY_LEX_DEBUG TAO_OS::fprintf(stderr, "%s\n", yytext)
+#endif /* TAO_CONSTRAINT_DEBUG */
+
+#define YY_DECL int TAO_ETCL_yylex (TAO_ETCL_YYSTYPE *lvalp, void* state)
+
+#define YY_BREAK
+#define YY_NO_UNPUT
+
+%}
+
+white_space [ \t]
+letter [a-zA-Z]
+digit [0-9]
+alpha_num ({letter}|{digit})
+integer {digit}+
+float ({digit}*\.{digit}+)([eE][-+]?{digit}+)?
+string '(([^'\\]*)|([^'\\]*\\')|([^'\\]*\\\\))*'
+base {letter}({alpha_num}|[_])*
+ident {base}|\\{base}
+newline \n
+
+%%
+
+min { TAO_YY_LEX_DEBUG; return TAO_ETCL_MIN; }
+max { TAO_YY_LEX_DEBUG; return TAO_ETCL_MAX; }
+first { TAO_YY_LEX_DEBUG; return TAO_ETCL_FIRST; }
+random { TAO_YY_LEX_DEBUG; return TAO_ETCL_RANDOM; }
+with { TAO_YY_LEX_DEBUG; return TAO_ETCL_WITH; }
+exist { TAO_YY_LEX_DEBUG; return TAO_ETCL_EXIST; }
+not { TAO_YY_LEX_DEBUG; return TAO_ETCL_NOT; }
+and { TAO_YY_LEX_DEBUG; return TAO_ETCL_AND; }
+or { TAO_YY_LEX_DEBUG; return TAO_ETCL_OR; }
+in { TAO_YY_LEX_DEBUG; return TAO_ETCL_IN; }
+"~" { TAO_YY_LEX_DEBUG; return TAO_ETCL_TWIDDLE; }
+"+" { TAO_YY_LEX_DEBUG; return TAO_ETCL_PLUS; }
+"-" { TAO_YY_LEX_DEBUG; return TAO_ETCL_MINUS; }
+"*" { TAO_YY_LEX_DEBUG; return TAO_ETCL_MULT; }
+"/" { TAO_YY_LEX_DEBUG; return TAO_ETCL_DIV; }
+"<" { TAO_YY_LEX_DEBUG; return TAO_ETCL_LT; }
+"<=" { TAO_YY_LEX_DEBUG; return TAO_ETCL_LE; }
+">" { TAO_YY_LEX_DEBUG; return TAO_ETCL_GT; }
+">=" { TAO_YY_LEX_DEBUG; return TAO_ETCL_GE; }
+"==" { TAO_YY_LEX_DEBUG; return TAO_ETCL_EQ; }
+"!=" { TAO_YY_LEX_DEBUG; return TAO_ETCL_NE; }
+"(" { TAO_YY_LEX_DEBUG; return TAO_ETCL_LPAREN; }
+")" { TAO_YY_LEX_DEBUG; return TAO_ETCL_RPAREN; }
+"$" { TAO_YY_LEX_DEBUG; return TAO_ETCL_DOLLAR; }
+"." { TAO_YY_LEX_DEBUG; return TAO_ETCL_DOT; }
+"default" { TAO_YY_LEX_DEBUG; return TAO_ETCL_DEFAULT; }
+"_d" { TAO_YY_LEX_DEBUG; return TAO_ETCL_DISCRIMINANT; }
+"_type_id" { TAO_YY_LEX_DEBUG; return TAO_ETCL_TYPE_ID; }
+"_repos_id" { TAO_YY_LEX_DEBUG; return TAO_ETCL_REPOS_ID; }
+"_length" { TAO_YY_LEX_DEBUG; return TAO_ETCL_LENGTH; }
+"[" { TAO_YY_LEX_DEBUG; return TAO_ETCL_LBRA; }
+"]" { TAO_YY_LEX_DEBUG; return TAO_ETCL_RBRA; }
+TRUE {
+ lvalp->constraint =
+ new TAO_ETCL_Literal_Constraint ((CORBA::Boolean) 1);
+ TAO_YY_LEX_DEBUG; return TAO_ETCL_BOOLEAN;
+ }
+FALSE {
+ lvalp->constraint =
+ new TAO_ETCL_Literal_Constraint ((CORBA::Boolean) 0);
+ TAO_YY_LEX_DEBUG; return TAO_ETCL_BOOLEAN;
+ }
+{integer} {
+ lvalp->constraint =
+ new TAO_ETCL_Literal_Constraint (ACE_OS::atoi (yytext));
+ TAO_YY_LEX_DEBUG; return TAO_ETCL_INTEGER;
+ }
+{float} {
+ double v;
+ sscanf (yytext, "%lf", &v);
+ lvalp->constraint =
+ new TAO_ETCL_Literal_Constraint (v);
+ TAO_YY_LEX_DEBUG; return TAO_ETCL_FLOAT;
+ }
+{string} {
+ lvalp->constraint =
+ new TAO_ETCL_Literal_Constraint (extract_string (yytext));
+ TAO_YY_LEX_DEBUG; return TAO_ETCL_STRING;
+ }
+{ident} {
+ lvalp->constraint =
+ new TAO_ETCL_Identifier (yytext);
+ TAO_YY_LEX_DEBUG; return TAO_ETCL_IDENT;
+ }
+{white_space} {
+ TAO_YY_LEX_DEBUG; break; // Ignore
+ }
+. {
+ TAO_YY_LEX_DEBUG; break; // @@ TODO
+ }
+%%
+
+const char*
+extract_string(char* str)
+{
+ char *t = str;
+ for (char * i = str + 1; *i != '\''; ++i, ++t)
+ {
+ if (*i == '\\')
+ {
+ ++i;
+ if (*i == 0)
+ return 0;
+ else if (*i == 't')
+ *t = '\t';
+ else if (*i == 'n')
+ *t = '\n';
+ else if (*i == '\\')
+ *t = '\\';
+ else
+ *t = *i;
+ continue;
+ }
+
+ *t = *i;
+ }
+
+ *t = '\0';
+ return str;
+}
+
+int
+yywrap (void)
+{
+ return 1;
+}
+
+TAO_END_VERSIONED_NAMESPACE_DECL \ No newline at end of file
diff --git a/TAO/orbsvcs/orbsvcs/ETCL/ETCL.rc b/TAO/orbsvcs/orbsvcs/ETCL/ETCL.rc
new file mode 100644
index 00000000000..c84d11c35db
--- /dev/null
+++ b/TAO/orbsvcs/orbsvcs/ETCL/ETCL.rc
@@ -0,0 +1,30 @@
+#include "..\..\..\tao\Version.h"
+
+1 VERSIONINFO
+ FILEVERSION TAO_MAJOR_VERSION,TAO_MINOR_VERSION,TAO_BETA_VERSION,0
+ PRODUCTVERSION TAO_MAJOR_VERSION,TAO_MINOR_VERSION,TAO_BETA_VERSION,0
+ FILEFLAGSMASK 0x3fL
+ FILEFLAGS 0x0L
+ FILEOS 0x4L
+ FILETYPE 0x1L
+ FILESUBTYPE 0x0L
+BEGIN
+ BLOCK "StringFileInfo"
+ BEGIN
+ BLOCK "040904B0"
+ BEGIN
+ VALUE "FileDescription", "ETCL\0"
+ VALUE "FileVersion", TAO_VERSION "\0"
+ VALUE "InternalName", "TAO_ETCLDLL\0"
+ VALUE "LegalCopyright", "\0"
+ VALUE "LegalTrademarks", "\0"
+ VALUE "OriginalFilename", "TAO_ETCL.DLL\0"
+ VALUE "ProductName", "ORBSVCS\0"
+ VALUE "ProductVersion", TAO_VERSION "\0"
+ END
+ END
+ BLOCK "VarFileInfo"
+ BEGIN
+ VALUE "Translation", 0x409, 1200
+ END
+END
diff --git a/TAO/orbsvcs/orbsvcs/ETCL/ETCL.yy b/TAO/orbsvcs/orbsvcs/ETCL/ETCL.yy
new file mode 100644
index 00000000000..14c9eaad182
--- /dev/null
+++ b/TAO/orbsvcs/orbsvcs/ETCL/ETCL.yy
@@ -0,0 +1,261 @@
+%{
+// $Id$
+// ========================================================================
+//
+// = LIBRARY
+// orbsvcs / Extended Trader Constraint Language parser.
+//
+// = FILENAME
+// ETCL.yy
+//
+// = AUTHOR
+// Carlos O'Ryan <coryan@uci.edu> based on previous work by
+// Seth Widoff <sbw1@cs.wustl.edu>
+//
+// ========================================================================
+
+#include "ETCL_y.h"
+#include "ETCL_Constraint.h"
+#include "ETCL_Interpreter.h"
+
+TAO_BEGIN_VERSIONED_NAMESPACE_DECL
+
+extern int yylex (void);
+
+static void yyerror (const char *)
+{
+ // @@ TODO
+ // Ignore error messages
+}
+
+%}
+
+%token TAO_ETCL_GT
+%token TAO_ETCL_GE
+%token TAO_ETCL_LT
+%token TAO_ETCL_LE
+%token TAO_ETCL_EQ
+%token TAO_ETCL_NE
+%token TAO_ETCL_EXIST
+%token TAO_ETCL_DEFAULT
+%token TAO_ETCL_AND
+%token TAO_ETCL_OR
+%token TAO_ETCL_NOT
+%token TAO_ETCL_IN
+%token TAO_ETCL_TWIDDLE
+%token TAO_ETCL_BOOLEAN
+%token TAO_ETCL_PLUS
+%token TAO_ETCL_MINUS
+%token TAO_ETCL_MULT
+%token TAO_ETCL_DIV
+%token TAO_ETCL_UMINUS
+%token TAO_ETCL_INTEGER
+%token TAO_ETCL_FLOAT
+%token TAO_ETCL_STRING
+%token TAO_ETCL_RPAREN
+%token TAO_ETCL_LPAREN
+%token TAO_ETCL_RBRA
+%token TAO_ETCL_LBRA
+%token TAO_ETCL_IDENT
+%token TAO_ETCL_UNSIGNED
+%token TAO_ETCL_SIGNED
+%token TAO_ETCL_DOUBLE
+%token TAO_ETCL_CONSTRAINT
+%token TAO_ETCL_COMPONENT
+%token TAO_ETCL_WITH
+%token TAO_ETCL_MAX
+%token TAO_ETCL_MIN
+%token TAO_ETCL_FIRST
+%token TAO_ETCL_RANDOM
+%token TAO_ETCL_DOLLAR
+%token TAO_ETCL_DOT
+%token TAO_ETCL_DISCRIMINANT
+%token TAO_ETCL_LENGTH
+%token TAO_ETCL_TYPE_ID
+%token TAO_ETCL_REPOS_ID
+
+
+%type <constraint> TAO_ETCL_IDENT
+%type <constraint> TAO_ETCL_BOOLEAN
+%type <constraint> TAO_ETCL_STRING
+%type <constraint> TAO_ETCL_FLOAT
+%type <constraint> TAO_ETCL_INTEGER
+%type <constraint> expr_in
+%type <constraint> constraint preference bool_or bool_and bool_compare
+%type <constraint> expr_in expr_twiddle expr term factor_not factor
+%type <constraint> union_pos union_val component_array
+%type <constraint> component_array component_assoc component_pos
+%type <constraint> component_dot component_ext component
+
+%start constraint
+
+%%
+
+constraint: bool_or
+ | preference
+ ;
+
+preference: TAO_ETCL_MIN bool_or
+ { $$ = new TAO_ETCL_Preference (TAO_ETCL_MIN, $2); }
+ | TAO_ETCL_MAX bool_or
+ { $$ = new TAO_ETCL_Preference (TAO_ETCL_MAX, $2); }
+ | TAO_ETCL_WITH bool_or
+ { $$ = new TAO_ETCL_Preference (TAO_ETCL_WITH, $2); }
+ | TAO_ETCL_FIRST
+ { $$ = new TAO_ETCL_Preference (TAO_ETCL_FIRST); }
+ | TAO_ETCL_RANDOM
+ { $$ = new TAO_ETCL_Preference (TAO_ETCL_RANDOM); }
+ ;
+
+bool_or: bool_or TAO_ETCL_OR bool_and
+ { $$ = new TAO_ETCL_Binary_Expr (TAO_ETCL_OR, $1, $3); }
+ | bool_and
+ ;
+
+bool_and: bool_and TAO_ETCL_AND bool_compare
+ { $$ = new TAO_ETCL_Binary_Expr (TAO_ETCL_AND, $1, $3); }
+ | bool_compare
+ ;
+
+bool_compare: expr_in TAO_ETCL_EQ expr_in
+ { $$ = new TAO_ETCL_Binary_Expr (TAO_ETCL_EQ, $1, $3); }
+ | expr_in TAO_ETCL_NE expr_in
+ { $$ = new TAO_ETCL_Binary_Expr (TAO_ETCL_NE, $1, $3); }
+ | expr_in TAO_ETCL_GT expr_in
+ { $$ = new TAO_ETCL_Binary_Expr (TAO_ETCL_GT, $1, $3); }
+ | expr_in TAO_ETCL_GE expr_in
+ { $$ = new TAO_ETCL_Binary_Expr (TAO_ETCL_GE, $1, $3); }
+ | expr_in TAO_ETCL_LT expr_in
+ { $$ = new TAO_ETCL_Binary_Expr (TAO_ETCL_LT, $1, $3); }
+ | expr_in TAO_ETCL_LE expr_in
+ { $$ = new TAO_ETCL_Binary_Expr (TAO_ETCL_LE, $1, $3); }
+ | expr_in
+ ;
+
+expr_in: expr_twiddle TAO_ETCL_IN component
+ { $$ = new TAO_ETCL_Binary_Expr (TAO_ETCL_IN, $1, $3); }
+ | expr_twiddle TAO_ETCL_IN TAO_ETCL_DOLLAR component
+ { $$ = new TAO_ETCL_Binary_Expr (TAO_ETCL_IN, $1, $4); }
+ | expr_twiddle
+ ;
+
+expr_twiddle: expr TAO_ETCL_TWIDDLE expr
+ { $$ = new TAO_ETCL_Binary_Expr (TAO_ETCL_TWIDDLE, $1, $3); }
+ | expr
+ ;
+
+expr: expr TAO_ETCL_PLUS term
+ { $$ = new TAO_ETCL_Binary_Expr (TAO_ETCL_PLUS, $1, $3); }
+ | expr TAO_ETCL_MINUS term
+ { $$ = new TAO_ETCL_Binary_Expr (TAO_ETCL_MINUS, $1, $3); }
+ | term
+ ;
+
+term: term TAO_ETCL_MULT factor_not
+ { $$ = new TAO_ETCL_Binary_Expr (TAO_ETCL_MULT, $1, $3); }
+ | term TAO_ETCL_DIV factor_not
+ { $$ = new TAO_ETCL_Binary_Expr (TAO_ETCL_DIV, $1, $3); }
+ | factor_not
+ ;
+
+factor_not: TAO_ETCL_NOT factor
+ { $$ = new TAO_ETCL_Unary_Expr (TAO_ETCL_NOT, $2); }
+ | factor
+ ;
+
+factor: TAO_ETCL_LPAREN bool_or TAO_ETCL_RPAREN
+ { $$ = $2; }
+ | TAO_ETCL_INTEGER
+ { $$ = $1; }
+ | TAO_ETCL_PLUS TAO_ETCL_INTEGER
+ { $$ = new TAO_ETCL_Unary_Expr (TAO_ETCL_PLUS, $2); }
+ | TAO_ETCL_MINUS TAO_ETCL_INTEGER
+ { $$ = new TAO_ETCL_Unary_Expr (TAO_ETCL_MINUS, $2); }
+ | TAO_ETCL_FLOAT
+ { $$ = $1; }
+ | TAO_ETCL_PLUS TAO_ETCL_FLOAT
+ { $$ = new TAO_ETCL_Unary_Expr (TAO_ETCL_PLUS, $2); }
+ | TAO_ETCL_MINUS TAO_ETCL_FLOAT
+ { $$ = new TAO_ETCL_Unary_Expr (TAO_ETCL_MINUS, $2); }
+ | TAO_ETCL_STRING
+ { $$ = $1; }
+ | TAO_ETCL_BOOLEAN
+ { $$ = $1; }
+ | TAO_ETCL_EXIST TAO_ETCL_IDENT
+ { $$ = new TAO_ETCL_Exist ($2); }
+ | TAO_ETCL_EXIST TAO_ETCL_DOLLAR component
+ { $$ = new TAO_ETCL_Exist ($3); }
+ | TAO_ETCL_DEFAULT TAO_ETCL_DOLLAR component
+ { $$ = new TAO_ETCL_Default ($3); }
+ | TAO_ETCL_DOLLAR component
+ { $$ = new TAO_ETCL_Eval ($2); }
+ | TAO_ETCL_IDENT
+ { $$ = $1; }
+ ;
+
+component: /* empty */
+ { $$ = 0; }
+ | TAO_ETCL_DOT component_dot
+ { $$ = new TAO_ETCL_Dot ($2); }
+
+ | TAO_ETCL_IDENT component_ext
+ { $$ = new TAO_ETCL_Component ($1, $2); }
+
+ | component_array
+ | component_assoc
+ ;
+
+component_ext: /* empty */
+ { $$ = 0; }
+ | TAO_ETCL_DOT component_dot
+ { $$ = new TAO_ETCL_Dot ($2); }
+
+ | component_array
+ | component_assoc
+ ;
+
+component_dot: TAO_ETCL_IDENT component_ext
+ { $$ = new TAO_ETCL_Component ($1, $2); }
+ | TAO_ETCL_LENGTH
+ { $$ = new TAO_ETCL_Special (TAO_ETCL_LENGTH); }
+ | TAO_ETCL_DISCRIMINANT
+ { $$ = new TAO_ETCL_Special (TAO_ETCL_DISCRIMINANT); }
+ | TAO_ETCL_TYPE_ID
+ { $$ = new TAO_ETCL_Special (TAO_ETCL_TYPE_ID); }
+ | TAO_ETCL_REPOS_ID
+ { $$ = new TAO_ETCL_Special (TAO_ETCL_REPOS_ID); }
+ | component_pos
+ | union_pos
+ ;
+
+component_array: TAO_ETCL_LBRA TAO_ETCL_INTEGER TAO_ETCL_RBRA component_ext
+ { $$ = new TAO_ETCL_Component_Array ($2, $4); }
+ ;
+
+component_assoc: TAO_ETCL_LPAREN TAO_ETCL_IDENT TAO_ETCL_RPAREN component_ext
+ { $$ = new TAO_ETCL_Component_Assoc ($2, $4); }
+ ;
+
+component_pos: TAO_ETCL_INTEGER component_ext
+ { $$ = new TAO_ETCL_Component_Pos ($1, $2); }
+ ;
+
+union_pos: TAO_ETCL_LPAREN union_val TAO_ETCL_RPAREN component_ext
+ { $$ = new TAO_ETCL_Union_Pos ($2, $4); }
+ ;
+
+union_val: /* empty */
+ { $$ = 0; }
+ | TAO_ETCL_INTEGER
+ { $$ = new TAO_ETCL_Union_Value (+1, $1); }
+ | TAO_ETCL_PLUS TAO_ETCL_INTEGER
+ { $$ = new TAO_ETCL_Union_Value (+1, $2); }
+ | TAO_ETCL_MINUS TAO_ETCL_INTEGER
+ { $$ = new TAO_ETCL_Union_Value (-1, $2); }
+ | TAO_ETCL_STRING
+ { $$ = new TAO_ETCL_Union_Value ($1); }
+ ;
+
+%%
+
+TAO_END_VERSIONED_NAMESPACE_DECL
diff --git a/TAO/orbsvcs/orbsvcs/ETCL/ETCL_Constraint.cpp b/TAO/orbsvcs/orbsvcs/ETCL/ETCL_Constraint.cpp
new file mode 100644
index 00000000000..092af3fa7f8
--- /dev/null
+++ b/TAO/orbsvcs/orbsvcs/ETCL/ETCL_Constraint.cpp
@@ -0,0 +1,956 @@
+// -*- C++ -*-
+// $Id$
+
+#include "orbsvcs/ETCL/ETCL_Constraint.h"
+#include "orbsvcs/ETCL/ETCL_Constraint_Visitor.h"
+#include "orbsvcs/ETCL/ETCL_y.h"
+
+#include "tao/AnyTypeCode/Any_Unknown_IDL_Type.h"
+#include "tao/AnyTypeCode/TypeCode.h"
+#include "tao/AnyTypeCode/Any.h"
+#include "tao/Environment.h"
+#include "tao/CDR.h"
+
+#if ! defined (__ACE_INLINE__)
+#include "orbsvcs/ETCL/ETCL_Constraint.inl"
+#endif /* __ACE_INLINE__ */
+
+ACE_RCSID (ETCL,
+ ETCL_Constraint,
+ "$Id$")
+
+TAO_BEGIN_VERSIONED_NAMESPACE_DECL
+
+TAO_ETCL_Constraint::TAO_ETCL_Constraint (void)
+{
+}
+
+TAO_ETCL_Constraint::~TAO_ETCL_Constraint (void)
+{
+}
+
+// ****************************************************************
+
+TAO_ETCL_Literal_Constraint::TAO_ETCL_Literal_Constraint (
+ const TAO_ETCL_Literal_Constraint & lit
+ )
+ : TAO_ETCL_Constraint ()
+{
+ this->copy (lit);
+}
+
+
+TAO_ETCL_Literal_Constraint::TAO_ETCL_Literal_Constraint (CORBA::Any * any)
+{
+ CORBA::Any& any_ref = *any;
+ CORBA::TypeCode_var type = any_ref.type ();
+ CORBA::TCKind corba_type = CORBA::tk_null;
+
+ ACE_TRY_NEW_ENV
+ {
+ corba_type = type->kind (ACE_ENV_SINGLE_ARG_PARAMETER);
+ ACE_TRY_CHECK;
+ }
+ ACE_CATCHANY
+ {
+ // @@ Seth: Don't know what else to do. Make sure we can tell
+ // when this constructor fails.
+ return;
+ }
+ ACE_ENDTRY;
+
+ this->type_ =
+ TAO_ETCL_Literal_Constraint::comparable_type (type.in ());
+
+ switch (this->type_)
+ {
+ case TAO_ETCL_SIGNED:
+ this->op_.integer_ = 0;
+
+ if (corba_type == CORBA::tk_short)
+ {
+ CORBA::Short sh;
+ any_ref >>= sh;
+ this->op_.integer_ = (CORBA::Long) sh;
+ }
+ else
+ {
+ any_ref >>= this->op_.integer_;
+ }
+
+ break;
+ case TAO_ETCL_UNSIGNED:
+ this->op_.uinteger_ = 0;
+
+ if (corba_type == CORBA::tk_ushort)
+ {
+ CORBA::UShort sh;
+ any_ref >>= sh;
+ this->op_.uinteger_ = (CORBA::ULong) sh;
+ }
+ else if (corba_type == CORBA::tk_enum)
+ {
+ TAO::Any_Impl *impl = any->impl ();
+
+ if (impl->encoded ())
+ {
+ TAO::Unknown_IDL_Type *unk =
+ dynamic_cast<TAO::Unknown_IDL_Type *> (impl);
+
+ // We don't want unk's rd_ptr to move, in case we are shared by
+ // another Any, so we use this to copy the state, not the buffer.
+ TAO_InputCDR for_reading (unk->_tao_get_cdr ());
+ for_reading.read_ulong (this->op_.uinteger_);
+ }
+ else
+ {
+ TAO_OutputCDR out;
+ impl->marshal_value (out);
+ TAO_InputCDR in (out);
+ in.read_ulong (this->op_.uinteger_);
+ }
+ }
+ else
+ {
+ any_ref >>= this->op_.uinteger_;
+ }
+
+ break;
+ case TAO_ETCL_DOUBLE:
+ if (corba_type == CORBA::tk_float)
+ {
+ CORBA::Float fl;
+ (*any) >>= fl;
+ this->op_.double_ = (CORBA::Double) fl;
+ }
+ else
+ {
+ (*any) >>= this->op_.double_;
+ }
+
+ break;
+ case TAO_ETCL_BOOLEAN:
+ {
+ CORBA::Any::to_boolean tmp (this->op_.bool_);
+ (*any) >>= tmp;
+ }
+ break;
+ case TAO_ETCL_STRING:
+ {
+ const char* s;
+ any_ref >>= s;
+ this->op_.str_ = CORBA::string_dup (s);
+ }
+ break;
+ case TAO_ETCL_COMPONENT:
+ this->op_.any_ = any;
+ break;
+ }
+}
+
+TAO_ETCL_Literal_Constraint::TAO_ETCL_Literal_Constraint (
+ CORBA::ULong uinteger
+ )
+ : type_ (TAO_ETCL_UNSIGNED)
+{
+ this->op_.uinteger_ = uinteger;
+}
+
+TAO_ETCL_Literal_Constraint::TAO_ETCL_Literal_Constraint (
+ CORBA::Long integer
+ )
+ : type_ (TAO_ETCL_SIGNED)
+{
+ this->op_.integer_ = integer;
+}
+
+TAO_ETCL_Literal_Constraint::TAO_ETCL_Literal_Constraint (
+ CORBA::Boolean boolean
+ )
+ : type_ (TAO_ETCL_BOOLEAN)
+{
+ this->op_.bool_ = boolean;
+}
+
+TAO_ETCL_Literal_Constraint::TAO_ETCL_Literal_Constraint (
+ CORBA::Double doub
+ )
+ : type_ (TAO_ETCL_DOUBLE)
+{
+ this->op_.double_ = doub;
+}
+
+TAO_ETCL_Literal_Constraint::TAO_ETCL_Literal_Constraint (
+ const char* str
+ )
+ : type_ (TAO_ETCL_STRING)
+{
+ this->op_.str_ = CORBA::string_dup (str);
+}
+
+TAO_ETCL_Literal_Constraint::~TAO_ETCL_Literal_Constraint (void)
+{
+ if (this->type_ == TAO_ETCL_STRING)
+ {
+ CORBA::string_free (this->op_.str_);
+ }
+}
+
+int
+TAO_ETCL_Literal_Constraint::accept (TAO_ETCL_Constraint_Visitor* visitor)
+{
+ return visitor->visit_literal (this);
+}
+
+TAO_Literal_Type
+TAO_ETCL_Literal_Constraint::expr_type (void) const
+{
+ return this->type_;
+}
+
+void
+TAO_ETCL_Literal_Constraint::operator= (const TAO_ETCL_Literal_Constraint& co)
+{
+ this->copy (co);
+}
+
+TAO_ETCL_Literal_Constraint::operator CORBA::Boolean (void) const
+{
+ return (this->type_ == TAO_ETCL_BOOLEAN) ? this->op_.bool_ : 0;
+}
+
+TAO_ETCL_Literal_Constraint::operator CORBA::ULong (void) const
+{
+ switch (this->type_)
+ {
+ case TAO_ETCL_UNSIGNED:
+ return this->op_.uinteger_;
+ case TAO_ETCL_SIGNED:
+ case TAO_ETCL_INTEGER:
+ return
+ (this->op_.integer_ > 0) ? (CORBA::ULong) this->op_.integer_ : 0;
+ case TAO_ETCL_DOUBLE:
+ return
+ (this->op_.double_ > 0) ?
+ ((this->op_.double_ > ACE_UINT32_MAX) ?
+ ACE_UINT32_MAX :
+ (CORBA::ULong) this->op_.double_)
+ : 0;
+ case TAO_ETCL_COMPONENT:
+ {
+ CORBA::ULong retval = 0;
+ *this->op_.any_ >>= retval;
+ return retval;
+ }
+ default:
+ return 0;
+ }
+}
+
+TAO_ETCL_Literal_Constraint::operator CORBA::Long (void) const
+{
+ switch (this->type_)
+ {
+ case TAO_ETCL_SIGNED:
+ case TAO_ETCL_INTEGER:
+ return this->op_.integer_;
+ case TAO_ETCL_UNSIGNED:
+ return
+ (this->op_.uinteger_ > (CORBA::ULong) ACE_INT32_MAX) ?
+ ACE_INT32_MAX : (CORBA::Long) this->op_.uinteger_;
+ case TAO_ETCL_DOUBLE:
+ return
+ (this->op_.double_ > 0) ?
+ ((this->op_.double_ > ACE_INT32_MAX) ?
+ ACE_INT32_MAX :
+ (CORBA::Long) this->op_.double_) :
+ ((this->op_.double_ < ACE_INT32_MIN) ?
+ ACE_INT32_MIN :
+ (CORBA::Long) this->op_.double_);
+ case TAO_ETCL_COMPONENT:
+ {
+ CORBA::Long retval = 0;
+ *this->op_.any_ >>= retval;
+ return retval;
+ }
+ default:
+ return 0;
+ }
+}
+
+TAO_ETCL_Literal_Constraint::operator CORBA::Double (void) const
+{
+ switch (this->type_)
+ {
+ case TAO_ETCL_DOUBLE:
+ return this->op_.double_;
+ case TAO_ETCL_SIGNED:
+ case TAO_ETCL_INTEGER:
+ return (CORBA::Double) this->op_.integer_;
+ case TAO_ETCL_UNSIGNED:
+ return (CORBA::Double) this->op_.uinteger_;
+ case TAO_ETCL_COMPONENT:
+ {
+ CORBA::Double retval = 0.0;
+ *this->op_.any_ >>= retval;
+ return retval;
+ }
+ default:
+ return 0.0;
+ }
+}
+
+TAO_ETCL_Literal_Constraint::operator const char* (void) const
+{
+ switch (this->type_)
+ {
+ case TAO_ETCL_STRING:
+ return this->op_.str_;
+ case TAO_ETCL_COMPONENT:
+ {
+ const char *retval = 0;
+ *this->op_.any_ >>= retval;
+ return retval;
+ }
+ default:
+ return 0;
+ }
+}
+
+TAO_ETCL_Literal_Constraint::operator const CORBA::Any* (void) const
+{
+ return (this->type_ == TAO_ETCL_COMPONENT) ? this->op_.any_ : 0;
+}
+
+TAO_Literal_Type
+TAO_ETCL_Literal_Constraint::comparable_type (CORBA::TypeCode_ptr type)
+{
+ // Convert a CORBA::TCKind into a TAO_Literal_Type
+ TAO_Literal_Type return_value = TAO_UNKNOWN;
+ CORBA::TCKind kind = CORBA::tk_null;
+
+ ACE_TRY_NEW_ENV
+ {
+ kind = type->kind (ACE_ENV_SINGLE_ARG_PARAMETER);
+ ACE_TRY_CHECK;
+
+ CORBA::TypeCode_var tmp = CORBA::TypeCode::_duplicate (type);
+
+ while (kind == CORBA::tk_alias)
+ {
+ tmp = tmp->content_type (ACE_ENV_SINGLE_ARG_PARAMETER);
+ ACE_TRY_CHECK;
+
+ kind = tmp->kind (ACE_ENV_SINGLE_ARG_PARAMETER);
+ ACE_TRY_CHECK;
+ }
+ }
+ ACE_CATCHANY
+ {
+ return return_value;
+ }
+ ACE_ENDTRY;
+ // Since this is a "top level try block, no need to check again.
+
+ switch (kind)
+ {
+ case CORBA::tk_ushort:
+ case CORBA::tk_ulong:
+ case CORBA::tk_enum:
+ case CORBA::tk_ulonglong:
+ return_value = TAO_ETCL_UNSIGNED;
+ break;
+ case CORBA::tk_short:
+ case CORBA::tk_long:
+ case CORBA::tk_longlong:
+ return_value = TAO_ETCL_SIGNED;
+ break;
+ case CORBA::tk_boolean:
+ return_value = TAO_ETCL_BOOLEAN;
+ break;
+ case CORBA::tk_float:
+ case CORBA::tk_double:
+ return_value = TAO_ETCL_DOUBLE;
+ break;
+ case CORBA::tk_string:
+ return_value = TAO_ETCL_STRING;
+ break;
+ default:
+ return_value = TAO_ETCL_COMPONENT;
+ break;
+ }
+
+ return return_value;
+}
+
+bool
+TAO_ETCL_Literal_Constraint::operator== (const TAO_ETCL_Literal_Constraint & rhs)
+{
+ bool return_value = false;
+ TAO_Literal_Type widest_type = this->widest_type (rhs);
+
+ switch (widest_type)
+ {
+ case TAO_ETCL_STRING:
+ return_value = (ACE_OS::strcmp ((const char*) *this, (const char*) rhs) == 0);
+ break;
+ case TAO_ETCL_DOUBLE:
+ return_value = (CORBA::Double) *this == (CORBA::Double) rhs;
+ break;
+ case TAO_ETCL_INTEGER:
+ case TAO_ETCL_SIGNED:
+ return_value = (CORBA::Long) *this == (CORBA::Long) rhs;
+ break;
+ case TAO_ETCL_UNSIGNED:
+ return_value = (CORBA::ULong) *this == (CORBA::ULong) rhs;
+ break;
+ case TAO_ETCL_BOOLEAN:
+ return_value = (CORBA::Boolean) *this == (CORBA::Boolean) rhs;
+ break;
+ default:
+ break;
+ }
+
+ return return_value;
+}
+
+
+bool
+TAO_ETCL_Literal_Constraint::operator!= (const TAO_ETCL_Literal_Constraint & rhs)
+{
+ bool return_value = false;
+ TAO_Literal_Type widest_type = this->widest_type (rhs);
+
+ switch (widest_type)
+ {
+ case TAO_ETCL_STRING:
+ return_value = (ACE_OS::strcmp ((const char*) *this, (const char*) rhs) != 0);
+ break;
+ case TAO_ETCL_DOUBLE:
+ return_value = (CORBA::Double) *this != (CORBA::Double) rhs;
+ break;
+ case TAO_ETCL_INTEGER:
+ case TAO_ETCL_SIGNED:
+ return_value = (CORBA::Long) *this != (CORBA::Long) rhs;
+ break;
+ case TAO_ETCL_UNSIGNED:
+ return_value = (CORBA::ULong) *this != (CORBA::ULong) rhs;
+ break;
+ case TAO_ETCL_BOOLEAN:
+ return_value = (CORBA::Boolean) *this != (CORBA::Boolean) rhs;
+ break;
+ default:
+ break;
+ }
+
+ return return_value;
+}
+
+bool
+TAO_ETCL_Literal_Constraint::operator< (const TAO_ETCL_Literal_Constraint & rhs)
+{
+ bool return_value = false;
+ TAO_Literal_Type widest_type = this->widest_type (rhs);
+
+ switch (widest_type)
+ {
+ case TAO_ETCL_STRING:
+ return_value = (ACE_OS::strcmp ((const char*) *this, (const char*) rhs) < 0);
+ break;
+ case TAO_ETCL_DOUBLE:
+ return_value = (CORBA::Double) *this < (CORBA::Double) rhs;
+ break;
+ case TAO_ETCL_INTEGER:
+ case TAO_ETCL_SIGNED:
+ return_value = (CORBA::Long) *this < (CORBA::Long) rhs;
+ break;
+ case TAO_ETCL_UNSIGNED:
+ return_value = (CORBA::ULong) *this < (CORBA::ULong) rhs;
+ break;
+ case TAO_ETCL_BOOLEAN:
+ return_value = (CORBA::Boolean) *this < (CORBA::Boolean) rhs;
+ break;
+ default:
+ break;
+ }
+
+ return return_value;
+}
+
+bool
+TAO_ETCL_Literal_Constraint::operator<= (const TAO_ETCL_Literal_Constraint & rhs)
+{
+ bool return_value = false;
+ TAO_Literal_Type widest_type = this->widest_type (rhs);
+
+ switch (widest_type)
+ {
+ case TAO_ETCL_STRING:
+ return_value = (ACE_OS::strcmp ((const char*) *this, (const char*) rhs) <= 0);
+ break;
+ case TAO_ETCL_DOUBLE:
+ return_value = (CORBA::Double) *this <= (CORBA::Double) rhs;
+ break;
+ case TAO_ETCL_INTEGER:
+ case TAO_ETCL_SIGNED:
+ return_value = (CORBA::Long) *this <= (CORBA::Long) rhs;
+ break;
+ case TAO_ETCL_UNSIGNED:
+ return_value = (CORBA::ULong) *this <= (CORBA::ULong) rhs;
+ break;
+ default:
+ break;
+ }
+
+ return return_value;
+}
+
+bool
+TAO_ETCL_Literal_Constraint::operator> (const TAO_ETCL_Literal_Constraint & rhs)
+{
+ bool return_value = false;
+ TAO_Literal_Type widest_type = this->widest_type (rhs);
+
+ switch (widest_type)
+ {
+ case TAO_ETCL_STRING:
+ return_value = (ACE_OS::strcmp ((const char*) *this, (const char*) rhs) > 0);
+ break;
+ case TAO_ETCL_DOUBLE:
+ return_value = (CORBA::Double) *this > (CORBA::Double) rhs;
+ break;
+ case TAO_ETCL_INTEGER:
+ case TAO_ETCL_SIGNED:
+ return_value = (CORBA::Long) *this > (CORBA::Long) rhs;
+ break;
+ case TAO_ETCL_UNSIGNED:
+ return_value = (CORBA::ULong) *this > (CORBA::ULong) rhs;
+ break;
+ default:
+ break;
+ }
+
+ return return_value;
+}
+
+bool
+TAO_ETCL_Literal_Constraint::operator>= (const TAO_ETCL_Literal_Constraint & rhs)
+{
+ bool return_value = false;
+ TAO_Literal_Type widest_type = this->widest_type (rhs);
+
+ switch (widest_type)
+ {
+ case TAO_ETCL_STRING:
+ return_value =
+ (ACE_OS::strcmp ((const char*) *this, (const char*) rhs) >= 0);
+ break;
+ case TAO_ETCL_DOUBLE:
+ return_value = (CORBA::Double) *this >= (CORBA::Double) rhs;
+ break;
+ case TAO_ETCL_INTEGER:
+ case TAO_ETCL_SIGNED:
+ return_value = (CORBA::Long) *this >= (CORBA::Long) rhs;
+ break;
+ case TAO_ETCL_UNSIGNED:
+ return_value = (CORBA::ULong) *this >= (CORBA::ULong) rhs;
+ break;
+ default:
+ break;
+ }
+
+ return return_value;
+}
+
+TAO_ETCL_Literal_Constraint
+TAO_ETCL_Literal_Constraint::operator+ (const TAO_ETCL_Literal_Constraint & rhs)
+{
+ TAO_Literal_Type widest_type = this->widest_type (rhs);
+
+ switch (widest_type)
+ {
+ case TAO_ETCL_DOUBLE:
+ {
+ CORBA::Double result = (CORBA::Double) *this + (CORBA::Double) rhs;
+ return TAO_ETCL_Literal_Constraint ((CORBA::Double) result);
+ }
+ case TAO_ETCL_INTEGER:
+ case TAO_ETCL_SIGNED:
+ {
+ CORBA::Long result = (CORBA::Long) *this + (CORBA::Long) rhs;
+ return TAO_ETCL_Literal_Constraint ((CORBA::Long) result);
+ }
+ case TAO_ETCL_UNSIGNED:
+ {
+ CORBA::ULong result = (CORBA::ULong) *this + (CORBA::ULong) rhs;
+ return TAO_ETCL_Literal_Constraint ((CORBA::ULong) result);
+ }
+ default:
+ return TAO_ETCL_Literal_Constraint ((CORBA::Long) 0);
+ }
+}
+
+TAO_ETCL_Literal_Constraint
+TAO_ETCL_Literal_Constraint::operator- (const TAO_ETCL_Literal_Constraint & rhs)
+{
+ TAO_Literal_Type widest_type = this->widest_type (rhs);
+
+ switch (widest_type)
+ {
+ case TAO_ETCL_DOUBLE:
+ {
+ CORBA::Double result = (CORBA::Double) *this - (CORBA::Double) rhs;
+ return TAO_ETCL_Literal_Constraint ((CORBA::Double) result);
+ }
+ case TAO_ETCL_INTEGER:
+ case TAO_ETCL_SIGNED:
+ {
+ CORBA::Long result = (CORBA::Long) *this - (CORBA::Long) rhs;
+ return TAO_ETCL_Literal_Constraint ((CORBA::Long) result);
+ }
+ case TAO_ETCL_UNSIGNED:
+ {
+ CORBA::ULong result = (CORBA::ULong) *this - (CORBA::ULong) rhs;
+ return TAO_ETCL_Literal_Constraint ((CORBA::ULong) result);
+ }
+ default:
+ return TAO_ETCL_Literal_Constraint ((CORBA::Long) 0);
+ }
+}
+
+TAO_ETCL_Literal_Constraint
+TAO_ETCL_Literal_Constraint::operator* (const TAO_ETCL_Literal_Constraint & rhs)
+{
+ TAO_Literal_Type widest_type = this->widest_type (rhs);
+
+ switch (widest_type)
+ {
+ case TAO_ETCL_DOUBLE:
+ {
+ CORBA::Double result = (CORBA::Double) *this * (CORBA::Double) rhs;
+ return TAO_ETCL_Literal_Constraint ((CORBA::Double) result);
+ }
+ case TAO_ETCL_INTEGER:
+ case TAO_ETCL_SIGNED:
+ {
+ CORBA::Long result = (CORBA::Long) *this * (CORBA::Long) rhs;
+ return TAO_ETCL_Literal_Constraint ((CORBA::Long) result);
+ }
+ case TAO_ETCL_UNSIGNED:
+ {
+ CORBA::ULong result = (CORBA::ULong) *this * (CORBA::ULong) rhs;
+ return TAO_ETCL_Literal_Constraint ((CORBA::ULong) result);
+ }
+ default:
+ return TAO_ETCL_Literal_Constraint ((CORBA::Long) 0);
+ }
+}
+
+TAO_ETCL_Literal_Constraint
+TAO_ETCL_Literal_Constraint::operator/ (const TAO_ETCL_Literal_Constraint & rhs)
+{
+ TAO_Literal_Type widest_type = this->widest_type (rhs);
+
+ switch (widest_type)
+ {
+ case TAO_ETCL_DOUBLE:
+ {
+ CORBA::Double result = (CORBA::Double) *this / (CORBA::Double) rhs;
+ return TAO_ETCL_Literal_Constraint ((CORBA::Double) result);
+ }
+ case TAO_ETCL_INTEGER:
+ case TAO_ETCL_SIGNED:
+ {
+ CORBA::Long result = (CORBA::Long) *this / (CORBA::Long) rhs;
+ return TAO_ETCL_Literal_Constraint ((CORBA::Long) result);
+ }
+ case TAO_ETCL_UNSIGNED:
+ {
+ CORBA::ULong result = (CORBA::ULong) *this / (CORBA::ULong) rhs;
+ return TAO_ETCL_Literal_Constraint ((CORBA::ULong) result);
+ }
+ default:
+ return TAO_ETCL_Literal_Constraint ((CORBA::Long) 0);
+ }
+}
+
+TAO_ETCL_Literal_Constraint
+TAO_ETCL_Literal_Constraint::operator- (void)
+{
+ switch (this->type_)
+ {
+ case TAO_ETCL_DOUBLE:
+ return TAO_ETCL_Literal_Constraint (- this->op_.double_);
+ case TAO_ETCL_INTEGER:
+ case TAO_ETCL_SIGNED:
+ return TAO_ETCL_Literal_Constraint (- this->op_.integer_);
+ case TAO_ETCL_UNSIGNED:
+ return TAO_ETCL_Literal_Constraint (- (CORBA::Long) this->op_.uinteger_);
+ default:
+ return TAO_ETCL_Literal_Constraint ((CORBA::Long) 0);
+ }
+}
+
+TAO_Literal_Type
+TAO_ETCL_Literal_Constraint::widest_type (
+ const TAO_ETCL_Literal_Constraint & rhs
+ )
+{
+ TAO_Literal_Type rhs_type = rhs.expr_type ();
+ TAO_Literal_Type return_value = rhs_type;
+
+ if (rhs_type == TAO_ETCL_COMPONENT)
+ {
+ CORBA::TypeCode_var tc = rhs.op_.any_->type ();
+ rhs_type = this->comparable_type (tc.in ());
+ }
+ else if (rhs_type != this->type_)
+ {
+ if (rhs_type > this->type_)
+ {
+ return_value = rhs_type;
+ }
+ else
+ {
+ return_value = this->type_;
+ }
+ }
+
+ return return_value;
+}
+
+void
+TAO_ETCL_Literal_Constraint::copy (const TAO_ETCL_Literal_Constraint &lit)
+{
+ this->type_ = lit.type_;
+
+ switch (this->type_)
+ {
+ case TAO_ETCL_STRING:
+ this->op_.str_ = CORBA::string_dup (lit.op_.str_);
+ break;
+ case TAO_ETCL_DOUBLE:
+ this->op_.double_ = lit.op_.double_;
+ break;
+ case TAO_ETCL_UNSIGNED:
+ this->op_.uinteger_ = lit.op_.uinteger_;
+ break;
+ case TAO_ETCL_INTEGER:
+ case TAO_ETCL_SIGNED:
+ this->op_.integer_ = lit.op_.integer_;
+ break;
+ case TAO_ETCL_BOOLEAN:
+ this->op_.bool_ = lit.op_.bool_;
+ break;
+ case TAO_ETCL_COMPONENT:
+ this->op_.any_ = lit.op_.any_;
+ break;
+ default:
+ this->type_ = TAO_UNKNOWN;
+ break;
+ }
+}
+
+// ****************************************************************
+
+int
+TAO_ETCL_Identifier::accept (TAO_ETCL_Constraint_Visitor *visitor)
+{
+ return visitor->visit_identifier (this);
+}
+
+// ****************************************************************
+
+TAO_ETCL_Union_Value::~TAO_ETCL_Union_Value (void)
+{
+ delete this->string_;
+ delete this->integer_;
+}
+
+int
+TAO_ETCL_Union_Value::accept (TAO_ETCL_Constraint_Visitor *visitor)
+{
+ return visitor->visit_union_value (this);
+}
+
+// ****************************************************************
+
+TAO_ETCL_Union_Pos::~TAO_ETCL_Union_Pos (void)
+{
+ delete this->component_;
+ delete this->union_value_;
+}
+
+int
+TAO_ETCL_Union_Pos::accept (TAO_ETCL_Constraint_Visitor *visitor)
+{
+ return visitor->visit_union_pos (this);
+}
+
+// ****************************************************************
+
+TAO_ETCL_Component_Pos::~TAO_ETCL_Component_Pos (void)
+{
+ delete this->component_;
+ delete this->integer_;
+}
+
+int
+TAO_ETCL_Component_Pos::accept (TAO_ETCL_Constraint_Visitor *visitor)
+{
+ return visitor->visit_component_pos (this);
+}
+
+// ****************************************************************
+
+TAO_ETCL_Component_Assoc::~TAO_ETCL_Component_Assoc (void)
+{
+ delete this->component_;
+ delete this->identifier_;
+}
+
+int
+TAO_ETCL_Component_Assoc::accept (TAO_ETCL_Constraint_Visitor *visitor)
+{
+ return visitor->visit_component_assoc (this);
+}
+
+// ****************************************************************
+
+TAO_ETCL_Component_Array::~TAO_ETCL_Component_Array (void)
+{
+ delete this->component_;
+ delete this->integer_;
+}
+
+int
+TAO_ETCL_Component_Array::accept (TAO_ETCL_Constraint_Visitor *visitor)
+{
+ return visitor->visit_component_array (this);
+}
+
+// ****************************************************************
+
+TAO_ETCL_Special::~TAO_ETCL_Special (void)
+{
+}
+
+int
+TAO_ETCL_Special::accept (TAO_ETCL_Constraint_Visitor *visitor)
+{
+ return visitor->visit_special (this);
+}
+
+// ****************************************************************
+
+TAO_ETCL_Component::~TAO_ETCL_Component (void)
+{
+ delete this->component_;
+ delete this->identifier_;
+}
+
+int
+TAO_ETCL_Component::accept (TAO_ETCL_Constraint_Visitor *visitor)
+{
+ return visitor->visit_component (this);
+}
+
+// ****************************************************************
+
+TAO_ETCL_Dot::~TAO_ETCL_Dot (void)
+{
+ delete this->component_;
+}
+
+int
+TAO_ETCL_Dot::accept (TAO_ETCL_Constraint_Visitor *visitor)
+{
+ return visitor->visit_dot (this);
+}
+
+// ****************************************************************
+
+TAO_ETCL_Eval::~TAO_ETCL_Eval (void)
+{
+ delete this->component_;
+}
+
+int
+TAO_ETCL_Eval::accept (TAO_ETCL_Constraint_Visitor *visitor)
+{
+ return visitor->visit_eval (this);
+}
+
+// ****************************************************************
+
+TAO_ETCL_Default::~TAO_ETCL_Default (void)
+{
+ delete this->component_;
+}
+
+int
+TAO_ETCL_Default::accept (TAO_ETCL_Constraint_Visitor *visitor)
+{
+ return visitor->visit_default (this);
+}
+
+// ****************************************************************
+
+TAO_ETCL_Exist::~TAO_ETCL_Exist (void)
+{
+ delete this->component_;
+}
+
+int
+TAO_ETCL_Exist::accept (TAO_ETCL_Constraint_Visitor *visitor)
+{
+ return visitor->visit_exist (this);
+}
+
+// ****************************************************************
+
+TAO_ETCL_Unary_Expr::~TAO_ETCL_Unary_Expr (void)
+{
+ delete this->subexpr_;
+}
+
+int
+TAO_ETCL_Unary_Expr::accept (TAO_ETCL_Constraint_Visitor *visitor)
+{
+ return visitor->visit_unary_expr (this);
+}
+
+// ****************************************************************
+
+TAO_ETCL_Binary_Expr::~TAO_ETCL_Binary_Expr (void)
+{
+ delete this->lhs_;
+ delete this->rhs_;
+}
+
+int
+TAO_ETCL_Binary_Expr::accept (TAO_ETCL_Constraint_Visitor *visitor)
+{
+ return visitor->visit_binary_expr (this);
+}
+
+// ****************************************************************
+
+TAO_ETCL_Preference::~TAO_ETCL_Preference (void)
+{
+ delete this->subexpr_;
+}
+
+int
+TAO_ETCL_Preference::accept (TAO_ETCL_Constraint_Visitor *visitor)
+{
+ return visitor->visit_preference (this);
+}
+
+// ****************************************************************
+
+TAO_ETCL_Constraint_Visitor::~TAO_ETCL_Constraint_Visitor (void)
+{
+}
+
+TAO_END_VERSIONED_NAMESPACE_DECL
diff --git a/TAO/orbsvcs/orbsvcs/ETCL/ETCL_Constraint.h b/TAO/orbsvcs/orbsvcs/ETCL/ETCL_Constraint.h
new file mode 100644
index 00000000000..688b2df872c
--- /dev/null
+++ b/TAO/orbsvcs/orbsvcs/ETCL/ETCL_Constraint.h
@@ -0,0 +1,430 @@
+// -*- C++ -*-
+
+// $Id$
+//
+// ============================================================================
+//
+// = LIBRARY
+// orbsvcs/ETCL
+//
+// = FILENAME
+// ECTL_Constraint
+//
+// = AUTHOR
+// Carlos O'Ryan (coryan@cs.wustl.edu)
+// Jeff Parsons (parsons@cs.wustl.edu)
+//
+// ============================================================================
+
+#ifndef TAO_ETCL_CONSTRAINT_H
+#define TAO_ETCL_CONSTRAINT_H
+
+#include "orbsvcs/ETCL/etcl_export.h"
+
+#if !defined (ACE_LACKS_PRAGMA_ONCE)
+# pragma once
+#endif /* ACE_LACKS_PRAGMA_ONCE */
+
+#include "ace/SString.h"
+
+#include "tao/Basic_Types.h"
+
+TAO_BEGIN_VERSIONED_NAMESPACE_DECL
+
+typedef unsigned short TAO_Literal_Type;
+#define TAO_UNKNOWN 999
+
+class TAO_ETCL_Constraint_Visitor;
+
+namespace CORBA
+{
+ class Any;
+ typedef Any *Any_ptr;
+}
+
+class TAO_ETCL_Export TAO_ETCL_Constraint
+{
+public:
+ TAO_ETCL_Constraint (void);
+ virtual ~TAO_ETCL_Constraint (void);
+ // Constructor and destructor
+
+ virtual int accept (TAO_ETCL_Constraint_Visitor *visitor) = 0;
+};
+
+// ****************************************************************
+
+class TAO_ETCL_Export TAO_ETCL_Literal_Constraint
+ : public TAO_ETCL_Constraint
+{
+public:
+ TAO_ETCL_Literal_Constraint (void);
+
+ // = Constructors for each of the various types of literals.
+
+ explicit TAO_ETCL_Literal_Constraint (CORBA::Any* any);
+ explicit TAO_ETCL_Literal_Constraint (CORBA::ULong uinteger);
+ explicit TAO_ETCL_Literal_Constraint (CORBA::Long integer);
+ explicit TAO_ETCL_Literal_Constraint (CORBA::Boolean boolean);
+ explicit TAO_ETCL_Literal_Constraint (CORBA::Double doub);
+ explicit TAO_ETCL_Literal_Constraint (const char* str);
+
+ TAO_ETCL_Literal_Constraint (const TAO_ETCL_Literal_Constraint& lit);
+ // Copy constructor
+
+ ~TAO_ETCL_Literal_Constraint(void);
+ // Destructor.
+
+ int accept (TAO_ETCL_Constraint_Visitor* visitor);
+ // Visitor accept method.
+
+ TAO_Literal_Type expr_type (void) const;
+
+ void operator= (const TAO_ETCL_Literal_Constraint& co);
+ // Assignment operator.
+
+ // Conversion routines.
+ operator CORBA::Boolean (void) const;
+ operator CORBA::ULong (void) const;
+ operator CORBA::Long (void) const;
+ operator CORBA::Double (void) const;
+ operator const char* (void) const;
+ operator const CORBA::Any* (void) const;
+
+ // Return the type represented by this MysteryOperand.
+
+ // = Boolean operators.
+
+ bool
+ operator< (const TAO_ETCL_Literal_Constraint& rhs);
+
+ bool
+ operator<= (const TAO_ETCL_Literal_Constraint& rhs);
+
+ bool
+ operator> (const TAO_ETCL_Literal_Constraint& rhs);
+
+ bool
+ operator>= (const TAO_ETCL_Literal_Constraint& rhs);
+
+ bool
+ operator== (const TAO_ETCL_Literal_Constraint& rhs);
+
+ bool
+ operator!= (const TAO_ETCL_Literal_Constraint& rhs);
+
+ // = Arithmetic operators.
+
+ TAO_ETCL_Literal_Constraint
+ operator+ (const TAO_ETCL_Literal_Constraint& rhs);
+
+ TAO_ETCL_Literal_Constraint
+ operator- (const TAO_ETCL_Literal_Constraint& rhs);
+
+ TAO_ETCL_Literal_Constraint
+ operator* (const TAO_ETCL_Literal_Constraint& rhs);
+
+ TAO_ETCL_Literal_Constraint
+ operator/ (const TAO_ETCL_Literal_Constraint& rhs);
+
+ // Unary minus.
+ TAO_ETCL_Literal_Constraint
+ operator- (void);
+
+ TAO_Literal_Type
+ widest_type (const TAO_ETCL_Literal_Constraint& rhs);
+ // Ensure both operands are of the same simple numeric type.
+
+ static TAO_Literal_Type
+ comparable_type (CORBA::TypeCode_ptr type);
+ // Determine the comparable Expression Type from the CORBA type
+
+private:
+ void copy (const TAO_ETCL_Literal_Constraint& co);
+ // Private copy method.
+
+ union
+ {
+ char* str_;
+ CORBA::Any_ptr any_;
+ CORBA::ULong uinteger_;
+ CORBA::Long integer_;
+ CORBA::Boolean bool_;
+ CORBA::Double double_;
+ } op_;
+ // Union of the possible literal types.
+
+ unsigned short type_;
+ // The actual types of the TAO_ETCL_Literal_Constraint.
+};
+
+// ****************************************************************
+
+class TAO_ETCL_Export TAO_ETCL_Identifier : public TAO_ETCL_Constraint
+{
+public:
+ TAO_ETCL_Identifier (const char *value);
+
+ const char *value (void) const;
+ // Get the value
+
+ // = The Constraint methods.
+ int accept (TAO_ETCL_Constraint_Visitor *visitor);
+
+private:
+ ACE_CString string_;
+ // The value
+};
+
+// ****************************************************************
+
+class TAO_ETCL_Export TAO_ETCL_Union_Value : public TAO_ETCL_Constraint
+{
+public:
+ TAO_ETCL_Union_Value (int sign,
+ TAO_ETCL_Constraint *integer);
+ TAO_ETCL_Union_Value (TAO_ETCL_Constraint *string);
+ virtual ~TAO_ETCL_Union_Value (void);
+
+ int sign (void) const;
+ TAO_ETCL_Literal_Constraint *integer (void) const;
+ TAO_ETCL_Literal_Constraint *string (void) const;
+
+ // = The Constraint methods.
+ int accept (TAO_ETCL_Constraint_Visitor *visitor);
+
+private:
+ int sign_;
+ TAO_ETCL_Literal_Constraint *integer_;
+ TAO_ETCL_Literal_Constraint *string_;
+};
+
+class TAO_ETCL_Export TAO_ETCL_Union_Pos : public TAO_ETCL_Constraint
+{
+public:
+ TAO_ETCL_Union_Pos (TAO_ETCL_Constraint *union_value,
+ TAO_ETCL_Constraint *component);
+ virtual ~TAO_ETCL_Union_Pos (void);
+
+ TAO_ETCL_Union_Value *union_value (void) const;
+ TAO_ETCL_Constraint *component (void) const;
+
+ // = The Constraint methods.
+ int accept (TAO_ETCL_Constraint_Visitor *visitor);
+
+private:
+ TAO_ETCL_Union_Value *union_value_;
+ TAO_ETCL_Constraint *component_;
+};
+
+class TAO_ETCL_Export TAO_ETCL_Component_Pos : public TAO_ETCL_Constraint
+{
+public:
+ TAO_ETCL_Component_Pos (TAO_ETCL_Constraint *integer,
+ TAO_ETCL_Constraint *component);
+ virtual ~TAO_ETCL_Component_Pos (void);
+
+ TAO_ETCL_Literal_Constraint *integer (void) const;
+ TAO_ETCL_Constraint *component (void) const;
+
+ // = The Constraint methods.
+ int accept (TAO_ETCL_Constraint_Visitor *visitor);
+
+private:
+ TAO_ETCL_Literal_Constraint *integer_;
+ TAO_ETCL_Constraint *component_;
+};
+
+class TAO_ETCL_Export TAO_ETCL_Component_Assoc : public TAO_ETCL_Constraint
+{
+public:
+ TAO_ETCL_Component_Assoc (TAO_ETCL_Constraint *identifier,
+ TAO_ETCL_Constraint *component);
+ virtual ~TAO_ETCL_Component_Assoc (void);
+
+ TAO_ETCL_Identifier *identifier (void) const;
+ TAO_ETCL_Constraint *component (void) const;
+
+ // = The Constraint methods.
+ int accept (TAO_ETCL_Constraint_Visitor *visitor);
+
+private:
+ TAO_ETCL_Identifier *identifier_;
+ TAO_ETCL_Constraint *component_;
+};
+
+class TAO_ETCL_Export TAO_ETCL_Component_Array : public TAO_ETCL_Constraint
+{
+public:
+ TAO_ETCL_Component_Array (TAO_ETCL_Constraint *integer,
+ TAO_ETCL_Constraint *component);
+ virtual ~TAO_ETCL_Component_Array (void);
+
+ TAO_ETCL_Literal_Constraint *integer (void) const;
+ TAO_ETCL_Constraint *component (void) const;
+
+ // = The Constraint methods.
+ int accept (TAO_ETCL_Constraint_Visitor *visitor);
+
+private:
+ TAO_ETCL_Literal_Constraint *integer_;
+ TAO_ETCL_Constraint *component_;
+};
+
+class TAO_ETCL_Export TAO_ETCL_Special : public TAO_ETCL_Constraint
+{
+public:
+ TAO_ETCL_Special (int type);
+ virtual ~TAO_ETCL_Special (void);
+
+ int type (void) const;
+
+ // = The Constraint methods.
+ int accept (TAO_ETCL_Constraint_Visitor *visitor);
+
+private:
+ int type_;
+};
+
+class TAO_ETCL_Export TAO_ETCL_Component : public TAO_ETCL_Constraint
+{
+public:
+ TAO_ETCL_Component (TAO_ETCL_Constraint *identifier,
+ TAO_ETCL_Constraint *component);
+ virtual ~TAO_ETCL_Component (void);
+
+ TAO_ETCL_Identifier *identifier (void) const;
+ TAO_ETCL_Constraint *component (void) const;
+
+ // = The Constraint methods.
+ int accept (TAO_ETCL_Constraint_Visitor *visitor);
+
+private:
+ TAO_ETCL_Identifier *identifier_;
+ TAO_ETCL_Constraint *component_;
+};
+
+class TAO_ETCL_Export TAO_ETCL_Dot : public TAO_ETCL_Constraint
+{
+public:
+ TAO_ETCL_Dot (TAO_ETCL_Constraint *component);
+ virtual ~TAO_ETCL_Dot (void);
+
+ TAO_ETCL_Constraint *component (void) const;
+
+ // = The Constraint methods.
+ int accept (TAO_ETCL_Constraint_Visitor *visitor);
+
+private:
+ TAO_ETCL_Constraint *component_;
+};
+
+class TAO_ETCL_Export TAO_ETCL_Eval : public TAO_ETCL_Constraint
+{
+public:
+ TAO_ETCL_Eval (TAO_ETCL_Constraint *component);
+ virtual ~TAO_ETCL_Eval (void);
+
+ TAO_ETCL_Constraint *component (void) const;
+
+ // = The Constraint methods.
+ int accept (TAO_ETCL_Constraint_Visitor *visitor);
+
+private:
+ TAO_ETCL_Constraint *component_;
+};
+
+class TAO_ETCL_Export TAO_ETCL_Default : public TAO_ETCL_Constraint
+{
+public:
+ TAO_ETCL_Default (TAO_ETCL_Constraint *component);
+ virtual ~TAO_ETCL_Default (void);
+
+ TAO_ETCL_Constraint *component (void) const;
+
+ // = The Constraint methods.
+ int accept (TAO_ETCL_Constraint_Visitor *visitor);
+
+private:
+ TAO_ETCL_Constraint *component_;
+};
+
+class TAO_ETCL_Export TAO_ETCL_Exist : public TAO_ETCL_Constraint
+{
+public:
+ TAO_ETCL_Exist (TAO_ETCL_Constraint *component);
+ virtual ~TAO_ETCL_Exist (void);
+
+ TAO_ETCL_Constraint *component (void) const;
+
+ // = The Constraint methods.
+ int accept (TAO_ETCL_Constraint_Visitor *visitor);
+
+private:
+ TAO_ETCL_Constraint *component_;
+};
+
+class TAO_ETCL_Export TAO_ETCL_Unary_Expr : public TAO_ETCL_Constraint
+{
+public:
+ TAO_ETCL_Unary_Expr (int type,
+ TAO_ETCL_Constraint *subexpr);
+ virtual ~TAO_ETCL_Unary_Expr (void);
+
+ int type (void) const;
+ TAO_ETCL_Constraint *subexpr (void) const;
+
+ // = The Constraint methods.
+ int accept (TAO_ETCL_Constraint_Visitor *visitor);
+
+private:
+ int type_;
+ TAO_ETCL_Constraint *subexpr_;
+};
+
+class TAO_ETCL_Export TAO_ETCL_Binary_Expr : public TAO_ETCL_Constraint
+{
+public:
+ TAO_ETCL_Binary_Expr (int type,
+ TAO_ETCL_Constraint *lhs,
+ TAO_ETCL_Constraint *rhs);
+ virtual ~TAO_ETCL_Binary_Expr (void);
+
+ int type (void) const;
+ TAO_ETCL_Constraint *rhs (void) const;
+ TAO_ETCL_Constraint *lhs (void) const;
+
+ // = The Constraint methods.
+ int accept (TAO_ETCL_Constraint_Visitor *visitor);
+
+private:
+ int type_;
+ TAO_ETCL_Constraint *lhs_;
+ TAO_ETCL_Constraint *rhs_;
+};
+
+class TAO_ETCL_Export TAO_ETCL_Preference : public TAO_ETCL_Constraint
+{
+public:
+ TAO_ETCL_Preference (int type,
+ TAO_ETCL_Constraint *subexpr = 0);
+ virtual ~TAO_ETCL_Preference (void);
+
+ int type (void) const;
+ TAO_ETCL_Constraint *subexpr (void) const;
+
+ // = The Constraint methods.
+ int accept (TAO_ETCL_Constraint_Visitor *visitor);
+
+private:
+ int type_;
+ TAO_ETCL_Constraint *subexpr_;
+};
+
+TAO_END_VERSIONED_NAMESPACE_DECL
+
+#if defined (__ACE_INLINE__)
+#include "orbsvcs/ETCL/ETCL_Constraint.inl"
+#endif /* __ACE_INLINE__ */
+
+#endif /* TAO_ETCL_CONSTRAINT_H */
diff --git a/TAO/orbsvcs/orbsvcs/ETCL/ETCL_Constraint.inl b/TAO/orbsvcs/orbsvcs/ETCL/ETCL_Constraint.inl
new file mode 100644
index 00000000000..d6414ef5131
--- /dev/null
+++ b/TAO/orbsvcs/orbsvcs/ETCL/ETCL_Constraint.inl
@@ -0,0 +1,330 @@
+// -*- C++ -*-
+// $Id$
+
+// ****************************************************************
+
+ACE_INLINE
+TAO_ETCL_Literal_Constraint::TAO_ETCL_Literal_Constraint (void)
+ : type_ (TAO_UNKNOWN)
+{
+}
+
+// ****************************************************************
+
+ACE_INLINE
+TAO_ETCL_Identifier::TAO_ETCL_Identifier (const char *value)
+ : string_ (value)
+{
+}
+
+ACE_INLINE const char *
+TAO_ETCL_Identifier::value (void) const
+{
+ return this->string_.c_str ();
+}
+
+
+// ****************************************************************
+
+ACE_INLINE
+TAO_ETCL_Union_Value::TAO_ETCL_Union_Value (int sign,
+ TAO_ETCL_Constraint *integer)
+ : sign_ (sign),
+ string_ (0)
+{
+ this->integer_ =
+ dynamic_cast<TAO_ETCL_Literal_Constraint*> (integer);
+}
+
+ACE_INLINE
+TAO_ETCL_Union_Value::TAO_ETCL_Union_Value (TAO_ETCL_Constraint *string)
+ : sign_ (0),
+ integer_ (0)
+{
+ this->string_ =
+ dynamic_cast<TAO_ETCL_Literal_Constraint*> (string);
+}
+
+ACE_INLINE int
+TAO_ETCL_Union_Value::sign (void) const
+{
+ return this->sign_;
+}
+
+ACE_INLINE TAO_ETCL_Literal_Constraint *
+TAO_ETCL_Union_Value::integer (void) const
+{
+ return this->integer_;
+}
+
+ACE_INLINE TAO_ETCL_Literal_Constraint *
+TAO_ETCL_Union_Value::string (void) const
+{
+ return this->string_;
+}
+
+
+// ****************************************************************
+
+ACE_INLINE
+TAO_ETCL_Union_Pos::TAO_ETCL_Union_Pos (TAO_ETCL_Constraint *union_value,
+ TAO_ETCL_Constraint *component)
+ : component_ (component)
+{
+ this->union_value_ =
+ dynamic_cast<TAO_ETCL_Union_Value*> (union_value);
+}
+
+ACE_INLINE TAO_ETCL_Union_Value *
+TAO_ETCL_Union_Pos::union_value (void) const
+{
+ return this->union_value_;
+}
+
+ACE_INLINE TAO_ETCL_Constraint *
+TAO_ETCL_Union_Pos::component (void) const
+{
+ return this->component_;
+}
+
+// ****************************************************************
+
+ACE_INLINE
+TAO_ETCL_Component_Pos::TAO_ETCL_Component_Pos (
+ TAO_ETCL_Constraint *integer,
+ TAO_ETCL_Constraint *component
+ )
+ : component_ (component)
+{
+ this->integer_ =
+ dynamic_cast<TAO_ETCL_Literal_Constraint*> (integer);
+}
+
+ACE_INLINE TAO_ETCL_Literal_Constraint *
+TAO_ETCL_Component_Pos::integer (void) const
+{
+ return this->integer_;
+}
+
+ACE_INLINE TAO_ETCL_Constraint *
+TAO_ETCL_Component_Pos::component (void) const
+{
+ return this->component_;
+}
+
+// ****************************************************************
+
+ACE_INLINE
+TAO_ETCL_Component_Assoc::TAO_ETCL_Component_Assoc (
+ TAO_ETCL_Constraint *identifier,
+ TAO_ETCL_Constraint *component
+ )
+ : component_ (component)
+{
+ this->identifier_ =
+ dynamic_cast<TAO_ETCL_Identifier*> (identifier);
+}
+
+ACE_INLINE TAO_ETCL_Identifier *
+TAO_ETCL_Component_Assoc::identifier (void) const
+{
+ return this->identifier_;
+}
+
+ACE_INLINE TAO_ETCL_Constraint *
+TAO_ETCL_Component_Assoc::component (void) const
+{
+ return this->component_;
+}
+
+// ****************************************************************
+
+ACE_INLINE
+TAO_ETCL_Component_Array::TAO_ETCL_Component_Array (
+ TAO_ETCL_Constraint *integer,
+ TAO_ETCL_Constraint *component
+ )
+ : component_ (component)
+{
+ this->integer_ =
+ dynamic_cast<TAO_ETCL_Literal_Constraint*> (integer);
+}
+
+ACE_INLINE TAO_ETCL_Literal_Constraint *
+TAO_ETCL_Component_Array::integer (void) const
+{
+ return this->integer_;
+}
+
+ACE_INLINE TAO_ETCL_Constraint *
+TAO_ETCL_Component_Array::component (void) const
+{
+ return this->component_;
+}
+
+// ****************************************************************
+
+ACE_INLINE
+TAO_ETCL_Special::TAO_ETCL_Special (int type)
+ : type_ (type)
+{
+}
+
+ACE_INLINE int
+TAO_ETCL_Special::type (void) const
+{
+ return this->type_;
+}
+
+// ****************************************************************
+
+ACE_INLINE
+TAO_ETCL_Component::TAO_ETCL_Component (TAO_ETCL_Constraint *identifier,
+ TAO_ETCL_Constraint *component)
+ : component_ (component)
+{
+ this->identifier_ =
+ dynamic_cast<TAO_ETCL_Identifier*> (identifier);
+}
+
+ACE_INLINE TAO_ETCL_Identifier *
+TAO_ETCL_Component::identifier (void) const
+{
+ return this->identifier_;
+}
+
+ACE_INLINE TAO_ETCL_Constraint *
+TAO_ETCL_Component::component (void) const
+{
+ return this->component_;
+}
+
+// ****************************************************************
+
+ACE_INLINE
+TAO_ETCL_Dot::TAO_ETCL_Dot (TAO_ETCL_Constraint *component)
+ : component_ (component)
+{
+}
+
+ACE_INLINE TAO_ETCL_Constraint *
+TAO_ETCL_Dot::component (void) const
+{
+ return this->component_;
+}
+
+// ****************************************************************
+
+ACE_INLINE
+TAO_ETCL_Eval::TAO_ETCL_Eval (TAO_ETCL_Constraint *component)
+ : component_ (component)
+{
+}
+
+ACE_INLINE TAO_ETCL_Constraint *
+TAO_ETCL_Eval::component (void) const
+{
+ return this->component_;
+}
+
+// ****************************************************************
+
+ACE_INLINE
+TAO_ETCL_Default::TAO_ETCL_Default (TAO_ETCL_Constraint *component)
+ : component_ (component)
+{
+}
+
+ACE_INLINE TAO_ETCL_Constraint *
+TAO_ETCL_Default::component (void) const
+{
+ return this->component_;
+}
+
+// ****************************************************************
+
+ACE_INLINE
+TAO_ETCL_Exist::TAO_ETCL_Exist (TAO_ETCL_Constraint *component)
+ : component_ (component)
+{
+}
+
+ACE_INLINE TAO_ETCL_Constraint *
+TAO_ETCL_Exist::component (void) const
+{
+ return this->component_;
+}
+
+// ****************************************************************
+
+ACE_INLINE
+TAO_ETCL_Unary_Expr::TAO_ETCL_Unary_Expr (int type,
+ TAO_ETCL_Constraint *subexpr)
+ : type_ (type),
+ subexpr_ (subexpr)
+{
+}
+
+ACE_INLINE int
+TAO_ETCL_Unary_Expr::type (void) const
+{
+ return this->type_;
+}
+
+ACE_INLINE TAO_ETCL_Constraint *
+TAO_ETCL_Unary_Expr::subexpr (void) const
+{
+ return this->subexpr_;
+}
+
+// ****************************************************************
+
+ACE_INLINE
+TAO_ETCL_Binary_Expr::TAO_ETCL_Binary_Expr (int type,
+ TAO_ETCL_Constraint *lhs,
+ TAO_ETCL_Constraint *rhs)
+ : type_ (type),
+ lhs_ (lhs),
+ rhs_ (rhs)
+{
+}
+
+ACE_INLINE int
+TAO_ETCL_Binary_Expr::type (void) const
+{
+ return this->type_;
+}
+
+ACE_INLINE TAO_ETCL_Constraint *
+TAO_ETCL_Binary_Expr::rhs (void) const
+{
+ return this->rhs_;
+}
+
+ACE_INLINE TAO_ETCL_Constraint *
+TAO_ETCL_Binary_Expr::lhs (void) const
+{
+ return this->lhs_;
+}
+
+// ****************************************************************
+
+ACE_INLINE
+TAO_ETCL_Preference::TAO_ETCL_Preference (int type,
+ TAO_ETCL_Constraint *subexpr)
+ : type_ (type),
+ subexpr_ (subexpr)
+{
+}
+
+ACE_INLINE int
+TAO_ETCL_Preference::type (void) const
+{
+ return this->type_;
+}
+
+ACE_INLINE TAO_ETCL_Constraint *
+TAO_ETCL_Preference::subexpr (void) const
+{
+ return this->subexpr_;
+}
diff --git a/TAO/orbsvcs/orbsvcs/ETCL/ETCL_Constraint_Visitor.h b/TAO/orbsvcs/orbsvcs/ETCL/ETCL_Constraint_Visitor.h
new file mode 100644
index 00000000000..0f23f7a02c0
--- /dev/null
+++ b/TAO/orbsvcs/orbsvcs/ETCL/ETCL_Constraint_Visitor.h
@@ -0,0 +1,70 @@
+// -*- C++ -*-
+//=============================================================================
+/**
+ * @file ETCL_Constraint_Visitor.h
+ *
+ * $Id$
+ *
+ * @author Carlos O'Ryan <coryan@cs.wustl.edu>
+ * @author Jeff Parsons <parsons@cs.wustl.edu>
+ */
+//=============================================================================
+
+
+#ifndef TAO_ETCL_CONSTRAINT_VISITOR_H
+#define TAO_ETCL_CONSTRAINT_VISITOR_H
+
+#include "orbsvcs/ETCL/etcl_export.h"
+
+#if !defined (ACE_LACKS_PRAGMA_ONCE)
+# pragma once
+#endif /* ACE_LACKS_PRAGMA_ONCE */
+
+#include "tao/Versioned_Namespace.h"
+
+TAO_BEGIN_VERSIONED_NAMESPACE_DECL
+
+class TAO_ETCL_Literal_Constraint;
+class TAO_ETCL_Identifier;
+class TAO_ETCL_Union_Value;
+class TAO_ETCL_Union_Pos;
+class TAO_ETCL_Component_Pos;
+class TAO_ETCL_Component_Assoc;
+class TAO_ETCL_Component_Array;
+class TAO_ETCL_Special;
+class TAO_ETCL_Component;
+class TAO_ETCL_Dot;
+class TAO_ETCL_Eval;
+class TAO_ETCL_Default;
+class TAO_ETCL_Exist;
+class TAO_ETCL_Unary_Expr;
+class TAO_ETCL_Binary_Expr;
+class TAO_ETCL_Preference;
+
+class TAO_ETCL_Export TAO_ETCL_Constraint_Visitor
+{
+public:
+ /// Destructor
+ virtual ~TAO_ETCL_Constraint_Visitor (void);
+
+ virtual int visit_literal (TAO_ETCL_Literal_Constraint *) = 0;
+ virtual int visit_identifier (TAO_ETCL_Identifier *) = 0;
+ virtual int visit_union_value (TAO_ETCL_Union_Value *) = 0;
+ virtual int visit_union_pos (TAO_ETCL_Union_Pos *) = 0;
+ virtual int visit_component_pos (TAO_ETCL_Component_Pos *) = 0;
+ virtual int visit_component_assoc (TAO_ETCL_Component_Assoc *) = 0;
+ virtual int visit_component_array (TAO_ETCL_Component_Array *) = 0;
+ virtual int visit_special (TAO_ETCL_Special *) = 0;
+ virtual int visit_component (TAO_ETCL_Component *) = 0;
+ virtual int visit_dot (TAO_ETCL_Dot *) = 0;
+ virtual int visit_eval (TAO_ETCL_Eval *) = 0;
+ virtual int visit_default (TAO_ETCL_Default *) = 0;
+ virtual int visit_exist (TAO_ETCL_Exist *) = 0;
+ virtual int visit_unary_expr (TAO_ETCL_Unary_Expr *) = 0;
+ virtual int visit_binary_expr (TAO_ETCL_Binary_Expr *) = 0;
+ virtual int visit_preference (TAO_ETCL_Preference *) = 0;
+};
+
+TAO_END_VERSIONED_NAMESPACE_DECL
+
+#endif /* TAO_ETCL_CONSTRAINT_VISITOR_H */
diff --git a/TAO/orbsvcs/orbsvcs/ETCL/ETCL_Interpreter.cpp b/TAO/orbsvcs/orbsvcs/ETCL/ETCL_Interpreter.cpp
new file mode 100644
index 00000000000..2f083900155
--- /dev/null
+++ b/TAO/orbsvcs/orbsvcs/ETCL/ETCL_Interpreter.cpp
@@ -0,0 +1,112 @@
+// -*- C++ -*-
+// $Id$
+
+#include "orbsvcs/ETCL/ETCL_Interpreter.h"
+#include "orbsvcs/ETCL/ETCL_Constraint.h"
+#include "ace/Guard_T.h"
+#include "ace/Thread_Mutex.h"
+
+ACE_RCSID(ETCL, ETCL_Interpreter, "$Id$")
+
+
+TAO_BEGIN_VERSIONED_NAMESPACE_DECL
+
+TAO_SYNCH_MUTEX TAO_ETCL_Interpreter::parserMutex__;
+
+TAO_ETCL_Interpreter::TAO_ETCL_Interpreter (void)
+ : root_ (0)
+{
+}
+
+TAO_ETCL_Interpreter::~TAO_ETCL_Interpreter (void)
+{
+ delete this->root_;
+}
+
+int
+TAO_ETCL_Interpreter::build_tree (const char* constraints)
+{
+ ACE_GUARD_RETURN (TAO_SYNCH_MUTEX,
+ guard,
+ TAO_ETCL_Interpreter::parserMutex__,
+ -1);
+
+ TAO_Lex_String_Input::reset ((char*)constraints);
+
+ yyval.constraint = 0;
+ int return_value = ::yyparse ();
+
+ if (return_value == 0 && yyval.constraint != 0)
+ {
+ this->root_ = yyval.constraint;
+ }
+ else
+ {
+ this->root_ = 0;
+ }
+
+ return return_value;
+}
+
+int
+TAO_ETCL_Interpreter::is_empty_string (const char* str)
+{
+ int return_value = 0;
+
+ if (str != 0)
+ {
+ int i = 0;
+
+ while (str[i] != '\0')
+ {
+ if (str[i] != ' ')
+ {
+ break;
+ }
+
+ i++;
+ }
+
+ if (str[i] == '\0')
+ {
+ return_value = 1;
+ }
+ }
+
+ return return_value;
+}
+
+char* TAO_Lex_String_Input::string_ = 0;
+char* TAO_Lex_String_Input::current_ = 0;
+char* TAO_Lex_String_Input::end_ = 0;
+
+// Routine to have Lex read its input from the constraint string.
+
+int
+TAO_Lex_String_Input::copy_into (char* buf,
+ int max_size)
+{
+ int chars_left = TAO_Lex_String_Input::end_ - TAO_Lex_String_Input::current_;
+ int n = max_size > chars_left ? chars_left : max_size;
+
+ if (n > 0)
+ {
+ ACE_OS:: memcpy (buf,
+ TAO_Lex_String_Input::current_,
+ n);
+ TAO_Lex_String_Input::current_ += n;
+ }
+
+ return n;
+}
+
+void
+TAO_Lex_String_Input::reset (char* input_string)
+{
+ TAO_Lex_String_Input::string_ = input_string;
+ TAO_Lex_String_Input::current_ = input_string;
+ TAO_Lex_String_Input::end_ =
+ input_string + ACE_OS::strlen (TAO_Lex_String_Input::string_);
+}
+
+TAO_END_VERSIONED_NAMESPACE_DECL
diff --git a/TAO/orbsvcs/orbsvcs/ETCL/ETCL_Interpreter.h b/TAO/orbsvcs/orbsvcs/ETCL/ETCL_Interpreter.h
new file mode 100644
index 00000000000..81210143c38
--- /dev/null
+++ b/TAO/orbsvcs/orbsvcs/ETCL/ETCL_Interpreter.h
@@ -0,0 +1,110 @@
+// -*- C++ -*-
+
+//=============================================================================
+/**
+ * @file ETCL_Interpreter.h
+ *
+ * $Id$
+ *
+ * @author Jeff Parsons <parsons@cs.wustl.edu> based on previous work by
+ * @author Seth Widoff <sbw1@cs.wustl.edu>
+ */
+//=============================================================================
+
+
+#ifndef TAO_ETCL_INTERPRETER_H
+#define TAO_ETCL_INTERPRETER_H
+#include /**/ "ace/pre.h"
+
+#include "orbsvcs/ETCL/etcl_export.h"
+
+#if !defined (ACE_LACKS_PRAGMA_ONCE)
+# pragma once
+#endif /* ACE_LACKS_PRAGMA_ONCE */
+
+#include "tao/orbconf.h"
+#include "ace/Thread_Mutex.h"
+
+TAO_BEGIN_VERSIONED_NAMESPACE_DECL
+
+class TAO_ETCL_Constraint;
+
+/**
+ * @class TAO_ETCL_Interpreter
+ *
+ * @brief TAO_ETCL_Interpreter is the superclass for all ETCL interpreters.
+ * Its build tree method invokes the yacc parser to parse a constraint
+ * or preference string.
+ */
+class TAO_ETCL_Export TAO_ETCL_Interpreter
+{
+protected:
+ // = Initialization and termination methods.
+ /// Constructor.
+ TAO_ETCL_Interpreter (void);
+
+ /// Destructor.
+ ~TAO_ETCL_Interpreter (void);
+
+ /// Using the Yacc generated parser, construct an expression tree
+ /// representing <constraints> from the tokens returned by it.
+ int build_tree (const char* constraints);
+
+ static int is_empty_string (const char* str);
+
+ /// The root of the expression tree, not equal to null if build_tree
+ /// successfully builds a tree from the constraints.
+ TAO_ETCL_Constraint* root_;
+private:
+ /// This mutex protects the <build_tree> method from reentrance.
+ static TAO_SYNCH_MUTEX parserMutex__;
+};
+
+
+// Functions we need for parsing.
+extern int yyparse (void);
+extern void yyrestart (FILE*);
+extern int yylex (void);
+
+// Have yylex read from the constraint string, not from stdin.
+#undef YY_INPUT
+#define YY_INPUT(b, r, ms) (r = TAO_Lex_String_Input::copy_into(b, ms))
+
+/**
+ * @class TAO_Lex_String_Input
+ *
+ * @brief Have Lex read from a string and not from stdin. Essentially,
+ * the interpreter needs to call yylex() until EOF, and call
+ * TAO_Lex_String_Input::reset() with the new string, prior to
+ * calling yyparse.
+ */
+class TAO_Lex_String_Input
+{
+public:
+ /// Reset the lex input.
+ static void reset (char* input_string);
+
+ /// Method lex will call to read from the input string.
+ static int copy_into (char* buf, int max_size);
+
+private:
+
+ /// Pointers to keep track of the input string.
+ static char* string_;
+ static char* current_;
+ static char* end_;
+};
+
+/// The union used by lex and bison to build the Abstract Syntax Tree.
+typedef union
+{
+ TAO_ETCL_Constraint* constraint;
+} YYSTYPE;
+
+extern YYSTYPE yylval;
+extern YYSTYPE yyval;
+
+TAO_END_VERSIONED_NAMESPACE_DECL
+
+#include /**/ "ace/post.h"
+#endif /* TAO_ETCL_INTERPRETER_H */
diff --git a/TAO/orbsvcs/orbsvcs/ETCL/ETCL_l.cpp b/TAO/orbsvcs/orbsvcs/ETCL/ETCL_l.cpp
new file mode 100644
index 00000000000..1d5fbb80ccb
--- /dev/null
+++ b/TAO/orbsvcs/orbsvcs/ETCL/ETCL_l.cpp
@@ -0,0 +1,1884 @@
+
+/* A lexical scanner generated by flex */
+
+/* Scanner skeleton version:
+ * $Id$
+ */
+
+#define FLEX_SCANNER
+#define YY_FLEX_MAJOR_VERSION 2
+#define YY_FLEX_MINOR_VERSION 5
+
+
+/* cfront 1.2 defines "c_plusplus" instead of "__cplusplus" */
+#ifdef c_plusplus
+#ifndef __cplusplus
+#define __cplusplus
+#endif
+#endif
+
+
+#ifdef __cplusplus
+
+#include "tao/orbconf.h"
+#include "ace/OS.h"
+
+/* Use prototypes in function declarations. */
+#define YY_USE_PROTOS
+
+/* The "const" storage-class-modifier is valid. */
+#define YY_USE_CONST
+
+#else /* ! __cplusplus */
+
+#if __STDC__
+
+#define YY_USE_PROTOS
+#define YY_USE_CONST
+
+#endif /* __STDC__ */
+#endif /* ! __cplusplus */
+
+#ifdef __TURBOC__
+ #pragma warn -rch
+ #pragma warn -use
+#include <io.h>
+#include <stdlib.h>
+#define YY_USE_CONST
+#define YY_USE_PROTOS
+#endif
+
+#ifdef YY_USE_CONST
+#define yyconst const
+#else
+#define yyconst
+#endif
+
+
+#ifdef YY_USE_PROTOS
+#define YY_PROTO(proto) proto
+#else
+#define YY_PROTO(proto) ()
+#endif
+
+/* Returned upon end-of-file. */
+#define YY_NULL 0
+
+/* Promotes a possibly negative, possibly signed char to an unsigned
+ * integer for use as an array index. If the signed char is negative,
+ * we want to instead treat it as an 8-bit unsigned char, hence the
+ * double cast.
+ */
+#define YY_SC_TO_UI(c) ((unsigned int) (unsigned char) c)
+
+/* Enter a start condition. This macro really ought to take a parameter,
+ * but we do it the disgusting crufty way forced on us by the ()-less
+ * definition of BEGIN.
+ */
+#define BEGIN yy_start = 1 + 2 *
+
+/* Translate the current start state into a value that can be later handed
+ * to BEGIN to return to the state. The YYSTATE alias is for lex
+ * compatibility.
+ */
+#define YY_START ((yy_start - 1) / 2)
+#define YYSTATE YY_START
+
+/* Action number for EOF rule of a given start state. */
+#define YY_STATE_EOF(state) (YY_END_OF_BUFFER + state + 1)
+
+/* Special action meaning "start processing a new file". */
+#define YY_NEW_FILE yyrestart( yyin )
+
+#define YY_END_OF_BUFFER_CHAR 0
+
+/* Size of default input buffer. */
+#define YY_BUF_SIZE 16384
+
+TAO_BEGIN_VERSIONED_NAMESPACE_DECL
+
+typedef struct yy_buffer_state *YY_BUFFER_STATE;
+
+extern int yyleng;
+extern FILE *yyin, *yyout;
+
+#define EOB_ACT_CONTINUE_SCAN 0
+#define EOB_ACT_END_OF_FILE 1
+#define EOB_ACT_LAST_MATCH 2
+
+/* The funky do-while in the following #define is used to turn the definition
+ * int a single C statement (which needs a semi-colon terminator). This
+ * avoids problems with code like:
+ *
+ * if ( condition_holds )
+ * yyless( 5 );
+ * else
+ * do_something_else();
+ *
+ * Prior to using the do-while the compiler would get upset at the
+ * "else" because it interpreted the "if" statement as being all
+ * done when it reached the ';' after the yyless() call.
+ */
+
+/* Return all but the first 'n' matched characters back to the input stream. */
+
+#define yyless(n) \
+ do \
+ { \
+ /* Undo effects of setting up yytext. */ \
+ *yy_cp = yy_hold_char; \
+ YY_RESTORE_YY_MORE_OFFSET \
+ yy_c_buf_p = yy_cp = yy_bp + n - YY_MORE_ADJ; \
+ YY_DO_BEFORE_ACTION; /* set up yytext again */ \
+ } \
+ while ( 0 )
+
+#define unput(c) yyunput( c, yytext_ptr )
+
+/* The following is because we cannot portably get our hands on size_t
+ * (without autoconf's help, which isn't available because we want
+ * flex-generated scanners to compile on their own).
+ */
+typedef unsigned int yy_size_t;
+
+
+struct yy_buffer_state
+ {
+ FILE *yy_input_file;
+
+ char *yy_ch_buf; /* input buffer */
+ char *yy_buf_pos; /* current position in input buffer */
+
+ /* Size of input buffer in bytes, not including room for EOB
+ * characters.
+ */
+ yy_size_t yy_buf_size;
+
+ /* Number of characters read into yy_ch_buf, not including EOB
+ * characters.
+ */
+ int yy_n_chars;
+
+ /* Whether we "own" the buffer - i.e., we know we created it,
+ * and can realloc() it to grow it, and should free() it to
+ * delete it.
+ */
+ int yy_is_our_buffer;
+
+ /* Whether this is an "interactive" input source; if so, and
+ * if we're using stdio for input, then we want to use getc()
+ * instead of fread(), to make sure we stop fetching input after
+ * each newline.
+ */
+ int yy_is_interactive;
+
+ /* Whether we're considered to be at the beginning of a line.
+ * If so, '^' rules will be active on the next match, otherwise
+ * not.
+ */
+ int yy_at_bol;
+
+ /* Whether to try to fill the input buffer when we reach the
+ * end of it.
+ */
+ int yy_fill_buffer;
+
+ int yy_buffer_status;
+#define YY_BUFFER_NEW 0
+#define YY_BUFFER_NORMAL 1
+ /* When an EOF's been seen but there's still some text to process
+ * then we mark the buffer as YY_EOF_PENDING, to indicate that we
+ * shouldn't try reading from the input source any more. We might
+ * still have a bunch of tokens to match, though, because of
+ * possible backing-up.
+ *
+ * When we actually see the EOF, we change the status to "new"
+ * (via yyrestart()), so that the user can continue scanning by
+ * just pointing yyin at a new input file.
+ */
+#define YY_BUFFER_EOF_PENDING 2
+ };
+
+static YY_BUFFER_STATE yy_current_buffer = 0;
+
+/* We provide macros for accessing buffer states in case in the
+ * future we want to put the buffer states in a more general
+ * "scanner state".
+ */
+#define YY_CURRENT_BUFFER yy_current_buffer
+
+
+/* yy_hold_char holds the character lost when yytext is formed. */
+static char yy_hold_char;
+
+static int yy_n_chars; /* number of characters read into yy_ch_buf */
+
+
+int yyleng;
+
+/* Points to current character in buffer. */
+static char *yy_c_buf_p = (char *) 0;
+static int yy_init = 1; /* whether we need to initialize */
+static int yy_start = 0; /* start state number */
+
+/* Flag which is used to allow yywrap()'s to do buffer switches
+ * instead of setting up a fresh yyin. A bit of a hack ...
+ */
+static int yy_did_buffer_switch_on_eof;
+
+void yyrestart YY_PROTO(( FILE *input_file ));
+
+void yy_switch_to_buffer YY_PROTO(( YY_BUFFER_STATE new_buffer ));
+void yy_load_buffer_state YY_PROTO(( void ));
+YY_BUFFER_STATE yy_create_buffer YY_PROTO(( FILE *file, int size ));
+void yy_delete_buffer YY_PROTO(( YY_BUFFER_STATE b ));
+void yy_init_buffer YY_PROTO(( YY_BUFFER_STATE b, FILE *file ));
+void yy_flush_buffer YY_PROTO(( YY_BUFFER_STATE b ));
+#define YY_FLUSH_BUFFER yy_flush_buffer( yy_current_buffer )
+
+YY_BUFFER_STATE yy_scan_buffer YY_PROTO(( char *base, yy_size_t size ));
+YY_BUFFER_STATE yy_scan_string YY_PROTO(( yyconst char *yy_str ));
+YY_BUFFER_STATE yy_scan_bytes YY_PROTO(( yyconst char *bytes, int len ));
+
+static void *yy_flex_alloc YY_PROTO(( yy_size_t ));
+static void *yy_flex_realloc YY_PROTO(( void *, yy_size_t ));
+static void yy_flex_free YY_PROTO(( void * ));
+
+#define yy_new_buffer yy_create_buffer
+
+#define yy_set_interactive(is_interactive) \
+ { \
+ if ( ! yy_current_buffer ) \
+ yy_current_buffer = yy_create_buffer( yyin, YY_BUF_SIZE ); \
+ yy_current_buffer->yy_is_interactive = is_interactive; \
+ }
+
+#define yy_set_bol(at_bol) \
+ { \
+ if ( ! yy_current_buffer ) \
+ yy_current_buffer = yy_create_buffer( yyin, YY_BUF_SIZE ); \
+ yy_current_buffer->yy_at_bol = at_bol; \
+ }
+
+#define YY_AT_BOL() (yy_current_buffer->yy_at_bol)
+
+
+//#define yywrap() 1
+//#define YY_SKIP_YYWRAP
+typedef unsigned char YY_CHAR;
+FILE *yyin = (FILE *) 0, *yyout = (FILE *) 0;
+typedef int yy_state_type;
+extern char *yytext;
+#define yytext_ptr yytext
+
+static yy_state_type yy_get_previous_state YY_PROTO(( void ));
+static yy_state_type yy_try_NUL_trans YY_PROTO(( yy_state_type current_state ));
+static int yy_get_next_buffer YY_PROTO(( void ));
+static void yy_fatal_error YY_PROTO(( yyconst char msg[] ));
+
+/* Done after the current pattern has been matched and before the
+ * corresponding action - sets up yytext.
+ */
+#define YY_DO_BEFORE_ACTION \
+ yytext_ptr = yy_bp; \
+ yyleng = (int) (yy_cp - yy_bp); \
+ yy_hold_char = *yy_cp; \
+ *yy_cp = '\0'; \
+ yy_c_buf_p = yy_cp;
+
+#define YY_NUM_RULES 41
+#define YY_END_OF_BUFFER 42
+static yyconst short int yy_accept[118] =
+ { 0,
+ 0, 0, 42, 40, 39, 41, 40, 24, 40, 22,
+ 23, 14, 12, 13, 25, 15, 35, 16, 40, 18,
+ 38, 38, 38, 31, 40, 32, 40, 38, 38, 38,
+ 38, 38, 38, 38, 38, 38, 38, 11, 21, 0,
+ 37, 0, 36, 0, 35, 17, 20, 19, 38, 38,
+ 38, 38, 27, 0, 0, 0, 38, 38, 38, 38,
+ 10, 38, 38, 38, 9, 38, 38, 0, 0, 38,
+ 38, 38, 0, 0, 0, 8, 38, 38, 38, 2,
+ 1, 7, 38, 38, 0, 36, 38, 33, 0, 0,
+ 0, 38, 38, 38, 38, 5, 34, 0, 0, 0,
+
+ 38, 6, 3, 38, 0, 0, 0, 38, 4, 30,
+ 0, 0, 26, 0, 28, 29, 0
+ } ;
+
+static yyconst int yy_ec[256] =
+ { 0,
+ 1, 1, 1, 1, 1, 1, 1, 1, 2, 3,
+ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 2, 4, 1, 1, 5, 1, 1, 6, 7,
+ 8, 9, 10, 1, 11, 12, 13, 14, 14, 14,
+ 14, 14, 14, 14, 14, 14, 14, 1, 1, 15,
+ 16, 17, 1, 1, 18, 19, 19, 19, 20, 21,
+ 19, 19, 19, 19, 19, 22, 19, 19, 19, 19,
+ 19, 23, 24, 25, 26, 19, 19, 19, 19, 19,
+ 27, 28, 29, 1, 30, 1, 31, 19, 19, 32,
+
+ 33, 34, 35, 36, 37, 19, 19, 38, 39, 40,
+ 41, 42, 19, 43, 44, 45, 46, 19, 47, 48,
+ 49, 19, 1, 1, 1, 50, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+
+ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1
+ } ;
+
+static yyconst int yy_meta[51] =
+ { 0,
+ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 2, 1, 1, 1, 3, 3, 3,
+ 3, 3, 3, 3, 3, 3, 1, 1, 1, 2,
+ 3, 3, 3, 3, 3, 3, 3, 3, 3, 3,
+ 3, 3, 3, 3, 3, 3, 3, 3, 3, 1
+ } ;
+
+static yyconst short int yy_base[122] =
+ { 0,
+ 0, 0, 146, 147, 147, 147, 129, 147, 45, 147,
+ 147, 147, 147, 147, 130, 147, 40, 127, 126, 125,
+ 0, 122, 116, 147, 0, 147, 21, 98, 104, 88,
+ 98, 94, 24, 92, 89, 100, 93, 147, 147, 50,
+ 147, 51, 48, 115, 46, 147, 147, 147, 0, 106,
+ 101, 0, 147, 93, 92, 75, 91, 88, 84, 77,
+ 0, 71, 78, 72, 0, 76, 70, 57, 60, 90,
+ 93, 0, 72, 69, 68, 0, 78, 64, 63, 0,
+ 0, 0, 74, 69, 90, 89, 82, 0, 66, 59,
+ 66, 52, 52, 51, 54, 0, 0, 49, 49, 54,
+
+ 45, 0, 0, 43, 44, 47, 39, 30, 0, 147,
+ 35, 37, 0, 35, 147, 147, 147, 85, 87, 62,
+ 89
+ } ;
+
+static yyconst short int yy_def[122] =
+ { 0,
+ 117, 1, 117, 117, 117, 117, 117, 117, 118, 117,
+ 117, 117, 117, 117, 117, 117, 117, 117, 117, 117,
+ 119, 119, 119, 117, 120, 117, 117, 119, 119, 119,
+ 119, 119, 119, 119, 119, 119, 119, 117, 117, 118,
+ 117, 117, 117, 117, 117, 117, 117, 117, 119, 119,
+ 119, 121, 117, 117, 117, 117, 119, 119, 119, 119,
+ 119, 119, 119, 119, 119, 119, 119, 118, 117, 119,
+ 119, 121, 117, 117, 117, 119, 119, 119, 119, 119,
+ 119, 119, 119, 119, 117, 117, 119, 119, 117, 117,
+ 117, 119, 119, 119, 119, 119, 119, 117, 117, 117,
+
+ 119, 119, 119, 119, 117, 117, 117, 119, 119, 117,
+ 117, 117, 119, 117, 117, 117, 0, 117, 117, 117,
+ 117
+ } ;
+
+static yyconst short int yy_nxt[198] =
+ { 0,
+ 4, 5, 6, 7, 8, 9, 10, 11, 12, 13,
+ 14, 15, 16, 17, 18, 19, 20, 21, 21, 21,
+ 22, 21, 21, 21, 23, 21, 24, 25, 26, 27,
+ 28, 29, 30, 31, 21, 21, 32, 21, 33, 34,
+ 35, 21, 36, 21, 21, 21, 37, 21, 21, 38,
+ 41, 44, 53, 45, 62, 41, 68, 44, 54, 45,
+ 63, 43, 41, 55, 52, 56, 116, 69, 115, 85,
+ 85, 114, 42, 86, 113, 112, 111, 42, 68, 110,
+ 69, 109, 108, 107, 42, 40, 40, 40, 49, 49,
+ 72, 72, 106, 105, 104, 103, 102, 101, 100, 99,
+
+ 98, 97, 86, 86, 96, 95, 94, 93, 92, 91,
+ 90, 89, 88, 87, 84, 83, 82, 81, 80, 79,
+ 78, 77, 76, 75, 74, 73, 71, 70, 43, 67,
+ 66, 65, 64, 61, 60, 59, 58, 57, 51, 50,
+ 48, 47, 46, 43, 39, 117, 3, 117, 117, 117,
+ 117, 117, 117, 117, 117, 117, 117, 117, 117, 117,
+ 117, 117, 117, 117, 117, 117, 117, 117, 117, 117,
+ 117, 117, 117, 117, 117, 117, 117, 117, 117, 117,
+ 117, 117, 117, 117, 117, 117, 117, 117, 117, 117,
+ 117, 117, 117, 117, 117, 117, 117
+
+ } ;
+
+static yyconst short int yy_chk[198] =
+ { 0,
+ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+ 9, 17, 27, 17, 33, 40, 42, 45, 27, 45,
+ 33, 43, 68, 27, 120, 27, 114, 43, 112, 69,
+ 69, 111, 9, 69, 108, 107, 106, 40, 42, 105,
+ 43, 104, 101, 100, 68, 118, 118, 118, 119, 119,
+ 121, 121, 99, 98, 95, 94, 93, 92, 91, 90,
+
+ 89, 87, 86, 85, 84, 83, 79, 78, 77, 75,
+ 74, 73, 71, 70, 67, 66, 64, 63, 62, 60,
+ 59, 58, 57, 56, 55, 54, 51, 50, 44, 37,
+ 36, 35, 34, 32, 31, 30, 29, 28, 23, 22,
+ 20, 19, 18, 15, 7, 3, 117, 117, 117, 117,
+ 117, 117, 117, 117, 117, 117, 117, 117, 117, 117,
+ 117, 117, 117, 117, 117, 117, 117, 117, 117, 117,
+ 117, 117, 117, 117, 117, 117, 117, 117, 117, 117,
+ 117, 117, 117, 117, 117, 117, 117, 117, 117, 117,
+ 117, 117, 117, 117, 117, 117, 117
+
+ } ;
+
+static yy_state_type yy_last_accepting_state;
+static char *yy_last_accepting_cpos;
+
+/* The intent behind this definition is that it'll catch
+ * any uses of REJECT which flex missed.
+ */
+#define REJECT reject_used_but_not_detected
+#define yymore() yymore_used_but_not_detected
+#define YY_MORE_ADJ 0
+#define YY_RESTORE_YY_MORE_OFFSET
+char *yytext;
+//#line 1 "ETCL/ETCL.ll"
+#define INITIAL 0
+
+TAO_END_VERSIONED_NAMESPACE_DECL
+
+//#line 4 "ETCL/ETCL.ll"
+// $Id$
+// ========================================================================
+//
+// = LIBRARY
+// orbsvcs/ECTL
+//
+// = FILENAME
+// ETCL.ll
+//
+// = AUTHOR
+// Carlos O'Ryan <coryan@uci.edu> based on previous work by
+// Seth Widoff <sbw1@cs.wustl.edu>
+//
+// ========================================================================
+
+#include "orbsvcs/ETCL/ETCL_Interpreter.h"
+#include "orbsvcs/ETCL/ETCL_Constraint.h"
+#include "orbsvcs/ETCL/ETCL_y.h"
+
+TAO_BEGIN_VERSIONED_NAMESPACE_DECL
+
+static const char* extract_string(char*);
+//static const char * extract_string(char*);
+
+#define TAO_YY_LEX_DEBUG
+
+#ifdef TAO_CONSTRAINT_DEBUG
+#define TAO_YY_LEX_DEBUG ACE_OS::fprintf(stderr, "%s\n", yytext)
+#endif /* TAO_CONSTRAINT_DEBUG */
+
+//#define YY_DECL int TAO_ETCL_yylex (TAO_ETCL_YYSTYPE *lvalp, void* state)
+
+#define YY_BREAK
+#define YY_NO_UNPUT
+
+
+/* Macros after this point can all be overridden by user definitions in
+ * section 1.
+ */
+
+#ifndef YY_SKIP_YYWRAP
+#ifdef __cplusplus
+extern "C" int yywrap YY_PROTO(( void ));
+#else
+extern int yywrap YY_PROTO(( void ));
+#endif
+#endif
+
+#ifndef yytext_ptr
+static void yy_flex_strncpy YY_PROTO(( char *, yyconst char *, int ));
+#endif
+
+#ifdef YY_NEED_STRLEN
+static int yy_flex_strlen YY_PROTO(( yyconst char * ));
+#endif
+
+#ifndef YY_NO_INPUT
+#ifdef __cplusplus
+static int yyinput YY_PROTO(( void ));
+#else
+static int input YY_PROTO(( void ));
+#endif
+#endif
+
+#if YY_STACK_USED
+static int yy_start_stack_ptr = 0;
+static int yy_start_stack_depth = 0;
+static int *yy_start_stack = 0;
+#ifndef YY_NO_PUSH_STATE
+static void yy_push_state YY_PROTO(( int new_state ));
+#endif
+#ifndef YY_NO_POP_STATE
+static void yy_pop_state YY_PROTO(( void ));
+#endif
+#ifndef YY_NO_TOP_STATE
+static int yy_top_state YY_PROTO(( void ));
+#endif
+
+#else
+#define YY_NO_PUSH_STATE 1
+#define YY_NO_POP_STATE 1
+#define YY_NO_TOP_STATE 1
+#endif
+
+TAO_END_VERSIONED_NAMESPACE_DECL
+
+#ifdef YY_MALLOC_DECL
+YY_MALLOC_DECL
+#else
+#if __STDC__
+#ifndef __cplusplus
+#include <stdlib.h>
+#endif
+#else
+/* Just try to get by without declaring the routines. This will fail
+ * miserably on non-ANSI systems for which sizeof(size_t) != sizeof(int)
+ * or sizeof(void*) != sizeof(int).
+ */
+#endif
+#endif
+
+/* Amount of stuff to slurp up with each read. */
+#ifndef YY_READ_BUF_SIZE
+#define YY_READ_BUF_SIZE 8192
+#endif
+
+/* Copy whatever the last rule matched to the standard output. */
+
+#ifndef TAO_ETCL_ECHO
+/* This used to be an fputs(), but since the string might contain NUL's,
+ * we now use fwrite().
+ */
+#define TAO_ETCL_ECHO (void) fwrite( yytext, yyleng, 1, yyout )
+#endif
+
+/* Gets input and stuffs it into "buf". number of characters read, or YY_NULL,
+ * is returned in "result".
+ */
+#ifndef YY_INPUT
+#define YY_INPUT(buf,result,max_size) \
+ if ( yy_current_buffer->yy_is_interactive ) \
+ { \
+ int c = '*', n; \
+ for ( n = 0; n < max_size && \
+ (c = getc( yyin )) != EOF && c != '\n'; ++n ) \
+ buf[n] = (char) c; \
+ if ( c == '\n' ) \
+ buf[n++] = (char) c; \
+ if ( c == EOF && ferror( yyin ) ) \
+ YY_FATAL_ERROR( "input in flex scanner failed" ); \
+ result = n; \
+ } \
+ else if ( ((result = fread( buf, 1, max_size, yyin )) == 0) \
+ && ferror( yyin ) ) \
+ YY_FATAL_ERROR( "input in flex scanner failed" );
+#endif
+
+/* No semi-colon after return; correct usage is to write "yyterminate();" -
+ * we don't want an extra ';' after the "return" because that will cause
+ * some compilers to complain about unreachable statements.
+ */
+#ifndef yyterminate
+#define yyterminate() return YY_NULL
+#endif
+
+/* Number of entries by which start-condition stack grows. */
+#ifndef YY_START_STACK_INCR
+#define YY_START_STACK_INCR 25
+#endif
+
+/* Report a fatal error. */
+#ifndef YY_FATAL_ERROR
+#define YY_FATAL_ERROR(msg) yy_fatal_error( msg )
+#endif
+
+/* Default declaration of generated scanner - a define so the user can
+ * easily add parameters.
+ */
+#ifndef YY_DECL
+#define YY_DECL int yylex YY_PROTO(( void ))
+#endif
+
+/* Code executed at the beginning of each rule, after yytext and yyleng
+ * have been set up.
+ */
+#ifndef YY_USER_ACTION
+#define YY_USER_ACTION
+#endif
+
+/* Code executed at the end of each rule. */
+#ifndef YY_BREAK
+#define YY_BREAK break;
+#endif
+
+#define YY_RULE_SETUP \
+ YY_USER_ACTION
+
+TAO_BEGIN_VERSIONED_NAMESPACE_DECL
+
+YY_DECL
+ {
+ register yy_state_type yy_current_state;
+ register char *yy_cp = 0;
+ register char *yy_bp = 0;
+ register int yy_act;
+
+//#line 50 "ETCL/ETCL.ll"
+
+ if ( yy_init )
+ {
+ yy_init = 0;
+
+#ifdef YY_USER_INIT
+ YY_USER_INIT;
+#endif
+
+ if ( ! yy_start )
+ yy_start = 1; /* first start state */
+
+ if ( ! yyin )
+ yyin = stdin;
+
+ if ( ! yyout )
+ yyout = stdout;
+
+ if ( ! yy_current_buffer )
+ yy_current_buffer =
+ yy_create_buffer( yyin, YY_BUF_SIZE );
+
+ yy_load_buffer_state();
+ }
+
+ while ( 1 ) /* loops until end-of-file is reached */
+ {
+ yy_cp = yy_c_buf_p;
+
+ /* Support of yytext. */
+ *yy_cp = yy_hold_char;
+
+ /* yy_bp points to the position in yy_ch_buf of the start of
+ * the current run.
+ */
+ yy_bp = yy_cp;
+
+ yy_current_state = yy_start;
+yy_match:
+ do
+ {
+ register YY_CHAR yy_c = yy_ec[YY_SC_TO_UI(*yy_cp)];
+ if ( yy_accept[yy_current_state] )
+ {
+ yy_last_accepting_state = yy_current_state;
+ yy_last_accepting_cpos = yy_cp;
+ }
+ while ( yy_chk[yy_base[yy_current_state] + yy_c] != yy_current_state )
+ {
+ yy_current_state = (int) yy_def[yy_current_state];
+ if ( yy_current_state >= 118 )
+ yy_c = yy_meta[(unsigned int) yy_c];
+ }
+ yy_current_state = yy_nxt[yy_base[yy_current_state] + (unsigned int) yy_c];
+ ++yy_cp;
+ }
+ while ( yy_base[yy_current_state] != 147 );
+
+yy_find_action:
+ yy_act = yy_accept[yy_current_state];
+ if ( yy_act == 0 )
+ { /* have to back up */
+ yy_cp = yy_last_accepting_cpos;
+ yy_current_state = yy_last_accepting_state;
+ yy_act = yy_accept[yy_current_state];
+ }
+
+ YY_DO_BEFORE_ACTION;
+
+
+do_action: /* This label is used only to access EOF actions. */
+
+
+ switch ( yy_act )
+ { /* beginning of action switch */
+ case 0: /* must back up */
+ /* undo the effects of YY_DO_BEFORE_ACTION */
+ *yy_cp = yy_hold_char;
+ yy_cp = yy_last_accepting_cpos;
+ yy_current_state = yy_last_accepting_state;
+ goto yy_find_action;
+
+case 1:
+YY_RULE_SETUP
+//#line 52 "ETCL/ETCL.ll"
+{ TAO_YY_LEX_DEBUG; return TAO_ETCL_MIN; }
+ YY_BREAK
+case 2:
+YY_RULE_SETUP
+//#line 53 "ETCL/ETCL.ll"
+{ TAO_YY_LEX_DEBUG; return TAO_ETCL_MAX; }
+ YY_BREAK
+case 3:
+YY_RULE_SETUP
+//#line 54 "ETCL/ETCL.ll"
+{ TAO_YY_LEX_DEBUG; return TAO_ETCL_FIRST; }
+ YY_BREAK
+case 4:
+YY_RULE_SETUP
+//#line 55 "ETCL/ETCL.ll"
+{ TAO_YY_LEX_DEBUG; return TAO_ETCL_RANDOM; }
+ YY_BREAK
+case 5:
+YY_RULE_SETUP
+//#line 56 "ETCL/ETCL.ll"
+{ TAO_YY_LEX_DEBUG; return TAO_ETCL_WITH; }
+ YY_BREAK
+case 6:
+YY_RULE_SETUP
+//#line 57 "ETCL/ETCL.ll"
+{ TAO_YY_LEX_DEBUG; return TAO_ETCL_EXIST; }
+ YY_BREAK
+case 7:
+YY_RULE_SETUP
+//#line 58 "ETCL/ETCL.ll"
+{ TAO_YY_LEX_DEBUG; return TAO_ETCL_NOT; }
+ YY_BREAK
+case 8:
+YY_RULE_SETUP
+//#line 59 "ETCL/ETCL.ll"
+{ TAO_YY_LEX_DEBUG; return TAO_ETCL_AND; }
+ YY_BREAK
+case 9:
+YY_RULE_SETUP
+//#line 60 "ETCL/ETCL.ll"
+{ TAO_YY_LEX_DEBUG; return TAO_ETCL_OR; }
+ YY_BREAK
+case 10:
+YY_RULE_SETUP
+//#line 61 "ETCL/ETCL.ll"
+{ TAO_YY_LEX_DEBUG; return TAO_ETCL_IN; }
+ YY_BREAK
+case 11:
+YY_RULE_SETUP
+//#line 62 "ETCL/ETCL.ll"
+{ TAO_YY_LEX_DEBUG; return TAO_ETCL_TWIDDLE; }
+ YY_BREAK
+case 12:
+YY_RULE_SETUP
+//#line 63 "ETCL/ETCL.ll"
+{ TAO_YY_LEX_DEBUG; return TAO_ETCL_PLUS; }
+ YY_BREAK
+case 13:
+YY_RULE_SETUP
+//#line 64 "ETCL/ETCL.ll"
+{ TAO_YY_LEX_DEBUG; return TAO_ETCL_MINUS; }
+ YY_BREAK
+case 14:
+YY_RULE_SETUP
+//#line 65 "ETCL/ETCL.ll"
+{ TAO_YY_LEX_DEBUG; return TAO_ETCL_MULT; }
+ YY_BREAK
+case 15:
+YY_RULE_SETUP
+//#line 66 "ETCL/ETCL.ll"
+{ TAO_YY_LEX_DEBUG; return TAO_ETCL_DIV; }
+ YY_BREAK
+case 16:
+YY_RULE_SETUP
+//#line 67 "ETCL/ETCL.ll"
+{ TAO_YY_LEX_DEBUG; return TAO_ETCL_LT; }
+ YY_BREAK
+case 17:
+YY_RULE_SETUP
+//#line 68 "ETCL/ETCL.ll"
+{ TAO_YY_LEX_DEBUG; return TAO_ETCL_LE; }
+ YY_BREAK
+case 18:
+YY_RULE_SETUP
+//#line 69 "ETCL/ETCL.ll"
+{ TAO_YY_LEX_DEBUG; return TAO_ETCL_GT; }
+ YY_BREAK
+case 19:
+YY_RULE_SETUP
+//#line 70 "ETCL/ETCL.ll"
+{ TAO_YY_LEX_DEBUG; return TAO_ETCL_GE; }
+ YY_BREAK
+case 20:
+YY_RULE_SETUP
+//#line 71 "ETCL/ETCL.ll"
+{ TAO_YY_LEX_DEBUG; return TAO_ETCL_EQ; }
+ YY_BREAK
+case 21:
+YY_RULE_SETUP
+//#line 72 "ETCL/ETCL.ll"
+{ TAO_YY_LEX_DEBUG; return TAO_ETCL_NE; }
+ YY_BREAK
+case 22:
+YY_RULE_SETUP
+//#line 73 "ETCL/ETCL.ll"
+{ TAO_YY_LEX_DEBUG; return TAO_ETCL_LPAREN; }
+ YY_BREAK
+case 23:
+YY_RULE_SETUP
+//#line 74 "ETCL/ETCL.ll"
+{ TAO_YY_LEX_DEBUG; return TAO_ETCL_RPAREN; }
+ YY_BREAK
+case 24:
+YY_RULE_SETUP
+//#line 75 "ETCL/ETCL.ll"
+{ TAO_YY_LEX_DEBUG; return TAO_ETCL_DOLLAR; }
+ YY_BREAK
+case 25:
+YY_RULE_SETUP
+//#line 76 "ETCL/ETCL.ll"
+{ TAO_YY_LEX_DEBUG; return TAO_ETCL_DOT; }
+ YY_BREAK
+case 26:
+YY_RULE_SETUP
+//#line 77 "ETCL/ETCL.ll"
+{ TAO_YY_LEX_DEBUG; return TAO_ETCL_DEFAULT; }
+ YY_BREAK
+case 27:
+YY_RULE_SETUP
+//#line 78 "ETCL/ETCL.ll"
+{ TAO_YY_LEX_DEBUG; return TAO_ETCL_DISCRIMINANT; }
+ YY_BREAK
+case 28:
+YY_RULE_SETUP
+//#line 79 "ETCL/ETCL.ll"
+{ TAO_YY_LEX_DEBUG; return TAO_ETCL_TYPE_ID; }
+ YY_BREAK
+case 29:
+YY_RULE_SETUP
+//#line 80 "ETCL/ETCL.ll"
+{ TAO_YY_LEX_DEBUG; return TAO_ETCL_REPOS_ID; }
+ YY_BREAK
+case 30:
+YY_RULE_SETUP
+//#line 81 "ETCL/ETCL.ll"
+{ TAO_YY_LEX_DEBUG; return TAO_ETCL_LENGTH; }
+ YY_BREAK
+case 31:
+YY_RULE_SETUP
+//#line 82 "ETCL/ETCL.ll"
+{ TAO_YY_LEX_DEBUG; return TAO_ETCL_LBRA; }
+ YY_BREAK
+case 32:
+YY_RULE_SETUP
+//#line 83 "ETCL/ETCL.ll"
+{ TAO_YY_LEX_DEBUG; return TAO_ETCL_RBRA; }
+ YY_BREAK
+case 33:
+YY_RULE_SETUP
+//#line 84 "ETCL/ETCL.ll"
+{
+ yylval.constraint =
+ new TAO_ETCL_Literal_Constraint ((CORBA::Boolean) 1);
+ TAO_YY_LEX_DEBUG; return TAO_ETCL_BOOLEAN;
+ }
+ YY_BREAK
+case 34:
+YY_RULE_SETUP
+//#line 89 "ETCL/ETCL.ll"
+{
+ yylval.constraint =
+ new TAO_ETCL_Literal_Constraint ((CORBA::Boolean) 0);
+ TAO_YY_LEX_DEBUG; return TAO_ETCL_BOOLEAN;
+ }
+ YY_BREAK
+case 35:
+YY_RULE_SETUP
+//#line 94 "ETCL/ETCL.ll"
+{
+ yylval.constraint =
+ new TAO_ETCL_Literal_Constraint (ACE_OS::atoi (yytext));
+ TAO_YY_LEX_DEBUG; return TAO_ETCL_INTEGER;
+ }
+ YY_BREAK
+case 36:
+YY_RULE_SETUP
+//#line 99 "ETCL/ETCL.ll"
+{
+ double v;
+ sscanf (yytext, "%lf", &v);
+ yylval.constraint =
+ new TAO_ETCL_Literal_Constraint (v);
+ TAO_YY_LEX_DEBUG; return TAO_ETCL_FLOAT;
+ }
+ YY_BREAK
+case 37:
+YY_RULE_SETUP
+//#line 106 "ETCL/ETCL.ll"
+{
+ yylval.constraint =
+ new TAO_ETCL_Literal_Constraint (extract_string(yytext));
+ TAO_YY_LEX_DEBUG; return TAO_ETCL_STRING;
+ }
+ YY_BREAK
+case 38:
+YY_RULE_SETUP
+//#line 111 "ETCL/ETCL.ll"
+{
+ yylval.constraint =
+ new TAO_ETCL_Identifier (yytext);
+ TAO_YY_LEX_DEBUG; return TAO_ETCL_IDENT;
+ }
+ YY_BREAK
+case 39:
+YY_RULE_SETUP
+//#line 116 "ETCL/ETCL.ll"
+{
+ TAO_YY_LEX_DEBUG; break; // Ignore
+ }
+ YY_BREAK
+case 40:
+YY_RULE_SETUP
+//#line 119 "ETCL/ETCL.ll"
+{
+ TAO_YY_LEX_DEBUG; break; // @@ TODO
+ }
+ YY_BREAK
+case 41:
+YY_RULE_SETUP
+//#line 122 "ETCL/ETCL.ll"
+TAO_ETCL_ECHO;
+ YY_BREAK
+case YY_STATE_EOF(INITIAL):
+ yyterminate();
+
+ case YY_END_OF_BUFFER:
+ {
+ /* Amount of text matched not including the EOB char. */
+ int yy_amount_of_matched_text = (int) (yy_cp - yytext_ptr) - 1;
+
+ /* Undo the effects of YY_DO_BEFORE_ACTION. */
+ *yy_cp = yy_hold_char;
+ YY_RESTORE_YY_MORE_OFFSET
+
+ if ( yy_current_buffer->yy_buffer_status == YY_BUFFER_NEW )
+ {
+ /* We're scanning a new file or input source. It's
+ * possible that this happened because the user
+ * just pointed yyin at a new source and called
+ * yylex(). If so, then we have to assure
+ * consistency between yy_current_buffer and our
+ * globals. Here is the right place to do so, because
+ * this is the first action (other than possibly a
+ * back-up) that will match for the new input source.
+ */
+ yy_n_chars = yy_current_buffer->yy_n_chars;
+ yy_current_buffer->yy_input_file = yyin;
+ yy_current_buffer->yy_buffer_status = YY_BUFFER_NORMAL;
+ }
+
+ /* Note that here we test for yy_c_buf_p "<=" to the position
+ * of the first EOB in the buffer, since yy_c_buf_p will
+ * already have been incremented past the NUL character
+ * (since all states make transitions on EOB to the
+ * end-of-buffer state). Contrast this with the test
+ * in input().
+ */
+ if ( yy_c_buf_p <= &yy_current_buffer->yy_ch_buf[yy_n_chars] )
+ { /* This was really a NUL. */
+ yy_state_type yy_next_state;
+
+ yy_c_buf_p = yytext_ptr + yy_amount_of_matched_text;
+
+ yy_current_state = yy_get_previous_state();
+
+ /* Okay, we're now positioned to make the NUL
+ * transition. We couldn't have
+ * yy_get_previous_state() go ahead and do it
+ * for us because it doesn't know how to deal
+ * with the possibility of jamming (and we don't
+ * want to build jamming into it because then it
+ * will run more slowly).
+ */
+
+ yy_next_state = yy_try_NUL_trans( yy_current_state );
+
+ yy_bp = yytext_ptr + YY_MORE_ADJ;
+
+ if ( yy_next_state )
+ {
+ /* Consume the NUL. */
+ yy_cp = ++yy_c_buf_p;
+ yy_current_state = yy_next_state;
+ goto yy_match;
+ }
+
+ else
+ {
+ yy_cp = yy_c_buf_p;
+ goto yy_find_action;
+ }
+ }
+
+ else switch ( yy_get_next_buffer() )
+ {
+ case EOB_ACT_END_OF_FILE:
+ {
+ yy_did_buffer_switch_on_eof = 0;
+
+ if ( yywrap() )
+ {
+ /* Note: because we've taken care in
+ * yy_get_next_buffer() to have set up
+ * yytext, we can now set up
+ * yy_c_buf_p so that if some total
+ * hoser (like flex itself) wants to
+ * call the scanner after we return the
+ * YY_NULL, it'll still work - another
+ * YY_NULL will get returned.
+ */
+ yy_c_buf_p = yytext_ptr + YY_MORE_ADJ;
+
+ yy_act = YY_STATE_EOF(YY_START);
+ goto do_action;
+ }
+
+ else
+ {
+ if ( ! yy_did_buffer_switch_on_eof )
+ YY_NEW_FILE;
+ }
+ break;
+ }
+
+ case EOB_ACT_CONTINUE_SCAN:
+ yy_c_buf_p =
+ yytext_ptr + yy_amount_of_matched_text;
+
+ yy_current_state = yy_get_previous_state();
+
+ yy_cp = yy_c_buf_p;
+ yy_bp = yytext_ptr + YY_MORE_ADJ;
+ goto yy_match;
+
+ case EOB_ACT_LAST_MATCH:
+ yy_c_buf_p =
+ &yy_current_buffer->yy_ch_buf[yy_n_chars];
+
+ yy_current_state = yy_get_previous_state();
+
+ yy_cp = yy_c_buf_p;
+ yy_bp = yytext_ptr + YY_MORE_ADJ;
+ goto yy_find_action;
+ }
+ break;
+ }
+
+ default:
+ YY_FATAL_ERROR(
+ "fatal flex scanner internal error--no action found" );
+ } /* end of action switch */
+ } /* end of scanning one token */
+ } /* end of yylex */
+
+
+/* yy_get_next_buffer - try to read in a new buffer
+ *
+ * Returns a code representing an action:
+ * EOB_ACT_LAST_MATCH -
+ * EOB_ACT_CONTINUE_SCAN - continue scanning from current position
+ * EOB_ACT_END_OF_FILE - end of file
+ */
+
+static int yy_get_next_buffer()
+ {
+ register char *dest = yy_current_buffer->yy_ch_buf;
+ register char *source = yytext_ptr;
+ register int number_to_move, i;
+ int ret_val;
+
+ if ( yy_c_buf_p > &yy_current_buffer->yy_ch_buf[yy_n_chars + 1] )
+ YY_FATAL_ERROR(
+ "fatal flex scanner internal error--end of buffer missed" );
+
+ if ( yy_current_buffer->yy_fill_buffer == 0 )
+ { /* Don't try to fill the buffer, so this is an EOF. */
+ if ( yy_c_buf_p - yytext_ptr - YY_MORE_ADJ == 1 )
+ {
+ /* We matched a single character, the EOB, so
+ * treat this as a final EOF.
+ */
+ return EOB_ACT_END_OF_FILE;
+ }
+
+ else
+ {
+ /* We matched some text prior to the EOB, first
+ * process it.
+ */
+ return EOB_ACT_LAST_MATCH;
+ }
+ }
+
+ /* Try to read more data. */
+
+ /* First move last chars to start of buffer. */
+ number_to_move = (int) (yy_c_buf_p - yytext_ptr) - 1;
+
+ for ( i = 0; i < number_to_move; ++i )
+ *(dest++) = *(source++);
+
+ if ( yy_current_buffer->yy_buffer_status == YY_BUFFER_EOF_PENDING )
+ /* don't do the read, it's not guaranteed to return an EOF,
+ * just force an EOF
+ */
+ yy_current_buffer->yy_n_chars = yy_n_chars = 0;
+
+ else
+ {
+ int num_to_read =
+ yy_current_buffer->yy_buf_size - number_to_move - 1;
+
+ while ( num_to_read <= 0 )
+ { /* Not enough room in the buffer - grow it. */
+#ifdef YY_USES_REJECT
+ YY_FATAL_ERROR(
+"input buffer overflow, can't enlarge buffer because scanner uses REJECT" );
+#else
+
+ /* just a shorter name for the current buffer */
+ YY_BUFFER_STATE b = yy_current_buffer;
+
+ int yy_c_buf_p_offset =
+ (int) (yy_c_buf_p - b->yy_ch_buf);
+
+ if ( b->yy_is_our_buffer )
+ {
+ int new_size = b->yy_buf_size * 2;
+
+ if ( new_size <= 0 )
+ b->yy_buf_size += b->yy_buf_size / 8;
+ else
+ b->yy_buf_size *= 2;
+
+ b->yy_ch_buf = (char *)
+ /* Include room in for 2 EOB chars. */
+ yy_flex_realloc( (void *) b->yy_ch_buf,
+ b->yy_buf_size + 2 );
+ }
+ else
+ /* Can't grow it, we don't own it. */
+ b->yy_ch_buf = 0;
+
+ if ( ! b->yy_ch_buf )
+ YY_FATAL_ERROR(
+ "fatal error - scanner input buffer overflow" );
+
+ yy_c_buf_p = &b->yy_ch_buf[yy_c_buf_p_offset];
+
+ num_to_read = yy_current_buffer->yy_buf_size -
+ number_to_move - 1;
+#endif
+ }
+
+ if ( num_to_read > YY_READ_BUF_SIZE )
+ num_to_read = YY_READ_BUF_SIZE;
+
+ /* Read in more data. */
+ YY_INPUT( (&yy_current_buffer->yy_ch_buf[number_to_move]),
+ yy_n_chars, num_to_read );
+
+ yy_current_buffer->yy_n_chars = yy_n_chars;
+ }
+
+ if ( yy_n_chars == 0 )
+ {
+ if ( number_to_move == YY_MORE_ADJ )
+ {
+ ret_val = EOB_ACT_END_OF_FILE;
+ yyrestart( yyin );
+ }
+
+ else
+ {
+ ret_val = EOB_ACT_LAST_MATCH;
+ yy_current_buffer->yy_buffer_status =
+ YY_BUFFER_EOF_PENDING;
+ }
+ }
+
+ else
+ ret_val = EOB_ACT_CONTINUE_SCAN;
+
+ yy_n_chars += number_to_move;
+ yy_current_buffer->yy_ch_buf[yy_n_chars] = YY_END_OF_BUFFER_CHAR;
+ yy_current_buffer->yy_ch_buf[yy_n_chars + 1] = YY_END_OF_BUFFER_CHAR;
+
+ yytext_ptr = &yy_current_buffer->yy_ch_buf[0];
+
+ return ret_val;
+ }
+
+
+/* yy_get_previous_state - get the state just before the EOB char was reached */
+
+static yy_state_type yy_get_previous_state()
+ {
+ register yy_state_type yy_current_state;
+ register char *yy_cp;
+
+ yy_current_state = yy_start;
+
+ for ( yy_cp = yytext_ptr + YY_MORE_ADJ; yy_cp < yy_c_buf_p; ++yy_cp )
+ {
+ register YY_CHAR yy_c = (*yy_cp ? yy_ec[YY_SC_TO_UI(*yy_cp)] : 1);
+ if ( yy_accept[yy_current_state] )
+ {
+ yy_last_accepting_state = yy_current_state;
+ yy_last_accepting_cpos = yy_cp;
+ }
+ while ( yy_chk[yy_base[yy_current_state] + yy_c] != yy_current_state )
+ {
+ yy_current_state = (int) yy_def[yy_current_state];
+ if ( yy_current_state >= 118 )
+ yy_c = yy_meta[(unsigned int) yy_c];
+ }
+ yy_current_state = yy_nxt[yy_base[yy_current_state] + (unsigned int) yy_c];
+ }
+
+ return yy_current_state;
+ }
+
+
+/* yy_try_NUL_trans - try to make a transition on the NUL character
+ *
+ * synopsis
+ * next_state = yy_try_NUL_trans( current_state );
+ */
+
+#ifdef YY_USE_PROTOS
+static yy_state_type yy_try_NUL_trans( yy_state_type yy_current_state )
+#else
+static yy_state_type yy_try_NUL_trans( yy_current_state )
+yy_state_type yy_current_state;
+#endif
+ {
+ register int yy_is_jam;
+ register char *yy_cp = yy_c_buf_p;
+
+ register YY_CHAR yy_c = 1;
+ if ( yy_accept[yy_current_state] )
+ {
+ yy_last_accepting_state = yy_current_state;
+ yy_last_accepting_cpos = yy_cp;
+ }
+ while ( yy_chk[yy_base[yy_current_state] + yy_c] != yy_current_state )
+ {
+ yy_current_state = (int) yy_def[yy_current_state];
+ if ( yy_current_state >= 118 )
+ yy_c = yy_meta[(unsigned int) yy_c];
+ }
+ yy_current_state = yy_nxt[yy_base[yy_current_state] + (unsigned int) yy_c];
+ yy_is_jam = (yy_current_state == 117);
+
+ return yy_is_jam ? 0 : yy_current_state;
+ }
+
+#if 0
+#ifndef YY_NO_UNPUT
+#ifdef YY_USE_PROTOS
+static void yyunput( int c, register char *yy_bp )
+#else
+static void yyunput( c, yy_bp )
+int c;
+register char *yy_bp;
+#endif
+ {
+ register char *yy_cp = yy_c_buf_p;
+
+ /* undo effects of setting up yytext */
+ *yy_cp = yy_hold_char;
+
+ if ( yy_cp < yy_current_buffer->yy_ch_buf + 2 )
+ { /* need to shift things up to make room */
+ /* +2 for EOB chars. */
+ register int number_to_move = yy_n_chars + 2;
+ register char *dest = &yy_current_buffer->yy_ch_buf[
+ yy_current_buffer->yy_buf_size + 2];
+ register char *source =
+ &yy_current_buffer->yy_ch_buf[number_to_move];
+
+ while ( source > yy_current_buffer->yy_ch_buf )
+ *--dest = *--source;
+
+ yy_cp += (int) (dest - source);
+ yy_bp += (int) (dest - source);
+ yy_current_buffer->yy_n_chars =
+ yy_n_chars = yy_current_buffer->yy_buf_size;
+
+ if ( yy_cp < yy_current_buffer->yy_ch_buf + 2 )
+ YY_FATAL_ERROR( "flex scanner push-back overflow" );
+ }
+
+ *--yy_cp = (char) c;
+
+
+ yytext_ptr = yy_bp;
+ yy_hold_char = *yy_cp;
+ yy_c_buf_p = yy_cp;
+ }
+#endif /* ifndef YY_NO_UNPUT */
+#endif /* 0 */
+
+#ifdef __cplusplus
+static int yyinput()
+#else
+static int input()
+#endif
+ {
+ int c;
+
+ *yy_c_buf_p = yy_hold_char;
+
+ if ( *yy_c_buf_p == YY_END_OF_BUFFER_CHAR )
+ {
+ /* yy_c_buf_p now points to the character we want to return.
+ * If this occurs *before* the EOB characters, then it's a
+ * valid NUL; if not, then we've hit the end of the buffer.
+ */
+ if ( yy_c_buf_p < &yy_current_buffer->yy_ch_buf[yy_n_chars] )
+ /* This was really a NUL. */
+ *yy_c_buf_p = '\0';
+
+ else
+ { /* need more input */
+ int offset = yy_c_buf_p - yytext_ptr;
+ ++yy_c_buf_p;
+
+ switch ( yy_get_next_buffer() )
+ {
+ case EOB_ACT_LAST_MATCH:
+ /* This happens because yy_g_n_b()
+ * sees that we've accumulated a
+ * token and flags that we need to
+ * try matching the token before
+ * proceeding. But for input(),
+ * there's no matching to consider.
+ * So convert the EOB_ACT_LAST_MATCH
+ * to EOB_ACT_END_OF_FILE.
+ */
+
+ /* Reset buffer status. */
+ yyrestart( yyin );
+
+ /* fall through */
+
+ case EOB_ACT_END_OF_FILE:
+ {
+ if ( yywrap() )
+ return EOF;
+
+ if ( ! yy_did_buffer_switch_on_eof )
+ YY_NEW_FILE;
+#ifdef __cplusplus
+ return yyinput();
+#else
+ return input();
+#endif
+ }
+
+ case EOB_ACT_CONTINUE_SCAN:
+ yy_c_buf_p = yytext_ptr + offset;
+ break;
+ }
+ }
+ }
+
+ c = *(unsigned char *) yy_c_buf_p; /* cast for 8-bit char's */
+ *yy_c_buf_p = '\0'; /* preserve yytext */
+ yy_hold_char = *++yy_c_buf_p;
+
+
+ return c;
+ }
+
+void yyflush_current_buffer (void)
+{
+ YY_FLUSH_BUFFER;
+}
+
+
+#ifdef YY_USE_PROTOS
+void yyrestart( FILE *input_file )
+#else
+void yyrestart( input_file )
+FILE *input_file;
+#endif
+ {
+ if ( ! yy_current_buffer )
+ yy_current_buffer = yy_create_buffer( yyin, YY_BUF_SIZE );
+
+ yy_init_buffer( yy_current_buffer, input_file );
+ yy_load_buffer_state();
+ }
+
+
+#ifdef YY_USE_PROTOS
+void yy_switch_to_buffer( YY_BUFFER_STATE new_buffer )
+#else
+void yy_switch_to_buffer( new_buffer )
+YY_BUFFER_STATE new_buffer;
+#endif
+ {
+ if ( yy_current_buffer == new_buffer )
+ return;
+
+ if ( yy_current_buffer )
+ {
+ /* Flush out information for old buffer. */
+ *yy_c_buf_p = yy_hold_char;
+ yy_current_buffer->yy_buf_pos = yy_c_buf_p;
+ yy_current_buffer->yy_n_chars = yy_n_chars;
+ }
+
+ yy_current_buffer = new_buffer;
+ yy_load_buffer_state();
+
+ /* We don't actually know whether we did this switch during
+ * EOF (yywrap()) processing, but the only time this flag
+ * is looked at is after yywrap() is called, so it's safe
+ * to go ahead and always set it.
+ */
+ yy_did_buffer_switch_on_eof = 1;
+ }
+
+
+#ifdef YY_USE_PROTOS
+void yy_load_buffer_state( void )
+#else
+void yy_load_buffer_state()
+#endif
+ {
+ yy_n_chars = yy_current_buffer->yy_n_chars;
+ yytext_ptr = yy_c_buf_p = yy_current_buffer->yy_buf_pos;
+ yyin = yy_current_buffer->yy_input_file;
+ yy_hold_char = *yy_c_buf_p;
+ }
+
+
+#ifdef YY_USE_PROTOS
+YY_BUFFER_STATE yy_create_buffer( FILE *file, int size )
+#else
+YY_BUFFER_STATE yy_create_buffer( file, size )
+FILE *file;
+int size;
+#endif
+ {
+ YY_BUFFER_STATE b;
+
+ b = (YY_BUFFER_STATE) yy_flex_alloc( sizeof( struct yy_buffer_state ) );
+ if ( ! b )
+ YY_FATAL_ERROR( "out of dynamic memory in yy_create_buffer()" );
+
+ b->yy_buf_size = size;
+
+ /* yy_ch_buf has to be 2 characters longer than the size given because
+ * we need to put in 2 end-of-buffer characters.
+ */
+ b->yy_ch_buf = (char *) yy_flex_alloc( b->yy_buf_size + 2 );
+ if ( ! b->yy_ch_buf )
+ YY_FATAL_ERROR( "out of dynamic memory in yy_create_buffer()" );
+
+ b->yy_is_our_buffer = 1;
+
+ yy_init_buffer( b, file );
+
+ return b;
+ }
+
+
+#ifdef YY_USE_PROTOS
+void yy_delete_buffer( YY_BUFFER_STATE b )
+#else
+void yy_delete_buffer( b )
+YY_BUFFER_STATE b;
+#endif
+ {
+ if ( ! b )
+ return;
+
+ if ( b == yy_current_buffer )
+ yy_current_buffer = (YY_BUFFER_STATE) 0;
+
+ if ( b->yy_is_our_buffer )
+ yy_flex_free( (void *) b->yy_ch_buf );
+
+ yy_flex_free( (void *) b );
+ }
+
+
+
+#ifdef YY_USE_PROTOS
+void yy_init_buffer( YY_BUFFER_STATE b, FILE *file )
+#else
+void yy_init_buffer( b, file )
+YY_BUFFER_STATE b;
+FILE *file;
+#endif
+
+
+ {
+ yy_flush_buffer( b );
+
+ b->yy_input_file = file;
+ b->yy_fill_buffer = 1;
+
+#if defined (ACE_HAS_WINCE)
+ // Mimic the behavior as WinCE does not have isatty().
+ if ((file != 0) && (file == fileno(file))) {
+ b->yy_is_interactive = 1;
+ }
+ else {
+ b->yy_is_interactive = 0;
+ }
+#else
+ b->yy_is_interactive = file ? (isatty( fileno(file) ) > 0) : 0;
+#endif // ACE_HAS_WINCE
+
+ }
+
+
+#ifdef YY_USE_PROTOS
+void yy_flush_buffer( YY_BUFFER_STATE b )
+#else
+void yy_flush_buffer( b )
+YY_BUFFER_STATE b;
+#endif
+
+ {
+ if ( ! b )
+ return;
+
+ b->yy_n_chars = 0;
+
+ /* We always need two end-of-buffer characters. The first causes
+ * a transition to the end-of-buffer state. The second causes
+ * a jam in that state.
+ */
+ b->yy_ch_buf[0] = YY_END_OF_BUFFER_CHAR;
+ b->yy_ch_buf[1] = YY_END_OF_BUFFER_CHAR;
+
+ b->yy_buf_pos = &b->yy_ch_buf[0];
+
+ b->yy_at_bol = 1;
+ b->yy_buffer_status = YY_BUFFER_NEW;
+
+ if ( b == yy_current_buffer )
+ yy_load_buffer_state();
+ }
+
+
+#ifndef YY_NO_SCAN_BUFFER
+#ifdef YY_USE_PROTOS
+YY_BUFFER_STATE yy_scan_buffer( char *base, yy_size_t size )
+#else
+YY_BUFFER_STATE yy_scan_buffer( base, size )
+char *base;
+yy_size_t size;
+#endif
+ {
+ YY_BUFFER_STATE b;
+
+ if ( size < 2 ||
+ base[size-2] != YY_END_OF_BUFFER_CHAR ||
+ base[size-1] != YY_END_OF_BUFFER_CHAR )
+ /* They forgot to leave room for the EOB's. */
+ return 0;
+
+ b = (YY_BUFFER_STATE) yy_flex_alloc( sizeof( struct yy_buffer_state ) );
+ if ( ! b )
+ YY_FATAL_ERROR( "out of dynamic memory in yy_scan_buffer()" );
+
+ b->yy_buf_size = size - 2; /* "- 2" to take care of EOB's */
+ b->yy_buf_pos = b->yy_ch_buf = base;
+ b->yy_is_our_buffer = 0;
+ b->yy_input_file = 0;
+ b->yy_n_chars = b->yy_buf_size;
+ b->yy_is_interactive = 0;
+ b->yy_at_bol = 1;
+ b->yy_fill_buffer = 0;
+ b->yy_buffer_status = YY_BUFFER_NEW;
+
+ yy_switch_to_buffer( b );
+
+ return b;
+ }
+#endif
+
+
+#ifndef YY_NO_SCAN_STRING
+#ifdef YY_USE_PROTOS
+YY_BUFFER_STATE yy_scan_string( yyconst char *yy_str )
+#else
+YY_BUFFER_STATE yy_scan_string( yy_str )
+yyconst char *yy_str;
+#endif
+ {
+ int len;
+ for ( len = 0; yy_str[len]; ++len )
+ ;
+
+ return yy_scan_bytes( yy_str, len );
+ }
+#endif
+
+
+#ifndef YY_NO_SCAN_BYTES
+#ifdef YY_USE_PROTOS
+YY_BUFFER_STATE yy_scan_bytes( yyconst char *bytes, int len )
+#else
+YY_BUFFER_STATE yy_scan_bytes( bytes, len )
+yyconst char *bytes;
+int len;
+#endif
+ {
+ YY_BUFFER_STATE b;
+ char *buf;
+ yy_size_t n;
+ int i;
+
+ /* Get memory for full buffer, including space for trailing EOB's. */
+ n = len + 2;
+ buf = (char *) yy_flex_alloc( n );
+ if ( ! buf )
+ YY_FATAL_ERROR( "out of dynamic memory in yy_scan_bytes()" );
+
+ for ( i = 0; i < len; ++i )
+ buf[i] = bytes[i];
+
+ buf[len] = buf[len+1] = YY_END_OF_BUFFER_CHAR;
+
+ b = yy_scan_buffer( buf, n );
+ if ( ! b )
+ YY_FATAL_ERROR( "bad buffer in yy_scan_bytes()" );
+
+ /* It's okay to grow etc. this buffer, and we should throw it
+ * away when we're done.
+ */
+ b->yy_is_our_buffer = 1;
+
+ return b;
+ }
+#endif
+
+
+#ifndef YY_NO_PUSH_STATE
+#ifdef YY_USE_PROTOS
+static void yy_push_state( int new_state )
+#else
+static void yy_push_state( new_state )
+int new_state;
+#endif
+ {
+ if ( yy_start_stack_ptr >= yy_start_stack_depth )
+ {
+ yy_size_t new_size;
+
+ yy_start_stack_depth += YY_START_STACK_INCR;
+ new_size = yy_start_stack_depth * sizeof( int );
+
+ if ( ! yy_start_stack )
+ yy_start_stack = (int *) yy_flex_alloc( new_size );
+
+ else
+ yy_start_stack = (int *) yy_flex_realloc(
+ (void *) yy_start_stack, new_size );
+
+ if ( ! yy_start_stack )
+ YY_FATAL_ERROR(
+ "out of memory expanding start-condition stack" );
+ }
+
+ yy_start_stack[yy_start_stack_ptr++] = YY_START;
+
+ BEGIN(new_state);
+ }
+#endif
+
+
+#ifndef YY_NO_POP_STATE
+static void yy_pop_state()
+ {
+ if ( --yy_start_stack_ptr < 0 )
+ YY_FATAL_ERROR( "start-condition stack underflow" );
+
+ BEGIN(yy_start_stack[yy_start_stack_ptr]);
+ }
+#endif
+
+
+#ifndef YY_NO_TOP_STATE
+static int yy_top_state()
+ {
+ return yy_start_stack[yy_start_stack_ptr - 1];
+ }
+#endif
+
+#ifndef YY_EXIT_FAILURE
+#define YY_EXIT_FAILURE 2
+#endif
+
+#ifdef YY_USE_PROTOS
+static void yy_fatal_error( yyconst char msg[] )
+#else
+static void yy_fatal_error( msg )
+char msg[];
+#endif
+ {
+ (void) fprintf( stderr, "%s\n", msg );
+ exit( YY_EXIT_FAILURE );
+ }
+
+
+
+/* Redefine yyless() so it works in section 3 code. */
+
+#undef yyless
+#define yyless(n) \
+ do \
+ { \
+ /* Undo effects of setting up yytext. */ \
+ yytext[yyleng] = yy_hold_char; \
+ yy_c_buf_p = yytext + n; \
+ yy_hold_char = *yy_c_buf_p; \
+ *yy_c_buf_p = '\0'; \
+ yyleng = n; \
+ } \
+ while ( 0 )
+
+
+/* Internal utility routines. */
+
+#ifndef yytext_ptr
+#ifdef YY_USE_PROTOS
+static void yy_flex_strncpy( char *s1, yyconst char *s2, int n )
+#else
+static void yy_flex_strncpy( s1, s2, n )
+char *s1;
+yyconst char *s2;
+int n;
+#endif
+ {
+ register int i;
+ for ( i = 0; i < n; ++i )
+ s1[i] = s2[i];
+ }
+#endif
+
+#ifdef YY_NEED_STRLEN
+#ifdef YY_USE_PROTOS
+static int yy_flex_strlen( yyconst char *s )
+#else
+static int yy_flex_strlen( s )
+yyconst char *s;
+#endif
+ {
+ register int n;
+ for ( n = 0; s[n]; ++n )
+ ;
+
+ return n;
+ }
+#endif
+
+
+#ifdef YY_USE_PROTOS
+static void *yy_flex_alloc( yy_size_t size )
+#else
+static void *yy_flex_alloc( size )
+yy_size_t size;
+#endif
+ {
+ return (void *) malloc( size );
+ }
+
+#ifdef YY_USE_PROTOS
+static void *yy_flex_realloc( void *ptr, yy_size_t size )
+#else
+static void *yy_flex_realloc( ptr, size )
+void *ptr;
+yy_size_t size;
+#endif
+ {
+ /* The cast to (char *) in the following accommodates both
+ * implementations that use char* generic pointers, and those
+ * that use void* generic pointers. It works with the latter
+ * because both ANSI C and C++ allow castless assignment from
+ * any pointer type to void*, and deal with argument conversions
+ * as though doing an assignment.
+ */
+ return (void *) realloc( (char *) ptr, size );
+ }
+
+#ifdef YY_USE_PROTOS
+static void yy_flex_free( void *ptr )
+#else
+static void yy_flex_free( ptr )
+void *ptr;
+#endif
+ {
+ free( ptr );
+ }
+
+#if YY_MAIN
+int main()
+ {
+ yylex();
+ return 0;
+ }
+#endif
+//#line 122 "ETCL/ETCL.ll"
+
+
+const char*
+extract_string(char* str)
+{
+ char *t = str;
+ for (char * i = str + 1; *i != '\''; ++i, ++t)
+ {
+ if (*i == '\\')
+ {
+ ++i;
+ if (*i == 0)
+ return 0;
+ else if (*i == 't')
+ *t = '\t';
+ else if (*i == 'n')
+ *t = '\n';
+ else if (*i == '\\')
+ *t = '\\';
+ else
+ *t = *i;
+ continue;
+ }
+
+ *t = *i;
+ }
+
+ *t = '\0';
+ return str;
+}
+
+int
+yywrap (void)
+{
+ return 1;
+}
+
+TAO_END_VERSIONED_NAMESPACE_DECL
diff --git a/TAO/orbsvcs/orbsvcs/ETCL/ETCL_l.cpp.diff b/TAO/orbsvcs/orbsvcs/ETCL/ETCL_l.cpp.diff
new file mode 100644
index 00000000000..9709c130de2
--- /dev/null
+++ b/TAO/orbsvcs/orbsvcs/ETCL/ETCL_l.cpp.diff
@@ -0,0 +1,511 @@
+--- bison_gen\ETCL_l.cpp 2005-07-19 10:09:28.523824100 -0700
++++ ETCL_l.cpp 2005-07-19 09:47:22.138585300 -0700
+@@ -1,15 +1,14 @@
++
+ /* A lexical scanner generated by flex */
+
+ /* Scanner skeleton version:
+- * $Header$
++ * $Id$
+ */
+
+ #define FLEX_SCANNER
+ #define YY_FLEX_MAJOR_VERSION 2
+ #define YY_FLEX_MINOR_VERSION 5
+
+-#include <stdio.h>
+-
+
+ /* cfront 1.2 defines "c_plusplus" instead of "__cplusplus" */
+ #ifdef c_plusplus
+@@ -21,8 +20,7 @@
+
+ #ifdef __cplusplus
+
+-#include <stdlib.h>
+-#include <unistd.h>
++#include "ace/OS.h"
+
+ /* Use prototypes in function declarations. */
+ #define YY_USE_PROTOS
+@@ -262,8 +260,8 @@
+ #define YY_AT_BOL() (yy_current_buffer->yy_at_bol)
+
+
+-#define yywrap() 1
+-#define YY_SKIP_YYWRAP
++//#define yywrap() 1
++//#define YY_SKIP_YYWRAP
+ typedef unsigned char YY_CHAR;
+ FILE *yyin = (FILE *) 0, *yyout = (FILE *) 0;
+ typedef int yy_state_type;
+@@ -444,15 +442,15 @@
+ #define YY_MORE_ADJ 0
+ #define YY_RESTORE_YY_MORE_OFFSET
+ char *yytext;
+-#line 1 "ETCL.ll"
++//#line 1 "ETCL/ETCL.ll"
+ #define INITIAL 0
+-#line 4 "ETCL.ll"
++//#line 4 "ETCL/ETCL.ll"
+ // $Id$
+ // ========================================================================
+ //
+ // = LIBRARY
+ // orbsvcs/ECTL
+-//
++//
+ // = FILENAME
+ // ETCL.ll
+ //
+@@ -462,12 +460,12 @@
+ //
+ // ========================================================================
+
+-#include "ace/OS.h"
+-
++#include "ETCL_Interpreter.h"
+ #include "ETCL_Constraint.h"
+ #include "ETCL_y.h"
+
+-static const char * extract_string(char*);
++static const char* extract_string(char*);
++//static const char * extract_string(char*);
+
+ #define TAO_YY_LEX_DEBUG
+
+@@ -475,12 +473,11 @@
+ #define TAO_YY_LEX_DEBUG TAO_OS::fprintf(stderr, "%s\n", yytext)
+ #endif /* TAO_CONSTRAINT_DEBUG */
+
+-#define YY_DECL int TAO_ETCL_yylex (TAO_ETCL_YYSTYPE *lvalp, void* state)
++//#define YY_DECL int TAO_ETCL_yylex (TAO_ETCL_YYSTYPE *lvalp, void* state)
+
+ #define YY_BREAK
+ #define YY_NO_UNPUT
+
+-#line 484 "lex.yy.c"
+
+ /* Macros after this point can all be overridden by user definitions in
+ * section 1.
+@@ -494,10 +491,6 @@
+ #endif
+ #endif
+
+-#ifndef YY_NO_UNPUT
+-static void yyunput YY_PROTO(( int c, char *buf_ptr ));
+-#endif
+-
+ #ifndef yytext_ptr
+ static void yy_flex_strncpy YY_PROTO(( char *, yyconst char *, int ));
+ #endif
+@@ -556,11 +549,11 @@
+
+ /* Copy whatever the last rule matched to the standard output. */
+
+-#ifndef ECHO
++#ifndef TAO_ETCL_ECHO
+ /* This used to be an fputs(), but since the string might contain NUL's,
+ * we now use fwrite().
+ */
+-#define ECHO (void) fwrite( yytext, yyleng, 1, yyout )
++#define TAO_ETCL_ECHO (void) fwrite( yytext, yyleng, 1, yyout )
+ #endif
+
+ /* Gets input and stuffs it into "buf". number of characters read, or YY_NULL,
+@@ -628,13 +621,11 @@
+ YY_DECL
+ {
+ register yy_state_type yy_current_state;
+- register char *yy_cp, *yy_bp;
++ register char *yy_cp = 0;
++ register char *yy_bp = 0;
+ register int yy_act;
+
+-#line 50 "ETCL.ll"
+-
+-
+-#line 638 "lex.yy.c"
++//#line 50 "ETCL/ETCL.ll"
+
+ if ( yy_init )
+ {
+@@ -719,240 +710,239 @@
+
+ case 1:
+ YY_RULE_SETUP
+-#line 52 "ETCL.ll"
++//#line 52 "ETCL/ETCL.ll"
+ { TAO_YY_LEX_DEBUG; return TAO_ETCL_MIN; }
+ YY_BREAK
+ case 2:
+ YY_RULE_SETUP
+-#line 53 "ETCL.ll"
++//#line 53 "ETCL/ETCL.ll"
+ { TAO_YY_LEX_DEBUG; return TAO_ETCL_MAX; }
+ YY_BREAK
+ case 3:
+ YY_RULE_SETUP
+-#line 54 "ETCL.ll"
++//#line 54 "ETCL/ETCL.ll"
+ { TAO_YY_LEX_DEBUG; return TAO_ETCL_FIRST; }
+ YY_BREAK
+ case 4:
+ YY_RULE_SETUP
+-#line 55 "ETCL.ll"
++//#line 55 "ETCL/ETCL.ll"
+ { TAO_YY_LEX_DEBUG; return TAO_ETCL_RANDOM; }
+ YY_BREAK
+ case 5:
+ YY_RULE_SETUP
+-#line 56 "ETCL.ll"
++//#line 56 "ETCL/ETCL.ll"
+ { TAO_YY_LEX_DEBUG; return TAO_ETCL_WITH; }
+ YY_BREAK
+ case 6:
+ YY_RULE_SETUP
+-#line 57 "ETCL.ll"
++//#line 57 "ETCL/ETCL.ll"
+ { TAO_YY_LEX_DEBUG; return TAO_ETCL_EXIST; }
+ YY_BREAK
+ case 7:
+ YY_RULE_SETUP
+-#line 58 "ETCL.ll"
++//#line 58 "ETCL/ETCL.ll"
+ { TAO_YY_LEX_DEBUG; return TAO_ETCL_NOT; }
+ YY_BREAK
+ case 8:
+ YY_RULE_SETUP
+-#line 59 "ETCL.ll"
++//#line 59 "ETCL/ETCL.ll"
+ { TAO_YY_LEX_DEBUG; return TAO_ETCL_AND; }
+ YY_BREAK
+ case 9:
+ YY_RULE_SETUP
+-#line 60 "ETCL.ll"
++//#line 60 "ETCL/ETCL.ll"
+ { TAO_YY_LEX_DEBUG; return TAO_ETCL_OR; }
+ YY_BREAK
+ case 10:
+ YY_RULE_SETUP
+-#line 61 "ETCL.ll"
++//#line 61 "ETCL/ETCL.ll"
+ { TAO_YY_LEX_DEBUG; return TAO_ETCL_IN; }
+ YY_BREAK
+ case 11:
+ YY_RULE_SETUP
+-#line 62 "ETCL.ll"
++//#line 62 "ETCL/ETCL.ll"
+ { TAO_YY_LEX_DEBUG; return TAO_ETCL_TWIDDLE; }
+ YY_BREAK
+ case 12:
+ YY_RULE_SETUP
+-#line 63 "ETCL.ll"
++//#line 63 "ETCL/ETCL.ll"
+ { TAO_YY_LEX_DEBUG; return TAO_ETCL_PLUS; }
+ YY_BREAK
+ case 13:
+ YY_RULE_SETUP
+-#line 64 "ETCL.ll"
++//#line 64 "ETCL/ETCL.ll"
+ { TAO_YY_LEX_DEBUG; return TAO_ETCL_MINUS; }
+ YY_BREAK
+ case 14:
+ YY_RULE_SETUP
+-#line 65 "ETCL.ll"
++//#line 65 "ETCL/ETCL.ll"
+ { TAO_YY_LEX_DEBUG; return TAO_ETCL_MULT; }
+ YY_BREAK
+ case 15:
+ YY_RULE_SETUP
+-#line 66 "ETCL.ll"
++//#line 66 "ETCL/ETCL.ll"
+ { TAO_YY_LEX_DEBUG; return TAO_ETCL_DIV; }
+ YY_BREAK
+ case 16:
+ YY_RULE_SETUP
+-#line 67 "ETCL.ll"
++//#line 67 "ETCL/ETCL.ll"
+ { TAO_YY_LEX_DEBUG; return TAO_ETCL_LT; }
+ YY_BREAK
+ case 17:
+ YY_RULE_SETUP
+-#line 68 "ETCL.ll"
++//#line 68 "ETCL/ETCL.ll"
+ { TAO_YY_LEX_DEBUG; return TAO_ETCL_LE; }
+ YY_BREAK
+ case 18:
+ YY_RULE_SETUP
+-#line 69 "ETCL.ll"
++//#line 69 "ETCL/ETCL.ll"
+ { TAO_YY_LEX_DEBUG; return TAO_ETCL_GT; }
+ YY_BREAK
+ case 19:
+ YY_RULE_SETUP
+-#line 70 "ETCL.ll"
++//#line 70 "ETCL/ETCL.ll"
+ { TAO_YY_LEX_DEBUG; return TAO_ETCL_GE; }
+ YY_BREAK
+ case 20:
+ YY_RULE_SETUP
+-#line 71 "ETCL.ll"
++//#line 71 "ETCL/ETCL.ll"
+ { TAO_YY_LEX_DEBUG; return TAO_ETCL_EQ; }
+ YY_BREAK
+ case 21:
+ YY_RULE_SETUP
+-#line 72 "ETCL.ll"
++//#line 72 "ETCL/ETCL.ll"
+ { TAO_YY_LEX_DEBUG; return TAO_ETCL_NE; }
+ YY_BREAK
+ case 22:
+ YY_RULE_SETUP
+-#line 73 "ETCL.ll"
++//#line 73 "ETCL/ETCL.ll"
+ { TAO_YY_LEX_DEBUG; return TAO_ETCL_LPAREN; }
+ YY_BREAK
+ case 23:
+ YY_RULE_SETUP
+-#line 74 "ETCL.ll"
++//#line 74 "ETCL/ETCL.ll"
+ { TAO_YY_LEX_DEBUG; return TAO_ETCL_RPAREN; }
+ YY_BREAK
+ case 24:
+ YY_RULE_SETUP
+-#line 75 "ETCL.ll"
++//#line 75 "ETCL/ETCL.ll"
+ { TAO_YY_LEX_DEBUG; return TAO_ETCL_DOLLAR; }
+ YY_BREAK
+ case 25:
+ YY_RULE_SETUP
+-#line 76 "ETCL.ll"
++//#line 76 "ETCL/ETCL.ll"
+ { TAO_YY_LEX_DEBUG; return TAO_ETCL_DOT; }
+ YY_BREAK
+ case 26:
+ YY_RULE_SETUP
+-#line 77 "ETCL.ll"
++//#line 77 "ETCL/ETCL.ll"
+ { TAO_YY_LEX_DEBUG; return TAO_ETCL_DEFAULT; }
+ YY_BREAK
+ case 27:
+ YY_RULE_SETUP
+-#line 78 "ETCL.ll"
++//#line 78 "ETCL/ETCL.ll"
+ { TAO_YY_LEX_DEBUG; return TAO_ETCL_DISCRIMINANT; }
+ YY_BREAK
+ case 28:
+ YY_RULE_SETUP
+-#line 79 "ETCL.ll"
++//#line 79 "ETCL/ETCL.ll"
+ { TAO_YY_LEX_DEBUG; return TAO_ETCL_TYPE_ID; }
+ YY_BREAK
+ case 29:
+ YY_RULE_SETUP
+-#line 80 "ETCL.ll"
++//#line 80 "ETCL/ETCL.ll"
+ { TAO_YY_LEX_DEBUG; return TAO_ETCL_REPOS_ID; }
+ YY_BREAK
+ case 30:
+ YY_RULE_SETUP
+-#line 81 "ETCL.ll"
++//#line 81 "ETCL/ETCL.ll"
+ { TAO_YY_LEX_DEBUG; return TAO_ETCL_LENGTH; }
+ YY_BREAK
+ case 31:
+ YY_RULE_SETUP
+-#line 82 "ETCL.ll"
++//#line 82 "ETCL/ETCL.ll"
+ { TAO_YY_LEX_DEBUG; return TAO_ETCL_LBRA; }
+ YY_BREAK
+ case 32:
+ YY_RULE_SETUP
+-#line 83 "ETCL.ll"
++//#line 83 "ETCL/ETCL.ll"
+ { TAO_YY_LEX_DEBUG; return TAO_ETCL_RBRA; }
+ YY_BREAK
+ case 33:
+ YY_RULE_SETUP
+-#line 84 "ETCL.ll"
+-{
+- lvalp->constraint =
++//#line 84 "ETCL/ETCL.ll"
++{
++ yylval.constraint =
+ new TAO_ETCL_Literal_Constraint ((CORBA::Boolean) 1);
+ TAO_YY_LEX_DEBUG; return TAO_ETCL_BOOLEAN;
+ }
+ YY_BREAK
+ case 34:
+ YY_RULE_SETUP
+-#line 89 "ETCL.ll"
+-{
+- lvalp->constraint =
++//#line 89 "ETCL/ETCL.ll"
++{
++ yylval.constraint =
+ new TAO_ETCL_Literal_Constraint ((CORBA::Boolean) 0);
+ TAO_YY_LEX_DEBUG; return TAO_ETCL_BOOLEAN;
+ }
+ YY_BREAK
+ case 35:
+ YY_RULE_SETUP
+-#line 94 "ETCL.ll"
+-{
+- lvalp->constraint =
++//#line 94 "ETCL/ETCL.ll"
++{
++ yylval.constraint =
+ new TAO_ETCL_Literal_Constraint (ACE_OS::atoi (yytext));
+- TAO_YY_LEX_DEBUG; return TAO_ETCL_INTEGER;
++ TAO_YY_LEX_DEBUG; return TAO_ETCL_INTEGER;
+ }
+ YY_BREAK
+ case 36:
+ YY_RULE_SETUP
+-#line 99 "ETCL.ll"
++//#line 99 "ETCL/ETCL.ll"
+ {
+ double v;
+- sscanf (yytext, "%lf", &v);
+- lvalp->constraint =
++ sscanf (yytext, "%lf", &v);
++ yylval.constraint =
+ new TAO_ETCL_Literal_Constraint (v);
+- TAO_YY_LEX_DEBUG; return TAO_ETCL_FLOAT;
++ TAO_YY_LEX_DEBUG; return TAO_ETCL_FLOAT;
+ }
+ YY_BREAK
+ case 37:
+ YY_RULE_SETUP
+-#line 106 "ETCL.ll"
+-{
+- lvalp->constraint =
+- new TAO_ETCL_Literal_Constraint (extract_string (yytext));
+- TAO_YY_LEX_DEBUG; return TAO_ETCL_STRING;
++//#line 106 "ETCL/ETCL.ll"
++{
++ yylval.constraint =
++ new TAO_ETCL_Literal_Constraint (extract_string(yytext));
++ TAO_YY_LEX_DEBUG; return TAO_ETCL_STRING;
+ }
+ YY_BREAK
+ case 38:
+ YY_RULE_SETUP
+-#line 111 "ETCL.ll"
+-{
+- lvalp->constraint =
++//#line 111 "ETCL/ETCL.ll"
++{
++ yylval.constraint =
+ new TAO_ETCL_Identifier (yytext);
+- TAO_YY_LEX_DEBUG; return TAO_ETCL_IDENT;
++ TAO_YY_LEX_DEBUG; return TAO_ETCL_IDENT;
+ }
+ YY_BREAK
+ case 39:
+ YY_RULE_SETUP
+-#line 116 "ETCL.ll"
+-{
++//#line 116 "ETCL/ETCL.ll"
++{
+ TAO_YY_LEX_DEBUG; break; // Ignore
+ }
+ YY_BREAK
+ case 40:
+ YY_RULE_SETUP
+-#line 119 "ETCL.ll"
+-{
++//#line 119 "ETCL/ETCL.ll"
++{
+ TAO_YY_LEX_DEBUG; break; // @@ TODO
+ }
+ YY_BREAK
+ case 41:
+ YY_RULE_SETUP
+-#line 122 "ETCL.ll"
+-ECHO;
++//#line 122 "ETCL/ETCL.ll"
++TAO_ETCL_ECHO;
+ YY_BREAK
+-#line 956 "lex.yy.c"
+ case YY_STATE_EOF(INITIAL):
+ yyterminate();
+
+@@ -1288,7 +1278,7 @@
+ return yy_is_jam ? 0 : yy_current_state;
+ }
+
+-
++#if 0
+ #ifndef YY_NO_UNPUT
+ #ifdef YY_USE_PROTOS
+ static void yyunput( int c, register char *yy_bp )
+@@ -1332,7 +1322,7 @@
+ yy_c_buf_p = yy_cp;
+ }
+ #endif /* ifndef YY_NO_UNPUT */
+-
++#endif /* 0 */
+
+ #ifdef __cplusplus
+ static int yyinput()
+@@ -1406,6 +1396,11 @@
+ return c;
+ }
+
++void yyflush_current_buffer (void)
++{
++ YY_FLUSH_BUFFER;
++}
++
+
+ #ifdef YY_USE_PROTOS
+ void yyrestart( FILE *input_file )
+@@ -1516,11 +1511,6 @@
+ }
+
+
+-#ifndef YY_ALWAYS_INTERACTIVE
+-#ifndef YY_NEVER_INTERACTIVE
+-extern int isatty YY_PROTO(( int ));
+-#endif
+-#endif
+
+ #ifdef YY_USE_PROTOS
+ void yy_init_buffer( YY_BUFFER_STATE b, FILE *file )
+@@ -1537,15 +1527,18 @@
+ b->yy_input_file = file;
+ b->yy_fill_buffer = 1;
+
+-#if YY_ALWAYS_INTERACTIVE
+- b->yy_is_interactive = 1;
+-#else
+-#if YY_NEVER_INTERACTIVE
+- b->yy_is_interactive = 0;
++#if defined (ACE_HAS_WINCE)
++ // Mimic the behavior as WinCE does not have isatty().
++ if ((file != 0) && (file == fileno(file))) {
++ b->yy_is_interactive = 1;
++ }
++ else {
++ b->yy_is_interactive = 0;
++ }
+ #else
+ b->yy_is_interactive = file ? (isatty( fileno(file) ) > 0) : 0;
+-#endif
+-#endif
++#endif // ACE_HAS_WINCE
++
+ }
+
+
+@@ -1838,7 +1831,7 @@
+ return 0;
+ }
+ #endif
+-#line 122 "ETCL.ll"
++//#line 122 "ETCL/ETCL.ll"
+
+
+ const char*
diff --git a/TAO/orbsvcs/orbsvcs/ETCL/ETCL_y.cpp b/TAO/orbsvcs/orbsvcs/ETCL/ETCL_y.cpp
new file mode 100644
index 00000000000..1c07ea5d3a7
--- /dev/null
+++ b/TAO/orbsvcs/orbsvcs/ETCL/ETCL_y.cpp
@@ -0,0 +1,1295 @@
+// $Id$
+
+/* A Bison parser, made from ETCL/ETCL.yy
+ by GNU Bison version 1.28 */
+
+#define YYBISON 1 /* Identify Bison output. */
+
+#define TAO_ETCL_GT 257
+#define TAO_ETCL_GE 258
+#define TAO_ETCL_LT 259
+#define TAO_ETCL_LE 260
+#define TAO_ETCL_EQ 261
+#define TAO_ETCL_NE 262
+#define TAO_ETCL_EXIST 263
+#define TAO_ETCL_DEFAULT 264
+#define TAO_ETCL_AND 265
+#define TAO_ETCL_OR 266
+#define TAO_ETCL_NOT 267
+#define TAO_ETCL_IN 268
+#define TAO_ETCL_TWIDDLE 269
+#define TAO_ETCL_BOOLEAN 270
+#define TAO_ETCL_PLUS 271
+#define TAO_ETCL_MINUS 272
+#define TAO_ETCL_MULT 273
+#define TAO_ETCL_DIV 274
+#define TAO_ETCL_UMINUS 275
+#define TAO_ETCL_INTEGER 276
+#define TAO_ETCL_FLOAT 277
+#define TAO_ETCL_STRING 278
+#define TAO_ETCL_RPAREN 279
+#define TAO_ETCL_LPAREN 280
+#define TAO_ETCL_RBRA 281
+#define TAO_ETCL_LBRA 282
+#define TAO_ETCL_IDENT 283
+#define TAO_ETCL_UNSIGNED 284
+#define TAO_ETCL_SIGNED 285
+#define TAO_ETCL_DOUBLE 286
+#define TAO_ETCL_CONSTRAINT 287
+#define TAO_ETCL_COMPONENT 288
+#define TAO_ETCL_WITH 289
+#define TAO_ETCL_MAX 290
+#define TAO_ETCL_MIN 291
+#define TAO_ETCL_FIRST 292
+#define TAO_ETCL_RANDOM 293
+#define TAO_ETCL_DOLLAR 294
+#define TAO_ETCL_DOT 295
+#define TAO_ETCL_DISCRIMINANT 296
+#define TAO_ETCL_LENGTH 297
+#define TAO_ETCL_TYPE_ID 298
+#define TAO_ETCL_REPOS_ID 299
+
+//#line 1 "ETCL/ETCL.yy"
+
+// $Id$
+// ========================================================================
+//
+// = LIBRARY
+// orbsvcs / Extended Trader Constraint Language parser.
+//
+// = FILENAME
+// ETCL.yy
+//
+// = AUTHOR
+// Carlos O'Ryan <coryan@uci.edu> based on previous work by
+// Seth Widoff <sbw1@cs.wustl.edu>
+//
+// ========================================================================
+
+#include "orbsvcs/ETCL/ETCL_y.h"
+#include "orbsvcs/ETCL/ETCL_Constraint.h"
+#include "orbsvcs/ETCL/ETCL_Interpreter.h"
+
+TAO_BEGIN_VERSIONED_NAMESPACE_DECL
+
+extern int yylex (void);
+extern void yyflush_current_buffer (void);
+
+static void yyerror (const char *)
+{
+ // @@ TODO
+ // Ignore error messages
+}
+
+TAO_END_VERSIONED_NAMESPACE_DECL
+
+#include <stdio.h>
+
+TAO_BEGIN_VERSIONED_NAMESPACE_DECL
+
+#ifndef __cplusplus
+#ifndef __STDC__
+#define const
+#endif
+#endif
+
+
+
+#define YYFINAL 114
+#define YYFLAG -32768
+#define YYNTBASE 46
+
+#define YYTRANSLATE(x) ((unsigned)(x) <= 299 ? yytranslate[x] : 65)
+
+static const char yytranslate[] = { 0,
+ 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
+ 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
+ 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
+ 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
+ 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
+ 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
+ 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
+ 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
+ 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
+ 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
+ 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
+ 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
+ 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
+ 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
+ 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
+ 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
+ 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
+ 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
+ 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
+ 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
+ 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
+ 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
+ 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
+ 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
+ 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
+ 2, 2, 2, 2, 2, 1, 3, 4, 5, 6,
+ 7, 8, 9, 10, 11, 12, 13, 14, 15, 16,
+ 17, 18, 19, 20, 21, 22, 23, 24, 25, 26,
+ 27, 28, 29, 30, 31, 32, 33, 34, 35, 36,
+ 37, 38, 39, 40, 41, 42, 43, 44, 45
+};
+
+#if YYDEBUG != 0
+static const short yyprhs[] = { 0,
+ 0, 2, 4, 7, 10, 13, 15, 17, 21, 23,
+ 27, 29, 33, 37, 41, 45, 49, 53, 55, 59,
+ 64, 66, 70, 72, 76, 80, 82, 86, 90, 92,
+ 95, 97, 101, 103, 106, 109, 111, 114, 117, 119,
+ 121, 124, 128, 132, 135, 137, 138, 141, 144, 146,
+ 148, 149, 152, 154, 156, 159, 161, 163, 165, 167,
+ 169, 171, 176, 181, 184, 189, 190, 192, 195, 198
+};
+
+static const short yyrhs[] = { 48,
+ 0, 47, 0, 37, 48, 0, 36, 48, 0, 35,
+ 48, 0, 38, 0, 39, 0, 48, 12, 49, 0,
+ 49, 0, 49, 11, 50, 0, 50, 0, 51, 7,
+ 51, 0, 51, 8, 51, 0, 51, 3, 51, 0,
+ 51, 4, 51, 0, 51, 5, 51, 0, 51, 6,
+ 51, 0, 51, 0, 52, 14, 57, 0, 52, 14,
+ 40, 57, 0, 52, 0, 53, 15, 53, 0, 53,
+ 0, 53, 17, 54, 0, 53, 18, 54, 0, 54,
+ 0, 54, 19, 55, 0, 54, 20, 55, 0, 55,
+ 0, 13, 56, 0, 56, 0, 26, 48, 25, 0,
+ 22, 0, 17, 22, 0, 18, 22, 0, 23, 0,
+ 17, 23, 0, 18, 23, 0, 24, 0, 16, 0,
+ 9, 29, 0, 9, 40, 57, 0, 10, 40, 57,
+ 0, 40, 57, 0, 29, 0, 0, 41, 59, 0,
+ 29, 58, 0, 60, 0, 61, 0, 0, 41, 59,
+ 0, 60, 0, 61, 0, 29, 58, 0, 43, 0,
+ 42, 0, 44, 0, 45, 0, 62, 0, 63, 0,
+ 28, 22, 27, 58, 0, 26, 29, 25, 58, 0,
+ 22, 58, 0, 26, 64, 25, 58, 0, 0, 22,
+ 0, 17, 22, 0, 18, 22, 0, 24, 0
+};
+
+#endif
+
+#if YYDEBUG != 0
+static const short yyrline[] = { 0,
+ 92, 93, 96, 98, 100, 102, 104, 108, 110, 113,
+ 115, 118, 120, 122, 124, 126, 128, 130, 133, 135,
+ 137, 140, 142, 145, 147, 149, 152, 154, 156, 159,
+ 161, 164, 166, 168, 170, 172, 174, 176, 178, 180,
+ 182, 184, 186, 188, 190, 194, 196, 199, 202, 203,
+ 206, 208, 211, 212, 215, 217, 219, 221, 223, 225,
+ 226, 229, 233, 237, 241, 245, 247, 249, 251, 253
+};
+#endif
+
+
+#if YYDEBUG != 0 || defined (YYERROR_VERBOSE)
+
+static const char * const yytname[] = { "$","error","$undefined.","TAO_ETCL_GT",
+"TAO_ETCL_GE","TAO_ETCL_LT","TAO_ETCL_LE","TAO_ETCL_EQ","TAO_ETCL_NE","TAO_ETCL_EXIST",
+"TAO_ETCL_DEFAULT","TAO_ETCL_AND","TAO_ETCL_OR","TAO_ETCL_NOT","TAO_ETCL_IN",
+"TAO_ETCL_TWIDDLE","TAO_ETCL_BOOLEAN","TAO_ETCL_PLUS","TAO_ETCL_MINUS","TAO_ETCL_MULT",
+"TAO_ETCL_DIV","TAO_ETCL_UMINUS","TAO_ETCL_INTEGER","TAO_ETCL_FLOAT","TAO_ETCL_STRING",
+"TAO_ETCL_RPAREN","TAO_ETCL_LPAREN","TAO_ETCL_RBRA","TAO_ETCL_LBRA","TAO_ETCL_IDENT",
+"TAO_ETCL_UNSIGNED","TAO_ETCL_SIGNED","TAO_ETCL_DOUBLE","TAO_ETCL_CONSTRAINT",
+"TAO_ETCL_COMPONENT","TAO_ETCL_WITH","TAO_ETCL_MAX","TAO_ETCL_MIN","TAO_ETCL_FIRST",
+"TAO_ETCL_RANDOM","TAO_ETCL_DOLLAR","TAO_ETCL_DOT","TAO_ETCL_DISCRIMINANT","TAO_ETCL_LENGTH",
+"TAO_ETCL_TYPE_ID","TAO_ETCL_REPOS_ID","constraint","preference","bool_or","bool_and",
+"bool_compare","expr_in","expr_twiddle","expr","term","factor_not","factor",
+"component","component_ext","component_dot","component_array","component_assoc",
+"component_pos","union_pos","union_val", NULL
+};
+#endif
+
+static const short yyr1[] = { 0,
+ 46, 46, 47, 47, 47, 47, 47, 48, 48, 49,
+ 49, 50, 50, 50, 50, 50, 50, 50, 51, 51,
+ 51, 52, 52, 53, 53, 53, 54, 54, 54, 55,
+ 55, 56, 56, 56, 56, 56, 56, 56, 56, 56,
+ 56, 56, 56, 56, 56, 57, 57, 57, 57, 57,
+ 58, 58, 58, 58, 59, 59, 59, 59, 59, 59,
+ 59, 60, 61, 62, 63, 64, 64, 64, 64, 64
+};
+
+static const short yyr2[] = { 0,
+ 1, 1, 2, 2, 2, 1, 1, 3, 1, 3,
+ 1, 3, 3, 3, 3, 3, 3, 1, 3, 4,
+ 1, 3, 1, 3, 3, 1, 3, 3, 1, 2,
+ 1, 3, 1, 2, 2, 1, 2, 2, 1, 1,
+ 2, 3, 3, 2, 1, 0, 2, 2, 1, 1,
+ 0, 2, 1, 1, 2, 1, 1, 1, 1, 1,
+ 1, 4, 4, 2, 4, 0, 1, 2, 2, 1
+};
+
+static const short yydefact[] = { 0,
+ 0, 0, 0, 40, 0, 0, 33, 36, 39, 0,
+ 45, 0, 0, 0, 6, 7, 46, 2, 1, 9,
+ 11, 18, 21, 23, 26, 29, 31, 41, 46, 46,
+ 30, 34, 37, 35, 38, 0, 5, 4, 3, 0,
+ 0, 51, 0, 44, 49, 50, 0, 0, 0, 0,
+ 0, 0, 0, 0, 46, 0, 0, 0, 0, 0,
+ 42, 43, 32, 0, 0, 0, 48, 53, 54, 51,
+ 66, 51, 57, 56, 58, 59, 47, 60, 61, 8,
+ 10, 14, 15, 16, 17, 12, 13, 46, 19, 22,
+ 24, 25, 27, 28, 51, 51, 52, 64, 0, 0,
+ 67, 70, 0, 55, 20, 63, 62, 68, 69, 51,
+ 65, 0, 0, 0
+};
+
+static const short yydefgoto[] = { 112,
+ 18, 19, 20, 21, 22, 23, 24, 25, 26, 27,
+ 44, 67, 77, 68, 69, 78, 79, 103
+};
+
+static const short yypact[] = { 41,
+ -13, -39, 94,-32768, 38, 46,-32768,-32768,-32768, 73,
+-32768, 73, 73, 73,-32768,-32768, -9,-32768, -6, 7,
+-32768, 121, -5, 19, 55,-32768,-32768,-32768, -9, -9,
+-32768,-32768,-32768,-32768,-32768, 21, -6, -6, -6, 6,
+ 25, -2, -1,-32768,-32768,-32768, 73, 73, 73, 73,
+ 73, 73, 73, 73, -18, 73, 73, 73, 73, 73,
+-32768,-32768,-32768, 27, 29, -1,-32768,-32768,-32768, -2,
+ 31, -2,-32768,-32768,-32768,-32768,-32768,-32768,-32768, 7,
+-32768,-32768,-32768,-32768,-32768,-32768,-32768, -9,-32768, 67,
+ 55, 55,-32768,-32768, -2, -2,-32768,-32768, 44, 50,
+-32768,-32768, 69,-32768,-32768,-32768,-32768,-32768,-32768, -2,
+-32768, 98, 100,-32768
+};
+
+static const short yypgoto[] = {-32768,
+-32768, 95, 54, 58, 86,-32768, 59, 30, 33, 111,
+ -26, -65, 53, -17, -15,-32768,-32768,-32768
+};
+
+
+#define YYLAST 140
+
+
+static const short yytable[] = { 45,
+ 30, 46, 61, 62, 98, 47, 104, 40, 55, 41,
+ 42, 45, 45, 46, 46, 28, 40, 48, 41, 42,
+ 70, 88, 43, 40, 71, 41, 29, 72, 89, 106,
+ 107, 43, 47, 56, 64, 57, 58, 45, 66, 46,
+ 73, 74, 75, 76, 111, 63, 65, 99, 100, 1,
+ 2, 95, 101, 3, 102, 96, 4, 5, 6, 32,
+ 33, 105, 7, 8, 9, 108, 10, 34, 35, 11,
+ 45, 109, 46, 59, 60, 12, 13, 14, 15, 16,
+ 17, 1, 2, 57, 58, 3, 91, 92, 4, 5,
+ 6, 93, 94, 110, 7, 8, 9, 113, 10, 114,
+ 80, 11, 1, 2, 36, 81, 37, 38, 39, 4,
+ 5, 6, 17, 31, 90, 7, 8, 9, 97, 10,
+ 0, 0, 11, 49, 50, 51, 52, 53, 54, 0,
+ 0, 0, 0, 17, 82, 83, 84, 85, 86, 87
+};
+
+static const short yycheck[] = { 17,
+ 40, 17, 29, 30, 70, 12, 72, 26, 14, 28,
+ 29, 29, 30, 29, 30, 29, 26, 11, 28, 29,
+ 22, 40, 41, 26, 26, 28, 40, 29, 55, 95,
+ 96, 41, 12, 15, 29, 17, 18, 55, 41, 55,
+ 42, 43, 44, 45, 110, 25, 22, 17, 18, 9,
+ 10, 25, 22, 13, 24, 27, 16, 17, 18, 22,
+ 23, 88, 22, 23, 24, 22, 26, 22, 23, 29,
+ 88, 22, 88, 19, 20, 35, 36, 37, 38, 39,
+ 40, 9, 10, 17, 18, 13, 57, 58, 16, 17,
+ 18, 59, 60, 25, 22, 23, 24, 0, 26, 0,
+ 47, 29, 9, 10, 10, 48, 12, 13, 14, 16,
+ 17, 18, 40, 3, 56, 22, 23, 24, 66, 26,
+ -1, -1, 29, 3, 4, 5, 6, 7, 8, -1,
+ -1, -1, -1, 40, 49, 50, 51, 52, 53, 54
+};
+/* -*-C-*- Note some compilers choke on comments on `//#line' lines. */
+//#line 3 "/pkg/gnu/share/bison.simple"
+/* This file comes from bison-1.28. */
+
+/* Skeleton output parser for bison,
+ Copyright (C) 1984, 1989, 1990 Free Software Foundation, Inc.
+
+ This program is free software; you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 2, or (at your option)
+ any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program; if not, write to the Free Software
+ Foundation, Inc., 59 Temple Place - Suite 330,
+ Boston, MA 02111-1307, USA. */
+
+/* As a special exception, when this file is copied by Bison into a
+ Bison output file, you may use that output file without restriction.
+ This special exception was added by the Free Software Foundation
+ in version 1.24 of Bison. */
+
+/* This is the parser code that is written into each bison parser
+ when the %semantic_parser declaration is not specified in the grammar.
+ It was written by Richard Stallman by simplifying the hairy parser
+ used when %semantic_parser is specified. */
+
+TAO_END_VERSIONED_NAMESPACE_DECL
+
+#ifndef YYSTACK_USE_ALLOCA
+#ifdef alloca
+#define YYSTACK_USE_ALLOCA
+#else /* alloca not defined */
+#ifdef __GNUC__
+#define YYSTACK_USE_ALLOCA
+#define alloca __builtin_alloca
+#else /* not GNU C. */
+#if (!defined (__STDC__) && defined (sparc)) || defined (__sparc__) || defined (__sparc) || defined (__sgi) || (defined (__sun) && defined (__i386))
+#define YYSTACK_USE_ALLOCA
+#include <alloca.h>
+#else /* not sparc */
+/* We think this test detects Watcom and Microsoft C. */
+/* This used to test MSDOS, but that is a bad idea
+ since that symbol is in the user namespace. */
+#if (defined (_MSDOS) || defined (_MSDOS_)) && !defined (__TURBOC__)
+#if 0 /* No need for malloc.h, which pollutes the namespace;
+ instead, just don't use alloca. */
+#include <malloc.h>
+#endif
+#else /* not MSDOS, or __TURBOC__ */
+#if defined(_AIX)
+/* I don't know what this was needed for, but it pollutes the namespace.
+ So I turned it off. rms, 2 May 1997. */
+/* #include <malloc.h> */
+ #pragma alloca
+#define YYSTACK_USE_ALLOCA
+#else /* not MSDOS, or __TURBOC__, or _AIX */
+#if 0
+#ifdef __hpux /* haible@ilog.fr says this works for HPUX 9.05 and up,
+ and on HPUX 10. Eventually we can turn this on. */
+#define YYSTACK_USE_ALLOCA
+#define alloca __builtin_alloca
+#endif /* __hpux */
+#endif
+#endif /* not _AIX */
+#endif /* not MSDOS, or __TURBOC__ */
+#endif /* not sparc */
+#endif /* not GNU C */
+#endif /* alloca not defined */
+#endif /* YYSTACK_USE_ALLOCA not defined */
+
+#ifdef YYSTACK_USE_ALLOCA
+#define YYSTACK_ALLOC alloca
+#else
+#define YYSTACK_ALLOC malloc
+#endif
+
+/* Note: there must be only one dollar sign in this file.
+ It is replaced by the list of actions, each action
+ as one case of the switch. */
+
+#define yyerrok (yyerrstatus = 0)
+#define yyclearin (yychar = YYEMPTY)
+#define YYEMPTY -2
+#define YYEOF 0
+#define YYACCEPT goto yyacceptlab
+#define YYABORT goto yyabortlab
+#define YYERROR goto yyerrlab1
+/* Like YYERROR except do call yyerror.
+ This remains here temporarily to ease the
+ transition to the new meaning of YYERROR, for GCC.
+ Once GCC version 2 has supplanted version 1, this can go. */
+#define YYFAIL goto yyerrlab
+#define YYRECOVERING() (!!yyerrstatus)
+#define YYBACKUP(token, value) \
+do \
+ if (yychar == YYEMPTY && yylen == 1) \
+ { yychar = (token), yylval = (value); \
+ yychar1 = YYTRANSLATE (yychar); \
+ YYPOPSTACK; \
+ goto yybackup; \
+ } \
+ else \
+ { yyerror ("syntax error: cannot back up"); YYERROR; } \
+while (0)
+
+#define YYTERROR 1
+#define YYERRCODE 256
+
+#ifndef YYPURE
+#define YYLEX yylex()
+#endif
+
+#ifdef YYPURE
+#ifdef YYLSP_NEEDED
+#ifdef YYLEX_PARAM
+#define YYLEX yylex(&yylval, &yylloc, YYLEX_PARAM)
+#else
+#define YYLEX yylex(&yylval, &yylloc)
+#endif
+#else /* not YYLSP_NEEDED */
+#ifdef YYLEX_PARAM
+#define YYLEX yylex(&yylval, YYLEX_PARAM)
+#else
+#define YYLEX yylex(&yylval)
+#endif
+#endif /* not YYLSP_NEEDED */
+#endif
+
+TAO_BEGIN_VERSIONED_NAMESPACE_DECL
+
+/* If nonreentrant, generate the variables here */
+
+#ifndef YYPURE
+
+int yychar; /* the lookahead symbol */
+YYSTYPE yylval; /* the semantic value of the */
+ /* lookahead symbol */
+YYSTYPE yyval; /* the variable used to return */
+ /* semantic values from the action */
+ /* routines */
+
+
+#ifdef YYLSP_NEEDED
+YYLTYPE yylloc; /* location data for the lookahead */
+ /* symbol */
+#endif
+
+int yynerrs; /* number of parse errors so far */
+#endif /* not YYPURE */
+
+#if YYDEBUG != 0
+int yydebug; /* nonzero means print parse trace */
+/* Since this is uninitialized, it does not stop multiple parsers
+ from coexisting. */
+#endif
+
+/* YYINITDEPTH indicates the initial size of the parser's stacks */
+
+#ifndef YYINITDEPTH
+#define YYINITDEPTH 200
+#endif
+
+/* YYMAXDEPTH is the maximum size the stacks can grow to
+ (effective only if the built-in stack extension method is used). */
+
+#if YYMAXDEPTH == 0
+#undef YYMAXDEPTH
+#endif
+
+#ifndef YYMAXDEPTH
+#define YYMAXDEPTH 10000
+#endif
+
+/* Define __yy_memcpy. Note that the size argument
+ should be passed with type unsigned int, because that is what the non-GCC
+ definitions require. With GCC, __builtin_memcpy takes an arg
+ of type size_t, but it can handle unsigned int. */
+
+#if __GNUC__ > 1 /* GNU C and GNU C++ define this. */
+#define __yy_memcpy(TO,FROM,COUNT) __builtin_memcpy(TO,FROM,COUNT)
+#else /* not GNU C or C++ */
+#ifndef __cplusplus
+
+/* This is the most reliable way to avoid incompatibilities
+ in available built-in functions on various systems. */
+static void
+__yy_memcpy (to, from, count)
+ char *to;
+ char *from;
+ unsigned int count;
+{
+ register char *f = from;
+ register char *t = to;
+ register int i = count;
+
+ while (i-- > 0)
+ *t++ = *f++;
+}
+
+#else /* __cplusplus */
+
+/* This is the most reliable way to avoid incompatibilities
+ in available built-in functions on various systems. */
+static void
+__yy_memcpy (char *to, char *from, unsigned int count)
+{
+ register char *t = to;
+ register char *f = from;
+ register int i = count;
+
+ while (i-- > 0)
+ *t++ = *f++;
+}
+
+#endif
+#endif
+
+//#line 217 "/pkg/gnu/share/bison.simple"
+
+/* The user can define YYPARSE_PARAM as the name of an argument to be passed
+ into yyparse. The argument should have type void *.
+ It should actually point to an object.
+ Grammar actions can access the variable by casting it
+ to the proper pointer type. */
+
+#ifdef YYPARSE_PARAM
+#ifdef __cplusplus
+#define YYPARSE_PARAM_ARG void *YYPARSE_PARAM
+#define YYPARSE_PARAM_DECL
+#else /* not __cplusplus */
+#define YYPARSE_PARAM_ARG YYPARSE_PARAM
+#define YYPARSE_PARAM_DECL void *YYPARSE_PARAM;
+#endif /* not __cplusplus */
+#else /* not YYPARSE_PARAM */
+#define YYPARSE_PARAM_ARG
+#define YYPARSE_PARAM_DECL
+#endif /* not YYPARSE_PARAM */
+
+/* Prevent warning if -Wstrict-prototypes. */
+#ifdef __GNUC__
+#ifdef YYPARSE_PARAM
+int yyparse (void *);
+#else
+int yyparse (void);
+#endif
+#endif
+
+int
+yyparse(YYPARSE_PARAM_ARG)
+ YYPARSE_PARAM_DECL
+{
+ register int yystate;
+ register int yyn;
+ register short *yyssp;
+ register YYSTYPE *yyvsp;
+ int yyerrstatus; /* number of tokens to shift before error messages enabled */
+ int yychar1 = 0; /* lookahead token as an internal (translated) token number */
+
+ short yyssa[YYINITDEPTH]; /* the state stack */
+ YYSTYPE yyvsa[YYINITDEPTH]; /* the semantic value stack */
+
+ short *yyss = yyssa; /* refer to the stacks thru separate pointers */
+ YYSTYPE *yyvs = yyvsa; /* to allow yyoverflow to reallocate them elsewhere */
+
+#ifdef YYLSP_NEEDED
+ YYLTYPE yylsa[YYINITDEPTH]; /* the location stack */
+ YYLTYPE *yyls = yylsa;
+ YYLTYPE *yylsp;
+
+#define YYPOPSTACK (yyvsp--, yyssp--, yylsp--)
+#else
+#define YYPOPSTACK (yyvsp--, yyssp--)
+#endif
+
+ int yystacksize = YYINITDEPTH;
+ int yyfree_stacks = 0;
+
+#ifdef YYPURE
+ int yychar;
+ YYSTYPE yylval;
+ int yynerrs;
+#ifdef YYLSP_NEEDED
+ YYLTYPE yylloc;
+#endif
+#endif
+
+ int yylen;
+
+#if YYDEBUG != 0
+ if (yydebug)
+ fprintf(stderr, "Starting parse\n");
+#endif
+
+ yystate = 0;
+ yyerrstatus = 0;
+ yynerrs = 0;
+ yychar = YYEMPTY; /* Cause a token to be read. */
+
+ /* Initialize stack pointers.
+ Waste one element of value and location stack
+ so that they stay on the same level as the state stack.
+ The wasted elements are never initialized. */
+
+ yyssp = yyss - 1;
+ yyvsp = yyvs;
+#ifdef YYLSP_NEEDED
+ yylsp = yyls;
+#endif
+
+/* Push a new state, which is found in yystate . */
+/* In all cases, when you get here, the value and location stacks
+ have just been pushed. so pushing a state here evens the stacks. */
+yynewstate:
+
+ *++yyssp = yystate;
+
+ if (yyssp >= yyss + yystacksize - 1)
+ {
+ /* Give user a chance to reallocate the stack */
+ /* Use copies of these so that the &'s don't force the real ones into memory. */
+ YYSTYPE *yyvs1 = yyvs;
+ short *yyss1 = yyss;
+#ifdef YYLSP_NEEDED
+ YYLTYPE *yyls1 = yyls;
+#endif
+
+ /* Get the current used size of the three stacks, in elements. */
+ int size = yyssp - yyss + 1;
+
+#ifdef yyoverflow
+ /* Each stack pointer address is followed by the size of
+ the data in use in that stack, in bytes. */
+#ifdef YYLSP_NEEDED
+ /* This used to be a conditional around just the two extra args,
+ but that might be undefined if yyoverflow is a macro. */
+ yyoverflow("parser stack overflow",
+ &yyss1, size * sizeof (*yyssp),
+ &yyvs1, size * sizeof (*yyvsp),
+ &yyls1, size * sizeof (*yylsp),
+ &yystacksize);
+#else
+ yyoverflow("parser stack overflow",
+ &yyss1, size * sizeof (*yyssp),
+ &yyvs1, size * sizeof (*yyvsp),
+ &yystacksize);
+#endif
+
+ yyss = yyss1; yyvs = yyvs1;
+#ifdef YYLSP_NEEDED
+ yyls = yyls1;
+#endif
+#else /* no yyoverflow */
+ /* Extend the stack our own way. */
+ if (yystacksize >= YYMAXDEPTH)
+ {
+ yyerror("parser stack overflow");
+ if (yyfree_stacks)
+ {
+ free (yyss);
+ free (yyvs);
+#ifdef YYLSP_NEEDED
+ free (yyls);
+#endif
+ }
+ return 2;
+ }
+ yystacksize *= 2;
+ if (yystacksize > YYMAXDEPTH)
+ yystacksize = YYMAXDEPTH;
+#ifndef YYSTACK_USE_ALLOCA
+ yyfree_stacks = 1;
+#endif
+ yyss = (short *) YYSTACK_ALLOC (yystacksize * sizeof (*yyssp));
+ __yy_memcpy ((char *)yyss, (char *)yyss1,
+ size * (unsigned int) sizeof (*yyssp));
+ yyvs = (YYSTYPE *) YYSTACK_ALLOC (yystacksize * sizeof (*yyvsp));
+ __yy_memcpy ((char *)yyvs, (char *)yyvs1,
+ size * (unsigned int) sizeof (*yyvsp));
+#ifdef YYLSP_NEEDED
+ yyls = (YYLTYPE *) YYSTACK_ALLOC (yystacksize * sizeof (*yylsp));
+ __yy_memcpy ((char *)yyls, (char *)yyls1,
+ size * (unsigned int) sizeof (*yylsp));
+#endif
+#endif /* no yyoverflow */
+
+ yyssp = yyss + size - 1;
+ yyvsp = yyvs + size - 1;
+#ifdef YYLSP_NEEDED
+ yylsp = yyls + size - 1;
+#endif
+
+#if YYDEBUG != 0
+ if (yydebug)
+ fprintf(stderr, "Stack size increased to %d\n", yystacksize);
+#endif
+
+ if (yyssp >= yyss + yystacksize - 1)
+ YYABORT;
+ }
+
+#if YYDEBUG != 0
+ if (yydebug)
+ fprintf(stderr, "Entering state %d\n", yystate);
+#endif
+
+ goto yybackup;
+ yybackup:
+
+/* Do appropriate processing given the current state. */
+/* Read a lookahead token if we need one and don't already have one. */
+/* yyresume: */
+
+ /* First try to decide what to do without reference to lookahead token. */
+
+ yyn = yypact[yystate];
+ if (yyn == YYFLAG)
+ goto yydefault;
+
+ /* Not known => get a lookahead token if don't already have one. */
+
+ /* yychar is either YYEMPTY or YYEOF
+ or a valid token in external form. */
+
+ if (yychar == YYEMPTY)
+ {
+#if YYDEBUG != 0
+ if (yydebug)
+ fprintf(stderr, "Reading a token: ");
+#endif
+ yychar = YYLEX;
+ }
+
+ /* Convert token to internal form (in yychar1) for indexing tables with */
+
+ if (yychar <= 0) /* This means end of input. */
+ {
+ yychar1 = 0;
+ yychar = YYEOF; /* Don't call YYLEX any more */
+
+#if YYDEBUG != 0
+ if (yydebug)
+ fprintf(stderr, "Now at end of input.\n");
+#endif
+ }
+ else
+ {
+ yychar1 = YYTRANSLATE(yychar);
+
+#if YYDEBUG != 0
+ if (yydebug)
+ {
+ fprintf (stderr, "Next token is %d (%s", yychar, yytname[yychar1]);
+ /* Give the individual parser a way to print the precise meaning
+ of a token, for further debugging info. */
+#ifdef YYPRINT
+ YYPRINT (stderr, yychar, yylval);
+#endif
+ fprintf (stderr, ")\n");
+ }
+#endif
+ }
+
+ yyn += yychar1;
+ if (yyn < 0 || yyn > YYLAST || yycheck[yyn] != yychar1)
+ goto yydefault;
+
+ yyn = yytable[yyn];
+
+ /* yyn is what to do for this token type in this state.
+ Negative => reduce, -yyn is rule number.
+ Positive => shift, yyn is new state.
+ New state is final state => don't bother to shift,
+ just return success.
+ 0, or most negative number => error. */
+
+ if (yyn < 0)
+ {
+ if (yyn == YYFLAG)
+ goto yyerrlab;
+ yyn = -yyn;
+ goto yyreduce;
+ }
+ else if (yyn == 0)
+ goto yyerrlab;
+
+ if (yyn == YYFINAL)
+ YYACCEPT;
+
+ /* Shift the lookahead token. */
+
+#if YYDEBUG != 0
+ if (yydebug)
+ fprintf(stderr, "Shifting token %d (%s), ", yychar, yytname[yychar1]);
+#endif
+
+ /* Discard the token being shifted unless it is eof. */
+ if (yychar != YYEOF)
+ yychar = YYEMPTY;
+
+ *++yyvsp = yylval;
+#ifdef YYLSP_NEEDED
+ *++yylsp = yylloc;
+#endif
+
+ /* count tokens shifted since error; after three, turn off error status. */
+ if (yyerrstatus) yyerrstatus--;
+
+ yystate = yyn;
+ goto yynewstate;
+
+/* Do the default action for the current state. */
+yydefault:
+
+ yyn = yydefact[yystate];
+ if (yyn == 0)
+ goto yyerrlab;
+
+/* Do a reduction. yyn is the number of a rule to reduce with. */
+yyreduce:
+ yylen = yyr2[yyn];
+ if (yylen > 0)
+ yyval = yyvsp[1-yylen]; /* implement default value of the action */
+
+#if YYDEBUG != 0
+ if (yydebug)
+ {
+ int i;
+
+ fprintf (stderr, "Reducing via rule %d (line %d), ",
+ yyn, yyrline[yyn]);
+
+ /* Print the symbols being reduced, and their result. */
+ for (i = yyprhs[yyn]; yyrhs[i] > 0; i++)
+ fprintf (stderr, "%s ", yytname[yyrhs[i]]);
+ fprintf (stderr, " -> %s\n", yytname[yyr1[yyn]]);
+ }
+#endif
+
+
+ switch (yyn) {
+
+case 3:
+//#line 97 "ETCL/ETCL.yy"
+{ yyval.constraint = new TAO_ETCL_Preference (TAO_ETCL_MIN, yyvsp[0].constraint); ;
+ break;}
+case 4:
+//#line 99 "ETCL/ETCL.yy"
+{ yyval.constraint = new TAO_ETCL_Preference (TAO_ETCL_MAX, yyvsp[0].constraint); ;
+ break;}
+case 5:
+//#line 101 "ETCL/ETCL.yy"
+{ yyval.constraint = new TAO_ETCL_Preference (TAO_ETCL_WITH, yyvsp[0].constraint); ;
+ break;}
+case 6:
+//#line 103 "ETCL/ETCL.yy"
+{ yyval.constraint = new TAO_ETCL_Preference (TAO_ETCL_FIRST); ;
+ break;}
+case 7:
+//#line 105 "ETCL/ETCL.yy"
+{ yyval.constraint = new TAO_ETCL_Preference (TAO_ETCL_RANDOM); ;
+ break;}
+case 8:
+//#line 109 "ETCL/ETCL.yy"
+{ yyval.constraint = new TAO_ETCL_Binary_Expr (TAO_ETCL_OR, yyvsp[-2].constraint, yyvsp[0].constraint); ;
+ break;}
+case 10:
+//#line 114 "ETCL/ETCL.yy"
+{ yyval.constraint = new TAO_ETCL_Binary_Expr (TAO_ETCL_AND, yyvsp[-2].constraint, yyvsp[0].constraint); ;
+ break;}
+case 12:
+//#line 119 "ETCL/ETCL.yy"
+{ yyval.constraint = new TAO_ETCL_Binary_Expr (TAO_ETCL_EQ, yyvsp[-2].constraint, yyvsp[0].constraint); ;
+ break;}
+case 13:
+//#line 121 "ETCL/ETCL.yy"
+{ yyval.constraint = new TAO_ETCL_Binary_Expr (TAO_ETCL_NE, yyvsp[-2].constraint, yyvsp[0].constraint); ;
+ break;}
+case 14:
+//#line 123 "ETCL/ETCL.yy"
+{ yyval.constraint = new TAO_ETCL_Binary_Expr (TAO_ETCL_GT, yyvsp[-2].constraint, yyvsp[0].constraint); ;
+ break;}
+case 15:
+//#line 125 "ETCL/ETCL.yy"
+{ yyval.constraint = new TAO_ETCL_Binary_Expr (TAO_ETCL_GE, yyvsp[-2].constraint, yyvsp[0].constraint); ;
+ break;}
+case 16:
+//#line 127 "ETCL/ETCL.yy"
+{ yyval.constraint = new TAO_ETCL_Binary_Expr (TAO_ETCL_LT, yyvsp[-2].constraint, yyvsp[0].constraint); ;
+ break;}
+case 17:
+//#line 129 "ETCL/ETCL.yy"
+{ yyval.constraint = new TAO_ETCL_Binary_Expr (TAO_ETCL_LE, yyvsp[-2].constraint, yyvsp[0].constraint); ;
+ break;}
+case 19:
+//#line 134 "ETCL/ETCL.yy"
+{ yyval.constraint = new TAO_ETCL_Binary_Expr (TAO_ETCL_IN, yyvsp[-2].constraint, yyvsp[0].constraint); ;
+ break;}
+case 20:
+//#line 136 "ETCL/ETCL.yy"
+{ yyval.constraint = new TAO_ETCL_Binary_Expr (TAO_ETCL_IN, yyvsp[-3].constraint, yyvsp[0].constraint); ;
+ break;}
+case 22:
+//#line 141 "ETCL/ETCL.yy"
+{ yyval.constraint = new TAO_ETCL_Binary_Expr (TAO_ETCL_TWIDDLE, yyvsp[-2].constraint, yyvsp[0].constraint); ;
+ break;}
+case 24:
+//#line 146 "ETCL/ETCL.yy"
+{ yyval.constraint = new TAO_ETCL_Binary_Expr (TAO_ETCL_PLUS, yyvsp[-2].constraint, yyvsp[0].constraint); ;
+ break;}
+case 25:
+//#line 148 "ETCL/ETCL.yy"
+{ yyval.constraint = new TAO_ETCL_Binary_Expr (TAO_ETCL_MINUS, yyvsp[-2].constraint, yyvsp[0].constraint); ;
+ break;}
+case 27:
+//#line 153 "ETCL/ETCL.yy"
+{ yyval.constraint = new TAO_ETCL_Binary_Expr (TAO_ETCL_MULT, yyvsp[-2].constraint, yyvsp[0].constraint); ;
+ break;}
+case 28:
+//#line 155 "ETCL/ETCL.yy"
+{ yyval.constraint = new TAO_ETCL_Binary_Expr (TAO_ETCL_DIV, yyvsp[-2].constraint, yyvsp[0].constraint); ;
+ break;}
+case 30:
+//#line 160 "ETCL/ETCL.yy"
+{ yyval.constraint = new TAO_ETCL_Unary_Expr (TAO_ETCL_NOT, yyvsp[0].constraint); ;
+ break;}
+case 32:
+//#line 165 "ETCL/ETCL.yy"
+{ yyval.constraint = yyvsp[-1].constraint; ;
+ break;}
+case 33:
+//#line 167 "ETCL/ETCL.yy"
+{ yyval.constraint = yyvsp[0].constraint; ;
+ break;}
+case 34:
+//#line 169 "ETCL/ETCL.yy"
+{ yyval.constraint = new TAO_ETCL_Unary_Expr (TAO_ETCL_PLUS, yyvsp[0].constraint); ;
+ break;}
+case 35:
+//#line 171 "ETCL/ETCL.yy"
+{ yyval.constraint = new TAO_ETCL_Unary_Expr (TAO_ETCL_MINUS, yyvsp[0].constraint); ;
+ break;}
+case 36:
+//#line 173 "ETCL/ETCL.yy"
+{ yyval.constraint = yyvsp[0].constraint; ;
+ break;}
+case 37:
+//#line 175 "ETCL/ETCL.yy"
+{ yyval.constraint = new TAO_ETCL_Unary_Expr (TAO_ETCL_PLUS, yyvsp[0].constraint); ;
+ break;}
+case 38:
+//#line 177 "ETCL/ETCL.yy"
+{ yyval.constraint = new TAO_ETCL_Unary_Expr (TAO_ETCL_MINUS, yyvsp[0].constraint); ;
+ break;}
+case 39:
+//#line 179 "ETCL/ETCL.yy"
+{ yyval.constraint = yyvsp[0].constraint; ;
+ break;}
+case 40:
+//#line 181 "ETCL/ETCL.yy"
+{ yyval.constraint = yyvsp[0].constraint; ;
+ break;}
+case 41:
+//#line 183 "ETCL/ETCL.yy"
+{ yyval.constraint = new TAO_ETCL_Exist (yyvsp[0].constraint); ;
+ break;}
+case 42:
+//#line 185 "ETCL/ETCL.yy"
+{ yyval.constraint = new TAO_ETCL_Exist (yyvsp[0].constraint); ;
+ break;}
+case 43:
+//#line 187 "ETCL/ETCL.yy"
+{ yyval.constraint = new TAO_ETCL_Default (yyvsp[0].constraint); ;
+ break;}
+case 44:
+//#line 189 "ETCL/ETCL.yy"
+{ yyval.constraint = new TAO_ETCL_Eval (yyvsp[0].constraint); ;
+ break;}
+case 45:
+//#line 191 "ETCL/ETCL.yy"
+{ yyval.constraint = yyvsp[0].constraint; ;
+ break;}
+case 46:
+//#line 195 "ETCL/ETCL.yy"
+{ yyval.constraint = 0; ;
+ break;}
+case 47:
+//#line 197 "ETCL/ETCL.yy"
+{ yyval.constraint = new TAO_ETCL_Dot (yyvsp[0].constraint); ;
+ break;}
+case 48:
+//#line 200 "ETCL/ETCL.yy"
+{ yyval.constraint = new TAO_ETCL_Component (yyvsp[-1].constraint, yyvsp[0].constraint); ;
+ break;}
+case 51:
+//#line 207 "ETCL/ETCL.yy"
+{ yyval.constraint = 0; ;
+ break;}
+case 52:
+//#line 209 "ETCL/ETCL.yy"
+{ yyval.constraint = new TAO_ETCL_Dot (yyvsp[0].constraint); ;
+ break;}
+case 55:
+//#line 216 "ETCL/ETCL.yy"
+{ yyval.constraint = new TAO_ETCL_Component (yyvsp[-1].constraint, yyvsp[0].constraint); ;
+ break;}
+case 56:
+//#line 218 "ETCL/ETCL.yy"
+{ yyval.constraint = new TAO_ETCL_Special (TAO_ETCL_LENGTH); ;
+ break;}
+case 57:
+//#line 220 "ETCL/ETCL.yy"
+{ yyval.constraint = new TAO_ETCL_Special (TAO_ETCL_DISCRIMINANT); ;
+ break;}
+case 58:
+//#line 222 "ETCL/ETCL.yy"
+{ yyval.constraint = new TAO_ETCL_Special (TAO_ETCL_TYPE_ID); ;
+ break;}
+case 59:
+//#line 224 "ETCL/ETCL.yy"
+{ yyval.constraint = new TAO_ETCL_Special (TAO_ETCL_REPOS_ID); ;
+ break;}
+case 62:
+//#line 230 "ETCL/ETCL.yy"
+{ yyval.constraint = new TAO_ETCL_Component_Array (yyvsp[-2].constraint, yyvsp[0].constraint); ;
+ break;}
+case 63:
+//#line 234 "ETCL/ETCL.yy"
+{ yyval.constraint = new TAO_ETCL_Component_Assoc (yyvsp[-2].constraint, yyvsp[0].constraint); ;
+ break;}
+case 64:
+//#line 238 "ETCL/ETCL.yy"
+{ yyval.constraint = new TAO_ETCL_Component_Pos (yyvsp[-1].constraint, yyvsp[0].constraint); ;
+ break;}
+case 65:
+//#line 242 "ETCL/ETCL.yy"
+{ yyval.constraint = new TAO_ETCL_Union_Pos (yyvsp[-2].constraint, yyvsp[0].constraint); ;
+ break;}
+case 66:
+//#line 246 "ETCL/ETCL.yy"
+{ yyval.constraint = 0; ;
+ break;}
+case 67:
+//#line 248 "ETCL/ETCL.yy"
+{ yyval.constraint = new TAO_ETCL_Union_Value (+1, yyvsp[0].constraint); ;
+ break;}
+case 68:
+//#line 250 "ETCL/ETCL.yy"
+{ yyval.constraint = new TAO_ETCL_Union_Value (+1, yyvsp[0].constraint); ;
+ break;}
+case 69:
+//#line 252 "ETCL/ETCL.yy"
+{ yyval.constraint = new TAO_ETCL_Union_Value (-1, yyvsp[0].constraint); ;
+ break;}
+case 70:
+//#line 254 "ETCL/ETCL.yy"
+{ yyval.constraint = new TAO_ETCL_Union_Value (yyvsp[0].constraint); ;
+ break;}
+}
+ /* the action file gets copied in in place of this dollarsign */
+//#line 543 "/pkg/gnu/share/bison.simple"
+
+ yyvsp -= yylen;
+ yyssp -= yylen;
+#ifdef YYLSP_NEEDED
+ yylsp -= yylen;
+#endif
+
+#if YYDEBUG != 0
+ if (yydebug)
+ {
+ short *ssp1 = yyss - 1;
+ fprintf (stderr, "state stack now");
+ while (ssp1 != yyssp)
+ fprintf (stderr, " %d", *++ssp1);
+ fprintf (stderr, "\n");
+ }
+#endif
+
+ *++yyvsp = yyval;
+
+#ifdef YYLSP_NEEDED
+ yylsp++;
+ if (yylen == 0)
+ {
+ yylsp->first_line = yylloc.first_line;
+ yylsp->first_column = yylloc.first_column;
+ yylsp->last_line = (yylsp-1)->last_line;
+ yylsp->last_column = (yylsp-1)->last_column;
+ yylsp->text = 0;
+ }
+ else
+ {
+ yylsp->last_line = (yylsp+yylen-1)->last_line;
+ yylsp->last_column = (yylsp+yylen-1)->last_column;
+ }
+#endif
+
+ /* Now "shift" the result of the reduction.
+ Determine what state that goes to,
+ based on the state we popped back to
+ and the rule number reduced by. */
+
+ yyn = yyr1[yyn];
+
+ yystate = yypgoto[yyn - YYNTBASE] + *yyssp;
+ if (yystate >= 0 && yystate <= YYLAST && yycheck[yystate] == *yyssp)
+ yystate = yytable[yystate];
+ else
+ yystate = yydefgoto[yyn - YYNTBASE];
+
+ goto yynewstate;
+
+yyerrlab: /* here on detecting error */
+
+ if (! yyerrstatus)
+ /* If not already recovering from an error, report this error. */
+ {
+ ++yynerrs;
+
+#ifdef YYERROR_VERBOSE
+ yyn = yypact[yystate];
+
+ if (yyn > YYFLAG && yyn < YYLAST)
+ {
+ int size = 0;
+ char *msg;
+ int x, count;
+
+ count = 0;
+ /* Start X at -yyn if nec to avoid negative indexes in yycheck. */
+ for (x = (yyn < 0 ? -yyn : 0);
+ x < (sizeof(yytname) / sizeof(char *)); x++)
+ if (yycheck[x + yyn] == x)
+ size += strlen(yytname[x]) + 15, count++;
+ msg = (char *) malloc(size + 15);
+ if (msg != 0)
+ {
+ strcpy(msg, "parse error");
+
+ if (count < 5)
+ {
+ count = 0;
+ for (x = (yyn < 0 ? -yyn : 0);
+ x < (sizeof(yytname) / sizeof(char *)); x++)
+ if (yycheck[x + yyn] == x)
+ {
+ strcat(msg, count == 0 ? ", expecting `" : " or `");
+ strcat(msg, yytname[x]);
+ strcat(msg, "'");
+ count++;
+ }
+ }
+ yyerror(msg);
+ free(msg);
+ }
+ else
+ yyerror ("parse error; also virtual memory exceeded");
+ }
+ else
+#endif /* YYERROR_VERBOSE */
+ yyerror("parse error");
+ }
+
+ goto yyerrlab1;
+yyerrlab1: /* here on error raised explicitly by an action */
+
+ if (yyerrstatus == 3)
+ {
+ /* if just tried and failed to reuse lookahead token after an error, discard it. */
+
+ /* return failure if at end of input */
+ if (yychar == YYEOF)
+ YYABORT;
+
+#if YYDEBUG != 0
+ if (yydebug)
+ fprintf(stderr, "Discarding token %d (%s).\n", yychar, yytname[yychar1]);
+#endif
+
+ yychar = YYEMPTY;
+ }
+
+ /* Else will try to reuse lookahead token
+ after shifting the error token. */
+
+ yyerrstatus = 3; /* Each real token shifted decrements this */
+
+ goto yyerrhandle;
+
+yyerrdefault: /* current state does not do anything special for the error token. */
+
+#if 0
+ /* This is wrong; only states that explicitly want error tokens
+ should shift them. */
+ yyn = yydefact[yystate]; /* If its default is to accept any token, ok. Otherwise pop it.*/
+ if (yyn) goto yydefault;
+#endif
+
+yyerrpop: /* pop the current state because it cannot handle the error token */
+
+ if (yyssp == yyss) YYABORT;
+ yyvsp--;
+ yystate = *--yyssp;
+#ifdef YYLSP_NEEDED
+ yylsp--;
+#endif
+
+#if YYDEBUG != 0
+ if (yydebug)
+ {
+ short *ssp1 = yyss - 1;
+ fprintf (stderr, "Error: state stack now");
+ while (ssp1 != yyssp)
+ fprintf (stderr, " %d", *++ssp1);
+ fprintf (stderr, "\n");
+ }
+#endif
+
+yyerrhandle:
+
+ yyn = yypact[yystate];
+ if (yyn == YYFLAG)
+ goto yyerrdefault;
+
+ yyn += YYTERROR;
+ if (yyn < 0 || yyn > YYLAST || yycheck[yyn] != YYTERROR)
+ goto yyerrdefault;
+
+ yyn = yytable[yyn];
+ if (yyn < 0)
+ {
+ if (yyn == YYFLAG)
+ goto yyerrpop;
+ yyn = -yyn;
+ goto yyreduce;
+ }
+ else if (yyn == 0)
+ goto yyerrpop;
+
+ if (yyn == YYFINAL)
+ YYACCEPT;
+
+#if YYDEBUG != 0
+ if (yydebug)
+ fprintf(stderr, "Shifting error token, ");
+#endif
+
+ *++yyvsp = yylval;
+#ifdef YYLSP_NEEDED
+ *++yylsp = yylloc;
+#endif
+
+ yystate = yyn;
+ goto yynewstate;
+
+ yyacceptlab:
+ /* YYACCEPT comes here. */
+ if (yyfree_stacks)
+ {
+ free (yyss);
+ free (yyvs);
+#ifdef YYLSP_NEEDED
+ free (yyls);
+#endif
+ }
+ return 0;
+
+ yyabortlab:
+ /* YYABORT comes here. */
+
+ /* Flush out yy_current_buffer before next parse. Since there is
+ no error recovery, the buffer could still contain tokens from this
+ parse. */
+ yyflush_current_buffer();
+
+ if (yyfree_stacks)
+ {
+ free (yyss);
+ free (yyvs);
+#ifdef YYLSP_NEEDED
+ free (yyls);
+#endif
+ }
+ return 1;
+}
+//#line 257 "ETCL/ETCL.yy"
+
+
+TAO_END_VERSIONED_NAMESPACE_DECL
diff --git a/TAO/orbsvcs/orbsvcs/ETCL/ETCL_y.cpp.diff b/TAO/orbsvcs/orbsvcs/ETCL/ETCL_y.cpp.diff
new file mode 100644
index 00000000000..fe123111232
--- /dev/null
+++ b/TAO/orbsvcs/orbsvcs/ETCL/ETCL_y.cpp.diff
@@ -0,0 +1,607 @@
+--- bison_gen\ETCL_y.cpp 2005-07-19 09:56:06.368807400 -0700
++++ ETCL_y.cpp 2005-07-19 09:45:00.160274900 -0700
+@@ -1,5 +1,6 @@
++// $Id$
+
+-/* A Bison parser, made from ETCL.yy
++/* A Bison parser, made from ETCL/ETCL.yy
+ by GNU Bison version 1.28 */
+
+ #define YYBISON 1 /* Identify Bison output. */
+@@ -48,9 +49,9 @@
+ #define TAO_ETCL_TYPE_ID 298
+ #define TAO_ETCL_REPOS_ID 299
+
+-#line 1 "ETCL.yy"
++//#line 1 "ETCL/ETCL.yy"
+
+-// ETCL.yy,v 1.3 2002/01/14 19:52:28 parsons Exp
++// $Id$
+ // ========================================================================
+ //
+ // = LIBRARY
+@@ -70,6 +71,7 @@
+ #include "ETCL_Interpreter.h"
+
+ extern int yylex (void);
++extern void yyflush_current_buffer (void);
+
+ static void yyerror (const char *)
+ {
+@@ -77,9 +79,6 @@
+ // Ignore error messages
+ }
+
+-#ifndef YYSTYPE
+-#define YYSTYPE int
+-#endif
+ #include <stdio.h>
+
+ #ifndef __cplusplus
+@@ -293,8 +292,9 @@
+ -1, -1, 29, 3, 4, 5, 6, 7, 8, -1,
+ -1, -1, -1, 40, 49, 50, 51, 52, 53, 54
+ };
+-/* -*-C-*- Note some compilers choke on comments on `#line' lines. */
+-#line 3 "/usr/local/share/bison.simple"
++/* -*-C-*- Note some compilers choke on comments on `//#line' lines. */
++//#line 3 "/pkg/gnu/share/bison.simple"
++/* This file comes from bison-1.28. */
+
+ /* Skeleton output parser for bison,
+ Copyright (C) 1984, 1989, 1990 Free Software Foundation, Inc.
+@@ -311,46 +311,66 @@
+
+ You should have received a copy of the GNU General Public License
+ along with this program; if not, write to the Free Software
+- Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. */
++ Foundation, Inc., 59 Temple Place - Suite 330,
++ Boston, MA 02111-1307, USA. */
+
+ /* As a special exception, when this file is copied by Bison into a
+ Bison output file, you may use that output file without restriction.
+ This special exception was added by the Free Software Foundation
+ in version 1.24 of Bison. */
+
+-#ifndef alloca
++/* This is the parser code that is written into each bison parser
++ when the %semantic_parser declaration is not specified in the grammar.
++ It was written by Richard Stallman by simplifying the hairy parser
++ used when %semantic_parser is specified. */
++
++#ifndef YYSTACK_USE_ALLOCA
++#ifdef alloca
++#define YYSTACK_USE_ALLOCA
++#else /* alloca not defined */
+ #ifdef __GNUC__
++#define YYSTACK_USE_ALLOCA
+ #define alloca __builtin_alloca
+ #else /* not GNU C. */
+-#if (!defined (__STDC__) && defined (sparc)) || defined (__sparc__) || defined (__sparc) || defined (__sgi)
++#if (!defined (__STDC__) && defined (sparc)) || defined (__sparc__) || defined (__sparc) || defined (__sgi) || (defined (__sun) && defined (__i386))
++#define YYSTACK_USE_ALLOCA
+ #include <alloca.h>
+ #else /* not sparc */
+-#if defined (MSDOS) && !defined (__TURBOC__)
++/* We think this test detects Watcom and Microsoft C. */
++/* This used to test MSDOS, but that is a bad idea
++ since that symbol is in the user namespace. */
++#if (defined (_MSDOS) || defined (_MSDOS_)) && !defined (__TURBOC__)
++#if 0 /* No need for malloc.h, which pollutes the namespace;
++ instead, just don't use alloca. */
+ #include <malloc.h>
++#endif
+ #else /* not MSDOS, or __TURBOC__ */
+ #if defined(_AIX)
+-#include <malloc.h>
++/* I don't know what this was needed for, but it pollutes the namespace.
++ So I turned it off. rms, 2 May 1997. */
++/* #include <malloc.h> */
+ #pragma alloca
+-#else /* not MSDOS, __TURBOC__, or _AIX */
+-#ifdef __hpux
+-#ifdef __cplusplus
+-extern "C" {
+-void *alloca (unsigned int);
+-};
+-#else /* not __cplusplus */
+-void *alloca ();
+-#endif /* not __cplusplus */
++#define YYSTACK_USE_ALLOCA
++#else /* not MSDOS, or __TURBOC__, or _AIX */
++#if 0
++#ifdef __hpux /* haible@ilog.fr says this works for HPUX 9.05 and up,
++ and on HPUX 10. Eventually we can turn this on. */
++#define YYSTACK_USE_ALLOCA
++#define alloca __builtin_alloca
+ #endif /* __hpux */
++#endif
+ #endif /* not _AIX */
+ #endif /* not MSDOS, or __TURBOC__ */
+-#endif /* not sparc. */
+-#endif /* not GNU C. */
+-#endif /* alloca not defined. */
++#endif /* not sparc */
++#endif /* not GNU C */
++#endif /* alloca not defined */
++#endif /* YYSTACK_USE_ALLOCA not defined */
+
+-/* This is the parser code that is written into each bison parser
+- when the %semantic_parser declaration is not specified in the grammar.
+- It was written by Richard Stallman by simplifying the hairy parser
+- used when %semantic_parser is specified. */
++#ifdef YYSTACK_USE_ALLOCA
++#define YYSTACK_ALLOC alloca
++#else
++#define YYSTACK_ALLOC malloc
++#endif
+
+ /* Note: there must be only one dollar sign in this file.
+ It is replaced by the list of actions, each action
+@@ -360,8 +380,8 @@
+ #define yyclearin (yychar = YYEMPTY)
+ #define YYEMPTY -2
+ #define YYEOF 0
+-#define YYACCEPT return(0)
+-#define YYABORT return(1)
++#define YYACCEPT goto yyacceptlab
++#define YYABORT goto yyabortlab
+ #define YYERROR goto yyerrlab1
+ /* Like YYERROR except do call yyerror.
+ This remains here temporarily to ease the
+@@ -411,6 +431,10 @@
+ int yychar; /* the lookahead symbol */
+ YYSTYPE yylval; /* the semantic value of the */
+ /* lookahead symbol */
++YYSTYPE yyval; /* the variable used to return */
++ /* semantic values from the action */
++ /* routines */
++
+
+ #ifdef YYLSP_NEEDED
+ YYLTYPE yylloc; /* location data for the lookahead */
+@@ -443,11 +467,11 @@
+ #define YYMAXDEPTH 10000
+ #endif
+
+-/* Prevent warning if -Wstrict-prototypes. */
+-#ifdef __GNUC__
+-int yyparse (void);
+-#endif
+-
++/* Define __yy_memcpy. Note that the size argument
++ should be passed with type unsigned int, because that is what the non-GCC
++ definitions require. With GCC, __builtin_memcpy takes an arg
++ of type size_t, but it can handle unsigned int. */
++
+ #if __GNUC__ > 1 /* GNU C and GNU C++ define this. */
+ #define __yy_memcpy(TO,FROM,COUNT) __builtin_memcpy(TO,FROM,COUNT)
+ #else /* not GNU C or C++ */
+@@ -459,7 +483,7 @@
+ __yy_memcpy (to, from, count)
+ char *to;
+ char *from;
+- int count;
++ unsigned int count;
+ {
+ register char *f = from;
+ register char *t = to;
+@@ -474,10 +498,10 @@
+ /* This is the most reliable way to avoid incompatibilities
+ in available built-in functions on various systems. */
+ static void
+-__yy_memcpy (char *to, char *from, int count)
++__yy_memcpy (char *to, char *from, unsigned int count)
+ {
+- register char *f = from;
+ register char *t = to;
++ register char *f = from;
+ register int i = count;
+
+ while (i-- > 0)
+@@ -486,8 +510,8 @@
+
+ #endif
+ #endif
+-
+-#line 196 "/usr/local/share/bison.simple"
++
++//#line 217 "/pkg/gnu/share/bison.simple"
+
+ /* The user can define YYPARSE_PARAM as the name of an argument to be passed
+ into yyparse. The argument should have type void *.
+@@ -508,6 +532,15 @@
+ #define YYPARSE_PARAM_DECL
+ #endif /* not YYPARSE_PARAM */
+
++/* Prevent warning if -Wstrict-prototypes. */
++#ifdef __GNUC__
++#ifdef YYPARSE_PARAM
++int yyparse (void *);
++#else
++int yyparse (void);
++#endif
++#endif
++
+ int
+ yyparse(YYPARSE_PARAM_ARG)
+ YYPARSE_PARAM_DECL
+@@ -536,6 +569,7 @@
+ #endif
+
+ int yystacksize = YYINITDEPTH;
++ int yyfree_stacks = 0;
+
+ #ifdef YYPURE
+ int yychar;
+@@ -546,10 +580,6 @@
+ #endif
+ #endif
+
+- YYSTYPE yyval; /* the variable used to return */
+- /* semantic values from the action */
+- /* routines */
+-
+ int yylen;
+
+ #if YYDEBUG != 0
+@@ -620,18 +650,32 @@
+ if (yystacksize >= YYMAXDEPTH)
+ {
+ yyerror("parser stack overflow");
++ if (yyfree_stacks)
++ {
++ free (yyss);
++ free (yyvs);
++#ifdef YYLSP_NEEDED
++ free (yyls);
++#endif
++ }
+ return 2;
+ }
+ yystacksize *= 2;
+ if (yystacksize > YYMAXDEPTH)
+ yystacksize = YYMAXDEPTH;
+- yyss = (short *) alloca (yystacksize * sizeof (*yyssp));
+- __yy_memcpy ((char *)yyss, (char *)yyss1, size * sizeof (*yyssp));
+- yyvs = (YYSTYPE *) alloca (yystacksize * sizeof (*yyvsp));
+- __yy_memcpy ((char *)yyvs, (char *)yyvs1, size * sizeof (*yyvsp));
++#ifndef YYSTACK_USE_ALLOCA
++ yyfree_stacks = 1;
++#endif
++ yyss = (short *) YYSTACK_ALLOC (yystacksize * sizeof (*yyssp));
++ __yy_memcpy ((char *)yyss, (char *)yyss1,
++ size * (unsigned int) sizeof (*yyssp));
++ yyvs = (YYSTYPE *) YYSTACK_ALLOC (yystacksize * sizeof (*yyvsp));
++ __yy_memcpy ((char *)yyvs, (char *)yyvs1,
++ size * (unsigned int) sizeof (*yyvsp));
+ #ifdef YYLSP_NEEDED
+- yyls = (YYLTYPE *) alloca (yystacksize * sizeof (*yylsp));
+- __yy_memcpy ((char *)yyls, (char *)yyls1, size * sizeof (*yylsp));
++ yyls = (YYLTYPE *) YYSTACK_ALLOC (yystacksize * sizeof (*yylsp));
++ __yy_memcpy ((char *)yyls, (char *)yyls1,
++ size * (unsigned int) sizeof (*yylsp));
+ #endif
+ #endif /* no yyoverflow */
+
+@@ -792,225 +836,225 @@
+ switch (yyn) {
+
+ case 3:
+-#line 97 "ETCL.yy"
++//#line 97 "ETCL/ETCL.yy"
+ { yyval.constraint = new TAO_ETCL_Preference (TAO_ETCL_MIN, yyvsp[0].constraint); ;
+ break;}
+ case 4:
+-#line 99 "ETCL.yy"
++//#line 99 "ETCL/ETCL.yy"
+ { yyval.constraint = new TAO_ETCL_Preference (TAO_ETCL_MAX, yyvsp[0].constraint); ;
+ break;}
+ case 5:
+-#line 101 "ETCL.yy"
++//#line 101 "ETCL/ETCL.yy"
+ { yyval.constraint = new TAO_ETCL_Preference (TAO_ETCL_WITH, yyvsp[0].constraint); ;
+ break;}
+ case 6:
+-#line 103 "ETCL.yy"
++//#line 103 "ETCL/ETCL.yy"
+ { yyval.constraint = new TAO_ETCL_Preference (TAO_ETCL_FIRST); ;
+ break;}
+ case 7:
+-#line 105 "ETCL.yy"
++//#line 105 "ETCL/ETCL.yy"
+ { yyval.constraint = new TAO_ETCL_Preference (TAO_ETCL_RANDOM); ;
+ break;}
+ case 8:
+-#line 109 "ETCL.yy"
++//#line 109 "ETCL/ETCL.yy"
+ { yyval.constraint = new TAO_ETCL_Binary_Expr (TAO_ETCL_OR, yyvsp[-2].constraint, yyvsp[0].constraint); ;
+ break;}
+ case 10:
+-#line 114 "ETCL.yy"
++//#line 114 "ETCL/ETCL.yy"
+ { yyval.constraint = new TAO_ETCL_Binary_Expr (TAO_ETCL_AND, yyvsp[-2].constraint, yyvsp[0].constraint); ;
+ break;}
+ case 12:
+-#line 119 "ETCL.yy"
++//#line 119 "ETCL/ETCL.yy"
+ { yyval.constraint = new TAO_ETCL_Binary_Expr (TAO_ETCL_EQ, yyvsp[-2].constraint, yyvsp[0].constraint); ;
+ break;}
+ case 13:
+-#line 121 "ETCL.yy"
++//#line 121 "ETCL/ETCL.yy"
+ { yyval.constraint = new TAO_ETCL_Binary_Expr (TAO_ETCL_NE, yyvsp[-2].constraint, yyvsp[0].constraint); ;
+ break;}
+ case 14:
+-#line 123 "ETCL.yy"
++//#line 123 "ETCL/ETCL.yy"
+ { yyval.constraint = new TAO_ETCL_Binary_Expr (TAO_ETCL_GT, yyvsp[-2].constraint, yyvsp[0].constraint); ;
+ break;}
+ case 15:
+-#line 125 "ETCL.yy"
++//#line 125 "ETCL/ETCL.yy"
+ { yyval.constraint = new TAO_ETCL_Binary_Expr (TAO_ETCL_GE, yyvsp[-2].constraint, yyvsp[0].constraint); ;
+ break;}
+ case 16:
+-#line 127 "ETCL.yy"
++//#line 127 "ETCL/ETCL.yy"
+ { yyval.constraint = new TAO_ETCL_Binary_Expr (TAO_ETCL_LT, yyvsp[-2].constraint, yyvsp[0].constraint); ;
+ break;}
+ case 17:
+-#line 129 "ETCL.yy"
++//#line 129 "ETCL/ETCL.yy"
+ { yyval.constraint = new TAO_ETCL_Binary_Expr (TAO_ETCL_LE, yyvsp[-2].constraint, yyvsp[0].constraint); ;
+ break;}
+ case 19:
+-#line 134 "ETCL.yy"
++//#line 134 "ETCL/ETCL.yy"
+ { yyval.constraint = new TAO_ETCL_Binary_Expr (TAO_ETCL_IN, yyvsp[-2].constraint, yyvsp[0].constraint); ;
+ break;}
+ case 20:
+-#line 136 "ETCL.yy"
++//#line 136 "ETCL/ETCL.yy"
+ { yyval.constraint = new TAO_ETCL_Binary_Expr (TAO_ETCL_IN, yyvsp[-3].constraint, yyvsp[0].constraint); ;
+ break;}
+ case 22:
+-#line 141 "ETCL.yy"
++//#line 141 "ETCL/ETCL.yy"
+ { yyval.constraint = new TAO_ETCL_Binary_Expr (TAO_ETCL_TWIDDLE, yyvsp[-2].constraint, yyvsp[0].constraint); ;
+ break;}
+ case 24:
+-#line 146 "ETCL.yy"
++//#line 146 "ETCL/ETCL.yy"
+ { yyval.constraint = new TAO_ETCL_Binary_Expr (TAO_ETCL_PLUS, yyvsp[-2].constraint, yyvsp[0].constraint); ;
+ break;}
+ case 25:
+-#line 148 "ETCL.yy"
++//#line 148 "ETCL/ETCL.yy"
+ { yyval.constraint = new TAO_ETCL_Binary_Expr (TAO_ETCL_MINUS, yyvsp[-2].constraint, yyvsp[0].constraint); ;
+ break;}
+ case 27:
+-#line 153 "ETCL.yy"
++//#line 153 "ETCL/ETCL.yy"
+ { yyval.constraint = new TAO_ETCL_Binary_Expr (TAO_ETCL_MULT, yyvsp[-2].constraint, yyvsp[0].constraint); ;
+ break;}
+ case 28:
+-#line 155 "ETCL.yy"
++//#line 155 "ETCL/ETCL.yy"
+ { yyval.constraint = new TAO_ETCL_Binary_Expr (TAO_ETCL_DIV, yyvsp[-2].constraint, yyvsp[0].constraint); ;
+ break;}
+ case 30:
+-#line 160 "ETCL.yy"
++//#line 160 "ETCL/ETCL.yy"
+ { yyval.constraint = new TAO_ETCL_Unary_Expr (TAO_ETCL_NOT, yyvsp[0].constraint); ;
+ break;}
+ case 32:
+-#line 165 "ETCL.yy"
++//#line 165 "ETCL/ETCL.yy"
+ { yyval.constraint = yyvsp[-1].constraint; ;
+ break;}
+ case 33:
+-#line 167 "ETCL.yy"
++//#line 167 "ETCL/ETCL.yy"
+ { yyval.constraint = yyvsp[0].constraint; ;
+ break;}
+ case 34:
+-#line 169 "ETCL.yy"
++//#line 169 "ETCL/ETCL.yy"
+ { yyval.constraint = new TAO_ETCL_Unary_Expr (TAO_ETCL_PLUS, yyvsp[0].constraint); ;
+ break;}
+ case 35:
+-#line 171 "ETCL.yy"
++//#line 171 "ETCL/ETCL.yy"
+ { yyval.constraint = new TAO_ETCL_Unary_Expr (TAO_ETCL_MINUS, yyvsp[0].constraint); ;
+ break;}
+ case 36:
+-#line 173 "ETCL.yy"
++//#line 173 "ETCL/ETCL.yy"
+ { yyval.constraint = yyvsp[0].constraint; ;
+ break;}
+ case 37:
+-#line 175 "ETCL.yy"
++//#line 175 "ETCL/ETCL.yy"
+ { yyval.constraint = new TAO_ETCL_Unary_Expr (TAO_ETCL_PLUS, yyvsp[0].constraint); ;
+ break;}
+ case 38:
+-#line 177 "ETCL.yy"
++//#line 177 "ETCL/ETCL.yy"
+ { yyval.constraint = new TAO_ETCL_Unary_Expr (TAO_ETCL_MINUS, yyvsp[0].constraint); ;
+ break;}
+ case 39:
+-#line 179 "ETCL.yy"
++//#line 179 "ETCL/ETCL.yy"
+ { yyval.constraint = yyvsp[0].constraint; ;
+ break;}
+ case 40:
+-#line 181 "ETCL.yy"
++//#line 181 "ETCL/ETCL.yy"
+ { yyval.constraint = yyvsp[0].constraint; ;
+ break;}
+ case 41:
+-#line 183 "ETCL.yy"
++//#line 183 "ETCL/ETCL.yy"
+ { yyval.constraint = new TAO_ETCL_Exist (yyvsp[0].constraint); ;
+ break;}
+ case 42:
+-#line 185 "ETCL.yy"
++//#line 185 "ETCL/ETCL.yy"
+ { yyval.constraint = new TAO_ETCL_Exist (yyvsp[0].constraint); ;
+ break;}
+ case 43:
+-#line 187 "ETCL.yy"
++//#line 187 "ETCL/ETCL.yy"
+ { yyval.constraint = new TAO_ETCL_Default (yyvsp[0].constraint); ;
+ break;}
+ case 44:
+-#line 189 "ETCL.yy"
++//#line 189 "ETCL/ETCL.yy"
+ { yyval.constraint = new TAO_ETCL_Eval (yyvsp[0].constraint); ;
+ break;}
+ case 45:
+-#line 191 "ETCL.yy"
++//#line 191 "ETCL/ETCL.yy"
+ { yyval.constraint = yyvsp[0].constraint; ;
+ break;}
+ case 46:
+-#line 195 "ETCL.yy"
++//#line 195 "ETCL/ETCL.yy"
+ { yyval.constraint = 0; ;
+ break;}
+ case 47:
+-#line 197 "ETCL.yy"
++//#line 197 "ETCL/ETCL.yy"
+ { yyval.constraint = new TAO_ETCL_Dot (yyvsp[0].constraint); ;
+ break;}
+ case 48:
+-#line 200 "ETCL.yy"
++//#line 200 "ETCL/ETCL.yy"
+ { yyval.constraint = new TAO_ETCL_Component (yyvsp[-1].constraint, yyvsp[0].constraint); ;
+ break;}
+ case 51:
+-#line 207 "ETCL.yy"
++//#line 207 "ETCL/ETCL.yy"
+ { yyval.constraint = 0; ;
+ break;}
+ case 52:
+-#line 209 "ETCL.yy"
++//#line 209 "ETCL/ETCL.yy"
+ { yyval.constraint = new TAO_ETCL_Dot (yyvsp[0].constraint); ;
+ break;}
+ case 55:
+-#line 216 "ETCL.yy"
++//#line 216 "ETCL/ETCL.yy"
+ { yyval.constraint = new TAO_ETCL_Component (yyvsp[-1].constraint, yyvsp[0].constraint); ;
+ break;}
+ case 56:
+-#line 218 "ETCL.yy"
++//#line 218 "ETCL/ETCL.yy"
+ { yyval.constraint = new TAO_ETCL_Special (TAO_ETCL_LENGTH); ;
+ break;}
+ case 57:
+-#line 220 "ETCL.yy"
++//#line 220 "ETCL/ETCL.yy"
+ { yyval.constraint = new TAO_ETCL_Special (TAO_ETCL_DISCRIMINANT); ;
+ break;}
+ case 58:
+-#line 222 "ETCL.yy"
++//#line 222 "ETCL/ETCL.yy"
+ { yyval.constraint = new TAO_ETCL_Special (TAO_ETCL_TYPE_ID); ;
+ break;}
+ case 59:
+-#line 224 "ETCL.yy"
++//#line 224 "ETCL/ETCL.yy"
+ { yyval.constraint = new TAO_ETCL_Special (TAO_ETCL_REPOS_ID); ;
+ break;}
+ case 62:
+-#line 230 "ETCL.yy"
++//#line 230 "ETCL/ETCL.yy"
+ { yyval.constraint = new TAO_ETCL_Component_Array (yyvsp[-2].constraint, yyvsp[0].constraint); ;
+ break;}
+ case 63:
+-#line 234 "ETCL.yy"
++//#line 234 "ETCL/ETCL.yy"
+ { yyval.constraint = new TAO_ETCL_Component_Assoc (yyvsp[-2].constraint, yyvsp[0].constraint); ;
+ break;}
+ case 64:
+-#line 238 "ETCL.yy"
++//#line 238 "ETCL/ETCL.yy"
+ { yyval.constraint = new TAO_ETCL_Component_Pos (yyvsp[-1].constraint, yyvsp[0].constraint); ;
+ break;}
+ case 65:
+-#line 242 "ETCL.yy"
++//#line 242 "ETCL/ETCL.yy"
+ { yyval.constraint = new TAO_ETCL_Union_Pos (yyvsp[-2].constraint, yyvsp[0].constraint); ;
+ break;}
+ case 66:
+-#line 246 "ETCL.yy"
++//#line 246 "ETCL/ETCL.yy"
+ { yyval.constraint = 0; ;
+ break;}
+ case 67:
+-#line 248 "ETCL.yy"
++//#line 248 "ETCL/ETCL.yy"
+ { yyval.constraint = new TAO_ETCL_Union_Value (+1, yyvsp[0].constraint); ;
+ break;}
+ case 68:
+-#line 250 "ETCL.yy"
++//#line 250 "ETCL/ETCL.yy"
+ { yyval.constraint = new TAO_ETCL_Union_Value (+1, yyvsp[0].constraint); ;
+ break;}
+ case 69:
+-#line 252 "ETCL.yy"
++//#line 252 "ETCL/ETCL.yy"
+ { yyval.constraint = new TAO_ETCL_Union_Value (-1, yyvsp[0].constraint); ;
+ break;}
+ case 70:
+-#line 254 "ETCL.yy"
++//#line 254 "ETCL/ETCL.yy"
+ { yyval.constraint = new TAO_ETCL_Union_Value (yyvsp[0].constraint); ;
+ break;}
+ }
+ /* the action file gets copied in in place of this dollarsign */
+-#line 498 "/usr/local/share/bison.simple"
+-
++//#line 543 "/pkg/gnu/share/bison.simple"
++
+ yyvsp -= yylen;
+ yyssp -= yylen;
+ #ifdef YYLSP_NEEDED
+@@ -1204,7 +1248,37 @@
+
+ yystate = yyn;
+ goto yynewstate;
++
++ yyacceptlab:
++ /* YYACCEPT comes here. */
++ if (yyfree_stacks)
++ {
++ free (yyss);
++ free (yyvs);
++#ifdef YYLSP_NEEDED
++ free (yyls);
++#endif
++ }
++ return 0;
++
++ yyabortlab:
++ /* YYABORT comes here. */
++
++ /* Flush out yy_current_buffer before next parse. Since there is
++ no error recovery, the buffer could still contain tokens from this
++ parse. */
++ yyflush_current_buffer();
++
++ if (yyfree_stacks)
++ {
++ free (yyss);
++ free (yyvs);
++#ifdef YYLSP_NEEDED
++ free (yyls);
++#endif
++ }
++ return 1;
+ }
+-#line 257 "ETCL.yy"
++//#line 257 "ETCL/ETCL.yy"
+
+
diff --git a/TAO/orbsvcs/orbsvcs/ETCL/ETCL_y.h b/TAO/orbsvcs/orbsvcs/ETCL/ETCL_y.h
new file mode 100644
index 00000000000..ce37c579583
--- /dev/null
+++ b/TAO/orbsvcs/orbsvcs/ETCL/ETCL_y.h
@@ -0,0 +1,45 @@
+// $Id$
+#define TAO_ETCL_GT 257
+#define TAO_ETCL_GE 258
+#define TAO_ETCL_LT 259
+#define TAO_ETCL_LE 260
+#define TAO_ETCL_EQ 261
+#define TAO_ETCL_NE 262
+#define TAO_ETCL_EXIST 263
+#define TAO_ETCL_DEFAULT 264
+#define TAO_ETCL_AND 265
+#define TAO_ETCL_OR 266
+#define TAO_ETCL_NOT 267
+#define TAO_ETCL_IN 268
+#define TAO_ETCL_TWIDDLE 269
+#define TAO_ETCL_BOOLEAN 270
+#define TAO_ETCL_PLUS 271
+#define TAO_ETCL_MINUS 272
+#define TAO_ETCL_MULT 273
+#define TAO_ETCL_DIV 274
+#define TAO_ETCL_UMINUS 275
+#define TAO_ETCL_INTEGER 276
+#define TAO_ETCL_FLOAT 277
+#define TAO_ETCL_STRING 278
+#define TAO_ETCL_RPAREN 279
+#define TAO_ETCL_LPAREN 280
+#define TAO_ETCL_RBRA 281
+#define TAO_ETCL_LBRA 282
+#define TAO_ETCL_IDENT 283
+#define TAO_ETCL_UNSIGNED 284
+#define TAO_ETCL_SIGNED 285
+#define TAO_ETCL_DOUBLE 286
+#define TAO_ETCL_CONSTRAINT 287
+#define TAO_ETCL_COMPONENT 288
+#define TAO_ETCL_WITH 289
+#define TAO_ETCL_MAX 290
+#define TAO_ETCL_MIN 291
+#define TAO_ETCL_FIRST 292
+#define TAO_ETCL_RANDOM 293
+#define TAO_ETCL_DOLLAR 294
+#define TAO_ETCL_DOT 295
+#define TAO_ETCL_DISCRIMINANT 296
+#define TAO_ETCL_LENGTH 297
+#define TAO_ETCL_TYPE_ID 298
+#define TAO_ETCL_REPOS_ID 299
+
diff --git a/TAO/orbsvcs/orbsvcs/ETCL/ETCL_y.h.diff b/TAO/orbsvcs/orbsvcs/ETCL/ETCL_y.h.diff
new file mode 100644
index 00000000000..85acf912763
--- /dev/null
+++ b/TAO/orbsvcs/orbsvcs/ETCL/ETCL_y.h.diff
@@ -0,0 +1,25 @@
+--- ETCL_y.h Mon Nov 12 16:07:25 2001
++++ ETCL_y.h.safe Thu Oct 11 20:53:13 2001
+@@ -1,7 +1,4 @@
+ // $Id$
+-#ifndef YYSTYPE
+-#define YYSTYPE int
+-#endif
+ #define TAO_ETCL_GT 257
+ #define TAO_ETCL_GE 258
+ #define TAO_ETCL_LT 259
+@@ -33,7 +30,7 @@
+ #define TAO_ETCL_SIGNED 285
+ #define TAO_ETCL_DOUBLE 286
+ #define TAO_ETCL_CONSTRAINT 287
+-#define TAO_ETCL_SEQUENCE 288
++#define TAO_ETCL_COMPONENT 288
+ #define TAO_ETCL_WITH 289
+ #define TAO_ETCL_MAX 290
+ #define TAO_ETCL_MIN 291
+@@ -46,5 +43,3 @@
+ #define TAO_ETCL_TYPE_ID 298
+ #define TAO_ETCL_REPOS_ID 299
+
+-
+-extern YYSTYPE yylval;
diff --git a/TAO/orbsvcs/orbsvcs/ETCL/README b/TAO/orbsvcs/orbsvcs/ETCL/README
new file mode 100644
index 00000000000..dca67871f74
--- /dev/null
+++ b/TAO/orbsvcs/orbsvcs/ETCL/README
@@ -0,0 +1,12 @@
+# $Id$
+#
+# Implement an "Extended Trader Constraint Language" parser.
+# This language was defined as part of the Notification Service
+# [give URL] to define filtering constraints. It is in fact an
+# extension on the "Trader Constraint Language", using in the Trading
+# Service [URL] to constraint on user queries.
+#
+# Other services use the same language, including the Logging Service,
+# parts of the Fault Tolerance services and (in the future) TAO's
+# Real-time Event Service.
+#
diff --git a/TAO/orbsvcs/orbsvcs/ETCL/etcl_export.h b/TAO/orbsvcs/orbsvcs/ETCL/etcl_export.h
new file mode 100644
index 00000000000..5f78b57d789
--- /dev/null
+++ b/TAO/orbsvcs/orbsvcs/ETCL/etcl_export.h
@@ -0,0 +1,40 @@
+
+// -*- C++ -*-
+// $Id$
+// Definition for Win32 Export directives.
+// This file is generated automatically by generate_export_file.pl
+// ------------------------------
+#ifndef TAO_ETCL_EXPORT_H
+#define TAO_ETCL_EXPORT_H
+
+#include "ace/config-all.h"
+
+#if defined (TAO_AS_STATIC_LIBS)
+# if !defined (TAO_ETCL_HAS_DLL)
+# define TAO_ETCL_HAS_DLL 0
+# endif /* ! TAO_ETCL_HAS_DLL */
+#else
+# if !defined (TAO_ETCL_HAS_DLL)
+# define TAO_ETCL_HAS_DLL 1
+# endif /* ! TAO_ETCL_HAS_DLL */
+#endif
+
+#if defined (TAO_ETCL_HAS_DLL) && (TAO_ETCL_HAS_DLL == 1)
+# if defined (TAO_ETCL_BUILD_DLL)
+# define TAO_ETCL_Export ACE_Proper_Export_Flag
+# define TAO_ETCL_SINGLETON_DECLARATION(T) ACE_EXPORT_SINGLETON_DECLARATION (T)
+# define TAO_ETCL_SINGLETON_DECLARE(SINGLETON_TYPE, CLASS, LOCK) ACE_EXPORT_SINGLETON_DECLARE(SINGLETON_TYPE, CLASS, LOCK)
+# else /* TAO_ETCL_BUILD_DLL */
+# define TAO_ETCL_Export ACE_Proper_Import_Flag
+# define TAO_ETCL_SINGLETON_DECLARATION(T) ACE_IMPORT_SINGLETON_DECLARATION (T)
+# define TAO_ETCL_SINGLETON_DECLARE(SINGLETON_TYPE, CLASS, LOCK) ACE_IMPORT_SINGLETON_DECLARE(SINGLETON_TYPE, CLASS, LOCK)
+# endif /* TAO_ETCL_BUILD_DLL */
+#else /* TAO_ETCL_HAS_DLL == 1 */
+# define TAO_ETCL_Export
+# define TAO_ETCL_SINGLETON_DECLARATION(T)
+# define TAO_ETCL_SINGLETON_DECLARE(SINGLETON_TYPE, CLASS, LOCK)
+#endif /* TAO_ETCL_HAS_DLL == 1 */
+
+#endif /* TAO_ETCL_EXPORT_H */
+
+// End of auto generated file.
diff --git a/TAO/orbsvcs/orbsvcs/Event/ECG_Adapters.cpp b/TAO/orbsvcs/orbsvcs/Event/ECG_Adapters.cpp
new file mode 100644
index 00000000000..8813fee591c
--- /dev/null
+++ b/TAO/orbsvcs/orbsvcs/Event/ECG_Adapters.cpp
@@ -0,0 +1,19 @@
+// $Id$
+
+#include "orbsvcs/Event/ECG_Adapters.h"
+
+ACE_RCSID (Event,
+ ECG_Adapters,
+ "$Id$")
+
+TAO_BEGIN_VERSIONED_NAMESPACE_DECL
+
+TAO_ECG_Handler_Shutdown::~TAO_ECG_Handler_Shutdown (void)
+{
+}
+
+TAO_ECG_Dgram_Handler::~TAO_ECG_Dgram_Handler (void)
+{
+}
+
+TAO_END_VERSIONED_NAMESPACE_DECL
diff --git a/TAO/orbsvcs/orbsvcs/Event/ECG_Adapters.h b/TAO/orbsvcs/orbsvcs/Event/ECG_Adapters.h
new file mode 100644
index 00000000000..8c79e6415f6
--- /dev/null
+++ b/TAO/orbsvcs/orbsvcs/Event/ECG_Adapters.h
@@ -0,0 +1,79 @@
+// -*- C++ -*-
+
+/**
+ * @file ECG_Adapters.h
+ *
+ * $Id$
+ *
+ * @author Marina Spivak <marina@atdesk.com>
+ *
+ * Define interfaces ECG Receivers and Mcast and UDP handlers can use
+ * to communicate with each other.
+ * Use of these interfaces eliminates the coupling of specific
+ * Receivers on specific handlers, and vice versa.
+ *
+ */
+#ifndef TAO_ECG_ADAPTERS_H
+#define TAO_ECG_ADAPTERS_H
+#include /**/ "ace/pre.h"
+
+#include /**/ "orbsvcs/Event/event_serv_export.h"
+#include "orbsvcs/RtecUDPAdminC.h"
+
+#if !defined (ACE_LACKS_PRAGMA_ONCE)
+# pragma once
+#endif /* ACE_LACKS_PRAGMA_ONCE */
+
+#include "ace/Refcounted_Auto_Ptr.h"
+
+ACE_BEGIN_VERSIONED_NAMESPACE_DECL
+class ACE_SOCK_Dgram;
+ACE_END_VERSIONED_NAMESPACE_DECL
+
+TAO_BEGIN_VERSIONED_NAMESPACE_DECL
+
+/**
+ * @class TAO_ECG_Handler_Shutdown
+ *
+ * @brief Interface that should be implemented
+ * by multicast and udp handlers in EC gateways, so the
+ * handlers can be notified of shutdown (usually by Event Receivers).
+ */
+class TAO_RTEvent_Serv_Export TAO_ECG_Handler_Shutdown
+{
+public:
+
+ // Define virtual destructor to make sure we can delete derived
+ // objects through a pointer to TAO_ECG_Handler_Shutdown.
+ virtual ~TAO_ECG_Handler_Shutdown (void);
+ virtual int shutdown (void) = 0;
+};
+
+/**
+ * @class TAO_ECG_Dgram_Handler
+ *
+ * @brief Interface used by mcast/udp handlers to notify interested
+ * components (usually Event Receivers) that there is data
+ * available on the dgram for reading, and to query them about
+ * event type to mcast group mappings.
+ */
+class TAO_RTEvent_Serv_Export TAO_ECG_Dgram_Handler
+{
+public:
+
+ virtual ~TAO_ECG_Dgram_Handler (void);
+
+ virtual int handle_input (ACE_SOCK_Dgram& dgram) = 0;
+
+ virtual void get_addr (const RtecEventComm::EventHeader& header,
+ RtecUDPAdmin::UDP_Addr_out addr
+ ACE_ENV_ARG_DECL) = 0;
+};
+
+typedef ACE_Refcounted_Auto_Ptr<TAO_ECG_Handler_Shutdown,
+ ACE_Null_Mutex> TAO_ECG_Refcounted_Handler;
+
+TAO_END_VERSIONED_NAMESPACE_DECL
+
+#include /**/ "ace/post.h"
+#endif /* TAO_ECG_ADAPTERS_H */
diff --git a/TAO/orbsvcs/orbsvcs/Event/ECG_Address_Server_Base.h b/TAO/orbsvcs/orbsvcs/Event/ECG_Address_Server_Base.h
new file mode 100644
index 00000000000..2490b33d051
--- /dev/null
+++ b/TAO/orbsvcs/orbsvcs/Event/ECG_Address_Server_Base.h
@@ -0,0 +1,42 @@
+// -*- C++ -*-
+/**
+ * @file ECG_Address_Server_Base.h
+ *
+ * $Id$
+ *
+ * @author Marina Spivak (marina@atdesk.com)
+ *
+ */
+
+#ifndef TAO_ECG_ADDRESS_SERVER_BASE_H
+#define TAO_ECG_ADDRESS_SERVER_BASE_H
+#include /**/ "ace/pre.h"
+
+#include /**/ "orbsvcs/Event/event_serv_export.h"
+#include "orbsvcs/RtecUDPAdminS.h"
+#include "orbsvcs/Event/EC_Lifetime_Utils.h"
+#include "ace/Auto_Ptr.h"
+
+TAO_BEGIN_VERSIONED_NAMESPACE_DECL
+
+/**
+ * @class TAO_ECG_Address_Server_Base
+ *
+ * @brief All implementations of RtecUDPAdmin::AddrServer idl
+ * interface should inherit from this abstract base.
+ *
+ * Adds init () virtual method so that all AddrServer implementations can be
+ * initialized in the same fasion.
+ */
+class TAO_RTEvent_Serv_Export TAO_ECG_Address_Server_Base
+ : public virtual POA_RtecUDPAdmin::AddrServer
+{
+public:
+
+ virtual int init (const char *arg) = 0;
+};
+
+TAO_END_VERSIONED_NAMESPACE_DECL
+
+#include /**/ "ace/post.h"
+#endif /* TAO_ECG_ADDRESS_SERVER_BASE_H */
diff --git a/TAO/orbsvcs/orbsvcs/Event/ECG_CDR_Message_Receiver.cpp b/TAO/orbsvcs/orbsvcs/Event/ECG_CDR_Message_Receiver.cpp
new file mode 100644
index 00000000000..faf377fd386
--- /dev/null
+++ b/TAO/orbsvcs/orbsvcs/Event/ECG_CDR_Message_Receiver.cpp
@@ -0,0 +1,608 @@
+// $Id$
+
+#include "orbsvcs/Event/ECG_CDR_Message_Receiver.h"
+#include "orbsvcs/Event/ECG_CDR_Message_Sender.h"
+
+#include "tao/Exception.h"
+
+#include "ace/SOCK_Dgram.h"
+#include "ace/ACE.h"
+#include "ace/OS_NS_string.h"
+
+#if !defined(__ACE_INLINE__)
+#include "orbsvcs/Event/ECG_CDR_Message_Receiver.i"
+#endif /* __ACE_INLINE__ */
+
+ACE_RCSID (Event,
+ ECG_CDR_Message_Receiver,
+ "$Id$")
+
+TAO_BEGIN_VERSIONED_NAMESPACE_DECL
+
+TAO_ECG_CDR_Processor::~TAO_ECG_CDR_Processor (void)
+{
+}
+// ****************************************************************
+
+TAO_ECG_UDP_Request_Entry::~TAO_ECG_UDP_Request_Entry (void)
+{
+ if (this->own_received_fragments_)
+ {
+ this->own_received_fragments_ = 0;
+ delete[] this->received_fragments_;
+ }
+}
+
+TAO_ECG_UDP_Request_Entry::
+TAO_ECG_UDP_Request_Entry (CORBA::Boolean byte_order,
+ CORBA::ULong request_id,
+ CORBA::ULong request_size,
+ CORBA::ULong fragment_count)
+ : byte_order_ (byte_order)
+ , request_id_ (request_id)
+ , request_size_ (request_size)
+ , fragment_count_ (fragment_count)
+{
+ ACE_CDR::grow (&this->payload_, this->request_size_);
+ this->payload_.wr_ptr (request_size_);
+
+ this->received_fragments_ = this->default_received_fragments_;
+ this->own_received_fragments_ = 0;
+ const int bits_per_ulong = sizeof(CORBA::ULong) * CHAR_BIT;
+ this->received_fragments_size_ =
+ this->fragment_count_ / bits_per_ulong + 1;
+ if (this->received_fragments_size_ > ECG_DEFAULT_FRAGMENT_BUFSIZ)
+ {
+ ACE_NEW (this->received_fragments_,
+ CORBA::ULong[this->received_fragments_size_]);
+ this->own_received_fragments_ = 1;
+ }
+
+ for (CORBA::ULong i = 0; i < this->received_fragments_size_; ++i)
+ this->received_fragments_[i] = 0;
+ CORBA::ULong idx = this->fragment_count_ / bits_per_ulong;
+ CORBA::ULong bit = this->fragment_count_ % bits_per_ulong;
+ this->received_fragments_[idx] = (0xFFFFFFFF << bit);
+}
+
+int
+TAO_ECG_UDP_Request_Entry::validate_fragment (CORBA::Boolean byte_order,
+ CORBA::ULong request_size,
+ CORBA::ULong fragment_size,
+ CORBA::ULong fragment_offset,
+ CORBA::ULong /* fragment_id */,
+ CORBA::ULong fragment_count) const
+{
+ if (byte_order != this->byte_order_
+ || request_size != this->request_size_
+ || fragment_count != this->fragment_count_)
+ return 0;
+
+ if (fragment_offset >= request_size
+ || fragment_offset + fragment_size > request_size)
+ return 0;
+
+ return 1;
+}
+
+int
+TAO_ECG_UDP_Request_Entry::test_received (CORBA::ULong fragment_id) const
+{
+ // Assume out-of-range fragments as received, so they are dropped...
+ if (fragment_id > this->fragment_count_)
+ return 1;
+
+ const int bits_per_ulong = sizeof(CORBA::ULong) * CHAR_BIT;
+ CORBA::ULong idx = fragment_id / bits_per_ulong;
+ CORBA::ULong bit = fragment_id % bits_per_ulong;
+ return ACE_BIT_ENABLED (this->received_fragments_[idx], 1<<bit);
+}
+
+void
+TAO_ECG_UDP_Request_Entry::mark_received (CORBA::ULong fragment_id)
+{
+ // Assume out-of-range fragments as received, so they are dropped...
+ if (fragment_id > this->fragment_count_)
+ return;
+
+ const int bits_per_ulong = sizeof(CORBA::ULong) * CHAR_BIT;
+ CORBA::ULong idx = fragment_id / bits_per_ulong;
+ CORBA::ULong bit = fragment_id % bits_per_ulong;
+ ACE_SET_BITS (this->received_fragments_[idx], 1<<bit);
+}
+
+int
+TAO_ECG_UDP_Request_Entry::complete (void) const
+{
+ for (CORBA::ULong i = 0;
+ i < this->received_fragments_size_;
+ ++i)
+ {
+ if (this->received_fragments_[i] != 0xFFFFFFFF)
+ return 0;
+ }
+ return 1;
+}
+
+char*
+TAO_ECG_UDP_Request_Entry::fragment_buffer (CORBA::ULong fragment_offset)
+{
+ return this->payload_.rd_ptr () + fragment_offset;
+}
+// ****************************************************************
+
+int
+TAO_ECG_CDR_Message_Receiver::Requests::init (size_t size,
+ size_t min_purge_count)
+{
+ // Already initialized.
+ if (this->fragmented_requests_)
+ return -1;
+
+ ACE_NEW_RETURN (this->fragmented_requests_,
+ TAO_ECG_UDP_Request_Entry*[size],
+ -1);
+
+ this->size_ = size;
+ this->id_range_low_ = 0;
+ this->id_range_high_ = size - 1;
+ this->min_purge_count_ = min_purge_count;
+
+ for (size_t i = 0; i < size; ++i)
+ {
+ this->fragmented_requests_[i] = 0;
+ }
+
+ return 0;
+}
+
+TAO_ECG_CDR_Message_Receiver::Requests::~Requests (void)
+{
+ for (size_t i = 0; i < this->size_; ++i)
+ {
+ TAO_ECG_UDP_Request_Entry* request =
+ this->fragmented_requests_[i];
+
+ if (request != &TAO_ECG_CDR_Message_Receiver::Request_Completed_)
+ delete request;
+ }
+
+ delete [] this->fragmented_requests_;
+
+ this->fragmented_requests_ = 0;
+ this->size_ = 0;
+ this->id_range_low_ = 0;
+ this->id_range_high_ = 0;
+}
+
+TAO_ECG_UDP_Request_Entry **
+TAO_ECG_CDR_Message_Receiver::Requests::get_request (CORBA::ULong request_id)
+{
+ if (request_id < this->id_range_low_)
+ // <request_id> is below the current range.
+ {
+ return 0;
+ }
+
+ if (request_id > this->id_range_high_)
+ // <request_id> is above the current range - need to shift the range
+ // to include it.
+ {
+ CORBA::ULong new_slots_needed = request_id - this->id_range_high_;
+
+ if (new_slots_needed < this->min_purge_count_)
+ new_slots_needed = this->min_purge_count_;
+
+ if (new_slots_needed > this->size_)
+ // Shifting the range by more than the size of array.
+ {
+ this->purge_requests (this->id_range_low_, this->id_range_high_);
+ this->id_range_high_ = request_id;
+ this->id_range_low_ = request_id - this->size_ + 1;
+ }
+ else
+ {
+ this->purge_requests (this->id_range_low_,
+ this->id_range_low_ + new_slots_needed - 1);
+ this->id_range_high_ += new_slots_needed;
+ this->id_range_low_ += new_slots_needed;
+ }
+ }
+
+ // Return array location for <request_id>.
+ int index = request_id % this->size_;
+ return this->fragmented_requests_ + index;
+}
+
+
+void
+TAO_ECG_CDR_Message_Receiver::Requests::purge_requests (
+ CORBA::ULong purge_first,
+ CORBA::ULong purge_last)
+{
+ for (CORBA::ULong i = purge_first; i <= purge_last; ++i)
+ {
+ size_t index = i % this->size_;
+ if (this->fragmented_requests_[index]
+ != &TAO_ECG_CDR_Message_Receiver::Request_Completed_)
+ {
+ delete this->fragmented_requests_[index];
+ }
+ this->fragmented_requests_[index] = 0;
+ }
+}
+
+// ****************************************************************
+
+TAO_ECG_UDP_Request_Entry
+TAO_ECG_CDR_Message_Receiver::Request_Completed_ (0, 0, 0, 0);
+
+int
+TAO_ECG_CDR_Message_Receiver::handle_input (
+ ACE_SOCK_Dgram& dgram,
+ TAO_ECG_CDR_Processor *cdr_processor)
+{
+ char nonaligned_header[TAO_ECG_CDR_Message_Sender::ECG_HEADER_SIZE
+ + ACE_CDR::MAX_ALIGNMENT];
+ char *header_buf = ACE_ptr_align_binary (nonaligned_header,
+ ACE_CDR::MAX_ALIGNMENT);
+
+ char nonaligned_data[ACE_MAX_DGRAM_SIZE + ACE_CDR::MAX_ALIGNMENT];
+ char *data_buf = ACE_ptr_align_binary (nonaligned_data,
+ ACE_CDR::MAX_ALIGNMENT);
+
+ // Read the message from dgram.
+
+ const int iovcnt = 2;
+ iovec iov[iovcnt];
+ iov[0].iov_base = header_buf;
+ iov[0].iov_len = TAO_ECG_CDR_Message_Sender::ECG_HEADER_SIZE;
+ iov[1].iov_base = data_buf;
+ iov[1].iov_len = ACE_MAX_DGRAM_SIZE;
+
+ ACE_INET_Addr from;
+ ssize_t n = dgram.recv (iov, iovcnt, from);
+
+ if (n == -1)
+ {
+ if (errno == EWOULDBLOCK)
+ return 0;
+
+ ACE_ERROR_RETURN ((LM_ERROR, "Error reading mcast fragment (%m).\n"),
+ -1);
+ }
+
+ if (n == 0)
+ {
+ ACE_ERROR_RETURN ((LM_ERROR, "Trying to read mcast fragment: "
+ "read 0 bytes from socket.\n"),
+ 0);
+ }
+
+ if (n < TAO_ECG_CDR_Message_Sender::ECG_HEADER_SIZE)
+ {
+ ACE_ERROR_RETURN ((LM_ERROR, "Trying to read mcast fragment: "
+ "# of bytes read < mcast header size.\n"),
+ -1);
+ }
+
+ u_int crc = 0;
+
+ if (this->check_crc_)
+ {
+ iov[1].iov_len = n - iov[0].iov_len;
+ iov[0].iov_len -= 4; // don't include crc
+
+ crc = ACE::crc32 (iov, 2);
+ }
+ // Check whether the message is a loopback message.
+ if (this->ignore_from_.get () != 0
+ && this->ignore_from_->is_loopback (from))
+ {
+ return 0;
+ }
+
+ // Decode and validate mcast header.
+ Mcast_Header header;
+ if (header.read (header_buf, n, this->check_crc_) == -1)
+ return -1;
+
+ if ( this->check_crc_ && header.crc != crc)
+ {
+ static unsigned int err_count = 0;
+ ACE_ERROR ((LM_DEBUG,
+ "******************************\n"));
+
+ ACE_ERROR ((LM_DEBUG,
+ "ERROR DETECTED \n"));
+
+ if (crc == 0)
+ {
+ ACE_ERROR ((LM_DEBUG,
+ "Sending process may not have computed CRC \n"));
+ }
+ else
+ {
+ ACE_ERROR ((LM_DEBUG,
+ " NETWORK CRC CHECKSUM FAILED\n"));
+ }
+
+ ACE_ERROR ((LM_ERROR,
+ "Message was received from [%s:%s:%d] \n",
+ from.get_host_name (),
+ from.get_host_addr (),
+ from.get_port_number()));
+
+ ACE_ERROR ((LM_ERROR,
+ "Num errors = %d \n",
+ ++err_count));
+ ACE_ERROR ((LM_ERROR,
+ "This is a bad thing. Attempting to ignore ..\n"));
+
+ return 0;
+ }
+
+ // Process received data.
+ if (header.fragment_count == 1)
+ {
+ // Update <request_map_> to mark this request as completed. (Not
+ // needed if we don't care about duplicates.)
+ int result = this->mark_received (from, header.request_id);
+ if (result != 1)
+ return result;
+
+ TAO_InputCDR cdr (data_buf, header.request_size, header.byte_order);
+ if (cdr_processor->decode (cdr) == -1)
+ return -1;
+ else
+ return 1;
+ }
+
+ return this->process_fragment (from, header, data_buf, cdr_processor);
+}
+
+int
+TAO_ECG_CDR_Message_Receiver::mark_received (const ACE_INET_Addr &from,
+ CORBA::ULong request_id)
+{
+ // ACE_GUARD_RETURN (ACE_Lock, guard, *this->lock_, -1);
+
+ Request_Map::ENTRY * entry = this->get_source_entry (from);
+ if (!entry)
+ return -1;
+
+ TAO_ECG_UDP_Request_Entry ** request =
+ entry->int_id_->get_request (request_id);
+
+ if (request == 0)
+ {
+ ACE_DEBUG ((LM_WARNING, "Received mcast request with sequence"
+ "below currently expected range.\n"));
+ return 0;
+ }
+ if (*request == &Request_Completed_)
+ {
+ ACE_DEBUG ((LM_INFO, "Received duplicate mcast fragment. "
+ "(Request already complete).\n"));
+ return 0;
+ }
+ if (*request != 0)
+ {
+ ACE_ERROR_RETURN ((LM_ERROR, "Inconsistent fragments for "
+ "mcast request.\n"),
+ -1);
+ }
+
+ *request = &Request_Completed_;
+ return 1;
+}
+
+int
+TAO_ECG_CDR_Message_Receiver::process_fragment (
+ const ACE_INET_Addr &from,
+ const Mcast_Header &header,
+ char * data_buf,
+ TAO_ECG_CDR_Processor *cdr_processor)
+{
+ // ACE_GUARD_RETURN (ACE_Lock, guard, *this->lock_, -1);
+
+ Request_Map::ENTRY * source_entry = this->get_source_entry (from);
+ if (!source_entry)
+ return -1;
+
+ TAO_ECG_UDP_Request_Entry ** request =
+ source_entry->int_id_->get_request (header.request_id);
+
+ if (request == 0)
+ {
+ ACE_DEBUG ((LM_WARNING, "Received mcast request with sequence "
+ "below currently expected range.\n"));
+ return 0;
+ }
+ if (*request == &Request_Completed_)
+ {
+ ACE_DEBUG ((LM_INFO, "Received duplicate mcast fragment. "
+ "(Request already complete).\n"));
+ return 0;
+ }
+ if (*request == 0)
+ // Entry for this request has not yet been allocated.
+ {
+ ACE_NEW_RETURN (*request,
+ TAO_ECG_UDP_Request_Entry (header.byte_order,
+ header.request_id,
+ header.request_size,
+ header.fragment_count),
+ -1);
+ }
+
+ // Validate the fragment.
+ if ((*request)->validate_fragment (header.byte_order,
+ header.request_size,
+ header.fragment_size,
+ header.fragment_offset,
+ header.fragment_id,
+ header.fragment_count) == 0)
+ {
+ ACE_ERROR_RETURN ((LM_ERROR,
+ "Received invalid mcast fragment.\n"),
+ -1);
+ }
+
+ // Check whether this fragment was already received.
+ if ((*request)->test_received (header.fragment_id) == 1)
+ {
+ ACE_DEBUG ((LM_INFO, "Received duplicate mcast fragment.\n"));
+ return 0;
+ }
+
+ // Add the fragment to the request entry.
+ (*request)->mark_received (header.fragment_id);
+ ACE_OS::memcpy ((*request)->fragment_buffer (header.fragment_offset),
+ data_buf,
+ header.fragment_size);
+
+ // The request is not yet complete.
+ if (!(*request)->complete ())
+ {
+ return 0;
+ }
+
+ // The request is complete - decode it.
+ TAO_InputCDR cdr ((*request)->fragment_buffer (0),
+ header.request_size,
+ header.byte_order);
+
+ if (cdr_processor->decode (cdr) == -1)
+ return -1;
+
+ delete *request;
+ *request = &Request_Completed_;
+ return 1;
+}
+
+TAO_ECG_CDR_Message_Receiver::Request_Map::ENTRY*
+TAO_ECG_CDR_Message_Receiver::get_source_entry (const ACE_INET_Addr &from)
+{
+ // Get the entry for <from> from the <request_map_>.
+ Request_Map::ENTRY * entry;
+
+ if (this->request_map_.find (from, entry) == -1)
+ {
+ // Create an entry if one doesn't exist.
+ Requests *requests = 0;
+ ACE_NEW_RETURN (requests,
+ Requests,
+ 0);
+ auto_ptr<Requests> requests_aptr (requests);
+
+ if (requests->init (this->max_requests_, this->min_purge_count_) == -1
+ || this->request_map_.bind (from, requests, entry) == -1)
+ {
+ ACE_ERROR_RETURN ((LM_ERROR, "Unable to create hash map "
+ "entry for a new request.\n"),
+ 0);
+ }
+ requests_aptr.release ();
+ }
+
+ return entry;
+}
+
+void
+TAO_ECG_CDR_Message_Receiver::shutdown (void)
+{
+ // ACE_GUARD (ACE_Lock, guard, *this->lock_);
+
+ Request_Map::iterator end = this->request_map_.end ();
+ for (Request_Map::iterator i = this->request_map_.begin ();
+ i != end;
+ ++i)
+ {
+ delete (*i).int_id_;
+ (*i).int_id_ = 0;
+ }
+
+ this->ignore_from_.reset ();
+}
+
+// ****************************************************************
+int
+TAO_ECG_CDR_Message_Receiver::Mcast_Header::read (char *header,
+ size_t bytes_received,
+ CORBA::Boolean checkcrc)
+{
+ // Decode.
+ this->byte_order = header[0];
+ if(this->byte_order != 0 && this->byte_order != 1)
+ {
+ ACE_ERROR_RETURN ((LM_ERROR, "Reading mcast packet header: byte "
+ "order is neither 0 nor 1, it is %d.\n",
+ this->byte_order),
+ -1);
+ }
+
+ TAO_InputCDR header_cdr (header,
+ TAO_ECG_CDR_Message_Sender::ECG_HEADER_SIZE,
+ byte_order);
+ CORBA::Boolean unused;
+ CORBA::Octet a, b, c;
+ if (!header_cdr.read_boolean (unused)
+ || !header_cdr.read_octet (a)
+ || !header_cdr.read_octet (b)
+ || !header_cdr.read_octet (c)
+ || a != 'A' || b != 'B' || c != 'C')
+ {
+ ACE_ERROR_RETURN ((LM_ERROR, "Error reading magic bytes "
+ "in mcast packet header.\n"),
+ -1);
+ }
+
+ if (!header_cdr.read_ulong (this->request_id)
+ || !header_cdr.read_ulong (this->request_size)
+ || !header_cdr.read_ulong (this->fragment_size)
+ || !header_cdr.read_ulong (this->fragment_offset)
+ || !header_cdr.read_ulong (this->fragment_id)
+ || !header_cdr.read_ulong (this->fragment_count))
+ {
+ ACE_ERROR_RETURN ((LM_ERROR,
+ "Error decoding mcast packet header.\n"),
+ -1);
+ }
+
+ if (checkcrc)
+ {
+ CORBA::Octet padding[4];
+ header_cdr.read_octet_array (padding, 4);
+
+ unsigned char *crcparts = (unsigned char *)(&this->crc);
+
+ for (int cnt=0; cnt != 4; ++cnt)
+ {
+ crcparts[cnt] = padding[cnt];
+ }
+
+ this->crc = ntohl (this->crc);
+ }
+
+ // Validate.
+ size_t data_bytes_received =
+ bytes_received - TAO_ECG_CDR_Message_Sender::ECG_HEADER_SIZE;
+
+ if (this->request_size < this->fragment_size
+ || this->fragment_offset >= this->request_size
+ || this->fragment_id >= this->fragment_count
+ || (this->fragment_count == 1
+ && (this->fragment_size != this->request_size
+ || this->request_size != data_bytes_received)))
+ {
+ ACE_ERROR_RETURN ((LM_ERROR,
+ "Invalid mcast fragment: "
+ "inconsistent header fields.\n"),
+ -1);
+ }
+
+ return 0;
+}
+
+TAO_END_VERSIONED_NAMESPACE_DECL
diff --git a/TAO/orbsvcs/orbsvcs/Event/ECG_CDR_Message_Receiver.h b/TAO/orbsvcs/orbsvcs/Event/ECG_CDR_Message_Receiver.h
new file mode 100644
index 00000000000..8159a4e2f15
--- /dev/null
+++ b/TAO/orbsvcs/orbsvcs/Event/ECG_CDR_Message_Receiver.h
@@ -0,0 +1,318 @@
+// -*- C++ -*-
+/**
+ * @file ECG_CDR_Message_Receiver.h
+ *
+ * $Id$
+ *
+ * @author Carlos O'Ryan (coryan@cs.wustl.edu)
+ * @author Marina Spivak (marina@atdesk.com)
+ */
+
+#ifndef TAO_ECG_CDR_MESSAGE_RECEIVER_H
+#define TAO_ECG_CDR_MESSAGE_RECEIVER_H
+
+#include /**/ "ace/pre.h"
+
+#include "orbsvcs/Event/ECG_UDP_Out_Endpoint.h"
+
+#if !defined (ACE_LACKS_PRAGMA_ONCE)
+# pragma once
+#endif /* ACE_LACKS_PRAGMA_ONCE */
+
+#include "tao/CDR.h"
+#include "tao/Environment.h"
+
+#include "ace/Hash_Map_Manager.h"
+#include "ace/INET_Addr.h"
+#include "ace/Null_Mutex.h"
+
+TAO_BEGIN_VERSIONED_NAMESPACE_DECL
+
+/**
+ * @class TAO_ECG_CDR_Processor
+ *
+ * @brief Interface for callback objects used by
+ * TAO_ECG_CDR_Message_Receiver to propagate received data to
+ * its callers.
+ */
+class TAO_ECG_CDR_Processor
+{
+public:
+ virtual ~TAO_ECG_CDR_Processor (void);
+
+ /// Extracts data from <cdr>. Returns 0 on success, -1 on error.
+ virtual int decode (TAO_InputCDR &cdr) = 0;
+};
+
+// ****************************************************************
+/**
+ * @class TAO_ECG_UDP_Request_Entry
+ *
+ * @brief Keeps information about an incomplete request.
+ *
+ * When a request arrives in fragments this object is used to
+ * keep track of the incoming data.
+ */
+class TAO_ECG_UDP_Request_Entry
+{
+public:
+ enum {
+ ECG_DEFAULT_FRAGMENT_BUFSIZ = 8
+ };
+
+ /// Initialize the fragment, allocating memory, etc.
+ TAO_ECG_UDP_Request_Entry (CORBA::Boolean byte_order,
+ CORBA::ULong request_id,
+ CORBA::ULong request_size,
+ CORBA::ULong fragment_count);
+
+ ~TAO_ECG_UDP_Request_Entry (void);
+
+ /// Validate a fragment, it should be rejected if it is invalid..
+ int validate_fragment (CORBA::Boolean byte_order,
+ CORBA::ULong request_size,
+ CORBA::ULong fragment_size,
+ CORBA::ULong fragment_offset,
+ CORBA::ULong fragment_id,
+ CORBA::ULong fragment_count) const;
+
+ /// Has @a fragment_id been received?
+ int test_received (CORBA::ULong fragment_id) const;
+
+ /// Mark @a fragment_id as received, reset timeout counter...
+ void mark_received (CORBA::ULong fragment_id);
+
+ /// Is the message complete?
+ int complete (void) const;
+
+ /// Return a buffer for the fragment at offset @a fragment_offset
+ char* fragment_buffer (CORBA::ULong fragment_offset);
+
+private:
+
+ TAO_ECG_UDP_Request_Entry (const TAO_ECG_UDP_Request_Entry & rhs);
+ TAO_ECG_UDP_Request_Entry& operator= (const TAO_ECG_UDP_Request_Entry & rhs);
+
+private:
+ /// This attributes should remain constant in all the fragments, used
+ /// for validation....
+ CORBA::Boolean byte_order_;
+ CORBA::ULong request_id_;
+ CORBA::ULong request_size_;
+ CORBA::ULong fragment_count_;
+
+ ACE_Message_Block payload_;
+
+ /// This is a bit vector, used to keep track of the received buffers.
+ CORBA::ULong* received_fragments_;
+ int own_received_fragments_;
+ CORBA::ULong received_fragments_size_;
+ CORBA::ULong default_received_fragments_[ECG_DEFAULT_FRAGMENT_BUFSIZ];
+};
+
+// ****************************************************************
+
+/**
+ * @class TAO_ECG_CDR_Message_Receiver
+ *
+ * @brief Receives UDP and Multicast messages.
+ *
+ * @todo Update class documentation below.
+ *
+ * 5) Make status array size and purge_count configurable.
+ *
+ * This class receives UDP and Multicast message fragments, assembles
+ * them (described in detail below), and passes complete messages
+ * in the form of cdr streams to the calling classes.
+ *
+ * This class is used by various Gateway classes (Senders/Receivers)
+ * responsible for federating Event Channels with UDP/Mcast.
+ *
+ * = REASSEMBLY
+ * Fragmentation is described in ECG_CDR_Message_Sender.h
+ * Whenever an incomplete fragment is received (one with
+ * fragment_count > 1) we allocate an entry for the message in an
+ * map indexed by (host,port,request_id). The entry contains the
+ * buffer, a bit vector to keep track of the fragments received
+ * so far, and a timeout counter. This timeout counter is set to
+ * 0 on each (new) fragment arrival, and incremented on a regular
+ * basis. If the counter reaches a maximum value the message is
+ * dropped.
+ * Once all the fragments have been received the message is sent
+ * up to the calling classes, and the memory reclaimed.
+ */
+class TAO_RTEvent_Serv_Export TAO_ECG_CDR_Message_Receiver
+{
+public:
+ /// Initialization and termination methods.
+ //@{
+ TAO_ECG_CDR_Message_Receiver (CORBA::Boolean check_crc);
+ ~TAO_ECG_CDR_Message_Receiver (void);
+
+ /**
+ * @param ignore_from Endpoint used to remove events generated by
+ * the same process.
+ */
+ void init (TAO_ECG_Refcounted_Endpoint ignore_from
+ /* , ACE_Lock *lock = 0 */);
+
+ // Shutdown the component: close down the request map, etc.
+ void shutdown (void);
+ //@}
+
+ /// Main method: read the data from @a dgram and either pass ready data
+ /// to @a cdr_processor or update the <request_map_> if the request
+ /// is not yet complete.
+ /**
+ * Returns 1 if data was read successfully and accepted by
+ * <cdr_processor> without errors.
+ * Returns 0 if there were no errors, but no data has been passed to
+ * <cdr_processor>, either due to request being incomplete (not all
+ * fragments received), or it being a duplicate.
+ * Returns -1 if there were errors.
+ */
+ int handle_input (ACE_SOCK_Dgram& dgram,
+ TAO_ECG_CDR_Processor *cdr_processor);
+
+ /// Represents any request that has been fully received and
+ /// serviced, to simplify the internal logic.
+ static TAO_ECG_UDP_Request_Entry Request_Completed_;
+
+private:
+
+ enum {
+ ECG_DEFAULT_MAX_FRAGMENTED_REQUESTS = 1024,
+ ECG_DEFAULT_FRAGMENTED_REQUESTS_MIN_PURGE_COUNT = 32
+ };
+
+ struct Mcast_Header;
+ class Requests;
+
+ typedef ACE_Hash_Map_Manager<ACE_INET_Addr,
+ Requests*,
+ ACE_Null_Mutex> Request_Map;
+
+private:
+
+ /// Returns 1 on success, 0 if <request_id> has already been
+ /// received or is below current request range, and -1 on error.
+ int mark_received (const ACE_INET_Addr &from,
+ CORBA::ULong request_id);
+
+ /// Returns 1 if complete request is received and <event> is
+ /// populated, 0 if request has only partially been received or is a
+ /// duplicate, and -1 on error.
+ int process_fragment (const ACE_INET_Addr &from,
+ const Mcast_Header &header,
+ char * data_buf,
+ TAO_ECG_CDR_Processor *cdr_processor);
+
+
+ Request_Map::ENTRY* get_source_entry (const ACE_INET_Addr &from);
+
+private:
+
+ /// Ignore any events coming from this IP address.
+ TAO_ECG_Refcounted_Endpoint ignore_from_;
+
+ /// The map containing all the incoming requests which have been
+ /// partially received.
+ Request_Map request_map_;
+
+ /// Serializes use of <request_map_>.
+ // ACE_Lock* lock_;
+
+ /// Size of a fragmented requests array, i.e., max number of
+ /// partially received requests kept at any given time per source.
+ size_t max_requests_;
+
+ /// Minimum number of requests purged from a fragmented requests
+ /// array when the range of requests represented there needs to be
+ /// shifted.
+ size_t min_purge_count_;
+
+ /// Flag to indicate whether CRC should be computed and checked.
+ CORBA::Boolean check_crc_;
+};
+
+// ****************************************************************
+
+/// Helper for decoding, validating and storing mcast header.
+struct TAO_ECG_CDR_Message_Receiver::Mcast_Header
+{
+ int byte_order;
+ CORBA::ULong request_id;
+ CORBA::ULong request_size;
+ CORBA::ULong fragment_size;
+ CORBA::ULong fragment_offset;
+ CORBA::ULong fragment_id;
+ CORBA::ULong fragment_count;
+ CORBA::ULong crc;
+ int read (char * header,
+ size_t bytes_received,
+ CORBA::Boolean checkcrc = 0);
+};
+
+// ****************************************************************
+
+/// Once init() has been called:
+/// Invariant: id_range_high_- id_range_low_ == size_ - 1
+class TAO_ECG_CDR_Message_Receiver::Requests
+{
+public:
+
+ Requests (void);
+ ~Requests (void);
+
+ /// Allocates and initializes <fragmented_requests_>.
+ int init (size_t size, size_t min_purge_count);
+
+ /// Returns pointer to a <fragmented_requests_> element
+ /// representing <request_id>.
+ /**
+ * If <request_id> < <id_range_low> return 0.
+ * If <request_id> > <id_range_high>, shift the range so it
+ * includes <request_id>, purging incomplete requests as needed.
+ */
+ TAO_ECG_UDP_Request_Entry ** get_request (CORBA::ULong request_id);
+
+private:
+
+ /// Delete any outstanding requests with ids in the range
+ /// [<purge_first>, <purge_last>] from <fragmented_requests> and
+ /// and reset their slots.
+ void purge_requests (CORBA::ULong purge_first,
+ CORBA::ULong purge_last);
+
+ Requests & operator= (const Requests &rhs);
+ Requests (const Requests &rhs);
+
+private:
+ /// Array, used in a circular fashion, that stores partially received
+ /// requests (and info on which requests have been fully received
+ /// and processed) for a range of request ids.
+ TAO_ECG_UDP_Request_Entry** fragmented_requests_;
+
+ /// Size of <fragmented_requests_> array.
+ size_t size_;
+
+ /// The range of request ids, currently represented in
+ /// <fragmented_requests>.
+ //@{
+ CORBA::ULong id_range_low_;
+ CORBA::ULong id_range_high_;
+ //@}
+
+ /// Minimum range shifting amount.
+ size_t min_purge_count_;
+};
+
+TAO_END_VERSIONED_NAMESPACE_DECL
+
+#if defined(__ACE_INLINE__)
+#include "orbsvcs/Event/ECG_CDR_Message_Receiver.i"
+#endif /* __ACE_INLINE__ */
+
+#include /**/ "ace/post.h"
+
+#endif /* TAO_ECG_CDR_MESSAGE_RECEIVER_H */
diff --git a/TAO/orbsvcs/orbsvcs/Event/ECG_CDR_Message_Receiver.i b/TAO/orbsvcs/orbsvcs/Event/ECG_CDR_Message_Receiver.i
new file mode 100644
index 00000000000..078166a6088
--- /dev/null
+++ b/TAO/orbsvcs/orbsvcs/Event/ECG_CDR_Message_Receiver.i
@@ -0,0 +1,51 @@
+// -*- C++ -*-
+//
+// $Id$
+
+TAO_BEGIN_VERSIONED_NAMESPACE_DECL
+
+ACE_INLINE
+TAO_ECG_CDR_Message_Receiver::Requests::Requests (void)
+ : fragmented_requests_ (0)
+ , size_ (0)
+ , id_range_low_ (0)
+ , id_range_high_ (0)
+ , min_purge_count_ (0)
+{
+}
+
+// ****************************************************************
+
+ACE_INLINE
+TAO_ECG_CDR_Message_Receiver::TAO_ECG_CDR_Message_Receiver (CORBA::Boolean crc)
+ : ignore_from_ ()
+ , request_map_ ()
+ /* , lock_ (0) */
+ , max_requests_ (ECG_DEFAULT_MAX_FRAGMENTED_REQUESTS)
+ , min_purge_count_ (ECG_DEFAULT_FRAGMENTED_REQUESTS_MIN_PURGE_COUNT)
+ , check_crc_ (crc)
+{
+// ACE_NEW (this->lock_,
+// ACE_Lock_Adapter<ACE_Null_Mutex>);
+}
+
+ACE_INLINE
+TAO_ECG_CDR_Message_Receiver::~TAO_ECG_CDR_Message_Receiver (void)
+{
+ this->shutdown ();
+}
+
+ACE_INLINE void
+TAO_ECG_CDR_Message_Receiver::init (TAO_ECG_Refcounted_Endpoint ignore_from
+ /*, ACE_Lock *lock */)
+{
+ this->ignore_from_ = ignore_from;
+
+// if (lock)
+// {
+// delete this->lock_;
+// this->lock_ = lock;
+// }
+}
+
+TAO_END_VERSIONED_NAMESPACE_DECL
diff --git a/TAO/orbsvcs/orbsvcs/Event/ECG_CDR_Message_Sender.cpp b/TAO/orbsvcs/orbsvcs/Event/ECG_CDR_Message_Sender.cpp
new file mode 100644
index 00000000000..be2af5fe269
--- /dev/null
+++ b/TAO/orbsvcs/orbsvcs/Event/ECG_CDR_Message_Sender.cpp
@@ -0,0 +1,340 @@
+// $Id$
+
+#include "orbsvcs/Event/ECG_CDR_Message_Sender.h"
+#include "tao/CDR.h"
+#include "ace/SOCK_Dgram.h"
+#include "ace/INET_Addr.h"
+#include "ace/ACE.h"
+
+#if !defined(__ACE_INLINE__)
+#include "orbsvcs/Event/ECG_CDR_Message_Sender.i"
+#endif /* __ACE_INLINE__ */
+
+ACE_RCSID(Event, ECG_CDR_Message_Sender, "$Id$")
+
+TAO_BEGIN_VERSIONED_NAMESPACE_DECL
+
+void
+TAO_ECG_CDR_Message_Sender::init (
+ TAO_ECG_Refcounted_Endpoint endpoint_rptr
+ ACE_ENV_ARG_DECL)
+ ACE_THROW_SPEC ((CORBA::SystemException))
+{
+ if (endpoint_rptr.get () == 0
+ || endpoint_rptr->dgram ().get_handle () == ACE_INVALID_HANDLE)
+ {
+ ACE_ERROR ((LM_ERROR, "TAO_ECG_CDR_Message_Sender::init(): "
+ "nil or unitialized endpoint argument.\n"));
+ ACE_THROW (CORBA::INTERNAL ());
+ }
+
+ this->endpoint_rptr_ = endpoint_rptr;
+}
+
+void
+TAO_ECG_CDR_Message_Sender::send_message (const TAO_OutputCDR &cdr,
+ const ACE_INET_Addr &addr
+ ACE_ENV_ARG_DECL)
+ ACE_THROW_SPEC ((CORBA::SystemException))
+{
+ if (this->endpoint_rptr_.get () == 0)
+ {
+ ACE_ERROR ((LM_ERROR, "Attempt to invoke send_message() "
+ "on non-initialized sender object.\n"));
+ ACE_THROW (CORBA::INTERNAL ());
+ }
+
+ CORBA::ULong max_fragment_payload = this->mtu () -
+ TAO_ECG_CDR_Message_Sender::ECG_HEADER_SIZE;
+ // ACE_ASSERT (max_fragment_payload != 0);
+
+#if defined (ACE_HAS_BROKEN_DGRAM_SENDV)
+ const int TAO_WRITEV_MAX = ACE_IOV_MAX - 1;
+#else
+ const int TAO_WRITEV_MAX = ACE_IOV_MAX;
+#endif /* ACE_HAS_BROKEN_DGRAM_SENDV */
+ iovec iov[TAO_WRITEV_MAX];
+
+ CORBA::ULong total_length;
+ CORBA::ULong fragment_count =
+ this->compute_fragment_count (cdr.begin (),
+ cdr.end (),
+ TAO_WRITEV_MAX,
+ max_fragment_payload,
+ total_length);
+
+ CORBA::ULong request_id = this->endpoint_rptr_->next_request_id ();
+
+ // Reserve the first iovec for the header...
+ int iovcnt = 1;
+ CORBA::ULong fragment_id = 0;
+ CORBA::ULong fragment_offset = 0;
+ CORBA::ULong fragment_size = 0;
+ for (const ACE_Message_Block* b = cdr.begin ();
+ b != cdr.end ();
+ b = b->cont ())
+ {
+ CORBA::ULong l = b->length ();
+
+ char* rd_ptr = b->rd_ptr ();
+
+ iov[iovcnt].iov_base = rd_ptr;
+ iov[iovcnt].iov_len = l;
+ fragment_size += l;
+ ++iovcnt;
+ while (fragment_size > max_fragment_payload)
+ {
+ // This fragment is full, we have to send it...
+
+ // First adjust the last iov entry:
+ CORBA::ULong last_mb_length =
+ max_fragment_payload - (fragment_size - l);
+ iov[iovcnt - 1].iov_len = last_mb_length;
+
+ this->send_fragment (addr,
+ request_id,
+ total_length,
+ max_fragment_payload,
+ fragment_offset,
+ fragment_id,
+ fragment_count,
+ iov,
+ iovcnt
+ ACE_ENV_ARG_PARAMETER);
+ ACE_CHECK;
+ ++fragment_id;
+ fragment_offset += max_fragment_payload;
+
+ // Reset, but don't forget that the last Message_Block
+ // may need to be sent in multiple fragments..
+ l -= last_mb_length;
+ rd_ptr += last_mb_length;
+ iov[1].iov_base = rd_ptr;
+ iov[1].iov_len = l;
+ fragment_size = l;
+ iovcnt = 2;
+ }
+ if (fragment_size == max_fragment_payload)
+ {
+ // We filled a fragment, but this time it was filled
+ // exactly, the treatment is a little different from the
+ // loop above...
+ this->send_fragment (addr,
+ request_id,
+ total_length,
+ max_fragment_payload,
+ fragment_offset,
+ fragment_id,
+ fragment_count,
+ iov,
+ iovcnt
+ ACE_ENV_ARG_PARAMETER);
+ ACE_CHECK;
+ ++fragment_id;
+ fragment_offset += max_fragment_payload;
+
+ iovcnt = 1;
+ fragment_size = 0;
+ }
+ if (iovcnt == TAO_WRITEV_MAX)
+ {
+ // Now we ran out of space in the iovec, we must send a
+ // fragment to work around that....
+ this->send_fragment (addr,
+ request_id,
+ total_length,
+ fragment_size,
+ fragment_offset,
+ fragment_id,
+ fragment_count,
+ iov,
+ iovcnt
+ ACE_ENV_ARG_PARAMETER);
+ ACE_CHECK;
+ ++fragment_id;
+ fragment_offset += fragment_size;
+
+ iovcnt = 1;
+ fragment_size = 0;
+ }
+ }
+ // There is something left in the iovvec that we must send
+ // also...
+ if (iovcnt != 1)
+ {
+ // Now we ran out of space in the iovec, we must send a
+ // fragment to work around that....
+ this->send_fragment (addr,
+ request_id,
+ total_length,
+ fragment_size,
+ fragment_offset,
+ fragment_id,
+ fragment_count,
+ iov,
+ iovcnt
+ ACE_ENV_ARG_PARAMETER);
+ ACE_CHECK;
+ ++fragment_id;
+ fragment_offset += fragment_size;
+
+ // reset, not needed here...
+ // iovcnt = 1;
+ // fragment_size = 0;
+ }
+ // ACE_ASSERT (total_length == fragment_offset);
+ // ACE_ASSERT (fragment_id == fragment_count);
+
+}
+
+
+void
+TAO_ECG_CDR_Message_Sender::send_fragment (const ACE_INET_Addr &addr,
+ CORBA::ULong request_id,
+ CORBA::ULong request_size,
+ CORBA::ULong fragment_size,
+ CORBA::ULong fragment_offset,
+ CORBA::ULong fragment_id,
+ CORBA::ULong fragment_count,
+ iovec iov[],
+ int iovcnt
+ ACE_ENV_ARG_DECL)
+{
+ CORBA::ULong header[TAO_ECG_CDR_Message_Sender::ECG_HEADER_SIZE
+ / sizeof(CORBA::ULong)
+ + ACE_CDR::MAX_ALIGNMENT];
+ char* buf = reinterpret_cast<char*> (header);
+ TAO_OutputCDR cdr (buf, sizeof(header));
+ cdr.write_boolean (TAO_ENCAP_BYTE_ORDER);
+ // Insert some known values in the padding bytes, so we can smoke
+ // test the message on the receiving end.
+ cdr.write_octet ('A'); cdr.write_octet ('B'); cdr.write_octet ('C');
+ cdr.write_ulong (request_id);
+ cdr.write_ulong (request_size);
+ cdr.write_ulong (fragment_size);
+ cdr.write_ulong (fragment_offset);
+ cdr.write_ulong (fragment_id);
+ cdr.write_ulong (fragment_count);
+ CORBA::Octet padding[4];
+
+
+ // MRH
+ if (checksum_)
+ {
+ // Compute CRC
+ iov[0].iov_base = cdr.begin ()->rd_ptr ();
+ iov[0].iov_len = cdr.begin ()->length ();
+ unsigned int crc = 0;
+ unsigned char *crc_parts = (unsigned char *)(&crc);
+ if (iovcnt > 1)
+ {
+ crc = ACE::crc32 (iov, iovcnt);
+ crc = htonl (crc);
+ }
+ for (int cnt=0; cnt<4; ++cnt)
+ {
+ padding[cnt] = crc_parts[cnt];
+ }
+ }
+ else
+ {
+ for (int cnt=0; cnt<4; ++cnt)
+ {
+ padding[cnt] = 0;
+ }
+ }
+ //End MRH
+ cdr.write_octet_array (padding, 4);
+
+ iov[0].iov_base = cdr.begin ()->rd_ptr ();
+ iov[0].iov_len = cdr.begin ()->length ();
+
+ ssize_t n = this->dgram ().send (iov,
+ iovcnt,
+ addr);
+ size_t expected_n = 0;
+ for (int i = 0; i < iovcnt; ++i)
+ expected_n += iov[i].iov_len;
+ if (n > 0 && size_t(n) != expected_n)
+ {
+ ACE_DEBUG ((LM_ERROR, ("Sent only %d out of %d bytes "
+ "for mcast fragment.\n"),
+ n,
+ expected_n));
+ }
+
+ if (n == -1)
+ {
+ if (errno == EWOULDBLOCK)
+ {
+ ACE_DEBUG ((LM_ERROR, "Send of mcast fragment failed (%m).\n"));
+ // @@ TODO Use a Event Channel specific exception
+ ACE_THROW (CORBA::COMM_FAILURE ());
+ }
+ else
+ {
+ ACE_DEBUG ((LM_WARNING, "Send of mcast fragment blocked (%m).\n"));
+ }
+ }
+ else if (n == 0)
+ {
+ ACE_DEBUG ((LM_WARNING, "EOF on send of mcast fragment (%m).\n"));
+ }
+}
+
+
+CORBA::ULong
+TAO_ECG_CDR_Message_Sender::compute_fragment_count (const ACE_Message_Block* begin,
+ const ACE_Message_Block* end,
+ int iov_size,
+ CORBA::ULong max_fragment_payload,
+ CORBA::ULong& total_length)
+{
+ CORBA::ULong fragment_count = 0;
+ total_length = 0;
+
+ CORBA::ULong fragment_size = 0;
+ // Reserve the first iovec for the header...
+ int iovcnt = 1;
+ for (const ACE_Message_Block* b = begin;
+ b != end;
+ b = b->cont ())
+ {
+ CORBA::ULong l = b->length ();
+ total_length += l;
+ fragment_size += l;
+ ++iovcnt;
+ while (fragment_size > max_fragment_payload)
+ {
+ // Ran out of space, must create a fragment...
+ ++fragment_count;
+
+ // The next iovector will contain what remains of this
+ // buffer, but also consider
+ iovcnt = 2;
+ l -= max_fragment_payload - (fragment_size - l);
+ fragment_size = l;
+ }
+ if (fragment_size == max_fragment_payload)
+ {
+ ++fragment_count;
+ iovcnt = 1;
+ fragment_size = 0;
+ }
+ if (iovcnt >= iov_size)
+ {
+ // Ran out of space in the iovector....
+ ++fragment_count;
+ iovcnt = 1;
+ fragment_size = 0;
+ }
+ }
+ if (iovcnt != 1)
+ {
+ // Send the remaining data in another fragment
+ ++fragment_count;
+ }
+ return fragment_count;
+}
+
+TAO_END_VERSIONED_NAMESPACE_DECL
diff --git a/TAO/orbsvcs/orbsvcs/Event/ECG_CDR_Message_Sender.h b/TAO/orbsvcs/orbsvcs/Event/ECG_CDR_Message_Sender.h
new file mode 100644
index 00000000000..0f7d8b723ba
--- /dev/null
+++ b/TAO/orbsvcs/orbsvcs/Event/ECG_CDR_Message_Sender.h
@@ -0,0 +1,190 @@
+// -*- C++ -*-
+
+/**
+ * @file ECG_CDR_Message_Sender.h
+ *
+ * $Id$
+ *
+ * @author Carlos O'Ryan (coryan@cs.wustl.edu)
+ * @author Marina Spivak (marina@atdesk.com)
+ */
+
+#ifndef TAO_ECG_CDR_MESSAGE_SENDER_H
+#define TAO_ECG_CDR_MESSAGE_SENDER_H
+
+#include /**/ "ace/pre.h"
+
+#include "orbsvcs/Event/ECG_UDP_Out_Endpoint.h"
+
+#if !defined (ACE_LACKS_PRAGMA_ONCE)
+# pragma once
+#endif /* ACE_LACKS_PRAGMA_ONCE */
+
+#include /**/ "orbsvcs/Event/event_serv_export.h"
+
+#include "tao/SystemException.h"
+#include "tao/Environment.h"
+
+#include "ace/INET_Addr.h"
+
+TAO_BEGIN_VERSIONED_NAMESPACE_DECL
+
+/**
+ * @class TAO_ECG_CDR_Message_Sender
+ *
+ * @brief Sends CDR messages using UDP.
+ * NOT THREAD-SAFE.
+ *
+ * This class breaks up a CDR message into fragments and sends each
+ * fragment with a header (described below) using UDP.
+ * The UDP address can be a normal IP address or it can be a multicast
+ * group. The UDP address is obtained from a RtecUDPAdmin::AddrServer
+ * class.
+ *
+ * This class is used by various Gateway (Senders/Receivers) classes
+ * responsible for federating Event Channels with UDP/Mcast.
+ *
+ * <H2>MESSAGE FORMAT</H2>
+ * Message header are encapsulated using CDR, with the
+ * following format:
+ * struct Header {
+ * octet byte_order_flags;
+ * // bit 0 represents the byte order as in GIOP 1.1
+ * // bit 1 is set if this is the last fragment
+ * unsigned long request_id;
+ * // The request ID, senders must not send two requests with
+ * // the same ID, senders can be distinguished using recvfrom..
+ * unsigned long request_size;
+ * // The size of this request, this can be used to pre-allocate
+ * // the request buffer.
+ * unsgined long fragment_size;
+ * // The size of this fragment, excluding the header...
+ * unsigned long fragment_offset;
+ * // Where does this fragment fit in the complete message...
+ * unsigned long fragment_id;
+ * // The ID of this fragment...
+ * unsigned long fragment_count;
+ * // The total number of fragments to expect in this request
+ *
+ * // @todo This could be eliminated if efficient reassembly
+ * // could be implemented without it.
+ * octet padding[4];
+ *
+ * // Ensures the header ends at an 8-byte boundary.
+ * }; // size (in CDR stream) = 32
+ */
+class TAO_RTEvent_Serv_Export TAO_ECG_CDR_Message_Sender
+{
+public:
+
+ enum {
+ ECG_HEADER_SIZE = 32,
+ ECG_MIN_MTU = 32 + 8,
+ ECG_MAX_MTU = 65536, // Really optimistic...
+ ECG_DEFAULT_MTU = 1024
+ };
+
+ /// Initialization and termination methods.
+ //@{
+ TAO_ECG_CDR_Message_Sender (CORBA::Boolean crc = 0);
+
+ /// Set the endpoint for sending messages.
+ /**
+ * If init () is successful, shutdown () must be called when the
+ * sender is no longer needed. If shutdown () is not called by the
+ * user, cleanup activities will be performed by the destructor.
+ */
+ void init (TAO_ECG_Refcounted_Endpoint endpoint_rptr
+ ACE_ENV_ARG_DECL)
+ ACE_THROW_SPEC ((CORBA::SystemException));
+
+ // Shutdown this component. Frees up the endpoint.
+ void shutdown (ACE_ENV_SINGLE_ARG_DECL);
+ //@}
+
+ /// Setters/getters.
+ //@{
+ /// Get the local endpoint used to send the events.
+ int get_local_addr (ACE_INET_Addr& addr);
+
+ /**
+ * The sender may need to fragment the message, otherwise the
+ * network may drop the packets.
+ * Setting the MTU can fail if the value is too small (at least the
+ * header + 8 bytes must fit).
+ */
+ int mtu (CORBA::ULong mtu);
+ CORBA::ULong mtu (void) const;
+ //@}
+
+ /// The main method - send a CDR message.
+ /**
+ * @todo Under some platforms, notably Linux, the fragmentation code
+ * in this method is woefully naive. The fragments are sent it a
+ * big burst, unfortunately, that can fill up the local kernel
+ * buffer before all the data is sent. In those circumstances some
+ * of the fragments are silently (gulp!) dropped by the kernel,
+ * check the documentation for sendto(2) specially the ENOBUFS
+ * error condition.
+ * There is no easy solution that I know off, except "pacing" the
+ * fragments, i.e. never sending more than a prescribed number of
+ * bytes per-second, sleeping before sending more or queueing them
+ * to send later via the reactor.
+ */
+ void send_message (const TAO_OutputCDR &cdr,
+ const ACE_INET_Addr &addr
+ ACE_ENV_ARG_DECL)
+ ACE_THROW_SPEC ((CORBA::SystemException));
+
+private:
+ /// Return the datagram...
+ ACE_SOCK_Dgram& dgram (void);
+
+ /**
+ * Send one fragment, the first entry in the iovec is used to send
+ * the header, the rest of the iovec array should contain pointers
+ * to the actual data.
+ */
+ void send_fragment (const ACE_INET_Addr &addr,
+ CORBA::ULong request_id,
+ CORBA::ULong request_size,
+ CORBA::ULong fragment_size,
+ CORBA::ULong fragment_offset,
+ CORBA::ULong fragment_id,
+ CORBA::ULong fragment_count,
+ iovec iov[],
+ int iovcnt
+ ACE_ENV_ARG_DECL);
+
+ /**
+ * Count the number of fragments that will be required to send the
+ * message blocks in the range [begin,end)
+ * The maximum fragment payload (i.e. the size without the header is
+ * also required); <total_length> returns the total message size.
+ */
+ CORBA::ULong compute_fragment_count (const ACE_Message_Block* begin,
+ const ACE_Message_Block* end,
+ int iov_size,
+ CORBA::ULong max_fragment_payload,
+ CORBA::ULong& total_length);
+
+private:
+ /// The datagram used for sendto ().
+ TAO_ECG_Refcounted_Endpoint endpoint_rptr_;
+
+ /// The MTU for this sender...
+ CORBA::ULong mtu_;
+
+ /// Should crc checksum be caluclated and sent?
+ CORBA::Boolean checksum_;
+};
+
+TAO_END_VERSIONED_NAMESPACE_DECL
+
+#if defined(__ACE_INLINE__)
+#include "orbsvcs/Event/ECG_CDR_Message_Sender.i"
+#endif /* __ACE_INLINE__ */
+
+#include /**/ "ace/post.h"
+
+#endif /* TAO_ECG_CDR_MESSAGE_SENDER_H */
diff --git a/TAO/orbsvcs/orbsvcs/Event/ECG_CDR_Message_Sender.i b/TAO/orbsvcs/orbsvcs/Event/ECG_CDR_Message_Sender.i
new file mode 100644
index 00000000000..aa1242d07fe
--- /dev/null
+++ b/TAO/orbsvcs/orbsvcs/Event/ECG_CDR_Message_Sender.i
@@ -0,0 +1,56 @@
+// -*- C++ -*-
+//
+// $Id$
+
+#include "ace/Null_Mutex.h"
+
+TAO_BEGIN_VERSIONED_NAMESPACE_DECL
+
+ACE_INLINE
+TAO_ECG_CDR_Message_Sender::TAO_ECG_CDR_Message_Sender (CORBA::Boolean crc)
+ : endpoint_rptr_ ()
+ , mtu_ (TAO_ECG_CDR_Message_Sender::ECG_DEFAULT_MTU)
+ , checksum_ (crc)
+{
+}
+
+ACE_INLINE void
+TAO_ECG_CDR_Message_Sender::shutdown (ACE_ENV_SINGLE_ARG_DECL_NOT_USED)
+{
+ // Release the endpoint.
+ TAO_ECG_Refcounted_Endpoint empty_endpoint_rptr;
+ this->endpoint_rptr_ = empty_endpoint_rptr;
+}
+
+ACE_INLINE ACE_SOCK_Dgram&
+TAO_ECG_CDR_Message_Sender::dgram (void)
+{
+ ACE_ASSERT (this->endpoint_rptr_.get ());
+ return this->endpoint_rptr_->dgram ();
+}
+
+ACE_INLINE int
+TAO_ECG_CDR_Message_Sender::get_local_addr (ACE_INET_Addr& addr)
+{
+ if (this->endpoint_rptr_.get () == 0)
+ return -1;
+ return this->dgram ().get_local_addr (addr);
+}
+
+ACE_INLINE CORBA::ULong
+TAO_ECG_CDR_Message_Sender::mtu (void) const
+{
+ return this->mtu_;
+}
+
+ACE_INLINE int
+TAO_ECG_CDR_Message_Sender::mtu (CORBA::ULong new_mtu)
+{
+ if (new_mtu < TAO_ECG_CDR_Message_Sender::ECG_MIN_MTU
+ || new_mtu >= TAO_ECG_CDR_Message_Sender::ECG_MAX_MTU)
+ return -1;
+ this->mtu_ = new_mtu;
+ return 0;
+}
+
+TAO_END_VERSIONED_NAMESPACE_DECL
diff --git a/TAO/orbsvcs/orbsvcs/Event/ECG_Complex_Address_Server.cpp b/TAO/orbsvcs/orbsvcs/Event/ECG_Complex_Address_Server.cpp
new file mode 100644
index 00000000000..3091fb79acf
--- /dev/null
+++ b/TAO/orbsvcs/orbsvcs/Event/ECG_Complex_Address_Server.cpp
@@ -0,0 +1,170 @@
+// $Id$
+
+#include "orbsvcs/Event/ECG_Complex_Address_Server.h"
+#include "ace/SString.h"
+#include "ace/streams.h"
+
+#if !defined(__ACE_INLINE__)
+#include "orbsvcs/Event/ECG_Complex_Address_Server.i"
+#endif /* __ACE_INLINE__ */
+
+TAO_BEGIN_VERSIONED_NAMESPACE_DECL
+
+TAO_ECG_Complex_Address_Server::TAO_ECG_Complex_Address_Server (
+ int is_source_mapping)
+ : is_source_mapping_ (is_source_mapping)
+{
+}
+
+TAO_ECG_Complex_Address_Server::~TAO_ECG_Complex_Address_Server (void)
+{
+}
+
+int
+TAO_ECG_Complex_Address_Server::init (const char *arg)
+{
+ ACE_CString key_string;
+ ACE_CString mcast_string;
+
+ // Our position in parsing initialization string.
+ const char * data = arg;
+
+ // Parse initialization string until we reach the end.
+ while (*data != '\0')
+ {
+ // Extract lookup value (it is followed by '@').
+ const char * location = 0;
+ location = ACE_OS::strchr (data, '@');
+ if (!location)
+ {
+ ACE_ERROR_RETURN ((LM_ERROR,
+ "Unable to initialize address "
+ "server: cannot find <@> separator "
+ "in initialization string "
+ "as expected\n"),
+ -1);
+ }
+ size_t len = location - data;
+ key_string.set (data, len, 1);
+ data += len + 1;
+
+ // Extract mcast address to be mapped to just extracted lookup
+ // value.
+ location = 0;
+ location = ACE_OS::strchr (data, ' ');
+ if (location)
+ {
+ len = location - data;
+ mcast_string.set (data, len, 1);
+ data += len + 1;
+ }
+ else
+ {
+ // This must be the last entry in the mapping.
+ len = ACE_OS::strlen (data);
+ mcast_string.set (data, len, 1);
+ data += len;
+ }
+
+ // Add new entry to the mapping.
+ if (this->add_entry (key_string.c_str (),
+ mcast_string.c_str ()) == -1)
+ return -1;
+ }
+ return 0;
+}
+
+int
+TAO_ECG_Complex_Address_Server::add_entry (const char * key,
+ const char * mcast_addr)
+{
+ // Check whether this is the default mcast address.
+ if (ACE_OS::strlen (key) == 1
+ && *key == '*')
+ {
+ if (this->default_addr_.set (mcast_addr) == -1)
+ ACE_ERROR_RETURN ((LM_ERROR, "Unable to initialize: invalid "
+ "mcast address specified: %s.\n",
+ mcast_addr),
+ -1);
+ return 0;
+ }
+
+ // Convert strings to values.
+ char * endptr = 0;
+ CORBA::Long header_value = ACE_OS::strtol (key, &endptr, 0);
+ if (*endptr != '\0')
+ {
+ ACE_ERROR_RETURN ((LM_ERROR, "Unable to initialize: invalid "
+ "source/type specified: %s.\n",
+ key),
+ -1);
+ }
+
+ ACE_INET_Addr addr;
+ if (addr.set (mcast_addr) == -1)
+ {
+ ACE_ERROR_RETURN ((LM_ERROR, "Unable to initialize: invalid "
+ "mcast address specified: %s.\n",
+ mcast_addr),
+ -1);
+ }
+
+ if (this->mcast_mapping_.bind (header_value, addr) == -1)
+ {
+ ACE_ERROR_RETURN ((LM_ERROR, "Unable to initialize: error adding "
+ "new entry to the mapping.\n"),
+ -1);
+ }
+
+ return 0;
+}
+
+
+void
+TAO_ECG_Complex_Address_Server::get_addr (
+ const RtecEventComm::EventHeader& header,
+ RtecUDPAdmin::UDP_Addr_out addr
+ ACE_ENV_ARG_DECL_NOT_USED)
+ ACE_THROW_SPEC ((CORBA::SystemException))
+{
+ CORBA::Long key;
+ if (this->is_source_mapping_)
+ key = header.source;
+ else
+ key = header.type;
+
+ MAP::ENTRY * mapping_entry = 0;
+ if (this->mcast_mapping_.find (key, mapping_entry) == -1)
+ {
+ // Key was not found in the mapping. Use default.
+ addr.ipaddr = this->default_addr_.get_ip_address ();
+ addr.port = this->default_addr_.get_port_number ();
+ }
+ else
+ {
+ addr.ipaddr = mapping_entry->int_id_.get_ip_address ();
+ addr.port = mapping_entry->int_id_.get_port_number ();
+ }
+}
+
+void
+TAO_ECG_Complex_Address_Server::dump_content (void)
+{
+ ACE_DEBUG ((LM_DEBUG, "Default address: %s:%d\n",
+ this->default_addr_.get_host_addr (),
+ this->default_addr_.get_port_number ()));
+
+ for (MAP::iterator iter = this->mcast_mapping_.begin ();
+ iter != this->mcast_mapping_.end ();
+ iter++)
+ {
+ MAP::ENTRY & entry = *iter;
+ ACE_DEBUG ((LM_DEBUG, "%d --> %s:%d\n",
+ entry.ext_id_,
+ this->default_addr_.get_host_addr (),
+ this->default_addr_.get_port_number ()));
+ }
+}
+
+TAO_END_VERSIONED_NAMESPACE_DECL
diff --git a/TAO/orbsvcs/orbsvcs/Event/ECG_Complex_Address_Server.h b/TAO/orbsvcs/orbsvcs/Event/ECG_Complex_Address_Server.h
new file mode 100644
index 00000000000..bbe55390465
--- /dev/null
+++ b/TAO/orbsvcs/orbsvcs/Event/ECG_Complex_Address_Server.h
@@ -0,0 +1,118 @@
+// -*- C++ -*-
+
+/**
+ * @file ECG_Complex_Address_Server.h
+ *
+ * $Id$
+ *
+ * @author Marina Spivak (marina@atdesk.com)
+ *
+ */
+
+#ifndef TAO_ECG_COMPLEX_ADDRESS_SERVER_H
+#define TAO_ECG_COMPLEX_ADDRESS_SERVER_H
+
+#include /**/ "ace/pre.h"
+
+#include /**/ "orbsvcs/Event/event_serv_export.h"
+
+#include "orbsvcs/RtecUDPAdminS.h"
+#include "ace/Hash_Map_Manager_T.h"
+#include "ace/INET_Addr.h"
+#include "ace/Null_Mutex.h"
+
+#include "orbsvcs/Event/EC_Lifetime_Utils_T.h"
+
+TAO_BEGIN_VERSIONED_NAMESPACE_DECL
+
+/**
+ * @class TAO_ECG_Complex_Address_Server
+ *
+ * @brief Implementation of RtecUDPAdmin idl interface, which returns
+ * a different multicast address based on event source (or event type
+ * - depending on how the server is configured).
+ *
+ * INITIALIZATION STRING FORMAT
+ *
+ * The string is a sequence of <key>@<value> pairs separated by
+ * a single space, where <key> is event source (or type)
+ * and <value> is the corresponding mcast address. Example:
+ * "34@230.100.0.2:2300 45@230.100.123.43:2300"
+ * The string above represents two key-value pairs.
+ *
+ * A special key "*" is used to specify the default mcast address,
+ * i.e., the one that will be returned for event sources that weren't
+ * explicitly specified in the initialization string. Example:
+ * "*@230.100.0.2:2300 45@230.100.123.43:2300"
+ *
+ */
+class TAO_RTEvent_Serv_Export TAO_ECG_Complex_Address_Server :
+ public virtual POA_RtecUDPAdmin::AddrServer
+{
+public:
+
+ /// Create a new TAO_ECG_Complex_Address_Server object.
+ /*
+ * (Constructor access is restricted to insure that all
+ * TAO_ECG_Complex_Address_Server objects are heap-allocated.)
+ * <is_source_mapping> flag indicates whether this
+ * server maps based on event header source or event header type.
+ */
+ static TAO_EC_Servant_Var<TAO_ECG_Complex_Address_Server>
+ create (int is_source_mapping = 1);
+
+ /// Destructor
+ virtual ~TAO_ECG_Complex_Address_Server (void);
+
+ /// Initializes the mapping from the <arg> string. See class notes
+ /// for the expected format.
+ int init (const char *arg);
+
+ // = The RtecUDPAdmin::AddrServer methods
+ virtual void get_addr (const RtecEventComm::EventHeader& header,
+ RtecUDPAdmin::UDP_Addr_out addr
+ ACE_ENV_ARG_DECL)
+ ACE_THROW_SPEC ((CORBA::SystemException));
+
+ /// Prints out complete content of the address server. Useful for
+ /// debugging.
+ void dump_content (void);
+
+protected:
+
+ /// Constructor (protected). Clients can create new
+ /// TAO_ECG_Complex_Address_Server objects using the static create()
+ /// method.
+ /// <is_source_mapping> flag indicates whether this
+ /// server maps based on event header source or event header type.
+ TAO_ECG_Complex_Address_Server (int is_source_mapping = 1);
+
+private:
+
+ /// Helper. Given key and mcast address in string form, add them to
+ /// the mapping.
+ int add_entry (const char * key, const char * mcast_addr);
+
+ /// Flag indicating whether this address server maps event source or
+ /// event type to mcast groups.
+ int is_source_mapping_;
+
+ typedef ACE_Hash_Map_Manager_Ex<CORBA::Long, ACE_INET_Addr,
+ ACE_Hash<CORBA::Long>, ACE_Equal_To<CORBA::Long>, ACE_Null_Mutex> MAP;
+
+ MAP mcast_mapping_;
+
+ /// Mcast group to be used for all sources (or types) not explicitly
+ /// mapped.
+ ACE_INET_Addr default_addr_;
+};
+
+TAO_END_VERSIONED_NAMESPACE_DECL
+
+#if defined(__ACE_INLINE__)
+#include "orbsvcs/Event/ECG_Complex_Address_Server.i"
+#endif /* __ACE_INLINE__ */
+
+#include /**/ "ace/post.h"
+
+#endif /* TAO_ECG_COMPLEX_ADDRESS_SERVER_H */
diff --git a/TAO/orbsvcs/orbsvcs/Event/ECG_Complex_Address_Server.i b/TAO/orbsvcs/orbsvcs/Event/ECG_Complex_Address_Server.i
new file mode 100644
index 00000000000..b47e2db3e68
--- /dev/null
+++ b/TAO/orbsvcs/orbsvcs/Event/ECG_Complex_Address_Server.i
@@ -0,0 +1,17 @@
+// -*- C++ -*-
+//
+// $Id$
+
+TAO_BEGIN_VERSIONED_NAMESPACE_DECL
+
+ACE_INLINE TAO_EC_Servant_Var<TAO_ECG_Complex_Address_Server>
+TAO_ECG_Complex_Address_Server::create (int is_source_mapping)
+{
+ TAO_EC_Servant_Var<TAO_ECG_Complex_Address_Server> s;
+ ACE_NEW_RETURN (s,
+ TAO_ECG_Complex_Address_Server (is_source_mapping),
+ s);
+ return s;
+}
+
+TAO_END_VERSIONED_NAMESPACE_DECL
diff --git a/TAO/orbsvcs/orbsvcs/Event/ECG_ConsumerEC_Control.cpp b/TAO/orbsvcs/orbsvcs/Event/ECG_ConsumerEC_Control.cpp
new file mode 100644
index 00000000000..b5b65cc294b
--- /dev/null
+++ b/TAO/orbsvcs/orbsvcs/Event/ECG_ConsumerEC_Control.cpp
@@ -0,0 +1,42 @@
+// $Id$
+
+#include "orbsvcs/Event/ECG_ConsumerEC_Control.h"
+
+ACE_RCSID(Event, ECG_ConsumerEventChannelControl, "$Id$")
+
+TAO_BEGIN_VERSIONED_NAMESPACE_DECL
+
+TAO_ECG_ConsumerEC_Control::TAO_ECG_ConsumerEC_Control (void)
+{
+}
+
+TAO_ECG_ConsumerEC_Control::~TAO_ECG_ConsumerEC_Control (void)
+{
+}
+
+int
+TAO_ECG_ConsumerEC_Control::activate (void)
+{
+ return 0;
+}
+
+int
+TAO_ECG_ConsumerEC_Control::shutdown (void)
+{
+ return 0;
+}
+
+void
+TAO_ECG_ConsumerEC_Control::event_channel_not_exist (TAO_EC_Gateway_IIOP *
+ ACE_ENV_ARG_DECL_NOT_USED)
+{
+}
+
+void
+TAO_ECG_ConsumerEC_Control::system_exception (TAO_EC_Gateway_IIOP *,
+ CORBA::SystemException &
+ ACE_ENV_ARG_DECL_NOT_USED)
+{
+}
+
+TAO_END_VERSIONED_NAMESPACE_DECL
diff --git a/TAO/orbsvcs/orbsvcs/Event/ECG_ConsumerEC_Control.h b/TAO/orbsvcs/orbsvcs/Event/ECG_ConsumerEC_Control.h
new file mode 100644
index 00000000000..a8141829787
--- /dev/null
+++ b/TAO/orbsvcs/orbsvcs/Event/ECG_ConsumerEC_Control.h
@@ -0,0 +1,83 @@
+// -*- C++ -*-
+
+/**
+ * @file ECG_ConsumerEC_Control.h
+ *
+ * $Id$
+ *
+ * @author Johnny Willemsen (jwillemsen@remedy.nl)
+ *
+ */
+
+#ifndef TAO_ECG_ConsumerEC_Control_H
+#define TAO_ECG_ConsumerEC_Control_H
+
+#include /**/ "ace/pre.h"
+#include "ace/CORBA_macros.h"
+
+#if !defined (ACE_LACKS_PRAGMA_ONCE)
+# pragma once
+#endif /* ACE_LACKS_PRAGMA_ONCE */
+
+#include "tao/Basic_Types.h"
+
+#include /**/ "orbsvcs/Event/event_serv_export.h"
+
+TAO_BEGIN_VERSIONED_NAMESPACE_DECL
+
+class TAO_EC_Gateway_IIOP;
+class TAO_EC_ProxyPushSupplier;
+
+namespace CORBA
+{
+ class Environment;
+ class SystemException;
+}
+
+/**
+ * @class TAO_ECG_ConsumerEC_Control
+ *
+ * @brief EventChannelControl
+ *
+ * Defines the interface for the consumer event channel control strategy.
+ * This strategy handles misbehaving or failing event channels that are consumer
+ * of a gateway.
+ */
+class TAO_RTEvent_Serv_Export TAO_ECG_ConsumerEC_Control
+{
+public:
+ /// Constructor.
+ TAO_ECG_ConsumerEC_Control (void);
+
+ /// Destructor.
+ virtual ~TAO_ECG_ConsumerEC_Control (void);
+
+ /// Activate any internal threads or timers used to poll the state of
+ /// the event channel.
+ virtual int activate (void);
+
+ /// Shutdown any internal threads or timers used to poll the state of
+ /// the event channel.
+ virtual int shutdown (void);
+
+ /**
+ * When pushing an event to the event channel a CORBA::OBJECT_NOT_EXIST
+ * exception was raised. The only interpretation is that the object
+ * has been destroyed. The strategy has to (at the very least),
+ * reclaim all the resources attached to that object.
+ */
+ virtual void event_channel_not_exist (TAO_EC_Gateway_IIOP * gateway
+ ACE_ENV_ARG_DECL_NOT_USED);
+
+ /// Some system exception was raised while trying to contact the
+ /// event channel
+ virtual void system_exception (TAO_EC_Gateway_IIOP * gateway,
+ CORBA::SystemException &
+ ACE_ENV_ARG_DECL_NOT_USED);
+};
+
+TAO_END_VERSIONED_NAMESPACE_DECL
+
+#include /**/ "ace/post.h"
+
+#endif /* TAO_ECG_ConsumerEC_Control_H */
diff --git a/TAO/orbsvcs/orbsvcs/Event/ECG_Defaults.h b/TAO/orbsvcs/orbsvcs/Event/ECG_Defaults.h
new file mode 100644
index 00000000000..77dd5a28dae
--- /dev/null
+++ b/TAO/orbsvcs/orbsvcs/Event/ECG_Defaults.h
@@ -0,0 +1,79 @@
+// -*- C++ -*-
+
+/**
+ * @file ECG_Defaults.h
+ *
+ * $Id$
+ *
+ * In this file we set the compile time defaults for the event
+ * channel multicast gateway.
+ *
+ * @author Marina Spivak (marina@atdesk.com)
+ */
+
+#ifndef TAO_ECG_DEFAULTS_H
+#define TAO_ECG_DEFAULTS_H
+#include /**/ "ace/pre.h"
+
+// Any of the definitions below can be overriden in the config.h file
+// or the compilation line.
+
+#ifndef TAO_ECG_DEFAULT_SERVICE
+# define TAO_ECG_DEFAULT_SERVICE ECG_MCAST_TWO_WAY
+#endif /* TAO_ECG_DEFAULT_SERVICE */
+
+#ifndef TAO_ECG_DEFAULT_HANDLER
+# define TAO_ECG_DEFAULT_HANDLER ECG_HANDLER_BASIC
+#endif /* TAO_ECG_DEFAULT_HANDLER */
+
+#ifndef TAO_ECG_DEFAULT_ADDRESS_SERVER
+# define TAO_ECG_DEFAULT_ADDRESS_SERVER ECG_ADDRESS_SERVER_BASIC
+#endif /* TAO_ECG_DEFAULT_ADDRESS_SERVER */
+
+/* must be provided by the user */
+#ifndef TAO_ECG_DEFAULT_ADDRESS_SERVER_ARG
+# define TAO_ECG_DEFAULT_ADDRESS_SERVER_ARG 0
+#endif /* TAO_ECG_DEFAULT_ADDRESS_SERVER_ARG */
+
+#ifndef TAO_ECG_DEFAULT_TTL
+# define TAO_ECG_DEFAULT_TTL 0 /* don't set, use default */
+#endif /* TAO_ECG_DEFAULT_TTL */
+
+#ifndef TAO_ECG_DEFAULT_NIC
+# define TAO_ECG_DEFAULT_NIC 0 /* use default */
+#endif /* TAO_ECG_DEFAULT_NIC */
+
+#ifndef TAO_ECG_DEFAULT_IP_MULTICAST_LOOP
+# define TAO_ECG_DEFAULT_IP_MULTICAST_LOOP 1 /* loopback mcast messages */
+#endif /* TAO_ECG_DEFAULT_IP_MULTICAST_LOOP */
+
+#ifndef TAO_ECG_DEFAULT_NON_BLOCKING
+# define TAO_ECG_DEFAULT_NON_BLOCKING 1 /* write sockets are non-blocking */
+#endif /* TAO_ECG_DEFAULT_NON_BLOCKING */
+
+#ifndef TAO_ECG_DEFAULT_IIOP_CONSUMEREC_CONTROL
+# define TAO_ECG_DEFAULT_IIOP_CONSUMEREC_CONTROL 0 /* null */
+#endif /* TAO_ECG_DEFAULT_IIOP_CONSUMEREC_CONTROL */
+
+#ifndef TAO_ECG_DEFAULT_IIOP_CONSUMEREC_CONTROL_PERIOD
+# define TAO_ECG_DEFAULT_IIOP_CONSUMEREC_CONTROL_PERIOD 5000000 /* usecs */
+#endif /* TAO_ECG_DEFAULT_IIOP_CONSUMEREC_CONTROL_PERIOD */
+
+#ifndef TAO_ECG_DEFAULT_IIOP_CONSUMEREC_CONTROL_TIMEOUT
+# define TAO_ECG_DEFAULT_IIOP_CONSUMEREC_CONTROL_TIMEOUT 10000 /* usecs */
+#endif /* TAO_ECG_DEFAULT_IIOP_CONSUMEREC_CONTROL_TIMEOUT */
+
+#ifndef TAO_ECG_DEFAULT_IIOP_ORB_ID
+# define TAO_ECG_DEFAULT_IIOP_ORB_ID "" /* */
+#endif /* TAO_ECG_DEFAULT_IIOP_ORB_ID */
+
+#ifndef TAO_ECG_DEFAULT_IIOP_USE_TTL
+# define TAO_ECG_DEFAULT_IIOP_USE_TTL 1 /* use TTL */
+#endif /* TAO_ECG_DEFAULT_IIOP_USE_TTL */
+
+#ifndef TAO_ECG_DEFAULT_IIOP_USE_CONSUMER_PROXY_MAP
+# define TAO_ECG_DEFAULT_IIOP_USE_CONSUMER_PROXY_MAP 1 /* use consumer proxy map */
+#endif /* TAO_ECG_DEFAULT_IIOP_USE_CONSUMER_PROXY_MAP */
+
+#include /**/ "ace/post.h"
+#endif /* TAO_ECG_DEFAULTS_H */
diff --git a/TAO/orbsvcs/orbsvcs/Event/ECG_Mcast_EH.cpp b/TAO/orbsvcs/orbsvcs/Event/ECG_Mcast_EH.cpp
new file mode 100644
index 00000000000..e72dafca760
--- /dev/null
+++ b/TAO/orbsvcs/orbsvcs/Event/ECG_Mcast_EH.cpp
@@ -0,0 +1,303 @@
+// $Id$
+
+#include "orbsvcs/Event/ECG_Mcast_EH.h"
+#include "orbsvcs/Event/ECG_UDP_Receiver.h"
+#include "orbsvcs/Event_Service_Constants.h"
+#include "orbsvcs/Event/EC_Lifetime_Utils_T.h"
+#include "ace/Unbounded_Set.h"
+#include "ace/OS_NS_string.h"
+#include "ace/Reactor.h"
+#include "ace/os_include/os_fcntl.h"
+
+#if !defined(__ACE_INLINE__)
+#include "orbsvcs/Event/ECG_Mcast_EH.i"
+#endif /* __ACE_INLINE__ */
+
+ACE_RCSID(Event, ECG_Mcast_EH, "$Id$")
+
+TAO_BEGIN_VERSIONED_NAMESPACE_DECL
+
+TAO_ECG_Mcast_EH::TAO_ECG_Mcast_EH (TAO_ECG_Dgram_Handler *recv,
+ const ACE_TCHAR *net_if,
+ CORBA::ULong sz)
+ : net_if_ (net_if ? ACE_OS::strdup (net_if) : 0)
+ , subscriptions_ ()
+ , receiver_ (recv)
+ , recvbuf_size_ (sz)
+ , observer_ ()
+ , auto_observer_disconnect_ ()
+{
+ ACE_ASSERT (this->receiver_);
+}
+
+TAO_ECG_Mcast_EH::~TAO_ECG_Mcast_EH (void)
+{
+ ACE_OS::free (this->net_if_);
+}
+
+void
+TAO_ECG_Mcast_EH::open (RtecEventChannelAdmin::EventChannel_ptr ec
+ ACE_ENV_ARG_DECL)
+{
+ if (!this->receiver_)
+ {
+ // We are shut down.
+ ACE_THROW (CORBA::INTERNAL());
+ }
+
+ if (CORBA::is_nil (ec))
+ {
+ ACE_ERROR ((LM_ERROR, "TAO_ECG_Mcast_EH::open(): "
+ "nil ec argument"));
+ ACE_THROW (CORBA::INTERNAL ());
+ }
+
+ // Create and activate Event Channel Observer.
+ ACE_NEW (this->observer_,
+ Observer (this));
+
+ if (!this->observer_.in ())
+ {
+ ACE_THROW (CORBA::NO_MEMORY ());
+ }
+
+ TAO_EC_Object_Deactivator observer_deactivator;
+ RtecEventChannelAdmin::Observer_var observer_ref;
+ PortableServer::POA_var poa =
+ this->observer_->_default_POA (ACE_ENV_SINGLE_ARG_PARAMETER);
+ ACE_CHECK;
+
+ activate (observer_ref,
+ poa.in (),
+ this->observer_.in (),
+ observer_deactivator
+ ACE_ENV_ARG_PARAMETER);
+ ACE_CHECK;
+
+ RtecEventChannelAdmin::Observer_Handle handle =
+ ec->append_observer (observer_ref.in ()
+ ACE_ENV_ARG_PARAMETER);
+ ACE_CHECK;
+
+ this->observer_->set_deactivator (observer_deactivator);
+ this->auto_observer_disconnect_.set_command
+ (Observer_Disconnect_Command (handle, ec));
+}
+
+int
+TAO_ECG_Mcast_EH::shutdown (void)
+{
+ // Already shut down.
+ if (!this->receiver_)
+ return -1;
+
+ // Disconnect Observer from EC.
+ this->auto_observer_disconnect_.execute ();
+
+ // Shutdown the observer.
+ if (this->observer_.in ())
+ {
+ this->observer_->shutdown ();
+ this->observer_ = 0;
+ }
+
+ // Indicates that we are in a shutdown state.
+ this->receiver_ = 0;
+
+ // Deregister from reactor, close and clean up sockets.
+ size_t subscriptions_size = this->subscriptions_.size ();
+ for (size_t i = 0; i != subscriptions_size; ++i)
+ {
+ (void) this->reactor ()->remove_handler (
+ this->subscriptions_[i].dgram->get_handle (),
+ ACE_Event_Handler::READ_MASK);
+ (void) this->subscriptions_[i].dgram->close();
+ delete this->subscriptions_[i].dgram;
+ }
+ this->subscriptions_.size (0);
+
+ return 0;
+}
+
+int
+TAO_ECG_Mcast_EH::handle_input (ACE_HANDLE fd)
+{
+ size_t subscriptions_size = this->subscriptions_.size ();
+ for (size_t i = 0; i != subscriptions_size; ++i)
+ {
+ ACE_SOCK_Dgram_Mcast *socket = this->subscriptions_[i].dgram;
+ if (socket->get_handle () == fd)
+ {
+ return this->receiver_->handle_input (*socket);
+ }
+ }
+ return -1;
+}
+
+void
+TAO_ECG_Mcast_EH::update_consumer (
+ const RtecEventChannelAdmin::ConsumerQOS& sub
+ ACE_ENV_ARG_DECL)
+ ACE_THROW_SPEC ((CORBA::SystemException))
+{
+ Address_Set multicast_addresses;
+
+ this->compute_required_subscriptions (sub,
+ multicast_addresses
+ ACE_ENV_ARG_PARAMETER);
+ ACE_CHECK;
+
+ this->delete_unwanted_subscriptions (multicast_addresses);
+
+ this->add_new_subscriptions (multicast_addresses);
+}
+
+void
+TAO_ECG_Mcast_EH::compute_required_subscriptions (
+ const RtecEventChannelAdmin::ConsumerQOS& sub,
+ Address_Set& multicast_addresses
+ ACE_ENV_ARG_DECL)
+ ACE_THROW_SPEC ((CORBA::SystemException))
+{
+ CORBA::ULong count = sub.dependencies.length ();
+ for (CORBA::ULong i = 0; i != count; ++i)
+ {
+ const RtecEventComm::EventHeader& header =
+ sub.dependencies[i].event.header;
+ if (0 < header.type && header.type < ACE_ES_EVENT_UNDEFINED)
+ {
+ continue;
+ }
+ RtecUDPAdmin::UDP_Addr addr;
+
+ this->receiver_->get_addr (header, addr ACE_ENV_ARG_PARAMETER);
+ ACE_CHECK;
+
+ ACE_INET_Addr inet_addr (addr.port, addr.ipaddr);
+ // Ignore errors, if the element is in the set we simply ignore
+ // the problem...
+ (void) multicast_addresses.insert (inet_addr);
+ }
+}
+
+int
+TAO_ECG_Mcast_EH::delete_unwanted_subscriptions (
+ Address_Set& multicast_addresses)
+{
+ for (size_t i = 0; i < this->subscriptions_.size (); ++i)
+ {
+ ACE_INET_Addr multicast_group = this->subscriptions_[i].mcast_addr;
+ if (multicast_addresses.find (multicast_group))
+ {
+ // Remove from the list of subscriptions to be added,
+ // because we already subscribe to it...
+ (void) multicast_addresses.remove (multicast_group);
+ continue;
+ }
+
+ // This subscription is no longer needed - remove from reactor,
+ // close and delete the socket.
+ ACE_SOCK_Dgram_Mcast *socket = this->subscriptions_[i].dgram;
+ (void) this->reactor ()->remove_handler (socket->get_handle (),
+ ACE_Event_Handler::READ_MASK);
+ (void) socket->close();
+ delete socket;
+ // Move the deleted subscription out of the <subscriptions_>
+ // array by moving the last subscription in array into its place.
+ this->subscriptions_[i] =
+ this->subscriptions_[this->subscriptions_.size () - 1];
+ this->subscriptions_.size (this->subscriptions_.size () - 1);
+ --i;
+ }
+
+ return 0;
+}
+
+void
+TAO_ECG_Mcast_EH::add_new_subscriptions (Address_Set& multicast_addresses)
+{
+ typedef ACE_Unbounded_Set_Iterator<ACE_INET_Addr> Address_Iterator;
+ for (Address_Iterator k = multicast_addresses.begin ();
+ k != multicast_addresses.end ();
+ ++k)
+ {
+ Subscription new_subscription;
+ new_subscription.mcast_addr = *k;
+ ACE_NEW (new_subscription.dgram, ACE_SOCK_Dgram_Mcast);
+
+ size_t subscriptions_size = this->subscriptions_.size ();
+ this->subscriptions_.size (subscriptions_size + 1);
+ this->subscriptions_[subscriptions_size] = new_subscription;
+
+ ACE_SOCK_Dgram_Mcast *socket = new_subscription.dgram;
+
+ if (socket->open (new_subscription.mcast_addr, this->net_if_, 1) == -1) {
+ ACE_ERROR ((LM_ERROR,
+ "Error: %d - Unable to open multicast socket\n",
+ errno ));
+ }
+
+ if ( socket->enable (ACE_NONBLOCK) != 0 ) {
+ ACE_ERROR ((LM_ERROR,
+ "Error: %d - Unable to enable nonblocking on mcast_eh\n",
+ errno ));
+ }
+
+ if (socket->join (new_subscription.mcast_addr, 1, this->net_if_) == -1) {
+ ACE_ERROR ((LM_ERROR,
+ "Error: %d - Unable to join multicast group\n",
+ errno ));
+ }
+
+ if (this->recvbuf_size_ != 0
+ && (((ACE_SOCK_Dgram *)socket)->set_option(SOL_SOCKET,
+ SO_RCVBUF,
+ (void *) &this->recvbuf_size_,
+ sizeof (this->recvbuf_size_)) == -1)
+ && errno != ENOTSUP )
+ {
+ ACE_ERROR ((LM_ERROR,
+ "Error: %d - Unable to set mcast_eh recvbuf_size:%d\n",
+ errno,
+ this->recvbuf_size_));
+ }
+ (void) this->reactor ()->register_handler (
+ socket->get_handle (),
+ this,
+ ACE_Event_Handler::READ_MASK);
+ }
+}
+
+// ****************************************************************
+
+TAO_ECG_Mcast_EH::Observer::Observer (TAO_ECG_Mcast_EH* eh)
+ : eh_ (eh)
+{
+}
+
+void
+TAO_ECG_Mcast_EH::Observer::update_consumer (
+ const RtecEventChannelAdmin::ConsumerQOS& sub
+ ACE_ENV_ARG_DECL)
+ ACE_THROW_SPEC ((CORBA::SystemException))
+{
+ if (this->eh_)
+ this->eh_->update_consumer (sub ACE_ENV_ARG_PARAMETER);
+}
+
+void
+TAO_ECG_Mcast_EH::Observer::update_supplier (
+ const RtecEventChannelAdmin::SupplierQOS&
+ ACE_ENV_ARG_DECL_NOT_USED)
+ ACE_THROW_SPEC ((CORBA::SystemException))
+{
+}
+
+void
+TAO_ECG_Mcast_EH::Observer::shutdown (void)
+{
+ this->eh_ = 0;
+ this->deactivator_.deactivate ();
+}
+
+TAO_END_VERSIONED_NAMESPACE_DECL
diff --git a/TAO/orbsvcs/orbsvcs/Event/ECG_Mcast_EH.h b/TAO/orbsvcs/orbsvcs/Event/ECG_Mcast_EH.h
new file mode 100644
index 00000000000..6808a8bbd0d
--- /dev/null
+++ b/TAO/orbsvcs/orbsvcs/Event/ECG_Mcast_EH.h
@@ -0,0 +1,294 @@
+// -*- C++ -*-
+
+/**
+ * @file ECG_Mcast_EH.h
+ *
+ * $Id$
+ *
+ * @author Carlos O'Ryan <coryan@uci.edu>
+ * @author Jaiganesh Balasubramanian <jai@doc.ece.uci.edu>
+ * @author Marina Spivak <marina@atdesk.com>
+ * @author Don Hinton <dhinton@ieee.org>
+ *
+ * http://doc.ece.uci.edu/~coryan/EC/index.html
+ *
+ */
+#ifndef TAO_ECG_MCAST_EH_H
+#define TAO_ECG_MCAST_EH_H
+
+#include /**/ "ace/pre.h"
+#include "ace/Event_Handler.h"
+
+#if !defined (ACE_LACKS_PRAGMA_ONCE)
+# pragma once
+#endif /* ACE_LACKS_PRAGMA_ONCE */
+
+#include "ace/Unbounded_Set.h"
+#include "ace/Array_Base.h"
+#include "ace/SOCK_Dgram_Mcast.h"
+
+#include "orbsvcs/RtecEventChannelAdminS.h"
+
+#include /**/ "orbsvcs/Event/event_serv_export.h"
+#include "orbsvcs/Event/ECG_Adapters.h"
+#include "orbsvcs/Event/EC_Lifetime_Utils.h"
+#include "orbsvcs/Event/EC_Lifetime_Utils_T.h"
+
+TAO_BEGIN_VERSIONED_NAMESPACE_DECL
+
+/**
+ * @class TAO_ECG_Mcast_EH
+ *
+ * @brief Event Handler for Mcast messages.
+ * NOT THREAD-SAFE.
+ *
+ * This object acts as an Observer to Event Channel. It subscribes to
+ * multicast groups that carry events matching the EC's subscriptions.
+ * This object then receives callbacks from the Reactor when data is
+ * available on the mcast sockets and alerts TAO_ECG_Dgram_Handler,
+ * which reads the data, transforms it into event and pushes to the
+ * Event Channel.
+ */
+class TAO_RTEvent_Serv_Export TAO_ECG_Mcast_EH :
+ public ACE_Event_Handler,
+ public TAO_ECG_Handler_Shutdown
+{
+public:
+
+ /// Initialization and termination methods.
+ //@{
+ /**
+ * Constructor. Messages received by this EH will be forwarded to
+ * the \a recv. \a net_if can be used to specify NIC where multicast
+ * messages are expected. \buf_sz would be used to alter the default
+ * buffer size.
+ *
+ * See comments for receiver_ data member on why raw pointer is
+ * used for the \a recv argument.
+ */
+ TAO_ECG_Mcast_EH (TAO_ECG_Dgram_Handler *recv,
+ const ACE_TCHAR *net_if = 0,
+ CORBA::ULong buf_sz = 0);
+
+ /// Destructor.
+ virtual ~TAO_ECG_Mcast_EH (void);
+
+ /**
+ * Register for changes in the EC subscription list.
+ * When the subscription list becomes non-empty we join the proper
+ * multicast groups (using Dgram_Handler to translate between event
+ * types and mcast groups) and the class registers itself with the
+ * reactor.
+ *
+ * To insure proper resource clean up, if open () is successful,
+ * the user MUST call shutdown () when handler is no longer needed
+ * (and its reactor still exists).
+ */
+ void open (RtecEventChannelAdmin::EventChannel_ptr ec
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS);
+
+ /// TAO_ECG_Handler_Shutdown method.
+ /**
+ * Remove ourselves from the event channel, unsubscribe from the
+ * multicast groups, close the sockets and deregister from the
+ * reactor.
+ */
+ virtual int shutdown (void);
+ //@}
+
+ /// Reactor callback. Notify receiver_ that a dgram corresponding
+ /// to \a fd is ready for reading.
+ virtual int handle_input (ACE_HANDLE fd);
+
+private:
+
+ /**
+ * @class Observer
+ *
+ * @brief Observes changes in the EC consumer subscriptions and notifies
+ * TAO_ECG_Mcast_EH when there are changes.
+ */
+ class Observer :
+ public virtual POA_RtecEventChannelAdmin::Observer,
+ public TAO_EC_Deactivated_Object
+ {
+ public:
+ /// Constructor. Changes in the EC subscriptions will be reported
+ /// to the \a eh.
+ Observer (TAO_ECG_Mcast_EH* eh);
+
+ /// Shut down the observer: disconnect from EC and deactivate from
+ /// POA.
+ void shutdown (void);
+
+ /// Event Channel Observer methods
+ //@{
+ virtual void update_consumer (
+ const RtecEventChannelAdmin::ConsumerQOS& sub
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS)
+ ACE_THROW_SPEC ((CORBA::SystemException));
+ virtual void update_supplier (
+ const RtecEventChannelAdmin::SupplierQOS& pub
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS)
+ ACE_THROW_SPEC ((CORBA::SystemException));
+
+ private:
+ /// Handler we notify of subscriptions changes.
+ /*
+ * Observer can keep a raw pointer to mcast handler, because the handler
+ * guarantees to notify the observer (by calling shutdown ())
+ * before going away.
+ */
+ TAO_ECG_Mcast_EH *eh_;
+ };
+
+ /// Make update_consumer () accessible to Observer.
+ friend class Observer;
+
+ /// The Observer method. Subscribe/unsubscribe to multicast groups
+ /// according to changes in consumer subscriptions.
+ void update_consumer (const RtecEventChannelAdmin::ConsumerQOS& sub
+ ACE_ENV_ARG_DECL)
+ ACE_THROW_SPEC ((CORBA::SystemException));
+
+
+ typedef ACE_Unbounded_Set<ACE_INET_Addr> Address_Set;
+
+ /// Helpers for updating multicast subscriptions based on changes in
+ /// consumer subscriptions.
+ //@{
+ /// Compute the list of multicast addresses that we need to be
+ /// subscribed to, in order to receive the events described in the
+ /// ConsumerQOS parameter.
+ /**
+ * @param sub The list of event types that our event channel
+ * consumers are interested in.
+ * @param multicast_addresses This method populates this list with
+ * multicast addresses that we need to be subscribed to in
+ * order to receive event types specified in /a sub.
+ *
+ * @throw CORBA::SystemException This method needs to perform
+ * several CORBA invocations, and it propagates any exceptions
+ * back to the caller.
+ */
+ void compute_required_subscriptions (
+ const RtecEventChannelAdmin::ConsumerQOS& sub,
+ Address_Set& multicast_addresses
+ ACE_ENV_ARG_DECL)
+ ACE_THROW_SPEC ((CORBA::SystemException));
+
+ /// Unsubscribe from any multicast addresses we are currently
+ /// subscribed to that are not in the \a multicast_addresses list.
+ /// Also remove from /a multicast_addresses any addresses to which we are
+ /// already subscribed.
+ /**
+ * @param multicast_addresses List of multicast
+ * addresses we need to be subscribed to in order receive all
+ * event types in the current consumer subscriptions.
+ */
+ int delete_unwanted_subscriptions (
+ Address_Set& multicast_addresses);
+
+ /// Subscribe to all multicast addresses in /a multicast_addresses -
+ /// we are not subscribed to them yet, but need to be.
+ /**
+ * @param multicast_addresses List of multicast addresses to which
+ * we need to subscribe to in order to be receiving all event
+ * types in the current consumer subscriptions.
+ */
+ void add_new_subscriptions (
+ Address_Set& multicast_addresses);
+ //@}
+
+ /**
+ * @class Observer_Disconnect_Command
+ *
+ * @brief Disconnects Observer from the Event Channel
+ *
+ * Utility class for use as a template argument to TAO_EC_Auto_Command.
+ * TAO_EC_Auto_Command<Observer_Disconnect_Command> manages
+ * observer connection to the Event Channel, automatically
+ * disconnecting from ec in its destructor, if necessary.
+ */
+ class TAO_RTEvent_Serv_Export Observer_Disconnect_Command
+ {
+ public:
+ Observer_Disconnect_Command (void);
+ Observer_Disconnect_Command (RtecEventChannelAdmin::Observer_Handle handle,
+ RtecEventChannelAdmin::EventChannel_ptr ec);
+
+ Observer_Disconnect_Command (const Observer_Disconnect_Command &rhs);
+ Observer_Disconnect_Command & operator= (const Observer_Disconnect_Command & rhs);
+
+ void execute (ACE_ENV_SINGLE_ARG_DECL);
+
+ private:
+
+ RtecEventChannelAdmin::Observer_Handle handle_;
+ RtecEventChannelAdmin::EventChannel_var ec_;
+ };
+
+private:
+ /// The NIC used to subscribe for multicast traffic.
+ ACE_TCHAR *net_if_;
+
+ typedef struct {
+ ACE_INET_Addr mcast_addr;
+ ACE_SOCK_Dgram_Mcast* dgram;
+ } Subscription;
+ typedef ACE_Array_Base<Subscription> Subscriptions;
+
+ /// List of multicast addresses we subscribe to and dgrams we use.
+ /*
+ * We use a dedicated socket for each multicast subscription. The
+ * reason: we assume the underlying software, i.e., ACE, binds each
+ * socket used to receive multicast to the multicast group (mcast addr
+ * + port) to avoid receiving promiscuous traffic, in which case it is
+ * not possible to subscribe to more than one mcast address on the same
+ * socket.
+ *
+ * Performance. We use array to store subscriptions (mcast addr / dgram
+ * pairs). If performance is not adequate, we should look into
+ * using a hash map, keyed on file descriptors, instead. When there
+ * are many subscriptions, handle_input() is likely to be more
+ * efficient with a hash lookup than an array iteration for locating a
+ * target dgram. Difference in costs of subscripton changes between
+ * hash map and array would need to be looked at as well, although
+ * it is probably highly dependent on the pattern of changes.
+ */
+ Subscriptions subscriptions_;
+
+ /// We callback to this object when a message arrives.
+ /*
+ * We can keep a raw pointer to the receiver (even though it may
+ * be a refcounted object) because receiver guarantees
+ * to notify us (by calling shutdown ()) before going away.
+ *
+ * We have to use raw pointer instead of a refcounting mechanism
+ * here to avoid a circular refcounting dependency between
+ * receiver and handler.
+ */
+ TAO_ECG_Dgram_Handler * receiver_;
+
+ /// SOCKbuf size
+ CORBA::ULong recvbuf_size_;
+
+ /// Event Channel Observer. Detects changes in EC consumer subscriptions.
+ /// ORDER DEPENDENCY: this member should be declared before
+ /// <auto_observer_disconnect_>.
+ TAO_EC_Servant_Var<Observer> observer_;
+
+ /// Manages connection of our observer to the Event Channel.
+ /// ORDER DEPENDENCY: this member should be declared AFTER <observer_>.
+ TAO_EC_Auto_Command<Observer_Disconnect_Command> auto_observer_disconnect_;
+};
+
+TAO_END_VERSIONED_NAMESPACE_DECL
+
+#if defined(__ACE_INLINE__)
+#include "orbsvcs/Event/ECG_Mcast_EH.i"
+#endif /* __ACE_INLINE__ */
+
+#include /**/ "ace/post.h"
+
+#endif /* TAO_ECG_Mcast_EH_H */
diff --git a/TAO/orbsvcs/orbsvcs/Event/ECG_Mcast_EH.i b/TAO/orbsvcs/orbsvcs/Event/ECG_Mcast_EH.i
new file mode 100644
index 00000000000..587c2721944
--- /dev/null
+++ b/TAO/orbsvcs/orbsvcs/Event/ECG_Mcast_EH.i
@@ -0,0 +1,63 @@
+// -*- C++ -*-
+//
+// $Id$
+
+TAO_BEGIN_VERSIONED_NAMESPACE_DECL
+
+ACE_INLINE
+TAO_ECG_Mcast_EH::
+Observer_Disconnect_Command::Observer_Disconnect_Command (void)
+ : handle_ ()
+ , ec_ ()
+{
+}
+
+ACE_INLINE
+TAO_ECG_Mcast_EH::
+Observer_Disconnect_Command::Observer_Disconnect_Command (
+ RtecEventChannelAdmin::Observer_Handle handle,
+ RtecEventChannelAdmin::EventChannel_ptr ec)
+ : handle_ (handle)
+ , ec_ (RtecEventChannelAdmin::EventChannel::_duplicate (ec))
+{
+}
+
+ACE_INLINE
+TAO_ECG_Mcast_EH::
+Observer_Disconnect_Command::Observer_Disconnect_Command (
+ const Observer_Disconnect_Command & rhs)
+ : handle_ (rhs.handle_)
+ , ec_ (RtecEventChannelAdmin::EventChannel::_duplicate (rhs.ec_.in()))
+{
+}
+
+ACE_INLINE
+TAO_ECG_Mcast_EH::Observer_Disconnect_Command &
+TAO_ECG_Mcast_EH::
+Observer_Disconnect_Command::operator= (
+ const Observer_Disconnect_Command & rhs)
+{
+ this->handle_ = rhs.handle_;
+ this->ec_ = RtecEventChannelAdmin::EventChannel::_duplicate (rhs.ec_.in());
+
+ return *this;
+}
+
+ACE_INLINE void
+TAO_ECG_Mcast_EH::
+Observer_Disconnect_Command::execute (ACE_ENV_SINGLE_ARG_DECL)
+{
+ if (CORBA::is_nil (this->ec_.in ()))
+ // We are not connected.
+ return;
+
+ RtecEventChannelAdmin::EventChannel_var release_ec =
+ this->ec_._retn ();
+
+ release_ec->remove_observer (this->handle_ ACE_ENV_ARG_PARAMETER);
+ ACE_CHECK;
+}
+
+//***************************************************************************
+
+TAO_END_VERSIONED_NAMESPACE_DECL
diff --git a/TAO/orbsvcs/orbsvcs/Event/ECG_Mcast_Gateway.cpp b/TAO/orbsvcs/orbsvcs/Event/ECG_Mcast_Gateway.cpp
new file mode 100644
index 00000000000..723466ea888
--- /dev/null
+++ b/TAO/orbsvcs/orbsvcs/Event/ECG_Mcast_Gateway.cpp
@@ -0,0 +1,705 @@
+// $Id$
+
+#include "orbsvcs/Event/ECG_Mcast_Gateway.h"
+
+#include "orbsvcs/Event/EC_Lifetime_Utils_T.h"
+#include "orbsvcs/Event/ECG_Simple_Address_Server.h"
+#include "orbsvcs/Event/ECG_Complex_Address_Server.h"
+#include "orbsvcs/Event/ECG_Simple_Mcast_EH.h"
+#include "orbsvcs/Event/ECG_Mcast_EH.h"
+#include "orbsvcs/Event/ECG_UDP_EH.h"
+
+#include "orbsvcs/Event_Utilities.h"
+
+#include "ace/Dynamic_Service.h"
+#include "ace/Arg_Shifter.h"
+#include "tao/ORB_Core.h"
+#include "ace/OS_NS_strings.h"
+
+#if ! defined (__ACE_INLINE__)
+#include "orbsvcs/Event/ECG_Mcast_Gateway.i"
+#endif /* __ACE_INLINE__ */
+
+ACE_RCSID(Event, ECG_Mcast_Gateway, "$Id$")
+
+
+TAO_BEGIN_VERSIONED_NAMESPACE_DECL
+
+typedef TAO_EC_Shutdown_Command<TAO_EC_Servant_Var<TAO_ECG_UDP_Sender> >
+UDP_Sender_Shutdown;
+
+typedef TAO_EC_Shutdown_Command<TAO_EC_Servant_Var<TAO_ECG_UDP_Receiver> >
+UDP_Receiver_Shutdown;
+
+
+int
+TAO_ECG_Mcast_Gateway::init_svcs (void)
+{
+ return ACE_Service_Config::static_svcs ()->
+ insert (&ace_svc_desc_TAO_ECG_Mcast_Gateway);
+}
+
+
+int
+TAO_ECG_Mcast_Gateway::fini (void)
+{
+ return 0;
+}
+
+int
+TAO_ECG_Mcast_Gateway::init (int argc, ACE_TCHAR* argv[])
+{
+ int result = 0;
+
+ ACE_Arg_Shifter arg_shifter (argc, argv);
+
+ while (arg_shifter.is_anything_left ())
+ {
+ const ACE_TCHAR *arg = arg_shifter.get_current ();
+
+ if (ACE_OS::strcasecmp (arg, ACE_TEXT ("-ECGService")) == 0)
+ {
+ arg_shifter.consume_arg ();
+
+ if (arg_shifter.is_parameter_next ())
+ {
+ const ACE_TCHAR* opt = arg_shifter.get_current ();
+ if (ACE_OS::strcasecmp (opt, ACE_TEXT ("receiver")) == 0)
+ this->service_type_ = ECG_MCAST_RECEIVER;
+ else if (ACE_OS::strcasecmp (opt, ACE_TEXT ("sender")) == 0)
+ this->service_type_ = ECG_MCAST_SENDER;
+ else if (ACE_OS::strcasecmp (opt, ACE_TEXT ("two_way")) == 0)
+ this->service_type_ = ECG_MCAST_TWO_WAY;
+ else
+ {
+ ACE_ERROR ((LM_ERROR,
+ ACE_TEXT ("Unsupported <-ECGService> option ")
+ ACE_TEXT ("value: <%s>. Ignoring this option ")
+ ACE_TEXT ("- using defaults instead.\n"),
+ opt));
+ result = -1;
+ }
+ arg_shifter.consume_arg ();
+ }
+ }
+
+ else if (ACE_OS::strcasecmp (arg, ACE_TEXT ("-ECGAddressServer")) == 0)
+ {
+ arg_shifter.consume_arg ();
+
+ if (arg_shifter.is_parameter_next ())
+ {
+ const ACE_TCHAR* opt = arg_shifter.get_current ();
+ if (ACE_OS::strcasecmp (opt, ACE_TEXT ("basic")) == 0)
+ this->address_server_type_ = ECG_ADDRESS_SERVER_BASIC;
+ else if (ACE_OS::strcasecmp (opt, ACE_TEXT ("source")) == 0)
+ this->address_server_type_ = ECG_ADDRESS_SERVER_SOURCE;
+ else if (ACE_OS::strcasecmp (opt, ACE_TEXT ("type")) == 0)
+ this->address_server_type_ = ECG_ADDRESS_SERVER_TYPE;
+ else
+ {
+ ACE_ERROR ((LM_ERROR,
+ ACE_TEXT ("Unsupported <-ECGAddressServer> ")
+ ACE_TEXT ("option value: <%s>. Ignoring this ")
+ ACE_TEXT ("option - using defaults instead.\n"),
+ opt));
+ result = -1;
+ }
+ arg_shifter.consume_arg ();
+ }
+ }
+
+ else if (ACE_OS::strcasecmp (arg, ACE_TEXT ("-ECGAddressServerArg")) == 0)
+ {
+ arg_shifter.consume_arg ();
+
+ if (arg_shifter.is_parameter_next ())
+ {
+ this->address_server_arg_.set (arg_shifter.get_current ());
+ arg_shifter.consume_arg ();
+ }
+ }
+
+
+ else if (ACE_OS::strcasecmp (arg, ACE_TEXT ("-ECGHandler")) == 0)
+ {
+ arg_shifter.consume_arg ();
+
+ if (arg_shifter.is_parameter_next ())
+ {
+ const ACE_TCHAR* opt = arg_shifter.get_current ();
+ if (ACE_OS::strcasecmp (opt, ACE_TEXT ("basic")) == 0)
+ this->handler_type_ = ECG_HANDLER_BASIC;
+ else if (ACE_OS::strcasecmp (opt, ACE_TEXT ("complex")) == 0)
+ this->handler_type_ = ECG_HANDLER_COMPLEX;
+ else if (ACE_OS::strcasecmp (opt, ACE_TEXT ("udp")) == 0)
+ this->handler_type_ = ECG_HANDLER_UDP;
+ else
+ {
+ ACE_ERROR ((LM_ERROR,
+ ACE_TEXT ("Unsupported <-ECGHandler> ")
+ ACE_TEXT ("option value: <%s>. Ignoring this ")
+ ACE_TEXT ("option - using defaults instead.\n"),
+ opt));
+ result = -1;
+ }
+ arg_shifter.consume_arg ();
+ }
+ }
+
+ else if (ACE_OS::strcasecmp (arg, ACE_TEXT ("-ECGTTL")) == 0)
+ {
+ arg_shifter.consume_arg ();
+
+ if (arg_shifter.is_parameter_next ())
+ {
+ const ACE_TCHAR* opt = arg_shifter.get_current ();
+ unsigned long tmp = ACE_OS::strtoul (opt, 0, 0) & 0xff;
+ this->ttl_value_ = static_cast<u_char> (tmp);
+ arg_shifter.consume_arg ();
+ }
+ }
+
+ else if (ACE_OS::strcasecmp (arg, ACE_TEXT ("-ECGNIC")) == 0)
+ {
+ arg_shifter.consume_arg ();
+
+ if (arg_shifter.is_parameter_next ())
+ {
+ this->nic_.set (arg_shifter.get_current ());
+ arg_shifter.consume_arg ();
+ }
+ }
+
+ else if (ACE_OS::strcasecmp (arg, ACE_TEXT ("-ECGIPMULTICASTLOOP")) == 0)
+ {
+ arg_shifter.consume_arg ();
+
+ if (arg_shifter.is_parameter_next ())
+ {
+ this->ip_multicast_loop_ =
+ (ACE_OS::atoi(arg_shifter.get_current()) != 0);
+ arg_shifter.consume_arg ();
+ }
+ }
+
+ else if (ACE_OS::strcasecmp (arg, ACE_TEXT ("-ECGNONBLOCKING")) == 0)
+ {
+ arg_shifter.consume_arg ();
+
+ if (arg_shifter.is_parameter_next ())
+ {
+ this->non_blocking_ =
+ (ACE_OS::atoi(arg_shifter.get_current()) != 0);
+ arg_shifter.consume_arg ();
+ }
+ }
+
+ else
+ {
+ arg_shifter.ignore_arg ();
+ ACE_DEBUG ((LM_WARNING,
+ ACE_TEXT ("Ignoring <%s> option ")
+ ACE_TEXT ("during initialization.\n"),
+ arg));
+ result = -1;
+ }
+ }
+
+ if (this->validate_configuration () == -1)
+ return -1;
+ else
+ return result;
+}
+
+int
+TAO_ECG_Mcast_Gateway::init (const char * address_server_arg,
+ const Attributes & attr)
+{
+ this->address_server_arg_.set (address_server_arg);
+
+ this->address_server_type_ = attr.address_server_type;
+ this->handler_type_ = attr.handler_type;
+ this->service_type_ = attr.service_type;
+ this->ttl_value_ = attr.ttl_value;
+ this->nic_.set (attr.nic.c_str ());
+ this->ip_multicast_loop_ = attr.ip_multicast_loop;
+ this->non_blocking_ = attr.non_blocking;
+
+ return this->validate_configuration ();
+}
+
+int
+TAO_ECG_Mcast_Gateway::init (
+ const RtecEventChannelAdmin::ConsumerQOS & consumer_qos,
+ const char * address_server_arg,
+ const Attributes & attributes)
+{
+ this->consumer_qos_ = consumer_qos;
+ return this->init (address_server_arg,
+ attributes);
+}
+
+int
+TAO_ECG_Mcast_Gateway::validate_configuration (void)
+{
+ if ((this->handler_type_ == ECG_HANDLER_BASIC
+ || this->handler_type_ == ECG_HANDLER_UDP)
+ && this->service_type_ != ECG_MCAST_SENDER
+ && this->address_server_type_ != ECG_ADDRESS_SERVER_BASIC)
+ {
+ ACE_DEBUG ((LM_ERROR,
+ "Configurations for mcast handler and "
+ "address server do not match.\n"));
+ return -1;
+ }
+
+ // Currently all Address Server implementations require an
+ // initialization string. If we ever add a new Address Server
+ // implementation, which does not, we'll have to remove this check.
+ if (this->address_server_arg_.length () == 0)
+ {
+ ACE_DEBUG ((LM_ERROR,
+ "Address server initializaton "
+ "argument not specified.\n"));
+ return -1;
+ }
+
+ if (this->ip_multicast_loop_ != 0
+ && this->ip_multicast_loop_ != 1)
+ {
+ ACE_DEBUG ((LM_ERROR,
+ "IP MULTICAST LOOP option must have a boolean value.\n"));
+ return -1;
+ }
+
+ if (this->non_blocking_ != 0
+ && this->non_blocking_ != 1)
+ {
+ ACE_DEBUG ((LM_ERROR,
+ "NON BLOCKING flag must have a boolean value.\n"));
+ return -1;
+ }
+
+ return 0;
+}
+
+TAO_ECG_Refcounted_Endpoint
+TAO_ECG_Mcast_Gateway::init_endpoint (void)
+{
+ TAO_ECG_UDP_Out_Endpoint* endpoint = 0;
+ TAO_ECG_Refcounted_Endpoint refendpoint;
+
+ // Try to allocate a new endpoint from the heap
+ ACE_NEW_NORETURN (endpoint,
+ TAO_ECG_UDP_Out_Endpoint);
+
+ if (endpoint != 0)
+ {
+ refendpoint.reset (endpoint);
+ }
+ else
+ {
+ return TAO_ECG_Refcounted_Endpoint ();
+ }
+
+ ACE_SOCK_Dgram& dgram = refendpoint->dgram ();
+
+ if (dgram.open (ACE_Addr::sap_any) == -1)
+ {
+ ACE_ERROR ((LM_ERROR,
+ "Cannot open dgram "
+ "for sending mcast messages.\n"));
+ return TAO_ECG_Refcounted_Endpoint ();
+ }
+
+ if (this->nic_.length () != 0)
+ {
+ dgram.set_nic (this->nic_.c_str ());
+ }
+
+ if (this->ttl_value_ > 0)
+ {
+ if (dgram.ACE_SOCK::set_option (IPPROTO_IP,
+ IP_MULTICAST_TTL,
+ &this->ttl_value_,
+ sizeof (this->ttl_value_))
+ == -1)
+ {
+ ACE_ERROR ((LM_ERROR,
+ "Error setting TTL option on dgram "
+ "for sending mcast messages.\n"));
+ return TAO_ECG_Refcounted_Endpoint ();
+ }
+ }
+
+ if (dgram.ACE_SOCK::set_option (IPPROTO_IP,
+ IP_MULTICAST_LOOP,
+ &this->ip_multicast_loop_,
+ sizeof (this->ip_multicast_loop_)) == -1)
+ {
+ ACE_ERROR ((LM_ERROR,
+ "Error setting MULTICAST_LOOP option "
+ "on dgram for sending mcast messages.\n"));
+ return TAO_ECG_Refcounted_Endpoint ();
+ }
+
+ if (this->non_blocking_
+ && dgram.enable(ACE_NONBLOCK) == -1)
+ {
+ ACE_ERROR ((LM_ERROR,
+ "Error setting NON BLOCKING option.\n"));
+ return TAO_ECG_Refcounted_Endpoint ();
+ }
+
+ return refendpoint;
+}
+
+PortableServer::ServantBase *
+TAO_ECG_Mcast_Gateway::init_address_server (void)
+{
+ const char * address_server_arg =
+ (this->address_server_arg_.length ())
+ ? this->address_server_arg_.c_str () : 0;
+
+ if (this->address_server_type_ == ECG_ADDRESS_SERVER_BASIC)
+ {
+ TAO_EC_Servant_Var<TAO_ECG_Simple_Address_Server> impl =
+ TAO_ECG_Simple_Address_Server::create ();
+ if (!impl.in ())
+ return 0;
+
+ if (impl->init (address_server_arg) == -1)
+ {
+ return 0;
+ }
+ return impl._retn ();
+ }
+
+ else if (this->address_server_type_ == ECG_ADDRESS_SERVER_SOURCE)
+ {
+ TAO_EC_Servant_Var<TAO_ECG_Complex_Address_Server> impl =
+ TAO_ECG_Complex_Address_Server::create (1);
+ if (!impl.in ())
+ return 0;
+
+ if (impl->init (address_server_arg) == -1)
+ {
+ return 0;
+ }
+ return impl._retn ();
+ }
+
+ else if (this->address_server_type_ == ECG_ADDRESS_SERVER_TYPE)
+ {
+ TAO_EC_Servant_Var<TAO_ECG_Complex_Address_Server> impl =
+ TAO_ECG_Complex_Address_Server::create (0);
+ if (!impl.in ())
+ return 0;
+
+ if (impl->init (address_server_arg) == -1)
+ {
+ return 0;
+ }
+ return impl._retn ();
+ }
+
+ else
+ {
+ ACE_ERROR ((LM_ERROR,
+ "Cannot create address server: "
+ "unknown address server type specified.\n"));
+ return 0;
+ }
+}
+
+TAO_ECG_Refcounted_Handler
+TAO_ECG_Mcast_Gateway::init_handler (TAO_ECG_Dgram_Handler *receiver,
+ RtecEventChannelAdmin::EventChannel_ptr ec,
+ ACE_Reactor *reactor
+ ACE_ENV_ARG_DECL)
+{
+ TAO_ECG_Refcounted_Handler handler;
+
+ const char * nic =
+ (this->nic_.length ()) ? this->nic_.c_str () : 0;
+ const char * address_server_arg =
+ (this->address_server_arg_.length ())
+ ? this->address_server_arg_.c_str () : 0;
+
+ if (this->handler_type_ == ECG_HANDLER_BASIC)
+ {
+ TAO_ECG_Simple_Mcast_EH * h = 0;
+ ACE_NEW_RETURN (h,
+ TAO_ECG_Simple_Mcast_EH (receiver),
+ handler);
+ handler.reset (h);
+
+ h->reactor (reactor);
+ if (h->open (address_server_arg, nic) != 0)
+ return TAO_ECG_Refcounted_Handler ();
+ }
+
+ else if (this->handler_type_ == ECG_HANDLER_COMPLEX)
+ {
+ TAO_ECG_Mcast_EH * h = 0;
+ ACE_NEW_RETURN (h,
+ TAO_ECG_Mcast_EH (receiver, nic),
+ handler);
+ handler.reset (h);
+
+ h->reactor (reactor);
+
+ h->open (ec ACE_ENV_ARG_PARAMETER);
+ ACE_CHECK_RETURN (TAO_ECG_Refcounted_Handler ());
+ }
+
+ else if (this->handler_type_ == ECG_HANDLER_UDP)
+ {
+ TAO_ECG_UDP_EH * h = 0;
+ ACE_NEW_RETURN (h,
+ TAO_ECG_UDP_EH (receiver),
+ handler);
+ handler.reset (h);
+ h->reactor (reactor);
+
+ ACE_INET_Addr ipaddr;
+ if (ipaddr.set (address_server_arg) != 0)
+ {
+ ACE_ERROR ((LM_ERROR,
+ "ERROR using address server argument "
+ "in ACE_INET_Addr.set ().\n"));
+ return TAO_ECG_Refcounted_Handler ();
+ }
+ if (h->open (ipaddr) != 0)
+ return TAO_ECG_Refcounted_Handler ();
+ }
+
+ else
+ {
+ ACE_ERROR ((LM_ERROR,
+ "Cannot create handler: unknown "
+ "handler type specified.\n"));
+ return handler;
+ }
+
+ return handler;
+}
+
+TAO_EC_Servant_Var<TAO_ECG_UDP_Sender>
+TAO_ECG_Mcast_Gateway::init_sender (
+ RtecEventChannelAdmin::EventChannel_ptr ec,
+ RtecUDPAdmin::AddrServer_ptr address_server,
+ TAO_ECG_Refcounted_Endpoint endpoint_rptr
+ ACE_ENV_ARG_DECL)
+{
+ TAO_EC_Servant_Var<TAO_ECG_UDP_Sender>
+ sender (TAO_ECG_UDP_Sender::create ());
+ if (!sender.in ())
+ return sender;
+
+ sender->init (ec,
+ address_server,
+ endpoint_rptr
+ ACE_ENV_ARG_PARAMETER);
+ ACE_CHECK_RETURN (TAO_EC_Servant_Var<TAO_ECG_UDP_Sender> ());
+
+ TAO_EC_Auto_Command<UDP_Sender_Shutdown> sender_shutdown;
+ sender_shutdown.set_command (UDP_Sender_Shutdown (sender));
+
+ if (this->consumer_qos_.dependencies.length () > 0)
+ {
+ // Client supplied consumer qos. Use it.
+ this->consumer_qos_.is_gateway = 1;
+ sender->connect (this->consumer_qos_ ACE_ENV_ARG_PARAMETER);
+ ACE_CHECK_RETURN (TAO_EC_Servant_Var<TAO_ECG_UDP_Sender> ());
+ }
+ else
+ {
+ // Client did not specify anything - subscribe to all events.
+ ACE_ConsumerQOS_Factory consumer_qos_factory;
+ consumer_qos_factory.start_disjunction_group (1);
+ consumer_qos_factory.insert (ACE_ES_EVENT_SOURCE_ANY,
+ ACE_ES_EVENT_ANY,
+ 0);
+ RtecEventChannelAdmin::ConsumerQOS & qos =
+ const_cast<RtecEventChannelAdmin::ConsumerQOS &> (consumer_qos_factory.get_ConsumerQOS ());
+ qos.is_gateway = 1;
+
+ sender->connect (qos ACE_ENV_ARG_PARAMETER);
+ ACE_CHECK_RETURN (TAO_EC_Servant_Var<TAO_ECG_UDP_Sender> ());
+ }
+
+ sender_shutdown.disallow_command ();
+ return sender;
+}
+
+TAO_EC_Servant_Var<TAO_ECG_UDP_Receiver>
+TAO_ECG_Mcast_Gateway::init_receiver (
+ RtecEventChannelAdmin::EventChannel_ptr ec,
+ RtecUDPAdmin::AddrServer_ptr address_server,
+ TAO_ECG_Refcounted_Endpoint endpoint_rptr
+ ACE_ENV_ARG_DECL)
+{
+ TAO_EC_Servant_Var<TAO_ECG_UDP_Receiver>
+ receiver (TAO_ECG_UDP_Receiver::create ());
+ if (!receiver.in ())
+ return receiver;
+
+ receiver->init (ec,
+ endpoint_rptr,
+ address_server
+ ACE_ENV_ARG_PARAMETER);
+ ACE_CHECK_RETURN (TAO_EC_Servant_Var<TAO_ECG_UDP_Receiver> ());
+
+ TAO_EC_Auto_Command<UDP_Receiver_Shutdown> receiver_shutdown;
+ receiver_shutdown.set_command (UDP_Receiver_Shutdown (receiver));
+
+ ACE_SupplierQOS_Factory supplier_qos_factory;
+ supplier_qos_factory.insert (ACE_ES_EVENT_SOURCE_ANY,
+ ACE_ES_EVENT_ANY,
+ 0, 1);
+ RtecEventChannelAdmin::SupplierQOS & qos =
+ const_cast<RtecEventChannelAdmin::SupplierQOS &> (supplier_qos_factory.get_SupplierQOS ());
+ qos.is_gateway = 1;
+
+ receiver->connect (qos ACE_ENV_ARG_PARAMETER);
+ ACE_CHECK_RETURN (TAO_EC_Servant_Var<TAO_ECG_UDP_Receiver> ());
+
+ receiver_shutdown.disallow_command ();
+ return receiver;
+}
+
+void
+TAO_ECG_Mcast_Gateway::verify_args (CORBA::ORB_ptr orb,
+ RtecEventChannelAdmin::EventChannel_ptr ec
+ ACE_ENV_ARG_DECL)
+{
+ if (CORBA::is_nil (ec))
+ {
+ ACE_ERROR ((LM_ERROR,
+ "Nil event channel argument passed to "
+ "TAO_ECG_Mcast_Gateway::run().\n"));
+ ACE_THROW (CORBA::INTERNAL ());
+ }
+ if (CORBA::is_nil (orb))
+ {
+ ACE_ERROR ((LM_ERROR,
+ "Nil orb argument passed to "
+ "TAO_ECG_Mcast_Gateway::run().\n"));
+ ACE_THROW (CORBA::INTERNAL ());
+ }
+}
+
+void
+TAO_ECG_Mcast_Gateway::run (CORBA::ORB_ptr orb,
+ RtecEventChannelAdmin::EventChannel_ptr ec
+ ACE_ENV_ARG_DECL)
+{
+ // Verify args.
+ this->verify_args (orb, ec ACE_ENV_ARG_PARAMETER);
+ ACE_CHECK;
+
+ // Auto-cleanup objects.
+ TAO_EC_Object_Deactivator address_server_deactivator;
+ TAO_EC_Auto_Command<UDP_Sender_Shutdown> sender_shutdown;
+ TAO_EC_Auto_Command<UDP_Receiver_Shutdown> receiver_shutdown;
+
+ // Set up address server.
+ PortableServer::ServantBase_var address_server_servant =
+ this->init_address_server ();
+ if (!address_server_servant.in ())
+ {
+ ACE_DEBUG ((LM_ERROR,
+ "Unable to create address server.\n"));
+ ACE_THROW (CORBA::INTERNAL ());
+ }
+
+ RtecUDPAdmin::AddrServer_var address_server;
+
+ PortableServer::POA_var poa =
+ address_server_servant->_default_POA (ACE_ENV_SINGLE_ARG_PARAMETER);
+ ACE_CHECK;
+
+ activate (address_server,
+ poa.in (),
+ address_server_servant.in (),
+ address_server_deactivator
+ ACE_ENV_ARG_PARAMETER);
+ ACE_CHECK;
+
+ TAO_ECG_Refcounted_Endpoint endpoint_rptr;
+ TAO_EC_Servant_Var<TAO_ECG_UDP_Sender> sender;
+
+ // Set up event sender.
+ if (this->service_type_ == ECG_MCAST_SENDER
+ || this->service_type_ == ECG_MCAST_TWO_WAY)
+ {
+ endpoint_rptr = this->init_endpoint ();
+ if (endpoint_rptr.get () == 0)
+ {
+ ACE_THROW (CORBA::INTERNAL ());
+ }
+
+ sender = this->init_sender (ec,
+ address_server.in (),
+ endpoint_rptr
+ ACE_ENV_ARG_PARAMETER);
+ ACE_CHECK;
+ if (!sender.in ())
+ {
+ ACE_THROW (CORBA::INTERNAL ());
+ }
+
+ sender_shutdown.set_command (UDP_Sender_Shutdown (sender));
+ }
+
+ // Set up event receiver.
+ TAO_EC_Servant_Var<TAO_ECG_UDP_Receiver> receiver;
+ if (this->service_type_ == ECG_MCAST_RECEIVER
+ || this->service_type_ == ECG_MCAST_TWO_WAY)
+ {
+ ACE_Reactor *reactor = orb->orb_core ()->reactor ();
+
+ receiver = this->init_receiver (ec,
+ address_server.in (),
+ endpoint_rptr
+ ACE_ENV_ARG_PARAMETER);
+ ACE_CHECK;
+ if (!receiver.in ())
+ {
+ ACE_THROW (CORBA::INTERNAL ());
+ }
+
+ receiver_shutdown.set_command (UDP_Receiver_Shutdown (receiver));
+
+ TAO_ECG_Refcounted_Handler
+ handler_rptr (this->init_handler (receiver.in (),
+ ec,
+ reactor
+ ACE_ENV_ARG_PARAMETER));
+ ACE_CHECK;
+ if (handler_rptr.get () == 0)
+ {
+ ACE_THROW (CORBA::INTERNAL ());
+ }
+ receiver->set_handler_shutdown (handler_rptr);
+ }
+
+ // Everything went ok - disable auto-cleanup.
+ address_server_deactivator.disallow_deactivation ();
+ receiver_shutdown.disallow_command ();
+ sender_shutdown.disallow_command ();
+}
+
+TAO_END_VERSIONED_NAMESPACE_DECL
+
+// ****************************************************************
+
+ACE_STATIC_SVC_DEFINE (TAO_ECG_Mcast_Gateway,
+ ACE_TEXT ("ECG_Mcast_Gateway"),
+ ACE_SVC_OBJ_T,
+ &ACE_SVC_NAME (TAO_ECG_Mcast_Gateway),
+ ACE_Service_Type::DELETE_THIS | ACE_Service_Type::DELETE_OBJ,
+ 0)
+ACE_FACTORY_DEFINE (TAO_RTEvent_Serv, TAO_ECG_Mcast_Gateway)
diff --git a/TAO/orbsvcs/orbsvcs/Event/ECG_Mcast_Gateway.h b/TAO/orbsvcs/orbsvcs/Event/ECG_Mcast_Gateway.h
new file mode 100644
index 00000000000..827d6ae20ac
--- /dev/null
+++ b/TAO/orbsvcs/orbsvcs/Event/ECG_Mcast_Gateway.h
@@ -0,0 +1,290 @@
+// -*- C++ -*-
+
+/**
+ * @file ECG_Mcast_Gateway.h
+ *
+ * $Id$
+ *
+ * @author Marina Spivak (marina@atdesk.com)
+ */
+
+#ifndef TAO_ECG_MCAST_GATEWAY_H
+#define TAO_ECG_MCAST_GATEWAY_H
+#include /**/ "ace/pre.h"
+
+#include "orbsvcs/Event/ECG_UDP_Sender.h"
+
+#if !defined (ACE_LACKS_PRAGMA_ONCE)
+# pragma once
+#endif /* ACE_LACKS_PRAGMA_ONCE */
+
+#include "orbsvcs/Event/ECG_Defaults.h"
+#include /**/ "orbsvcs/Event/event_serv_export.h"
+#include "orbsvcs/Event/ECG_UDP_Receiver.h"
+#include "orbsvcs/Event/ECG_UDP_Out_Endpoint.h"
+#include "ace/Service_Object.h"
+#include "ace/Service_Config.h"
+#include "ace/SString.h"
+#include "ace/os_include/os_stdint.h"
+
+ACE_BEGIN_VERSIONED_NAMESPACE_DECL
+class ACE_Event_Handler;
+ACE_END_VERSIONED_NAMESPACE_DECL
+
+TAO_BEGIN_VERSIONED_NAMESPACE_DECL
+
+/**
+ * @class TAO_ECG_Mcast_Gateway
+ *
+ * @brief Implement the builder for setting up Event Channel multicast
+ * gateway.
+ * NOT THREAD-SAFE.
+ *
+ * This class simplifies creation of federated Event Channels by
+ * presenting a simple unified interface for creating and configuring
+ * all components needed to federate an Event Channel.
+ * Configuration options are described below.
+ *
+ * NOTE: This class does not own any of the components it creates and
+ * its lifetime is independent of theirs. This class acts purely as a
+ * wrapper facade for creating and wiring appropriate components
+ * together.
+ *
+ * @todo This class is an ACE_Service_Object, but the only reason for
+ * it is the need for easy configuration using files. Since
+ * ACE_Service_Object provides much more than that, we should look
+ * into replacing it with a more lightweight utility that would serve
+ * our needs.
+ *
+ * CONFIGURATION OPTIONS
+ * There are two ways to use this class:
+ * 1) Use service config file to specify configuration options (which
+ * are described below), and use service configurator to obtain a
+ * an instance of configured TAO_ECG_Mcast_Gateway in your program. (See
+ * TAO/orbsvcs/tests/Event/Mcast/Common and
+ * TAO/orbsvcs/tests/Event/Mcast/Simple for an example.)
+ *
+ * Service config file options:
+ *
+ * -ECGService <service>
+ * Valid values: sender, receiver, two_way
+ * Specifies whether this gateway should act as a multicast sender of
+ * the events or multicast receiver, or both.
+ *
+ * -ECGAddressServer <server_type>
+ * Valid values: basic, source, type
+ * Specifies what implementation of the address server should be used
+ * by the gateway. basic - the same multicast address is returned for
+ * all event headers. source - multicast addresses are returned based
+ * on the event source, according to the mapping provided at
+ * initialization. type - multicast addresses are returned based
+ * on the event type, according to the mapping provided at
+ * initialization.
+ *
+ * -ECGAddressServerArg <arg>
+ * Valid value: arg is a string, whose format requirements are
+ * specific to the implementation of address server used.
+ * Arg is not interpreted by the gateway, but simply passed to the
+ * address server specified by -ECGAddressServer during initialization.
+ * THIS OPTION MUST ALWAYS BE SPECIFIED BY THE USER (there is no
+ * default value for it)
+ *
+ * -ECGHandler <handler_type>
+ * Valid values: basic, complex, udp
+ * Specifies what implementation of event handler should be used if
+ * gateway is acting as events receiver. basic - a simple event
+ * handler listening on a single mcast address. complex -
+ * event handler listening on multiple mcast addresses based on
+ * events of interest to consumers. udp - similar to basic handler,
+ * except listens on udp address as opposed to a multicast group.
+ *
+ * -ECGTTL <ttl>
+ * Valid values: a number > 0
+ * IP_Multicast time to live value that should be set on a sending socket.
+ * This option matters only if the gateway is acting as a sender of
+ * mcast messages.
+ *
+ * -ECGNIC <nic>
+ * Valid values: name of the network interface
+ * This interface is used for sending and/or receiving multicast messages.
+ *
+ * -ECGNonBlocking
+ * Boolean flag to configure if the socket is in blocking or
+ * non-blocking code. The default is non-blocking.
+ * NOTE: Certain device drivers block the process if the physical
+ * link fails.
+ *
+ *
+ * 2) Create an instance of TAO_ECG_Mcast_Gateway in your code, on the stack or
+ * dynamically, and use init () method to configure it. No
+ * configuration files involved. See service config options above for the
+ * description of configurable options, and init() method below for how
+ * to specify them.
+ *
+ *
+ * Default configuration values (for either use case) can be found in
+ * ECG_Defaults.h
+ */
+class TAO_RTEvent_Serv_Export TAO_ECG_Mcast_Gateway
+ : public ACE_Service_Object
+{
+public:
+
+ /// The Service_Object entry points.
+ //@{
+ virtual int init (int argc, ACE_TCHAR* argv[]);
+ virtual int fini (void);
+ //@}
+
+ /// Helper function to register the Gateway into the service
+ /// configurator.
+ static int init_svcs (void);
+
+ /// Constructor.
+ TAO_ECG_Mcast_Gateway (void);
+
+ /// Values for some configuration parameters to init ().
+ //@{
+ enum Service_Type {ECG_MCAST_SENDER,
+ ECG_MCAST_RECEIVER,
+ ECG_MCAST_TWO_WAY};
+
+ enum Address_Server_Type {ECG_ADDRESS_SERVER_BASIC,
+ ECG_ADDRESS_SERVER_SOURCE,
+ ECG_ADDRESS_SERVER_TYPE};
+
+ enum Handler_Type {ECG_HANDLER_BASIC,
+ ECG_HANDLER_COMPLEX,
+ ECG_HANDLER_UDP};
+ //@}
+
+ /**
+ * @struct Attributes
+ *
+ * @brief Helper class to initialize a TAO_ECG_Mcast_Gateway.
+ *
+ * The TAO_ECG_Mcast_Gateway class has several properties that can
+ * be configured at initialization time, with default values. The
+ * canonical trick of using a constructor or init() method with
+ * multiple arguments does not work because to change the last
+ * argument the application developer needs to know all the other
+ * defaults.
+ *
+ * Instead we define a helper class that initializes all the fields
+ * to reasonable defaults. The application only sets the fields
+ * that it is interested into, if new fields are added applications
+ * do not need to change.
+ *
+ * With a little trickery we can even eliminate named temporaries:
+ *
+ * TAO_ECG_Mcast_Gateway gw;<BR>
+ * gw.init(TAO_ECG_Mcast_Gateway::Attributes().set_foo(x).set_bar(y));
+ *
+ * but we are not implementing that one (detecting errors is too
+ * hard without exceptions and ACE+TAO are somewhat shy of
+ * exceptions at this point.)
+ */
+ struct TAO_RTEvent_Serv_Export Attributes
+ {
+ Attributes (void);
+
+ Address_Server_Type address_server_type;
+ Handler_Type handler_type;
+ Service_Type service_type;
+ u_char ttl_value;
+ ACE_CString nic;
+ int ip_multicast_loop;
+ int non_blocking;
+ };
+
+ /// Configure TAO_ECG_Mcast_Gateway programatically. This method should
+ /// be used when NOT using service configurator to obtain/configure
+ /// TAO_ECG_Mcast_Gateway. See class documentation above for more
+ /// info.
+ int init (const char * address_server_arg,
+ const Attributes & attributes = Attributes());
+
+ /// Same as the method above, but also gives the client an opportunity to
+ /// specify consumer qos, i.e., which EC traffic should get multicasted.
+ /*
+ * By default, multicast sender subscribes to all events in the
+ * Event Channel, i.e., all events pushed to the EC get multicasted
+ * (as long as their ttl is > 0). This method allows clients to
+ * specify a more restrictive qos, hence limiting which EC traffic
+ * gets multicasted.
+ */
+ int init (const RtecEventChannelAdmin::ConsumerQOS & consumer_qos,
+ const char * address_server_arg,
+ const Attributes & attributes = Attributes());
+
+ /// The main method - create, configure and run federation
+ /// components according to the specified configuration.
+ void run (CORBA::ORB_ptr orb,
+ RtecEventChannelAdmin::EventChannel_ptr ec
+ ACE_ENV_ARG_DECL);
+
+private:
+
+ /// Helpers.
+ //@{
+ /// Check that arguments to run() are not nil.
+ void verify_args (CORBA::ORB_ptr orb,
+ RtecEventChannelAdmin::EventChannel_ptr ec
+ ACE_ENV_ARG_DECL);
+
+ /// Verifies configuration values specified through init() make sense.
+ int validate_configuration (void);
+ //@}
+
+ /// Allocate and initialize appropriate objects.
+ //@{
+ PortableServer::ServantBase *
+ init_address_server (void);
+
+ TAO_EC_Servant_Var<TAO_ECG_UDP_Sender>
+ init_sender (RtecEventChannelAdmin::EventChannel_ptr ec,
+ RtecUDPAdmin::AddrServer_ptr address_server,
+ TAO_ECG_Refcounted_Endpoint endpoint_rptr
+ ACE_ENV_ARG_DECL);
+
+ TAO_EC_Servant_Var<TAO_ECG_UDP_Receiver>
+ init_receiver (RtecEventChannelAdmin::EventChannel_ptr ec,
+ RtecUDPAdmin::AddrServer_ptr address_server,
+ TAO_ECG_Refcounted_Endpoint endpoint_rptr
+ ACE_ENV_ARG_DECL);
+
+ TAO_ECG_Refcounted_Endpoint init_endpoint (void);
+
+ TAO_ECG_Refcounted_Handler
+ init_handler (TAO_ECG_Dgram_Handler *recv,
+ RtecEventChannelAdmin::EventChannel_ptr ec,
+ ACE_Reactor * reactor
+ ACE_ENV_ARG_DECL);
+ //@}
+
+ /// Flags controlling configuration.
+ //@{
+ Service_Type service_type_;
+ Handler_Type handler_type_;
+ Address_Server_Type address_server_type_;
+ ACE_CString address_server_arg_;
+ u_char ttl_value_;
+ ACE_CString nic_;
+ int ip_multicast_loop_;
+ int non_blocking_;
+
+ RtecEventChannelAdmin::ConsumerQOS consumer_qos_;
+ //@}
+};
+
+TAO_END_VERSIONED_NAMESPACE_DECL
+
+#if defined (__ACE_INLINE__)
+#include "orbsvcs/Event/ECG_Mcast_Gateway.i"
+#endif /* __ACE_INLINE__ */
+
+ACE_STATIC_SVC_DECLARE (TAO_ECG_Mcast_Gateway)
+ACE_FACTORY_DECLARE (TAO_RTEvent_Serv, TAO_ECG_Mcast_Gateway)
+
+#include /**/ "ace/post.h"
+#endif /* TAO_ECG_MCAST_GATEWAY_H */
diff --git a/TAO/orbsvcs/orbsvcs/Event/ECG_Mcast_Gateway.i b/TAO/orbsvcs/orbsvcs/Event/ECG_Mcast_Gateway.i
new file mode 100644
index 00000000000..8e126abb9b6
--- /dev/null
+++ b/TAO/orbsvcs/orbsvcs/Event/ECG_Mcast_Gateway.i
@@ -0,0 +1,34 @@
+// -*- C++ -*-
+//
+// $Id$
+
+TAO_BEGIN_VERSIONED_NAMESPACE_DECL
+
+ACE_INLINE
+TAO_ECG_Mcast_Gateway::TAO_ECG_Mcast_Gateway (void)
+ : service_type_ (TAO_ECG_DEFAULT_SERVICE)
+ , handler_type_ (TAO_ECG_DEFAULT_HANDLER)
+ , address_server_type_ (TAO_ECG_DEFAULT_ADDRESS_SERVER)
+ , address_server_arg_ ((const char *) TAO_ECG_DEFAULT_ADDRESS_SERVER_ARG)
+ , ttl_value_ (TAO_ECG_DEFAULT_TTL)
+ , nic_ (static_cast<const char *> (TAO_ECG_DEFAULT_NIC))
+ , ip_multicast_loop_ (TAO_ECG_DEFAULT_IP_MULTICAST_LOOP)
+ , non_blocking_ (TAO_ECG_DEFAULT_NON_BLOCKING)
+ , consumer_qos_ ()
+{
+ this->consumer_qos_.dependencies.length (0);
+}
+
+ACE_INLINE
+TAO_ECG_Mcast_Gateway::Attributes::Attributes (void)
+ : address_server_type (TAO_ECG_DEFAULT_ADDRESS_SERVER)
+ , handler_type (TAO_ECG_DEFAULT_HANDLER)
+ , service_type (TAO_ECG_DEFAULT_SERVICE)
+ , ttl_value (TAO_ECG_DEFAULT_TTL)
+ , nic (static_cast<const char *> (TAO_ECG_DEFAULT_NIC))
+ , ip_multicast_loop (TAO_ECG_DEFAULT_IP_MULTICAST_LOOP)
+ , non_blocking (TAO_ECG_DEFAULT_NON_BLOCKING)
+{
+}
+
+TAO_END_VERSIONED_NAMESPACE_DECL
diff --git a/TAO/orbsvcs/orbsvcs/Event/ECG_Reactive_ConsumerEC_Control.cpp b/TAO/orbsvcs/orbsvcs/Event/ECG_Reactive_ConsumerEC_Control.cpp
new file mode 100644
index 00000000000..0906d59820f
--- /dev/null
+++ b/TAO/orbsvcs/orbsvcs/Event/ECG_Reactive_ConsumerEC_Control.cpp
@@ -0,0 +1,253 @@
+// $Id$
+
+#include "orbsvcs/Event/EC_Gateway_IIOP.h"
+#include "orbsvcs/Event/ECG_Reactive_ConsumerEC_Control.h"
+#include "tao/Messaging/Messaging.h"
+#include "tao/ORB_Core.h"
+
+#include "ace/Reactor.h"
+
+ACE_RCSID(Event, ECG_Reactive_ConsumerEventChannelControl, "$Id$")
+
+TAO_BEGIN_VERSIONED_NAMESPACE_DECL
+
+TAO_ECG_Reactive_ConsumerEC_Control::
+ TAO_ECG_Reactive_ConsumerEC_Control (const ACE_Time_Value &rate,
+ const ACE_Time_Value &timeout,
+ TAO_EC_Gateway_IIOP* gateway,
+ CORBA::ORB_ptr orb)
+ : rate_ (rate),
+ timeout_ (timeout),
+ adapter_ (this),
+ gateway_ (gateway),
+ orb_ (CORBA::ORB::_duplicate (orb))
+#if defined (TAO_HAS_CORBA_MESSAGING) && TAO_HAS_CORBA_MESSAGING != 0
+ , timer_id_ (-1)
+#endif /* TAO_HAS_CORBA_MESSAGING != 0*/
+{
+ this->reactor_ =
+ this->orb_->orb_core ()->reactor ();
+}
+
+TAO_ECG_Reactive_ConsumerEC_Control::~TAO_ECG_Reactive_ConsumerEC_Control (void)
+{
+}
+
+void
+TAO_ECG_Reactive_ConsumerEC_Control::query_eventchannel (
+ ACE_ENV_SINGLE_ARG_DECL)
+{
+ ACE_TRY
+ {
+ CORBA::Boolean disconnected;
+ CORBA::Boolean non_existent =
+ gateway_->consumer_ec_non_existent (disconnected
+ ACE_ENV_ARG_PARAMETER);
+ ACE_TRY_CHECK;
+ if (non_existent && !disconnected)
+ {
+ this->event_channel_not_exist (gateway_ ACE_ENV_ARG_PARAMETER);
+ ACE_TRY_CHECK;
+ }
+ }
+ ACE_CATCH (CORBA::OBJECT_NOT_EXIST, ex)
+ {
+ this->event_channel_not_exist (gateway_ ACE_ENV_ARG_PARAMETER);
+ ACE_TRY_CHECK;
+ }
+ ACE_CATCH (CORBA::TRANSIENT, transient)
+ {
+ // This is TAO's minor code for a failed connection, we may
+ // want to be more lenient in the future..
+ // if (transient.minor () == 0x54410085)
+ this->event_channel_not_exist (gateway_ ACE_ENV_ARG_PARAMETER);
+ ACE_TRY_CHECK;
+ }
+ ACE_CATCHANY
+ {
+ // Ignore all exceptions
+ }
+ ACE_ENDTRY;
+}
+
+void
+TAO_ECG_Reactive_ConsumerEC_Control::handle_timeout (
+ const ACE_Time_Value &,
+ const void *)
+{
+ // NOTE, setting RELATIVE_RT_TIMEOUT_POLICY for the duration of
+ // query_eventchannel () below has greater impact than desired. For
+ // example, while we are pinging ec here, a nested upcall,
+ // which requires making remote calls may come into the ORB. Those
+ // remote calls will be carried out with with
+ // RELATIVE_RT_TIMEOUT_POLICY set here in effect.
+
+ // @@ TODO: should use Guard to set and reset policies.
+ ACE_TRY_NEW_ENV
+ {
+ // Query the state of the Current object *before* we initiate
+ // the iteration...
+ CORBA::PolicyTypeSeq types;
+ CORBA::PolicyList_var policies =
+ this->policy_current_->get_policy_overrides (types
+ ACE_ENV_ARG_PARAMETER);
+ ACE_TRY_CHECK;
+
+ // Change the timeout
+ this->policy_current_->set_policy_overrides (this->policy_list_,
+ CORBA::ADD_OVERRIDE
+ ACE_ENV_ARG_PARAMETER);
+ ACE_TRY_CHECK;
+
+ // Query the state of the consumers...
+ this->query_eventchannel (ACE_ENV_SINGLE_ARG_PARAMETER);
+ ACE_TRY_CHECK;
+
+ this->policy_current_->set_policy_overrides (policies.in (),
+ CORBA::SET_OVERRIDE
+ ACE_ENV_ARG_PARAMETER);
+ ACE_TRY_CHECK;
+ for (CORBA::ULong i = 0; i != policies->length (); ++i)
+ {
+ policies[i]->destroy (ACE_ENV_SINGLE_ARG_PARAMETER);
+ ACE_TRY_CHECK;
+ }
+ }
+ ACE_CATCHANY
+ {
+ // Ignore all exceptions
+ }
+ ACE_ENDTRY;
+}
+
+int
+TAO_ECG_Reactive_ConsumerEC_Control::activate (void)
+{
+#if defined (TAO_HAS_CORBA_MESSAGING) && TAO_HAS_CORBA_MESSAGING != 0
+ ACE_TRY_NEW_ENV
+ {
+ // Get the PolicyCurrent object
+ CORBA::Object_var tmp =
+ this->orb_->resolve_initial_references ("PolicyCurrent"
+ ACE_ENV_ARG_PARAMETER);
+ ACE_TRY_CHECK;
+
+ this->policy_current_ =
+ CORBA::PolicyCurrent::_narrow (tmp.in ()
+ ACE_ENV_ARG_PARAMETER);
+ ACE_TRY_CHECK;
+
+ // Timeout for polling state (default = 10 msec)
+ TimeBase::TimeT timeout = timeout_.usec() * 10;
+ CORBA::Any any;
+ any <<= timeout;
+
+ this->policy_list_.length (1);
+ this->policy_list_[0] =
+ this->orb_->create_policy (
+ Messaging::RELATIVE_RT_TIMEOUT_POLICY_TYPE,
+ any
+ ACE_ENV_ARG_PARAMETER);
+ ACE_TRY_CHECK;
+
+ // Only schedule the timer, when the rate is not zero
+ if (this->rate_ != ACE_Time_Value::zero)
+ {
+ // Schedule the timer after these policies has been set, because the
+ // handle_timeout uses these policies, if done in front, the channel
+ // can crash when the timeout expires before initiazation is ready.
+ timer_id_ = this->reactor_->schedule_timer (&this->adapter_,
+ 0,
+ this->rate_,
+ this->rate_);
+ if (timer_id_ == -1)
+ return -1;
+ }
+ }
+ ACE_CATCHANY
+ {
+ return -1;
+ }
+ ACE_ENDTRY;
+#endif /* TAO_HAS_CORBA_MESSAGING */
+
+ return 0;
+}
+
+int
+TAO_ECG_Reactive_ConsumerEC_Control::shutdown (void)
+{
+ int r = 0;
+
+#if defined (TAO_HAS_CORBA_MESSAGING) && TAO_HAS_CORBA_MESSAGING != 0
+ r = this->reactor_->cancel_timer (timer_id_);
+#endif /* TAO_HAS_CORBA_MESSAGING */
+
+ this->adapter_.reactor (0);
+ return r;
+}
+
+void
+TAO_ECG_Reactive_ConsumerEC_Control::event_channel_not_exist (
+ TAO_EC_Gateway_IIOP* gateway
+ ACE_ENV_ARG_DECL)
+{
+ ACE_TRY
+ {
+ ACE_DEBUG ((LM_DEBUG,
+ "EC_Reactive_ConsumerControl(%P|%t) - "
+ "channel %x does not exists\n"));
+ gateway->cleanup_consumer_ec ();
+
+ gateway->cleanup_consumer_proxies (ACE_ENV_SINGLE_ARG_PARAMETER);
+ ACE_TRY_CHECK;
+
+ }
+ ACE_CATCHANY
+ {
+ ACE_PRINT_EXCEPTION (ACE_ANY_EXCEPTION,
+ "TAO_EC_Reactive_ConsumerControl::event_channel_not_exist");
+ // Ignore all exceptions..
+ }
+ ACE_ENDTRY;
+}
+
+void
+TAO_ECG_Reactive_ConsumerEC_Control::system_exception (
+ TAO_EC_Gateway_IIOP* gateway,
+ CORBA::SystemException & /* exception */
+ ACE_ENV_ARG_DECL)
+{
+ ACE_TRY
+ {
+ gateway->cleanup_consumer_ec ();
+
+ gateway->cleanup_consumer_proxies (ACE_ENV_SINGLE_ARG_PARAMETER);
+ ACE_TRY_CHECK;
+
+ }
+ ACE_CATCHANY
+ {
+ // Ignore all exceptions..
+ }
+ ACE_ENDTRY;
+}
+
+// ****************************************************************
+
+TAO_ECG_Reactive_ConsumerEC_Control_Adapter::TAO_ECG_Reactive_ConsumerEC_Control_Adapter (
+ TAO_ECG_Reactive_ConsumerEC_Control *adaptee)
+ : adaptee_ (adaptee)
+{
+}
+
+int
+TAO_ECG_Reactive_ConsumerEC_Control_Adapter::handle_timeout (
+ const ACE_Time_Value &tv,
+ const void *arg)
+{
+ this->adaptee_->handle_timeout (tv, arg);
+ return 0;
+}
+
+TAO_END_VERSIONED_NAMESPACE_DECL
diff --git a/TAO/orbsvcs/orbsvcs/Event/ECG_Reactive_ConsumerEC_Control.h b/TAO/orbsvcs/orbsvcs/Event/ECG_Reactive_ConsumerEC_Control.h
new file mode 100644
index 00000000000..e7ccad73c2a
--- /dev/null
+++ b/TAO/orbsvcs/orbsvcs/Event/ECG_Reactive_ConsumerEC_Control.h
@@ -0,0 +1,133 @@
+// -*- C++ -*-
+
+/**
+ * @file ECG_Reactive_ConsumerEC_Control.h
+ *
+ * $Id$
+ *
+ * @author Johnny Willemsen (jwillemsen@remedy.nl)
+ *
+ */
+
+#ifndef TAO_ECG_REACTIVE_CONSUMEREC_CONTROL_H
+#define TAO_ECG_REACTIVE_CONSUMEREC_CONTROL_H
+
+#include /**/ "ace/pre.h"
+
+#include "orbsvcs/Event/ECG_ConsumerEC_Control.h"
+
+#if !defined (ACE_LACKS_PRAGMA_ONCE)
+# pragma once
+#endif /* ACE_LACKS_PRAGMA_ONCE */
+
+#include "tao/ORB.h"
+#include "tao/PolicyC.h"
+
+#include "ace/Event_Handler.h"
+
+TAO_BEGIN_VERSIONED_NAMESPACE_DECL
+
+class TAO_ECG_Reactive_ConsumerEC_Control;
+class TAO_EC_Gateway_IIOP;
+
+/**
+ * @class TAO_ECG_Reactive_ConsumerEC_Control_Adapter
+ *
+ * @brief Forwards timeout events to the Reactive ConsumerControl
+ *
+ * The Reactive ConsumerControl strategy uses the reactor to
+ * periodically wakeup and verify the state of the consumers
+ * registered with the Event Channel.
+ */
+class TAO_RTEvent_Serv_Export TAO_ECG_Reactive_ConsumerEC_Control_Adapter
+ : public ACE_Event_Handler
+{
+public:
+ /// Constructor
+ TAO_ECG_Reactive_ConsumerEC_Control_Adapter (TAO_ECG_Reactive_ConsumerEC_Control *adaptee);
+
+ // = Documented in ACE_Event_Handler.
+ virtual int handle_timeout (const ACE_Time_Value &tv,
+ const void *arg = 0);
+
+private:
+ /// The adapted object
+ TAO_ECG_Reactive_ConsumerEC_Control *adaptee_;
+};
+
+/**
+ * @class TAO_ECG_Reactive_ConsumerEC_Control
+ *
+ * @brief Consumer event channel control
+ *
+ * Defines the interface for the consumer event channel control strategy.
+ * This strategy handles misbehaving or failing consumer event channels.
+ */
+class TAO_RTEvent_Serv_Export TAO_ECG_Reactive_ConsumerEC_Control
+ : public TAO_ECG_ConsumerEC_Control
+{
+public:
+ /// Constructor. It does not assume ownership of the @a event_channel
+ /// parameter.
+ TAO_ECG_Reactive_ConsumerEC_Control (const ACE_Time_Value &rate,
+ const ACE_Time_Value &timeout,
+ TAO_EC_Gateway_IIOP* gateway,
+ CORBA::ORB_ptr orb);
+
+ /// Destructor.
+ virtual ~TAO_ECG_Reactive_ConsumerEC_Control (void);
+
+ /// Receive the timeout from the adapter
+ void handle_timeout (const ACE_Time_Value &tv,
+ const void* arg);
+
+ // = Documented in TAO_EC_ConsumerControl
+ virtual int activate (void);
+ virtual int shutdown (void);
+ virtual void event_channel_not_exist (TAO_EC_Gateway_IIOP *gateway
+ ACE_ENV_ARG_DECL_NOT_USED);
+ virtual void system_exception (TAO_EC_Gateway_IIOP *gateway,
+ CORBA::SystemException &
+ ACE_ENV_ARG_DECL_NOT_USED);
+
+private:
+ /// Check if the consumers still exists. It is a helper method for
+ /// handle_timeout() to isolate the exceptions.
+ void query_eventchannel (ACE_ENV_SINGLE_ARG_DECL);
+
+private:
+ /// The polling rate
+ ACE_Time_Value rate_;
+
+ /// The polling timeout
+ ACE_Time_Value timeout_;
+
+ /// The Adapter for the reactor events
+ TAO_ECG_Reactive_ConsumerEC_Control_Adapter adapter_;
+
+ /// The gateway
+ TAO_EC_Gateway_IIOP* gateway_;
+
+ /// The ORB
+ CORBA::ORB_var orb_;
+
+ /// To control the timeout policy in the thread
+ CORBA::PolicyCurrent_var policy_current_;
+
+ /// Precomputed policy list to the set timeout.
+ CORBA::PolicyList policy_list_;
+
+ /// The ORB reactor
+ ACE_Reactor *reactor_;
+
+#if defined (TAO_HAS_CORBA_MESSAGING) && TAO_HAS_CORBA_MESSAGING != 0
+ /// The timer id
+ long timer_id_;
+#endif /* TAO_HAS_CORBA_MESSAGING */
+};
+
+TAO_END_VERSIONED_NAMESPACE_DECL
+
+#include /**/ "ace/post.h"
+
+#endif /* TAO_ECG_REACTIVE_CONSUMEREC_CONTROL_H */
diff --git a/TAO/orbsvcs/orbsvcs/Event/ECG_Reconnect_ConsumerEC_Control.cpp b/TAO/orbsvcs/orbsvcs/Event/ECG_Reconnect_ConsumerEC_Control.cpp
new file mode 100644
index 00000000000..2e14b4da681
--- /dev/null
+++ b/TAO/orbsvcs/orbsvcs/Event/ECG_Reconnect_ConsumerEC_Control.cpp
@@ -0,0 +1,319 @@
+// $Id$
+
+#include "orbsvcs/Event/EC_Gateway_IIOP.h"
+#include "orbsvcs/Event/ECG_Reconnect_ConsumerEC_Control.h"
+#include "tao/Messaging/Messaging.h"
+#include "tao/ORB_Core.h"
+#include "ace/Reactor.h"
+
+ACE_RCSID(Event, ECG_Reconnect_ConsumerEventChannelControl, "$Id$")
+
+TAO_BEGIN_VERSIONED_NAMESPACE_DECL
+
+TAO_ECG_Reconnect_ConsumerEC_Control::
+ TAO_ECG_Reconnect_ConsumerEC_Control (const ACE_Time_Value &rate,
+ const ACE_Time_Value &timeout,
+ TAO_EC_Gateway_IIOP* gateway,
+ CORBA::ORB_ptr orb)
+ : rate_ (rate),
+ timeout_ (timeout),
+ adapter_ (this),
+ gateway_ (gateway),
+ orb_ (CORBA::ORB::_duplicate (orb)),
+ is_consumer_ec_connected_ (1)
+#if defined (TAO_HAS_CORBA_MESSAGING) && TAO_HAS_CORBA_MESSAGING != 0
+ , timer_id_ (-1)
+#endif /* TAO_HAS_CORBA_MESSAGING != 0*/
+{
+ this->reactor_ =
+ this->orb_->orb_core ()->reactor ();
+}
+
+TAO_ECG_Reconnect_ConsumerEC_Control::~TAO_ECG_Reconnect_ConsumerEC_Control (void)
+{
+}
+
+void
+TAO_ECG_Reconnect_ConsumerEC_Control::try_reconnect (
+ ACE_ENV_SINGLE_ARG_DECL)
+{
+ ACE_TRY
+ {
+ CORBA::Boolean disconnected;
+ CORBA::Boolean non_existent =
+ gateway_->consumer_ec_non_existent (disconnected
+ ACE_ENV_ARG_PARAMETER);
+ ACE_TRY_CHECK;
+ if (!non_existent)
+ {
+ this->reconnect(ACE_ENV_SINGLE_ARG_PARAMETER);
+ ACE_TRY_CHECK;
+ }
+ }
+ ACE_CATCHANY
+ {
+ // Ignore all exceptions
+ }
+ ACE_ENDTRY;
+}
+
+void
+TAO_ECG_Reconnect_ConsumerEC_Control::reconnect (
+ ACE_ENV_SINGLE_ARG_DECL)
+{
+ ACE_TRY
+ {
+ is_consumer_ec_connected_ = 1;
+
+ gateway_->reconnect_consumer_ec(ACE_ENV_SINGLE_ARG_PARAMETER);
+ ACE_TRY_CHECK;
+ }
+ ACE_CATCHANY
+ {
+ // Ignore all exceptions
+ }
+ ACE_ENDTRY;
+}
+
+void
+TAO_ECG_Reconnect_ConsumerEC_Control::query_eventchannel (
+ ACE_ENV_SINGLE_ARG_DECL)
+{
+ ACE_TRY
+ {
+ if (is_consumer_ec_connected_ == 1)
+ {
+ CORBA::Boolean disconnected;
+ CORBA::Boolean non_existent =
+ gateway_->consumer_ec_non_existent (disconnected
+ ACE_ENV_ARG_PARAMETER);
+ ACE_TRY_CHECK;
+ if (non_existent && !disconnected)
+ {
+ this->event_channel_not_exist (gateway_ ACE_ENV_ARG_PARAMETER);
+ ACE_TRY_CHECK;
+ }
+ }
+ else
+ {
+ this->try_reconnect(ACE_ENV_SINGLE_ARG_PARAMETER);
+ ACE_TRY_CHECK;
+ }
+ }
+ ACE_CATCH (CORBA::OBJECT_NOT_EXIST, ex)
+ {
+ this->event_channel_not_exist (gateway_ ACE_ENV_ARG_PARAMETER);
+ ACE_TRY_CHECK;
+ }
+ ACE_CATCH (CORBA::TRANSIENT, transient)
+ {
+ // This is TAO's minor code for a failed connection, we may
+ // want to be more lenient in the future..
+ // if (transient.minor () == 0x54410085)
+ this->event_channel_not_exist (gateway_ ACE_ENV_ARG_PARAMETER);
+ ACE_TRY_CHECK;
+ }
+ ACE_CATCHANY
+ {
+ // Ignore all exceptions
+ }
+ ACE_ENDTRY;
+}
+
+void
+TAO_ECG_Reconnect_ConsumerEC_Control::handle_timeout (
+ const ACE_Time_Value &,
+ const void *)
+{
+ // NOTE, setting RELATIVE_RT_TIMEOUT_POLICY for the duration of
+ // query_eventchannel () below has greater impact than desired. For
+ // example, while we are pinging consumers here, a nested upcall,
+ // which requires making remote calls may come into the ORB. Those
+ // remote calls will be carried out with with
+ // RELATIVE_RT_TIMEOUT_POLICY set here in effect.
+ // @@ TODO: should use Guard to set and reset policies.
+ ACE_TRY_NEW_ENV
+ {
+ // Query the state of the Current object *before* we initiate
+ // the iteration...
+ CORBA::PolicyTypeSeq types;
+ CORBA::PolicyList_var policies =
+ this->policy_current_->get_policy_overrides (types
+ ACE_ENV_ARG_PARAMETER);
+ ACE_TRY_CHECK;
+
+ // Change the timeout
+ this->policy_current_->set_policy_overrides (this->policy_list_,
+ CORBA::ADD_OVERRIDE
+ ACE_ENV_ARG_PARAMETER);
+ ACE_TRY_CHECK;
+
+ // Query the state of the consumers...
+ this->query_eventchannel (ACE_ENV_SINGLE_ARG_PARAMETER);
+ ACE_TRY_CHECK;
+
+ this->policy_current_->set_policy_overrides (policies.in (),
+ CORBA::SET_OVERRIDE
+ ACE_ENV_ARG_PARAMETER);
+ ACE_TRY_CHECK;
+ for (CORBA::ULong i = 0; i != policies->length (); ++i)
+ {
+ policies[i]->destroy (ACE_ENV_SINGLE_ARG_PARAMETER);
+ ACE_TRY_CHECK;
+ }
+ }
+ ACE_CATCHANY
+ {
+ // Ignore all exceptions
+ }
+ ACE_ENDTRY;
+}
+
+int
+TAO_ECG_Reconnect_ConsumerEC_Control::activate (void)
+{
+#if defined (TAO_HAS_CORBA_MESSAGING) && TAO_HAS_CORBA_MESSAGING != 0
+ ACE_TRY_NEW_ENV
+ {
+ // Get the PolicyCurrent object
+ CORBA::Object_var tmp =
+ this->orb_->resolve_initial_references ("PolicyCurrent"
+ ACE_ENV_ARG_PARAMETER);
+ ACE_TRY_CHECK;
+
+ this->policy_current_ =
+ CORBA::PolicyCurrent::_narrow (tmp.in ()
+ ACE_ENV_ARG_PARAMETER);
+ ACE_TRY_CHECK;
+
+ // Timeout for polling state (default = 10 msec)
+ TimeBase::TimeT timeout = timeout_.usec() * 10;
+ CORBA::Any any;
+ any <<= timeout;
+
+ this->policy_list_.length (1);
+ this->policy_list_[0] =
+ this->orb_->create_policy (
+ Messaging::RELATIVE_RT_TIMEOUT_POLICY_TYPE,
+ any
+ ACE_ENV_ARG_PARAMETER);
+ ACE_TRY_CHECK;
+
+ // Only schedule the timer, when the rate is not zero
+ if (this->rate_ != ACE_Time_Value::zero)
+ {
+ // Schedule the timer after these policies has been set, because the
+ // handle_timeout uses these policies, if done in front, the channel
+ // can crash when the timeout expires before initiazation is ready.
+ timer_id_ = this->reactor_->schedule_timer (&this->adapter_,
+ 0,
+ this->rate_,
+ this->rate_);
+ if (timer_id_ == -1)
+ return -1;
+ }
+ }
+ ACE_CATCHANY
+ {
+ return -1;
+ }
+ ACE_ENDTRY;
+#endif /* TAO_HAS_CORBA_MESSAGING */
+
+ return 0;
+}
+
+int
+TAO_ECG_Reconnect_ConsumerEC_Control::shutdown (void)
+{
+ int r = 0;
+
+#if defined (TAO_HAS_CORBA_MESSAGING) && TAO_HAS_CORBA_MESSAGING != 0
+ r = this->reactor_->cancel_timer (timer_id_);
+#endif /* TAO_HAS_CORBA_MESSAGING */
+
+ this->adapter_.reactor (0);
+ return r;
+}
+
+void
+TAO_ECG_Reconnect_ConsumerEC_Control::event_channel_not_exist (
+ TAO_EC_Gateway_IIOP* gateway
+ ACE_ENV_ARG_DECL)
+{
+ ACE_TRY
+ {
+ //ACE_DEBUG ((LM_DEBUG,
+ // "ECG_Reconnect_ConsumerControl(%P|%t) - "
+ // "channel %x does not exists\n"));
+ is_consumer_ec_connected_ = 0;
+
+ gateway->suspend_supplier_ec (ACE_ENV_SINGLE_ARG_PARAMETER);
+ ACE_TRY_CHECK;
+
+ gateway->cleanup_consumer_proxies (ACE_ENV_SINGLE_ARG_PARAMETER);
+ ACE_TRY_CHECK;
+ }
+ ACE_CATCHANY
+ {
+ ACE_PRINT_EXCEPTION (ACE_ANY_EXCEPTION,
+ "TAO_EC_Reconnect_ConsumerControl::event_channel_not_exist");
+ // Ignore all exceptions..
+ }
+ ACE_ENDTRY;
+}
+
+void
+TAO_ECG_Reconnect_ConsumerEC_Control::system_exception (
+ TAO_EC_Gateway_IIOP* gateway,
+ CORBA::SystemException & /* exception */
+ ACE_ENV_ARG_DECL)
+{
+ ACE_TRY
+ {
+ // The current implementation is very strict, and kicks out a
+ // client on the first system exception. We may
+ // want to be more lenient in the future, for example,
+ // this is TAO's minor code for a failed connection.
+ //
+ // if (CORBA::TRANSIENT::_narrow (&exception) != 0
+ // && exception->minor () == 0x54410085)
+ // return;
+
+ // Anything else is serious, including timeouts...
+ //ACE_DEBUG ((LM_DEBUG,
+ // "ECG_Reconnect_ConsumerControl(%P|%t) - "
+ // "channel %x does not exists system except\n"));
+ is_consumer_ec_connected_ = 0;
+
+ gateway->suspend_supplier_ec (ACE_ENV_SINGLE_ARG_PARAMETER);
+ ACE_TRY_CHECK;
+
+ gateway->cleanup_consumer_proxies (ACE_ENV_SINGLE_ARG_PARAMETER);
+ ACE_TRY_CHECK;
+ }
+ ACE_CATCHANY
+ {
+ // Ignore all exceptions..
+ }
+ ACE_ENDTRY;
+}
+
+// ****************************************************************
+
+TAO_ECG_Reconnect_ConsumerEC_Control_Adapter::TAO_ECG_Reconnect_ConsumerEC_Control_Adapter (
+ TAO_ECG_Reconnect_ConsumerEC_Control *adaptee)
+ : adaptee_ (adaptee)
+{
+}
+
+int
+TAO_ECG_Reconnect_ConsumerEC_Control_Adapter::handle_timeout (
+ const ACE_Time_Value &tv,
+ const void *arg)
+{
+ this->adaptee_->handle_timeout (tv, arg);
+ return 0;
+}
+
+TAO_END_VERSIONED_NAMESPACE_DECL
diff --git a/TAO/orbsvcs/orbsvcs/Event/ECG_Reconnect_ConsumerEC_Control.h b/TAO/orbsvcs/orbsvcs/Event/ECG_Reconnect_ConsumerEC_Control.h
new file mode 100644
index 00000000000..b1f4a6c2987
--- /dev/null
+++ b/TAO/orbsvcs/orbsvcs/Event/ECG_Reconnect_ConsumerEC_Control.h
@@ -0,0 +1,147 @@
+// -*- C++ -*-
+
+/**
+ * @file ECG_Reconnect_ConsumerEC_Control.h
+ *
+ * $Id$
+ *
+ * @author Johnny Willemsen (jwillemsen@remedy.nl)
+ *
+ */
+
+#ifndef TAO_ECG_RECONNECT_CONSUMEREC_CONTROL_H
+#define TAO_ECG_RECONNECT_CONSUMEREC_CONTROL_H
+
+#include /**/ "ace/pre.h"
+
+#include "orbsvcs/Event/ECG_ConsumerEC_Control.h"
+
+#if !defined (ACE_LACKS_PRAGMA_ONCE)
+# pragma once
+#endif /* ACE_LACKS_PRAGMA_ONCE */
+
+#include "tao/ORB.h"
+#include "tao/PolicyC.h"
+
+#include "ace/Event_Handler.h"
+
+TAO_BEGIN_VERSIONED_NAMESPACE_DECL
+
+class TAO_ECG_Reconnect_ConsumerEC_Control;
+class TAO_EC_Gateway_IIOP;
+
+/**
+ * @class TAO_ECG_Reconnect_ConsumerEC_Control_Adapter
+ *
+ * @brief Forwards timeout events to the Reconnect ConsumerControl
+ *
+ * The Reconnect ConsumerControl strategy uses the reactor to
+ * periodically wakeup and verify the state of the consumers
+ * registered with the Event Channel.
+ */
+class TAO_RTEvent_Serv_Export TAO_ECG_Reconnect_ConsumerEC_Control_Adapter
+ : public ACE_Event_Handler
+{
+public:
+ /// Constructor
+ TAO_ECG_Reconnect_ConsumerEC_Control_Adapter (TAO_ECG_Reconnect_ConsumerEC_Control *adaptee);
+
+ // = Documented in ACE_Event_Handler.
+ virtual int handle_timeout (const ACE_Time_Value &tv,
+ const void *arg = 0);
+
+private:
+ /// The adapted object
+ TAO_ECG_Reconnect_ConsumerEC_Control *adaptee_;
+};
+
+/**
+ * @class TAO_ECG_Reconnect_ConsumerEC_Control
+ *
+ * @brief Consumer event channel control
+ *
+ * Defines the interface for the consumer event channel control strategy.
+ * This strategy handles misbehaving or failing consumer event channels.
+ *
+ * This control tries to reconnect to the consumer ec incase of a connection
+ * loss and then does a reconnect when the connection is back again. When also
+ * a restart of the consumer ec must be handled correctly, then the consumer
+ * ec must use a persistent IOR.
+ */
+class TAO_RTEvent_Serv_Export TAO_ECG_Reconnect_ConsumerEC_Control
+ : public TAO_ECG_ConsumerEC_Control
+{
+public:
+ /// Constructor. It does not assume ownership of the @a event_channel
+ /// parameter.
+ TAO_ECG_Reconnect_ConsumerEC_Control (const ACE_Time_Value &rate,
+ const ACE_Time_Value &timeout,
+ TAO_EC_Gateway_IIOP* gateway,
+ CORBA::ORB_ptr orb);
+
+ /// Destructor.
+ virtual ~TAO_ECG_Reconnect_ConsumerEC_Control (void);
+
+ /// Receive the timeout from the adapter
+ void handle_timeout (const ACE_Time_Value &tv,
+ const void* arg);
+
+ // = Documented in TAO_EC_ConsumerControl
+ virtual int activate (void);
+ virtual int shutdown (void);
+ virtual void event_channel_not_exist (TAO_EC_Gateway_IIOP *gateway
+ ACE_ENV_ARG_DECL_NOT_USED);
+ virtual void system_exception (TAO_EC_Gateway_IIOP *gateway,
+ CORBA::SystemException &
+ ACE_ENV_ARG_DECL_NOT_USED);
+
+private:
+ /// Check if the consumers still exists. It is a helper method for
+ /// handle_timeout() to isolate the exceptions.
+ void query_eventchannel (ACE_ENV_SINGLE_ARG_DECL);
+
+ /// Look if we can reconnect again.
+ void try_reconnect (ACE_ENV_SINGLE_ARG_DECL);
+
+ /// Reconnect to the consumer ec.
+ void reconnect (ACE_ENV_SINGLE_ARG_DECL);
+
+private:
+ /// The polling rate
+ ACE_Time_Value rate_;
+
+ /// The polling timeout
+ ACE_Time_Value timeout_;
+
+ /// The Adapter for the reactor events
+ TAO_ECG_Reconnect_ConsumerEC_Control_Adapter adapter_;
+
+ /// The gateway
+ TAO_EC_Gateway_IIOP* gateway_;
+
+ /// The ORB
+ CORBA::ORB_var orb_;
+
+ /// To control the timeout policy in the thread
+ CORBA::PolicyCurrent_var policy_current_;
+
+ /// Precomputed policy list to the set timeout.
+ CORBA::PolicyList policy_list_;
+
+ /// The ORB reactor
+ ACE_Reactor *reactor_;
+
+ /// Do we have a connection to the consumer ec
+ int is_consumer_ec_connected_;
+
+#if defined (TAO_HAS_CORBA_MESSAGING) && TAO_HAS_CORBA_MESSAGING != 0
+ /// The timer id
+ long timer_id_;
+#endif /* TAO_HAS_CORBA_MESSAGING */
+};
+
+TAO_END_VERSIONED_NAMESPACE_DECL
+
+#include /**/ "ace/post.h"
+
+#endif /* TAO_ECG_RECONNECT_CONSUMEREC_CONTROL_H */
diff --git a/TAO/orbsvcs/orbsvcs/Event/ECG_Simple_Address_Server.cpp b/TAO/orbsvcs/orbsvcs/Event/ECG_Simple_Address_Server.cpp
new file mode 100644
index 00000000000..064d5c35183
--- /dev/null
+++ b/TAO/orbsvcs/orbsvcs/Event/ECG_Simple_Address_Server.cpp
@@ -0,0 +1,38 @@
+// $Id$
+
+#include "orbsvcs/Event/ECG_Simple_Address_Server.h"
+
+#if !defined(__ACE_INLINE__)
+#include "orbsvcs/Event/ECG_Simple_Address_Server.i"
+#endif /* __ACE_INLINE__ */
+
+TAO_BEGIN_VERSIONED_NAMESPACE_DECL
+
+TAO_ECG_Simple_Address_Server::TAO_ECG_Simple_Address_Server (void)
+{
+}
+
+TAO_ECG_Simple_Address_Server::~TAO_ECG_Simple_Address_Server (void)
+{
+}
+
+int
+TAO_ECG_Simple_Address_Server::init (const char *mcast_addr)
+{
+ return this->addr_.set (mcast_addr);
+}
+
+void
+TAO_ECG_Simple_Address_Server::get_addr (
+ const RtecEventComm::EventHeader& /*header*/,
+ RtecUDPAdmin::UDP_Addr_out addr
+ ACE_ENV_ARG_DECL_NOT_USED)
+ ACE_THROW_SPEC ((CORBA::SystemException))
+{
+ // unsigned long
+ addr.ipaddr = this->addr_.get_ip_address ();
+ // unsigned short
+ addr.port = this->addr_.get_port_number ();
+}
+
+TAO_END_VERSIONED_NAMESPACE_DECL
diff --git a/TAO/orbsvcs/orbsvcs/Event/ECG_Simple_Address_Server.h b/TAO/orbsvcs/orbsvcs/Event/ECG_Simple_Address_Server.h
new file mode 100644
index 00000000000..4c0cb219ccc
--- /dev/null
+++ b/TAO/orbsvcs/orbsvcs/Event/ECG_Simple_Address_Server.h
@@ -0,0 +1,69 @@
+// -*- C++ -*-
+
+/**
+ * @file ECG_Simple_Address_Server.h
+ *
+ * $Id$
+ *
+ * @author Marina Spivak (marina@atdesk.com)
+ *
+ */
+
+#ifndef TAO_ECG_SIMPLE_ADDRESS_SERVER_H
+#define TAO_ECG_SIMPLE_ADDRESS_SERVER_H
+#include /**/ "ace/pre.h"
+
+#include "orbsvcs/RtecUDPAdminS.h"
+#include "orbsvcs/Event/EC_Lifetime_Utils_T.h"
+#include "ace/INET_Addr.h"
+
+TAO_BEGIN_VERSIONED_NAMESPACE_DECL
+
+/**
+ * @class TAO_ECG_Simple_Address_Server
+ *
+ * @brief Basic implementation of RtecUDPAdmin idl interface.
+ *
+ * This simple server always returns multicast address it was
+ * initialized with, regardless of the header.
+ */
+class TAO_RTEvent_Serv_Export TAO_ECG_Simple_Address_Server :
+ public virtual POA_RtecUDPAdmin::AddrServer
+{
+public:
+
+ /// Create a new TAO_ECG_Simple_Address_Server object.
+ /// (Constructor access is restricted to insure that all
+ /// TAO_ECG_Simple_Address_Server objects are heap-allocated.)
+ static TAO_EC_Servant_Var<TAO_ECG_Simple_Address_Server> create (void);
+
+ /// Destructor
+ virtual ~TAO_ECG_Simple_Address_Server (void);
+
+ int init (const char *arg);
+
+ // = The RtecUDPAdmin::AddrServer methods
+ virtual void get_addr (const RtecEventComm::EventHeader& header,
+ RtecUDPAdmin::UDP_Addr_out addr
+ ACE_ENV_ARG_DECL)
+ ACE_THROW_SPEC ((CORBA::SystemException));
+
+protected:
+
+ /// Constructor (protected). Clients can create new
+ /// TAO_ECG_Simple_Address_Server objects using the static create()
+ /// method.
+ TAO_ECG_Simple_Address_Server (void);
+
+private:
+ ACE_INET_Addr addr_;
+};
+
+TAO_END_VERSIONED_NAMESPACE_DECL
+
+#if defined(__ACE_INLINE__)
+#include "orbsvcs/Event/ECG_Simple_Address_Server.i"
+#endif /* __ACE_INLINE__ */
+
+#include /**/ "ace/post.h"
+#endif /* TAO_ECG_SIMPLE_ADDRESS_SERVER_H */
diff --git a/TAO/orbsvcs/orbsvcs/Event/ECG_Simple_Address_Server.i b/TAO/orbsvcs/orbsvcs/Event/ECG_Simple_Address_Server.i
new file mode 100644
index 00000000000..0aa18cada97
--- /dev/null
+++ b/TAO/orbsvcs/orbsvcs/Event/ECG_Simple_Address_Server.i
@@ -0,0 +1,17 @@
+// -*- C++ -*-
+//
+// $Id$
+
+TAO_BEGIN_VERSIONED_NAMESPACE_DECL
+
+ACE_INLINE TAO_EC_Servant_Var<TAO_ECG_Simple_Address_Server>
+TAO_ECG_Simple_Address_Server::create (void)
+{
+ TAO_EC_Servant_Var<TAO_ECG_Simple_Address_Server> s;
+ ACE_NEW_RETURN (s,
+ TAO_ECG_Simple_Address_Server,
+ s);
+ return s;
+}
+
+TAO_END_VERSIONED_NAMESPACE_DECL
diff --git a/TAO/orbsvcs/orbsvcs/Event/ECG_Simple_Mcast_EH.cpp b/TAO/orbsvcs/orbsvcs/Event/ECG_Simple_Mcast_EH.cpp
new file mode 100644
index 00000000000..fa40043a50f
--- /dev/null
+++ b/TAO/orbsvcs/orbsvcs/Event/ECG_Simple_Mcast_EH.cpp
@@ -0,0 +1,98 @@
+// $Id$
+
+#include "orbsvcs/Event/ECG_Simple_Mcast_EH.h"
+#include "ace/Log_Msg.h"
+#include "ace/Reactor.h"
+#include "ace/os_include/os_fcntl.h"
+
+TAO_BEGIN_VERSIONED_NAMESPACE_DECL
+
+TAO_ECG_Simple_Mcast_EH::TAO_ECG_Simple_Mcast_EH (TAO_ECG_Dgram_Handler *recv)
+ : receiver_ (recv)
+{
+ ACE_ASSERT (this->receiver_);
+}
+
+TAO_ECG_Simple_Mcast_EH::~TAO_ECG_Simple_Mcast_EH (void)
+{
+}
+
+int
+TAO_ECG_Simple_Mcast_EH::open (const char * mcast_addr,
+ const ACE_TCHAR *net_if)
+{
+ // Check that we haven't been closed already.
+ if (!this->receiver_)
+ return -1;
+
+ if (mcast_addr == 0)
+ return -1;
+
+ ACE_INET_Addr mcast_group;
+ if (mcast_group.set (mcast_addr) != 0)
+ ACE_ERROR_RETURN ((LM_ERROR,
+ "Unable to open mcast handler: "
+ "error using specified address %s "
+ "in ACE_INET.set ().\n",
+ mcast_addr),
+ -1);
+
+ if (this->dgram_.subscribe (mcast_group, 1, net_if) != 0)
+ ACE_ERROR_RETURN ((LM_ERROR,
+ "Unable to open mcast handler: error "
+ "subscribing to %s\n",
+ mcast_addr),
+ -1);
+
+ (void) dgram_.enable(ACE_NONBLOCK);
+
+ if (!this->reactor ()
+ || 0 != this->reactor ()->register_handler (this->dgram_.get_handle (),
+ this,
+ ACE_Event_Handler::READ_MASK))
+ {
+ this->dgram_.close ();
+ ACE_ERROR_RETURN ((LM_ERROR,
+ "Cannot register handler with reactor.\n"),
+ -1);
+ }
+
+ return 0;
+}
+
+int
+TAO_ECG_Simple_Mcast_EH::shutdown (void)
+{
+ // Already shut down.
+ if (!this->receiver_)
+ return -1;
+
+ int result = 0;
+ if (this->reactor ())
+ {
+ result = this->reactor ()->remove_handler (this->dgram_.get_handle (),
+ ACE_Event_Handler::READ_MASK);
+ }
+ if (result != 0)
+ ACE_ERROR ((LM_ERROR,
+ "Unable to deregister handler from reactor "
+ "on shutdown.\n"));
+
+ result = this->dgram_.close ();
+ if (result != 0)
+ ACE_ERROR ((LM_ERROR,
+ "Unable to close mcast receiving dgram "
+ "on shutdown.\n"));
+
+ this->receiver_ = 0;
+
+ return result;
+}
+
+int
+TAO_ECG_Simple_Mcast_EH::handle_input (ACE_HANDLE /* fd */)
+{
+ return this->receiver_->handle_input (this->dgram_);
+}
+
+TAO_END_VERSIONED_NAMESPACE_DECL
diff --git a/TAO/orbsvcs/orbsvcs/Event/ECG_Simple_Mcast_EH.h b/TAO/orbsvcs/orbsvcs/Event/ECG_Simple_Mcast_EH.h
new file mode 100644
index 00000000000..d15ff0c82c6
--- /dev/null
+++ b/TAO/orbsvcs/orbsvcs/Event/ECG_Simple_Mcast_EH.h
@@ -0,0 +1,96 @@
+// -*- C++ -*-
+
+/**
+ * @file ECG_Simple_Mcast_EH.h
+ *
+ * $Id$
+ *
+ * @author Marina Spivak <marina@atdesk.com>
+ *
+ */
+#ifndef TAO_ECG_SIMPLE_MCAST_EH_H
+#define TAO_ECG_SIMPLE_MCAST_EH_H
+#include /**/ "ace/pre.h"
+
+#include "ace/Event_Handler.h"
+
+#if !defined (ACE_LACKS_PRAGMA_ONCE)
+# pragma once
+#endif /* ACE_LACKS_PRAGMA_ONCE */
+
+#include /**/ "orbsvcs/Event/event_serv_export.h"
+#include "orbsvcs/Event/ECG_Adapters.h"
+#include "ace/SOCK_Dgram_Mcast.h"
+
+
+TAO_BEGIN_VERSIONED_NAMESPACE_DECL
+
+/**
+ * @class TAO_ECG_Simple_Mcast_EH
+ *
+ * @brief Simple Event Handler for mcast messages. Listens for
+ * messages on a single mcast group. Useful in environments
+ * where event traffic is not separated into different groups.
+ * Calls handle_input (ACE_SOCK_Dgram_Mcast dgram) on a specified
+ * TAO_ECG_Dgram_Handler to inform it about message arrival.
+ *
+ * NOT THREAD-SAFE.
+ */
+class TAO_RTEvent_Serv_Export TAO_ECG_Simple_Mcast_EH
+ : public ACE_Event_Handler
+ , public TAO_ECG_Handler_Shutdown
+{
+public:
+
+ /// Initialization and termination methods.
+ //@{
+ /// Constructor.
+ /// Messages received by this EH will be forwarded to the <recv>.
+ /*
+ * See comments for <receiver_> data member on why raw pointer is
+ * used for the <recv> argument.
+ */
+ TAO_ECG_Simple_Mcast_EH (TAO_ECG_Dgram_Handler *recv);
+
+ /// Destructor.
+ virtual ~TAO_ECG_Simple_Mcast_EH (void);
+
+ /// Join the specified multicast group and register itself with the
+ /// reactor.
+ /// To insure proper resource clean up, if open () is successful,
+ /// the user MUST call shutdown () when handler is no longer needed
+ /// (and its reactor still exists).
+ int open (const char * mcast_addr,
+ const ACE_TCHAR *net_if = 0);
+
+ /// TAO_ECG_Handler_Shutdown method.
+ /// Unsubscribe from the reactor and close the datagram.
+ virtual int shutdown (void);
+ //@}
+
+ /// Main method - reactor callback. Notify <receiver_> that
+ /// <dgram_> is ready for reading.
+ virtual int handle_input (ACE_HANDLE fd);
+
+private:
+
+ // Socket on which we listen for messages.
+ ACE_SOCK_Dgram_Mcast dgram_;
+
+ /// We callback to this object when a message arrives.
+ /*
+ * We can keep a raw pointer to the receiver (even though it may
+ * be a refcounted object) because receiver guarantees
+ * to notify us (by calling shutdown ()) before going away.
+ *
+ * We have to use raw pointer instead of a refcounting mechanism
+ * here to avoid a circular refcounting dependency between
+ * receiver and handler.
+ */
+ TAO_ECG_Dgram_Handler* receiver_;
+};
+
+TAO_END_VERSIONED_NAMESPACE_DECL
+
+#include /**/ "ace/post.h"
+#endif /* TAO_ECG_SIMPLE_Mcast_EH_H */
diff --git a/TAO/orbsvcs/orbsvcs/Event/ECG_UDP_EH.cpp b/TAO/orbsvcs/orbsvcs/Event/ECG_UDP_EH.cpp
new file mode 100644
index 00000000000..257a8ff2c3b
--- /dev/null
+++ b/TAO/orbsvcs/orbsvcs/Event/ECG_UDP_EH.cpp
@@ -0,0 +1,89 @@
+// $Id$
+
+#include "orbsvcs/Event/ECG_UDP_EH.h"
+#include "ace/Reactor.h"
+#include "ace/INET_Addr.h"
+
+#if !defined(__ACE_INLINE__)
+#include "orbsvcs/Event/ECG_UDP_EH.i"
+#endif /* __ACE_INLINE__ */
+
+ACE_RCSID(Event, ECG_UDP_EH, "$Id$")
+
+TAO_BEGIN_VERSIONED_NAMESPACE_DECL
+
+TAO_ECG_UDP_EH::TAO_ECG_UDP_EH (TAO_ECG_Dgram_Handler *recv)
+ : receiver_ (recv)
+{
+ ACE_ASSERT (this->receiver_);
+}
+
+TAO_ECG_UDP_EH::~TAO_ECG_UDP_EH (void)
+{
+}
+
+int
+TAO_ECG_UDP_EH::open (const ACE_INET_Addr& ipaddr,
+ int reuse_addr)
+{
+ // Check that we haven't been closed already.
+ if (!this->receiver_)
+ return -1;
+
+ if (this->dgram_.open (ipaddr, PF_INET, 0, reuse_addr) == -1)
+ ACE_ERROR_RETURN ((LM_ERROR,
+ "Unable to open udp handler: "
+ "error opening receiving dgram.\n"),
+ -1);
+
+ if (!this->reactor ()
+ || 0 != this->reactor ()->register_handler (this->dgram_.get_handle (),
+ this,
+ ACE_Event_Handler::READ_MASK))
+ {
+ this->dgram_.close ();
+ ACE_ERROR_RETURN ((LM_ERROR,
+ "Cannot register handler with reactor.\n"),
+ -1);
+ }
+
+ return 0;
+}
+
+int
+TAO_ECG_UDP_EH::shutdown (void)
+{
+ // Already shut down.
+ if (!this->receiver_)
+ return -1;
+
+ int result = 0;
+ if (this->reactor ())
+ {
+ result = this->reactor ()->remove_handler (this->dgram_.get_handle (),
+ ACE_Event_Handler::READ_MASK);
+ }
+ if (result != 0)
+ ACE_ERROR ((LM_ERROR,
+ "Unable to deregister handler from reactor "
+ "on shutdown.\n"));
+
+ result = this->dgram_.close ();
+ if (result != 0)
+ ACE_ERROR ((LM_ERROR,
+ "Unable to close receiving dgram on shutdown.\n"));
+
+ this->receiver_ = 0;
+
+ return result;
+}
+
+int
+TAO_ECG_UDP_EH::handle_input (ACE_HANDLE)
+{
+ return this->receiver_->handle_input (this->dgram_);
+}
+
+TAO_END_VERSIONED_NAMESPACE_DECL
+
+// ****************************************************************
diff --git a/TAO/orbsvcs/orbsvcs/Event/ECG_UDP_EH.h b/TAO/orbsvcs/orbsvcs/Event/ECG_UDP_EH.h
new file mode 100644
index 00000000000..b87d4d9c745
--- /dev/null
+++ b/TAO/orbsvcs/orbsvcs/Event/ECG_UDP_EH.h
@@ -0,0 +1,110 @@
+// -*- C++ -*-
+
+/**
+ * @file ECG_UDP_EH.h
+ *
+ * $Id$
+ *
+ * @author Carlos O'Ryan (coryan@cs.wustl.edu)
+ * @author Marina Spivak (marina@atdesk.com)
+ *
+ * http://doc.ece.uci.edu/~coryan/EC/index.html
+ */
+
+#ifndef TAO_ECG_UDP_EH_H
+#define TAO_ECG_UDP_EH_H
+#include /**/ "ace/pre.h"
+
+#include "ace/Event_Handler.h"
+
+#if !defined (ACE_LACKS_PRAGMA_ONCE)
+# pragma once
+#endif /* ACE_LACKS_PRAGMA_ONCE */
+
+#include /**/ "orbsvcs/Event/event_serv_export.h"
+#include "orbsvcs/Event/ECG_Adapters.h"
+#include "ace/SOCK_Dgram.h"
+
+TAO_BEGIN_VERSIONED_NAMESPACE_DECL
+
+class TAO_ECG_UDP_Receiver;
+
+/**
+ * @class TAO_ECG_UDP_EH
+ *
+ * @brief Event Handler for UDP messages.
+ *
+ * Listens for messages on a UDP socket. When there is a message,
+ * calls handle_input () on a specified TAO_ECG_Dgram_Handler to
+ * inform it about message arrival.
+ *
+ * NOT THREAD-SAFE.
+ */
+class TAO_RTEvent_Serv_Export TAO_ECG_UDP_EH :
+ public ACE_Event_Handler
+, public TAO_ECG_Handler_Shutdown
+{
+public:
+
+ /// Initialization and termination methods.
+ //@{
+ /// Constructor.
+ /// Messages received by this EH will be forwarded to the <recv>.
+ /*
+ * See comments for <receiver_> data member on why raw pointer is
+ * used for the <recv> argument.
+ */
+ TAO_ECG_UDP_EH (TAO_ECG_Dgram_Handler *recv);
+
+ /// Destructor.
+ virtual ~TAO_ECG_UDP_EH (void);
+
+ /// Open the datagram and register itself with this->reactor().
+ /// To insure proper resource clean up, if open () is successful,
+ /// the user MUST call shutdown () when handler is no longer needed
+ /// (and its reactor still exists).
+ int open (const ACE_INET_Addr& ipaddr,
+ int reuse_addr = 0);
+
+ /// TAO_ECG_Handler_Shutdown method.
+ /// Unsubscribe from the reactor and close the datagram.
+ virtual int shutdown (void);
+ //@}
+
+ /// Main method - reactor callback. Notify <receiver_> that
+ /// <dgram_> is ready for reading.
+ virtual int handle_input (ACE_HANDLE fd);
+
+ /**
+ * Obtain the dgram, this is one of those "controlled violations of
+ * type safety", allowing the user to setup options and gain access
+ * to low-level features.
+ */
+ ACE_SOCK_Dgram &dgram (void);
+
+private:
+
+ /// The datagram used to receive the data.
+ ACE_SOCK_Dgram dgram_;
+
+ /// We callback to this object when a message arrives.
+ /*
+ * We can keep a raw pointer to the receiver (even though it may
+ * be a refcounted object) because receiver guarantees
+ * to notify us (by calling shutdown ()) before going away.
+ *
+ * We have to use raw pointer instead of a refcounting mechanism
+ * here to avoid a circular refcounting dependency between
+ * receiver and handler.
+ */
+ TAO_ECG_Dgram_Handler* receiver_;
+};
+
+TAO_END_VERSIONED_NAMESPACE_DECL
+
+#if defined(__ACE_INLINE__)
+#include "orbsvcs/Event/ECG_UDP_EH.i"
+#endif /* __ACE_INLINE__ */
+
+#include /**/ "ace/post.h"
+#endif /* TAO_ECG_UDP_EH_H */
diff --git a/TAO/orbsvcs/orbsvcs/Event/ECG_UDP_EH.i b/TAO/orbsvcs/orbsvcs/Event/ECG_UDP_EH.i
new file mode 100644
index 00000000000..d84f70937b8
--- /dev/null
+++ b/TAO/orbsvcs/orbsvcs/Event/ECG_UDP_EH.i
@@ -0,0 +1,13 @@
+// -*- C++ -*-
+//
+// $Id$
+
+TAO_BEGIN_VERSIONED_NAMESPACE_DECL
+
+ACE_INLINE ACE_SOCK_Dgram&
+TAO_ECG_UDP_EH::dgram (void)
+{
+ return this->dgram_;
+}
+
+TAO_END_VERSIONED_NAMESPACE_DECL
diff --git a/TAO/orbsvcs/orbsvcs/Event/ECG_UDP_Out_Endpoint.cpp b/TAO/orbsvcs/orbsvcs/Event/ECG_UDP_Out_Endpoint.cpp
new file mode 100644
index 00000000000..8b6fb71a6fe
--- /dev/null
+++ b/TAO/orbsvcs/orbsvcs/Event/ECG_UDP_Out_Endpoint.cpp
@@ -0,0 +1,83 @@
+// $Id$
+
+#include "orbsvcs/Event/ECG_UDP_Out_Endpoint.h"
+#include "ace/INET_Addr.h"
+#include "ace/Sock_Connect.h"
+
+#if !defined(__ACE_INLINE__)
+#include "orbsvcs/Event/ECG_UDP_Out_Endpoint.i"
+#endif /* __ACE_INLINE__ */
+
+ACE_RCSID(Event, ECG_UDP_Out_Endpoint, "$Id$")
+
+TAO_BEGIN_VERSIONED_NAMESPACE_DECL
+
+TAO_ECG_UDP_Out_Endpoint::~TAO_ECG_UDP_Out_Endpoint (void)
+{
+ this->dgram_.close ();
+
+ delete [] this->ifs_;
+}
+
+CORBA::Boolean
+TAO_ECG_UDP_Out_Endpoint::is_loopback (const ACE_INET_Addr& from)
+{
+ if (this->port_number_ == 0)
+ {
+ // Cache the port number...
+ ACE_INET_Addr local_addr;
+ if (this->dgram ().get_local_addr (local_addr) == -1)
+ return false;
+ this->port_number_ = local_addr.get_port_number ();
+ }
+
+ // Most of the time the port number is enough to determine if the
+ // message is remote, only when the local port number and the remote
+ // port number match we have to look at the local ip addresses.
+ if (from.get_port_number () != this->port_number_)
+ return false;
+
+ if (this->ifs_ == 0)
+ {
+ ACE::get_ip_interfaces (this->if_count_, this->ifs_);
+ }
+
+ for (ACE_INET_Addr* i = this->ifs_;
+ i != this->ifs_ + this->if_count_;
+ ++i)
+ {
+ if ((*i).get_ip_address () == from.get_ip_address ())
+ return true;
+ }
+ return false;
+}
+
+TAO_ECG_UDP_Out_Endpoint&
+TAO_ECG_UDP_Out_Endpoint::operator= (const TAO_ECG_UDP_Out_Endpoint& rhs)
+{
+ if (this != &rhs)
+ {
+ this->request_id_generator_ = rhs.request_id_generator_;
+ this->dgram_ = rhs.dgram_;
+ this->port_number_ = rhs.port_number_;
+ this->if_count_ = rhs.if_count_;
+
+ delete [] this->ifs_;
+ this->ifs_ = 0;
+
+ if (this->if_count_ != 0)
+ {
+ ACE_NEW_RETURN (this->ifs_,
+ ACE_INET_Addr [this->if_count_],
+ *this);
+ for(size_t i = 0; i < this->if_count_; ++i)
+ {
+ this->ifs_[i] = rhs.ifs_[i];
+ }
+ }
+ }
+
+ return *this;
+}
+
+TAO_END_VERSIONED_NAMESPACE_DECL
diff --git a/TAO/orbsvcs/orbsvcs/Event/ECG_UDP_Out_Endpoint.h b/TAO/orbsvcs/orbsvcs/Event/ECG_UDP_Out_Endpoint.h
new file mode 100644
index 00000000000..a967401e6e6
--- /dev/null
+++ b/TAO/orbsvcs/orbsvcs/Event/ECG_UDP_Out_Endpoint.h
@@ -0,0 +1,108 @@
+// -*- C++ -*-
+
+/**
+ * @file ECG_UDP_Out_Endpoint.h
+ *
+ * $Id$
+ *
+ * @author Carlos O'Ryan (coryan@cs.wustl.edu)
+ * @author Marina Spivak (marina@atdesk.com)
+ */
+
+#ifndef TAO_ECG_UDP_OUT_ENDPOINT_H
+#define TAO_ECG_UDP_OUT_ENDPOINT_H
+
+#include /**/ "ace/pre.h"
+
+#include /**/ "orbsvcs/Event/event_serv_export.h"
+
+#if !defined (ACE_LACKS_PRAGMA_ONCE)
+# pragma once
+#endif /* ACE_LACKS_PRAGMA_ONCE */
+
+#include "tao/Basic_Types.h"
+#include "tao/orbconf.h"
+
+#include "ace/Refcounted_Auto_Ptr.h"
+#include "ace/SOCK_Dgram.h"
+#include "ace/Atomic_Op.h"
+
+ACE_BEGIN_VERSIONED_NAMESPACE_DECL
+class ACE_INET_Addr;
+ACE_END_VERSIONED_NAMESPACE_DECL
+
+TAO_BEGIN_VERSIONED_NAMESPACE_DECL
+
+/**
+ * @class TAO_ECG_UDP_Out_Endpoint
+ *
+ * @brief Maintains information about an outgoing endpoint.
+ *
+ * UDP senders can share a single endpoint to send UDP packets,
+ * but there is more state associated with this endpoint than its
+ * datagram SAP; for instance we need to keep track of the request
+ * id.
+ */
+class TAO_RTEvent_Serv_Export TAO_ECG_UDP_Out_Endpoint
+{
+public:
+ /// Constructor
+ TAO_ECG_UDP_Out_Endpoint (void);
+
+ /// Constructor
+ ~TAO_ECG_UDP_Out_Endpoint (void);
+
+ /// Copy Constructor
+ TAO_ECG_UDP_Out_Endpoint (const TAO_ECG_UDP_Out_Endpoint& rhs);
+
+ /// Assignment operator
+ TAO_ECG_UDP_Out_Endpoint& operator= (const TAO_ECG_UDP_Out_Endpoint& rhs);
+
+ /// Obtain the datagram associated with this endpoint. Clients of
+ /// this class must open, and register (if necessary) this datagram.
+ ACE_SOCK_Dgram& dgram (void);
+
+ /// Obtain the next request id.
+ CORBA::ULong next_request_id (void);
+
+ /// The endpoint can detect if a data-gram was sent by itself, this
+ /// is useful to ignore or remove messages sent by the same process.
+ CORBA::Boolean is_loopback (const ACE_INET_Addr& from);
+
+private:
+ /// The request id....
+ ACE_Atomic_Op<TAO_SYNCH_MUTEX,CORBA::ULong> request_id_generator_;
+
+ /// The datagram....
+ ACE_SOCK_Dgram dgram_;
+
+ /// Cache the port-number so we can quickly determine if an event is
+ /// coming from another endpoint.
+ u_short port_number_;
+
+ /// Keep the list of local interfaces, needed for the is_loopback
+ /// method.
+ size_t if_count_;
+ ACE_INET_Addr* ifs_;
+};
+
+/**
+ * @typedef TAO_ECG_Refcounted_Endpoint
+ *
+ * @brief Reference counted pointer to TAO_ECG_UDP_Out_Endpoint
+ *
+ * Instances of TAO_ECG_UDP_Out_Endpoint are used by multiple objects
+ * in the Event Channel gateways, the endpoints are reference counted
+ * to manage their lifetime automatically.
+ */
+typedef ACE_Refcounted_Auto_Ptr<TAO_ECG_UDP_Out_Endpoint,ACE_Null_Mutex> TAO_ECG_Refcounted_Endpoint;
+
+TAO_END_VERSIONED_NAMESPACE_DECL
+
+#if defined(__ACE_INLINE__)
+#include "orbsvcs/Event/ECG_UDP_Out_Endpoint.i"
+#endif /* __ACE_INLINE__ */
+
+#include /**/ "ace/post.h"
+
+#endif /* TAO_ECG_UDP_OUT_ENDPOINT_H */
diff --git a/TAO/orbsvcs/orbsvcs/Event/ECG_UDP_Out_Endpoint.i b/TAO/orbsvcs/orbsvcs/Event/ECG_UDP_Out_Endpoint.i
new file mode 100644
index 00000000000..9f8fd0df5f3
--- /dev/null
+++ b/TAO/orbsvcs/orbsvcs/Event/ECG_UDP_Out_Endpoint.i
@@ -0,0 +1,37 @@
+// -*- C++ -*-
+//
+// $Id$
+
+TAO_BEGIN_VERSIONED_NAMESPACE_DECL
+
+ACE_INLINE
+TAO_ECG_UDP_Out_Endpoint::TAO_ECG_UDP_Out_Endpoint (void)
+ : port_number_ (0),
+ if_count_ (0),
+ ifs_ (0)
+{
+}
+
+ACE_INLINE
+TAO_ECG_UDP_Out_Endpoint::TAO_ECG_UDP_Out_Endpoint (
+ const TAO_ECG_UDP_Out_Endpoint& rhs)
+ : port_number_ (0),
+ if_count_ (0),
+ ifs_ (0)
+{
+ *this = rhs;
+}
+
+ACE_INLINE ACE_SOCK_Dgram&
+TAO_ECG_UDP_Out_Endpoint::dgram (void)
+{
+ return this->dgram_;
+}
+
+ACE_INLINE CORBA::ULong
+TAO_ECG_UDP_Out_Endpoint::next_request_id (void)
+{
+ return this->request_id_generator_++;
+}
+
+TAO_END_VERSIONED_NAMESPACE_DECL
diff --git a/TAO/orbsvcs/orbsvcs/Event/ECG_UDP_Receiver.cpp b/TAO/orbsvcs/orbsvcs/Event/ECG_UDP_Receiver.cpp
new file mode 100644
index 00000000000..1a492f72d66
--- /dev/null
+++ b/TAO/orbsvcs/orbsvcs/Event/ECG_UDP_Receiver.cpp
@@ -0,0 +1,250 @@
+// $Id$
+
+#include "orbsvcs/Event/ECG_UDP_Receiver.h"
+#include "orbsvcs/Event_Utilities.h"
+#include "ace/SString.h"
+
+#if !defined(__ACE_INLINE__)
+#include "orbsvcs/Event/ECG_UDP_Receiver.i"
+#endif /* __ACE_INLINE__ */
+
+ACE_RCSID (Event,
+ ECG_UDP_Receiver,
+ "$Id$")
+
+
+// ****************************************************************
+
+TAO_BEGIN_VERSIONED_NAMESPACE_DECL
+
+TAO_ECG_UDP_Receiver::~TAO_ECG_UDP_Receiver (void)
+{
+ this->consumer_proxy_ =
+ RtecEventChannelAdmin::ProxyPushConsumer::_nil ();
+
+ if (this->handler_rptr_.get ())
+ this->handler_rptr_->shutdown ();
+}
+
+void
+TAO_ECG_UDP_Receiver::init (RtecEventChannelAdmin::EventChannel_ptr lcl_ec,
+ TAO_ECG_Refcounted_Endpoint ignore_from,
+ RtecUDPAdmin::AddrServer_ptr addr_server
+ ACE_ENV_ARG_DECL)
+{
+ // Verify arguments.
+ // <addr_server> is allowed to be nil. But then, if get_addr () method
+ // is invoked, it throws an exception.
+ if (CORBA::is_nil (lcl_ec))
+ {
+ ACE_ERROR ((LM_ERROR,
+ "TAO_ECG_UDP_Receiver::init(): "
+ "<lcl_ec> argument is nil.\n"));
+ ACE_THROW (CORBA::INTERNAL ());
+ }
+
+ this->cdr_receiver_.init (ignore_from);
+
+ this->lcl_ec_ =
+ RtecEventChannelAdmin::EventChannel::_duplicate (lcl_ec);
+
+ this->addr_server_ =
+ RtecUDPAdmin::AddrServer::_duplicate (addr_server);
+}
+
+void
+TAO_ECG_UDP_Receiver::connect (const RtecEventChannelAdmin::SupplierQOS& pub
+ ACE_ENV_ARG_DECL)
+{
+ if (CORBA::is_nil (this->lcl_ec_.in ()))
+ {
+ ACE_ERROR ((LM_ERROR,
+ "Error initializing TAO_ECG_UDP_Receiver: "
+ "init() hasn't been called before connect().\n"));
+ ACE_THROW (CORBA::INTERNAL ());
+ }
+
+ if (pub.publications.length () == 0)
+ {
+ ACE_ERROR ((LM_ERROR,
+ "TAO_ECG_UDP_Receiver::connect(): "
+ "0-length publications argument.\n"));
+ ACE_THROW (CORBA::INTERNAL ());
+ }
+
+ if (CORBA::is_nil (this->consumer_proxy_.in ()))
+ {
+ this->new_connect (pub ACE_ENV_ARG_PARAMETER);
+ ACE_CHECK;
+ }
+ else
+ {
+ this->reconnect (pub ACE_ENV_ARG_PARAMETER);
+ ACE_CHECK;
+ }
+}
+
+void
+TAO_ECG_UDP_Receiver::new_connect (const RtecEventChannelAdmin::SupplierQOS& pub
+ ACE_ENV_ARG_DECL)
+{
+ // Activate with poa.
+ RtecEventComm::PushSupplier_var supplier_ref;
+ PortableServer::POA_var poa = this->_default_POA ();
+
+ TAO_EC_Object_Deactivator deactivator;
+ activate (supplier_ref,
+ poa.in (),
+ this,
+ deactivator
+ ACE_ENV_ARG_PARAMETER);
+ ACE_CHECK;
+
+ // Connect as a supplier to the local EC.
+ RtecEventChannelAdmin::SupplierAdmin_var supplier_admin =
+ this->lcl_ec_->for_suppliers (ACE_ENV_SINGLE_ARG_PARAMETER);
+ ACE_CHECK;
+
+ RtecEventChannelAdmin::ProxyPushConsumer_var proxy =
+ supplier_admin->obtain_push_consumer (ACE_ENV_SINGLE_ARG_PARAMETER);
+ ACE_CHECK;
+ ECG_Receiver_Auto_Proxy_Disconnect new_proxy_disconnect (proxy.in ());
+
+ proxy->connect_push_supplier (supplier_ref.in (),
+ pub
+ ACE_ENV_ARG_PARAMETER);
+ ACE_CHECK;
+
+ // Update resource managers.
+ this->consumer_proxy_ = proxy._retn ();
+ this->auto_proxy_disconnect_.set_command (new_proxy_disconnect);
+ this->set_deactivator (deactivator);
+}
+
+void
+TAO_ECG_UDP_Receiver::reconnect (const RtecEventChannelAdmin::SupplierQOS& pub
+ ACE_ENV_ARG_DECL)
+{
+ // Obtain our object reference from the POA.
+ RtecEventComm::PushSupplier_var supplier_ref;
+ PortableServer::POA_var poa = this->_default_POA ();
+
+ CORBA::Object_var obj = poa->servant_to_reference (this ACE_ENV_ARG_PARAMETER);
+ ACE_CHECK;
+ supplier_ref =
+ RtecEventComm::PushSupplier::_narrow (obj.in () ACE_ENV_ARG_PARAMETER);
+ ACE_CHECK;
+
+ if (CORBA::is_nil (supplier_ref.in ()))
+ {
+ ACE_THROW (CORBA::INTERNAL ());
+ }
+
+ // Reconnect.
+ this->consumer_proxy_->connect_push_supplier (supplier_ref.in (),
+ pub
+ ACE_ENV_ARG_PARAMETER);
+ ACE_CHECK;
+}
+
+void
+TAO_ECG_UDP_Receiver::disconnect_push_supplier (ACE_ENV_SINGLE_ARG_DECL)
+ ACE_THROW_SPEC ((CORBA::SystemException))
+{
+ // Prevent attempts to disconnect.
+ this->auto_proxy_disconnect_.disallow_command ();
+
+ this->shutdown (ACE_ENV_SINGLE_ARG_PARAMETER);
+}
+
+void
+TAO_ECG_UDP_Receiver::shutdown (ACE_ENV_SINGLE_ARG_DECL_NOT_USED)
+{
+ if (this->handler_rptr_.get ())
+ this->handler_rptr_->shutdown ();
+ TAO_ECG_Refcounted_Handler empty_handler_rptr;
+ this->handler_rptr_ = empty_handler_rptr;
+
+ this->consumer_proxy_ =
+ RtecEventChannelAdmin::ProxyPushConsumer::_nil ();
+
+ this->auto_proxy_disconnect_.execute ();
+
+ this->deactivator_.deactivate ();
+
+ this->cdr_receiver_.shutdown ();
+}
+
+// Helper class for using <cdr_receiver_>.
+class TAO_ECG_Event_CDR_Decoder: public TAO_ECG_CDR_Processor
+{
+public:
+ virtual int decode (TAO_InputCDR &cdr);
+
+ RtecEventComm::EventSet events;
+};
+
+int
+TAO_ECG_Event_CDR_Decoder::decode (TAO_InputCDR &cdr)
+{
+ if (!(cdr >> this->events))
+ {
+ ACE_ERROR_RETURN ((LM_ERROR,
+ "Error decoding events cdr.\n"),
+ -1);
+ }
+ return 0;
+}
+
+int
+TAO_ECG_UDP_Receiver::handle_input (ACE_SOCK_Dgram& dgram)
+{
+ ACE_DECLARE_NEW_CORBA_ENV;
+ ACE_TRY
+ {
+ // Make sure we are connected to the Event Channel before proceeding
+ // any further.
+ if (CORBA::is_nil (this->consumer_proxy_.in ()))
+ {
+ ACE_ERROR ((LM_ERROR,
+ "TAO_ECG_UDP_Receiver::handle_input() "
+ "called but the Receiver is not connected "
+ "to an event channel. Shutting down the Receiver.\n"));
+ this->shutdown (ACE_ENV_SINGLE_ARG_PARAMETER);
+ ACE_TRY_CHECK;
+
+ return 0;
+ }
+
+ // Receive data.
+ TAO_ECG_Event_CDR_Decoder cdr_decoder;
+ int result = this->cdr_receiver_.handle_input (dgram, &cdr_decoder);
+
+ if (result == 0)
+ // No data to act on.
+ {
+ return 0;
+ }
+ if (result == -1)
+ {
+ ACE_ERROR_RETURN ((LM_ERROR,
+ "Error receiving multicasted events.\n"),
+ 0);
+ }
+
+ this->consumer_proxy_->push (cdr_decoder.events ACE_ENV_ARG_PARAMETER);
+ ACE_TRY_CHECK;
+ }
+
+ ACE_CATCHANY
+ {
+ ACE_DEBUG ((LM_ERROR,
+ "Caught and swallowed EXCEPTION in "
+ "ECG_UDP_Receiver::handle_input: %s\n",
+ ACE_ANY_EXCEPTION._info ().c_str ()));
+ }
+ ACE_ENDTRY;
+ return 0;
+}
+
+TAO_END_VERSIONED_NAMESPACE_DECL
diff --git a/TAO/orbsvcs/orbsvcs/Event/ECG_UDP_Receiver.h b/TAO/orbsvcs/orbsvcs/Event/ECG_UDP_Receiver.h
new file mode 100644
index 00000000000..3b5a4f686dc
--- /dev/null
+++ b/TAO/orbsvcs/orbsvcs/Event/ECG_UDP_Receiver.h
@@ -0,0 +1,239 @@
+// -*- C++ -*-
+
+/**
+ * @file ECG_UDP_Receiver.h
+ *
+ * $Id$
+ *
+ * @author Carlos O'Ryan (coryan@cs.wustl.edu)
+ * @author Marina Spivak (marina@atdesk.com)
+ *
+ * Based on previous work by Tim Harrison (harrison@cs.wustl.edu) and
+ * other members of the DOC group. More details can be found in:
+ *
+ * http://doc.ece.uci.edu/~coryan/EC/index.html
+ *
+ * Define helper classes to propagate events between ECs using
+ * either UDP or multicast.
+ * The architecture is a bit complicated and deserves some
+ * explanation: sending the events over UDP (or mcast) is easy, a
+ * Consumer (TAO_ECG_UDP_Sender) subscribes for a certain set of
+ * events, its push() method marshalls the event set into a CDR
+ * stream that is sent using an ACE_SOCK_Dgram. The subscription
+ * set and IP address can be configured.
+ * Another helper class (TAO_ECG_UDP_Receiver) acts as a supplier of
+ * events; it receives a callback when an event is available on an
+ * ACE_SOCK_Dgram, it demarshalls the event and pushes it to the
+ * EC. Two ACE_Event_Handler classes are provided that can forward
+ * the events to this Supplier: TAO_ECG_Mcast_EH can receive events
+ * from a multicast group; TAO_ECG_UDP_EH can receive events from a
+ * regular UDP socket.
+ *
+ * @todo The class makes an extra copy of the events, we need to
+ * investigate if closer collaboration with its collocated EC could
+ * be used to remove that copy.
+ */
+
+#ifndef TAO_ECG_UDP_RECEIVER_H
+#define TAO_ECG_UDP_RECEIVER_H
+#include /**/ "ace/pre.h"
+
+#include "orbsvcs/RtecUDPAdminS.h"
+
+#if !defined (ACE_LACKS_PRAGMA_ONCE)
+# pragma once
+#endif /* ACE_LACKS_PRAGMA_ONCE */
+
+#include "orbsvcs/RtecEventChannelAdminS.h"
+#include /**/ "orbsvcs/Event/event_serv_export.h"
+
+#include "orbsvcs/Event/ECG_Adapters.h"
+#include "orbsvcs/Event/EC_Lifetime_Utils.h"
+#include "orbsvcs/Event/EC_Lifetime_Utils_T.h"
+#include "orbsvcs/Event/ECG_CDR_Message_Receiver.h"
+
+ACE_BEGIN_VERSIONED_NAMESPACE_DECL
+class ACE_Reactor;
+ACE_END_VERSIONED_NAMESPACE_DECL
+
+TAO_BEGIN_VERSIONED_NAMESPACE_DECL
+
+class TAO_ECG_UDP_Out_Endpoint;
+
+/**
+ * @class TAO_ECG_UDP_Receiver_Disconnect_Command
+ *
+ * @brief Disconnects supplier represented by @a proxy from the Event Channel.
+ *
+ * Utility class for use as a template argument to TAO_EC_Auto_Command.
+ * TAO_EC_Auto_Command<TAO_ECG_UDP_Receiver_Disconnect_Command> manages
+ * supplier connection to the Event Channel, automatically disconnecting from
+ * @a proxy in its destructor, if necessary.
+ */
+class TAO_RTEvent_Serv_Export TAO_ECG_UDP_Receiver_Disconnect_Command
+{
+public:
+ TAO_ECG_UDP_Receiver_Disconnect_Command (void);
+ TAO_ECG_UDP_Receiver_Disconnect_Command (
+ RtecEventChannelAdmin::ProxyPushConsumer_ptr proxy);
+
+ TAO_ECG_UDP_Receiver_Disconnect_Command (
+ const TAO_ECG_UDP_Receiver_Disconnect_Command & rhs);
+
+ TAO_ECG_UDP_Receiver_Disconnect_Command &
+ operator= (const TAO_ECG_UDP_Receiver_Disconnect_Command & rhs);
+
+ void execute (ACE_ENV_SINGLE_ARG_DECL);
+
+private:
+
+ RtecEventChannelAdmin::ProxyPushConsumer_var proxy_;
+};
+
+/**
+ * @class TAO_ECG_UDP_Receiver
+ *
+ * @brief Receive events from UDP or Multicast and push them to a
+ * "local" EC.
+ * NOT THREAD-SAFE.
+ *
+ * This class connects as a supplier to an EventChannel, and supplies
+ * to it all events it receives via UDP or Multicast.
+ */
+class TAO_RTEvent_Serv_Export TAO_ECG_UDP_Receiver :
+ public virtual POA_RtecEventComm::PushSupplier
+ , public virtual TAO_EC_Deactivated_Object
+ , public virtual TAO_ECG_Dgram_Handler
+{
+public:
+
+ /// Initialization and termination methods.
+ //@{
+
+ /// Create a new TAO_ECG_UDP_Receiver object.
+ /// (Constructor access is restricted to insure that all
+ /// TAO_ECG_UDP_Receiver objects are heap-allocated.)
+ static TAO_EC_Servant_Var<TAO_ECG_UDP_Receiver> create (CORBA::Boolean perform_crc = 0);
+
+ ~TAO_ECG_UDP_Receiver (void);
+
+ /**
+ * @param lcl_ec Event Channel to which we will act as a supplier of events.
+ * @param ignore_from Endpoint used to remove events generated by
+ * the same process.
+ * @param addr_server Address server used to obtain mapping of event type
+ * to multicast group.
+ * To insure proper resource clean up, if init () is successful,
+ * shutdown () must be called when the receiver is no longer needed.
+ * This is done by disconnect_push_supplier() method. If
+ * disconnect_push_supplier() will not be called, it is the
+ * responsibility of the user.
+ * Furthermore, if shutdown() is not explicitly called by
+ * either disconnect_push_supplier () or the user, the receiver
+ * will clean up the resources in its destructor, however, certain
+ * entities involved in cleanup must still exist at that point,
+ * e.g., POA.
+ */
+ void init (RtecEventChannelAdmin::EventChannel_ptr lcl_ec,
+ TAO_ECG_Refcounted_Endpoint ignore_from,
+ RtecUDPAdmin::AddrServer_ptr addr_server
+ ACE_ENV_ARG_DECL);
+
+ /// Connect or reconnect to the EC with the given publications.
+ /**
+ * @note If we are already connected to EC and a reconnection is
+ * necessary, the EC must have reconnects enabled in order for this
+ * method to succeed.
+ */
+ void connect (const RtecEventChannelAdmin::SupplierQOS& pub
+ ACE_ENV_ARG_DECL);
+
+ /// Set the handler we must notify when shutdown occurs. (This is
+ /// the handler that alerts us when data is available on udp/mcast socket.)
+ /// Shutdown notification gives the handler an opportunity to properly clean
+ /// up resources.
+ void set_handler_shutdown (TAO_ECG_Refcounted_Handler handler_shutdown_rptr);
+
+ /// Deactivate from POA and disconnect from EC, if necessary. Shut
+ /// down all receiver components.
+ /**
+ * If this class is used with refcounting, calling this method may
+ * result in decrementing of the reference count (due to
+ * deactivation) and deletion of the object.
+ */
+ void shutdown (ACE_ENV_SINGLE_ARG_DECL);
+ //@}
+
+ /// Accessor.
+ /// Call the RtecUDPAdmin::AddrServer::get_addr. Throws exception
+ /// if nill Address Server was specified in init ().
+ void get_addr (const RtecEventComm::EventHeader& header,
+ RtecUDPAdmin::UDP_Addr_out addr
+ ACE_ENV_ARG_DECL);
+
+ /// The PushSupplier idl method.
+ /// Invokes shutdown (), which may result in the object being deleted, if
+ /// refcounting is used to manage its lifetime.
+ virtual void disconnect_push_supplier (ACE_ENV_SINGLE_ARG_DECL)
+ ACE_THROW_SPEC ((CORBA::SystemException));
+
+ /// TAO_ECG_Dgram_Handler method.
+ /**
+ * UDP/Multicast Event_Handlers call this method when data is
+ * available at the socket - the <dgram> is ready for reading.
+ * Data is read from the socket, and, if complete message is
+ * received, the event is pushed to the local Event Channel.
+ */
+ virtual int handle_input (ACE_SOCK_Dgram& dgram);
+
+protected:
+
+ /// Constructor (protected). Clients can create new
+ /// TAO_ECG_UDP_Receiver objects using the static create() method.
+ TAO_ECG_UDP_Receiver (CORBA::Boolean perform_crc = 0);
+
+private:
+
+ /// Helpers for the connect() method.
+ //@{
+ // Establishes connection to the Event Channel for the first time.
+ void new_connect (const RtecEventChannelAdmin::SupplierQOS& pub
+ ACE_ENV_ARG_DECL);
+
+ // Updates existing connection to the Event Channel.
+ void reconnect (const RtecEventChannelAdmin::SupplierQOS& pub
+ ACE_ENV_ARG_DECL);
+ //@}
+
+ /// Event Channel to which we act as a supplier.
+ RtecEventChannelAdmin::EventChannel_var lcl_ec_;
+
+ /// The server used to map event types to multicast groups.
+ RtecUDPAdmin::AddrServer_var addr_server_;
+
+ /// Proxy used to supply events to the Event Channel.
+ RtecEventChannelAdmin::ProxyPushConsumer_var consumer_proxy_;
+
+ /// Helper for reading incoming UDP/Multicast messages. It assembles
+ /// message fragments and provides access to a cdr stream once the
+ /// complete message has been received.
+ TAO_ECG_CDR_Message_Receiver cdr_receiver_;
+
+ /// Handler we must notify when shutdown occurs, so it has an
+ /// opportunity to clean up resources.
+ TAO_ECG_Refcounted_Handler handler_rptr_;
+
+ typedef TAO_EC_Auto_Command<TAO_ECG_UDP_Receiver_Disconnect_Command>
+ ECG_Receiver_Auto_Proxy_Disconnect;
+ /// Manages our connection to Consumer Proxy.
+ ECG_Receiver_Auto_Proxy_Disconnect auto_proxy_disconnect_;
+};
+
+TAO_END_VERSIONED_NAMESPACE_DECL
+
+#if defined(__ACE_INLINE__)
+#include "orbsvcs/Event/ECG_UDP_Receiver.i"
+#endif /* __ACE_INLINE__ */
+
+#include /**/ "ace/post.h"
+#endif /* TAO_ECG_UDP_RECEIVER_H */
diff --git a/TAO/orbsvcs/orbsvcs/Event/ECG_UDP_Receiver.i b/TAO/orbsvcs/orbsvcs/Event/ECG_UDP_Receiver.i
new file mode 100644
index 00000000000..47eb3d83958
--- /dev/null
+++ b/TAO/orbsvcs/orbsvcs/Event/ECG_UDP_Receiver.i
@@ -0,0 +1,106 @@
+// -*- C++ -*-
+//
+// $Id$
+
+TAO_BEGIN_VERSIONED_NAMESPACE_DECL
+
+ACE_INLINE
+TAO_ECG_UDP_Receiver_Disconnect_Command::
+TAO_ECG_UDP_Receiver_Disconnect_Command (void)
+ : proxy_ ()
+{
+}
+
+ACE_INLINE
+TAO_ECG_UDP_Receiver_Disconnect_Command::
+TAO_ECG_UDP_Receiver_Disconnect_Command (
+ RtecEventChannelAdmin::ProxyPushConsumer_ptr proxy)
+ : proxy_ (RtecEventChannelAdmin::ProxyPushConsumer::_duplicate (proxy))
+{
+}
+
+ACE_INLINE
+TAO_ECG_UDP_Receiver_Disconnect_Command::
+TAO_ECG_UDP_Receiver_Disconnect_Command (
+ const TAO_ECG_UDP_Receiver_Disconnect_Command & rhs)
+ : proxy_ (RtecEventChannelAdmin::ProxyPushConsumer::_duplicate
+ (rhs.proxy_.in ()))
+{
+}
+
+ACE_INLINE
+TAO_ECG_UDP_Receiver_Disconnect_Command &
+TAO_ECG_UDP_Receiver_Disconnect_Command::operator= (
+ const TAO_ECG_UDP_Receiver_Disconnect_Command & rhs)
+{
+ this->proxy_ =
+ RtecEventChannelAdmin::ProxyPushConsumer::_duplicate (rhs.proxy_.in ());
+
+ return *this;
+}
+
+ACE_INLINE void
+TAO_ECG_UDP_Receiver_Disconnect_Command::
+execute (ACE_ENV_SINGLE_ARG_DECL)
+{
+ if (CORBA::is_nil (this->proxy_.in ()))
+ // We are not connected.
+ return;
+
+ RtecEventChannelAdmin::ProxyPushConsumer_var release_proxy =
+ this->proxy_._retn ();
+
+ release_proxy->disconnect_push_consumer (ACE_ENV_SINGLE_ARG_PARAMETER);
+ ACE_CHECK;
+}
+
+//***************************************************************************
+
+ACE_INLINE
+TAO_ECG_UDP_Receiver::TAO_ECG_UDP_Receiver (CORBA::Boolean perform_crc)
+ : lcl_ec_ ()
+ , addr_server_ ()
+ , consumer_proxy_ ()
+ , cdr_receiver_ (perform_crc)
+ , handler_rptr_ ()
+ , auto_proxy_disconnect_ ()
+{
+}
+
+ACE_INLINE TAO_EC_Servant_Var<TAO_ECG_UDP_Receiver>
+TAO_ECG_UDP_Receiver::create (CORBA::Boolean perform_crc)
+{
+ TAO_EC_Servant_Var<TAO_ECG_UDP_Receiver> r;
+ ACE_NEW_RETURN (r,
+ TAO_ECG_UDP_Receiver (perform_crc),
+ r);
+ return r;
+}
+
+ACE_INLINE void
+TAO_ECG_UDP_Receiver::set_handler_shutdown (
+ TAO_ECG_Refcounted_Handler handler_shutdown_rptr)
+{
+ this->handler_rptr_ = handler_shutdown_rptr;
+}
+
+ACE_INLINE void
+TAO_ECG_UDP_Receiver::get_addr (const RtecEventComm::EventHeader& header,
+ RtecUDPAdmin::UDP_Addr_out addr
+ ACE_ENV_ARG_DECL)
+{
+ if (CORBA::is_nil (this->addr_server_.in ()))
+ {
+ ACE_ERROR ((LM_ERROR,
+ "TAO_ECG_UDP_Receiver::get_addr() called but "
+ "nil Address Server was supplied during "
+ "initialization through init().\n"));
+
+ ACE_THROW (CORBA::INTERNAL ());
+ }
+
+ this->addr_server_->get_addr (header, addr
+ ACE_ENV_ARG_PARAMETER);
+}
+
+TAO_END_VERSIONED_NAMESPACE_DECL
diff --git a/TAO/orbsvcs/orbsvcs/Event/ECG_UDP_Sender.cpp b/TAO/orbsvcs/orbsvcs/Event/ECG_UDP_Sender.cpp
new file mode 100644
index 00000000000..2cfc4b5f35f
--- /dev/null
+++ b/TAO/orbsvcs/orbsvcs/Event/ECG_UDP_Sender.cpp
@@ -0,0 +1,236 @@
+/**
+ * @file ECG_UDP_Sender.cpp
+ *
+ * $Id$
+ *
+ * @author Carlos O'Ryan <coryan@uci.edu>
+ *
+ * http://doc.ece.uci.edu/~coryan/EC/index.html
+ *
+ */
+
+#include "orbsvcs/Event/ECG_UDP_Sender.h"
+#include "orbsvcs/Event_Utilities.h"
+#include "tao/CDR.h"
+
+#if !defined(__ACE_INLINE__)
+#include "orbsvcs/Event/ECG_UDP_Sender.inl"
+#endif /* __ACE_INLINE__ */
+
+ACE_RCSID (Event,
+ ECG_UDP_Sender,
+ "$Id$")
+
+// ****************************************************************
+
+TAO_BEGIN_VERSIONED_NAMESPACE_DECL
+
+TAO_ECG_UDP_Sender::~TAO_ECG_UDP_Sender (void)
+{
+}
+
+void
+TAO_ECG_UDP_Sender::init (RtecEventChannelAdmin::EventChannel_ptr lcl_ec,
+ RtecUDPAdmin::AddrServer_ptr addr_server,
+ TAO_ECG_Refcounted_Endpoint endpoint_rptr
+ ACE_ENV_ARG_DECL)
+{
+ if (CORBA::is_nil (lcl_ec))
+ {
+ ACE_ERROR ((LM_ERROR, "TAO_ECG_UDP_Sender::init(): "
+ "<lcl_ec> argument is nil."));
+ ACE_THROW (CORBA::INTERNAL ());
+ }
+
+ if (CORBA::is_nil (addr_server))
+ {
+ ACE_ERROR ((LM_ERROR, "TAO_ECG_UDP_Sender::init(): "
+ "address server argument is nil."));
+ ACE_THROW (CORBA::INTERNAL ());
+ }
+
+ this->cdr_sender_.init (endpoint_rptr ACE_ENV_ARG_PARAMETER);
+ ACE_CHECK;
+
+ this->lcl_ec_ =
+ RtecEventChannelAdmin::EventChannel::_duplicate (lcl_ec);
+
+ this->addr_server_ =
+ RtecUDPAdmin::AddrServer::_duplicate (addr_server);
+}
+
+void
+TAO_ECG_UDP_Sender::connect (const RtecEventChannelAdmin::ConsumerQOS& sub
+ ACE_ENV_ARG_DECL)
+{
+ if (CORBA::is_nil (this->lcl_ec_.in ()))
+ {
+ ACE_ERROR ((LM_ERROR, "Error initializing TAO_ECG_UDP_Sender: "
+ "init() has not been called before connect()."));
+ ACE_THROW (CORBA::INTERNAL ());
+ }
+
+ if (sub.dependencies.length () == 0)
+ {
+ ACE_ERROR ((LM_ERROR, "TAO_ECG_UDP_Sender::connect(): "
+ "0-length subscriptions argument."));
+ ACE_THROW (CORBA::INTERNAL ());
+ }
+
+ if (CORBA::is_nil (this->supplier_proxy_.in ()))
+ {
+ this->new_connect (sub ACE_ENV_ARG_PARAMETER);
+ ACE_CHECK;
+ }
+ else
+ {
+ this->reconnect (sub ACE_ENV_ARG_PARAMETER);
+ ACE_CHECK;
+ }
+}
+
+void
+TAO_ECG_UDP_Sender::new_connect (const RtecEventChannelAdmin::ConsumerQOS& sub
+ ACE_ENV_ARG_DECL)
+{
+ // Activate with poa.
+ RtecEventComm::PushConsumer_var consumer_ref;
+ PortableServer::POA_var poa = this->_default_POA ();
+
+ TAO_EC_Object_Deactivator deactivator;
+ activate (consumer_ref,
+ poa.in (),
+ this,
+ deactivator
+ ACE_ENV_ARG_PARAMETER);
+ ACE_CHECK;
+
+ // Connect as a consumer to the local EC.
+ RtecEventChannelAdmin::ConsumerAdmin_var consumer_admin =
+ this->lcl_ec_->for_consumers (ACE_ENV_SINGLE_ARG_PARAMETER);
+ ACE_CHECK;
+
+ RtecEventChannelAdmin::ProxyPushSupplier_var proxy =
+ consumer_admin->obtain_push_supplier (ACE_ENV_SINGLE_ARG_PARAMETER);
+ ACE_CHECK;
+ ECG_Sender_Auto_Proxy_Disconnect new_proxy_disconnect (proxy.in ());
+
+ proxy->connect_push_consumer (consumer_ref.in (),
+ sub
+ ACE_ENV_ARG_PARAMETER);
+ ACE_CHECK;
+
+ // Update resource managers.
+ this->supplier_proxy_ = proxy._retn ();
+ this->auto_proxy_disconnect_.set_command (new_proxy_disconnect);
+ this->set_deactivator (deactivator);
+}
+
+void
+TAO_ECG_UDP_Sender::reconnect (const RtecEventChannelAdmin::ConsumerQOS& sub
+ ACE_ENV_ARG_DECL)
+{
+ // Obtain our object reference from the POA.
+ RtecEventComm::PushConsumer_var consumer_ref;
+ PortableServer::POA_var poa = this->_default_POA ();
+
+ CORBA::Object_var obj = poa->servant_to_reference (this ACE_ENV_ARG_PARAMETER);
+ ACE_CHECK;
+ consumer_ref =
+ RtecEventComm::PushConsumer::_narrow (obj.in () ACE_ENV_ARG_PARAMETER);
+ ACE_CHECK;
+
+ if (CORBA::is_nil (consumer_ref.in ()))
+ {
+ ACE_THROW (CORBA::INTERNAL ());
+ }
+
+ // Reconnect.
+ this->supplier_proxy_->connect_push_consumer (consumer_ref.in (),
+ sub
+ ACE_ENV_ARG_PARAMETER);
+ ACE_CHECK;
+}
+
+void
+TAO_ECG_UDP_Sender::disconnect_push_consumer (ACE_ENV_SINGLE_ARG_DECL)
+ ACE_THROW_SPEC ((CORBA::SystemException))
+{
+ // Prevent attempts to disconnect.
+ this->auto_proxy_disconnect_.disallow_command ();
+
+ this->shutdown (ACE_ENV_SINGLE_ARG_PARAMETER);
+}
+
+void
+TAO_ECG_UDP_Sender::shutdown (ACE_ENV_SINGLE_ARG_DECL)
+{
+ this->supplier_proxy_ =
+ RtecEventChannelAdmin::ProxyPushSupplier::_nil ();
+
+ this->auto_proxy_disconnect_.execute ();
+
+ this->addr_server_ = RtecUDPAdmin::AddrServer::_nil ();
+ this->lcl_ec_ = RtecEventChannelAdmin::EventChannel::_nil ();
+
+ this->deactivator_.deactivate ();
+ this->cdr_sender_.shutdown (ACE_ENV_SINGLE_ARG_PARAMETER);
+ ACE_CHECK;
+}
+
+void
+TAO_ECG_UDP_Sender::push (const RtecEventComm::EventSet &events
+ ACE_ENV_ARG_DECL)
+ ACE_THROW_SPEC ((CORBA::SystemException))
+{
+ if (events.length () == 0)
+ {
+ // ACE_DEBUG ((EC_FORMAT (DEBUG,
+ // "Nothing to multicast: "
+ // "0-length EventSet.")));
+ return;
+ }
+
+ // Send each event in a separate message.
+ // @@ TODO It is interesting to group events destined to the
+ // same mcast group in a single message.
+ for (u_int i = 0; i < events.length (); ++i)
+ {
+ // To avoid loops we keep a TTL field on the events and skip the
+ // events with TTL <= 0
+ if (events[i].header.ttl <= 0)
+ continue;
+
+ const RtecEventComm::Event& e = events[i];
+
+ // We need to modify the TTL field, but copying the entire event
+ // would be wasteful; instead we create a new header and only
+ // modify the header portion.
+ RtecEventComm::EventHeader header = e.header;
+ header.ttl--;
+
+ // Start building the message
+ TAO_OutputCDR cdr;
+
+ // Marshal as if it was a sequence of one element, notice how we
+ // marshal a modified version of the header, but the payload is
+ // marshal without any extra copies.
+ cdr.write_ulong (1);
+ if (!(cdr << header)
+ || !(cdr << e.data))
+ ACE_THROW (CORBA::MARSHAL ());
+
+ // Grab the right mcast group for this event...
+ RtecUDPAdmin::UDP_Addr udp_addr;
+ this->addr_server_->get_addr (header, udp_addr ACE_ENV_ARG_PARAMETER);
+ ACE_CHECK;
+
+ ACE_INET_Addr inet_addr (udp_addr.port,
+ udp_addr.ipaddr);
+
+ this->cdr_sender_.send_message (cdr, inet_addr ACE_ENV_ARG_PARAMETER);
+ ACE_CHECK;
+ }
+}
+
+TAO_END_VERSIONED_NAMESPACE_DECL
diff --git a/TAO/orbsvcs/orbsvcs/Event/ECG_UDP_Sender.h b/TAO/orbsvcs/orbsvcs/Event/ECG_UDP_Sender.h
new file mode 100644
index 00000000000..6210db74d1d
--- /dev/null
+++ b/TAO/orbsvcs/orbsvcs/Event/ECG_UDP_Sender.h
@@ -0,0 +1,230 @@
+// -*- C++ -*-
+
+/**
+ * @file ECG_UDP_Sender.h
+ *
+ * $Id$
+ *
+ * @author Carlos O'Ryan (coryan@cs.wustl.edu)
+ * @author Marina Spivak (marina@atdesk.com)
+ *
+ * Based on previous work by Tim Harrison (harrison@cs.wustl.edu) and
+ * other members of the DOC group. More details can be found in:
+ *
+ * http://doc.ece.uci.edu/~coryan/EC/index.html
+ *
+ * Define helper classes to propagate events between ECs using
+ * either UDP or multicast.
+ * The architecture is a bit complicated and deserves some
+ * explanation: sending the events over UDP (or mcast) is easy, a
+ * Consumer (TAO_ECG_UDP_Sender) subscribes for a certain set of
+ * events, its push() method marshalls the event set into a CDR
+ * stream that is sent using an ACE_SOCK_Dgram. The subscription
+ * set and IP address can be configured.
+ * Another helper class (TAO_ECG_UDP_Receiver) acts as a supplier of
+ * events; it receives a callback when an event is available on an
+ * ACE_SOCK_Dgram, it demarshalls the event and pushes it to the
+ * EC. Two ACE_Event_Handler classes are provided that can forward
+ * the events to this Supplier: TAO_ECG_Mcast_EH can receive events
+ * from a multicast group; TAO_ECG_UDP_EH can receive events from a
+ * regular UDP socket.
+ *
+ * @todo The class makes an extra copy of the events, we need to
+ * investigate if closer collaboration with its collocated EC could
+ * be used to remove that copy.
+ *
+ */
+
+#ifndef TAO_ECG_UDP_SENDER_H
+#define TAO_ECG_UDP_SENDER_H
+#include /**/ "ace/pre.h"
+
+#include "orbsvcs/RtecUDPAdminS.h"
+
+#if !defined (ACE_LACKS_PRAGMA_ONCE)
+# pragma once
+#endif /* ACE_LACKS_PRAGMA_ONCE */
+
+#include /**/ "orbsvcs/Event/event_serv_export.h"
+#include "orbsvcs/RtecEventChannelAdminS.h"
+
+#include "orbsvcs/Event/EC_Lifetime_Utils.h"
+#include "orbsvcs/Event/EC_Lifetime_Utils_T.h"
+#include "orbsvcs/Event/ECG_CDR_Message_Sender.h"
+
+ACE_BEGIN_VERSIONED_NAMESPACE_DECL
+class ACE_SOCK_Dgram;
+ACE_END_VERSIONED_NAMESPACE_DECL
+
+TAO_BEGIN_VERSIONED_NAMESPACE_DECL
+
+class TAO_ECG_UDP_Out_Endpoint;
+
+/**
+ * @class TAO_ECG_UDP_Sender_Disconnect_Command
+ *
+ * @brief Disconnects consumer represented by @a proxy from the Event Channel.
+ *
+ * Utility class for use as a template argument to TAO_EC_Auto_Command.
+ * TAO_EC_Auto_Command<TAO_ECG_UDP_Sender_Disconnect_Command> manages
+ * consumer connection to the Event Channel, automatically disconnecting from
+ * @a proxy in its destructor, if necessary.
+ */
+class TAO_RTEvent_Serv_Export TAO_ECG_UDP_Sender_Disconnect_Command
+{
+public:
+ TAO_ECG_UDP_Sender_Disconnect_Command (void);
+ TAO_ECG_UDP_Sender_Disconnect_Command (
+ RtecEventChannelAdmin::ProxyPushSupplier_ptr proxy);
+
+ TAO_ECG_UDP_Sender_Disconnect_Command (
+ const TAO_ECG_UDP_Sender_Disconnect_Command & rhs);
+
+ TAO_ECG_UDP_Sender_Disconnect_Command &
+ operator= (const TAO_ECG_UDP_Sender_Disconnect_Command & rhs);
+
+ void execute (ACE_ENV_SINGLE_ARG_DECL);
+
+private:
+
+ RtecEventChannelAdmin::ProxyPushSupplier_var proxy_;
+};
+
+
+/**
+ * @class TAO_ECG_UDP_Sender
+ *
+ * @brief Send events received from a "local" EC using UDP.
+ * NOT THREAD-SAFE.
+ * This class connect as a consumer to an EventChannel
+ * and forwards the events it receives from that EC using UDP.
+ *
+ */
+class TAO_RTEvent_Serv_Export TAO_ECG_UDP_Sender :
+ public virtual POA_RtecEventComm::PushConsumer,
+ public TAO_EC_Deactivated_Object
+{
+public:
+
+ /// Initialization and termination methods.
+ //@{
+
+ /// Create a new TAO_ECG_UDP_Sender object.
+ /// (Constructor access is restricted to insure that all
+ /// TAO_ECG_UDP_Sender objects are heap-allocated.)
+ static TAO_EC_Servant_Var<TAO_ECG_UDP_Sender> create (CORBA::Boolean crc = 0);
+
+ ~TAO_ECG_UDP_Sender (void);
+
+ /**
+ * @param lcl_ec Event Channel to which we will act as a consumer of events.
+ * @param addr_server Address server used to obtain event type to
+ * multicast group mapping.
+ * @param endpoint_rptr Endpoint for sending udp/multicast messages.
+ * Endpoint's dgram must be open!
+ *
+ * To insure proper resource clean up, if init () is successful,
+ * shutdown () must be called when the sender is no longer needed.
+ * This is done by disconnect_push_consumer() method. If
+ * disconnect_push_consumer() will not be called, it is the
+ * responsibility of the user.
+ * Furthermore, if shutdown() is not explicitly called by
+ * either disconnect_push_consumer () or the user, the sender
+ * will clean up the resources in its destructor, however, certain
+ * entities involved in cleanup must still exist at that point,
+ * e.g., POA.
+ */
+ void init (RtecEventChannelAdmin::EventChannel_ptr lcl_ec,
+ RtecUDPAdmin::AddrServer_ptr addr_server,
+ TAO_ECG_Refcounted_Endpoint endpoint_rptr
+ ACE_ENV_ARG_DECL);
+
+ /// Connect or reconnect to the EC with the given subscriptions.
+ /**
+ * NOTE: if we are already connected to EC and a reconnection is
+ * necessary, the EC must have reconnects enabled in order for this
+ * method to succeed.
+ */
+ void connect (const RtecEventChannelAdmin::ConsumerQOS &sub
+ ACE_ENV_ARG_DECL);
+
+ /// Deactivate from POA and disconnect from EC, if necessary. Shut
+ /// down all sender components.
+ /**
+ * Calling this method may result in decrementing of the reference
+ * count (due to deactivation) and deletion of the object.
+ */
+ void shutdown (ACE_ENV_SINGLE_ARG_DECL);
+ //@}
+
+ /// Accessors.
+ //@{
+ /**
+ * The sender may need to fragment the message, otherwise the
+ * network may drop the packets.
+ * Setting the MTU can fail if the value is too small (at least the
+ * header + 8 bytes must fit).
+ */
+ int mtu (CORBA::ULong mtu);
+ CORBA::ULong mtu (void) const;
+
+ /// Get the local endpoint used to send the events.
+ int get_local_addr (ACE_INET_Addr& addr);
+ //@}
+
+ /// The PushConsumer methods.
+ //@{
+ /// Invokes shutdown (), which may result in the object being deleted, if
+ /// refcounting is used to manage its lifetime.
+ virtual void disconnect_push_consumer (ACE_ENV_SINGLE_ARG_DECL)
+ ACE_THROW_SPEC ((CORBA::SystemException));
+ virtual void push (const RtecEventComm::EventSet &events
+ ACE_ENV_ARG_DECL)
+ ACE_THROW_SPEC ((CORBA::SystemException));
+ //@}
+
+protected:
+
+ /// Constructor (protected). Clients can create new
+ /// TAO_ECG_UDP_Sender objects using the static create() method.
+ TAO_ECG_UDP_Sender (CORBA::Boolean crc = 0);
+
+private:
+
+ /// Helpers for the connect() method.
+ //@{
+ // Establishes connection to the Event Channel for the first time.
+ void new_connect (const RtecEventChannelAdmin::ConsumerQOS& sub
+ ACE_ENV_ARG_DECL);
+
+ // Updates existing connection to the Event Channel.
+ void reconnect (const RtecEventChannelAdmin::ConsumerQOS& sub
+ ACE_ENV_ARG_DECL);
+ //@}
+
+ /// Proxy used to receive events from the Event Channel.
+ RtecEventChannelAdmin::ProxyPushSupplier_var supplier_proxy_;
+
+ /// Event Channel to which we act as a consumer.
+ RtecEventChannelAdmin::EventChannel_var lcl_ec_;
+
+ /// We query this object to determine where the events should be sent.
+ RtecUDPAdmin::AddrServer_var addr_server_;
+
+ /// Helper for fragmenting and sending cdr-encoded events using udp.
+ TAO_ECG_CDR_Message_Sender cdr_sender_;
+
+ typedef TAO_EC_Auto_Command<TAO_ECG_UDP_Sender_Disconnect_Command>
+ ECG_Sender_Auto_Proxy_Disconnect;
+ /// Manages our connection to Supplier Proxy.
+ ECG_Sender_Auto_Proxy_Disconnect auto_proxy_disconnect_;
+};
+
+TAO_END_VERSIONED_NAMESPACE_DECL
+
+#if defined(__ACE_INLINE__)
+#include "orbsvcs/Event/ECG_UDP_Sender.inl"
+#endif /* __ACE_INLINE__ */
+
+#include /**/ "ace/post.h"
+#endif /* TAO_ECG_UDP_SENDER_H */
diff --git a/TAO/orbsvcs/orbsvcs/Event/ECG_UDP_Sender.inl b/TAO/orbsvcs/orbsvcs/Event/ECG_UDP_Sender.inl
new file mode 100644
index 00000000000..c58a7a81ca8
--- /dev/null
+++ b/TAO/orbsvcs/orbsvcs/Event/ECG_UDP_Sender.inl
@@ -0,0 +1,96 @@
+// -*- C++ -*-
+//
+// $Id$
+
+#include "ace/Null_Mutex.h"
+
+TAO_BEGIN_VERSIONED_NAMESPACE_DECL
+
+ACE_INLINE TAO_EC_Servant_Var<TAO_ECG_UDP_Sender>
+TAO_ECG_UDP_Sender::create (CORBA::Boolean crc)
+{
+ TAO_EC_Servant_Var<TAO_ECG_UDP_Sender> s;
+ ACE_NEW_RETURN (s,
+ TAO_ECG_UDP_Sender (crc),
+ s);
+ return s;
+}
+
+ACE_INLINE
+TAO_ECG_UDP_Sender::TAO_ECG_UDP_Sender (CORBA::Boolean crc)
+ : supplier_proxy_ ()
+ , lcl_ec_ ()
+ , addr_server_ ()
+ , cdr_sender_ (crc)
+ , auto_proxy_disconnect_ ()
+{
+}
+
+ACE_INLINE CORBA::ULong
+TAO_ECG_UDP_Sender::mtu (void) const
+{
+ return this->cdr_sender_.mtu ();
+}
+
+ACE_INLINE int
+TAO_ECG_UDP_Sender::mtu (CORBA::ULong new_mtu)
+{
+ return this->cdr_sender_.mtu (new_mtu);
+}
+
+ACE_INLINE int
+TAO_ECG_UDP_Sender::get_local_addr (ACE_INET_Addr& addr)
+{
+ return this->cdr_sender_.get_local_addr (addr);
+}
+//***************************************************************************
+
+ACE_INLINE
+TAO_ECG_UDP_Sender_Disconnect_Command::
+TAO_ECG_UDP_Sender_Disconnect_Command (void)
+ : proxy_ ()
+{
+}
+
+ACE_INLINE
+TAO_ECG_UDP_Sender_Disconnect_Command::
+TAO_ECG_UDP_Sender_Disconnect_Command (
+ RtecEventChannelAdmin::ProxyPushSupplier_ptr proxy)
+ : proxy_ (RtecEventChannelAdmin::ProxyPushSupplier::_duplicate (proxy))
+{
+}
+
+ACE_INLINE
+TAO_ECG_UDP_Sender_Disconnect_Command::
+TAO_ECG_UDP_Sender_Disconnect_Command (
+ const TAO_ECG_UDP_Sender_Disconnect_Command & rhs)
+ : proxy_ (RtecEventChannelAdmin::ProxyPushSupplier::_duplicate
+ (rhs.proxy_.in ()))
+{
+}
+
+ACE_INLINE TAO_ECG_UDP_Sender_Disconnect_Command &
+TAO_ECG_UDP_Sender_Disconnect_Command::operator= (
+ const TAO_ECG_UDP_Sender_Disconnect_Command & rhs)
+{
+ this->proxy_ =
+ RtecEventChannelAdmin::ProxyPushSupplier::_duplicate (rhs.proxy_.in ());
+
+ return *this;
+}
+
+ACE_INLINE void
+TAO_ECG_UDP_Sender_Disconnect_Command::execute (ACE_ENV_SINGLE_ARG_DECL)
+{
+ if (CORBA::is_nil (this->proxy_.in ()))
+ // We are not connected.
+ return;
+
+ RtecEventChannelAdmin::ProxyPushSupplier_var release_proxy =
+ this->proxy_._retn ();
+
+ release_proxy->disconnect_push_supplier (ACE_ENV_SINGLE_ARG_PARAMETER);
+ ACE_CHECK;
+}
+
+TAO_END_VERSIONED_NAMESPACE_DECL
diff --git a/TAO/orbsvcs/orbsvcs/Event/EC_And_Filter.cpp b/TAO/orbsvcs/orbsvcs/Event/EC_And_Filter.cpp
new file mode 100644
index 00000000000..715979d31a9
--- /dev/null
+++ b/TAO/orbsvcs/orbsvcs/Event/EC_And_Filter.cpp
@@ -0,0 +1,170 @@
+// $Id$
+
+#include "orbsvcs/Event/EC_And_Filter.h"
+
+ACE_RCSID(Event, EC_And_Filter, "$Id$")
+
+TAO_BEGIN_VERSIONED_NAMESPACE_DECL
+
+TAO_EC_And_Filter::TAO_EC_And_Filter (TAO_EC_Filter* children[],
+ size_t n)
+ : children_ (children),
+ n_ (n)
+{
+ ChildrenIterator end = this->end ();
+ for (ChildrenIterator i = this->begin ();
+ i != end;
+ ++i)
+ {
+ this->adopt_child (*i);
+ }
+}
+
+TAO_EC_And_Filter::~TAO_EC_And_Filter (void)
+{
+ TAO_EC_Filter** end = this->children_ + this->n_;
+ for (TAO_EC_Filter** i = this->children_;
+ i != end;
+ ++i)
+ {
+ delete *i;
+ *i = 0;
+ }
+ delete[] this->children_;
+ this->children_ = 0;
+ this->n_ = 0;
+}
+
+TAO_EC_Filter::ChildrenIterator
+TAO_EC_And_Filter::begin (void) const
+{
+ return this->children_;
+}
+
+TAO_EC_Filter::ChildrenIterator
+TAO_EC_And_Filter::end (void) const
+{
+ return this->children_ + this->n_;
+}
+
+int
+TAO_EC_And_Filter::size (void) const
+{
+ return static_cast<CORBA::ULong> (this->n_);
+}
+
+int
+TAO_EC_And_Filter::filter (const RtecEventComm::EventSet& event,
+ TAO_EC_QOS_Info& qos_info
+ ACE_ENV_ARG_DECL)
+{
+ ChildrenIterator end = this->end ();
+ for (ChildrenIterator i = this->begin (); i != end; ++i)
+ {
+ int n = (*i)->filter (event, qos_info ACE_ENV_ARG_PARAMETER);
+ ACE_CHECK_RETURN (0);
+ if (n == 0)
+ return 0;
+ }
+
+ // All children accepted the event, push up...
+ if (this->parent () != 0)
+ {
+ this->parent ()->push (event, qos_info ACE_ENV_ARG_PARAMETER);
+ ACE_CHECK_RETURN (0);
+ }
+
+ return 1;
+}
+
+int
+TAO_EC_And_Filter::filter_nocopy (RtecEventComm::EventSet& event,
+ TAO_EC_QOS_Info& qos_info
+ ACE_ENV_ARG_DECL)
+{
+ ChildrenIterator end = this->end ();
+ for (ChildrenIterator i = this->begin (); i != end; ++i)
+ {
+ int n = (*i)->filter_nocopy (event, qos_info ACE_ENV_ARG_PARAMETER);
+ ACE_CHECK_RETURN (0);
+ if (n == 0)
+ return 0;
+ }
+
+ // All children accepted the event, push up...
+ if (this->parent () != 0)
+ {
+ this->parent ()->push (event, qos_info ACE_ENV_ARG_PARAMETER);
+ ACE_CHECK_RETURN (0);
+ }
+
+ return 1;
+}
+
+void
+TAO_EC_And_Filter::push (const RtecEventComm::EventSet&,
+ TAO_EC_QOS_Info&
+ ACE_ENV_ARG_DECL_NOT_USED)
+{
+}
+
+void
+TAO_EC_And_Filter::push_nocopy (RtecEventComm::EventSet&,
+ TAO_EC_QOS_Info&
+ ACE_ENV_ARG_DECL_NOT_USED)
+{
+}
+
+void
+TAO_EC_And_Filter::clear (void)
+{
+ ChildrenIterator end = this->end ();
+ for (ChildrenIterator i = this->begin ();
+ i != end;
+ ++i)
+ {
+ (*i)->clear ();
+ }
+}
+
+CORBA::ULong
+TAO_EC_And_Filter::max_event_size (void) const
+{
+ CORBA::ULong n = 0;
+ ChildrenIterator end = this->end ();
+ for (ChildrenIterator i = this->begin ();
+ i != end;
+ ++i)
+ {
+ CORBA::ULong c = (*i)->max_event_size ();
+ if (n < c)
+ n = c;
+ }
+ return n;
+}
+
+int
+TAO_EC_And_Filter::can_match (
+ const RtecEventComm::EventHeader& header) const
+{
+ ChildrenIterator end = this->end ();
+ for (ChildrenIterator i = this->begin ();
+ i != end;
+ ++i)
+ {
+ if ((*i)->can_match (header) == 0)
+ return 0;
+ }
+ return 1;
+}
+
+int
+TAO_EC_And_Filter::add_dependencies (
+ const RtecEventComm::EventHeader&,
+ const TAO_EC_QOS_Info&
+ ACE_ENV_ARG_DECL_NOT_USED)
+{
+ return 0;
+}
+
+TAO_END_VERSIONED_NAMESPACE_DECL
diff --git a/TAO/orbsvcs/orbsvcs/Event/EC_And_Filter.h b/TAO/orbsvcs/orbsvcs/Event/EC_And_Filter.h
new file mode 100644
index 00000000000..67c9614af70
--- /dev/null
+++ b/TAO/orbsvcs/orbsvcs/Event/EC_And_Filter.h
@@ -0,0 +1,89 @@
+// -*- C++ -*-
+
+/**
+ * @file EC_And_Filter.h
+ *
+ * $Id$
+ *
+ * @author Carlos O'Ryan (coryan@cs.wustl.edu)
+ *
+ * Based on previous work by Tim Harrison (harrison@cs.wustl.edu) and
+ * other members of the DOC group. More details can be found in:
+ *
+ * http://doc.ece.uci.edu/~coryan/EC/index.html
+ */
+
+#ifndef TAO_EC_AND_FILTER_H
+#define TAO_EC_AND_FILTER_H
+#include /**/ "ace/pre.h"
+
+#include "orbsvcs/Event/EC_Filter.h"
+
+#if !defined (ACE_LACKS_PRAGMA_ONCE)
+# pragma once
+#endif /* ACE_LACKS_PRAGMA_ONCE */
+
+TAO_BEGIN_VERSIONED_NAMESPACE_DECL
+
+/**
+ * @class TAO_EC_And_Filter
+ *
+ * @brief The 'logical and' filter.
+ *
+ * This filter has a set of children (fixed at creation time),
+ * only if all the children accept an event it does so too.
+ *
+ * <H2>Memory Management</H2>
+ * It assumes ownership of the children.
+ */
+class TAO_RTEvent_Serv_Export TAO_EC_And_Filter : public TAO_EC_Filter
+{
+public:
+ /// Constructor. It assumes ownership of both the array and the
+ /// children.
+ TAO_EC_And_Filter (TAO_EC_Filter* children[],
+ size_t n);
+
+ /// Destructor
+ virtual ~TAO_EC_And_Filter (void);
+
+ // = The TAO_EC_Filter methods, please check the documentation in
+ // TAO_EC_Filter.
+ virtual ChildrenIterator begin (void) const;
+ virtual ChildrenIterator end (void) const;
+ virtual int size (void) const;
+ virtual int filter (const RtecEventComm::EventSet& event,
+ TAO_EC_QOS_Info& qos_info
+ ACE_ENV_ARG_DECL);
+ virtual int filter_nocopy (RtecEventComm::EventSet& event,
+ TAO_EC_QOS_Info& qos_info
+ ACE_ENV_ARG_DECL);
+ virtual void push (const RtecEventComm::EventSet& event,
+ TAO_EC_QOS_Info& qos_info
+ ACE_ENV_ARG_DECL);
+ virtual void push_nocopy (RtecEventComm::EventSet& event,
+ TAO_EC_QOS_Info& qos_info
+ ACE_ENV_ARG_DECL);
+ virtual void clear (void);
+ virtual CORBA::ULong max_event_size (void) const;
+ virtual int can_match (const RtecEventComm::EventHeader& header) const;
+ virtual int add_dependencies (const RtecEventComm::EventHeader& header,
+ const TAO_EC_QOS_Info &qos_info
+ ACE_ENV_ARG_DECL);
+
+private:
+ TAO_EC_And_Filter (const TAO_EC_And_Filter&);
+ TAO_EC_And_Filter& operator= (const TAO_EC_And_Filter&);
+
+private:
+ /// The children
+ TAO_EC_Filter** children_;
+
+ /// The number of children.
+ size_t n_;
+};
+
+TAO_END_VERSIONED_NAMESPACE_DECL
+
+#include /**/ "ace/post.h"
+#endif /* TAO_EC_AND_FILTER_H */
diff --git a/TAO/orbsvcs/orbsvcs/Event/EC_Basic_Factory.cpp b/TAO/orbsvcs/orbsvcs/Event/EC_Basic_Factory.cpp
new file mode 100644
index 00000000000..e9bc5dcb730
--- /dev/null
+++ b/TAO/orbsvcs/orbsvcs/Event/EC_Basic_Factory.cpp
@@ -0,0 +1,262 @@
+// $Id$
+
+#include "orbsvcs/Event/EC_Basic_Factory.h"
+#include "orbsvcs/Event/EC_Reactive_Dispatching.h"
+#include "orbsvcs/Event/EC_Basic_Filter_Builder.h"
+#include "orbsvcs/Event/EC_Trivial_Supplier_Filter.h"
+#include "orbsvcs/Event/EC_ConsumerAdmin.h"
+#include "orbsvcs/Event/EC_SupplierAdmin.h"
+#include "orbsvcs/Event/EC_Default_ProxyConsumer.h"
+#include "orbsvcs/Event/EC_Default_ProxySupplier.h"
+#include "orbsvcs/Event/EC_ObserverStrategy.h"
+#include "orbsvcs/Event/EC_Null_Scheduling.h"
+#include "orbsvcs/Event/EC_Reactive_Timeout_Generator.h"
+#include "orbsvcs/Event/EC_Reactive_ConsumerControl.h"
+#include "orbsvcs/Event/EC_Reactive_SupplierControl.h"
+#include "orbsvcs/Event/EC_Event_Channel_Base.h" // @@ MSVC 6 bug
+
+#include "orbsvcs/ESF/ESF_Proxy_List.h"
+#include "orbsvcs/ESF/ESF_Delayed_Changes.h"
+
+#include "tao/ORB_Core.h"
+
+ACE_RCSID (Event,
+ EC_Basic_Factory,
+ "$Id$")
+
+TAO_BEGIN_VERSIONED_NAMESPACE_DECL
+
+TAO_EC_Basic_Factory::TAO_EC_Basic_Factory (void)
+{
+}
+
+TAO_EC_Basic_Factory::~TAO_EC_Basic_Factory (void)
+{
+}
+
+TAO_EC_Dispatching*
+TAO_EC_Basic_Factory::create_dispatching (TAO_EC_Event_Channel_Base *)
+{
+ return new TAO_EC_Reactive_Dispatching ();
+}
+
+void
+TAO_EC_Basic_Factory::destroy_dispatching (TAO_EC_Dispatching *x)
+{
+ delete x;
+}
+
+TAO_EC_Filter_Builder*
+TAO_EC_Basic_Factory::create_filter_builder (TAO_EC_Event_Channel_Base *ec)
+{
+ return new TAO_EC_Basic_Filter_Builder (ec);
+}
+
+void
+TAO_EC_Basic_Factory::destroy_filter_builder (TAO_EC_Filter_Builder *x)
+{
+ delete x;
+}
+
+TAO_EC_Supplier_Filter_Builder*
+TAO_EC_Basic_Factory::create_supplier_filter_builder (TAO_EC_Event_Channel_Base *ec)
+{
+ return new TAO_EC_Trivial_Supplier_Filter_Builder (ec);
+}
+
+void
+TAO_EC_Basic_Factory::destroy_supplier_filter_builder (TAO_EC_Supplier_Filter_Builder *x)
+{
+ delete x;
+}
+
+TAO_EC_ConsumerAdmin*
+TAO_EC_Basic_Factory::create_consumer_admin (TAO_EC_Event_Channel_Base *ec)
+{
+ return new TAO_EC_ConsumerAdmin (ec);
+}
+
+void
+TAO_EC_Basic_Factory::destroy_consumer_admin (TAO_EC_ConsumerAdmin *x)
+{
+ delete x;
+}
+
+TAO_EC_SupplierAdmin*
+TAO_EC_Basic_Factory::create_supplier_admin (TAO_EC_Event_Channel_Base *ec)
+{
+ return new TAO_EC_SupplierAdmin (ec);
+}
+
+void
+TAO_EC_Basic_Factory::destroy_supplier_admin (TAO_EC_SupplierAdmin *x)
+{
+ delete x;
+}
+
+TAO_EC_ProxyPushSupplier*
+TAO_EC_Basic_Factory::create_proxy_push_supplier (TAO_EC_Event_Channel_Base *ec)
+{
+ return new TAO_EC_Default_ProxyPushSupplier (ec, TAO_EC_DEFAULT_CONSUMER_VALIDATE_CONNECTION);
+}
+
+void
+TAO_EC_Basic_Factory::destroy_proxy_push_supplier (TAO_EC_ProxyPushSupplier *x)
+{
+ delete x;
+}
+
+TAO_EC_ProxyPushConsumer*
+TAO_EC_Basic_Factory::create_proxy_push_consumer (TAO_EC_Event_Channel_Base *ec)
+{
+ return new TAO_EC_Default_ProxyPushConsumer (ec);
+}
+
+void
+TAO_EC_Basic_Factory::destroy_proxy_push_consumer (TAO_EC_ProxyPushConsumer *x)
+{
+ delete x;
+}
+
+TAO_EC_Timeout_Generator*
+TAO_EC_Basic_Factory::create_timeout_generator (TAO_EC_Event_Channel_Base *)
+{
+ int argc = 0;
+ char **argv = 0;
+ CORBA::ORB_var orb =
+ CORBA::ORB_init (argc, argv, "");
+ ACE_Reactor *reactor = orb->orb_core ()->reactor ();
+ return new TAO_EC_Reactive_Timeout_Generator (reactor);
+}
+
+void
+TAO_EC_Basic_Factory::destroy_timeout_generator (TAO_EC_Timeout_Generator *x)
+{
+ delete x;
+}
+
+TAO_EC_ObserverStrategy*
+TAO_EC_Basic_Factory::create_observer_strategy (TAO_EC_Event_Channel_Base *ec)
+{
+ ACE_Lock* lock;
+ ACE_NEW_RETURN (lock, ACE_Lock_Adapter<TAO_SYNCH_MUTEX>, 0);
+ return new TAO_EC_Basic_ObserverStrategy (ec, lock);
+}
+
+void
+TAO_EC_Basic_Factory::destroy_observer_strategy (TAO_EC_ObserverStrategy *x)
+{
+ delete x;
+}
+
+TAO_EC_Scheduling_Strategy*
+TAO_EC_Basic_Factory::create_scheduling_strategy (TAO_EC_Event_Channel_Base*)
+{
+ return new TAO_EC_Null_Scheduling;
+}
+
+void
+TAO_EC_Basic_Factory::destroy_scheduling_strategy (TAO_EC_Scheduling_Strategy* x)
+{
+ delete x;
+}
+
+TAO_EC_ProxyPushConsumer_Collection*
+TAO_EC_Basic_Factory::create_proxy_push_consumer_collection (TAO_EC_Event_Channel_Base *)
+{
+ // This typedef is a workaround for a SunCC 4.2 bug
+ typedef TAO_ESF_Proxy_List<TAO_EC_ProxyPushConsumer>::Iterator TAO_EC_Consumer_List_Iterator;
+ return new TAO_ESF_Delayed_Changes<TAO_EC_ProxyPushConsumer,
+ TAO_ESF_Proxy_List<TAO_EC_ProxyPushConsumer>,
+ TAO_ESF_Proxy_List<TAO_EC_ProxyPushConsumer>::Iterator,
+ ACE_SYNCH> ();
+}
+
+void
+TAO_EC_Basic_Factory::destroy_proxy_push_consumer_collection (TAO_EC_ProxyPushConsumer_Collection *x)
+{
+ delete x;
+}
+
+TAO_EC_ProxyPushSupplier_Collection*
+TAO_EC_Basic_Factory::create_proxy_push_supplier_collection (TAO_EC_Event_Channel_Base *)
+{
+ // This typedef is a workaround for a SunCC 4.2 bug
+ typedef TAO_ESF_Proxy_List<TAO_EC_ProxyPushSupplier>::Iterator TAO_EC_Supplier_List_Iterator;
+ return new TAO_ESF_Delayed_Changes<TAO_EC_ProxyPushSupplier,
+ TAO_ESF_Proxy_List<TAO_EC_ProxyPushSupplier>,
+ TAO_ESF_Proxy_List<TAO_EC_ProxyPushSupplier>::Iterator,
+ ACE_SYNCH> ();
+}
+
+void
+TAO_EC_Basic_Factory::destroy_proxy_push_supplier_collection (TAO_EC_ProxyPushSupplier_Collection *x)
+{
+ delete x;
+}
+
+ACE_Lock*
+TAO_EC_Basic_Factory::create_consumer_lock (void)
+{
+ return new ACE_Lock_Adapter<TAO_SYNCH_MUTEX> ();
+}
+
+void
+TAO_EC_Basic_Factory::destroy_consumer_lock (ACE_Lock* x)
+{
+ delete x;
+}
+
+ACE_Lock*
+TAO_EC_Basic_Factory::create_supplier_lock (void)
+{
+ return new ACE_Lock_Adapter<TAO_SYNCH_RECURSIVE_MUTEX> ();
+}
+
+void
+TAO_EC_Basic_Factory::destroy_supplier_lock (ACE_Lock* x)
+{
+ delete x;
+}
+
+TAO_EC_ConsumerControl*
+TAO_EC_Basic_Factory::create_consumer_control (TAO_EC_Event_Channel_Base* ec)
+{
+ int argc = 0;
+ char **argv = 0;
+ CORBA::ORB_var orb =
+ CORBA::ORB_init (argc, argv, "");
+ // Hard-coded rate to 10 times a second
+ ACE_Time_Value rate (0, 100000);
+ // Hard-coded polling-timeout to 10 msec
+ ACE_Time_Value timeout (0, TAO_EC_DEFAULT_CONSUMER_CONTROL_TIMEOUT);
+ return new TAO_EC_Reactive_ConsumerControl (rate, timeout, ec, orb.in ());
+}
+
+void
+TAO_EC_Basic_Factory::destroy_consumer_control (TAO_EC_ConsumerControl* x)
+{
+ delete x;
+}
+
+TAO_EC_SupplierControl*
+TAO_EC_Basic_Factory::create_supplier_control (TAO_EC_Event_Channel_Base* ec)
+{
+ int argc = 0;
+ char **argv = 0;
+ CORBA::ORB_var orb =
+ CORBA::ORB_init (argc, argv, "");
+ // Hard-coded rate to 10 times a second
+ ACE_Time_Value rate (0, 100000);
+ // Hard-coded polling-timeout to 10 msec
+ ACE_Time_Value timeout (0, TAO_EC_DEFAULT_SUPPLIER_CONTROL_TIMEOUT);
+ return new TAO_EC_Reactive_SupplierControl (rate, timeout, ec, orb.in ());
+}
+
+void
+TAO_EC_Basic_Factory::destroy_supplier_control (TAO_EC_SupplierControl* x)
+{
+ delete x;
+}
+
+TAO_END_VERSIONED_NAMESPACE_DECL
diff --git a/TAO/orbsvcs/orbsvcs/Event/EC_Basic_Factory.h b/TAO/orbsvcs/orbsvcs/Event/EC_Basic_Factory.h
new file mode 100644
index 00000000000..aa942b26492
--- /dev/null
+++ b/TAO/orbsvcs/orbsvcs/Event/EC_Basic_Factory.h
@@ -0,0 +1,120 @@
+// -*- C++ -*-
+
+/**
+ * @file EC_Basic_Factory.h
+ *
+ * $Id$
+ *
+ * @author Carlos O'Ryan (coryan@cs.wustl.edu)
+ *
+ * Based on previous work by Tim Harrison (harrison@cs.wustl.edu) and
+ * other members of the DOC group. More details can be found in:
+ *
+ * http://doc.ece.uci.edu/~coryan/EC/index.html
+ */
+
+#ifndef TAO_EC_BASIC_FACTORY_H
+#define TAO_EC_BASIC_FACTORY_H
+
+#include /**/ "ace/pre.h"
+
+#include "orbsvcs/Event/EC_Factory.h"
+
+#if !defined (ACE_LACKS_PRAGMA_ONCE)
+# pragma once
+#endif /* ACE_LACKS_PRAGMA_ONCE */
+
+TAO_BEGIN_VERSIONED_NAMESPACE_DECL
+
+/**
+ * @class TAO_EC_Basic_Factory
+ *
+ * @brief The factory for a simple event channel.
+ *
+ * An slightly more advanced configuration than the
+ * EC_Null_Factory, this class configure an event channel that can
+ * support filtering and correlation. Still dispatching is not
+ * prioritized and all the filtering is done at the consumer level.
+ * A fixed POA is used for servant activation.
+ * This object creates a single instance of the Supplier
+ *
+ */
+class TAO_RTEvent_Serv_Export TAO_EC_Basic_Factory : public TAO_EC_Factory
+{
+public:
+ /// Constructor
+ TAO_EC_Basic_Factory (void);
+
+ /// destructor...
+ virtual ~TAO_EC_Basic_Factory (void);
+
+ // = The EC_Factory methods
+ virtual TAO_EC_Dispatching*
+ create_dispatching (TAO_EC_Event_Channel_Base*);
+ virtual void
+ destroy_dispatching (TAO_EC_Dispatching*);
+ virtual TAO_EC_Filter_Builder*
+ create_filter_builder (TAO_EC_Event_Channel_Base*);
+ virtual void
+ destroy_filter_builder (TAO_EC_Filter_Builder*);
+ virtual TAO_EC_Supplier_Filter_Builder*
+ create_supplier_filter_builder (TAO_EC_Event_Channel_Base*);
+ virtual void
+ destroy_supplier_filter_builder (TAO_EC_Supplier_Filter_Builder*);
+ virtual TAO_EC_ConsumerAdmin*
+ create_consumer_admin (TAO_EC_Event_Channel_Base*);
+ virtual void
+ destroy_consumer_admin (TAO_EC_ConsumerAdmin*);
+ virtual TAO_EC_SupplierAdmin*
+ create_supplier_admin (TAO_EC_Event_Channel_Base*);
+ virtual void
+ destroy_supplier_admin (TAO_EC_SupplierAdmin*);
+ virtual TAO_EC_ProxyPushSupplier*
+ create_proxy_push_supplier (TAO_EC_Event_Channel_Base*);
+ virtual void
+ destroy_proxy_push_supplier (TAO_EC_ProxyPushSupplier*);
+ virtual TAO_EC_ProxyPushConsumer*
+ create_proxy_push_consumer (TAO_EC_Event_Channel_Base*);
+ virtual void
+ destroy_proxy_push_consumer (TAO_EC_ProxyPushConsumer*);
+ virtual TAO_EC_Timeout_Generator*
+ create_timeout_generator (TAO_EC_Event_Channel_Base*);
+ virtual void
+ destroy_timeout_generator (TAO_EC_Timeout_Generator*);
+ virtual TAO_EC_ObserverStrategy*
+ create_observer_strategy (TAO_EC_Event_Channel_Base*);
+ virtual void
+ destroy_observer_strategy (TAO_EC_ObserverStrategy*);
+ virtual TAO_EC_Scheduling_Strategy*
+ create_scheduling_strategy (TAO_EC_Event_Channel_Base*);
+ virtual void
+ destroy_scheduling_strategy (TAO_EC_Scheduling_Strategy*);
+ virtual TAO_EC_ProxyPushConsumer_Collection*
+ create_proxy_push_consumer_collection (TAO_EC_Event_Channel_Base*);
+ virtual void
+ destroy_proxy_push_consumer_collection (TAO_EC_ProxyPushConsumer_Collection*);
+ virtual TAO_EC_ProxyPushSupplier_Collection*
+ create_proxy_push_supplier_collection (TAO_EC_Event_Channel_Base*);
+ virtual void
+ destroy_proxy_push_supplier_collection (TAO_EC_ProxyPushSupplier_Collection*);
+
+ virtual ACE_Lock* create_consumer_lock (void);
+ virtual void destroy_consumer_lock (ACE_Lock*);
+ virtual ACE_Lock* create_supplier_lock (void);
+ virtual void destroy_supplier_lock (ACE_Lock*);
+
+ virtual TAO_EC_ConsumerControl*
+ create_consumer_control (TAO_EC_Event_Channel_Base*);
+ virtual void
+ destroy_consumer_control (TAO_EC_ConsumerControl*);
+ virtual TAO_EC_SupplierControl*
+ create_supplier_control (TAO_EC_Event_Channel_Base*);
+ virtual void
+ destroy_supplier_control (TAO_EC_SupplierControl*);
+};
+
+TAO_END_VERSIONED_NAMESPACE_DECL
+
+#include /**/ "ace/post.h"
+
+#endif /* TAO_EC_BASIC_FACTORY_H */
diff --git a/TAO/orbsvcs/orbsvcs/Event/EC_Basic_Filter_Builder.cpp b/TAO/orbsvcs/orbsvcs/Event/EC_Basic_Filter_Builder.cpp
new file mode 100644
index 00000000000..e8149330316
--- /dev/null
+++ b/TAO/orbsvcs/orbsvcs/Event/EC_Basic_Filter_Builder.cpp
@@ -0,0 +1,203 @@
+// $Id$
+
+#include "orbsvcs/Event_Service_Constants.h"
+#include "orbsvcs/Event/EC_Basic_Filter_Builder.h"
+#include "orbsvcs/Event/EC_Type_Filter.h"
+#include "orbsvcs/Event/EC_Conjunction_Filter.h"
+#include "orbsvcs/Event/EC_Disjunction_Filter.h"
+#include "orbsvcs/Event/EC_And_Filter.h"
+#include "orbsvcs/Event/EC_Negation_Filter.h"
+#include "orbsvcs/Event/EC_Bitmask_Filter.h"
+#include "orbsvcs/Event/EC_Masked_Type_Filter.h"
+#include "orbsvcs/Event/EC_Timeout_Filter.h"
+
+#if ! defined (__ACE_INLINE__)
+#include "orbsvcs/Event/EC_Basic_Filter_Builder.i"
+#endif /* __ACE_INLINE__ */
+
+ACE_RCSID(Event, EC_Basic_Filter_Builder, "$Id$")
+
+
+TAO_BEGIN_VERSIONED_NAMESPACE_DECL
+
+TAO_EC_Basic_Filter_Builder::~TAO_EC_Basic_Filter_Builder (void)
+{
+}
+
+TAO_EC_Filter*
+TAO_EC_Basic_Filter_Builder::build (
+ TAO_EC_ProxyPushSupplier *supplier,
+ RtecEventChannelAdmin::ConsumerQOS& qos
+ ACE_ENV_ARG_DECL_NOT_USED) const
+{
+ CORBA::ULong pos = 0;
+ return this->recursive_build (supplier, qos, pos);
+}
+
+TAO_EC_Filter*
+TAO_EC_Basic_Filter_Builder:: recursive_build (
+ TAO_EC_ProxyPushSupplier *supplier,
+ RtecEventChannelAdmin::ConsumerQOS& qos,
+ CORBA::ULong& pos) const
+{
+ CORBA::ULong l = qos.dependencies.length ();
+ if (pos == l)
+ return 0;
+
+ const RtecEventComm::Event& e = qos.dependencies[pos].event;
+ if (e.header.type == ACE_ES_CONJUNCTION_DESIGNATOR)
+ {
+ pos++; // Consume the designator
+ CORBA::ULong n = this->count_children (qos, pos);
+
+ TAO_EC_Filter** children;
+ ACE_NEW_RETURN (children, TAO_EC_Filter*[n], 0);
+ CORBA::ULong i = 0;
+ for (; i != n; ++i)
+ {
+ children[i] = this->recursive_build (supplier, qos, pos);
+ }
+ return new TAO_EC_Conjunction_Filter (children, n);
+ }
+ else if (e.header.type == ACE_ES_DISJUNCTION_DESIGNATOR)
+ {
+ pos++; // Consume the designator
+ CORBA::ULong n = this->count_children (qos, pos);
+
+ TAO_EC_Filter** children;
+ ACE_NEW_RETURN (children, TAO_EC_Filter*[n], 0);
+ CORBA::ULong i = 0;
+ for (; i != n; ++i)
+ {
+ children[i] = this->recursive_build (supplier, qos, pos);
+ }
+ return new TAO_EC_Disjunction_Filter (children, n);
+ }
+ else if (e.header.type == ACE_ES_LOGICAL_AND_DESIGNATOR)
+ {
+ pos++; // Consume the designator
+ CORBA::ULong n = this->count_children (qos, pos);
+
+ TAO_EC_Filter** children;
+ ACE_NEW_RETURN (children, TAO_EC_Filter*[n], 0);
+ CORBA::ULong i = 0;
+ for (; i != n; ++i)
+ {
+ children[i] = this->recursive_build (supplier, qos, pos);
+ }
+ return new TAO_EC_And_Filter (children, n);
+ }
+ else if (e.header.type == ACE_ES_NEGATION_DESIGNATOR)
+ {
+ pos++; // Consume the designator
+
+ TAO_EC_Filter *child =
+ this->recursive_build (supplier, qos, pos);
+ return new TAO_EC_Negation_Filter (child);
+ }
+ else if (e.header.type == ACE_ES_BITMASK_DESIGNATOR)
+ {
+ pos++; // COnsumer the designator
+
+ if (pos == qos.dependencies.length ())
+ return 0;
+ CORBA::ULong source_mask = qos.dependencies[pos].event.header.source;
+ CORBA::ULong type_mask = qos.dependencies[pos].event.header.type;
+ pos++;
+
+ TAO_EC_Filter *child =
+ this->recursive_build (supplier, qos, pos);
+ return new TAO_EC_Bitmask_Filter (source_mask,
+ type_mask,
+ child);
+ }
+ else if (e.header.type == ACE_ES_MASKED_TYPE_DESIGNATOR)
+ {
+ pos++; // Consume the designator
+
+ if (pos == qos.dependencies.length ())
+ return 0;
+ CORBA::ULong source_mask = qos.dependencies[pos].event.header.source;
+ CORBA::ULong type_mask = qos.dependencies[pos].event.header.type;
+ pos++;
+
+ if (pos == qos.dependencies.length ())
+ return 0;
+ CORBA::ULong source_value = qos.dependencies[pos].event.header.source;
+ CORBA::ULong type_value = qos.dependencies[pos].event.header.type;
+ pos++;
+
+ return new TAO_EC_Masked_Type_Filter (source_mask,
+ type_mask,
+ source_value,
+ type_value);
+ }
+ else if (e.header.type == ACE_ES_NULL_DESIGNATOR)
+ {
+ pos++; // Consume the designator
+
+ return new TAO_EC_Null_Filter ();
+ }
+ else if (e.header.type == ACE_ES_EVENT_TIMEOUT
+ || e.header.type == ACE_ES_EVENT_INTERVAL_TIMEOUT
+ || e.header.type == ACE_ES_EVENT_DEADLINE_TIMEOUT)
+ {
+ pos++; // Consume the designator
+ TAO_EC_QOS_Info qos_info;
+ return new TAO_EC_Timeout_Filter (this->event_channel_,
+ supplier,
+ qos_info,
+ e.header.type,
+ e.header.creation_time);
+ }
+ pos++; // Consume the event
+ return new TAO_EC_Type_Filter (e.header);
+}
+
+CORBA::ULong
+TAO_EC_Basic_Filter_Builder::
+ count_children (RtecEventChannelAdmin::ConsumerQOS& qos,
+ CORBA::ULong pos) const
+{
+ CORBA::ULong l = qos.dependencies.length ();
+ CORBA::ULong i;
+ int count = 0;
+ for (i = pos; i != l; ++i)
+ {
+ const RtecEventComm::Event& e = qos.dependencies[i].event;
+ if (e.header.type == ACE_ES_CONJUNCTION_DESIGNATOR
+ || e.header.type == ACE_ES_DISJUNCTION_DESIGNATOR
+ || e.header.type == ACE_ES_LOGICAL_AND_DESIGNATOR)
+ // We won't let these be nested by the basic filter builder.
+ // Assume these are the end of the group
+ break;
+ else if (e.header.type == ACE_ES_BITMASK_DESIGNATOR)
+ // These take up an extra element
+ i++;
+ else if (e.header.type == ACE_ES_MASKED_TYPE_DESIGNATOR)
+ // These take up two extra elements
+ i += 2;
+ else if (e.header.type == ACE_ES_NEGATION_DESIGNATOR) {
+ // These enclose another filter.
+ // Lets try to figure out how many elements the enclosed
+ // filter takes up (but don't count it in the group).
+ // Only allow basic filter types and bitmasks within
+ // a negation (when it is nested within a group).
+ // This is isn't perfect, but its about the best we can
+ // do without prefixes.
+ i++;
+ switch (qos.dependencies[i].event.header.type) {
+ case ACE_ES_BITMASK_DESIGNATOR:
+ i++;
+ break;
+ case ACE_ES_MASKED_TYPE_DESIGNATOR:
+ i += 2;
+ break;
+ }
+ }
+ count++;
+ }
+ return count;
+}
+
+TAO_END_VERSIONED_NAMESPACE_DECL
diff --git a/TAO/orbsvcs/orbsvcs/Event/EC_Basic_Filter_Builder.h b/TAO/orbsvcs/orbsvcs/Event/EC_Basic_Filter_Builder.h
new file mode 100644
index 00000000000..f6627fc35c5
--- /dev/null
+++ b/TAO/orbsvcs/orbsvcs/Event/EC_Basic_Filter_Builder.h
@@ -0,0 +1,81 @@
+// -*- C++ -*-
+
+/**
+ * @file EC_Basic_Filter_Builder.h
+ *
+ * $Id$
+ *
+ * @author Carlos O'Ryan (coryan@cs.wustl.edu)
+ *
+ * Based on previous work by Tim Harrison (harrison@cs.wustl.edu) and
+ * other members of the DOC group. More details can be found in:
+ *
+ * http://doc.ece.uci.edu/~coryan/EC/index.html
+ */
+
+#ifndef TAO_EC_BASIC_FILTER_BUILDER_H
+#define TAO_EC_BASIC_FILTER_BUILDER_H
+
+#include /**/ "ace/pre.h"
+
+#include "orbsvcs/Event/EC_Filter_Builder.h"
+
+#include /**/ "orbsvcs/Event/event_serv_export.h"
+
+#if !defined (ACE_LACKS_PRAGMA_ONCE)
+# pragma once
+#endif /* ACE_LACKS_PRAGMA_ONCE */
+
+TAO_BEGIN_VERSIONED_NAMESPACE_DECL
+
+class TAO_EC_Filter;
+class TAO_EC_Event_Channel_Base;
+
+/**
+ * @class TAO_EC_Basic_Filter_Builder
+ *
+ * @brief Implement a builder for the fundamental filters.
+ *
+ * The basic filtering mechanisms in the Event channel
+ * (source/type based filtering + disjunctions, conjunctions, logical ands,
+ * negations, and bitmasks) are constructed using this class.
+ */
+class TAO_RTEvent_Serv_Export TAO_EC_Basic_Filter_Builder : public TAO_EC_Filter_Builder
+{
+public:
+ /// constructor.
+ TAO_EC_Basic_Filter_Builder (TAO_EC_Event_Channel_Base* ec);
+
+ /// destructor...
+ virtual ~TAO_EC_Basic_Filter_Builder (void);
+
+ // = The TAO_EC_Filter_Builder methods...
+ TAO_EC_Filter* build (TAO_EC_ProxyPushSupplier *supplier,
+ RtecEventChannelAdmin::ConsumerQOS& qos
+ ACE_ENV_ARG_DECL) const;
+
+private:
+ /// Recursively build the filter tree.
+ TAO_EC_Filter* recursive_build (TAO_EC_ProxyPushSupplier *supplier,
+ RtecEventChannelAdmin::ConsumerQOS& qos,
+ CORBA::ULong& pos) const;
+
+ /// Count the number of children of the current node, i.e. until a
+ /// conjunction, disjunction, logical and, bitmask, or negation occurs.
+ CORBA::ULong count_children (RtecEventChannelAdmin::ConsumerQOS& qos,
+ CORBA::ULong pos) const;
+
+private:
+ /// The event channel.
+ TAO_EC_Event_Channel_Base* event_channel_;
+};
+
+TAO_END_VERSIONED_NAMESPACE_DECL
+
+#if defined (__ACE_INLINE__)
+#include "orbsvcs/Event/EC_Basic_Filter_Builder.i"
+#endif /* __ACE_INLINE__ */
+
+#include /**/ "ace/post.h"
+
+#endif /* TAO_EC_BASIC_FILTER_BUILDER_H */
diff --git a/TAO/orbsvcs/orbsvcs/Event/EC_Basic_Filter_Builder.i b/TAO/orbsvcs/orbsvcs/Event/EC_Basic_Filter_Builder.i
new file mode 100644
index 00000000000..ebf53c20045
--- /dev/null
+++ b/TAO/orbsvcs/orbsvcs/Event/EC_Basic_Filter_Builder.i
@@ -0,0 +1,14 @@
+// -*- C++ -*-
+//
+// $Id$
+
+TAO_BEGIN_VERSIONED_NAMESPACE_DECL
+
+ACE_INLINE
+TAO_EC_Basic_Filter_Builder::
+ TAO_EC_Basic_Filter_Builder (TAO_EC_Event_Channel_Base *ec)
+ : event_channel_ (ec)
+{
+}
+
+TAO_END_VERSIONED_NAMESPACE_DECL
diff --git a/TAO/orbsvcs/orbsvcs/Event/EC_Bitmask_Filter.cpp b/TAO/orbsvcs/orbsvcs/Event/EC_Bitmask_Filter.cpp
new file mode 100644
index 00000000000..7701ba4d1d1
--- /dev/null
+++ b/TAO/orbsvcs/orbsvcs/Event/EC_Bitmask_Filter.cpp
@@ -0,0 +1,122 @@
+// $Id$
+
+#include "orbsvcs/Event/EC_Bitmask_Filter.h"
+
+ACE_RCSID(Event, EC_Bitmask_Filter, "$Id$")
+
+TAO_BEGIN_VERSIONED_NAMESPACE_DECL
+
+TAO_EC_Bitmask_Filter::TAO_EC_Bitmask_Filter (CORBA::ULong source_mask,
+ CORBA::ULong type_mask,
+ TAO_EC_Filter* child)
+ : source_mask_ (source_mask),
+ type_mask_ (type_mask),
+ child_ (child)
+{
+ this->adopt_child (this->child_);
+}
+
+TAO_EC_Bitmask_Filter::~TAO_EC_Bitmask_Filter (void)
+{
+ delete this->child_;
+}
+
+TAO_EC_Filter::ChildrenIterator
+TAO_EC_Bitmask_Filter::begin (void) const
+{
+ return const_cast<TAO_EC_Filter**> (&this->child_);
+}
+
+TAO_EC_Filter::ChildrenIterator
+TAO_EC_Bitmask_Filter::end (void) const
+{
+ return const_cast<TAO_EC_Filter**> (&this->child_) + 1;
+}
+
+int
+TAO_EC_Bitmask_Filter::size (void) const
+{
+ return 1;
+}
+
+int
+TAO_EC_Bitmask_Filter::filter (const RtecEventComm::EventSet& event,
+ TAO_EC_QOS_Info& qos_info
+ ACE_ENV_ARG_DECL)
+{
+ if (event.length () != 1)
+ return 0;
+
+ if ((event[0].header.type & this->type_mask_) == 0
+ || (event[0].header.source & this->source_mask_) == 0)
+ return 0;
+
+ return this->child_->filter (event, qos_info ACE_ENV_ARG_PARAMETER);
+}
+
+int
+TAO_EC_Bitmask_Filter::filter_nocopy (RtecEventComm::EventSet& event,
+ TAO_EC_QOS_Info& qos_info
+ ACE_ENV_ARG_DECL)
+{
+ if (event.length () != 1)
+ return 0;
+
+ if ((event[0].header.type & this->type_mask_) == 0
+ || (event[0].header.source & this->source_mask_) == 0)
+ return 0;
+
+ return this->child_->filter_nocopy (event, qos_info ACE_ENV_ARG_PARAMETER);
+}
+
+void
+TAO_EC_Bitmask_Filter::push (const RtecEventComm::EventSet &event,
+ TAO_EC_QOS_Info &qos_info
+ ACE_ENV_ARG_DECL)
+{
+ if (this->parent () != 0)
+ this->parent ()->push (event, qos_info ACE_ENV_ARG_PARAMETER);
+}
+
+void
+TAO_EC_Bitmask_Filter::push_nocopy (RtecEventComm::EventSet &event,
+ TAO_EC_QOS_Info &qos_info
+ ACE_ENV_ARG_DECL)
+{
+ if (this->parent () != 0)
+ this->parent ()->push_nocopy (event, qos_info ACE_ENV_ARG_PARAMETER);
+}
+
+void
+TAO_EC_Bitmask_Filter::clear (void)
+{
+ this->child_->clear ();
+}
+
+CORBA::ULong
+TAO_EC_Bitmask_Filter::max_event_size (void) const
+{
+ return this->child_->max_event_size ();
+}
+
+int
+TAO_EC_Bitmask_Filter::can_match (
+ const RtecEventComm::EventHeader& header) const
+{
+ if ((header.type & this->type_mask_) == 0
+ || (header.source & this->source_mask_) == 0)
+ return 0;
+
+ return this->child_->can_match (header);
+}
+
+int
+TAO_EC_Bitmask_Filter::add_dependencies (
+ const RtecEventComm::EventHeader&,
+ const TAO_EC_QOS_Info &
+ ACE_ENV_ARG_DECL_NOT_USED)
+{
+ return 0;
+}
+
+TAO_END_VERSIONED_NAMESPACE_DECL
diff --git a/TAO/orbsvcs/orbsvcs/Event/EC_Bitmask_Filter.h b/TAO/orbsvcs/orbsvcs/Event/EC_Bitmask_Filter.h
new file mode 100644
index 00000000000..bc2a3469d00
--- /dev/null
+++ b/TAO/orbsvcs/orbsvcs/Event/EC_Bitmask_Filter.h
@@ -0,0 +1,107 @@
+// -*- C++ -*-
+
+/**
+ * @file EC_Bitmask_Filter.h
+ *
+ * $Id$
+ *
+ * @author Carlos O'Ryan (coryan@cs.wustl.edu)
+ *
+ * Based on previous work by Tim Harrison (harrison@cs.wustl.edu) and
+ * other members of the DOC group. More details can be found in:
+ *
+ * http://doc.ece.uci.edu/~coryan/EC/index.html
+ */
+
+#ifndef TAO_EC_BITMASK_FILTER_H
+#define TAO_EC_BITMASK_FILTER_H
+#include /**/ "ace/pre.h"
+
+#include "orbsvcs/Event/EC_Filter.h"
+#include /**/ "orbsvcs/Event/event_serv_export.h"
+
+#if !defined (ACE_LACKS_PRAGMA_ONCE)
+# pragma once
+#endif /* ACE_LACKS_PRAGMA_ONCE */
+
+TAO_BEGIN_VERSIONED_NAMESPACE_DECL
+
+/**
+ * @class TAO_EC_Bitmask_Filter
+ *
+ * @brief The bitmask filter.
+ *
+ * This filter quickly rejects events that do not match a given
+ * bitmask.
+ * If the event is not rejected based on the mask then the child
+ * is consulted to finally accept or reject the event.
+ * When composed with the Null_Filter it accepts any events that
+ * satisfy:
+ * (event.header.type & type_mask) != 0
+ * && (event.header.type & source_mask) != 0
+ *
+ * <H2>Memory Management</H2>
+ * It assumes ownership of the child.
+ */
+class TAO_RTEvent_Serv_Export TAO_EC_Bitmask_Filter : public TAO_EC_Filter
+{
+public:
+ /**
+ * Constructor.
+ * Events that do not satisfy:
+ *
+ * (e.header.source & source_mask) != 0 &&
+ * (e.header.type & type_mask) != 0
+ *
+ * are immediately rejected, other events are recursively tested
+ * using the child node.
+ * It assumes ownership of the child.
+ */
+ TAO_EC_Bitmask_Filter (CORBA::ULong source_mask,
+ CORBA::ULong type_mask,
+ TAO_EC_Filter* child);
+
+ /// Destructor
+ virtual ~TAO_EC_Bitmask_Filter (void);
+
+ // = The TAO_EC_Filter methods, please check the documentation in
+ // TAO_EC_Filter.
+ virtual ChildrenIterator begin (void) const;
+ virtual ChildrenIterator end (void) const;
+ virtual int size (void) const;
+ virtual int filter (const RtecEventComm::EventSet& event,
+ TAO_EC_QOS_Info& qos_info
+ ACE_ENV_ARG_DECL);
+ virtual int filter_nocopy (RtecEventComm::EventSet& event,
+ TAO_EC_QOS_Info& qos_info
+ ACE_ENV_ARG_DECL);
+ virtual void push (const RtecEventComm::EventSet& event,
+ TAO_EC_QOS_Info& qos_info
+ ACE_ENV_ARG_DECL);
+ virtual void push_nocopy (RtecEventComm::EventSet& event,
+ TAO_EC_QOS_Info& qos_info
+ ACE_ENV_ARG_DECL);
+ virtual void clear (void);
+ virtual CORBA::ULong max_event_size (void) const;
+ virtual int can_match (const RtecEventComm::EventHeader& header) const;
+ virtual int add_dependencies (const RtecEventComm::EventHeader& header,
+ const TAO_EC_QOS_Info &qos_info
+ ACE_ENV_ARG_DECL);
+
+private:
+ TAO_EC_Bitmask_Filter (const TAO_EC_Bitmask_Filter&);
+ TAO_EC_Bitmask_Filter& operator= (const TAO_EC_Bitmask_Filter&);
+
+private:
+ /// The bitmasks
+ CORBA::ULong source_mask_;
+ CORBA::ULong type_mask_;
+
+ /// The children
+ TAO_EC_Filter* child_;
+};
+
+TAO_END_VERSIONED_NAMESPACE_DECL
+
+#include /**/ "ace/post.h"
+#endif /* TAO_EC_BITMASK_FILTER_H */
diff --git a/TAO/orbsvcs/orbsvcs/Event/EC_Busy_Lock.cpp b/TAO/orbsvcs/orbsvcs/Event/EC_Busy_Lock.cpp
new file mode 100644
index 00000000000..f2cce60ee21
--- /dev/null
+++ b/TAO/orbsvcs/orbsvcs/Event/EC_Busy_Lock.cpp
@@ -0,0 +1,64 @@
+// $Id$
+
+#ifndef TAO_EC_BUSY_LOCK_CPP
+#define TAO_EC_BUSY_LOCK_CPP
+
+#include "orbsvcs/Event/EC_Busy_Lock.h"
+
+#if ! defined (__ACE_INLINE__)
+#include "orbsvcs/Event/EC_Busy_Lock.i"
+#endif /* __ACE_INLINE__ */
+
+TAO_BEGIN_VERSIONED_NAMESPACE_DECL
+
+template<class T>
+int TAO_EC_Busy_Lock_Adapter<T>::remove (void)
+{
+ return 0;
+}
+
+template<class T>
+int TAO_EC_Busy_Lock_Adapter<T>::acquire (void)
+{
+ return this->adaptee_->busy ();
+}
+
+template<class T>
+int TAO_EC_Busy_Lock_Adapter<T>::tryacquire (void)
+{
+ return this->adaptee_->busy ();
+}
+
+template<class T>
+int TAO_EC_Busy_Lock_Adapter<T>::release (void)
+{
+ return this->adaptee_->idle ();
+}
+
+template<class T>
+int TAO_EC_Busy_Lock_Adapter<T>::acquire_read (void)
+{
+ return this->adaptee_->busy ();
+}
+
+template<class T>
+int TAO_EC_Busy_Lock_Adapter<T>::acquire_write (void)
+{
+ return this->adaptee_->busy ();
+}
+
+template<class T>
+int TAO_EC_Busy_Lock_Adapter<T>::tryacquire_read (void)
+{
+ return this->adaptee_->busy ();
+}
+
+template<class T>
+int TAO_EC_Busy_Lock_Adapter<T>::tryacquire_write (void)
+{
+ return this->adaptee_->busy ();
+}
+
+TAO_END_VERSIONED_NAMESPACE_DECL
+
+#endif /* TAO_EC_BUSY_LOCK_CPP */
diff --git a/TAO/orbsvcs/orbsvcs/Event/EC_Busy_Lock.h b/TAO/orbsvcs/orbsvcs/Event/EC_Busy_Lock.h
new file mode 100644
index 00000000000..1640d5b8bf2
--- /dev/null
+++ b/TAO/orbsvcs/orbsvcs/Event/EC_Busy_Lock.h
@@ -0,0 +1,66 @@
+// -*- C++ -*-
+
+/**
+ * @file EC_Busy_Lock.h
+ *
+ * $Id$
+ *
+ * @author Carlos O'Ryan (coryan@cs.wustl.edu)
+ *
+ * Based on previous work by Tim Harrison (harrison@cs.wustl.edu) and
+ * other members of the DOC group. More details can be found in:
+ *
+ * http://doc.ece.uci.edu/~coryan/EC/index.html
+ */
+
+#ifndef TAO_EC_BUSY_LOCK_H
+#define TAO_EC_BUSY_LOCK_H
+#include /**/ "ace/pre.h"
+
+#include "ace/config-all.h"
+
+#if !defined (ACE_LACKS_PRAGMA_ONCE)
+# pragma once
+#endif /* ACE_LACKS_PRAGMA_ONCE */
+
+TAO_BEGIN_VERSIONED_NAMESPACE_DECL
+
+template<class Adaptee>
+class TAO_EC_Busy_Lock_Adapter
+{
+public:
+ /// Constructor
+ TAO_EC_Busy_Lock_Adapter (Adaptee* adaptee);
+
+ // = The ACE_Lock methods, please check $ACE_ROOT/ace/Synch.h for
+ // details.
+
+ int remove (void);
+ int acquire (void);
+ int tryacquire (void);
+ int release (void);
+ int acquire_read (void);
+ int acquire_write (void);
+ int tryacquire_read (void);
+ int tryacquire_write (void);
+
+private:
+ Adaptee* adaptee_;
+};
+
+TAO_END_VERSIONED_NAMESPACE_DECL
+
+#if defined (__ACE_INLINE__)
+#include "orbsvcs/Event/EC_Busy_Lock.i"
+#endif /* __ACE_INLINE__ */
+
+#if defined (ACE_TEMPLATES_REQUIRE_SOURCE)
+#include "orbsvcs/Event/EC_Busy_Lock.cpp"
+#endif /* ACE_TEMPLATES_REQUIRE_SOURCE */
+
+#if defined (ACE_TEMPLATES_REQUIRE_PRAGMA)
+#pragma implementation ("EC_Busy_Lock.cpp")
+#endif /* ACE_TEMPLATES_REQUIRE_PRAGMA */
+
+#include /**/ "ace/post.h"
+#endif /* TAO_EC_BUSY_LOCK_H */
diff --git a/TAO/orbsvcs/orbsvcs/Event/EC_Busy_Lock.i b/TAO/orbsvcs/orbsvcs/Event/EC_Busy_Lock.i
new file mode 100644
index 00000000000..670ad09dd63
--- /dev/null
+++ b/TAO/orbsvcs/orbsvcs/Event/EC_Busy_Lock.i
@@ -0,0 +1,13 @@
+// -*- C++ -*-
+//
+// $Id$
+
+TAO_BEGIN_VERSIONED_NAMESPACE_DECL
+
+template<class T> ACE_INLINE
+TAO_EC_Busy_Lock_Adapter<T>::TAO_EC_Busy_Lock_Adapter (T* adaptee)
+ : adaptee_ (adaptee)
+{
+}
+
+TAO_END_VERSIONED_NAMESPACE_DECL
diff --git a/TAO/orbsvcs/orbsvcs/Event/EC_Channel_Destroyer.cpp b/TAO/orbsvcs/orbsvcs/Event/EC_Channel_Destroyer.cpp
new file mode 100644
index 00000000000..3759342a5e9
--- /dev/null
+++ b/TAO/orbsvcs/orbsvcs/Event/EC_Channel_Destroyer.cpp
@@ -0,0 +1,30 @@
+/**
+ * @file EC_Channel_Destroyer.cpp
+ *
+ * $Id$
+ *
+ * @author Marina Spivak <marina@atdesk.com>
+ */
+
+#include "orbsvcs/Event/EC_Channel_Destroyer.h"
+
+TAO_BEGIN_VERSIONED_NAMESPACE_DECL
+
+void
+TAO_EC_Channel_Destroyer_Functor::operator() (
+ TAO_EC_Event_Channel_Base * event_channel)
+ ACE_THROW_SPEC (())
+{
+ ACE_DECLARE_NEW_CORBA_ENV;
+ ACE_TRY
+ {
+ event_channel->destroy (ACE_ENV_SINGLE_ARG_PARAMETER);
+ ACE_TRY_CHECK;
+ }
+ ACE_CATCHALL
+ {
+ }
+ ACE_ENDTRY;
+}
+
+TAO_END_VERSIONED_NAMESPACE_DECL
diff --git a/TAO/orbsvcs/orbsvcs/Event/EC_Channel_Destroyer.h b/TAO/orbsvcs/orbsvcs/Event/EC_Channel_Destroyer.h
new file mode 100644
index 00000000000..4b18ad808fd
--- /dev/null
+++ b/TAO/orbsvcs/orbsvcs/Event/EC_Channel_Destroyer.h
@@ -0,0 +1,46 @@
+// -*- C++ -*-
+
+/**
+ * @file EC_Channel_Destroyer.h
+ *
+ * @author Marina Spivak <marina@atdesk.com>
+ *
+ * $Id$
+ */
+#ifndef EC_CHANNEL_DESTROYER__H_
+#define EC_CHANNEL_DESTROYER__H_
+
+#include /**/ "orbsvcs/Event/event_serv_export.h"
+#include "orbsvcs/Event/EC_Event_Channel_Base.h"
+#include "ace/Auto_Functor.h"
+
+TAO_BEGIN_VERSIONED_NAMESPACE_DECL
+
+/**
+ * @struct TAO_EC_Channel_Destroyer_Functor
+ *
+ * @brief Implements a functor for the TAO_EC_Channel_Destroyer class.
+ */
+struct TAO_RTEvent_Serv_Export TAO_EC_Channel_Destroyer_Functor
+{
+ typedef TAO_EC_Event_Channel_Base * argument;
+
+ /// Destroy @c event_channel
+ void operator() (TAO_EC_Event_Channel_Base * event_channel)
+ ACE_THROW_SPEC (());
+};
+
+/**
+ * @class TAO_EC_Channel_Destroyer
+ *
+ * @brief Helper class to destroy event channel.
+ *
+ */
+typedef ACE_Utils::Auto_Functor<
+ TAO_EC_Event_Channel_Base,
+ TAO_EC_Channel_Destroyer_Functor>
+ TAO_EC_Channel_Destroyer;
+
+TAO_END_VERSIONED_NAMESPACE_DECL
+
+#endif // EC_CHANNEL_DESTROYER__H_
diff --git a/TAO/orbsvcs/orbsvcs/Event/EC_Conjunction_Filter.cpp b/TAO/orbsvcs/orbsvcs/Event/EC_Conjunction_Filter.cpp
new file mode 100644
index 00000000000..e8fae3ae659
--- /dev/null
+++ b/TAO/orbsvcs/orbsvcs/Event/EC_Conjunction_Filter.cpp
@@ -0,0 +1,209 @@
+// $Id$
+
+#include "orbsvcs/Event/EC_Conjunction_Filter.h"
+
+ACE_RCSID(Event, EC_Conjunction_Filter, "$Id$")
+
+TAO_BEGIN_VERSIONED_NAMESPACE_DECL
+
+const int bits_per_word = sizeof(TAO_EC_Conjunction_Filter::Word) * CHAR_BIT;
+
+TAO_EC_Conjunction_Filter::
+ TAO_EC_Conjunction_Filter (TAO_EC_Filter* children[],
+ size_t n)
+ : children_ (children),
+ n_ (n)
+{
+ ChildrenIterator end = this->end ();
+ for (ChildrenIterator i = this->begin ();
+ i != end;
+ ++i)
+ {
+ this->adopt_child (*i);
+ }
+
+ this->nwords_ = this->n_ / bits_per_word + 1;
+ ACE_NEW (this->bitvec_, Word[this->nwords_]);
+
+ this->clear ();
+}
+
+TAO_EC_Conjunction_Filter::~TAO_EC_Conjunction_Filter (void)
+{
+ TAO_EC_Filter** end = this->children_ + this->n_;
+ for (TAO_EC_Filter** i = this->children_;
+ i != end;
+ ++i)
+ {
+ delete *i;
+ *i = 0;
+ }
+ delete[] this->children_;
+ this->children_ = 0;
+ this->n_ = 0;
+
+ delete[] this->bitvec_;
+ this->bitvec_ = 0;
+}
+
+int
+TAO_EC_Conjunction_Filter::all_received (void) const
+{
+ Word* i = this->bitvec_;
+ for (;
+ i != this->bitvec_ + this->nwords_;
+ ++i)
+ {
+ if (*i != static_cast<Word> (~0))
+ return 0;
+ }
+ return 1;
+}
+
+TAO_EC_Filter::ChildrenIterator
+TAO_EC_Conjunction_Filter::begin (void) const
+{
+ return this->children_;
+}
+
+TAO_EC_Filter::ChildrenIterator
+TAO_EC_Conjunction_Filter::end (void) const
+{
+ return this->children_ + this->n_;
+}
+
+int
+TAO_EC_Conjunction_Filter::size (void) const
+{
+ return static_cast<int> (this->n_);
+}
+
+int
+TAO_EC_Conjunction_Filter::filter (const RtecEventComm::EventSet& event,
+ TAO_EC_QOS_Info& qos_info
+ ACE_ENV_ARG_DECL)
+{
+ ChildrenIterator end = this->end ();
+ for (this->current_child_ = this->begin ();
+ this->current_child_ != end;
+ ++this->current_child_)
+ {
+ int n = (*this->current_child_)->filter (event, qos_info ACE_ENV_ARG_PARAMETER);
+ ACE_CHECK_RETURN (0);
+ if (n != 0)
+ return n;
+ }
+ return 0;
+}
+
+int
+TAO_EC_Conjunction_Filter::filter_nocopy (RtecEventComm::EventSet& event,
+ TAO_EC_QOS_Info& qos_info
+ ACE_ENV_ARG_DECL)
+{
+ ChildrenIterator end = this->end ();
+ for (ChildrenIterator i = this->begin ();
+ i != end;
+ ++i)
+ {
+ int n = (*i)->filter_nocopy (event, qos_info ACE_ENV_ARG_PARAMETER);
+ ACE_CHECK_RETURN (0);
+ if (n != 0)
+ return n;
+ }
+ return 0;
+}
+
+void
+TAO_EC_Conjunction_Filter::push (const RtecEventComm::EventSet& event,
+ TAO_EC_QOS_Info& qos_info
+ ACE_ENV_ARG_DECL)
+{
+ CORBA::Long pos = this->current_child_ - this->begin ();
+ int w = pos / bits_per_word;
+ int b = pos % bits_per_word;
+ if (ACE_BIT_ENABLED (this->bitvec_[w], 1<<b))
+ return;
+ ACE_SET_BITS (this->bitvec_[w], 1<<b);
+ CORBA::ULong n = event.length ();
+ CORBA::ULong l = this->event_.length ();
+ this->event_.length (l + n);
+ for (CORBA::ULong i = 0; i != n; ++i)
+ {
+ this->event_[l + i] = event[i];
+ }
+ if (this->all_received () && this->parent () != 0)
+ this->parent ()->push_nocopy (this->event_, qos_info ACE_ENV_ARG_PARAMETER);
+}
+
+void
+TAO_EC_Conjunction_Filter::push_nocopy (RtecEventComm::EventSet& event,
+ TAO_EC_QOS_Info& qos_info
+ ACE_ENV_ARG_DECL)
+{
+ this->push (event, qos_info ACE_ENV_ARG_PARAMETER);
+}
+
+void
+TAO_EC_Conjunction_Filter::clear (void)
+{
+ ChildrenIterator end = this->end ();
+ for (ChildrenIterator i = this->begin ();
+ i != end;
+ ++i)
+ {
+ (*i)->clear ();
+ }
+ Word* j = this->bitvec_;
+ for (;
+ j != this->bitvec_ + this->nwords_ - 1;
+ ++j)
+ {
+ *j = 0;
+ }
+ int b = static_cast<int> (this->n_ % bits_per_word);
+ Word last = ~0 << b;
+ *j = last;
+
+ this->event_.length (0);
+}
+
+CORBA::ULong
+TAO_EC_Conjunction_Filter::max_event_size (void) const
+{
+ CORBA::ULong n = 0;
+ ChildrenIterator end = this->end ();
+ for (ChildrenIterator i = this->begin ();
+ i != end;
+ ++i)
+ {
+ n += (*i)->max_event_size ();
+ }
+ return n;
+}
+
+int
+TAO_EC_Conjunction_Filter::can_match (
+ const RtecEventComm::EventHeader& header) const
+{
+ ChildrenIterator end = this->end ();
+ for (ChildrenIterator i = this->begin ();
+ i != end;
+ ++i)
+ {
+ if ((*i)->can_match (header) != 0)
+ return 1;
+ }
+ return 0;
+}
+
+int
+TAO_EC_Conjunction_Filter::add_dependencies (
+ const RtecEventComm::EventHeader&,
+ const TAO_EC_QOS_Info&
+ ACE_ENV_ARG_DECL_NOT_USED)
+{
+ return 0;
+}
+
+TAO_END_VERSIONED_NAMESPACE_DECL
diff --git a/TAO/orbsvcs/orbsvcs/Event/EC_Conjunction_Filter.h b/TAO/orbsvcs/orbsvcs/Event/EC_Conjunction_Filter.h
new file mode 100644
index 00000000000..e50d6b37867
--- /dev/null
+++ b/TAO/orbsvcs/orbsvcs/Event/EC_Conjunction_Filter.h
@@ -0,0 +1,113 @@
+// -*- C++ -*-
+
+/**
+ * @file EC_Conjunction_Filter.h
+ *
+ * $Id$
+ *
+ * @author Carlos O'Ryan (coryan@cs.wustl.edu)
+ *
+ * Based on previous work by Tim Harrison (harrison@cs.wustl.edu) and
+ * other members of the DOC group. More details can be found in:
+ *
+ * http://doc.ece.uci.edu/~coryan/EC/index.html
+ */
+
+#ifndef TAO_EC_CONJUNCTION_FILTER_H
+#define TAO_EC_CONJUNCTION_FILTER_H
+#include /**/ "ace/pre.h"
+
+#include "orbsvcs/Event/EC_Filter.h"
+#include /**/ "orbsvcs/Event/event_serv_export.h"
+
+#if !defined (ACE_LACKS_PRAGMA_ONCE)
+# pragma once
+#endif /* ACE_LACKS_PRAGMA_ONCE */
+
+TAO_BEGIN_VERSIONED_NAMESPACE_DECL
+
+/**
+ * @class TAO_EC_Conjunction_Filter
+ *
+ * @brief The conjunction filter.
+ *
+ * This filter waits until each one of its children has accepted
+ * at least one event. Only in that case it accepts and publishes
+ * the sequence formed by all the children events.
+ *
+ * <H2>Memory Management</H2>
+ * It assumes ownership of the children.
+ */
+class TAO_RTEvent_Serv_Export TAO_EC_Conjunction_Filter : public TAO_EC_Filter
+{
+public:
+ /// Constructor. It assumes ownership of both the array and the
+ /// children.
+ TAO_EC_Conjunction_Filter (TAO_EC_Filter* children[],
+ size_t n);
+
+ /// Destructor
+ virtual ~TAO_EC_Conjunction_Filter (void);
+
+ // = The TAO_EC_Filter methods, please check the documentation in
+ // TAO_EC_Filter.
+ virtual ChildrenIterator begin (void) const;
+ virtual ChildrenIterator end (void) const;
+ virtual int size (void) const;
+ virtual int filter (const RtecEventComm::EventSet& event,
+ TAO_EC_QOS_Info& qos_info
+ ACE_ENV_ARG_DECL);
+ virtual int filter_nocopy (RtecEventComm::EventSet& event,
+ TAO_EC_QOS_Info& qos_info
+ ACE_ENV_ARG_DECL);
+ virtual void push (const RtecEventComm::EventSet& event,
+ TAO_EC_QOS_Info& qos_info
+ ACE_ENV_ARG_DECL);
+ virtual void push_nocopy (RtecEventComm::EventSet& event,
+ TAO_EC_QOS_Info& qos_info
+ ACE_ENV_ARG_DECL);
+ virtual void clear (void);
+ virtual CORBA::ULong max_event_size (void) const;
+ virtual int can_match (const RtecEventComm::EventHeader& header) const;
+ virtual int add_dependencies (const RtecEventComm::EventHeader& header,
+ const TAO_EC_QOS_Info &qos_info
+ ACE_ENV_ARG_DECL);
+
+ typedef unsigned int Word;
+
+private:
+ /// Determine if all the children have received their events.
+ int all_received (void) const;
+
+ TAO_EC_Conjunction_Filter (const TAO_EC_Conjunction_Filter&);
+ TAO_EC_Conjunction_Filter& operator= (const TAO_EC_Conjunction_Filter&);
+
+private:
+ /// The children
+ TAO_EC_Filter** children_;
+
+ /// The number of children.
+ size_t n_;
+
+ /// The event we send up (once all the children have pushed theirs).
+ RtecEventComm::EventSet event_;
+
+ /**
+ * The number of words in the bit vector
+ */
+ size_t nwords_;
+
+ /**
+ * The bit vector to keep track of the children that have received
+ * their events.
+ */
+ Word* bitvec_;
+
+ /// The current child in the iteration, used in the push() method...
+ ChildrenIterator current_child_;
+};
+
+TAO_END_VERSIONED_NAMESPACE_DECL
+
+#include /**/ "ace/post.h"
+#endif /* TAO_EC_CONJUNCTION_FILTER_H */
diff --git a/TAO/orbsvcs/orbsvcs/Event/EC_ConsumerAdmin.cpp b/TAO/orbsvcs/orbsvcs/Event/EC_ConsumerAdmin.cpp
new file mode 100644
index 00000000000..73bf25fff47
--- /dev/null
+++ b/TAO/orbsvcs/orbsvcs/Event/EC_ConsumerAdmin.cpp
@@ -0,0 +1,41 @@
+// $Id$
+
+#include "orbsvcs/Event/EC_ConsumerAdmin.h"
+#include "orbsvcs/Event/EC_ProxySupplier.h"
+#include "orbsvcs/Event/EC_ProxyConsumer.h"
+#include "orbsvcs/Event/EC_Event_Channel_Base.h"
+#include "orbsvcs/ESF/ESF_Peer_Workers.h"
+#include "orbsvcs/ESF/ESF_Peer_Admin.h"
+#include "orbsvcs/ESF/ESF_Shutdown_Proxy.h"
+
+ACE_RCSID (Event,
+ EC_ConsumerAdmin,
+ "$Id$")
+
+TAO_BEGIN_VERSIONED_NAMESPACE_DECL
+
+TAO_EC_ConsumerAdmin::TAO_EC_ConsumerAdmin (TAO_EC_Event_Channel_Base *ec)
+ : TAO_ESF_Peer_Admin<TAO_EC_Event_Channel_Base,TAO_EC_ProxyPushSupplier,RtecEventChannelAdmin::ProxyPushSupplier,TAO_EC_ProxyPushConsumer> (ec)
+{
+ this->default_POA_ =
+ this->event_channel_->consumer_poa ();
+}
+
+TAO_EC_ConsumerAdmin::~TAO_EC_ConsumerAdmin (void)
+{
+}
+
+RtecEventChannelAdmin::ProxyPushSupplier_ptr
+TAO_EC_ConsumerAdmin::obtain_push_supplier (ACE_ENV_SINGLE_ARG_DECL)
+ ACE_THROW_SPEC ((CORBA::SystemException))
+{
+ return this->obtain (ACE_ENV_SINGLE_ARG_PARAMETER);
+}
+
+PortableServer::POA_ptr
+TAO_EC_ConsumerAdmin::_default_POA (ACE_ENV_SINGLE_ARG_DECL_NOT_USED)
+{
+ return PortableServer::POA::_duplicate (this->default_POA_.in ());
+}
+
+TAO_END_VERSIONED_NAMESPACE_DECL
diff --git a/TAO/orbsvcs/orbsvcs/Event/EC_ConsumerAdmin.h b/TAO/orbsvcs/orbsvcs/Event/EC_ConsumerAdmin.h
new file mode 100644
index 00000000000..60e45de355a
--- /dev/null
+++ b/TAO/orbsvcs/orbsvcs/Event/EC_ConsumerAdmin.h
@@ -0,0 +1,81 @@
+// -*- C++ -*-
+
+/**
+ * @file EC_ConsumerAdmin.h
+ *
+ * $Id$
+ *
+ * @author Carlos O'Ryan (coryan@cs.wustl.edu)
+ *
+ * Based on previous work by Tim Harrison (harrison@cs.wustl.edu) and
+ * other members of the DOC group. More details can be found in:
+ *
+ * http://doc.ece.uci.edu/~coryan/EC/index.html
+ */
+
+#ifndef TAO_EC_CONSUMERADMIN_H
+#define TAO_EC_CONSUMERADMIN_H
+
+#include /**/ "ace/pre.h"
+
+#include "orbsvcs/Event/EC_ProxySupplier.h"
+
+#if !defined (ACE_LACKS_PRAGMA_ONCE)
+# pragma once
+#endif /* ACE_LACKS_PRAGMA_ONCE */
+
+#include "orbsvcs/ESF/ESF_Peer_Admin.h"
+
+#include /**/ "orbsvcs/Event/event_serv_export.h"
+
+TAO_BEGIN_VERSIONED_NAMESPACE_DECL
+
+class TAO_EC_Event_Channel_Base;
+class TAO_EC_ProxyPushConsumer;
+
+/**
+ * @class TAO_EC_ConsumerAdmin
+ *
+ * @brief Implements the ConsumerAdmin interface, i.e. the factory for
+ * TAO_EC_ProxyPushSupplier objects.
+ *
+ * <H2> Memory Management</H2>
+ * It does not assume ownership of the TAO_EC_Event_Channel_Base object;
+ * but it *does* assume ownership of the TAO_EC_ProxyPushSupplier_Set
+ * object.
+ *
+ * <H2>Locking</H2>
+ * No provisions for locking, access must be serialized externally.
+ */
+class TAO_RTEvent_Serv_Export TAO_EC_ConsumerAdmin
+ : public POA_RtecEventChannelAdmin::ConsumerAdmin
+ , public TAO_ESF_Peer_Admin<TAO_EC_Event_Channel_Base,TAO_EC_ProxyPushSupplier,RtecEventChannelAdmin::ProxyPushSupplier,TAO_EC_ProxyPushConsumer>
+{
+public:
+ /**
+ * Constructor. Builds one using the @a event_channel argument.
+ * In any case it assumes ownership.
+ */
+ TAO_EC_ConsumerAdmin (TAO_EC_Event_Channel_Base* event_channel);
+
+ /// Destructor...
+ virtual ~TAO_EC_ConsumerAdmin (void);
+
+ // = The RtecEventChannelAdmin::ConsumerAdmin methods...
+ virtual RtecEventChannelAdmin::ProxyPushSupplier_ptr
+ obtain_push_supplier (ACE_ENV_SINGLE_ARG_DECL_NOT_USED)
+ ACE_THROW_SPEC ((CORBA::SystemException));
+
+ // = The PortableServer::ServantBase methods
+ virtual PortableServer::POA_ptr _default_POA (ACE_ENV_SINGLE_ARG_DECL);
+
+private:
+ /// Store the default POA.
+ PortableServer::POA_var default_POA_;
+};
+
+TAO_END_VERSIONED_NAMESPACE_DECL
+
+#include /**/ "ace/post.h"
+
+#endif /* TAO_EC_CONSUMERADMIN_H */
diff --git a/TAO/orbsvcs/orbsvcs/Event/EC_ConsumerControl.cpp b/TAO/orbsvcs/orbsvcs/Event/EC_ConsumerControl.cpp
new file mode 100644
index 00000000000..007d90bd404
--- /dev/null
+++ b/TAO/orbsvcs/orbsvcs/Event/EC_ConsumerControl.cpp
@@ -0,0 +1,42 @@
+// $Id$
+
+#include "orbsvcs/Event/EC_ConsumerControl.h"
+
+ACE_RCSID(Event, EC_ConsumerControl, "$Id$")
+
+TAO_BEGIN_VERSIONED_NAMESPACE_DECL
+
+TAO_EC_ConsumerControl::TAO_EC_ConsumerControl (void)
+{
+}
+
+TAO_EC_ConsumerControl::~TAO_EC_ConsumerControl (void)
+{
+}
+
+int
+TAO_EC_ConsumerControl::activate (void)
+{
+ return 0;
+}
+
+int
+TAO_EC_ConsumerControl::shutdown (void)
+{
+ return 0;
+}
+
+void
+TAO_EC_ConsumerControl::consumer_not_exist (TAO_EC_ProxyPushSupplier *
+ ACE_ENV_ARG_DECL_NOT_USED)
+{
+}
+
+void
+TAO_EC_ConsumerControl::system_exception (TAO_EC_ProxyPushSupplier *,
+ CORBA::SystemException &
+ ACE_ENV_ARG_DECL_NOT_USED)
+{
+}
+
+TAO_END_VERSIONED_NAMESPACE_DECL
diff --git a/TAO/orbsvcs/orbsvcs/Event/EC_ConsumerControl.h b/TAO/orbsvcs/orbsvcs/Event/EC_ConsumerControl.h
new file mode 100644
index 00000000000..281fe09f0d3
--- /dev/null
+++ b/TAO/orbsvcs/orbsvcs/Event/EC_ConsumerControl.h
@@ -0,0 +1,83 @@
+// -*- C++ -*-
+
+/**
+ * @file EC_ConsumerControl.h
+ *
+ * $Id$
+ *
+ * @author Carlos O'Ryan (coryan@cs.wustl.edu)
+ *
+ * Based on previous work by Tim Harrison (harrison@cs.wustl.edu) and
+ * other members of the DOC group. More details can be found in:
+ *
+ * http://doc.ece.uci.edu/~coryan/EC/index.html
+ */
+
+#ifndef TAO_EC_CONSUMERCONTROL_H
+#define TAO_EC_CONSUMERCONTROL_H
+
+#include /**/ "ace/pre.h"
+#include "ace/CORBA_macros.h"
+
+#include /**/ "orbsvcs/Event/event_serv_export.h"
+
+#if !defined (ACE_LACKS_PRAGMA_ONCE)
+# pragma once
+#endif /* ACE_LACKS_PRAGMA_ONCE */
+
+#include "tao/orbconf.h"
+
+TAO_BEGIN_VERSIONED_NAMESPACE_DECL
+
+class TAO_EC_Event_Channel_Base;
+class TAO_EC_ProxyPushSupplier;
+
+namespace CORBA
+{
+ class Environment;
+ class SystemException;
+}
+
+/**
+ * @class TAO_EC_ConsumerControl
+ *
+ * @brief ConsumerControl
+ *
+ * Defines the interface for the consumer control strategy.
+ * This strategy handles misbehaving or failing consumers.
+ */
+class TAO_RTEvent_Serv_Export TAO_EC_ConsumerControl
+{
+public:
+ /// Constructor.
+ TAO_EC_ConsumerControl (void);
+
+ /// Destructor.
+ virtual ~TAO_EC_ConsumerControl (void);
+
+ /// Activate any internal threads or timers used to poll the state of
+ /// the consumers
+ virtual int activate (void);
+ virtual int shutdown (void);
+
+ /**
+ * When pushing an event to the consumer a CORBA::OBJECT_NOT_EXIST
+ * exception was raised. The only interpretation is that the object
+ * has been destroyed. The strategy has to (at the very least),
+ * reclaim all the resources attached to that object.
+ */
+ virtual void consumer_not_exist (TAO_EC_ProxyPushSupplier *proxy
+ ACE_ENV_ARG_DECL);
+
+ /// Some system exception was raised while trying to contact the
+ /// consumer
+ virtual void system_exception (TAO_EC_ProxyPushSupplier *proxy,
+ CORBA::SystemException &
+ ACE_ENV_ARG_DECL);
+};
+
+TAO_END_VERSIONED_NAMESPACE_DECL
+
+#include /**/ "ace/post.h"
+
+#endif /* TAO_EC_CONSUMERCONTROL_H */
diff --git a/TAO/orbsvcs/orbsvcs/Event/EC_Default_Factory.cpp b/TAO/orbsvcs/orbsvcs/Event/EC_Default_Factory.cpp
new file mode 100644
index 00000000000..c10cfbbb4cd
--- /dev/null
+++ b/TAO/orbsvcs/orbsvcs/Event/EC_Default_Factory.cpp
@@ -0,0 +1,1003 @@
+// $Id$
+
+#include "orbsvcs/Event/EC_Default_Factory.h"
+#include "orbsvcs/Event/EC_Reactive_Dispatching.h"
+#include "orbsvcs/Event/EC_MT_Dispatching.h"
+#include "orbsvcs/Event/EC_Basic_Filter_Builder.h"
+#include "orbsvcs/Event/EC_Prefix_Filter_Builder.h"
+#include "orbsvcs/Event/EC_ConsumerAdmin.h"
+#include "orbsvcs/Event/EC_SupplierAdmin.h"
+#include "orbsvcs/Event/EC_Default_ProxyConsumer.h"
+#include "orbsvcs/Event/EC_Default_ProxySupplier.h"
+#include "orbsvcs/Event/EC_Trivial_Supplier_Filter.h"
+#include "orbsvcs/Event/EC_Per_Supplier_Filter.h"
+#include "orbsvcs/Event/EC_ObserverStrategy.h"
+#include "orbsvcs/Event/EC_Null_Scheduling.h"
+#include "orbsvcs/Event/EC_Group_Scheduling.h"
+#include "orbsvcs/Event/EC_Reactive_Timeout_Generator.h"
+#include "orbsvcs/Event/EC_Event_Channel_Base.h"
+#include "orbsvcs/Event/EC_Reactive_ConsumerControl.h"
+#include "orbsvcs/Event/EC_Reactive_SupplierControl.h"
+
+#include "orbsvcs/ESF/ESF_Proxy_List.h"
+#include "orbsvcs/ESF/ESF_Proxy_RB_Tree.h"
+#include "orbsvcs/ESF/ESF_Immediate_Changes.h"
+#include "orbsvcs/ESF/ESF_Copy_On_Read.h"
+#include "orbsvcs/ESF/ESF_Copy_On_Write.h"
+#include "orbsvcs/ESF/ESF_Delayed_Changes.h"
+#include "orbsvcs/ESF/ESF_Delayed_Command.h"
+
+#include "tao/ORB_Core.h"
+
+#include "ace/Arg_Shifter.h"
+#include "ace/Sched_Params.h"
+#include "ace/OS_NS_strings.h"
+#include "ace/Dynamic_Service.h"
+
+#if ! defined (__ACE_INLINE__)
+#include "orbsvcs/Event/EC_Default_Factory.i"
+#endif /* __ACE_INLINE__ */
+
+ACE_RCSID(Event, EC_Default_Factory, "$Id$")
+
+TAO_BEGIN_VERSIONED_NAMESPACE_DECL
+
+TAO_EC_Default_Factory::~TAO_EC_Default_Factory (void)
+{
+}
+
+int
+TAO_EC_Default_Factory::init_svcs (void)
+{
+ TAO_EC_Simple_Queue_Full_Action::init_svcs();
+ return ACE_Service_Config::static_svcs ()->
+ insert (&ace_svc_desc_TAO_EC_Default_Factory);
+}
+
+void
+TAO_EC_Default_Factory::unsupported_option_value (const char * option_name,
+ const char * option_value)
+{
+ ACE_ERROR ((LM_ERROR,
+ "EC_Default_Factory - "
+ "Unsupported <%s> option value: <%s>. "
+ "Ignoring this option - using defaults instead.\n",
+ option_name,
+ option_value));
+}
+
+int
+TAO_EC_Default_Factory::init (int argc, ACE_TCHAR* argv[])
+{
+ ACE_Arg_Shifter arg_shifter (argc, argv);
+
+ int priority =
+ (ACE_Sched_Params::priority_min (ACE_SCHED_FIFO) +
+ ACE_Sched_Params::priority_max (ACE_SCHED_FIFO)) / 2;
+ this->dispatching_threads_priority_ =
+ ACE_Sched_Params::next_priority (ACE_SCHED_FIFO, priority);
+
+ while (arg_shifter.is_anything_left ())
+ {
+ const ACE_TCHAR *arg = arg_shifter.get_current ();
+
+ if (ACE_OS::strcasecmp (arg, ACE_TEXT("-ECDispatching")) == 0)
+ {
+ arg_shifter.consume_arg ();
+
+ if (arg_shifter.is_parameter_next ())
+ {
+ const ACE_TCHAR* opt = arg_shifter.get_current ();
+ if (ACE_OS::strcasecmp (opt, ACE_TEXT("reactive")) == 0)
+ this->dispatching_ = 0;
+ else if (ACE_OS::strcasecmp (opt, ACE_TEXT("mt")) == 0)
+ this->dispatching_ = 1;
+ else
+ this->unsupported_option_value ("-ECDispatching", opt);
+ arg_shifter.consume_arg ();
+ }
+ }
+
+ else if (ACE_OS::strcasecmp (arg, ACE_TEXT("-ECDispatchingThreads")) == 0)
+ {
+ arg_shifter.consume_arg ();
+
+ if (arg_shifter.is_parameter_next ())
+ {
+ const ACE_TCHAR* opt = arg_shifter.get_current ();
+ this->dispatching_threads_ = ACE_OS::atoi (opt);
+ arg_shifter.consume_arg ();
+ }
+ }
+
+ else if (ACE_OS::strcasecmp (arg, ACE_TEXT("-ECFiltering")) == 0)
+ {
+ arg_shifter.consume_arg ();
+
+ if (arg_shifter.is_parameter_next ())
+ {
+ const ACE_TCHAR* opt = arg_shifter.get_current ();
+ if (ACE_OS::strcasecmp (opt, ACE_TEXT("null")) == 0)
+ this->filtering_ = 0;
+ else if (ACE_OS::strcasecmp (opt, ACE_TEXT("basic")) == 0)
+ this->filtering_ = 1;
+ else if (ACE_OS::strcasecmp (opt, ACE_TEXT("prefix")) == 0)
+ this->filtering_ = 2;
+ else
+ this->unsupported_option_value ("-ECFiltering", opt);
+ arg_shifter.consume_arg ();
+ }
+ }
+
+ else if (ACE_OS::strcasecmp (arg, ACE_TEXT("-ECSupplierFilter")) == 0
+ // @@ TODO remove, only for backwards compatibility
+ || ACE_OS::strcasecmp (arg, ACE_TEXT("-ECSupplierFiltering")) == 0)
+ {
+ arg_shifter.consume_arg ();
+
+ if (arg_shifter.is_parameter_next ())
+ {
+ const ACE_TCHAR* opt = arg_shifter.get_current ();
+ if (ACE_OS::strcasecmp (opt, ACE_TEXT("null")) == 0)
+ this->supplier_filtering_ = 0;
+ else if (ACE_OS::strcasecmp (opt, ACE_TEXT("per-supplier")) == 0)
+ this->supplier_filtering_ = 1;
+ else
+ this->unsupported_option_value ("-ECSupplierFilter", opt);
+ arg_shifter.consume_arg ();
+ }
+ }
+
+ else if (ACE_OS::strcasecmp (arg, ACE_TEXT("-ECTimeout")) == 0)
+ {
+ arg_shifter.consume_arg ();
+
+ if (arg_shifter.is_parameter_next ())
+ {
+ const ACE_TCHAR* opt = arg_shifter.get_current ();
+ if (ACE_OS::strcasecmp (opt, ACE_TEXT("reactive")) == 0)
+ this->timeout_ = 0;
+ else
+ this->unsupported_option_value ("-ECTimeout", opt);
+ arg_shifter.consume_arg ();
+ }
+ }
+
+ else if (ACE_OS::strcasecmp (arg, ACE_TEXT("-ECObserver")) == 0)
+ {
+ arg_shifter.consume_arg ();
+
+ if (arg_shifter.is_parameter_next ())
+ {
+ const ACE_TCHAR* opt = arg_shifter.get_current ();
+ if (ACE_OS::strcasecmp (opt, ACE_TEXT("null")) == 0)
+ this->observer_ = 0;
+ else if (ACE_OS::strcasecmp (opt, ACE_TEXT("basic")) == 0)
+ this->observer_ = 1;
+ else if (ACE_OS::strcasecmp (opt, ACE_TEXT("reactive")) == 0)
+ this->observer_ = 2;
+ else
+ this->unsupported_option_value ("-ECObserver", opt);
+ arg_shifter.consume_arg ();
+ }
+ }
+
+ else if (ACE_OS::strcasecmp (arg, ACE_TEXT("-ECScheduling")) == 0)
+ {
+ arg_shifter.consume_arg ();
+
+ if (arg_shifter.is_parameter_next ())
+ {
+ const ACE_TCHAR* opt = arg_shifter.get_current ();
+ if (ACE_OS::strcasecmp (opt, ACE_TEXT("null")) == 0)
+ this->scheduling_ = 0;
+ else if (ACE_OS::strcasecmp (opt, ACE_TEXT("group")) == 0)
+ this->scheduling_ = 1;
+ else
+ this->unsupported_option_value ("-ECScheduling", opt);
+ arg_shifter.consume_arg ();
+ }
+ }
+
+ else if (ACE_OS::strcasecmp (arg, ACE_TEXT("-ECProxyPushConsumerCollection")) == 0)
+ {
+ arg_shifter.consume_arg ();
+
+ if (arg_shifter.is_parameter_next ())
+ {
+ const ACE_TCHAR *current_arg = arg_shifter.get_current ();
+ ACE_TCHAR *opt = ACE_OS::strdup (current_arg);
+ int collection_type = 0;
+ int synch_type = 0;
+ int iteration_type = 0;
+
+ ACE_TCHAR* aux;
+ for (ACE_TCHAR* arg = ACE_OS::strtok_r (opt, ACE_TEXT(":"), &aux);
+ arg != 0;
+ arg = ACE_OS::strtok_r (0, ACE_TEXT(":"), &aux))
+ {
+ if (ACE_OS::strcasecmp (arg, ACE_TEXT("mt")) == 0)
+ synch_type = 0;
+ else if (ACE_OS::strcasecmp (arg, ACE_TEXT("st")) == 0)
+ synch_type = 1;
+ else if (ACE_OS::strcasecmp (arg, ACE_TEXT("list")) == 0)
+ collection_type = 0;
+ else if (ACE_OS::strcasecmp (arg, ACE_TEXT("rb_tree")) == 0)
+ collection_type = 1;
+ else if (ACE_OS::strcasecmp (arg, ACE_TEXT("immediate")) == 0)
+ iteration_type = 0;
+ else if (ACE_OS::strcasecmp (arg, ACE_TEXT("copy_on_read")) == 0)
+ iteration_type = 1;
+ else if (ACE_OS::strcasecmp (arg, ACE_TEXT("copy_on_write")) == 0)
+ iteration_type = 2;
+ else if (ACE_OS::strcasecmp (arg, ACE_TEXT("delayed")) == 0)
+ iteration_type = 3;
+ else
+ ACE_ERROR ((LM_ERROR,
+ "EC_Default_Factory - "
+ "Unknown consumer collection modifier <%s>.\n", arg));
+ }
+ ACE_OS::free (opt);
+ this->consumer_collection_ =
+ (synch_type << 8) |(collection_type << 4) | iteration_type;
+ arg_shifter.consume_arg ();
+ }
+ }
+
+ else if (ACE_OS::strcasecmp (arg, ACE_TEXT("-ECProxyPushSupplierCollection")) == 0)
+ {
+ arg_shifter.consume_arg ();
+
+ if (arg_shifter.is_parameter_next ())
+ {
+ const ACE_TCHAR* current_arg = arg_shifter.get_current();
+ ACE_TCHAR* opt = ACE_OS::strdup(current_arg);
+ int collection_type = 0;
+ int synch_type = 0;
+ int iteration_type = 0;
+
+ ACE_TCHAR* aux;
+ for (ACE_TCHAR* arg = ACE_OS::strtok_r (opt, ACE_TEXT(":"), &aux);
+ arg != 0;
+ arg = ACE_OS::strtok_r (0, ACE_TEXT(":"), &aux))
+ {
+ if (ACE_OS::strcasecmp (arg, ACE_TEXT("mt")) == 0)
+ synch_type = 0;
+ else if (ACE_OS::strcasecmp (arg, ACE_TEXT("st")) == 0)
+ synch_type = 1;
+ else if (ACE_OS::strcasecmp (arg, ACE_TEXT("list")) == 0)
+ collection_type = 0;
+ else if (ACE_OS::strcasecmp (arg, ACE_TEXT("rb_tree")) == 0)
+ collection_type = 1;
+ else if (ACE_OS::strcasecmp (arg, ACE_TEXT("immediate")) == 0)
+ iteration_type = 0;
+ else if (ACE_OS::strcasecmp (arg, ACE_TEXT("copy_on_read")) == 0)
+ iteration_type = 1;
+ else if (ACE_OS::strcasecmp (arg, ACE_TEXT("copy_on_write")) == 0)
+ iteration_type = 2;
+ else if (ACE_OS::strcasecmp (arg, ACE_TEXT("delayed")) == 0)
+ iteration_type = 3;
+ else
+ ACE_ERROR ((LM_ERROR,
+ "EC_Default_Factory - "
+ "Unknown supplier collection modifier <%s>.\n", arg));
+ }
+ ACE_OS::free(opt);
+ this->supplier_collection_ =
+ (synch_type << 8) | (collection_type << 4) | iteration_type;
+ arg_shifter.consume_arg ();
+ }
+ }
+
+ else if (ACE_OS::strcasecmp (arg, ACE_TEXT("-ECProxyConsumerLock")) == 0)
+ {
+ arg_shifter.consume_arg ();
+
+ if (arg_shifter.is_parameter_next ())
+ {
+ const ACE_TCHAR* opt = arg_shifter.get_current ();
+ if (ACE_OS::strcasecmp (opt, ACE_TEXT("null")) == 0)
+ this->consumer_lock_ = 0;
+ else if (ACE_OS::strcasecmp (opt, ACE_TEXT("thread")) == 0)
+ this->consumer_lock_ = 1;
+ else if (ACE_OS::strcasecmp (opt, ACE_TEXT("recursive")) == 0)
+ this->consumer_lock_ = 2;
+ else
+ this->unsupported_option_value ("-ECProxyConsumerLock", opt);
+ arg_shifter.consume_arg ();
+ }
+ }
+
+ else if (ACE_OS::strcasecmp (arg, ACE_TEXT("-ECProxySupplierLock")) == 0)
+ {
+ arg_shifter.consume_arg ();
+
+ if (arg_shifter.is_parameter_next ())
+ {
+ const ACE_TCHAR* opt = arg_shifter.get_current ();
+ if (ACE_OS::strcasecmp (opt, ACE_TEXT("null")) == 0)
+ this->supplier_lock_ = 0;
+ else if (ACE_OS::strcasecmp (opt, ACE_TEXT("thread")) == 0)
+ this->supplier_lock_ = 1;
+ else if (ACE_OS::strcasecmp (opt, ACE_TEXT("recursive")) == 0)
+ this->supplier_lock_ = 2;
+ else
+ this->unsupported_option_value ("-ECProxySupplierLock", opt);
+ arg_shifter.consume_arg ();
+ }
+ }
+
+ else if (ACE_OS::strcasecmp (arg, ACE_TEXT("-ECUseORBId")) == 0)
+ {
+ arg_shifter.consume_arg ();
+
+ if (arg_shifter.is_parameter_next ())
+ {
+ // Save argument for later use
+ this->orbid_ = ACE_TEXT_ALWAYS_CHAR(arg_shifter.get_current ());
+ arg_shifter.consume_arg ();
+ }
+ }
+
+ else if (ACE_OS::strcasecmp (arg, ACE_TEXT("-ECConsumerControl")) == 0)
+ {
+ arg_shifter.consume_arg ();
+
+ if (arg_shifter.is_parameter_next ())
+ {
+ const ACE_TCHAR* opt = arg_shifter.get_current ();
+ if (ACE_OS::strcasecmp (opt, ACE_TEXT("null")) == 0)
+ this->consumer_control_ = 0;
+ else if (ACE_OS::strcasecmp (opt, ACE_TEXT("reactive")) == 0)
+ this->consumer_control_ = 1;
+ else
+ this->unsupported_option_value ("-ECConsumerControl", opt);
+ arg_shifter.consume_arg ();
+ }
+ }
+
+ else if (ACE_OS::strcasecmp (arg, ACE_TEXT("-ECSupplierControl")) == 0)
+ {
+ arg_shifter.consume_arg ();
+
+ if (arg_shifter.is_parameter_next ())
+ {
+ const ACE_TCHAR* opt = arg_shifter.get_current ();
+ if (ACE_OS::strcasecmp (opt, ACE_TEXT("null")) == 0)
+ this->supplier_control_ = 0;
+ else if (ACE_OS::strcasecmp (opt, ACE_TEXT("reactive")) == 0)
+ this->supplier_control_ = 1;
+ else
+ this->unsupported_option_value ("-ECSupplierControl", opt);
+ arg_shifter.consume_arg ();
+ }
+ }
+
+ else if (ACE_OS::strcasecmp (arg, ACE_TEXT("-ECConsumerControlPeriod")) == 0)
+ {
+ arg_shifter.consume_arg ();
+
+ if (arg_shifter.is_parameter_next ())
+ {
+ const ACE_TCHAR* opt = arg_shifter.get_current ();
+ this->consumer_control_period_ = ACE_OS::atoi (opt);
+ arg_shifter.consume_arg ();
+ }
+ }
+
+ else if (ACE_OS::strcasecmp (arg, ACE_TEXT("-ECSupplierControlPeriod")) == 0)
+ {
+ arg_shifter.consume_arg ();
+
+ if (arg_shifter.is_parameter_next ())
+ {
+ const ACE_TCHAR* opt = arg_shifter.get_current ();
+ this->supplier_control_period_ = ACE_OS::atoi (opt);
+ arg_shifter.consume_arg ();
+ }
+ }
+
+ else if (ACE_OS::strcasecmp (arg, ACE_TEXT("-ECConsumerControlTimeout")) == 0)
+ {
+ arg_shifter.consume_arg ();
+
+ if (arg_shifter.is_parameter_next ())
+ {
+ const ACE_TCHAR* opt = arg_shifter.get_current ();
+ unsigned long timeout = ACE_OS::strtoul(opt, 0, 10);
+ this->consumer_control_timeout_.usec(timeout);
+ arg_shifter.consume_arg ();
+ }
+ }
+
+ else if (ACE_OS::strcasecmp (arg, ACE_TEXT("-ECSupplierControlTimeout")) == 0)
+ {
+ arg_shifter.consume_arg ();
+
+ if (arg_shifter.is_parameter_next ())
+ {
+ const ACE_TCHAR* opt = arg_shifter.get_current ();
+ unsigned long timeout = ACE_OS::strtoul(opt, 0, 10);
+ this->supplier_control_timeout_.usec(timeout);
+ arg_shifter.consume_arg ();
+ }
+ }
+
+ else if (ACE_OS::strcasecmp (arg, ACE_TEXT("-ECConsumerValidateConnection")) == 0)
+ {
+ arg_shifter.consume_arg ();
+
+ if (arg_shifter.is_parameter_next ())
+ {
+ const ACE_TCHAR* opt = arg_shifter.get_current ();
+ this->consumer_validate_connection_ = ACE_OS::atoi (opt);
+ arg_shifter.consume_arg ();
+ }
+ }
+
+ else if (ACE_OS::strcasecmp (arg, ACE_TEXT("-ECPushSupplierSet")) == 0)
+ {
+ ACE_ERROR ((LM_ERROR,
+ "EC_Default_Factory - "
+ "obsolete option <%s>, ignored\n", arg));
+ arg_shifter.consume_arg ();
+ }
+
+ else if (ACE_OS::strcasecmp (arg, ACE_TEXT("-ECQueueFullServiceObject")) == 0)
+ {
+ arg_shifter.consume_arg ();
+ if (arg_shifter.is_parameter_next ())
+ {
+ const char* opt = arg_shifter.get_current ();
+ this->queue_full_service_object_name_.set(opt);
+ arg_shifter.consume_arg ();
+ }
+ }
+
+ else if (ACE_OS::strcasecmp (arg, ACE_TEXT("-ECConsumerAdminLock")) == 0)
+ {
+ ACE_ERROR ((LM_ERROR,
+ "EC_Default_Factory - "
+ "obsolete option <%s>, ignored\n", arg));
+ arg_shifter.consume_arg ();
+ }
+
+ else if (ACE_OS::strcasecmp (arg, ACE_TEXT("-ECSupplierAdminLock")) == 0)
+ {
+ ACE_ERROR ((LM_ERROR,
+ "EC_Default_Factory - "
+ "obsolete option <%s>, ignored\n", arg));
+ arg_shifter.consume_arg ();
+ }
+
+ else if (ACE_OS::strncmp (arg, ACE_TEXT("-EC"), 3) == 0)
+ {
+ arg_shifter.consume_arg ();
+ ACE_ERROR ((LM_ERROR,
+ "EC_Default_Factory - "
+ "unknown option <%s>\n",
+ arg));
+ }
+ else
+ {
+ arg_shifter.consume_arg ();
+ ACE_DEBUG ((LM_DEBUG,
+ "EC_Default_Factory - "
+ "ignoring option <%s>\n",
+ arg));
+ }
+ }
+ return 0;
+}
+
+int
+TAO_EC_Default_Factory::fini (void)
+{
+ return 0;
+}
+
+// ****************************************************************
+
+TAO_EC_Queue_Full_Service_Object*
+TAO_EC_Default_Factory::find_service_object (const char* wanted,
+ const char* fallback)
+{
+ TAO_EC_Queue_Full_Service_Object* so = 0;
+ so = ACE_Dynamic_Service<TAO_EC_Queue_Full_Service_Object>::instance (wanted);
+ if (so != 0)
+ return so;
+
+ ACE_ERROR ((LM_ERROR,
+ "EC (%P|%t) EC_Default_Factory::create_dispatching "
+ "unable to find queue full service object '%s'; "
+ "using '%s' instead\n",
+ wanted,
+ fallback));
+
+ so = ACE_Dynamic_Service<TAO_EC_Queue_Full_Service_Object>::instance (fallback);
+ if (so != 0)
+ return so;
+
+ ACE_ERROR ((LM_ERROR,
+ "EC (%P|%t) EC_Default_Factory::create_dispatching "
+ "unable find default queue full service object '%s'; "
+ "aborting.\n",
+ fallback));
+ ACE_OS::abort ();
+ return 0; // superfluous return to de-warn; we should never reach here
+}
+
+TAO_EC_Dispatching*
+TAO_EC_Default_Factory::create_dispatching (TAO_EC_Event_Channel_Base *)
+{
+ if (this->dispatching_ == 0)
+ return new TAO_EC_Reactive_Dispatching ();
+ else if (this->dispatching_ == 1)
+ {
+ TAO_EC_Queue_Full_Service_Object* so =
+ this->find_service_object (this->queue_full_service_object_name_.fast_rep(),
+ TAO_EC_DEFAULT_QUEUE_FULL_SERVICE_OBJECT_NAME);
+ return new TAO_EC_MT_Dispatching (this->dispatching_threads_,
+ this->dispatching_threads_flags_,
+ this->dispatching_threads_priority_,
+ this->dispatching_threads_force_active_,
+ so);
+ }
+ return 0;
+}
+
+void
+TAO_EC_Default_Factory::destroy_dispatching (TAO_EC_Dispatching *x)
+{
+ delete x;
+}
+
+TAO_EC_Filter_Builder*
+TAO_EC_Default_Factory::create_filter_builder (TAO_EC_Event_Channel_Base *ec)
+{
+ if (this->filtering_ == 0)
+ return new TAO_EC_Null_Filter_Builder ();
+ else if (this->filtering_ == 1)
+ return new TAO_EC_Basic_Filter_Builder (ec);
+ else if (this->filtering_ == 2)
+ return new TAO_EC_Prefix_Filter_Builder (ec);
+ return 0;
+}
+
+void
+TAO_EC_Default_Factory::destroy_filter_builder (TAO_EC_Filter_Builder *x)
+{
+ delete x;
+}
+
+TAO_EC_Supplier_Filter_Builder*
+TAO_EC_Default_Factory::create_supplier_filter_builder (TAO_EC_Event_Channel_Base *ec)
+{
+ if (this->supplier_filtering_ == 0)
+ return new TAO_EC_Trivial_Supplier_Filter_Builder (ec);
+ else if (this->supplier_filtering_ == 1)
+ return new TAO_EC_Per_Supplier_Filter_Builder (ec);
+ return 0;
+}
+
+void
+TAO_EC_Default_Factory::destroy_supplier_filter_builder (TAO_EC_Supplier_Filter_Builder *x)
+{
+ delete x;
+}
+
+TAO_EC_ConsumerAdmin*
+TAO_EC_Default_Factory::create_consumer_admin (TAO_EC_Event_Channel_Base *ec)
+{
+ return new TAO_EC_ConsumerAdmin (ec);
+}
+
+void
+TAO_EC_Default_Factory::destroy_consumer_admin (TAO_EC_ConsumerAdmin *x)
+{
+ delete x;
+}
+
+TAO_EC_SupplierAdmin*
+TAO_EC_Default_Factory::create_supplier_admin (TAO_EC_Event_Channel_Base *ec)
+{
+ return new TAO_EC_SupplierAdmin (ec);
+}
+
+void
+TAO_EC_Default_Factory::destroy_supplier_admin (TAO_EC_SupplierAdmin *x)
+{
+ delete x;
+}
+
+TAO_EC_ProxyPushSupplier*
+TAO_EC_Default_Factory::create_proxy_push_supplier (TAO_EC_Event_Channel_Base *ec)
+{
+ return new TAO_EC_Default_ProxyPushSupplier (ec, consumer_validate_connection_);
+}
+
+void
+TAO_EC_Default_Factory::destroy_proxy_push_supplier (TAO_EC_ProxyPushSupplier *x)
+{
+ delete x;
+}
+
+TAO_EC_ProxyPushConsumer*
+TAO_EC_Default_Factory::create_proxy_push_consumer (TAO_EC_Event_Channel_Base *ec)
+{
+ return new TAO_EC_Default_ProxyPushConsumer (ec);
+}
+
+void
+TAO_EC_Default_Factory::destroy_proxy_push_consumer (TAO_EC_ProxyPushConsumer *x)
+{
+ delete x;
+}
+
+TAO_EC_Timeout_Generator*
+TAO_EC_Default_Factory::create_timeout_generator (TAO_EC_Event_Channel_Base *)
+{
+ if (this->timeout_ == 0)
+ {
+ int argc = 0;
+ char **argv = 0;
+ CORBA::ORB_var orb =
+ CORBA::ORB_init (argc, argv, this->orbid_.c_str ());
+
+ ACE_Reactor *reactor = orb->orb_core ()->reactor ();
+ return new TAO_EC_Reactive_Timeout_Generator (reactor);
+ }
+#if 0
+ else if (this->timeout_ == 1)
+ {
+ }
+#endif
+ return 0;
+}
+
+void
+TAO_EC_Default_Factory::destroy_timeout_generator (TAO_EC_Timeout_Generator *x)
+{
+ delete x;
+}
+
+TAO_EC_ObserverStrategy*
+TAO_EC_Default_Factory::create_observer_strategy (TAO_EC_Event_Channel_Base *ec)
+{
+ if (this->observer_ == 0)
+ return new TAO_EC_Null_ObserverStrategy;
+ else if (this->observer_ == 1)
+ {
+ // @@ The lock should also be under control of the user...
+ ACE_Lock* lock = 0;
+ ACE_NEW_RETURN (lock, ACE_Lock_Adapter<TAO_SYNCH_MUTEX>, 0);
+ return new TAO_EC_Basic_ObserverStrategy (ec, lock);
+ }
+ else if (this->observer_ == 2)
+ {
+ // @@ The lock should also be under control of the user...
+ ACE_Lock* lock = 0;
+ ACE_NEW_RETURN (lock, ACE_Lock_Adapter<TAO_SYNCH_MUTEX>, 0);
+ return new TAO_EC_Reactive_ObserverStrategy (ec, lock);
+ }
+ return 0;
+}
+
+void
+TAO_EC_Default_Factory::destroy_observer_strategy (TAO_EC_ObserverStrategy *x)
+{
+ delete x;
+}
+
+TAO_EC_Scheduling_Strategy*
+TAO_EC_Default_Factory::create_scheduling_strategy (TAO_EC_Event_Channel_Base*)
+{
+ if (this->scheduling_ == 0)
+ return new TAO_EC_Null_Scheduling;
+ else if (this->scheduling_ == 1)
+ return new TAO_EC_Group_Scheduling;
+ return 0;
+}
+
+void
+TAO_EC_Default_Factory::destroy_scheduling_strategy (TAO_EC_Scheduling_Strategy* x)
+{
+ delete x;
+}
+
+// These typedefs workaround a SunCC 4.2 bug
+typedef
+ TAO_ESF_Proxy_List<TAO_EC_ProxyPushConsumer>::Iterator
+ TAO_EC_Consumer_List_Iterator;
+typedef
+ TAO_ESF_Proxy_RB_Tree<TAO_EC_ProxyPushConsumer>::Iterator
+ TAO_EC_Consumer_RB_Tree_Iterator;
+typedef
+ TAO_ESF_Proxy_List<TAO_EC_ProxyPushSupplier>::Iterator
+ TAO_EC_Supplier_List_Iterator;
+typedef
+ TAO_ESF_Proxy_RB_Tree<TAO_EC_ProxyPushSupplier>::Iterator
+ TAO_EC_Supplier_RB_Tree_Iterator;
+
+
+TAO_EC_ProxyPushConsumer_Collection*
+TAO_EC_Default_Factory::create_proxy_push_consumer_collection (TAO_EC_Event_Channel_Base *)
+{
+ if (this->consumer_collection_ == 0x000)
+ return new TAO_ESF_Immediate_Changes<TAO_EC_ProxyPushConsumer,
+ TAO_ESF_Proxy_List<TAO_EC_ProxyPushConsumer>,
+ TAO_EC_Consumer_List_Iterator,
+ TAO_SYNCH_MUTEX> ();
+ else if (this->consumer_collection_ == 0x001)
+ return new TAO_ESF_Copy_On_Read<TAO_EC_ProxyPushConsumer,
+ TAO_ESF_Proxy_List<TAO_EC_ProxyPushConsumer>,
+ TAO_EC_Consumer_List_Iterator,
+ TAO_SYNCH_MUTEX> ();
+ else if (this->consumer_collection_ == 0x002)
+ return new TAO_ESF_Copy_On_Write<TAO_EC_ProxyPushConsumer,
+ TAO_ESF_Proxy_List<TAO_EC_ProxyPushConsumer>,
+ TAO_EC_Consumer_List_Iterator,
+ ACE_SYNCH> ();
+ else if (this->consumer_collection_ == 0x003)
+ return new TAO_ESF_Delayed_Changes<TAO_EC_ProxyPushConsumer,
+ TAO_ESF_Proxy_List<TAO_EC_ProxyPushConsumer>,
+ TAO_EC_Consumer_List_Iterator,
+ ACE_SYNCH> ();
+ else if (this->consumer_collection_ == 0x010)
+ return new TAO_ESF_Immediate_Changes<TAO_EC_ProxyPushConsumer,
+ TAO_ESF_Proxy_RB_Tree<TAO_EC_ProxyPushConsumer>,
+ TAO_EC_Consumer_RB_Tree_Iterator,
+ TAO_SYNCH_MUTEX> ();
+ else if (this->consumer_collection_ == 0x011)
+ return new TAO_ESF_Copy_On_Read<TAO_EC_ProxyPushConsumer,
+ TAO_ESF_Proxy_RB_Tree<TAO_EC_ProxyPushConsumer>,
+ TAO_EC_Consumer_RB_Tree_Iterator,
+ TAO_SYNCH_MUTEX> ();
+ else if (this->consumer_collection_ == 0x012)
+ return new TAO_ESF_Copy_On_Write<TAO_EC_ProxyPushConsumer,
+ TAO_ESF_Proxy_RB_Tree<TAO_EC_ProxyPushConsumer>,
+ TAO_EC_Consumer_RB_Tree_Iterator,
+ ACE_SYNCH> ();
+ else if (this->consumer_collection_ == 0x013)
+ return new TAO_ESF_Delayed_Changes<TAO_EC_ProxyPushConsumer,
+ TAO_ESF_Proxy_RB_Tree<TAO_EC_ProxyPushConsumer>,
+ TAO_EC_Consumer_RB_Tree_Iterator,
+ ACE_SYNCH> ();
+ else if (this->consumer_collection_ == 0x100)
+ return new TAO_ESF_Immediate_Changes<TAO_EC_ProxyPushConsumer,
+ TAO_ESF_Proxy_List<TAO_EC_ProxyPushConsumer>,
+ TAO_EC_Consumer_List_Iterator,
+ ACE_Null_Mutex> ();
+ else if (this->consumer_collection_ == 0x101)
+ return new TAO_ESF_Copy_On_Read<TAO_EC_ProxyPushConsumer,
+ TAO_ESF_Proxy_List<TAO_EC_ProxyPushConsumer>,
+ TAO_EC_Consumer_List_Iterator,
+ ACE_Null_Mutex> ();
+ else if (this->consumer_collection_ == 0x102)
+ return new TAO_ESF_Copy_On_Write<TAO_EC_ProxyPushConsumer,
+ TAO_ESF_Proxy_List<TAO_EC_ProxyPushConsumer>,
+ TAO_EC_Consumer_List_Iterator,
+ ACE_NULL_SYNCH> ();
+ else if (this->consumer_collection_ == 0x103)
+ return new TAO_ESF_Delayed_Changes<TAO_EC_ProxyPushConsumer,
+ TAO_ESF_Proxy_List<TAO_EC_ProxyPushConsumer>,
+ TAO_EC_Consumer_List_Iterator,
+ ACE_NULL_SYNCH> ();
+ else if (this->consumer_collection_ == 0x110)
+ return new TAO_ESF_Immediate_Changes<TAO_EC_ProxyPushConsumer,
+ TAO_ESF_Proxy_RB_Tree<TAO_EC_ProxyPushConsumer>,
+ TAO_EC_Consumer_RB_Tree_Iterator,
+ ACE_Null_Mutex> ();
+ else if (this->consumer_collection_ == 0x111)
+ return new TAO_ESF_Copy_On_Read<TAO_EC_ProxyPushConsumer,
+ TAO_ESF_Proxy_RB_Tree<TAO_EC_ProxyPushConsumer>,
+ TAO_EC_Consumer_RB_Tree_Iterator,
+ ACE_Null_Mutex> ();
+ else if (this->consumer_collection_ == 0x112)
+ return new TAO_ESF_Copy_On_Write<TAO_EC_ProxyPushConsumer,
+ TAO_ESF_Proxy_RB_Tree<TAO_EC_ProxyPushConsumer>,
+ TAO_EC_Consumer_RB_Tree_Iterator,
+ ACE_NULL_SYNCH> ();
+ else if (this->consumer_collection_ == 0x113)
+ return new TAO_ESF_Delayed_Changes<TAO_EC_ProxyPushConsumer,
+ TAO_ESF_Proxy_RB_Tree<TAO_EC_ProxyPushConsumer>,
+ TAO_EC_Consumer_RB_Tree_Iterator,
+ ACE_NULL_SYNCH> ();
+
+ return 0;
+}
+
+void
+TAO_EC_Default_Factory::destroy_proxy_push_consumer_collection (TAO_EC_ProxyPushConsumer_Collection *x)
+{
+ delete x;
+}
+
+TAO_EC_ProxyPushSupplier_Collection*
+TAO_EC_Default_Factory::create_proxy_push_supplier_collection (TAO_EC_Event_Channel_Base *)
+{
+ if (this->supplier_collection_ == 0x000)
+ return new TAO_ESF_Immediate_Changes<TAO_EC_ProxyPushSupplier,
+ TAO_ESF_Proxy_List<TAO_EC_ProxyPushSupplier>,
+ TAO_EC_Supplier_List_Iterator,
+ TAO_SYNCH_MUTEX> ();
+ else if (this->supplier_collection_ == 0x001)
+ return new TAO_ESF_Copy_On_Read<TAO_EC_ProxyPushSupplier,
+ TAO_ESF_Proxy_List<TAO_EC_ProxyPushSupplier>,
+ TAO_EC_Supplier_List_Iterator,
+ TAO_SYNCH_MUTEX> ();
+ else if (this->supplier_collection_ == 0x002)
+ return new TAO_ESF_Copy_On_Write<TAO_EC_ProxyPushSupplier,
+ TAO_ESF_Proxy_List<TAO_EC_ProxyPushSupplier>,
+ TAO_EC_Supplier_List_Iterator,
+ ACE_SYNCH> ();
+ else if (this->supplier_collection_ == 0x003)
+ return new TAO_ESF_Delayed_Changes<TAO_EC_ProxyPushSupplier,
+ TAO_ESF_Proxy_List<TAO_EC_ProxyPushSupplier>,
+ TAO_EC_Supplier_List_Iterator,
+ ACE_SYNCH> ();
+ else if (this->supplier_collection_ == 0x010)
+ return new TAO_ESF_Immediate_Changes<TAO_EC_ProxyPushSupplier,
+ TAO_ESF_Proxy_RB_Tree<TAO_EC_ProxyPushSupplier>,
+ TAO_EC_Supplier_RB_Tree_Iterator,
+ TAO_SYNCH_MUTEX> ();
+ else if (this->supplier_collection_ == 0x011)
+ return new TAO_ESF_Copy_On_Read<TAO_EC_ProxyPushSupplier,
+ TAO_ESF_Proxy_RB_Tree<TAO_EC_ProxyPushSupplier>,
+ TAO_EC_Supplier_RB_Tree_Iterator,
+ TAO_SYNCH_MUTEX> ();
+ else if (this->supplier_collection_ == 0x012)
+ return new TAO_ESF_Copy_On_Write<TAO_EC_ProxyPushSupplier,
+ TAO_ESF_Proxy_RB_Tree<TAO_EC_ProxyPushSupplier>,
+ TAO_EC_Supplier_RB_Tree_Iterator,
+ ACE_SYNCH> ();
+ else if (this->supplier_collection_ == 0x013)
+ return new TAO_ESF_Delayed_Changes<TAO_EC_ProxyPushSupplier,
+ TAO_ESF_Proxy_RB_Tree<TAO_EC_ProxyPushSupplier>,
+ TAO_EC_Supplier_RB_Tree_Iterator,
+ ACE_SYNCH> ();
+ else if (this->supplier_collection_ == 0x100)
+ return new TAO_ESF_Immediate_Changes<TAO_EC_ProxyPushSupplier,
+ TAO_ESF_Proxy_List<TAO_EC_ProxyPushSupplier>,
+ TAO_EC_Supplier_List_Iterator,
+ ACE_Null_Mutex> ();
+ else if (this->supplier_collection_ == 0x101)
+ return new TAO_ESF_Copy_On_Read<TAO_EC_ProxyPushSupplier,
+ TAO_ESF_Proxy_List<TAO_EC_ProxyPushSupplier>,
+ TAO_EC_Supplier_List_Iterator,
+ ACE_Null_Mutex> ();
+ else if (this->supplier_collection_ == 0x102)
+ return new TAO_ESF_Copy_On_Write<TAO_EC_ProxyPushSupplier,
+ TAO_ESF_Proxy_List<TAO_EC_ProxyPushSupplier>,
+ TAO_EC_Supplier_List_Iterator,
+ ACE_NULL_SYNCH> ();
+ else if (this->supplier_collection_ == 0x103)
+ return new TAO_ESF_Delayed_Changes<TAO_EC_ProxyPushSupplier,
+ TAO_ESF_Proxy_List<TAO_EC_ProxyPushSupplier>,
+ TAO_EC_Supplier_List_Iterator,
+ ACE_NULL_SYNCH> ();
+ else if (this->supplier_collection_ == 0x110)
+ return new TAO_ESF_Immediate_Changes<TAO_EC_ProxyPushSupplier,
+ TAO_ESF_Proxy_RB_Tree<TAO_EC_ProxyPushSupplier>,
+ TAO_EC_Supplier_RB_Tree_Iterator,
+ ACE_Null_Mutex> ();
+ else if (this->supplier_collection_ == 0x111)
+ return new TAO_ESF_Copy_On_Read<TAO_EC_ProxyPushSupplier,
+ TAO_ESF_Proxy_RB_Tree<TAO_EC_ProxyPushSupplier>,
+ TAO_EC_Supplier_RB_Tree_Iterator,
+ ACE_Null_Mutex> ();
+ else if (this->supplier_collection_ == 0x112)
+ return new TAO_ESF_Copy_On_Write<TAO_EC_ProxyPushSupplier,
+ TAO_ESF_Proxy_RB_Tree<TAO_EC_ProxyPushSupplier>,
+ TAO_EC_Supplier_RB_Tree_Iterator,
+ ACE_NULL_SYNCH> ();
+ else if (this->supplier_collection_ == 0x113)
+ return new TAO_ESF_Delayed_Changes<TAO_EC_ProxyPushSupplier,
+ TAO_ESF_Proxy_RB_Tree<TAO_EC_ProxyPushSupplier>,
+ TAO_EC_Supplier_RB_Tree_Iterator,
+ ACE_NULL_SYNCH> ();
+
+ return 0;
+}
+
+void
+TAO_EC_Default_Factory::destroy_proxy_push_supplier_collection (TAO_EC_ProxyPushSupplier_Collection *x)
+{
+ delete x;
+}
+
+ACE_Lock*
+TAO_EC_Default_Factory::create_consumer_lock (void)
+{
+ if (this->consumer_lock_ == 0)
+ return new ACE_Lock_Adapter<ACE_Null_Mutex>;
+ else if (this->consumer_lock_ == 1)
+ return new ACE_Lock_Adapter<TAO_SYNCH_MUTEX> ();
+ else if (this->consumer_lock_ == 2)
+ return new ACE_Lock_Adapter<TAO_SYNCH_RECURSIVE_MUTEX> ();
+ return 0;
+}
+
+void
+TAO_EC_Default_Factory::destroy_consumer_lock (ACE_Lock* x)
+{
+ delete x;
+}
+
+ACE_Lock*
+TAO_EC_Default_Factory::create_supplier_lock (void)
+{
+ if (this->supplier_lock_ == 0)
+ return new ACE_Lock_Adapter<ACE_Null_Mutex>;
+ else if (this->supplier_lock_ == 1)
+ return new ACE_Lock_Adapter<TAO_SYNCH_MUTEX> ();
+ else if (this->supplier_lock_ == 2)
+ return new ACE_Lock_Adapter<TAO_SYNCH_RECURSIVE_MUTEX> ();
+ return 0;
+}
+
+void
+TAO_EC_Default_Factory::destroy_supplier_lock (ACE_Lock* x)
+{
+ delete x;
+}
+
+TAO_EC_ConsumerControl*
+TAO_EC_Default_Factory::create_consumer_control (TAO_EC_Event_Channel_Base* ec)
+{
+ if (this->consumer_control_ == 0)
+ return new TAO_EC_ConsumerControl ();
+ else if (this->consumer_control_ == 1)
+ {
+ int argc = 0;
+ char **argv = 0;
+ CORBA::ORB_var orb =
+ CORBA::ORB_init (argc, argv, this->orbid_.c_str ());
+
+ ACE_Time_Value rate (0, this->consumer_control_period_);
+ return new TAO_EC_Reactive_ConsumerControl (rate, consumer_control_timeout_, ec, orb.in ());
+ }
+ return 0;
+}
+
+void
+TAO_EC_Default_Factory::destroy_consumer_control (TAO_EC_ConsumerControl* x)
+{
+ delete x;
+}
+
+TAO_EC_SupplierControl*
+TAO_EC_Default_Factory::create_supplier_control (TAO_EC_Event_Channel_Base* ec)
+{
+ if (this->supplier_control_ == 0)
+ return new TAO_EC_SupplierControl ();
+ else if (this->supplier_control_ == 1)
+ {
+ int argc = 0;
+ char **argv = 0;
+ CORBA::ORB_var orb =
+ CORBA::ORB_init (argc, argv, this->orbid_.c_str ());
+
+ ACE_Time_Value rate (0, this->supplier_control_period_);
+ return new TAO_EC_Reactive_SupplierControl (rate, supplier_control_timeout_, ec, orb.in ());
+ }
+ return 0;
+}
+
+void
+TAO_EC_Default_Factory::destroy_supplier_control (TAO_EC_SupplierControl* x)
+{
+ delete x;
+}
+
+TAO_END_VERSIONED_NAMESPACE_DECL
+
+// ****************************************************************
+
+ACE_STATIC_SVC_DEFINE (TAO_EC_Default_Factory,
+ ACE_TEXT ("EC_Factory"),
+ ACE_SVC_OBJ_T,
+ &ACE_SVC_NAME (TAO_EC_Default_Factory),
+ ACE_Service_Type::DELETE_THIS | ACE_Service_Type::DELETE_OBJ,
+ 0)
+ACE_FACTORY_DEFINE (TAO_RTEvent_Serv, TAO_EC_Default_Factory)
diff --git a/TAO/orbsvcs/orbsvcs/Event/EC_Default_Factory.h b/TAO/orbsvcs/orbsvcs/Event/EC_Default_Factory.h
new file mode 100644
index 00000000000..a5bce5d5df3
--- /dev/null
+++ b/TAO/orbsvcs/orbsvcs/Event/EC_Default_Factory.h
@@ -0,0 +1,201 @@
+/* -*- C++ -*- */
+/**
+ * @file EC_Default_Factory.h
+ *
+ * $Id$
+ *
+ * @author Carlos O'Ryan (coryan@cs.wustl.edu)
+ *
+ * Based on previous work by Tim Harrison (harrison@cs.wustl.edu) and
+ * other members of the DOC group. More details can be found in:
+ *
+ * http://doc.ece.uci.edu/~coryan/EC/index.html
+ */
+
+#ifndef TAO_EC_DEFAULT_FACTORY_H
+#define TAO_EC_DEFAULT_FACTORY_H
+
+#include /**/ "ace/pre.h"
+
+#include "orbsvcs/Event/EC_Factory.h"
+
+#if !defined (ACE_LACKS_PRAGMA_ONCE)
+# pragma once
+#endif /* ACE_LACKS_PRAGMA_ONCE */
+
+#include "orbsvcs/Event/EC_Defaults.h"
+
+#include "ace/Service_Config.h"
+#include "ace/SString.h"
+#include "ace/Time_Value.h"
+
+TAO_BEGIN_VERSIONED_NAMESPACE_DECL
+
+class TAO_EC_Queue_Full_Service_Object;
+
+/**
+ * @class TAO_EC_Default_Factory
+ *
+ * @brief A generic factory for EC experimentation.
+ *
+ * This class allows the user to experiment with different EC
+ * configurations. Using a command-line like interface the user
+ * can specify which strategies will this factory generate.
+ * Since the class can be dynamically loaded the strategies can be
+ * set in the service configurator file.
+ */
+class TAO_RTEvent_Serv_Export TAO_EC_Default_Factory : public TAO_EC_Factory
+{
+public:
+ /// Constructor
+ TAO_EC_Default_Factory (void);
+
+ /// destructor...
+ virtual ~TAO_EC_Default_Factory (void);
+
+ /// Helper function to register the default factory into the service
+ /// configurator.
+ static int init_svcs (void);
+
+ // = The Service_Object entry points
+ virtual int init (int argc, ACE_TCHAR* argv[]);
+ virtual int fini (void);
+
+ // = The EC_Factory methods
+ virtual TAO_EC_Dispatching*
+ create_dispatching (TAO_EC_Event_Channel_Base*);
+ virtual void
+ destroy_dispatching (TAO_EC_Dispatching*);
+ virtual TAO_EC_Filter_Builder*
+ create_filter_builder (TAO_EC_Event_Channel_Base*);
+ virtual void
+ destroy_filter_builder (TAO_EC_Filter_Builder*);
+ virtual TAO_EC_Supplier_Filter_Builder*
+ create_supplier_filter_builder (TAO_EC_Event_Channel_Base*);
+ virtual void
+ destroy_supplier_filter_builder (TAO_EC_Supplier_Filter_Builder*);
+ virtual TAO_EC_ConsumerAdmin*
+ create_consumer_admin (TAO_EC_Event_Channel_Base*);
+ virtual void
+ destroy_consumer_admin (TAO_EC_ConsumerAdmin*);
+ virtual TAO_EC_SupplierAdmin*
+ create_supplier_admin (TAO_EC_Event_Channel_Base*);
+ virtual void
+ destroy_supplier_admin (TAO_EC_SupplierAdmin*);
+ virtual TAO_EC_ProxyPushSupplier*
+ create_proxy_push_supplier (TAO_EC_Event_Channel_Base*);
+ virtual void
+ destroy_proxy_push_supplier (TAO_EC_ProxyPushSupplier*);
+ virtual TAO_EC_ProxyPushConsumer*
+ create_proxy_push_consumer (TAO_EC_Event_Channel_Base*);
+ virtual void
+ destroy_proxy_push_consumer (TAO_EC_ProxyPushConsumer*);
+ virtual TAO_EC_Timeout_Generator*
+ create_timeout_generator (TAO_EC_Event_Channel_Base*);
+ virtual void
+ destroy_timeout_generator (TAO_EC_Timeout_Generator*);
+ virtual TAO_EC_ObserverStrategy*
+ create_observer_strategy (TAO_EC_Event_Channel_Base*);
+ virtual void
+ destroy_observer_strategy (TAO_EC_ObserverStrategy*);
+ virtual TAO_EC_Scheduling_Strategy*
+ create_scheduling_strategy (TAO_EC_Event_Channel_Base*);
+ virtual void
+ destroy_scheduling_strategy (TAO_EC_Scheduling_Strategy*);
+ virtual TAO_EC_ProxyPushConsumer_Collection*
+ create_proxy_push_consumer_collection (TAO_EC_Event_Channel_Base*);
+ virtual void
+ destroy_proxy_push_consumer_collection (TAO_EC_ProxyPushConsumer_Collection*);
+ virtual TAO_EC_ProxyPushSupplier_Collection*
+ create_proxy_push_supplier_collection (TAO_EC_Event_Channel_Base*);
+ virtual void
+ destroy_proxy_push_supplier_collection (TAO_EC_ProxyPushSupplier_Collection*);
+
+ virtual ACE_Lock* create_consumer_lock (void);
+ virtual void destroy_consumer_lock (ACE_Lock*);
+ virtual ACE_Lock* create_supplier_lock (void);
+ virtual void destroy_supplier_lock (ACE_Lock*);
+
+ virtual TAO_EC_ConsumerControl*
+ create_consumer_control (TAO_EC_Event_Channel_Base*);
+ virtual void
+ destroy_consumer_control (TAO_EC_ConsumerControl*);
+ virtual TAO_EC_SupplierControl*
+ create_supplier_control (TAO_EC_Event_Channel_Base*);
+ virtual void
+ destroy_supplier_control (TAO_EC_SupplierControl*);
+
+ /// Accessors to consumer collection flags
+ int consumer_collection (void) const;
+
+ /// Accessors to supplier collection flags
+ int supplier_collection (void) const;
+
+ /// Accessors to supplier filtering flags
+ int supplier_filtering (void) const;
+
+ /// Accessor to ORBid
+ const ACE_CString& orb_id (void) const;
+protected:
+
+ /// Helper for agrument parsing. Prints out an error message about
+ /// unsupported option value.
+ void unsupported_option_value (const char * option_name,
+ const char * option_value);
+
+protected:
+ /// Several flags to control the kind of object created.
+ int dispatching_;
+ int filtering_;
+ int supplier_filtering_;
+ int timeout_;
+ int observer_;
+ int scheduling_;
+ int consumer_collection_;
+ int supplier_collection_;
+ int consumer_lock_;
+ int supplier_lock_;
+
+ /// The MT dispatching priority has several arguments that could be
+ /// controlled here...
+ int dispatching_threads_;
+ int dispatching_threads_flags_;
+ int dispatching_threads_priority_;
+ int dispatching_threads_force_active_;
+ ACE_CString queue_full_service_object_name_;
+ TAO_EC_Queue_Full_Service_Object* find_service_object (const char* wanted,
+ const char* fallback);
+
+ /// Use this ORB to locate global resources.
+ ACE_CString orbid_;
+
+ /// The consumer and supplier control policies.
+ int consumer_control_;
+ int supplier_control_;
+
+ /// The consumer and supplier control periods in usecs
+ int consumer_control_period_;
+ int supplier_control_period_;
+
+ /// The consumer control timeout in usecs
+ ACE_Time_Value consumer_control_timeout_;
+
+ /// The supplier control timeout in usecs
+ ACE_Time_Value supplier_control_timeout_;
+
+ /// Validate the connection to consumer on connect
+ int consumer_validate_connection_;
+};
+
+TAO_END_VERSIONED_NAMESPACE_DECL
+
+#if defined (__ACE_INLINE__)
+#include "orbsvcs/Event/EC_Default_Factory.i"
+#endif /* __ACE_INLINE__ */
+
+ACE_STATIC_SVC_DECLARE (TAO_EC_Default_Factory)
+ACE_FACTORY_DECLARE (TAO_RTEvent_Serv, TAO_EC_Default_Factory)
+
+#include /**/ "ace/post.h"
+
+#endif /* TAO_EC_DEFAULT_FACTORY_H */
diff --git a/TAO/orbsvcs/orbsvcs/Event/EC_Default_Factory.i b/TAO/orbsvcs/orbsvcs/Event/EC_Default_Factory.i
new file mode 100644
index 00000000000..2564cd3b0c5
--- /dev/null
+++ b/TAO/orbsvcs/orbsvcs/Event/EC_Default_Factory.i
@@ -0,0 +1,59 @@
+// -*- C++ -*-
+//
+// $Id$
+
+TAO_BEGIN_VERSIONED_NAMESPACE_DECL
+
+ACE_INLINE
+TAO_EC_Default_Factory::TAO_EC_Default_Factory (void)
+ : dispatching_ (TAO_EC_DEFAULT_DISPATCHING),
+ filtering_ (TAO_EC_DEFAULT_CONSUMER_FILTER),
+ supplier_filtering_ (TAO_EC_DEFAULT_SUPPLIER_FILTER),
+ timeout_ (TAO_EC_DEFAULT_TIMEOUT),
+ observer_ (TAO_EC_DEFAULT_OBSERVER),
+ scheduling_ (TAO_EC_DEFAULT_SCHEDULING),
+ consumer_collection_ (TAO_EC_DEFAULT_CONSUMER_COLLECTION),
+ supplier_collection_ (TAO_EC_DEFAULT_SUPPLIER_COLLECTION),
+ consumer_lock_ (TAO_EC_DEFAULT_CONSUMER_LOCK),
+ supplier_lock_ (TAO_EC_DEFAULT_SUPPLIER_LOCK),
+ dispatching_threads_ (TAO_EC_DEFAULT_DISPATCHING_THREADS),
+ dispatching_threads_flags_ (TAO_EC_DEFAULT_DISPATCHING_THREADS_FLAGS),
+ dispatching_threads_priority_ (TAO_EC_DEFAULT_DISPATCHING_THREADS_PRIORITY),
+ dispatching_threads_force_active_ (TAO_EC_DEFAULT_DISPATCHING_THREADS_FORCE_ACTIVE),
+ queue_full_service_object_name_ (TAO_EC_DEFAULT_QUEUE_FULL_SERVICE_OBJECT_NAME),
+ orbid_ (TAO_EC_DEFAULT_ORB_ID),
+ consumer_control_ (TAO_EC_DEFAULT_CONSUMER_CONTROL),
+ supplier_control_ (TAO_EC_DEFAULT_SUPPLIER_CONTROL),
+ consumer_control_period_ (TAO_EC_DEFAULT_CONSUMER_CONTROL_PERIOD),
+ supplier_control_period_ (TAO_EC_DEFAULT_SUPPLIER_CONTROL_PERIOD),
+ consumer_control_timeout_ (0, TAO_EC_DEFAULT_CONSUMER_CONTROL_TIMEOUT),
+ supplier_control_timeout_ (0, TAO_EC_DEFAULT_SUPPLIER_CONTROL_TIMEOUT),
+ consumer_validate_connection_ (TAO_EC_DEFAULT_CONSUMER_VALIDATE_CONNECTION)
+{
+}
+
+ACE_INLINE int
+TAO_EC_Default_Factory::consumer_collection (void) const
+{
+ return this->consumer_collection_;
+}
+
+ACE_INLINE int
+TAO_EC_Default_Factory::supplier_collection (void) const
+{
+ return this->supplier_collection_;
+}
+
+ACE_INLINE int
+TAO_EC_Default_Factory::supplier_filtering (void) const
+{
+ return this->supplier_filtering_;
+}
+
+ACE_INLINE const ACE_CString&
+TAO_EC_Default_Factory::orb_id (void) const
+{
+ return this->orbid_;
+}
+
+TAO_END_VERSIONED_NAMESPACE_DECL
diff --git a/TAO/orbsvcs/orbsvcs/Event/EC_Default_ProxyConsumer.cpp b/TAO/orbsvcs/orbsvcs/Event/EC_Default_ProxyConsumer.cpp
new file mode 100644
index 00000000000..e3bca47a2d0
--- /dev/null
+++ b/TAO/orbsvcs/orbsvcs/Event/EC_Default_ProxyConsumer.cpp
@@ -0,0 +1,192 @@
+// $Id$
+
+#include "orbsvcs/Event/EC_Default_ProxyConsumer.h"
+#include "orbsvcs/Event/EC_Event_Channel_Base.h"
+#include "orbsvcs/Event/EC_Supplier_Filter_Builder.h"
+#include "orbsvcs/Event/EC_Supplier_Filter.h"
+#include "ace/Synch_T.h"
+
+ACE_RCSID(Event, EC_Default_ProxyConsumer, "$Id$")
+
+TAO_BEGIN_VERSIONED_NAMESPACE_DECL
+
+typedef ACE_Reverse_Lock<ACE_Lock> TAO_EC_Unlock;
+
+TAO_EC_Default_ProxyPushConsumer::
+ TAO_EC_Default_ProxyPushConsumer (TAO_EC_Event_Channel_Base* ec)
+ : TAO_EC_ProxyPushConsumer (ec)
+{
+}
+
+TAO_EC_Default_ProxyPushConsumer::~TAO_EC_Default_ProxyPushConsumer (void)
+{
+}
+
+void
+TAO_EC_Default_ProxyPushConsumer::connect_push_supplier (
+ RtecEventComm::PushSupplier_ptr push_supplier,
+ const RtecEventChannelAdmin::SupplierQOS& qos
+ ACE_ENV_ARG_DECL)
+ ACE_THROW_SPEC ((CORBA::SystemException,
+ RtecEventChannelAdmin::AlreadyConnected))
+{
+ {
+ ACE_GUARD_THROW_EX (
+ ACE_Lock, ace_mon, *this->lock_,
+ CORBA::INTERNAL ());
+ // @@ RtecEventChannelAdmin::EventChannel::SYNCHRONIZATION_ERROR ());
+ ACE_CHECK;
+
+ if (this->is_connected_i ())
+ {
+ if (this->event_channel_->supplier_reconnect () == 0)
+ ACE_THROW (RtecEventChannelAdmin::AlreadyConnected ());
+
+ // Re-connections are allowed, go ahead and disconnect the
+ // consumer...
+ this->cleanup_i ();
+
+ // @@ Please read the comments in EC_ProxySuppliers about
+ // possible race conditions in this area...
+ TAO_EC_Unlock reverse_lock (*this->lock_);
+
+ {
+ ACE_GUARD_THROW_EX (
+ TAO_EC_Unlock, ace_mon, reverse_lock,
+ CORBA::INTERNAL ());
+ // @@ RtecEventChannelAdmin::EventChannel::SYNCHRONIZATION_ERROR ());
+ ACE_CHECK;
+
+ this->event_channel_->reconnected (this ACE_ENV_ARG_PARAMETER);
+ ACE_CHECK;
+ }
+
+ // A separate thread could have connected siomultaneously,
+ // this is probably an application error, handle it as
+ // gracefully as possible
+ if (this->is_connected_i ())
+ return; // @@ Should we throw
+ }
+
+ this->supplier_ =
+ RtecEventComm::PushSupplier::_duplicate (push_supplier);
+ this->connected_ = 1;
+ this->qos_ = qos;
+
+#if TAO_EC_ENABLE_DEBUG_MESSAGES
+ ACE_DEBUG ((LM_DEBUG,
+ "Building filter for supplier <%x>.\n",
+ this));
+#endif /* TAO_EC_ENABLED_DEBUG_MESSAGES */
+ this->filter_ =
+ this->event_channel_->supplier_filter_builder ()->create (this->qos_);
+ this->filter_->bind (this);
+ }
+
+ // Notify the event channel...
+ this->event_channel_->connected (this ACE_ENV_ARG_PARAMETER);
+}
+
+void
+TAO_EC_Default_ProxyPushConsumer::push (const RtecEventComm::EventSet& event
+ ACE_ENV_ARG_DECL)
+ ACE_THROW_SPEC ((CORBA::SystemException))
+{
+ TAO_EC_ProxyPushConsumer_Guard ace_mon (this->lock_,
+ this->refcount_,
+ this->event_channel_,
+ this);
+ if (!ace_mon.locked ())
+ return;
+
+ ace_mon.filter->push (event, this
+ ACE_ENV_ARG_PARAMETER);
+ ACE_CHECK;
+}
+
+void
+TAO_EC_Default_ProxyPushConsumer::disconnect_push_consumer (
+ ACE_ENV_SINGLE_ARG_DECL)
+ ACE_THROW_SPEC ((CORBA::SystemException))
+{
+ RtecEventComm::PushSupplier_var supplier;
+ int connected = 0;
+
+ {
+ ACE_GUARD_THROW_EX (
+ ACE_Lock, ace_mon, *this->lock_,
+ CORBA::INTERNAL ());
+ // @@ RtecEventChannelAdmin::EventChannel::SYNCHRONIZATION_ERROR ());
+ ACE_CHECK;
+
+ connected = this->is_connected_i ();
+ supplier = this->supplier_._retn ();
+ this->connected_ = 0;
+
+ if (connected)
+ this->cleanup_i ();
+ }
+
+ // Notify the event channel...
+ this->event_channel_->disconnected (this ACE_ENV_ARG_PARAMETER);
+ ACE_CHECK;
+
+ if (CORBA::is_nil (supplier.in ()))
+ {
+ return;
+ }
+
+ if (this->event_channel_->disconnect_callbacks ())
+ {
+ ACE_TRY
+ {
+ supplier->disconnect_push_supplier (ACE_ENV_SINGLE_ARG_PARAMETER);
+ ACE_TRY_CHECK;
+ }
+ ACE_CATCHANY
+ {
+ // Ignore exceptions, we must isolate other clients from
+ // failures on this one.
+ }
+ ACE_ENDTRY;
+ }
+}
+
+PortableServer::POA_ptr
+TAO_EC_Default_ProxyPushConsumer::_default_POA (ACE_ENV_SINGLE_ARG_DECL_NOT_USED)
+{
+ return PortableServer::POA::_duplicate (this->default_POA_.in ());
+}
+
+void
+TAO_EC_Default_ProxyPushConsumer::_add_ref (ACE_ENV_SINGLE_ARG_DECL_NOT_USED)
+{
+ this->_incr_refcnt ();
+}
+
+void
+TAO_EC_Default_ProxyPushConsumer::_remove_ref (ACE_ENV_SINGLE_ARG_DECL_NOT_USED)
+{
+ this->_decr_refcnt ();
+}
+
+void
+TAO_EC_Default_ProxyPushConsumer::activate (
+ RtecEventChannelAdmin::ProxyPushConsumer_ptr &proxy
+ ACE_ENV_ARG_DECL)
+ ACE_THROW_SPEC ((CORBA::SystemException))
+{
+ proxy = this->_this (ACE_ENV_SINGLE_ARG_PARAMETER);
+ ACE_CHECK;
+}
+
+PortableServer::ObjectId
+TAO_EC_Default_ProxyPushConsumer::object_id (ACE_ENV_SINGLE_ARG_DECL)
+ ACE_THROW_SPEC ((CORBA::SystemException))
+{
+ PortableServer::ObjectId_var result =
+ this->default_POA_->servant_to_id (this ACE_ENV_ARG_PARAMETER);
+ return result.in ();
+}
+
+TAO_END_VERSIONED_NAMESPACE_DECL
diff --git a/TAO/orbsvcs/orbsvcs/Event/EC_Default_ProxyConsumer.h b/TAO/orbsvcs/orbsvcs/Event/EC_Default_ProxyConsumer.h
new file mode 100644
index 00000000000..e08d7d4c092
--- /dev/null
+++ b/TAO/orbsvcs/orbsvcs/Event/EC_Default_ProxyConsumer.h
@@ -0,0 +1,85 @@
+// -*- C++ -*-
+
+/**
+ * @file EC_Default_ProxyConsumer.h
+ *
+ * $Id$
+ *
+ * @author Carlos O'Ryan (coryan@cs.wustl.edu)
+ * @author Marina Spivak (marina@atdesk.com)
+ * @author Jason Smith (jason@atdesk.com)
+ *
+ */
+
+#ifndef TAO_EC_DEFAULT_PROXYCONSUMER_H
+#define TAO_EC_DEFAULT_PROXYCONSUMER_H
+
+#include /**/ "ace/pre.h"
+
+#include "orbsvcs/RtecEventChannelAdminS.h"
+
+#if !defined (ACE_LACKS_PRAGMA_ONCE)
+# pragma once
+#endif /* ACE_LACKS_PRAGMA_ONCE */
+
+#include "orbsvcs/Event/EC_ProxyConsumer.h"
+
+TAO_BEGIN_VERSIONED_NAMESPACE_DECL
+
+class TAO_EC_Event_Channel_Base;
+class TAO_EC_ProxyPushSupplier;
+class TAO_EC_Supplier_Filter;
+
+/**
+ * @class TAO_EC_Default_ProxyPushConsumer
+ *
+ * @brief implements RtecEventChannelAdmin::ProxyPushConsumer interface.
+ *
+ */
+class TAO_RTEvent_Serv_Export TAO_EC_Default_ProxyPushConsumer :
+ public POA_RtecEventChannelAdmin::ProxyPushConsumer,
+ public TAO_EC_ProxyPushConsumer
+{
+public:
+
+ /// Constructor...
+ TAO_EC_Default_ProxyPushConsumer (TAO_EC_Event_Channel_Base* event_channel);
+
+ /// Destructor...
+ virtual ~TAO_EC_Default_ProxyPushConsumer (void);
+
+ virtual void activate (
+ RtecEventChannelAdmin::ProxyPushConsumer_ptr &proxy
+ ACE_ENV_ARG_DECL)
+ ACE_THROW_SPEC ((CORBA::SystemException));
+
+ // = The RtecEventChannelAdmin::ProxyPushConsumer methods...
+ virtual void connect_push_supplier (
+ RtecEventComm::PushSupplier_ptr push_supplier,
+ const RtecEventChannelAdmin::SupplierQOS& qos
+ ACE_ENV_ARG_DECL)
+ ACE_THROW_SPEC ((CORBA::SystemException,
+ RtecEventChannelAdmin::AlreadyConnected));
+ virtual void push (const RtecEventComm::EventSet& event
+ ACE_ENV_ARG_DECL)
+ ACE_THROW_SPEC ((CORBA::SystemException));
+ virtual void disconnect_push_consumer (ACE_ENV_SINGLE_ARG_DECL)
+ ACE_THROW_SPEC ((CORBA::SystemException));
+
+ // = The Servant methods
+ virtual PortableServer::POA_ptr _default_POA (ACE_ENV_SINGLE_ARG_DECL);
+ virtual void _add_ref (ACE_ENV_SINGLE_ARG_DECL);
+ virtual void _remove_ref (ACE_ENV_SINGLE_ARG_DECL);
+
+private:
+
+ virtual PortableServer::ObjectId
+ object_id (ACE_ENV_SINGLE_ARG_DECL)
+ ACE_THROW_SPEC ((CORBA::SystemException));
+};
+
+TAO_END_VERSIONED_NAMESPACE_DECL
+
+#include /**/ "ace/post.h"
+
+#endif /* TAO_EC_DEFAULT_PROXYCONSUMER_H */
diff --git a/TAO/orbsvcs/orbsvcs/Event/EC_Default_ProxySupplier.cpp b/TAO/orbsvcs/orbsvcs/Event/EC_Default_ProxySupplier.cpp
new file mode 100644
index 00000000000..a431afb219f
--- /dev/null
+++ b/TAO/orbsvcs/orbsvcs/Event/EC_Default_ProxySupplier.cpp
@@ -0,0 +1,228 @@
+// $Id$
+
+#include "orbsvcs/Event/EC_Default_ProxySupplier.h"
+#include "orbsvcs/Event/EC_Event_Channel_Base.h"
+#include "orbsvcs/Event/EC_Filter_Builder.h"
+
+#include "ace/Reverse_Lock_T.h"
+
+ACE_RCSID (Event,
+ EC_ProxySupplier,
+ "$Id$")
+
+TAO_BEGIN_VERSIONED_NAMESPACE_DECL
+
+typedef ACE_Reverse_Lock<ACE_Lock> TAO_EC_Unlock;
+
+TAO_EC_Default_ProxyPushSupplier::TAO_EC_Default_ProxyPushSupplier (
+ TAO_EC_Event_Channel_Base* ec,
+ int validate_connection)
+ : TAO_EC_ProxyPushSupplier (ec, validate_connection)
+{
+}
+
+TAO_EC_Default_ProxyPushSupplier::~TAO_EC_Default_ProxyPushSupplier (void)
+{
+}
+
+void
+TAO_EC_Default_ProxyPushSupplier::connect_push_consumer (
+ RtecEventComm::PushConsumer_ptr push_consumer,
+ const RtecEventChannelAdmin::ConsumerQOS& qos
+ ACE_ENV_ARG_DECL)
+ ACE_THROW_SPEC ((CORBA::SystemException,
+ RtecEventChannelAdmin::AlreadyConnected,
+ RtecEventChannelAdmin::TypeError))
+{
+ // Nil PushConsumers are illegal
+ if (CORBA::is_nil (push_consumer))
+ ACE_THROW (CORBA::BAD_PARAM ());
+
+ {
+ ACE_GUARD_THROW_EX (
+ ACE_Lock, ace_mon, *this->lock_,
+ CORBA::INTERNAL ());
+ // @@ RtecEventChannelAdmin::EventChannel::SYNCHRONIZATION_ERROR ());
+ ACE_CHECK;
+
+ if (this->is_connected_i ())
+ {
+ if (this->event_channel_->consumer_reconnect () == 0)
+ ACE_THROW (RtecEventChannelAdmin::AlreadyConnected ());
+
+ // Re-connections are allowed....
+ this->cleanup_i ();
+
+ this->consumer_ =
+ RtecEventComm::PushConsumer::_duplicate (push_consumer);
+ this->qos_ = qos;
+ this->child_ =
+ this->event_channel_->filter_builder ()->build (this,
+ this->qos_
+ ACE_ENV_ARG_PARAMETER);
+ ACE_CHECK;
+
+ this->adopt_child (this->child_);
+
+ TAO_EC_Unlock reverse_lock (*this->lock_);
+
+ {
+ ACE_GUARD_THROW_EX (
+ TAO_EC_Unlock, ace_mon, reverse_lock,
+ CORBA::INTERNAL ());
+ // @@ RtecEventChannelAdmin::EventChannel::SYNCHRONIZATION_ERROR ());
+ ACE_CHECK;
+
+ this->event_channel_->reconnected (this ACE_ENV_ARG_PARAMETER);
+ ACE_CHECK;
+ }
+
+ // A separate thread could have connected simultaneously,
+ // this is probably an application error, handle it as
+ // gracefully as possible
+ if (this->is_connected_i ())
+ return; // @@ Should we throw
+ }
+
+#if (TAO_HAS_CORBA_MESSAGING == 1)
+ if ( consumer_validate_connection_ == 1 )
+ {
+ // Validate connection during connect.
+ CORBA::PolicyList_var unused;
+ int status = push_consumer->_validate_connection (unused
+ ACE_ENV_ARG_PARAMETER);
+ ACE_CHECK;
+#if TAO_EC_ENABLE_DEBUG_MESSAGES
+ ACE_DEBUG ((LM_DEBUG, "Validated connection to PushConsumer on connect. Status[%d]\n", status));
+#else
+ ACE_UNUSED_ARG(status);
+#endif /* TAO_EC_ENABLED_DEBUG_MESSAGES */
+ }
+#endif /* TAO_HAS_CORBA_MESSAGING == 1 */
+
+ this->consumer_ =
+ RtecEventComm::PushConsumer::_duplicate (push_consumer);
+ this->qos_ = qos;
+
+#if TAO_EC_ENABLE_DEBUG_MESSAGES
+ ACE_DEBUG ((LM_DEBUG,
+ "Building filters for consumer <%x>.\n",
+ this));
+#endif /* TAO_EC_ENABLED_DEBUG_MESSAGES */
+ this->child_ =
+ this->event_channel_->filter_builder ()->build (this,
+ this->qos_
+ ACE_ENV_ARG_PARAMETER);
+ ACE_CHECK;
+
+ this->adopt_child (this->child_);
+ }
+
+ // Notify the event channel...
+ this->event_channel_->connected (this ACE_ENV_ARG_PARAMETER);
+}
+
+void
+TAO_EC_Default_ProxyPushSupplier::disconnect_push_supplier (
+ ACE_ENV_SINGLE_ARG_DECL)
+ ACE_THROW_SPEC ((CORBA::SystemException))
+{
+ RtecEventComm::PushConsumer_var consumer;
+ int connected = 0;
+
+ {
+ ACE_GUARD_THROW_EX (
+ ACE_Lock, ace_mon, *this->lock_,
+ CORBA::INTERNAL ());
+ // @@ RtecEventChannelAdmin::EventChannel::SYNCHRONIZATION_ERROR ());
+ ACE_CHECK;
+
+ connected = this->is_connected_i ();
+ consumer = this->consumer_._retn ();
+
+ if (connected)
+ this->cleanup_i ();
+ }
+
+ // Notify the event channel....
+ this->event_channel_->disconnected (this ACE_ENV_ARG_PARAMETER);
+ ACE_CHECK;
+
+ if (!connected)
+ {
+ return;
+ }
+
+ if (this->event_channel_->disconnect_callbacks ())
+ {
+ ACE_TRY
+ {
+ consumer->disconnect_push_consumer (ACE_ENV_SINGLE_ARG_PARAMETER);
+ ACE_TRY_CHECK;
+ }
+ ACE_CATCHANY
+ {
+ // Ignore exceptions, we must isolate other clients from
+ // problems on this one.
+ ACE_PRINT_EXCEPTION (ACE_ANY_EXCEPTION,
+ "ProxySupplier::disconnect_push_supplier");
+ }
+ ACE_ENDTRY;
+ }
+}
+
+void
+TAO_EC_Default_ProxyPushSupplier::suspend_connection (ACE_ENV_SINGLE_ARG_DECL)
+ ACE_THROW_SPEC ((CORBA::SystemException))
+{
+ this->suspend_connection_locked (ACE_ENV_SINGLE_ARG_PARAMETER);
+ ACE_CHECK;
+}
+
+void
+TAO_EC_Default_ProxyPushSupplier::resume_connection (ACE_ENV_SINGLE_ARG_DECL)
+ ACE_THROW_SPEC ((CORBA::SystemException))
+{
+ this->resume_connection_locked (ACE_ENV_SINGLE_ARG_PARAMETER);
+ ACE_CHECK;
+}
+
+PortableServer::POA_ptr
+TAO_EC_Default_ProxyPushSupplier::_default_POA (ACE_ENV_SINGLE_ARG_DECL_NOT_USED)
+{
+ return PortableServer::POA::_duplicate (this->default_POA_.in ());
+}
+
+void
+TAO_EC_Default_ProxyPushSupplier::_add_ref (ACE_ENV_SINGLE_ARG_DECL_NOT_USED)
+{
+ this->_incr_refcnt ();
+}
+
+void
+TAO_EC_Default_ProxyPushSupplier::_remove_ref (ACE_ENV_SINGLE_ARG_DECL_NOT_USED)
+{
+ this->_decr_refcnt ();
+}
+
+void
+TAO_EC_Default_ProxyPushSupplier::activate (
+ RtecEventChannelAdmin::ProxyPushSupplier_ptr &proxy
+ ACE_ENV_ARG_DECL)
+ ACE_THROW_SPEC ((CORBA::SystemException))
+{
+ proxy = this->_this (ACE_ENV_SINGLE_ARG_PARAMETER);
+ ACE_CHECK;
+}
+
+PortableServer::ObjectId
+TAO_EC_Default_ProxyPushSupplier::object_id (ACE_ENV_SINGLE_ARG_DECL)
+ ACE_THROW_SPEC ((CORBA::SystemException))
+{
+ PortableServer::ObjectId_var result =
+ this->default_POA_->servant_to_id (this ACE_ENV_ARG_PARAMETER);
+
+ return result.in ();
+}
+
+TAO_END_VERSIONED_NAMESPACE_DECL
diff --git a/TAO/orbsvcs/orbsvcs/Event/EC_Default_ProxySupplier.h b/TAO/orbsvcs/orbsvcs/Event/EC_Default_ProxySupplier.h
new file mode 100644
index 00000000000..ae59254ea93
--- /dev/null
+++ b/TAO/orbsvcs/orbsvcs/Event/EC_Default_ProxySupplier.h
@@ -0,0 +1,82 @@
+// -*- C++ -*-
+
+/**
+ * @file EC_Default_ProxySupplier.h
+ *
+ * $Id$
+ *
+ * @author Carlos O'Ryan (coryan@cs.wustl.edu)
+ * @author Marina Spivak (marina@atdesk.com)
+ * @author Jason Smith (jason@atdesk.com)
+ */
+
+#ifndef TAO_DEFAULT_EC_PROXYSUPPLIER_H
+#define TAO_DEFAULT_EC_PROXYSUPPLIER_H
+
+#include /**/ "ace/pre.h"
+
+#include "orbsvcs/RtecEventChannelAdminS.h"
+
+#if !defined (ACE_LACKS_PRAGMA_ONCE)
+# pragma once
+#endif /* ACE_LACKS_PRAGMA_ONCE */
+
+#include "orbsvcs/Event/EC_ProxySupplier.h"
+
+TAO_BEGIN_VERSIONED_NAMESPACE_DECL
+
+/**
+ * @class TAO_EC_Default_ProxyPushSupplier
+ *
+ * @brief Implement the ReliableEventChannelAdmin::ProxyPushSupplier
+ * interface
+ */
+class TAO_RTEvent_Serv_Export TAO_EC_Default_ProxyPushSupplier
+ : public POA_RtecEventChannelAdmin::ProxyPushSupplier,
+ public TAO_EC_ProxyPushSupplier
+{
+public:
+
+ /// Constructor...
+ TAO_EC_Default_ProxyPushSupplier (TAO_EC_Event_Channel_Base* event_channel, int validate_connection);
+
+ /// Destructor...
+ virtual ~TAO_EC_Default_ProxyPushSupplier (void);
+
+ void activate (
+ RtecEventChannelAdmin::ProxyPushSupplier_ptr &proxy
+ ACE_ENV_ARG_DECL)
+ ACE_THROW_SPEC ((CORBA::SystemException));
+
+ /// IDL methods.
+ virtual void connect_push_consumer (
+ RtecEventComm::PushConsumer_ptr push_consumer,
+ const RtecEventChannelAdmin::ConsumerQOS &qos
+ ACE_ENV_ARG_DECL)
+ ACE_THROW_SPEC ((CORBA::SystemException,
+ RtecEventChannelAdmin::AlreadyConnected,
+ RtecEventChannelAdmin::TypeError));
+ virtual void disconnect_push_supplier (ACE_ENV_SINGLE_ARG_DECL)
+ ACE_THROW_SPEC ((CORBA::SystemException));
+ virtual void suspend_connection (ACE_ENV_SINGLE_ARG_DECL)
+ ACE_THROW_SPEC ((CORBA::SystemException));
+ virtual void resume_connection (ACE_ENV_SINGLE_ARG_DECL)
+ ACE_THROW_SPEC ((CORBA::SystemException));
+
+ // = The Servant methods
+ virtual PortableServer::POA_ptr _default_POA (ACE_ENV_SINGLE_ARG_DECL);
+ virtual void _add_ref (ACE_ENV_SINGLE_ARG_DECL);
+ virtual void _remove_ref (ACE_ENV_SINGLE_ARG_DECL);
+
+private:
+
+ virtual PortableServer::ObjectId
+ object_id (ACE_ENV_SINGLE_ARG_DECL)
+ ACE_THROW_SPEC ((CORBA::SystemException));
+};
+
+TAO_END_VERSIONED_NAMESPACE_DECL
+
+#include /**/ "ace/post.h"
+
+#endif /* TAO_EC_DEFAULT_PROXYSUPPLIER_H */
diff --git a/TAO/orbsvcs/orbsvcs/Event/EC_Defaults.h b/TAO/orbsvcs/orbsvcs/Event/EC_Defaults.h
new file mode 100644
index 00000000000..bcabf232a45
--- /dev/null
+++ b/TAO/orbsvcs/orbsvcs/Event/EC_Defaults.h
@@ -0,0 +1,144 @@
+/* -*- C++ -*- */
+/**
+ * @file EC_Defaults.h
+ *
+ * $Id$
+ *
+ * In this file we set the compile time defaults for the event
+ * channel.
+ *
+ * @author Carlos O'Ryan (coryan@cs.wustl.edu)
+ *
+ * Based on previous work by Tim Harrison (harrison@cs.wustl.edu) and
+ * other members of the DOC group. More details can be found in:
+ *
+ * http://doc.ece.uci.edu/~coryan/EC/index.html
+ */
+
+#ifndef TAO_EC_DEFAULTS_H
+#define TAO_EC_DEFAULTS_H
+
+#include /**/ "ace/pre.h"
+
+#ifndef TAO_EC_ENABLE_DEBUG_MESSAGES
+#define TAO_EC_ENABLE_DEBUG_MESSAGES 0
+#endif /* TAO_EC_ENABLE_DEBUG_MESSAGES */
+
+// Any of the definitions below can be overriden in the config.h file
+// or the compilation line.
+
+// Control consumer and supplier reconnections
+#ifndef TAO_EC_DEFAULT_CONSUMER_RECONNECT
+# define TAO_EC_DEFAULT_CONSUMER_RECONNECT 0
+#endif /* TAO_EC_DEFAULT_CONSUMER_RECONNECT */
+
+#ifndef TAO_EC_DEFAULT_SUPPLIER_RECONNECT
+#define TAO_EC_DEFAULT_SUPPLIER_RECONNECT 0
+#endif /* TAO_EC_DEFAULT_SUPPLIER_RECONNECT */
+
+// Control callbacks when proxies are disconnected
+#ifndef TAO_EC_DEFAULT_DISCONNECT_CALLBACKS
+# define TAO_EC_DEFAULT_DISCONNECT_CALLBACKS 0
+#endif /* TAO_EC_DEFAULT_DISCONNECT_CALLBACKS */
+
+// The defaults for the default factory.
+// The TAO_EC_Default_Factory is a run-time configurable factory for
+// the event channel. Using the service configurator the user can
+// specify what strategies should the factory produce.
+// This macros control the default values for those strategies.
+//
+#ifndef TAO_EC_DEFAULT_DISPATCHING
+# define TAO_EC_DEFAULT_DISPATCHING 0 /* reactive */
+#endif /* TAO_EC_DEFAULT_DISPATCHING */
+
+#ifndef TAO_EC_DEFAULT_CONSUMER_FILTER
+# define TAO_EC_DEFAULT_CONSUMER_FILTER 1 /* type, disj. conj. timers */
+#endif /* TAO_EC_DEFAULT_CONSUMER_FILTER */
+
+#ifndef TAO_EC_DEFAULT_SUPPLIER_FILTER
+# define TAO_EC_DEFAULT_SUPPLIER_FILTER 1 /* per supplier */
+#endif /* TAO_EC_DEFAULT_SUPPLIER_FILTER */
+
+#ifndef TAO_EC_DEFAULT_TIMEOUT
+# define TAO_EC_DEFAULT_TIMEOUT 0 /* reactive */
+#endif /* TAO_EC_DEFAULT_TIMEOUT */
+
+#ifndef TAO_EC_DEFAULT_OBSERVER
+# define TAO_EC_DEFAULT_OBSERVER 0 /* null */
+#endif /* TAO_EC_DEFAULT_OBSERVER */
+
+#ifndef TAO_EC_DEFAULT_SCHEDULING
+# define TAO_EC_DEFAULT_SCHEDULING 0 /* null */
+#endif /* TAO_EC_DEFAULT_SCHEDULING */
+
+#ifndef TAO_EC_DEFAULT_CONSUMER_COLLECTION
+# define TAO_EC_DEFAULT_CONSUMER_COLLECTION 0x001 /* copy-on-read MT-safe */
+#endif /* TAO_EC_DEFAULT_CONSUMER_COLLECTION */
+
+#ifndef TAO_EC_DEFAULT_SUPPLIER_COLLECTION
+# define TAO_EC_DEFAULT_SUPPLIER_COLLECTION 0x001 /* copy-on-read MT-safe */
+#endif /* TAO_EC_DEFAULT_SUPPLIER_COLLECTION */
+
+#ifndef TAO_EC_DEFAULT_CONSUMER_LOCK
+# define TAO_EC_DEFAULT_CONSUMER_LOCK 1 /* thread */
+#endif /* TAO_EC_DEFAULT_CONSUMER_LOCK */
+
+#ifndef TAO_EC_DEFAULT_SUPPLIER_LOCK
+# define TAO_EC_DEFAULT_SUPPLIER_LOCK 1 /* thread */
+#endif /* TAO_EC_DEFAULT_SUPPLIER_LOCK */
+
+#ifndef TAO_EC_DEFAULT_DISPATCHING_THREADS
+# define TAO_EC_DEFAULT_DISPATCHING_THREADS 1 /* */
+#endif /* TAO_EC_DEFAULT_DISPATCHING_THREADS */
+
+#ifndef TAO_EC_DEFAULT_DISPATCHING_THREADS_FLAGS
+# define TAO_EC_DEFAULT_DISPATCHING_THREADS_FLAGS THR_NEW_LWP|THR_SCHED_FIFO
+#endif /* TAO_EC_DEFAULT_DISPATCHING_THREADS */
+
+#ifndef TAO_EC_DEFAULT_DISPATCHING_THREADS_PRIORITY
+# define TAO_EC_DEFAULT_DISPATCHING_THREADS_PRIORITY 0 /* */
+#endif /* TAO_EC_DEFAULT_DISPATCHING_THREADS_PRIORITY */
+
+#ifndef TAO_EC_DEFAULT_DISPATCHING_THREADS_FORCE_ACTIVE
+# define TAO_EC_DEFAULT_DISPATCHING_THREADS_FORCE_ACTIVE 1
+#endif /* TAO_EC_DEFAULT_DISPATCHING_THREADS_FORCE_ACTIVE */
+
+#ifndef TAO_EC_DEFAULT_ORB_ID
+# define TAO_EC_DEFAULT_ORB_ID "" /* */
+#endif /* TAO_EC_DEFAULT_ORB_ID */
+
+#ifndef TAO_EC_DEFAULT_CONSUMER_CONTROL
+# define TAO_EC_DEFAULT_CONSUMER_CONTROL 0 /* null */
+#endif /* TAO_EC_DEFAULT_CONSUMER_CONTROL */
+
+#ifndef TAO_EC_DEFAULT_SUPPLIER_CONTROL
+# define TAO_EC_DEFAULT_SUPPLIER_CONTROL 0 /* null */
+#endif /* TAO_EC_DEFAULT_SUPPLIER_CONTROL */
+
+#ifndef TAO_EC_DEFAULT_CONSUMER_CONTROL_PERIOD
+# define TAO_EC_DEFAULT_CONSUMER_CONTROL_PERIOD 5000000 /* usecs */
+#endif /* TAO_EC_DEFAULT_CONSUMER_CONTROL_PERIOD */
+
+#ifndef TAO_EC_DEFAULT_SUPPLIER_CONTROL_PERIOD
+# define TAO_EC_DEFAULT_SUPPLIER_CONTROL_PERIOD 5000000 /* usecs */
+#endif /* TAO_EC_DEFAULT_SUPPLIER_CONTROL_PERIOD */
+
+#ifndef TAO_EC_DEFAULT_QUEUE_FULL_SERVICE_OBJECT_NAME
+# define TAO_EC_DEFAULT_QUEUE_FULL_SERVICE_OBJECT_NAME "EC_QueueFullSimpleActions"
+#endif /* TAO_EC_DEFAULT_QUEUE_FULL_SERVICE_OBJECT_NAME */
+
+#ifndef TAO_EC_DEFAULT_CONSUMER_CONTROL_TIMEOUT
+# define TAO_EC_DEFAULT_CONSUMER_CONTROL_TIMEOUT 10000 /* usecs */
+#endif /* TAO_EC_DEFAULT_CONSUMER_CONTROL_TIMEOUT */
+
+#ifndef TAO_EC_DEFAULT_SUPPLIER_CONTROL_TIMEOUT
+# define TAO_EC_DEFAULT_SUPPLIER_CONTROL_TIMEOUT 10000 /* usecs */
+#endif /* TAO_EC_DEFAULT_SUPPLIER_CONTROL_TIMEOUT */
+
+#ifndef TAO_EC_DEFAULT_CONSUMER_VALIDATE_CONNECTION
+# define TAO_EC_DEFAULT_CONSUMER_VALIDATE_CONNECTION 0 /* no validation */
+#endif /* TAO_EC_DEFAULT_CONSUMER_VALIDATE_CONNECTION */
+
+#include /**/ "ace/post.h"
+
+#endif /* TAO_EC_DEFAULTS_H */
diff --git a/TAO/orbsvcs/orbsvcs/Event/EC_Disjunction_Filter.cpp b/TAO/orbsvcs/orbsvcs/Event/EC_Disjunction_Filter.cpp
new file mode 100644
index 00000000000..9016401e2f4
--- /dev/null
+++ b/TAO/orbsvcs/orbsvcs/Event/EC_Disjunction_Filter.cpp
@@ -0,0 +1,163 @@
+// $Id$
+
+#include "orbsvcs/Event/EC_Disjunction_Filter.h"
+
+ACE_RCSID(Event, EC_Disjunction_Filter, "$Id$")
+
+TAO_BEGIN_VERSIONED_NAMESPACE_DECL
+
+TAO_EC_Disjunction_Filter::
+ TAO_EC_Disjunction_Filter (TAO_EC_Filter* children[],
+ size_t n)
+ : children_ (children),
+ n_ (n)
+{
+ ChildrenIterator end = this->end ();
+ for (ChildrenIterator i = this->begin ();
+ i != end;
+ ++i)
+ {
+ this->adopt_child (*i);
+ }
+}
+
+TAO_EC_Disjunction_Filter::~TAO_EC_Disjunction_Filter (void)
+{
+ TAO_EC_Filter** end = this->children_ + this->n_;
+ for (TAO_EC_Filter** i = this->children_;
+ i != end;
+ ++i)
+ {
+ delete *i;
+ *i = 0;
+ }
+ delete[] this->children_;
+ this->children_ = 0;
+ this->n_ = 0;
+}
+
+TAO_EC_Filter::ChildrenIterator
+TAO_EC_Disjunction_Filter::begin (void) const
+{
+ return this->children_;
+}
+
+TAO_EC_Filter::ChildrenIterator
+TAO_EC_Disjunction_Filter::end (void) const
+{
+ return this->children_ + this->n_;
+}
+
+int
+TAO_EC_Disjunction_Filter::size (void) const
+{
+ return static_cast<int> (this->n_);
+}
+
+int
+TAO_EC_Disjunction_Filter::filter (const RtecEventComm::EventSet& event,
+ TAO_EC_QOS_Info& qos_info
+ ACE_ENV_ARG_DECL)
+{
+ ChildrenIterator end = this->end ();
+ for (ChildrenIterator i = this->begin ();
+ i != end;
+ ++i)
+ {
+ int n = (*i)->filter (event, qos_info ACE_ENV_ARG_PARAMETER);
+ ACE_CHECK_RETURN (0);
+ if (n != 0)
+ return n;
+ }
+ return 0;
+}
+
+int
+TAO_EC_Disjunction_Filter::filter_nocopy (RtecEventComm::EventSet& event,
+ TAO_EC_QOS_Info& qos_info
+ ACE_ENV_ARG_DECL)
+{
+ ChildrenIterator end = this->end ();
+ for (ChildrenIterator i = this->begin ();
+ i != end;
+ ++i)
+ {
+ int n = (*i)->filter (event, qos_info ACE_ENV_ARG_PARAMETER);
+ ACE_CHECK_RETURN (0);
+ if (n != 0)
+ return n;
+ }
+ return 0;
+}
+
+void
+TAO_EC_Disjunction_Filter::push (const RtecEventComm::EventSet& event,
+ TAO_EC_QOS_Info& qos_info
+ ACE_ENV_ARG_DECL)
+{
+ if (this->parent () != 0)
+ this->parent ()->push (event, qos_info ACE_ENV_ARG_PARAMETER);
+}
+
+void
+TAO_EC_Disjunction_Filter::push_nocopy (RtecEventComm::EventSet& event,
+ TAO_EC_QOS_Info& qos_info
+ ACE_ENV_ARG_DECL)
+{
+ if (this->parent () != 0)
+ this->parent ()->push_nocopy (event, qos_info ACE_ENV_ARG_PARAMETER);
+}
+
+void
+TAO_EC_Disjunction_Filter::clear (void)
+{
+ ChildrenIterator end = this->end ();
+ for (ChildrenIterator i = this->begin ();
+ i != end;
+ ++i)
+ {
+ (*i)->clear ();
+ }
+}
+
+CORBA::ULong
+TAO_EC_Disjunction_Filter::max_event_size (void) const
+{
+ CORBA::ULong n = 0;
+ ChildrenIterator end = this->end ();
+ for (ChildrenIterator i = this->begin ();
+ i != end;
+ ++i)
+ {
+ CORBA::ULong m = (*i)->max_event_size ();
+ if (n < m)
+ n = m;
+ }
+ return n;
+}
+
+int
+TAO_EC_Disjunction_Filter::can_match (
+ const RtecEventComm::EventHeader& header) const
+{
+ ChildrenIterator end = this->end ();
+ for (ChildrenIterator i = this->begin ();
+ i != end;
+ ++i)
+ {
+ if ((*i)->can_match (header) != 0)
+ return 1;
+ }
+ return 0;
+}
+
+int
+TAO_EC_Disjunction_Filter::add_dependencies (
+ const RtecEventComm::EventHeader&,
+ const TAO_EC_QOS_Info &
+ ACE_ENV_ARG_DECL_NOT_USED)
+{
+ return 0;
+}
+
+TAO_END_VERSIONED_NAMESPACE_DECL
diff --git a/TAO/orbsvcs/orbsvcs/Event/EC_Disjunction_Filter.h b/TAO/orbsvcs/orbsvcs/Event/EC_Disjunction_Filter.h
new file mode 100644
index 00000000000..06585acb46d
--- /dev/null
+++ b/TAO/orbsvcs/orbsvcs/Event/EC_Disjunction_Filter.h
@@ -0,0 +1,90 @@
+// -*- C++ -*-
+
+/**
+ * @file EC_Disjunction_Filter.h
+ *
+ * $Id$
+ *
+ * @author Carlos O'Ryan (coryan@cs.wustl.edu)
+ *
+ * Based on previous work by Tim Harrison (harrison@cs.wustl.edu) and
+ * other members of the DOC group. More details can be found in:
+ *
+ * http://doc.ece.uci.edu/~coryan/EC/index.html
+ */
+
+#ifndef TAO_EC_DISJUNCTION_FILTER_H
+#define TAO_EC_DISJUNCTION_FILTER_H
+#include /**/ "ace/pre.h"
+
+#include "orbsvcs/Event/EC_Filter.h"
+
+#if !defined (ACE_LACKS_PRAGMA_ONCE)
+# pragma once
+#endif /* ACE_LACKS_PRAGMA_ONCE */
+
+TAO_BEGIN_VERSIONED_NAMESPACE_DECL
+
+/**
+ * @class TAO_EC_Disjunction_Filter
+ *
+ * @brief The disjunction filter.
+ *
+ * This filter has a set of children (fixed at creation time), if
+ * any of the children accepts an event then it also does.
+ *
+ * <H2>Memory Management</H2>
+ * It assumes ownership of the children.
+ */
+class TAO_RTEvent_Serv_Export TAO_EC_Disjunction_Filter : public TAO_EC_Filter
+{
+public:
+ /// Constructor. It assumes ownership of both the array and the
+ /// children.
+ TAO_EC_Disjunction_Filter (TAO_EC_Filter* children[],
+ size_t n);
+
+ /// Destructor
+ virtual ~TAO_EC_Disjunction_Filter (void);
+
+
+ // = The TAO_EC_Filter methods, please check the documentation in
+ // TAO_EC_Filter.
+ virtual ChildrenIterator begin (void) const;
+ virtual ChildrenIterator end (void) const;
+ virtual int size (void) const;
+ virtual int filter (const RtecEventComm::EventSet& event,
+ TAO_EC_QOS_Info& qos_info
+ ACE_ENV_ARG_DECL);
+ virtual int filter_nocopy (RtecEventComm::EventSet& event,
+ TAO_EC_QOS_Info& qos_info
+ ACE_ENV_ARG_DECL);
+ virtual void push (const RtecEventComm::EventSet& event,
+ TAO_EC_QOS_Info& qos_info
+ ACE_ENV_ARG_DECL);
+ virtual void push_nocopy (RtecEventComm::EventSet& event,
+ TAO_EC_QOS_Info& qos_info
+ ACE_ENV_ARG_DECL);
+ virtual void clear (void);
+ virtual CORBA::ULong max_event_size (void) const;
+ virtual int can_match (const RtecEventComm::EventHeader& header) const;
+ virtual int add_dependencies (const RtecEventComm::EventHeader& header,
+ const TAO_EC_QOS_Info &qos_info
+ ACE_ENV_ARG_DECL);
+
+private:
+ TAO_EC_Disjunction_Filter (const TAO_EC_Disjunction_Filter&);
+ TAO_EC_Disjunction_Filter& operator= (const TAO_EC_Disjunction_Filter&);
+
+private:
+ /// The children
+ TAO_EC_Filter** children_;
+
+ /// The number of children.
+ size_t n_;
+};
+
+TAO_END_VERSIONED_NAMESPACE_DECL
+
+#include /**/ "ace/post.h"
+#endif /* TAO_EC_DISJUNCTION_FILTER_H */
diff --git a/TAO/orbsvcs/orbsvcs/Event/EC_Dispatching.cpp b/TAO/orbsvcs/orbsvcs/Event/EC_Dispatching.cpp
new file mode 100644
index 00000000000..4e2ead6d6e1
--- /dev/null
+++ b/TAO/orbsvcs/orbsvcs/Event/EC_Dispatching.cpp
@@ -0,0 +1,14 @@
+// $Id$
+
+#include "orbsvcs/Event/EC_Dispatching.h"
+#include "orbsvcs/Event/EC_ProxySupplier.h"
+
+ACE_RCSID(Event, EC_Dispatching, "$Id$")
+
+TAO_BEGIN_VERSIONED_NAMESPACE_DECL
+
+TAO_EC_Dispatching::~TAO_EC_Dispatching (void)
+{
+}
+
+TAO_END_VERSIONED_NAMESPACE_DECL
diff --git a/TAO/orbsvcs/orbsvcs/Event/EC_Dispatching.h b/TAO/orbsvcs/orbsvcs/Event/EC_Dispatching.h
new file mode 100644
index 00000000000..14fc0cc7860
--- /dev/null
+++ b/TAO/orbsvcs/orbsvcs/Event/EC_Dispatching.h
@@ -0,0 +1,84 @@
+// -*- C++ -*-
+
+/**
+ * @file EC_Dispatching.h
+ *
+ * $Id$
+ *
+ * @author Carlos O'Ryan (coryan@cs.wustl.edu)
+ *
+ * Based on previous work by Tim Harrison (harrison@cs.wustl.edu) and
+ * other members of the DOC group. More details can be found in:
+ *
+ * http://doc.ece.uci.edu/~coryan/EC/index.html
+ */
+
+#ifndef TAO_EC_DISPATCHING_H
+#define TAO_EC_DISPATCHING_H
+
+#include /**/ "ace/pre.h"
+
+#include "orbsvcs/RtecEventCommC.h"
+
+#include /**/ "orbsvcs/Event/event_serv_export.h"
+
+#if !defined (ACE_LACKS_PRAGMA_ONCE)
+# pragma once
+#endif /* ACE_LACKS_PRAGMA_ONCE */
+
+TAO_BEGIN_VERSIONED_NAMESPACE_DECL
+
+class TAO_EC_QOS_Info;
+class TAO_EC_ProxyPushSupplier;
+
+/**
+ * @class TAO_EC_Dispatching
+ *
+ * @brief Abstract base class for the dispatching strategies.
+ *
+ * The dispatching strategies.
+ * The EC may be configured with different dispatching strategies,
+ * for instance, it can use a pool of threads to dispatch the
+ * events, or a set of queues with threads at different priorities
+ * for each queue or can simply push the event to the consumer in
+ * FIFO order.
+ */
+class TAO_RTEvent_Serv_Export TAO_EC_Dispatching
+{
+public:
+ /// Destructor...
+ virtual ~TAO_EC_Dispatching (void);
+
+ /// Initialize all the data structures, activate any internal threads,
+ /// etc.
+ virtual void activate (void) = 0;
+
+ /**
+ * Deactivate any internal threads and cleanup internal data
+ * structures, it should only return once the threads have finished
+ * their jobs.
+ */
+ virtual void shutdown (void) = 0;
+
+ /**
+ * The consumer represented by @a proxy should receive @a event.
+ * It can use the information in @a qos_info to determine the event
+ * priority (among other things).
+ */
+ virtual void push (TAO_EC_ProxyPushSupplier *proxy,
+ RtecEventComm::PushConsumer_ptr consumer,
+ const RtecEventComm::EventSet &event,
+ TAO_EC_QOS_Info &qos_info
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS) = 0;
+ virtual void push_nocopy (TAO_EC_ProxyPushSupplier *proxy,
+ RtecEventComm::PushConsumer_ptr consumer,
+ RtecEventComm::EventSet &event,
+ TAO_EC_QOS_Info &qos_info
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS) = 0;
+};
+
+TAO_END_VERSIONED_NAMESPACE_DECL
+
+#include /**/ "ace/post.h"
+
+#endif /* TAO_EC_DISPATCHING_H */
diff --git a/TAO/orbsvcs/orbsvcs/Event/EC_Dispatching_Task.cpp b/TAO/orbsvcs/orbsvcs/Event/EC_Dispatching_Task.cpp
new file mode 100644
index 00000000000..93b6952aa8d
--- /dev/null
+++ b/TAO/orbsvcs/orbsvcs/Event/EC_Dispatching_Task.cpp
@@ -0,0 +1,210 @@
+// $Id$
+
+#include "orbsvcs/Event/EC_Dispatching_Task.h"
+#include "orbsvcs/Event/EC_ProxySupplier.h"
+#include "orbsvcs/Event/EC_Defaults.h"
+
+#include "tao/ORB_Constants.h"
+#include "ace/OS_NS_errno.h"
+#include "ace/OS_NS_strings.h"
+
+#if ! defined (__ACE_INLINE__)
+#include "orbsvcs/Event/EC_Dispatching_Task.i"
+#endif /* __ACE_INLINE__ */
+
+ACE_RCSID (Event,
+ EC_Dispatching,
+ "$Id$")
+
+
+TAO_BEGIN_VERSIONED_NAMESPACE_DECL
+
+TAO_EC_Simple_Queue_Full_Action::TAO_EC_Simple_Queue_Full_Action (void)
+ : queue_full_action_return_value_ (WAIT_TO_EMPTY)
+{
+}
+
+/// Helper function to register the default action into the service
+/// configurator.
+int
+TAO_EC_Simple_Queue_Full_Action::init_svcs (void)
+{
+ return ACE_Service_Config::static_svcs ()->
+ insert (&ace_svc_desc_TAO_EC_Simple_Queue_Full_Action);
+}
+
+int
+TAO_EC_Simple_Queue_Full_Action::init (int argc, char* argv[])
+{
+ // Here we look at the args and set an internal flag indicating whether
+ // the default action should be to wait for the queue to not be full
+ // or whether it should be to silently discard the event.
+
+ // @@ This should use the arg shifter stuff, but let's keep it simple to
+ // start.
+
+ do {
+ if (argc == 0)
+ break;
+
+ if (ACE_OS::strcasecmp ("wait", argv[0]) == 0)
+ this->queue_full_action_return_value_ = WAIT_TO_EMPTY;
+ else if (ACE_OS::strcasecmp ("discard", argv[0]) == 0)
+ this->queue_full_action_return_value_ = SILENTLY_DISCARD;
+#if 0
+ else
+ ;
+ // probably ought to print an error message here
+#endif
+ } while (0);
+
+ return 0;
+}
+
+int
+TAO_EC_Simple_Queue_Full_Action::fini (void)
+{
+ return 0;
+}
+
+int
+TAO_EC_Simple_Queue_Full_Action::queue_full_action (TAO_EC_Dispatching_Task * /*task*/,
+ TAO_EC_ProxyPushSupplier * /*proxy*/,
+ RtecEventComm::PushConsumer_ptr /*consumer*/,
+ RtecEventComm::EventSet& /*event*/
+ ACE_ENV_ARG_DECL_NOT_USED)
+{
+ return this->queue_full_action_return_value_;
+}
+
+TAO_END_VERSIONED_NAMESPACE_DECL
+
+ACE_STATIC_SVC_DEFINE (TAO_EC_Simple_Queue_Full_Action,
+ ACE_TEXT (TAO_EC_DEFAULT_QUEUE_FULL_SERVICE_OBJECT_NAME),
+ ACE_SVC_OBJ_T,
+ &ACE_SVC_NAME (TAO_EC_Simple_Queue_Full_Action),
+ ACE_Service_Type::DELETE_THIS | ACE_Service_Type::DELETE_OBJ,
+ 0)
+ACE_FACTORY_DEFINE (TAO_RTEvent_Serv, TAO_EC_Simple_Queue_Full_Action)
+
+
+TAO_BEGIN_VERSIONED_NAMESPACE_DECL
+int
+TAO_EC_Queue::is_full_i (void)
+{
+ return static_cast<size_t> (this->cur_count_) > this->high_water_mark_;
+}
+
+// ****************************************************************
+
+int
+TAO_EC_Dispatching_Task::svc (void)
+{
+ int done = 0;
+ while (!done)
+ {
+ ACE_TRY_NEW_ENV
+ {
+ ACE_Message_Block *mb = 0;
+ if (this->getq (mb) == -1)
+ if (ACE_OS::last_error () == ESHUTDOWN)
+ return 0;
+ else
+ ACE_ERROR ((LM_ERROR,
+ "EC (%P|%t) getq error in Dispatching Queue\n"));
+
+ TAO_EC_Dispatch_Command *command =
+ dynamic_cast<TAO_EC_Dispatch_Command*> (mb);
+
+ if (command == 0)
+ {
+ ACE_Message_Block::release (mb);
+ continue;
+ }
+
+ int result = command->execute (ACE_ENV_SINGLE_ARG_PARAMETER);
+ ACE_TRY_CHECK;
+
+ ACE_Message_Block::release (mb);
+
+ if (result == -1)
+ done = 1;
+ }
+ ACE_CATCHANY
+ {
+ ACE_PRINT_EXCEPTION (ACE_ANY_EXCEPTION,
+ "EC (%P|%t) exception in dispatching queue");
+ }
+ ACE_ENDTRY;
+ }
+ return 0;
+}
+
+void
+TAO_EC_Dispatching_Task::push (TAO_EC_ProxyPushSupplier *proxy,
+ RtecEventComm::PushConsumer_ptr consumer,
+ RtecEventComm::EventSet& event
+ ACE_ENV_ARG_DECL)
+{
+ if (this->msg_queue()->is_full ())
+ {
+ int action =
+ this->queue_full_service_object_->queue_full_action (this, proxy,
+ consumer, event
+ ACE_ENV_ARG_PARAMETER);
+ ACE_CHECK;
+
+ if (action == TAO_EC_Queue_Full_Service_Object::SILENTLY_DISCARD)
+ return;
+ // if action == WAIT_TO_EMPTY then we just go ahead and queue it
+ }
+
+ if (this->allocator_ == 0)
+ this->allocator_ = ACE_Allocator::instance ();
+
+ void* buf = this->allocator_->malloc (sizeof (TAO_EC_Push_Command));
+
+ if (buf == 0)
+ ACE_THROW (CORBA::NO_MEMORY (TAO::VMCID,
+ CORBA::COMPLETED_NO));
+
+ ACE_Message_Block *mb =
+ new (buf) TAO_EC_Push_Command (proxy,
+ consumer,
+ event,
+ this->data_block_.duplicate (),
+ this->allocator_);
+ this->putq (mb);
+}
+
+// ****************************************************************
+
+TAO_EC_Dispatch_Command::~TAO_EC_Dispatch_Command (void)
+{
+}
+
+// ****************************************************************
+
+int
+TAO_EC_Shutdown_Task_Command::execute (ACE_ENV_SINGLE_ARG_DECL_NOT_USED)
+{
+ return -1;
+}
+
+// ****************************************************************
+
+TAO_EC_Push_Command::~TAO_EC_Push_Command (void)
+{
+ this->proxy_->_decr_refcnt ();
+}
+
+int
+TAO_EC_Push_Command::execute (ACE_ENV_SINGLE_ARG_DECL)
+{
+ this->proxy_->push_to_consumer (this->consumer_.in (),
+ this->event_
+ ACE_ENV_ARG_PARAMETER);
+ return 0;
+}
+
+TAO_END_VERSIONED_NAMESPACE_DECL
diff --git a/TAO/orbsvcs/orbsvcs/Event/EC_Dispatching_Task.h b/TAO/orbsvcs/orbsvcs/Event/EC_Dispatching_Task.h
new file mode 100644
index 00000000000..7aaedd68071
--- /dev/null
+++ b/TAO/orbsvcs/orbsvcs/Event/EC_Dispatching_Task.h
@@ -0,0 +1,199 @@
+// -*- C++ -*-
+
+/**
+ * @file EC_Dispatching_Task.h
+ *
+ * $Id$
+ *
+ * @author Carlos O'Ryan (coryan@cs.wustl.edu)
+ *
+ * Based on previous work by Tim Harrison (harrison@cs.wustl.edu) and
+ * other members of the DOC group. More details can be found in:
+ *
+ * http://doc.ece.uci.edu/~coryan/EC/index.html
+ */
+
+#ifndef TAO_EC_DISPATCHING_TASK_H
+#define TAO_EC_DISPATCHING_TASK_H
+
+#include /**/ "ace/pre.h"
+
+#include "orbsvcs/Event/EC_ProxySupplier.h"
+
+#if !defined (ACE_LACKS_PRAGMA_ONCE)
+# pragma once
+#endif /* ACE_LACKS_PRAGMA_ONCE */
+
+#include "orbsvcs/RtecEventCommC.h"
+#include /**/ "orbsvcs/Event/event_serv_export.h"
+#include "ace/Task.h"
+#include "ace/Message_Block.h"
+#include "ace/Lock_Adapter_T.h"
+#include "ace/Service_Config.h"
+#include "ace/Global_Macros.h"
+
+TAO_BEGIN_VERSIONED_NAMESPACE_DECL
+
+// Forward decl
+class TAO_EC_Dispatching_Task;
+
+class TAO_RTEvent_Serv_Export TAO_EC_Queue_Full_Service_Object : public ACE_Service_Object
+{
+public:
+ enum QueueFullActionReturnValue
+ {
+ WAIT_TO_EMPTY = 0,
+ SILENTLY_DISCARD = -1
+ };
+
+ // Called when
+ virtual int queue_full_action (TAO_EC_Dispatching_Task *task,
+ TAO_EC_ProxyPushSupplier *proxy,
+ RtecEventComm::PushConsumer_ptr consumer,
+ RtecEventComm::EventSet& event
+ ACE_ENV_ARG_DECL) = 0;
+};
+
+class TAO_RTEvent_Serv_Export TAO_EC_Simple_Queue_Full_Action :
+ public TAO_EC_Queue_Full_Service_Object
+{
+public:
+ TAO_EC_Simple_Queue_Full_Action ();
+
+ /// Helper function to register the default action into the service
+ /// configurator.
+ static int init_svcs (void);
+
+ // = The Service_Object entry points
+ virtual int init (int argc, char* argv[]);
+ virtual int fini (void);
+
+ virtual int queue_full_action (TAO_EC_Dispatching_Task *task,
+ TAO_EC_ProxyPushSupplier *proxy,
+ RtecEventComm::PushConsumer_ptr consumer,
+ RtecEventComm::EventSet& event
+ ACE_ENV_ARG_DECL);
+
+protected:
+ int queue_full_action_return_value_;
+};
+
+class TAO_RTEvent_Serv_Export TAO_EC_Queue : public ACE_Message_Queue<ACE_SYNCH>
+{
+public:
+ TAO_EC_Queue (size_t high_water_mark = ACE_Message_Queue_Base::DEFAULT_HWM,
+ size_t low_water_mark = ACE_Message_Queue_Base::DEFAULT_LWM,
+ ACE_Notification_Strategy * = 0);
+
+protected:
+ // = Override the default definition in the Message_Queue, to count
+ // the number of messages (and not their size).
+ virtual int is_full_i (void);
+};
+
+/**
+ * @class TAO_EC_Dispatching_Task
+ *
+ * @brief Implement the dispatching queues for FIFO and Priority
+ * dispatching.
+ *
+ */
+class TAO_RTEvent_Serv_Export TAO_EC_Dispatching_Task : public ACE_Task<ACE_SYNCH>
+{
+public:
+ /// Constructor
+ TAO_EC_Dispatching_Task (ACE_Thread_Manager* thr_manager = 0, TAO_EC_Queue_Full_Service_Object* queue_full_service_object = 0);
+
+ /// Process the events in the queue.
+ virtual int svc (void);
+
+ virtual void push (TAO_EC_ProxyPushSupplier *proxy,
+ RtecEventComm::PushConsumer_ptr consumer,
+ RtecEventComm::EventSet& event
+ ACE_ENV_ARG_DECL);
+
+private:
+ /// An per-task allocator
+ ACE_Allocator *allocator_;
+
+ /// Helper data structure to minimize memory allocations...
+ ACE_Locked_Data_Block<ACE_Lock_Adapter<TAO_SYNCH_MUTEX> > data_block_;
+
+ /// The queue
+ TAO_EC_Queue the_queue_;
+
+ TAO_EC_Queue_Full_Service_Object* queue_full_service_object_;
+};
+
+// ****************************************************************
+
+class TAO_RTEvent_Serv_Export TAO_EC_Dispatch_Command : public ACE_Message_Block
+{
+public:
+ /// Constructor, it will allocate its own data block
+ TAO_EC_Dispatch_Command (ACE_Allocator *mb_allocator = 0);
+
+ /// Constructor, it assumes ownership of the data block
+ TAO_EC_Dispatch_Command (ACE_Data_Block*,
+ ACE_Allocator *mb_allocator = 0);
+
+ /// Destructor
+ virtual ~TAO_EC_Dispatch_Command (void);
+
+ /// Command callback
+ virtual int execute (ACE_ENV_SINGLE_ARG_DECL_NOT_USED) = 0;
+};
+
+// ****************************************************************
+
+class TAO_RTEvent_Serv_Export TAO_EC_Shutdown_Task_Command : public TAO_EC_Dispatch_Command
+{
+public:
+ /// Constructor
+ TAO_EC_Shutdown_Task_Command (ACE_Allocator *mb_allocator = 0);
+
+ /// Command callback
+ virtual int execute (ACE_ENV_SINGLE_ARG_DECL_NOT_USED);
+};
+
+// ****************************************************************
+
+class TAO_RTEvent_Serv_Export TAO_EC_Push_Command : public TAO_EC_Dispatch_Command
+{
+public:
+ /// Constructor
+ TAO_EC_Push_Command (TAO_EC_ProxyPushSupplier* proxy,
+ RtecEventComm::PushConsumer_ptr consumer,
+ RtecEventComm::EventSet& event,
+ ACE_Data_Block* data_block,
+ ACE_Allocator *mb_allocator);
+
+ /// Destructor
+ virtual ~TAO_EC_Push_Command (void);
+
+ /// Command callback
+ virtual int execute (ACE_ENV_SINGLE_ARG_DECL_NOT_USED);
+
+private:
+ /// The proxy
+ TAO_EC_ProxyPushSupplier* proxy_;
+
+ /// The consumer connected to the proxy when the event was pushed.
+ RtecEventComm::PushConsumer_var consumer_;
+
+ /// The event
+ RtecEventComm::EventSet event_;
+};
+
+TAO_END_VERSIONED_NAMESPACE_DECL
+
+#if defined (__ACE_INLINE__)
+#include "orbsvcs/Event/EC_Dispatching_Task.i"
+#endif /* __ACE_INLINE__ */
+
+ACE_STATIC_SVC_DECLARE (TAO_EC_Simple_Queue_Full_Action)
+ACE_FACTORY_DECLARE (TAO_RTEvent_Serv, TAO_EC_Simple_Queue_Full_Action)
+
+#include /**/ "ace/post.h"
+
+#endif /* TAO_EC_DISPATCHING_TASK_H */
diff --git a/TAO/orbsvcs/orbsvcs/Event/EC_Dispatching_Task.i b/TAO/orbsvcs/orbsvcs/Event/EC_Dispatching_Task.i
new file mode 100644
index 00000000000..37930e408fe
--- /dev/null
+++ b/TAO/orbsvcs/orbsvcs/Event/EC_Dispatching_Task.i
@@ -0,0 +1,95 @@
+// -*- C++ -*-
+//
+// $Id$
+
+TAO_BEGIN_VERSIONED_NAMESPACE_DECL
+
+ACE_INLINE
+TAO_EC_Queue::
+ TAO_EC_Queue (size_t high_water_mark,
+ size_t low_water_mark,
+ ACE_Notification_Strategy *ns)
+ : ACE_Message_Queue<ACE_SYNCH> (high_water_mark,
+ low_water_mark,
+ ns)
+{
+}
+
+/// @todo The high water mark and low water mark shouldn't be
+/// hardcoded, check http://deuce.doc.wustl.edu/bugzilla/show_bug.cgi?id=565
+#ifndef TAO_EC_QUEUE_HWM
+#define TAO_EC_QUEUE_HWM 16384
+//#define TAO_EC_QUEUE_HWM 2
+#endif
+
+#ifndef TAO_EC_QUEUE_LWM
+#define TAO_EC_QUEUE_LWM 16
+//#define TAO_EC_QUEUE_LWM 1
+#endif
+
+ACE_INLINE
+TAO_EC_Dispatching_Task::
+TAO_EC_Dispatching_Task (ACE_Thread_Manager* thr_manager, TAO_EC_Queue_Full_Service_Object* so)
+ : ACE_Task<ACE_SYNCH> (thr_manager),
+ allocator_ (0),
+ the_queue_ (TAO_EC_QUEUE_HWM, TAO_EC_QUEUE_LWM),
+ queue_full_service_object_ (so)
+{
+ this->msg_queue (&this->the_queue_);
+}
+
+// ****************************************************************
+
+ACE_INLINE
+TAO_EC_Dispatch_Command::TAO_EC_Dispatch_Command (ACE_Allocator *mb_allocator)
+ : ACE_Message_Block (mb_allocator)
+{
+}
+
+ACE_INLINE
+TAO_EC_Dispatch_Command::TAO_EC_Dispatch_Command (ACE_Data_Block *data_block,
+ ACE_Allocator *mb_allocator)
+ : ACE_Message_Block (data_block,
+ 0,
+ mb_allocator)
+{
+}
+
+// ****************************************************************
+
+ACE_INLINE
+TAO_EC_Shutdown_Task_Command::
+ TAO_EC_Shutdown_Task_Command (ACE_Allocator *mb_allocator)
+ : TAO_EC_Dispatch_Command (mb_allocator)
+{
+}
+
+// ****************************************************************
+
+ACE_INLINE
+TAO_EC_Push_Command::TAO_EC_Push_Command (
+ TAO_EC_ProxyPushSupplier* proxy,
+ RtecEventComm::PushConsumer_ptr consumer,
+ RtecEventComm::EventSet& event,
+ ACE_Data_Block* data_block,
+ ACE_Allocator *mb_allocator)
+ : TAO_EC_Dispatch_Command (data_block, mb_allocator),
+ proxy_ (proxy),
+ consumer_ (RtecEventComm::PushConsumer::_duplicate (consumer))
+
+{
+ //
+ // Efficient copy, steal the buffer from <event>
+ // We cannot do this on the initialization because get_buffer()
+ // could get called first, effectively setting maximum() and
+ // length() to 0!
+ //
+ CORBA::ULong maximum = event.maximum ();
+ CORBA::ULong length = event.length ();
+ RtecEventComm::Event* buffer = event.get_buffer (1);
+ event_.replace (maximum, length, buffer, 1);
+
+ this->proxy_->_incr_refcnt ();
+}
+
+TAO_END_VERSIONED_NAMESPACE_DECL
diff --git a/TAO/orbsvcs/orbsvcs/Event/EC_Event_Channel.cpp b/TAO/orbsvcs/orbsvcs/Event/EC_Event_Channel.cpp
new file mode 100644
index 00000000000..b35602065d0
--- /dev/null
+++ b/TAO/orbsvcs/orbsvcs/Event/EC_Event_Channel.cpp
@@ -0,0 +1,37 @@
+// $Id$
+
+#include "orbsvcs/Event/EC_Event_Channel.h"
+#include "orbsvcs/Event/EC_Default_Factory.h"
+#include "ace/Dynamic_Service.h"
+
+ACE_RCSID(Event, EC_Event_Channel, "$Id$")
+
+TAO_BEGIN_VERSIONED_NAMESPACE_DECL
+
+TAO_EC_Event_Channel::
+TAO_EC_Event_Channel (const TAO_EC_Event_Channel_Attributes& attr,
+ TAO_EC_Factory* factory,
+ int own_factory)
+ : TAO_EC_Event_Channel_Base (attr, factory, own_factory)
+{
+ if (this->factory () == 0)
+ {
+ this->factory (
+ ACE_Dynamic_Service<TAO_EC_Factory>::instance ("EC_Factory"),
+ 0);
+
+ if (this->factory () == 0)
+ {
+ TAO_EC_Factory *f = 0;
+ ACE_NEW (f,
+ TAO_EC_Default_Factory);
+ this->factory (f, 1);
+ }
+ }
+ this->scheduler_ =
+ CORBA::Object::_duplicate (attr.scheduler);
+
+ this->create_strategies ();
+}
+
+TAO_END_VERSIONED_NAMESPACE_DECL
diff --git a/TAO/orbsvcs/orbsvcs/Event/EC_Event_Channel.h b/TAO/orbsvcs/orbsvcs/Event/EC_Event_Channel.h
new file mode 100644
index 00000000000..a2aa9b95643
--- /dev/null
+++ b/TAO/orbsvcs/orbsvcs/Event/EC_Event_Channel.h
@@ -0,0 +1,62 @@
+// -*- C++ -*-
+
+/**
+ * @file EC_Event_Channel.h
+ *
+ * $Id$
+ *
+ * @author Carlos O'Ryan (coryan@cs.wustl.edu)
+ * @author Marina Spivak (marina@atdesk.com)
+ * @author Jason Smith (jason@atdesk.com)
+ *
+ * Based on previous work by Tim Harrison (harrison@cs.wustl.edu) and
+ * other members of the DOC group. More details can be found in:
+ *
+ * http://doc.ece.uci.edu/~coryan/EC/index.html
+ */
+
+#ifndef TAO_EC_EVENT_CHANNEL_H
+#define TAO_EC_EVENT_CHANNEL_H
+
+#include /**/ "ace/pre.h"
+
+#include "orbsvcs/Event/EC_Event_Channel_Base.h"
+
+#if !defined (ACE_LACKS_PRAGMA_ONCE)
+# pragma once
+#endif /* ACE_LACKS_PRAGMA_ONCE */
+
+TAO_BEGIN_VERSIONED_NAMESPACE_DECL
+
+/**
+ * @class TAO_EC_Event_Channel
+ *
+ * @brief The RtecEventChannelAdmin::EventChannel implementation.
+ *
+ * This class is the Mediator between all the classes in the EC
+ * implementation, its main task is to redirect the messages to
+ * the right components, to hold and manage the lifetime of the
+ * long lived objects (Timer_Module, SupplierAdmin,
+ * ConsumerAdmin and Dispatching) and to provide a simpler
+ * interface to the EC_Factory.
+ */
+class TAO_RTEvent_Serv_Export TAO_EC_Event_Channel :
+ public TAO_EC_Event_Channel_Base
+{
+public:
+ /**
+ * constructor
+ * If @a own_factory is not 0 it assumes ownership of the factory.
+ * If the @a factory is nil it uses the Service_Configurator to load
+ * the Factory, if not found it uses TAO_EC_Default_Factory
+ */
+ TAO_EC_Event_Channel (const TAO_EC_Event_Channel_Attributes& attributes,
+ TAO_EC_Factory* factory = 0,
+ int own_factory = 0);
+};
+
+TAO_END_VERSIONED_NAMESPACE_DECL
+
+#include /**/ "ace/post.h"
+
+#endif /* TAO_EC_EVENT_CHANNEL_H */
diff --git a/TAO/orbsvcs/orbsvcs/Event/EC_Event_Channel_Base.cpp b/TAO/orbsvcs/orbsvcs/Event/EC_Event_Channel_Base.cpp
new file mode 100644
index 00000000000..cdb208fbb4a
--- /dev/null
+++ b/TAO/orbsvcs/orbsvcs/Event/EC_Event_Channel_Base.cpp
@@ -0,0 +1,353 @@
+// $Id$
+
+#include "orbsvcs/Event/EC_Event_Channel_Base.h"
+#include "orbsvcs/Event/EC_Dispatching.h"
+#include "orbsvcs/Event/EC_ConsumerAdmin.h"
+#include "orbsvcs/Event/EC_SupplierAdmin.h"
+#include "orbsvcs/Event/EC_Timeout_Generator.h"
+#include "orbsvcs/Event/EC_ObserverStrategy.h"
+#include "orbsvcs/Event/EC_ConsumerControl.h"
+#include "orbsvcs/Event/EC_SupplierControl.h"
+#include "ace/Dynamic_Service.h"
+
+#if ! defined (__ACE_INLINE__)
+#include "orbsvcs/Event/EC_Event_Channel_Base.i"
+#endif /* __ACE_INLINE__ */
+
+ACE_RCSID(Event, EC_Event_Channel_Base, "$Id$")
+
+TAO_BEGIN_VERSIONED_NAMESPACE_DECL
+
+TAO_EC_Event_Channel_Base::
+TAO_EC_Event_Channel_Base (const TAO_EC_Event_Channel_Attributes& attr,
+ TAO_EC_Factory* factory,
+ int own_factory)
+ : supplier_poa_ (PortableServer::POA::_duplicate (attr.supplier_poa)),
+ consumer_poa_ (PortableServer::POA::_duplicate (attr.consumer_poa)),
+ factory_ (factory),
+ own_factory_ (own_factory),
+ dispatching_ (0),
+ filter_builder_ (0),
+ supplier_filter_builder_ (0),
+ consumer_admin_ (0),
+ supplier_admin_ (0),
+ timeout_generator_ (0),
+ observer_strategy_ (0),
+ scheduling_strategy_(0),
+ consumer_reconnect_ (attr.consumer_reconnect),
+ supplier_reconnect_ (attr.supplier_reconnect),
+ disconnect_callbacks_ (attr.disconnect_callbacks),
+ consumer_control_ (0),
+ supplier_control_ (0),
+ status_ (EC_S_IDLE)
+{
+ this->scheduler_ =
+ CORBA::Object::_duplicate (attr.scheduler);
+}
+
+TAO_EC_Event_Channel_Base::~TAO_EC_Event_Channel_Base (void)
+{
+ // Destroy Strategies in the reverse order of creation, they
+ // refere to each other during destruction and thus need to be
+ // cleaned up properly.
+ this->factory_->destroy_supplier_control (this->supplier_control_);
+ this->supplier_control_ = 0;
+ this->factory_->destroy_consumer_control (this->consumer_control_);
+ this->consumer_control_ = 0;
+
+ this->factory_->destroy_scheduling_strategy (this->scheduling_strategy_);
+ this->scheduling_strategy_ = 0;
+
+ this->factory_->destroy_observer_strategy (this->observer_strategy_);
+ this->observer_strategy_ = 0;
+
+ this->factory_->destroy_timeout_generator (this->timeout_generator_);
+ this->timeout_generator_ = 0;
+
+ this->factory_->destroy_supplier_admin (this->supplier_admin_);
+ this->supplier_admin_ = 0;
+ this->factory_->destroy_consumer_admin (this->consumer_admin_);
+ this->consumer_admin_ = 0;
+
+ this->factory_->destroy_supplier_filter_builder (this->supplier_filter_builder_);
+ this->supplier_filter_builder_ = 0;
+
+ this->factory_->destroy_filter_builder (this->filter_builder_);
+ this->filter_builder_ = 0;
+
+ this->factory_->destroy_dispatching (this->dispatching_);
+ this->dispatching_ = 0;
+
+ this->factory (0, 0);
+}
+
+void
+TAO_EC_Event_Channel_Base::create_strategies (void)
+{
+ this->dispatching_ =
+ this->factory_->create_dispatching (this);
+ this->filter_builder_ =
+ this->factory_->create_filter_builder (this);
+ this->supplier_filter_builder_ =
+ this->factory_->create_supplier_filter_builder (this);
+ this->consumer_admin_ =
+ this->factory_->create_consumer_admin (this);
+ this->supplier_admin_ =
+ this->factory_->create_supplier_admin (this);
+ this->timeout_generator_ =
+ this->factory_->create_timeout_generator (this);
+ this->observer_strategy_ =
+ this->factory_->create_observer_strategy (this);
+
+ this->scheduling_strategy_ =
+ this->factory_->create_scheduling_strategy (this);
+
+ this->consumer_control_ =
+ this->factory_->create_consumer_control (this);
+ this->supplier_control_ =
+ this->factory_->create_supplier_control (this);
+}
+
+void
+TAO_EC_Event_Channel_Base::activate (ACE_ENV_SINGLE_ARG_DECL_NOT_USED)
+{
+ {
+ // First check if the EC is idle, if it is not then we need to
+ // return right away...
+ ACE_GUARD (TAO_SYNCH_MUTEX, ace_mon, this->mutex_);
+ if (this->status_ != EC_S_IDLE)
+ return;
+ this->status_ = EC_S_ACTIVATING;
+ }
+ this->dispatching_->activate ();
+ this->timeout_generator_->activate ();
+ this->consumer_control_->activate ();
+ this->supplier_control_->activate ();
+ {
+ // Only when all the operations complete successfully we can mark
+ // the EC as active...
+ ACE_GUARD (TAO_SYNCH_MUTEX, ace_mon, this->mutex_);
+ ACE_ASSERT (this->status_ == EC_S_ACTIVATING);
+ this->status_ = EC_S_ACTIVE;
+ }
+}
+
+void
+TAO_EC_Event_Channel_Base::shutdown (ACE_ENV_SINGLE_ARG_DECL)
+{
+ {
+ // First check if the EC is already active, if it is not then we
+ // need to return right away...
+ ACE_GUARD (TAO_SYNCH_MUTEX, ace_mon, this->mutex_);
+ if (this->status_ != EC_S_ACTIVE)
+ return;
+ this->status_ = EC_S_DESTROYING;
+ }
+ this->dispatching_->shutdown ();
+ this->timeout_generator_->shutdown ();
+ this->supplier_control_->shutdown ();
+ this->consumer_control_->shutdown ();
+
+ this->deactivate_supplier_admin ();
+ this->deactivate_consumer_admin ();
+
+ this->supplier_admin_->shutdown (ACE_ENV_SINGLE_ARG_PARAMETER);
+ ACE_CHECK;
+
+ this->consumer_admin_->shutdown (ACE_ENV_SINGLE_ARG_PARAMETER);
+ ACE_CHECK;
+
+ {
+ // Wait until all the shutdown() operations return before marking
+ // the EC as destroyed...
+ ACE_GUARD (TAO_SYNCH_MUTEX, ace_mon, this->mutex_);
+ ACE_ASSERT (this->status_ == EC_S_DESTROYING);
+ this->status_ = EC_S_DESTROYED;
+ }
+}
+
+void
+TAO_EC_Event_Channel_Base::deactivate_supplier_admin (void)
+{
+ ACE_DECLARE_NEW_CORBA_ENV;
+ ACE_TRY
+ {
+ PortableServer::POA_var supplier_poa =
+ this->supplier_admin_->_default_POA (ACE_ENV_SINGLE_ARG_PARAMETER);
+ ACE_TRY_CHECK;
+ PortableServer::ObjectId_var supplier_id =
+ supplier_poa->servant_to_id (this->supplier_admin_ ACE_ENV_ARG_PARAMETER);
+ ACE_TRY_CHECK;
+ supplier_poa->deactivate_object (supplier_id.in () ACE_ENV_ARG_PARAMETER);
+ ACE_TRY_CHECK;
+ }
+ ACE_CATCHANY
+ {
+ // The deactivation can throw...
+ }
+ ACE_ENDTRY;
+}
+
+void
+TAO_EC_Event_Channel_Base::deactivate_consumer_admin (void)
+{
+ ACE_TRY_NEW_ENV
+ {
+ PortableServer::POA_var consumer_poa =
+ this->consumer_admin_->_default_POA (ACE_ENV_SINGLE_ARG_PARAMETER);
+ ACE_TRY_CHECK;
+ PortableServer::ObjectId_var consumer_id =
+ consumer_poa->servant_to_id (this->consumer_admin_ ACE_ENV_ARG_PARAMETER);
+ ACE_TRY_CHECK;
+ consumer_poa->deactivate_object (consumer_id.in () ACE_ENV_ARG_PARAMETER);
+ ACE_TRY_CHECK;
+ }
+ ACE_CATCHANY
+ {
+ // The deactivation can throw...
+ }
+ ACE_ENDTRY;
+}
+
+void
+TAO_EC_Event_Channel_Base::connected (TAO_EC_ProxyPushConsumer* consumer
+ ACE_ENV_ARG_DECL)
+{
+ this->consumer_admin_->peer_connected (consumer ACE_ENV_ARG_PARAMETER);
+ ACE_CHECK;
+ this->supplier_admin_->connected (consumer ACE_ENV_ARG_PARAMETER);
+ ACE_CHECK;
+ this->observer_strategy_->connected (consumer ACE_ENV_ARG_PARAMETER);
+ ACE_CHECK;
+}
+
+void
+TAO_EC_Event_Channel_Base::reconnected (TAO_EC_ProxyPushConsumer* consumer
+ ACE_ENV_ARG_DECL)
+{
+ this->consumer_admin_->peer_reconnected (consumer ACE_ENV_ARG_PARAMETER);
+ ACE_CHECK;
+ this->supplier_admin_->reconnected (consumer ACE_ENV_ARG_PARAMETER);
+ ACE_CHECK;
+ this->observer_strategy_->connected (consumer ACE_ENV_ARG_PARAMETER);
+ ACE_CHECK;
+}
+
+void
+TAO_EC_Event_Channel_Base::disconnected (TAO_EC_ProxyPushConsumer* consumer
+ ACE_ENV_ARG_DECL)
+{
+ this->consumer_admin_->peer_disconnected (consumer ACE_ENV_ARG_PARAMETER);
+ ACE_CHECK;
+ this->supplier_admin_->disconnected (consumer ACE_ENV_ARG_PARAMETER);
+ ACE_CHECK;
+ this->observer_strategy_->disconnected (consumer ACE_ENV_ARG_PARAMETER);
+ ACE_CHECK;
+}
+
+void
+TAO_EC_Event_Channel_Base::connected (TAO_EC_ProxyPushSupplier* supplier
+ ACE_ENV_ARG_DECL)
+{
+ this->supplier_admin_->peer_connected (supplier ACE_ENV_ARG_PARAMETER);
+ ACE_CHECK;
+ this->consumer_admin_->connected (supplier ACE_ENV_ARG_PARAMETER);
+ ACE_CHECK;
+ this->observer_strategy_->connected (supplier ACE_ENV_ARG_PARAMETER);
+ ACE_CHECK;
+}
+
+void
+TAO_EC_Event_Channel_Base::reconnected (TAO_EC_ProxyPushSupplier* supplier
+ ACE_ENV_ARG_DECL)
+{
+ this->supplier_admin_->peer_reconnected (supplier ACE_ENV_ARG_PARAMETER);
+ ACE_CHECK;
+ this->consumer_admin_->reconnected (supplier ACE_ENV_ARG_PARAMETER);
+ ACE_CHECK;
+ this->observer_strategy_->connected (supplier ACE_ENV_ARG_PARAMETER);
+ ACE_CHECK;
+}
+
+void
+TAO_EC_Event_Channel_Base::disconnected (TAO_EC_ProxyPushSupplier* supplier
+ ACE_ENV_ARG_DECL)
+{
+ this->supplier_admin_->peer_disconnected (supplier ACE_ENV_ARG_PARAMETER);
+ ACE_CHECK;
+ this->consumer_admin_->disconnected (supplier ACE_ENV_ARG_PARAMETER);
+ ACE_CHECK;
+ this->observer_strategy_->disconnected (supplier ACE_ENV_ARG_PARAMETER);
+ ACE_CHECK;
+}
+
+RtecEventChannelAdmin::ConsumerAdmin_ptr
+TAO_EC_Event_Channel_Base::for_consumers (ACE_ENV_SINGLE_ARG_DECL)
+ ACE_THROW_SPEC ((CORBA::SystemException))
+{
+ return this->consumer_admin_->_this (ACE_ENV_SINGLE_ARG_PARAMETER);
+}
+
+RtecEventChannelAdmin::SupplierAdmin_ptr
+TAO_EC_Event_Channel_Base::for_suppliers (ACE_ENV_SINGLE_ARG_DECL)
+ ACE_THROW_SPEC ((CORBA::SystemException))
+{
+ return this->supplier_admin_->_this (ACE_ENV_SINGLE_ARG_PARAMETER);
+}
+
+void
+TAO_EC_Event_Channel_Base::destroy (ACE_ENV_SINGLE_ARG_DECL)
+ ACE_THROW_SPEC ((CORBA::SystemException))
+{
+ this->shutdown (ACE_ENV_SINGLE_ARG_PARAMETER);
+}
+
+RtecEventChannelAdmin::Observer_Handle
+TAO_EC_Event_Channel_Base::append_observer (
+ RtecEventChannelAdmin::Observer_ptr observer
+ ACE_ENV_ARG_DECL)
+ ACE_THROW_SPEC ((
+ CORBA::SystemException,
+ RtecEventChannelAdmin::EventChannel::SYNCHRONIZATION_ERROR,
+ RtecEventChannelAdmin::EventChannel::CANT_APPEND_OBSERVER))
+{
+ return this->observer_strategy_->append_observer (observer
+ ACE_ENV_ARG_PARAMETER);
+}
+
+void
+TAO_EC_Event_Channel_Base::remove_observer (
+ RtecEventChannelAdmin::Observer_Handle handle
+ ACE_ENV_ARG_DECL)
+ ACE_THROW_SPEC ((
+ CORBA::SystemException,
+ RtecEventChannelAdmin::EventChannel::SYNCHRONIZATION_ERROR,
+ RtecEventChannelAdmin::EventChannel::CANT_REMOVE_OBSERVER))
+{
+ this->observer_strategy_->remove_observer (handle
+ ACE_ENV_ARG_PARAMETER);
+}
+
+void
+TAO_EC_Event_Channel_Base::for_each_consumer (
+ TAO_ESF_Worker<TAO_EC_ProxyPushSupplier> *worker
+ ACE_ENV_ARG_DECL)
+ ACE_THROW_SPEC ((CORBA::SystemException))
+{
+ this->consumer_admin_->for_each (worker
+ ACE_ENV_ARG_PARAMETER);
+ ACE_CHECK;
+}
+
+void
+TAO_EC_Event_Channel_Base::for_each_supplier (
+ TAO_ESF_Worker<TAO_EC_ProxyPushConsumer> *worker
+ ACE_ENV_ARG_DECL)
+ ACE_THROW_SPEC ((CORBA::SystemException))
+{
+ this->supplier_admin_->for_each (worker
+ ACE_ENV_ARG_PARAMETER);
+ ACE_CHECK;
+}
+
+TAO_END_VERSIONED_NAMESPACE_DECL
diff --git a/TAO/orbsvcs/orbsvcs/Event/EC_Event_Channel_Base.h b/TAO/orbsvcs/orbsvcs/Event/EC_Event_Channel_Base.h
new file mode 100644
index 00000000000..b42632c4c43
--- /dev/null
+++ b/TAO/orbsvcs/orbsvcs/Event/EC_Event_Channel_Base.h
@@ -0,0 +1,377 @@
+// -*- C++ -*-
+
+/**
+ * @file EC_Event_Channel_Base.h
+ *
+ * $Id$
+ *
+ * @author Carlos O'Ryan (coryan@cs.wustl.edu)
+ * @author Marina Spivak (marina@atdesk.com)
+ * @author Jason Smith (jason@atdesk.com)
+ *
+ * Based on previous work by Tim Harrison (harrison@cs.wustl.edu) and
+ * other members of the DOC group. More details can be found in:
+ *
+ * http://doc.ece.uci.edu/~coryan/EC/index.html
+ */
+
+#ifndef TAO_EC_EVENT_CHANNEL_BASE_H
+#define TAO_EC_EVENT_CHANNEL_BASE_H
+
+#include /**/ "ace/pre.h"
+
+#include "orbsvcs/Event/EC_Factory.h"
+
+#if !defined (ACE_LACKS_PRAGMA_ONCE)
+# pragma once
+#endif /* ACE_LACKS_PRAGMA_ONCE */
+
+#include "orbsvcs/Event/EC_Defaults.h"
+
+#include "orbsvcs/RtecEventChannelAdminS.h"
+
+TAO_BEGIN_VERSIONED_NAMESPACE_DECL
+
+template<class> class TAO_ESF_Worker;
+
+/**
+ * @class TAO_EC_Event_Channel_Attributes
+ *
+ * @brief Defines the construction time attributes for the Event
+ * Channel.
+ *
+ * The event channel implementation is controlled by two
+ * mechanisms:
+ * The EC_Factory that provides the strategies for the EC
+ * implementation.
+ * The EC attributes that define constants and values required
+ * by the EC construction.
+ * This class encapsulates those constants and values, providing
+ * an easy mechanism to extend the attributes without requiring
+ * changes in the EC constructor.
+ */
+class TAO_RTEvent_Serv_Export TAO_EC_Event_Channel_Attributes
+{
+public:
+ /**
+ * The basic constructor.
+ * The attributes listed as arguments are *required* by the EC, and
+ * no appropiate defaults are available for them.
+ */
+ TAO_EC_Event_Channel_Attributes (PortableServer::POA_ptr supplier_poa,
+ PortableServer::POA_ptr consumer_poa);
+
+ // Most fields are public, there is no need to protect them, in fact
+ // the user should be able to set any values she wants.
+
+ /// Can consumers or suppliers invoke connect_push_* multiple times?
+ int consumer_reconnect;
+ int supplier_reconnect;
+
+ /**
+ * It not zero the event channel will send disconnect callbacks when
+ * a disconnect method is called on a Proxy. In other words, if a
+ * consumer calls disconnect_push_supplier() on its proxy the EC
+ * will invoke disconnect_push_consumer() on the consumer. A
+ * similar thing is done for suppliers.
+ * It is a matter of debate what the spec requires for the regular
+ * event service.
+ */
+ int disconnect_callbacks;
+
+ /**
+ * The scheduling service that we will use with this event channel.
+ * Notice that this is optional and will only take effect if the EC
+ * is configured with the right filtering strategies.
+ */
+ CORBA::Object_ptr scheduler;
+
+private:
+ /// Only the EC can read the private fields.
+ friend class TAO_EC_Event_Channel_Base;
+
+ /// The POAs
+ PortableServer::POA_ptr supplier_poa;
+ PortableServer::POA_ptr consumer_poa;
+};
+
+/**
+ * @class TAO_EC_Event_Channel_Base
+ *
+ * @brief The RtecEventChannelAdmin::EventChannel implementation.
+ *
+ * This class is the Mediator between all the classes in the EC
+ * implementation, its main task is to redirect the messages to
+ * the right components, to hold and manage the lifetime of the
+ * long lived objects (Timer_Module, SupplierAdmin,
+ * ConsumerAdmin and Dispatching) and to provide a simpler
+ * interface to the EC_Factory.
+ */
+class TAO_RTEvent_Serv_Export TAO_EC_Event_Channel_Base
+ : public POA_RtecEventChannelAdmin::EventChannel
+{
+public:
+ /// destructor
+ virtual ~TAO_EC_Event_Channel_Base (void);
+
+ /// Start the internal threads (if any), etc.
+ /// After this call the EC can be used.
+ virtual void activate (ACE_ENV_SINGLE_ARG_DECL_WITH_DEFAULTS);
+
+ /// Shutdown any internal threads, cleanup all the internal
+ /// structures, flush all the messages, etc.
+ virtual void shutdown (ACE_ENV_SINGLE_ARG_DECL_WITH_DEFAULTS);
+
+ virtual void for_each_consumer (
+ TAO_ESF_Worker<TAO_EC_ProxyPushSupplier> *worker
+ ACE_ENV_ARG_DECL)
+ ACE_THROW_SPEC ((CORBA::SystemException));
+
+ virtual void for_each_supplier (
+ TAO_ESF_Worker<TAO_EC_ProxyPushConsumer> *worker
+ ACE_ENV_ARG_DECL)
+ ACE_THROW_SPEC ((CORBA::SystemException));
+
+ /// Access the dispatching module....
+ TAO_EC_Dispatching* dispatching (void) const;
+
+ /// Access the filter builder....
+ TAO_EC_Filter_Builder* filter_builder (void) const;
+
+ /// Access the filter builder....
+ TAO_EC_Supplier_Filter_Builder* supplier_filter_builder (void) const;
+
+ /// Access the consumer admin implementation, useful for controlling
+ /// the activation...
+ TAO_EC_ConsumerAdmin* consumer_admin (void) const;
+
+ /// Access the supplier admin implementation, useful for controlling
+ /// the activation...
+ TAO_EC_SupplierAdmin* supplier_admin (void) const;
+
+ /// Access the timer module...
+ TAO_EC_Timeout_Generator* timeout_generator (void) const;
+
+ /// Access the scheduling strategy
+ TAO_EC_Scheduling_Strategy* scheduling_strategy (void) const;
+
+ /// Access the client control strategies.
+ TAO_EC_ConsumerControl *consumer_control (void) const;
+ TAO_EC_SupplierControl *supplier_control (void) const;
+
+ // = The factory methods, they delegate on the EC_Factory.
+ /// Create and destroy a ProxyPushSupplier
+ void create_proxy (TAO_EC_ProxyPushSupplier*&);
+ void destroy_proxy (TAO_EC_ProxyPushSupplier*);
+
+ /// Create and destroy a ProxyPushConsumer
+ void create_proxy (TAO_EC_ProxyPushConsumer*&);
+ void destroy_proxy (TAO_EC_ProxyPushConsumer*);
+
+
+ /// Create and destroy a the collections used to store
+ /// ProxyPushSuppliers
+ void create_proxy_collection (TAO_EC_ProxyPushSupplier_Collection*&);
+ void destroy_proxy_collection (TAO_EC_ProxyPushSupplier_Collection*);
+
+
+ /// Create and destroy a the collections used to store
+ /// ProxyPushConsumers
+ void create_proxy_collection (TAO_EC_ProxyPushConsumer_Collection*&);
+ void destroy_proxy_collection (TAO_EC_ProxyPushConsumer_Collection*);
+
+ /// Access the supplier and consumer POAs from the factory.
+ PortableServer::POA_ptr supplier_poa (void);
+ PortableServer::POA_ptr consumer_poa (void);
+
+ /// Locking strategies for the ProxyPushConsumer and
+ /// ProxyPushSupplier objects
+ ACE_Lock* create_consumer_lock (void);
+ void destroy_consumer_lock (ACE_Lock*);
+ ACE_Lock* create_supplier_lock (void);
+ void destroy_supplier_lock (ACE_Lock*);
+
+ /// Used to inform the EC that a Consumer has connected or
+ /// disconnected from it.
+ virtual void connected (TAO_EC_ProxyPushConsumer*
+ ACE_ENV_ARG_DECL_NOT_USED);
+ virtual void reconnected (TAO_EC_ProxyPushConsumer*
+ ACE_ENV_ARG_DECL_NOT_USED);
+ virtual void disconnected (TAO_EC_ProxyPushConsumer*
+ ACE_ENV_ARG_DECL_NOT_USED);
+
+ /// Used to inform the EC that a Supplier has connected or
+ /// disconnected from it.
+ virtual void connected (TAO_EC_ProxyPushSupplier*
+ ACE_ENV_ARG_DECL_NOT_USED);
+ virtual void reconnected (TAO_EC_ProxyPushSupplier*
+ ACE_ENV_ARG_DECL_NOT_USED);
+ virtual void disconnected (TAO_EC_ProxyPushSupplier*
+ ACE_ENV_ARG_DECL_NOT_USED);
+
+ // Simple flags to control the EC behavior, set by the application
+ // at construction time.
+
+ /// Can the consumers reconnect to the EC?
+ int consumer_reconnect (void) const;
+
+ /// Can the suppliers reconnect to the EC?
+ int supplier_reconnect (void) const;
+
+ /// Should we send callback disconnect messages when a proxy is
+ /// disconnected by the client
+ int disconnect_callbacks (void) const;
+
+ /// Obtain the scheduler, the user must release
+ CORBA::Object_ptr scheduler (void);
+
+ // = The RtecEventChannelAdmin::EventChannel methods...
+ /// The default implementation is:
+ /// this->consumer_admin ()->_this (ACE_ENV_SINGLE_ARG_PARAMETER);
+ virtual RtecEventChannelAdmin::ConsumerAdmin_ptr
+ for_consumers (ACE_ENV_SINGLE_ARG_DECL)
+ ACE_THROW_SPEC ((CORBA::SystemException));
+
+ /// The default implementation is:
+ /// this->supplier_admin ()->_this (ACE_ENV_SINGLE_ARG_PARAMETER);
+ virtual RtecEventChannelAdmin::SupplierAdmin_ptr
+ for_suppliers (ACE_ENV_SINGLE_ARG_DECL)
+ ACE_THROW_SPEC ((CORBA::SystemException));
+
+ /// Commit suicide.
+ virtual void destroy (ACE_ENV_SINGLE_ARG_DECL)
+ ACE_THROW_SPEC ((CORBA::SystemException));
+
+ virtual RtecEventChannelAdmin::Observer_Handle
+ append_observer (RtecEventChannelAdmin::Observer_ptr
+ ACE_ENV_ARG_DECL)
+ ACE_THROW_SPEC ((
+ CORBA::SystemException,
+ RtecEventChannelAdmin::EventChannel::SYNCHRONIZATION_ERROR,
+ RtecEventChannelAdmin::EventChannel::CANT_APPEND_OBSERVER));
+ virtual void
+ remove_observer (RtecEventChannelAdmin::Observer_Handle
+ ACE_ENV_ARG_DECL)
+ ACE_THROW_SPEC ((
+ CORBA::SystemException,
+ RtecEventChannelAdmin::EventChannel::SYNCHRONIZATION_ERROR,
+ RtecEventChannelAdmin::EventChannel::CANT_REMOVE_OBSERVER));
+
+ /// Return 1 if the event channel is already destroyed.
+ int destroyed (void);
+
+protected:
+ /**
+ * Constructor
+ * If @a own_factory is not 0 it assumes ownership of the factory.
+ * If the @a factory is nil it uses the Service_Configurator to load
+ * the Factory, if not found it uses TAO_EC_Default_Resource_Factory
+ */
+ TAO_EC_Event_Channel_Base (const TAO_EC_Event_Channel_Attributes& attributes,
+ TAO_EC_Factory* factory = 0,
+ int own_factory = 0);
+
+ /**
+ * Get the factory.
+ */
+ TAO_EC_Factory * factory (void) const;
+
+ /**
+ * Set the factory, if @a own_factory is not 0 it assumes ownership of the
+ * factory.
+ */
+ void factory (TAO_EC_Factory* factory,
+ int own_factory = 0);
+
+ /**
+ * Create all strategies
+ */
+ void create_strategies (void);
+
+ /// Helpers. Deactivate admins from their POAs, ignoring any CORBA
+ /// exceptions.
+ //@{
+ void deactivate_supplier_admin (void);
+ void deactivate_consumer_admin (void);
+ //@}
+
+ /// The POAs used to activate "supplier-side" and "consumer-side"
+ /// objects.
+ PortableServer::POA_var supplier_poa_;
+ PortableServer::POA_var consumer_poa_;
+
+ /**
+ * This is the abstract factory that creates all the objects that
+ * compose an event channel, the event channel simply acts as a
+ * Mediator among them.
+ */
+ TAO_EC_Factory *factory_;
+
+ /// Flag that indicates if we own the factory.
+ int own_factory_;
+
+ /// The dispatching "module"
+ TAO_EC_Dispatching *dispatching_;
+
+ /// The filter builder
+ TAO_EC_Filter_Builder *filter_builder_;
+
+ /// The filter builder for suppliers
+ TAO_EC_Supplier_Filter_Builder *supplier_filter_builder_;
+
+ /// The ConsumerAdmin implementation
+ TAO_EC_ConsumerAdmin *consumer_admin_;
+
+ /// The SupplierAdmin implementation
+ TAO_EC_SupplierAdmin *supplier_admin_;
+
+ /// The timeout generator
+ TAO_EC_Timeout_Generator *timeout_generator_;
+
+ /// The observer strategy
+ TAO_EC_ObserverStrategy *observer_strategy_;
+
+ /// The scheduler (may be nil)
+ CORBA::Object_var scheduler_;
+
+ /// The scheduling strategy
+ TAO_EC_Scheduling_Strategy *scheduling_strategy_;
+
+ /// Consumer reconnection flags
+ int consumer_reconnect_;
+
+ /// Supplier reconnection flags
+ int supplier_reconnect_;
+
+ /// If not zero we send callbacks when a proxy is disconnected
+ int disconnect_callbacks_;
+
+ /// Strategies to disconnect misbehaving or destroyed consumers
+ TAO_EC_ConsumerControl *consumer_control_;
+
+ /// Strategies to disconnect misbehaving or destroyed suppliers
+ TAO_EC_SupplierControl *supplier_control_;
+
+ /// Mutex to protect the internal state
+ TAO_SYNCH_MUTEX mutex_;
+
+ /// Flag to track the status of the event channel
+ enum {
+ EC_S_IDLE
+ , EC_S_ACTIVATING
+ , EC_S_ACTIVE
+ , EC_S_DESTROYING
+ , EC_S_DESTROYED
+ };
+ int status_;
+};
+
+TAO_END_VERSIONED_NAMESPACE_DECL
+
+#if defined (__ACE_INLINE__)
+#include "orbsvcs/Event/EC_Event_Channel_Base.i"
+#endif /* __ACE_INLINE__ */
+
+#include /**/ "ace/post.h"
+
+#endif /* TAO_EC_EVENT_CHANNEL_BASE_H */
diff --git a/TAO/orbsvcs/orbsvcs/Event/EC_Event_Channel_Base.i b/TAO/orbsvcs/orbsvcs/Event/EC_Event_Channel_Base.i
new file mode 100644
index 00000000000..1883f84ef11
--- /dev/null
+++ b/TAO/orbsvcs/orbsvcs/Event/EC_Event_Channel_Base.i
@@ -0,0 +1,206 @@
+// -*- C++ -*-
+//
+// $Id$
+
+TAO_BEGIN_VERSIONED_NAMESPACE_DECL
+
+ACE_INLINE
+TAO_EC_Event_Channel_Attributes::
+TAO_EC_Event_Channel_Attributes (PortableServer::POA_ptr s_poa,
+ PortableServer::POA_ptr c_poa)
+ : consumer_reconnect (TAO_EC_DEFAULT_CONSUMER_RECONNECT),
+ supplier_reconnect (TAO_EC_DEFAULT_SUPPLIER_RECONNECT),
+ disconnect_callbacks (TAO_EC_DEFAULT_DISCONNECT_CALLBACKS),
+ scheduler (CORBA::Object::_nil ()),
+ supplier_poa (s_poa),
+ consumer_poa (c_poa)
+{
+}
+
+ACE_INLINE TAO_EC_Factory*
+TAO_EC_Event_Channel_Base::factory (void) const
+{
+ return this->factory_;
+}
+
+ACE_INLINE void
+TAO_EC_Event_Channel_Base::factory (TAO_EC_Factory* factory,
+ int own_factory)
+{
+ if (this->own_factory_)
+ delete this->factory_;
+
+ this->factory_ = factory;
+ this->own_factory_ = own_factory;
+}
+
+ACE_INLINE TAO_EC_Dispatching*
+TAO_EC_Event_Channel_Base::dispatching (void) const
+{
+ return this->dispatching_;
+}
+
+ACE_INLINE TAO_EC_Filter_Builder*
+TAO_EC_Event_Channel_Base::filter_builder (void) const
+{
+ return this->filter_builder_;
+}
+
+ACE_INLINE TAO_EC_Supplier_Filter_Builder*
+TAO_EC_Event_Channel_Base::supplier_filter_builder (void) const
+{
+ return this->supplier_filter_builder_;
+}
+
+ACE_INLINE TAO_EC_ConsumerAdmin*
+TAO_EC_Event_Channel_Base::consumer_admin (void) const
+{
+ return this->consumer_admin_;
+}
+
+ACE_INLINE TAO_EC_SupplierAdmin*
+TAO_EC_Event_Channel_Base::supplier_admin (void) const
+{
+ return this->supplier_admin_;
+}
+
+ACE_INLINE TAO_EC_Timeout_Generator*
+TAO_EC_Event_Channel_Base::timeout_generator (void) const
+{
+ return this->timeout_generator_;
+}
+
+ACE_INLINE TAO_EC_Scheduling_Strategy*
+TAO_EC_Event_Channel_Base::scheduling_strategy (void) const
+{
+ return this->scheduling_strategy_;
+}
+
+ACE_INLINE TAO_EC_ConsumerControl*
+TAO_EC_Event_Channel_Base::consumer_control (void) const
+{
+ return this->consumer_control_;
+}
+
+ACE_INLINE TAO_EC_SupplierControl*
+TAO_EC_Event_Channel_Base::supplier_control (void) const
+{
+ return this->supplier_control_;
+}
+
+ACE_INLINE void
+TAO_EC_Event_Channel_Base::create_proxy (TAO_EC_ProxyPushSupplier*& x)
+{
+ x = this->factory_->create_proxy_push_supplier (this);
+}
+
+ACE_INLINE void
+TAO_EC_Event_Channel_Base::destroy_proxy (TAO_EC_ProxyPushSupplier* supplier)
+{
+ this->factory_->destroy_proxy_push_supplier (supplier);
+}
+
+ACE_INLINE void
+TAO_EC_Event_Channel_Base::create_proxy (TAO_EC_ProxyPushConsumer*& x)
+{
+ x = this->factory_->create_proxy_push_consumer (this);
+}
+
+ACE_INLINE void
+TAO_EC_Event_Channel_Base::destroy_proxy (TAO_EC_ProxyPushConsumer* consumer)
+{
+ this->factory_->destroy_proxy_push_consumer (consumer);
+}
+
+ACE_INLINE void
+TAO_EC_Event_Channel_Base::create_proxy_collection (TAO_EC_ProxyPushConsumer_Collection*& x)
+{
+ x = this->factory_->create_proxy_push_consumer_collection (this);
+}
+
+ACE_INLINE void
+TAO_EC_Event_Channel_Base::destroy_proxy_collection (TAO_EC_ProxyPushConsumer_Collection* x)
+{
+ this->factory_->destroy_proxy_push_consumer_collection (x);
+}
+
+ACE_INLINE void
+TAO_EC_Event_Channel_Base::create_proxy_collection (TAO_EC_ProxyPushSupplier_Collection*& x)
+{
+ x = this->factory_->create_proxy_push_supplier_collection (this);
+}
+
+ACE_INLINE void
+TAO_EC_Event_Channel_Base::destroy_proxy_collection (TAO_EC_ProxyPushSupplier_Collection* x)
+{
+ this->factory_->destroy_proxy_push_supplier_collection (x);
+}
+
+ACE_INLINE PortableServer::POA_ptr
+TAO_EC_Event_Channel_Base::supplier_poa (void)
+{
+ return PortableServer::POA::_duplicate (this->supplier_poa_.in ());
+}
+
+ACE_INLINE PortableServer::POA_ptr
+TAO_EC_Event_Channel_Base::consumer_poa (void)
+{
+ return PortableServer::POA::_duplicate (this->consumer_poa_.in ());
+}
+
+ACE_INLINE ACE_Lock*
+TAO_EC_Event_Channel_Base::create_consumer_lock (void)
+{
+ return this->factory_->create_consumer_lock ();
+}
+
+ACE_INLINE void
+TAO_EC_Event_Channel_Base::destroy_consumer_lock (ACE_Lock* x)
+{
+ this->factory_->destroy_consumer_lock (x);
+}
+
+ACE_INLINE ACE_Lock*
+TAO_EC_Event_Channel_Base::create_supplier_lock (void)
+{
+ return this->factory_->create_supplier_lock ();
+}
+
+ACE_INLINE void
+TAO_EC_Event_Channel_Base::destroy_supplier_lock (ACE_Lock* x)
+{
+ this->factory_->destroy_supplier_lock (x);
+}
+
+ACE_INLINE int
+TAO_EC_Event_Channel_Base::consumer_reconnect (void) const
+{
+ return this->consumer_reconnect_;
+}
+
+ACE_INLINE int
+TAO_EC_Event_Channel_Base::supplier_reconnect (void) const
+{
+ return this->supplier_reconnect_;
+}
+
+ACE_INLINE int
+TAO_EC_Event_Channel_Base::disconnect_callbacks (void) const
+{
+ return this->disconnect_callbacks_;
+}
+
+ACE_INLINE CORBA::Object_ptr
+TAO_EC_Event_Channel_Base::scheduler (void)
+{
+ return CORBA::Object::_duplicate (this->scheduler_.in ());
+}
+
+ACE_INLINE int
+TAO_EC_Event_Channel_Base::destroyed (void)
+{
+ ACE_GUARD_RETURN (TAO_SYNCH_MUTEX, ace_mon, this->mutex_, 0);
+ return (this->status_ == EC_S_DESTROYED);
+}
+
+TAO_END_VERSIONED_NAMESPACE_DECL
diff --git a/TAO/orbsvcs/orbsvcs/Event/EC_Factory.cpp b/TAO/orbsvcs/orbsvcs/Event/EC_Factory.cpp
new file mode 100644
index 00000000000..0612521f408
--- /dev/null
+++ b/TAO/orbsvcs/orbsvcs/Event/EC_Factory.cpp
@@ -0,0 +1,14 @@
+// $Id$
+
+#include "orbsvcs/Event/EC_Factory.h"
+#include "ace/Dynamic_Service.h"
+
+ACE_RCSID(Event, EC_Factory, "$Id$")
+
+TAO_BEGIN_VERSIONED_NAMESPACE_DECL
+
+TAO_EC_Factory::~TAO_EC_Factory (void)
+{
+}
+
+TAO_END_VERSIONED_NAMESPACE_DECL
diff --git a/TAO/orbsvcs/orbsvcs/Event/EC_Factory.h b/TAO/orbsvcs/orbsvcs/Event/EC_Factory.h
new file mode 100644
index 00000000000..a3cd903d4f4
--- /dev/null
+++ b/TAO/orbsvcs/orbsvcs/Event/EC_Factory.h
@@ -0,0 +1,169 @@
+// -*- C++ -*-
+/**
+ * @file EC_Factory.h
+ *
+ * $Id$
+ *
+ * @author Carlos O'Ryan (coryan@cs.wustl.edu)
+ *
+ * Based on previous work by Tim Harrison (harrison@cs.wustl.edu) and
+ * other members of the DOC group. More details can be found in:
+ *
+ * http://doc.ece.uci.edu/~coryan/EC/index.html
+ */
+
+#ifndef TAO_EC_FACTORY_H
+#define TAO_EC_FACTORY_H
+
+#include /**/ "ace/pre.h"
+
+#include /**/ "orbsvcs/Event/event_serv_export.h"
+
+#if !defined (ACE_LACKS_PRAGMA_ONCE)
+# pragma once
+#endif /* ACE_LACKS_PRAGMA_ONCE */
+
+#include "tao/Versioned_Namespace.h"
+
+#include "ace/Service_Object.h"
+
+ACE_BEGIN_VERSIONED_NAMESPACE_DECL
+class ACE_Lock;
+ACE_END_VERSIONED_NAMESPACE_DECL
+
+TAO_BEGIN_VERSIONED_NAMESPACE_DECL
+
+class TAO_EC_Event_Channel_Base;
+
+class TAO_EC_Dispatching;
+class TAO_EC_Filter_Builder;
+class TAO_EC_Supplier_Filter_Builder;
+class TAO_EC_ConsumerAdmin;
+class TAO_EC_SupplierAdmin;
+class TAO_EC_ProxyPushConsumer;
+class TAO_EC_ProxyPushSupplier;
+class TAO_EC_ObserverStrategy;
+template<class PROXY> class TAO_ESF_Proxy_Collection;
+class TAO_EC_Timeout_Generator;
+class TAO_EC_Scheduling_Strategy;
+class TAO_EC_ConsumerControl;
+class TAO_EC_SupplierControl;
+
+typedef TAO_ESF_Proxy_Collection<TAO_EC_ProxyPushConsumer> TAO_EC_ProxyPushConsumer_Collection;
+typedef TAO_ESF_Proxy_Collection<TAO_EC_ProxyPushSupplier> TAO_EC_ProxyPushSupplier_Collection;
+
+/**
+ * @class TAO_EC_Factory
+ *
+ * @brief Abstract base class for the Event Channel components.
+ *
+ * Defines the EC_Factory interface.
+ *
+ * <H2>Memory Management</H2>
+ * The objects it creates are owned by this class, the client must
+ * invoke the corresponding destroy() method to release them.
+ * Some implementations may require a different instance for the
+ * EC_Factory for each instance of Event_Channel.
+ */
+class TAO_RTEvent_Serv_Export TAO_EC_Factory : public ACE_Service_Object
+{
+public:
+ /// destructor...
+ virtual ~TAO_EC_Factory (void);
+
+ /// Create and destroy the dispatching module.
+ virtual TAO_EC_Dispatching*
+ create_dispatching (TAO_EC_Event_Channel_Base*) = 0;
+ virtual void
+ destroy_dispatching (TAO_EC_Dispatching*) = 0;
+
+ /// Create and destroy the filter builder.
+ virtual TAO_EC_Filter_Builder*
+ create_filter_builder (TAO_EC_Event_Channel_Base*) = 0;
+ virtual void
+ destroy_filter_builder (TAO_EC_Filter_Builder*) = 0;
+
+ /// Create and destroy the filter builder.
+ virtual TAO_EC_Supplier_Filter_Builder*
+ create_supplier_filter_builder (TAO_EC_Event_Channel_Base*) = 0;
+ virtual void
+ destroy_supplier_filter_builder (TAO_EC_Supplier_Filter_Builder*) = 0;
+
+ /// Create and destroy the consumer admin implementation.
+ virtual TAO_EC_ConsumerAdmin*
+ create_consumer_admin (TAO_EC_Event_Channel_Base*) = 0;
+ virtual void
+ destroy_consumer_admin (TAO_EC_ConsumerAdmin*) = 0;
+
+ /// Create and destroy the supplier admin implementation.
+ virtual TAO_EC_SupplierAdmin*
+ create_supplier_admin (TAO_EC_Event_Channel_Base*) = 0;
+ virtual void
+ destroy_supplier_admin (TAO_EC_SupplierAdmin*) = 0;
+
+ /// Create and destroy a ProxyPushSupplier
+ virtual TAO_EC_ProxyPushSupplier*
+ create_proxy_push_supplier (TAO_EC_Event_Channel_Base*) = 0;
+ virtual void
+ destroy_proxy_push_supplier (TAO_EC_ProxyPushSupplier*) = 0;
+
+ /// Create and destroy a ProxyPushConsumer
+ virtual TAO_EC_ProxyPushConsumer*
+ create_proxy_push_consumer (TAO_EC_Event_Channel_Base*) = 0;
+ virtual void
+ destroy_proxy_push_consumer (TAO_EC_ProxyPushConsumer*) = 0;
+
+ /// Create and destroy the timer module.
+ virtual TAO_EC_Timeout_Generator*
+ create_timeout_generator (TAO_EC_Event_Channel_Base*) = 0;
+ virtual void
+ destroy_timeout_generator (TAO_EC_Timeout_Generator*) = 0;
+
+ /// Create and destroy the observer strategy.
+ virtual TAO_EC_ObserverStrategy*
+ create_observer_strategy (TAO_EC_Event_Channel_Base*) = 0;
+ virtual void
+ destroy_observer_strategy (TAO_EC_ObserverStrategy*) = 0;
+
+ /// Create and destroy the observer strategy.
+ virtual TAO_EC_Scheduling_Strategy*
+ create_scheduling_strategy (TAO_EC_Event_Channel_Base*) = 0;
+ virtual void
+ destroy_scheduling_strategy (TAO_EC_Scheduling_Strategy*) = 0;
+
+ /// Create and destroy a collection of TAO_EC_ProxyPushConsumers
+ virtual TAO_EC_ProxyPushConsumer_Collection*
+ create_proxy_push_consumer_collection (TAO_EC_Event_Channel_Base*) = 0;
+ virtual void
+ destroy_proxy_push_consumer_collection (TAO_EC_ProxyPushConsumer_Collection*) = 0;
+
+ /// Create and destroy a collection of TAO_EC_ProxyPushSuppliers
+ virtual TAO_EC_ProxyPushSupplier_Collection*
+ create_proxy_push_supplier_collection (TAO_EC_Event_Channel_Base*) = 0;
+ virtual void
+ destroy_proxy_push_supplier_collection (TAO_EC_ProxyPushSupplier_Collection*) = 0;
+
+ /// Create and destroy the locking strategies for both
+ /// ProxyPushConsumers and ProxyPushSuppliers
+ virtual ACE_Lock* create_consumer_lock (void) = 0;
+ virtual void destroy_consumer_lock (ACE_Lock*) = 0;
+ virtual ACE_Lock* create_supplier_lock (void) = 0;
+ virtual void destroy_supplier_lock (ACE_Lock*) = 0;
+
+ /// The ConsumerControl and SupplierControl strategies are used to
+ /// discard non-existent consumers and suppliers
+ virtual TAO_EC_ConsumerControl*
+ create_consumer_control (TAO_EC_Event_Channel_Base*) = 0;
+ virtual void
+ destroy_consumer_control (TAO_EC_ConsumerControl*) = 0;
+ virtual TAO_EC_SupplierControl*
+ create_supplier_control (TAO_EC_Event_Channel_Base*) = 0;
+ virtual void
+ destroy_supplier_control (TAO_EC_SupplierControl*) = 0;
+};
+
+TAO_END_VERSIONED_NAMESPACE_DECL
+
+#include /**/ "ace/post.h"
+
+#endif /* TAO_EC_FACTORY_H */
diff --git a/TAO/orbsvcs/orbsvcs/Event/EC_Filter.cpp b/TAO/orbsvcs/orbsvcs/Event/EC_Filter.cpp
new file mode 100644
index 00000000000..55f0de96038
--- /dev/null
+++ b/TAO/orbsvcs/orbsvcs/Event/EC_Filter.cpp
@@ -0,0 +1,130 @@
+// $Id$
+
+#include "orbsvcs/Event/EC_Filter.h"
+#include "orbsvcs/Event/EC_QOS_Info.h"
+
+#include "tao/ORB_Constants.h"
+
+#if ! defined (__ACE_INLINE__)
+#include "orbsvcs/Event/EC_Filter.i"
+#endif /* __ACE_INLINE__ */
+
+ACE_RCSID (Event,
+ EC_Filter,
+ "$Id$")
+
+TAO_BEGIN_VERSIONED_NAMESPACE_DECL
+
+TAO_EC_Filter::~TAO_EC_Filter (void)
+{
+}
+
+void
+TAO_EC_Filter::adopt_child (TAO_EC_Filter* child)
+{
+ child->parent_ = this;
+}
+
+TAO_EC_Filter::ChildrenIterator
+TAO_EC_Filter::begin (void) const
+{
+ return 0;
+}
+
+TAO_EC_Filter::ChildrenIterator
+TAO_EC_Filter::end (void) const
+{
+ return 0;
+}
+
+int
+TAO_EC_Filter::size (void) const
+{
+ return 0;
+}
+
+void
+TAO_EC_Filter::get_qos_info (TAO_EC_QOS_Info& qos_info
+ ACE_ENV_ARG_DECL)
+{
+ ACE_UNUSED_ARG (qos_info);
+ ACE_THROW (CORBA::NO_IMPLEMENT (TAO::VMCID,
+ CORBA::COMPLETED_NO));
+}
+
+// ****************************************************************
+
+int
+TAO_EC_Null_Filter::filter (const RtecEventComm::EventSet& event,
+ TAO_EC_QOS_Info& qos_info
+ ACE_ENV_ARG_DECL)
+{
+ // This is a leaf, no need to query any children, and we accept all
+ // events, so push it.
+ this->push (event, qos_info ACE_ENV_ARG_PARAMETER);
+ ACE_CHECK_RETURN (0);
+ return 1;
+}
+
+int
+TAO_EC_Null_Filter::filter_nocopy (RtecEventComm::EventSet& event,
+ TAO_EC_QOS_Info& qos_info
+ ACE_ENV_ARG_DECL)
+{
+ // This is a leaf, no need to query any children, and we accept all
+ // events, so push it.
+ this->push_nocopy (event, qos_info ACE_ENV_ARG_PARAMETER);
+ ACE_CHECK_RETURN (0);
+ return 1;
+}
+
+void
+TAO_EC_Null_Filter::push (const RtecEventComm::EventSet& event,
+ TAO_EC_QOS_Info& qos_info
+ ACE_ENV_ARG_DECL)
+{
+ if (this->parent () != 0)
+ this->parent ()->push (event, qos_info ACE_ENV_ARG_PARAMETER);
+}
+
+void
+TAO_EC_Null_Filter::push_nocopy (RtecEventComm::EventSet& event,
+ TAO_EC_QOS_Info& qos_info
+ ACE_ENV_ARG_DECL)
+{
+ if (this->parent () != 0)
+ this->parent ()->push_nocopy (event, qos_info ACE_ENV_ARG_PARAMETER);
+}
+
+void
+TAO_EC_Null_Filter::clear (void)
+{
+ // do nothing
+}
+
+CORBA::ULong
+TAO_EC_Null_Filter::max_event_size (void) const
+{
+ // @@ Is there a better way to express this?
+ return 0;
+}
+
+int
+TAO_EC_Null_Filter::can_match (const RtecEventComm::EventHeader&) const
+{
+ // @@ This method should be correctly so we can implement null
+ // filtering at the consumers but real filtering on the suppliers.
+ return 1;
+}
+
+int
+TAO_EC_Null_Filter::add_dependencies (
+ const RtecEventComm::EventHeader &,
+ const TAO_EC_QOS_Info &
+ ACE_ENV_ARG_DECL_NOT_USED)
+
+{
+ return 0;
+}
+
+TAO_END_VERSIONED_NAMESPACE_DECL
diff --git a/TAO/orbsvcs/orbsvcs/Event/EC_Filter.h b/TAO/orbsvcs/orbsvcs/Event/EC_Filter.h
new file mode 100644
index 00000000000..d092917ab4e
--- /dev/null
+++ b/TAO/orbsvcs/orbsvcs/Event/EC_Filter.h
@@ -0,0 +1,225 @@
+// -*- C++ -*-
+/**
+ * @file EC_Filter.h
+ *
+ * $Id$
+ *
+ * @author Carlos O'Ryan (coryan@cs.wustl.edu)
+ *
+ * Based on previous work by Tim Harrison (harrison@cs.wustl.edu) and
+ * other members of the DOC group. More details can be found in:
+ *
+ * http://doc.ece.uci.edu/~coryan/EC/index.html
+ */
+
+#ifndef TAO_EC_FILTER_H
+#define TAO_EC_FILTER_H
+
+#include /**/ "ace/pre.h"
+
+#include "orbsvcs/RtecEventCommC.h"
+
+#include /**/ "orbsvcs/Event/event_serv_export.h"
+
+#if !defined (ACE_LACKS_PRAGMA_ONCE)
+# pragma once
+#endif /* ACE_LACKS_PRAGMA_ONCE */
+
+TAO_BEGIN_VERSIONED_NAMESPACE_DECL
+
+class TAO_EC_QOS_Info;
+
+/**
+ * @class TAO_EC_Filter
+ *
+ * @brief Abstract base class for the filter hierarchy.
+ *
+ * The per-consumer filtering mechanisms.
+ * The EC needs to filter data passed to the consumers, so it can
+ * correctly satisfy its subscription requirements.
+ * This filtering can include correlations, sequences, timeouts,
+ * etc. each consumer can request different filtering criteria.
+ * Different filtering objects are associated with each consumer,
+ * the filters are organized in a hierarchical structure,
+ * corresponding to the subscription "expression" that the events
+ * must satisfy.
+ * The hierarchy is constructed using the "Builder" pattern.
+ *
+ * <H2>Memory Management</H2>
+ * It does *not* assume ownership of its parent.
+ */
+class TAO_RTEvent_Serv_Export TAO_EC_Filter
+{
+public:
+ /// constructor...
+ TAO_EC_Filter (void);
+
+ /// destructor...
+ virtual ~TAO_EC_Filter (void);
+
+ /// Obtain the parent of this filter.
+ TAO_EC_Filter* parent (void) const;
+
+ /// Become the parent of @a child.
+ void adopt_child (TAO_EC_Filter* child);
+
+ /// Matches two event headers.
+ /// @todo Should we strategize the algorithm used to match headers?
+ static int matches (const RtecEventComm::EventHeader& rhs,
+ const RtecEventComm::EventHeader& lhs);
+
+ typedef TAO_EC_Filter* value_type;
+ typedef TAO_EC_Filter* const const_value_type;
+ typedef const_value_type* ChildrenIterator;
+
+ /**
+ * STL-like iterators
+ * Filters follow the Composite pattern. All filters expose the same
+ * interface as if they all had children, but for simple filters the
+ * iterators return an empty range.
+ */
+ virtual ChildrenIterator begin (void) const;
+ virtual ChildrenIterator end (void) const;
+ virtual int size (void) const;
+
+ /**
+ * Filter this event, returns 1 if the event is accepted, 0
+ * otherwise.
+ * Notice that there are two versions of the method, if the event is
+ * not const then filter can take ownership of the event.
+ *
+ * @attention There seems to be a disparity in interfaces: Supplier
+ * always push event sets of size 1 to the EC_ProxyPushSupplier, and
+ * EC_Filters do not implement handling of sets of more than 1
+ * event. Then, why is this not enforced by the interface by having
+ * EC_ProxyPushSupplier take an event rather than a set?
+ */
+ virtual int filter (const RtecEventComm::EventSet& event,
+ TAO_EC_QOS_Info& qos_info
+ ACE_ENV_ARG_DECL) = 0;
+ virtual int filter_nocopy (RtecEventComm::EventSet& event,
+ TAO_EC_QOS_Info& qos_info
+ ACE_ENV_ARG_DECL) = 0;
+
+ /**
+ * This is called by the children when they accept an event and
+ * which to pass it up.
+ * Notice that there are two versions of the method, if the event is
+ * not const then filter can take ownership of the event.
+ */
+ virtual void push (const RtecEventComm::EventSet& event,
+ TAO_EC_QOS_Info& qos_info
+ ACE_ENV_ARG_DECL) = 0;
+ virtual void push_nocopy (RtecEventComm::EventSet& event,
+ TAO_EC_QOS_Info& qos_info
+ ACE_ENV_ARG_DECL) = 0;
+
+ /// Clear any saved state, must reset and assume no events have been
+ /// received.
+ virtual void clear (void) = 0;
+
+ /// Returns the maximum size of the events pushed by this filter.
+ virtual CORBA::ULong max_event_size (void) const = 0;
+
+ /**
+ * Returns 0 if an event with that header could never be accepted.
+ * This can used by the suppliers to filter out consumers that
+ * couldn't possibly be interested in their events.
+ * The rt_info and
+ */
+ virtual int can_match (const RtecEventComm::EventHeader& header) const = 0;
+
+ /**
+ * This is used for computing the scheduling dependencies:
+ *
+ * Leaf filters check if the header could be matched, similar to the
+ * can_match() method; if it does they return 1, and 0 otherwise.
+ * Intermediate nodes always return 0.
+ *
+ * This is used to build precise dependencies between the suppliers
+ * and the leaf of the filters that accept that event. Notice that
+ * only the nodes doing scheduling recurse through the list, so in
+ * configurations that do no require scheduling the recursion stops
+ * fairly soon.
+ */
+ virtual int add_dependencies (const RtecEventComm::EventHeader& header,
+ const TAO_EC_QOS_Info& qos_info
+ ACE_ENV_ARG_DECL) = 0;
+
+ /**
+ * Obtain the QOS information for this filter, the default
+ * implementation returns an invalid QOS. Only the filters that
+ * support scheduling information implement this method.
+ * @return Returns 0 on success and -1 on failure
+ */
+ virtual void get_qos_info (TAO_EC_QOS_Info& qos_info
+ ACE_ENV_ARG_DECL);
+
+private:
+ /// The parent...
+ TAO_EC_Filter* parent_;
+};
+
+// ****************************************************************
+
+/**
+ * @class TAO_EC_Null_Filter
+ *
+ * @brief A null filter
+ *
+ * This filter accepts any kind of event, it is useful for the
+ * implementation:
+ * a) Consumers that accept all events
+ * b) Consumers that trust the filtering done at the Supplier
+ * layer.
+ * c) Event Channels that don't do filtering (such as CosEC
+ * backends)
+ */
+class TAO_RTEvent_Serv_Export TAO_EC_Null_Filter : public TAO_EC_Filter
+{
+public:
+ /// Constructor.
+ TAO_EC_Null_Filter (void);
+
+ // = The TAO_EC_Filter methods, please check the documentation in
+ // TAO_EC_Filter.
+ virtual int filter (const RtecEventComm::EventSet& event,
+ TAO_EC_QOS_Info& qos_info
+ ACE_ENV_ARG_DECL);
+ virtual int filter_nocopy (RtecEventComm::EventSet& event,
+ TAO_EC_QOS_Info& qos_info
+ ACE_ENV_ARG_DECL);
+ virtual void push (const RtecEventComm::EventSet& event,
+ TAO_EC_QOS_Info& qos_info
+ ACE_ENV_ARG_DECL);
+ virtual void push_nocopy (RtecEventComm::EventSet& event,
+ TAO_EC_QOS_Info& qos_info
+ ACE_ENV_ARG_DECL);
+ virtual void clear (void);
+ virtual CORBA::ULong max_event_size (void) const;
+ virtual int can_match (const RtecEventComm::EventHeader& header) const;
+ virtual int add_dependencies (const RtecEventComm::EventHeader& header,
+ const TAO_EC_QOS_Info &qos_info
+ ACE_ENV_ARG_DECL);
+};
+
+// ****************************************************************
+
+// @@ Add more types of filters like:
+// - Events in a sequence.
+// - Events in a sequence with timeouts.
+// - Conjunction with timeout [as opposed to disjunction of
+// conjunction and a timeout]
+// - etc.
+
+// ****************************************************************
+
+TAO_END_VERSIONED_NAMESPACE_DECL
+
+#if defined (__ACE_INLINE__)
+#include "orbsvcs/Event/EC_Filter.i"
+#endif /* __ACE_INLINE__ */
+
+#include /**/ "ace/post.h"
+
+#endif /* TAO_EC_FILTER_H */
diff --git a/TAO/orbsvcs/orbsvcs/Event/EC_Filter.i b/TAO/orbsvcs/orbsvcs/Event/EC_Filter.i
new file mode 100644
index 00000000000..a5b9e121522
--- /dev/null
+++ b/TAO/orbsvcs/orbsvcs/Event/EC_Filter.i
@@ -0,0 +1,45 @@
+// -*- C++ -*-
+//
+// $Id$
+
+TAO_BEGIN_VERSIONED_NAMESPACE_DECL
+
+ACE_INLINE
+TAO_EC_Filter::TAO_EC_Filter (void)
+ : parent_ (0)
+{
+}
+
+ACE_INLINE TAO_EC_Filter*
+TAO_EC_Filter::parent (void) const
+{
+ return this->parent_;
+}
+
+ACE_INLINE int
+TAO_EC_Filter::matches (const RtecEventComm::EventHeader& rhs,
+ const RtecEventComm::EventHeader& lhs)
+{
+ if ((rhs.source == 0 && rhs.type == 0)
+ || (lhs.source == 0 && lhs.type == 0))
+ return 1;
+
+ if (rhs.source == 0 || lhs.source == 0)
+ return rhs.type == lhs.type;
+
+ if (rhs.type == 0 || lhs.type == 0)
+ return rhs.source == lhs.source;
+
+ return (rhs.type == lhs.type && rhs.source == lhs.source);
+}
+
+// ****************************************************************
+
+ACE_INLINE
+TAO_EC_Null_Filter::TAO_EC_Null_Filter (void)
+{
+}
+
+// ****************************************************************
+
+TAO_END_VERSIONED_NAMESPACE_DECL
diff --git a/TAO/orbsvcs/orbsvcs/Event/EC_Filter_Builder.cpp b/TAO/orbsvcs/orbsvcs/Event/EC_Filter_Builder.cpp
new file mode 100644
index 00000000000..07934456276
--- /dev/null
+++ b/TAO/orbsvcs/orbsvcs/Event/EC_Filter_Builder.cpp
@@ -0,0 +1,33 @@
+// $Id$
+
+#include "orbsvcs/Event/EC_Filter_Builder.h"
+#include "orbsvcs/Event/EC_Filter.h"
+
+#if ! defined (__ACE_INLINE__)
+#include "orbsvcs/Event/EC_Filter_Builder.i"
+#endif /* __ACE_INLINE__ */
+
+ACE_RCSID(Event, EC_Filter_Builder, "$Id$")
+
+TAO_BEGIN_VERSIONED_NAMESPACE_DECL
+
+TAO_EC_Filter_Builder::~TAO_EC_Filter_Builder (void)
+{
+}
+
+// ****************************************************************
+
+TAO_EC_Null_Filter_Builder::~TAO_EC_Null_Filter_Builder (void)
+{
+}
+
+TAO_EC_Filter*
+TAO_EC_Null_Filter_Builder::build (
+ TAO_EC_ProxyPushSupplier *,
+ RtecEventChannelAdmin::ConsumerQOS&
+ ACE_ENV_ARG_DECL_NOT_USED) const
+{
+ return new TAO_EC_Null_Filter;
+}
+
+TAO_END_VERSIONED_NAMESPACE_DECL
diff --git a/TAO/orbsvcs/orbsvcs/Event/EC_Filter_Builder.h b/TAO/orbsvcs/orbsvcs/Event/EC_Filter_Builder.h
new file mode 100644
index 00000000000..5d639e8d7e0
--- /dev/null
+++ b/TAO/orbsvcs/orbsvcs/Event/EC_Filter_Builder.h
@@ -0,0 +1,92 @@
+// -*- C++ -*-
+/**
+ * @file EC_Filter_Builder.h
+ *
+ * $Id$
+ *
+ * @author Carlos O'Ryan (coryan@cs.wustl.edu)
+ *
+ * Based on previous work by Tim Harrison (harrison@cs.wustl.edu) and
+ * other members of the DOC group. More details can be found in:
+ *
+ * http://doc.ece.uci.edu/~coryan/EC/index.html
+ */
+
+#ifndef TAO_EC_FILTER_BUILDER_H
+#define TAO_EC_FILTER_BUILDER_H
+
+#include /**/ "ace/pre.h"
+
+#include "orbsvcs/RtecEventChannelAdminC.h"
+
+#include /**/ "orbsvcs/Event/event_serv_export.h"
+
+#if !defined (ACE_LACKS_PRAGMA_ONCE)
+# pragma once
+#endif /* ACE_LACKS_PRAGMA_ONCE */
+
+TAO_BEGIN_VERSIONED_NAMESPACE_DECL
+
+class TAO_EC_Filter;
+class TAO_EC_ProxyPushSupplier;
+
+/**
+ * @class TAO_EC_Filter_Builder
+ *
+ * @brief Abstract base class for the filter builders.
+ *
+ * The creation of a filter hierarchy is controlled by a
+ * Filter_Builder. The relationship between TAO_EC_Filter and
+ * TAO_EC_Filter_Builder follows the "Builder Pattern" (Gamma et
+ * al.)
+ */
+class TAO_RTEvent_Serv_Export TAO_EC_Filter_Builder
+{
+public:
+ /// destructor...
+ virtual ~TAO_EC_Filter_Builder (void);
+
+ /// Create the filter, the caller must assume ownership of the filter
+ /// returned.
+ virtual TAO_EC_Filter*
+ build (TAO_EC_ProxyPushSupplier *supplier,
+ RtecEventChannelAdmin::ConsumerQOS& qos
+ ACE_ENV_ARG_DECL) const = 0;
+
+};
+
+// ****************************************************************
+
+/**
+ * @class TAO_EC_Null_Filter_Builder
+ *
+ * @brief A simple implementation of the filter builder.
+ *
+ * Simply creates a Null_Filter in every case.
+ */
+class TAO_RTEvent_Serv_Export TAO_EC_Null_Filter_Builder : public TAO_EC_Filter_Builder
+{
+public:
+ /// constructor.
+ TAO_EC_Null_Filter_Builder (void);
+
+ /// destructor...
+ virtual ~TAO_EC_Null_Filter_Builder (void);
+
+ // = The TAO_EC_Filter_Builder methods...
+ TAO_EC_Filter* build (TAO_EC_ProxyPushSupplier *supplier,
+ RtecEventChannelAdmin::ConsumerQOS& qos
+ ACE_ENV_ARG_DECL) const;
+};
+
+TAO_END_VERSIONED_NAMESPACE_DECL
+
+// ****************************************************************
+
+#if defined (__ACE_INLINE__)
+#include "orbsvcs/Event/EC_Filter_Builder.i"
+#endif /* __ACE_INLINE__ */
+
+#include /**/ "ace/post.h"
+
+#endif /* TAO_EC_FILTER_BUILDER_H */
diff --git a/TAO/orbsvcs/orbsvcs/Event/EC_Filter_Builder.i b/TAO/orbsvcs/orbsvcs/Event/EC_Filter_Builder.i
new file mode 100644
index 00000000000..89d32fe656e
--- /dev/null
+++ b/TAO/orbsvcs/orbsvcs/Event/EC_Filter_Builder.i
@@ -0,0 +1,12 @@
+// -*- C++ -*-
+//
+// $Id$
+
+TAO_BEGIN_VERSIONED_NAMESPACE_DECL
+
+ACE_INLINE
+TAO_EC_Null_Filter_Builder::TAO_EC_Null_Filter_Builder (void)
+{
+}
+
+TAO_END_VERSIONED_NAMESPACE_DECL
diff --git a/TAO/orbsvcs/orbsvcs/Event/EC_Gateway.cpp b/TAO/orbsvcs/orbsvcs/Event/EC_Gateway.cpp
new file mode 100644
index 00000000000..8addbb46165
--- /dev/null
+++ b/TAO/orbsvcs/orbsvcs/Event/EC_Gateway.cpp
@@ -0,0 +1,32 @@
+// $Id$
+
+#include "orbsvcs/Event/EC_Gateway.h"
+
+ACE_RCSID (Event,
+ EC_Gateway,
+ "$Id$")
+
+TAO_BEGIN_VERSIONED_NAMESPACE_DECL
+
+TAO_EC_Gateway::TAO_EC_Gateway (void)
+ : handle_ (0)
+{
+}
+
+TAO_EC_Gateway::~TAO_EC_Gateway (void)
+{
+}
+
+void
+TAO_EC_Gateway::observer_handle (RtecEventChannelAdmin::Observer_Handle h)
+{
+ this->handle_ = h;
+}
+
+RtecEventChannelAdmin::Observer_Handle
+TAO_EC_Gateway::observer_handle (void) const
+{
+ return this->handle_;
+}
+
+TAO_END_VERSIONED_NAMESPACE_DECL
diff --git a/TAO/orbsvcs/orbsvcs/Event/EC_Gateway.h b/TAO/orbsvcs/orbsvcs/Event/EC_Gateway.h
new file mode 100644
index 00000000000..965e6a9daf6
--- /dev/null
+++ b/TAO/orbsvcs/orbsvcs/Event/EC_Gateway.h
@@ -0,0 +1,71 @@
+// -*- C++ -*-
+
+/**
+ * @file EC_Gateway.h
+ *
+ * $Id$
+ *
+ * @author Carlos O'Ryan (coryan@cs.wustl.edu)
+ *
+ * Based on previous work by Tim Harrison (harrison@cs.wustl.edu) and
+ * other members of the DOC group. More details can be found in:
+ *
+ * http://doc.ece.uci.edu/~coryan/EC/index.html
+ */
+
+#ifndef TAO_EC_GATEWAY_H
+#define TAO_EC_GATEWAY_H
+
+#include /**/ "ace/pre.h"
+
+#include /**/ "orbsvcs/Event/event_serv_export.h"
+
+#include "orbsvcs/RtecEventChannelAdminS.h"
+#include "orbsvcs/RtecEventCommS.h"
+
+
+TAO_BEGIN_VERSIONED_NAMESPACE_DECL
+
+/**
+ * @class TAO_EC_Gateway
+ *
+ * @brief Event Channel Gateway
+ *
+ * There are several ways to connect several EC together, for
+ * instance:
+ * + A single class can use normal IIOP and connect to one EC as
+ * a supplier and to another EC as a consumer.
+ * + A class connects as a consumer and transmit the events using
+ * multicast, another class receives the multicast messages and
+ * transform them back into a push() call.
+ * This is an abstract class to represent all the different
+ * strategies for EC distribution.
+ *
+ */
+class TAO_RTEvent_Serv_Export TAO_EC_Gateway
+ : public POA_RtecEventChannelAdmin::Observer
+{
+public:
+ /// Default constructor.
+ TAO_EC_Gateway (void);
+
+ /// Destructor
+ virtual ~TAO_EC_Gateway (void);
+
+ /// The gateway must disconnect from all the relevant event channels,
+ /// or any other communication media (such as multicast groups).
+ virtual void close (ACE_ENV_SINGLE_ARG_DECL_WITH_DEFAULTS) = 0;
+
+ /// Obtain and modify the observer handle.
+ void observer_handle (RtecEventChannelAdmin::Observer_Handle h);
+ RtecEventChannelAdmin::Observer_Handle observer_handle (void) const;
+
+private:
+ RtecEventChannelAdmin::Observer_Handle handle_;
+};
+
+TAO_END_VERSIONED_NAMESPACE_DECL
+
+#include /**/ "ace/post.h"
+
+#endif /* ACE_EC_GATEWAY_H */
diff --git a/TAO/orbsvcs/orbsvcs/Event/EC_Gateway_IIOP.cpp b/TAO/orbsvcs/orbsvcs/Event/EC_Gateway_IIOP.cpp
new file mode 100644
index 00000000000..cf58d8cbd06
--- /dev/null
+++ b/TAO/orbsvcs/orbsvcs/Event/EC_Gateway_IIOP.cpp
@@ -0,0 +1,715 @@
+// $Id$
+
+#include "orbsvcs/Event/EC_Gateway_IIOP.h"
+#include "orbsvcs/Event/ECG_Defaults.h"
+#include "orbsvcs/Event_Utilities.h"
+#include "orbsvcs/Time_Utilities.h"
+
+#include "orbsvcs/Event/EC_Gateway_IIOP_Factory.h"
+#include "orbsvcs/Event/ECG_ConsumerEC_Control.h"
+
+#include "ace/Dynamic_Service.h"
+
+ACE_RCSID (Event,
+ EC_Gateway_IIOP,
+ "$Id$")
+
+TAO_BEGIN_VERSIONED_NAMESPACE_DECL
+
+TAO_EC_Gateway_IIOP::TAO_EC_Gateway_IIOP (void)
+ : busy_count_ (0),
+ update_posted_ (0),
+ cleanup_posted_ (0),
+ supplier_ec_suspended_ (0),
+ supplier_info_ (0),
+ consumer_info_ (0),
+ consumer_ (this),
+ consumer_is_active_ (0),
+ supplier_ (this),
+ supplier_is_active_ (0),
+ ec_control_ (0),
+ factory_ (0),
+ use_ttl_ (1),
+ use_consumer_proxy_map_ (1)
+{
+ if (this->factory_ == 0)
+ {
+ this->factory_ =
+ ACE_Dynamic_Service<TAO_EC_Gateway_IIOP_Factory>::instance ("EC_Gateway_IIOP_Factory");
+
+ if (this->factory_ == 0)
+ {
+ TAO_EC_Gateway_IIOP_Factory *f = 0;
+ ACE_NEW (f,
+ TAO_EC_Gateway_IIOP_Factory);
+ this->factory_ = f;
+ }
+ }
+
+ if (this->factory_ != 0)
+ {
+ this->use_ttl_ = this->factory_->use_ttl();
+ this->use_consumer_proxy_map_ = this->factory_->use_consumer_proxy_map();
+ }
+}
+
+TAO_EC_Gateway_IIOP::~TAO_EC_Gateway_IIOP (void)
+{
+ delete ec_control_;
+ ec_control_ = 0;
+}
+
+int
+TAO_EC_Gateway_IIOP::init (RtecEventChannelAdmin::EventChannel_ptr supplier_ec,
+ RtecEventChannelAdmin::EventChannel_ptr consumer_ec
+ ACE_ENV_ARG_DECL)
+{
+ ACE_GUARD_RETURN (TAO_SYNCH_MUTEX, ace_mon, this->lock_, -1);
+
+ return this->init_i (supplier_ec, consumer_ec ACE_ENV_ARG_PARAMETER);
+}
+
+int
+TAO_EC_Gateway_IIOP::init_i (RtecEventChannelAdmin::EventChannel_ptr supplier_ec,
+ RtecEventChannelAdmin::EventChannel_ptr consumer_ec
+ ACE_ENV_ARG_DECL_NOT_USED)
+{
+ if (CORBA::is_nil (this->supplier_ec_.in ()) && CORBA::is_nil (this->consumer_ec_.in ()))
+ {
+ this->supplier_ec_ =
+ RtecEventChannelAdmin::EventChannel::_duplicate (supplier_ec);
+ this->consumer_ec_ =
+ RtecEventChannelAdmin::EventChannel::_duplicate (consumer_ec);
+
+ if (ec_control_ == 0)
+ {
+ ec_control_ = factory_->create_consumerec_control(this);
+ ec_control_->activate();
+ }
+
+ return 0;
+ }
+ else
+ ACE_ERROR_RETURN ((LM_ERROR,
+ "TAO_EC_Gateway_IIOP - init_i "
+ "Supplier and consumer event channel reference "
+ "should be nil.\n"), -1);
+}
+
+void
+TAO_EC_Gateway_IIOP::close (ACE_ENV_SINGLE_ARG_DECL)
+{
+ ACE_GUARD (TAO_SYNCH_MUTEX, ace_mon, this->lock_);
+
+ this->close_i (ACE_ENV_SINGLE_ARG_PARAMETER);
+}
+
+void
+TAO_EC_Gateway_IIOP::cleanup_consumer_proxies (ACE_ENV_SINGLE_ARG_DECL)
+{
+ ACE_GUARD (TAO_SYNCH_MUTEX, ace_mon, this->lock_);
+
+ // In case we are still pushing, don't cleanup the proxies
+ if (this->busy_count_ != 0)
+ {
+ this->cleanup_posted_ = 1;
+ return;
+ }
+
+ this->cleanup_consumer_proxies_i (ACE_ENV_SINGLE_ARG_PARAMETER);
+}
+
+void
+TAO_EC_Gateway_IIOP::close_i (ACE_ENV_SINGLE_ARG_DECL)
+{
+ // ACE_DEBUG ((LM_DEBUG, "ECG (%t) Closing gateway\n"));
+ this->disconnect_consumer_proxies_i (ACE_ENV_SINGLE_ARG_PARAMETER);
+ ACE_CHECK;
+
+ this->disconnect_supplier_proxy_i (ACE_ENV_SINGLE_ARG_PARAMETER);
+ ACE_CHECK;
+}
+
+void
+TAO_EC_Gateway_IIOP::disconnect_consumer_proxies_i (ACE_ENV_SINGLE_ARG_DECL)
+{
+ if (this->consumer_proxy_map_.current_size () > 0)
+ {
+ for (Consumer_Map_Iterator j = this->consumer_proxy_map_.begin ();
+ j != this->consumer_proxy_map_.end ();
+ ++j)
+ {
+ RtecEventComm::PushConsumer_ptr consumer = (*j).int_id_;
+ if (CORBA::is_nil (consumer))
+ continue;
+ ACE_TRY
+ {
+ consumer->disconnect_push_consumer (ACE_ENV_SINGLE_ARG_PARAMETER);
+ ACE_TRY_CHECK;
+ }
+ ACE_CATCHANY
+ {
+ }
+ ACE_ENDTRY;
+ CORBA::release (consumer);
+ }
+ // Remove all the elements on the map. Calling close() does not
+ // work because the map is left in an inconsistent state.
+ this->consumer_proxy_map_.open ();
+ }
+
+ if (!CORBA::is_nil (this->default_consumer_proxy_.in ()))
+ {
+ this->default_consumer_proxy_->disconnect_push_consumer (ACE_ENV_SINGLE_ARG_PARAMETER);
+ ACE_CHECK;
+
+ this->default_consumer_proxy_ =
+ RtecEventChannelAdmin::ProxyPushConsumer::_nil ();
+ }
+}
+
+void
+TAO_EC_Gateway_IIOP::disconnect_supplier_proxy_i (ACE_ENV_SINGLE_ARG_DECL)
+{
+ if (!CORBA::is_nil (this->supplier_proxy_.in ()))
+ {
+ this->supplier_proxy_->disconnect_push_supplier (ACE_ENV_SINGLE_ARG_PARAMETER);
+ ACE_CHECK;
+
+ this->supplier_proxy_ =
+ RtecEventChannelAdmin::ProxyPushSupplier::_nil ();
+ }
+}
+
+void
+TAO_EC_Gateway_IIOP::reconnect_consumer_ec(ACE_ENV_SINGLE_ARG_DECL)
+{
+ ACE_GUARD (TAO_SYNCH_MUTEX, ace_mon, this->lock_);
+
+ if (this->busy_count_ != 0)
+ {
+ this->update_posted_ = 1;
+ return;
+ }
+
+ this->update_consumer_i (c_qos_ ACE_ENV_ARG_PARAMETER);
+}
+
+void
+TAO_EC_Gateway_IIOP::update_consumer (
+ const RtecEventChannelAdmin::ConsumerQOS& c_qos
+ ACE_ENV_ARG_DECL)
+ ACE_THROW_SPEC ((CORBA::SystemException))
+{
+ if (c_qos.dependencies.length () == 0)
+ return;
+
+ ACE_GUARD (TAO_SYNCH_MUTEX, ace_mon, this->lock_);
+
+ this->c_qos_ = c_qos;
+
+ if (this->busy_count_ != 0)
+ {
+ this->update_posted_ = 1;
+ return;
+ }
+
+ this->update_consumer_i (c_qos ACE_ENV_ARG_PARAMETER);
+}
+
+void
+TAO_EC_Gateway_IIOP::cleanup_consumer_proxies_i (ACE_ENV_SINGLE_ARG_DECL_NOT_USED)
+{
+ if (this->consumer_proxy_map_.current_size () > 0)
+ {
+ for (Consumer_Map_Iterator j = this->consumer_proxy_map_.begin ();
+ j != this->consumer_proxy_map_.end ();
+ ++j)
+ {
+ RtecEventComm::PushConsumer_ptr consumer = (*j).int_id_;
+ if (CORBA::is_nil (consumer))
+ continue;
+
+ CORBA::release (consumer);
+ }
+ // Remove all the elements on the map. Calling close() does not
+ // work because the map is left in an inconsistent state.
+ this->consumer_proxy_map_.open ();
+ }
+
+ if (!CORBA::is_nil (this->default_consumer_proxy_.in ()))
+ {
+ this->default_consumer_proxy_ =
+ RtecEventChannelAdmin::ProxyPushConsumer::_nil ();
+ }
+}
+
+void
+TAO_EC_Gateway_IIOP::update_consumer_i (
+ const RtecEventChannelAdmin::ConsumerQOS& c_qos
+ ACE_ENV_ARG_DECL)
+{
+ this->close_i (ACE_ENV_SINGLE_ARG_PARAMETER);
+ ACE_CHECK;
+
+ if (CORBA::is_nil (this->consumer_ec_.in ())
+ || CORBA::is_nil (this->supplier_ec_.in ()))
+ return;
+
+ // ACE_DEBUG ((LM_DEBUG, "ECG (%t) update_consumer_i \n"));
+
+ this->open_i (c_qos ACE_ENV_ARG_PARAMETER);
+ ACE_CHECK;
+}
+
+void
+TAO_EC_Gateway_IIOP::open_i (
+ const RtecEventChannelAdmin::ConsumerQOS& c_qos
+ ACE_ENV_ARG_DECL)
+{
+ // = Connect as a supplier to the consumer EC
+ RtecEventChannelAdmin::SupplierAdmin_var supplier_admin =
+ this->consumer_ec_->for_suppliers (ACE_ENV_SINGLE_ARG_PARAMETER);
+ ACE_CHECK;
+
+ RtecEventChannelAdmin::ConsumerQOS sub = c_qos;
+ sub.is_gateway = 1;
+
+ // Change the RT_Info in the consumer QoS.
+ // On the same loop we discover the subscriptions by event source,
+ // and fill the consumer proxy map if we have to use this map.
+ for (CORBA::ULong i = 0; i < sub.dependencies.length (); ++i)
+ {
+ sub.dependencies[i].rt_info = this->supplier_info_;
+
+ RtecEventChannelAdmin::ProxyPushConsumer_ptr proxy = 0;
+ const RtecEventComm::EventHeader &h =
+ sub.dependencies[i].event.header;
+
+ RtecEventComm::EventSourceID sid = h.source;
+
+ //ACE_DEBUG ((LM_DEBUG,
+ // "ECG (%t) trying (%d,%d)\n",
+ // sid, h.type));
+
+ // Skip all subscriptions that do not require an specific source
+ // id or skip all subscriptions when we don't need to use the consumer
+ // proxy map.
+ if (sid == ACE_ES_EVENT_SOURCE_ANY || this->use_consumer_proxy_map_ == 0)
+ continue;
+
+ // Skip all the magic event types.
+ if (ACE_ES_EVENT_ANY < h.type && h.type < ACE_ES_EVENT_UNDEFINED)
+ continue;
+
+ if (this->consumer_proxy_map_.find (sid, proxy) == -1)
+ {
+ //ACE_DEBUG ((LM_DEBUG,
+ // "ECG (%t) binding source %d\n",
+ // sid));
+ proxy = supplier_admin->obtain_push_consumer (ACE_ENV_SINGLE_ARG_PARAMETER);
+ ACE_CHECK;
+ this->consumer_proxy_map_.bind (sid, proxy);
+ }
+ }
+ //ACE_DEBUG ((LM_DEBUG,
+ // "ECG (%t) consumer map computed (%d entries)\n",
+ // this->consumer_proxy_map_.current_size ()));
+
+ if (this->consumer_proxy_map_.current_size () > 0)
+ {
+ this->supplier_is_active_ = 1;
+
+ // Obtain a reference to our supplier personality...
+ RtecEventComm::PushSupplier_var supplier_ref =
+ this->supplier_._this (ACE_ENV_SINGLE_ARG_PARAMETER);
+ ACE_CHECK;
+
+ // For each subscription by source build the set of publications
+ // (they may several, by type, for instance) and connect to the
+ // consumer proxy.
+ for (Consumer_Map_Iterator j = this->consumer_proxy_map_.begin ();
+ j != this->consumer_proxy_map_.end ();
+ ++j)
+ {
+ RtecEventChannelAdmin::SupplierQOS pub;
+ pub.publications.length (sub.dependencies.length () + 1);
+ pub.is_gateway = 1;
+
+ int c = 0;
+
+ RtecEventComm::EventSourceID sid = (*j).ext_id_;
+ for (CORBA::ULong k = 0; k < sub.dependencies.length (); ++k)
+ {
+ const RtecEventComm::EventHeader& h =
+ sub.dependencies[k].event.header;
+ if (h.source != sid
+ || (ACE_ES_EVENT_ANY < h.type
+ && h.type < ACE_ES_EVENT_UNDEFINED))
+ continue;
+ pub.publications[c].event.header = h;
+ pub.publications[c].dependency_info.dependency_type =
+ RtecBase::TWO_WAY_CALL;
+ pub.publications[c].dependency_info.number_of_calls = 1;
+ pub.publications[c].dependency_info.rt_info = this->consumer_info_;
+ c++;
+ }
+ //ACE_DEBUG ((LM_DEBUG,
+ // "ECG (%t) supplier id %d has %d elements\n",
+ // sid, c));
+ if (c == 0)
+ continue;
+
+ pub.publications.length (c);
+
+ // ACE_DEBUG ((LM_DEBUG, "ECG (%P|%t) Gateway/Supplier "));
+ // ACE_SupplierQOS_Factory::debug (pub);
+ (*j).int_id_->connect_push_supplier (supplier_ref.in (),
+ pub
+ ACE_ENV_ARG_PARAMETER);
+ ACE_CHECK;
+ }
+ }
+
+ // Also build the subscriptions that are *not* by source when we use the
+ // consumer proxy map, and all subscriptions when we don't use the map and
+ // then connect to the default consumer proxy.
+ RtecEventChannelAdmin::SupplierQOS pub;
+ pub.publications.length (sub.dependencies.length () + 1);
+ pub.is_gateway = 1;
+ int c = 0;
+ for (CORBA::ULong k = 0; k < sub.dependencies.length (); ++k)
+ {
+ const RtecEventComm::EventHeader& h =
+ sub.dependencies[k].event.header;
+ RtecEventComm::EventSourceID sid = h.source;
+
+ // Skip all subscriptions with a specific source when we use the map
+ if (sid != ACE_ES_EVENT_SOURCE_ANY && this->use_consumer_proxy_map_ == 1)
+ continue;
+
+ // Skip all the magic event types.
+ if (ACE_ES_EVENT_ANY < h.type && h.type < ACE_ES_EVENT_UNDEFINED)
+ continue;
+
+ pub.publications[c].event.header = h;
+ pub.publications[c].event.header.creation_time = ORBSVCS_Time::zero ();
+ pub.publications[c].dependency_info.dependency_type =
+ RtecBase::TWO_WAY_CALL;
+ pub.publications[c].dependency_info.number_of_calls = 1;
+ pub.publications[c].dependency_info.rt_info = this->consumer_info_;
+ c++;
+ }
+
+ if (c > 0)
+ {
+ this->supplier_is_active_ = 1;
+
+ // Obtain a reference to our supplier personality...
+ RtecEventComm::PushSupplier_var supplier_ref =
+ this->supplier_._this (ACE_ENV_SINGLE_ARG_PARAMETER);
+ ACE_CHECK;
+
+ // Obtain the consumer....
+ this->default_consumer_proxy_ =
+ supplier_admin->obtain_push_consumer (ACE_ENV_SINGLE_ARG_PARAMETER);
+ ACE_CHECK;
+
+ pub.publications.length (c);
+ // ACE_DEBUG ((LM_DEBUG, "ECG (%t) Gateway/Supplier "));
+ // ACE_SupplierQOS_Factory::debug (pub);
+ this->default_consumer_proxy_->connect_push_supplier (supplier_ref.in (),
+ pub
+ ACE_ENV_ARG_PARAMETER);
+ ACE_CHECK;
+ }
+
+ RtecEventChannelAdmin::ConsumerAdmin_var consumer_admin =
+ this->supplier_ec_->for_consumers (ACE_ENV_SINGLE_ARG_PARAMETER);
+ ACE_CHECK;
+
+ this->supplier_proxy_ =
+ consumer_admin->obtain_push_supplier (ACE_ENV_SINGLE_ARG_PARAMETER);
+ ACE_CHECK;
+
+ this->consumer_is_active_ = 1;
+ RtecEventComm::PushConsumer_var consumer_ref =
+ this->consumer_._this (ACE_ENV_SINGLE_ARG_PARAMETER);
+ ACE_CHECK;
+
+ // ACE_DEBUG ((LM_DEBUG, "ECG (%P|%t) Gateway/Consumer "));
+ // ACE_ConsumerQOS_Factory::debug (sub);
+
+ this->supplier_proxy_->connect_push_consumer (consumer_ref.in (),
+ sub
+ ACE_ENV_ARG_PARAMETER);
+ ACE_CHECK;
+}
+
+void
+TAO_EC_Gateway_IIOP::update_supplier (
+ const RtecEventChannelAdmin::SupplierQOS&
+ ACE_ENV_ARG_DECL_NOT_USED)
+ ACE_THROW_SPEC ((CORBA::SystemException))
+{
+ // Do nothing...
+}
+
+void
+TAO_EC_Gateway_IIOP::disconnect_push_consumer (ACE_ENV_SINGLE_ARG_DECL_NOT_USED)
+{
+ // ACE_DEBUG ((LM_DEBUG,
+ // "ECG (%t): Supplier-consumer received "
+ // "disconnect from channel.\n"));
+}
+
+void
+TAO_EC_Gateway_IIOP::disconnect_push_supplier (ACE_ENV_SINGLE_ARG_DECL_NOT_USED)
+{
+ // ACE_DEBUG ((LM_DEBUG,
+ // "ECG (%t): Supplier received "
+ // "disconnect from channel.\n"));
+}
+
+void
+TAO_EC_Gateway_IIOP::push (const RtecEventComm::EventSet &events
+ ACE_ENV_ARG_DECL)
+{
+ // ACE_DEBUG ((LM_DEBUG, "TAO_EC_Gateway_IIOP::push (%P|%t) - \n"));
+
+ if (events.length () == 0)
+ {
+ // ACE_DEBUG ((LM_DEBUG, "no events\n"));
+ return;
+ }
+
+ {
+ ACE_GUARD (TAO_SYNCH_MUTEX, ace_mon, this->lock_);
+
+ this->busy_count_++;
+ }
+
+ // ACE_DEBUG ((LM_DEBUG, "ECG: %d event(s)\n", events.length ()));
+
+ // @@ TODO, there is an extra data copy here, we should do the event
+ // modification without it and only compact the necessary events.
+ RtecEventComm::EventSet out (1);
+ out.length (1);
+ for (CORBA::ULong i = 0; i < events.length (); ++i)
+ {
+ if (this->use_ttl_ == 1)
+ {
+ if (events[i].header.ttl == 0)
+ continue;
+ }
+
+ RtecEventChannelAdmin::ProxyPushConsumer_ptr proxy = 0;
+ RtecEventComm::EventSourceID sid = events[i].header.source;
+ if (sid == ACE_ES_EVENT_SOURCE_ANY || this->use_consumer_proxy_map_ == 0
+ || this->consumer_proxy_map_.find (sid, proxy) == -1)
+ {
+ // If the source is not in our map or we should not use the map then
+ // use the default consumer proxy.
+ proxy = this->default_consumer_proxy_.in ();
+ }
+
+ if (CORBA::is_nil (proxy))
+ continue;
+
+ out[0] = events[i];
+
+ if (this->use_ttl_ == 1)
+ out[0].header.ttl--;
+
+ // ACE_DEBUG ((LM_DEBUG, "ECG: event sent to proxy\n"));
+ this->push_to_consumer(proxy, out ACE_ENV_ARG_PARAMETER);
+ ACE_CHECK;
+ }
+
+ {
+ ACE_GUARD (TAO_SYNCH_MUTEX, ace_mon, this->lock_);
+
+ this->busy_count_--;
+
+ if (this->busy_count_ == 0 && this->cleanup_posted_ != 0)
+ {
+ this->cleanup_posted_ = 0;
+ this->cleanup_consumer_proxies_i (ACE_ENV_SINGLE_ARG_PARAMETER);
+ ACE_CHECK;
+ }
+
+ if (this->busy_count_ == 0 && this->update_posted_ != 0)
+ {
+ this->update_posted_ = 0;
+ this->update_consumer_i (this->c_qos_ ACE_ENV_ARG_PARAMETER);
+ ACE_CHECK;
+ }
+ }
+}
+
+void
+TAO_EC_Gateway_IIOP::push_to_consumer (
+ RtecEventChannelAdmin::ProxyPushConsumer_ptr consumer,
+ const RtecEventComm::EventSet& event
+ ACE_ENV_ARG_DECL)
+{
+ ACE_TRY
+ {
+ consumer->push (event ACE_ENV_ARG_PARAMETER);
+ ACE_TRY_CHECK;
+ }
+ ACE_CATCH (CORBA::OBJECT_NOT_EXIST, not_used)
+ {
+ ec_control_->event_channel_not_exist (this ACE_ENV_ARG_PARAMETER);
+ ACE_TRY_CHECK;
+ }
+ ACE_CATCH (CORBA::SystemException, sysex)
+ {
+ ec_control_->system_exception (this,
+ sysex
+ ACE_ENV_ARG_PARAMETER);
+ ACE_TRY_CHECK;
+ }
+ ACE_CATCHANY
+ {
+ // Shouldn't happen.
+ }
+ ACE_ENDTRY;
+}
+
+int
+TAO_EC_Gateway_IIOP::shutdown (ACE_ENV_SINGLE_ARG_DECL)
+{
+ ACE_GUARD_RETURN (TAO_SYNCH_MUTEX, ace_mon, this->lock_, -1);
+
+ ec_control_->shutdown();
+
+ this->close_i (ACE_ENV_SINGLE_ARG_PARAMETER);
+ ACE_CHECK_RETURN (-1);
+
+ if (this->supplier_is_active_)
+ {
+ PortableServer::POA_var poa =
+ this->supplier_._default_POA (ACE_ENV_SINGLE_ARG_PARAMETER);
+ ACE_CHECK_RETURN (-1);
+ PortableServer::ObjectId_var id =
+ poa->servant_to_id (&this->supplier_ ACE_ENV_ARG_PARAMETER);
+ ACE_CHECK_RETURN (-1);
+ poa->deactivate_object (id.in () ACE_ENV_ARG_PARAMETER);
+ ACE_CHECK_RETURN (-1);
+ this->supplier_is_active_ = 0;
+ }
+
+ if (this->consumer_is_active_)
+ {
+ PortableServer::POA_var poa =
+ this->consumer_._default_POA (ACE_ENV_SINGLE_ARG_PARAMETER);
+ ACE_CHECK_RETURN (-1);
+ PortableServer::ObjectId_var id =
+ poa->servant_to_id (&this->consumer_ ACE_ENV_ARG_PARAMETER);
+ ACE_CHECK_RETURN (-1);
+ poa->deactivate_object (id.in () ACE_ENV_ARG_PARAMETER);
+ ACE_CHECK_RETURN (-1);
+ this->consumer_is_active_ = 0;
+ }
+
+ this->cleanup_consumer_ec_i ();
+ this->cleanup_supplier_ec_i ();
+
+ return 0;
+}
+
+int
+TAO_EC_Gateway_IIOP::cleanup_consumer_ec (void)
+{
+ ACE_GUARD_RETURN (TAO_SYNCH_MUTEX, ace_mon, this->lock_, -1);
+
+ this->cleanup_consumer_ec_i ();
+
+ return 0;
+}
+
+int
+TAO_EC_Gateway_IIOP::cleanup_supplier_ec (void)
+{
+ ACE_GUARD_RETURN (TAO_SYNCH_MUTEX, ace_mon, this->lock_, -1);
+
+ this->cleanup_supplier_ec_i ();
+
+ return 0;
+}
+
+void
+TAO_EC_Gateway_IIOP::cleanup_consumer_ec_i (void)
+{
+ this->consumer_ec_ =
+ RtecEventChannelAdmin::EventChannel::_nil ();
+}
+
+void
+TAO_EC_Gateway_IIOP::cleanup_supplier_ec_i (void)
+{
+ this->supplier_ec_ =
+ RtecEventChannelAdmin::EventChannel::_nil ();
+}
+
+CORBA::Boolean
+TAO_EC_Gateway_IIOP::is_consumer_ec_connected_i (void) const
+{
+ return !CORBA::is_nil (this->consumer_ec_.in ());
+}
+
+CORBA::Boolean
+TAO_EC_Gateway_IIOP::consumer_ec_non_existent (
+ CORBA::Boolean_out disconnected
+ ACE_ENV_ARG_DECL)
+{
+ CORBA::Object_var consumer_ec;
+ {
+ ACE_GUARD_THROW_EX (
+ TAO_SYNCH_MUTEX, ace_mon, this->lock_,
+ CORBA::INTERNAL ());
+ ACE_CHECK_RETURN (0);
+
+ disconnected = 0;
+ if (this->is_consumer_ec_connected_i () == 0)
+ {
+ disconnected = 1;
+ return 0;
+ }
+
+ consumer_ec = CORBA::Object::_duplicate (this->consumer_ec_.in ());
+ }
+
+#if (TAO_HAS_MINIMUM_CORBA == 0)
+ return consumer_ec->_non_existent (ACE_ENV_SINGLE_ARG_PARAMETER);
+#else
+ return 0;
+#endif /* TAO_HAS_MINIMUM_CORBA */
+}
+
+void
+TAO_EC_Gateway_IIOP::suspend_supplier_ec (ACE_ENV_SINGLE_ARG_DECL)
+{
+ if (!CORBA::is_nil (this->supplier_proxy_.in ()) && supplier_ec_suspended_ == 0)
+ {
+ this->supplier_proxy_->suspend_connection (ACE_ENV_SINGLE_ARG_PARAMETER);
+ ACE_CHECK;
+
+ supplier_ec_suspended_ = 1;
+ }
+}
+
+void
+TAO_EC_Gateway_IIOP::resume_supplier_ec (ACE_ENV_SINGLE_ARG_DECL)
+{
+ if (!CORBA::is_nil (this->supplier_proxy_.in ()) && supplier_ec_suspended_ == 1)
+ {
+ this->supplier_proxy_->resume_connection (ACE_ENV_SINGLE_ARG_PARAMETER);
+ ACE_CHECK;
+
+ supplier_ec_suspended_ = 0;
+ }
+}
+
+TAO_END_VERSIONED_NAMESPACE_DECL
diff --git a/TAO/orbsvcs/orbsvcs/Event/EC_Gateway_IIOP.h b/TAO/orbsvcs/orbsvcs/Event/EC_Gateway_IIOP.h
new file mode 100644
index 00000000000..6f957042c3a
--- /dev/null
+++ b/TAO/orbsvcs/orbsvcs/Event/EC_Gateway_IIOP.h
@@ -0,0 +1,255 @@
+// -*- C++ -*-
+
+/**
+ * @file EC_Gateway_IIOP.h
+ *
+ * $Id$
+ *
+ * @author Carlos O'Ryan (coryan@cs.wustl.edu)
+ * @author Johnny Willemsen (jwillemsen@remedy.nl)
+ *
+ * Based on previous work by Tim Harrison (harrison@cs.wustl.edu) and
+ * other members of the DOC group. More details can be found in:
+ *
+ * http://doc.ece.uci.edu/~coryan/EC/index.html
+ */
+
+#ifndef TAO_EC_GATEWAY_IIOP_H
+#define TAO_EC_GATEWAY_IIOP_H
+
+#include /**/ "ace/pre.h"
+
+#include /**/ "orbsvcs/Event/event_serv_export.h"
+#include "orbsvcs/Event/EC_Gateway.h"
+
+#include "orbsvcs/RtecEventChannelAdminS.h"
+#include "orbsvcs/RtecEventCommS.h"
+#include "orbsvcs/Channel_Clients_T.h"
+
+#include "ace/Map_Manager.h"
+#include "ace/Null_Mutex.h"
+
+TAO_BEGIN_VERSIONED_NAMESPACE_DECL
+
+class TAO_ECG_ConsumerEC_Control;
+class TAO_EC_Gateway_IIOP_Factory;
+
+/**
+ * @class TAO_EC_Gateway_IIOP
+ *
+ * @brief Event Channel Gateway using IIOP.
+ *
+ * This class mediates among two event channels, it connects as a consumer of
+ * events with a remote event channel, and as a supplier of events with the
+ * local EC. As a consumer it gives a QoS designed to only accept the events
+ * in which *local* consumers are interested. Eventually the local EC should
+ * create this object and compute its QoS in an automated manner; but this
+ * requires some way to filter out the peers registered as consumers,
+ * otherwise we will get loops in the QoS graph.
+ * It uses exactly the same set of events in the publications list
+ * when connected as a supplier.
+ *
+ * @note
+ * An alternative implementation would be to register with the
+ * remote EC as a supplier, and then filter on the remote EC, but
+ * one of the objectives is to minimize network traffic.
+ * On the other hand the events will be pushed to remote consumers,
+ * event though they will be dropped upon receipt (due to the TTL
+ * field); IMHO this is another suggestion that the EC needs to know
+ * (somehow) which consumers are truly its peers in disguise.
+ *
+ * @todo: The class makes an extra copy of the events, we need to
+ * investigate if closer collaboration with its collocated EC could
+ * be used to remove that copy.
+ */
+class TAO_RTEvent_Serv_Export TAO_EC_Gateway_IIOP : public TAO_EC_Gateway
+{
+public:
+ TAO_EC_Gateway_IIOP (void);
+ virtual ~TAO_EC_Gateway_IIOP (void);
+
+ /**
+ * To do its job this class requires to know the local and remote ECs it will
+ * connect to.
+ * @return 0 in case of success, -1 in case of failure
+ */
+ int init (RtecEventChannelAdmin::EventChannel_ptr supplier_ec,
+ RtecEventChannelAdmin::EventChannel_ptr consumer_ec
+ ACE_ENV_ARG_DECL);
+
+ /// The channel is disconnecting.
+ void disconnect_push_supplier (ACE_ENV_SINGLE_ARG_DECL_WITH_DEFAULTS);
+
+ /// The channel is disconnecting.
+ void disconnect_push_consumer (ACE_ENV_SINGLE_ARG_DECL_WITH_DEFAULTS);
+
+ /// This is the consumer side behavior, it pushes the events to the
+ /// local event channel.
+ void push (const RtecEventComm::EventSet &events
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS);
+
+ /// Disconnect and shutdown the gateway
+ int shutdown (ACE_ENV_SINGLE_ARG_DECL_WITH_DEFAULTS);
+
+ // The following methods are documented in the base class.
+ virtual void close (ACE_ENV_SINGLE_ARG_DECL_WITH_DEFAULTS);
+ virtual void update_consumer (const RtecEventChannelAdmin::ConsumerQOS& sub
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS)
+ ACE_THROW_SPEC ((CORBA::SystemException));
+ virtual void update_supplier (const RtecEventChannelAdmin::SupplierQOS& pub
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS)
+ ACE_THROW_SPEC ((CORBA::SystemException));
+
+ // Let the gateway reconnect itself to the consumer ec given exisiting QoS
+ void reconnect_consumer_ec(ACE_ENV_SINGLE_ARG_DECL);
+
+ /// Check whether the consumer event channel is non existent or not
+ CORBA::Boolean consumer_ec_non_existent (CORBA::Boolean_out disconnected
+ ACE_ENV_ARG_DECL);
+
+ /**
+ * Cleanup all consumer proxies we have without trying to tell the
+ * consumer that we are going to disconnect. This can be used to cleanup
+ * the consumer proxy administration in case we know that the consumers
+ * are all unreachable.
+ */
+ void cleanup_consumer_proxies (ACE_ENV_SINGLE_ARG_DECL);
+
+ /// Cleanup the connection to the consumer ec. Doesn't call anything on the
+ /// ec again, just set the object to nil
+ int cleanup_consumer_ec (void);
+
+ /// Cleanup the connection to the supplier ec. Doesn't call anything on the
+ /// ec again, just set the object to nil
+ int cleanup_supplier_ec (void);
+
+ /// Suspend the connection to the supplier ec
+ void suspend_supplier_ec (ACE_ENV_SINGLE_ARG_DECL);
+
+ /// Resume the connection to the supplier ec
+ void resume_supplier_ec (ACE_ENV_SINGLE_ARG_DECL);
+
+private:
+ void close_i (ACE_ENV_SINGLE_ARG_DECL);
+
+ /// Disconnect the supplier proxy
+ void disconnect_supplier_proxy_i (ACE_ENV_SINGLE_ARG_DECL);
+
+ /// Disconnect all consumer proxies
+ void disconnect_consumer_proxies_i (ACE_ENV_SINGLE_ARG_DECL);
+
+ /// Remove all consumer proxies without calling disconnect on them
+ void cleanup_consumer_proxies_i (ACE_ENV_SINGLE_ARG_DECL);
+
+ void update_consumer_i (const RtecEventChannelAdmin::ConsumerQOS& sub
+ ACE_ENV_ARG_DECL);
+
+ /// Create all connections to consumer ec and to supplier ec.
+ void open_i (const RtecEventChannelAdmin::ConsumerQOS& sub
+ ACE_ENV_ARG_DECL);
+
+ /// Helper method to see if consumer ec is connected
+ CORBA::Boolean is_consumer_ec_connected_i (void) const;
+
+ /// Push the @a event to the @a consumer.
+ void push_to_consumer (RtecEventChannelAdmin::ProxyPushConsumer_ptr consumer,
+ const RtecEventComm::EventSet& event ACE_ENV_ARG_DECL);
+
+ void cleanup_consumer_ec_i (void);
+
+ void cleanup_supplier_ec_i (void);
+
+protected:
+ /// Do the real work in init()
+ int init_i (RtecEventChannelAdmin::EventChannel_ptr supplier_ec,
+ RtecEventChannelAdmin::EventChannel_ptr consumer_ec
+ ACE_ENV_ARG_DECL);
+
+protected:
+ /// Lock to synchronize internal changes
+ TAO_SYNCH_MUTEX lock_;
+
+ /// How many threads are running push() we cannot make changes until
+ /// that reaches 0
+ CORBA::ULong busy_count_;
+
+ /**
+ * An update_consumer() message arrived *while* we were doing a
+ * push() the modification is stored, if multiple update_consumer messages
+ * arrive only the last one is executed.
+ */
+ int update_posted_;
+ RtecEventChannelAdmin::ConsumerQOS c_qos_;
+
+ /**
+ * We have a cleanup outstanding and must wait doing cleanup until all pushes
+ * are ready.
+ */
+ int cleanup_posted_;
+
+ /**
+ * Is the supplier ec suspended?
+ */
+ int supplier_ec_suspended_;
+
+ /// The event channel acting as supplier for this gateway so we can reconnect
+ /// when the list changes.
+ RtecEventChannelAdmin::EventChannel_var supplier_ec_;
+
+ /// The event channel acting as consumer of this gateway
+ RtecEventChannelAdmin::EventChannel_var consumer_ec_;
+
+ /// Our RT_Infos for the event channel that is the supplier.
+ RtecBase::handle_t supplier_info_;
+ /// Our RT_Infos for the event channel that is the consumer.
+ RtecBase::handle_t consumer_info_;
+
+ /// Our consumer personality....
+ ACE_PushConsumer_Adapter<TAO_EC_Gateway_IIOP> consumer_;
+
+ /// If it is not 0 then we must deactivate the consumer
+ int consumer_is_active_;
+
+ /// Our supplier personality....
+ ACE_PushSupplier_Adapter<TAO_EC_Gateway_IIOP> supplier_;
+
+ /// If it is not 0 then we must deactivate the supplier
+ int supplier_is_active_;
+
+ // We use a different Consumer_Proxy
+ typedef ACE_Map_Manager<RtecEventComm::EventSourceID,RtecEventChannelAdmin::ProxyPushConsumer_ptr,ACE_Null_Mutex> Consumer_Map;
+ typedef ACE_Map_Iterator<RtecEventComm::EventSourceID,RtecEventChannelAdmin::ProxyPushConsumer_ptr,ACE_Null_Mutex> Consumer_Map_Iterator;
+
+ /// We talk to the EC (as a supplier) using either an per-supplier
+ /// proxy or a generic proxy for the type only subscriptions. We push the
+ /// events to these proxies
+ Consumer_Map consumer_proxy_map_;
+ RtecEventChannelAdmin::ProxyPushConsumer_var default_consumer_proxy_;
+
+ /// We talk to the EC (as a consumer) using this proxy. We receive the events
+ /// from these proxy
+ RtecEventChannelAdmin::ProxyPushSupplier_var supplier_proxy_;
+
+ /// The consumer ec control which controls the behaviour in case of a
+ /// misbehaving consumer ec
+ TAO_ECG_ConsumerEC_Control* ec_control_;
+
+ /// The Gateway IIOP Factory for all the settings
+ TAO_EC_Gateway_IIOP_Factory* factory_;
+
+ /// If 1, we use the TTL flags, if 0, we just ignore TTL
+ int use_ttl_;
+
+ /// The flag for using the consumer proxy map. With 1 the consumer proxy map
+ /// is used, meaning that for each unique source id we use a different
+ /// proxy push consumer, if 0, we only use one proxy push consumer (the
+ /// default) for all source ids.
+ int use_consumer_proxy_map_;
+
+};
+
+TAO_END_VERSIONED_NAMESPACE_DECL
+
+#include /**/ "ace/post.h"
+
+#endif /* ACE_EC_GATEWAY_IIOP_H */
diff --git a/TAO/orbsvcs/orbsvcs/Event/EC_Gateway_IIOP_Factory.cpp b/TAO/orbsvcs/orbsvcs/Event/EC_Gateway_IIOP_Factory.cpp
new file mode 100644
index 00000000000..ec6b0f935ca
--- /dev/null
+++ b/TAO/orbsvcs/orbsvcs/Event/EC_Gateway_IIOP_Factory.cpp
@@ -0,0 +1,212 @@
+// $Id$
+
+#include "orbsvcs/Event/EC_Gateway_IIOP_Factory.h"
+#include "orbsvcs/Event/ECG_Defaults.h"
+#include "orbsvcs/Event_Utilities.h"
+#include "orbsvcs/Time_Utilities.h"
+
+#include "ace/Dynamic_Service.h"
+#include "ace/Arg_Shifter.h"
+
+#include "orbsvcs/Event/ECG_ConsumerEC_Control.h"
+#include "orbsvcs/Event/ECG_Reactive_ConsumerEC_Control.h"
+#include "orbsvcs/Event/ECG_Reconnect_ConsumerEC_Control.h"
+#include "orbsvcs/Event/EC_Gateway_IIOP.h"
+#include "ace/OS_NS_strings.h"
+
+#if !defined (__ACE_INLINE__)
+#include "orbsvcs/Event/EC_Gateway_IIOP_Factory.i"
+#endif /* __ACE_INLINE__ */
+
+ACE_RCSID (Event,
+ EC_Gateway_IIOP_Factory,
+ "$Id$")
+
+TAO_BEGIN_VERSIONED_NAMESPACE_DECL
+
+int
+TAO_EC_Gateway_IIOP_Factory::init_svcs (void)
+{
+ return ACE_Service_Config::static_svcs ()->
+ insert (&ace_svc_desc_TAO_EC_Gateway_IIOP_Factory);
+}
+
+TAO_EC_Gateway_IIOP_Factory::TAO_EC_Gateway_IIOP_Factory (void)
+ : orbid_ (TAO_ECG_DEFAULT_IIOP_ORB_ID),
+ consumer_ec_control_ (TAO_ECG_DEFAULT_IIOP_CONSUMEREC_CONTROL),
+ consumer_ec_control_period_ (TAO_ECG_DEFAULT_IIOP_CONSUMEREC_CONTROL_PERIOD),
+ consumer_ec_control_timeout_ (TAO_ECG_DEFAULT_IIOP_CONSUMEREC_CONTROL_TIMEOUT),
+ use_ttl_ (TAO_ECG_DEFAULT_IIOP_USE_TTL),
+ use_consumer_proxy_map_ (TAO_ECG_DEFAULT_IIOP_USE_CONSUMER_PROXY_MAP)
+{
+}
+
+TAO_EC_Gateway_IIOP_Factory::~TAO_EC_Gateway_IIOP_Factory (void)
+{
+}
+
+int
+TAO_EC_Gateway_IIOP_Factory::fini (void)
+{
+ return 0;
+}
+
+int
+TAO_EC_Gateway_IIOP_Factory::init (int argc, char* argv[])
+{
+ int result = 0;
+
+ ACE_Arg_Shifter arg_shifter (argc, argv);
+
+ while (arg_shifter.is_anything_left ())
+ {
+ const char *arg = arg_shifter.get_current ();
+
+ if (ACE_OS::strcasecmp (arg, ACE_TEXT("-ECGIIOPConsumerECControl")) == 0)
+ {
+ arg_shifter.consume_arg ();
+
+ if (arg_shifter.is_parameter_next ())
+ {
+ const ACE_TCHAR* opt = arg_shifter.get_current ();
+ if (ACE_OS::strcasecmp (opt, ACE_TEXT("null")) == 0)
+ this->consumer_ec_control_ = 0;
+ else if (ACE_OS::strcasecmp (opt, ACE_TEXT("reactive")) == 0)
+ this->consumer_ec_control_ = 1;
+ else if (ACE_OS::strcasecmp (opt, ACE_TEXT("reconnect")) == 0)
+ this->consumer_ec_control_ = 2;
+ else
+ this->unsupported_option_value ("-ECGIIOPConsumerECControl", opt);
+ arg_shifter.consume_arg ();
+ }
+ }
+
+ else if (ACE_OS::strcasecmp (arg, ACE_TEXT("-ECGIIOPConsumerECControlPeriod")) == 0)
+ {
+ arg_shifter.consume_arg ();
+
+ if (arg_shifter.is_parameter_next ())
+ {
+ const ACE_TCHAR* opt = arg_shifter.get_current ();
+ this->consumer_ec_control_period_ = ACE_OS::atoi (opt);
+ arg_shifter.consume_arg ();
+ }
+ }
+
+ else if (ACE_OS::strcasecmp (arg, ACE_TEXT("-ECGIIOPConsumerECControlTimeout")) == 0)
+ {
+ arg_shifter.consume_arg ();
+
+ if (arg_shifter.is_parameter_next ())
+ {
+ const ACE_TCHAR* opt = arg_shifter.get_current ();
+ unsigned long timeout = ACE_OS::strtoul(opt, 0, 10);
+ this->consumer_ec_control_timeout_.usec(timeout);
+ arg_shifter.consume_arg ();
+ }
+ }
+
+ else if (ACE_OS::strcasecmp (arg, ACE_TEXT("-ECGIIOPUseORBId")) == 0)
+ {
+ arg_shifter.consume_arg ();
+
+ if (arg_shifter.is_parameter_next ())
+ {
+ // Save argument for later use
+ this->orbid_ = ACE_TEXT_ALWAYS_CHAR(arg_shifter.get_current ());
+ arg_shifter.consume_arg ();
+ }
+ }
+
+ else if (ACE_OS::strcasecmp (arg, ACE_TEXT("-ECGIIOPUseTTL")) == 0)
+ {
+ arg_shifter.consume_arg ();
+
+ if (arg_shifter.is_parameter_next ())
+ {
+ const ACE_TCHAR* opt = arg_shifter.get_current ();
+ this->use_ttl_ = ACE_OS::atoi (opt);
+ arg_shifter.consume_arg ();
+ }
+ }
+
+ else if (ACE_OS::strcasecmp (arg, ACE_TEXT("-ECGIIOPUseConsumerProxyMap")) == 0)
+ {
+ arg_shifter.consume_arg ();
+
+ if (arg_shifter.is_parameter_next ())
+ {
+ const ACE_TCHAR* opt = arg_shifter.get_current ();
+ this->use_consumer_proxy_map_ = ACE_OS::atoi (opt);
+ arg_shifter.consume_arg ();
+ }
+ }
+
+ else
+ {
+ arg_shifter.ignore_arg ();
+ ACE_DEBUG ((LM_WARNING,
+ "Ignoring <%s> option "
+ "during initialization.\n",
+ arg));
+ result = -1;
+ }
+ }
+
+ return result;
+}
+
+void
+TAO_EC_Gateway_IIOP_Factory::unsupported_option_value (const char * option_name,
+ const char * option_value)
+{
+ ACE_ERROR ((LM_ERROR,
+ "EC_Gateway_IIOP_Factory -"
+ "Unsupported <%s> option value: <%s>. "
+ "Ignoring this option - using defaults instead.\n",
+ option_name,
+ option_value));
+}
+
+TAO_ECG_ConsumerEC_Control*
+TAO_EC_Gateway_IIOP_Factory::create_consumerec_control (TAO_EC_Gateway_IIOP* gateway)
+{
+ if (this->consumer_ec_control_ == 0)
+ return new TAO_ECG_ConsumerEC_Control ();
+ else if (this->consumer_ec_control_ == 1)
+ {
+ int argc = 0;
+ char **argv = 0;
+ CORBA::ORB_var orb =
+ CORBA::ORB_init (argc, argv, this->orbid_.c_str ());
+ ACE_Time_Value rate (0, this->consumer_ec_control_period_);
+ return new TAO_ECG_Reactive_ConsumerEC_Control (rate, consumer_ec_control_timeout_, gateway, orb.in ());
+ }
+ else if (this->consumer_ec_control_ == 2)
+ {
+ int argc = 0;
+ char **argv = 0;
+ CORBA::ORB_var orb =
+ CORBA::ORB_init (argc, argv, this->orbid_.c_str ());
+ ACE_Time_Value rate (0, this->consumer_ec_control_period_);
+ return new TAO_ECG_Reconnect_ConsumerEC_Control (rate, consumer_ec_control_timeout_, gateway, orb.in ());
+ }
+ return 0;
+}
+
+void
+TAO_EC_Gateway_IIOP_Factory::destroy_consumerec_control (
+ TAO_ECG_ConsumerEC_Control* x)
+{
+ delete x;
+}
+
+TAO_END_VERSIONED_NAMESPACE_DECL
+
+ACE_STATIC_SVC_DEFINE (TAO_EC_Gateway_IIOP_Factory,
+ ACE_TEXT ("EC_Gateway_IIOP_Factory"),
+ ACE_SVC_OBJ_T,
+ &ACE_SVC_NAME (TAO_EC_Gateway_IIOP_Factory),
+ ACE_Service_Type::DELETE_THIS | ACE_Service_Type::DELETE_OBJ,
+ 0)
+ACE_FACTORY_DEFINE (TAO_RTEvent_Serv, TAO_EC_Gateway_IIOP_Factory)
diff --git a/TAO/orbsvcs/orbsvcs/Event/EC_Gateway_IIOP_Factory.h b/TAO/orbsvcs/orbsvcs/Event/EC_Gateway_IIOP_Factory.h
new file mode 100644
index 00000000000..2a1c30a10a0
--- /dev/null
+++ b/TAO/orbsvcs/orbsvcs/Event/EC_Gateway_IIOP_Factory.h
@@ -0,0 +1,115 @@
+// -*- C++ -*-
+
+/**
+ * @file EC_Gateway_IIOP_Factory.h
+ *
+ * $Id$
+ *
+ * @author Johnny Willemsen (jwillemsen@remedy.nl)
+ *
+ */
+
+#ifndef TAO_EC_GATEWAY_IIOP_FACTORY_H
+#define TAO_EC_GATEWAY_IIOP_FACTORY_H
+
+#include /**/ "ace/pre.h"
+#include "ace/Service_Config.h"
+
+#if !defined (ACE_LACKS_PRAGMA_ONCE)
+# pragma once
+#endif /* ACE_LACKS_PRAGMA_ONCE */
+
+#include "ace/Time_Value.h"
+#include "ace/Service_Object.h"
+#include "ace/SString.h"
+
+#include /**/ "orbsvcs/Event/event_serv_export.h"
+
+#include "tao/Versioned_Namespace.h"
+
+TAO_BEGIN_VERSIONED_NAMESPACE_DECL
+
+class TAO_ECG_ConsumerEC_Control;
+class TAO_EC_Gateway_IIOP;
+
+/**
+ * @class TAO_EC_Gateway_IIOP_Factory
+ *
+ * @brief Factory for the EC_Gateway_IIOP settings
+ *
+ * Default configuration values can be found in ECG_Defaults.h
+ */
+class TAO_RTEvent_Serv_Export TAO_EC_Gateway_IIOP_Factory
+ : public ACE_Service_Object
+{
+public:
+ TAO_EC_Gateway_IIOP_Factory (void);
+ virtual ~TAO_EC_Gateway_IIOP_Factory (void);
+
+ /// The Service_Object entry points.
+ //@{
+ virtual int init (int argc, char* argv[]);
+ virtual int fini (void);
+ //@}
+
+ /// Helper function to register the Gateway into the service
+ /// configurator.
+ static int init_svcs (void);
+
+ /// Create the consumer event channel control.
+ TAO_ECG_ConsumerEC_Control *
+ create_consumerec_control (TAO_EC_Gateway_IIOP* gateway);
+
+ /// Destroy consumer event channel control.
+ void destroy_consumerec_control (TAO_ECG_ConsumerEC_Control* x);
+
+ /// Accessors to use_ttl flag
+ int use_ttl (void) const;
+
+ /// Accessors to use_consumer_proxy_map flag
+ int use_consumer_proxy_map (void) const;
+
+private:
+ /// Helper for agrument parsing. Prints out an error message about
+ /// unsupported option value.
+ void unsupported_option_value (const char * option_name,
+ const char * option_value);
+
+protected:
+ /// Use this ORB to locate global resources.
+ ACE_CString orbid_;
+
+ /// The control policy for the consumer event channel
+ int consumer_ec_control_;
+
+ /// The consumer event channel control periods in usecs
+ int consumer_ec_control_period_;
+
+ /// The control timeout in usecs for the consumer event channel
+ ACE_Time_Value consumer_ec_control_timeout_;
+
+ /// If 1, we use the TTL flags, if 0, we just ignore TTL.
+ /// @note When this flag is set to 0, make sure that no recursive structures
+ /// exists in the gateway setup for the same source/type combination, else
+ /// one event will flow continuosly through all gateways.
+ int use_ttl_;
+
+ /// The flag for using the consumer proxy map. With 1 the consumer proxy map
+ /// is used, meaning that for each unique source id we use a different
+ /// proxy push consumer, if 0, we only use one proxy push consumer for all
+ /// source ids.
+ int use_consumer_proxy_map_;
+};
+
+TAO_END_VERSIONED_NAMESPACE_DECL
+
+ACE_STATIC_SVC_DECLARE (TAO_EC_Gateway_IIOP_Factory)
+ACE_FACTORY_DECLARE (TAO_RTEvent_Serv, TAO_EC_Gateway_IIOP_Factory)
+
+#if defined (__ACE_INLINE__)
+#include "orbsvcs/Event/EC_Gateway_IIOP_Factory.i"
+#endif /* __ACE_INLINE__ */
+
+#include /**/ "ace/post.h"
+
+#endif /* TAO_EC_GATEWAY_IIOP_FACTORY_H */
diff --git a/TAO/orbsvcs/orbsvcs/Event/EC_Gateway_IIOP_Factory.i b/TAO/orbsvcs/orbsvcs/Event/EC_Gateway_IIOP_Factory.i
new file mode 100644
index 00000000000..45dbd3f9d3f
--- /dev/null
+++ b/TAO/orbsvcs/orbsvcs/Event/EC_Gateway_IIOP_Factory.i
@@ -0,0 +1,19 @@
+// -*- C++ -*-
+//
+// $Id$
+
+TAO_BEGIN_VERSIONED_NAMESPACE_DECL
+
+ACE_INLINE int
+TAO_EC_Gateway_IIOP_Factory::use_ttl (void) const
+{
+ return this->use_ttl_;
+}
+
+ACE_INLINE int
+TAO_EC_Gateway_IIOP_Factory::use_consumer_proxy_map (void) const
+{
+ return this->use_consumer_proxy_map_;
+}
+
+TAO_END_VERSIONED_NAMESPACE_DECL
diff --git a/TAO/orbsvcs/orbsvcs/Event/EC_Gateway_Sched.cpp b/TAO/orbsvcs/orbsvcs/Event/EC_Gateway_Sched.cpp
new file mode 100644
index 00000000000..1b1a0d4479e
--- /dev/null
+++ b/TAO/orbsvcs/orbsvcs/Event/EC_Gateway_Sched.cpp
@@ -0,0 +1,82 @@
+// $Id$
+
+#include "orbsvcs/Event/EC_Gateway_Sched.h"
+#include "orbsvcs/Time_Utilities.h"
+
+ACE_RCSID (Event,
+ EC_Gateway_sched,
+ "$Id$")
+
+TAO_BEGIN_VERSIONED_NAMESPACE_DECL
+
+TAO_EC_Gateway_Sched::TAO_EC_Gateway_Sched (void)
+ : TAO_EC_Gateway_IIOP ()
+{
+}
+
+TAO_EC_Gateway_Sched::~TAO_EC_Gateway_Sched (void)
+{
+}
+
+void
+TAO_EC_Gateway_Sched::init (RtecEventChannelAdmin::EventChannel_ptr supplier_ec,
+ RtecEventChannelAdmin::EventChannel_ptr consumer_ec,
+ RtecScheduler::Scheduler_ptr supplier_sched,
+ RtecScheduler::Scheduler_ptr consumer_sched,
+ const char* consumer_name,
+ const char* supplier_name
+ ACE_ENV_ARG_DECL)
+{
+ ACE_GUARD (TAO_SYNCH_MUTEX, ace_mon, this->lock_);
+
+ this->init_i (supplier_ec, consumer_ec ACE_ENV_ARG_PARAMETER);
+ ACE_CHECK;
+
+ // @@ Should we throw a system exception here?
+ if (CORBA::is_nil (supplier_sched)
+ || CORBA::is_nil (consumer_sched)
+ || consumer_name == 0
+ || supplier_name == 0)
+ ACE_THROW (CORBA::BAD_PARAM ());
+
+ this->supplier_info_ =
+ supplier_sched->create (supplier_name ACE_ENV_ARG_PARAMETER);
+ ACE_CHECK;
+
+ // @@ TODO Many things are hard-coded in the RT_Info here.
+
+ // The worst case execution time is far less than 500 usecs, but
+ // that is a safe estimate....
+ ACE_Time_Value tv (0, 500);
+ TimeBase::TimeT time;
+ ORBSVCS_Time::Time_Value_to_TimeT (time, tv);
+ supplier_sched->set (this->supplier_info_,
+ RtecScheduler::VERY_HIGH_CRITICALITY,
+ time, time, time,
+ 25000 * 10,
+ RtecScheduler::VERY_LOW_IMPORTANCE,
+ time,
+ 0,
+ RtecScheduler::OPERATION
+ ACE_ENV_ARG_PARAMETER);
+ ACE_CHECK;
+
+ this->consumer_info_ =
+ consumer_sched->create (consumer_name ACE_ENV_ARG_PARAMETER);
+ ACE_CHECK;
+
+ tv = ACE_Time_Value (0, 500);
+ ORBSVCS_Time::Time_Value_to_TimeT (time, tv);
+ consumer_sched->set (this->consumer_info_,
+ RtecScheduler::VERY_HIGH_CRITICALITY,
+ time, time, time,
+ 25000 * 10,
+ RtecScheduler::VERY_LOW_IMPORTANCE,
+ time,
+ 1,
+ RtecScheduler::REMOTE_DEPENDANT
+ ACE_ENV_ARG_PARAMETER);
+ ACE_CHECK;
+}
+
+TAO_END_VERSIONED_NAMESPACE_DECL
diff --git a/TAO/orbsvcs/orbsvcs/Event/EC_Gateway_Sched.h b/TAO/orbsvcs/orbsvcs/Event/EC_Gateway_Sched.h
new file mode 100644
index 00000000000..5267546de17
--- /dev/null
+++ b/TAO/orbsvcs/orbsvcs/Event/EC_Gateway_Sched.h
@@ -0,0 +1,59 @@
+// -*- C++ -*-
+/**
+ * @file EC_Gateway_Sched.h
+ *
+ * $Id$
+ *
+ * @author Carlos O'Ryan (coryan@cs.wustl.edu)
+ *
+ * Based on previous work by Tim Harrison (harrison@cs.wustl.edu) and
+ * other members of the DOC group. More details can be found in:
+ *
+ * http://doc.ece.uci.edu/~coryan/EC/index.html
+ *
+ *
+ */
+
+#ifndef TAO_EC_GATEWAY_SCHED_H
+#define TAO_EC_GATEWAY_SCHED_H
+#include /**/ "ace/pre.h"
+
+#include "orbsvcs/Event/EC_Gateway_IIOP.h"
+#include "orbsvcs/RtecSchedulerC.h"
+#include "orbsvcs/Event/sched_event_export.h"
+
+// ****************************************************************
+
+TAO_BEGIN_VERSIONED_NAMESPACE_DECL
+
+/**
+ * @class TAO_EC_Gateway_Sched
+ *
+ * @brief Extend the EC_Gateway_IIOP interface to support scheduling.
+ */
+class TAO_RTSchedEvent_Export TAO_EC_Gateway_Sched : public TAO_EC_Gateway_IIOP
+{
+public:
+ TAO_EC_Gateway_Sched (void);
+ ~TAO_EC_Gateway_Sched (void);
+
+ /**
+ * To do its job this class requires to know the local and remote
+ * ECs it will connect to; furthermore it also requires to build
+ * RT_Infos for the local and remote schedulers.
+ * @todo part of the RT_Info is hardcoded, we need to make it
+ * parametric.
+ */
+ void init (RtecEventChannelAdmin::EventChannel_ptr supplier_ec,
+ RtecEventChannelAdmin::EventChannel_ptr consumer_ec,
+ RtecScheduler::Scheduler_ptr supplier_sched,
+ RtecScheduler::Scheduler_ptr consumer_sched,
+ const char* consumer_name,
+ const char* supplier_name
+ ACE_ENV_ARG_DECL);
+};
+
+TAO_END_VERSIONED_NAMESPACE_DECL
+
+#include /**/ "ace/post.h"
+#endif /* ACE_EC_GATEWAY_SCHED_H */
diff --git a/TAO/orbsvcs/orbsvcs/Event/EC_Group_Scheduling.cpp b/TAO/orbsvcs/orbsvcs/Event/EC_Group_Scheduling.cpp
new file mode 100644
index 00000000000..9e39ef1f631
--- /dev/null
+++ b/TAO/orbsvcs/orbsvcs/Event/EC_Group_Scheduling.cpp
@@ -0,0 +1,32 @@
+// $Id$
+
+#include "orbsvcs/Event/EC_Group_Scheduling.h"
+#include "orbsvcs/Event/EC_QOS_Info.h"
+#include "orbsvcs/Event/EC_Supplier_Filter.h"
+
+#if ! defined (__ACE_INLINE__)
+#include "orbsvcs/Event/EC_Group_Scheduling.inl"
+#endif /* __ACE_INLINE__ */
+
+ACE_RCSID(Event, EC_Group_Scheduling, "$Id$")
+
+void
+TAO_EC_Group_Scheduling::add_proxy_supplier_dependencies (
+ TAO_EC_ProxyPushSupplier *,
+ TAO_EC_ProxyPushConsumer *
+ ACE_ENV_ARG_DECL_NOT_USED)
+{
+}
+
+void
+TAO_EC_Group_Scheduling::schedule_event (const RtecEventComm::EventSet &event,
+ TAO_EC_ProxyPushConsumer *,
+ TAO_EC_Supplier_Filter *filter
+ ACE_ENV_ARG_DECL)
+{
+ TAO_EC_QOS_Info event_info;
+ // @@ yuck...
+ filter->push_scheduled_event (const_cast<RtecEventComm::EventSet&> (event),
+ event_info
+ ACE_ENV_ARG_PARAMETER);
+}
diff --git a/TAO/orbsvcs/orbsvcs/Event/EC_Group_Scheduling.h b/TAO/orbsvcs/orbsvcs/Event/EC_Group_Scheduling.h
new file mode 100644
index 00000000000..1a9b35f07e2
--- /dev/null
+++ b/TAO/orbsvcs/orbsvcs/Event/EC_Group_Scheduling.h
@@ -0,0 +1,56 @@
+/* -*- C++ -*- */
+/**
+ * @file EC_Group_Scheduling.h
+ *
+ * $Id$
+ *
+ * @author Carlos O'Ryan (coryan@cs.wustl.edu)
+ *
+ * Based on previous work by Tim Harrison (harrison@cs.wustl.edu) and
+ * other members of the DOC group. More details can be found in:
+ *
+ * http://doc.ece.uci.edu/~coryan/EC/index.html
+ */
+
+#ifndef TAO_EC_GROUP_SCHEDULING_H
+#define TAO_EC_GROUP_SCHEDULING_H
+#include /**/ "ace/pre.h"
+
+#include "orbsvcs/Event/EC_Scheduling_Strategy.h"
+
+#if !defined (ACE_LACKS_PRAGMA_ONCE)
+# pragma once
+#endif /* ACE_LACKS_PRAGMA_ONCE */
+
+/**
+ * @class TAO_EC_Group_Scheduling
+ *
+ * @brief A scheduling strategy that preserves event groups.
+ */
+class TAO_RTEvent_Serv_Export TAO_EC_Group_Scheduling : public TAO_EC_Scheduling_Strategy
+{
+public:
+ /// Constructor.
+ TAO_EC_Group_Scheduling (void);
+
+ // Read EC_Scheduling_Strategy.h for more details
+ virtual void add_proxy_supplier_dependencies (
+ TAO_EC_ProxyPushSupplier *supplier,
+ TAO_EC_ProxyPushConsumer *consumer
+ ACE_ENV_ARG_DECL);
+ virtual void schedule_event (const RtecEventComm::EventSet &event,
+ TAO_EC_ProxyPushConsumer *consumer,
+ TAO_EC_Supplier_Filter *filter
+ ACE_ENV_ARG_DECL);
+
+private:
+ TAO_EC_Group_Scheduling (const TAO_EC_Group_Scheduling&);
+ TAO_EC_Group_Scheduling& operator= (const TAO_EC_Group_Scheduling&);
+};
+
+#if defined (__ACE_INLINE__)
+#include "orbsvcs/Event/EC_Group_Scheduling.inl"
+#endif /* __ACE_INLINE__ */
+
+#include /**/ "ace/post.h"
+#endif /* TAO_EC_GROUP_SCHEDULING_H */
diff --git a/TAO/orbsvcs/orbsvcs/Event/EC_Group_Scheduling.inl b/TAO/orbsvcs/orbsvcs/Event/EC_Group_Scheduling.inl
new file mode 100644
index 00000000000..e918d295929
--- /dev/null
+++ b/TAO/orbsvcs/orbsvcs/Event/EC_Group_Scheduling.inl
@@ -0,0 +1,7 @@
+// $Id$
+
+ACE_INLINE
+TAO_EC_Group_Scheduling::TAO_EC_Group_Scheduling (void)
+{
+}
+
diff --git a/TAO/orbsvcs/orbsvcs/Event/EC_Kokyu_Dispatching.cpp b/TAO/orbsvcs/orbsvcs/Event/EC_Kokyu_Dispatching.cpp
new file mode 100644
index 00000000000..206d87f18a2
--- /dev/null
+++ b/TAO/orbsvcs/orbsvcs/Event/EC_Kokyu_Dispatching.cpp
@@ -0,0 +1,210 @@
+// $Id$
+
+#include "orbsvcs/Event/EC_Kokyu_Dispatching.h"
+#include "orbsvcs/Event/EC_Event_Channel_Base.h"
+#include "orbsvcs/Event/EC_ProxySupplier.h"
+#include "orbsvcs/Event/EC_QOS_Info.h"
+
+#include "orbsvcs/Event_Service_Constants.h"
+#include "orbsvcs/RtecSchedulerC.h"
+#include "tao/ORB_Constants.h"
+
+#include "ace/Sched_Params.h"
+#include "ace/Malloc_Allocator.h"
+
+#include "Kokyu/Kokyu.h"
+
+#if ! defined (__ACE_INLINE__)
+#include "orbsvcs/Event/EC_Kokyu_Dispatching.i"
+#endif /* __ACE_INLINE__ */
+
+ACE_RCSID (Event,
+ EC_Kokyu_Dispatching,
+ "$Id$")
+
+TAO_BEGIN_VERSIONED_NAMESPACE_DECL
+
+TAO_EC_Kokyu_Dispatching::TAO_EC_Kokyu_Dispatching (TAO_EC_Event_Channel_Base *ec, int sched_policy, int sched_scope)
+ :allocator_ (0),
+ dispatcher_ (0),
+ lanes_setup_ (0),
+ disp_sched_policy_ (sched_policy),
+ disp_sched_scope_ (sched_scope)
+{
+ CORBA::Object_var tmp = ec->scheduler ();
+ this->scheduler_ = RtecScheduler::Scheduler::_narrow (tmp.in ());
+
+ //@@VS - need to revisit this - should be some other allocator
+ if (this->allocator_ == 0)
+ {
+ this->allocator_ = ACE_Allocator::instance ();
+ }
+}
+
+void
+TAO_EC_Kokyu_Dispatching::activate (void)
+{
+ if (!lanes_setup_)
+ setup_lanes ();
+
+ this->dispatcher_->activate ();
+
+ //ACE_DEBUG ((LM_DEBUG, "Kokyu dispatcher activated\n"));
+}
+
+void
+TAO_EC_Kokyu_Dispatching::setup_lanes (void)
+{
+ ACE_DECLARE_NEW_CORBA_ENV;
+ // Query the scheduler togetConfig_Infos
+ RtecScheduler::Config_Info_Set_var configs;
+ ACE_TRY
+ {
+ this->scheduler_->get_config_infos(configs.out());
+ ACE_TRY_CHECK;
+ }
+ ACE_CATCHANY
+ {
+ // Ignore exceptions..
+ }
+ ACE_ENDTRY;
+
+ //might be no Config_Infos in the set (if none passed to scheduler_)
+
+ // Convert RtecScheduler::Config_Info_Set to Kokyu::ConfigInfoSet
+ // OK to assume exact correspondence betwen Config_Info and ConfigInfo?
+ Kokyu::ConfigInfoSet kconfigs(configs->length());
+ for(CORBA::ULong i=0; i<configs->length(); ++i) {
+ kconfigs[i].preemption_priority_ = configs[i].preemption_priority;
+ kconfigs[i].thread_priority_ = configs[i].thread_priority;
+ switch (configs[i].dispatching_type) {
+ case RtecScheduler::STATIC_DISPATCHING:
+ kconfigs[i].dispatching_type_ = Kokyu::FIFO_DISPATCHING;
+ break;
+ case RtecScheduler::DEADLINE_DISPATCHING:
+ kconfigs[i].dispatching_type_ = Kokyu::DEADLINE_DISPATCHING;
+ break;
+ case RtecScheduler::LAXITY_DISPATCHING:
+ kconfigs[i].dispatching_type_ = Kokyu::LAXITY_DISPATCHING;
+ break;
+ }
+ }
+
+ Kokyu::Dispatcher_Attributes attrs;
+ attrs.config_info_set_ = kconfigs;
+ attrs.sched_policy (disp_sched_policy_);
+ attrs.sched_scope (disp_sched_scope_);
+
+ // Create Kokyu::Dispatcher using factory
+ Kokyu::Dispatcher_Auto_Ptr
+ tmp(Kokyu::Dispatcher_Factory::create_dispatcher(attrs));
+ this->dispatcher_ = tmp;
+ this->lanes_setup_ = 1;
+
+ //ACE_DEBUG ((LM_DEBUG, "Kokyu dispatcher setup\n"));
+}
+
+void
+TAO_EC_Kokyu_Dispatching::shutdown (void)
+{
+ this->dispatcher_->shutdown();
+}
+
+void
+TAO_EC_Kokyu_Dispatching::push (TAO_EC_ProxyPushSupplier* proxy,
+ RtecEventComm::PushConsumer_ptr consumer,
+ const RtecEventComm::EventSet& event,
+ TAO_EC_QOS_Info& qos_info
+ ACE_ENV_ARG_DECL)
+{
+ RtecEventComm::EventSet event_copy = event;
+ this->push_nocopy (proxy, consumer, event_copy, qos_info ACE_ENV_ARG_PARAMETER);
+}
+
+void
+TAO_EC_Kokyu_Dispatching::push_nocopy (TAO_EC_ProxyPushSupplier* proxy,
+ RtecEventComm::PushConsumer_ptr consumer,
+ RtecEventComm::EventSet& event,
+ TAO_EC_QOS_Info& qos_info
+ ACE_ENV_ARG_DECL)
+{
+ if (this->dispatcher_.get () == 0)
+ this->setup_lanes ();
+
+ void* buf =
+ this->allocator_->malloc (sizeof (TAO_EC_Kokyu_Push_Command ));
+
+ if (buf == 0)
+ ACE_THROW (CORBA::NO_MEMORY (TAO::VMCID,
+ CORBA::COMPLETED_NO));
+
+ // Create Dispatch_Command
+ TAO_EC_Kokyu_Push_Command *cmd =
+ new (buf) TAO_EC_Kokyu_Push_Command (proxy,
+ consumer,
+ event, this->allocator_);
+
+ /*
+ TAO_EC_Kokyu_Push_Command *cmd =
+ new TAO_EC_Kokyu_Push_Command (proxy,
+ consumer,
+ event, 0);
+ */
+
+ // Convert TAO_EC_QOS_Info to QoSDescriptor
+ RtecScheduler::RT_Info *rt_info =
+ this->scheduler_->get(qos_info.rt_info);
+
+ Kokyu::QoSDescriptor qosd;
+ qosd.preemption_priority_ = rt_info->preemption_priority;
+ qosd.deadline_ = rt_info->period;
+ ORBSVCS_Time::TimeT_to_Time_Value (qosd.execution_time_,
+ rt_info->worst_case_execution_time);
+
+ this->dispatcher_->dispatch(cmd,qosd);
+}
+
+// ****************************************************************
+
+TAO_EC_Kokyu_Shutdown_Command::~TAO_EC_Kokyu_Shutdown_Command(void)
+{
+}
+
+int
+TAO_EC_Kokyu_Shutdown_Command::execute(void)
+{
+ return -1;
+}
+
+// ****************************************************************
+
+TAO_EC_Kokyu_Push_Command::~TAO_EC_Kokyu_Push_Command(void)
+{
+ this->proxy_->_decr_refcnt ();
+}
+
+int
+TAO_EC_Kokyu_Push_Command::execute ()
+{
+ ACE_DECLARE_NEW_CORBA_ENV;
+
+ ACE_TRY
+ {
+ //ACE_DEBUG ((LM_DEBUG,
+ // "(%t) Command object executed.\n"));
+
+ this->proxy_->push_to_consumer (this->consumer_.in (),
+ this->event_
+ ACE_ENV_ARG_PARAMETER);
+ ACE_TRY_CHECK;
+ }
+ ACE_CATCHANY
+ {
+ return -1;
+ }
+ ACE_ENDTRY;
+
+ return 0;
+}
+
+TAO_END_VERSIONED_NAMESPACE_DECL
diff --git a/TAO/orbsvcs/orbsvcs/Event/EC_Kokyu_Dispatching.h b/TAO/orbsvcs/orbsvcs/Event/EC_Kokyu_Dispatching.h
new file mode 100644
index 00000000000..d9079a271ac
--- /dev/null
+++ b/TAO/orbsvcs/orbsvcs/Event/EC_Kokyu_Dispatching.h
@@ -0,0 +1,147 @@
+// -*- C++ -*-
+
+/**
+ * @file EC_Kokyu_Dispatching.h
+ *
+ * $Id$
+ *
+ * @author Bryan Thrall (thrall@cs.wustl.edu)
+ *
+ * Based on previous work by Carlos O'Ryan (coryan@cs.wustl.edu) and
+ * Tim Harrison (harrison@cs.wustl.edu) and other members of the DOC group.
+ * More details can be found in:
+ *
+ * http://doc.ece.uci.edu/~coryan/EC/index.html
+ */
+
+#ifndef TAO_EC_KOKYU_DISPATCHING_H
+#define TAO_EC_KOKYU_DISPATCHING_H
+#include /**/ "ace/pre.h"
+
+#include "orbsvcs/Event/EC_Dispatching.h"
+#include "orbsvcs/Event/EC_ProxySupplier.h"
+
+#if !defined (ACE_LACKS_PRAGMA_ONCE)
+# pragma once
+#endif /* ACE_LACKS_PRAGMA_ONCE */
+
+#include "orbsvcs/RtecSchedulerC.h"
+#include "orbsvcs/Event/rtkokyu_event_export.h"
+
+#include "ace/Thread_Manager.h"
+
+#include "Kokyu/Kokyu.h"
+
+TAO_BEGIN_VERSIONED_NAMESPACE_DECL
+
+class TAO_EC_Event_Channel_Base;
+
+/**
+ * @class TAO_EC_Kokyu_Dispatching
+ *
+ * @brief Dispatching strategy that minimizes priority inversion.
+ *
+ * This strategy uses multiple queues, each serviced by a thread
+ * at different priority. This minimizes priority inversion
+ * because the consumers at higher priority are serviced before
+ * consumers at lower priority.
+ * It is more flexible than using the supplier thread to dispatch
+ * because it allows high-priority suppliers to push events to
+ * low-priority consumers (and vice-versa).
+ * It also isolates the supplier threads from the time spent on
+ * upcalls to the consumer objects, making the system easier to
+ * analyze and schedule.
+ */
+class TAO_RTKokyuEvent_Export TAO_EC_Kokyu_Dispatching : public TAO_EC_Dispatching
+{
+public:
+ /// The scheduler is used to find the range of priorities and similar
+ /// info.
+ TAO_EC_Kokyu_Dispatching (TAO_EC_Event_Channel_Base* ec,
+ int sched_policy,
+ int sched_scope);
+
+ // = The EC_Dispatching methods.
+ virtual void activate (void);
+ virtual void shutdown (void);
+ virtual void push (TAO_EC_ProxyPushSupplier* proxy,
+ RtecEventComm::PushConsumer_ptr consumer,
+ const RtecEventComm::EventSet& event,
+ TAO_EC_QOS_Info& qos_info
+ ACE_ENV_ARG_DECL);
+ virtual void push_nocopy (TAO_EC_ProxyPushSupplier* proxy,
+ RtecEventComm::PushConsumer_ptr consumer,
+ RtecEventComm::EventSet& event,
+ TAO_EC_QOS_Info& qos_info
+ ACE_ENV_ARG_DECL);
+
+private:
+ ACE_Allocator *allocator_;
+
+ void setup_lanes (void);
+
+ /// The dispatcher
+ Kokyu::Dispatcher_Auto_Ptr dispatcher_;
+
+ /// The scheduler
+ RtecScheduler::Scheduler_var scheduler_;
+
+ int lanes_setup_;
+ int disp_sched_policy_;
+ int disp_sched_scope_;
+};
+
+// ****************************************************************
+
+class TAO_RTKokyuEvent_Export TAO_EC_Kokyu_Shutdown_Command : public Kokyu::Dispatch_Command
+{
+public:
+ /// Constructor
+ TAO_EC_Kokyu_Shutdown_Command (ACE_Allocator *allocator);
+
+ /// Command callback
+ virtual int execute (void);
+
+protected:
+ //Protected so can't be put on stack; must be dynamically allocated
+ virtual ~TAO_EC_Kokyu_Shutdown_Command (void);
+
+};
+
+// ****************************************************************
+
+class TAO_RTKokyuEvent_Export TAO_EC_Kokyu_Push_Command : public Kokyu::Dispatch_Command
+{
+public:
+ /// Constructor
+ TAO_EC_Kokyu_Push_Command (TAO_EC_ProxyPushSupplier* proxy,
+ RtecEventComm::PushConsumer_ptr consumer,
+ RtecEventComm::EventSet& event,
+ ACE_Allocator* allocator);
+
+ /// Command callback
+ virtual int execute (void);
+
+protected:
+ //Protected so can't be put on stack; must be dynamically allocated
+ virtual ~TAO_EC_Kokyu_Push_Command (void);
+
+private:
+ /// The proxy
+ TAO_EC_ProxyPushSupplier* proxy_;
+
+ /// The consumer connected to the proxy when the event was pushed.
+ RtecEventComm::PushConsumer_var consumer_;
+
+ /// The event
+ RtecEventComm::EventSet event_;
+};
+
+TAO_END_VERSIONED_NAMESPACE_DECL
+
+#if defined (__ACE_INLINE__)
+#include "orbsvcs/Event/EC_Kokyu_Dispatching.i"
+#endif /* __ACE_INLINE__ */
+
+#include /**/ "ace/post.h"
+#endif /* TAO_EC_KOKYU_DISPATCHING_H */
diff --git a/TAO/orbsvcs/orbsvcs/Event/EC_Kokyu_Dispatching.i b/TAO/orbsvcs/orbsvcs/Event/EC_Kokyu_Dispatching.i
new file mode 100644
index 00000000000..0c116874fad
--- /dev/null
+++ b/TAO/orbsvcs/orbsvcs/Event/EC_Kokyu_Dispatching.i
@@ -0,0 +1,42 @@
+// -*- C++ -*-
+//
+// $Id$
+
+TAO_BEGIN_VERSIONED_NAMESPACE_DECL
+
+// ****************************************************************
+
+ACE_INLINE
+TAO_EC_Kokyu_Shutdown_Command::
+TAO_EC_Kokyu_Shutdown_Command (ACE_Allocator*)
+ : Kokyu::Dispatch_Command ()
+{
+}
+
+// ****************************************************************
+
+ACE_INLINE
+TAO_EC_Kokyu_Push_Command::TAO_EC_Kokyu_Push_Command (
+ TAO_EC_ProxyPushSupplier* proxy,
+ RtecEventComm::PushConsumer_ptr consumer,
+ RtecEventComm::EventSet& event,
+ ACE_Allocator* allocator)
+ : Kokyu::Dispatch_Command (0,allocator),
+ proxy_ (proxy),
+ consumer_ (RtecEventComm::PushConsumer::_duplicate (consumer))
+{
+ //
+ // Efficient copy, steal the buffer from <event>
+ // We cannot do this on the initialization because get_buffer()
+ // could get called first, effectively setting maximum() and
+ // length() to 0!
+ //
+ CORBA::ULong maximum = event.maximum ();
+ CORBA::ULong length = event.length ();
+ RtecEventComm::Event* buffer = event.get_buffer (1);
+ event_.replace (maximum, length, buffer, 1);
+
+ this->proxy_->_incr_refcnt ();
+}
+
+TAO_END_VERSIONED_NAMESPACE_DECL
diff --git a/TAO/orbsvcs/orbsvcs/Event/EC_Kokyu_Factory.cpp b/TAO/orbsvcs/orbsvcs/Event/EC_Kokyu_Factory.cpp
new file mode 100644
index 00000000000..2df728b8920
--- /dev/null
+++ b/TAO/orbsvcs/orbsvcs/Event/EC_Kokyu_Factory.cpp
@@ -0,0 +1,272 @@
+// $Id$
+
+#include "orbsvcs/Event/EC_Kokyu_Factory.h"
+#include "orbsvcs/Event/EC_Kokyu_Dispatching.h"
+#include "orbsvcs/Event/EC_Kokyu_Scheduling.h"
+#include "orbsvcs/Event/EC_Kokyu_Filter_Builder.h"
+#include "orbsvcs/Event/EC_Event_Channel_Base.h"
+#include "orbsvcs/RtecSchedulerC.h"
+
+#include "ace/Arg_Shifter.h"
+#include "ace/Sched_Params.h"
+#include "ace/OS_NS_strings.h"
+
+#if ! defined (__ACE_INLINE__)
+#include "orbsvcs/Event/EC_Kokyu_Factory.i"
+#endif /* __ACE_INLINE__ */
+
+ACE_RCSID (Event,
+ EC_Kokyu_Factory,
+ "$Id$")
+
+TAO_BEGIN_VERSIONED_NAMESPACE_DECL
+
+TAO_EC_Kokyu_Factory::~TAO_EC_Kokyu_Factory (void)
+{
+}
+
+int
+TAO_EC_Kokyu_Factory::init_svcs (void)
+{
+ return ACE_Service_Config::static_svcs ()->
+ insert (&ace_svc_desc_TAO_EC_Kokyu_Factory);
+}
+
+int
+TAO_EC_Kokyu_Factory::init (int argc, ACE_TCHAR* argv[])
+{
+ ACE_Arg_Shifter arg_shifter (argc, argv);
+
+ while (arg_shifter.is_anything_left ())
+ {
+ const ACE_TCHAR* arg = arg_shifter.get_current ();
+
+ if (ACE_OS::strcasecmp (arg, ACE_TEXT("-ECDispatching")) == 0)
+ {
+ arg_shifter.consume_arg ();
+
+ if (arg_shifter.is_parameter_next ())
+ {
+ const ACE_TCHAR* opt = arg_shifter.get_current ();
+ if (ACE_OS::strcasecmp (opt, ACE_TEXT("reactive")) == 0)
+ {
+ this->dispatching_ = 0;
+ }
+ else if (ACE_OS::strcasecmp (opt, ACE_TEXT("mt")) == 0)
+ {
+ this->dispatching_ = 1;
+ }
+ else if (ACE_OS::strcasecmp (opt, ACE_TEXT("kokyu")) == 0)
+ {
+ this->dispatching_ = 2;
+ }
+ else
+ {
+ ACE_ERROR ((LM_ERROR,
+ ACE_TEXT("EC_Kokyu_Factory - ")
+ ACE_TEXT("unsupported dispatching <%s>\n"),
+ opt));
+ }
+ arg_shifter.consume_arg ();
+ }
+ //if Kokyu dispatching - look for sched policy
+ if (this->dispatching_ == 2)
+ {
+ if (arg_shifter.is_parameter_next ())
+ {
+ const ACE_TCHAR* opt = arg_shifter.get_current ();
+ if (ACE_OS::strcasecmp (opt, ACE_TEXT("SCHED_FIFO")) == 0)
+ {
+ this->disp_sched_policy_ = ACE_SCHED_FIFO;
+ }
+ else if (ACE_OS::strcasecmp (opt, ACE_TEXT("SCHED_RR")) == 0)
+ {
+ this->disp_sched_policy_ = ACE_SCHED_RR;
+ }
+ else
+ {
+ this->disp_sched_policy_ = ACE_SCHED_OTHER;
+ }
+ arg_shifter.consume_arg ();
+
+ if (arg_shifter.is_parameter_next ())
+ {
+ const ACE_TCHAR* opt = arg_shifter.get_current ();
+ if (ACE_OS::strcasecmp (opt, ACE_TEXT("SYSTEM")) == 0)
+ {
+ this->disp_sched_scope_ = ACE_SCOPE_THREAD;
+ }
+ else if (ACE_OS::strcasecmp (opt, ACE_TEXT("PROCESS")) == 0)
+ {
+ this->disp_sched_scope_ = ACE_SCOPE_PROCESS;
+ }
+ arg_shifter.consume_arg ();
+ }
+ }
+ }
+ }
+
+ else if (ACE_OS::strcasecmp (arg, ACE_TEXT("-ECFiltering")) == 0)
+ {
+ arg_shifter.consume_arg ();
+
+ if (arg_shifter.is_parameter_next ())
+ {
+ const ACE_TCHAR* opt = arg_shifter.get_current ();
+ if (ACE_OS::strcasecmp (opt, ACE_TEXT("null")) == 0)
+ {
+ this->filtering_ = 0;
+ }
+ else if (ACE_OS::strcasecmp (opt, ACE_TEXT("basic")) == 0)
+ {
+ this->filtering_ = 1;
+ }
+ else if (ACE_OS::strcasecmp (opt, ACE_TEXT("prefix")) == 0)
+ {
+ this->filtering_ = 2;
+ }
+ else if (ACE_OS::strcasecmp (opt, ACE_TEXT("kokyu")) == 0)
+ {
+ this->filtering_ = 3;
+ }
+ else
+ {
+ ACE_ERROR ((LM_ERROR,
+ ACE_TEXT("EC_Kokyu_Factory - ")
+ ACE_TEXT("unsupported filtering <%s>\n"),
+ opt));
+ }
+ arg_shifter.consume_arg ();
+ }
+ }
+
+ else if (ACE_OS::strcasecmp (arg, ACE_TEXT("-ECTimeout")) == 0)
+ {
+ arg_shifter.consume_arg ();
+
+ if (arg_shifter.is_parameter_next ())
+ {
+ const ACE_TCHAR* opt = arg_shifter.get_current ();
+ if (ACE_OS::strcasecmp (opt, ACE_TEXT("reactive")) == 0)
+ {
+ this->timeout_ = 0;
+ }
+#if 0
+ else if (ACE_OS::strcasecmp (opt, ACE_TEXT("kokyu")) == 0)
+ {
+ this->timeout_ = 1;
+ }
+#endif /* 0 */
+ else
+ {
+ ACE_ERROR ((LM_ERROR,
+ ACE_TEXT("EC_Kokyu_Factory - ")
+ ACE_TEXT("unsupported timeout <%s>\n"),
+ opt));
+ }
+ arg_shifter.consume_arg ();
+ }
+ }
+
+ else if (ACE_OS::strcasecmp (arg, ACE_TEXT("-ECScheduling")) == 0)
+ {
+ arg_shifter.consume_arg ();
+
+ if (arg_shifter.is_parameter_next ())
+ {
+ const ACE_TCHAR* opt = arg_shifter.get_current ();
+ if (ACE_OS::strcasecmp (opt, ACE_TEXT("null")) == 0)
+ {
+ this->scheduling_ = 0;
+ }
+ else if (ACE_OS::strcasecmp (opt, ACE_TEXT("group")) == 0)
+ {
+ this->scheduling_ = 1;
+ }
+ else if (ACE_OS::strcasecmp (opt, ACE_TEXT("kokyu")) == 0)
+ {
+ this->scheduling_ = 2;
+ }
+ else
+ {
+ ACE_ERROR ((LM_ERROR,
+ ACE_TEXT("EC_Kokyu_Factory - ")
+ ACE_TEXT("unsupported scheduling <%s>\n"),
+ opt));
+ }
+ arg_shifter.consume_arg ();
+ }
+ }
+
+ else
+ {
+ arg_shifter.ignore_arg ();
+ }
+ }
+ return this->TAO_EC_Default_Factory::init (argc, argv);
+}
+
+int
+TAO_EC_Kokyu_Factory::fini (void)
+{
+ return 0;
+}
+
+// ****************************************************************
+
+TAO_EC_Dispatching*
+TAO_EC_Kokyu_Factory::create_dispatching (TAO_EC_Event_Channel_Base *ec)
+{
+ if (this->dispatching_ == 2)
+ return new TAO_EC_Kokyu_Dispatching (ec,
+ this->disp_sched_policy_,
+ this->disp_sched_scope_);
+ return this->TAO_EC_Default_Factory::create_dispatching (ec);
+}
+
+TAO_EC_Filter_Builder*
+TAO_EC_Kokyu_Factory::create_filter_builder (TAO_EC_Event_Channel_Base *ec)
+{
+ if (this->filtering_ == 3)
+ return new TAO_EC_Kokyu_Filter_Builder (ec);
+
+ return this->TAO_EC_Default_Factory::create_filter_builder (ec);
+}
+
+
+TAO_EC_Timeout_Generator*
+TAO_EC_Kokyu_Factory::create_timeout_generator (TAO_EC_Event_Channel_Base *ec)
+{
+#if 0
+ if (this->timeout_ == 1)
+ {
+ //Kokyu timeout generator?
+ }
+#endif
+ return this->TAO_EC_Default_Factory::create_timeout_generator (ec);
+}
+
+TAO_EC_Scheduling_Strategy*
+TAO_EC_Kokyu_Factory::create_scheduling_strategy (TAO_EC_Event_Channel_Base* ec)
+{
+ if (this->scheduling_ == 2)
+ {
+ CORBA::Object_var tmp = ec->scheduler ();
+ RtecScheduler::Scheduler_var scheduler =
+ RtecScheduler::Scheduler::_narrow (tmp.in ());
+ return new TAO_EC_Kokyu_Scheduling (scheduler.in ());
+ }
+ return this->TAO_EC_Default_Factory::create_scheduling_strategy (ec);
+}
+
+TAO_END_VERSIONED_NAMESPACE_DECL
+
+// ****************************************************************
+
+ACE_STATIC_SVC_DEFINE (TAO_EC_Kokyu_Factory,
+ ACE_TEXT ("EC_Factory"),
+ ACE_SVC_OBJ_T,
+ &ACE_SVC_NAME (TAO_EC_Kokyu_Factory),
+ ACE_Service_Type::DELETE_THIS | ACE_Service_Type::DELETE_OBJ,
+ 0)
+ACE_FACTORY_DEFINE (TAO_RTKokyuEvent, TAO_EC_Kokyu_Factory)
diff --git a/TAO/orbsvcs/orbsvcs/Event/EC_Kokyu_Factory.h b/TAO/orbsvcs/orbsvcs/Event/EC_Kokyu_Factory.h
new file mode 100644
index 00000000000..4e2f413ca42
--- /dev/null
+++ b/TAO/orbsvcs/orbsvcs/Event/EC_Kokyu_Factory.h
@@ -0,0 +1,78 @@
+// -*- C++ -*-
+/**
+ * @file EC_Kokyu_Factory.h
+ *
+ * $Id$
+ *
+ * @author Bryan Thrall (thrall@cs.wustl.edu)
+ *
+ * Based on previous work by Carlos O'Ryan (coryan@cs.wustl.edu), Tim
+ * Harrison (harrison@cs.wustl.edu), Chris Gill (cdgill@cs.wustl.edu)
+ * and other members of the DOC group. More details can be found in:
+ *
+ * http://doc.ece.uci.edu/~coryan/EC/index.html
+ */
+
+#ifndef TAO_EC_KOKYU_FACTORY_H
+#define TAO_EC_KOKYU_FACTORY_H
+#include /**/ "ace/pre.h"
+
+#include "orbsvcs/Event/EC_Default_Factory.h"
+
+#if !defined (ACE_LACKS_PRAGMA_ONCE)
+# pragma once
+#endif /* ACE_LACKS_PRAGMA_ONCE */
+
+#include "orbsvcs/Event/rtkokyu_event_export.h"
+
+TAO_BEGIN_VERSIONED_NAMESPACE_DECL
+
+/**
+ * @class TAO_EC_Kokyu_Factory
+ *
+ * @brief Extend the default factory to support scheduling
+ *
+ */
+class TAO_RTKokyuEvent_Export TAO_EC_Kokyu_Factory : public TAO_EC_Default_Factory
+{
+public:
+ /// Constructor
+ TAO_EC_Kokyu_Factory (void);
+
+ /// Helper function to register the Kokyu factory into the service
+ /// configurator.
+ static int init_svcs (void);
+
+ /// destructor...
+ virtual ~TAO_EC_Kokyu_Factory (void);
+
+ // = The Service_Object entry points
+ virtual int init (int argc, ACE_TCHAR* argv[]);
+ virtual int fini (void);
+
+ // = The EC_Factory methods
+ virtual TAO_EC_Dispatching*
+ create_dispatching (TAO_EC_Event_Channel_Base*);
+ virtual TAO_EC_Filter_Builder*
+ create_filter_builder (TAO_EC_Event_Channel_Base*);
+ virtual TAO_EC_Timeout_Generator*
+ create_timeout_generator (TAO_EC_Event_Channel_Base*);
+ virtual TAO_EC_Scheduling_Strategy*
+ create_scheduling_strategy (TAO_EC_Event_Channel_Base*);
+
+private:
+ int disp_sched_policy_;
+ int disp_sched_scope_;
+};
+
+TAO_END_VERSIONED_NAMESPACE_DECL
+
+#if defined (__ACE_INLINE__)
+#include "orbsvcs/Event/EC_Kokyu_Factory.i"
+#endif /* __ACE_INLINE__ */
+
+ACE_STATIC_SVC_DECLARE (TAO_EC_Kokyu_Factory)
+ACE_FACTORY_DECLARE (TAO_RTKokyuEvent, TAO_EC_Kokyu_Factory)
+
+#include /**/ "ace/post.h"
+#endif /* TAO_EC_KOKYU_FACTORY_H */
diff --git a/TAO/orbsvcs/orbsvcs/Event/EC_Kokyu_Factory.i b/TAO/orbsvcs/orbsvcs/Event/EC_Kokyu_Factory.i
new file mode 100644
index 00000000000..7119373733f
--- /dev/null
+++ b/TAO/orbsvcs/orbsvcs/Event/EC_Kokyu_Factory.i
@@ -0,0 +1,15 @@
+// -*- C++ -*-
+//
+// $Id$
+
+TAO_BEGIN_VERSIONED_NAMESPACE_DECL
+
+ACE_INLINE
+TAO_EC_Kokyu_Factory::TAO_EC_Kokyu_Factory (void)
+ : TAO_EC_Default_Factory (),
+ disp_sched_policy_ (ACE_SCHED_FIFO),
+ disp_sched_scope_ (ACE_SCOPE_THREAD)
+{
+}
+
+TAO_END_VERSIONED_NAMESPACE_DECL
diff --git a/TAO/orbsvcs/orbsvcs/Event/EC_Kokyu_Filter.cpp b/TAO/orbsvcs/orbsvcs/Event/EC_Kokyu_Filter.cpp
new file mode 100644
index 00000000000..ab2015ea52d
--- /dev/null
+++ b/TAO/orbsvcs/orbsvcs/Event/EC_Kokyu_Filter.cpp
@@ -0,0 +1,313 @@
+// $Id$
+
+#include "orbsvcs/Event/EC_Kokyu_Filter.h"
+#include "orbsvcs/Event/EC_QOS_Info.h"
+#include "ace/Log_Msg.h"
+
+ACE_RCSID(Event, EC_Kokyu_Filter, "$Id$")
+
+TAO_EC_Kokyu_Filter::
+ TAO_EC_Kokyu_Filter (const char* name,
+ RtecScheduler::handle_t rt_info,
+ RtecScheduler::Scheduler_ptr scheduler,
+ TAO_EC_Filter* body,
+ RtecScheduler::handle_t body_info,
+ RtecScheduler::handle_t parent_info,
+ RtecScheduler::Info_Type_t info_type)
+
+ : rt_info_ (rt_info),
+ rt_info_computed_ (0),
+ name_ (name),
+ scheduler_ (RtecScheduler::Scheduler::_duplicate (scheduler)),
+ body_ (body),
+ body_info_ (body_info),
+ parent_info_ (parent_info),
+ info_type_ (info_type)
+{
+ this->adopt_child (this->body_);
+
+#if 1 //by VS
+this->rt_info_computed_ = 1;
+#endif
+}
+
+TAO_EC_Kokyu_Filter::~TAO_EC_Kokyu_Filter (void)
+{
+ delete this->body_;
+}
+
+TAO_EC_Filter::ChildrenIterator
+TAO_EC_Kokyu_Filter::begin (void) const
+{
+ return this->body_->begin ();
+}
+
+TAO_EC_Filter::ChildrenIterator
+TAO_EC_Kokyu_Filter::end (void) const
+{
+ return this->body_->end ();
+}
+
+int
+TAO_EC_Kokyu_Filter::size (void) const
+{
+ return this->body_->size ();
+}
+
+int
+TAO_EC_Kokyu_Filter::filter (const RtecEventComm::EventSet &event,
+ TAO_EC_QOS_Info& qos_info
+ ACE_ENV_ARG_DECL)
+{
+ return this->body_->filter (event, qos_info ACE_ENV_ARG_PARAMETER);
+}
+
+int
+TAO_EC_Kokyu_Filter::filter_nocopy (RtecEventComm::EventSet &event,
+ TAO_EC_QOS_Info& qos_info
+ ACE_ENV_ARG_DECL)
+{
+ return this->body_->filter_nocopy (event, qos_info ACE_ENV_ARG_PARAMETER);
+}
+
+// This is private, so we can make it inline in the .cpp file...
+void
+TAO_EC_Kokyu_Filter::compute_qos_info (TAO_EC_QOS_Info& qos_info
+ ACE_ENV_ARG_DECL)
+{
+ this->init_rt_info (ACE_ENV_SINGLE_ARG_PARAMETER);
+ ACE_CHECK;
+
+ qos_info.rt_info = this->rt_info_;
+ switch (this->info_type_)
+ {
+ default:
+ case RtecScheduler::DISJUNCTION:
+ break;
+
+ case RtecScheduler::CONJUNCTION:
+ case RtecScheduler::OPERATION:
+ {
+ RtecScheduler::OS_Priority os_priority;
+ RtecScheduler::Preemption_Subpriority_t p_subpriority;
+ RtecScheduler::Preemption_Priority_t p_priority;
+ this->scheduler_->priority (this->rt_info_,
+ os_priority,
+ p_subpriority,
+ p_priority
+ ACE_ENV_ARG_PARAMETER);
+ ACE_CHECK;
+ qos_info.preemption_priority = p_priority;
+ }
+ }
+}
+
+void
+TAO_EC_Kokyu_Filter::push (const RtecEventComm::EventSet &event,
+ TAO_EC_QOS_Info& qos_info
+ ACE_ENV_ARG_DECL)
+{
+ if (this->parent () != 0)
+ {
+ this->compute_qos_info (qos_info ACE_ENV_ARG_PARAMETER);
+ ACE_CHECK;
+
+ this->parent ()->push (event, qos_info ACE_ENV_ARG_PARAMETER);
+ ACE_CHECK;
+ }
+}
+
+void
+TAO_EC_Kokyu_Filter::push_nocopy (RtecEventComm::EventSet &event,
+ TAO_EC_QOS_Info& qos_info
+ ACE_ENV_ARG_DECL)
+{
+ if (this->parent () != 0)
+ {
+ this->compute_qos_info (qos_info ACE_ENV_ARG_PARAMETER);
+ ACE_CHECK;
+
+ this->parent ()->push_nocopy (event, qos_info ACE_ENV_ARG_PARAMETER);
+ ACE_CHECK;
+ }
+}
+
+void
+TAO_EC_Kokyu_Filter::clear (void)
+{
+ this->body_->clear ();
+}
+
+CORBA::ULong
+TAO_EC_Kokyu_Filter::max_event_size (void) const
+{
+ return this->body_->max_event_size ();
+}
+
+int
+TAO_EC_Kokyu_Filter::can_match (const RtecEventComm::EventHeader& header) const
+{
+ return this->body_->can_match (header);
+}
+
+/*
+ Kokyu_Filter
+ |
+ |body
+ |
+ Con/DisjunctionFilter
+ |
+ |children
+ |*
+ Kokyu_Filter
+ |
+ |body
+ |
+ Type_Filter
+
+The entire hierarchy will have the same rt_info as the root. Only the root
+rt_info will be part of the dependency graph in the scheduler. The root
+rt_info will have a dependency on the consumer rt_info.
+
+<--- shows dependency (oneway)
+
+supplier1<-----|
+ con/disj_rt_info<-------consumer_rt_info
+supplier2<-----|
+*/
+
+int
+TAO_EC_Kokyu_Filter::add_dependencies (const RtecEventComm::EventHeader& header,
+ const TAO_EC_QOS_Info &qos_info
+ ACE_ENV_ARG_DECL)
+{
+#ifdef EC_KOKYU_LOGGING
+ ACE_DEBUG ((LM_DEBUG, "Entering EC_Kokyu_Filter::add_dependencies\n"));
+#endif
+ this->init_rt_info (ACE_ENV_SINGLE_ARG_PARAMETER);
+ ACE_CHECK_RETURN (0);
+
+#ifdef EC_KOKYU_LOGGING
+ ACE_DEBUG ((LM_DEBUG,
+ "this->rt_info_ = %d, header.type = %d, qos_info.rt_info = %d\n",
+ this->rt_info_, header.type, qos_info.rt_info));
+#endif
+
+ //this call the add_dependencies() on con/disjunction filter
+ int matches = this->body_->add_dependencies (header,
+ qos_info
+ ACE_ENV_ARG_PARAMETER);
+ ACE_CHECK_RETURN (0);
+
+ if (matches != 0)
+ {
+#ifdef EC_KOKYU_LOGGING
+ ACE_DEBUG ((LM_DEBUG, "Kokyu_Filter::matches != 0\n"));
+#endif
+ this->scheduler_->add_dependency (this->rt_info_, qos_info.rt_info, 1,
+ RtecBase::ONE_WAY_CALL
+ ACE_ENV_ARG_PARAMETER);
+ ACE_CHECK_RETURN (0);
+
+ RtecScheduler::RT_Info_var info =
+ this->scheduler_->get (qos_info.rt_info ACE_ENV_ARG_PARAMETER);
+ ACE_CHECK_RETURN (0);
+ ACE_DEBUG ((LM_DEBUG, "[%s][%d] ----> [%s][%d]\n",
+ this->name_.c_str (),
+ this->rt_info_,
+ info->entry_point.in (),
+ qos_info.rt_info));
+ }
+ else
+ {
+#ifdef EC_KOKYU_LOGGING
+ ACE_DEBUG ((LM_DEBUG, "Kokyu_Filter::matches == 0\n"));
+#endif
+ }
+
+#ifdef EC_KOKYU_LOGGING
+ ACE_DEBUG ((LM_DEBUG, "about to iterate thru children\n"));
+#endif
+ ChildrenIterator end = this->end ();
+ for (ChildrenIterator i = this->begin (); i != end; ++i)
+ {
+ (*i)->add_dependencies (header, qos_info ACE_ENV_ARG_PARAMETER);
+ ACE_CHECK_RETURN (0);
+ }
+#ifdef EC_KOKYU_LOGGING
+ ACE_DEBUG ((LM_DEBUG, "Exiting EC_Kokyu_Filter: add_dependencies\n"));
+#endif
+ return 0;
+}
+
+void
+TAO_EC_Kokyu_Filter::get_qos_info (TAO_EC_QOS_Info& qos_info
+ ACE_ENV_ARG_DECL)
+{
+ this->init_rt_info (ACE_ENV_SINGLE_ARG_PARAMETER);
+ ACE_CHECK;
+
+ qos_info.rt_info = this->rt_info_;
+}
+
+void
+TAO_EC_Kokyu_Filter::init_rt_info (ACE_ENV_SINGLE_ARG_DECL)
+{
+ if (this->rt_info_computed_)
+ return;
+
+#if 1 //ifdef'ed from 1 to 0 by VS
+
+ // Provide dummy values the scheduler will compute them based on the
+ // dependencies and the fact that this is a DISJUNCTION.
+ this->scheduler_->set (this->rt_info_,
+ RtecScheduler::VERY_LOW_CRITICALITY,
+ 0, // worst_cast_execution_time
+ 0, // typical_cast_execution_time
+ 0, // cached_cast_execution_time
+ 0, // period
+ RtecScheduler::VERY_LOW_IMPORTANCE,
+ 0, // quantum
+ 0, // threads
+ this->info_type_
+ ACE_ENV_ARG_PARAMETER);
+ ACE_CHECK;
+#endif //ifdef'ed by VS
+
+#if 0 //ifdef changed from 1 to 0 by VS
+ if (this->body_info_ != this->rt_info_)
+ {
+ this->scheduler_->add_dependency (this->rt_info_,
+ this->body_info_,
+ 1,
+ RtecBase::TWO_WAY_CALL
+ ACE_ENV_ARG_PARAMETER);
+ ACE_CHECK;
+
+ RtecScheduler::RT_Info_var info =
+ this->scheduler_->get (this->body_info_ ACE_ENV_ARG_PARAMETER);
+ ACE_CHECK;
+ ACE_DEBUG ((LM_DEBUG, "[%s] ----> [%s]\n",
+ info->entry_point.in (),
+ this->name_.c_str ()));
+ }
+#endif /* 0 */
+
+#if 0 //ifdef changed from 1 to 0 by VS
+ this->scheduler_->add_dependency (this->parent_info_,
+ this->rt_info_,
+ 1,
+ RtecBase::TWO_WAY_CALL
+ ACE_ENV_ARG_PARAMETER);
+ ACE_CHECK;
+
+ RtecScheduler::RT_Info_var info =
+ this->scheduler_->get (this->parent_info_ ACE_ENV_ARG_PARAMETER);
+ ACE_CHECK;
+ ACE_DEBUG ((LM_DEBUG, "[%s] ----> [%s]\n",
+ this->name_.c_str (),
+ info->entry_point.in ()));
+#endif /* 0 */
+
+ this->rt_info_computed_ = 1;
+}
diff --git a/TAO/orbsvcs/orbsvcs/Event/EC_Kokyu_Filter.h b/TAO/orbsvcs/orbsvcs/Event/EC_Kokyu_Filter.h
new file mode 100644
index 00000000000..09f521997d4
--- /dev/null
+++ b/TAO/orbsvcs/orbsvcs/Event/EC_Kokyu_Filter.h
@@ -0,0 +1,127 @@
+/* -*- C++ -*- */
+/**
+ * @file EC_Kokyu_Filter.h
+ *
+ * $Id$
+ *
+ * @author Carlos O'Ryan (coryan@cs.wustl.edu)
+ *
+ * Based on previous work by Tim Harrison (harrison@cs.wustl.edu) and
+ * other members of the DOC group. More details can be found in:
+ *
+ * http://doc.ece.uci.edu/~coryan/EC/index.html
+ */
+
+#ifndef TAO_EC_KOKYU_FILTER_H
+#define TAO_EC_KOKYU_FILTER_H
+#include /**/ "ace/pre.h"
+
+#include "orbsvcs/Event/EC_Filter.h"
+
+#if !defined (ACE_LACKS_PRAGMA_ONCE)
+# pragma once
+#endif /* ACE_LACKS_PRAGMA_ONCE */
+
+#include "orbsvcs/RtecSchedulerC.h"
+#include "orbsvcs/Event/rtkokyu_event_export.h"
+#include "ace/SString.h"
+
+//#define EC_KOKYU_LOGGING
+
+/**
+ * @class TAO_EC_Kokyu_Filter
+ *
+ * @brief Decorate a filter with scheduling information
+ *
+ * This filter decorates a regular filter with scheduling
+ * information. It creates a new RT_Info entry for the filter and
+ * it adds the dependencies between the filter and any childrens
+ * it may have.
+ *
+ * <H2>Memory Management</H2>
+ * It assumes ownership of the children.
+ */
+class TAO_RTKokyuEvent_Export TAO_EC_Kokyu_Filter : public TAO_EC_Filter
+{
+public:
+ /**
+ * Constructor.
+ * It assumes ownership of the @a body, makes a copy of the other
+ * parameters
+ */
+ TAO_EC_Kokyu_Filter (const char* name,
+ RtecScheduler::handle_t rt_info,
+ RtecScheduler::Scheduler_ptr scheduler,
+ TAO_EC_Filter* body,
+ RtecScheduler::handle_t body_info,
+ RtecScheduler::handle_t parent_info,
+ RtecScheduler::Info_Type_t info_type);
+
+ /// Destructor
+ virtual ~TAO_EC_Kokyu_Filter (void);
+
+ // = The TAO_EC_Filter methods, please check the documentation in
+ // TAO_EC_Filter.
+ virtual ChildrenIterator begin (void) const;
+ virtual ChildrenIterator end (void) const;
+ virtual int size (void) const;
+ virtual int filter (const RtecEventComm::EventSet& event,
+ TAO_EC_QOS_Info& qos_info
+ ACE_ENV_ARG_DECL);
+ virtual int filter_nocopy (RtecEventComm::EventSet& event,
+ TAO_EC_QOS_Info& qos_info
+ ACE_ENV_ARG_DECL);
+ virtual void push (const RtecEventComm::EventSet& event,
+ TAO_EC_QOS_Info& qos_info
+ ACE_ENV_ARG_DECL);
+ virtual void push_nocopy (RtecEventComm::EventSet& event,
+ TAO_EC_QOS_Info& qos_info
+ ACE_ENV_ARG_DECL);
+ virtual void clear (void);
+ virtual CORBA::ULong max_event_size (void) const;
+ virtual int can_match (const RtecEventComm::EventHeader& header) const;
+ virtual int add_dependencies (const RtecEventComm::EventHeader& header,
+ const TAO_EC_QOS_Info &qos_info
+ ACE_ENV_ARG_DECL);
+ virtual void get_qos_info (TAO_EC_QOS_Info& qos_info
+ ACE_ENV_ARG_DECL);
+
+private:
+ TAO_EC_Kokyu_Filter (const TAO_EC_Kokyu_Filter&);
+ TAO_EC_Kokyu_Filter& operator= (const TAO_EC_Kokyu_Filter&);
+
+ /// Initialize our RT_Info handle and dependencies
+ void init_rt_info (ACE_ENV_SINGLE_ARG_DECL);
+
+ /// Compute a new qos_info to push up.
+ void compute_qos_info (TAO_EC_QOS_Info& qos_info
+ ACE_ENV_ARG_DECL);
+
+private:
+ /// The RT_Info handle for this object
+ RtecScheduler::handle_t rt_info_;
+
+ /// Has the Scheduler been updated?
+ int rt_info_computed_;
+
+ /// Our operation name
+ ACE_CString name_;
+
+ /// The scheduler we are going to use
+ RtecScheduler::Scheduler_var scheduler_;
+
+ /// The implementation
+ TAO_EC_Filter* body_;
+
+ /// The RT_Info handle for the body
+ RtecScheduler::handle_t body_info_;
+
+ /// The RT_Info handle for the parent
+ RtecScheduler::handle_t parent_info_;
+
+ /// Required for the scheduling service
+ RtecScheduler::Info_Type_t info_type_;
+};
+
+#include /**/ "ace/post.h"
+#endif /* TAO_EC_KOKYU_FILTER_H */
diff --git a/TAO/orbsvcs/orbsvcs/Event/EC_Kokyu_Filter_Builder.cpp b/TAO/orbsvcs/orbsvcs/Event/EC_Kokyu_Filter_Builder.cpp
new file mode 100644
index 00000000000..a522ce4d5ac
--- /dev/null
+++ b/TAO/orbsvcs/orbsvcs/Event/EC_Kokyu_Filter_Builder.cpp
@@ -0,0 +1,513 @@
+// $Id$
+
+#include "orbsvcs/Event/EC_Kokyu_Filter.h"
+#include "orbsvcs/Event_Service_Constants.h"
+#include "orbsvcs/Event/EC_Kokyu_Filter_Builder.h"
+#include "orbsvcs/Event/EC_Type_Filter.h"
+#include "orbsvcs/Event/EC_Conjunction_Filter.h"
+#include "orbsvcs/Event/EC_Disjunction_Filter.h"
+#include "orbsvcs/Event/EC_Timeout_Filter.h"
+#include "orbsvcs/Event/EC_Event_Channel_Base.h"
+#include "ace/OS_NS_stdio.h"
+
+#if ! defined (__ACE_INLINE__)
+#include "orbsvcs/Event/EC_Kokyu_Filter_Builder.i"
+#endif /* __ACE_INLINE__ */
+
+ACE_RCSID (Event,
+ EC_Kokyu_Filter_Builder,
+ "$Id$")
+
+const char* designator (long dsgn)
+{
+ switch(dsgn)
+ {
+ case ACE_ES_GLOBAL_DESIGNATOR: return "GLOBAL";
+ case ACE_ES_CONJUNCTION_DESIGNATOR: return "CONJ";
+ case ACE_ES_DISJUNCTION_DESIGNATOR: return "DISJ";
+ case ACE_ES_NEGATION_DESIGNATOR: return "NEG";
+ case ACE_ES_LOGICAL_AND_DESIGNATOR: return "LOG_AND";
+ case ACE_ES_BITMASK_DESIGNATOR: return "BITMASK";
+ case ACE_ES_MASKED_TYPE_DESIGNATOR: return "MASKED_TYPE";
+ case ACE_ES_NULL_DESIGNATOR: return "NULL";
+ }
+
+ return "---";
+}
+
+TAO_BEGIN_VERSIONED_NAMESPACE_DECL
+
+TAO_EC_Kokyu_Filter_Builder::~TAO_EC_Kokyu_Filter_Builder (void)
+{
+}
+
+TAO_EC_Filter*
+TAO_EC_Kokyu_Filter_Builder::build (
+ TAO_EC_ProxyPushSupplier *supplier,
+ RtecEventChannelAdmin::ConsumerQOS& qos
+ ACE_ENV_ARG_DECL) const
+{
+ CORBA::ULong i=0,found=0;
+ CORBA::ULong pos = 0;
+ CORBA::Long npos = -1;
+ int establish_final_consumer_dependency=0;
+
+ CORBA::Object_var tmp =
+ this->event_channel_->scheduler ();
+
+ RtecScheduler::Scheduler_var scheduler =
+ RtecScheduler::Scheduler::_narrow (tmp.in () ACE_ENV_ARG_PARAMETER);
+ ACE_CHECK_RETURN (0);
+
+#ifdef EC_KOKYU_LOGGING
+ for (i=0; i<qos.dependencies.length (); ++i)
+ {
+ ACE_DEBUG ((LM_DEBUG,
+ "consumerqos[%d] event.header.type = %s,"
+ "rt_info = %d\n",
+ i,
+ designator (qos.dependencies[i].event.header.type),
+ qos.dependencies[i].rt_info));
+ }
+#endif
+
+ //find the first entry which is not a designator. We are going to
+ //assume that this entry will have the rt_info of the connecting
+ //consumer (ProxyPushSupplier), which is passed into this function.
+ for (i=0; !found && i<qos.dependencies.length (); ++i)
+ {
+ switch (qos.dependencies[i].event.header.type)
+ {
+ case ACE_ES_CONJUNCTION_DESIGNATOR:
+ case ACE_ES_DISJUNCTION_DESIGNATOR:
+ case ACE_ES_NEGATION_DESIGNATOR:
+ case ACE_ES_LOGICAL_AND_DESIGNATOR:
+ case ACE_ES_BITMASK_DESIGNATOR:
+ case ACE_ES_MASKED_TYPE_DESIGNATOR:
+ case ACE_ES_NULL_DESIGNATOR:
+ establish_final_consumer_dependency = 1;
+ continue;
+
+ case ACE_ES_GLOBAL_DESIGNATOR:
+ case ACE_ES_EVENT_TIMEOUT:
+ case ACE_ES_EVENT_INTERVAL_TIMEOUT:
+ case ACE_ES_EVENT_DEADLINE_TIMEOUT:
+ continue;
+
+ default:
+ npos = i;
+ found = 1;
+ break;
+ }
+ }
+
+ ACE_CString final_consumer_rep_name;
+ RtecScheduler::handle_t h_final_consumer_rt_info = 0;
+ RtecScheduler::handle_t h_final_consumer_rep_rt_info = 0;
+
+#ifdef EC_KOKYU_LOGGING
+ ACE_DEBUG ((LM_DEBUG, "consumer rt_info found in consumerqos[%d] \n", npos));
+#endif
+
+ if (npos >= 0 && establish_final_consumer_dependency == 1)
+ {
+ //Hopefully this will have the final consumer's rt_info
+ h_final_consumer_rt_info = qos.dependencies[npos].rt_info;
+
+#ifdef EC_KOKYU_LOGGING
+ ACE_DEBUG ((LM_DEBUG, "about to get rt_info = %d\n",
+ h_final_consumer_rep_rt_info));
+#endif
+
+ RtecScheduler::RT_Info_var final_consumer_rt_info =
+ scheduler->get ( h_final_consumer_rt_info
+ ACE_ENV_ARG_PARAMETER);
+ ACE_CHECK_RETURN (0);
+
+ final_consumer_rep_name = final_consumer_rt_info->entry_point.in ();
+ final_consumer_rep_name += "#rep";
+
+#ifdef EC_KOKYU_LOGGING
+ ACE_DEBUG ((LM_DEBUG, "about to create consumer rep %s\n",
+ final_consumer_rep_name.c_str ()));
+#endif
+
+ //create an rt_info corresponding to this rep.
+ h_final_consumer_rep_rt_info =
+ scheduler->create (final_consumer_rep_name.c_str ()
+ ACE_ENV_ARG_PARAMETER);
+ ACE_CHECK_RETURN (0);
+#ifdef EC_KOKYU_LOGGING
+ ACE_DEBUG ((LM_DEBUG, "consumer rep created\n"));
+#endif
+
+ }
+
+ //We are passing the final consumer as the parent. The final
+ //consumer is the one which is connecting to the ProxyPushSupplier
+ //passed in to this function.
+
+ TAO_EC_Filter* filter =
+ this->recursive_build (supplier, qos, pos,
+ scheduler.in (),
+ h_final_consumer_rep_rt_info //parent_info
+ ACE_ENV_ARG_PARAMETER);
+ ACE_CHECK_RETURN (0);
+
+#ifdef EC_KOKYU_LOGGING
+ ACE_DEBUG ((LM_DEBUG,
+ "Filter_Builder::Verifying whether root filter"
+ " dependency can be established\n"));
+#endif
+
+ if (npos >= 0 && establish_final_consumer_dependency == 1)
+ {
+#ifdef EC_KOKYU_LOGGING
+ ACE_DEBUG ((LM_DEBUG,
+ "Filter_Builder::root filter dependency "
+ "can be established\n"));
+#endif
+ TAO_EC_Kokyu_Filter* kokyu_filter =
+ dynamic_cast<TAO_EC_Kokyu_Filter*> (filter);
+
+ //add the dependency between the root in the filter hierarchy and
+ //the final consumer
+ TAO_EC_QOS_Info qos_info;
+ kokyu_filter->get_qos_info (qos_info ACE_ENV_ARG_PARAMETER);
+ ACE_CHECK_RETURN (0);
+
+ scheduler->add_dependency (h_final_consumer_rt_info,
+ qos_info.rt_info,
+ 1,
+ RtecBase::ONE_WAY_CALL
+ ACE_ENV_ARG_PARAMETER);
+ ACE_CHECK_RETURN (0);
+ }
+ return filter;
+}
+
+TAO_EC_Filter*
+TAO_EC_Kokyu_Filter_Builder::recursive_build (
+ TAO_EC_ProxyPushSupplier *supplier,
+ RtecEventChannelAdmin::ConsumerQOS& qos,
+ CORBA::ULong& pos,
+ RtecScheduler::Scheduler_ptr scheduler,
+ RtecScheduler::handle_t parent_info
+ ACE_ENV_ARG_DECL) const
+{
+ const RtecEventComm::Event& e = qos.dependencies[pos].event;
+
+#ifdef EC_KOKYU_LOGGING
+ ACE_DEBUG ((LM_DEBUG, "Filter_Builder::In recursive build\n"));
+#endif
+
+ if (e.header.type == ACE_ES_CONJUNCTION_DESIGNATOR)
+ {
+#ifdef EC_KOKYU_LOGGING
+ ACE_DEBUG ((LM_DEBUG, "Filter_Builder::Conjuction designator\n"));
+#endif
+ CORBA::ULong npos = pos;
+ ACE_CString name;
+ this->recursive_name (qos, npos,
+ scheduler, name
+ ACE_ENV_ARG_PARAMETER);
+ ACE_CHECK_RETURN (0);
+
+ pos++; // Consume the designator
+
+ CORBA::ULong n = this->count_children (qos, pos);
+
+ RtecBase::handle_t conj_rt_info = parent_info;
+
+ TAO_EC_Filter** children;
+ ACE_NEW_RETURN (children, TAO_EC_Filter*[n], 0);
+ for (CORBA::ULong i = 0; i != n; ++i)
+ {
+ children[i] = this->recursive_build (supplier, qos, pos,
+ scheduler,
+ conj_rt_info
+ ACE_ENV_ARG_PARAMETER);
+ ACE_CHECK_RETURN (0);
+ }
+
+ TAO_EC_Kokyu_Filter *filter;
+ ACE_NEW_RETURN (filter,
+ TAO_EC_Kokyu_Filter (name.c_str (),
+ conj_rt_info,
+ scheduler,
+ new TAO_EC_Conjunction_Filter(children,
+ n),
+ conj_rt_info,
+ conj_rt_info,
+ RtecScheduler::CONJUNCTION),
+ 0);
+ TAO_EC_QOS_Info qos_info;
+ filter->get_qos_info (qos_info ACE_ENV_ARG_PARAMETER);
+ // @@
+ ACE_CHECK_RETURN (0);
+ return filter;
+ }
+
+ else if (e.header.type == ACE_ES_DISJUNCTION_DESIGNATOR)
+ {
+#ifdef EC_KOKYU_LOGGING
+ ACE_DEBUG ((LM_DEBUG, "Filter_Builder::Disjunction designator\n"));
+#endif
+ CORBA::ULong npos = pos;
+ ACE_CString name;
+ this->recursive_name (qos, npos,
+ scheduler, name
+ ACE_ENV_ARG_PARAMETER);
+ ACE_CHECK_RETURN (0);
+
+ pos++; // Consume the designator
+
+ RtecBase::handle_t disj_rt_info = parent_info;
+
+ CORBA::ULong n = this->count_children (qos, pos);
+
+ TAO_EC_Filter** children;
+ ACE_NEW_RETURN (children, TAO_EC_Filter*[n], 0);
+ for (CORBA::ULong i = 0; i != n; ++i)
+ {
+ children[i] = this->recursive_build (supplier, qos, pos,
+ scheduler,
+ disj_rt_info
+ ACE_ENV_ARG_PARAMETER);
+ ACE_CHECK_RETURN (0);
+ }
+ TAO_EC_Kokyu_Filter *filter;
+ ACE_NEW_RETURN (filter,
+ TAO_EC_Kokyu_Filter (name.c_str (),
+ disj_rt_info,
+ scheduler,
+ new TAO_EC_Disjunction_Filter (children,
+ n),
+ disj_rt_info,
+ disj_rt_info,
+ RtecScheduler::DISJUNCTION),
+ 0);
+
+ TAO_EC_QOS_Info qos_info;
+ filter->get_qos_info (qos_info ACE_ENV_ARG_PARAMETER);
+ // @@
+ ACE_CHECK_RETURN (0);
+ return filter;
+ }
+ else if (e.header.type == ACE_ES_EVENT_TIMEOUT
+ || e.header.type == ACE_ES_EVENT_INTERVAL_TIMEOUT
+ || e.header.type == ACE_ES_EVENT_DEADLINE_TIMEOUT)
+ {
+#ifdef EC_KOKYU_LOGGING
+ ACE_DEBUG ((LM_DEBUG, "Filter_Builder::Timeout designator\n"));
+#endif
+ // @@ We need a unique name for each timeout, assigned by the
+ // application?
+ char buf[64];
+
+ //get the rt_info for the timer consumer
+ RtecBase::handle_t h_consumer_rt_info = qos.dependencies[pos].rt_info;
+
+ //build a unique name using the cosumer_rt_info
+ ACE_OS::sprintf (buf, "TIMEOUT:%umsec:%d",
+ static_cast<u_int> ((e.header.creation_time / 10000)),
+ h_consumer_rt_info);
+ ACE_CString name = buf;
+
+ TAO_EC_QOS_Info qos_info;
+ qos_info.rt_info =
+ scheduler->create (name.c_str () ACE_ENV_ARG_PARAMETER);
+ ACE_CHECK_RETURN (0);
+
+ // Convert the time to the proper units....
+ RtecScheduler::Period_t period =
+ static_cast<RtecScheduler::Period_t> (e.header.creation_time);
+
+#if 1 //by VS original code replaced with this
+ RtecScheduler::RT_Info* consumer_rt_info_ptr;
+
+ consumer_rt_info_ptr = scheduler->get (h_consumer_rt_info);
+ scheduler->set (qos_info.rt_info,
+ consumer_rt_info_ptr->criticality,
+ 0, // worst_cast_execution_time
+ 0, // typical_cast_execution_time
+ 0, // cached_cast_execution_time
+ period,
+ consumer_rt_info_ptr->importance,
+ 0, // quantum
+ 1, // threads
+ RtecScheduler::OPERATION
+ ACE_ENV_ARG_PARAMETER);
+ ACE_CHECK_RETURN (0);
+
+ scheduler->add_dependency (qos_info.rt_info,
+ h_consumer_rt_info,
+ 1,
+ RtecBase::TWO_WAY_CALL
+ ACE_ENV_ARG_PARAMETER);
+ ACE_CHECK_RETURN (0);
+#endif //by VS
+
+ pos++;
+ return new TAO_EC_Timeout_Filter (this->event_channel_,
+ supplier,
+ qos_info,
+ e.header.type,
+ e.header.creation_time);
+ }
+
+#if 1 //added by VS
+ else if (e.header.type == ACE_ES_GLOBAL_DESIGNATOR)
+ {
+ pos++;
+ return this->recursive_build (supplier, qos, pos,
+ scheduler,
+ parent_info
+ ACE_ENV_ARG_PARAMETER);
+ }
+ else
+ {
+#ifdef EC_KOKYU_LOGGING
+ ACE_DEBUG ((LM_DEBUG,
+ "Kokyu_Filter_Builder::No designator for this entry. "
+ "Must be a body\n"));
+#endif
+ }
+#endif
+
+ //probably because of a global designator, the parent_info could be 0.
+ if (parent_info == 0)
+ {
+ //In this case, the parent_info is the same as the one supplied
+ //in the consumer qos.
+ parent_info = qos.dependencies[pos].rt_info;
+ }
+
+ RtecScheduler::RT_Info_var info =
+ scheduler->get (parent_info ACE_ENV_ARG_PARAMETER);
+ ACE_CHECK_RETURN (0);
+
+ ACE_CString name = info->entry_point.in ();
+
+ pos++;
+ TAO_EC_Kokyu_Filter *filter;
+ ACE_NEW_RETURN (filter,
+ TAO_EC_Kokyu_Filter (name.c_str (),
+ parent_info,
+ scheduler,
+ new TAO_EC_Type_Filter (e.header),
+ parent_info,
+ parent_info,
+ RtecScheduler::OPERATION),
+ 0);
+
+ TAO_EC_QOS_Info qos_info;
+ filter->get_qos_info (qos_info ACE_ENV_ARG_PARAMETER);
+ // @@
+ ACE_CHECK_RETURN (0);
+ return filter;
+}
+
+void
+TAO_EC_Kokyu_Filter_Builder:: recursive_name (
+ RtecEventChannelAdmin::ConsumerQOS& qos,
+ CORBA::ULong& pos,
+ RtecScheduler::Scheduler_ptr scheduler,
+ ACE_CString& name
+ ACE_ENV_ARG_DECL) const
+{
+ const RtecEventComm::Event& e = qos.dependencies[pos].event;
+
+ if (e.header.type == ACE_ES_CONJUNCTION_DESIGNATOR)
+ {
+ pos++; // Consume the designator
+ CORBA::ULong n = this->count_children (qos, pos);
+
+ for (CORBA::ULong i = 0; i != n; ++i)
+ {
+ ACE_CString child_name;
+ this->recursive_name (qos, pos,
+ scheduler,
+ child_name
+ ACE_ENV_ARG_PARAMETER);
+ ACE_CHECK;
+
+ if (i == 0)
+ name += "(";
+ else
+ name += "&&";
+ name += child_name;
+ }
+ name += ")";
+ return;
+ }
+
+ else if (e.header.type == ACE_ES_DISJUNCTION_DESIGNATOR)
+ {
+ pos++; // Consume the designator
+ CORBA::ULong n = this->count_children (qos, pos);
+
+ for (CORBA::ULong i = 0; i != n; ++i)
+ {
+ ACE_CString child_name;
+
+ this->recursive_name (qos, pos,
+ scheduler,
+ child_name
+ ACE_ENV_ARG_PARAMETER);
+ ACE_CHECK;
+
+ if (i == 0)
+ name += "(";
+ else
+ name += "||";
+ name += child_name;
+ }
+ name += ")";
+ return;
+ }
+
+ else if (e.header.type == ACE_ES_EVENT_TIMEOUT
+ || e.header.type == ACE_ES_EVENT_INTERVAL_TIMEOUT
+ || e.header.type == ACE_ES_EVENT_DEADLINE_TIMEOUT)
+ {
+ pos++;
+
+ char buf[64];
+ ACE_OS::sprintf (buf, "TIMEOUT:%umsec",
+ static_cast<u_int> ((e.header.creation_time / 10000)));
+ name = buf;
+
+ return;
+ }
+
+ RtecScheduler::handle_t body_info = qos.dependencies[pos].rt_info;
+
+ RtecScheduler::RT_Info_var info =
+ scheduler->get (body_info ACE_ENV_ARG_PARAMETER);
+ ACE_CHECK;
+
+ name = info->entry_point.in ();
+ name += "#rep";
+
+ pos++;
+}
+
+CORBA::ULong
+TAO_EC_Kokyu_Filter_Builder::
+ count_children (RtecEventChannelAdmin::ConsumerQOS& qos,
+ CORBA::ULong pos) const
+{
+ CORBA::ULong l = qos.dependencies.length ();
+ CORBA::ULong i;
+ for (i = pos; i != l; ++i)
+ {
+ const RtecEventComm::Event& e = qos.dependencies[i].event;
+ if (e.header.type == ACE_ES_CONJUNCTION_DESIGNATOR
+ || e.header.type == ACE_ES_DISJUNCTION_DESIGNATOR)
+ break;
+ }
+ return i - 1;
+}
+
+TAO_END_VERSIONED_NAMESPACE_DECL
diff --git a/TAO/orbsvcs/orbsvcs/Event/EC_Kokyu_Filter_Builder.h b/TAO/orbsvcs/orbsvcs/Event/EC_Kokyu_Filter_Builder.h
new file mode 100644
index 00000000000..83ac33a6456
--- /dev/null
+++ b/TAO/orbsvcs/orbsvcs/Event/EC_Kokyu_Filter_Builder.h
@@ -0,0 +1,89 @@
+// -*- C++ -*-
+/**
+ * @file EC_Kokyu_Filter_Builder.h
+ *
+ * $Id$
+ *
+ * @author Bryan Thrall (thrall@cs.wustl.edu)
+ *
+ * Based on previous work by Carlos O'Ryan (coryan@cs.wustl.edu) and
+ * Tim Harrison (harrison@cs.wustl.edu) and other members of the DOC group.
+ * More details can be found in:
+ *
+ * http://doc.ece.uci.edu/~coryan/EC/index.html
+ */
+
+#ifndef TAO_EC_KOKYU_FILTER_BUILDER_H
+#define TAO_EC_KOKYU_FILTER_BUILDER_H
+#include /**/ "ace/pre.h"
+
+#include "orbsvcs/Event/EC_Filter_Builder.h"
+
+#if !defined (ACE_LACKS_PRAGMA_ONCE)
+# pragma once
+#endif /* ACE_LACKS_PRAGMA_ONCE */
+
+#include "orbsvcs/Event/rtkokyu_event_export.h"
+
+TAO_BEGIN_VERSIONED_NAMESPACE_DECL
+
+class TAO_EC_Filter;
+class TAO_EC_Event_Channel_Base;
+
+/**
+ * @class TAO_EC_Kokyu_Filter_Builder
+ *
+ * @brief Implement a builder for the fundamental filters.
+ *
+ * The sched filtering mechanisms in the Event channel
+ * (source/type based filtering + disjunctions and conjunctions)
+ * are constructed using this class.
+ */
+class TAO_RTKokyuEvent_Export TAO_EC_Kokyu_Filter_Builder : public TAO_EC_Filter_Builder
+{
+public:
+ /// constructor.
+ TAO_EC_Kokyu_Filter_Builder (TAO_EC_Event_Channel_Base* ec);
+
+ /// destructor...
+ virtual ~TAO_EC_Kokyu_Filter_Builder (void);
+
+ // = The TAO_EC_Filter_Builder methods...
+ TAO_EC_Filter* build (TAO_EC_ProxyPushSupplier *supplier,
+ RtecEventChannelAdmin::ConsumerQOS& qos
+ ACE_ENV_ARG_DECL) const;
+
+private:
+ /// Recursively build the filter tree.
+ TAO_EC_Filter* recursive_build (TAO_EC_ProxyPushSupplier *supplier,
+ RtecEventChannelAdmin::ConsumerQOS& qos,
+ CORBA::ULong& pos,
+ RtecScheduler::Scheduler_ptr scheduler,
+ RtecScheduler::handle_t parent_info
+ ACE_ENV_ARG_DECL) const;
+
+ /// Build the name recursively...
+ void recursive_name (RtecEventChannelAdmin::ConsumerQOS& qos,
+ CORBA::ULong& pos,
+ RtecScheduler::Scheduler_ptr scheduler,
+ ACE_CString &name
+ ACE_ENV_ARG_DECL) const;
+
+ /// Count the number of children of the current node, i.e. until a
+ /// conjunction or disjunction starts.
+ CORBA::ULong count_children (RtecEventChannelAdmin::ConsumerQOS& qos,
+ CORBA::ULong pos) const;
+
+private:
+ /// The event channel.
+ TAO_EC_Event_Channel_Base* event_channel_;
+};
+
+TAO_END_VERSIONED_NAMESPACE_DECL
+
+#if defined (__ACE_INLINE__)
+#include "orbsvcs/Event/EC_Kokyu_Filter_Builder.i"
+#endif /* __ACE_INLINE__ */
+
+#include /**/ "ace/post.h"
+#endif /* TAO_EC_KOKYU_FILTER_BUILDER_H */
diff --git a/TAO/orbsvcs/orbsvcs/Event/EC_Kokyu_Filter_Builder.i b/TAO/orbsvcs/orbsvcs/Event/EC_Kokyu_Filter_Builder.i
new file mode 100644
index 00000000000..8e0cd624a7e
--- /dev/null
+++ b/TAO/orbsvcs/orbsvcs/Event/EC_Kokyu_Filter_Builder.i
@@ -0,0 +1,15 @@
+// -*- C++ -*-
+//
+// $Id$
+
+
+TAO_BEGIN_VERSIONED_NAMESPACE_DECL
+
+ACE_INLINE
+TAO_EC_Kokyu_Filter_Builder::
+ TAO_EC_Kokyu_Filter_Builder (TAO_EC_Event_Channel_Base *ec)
+ : event_channel_ (ec)
+{
+}
+
+TAO_END_VERSIONED_NAMESPACE_DECL
diff --git a/TAO/orbsvcs/orbsvcs/Event/EC_Kokyu_Scheduling.cpp b/TAO/orbsvcs/orbsvcs/Event/EC_Kokyu_Scheduling.cpp
new file mode 100644
index 00000000000..979cd0913fa
--- /dev/null
+++ b/TAO/orbsvcs/orbsvcs/Event/EC_Kokyu_Scheduling.cpp
@@ -0,0 +1,99 @@
+// $Id$
+
+#include "orbsvcs/Event/EC_Kokyu_Scheduling.h"
+#include "orbsvcs/Event/EC_QOS_Info.h"
+#include "orbsvcs/Event/EC_ProxyConsumer.h"
+#include "orbsvcs/Event/EC_ProxySupplier.h"
+#include "orbsvcs/Event/EC_Supplier_Filter.h"
+
+#if ! defined (__ACE_INLINE__)
+#include "orbsvcs/Event/EC_Kokyu_Scheduling.i"
+#endif /* __ACE_INLINE__ */
+
+ACE_RCSID(Event, EC_Kokyu_Scheduling, "$Id$")
+
+TAO_BEGIN_VERSIONED_NAMESPACE_DECL
+
+TAO_EC_Kokyu_Scheduling::~TAO_EC_Kokyu_Scheduling (void)
+{
+}
+
+void
+TAO_EC_Kokyu_Scheduling::add_proxy_supplier_dependencies (
+ TAO_EC_ProxyPushSupplier *supplier,
+ TAO_EC_ProxyPushConsumer *consumer
+ ACE_ENV_ARG_DECL)
+{
+ const RtecEventChannelAdmin::SupplierQOS& qos =
+ consumer->publications ();
+
+ for (CORBA::ULong i = 0; i < qos.publications.length (); ++i)
+ {
+ const RtecEventComm::EventHeader &header =
+ qos.publications[i].event.header;
+ TAO_EC_QOS_Info qos_info;
+ qos_info.rt_info = qos.publications[i].dependency_info.rt_info;
+
+ RtecScheduler::OS_Priority os_priority;
+ RtecScheduler::Preemption_Subpriority_t p_subpriority;
+ RtecScheduler::Preemption_Priority_t p_priority;
+ this->scheduler_->priority (qos_info.rt_info,
+ os_priority,
+ p_subpriority,
+ p_priority
+ ACE_ENV_ARG_PARAMETER);
+ ACE_CHECK;
+ qos_info.preemption_priority = p_priority;
+
+ supplier->add_dependencies (header, qos_info ACE_ENV_ARG_PARAMETER);
+ ACE_CHECK;
+ }
+}
+
+void
+TAO_EC_Kokyu_Scheduling::schedule_event (const RtecEventComm::EventSet &event,
+ TAO_EC_ProxyPushConsumer *consumer,
+ TAO_EC_Supplier_Filter *filter
+ ACE_ENV_ARG_DECL)
+{
+ RtecEventChannelAdmin::SupplierQOS qos =
+ consumer->publications ();
+
+ for (CORBA::ULong j = 0; j != event.length (); ++j)
+ {
+ const RtecEventComm::Event& e = event[j];
+ RtecEventComm::Event* buffer =
+ const_cast<RtecEventComm::Event*> (&e);
+ RtecEventComm::EventSet single_event (1, 1, buffer, 0);
+
+ TAO_EC_QOS_Info qos_info;
+
+ for (CORBA::ULong i = 0; i != qos.publications.length (); ++i)
+ {
+ const RtecEventComm::EventHeader &qos_header =
+ qos.publications[i].event.header;
+
+ if (TAO_EC_Filter::matches (e.header, qos_header) == 0)
+ continue;
+
+ qos_info.rt_info = qos.publications[i].dependency_info.rt_info;
+
+ RtecScheduler::OS_Priority os_priority;
+ RtecScheduler::Preemption_Subpriority_t p_subpriority;
+ RtecScheduler::Preemption_Priority_t p_priority;
+ this->scheduler_->priority (qos_info.rt_info,
+ os_priority,
+ p_subpriority,
+ p_priority
+ ACE_ENV_ARG_PARAMETER);
+ ACE_CHECK;
+ qos_info.preemption_priority = p_priority;
+ }
+
+ filter->push_scheduled_event (single_event, qos_info
+ ACE_ENV_ARG_PARAMETER);
+ ACE_CHECK;
+ }
+}
+
+TAO_END_VERSIONED_NAMESPACE_DECL
diff --git a/TAO/orbsvcs/orbsvcs/Event/EC_Kokyu_Scheduling.h b/TAO/orbsvcs/orbsvcs/Event/EC_Kokyu_Scheduling.h
new file mode 100644
index 00000000000..105241d217a
--- /dev/null
+++ b/TAO/orbsvcs/orbsvcs/Event/EC_Kokyu_Scheduling.h
@@ -0,0 +1,77 @@
+// -*- C++ -*-
+
+/**
+ * @file EC_Kokyu_Scheduling.h
+ *
+ * $Id$
+ *
+ * @author Bryan Thrall (thrall@cs.wustl.edu)
+ *
+ * Based on previous work by Carlos O'Ryan (coryan@cs.wustl.edu) and
+ * Tim Harrison (harrison@cs.wustl.edu) and other members of the DOC group.
+ * More details can be found in:
+ *
+ * http://doc.ece.uci.edu/~coryan/EC/index.html
+ */
+
+#ifndef TAO_EC_KOKYU_SCHEDULING_H
+#define TAO_EC_KOKYU_SCHEDULING_H
+#include /**/ "ace/pre.h"
+
+#include "orbsvcs/Event/EC_Scheduling_Strategy.h"
+
+#if !defined (ACE_LACKS_PRAGMA_ONCE)
+# pragma once
+#endif /* ACE_LACKS_PRAGMA_ONCE */
+
+#include "orbsvcs/RtecSchedulerC.h"
+#include "orbsvcs/Event/rtkokyu_event_export.h"
+
+TAO_BEGIN_VERSIONED_NAMESPACE_DECL
+
+/**
+ * @class TAO_EC_Kokyu_Scheduling
+ *
+ * @brief A scheduling strategy that uses TAO's real-time scheduler
+ *
+ * This implementation of the Scheduling_Strategy uses TAO's
+ * real-time scheduler.
+ */
+class TAO_RTKokyuEvent_Export TAO_EC_Kokyu_Scheduling : public TAO_EC_Scheduling_Strategy
+{
+public:
+ /// Constructor.
+ TAO_EC_Kokyu_Scheduling (RtecScheduler::Scheduler_ptr scheduler);
+
+ /// Destructor
+ virtual ~TAO_EC_Kokyu_Scheduling (void);
+
+ virtual void add_proxy_supplier_dependencies (
+ TAO_EC_ProxyPushSupplier *supplier,
+ TAO_EC_ProxyPushConsumer *consumer
+ ACE_ENV_ARG_DECL);
+ virtual void schedule_event (const RtecEventComm::EventSet &event,
+ TAO_EC_ProxyPushConsumer *consumer,
+ TAO_EC_Supplier_Filter *filter
+ ACE_ENV_ARG_DECL);
+
+private:
+ TAO_EC_Kokyu_Scheduling (const TAO_EC_Kokyu_Scheduling&);
+ TAO_EC_Kokyu_Scheduling& operator= (const TAO_EC_Kokyu_Scheduling&);
+
+ /// Initialize our RT_Info handle and dependencies
+ void init_rt_info (ACE_ENV_SINGLE_ARG_DECL);
+
+private:
+ /// The scheduler we are going to use
+ RtecScheduler::Scheduler_var scheduler_;
+};
+
+TAO_END_VERSIONED_NAMESPACE_DECL
+
+#if defined (__ACE_INLINE__)
+#include "orbsvcs/Event/EC_Kokyu_Scheduling.i"
+#endif /* __ACE_INLINE__ */
+
+#include /**/ "ace/post.h"
+#endif /* TAO_EC_KOKYU_SCHEDULING_H */
diff --git a/TAO/orbsvcs/orbsvcs/Event/EC_Kokyu_Scheduling.i b/TAO/orbsvcs/orbsvcs/Event/EC_Kokyu_Scheduling.i
new file mode 100644
index 00000000000..1afeb35fa05
--- /dev/null
+++ b/TAO/orbsvcs/orbsvcs/Event/EC_Kokyu_Scheduling.i
@@ -0,0 +1,14 @@
+// -*- C++ -*-
+//
+// $Id$
+
+TAO_BEGIN_VERSIONED_NAMESPACE_DECL
+
+ACE_INLINE
+TAO_EC_Kokyu_Scheduling::TAO_EC_Kokyu_Scheduling (
+ RtecScheduler::Scheduler_ptr scheduler)
+ : scheduler_ (RtecScheduler::Scheduler::_duplicate (scheduler))
+{
+}
+
+TAO_END_VERSIONED_NAMESPACE_DECL
diff --git a/TAO/orbsvcs/orbsvcs/Event/EC_Lifetime_Utils.cpp b/TAO/orbsvcs/orbsvcs/Event/EC_Lifetime_Utils.cpp
new file mode 100644
index 00000000000..9750da7a5d7
--- /dev/null
+++ b/TAO/orbsvcs/orbsvcs/Event/EC_Lifetime_Utils.cpp
@@ -0,0 +1,7 @@
+// $Id$
+
+#include "orbsvcs/Event/EC_Lifetime_Utils.h"
+
+#if !defined(__ACE_INLINE__)
+#include "orbsvcs/Event/EC_Lifetime_Utils.i"
+#endif /* __ACE_INLINE__ */
diff --git a/TAO/orbsvcs/orbsvcs/Event/EC_Lifetime_Utils.h b/TAO/orbsvcs/orbsvcs/Event/EC_Lifetime_Utils.h
new file mode 100644
index 00000000000..d34ce3ab484
--- /dev/null
+++ b/TAO/orbsvcs/orbsvcs/Event/EC_Lifetime_Utils.h
@@ -0,0 +1,217 @@
+// -*- C++ -*-
+
+/**
+ * @file EC_Lifetime_Utils.h
+ *
+ * $Id$
+ *
+ * @author Jody Hagins (jody@atdesk.com)
+ * @author Marina Spivak (marina@atdesk.com)
+ *
+ * This file is a temporary place for general CORBA application
+ * utility classes. These classes will be moved out from the EC
+ * library and into TAO or will be replaced by other TAO classes with
+ * similar functionality.
+ */
+
+#ifndef TAO_EC_LIFETIME_UTILS_H
+#define TAO_EC_LIFETIME_UTILS_H
+#include /**/ "ace/pre.h"
+
+#include /**/ "orbsvcs/Event/event_serv_export.h"
+#include "orbsvcs/RtecEventChannelAdminC.h"
+#include "tao/PortableServer/PortableServer.h"
+#include "tao/ORB.h"
+
+#if !defined (ACE_LACKS_PRAGMA_ONCE)
+# pragma once
+#endif /* ACE_LACKS_PRAGMA_ONCE */
+
+TAO_BEGIN_VERSIONED_NAMESPACE_DECL
+
+/**
+ * @class TAO_EC_Object_Deactivator
+ *
+ * @brief Utility for deactivating servants from POA.
+ *
+ * Maintains state necessary to deactivate a servant from POA.
+ * Can be told to deactivate a servant explicitly or can do so
+ * automagically, in its destructor.
+ */
+class TAO_RTEvent_Serv_Export TAO_EC_Object_Deactivator
+{
+public:
+ /// Default constructor. Deactivation info can be supplied later
+ /// through set_values ().
+ TAO_EC_Object_Deactivator (void);
+
+ /// Constructor. Set @a id which will be deactivated from @ poa in
+ /// the deactivator's destructor, unless deactivate () or
+ /// disallow_deactivation () are invoked before the destruction.
+ TAO_EC_Object_Deactivator (PortableServer::POA_ptr poa,
+ PortableServer::ObjectId const & id);
+
+ /// Destructor. Deactivates id_ from poa_ if those values have
+ /// been set, and neither deactivate() nor disallow_deactivation()
+ /// have been invoked.
+ ~TAO_EC_Object_Deactivator (void);
+
+ /// Set <id> which will be deactivated from <poa> in
+ /// the deactivator's destructor, unless deactivate () or
+ /// disallow_deactivation () are invoked before the destruction.
+ void set_values (PortableServer::POA_ptr poa,
+ PortableServer::ObjectId const & id);
+
+ /// Take on the state of @a deactivator. @a deactivator loses its state.
+ void set_values (TAO_EC_Object_Deactivator & deactivator);
+
+ /// Explicitly enable deactivation to happen in destructor or when
+ /// deactivate() is called.
+ void allow_deactivation (void);
+
+ /// Explicitly disable deactivation from happening in destructor or
+ /// when deactivate() is called.
+ void disallow_deactivation (void);
+
+ /// Perform deactivation now if <poa_> and <id_> values have been set, and
+ /// deactivation hasn't happened yet nor has it been explicitly
+ /// disallowed. CORBA exceptions occurring during deactivation are
+ /// not propagated. Deactivation will NOT happen in the destructor.
+ void deactivate (void);
+
+ /// Accessor for the POA used in deactivation.
+ PortableServer::POA_var poa (void) const;
+
+private:
+
+ /// Disallow.
+ //@{
+ TAO_EC_Object_Deactivator (const TAO_EC_Object_Deactivator &rhs);
+ TAO_EC_Object_Deactivator& operator= (const TAO_EC_Object_Deactivator &rhs);
+ //@}
+
+ /// POA from which the object will be deactivated.
+ PortableServer::POA_var poa_;
+
+ /// ObjectId of the object to be deactivated.
+ PortableServer::ObjectId id_;
+
+ /// Flag indicating whether deactivation will be attempted.
+ /// The flag is set to false if <poa_> and <id_> haven't been set
+ /// yet, or if deactivation already happened, or if
+ /// disallow_deactivation () method is invoked.
+ int deactivate_;
+};
+
+//***************************************************************************
+
+/**
+ * @class TAO_EC_Deactivated_Object
+ *
+ * @brief Object deactivation utility (mix-in) class.
+ *
+ * Maintains state necessary to deactivate object inheriting from this
+ * class from POA. The state can be set using set_deactivator()
+ * method. Then, the object can deactivate itself by doing
+ * this->deactivator_.deactivate ()
+ *
+ * NOTE: deactivation does NOT happen automatically, and must be
+ * explicitly initiated as described above.
+ */
+class TAO_RTEvent_Serv_Export TAO_EC_Deactivated_Object
+{
+public:
+
+ /// Set deactivation state to that specified by the @a deactivator
+ /// argument.
+ void set_deactivator (TAO_EC_Object_Deactivator & deactivator);
+
+protected:
+
+ TAO_EC_Deactivated_Object (void);
+ ~TAO_EC_Deactivated_Object (void);
+
+ /// Utility for deactivating ourselves from POA.
+ TAO_EC_Object_Deactivator deactivator_;
+};
+
+//***************************************************************************
+
+/**
+ * @class TAO_EC_ORB_Holder
+ *
+ * @brief Utility for automatically destroying the ORB.
+ *
+ * Holds a reference to an ORB, and calls destroy() on it in the
+ * destructor.
+ */
+class TAO_RTEvent_Serv_Export TAO_EC_ORB_Holder
+{
+public:
+ /// Constructor. No-op.
+ TAO_EC_ORB_Holder (void);
+
+ /// Destructor. If holding an ORB, destroy it.
+ ~TAO_EC_ORB_Holder (void);
+
+ /// Set the ORB to be destroyed in destructor to <orb_var>. If
+ /// TAO_EC_ORB_Holder already held an orb prior to invocation of
+ /// this method, that orb is NOT destroyed.
+ void init (CORBA::ORB_var orb_var);
+
+private:
+
+ /// Disallow.
+ //@{
+ TAO_EC_ORB_Holder & operator= (const TAO_EC_ORB_Holder &rhs);
+ TAO_EC_ORB_Holder(const TAO_EC_ORB_Holder &rhs);
+ //@}
+
+ /// ORB to be destroyed.
+ CORBA::ORB_var orb_;
+};
+
+//***************************************************************************
+
+/**
+ * @class TAO_EC_Event_Channel_Holder
+ *
+ * @brief Utility for automatically destroying the Event Channel.
+ *
+ * Holds a reference to an Event Channel, and calls destroy() on it in the
+ * destructor.
+ */
+class TAO_RTEvent_Serv_Export TAO_EC_Event_Channel_Holder
+{
+public:
+ /// Constructor. No-op.
+ TAO_EC_Event_Channel_Holder (void);
+
+ /// Destructor. If holding an Event Channel, destroy it.
+ ~TAO_EC_Event_Channel_Holder (void);
+
+ /// Set the Event Channel to be destroyed in destructor to @a ec_var. If
+ /// TAO_EC_Event_Channel_Holder already held an Event Channel prior
+ /// to invocation of this method, that Event Channel is NOT destroyed.
+ void init (RtecEventChannelAdmin::EventChannel_var ec_var);
+
+private:
+
+ /// Disallow.
+ //@{
+ TAO_EC_Event_Channel_Holder & operator= (const TAO_EC_Event_Channel_Holder &rhs);
+ TAO_EC_Event_Channel_Holder(const TAO_EC_Event_Channel_Holder &rhs);
+ //@}
+
+ /// EC to be destroyed.
+ RtecEventChannelAdmin::EventChannel_var ec_;
+};
+
+TAO_END_VERSIONED_NAMESPACE_DECL
+
+#if defined (__ACE_INLINE__)
+#include "orbsvcs/Event/EC_Lifetime_Utils.i"
+#endif /* __ACE_INLINE__ */
+
+#include /**/ "ace/post.h"
+#endif /* TAO_EC_LIFETIME_UTILS_H */
diff --git a/TAO/orbsvcs/orbsvcs/Event/EC_Lifetime_Utils.i b/TAO/orbsvcs/orbsvcs/Event/EC_Lifetime_Utils.i
new file mode 100644
index 00000000000..2884f04108d
--- /dev/null
+++ b/TAO/orbsvcs/orbsvcs/Event/EC_Lifetime_Utils.i
@@ -0,0 +1,179 @@
+// -*- C++ -*-
+//
+// $Id$
+
+TAO_BEGIN_VERSIONED_NAMESPACE_DECL
+
+ACE_INLINE
+TAO_EC_Object_Deactivator::TAO_EC_Object_Deactivator (void)
+ : poa_ ()
+ , id_ ()
+ , deactivate_ (0)
+{
+}
+
+ACE_INLINE
+TAO_EC_Object_Deactivator::TAO_EC_Object_Deactivator (
+ PortableServer::POA_ptr poa,
+ PortableServer::ObjectId const & id)
+ : poa_ (PortableServer::POA::_duplicate (poa))
+ , id_ (id)
+ , deactivate_ (1)
+{
+}
+
+ACE_INLINE void
+TAO_EC_Object_Deactivator::deactivate (void)
+{
+ if (this->deactivate_ && !CORBA::is_nil (this->poa_.in ()))
+ {
+ ACE_DECLARE_NEW_CORBA_ENV;
+ ACE_TRY
+ {
+ this->deactivate_ = 0;
+ this->poa_->deactivate_object (id_ ACE_ENV_ARG_PARAMETER);
+ ACE_TRY_CHECK;
+ }
+ ACE_CATCHANY
+ {
+ // The deactivation can throw...
+ }
+ ACE_ENDTRY;
+ }
+}
+
+ACE_INLINE
+TAO_EC_Object_Deactivator::~TAO_EC_Object_Deactivator (void)
+{
+ this->deactivate ();
+}
+
+ACE_INLINE PortableServer::POA_var
+TAO_EC_Object_Deactivator::poa (void) const
+{
+ return this->poa_;
+}
+
+ACE_INLINE void
+TAO_EC_Object_Deactivator::allow_deactivation (void)
+{
+ this->deactivate_ = 1;
+}
+
+ACE_INLINE void
+TAO_EC_Object_Deactivator::disallow_deactivation (void)
+{
+ this->deactivate_ = 0;
+}
+
+ACE_INLINE void
+TAO_EC_Object_Deactivator::set_values (PortableServer::POA_ptr poa,
+ PortableServer::ObjectId const & id)
+{
+ this->poa_ = PortableServer::POA::_duplicate (poa);
+ this->id_ = id;
+ this->deactivate_ = 1;
+}
+
+ACE_INLINE void
+TAO_EC_Object_Deactivator::set_values (TAO_EC_Object_Deactivator & deactivator)
+{
+ if (this == &deactivator)
+ return;
+
+ this->poa_ = deactivator.poa_._retn ();
+ this->id_ = deactivator.id_;
+ this->deactivate_ = deactivator.deactivate_;
+ deactivator.deactivate_ = 0;
+}
+
+// ****************************************************************
+
+ACE_INLINE
+TAO_EC_Deactivated_Object::TAO_EC_Deactivated_Object (void)
+ : deactivator_ ()
+{
+}
+
+ACE_INLINE
+TAO_EC_Deactivated_Object::~TAO_EC_Deactivated_Object (void)
+{
+ // Prevent automatic deactivation in deactivator's destructor.
+ this->deactivator_.disallow_deactivation ();
+}
+
+ACE_INLINE void
+TAO_EC_Deactivated_Object::set_deactivator (
+ TAO_EC_Object_Deactivator & deactivator)
+{
+ this->deactivator_.set_values (deactivator);
+}
+
+// ****************************************************************
+
+ACE_INLINE
+TAO_EC_ORB_Holder::TAO_EC_ORB_Holder (void)
+ : orb_ ()
+{
+}
+
+ACE_INLINE
+TAO_EC_ORB_Holder::~TAO_EC_ORB_Holder (void)
+{
+ if (!CORBA::is_nil (this->orb_.in ()))
+ {
+ ACE_DECLARE_NEW_CORBA_ENV;
+ ACE_TRY
+ {
+ this->orb_->destroy (ACE_ENV_SINGLE_ARG_PARAMETER);
+ ACE_TRY_CHECK;
+ }
+ ACE_CATCHANY
+ {
+ // Ignore.
+ }
+ ACE_ENDTRY;
+ }
+}
+
+ACE_INLINE void
+TAO_EC_ORB_Holder::init (CORBA::ORB_var orb_var)
+{
+ this->orb_ = orb_var;
+}
+
+// ****************************************************************
+
+ACE_INLINE
+TAO_EC_Event_Channel_Holder::TAO_EC_Event_Channel_Holder (void)
+ : ec_ ()
+{
+}
+
+ACE_INLINE
+TAO_EC_Event_Channel_Holder::~TAO_EC_Event_Channel_Holder (void)
+{
+ if (!CORBA::is_nil (this->ec_.in ()))
+ {
+ ACE_DECLARE_NEW_CORBA_ENV;
+ ACE_TRY
+ {
+ this->ec_->destroy (ACE_ENV_SINGLE_ARG_PARAMETER);
+ ACE_TRY_CHECK;
+ }
+ ACE_CATCHANY
+ {
+ // Ignore.
+ }
+ ACE_ENDTRY;
+ }
+}
+
+ACE_INLINE void
+TAO_EC_Event_Channel_Holder::init (
+ RtecEventChannelAdmin::EventChannel_var ec_var)
+{
+ this->ec_ = ec_var;
+}
+
+TAO_END_VERSIONED_NAMESPACE_DECL
diff --git a/TAO/orbsvcs/orbsvcs/Event/EC_Lifetime_Utils_T.cpp b/TAO/orbsvcs/orbsvcs/Event/EC_Lifetime_Utils_T.cpp
new file mode 100644
index 00000000000..8a8d4934d40
--- /dev/null
+++ b/TAO/orbsvcs/orbsvcs/Event/EC_Lifetime_Utils_T.cpp
@@ -0,0 +1,51 @@
+// $Id$
+
+#ifndef TAO_EC_LIFETIME_UTILS_T_CPP
+#define TAO_EC_LIFETIME_UTILS_T_CPP
+
+#include "orbsvcs/Event/EC_Lifetime_Utils_T.h"
+
+#if ! defined (__ACE_INLINE__)
+#include "orbsvcs/Event/EC_Lifetime_Utils_T.i"
+#endif /* __ACE_INLINE__ */
+
+TAO_BEGIN_VERSIONED_NAMESPACE_DECL
+
+template <typename T>
+void
+activate (T & obj_ref,
+ PortableServer::POA_ptr poa,
+ PortableServer::ServantBase * servant,
+ TAO_EC_Object_Deactivator & suggested_object_deactivator
+ ACE_ENV_ARG_DECL)
+{
+ // Activate the servant into the POA.
+ PortableServer::ObjectId_var obj_id =
+ poa->activate_object (servant
+ ACE_ENV_ARG_PARAMETER);
+ ACE_CHECK;
+
+ suggested_object_deactivator.set_values (poa, obj_id.in ());
+
+ // Get the object reference of the activated object.
+ CORBA::Object_var obj =
+ poa->id_to_reference (obj_id.in () ACE_ENV_ARG_PARAMETER);
+ ACE_CHECK;
+
+ // Don't try to use T::_obj_type::_narrow, some compilers don't like it so
+ // do this in two steps
+ typedef typename T::_obj_type my_object_type;
+
+ obj_ref =
+ my_object_type::_narrow (obj.in() ACE_ENV_ARG_PARAMETER);
+ ACE_CHECK;
+
+ if (CORBA::is_nil (obj_ref.in ()))
+ {
+ ACE_THROW (CORBA::INTERNAL ());
+ }
+}
+
+TAO_END_VERSIONED_NAMESPACE_DECL
+
+#endif /* TAO_EC_LIFETIME_UTILS_T_CPP */
diff --git a/TAO/orbsvcs/orbsvcs/Event/EC_Lifetime_Utils_T.h b/TAO/orbsvcs/orbsvcs/Event/EC_Lifetime_Utils_T.h
new file mode 100644
index 00000000000..85b98439126
--- /dev/null
+++ b/TAO/orbsvcs/orbsvcs/Event/EC_Lifetime_Utils_T.h
@@ -0,0 +1,203 @@
+// -*- C++ -*-
+
+/**
+ * @file EC_Lifetime_Utils_T.h
+ *
+ * $Id$
+ *
+ * @author Jody Hagins (jody@atdesk.com)
+ * @author Marina Spivak (marina@atdesk.com)
+ *
+ * This file is a temporary place for general CORBA application
+ * utility classes. These classes will be moved out from the EC
+ * library and into TAO or will be replaced by other TAO classes with
+ * similar functionality.
+ */
+
+#ifndef TAO_EC_LIFETIME_UTILS_T_H
+#define TAO_EC_LIFETIME_UTILS_T_H
+
+#include "orbsvcs/Event/EC_Lifetime_Utils.h"
+
+#if !defined (ACE_LACKS_PRAGMA_ONCE)
+# pragma once
+#endif /* ACE_LACKS_PRAGMA_ONCE */
+
+TAO_BEGIN_VERSIONED_NAMESPACE_DECL
+
+/**
+ * @brief Helper for activating objects.
+ * Activates @a servant with @a poa and returns the object reference via
+ * @a obj_ref. If @a object_deactivator != 0, it is populated with info
+ * necessary to deactivate the @a servant from @a poa.
+ */
+template <typename T>
+void activate (T & obj_ref,
+ PortableServer::POA_ptr poa,
+ PortableServer::ServantBase * servant,
+ TAO_EC_Object_Deactivator & object_deactivator
+ ACE_ENV_ARG_DECL);
+
+
+//***************************************************************************
+
+/**
+ * @class TAO_EC_Auto_Command<COMMAND>
+ *
+ * @brief Utility class which executes COMMAND in its destructor.
+ *
+ * Template argument requirements:
+ *
+ * Has void execute (ACE_ENV_SINGLE_ARG_DECL); method which
+ * can throw ONLY CORBA exceptions.
+ * Has default and copy constructors.
+ *
+ */
+template <class T>
+class TAO_EC_Auto_Command
+{
+public:
+ TAO_EC_Auto_Command (void);
+ TAO_EC_Auto_Command (const T & command);
+ ~TAO_EC_Auto_Command (void);
+ void set_command (const T & command);
+ void set_command (TAO_EC_Auto_Command<T> & auto_command);
+ void execute (void);
+ void allow_command (void);
+ void disallow_command (void);
+
+private:
+
+ TAO_EC_Auto_Command (const TAO_EC_Auto_Command &);
+ TAO_EC_Auto_Command & operator= (const TAO_EC_Auto_Command &);
+
+ T command_;
+ int allow_command_;
+};
+
+
+//***************************************************************************
+
+template <class T>
+class TAO_EC_Shutdown_Command
+{
+public:
+ TAO_EC_Shutdown_Command (void);
+ TAO_EC_Shutdown_Command (T target);
+ void execute (ACE_ENV_SINGLE_ARG_DECL);
+
+private:
+
+ T target_;
+};
+
+//***************************************************************************
+
+/**
+ * @class Servant_Var
+ *
+ * @brief Provides a type safe counted reference to servants.
+ */
+template <class T>
+class TAO_EC_Servant_Var
+{
+public:
+ //! Constructor. Assumes ownership of \c p.
+ TAO_EC_Servant_Var(T * p = 0);
+
+ //! Copy constructor. Adds reference to \c rhs.
+ TAO_EC_Servant_Var(TAO_EC_Servant_Var<T> const & rhs);
+
+ //! Assignment operator. Adds reference to \c rhs.
+ TAO_EC_Servant_Var<T> & operator=(TAO_EC_Servant_Var<T> const & rhs);
+
+ //! Destructor. Removes a reference from the underlying object,
+ //! possibly destroying it.
+ ~TAO_EC_Servant_Var();
+
+ //! Assignment operator. Assumes ownership of \c p.
+ TAO_EC_Servant_Var<T> & operator=(T * p);
+
+# if !defined(ACE_LACKS_MEMBER_TEMPLATES)
+ //! Template member constructor from a pointer that will implicitly
+ //! cast to type T. Assumes ownership of \c p.
+ //! This constructor allows constructs such as:
+ //! Servant_Base<Base> p(new Derived);
+ template <class Y>
+ TAO_EC_Servant_Var(Y * p);
+
+ //! Template member copy constructor from a TAO_EC_Servant_Var<Y>, where
+ //! Y can be implicitly cast to type T.
+ template <class Y>
+ TAO_EC_Servant_Var(TAO_EC_Servant_Var<Y> const & rhs);
+
+ //! Template member assignment operator from a TAO_EC_Servant_Var<Y>, where
+ //! Y can be implicitly cast to type T.
+ template <class Y>
+ TAO_EC_Servant_Var<T> & operator=(TAO_EC_Servant_Var<Y> const & rhs);
+
+ //! Template member assignment operator from a pointer to Y, where Y
+ //! can be implicitly cast to type T.
+ template <class Y>
+ TAO_EC_Servant_Var<T> & operator=(Y * p);
+# endif /* ACE_LACKS_MEMBER_TEMPLATES */
+
+ //! Smart pointer operator-> provides access to the underlying object.
+ T const * operator->() const;
+
+ //! Smart pointer operator-> provides access to the underlying object.
+ T * operator->();
+
+ //! Dereference the underlying object.
+ T const & operator*() const;
+
+ //! Dereference the underlying object.
+ T & operator*();
+
+ //! Return a void pointer to the underlying object. This allows
+ //! it to be used in conditional code and tested against 0.
+ operator void const * () const;
+
+ //! As an IN parameter.
+ T * in() const;
+
+ //! As an INOUT parameter.
+ T *& inout();
+
+ //! As an OUT parameter.
+ T *& out();
+
+ // Return a pointer to the underlying object, and this counted
+ // reference will no longer own the object.
+ T * _retn();
+
+private:
+ T * ptr_;
+};
+
+//! Compare two TAO_EC_Servant_Vars for equivalence.
+template <class X, class Y>
+bool operator==(TAO_EC_Servant_Var<X> const & x,
+ TAO_EC_Servant_Var<Y> const & y);
+
+//! Compare two TAO_EC_Servant_Vars for non-equivalence.
+template <class X, class Y>
+bool operator!=(TAO_EC_Servant_Var<X> const & x,
+ TAO_EC_Servant_Var<Y> const & y);
+
+
+TAO_END_VERSIONED_NAMESPACE_DECL
+
+#if defined (__ACE_INLINE__)
+#include "orbsvcs/Event/EC_Lifetime_Utils_T.i"
+#endif /* __ACE_INLINE__ */
+
+#if defined (ACE_TEMPLATES_REQUIRE_SOURCE)
+#include "orbsvcs/Event/EC_Lifetime_Utils_T.cpp"
+#endif /* ACE_TEMPLATES_REQUIRE_SOURCE */
+
+#if defined (ACE_TEMPLATES_REQUIRE_PRAGMA)
+#pragma implementation ("EC_Lifetime_Utils_T.cpp")
+#endif /* ACE_TEMPLATES_REQUIRE_PRAGMA */
+
+#endif /* EC_LIFETIME_UTILS_T_H */
diff --git a/TAO/orbsvcs/orbsvcs/Event/EC_Lifetime_Utils_T.i b/TAO/orbsvcs/orbsvcs/Event/EC_Lifetime_Utils_T.i
new file mode 100644
index 00000000000..e93998fee0f
--- /dev/null
+++ b/TAO/orbsvcs/orbsvcs/Event/EC_Lifetime_Utils_T.i
@@ -0,0 +1,340 @@
+// -*- C++ -*-
+//
+// $Id$
+
+TAO_BEGIN_VERSIONED_NAMESPACE_DECL
+
+template <class T>
+ACE_INLINE
+TAO_EC_Auto_Command<T>::TAO_EC_Auto_Command (void)
+ : command_ ()
+ , allow_command_ (0)
+{
+}
+
+template <class T>
+ACE_INLINE
+TAO_EC_Auto_Command<T>::TAO_EC_Auto_Command (const T & command)
+ : command_ (command)
+ , allow_command_ (1)
+{
+}
+
+template <class T>
+ACE_INLINE
+TAO_EC_Auto_Command<T>::~TAO_EC_Auto_Command (void)
+{
+ this->execute ();
+}
+
+template <class T>
+ACE_INLINE void
+TAO_EC_Auto_Command<T>::set_command (const T & command)
+{
+ this->command_ = command;
+ this->allow_command_ = 1;
+}
+
+template <class T>
+ACE_INLINE void
+TAO_EC_Auto_Command<T>::set_command (TAO_EC_Auto_Command<T> & auto_command)
+{
+ if (this == &auto_command)
+ return;
+
+ this->command_ = auto_command.command_;
+ this->allow_command_ = auto_command.allow_command_;
+ auto_command.allow_command_ = 0;
+}
+
+template <class T>
+ACE_INLINE void
+TAO_EC_Auto_Command<T>::execute (void)
+{
+ if (this->allow_command_)
+ {
+ this->allow_command_ = 0;
+
+ ACE_TRY_NEW_ENV
+ {
+ this->command_.execute (ACE_ENV_SINGLE_ARG_PARAMETER);
+ ACE_TRY_CHECK;
+ }
+ ACE_CATCHANY
+ {
+ // ignore.
+ }
+ ACE_ENDTRY;
+ }
+}
+
+template <class T>
+ACE_INLINE void
+TAO_EC_Auto_Command<T>::allow_command (void)
+{
+ this->allow_command_ = 1;
+}
+
+template <class T>
+ACE_INLINE void
+TAO_EC_Auto_Command<T>::disallow_command (void)
+{
+ this->allow_command_ = 0;
+}
+
+
+//***************************************************************************
+
+template <class T>
+ACE_INLINE
+TAO_EC_Shutdown_Command<T>::TAO_EC_Shutdown_Command (void)
+ : target_ ()
+{
+}
+
+template <class T>
+ACE_INLINE
+TAO_EC_Shutdown_Command<T>::TAO_EC_Shutdown_Command (T target)
+ : target_ (target)
+{
+}
+
+template <class T>
+ACE_INLINE void
+TAO_EC_Shutdown_Command<T>::execute (ACE_ENV_SINGLE_ARG_DECL)
+{
+ if (this->target_.in ())
+ {
+ this->target_->shutdown (ACE_ENV_SINGLE_ARG_PARAMETER);
+ ACE_CHECK;
+ }
+}
+
+//***************************************************************************
+
+
+TAO_END_VERSIONED_NAMESPACE_DECL
+
+// Life would be much easier if _add_ref() and _remove_ref()
+// had throw specs of "throw ()"
+
+#include <algorithm>
+
+TAO_BEGIN_VERSIONED_NAMESPACE_DECL
+
+template <class T>
+ACE_INLINE TAO_EC_Servant_Var<T>::
+TAO_EC_Servant_Var(T * p)
+ : ptr_(p)
+{
+}
+
+// If _add_ref throws, this object will not be completely constructed
+// so the destructor will not be called.
+template <class T>
+ACE_INLINE TAO_EC_Servant_Var<T>::
+TAO_EC_Servant_Var(TAO_EC_Servant_Var<T> const & rhs)
+ : ptr_(rhs.ptr_)
+{
+ if (ptr_)
+ {
+ ACE_TRY_NEW_ENV
+ {
+ ptr_->_add_ref (ACE_ENV_SINGLE_ARG_PARAMETER);
+ ACE_TRY_CHECK;
+ }
+ ACE_CATCHALL
+ {
+ ACE_RE_THROW;
+ }
+ ACE_ENDTRY;
+ }
+}
+
+template <class T>
+ACE_INLINE TAO_EC_Servant_Var<T> & TAO_EC_Servant_Var<T>::
+operator=(TAO_EC_Servant_Var<T> const & rhs)
+{
+ TAO_EC_Servant_Var<T> tmp(rhs);
+
+ // std::swap(tmp.ptr_, ptr_);
+ T * swap_temp = tmp.ptr_;
+ tmp.ptr_ = ptr_;
+ ptr_ = swap_temp;
+
+ return *this;
+}
+
+template <class T>
+ACE_INLINE TAO_EC_Servant_Var<T> & TAO_EC_Servant_Var<T>::
+operator=(T * p)
+{
+ TAO_EC_Servant_Var<T> tmp(p);
+
+ // std::swap(tmp.ptr_, ptr_);
+ T * swap_temp = tmp.ptr_;
+ tmp.ptr_ = ptr_;
+ ptr_ = swap_temp;
+
+ return *this;
+}
+
+template <class T>
+ACE_INLINE TAO_EC_Servant_Var<T>::
+~TAO_EC_Servant_Var()
+{
+ // Unfortunately, there is no throw spec on _remove_ref, so we
+ // can't assume that it will not throw. If it does, then we are in
+ // trouble. In any event, we can't let the exception escape our
+ // destructor.
+ if (ptr_ != 0)
+ {
+ ACE_TRY_NEW_ENV
+ {
+ ptr_->_remove_ref (ACE_ENV_SINGLE_ARG_PARAMETER);
+ ACE_TRY_CHECK;
+ }
+ ACE_CATCHALL
+ {
+ }
+ ACE_ENDTRY;
+ }
+}
+
+#if !defined(ACE_LACKS_MEMBER_TEMPLATES)
+template <class T> template <class Y>
+ACE_INLINE TAO_EC_Servant_Var<T>::
+TAO_EC_Servant_Var(Y * p)
+ : ptr_(p)
+{
+}
+
+template <class T> template <class Y>
+ACE_INLINE TAO_EC_Servant_Var<T>::
+TAO_EC_Servant_Var(TAO_EC_Servant_Var<Y> const & rhs)
+ : ptr_(rhs.in())
+{
+ if (ptr_)
+ {
+ ptr_->_add_ref();
+ }
+}
+
+template <class T> template <class Y>
+ACE_INLINE TAO_EC_Servant_Var<T> & TAO_EC_Servant_Var<T>::
+operator=(TAO_EC_Servant_Var<Y> const & rhs)
+{
+ TAO_EC_Servant_Var<T> tmp(rhs);
+
+ // std::swap(tmp.ptr_, ptr_);
+ T * swap_temp = tmp.ptr_;
+ tmp.ptr_ = ptr_;
+ ptr_ = swap_temp;
+
+ return *this;
+}
+
+template <class T> template <class Y>
+ACE_INLINE TAO_EC_Servant_Var<T> & TAO_EC_Servant_Var<T>::
+operator=(Y * p)
+{
+ TAO_EC_Servant_Var<T> tmp(p);
+
+ // std::swap(tmp.ptr_, ptr_);
+ T * swap_temp = tmp.ptr_;
+ tmp.ptr_ = ptr_;
+ ptr_ = swap_temp;
+
+ return *this;
+}
+#endif /* ACE_LACKS_MEMBER_TEMPLATES */
+
+template <class T>
+ACE_INLINE T const * TAO_EC_Servant_Var<T>::
+operator->() const
+{
+ return ptr_;
+}
+
+template <class T>
+ACE_INLINE T * TAO_EC_Servant_Var<T>::
+operator->()
+{
+ return ptr_;
+}
+
+template <class T>
+ACE_INLINE T const & TAO_EC_Servant_Var<T>::
+operator*() const
+{
+ return *ptr_;
+}
+
+template <class T>
+ACE_INLINE T & TAO_EC_Servant_Var<T>::
+operator*()
+{
+ return *ptr_;
+}
+
+template <class T>
+ACE_INLINE TAO_EC_Servant_Var<T>::
+operator void const * () const
+{
+ return ptr_;
+}
+
+template <class T>
+ACE_INLINE T * TAO_EC_Servant_Var<T>::
+in() const
+{
+ return ptr_;
+}
+
+template <class T>
+ACE_INLINE T *& TAO_EC_Servant_Var<T>::
+inout()
+{
+ return ptr_;
+}
+
+template <class T>
+ACE_INLINE T *& TAO_EC_Servant_Var<T>::
+out()
+{
+ TAO_EC_Servant_Var<T> tmp;
+
+ // std::swap(tmp.ptr_, ptr_);
+ T * swap_temp = tmp.ptr_;
+ tmp.ptr_ = ptr_;
+ ptr_ = swap_temp;
+
+ return ptr_;
+}
+
+template <class T>
+ACE_INLINE T * TAO_EC_Servant_Var<T>::
+_retn()
+{
+ T * rval = ptr_;
+ ptr_ = 0;
+ return rval;
+}
+
+template <class X, class Y>
+ACE_INLINE bool
+operator==(TAO_EC_Servant_Var<X> const & x,
+ TAO_EC_Servant_Var<Y> const & y)
+{
+ return x.in() == y.in();
+}
+
+template <class X, class Y>
+ACE_INLINE bool
+operator!=(TAO_EC_Servant_Var<X> const & x,
+ TAO_EC_Servant_Var<Y> const & y)
+{
+ return x.in() != y.in();
+}
+
+TAO_END_VERSIONED_NAMESPACE_DECL
diff --git a/TAO/orbsvcs/orbsvcs/Event/EC_MT_Dispatching.cpp b/TAO/orbsvcs/orbsvcs/Event/EC_MT_Dispatching.cpp
new file mode 100644
index 00000000000..096ae4c3ba0
--- /dev/null
+++ b/TAO/orbsvcs/orbsvcs/Event/EC_MT_Dispatching.cpp
@@ -0,0 +1,92 @@
+// $Id$
+
+#include "orbsvcs/Event/EC_MT_Dispatching.h"
+
+ACE_RCSID(Event, EC_MT_Dispatching, "$Id$")
+
+
+TAO_BEGIN_VERSIONED_NAMESPACE_DECL
+
+TAO_EC_MT_Dispatching::TAO_EC_MT_Dispatching (int nthreads,
+ int thread_creation_flags,
+ int thread_priority,
+ int force_activate,
+ TAO_EC_Queue_Full_Service_Object* service_object)
+ : nthreads_ (nthreads),
+ thread_creation_flags_ (thread_creation_flags),
+ thread_priority_ (thread_priority),
+ force_activate_ (force_activate),
+ active_ (0),
+ queue_full_service_object_ (service_object)
+{
+ this->task_.open (&this->thread_manager_);
+}
+
+void
+TAO_EC_MT_Dispatching::activate (void)
+{
+ ACE_GUARD (TAO_SYNCH_MUTEX, ace_mon, this->lock_);
+
+ if (this->active_ != 0)
+ return;
+
+ this->active_ = 1;
+
+ if (this->task_.activate (this->thread_creation_flags_,
+ this->nthreads_,
+ 1,
+ this->thread_priority_) == -1)
+ {
+ if (this->force_activate_ != 0)
+ {
+ ACE_DEBUG ((LM_DEBUG,
+ "EC (%P|%t) activating dispatching queue at"
+ " default priority\n"));
+ if (this->task_.activate (THR_BOUND, this->nthreads_) == -1)
+ ACE_ERROR ((LM_ERROR,
+ "EC (%P|%t) cannot activate dispatching queue.\n"));
+ }
+ }
+}
+
+void
+TAO_EC_MT_Dispatching::shutdown (void)
+{
+ ACE_GUARD (TAO_SYNCH_MUTEX, ace_mon, this->lock_);
+
+ if (this->active_ == 0)
+ return;
+
+ for (int i = 0; i < this->nthreads_; ++i)
+ {
+ this->task_.putq (new TAO_EC_Shutdown_Task_Command);
+ }
+ this->thread_manager_.wait ();
+}
+
+void
+TAO_EC_MT_Dispatching::push (TAO_EC_ProxyPushSupplier* proxy,
+ RtecEventComm::PushConsumer_ptr consumer,
+ const RtecEventComm::EventSet& event,
+ TAO_EC_QOS_Info& qos_info
+ ACE_ENV_ARG_DECL)
+{
+ RtecEventComm::EventSet event_copy = event;
+ this->push_nocopy (proxy, consumer, event_copy, qos_info ACE_ENV_ARG_PARAMETER);
+}
+
+void
+TAO_EC_MT_Dispatching::push_nocopy (TAO_EC_ProxyPushSupplier* proxy,
+ RtecEventComm::PushConsumer_ptr consumer,
+ RtecEventComm::EventSet& event,
+ TAO_EC_QOS_Info&
+ ACE_ENV_ARG_DECL)
+{
+ // Double checked locking....
+ if (this->active_ == 0)
+ this->activate ();
+
+ this->task_.push (proxy, consumer, event ACE_ENV_ARG_PARAMETER);
+}
+
+TAO_END_VERSIONED_NAMESPACE_DECL
diff --git a/TAO/orbsvcs/orbsvcs/Event/EC_MT_Dispatching.h b/TAO/orbsvcs/orbsvcs/Event/EC_MT_Dispatching.h
new file mode 100644
index 00000000000..b38b5a160fd
--- /dev/null
+++ b/TAO/orbsvcs/orbsvcs/Event/EC_MT_Dispatching.h
@@ -0,0 +1,98 @@
+// -*- C++ -*-
+
+/**
+ * @file EC_MT_Dispatching.h
+ *
+ * $Id$
+ *
+ * @author Carlos O'Ryan (coryan@cs.wustl.edu)
+ *
+ * Based on previous work by Tim Harrison (harrison@cs.wustl.edu) and
+ * other members of the DOC group. More details can be found in:
+ *
+ * http://doc.ece.uci.edu/~coryan/EC/index.html
+ */
+
+#ifndef TAO_EC_MT_DISPATCHING_H
+#define TAO_EC_MT_DISPATCHING_H
+#include /**/ "ace/pre.h"
+
+#include "orbsvcs/Event/EC_Dispatching.h"
+
+#if !defined (ACE_LACKS_PRAGMA_ONCE)
+# pragma once
+#endif /* ACE_LACKS_PRAGMA_ONCE */
+
+#include "orbsvcs/Event/EC_Dispatching_Task.h"
+
+TAO_BEGIN_VERSIONED_NAMESPACE_DECL
+
+/**
+ * @class TAO_EC_MT_Dispatching
+ *
+ * @brief Dispatching strategy that minimizes mt inversion.
+ *
+ * This strategy uses a single queue, serviced by one or more
+ * threads. It's main purpose is to decouple the suppliers from
+ * the client execution time, specially in the collocated case.
+ */
+class TAO_RTEvent_Serv_Export TAO_EC_MT_Dispatching : public TAO_EC_Dispatching
+{
+public:
+ /// Constructor
+ /// It will create @a nthreads servicing threads...
+ TAO_EC_MT_Dispatching (int nthreads,
+ int thread_creation_flags,
+ int thread_priority,
+ int force_activate,
+ TAO_EC_Queue_Full_Service_Object* queue_full_service_object_name);
+
+ // = The EC_Dispatching methods.
+ virtual void activate (void);
+ virtual void shutdown (void);
+ virtual void push (TAO_EC_ProxyPushSupplier* proxy,
+ RtecEventComm::PushConsumer_ptr consumer,
+ const RtecEventComm::EventSet& event,
+ TAO_EC_QOS_Info& qos_info
+ ACE_ENV_ARG_DECL);
+ virtual void push_nocopy (TAO_EC_ProxyPushSupplier* proxy,
+ RtecEventComm::PushConsumer_ptr consumer,
+ RtecEventComm::EventSet& event,
+ TAO_EC_QOS_Info& qos_info
+ ACE_ENV_ARG_DECL);
+
+private:
+ /// Use our own thread manager.
+ ACE_Thread_Manager thread_manager_;
+
+ /// The number of active tasks
+ int nthreads_;
+
+ /// The flags (THR_BOUND, THR_NEW_LWP, etc.) used to create the
+ /// dispatching threads.
+ int thread_creation_flags_;
+
+ /// The priority of the dispatching threads.
+ int thread_priority_;
+
+ /// If activation at the requested priority fails then we fallback on
+ /// the defaults for thread activation.
+ int force_activate_;
+
+ /// The dispatching task
+ TAO_EC_Dispatching_Task task_;
+
+ /// Synchronize access to internal data
+ TAO_SYNCH_MUTEX lock_;
+
+ /// Are the threads running?
+ int active_;
+
+ /// Service Object information
+ TAO_EC_Queue_Full_Service_Object* queue_full_service_object_;
+};
+
+TAO_END_VERSIONED_NAMESPACE_DECL
+
+#include /**/ "ace/post.h"
+#endif /* TAO_EC_MT_DISPATCHING_H */
diff --git a/TAO/orbsvcs/orbsvcs/Event/EC_Masked_Type_Filter.cpp b/TAO/orbsvcs/orbsvcs/Event/EC_Masked_Type_Filter.cpp
new file mode 100644
index 00000000000..0ab3197ef29
--- /dev/null
+++ b/TAO/orbsvcs/orbsvcs/Event/EC_Masked_Type_Filter.cpp
@@ -0,0 +1,128 @@
+// $Id$
+
+#include "orbsvcs/Event/EC_Masked_Type_Filter.h"
+
+ACE_RCSID(Event, EC_Masked_Type_Filter, "$Id$")
+
+TAO_BEGIN_VERSIONED_NAMESPACE_DECL
+
+TAO_EC_Masked_Type_Filter::
+ TAO_EC_Masked_Type_Filter (CORBA::ULong source_mask,
+ CORBA::ULong type_mask,
+ CORBA::ULong source_value,
+ CORBA::ULong type_value)
+ : source_mask_ (source_mask),
+ type_mask_ (type_mask),
+ source_value_ (source_value),
+ type_value_ (type_value)
+{
+}
+
+TAO_EC_Masked_Type_Filter::~TAO_EC_Masked_Type_Filter (void)
+{
+}
+
+TAO_EC_Filter::ChildrenIterator
+TAO_EC_Masked_Type_Filter::begin (void) const
+{
+ return 0;
+}
+
+TAO_EC_Filter::ChildrenIterator
+TAO_EC_Masked_Type_Filter::end (void) const
+{
+ return 0;
+}
+
+int
+TAO_EC_Masked_Type_Filter::size (void) const
+{
+ return 0;
+}
+
+int
+TAO_EC_Masked_Type_Filter::filter (const RtecEventComm::EventSet& event,
+ TAO_EC_QOS_Info& qos_info
+ ACE_ENV_ARG_DECL)
+{
+ if (event.length () != 1)
+ return 0;
+
+ if ((event[0].header.type & this->type_mask_) != this->type_value_
+ || (event[0].header.source & this->source_mask_) != this->source_value_)
+ return 0;
+
+ if (this->parent () != 0)
+ {
+ this->parent ()->push (event, qos_info ACE_ENV_ARG_PARAMETER);
+ ACE_CHECK_RETURN (0);
+ }
+ return 1;
+}
+
+int
+TAO_EC_Masked_Type_Filter::filter_nocopy (RtecEventComm::EventSet& event,
+ TAO_EC_QOS_Info& qos_info
+ ACE_ENV_ARG_DECL)
+{
+ if (event.length () != 1)
+ return 0;
+
+ if ((event[0].header.type & this->type_mask_) != this->type_value_
+ || (event[0].header.source & this->source_mask_) != this->source_value_)
+ return 0;
+
+ if (this->parent () != 0)
+ {
+ this->parent ()->push_nocopy (event, qos_info ACE_ENV_ARG_PARAMETER);
+ ACE_CHECK_RETURN (0);
+ }
+ return 1;
+}
+
+void
+TAO_EC_Masked_Type_Filter::push (const RtecEventComm::EventSet &,
+ TAO_EC_QOS_Info &
+ ACE_ENV_ARG_DECL_NOT_USED)
+{
+}
+
+void
+TAO_EC_Masked_Type_Filter::push_nocopy (RtecEventComm::EventSet &,
+ TAO_EC_QOS_Info &
+ ACE_ENV_ARG_DECL_NOT_USED)
+{
+}
+
+void
+TAO_EC_Masked_Type_Filter::clear (void)
+{
+}
+
+CORBA::ULong
+TAO_EC_Masked_Type_Filter::max_event_size (void) const
+{
+ return 1;
+}
+
+int
+TAO_EC_Masked_Type_Filter::can_match (
+ const RtecEventComm::EventHeader& header) const
+{
+ if ((header.type & this->type_mask_) == this->type_value_
+ && (header.source & this->source_mask_) == this->source_value_)
+ return 1;
+
+ return 0;
+}
+
+int
+TAO_EC_Masked_Type_Filter::add_dependencies (
+ const RtecEventComm::EventHeader&,
+ const TAO_EC_QOS_Info &
+ ACE_ENV_ARG_DECL_NOT_USED)
+{
+ return 0;
+}
+
+TAO_END_VERSIONED_NAMESPACE_DECL
diff --git a/TAO/orbsvcs/orbsvcs/Event/EC_Masked_Type_Filter.h b/TAO/orbsvcs/orbsvcs/Event/EC_Masked_Type_Filter.h
new file mode 100644
index 00000000000..97a83d622ea
--- /dev/null
+++ b/TAO/orbsvcs/orbsvcs/Event/EC_Masked_Type_Filter.h
@@ -0,0 +1,93 @@
+// -*- C++ -*-
+
+/**
+ * @file EC_Masked_Type_Filter.h
+ *
+ * $Id$
+ *
+ * @author Carlos O'Ryan (coryan@cs.wustl.edu)
+ *
+ * Based on previous work by Tim Harrison (harrison@cs.wustl.edu) and
+ * other members of the DOC group. More details can be found in:
+ *
+ * http://doc.ece.uci.edu/~coryan/EC/index.html
+ */
+
+#ifndef TAO_EC_MASKED_TYPE_FILTER_H
+#define TAO_EC_MASKED_TYPE_FILTER_H
+#include /**/ "ace/pre.h"
+
+#include "orbsvcs/Event/EC_Filter.h"
+
+#if !defined (ACE_LACKS_PRAGMA_ONCE)
+# pragma once
+#endif /* ACE_LACKS_PRAGMA_ONCE */
+
+TAO_BEGIN_VERSIONED_NAMESPACE_DECL
+
+/**
+ * @class TAO_EC_Masked_Type_Filter
+ *
+ * @brief A masked type filter.
+ *
+ * This filter only accepts events whose type and/or source have
+ * a given value when a bitmask is applied to them.
+ * In short the filter checks that:
+ * (event.header.type & type_mask) == type_value
+ * and that:
+ * (event.header.source & source_mask) == source_value
+ */
+class TAO_RTEvent_Serv_Export TAO_EC_Masked_Type_Filter : public TAO_EC_Filter
+{
+public:
+ /// Constructor.
+ TAO_EC_Masked_Type_Filter (CORBA::ULong source_mask,
+ CORBA::ULong type_mask,
+ CORBA::ULong source_value,
+ CORBA::ULong type_value);
+
+ /// Destructor
+ virtual ~TAO_EC_Masked_Type_Filter (void);
+
+ // = The TAO_EC_Filter methods, please check the documentation in
+ // TAO_EC_Filter.
+ virtual ChildrenIterator begin (void) const;
+ virtual ChildrenIterator end (void) const;
+ virtual int size (void) const;
+ virtual int filter (const RtecEventComm::EventSet& event,
+ TAO_EC_QOS_Info& qos_info
+ ACE_ENV_ARG_DECL);
+ virtual int filter_nocopy (RtecEventComm::EventSet& event,
+ TAO_EC_QOS_Info& qos_info
+ ACE_ENV_ARG_DECL);
+ virtual void push (const RtecEventComm::EventSet& event,
+ TAO_EC_QOS_Info& qos_info
+ ACE_ENV_ARG_DECL);
+ virtual void push_nocopy (RtecEventComm::EventSet& event,
+ TAO_EC_QOS_Info& qos_info
+ ACE_ENV_ARG_DECL);
+ virtual void clear (void);
+ virtual CORBA::ULong max_event_size (void) const;
+ virtual int can_match (const RtecEventComm::EventHeader& header) const;
+ virtual int add_dependencies (const RtecEventComm::EventHeader& header,
+ const TAO_EC_QOS_Info &qos_info
+ ACE_ENV_ARG_DECL);
+
+private:
+ TAO_EC_Masked_Type_Filter (const TAO_EC_Masked_Type_Filter&);
+ TAO_EC_Masked_Type_Filter& operator= (const TAO_EC_Masked_Type_Filter&);
+
+private:
+ /// The bitmasks
+ CORBA::ULong source_mask_;
+ CORBA::ULong type_mask_;
+
+ /// The values
+ CORBA::ULong source_value_;
+ CORBA::ULong type_value_;
+};
+
+TAO_END_VERSIONED_NAMESPACE_DECL
+
+#include /**/ "ace/post.h"
+#endif /* TAO_EC_MASKED_TYPE_FILTER_H */
diff --git a/TAO/orbsvcs/orbsvcs/Event/EC_Negation_Filter.cpp b/TAO/orbsvcs/orbsvcs/Event/EC_Negation_Filter.cpp
new file mode 100644
index 00000000000..204685379ac
--- /dev/null
+++ b/TAO/orbsvcs/orbsvcs/Event/EC_Negation_Filter.cpp
@@ -0,0 +1,114 @@
+// $Id$
+
+#include "orbsvcs/Event/EC_Negation_Filter.h"
+
+ACE_RCSID(Event, EC_Negation_Filter, "$Id$")
+
+TAO_BEGIN_VERSIONED_NAMESPACE_DECL
+
+TAO_EC_Negation_Filter::TAO_EC_Negation_Filter (TAO_EC_Filter* child)
+ : child_ (child)
+{
+ this->adopt_child (this->child_);
+}
+
+TAO_EC_Negation_Filter::~TAO_EC_Negation_Filter (void)
+{
+ delete this->child_;
+}
+
+TAO_EC_Filter::ChildrenIterator
+TAO_EC_Negation_Filter::begin (void) const
+{
+ return const_cast<TAO_EC_Filter**> (&this->child_);
+}
+
+TAO_EC_Filter::ChildrenIterator
+TAO_EC_Negation_Filter::end (void) const
+{
+ return const_cast<TAO_EC_Filter**> (&this->child_) + 1;
+}
+
+int
+TAO_EC_Negation_Filter::size (void) const
+{
+ return 1;
+}
+
+int
+TAO_EC_Negation_Filter::filter (const RtecEventComm::EventSet& event,
+ TAO_EC_QOS_Info& qos_info
+ ACE_ENV_ARG_DECL)
+{
+ int n =
+ this->child_->filter (event, qos_info ACE_ENV_ARG_PARAMETER);
+ ACE_CHECK_RETURN (0);
+ if (this->parent () != 0 && n == 0)
+ {
+ this->parent ()->push (event, qos_info ACE_ENV_ARG_PARAMETER);
+ ACE_CHECK_RETURN (0);
+ return 1;
+ }
+ return 0;
+}
+
+int
+TAO_EC_Negation_Filter::filter_nocopy (RtecEventComm::EventSet& event,
+ TAO_EC_QOS_Info& qos_info
+ ACE_ENV_ARG_DECL)
+{
+ int n =
+ this->child_->filter_nocopy (event, qos_info ACE_ENV_ARG_PARAMETER);
+ ACE_CHECK_RETURN (0);
+ if (this->parent () != 0 && n == 0)
+ {
+ this->parent ()->push_nocopy (event, qos_info ACE_ENV_ARG_PARAMETER);
+ ACE_CHECK_RETURN (0);
+ return 1;
+ }
+ return 0;
+}
+
+void
+TAO_EC_Negation_Filter::push (const RtecEventComm::EventSet&,
+ TAO_EC_QOS_Info&
+ ACE_ENV_ARG_DECL_NOT_USED)
+{
+}
+
+void
+TAO_EC_Negation_Filter::push_nocopy (RtecEventComm::EventSet&,
+ TAO_EC_QOS_Info&
+ ACE_ENV_ARG_DECL_NOT_USED)
+{
+}
+
+void
+TAO_EC_Negation_Filter::clear (void)
+{
+ this->child_->clear ();
+}
+
+CORBA::ULong
+TAO_EC_Negation_Filter::max_event_size (void) const
+{
+ return this->child_->max_event_size ();
+}
+
+int
+TAO_EC_Negation_Filter::can_match (
+ const RtecEventComm::EventHeader& header) const
+{
+ return !this->child_->can_match (header);
+}
+
+int
+TAO_EC_Negation_Filter::add_dependencies (
+ const RtecEventComm::EventHeader&,
+ const TAO_EC_QOS_Info &
+ ACE_ENV_ARG_DECL_NOT_USED)
+{
+ return 0;
+}
+
+TAO_END_VERSIONED_NAMESPACE_DECL
diff --git a/TAO/orbsvcs/orbsvcs/Event/EC_Negation_Filter.h b/TAO/orbsvcs/orbsvcs/Event/EC_Negation_Filter.h
new file mode 100644
index 00000000000..f4f141f0e27
--- /dev/null
+++ b/TAO/orbsvcs/orbsvcs/Event/EC_Negation_Filter.h
@@ -0,0 +1,86 @@
+// -*- C++ -*-
+
+/**
+ * @file EC_Negation_Filter.h
+ *
+ * $Id$
+ *
+ * @author Carlos O'Ryan (coryan@cs.wustl.edu)
+ *
+ * Based on previous work by Tim Harrison (harrison@cs.wustl.edu) and
+ * other members of the DOC group. More details can be found in:
+ *
+ * http://doc.ece.uci.edu/~coryan/EC/index.html
+ */
+
+#ifndef TAO_EC_NEGATION_FILTER_H
+#define TAO_EC_NEGATION_FILTER_H
+#include /**/ "ace/pre.h"
+
+#include "orbsvcs/Event/EC_Filter.h"
+#include /**/ "orbsvcs/Event/event_serv_export.h"
+
+#if !defined (ACE_LACKS_PRAGMA_ONCE)
+# pragma once
+#endif /* ACE_LACKS_PRAGMA_ONCE */
+
+TAO_BEGIN_VERSIONED_NAMESPACE_DECL
+
+/**
+ * @class TAO_EC_Negation_Filter
+ *
+ * @brief The negation filter.
+ *
+ * This filter accepts all the events rejected by its child, and
+ * rejects any events accepted by the child.
+ *
+ * <H2>Memory Management</H2>
+ * It assumes ownership of its child.
+ */
+class TAO_RTEvent_Serv_Export TAO_EC_Negation_Filter : public TAO_EC_Filter
+{
+public:
+ /// Constructor. It assumes ownership of the child.
+ TAO_EC_Negation_Filter (TAO_EC_Filter* child);
+
+ /// Destructor
+ virtual ~TAO_EC_Negation_Filter (void);
+
+
+ // = The TAO_EC_Filter methods, please check the documentation in
+ // TAO_EC_Filter.
+ virtual ChildrenIterator begin (void) const;
+ virtual ChildrenIterator end (void) const;
+ virtual int size (void) const;
+ virtual int filter (const RtecEventComm::EventSet& event,
+ TAO_EC_QOS_Info& qos_info
+ ACE_ENV_ARG_DECL);
+ virtual int filter_nocopy (RtecEventComm::EventSet& event,
+ TAO_EC_QOS_Info& qos_info
+ ACE_ENV_ARG_DECL);
+ virtual void push (const RtecEventComm::EventSet& event,
+ TAO_EC_QOS_Info& qos_info
+ ACE_ENV_ARG_DECL);
+ virtual void push_nocopy (RtecEventComm::EventSet& event,
+ TAO_EC_QOS_Info& qos_info
+ ACE_ENV_ARG_DECL);
+ virtual void clear (void);
+ virtual CORBA::ULong max_event_size (void) const;
+ virtual int can_match (const RtecEventComm::EventHeader& header) const;
+ virtual int add_dependencies (const RtecEventComm::EventHeader& header,
+ const TAO_EC_QOS_Info &qos_info
+ ACE_ENV_ARG_DECL);
+
+private:
+ TAO_EC_Negation_Filter (const TAO_EC_Negation_Filter&);
+ TAO_EC_Negation_Filter& operator= (const TAO_EC_Negation_Filter&);
+
+private:
+ /// The child
+ TAO_EC_Filter* child_;
+};
+
+TAO_END_VERSIONED_NAMESPACE_DECL
+
+#include /**/ "ace/post.h"
+#endif /* TAO_EC_NEGATION_FILTER_H */
diff --git a/TAO/orbsvcs/orbsvcs/Event/EC_Null_Factory.cpp b/TAO/orbsvcs/orbsvcs/Event/EC_Null_Factory.cpp
new file mode 100644
index 00000000000..5b829d361c6
--- /dev/null
+++ b/TAO/orbsvcs/orbsvcs/Event/EC_Null_Factory.cpp
@@ -0,0 +1,241 @@
+// $Id$
+
+#include "orbsvcs/Event/EC_Null_Factory.h"
+#include "orbsvcs/Event/EC_Reactive_Dispatching.h"
+#include "orbsvcs/Event/EC_Filter_Builder.h"
+#include "orbsvcs/Event/EC_Trivial_Supplier_Filter.h"
+#include "orbsvcs/Event/EC_ConsumerAdmin.h"
+#include "orbsvcs/Event/EC_SupplierAdmin.h"
+#include "orbsvcs/Event/EC_Default_ProxyConsumer.h"
+#include "orbsvcs/Event/EC_Default_ProxySupplier.h"
+#include "orbsvcs/Event/EC_ObserverStrategy.h"
+#include "orbsvcs/Event/EC_Null_Scheduling.h"
+#include "orbsvcs/Event/EC_Reactive_Timeout_Generator.h"
+#include "orbsvcs/Event/EC_ConsumerControl.h"
+#include "orbsvcs/Event/EC_SupplierControl.h"
+#include "orbsvcs/Event/EC_Event_Channel_Base.h" // @@ MSVC 6 bug
+#include "orbsvcs/ESF/ESF_Proxy_List.h"
+#include "orbsvcs/ESF/ESF_Immediate_Changes.h"
+
+#include "tao/ORB_Core.h"
+
+ACE_RCSID(Event, EC_Null_Factory, "$Id$")
+
+TAO_BEGIN_VERSIONED_NAMESPACE_DECL
+
+TAO_EC_Null_Factory::TAO_EC_Null_Factory (void)
+{
+}
+
+TAO_EC_Null_Factory::~TAO_EC_Null_Factory (void)
+{
+}
+
+TAO_EC_Dispatching*
+TAO_EC_Null_Factory::create_dispatching (TAO_EC_Event_Channel_Base *)
+{
+ return new TAO_EC_Reactive_Dispatching ();
+}
+
+void
+TAO_EC_Null_Factory::destroy_dispatching (TAO_EC_Dispatching *x)
+{
+ delete x;
+}
+
+TAO_EC_Filter_Builder*
+TAO_EC_Null_Factory::create_filter_builder (TAO_EC_Event_Channel_Base *)
+{
+ return new TAO_EC_Null_Filter_Builder;
+}
+
+void
+TAO_EC_Null_Factory::destroy_filter_builder (TAO_EC_Filter_Builder *x)
+{
+ delete x;
+}
+
+TAO_EC_Supplier_Filter_Builder*
+TAO_EC_Null_Factory::create_supplier_filter_builder (TAO_EC_Event_Channel_Base *ec)
+{
+ return new TAO_EC_Trivial_Supplier_Filter_Builder (ec);
+}
+
+void
+TAO_EC_Null_Factory::destroy_supplier_filter_builder (TAO_EC_Supplier_Filter_Builder *x)
+{
+ delete x;
+}
+
+TAO_EC_ConsumerAdmin*
+TAO_EC_Null_Factory::create_consumer_admin (TAO_EC_Event_Channel_Base *ec)
+{
+ return new TAO_EC_ConsumerAdmin (ec);
+}
+
+void
+TAO_EC_Null_Factory::destroy_consumer_admin (TAO_EC_ConsumerAdmin *x)
+{
+ delete x;
+}
+
+TAO_EC_SupplierAdmin*
+TAO_EC_Null_Factory::create_supplier_admin (TAO_EC_Event_Channel_Base *ec)
+{
+ return new TAO_EC_SupplierAdmin (ec);
+}
+
+void
+TAO_EC_Null_Factory::destroy_supplier_admin (TAO_EC_SupplierAdmin *x)
+{
+ delete x;
+}
+
+TAO_EC_ProxyPushSupplier*
+TAO_EC_Null_Factory::create_proxy_push_supplier (TAO_EC_Event_Channel_Base *ec)
+{
+ return new TAO_EC_Default_ProxyPushSupplier (ec, TAO_EC_DEFAULT_CONSUMER_VALIDATE_CONNECTION);
+}
+
+void
+TAO_EC_Null_Factory::destroy_proxy_push_supplier (TAO_EC_ProxyPushSupplier *x)
+{
+ delete x;
+}
+
+TAO_EC_ProxyPushConsumer*
+TAO_EC_Null_Factory::create_proxy_push_consumer (TAO_EC_Event_Channel_Base *ec)
+{
+ return new TAO_EC_Default_ProxyPushConsumer (ec);
+}
+
+void
+TAO_EC_Null_Factory::destroy_proxy_push_consumer (TAO_EC_ProxyPushConsumer *x)
+{
+ delete x;
+}
+
+TAO_EC_Timeout_Generator*
+TAO_EC_Null_Factory::create_timeout_generator (TAO_EC_Event_Channel_Base *)
+{
+ int argc = 0;
+ char **argv = 0;
+ CORBA::ORB_var orb =
+ CORBA::ORB_init (argc, argv, "");
+ ACE_Reactor *reactor = orb->orb_core ()->reactor ();
+ return new TAO_EC_Reactive_Timeout_Generator (reactor);
+}
+
+void
+TAO_EC_Null_Factory::destroy_timeout_generator (TAO_EC_Timeout_Generator *x)
+{
+ delete x;
+}
+
+TAO_EC_ObserverStrategy*
+TAO_EC_Null_Factory::create_observer_strategy (TAO_EC_Event_Channel_Base *)
+{
+ return new TAO_EC_Null_ObserverStrategy;
+}
+
+void
+TAO_EC_Null_Factory::destroy_observer_strategy (TAO_EC_ObserverStrategy *x)
+{
+ delete x;
+}
+
+TAO_EC_Scheduling_Strategy*
+TAO_EC_Null_Factory::create_scheduling_strategy (TAO_EC_Event_Channel_Base*)
+{
+ return new TAO_EC_Null_Scheduling;
+}
+
+void
+TAO_EC_Null_Factory::destroy_scheduling_strategy (TAO_EC_Scheduling_Strategy* x)
+{
+ delete x;
+}
+
+TAO_EC_ProxyPushConsumer_Collection*
+TAO_EC_Null_Factory::create_proxy_push_consumer_collection (TAO_EC_Event_Channel_Base *)
+{
+ // This typedef is a workaround for a SunCC 4.2 bug
+ typedef TAO_ESF_Proxy_List<TAO_EC_ProxyPushConsumer>::Iterator TAO_EC_Consumer_List_Iterator;
+ return new TAO_ESF_Immediate_Changes<TAO_EC_ProxyPushConsumer,
+ TAO_ESF_Proxy_List<TAO_EC_ProxyPushConsumer>,
+ TAO_EC_Consumer_List_Iterator,
+ ACE_Null_Mutex> ();
+}
+
+void
+TAO_EC_Null_Factory::destroy_proxy_push_consumer_collection (TAO_EC_ProxyPushConsumer_Collection *x)
+{
+ delete x;
+}
+
+TAO_EC_ProxyPushSupplier_Collection*
+TAO_EC_Null_Factory::create_proxy_push_supplier_collection (TAO_EC_Event_Channel_Base *)
+{
+ // This typedef is a workaround for a SunCC 4.2 bug
+ typedef TAO_ESF_Proxy_List<TAO_EC_ProxyPushSupplier>::Iterator TAO_EC_Supplier_List_Iterator;
+ return new TAO_ESF_Immediate_Changes<TAO_EC_ProxyPushSupplier,
+ TAO_ESF_Proxy_List<TAO_EC_ProxyPushSupplier>,
+ TAO_EC_Supplier_List_Iterator,
+ ACE_Null_Mutex> ();
+}
+
+void
+TAO_EC_Null_Factory::destroy_proxy_push_supplier_collection (TAO_EC_ProxyPushSupplier_Collection *x)
+{
+ delete x;
+}
+
+ACE_Lock*
+TAO_EC_Null_Factory::create_consumer_lock (void)
+{
+ return new ACE_Lock_Adapter<ACE_Null_Mutex> ();
+}
+
+void
+TAO_EC_Null_Factory::destroy_consumer_lock (ACE_Lock* x)
+{
+ delete x;
+}
+
+ACE_Lock*
+TAO_EC_Null_Factory::create_supplier_lock (void)
+{
+ return new ACE_Lock_Adapter<ACE_Null_Mutex> ();
+}
+
+void
+TAO_EC_Null_Factory::destroy_supplier_lock (ACE_Lock* x)
+{
+ delete x;
+}
+
+TAO_EC_ConsumerControl*
+TAO_EC_Null_Factory::create_consumer_control (TAO_EC_Event_Channel_Base*)
+{
+ return new TAO_EC_ConsumerControl ();
+}
+
+void
+TAO_EC_Null_Factory::destroy_consumer_control (TAO_EC_ConsumerControl* x)
+{
+ delete x;
+}
+
+TAO_EC_SupplierControl*
+TAO_EC_Null_Factory::create_supplier_control (TAO_EC_Event_Channel_Base*)
+{
+ return new TAO_EC_SupplierControl ();
+}
+
+void
+TAO_EC_Null_Factory::destroy_supplier_control (TAO_EC_SupplierControl* x)
+{
+ delete x;
+}
+
+TAO_END_VERSIONED_NAMESPACE_DECL
diff --git a/TAO/orbsvcs/orbsvcs/Event/EC_Null_Factory.h b/TAO/orbsvcs/orbsvcs/Event/EC_Null_Factory.h
new file mode 100644
index 00000000000..ca583ca5d13
--- /dev/null
+++ b/TAO/orbsvcs/orbsvcs/Event/EC_Null_Factory.h
@@ -0,0 +1,116 @@
+// -*- C++ -*-
+
+/**
+ * @file EC_Null_Factory.h
+ *
+ * $Id$
+ *
+ * @author Carlos O'Ryan (coryan@cs.wustl.edu)
+ *
+ * Based on previous work by Tim Harrison (harrison@cs.wustl.edu) and
+ * other members of the DOC group. More details can be found in:
+ *
+ * http://doc.ece.uci.edu/~coryan/EC/index.html
+ */
+
+#ifndef TAO_EC_NULL_FACTORY_H
+#define TAO_EC_NULL_FACTORY_H
+#include /**/ "ace/pre.h"
+
+#include "orbsvcs/Event/EC_Factory.h"
+
+#if !defined (ACE_LACKS_PRAGMA_ONCE)
+# pragma once
+#endif /* ACE_LACKS_PRAGMA_ONCE */
+
+TAO_BEGIN_VERSIONED_NAMESPACE_DECL
+
+/**
+ * @class TAO_EC_Null_Factory
+ *
+ * @brief The factory for a simple event channel.
+ *
+ * The simplest configuration for an event channel does no
+ * filtering and uses reactive dispatching. This class is used to
+ * configure such an event channel.
+ * A fixed POA is used for servant activation.
+ * This object creates a single instance of the Supplier
+ */
+class TAO_RTEvent_Serv_Export TAO_EC_Null_Factory : public TAO_EC_Factory
+{
+public:
+ /// Constructor
+ TAO_EC_Null_Factory (void);
+
+ /// destructor...
+ virtual ~TAO_EC_Null_Factory (void);
+
+ // = The EC_Factory methods
+ virtual TAO_EC_Dispatching*
+ create_dispatching (TAO_EC_Event_Channel_Base*);
+ virtual void
+ destroy_dispatching (TAO_EC_Dispatching*);
+ virtual TAO_EC_Filter_Builder*
+ create_filter_builder (TAO_EC_Event_Channel_Base*);
+ virtual void
+ destroy_filter_builder (TAO_EC_Filter_Builder*);
+ virtual TAO_EC_Supplier_Filter_Builder*
+ create_supplier_filter_builder (TAO_EC_Event_Channel_Base*);
+ virtual void
+ destroy_supplier_filter_builder (TAO_EC_Supplier_Filter_Builder*);
+ virtual TAO_EC_ConsumerAdmin*
+ create_consumer_admin (TAO_EC_Event_Channel_Base*);
+ virtual void
+ destroy_consumer_admin (TAO_EC_ConsumerAdmin*);
+ virtual TAO_EC_SupplierAdmin*
+ create_supplier_admin (TAO_EC_Event_Channel_Base*);
+ virtual void
+ destroy_supplier_admin (TAO_EC_SupplierAdmin*);
+ virtual TAO_EC_ProxyPushSupplier*
+ create_proxy_push_supplier (TAO_EC_Event_Channel_Base*);
+ virtual void
+ destroy_proxy_push_supplier (TAO_EC_ProxyPushSupplier*);
+ virtual TAO_EC_ProxyPushConsumer*
+ create_proxy_push_consumer (TAO_EC_Event_Channel_Base*);
+ virtual void
+ destroy_proxy_push_consumer (TAO_EC_ProxyPushConsumer*);
+ virtual TAO_EC_Timeout_Generator*
+ create_timeout_generator (TAO_EC_Event_Channel_Base*);
+ virtual void
+ destroy_timeout_generator (TAO_EC_Timeout_Generator*);
+ virtual TAO_EC_ObserverStrategy*
+ create_observer_strategy (TAO_EC_Event_Channel_Base*);
+ virtual void
+ destroy_observer_strategy (TAO_EC_ObserverStrategy*);
+ virtual TAO_EC_Scheduling_Strategy*
+ create_scheduling_strategy (TAO_EC_Event_Channel_Base*);
+ virtual void
+ destroy_scheduling_strategy (TAO_EC_Scheduling_Strategy*);
+ virtual TAO_EC_ProxyPushConsumer_Collection*
+ create_proxy_push_consumer_collection (TAO_EC_Event_Channel_Base*);
+ virtual void
+ destroy_proxy_push_consumer_collection (TAO_EC_ProxyPushConsumer_Collection*);
+ virtual TAO_EC_ProxyPushSupplier_Collection*
+ create_proxy_push_supplier_collection (TAO_EC_Event_Channel_Base*);
+ virtual void
+ destroy_proxy_push_supplier_collection (TAO_EC_ProxyPushSupplier_Collection*);
+
+ virtual ACE_Lock* create_consumer_lock (void);
+ virtual void destroy_consumer_lock (ACE_Lock*);
+ virtual ACE_Lock* create_supplier_lock (void);
+ virtual void destroy_supplier_lock (ACE_Lock*);
+
+ virtual TAO_EC_ConsumerControl*
+ create_consumer_control (TAO_EC_Event_Channel_Base*);
+ virtual void
+ destroy_consumer_control (TAO_EC_ConsumerControl*);
+ virtual TAO_EC_SupplierControl*
+ create_supplier_control (TAO_EC_Event_Channel_Base*);
+ virtual void
+ destroy_supplier_control (TAO_EC_SupplierControl*);
+};
+
+TAO_END_VERSIONED_NAMESPACE_DECL
+
+#include /**/ "ace/post.h"
+#endif /* TAO_EC_NULL_FACTORY_H */
diff --git a/TAO/orbsvcs/orbsvcs/Event/EC_Null_Scheduling.cpp b/TAO/orbsvcs/orbsvcs/Event/EC_Null_Scheduling.cpp
new file mode 100644
index 00000000000..e17a6de3910
--- /dev/null
+++ b/TAO/orbsvcs/orbsvcs/Event/EC_Null_Scheduling.cpp
@@ -0,0 +1,39 @@
+// $Id$
+
+#include "orbsvcs/Event/EC_Null_Scheduling.h"
+#include "orbsvcs/Event/EC_QOS_Info.h"
+#include "orbsvcs/Event/EC_Supplier_Filter.h"
+
+#if ! defined (__ACE_INLINE__)
+#include "orbsvcs/Event/EC_Null_Scheduling.i"
+#endif /* __ACE_INLINE__ */
+
+ACE_RCSID(Event, EC_Null_Scheduling, "$Id$")
+
+void
+TAO_EC_Null_Scheduling::add_proxy_supplier_dependencies (
+ TAO_EC_ProxyPushSupplier *,
+ TAO_EC_ProxyPushConsumer *
+ ACE_ENV_ARG_DECL_NOT_USED)
+{
+}
+
+void
+TAO_EC_Null_Scheduling::schedule_event (const RtecEventComm::EventSet &event,
+ TAO_EC_ProxyPushConsumer *,
+ TAO_EC_Supplier_Filter *filter
+ ACE_ENV_ARG_DECL)
+{
+ for (CORBA::ULong j = 0; j < event.length (); ++j)
+ {
+ const RtecEventComm::Event& e = event[j];
+ RtecEventComm::Event* buffer =
+ const_cast<RtecEventComm::Event*> (&e);
+ RtecEventComm::EventSet single_event (1, 1, buffer, 0);
+
+ TAO_EC_QOS_Info event_info;
+ filter->push_scheduled_event (single_event, event_info
+ ACE_ENV_ARG_PARAMETER);
+ ACE_CHECK;
+ }
+}
diff --git a/TAO/orbsvcs/orbsvcs/Event/EC_Null_Scheduling.h b/TAO/orbsvcs/orbsvcs/Event/EC_Null_Scheduling.h
new file mode 100644
index 00000000000..90857214aeb
--- /dev/null
+++ b/TAO/orbsvcs/orbsvcs/Event/EC_Null_Scheduling.h
@@ -0,0 +1,60 @@
+/* -*- C++ -*- */
+/**
+ * @file EC_Null_Scheduling.h
+ *
+ * $Id$
+ *
+ * @author Carlos O'Ryan (coryan@cs.wustl.edu)
+ *
+ * Based on previous work by Tim Harrison (harrison@cs.wustl.edu) and
+ * other members of the DOC group. More details can be found in:
+ *
+ * http://doc.ece.uci.edu/~coryan/EC/index.html
+ */
+
+#ifndef TAO_EC_NULL_SCHEDULING_H
+#define TAO_EC_NULL_SCHEDULING_H
+
+#include /**/ "ace/pre.h"
+
+#include "orbsvcs/Event/EC_Scheduling_Strategy.h"
+
+#if !defined (ACE_LACKS_PRAGMA_ONCE)
+# pragma once
+#endif /* ACE_LACKS_PRAGMA_ONCE */
+
+/**
+ * @class TAO_EC_Null_Scheduling
+ *
+ * @brief A scheduling strategy that separates event groups and
+ * delivers one event at a time.
+ */
+class TAO_RTEvent_Serv_Export TAO_EC_Null_Scheduling
+ : public TAO_EC_Scheduling_Strategy
+{
+public:
+ /// Constructor.
+ TAO_EC_Null_Scheduling (void);
+
+ // Read EC_Scheduling_Strategy.h for more details
+ virtual void add_proxy_supplier_dependencies (
+ TAO_EC_ProxyPushSupplier *supplier,
+ TAO_EC_ProxyPushConsumer *consumer
+ ACE_ENV_ARG_DECL);
+ virtual void schedule_event (const RtecEventComm::EventSet &event,
+ TAO_EC_ProxyPushConsumer *consumer,
+ TAO_EC_Supplier_Filter *filter
+ ACE_ENV_ARG_DECL);
+
+private:
+ TAO_EC_Null_Scheduling (const TAO_EC_Null_Scheduling&);
+ TAO_EC_Null_Scheduling& operator= (const TAO_EC_Null_Scheduling&);
+};
+
+#if defined (__ACE_INLINE__)
+#include "orbsvcs/Event/EC_Null_Scheduling.i"
+#endif /* __ACE_INLINE__ */
+
+#include /**/ "ace/post.h"
+
+#endif /* TAO_EC_NULL_SCHEDULING_H */
diff --git a/TAO/orbsvcs/orbsvcs/Event/EC_Null_Scheduling.i b/TAO/orbsvcs/orbsvcs/Event/EC_Null_Scheduling.i
new file mode 100644
index 00000000000..60c72cb9e56
--- /dev/null
+++ b/TAO/orbsvcs/orbsvcs/Event/EC_Null_Scheduling.i
@@ -0,0 +1,7 @@
+// $Id$
+
+ACE_INLINE
+TAO_EC_Null_Scheduling::TAO_EC_Null_Scheduling (void)
+{
+}
+
diff --git a/TAO/orbsvcs/orbsvcs/Event/EC_ObserverStrategy.cpp b/TAO/orbsvcs/orbsvcs/Event/EC_ObserverStrategy.cpp
new file mode 100644
index 00000000000..e5c5a9bc11d
--- /dev/null
+++ b/TAO/orbsvcs/orbsvcs/Event/EC_ObserverStrategy.cpp
@@ -0,0 +1,516 @@
+// $Id$
+
+#include "orbsvcs/Event/EC_ObserverStrategy.h"
+#include "orbsvcs/Event/EC_Event_Channel_Base.h"
+#include "orbsvcs/Event/EC_ProxySupplier.h"
+#include "orbsvcs/Event/EC_ProxyConsumer.h"
+#include "orbsvcs/Event/EC_ConsumerAdmin.h"
+#include "orbsvcs/Event/EC_SupplierAdmin.h"
+#include "orbsvcs/Event_Service_Constants.h"
+#include "ace/Auto_Ptr.h"
+
+#if ! defined (__ACE_INLINE__)
+#include "orbsvcs/Event/EC_ObserverStrategy.i"
+#endif /* __ACE_INLINE__ */
+
+ACE_RCSID(Event, EC_ObserverStrategy, "$Id$")
+
+TAO_BEGIN_VERSIONED_NAMESPACE_DECL
+
+TAO_EC_ObserverStrategy::~TAO_EC_ObserverStrategy (void)
+{
+}
+
+// ****************************************************************
+
+RtecEventChannelAdmin::Observer_Handle
+TAO_EC_Null_ObserverStrategy::append_observer (
+ RtecEventChannelAdmin::Observer_ptr
+ ACE_ENV_ARG_DECL)
+ ACE_THROW_SPEC ((
+ CORBA::SystemException,
+ RtecEventChannelAdmin::EventChannel::SYNCHRONIZATION_ERROR,
+ RtecEventChannelAdmin::EventChannel::CANT_APPEND_OBSERVER))
+{
+ ACE_THROW_RETURN (
+ RtecEventChannelAdmin::EventChannel::CANT_APPEND_OBSERVER(),
+ 0);
+}
+
+void
+TAO_EC_Null_ObserverStrategy::remove_observer (
+ RtecEventChannelAdmin::Observer_Handle
+ ACE_ENV_ARG_DECL)
+ ACE_THROW_SPEC ((
+ CORBA::SystemException,
+ RtecEventChannelAdmin::EventChannel::SYNCHRONIZATION_ERROR,
+ RtecEventChannelAdmin::EventChannel::CANT_REMOVE_OBSERVER))
+{
+ ACE_THROW (RtecEventChannelAdmin::EventChannel::CANT_REMOVE_OBSERVER());
+}
+
+void
+TAO_EC_Null_ObserverStrategy::connected (TAO_EC_ProxyPushConsumer*
+ ACE_ENV_ARG_DECL_NOT_USED)
+{
+}
+
+void
+TAO_EC_Null_ObserverStrategy::disconnected (TAO_EC_ProxyPushConsumer*
+ ACE_ENV_ARG_DECL_NOT_USED)
+{
+}
+
+void
+TAO_EC_Null_ObserverStrategy::connected (TAO_EC_ProxyPushSupplier*
+ ACE_ENV_ARG_DECL_NOT_USED)
+{
+}
+
+void
+TAO_EC_Null_ObserverStrategy::disconnected (TAO_EC_ProxyPushSupplier*
+ ACE_ENV_ARG_DECL_NOT_USED)
+{
+}
+
+// ****************************************************************
+
+TAO_EC_Basic_ObserverStrategy::~TAO_EC_Basic_ObserverStrategy (void)
+{
+ delete this->lock_;
+ this->lock_ = 0;
+}
+
+RtecEventChannelAdmin::Observer_Handle
+TAO_EC_Basic_ObserverStrategy::append_observer (
+ RtecEventChannelAdmin::Observer_ptr obs
+ ACE_ENV_ARG_DECL)
+ ACE_THROW_SPEC ((
+ CORBA::SystemException,
+ RtecEventChannelAdmin::EventChannel::SYNCHRONIZATION_ERROR,
+ RtecEventChannelAdmin::EventChannel::CANT_APPEND_OBSERVER))
+{
+ {
+ ACE_GUARD_THROW_EX (
+ ACE_Lock, ace_mon, *this->lock_,
+ RtecEventChannelAdmin::EventChannel::SYNCHRONIZATION_ERROR());
+ ACE_CHECK_RETURN (0);
+
+ this->handle_generator_++;
+ Observer_Entry entry (this->handle_generator_,
+ RtecEventChannelAdmin::Observer::_duplicate (obs));
+
+ if (this->observers_.bind (entry.handle, entry) == -1)
+ ACE_THROW_RETURN (
+ RtecEventChannelAdmin::EventChannel::CANT_APPEND_OBSERVER(),
+ 0);
+ }
+
+ RtecEventChannelAdmin::ConsumerQOS c_qos;
+ this->fill_qos (c_qos ACE_ENV_ARG_PARAMETER);
+ ACE_CHECK_RETURN (0);
+ obs->update_consumer (c_qos ACE_ENV_ARG_PARAMETER);
+ ACE_CHECK_RETURN (0);
+
+ RtecEventChannelAdmin::SupplierQOS s_qos;
+ this->fill_qos (s_qos ACE_ENV_ARG_PARAMETER);
+ ACE_CHECK_RETURN (0);
+ obs->update_supplier (s_qos ACE_ENV_ARG_PARAMETER);
+ ACE_CHECK_RETURN (0);
+
+ return this->handle_generator_;
+}
+
+
+void
+TAO_EC_Basic_ObserverStrategy::remove_observer (
+ RtecEventChannelAdmin::Observer_Handle handle
+ ACE_ENV_ARG_DECL)
+ ACE_THROW_SPEC ((
+ CORBA::SystemException,
+ RtecEventChannelAdmin::EventChannel::SYNCHRONIZATION_ERROR,
+ RtecEventChannelAdmin::EventChannel::CANT_REMOVE_OBSERVER))
+{
+ ACE_GUARD_THROW_EX (ACE_Lock, ace_mon, *this->lock_,
+ RtecEventChannelAdmin::EventChannel::SYNCHRONIZATION_ERROR());
+ ACE_CHECK;
+
+ if (this->observers_.unbind (handle) == -1)
+ ACE_THROW (
+ RtecEventChannelAdmin::EventChannel::CANT_REMOVE_OBSERVER());
+}
+
+int
+TAO_EC_Basic_ObserverStrategy::create_observer_list (
+ RtecEventChannelAdmin::Observer_var *&lst
+ ACE_ENV_ARG_DECL)
+{
+ ACE_GUARD_THROW_EX (ACE_Lock, ace_mon, *this->lock_,
+ RtecEventChannelAdmin::EventChannel::SYNCHRONIZATION_ERROR());
+ ACE_CHECK_RETURN (0);
+
+ int size = static_cast<int> (this->observers_.current_size ());
+ RtecEventChannelAdmin::Observer_var *tmp;
+ ACE_NEW_RETURN (tmp,
+ RtecEventChannelAdmin::Observer_var[size],
+ 0);
+ ACE_Auto_Basic_Array_Ptr<RtecEventChannelAdmin::Observer_var> copy (tmp);
+
+ Observer_Map_Iterator end = this->observers_.end ();
+ int j = 0;
+ for (Observer_Map_Iterator i = this->observers_.begin ();
+ i != end;
+ ++i)
+ {
+ Observer_Entry& entry = (*i).int_id_;
+ copy[j++] =
+ RtecEventChannelAdmin::Observer::_duplicate (entry.observer.in ());
+ }
+
+ lst = copy.release ();
+ return size;
+}
+
+void
+TAO_EC_Basic_ObserverStrategy::connected (
+ TAO_EC_ProxyPushConsumer *consumer
+ ACE_ENV_ARG_DECL)
+{
+ this->supplier_qos_update (consumer ACE_ENV_ARG_PARAMETER);
+ ACE_CHECK;
+}
+
+void
+TAO_EC_Basic_ObserverStrategy::disconnected (
+ TAO_EC_ProxyPushConsumer* consumer
+ ACE_ENV_ARG_DECL)
+{
+ this->supplier_qos_update (consumer ACE_ENV_ARG_PARAMETER);
+ ACE_CHECK;
+}
+
+void
+TAO_EC_Basic_ObserverStrategy::supplier_qos_update (
+ TAO_EC_ProxyPushConsumer *consumer
+ ACE_ENV_ARG_DECL)
+{
+ if (consumer->publications ().is_gateway)
+ return;
+
+ RtecEventChannelAdmin::SupplierQOS s_qos;
+ this->fill_qos (s_qos ACE_ENV_ARG_PARAMETER);
+ ACE_CHECK;
+
+ RtecEventChannelAdmin::Observer_var *tmp = 0;
+ int size = this->create_observer_list (tmp ACE_ENV_ARG_PARAMETER);
+ ACE_CHECK;
+ ACE_Auto_Basic_Array_Ptr<RtecEventChannelAdmin::Observer_var> copy (tmp);
+
+ for (int i = 0; i != size; ++i)
+ {
+ ACE_TRY
+ {
+ copy[i]->update_supplier (s_qos ACE_ENV_ARG_PARAMETER);
+ ACE_TRY_CHECK;
+ }
+ ACE_CATCHANY
+ {
+ // Ignore exceptions, we must isolate other observers from
+ // failures on this one.
+ }
+ ACE_ENDTRY;
+ }
+}
+
+void
+TAO_EC_Basic_ObserverStrategy::connected (
+ TAO_EC_ProxyPushSupplier* supplier
+ ACE_ENV_ARG_DECL)
+{
+ this->consumer_qos_update (supplier ACE_ENV_ARG_PARAMETER);
+ ACE_CHECK;
+}
+
+void
+TAO_EC_Basic_ObserverStrategy::disconnected (
+ TAO_EC_ProxyPushSupplier* supplier
+ ACE_ENV_ARG_DECL)
+{
+ this->consumer_qos_update (supplier ACE_ENV_ARG_PARAMETER);
+ ACE_CHECK;
+}
+
+void
+TAO_EC_Basic_ObserverStrategy::consumer_qos_update (
+ TAO_EC_ProxyPushSupplier *supplier
+ ACE_ENV_ARG_DECL)
+{
+ if (supplier->subscriptions ().is_gateway)
+ return;
+
+ RtecEventChannelAdmin::ConsumerQOS c_qos;
+ this->fill_qos (c_qos ACE_ENV_ARG_PARAMETER);
+ ACE_CHECK;
+
+ RtecEventChannelAdmin::Observer_var *tmp = 0;
+ int size = this->create_observer_list (tmp ACE_ENV_ARG_PARAMETER);
+ ACE_CHECK;
+ ACE_Auto_Basic_Array_Ptr<RtecEventChannelAdmin::Observer_var> copy (tmp);
+
+ for (int i = 0; i != size; ++i)
+ {
+ ACE_TRY
+ {
+ copy[i]->update_consumer (c_qos ACE_ENV_ARG_PARAMETER);
+ ACE_TRY_CHECK;
+ }
+ ACE_CATCHANY
+ {
+ // Ignore exceptions, we must isolate other observers from
+ // failures on this one.
+ }
+ ACE_ENDTRY;
+ }
+}
+
+void
+TAO_EC_Basic_ObserverStrategy::fill_qos (
+ RtecEventChannelAdmin::ConsumerQOS &qos
+ ACE_ENV_ARG_DECL)
+{
+ Headers headers;
+
+ TAO_EC_Accumulate_Supplier_Headers worker (headers);
+ this->event_channel_->for_each_consumer (&worker
+ ACE_ENV_ARG_PARAMETER);
+ ACE_CHECK;
+
+ RtecEventChannelAdmin::DependencySet& dep = qos.dependencies;
+
+ dep.length (static_cast<CORBA::ULong> (headers.current_size () + 1));
+
+ dep[0].event.header.type = ACE_ES_DISJUNCTION_DESIGNATOR;
+ dep[0].event.header.source = static_cast<CORBA::ULong> (headers.current_size ());
+ dep[0].event.header.creation_time = ORBSVCS_Time::zero ();
+ dep[0].rt_info = 0;
+
+ CORBA::ULong count = 1;
+ for (HeadersIterator i = headers.begin (); i != headers.end (); ++i)
+ {
+ dep[count++].event.header = (*i).key ();
+ }
+}
+
+void
+TAO_EC_Basic_ObserverStrategy::fill_qos (
+ RtecEventChannelAdmin::SupplierQOS &qos
+ ACE_ENV_ARG_DECL)
+{
+ Headers headers;
+
+ TAO_EC_Accumulate_Consumer_Headers worker (headers);
+ this->event_channel_->for_each_supplier (&worker
+ ACE_ENV_ARG_PARAMETER);
+ ACE_CHECK;
+
+ qos.publications.length (static_cast<CORBA::ULong> (headers.current_size ()));
+
+ CORBA::ULong count = 0;
+ for (HeadersIterator i = headers.begin (); i != headers.end (); ++i)
+ {
+ qos.publications[count++].event.header = (*i).key ();
+ }
+}
+
+
+// ****************************************************************
+
+TAO_EC_Reactive_ObserverStrategy::~TAO_EC_Reactive_ObserverStrategy (void)
+{
+}
+
+void
+TAO_EC_Reactive_ObserverStrategy::supplier_qos_update (
+ TAO_EC_ProxyPushConsumer *consumer
+ ACE_ENV_ARG_DECL)
+{
+ if (consumer->publications ().is_gateway)
+ return;
+
+ RtecEventChannelAdmin::SupplierQOS s_qos;
+ this->fill_qos (s_qos ACE_ENV_ARG_PARAMETER);
+ ACE_CHECK;
+
+ Observer_Map copy;
+ this->create_observer_map (copy ACE_ENV_ARG_PARAMETER);
+ ACE_CHECK;
+
+ Observer_Map_Iterator end = copy.end ();
+ for (Observer_Map_Iterator i = copy.begin ();
+ i != end;
+ ++i)
+ {
+ Observer_Entry& entry = (*i).int_id_;
+ ACE_TRY
+ {
+ entry.observer->update_supplier (s_qos ACE_ENV_ARG_PARAMETER);
+ ACE_TRY_CHECK;
+ }
+ ACE_CATCH (CORBA::OBJECT_NOT_EXIST, ex)
+ {
+ // Exception occured while updating observer, so remove it from the
+ // observer list
+ this->observer_not_exists (entry ACE_ENV_ARG_PARAMETER);
+ ACE_TRY_CHECK;
+ }
+ ACE_CATCH (CORBA::TRANSIENT, transient)
+ {
+ // Exception occured while updating observer, so remove it from the
+ // observer list
+ this->observer_not_exists (entry ACE_ENV_ARG_PARAMETER);
+ ACE_TRY_CHECK;
+ }
+ ACE_CATCHANY
+ {
+ // Ignore all exceptions
+ }
+ ACE_ENDTRY;
+ }
+}
+
+void
+TAO_EC_Reactive_ObserverStrategy::consumer_qos_update (
+ TAO_EC_ProxyPushSupplier *supplier
+ ACE_ENV_ARG_DECL)
+{
+ if (supplier->subscriptions ().is_gateway)
+ return;
+
+ RtecEventChannelAdmin::ConsumerQOS c_qos;
+ this->fill_qos (c_qos ACE_ENV_ARG_PARAMETER);
+ ACE_CHECK;
+
+ Observer_Map copy;
+ this->create_observer_map (copy ACE_ENV_ARG_PARAMETER);
+ ACE_CHECK;
+
+ Observer_Map_Iterator end = copy.end ();
+ for (Observer_Map_Iterator i = copy.begin ();
+ i != end;
+ ++i)
+ {
+ Observer_Entry& entry = (*i).int_id_;
+ ACE_TRY
+ {
+ entry.observer->update_consumer (c_qos ACE_ENV_ARG_PARAMETER);
+ ACE_TRY_CHECK;
+ }
+ ACE_CATCH (CORBA::OBJECT_NOT_EXIST, ex)
+ {
+ // Exception occured while updating observer, so remove it from the
+ // observer list
+ this->observer_not_exists (entry ACE_ENV_ARG_PARAMETER);
+ ACE_TRY_CHECK;
+ }
+ ACE_CATCH (CORBA::TRANSIENT, transient)
+ {
+ // Exception occured while updating observer, so remove it from the
+ // observer list
+ this->observer_not_exists (entry ACE_ENV_ARG_PARAMETER);
+ ACE_TRY_CHECK;
+ }
+ ACE_CATCHANY
+ {
+ // Ignore all exceptions
+ }
+ ACE_ENDTRY;
+ }
+}
+
+int
+TAO_EC_Reactive_ObserverStrategy::create_observer_map (Observer_Map &map
+ ACE_ENV_ARG_DECL)
+{
+ ACE_GUARD_THROW_EX (ACE_Lock, ace_mon, *this->lock_,
+ RtecEventChannelAdmin::EventChannel::SYNCHRONIZATION_ERROR());
+ ACE_CHECK_RETURN (0);
+
+ Observer_Map_Iterator end = this->observers_.end ();
+ for (Observer_Map_Iterator i = this->observers_.begin ();
+ i != end;
+ ++i)
+ {
+ Observer_Entry& entry = (*i).int_id_;
+ Observer_Entry copy (entry.handle,
+ RtecEventChannelAdmin::Observer::_duplicate (entry.observer.in ()));
+ if (map.bind (copy.handle, copy) == -1)
+ {
+ map.unbind_all();
+ return 0;
+ }
+ }
+
+ return map.current_size();
+}
+
+void
+TAO_EC_Reactive_ObserverStrategy::observer_not_exists (Observer_Entry& observer
+ ACE_ENV_ARG_DECL)
+{
+ ACE_TRY
+ {
+ this->remove_observer(observer.handle ACE_ENV_ARG_PARAMETER);
+ ACE_TRY_CHECK;
+ }
+ ACE_CATCHANY
+ {
+ // Ignore exceptions
+ }
+ ACE_ENDTRY;
+}
+
+// ****************************************************************
+
+void
+TAO_EC_Accumulate_Supplier_Headers::work (TAO_EC_ProxyPushSupplier *supplier
+ ACE_ENV_ARG_DECL_NOT_USED)
+{
+ const RtecEventChannelAdmin::ConsumerQOS& sub =
+ supplier->subscriptions ();
+ if (sub.is_gateway)
+ return;
+ for (CORBA::ULong j = 0; j < sub.dependencies.length (); ++j)
+ {
+ const RtecEventComm::Event& event =
+ sub.dependencies[j].event;
+ RtecEventComm::EventType type = event.header.type;
+
+ if (0 < type && type < ACE_ES_EVENT_UNDEFINED)
+ continue;
+ this->headers_.insert (event.header, 1);
+ }
+}
+
+// ****************************************************************
+
+void
+TAO_EC_Accumulate_Consumer_Headers::work (TAO_EC_ProxyPushConsumer *consumer
+ ACE_ENV_ARG_DECL_NOT_USED)
+{
+ const RtecEventChannelAdmin::SupplierQOS& pub =
+ consumer->publications ();
+ if (pub.is_gateway)
+ return;
+ for (CORBA::ULong j = 0; j < pub.publications.length (); ++j)
+ {
+ const RtecEventComm::Event& event =
+ pub.publications[j].event;
+ RtecEventComm::EventType type = event.header.type;
+
+ if (0 < type && type < ACE_ES_EVENT_UNDEFINED)
+ continue;
+ this->headers_.insert (event.header, 1);
+ }
+}
+
+TAO_END_VERSIONED_NAMESPACE_DECL
diff --git a/TAO/orbsvcs/orbsvcs/Event/EC_ObserverStrategy.h b/TAO/orbsvcs/orbsvcs/Event/EC_ObserverStrategy.h
new file mode 100644
index 00000000000..55b8874db7c
--- /dev/null
+++ b/TAO/orbsvcs/orbsvcs/Event/EC_ObserverStrategy.h
@@ -0,0 +1,362 @@
+// -*- C++ -*-
+
+/**
+ * @file EC_ObserverStrategy.h
+ *
+ * $Id$
+ *
+ * @author Carlos O'Ryan (coryan@cs.wustl.edu)
+ * @author Johnny Willemsen (jwillemsen@remedy.nl)
+ * @author Kees van Marle (kvmarle@remedy.nl)
+ *
+ * Based on previous work by Tim Harrison (harrison@cs.wustl.edu) and
+ * other members of the DOC group. More details can be found in:
+ *
+ * http://doc.ece.uci.edu/~coryan/EC/index.html
+ */
+
+#ifndef TAO_EC_OBSERVERSTRATEGY_H
+#define TAO_EC_OBSERVERSTRATEGY_H
+
+#include /**/ "ace/pre.h"
+
+#include "orbsvcs/ESF/ESF_Worker.h"
+
+#if !defined (ACE_LACKS_PRAGMA_ONCE)
+# pragma once
+#endif /* ACE_LACKS_PRAGMA_ONCE */
+
+#include "ace/Null_Mutex.h"
+#include "ace/RB_Tree.h"
+#include "ace/Map_Manager.h"
+
+#include "orbsvcs/RtecEventChannelAdminC.h"
+
+#include /**/ "orbsvcs/Event/event_serv_export.h"
+
+ACE_BEGIN_VERSIONED_NAMESPACE_DECL
+class ACE_Lock;
+ACE_END_VERSIONED_NAMESPACE_DECL
+
+TAO_BEGIN_VERSIONED_NAMESPACE_DECL
+
+class TAO_EC_Event_Channel_Base;
+class TAO_EC_ProxyPushConsumer;
+class TAO_EC_ProxyPushSupplier;
+
+/**
+ * @class TAO_EC_ObserverStrategy
+ *
+ * @brief The strategy to handle observers for the Event Channel subscriptions
+ * and publication.
+ *
+ * The Event Channel supports Observers for the set of subscriptions and
+ * publications. This is used to implement federations of event channels,
+ * either through UDP (multicast and unicast) and/or regular CORBA calls.
+ * This behavior of the EC is strategized to avoid overhead when no gateways
+ * are needed.
+ */
+class TAO_RTEvent_Serv_Export TAO_EC_ObserverStrategy
+{
+public:
+ /// Destructor
+ virtual ~TAO_EC_ObserverStrategy (void);
+
+ /// The basic methods to support the EC strategies.
+ virtual RtecEventChannelAdmin::Observer_Handle
+ append_observer (RtecEventChannelAdmin::Observer_ptr
+ ACE_ENV_ARG_DECL)
+ ACE_THROW_SPEC ((
+ CORBA::SystemException,
+ RtecEventChannelAdmin::EventChannel::SYNCHRONIZATION_ERROR,
+ RtecEventChannelAdmin::EventChannel::CANT_APPEND_OBSERVER))
+ = 0;
+ virtual void remove_observer (
+ RtecEventChannelAdmin::Observer_Handle
+ ACE_ENV_ARG_DECL)
+ ACE_THROW_SPEC ((
+ CORBA::SystemException,
+ RtecEventChannelAdmin::EventChannel::SYNCHRONIZATION_ERROR,
+ RtecEventChannelAdmin::EventChannel::CANT_REMOVE_OBSERVER))
+ = 0;
+
+ /// Used by the EC to inform the ObserverStrategy that a Consumer has
+ /// connected or disconnected from it.
+ virtual void connected (TAO_EC_ProxyPushConsumer*
+ ACE_ENV_ARG_DECL_NOT_USED) = 0;
+ virtual void disconnected (TAO_EC_ProxyPushConsumer*
+ ACE_ENV_ARG_DECL_NOT_USED) = 0;
+
+ /// Used by the EC to inform the ObserverStrategy that a Supplier has
+ /// connected or disconnected from it.
+ virtual void connected (TAO_EC_ProxyPushSupplier*
+ ACE_ENV_ARG_DECL_NOT_USED) = 0;
+ virtual void disconnected (TAO_EC_ProxyPushSupplier*
+ ACE_ENV_ARG_DECL_NOT_USED) = 0;
+};
+
+// ****************************************************************
+
+/**
+ * @class TAO_EC_Null_ObserverStrategy
+ *
+ * @brief A null observer strategy.
+ *
+ * This class keeps no information and simply ignores the messages
+ * from the EC.
+ */
+class TAO_RTEvent_Serv_Export TAO_EC_Null_ObserverStrategy : public TAO_EC_ObserverStrategy
+{
+public:
+ /// Constructor
+ TAO_EC_Null_ObserverStrategy (void);
+
+ // = The TAO_EC_ObserverStrategy methods.
+ virtual RtecEventChannelAdmin::Observer_Handle
+ append_observer (RtecEventChannelAdmin::Observer_ptr
+ ACE_ENV_ARG_DECL)
+ ACE_THROW_SPEC ((
+ CORBA::SystemException,
+ RtecEventChannelAdmin::EventChannel::SYNCHRONIZATION_ERROR,
+ RtecEventChannelAdmin::EventChannel::CANT_APPEND_OBSERVER));
+ virtual void remove_observer (
+ RtecEventChannelAdmin::Observer_Handle
+ ACE_ENV_ARG_DECL)
+ ACE_THROW_SPEC ((
+ CORBA::SystemException,
+ RtecEventChannelAdmin::EventChannel::SYNCHRONIZATION_ERROR,
+ RtecEventChannelAdmin::EventChannel::CANT_REMOVE_OBSERVER));
+ virtual void connected (TAO_EC_ProxyPushConsumer*
+ ACE_ENV_ARG_DECL_NOT_USED);
+ virtual void disconnected (TAO_EC_ProxyPushConsumer*
+ ACE_ENV_ARG_DECL_NOT_USED);
+ virtual void connected (TAO_EC_ProxyPushSupplier*
+ ACE_ENV_ARG_DECL_NOT_USED);
+ virtual void disconnected (TAO_EC_ProxyPushSupplier*
+ ACE_ENV_ARG_DECL_NOT_USED);
+};
+
+// ****************************************************************
+
+/**
+ * @class TAO_EC_Basic_ObserverStrategy
+ *
+ * @brief A simple observer strategy.
+ *
+ * This class simply keeps the information about the current list
+ * of observers, whenever the list of consumers and/or suppliers
+ * changes in queries the EC, computes the global subscription
+ * and/or publication list and sends the update message to all the
+ * observers.
+ *
+ * <H2>Memory Management</H2>
+ * It assumes ownership of the @a lock, but not of the
+ * Event_Channel.
+ */
+class TAO_RTEvent_Serv_Export TAO_EC_Basic_ObserverStrategy :
+ public TAO_EC_ObserverStrategy
+{
+public:
+ /// Constructor
+ TAO_EC_Basic_ObserverStrategy (TAO_EC_Event_Channel_Base* ec,
+ ACE_Lock* lock);
+
+ /// Destructor
+ virtual ~TAO_EC_Basic_ObserverStrategy (void);
+
+ // = The TAO_EC_ObserverStrategy methods.
+ virtual RtecEventChannelAdmin::Observer_Handle
+ append_observer (RtecEventChannelAdmin::Observer_ptr
+ ACE_ENV_ARG_DECL)
+ ACE_THROW_SPEC ((
+ CORBA::SystemException,
+ RtecEventChannelAdmin::EventChannel::SYNCHRONIZATION_ERROR,
+ RtecEventChannelAdmin::EventChannel::CANT_APPEND_OBSERVER));
+ virtual void remove_observer (
+ RtecEventChannelAdmin::Observer_Handle
+ ACE_ENV_ARG_DECL)
+ ACE_THROW_SPEC ((
+ CORBA::SystemException,
+ RtecEventChannelAdmin::EventChannel::SYNCHRONIZATION_ERROR,
+ RtecEventChannelAdmin::EventChannel::CANT_REMOVE_OBSERVER));
+ virtual void connected (TAO_EC_ProxyPushConsumer*
+ ACE_ENV_ARG_DECL_NOT_USED);
+ virtual void disconnected (TAO_EC_ProxyPushConsumer*
+ ACE_ENV_ARG_DECL_NOT_USED);
+ virtual void connected (TAO_EC_ProxyPushSupplier*
+ ACE_ENV_ARG_DECL_NOT_USED);
+ virtual void disconnected (TAO_EC_ProxyPushSupplier*
+ ACE_ENV_ARG_DECL_NOT_USED);
+
+ /**
+ * @struct Observer_Entry
+ *
+ * @brief The data kept for each observer.
+ *
+ * The observer and its handle are kept in a simple structure.
+ * In the future this structure could contain QoS information,
+ * such as:
+ * + how often do we update the observer?
+ * + When was the last update.
+ * + Does it want to receive all changes?
+ */
+ struct Observer_Entry
+ {
+ Observer_Entry (void);
+ Observer_Entry (RtecEventChannelAdmin::Observer_Handle h,
+ RtecEventChannelAdmin::Observer_ptr o);
+
+ /// The handle
+ RtecEventChannelAdmin::Observer_Handle handle;
+
+ /// The observer
+ RtecEventChannelAdmin::Observer_var observer;
+ };
+
+ struct Header_Compare
+ {
+ int operator () (const RtecEventComm::EventHeader& lhs,
+ const RtecEventComm::EventHeader& rhs) const;
+ };
+
+ typedef ACE_Map_Manager<RtecEventChannelAdmin::Observer_Handle,Observer_Entry,ACE_Null_Mutex> Observer_Map;
+ typedef ACE_Map_Iterator<RtecEventChannelAdmin::Observer_Handle,Observer_Entry,ACE_Null_Mutex> Observer_Map_Iterator;
+
+
+ typedef ACE_RB_Tree<RtecEventComm::EventHeader,int,Header_Compare,ACE_Null_Mutex> Headers;
+ typedef ACE_RB_Tree_Iterator<RtecEventComm::EventHeader,int,Header_Compare,ACE_Null_Mutex> HeadersIterator;
+
+protected:
+ /// Helpers.
+ //@{
+ /// Recompute EC consumer subscriptions and send them out to all observers.
+ virtual void consumer_qos_update (TAO_EC_ProxyPushSupplier *supplier
+ ACE_ENV_ARG_DECL);
+
+ /// Recompute EC supplier publications and send them out to all observers.
+ virtual void supplier_qos_update (TAO_EC_ProxyPushConsumer *consumer
+ ACE_ENV_ARG_DECL);
+
+ /// Compute consumer QOS.
+ void fill_qos (RtecEventChannelAdmin::ConsumerQOS &qos
+ ACE_ENV_ARG_DECL);
+ /// Compute supplier QOS.
+ void fill_qos (RtecEventChannelAdmin::SupplierQOS &qos
+ ACE_ENV_ARG_DECL);
+
+ /// Copies all current observers into an array and passes it
+ /// back to the caller through @a lst. Returns the size of the array.
+ int create_observer_list (RtecEventChannelAdmin::Observer_var *&lst
+ ACE_ENV_ARG_DECL);
+ //@}
+
+protected:
+ /// The event channel.
+ TAO_EC_Event_Channel_Base* event_channel_;
+
+ /// The lock
+ ACE_Lock* lock_;
+
+ /// The handles are generated in sequential order, but are opaque to
+ /// the client.
+ RtecEventChannelAdmin::Observer_Handle handle_generator_;
+
+ /// Keep the set of Observers
+ Observer_Map observers_;
+};
+
+// ****************************************************************
+
+/**
+ * @class TAO_EC_Reactive_ObserverStrategy
+ *
+ * @brief A reactive observer strategy.
+ *
+ * This class simply keeps the information about the current list
+ * of observers, whenever the list of consumers and/or suppliers
+ * changes in queries the EC, computes the global subscription
+ * and/or publication list and sends the update message to all the
+ * observers. When an observer isn't reachable it is removed from
+ * the observer list.
+ *
+ * <H2>Memory Management</H2>
+ * It assumes ownership of the <lock>, but not of the
+ * Event_Channel.
+ */
+class TAO_RTEvent_Serv_Export TAO_EC_Reactive_ObserverStrategy :
+ public TAO_EC_Basic_ObserverStrategy
+{
+public:
+ /// Constructor
+ TAO_EC_Reactive_ObserverStrategy (TAO_EC_Event_Channel_Base* ec,
+ ACE_Lock* lock);
+
+ /// Destructor
+ virtual ~TAO_EC_Reactive_ObserverStrategy (void);
+
+protected:
+ /// Helpers.
+ //@{
+ /// Recompute EC consumer subscriptions and send them out to all observers.
+ virtual void consumer_qos_update (TAO_EC_ProxyPushSupplier *supplier
+ ACE_ENV_ARG_DECL);
+
+ /// Recompute EC supplier publications and send them out to all observers.
+ virtual void supplier_qos_update (TAO_EC_ProxyPushConsumer *consumer
+ ACE_ENV_ARG_DECL);
+
+ /**
+ * Copies all current observers into a map and passes it
+ * back to the caller through @a map.
+ * @return Returns the size of the map.
+ */
+ int create_observer_map (Observer_Map &map
+ ACE_ENV_ARG_DECL);
+
+ /// The observer doesn't exist anymore
+ void observer_not_exists (Observer_Entry& observer
+ ACE_ENV_ARG_DECL);
+ //@}
+};
+
+// ****************************************************************
+
+class TAO_EC_Accumulate_Supplier_Headers :
+ public TAO_ESF_Worker<TAO_EC_ProxyPushSupplier>
+{
+public:
+ /// Constructor
+ TAO_EC_Accumulate_Supplier_Headers (TAO_EC_Basic_ObserverStrategy::Headers &headers);
+
+ virtual void work (TAO_EC_ProxyPushSupplier *supplier
+ ACE_ENV_ARG_DECL);
+
+private:
+ TAO_EC_Basic_ObserverStrategy::Headers &headers_;
+};
+
+// ****************************************************************
+
+class TAO_EC_Accumulate_Consumer_Headers :
+ public TAO_ESF_Worker<TAO_EC_ProxyPushConsumer>
+{
+public:
+ /// Constructor
+ TAO_EC_Accumulate_Consumer_Headers (TAO_EC_Basic_ObserverStrategy::Headers &headers);
+
+ virtual void work (TAO_EC_ProxyPushConsumer *consumer
+ ACE_ENV_ARG_DECL);
+
+private:
+ TAO_EC_Basic_ObserverStrategy::Headers &headers_;
+};
+
+TAO_END_VERSIONED_NAMESPACE_DECL
+
+#if defined (__ACE_INLINE__)
+#include "orbsvcs/Event/EC_ObserverStrategy.i"
+#endif /* __ACE_INLINE__ */
+
+#include /**/ "ace/post.h"
+
+#endif /* TAO_EC_OBSERVERSTRATEGY_H */
diff --git a/TAO/orbsvcs/orbsvcs/Event/EC_ObserverStrategy.i b/TAO/orbsvcs/orbsvcs/Event/EC_ObserverStrategy.i
new file mode 100644
index 00000000000..231db3f9417
--- /dev/null
+++ b/TAO/orbsvcs/orbsvcs/Event/EC_ObserverStrategy.i
@@ -0,0 +1,81 @@
+// -*- C++ -*-
+//
+// $Id$
+
+TAO_BEGIN_VERSIONED_NAMESPACE_DECL
+
+ACE_INLINE
+TAO_EC_Null_ObserverStrategy::TAO_EC_Null_ObserverStrategy (void)
+{
+}
+
+// ****************************************************************
+
+ACE_INLINE
+TAO_EC_Basic_ObserverStrategy::Observer_Entry::Observer_Entry (void)
+ : handle (0)
+{
+}
+
+ACE_INLINE
+TAO_EC_Basic_ObserverStrategy::Observer_Entry::
+ Observer_Entry (RtecEventChannelAdmin::Observer_Handle h,
+ RtecEventChannelAdmin::Observer_ptr o)
+ : handle (h),
+ observer (o)
+{
+}
+
+// ****************************************************************
+
+ACE_INLINE int
+TAO_EC_Basic_ObserverStrategy::Header_Compare::
+ operator () (const RtecEventComm::EventHeader& lhs,
+ const RtecEventComm::EventHeader& rhs) const
+{
+ if (lhs.source == rhs.source)
+ return lhs.type < rhs.type;
+ return lhs.source < rhs.source;
+}
+
+// ****************************************************************
+
+ACE_INLINE
+TAO_EC_Basic_ObserverStrategy::
+ TAO_EC_Basic_ObserverStrategy (TAO_EC_Event_Channel_Base* ec,
+ ACE_Lock* lock)
+ : event_channel_ (ec),
+ lock_ (lock),
+ handle_generator_ (1)
+{
+}
+
+// ****************************************************************
+
+ACE_INLINE
+TAO_EC_Reactive_ObserverStrategy::
+ TAO_EC_Reactive_ObserverStrategy (TAO_EC_Event_Channel_Base* ec,
+ ACE_Lock* lock)
+ : TAO_EC_Basic_ObserverStrategy (ec, lock)
+{
+}
+
+// ****************************************************************
+
+ACE_INLINE
+TAO_EC_Accumulate_Supplier_Headers::
+ TAO_EC_Accumulate_Supplier_Headers (TAO_EC_Basic_ObserverStrategy::Headers &h)
+ : headers_ (h)
+{
+}
+
+// ****************************************************************
+
+ACE_INLINE
+TAO_EC_Accumulate_Consumer_Headers::
+ TAO_EC_Accumulate_Consumer_Headers (TAO_EC_Basic_ObserverStrategy::Headers &h)
+ : headers_ (h)
+{
+}
+
+TAO_END_VERSIONED_NAMESPACE_DECL
diff --git a/TAO/orbsvcs/orbsvcs/Event/EC_Per_Supplier_Filter.cpp b/TAO/orbsvcs/orbsvcs/Event/EC_Per_Supplier_Filter.cpp
new file mode 100644
index 00000000000..fe0ed5c6cc8
--- /dev/null
+++ b/TAO/orbsvcs/orbsvcs/Event/EC_Per_Supplier_Filter.cpp
@@ -0,0 +1,213 @@
+// $Id$
+
+#include "orbsvcs/Event/EC_Per_Supplier_Filter.h"
+#include "orbsvcs/Event/EC_Event_Channel_Base.h"
+#include "orbsvcs/Event/EC_ProxySupplier.h"
+#include "orbsvcs/Event/EC_ProxyConsumer.h"
+#include "orbsvcs/Event/EC_Scheduling_Strategy.h"
+#include "orbsvcs/Event/EC_QOS_Info.h"
+
+#include "orbsvcs/ESF/ESF_Proxy_Collection.h"
+
+#include "orbsvcs/Event_Service_Constants.h"
+
+#if ! defined (__ACE_INLINE__)
+#include "orbsvcs/Event/EC_Per_Supplier_Filter.i"
+#endif /* __ACE_INLINE__ */
+
+ACE_RCSID(Event, EC_Per_Supplier_Filter, "$Id$")
+
+TAO_BEGIN_VERSIONED_NAMESPACE_DECL
+
+TAO_EC_Per_Supplier_Filter::
+ TAO_EC_Per_Supplier_Filter (TAO_EC_Event_Channel_Base* ec)
+ : event_channel_ (ec),
+ consumer_ (0),
+ refcnt_ (1)
+{
+ this->event_channel_->create_proxy_collection (this->collection_);
+}
+
+TAO_EC_Per_Supplier_Filter::~TAO_EC_Per_Supplier_Filter (void)
+{
+ this->event_channel_->destroy_proxy_collection (this->collection_);
+ this->collection_ = 0;
+}
+
+void
+TAO_EC_Per_Supplier_Filter::bind (TAO_EC_ProxyPushConsumer* consumer)
+{
+ ACE_GUARD (TAO_SYNCH_MUTEX, ace_mon, this->lock_);
+
+ if (this->consumer_ != 0)
+ return;
+
+ this->consumer_ = consumer;
+}
+
+void
+TAO_EC_Per_Supplier_Filter::unbind (TAO_EC_ProxyPushConsumer* consumer)
+{
+ ACE_GUARD (TAO_SYNCH_MUTEX, ace_mon, this->lock_);
+
+ if (this->consumer_ == 0 || this->consumer_ != consumer)
+ return;
+
+ this->consumer_ = 0;
+
+ ACE_TRY_NEW_ENV
+ {
+ this->shutdown (ACE_ENV_SINGLE_ARG_PARAMETER);
+ ACE_TRY_CHECK;
+ }
+ ACE_CATCHANY
+ {
+ // @@ Ignore exceptions
+ }
+ ACE_ENDTRY;
+}
+
+void
+TAO_EC_Per_Supplier_Filter::connected (TAO_EC_ProxyPushSupplier* supplier
+ ACE_ENV_ARG_DECL)
+{
+ ACE_GUARD (TAO_SYNCH_MUTEX, ace_mon, this->lock_);
+
+ if (this->consumer_ == 0)
+ return;
+
+ const RtecEventChannelAdmin::SupplierQOS& pub =
+ this->consumer_->publications_i ();
+
+ for (CORBA::ULong j = 0; j < pub.publications.length (); ++j)
+ {
+ const RtecEventComm::Event& event =
+ pub.publications[j].event;
+
+#if TAO_EC_ENABLE_DEBUG_MESSAGES
+ ACE_DEBUG ((LM_DEBUG, "Connecting consumer <%x> to <%x>, "
+ "trying event <%d:%d> ",
+ supplier, this,
+ event.header.source, event.header.type));
+#endif /* TAO_EC_ENABLED_DEBUG_MESSAGES */
+ if (supplier->can_match (event.header))
+ {
+#if TAO_EC_ENABLE_DEBUG_MESSAGES
+ ACE_DEBUG ((LM_DEBUG, " matched\n"));
+#endif /* TAO_EC_ENABLED_DEBUG_MESSAGES */
+ this->collection_->connected (supplier ACE_ENV_ARG_PARAMETER);
+ ACE_CHECK;
+ return;
+ }
+#if TAO_EC_ENABLE_DEBUG_MESSAGES
+ ACE_DEBUG ((LM_DEBUG, " not matched\n"));
+#endif /* TAO_EC_ENABLED_DEBUG_MESSAGES */
+ }
+}
+
+void
+TAO_EC_Per_Supplier_Filter::reconnected (TAO_EC_ProxyPushSupplier* supplier
+ ACE_ENV_ARG_DECL)
+{
+ ACE_GUARD (TAO_SYNCH_MUTEX, ace_mon, this->lock_);
+
+ if (this->consumer_ == 0)
+ return;
+
+ const RtecEventChannelAdmin::SupplierQOS& pub =
+ this->consumer_->publications_i ();
+
+ for (CORBA::ULong j = 0; j < pub.publications.length (); ++j)
+ {
+ const RtecEventComm::Event& event =
+ pub.publications[j].event;
+
+ // ACE_DEBUG ((LM_DEBUG, "Trying %d:%d in %x\n",
+ // event.header.source, event.header.type,
+ // this));
+ if (supplier->can_match (event.header))
+ {
+ // ACE_DEBUG ((LM_DEBUG, " matched %x\n", supplier));
+ this->collection_->connected (supplier ACE_ENV_ARG_PARAMETER);
+ ACE_CHECK;
+ return;
+ }
+ }
+ this->collection_->disconnected (supplier ACE_ENV_ARG_PARAMETER);
+}
+
+void
+TAO_EC_Per_Supplier_Filter::disconnected (TAO_EC_ProxyPushSupplier* supplier
+ ACE_ENV_ARG_DECL)
+{
+ this->collection_->disconnected (supplier ACE_ENV_ARG_PARAMETER);
+}
+
+void
+TAO_EC_Per_Supplier_Filter::shutdown (ACE_ENV_SINGLE_ARG_DECL)
+{
+ this->collection_->shutdown (ACE_ENV_SINGLE_ARG_PARAMETER);
+}
+
+void
+TAO_EC_Per_Supplier_Filter::push (const RtecEventComm::EventSet& event,
+ TAO_EC_ProxyPushConsumer *consumer
+ ACE_ENV_ARG_DECL)
+{
+ TAO_EC_Scheduling_Strategy* scheduling_strategy =
+ this->event_channel_->scheduling_strategy ();
+ scheduling_strategy->schedule_event (event,
+ consumer,
+ this
+ ACE_ENV_ARG_PARAMETER);
+}
+
+void
+TAO_EC_Per_Supplier_Filter::push_scheduled_event (RtecEventComm::EventSet &event,
+ const TAO_EC_QOS_Info &event_info
+ ACE_ENV_ARG_DECL)
+{
+ TAO_EC_Filter_Worker worker (event, event_info);
+ this->collection_->for_each (&worker ACE_ENV_ARG_PARAMETER);
+}
+
+CORBA::ULong
+TAO_EC_Per_Supplier_Filter::_incr_refcnt (void)
+{
+ ACE_GUARD_RETURN (TAO_SYNCH_MUTEX, ace_mon, this->lock_, 0);
+
+ this->refcnt_++;
+ return this->refcnt_;
+}
+
+CORBA::ULong
+TAO_EC_Per_Supplier_Filter::_decr_refcnt (void)
+{
+ {
+ ACE_GUARD_RETURN (TAO_SYNCH_MUTEX, ace_mon, this->lock_, 0);
+
+ this->refcnt_--;
+ if (this->refcnt_ != 0)
+ return this->refcnt_;
+ }
+ this->event_channel_->supplier_filter_builder ()->destroy (this);
+ return 0;
+}
+
+// ****************************************************************
+
+TAO_EC_Supplier_Filter*
+TAO_EC_Per_Supplier_Filter_Builder::create (
+ RtecEventChannelAdmin::SupplierQOS&)
+{
+ return new TAO_EC_Per_Supplier_Filter (this->event_channel_);
+}
+
+void
+TAO_EC_Per_Supplier_Filter_Builder::destroy (
+ TAO_EC_Supplier_Filter* x)
+{
+ delete x;
+}
+
+TAO_END_VERSIONED_NAMESPACE_DECL
diff --git a/TAO/orbsvcs/orbsvcs/Event/EC_Per_Supplier_Filter.h b/TAO/orbsvcs/orbsvcs/Event/EC_Per_Supplier_Filter.h
new file mode 100644
index 00000000000..868c15d4e00
--- /dev/null
+++ b/TAO/orbsvcs/orbsvcs/Event/EC_Per_Supplier_Filter.h
@@ -0,0 +1,122 @@
+// -*- C++ -*-
+/**
+ * @file EC_Per_Supplier_Filter.h
+ *
+ * $Id$
+ *
+ * @author Carlos O'Ryan (coryan@cs.wustl.edu)
+ *
+ * Based on previous work by Tim Harrison (harrison@cs.wustl.edu) and
+ * other members of the DOC group. More details can be found in:
+ *
+ * http://doc.ece.uci.edu/~coryan/EC/index.html
+ */
+
+#ifndef TAO_EC_PER_SUPPLIER_FILTER_H
+#define TAO_EC_PER_SUPPLIER_FILTER_H
+#include /**/ "ace/pre.h"
+
+#include "orbsvcs/Event/EC_Supplier_Filter.h"
+#include "orbsvcs/Event/EC_Supplier_Filter_Builder.h"
+#include /**/ "orbsvcs/Event/event_serv_export.h"
+
+#if !defined (ACE_LACKS_PRAGMA_ONCE)
+# pragma once
+#endif /* ACE_LACKS_PRAGMA_ONCE */
+
+TAO_BEGIN_VERSIONED_NAMESPACE_DECL
+
+template<class PROXY> class TAO_ESF_Proxy_Collection;
+class TAO_EC_Event_Channel_Base;
+
+/**
+ * @class TAO_EC_Per_Supplier_Filter
+ *
+ * @brief Filter the events on each supplier.
+ *
+ * This is a filtering strategy for the suppliers. In this
+ * particular case we keep a collection of the consumers that
+ * could potentially be interested in any event generated by a
+ * particular supplier.
+ * This minimizes the amount of consumers touched by the EC when
+ * dispatching an event.
+ */
+class TAO_RTEvent_Serv_Export TAO_EC_Per_Supplier_Filter : public TAO_EC_Supplier_Filter
+{
+public:
+ /// Constructor
+ TAO_EC_Per_Supplier_Filter (TAO_EC_Event_Channel_Base* ec);
+
+ /// Destructor
+ virtual ~TAO_EC_Per_Supplier_Filter (void);
+
+ // = The TAO_EC_Supplier_Filter methods.
+ virtual void bind (TAO_EC_ProxyPushConsumer* consumer);
+ virtual void unbind (TAO_EC_ProxyPushConsumer* consumer);
+ virtual void connected (TAO_EC_ProxyPushSupplier* supplier
+ ACE_ENV_ARG_DECL);
+ virtual void reconnected (TAO_EC_ProxyPushSupplier* supplier
+ ACE_ENV_ARG_DECL);
+ virtual void disconnected (TAO_EC_ProxyPushSupplier* supplier
+ ACE_ENV_ARG_DECL);
+ virtual void shutdown (ACE_ENV_SINGLE_ARG_DECL);
+ virtual void push (const RtecEventComm::EventSet& event,
+ TAO_EC_ProxyPushConsumer *consumer
+ ACE_ENV_ARG_DECL_NOT_USED);
+ virtual void push_scheduled_event (RtecEventComm::EventSet &event,
+ const TAO_EC_QOS_Info &event_info
+ ACE_ENV_ARG_DECL);
+ virtual CORBA::ULong _decr_refcnt (void);
+ virtual CORBA::ULong _incr_refcnt (void);
+
+private:
+ /// The event channel, used to locate the set of consumers.
+ TAO_EC_Event_Channel_Base *event_channel_;
+
+ /// The proxy for the supplier we are bound to.
+ TAO_EC_ProxyPushConsumer* consumer_;
+
+ /// Keep the collection of proxies for the consumers that may be
+ /// interested in our events.
+ TAO_ESF_Proxy_Collection<TAO_EC_ProxyPushSupplier>* collection_;
+
+ /// Reference counting
+ CORBA::ULong refcnt_;
+
+ /// Locking
+ TAO_SYNCH_MUTEX lock_;
+};
+
+// ****************************************************************
+
+/**
+ * @class TAO_EC_Per_Supplier_Filter_Builder
+ *
+ * @brief Create Per_Supplier_Filter objects
+ *
+ */
+class TAO_RTEvent_Serv_Export TAO_EC_Per_Supplier_Filter_Builder : public TAO_EC_Supplier_Filter_Builder
+{
+public:
+ /// constructor....
+ TAO_EC_Per_Supplier_Filter_Builder (TAO_EC_Event_Channel_Base* ec);
+
+ // = The TAO_EC_Supplier_Filter_Builder methods...
+ virtual TAO_EC_Supplier_Filter*
+ create (RtecEventChannelAdmin::SupplierQOS& qos);
+ virtual void
+ destroy (TAO_EC_Supplier_Filter *filter);
+
+private:
+ /// The event channel
+ TAO_EC_Event_Channel_Base* event_channel_;
+};
+
+TAO_END_VERSIONED_NAMESPACE_DECL
+
+#if defined (__ACE_INLINE__)
+#include "orbsvcs/Event/EC_Per_Supplier_Filter.i"
+#endif /* __ACE_INLINE__ */
+
+#include /**/ "ace/post.h"
+#endif /* TAO_EC_PER_SUPPLIER_FILTER_H */
diff --git a/TAO/orbsvcs/orbsvcs/Event/EC_Per_Supplier_Filter.i b/TAO/orbsvcs/orbsvcs/Event/EC_Per_Supplier_Filter.i
new file mode 100644
index 00000000000..4c950811fcc
--- /dev/null
+++ b/TAO/orbsvcs/orbsvcs/Event/EC_Per_Supplier_Filter.i
@@ -0,0 +1,14 @@
+// -*- C++ -*-
+//
+// $Id$
+
+TAO_BEGIN_VERSIONED_NAMESPACE_DECL
+
+ACE_INLINE
+TAO_EC_Per_Supplier_Filter_Builder::
+TAO_EC_Per_Supplier_Filter_Builder (TAO_EC_Event_Channel_Base* ec)
+ : event_channel_ (ec)
+{
+}
+
+TAO_END_VERSIONED_NAMESPACE_DECL
diff --git a/TAO/orbsvcs/orbsvcs/Event/EC_Prefix_Filter_Builder.cpp b/TAO/orbsvcs/orbsvcs/Event/EC_Prefix_Filter_Builder.cpp
new file mode 100644
index 00000000000..61b79c68726
--- /dev/null
+++ b/TAO/orbsvcs/orbsvcs/Event/EC_Prefix_Filter_Builder.cpp
@@ -0,0 +1,158 @@
+// $Id$
+
+#include "orbsvcs/Event_Service_Constants.h"
+#include "orbsvcs/Event/EC_Prefix_Filter_Builder.h"
+#include "orbsvcs/Event/EC_Type_Filter.h"
+#include "orbsvcs/Event/EC_Conjunction_Filter.h"
+#include "orbsvcs/Event/EC_Disjunction_Filter.h"
+#include "orbsvcs/Event/EC_And_Filter.h"
+#include "orbsvcs/Event/EC_Negation_Filter.h"
+#include "orbsvcs/Event/EC_Bitmask_Filter.h"
+#include "orbsvcs/Event/EC_Masked_Type_Filter.h"
+#include "orbsvcs/Event/EC_Timeout_Filter.h"
+
+#if ! defined (__ACE_INLINE__)
+#include "orbsvcs/Event/EC_Prefix_Filter_Builder.i"
+#endif /* __ACE_INLINE__ */
+
+ACE_RCSID(Event, EC_Prefix_Filter_Builder, "$Id$")
+
+TAO_BEGIN_VERSIONED_NAMESPACE_DECL
+
+TAO_EC_Prefix_Filter_Builder::~TAO_EC_Prefix_Filter_Builder (void)
+{
+}
+
+TAO_EC_Filter*
+TAO_EC_Prefix_Filter_Builder::build (
+ TAO_EC_ProxyPushSupplier *supplier,
+ RtecEventChannelAdmin::ConsumerQOS& qos
+ ACE_ENV_ARG_DECL_NOT_USED) const
+{
+ CORBA::ULong pos = 0;
+ return this->recursive_build (supplier, qos, pos);
+}
+
+TAO_EC_Filter*
+TAO_EC_Prefix_Filter_Builder:: recursive_build (
+ TAO_EC_ProxyPushSupplier *supplier,
+ RtecEventChannelAdmin::ConsumerQOS& qos,
+ CORBA::ULong& pos) const
+{
+ CORBA::ULong l = qos.dependencies.length ();
+ if (pos == l)
+ return 0;
+
+ const RtecEventComm::Event& e = qos.dependencies[pos].event;
+ if (e.header.type == ACE_ES_CONJUNCTION_DESIGNATOR)
+ {
+ pos++; // Consume the designator
+ CORBA::ULong n = e.header.source;
+
+ TAO_EC_Filter** children;
+ ACE_NEW_RETURN (children, TAO_EC_Filter*[n], 0);
+ CORBA::ULong i = 0;
+ for (; i != n; ++i)
+ {
+ children[i] = this->recursive_build (supplier, qos, pos);
+ }
+ return new TAO_EC_Conjunction_Filter (children, n);
+ }
+ else if (e.header.type == ACE_ES_DISJUNCTION_DESIGNATOR)
+ {
+ pos++; // Consume the designator
+ CORBA::ULong n = e.header.source;
+
+ TAO_EC_Filter** children;
+ ACE_NEW_RETURN (children, TAO_EC_Filter*[n], 0);
+ CORBA::ULong i = 0;
+ for (; i != n; ++i)
+ {
+ children[i] = this->recursive_build (supplier, qos, pos);
+ }
+ return new TAO_EC_Disjunction_Filter (children, n);
+ }
+
+ else if (e.header.type == ACE_ES_LOGICAL_AND_DESIGNATOR)
+ {
+ pos++; // Consume the designator
+ CORBA::ULong n = e.header.source;
+
+ TAO_EC_Filter** children;
+ ACE_NEW_RETURN (children, TAO_EC_Filter*[n], 0);
+ CORBA::ULong i = 0;
+ for (; i != n; ++i)
+ {
+ children[i] = this->recursive_build (supplier, qos, pos);
+ }
+ return new TAO_EC_And_Filter (children, n);
+ }
+
+ else if (e.header.type == ACE_ES_NEGATION_DESIGNATOR)
+ {
+ pos++; // Consume the designator
+
+ TAO_EC_Filter *child =
+ this->recursive_build (supplier, qos, pos);
+ return new TAO_EC_Negation_Filter (child);
+ }
+ else if (e.header.type == ACE_ES_BITMASK_DESIGNATOR)
+ {
+ pos++; // COnsumer the designator
+
+ if (pos == qos.dependencies.length ())
+ return 0;
+ CORBA::ULong source_mask = qos.dependencies[pos].event.header.source;
+ CORBA::ULong type_mask = qos.dependencies[pos].event.header.type;
+ pos++;
+
+ TAO_EC_Filter *child =
+ this->recursive_build (supplier, qos, pos);
+ return new TAO_EC_Bitmask_Filter (source_mask,
+ type_mask,
+ child);
+ }
+ else if (e.header.type == ACE_ES_MASKED_TYPE_DESIGNATOR)
+ {
+ pos++; // Consume the designator
+
+ if (pos == qos.dependencies.length ())
+ return 0;
+ CORBA::ULong source_mask = qos.dependencies[pos].event.header.source;
+ CORBA::ULong type_mask = qos.dependencies[pos].event.header.type;
+ pos++;
+
+ if (pos == qos.dependencies.length ())
+ return 0;
+ CORBA::ULong source_value = qos.dependencies[pos].event.header.source;
+ CORBA::ULong type_value = qos.dependencies[pos].event.header.type;
+ pos++;
+
+ return new TAO_EC_Masked_Type_Filter (source_mask,
+ type_mask,
+ source_value,
+ type_value);
+ }
+ else if (e.header.type == ACE_ES_NULL_DESIGNATOR)
+ {
+ pos++; // Consume the designator
+
+ return new TAO_EC_Null_Filter ();
+ }
+ else if (e.header.type == ACE_ES_EVENT_TIMEOUT
+ || e.header.type == ACE_ES_EVENT_INTERVAL_TIMEOUT
+ || e.header.type == ACE_ES_EVENT_DEADLINE_TIMEOUT)
+ {
+ pos++; // Consume the designator
+ TAO_EC_QOS_Info qos_info;
+ return new TAO_EC_Timeout_Filter (this->event_channel_,
+ supplier,
+ qos_info,
+ e.header.type,
+ e.header.creation_time);
+ }
+ pos++; // Consume the event
+ return new TAO_EC_Type_Filter (e.header);
+}
+
+TAO_END_VERSIONED_NAMESPACE_DECL
diff --git a/TAO/orbsvcs/orbsvcs/Event/EC_Prefix_Filter_Builder.h b/TAO/orbsvcs/orbsvcs/Event/EC_Prefix_Filter_Builder.h
new file mode 100644
index 00000000000..7938278e895
--- /dev/null
+++ b/TAO/orbsvcs/orbsvcs/Event/EC_Prefix_Filter_Builder.h
@@ -0,0 +1,72 @@
+/* -*- C++ -*- */
+/**
+ * @file EC_Prefix_Filter_Builder.h
+ *
+ * $Id$
+ *
+ * @author Carlos O'Ryan (coryan@cs.wustl.edu)
+ *
+ * Based on previous work by Tim Harrison (harrison@cs.wustl.edu) and
+ * other members of the DOC group. More details can be found in:
+ *
+ * http://doc.ece.uci.edu/~coryan/EC/index.html
+ */
+
+#ifndef TAO_EC_PREFIX_FILTER_BUILDER_H
+#define TAO_EC_PREFIX_FILTER_BUILDER_H
+#include /**/ "ace/pre.h"
+
+#include "orbsvcs/Event/EC_Filter_Builder.h"
+
+#if !defined (ACE_LACKS_PRAGMA_ONCE)
+# pragma once
+#endif /* ACE_LACKS_PRAGMA_ONCE */
+
+
+TAO_BEGIN_VERSIONED_NAMESPACE_DECL
+
+class TAO_EC_Filter;
+class TAO_EC_Event_Channel_Base;
+
+/**
+ * @class TAO_EC_Prefix_Filter_Builder
+ *
+ * @brief Implement a builder for the fundamental filters.
+ *
+ * The prefix filtering mechanisms in the Event channel
+ * (source/type based filtering + disjunctions and conjunctions)
+ * are constructed using this class.
+ */
+class TAO_RTEvent_Serv_Export TAO_EC_Prefix_Filter_Builder : public TAO_EC_Filter_Builder
+{
+public:
+ /// constructor.
+ TAO_EC_Prefix_Filter_Builder (TAO_EC_Event_Channel_Base* ec);
+
+ /// destructor...
+ virtual ~TAO_EC_Prefix_Filter_Builder (void);
+
+ // = The TAO_EC_Filter_Builder methods...
+ TAO_EC_Filter* build (TAO_EC_ProxyPushSupplier *supplier,
+ RtecEventChannelAdmin::ConsumerQOS& qos
+ ACE_ENV_ARG_DECL) const;
+
+private:
+ /// Recursively build the filter tree.
+ TAO_EC_Filter* recursive_build (TAO_EC_ProxyPushSupplier *supplier,
+ RtecEventChannelAdmin::ConsumerQOS& qos,
+ CORBA::ULong& pos) const;
+
+private:
+ /// The event channel.
+ TAO_EC_Event_Channel_Base* event_channel_;
+};
+
+TAO_END_VERSIONED_NAMESPACE_DECL
+
+#if defined (__ACE_INLINE__)
+#include "orbsvcs/Event/EC_Prefix_Filter_Builder.i"
+#endif /* __ACE_INLINE__ */
+
+#include /**/ "ace/post.h"
+#endif /* TAO_EC_PREFIX_FILTER_BUILDER_H */
diff --git a/TAO/orbsvcs/orbsvcs/Event/EC_Prefix_Filter_Builder.i b/TAO/orbsvcs/orbsvcs/Event/EC_Prefix_Filter_Builder.i
new file mode 100644
index 00000000000..c4ddf4074b0
--- /dev/null
+++ b/TAO/orbsvcs/orbsvcs/Event/EC_Prefix_Filter_Builder.i
@@ -0,0 +1,14 @@
+// -*- C++ -*-
+//
+// $Id$
+
+TAO_BEGIN_VERSIONED_NAMESPACE_DECL
+
+ACE_INLINE
+TAO_EC_Prefix_Filter_Builder::
+ TAO_EC_Prefix_Filter_Builder (TAO_EC_Event_Channel_Base *ec)
+ : event_channel_ (ec)
+{
+}
+
+TAO_END_VERSIONED_NAMESPACE_DECL
diff --git a/TAO/orbsvcs/orbsvcs/Event/EC_Priority_Dispatching.cpp b/TAO/orbsvcs/orbsvcs/Event/EC_Priority_Dispatching.cpp
new file mode 100644
index 00000000000..1e41905c0ca
--- /dev/null
+++ b/TAO/orbsvcs/orbsvcs/Event/EC_Priority_Dispatching.cpp
@@ -0,0 +1,141 @@
+// $Id$
+
+#include "orbsvcs/Event/EC_Priority_Dispatching.h"
+#include "orbsvcs/Event/EC_Dispatching_Task.h"
+#include "orbsvcs/Event/EC_Event_Channel_Base.h"
+#include "orbsvcs/Event/EC_QOS_Info.h"
+
+#include "orbsvcs/Event_Service_Constants.h"
+#include "orbsvcs/RtecSchedulerC.h"
+
+#include "ace/Sched_Params.h"
+
+ACE_RCSID(Event, EC_Priority_Dispatching, "$Id$")
+
+TAO_BEGIN_VERSIONED_NAMESPACE_DECL
+
+TAO_EC_Priority_Dispatching::TAO_EC_Priority_Dispatching (TAO_EC_Event_Channel_Base *ec)
+ : ntasks_ (0),
+ tasks_ (0)
+{
+ CORBA::Object_var tmp = ec->scheduler ();
+ this->scheduler_ = RtecScheduler::Scheduler::_narrow (tmp.in ());
+}
+
+void
+TAO_EC_Priority_Dispatching::activate (void)
+{
+ if (this->tasks_ != 0)
+ return;
+
+ // @@ Query the scheduler to obtain this....
+ this->ntasks_ = ACE_Scheduler_MAX_PRIORITIES;
+ ACE_NEW (this->tasks_, TAO_EC_Dispatching_Task*[this->ntasks_]);
+
+ // @@ Query the scheduler to obtain the priorities!
+ int priority =
+ (ACE_Sched_Params::priority_min (ACE_SCHED_FIFO) +
+ ACE_Sched_Params::priority_max (ACE_SCHED_FIFO)) / 2;
+ priority = ACE_Sched_Params::next_priority (ACE_SCHED_FIFO, priority);
+
+ ACE_DECLARE_NEW_CORBA_ENV;
+ for (int i = 0; i < this->ntasks_; ++i)
+ {
+ ACE_TRY
+ {
+ RtecScheduler::Period_t period =
+ ACE_CU64_TO_CU32 (ACE_Scheduler_Rates[i]);
+ char buf[128];
+ ACE_OS::sprintf (buf, "Dispatching_Task-%d.us", period);
+
+ RtecScheduler::handle_t rt_info =
+ this->scheduler_->create (buf ACE_ENV_ARG_PARAMETER);
+ ACE_TRY_CHECK;
+
+ this->scheduler_->set (rt_info,
+ RtecScheduler::VERY_LOW_CRITICALITY,
+ 0, // worst_cast_execution_time
+ 0, // typical_cast_execution_time
+ 0, // cached_cast_execution_time
+ period,
+ RtecScheduler::VERY_LOW_IMPORTANCE,
+ 0, // quantum
+ 1, // threads
+ RtecScheduler::OPERATION
+ ACE_ENV_ARG_PARAMETER);
+ ACE_TRY_CHECK;
+ }
+ ACE_CATCHANY
+ {
+ // Ignore exceptions..
+ }
+ ACE_ENDTRY;
+
+ ACE_NEW (this->tasks_[i],
+ TAO_EC_Dispatching_Task (&this->thread_manager_));
+
+ // @@ Query the scheduler to obtain the priority...
+ long flags = THR_BOUND | THR_SCHED_FIFO;
+ if (this->tasks_[i]->activate (flags, 1, 1, priority) == -1)
+ {
+ flags = THR_BOUND;
+ priority = ACE_Sched_Params::priority_min (ACE_SCHED_OTHER,
+ ACE_SCOPE_THREAD);
+ if (this->tasks_[i]->activate (flags, 1, 1, priority) == -1)
+ ACE_ERROR ((LM_ERROR,
+ "EC (%P|%t) cannot activate queue %d", i));
+ }
+ }
+}
+
+void
+TAO_EC_Priority_Dispatching::shutdown (void)
+{
+ if (this->tasks_ == 0)
+ return;
+
+ for (int i = 0; i < this->ntasks_; ++i)
+ this->tasks_[i]->putq (new TAO_EC_Shutdown_Task_Command);
+
+ this->thread_manager_.wait ();
+
+ for (int j = 0; j < this->ntasks_; ++j)
+ delete this->tasks_[j];
+
+ delete[] this->tasks_;
+ this->tasks_ = 0;
+}
+
+void
+TAO_EC_Priority_Dispatching::push (TAO_EC_ProxyPushSupplier* proxy,
+ RtecEventComm::PushConsumer_ptr consumer,
+ const RtecEventComm::EventSet& event,
+ TAO_EC_QOS_Info& qos_info
+ ACE_ENV_ARG_DECL)
+{
+ RtecEventComm::EventSet event_copy = event;
+ this->push_nocopy (proxy, consumer, event_copy, qos_info ACE_ENV_ARG_PARAMETER);
+}
+
+void
+TAO_EC_Priority_Dispatching::push_nocopy (TAO_EC_ProxyPushSupplier* proxy,
+ RtecEventComm::PushConsumer_ptr consumer,
+ RtecEventComm::EventSet& event,
+ TAO_EC_QOS_Info& qos_info
+ ACE_ENV_ARG_DECL)
+{
+ if (this->tasks_ == 0)
+ this->activate ();
+
+ int i = qos_info.preemption_priority;
+ if (i < 0 || i >= this->ntasks_)
+ {
+ // @@ Throw something?
+ i = 0;
+ }
+
+
+ this->tasks_[i]->push (proxy, consumer, event ACE_ENV_ARG_PARAMETER);
+}
+
+TAO_END_VERSIONED_NAMESPACE_DECL
diff --git a/TAO/orbsvcs/orbsvcs/Event/EC_Priority_Dispatching.h b/TAO/orbsvcs/orbsvcs/Event/EC_Priority_Dispatching.h
new file mode 100644
index 00000000000..ebbb6cd6085
--- /dev/null
+++ b/TAO/orbsvcs/orbsvcs/Event/EC_Priority_Dispatching.h
@@ -0,0 +1,90 @@
+// -*- C++ -*-
+
+/**
+ * @file EC_Priority_Dispatching.h
+ *
+ * $Id$
+ *
+ * @author Carlos O'Ryan (coryan@cs.wustl.edu)
+ *
+ * Based on previous work by Tim Harrison (harrison@cs.wustl.edu) and
+ * other members of the DOC group. More details can be found in:
+ *
+ * http://doc.ece.uci.edu/~coryan/EC/index.html
+ */
+
+#ifndef TAO_EC_PRIORITY_DISPATCHING_H
+#define TAO_EC_PRIORITY_DISPATCHING_H
+#include /**/ "ace/pre.h"
+
+#include "orbsvcs/Event/EC_Dispatching.h"
+
+#if !defined (ACE_LACKS_PRAGMA_ONCE)
+# pragma once
+#endif /* ACE_LACKS_PRAGMA_ONCE */
+
+#include "orbsvcs/RtecSchedulerC.h"
+#include "orbsvcs/Event/sched_event_export.h"
+
+#include "ace/Thread_Manager.h"
+
+TAO_BEGIN_VERSIONED_NAMESPACE_DECL
+
+class TAO_EC_Dispatching_Task;
+class TAO_EC_Event_Channel_Base;
+
+/**
+ * @class TAO_EC_Priority_Dispatching
+ *
+ * @brief Dispatching strategy that minimizes priority inversion.
+ *
+ * This strategy uses multiple queues, each serviced by a thread
+ * at different priority. This minimizes priority inversion
+ * because the consumers at higher priority are serviced before
+ * consumers at lower priority.
+ * It is more flexible than using the supplier thread to dispatch
+ * because it allows high-priority suppliers to push events to
+ * low-priority consumers (and vice-versa).
+ * It also isolates the supplier threads from the time spent on
+ * upcalls to the consumer objects, making the system easier to
+ * analyze and schedule.
+ */
+class TAO_RTSchedEvent_Export TAO_EC_Priority_Dispatching : public TAO_EC_Dispatching
+{
+public:
+ /// The scheduler is used to find the range of priorities and similar
+ /// info.
+ TAO_EC_Priority_Dispatching (TAO_EC_Event_Channel_Base* ec);
+
+ // = The EC_Dispatching methods.
+ virtual void activate (void);
+ virtual void shutdown (void);
+ virtual void push (TAO_EC_ProxyPushSupplier* proxy,
+ RtecEventComm::PushConsumer_ptr consumer,
+ const RtecEventComm::EventSet& event,
+ TAO_EC_QOS_Info& qos_info
+ ACE_ENV_ARG_DECL);
+ virtual void push_nocopy (TAO_EC_ProxyPushSupplier* proxy,
+ RtecEventComm::PushConsumer_ptr consumer,
+ RtecEventComm::EventSet& event,
+ TAO_EC_QOS_Info& qos_info
+ ACE_ENV_ARG_DECL);
+
+private:
+ /// Use our own thread manager.
+ ACE_Thread_Manager thread_manager_;
+
+ /// The number of active tasks
+ int ntasks_;
+
+ /// The tasks..
+ TAO_EC_Dispatching_Task** tasks_;
+
+ /// The scheduler
+ RtecScheduler::Scheduler_var scheduler_;
+};
+
+TAO_END_VERSIONED_NAMESPACE_DECL
+
+#include /**/ "ace/post.h"
+#endif /* TAO_EC_PRIORITY_DISPATCHING_H */
diff --git a/TAO/orbsvcs/orbsvcs/Event/EC_Priority_Scheduling.cpp b/TAO/orbsvcs/orbsvcs/Event/EC_Priority_Scheduling.cpp
new file mode 100644
index 00000000000..0bf92510d54
--- /dev/null
+++ b/TAO/orbsvcs/orbsvcs/Event/EC_Priority_Scheduling.cpp
@@ -0,0 +1,100 @@
+// $Id$
+
+#include "orbsvcs/Event/EC_Priority_Scheduling.h"
+#include "orbsvcs/Event/EC_QOS_Info.h"
+#include "orbsvcs/Event/EC_ProxyConsumer.h"
+#include "orbsvcs/Event/EC_ProxySupplier.h"
+#include "orbsvcs/Event/EC_Supplier_Filter.h"
+
+#if ! defined (__ACE_INLINE__)
+#include "orbsvcs/Event/EC_Priority_Scheduling.i"
+#endif /* __ACE_INLINE__ */
+
+ACE_RCSID(Event, EC_Priority_Scheduling, "$Id$")
+
+TAO_BEGIN_VERSIONED_NAMESPACE_DECL
+
+TAO_EC_Priority_Scheduling::~TAO_EC_Priority_Scheduling (void)
+{
+}
+
+void
+TAO_EC_Priority_Scheduling::add_proxy_supplier_dependencies (
+ TAO_EC_ProxyPushSupplier *supplier,
+ TAO_EC_ProxyPushConsumer *consumer
+ ACE_ENV_ARG_DECL)
+{
+ ACE_DEBUG ((LM_DEBUG, "add_proxy_supplier_dependencies - %x %x\n",
+ supplier, consumer));
+ const RtecEventChannelAdmin::SupplierQOS& qos =
+ consumer->publications ();
+ for (CORBA::ULong i = 0; i < qos.publications.length (); ++i)
+ {
+ const RtecEventComm::EventHeader &header =
+ qos.publications[i].event.header;
+ TAO_EC_QOS_Info qos_info;
+ qos_info.rt_info = qos.publications[i].dependency_info.rt_info;
+
+ RtecScheduler::OS_Priority os_priority;
+ RtecScheduler::Preemption_Subpriority_t p_subpriority;
+ RtecScheduler::Preemption_Priority_t p_priority;
+ this->scheduler_->priority (qos_info.rt_info,
+ os_priority,
+ p_subpriority,
+ p_priority
+ ACE_ENV_ARG_PARAMETER);
+ ACE_CHECK;
+ qos_info.preemption_priority = p_priority;
+
+ supplier->add_dependencies (header, qos_info ACE_ENV_ARG_PARAMETER);
+ ACE_CHECK;
+ }
+}
+
+void
+TAO_EC_Priority_Scheduling::schedule_event (const RtecEventComm::EventSet &event,
+ TAO_EC_ProxyPushConsumer *consumer,
+ TAO_EC_Supplier_Filter *filter
+ ACE_ENV_ARG_DECL)
+{
+ RtecEventChannelAdmin::SupplierQOS qos =
+ consumer->publications ();
+
+ for (CORBA::ULong j = 0; j != event.length (); ++j)
+ {
+ const RtecEventComm::Event& e = event[j];
+ RtecEventComm::Event* buffer =
+ const_cast<RtecEventComm::Event*> (&e);
+ RtecEventComm::EventSet single_event (1, 1, buffer, 0);
+
+ TAO_EC_QOS_Info qos_info;
+
+ for (CORBA::ULong i = 0; i != qos.publications.length (); ++i)
+ {
+ const RtecEventComm::EventHeader &qos_header =
+ qos.publications[i].event.header;
+
+ if (TAO_EC_Filter::matches (e.header, qos_header) == 0)
+ continue;
+
+ qos_info.rt_info = qos.publications[i].dependency_info.rt_info;
+
+ RtecScheduler::OS_Priority os_priority;
+ RtecScheduler::Preemption_Subpriority_t p_subpriority;
+ RtecScheduler::Preemption_Priority_t p_priority;
+ this->scheduler_->priority (qos_info.rt_info,
+ os_priority,
+ p_subpriority,
+ p_priority
+ ACE_ENV_ARG_PARAMETER);
+ ACE_CHECK;
+ qos_info.preemption_priority = p_priority;
+ }
+
+ filter->push_scheduled_event (single_event, qos_info
+ ACE_ENV_ARG_PARAMETER);
+ ACE_CHECK;
+ }
+}
+
+TAO_END_VERSIONED_NAMESPACE_DECL
diff --git a/TAO/orbsvcs/orbsvcs/Event/EC_Priority_Scheduling.h b/TAO/orbsvcs/orbsvcs/Event/EC_Priority_Scheduling.h
new file mode 100644
index 00000000000..ef5be319f06
--- /dev/null
+++ b/TAO/orbsvcs/orbsvcs/Event/EC_Priority_Scheduling.h
@@ -0,0 +1,76 @@
+// -*- C++ -*-
+
+/**
+ * @file EC_Priority_Scheduling.h
+ *
+ * $Id$
+ *
+ * @author Carlos O'Ryan (coryan@cs.wustl.edu)
+ *
+ * Based on previous work by Tim Harrison (harrison@cs.wustl.edu) and
+ * other members of the DOC group. More details can be found in:
+ *
+ * http://doc.ece.uci.edu/~coryan/EC/index.html
+ */
+
+#ifndef TAO_EC_PRIORITY_SCHEDULING_H
+#define TAO_EC_PRIORITY_SCHEDULING_H
+#include /**/ "ace/pre.h"
+
+#include "orbsvcs/Event/EC_Scheduling_Strategy.h"
+
+#if !defined (ACE_LACKS_PRAGMA_ONCE)
+# pragma once
+#endif /* ACE_LACKS_PRAGMA_ONCE */
+
+#include "orbsvcs/RtecSchedulerC.h"
+#include "orbsvcs/Event/sched_event_export.h"
+
+TAO_BEGIN_VERSIONED_NAMESPACE_DECL
+
+/**
+ * @class TAO_EC_Priority_Scheduling
+ *
+ * @brief A scheduling strategy that uses TAO's real-time scheduler
+ *
+ * This implementation of the Scheduling_Strategy uses TAO's
+ * real-time scheduler.
+ */
+class TAO_RTSchedEvent_Export TAO_EC_Priority_Scheduling : public TAO_EC_Scheduling_Strategy
+{
+public:
+ /// Constructor.
+ TAO_EC_Priority_Scheduling (RtecScheduler::Scheduler_ptr scheduler);
+
+ /// Destructor
+ virtual ~TAO_EC_Priority_Scheduling (void);
+
+ virtual void add_proxy_supplier_dependencies (
+ TAO_EC_ProxyPushSupplier *supplier,
+ TAO_EC_ProxyPushConsumer *consumer
+ ACE_ENV_ARG_DECL);
+ virtual void schedule_event (const RtecEventComm::EventSet &event,
+ TAO_EC_ProxyPushConsumer *consumer,
+ TAO_EC_Supplier_Filter *filter
+ ACE_ENV_ARG_DECL);
+
+private:
+ TAO_EC_Priority_Scheduling (const TAO_EC_Priority_Scheduling&);
+ TAO_EC_Priority_Scheduling& operator= (const TAO_EC_Priority_Scheduling&);
+
+ /// Initialize our RT_Info handle and dependencies
+ void init_rt_info (ACE_ENV_SINGLE_ARG_DECL);
+
+private:
+ /// The scheduler we are going to use
+ RtecScheduler::Scheduler_var scheduler_;
+};
+
+TAO_END_VERSIONED_NAMESPACE_DECL
+
+#if defined (__ACE_INLINE__)
+#include "orbsvcs/Event/EC_Priority_Scheduling.i"
+#endif /* __ACE_INLINE__ */
+
+#include /**/ "ace/post.h"
+#endif /* TAO_EC_PRIORITY_SCHEDULING_H */
diff --git a/TAO/orbsvcs/orbsvcs/Event/EC_Priority_Scheduling.i b/TAO/orbsvcs/orbsvcs/Event/EC_Priority_Scheduling.i
new file mode 100644
index 00000000000..2de353d965e
--- /dev/null
+++ b/TAO/orbsvcs/orbsvcs/Event/EC_Priority_Scheduling.i
@@ -0,0 +1,14 @@
+// -*- C++ -*-
+//
+// $Id$
+
+TAO_BEGIN_VERSIONED_NAMESPACE_DECL
+
+ACE_INLINE
+TAO_EC_Priority_Scheduling::TAO_EC_Priority_Scheduling (
+ RtecScheduler::Scheduler_ptr scheduler)
+ : scheduler_ (RtecScheduler::Scheduler::_duplicate (scheduler))
+{
+}
+
+TAO_END_VERSIONED_NAMESPACE_DECL
diff --git a/TAO/orbsvcs/orbsvcs/Event/EC_ProxyConsumer.cpp b/TAO/orbsvcs/orbsvcs/Event/EC_ProxyConsumer.cpp
new file mode 100644
index 00000000000..f16960141c1
--- /dev/null
+++ b/TAO/orbsvcs/orbsvcs/Event/EC_ProxyConsumer.cpp
@@ -0,0 +1,310 @@
+// $Id$
+
+#include "orbsvcs/Event/EC_ProxyConsumer.h"
+#include "orbsvcs/Event/EC_Event_Channel_Base.h"
+#include "orbsvcs/Event/EC_Supplier_Filter.h"
+#include "orbsvcs/Event/EC_Supplier_Filter_Builder.h"
+
+#include "ace/Reverse_Lock_T.h"
+
+#if ! defined (__ACE_INLINE__)
+#include "orbsvcs/Event/EC_ProxyConsumer.i"
+#endif /* __ACE_INLINE__ */
+
+ACE_RCSID (Event,
+ EC_ProxyConsumer,
+ "$Id$")
+
+TAO_BEGIN_VERSIONED_NAMESPACE_DECL
+
+typedef ACE_Reverse_Lock<ACE_Lock> TAO_EC_Unlock;
+
+TAO_EC_ProxyPushConsumer::
+ TAO_EC_ProxyPushConsumer (TAO_EC_Event_Channel_Base* ec)
+ : event_channel_ (ec),
+ refcount_ (1),
+ connected_ (0),
+ filter_ (0)
+{
+ this->lock_ =
+ this->event_channel_->create_consumer_lock ();
+
+ this->default_POA_ =
+ this->event_channel_->consumer_poa ();
+
+ this->qos_.is_gateway = 0;
+}
+
+TAO_EC_ProxyPushConsumer::~TAO_EC_ProxyPushConsumer (void)
+{
+ this->event_channel_->destroy_consumer_lock (this->lock_);
+ this->cleanup_i ();
+}
+
+
+CORBA::Boolean
+TAO_EC_ProxyPushConsumer::supplier_non_existent (
+ CORBA::Boolean_out disconnected
+ ACE_ENV_ARG_DECL)
+{
+ CORBA::Object_var supplier;
+ {
+ ACE_GUARD_THROW_EX (
+ ACE_Lock, ace_mon, *this->lock_,
+ CORBA::INTERNAL ());
+ ACE_CHECK_RETURN (0);
+
+ disconnected = 0;
+ if (this->is_connected_i () == 0)
+ {
+ disconnected = 1;
+ return 0;
+ }
+ if (CORBA::is_nil (this->supplier_.in ()))
+ {
+ return 0;
+ }
+ supplier = CORBA::Object::_duplicate (this->supplier_.in ());
+ }
+
+#if (TAO_HAS_MINIMUM_CORBA == 0)
+ return supplier->_non_existent (ACE_ENV_SINGLE_ARG_PARAMETER);
+#else
+ return 0;
+#endif /* TAO_HAS_MINIMUM_CORBA */
+}
+
+void
+TAO_EC_ProxyPushConsumer::connected (TAO_EC_ProxyPushSupplier* supplier
+ ACE_ENV_ARG_DECL)
+{
+ TAO_EC_ProxyPushConsumer_Guard ace_mon (this->lock_,
+ this->refcount_,
+ this->event_channel_,
+ this);
+ if (!ace_mon.locked ())
+ return;
+
+ ace_mon.filter->connected (supplier ACE_ENV_ARG_PARAMETER);
+}
+
+void
+TAO_EC_ProxyPushConsumer::reconnected (TAO_EC_ProxyPushSupplier* supplier
+ ACE_ENV_ARG_DECL)
+{
+ TAO_EC_ProxyPushConsumer_Guard ace_mon (this->lock_,
+ this->refcount_,
+ this->event_channel_,
+ this);
+ if (!ace_mon.locked ())
+ return;
+
+ ace_mon.filter->reconnected (supplier ACE_ENV_ARG_PARAMETER);
+}
+
+void
+TAO_EC_ProxyPushConsumer::disconnected (TAO_EC_ProxyPushSupplier* supplier
+ ACE_ENV_ARG_DECL)
+{
+ TAO_EC_ProxyPushConsumer_Guard ace_mon (this->lock_,
+ this->refcount_,
+ this->event_channel_,
+ this);
+ if (!ace_mon.locked ())
+ return;
+
+ ace_mon.filter->disconnected (supplier ACE_ENV_ARG_PARAMETER);
+}
+
+void
+TAO_EC_ProxyPushConsumer::connected (TAO_EC_ProxyPushConsumer*
+ ACE_ENV_ARG_DECL_NOT_USED)
+{
+}
+
+void
+TAO_EC_ProxyPushConsumer::reconnected (TAO_EC_ProxyPushConsumer*
+ ACE_ENV_ARG_DECL_NOT_USED)
+{
+}
+
+void
+TAO_EC_ProxyPushConsumer::disconnected (TAO_EC_ProxyPushConsumer*
+ ACE_ENV_ARG_DECL_NOT_USED)
+{
+}
+
+void
+TAO_EC_ProxyPushConsumer::shutdown_hook (ACE_ENV_SINGLE_ARG_DECL_NOT_USED)
+{
+}
+
+void
+TAO_EC_ProxyPushConsumer::shutdown (ACE_ENV_SINGLE_ARG_DECL)
+{
+ RtecEventComm::PushSupplier_var supplier;
+
+ {
+ ACE_GUARD_THROW_EX (
+ ACE_Lock, ace_mon, *this->lock_,
+ RtecEventChannelAdmin::EventChannel::SYNCHRONIZATION_ERROR ());
+ ACE_CHECK;
+
+ supplier = this->supplier_._retn ();
+ this->connected_ = 0;
+
+ this->shutdown_hook (ACE_ENV_SINGLE_ARG_PARAMETER);
+ ACE_CHECK;
+
+ if (this->filter_ != 0)
+ {
+ this->filter_->shutdown (ACE_ENV_SINGLE_ARG_PARAMETER);
+ ACE_CHECK;
+
+ this->cleanup_i ();
+ }
+ }
+
+ this->deactivate (ACE_ENV_SINGLE_ARG_PARAMETER);
+ ACE_CHECK;
+
+ if (CORBA::is_nil (supplier.in ()))
+ return;
+
+ ACE_TRY
+ {
+ supplier->disconnect_push_supplier (ACE_ENV_SINGLE_ARG_PARAMETER);
+ ACE_TRY_CHECK;
+ }
+ ACE_CATCHANY
+ {
+ // Ignore exceptions, we must isolate other clients from
+ // failures on this one.
+ }
+ ACE_ENDTRY;
+}
+
+void
+TAO_EC_ProxyPushConsumer::cleanup_i (void)
+{
+ this->supplier_ =
+ RtecEventComm::PushSupplier::_nil ();
+ this->connected_ = 0;
+
+ if (this->filter_ != 0)
+ {
+ this->filter_->unbind (this);
+ this->filter_->_decr_refcnt ();
+ this->filter_ = 0;
+ }
+}
+
+void
+TAO_EC_ProxyPushConsumer::deactivate (ACE_ENV_SINGLE_ARG_DECL)
+{
+ ACE_TRY
+ {
+ PortableServer::ObjectId id =
+ this->object_id (ACE_ENV_SINGLE_ARG_PARAMETER);
+ ACE_TRY_CHECK;
+ this->default_POA_->deactivate_object (id ACE_ENV_ARG_PARAMETER);
+ ACE_TRY_CHECK;
+ }
+ ACE_CATCHANY
+ {
+ // Exceptions here should not be propagated. They usually
+ // indicate that an object is beign disconnected twice, or some
+ // race condition, but not a fault that the user needs to know
+ // about.
+ }
+ ACE_ENDTRY;
+}
+
+CORBA::ULong
+TAO_EC_ProxyPushConsumer::_incr_refcnt (void)
+{
+ ACE_GUARD_RETURN (ACE_Lock, ace_mon, *this->lock_, 0);
+ return this->refcount_++;
+}
+
+void
+TAO_EC_ProxyPushConsumer::refcount_zero_hook (void)
+{
+ // Use the event channel
+ this->event_channel_->destroy_proxy (this);
+}
+
+CORBA::ULong
+TAO_EC_ProxyPushConsumer::_decr_refcnt (void)
+{
+ {
+ ACE_GUARD_RETURN (ACE_Lock, ace_mon, *this->lock_, 0);
+ this->refcount_--;
+ if (this->refcount_ != 0)
+ return this->refcount_;
+ }
+
+ this->refcount_zero_hook ();
+ return 0;
+}
+
+
+// ****************************************************************
+
+TAO_EC_ProxyPushConsumer_Guard::
+ TAO_EC_ProxyPushConsumer_Guard (ACE_Lock *lock,
+ CORBA::ULong &refcount,
+ TAO_EC_Event_Channel_Base *ec,
+ TAO_EC_ProxyPushConsumer *proxy)
+ : lock_ (lock),
+ refcount_ (refcount),
+ event_channel_ (ec),
+ proxy_ (proxy),
+ locked_ (0)
+{
+ ACE_Guard<ACE_Lock> ace_mon (*this->lock_);
+ // If the guard fails there is not much we can do, raising an
+ // exception is wrong, the client has *no* way to handle that kind
+ // of error. Even worse, there is no exception to raise in that
+ // case.
+ // @@ Returning something won't work either, the error should be
+ // logged though!
+
+ if (proxy->is_connected_i () == 0)
+ return;
+
+ this->filter = this->proxy_->filter_i ();
+ this->filter->_incr_refcnt ();
+
+ this->locked_ = 1;
+ this->refcount_++;
+}
+
+TAO_EC_ProxyPushConsumer_Guard::
+ ~TAO_EC_ProxyPushConsumer_Guard (void)
+{
+ // This access is safe because guard objects are created on the
+ // stack, only one thread has access to them
+ if (!this->locked_)
+ return;
+
+ {
+ ACE_Guard<ACE_Lock> ace_mon (*this->lock_);
+ // If the guard fails there is not much we can do, raising an
+ // exception is wrong, the client has *no* way to handle that kind
+ // of error. Even worse, there is no exception to raise in that
+ // case.
+ // @@ Returning something won't work either, the error should be
+ // logged though!
+
+ this->filter->_decr_refcnt ();
+
+ this->refcount_--;
+ if (this->refcount_ != 0)
+ return;
+ }
+
+ this->proxy_->refcount_zero_hook ();
+}
+
+TAO_END_VERSIONED_NAMESPACE_DECL
diff --git a/TAO/orbsvcs/orbsvcs/Event/EC_ProxyConsumer.h b/TAO/orbsvcs/orbsvcs/Event/EC_ProxyConsumer.h
new file mode 100644
index 00000000000..e70e0ee6ca2
--- /dev/null
+++ b/TAO/orbsvcs/orbsvcs/Event/EC_ProxyConsumer.h
@@ -0,0 +1,238 @@
+// -*- C++ -*-
+/**
+ * @file EC_ProxyConsumer.h
+ *
+ * $Id$
+ *
+ * @author Carlos O'Ryan (coryan@cs.wustl.edu)
+ *
+ * Based on previous work by Tim Harrison (harrison@cs.wustl.edu) and
+ * other members of the DOC group. More details can be found in:
+ *
+ * http://doc.ece.uci.edu/~coryan/EC/index.html
+ */
+
+#ifndef TAO_EC_PROXYCONSUMER_H
+#define TAO_EC_PROXYCONSUMER_H
+
+#include /**/ "ace/pre.h"
+
+#include /**/ "orbsvcs/Event/event_serv_export.h"
+
+#include "orbsvcs/RtecEventChannelAdminS.h"
+
+#if !defined (ACE_LACKS_PRAGMA_ONCE)
+# pragma once
+#endif /* ACE_LACKS_PRAGMA_ONCE */
+
+TAO_BEGIN_VERSIONED_NAMESPACE_DECL
+
+class TAO_EC_Event_Channel_Base;
+class TAO_EC_ProxyPushSupplier;
+class TAO_EC_Supplier_Filter;
+
+/**
+ * @class TAO_EC_ProxyPushConsumer
+ *
+ * @brief ProxyPushConsumer
+ *
+ * Implement the RtecEventChannelAdmin::ProxyPushConsumer interface,
+ * remember that this class is used to communicate with a
+ * PushSupplier, so, in effect, this is the ambassador for a
+ * supplier inside the event channel.
+ *
+ * <H2>Memory Management</H2>
+ * It makes a copy of the SupplierQOS and the supplier object
+ * reference.
+ * It uses bind/unbind to control the lifetime of the
+ * Supplier_Filter object.
+ * The object commits suicide when disconnect_push_consumer() is
+ * called.
+ *
+ * <H2>Locking</H2>
+ * No provisions for locking, access must be serialized
+ * externally.
+ */
+class TAO_RTEvent_Serv_Export TAO_EC_ProxyPushConsumer
+{
+public:
+ typedef RtecEventChannelAdmin::ProxyPushConsumer Interface;
+ typedef RtecEventChannelAdmin::ProxyPushConsumer_var _var_type;
+ typedef RtecEventChannelAdmin::ProxyPushConsumer_ptr _ptr_type;
+
+ /// constructor...
+ TAO_EC_ProxyPushConsumer (TAO_EC_Event_Channel_Base* event_channel);
+
+ /// destructor...
+ virtual ~TAO_EC_ProxyPushConsumer (void);
+
+ /// Activate in the POA
+ virtual void activate (
+ RtecEventChannelAdmin::ProxyPushConsumer_ptr &proxy
+ ACE_ENV_ARG_DECL)
+ ACE_THROW_SPEC ((CORBA::SystemException)) = 0;
+
+ /// Deactivate from the POA
+ virtual void deactivate (ACE_ENV_SINGLE_ARG_DECL);
+
+ /// Disconnect this from
+ virtual void disconnect_push_consumer (
+ ACE_ENV_SINGLE_ARG_DECL) = 0;
+
+ /// Return 0 if no supplier is connected...
+ CORBA::Boolean is_connected (void) const;
+
+ /// Return the consumer object reference. It returns nil() if it has
+ /// not connected yet.
+ RtecEventComm::PushSupplier_ptr supplier (void) const;
+
+ /// The QoS (subscription) used to connect to the EC.
+ const RtecEventChannelAdmin::SupplierQOS& publications (void) const;
+
+ /**
+ * Invoke the _non_existent() pseudo-operation on the supplier. If
+ * it is disconnected then it returns true and sets the
+ * <disconnected> flag.
+ */
+ CORBA::Boolean supplier_non_existent (CORBA::Boolean_out disconnected
+ ACE_ENV_ARG_DECL);
+
+ /// Concrete implementations can use this methods to keep track of
+ /// the consumers interested in this events.
+ virtual void connected (TAO_EC_ProxyPushSupplier* supplier
+ ACE_ENV_ARG_DECL);
+ virtual void reconnected (TAO_EC_ProxyPushSupplier* supplier
+ ACE_ENV_ARG_DECL);
+ virtual void disconnected (TAO_EC_ProxyPushSupplier* supplier
+ ACE_ENV_ARG_DECL);
+
+ /// Usually implemented as no-ops, but some configurations may
+ /// require this methods.
+ virtual void connected (TAO_EC_ProxyPushConsumer* consumer
+ ACE_ENV_ARG_DECL);
+ virtual void reconnected (TAO_EC_ProxyPushConsumer* consumer
+ ACE_ENV_ARG_DECL);
+ virtual void disconnected (TAO_EC_ProxyPushConsumer* consumer
+ ACE_ENV_ARG_DECL);
+
+ /// The event channel is shutting down
+ virtual void shutdown (ACE_ENV_SINGLE_ARG_DECL_NOT_USED);
+
+ /// The QoS (subscription) used to connect to the EC, assumes the
+ /// locks are held, use with care!
+ const RtecEventChannelAdmin::SupplierQOS& publications_i (void) const;
+
+ /// Increment and decrement the reference count.
+ CORBA::ULong _incr_refcnt (void);
+ CORBA::ULong _decr_refcnt (void);
+
+
+protected:
+ /// Set the supplier, used by some implementations to change the
+ /// policies used when invoking operations on the supplier.
+ void supplier (RtecEventComm::PushSupplier_ptr supplier);
+ void supplier_i (RtecEventComm::PushSupplier_ptr supplier);
+
+ friend class TAO_EC_ProxyPushConsumer_Guard;
+ // The guard needs access to the following protected methods.
+
+ /// The private version (without locking) of is_connected().
+ CORBA::Boolean is_connected_i (void) const;
+
+ /// Return the current filter, assumes the locks are held.
+ TAO_EC_Supplier_Filter *filter_i (void) const;
+
+ /// Release the filter and the supplier
+ void cleanup_i (void);
+
+ /// The supplier admin, used for activation and memory managment.
+ TAO_EC_Event_Channel_Base* event_channel_;
+
+ /// The locking strategy.
+ ACE_Lock* lock_;
+
+ /// The reference count.
+ CORBA::ULong refcount_;
+
+ /// The supplier....
+ RtecEventComm::PushSupplier_var supplier_;
+
+ /// If the flag is not zero then we are connected, notice that the
+ /// supplier can be nil.
+ int connected_;
+
+ /// The publication and QoS information...
+ RtecEventChannelAdmin::SupplierQOS qos_;
+
+ /// Store the default POA.
+ PortableServer::POA_var default_POA_;
+
+ /// The strategy to do filtering close to the supplier
+ TAO_EC_Supplier_Filter* filter_;
+
+private:
+ /// Template method hooks.
+ virtual void shutdown_hook (ACE_ENV_SINGLE_ARG_DECL);
+ virtual void refcount_zero_hook (void);
+
+ virtual PortableServer::ObjectId
+ object_id (ACE_ENV_SINGLE_ARG_DECL)
+ ACE_THROW_SPEC ((CORBA::SystemException)) = 0;
+};
+
+// ****************************************************************
+
+/**
+ * @class TAO_EC_ProxyPushConsumer_Guard
+ *
+ * @brief A Guard for the ProxyPushConsumer reference count
+ *
+ * This is a helper class used in the implementation of
+ * ProxyPushConumer. It provides a Guard mechanism to increment
+ * the reference count on the proxy and its filter, eliminating
+ * the need to hold mutexes during long operations.
+ */
+class TAO_RTEvent_Serv_Export TAO_EC_ProxyPushConsumer_Guard
+{
+public:
+ /// Constructor
+ TAO_EC_ProxyPushConsumer_Guard (ACE_Lock *lock,
+ CORBA::ULong &refcount,
+ TAO_EC_Event_Channel_Base *ec,
+ TAO_EC_ProxyPushConsumer *proxy);
+
+ /// Destructor
+ ~TAO_EC_ProxyPushConsumer_Guard (void);
+
+ /// Returns 1 if the reference count successfully acquired
+ int locked (void) const;
+
+ TAO_EC_Supplier_Filter *filter;
+
+private:
+ /// The lock used to protect the reference count
+ ACE_Lock *lock_;
+
+ /// The reference count
+ CORBA::ULong &refcount_;
+
+ /// The event channel used to destroy the proxy
+ TAO_EC_Event_Channel_Base *event_channel_;
+
+ /// The proxy whose lifetime is controlled by the reference count
+ TAO_EC_ProxyPushConsumer *proxy_;
+
+ /// This flag is set to 1 if the reference count was successfully
+ /// acquired.
+ int locked_;
+};
+
+TAO_END_VERSIONED_NAMESPACE_DECL
+
+#if defined (__ACE_INLINE__)
+#include "orbsvcs/Event/EC_ProxyConsumer.i"
+#endif /* __ACE_INLINE__ */
+
+#include /**/ "ace/post.h"
+
+#endif /* TAO_EC_PROXYCONSUMER_H */
diff --git a/TAO/orbsvcs/orbsvcs/Event/EC_ProxyConsumer.i b/TAO/orbsvcs/orbsvcs/Event/EC_ProxyConsumer.i
new file mode 100644
index 00000000000..44ef91ef2e7
--- /dev/null
+++ b/TAO/orbsvcs/orbsvcs/Event/EC_ProxyConsumer.i
@@ -0,0 +1,71 @@
+// -*- C++ -*-
+//
+// $Id$
+
+TAO_BEGIN_VERSIONED_NAMESPACE_DECL
+
+ACE_INLINE CORBA::Boolean
+TAO_EC_ProxyPushConsumer::is_connected_i (void) const
+{
+ return this->connected_;
+}
+
+ACE_INLINE CORBA::Boolean
+TAO_EC_ProxyPushConsumer::is_connected (void) const
+{
+ ACE_GUARD_RETURN (ACE_Lock, ace_mon, *this->lock_, 0);
+
+ return this->is_connected_i ();
+}
+
+ACE_INLINE RtecEventComm::PushSupplier_ptr
+TAO_EC_ProxyPushConsumer::supplier (void) const
+{
+ ACE_GUARD_RETURN (ACE_Lock, ace_mon, *this->lock_, 0);
+ return RtecEventComm::PushSupplier::_duplicate (this->supplier_.in ());
+}
+
+ACE_INLINE void
+TAO_EC_ProxyPushConsumer::supplier_i (RtecEventComm::PushSupplier_ptr supplier)
+{
+ this->supplier_ = supplier;
+}
+
+ACE_INLINE void
+TAO_EC_ProxyPushConsumer::supplier (RtecEventComm::PushSupplier_ptr supplier)
+{
+ ACE_GUARD (ACE_Lock, ace_mon, *this->lock_);
+
+ this->supplier_i (supplier);
+}
+
+ACE_INLINE const RtecEventChannelAdmin::SupplierQOS&
+TAO_EC_ProxyPushConsumer::publications (void) const
+{
+ // @@ TODO There should some way to signal errors here.
+ ACE_GUARD_RETURN (ACE_Lock, ace_mon, *this->lock_, this->qos_);
+
+ return this->qos_;
+}
+
+ACE_INLINE const RtecEventChannelAdmin::SupplierQOS&
+TAO_EC_ProxyPushConsumer::publications_i (void) const
+{
+ return this->qos_;
+}
+
+ACE_INLINE TAO_EC_Supplier_Filter *
+TAO_EC_ProxyPushConsumer::filter_i (void) const
+{
+ return this->filter_;
+}
+
+// ****************************************************************
+
+ACE_INLINE int
+TAO_EC_ProxyPushConsumer_Guard::locked (void) const
+{
+ return this->locked_;
+}
+
+TAO_END_VERSIONED_NAMESPACE_DECL
diff --git a/TAO/orbsvcs/orbsvcs/Event/EC_ProxySupplier.cpp b/TAO/orbsvcs/orbsvcs/Event/EC_ProxySupplier.cpp
new file mode 100644
index 00000000000..37204dcf67b
--- /dev/null
+++ b/TAO/orbsvcs/orbsvcs/Event/EC_ProxySupplier.cpp
@@ -0,0 +1,535 @@
+// $Id$
+
+#include "orbsvcs/Event/EC_ProxySupplier.h"
+#include "orbsvcs/Event/EC_Dispatching.h"
+#include "orbsvcs/Event/EC_Filter_Builder.h"
+#include "orbsvcs/Event/EC_QOS_Info.h"
+#include "orbsvcs/Event/EC_Event_Channel_Base.h"
+#include "orbsvcs/Event/EC_Scheduling_Strategy.h"
+#include "orbsvcs/Event/EC_ConsumerControl.h"
+#include "orbsvcs/Event/EC_SupplierAdmin.h"
+#include "orbsvcs/ESF/ESF_RefCount_Guard.h"
+#include "orbsvcs/ESF/ESF_Proxy_RefCount_Guard.h"
+
+#include "ace/Reverse_Lock_T.h"
+
+#if ! defined (__ACE_INLINE__)
+#include "orbsvcs/Event/EC_ProxySupplier.i"
+#endif /* __ACE_INLINE__ */
+
+ACE_RCSID (Event,
+ EC_ProxySupplier,
+ "$Id$")
+
+TAO_BEGIN_VERSIONED_NAMESPACE_DECL
+
+typedef ACE_Reverse_Lock<ACE_Lock> TAO_EC_Unlock;
+
+TAO_EC_ProxyPushSupplier::TAO_EC_ProxyPushSupplier (TAO_EC_Event_Channel_Base* ec, int validate_connection)
+ : event_channel_ (ec),
+ refcount_ (1),
+ suspended_ (0),
+ child_ (0),
+ consumer_validate_connection_(validate_connection)
+{
+ this->lock_ =
+ this->event_channel_->create_supplier_lock ();
+
+ this->default_POA_ =
+ this->event_channel_->supplier_poa ();
+}
+
+TAO_EC_ProxyPushSupplier::~TAO_EC_ProxyPushSupplier (void)
+{
+ this->event_channel_->destroy_supplier_lock (this->lock_);
+ this->cleanup_i ();
+}
+
+void
+TAO_EC_ProxyPushSupplier::connected (TAO_EC_ProxyPushConsumer* consumer
+ ACE_ENV_ARG_DECL)
+{
+ TAO_EC_Scheduling_Strategy *s =
+ this->event_channel_->scheduling_strategy ();
+
+ s->add_proxy_supplier_dependencies (this,
+ consumer
+ ACE_ENV_ARG_PARAMETER);
+}
+
+void
+TAO_EC_ProxyPushSupplier::reconnected (TAO_EC_ProxyPushConsumer* consumer
+ ACE_ENV_ARG_DECL)
+{
+ TAO_EC_Scheduling_Strategy *s =
+ this->event_channel_->scheduling_strategy ();
+
+ s->add_proxy_supplier_dependencies (this,
+ consumer
+ ACE_ENV_ARG_PARAMETER);
+}
+
+void
+TAO_EC_ProxyPushSupplier::disconnected (TAO_EC_ProxyPushConsumer*
+ ACE_ENV_ARG_DECL_NOT_USED)
+{
+}
+
+void
+TAO_EC_ProxyPushSupplier::connected (TAO_EC_ProxyPushSupplier*
+ ACE_ENV_ARG_DECL_NOT_USED)
+{
+}
+
+void
+TAO_EC_ProxyPushSupplier::reconnected (TAO_EC_ProxyPushSupplier*
+ ACE_ENV_ARG_DECL_NOT_USED)
+{
+}
+
+void
+TAO_EC_ProxyPushSupplier::disconnected (TAO_EC_ProxyPushSupplier*
+ ACE_ENV_ARG_DECL_NOT_USED)
+{
+}
+
+void
+TAO_EC_ProxyPushSupplier::shutdown (ACE_ENV_SINGLE_ARG_DECL)
+{
+ // Save the consumer we where connected to, we need to send a
+ // disconnect message to it.
+ RtecEventComm::PushConsumer_var consumer;
+
+ {
+ ACE_GUARD_THROW_EX (
+ ACE_Lock, ace_mon, *this->lock_,
+ RtecEventChannelAdmin::EventChannel::SYNCHRONIZATION_ERROR ());
+ ACE_CHECK;
+
+ int connected = this->is_connected_i ();
+
+ consumer = this->consumer_._retn ();
+
+ if (connected)
+ this->cleanup_i ();
+ }
+
+ this->deactivate (ACE_ENV_SINGLE_ARG_PARAMETER);
+ ACE_CHECK;
+
+ if (CORBA::is_nil (consumer.in ()))
+ return;
+
+ ACE_TRY
+ {
+ consumer->disconnect_push_consumer (ACE_ENV_SINGLE_ARG_PARAMETER);
+ ACE_TRY_CHECK;
+ }
+ ACE_CATCHANY
+ {
+ // Ignore exceptions, we must isolate other clients from
+ // problems on this one.
+ }
+ ACE_ENDTRY;
+}
+
+void
+TAO_EC_ProxyPushSupplier::cleanup_i (void)
+{
+ this->consumer_ =
+ RtecEventComm::PushConsumer::_nil ();
+
+ // @@ Why don't we have a destroy() method in the
+ // filter_builder?
+ delete this->child_;
+ this->child_ = 0;
+}
+
+void
+TAO_EC_ProxyPushSupplier::deactivate (ACE_ENV_SINGLE_ARG_DECL) ACE_THROW_SPEC (())
+{
+ ACE_TRY
+ {
+ PortableServer::ObjectId id =
+ this->object_id (ACE_ENV_SINGLE_ARG_PARAMETER);
+ ACE_TRY_CHECK;
+ this->default_POA_->deactivate_object (id ACE_ENV_ARG_PARAMETER);
+ ACE_TRY_CHECK;
+ }
+ ACE_CATCHANY
+ {
+ // Exceptions here should not be propagated. They usually
+ // indicate that an object is beign disconnected twice, or some
+ // race condition, but not a fault that the user needs to know
+ // about.
+ }
+ ACE_ENDTRY;
+}
+
+CORBA::ULong
+TAO_EC_ProxyPushSupplier::_incr_refcnt (void)
+{
+ ACE_GUARD_RETURN (ACE_Lock, ace_mon, *this->lock_, 0);
+ return this->refcount_++;
+}
+
+void
+TAO_EC_ProxyPushSupplier::refcount_zero_hook (void)
+{
+ // Use the event channel
+ this->event_channel_->destroy_proxy (this);
+}
+
+CORBA::ULong
+TAO_EC_ProxyPushSupplier::_decr_refcnt (void)
+{
+ {
+ ACE_GUARD_RETURN (ACE_Lock, ace_mon, *this->lock_, 0);
+ this->refcount_--;
+ if (this->refcount_ != 0)
+ return this->refcount_;
+ }
+
+ this->refcount_zero_hook ();
+ return 0;
+}
+
+typedef TAO_ESF_Proxy_RefCount_Guard<TAO_EC_Event_Channel_Base,TAO_EC_ProxyPushSupplier> Destroy_Guard;
+
+int
+TAO_EC_ProxyPushSupplier::filter (const RtecEventComm::EventSet& event,
+ TAO_EC_QOS_Info& qos_info
+ ACE_ENV_ARG_DECL)
+{
+ Destroy_Guard auto_destroy (this->refcount_,
+ this->event_channel_,
+ this);
+
+ int result = 0;
+ {
+ ACE_GUARD_THROW_EX (
+ ACE_Lock, ace_mon, *this->lock_,
+ RtecEventChannelAdmin::EventChannel::SYNCHRONIZATION_ERROR ());
+ ACE_CHECK_RETURN (0);
+
+ if (this->is_connected_i () == 0)
+ return 0;
+
+ result =
+ this->child_->filter (event, qos_info ACE_ENV_ARG_PARAMETER);
+ ACE_CHECK_RETURN (0);
+ }
+ return result;
+}
+
+int
+TAO_EC_ProxyPushSupplier::filter_nocopy (RtecEventComm::EventSet& event,
+ TAO_EC_QOS_Info& qos_info
+ ACE_ENV_ARG_DECL)
+{
+ Destroy_Guard auto_destroy (this->refcount_,
+ this->event_channel_,
+ this);
+
+ int result = 0;
+ {
+ ACE_GUARD_THROW_EX (
+ ACE_Lock, ace_mon, *this->lock_,
+ RtecEventChannelAdmin::EventChannel::SYNCHRONIZATION_ERROR ());
+ ACE_CHECK_RETURN (0);
+
+ if (this->is_connected_i () == 0)
+ return 0;
+
+ result =
+ this->child_->filter_nocopy (event, qos_info ACE_ENV_ARG_PARAMETER);
+ ACE_CHECK_RETURN (0);
+ }
+ return result;
+}
+
+void
+TAO_EC_ProxyPushSupplier::push (const RtecEventComm::EventSet& event,
+ TAO_EC_QOS_Info& qos_info
+ ACE_ENV_ARG_DECL)
+{
+ // The mutex is already held by the caller (usually the filter()
+ // method)
+ if (this->is_connected_i () == 0)
+ return; // TAO_THROW (RtecEventComm::Disconnected ());????
+
+ if (this->suspended_ != 0)
+ return;
+
+ TAO_ESF_RefCount_Guard<CORBA::ULong> ace_mon (this->refcount_);
+ // The guard will decrement the reference count, notice that the
+ // reference count can become 0, but this is not the right spot to
+ // check for that and destroy the object.
+ // If we did so then we would destroy the object, and consequently
+ // the mutex, but the mutex is used later when the stack unwinds and
+ // the filter() method tries to destroy the mutex (that originally
+ // acquired the mutex in the first place).
+ // So the correct thing to do is to just decrement the reference
+ // count and let the filter() method do the destruction.
+
+ RtecEventComm::PushConsumer_var consumer =
+ RtecEventComm::PushConsumer::_duplicate (this->consumer_.in ());
+
+ this->pre_dispatch_hook (const_cast<RtecEventComm::EventSet&> (event)
+ ACE_ENV_ARG_PARAMETER);
+ ACE_CHECK;
+
+ {
+ // We have to release the lock to avoid dead-locks.
+ TAO_EC_Unlock reverse_lock (*this->lock_);
+
+ ACE_GUARD_THROW_EX (TAO_EC_Unlock, ace_mon, reverse_lock,
+ RtecEventChannelAdmin::EventChannel::SYNCHRONIZATION_ERROR ());
+ ACE_CHECK;
+
+ this->event_channel_->dispatching ()->push (this,
+ consumer.in (),
+ event,
+ qos_info
+ ACE_ENV_ARG_PARAMETER);
+ ACE_CHECK;
+ }
+
+ if (this->child_ != 0)
+ this->child_->clear ();
+}
+
+void
+TAO_EC_ProxyPushSupplier::pre_dispatch_hook (RtecEventComm::EventSet&
+ ACE_ENV_ARG_DECL_NOT_USED)
+{
+}
+
+void
+TAO_EC_ProxyPushSupplier::push_nocopy (RtecEventComm::EventSet& event,
+ TAO_EC_QOS_Info& qos_info
+ ACE_ENV_ARG_DECL)
+{
+ // The mutex is already held by the caller (usually the filter()
+ // method)
+ if (this->is_connected_i () == 0)
+ return; // TAO_THROW (RtecEventComm::Disconnected ());????
+
+ if (this->suspended_ != 0)
+ return;
+
+ TAO_ESF_RefCount_Guard<CORBA::ULong> ace_mon (this->refcount_);
+ // The guard will decrement the reference count, notice that the
+ // reference count can become 0, but this is not the right spot to
+ // check for that and destroy the object.
+ // If we did so then we would destroy the object, and consequently
+ // the mutex, but the mutex is used later when the stack unwinds and
+ // the filter() method tries to destroy the mutex (that originally
+ // acquired the mutex in the first place).
+ // So the correct thing to do is to just decrement the reference
+ // count and let the filter() method do the destruction.
+
+ RtecEventComm::PushConsumer_var consumer =
+ RtecEventComm::PushConsumer::_duplicate (this->consumer_.in ());
+
+ this->pre_dispatch_hook (event ACE_ENV_ARG_PARAMETER);
+ ACE_CHECK;
+
+ {
+ TAO_EC_Unlock reverse_lock (*this->lock_);
+
+ ACE_GUARD_THROW_EX (TAO_EC_Unlock, ace_mon, reverse_lock,
+ RtecEventChannelAdmin::EventChannel::SYNCHRONIZATION_ERROR ());
+ ACE_CHECK;
+
+ this->event_channel_->dispatching ()->push_nocopy (this,
+ consumer.in (),
+ event,
+ qos_info
+ ACE_ENV_ARG_PARAMETER);
+ ACE_CHECK;
+ }
+
+ if (this->child_ != 0)
+ this->child_->clear ();
+}
+
+void
+TAO_EC_ProxyPushSupplier::push_to_consumer (
+ RtecEventComm::PushConsumer_ptr consumer,
+ const RtecEventComm::EventSet& event
+ ACE_ENV_ARG_DECL)
+{
+ {
+ ACE_GUARD_THROW_EX (
+ ACE_Lock, ace_mon, *this->lock_,
+ RtecEventChannelAdmin::EventChannel::SYNCHRONIZATION_ERROR ());
+ ACE_CHECK;
+
+ if (this->is_connected_i () == 0)
+ return; // ACE_THROW (RtecEventComm::Disconnected ());????
+
+ if (this->suspended_ != 0)
+ return;
+ }
+
+ ACE_TRY
+ {
+ consumer->push (event ACE_ENV_ARG_PARAMETER);
+ ACE_TRY_CHECK;
+ }
+ ACE_CATCH (CORBA::OBJECT_NOT_EXIST, not_used)
+ {
+ // Do not report errors for old consumers
+ // NOTE: The comparison below is not completely correct, it
+ // could be that the remote consumer and the local consumer are
+ // in fact the same object, but represented by different objects
+ // references. Unfortunately this is not a good spot to invoke
+ // _is_equivalent(), and that may not give us the desired answer
+ // anyway.
+ if (consumer == this->consumer_.in ())
+ {
+ TAO_EC_ConsumerControl *control =
+ this->event_channel_->consumer_control ();
+
+ control->consumer_not_exist (this ACE_ENV_ARG_PARAMETER);
+ ACE_TRY_CHECK;
+ }
+ }
+ ACE_CATCH (CORBA::SystemException, sysex)
+ {
+ // Do not report errors for old consumers
+ // NOTE: The comparison below is not completely correct, it
+ // could be that the remote consumer and the local consumer are
+ // in fact the same object, but represented by different objects
+ // references. Unfortunately this is not a good spot to invoke
+ // _is_equivalent(), and that may not give us the desired answer
+ // anyway.
+ if (consumer == this->consumer_.in ())
+ {
+ TAO_EC_ConsumerControl *control =
+ this->event_channel_->consumer_control ();
+
+ control->system_exception (this,
+ sysex
+ ACE_ENV_ARG_PARAMETER);
+ ACE_TRY_CHECK;
+ }
+ }
+ ACE_CATCHANY
+ {
+ // Shouldn't happen, but does not hurt
+ }
+ ACE_ENDTRY;
+}
+
+void
+TAO_EC_ProxyPushSupplier::reactive_push_to_consumer (
+ RtecEventComm::PushConsumer_ptr consumer,
+ const RtecEventComm::EventSet& event
+ ACE_ENV_ARG_DECL)
+{
+ ACE_TRY
+ {
+ consumer->push (event ACE_ENV_ARG_PARAMETER);
+ ACE_TRY_CHECK;
+ }
+ ACE_CATCH (CORBA::OBJECT_NOT_EXIST, not_used)
+ {
+ TAO_EC_ConsumerControl *control =
+ this->event_channel_->consumer_control ();
+
+ control->consumer_not_exist (this ACE_ENV_ARG_PARAMETER);
+ ACE_CHECK;
+ }
+ ACE_CATCH (CORBA::SystemException, sysex)
+ {
+ TAO_EC_ConsumerControl *control =
+ this->event_channel_->consumer_control ();
+
+ control->system_exception (this,
+ sysex
+ ACE_ENV_ARG_PARAMETER);
+ ACE_CHECK;
+ }
+ ACE_CATCHANY
+ {
+ // Shouldn't happen
+ }
+ ACE_ENDTRY;
+}
+
+CORBA::Boolean
+TAO_EC_ProxyPushSupplier::consumer_non_existent (
+ CORBA::Boolean_out disconnected
+ ACE_ENV_ARG_DECL)
+{
+ CORBA::Object_var consumer;
+ {
+ ACE_GUARD_THROW_EX (
+ ACE_Lock, ace_mon, *this->lock_,
+ CORBA::INTERNAL ());
+ ACE_CHECK_RETURN (0);
+
+ disconnected = 0;
+ if (this->is_connected_i () == 0)
+ {
+ disconnected = 1;
+ return 0;
+ }
+
+ consumer = CORBA::Object::_duplicate (this->consumer_.in ());
+ }
+
+#if (TAO_HAS_MINIMUM_CORBA == 0)
+ return consumer->_non_existent (ACE_ENV_SINGLE_ARG_PARAMETER);
+#else
+ return 0;
+#endif /* TAO_HAS_MINIMUM_CORBA */
+}
+
+void
+TAO_EC_ProxyPushSupplier::clear (void)
+{
+ ACE_GUARD (ACE_Lock, ace_mon, *this->lock_);
+
+ this->child_->clear ();
+}
+
+CORBA::ULong
+TAO_EC_ProxyPushSupplier::max_event_size (void) const
+{
+ ACE_GUARD_RETURN (ACE_Lock, ace_mon, *this->lock_, 0);
+
+ return this->child_->max_event_size ();
+}
+
+int
+TAO_EC_ProxyPushSupplier::can_match (
+ const RtecEventComm::EventHeader &header) const
+{
+ ACE_GUARD_RETURN (ACE_Lock, ace_mon, *this->lock_, 0);
+
+ if (this->is_connected_i () == 0)
+ return 0;
+
+ return this->child_->can_match (header);
+}
+
+int
+TAO_EC_ProxyPushSupplier::add_dependencies (
+ const RtecEventComm::EventHeader &header,
+ const TAO_EC_QOS_Info &qos_info
+ ACE_ENV_ARG_DECL)
+{
+ ACE_GUARD_THROW_EX (
+ ACE_Lock, ace_mon, *this->lock_,
+ RtecEventChannelAdmin::EventChannel::SYNCHRONIZATION_ERROR ());
+ ACE_CHECK_RETURN (0);
+
+ return this->child_->add_dependencies (header,
+ qos_info
+ ACE_ENV_ARG_PARAMETER);
+}
+
+TAO_END_VERSIONED_NAMESPACE_DECL
diff --git a/TAO/orbsvcs/orbsvcs/Event/EC_ProxySupplier.h b/TAO/orbsvcs/orbsvcs/Event/EC_ProxySupplier.h
new file mode 100644
index 00000000000..bb14e56895b
--- /dev/null
+++ b/TAO/orbsvcs/orbsvcs/Event/EC_ProxySupplier.h
@@ -0,0 +1,231 @@
+// -*- C++ -*-
+/**
+ * @file EC_ProxySupplier.h
+ *
+ * $Id$
+ *
+ * @author Carlos O'Ryan (coryan@cs.wustl.edu)
+ *
+ * Based on previous work by Tim Harrison (harrison@cs.wustl.edu) and
+ * other members of the DOC group. More details can be found in:
+ *
+ * http://doc.ece.uci.edu/~coryan/EC/index.html
+ */
+
+#ifndef TAO_EC_PROXYSUPPLIER_H
+#define TAO_EC_PROXYSUPPLIER_H
+
+#include /**/ "ace/pre.h"
+
+#include "orbsvcs/RtecEventChannelAdminS.h"
+
+#include "orbsvcs/Event/EC_Filter.h"
+
+#if !defined (ACE_LACKS_PRAGMA_ONCE)
+# pragma once
+#endif /* ACE_LACKS_PRAGMA_ONCE */
+
+TAO_BEGIN_VERSIONED_NAMESPACE_DECL
+
+class TAO_EC_Event_Channel_Base;
+class TAO_EC_ProxyPushConsumer;
+
+/**
+ * @class TAO_EC_ProxyPushSupplier
+ *
+ * @brief ProxyPushSupplier
+ *
+ * Implement the RtecEventChannelAdmin::ProxyPushSupplier interface,
+ * remember that this class is used to communicate with a
+ * PushConsumer, so, in effect, this is the ambassador for a
+ * consumer inside the event channel.
+ *
+ * <H2>Memory Management</H2>
+ * It does not assume ownership of the TAO_EC_Dispatching object.
+ * It makes a copy of the ConsumerQOS and the consumer object
+ * reference.
+ *
+ * <H2>Locking</H2>
+ * Locking is strategized, the event channel acts as a factory for
+ * the locking strategies.
+ *
+ * @todo We don't need to provide a trivial filter, the object itself
+ * could short-circuit the filter() ---> push() cycle when the EC
+ * is properly configured, we need to explore this...
+ */
+class TAO_RTEvent_Serv_Export TAO_EC_ProxyPushSupplier : public TAO_EC_Filter
+{
+public:
+ typedef RtecEventChannelAdmin::ProxyPushSupplier Interface;
+ typedef RtecEventChannelAdmin::ProxyPushSupplier_var _var_type;
+ typedef RtecEventChannelAdmin::ProxyPushSupplier_ptr _ptr_type;
+
+ /// Constructor...
+ TAO_EC_ProxyPushSupplier (TAO_EC_Event_Channel_Base* event_channel, int validate_connection);
+
+ /// Destructor...
+ virtual ~TAO_EC_ProxyPushSupplier (void);
+
+ /// Activate in the POA
+ virtual void activate (
+ RtecEventChannelAdmin::ProxyPushSupplier_ptr &proxy
+ ACE_ENV_ARG_DECL)
+ ACE_THROW_SPEC ((CORBA::SystemException)) = 0;
+
+ /// Deactivate from the POA
+ virtual void deactivate (ACE_ENV_SINGLE_ARG_DECL)
+ ACE_THROW_SPEC (());
+
+ /// Disconnect this from
+ virtual void disconnect_push_supplier (
+ ACE_ENV_SINGLE_ARG_DECL) = 0;
+
+ /// Return 0 if no consumer is connected...
+ CORBA::Boolean is_connected (void) const;
+
+ /// Return 1 if it is suspended.
+ CORBA::Boolean is_suspended (void) const;
+
+ /**
+ * Return the consumer object reference. It returns nil() if it has
+ * not connected yet.
+ */
+ RtecEventComm::PushConsumer_ptr consumer (void) const;
+
+ /// The QoS (subscription) used to connect to the EC.
+ const RtecEventChannelAdmin::ConsumerQOS& subscriptions (void) const;
+
+ /// Concrete implementations can use this methods to keep track of
+ /// the suppliers that publish its events.
+ virtual void connected (TAO_EC_ProxyPushConsumer *consumer
+ ACE_ENV_ARG_DECL);
+ virtual void reconnected (TAO_EC_ProxyPushConsumer *consumer
+ ACE_ENV_ARG_DECL);
+ virtual void disconnected (TAO_EC_ProxyPushConsumer *consumer
+ ACE_ENV_ARG_DECL);
+
+ /// Usually implemented as no-ops, but some configurations may
+ /// require this methods.
+ virtual void connected (TAO_EC_ProxyPushSupplier *supplier
+ ACE_ENV_ARG_DECL);
+ virtual void reconnected (TAO_EC_ProxyPushSupplier *supplier
+ ACE_ENV_ARG_DECL);
+ virtual void disconnected (TAO_EC_ProxyPushSupplier *supplier
+ ACE_ENV_ARG_DECL);
+
+ /// The event channel is shutting down
+ virtual void shutdown (ACE_ENV_SINGLE_ARG_DECL);
+
+ /// Pushes to the consumer, verifies that it is connected and that it
+ /// is not suspended.
+ /**
+ * These methods take @a consumer argument because during the time
+ * the filters have been processing the event, this proxy's consumer
+ * may have changed.
+ */
+ void push_to_consumer (RtecEventComm::PushConsumer_ptr consumer,
+ const RtecEventComm::EventSet &event
+ ACE_ENV_ARG_DECL);
+ void reactive_push_to_consumer (RtecEventComm::PushConsumer_ptr consumer,
+ const RtecEventComm::EventSet &event
+ ACE_ENV_ARG_DECL);
+
+ /**
+ * Invoke the _non_existent() pseudo-operation on the consumer. If
+ * it is disconnected then it returns true and sets the
+ * <disconnected> flag.
+ */
+ CORBA::Boolean consumer_non_existent (CORBA::Boolean_out disconnected
+ ACE_ENV_ARG_DECL);
+
+ /// Increment and decrement the reference count.
+ CORBA::ULong _incr_refcnt (void);
+ CORBA::ULong _decr_refcnt (void);
+
+ // = The TAO_EC_Filter methods, only push() is implemented...
+ virtual int filter (const RtecEventComm::EventSet &event,
+ TAO_EC_QOS_Info& qos_info
+ ACE_ENV_ARG_DECL);
+ virtual int filter_nocopy (RtecEventComm::EventSet &event,
+ TAO_EC_QOS_Info &qos_info
+ ACE_ENV_ARG_DECL);
+ virtual void push (const RtecEventComm::EventSet &event,
+ TAO_EC_QOS_Info& qos_info
+ ACE_ENV_ARG_DECL);
+ virtual void push_nocopy (RtecEventComm::EventSet &event,
+ TAO_EC_QOS_Info &qos_info
+ ACE_ENV_ARG_DECL);
+ virtual void clear (void);
+ virtual CORBA::ULong max_event_size (void) const;
+ virtual int can_match (const RtecEventComm::EventHeader &header) const;
+ virtual int add_dependencies (const RtecEventComm::EventHeader &header,
+ const TAO_EC_QOS_Info &qos_info
+ ACE_ENV_ARG_DECL);
+
+protected:
+ /// Set the consumer, used by some implementations to change the
+ /// policies used when invoking operations on the consumer.
+ void consumer (RtecEventComm::PushConsumer_ptr consumer);
+ void consumer_i (RtecEventComm::PushConsumer_ptr consumer);
+
+ void suspend_connection_i (ACE_ENV_SINGLE_ARG_DECL)
+ ACE_THROW_SPEC ((CORBA::SystemException));
+ void resume_connection_i (ACE_ENV_SINGLE_ARG_DECL)
+ ACE_THROW_SPEC ((CORBA::SystemException));
+ void suspend_connection_locked (ACE_ENV_SINGLE_ARG_DECL)
+ ACE_THROW_SPEC ((CORBA::SystemException));
+ void resume_connection_locked (ACE_ENV_SINGLE_ARG_DECL)
+ ACE_THROW_SPEC ((CORBA::SystemException));
+
+ /// The private version (without locking) of is_connected().
+ CORBA::Boolean is_connected_i (void) const;
+
+ /// Release the child and the consumer
+ void cleanup_i (void);
+
+ /// The Event Channel that owns this object.
+ TAO_EC_Event_Channel_Base* event_channel_;
+
+ /// The locking strategy.
+ ACE_Lock* lock_;
+
+ /// The reference count.
+ CORBA::ULong refcount_;
+
+ /// The consumer....
+ RtecEventComm::PushConsumer_var consumer_;
+
+ /// Is this consumer suspended?
+ CORBA::Boolean suspended_;
+
+ /// The subscription and QoS information...
+ RtecEventChannelAdmin::ConsumerQOS qos_;
+
+ /// Store the default POA.
+ PortableServer::POA_var default_POA_;
+
+ /// The filter object
+ TAO_EC_Filter* child_;
+
+ /// Validate the connection to consumer on connect
+ int consumer_validate_connection_;
+private:
+
+ /// Template method hooks.
+ virtual void refcount_zero_hook (void);
+ virtual void pre_dispatch_hook (RtecEventComm::EventSet&
+ ACE_ENV_ARG_DECL);
+ virtual PortableServer::ObjectId
+ object_id (ACE_ENV_SINGLE_ARG_DECL)
+ ACE_THROW_SPEC ((CORBA::SystemException)) = 0;
+};
+
+TAO_END_VERSIONED_NAMESPACE_DECL
+
+#if defined (__ACE_INLINE__)
+#include "orbsvcs/Event/EC_ProxySupplier.i"
+#endif /* __ACE_INLINE__ */
+
+#include /**/ "ace/post.h"
+
+#endif /* TAO_EC_PROXYSUPPLIER_H */
diff --git a/TAO/orbsvcs/orbsvcs/Event/EC_ProxySupplier.i b/TAO/orbsvcs/orbsvcs/Event/EC_ProxySupplier.i
new file mode 100644
index 00000000000..c64085ea2e1
--- /dev/null
+++ b/TAO/orbsvcs/orbsvcs/Event/EC_ProxySupplier.i
@@ -0,0 +1,99 @@
+// -*- C++ -*-
+//
+// $Id$
+
+TAO_BEGIN_VERSIONED_NAMESPACE_DECL
+
+ACE_INLINE void
+TAO_EC_ProxyPushSupplier::suspend_connection_i (ACE_ENV_SINGLE_ARG_DECL_NOT_USED)
+ ACE_THROW_SPEC ((CORBA::SystemException))
+{
+ this->suspended_ = 1;
+}
+
+ACE_INLINE void
+TAO_EC_ProxyPushSupplier::suspend_connection_locked (ACE_ENV_SINGLE_ARG_DECL)
+ ACE_THROW_SPEC ((CORBA::SystemException))
+{
+ ACE_GUARD_THROW_EX (
+ ACE_Lock, ace_mon, *this->lock_,
+ CORBA::INTERNAL ());
+ // @@ RtecEventChannelAdmin::EventChannel::SYNCHRONIZATION_ERROR ());
+ ACE_CHECK;
+
+ this->suspend_connection_i (ACE_ENV_SINGLE_ARG_PARAMETER);
+}
+
+ACE_INLINE void
+TAO_EC_ProxyPushSupplier::resume_connection_i (ACE_ENV_SINGLE_ARG_DECL_NOT_USED)
+ ACE_THROW_SPEC ((CORBA::SystemException))
+{
+ this->suspended_ = 0;
+}
+
+ACE_INLINE void
+TAO_EC_ProxyPushSupplier::resume_connection_locked (ACE_ENV_SINGLE_ARG_DECL)
+ ACE_THROW_SPEC ((CORBA::SystemException))
+{
+ ACE_GUARD_THROW_EX (
+ ACE_Lock, ace_mon, *this->lock_,
+ CORBA::INTERNAL ());
+ // @@ RtecEventChannelAdmin::EventChannel::SYNCHRONIZATION_ERROR ());
+ ACE_CHECK;
+
+ this->resume_connection_i (ACE_ENV_SINGLE_ARG_PARAMETER);
+}
+
+ACE_INLINE CORBA::Boolean
+TAO_EC_ProxyPushSupplier::is_connected_i (void) const
+{
+ return !CORBA::is_nil (this->consumer_.in ());
+}
+
+ACE_INLINE CORBA::Boolean
+TAO_EC_ProxyPushSupplier::is_connected (void) const
+{
+ ACE_GUARD_RETURN (ACE_Lock, ace_mon, *this->lock_, 0);
+
+ return this->is_connected_i ();
+}
+
+ACE_INLINE CORBA::Boolean
+TAO_EC_ProxyPushSupplier::is_suspended (void) const
+{
+ ACE_GUARD_RETURN (ACE_Lock, ace_mon, *this->lock_, 0);
+
+ return this->suspended_;
+}
+
+ACE_INLINE RtecEventComm::PushConsumer_ptr
+TAO_EC_ProxyPushSupplier::consumer (void) const
+{
+ ACE_GUARD_RETURN (ACE_Lock, ace_mon, *this->lock_, 0);
+ return RtecEventComm::PushConsumer::_duplicate (this->consumer_.in ());
+}
+
+ACE_INLINE void
+TAO_EC_ProxyPushSupplier::consumer_i (RtecEventComm::PushConsumer_ptr consumer)
+{
+ this->consumer_ = consumer;
+}
+
+ACE_INLINE void
+TAO_EC_ProxyPushSupplier::consumer (RtecEventComm::PushConsumer_ptr consumer)
+{
+ ACE_GUARD (ACE_Lock, ace_mon, *this->lock_);
+
+ this->consumer_i (consumer);
+}
+
+ACE_INLINE const RtecEventChannelAdmin::ConsumerQOS&
+TAO_EC_ProxyPushSupplier::subscriptions (void) const
+{
+ // @@ TODO There should be a better way to signal errors here.
+ ACE_GUARD_RETURN (ACE_Lock, ace_mon, *this->lock_, this->qos_);
+
+ return this->qos_;
+}
+
+TAO_END_VERSIONED_NAMESPACE_DECL
diff --git a/TAO/orbsvcs/orbsvcs/Event/EC_Proxy_Disconnector.cpp b/TAO/orbsvcs/orbsvcs/Event/EC_Proxy_Disconnector.cpp
new file mode 100644
index 00000000000..557a2b4f708
--- /dev/null
+++ b/TAO/orbsvcs/orbsvcs/Event/EC_Proxy_Disconnector.cpp
@@ -0,0 +1,47 @@
+/**
+ * @file EC_Proxy_Disconnector.cpp
+ *
+ * $Id$
+ *
+ * @author Carlos O'Ryan <coryan@atdesk.com>
+ */
+
+#include "orbsvcs/Event/EC_Proxy_Disconnector.h"
+
+TAO_BEGIN_VERSIONED_NAMESPACE_DECL
+
+void
+TAO_EC_Supplier_Proxy_Disconnect_Functor::operator() (
+ RtecEventComm::PushSupplier_ptr supplier)
+ ACE_THROW_SPEC (())
+{
+ ACE_DECLARE_NEW_CORBA_ENV;
+ ACE_TRY
+ {
+ supplier->disconnect_push_supplier (ACE_ENV_SINGLE_ARG_PARAMETER);
+ ACE_TRY_CHECK;
+ }
+ ACE_CATCHALL
+ {
+ }
+ ACE_ENDTRY;
+}
+
+void
+TAO_EC_Consumer_Proxy_Disconnect_Functor::operator() (
+ RtecEventComm::PushConsumer_ptr consumer)
+ ACE_THROW_SPEC (())
+{
+ ACE_DECLARE_NEW_CORBA_ENV;
+ ACE_TRY
+ {
+ consumer->disconnect_push_consumer (ACE_ENV_SINGLE_ARG_PARAMETER);
+ ACE_TRY_CHECK;
+ }
+ ACE_CATCHALL
+ {
+ }
+ ACE_ENDTRY;
+}
+
+TAO_END_VERSIONED_NAMESPACE_DECL
diff --git a/TAO/orbsvcs/orbsvcs/Event/EC_Proxy_Disconnector.h b/TAO/orbsvcs/orbsvcs/Event/EC_Proxy_Disconnector.h
new file mode 100644
index 00000000000..8aeda423586
--- /dev/null
+++ b/TAO/orbsvcs/orbsvcs/Event/EC_Proxy_Disconnector.h
@@ -0,0 +1,76 @@
+// -*- C++ -*-
+
+/**
+ * @file EC_Proxy_Disconnector.h
+ *
+ * @author Carlos O'Ryan <coryan@atdesk.com>
+ *
+ * $Id$
+ */
+#ifndef EC_PROXY_DISCONNECTOR__H_
+#define EC_PROXY_DISCONNECTOR__H_
+
+#include /**/ "orbsvcs/Event/event_serv_export.h"
+#include "orbsvcs/RtecEventCommC.h"
+#include "ace/Auto_Functor.h"
+
+TAO_BEGIN_VERSIONED_NAMESPACE_DECL
+
+/**
+ * @struct TAO_EC_Supplier_Proxy_Disconnect_Functor
+ *
+ * @brief Implements a functor for the TAO_EC_Supplier_Proxy_Disconnector class.
+ */
+struct TAO_RTEvent_Serv_Export TAO_EC_Supplier_Proxy_Disconnect_Functor
+{
+ typedef RtecEventComm::PushSupplier_ptr argument;
+
+ /// Disconnect from @c supplier
+ void operator() (RtecEventComm::PushSupplier_ptr supplier)
+ ACE_THROW_SPEC (());
+};
+
+/**
+ * @class TAO_EC_Supplier_Proxy_Disconnector
+ *
+ * @brief Helper class to disconnect a PushConsumer from the event
+ * channel.
+ *
+ */
+typedef ACE_Utils::Auto_Functor<
+ RtecEventComm::PushSupplier,
+ TAO_EC_Supplier_Proxy_Disconnect_Functor>
+ TAO_EC_Supplier_Proxy_Disconnector;
+
+
+
+/**
+ * @struct TAO_EC_Consumer_Proxy_Disconnect_Functor
+ *
+ * @brief Implements a functor for the TAO_EC_Consumer_Proxy_Disconnector class.
+ */
+struct TAO_RTEvent_Serv_Export TAO_EC_Consumer_Proxy_Disconnect_Functor
+{
+ typedef RtecEventComm::PushConsumer_ptr argument;
+
+ /// Disconnect from @c consumer
+ void operator() (RtecEventComm::PushConsumer_ptr consumer)
+ ACE_THROW_SPEC (());
+};
+
+/**
+ * @class TAO_EC_Consumer_Proxy_Disconnector
+ *
+ * @brief Helper class to disconnect a PushSupplier from the event
+ * channel.
+ *
+ */
+typedef ACE_Utils::Auto_Functor<
+ RtecEventComm::PushConsumer,
+ TAO_EC_Consumer_Proxy_Disconnect_Functor>
+ TAO_EC_Consumer_Proxy_Disconnector;
+
+
+TAO_END_VERSIONED_NAMESPACE_DECL
+
+#endif // EC_PROXY_DISCONNECTOR__H_
diff --git a/TAO/orbsvcs/orbsvcs/Event/EC_QOS_Info.cpp b/TAO/orbsvcs/orbsvcs/Event/EC_QOS_Info.cpp
new file mode 100644
index 00000000000..4680bda962f
--- /dev/null
+++ b/TAO/orbsvcs/orbsvcs/Event/EC_QOS_Info.cpp
@@ -0,0 +1,9 @@
+// $Id$
+
+#include "orbsvcs/Event/EC_QOS_Info.h"
+
+#if ! defined (__ACE_INLINE__)
+#include "orbsvcs/Event/EC_QOS_Info.i"
+#endif /* __ACE_INLINE__ */
+
+ACE_RCSID(Event, EC_QOS_Info, "$Id$")
diff --git a/TAO/orbsvcs/orbsvcs/Event/EC_QOS_Info.h b/TAO/orbsvcs/orbsvcs/Event/EC_QOS_Info.h
new file mode 100644
index 00000000000..88c9387e382
--- /dev/null
+++ b/TAO/orbsvcs/orbsvcs/Event/EC_QOS_Info.h
@@ -0,0 +1,70 @@
+// -*- C++ -*-
+
+/**
+ * @file EC_QOS_Info.h
+ *
+ * $Id$
+ *
+ * @author Carlos O'Ryan (coryan@cs.wustl.edu)
+ *
+ * Based on previous work by Tim Harrison (harrison@cs.wustl.edu) and
+ * other members of the DOC group. More details can be found in:
+ *
+ * http://doc.ece.uci.edu/~coryan/EC/index.html
+ */
+
+#ifndef TAO_EC_QOS_INFO_H
+#define TAO_EC_QOS_INFO_H
+
+#include /**/ "ace/pre.h"
+
+#include "orbsvcs/RtecBaseC.h"
+
+#include /**/ "orbsvcs/Event/event_serv_export.h"
+
+#if !defined (ACE_LACKS_PRAGMA_ONCE)
+# pragma once
+#endif /* ACE_LACKS_PRAGMA_ONCE */
+
+TAO_BEGIN_VERSIONED_NAMESPACE_DECL
+
+/**
+ * @class TAO_EC_QOS_Info
+ *
+ * @brief A representation of QoS information for the event channel
+ * filters.
+ *
+ * Filters compute QOS information for real-time dispatching, this
+ * class encapsulates that information.
+ * This first implementation is just a place-holder.
+ */
+class TAO_RTEvent_Serv_Export TAO_EC_QOS_Info
+{
+public:
+ /// Constructor
+ TAO_EC_QOS_Info (void);
+
+ /// Copy constructor, it does the obvious thing, but if it is not
+ /// here the HP/aCC compiler breaks.
+ TAO_EC_QOS_Info (const TAO_EC_QOS_Info &rhs);
+
+ RtecBase::handle_t rt_info;
+ RtecBase::Preemption_Priority_t preemption_priority;
+
+ /**
+ * Timer ids propagate their identity using this field, notice that
+ * they cannot use the event type because there could be multiple
+ * timeouts for the same consumer.
+ */
+ long timer_id_;
+};
+
+TAO_END_VERSIONED_NAMESPACE_DECL
+
+#if defined (__ACE_INLINE__)
+#include "orbsvcs/Event/EC_QOS_Info.i"
+#endif /* __ACE_INLINE__ */
+
+#include /**/ "ace/post.h"
+
+#endif /* TAO_EC_EVENT_CHANNEL_H */
diff --git a/TAO/orbsvcs/orbsvcs/Event/EC_QOS_Info.i b/TAO/orbsvcs/orbsvcs/Event/EC_QOS_Info.i
new file mode 100644
index 00000000000..eab42f031bc
--- /dev/null
+++ b/TAO/orbsvcs/orbsvcs/Event/EC_QOS_Info.i
@@ -0,0 +1,23 @@
+// -*- C++ -*-
+//
+// $Id$
+
+TAO_BEGIN_VERSIONED_NAMESPACE_DECL
+
+ACE_INLINE
+TAO_EC_QOS_Info::TAO_EC_QOS_Info (void)
+ : rt_info (-1),
+ preemption_priority (0),
+ timer_id_ (-1)
+{
+}
+
+ACE_INLINE
+TAO_EC_QOS_Info::TAO_EC_QOS_Info (const TAO_EC_QOS_Info &rhs)
+ : rt_info (rhs.rt_info),
+ preemption_priority (rhs.preemption_priority),
+ timer_id_ (rhs.timer_id_)
+{
+}
+
+TAO_END_VERSIONED_NAMESPACE_DECL
diff --git a/TAO/orbsvcs/orbsvcs/Event/EC_RTCORBA_Dispatching.cpp b/TAO/orbsvcs/orbsvcs/Event/EC_RTCORBA_Dispatching.cpp
new file mode 100644
index 00000000000..f57b86ae813
--- /dev/null
+++ b/TAO/orbsvcs/orbsvcs/Event/EC_RTCORBA_Dispatching.cpp
@@ -0,0 +1,106 @@
+// $Id$
+
+#include "orbsvcs/Event/EC_RTCORBA_Dispatching.h"
+#include "tao/RTCORBA/Priority_Mapping.h"
+
+ACE_RCSID(Event, EC_RTCORBA_Dispatching, "$Id$")
+
+TAO_BEGIN_VERSIONED_NAMESPACE_DECL
+
+TAO_EC_RTCORBA_Dispatching::
+ TAO_EC_RTCORBA_Dispatching (const RTCORBA::ThreadpoolLanes &lanes,
+ RTCORBA::PriorityMapping *mapping,
+ RTCORBA::Current_ptr current)
+ : lanes_ (lanes)
+ , priority_mapping_ (mapping)
+ , current_ (RTCORBA::Current::_duplicate (current))
+{
+ CORBA::ULong number_lanes = this->lanes_.length ();
+ ACE_NEW (this->tasks_, TAO_EC_Dispatching_Task[number_lanes]);
+ for (CORBA::ULong i = 0; i != this->lanes_.length (); ++i)
+ this->tasks_[i].thr_mgr (&this->thread_manager_);
+}
+
+TAO_EC_RTCORBA_Dispatching::~TAO_EC_RTCORBA_Dispatching (void)
+{
+ delete[] this->tasks_;
+}
+
+void
+TAO_EC_RTCORBA_Dispatching::activate (void)
+{
+ for (CORBA::ULong i = 0; i != this->lanes_.length (); ++i)
+ {
+ CORBA::ULong nthreads = this->lanes_[i].static_threads;
+ if (nthreads == 0)
+ {
+ nthreads = 1;
+ }
+ RTCORBA::Priority corba_priority = this->lanes_[i].lane_priority;
+ RTCORBA::NativePriority native_priority;
+ if (this->priority_mapping_->to_native (corba_priority,
+ native_priority) != 0)
+ {
+ this->tasks_[i].activate (
+ THR_SCHED_FIFO | THR_NEW_LWP | THR_JOINABLE,
+ nthreads, 0,
+ native_priority);
+ }
+ }
+}
+
+void
+TAO_EC_RTCORBA_Dispatching::shutdown (void)
+{
+ for (CORBA::ULong i = 0; i != this->lanes_.length (); ++i)
+ {
+ int nthreads =
+ this->thread_manager_.num_threads_in_task (&this->tasks_[i]);
+ if (nthreads <= 0)
+ continue;
+ for (int j = 0; j != nthreads; ++j)
+ {
+ this->tasks_[i].putq (new TAO_EC_Shutdown_Task_Command);
+ }
+ }
+ this->thread_manager_.wait ();
+}
+
+void
+TAO_EC_RTCORBA_Dispatching::push (TAO_EC_ProxyPushSupplier* proxy,
+ RtecEventComm::PushConsumer_ptr consumer,
+ const RtecEventComm::EventSet& event,
+ TAO_EC_QOS_Info& qos_info
+ ACE_ENV_ARG_DECL)
+{
+ RtecEventComm::EventSet event_copy = event;
+ this->push_nocopy (proxy, consumer, event_copy, qos_info ACE_ENV_ARG_PARAMETER);
+}
+
+void
+TAO_EC_RTCORBA_Dispatching::push_nocopy (TAO_EC_ProxyPushSupplier* proxy,
+ RtecEventComm::PushConsumer_ptr consumer,
+ RtecEventComm::EventSet& event,
+ TAO_EC_QOS_Info&
+ ACE_ENV_ARG_DECL)
+{
+ RTCORBA::Priority current_priority =
+ this->current_->the_priority (ACE_ENV_SINGLE_ARG_PARAMETER);
+ ACE_CHECK;
+
+ for (CORBA::ULong i = 0; i != this->lanes_.length (); ++i)
+ {
+ if (this->lanes_[i].lane_priority != current_priority)
+ continue;
+
+ // @@ If there were no threads available we may need to create
+ // some...
+
+ this->tasks_[i].push (proxy, consumer, event
+ ACE_ENV_ARG_PARAMETER);
+ ACE_CHECK;
+ break;
+ }
+}
+
+TAO_END_VERSIONED_NAMESPACE_DECL
diff --git a/TAO/orbsvcs/orbsvcs/Event/EC_RTCORBA_Dispatching.h b/TAO/orbsvcs/orbsvcs/Event/EC_RTCORBA_Dispatching.h
new file mode 100644
index 00000000000..cb6e87fdad2
--- /dev/null
+++ b/TAO/orbsvcs/orbsvcs/Event/EC_RTCORBA_Dispatching.h
@@ -0,0 +1,82 @@
+// -*- C++ -*-
+/**
+ * @file EC_RTCORBA_Dispatching.h
+ *
+ * $Id$
+ *
+ * @author Carlos O'Ryan (coryan@cs.wustl.edu)
+ *
+ * Based on previous work by Tim Harrison (harrison@cs.wustl.edu) and
+ * other members of the DOC group. More details can be found in:
+ *
+ * http://doc.ece.uci.edu/~coryan/EC/index.html
+ */
+
+#ifndef TAO_EC_RTCORBA_DISPATCHING_H
+#define TAO_EC_RTCORBA_DISPATCHING_H
+#include /**/ "ace/pre.h"
+
+#include "orbsvcs/Event/rtcorba_event_export.h"
+#include "orbsvcs/Event/EC_Dispatching.h"
+
+#if !defined (ACE_LACKS_PRAGMA_ONCE)
+# pragma once
+#endif /* ACE_LACKS_PRAGMA_ONCE */
+
+#include "orbsvcs/Event/EC_Dispatching_Task.h"
+#include "tao/RTCORBA/RTCORBA.h"
+
+TAO_BEGIN_VERSIONED_NAMESPACE_DECL
+
+/**
+ * @class TAO_EC_RTCORBA_Dispatching
+ *
+ * @brief RTCORBA-based dispatching strategy
+ *
+ */
+class TAO_RTCORBAEvent_Export TAO_EC_RTCORBA_Dispatching : public TAO_EC_Dispatching
+{
+public:
+ /// Constructor
+ TAO_EC_RTCORBA_Dispatching (const RTCORBA::ThreadpoolLanes &lanes,
+ RTCORBA::PriorityMapping *mapping,
+ RTCORBA::Current_ptr current);
+
+ /// Destructor
+ ~TAO_EC_RTCORBA_Dispatching (void);
+
+ // = The EC_Dispatching methods.
+ virtual void activate (void);
+ virtual void shutdown (void);
+ virtual void push (TAO_EC_ProxyPushSupplier* proxy,
+ RtecEventComm::PushConsumer_ptr consumer,
+ const RtecEventComm::EventSet& event,
+ TAO_EC_QOS_Info& qos_info
+ ACE_ENV_ARG_DECL);
+ virtual void push_nocopy (TAO_EC_ProxyPushSupplier* proxy,
+ RtecEventComm::PushConsumer_ptr consumer,
+ RtecEventComm::EventSet& event,
+ TAO_EC_QOS_Info& qos_info
+ ACE_ENV_ARG_DECL);
+
+private:
+ /// The thread pools...
+ RTCORBA::ThreadpoolLanes lanes_;
+
+ /// Used to map between CORBA and native priorities
+ RTCORBA::PriorityMapping *priority_mapping_;
+
+ /// Used to get the current RTCORBA priority
+ RTCORBA::Current_var current_;
+
+ /// Use our own thread manager.
+ ACE_Thread_Manager thread_manager_;
+
+ /// The dispatching task(s), one per lane
+ TAO_EC_Dispatching_Task *tasks_;
+};
+
+TAO_END_VERSIONED_NAMESPACE_DECL
+
+#include /**/ "ace/post.h"
+#endif /* TAO_EC_RTCORBA_DISPATCHING_H */
diff --git a/TAO/orbsvcs/orbsvcs/Event/EC_RTCORBA_Factory.cpp b/TAO/orbsvcs/orbsvcs/Event/EC_RTCORBA_Factory.cpp
new file mode 100644
index 00000000000..087ffc53b03
--- /dev/null
+++ b/TAO/orbsvcs/orbsvcs/Event/EC_RTCORBA_Factory.cpp
@@ -0,0 +1,276 @@
+// $Id$
+
+#include "orbsvcs/Event/EC_RTCORBA_Dispatching.h"
+#include "orbsvcs/Event/EC_RTCORBA_Factory.h"
+
+#include "tao/RTCORBA/Priority_Mapping_Manager.h"
+
+ACE_RCSID(Event, EC_RTCORBA_Factory, "$Id$")
+
+TAO_BEGIN_VERSIONED_NAMESPACE_DECL
+
+TAO_EC_RTCORBA_Factory::
+ TAO_EC_RTCORBA_Factory (TAO_EC_Factory *body,
+ const RTCORBA::ThreadpoolLanes &lanes)
+ : body_ (body)
+ , lanes_ (lanes)
+{
+}
+
+TAO_EC_RTCORBA_Factory::~TAO_EC_RTCORBA_Factory (void)
+{
+}
+
+
+int
+TAO_EC_RTCORBA_Factory::init (int argc, char* argv[])
+{
+ return this->body_->init (argc, argv);
+}
+
+int
+TAO_EC_RTCORBA_Factory::fini (void)
+{
+ return this->body_->fini ();
+}
+
+// ****************************************************************
+
+TAO_EC_Dispatching*
+TAO_EC_RTCORBA_Factory::create_dispatching (TAO_EC_Event_Channel_Base *)
+{
+ TAO_EC_Dispatching *dispatching = 0;
+ ACE_DECLARE_NEW_CORBA_ENV;
+ ACE_TRY
+ {
+ // @@ The ORBId could be important!!!
+ int argc = 0;
+ CORBA::ORB_var orb =
+ CORBA::ORB_init (argc, 0, ""
+ ACE_ENV_ARG_PARAMETER);
+ ACE_TRY_CHECK;
+
+ CORBA::Object_var obj =
+ orb->resolve_initial_references ("PriorityMappingManager"
+ ACE_ENV_ARG_PARAMETER);
+ ACE_TRY_CHECK;
+
+ RTCORBA::PriorityMappingManager_var priority_mapping_manager =
+ RTCORBA::PriorityMappingManager::_narrow (obj.in ()
+ ACE_ENV_ARG_PARAMETER);
+ ACE_TRY_CHECK;
+
+ RTCORBA::PriorityMapping *priority_mapping =
+ priority_mapping_manager->mapping ();
+
+ obj =
+ orb->resolve_initial_references ("RTCurrent"
+ ACE_ENV_ARG_PARAMETER);
+ ACE_TRY_CHECK;
+
+ RTCORBA::Current_var current =
+ RTCORBA::Current::_narrow (obj.in ()
+ ACE_ENV_ARG_PARAMETER);
+ ACE_TRY_CHECK;
+
+ ACE_NEW_RETURN (dispatching,
+ TAO_EC_RTCORBA_Dispatching (this->lanes_,
+ priority_mapping,
+ current.in ()),
+ 0);
+ }
+ ACE_CATCHANY
+ {
+ }
+ ACE_ENDTRY;
+
+ return dispatching;
+}
+
+void
+TAO_EC_RTCORBA_Factory::destroy_dispatching (TAO_EC_Dispatching *x)
+{
+ this->body_->destroy_dispatching (x);
+}
+
+TAO_EC_Filter_Builder*
+TAO_EC_RTCORBA_Factory::create_filter_builder (TAO_EC_Event_Channel_Base *ec)
+{
+ return this->body_->create_filter_builder (ec);
+}
+
+void
+TAO_EC_RTCORBA_Factory::destroy_filter_builder (TAO_EC_Filter_Builder *x)
+{
+ this->body_->destroy_filter_builder (x);
+}
+
+TAO_EC_Supplier_Filter_Builder*
+TAO_EC_RTCORBA_Factory::create_supplier_filter_builder (TAO_EC_Event_Channel_Base *ec)
+{
+ return this->body_->create_supplier_filter_builder (ec);
+}
+
+void
+TAO_EC_RTCORBA_Factory::destroy_supplier_filter_builder (TAO_EC_Supplier_Filter_Builder *x)
+{
+ this->body_->destroy_supplier_filter_builder (x);
+}
+
+TAO_EC_ConsumerAdmin*
+TAO_EC_RTCORBA_Factory::create_consumer_admin (TAO_EC_Event_Channel_Base *ec)
+{
+ return this->body_->create_consumer_admin (ec);
+}
+
+void
+TAO_EC_RTCORBA_Factory::destroy_consumer_admin (TAO_EC_ConsumerAdmin *x)
+{
+ this->body_->destroy_consumer_admin (x);
+}
+
+TAO_EC_SupplierAdmin*
+TAO_EC_RTCORBA_Factory::create_supplier_admin (TAO_EC_Event_Channel_Base *ec)
+{
+ return this->body_->create_supplier_admin (ec);
+}
+
+void
+TAO_EC_RTCORBA_Factory::destroy_supplier_admin (TAO_EC_SupplierAdmin *x)
+{
+ this->body_->destroy_supplier_admin (x);
+}
+
+TAO_EC_ProxyPushSupplier*
+TAO_EC_RTCORBA_Factory::create_proxy_push_supplier (TAO_EC_Event_Channel_Base *ec)
+{
+ return this->body_->create_proxy_push_supplier (ec);
+}
+
+void
+TAO_EC_RTCORBA_Factory::destroy_proxy_push_supplier (TAO_EC_ProxyPushSupplier *x)
+{
+ this->body_->destroy_proxy_push_supplier (x);
+}
+
+TAO_EC_ProxyPushConsumer*
+TAO_EC_RTCORBA_Factory::create_proxy_push_consumer (TAO_EC_Event_Channel_Base *ec)
+{
+ return this->body_->create_proxy_push_consumer (ec);
+}
+
+void
+TAO_EC_RTCORBA_Factory::destroy_proxy_push_consumer (TAO_EC_ProxyPushConsumer *x)
+{
+ this->body_->destroy_proxy_push_consumer (x);
+}
+
+TAO_EC_Timeout_Generator*
+TAO_EC_RTCORBA_Factory::create_timeout_generator (TAO_EC_Event_Channel_Base *ec)
+{
+ return this->body_->create_timeout_generator (ec);
+}
+
+void
+TAO_EC_RTCORBA_Factory::destroy_timeout_generator (TAO_EC_Timeout_Generator *x)
+{
+ this->body_->destroy_timeout_generator (x);
+}
+
+TAO_EC_ObserverStrategy*
+TAO_EC_RTCORBA_Factory::create_observer_strategy (TAO_EC_Event_Channel_Base *ec)
+{
+ return this->body_->create_observer_strategy (ec);
+}
+
+void
+TAO_EC_RTCORBA_Factory::destroy_observer_strategy (TAO_EC_ObserverStrategy *x)
+{
+ this->body_->destroy_observer_strategy (x);
+}
+
+TAO_EC_Scheduling_Strategy*
+TAO_EC_RTCORBA_Factory::create_scheduling_strategy (TAO_EC_Event_Channel_Base *ec)
+{
+ return this->body_->create_scheduling_strategy (ec);
+}
+
+void
+TAO_EC_RTCORBA_Factory::destroy_scheduling_strategy (TAO_EC_Scheduling_Strategy* x)
+{
+ this->body_->destroy_scheduling_strategy (x);
+}
+
+TAO_EC_ProxyPushConsumer_Collection*
+TAO_EC_RTCORBA_Factory::create_proxy_push_consumer_collection (TAO_EC_Event_Channel_Base *ec)
+{
+ return this->body_->create_proxy_push_consumer_collection (ec);
+}
+
+void
+TAO_EC_RTCORBA_Factory::destroy_proxy_push_consumer_collection (TAO_EC_ProxyPushConsumer_Collection *x)
+{
+ this->body_->destroy_proxy_push_consumer_collection (x);
+}
+
+TAO_EC_ProxyPushSupplier_Collection*
+TAO_EC_RTCORBA_Factory::create_proxy_push_supplier_collection (TAO_EC_Event_Channel_Base *ec)
+{
+ return this->body_->create_proxy_push_supplier_collection (ec);
+}
+
+void
+TAO_EC_RTCORBA_Factory::destroy_proxy_push_supplier_collection (TAO_EC_ProxyPushSupplier_Collection *x)
+{
+ this->body_->destroy_proxy_push_supplier_collection (x);
+}
+
+ACE_Lock*
+TAO_EC_RTCORBA_Factory::create_consumer_lock (void)
+{
+ return this->body_->create_consumer_lock ();
+}
+
+void
+TAO_EC_RTCORBA_Factory::destroy_consumer_lock (ACE_Lock* x)
+{
+ this->body_->destroy_consumer_lock (x);
+}
+
+ACE_Lock*
+TAO_EC_RTCORBA_Factory::create_supplier_lock (void)
+{
+ return this->body_->create_supplier_lock ();
+}
+
+void
+TAO_EC_RTCORBA_Factory::destroy_supplier_lock (ACE_Lock* x)
+{
+ this->body_->destroy_supplier_lock (x);
+}
+
+TAO_EC_ConsumerControl*
+TAO_EC_RTCORBA_Factory::create_consumer_control (TAO_EC_Event_Channel_Base* ec)
+{
+ return this->body_->create_consumer_control (ec);
+}
+
+void
+TAO_EC_RTCORBA_Factory::destroy_consumer_control (TAO_EC_ConsumerControl* x)
+{
+ this->body_->destroy_consumer_control (x);
+}
+
+TAO_EC_SupplierControl*
+TAO_EC_RTCORBA_Factory::create_supplier_control (TAO_EC_Event_Channel_Base* ec)
+{
+ return this->body_->create_supplier_control (ec);
+}
+
+void
+TAO_EC_RTCORBA_Factory::destroy_supplier_control (TAO_EC_SupplierControl* x)
+{
+ this->body_->destroy_supplier_control (x);
+}
+
+TAO_END_VERSIONED_NAMESPACE_DECL
diff --git a/TAO/orbsvcs/orbsvcs/Event/EC_RTCORBA_Factory.h b/TAO/orbsvcs/orbsvcs/Event/EC_RTCORBA_Factory.h
new file mode 100644
index 00000000000..a76bc59f73d
--- /dev/null
+++ b/TAO/orbsvcs/orbsvcs/Event/EC_RTCORBA_Factory.h
@@ -0,0 +1,123 @@
+// -*- C++ -*-
+/**
+ * @file EC_RTCORBA_Factory.h
+ *
+ * $Id$
+ *
+ * @author Carlos O'Ryan (coryan@cs.wustl.edu)
+ *
+ * Based on previous work by Tim Harrison (harrison@cs.wustl.edu) and
+ * other members of the DOC group. More details can be found in:
+ *
+ * http://doc.ece.uci.edu/~coryan/EC/index.html
+ */
+
+#ifndef TAO_EC_RTCORBA_FACTORY_H
+#define TAO_EC_RTCORBA_FACTORY_H
+#include /**/ "ace/pre.h"
+
+#include "orbsvcs/Event/rtcorba_event_export.h"
+#include "orbsvcs/Event/EC_Factory.h"
+#include "tao/RTCORBA/RTCORBA.h"
+
+#if !defined (ACE_LACKS_PRAGMA_ONCE)
+# pragma once
+#endif /* ACE_LACKS_PRAGMA_ONCE */
+
+TAO_BEGIN_VERSIONED_NAMESPACE_DECL
+
+/**
+ * @class TAO_EC_RTCORBA_Factory
+ *
+ * @brief Decorate an EC_Factory to use the EC_RTCORBA_Dispatching
+ * module.
+ */
+class TAO_RTCORBAEvent_Export TAO_EC_RTCORBA_Factory : public TAO_EC_Factory
+{
+public:
+ /// Constructor
+ /**
+ * @param body The decorated factory.
+ */
+ TAO_EC_RTCORBA_Factory (TAO_EC_Factory *body,
+ const RTCORBA::ThreadpoolLanes &lanes);
+
+ /// destructor...
+ virtual ~TAO_EC_RTCORBA_Factory (void);
+
+ // Decorated methods...
+ virtual int init (int argc, char* argv[]);
+ virtual int fini (void);
+ virtual TAO_EC_Dispatching*
+ create_dispatching (TAO_EC_Event_Channel_Base*);
+ virtual void
+ destroy_dispatching (TAO_EC_Dispatching*) ;
+ virtual TAO_EC_Filter_Builder*
+ create_filter_builder (TAO_EC_Event_Channel_Base*) ;
+ virtual void
+ destroy_filter_builder (TAO_EC_Filter_Builder*);
+ virtual TAO_EC_Supplier_Filter_Builder*
+ create_supplier_filter_builder (TAO_EC_Event_Channel_Base*) ;
+ virtual void
+ destroy_supplier_filter_builder (TAO_EC_Supplier_Filter_Builder*);
+ virtual TAO_EC_ConsumerAdmin*
+ create_consumer_admin (TAO_EC_Event_Channel_Base*) ;
+ virtual void
+ destroy_consumer_admin (TAO_EC_ConsumerAdmin*);
+ virtual TAO_EC_SupplierAdmin*
+ create_supplier_admin (TAO_EC_Event_Channel_Base*) ;
+ virtual void
+ destroy_supplier_admin (TAO_EC_SupplierAdmin*);
+ virtual TAO_EC_ProxyPushSupplier*
+ create_proxy_push_supplier (TAO_EC_Event_Channel_Base*);
+ virtual void
+ destroy_proxy_push_supplier (TAO_EC_ProxyPushSupplier*);
+ virtual TAO_EC_ProxyPushConsumer*
+ create_proxy_push_consumer (TAO_EC_Event_Channel_Base*);
+ virtual void
+ destroy_proxy_push_consumer (TAO_EC_ProxyPushConsumer*);
+ virtual TAO_EC_Timeout_Generator*
+ create_timeout_generator (TAO_EC_Event_Channel_Base*) ;
+ virtual void
+ destroy_timeout_generator (TAO_EC_Timeout_Generator*);
+ virtual TAO_EC_ObserverStrategy*
+ create_observer_strategy (TAO_EC_Event_Channel_Base*);
+ virtual void
+ destroy_observer_strategy (TAO_EC_ObserverStrategy*);
+ virtual TAO_EC_Scheduling_Strategy*
+ create_scheduling_strategy (TAO_EC_Event_Channel_Base*);
+ virtual void
+ destroy_scheduling_strategy (TAO_EC_Scheduling_Strategy*);
+ virtual TAO_EC_ProxyPushConsumer_Collection*
+ create_proxy_push_consumer_collection (TAO_EC_Event_Channel_Base*);
+ virtual void
+ destroy_proxy_push_consumer_collection (TAO_EC_ProxyPushConsumer_Collection*);
+ virtual TAO_EC_ProxyPushSupplier_Collection*
+ create_proxy_push_supplier_collection (TAO_EC_Event_Channel_Base*);
+ virtual void
+ destroy_proxy_push_supplier_collection (TAO_EC_ProxyPushSupplier_Collection*);
+ virtual ACE_Lock* create_consumer_lock (void);
+ virtual void destroy_consumer_lock (ACE_Lock*);
+ virtual ACE_Lock* create_supplier_lock (void);
+ virtual void destroy_supplier_lock (ACE_Lock*);
+ virtual TAO_EC_ConsumerControl*
+ create_consumer_control (TAO_EC_Event_Channel_Base*);
+ virtual void
+ destroy_consumer_control (TAO_EC_ConsumerControl*);
+ virtual TAO_EC_SupplierControl*
+ create_supplier_control (TAO_EC_Event_Channel_Base*);
+ virtual void
+ destroy_supplier_control (TAO_EC_SupplierControl*);
+
+protected:
+ /// The decorated factory
+ TAO_EC_Factory *body_;
+
+ /// Configure the thread pool lanes.
+ RTCORBA::ThreadpoolLanes lanes_;
+};
+
+TAO_END_VERSIONED_NAMESPACE_DECL
+
+#include /**/ "ace/post.h"
+#endif /* TAO_EC_RTCORBA_FACTORY_H */
diff --git a/TAO/orbsvcs/orbsvcs/Event/EC_Reactive_ConsumerControl.cpp b/TAO/orbsvcs/orbsvcs/Event/EC_Reactive_ConsumerControl.cpp
new file mode 100644
index 00000000000..a8aafe81f0b
--- /dev/null
+++ b/TAO/orbsvcs/orbsvcs/Event/EC_Reactive_ConsumerControl.cpp
@@ -0,0 +1,276 @@
+// $Id$
+
+#include "orbsvcs/Event/EC_ConsumerAdmin.h"
+#include "orbsvcs/Event/EC_Reactive_ConsumerControl.h"
+#include "orbsvcs/Event/EC_Event_Channel_Base.h"
+#include "orbsvcs/Event/EC_ProxySupplier.h"
+#include "orbsvcs/Event/EC_ProxyConsumer.h" // @@ MSVC 6 bug
+
+#include "tao/Messaging/Messaging.h"
+#include "tao/ORB_Core.h"
+
+#include "ace/Reactor.h"
+
+#if ! defined (__ACE_INLINE__)
+#include "orbsvcs/Event/EC_Reactive_ConsumerControl.i"
+#endif /* __ACE_INLINE__ */
+
+ACE_RCSID(Event, EC_Reactive_ConsumerControl, "$Id$")
+
+TAO_BEGIN_VERSIONED_NAMESPACE_DECL
+
+TAO_EC_Reactive_ConsumerControl::
+ TAO_EC_Reactive_ConsumerControl (const ACE_Time_Value &rate,
+ const ACE_Time_Value &timeout,
+ TAO_EC_Event_Channel_Base *ec,
+ CORBA::ORB_ptr orb)
+ : rate_ (rate),
+ timeout_ (timeout),
+ adapter_ (this),
+ event_channel_ (ec),
+ orb_ (CORBA::ORB::_duplicate (orb))
+#if defined (TAO_HAS_CORBA_MESSAGING) && TAO_HAS_CORBA_MESSAGING != 0
+ , timer_id_ (-1)
+#endif /* TAO_HAS_CORBA_MESSAGING != 0*/
+{
+ this->reactor_ =
+ this->orb_->orb_core ()->reactor ();
+}
+
+TAO_EC_Reactive_ConsumerControl::~TAO_EC_Reactive_ConsumerControl (void)
+{
+}
+
+void
+TAO_EC_Reactive_ConsumerControl::query_consumers (
+ ACE_ENV_SINGLE_ARG_DECL)
+{
+ TAO_EC_Ping_Consumer worker (this);
+ this->event_channel_->for_each_consumer (&worker
+ ACE_ENV_ARG_PARAMETER);
+ ACE_CHECK;
+}
+
+void
+TAO_EC_Reactive_ConsumerControl::handle_timeout (
+ const ACE_Time_Value &,
+ const void *)
+{
+ // NOTE, setting RELATIVE_RT_TIMEOUT_POLICY for the duration of
+ // query_consumers () below has greater impact than desired. For
+ // example, while we are pinging consumers here, a nested upcall,
+ // which requires making remote calls may come into the ORB. Those
+ // remote calls will be carried out with with
+ // RELATIVE_RT_TIMEOUT_POLICY set here in effect.
+
+ // @@ TODO: should use Guard to set and reset policies.
+ ACE_TRY_NEW_ENV
+ {
+ // Query the state of the Current object *before* we initiate
+ // the iteration...
+ CORBA::PolicyTypeSeq types;
+ CORBA::PolicyList_var policies =
+ this->policy_current_->get_policy_overrides (types
+ ACE_ENV_ARG_PARAMETER);
+ ACE_TRY_CHECK;
+
+ // Change the timeout
+ this->policy_current_->set_policy_overrides (this->policy_list_,
+ CORBA::ADD_OVERRIDE
+ ACE_ENV_ARG_PARAMETER);
+ ACE_TRY_CHECK;
+
+ // Query the state of the consumers...
+ this->query_consumers (ACE_ENV_SINGLE_ARG_PARAMETER);
+ ACE_TRY_CHECK;
+
+ this->policy_current_->set_policy_overrides (policies.in (),
+ CORBA::SET_OVERRIDE
+ ACE_ENV_ARG_PARAMETER);
+ ACE_TRY_CHECK;
+ for (CORBA::ULong i = 0; i != policies->length (); ++i)
+ {
+ policies[i]->destroy (ACE_ENV_SINGLE_ARG_PARAMETER);
+ ACE_TRY_CHECK;
+ }
+ }
+ ACE_CATCHANY
+ {
+ // Ignore all exceptions
+ }
+ ACE_ENDTRY;
+}
+
+int
+TAO_EC_Reactive_ConsumerControl::activate (void)
+{
+#if defined (TAO_HAS_CORBA_MESSAGING) && TAO_HAS_CORBA_MESSAGING != 0
+ ACE_TRY_NEW_ENV
+ {
+ // Get the PolicyCurrent object
+ CORBA::Object_var tmp =
+ this->orb_->resolve_initial_references ("PolicyCurrent"
+ ACE_ENV_ARG_PARAMETER);
+ ACE_TRY_CHECK;
+
+ this->policy_current_ =
+ CORBA::PolicyCurrent::_narrow (tmp.in ()
+ ACE_ENV_ARG_PARAMETER);
+ ACE_TRY_CHECK;
+
+ // Timeout for polling state (default = 10 msec)
+ TimeBase::TimeT timeout = timeout_.usec() * 10;
+ CORBA::Any any;
+ any <<= timeout;
+
+ this->policy_list_.length (1);
+ this->policy_list_[0] =
+ this->orb_->create_policy (
+ Messaging::RELATIVE_RT_TIMEOUT_POLICY_TYPE,
+ any
+ ACE_ENV_ARG_PARAMETER);
+ ACE_TRY_CHECK;
+
+ // Only schedule the timer, when the rate is not zero
+ if (this->rate_ != ACE_Time_Value::zero)
+ {
+ // Schedule the timer after these policies has been set, because the
+ // handle_timeout uses these policies, if done in front, the channel
+ // can crash when the timeout expires before initiazation is ready.
+ timer_id_ = this->reactor_->schedule_timer (&this->adapter_,
+ 0,
+ this->rate_,
+ this->rate_);
+ if (timer_id_ == -1)
+ return -1;
+ }
+ }
+ ACE_CATCHANY
+ {
+ return -1;
+ }
+ ACE_ENDTRY;
+#endif /* TAO_HAS_CORBA_MESSAGING */
+
+ return 0;
+}
+
+int
+TAO_EC_Reactive_ConsumerControl::shutdown (void)
+{
+ int r = 0;
+
+#if defined (TAO_HAS_CORBA_MESSAGING) && TAO_HAS_CORBA_MESSAGING != 0
+ r = this->reactor_->cancel_timer (timer_id_);
+#endif /* TAO_HAS_CORBA_MESSAGING */
+ this->adapter_.reactor (0);
+ return r;
+}
+
+void
+TAO_EC_Reactive_ConsumerControl::consumer_not_exist (
+ TAO_EC_ProxyPushSupplier *proxy
+ ACE_ENV_ARG_DECL)
+{
+ ACE_TRY
+ {
+ //ACE_DEBUG ((LM_DEBUG,
+ // "EC_Reactive_ConsumerControl(%P|%t) - "
+ // "Consumer %x does not exists\n", long(proxy)));
+ proxy->disconnect_push_supplier (ACE_ENV_SINGLE_ARG_PARAMETER);
+ ACE_TRY_CHECK;
+ }
+ ACE_CATCHANY
+ {
+ ACE_PRINT_EXCEPTION (ACE_ANY_EXCEPTION,
+ "Reactive_ConsumerControl::consumer_not_exist");
+ // Ignore all exceptions..
+ }
+ ACE_ENDTRY;
+}
+
+void
+TAO_EC_Reactive_ConsumerControl::system_exception (
+ TAO_EC_ProxyPushSupplier *proxy,
+ CORBA::SystemException & /* exception */
+ ACE_ENV_ARG_DECL)
+{
+ ACE_TRY
+ {
+ // The current implementation is very strict, and kicks out a
+ // client on the first system exception. We may
+ // want to be more lenient in the future, for example,
+ // this is TAO's minor code for a failed connection.
+ //
+ // if (CORBA::TRANSIENT::_narrow (&exception) != 0
+ // && exception->minor () == 0x54410085)
+ // return;
+
+ // Anything else is serious, including timeouts...
+ proxy->disconnect_push_supplier (ACE_ENV_SINGLE_ARG_PARAMETER);
+ ACE_TRY_CHECK;
+ }
+ ACE_CATCHANY
+ {
+ // Ignore all exceptions..
+ }
+ ACE_ENDTRY;
+}
+
+// ****************************************************************
+
+TAO_EC_ConsumerControl_Adapter::TAO_EC_ConsumerControl_Adapter (
+ TAO_EC_Reactive_ConsumerControl *adaptee)
+ : adaptee_ (adaptee)
+{
+}
+
+int
+TAO_EC_ConsumerControl_Adapter::handle_timeout (
+ const ACE_Time_Value &tv,
+ const void *arg)
+{
+ this->adaptee_->handle_timeout (tv, arg);
+ return 0;
+}
+
+// ****************************************************************
+
+void
+TAO_EC_Ping_Consumer::work (TAO_EC_ProxyPushSupplier *supplier
+ ACE_ENV_ARG_DECL)
+{
+ ACE_TRY
+ {
+ CORBA::Boolean disconnected;
+ CORBA::Boolean non_existent =
+ supplier->consumer_non_existent (disconnected
+ ACE_ENV_ARG_PARAMETER);
+ ACE_TRY_CHECK;
+ if (non_existent && !disconnected)
+ {
+ this->control_->consumer_not_exist (supplier ACE_ENV_ARG_PARAMETER);
+ ACE_TRY_CHECK;
+ }
+ }
+ ACE_CATCH (CORBA::OBJECT_NOT_EXIST, ex)
+ {
+ this->control_->consumer_not_exist (supplier ACE_ENV_ARG_PARAMETER);
+ ACE_TRY_CHECK;
+ }
+ ACE_CATCH (CORBA::TRANSIENT, transient)
+ {
+ // This is TAO's minor code for a failed connection, we may
+ // want to be more lenient in the future..
+ // if (transient.minor () == 0x54410085)
+ this->control_->consumer_not_exist (supplier ACE_ENV_ARG_PARAMETER);
+ ACE_TRY_CHECK;
+ }
+ ACE_CATCHANY
+ {
+ // Ignore all exceptions
+ }
+ ACE_ENDTRY;
+}
+
+TAO_END_VERSIONED_NAMESPACE_DECL
diff --git a/TAO/orbsvcs/orbsvcs/Event/EC_Reactive_ConsumerControl.h b/TAO/orbsvcs/orbsvcs/Event/EC_Reactive_ConsumerControl.h
new file mode 100644
index 00000000000..d6e8cf176d5
--- /dev/null
+++ b/TAO/orbsvcs/orbsvcs/Event/EC_Reactive_ConsumerControl.h
@@ -0,0 +1,155 @@
+// -*- C++ -*-
+/**
+ * @file EC_Reactive_ConsumerControl.h
+ *
+ * $Id$
+ *
+ * @author Carlos O'Ryan (coryan@cs.wustl.edu)
+ *
+ * Based on previous work by Tim Harrison (harrison@cs.wustl.edu) and
+ * other members of the DOC group. More details can be found in:
+ *
+ * http://doc.ece.uci.edu/~coryan/EC/index.html
+ */
+
+#ifndef TAO_EC_REACTIVE_CONSUMERCONTROL_H
+#define TAO_EC_REACTIVE_CONSUMERCONTROL_H
+
+#include /**/ "ace/pre.h"
+
+#include "orbsvcs/Event/EC_ConsumerControl.h"
+
+#if !defined (ACE_LACKS_PRAGMA_ONCE)
+# pragma once
+#endif /* ACE_LACKS_PRAGMA_ONCE */
+
+#include "orbsvcs/ESF/ESF_Worker.h"
+
+#include "tao/ORB.h"
+#include "tao/PolicyC.h"
+
+#include "ace/Event_Handler.h"
+
+TAO_BEGIN_VERSIONED_NAMESPACE_DECL
+
+class TAO_EC_Event_Channel_Base;
+
+class TAO_EC_Reactive_ConsumerControl;
+
+/**
+ * @class TAO_EC_ConsumerControl_Adapter
+ *
+ * @brief Forwards timeout events to the Reactive ConsumerControl
+ *
+ * The Reactive ConsumerControl strategy uses the reactor to
+ * periodically wakeup and verify the state of the consumers
+ * registered with the Event Channel.
+ */
+class TAO_RTEvent_Serv_Export TAO_EC_ConsumerControl_Adapter : public ACE_Event_Handler
+{
+public:
+ /// Constructor
+ TAO_EC_ConsumerControl_Adapter (TAO_EC_Reactive_ConsumerControl *adaptee);
+
+ // = Documented in ACE_Event_Handler.
+ virtual int handle_timeout (const ACE_Time_Value &tv,
+ const void *arg = 0);
+
+private:
+ /// The adapted object
+ TAO_EC_Reactive_ConsumerControl *adaptee_;
+};
+
+/**
+ * @class TAO_EC_Reactive_ConsumerControl
+ *
+ * @brief ConsumerControl
+ *
+ * Defines the interface for the consumer control strategy.
+ * This strategy handles misbehaving or failing consumers.
+ */
+class TAO_RTEvent_Serv_Export TAO_EC_Reactive_ConsumerControl : public TAO_EC_ConsumerControl
+{
+public:
+ /// Constructor. It does not assume ownership of the @a event_channel
+ /// parameter.
+ TAO_EC_Reactive_ConsumerControl (const ACE_Time_Value &rate,
+ const ACE_Time_Value &timeout,
+ TAO_EC_Event_Channel_Base *event_channel,
+ CORBA::ORB_ptr orb);
+
+ /// Destructor.
+ virtual ~TAO_EC_Reactive_ConsumerControl (void);
+
+ /// Receive the timeout from the adapter
+ void handle_timeout (const ACE_Time_Value &tv,
+ const void* arg);
+
+ // = Documented in TAO_EC_ConsumerControl
+ virtual int activate (void);
+ virtual int shutdown (void);
+ virtual void consumer_not_exist (TAO_EC_ProxyPushSupplier *proxy
+ ACE_ENV_ARG_DECL_NOT_USED);
+ virtual void system_exception (TAO_EC_ProxyPushSupplier *proxy,
+ CORBA::SystemException &
+ ACE_ENV_ARG_DECL_NOT_USED);
+
+private:
+ /// Check if the consumers still exists. It is a helper method for
+ /// handle_timeout() to isolate the exceptions.
+ void query_consumers (ACE_ENV_SINGLE_ARG_DECL);
+
+private:
+ /// The polling rate
+ ACE_Time_Value rate_;
+
+ /// The polling timeout
+ ACE_Time_Value timeout_;
+
+ /// The Adapter for the reactor events
+ TAO_EC_ConsumerControl_Adapter adapter_;
+
+ /// The event channel
+ TAO_EC_Event_Channel_Base *event_channel_;
+
+ /// The ORB
+ CORBA::ORB_var orb_;
+
+ /// To control the timeout policy in the thread
+ CORBA::PolicyCurrent_var policy_current_;
+
+ /// Precomputed policy list to the set timeout.
+ CORBA::PolicyList policy_list_;
+
+ /// The ORB reactor
+ ACE_Reactor *reactor_;
+
+#if defined (TAO_HAS_CORBA_MESSAGING) && TAO_HAS_CORBA_MESSAGING != 0
+ /// The timer id
+ long timer_id_;
+#endif /* TAO_HAS_CORBA_MESSAGING */
+};
+
+// ****************************************************************
+
+class TAO_EC_Ping_Consumer : public TAO_ESF_Worker<TAO_EC_ProxyPushSupplier>
+{
+public:
+ TAO_EC_Ping_Consumer (TAO_EC_ConsumerControl *control);
+
+ virtual void work (TAO_EC_ProxyPushSupplier *supplier
+ ACE_ENV_ARG_DECL);
+
+private:
+ TAO_EC_ConsumerControl *control_;
+};
+
+TAO_END_VERSIONED_NAMESPACE_DECL
+
+#if defined (__ACE_INLINE__)
+#include "orbsvcs/Event/EC_Reactive_ConsumerControl.i"
+#endif /* __ACE_INLINE__ */
+
+#include /**/ "ace/post.h"
+
+#endif /* TAO_EC_CONSUMERCONTROL_H */
diff --git a/TAO/orbsvcs/orbsvcs/Event/EC_Reactive_ConsumerControl.i b/TAO/orbsvcs/orbsvcs/Event/EC_Reactive_ConsumerControl.i
new file mode 100644
index 00000000000..d365ca2ae4d
--- /dev/null
+++ b/TAO/orbsvcs/orbsvcs/Event/EC_Reactive_ConsumerControl.i
@@ -0,0 +1,13 @@
+// -*- C++ -*-
+//
+// $Id$
+
+TAO_BEGIN_VERSIONED_NAMESPACE_DECL
+
+ACE_INLINE
+TAO_EC_Ping_Consumer::TAO_EC_Ping_Consumer (TAO_EC_ConsumerControl *control)
+ : control_ (control)
+{
+}
+
+TAO_END_VERSIONED_NAMESPACE_DECL
diff --git a/TAO/orbsvcs/orbsvcs/Event/EC_Reactive_Dispatching.cpp b/TAO/orbsvcs/orbsvcs/Event/EC_Reactive_Dispatching.cpp
new file mode 100644
index 00000000000..eb7b1bd5b7d
--- /dev/null
+++ b/TAO/orbsvcs/orbsvcs/Event/EC_Reactive_Dispatching.cpp
@@ -0,0 +1,45 @@
+// $Id$
+
+#include "orbsvcs/Event/EC_Reactive_Dispatching.h"
+#include "orbsvcs/Event/EC_ProxySupplier.h"
+
+ACE_RCSID(Event, EC_Reactive_Dispatching, "$Id$")
+
+TAO_BEGIN_VERSIONED_NAMESPACE_DECL
+
+TAO_EC_Reactive_Dispatching::TAO_EC_Reactive_Dispatching (void)
+ : TAO_EC_Dispatching ()
+{
+}
+
+void
+TAO_EC_Reactive_Dispatching::activate (void)
+{
+}
+
+void
+TAO_EC_Reactive_Dispatching::shutdown (void)
+{
+}
+
+void
+TAO_EC_Reactive_Dispatching::push (TAO_EC_ProxyPushSupplier* proxy,
+ RtecEventComm::PushConsumer_ptr consumer,
+ const RtecEventComm::EventSet& event,
+ TAO_EC_QOS_Info&
+ ACE_ENV_ARG_DECL)
+{
+ proxy->reactive_push_to_consumer (consumer, event ACE_ENV_ARG_PARAMETER);
+}
+
+void
+TAO_EC_Reactive_Dispatching::push_nocopy (TAO_EC_ProxyPushSupplier* proxy,
+ RtecEventComm::PushConsumer_ptr consumer,
+ RtecEventComm::EventSet& event,
+ TAO_EC_QOS_Info&
+ ACE_ENV_ARG_DECL)
+{
+ proxy->reactive_push_to_consumer (consumer, event ACE_ENV_ARG_PARAMETER);
+}
+
+TAO_END_VERSIONED_NAMESPACE_DECL
diff --git a/TAO/orbsvcs/orbsvcs/Event/EC_Reactive_Dispatching.h b/TAO/orbsvcs/orbsvcs/Event/EC_Reactive_Dispatching.h
new file mode 100644
index 00000000000..0ef3be3bedb
--- /dev/null
+++ b/TAO/orbsvcs/orbsvcs/Event/EC_Reactive_Dispatching.h
@@ -0,0 +1,65 @@
+// -*- C++ -*-
+
+/**
+ * @file EC_Reactive_Dispatching.h
+ *
+ * $Id$
+ *
+ * @author Carlos O'Ryan (coryan@cs.wustl.edu)
+ *
+ * Based on previous work by Tim Harrison (harrison@cs.wustl.edu) and
+ * other members of the DOC group. More details can be found in:
+ *
+ * http://doc.ece.uci.edu/~coryan/EC/index.html
+ */
+
+#ifndef TAO_EC_REACTIVE_DISPATCHING_H
+#define TAO_EC_REACTIVE_DISPATCHING_H
+
+#include /**/ "ace/pre.h"
+
+#include "orbsvcs/Event/EC_Dispatching.h"
+
+#include /**/ "orbsvcs/Event/event_serv_export.h"
+
+#if !defined (ACE_LACKS_PRAGMA_ONCE)
+# pragma once
+#endif /* ACE_LACKS_PRAGMA_ONCE */
+
+TAO_BEGIN_VERSIONED_NAMESPACE_DECL
+
+/**
+ * @class TAO_EC_Reactive_Dispatching
+ *
+ * @brief Dispatch using the caller thread.
+ *
+ * The events are dispatched in FIFO ordering, using the invoking
+ * thread to push the event to the consumer.
+ */
+class TAO_RTEvent_Serv_Export TAO_EC_Reactive_Dispatching : public TAO_EC_Dispatching
+{
+public:
+ /// The scheduler is used to find the range of priorities and similar
+ /// info.
+ TAO_EC_Reactive_Dispatching (void);
+
+ // = The EC_Dispatching methods.
+ virtual void activate (void);
+ virtual void shutdown (void);
+ virtual void push (TAO_EC_ProxyPushSupplier *proxy,
+ RtecEventComm::PushConsumer_ptr consumer,
+ const RtecEventComm::EventSet &event,
+ TAO_EC_QOS_Info &qos_info
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS);
+ virtual void push_nocopy (TAO_EC_ProxyPushSupplier *proxy,
+ RtecEventComm::PushConsumer_ptr consumer,
+ RtecEventComm::EventSet &event,
+ TAO_EC_QOS_Info &qos_info
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS);
+};
+
+TAO_END_VERSIONED_NAMESPACE_DECL
+
+#include /**/ "ace/post.h"
+
+#endif /* TAO_EC_REACTIVE_DISPATCHING_H */
diff --git a/TAO/orbsvcs/orbsvcs/Event/EC_Reactive_SupplierControl.cpp b/TAO/orbsvcs/orbsvcs/Event/EC_Reactive_SupplierControl.cpp
new file mode 100644
index 00000000000..10cdcd05bdb
--- /dev/null
+++ b/TAO/orbsvcs/orbsvcs/Event/EC_Reactive_SupplierControl.cpp
@@ -0,0 +1,266 @@
+// $Id$
+
+#include "orbsvcs/Event/EC_SupplierAdmin.h"
+#include "orbsvcs/Event/EC_Reactive_SupplierControl.h"
+#include "orbsvcs/Event/EC_Event_Channel_Base.h"
+#include "orbsvcs/Event/EC_ProxyConsumer.h"
+#include "orbsvcs/Event/EC_ProxySupplier.h" // @@ MSVC 6 bug
+
+#include "tao/Messaging/Messaging.h"
+#include "tao/ORB_Core.h"
+
+#include "ace/Reactor.h"
+
+#if ! defined (__ACE_INLINE__)
+#include "orbsvcs/Event/EC_Reactive_SupplierControl.i"
+#endif /* __ACE_INLINE__ */
+
+ACE_RCSID(Event, EC_Reactive_SupplierControl, "$Id$")
+
+TAO_BEGIN_VERSIONED_NAMESPACE_DECL
+
+TAO_EC_Reactive_SupplierControl::
+ TAO_EC_Reactive_SupplierControl (const ACE_Time_Value &rate,
+ const ACE_Time_Value &timeout,
+ TAO_EC_Event_Channel_Base *ec,
+ CORBA::ORB_ptr orb)
+ : rate_ (rate),
+ timeout_ (timeout),
+ adapter_ (this),
+ event_channel_ (ec),
+ orb_ (CORBA::ORB::_duplicate (orb))
+#if defined (TAO_HAS_CORBA_MESSAGING) && TAO_HAS_CORBA_MESSAGING != 0
+ , timer_id_ (-1)
+#endif /* TAO_HAS_CORBA_MESSAGING != 0*/
+{
+ this->reactor_ =
+ this->orb_->orb_core ()->reactor ();
+}
+
+TAO_EC_Reactive_SupplierControl::~TAO_EC_Reactive_SupplierControl (void)
+{
+}
+
+void
+TAO_EC_Reactive_SupplierControl::query_suppliers (
+ ACE_ENV_SINGLE_ARG_DECL)
+{
+ TAO_EC_Ping_Supplier worker (this);
+ this->event_channel_->for_each_supplier (&worker
+ ACE_ENV_ARG_PARAMETER);
+ ACE_CHECK;
+}
+
+void
+TAO_EC_Reactive_SupplierControl::handle_timeout (
+ const ACE_Time_Value &,
+ const void *)
+{
+ ACE_TRY_NEW_ENV
+ {
+ // Query the state of the Current object *before* we initiate
+ // the iteration...
+ CORBA::PolicyTypeSeq types;
+ CORBA::PolicyList_var policies =
+ this->policy_current_->get_policy_overrides (types
+ ACE_ENV_ARG_PARAMETER);
+ ACE_TRY_CHECK;
+
+ // Change the timeout
+ this->policy_current_->set_policy_overrides (this->policy_list_,
+ CORBA::ADD_OVERRIDE
+ ACE_ENV_ARG_PARAMETER);
+ ACE_TRY_CHECK;
+
+ // Query the state of the suppliers...
+ this->query_suppliers (ACE_ENV_SINGLE_ARG_PARAMETER);
+ ACE_TRY_CHECK;
+
+ this->policy_current_->set_policy_overrides (policies.in (),
+ CORBA::SET_OVERRIDE
+ ACE_ENV_ARG_PARAMETER);
+ ACE_TRY_CHECK;
+ for (CORBA::ULong i = 0; i != policies->length (); ++i)
+ {
+ policies[i]->destroy (ACE_ENV_SINGLE_ARG_PARAMETER);
+ ACE_TRY_CHECK;
+ }
+ }
+ ACE_CATCHANY
+ {
+ // Ignore all exceptions
+ }
+ ACE_ENDTRY;
+}
+
+int
+TAO_EC_Reactive_SupplierControl::activate (void)
+{
+#if defined (TAO_HAS_CORBA_MESSAGING) && TAO_HAS_CORBA_MESSAGING != 0
+ ACE_TRY_NEW_ENV
+ {
+ // Get the PolicyCurrent object
+ CORBA::Object_var tmp =
+ this->orb_->resolve_initial_references ("PolicyCurrent"
+ ACE_ENV_ARG_PARAMETER);
+ ACE_TRY_CHECK;
+
+ this->policy_current_ =
+ CORBA::PolicyCurrent::_narrow (tmp.in ()
+ ACE_ENV_ARG_PARAMETER);
+ ACE_TRY_CHECK;
+
+ // Timeout for polling state (default = 10 msec)
+ TimeBase::TimeT timeout = timeout_.usec() * 10;
+ CORBA::Any any;
+ any <<= timeout;
+
+ this->policy_list_.length (1);
+ this->policy_list_[0] =
+ this->orb_->create_policy (
+ Messaging::RELATIVE_RT_TIMEOUT_POLICY_TYPE,
+ any
+ ACE_ENV_ARG_PARAMETER);
+ ACE_TRY_CHECK;
+
+ // Only schedule the timer, when the rate is not zero
+ if (this->rate_ != ACE_Time_Value::zero)
+ {
+ // Schedule the timer after these policies has been set, because the
+ // handle_timeout uses these policies, if done in front, the channel
+ // can crash when the timeout expires before initiazation is ready.
+ timer_id_ = this->reactor_->schedule_timer (&this->adapter_,
+ 0,
+ this->rate_,
+ this->rate_);
+ if (timer_id_ == -1)
+ return -1;
+ }
+ }
+ ACE_CATCHANY
+ {
+ return -1;
+ }
+ ACE_ENDTRY;
+#endif /* TAO_HAS_CORBA_MESSAGING */
+
+ return 0;
+}
+
+int
+TAO_EC_Reactive_SupplierControl::shutdown (void)
+{
+ int r = 0;
+
+#if defined (TAO_HAS_CORBA_MESSAGING) && TAO_HAS_CORBA_MESSAGING != 0
+ r = this->reactor_->cancel_timer (timer_id_);
+#endif /* TAO_HAS_CORBA_MESSAGING */
+ this->adapter_.reactor (0);
+ return r;
+}
+
+void
+TAO_EC_Reactive_SupplierControl::supplier_not_exist (
+ TAO_EC_ProxyPushConsumer *proxy
+ ACE_ENV_ARG_DECL)
+{
+ ACE_TRY
+ {
+ //ACE_DEBUG ((LM_DEBUG,
+ // "EC_Reactive_SupplierControl(%P|%t) - "
+ // "Consumer %x does not exists\n", long(proxy)));
+ proxy->disconnect_push_consumer (ACE_ENV_SINGLE_ARG_PARAMETER);
+ ACE_TRY_CHECK;
+ }
+ ACE_CATCHANY
+ {
+ // Ignore all exceptions..
+ }
+ ACE_ENDTRY;
+}
+
+void
+TAO_EC_Reactive_SupplierControl::system_exception (
+ TAO_EC_ProxyPushConsumer *proxy,
+ CORBA::SystemException & /* exception */
+ ACE_ENV_ARG_DECL)
+{
+ ACE_TRY
+ {
+ // The current implementation is very strict, and kicks out a
+ // client on the first system exception. We may
+ // want to be more lenient in the future, for example,
+ // this is TAO's minor code for a failed connection.
+ //
+ // if (CORBA::TRANSIENT::_narrow (&exception) != 0
+ // && exception->minor () == 0x54410085)
+ // return;
+
+ // Anything else is serious, including timeouts...
+ proxy->disconnect_push_consumer (ACE_ENV_SINGLE_ARG_PARAMETER);
+ ACE_TRY_CHECK;
+ }
+ ACE_CATCHANY
+ {
+ // Ignore all exceptions..
+ }
+ ACE_ENDTRY;
+}
+
+// ****************************************************************
+
+TAO_EC_SupplierControl_Adapter::TAO_EC_SupplierControl_Adapter (
+ TAO_EC_Reactive_SupplierControl *adaptee)
+ : adaptee_ (adaptee)
+{
+}
+
+int
+TAO_EC_SupplierControl_Adapter::handle_timeout (
+ const ACE_Time_Value &tv,
+ const void *arg)
+{
+ this->adaptee_->handle_timeout (tv, arg);
+ return 0;
+}
+
+// ****************************************************************
+
+void
+TAO_EC_Ping_Supplier::work (TAO_EC_ProxyPushConsumer *consumer
+ ACE_ENV_ARG_DECL)
+{
+ ACE_TRY
+ {
+ CORBA::Boolean disconnected;
+ CORBA::Boolean non_existent =
+ consumer->supplier_non_existent (disconnected
+ ACE_ENV_ARG_PARAMETER);
+ ACE_TRY_CHECK;
+ if (non_existent && !disconnected)
+ {
+ this->control_->supplier_not_exist (consumer ACE_ENV_ARG_PARAMETER);
+ ACE_TRY_CHECK;
+ }
+ }
+ ACE_CATCH (CORBA::OBJECT_NOT_EXIST, ex)
+ {
+ this->control_->supplier_not_exist (consumer ACE_ENV_ARG_PARAMETER);
+ ACE_TRY_CHECK;
+ }
+ ACE_CATCH (CORBA::TRANSIENT, transient)
+ {
+ // This is TAO's minor code for a failed connection, we may
+ // want to be more lenient in the future..
+ // if (transient.minor () == 0x54410085)
+ this->control_->supplier_not_exist (consumer ACE_ENV_ARG_PARAMETER);
+ ACE_TRY_CHECK;
+ }
+ ACE_CATCHANY
+ {
+ // Ignore all exceptions
+ }
+ ACE_ENDTRY;
+}
+
+TAO_END_VERSIONED_NAMESPACE_DECL
diff --git a/TAO/orbsvcs/orbsvcs/Event/EC_Reactive_SupplierControl.h b/TAO/orbsvcs/orbsvcs/Event/EC_Reactive_SupplierControl.h
new file mode 100644
index 00000000000..141ddf9668c
--- /dev/null
+++ b/TAO/orbsvcs/orbsvcs/Event/EC_Reactive_SupplierControl.h
@@ -0,0 +1,166 @@
+// -*- C++ -*-
+
+/**
+ * @file EC_Reactive_SupplierControl.h
+ *
+ * $Id$
+ *
+ * @author Carlos O'Ryan (coryan@cs.wustl.edu)
+ *
+ * Based on previous work by Tim Harrison (harrison@cs.wustl.edu) and
+ * other members of the DOC group. More details can be found in:
+ *
+ * http://doc.ece.uci.edu/~coryan/EC/index.html
+ */
+
+#ifndef TAO_EC_REACTIVE_SUPPLIERCONTROL_H
+#define TAO_EC_REACTIVE_SUPPLIERCONTROL_H
+
+#include /**/ "ace/pre.h"
+
+#include "orbsvcs/Event/EC_SupplierControl.h"
+
+#include "orbsvcs/ESF/ESF_Worker.h"
+
+#if !defined (ACE_LACKS_PRAGMA_ONCE)
+# pragma once
+#endif /* ACE_LACKS_PRAGMA_ONCE */
+
+#include "tao/ORB.h"
+#include "tao/PolicyC.h"
+
+#include "ace/Event_Handler.h"
+
+TAO_BEGIN_VERSIONED_NAMESPACE_DECL
+
+class TAO_EC_Event_Channel_Base;
+
+class TAO_EC_Reactive_SupplierControl;
+
+/**
+ * @class TAO_EC_SupplierControl_Adapter
+ *
+ * @brief Forwards timeout events to the Reactive SupplierControl
+ *
+ * The Reactive SupplierControl strategy uses the reactor to
+ * periodically wakeup and verify the state of the suppliers
+ * registered with the Event Channel.
+ *
+ * @todo Marina Spivak made the following observation: these classes
+ * and implementation seem nearly identical to those in
+ * EC_Reactive_ConsumerControl.* The only differences are using
+ * consumer_admin collection vs supplier_admin, and calling
+ * disconnect_push_consumer vs disconnect_push_supplier ... Seems
+ * like it may be a good idea to change some naming and templatize...
+ * @todo The same templates should be used for the Notification and
+ * COS Event services.
+ *
+ */
+class TAO_RTEvent_Serv_Export TAO_EC_SupplierControl_Adapter : public ACE_Event_Handler
+{
+public:
+ /// Constructor
+ TAO_EC_SupplierControl_Adapter (TAO_EC_Reactive_SupplierControl *adaptee);
+
+ // = Documented in ACE_Event_Handler.
+ virtual int handle_timeout (const ACE_Time_Value &tv,
+ const void *arg = 0);
+
+private:
+ /// The adapted object
+ TAO_EC_Reactive_SupplierControl *adaptee_;
+};
+
+/**
+ * @class TAO_EC_Reactive_SupplierControl
+ *
+ * @brief SupplierControl
+ *
+ * Defines the interface for the supplier control strategy.
+ * This strategy handles misbehaving or failing suppliers.
+ */
+class TAO_RTEvent_Serv_Export TAO_EC_Reactive_SupplierControl : public TAO_EC_SupplierControl
+{
+public:
+ /// Constructor. It does not assume ownership of the @a event_channel
+ /// parameter.
+ TAO_EC_Reactive_SupplierControl (const ACE_Time_Value &rate,
+ const ACE_Time_Value &timeout,
+ TAO_EC_Event_Channel_Base *event_channel,
+ CORBA::ORB_ptr orb);
+
+ /// Destructor.
+ virtual ~TAO_EC_Reactive_SupplierControl (void);
+
+ /// Receive the timeout from the adapter
+ void handle_timeout (const ACE_Time_Value &tv,
+ const void* arg);
+
+ // = Documented in TAO_EC_SupplierControl
+ virtual int activate (void);
+ virtual int shutdown (void);
+ virtual void supplier_not_exist (TAO_EC_ProxyPushConsumer *proxy
+ ACE_ENV_ARG_DECL_NOT_USED);
+ virtual void system_exception (TAO_EC_ProxyPushConsumer *proxy,
+ CORBA::SystemException &
+ ACE_ENV_ARG_DECL_NOT_USED);
+
+private:
+ /// Check if the suppliers still exists. It is a helper method for
+ /// handle_timeout() to isolate the exceptions.
+ void query_suppliers (ACE_ENV_SINGLE_ARG_DECL);
+
+private:
+ /// The polling rate
+ ACE_Time_Value rate_;
+
+ /// The polling timeout
+ ACE_Time_Value timeout_;
+
+ /// The Adapter for the reactor events
+ TAO_EC_SupplierControl_Adapter adapter_;
+
+ /// The event channel
+ TAO_EC_Event_Channel_Base *event_channel_;
+
+ /// The ORB
+ CORBA::ORB_var orb_;
+
+ /// To control the timeout policy in the thread
+ CORBA::PolicyCurrent_var policy_current_;
+
+ /// Precomputed policy list to the set timeout.
+ CORBA::PolicyList policy_list_;
+
+ /// The ORB reactor
+ ACE_Reactor *reactor_;
+
+#if defined (TAO_HAS_CORBA_MESSAGING) && TAO_HAS_CORBA_MESSAGING != 0
+ /// The timer id
+ long timer_id_;
+#endif /* TAO_HAS_CORBA_MESSAGING */
+};
+
+// ****************************************************************
+
+class TAO_EC_Ping_Supplier : public TAO_ESF_Worker<TAO_EC_ProxyPushConsumer>
+{
+public:
+ TAO_EC_Ping_Supplier (TAO_EC_SupplierControl *control);
+
+ virtual void work (TAO_EC_ProxyPushConsumer *consumer
+ ACE_ENV_ARG_DECL);
+
+private:
+ TAO_EC_SupplierControl *control_;
+};
+
+TAO_END_VERSIONED_NAMESPACE_DECL
+
+#if defined (__ACE_INLINE__)
+#include "orbsvcs/Event/EC_Reactive_SupplierControl.i"
+#endif /* __ACE_INLINE__ */
+
+#include /**/ "ace/post.h"
+
+#endif /* TAO_EC_SUPPLIERCONTROL_H */
diff --git a/TAO/orbsvcs/orbsvcs/Event/EC_Reactive_SupplierControl.i b/TAO/orbsvcs/orbsvcs/Event/EC_Reactive_SupplierControl.i
new file mode 100644
index 00000000000..3ffaf226464
--- /dev/null
+++ b/TAO/orbsvcs/orbsvcs/Event/EC_Reactive_SupplierControl.i
@@ -0,0 +1,13 @@
+// -*- C++ -*-
+//
+// $Id$
+
+TAO_BEGIN_VERSIONED_NAMESPACE_DECL
+
+ACE_INLINE
+TAO_EC_Ping_Supplier::TAO_EC_Ping_Supplier (TAO_EC_SupplierControl *control)
+ : control_ (control)
+{
+}
+
+TAO_END_VERSIONED_NAMESPACE_DECL
diff --git a/TAO/orbsvcs/orbsvcs/Event/EC_Reactive_Timeout_Generator.cpp b/TAO/orbsvcs/orbsvcs/Event/EC_Reactive_Timeout_Generator.cpp
new file mode 100644
index 00000000000..fbdfb022768
--- /dev/null
+++ b/TAO/orbsvcs/orbsvcs/Event/EC_Reactive_Timeout_Generator.cpp
@@ -0,0 +1,56 @@
+// $Id$
+
+#include "orbsvcs/Event/EC_Reactive_Timeout_Generator.h"
+#include "ace/Reactor.h"
+
+ACE_RCSID (Event,
+ EC_Reactive_Timeout_Generator,
+ "$Id$")
+
+TAO_BEGIN_VERSIONED_NAMESPACE_DECL
+
+TAO_EC_Reactive_Timeout_Generator::
+ TAO_EC_Reactive_Timeout_Generator (ACE_Reactor *reactor)
+ : reactor_ (reactor)
+{
+}
+
+TAO_EC_Reactive_Timeout_Generator::~TAO_EC_Reactive_Timeout_Generator (void)
+{
+}
+
+void
+TAO_EC_Reactive_Timeout_Generator::activate (void)
+{
+}
+
+void
+TAO_EC_Reactive_Timeout_Generator::shutdown (void)
+{
+ this->reactor_->cancel_timer (&this->event_handler_);
+ this->event_handler_.reactor (0);
+}
+
+int
+TAO_EC_Reactive_Timeout_Generator::schedule_timer (
+ TAO_EC_Timeout_Filter* filter,
+ const ACE_Time_Value& delta,
+ const ACE_Time_Value& interval)
+{
+ return this->reactor_->schedule_timer (&this->event_handler_,
+ static_cast<void*> (filter),
+ delta,
+ interval);
+}
+
+int
+TAO_EC_Reactive_Timeout_Generator::cancel_timer (
+ const TAO_EC_QOS_Info&,
+ int id)
+{
+ const void *vp;
+
+ return this->reactor_->cancel_timer (id, &vp);
+}
+
+TAO_END_VERSIONED_NAMESPACE_DECL
diff --git a/TAO/orbsvcs/orbsvcs/Event/EC_Reactive_Timeout_Generator.h b/TAO/orbsvcs/orbsvcs/Event/EC_Reactive_Timeout_Generator.h
new file mode 100644
index 00000000000..8ab4d18da31
--- /dev/null
+++ b/TAO/orbsvcs/orbsvcs/Event/EC_Reactive_Timeout_Generator.h
@@ -0,0 +1,70 @@
+// -*- C++ -*-
+
+/**
+ * @file EC_Reactive_Timeout_Generator.h
+ *
+ * $Id$
+ *
+ * @author Carlos O'Ryan (coryan@cs.wustl.edu)
+ *
+ * Based on previous work by Tim Harrison (harrison@cs.wustl.edu) and
+ * other members of the DOC group. More details can be found in:
+ *
+ * http://doc.ece.uci.edu/~coryan/EC/index.html
+ */
+
+#ifndef TAO_EC_REACTIVE_TIMEOUT_GENERATOR_H
+#define TAO_EC_REACTIVE_TIMEOUT_GENERATOR_H
+
+#include /**/ "ace/pre.h"
+
+#include "orbsvcs/Event/EC_Timeout_Generator.h"
+
+#if !defined (ACE_LACKS_PRAGMA_ONCE)
+# pragma once
+#endif /* ACE_LACKS_PRAGMA_ONCE */
+
+TAO_BEGIN_VERSIONED_NAMESPACE_DECL
+
+/**
+ * @class TAO_EC_Reactive_Timeout_Generator
+ *
+ * @brief A simple implementation of the Timeout_Generator based on the
+ * Reactor.
+ *
+ * Implements the Timeout_Generator using an ACE_Reactor. Usually
+ * the same reactor that is used by the ORB where the EC runs.
+ */
+class TAO_RTEvent_Serv_Export TAO_EC_Reactive_Timeout_Generator
+ : public TAO_EC_Timeout_Generator
+{
+public:
+ /// Constructor.
+ /// If <reactor> is 0 then we use the reactor in the ORB singleton.
+ TAO_EC_Reactive_Timeout_Generator (ACE_Reactor *reactor = 0);
+
+ /// destructor
+ virtual ~TAO_EC_Reactive_Timeout_Generator (void);
+
+ // = The TAO_EC_Timeout_Generator methods.
+ virtual void activate (void);
+ virtual void shutdown (void);
+ virtual int schedule_timer (TAO_EC_Timeout_Filter* filter,
+ const ACE_Time_Value& delta,
+ const ACE_Time_Value& interval);
+ virtual int cancel_timer (const TAO_EC_QOS_Info& info,
+ int id);
+
+private:
+ /// The reactor
+ ACE_Reactor *reactor_;
+
+ /// An adapter to receive the timeout events.
+ TAO_EC_Timeout_Adapter event_handler_;
+};
+
+TAO_END_VERSIONED_NAMESPACE_DECL
+
+#include /**/ "ace/post.h"
+
+#endif /* TAO_EC_REACTIVE_TIMEOUT_GENERATOR_H */
diff --git a/TAO/orbsvcs/orbsvcs/Event/EC_Sched_Factory.cpp b/TAO/orbsvcs/orbsvcs/Event/EC_Sched_Factory.cpp
new file mode 100644
index 00000000000..66c4afcc9ac
--- /dev/null
+++ b/TAO/orbsvcs/orbsvcs/Event/EC_Sched_Factory.cpp
@@ -0,0 +1,225 @@
+// $Id$
+
+#include "orbsvcs/Event/EC_Sched_Factory.h"
+#include "orbsvcs/Event/EC_Priority_Dispatching.h"
+#include "orbsvcs/Event/EC_Priority_Scheduling.h"
+#include "orbsvcs/Event/EC_Sched_Filter_Builder.h"
+#include "orbsvcs/Event/EC_Event_Channel_Base.h"
+#include "orbsvcs/RtecSchedulerC.h"
+
+#include "ace/Arg_Shifter.h"
+#include "ace/Sched_Params.h"
+#include "ace/OS_NS_strings.h"
+
+#if ! defined (__ACE_INLINE__)
+#include "orbsvcs/Event/EC_Sched_Factory.i"
+#endif /* __ACE_INLINE__ */
+
+ACE_RCSID(Event, EC_Sched_Factory, "$Id$")
+
+TAO_BEGIN_VERSIONED_NAMESPACE_DECL
+
+TAO_EC_Sched_Factory::~TAO_EC_Sched_Factory (void)
+{
+}
+
+int
+TAO_EC_Sched_Factory::init (int argc, ACE_TCHAR* argv[])
+{
+ ACE_Arg_Shifter arg_shifter (argc, argv);
+
+ while (arg_shifter.is_anything_left ())
+ {
+ const ACE_TCHAR* arg = arg_shifter.get_current ();
+
+ if (ACE_OS::strcasecmp (arg, ACE_TEXT("-ECDispatching")) == 0)
+ {
+ arg_shifter.consume_arg ();
+
+ if (arg_shifter.is_parameter_next ())
+ {
+ const ACE_TCHAR* opt = arg_shifter.get_current ();
+ if (ACE_OS::strcasecmp (opt, ACE_TEXT("reactive")) == 0)
+ {
+ this->dispatching_ = 0;
+ }
+ else if (ACE_OS::strcasecmp (opt, ACE_TEXT("mt")) == 0)
+ {
+ this->dispatching_ = 1;
+ }
+ else if (ACE_OS::strcasecmp (opt, ACE_TEXT("priority")) == 0)
+ {
+ this->dispatching_ = 2;
+ }
+ else
+ {
+ ACE_ERROR ((LM_ERROR,
+ ACE_TEXT("EC_Sched_Factory - ")
+ ACE_TEXT("unsupported dispatching <%s>\n"),
+ opt));
+ }
+ arg_shifter.consume_arg ();
+ }
+ }
+
+ else if (ACE_OS::strcasecmp (arg, ACE_TEXT("-ECFiltering")) == 0)
+ {
+ arg_shifter.consume_arg ();
+
+ if (arg_shifter.is_parameter_next ())
+ {
+ const ACE_TCHAR* opt = arg_shifter.get_current ();
+ if (ACE_OS::strcasecmp (opt, ACE_TEXT("null")) == 0)
+ {
+ this->filtering_ = 0;
+ }
+ else if (ACE_OS::strcasecmp (opt, ACE_TEXT("basic")) == 0)
+ {
+ this->filtering_ = 1;
+ }
+ else if (ACE_OS::strcasecmp (opt, ACE_TEXT("prefix")) == 0)
+ {
+ this->filtering_ = 2;
+ }
+ else if (ACE_OS::strcasecmp (opt, ACE_TEXT("priority")) == 0)
+ {
+ this->filtering_ = 3;
+ }
+ else
+ {
+ ACE_ERROR ((LM_ERROR,
+ ACE_TEXT("EC_Sched_Factory - ")
+ ACE_TEXT("unsupported filtering <%s>\n"),
+ opt));
+ }
+ arg_shifter.consume_arg ();
+ }
+ }
+
+ else if (ACE_OS::strcasecmp (arg, ACE_TEXT("-ECTimeout")) == 0)
+ {
+ arg_shifter.consume_arg ();
+
+ if (arg_shifter.is_parameter_next ())
+ {
+ const ACE_TCHAR* opt = arg_shifter.get_current ();
+ if (ACE_OS::strcasecmp (opt, ACE_TEXT("reactive")) == 0)
+ {
+ this->timeout_ = 0;
+ }
+#if 0
+ else if (ACE_OS::strcasecmp (opt, ACE_TEXT("priority")) == 0)
+ {
+ this->timeout_ = 1;
+ }
+#endif /* 0 */
+ else
+ {
+ ACE_ERROR ((LM_ERROR,
+ ACE_TEXT("EC_Sched_Factory - ")
+ ACE_TEXT("unsupported timeout <%s>\n"),
+ opt));
+ }
+ arg_shifter.consume_arg ();
+ }
+ }
+
+ else if (ACE_OS::strcasecmp (arg, ACE_TEXT("-ECScheduling")) == 0)
+ {
+ arg_shifter.consume_arg ();
+
+ if (arg_shifter.is_parameter_next ())
+ {
+ const ACE_TCHAR* opt = arg_shifter.get_current ();
+ if (ACE_OS::strcasecmp (opt, ACE_TEXT("null")) == 0)
+ {
+ this->scheduling_ = 0;
+ }
+ else if (ACE_OS::strcasecmp (opt, ACE_TEXT("group")) == 0)
+ {
+ this->scheduling_ = 1;
+ }
+ else if (ACE_OS::strcasecmp (opt, ACE_TEXT("priority")) == 0)
+ {
+ this->scheduling_ = 2;
+ }
+ else
+ {
+ ACE_ERROR ((LM_ERROR,
+ ACE_TEXT("EC_Sched_Factory - ")
+ ACE_TEXT("unsupported scheduling <%s>\n"),
+ opt));
+ }
+ arg_shifter.consume_arg ();
+ }
+ }
+
+ else
+ {
+ arg_shifter.ignore_arg ();
+ }
+ }
+ return this->TAO_EC_Default_Factory::init (argc, argv);
+}
+
+int
+TAO_EC_Sched_Factory::fini (void)
+{
+ return 0;
+}
+
+// ****************************************************************
+
+TAO_EC_Dispatching*
+TAO_EC_Sched_Factory::create_dispatching (TAO_EC_Event_Channel_Base *ec)
+{
+ if (this->dispatching_ == 2)
+ return new TAO_EC_Priority_Dispatching (ec);
+ return this->TAO_EC_Default_Factory::create_dispatching (ec);
+}
+
+TAO_EC_Filter_Builder*
+TAO_EC_Sched_Factory::create_filter_builder (TAO_EC_Event_Channel_Base *ec)
+{
+ if (this->filtering_ == 3)
+ return new TAO_EC_Sched_Filter_Builder (ec);
+
+ return this->TAO_EC_Default_Factory::create_filter_builder (ec);
+}
+
+
+TAO_EC_Timeout_Generator*
+TAO_EC_Sched_Factory::create_timeout_generator (TAO_EC_Event_Channel_Base *ec)
+{
+#if 0
+ if (this->timeout_ == 1)
+ {
+ }
+#endif
+ return this->TAO_EC_Default_Factory::create_timeout_generator (ec);
+}
+
+TAO_EC_Scheduling_Strategy*
+TAO_EC_Sched_Factory::create_scheduling_strategy (TAO_EC_Event_Channel_Base* ec)
+{
+ if (this->scheduling_ == 2)
+ {
+ CORBA::Object_var tmp = ec->scheduler ();
+ RtecScheduler::Scheduler_var scheduler =
+ RtecScheduler::Scheduler::_narrow (tmp.in ());
+ return new TAO_EC_Priority_Scheduling (scheduler.in ());
+ }
+ return this->TAO_EC_Sched_Factory::create_scheduling_strategy (ec);
+}
+
+TAO_END_VERSIONED_NAMESPACE_DECL
+
+// ****************************************************************
+
+ACE_STATIC_SVC_DEFINE (TAO_EC_Sched_Factory,
+ ACE_TEXT ("EC_Factory"),
+ ACE_SVC_OBJ_T,
+ &ACE_SVC_NAME (TAO_EC_Sched_Factory),
+ ACE_Service_Type::DELETE_THIS | ACE_Service_Type::DELETE_OBJ,
+ 0)
+ACE_FACTORY_DEFINE (TAO_RTSchedEvent, TAO_EC_Sched_Factory)
diff --git a/TAO/orbsvcs/orbsvcs/Event/EC_Sched_Factory.h b/TAO/orbsvcs/orbsvcs/Event/EC_Sched_Factory.h
new file mode 100644
index 00000000000..b7b82d791fc
--- /dev/null
+++ b/TAO/orbsvcs/orbsvcs/Event/EC_Sched_Factory.h
@@ -0,0 +1,71 @@
+// -*- C++ -*-
+/**
+ * @file EC_Sched_Factory.h
+ *
+ * $Id$
+ *
+ * @author Carlos O'Ryan (coryan@cs.wustl.edu)
+ *
+ * Based on previous work by Tim Harrison (harrison@cs.wustl.edu) and
+ * other members of the DOC group. More details can be found in:
+ *
+ * http://doc.ece.uci.edu/~coryan/EC/index.html
+ */
+
+#ifndef TAO_EC_SCHED_FACTORY_H
+#define TAO_EC_SCHED_FACTORY_H
+#include /**/ "ace/pre.h"
+
+#include "orbsvcs/Event/EC_Default_Factory.h"
+
+#if !defined (ACE_LACKS_PRAGMA_ONCE)
+# pragma once
+#endif /* ACE_LACKS_PRAGMA_ONCE */
+
+#include "orbsvcs/Event/sched_event_export.h"
+
+TAO_BEGIN_VERSIONED_NAMESPACE_DECL
+
+/**
+ * @class TAO_EC_Sched_Factory
+ *
+ * @brief Extend the default factory to support scheduling
+ *
+ */
+class TAO_RTSchedEvent_Export TAO_EC_Sched_Factory : public TAO_EC_Default_Factory
+{
+public:
+ /// Constructor
+ TAO_EC_Sched_Factory (void);
+
+ /// destructor...
+ virtual ~TAO_EC_Sched_Factory (void);
+
+ // = The Service_Object entry points
+ virtual int init (int argc, ACE_TCHAR* argv[]);
+ virtual int fini (void);
+
+ // = The EC_Factory methods
+ virtual TAO_EC_Dispatching*
+ create_dispatching (TAO_EC_Event_Channel_Base*);
+ virtual TAO_EC_Filter_Builder*
+ create_filter_builder (TAO_EC_Event_Channel_Base*);
+ virtual TAO_EC_Timeout_Generator*
+ create_timeout_generator (TAO_EC_Event_Channel_Base*);
+ virtual TAO_EC_Scheduling_Strategy*
+ create_scheduling_strategy (TAO_EC_Event_Channel_Base*);
+
+private:
+};
+
+TAO_END_VERSIONED_NAMESPACE_DECL
+
+#if defined (__ACE_INLINE__)
+#include "orbsvcs/Event/EC_Sched_Factory.i"
+#endif /* __ACE_INLINE__ */
+
+ACE_STATIC_SVC_DECLARE (TAO_EC_Sched_Factory)
+ACE_FACTORY_DECLARE (TAO_RTSchedEvent, TAO_EC_Sched_Factory)
+
+#include /**/ "ace/post.h"
+#endif /* TAO_EC_SCHED_FACTORY_H */
diff --git a/TAO/orbsvcs/orbsvcs/Event/EC_Sched_Factory.i b/TAO/orbsvcs/orbsvcs/Event/EC_Sched_Factory.i
new file mode 100644
index 00000000000..84cbe2d4a4d
--- /dev/null
+++ b/TAO/orbsvcs/orbsvcs/Event/EC_Sched_Factory.i
@@ -0,0 +1,13 @@
+// -*- C++ -*-
+//
+// $Id$
+
+TAO_BEGIN_VERSIONED_NAMESPACE_DECL
+
+ACE_INLINE
+TAO_EC_Sched_Factory::TAO_EC_Sched_Factory (void)
+ : TAO_EC_Default_Factory ()
+{
+}
+
+TAO_END_VERSIONED_NAMESPACE_DECL
diff --git a/TAO/orbsvcs/orbsvcs/Event/EC_Sched_Filter.cpp b/TAO/orbsvcs/orbsvcs/Event/EC_Sched_Filter.cpp
new file mode 100644
index 00000000000..3eb8e03e214
--- /dev/null
+++ b/TAO/orbsvcs/orbsvcs/Event/EC_Sched_Filter.cpp
@@ -0,0 +1,283 @@
+// $Id$
+
+#include "orbsvcs/Event/EC_Sched_Filter.h"
+#include "orbsvcs/Event/EC_QOS_Info.h"
+#include "ace/Log_Msg.h"
+
+ACE_RCSID(Event, EC_Sched_Filter, "$Id$")
+
+TAO_BEGIN_VERSIONED_NAMESPACE_DECL
+
+TAO_EC_Sched_Filter::
+ TAO_EC_Sched_Filter (const char* name,
+ RtecScheduler::handle_t rt_info,
+ RtecScheduler::Scheduler_ptr scheduler,
+ TAO_EC_Filter* body,
+ RtecScheduler::handle_t body_info,
+ RtecScheduler::handle_t parent_info,
+ RtecScheduler::Info_Type_t info_type)
+
+ : rt_info_ (rt_info),
+ rt_info_computed_ (0),
+ name_ (name),
+ scheduler_ (RtecScheduler::Scheduler::_duplicate (scheduler)),
+ body_ (body),
+ body_info_ (body_info),
+ parent_info_ (parent_info),
+ info_type_ (info_type)
+{
+ this->adopt_child (this->body_);
+}
+
+TAO_EC_Sched_Filter::~TAO_EC_Sched_Filter (void)
+{
+ delete this->body_;
+}
+
+TAO_EC_Filter::ChildrenIterator
+TAO_EC_Sched_Filter::begin (void) const
+{
+ return this->body_->begin ();
+}
+
+TAO_EC_Filter::ChildrenIterator
+TAO_EC_Sched_Filter::end (void) const
+{
+ return this->body_->end ();
+}
+
+int
+TAO_EC_Sched_Filter::size (void) const
+{
+ return this->body_->size ();
+}
+
+int
+TAO_EC_Sched_Filter::filter (const RtecEventComm::EventSet &event,
+ TAO_EC_QOS_Info& qos_info
+ ACE_ENV_ARG_DECL)
+{
+ return this->body_->filter (event, qos_info ACE_ENV_ARG_PARAMETER);
+}
+
+int
+TAO_EC_Sched_Filter::filter_nocopy (RtecEventComm::EventSet &event,
+ TAO_EC_QOS_Info& qos_info
+ ACE_ENV_ARG_DECL)
+{
+ return this->body_->filter_nocopy (event, qos_info ACE_ENV_ARG_PARAMETER);
+}
+
+// This is private, so we can make it inline in the .cpp file...
+void
+TAO_EC_Sched_Filter::compute_qos_info (TAO_EC_QOS_Info& qos_info
+ ACE_ENV_ARG_DECL)
+{
+ this->init_rt_info (ACE_ENV_SINGLE_ARG_PARAMETER);
+ ACE_CHECK;
+
+ qos_info.rt_info = this->rt_info_;
+ switch (this->info_type_)
+ {
+ default:
+ case RtecScheduler::DISJUNCTION:
+ break;
+
+ case RtecScheduler::CONJUNCTION:
+ case RtecScheduler::OPERATION:
+ {
+ RtecScheduler::OS_Priority os_priority;
+ RtecScheduler::Preemption_Subpriority_t p_subpriority;
+ RtecScheduler::Preemption_Priority_t p_priority;
+ this->scheduler_->priority (this->rt_info_,
+ os_priority,
+ p_subpriority,
+ p_priority
+ ACE_ENV_ARG_PARAMETER);
+ ACE_CHECK;
+ qos_info.preemption_priority = p_priority;
+ }
+ }
+}
+
+void
+TAO_EC_Sched_Filter::push (const RtecEventComm::EventSet &event,
+ TAO_EC_QOS_Info& qos_info
+ ACE_ENV_ARG_DECL)
+{
+ if (this->parent () != 0)
+ {
+ this->compute_qos_info (qos_info ACE_ENV_ARG_PARAMETER);
+ ACE_CHECK;
+
+ this->parent ()->push (event, qos_info ACE_ENV_ARG_PARAMETER);
+ ACE_CHECK;
+ }
+}
+
+void
+TAO_EC_Sched_Filter::push_nocopy (RtecEventComm::EventSet &event,
+ TAO_EC_QOS_Info& qos_info
+ ACE_ENV_ARG_DECL)
+{
+ if (this->parent () != 0)
+ {
+ this->compute_qos_info (qos_info ACE_ENV_ARG_PARAMETER);
+ ACE_CHECK;
+
+ this->parent ()->push_nocopy (event, qos_info ACE_ENV_ARG_PARAMETER);
+ ACE_CHECK;
+ }
+}
+
+void
+TAO_EC_Sched_Filter::clear (void)
+{
+ this->body_->clear ();
+}
+
+CORBA::ULong
+TAO_EC_Sched_Filter::max_event_size (void) const
+{
+ return this->body_->max_event_size ();
+}
+
+int
+TAO_EC_Sched_Filter::can_match (const RtecEventComm::EventHeader& header) const
+{
+ return this->body_->can_match (header);
+}
+
+int
+TAO_EC_Sched_Filter::add_dependencies (const RtecEventComm::EventHeader& header,
+ const TAO_EC_QOS_Info &qos_info
+ ACE_ENV_ARG_DECL)
+{
+ this->init_rt_info (ACE_ENV_SINGLE_ARG_PARAMETER);
+ ACE_CHECK_RETURN (0);
+
+ int matches = this->body_->add_dependencies (header,
+ qos_info
+ ACE_ENV_ARG_PARAMETER);
+ ACE_CHECK_RETURN (0);
+
+ if (matches != 0)
+ {
+ this->scheduler_->add_dependency (this->rt_info_, qos_info.rt_info, 1,
+ RtecBase::TWO_WAY_CALL
+ ACE_ENV_ARG_PARAMETER);
+ ACE_CHECK_RETURN (0);
+
+ RtecScheduler::RT_Info_var info =
+ this->scheduler_->get (qos_info.rt_info ACE_ENV_ARG_PARAMETER);
+ ACE_CHECK_RETURN (0);
+ ACE_DEBUG ((LM_DEBUG, "[%s] ----> [%s]\n",
+ this->name_.c_str (),
+ info->entry_point.in ()));
+ }
+
+ ChildrenIterator end = this->end ();
+ for (ChildrenIterator i = this->begin (); i != end; ++i)
+ {
+ (*i)->add_dependencies (header, qos_info ACE_ENV_ARG_PARAMETER);
+ ACE_CHECK_RETURN (0);
+ }
+ return 0;
+}
+
+void
+TAO_EC_Sched_Filter::get_qos_info (TAO_EC_QOS_Info& qos_info
+ ACE_ENV_ARG_DECL)
+{
+ this->init_rt_info (ACE_ENV_SINGLE_ARG_PARAMETER);
+ ACE_CHECK;
+
+ qos_info.rt_info = this->rt_info_;
+}
+
+void
+TAO_EC_Sched_Filter::init_rt_info (ACE_ENV_SINGLE_ARG_DECL)
+{
+ if (this->rt_info_computed_)
+ return;
+
+ // Provide dummy values the scheduler will compute them based on the
+ // dependencies and the fact that this is a DISJUNCTION.
+ this->scheduler_->set (this->rt_info_,
+ RtecScheduler::VERY_LOW_CRITICALITY,
+ 0, // worst_cast_execution_time
+ 0, // typical_cast_execution_time
+ 0, // cached_cast_execution_time
+ 0, // period
+ RtecScheduler::VERY_LOW_IMPORTANCE,
+ 0, // quantum
+ 0, // threads
+ this->info_type_
+ ACE_ENV_ARG_PARAMETER);
+ ACE_CHECK;
+
+#if 0
+ ChildrenIterator end = this->end ();
+ for (ChildrenIterator i = this->begin (); i != end; ++i)
+ {
+ TAO_EC_Filter* filter = *i;
+
+ TAO_EC_QOS_Info child;
+ filter->get_qos_info (child ACE_ENV_ARG_PARAMETER);
+ ACE_CHECK;
+
+ this->scheduler_->add_dependency (this->rt_info_,
+ child.rt_info, 1,
+ RtecBase::TWO_WAY_CALL
+ ACE_ENV_ARG_PARAMETER);
+ ACE_CHECK;
+
+ RtecScheduler::RT_Info_var info =
+ this->scheduler_->get (child.rt_info ACE_ENV_ARG_PARAMETER);
+ ACE_CHECK;
+ ACE_DEBUG ((LM_DEBUG, "[%s] ----> [%s]\n",
+ info->entry_point.in (),
+ this->name_.c_str ()));
+
+ }
+#endif /* 0 */
+
+#if 1
+ if (this->body_info_ != this->rt_info_)
+ {
+ this->scheduler_->add_dependency (this->rt_info_,
+ this->body_info_,
+ 1,
+ RtecBase::TWO_WAY_CALL
+ ACE_ENV_ARG_PARAMETER);
+ ACE_CHECK;
+
+ RtecScheduler::RT_Info_var info =
+ this->scheduler_->get (this->body_info_ ACE_ENV_ARG_PARAMETER);
+ ACE_CHECK;
+ ACE_DEBUG ((LM_DEBUG, "[%s] ----> [%s]\n",
+ info->entry_point.in (),
+ this->name_.c_str ()));
+ }
+#endif /* 0 */
+
+#if 1
+ this->scheduler_->add_dependency (this->parent_info_,
+ this->rt_info_,
+ 1,
+ RtecBase::TWO_WAY_CALL
+ ACE_ENV_ARG_PARAMETER);
+ ACE_CHECK;
+
+ RtecScheduler::RT_Info_var info =
+ this->scheduler_->get (this->parent_info_ ACE_ENV_ARG_PARAMETER);
+ ACE_CHECK;
+ ACE_DEBUG ((LM_DEBUG, "[%s] ----> [%s]\n",
+ this->name_.c_str (),
+ info->entry_point.in ()));
+#endif /* 0 */
+
+ this->rt_info_computed_ = 1;
+}
+
+TAO_END_VERSIONED_NAMESPACE_DECL
diff --git a/TAO/orbsvcs/orbsvcs/Event/EC_Sched_Filter.h b/TAO/orbsvcs/orbsvcs/Event/EC_Sched_Filter.h
new file mode 100644
index 00000000000..5645a6eac92
--- /dev/null
+++ b/TAO/orbsvcs/orbsvcs/Event/EC_Sched_Filter.h
@@ -0,0 +1,129 @@
+// -*- C++ -*-
+/**
+ * @file EC_Sched_Filter.h
+ *
+ * $Id$
+ *
+ * @author Carlos O'Ryan (coryan@cs.wustl.edu)
+ *
+ * Based on previous work by Tim Harrison (harrison@cs.wustl.edu) and
+ * other members of the DOC group. More details can be found in:
+ *
+ * http://doc.ece.uci.edu/~coryan/EC/index.html
+ */
+
+#ifndef TAO_EC_SCHED_FILTER_H
+#define TAO_EC_SCHED_FILTER_H
+#include /**/ "ace/pre.h"
+
+#include "orbsvcs/Event/EC_Filter.h"
+
+#if !defined (ACE_LACKS_PRAGMA_ONCE)
+# pragma once
+#endif /* ACE_LACKS_PRAGMA_ONCE */
+
+#include "orbsvcs/RtecSchedulerC.h"
+#include "orbsvcs/Event/sched_event_export.h"
+#include "ace/SString.h"
+
+TAO_BEGIN_VERSIONED_NAMESPACE_DECL
+
+/**
+ * @class TAO_EC_Sched_Filter
+ *
+ * @brief Decorate a filter with scheduling information
+ *
+ * This filter decorates a regular filter with scheduling
+ * information. It creates a new RT_Info entry for the filter and
+ * it adds the dependencies between the filter and any childrens
+ * it may have.
+ *
+ * <H2>Memory Management</H2>
+ * It assumes ownership of the children.
+ */
+class TAO_RTSchedEvent_Export TAO_EC_Sched_Filter : public TAO_EC_Filter
+{
+public:
+ /**
+ * Constructor.
+ * It assumes ownership of the <body>, makes a copy of the other
+ * parameters
+ */
+ TAO_EC_Sched_Filter (const char* name,
+ RtecScheduler::handle_t rt_info,
+ RtecScheduler::Scheduler_ptr scheduler,
+ TAO_EC_Filter* body,
+ RtecScheduler::handle_t body_info,
+ RtecScheduler::handle_t parent_info,
+ RtecScheduler::Info_Type_t info_type);
+
+ /// Destructor
+ virtual ~TAO_EC_Sched_Filter (void);
+
+ // = The TAO_EC_Filter methods, please check the documentation in
+ // TAO_EC_Filter.
+ virtual ChildrenIterator begin (void) const;
+ virtual ChildrenIterator end (void) const;
+ virtual int size (void) const;
+ virtual int filter (const RtecEventComm::EventSet& event,
+ TAO_EC_QOS_Info& qos_info
+ ACE_ENV_ARG_DECL);
+ virtual int filter_nocopy (RtecEventComm::EventSet& event,
+ TAO_EC_QOS_Info& qos_info
+ ACE_ENV_ARG_DECL);
+ virtual void push (const RtecEventComm::EventSet& event,
+ TAO_EC_QOS_Info& qos_info
+ ACE_ENV_ARG_DECL);
+ virtual void push_nocopy (RtecEventComm::EventSet& event,
+ TAO_EC_QOS_Info& qos_info
+ ACE_ENV_ARG_DECL);
+ virtual void clear (void);
+ virtual CORBA::ULong max_event_size (void) const;
+ virtual int can_match (const RtecEventComm::EventHeader& header) const;
+ virtual int add_dependencies (const RtecEventComm::EventHeader& header,
+ const TAO_EC_QOS_Info &qos_info
+ ACE_ENV_ARG_DECL);
+ virtual void get_qos_info (TAO_EC_QOS_Info& qos_info
+ ACE_ENV_ARG_DECL);
+
+private:
+ TAO_EC_Sched_Filter (const TAO_EC_Sched_Filter&);
+ TAO_EC_Sched_Filter& operator= (const TAO_EC_Sched_Filter&);
+
+ /// Initialize our RT_Info handle and dependencies
+ void init_rt_info (ACE_ENV_SINGLE_ARG_DECL);
+
+ /// Compute a new qos_info to push up.
+ void compute_qos_info (TAO_EC_QOS_Info& qos_info
+ ACE_ENV_ARG_DECL);
+
+private:
+ /// The RT_Info handle for this object
+ RtecScheduler::handle_t rt_info_;
+
+ /// Has the Scheduler been updated?
+ int rt_info_computed_;
+
+ /// Our operation name
+ ACE_CString name_;
+
+ /// The scheduler we are going to use
+ RtecScheduler::Scheduler_var scheduler_;
+
+ /// The implementation
+ TAO_EC_Filter* body_;
+
+ /// The RT_Info handle for the body
+ RtecScheduler::handle_t body_info_;
+
+ /// The RT_Info handle for the parent
+ RtecScheduler::handle_t parent_info_;
+
+ /// Required for the scheduling service
+ RtecScheduler::Info_Type_t info_type_;
+};
+
+TAO_END_VERSIONED_NAMESPACE_DECL
+
+#include /**/ "ace/post.h"
+#endif /* TAO_EC_SCHED_FILTER_H */
diff --git a/TAO/orbsvcs/orbsvcs/Event/EC_Sched_Filter_Builder.cpp b/TAO/orbsvcs/orbsvcs/Event/EC_Sched_Filter_Builder.cpp
new file mode 100644
index 00000000000..95ef9e1886e
--- /dev/null
+++ b/TAO/orbsvcs/orbsvcs/Event/EC_Sched_Filter_Builder.cpp
@@ -0,0 +1,335 @@
+// $Id$
+
+#include "orbsvcs/Event/EC_Sched_Filter.h"
+#include "orbsvcs/Event_Service_Constants.h"
+#include "orbsvcs/Event/EC_Sched_Filter_Builder.h"
+#include "orbsvcs/Event/EC_Type_Filter.h"
+#include "orbsvcs/Event/EC_Conjunction_Filter.h"
+#include "orbsvcs/Event/EC_Disjunction_Filter.h"
+#include "orbsvcs/Event/EC_Timeout_Filter.h"
+#include "orbsvcs/Event/EC_Event_Channel_Base.h"
+#include "ace/OS_NS_stdio.h"
+
+#if ! defined (__ACE_INLINE__)
+#include "orbsvcs/Event/EC_Sched_Filter_Builder.i"
+#endif /* __ACE_INLINE__ */
+
+ACE_RCSID(Event, EC_Sched_Filter_Builder, "$Id$")
+
+
+TAO_BEGIN_VERSIONED_NAMESPACE_DECL
+
+TAO_EC_Sched_Filter_Builder::~TAO_EC_Sched_Filter_Builder (void)
+{
+}
+
+TAO_EC_Filter*
+TAO_EC_Sched_Filter_Builder::build (
+ TAO_EC_ProxyPushSupplier *supplier,
+ RtecEventChannelAdmin::ConsumerQOS& qos
+ ACE_ENV_ARG_DECL) const
+{
+ CORBA::ULong pos = 0;
+ CORBA::Object_var tmp =
+ this->event_channel_->scheduler ();
+
+ RtecScheduler::Scheduler_var scheduler =
+ RtecScheduler::Scheduler::_narrow (tmp.in () ACE_ENV_ARG_PARAMETER);
+ ACE_CHECK_RETURN (0);
+
+ // @@ How do we figure out which parent???
+ RtecScheduler::handle_t parent_info =
+ scheduler->lookup ("Dispatching_Task-250000.us" ACE_ENV_ARG_PARAMETER);
+ ACE_CHECK_RETURN (0);
+
+ return this->recursive_build (supplier, qos, pos,
+ scheduler.in (),
+ parent_info
+ ACE_ENV_ARG_PARAMETER);
+}
+
+TAO_EC_Filter*
+TAO_EC_Sched_Filter_Builder::recursive_build (
+ TAO_EC_ProxyPushSupplier *supplier,
+ RtecEventChannelAdmin::ConsumerQOS& qos,
+ CORBA::ULong& pos,
+ RtecScheduler::Scheduler_ptr scheduler,
+ RtecScheduler::handle_t parent_info
+ ACE_ENV_ARG_DECL) const
+{
+ const RtecEventComm::Event& e = qos.dependencies[pos].event;
+
+ if (e.header.type == ACE_ES_CONJUNCTION_DESIGNATOR)
+ {
+ CORBA::ULong npos = pos;
+ ACE_CString name;
+ this->recursive_name (qos, npos,
+ scheduler, name
+ ACE_ENV_ARG_PARAMETER);
+ ACE_CHECK_RETURN (0);
+
+ RtecScheduler::handle_t rt_info =
+ scheduler->create (name.c_str () ACE_ENV_ARG_PARAMETER);
+ ACE_CHECK_RETURN (0);
+
+ pos++; // Consume the designator
+ CORBA::ULong n = this->count_children (qos, pos);
+
+ TAO_EC_Filter** children;
+ ACE_NEW_RETURN (children, TAO_EC_Filter*[n], 0);
+ for (CORBA::ULong i = 0; i != n; ++i)
+ {
+ children[i] = this->recursive_build (supplier, qos, pos,
+ scheduler,
+ rt_info
+ ACE_ENV_ARG_PARAMETER);
+ ACE_CHECK_RETURN (0);
+ }
+
+ TAO_EC_Sched_Filter *filter;
+ ACE_NEW_RETURN (filter,
+ TAO_EC_Sched_Filter (name.c_str (),
+ rt_info,
+ scheduler,
+ new TAO_EC_Conjunction_Filter(children,
+ n),
+ rt_info,
+ parent_info,
+ RtecScheduler::CONJUNCTION),
+ 0);
+ TAO_EC_QOS_Info qos_info;
+ filter->get_qos_info (qos_info ACE_ENV_ARG_PARAMETER);
+ // @@
+ ACE_CHECK_RETURN (0);
+ return filter;
+ }
+
+ else if (e.header.type == ACE_ES_DISJUNCTION_DESIGNATOR)
+ {
+ CORBA::ULong npos = pos;
+ ACE_CString name;
+ this->recursive_name (qos, npos,
+ scheduler, name
+ ACE_ENV_ARG_PARAMETER);
+ ACE_CHECK_RETURN (0);
+
+ RtecScheduler::handle_t rt_info =
+ scheduler->create (name.c_str () ACE_ENV_ARG_PARAMETER);
+ ACE_CHECK_RETURN (0);
+
+ pos++; // Consume the designator
+ CORBA::ULong n = this->count_children (qos, pos);
+
+ TAO_EC_Filter** children;
+ ACE_NEW_RETURN (children, TAO_EC_Filter*[n], 0);
+ for (CORBA::ULong i = 0; i != n; ++i)
+ {
+ children[i] = this->recursive_build (supplier, qos, pos,
+ scheduler,
+ rt_info
+ ACE_ENV_ARG_PARAMETER);
+ ACE_CHECK_RETURN (0);
+ }
+ TAO_EC_Sched_Filter *filter;
+ ACE_NEW_RETURN (filter,
+ TAO_EC_Sched_Filter (name.c_str (),
+ rt_info,
+ scheduler,
+ new TAO_EC_Disjunction_Filter (children,
+ n),
+ rt_info,
+ parent_info,
+ RtecScheduler::DISJUNCTION),
+ 0);
+
+ TAO_EC_QOS_Info qos_info;
+ filter->get_qos_info (qos_info ACE_ENV_ARG_PARAMETER);
+ // @@
+ ACE_CHECK_RETURN (0);
+ return filter;
+ }
+
+ else if (e.header.type == ACE_ES_EVENT_TIMEOUT
+ || e.header.type == ACE_ES_EVENT_INTERVAL_TIMEOUT
+ || e.header.type == ACE_ES_EVENT_DEADLINE_TIMEOUT)
+ {
+ pos++;
+
+ // @@ We need a unique name for each timeout, assigned by the
+ // application?
+ char buf[64];
+ ACE_OS::sprintf (buf, "TIMEOUT:%u",
+ static_cast<u_int> ((e.header.creation_time / 10000)));
+ ACE_CString name = buf;
+
+ TAO_EC_QOS_Info qos_info;
+ qos_info.rt_info =
+ scheduler->create (name.c_str () ACE_ENV_ARG_PARAMETER);
+ ACE_CHECK_RETURN (0);
+
+ // Convert the time to the proper units....
+ RtecScheduler::Period_t period =
+ static_cast<RtecScheduler::Period_t> (e.header.creation_time / 10);
+
+ scheduler->set (qos_info.rt_info,
+ RtecScheduler::VERY_LOW_CRITICALITY,
+ 0, // worst_cast_execution_time
+ 0, // typical_cast_execution_time
+ 0, // cached_cast_execution_time
+ period,
+ RtecScheduler::VERY_LOW_IMPORTANCE,
+ 0, // quantum
+ 1, // threads
+ RtecScheduler::OPERATION
+ ACE_ENV_ARG_PARAMETER);
+ ACE_CHECK_RETURN (0);
+
+ scheduler->add_dependency (qos_info.rt_info,
+ parent_info,
+ 1,
+ RtecBase::TWO_WAY_CALL
+ ACE_ENV_ARG_PARAMETER);
+ ACE_CHECK_RETURN (0);
+
+ return new TAO_EC_Timeout_Filter (this->event_channel_,
+ supplier,
+ qos_info,
+ e.header.type,
+ e.header.creation_time);
+ }
+
+ RtecScheduler::handle_t body_info = qos.dependencies[pos].rt_info;
+
+ RtecScheduler::RT_Info_var info =
+ scheduler->get (body_info ACE_ENV_ARG_PARAMETER);
+ ACE_CHECK_RETURN (0);
+
+ ACE_CString name = info->entry_point.in ();
+ name += "#rep";
+
+ RtecScheduler::handle_t rt_info =
+ scheduler->create (name.c_str () ACE_ENV_ARG_PARAMETER);
+ ACE_CHECK_RETURN (0);
+
+ pos++;
+ TAO_EC_Sched_Filter *filter;
+ ACE_NEW_RETURN (filter,
+ TAO_EC_Sched_Filter (name.c_str (),
+ rt_info,
+ scheduler,
+ new TAO_EC_Type_Filter (e.header),
+ body_info,
+ parent_info,
+ RtecScheduler::OPERATION),
+ 0);
+
+ TAO_EC_QOS_Info qos_info;
+ filter->get_qos_info (qos_info ACE_ENV_ARG_PARAMETER);
+ // @@
+ ACE_CHECK_RETURN (0);
+ return filter;
+}
+
+void
+TAO_EC_Sched_Filter_Builder:: recursive_name (
+ RtecEventChannelAdmin::ConsumerQOS& qos,
+ CORBA::ULong& pos,
+ RtecScheduler::Scheduler_ptr scheduler,
+ ACE_CString& name
+ ACE_ENV_ARG_DECL) const
+{
+ const RtecEventComm::Event& e = qos.dependencies[pos].event;
+
+ if (e.header.type == ACE_ES_CONJUNCTION_DESIGNATOR)
+ {
+ pos++; // Consume the designator
+ CORBA::ULong n = this->count_children (qos, pos);
+
+ for (CORBA::ULong i = 0; i != n; ++i)
+ {
+ ACE_CString child_name;
+ this->recursive_name (qos, pos,
+ scheduler,
+ child_name
+ ACE_ENV_ARG_PARAMETER);
+ ACE_CHECK;
+
+ if (i == 0)
+ name += "(";
+ else
+ name += "&&";
+ name += child_name;
+ }
+ name += ")";
+ return;
+ }
+
+ else if (e.header.type == ACE_ES_DISJUNCTION_DESIGNATOR)
+ {
+ pos++; // Consume the designator
+ CORBA::ULong n = this->count_children (qos, pos);
+
+ for (CORBA::ULong i = 0; i != n; ++i)
+ {
+ ACE_CString child_name;
+
+ this->recursive_name (qos, pos,
+ scheduler,
+ child_name
+ ACE_ENV_ARG_PARAMETER);
+ ACE_CHECK;
+
+ if (i == 0)
+ name += "(";
+ else
+ name += "||";
+ name += child_name;
+ }
+ name += ")";
+ return;
+ }
+
+ else if (e.header.type == ACE_ES_EVENT_TIMEOUT
+ || e.header.type == ACE_ES_EVENT_INTERVAL_TIMEOUT
+ || e.header.type == ACE_ES_EVENT_DEADLINE_TIMEOUT)
+ {
+ pos++;
+
+ char buf[64];
+ ACE_OS::sprintf (buf, "TIMEOUT:%u",
+ static_cast<u_int> ((e.header.creation_time / 10000)));
+ name = buf;
+
+ return;
+ }
+
+ RtecScheduler::handle_t body_info = qos.dependencies[pos].rt_info;
+
+ RtecScheduler::RT_Info_var info =
+ scheduler->get (body_info ACE_ENV_ARG_PARAMETER);
+ ACE_CHECK;
+
+ name = info->entry_point.in ();
+ name += "#rep";
+
+ pos++;
+}
+
+CORBA::ULong
+TAO_EC_Sched_Filter_Builder::
+ count_children (RtecEventChannelAdmin::ConsumerQOS& qos,
+ CORBA::ULong pos) const
+{
+ CORBA::ULong l = qos.dependencies.length ();
+ CORBA::ULong i;
+ for (i = pos; i != l; ++i)
+ {
+ const RtecEventComm::Event& e = qos.dependencies[i].event;
+ if (e.header.type == ACE_ES_CONJUNCTION_DESIGNATOR
+ || e.header.type == ACE_ES_DISJUNCTION_DESIGNATOR)
+ break;
+ }
+ return i - 1;
+}
+
+TAO_END_VERSIONED_NAMESPACE_DECL
diff --git a/TAO/orbsvcs/orbsvcs/Event/EC_Sched_Filter_Builder.h b/TAO/orbsvcs/orbsvcs/Event/EC_Sched_Filter_Builder.h
new file mode 100644
index 00000000000..c649518ecbe
--- /dev/null
+++ b/TAO/orbsvcs/orbsvcs/Event/EC_Sched_Filter_Builder.h
@@ -0,0 +1,89 @@
+// -*- C++ -*-
+
+/**
+ * @file EC_Sched_Filter_Builder.h
+ *
+ * $Id$
+ *
+ * @author Carlos O'Ryan (coryan@cs.wustl.edu)
+ *
+ * Based on previous work by Tim Harrison (harrison@cs.wustl.edu) and
+ * other members of the DOC group. More details can be found in:
+ *
+ * http://doc.ece.uci.edu/~coryan/EC/index.html
+ */
+
+#ifndef TAO_EC_SCHED_FILTER_BUILDER_H
+#define TAO_EC_SCHED_FILTER_BUILDER_H
+#include /**/ "ace/pre.h"
+
+#include "orbsvcs/Event/EC_Filter_Builder.h"
+
+#if !defined (ACE_LACKS_PRAGMA_ONCE)
+# pragma once
+#endif /* ACE_LACKS_PRAGMA_ONCE */
+
+#include "orbsvcs/Event/sched_event_export.h"
+
+TAO_BEGIN_VERSIONED_NAMESPACE_DECL
+
+class TAO_EC_Filter;
+class TAO_EC_Event_Channel_Base;
+
+/**
+ * @class TAO_EC_Sched_Filter_Builder
+ *
+ * @brief Implement a builder for the fundamental filters.
+ *
+ * The sched filtering mechanisms in the Event channel
+ * (source/type based filtering + disjunctions and conjunctions)
+ * are constructed using this class.
+ */
+class TAO_RTSchedEvent_Export TAO_EC_Sched_Filter_Builder : public TAO_EC_Filter_Builder
+{
+public:
+ /// constructor.
+ TAO_EC_Sched_Filter_Builder (TAO_EC_Event_Channel_Base* ec);
+
+ /// destructor...
+ virtual ~TAO_EC_Sched_Filter_Builder (void);
+
+ // = The TAO_EC_Filter_Builder methods...
+ TAO_EC_Filter* build (TAO_EC_ProxyPushSupplier *supplier,
+ RtecEventChannelAdmin::ConsumerQOS& qos
+ ACE_ENV_ARG_DECL) const;
+
+private:
+ /// Recursively build the filter tree.
+ TAO_EC_Filter* recursive_build (TAO_EC_ProxyPushSupplier *supplier,
+ RtecEventChannelAdmin::ConsumerQOS& qos,
+ CORBA::ULong& pos,
+ RtecScheduler::Scheduler_ptr scheduler,
+ RtecScheduler::handle_t parent_info
+ ACE_ENV_ARG_DECL) const;
+
+ /// Build the name recursively...
+ void recursive_name (RtecEventChannelAdmin::ConsumerQOS& qos,
+ CORBA::ULong& pos,
+ RtecScheduler::Scheduler_ptr scheduler,
+ ACE_CString &name
+ ACE_ENV_ARG_DECL) const;
+
+ /// Count the number of children of the current node, i.e. until a
+ /// conjunction or disjunction starts.
+ CORBA::ULong count_children (RtecEventChannelAdmin::ConsumerQOS& qos,
+ CORBA::ULong pos) const;
+
+private:
+ /// The event channel.
+ TAO_EC_Event_Channel_Base* event_channel_;
+};
+
+TAO_END_VERSIONED_NAMESPACE_DECL
+
+#if defined (__ACE_INLINE__)
+#include "orbsvcs/Event/EC_Sched_Filter_Builder.i"
+#endif /* __ACE_INLINE__ */
+
+#include /**/ "ace/post.h"
+#endif /* TAO_EC_SCHED_FILTER_BUILDER_H */
diff --git a/TAO/orbsvcs/orbsvcs/Event/EC_Sched_Filter_Builder.i b/TAO/orbsvcs/orbsvcs/Event/EC_Sched_Filter_Builder.i
new file mode 100644
index 00000000000..a00dfd725c5
--- /dev/null
+++ b/TAO/orbsvcs/orbsvcs/Event/EC_Sched_Filter_Builder.i
@@ -0,0 +1,14 @@
+// -*- C++ -*-
+//
+// $Id$
+
+TAO_BEGIN_VERSIONED_NAMESPACE_DECL
+
+ACE_INLINE
+TAO_EC_Sched_Filter_Builder::
+ TAO_EC_Sched_Filter_Builder (TAO_EC_Event_Channel_Base *ec)
+ : event_channel_ (ec)
+{
+}
+
+TAO_END_VERSIONED_NAMESPACE_DECL
diff --git a/TAO/orbsvcs/orbsvcs/Event/EC_Scheduling_Strategy.cpp b/TAO/orbsvcs/orbsvcs/Event/EC_Scheduling_Strategy.cpp
new file mode 100644
index 00000000000..76be60d02ec
--- /dev/null
+++ b/TAO/orbsvcs/orbsvcs/Event/EC_Scheduling_Strategy.cpp
@@ -0,0 +1,14 @@
+// $Id$
+
+#include "orbsvcs/Event/EC_Scheduling_Strategy.h"
+#include "orbsvcs/Event/EC_QOS_Info.h"
+
+ACE_RCSID(Event, EC_Scheduling_Strategy, "$Id$")
+
+TAO_BEGIN_VERSIONED_NAMESPACE_DECL
+
+TAO_EC_Scheduling_Strategy::~TAO_EC_Scheduling_Strategy (void)
+{
+}
+
+TAO_END_VERSIONED_NAMESPACE_DECL
diff --git a/TAO/orbsvcs/orbsvcs/Event/EC_Scheduling_Strategy.h b/TAO/orbsvcs/orbsvcs/Event/EC_Scheduling_Strategy.h
new file mode 100644
index 00000000000..08d3a6bf5c2
--- /dev/null
+++ b/TAO/orbsvcs/orbsvcs/Event/EC_Scheduling_Strategy.h
@@ -0,0 +1,73 @@
+// -*- C++ -*-
+
+/**
+ * @file EC_Scheduling_Strategy.h
+ *
+ * $Id$
+ *
+ * @author Carlos O'Ryan (coryan@cs.wustl.edu)
+ *
+ * Based on previous work by Tim Harrison (harrison@cs.wustl.edu) and
+ * other members of the DOC group. More details can be found in:
+ *
+ * http://doc.ece.uci.edu/~coryan/EC/index.html
+ */
+
+#ifndef TAO_EC_SCHEDULING_STRATEGY_H
+#define TAO_EC_SCHEDULING_STRATEGY_H
+
+#include /**/ "ace/pre.h"
+
+#include /**/ "orbsvcs/Event/event_serv_export.h"
+
+#include "orbsvcs/RtecBaseC.h"
+#include "orbsvcs/RtecEventCommC.h"
+
+#if !defined (ACE_LACKS_PRAGMA_ONCE)
+# pragma once
+#endif /* ACE_LACKS_PRAGMA_ONCE */
+
+TAO_BEGIN_VERSIONED_NAMESPACE_DECL
+
+class TAO_EC_ProxyPushConsumer;
+class TAO_EC_ProxyPushSupplier;
+class TAO_EC_Supplier_Filter;
+class TAO_EC_QOS_Info;
+
+/**
+ * @class TAO_EC_Scheduling_Strategy
+ *
+ * @brief Define the interface for the scheduling strategy
+ *
+ * The scheduling strategy controls the actions that the event
+ * channel must take to update the dependency information in the
+ * scheduler and to query the scheduler for the priority of each
+ * event pushed by a supplier.
+ * The base
+ */
+class TAO_RTEvent_Serv_Export TAO_EC_Scheduling_Strategy
+{
+public:
+ /// Destructor
+ virtual ~TAO_EC_Scheduling_Strategy (void);
+
+ /// Add all the dependencies between @a supplier and @a consumer
+ virtual void add_proxy_supplier_dependencies (
+ TAO_EC_ProxyPushSupplier *supplier,
+ TAO_EC_ProxyPushConsumer *consumer
+ ACE_ENV_ARG_DECL) = 0;
+
+ /// Schedule an event set and deliver them to the filter in the
+ /// desired order and grouping.
+ virtual void schedule_event (const RtecEventComm::EventSet &event,
+ TAO_EC_ProxyPushConsumer *consumer,
+ TAO_EC_Supplier_Filter *filter
+ ACE_ENV_ARG_DECL) = 0;
+
+};
+
+TAO_END_VERSIONED_NAMESPACE_DECL
+
+#include /**/ "ace/post.h"
+
+#endif /* TAO_EC_SCHEDULING_STRATEGY_H */
diff --git a/TAO/orbsvcs/orbsvcs/Event/EC_SupplierAdmin.cpp b/TAO/orbsvcs/orbsvcs/Event/EC_SupplierAdmin.cpp
new file mode 100644
index 00000000000..fb555cf3e95
--- /dev/null
+++ b/TAO/orbsvcs/orbsvcs/Event/EC_SupplierAdmin.cpp
@@ -0,0 +1,39 @@
+// $Id$
+
+#include "orbsvcs/Event/EC_SupplierAdmin.h"
+#include "orbsvcs/Event/EC_ProxyConsumer.h"
+#include "orbsvcs/Event/EC_ProxySupplier.h"
+#include "orbsvcs/Event/EC_Event_Channel_Base.h"
+#include "orbsvcs/ESF/ESF_Peer_Workers.h"
+#include "orbsvcs/ESF/ESF_Peer_Admin.h"
+#include "orbsvcs/ESF/ESF_Shutdown_Proxy.h"
+
+ACE_RCSID(Event, EC_SupplierAdmin, "$Id$")
+
+TAO_BEGIN_VERSIONED_NAMESPACE_DECL
+
+TAO_EC_SupplierAdmin::TAO_EC_SupplierAdmin (TAO_EC_Event_Channel_Base *ec)
+ : TAO_ESF_Peer_Admin<TAO_EC_Event_Channel_Base,TAO_EC_ProxyPushConsumer,RtecEventChannelAdmin::ProxyPushConsumer,TAO_EC_ProxyPushSupplier> (ec)
+{
+ this->default_POA_ =
+ this->event_channel_->supplier_poa ();
+}
+
+TAO_EC_SupplierAdmin::~TAO_EC_SupplierAdmin (void)
+{
+}
+
+RtecEventChannelAdmin::ProxyPushConsumer_ptr
+TAO_EC_SupplierAdmin::obtain_push_consumer (ACE_ENV_SINGLE_ARG_DECL)
+ ACE_THROW_SPEC ((CORBA::SystemException))
+{
+ return this->obtain (ACE_ENV_SINGLE_ARG_PARAMETER);
+}
+
+PortableServer::POA_ptr
+TAO_EC_SupplierAdmin::_default_POA (ACE_ENV_SINGLE_ARG_DECL_NOT_USED)
+{
+ return PortableServer::POA::_duplicate (this->default_POA_.in ());
+}
+
+TAO_END_VERSIONED_NAMESPACE_DECL
diff --git a/TAO/orbsvcs/orbsvcs/Event/EC_SupplierAdmin.h b/TAO/orbsvcs/orbsvcs/Event/EC_SupplierAdmin.h
new file mode 100644
index 00000000000..44e9edb8dc9
--- /dev/null
+++ b/TAO/orbsvcs/orbsvcs/Event/EC_SupplierAdmin.h
@@ -0,0 +1,73 @@
+// -*- C++ -*-
+
+/**
+ * @file EC_SupplierAdmin.h
+ *
+ * $Id$
+ *
+ * @author Carlos O'Ryan (coryan@cs.wustl.edu)
+ *
+ * Based on previous work by Tim Harrison (harrison@cs.wustl.edu) and
+ * other members of the DOC group. More details can be found in:
+ *
+ * http://doc.ece.uci.edu/~coryan/EC/index.html
+ */
+
+#ifndef TAO_EC_SUPPLIERADMIN_H
+#define TAO_EC_SUPPLIERADMIN_H
+
+#include /**/ "ace/pre.h"
+
+#include "orbsvcs/Event/EC_ProxyConsumer.h"
+
+#if !defined (ACE_LACKS_PRAGMA_ONCE)
+# pragma once
+#endif /* ACE_LACKS_PRAGMA_ONCE */
+
+#include "orbsvcs/ESF/ESF_Peer_Admin.h"
+
+#include /**/ "orbsvcs/Event/event_serv_export.h"
+
+TAO_BEGIN_VERSIONED_NAMESPACE_DECL
+
+class TAO_EC_Event_Channel_Base;
+class TAO_EC_ProxyPushSupplier;
+
+/**
+ * @class TAO_EC_SupplierAdmin
+ *
+ * @brief Implement the RtecEventChannelAdmin::SupplierAdmin interface.
+ *
+ *
+ * <H2>Memory Management</H2>
+ * It does not assume ownership of the TAO_EC_Event_Channel_Base object
+ */
+class TAO_RTEvent_Serv_Export TAO_EC_SupplierAdmin
+ : public POA_RtecEventChannelAdmin::SupplierAdmin
+ , public TAO_ESF_Peer_Admin<TAO_EC_Event_Channel_Base,TAO_EC_ProxyPushConsumer,RtecEventChannelAdmin::ProxyPushConsumer,TAO_EC_ProxyPushSupplier>
+{
+public:
+ /// constructor...
+ TAO_EC_SupplierAdmin (TAO_EC_Event_Channel_Base* event_channel);
+
+ /// destructor...
+ virtual ~TAO_EC_SupplierAdmin (void);
+
+ // = The RtecEventChannelAdmin::SupplierAdmin methods...
+ virtual RtecEventChannelAdmin::ProxyPushConsumer_ptr
+ obtain_push_consumer (ACE_ENV_SINGLE_ARG_DECL_NOT_USED)
+ ACE_THROW_SPEC ((CORBA::SystemException));
+
+ // = The PortableServer::ServantBase methods
+ virtual PortableServer::POA_ptr _default_POA (ACE_ENV_SINGLE_ARG_DECL);
+
+private:
+ /// Store the default POA.
+ PortableServer::POA_var default_POA_;
+};
+
+TAO_END_VERSIONED_NAMESPACE_DECL
+
+#include /**/ "ace/post.h"
+
+#endif /* TAO_EC_SUPPLIERADMIN_H */
diff --git a/TAO/orbsvcs/orbsvcs/Event/EC_SupplierControl.cpp b/TAO/orbsvcs/orbsvcs/Event/EC_SupplierControl.cpp
new file mode 100644
index 00000000000..7d73bfbaf53
--- /dev/null
+++ b/TAO/orbsvcs/orbsvcs/Event/EC_SupplierControl.cpp
@@ -0,0 +1,42 @@
+// $Id$
+
+#include "orbsvcs/Event/EC_SupplierControl.h"
+
+ACE_RCSID(Event, EC_SupplierControl, "$Id$")
+
+TAO_BEGIN_VERSIONED_NAMESPACE_DECL
+
+TAO_EC_SupplierControl::TAO_EC_SupplierControl (void)
+{
+}
+
+TAO_EC_SupplierControl::~TAO_EC_SupplierControl (void)
+{
+}
+
+int
+TAO_EC_SupplierControl::activate (void)
+{
+ return 0;
+}
+
+int
+TAO_EC_SupplierControl::shutdown (void)
+{
+ return 0;
+}
+
+void
+TAO_EC_SupplierControl::supplier_not_exist (TAO_EC_ProxyPushConsumer *
+ ACE_ENV_ARG_DECL_NOT_USED)
+{
+}
+
+void
+TAO_EC_SupplierControl::system_exception (TAO_EC_ProxyPushConsumer *,
+ CORBA::SystemException &
+ ACE_ENV_ARG_DECL_NOT_USED)
+{
+}
+
+TAO_END_VERSIONED_NAMESPACE_DECL
diff --git a/TAO/orbsvcs/orbsvcs/Event/EC_SupplierControl.h b/TAO/orbsvcs/orbsvcs/Event/EC_SupplierControl.h
new file mode 100644
index 00000000000..e4247d13b5b
--- /dev/null
+++ b/TAO/orbsvcs/orbsvcs/Event/EC_SupplierControl.h
@@ -0,0 +1,81 @@
+// -*- C++ -*-
+
+/**
+ * @file EC_SupplierControl.h
+ *
+ * $Id$
+ *
+ * @author Carlos O'Ryan (coryan@cs.wustl.edu)
+ *
+ * Based on previous work by Tim Harrison (harrison@cs.wustl.edu) and
+ * other members of the DOC group. More details can be found in:
+ *
+ * http://doc.ece.uci.edu/~coryan/EC/index.html
+ */
+
+#ifndef TAO_EC_SUPPLIERCONTROL_H
+#define TAO_EC_SUPPLIERCONTROL_H
+
+#include /**/ "ace/pre.h"
+#include "ace/CORBA_macros.h"
+
+#if !defined (ACE_LACKS_PRAGMA_ONCE)
+# pragma once
+#endif /* ACE_LACKS_PRAGMA_ONCE */
+
+#include /**/ "orbsvcs/Event/event_serv_export.h"
+
+#include "tao/Versioned_Namespace.h"
+
+TAO_BEGIN_VERSIONED_NAMESPACE_DECL
+
+class TAO_EC_ProxyPushConsumer;
+
+namespace CORBA
+{
+ class Environment;
+ class SystemException;
+}
+
+/**
+ * @class TAO_EC_SupplierControl
+ *
+ * @brief SupplierControl
+ *
+ * Defines the interface for the supplier control strategy.
+ * This strategy handles misbehaving or failing suppliers.
+ */
+class TAO_RTEvent_Serv_Export TAO_EC_SupplierControl
+{
+public:
+ /// Constructor.
+ TAO_EC_SupplierControl (void);
+
+ /// Destructor.
+ virtual ~TAO_EC_SupplierControl (void);
+
+ /// Activate any internal threads or timers used to poll the state of
+ /// the suppliers
+ virtual int activate (void);
+ virtual int shutdown (void);
+
+ /**
+ * Invoked by helper classes when they detect that a supplier does
+ * not exists (i.e. _non_existent() returns true and/or the
+ * CORBA::OBJECT_NOT_EXIST exception has been raised).
+ */
+ virtual void supplier_not_exist (TAO_EC_ProxyPushConsumer *proxy
+ ACE_ENV_ARG_DECL_NOT_USED);
+
+ /// Some system exception was raised while trying to contact the
+ /// supplier
+ virtual void system_exception (TAO_EC_ProxyPushConsumer * proxy,
+ CORBA::SystemException &
+ ACE_ENV_ARG_DECL_NOT_USED);
+};
+
+TAO_END_VERSIONED_NAMESPACE_DECL
+
+#include /**/ "ace/post.h"
+
+#endif /* TAO_EC_SUPPLIERCONTROL_H */
diff --git a/TAO/orbsvcs/orbsvcs/Event/EC_Supplier_Filter.cpp b/TAO/orbsvcs/orbsvcs/Event/EC_Supplier_Filter.cpp
new file mode 100644
index 00000000000..1f424fd0575
--- /dev/null
+++ b/TAO/orbsvcs/orbsvcs/Event/EC_Supplier_Filter.cpp
@@ -0,0 +1,29 @@
+// $Id$
+
+#include "orbsvcs/Event/EC_Supplier_Filter.h"
+#include "orbsvcs/Event/EC_ProxySupplier.h"
+#include "orbsvcs/Event/EC_QOS_Info.h"
+
+#if ! defined (__ACE_INLINE__)
+#include "orbsvcs/Event/EC_Supplier_Filter.i"
+#endif /* __ACE_INLINE__ */
+
+ACE_RCSID(Event, EC_Supplier_Filter, "$Id$")
+
+TAO_BEGIN_VERSIONED_NAMESPACE_DECL
+
+TAO_EC_Supplier_Filter::~TAO_EC_Supplier_Filter (void)
+{
+}
+
+// ****************************************************************
+
+void
+TAO_EC_Filter_Worker::work (TAO_EC_ProxyPushSupplier *supplier
+ ACE_ENV_ARG_DECL)
+{
+ TAO_EC_QOS_Info qos_info = this->event_info_;
+ supplier->filter (this->event_, qos_info ACE_ENV_ARG_PARAMETER);
+}
+
+TAO_END_VERSIONED_NAMESPACE_DECL
diff --git a/TAO/orbsvcs/orbsvcs/Event/EC_Supplier_Filter.h b/TAO/orbsvcs/orbsvcs/Event/EC_Supplier_Filter.h
new file mode 100644
index 00000000000..898fdc45e02
--- /dev/null
+++ b/TAO/orbsvcs/orbsvcs/Event/EC_Supplier_Filter.h
@@ -0,0 +1,151 @@
+// -*- C++ -*-
+
+/**
+ * @file EC_Supplier_Filter.h
+ *
+ * $Id$
+ *
+ * @author Carlos O'Ryan (coryan@cs.wustl.edu)
+ *
+ * Based on previous work by Tim Harrison (harrison@cs.wustl.edu) and
+ * other members of the DOC group. More details can be found in:
+ *
+ * http://doc.ece.uci.edu/~coryan/EC/index.html
+ */
+
+#ifndef TAO_EC_SUPPLIER_FILTER_H
+#define TAO_EC_SUPPLIER_FILTER_H
+
+#include /**/ "ace/pre.h"
+
+#include "orbsvcs/RtecEventCommC.h"
+#include "orbsvcs/ESF/ESF_Worker.h"
+
+#include /**/ "orbsvcs/Event/event_serv_export.h"
+
+#if !defined (ACE_LACKS_PRAGMA_ONCE)
+# pragma once
+#endif /* ACE_LACKS_PRAGMA_ONCE */
+
+TAO_BEGIN_VERSIONED_NAMESPACE_DECL
+
+class TAO_EC_ProxyPushSupplier;
+class TAO_EC_ProxyPushConsumer;
+class TAO_EC_QOS_Info;
+
+/**
+ * @class TAO_EC_Supplier_Filter
+ *
+ * @brief The strategy to filter close to the supplier.
+ *
+ * After an event is received by the a ProxyPushConsumer it must
+ * be dispatched to the right set of ProxyPushSuppliers;
+ * determining this set is the task of this class.
+ * Notice that this is in fact a filter, and enforces (in part)
+ * the subscriptions and publications of the Event Service
+ * clients.
+ * Several implementations are possible:
+ * - Each ProxyPushConsumer keeps a list of ProxyPushSuppliers,
+ * using the subscriptions and publications to find potential
+ * matches.
+ * - Each ProxyPushConsumer keeps several such lists, indexed by
+ * event type and/or source, this has the advantage of further
+ * minimizing the set of ProxyPushSuppliers invoked.
+ * - A single list of consumers is kept (global for the event
+ * channel), such a list results is faster updates and requires
+ * an smaller memory footprint.
+ * - Multiple global lists are kept, indexed by type and/or
+ * source, this is a tradeoff between the solutions above.
+ * - No list is kept, the events are sent to the consumers which
+ * must filter out what they want, this is good when no
+ * filtering is wanted or when the amount of filtering is coarse
+ * i.e. each event goes to a large subset of the
+ * ProxyPushSuppliers.
+ * Different applications will require to use different
+ * implementations of this class; as usual the EC_Factory will
+ * create the right instance.
+ */
+class TAO_RTEvent_Serv_Export TAO_EC_Supplier_Filter
+{
+public:
+ /// Destructor
+ virtual ~TAO_EC_Supplier_Filter (void);
+
+ /**
+ * Whenever a ProxyPushConsumer is initialized it calls this method
+ * to inform the Supplier_Filter of its identity.
+ * Strategies that do not keep ProxyPushConsumer specific
+ * information, or that are shared between multiple
+ * ProxyPushConsumers can ignore this message.
+ */
+ virtual void bind (TAO_EC_ProxyPushConsumer* consumer) = 0;
+
+ /**
+ * Wheneve a ProxyPushConsumer is about to be destroyed it calls
+ * this method to inform the Supplier_Filter that it should
+ * release any resources related to it.
+ * Supplier_Filter strategies that are bound to a particular
+ * ProxyConsumer can use this opportunity to destroy themselves;
+ * filter strategies that do not keep ProxyPushConsumer specific
+ * information can simply ignore the message.
+ */
+ virtual void unbind (TAO_EC_ProxyPushConsumer* consumer) = 0;
+
+ /// Concrete implementations can use this methods to keep track of
+ /// the consumers interested in this events.
+ virtual void connected (TAO_EC_ProxyPushSupplier *supplier
+ ACE_ENV_ARG_DECL) = 0;
+ virtual void reconnected (TAO_EC_ProxyPushSupplier *supplier
+ ACE_ENV_ARG_DECL) = 0;
+ virtual void disconnected (TAO_EC_ProxyPushSupplier *supplier
+ ACE_ENV_ARG_DECL) = 0;
+
+ /// The event channel is shutting down.
+ virtual void shutdown (ACE_ENV_SINGLE_ARG_DECL) = 0;
+
+ /// The ProxyPushConsumer delegates on this class to actually send
+ /// the event.
+ virtual void push (const RtecEventComm::EventSet &event,
+ TAO_EC_ProxyPushConsumer *consumer
+ ACE_ENV_ARG_DECL) = 0;
+
+ /// Events are first scheduled by the TAO_EC_Scheduling_Strategy,
+ /// and then pushed through this class again.
+ virtual void push_scheduled_event (RtecEventComm::EventSet &event,
+ const TAO_EC_QOS_Info &event_info
+ ACE_ENV_ARG_DECL) = 0;
+
+ /// Increment and decrement the reference count, locking must be
+ /// provided by the user.
+ virtual CORBA::ULong _incr_refcnt (void) = 0;
+ virtual CORBA::ULong _decr_refcnt (void) = 0;
+};
+
+// ****************************************************************
+
+class TAO_EC_Filter_Worker : public TAO_ESF_Worker<TAO_EC_ProxyPushSupplier>
+{
+public:
+ TAO_EC_Filter_Worker (RtecEventComm::EventSet &event,
+ const TAO_EC_QOS_Info &event_info);
+
+ virtual void work (TAO_EC_ProxyPushSupplier *supplier
+ ACE_ENV_ARG_DECL);
+
+private:
+ /// The event we push on each case, use a reference to avoid copies.
+ RtecEventComm::EventSet &event_;
+
+ /// The QoS info propagated on each event.
+ const TAO_EC_QOS_Info &event_info_;
+};
+
+TAO_END_VERSIONED_NAMESPACE_DECL
+
+#if defined (__ACE_INLINE__)
+#include "orbsvcs/Event/EC_Supplier_Filter.i"
+#endif /* __ACE_INLINE__ */
+
+#include /**/ "ace/post.h"
+
+#endif /* TAO_EC_SUPPLIER_FILTER_H */
diff --git a/TAO/orbsvcs/orbsvcs/Event/EC_Supplier_Filter.i b/TAO/orbsvcs/orbsvcs/Event/EC_Supplier_Filter.i
new file mode 100644
index 00000000000..9b09afb3d74
--- /dev/null
+++ b/TAO/orbsvcs/orbsvcs/Event/EC_Supplier_Filter.i
@@ -0,0 +1,15 @@
+// -*- C++ -*-
+//
+// $Id$
+
+TAO_BEGIN_VERSIONED_NAMESPACE_DECL
+
+ACE_INLINE
+TAO_EC_Filter_Worker::TAO_EC_Filter_Worker (RtecEventComm::EventSet &event,
+ const TAO_EC_QOS_Info &event_info)
+ : event_ (event),
+ event_info_ (event_info)
+{
+}
+
+TAO_END_VERSIONED_NAMESPACE_DECL
diff --git a/TAO/orbsvcs/orbsvcs/Event/EC_Supplier_Filter_Builder.cpp b/TAO/orbsvcs/orbsvcs/Event/EC_Supplier_Filter_Builder.cpp
new file mode 100644
index 00000000000..63203a004fa
--- /dev/null
+++ b/TAO/orbsvcs/orbsvcs/Event/EC_Supplier_Filter_Builder.cpp
@@ -0,0 +1,13 @@
+// $Id$
+
+#include "orbsvcs/Event/EC_Supplier_Filter_Builder.h"
+
+ACE_RCSID(Event, EC_Supplier_Filter_Builder, "$Id$")
+
+TAO_BEGIN_VERSIONED_NAMESPACE_DECL
+
+TAO_EC_Supplier_Filter_Builder::~TAO_EC_Supplier_Filter_Builder (void)
+{
+}
+
+TAO_END_VERSIONED_NAMESPACE_DECL
diff --git a/TAO/orbsvcs/orbsvcs/Event/EC_Supplier_Filter_Builder.h b/TAO/orbsvcs/orbsvcs/Event/EC_Supplier_Filter_Builder.h
new file mode 100644
index 00000000000..d81cab67d94
--- /dev/null
+++ b/TAO/orbsvcs/orbsvcs/Event/EC_Supplier_Filter_Builder.h
@@ -0,0 +1,67 @@
+// -*- C++ -*-
+
+/**
+ * @file EC_Supplier_Filter_Builder.h
+ *
+ * $Id$
+ *
+ * @author Carlos O'Ryan (coryan@cs.wustl.edu)
+ *
+ * Based on previous work by Tim Harrison (harrison@cs.wustl.edu) and
+ * other members of the DOC group. More details can be found in:
+ *
+ * http://doc.ece.uci.edu/~coryan/EC/index.html
+ */
+
+#ifndef TAO_EC_SUPPLIER_FILTER_BUILDER_H
+#define TAO_EC_SUPPLIER_FILTER_BUILDER_H
+
+#include /**/ "ace/pre.h"
+
+#include "orbsvcs/RtecEventChannelAdminC.h"
+
+#include /**/ "orbsvcs/Event/event_serv_export.h"
+
+#if !defined (ACE_LACKS_PRAGMA_ONCE)
+# pragma once
+#endif /* ACE_LACKS_PRAGMA_ONCE */
+
+TAO_BEGIN_VERSIONED_NAMESPACE_DECL
+
+class TAO_EC_Supplier_Filter;
+class TAO_EC_ProxyPushConsumer;
+
+/**
+ * @class TAO_EC_Supplier_Filter_Builder
+ *
+ * @brief Abstract base class for the supplier filter builders.
+ *
+ * The creation of the right filter for each supplier controlled
+ * by a Supplier_Filter_Builder.
+ */
+class TAO_RTEvent_Serv_Export TAO_EC_Supplier_Filter_Builder
+{
+public:
+ /// Destructor...
+ virtual ~TAO_EC_Supplier_Filter_Builder (void);
+
+ /**
+ * Create the filter. The consumer is bound to the returned
+ * Supplier_Filter, it must be unbound upon destruction and/or
+ * disconnection.
+ */
+ virtual TAO_EC_Supplier_Filter*
+ create (RtecEventChannelAdmin::SupplierQOS& qos) = 0;
+
+ /// The user is returning the filter for destruction/recycling.
+ virtual void
+ destroy (TAO_EC_Supplier_Filter *filter) = 0;
+};
+
+TAO_END_VERSIONED_NAMESPACE_DECL
+
+// ****************************************************************
+
+#include /**/ "ace/post.h"
+
+#endif /* TAO_EC_FILTER_BUILDER_H */
diff --git a/TAO/orbsvcs/orbsvcs/Event/EC_TPC_Dispatching.cpp b/TAO/orbsvcs/orbsvcs/Event/EC_TPC_Dispatching.cpp
new file mode 100644
index 00000000000..1b06a04dca7
--- /dev/null
+++ b/TAO/orbsvcs/orbsvcs/Event/EC_TPC_Dispatching.cpp
@@ -0,0 +1,198 @@
+// $Id$
+
+#include "orbsvcs/Event/EC_TPC_Dispatching.h"
+#include "orbsvcs/Event/EC_Defaults.h"
+
+#include <ace/Dynamic_Service.h>
+
+ACE_RCSID(Event, EC_TPC_Dispatching, "$Id$")
+
+#if !defined(TAO_EC_TPC_DISPATCHING_DEFAULT_MAP_SIZE)
+#define TAO_EC_TPC_DISPATCHING_DEFAULT_MAP_SIZE 32
+#endif
+
+TAO_BEGIN_VERSIONED_NAMESPACE_DECL
+
+extern unsigned long EC_TPC_debug_level;
+
+TAO_EC_TPC_Dispatching::TAO_EC_TPC_Dispatching (TAO_EC_Queue_Full_Service_Object* so)
+ : consumer_task_map_(TAO_EC_TPC_DISPATCHING_DEFAULT_MAP_SIZE)
+ , queue_full_service_object_(so)
+{
+ ACE_ASSERT (this->queue_full_service_object_ != 0);
+}
+
+TAO_EC_TPC_Dispatching::~TAO_EC_TPC_Dispatching ()
+{
+ // No other dispatching strategy has a DTOR body. I can only
+ // assume that it's guaranteed that shutdown() is called before
+ // the DTOR, so the tear-down logic needs to go in the shutdown,
+ // and the DTOR need not call shutdown.
+}
+
+int
+TAO_EC_TPC_Dispatching::add_consumer (RtecEventComm::PushConsumer_ptr consumer
+ ACE_ENV_ARG_DECL_NOT_USED)
+{
+ ACE_GUARD_RETURN (ACE_SYNCH_MUTEX, ace_mon, this->lock_, -1);
+
+ // Duplicate the pointer and hold it safely
+ RtecEventComm::PushConsumer_var pc =
+ RtecEventComm::PushConsumer::_duplicate(consumer);
+
+ if (EC_TPC_debug_level > 0)
+ ACE_DEBUG ((LM_DEBUG, "EC (%P|%t) TPC_Dispatching::add_consumer(%@)\n", pc.in()));
+
+ TAO_EC_Dispatching_Task* dtask =
+ new TAO_EC_TPC_Dispatching_Task (&this->thread_manager_,
+ this->queue_full_service_object_);
+
+ if (EC_TPC_debug_level > 0)
+ ACE_DEBUG ((LM_DEBUG, "EC (%P|%t) TPC_Dispatching::add_consumer(%@): new task %@\n", pc.in(), dtask));
+
+ if ((dtask->activate (TAO_EC_DEFAULT_DISPATCHING_THREADS_FLAGS,
+ 1, // we only want one thread to dispatch to a consumer
+ 1, // magic number??
+ TAO_EC_DEFAULT_DISPATCHING_THREADS_PRIORITY)) == -1)
+ {
+ ACE_DEBUG ((LM_WARNING,
+ "EC (%P|%t): TPC_Dispatching::add_consumer unable to activate"
+ " dispatching task for consumer (%@)\n",
+ consumer));
+ delete dtask;
+ return -1;
+ }
+
+ int bindresult =
+ this->consumer_task_map_.bind (RtecEventComm::PushConsumer::_duplicate(pc.in()),
+ dtask);
+ const char* explanation = 0;
+ if (bindresult == -1)
+ explanation = "general failure";
+ else if (bindresult == 1)
+ explanation = "entry already exists";
+
+ if (explanation != 0)
+ {
+ ACE_DEBUG ((LM_WARNING,
+ "EC (%P|%t): TPC_Dispatching::add_consumer failed to bind consumer (%@)"
+ " and dispatch task in map (%s): %p\n",
+ consumer, explanation));
+ dtask->putq (new TAO_EC_Shutdown_Task_Command);
+ dtask->wait ();
+ delete dtask;
+ return -1;
+ }
+
+ return 0;
+}
+
+int
+TAO_EC_TPC_Dispatching::remove_consumer (RtecEventComm::PushConsumer_ptr consumer
+ ACE_ENV_ARG_DECL_NOT_USED)
+{
+ ACE_GUARD_RETURN (ACE_SYNCH_MUTEX, ace_mon, this->lock_, -1);
+
+ TAO_EC_Dispatching_Task* dtask = 0;
+
+ if (this->consumer_task_map_.find (consumer, dtask) == -1)
+ {
+ ACE_DEBUG ((LM_WARNING,
+ "EC (%P|%t): TPC_Dispatching::remove_consumer failed to"
+ " find consumer (%@) in map\n", consumer));
+ return -1;
+ }
+
+ // Must have found it...first try to unbind
+ if (this->consumer_task_map_.unbind (consumer) == -1)
+ {
+ ACE_DEBUG ((LM_WARNING,
+ "EC (%P|%t): TPC_Dispatching::remove_consumer failed to"
+ " unbind consumer (%@) and task in map\n", consumer));
+ return -1;
+ }
+
+ dtask->putq (new TAO_EC_Shutdown_Task_Command);
+ CORBA::release (consumer); // This matches the _duplicate in add_consumer
+ return 0;
+}
+
+void
+TAO_EC_TPC_Dispatching::activate (void)
+{
+}
+
+void
+TAO_EC_TPC_Dispatching::shutdown (void)
+{
+ ACE_GUARD (ACE_SYNCH_MUTEX, ace_mon, this->lock_);
+
+ // The MT_Dispatching strategy sends a TAO_EC_Shutdown_Task_Command
+ // to the dispatching task. Is that what we should do here?
+ MAPTYPE::ITERATOR iter = this->consumer_task_map_.begin ();
+ while (! iter.done())
+ {
+ MAPTYPE::ENTRY* entry = 0;
+ if (! iter.next(entry))
+ continue;
+
+ entry->int_id_->putq (new TAO_EC_Shutdown_Task_Command);
+ iter.advance ();
+ }
+
+ this->thread_manager_.wait (); // Wait for the threads to terminate
+
+ // Now iterate again and call CORBA::release on the ext_id;
+ // we don't have to delete int_id_ b/c that happens in its close() method.
+ iter = this->consumer_task_map_.begin ();
+ while (! iter.done())
+ {
+ MAPTYPE::ENTRY* entry = 0;
+ if (! iter.next(entry))
+ continue;
+
+ CORBA::release (entry->ext_id_);
+ iter.advance ();
+ }
+
+ this->consumer_task_map_.unbind_all ();
+}
+
+void
+TAO_EC_TPC_Dispatching::push (TAO_EC_ProxyPushSupplier* proxy,
+ RtecEventComm::PushConsumer_ptr consumer,
+ const RtecEventComm::EventSet& event,
+ TAO_EC_QOS_Info& qos_info
+ ACE_ENV_ARG_DECL)
+{
+ RtecEventComm::EventSet event_copy = event;
+ this->push_nocopy (proxy, consumer, event_copy, qos_info ACE_ENV_ARG_PARAMETER);
+}
+
+void
+TAO_EC_TPC_Dispatching::push_nocopy (TAO_EC_ProxyPushSupplier* proxy,
+ RtecEventComm::PushConsumer_ptr consumer,
+ RtecEventComm::EventSet& event,
+ TAO_EC_QOS_Info&
+ ACE_ENV_ARG_DECL)
+{
+ if (EC_TPC_debug_level > 0)
+ ACE_DEBUG ((LM_DEBUG, "EC (%P|%t) TPC_Dispatching::push_nocopy(supplier=%@,consumer=%@)\n", proxy, consumer));
+
+ ACE_GUARD (ACE_SYNCH_MUTEX, ace_mon, this->lock_);
+ TAO_EC_Dispatching_Task* dtask;
+
+ if (this->consumer_task_map_.find (consumer, dtask) == -1)
+ {
+ ACE_DEBUG ((LM_WARNING,
+ "EC (%P|%t): TPC_Dispatching::push_nocopy failed to"
+ " find consumer (%@) in map\n", consumer));
+ }
+ else
+ {
+ dtask->push (proxy, consumer, event ACE_ENV_ARG_PARAMETER);
+ ACE_CHECK;
+ }
+}
+
+TAO_END_VERSIONED_NAMESPACE_DECL
diff --git a/TAO/orbsvcs/orbsvcs/Event/EC_TPC_Dispatching.h b/TAO/orbsvcs/orbsvcs/Event/EC_TPC_Dispatching.h
new file mode 100644
index 00000000000..b8c7ea49cd3
--- /dev/null
+++ b/TAO/orbsvcs/orbsvcs/Event/EC_TPC_Dispatching.h
@@ -0,0 +1,85 @@
+// -*- C++ -*-
+
+/**
+ * @file EC_TPC_Dispatching.h
+ *
+ * $Id$
+ *
+ * @author Chris Cleeland <cleeland at ociweb.com>
+ *
+ */
+
+#ifndef TAO_EC_TPC_DISPATCHING_H
+#define TAO_EC_TPC_DISPATCHING_H
+#include /**/ "ace/pre.h"
+
+#include "ace/Hash_Map_Manager_T.h"
+#include "ace/Null_Mutex.h"
+
+#include "orbsvcs/Event/EC_Dispatching.h"
+
+#if !defined (ACE_LACKS_PRAGMA_ONCE)
+# pragma once
+#endif /* ACE_LACKS_PRAGMA_ONCE */
+
+#include "orbsvcs/Event/EC_TPC_Dispatching_Task.h"
+
+TAO_BEGIN_VERSIONED_NAMESPACE_DECL
+
+class TAO_EC_Event_Channel_Base;
+
+/**
+ * @class TAO_EC_TPC_Dispatching
+ *
+ * @brief Dispatching strategy that isolates deliveries to a consumer from any other.
+ *
+ * This strategy uses a thread per consumer, and was specifically designed to
+ * isolate the effects of an ill-behaved consumer from affecting other consumers.
+ */
+class TAO_RTEvent_Serv_Export TAO_EC_TPC_Dispatching : public TAO_EC_Dispatching
+{
+public:
+ TAO_EC_TPC_Dispatching (TAO_EC_Queue_Full_Service_Object* so);
+ ~TAO_EC_TPC_Dispatching ();
+
+ // = The EC_Dispatching methods.
+ virtual void activate (void);
+ virtual void shutdown (void);
+ virtual void push (TAO_EC_ProxyPushSupplier* proxy,
+ RtecEventComm::PushConsumer_ptr consumer,
+ const RtecEventComm::EventSet& event,
+ TAO_EC_QOS_Info& qos_info
+ ACE_ENV_ARG_DECL);
+ virtual void push_nocopy (TAO_EC_ProxyPushSupplier* proxy,
+ RtecEventComm::PushConsumer_ptr consumer,
+ RtecEventComm::EventSet& event,
+ TAO_EC_QOS_Info& qos_info
+ ACE_ENV_ARG_DECL);
+
+ int add_consumer (RtecEventComm::PushConsumer_ptr consumer ACE_ENV_ARG_DECL);
+ int remove_consumer (RtecEventComm::PushConsumer_ptr consumer ACE_ENV_ARG_DECL);
+
+private:
+ // Use our own thread manager
+ ACE_Thread_Manager thread_manager_;
+
+ typedef ACE_Hash_Map_Manager_Ex<RtecEventComm::PushConsumer_ptr,TAO_EC_Dispatching_Task*,ACE_Pointer_Hash<RtecEventComm::PushConsumer_ptr>,ACE_Equal_To<RtecEventComm::PushConsumer_ptr>,ACE_Null_Mutex> MAPTYPE;
+
+ // Tweak the default size of this map by #defining
+ // TAO_EC_TPC_DISPATCHING_DEFAULT_MAP_SIZE
+ MAPTYPE consumer_task_map_;
+
+ // Lock for modifying the map. It's not enough to have a lock only
+ // on the map, because we have to hold the map constant while doing
+ // multiple distinct map manipulations, such as in remove_consumer().
+ ACE_SYNCH_MUTEX lock_;
+
+ // Service object information
+ TAO_EC_Queue_Full_Service_Object* queue_full_service_object_; // @@ who will release?
+ // @@ check to see how the factory gets released...
+};
+
+TAO_END_VERSIONED_NAMESPACE_DECL
+
+#include /**/ "ace/post.h"
+#endif /* TAO_EC_TPC_DISPATCHING_H */
diff --git a/TAO/orbsvcs/orbsvcs/Event/EC_TPC_Dispatching_Task.cpp b/TAO/orbsvcs/orbsvcs/Event/EC_TPC_Dispatching_Task.cpp
new file mode 100644
index 00000000000..f70fb6aeac9
--- /dev/null
+++ b/TAO/orbsvcs/orbsvcs/Event/EC_TPC_Dispatching_Task.cpp
@@ -0,0 +1,22 @@
+// $Id$
+
+#include "orbsvcs/Event/EC_TPC_Dispatching_Task.h"
+
+
+TAO_BEGIN_VERSIONED_NAMESPACE_DECL
+
+TAO_EC_TPC_Dispatching_Task::TAO_EC_TPC_Dispatching_Task
+(ACE_Thread_Manager* thr_mgr,
+ TAO_EC_Queue_Full_Service_Object* so)
+ : TAO_EC_Dispatching_Task (thr_mgr, so)
+{
+}
+
+int
+TAO_EC_TPC_Dispatching_Task::close (u_long /* flags */)
+{
+ delete this;
+ return 0;
+}
+
+TAO_END_VERSIONED_NAMESPACE_DECL
diff --git a/TAO/orbsvcs/orbsvcs/Event/EC_TPC_Dispatching_Task.h b/TAO/orbsvcs/orbsvcs/Event/EC_TPC_Dispatching_Task.h
new file mode 100644
index 00000000000..ff92abce00b
--- /dev/null
+++ b/TAO/orbsvcs/orbsvcs/Event/EC_TPC_Dispatching_Task.h
@@ -0,0 +1,34 @@
+// -*- C++ -*-
+
+/**
+ * @file EC_TPC_Dispatching_Task.h
+ *
+ * $Id$
+ *
+ * @author Chris Cleeland <cleeland at ociweb.com>
+ */
+
+#ifndef TAO_EC_TPC_DISPATCHING_TASK_H
+#define TAO_EC_TPC_DISPATCHING_TASK_H
+#include /**/ "ace/pre.h"
+
+#include "orbsvcs/Event/EC_Dispatching_Task.h"
+
+#if !defined (ACE_LACKS_PRAGMA_ONCE)
+# pragma once
+#endif /* ACE_LACKS_PRAGMA_ONCE */
+
+TAO_BEGIN_VERSIONED_NAMESPACE_DECL
+
+class TAO_RTEvent_Serv_Export TAO_EC_TPC_Dispatching_Task : public TAO_EC_Dispatching_Task
+{
+public:
+ /// Constructor
+ TAO_EC_TPC_Dispatching_Task (ACE_Thread_Manager* thr_mgr, TAO_EC_Queue_Full_Service_Object* so);
+ virtual int close (u_long flags = 0);
+};
+
+TAO_END_VERSIONED_NAMESPACE_DECL
+
+#include /**/ "ace/post.h"
+#endif /* TAO_EC_TPC_DISPATCHING_TASK_H */
diff --git a/TAO/orbsvcs/orbsvcs/Event/EC_TPC_Factory.cpp b/TAO/orbsvcs/orbsvcs/Event/EC_TPC_Factory.cpp
new file mode 100644
index 00000000000..c8e822ed5b9
--- /dev/null
+++ b/TAO/orbsvcs/orbsvcs/Event/EC_TPC_Factory.cpp
@@ -0,0 +1,124 @@
+// $Id$
+
+#include "orbsvcs/Event/EC_TPC_Factory.h"
+
+#include "orbsvcs/Event/EC_TPC_Dispatching.h"
+#include "orbsvcs/Event/EC_TPC_ProxySupplier.h"
+#include "orbsvcs/Event/EC_TPC_ProxyConsumer.h"
+
+#include "tao/ORB_Core.h"
+
+#include "ace/Arg_Shifter.h"
+#include "ace/Sched_Params.h"
+#include "ace/OS_NS_strings.h"
+
+ACE_RCSID(Event, EC_TPC_Factory, "$Id$")
+
+TAO_BEGIN_VERSIONED_NAMESPACE_DECL
+
+unsigned long EC_TPC_debug_level;
+
+TAO_EC_TPC_Factory::TAO_EC_TPC_Factory (void)
+{
+ EC_TPC_debug_level = 0;
+}
+
+TAO_EC_TPC_Factory::~TAO_EC_TPC_Factory (void)
+{
+}
+
+int
+TAO_EC_TPC_Factory::init_svcs (void)
+{
+ TAO_EC_Simple_Queue_Full_Action::init_svcs();
+ return ACE_Service_Config::static_svcs ()->
+ insert (&ace_svc_desc_TAO_EC_TPC_Factory);
+}
+
+int
+TAO_EC_TPC_Factory::init (int argc, char* argv[])
+{
+ ACE_Arg_Shifter arg_shifter (argc, argv);
+
+ while (arg_shifter.is_anything_left ())
+ {
+ const char *arg = arg_shifter.get_current ();
+
+ if (ACE_OS::strcasecmp (arg, "-ECDispatching") == 0)
+ {
+ arg_shifter.consume_arg ();
+
+ if (arg_shifter.is_parameter_next ())
+ {
+ // Here we print out a message indicating that this
+ // option isn't valid with this factory and that it's
+ // being ignored.
+
+ ACE_DEBUG ((LM_ERROR,
+ "EC_TPC_Factory - "
+ "-ECDispatching not supported with TPC_Factory; ignoring the option and using thread-per-consumer dispatch strategy\n"));
+ arg_shifter.consume_arg ();
+ }
+ }
+ if (ACE_OS::strcasecmp (arg, "-ECTPCDebug") == 0)
+ {
+ arg_shifter.consume_arg ();
+ ++EC_TPC_debug_level;
+ }
+ else
+ {
+ arg_shifter.ignore_arg ();
+ }
+
+ }
+
+ return TAO_EC_Default_Factory::init (argc, argv);
+}
+
+// ****************************************************************
+
+TAO_EC_Dispatching*
+TAO_EC_TPC_Factory::create_dispatching (TAO_EC_Event_Channel_Base *)
+{
+ if (EC_TPC_debug_level > 0)
+ ACE_DEBUG ((LM_DEBUG, "EC (%P|%t) EC_TPC_Factory::create_dispatching\n"));
+
+ TAO_EC_Queue_Full_Service_Object* so =
+ this->find_service_object (this->queue_full_service_object_name_.fast_rep(),
+ TAO_EC_DEFAULT_QUEUE_FULL_SERVICE_OBJECT_NAME);
+
+ return new TAO_EC_TPC_Dispatching (so);
+}
+
+
+TAO_EC_ProxyPushSupplier*
+TAO_EC_TPC_Factory::create_proxy_push_supplier (TAO_EC_Event_Channel_Base *ec)
+{
+ if (EC_TPC_debug_level > 0)
+ ACE_DEBUG ((LM_DEBUG, "EC (%P|%t) EC_TPC_Factory::create_proxy_push_supplier\n"));
+ return new TAO_EC_TPC_ProxyPushSupplier (ec, this->consumer_validate_connection_);
+}
+
+
+TAO_EC_ProxyPushConsumer*
+TAO_EC_TPC_Factory::create_proxy_push_consumer (TAO_EC_Event_Channel_Base *ec)
+{
+ if (EC_TPC_debug_level > 0)
+ ACE_DEBUG ((LM_DEBUG, "EC (%P|%t) EC_TPC_Factory::create_proxy_push_consumer\n"));
+ return new TAO_EC_TPC_ProxyPushConsumer (ec);
+}
+
+TAO_END_VERSIONED_NAMESPACE_DECL
+
+// ****************************************************************
+
+ACE_STATIC_SVC_DEFINE (TAO_EC_TPC_Factory,
+ ACE_TEXT ("EC_Factory"),
+ ACE_SVC_OBJ_T,
+ &ACE_SVC_NAME (TAO_EC_TPC_Factory),
+ ACE_Service_Type::DELETE_THIS | ACE_Service_Type::DELETE_OBJ,
+ 0)
+ACE_FACTORY_DEFINE (TAO_RTEvent_Serv, TAO_EC_TPC_Factory)
+
+// ****************************************************************
+
diff --git a/TAO/orbsvcs/orbsvcs/Event/EC_TPC_Factory.h b/TAO/orbsvcs/orbsvcs/Event/EC_TPC_Factory.h
new file mode 100644
index 00000000000..c65e5be61cc
--- /dev/null
+++ b/TAO/orbsvcs/orbsvcs/Event/EC_TPC_Factory.h
@@ -0,0 +1,67 @@
+// -*- C++ -*-
+/**
+ * @file EC_TPC_Factory.h
+ *
+ * $Id$
+ *
+ */
+
+#ifndef TAO_EC_TPC_FACTORY_H
+#define TAO_EC_TPC_FACTORY_H
+#include /**/ "ace/pre.h"
+
+#include "orbsvcs/Event/EC_Default_Factory.h"
+
+#if !defined (ACE_LACKS_PRAGMA_ONCE)
+# pragma once
+#endif /* ACE_LACKS_PRAGMA_ONCE */
+
+TAO_BEGIN_VERSIONED_NAMESPACE_DECL
+
+/**
+ * @class TAO_EC_TPC_Factory
+ *
+ * @brief A generic factory for EC experimentation.
+ *
+ * This class allows the user to experiment with different EC
+ * configurations. Using a command-line like interface the user
+ * can specify which strategies will this factory generate.
+ * Since the class can be dynamically loaded the strategies can be
+ * set in the service configurator file.
+ */
+class TAO_RTEvent_Serv_Export TAO_EC_TPC_Factory : public TAO_EC_Default_Factory
+{
+public:
+ /// Constructor
+ TAO_EC_TPC_Factory (void);
+
+ /// destructor...
+ virtual ~TAO_EC_TPC_Factory (void);
+
+ /// Helper function to register the default factory into the service
+ /// configurator.
+ static int init_svcs (void);
+
+ // = The Service_Object entry points
+ virtual int init (int argc, char* argv[]);
+
+ // = The EC_Factory methods
+ virtual TAO_EC_Dispatching*
+ create_dispatching (TAO_EC_Event_Channel_Base*);
+
+ virtual TAO_EC_ProxyPushSupplier*
+ create_proxy_push_supplier (TAO_EC_Event_Channel_Base*);
+
+ virtual TAO_EC_ProxyPushConsumer*
+ create_proxy_push_consumer (TAO_EC_Event_Channel_Base*);
+};
+
+extern unsigned long EC_TPC_debug_level;
+
+TAO_END_VERSIONED_NAMESPACE_DECL
+
+ACE_STATIC_SVC_DECLARE (TAO_EC_TPC_Factory)
+ACE_FACTORY_DECLARE (TAO_RTEvent_Serv, TAO_EC_TPC_Factory)
+
+#include /**/ "ace/post.h"
+#endif /* TAO_EC_TPC_FACTORY_H */
diff --git a/TAO/orbsvcs/orbsvcs/Event/EC_TPC_ProxyConsumer.cpp b/TAO/orbsvcs/orbsvcs/Event/EC_TPC_ProxyConsumer.cpp
new file mode 100644
index 00000000000..6a7cc347cb1
--- /dev/null
+++ b/TAO/orbsvcs/orbsvcs/Event/EC_TPC_ProxyConsumer.cpp
@@ -0,0 +1,55 @@
+// $Id$
+
+#include "orbsvcs/Event/EC_TPC_ProxyConsumer.h"
+
+ACE_RCSID(Event, EC_TPC_ProxyConsumer, "$Id$")
+
+#include "orbsvcs/Event/EC_Event_Channel_Base.h"
+#include "orbsvcs/Event/EC_TPC_Dispatching.h"
+
+TAO_BEGIN_VERSIONED_NAMESPACE_DECL
+
+extern unsigned long EC_TPC_debug_level;
+
+TAO_EC_TPC_ProxyPushConsumer::TAO_EC_TPC_ProxyPushConsumer (TAO_EC_Event_Channel_Base* ec)
+: TAO_EC_Default_ProxyPushConsumer (ec)
+{
+}
+
+TAO_EC_TPC_Dispatching*
+TAO_EC_TPC_ProxyPushConsumer::tpc_dispatching ()
+{
+ TAO_EC_Dispatching* dispatcher = this->event_channel_->dispatching ();
+ TAO_EC_TPC_Dispatching* tpcdispatcher =
+ dynamic_cast<TAO_EC_TPC_Dispatching*>(dispatcher);
+ return tpcdispatcher;
+}
+
+TAO_EC_TPC_ProxyPushConsumer::~TAO_EC_TPC_ProxyPushConsumer (void)
+{
+ // @@@ Do I need to call the logic to remove the consumer from the
+ // dispatch map in here? I'm not sure... But, if I do, then I need
+ // to fact that "remove" code out of just the
+ // disconnect_push_consumer.
+ if (EC_TPC_debug_level > 0)
+ ACE_DEBUG ((LM_DEBUG, "RTEC (%P|%t): inside ~TAO_EC_TPC_ProxyPushConsumer (%x)\n", this));
+}
+
+void
+TAO_EC_TPC_ProxyPushConsumer::disconnect_push_consumer (
+ ACE_ENV_SINGLE_ARG_DECL)
+ ACE_THROW_SPEC ((CORBA::SystemException))
+{
+ RtecEventComm::PushConsumer_var emulated_exceptions_suck =
+ this->_this (ACE_ENV_SINGLE_ARG_PARAMETER);
+ ACE_CHECK;
+
+ this->tpc_dispatching ()->remove_consumer (emulated_exceptions_suck.in ()
+ ACE_ENV_ARG_PARAMETER);
+ ACE_CHECK;
+
+ BASECLASS::disconnect_push_consumer (ACE_ENV_SINGLE_ARG_PARAMETER);
+ ACE_CHECK;
+}
+
+TAO_END_VERSIONED_NAMESPACE_DECL
diff --git a/TAO/orbsvcs/orbsvcs/Event/EC_TPC_ProxyConsumer.h b/TAO/orbsvcs/orbsvcs/Event/EC_TPC_ProxyConsumer.h
new file mode 100644
index 00000000000..9fb7ff1dc0c
--- /dev/null
+++ b/TAO/orbsvcs/orbsvcs/Event/EC_TPC_ProxyConsumer.h
@@ -0,0 +1,50 @@
+// -*- C++ -*-
+
+/**
+ * @file EC_TPC_ProxyConsumer.h
+ *
+ * $Id$
+ *
+ * @author Chris Cleeland <cleeland at ociweb.com >
+ *
+ */
+
+#ifndef TAO_EC_TPC_PROXYCONSUMER_H
+#define TAO_EC_TPC_PROXYCONSUMER_H
+#include /**/ "ace/pre.h"
+
+#include "orbsvcs/Event/EC_Default_ProxyConsumer.h"
+
+#if !defined (ACE_LACKS_PRAGMA_ONCE)
+# pragma once
+#endif /* ACE_LACKS_PRAGMA_ONCE */
+
+TAO_BEGIN_VERSIONED_NAMESPACE_DECL
+
+class TAO_EC_Dispatching;
+class TAO_EC_TPC_Dispatching;
+
+/**
+ * @class TAO_EC_TPC_ProxyPushConsumer
+ *
+ */
+class TAO_RTEvent_Serv_Export TAO_EC_TPC_ProxyPushConsumer :
+ public TAO_EC_Default_ProxyPushConsumer
+{
+public:
+ TAO_EC_TPC_ProxyPushConsumer (TAO_EC_Event_Channel_Base* ec);
+ virtual ~TAO_EC_TPC_ProxyPushConsumer (void);
+
+ virtual void disconnect_push_consumer (ACE_ENV_SINGLE_ARG_DECL_NOT_USED)
+ ACE_THROW_SPEC ((CORBA::SystemException));
+
+private:
+ typedef TAO_EC_Default_ProxyPushConsumer BASECLASS;
+ TAO_EC_TPC_Dispatching* tpc_dispatching ();
+};
+
+TAO_END_VERSIONED_NAMESPACE_DECL
+
+#include /**/ "ace/post.h"
+
+#endif
diff --git a/TAO/orbsvcs/orbsvcs/Event/EC_TPC_ProxySupplier.cpp b/TAO/orbsvcs/orbsvcs/Event/EC_TPC_ProxySupplier.cpp
new file mode 100644
index 00000000000..6ead39a342e
--- /dev/null
+++ b/TAO/orbsvcs/orbsvcs/Event/EC_TPC_ProxySupplier.cpp
@@ -0,0 +1,76 @@
+// $Id$
+
+#include "orbsvcs/Event/EC_TPC_ProxySupplier.h"
+
+#if ! defined (__ACE_INLINE__)
+#include "orbsvcs/Event/EC_TPC_ProxySupplier.i"
+#endif /* __ACE_INLINE__ */
+
+ACE_RCSID(Event, EC_TPC_ProxySupplier, "$Id$")
+
+#include "orbsvcs/Event/EC_Event_Channel_Base.h"
+#include "orbsvcs/Event/EC_TPC_Dispatching.h"
+
+TAO_BEGIN_VERSIONED_NAMESPACE_DECL
+
+extern unsigned long EC_TPC_debug_level;
+
+TAO_EC_TPC_ProxyPushSupplier::~TAO_EC_TPC_ProxyPushSupplier (void)
+{
+
+}
+
+void
+TAO_EC_TPC_ProxyPushSupplier:: disconnect_push_supplier (ACE_ENV_SINGLE_ARG_DECL)
+ ACE_THROW_SPEC ((CORBA::SystemException))
+{
+ if (EC_TPC_debug_level > 0)
+ ACE_DEBUG ((LM_DEBUG, "EC (%P|%t): enter EC_TPC_ProxySupplier::disconnect_push_supplier (%@): refcount=%u,consumer=%@\n",
+ this,
+ this->refcount_,
+ this->consumer_.in()));
+
+ if (this->is_connected_i ())
+ {
+ this->tpc_dispatching ()->remove_consumer (this->consumer_.in()
+ ACE_ENV_ARG_PARAMETER);
+ ACE_CHECK;
+ }
+ BASECLASS::disconnect_push_supplier (ACE_ENV_SINGLE_ARG_PARAMETER);
+ ACE_CHECK;
+
+ if (EC_TPC_debug_level > 0)
+ ACE_DEBUG ((LM_DEBUG, "EC (%P|%t): leave EC_TPC_ProxySupplier::disconnect_push_supplier (%@)\n", this));
+}
+
+TAO_EC_TPC_Dispatching*
+TAO_EC_TPC_ProxyPushSupplier::tpc_dispatching ()
+{
+ TAO_EC_Dispatching* dispatcher = this->event_channel_->dispatching ();
+
+ return dynamic_cast <TAO_EC_TPC_Dispatching*> (dispatcher);
+}
+
+void
+TAO_EC_TPC_ProxyPushSupplier::connect_push_consumer (
+ RtecEventComm::PushConsumer_ptr push_consumer,
+ const RtecEventChannelAdmin::ConsumerQOS& qos
+ ACE_ENV_ARG_DECL)
+ ACE_THROW_SPEC ((CORBA::SystemException,
+ RtecEventChannelAdmin::AlreadyConnected,
+ RtecEventChannelAdmin::TypeError))
+{
+ BASECLASS::connect_push_consumer (push_consumer, qos ACE_ENV_ARG_PARAMETER);
+ ACE_CHECK;
+
+ if (EC_TPC_debug_level > 0)
+ ACE_DEBUG ((LM_DEBUG, "EC (%P|%t): EC_ProxySupplier(%@): refcount=%u,consumer=%@\n",
+ this, this->refcount_, this->consumer_.in()));
+
+ TAO_EC_TPC_Dispatching* tpcdispatcher = this->tpc_dispatching ();
+
+ // the new dispatching task gets automatically created
+ tpcdispatcher->add_consumer (push_consumer ACE_ENV_ARG_PARAMETER);
+}
+
+TAO_END_VERSIONED_NAMESPACE_DECL
diff --git a/TAO/orbsvcs/orbsvcs/Event/EC_TPC_ProxySupplier.h b/TAO/orbsvcs/orbsvcs/Event/EC_TPC_ProxySupplier.h
new file mode 100644
index 00000000000..345b17c0619
--- /dev/null
+++ b/TAO/orbsvcs/orbsvcs/Event/EC_TPC_ProxySupplier.h
@@ -0,0 +1,64 @@
+// -*- C++ -*-
+/**
+ * @file EC_TPC_ProxySupplier.h
+ *
+ * $Id$
+ *
+ * @author Chris Cleeland <cleeland at ociweb.com>
+ *
+ */
+
+#ifndef TAO_EC_TPC_PROXYSUPPLIER_H
+#define TAO_EC_TPC_PROXYSUPPLIER_H
+#include /**/ "ace/pre.h"
+
+#include "orbsvcs/Event/EC_Default_ProxySupplier.h"
+
+#if !defined (ACE_LACKS_PRAGMA_ONCE)
+# pragma once
+#endif /* ACE_LACKS_PRAGMA_ONCE */
+
+TAO_BEGIN_VERSIONED_NAMESPACE_DECL
+
+class TAO_EC_Dispatching;
+class TAO_EC_TPC_Dispatching;
+
+class TAO_RTEvent_Serv_Export TAO_EC_TPC_ProxyPushSupplier :
+ public TAO_EC_Default_ProxyPushSupplier
+{
+public:
+ /// Constructor
+ TAO_EC_TPC_ProxyPushSupplier (TAO_EC_Event_Channel_Base* event_channel, int validate_connection);
+
+ /// Dtor
+ virtual ~TAO_EC_TPC_ProxyPushSupplier (void);
+
+ /*! These are overriden from the base class in order to maintain the
+ map in the dispatcher class. */
+
+ // = The RtecEventChannelAdmin::ProxyPushSupplier methods...
+ virtual void connect_push_consumer (
+ RtecEventComm::PushConsumer_ptr push_consumer,
+ const RtecEventChannelAdmin::ConsumerQOS &qos
+ ACE_ENV_ARG_DECL_NOT_USED)
+ ACE_THROW_SPEC ((CORBA::SystemException,
+ RtecEventChannelAdmin::AlreadyConnected,
+ RtecEventChannelAdmin::TypeError));
+
+ virtual void disconnect_push_supplier (ACE_ENV_SINGLE_ARG_DECL_NOT_USED)
+ ACE_THROW_SPEC ((CORBA::SystemException));
+
+private:
+ typedef TAO_EC_Default_ProxyPushSupplier BASECLASS;
+ TAO_EC_TPC_Dispatching* tpc_dispatching ();
+};
+
+TAO_END_VERSIONED_NAMESPACE_DECL
+
+#if defined (__ACE_INLINE__)
+#include "orbsvcs/Event/EC_TPC_ProxySupplier.i"
+#endif /* __ACE_INLINE__ */
+
+#include /**/ "ace/post.h"
+
+#endif
diff --git a/TAO/orbsvcs/orbsvcs/Event/EC_TPC_ProxySupplier.i b/TAO/orbsvcs/orbsvcs/Event/EC_TPC_ProxySupplier.i
new file mode 100644
index 00000000000..6a31a5fc0d1
--- /dev/null
+++ b/TAO/orbsvcs/orbsvcs/Event/EC_TPC_ProxySupplier.i
@@ -0,0 +1,17 @@
+// -*- C++ -*-
+//
+// $Id$
+
+TAO_BEGIN_VERSIONED_NAMESPACE_DECL
+
+extern unsigned long EC_TPC_debug_level;
+
+ACE_INLINE
+TAO_EC_TPC_ProxyPushSupplier::TAO_EC_TPC_ProxyPushSupplier (TAO_EC_Event_Channel_Base* ec, int validate_connection)
+: TAO_EC_Default_ProxyPushSupplier (ec, validate_connection)
+{
+ if (EC_TPC_debug_level > 0)
+ ACE_DEBUG ((LM_DEBUG, "(%P|%t) EC_TPC_ProxyPushSupplier::CTOR (%@)\n", this));
+}
+
+TAO_END_VERSIONED_NAMESPACE_DECL
diff --git a/TAO/orbsvcs/orbsvcs/Event/EC_Timeout_Filter.cpp b/TAO/orbsvcs/orbsvcs/Event/EC_Timeout_Filter.cpp
new file mode 100644
index 00000000000..3b479983a13
--- /dev/null
+++ b/TAO/orbsvcs/orbsvcs/Event/EC_Timeout_Filter.cpp
@@ -0,0 +1,171 @@
+// $Id$
+
+#include "orbsvcs/Event/EC_Timeout_Filter.h"
+#include "orbsvcs/Event/EC_Timeout_Generator.h"
+#include "orbsvcs/Event/EC_Event_Channel_Base.h"
+#include "orbsvcs/Event/EC_ProxySupplier.h"
+#include "orbsvcs/Time_Utilities.h"
+#include "orbsvcs/Event_Service_Constants.h"
+
+#if ! defined (__ACE_INLINE__)
+#include "orbsvcs/Event/EC_Timeout_Filter.i"
+#endif /* __ACE_INLINE__ */
+
+ACE_RCSID (Event,
+ EC_Timeout_Filter,
+ "$Id$")
+
+TAO_BEGIN_VERSIONED_NAMESPACE_DECL
+
+TAO_EC_Timeout_Filter::TAO_EC_Timeout_Filter (
+ TAO_EC_Event_Channel_Base *event_channel,
+ TAO_EC_ProxyPushSupplier *supplier,
+ const TAO_EC_QOS_Info& qos_info,
+ RtecEventComm::EventType type,
+ RtecEventComm::Time period)
+ : event_channel_ (event_channel),
+ supplier_ (supplier),
+ qos_info_ (qos_info),
+ type_ (type),
+ period_ (period),
+ id_ (-1)
+{
+ ACE_Time_Value tv_delta;
+ ORBSVCS_Time::TimeT_to_Time_Value (tv_delta, period);
+
+ TAO_EC_Timeout_Generator *tg =
+ this->event_channel_->timeout_generator ();
+
+ if (this->type_ == ACE_ES_EVENT_INTERVAL_TIMEOUT
+ || this->type_ == ACE_ES_EVENT_DEADLINE_TIMEOUT)
+ {
+ ACE_Time_Value tv_interval;
+ ORBSVCS_Time::TimeT_to_Time_Value (tv_interval, this->period_);
+
+ this->id_ =
+ tg->schedule_timer (this,
+ tv_delta,
+ tv_interval);
+ }
+ else
+ {
+ this->id_ =
+ tg->schedule_timer (this,
+ tv_delta,
+ ACE_Time_Value::zero);
+ }
+
+ // ACE_DEBUG ((LM_DEBUG,
+ // "EC_Timeout_Filter - interval = %d:%d, ID = %d\n",
+ // tv_interval.sec (), tv_interval.usec (),
+ // this->id_));
+}
+
+TAO_EC_Timeout_Filter::~TAO_EC_Timeout_Filter (void)
+{
+ this->event_channel_->timeout_generator ()->cancel_timer (this->qos_info_,
+ this->id_);
+}
+
+void
+TAO_EC_Timeout_Filter::push_to_proxy (const RtecEventComm::EventSet& event,
+ TAO_EC_QOS_Info& qos_info
+ ACE_ENV_ARG_DECL)
+{
+ qos_info.timer_id_ = this->id_;
+
+ if (this->supplier_ != 0)
+ this->supplier_->filter (event,
+ qos_info
+ ACE_ENV_ARG_PARAMETER);
+}
+
+int
+TAO_EC_Timeout_Filter::filter (const RtecEventComm::EventSet &event,
+ TAO_EC_QOS_Info &qos_info
+ ACE_ENV_ARG_DECL)
+{
+ if (qos_info.timer_id_ == this->id_
+ && this->parent () != 0)
+ {
+ this->parent ()->push (event, qos_info ACE_ENV_ARG_PARAMETER);
+ ACE_CHECK_RETURN (0);
+ return 1;
+ }
+ return 0;
+}
+
+int
+TAO_EC_Timeout_Filter::filter_nocopy (RtecEventComm::EventSet &event,
+ TAO_EC_QOS_Info &qos_info
+ ACE_ENV_ARG_DECL)
+{
+ if (qos_info.timer_id_ == this->id_
+ && this->parent () != 0)
+ {
+ this->parent ()->push_nocopy (event, qos_info ACE_ENV_ARG_PARAMETER);
+ ACE_CHECK_RETURN (0);
+ return 1;
+ }
+ return 0;
+}
+
+void
+TAO_EC_Timeout_Filter::push (const RtecEventComm::EventSet&,
+ TAO_EC_QOS_Info&
+ ACE_ENV_ARG_DECL_NOT_USED)
+{
+}
+
+void
+TAO_EC_Timeout_Filter::push_nocopy (RtecEventComm::EventSet&,
+ TAO_EC_QOS_Info&
+ ACE_ENV_ARG_DECL_NOT_USED)
+{
+}
+
+void
+TAO_EC_Timeout_Filter::clear (void)
+{
+ if (this->type_ == ACE_ES_EVENT_DEADLINE_TIMEOUT)
+ {
+ TAO_EC_Timeout_Generator *tg =
+ this->event_channel_->timeout_generator ();
+
+ tg->cancel_timer (this->qos_info_,
+ this->id_);
+
+ ACE_Time_Value tv_interval;
+ ORBSVCS_Time::TimeT_to_Time_Value (tv_interval, this->period_);
+ ACE_Time_Value tv_delta = tv_interval;
+
+ this->id_ =
+ tg->schedule_timer (this,
+ tv_delta,
+ tv_interval);
+ }
+}
+
+CORBA::ULong
+TAO_EC_Timeout_Filter::max_event_size (void) const
+{
+ return 1;
+}
+
+int
+TAO_EC_Timeout_Filter::can_match (
+ const RtecEventComm::EventHeader&) const
+{
+ return 0;
+}
+
+int
+TAO_EC_Timeout_Filter::add_dependencies (
+ const RtecEventComm::EventHeader&,
+ const TAO_EC_QOS_Info &
+ ACE_ENV_ARG_DECL_NOT_USED)
+{
+ return 0;
+}
+
+TAO_END_VERSIONED_NAMESPACE_DECL
diff --git a/TAO/orbsvcs/orbsvcs/Event/EC_Timeout_Filter.h b/TAO/orbsvcs/orbsvcs/Event/EC_Timeout_Filter.h
new file mode 100644
index 00000000000..0658f0b0b46
--- /dev/null
+++ b/TAO/orbsvcs/orbsvcs/Event/EC_Timeout_Filter.h
@@ -0,0 +1,120 @@
+// -*- C++ -*-
+
+/**
+ * @file EC_Timeout_Filter.h
+ *
+ * $Id$
+ *
+ * @author Carlos O'Ryan (coryan@cs.wustl.edu)
+ *
+ * Based on previous work by Tim Harrison (harrison@cs.wustl.edu) and
+ * other members of the DOC group. More details can be found in:
+ *
+ * http://doc.ece.uci.edu/~coryan/EC/index.html
+ */
+
+#ifndef TAO_EC_TIMEOUT_FILTER_H
+#define TAO_EC_TIMEOUT_FILTER_H
+
+#include /**/ "ace/pre.h"
+
+#include "orbsvcs/Event/EC_Filter.h"
+
+#if !defined (ACE_LACKS_PRAGMA_ONCE)
+# pragma once
+#endif /* ACE_LACKS_PRAGMA_ONCE */
+
+#include "orbsvcs/Event/EC_QOS_Info.h"
+
+TAO_BEGIN_VERSIONED_NAMESPACE_DECL
+
+class TAO_EC_Event_Channel_Base;
+class TAO_EC_ProxyPushSupplier;
+
+/**
+ * @class TAO_EC_Timeout_Filter
+ *
+ * @brief A filter based on event type/source
+ *
+ * This filter only accept events with a predefined type/source,
+ * both the source and the type can be wildcards.
+ */
+class TAO_RTEvent_Serv_Export TAO_EC_Timeout_Filter : public TAO_EC_Filter
+{
+public:
+ /// Constructor.
+ TAO_EC_Timeout_Filter (TAO_EC_Event_Channel_Base *event_channel,
+ TAO_EC_ProxyPushSupplier *supplier,
+ const TAO_EC_QOS_Info& qos_info,
+ RtecEventComm::EventType type,
+ RtecEventComm::Time period);
+
+ /// Destructor.
+ virtual ~TAO_EC_Timeout_Filter (void);
+
+ /// Return the QOS_Info for this Timeout filter.
+ const TAO_EC_QOS_Info& qos_info (void) const;
+
+ /// The type of timeout event that we generate.
+ RtecEventComm::EventType type (void) const;
+
+ /// Callback from the Timeout_Generator
+ void push_to_proxy (const RtecEventComm::EventSet& event,
+ TAO_EC_QOS_Info& qos_info
+ ACE_ENV_ARG_DECL);
+
+ // = The TAO_EC_Filter methods, please check the documentation in
+ // TAO_EC_Filter.
+ virtual int filter (const RtecEventComm::EventSet& event,
+ TAO_EC_QOS_Info& qos_info
+ ACE_ENV_ARG_DECL);
+ virtual int filter_nocopy (RtecEventComm::EventSet& event,
+ TAO_EC_QOS_Info& qos_info
+ ACE_ENV_ARG_DECL);
+ virtual void push (const RtecEventComm::EventSet& event,
+ TAO_EC_QOS_Info& qos_info
+ ACE_ENV_ARG_DECL);
+ virtual void push_nocopy (RtecEventComm::EventSet& event,
+ TAO_EC_QOS_Info& qos_info
+ ACE_ENV_ARG_DECL);
+ virtual void clear (void);
+ virtual CORBA::ULong max_event_size (void) const;
+ virtual int can_match (const RtecEventComm::EventHeader& header) const;
+ virtual int add_dependencies (const RtecEventComm::EventHeader& header,
+ const TAO_EC_QOS_Info &qos_info
+ ACE_ENV_ARG_DECL);
+
+private:
+ TAO_EC_Timeout_Filter (const TAO_EC_Timeout_Filter&);
+ TAO_EC_Timeout_Filter& operator= (const TAO_EC_Timeout_Filter&);
+
+private:
+ /// The event channel.
+ TAO_EC_Event_Channel_Base* event_channel_;
+
+ /// The supplier that finally receives the timeout event.
+ TAO_EC_ProxyPushSupplier *supplier_;
+
+ /// Events "generated" by this filter use this QOS_Info.
+ TAO_EC_QOS_Info qos_info_;
+
+ /// The type of timeout event...
+ RtecEventComm::EventType type_;
+
+ /// The period for deadline timeouts...
+ RtecEventComm::Time period_;
+
+ /// The ID of the timeout in the Timeout_Generator, for
+ /// cancellation.
+ long id_;
+};
+
+TAO_END_VERSIONED_NAMESPACE_DECL
+
+#if defined (__ACE_INLINE__)
+#include "orbsvcs/Event/EC_Timeout_Filter.i"
+#endif /* __ACE_INLINE__ */
+
+#include /**/ "ace/post.h"
+
+#endif /* TAO_EC_TIMEOUT_FILTER_H */
diff --git a/TAO/orbsvcs/orbsvcs/Event/EC_Timeout_Filter.i b/TAO/orbsvcs/orbsvcs/Event/EC_Timeout_Filter.i
new file mode 100644
index 00000000000..a6e30773801
--- /dev/null
+++ b/TAO/orbsvcs/orbsvcs/Event/EC_Timeout_Filter.i
@@ -0,0 +1,19 @@
+// -*- C++ -*-
+//
+// $Id$
+
+TAO_BEGIN_VERSIONED_NAMESPACE_DECL
+
+ACE_INLINE const TAO_EC_QOS_Info&
+TAO_EC_Timeout_Filter::qos_info (void) const
+{
+ return this->qos_info_;
+}
+
+ACE_INLINE RtecEventComm::EventType
+TAO_EC_Timeout_Filter::type (void) const
+{
+ return this->type_;
+}
+
+TAO_END_VERSIONED_NAMESPACE_DECL
diff --git a/TAO/orbsvcs/orbsvcs/Event/EC_Timeout_Generator.cpp b/TAO/orbsvcs/orbsvcs/Event/EC_Timeout_Generator.cpp
new file mode 100644
index 00000000000..23d098ceba6
--- /dev/null
+++ b/TAO/orbsvcs/orbsvcs/Event/EC_Timeout_Generator.cpp
@@ -0,0 +1,61 @@
+// $Id$
+
+#include "orbsvcs/Event/EC_Timeout_Generator.h"
+#include "orbsvcs/Event/EC_Timeout_Filter.h"
+#include "orbsvcs/Event_Service_Constants.h"
+
+#if ! defined (__ACE_INLINE__)
+#include "orbsvcs/Event/EC_Timeout_Generator.i"
+#endif /* __ACE_INLINE__ */
+
+ACE_RCSID (Event,
+ EC_Timeout_Generator,
+ "$Id$")
+
+TAO_BEGIN_VERSIONED_NAMESPACE_DECL
+
+TAO_EC_Timeout_Generator::~TAO_EC_Timeout_Generator (void)
+{
+}
+
+// ****************************************************************
+
+int
+TAO_EC_Timeout_Adapter::handle_timeout (const ACE_Time_Value & /* tv */,
+ const void *vp)
+{
+ // ACE_DEBUG ((LM_DEBUG,
+ // "TAO_EC_Timeout_Adapter::handle_timeout -"
+ // " expire at %d:%d\n",
+ // tv.sec (), tv.usec ()));
+
+ TAO_EC_Timeout_Filter *filter =
+ static_cast<TAO_EC_Timeout_Filter*> (const_cast<void*> (vp));
+
+ if (filter == 0)
+ return 0;
+
+ ACE_TRY_NEW_ENV
+ {
+ RtecEventComm::Event e;
+ e.header.type = filter->type ();
+ e.header.source = 0;
+
+ RtecEventComm::EventSet single_event (1, 1, &e, 0);
+
+ TAO_EC_QOS_Info qos_info = filter->qos_info ();
+ filter->push_to_proxy (single_event,
+ qos_info
+ ACE_ENV_ARG_PARAMETER);
+ ACE_TRY_CHECK;
+ }
+ ACE_CATCHANY
+ {
+ return -1;
+ }
+ ACE_ENDTRY;
+
+ return 0;
+}
+
+TAO_END_VERSIONED_NAMESPACE_DECL
diff --git a/TAO/orbsvcs/orbsvcs/Event/EC_Timeout_Generator.h b/TAO/orbsvcs/orbsvcs/Event/EC_Timeout_Generator.h
new file mode 100644
index 00000000000..44a6642de69
--- /dev/null
+++ b/TAO/orbsvcs/orbsvcs/Event/EC_Timeout_Generator.h
@@ -0,0 +1,101 @@
+// -*- C++ -*-
+
+/**
+ * @file EC_Timeout_Generator.h
+ *
+ * $Id$
+ *
+ * @author Carlos O'Ryan (coryan@cs.wustl.edu)
+ *
+ * Based on previous work by Tim Harrison (harrison@cs.wustl.edu) and
+ * other members of the DOC group. More details can be found in:
+ *
+ * http://doc.ece.uci.edu/~coryan/EC/index.html
+ */
+
+#ifndef TAO_EC_TIMEOUT_GENERATOR_H
+#define TAO_EC_TIMEOUT_GENERATOR_H
+
+#include /**/ "ace/pre.h"
+#include "ace/Event_Handler.h"
+
+#if !defined (ACE_LACKS_PRAGMA_ONCE)
+# pragma once
+#endif /* ACE_LACKS_PRAGMA_ONCE */
+
+#include /**/ "orbsvcs/Event/event_serv_export.h"
+
+#include "orbsvcs/Event/EC_Timeout_Filter.h"
+
+TAO_BEGIN_VERSIONED_NAMESPACE_DECL
+
+class TAO_EC_QOS_Info;
+
+/**
+ * @class TAO_EC_Timeout_Generator
+ *
+ * @brief Define the interface for the generators of timeout events.
+ *
+ * The Event Channel can use several strategies to dispatch
+ * timers, for instance, it can use the ORB reactor or a pool of
+ * reactors running at different priorities or a pool of
+ * Thread_Timer_Queue_Adapters running at different priorities
+ * also.
+ * This class is the abstract base class to abstract this
+ * strategies.
+ */
+class TAO_RTEvent_Serv_Export TAO_EC_Timeout_Generator
+{
+public:
+ /// destructor
+ virtual ~TAO_EC_Timeout_Generator (void);
+
+ /// Activate any internal threads.
+ virtual void activate (void) = 0;
+
+ /// Deactivate any internal threads, clients can destroy the object
+ /// after calling this method.
+ virtual void shutdown (void) = 0;
+
+ /// Add a timer at the given priority, returns the timer ID.
+ virtual int schedule_timer (TAO_EC_Timeout_Filter* filter,
+ const ACE_Time_Value& delta,
+ const ACE_Time_Value& interval) = 0;
+
+ /// Cancel a timer at the given priority.
+ virtual int cancel_timer (const TAO_EC_QOS_Info& info,
+ int id) = 0;
+};
+
+// ****************************************************************
+
+/**
+ * @class TAO_EC_Timeout_Adapter
+ *
+ * @brief Adapt the EC_Filter interface as an Event_Handler.
+ *
+ * ACE timer queues (including the reactor) use Event_Handlers to
+ * dispatch events, but we want to receive them in EC_Filters,
+ * this class is and adaptor for that purpose.
+ */
+class TAO_RTEvent_Serv_Export TAO_EC_Timeout_Adapter : public ACE_Event_Handler
+{
+public:
+ /// Default construction.
+ TAO_EC_Timeout_Adapter (void);
+
+private:
+ /// Casts <act> to EC_Filter and dispatches an event to it.
+ virtual int handle_timeout (const ACE_Time_Value &tv,
+ const void *act);
+};
+
+TAO_END_VERSIONED_NAMESPACE_DECL
+
+#if defined (__ACE_INLINE__)
+#include "orbsvcs/Event/EC_Timeout_Generator.i"
+#endif /* __ACE_INLINE__ */
+
+#include /**/ "ace/post.h"
+
+#endif /* TAO_EC_TIMEOUT_GENERATOR_H */
diff --git a/TAO/orbsvcs/orbsvcs/Event/EC_Timeout_Generator.i b/TAO/orbsvcs/orbsvcs/Event/EC_Timeout_Generator.i
new file mode 100644
index 00000000000..aba1263d609
--- /dev/null
+++ b/TAO/orbsvcs/orbsvcs/Event/EC_Timeout_Generator.i
@@ -0,0 +1,12 @@
+// -*- C++ -*-
+//
+// $Id$
+
+TAO_BEGIN_VERSIONED_NAMESPACE_DECL
+
+ACE_INLINE
+TAO_EC_Timeout_Adapter::TAO_EC_Timeout_Adapter (void)
+{
+}
+
+TAO_END_VERSIONED_NAMESPACE_DECL
diff --git a/TAO/orbsvcs/orbsvcs/Event/EC_Trivial_Supplier_Filter.cpp b/TAO/orbsvcs/orbsvcs/Event/EC_Trivial_Supplier_Filter.cpp
new file mode 100644
index 00000000000..c5d3dc1b72c
--- /dev/null
+++ b/TAO/orbsvcs/orbsvcs/Event/EC_Trivial_Supplier_Filter.cpp
@@ -0,0 +1,112 @@
+// $Id$
+
+#include "orbsvcs/Event/EC_Trivial_Supplier_Filter.h"
+#include "orbsvcs/Event/EC_Event_Channel_Base.h"
+#include "orbsvcs/Event/EC_ConsumerAdmin.h"
+#include "orbsvcs/Event/EC_ProxySupplier.h"
+#include "orbsvcs/Event/EC_QOS_Info.h"
+#include "orbsvcs/Event/EC_Scheduling_Strategy.h"
+#include "orbsvcs/Event/EC_ProxyConsumer.h" // @@ MSVC 6 bug
+
+ACE_RCSID(Event, EC_Trivial_Supplier_Filter, "$Id$")
+
+// ****************************************************************
+
+TAO_BEGIN_VERSIONED_NAMESPACE_DECL
+
+TAO_EC_Trivial_Supplier_Filter::
+ TAO_EC_Trivial_Supplier_Filter (TAO_EC_Event_Channel_Base* ec)
+ : event_channel_ (ec)
+{
+}
+
+void
+TAO_EC_Trivial_Supplier_Filter::bind (TAO_EC_ProxyPushConsumer*)
+{
+}
+
+void
+TAO_EC_Trivial_Supplier_Filter::unbind (TAO_EC_ProxyPushConsumer*)
+{
+}
+
+void
+TAO_EC_Trivial_Supplier_Filter::connected (TAO_EC_ProxyPushSupplier*
+ ACE_ENV_ARG_DECL_NOT_USED)
+{
+}
+
+void
+TAO_EC_Trivial_Supplier_Filter::reconnected (TAO_EC_ProxyPushSupplier*
+ ACE_ENV_ARG_DECL_NOT_USED)
+{
+}
+
+void
+TAO_EC_Trivial_Supplier_Filter::disconnected (TAO_EC_ProxyPushSupplier*
+ ACE_ENV_ARG_DECL_NOT_USED)
+{
+}
+
+void
+TAO_EC_Trivial_Supplier_Filter::shutdown (ACE_ENV_SINGLE_ARG_DECL_NOT_USED)
+{
+}
+
+void
+TAO_EC_Trivial_Supplier_Filter::push (const RtecEventComm::EventSet& event,
+ TAO_EC_ProxyPushConsumer *consumer
+ ACE_ENV_ARG_DECL)
+{
+ TAO_EC_Scheduling_Strategy* scheduling_strategy =
+ this->event_channel_->scheduling_strategy ();
+ scheduling_strategy->schedule_event (event,
+ consumer,
+ this
+ ACE_ENV_ARG_PARAMETER);
+}
+
+void
+TAO_EC_Trivial_Supplier_Filter::push_scheduled_event (RtecEventComm::EventSet &event,
+ const TAO_EC_QOS_Info &event_info
+ ACE_ENV_ARG_DECL)
+{
+ TAO_EC_Filter_Worker worker (event, event_info);
+ this->event_channel_->for_each_consumer (&worker
+ ACE_ENV_ARG_PARAMETER);
+}
+
+CORBA::ULong
+TAO_EC_Trivial_Supplier_Filter::_incr_refcnt (void)
+{
+ return 1;
+}
+
+CORBA::ULong
+TAO_EC_Trivial_Supplier_Filter::_decr_refcnt (void)
+{
+ return 1;
+}
+
+// ****************************************************************
+
+TAO_EC_Trivial_Supplier_Filter_Builder::
+ TAO_EC_Trivial_Supplier_Filter_Builder (TAO_EC_Event_Channel_Base *ec)
+ : filter_ (ec)
+{
+}
+
+TAO_EC_Supplier_Filter*
+TAO_EC_Trivial_Supplier_Filter_Builder::create (
+ RtecEventChannelAdmin::SupplierQOS&)
+{
+ return &this->filter_;
+}
+
+void
+TAO_EC_Trivial_Supplier_Filter_Builder::destroy (
+ TAO_EC_Supplier_Filter*)
+{
+}
+
+TAO_END_VERSIONED_NAMESPACE_DECL
diff --git a/TAO/orbsvcs/orbsvcs/Event/EC_Trivial_Supplier_Filter.h b/TAO/orbsvcs/orbsvcs/Event/EC_Trivial_Supplier_Filter.h
new file mode 100644
index 00000000000..617bd87f6d7
--- /dev/null
+++ b/TAO/orbsvcs/orbsvcs/Event/EC_Trivial_Supplier_Filter.h
@@ -0,0 +1,109 @@
+// -*- C++ -*-
+
+/**
+ * @file EC_Trivial_Supplier_Filter.h
+ *
+ * $Id$
+ *
+ * @author Carlos O'Ryan (coryan@cs.wustl.edu)
+ *
+ * Based on previous work by Tim Harrison (harrison@cs.wustl.edu) and
+ * other members of the DOC group. More details can be found in:
+ *
+ * http://doc.ece.uci.edu/~coryan/EC/index.html
+ */
+
+#ifndef TAO_EC_TRIVIAL_SUPPLIER_FILTER_H
+#define TAO_EC_TRIVIAL_SUPPLIER_FILTER_H
+
+#include /**/ "ace/pre.h"
+
+#include "orbsvcs/Event/EC_Supplier_Filter.h"
+#include "orbsvcs/Event/EC_Supplier_Filter_Builder.h"
+
+#include /**/ "orbsvcs/Event/event_serv_export.h"
+
+#if !defined (ACE_LACKS_PRAGMA_ONCE)
+# pragma once
+#endif /* ACE_LACKS_PRAGMA_ONCE */
+
+TAO_BEGIN_VERSIONED_NAMESPACE_DECL
+
+class TAO_EC_Event_Channel_Base;
+class TAO_EC_ProxyPushSupplier_Set;
+
+// ****************************************************************
+
+/**
+ * @class TAO_EC_Trivial_Supplier_Filter
+ *
+ * @brief A null filtering strategy.
+ *
+ * This strategy does no filtering, it is useful for backends of
+ * the CosEventChannel, testing and broadcasters; it uses the
+ * ConsumerAdmin to find all the consumers and pushes the event to
+ * all of them.
+ */
+class TAO_RTEvent_Serv_Export TAO_EC_Trivial_Supplier_Filter : public TAO_EC_Supplier_Filter
+{
+public:
+ /// Constructor
+ TAO_EC_Trivial_Supplier_Filter (TAO_EC_Event_Channel_Base* ec);
+
+ // = The TAO_EC_Supplier_Filter methods.
+ virtual void bind (TAO_EC_ProxyPushConsumer* consumer);
+ virtual void unbind (TAO_EC_ProxyPushConsumer* consumer);
+ virtual void connected (TAO_EC_ProxyPushSupplier* supplier
+ ACE_ENV_ARG_DECL);
+ virtual void reconnected (TAO_EC_ProxyPushSupplier* supplier
+ ACE_ENV_ARG_DECL);
+ virtual void disconnected (TAO_EC_ProxyPushSupplier* supplier
+ ACE_ENV_ARG_DECL);
+ virtual void shutdown (ACE_ENV_SINGLE_ARG_DECL);
+ virtual void push (const RtecEventComm::EventSet& event,
+ TAO_EC_ProxyPushConsumer *consumer
+ ACE_ENV_ARG_DECL_NOT_USED);
+ virtual void push_scheduled_event (RtecEventComm::EventSet &event,
+ const TAO_EC_QOS_Info &event_info
+ ACE_ENV_ARG_DECL);
+ virtual CORBA::ULong _decr_refcnt (void);
+ virtual CORBA::ULong _incr_refcnt (void);
+
+private:
+ /// The event channel, used to locate the set of consumers.
+ TAO_EC_Event_Channel_Base *event_channel_;
+};
+
+// ****************************************************************
+
+/**
+ * @class TAO_EC_Trivial_Supplier_Filter_Builder
+ *
+ * @brief Create a single Trivial_Supplier_Filter.
+ *
+ * This Factory creates a single Trivial_Supplier_Filter that is
+ * used by all the suppliers (i.e. ProxyConsumers) of an event
+ * channel.
+ */
+class TAO_RTEvent_Serv_Export TAO_EC_Trivial_Supplier_Filter_Builder : public TAO_EC_Supplier_Filter_Builder
+{
+public:
+ /// constructor....
+ TAO_EC_Trivial_Supplier_Filter_Builder (TAO_EC_Event_Channel_Base* ec);
+
+ // = The TAO_EC_Supplier_Filter_Builder methods...
+ virtual TAO_EC_Supplier_Filter*
+ create (RtecEventChannelAdmin::SupplierQOS& qos);
+ virtual void
+ destroy (TAO_EC_Supplier_Filter *filter);
+
+private:
+ /// The filter....
+ TAO_EC_Trivial_Supplier_Filter filter_;
+};
+
+TAO_END_VERSIONED_NAMESPACE_DECL
+
+#include /**/ "ace/post.h"
+
+#endif /* TAO_EC_TRIVIAL_SUPPLIER_FILTER_H */
diff --git a/TAO/orbsvcs/orbsvcs/Event/EC_Type_Filter.cpp b/TAO/orbsvcs/orbsvcs/Event/EC_Type_Filter.cpp
new file mode 100644
index 00000000000..d52f1d869aa
--- /dev/null
+++ b/TAO/orbsvcs/orbsvcs/Event/EC_Type_Filter.cpp
@@ -0,0 +1,150 @@
+// $Id$
+
+#include "orbsvcs/Event/EC_Type_Filter.h"
+
+ACE_RCSID(Event, EC_Type_Filter, "$Id$")
+
+TAO_BEGIN_VERSIONED_NAMESPACE_DECL
+
+TAO_EC_Type_Filter::TAO_EC_Type_Filter (const RtecEventComm::EventHeader& header)
+ : header_ (header)
+{
+}
+
+int
+TAO_EC_Type_Filter::filter (const RtecEventComm::EventSet& event,
+ TAO_EC_QOS_Info& qos_info
+ ACE_ENV_ARG_DECL)
+{
+ if (event.length () != 1)
+ return this->filter_set (event, qos_info ACE_ENV_ARG_PARAMETER);
+
+ if (this->can_match (event[0].header))
+ {
+ this->push (event, qos_info ACE_ENV_ARG_PARAMETER);
+ ACE_CHECK_RETURN (0);
+ return 1;
+ }
+ return 0;
+}
+
+int
+TAO_EC_Type_Filter::filter_nocopy (RtecEventComm::EventSet& event,
+ TAO_EC_QOS_Info& qos_info
+ ACE_ENV_ARG_DECL)
+{
+ if (event.length () != 1)
+ return this->filter_set (event, qos_info ACE_ENV_ARG_PARAMETER);
+
+ if (this->can_match (event[0].header))
+ {
+ this->push_nocopy (event, qos_info ACE_ENV_ARG_PARAMETER);
+ ACE_CHECK_RETURN (0);
+ return 1;
+ }
+ return 0;
+}
+
+void
+TAO_EC_Type_Filter::push (const RtecEventComm::EventSet& event,
+ TAO_EC_QOS_Info& qos_info
+ ACE_ENV_ARG_DECL)
+{
+ if (this->parent () != 0)
+ this->parent ()->push (event, qos_info ACE_ENV_ARG_PARAMETER);
+}
+
+void
+TAO_EC_Type_Filter::push_nocopy (RtecEventComm::EventSet& event,
+ TAO_EC_QOS_Info& qos_info
+ ACE_ENV_ARG_DECL)
+{
+ if (this->parent () != 0)
+ this->parent ()->push_nocopy (event, qos_info ACE_ENV_ARG_PARAMETER);
+}
+
+void
+TAO_EC_Type_Filter::clear (void)
+{
+}
+
+CORBA::ULong
+TAO_EC_Type_Filter::max_event_size (void) const
+{
+ return 1;
+}
+
+int
+TAO_EC_Type_Filter::can_match (
+ const RtecEventComm::EventHeader& header) const
+{
+ if (this->header_.source == 0)
+ {
+ if (this->header_.type == 0 || header.type == 0)
+ return 1;
+ else
+ return this->header_.type == header.type;
+ }
+
+ if (this->header_.type == 0)
+ {
+ if (header.source == 0)
+ return 1;
+ else
+ return this->header_.source == header.source;
+ }
+
+ if (header.source == 0)
+ {
+ if (header.type != 0)
+ return this->header_.type == header.type;
+ return 1;
+ }
+
+ if (header.type == 0)
+ {
+ return this->header_.source == header.source;
+ }
+
+ return (this->header_.type == header.type
+ && this->header_.source == header.source);
+}
+
+int
+TAO_EC_Type_Filter::add_dependencies (
+ const RtecEventComm::EventHeader& header,
+ const TAO_EC_QOS_Info &
+ ACE_ENV_ARG_DECL_NOT_USED)
+{
+ return this->can_match (header);
+}
+
+int
+TAO_EC_Type_Filter::filter_set (const RtecEventComm::EventSet& event,
+ TAO_EC_QOS_Info& qos_info
+ ACE_ENV_ARG_DECL)
+{
+ CORBA::ULong maximum = event.length ();
+ if (event.maximum () == 0)
+ return 0;
+
+ RtecEventComm::EventSet matched (maximum);
+ CORBA::ULong next_slot = 0;
+ for (CORBA::ULong i = 0; i != maximum; ++i)
+ {
+ if (!this->can_match (event[i].header))
+ continue;
+ matched.length (next_slot + 1);
+ matched[next_slot] = event[i];
+ next_slot++;
+ }
+ if (matched.length () == 0)
+ return 0;
+
+ this->push (matched, qos_info ACE_ENV_ARG_PARAMETER);
+ ACE_CHECK_RETURN (0);
+
+ return 1;
+}
+
+TAO_END_VERSIONED_NAMESPACE_DECL
diff --git a/TAO/orbsvcs/orbsvcs/Event/EC_Type_Filter.h b/TAO/orbsvcs/orbsvcs/Event/EC_Type_Filter.h
new file mode 100644
index 00000000000..12a0660bf72
--- /dev/null
+++ b/TAO/orbsvcs/orbsvcs/Event/EC_Type_Filter.h
@@ -0,0 +1,81 @@
+// -*- C++ -*-
+
+/**
+ * @file EC_Type_Filter.h
+ *
+ * $Id$
+ *
+ * @author Carlos O'Ryan (coryan@cs.wustl.edu)
+ *
+ * Based on previous work by Tim Harrison (harrison@cs.wustl.edu) and
+ * other members of the DOC group. More details can be found in:
+ *
+ * http://doc.ece.uci.edu/~coryan/EC/index.html
+ */
+
+#ifndef TAO_EC_TYPE_FILTER_H
+#define TAO_EC_TYPE_FILTER_H
+#include /**/ "ace/pre.h"
+
+#include "orbsvcs/Event/EC_Filter.h"
+#include /**/ "orbsvcs/Event/event_serv_export.h"
+
+#if !defined (ACE_LACKS_PRAGMA_ONCE)
+# pragma once
+#endif /* ACE_LACKS_PRAGMA_ONCE */
+
+TAO_BEGIN_VERSIONED_NAMESPACE_DECL
+
+/**
+ * @class TAO_EC_Type_Filter
+ *
+ * @brief A filter based on event type/source
+ *
+ * This filter only accept events with a predefined type/source,
+ * both the source and the type can be wildcards.
+ */
+class TAO_RTEvent_Serv_Export TAO_EC_Type_Filter : public TAO_EC_Filter
+{
+public:
+ /// Constructor.
+ TAO_EC_Type_Filter (const RtecEventComm::EventHeader& header);
+
+ // = The TAO_EC_Filter methods, please check the documentation in
+ // TAO_EC_Filter.
+ virtual int filter (const RtecEventComm::EventSet& event,
+ TAO_EC_QOS_Info& qos_info
+ ACE_ENV_ARG_DECL);
+ virtual int filter_nocopy (RtecEventComm::EventSet& event,
+ TAO_EC_QOS_Info& qos_info
+ ACE_ENV_ARG_DECL);
+ virtual void push (const RtecEventComm::EventSet& event,
+ TAO_EC_QOS_Info& qos_info
+ ACE_ENV_ARG_DECL);
+ virtual void push_nocopy (RtecEventComm::EventSet& event,
+ TAO_EC_QOS_Info& qos_info
+ ACE_ENV_ARG_DECL);
+ virtual void clear (void);
+ virtual CORBA::ULong max_event_size (void) const;
+ virtual int can_match (const RtecEventComm::EventHeader& header) const;
+ virtual int add_dependencies (const RtecEventComm::EventHeader& header,
+ const TAO_EC_QOS_Info &qos_info
+ ACE_ENV_ARG_DECL);
+
+private:
+ TAO_EC_Type_Filter (const TAO_EC_Type_Filter&);
+ TAO_EC_Type_Filter& operator= (const TAO_EC_Type_Filter&);
+
+ /// Filter an EventSet that contains more than one event.
+ int filter_set (const RtecEventComm::EventSet& event,
+ TAO_EC_QOS_Info& qos_info
+ ACE_ENV_ARG_DECL);
+
+private:
+ /// Encapsulate the type/source that we must match.
+ RtecEventComm::EventHeader header_;
+};
+
+TAO_END_VERSIONED_NAMESPACE_DECL
+
+#include /**/ "ace/post.h"
+#endif /* TAO_EC_TYPE_FILTER_H */
diff --git a/TAO/orbsvcs/orbsvcs/Event/EC_UDP_Admin.cpp b/TAO/orbsvcs/orbsvcs/Event/EC_UDP_Admin.cpp
new file mode 100644
index 00000000000..eba83581c8d
--- /dev/null
+++ b/TAO/orbsvcs/orbsvcs/Event/EC_UDP_Admin.cpp
@@ -0,0 +1,30 @@
+// $Id$
+
+#include "orbsvcs/Event/EC_UDP_Admin.h"
+
+ACE_RCSID (Event,
+ EC_UDP_Admin,
+ "$Id$")
+
+TAO_BEGIN_VERSIONED_NAMESPACE_DECL
+
+TAO_EC_Simple_AddrServer::TAO_EC_Simple_AddrServer (CORBA::UShort port)
+ : port_ (port)
+{
+}
+
+TAO_EC_Simple_AddrServer::~TAO_EC_Simple_AddrServer (void)
+{
+}
+
+void
+TAO_EC_Simple_AddrServer::get_addr (const RtecEventComm::EventHeader& header,
+ RtecUDPAdmin::UDP_Addr_out addr
+ ACE_ENV_ARG_DECL_NOT_USED)
+ ACE_THROW_SPEC ((CORBA::SystemException))
+{
+ addr.ipaddr = header.type;
+ addr.port = this->port_;
+}
+
+TAO_END_VERSIONED_NAMESPACE_DECL
diff --git a/TAO/orbsvcs/orbsvcs/Event/EC_UDP_Admin.h b/TAO/orbsvcs/orbsvcs/Event/EC_UDP_Admin.h
new file mode 100644
index 00000000000..7e5ccff9920
--- /dev/null
+++ b/TAO/orbsvcs/orbsvcs/Event/EC_UDP_Admin.h
@@ -0,0 +1,60 @@
+// -*- C++ -*-
+
+/**
+ * @file EC_UDP_Admin.h
+ *
+ * $Id$
+ *
+ * @author Carlos O'Ryan (coryan@cs.wustl.edu)
+ *
+ * Based on previous work by Tim Harrison (harrison@cs.wustl.edu) and
+ * other members of the DOC group. More details can be found in:
+ *
+ * http://doc.ece.uci.edu/~coryan/EC/index.html
+ */
+
+#ifndef TAO_EC_UDP_ADMIN_H
+#define TAO_EC_UDP_ADMIN_H
+#include /**/ "ace/pre.h"
+
+#include "orbsvcs/RtecUDPAdminS.h"
+#include /**/ "orbsvcs/Event/event_serv_export.h"
+
+TAO_BEGIN_VERSIONED_NAMESPACE_DECL
+
+/**
+ * @class TAO_EC_Simple_AddrServer
+ *
+ * @brief TAO Real-time Event Service; a simple UDP address server.
+ *
+ * The EC is able to use multiple multicast groups to transmit its
+ * data, the is given control over the mapping between the Event
+ * (type,source) pair and the (ipaddr,port) pair using a
+ * AddrServer.
+ * This class implements a very simple server that simply maps the
+ * type component to the ipaddr and uses a fixed port,
+ * provided at initialization time.
+ */
+class TAO_RTEvent_Serv_Export TAO_EC_Simple_AddrServer : public POA_RtecUDPAdmin::AddrServer
+{
+public:
+ /// Constructor
+ TAO_EC_Simple_AddrServer (CORBA::UShort port);
+
+ /// Destructor
+ virtual ~TAO_EC_Simple_AddrServer (void);
+
+ // = The RtecUDPAdmin::AddrServer methods
+ virtual void get_addr (const RtecEventComm::EventHeader& header,
+ RtecUDPAdmin::UDP_Addr_out addr
+ ACE_ENV_ARG_DECL)
+ ACE_THROW_SPEC ((CORBA::SystemException));
+
+private:
+ CORBA::UShort port_;
+};
+
+TAO_END_VERSIONED_NAMESPACE_DECL
+
+#include /**/ "ace/post.h"
+#endif /* TAO_EC_UDP_ADMIN_H */
diff --git a/TAO/orbsvcs/orbsvcs/Event/event_export.h b/TAO/orbsvcs/orbsvcs/Event/event_export.h
new file mode 100644
index 00000000000..87a6ddf5a12
--- /dev/null
+++ b/TAO/orbsvcs/orbsvcs/Event/event_export.h
@@ -0,0 +1,40 @@
+
+// -*- C++ -*-
+// $Id$
+// Definition for Win32 Export directives.
+// This file is generated automatically by generate_export_file.pl
+// ------------------------------
+#ifndef TAO_RTEVENT_EXPORT_H
+#define TAO_RTEVENT_EXPORT_H
+
+#include "ace/config-all.h"
+
+#if defined (TAO_AS_STATIC_LIBS)
+# if !defined (TAO_RTEVENT_HAS_DLL)
+# define TAO_RTEVENT_HAS_DLL 0
+# endif /* ! TAO_RTEVENT_HAS_DLL */
+#else
+# if !defined (TAO_RTEVENT_HAS_DLL)
+# define TAO_RTEVENT_HAS_DLL 1
+# endif /* ! TAO_RTEVENT_HAS_DLL */
+#endif
+
+#if defined (TAO_RTEVENT_HAS_DLL) && (TAO_RTEVENT_HAS_DLL == 1)
+# if defined (TAO_RTEVENT_BUILD_DLL)
+# define TAO_RTEvent_Export ACE_Proper_Export_Flag
+# define TAO_RTEVENT_SINGLETON_DECLARATION(T) ACE_EXPORT_SINGLETON_DECLARATION (T)
+# define TAO_RTEVENT_SINGLETON_DECLARE(SINGLETON_TYPE, CLASS, LOCK) ACE_EXPORT_SINGLETON_DECLARE(SINGLETON_TYPE, CLASS, LOCK)
+# else /* TAO_RTEVENT_BUILD_DLL */
+# define TAO_RTEvent_Export ACE_Proper_Import_Flag
+# define TAO_RTEVENT_SINGLETON_DECLARATION(T) ACE_IMPORT_SINGLETON_DECLARATION (T)
+# define TAO_RTEVENT_SINGLETON_DECLARE(SINGLETON_TYPE, CLASS, LOCK) ACE_IMPORT_SINGLETON_DECLARE(SINGLETON_TYPE, CLASS, LOCK)
+# endif /* TAO_RTEVENT_BUILD_DLL */
+#else /* TAO_RTEVENT_HAS_DLL == 1 */
+# define TAO_RTEvent_Export
+# define TAO_RTEVENT_SINGLETON_DECLARATION(T)
+# define TAO_RTEVENT_SINGLETON_DECLARE(SINGLETON_TYPE, CLASS, LOCK)
+#endif /* TAO_RTEVENT_HAS_DLL == 1 */
+
+#endif /* TAO_RTEVENT_EXPORT_H */
+
+// End of auto generated file.
diff --git a/TAO/orbsvcs/orbsvcs/Event/event_serv_export.h b/TAO/orbsvcs/orbsvcs/Event/event_serv_export.h
new file mode 100644
index 00000000000..a6f6ba465be
--- /dev/null
+++ b/TAO/orbsvcs/orbsvcs/Event/event_serv_export.h
@@ -0,0 +1,40 @@
+
+// -*- C++ -*-
+// $Id$
+// Definition for Win32 Export directives.
+// This file is generated automatically by generate_export_file.pl
+// ------------------------------
+#ifndef TAO_RTEVENT_SERV_EXPORT_H
+#define TAO_RTEVENT_SERV_EXPORT_H
+
+#include "ace/config-all.h"
+
+#if defined (TAO_AS_STATIC_LIBS)
+# if !defined (TAO_RTEVENT_SERV_HAS_DLL)
+# define TAO_RTEVENT_SERV_HAS_DLL 0
+# endif /* ! TAO_RTEVENT_SERV_HAS_DLL */
+#else
+# if !defined (TAO_RTEVENT_SERV_HAS_DLL)
+# define TAO_RTEVENT_SERV_HAS_DLL 1
+# endif /* ! TAO_RTEVENT_SERV_HAS_DLL */
+#endif
+
+#if defined (TAO_RTEVENT_SERV_HAS_DLL) && (TAO_RTEVENT_SERV_HAS_DLL == 1)
+# if defined (TAO_RTEVENT_SERV_BUILD_DLL)
+# define TAO_RTEvent_Serv_Export ACE_Proper_Export_Flag
+# define TAO_RTEVENT_SERV_SINGLETON_DECLARATION(T) ACE_EXPORT_SINGLETON_DECLARATION (T)
+# define TAO_RTEVENT_SERV_SINGLETON_DECLARE(SINGLETON_TYPE, CLASS, LOCK) ACE_EXPORT_SINGLETON_DECLARE(SINGLETON_TYPE, CLASS, LOCK)
+# else /* TAO_RTEVENT_BUILD_DLL */
+# define TAO_RTEvent_Serv_Export ACE_Proper_Import_Flag
+# define TAO_RTEVENT_SERV_SINGLETON_DECLARATION(T) ACE_IMPORT_SINGLETON_DECLARATION (T)
+# define TAO_RTEVENT_SERV_SINGLETON_DECLARE(SINGLETON_TYPE, CLASS, LOCK) ACE_IMPORT_SINGLETON_DECLARE(SINGLETON_TYPE, CLASS, LOCK)
+# endif /* TAO_RTEVENT_SERV_BUILD_DLL */
+#else /* TAO_RTEVENT_SERV_HAS_DLL == 1 */
+# define TAO_RTEvent_Serv_Export
+# define TAO_RTEVENT_SERV_SINGLETON_DECLARATION(T)
+# define TAO_RTEVENT_SERV_SINGLETON_DECLARE(SINGLETON_TYPE, CLASS, LOCK)
+#endif /* TAO_RTEVENT_SERV_HAS_DLL == 1 */
+
+#endif /* TAO_RTEVENT_SERV_EXPORT_H */
+
+// End of auto generated file.
diff --git a/TAO/orbsvcs/orbsvcs/Event/event_skel_export.h b/TAO/orbsvcs/orbsvcs/Event/event_skel_export.h
new file mode 100644
index 00000000000..70c88d4289e
--- /dev/null
+++ b/TAO/orbsvcs/orbsvcs/Event/event_skel_export.h
@@ -0,0 +1,40 @@
+
+// -*- C++ -*-
+// $Id$
+// Definition for Win32 Export directives.
+// This file is generated automatically by generate_export_file.pl
+// ------------------------------
+#ifndef TAO_RTEVENT_SKEL_EXPORT_H
+#define TAO_RTEVENT_SKEL_EXPORT_H
+
+#include "ace/config-all.h"
+
+#if defined (TAO_AS_STATIC_LIBS)
+# if !defined (TAO_RTEVENT_SKEL_HAS_DLL)
+# define TAO_RTEVENT_SKEL_HAS_DLL 0
+# endif /* ! TAO_RTEVENT_SKEL_HAS_DLL */
+#else
+# if !defined (TAO_RTEVENT_SKEL_HAS_DLL)
+# define TAO_RTEVENT_SKEL_HAS_DLL 1
+# endif /* ! TAO_RTEVENT_SKEL_HAS_DLL */
+#endif
+
+#if defined (TAO_RTEVENT_SKEL_HAS_DLL) && (TAO_RTEVENT_SKEL_HAS_DLL == 1)
+# if defined (TAO_RTEVENT_SKEL_BUILD_DLL)
+# define TAO_RTEvent_Skel_Export ACE_Proper_Export_Flag
+# define TAO_RTEVENT_SKEL_SINGLETON_DECLARATION(T) ACE_EXPORT_SINGLETON_DECLARATION (T)
+# define TAO_RTEVENT_SKEL_SINGLETON_DECLARE(SINGLETON_TYPE, CLASS, LOCK) ACE_EXPORT_SINGLETON_DECLARE(SINGLETON_TYPE, CLASS, LOCK)
+# else /* TAO_RTEVENT_SKEL_BUILD_DLL */
+# define TAO_RTEvent_Skel_Export ACE_Proper_Import_Flag
+# define TAO_RTEVENT_SKEL_SINGLETON_DECLARATION(T) ACE_IMPORT_SINGLETON_DECLARATION (T)
+# define TAO_RTEVENT_SKEL_SINGLETON_DECLARE(SINGLETON_TYPE, CLASS, LOCK) ACE_IMPORT_SINGLETON_DECLARE(SINGLETON_TYPE, CLASS, LOCK)
+# endif /* TAO_RTEVENT_SKEL_BUILD_DLL */
+#else /* TAO_RTEVENT_SKEL_HAS_DLL == 1 */
+# define TAO_RTEvent_Skel_Export
+# define TAO_RTEVENT_SKEL_SINGLETON_DECLARATION(T)
+# define TAO_RTEVENT_SKEL_SINGLETON_DECLARE(SINGLETON_TYPE, CLASS, LOCK)
+#endif /* TAO_RTEVENT_SKEL_HAS_DLL == 1 */
+
+#endif /* TAO_RTEVENT_SKEL_EXPORT_H */
+
+// End of auto generated file.
diff --git a/TAO/orbsvcs/orbsvcs/Event/rtcorba_event_export.h b/TAO/orbsvcs/orbsvcs/Event/rtcorba_event_export.h
new file mode 100644
index 00000000000..e2af98341c2
--- /dev/null
+++ b/TAO/orbsvcs/orbsvcs/Event/rtcorba_event_export.h
@@ -0,0 +1,40 @@
+
+// -*- C++ -*-
+// $Id$
+// Definition for Win32 Export directives.
+// This file is generated automatically by generate_export_file.pl
+// ------------------------------
+#ifndef TAO_RTCORBAEVENT_EXPORT_H
+#define TAO_RTCORBAEVENT_EXPORT_H
+
+#include "ace/config-all.h"
+
+#if defined (TAO_AS_STATIC_LIBS)
+# if !defined (TAO_RTCORBAEVENT_HAS_DLL)
+# define TAO_RTCORBAEVENT_HAS_DLL 0
+# endif /* ! TAO_RTCORBAEVENT_HAS_DLL */
+#else
+# if !defined (TAO_RTCORBAEVENT_HAS_DLL)
+# define TAO_RTCORBAEVENT_HAS_DLL 1
+# endif /* ! TAO_RTCORBAEVENT_HAS_DLL */
+#endif
+
+#if defined (TAO_RTCORBAEVENT_HAS_DLL) && (TAO_RTCORBAEVENT_HAS_DLL == 1)
+# if defined (TAO_RTCORBAEVENT_BUILD_DLL)
+# define TAO_RTCORBAEvent_Export ACE_Proper_Export_Flag
+# define TAO_RTCORBAEVENT_SINGLETON_DECLARATION(T) ACE_EXPORT_SINGLETON_DECLARATION (T)
+# define TAO_RTCORBAEVENT_SINGLETON_DECLARE(SINGLETON_TYPE, CLASS, LOCK) ACE_EXPORT_SINGLETON_DECLARE(SINGLETON_TYPE, CLASS, LOCK)
+# else /* TAO_RTCORBAEVENT_BUILD_DLL */
+# define TAO_RTCORBAEvent_Export ACE_Proper_Import_Flag
+# define TAO_RTCORBAEVENT_SINGLETON_DECLARATION(T) ACE_IMPORT_SINGLETON_DECLARATION (T)
+# define TAO_RTCORBAEVENT_SINGLETON_DECLARE(SINGLETON_TYPE, CLASS, LOCK) ACE_IMPORT_SINGLETON_DECLARE(SINGLETON_TYPE, CLASS, LOCK)
+# endif /* TAO_RTCORBAEVENT_BUILD_DLL */
+#else /* TAO_RTCORBAEVENT_HAS_DLL == 1 */
+# define TAO_RTCORBAEvent_Export
+# define TAO_RTCORBAEVENT_SINGLETON_DECLARATION(T)
+# define TAO_RTCORBAEVENT_SINGLETON_DECLARE(SINGLETON_TYPE, CLASS, LOCK)
+#endif /* TAO_RTCORBAEVENT_HAS_DLL == 1 */
+
+#endif /* TAO_RTCORBAEVENT_EXPORT_H */
+
+// End of auto generated file.
diff --git a/TAO/orbsvcs/orbsvcs/Event/rtkokyu_event_export.h b/TAO/orbsvcs/orbsvcs/Event/rtkokyu_event_export.h
new file mode 100644
index 00000000000..9d56447dabd
--- /dev/null
+++ b/TAO/orbsvcs/orbsvcs/Event/rtkokyu_event_export.h
@@ -0,0 +1,56 @@
+
+// -*- C++ -*-
+// $Id$
+// Definition for Win32 Export directives.
+// This file is generated automatically by generate_export_file.pl TAO_RTKokyuEvent
+// ------------------------------
+#ifndef TAO_RTKOKYUEVENT_EXPORT_H
+#define TAO_RTKOKYUEVENT_EXPORT_H
+
+#include "ace/config-all.h"
+
+#if defined (TAO_AS_STATIC_LIBS)
+# if !defined (TAO_RTKOKYUEVENT_HAS_DLL)
+# define TAO_RTKOKYUEVENT_HAS_DLL 0
+# endif /* ! TAO_RTEVENT_HAS_DLL */
+#else
+# if !defined (TAO_RTKOKYUEVENT_HAS_DLL)
+# define TAO_RTKOKYUEVENT_HAS_DLL 1
+# endif /* ! TAO_RTKOKYUEVENT_HAS_DLL */
+#endif
+
+#if defined (TAO_RTKOKYUEVENT_HAS_DLL) && (TAO_RTKOKYUEVENT_HAS_DLL == 1)
+# if defined (TAO_RTKOKYUEVENT_BUILD_DLL)
+# define TAO_RTKokyuEvent_Export ACE_Proper_Export_Flag
+# define TAO_RTKOKYUEVENT_SINGLETON_DECLARATION(T) ACE_EXPORT_SINGLETON_DECLARATION (T)
+# define TAO_RTKOKYUEVENT_SINGLETON_DECLARE(SINGLETON_TYPE, CLASS, LOCK) ACE_EXPORT_SINGLETON_DECLARE(SINGLETON_TYPE, CLASS, LOCK)
+# else /* TAO_RTKOKYUEVENT_BUILD_DLL */
+# define TAO_RTKokyuEvent_Export ACE_Proper_Import_Flag
+# define TAO_RTKOKYUEVENT_SINGLETON_DECLARATION(T) ACE_IMPORT_SINGLETON_DECLARATION (T)
+# define TAO_RTKOKYUEVENT_SINGLETON_DECLARE(SINGLETON_TYPE, CLASS, LOCK) ACE_IMPORT_SINGLETON_DECLARE(SINGLETON_TYPE, CLASS, LOCK)
+# endif /* TAO_RTKOKYUEVENT_BUILD_DLL */
+#else /* TAO_RTKOKYUEVENT_HAS_DLL == 1 */
+# define TAO_RTKokyuEvent_Export
+# define TAO_RTKOKYUEVENT_SINGLETON_DECLARATION(T)
+# define TAO_RTKOKYUEVENT_SINGLETON_DECLARE(SINGLETON_TYPE, CLASS, LOCK)
+#endif /* TAO_RTKOKYUEVENT_HAS_DLL == 1 */
+
+// Set TAO_RTKOKYUEVENT_NTRACE = 0 to turn on library specific tracing even if
+// tracing is turned off for ACE.
+#if !defined (TAO_RTKOKYUEVENT_NTRACE)
+# if (ACE_NTRACE == 1)
+# define TAO_RTKOKYUEVENT_NTRACE 1
+# else /* (ACE_NTRACE == 1) */
+# define TAO_RTKOKYUEVENT_NTRACE 0
+# endif /* (ACE_NTRACE == 1) */
+#endif /* !TAO_RTKOKYUEVENT_NTRACE */
+
+#if (TAO_RTKOKYUEVENT_NTRACE == 1)
+# define TAO_RTKOKYUEVENT_TRACE(X)
+#else /* (TAO_RTKOKYUEVENT_NTRACE == 1) */
+# define TAO_RTKOKYUEVENT_TRACE(X) ACE_TRACE_IMPL(X)
+#endif /* (TAO_RTKOKYUEVENT_NTRACE == 1) */
+
+#endif /* TAO_RTKOKYUEVENT_EXPORT_H */
+
+// End of auto generated file.
diff --git a/TAO/orbsvcs/orbsvcs/Event/sched_event_export.h b/TAO/orbsvcs/orbsvcs/Event/sched_event_export.h
new file mode 100644
index 00000000000..b9697e05882
--- /dev/null
+++ b/TAO/orbsvcs/orbsvcs/Event/sched_event_export.h
@@ -0,0 +1,40 @@
+
+// -*- C++ -*-
+// $Id$
+// Definition for Win32 Export directives.
+// This file is generated automatically by generate_export_file.pl
+// ------------------------------
+#ifndef TAO_RTSCHEDEVENT_EXPORT_H
+#define TAO_RTSCHEDEVENT_EXPORT_H
+
+#include "ace/config-all.h"
+
+#if defined (TAO_AS_STATIC_LIBS)
+# if !defined (TAO_RTSCHEDEVENT_HAS_DLL)
+# define TAO_RTSCHEDEVENT_HAS_DLL 0
+# endif /* ! TAO_RTSCHEDEVENT_HAS_DLL */
+#else
+# if !defined (TAO_RTSCHEDEVENT_HAS_DLL)
+# define TAO_RTSCHEDEVENT_HAS_DLL 1
+# endif /* ! TAO_RTSCHEDEVENT_HAS_DLL */
+#endif
+
+#if defined (TAO_RTSCHEDEVENT_HAS_DLL) && (TAO_RTSCHEDEVENT_HAS_DLL == 1)
+# if defined (TAO_RTSCHEDEVENT_BUILD_DLL)
+# define TAO_RTSchedEvent_Export ACE_Proper_Export_Flag
+# define TAO_RTSCHEDEVENT_SINGLETON_DECLARATION(T) ACE_EXPORT_SINGLETON_DECLARATION (T)
+# define TAO_RTSCHEDEVENT_SINGLETON_DECLARE(SINGLETON_TYPE, CLASS, LOCK) ACE_EXPORT_SINGLETON_DECLARE(SINGLETON_TYPE, CLASS, LOCK)
+# else /* TAO_RTSCHEDEVENT_BUILD_DLL */
+# define TAO_RTSchedEvent_Export ACE_Proper_Import_Flag
+# define TAO_RTSCHEDEVENT_SINGLETON_DECLARATION(T) ACE_IMPORT_SINGLETON_DECLARATION (T)
+# define TAO_RTSCHEDEVENT_SINGLETON_DECLARE(SINGLETON_TYPE, CLASS, LOCK) ACE_IMPORT_SINGLETON_DECLARE(SINGLETON_TYPE, CLASS, LOCK)
+# endif /* TAO_RTSCHEDEVENT_BUILD_DLL */
+#else /* TAO_RTSCHEDEVENT_HAS_DLL == 1 */
+# define TAO_RTSchedEvent_Export
+# define TAO_RTSCHEDEVENT_SINGLETON_DECLARATION(T)
+# define TAO_RTSCHEDEVENT_SINGLETON_DECLARE(SINGLETON_TYPE, CLASS, LOCK)
+#endif /* TAO_RTSCHEDEVENT_HAS_DLL == 1 */
+
+#endif /* TAO_RTSCHEDEVENT_EXPORT_H */
+
+// End of auto generated file.
diff --git a/TAO/orbsvcs/orbsvcs/Event_Forwarder.idl b/TAO/orbsvcs/orbsvcs/Event_Forwarder.idl
new file mode 100644
index 00000000000..bab9f7611c5
--- /dev/null
+++ b/TAO/orbsvcs/orbsvcs/Event_Forwarder.idl
@@ -0,0 +1,50 @@
+
+/**
+ * @file Event_Forwarder.idl
+ *
+ * @brief
+ *
+ * $Id$
+ *
+ * @author Pradeep Gore <pradeep@oomworks.com>
+ */
+
+#ifndef _EVENT_FORWARDER_IDL_
+#define _EVENT_FORWARDER_IDL_
+
+#include "CosNotification.idl"
+#include "CosNotifyChannelAdmin.idl"
+
+#pragma prefix ""
+
+/**
+ * @namespace Event_Forwarder
+ *
+ * @brief
+ */
+module Event_Forwarder
+{
+ interface StructuredProxyPushSupplier : CosNotifyChannelAdmin::StructuredProxyPushSupplier
+ {
+ void forward_structured (in CosNotification::StructuredEvent event);
+
+ void forward_structured_no_filtering (in CosNotification::StructuredEvent event);
+
+ void forward_any (in any event);
+
+ void forward_any_no_filtering (in any event);
+ };
+
+ interface ProxyPushSupplier : CosNotifyChannelAdmin::ProxyPushSupplier
+ {
+ void forward_structured (in CosNotification::StructuredEvent event);
+
+ void forward_structured_no_filtering (in CosNotification::StructuredEvent event);
+
+ void forward_any (in any event);
+
+ void forward_any_no_filtering (in any event);
+ };
+};
+
+#endif /* _EVENT_FORWARDER_IDL_ */
diff --git a/TAO/orbsvcs/orbsvcs/Event_Service_Constants.h b/TAO/orbsvcs/orbsvcs/Event_Service_Constants.h
new file mode 100644
index 00000000000..6a5e6836feb
--- /dev/null
+++ b/TAO/orbsvcs/orbsvcs/Event_Service_Constants.h
@@ -0,0 +1,84 @@
+// -*- C++ -*-
+
+//==========================================================================
+/**
+ * @file Event_Service_Constants.h
+ *
+ * $Id$
+ *
+ * Keep constants required by both Event Service implementation and
+ * the Scheduling Service implementation.
+ *
+ * @author Carlos O'Ryan (coryan@cs.wustl.edu)
+ */
+//==========================================================================
+
+#ifndef ACE_ES_CONSTANTS_H
+#define ACE_ES_CONSTANTS_H
+
+#include /**/ "ace/pre.h"
+#include "ace/Message_Block.h"
+
+#if !defined (ACE_LACKS_PRAGMA_ONCE)
+# pragma once
+#endif /* ACE_LACKS_PRAGMA_ONCE */
+
+#include "orbsvcs/Time_Utilities.h"
+
+TAO_BEGIN_VERSIONED_NAMESPACE_DECL
+
+// = Predefined event types. All application defined types should be
+// relative to ACE_ES_EVENT_UNDEFINED.
+const long ACE_ES_EVENT_ANY = 0;
+const long ACE_ES_EVENT_SHUTDOWN = 1;
+const long ACE_ES_EVENT_ACT = 2;
+const long ACE_ES_EVENT_NOTIFICATION = 3;
+const long ACE_ES_EVENT_TIMEOUT = 4;
+const long ACE_ES_EVENT_INTERVAL_TIMEOUT = 5;
+const long ACE_ES_EVENT_DEADLINE_TIMEOUT = 6;
+const long ACE_ES_GLOBAL_DESIGNATOR = 7;
+const long ACE_ES_CONJUNCTION_DESIGNATOR = 8;
+const long ACE_ES_DISJUNCTION_DESIGNATOR = 9;
+const long ACE_ES_NEGATION_DESIGNATOR = 10;
+const long ACE_ES_LOGICAL_AND_DESIGNATOR = 11;
+const long ACE_ES_BITMASK_DESIGNATOR = 12;
+const long ACE_ES_MASKED_TYPE_DESIGNATOR = 13;
+const long ACE_ES_NULL_DESIGNATOR = 14;
+const long ACE_ES_EVENT_UNDEFINED = 16;
+
+/// Predefined event sources.
+const long ACE_ES_EVENT_SOURCE_ANY = 0;
+
+/// The max number of priorities provided by the target platform.
+/// @todo This should be defined in ACE (somehow) and only mapped here
+/// to some variables (and even that is doubtful).
+const long ACE_Scheduler_MAX_PRIORITIES = 5;
+
+const TimeBase::TimeT ACE_Scheduler_Rates[ACE_Scheduler_MAX_PRIORITIES] = {
+ 250000, // 40 Hz
+ 500000, // 20 Hz
+ 1000000, // 10 Hz
+ 2000000, // 5 Hz
+ 10000000 // 1 Hz
+};
+
+/// The minimum preemption priority.
+const long ACE_Scheduler_MIN_PREEMPTION_PRIORITY =
+ ACE_Scheduler_MAX_PRIORITIES - 1;
+
+/// Max preemption priority.
+const long ACE_Scheduler_MAX_PREEMPTION_PRIORITY = 0;
+
+/// This is the maximum sub priority.
+const u_long ACE_Scheduler_MAX_SUB_PRIORITY =
+ ACE_Message_Block::MB_USER - 1;
+
+/// This is the minimum sub priority.
+const u_long ACE_Scheduler_MIN_SUB_PRIORITY =
+ ACE_Message_Block::MB_NORMAL;
+
+TAO_END_VERSIONED_NAMESPACE_DECL
+
+#include /**/ "ace/post.h"
+
+#endif /* ACE_ES_CONSTANTS_H */
diff --git a/TAO/orbsvcs/orbsvcs/Event_Utilities.cpp b/TAO/orbsvcs/orbsvcs/Event_Utilities.cpp
new file mode 100644
index 00000000000..4c66ec5087d
--- /dev/null
+++ b/TAO/orbsvcs/orbsvcs/Event_Utilities.cpp
@@ -0,0 +1,221 @@
+// $Id$
+
+#include "orbsvcs/Event_Utilities.h"
+#include "ace/Log_Msg.h"
+#include "ace/OS_NS_stdio.h"
+#include "ace/OS_NS_string.h"
+
+#if !defined (__ACE_INLINE__)
+#include "orbsvcs/Event_Utilities.i"
+#endif /* __ACE_INLINE__ */
+
+ACE_RCSID (orbsvcs,
+ Event_Utilities,
+ "$Id$")
+
+TAO_BEGIN_VERSIONED_NAMESPACE_DECL
+
+ACE_ConsumerQOS_Factory::
+ ACE_ConsumerQOS_Factory (TAO_EC_Event_Initializer initializer)
+ : designator_set_ (0),
+ event_initializer_ (initializer)
+{
+ qos_.is_gateway = 0;
+}
+
+ACE_ConsumerQOS_Factory::~ACE_ConsumerQOS_Factory (void)
+{
+}
+
+int
+ACE_ConsumerQOS_Factory::start_conjunction_group (int nchildren)
+{
+ int l = qos_.dependencies.length ();
+ qos_.dependencies.length (l + 1);
+ if (this->event_initializer_ != 0)
+ (*this->event_initializer_) (qos_.dependencies[l].event);
+ qos_.dependencies[l].event.header.type = ACE_ES_CONJUNCTION_DESIGNATOR;
+ qos_.dependencies[l].event.header.source = nchildren;
+ qos_.dependencies[l].rt_info = 0;
+ this->designator_set_ = 1;
+ return 0;
+}
+
+int
+ACE_ConsumerQOS_Factory::start_disjunction_group (int nchildren)
+{
+ int l = qos_.dependencies.length ();
+ qos_.dependencies.length (l + 1);
+ if (this->event_initializer_ != 0)
+ (*this->event_initializer_) (qos_.dependencies[l].event);
+ qos_.dependencies[l].event.header.type = ACE_ES_DISJUNCTION_DESIGNATOR;
+ qos_.dependencies[l].event.header.source = nchildren;
+ qos_.dependencies[l].rt_info = 0;
+ this->designator_set_ = 1;
+ return 0;
+}
+
+int
+ACE_ConsumerQOS_Factory::start_logical_and_group (int nchildren)
+{
+ int l = qos_.dependencies.length ();
+ qos_.dependencies.length (l + 1);
+ if (this->event_initializer_ != 0)
+ (*this->event_initializer_) (qos_.dependencies[l].event);
+ qos_.dependencies[l].event.header.type = ACE_ES_LOGICAL_AND_DESIGNATOR;
+ qos_.dependencies[l].event.header.source = nchildren;
+ qos_.dependencies[l].rt_info = 0;
+ this->designator_set_ = 1;
+ return 0;
+}
+
+int
+ACE_ConsumerQOS_Factory::start_negation (void)
+{
+ int l = qos_.dependencies.length ();
+ qos_.dependencies.length (l + 1);
+ if (this->event_initializer_ != 0)
+ (*this->event_initializer_) (qos_.dependencies[l].event);
+ qos_.dependencies[l].event.header.type = ACE_ES_NEGATION_DESIGNATOR;
+ qos_.dependencies[l].rt_info = 0;
+ this->designator_set_ = 1;
+ return 0;
+}
+
+int
+ACE_ConsumerQOS_Factory::start_bitmask (CORBA::ULong source_mask,
+ CORBA::ULong type_mask)
+{
+ int l = qos_.dependencies.length ();
+ qos_.dependencies.length (l + 2);
+ if (this->event_initializer_ != 0)
+ {
+ (*this->event_initializer_) (qos_.dependencies[l].event);
+ (*this->event_initializer_) (qos_.dependencies[l + 1].event);
+ }
+ qos_.dependencies[l].event.header.type = ACE_ES_BITMASK_DESIGNATOR;
+ qos_.dependencies[l].rt_info = 0;
+
+ qos_.dependencies[l+1].event.header.source = source_mask;
+ qos_.dependencies[l+1].event.header.type = type_mask;
+ qos_.dependencies[l+1].rt_info = 0;
+
+ this->designator_set_ = 1;
+ return 0;
+}
+
+int
+ACE_ConsumerQOS_Factory::insert (const RtecEventChannelAdmin::Dependency &subscribe)
+{
+ // Make sure that a designator is first.
+ if (designator_set_ == 0)
+ {
+ int l = qos_.dependencies.length ();
+ qos_.dependencies.length (l + 1);
+ if (this->event_initializer_ != 0)
+ (*this->event_initializer_) (qos_.dependencies[l].event);
+ qos_.dependencies[l].rt_info = 0;
+ qos_.dependencies[l].event.header.type = ACE_ES_GLOBAL_DESIGNATOR;
+
+ this->designator_set_ = 1;
+ }
+
+ int l = qos_.dependencies.length ();
+ qos_.dependencies.length (l + 1);
+ qos_.dependencies[l] = subscribe;
+ return 0;
+}
+
+void event_debug (const char* p,
+ const RtecEventComm::Event& event)
+{
+ size_t l = ACE_OS::strlen (p);
+ ACE_DEBUG ((LM_DEBUG,
+ "%*.*s - event.source: %d (0x%x)\n"
+ "%*.*s event.type: %d (0x%x)\n",
+ l, l, p, event.header.source, event.header.source,
+ l, l, p, event.header.type, event.header.type));
+}
+
+void
+ACE_ConsumerQOS_Factory::debug (const RtecEventChannelAdmin::ConsumerQOS& qos)
+{
+ ACE_DEBUG ((LM_DEBUG, "ConsumerQOS { \n"));
+ ACE_DEBUG ((LM_DEBUG, " is_gateway: %d\n", qos.is_gateway));
+
+ for (u_int i = 0; i < qos.dependencies.length (); ++i)
+ {
+ char buf[128];
+ ACE_OS::sprintf (buf, " dep[%d]", i);
+ event_debug (buf, qos.dependencies[i].event);
+ ACE_DEBUG ((LM_DEBUG, "%s rt_info: %d\n",
+ buf, qos.dependencies[i].rt_info));
+ }
+ ACE_DEBUG ((LM_DEBUG, "}\n"));
+}
+
+// ************************************************************
+ACE_SupplierQOS_Factory::
+ ACE_SupplierQOS_Factory (TAO_EC_Event_Initializer initializer,
+ int qos_max_len)
+ : event_initializer_ (initializer)
+{
+ qos_.is_gateway = 0;
+
+ // Allocate the space requested by the application....
+ qos_.publications.length (qos_max_len);
+
+ // ... now reset the length, we do not want to use any elements in
+ // the sequence that have not been initialized....
+ qos_.publications.length (0);
+}
+
+int
+ACE_SupplierQOS_Factory::insert (RtecEventComm::EventSourceID sid,
+ RtecEventComm::EventType type,
+ RtecBase::handle_t rt_info,
+ u_int ncalls)
+{
+ CORBA::ULong l = this->qos_.publications.length ();
+ if (l >= this->qos_.publications.maximum ())
+ {
+ // There is not enough space for the next element, grow the
+ // buffer.
+ this->qos_.publications.length (l + 1);
+
+ // @@ TODO We may want to consider more efficient growing
+ // strategies here, for example, duplicating the size of the
+ // buffer, or growing in fixed sized chunks...
+ }
+
+ if (this->event_initializer_ != 0)
+ (*this->event_initializer_) (qos_.publications[l].event);
+ this->qos_.publications[l].event.header.source = sid;
+ this->qos_.publications[l].event.header.type = type;
+ // TODO: IDL union this->qos_.publications[l].event.data_.lval (0);
+ this->qos_.publications[l].dependency_info.rt_info = rt_info;
+ this->qos_.publications[l].dependency_info.number_of_calls = ncalls;
+ return 0;
+}
+
+void ACE_SupplierQOS_Factory::debug (const RtecEventChannelAdmin::SupplierQOS& qos)
+{
+ ACE_DEBUG ((LM_DEBUG, "SupplierQOS { \n"));
+ ACE_DEBUG ((LM_DEBUG, " is_gateway: %d\n", qos.is_gateway));
+
+ for (u_int i = 0; i < qos.publications.length (); ++i)
+ {
+ char buf[128] = { 0 };
+ ACE_OS::sprintf (buf, " publications[%d]", i);
+ event_debug (buf, qos.publications[i].event);
+ ACE_DEBUG ((LM_DEBUG,
+ "%s dependency_info.rt_info: %d\n"
+ "%s dependency_info.number_of_calls: %d\n",
+ buf, qos.publications[i].dependency_info.rt_info,
+ buf, qos.publications[i].dependency_info.number_of_calls));
+ }
+ ACE_DEBUG ((LM_DEBUG, "}\n"));
+
+}
+
+TAO_END_VERSIONED_NAMESPACE_DECL
diff --git a/TAO/orbsvcs/orbsvcs/Event_Utilities.h b/TAO/orbsvcs/orbsvcs/Event_Utilities.h
new file mode 100644
index 00000000000..01be03b7517
--- /dev/null
+++ b/TAO/orbsvcs/orbsvcs/Event_Utilities.h
@@ -0,0 +1,256 @@
+// -*- C++ -*-
+
+//=============================================================================
+/**
+ * @file Event_Utilities.h
+ *
+ * $Id$
+ *
+ * @author Tim Harrison (harrison@cs.wustl.edu)
+ */
+//=============================================================================
+
+
+#ifndef ACE_EVENT_UTILITIES_H
+#define ACE_EVENT_UTILITIES_H
+
+#include /**/ "ace/pre.h"
+
+#include "orbsvcs/RtecEventChannelAdminC.h"
+#include "orbsvcs/Event_Service_Constants.h"
+
+#include "orbsvcs/Event/event_export.h"
+
+TAO_BEGIN_VERSIONED_NAMESPACE_DECL
+
+
+typedef void (*TAO_EC_Event_Initializer) (RtecEventComm::Event&);
+
+/**
+ * @class ACE_ConsumerQOS_Factory
+ *
+ * @brief Consumer QOS Factory.
+ *
+ * This class allows easy (free from CORBA IDL constraints)
+ * construction of RtecEventChannelAdmin::ConsumerQOS structures.
+ * = CORRELATIONS
+ * ACE_ConsumerQOS_Factory separates subscriptions into conjunction
+ * and disjunction groups. A group can be thought of as a set of
+ * events inside parenthesis: (A+B+C), where A,B, and C are
+ * events.
+ * The following code would be used to represent (A+B) | (B+C):
+ * ACE_ConsumerQOS_Factor factory;
+ * factory.start_conjunction_group ();
+ * factory.insert (A);
+ * factory.insert (B);
+ * factory.start_conjunction_group ();
+ * factory.insert (B);
+ * factory.insert (C);
+ * The following code would be used to represent (A|B) | (B|C):
+ * ACE_ConsumerQOS_Factor factory;
+ * factory.start_disjunction_group ();
+ * factory.insert (A);
+ * factory.insert (B);
+ * factory.start_disjunction_group ();
+ * factory.insert (B);
+ * factory.insert (C);
+ * First, this may not seem to be initially useful, as (A|B) |
+ * (B|C) seems the same as A|B|C. However, this form does have a
+ * significant use when deadline timers are specified (described
+ * below). Note that groups end with the next call to
+ * start_XX_group. Groups are always OR'd together. That is,
+ * there is no way to directly build (A|B|C) + (D|E|F). You can
+ * always expand the previous statement to the OR of multiple ANDs.
+ * = TIMEOUTS
+ * There are two types of timeout types defined in
+ * Event_Service_Constants.h.
+ * ACE_ES_EVENT_INTERVAL_TIMEOUT - the consumer wants to receive a
+ * timeout every N seconds.
+ * ACE_ES_EVENT_DEADLINE_TIMEOUT - the consumer wants the timeout
+ * if and only if some dependencies are not resolved first.
+ * Using these timeouts with the correlations discussed above, we
+ * can construct four different timer semantics: Interval Timer,
+ * Deadline Timer, Interval Correlation, Deadline Correlation:
+ * Interval Timer:
+ * (A+B+C) | (D+E+F) | (G+H+I) | IntervalTimeout
+ * This registers to receive an interval timeout regardless of
+ * other dependencies. Event if events occur, the interval
+ * timeout will still be sent.
+ * Deadline Timer:
+ * (A+B+C) | (D+E+F) | (G+H+I) | DeadlineTimeout
+ * This registers to receive the deadline timeout ONLY if no
+ * other events occur. If a single event is sent to the
+ * consumer, the timer is cancelled and rescheduled.
+ * Deadline Correlation:
+ * (A+B+C) | (D+E+F) | (G+H+DeadlineTimeout)
+ * If G and H do not occur within DeadlineTimeout time, a
+ * deadline timeout is sent. It is cancelled and rescheduled if G
+ * and H occur.
+ * Interval Correlation:
+ * (A+B+C) | (D+E+F) | (G+H+IntervalTimeout)
+ * G+H+IntervalTimeout are sent ONLY after all have occurred. If
+ * G+H occur, they are queued until IntervalTimeout occurs. If
+ * IntervalTimeout occurs, it is queued until G+H occur.
+ */
+class TAO_RTEvent_Export ACE_ConsumerQOS_Factory
+{
+public:
+ /// Default construction.
+ ACE_ConsumerQOS_Factory (TAO_EC_Event_Initializer initializer = 0);
+
+ /// Death and destruction.
+ ~ACE_ConsumerQOS_Factory (void);
+
+ /**
+ * The Event Channel waits until all the children have accepted at
+ * least one event, and then send them all as a single event to the
+ * consumer.
+ */
+ int start_conjunction_group (int nchildren = 0);
+
+ /// The consumer accepts any event that is accepted by at least one
+ /// child.
+ int start_disjunction_group (int nchildren = 0);
+
+ /// The consumer only accepts events that pass all the filter
+ /// expressions defined by the children.
+ int start_logical_and_group (int nchildren = 0);
+
+ /// The consumer wants all the events *except* the group that
+ /// follows.
+ int start_negation (void);
+
+ /// Insert a bitmask filter, this acts as a quick rejection mechanism
+ /// for the subsequent filters.
+ int start_bitmask (CORBA::ULong source_mask,
+ CORBA::ULong type_mask);
+
+ /**
+ * Inser a new filter that only accepts events with the following
+ * properties:
+ * (event.header.type & type_mask) == type_value
+ * (event.header.source & source_mask) == source_value
+ */
+ int insert_bitmasked_value (CORBA::ULong source_mask,
+ CORBA::ULong type_mask,
+ CORBA::ULong source_value,
+ CORBA::ULong type_value);
+
+ /// Insert a node that accepts any event, useful for bitmask filters.
+ int insert_null_terminator (void);
+
+ // = Insert operations add to the current conjunction or disjunction
+ // group. These return 0 on success, -1 on failure. Before insert
+ // is called, a start_XX_group method should be called. If a
+ // start_XX_group method is not called, start_conjunction_group is
+ // assumed.
+
+ /// Insert the @a subscribe structure describing the event and
+ /// receiving method into the current group.
+ int insert (const RtecEventChannelAdmin::Dependency &subscribe);
+
+ /**
+ * Insert source/type dependency. @a source of the event (may be
+ * zero), @a type of the event. @a rt_info describes the method that
+ * will handle the source/type events.
+ */
+ int insert (RtecEventComm::EventSourceID source,
+ RtecEventComm::EventType type,
+ RtecBase::handle_t rt_info);
+
+ /// Insert type-only dependency.
+ int insert_type (RtecEventComm::EventType type,
+ RtecBase::handle_t rt_info);
+
+ /// Insert source-only dependency.
+ int insert_source (RtecEventComm::EventSourceID source,
+ RtecBase::handle_t rt_info);
+
+ /// Register temporal dependency. @a type designates interval or
+ /// deadline timeout that will occur every @a interval.
+ int insert_time (RtecEventComm::EventType type,
+ RtecEventComm::Time interval,
+ RtecBase::handle_t rt_info);
+
+ /// This will be inserted as type ACE_ES_EVENT_ACT.
+ int insert_act (RtecEventComm::EventData act);
+
+ // = Conversion operators. The Event Channel takes ConsumerQOS
+ // objects.
+
+ /// Allows conversions to ConsumerQOS, which is expected by the
+ /// PushSupplierProxy::connect_push_consumer interface.
+ const RtecEventChannelAdmin::ConsumerQOS &get_ConsumerQOS (void);
+
+ /// Calls this->get_ConsumerQOS.
+ operator const RtecEventChannelAdmin::ConsumerQOS &(void);
+
+ static void debug (const RtecEventChannelAdmin::ConsumerQOS& qos);
+
+private:
+ /// The representation to be sent to the channel.
+ RtecEventChannelAdmin::ConsumerQOS qos_;
+
+ /// Whether a start_XX_group has been called yet. This is to make
+ /// sure that a designator is placed in the subscription list first.
+ int designator_set_;
+
+ /**
+ * If not zero this is a user-provided function used to initialize
+ * the events. When the event contains unions this is required to
+ * avoid marshaling and demarshaling of default initialized unions
+ * that (AFAIK) is not CORBA compliant.
+ */
+ TAO_EC_Event_Initializer event_initializer_;
+};
+
+// ************************************************************
+
+class TAO_RTEvent_Export ACE_SupplierQOS_Factory
+{
+public:
+ /// Default construction.
+ ACE_SupplierQOS_Factory (TAO_EC_Event_Initializer initializer = 0,
+ int qos_max_len = 0);
+
+ /**
+ * Publish @a sid and @a type that is generate by a method described by
+ * @a rtinfo. The method generates @a type @a ncalls number of times
+ * per "iteration."
+ */
+ int insert (RtecEventComm::EventSourceID sid,
+ RtecEventComm::EventType type,
+ RtecBase::handle_t rtinfo,
+ u_int ncalls);
+
+ /// Allows conversions to SupplierQOS, which is expected by the
+ /// PushSupplierProxy::connect_push_supplier interface.
+ const RtecEventChannelAdmin::SupplierQOS &get_SupplierQOS (void);
+
+ /// Calls this->get_SupplierQOS().
+ operator const RtecEventChannelAdmin::SupplierQOS &(void);
+
+ static void debug (const RtecEventChannelAdmin::SupplierQOS& qos);
+
+private:
+ /// Representation needed by channel.
+ RtecEventChannelAdmin::SupplierQOS qos_;
+
+ /**
+ * If not zero this is a user-provided function used to initialize
+ * the events. When the event contains unions this is required to
+ * avoid marshaling and demarshaling of default initialized unions
+ * that (AFAIK) is not CORBA compliant.
+ */
+ TAO_EC_Event_Initializer event_initializer_;
+};
+
+TAO_END_VERSIONED_NAMESPACE_DECL
+
+#if defined (__ACE_INLINE__)
+#include "orbsvcs/Event_Utilities.i"
+#endif /* __ACE_INLINE__ */
+
+#include /**/ "ace/post.h"
+
+#endif /* ACE_EVENT_UTILITIES_H */
diff --git a/TAO/orbsvcs/orbsvcs/Event_Utilities.i b/TAO/orbsvcs/orbsvcs/Event_Utilities.i
new file mode 100644
index 00000000000..20c09b0a0fe
--- /dev/null
+++ b/TAO/orbsvcs/orbsvcs/Event_Utilities.i
@@ -0,0 +1,152 @@
+// -*- C++ -*-
+//
+// $Id$
+
+TAO_BEGIN_VERSIONED_NAMESPACE_DECL
+
+ACE_INLINE int
+ACE_ConsumerQOS_Factory::insert (RtecEventComm::EventSourceID source,
+ RtecEventComm::EventType type,
+ RtecBase::handle_t rt_info)
+{
+ RtecEventChannelAdmin::Dependency dependency;
+ if (this->event_initializer_ != 0)
+ (*this->event_initializer_) (dependency.event);
+ dependency.event.header.source = source;
+ dependency.event.header.type = type;
+ //dependency.event.header.creation_time = 0;
+ //dependency.event.header.ec_recv_time = 0;
+ //dependency.event.header.ec_send_time = 0;
+ dependency.rt_info = rt_info;
+ return this->insert (dependency);
+}
+
+ACE_INLINE int
+ACE_ConsumerQOS_Factory::insert_bitmasked_value (CORBA::ULong source_mask,
+ CORBA::ULong type_mask,
+ CORBA::ULong source_value,
+ CORBA::ULong type_value)
+
+{
+ RtecEventChannelAdmin::Dependency dependency;
+ if (this->event_initializer_ != 0)
+ (*this->event_initializer_) (dependency.event);
+ dependency.event.header.type = ACE_ES_MASKED_TYPE_DESIGNATOR;
+ dependency.event.header.source = 0;
+ //dependency.event.header.creation_time = 0;
+ //dependency.event.header.ec_recv_time = 0;
+ //dependency.event.header.ec_send_time = 0;
+ dependency.rt_info = 0;
+ this->insert (dependency);
+
+ dependency.event.header.source = source_mask;
+ dependency.event.header.type = type_mask;
+ this->insert (dependency);
+
+ dependency.event.header.source = source_value;
+ dependency.event.header.type = type_value;
+ return this->insert (dependency);
+}
+
+ACE_INLINE int
+ACE_ConsumerQOS_Factory::insert_null_terminator (void)
+{
+ RtecEventChannelAdmin::Dependency dependency;
+ if (this->event_initializer_ != 0)
+ (*this->event_initializer_) (dependency.event);
+ dependency.event.header.type = ACE_ES_NULL_DESIGNATOR;
+ dependency.event.header.source = 0;
+ return this->insert (dependency);
+}
+
+ACE_INLINE int
+ACE_ConsumerQOS_Factory::insert_type (RtecEventComm::EventType type,
+ RtecBase::handle_t rt_info)
+{
+ RtecEventChannelAdmin::Dependency dependency;
+ if (this->event_initializer_ != 0)
+ (*this->event_initializer_) (dependency.event);
+ dependency.event.header.source = ACE_ES_EVENT_SOURCE_ANY;
+ dependency.event.header.type = type;
+ //dependency.event.header.creation_time = 0;
+ //dependency.event.header.ec_recv_time = 0;
+ //dependency.event.header.ec_send_time = 0;
+ dependency.rt_info = rt_info;
+ return this->insert (dependency);
+}
+
+ACE_INLINE int
+ACE_ConsumerQOS_Factory::insert_source (RtecEventComm::EventSourceID source,
+ RtecBase::handle_t rt_info)
+{
+ RtecEventChannelAdmin::Dependency dependency;
+ if (this->event_initializer_ != 0)
+ (*this->event_initializer_) (dependency.event);
+ dependency.event.header.source = source;
+ dependency.event.header.type = ACE_ES_EVENT_ANY;
+ //dependency.event.header.creation_time = 0;
+ //dependency.event.header.ec_recv_time = 0;
+ //dependency.event.header.ec_send_time = 0;
+ dependency.rt_info = rt_info;
+ return this->insert (dependency);
+}
+
+ACE_INLINE int
+ACE_ConsumerQOS_Factory::insert_time (RtecEventComm::EventType type,
+ RtecEventComm::Time interval,
+ RtecBase::handle_t rt_info)
+{
+ RtecEventChannelAdmin::Dependency dependency;
+ if (this->event_initializer_ != 0)
+ (*this->event_initializer_) (dependency.event);
+ dependency.event.header.source = ACE_ES_EVENT_SOURCE_ANY;
+ dependency.event.header.type = type;
+ dependency.event.header.creation_time = interval;
+ //dependency.event.header.ec_recv_time = 0;
+ //dependency.event.header.ec_send_time = 0;
+ dependency.rt_info = rt_info;
+ return this->insert (dependency);
+}
+
+ACE_INLINE int
+ACE_ConsumerQOS_Factory::insert_act (RtecEventComm::EventData act)
+{
+ RtecEventChannelAdmin::Dependency dependency;
+ if (this->event_initializer_ != 0)
+ (*this->event_initializer_) (dependency.event);
+ dependency.event.header.source = 0;
+ dependency.event.header.type = ACE_ES_EVENT_ACT;
+ //dependency.event.header.creation_time = 0;
+ //dependency.event.header.ec_recv_time = 0;
+ //dependency.event.header.ec_send_time = 0;
+ dependency.event.data = act;
+ return this->insert (dependency);
+}
+
+ACE_INLINE const RtecEventChannelAdmin::ConsumerQOS&
+ACE_ConsumerQOS_Factory::get_ConsumerQOS (void)
+{
+ return qos_;
+}
+
+ACE_INLINE
+ACE_ConsumerQOS_Factory::operator const RtecEventChannelAdmin::ConsumerQOS& (void)
+{
+ return qos_;
+}
+
+// ************************************************************
+
+ACE_INLINE const RtecEventChannelAdmin::SupplierQOS&
+ACE_SupplierQOS_Factory::get_SupplierQOS (void)
+{
+ return qos_;
+}
+
+ACE_INLINE
+ACE_SupplierQOS_Factory::operator const RtecEventChannelAdmin::SupplierQOS& (void)
+{
+ return qos_;
+}
+
+TAO_END_VERSIONED_NAMESPACE_DECL
diff --git a/TAO/orbsvcs/orbsvcs/FTORB.mpc b/TAO/orbsvcs/orbsvcs/FTORB.mpc
new file mode 100644
index 00000000000..8254fb8f2de
--- /dev/null
+++ b/TAO/orbsvcs/orbsvcs/FTORB.mpc
@@ -0,0 +1,89 @@
+// -*- MPC -*-
+// $Id$
+
+project(FTORB_Utils) : orbsvcslib, core, iormanip, portableserver, portablegroup, minimum_corba, tao_versioning_idl_defaults {
+ sharedname = TAO_FTORB_Utils
+ idlflags += -Wb,skel_export_include=tao/PortableServer/PolicyS.h
+ dynamicflags = TAO_FT_ORB_UTILS_BUILD_DLL
+ tagchecks += FTORB_Utils
+
+ IDL_Files {
+ idlflags += -Wb,export_macro=TAO_FT_ORB_Utils_Export -Wb,export_include=orbsvcs/FaultTolerance/FT_ORB_Utils_export.h
+ FT_CORBA_ORB.idl
+ }
+
+ Source_Files(ORBSVCS_COMPONENTS) {
+ FTORB_Utils {
+ FT_CORBA_ORBC.cpp
+ FT_CORBA_ORBS.cpp
+ FaultTolerance/FT_IOGR_Property.cpp
+ }
+ }
+
+ Header_Files {
+ FaultTolerance/FT_ORB_Utils_export.h
+ }
+
+ Pkgconfig_Files {
+ TAO_FTORB_Utils.pc.in
+ }
+}
+
+project(FT_ClientORB) : orbsvcslib, ftorbutils, core, messaging, portablegroup, interceptors {
+ avoids += ace_for_tao // Requires ace/UUID
+ sharedname = TAO_FT_ClientORB
+ dynamicflags = TAO_FT_CLIENTORB_BUILD_DLL
+ tagchecks += FT_ClientORB
+ libs += TAO_FTORB_Utils
+ requires += ace_uuid
+
+ IDL_Files {
+ }
+
+ Source_Files(ORBSVCS_COMPONENTS) {
+ FT_ClientORB {
+ FaultTolerance/FT_ClientRequest_Interceptor.cpp
+ FaultTolerance/FT_ClientORBInitializer.cpp
+ FaultTolerance/FT_ClientPolicyFactory.cpp
+ FaultTolerance/FT_ClientPolicy_i.cpp
+ FaultTolerance/FT_ClientService_Activate.cpp
+ FaultTolerance/FT_Endpoint_Selector_Factory.cpp
+ FaultTolerance/FT_Invocation_Endpoint_Selectors.cpp
+ FaultTolerance/FT_Service_Callbacks.cpp
+ }
+ }
+
+ Template_Files {
+ }
+
+ Pkgconfig_Files {
+ TAO_FT_ClientORB.pc.in
+ }
+}
+
+project(FT_ServerORB) : orbsvcslib, ftorbutils, core, messaging, portablegroup, pi_server, pi, interceptors {
+ sharedname = TAO_FT_ServerORB
+ dynamicflags = TAO_FT_SERVERORB_BUILD_DLL
+ tagchecks += FT_ServerORB
+ libs += TAO_FTORB_Utils
+
+ IDL_Files {
+ }
+
+ Source_Files(ORBSVCS_COMPONENTS) {
+ FT_ServerORB {
+ FaultTolerance/FT_ServerORBInitializer.cpp
+ FaultTolerance/FT_ServerPolicyFactory.cpp
+ FaultTolerance/FT_ServerPolicy_i.cpp
+ FaultTolerance/FT_ServerRequest_Interceptor.cpp
+ FaultTolerance/FT_ServerService_Activate.cpp
+ }
+ }
+
+ Template_Files {
+ }
+
+ Pkgconfig_Files {
+ TAO_FT_ServerORB.pc.in
+ }
+}
diff --git a/TAO/orbsvcs/orbsvcs/FTRT.idl b/TAO/orbsvcs/orbsvcs/FTRT.idl
new file mode 100644
index 00000000000..4ae2530a225
--- /dev/null
+++ b/TAO/orbsvcs/orbsvcs/FTRT.idl
@@ -0,0 +1,82 @@
+// -*- IDL -*-
+
+//=============================================================================
+/**
+ * @file FTRT.idl
+ *
+ * $Id$
+ *
+ * @author Huang-Ming Huang
+ */
+//=============================================================================
+
+#ifndef FTRT_H
+#define FTRT_H
+
+#include "tao/IOP.pidl"
+
+module FTRT
+{
+
+ typedef long TransactionDepth;
+ typedef unsigned long SequenceNumber;
+
+ const IOP::ServiceId FT_TRANSACTION_DEPTH = 30;
+ const IOP::ServiceId FT_SEQUENCE_NUMBER = 31;
+ const IOP::ServiceId FT_FORWARD = 32;
+
+ /// this service context is used by FTRT client
+ /// to information the server the depth of replication
+ /// which has to be complete before the request returns.
+ struct FTTransactionDepthServiceContext {
+ TransactionDepth transaction_depth;
+ };
+
+ /// this service context is used by replicas for detecting
+ /// the loss of replication messages in soft-replication.
+ struct FTSequenceNumberServiceContext {
+ SequenceNumber sequence_number;
+ };
+
+ /// In the FTCORBA standard, if the server receive a request
+ /// from a client with an object_group_ref_version less than
+ /// the one known to the server. The server should reply a
+ /// LOCATION_FORARD_PERM exception. However, if the server is
+ /// also the primary, the server have to wait until the client
+ /// issue a new request with the new object_group_ref_version
+ /// before it can return the result. This will cause unnecessary
+ /// delay for processing the request. The service context is used
+ /// by the primary to inform the client the lastest version of
+ /// IOGR known to the primary in the reply. The client can thus
+ /// upates the object reference in the next method invocation without
+ /// extra round trip delay.
+ struct FTForwardServiceContext {
+ Object forward;
+ };
+
+ exception OutOfSequence
+ {
+ SequenceNumber current;
+ };
+
+ exception TransactionDepthTooHigh
+ {
+ };
+
+ typedef sequence<octet> State;
+
+ exception InvalidUpdate {};
+
+ interface Updateable
+ {
+ /// used for assured replication
+ void set_update(in State s)
+ raises(InvalidUpdate, OutOfSequence, TransactionDepthTooHigh);
+
+ /// used for soft replication
+ oneway void oneway_set_update(in State s);
+ };
+};
+
+#endif
+
diff --git a/TAO/orbsvcs/orbsvcs/FTRT_GroupManager.idl b/TAO/orbsvcs/orbsvcs/FTRT_GroupManager.idl
new file mode 100644
index 00000000000..950ee0e0b3a
--- /dev/null
+++ b/TAO/orbsvcs/orbsvcs/FTRT_GroupManager.idl
@@ -0,0 +1,71 @@
+// -*- IDL -*-
+
+//=============================================================================
+/**
+ * @file FTRT_GroupManager.idl
+ *
+ * $Id$
+ *
+ * @author Huang-Ming Huang
+ */
+//=============================================================================
+
+#ifndef TAO_FTRT_GROUPMANAGER_IDL
+#define TAO_FTRT_GROUPMANAGER_IDL
+
+#include "orbsvcs/RtecEventChannelAdmin.idl"
+#include "orb.idl"
+#include "orbsvcs/CosNaming.idl"
+#include "FTRT.idl"
+
+module FTRT
+{
+ typedef CosNaming::Name Location;
+
+ interface FaultListener {
+ /// called by the replica which detect the loss of connection with its
+ /// predecessor to the primary
+ oneway void replica_crashed(in Location the_location);
+ };
+
+ interface ObjectGroupManager;
+
+ struct ManagerInfo {
+ Location the_location;
+ ObjectGroupManager ior;
+ };
+
+ exception PredecessorUnreachable {};
+
+ typedef sequence<ManagerInfo> ManagerInfoList;
+ exception InvalidState{};
+
+ interface ObjectGroupManager : FaultListener {
+ boolean start(in FaultListener listener,
+ out Location the_location);
+
+ void create_group(in ManagerInfoList info_list,
+ in unsigned long object_group_ref_version)
+ raises(PredecessorUnreachable);
+
+ /// called by a newly created replica to the primary
+ // for requesting for joining a object group
+ oneway void join_group(in ManagerInfo info);
+
+ /// called by primary to replicas
+ /// for adding a new member to the group
+ void add_member(in ManagerInfo info,
+ in unsigned long object_group_ref_version);
+
+ /// called by the primary to backups for deleting a member from
+ /// the group
+ oneway void remove_member(in Location crashed_location,
+ in unsigned long object_group_ref_version);
+
+ void set_state(in State stat)
+ raises (InvalidState);
+
+ };
+};
+
+#endif
diff --git a/TAO/orbsvcs/orbsvcs/FT_CORBA.idl b/TAO/orbsvcs/orbsvcs/FT_CORBA.idl
new file mode 100644
index 00000000000..144c2290bbe
--- /dev/null
+++ b/TAO/orbsvcs/orbsvcs/FT_CORBA.idl
@@ -0,0 +1,352 @@
+//$Id$
+// FT.idl
+#ifndef _FT_IDL_
+#define _FT_IDL_
+
+// The OMG file has been devided into several portions:
+// FT_CORBA.idl
+// FT_CORBA_ORB.idl
+// FT_Detector.idl
+// FT_Notifier.idl
+// FT_Replica.idl
+
+// The next include is TAO specific.
+#include "orbsvcs/FT_CORBA_ORB.idl"
+
+#define FT_USES_PORTABLE_GROUP
+
+#ifdef FT_USES_PORTABLE_GROUP
+# include "orbsvcs/PortableGroup.idl"
+#else // FT_USES_PORTABLE_GROUP
+#include "orbsvcs/CosNaming.idl" // 98-10-19.idl
+#endif // FT_USES_PORTABLE_GROUP
+
+#include "orbsvcs/CosNotification.idl" // from telecom/98-11-03.idl
+#include "orbsvcs/CosNotifyFilter.idl"
+
+#pragma prefix "omg.org"
+
+module FT
+{
+ /// Forward declarations
+ interface FaultNotifier;
+
+ typedef long ReplicationStyleValue;
+ const ReplicationStyleValue STATELESS = 0;
+ const ReplicationStyleValue COLD_PASSIVE = 1;
+ const ReplicationStyleValue WARM_PASSIVE = 2;
+ const ReplicationStyleValue ACTIVE = 3;
+ const ReplicationStyleValue ACTIVE_WITH_VOTING = 4;
+ const ReplicationStyleValue SEMI_ACTIVE = 5;
+
+ typedef long ConsistencyStyleValue;
+ const ConsistencyStyleValue CONS_APP_CTRL = 0;
+ const ConsistencyStyleValue CONS_INF_CTRL = 1;
+
+ typedef long FaultMonitoringStyleValue;
+ const FaultMonitoringStyleValue PULL = 0;
+ const FaultMonitoringStyleValue PUSH = 1;
+ const FaultMonitoringStyleValue NOT_MONITORED = 2;
+
+ typedef long FaultMonitoringGranularityValue;
+ const FaultMonitoringGranularityValue MEMB = 0;
+ const FaultMonitoringGranularityValue LOC = 1;
+ const FaultMonitoringGranularityValue LOC_AND_TYPE = 2;
+
+ struct FaultMonitoringIntervalAndTimeoutValue {
+ TimeBase::TimeT monitoring_interval;
+ TimeBase::TimeT timeout;
+ };
+
+ exception BadReplicationStyle {};
+ exception PrimaryNotSet {};
+
+#ifdef FT_USES_PORTABLE_GROUP
+ /////////////////////////////////////////
+ // The following typedefs "import"
+ // definitions from the PortableGroup module
+ // definitions into the FT module.
+ // This is an interim step during the process
+ // of having FT depend on the commmon
+ // of PortableGroup module rather than defining
+ // everything itself.
+
+ // this typedef trick doesn't work for exceptions, so they must
+ // use the PortableGroup:: prefix
+ typedef PortableGroup::_TypeId _TypeId;
+ typedef PortableGroup::ObjectGroup ObjectGroup;
+ typedef PortableGroup::Name Name;
+ typedef PortableGroup::Value Value;
+ typedef PortableGroup::Property Property;
+ typedef PortableGroup::Properties Properties;
+ typedef PortableGroup::Location Location;
+ typedef PortableGroup::Locations Locations;
+ typedef PortableGroup::Criteria Criteria;
+
+ typedef PortableGroup::FactoryInfo FactoryInfo;
+ typedef PortableGroup::FactoryInfos FactoryInfos;
+ typedef PortableGroup::MembershipStyleValue MembershipStyleValue;
+
+ typedef PortableGroup::FactoriesValue FactoriesValue;
+ typedef PortableGroup::InitialNumberMembersValue InitialNumberMembersValue;
+ typedef PortableGroup::MinimumNumberMembersValue MinimumNumberMembersValue;
+ typedef PortableGroup::PropertyManager PropertyManager;
+ typedef PortableGroup::ObjectGroupManager ObjectGroupManager;
+ typedef PortableGroup::GenericFactory GenericFactory;
+
+ // Specification of FTObjectGroupManager Interface
+ // which ReplicationManager Inherits
+ interface FTObjectGroupManager : PortableGroup::ObjectGroupManager {
+
+ ::PortableGroup::ObjectGroup set_primary_member(in ::PortableGroup::ObjectGroup object_group,
+ in ::PortableGroup::Location the_location)
+ raises(PortableGroup::ObjectGroupNotFound,
+ PortableGroup::MemberNotFound,
+ PrimaryNotSet,
+ BadReplicationStyle);
+ };
+
+
+ ///////////////////////////////////////////////////
+ // names for properties used in Fault Tolerant CORBA
+
+ /// FT::ReplicationStyle
+ const string FT_REPLICATION_STYLE = "org.omg.ft.ReplicationStyle";
+
+ /// FT::ConsistencyStyle
+ const string FT_CONSISTENCY_STYLE = "org.omg.ft.ConsistencyStyle";
+
+ /// FT::MembershipStyle
+ const string FT_MEMBERSHIP_STYLE = PortableGroup::PG_MEMBERSHIP_STYLE;
+ const PortableGroup::MembershipStyleValue MEMB_APP_CTRL = PortableGroup::MEMB_APP_CTRL;
+ const PortableGroup::MembershipStyleValue MEMB_INF_CTRL = PortableGroup::MEMB_INF_CTRL;
+
+ /// FT::FaultMonitoringStyle
+ const string FT_FAULT_MONITORING_STYLE = "org.omg.ft.FaultMonitoringStyle";
+
+ /// FT::FaultMonitoringGranularity
+ const string FT_FAULT_MONITORING_GRANULARITY = "org.omg.ft.FaultMonitoringGranularity";
+
+ /// FT::InitialNumberMembers
+ const string FT_INITIAL_NUMBER_MEMBERS = PortableGroup::PG_INITIAL_NUMBER_MEMBERS;
+
+ /// FT::MinimumNumberMembers
+ const string FT_MINIMUM_NUMBER_MEMBERS = PortableGroup::PG_MINIMUM_NUMBER_MEMBERS;
+
+ /// Factories
+ const string FT_FACTORIES = PortableGroup::PG_FACTORIES;
+
+ /// FT::FaultMonitoringIntervalAndTimeou
+ const string FT_FAULT_MONITORING_INTERVAL_AND_TIMEOUT = "org.omg.ft.FaultMonitoringIntervalAndTimeout";
+
+ /// FT::CheckpointInterval
+ const string FT_CHECKPOINT_INTERVAL = "org.omg.ft.CheckpointInterval";
+
+ // end of property names from FT CORBA specification
+ ///////////////////////////////////////////////////
+
+
+#else // (not) FT_USES_PORTABLE_GROUP
+ interface GenericFactory;
+
+ /// Useful typedefs.
+ typedef CORBA::RepositoryId _TypeId;
+ typedef Object ObjectGroup;
+
+ typedef CosNaming::Name Name;
+ typedef any Value;
+
+ /**
+ * @struct Property
+ *
+ * @brief A property name and a value association.
+ */
+ struct Property {
+ Name nam;
+ Value val;
+ };
+
+ /// Some mor euseful typedefs.
+ typedef sequence<Property> Properties;
+ typedef Name Location;
+ typedef sequence<Location> Locations;
+ typedef Properties Criteria;
+
+
+ /**
+ * @struct FactoryInfo
+ *
+ * @brief <@todo>
+ *
+ */
+ struct FactoryInfo {
+ GenericFactory _factory;
+ Location the_location;
+ Criteria the_criteria;
+ };
+
+ typedef sequence<FactoryInfo> FactoryInfos;
+
+ typedef long ReplicationStyleValue;
+ const ReplicationStyleValue STATELESS = 0;
+ const ReplicationStyleValue COLD_PASSIVE = 1;
+ const ReplicationStyleValue WARM_PASSIVE = 2;
+ const ReplicationStyleValue ACTIVE = 3;
+ const ReplicationStyleValue ACTIVE_WITH_VOTING = 4;
+ typedef long MembershipStyleValue;
+ const MembershipStyleValue MEMB_APP_CTRL = 0;
+ const MembershipStyleValue MEMB_INF_CTRL = 1;
+ typedef long ConsistencyStyleValue;
+ const ConsistencyStyleValue CONS_APP_CTRL = 0;
+ const ConsistencyStyleValue CONS_INF_CTRL = 1;
+ typedef long FaultMonitoringStyleValue;
+ const FaultMonitoringStyleValue PULL = 0;
+ const FaultMonitoringStyleValue PUSH = 1;
+ const FaultMonitoringStyleValue NOT_MONITORED = 2;
+ typedef long FaultMonitoringGranularityValue;
+ const FaultMonitoringGranularityValue MEMB = 0;
+ const FaultMonitoringGranularityValue LOC = 1;
+ const FaultMonitoringGranularityValue LOC_AND_TYPE = 2;
+ typedef FactoryInfos FactoriesValue;
+ typedef unsigned short InitialNumberMembersValue;
+ typedef unsigned short MinimumNumberMembersValue;
+
+ struct FaultMonitoringIntervalAndTimeoutValue {
+ TimeBase::TimeT monitoring_interval;
+ TimeBase::TimeT timeout;
+ };
+
+ typedef TimeBase::TimeT CheckpointIntervalValue;
+ exception InterfaceNotFound {};
+ exception ObjectGroupNotFound {};
+ exception MemberNotFound {};
+ exception ObjectNotFound {};
+ exception MemberAlreadyPresent {};
+ exception BadReplicationStyle {};
+ exception ObjectNotCreated {};
+ exception ObjectNotAdded {};
+ exception PrimaryNotSet {};
+ exception UnsupportedProperty {
+ Name nam;
+ Value val;
+ };
+
+ exception InvalidProperty {
+ Name nam;
+ Value val; };
+
+ exception NoFactory {
+ Location the_location;
+ _TypeId type_id; };
+
+ exception InvalidCriteria {
+ Criteria invalid_criteria; };
+
+ exception CannotMeetCriteria {
+ Criteria unmet_criteria; };
+
+ // Specification of PropertyManager Interface
+ // which ReplicationManager Inherits
+
+ interface PropertyManager {
+
+ void set_default_properties(in Properties props)
+ raises (InvalidProperty, UnsupportedProperty);
+ Properties get_default_properties();
+
+ void remove_default_properties(in Properties props)
+ raises (InvalidProperty, UnsupportedProperty);
+
+ void set_type_properties(in _TypeId type_id,
+ in Properties overrides)
+ raises (InvalidProperty, UnsupportedProperty);
+
+ Properties get_type_properties(in _TypeId type_id);
+
+ void remove_type_properties(in _TypeId type_id,
+ in Properties props)
+ raises (InvalidProperty, UnsupportedProperty);
+
+ void set_properties_dynamically(in ObjectGroup object_group,
+ in Properties overrides)
+ raises(ObjectGroupNotFound, InvalidProperty, UnsupportedProperty);
+
+ Properties get_properties(in ObjectGroup object_group)
+ raises(ObjectGroupNotFound);
+ };
+
+ // Specification of ObjectGroupManager Interface
+ // which ReplicationManager Inherits
+ interface ObjectGroupManager {
+ ObjectGroup create_member(in ObjectGroup object_group,
+ in Location the_location,
+ in _TypeId type_id,
+ in Criteria the_criteria)
+ raises(ObjectGroupNotFound,
+ MemberAlreadyPresent,
+ NoFactory,
+ ObjectNotCreated,
+ InvalidCriteria,
+ CannotMeetCriteria);
+
+ ObjectGroup add_member(in ObjectGroup object_group,
+ in Location the_location,
+ in Object member)
+ raises(ObjectGroupNotFound,
+ MemberAlreadyPresent,
+ ObjectNotAdded);
+
+ ObjectGroup remove_member(in ObjectGroup object_group,
+ in Location the_location)
+ raises(ObjectGroupNotFound,
+ MemberNotFound);
+
+ ObjectGroup set_primary_member(in ObjectGroup object_group,
+ in Location the_location)
+ raises(ObjectGroupNotFound,
+ MemberNotFound,
+ PrimaryNotSet,
+ BadReplicationStyle);
+
+ Locations locations_of_members(in ObjectGroup object_group)
+ raises(ObjectGroupNotFound);
+
+ ObjectGroupId get_object_group_id(in ObjectGroup object_group)
+ raises(ObjectGroupNotFound);
+
+ ObjectGroup get_object_group_ref(in ObjectGroup object_group)
+ raises(ObjectGroupNotFound);
+
+ Object get_member_ref(in ObjectGroup object_group,
+ in Location loc)
+ raises(ObjectGroupNotFound, MemberNotFound);
+ };
+
+
+ // Specification of GenericFactory Interface
+ // which ReplicationManager Inherits and Application Objects Implement
+ interface GenericFactory {
+ typedef any FactoryCreationId;
+ Object create_object(in _TypeId type_id,
+ in Criteria the_criteria,
+ out FactoryCreationId factory_creation_id)
+ raises (NoFactory,
+ ObjectNotCreated,
+ InvalidCriteria,
+ InvalidProperty,
+ CannotMeetCriteria);
+
+ void delete_object(in FactoryCreationId factory_creation_id)
+ raises (ObjectNotFound);
+ };
+
+#endif // FT_USES_PORTABLE_GROUP
+
+ // Specifications for Fault Management moved to FT_Replica.idl
+ // Specification of FaultNotifier Interface: moved to FT_Notifier.idl
+ // Specifications for Logging and Recovery: moved to FT_Replica.idl
+ // Specifications for Replication Manager moved to FT_ReplicationManager.idl
+};
+
+
+#endif // for #ifndef _FT_IDL_
diff --git a/TAO/orbsvcs/orbsvcs/FT_CORBA_ORB.idl b/TAO/orbsvcs/orbsvcs/FT_CORBA_ORB.idl
new file mode 100644
index 00000000000..6503eb969a5
--- /dev/null
+++ b/TAO/orbsvcs/orbsvcs/FT_CORBA_ORB.idl
@@ -0,0 +1,136 @@
+//$Id$
+#ifndef TAO_FT_CORBA_ORB_IDL
+#define TAO_FT_CORBA_ORB_IDL
+
+// Including the $TAO_ROOT/tao one so that we dont depend on the
+// Svc_Utils
+#include "tao/TimeBase.pidl" // 98-10.47.idl
+// Proprietary includes for TAO
+#include "tao/IOP.pidl" // from 98-03-01.idl
+#include "tao/GIOP.pidl" // from 98-03-01.idl
+#include "tao/Policy.pidl"
+
+#include "PortableGroup_Simple_DS.idl"
+
+
+#pragma prefix "omg.org"
+
+
+// These have been moved to the file IOP.pidl
+module FT
+{
+ /// FTDomainId's are denoted as strings
+ typedef PortableGroup::GroupDomainId FTDomainId;
+
+ /// The objectgroup id
+ typedef PortableGroup::ObjectGroupId ObjectGroupId;
+
+ /// The reference version of the object group
+ typedef PortableGroup::ObjectGroupRefVersion ObjectGroupRefVersion;
+
+ /**
+ * @struct TagFTGroupTaggedComponent
+ *
+ * @brief Contents of the Tagged_Component field with tag
+ * TAG_FT_GROUP
+ */
+ typedef PortableGroup::TagGroupTaggedComponent TagFTGroupTaggedComponent;
+
+ /**
+ * @struct TagFTPrinaryTaggedComponent
+ *
+ * @brief Contents of the Tagged_Component field with tag
+ * TAG_FT_PRIMARY
+ */
+ struct TagFTPrimaryTaggedComponent
+ {
+ boolean primary;
+ };
+
+ /**
+ * @struct FTGroupVersionServiceContext
+ *
+ * @brief Service Context list info for FT_GROUP_VERSION.
+ *
+ * It specifies the most recent Object Group Version
+ */
+ struct FTGroupVersionServiceContext
+ {
+ ObjectGroupRefVersion object_group_ref_version;
+ };
+
+ /**
+ * @struct FTRequestServiceContext
+ *
+ * @brief Service Context List information for FT_REQUEST
+ */
+
+ struct FTRequestServiceContext
+ {
+ string client_id;
+ long retention_id;
+ TimeBase::TimeT expiration_time;
+ };
+
+ /// Policy type for holding a request
+ const CORBA::PolicyType REQUEST_DURATION_POLICY = 47;
+
+ /**
+ * @interface RequestDurationPolicy
+ *
+ * @brief Policy specification for Request Duration policy
+ */
+ local interface RequestDurationPolicy : CORBA::Policy
+ {
+ readonly attribute TimeBase::TimeT request_duration_policy_value;
+ };
+
+ /// Policy types for HeartBeats
+ const CORBA::PolicyType HEARTBEAT_POLICY = 48;
+
+ /**
+ * @struct HeartbeatPolicyValue
+ *
+ * @brief HeartbeatPolicy's range for the client
+ */
+ struct HeartbeatPolicyValue {
+ boolean heartbeat;
+ TimeBase::TimeT heartbeat_interval;
+ TimeBase::TimeT heartbeat_timeout;
+ };
+
+ /**
+ * @interface HeartbeatPolicy
+ *
+ * @brief Policy specification for Heartbeats on the client side
+ */
+ local interface HeartbeatPolicy : CORBA::Policy {
+ readonly attribute HeartbeatPolicyValue heartbeat_policy_value;
+ };
+
+ /// Policy type to enable heartbeating
+ const CORBA::PolicyType HEARTBEAT_ENABLED_POLICY = 49;
+
+ /**
+ * @struct TagFTHeartbeatEnabledTaggedComponent
+ *
+ * @brief Tagged components for TAG_FT_HEARTBEAT_ENABLED
+ *
+ */
+ struct TagFTHeartbeatEnabledTaggedComponent
+ {
+ boolean heartbeat_enabled;
+ };
+
+ /**
+ * @interface HeartbeatEnabledPolicy
+ *
+ * @brief Policy values for heartbeatEnabledpolicy
+ *
+ */
+ local interface HeartbeatEnabledPolicy : CORBA::Policy {
+ readonly attribute boolean heartbeat_enabled_policy_value;
+ };
+
+};
+#endif /*TAO_FT_CORBA_ORB_IDL*/
diff --git a/TAO/orbsvcs/orbsvcs/FT_FaultDetectorFactory.idl b/TAO/orbsvcs/orbsvcs/FT_FaultDetectorFactory.idl
new file mode 100644
index 00000000000..b783eb46ace
--- /dev/null
+++ b/TAO/orbsvcs/orbsvcs/FT_FaultDetectorFactory.idl
@@ -0,0 +1,119 @@
+// -*- IDL -*-
+
+//=============================================================================
+/**
+ * @file FT_FaultDetectorFactory.idl
+ *
+ * $Id$
+ *
+ * @author: Dale Wilson, OCI <wilson_d@ociweb.com>
+ */
+//=============================================================================
+
+#ifndef _FT_DETECTOR_FACTORY_IDL_
+#define _FT_DETECTOR_FACTORY_IDL_
+
+// A TAO specific addition to FT_CORBA.
+// No interface was specified for the FaultDetector
+// in the FT CORBA specification, so we decided to
+// define a GenericFactory to create FaultDetectors and
+// control the FaultDetectors through the GenericFactory
+// interface (with extenstions.)
+
+#pragma prefix "omg.org"
+
+#include "orbsvcs/FT_CORBA.idl"
+#include "orbsvcs/FT_Replica.idl"
+#include "orbsvcs/PortableGroup.idl"
+
+module FT
+{
+ ///////////////////////////////////////////////////
+ // names for properties used in Fault Tolerant CORBA
+ /// TimeBase::TimeT how often to call is_alive();
+ const string FT_FAULT_MONITORING_INTERVAL = "MonitoringInterval";
+
+ /// FT::FaultNotifier where to send fault reports
+ const string FT_NOTIFIER = "Notifier";
+
+ /// FT::PullMonitorable the object to monitor
+ const string FT_MONITORABLE = "Monitorable";
+
+ ///////////////////////////////////////////
+ // Names specified in the FT CORBA specification
+
+ const string FT_EVENT_TYPE_DOMAIN = "FT_CORBA";
+ const string FT_EVENT_TYPE_NAME = "ObjectCrashFault";
+
+ /// FT::FTDomainId domain to report to notifier
+ const string FT_DOMAIN_ID = "FTDomainId";
+
+ /// FT::Location location to report to notifier
+ const string FT_LOCATION = "Location";
+
+ /// FT::TypeId type to report to notifier
+ const string FT_TYPE_ID = "TypeId";
+
+ /// FT::ObjectGroupId group to report to notifier
+ const string FT_GROUP_ID = "GroupId";
+
+ // end of names from FT CORBA specification
+ ///////////////////////////////////////////
+
+ /////////////////////////////
+ // RoleName FaultDetectorFactory uses to register
+ // with Factory Registery
+ const string FAULT_DETECTOR_ROLE_NAME = "FT_FaultDetector";
+
+ /**
+ * A FaultDetectorFactory creates and manages a set of FaultDetectors.
+ *
+ * A FaultDetectorFactory acts as an agent for a ReplicationManager
+ * which needs to create one or more FaultDetectors at a particular
+ * location.
+ *
+ * At present, FaultDetectors monitor via the is_alive() method of
+ * the PullMonitorable interface which must be implemented by the
+ * object-to-be-monitored. Other monitoring techniques may be
+ * supported in the future. In particular heartbeat/watchdog
+ * monitoring is anticipated.
+ *
+ * Notifications of failing objects are sent to a FaultNotifier
+ * which is responsible for distributing them to interested parties.
+ *
+ * The implementation of the GenericFactory::create_object method
+ * creates a FaultDetector object to monitor a single monitorable.
+ * The FaultDetector is *not* a first-class CORBA object. The
+ * Object reference returned by create_object will be nil. You
+ * cannot interact directly with a FaultDetector.
+ * The only interaction that a FaultDetector needs after it is
+ * started is to tell it to change it's monitoring parameters,
+ * or to shut down. The change_properties () and shutdown ()
+ * methods on the Factory provide the needed capabilities.
+ *
+ * The create_object requires the following criteria:
+ * FT::Notifier Notifier
+ * FT::PullMonitorable Monitorable
+ * PortableGroup::DomainId domain_id,
+ * PortableGroup::ObjectGroupId group_id,
+ * PortableGroup::Location object_location,
+ * PortableGroup::_TypeId object_type
+ */
+ interface FaultDetectorFactory : ::PortableGroup::GenericFactory, PullMonitorable
+ {
+ /**
+ * Adjust properties on-the-fly.
+ * Applies to all FaultDetectors created by this factory.
+ * @param property_set is a set of properties that (may) have new values.
+ */
+ void change_properties(in ::PortableGroup::Properties property_set)
+ raises (::PortableGroup::InvalidProperty);
+
+ /**
+ * Ask the Fault Detector Factory to come to an orderly end.
+ */
+ oneway void shutdown();
+ };
+};
+
+#endif // for #ifndef _FT_DETECTOR_FACTORY_IDL_
diff --git a/TAO/orbsvcs/orbsvcs/FT_Notifier.idl b/TAO/orbsvcs/orbsvcs/FT_Notifier.idl
new file mode 100644
index 00000000000..bb1d839f388
--- /dev/null
+++ b/TAO/orbsvcs/orbsvcs/FT_Notifier.idl
@@ -0,0 +1,62 @@
+/* -*- IDL -*- */
+//=============================================================================
+/**
+ * @file FT_Notifier.idl
+ *
+ * $Id$
+ *
+ * This file is part of Fault Tolerant CORBA.
+ * This was original part of the OMG FT.idl file
+ *
+ * @author Dale Wilson <wilson_d@ociweb.com>
+ */
+//=============================================================================
+
+#ifndef _FT_NOTIFIER_IDL_
+#define _FT_NOTIFIER_IDL_
+
+///////////////////////////////
+// TAO specific includes
+#include "orbsvcs/FT_CORBA_ORB.idl"
+#include "orbsvcs/FT_Replica.idl"
+// end of TAO specific includes
+///////////////////////////////
+
+#include "orbsvcs/CosNaming.idl" // 98-10-19.idl
+#include "orbsvcs/CosNotification.idl" // from telecom/98-11-03.idl
+
+// added to OMG version:
+#include "orbsvcs/CosNotifyFilter.idl"
+
+#pragma prefix "omg.org"
+
+module FT
+{
+ // Specifications for Fault Management
+ // Specification of FaultNotifier Interface
+ // TAO SPECIFIC: added inheritence from PullMonitorable
+ interface FaultNotifier : ::FT::PullMonitorable
+ {
+ typedef unsigned long long ConsumerId;
+ void push_structured_fault( in CosNotification::StructuredEvent
+ event);
+ void push_sequence_fault( in CosNotification::EventBatch events);
+ CosNotifyFilter::Filter create_subscription_filter (in string
+ constraint_grammar)
+ raises (CosNotifyFilter::InvalidGrammar);
+ ConsumerId connect_structured_fault_consumer(in CosNotifyComm::StructuredPushConsumer push_consumer,
+ in CosNotifyFilter::Filter filter) ;
+
+ ConsumerId connect_sequence_fault_consumer(in
+ CosNotifyComm::SequencePushConsumer push_consumer,
+ in
+ CosNotifyFilter::Filter
+ filter);
+
+ void disconnect_consumer( in ConsumerId connection)
+ raises(CosEventComm::Disconnected);
+ };
+};
+
+
+#endif // for #ifndef _FT_NOTIFIER_IDL_
diff --git a/TAO/orbsvcs/orbsvcs/FT_Replica.idl b/TAO/orbsvcs/orbsvcs/FT_Replica.idl
new file mode 100644
index 00000000000..eb351729e6e
--- /dev/null
+++ b/TAO/orbsvcs/orbsvcs/FT_Replica.idl
@@ -0,0 +1,51 @@
+//$Id$
+// FT_replica.idl
+#ifndef _FT_REPLICA_IDL_
+#define _FT_REPLICA_IDL_
+
+// The OMG FT file has been split into sevaral pieces. This is one of them.
+// It contains the interfaces that a typical FT Replica (replicated servant)
+// will need to implement.
+
+#include "FT_CORBA.idl" // common FT definitions
+
+#pragma prefix "omg.org"
+
+module FT
+{
+ // Specification of PullMonitorable Interface
+ // which Application Objects Inherit
+ interface PullMonitorable {
+ boolean is_alive();
+ };
+
+ // Specifications for Logging and Recovery
+ typedef sequence<octet> State;
+
+ exception NoStateAvailable {};
+ exception InvalidState {};
+
+ exception NoUpdateAvailable {};
+ exception InvalidUpdate {};
+
+ // Specification of Checkpointable Interface
+ // which Updateable and Application Objects Inherit
+ interface Checkpointable {
+ State get_state()
+ raises(NoStateAvailable);
+ void set_state(in State s)
+ raises(InvalidState);
+ };
+
+ // Specification of Updateable Interface
+ // which Application Objects Inherit
+ interface Updateable : Checkpointable
+ {
+ State get_update()
+ raises(NoUpdateAvailable);
+ void set_update(in State s)
+ raises(InvalidUpdate);
+ };
+};
+
+#endif // for #ifndef _FT_REPLICA_IDL_
diff --git a/TAO/orbsvcs/orbsvcs/FT_ReplicationManager.idl b/TAO/orbsvcs/orbsvcs/FT_ReplicationManager.idl
new file mode 100644
index 00000000000..8f36d6b135a
--- /dev/null
+++ b/TAO/orbsvcs/orbsvcs/FT_ReplicationManager.idl
@@ -0,0 +1,75 @@
+/* -*- IDL -*- */
+//=============================================================================
+/**
+ * @file FT_ReplicationManager.idl
+ *
+ * $Id$
+ *
+ * This file is part of Fault Tolerant CORBA.
+ * This was original part of the OMG FT.idl file
+ *
+ * @author Curt Hibbs <hibbs_c@ociweb.com>
+ */
+//=============================================================================
+
+#ifndef _FT_REPLICATION_MANAGER_IDL_
+#define _FT_REPLICATION_MANAGER_IDL_
+
+#include "orbsvcs/PortableGroup.idl"
+#include "orbsvcs/FT_CORBA.idl"
+#include "orbsvcs/FT_Replica.idl"
+#include "orbsvcs/FT_Notifier.idl"
+
+#pragma prefix "omg.org"
+
+module FT
+{
+ exception InterfaceNotFound {};
+
+ // Specification of ReplicationManager Interface
+ interface ReplicationManager : ::PortableGroup::PropertyManager,
+ FTObjectGroupManager,
+ ::PortableGroup::GenericFactory
+ {
+
+ /**
+ * Registers the Fault Notifier with the Replication Manager.
+ * @param fault_notifier where to send the fault information.
+ */
+ void register_fault_notifier(in FaultNotifier fault_notifier);
+
+ /**
+ * Returns the reference of the Fault Notifier.
+ * @returns the reference of the Fault Notifier.
+ */
+ FaultNotifier get_fault_notifier()
+ raises (InterfaceNotFound);
+
+ /**
+ * Find a registry for factories that create fault tolerant replicas.
+ *
+ * TAO-specific operation
+ *
+ * Factories in this registry will be used by the
+ * ReplicationManager's implementation of
+ * GenericFactory::create_object when infrastructure controlled
+ * membership is specified.
+ *
+ * The factory registry may also be used by applications that
+ * control their own membership but don't wish to address the
+ * issue of finding factories for replicas.
+ *
+ * @param selection_criteria to be used to choose among alternate registries (future enhancement.)
+ * @returns an implementation of FactoryRegistry
+ */
+ ::PortableGroup::FactoryRegistry get_factory_registry (in ::PortableGroup::Criteria selection_criteria);
+
+ /**
+ * TAO-specific shutdown operation.
+ */
+ oneway void shutdown ();
+ };
+};
+
+
+#endif // _FT_REPLICATION_MANAGER_IDL_
diff --git a/TAO/orbsvcs/orbsvcs/FaultTolerance.mpc b/TAO/orbsvcs/orbsvcs/FaultTolerance.mpc
new file mode 100644
index 00000000000..0b6911d2473
--- /dev/null
+++ b/TAO/orbsvcs/orbsvcs/FaultTolerance.mpc
@@ -0,0 +1,43 @@
+// -*- MPC -*-
+// $Id$
+
+project(FaultTolerance): orbsvcslib, core, pi, pi_server, notification, ftorb, portablegroup, minimum_corba, tao_versioning_idl_defaults {
+ sharedname = TAO_FaultTolerance
+ idlflags += -Wb,export_macro=TAO_FT_Export -Wb,export_include=orbsvcs/FaultTolerance/fault_tol_export.h -Wb,skel_export_include=tao/PortableServer/PolicyS.h
+ dynamicflags = TAO_FT_BUILD_DLL
+ tagchecks += FaultTolerance
+
+ IDL_Files {
+ FT_CORBA.idl
+ FT_Replica.idl
+ FT_Notifier.idl
+ FT_FaultDetectorFactory.idl
+ FT_ReplicationManager.idl
+ }
+
+ Source_Files(ORBSVCS_COMPONENTS) {
+ FaultTolerance {
+ FT_CORBAS.cpp
+ FT_CORBAC.cpp
+ FT_ReplicaS.cpp
+ FT_ReplicaC.cpp
+ FT_NotifierS.cpp
+ FT_NotifierC.cpp
+ FT_FaultDetectorFactoryS.cpp
+ FT_FaultDetectorFactoryC.cpp
+ FT_ReplicationManagerS.cpp
+ FT_ReplicationManagerC.cpp
+ }
+ }
+
+ Header_Files {
+ FaultTolerance/fault_tol_export.h
+ }
+
+ Template_Files {
+ }
+
+ Pkgconfig_Files {
+ TAO_FaultTolerance.pc.in
+ }
+}
diff --git a/TAO/orbsvcs/orbsvcs/FaultTolerance.rc b/TAO/orbsvcs/orbsvcs/FaultTolerance.rc
new file mode 100644
index 00000000000..afd9bd8826b
--- /dev/null
+++ b/TAO/orbsvcs/orbsvcs/FaultTolerance.rc
@@ -0,0 +1,30 @@
+#include "..\..\tao\Version.h"
+
+1 VERSIONINFO
+ FILEVERSION TAO_MAJOR_VERSION,TAO_MINOR_VERSION,TAO_BETA_VERSION,0
+ PRODUCTVERSION TAO_MAJOR_VERSION,TAO_MINOR_VERSION,TAO_BETA_VERSION,0
+ FILEFLAGSMASK 0x3fL
+ FILEFLAGS 0x0L
+ FILEOS 0x4L
+ FILETYPE 0x1L
+ FILESUBTYPE 0x0L
+BEGIN
+ BLOCK "StringFileInfo"
+ BEGIN
+ BLOCK "040904B0"
+ BEGIN
+ VALUE "FileDescription", "FaultTolerance\0"
+ VALUE "FileVersion", TAO_VERSION "\0"
+ VALUE "InternalName", "TAO_FaultToleranceDLL\0"
+ VALUE "LegalCopyright", "\0"
+ VALUE "LegalTrademarks", "\0"
+ VALUE "OriginalFilename", "TAO_FaultTolerance.DLL\0"
+ VALUE "ProductName", "ORBSVCS\0"
+ VALUE "ProductVersion", TAO_VERSION "\0"
+ END
+ END
+ BLOCK "VarFileInfo"
+ BEGIN
+ VALUE "Translation", 0x409, 1200
+ END
+END
diff --git a/TAO/orbsvcs/orbsvcs/FaultTolerance/FT_ClientORBInitializer.cpp b/TAO/orbsvcs/orbsvcs/FaultTolerance/FT_ClientORBInitializer.cpp
new file mode 100644
index 00000000000..03d6f4a56b6
--- /dev/null
+++ b/TAO/orbsvcs/orbsvcs/FaultTolerance/FT_ClientORBInitializer.cpp
@@ -0,0 +1,115 @@
+// $Id$
+
+#include "orbsvcs/FaultTolerance/FT_ClientORBInitializer.h"
+#include "orbsvcs/FaultTolerance/FT_ClientPolicyFactory.h"
+#include "orbsvcs/FaultTolerance/FT_ClientRequest_Interceptor.h"
+#include "orbsvcs/FT_CORBA_ORBC.h"
+#include "tao/Exception.h"
+#include "tao/ORB_Constants.h"
+
+ACE_RCSID (FaultTolerance,
+ FT_ClientORBInitializer,
+ "$Id$")
+
+TAO_BEGIN_VERSIONED_NAMESPACE_DECL
+
+void
+TAO_FT_ClientORBInitializer::pre_init (
+ PortableInterceptor::ORBInitInfo_ptr
+ ACE_ENV_ARG_DECL_NOT_USED)
+ ACE_THROW_SPEC ((CORBA::SystemException))
+{
+}
+
+void
+TAO_FT_ClientORBInitializer::post_init (
+ PortableInterceptor::ORBInitInfo_ptr info
+ ACE_ENV_ARG_DECL)
+ ACE_THROW_SPEC ((CORBA::SystemException))
+{
+ this->register_policy_factories (info
+ ACE_ENV_ARG_PARAMETER);
+ ACE_CHECK;
+
+
+ this->register_client_request_interceptors (info
+ ACE_ENV_ARG_PARAMETER);
+ ACE_CHECK;
+
+
+
+}
+
+void
+TAO_FT_ClientORBInitializer::register_policy_factories (
+ PortableInterceptor::ORBInitInfo_ptr info
+ ACE_ENV_ARG_DECL)
+ ACE_THROW_SPEC ((CORBA::SystemException))
+{
+ // Register the FTCORBA policy factories.
+
+ PortableInterceptor::PolicyFactory_ptr temp_factory =
+ PortableInterceptor::PolicyFactory::_nil ();
+ PortableInterceptor::PolicyFactory_var policy_factory;
+
+ // This policy factory is used for all FTCORBA related policies.
+
+ ACE_NEW_THROW_EX (temp_factory,
+ TAO_FT_ClientPolicyFactory,
+ CORBA::NO_MEMORY (
+ CORBA::SystemException::_tao_minor_code (
+ TAO::VMCID,
+ ENOMEM),
+ CORBA::COMPLETED_NO));
+ ACE_CHECK;
+
+ policy_factory = temp_factory;
+
+ // Bind the same policy factory to all RTCORBA related policy
+ // types since a single policy factory is used to create each of
+ // the different types of RTCORBA policies.
+
+ CORBA::PolicyType type = FT::REQUEST_DURATION_POLICY;
+ info->register_policy_factory (type,
+ policy_factory.in ()
+ ACE_ENV_ARG_PARAMETER);
+ ACE_CHECK;
+
+ type = FT::HEARTBEAT_POLICY;
+ info->register_policy_factory (type,
+ policy_factory.in ()
+ ACE_ENV_ARG_PARAMETER);
+ ACE_CHECK;
+
+ /*
+ type = FT::HEARTBEAT_ENABLED_POLICY;
+ info->register_policy_factory (type,
+ policy_factory.in ()
+ ACE_ENV_ARG_PARAMETER);
+ ACE_CHECK;
+ */
+}
+
+
+void
+TAO_FT_ClientORBInitializer::register_client_request_interceptors (
+ PortableInterceptor::ORBInitInfo_ptr info
+ ACE_ENV_ARG_DECL)
+ ACE_THROW_SPEC ((CORBA::SystemException))
+{
+ PortableInterceptor::ClientRequestInterceptor_ptr cri =
+ PortableInterceptor::ClientRequestInterceptor::_nil ();
+
+ ACE_NEW_THROW_EX (cri,
+ TAO::FT_ClientRequest_Interceptor,
+ CORBA::NO_MEMORY ());
+
+ PortableInterceptor::ClientRequestInterceptor_var
+ client_interceptor = cri;
+
+ info->add_client_request_interceptor (client_interceptor.in ()
+ ACE_ENV_ARG_PARAMETER);
+ ACE_CHECK;
+}
+
+TAO_END_VERSIONED_NAMESPACE_DECL
diff --git a/TAO/orbsvcs/orbsvcs/FaultTolerance/FT_ClientORBInitializer.h b/TAO/orbsvcs/orbsvcs/FaultTolerance/FT_ClientORBInitializer.h
new file mode 100755
index 00000000000..c0383c99cbc
--- /dev/null
+++ b/TAO/orbsvcs/orbsvcs/FaultTolerance/FT_ClientORBInitializer.h
@@ -0,0 +1,73 @@
+// -*- C++ -*-
+
+//=============================================================================
+/**
+ * @file FT_ClientORBInitializer.h
+ *
+ * $Id$
+ *
+ * @author Balachandran Natarajan <bala@cs.wustl.edu>
+ */
+//=============================================================================
+#ifndef TAO_FT_CLIENTORB_INITIALIZER_H
+#define TAO_FT_CLIENTORB_INITIALIZER_H
+
+#include /**/ "ace/pre.h"
+
+#include "tao/PI/PI.h"
+
+#if !defined (ACE_LACKS_PRAGMA_ONCE)
+# pragma once
+#endif /* ACE_LACKS_PRAGMA_ONCE */
+
+#include "tao/LocalObject.h"
+#include "orbsvcs/FaultTolerance/FT_ClientORB_export.h"
+
+// This is to remove "inherits via dominance" warnings from MSVC.
+// MSVC is being a little too paranoid.
+#if defined(_MSC_VER)
+#pragma warning(push)
+#pragma warning(disable:4250)
+#endif /* _MSC_VER */
+
+TAO_BEGIN_VERSIONED_NAMESPACE_DECL
+
+/// FT ORB initializer.
+class TAO_FT_ClientORBInitializer
+ : public virtual PortableInterceptor::ORBInitializer
+ , public virtual TAO_Local_RefCounted_Object
+{
+public:
+
+ virtual void pre_init (PortableInterceptor::ORBInitInfo_ptr info
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS)
+ ACE_THROW_SPEC ((CORBA::SystemException));
+
+ virtual void post_init (PortableInterceptor::ORBInitInfo_ptr info
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS)
+ ACE_THROW_SPEC ((CORBA::SystemException));
+
+private:
+
+ /// Register FTCORBA policy factories.
+ void register_policy_factories (
+ PortableInterceptor::ORBInitInfo_ptr info
+ ACE_ENV_ARG_DECL)
+ ACE_THROW_SPEC ((CORBA::SystemException));
+
+ /// Register the necessary interceptors.
+ void register_client_request_interceptors (
+ PortableInterceptor::ORBInitInfo_ptr info
+ ACE_ENV_ARG_DECL)
+ ACE_THROW_SPEC ((CORBA::SystemException));
+};
+
+TAO_END_VERSIONED_NAMESPACE_DECL
+
+#if defined(_MSC_VER)
+#pragma warning(pop)
+#endif /* _MSC_VER */
+
+#include /**/ "ace/post.h"
+
+#endif /* TAO_FT_ORB_INITIALIZER_H */
diff --git a/TAO/orbsvcs/orbsvcs/FaultTolerance/FT_ClientORB_export.h b/TAO/orbsvcs/orbsvcs/FaultTolerance/FT_ClientORB_export.h
new file mode 100644
index 00000000000..37769e226ad
--- /dev/null
+++ b/TAO/orbsvcs/orbsvcs/FaultTolerance/FT_ClientORB_export.h
@@ -0,0 +1,60 @@
+
+// -*- C++ -*-
+// $Id$
+// Definition for Win32 Export directives.
+// This file is generated automatically by generate_export_file.pl TAO_FT_ClientORB
+// ------------------------------
+#ifndef TAO_FT_CLIENTORB_EXPORT_H
+#define TAO_FT_CLIENTORB_EXPORT_H
+
+#include "ace/config-all.h"
+
+#if defined (TAO_AS_STATIC_LIBS)
+# if !defined (TAO_FT_CLIENTORB_HAS_DLL)
+# define TAO_FT_CLIENTORB_HAS_DLL 0
+# endif /* ! TAO_FT_CLIENTORB_HAS_DLL */
+#else
+# if !defined (TAO_FT_CLIENTORB_HAS_DLL)
+# define TAO_FT_CLIENTORB_HAS_DLL 1
+# endif /* ! TAO_FT_CLIENTORB_HAS_DLL */
+#endif
+
+#if defined (TAO_FT_CLIENTORB_HAS_DLL) && (TAO_FT_CLIENTORB_HAS_DLL == 1)
+# if defined (TAO_FT_CLIENTORB_BUILD_DLL)
+# define TAO_FT_ClientORB_Export ACE_Proper_Export_Flag
+# define TAO_FT_CLIENTORB_SINGLETON_DECLARATION(T) ACE_EXPORT_SINGLETON_DECLARATION (T)
+# define TAO_FT_CLIENTORB_SINGLETON_DECLARE(SINGLETON_TYPE, CLASS, LOCK) ACE_EXPORT_SINGLETON_DECLARE(SINGLETON_TYPE, CLASS, LOCK)
+# else /* TAO_FT_CLIENTORB_BUILD_DLL */
+# define TAO_FT_ClientORB_Export ACE_Proper_Import_Flag
+# define TAO_FT_CLIENTORB_SINGLETON_DECLARATION(T) ACE_IMPORT_SINGLETON_DECLARATION (T)
+# define TAO_FT_CLIENTORB_SINGLETON_DECLARE(SINGLETON_TYPE, CLASS, LOCK) ACE_IMPORT_SINGLETON_DECLARE(SINGLETON_TYPE, CLASS, LOCK)
+# endif /* TAO_FT_CLIENTORB_BUILD_DLL */
+#else /* TAO_FT_CLIENTORB_HAS_DLL == 1 */
+# define TAO_FT_ClientORB_Export
+# define TAO_FT_CLIENTORB_SINGLETON_DECLARATION(T)
+# define TAO_FT_CLIENTORB_SINGLETON_DECLARE(SINGLETON_TYPE, CLASS, LOCK)
+#endif /* TAO_FT_CLIENTORB_HAS_DLL == 1 */
+
+// Set TAO_FT_CLIENTORB_NTRACE = 0 to turn on library specific tracing even if
+// tracing is turned off for ACE.
+#if !defined (TAO_FT_CLIENTORB_NTRACE)
+# if (ACE_NTRACE == 1)
+# define TAO_FT_CLIENTORB_NTRACE 1
+# else /* (ACE_NTRACE == 1) */
+# define TAO_FT_CLIENTORB_NTRACE 0
+# endif /* (ACE_NTRACE == 1) */
+#endif /* !TAO_FT_CLIENTORB_NTRACE */
+
+#if (TAO_FT_CLIENTORB_NTRACE == 1)
+# define TAO_FT_CLIENTORB_TRACE(X)
+#else /* (TAO_FT_CLIENTORB_NTRACE == 1) */
+# if !defined (ACE_HAS_TRACE)
+# define ACE_HAS_TRACE
+# endif /* ACE_HAS_TRACE */
+# define TAO_FT_CLIENTORB_TRACE(X) ACE_TRACE_IMPL(X)
+# include "ace/Trace.h"
+#endif /* (TAO_FT_CLIENTORB_NTRACE == 1) */
+
+#endif /* TAO_FT_CLIENTORB_EXPORT_H */
+
+// End of auto generated file.
diff --git a/TAO/orbsvcs/orbsvcs/FaultTolerance/FT_ClientPolicyFactory.cpp b/TAO/orbsvcs/orbsvcs/FaultTolerance/FT_ClientPolicyFactory.cpp
new file mode 100755
index 00000000000..852e1c2c97b
--- /dev/null
+++ b/TAO/orbsvcs/orbsvcs/FaultTolerance/FT_ClientPolicyFactory.cpp
@@ -0,0 +1,34 @@
+// $Id$
+
+#include "orbsvcs/FaultTolerance/FT_ClientPolicyFactory.h"
+#include "orbsvcs/FaultTolerance/FT_ClientPolicy_i.h"
+#include "orbsvcs/FT_CORBA_ORBC.h"
+#include "tao/PolicyC.h"
+
+ACE_RCSID (FaultTolerance,
+ FT_ClientPolicyFactory,
+ "$Id$")
+
+TAO_BEGIN_VERSIONED_NAMESPACE_DECL
+
+CORBA::Policy_ptr
+TAO_FT_ClientPolicyFactory::create_policy (
+ CORBA::PolicyType type,
+ const CORBA::Any &val
+ ACE_ENV_ARG_DECL)
+ ACE_THROW_SPEC ((CORBA::SystemException,
+ CORBA::PolicyError))
+{
+
+ if (type == FT::REQUEST_DURATION_POLICY)
+ return TAO_FT_Request_Duration_Policy::create (val
+ ACE_ENV_ARG_PARAMETER);
+ else if (type == FT::HEARTBEAT_POLICY)
+ return TAO_FT_Heart_Beat_Policy::create (val
+ ACE_ENV_ARG_PARAMETER);
+
+ ACE_THROW_RETURN (CORBA::PolicyError (CORBA::BAD_POLICY_TYPE),
+ CORBA::Policy::_nil ());
+}
+
+TAO_END_VERSIONED_NAMESPACE_DECL
diff --git a/TAO/orbsvcs/orbsvcs/FaultTolerance/FT_ClientPolicyFactory.h b/TAO/orbsvcs/orbsvcs/FaultTolerance/FT_ClientPolicyFactory.h
new file mode 100755
index 00000000000..7ee620338b9
--- /dev/null
+++ b/TAO/orbsvcs/orbsvcs/FaultTolerance/FT_ClientPolicyFactory.h
@@ -0,0 +1,61 @@
+// -*- C++ -*-
+
+//=============================================================================
+/**
+ * @file FT_ClientPolicyFactory.h
+ *
+ * $Id$
+ *
+ * @author Bala Natarajan <bala@cs.wustl.edu>
+ */
+//=============================================================================
+
+
+#ifndef TAO_FT_CLIENTPOLICY_FACTORY_H
+#define TAO_FT_CLIENTPOLICY_FACTORY_H
+
+#include /**/ "ace/pre.h"
+
+#include "tao/PI/PI.h"
+
+#if !defined (ACE_LACKS_PRAGMA_ONCE)
+# pragma once
+#endif /* ACE_LACKS_PRAGMA_ONCE */
+
+#include "tao/LocalObject.h"
+
+// This is to remove "inherits via dominance" warnings from MSVC.
+// MSVC is being a little too paranoid.
+#if defined(_MSC_VER)
+#pragma warning(push)
+#pragma warning(disable:4250)
+#endif /* _MSC_VER */
+
+#include "orbsvcs/FaultTolerance/FT_ClientORB_export.h"
+
+TAO_BEGIN_VERSIONED_NAMESPACE_DECL
+
+/// Policy factory for all FTCORBA related policies.
+class TAO_FT_ClientPolicyFactory
+ : public PortableInterceptor::PolicyFactory
+ , public TAO_Local_RefCounted_Object
+{
+public:
+
+ virtual CORBA::Policy_ptr create_policy (CORBA::PolicyType type,
+ const CORBA::Any &value
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS)
+ ACE_THROW_SPEC ((CORBA::SystemException,
+ CORBA::PolicyError));
+};
+
+TAO_END_VERSIONED_NAMESPACE_DECL
+
+#if defined(_MSC_VER)
+#pragma warning(pop)
+#endif /* _MSC_VER */
+
+
+#include /**/ "ace/post.h"
+
+#endif /* TAO_FT_CLIENTPOLICY_FACTORY_H */
diff --git a/TAO/orbsvcs/orbsvcs/FaultTolerance/FT_ClientPolicy_i.cpp b/TAO/orbsvcs/orbsvcs/FaultTolerance/FT_ClientPolicy_i.cpp
new file mode 100755
index 00000000000..b53265cbfa5
--- /dev/null
+++ b/TAO/orbsvcs/orbsvcs/FaultTolerance/FT_ClientPolicy_i.cpp
@@ -0,0 +1,193 @@
+//$Id$
+#include "orbsvcs/FaultTolerance/FT_ClientPolicy_i.h"
+
+#include "tao/debug.h"
+#include "ace/Log_Msg.h"
+#include "tao/ORB_Constants.h"
+#include "tao/AnyTypeCode/Any.h"
+
+#if !defined (__ACE_INLINE__)
+#include "orbsvcs/FaultTolerance/FT_ClientPolicy_i.inl"
+#endif /* __ACE_INLINE__ */
+
+ACE_RCSID(FaultTolerance, FT_ClientPolicy_i, "$Id$")
+
+TAO_BEGIN_VERSIONED_NAMESPACE_DECL
+
+TimeBase::TimeT
+TAO_FT_Request_Duration_Policy::request_duration_policy_value (ACE_ENV_SINGLE_ARG_DECL_NOT_USED)
+ ACE_THROW_SPEC ((CORBA::SystemException))
+{
+ return this->request_duration_;
+}
+
+CORBA::PolicyType
+TAO_FT_Request_Duration_Policy::policy_type (ACE_ENV_SINGLE_ARG_DECL_NOT_USED)
+ ACE_THROW_SPEC ((CORBA::SystemException))
+{
+ return FT::REQUEST_DURATION_POLICY;
+}
+
+CORBA::Policy_ptr
+TAO_FT_Request_Duration_Policy::create (const CORBA::Any& val
+ ACE_ENV_ARG_DECL)
+{
+ TimeBase::TimeT value;
+ if ((val >>= value) == 0)
+ ACE_THROW_RETURN (CORBA::PolicyError (CORBA::BAD_POLICY_VALUE),
+ CORBA::Policy::_nil ());
+
+ TAO_FT_Request_Duration_Policy *tmp = 0;
+ ACE_NEW_THROW_EX (tmp,
+ TAO_FT_Request_Duration_Policy (value),
+ CORBA::NO_MEMORY (TAO::VMCID,
+ CORBA::COMPLETED_NO));
+ ACE_CHECK_RETURN (CORBA::Policy::_nil ());
+
+ return tmp;
+}
+
+TAO_FT_Request_Duration_Policy *
+TAO_FT_Request_Duration_Policy::clone (void) const
+{
+ TAO_FT_Request_Duration_Policy *copy = 0;
+ ACE_NEW_RETURN (copy,
+ TAO_FT_Request_Duration_Policy (*this),
+ 0);
+ return copy;
+}
+
+CORBA::Policy_ptr
+TAO_FT_Request_Duration_Policy::copy (ACE_ENV_SINGLE_ARG_DECL)
+ ACE_THROW_SPEC ((CORBA::SystemException))
+{
+ TAO_FT_Request_Duration_Policy* tmp = 0;
+ ACE_NEW_THROW_EX (tmp, TAO_FT_Request_Duration_Policy (*this),
+ CORBA::NO_MEMORY (TAO::VMCID,
+ CORBA::COMPLETED_NO));
+ ACE_CHECK_RETURN (CORBA::Policy::_nil ());
+
+ return tmp;
+}
+
+void
+TAO_FT_Request_Duration_Policy::destroy (ACE_ENV_SINGLE_ARG_DECL_NOT_USED)
+ ACE_THROW_SPEC ((CORBA::SystemException))
+{
+}
+
+void
+TAO_FT_Request_Duration_Policy::set_time_value (ACE_Time_Value &time_value)
+{
+ TimeBase::TimeT t = this->request_duration_;
+ TimeBase::TimeT seconds = t / 10000000u;
+ TimeBase::TimeT microseconds = (t % 10000000u) / 10;
+ time_value.set (ACE_U64_TO_U32 (seconds),
+ ACE_U64_TO_U32 (microseconds));
+
+ if (TAO_debug_level > 0)
+ {
+ CORBA::ULong msecs =
+ static_cast<CORBA::ULong> (microseconds / 1000);
+ ACE_DEBUG ((LM_DEBUG,
+ ACE_TEXT ("TAO_FT (%P|%t) - Timeout is <%u>\n"),
+ msecs));
+ }
+}
+
+
+/*****************************************************************/
+
+FT::HeartbeatPolicyValue
+TAO_FT_Heart_Beat_Policy::heartbeat_policy_value (ACE_ENV_SINGLE_ARG_DECL_NOT_USED)
+ ACE_THROW_SPEC ((CORBA::SystemException))
+{
+ FT::HeartbeatPolicyValue val;
+ val.heartbeat = this->heartbeat_;
+ val.heartbeat_interval = this->heartbeat_interval_;
+ val.heartbeat_timeout = this->heartbeat_timeout_;
+
+ return val;
+}
+
+
+CORBA::Policy_ptr
+TAO_FT_Heart_Beat_Policy::create (const CORBA::Any& val
+ ACE_ENV_ARG_DECL)
+{
+ FT::HeartbeatPolicyValue *value = 0;
+ if ((val >>= value) == 0)
+ ACE_THROW_RETURN (CORBA::PolicyError (CORBA::BAD_POLICY_VALUE),
+ CORBA::Policy::_nil ());
+
+ TAO_FT_Heart_Beat_Policy *tmp = 0;
+ ACE_NEW_THROW_EX (tmp,
+ TAO_FT_Heart_Beat_Policy (value->heartbeat,
+ value->heartbeat_interval,
+ value->heartbeat_timeout),
+ CORBA::NO_MEMORY (TAO::VMCID,
+ CORBA::COMPLETED_NO));
+ ACE_CHECK_RETURN (CORBA::Policy::_nil ());
+
+ return tmp;
+}
+
+
+CORBA::PolicyType
+TAO_FT_Heart_Beat_Policy::policy_type (ACE_ENV_SINGLE_ARG_DECL_NOT_USED)
+ ACE_THROW_SPEC ((CORBA::SystemException))
+{
+ return FT::HEARTBEAT_POLICY;
+}
+
+
+CORBA::Policy_ptr
+TAO_FT_Heart_Beat_Policy::copy (ACE_ENV_SINGLE_ARG_DECL)
+ ACE_THROW_SPEC ((CORBA::SystemException))
+{
+ TAO_FT_Heart_Beat_Policy * tmp = 0;
+ ACE_NEW_THROW_EX (tmp, TAO_FT_Heart_Beat_Policy (*this),
+ CORBA::NO_MEMORY (TAO::VMCID,
+ CORBA::COMPLETED_NO));
+ ACE_CHECK_RETURN (CORBA::Policy::_nil ());
+
+ return tmp;
+}
+
+TAO_FT_Heart_Beat_Policy *
+TAO_FT_Heart_Beat_Policy::clone (void) const
+{
+ TAO_FT_Heart_Beat_Policy *copy = 0;
+ ACE_NEW_RETURN (copy,
+ TAO_FT_Heart_Beat_Policy (*this),
+ 0);
+ return copy;
+}
+
+void
+TAO_FT_Heart_Beat_Policy::destroy (ACE_ENV_SINGLE_ARG_DECL_NOT_USED)
+ ACE_THROW_SPEC ((CORBA::SystemException))
+{
+}
+
+void
+TAO_FT_Heart_Beat_Policy::set_time_value (ACE_Time_Value &time_value,
+ const TimeBase::TimeT &timebase)
+{
+ TimeBase::TimeT t = timebase;
+ TimeBase::TimeT seconds = t / 10000000u;
+ TimeBase::TimeT microseconds = (t % 10000000u) / 10;
+ time_value.set (ACE_U64_TO_U32 (seconds),
+ ACE_U64_TO_U32 (microseconds));
+
+ if (TAO_debug_level > 0)
+ {
+ CORBA::ULong msecs =
+ static_cast<CORBA::ULong> (microseconds / 1000);
+ ACE_DEBUG ((LM_DEBUG,
+ ACE_TEXT ("TAO_FT (%P|%t) - Timeout is <%u>\n"),
+ msecs));
+ }
+}
+
+TAO_END_VERSIONED_NAMESPACE_DECL
diff --git a/TAO/orbsvcs/orbsvcs/FaultTolerance/FT_ClientPolicy_i.h b/TAO/orbsvcs/orbsvcs/FaultTolerance/FT_ClientPolicy_i.h
new file mode 100755
index 00000000000..a1bbf81174e
--- /dev/null
+++ b/TAO/orbsvcs/orbsvcs/FaultTolerance/FT_ClientPolicy_i.h
@@ -0,0 +1,165 @@
+// -*- C++ -*-
+
+//=============================================================================
+/**
+ * @file FT_ClientPolicy_i.h
+ *
+ * $Id$
+ *
+ * @author Balachandran Natarajan <bala@cs.wustl.edu>
+ */
+//=============================================================================
+
+
+#ifndef TAO_FT_CLIENTPOLICY_I_H
+#define TAO_FT_CLIENTPOLICY_I_H
+#include /**/ "ace/pre.h"
+
+#include "orbsvcs/FT_CORBA_ORBC.h"
+
+#if defined(_MSC_VER)
+#pragma warning(push)
+#pragma warning(disable:4250)
+#endif /* _MSC_VER */
+
+#include "tao/LocalObject.h"
+#include "orbsvcs/FaultTolerance/FT_ClientORB_export.h"
+
+TAO_BEGIN_VERSIONED_NAMESPACE_DECL
+
+/**
+ * @class TAO_FT_Request_Duration_Policy
+ *
+ * @brief FT::RequestDurationPolicy implementation
+ *
+ * This policy controls the request duration in the ORB. The
+ * semantics are like this. On the server side, the server should
+ * retain the details of the request from the client (and the
+ * reply sent to it too) atleast for the time period specified by
+ * this policy value. On the client side, the client uses this
+ * value to calculate the expiration_id in the RequestService
+ * context. The expiration_id is a sort of timeout for the client
+ * to keep trying to connect to server object groups under certain
+ * conditions.
+ */
+class TAO_FT_Request_Duration_Policy
+ : public FT::RequestDurationPolicy,
+ public TAO_Local_RefCounted_Object
+{
+public:
+
+ /// Constructor.
+ TAO_FT_Request_Duration_Policy (const TimeBase::TimeT& relative_expiry);
+
+ /// Copy constructor.
+ TAO_FT_Request_Duration_Policy (const TAO_FT_Request_Duration_Policy &rhs);
+
+ /// Helper method for the implementation of
+ /// CORBA::ORB::create_policy.
+ static CORBA::Policy_ptr create (const CORBA::Any& val
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS);
+
+ /// Returns a copy of <this>.
+ virtual TAO_FT_Request_Duration_Policy *clone (void) const;
+
+ // = The FT::RequestDurationPolicy methods
+ virtual TimeBase::TimeT request_duration_policy_value (ACE_ENV_SINGLE_ARG_DECL)
+ ACE_THROW_SPEC ((CORBA::SystemException));
+
+ virtual CORBA::PolicyType policy_type (
+ ACE_ENV_SINGLE_ARG_DECL_WITH_DEFAULTS)
+ ACE_THROW_SPEC ((CORBA::SystemException));
+
+ virtual CORBA::Policy_ptr copy (
+ ACE_ENV_SINGLE_ARG_DECL_WITH_DEFAULTS)
+ ACE_THROW_SPEC ((CORBA::SystemException));
+
+ virtual void destroy (
+ ACE_ENV_SINGLE_ARG_DECL_WITH_DEFAULTS)
+ ACE_THROW_SPEC ((CORBA::SystemException));
+
+ /// Change the CORBA representation to the ACE representation.
+ void set_time_value (ACE_Time_Value &time_value);
+
+private:
+ /// The attribute
+ TimeBase::TimeT request_duration_;
+};
+
+
+/**
+ * @class TAO_FT_Heart_Beat_Policy
+ *
+ * @brief FT::HeartBeatPolicy
+ *
+ * If this policy is set, it enables the client ORB to send
+ * heartbeats to the server ORB over the open connections.
+ */
+class TAO_FT_Heart_Beat_Policy
+ : public FT::HeartbeatPolicy,
+ public TAO_Local_RefCounted_Object
+{
+public:
+
+ /// Constructor.
+ TAO_FT_Heart_Beat_Policy (const CORBA::Boolean boolean,
+ const TimeBase::TimeT &interval,
+ const TimeBase::TimeT &timeout);
+
+ /// Copy constructor.
+ TAO_FT_Heart_Beat_Policy (const TAO_FT_Heart_Beat_Policy &rhs);
+
+ /// Helper method for the implementation of
+ /// CORBA::ORB::create_policy.
+ static CORBA::Policy_ptr create (const CORBA::Any& val
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS);
+
+ /// Returns a copy of <this>.
+ virtual TAO_FT_Heart_Beat_Policy *clone (void) const;
+
+ // = The FT::HeartBeatPolicy methods
+ virtual FT::HeartbeatPolicyValue heartbeat_policy_value (ACE_ENV_SINGLE_ARG_DECL)
+ ACE_THROW_SPEC ((CORBA::SystemException));
+
+ virtual CORBA::PolicyType policy_type (
+ ACE_ENV_SINGLE_ARG_DECL_WITH_DEFAULTS)
+ ACE_THROW_SPEC ((CORBA::SystemException));
+
+ virtual CORBA::Policy_ptr copy (
+ ACE_ENV_SINGLE_ARG_DECL_WITH_DEFAULTS)
+ ACE_THROW_SPEC ((CORBA::SystemException));
+
+ virtual void destroy (
+ ACE_ENV_SINGLE_ARG_DECL_WITH_DEFAULTS)
+ ACE_THROW_SPEC ((CORBA::SystemException));
+
+ /// Change the CORBA representation to the ACE representation.
+ void set_time_value (ACE_Time_Value &time_value,
+ const TimeBase::TimeT &timebase);
+
+private:
+
+ // The attributes
+ /// <heartbeat_> indicates whether heartbeating is enabled or not.
+ CORBA::Boolean heartbeat_;
+
+ /// Intervals in which heartbeat messages need to be sent
+ TimeBase::TimeT heartbeat_interval_;
+
+ /// The timeouts for the heartbeats
+ TimeBase::TimeT heartbeat_timeout_;
+};
+
+TAO_END_VERSIONED_NAMESPACE_DECL
+
+#if defined(_MSC_VER)
+#pragma warning(pop)
+#endif /* _MSC_VER */
+
+#if defined (__ACE_INLINE__)
+#include "orbsvcs/FaultTolerance/FT_ClientPolicy_i.inl"
+#endif /* __ACE_INLINE__ */
+
+
+#include /**/ "ace/post.h"
+#endif /* TAO_FT_CLIENTPOLICY_I_H */
diff --git a/TAO/orbsvcs/orbsvcs/FaultTolerance/FT_ClientPolicy_i.inl b/TAO/orbsvcs/orbsvcs/FaultTolerance/FT_ClientPolicy_i.inl
new file mode 100755
index 00000000000..637356ff8ec
--- /dev/null
+++ b/TAO/orbsvcs/orbsvcs/FaultTolerance/FT_ClientPolicy_i.inl
@@ -0,0 +1,55 @@
+// -*- C++ -*-
+//
+//$Id$
+
+TAO_BEGIN_VERSIONED_NAMESPACE_DECL
+
+ACE_INLINE
+TAO_FT_Request_Duration_Policy::TAO_FT_Request_Duration_Policy (
+ const TimeBase::TimeT &duration
+ )
+ : request_duration_ (duration)
+{
+}
+
+ACE_INLINE
+TAO_FT_Request_Duration_Policy::TAO_FT_Request_Duration_Policy (
+ const TAO_FT_Request_Duration_Policy &rhs
+ )
+ : CORBA::Object (),
+ CORBA::Policy (),
+ CORBA::LocalObject (),
+ FT::RequestDurationPolicy (),
+ TAO_Local_RefCounted_Object (),
+ request_duration_ (rhs.request_duration_)
+{
+}
+
+ACE_INLINE
+TAO_FT_Heart_Beat_Policy::TAO_FT_Heart_Beat_Policy (
+ const CORBA::Boolean heartbeat,
+ const TimeBase::TimeT &interval,
+ const TimeBase::TimeT &timeout
+ )
+ : heartbeat_ (heartbeat),
+ heartbeat_interval_ (interval),
+ heartbeat_timeout_ (timeout)
+{
+}
+
+ACE_INLINE
+TAO_FT_Heart_Beat_Policy::TAO_FT_Heart_Beat_Policy (
+ const TAO_FT_Heart_Beat_Policy &rhs
+ )
+ : CORBA::Object (),
+ CORBA::Policy (),
+ CORBA::LocalObject (),
+ FT::HeartbeatPolicy (),
+ TAO_Local_RefCounted_Object (),
+ heartbeat_ (rhs.heartbeat_),
+ heartbeat_interval_ (rhs.heartbeat_interval_),
+ heartbeat_timeout_ (rhs.heartbeat_timeout_)
+{
+}
+
+TAO_END_VERSIONED_NAMESPACE_DECL
diff --git a/TAO/orbsvcs/orbsvcs/FaultTolerance/FT_ClientRequest_Interceptor.cpp b/TAO/orbsvcs/orbsvcs/FaultTolerance/FT_ClientRequest_Interceptor.cpp
new file mode 100644
index 00000000000..ad331580af6
--- /dev/null
+++ b/TAO/orbsvcs/orbsvcs/FaultTolerance/FT_ClientRequest_Interceptor.cpp
@@ -0,0 +1,441 @@
+// $Id$
+
+#include "orbsvcs/FaultTolerance/FT_ClientRequest_Interceptor.h"
+#include "orbsvcs/FaultTolerance/FT_Service_Callbacks.h"
+#include "orbsvcs/FT_CORBA_ORBC.h"
+
+#include "tao/CORBA_String.h"
+#include "tao/debug.h"
+#include "tao/ORB_Constants.h"
+#include "tao/CDR.h"
+#include "tao/PI/ClientRequestInfo.h"
+
+#include "ace/UUID.h"
+#include "ace/Lock_Adapter_T.h"
+#include "ace/Lock.h"
+#include "ace/Synch_Traits.h"
+
+ACE_RCSID (FaultTolerance,
+ FT_ORBInitializer,
+ "$Id$")
+
+
+TAO_BEGIN_VERSIONED_NAMESPACE_DECL
+
+namespace TAO
+{
+ FT_ClientRequest_Interceptor::FT_ClientRequest_Interceptor (void)
+ : name_ ("TAO_FT_ClientRequest_Interceptor")
+ , uuid_ (0)
+ , lock_ (0)
+ , retention_id_ (0)
+ {
+ ACE_Utils::UUID_GENERATOR::instance ()->init ();
+
+ this->uuid_ =
+ ACE_Utils::UUID_GENERATOR::instance ()->generateUUID ();
+
+ // Would be nice to have runtime option.
+ ACE_NEW (this->lock_,
+ ACE_Lock_Adapter<ACE_SYNCH_MUTEX>);
+
+ }
+
+ FT_ClientRequest_Interceptor::~FT_ClientRequest_Interceptor (void)
+ {
+ delete this->uuid_;
+ delete this->lock_;
+ }
+
+ char *
+ FT_ClientRequest_Interceptor::name (ACE_ENV_SINGLE_ARG_DECL_NOT_USED)
+ ACE_THROW_SPEC ((CORBA::SystemException))
+ {
+ return CORBA::string_dup (this->name_);
+ }
+
+ void
+ FT_ClientRequest_Interceptor::destroy (ACE_ENV_SINGLE_ARG_DECL_NOT_USED)
+ ACE_THROW_SPEC ((CORBA::SystemException))
+ {
+ }
+
+ void
+ FT_ClientRequest_Interceptor::send_poll (
+ PortableInterceptor::ClientRequestInfo_ptr
+ ACE_ENV_ARG_DECL_NOT_USED)
+ ACE_THROW_SPEC ((CORBA::SystemException))
+ {
+ // Do Nothing
+ }
+
+ void
+ FT_ClientRequest_Interceptor::send_request (
+ PortableInterceptor::ClientRequestInfo_ptr ri
+ ACE_ENV_ARG_DECL)
+ ACE_THROW_SPEC ((CORBA::SystemException,
+ PortableInterceptor::ForwardRequest))
+ {
+ if (TAO_debug_level > 3)
+ {
+ CORBA::String_var op =
+ ri->operation (ACE_ENV_SINGLE_ARG_PARAMETER);
+ ACE_CHECK;
+
+ ACE_DEBUG ((LM_DEBUG,
+ ACE_TEXT ("TAO_FT (%P|%t) - %s called for %s\n"),
+ this->name_,
+ op.in ()));
+ }
+
+ this->group_version_context (ri
+ ACE_ENV_ARG_PARAMETER);
+ ACE_CHECK;
+
+ this->request_service_context (ri
+ ACE_ENV_ARG_PARAMETER);
+ ACE_CHECK;
+ }
+
+ void
+ FT_ClientRequest_Interceptor::receive_reply (
+ PortableInterceptor::ClientRequestInfo_ptr
+ ACE_ENV_ARG_DECL_NOT_USED)
+ ACE_THROW_SPEC ((CORBA::SystemException))
+ {
+ }
+
+ void
+ FT_ClientRequest_Interceptor::receive_other (
+ PortableInterceptor::ClientRequestInfo_ptr ri
+ ACE_ENV_ARG_DECL)
+ ACE_THROW_SPEC ((CORBA::SystemException,
+ PortableInterceptor::ForwardRequest))
+ {
+ TAO_ClientRequestInfo* tao_ri = dynamic_cast<TAO_ClientRequestInfo*> (ri);
+
+ if (!tao_ri)
+ {
+ ACE_THROW (CORBA::INTERNAL ());
+ }
+
+ TimeBase::TimeT expires = tao_ri->tao_ft_expiration_time ();
+
+ if (!expires)
+ {
+ // Not an FT request
+ return;
+ }
+
+ PortableInterceptor::ReplyStatus status = -1;
+
+ ACE_TRY
+ {
+ status = ri->reply_status(ACE_ENV_SINGLE_ARG_PARAMETER);
+ }
+ ACE_CATCHANY
+ {
+ // No reply status => Not a location forward.
+ return;
+ }
+ ACE_ENDTRY;
+
+ if (status == PortableInterceptor::LOCATION_FORWARD)
+ {
+ // We are in an FT request and a location forward has been received.
+
+ if (expires < TAO_FT_Service_Callbacks::now ())
+ {
+ // The request has already expired...
+
+ if (TAO_debug_level > 3)
+ {
+ ACE_DEBUG ((LM_DEBUG,
+ "TAO_FT (%P|%t): FT_ClientRequest_Interceptor::receive_other - LOCATION_FORWARD received after request expiration.\n"));
+ }
+
+ // The spec says throw a SYSTEM_EXCEPTION, but doesn't specify which one.
+ // I think a TRANSIENT is the most suitable.
+ ACE_THROW (CORBA::TRANSIENT (
+ CORBA::SystemException::_tao_minor_code (
+ TAO_INVOCATION_LOCATION_FORWARD_MINOR_CODE,
+ errno),
+ CORBA::COMPLETED_NO));
+ }
+ }
+ }
+
+ void
+ FT_ClientRequest_Interceptor::receive_exception (
+ PortableInterceptor::ClientRequestInfo_ptr
+ ACE_ENV_ARG_DECL_NOT_USED)
+ ACE_THROW_SPEC ((CORBA::SystemException,
+ PortableInterceptor::ForwardRequest))
+ {
+#if 0
+ // @@ Will be used later.
+ // Do a check for policy in which this can be done..
+ PortableInterceptor::ReplyStatus rs =
+ ri->reply_status (ACE_ENV_SINGLE_ARG_PARAMETER);
+ ACE_CHECK;
+
+ if (rs != PortableInterceptor::SYSTEM_EXCEPTION)
+ {
+ return;
+ }
+
+ CORBA::Any_var ex =
+ ri->received_exception (ACE_ENV_SINGLE_ARG_PARAMETER);
+ ACE_CHECK;
+
+ TAO_OutputCDR cdr;
+
+ if (!ex->impl ()->marshal_value (cdr))
+ return;
+
+ // Place for optimization..
+ TAO_InputCDR icdr (cdr);
+
+ CORBA::String_var rep_id;
+
+ CORBA::ULong min, cs = 0;
+
+ if (!(icdr.read_string (rep_id.out ()) &&
+ icdr.read_ulong (min) &&
+ icdr.read_ulong (cs)))
+ ACE_THROW (CORBA::MARSHAL (TAO::VMCID,
+ CORBA::COMPLETED_MAYBE));
+
+ cs = CORBA::CompletionStatus (cs);
+
+ // ORB would take care of it
+ if (cs != CORBA::COMPLETED_MAYBE)
+ return;
+
+ // If it is COMPLETED_MAYBE, then we will throw a COMPLETED_NO,
+ // which the ORB should understand
+ if (ACE_OS_String::strcmp (rep_id.in (),
+ "IDL:omg.org/CORBA/TRANSIENT:1.0") == 0)
+ ACE_THROW (CORBA::TRANSIENT (min,
+ CORBA::COMPLETED_NO));
+ else if (ACE_OS_String::strcmp (rep_id.in (),
+ "IDL:omg.org/CORBA/COMM_FAILURE:1.0") == 0)
+ ACE_THROW (CORBA::COMM_FAILURE (min,
+ CORBA::COMPLETED_NO));
+ else if (ACE_OS_String::strcmp (rep_id.in (),
+ "IDL:omg.org/CORBA/NO_REPONSE:1.0") == 0)
+ ACE_THROW (CORBA::NO_RESPONSE (min,
+ CORBA::COMPLETED_NO));
+
+ else if (ACE_OS_String::strcmp (rep_id.in (),
+ "IDL:omg.org/CORBA/OBJ_ADAPTER:1.0") == 0)
+ ACE_THROW (CORBA::OBJ_ADAPTER (min,
+ CORBA::COMPLETED_NO));
+ cout << "Didnt throw exception " << endl;
+#endif /*if 0*/
+ return;
+ }
+
+
+ void
+ FT_ClientRequest_Interceptor::group_version_context (
+ PortableInterceptor::ClientRequestInfo_ptr ri
+ ACE_ENV_ARG_DECL)
+ ACE_THROW_SPEC ((CORBA::SystemException))
+ {
+ ACE_TRY
+ {
+ IOP::TaggedComponent_var tp =
+ ri->get_effective_component (IOP::TAG_FT_GROUP
+ ACE_ENV_ARG_PARAMETER);
+ ACE_TRY_CHECK;
+
+ // Grab the object group version
+ // @@ NOTE: This involves an allocation and a dellocation. This is
+ // really bad.
+ TAO_InputCDR cdr (reinterpret_cast<const char*> (tp->component_data.get_buffer ()),
+ tp->component_data.length ());
+ CORBA::Boolean byte_order;
+
+ if ((cdr >> ACE_InputCDR::to_boolean (byte_order)) == 0)
+ return;
+
+ cdr.reset_byte_order (static_cast<int> (byte_order));
+
+ FT::TagFTGroupTaggedComponent gtc;
+
+ if ((cdr >> gtc) == 0)
+ ACE_THROW (CORBA::BAD_PARAM (CORBA::OMGVMCID | 28,
+ CORBA::COMPLETED_NO));
+
+ IOP::ServiceContext sc;
+ sc.context_id = IOP::FT_GROUP_VERSION;
+
+ TAO_OutputCDR ocdr;
+ if (!(ocdr << ACE_OutputCDR::from_boolean (TAO_ENCAP_BYTE_ORDER)))
+ return;
+ //ACE_THROW (CORBA::MARSHAL ());
+
+ if (!(ocdr << gtc.object_group_ref_version))
+ return;
+ //ACE_THROW (CORBA::MARSHAL ());
+
+ CORBA::ULong length =
+ static_cast<CORBA::ULong> (ocdr.total_length ());
+ sc.context_data.length (length);
+ CORBA::Octet *buf = sc.context_data.get_buffer ();
+
+ for (const ACE_Message_Block *i = ocdr.begin ();
+ i != 0;
+ i = i->cont ())
+ {
+ ACE_OS::memcpy (buf, i->rd_ptr (), i->length ());
+ buf += i->length ();
+ }
+
+ // Add this context to the service context list.
+ ri->add_request_service_context (sc,
+ 0
+ ACE_ENV_ARG_PARAMETER);
+ ACE_TRY_CHECK;
+
+ }
+ ACE_CATCHANY
+ {
+ // Not much can be done anyway. Just keep quiet
+ // ACE_RE_THROW;
+ }
+ ACE_ENDTRY;
+ ACE_CHECK;
+
+ return;
+ }
+
+ void
+ FT_ClientRequest_Interceptor::request_service_context (
+ PortableInterceptor::ClientRequestInfo_ptr ri
+ ACE_ENV_ARG_DECL)
+ ACE_THROW_SPEC ((CORBA::SystemException))
+ {
+ ACE_TRY
+ {
+ IOP::ServiceContext sc;
+ sc.context_id = IOP::FT_REQUEST;
+
+ CORBA::Policy_var policy =
+ ri->get_request_policy (FT::REQUEST_DURATION_POLICY
+ ACE_ENV_ARG_PARAMETER);
+ ACE_TRY_CHECK;
+
+ FT::FTRequestServiceContext ftrsc;
+ ftrsc.client_id =
+ CORBA::string_dup (this->uuid_->to_string ()->c_str ());
+
+ TAO_ClientRequestInfo* tao_ri = dynamic_cast<TAO_ClientRequestInfo*> (ri);
+
+ if (!tao_ri)
+ {
+ ACE_THROW (CORBA::INTERNAL ());
+ }
+
+ if (tao_ri->tao_ft_expiration_time ())
+ {
+ ftrsc.retention_id = tao_ri->tao_ft_retention_id ();
+ ftrsc.expiration_time = tao_ri->tao_ft_expiration_time ();
+ }
+ else
+ {
+ ACE_GUARD (ACE_Lock,
+ guard,
+ *this->lock_);
+
+ ftrsc.retention_id = ++this->retention_id_;
+ ftrsc.expiration_time =
+ this->request_expiration_time (policy.in ()
+ ACE_ENV_ARG_PARAMETER);
+ ACE_TRY_CHECK;
+
+ tao_ri->tao_ft_retention_id (ftrsc.retention_id);
+ tao_ri->tao_ft_expiration_time (ftrsc.expiration_time);
+ }
+
+ TAO_OutputCDR ocdr;
+ if (!(ocdr << ACE_OutputCDR::from_boolean (TAO_ENCAP_BYTE_ORDER)))
+ return;
+ //ACE_THROW (CORBA::MARSHAL ());
+
+ if (!(ocdr << ftrsc))
+ return;
+ // ACE_THROW (CORBA::MARSHAL ());
+
+ // Make a *copy* of the CDR stream...
+ CORBA::ULong length =
+ static_cast<CORBA::ULong> (ocdr.total_length ());
+ sc.context_data.length (length);
+ CORBA::Octet *buf = sc.context_data.get_buffer ();
+
+ for (const ACE_Message_Block *i = ocdr.begin ();
+ i != 0;
+ i = i->cont ())
+ {
+ ACE_OS::memcpy (buf, i->rd_ptr (), i->length ());
+ buf += i->length ();
+ }
+
+ // Add this context to the service context list.
+ ri->add_request_service_context (sc,
+ 0
+ ACE_ENV_ARG_PARAMETER);
+ ACE_TRY_CHECK;
+ }
+ ACE_CATCHANY
+ {
+ // ACE_RE_THROW;
+ }
+ ACE_ENDTRY;
+ ACE_CHECK;
+ return;
+ }
+
+ TimeBase::TimeT
+ FT_ClientRequest_Interceptor::request_expiration_time (
+ CORBA::Policy *policy
+ ACE_ENV_ARG_DECL)
+ ACE_THROW_SPEC ((CORBA::SystemException))
+ {
+ FT::RequestDurationPolicy_var p;
+
+ if (policy != 0)
+ {
+ p = FT::RequestDurationPolicy::_narrow (policy
+ ACE_ENV_ARG_PARAMETER);
+ ACE_CHECK_RETURN (0);
+ }
+
+ TimeBase::TimeT t = 0;
+
+ if (p.in ())
+ {
+ t =
+ p->request_duration_policy_value (ACE_ENV_SINGLE_ARG_PARAMETER);
+ ACE_CHECK_RETURN (0);
+ }
+ else
+ {
+ if (TAO_debug_level > 3)
+ {
+ ACE_DEBUG ((LM_DEBUG,
+ ACE_TEXT ("TAO_FT (%P|%t) - Using default value")
+ ACE_TEXT ("of 1.5 seconds\n")));
+ }
+ t = 15 * 1000000;
+ }
+
+ // Calculaton of the expiration time
+ t += TAO_FT_Service_Callbacks::now ();
+
+ return t;
+ }
+}
+
+TAO_END_VERSIONED_NAMESPACE_DECL
diff --git a/TAO/orbsvcs/orbsvcs/FaultTolerance/FT_ClientRequest_Interceptor.h b/TAO/orbsvcs/orbsvcs/FaultTolerance/FT_ClientRequest_Interceptor.h
new file mode 100644
index 00000000000..c4115555085
--- /dev/null
+++ b/TAO/orbsvcs/orbsvcs/FaultTolerance/FT_ClientRequest_Interceptor.h
@@ -0,0 +1,150 @@
+// -*- C++ -*-
+
+//=============================================================================
+/**
+ * @file FT_ClientRequest_Interceptor.h
+ *
+ * $Id$
+ *
+ * @author Balachandran Natarajan <bala@dre.vanderbilt.edu>
+ */
+//=============================================================================
+#ifndef TAO_FT_CLIENT_REQUEST_INTERCEPTOR_H
+#define TAO_FT_CLIENT_REQUEST_INTERCEPTOR_H
+#include /**/ "ace/pre.h"
+
+#include "orbsvcs/FaultTolerance/FT_ClientORB_export.h"
+
+#if !defined (ACE_LACKS_PRAGMA_ONCE)
+# pragma once
+#endif /* ACE_LACKS_PRAGMA_ONCE */
+
+#include "tao/PI/PI.h"
+#include "tao/PortableInterceptorC.h"
+#include "tao/LocalObject.h"
+#include "tao/TimeBaseC.h"
+#include "ace/Singleton.h"
+
+// This is to remove "inherits via dominance" warnings from MSVC.
+// MSVC is being a little too paranoid.
+#if defined(_MSC_VER)
+#pragma warning(push)
+#pragma warning(disable:4250)
+#endif /* _MSC_VER */
+
+ACE_BEGIN_VERSIONED_NAMESPACE_DECL
+namespace ACE_Utils
+{
+ class UUID;
+}
+ACE_END_VERSIONED_NAMESPACE_DECL
+
+TAO_BEGIN_VERSIONED_NAMESPACE_DECL
+
+namespace TAO
+{
+ /**
+ * @class FT_TSS
+ *
+ * @brief Request service context generator class for the client.
+ *
+ * @@TODO Need to see whether we can have seperate resource factory
+ * and put this there. Let us get this going first
+ */
+ class FT_TSS
+ {
+ public:
+ CORBA::Long retention_id_;
+
+ bool clean_flag_;
+ };
+
+
+ /**
+ * @class FT_ClientRequest_Interceptor
+ *
+ * @brief Interceptors for the client
+ *
+ * @@TODO
+ */
+ class FT_ClientRequest_Interceptor
+ : public virtual PortableInterceptor::ClientRequestInterceptor,
+ public virtual TAO_Local_RefCounted_Object
+ {
+ public:
+
+ FT_ClientRequest_Interceptor (void);
+
+ /// Canonical name of the interceptor.
+ virtual char * name (ACE_ENV_SINGLE_ARG_DECL)
+ ACE_THROW_SPEC ((CORBA::SystemException));
+
+
+ virtual void destroy (ACE_ENV_SINGLE_ARG_DECL)
+ ACE_THROW_SPEC ((CORBA::SystemException));
+
+ virtual void send_poll (PortableInterceptor::ClientRequestInfo_ptr
+ ACE_ENV_ARG_DECL)
+ ACE_THROW_SPEC ((CORBA::SystemException));
+
+ virtual void send_request (PortableInterceptor::ClientRequestInfo_ptr ri
+ ACE_ENV_ARG_DECL)
+ ACE_THROW_SPEC ((CORBA::SystemException,
+ PortableInterceptor::ForwardRequest));
+
+ virtual void receive_reply (PortableInterceptor::ClientRequestInfo_ptr ri
+ ACE_ENV_ARG_DECL)
+ ACE_THROW_SPEC ((CORBA::SystemException));
+
+ virtual void receive_other (PortableInterceptor::ClientRequestInfo_ptr
+ ACE_ENV_ARG_DECL)
+ ACE_THROW_SPEC ((CORBA::SystemException,
+ PortableInterceptor::ForwardRequest));
+
+ virtual void receive_exception (PortableInterceptor::ClientRequestInfo_ptr ri
+ ACE_ENV_ARG_DECL)
+ ACE_THROW_SPEC ((CORBA::SystemException,
+ PortableInterceptor::ForwardRequest));
+
+ protected:
+
+ ~FT_ClientRequest_Interceptor (void);
+
+ private:
+
+ void group_version_context (PortableInterceptor::ClientRequestInfo_ptr ri
+ ACE_ENV_ARG_DECL)
+ ACE_THROW_SPEC ((CORBA::SystemException));
+
+ void request_service_context (PortableInterceptor::ClientRequestInfo_ptr ri
+ ACE_ENV_ARG_DECL)
+ ACE_THROW_SPEC ((CORBA::SystemException));
+
+ TimeBase::TimeT request_expiration_time (CORBA::Policy *policy
+ ACE_ENV_ARG_DECL)
+ ACE_THROW_SPEC ((CORBA::SystemException));
+
+ private:
+
+ /// Name of the interceptor
+ const char *name_;
+
+ /// UUID for this client
+ ACE_Utils::UUID *uuid_;
+
+ /// @@ Need a resource factory for this too
+ ACE_Lock *lock_;
+
+ /// Retention id generated by the client
+ CORBA::Long retention_id_;
+ };
+}
+
+TAO_END_VERSIONED_NAMESPACE_DECL
+
+#if defined(_MSC_VER)
+#pragma warning(pop)
+#endif /* _MSC_VER */
+
+#include /**/ "ace/post.h"
+#endif /*TAO_FT_CLIENT_REQUEST_INTERCEPTOR_H*/
diff --git a/TAO/orbsvcs/orbsvcs/FaultTolerance/FT_ClientService_Activate.cpp b/TAO/orbsvcs/orbsvcs/FaultTolerance/FT_ClientService_Activate.cpp
new file mode 100755
index 00000000000..7adfd628330
--- /dev/null
+++ b/TAO/orbsvcs/orbsvcs/FaultTolerance/FT_ClientService_Activate.cpp
@@ -0,0 +1,81 @@
+#include "orbsvcs/FaultTolerance/FT_ClientService_Activate.h"
+#include "orbsvcs/FaultTolerance/FT_Service_Callbacks.h"
+#include "orbsvcs/FaultTolerance/FT_ClientORBInitializer.h"
+#include "orbsvcs/FaultTolerance/FT_Endpoint_Selector_Factory.h"
+#include "tao/ORB_Core.h"
+#include "tao/Service_Callbacks.h"
+#include "tao/ORBInitializer_Registry.h"
+#include "ace/Dynamic_Service.h"
+
+ACE_RCSID(FaultTolerance, FT_ClientService_Activate, "$Id$")
+
+static bool initialized = false;
+
+TAO_BEGIN_VERSIONED_NAMESPACE_DECL
+
+TAO_FT_ClientService_Activate::TAO_FT_ClientService_Activate (void)
+{
+}
+
+TAO_FT_ClientService_Activate::~TAO_FT_ClientService_Activate (void)
+{
+}
+
+
+TAO_Service_Callbacks *
+TAO_FT_ClientService_Activate::activate_services (TAO_ORB_Core *orb_core)
+ ACE_THROW_SPEC ((CORBA::SystemException))
+{
+ TAO_FT_Service_Callbacks *ft_service_callback = 0;
+
+ // Construct service callback object
+ ACE_NEW_RETURN (ft_service_callback,
+ TAO_FT_Service_Callbacks (orb_core),
+ 0);
+
+
+ return ft_service_callback;
+}
+
+
+int
+TAO_FT_ClientService_Activate::Initializer (void)
+{
+ if (initialized == false)
+ {
+ ACE_Service_Config::static_svcs ()->
+ insert (&ace_svc_desc_TAO_FT_ClientService_Activate);
+
+ PortableInterceptor::ORBInitializer_ptr temp_orb_initializer =
+ PortableInterceptor::ORBInitializer::_nil ();
+ PortableInterceptor::ORBInitializer_var orb_initializer;
+
+ // Register the RTCORBA ORBInitializer.
+ ACE_NEW_RETURN (temp_orb_initializer,
+ TAO_FT_ClientORBInitializer,
+ -1);
+
+ orb_initializer = temp_orb_initializer;
+
+ PortableInterceptor::register_orb_initializer (orb_initializer.in ());
+
+ // Set the name of the endpoint selector factory
+ TAO_ORB_Core::set_endpoint_selector_factory ("FT_Endpoint_Selector_Factory");
+ ACE_Service_Config::process_directive (ace_svc_desc_TAO_FT_Endpoint_Selector_Factory);
+
+ initialized = true;
+ }
+
+ return 0;
+}
+
+TAO_END_VERSIONED_NAMESPACE_DECL
+
+ACE_FACTORY_DEFINE (TAO_FT_ClientORB,TAO_FT_ClientService_Activate)
+
+ACE_STATIC_SVC_DEFINE (TAO_FT_ClientService_Activate,
+ ACE_TEXT ("FT_ClientService_Activate"),
+ ACE_SVC_OBJ_T,
+ &ACE_SVC_NAME (TAO_FT_ClientService_Activate),
+ ACE_Service_Type::DELETE_THIS | ACE_Service_Type::DELETE_OBJ,
+ 0)
diff --git a/TAO/orbsvcs/orbsvcs/FaultTolerance/FT_ClientService_Activate.h b/TAO/orbsvcs/orbsvcs/FaultTolerance/FT_ClientService_Activate.h
new file mode 100755
index 00000000000..c6b8c863e6f
--- /dev/null
+++ b/TAO/orbsvcs/orbsvcs/FaultTolerance/FT_ClientService_Activate.h
@@ -0,0 +1,73 @@
+// -*- C++ -*-
+
+//=============================================================================
+/**
+ * @file FT_ClientService_Activate.h
+ *
+ * $Id$
+ *
+ * A concrete implementation of a service callback
+ *
+ * @author Bala Natarajan <bala@cs.wustl.edu>
+ */
+//=============================================================================
+
+#ifndef TAO_FT_CLIENTACTIVATE_H
+#define TAO_FT_CLIENTACTIVATE_H
+#include /**/ "ace/pre.h"
+
+#include "orbsvcs/FaultTolerance/FT_ClientORB_export.h"
+
+#if !defined (ACE_LACKS_PRAGMA_ONCE)
+# pragma once
+#endif /* ACE_LACKS_PRAGMA_ONCE */
+
+#include "tao/Services_Activate.h"
+#include "ace/Service_Config.h"
+
+TAO_BEGIN_VERSIONED_NAMESPACE_DECL
+
+class TAO_Service_Callbacks;
+
+// Forward declarations
+/**
+ * @class TAO_FT_ClientService_Activate
+ *
+ * @brief A class to dynamically load the FT callback implementations in
+ * to the ORB.
+ *
+ * An implementation of the service callbacks that allows the
+ * loading of the FT ORB level library in to the ORB
+ */
+class TAO_FT_ClientORB_Export TAO_FT_ClientService_Activate : public TAO_Services_Activate
+{
+
+public:
+ /// Constructor
+ TAO_FT_ClientService_Activate (void);
+
+ /// The destructor
+ virtual ~TAO_FT_ClientService_Activate (void);
+
+ /**
+ * Create and activate the service callbacks into the orb.
+ * This method cannot throw any exception, but it can return a nil
+ * object to indicate an error condition.
+ */
+ virtual TAO_Service_Callbacks *activate_services (TAO_ORB_Core *orb)
+ ACE_THROW_SPEC ((CORBA::SystemException));
+
+ /// Used to force the initialization.
+ static int Initializer (void);
+};
+
+static int
+TAO_FT_Requires_ClientService_Activate = TAO_FT_ClientService_Activate::Initializer ();
+
+TAO_END_VERSIONED_NAMESPACE_DECL
+
+ACE_STATIC_SVC_DECLARE (TAO_FT_ClientService_Activate)
+ACE_FACTORY_DECLARE (TAO_FT_ClientORB, TAO_FT_ClientService_Activate)
+
+#include /**/ "ace/post.h"
+#endif /*TAO_FT_CLIENTACTIVATE_H*/
diff --git a/TAO/orbsvcs/orbsvcs/FaultTolerance/FT_Endpoint_Selector_Factory.cpp b/TAO/orbsvcs/orbsvcs/FaultTolerance/FT_Endpoint_Selector_Factory.cpp
new file mode 100644
index 00000000000..280b95cab98
--- /dev/null
+++ b/TAO/orbsvcs/orbsvcs/FaultTolerance/FT_Endpoint_Selector_Factory.cpp
@@ -0,0 +1,60 @@
+// $Id$
+
+#include "orbsvcs/FaultTolerance/FT_Endpoint_Selector_Factory.h"
+#include "orbsvcs/FaultTolerance/FT_Invocation_Endpoint_Selectors.h"
+#include "tao/SystemException.h"
+#include "tao/Environment.h"
+
+
+ACE_RCSID (FaultTolerance,
+ FT_Endpoint_Selector_Factory,
+ "$Id$")
+
+TAO_BEGIN_VERSIONED_NAMESPACE_DECL
+
+TAO_FT_Endpoint_Selector_Factory::TAO_FT_Endpoint_Selector_Factory (void)
+ : ft_endpoint_selector_ (0)
+{
+}
+
+TAO_FT_Endpoint_Selector_Factory::~TAO_FT_Endpoint_Selector_Factory (void)
+{
+ delete this->ft_endpoint_selector_;
+}
+
+
+TAO_Invocation_Endpoint_Selector *
+TAO_FT_Endpoint_Selector_Factory::get_selector (
+ ACE_ENV_SINGLE_ARG_DECL)
+{
+ if (this->ft_endpoint_selector_ == 0)
+ {
+ ACE_MT (ACE_GUARD_RETURN (TAO_SYNCH_MUTEX,
+ guard,
+ this->mutex_,
+ 0));
+
+ // Double checked locking..
+ if (this->ft_endpoint_selector_ == 0)
+ {
+ ACE_NEW_THROW_EX (ft_endpoint_selector_,
+ TAO_FT_Invocation_Endpoint_Selector (),
+ CORBA::NO_MEMORY ());
+ ACE_CHECK_RETURN (0);
+ }
+ }
+
+ return this->ft_endpoint_selector_;
+}
+
+TAO_END_VERSIONED_NAMESPACE_DECL
+
+// ****************************************************************
+
+ACE_STATIC_SVC_DEFINE (TAO_FT_Endpoint_Selector_Factory,
+ ACE_TEXT ("FT_Endpoint_Selector_Factory"),
+ ACE_SVC_OBJ_T,
+ &ACE_SVC_NAME (TAO_FT_Endpoint_Selector_Factory),
+ ACE_Service_Type::DELETE_THIS | ACE_Service_Type::DELETE_OBJ,
+ 0)
+ACE_FACTORY_DEFINE (TAO_FT_ClientORB, TAO_FT_Endpoint_Selector_Factory)
diff --git a/TAO/orbsvcs/orbsvcs/FaultTolerance/FT_Endpoint_Selector_Factory.h b/TAO/orbsvcs/orbsvcs/FaultTolerance/FT_Endpoint_Selector_Factory.h
new file mode 100644
index 00000000000..d2a6462b4e0
--- /dev/null
+++ b/TAO/orbsvcs/orbsvcs/FaultTolerance/FT_Endpoint_Selector_Factory.h
@@ -0,0 +1,76 @@
+// -*- C++ -*-
+
+//=============================================================================
+/**
+ * @file FT_Endpoint_Selector_Factory.h
+ *
+ * $Id$
+ *
+ * @author Balachandran Natarajan <bala@cs.wustl.edu>
+ */
+//=============================================================================
+#ifndef TAO_FT_ENDPOINT_SELECTOR_FACTORY_H
+#define TAO_FT_ENDPOINT_SELECTOR_FACTORY_H
+
+#include /**/ "ace/pre.h"
+
+#include "orbsvcs/FaultTolerance/FT_ClientORB_export.h"
+
+#if !defined (ACE_LACKS_PRAGMA_ONCE)
+# pragma once
+#endif /* ACE_LACKS_PRAGMA_ONCE */
+
+#include "tao/Endpoint_Selector_Factory.h"
+#include "tao/Basic_Types.h"
+#include "tao/orbconf.h"
+
+#include "ace/Service_Config.h"
+
+TAO_BEGIN_VERSIONED_NAMESPACE_DECL
+
+class TAO_FT_Invocation_Endpoint_Selector;
+/**
+ * @class TAO_FT_Endpoint_Selector_Factory
+ *
+ * @brief Factory for initializing <Endpoint_Selection_State> and
+ * obtaining appropriate <Invocation_Endpoint_Selector>.
+ *
+ * This class is specifically for the FT_Service in TAO to return the
+ * right factory
+ */
+
+class TAO_FT_ClientORB_Export TAO_FT_Endpoint_Selector_Factory
+ : public TAO_Endpoint_Selector_Factory
+{
+public:
+
+ /// Constructor.
+ TAO_FT_Endpoint_Selector_Factory (void);
+
+ /// Destructor.
+ virtual ~TAO_FT_Endpoint_Selector_Factory (void);
+
+ /// Get an Invocation's endpoint selection strategy and
+ /// initialize the endpoint selection state instance.
+ virtual TAO_Invocation_Endpoint_Selector *get_selector (
+ ACE_ENV_SINGLE_ARG_DECL);
+
+private:
+
+ /// The possible endpoint selector strategies that can be
+ /// returned by this factory
+ TAO_FT_Invocation_Endpoint_Selector *ft_endpoint_selector_;
+
+ /// Mutex to prevent multiple initializations
+ TAO_SYNCH_MUTEX mutex_;
+};
+
+TAO_END_VERSIONED_NAMESPACE_DECL
+
+//extern TAO_FT_ClientORB_Export ACE_Static_Svc_Descriptor ace_svc_desc_TAO_FT_Endpoint_Selector_Factory;
+ACE_STATIC_SVC_DECLARE_EXPORT (TAO_FT_ClientORB, TAO_FT_Endpoint_Selector_Factory)
+ACE_FACTORY_DECLARE (TAO_FT_ClientORB, TAO_FT_Endpoint_Selector_Factory)
+
+#include /**/ "ace/post.h"
+
+#endif /* TAO_DEFAULT_ENDPOINT_SELECTOR_FACTORY_H */
diff --git a/TAO/orbsvcs/orbsvcs/FaultTolerance/FT_IOGR_Property.cpp b/TAO/orbsvcs/orbsvcs/FaultTolerance/FT_IOGR_Property.cpp
new file mode 100644
index 00000000000..413bce96aaf
--- /dev/null
+++ b/TAO/orbsvcs/orbsvcs/FaultTolerance/FT_IOGR_Property.cpp
@@ -0,0 +1,428 @@
+#include "orbsvcs/FaultTolerance/FT_IOGR_Property.h"
+
+#include "tao/MProfile.h"
+#include "tao/Profile.h"
+#include "tao/Stub.h"
+#include "tao/ORB_Core.h"
+#include "tao/Tagged_Components.h"
+#include "tao/CDR.h"
+
+#include "ace/Auto_Ptr.h"
+#include "tao/debug.h"
+
+
+ACE_RCSID (FaultTolerance,
+ TAO_FT_IOGR_Property,
+ "$Id$")
+
+#if !defined (__ACE_INLINE__)
+# include "orbsvcs/FaultTolerance/FT_IOGR_Property.inl"
+#endif /* ! __ACE_INLINE__ */
+
+TAO_BEGIN_VERSIONED_NAMESPACE_DECL
+
+CORBA::Boolean
+TAO_FT_IOGR_Property::set_property (
+ CORBA::Object_ptr &ior
+ ACE_ENV_ARG_DECL_NOT_USED /*ACE_ENV_SINGLE_ARG_PARAMETER*/)
+ ACE_THROW_SPEC ((CORBA::SystemException,
+ TAO_IOP::Invalid_IOR))
+{
+ // We need to apply the property for every profile in the IOR
+
+ // Make profiles from the sent <ior>
+ TAO_MProfile &tmp_pfiles =
+ ior->_stubobj ()->base_profiles ();
+
+ // Get the profile count.
+ CORBA::ULong count =
+ ior->_stubobj ()->base_profiles ().profile_count ();
+
+ // Make the output CDR stream
+ TAO_OutputCDR cdr;
+ CORBA::Boolean retval = 0;
+ retval =
+ cdr << ACE_OutputCDR::from_boolean (TAO_ENCAP_BYTE_ORDER);
+
+ IOP::TaggedComponent tagged_components;
+ tagged_components.tag = IOP::TAG_FT_GROUP;
+
+ // Encode the property in to the tagged_components
+ retval = retval &&
+ this->encode_properties (cdr,
+ tagged_components);
+
+ if (retval == 0)
+ return retval;
+
+ const IOP::TaggedComponent &tmp_tc = tagged_components;
+
+ // Go through every profile and set the TaggedComponent field
+ for (CORBA::ULong i = 0; i < count ; i++)
+ {
+ // Get the tagged components in the profile
+ TAO_Tagged_Components &tag_comp =
+ tmp_pfiles.get_profile (i)->tagged_components ();
+
+ // Finally set the <tagged_component> in the
+ // <TAO_Tagged_Component>
+ tag_comp.set_component (tmp_tc);
+ }
+
+ // Success
+ return 1;
+
+}
+
+
+CORBA::Boolean
+TAO_FT_IOGR_Property::is_primary_set (
+ CORBA::Object_ptr ior
+ ACE_ENV_ARG_DECL_NOT_USED /*ACE_ENV_SINGLE_ARG_PARAMETER*/)
+ ACE_THROW_SPEC ((
+ CORBA::SystemException
+ ))
+{
+ if (this->get_primary_profile (ior) != 0)
+ return 1;
+
+ return 0;
+}
+
+
+CORBA::Object_ptr
+TAO_FT_IOGR_Property::get_primary (
+ CORBA::Object_ptr ior
+ ACE_ENV_ARG_DECL)
+ ACE_THROW_SPEC ((
+ CORBA::SystemException,
+ TAO_IOP::NotFound
+ ))
+{
+
+ TAO_Profile *pfile =
+ this->get_primary_profile (ior);
+
+ if (pfile == 0)
+ ACE_THROW_RETURN (TAO_IOP::NotFound (),
+ CORBA::Object::_nil ());
+
+ // Search for the IOP::TAG_FT_PRIMARY in the tagged component of
+ // the profile
+
+ // Get the repository id
+ CORBA::String_var id =
+ CORBA::string_dup (ior->_stubobj ()->type_id.in ());
+
+ TAO_ORB_Core *orb_core = TAO_ORB_Core_instance ();
+
+ // Make a stub Object
+ TAO_Stub *stub = 0;
+
+ // Make a MProfile object for the primary profile alone. So, the
+ // size is 1
+ CORBA::ULong sz = 1;
+ TAO_MProfile mpfile (sz);
+ if (mpfile.add_profile (pfile) != -1)
+ {
+ ACE_NEW_THROW_EX (stub,
+ TAO_Stub (id._retn (), // give the id string to stub
+ mpfile,
+ orb_core),
+ CORBA::NO_MEMORY ());
+ }
+
+ // Make the stub memory allocation exception safe for
+ // the duration of this method.
+ TAO_Stub_Auto_Ptr safe_stub (stub);
+
+ // Create the CORBA level proxy
+ CORBA::Object_ptr temp_obj = CORBA::Object::_nil ();
+ ACE_NEW_THROW_EX (temp_obj,
+ CORBA::Object (safe_stub.get ()),
+ CORBA::NO_MEMORY ());
+
+ CORBA::Object_var new_obj = temp_obj;
+
+ ACE_CHECK_RETURN (CORBA::Object::_nil ());
+
+ // Clean up in case of errors.
+ if (CORBA::is_nil (new_obj.in ()))
+ {
+ ACE_THROW_RETURN (TAO_IOP::NotFound (), // ** Changed from Invalid_IOR () **
+ CORBA::Object::_nil ());
+ }
+
+ // Release ownership of the pointers protected by the auto_ptrs since they
+ // no longer need to be protected by this point.
+ stub = safe_stub.release ();
+
+ return new_obj._retn ();
+
+}
+
+
+CORBA::Boolean
+TAO_FT_IOGR_Property::set_primary (
+ CORBA::Object_ptr &ior1,
+ CORBA::Object_ptr ior2
+ ACE_ENV_ARG_DECL)
+ ACE_THROW_SPEC ((
+ CORBA::SystemException,
+ TAO_IOP::NotFound,
+ TAO_IOP::Duplicate
+ ))
+{
+ // Check for primary in <ior2>
+ IOP::TaggedComponent tagged_components;
+ tagged_components.tag = IOP::TAG_FT_PRIMARY;
+
+ TAO_MProfile &mprofile =
+ ior2->_stubobj ()->base_profiles ();
+
+ for (CORBA::ULong i = 0;
+ i < mprofile.profile_count ();
+ i++)
+ {
+ TAO_Tagged_Components &tag_comp =
+ mprofile.get_profile (i)->tagged_components ();
+
+ if (tag_comp.get_component (tagged_components) == 1)
+ ACE_THROW_RETURN (TAO_IOP::Duplicate (),
+ 0);
+ }
+
+ // Check whether ior1 exists in ior2
+ CORBA::Long index = -1;
+
+ // Even if it is a multi-profile (in case of multi-homed hosts we
+ // could get a multiple IOR profile), we are going to make the first one
+ // in that a primary
+ TAO_Profile *prim_profile =
+ ior1->_stubobj ()->base_profiles ().get_profile (0);
+
+ CORBA::ULong count =
+ ior2->_stubobj ()->base_profiles ().profile_count ();
+
+
+ for (CORBA::ULong ctr = 0;
+ ctr < count;
+ ctr ++)
+ {
+ if (prim_profile->is_equivalent (
+ ior2->_stubobj ()->base_profiles ().get_profile (ctr)) == 1)
+ {
+ // We know that <ior1> exists in <io2>
+ // Take the index of that and break out of the loop
+ index = ctr;
+ break;
+ }
+ }
+
+ // At the end of the loop check whether we have seen <ior1> in
+ // <ior2>
+ if (index == -1)
+ ACE_THROW_RETURN (TAO_IOP::NotFound (),
+ 0);
+
+ CORBA::Boolean val = 1;
+
+ TAO_OutputCDR cdr;
+ cdr << ACE_OutputCDR::from_boolean (TAO_ENCAP_BYTE_ORDER);
+ cdr << ACE_OutputCDR::from_boolean (val);
+
+ // Get the length of the CDR stream
+ CORBA::ULong length = static_cast<CORBA::ULong> (cdr.total_length ());
+
+ // Set the length
+ tagged_components.component_data.length (length);
+
+ // Get the pointer to the underlying buffer
+ CORBA::Octet *buf =
+ tagged_components.component_data.get_buffer ();
+
+ for (const ACE_Message_Block *mb = cdr.begin ();
+ mb != 0;
+ mb = mb->cont ())
+ {
+ ACE_OS::memcpy (buf, mb->rd_ptr (), mb->length ());
+ buf += mb->length ();
+ }
+
+ // Set the <tagged_component>
+ TAO_Tagged_Components &tagg =
+ ior2->_stubobj ()->base_profiles ().get_profile (index)->tagged_components ();
+
+ tagg.set_component (tagged_components);
+
+ return 1;
+}
+
+CORBA::Boolean
+TAO_FT_IOGR_Property::encode_properties (
+ TAO_OutputCDR &cdr,
+ IOP::TaggedComponent &tagged_components)
+{
+ if (this->ft_group_tagged_component_ == 0)
+ {
+ if (TAO_debug_level > 2)
+ ACE_ERROR_RETURN ((LM_ERROR,
+ "TAO-FT (%P|%t) - The group tagged component ",
+ "is null \n"),
+ 0);
+ }
+
+ // the version info
+ CORBA::Boolean status =
+ cdr << this->ft_group_tagged_component_->component_version;
+
+ // the domain id
+ status = status &&
+ cdr << this->ft_group_tagged_component_->group_domain_id.in ();
+
+ // Object group id
+ status = status &&
+ cdr << this->ft_group_tagged_component_->object_group_id;
+
+ // Object group reference version
+ status = status &&
+ cdr << this->ft_group_tagged_component_->object_group_ref_version;
+
+ // Get the length of the CDR stream
+ CORBA::ULong length = static_cast<CORBA::ULong> (cdr.total_length ());
+
+ // Set the length
+ tagged_components.component_data.length (length);
+
+ // Get the pointer to the underlying buffer
+ CORBA::Octet *buf =
+ tagged_components.component_data.get_buffer ();
+
+ for (const ACE_Message_Block *i = cdr.begin ();
+ i != 0;
+ i = i->cont ())
+ {
+
+ ACE_OS::memcpy (buf, i->rd_ptr (), i->length ());
+ buf += i->length ();
+ }
+
+
+ return status;
+}
+
+
+TAO_Profile *
+TAO_FT_IOGR_Property::get_primary_profile (
+ CORBA::Object_ptr ior)
+{
+ // Get the MProfile
+ TAO_MProfile &mprofile =
+ ior->_stubobj ()->base_profiles ();
+
+ // Looking for a tagged component with a PRIMARY flag.
+ IOP::TaggedComponent tagged_components;
+ tagged_components.tag = IOP::TAG_FT_PRIMARY;
+
+ for (CORBA::ULong i = 0;
+ i < mprofile.profile_count ();
+ i++)
+ {
+ // Get the Tagged Components
+ const TAO_Tagged_Components &pfile_tagged =
+ mprofile.get_profile (i)->tagged_components ();
+
+ // Look for the primary
+ if (pfile_tagged.get_component (tagged_components) == 1)
+ {
+ // If there is one return the pfile
+ return mprofile.get_profile (i);
+ }
+ }
+ return 0;
+}
+
+
+CORBA::Boolean
+TAO_FT_IOGR_Property::get_tagged_component (
+ const CORBA::Object_ptr iogr,
+ FT::TagFTGroupTaggedComponent &fgtc
+ ACE_ENV_ARG_DECL) const
+ ACE_THROW_SPEC ((CORBA::SystemException))
+{
+ TAO_Stub *stub =
+ iogr->_stubobj ();
+
+ if (stub == 0)
+ return 0;
+
+ // Get the MProfile
+ TAO_MProfile &mprofile =
+ iogr->_stubobj ()->base_profiles ();
+
+ // Looking for a tagged component with a TAG_FT_GROUP flag.
+ IOP::TaggedComponent tc;
+ tc.tag = IOP::TAG_FT_GROUP;
+
+ for (CORBA::ULong i = 0;
+ i < mprofile.profile_count ();
+ i++)
+ {
+
+ // Get the Tagged Components
+ const TAO_Tagged_Components &pfile_tagged =
+ mprofile.get_profile (i)->tagged_components ();
+
+ // Look for the primary
+ if (pfile_tagged.get_component (tc) == 1)
+ {
+ TAO_InputCDR cdr (reinterpret_cast<const char*> (tc.component_data.get_buffer ()),
+ tc.component_data.length ());
+ CORBA::Boolean byte_order;
+
+ if ((cdr >> ACE_InputCDR::to_boolean (byte_order)) == 0)
+ ACE_THROW_RETURN (CORBA::MARSHAL (),
+ 0);
+
+ cdr.reset_byte_order (static_cast<int> (byte_order));
+
+ if ((cdr >> fgtc) == 1)
+ return 1;
+ else
+ ACE_THROW_RETURN (CORBA::MARSHAL (),
+ 0);
+ }
+ }
+
+ return 0;
+}
+
+CORBA::Boolean
+TAO_FT_IOGR_Property::remove_primary_tag (
+ CORBA::Object_ptr &iogr
+ ACE_ENV_ARG_DECL_NOT_USED)
+ ACE_THROW_SPEC ((CORBA::SystemException))
+{
+ // Get the MProfile
+ TAO_MProfile &mprofile =
+ iogr->_stubobj ()->base_profiles ();
+
+ for (CORBA::ULong i = 0;
+ i < mprofile.profile_count ();
+ ++i)
+ {
+ TAO_Profile* profile = mprofile.get_profile (i);
+
+ // Get the Tagged Components
+ TAO_Tagged_Components &pfile_tagged =
+ profile->tagged_components ();
+
+ if (pfile_tagged.remove_component (IOP::TAG_FT_PRIMARY))
+ {
+ return 1;
+ }
+ }
+ return 0;
+}
+
+TAO_END_VERSIONED_NAMESPACE_DECL
diff --git a/TAO/orbsvcs/orbsvcs/FaultTolerance/FT_IOGR_Property.h b/TAO/orbsvcs/orbsvcs/FaultTolerance/FT_IOGR_Property.h
new file mode 100644
index 00000000000..cc888e28e31
--- /dev/null
+++ b/TAO/orbsvcs/orbsvcs/FaultTolerance/FT_IOGR_Property.h
@@ -0,0 +1,147 @@
+// -*- C++ -*-
+
+//=============================================================================
+/**
+ * @file FT_IOGR_Property.h
+ *
+ * $Id$
+ *
+ * This class implements the IOGR properties for the FT service
+ *
+ *
+ * @author Bala Natarajan <bala@cs.wustl.edu>
+ */
+//=============================================================================
+
+
+#ifndef TAO_FT_IOGR_PROPERTY_H
+#define TAO_FT_IOGR_PROPERTY_H
+#include /**/ "ace/pre.h"
+
+#include "tao/LocalObject.h"
+#if !defined (ACE_LACKS_PRAGMA_ONCE)
+# pragma once
+#endif /* ACE_LACKS_PRAGMA_ONCE */
+
+#include "tao/IORManipulation/IORManip_Loader.h"
+#include "orbsvcs/FT_CORBA_ORBC.h"
+#include "tao/IOPC.h"
+#include "orbsvcs/FaultTolerance/FT_ORB_Utils_export.h"
+
+#if defined(_MSC_VER)
+#pragma warning(push)
+#pragma warning(disable:4250)
+#endif /* _MSC_VER */
+
+TAO_BEGIN_VERSIONED_NAMESPACE_DECL
+
+class TAO_Profile;
+
+/**
+ * @class TAO_FT_IOGR_Property
+ *
+ * @brief TAO_FT_IOGR_Property
+ *
+ * This class serves as the callback class for setting the
+ * TaggedComponent properties in the profiles of the IOGR. The
+ * user can make an instance of this class with the right
+ * properties and use the helper methods in the IORManipulation
+ *
+ * NOTE: This class is NOT thread safe. The range of services that
+ * use this class (like the RM) should use them in a thread safe
+ * manner.
+ */
+class TAO_FT_ORB_Utils_Export TAO_FT_IOGR_Property
+ : public virtual TAO_IOP::TAO_IOR_Property,
+ public virtual TAO_Local_RefCounted_Object
+{
+public:
+
+ /// Our Constructor
+ TAO_FT_IOGR_Property (FT::TagFTGroupTaggedComponent &ft_group);
+
+ TAO_FT_IOGR_Property (void);
+
+ /// Destructor
+ ~TAO_FT_IOGR_Property (void);
+
+ /// Set the property for the IOGR
+ virtual CORBA::Boolean set_property (
+ CORBA::Object_ptr &ior
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS)
+ ACE_THROW_SPEC ((
+ CORBA::SystemException,
+ TAO_IOP::Invalid_IOR
+ ));
+
+ /// Set <ior1> as primary which is a part of <ior2>
+ virtual CORBA::Boolean set_primary (
+ CORBA::Object_ptr &ior1,
+ CORBA::Object_ptr ior2
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS)
+ ACE_THROW_SPEC ((
+ CORBA::SystemException,
+ TAO_IOP::NotFound,
+ TAO_IOP::Duplicate
+ ));
+
+ /// Get the primary member from the IOGR <ior>
+ virtual CORBA::Object_ptr get_primary (
+ CORBA::Object_ptr ior
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS)
+ ACE_THROW_SPEC ((
+ CORBA::SystemException,
+ TAO_IOP::NotFound
+ ));
+
+ /// Is there a primary available for <ior>
+ virtual CORBA::Boolean is_primary_set (
+ CORBA::Object_ptr ior
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS)
+ ACE_THROW_SPEC ((
+ CORBA::SystemException
+ ));
+
+ virtual CORBA::Boolean remove_primary_tag (
+ CORBA::Object_ptr &iogr
+ ACE_ENV_ARG_DECL)
+ ACE_THROW_SPEC ((CORBA::SystemException));
+
+ /// Reset the underlying tagged components held by the class
+ CORBA::Boolean reset_tagged_components (
+ FT::TagFTGroupTaggedComponent &ft_group);
+
+ /// Extract the TagFTGroupTaggedComponent inside the <ior>
+ CORBA::Boolean get_tagged_component (
+ const CORBA::Object_ptr iogr,
+ FT::TagFTGroupTaggedComponent &ft_group
+ ACE_ENV_ARG_DECL) const
+ ACE_THROW_SPEC ((CORBA::SystemException));
+
+private:
+
+ /// An helper function that gets the primary profile from the <ior>
+ TAO_Profile *get_primary_profile (CORBA::Object_ptr ior);
+
+ /// An helper method for encoding the proeprties
+ CORBA::Boolean encode_properties (
+ TAO_OutputCDR &cdr,
+ IOP::TaggedComponent &tagged_components);
+
+private:
+ /// Hold the reference to the FT group tagged component
+ FT::TagFTGroupTaggedComponent *ft_group_tagged_component_;
+};
+
+TAO_END_VERSIONED_NAMESPACE_DECL
+
+#if defined(_MSC_VER)
+#pragma warning(pop)
+#endif /* _MSC_VER */
+
+#if defined (__ACE_INLINE__)
+# include "orbsvcs/FaultTolerance/FT_IOGR_Property.inl"
+#endif /* __ACE_INLINE__ */
+
+#include /**/ "ace/post.h"
+#endif /* TAO_FT_IOGR_PROPERTY_H */
diff --git a/TAO/orbsvcs/orbsvcs/FaultTolerance/FT_IOGR_Property.inl b/TAO/orbsvcs/orbsvcs/FaultTolerance/FT_IOGR_Property.inl
new file mode 100644
index 00000000000..5e3a8417714
--- /dev/null
+++ b/TAO/orbsvcs/orbsvcs/FaultTolerance/FT_IOGR_Property.inl
@@ -0,0 +1,35 @@
+// -*- C++ -*-
+//
+//$Id$
+
+TAO_BEGIN_VERSIONED_NAMESPACE_DECL
+
+ACE_INLINE
+TAO_FT_IOGR_Property::TAO_FT_IOGR_Property (
+ FT::TagFTGroupTaggedComponent &ft_group)
+ :ft_group_tagged_component_ (&ft_group)
+{
+}
+
+ACE_INLINE
+TAO_FT_IOGR_Property::TAO_FT_IOGR_Property (void)
+ :ft_group_tagged_component_ (0)
+{
+}
+
+ACE_INLINE
+TAO_FT_IOGR_Property::~TAO_FT_IOGR_Property (void)
+{
+}
+
+ACE_INLINE CORBA::Boolean
+TAO_FT_IOGR_Property::reset_tagged_components (
+ FT::TagFTGroupTaggedComponent &ft_group)
+{
+ this->ft_group_tagged_component_ =
+ &ft_group;
+
+ return 1;
+}
+
+TAO_END_VERSIONED_NAMESPACE_DECL
diff --git a/TAO/orbsvcs/orbsvcs/FaultTolerance/FT_Invocation_Endpoint_Selectors.cpp b/TAO/orbsvcs/orbsvcs/FaultTolerance/FT_Invocation_Endpoint_Selectors.cpp
new file mode 100644
index 00000000000..3243d7ea5fd
--- /dev/null
+++ b/TAO/orbsvcs/orbsvcs/FaultTolerance/FT_Invocation_Endpoint_Selectors.cpp
@@ -0,0 +1,235 @@
+// -*- C++ -*-
+
+#include "orbsvcs/FaultTolerance/FT_Invocation_Endpoint_Selectors.h"
+
+#include "tao/Profile_Transport_Resolver.h"
+#include "tao/Stub.h"
+#include "tao/Profile.h"
+#include "tao/Endpoint.h"
+#include "tao/Base_Transport_Property.h"
+#include "tao/Environment.h"
+#include "tao/debug.h"
+#include "ace/Log_Msg.h"
+
+ACE_RCSID (FaultTolerance,
+ FT_Invocation_Endpoint_Selectors,
+ "$Id$")
+
+TAO_BEGIN_VERSIONED_NAMESPACE_DECL
+
+TAO_FT_Invocation_Endpoint_Selector::TAO_FT_Invocation_Endpoint_Selector (void)
+ : TAO_Default_Endpoint_Selector ()
+{
+}
+
+TAO_FT_Invocation_Endpoint_Selector::~TAO_FT_Invocation_Endpoint_Selector (void)
+{
+}
+
+void
+TAO_FT_Invocation_Endpoint_Selector::select_endpoint (
+ TAO::Profile_Transport_Resolver *r,
+ ACE_Time_Value *val
+ ACE_ENV_ARG_DECL)
+{
+ bool retval =
+ this->select_primary (r,
+ val
+ ACE_ENV_ARG_PARAMETER);
+ ACE_CHECK;
+
+ if (retval)
+ return;
+
+ retval =
+ this->select_secondary (r,
+ val
+ ACE_ENV_ARG_PARAMETER);
+ ACE_CHECK;
+
+ if (retval == false)
+ {
+ // If we get here, we completely failed to find an endpoint selector
+ // that we know how to use, so throw an exception.
+ ACE_THROW (CORBA::TRANSIENT (CORBA::OMGVMCID | 2,
+ CORBA::COMPLETED_NO));
+ }
+
+ return;
+}
+
+bool
+TAO_FT_Invocation_Endpoint_Selector::select_primary (
+ TAO::Profile_Transport_Resolver *r,
+ ACE_Time_Value *max_wait_time
+ ACE_ENV_ARG_DECL)
+{
+ // Grab the forwarded list
+ TAO_MProfile *prof_list =
+ const_cast<TAO_MProfile *> (r->stub ()->forward_profiles ());
+
+ TAO_MProfile &basep = r->stub ()->base_profiles ();
+
+ if (prof_list ==0)
+ prof_list = &basep;
+
+ if (prof_list == 0)
+ return false;
+
+ // Did not succeed. Try to look for primaries all over the place
+ CORBA::ULong sz =
+ prof_list->size ();
+
+ // Iterate through the list in a circular fashion. Stop one before
+ // the list instead of trying the same thing again.
+ for (CORBA::ULong i = 0;
+ i != sz;
+ ++i)
+ {
+ TAO_Profile *tmp = prof_list->get_profile (i);
+
+ bool retval =
+ this->check_profile_for_primary (tmp
+ ACE_ENV_ARG_PARAMETER);
+ ACE_CHECK_RETURN (false);
+
+ // Choose a non-primary
+ if (retval == true && tmp != 0)
+ {
+ retval =
+ this->try_connect (r,
+ tmp,
+ max_wait_time
+ ACE_ENV_ARG_PARAMETER);
+ ACE_CHECK_RETURN (false);
+
+ if (retval == true)
+ return true;
+ }
+ }
+
+ return false;
+}
+
+bool
+TAO_FT_Invocation_Endpoint_Selector::select_secondary (
+ TAO::Profile_Transport_Resolver *r,
+ ACE_Time_Value *max_wait_time
+ ACE_ENV_ARG_DECL)
+{
+ // Grab the forwarded list
+ TAO_MProfile *prof_list =
+ const_cast<TAO_MProfile *> (r->stub ()->forward_profiles ());
+
+ TAO_MProfile &basep =
+ r->stub ()->base_profiles ();
+
+ if (prof_list ==0)
+ prof_list = &basep;
+
+ if (prof_list == 0)
+ return false;
+
+ CORBA::ULong sz =
+ prof_list->size ();
+
+ for (CORBA::ULong i = 0;
+ i != sz;
+ ++i)
+ {
+ TAO_Profile *tmp =
+ prof_list->get_profile (i);
+
+ bool retval =
+ this->check_profile_for_primary (tmp
+ ACE_ENV_ARG_PARAMETER);
+ ACE_CHECK_RETURN (false);
+
+ // Choose a non-primary
+ if (retval == false && tmp != 0)
+ {
+ retval =
+ this->try_connect (r,
+ tmp,
+ max_wait_time
+ ACE_ENV_ARG_PARAMETER);
+ ACE_CHECK_RETURN (false);
+
+ if (retval == true)
+ return true;
+ }
+ }
+
+ return false;
+}
+
+bool
+TAO_FT_Invocation_Endpoint_Selector::try_connect (
+ TAO::Profile_Transport_Resolver *r,
+ TAO_Profile *profile,
+ ACE_Time_Value *max_wait_time
+ ACE_ENV_ARG_DECL)
+{
+ r->profile (profile);
+
+ size_t endpoint_count =
+ r->profile ()->endpoint_count ();
+
+ TAO_Endpoint *ep =
+ r->profile ()->endpoint ();
+
+ for (size_t i = 0; i < endpoint_count; ++i)
+ {
+ TAO_Base_Transport_Property desc (ep);
+
+ bool retval =
+ r->try_connect (&desc,
+ max_wait_time
+ ACE_ENV_ARG_PARAMETER);
+ ACE_CHECK_RETURN (false);
+
+ // @@ Good place to handle timeouts.. We can omit timeouts and
+ // go ahead looking for other things... There are some small
+ // issues that needs ironed out first in the invocation
+ // classes.
+
+ // Check if the connect has completed.
+ if (retval)
+ return true;
+
+ // Go to the next endpoint in this profile.
+ ep = ep->next ();
+ }
+
+ return false;
+}
+
+bool
+TAO_FT_Invocation_Endpoint_Selector::check_profile_for_primary (
+ TAO_Profile *pfile
+ ACE_ENV_ARG_DECL_NOT_USED)
+{
+ if (pfile == 0)
+ return false;
+
+ IOP::TaggedComponent tagged_component;
+ tagged_component.tag = IOP::TAG_FT_PRIMARY;
+
+ // Get the tagged component from the profile
+ TAO_Tagged_Components &pfile_tagged =
+ pfile->tagged_components ();
+
+ // Search for the TaggedComponent that we want
+ if (pfile_tagged.get_component (tagged_component) != 1)
+ return false;
+
+ if (TAO_debug_level > 2)
+ {
+ ACE_DEBUG ((LM_DEBUG,
+ ACE_TEXT ("TAO_FT (%P|%t) - Got a primary component\n")));
+ }
+
+ return true;
+}
+
+TAO_END_VERSIONED_NAMESPACE_DECL
diff --git a/TAO/orbsvcs/orbsvcs/FaultTolerance/FT_Invocation_Endpoint_Selectors.h b/TAO/orbsvcs/orbsvcs/FaultTolerance/FT_Invocation_Endpoint_Selectors.h
new file mode 100644
index 00000000000..ae3a473ea34
--- /dev/null
+++ b/TAO/orbsvcs/orbsvcs/FaultTolerance/FT_Invocation_Endpoint_Selectors.h
@@ -0,0 +1,96 @@
+// -*- C++ -*-
+
+//=============================================================================
+/**
+ * @file FT_Invocation_Endpoint_Selectors.h
+ *
+ * $Id$
+ *
+ * Strategies for selecting profile/endpoint from an IOR for making an
+ * invocation.
+ *
+ * @author Balachandran Natarajan <bala@cs.wustl.edu>
+ */
+//=============================================================================
+
+
+#ifndef TAO_FT_INVOCATION_ENDPOINT_SELECTOR_H
+#define TAO_FT_INVOCATION_ENDPOINT_SELECTOR_H
+
+#include /**/ "ace/pre.h"
+
+#include "orbsvcs/FaultTolerance/FT_ClientORB_export.h"
+
+#if !defined (ACE_LACKS_PRAGMA_ONCE)
+# pragma once
+#endif /* ACE_LACKS_PRAGMA_ONCE */
+
+#include "tao/Invocation_Endpoint_Selectors.h"
+#include "tao/Basic_Types.h"
+#include "tao/ORB_Constants.h"
+
+TAO_BEGIN_VERSIONED_NAMESPACE_DECL
+
+class TAO_Profile;
+
+/**
+ * @class TAO_FT_Invocation_Endpoint_Selector
+ *
+ * @brief Implementation specific for FT_Service.
+ *
+ * We inherit from the Default endpoint selector, as this would give
+ * us a chance to use the default endpoint selector options if
+ * needed.
+ *
+ */
+
+class TAO_FT_ClientORB_Export TAO_FT_Invocation_Endpoint_Selector :
+ public TAO_Default_Endpoint_Selector
+{
+
+public:
+ /// Constructor.
+ TAO_FT_Invocation_Endpoint_Selector (void);
+
+ /// Destructor.
+ virtual ~TAO_FT_Invocation_Endpoint_Selector (void);
+
+ /// Implementation for FT. Please refer to
+ /// $TAO_ROOT/tao/Invocation_Endpoint_Selectors.h for details of
+ /// documentation.
+ virtual void select_endpoint (TAO::Profile_Transport_Resolver *r,
+ ACE_Time_Value *val
+ ACE_ENV_ARG_DECL);
+
+protected:
+ /// Select the primary and try connecting to it.
+ bool select_primary (TAO::Profile_Transport_Resolver *r,
+ ACE_Time_Value *val
+ ACE_ENV_ARG_DECL);
+
+ /// Select the secondary and try connecting to it. Returns true if
+ /// successfull.
+ bool select_secondary (TAO::Profile_Transport_Resolver *r,
+ ACE_Time_Value *val
+ ACE_ENV_ARG_DECL);
+
+ /// Helper method that tries to establish connections with all the
+ /// endpoints in the profile.
+ bool try_connect (TAO::Profile_Transport_Resolver *r,
+ TAO_Profile *profile,
+ ACE_Time_Value *max_wait_time
+ ACE_ENV_ARG_DECL);
+
+ /// Helper method that checks whether the profile is a primary or
+ /// not.
+ bool check_profile_for_primary (TAO_Profile *
+ ACE_ENV_ARG_DECL);
+
+
+};
+
+TAO_END_VERSIONED_NAMESPACE_DECL
+
+#include /**/ "ace/post.h"
+
+#endif /* FT_TAO_INVOCATION_ENDPOINT_SELECTOR_H */
diff --git a/TAO/orbsvcs/orbsvcs/FaultTolerance/FT_ORBInitializer.cpp b/TAO/orbsvcs/orbsvcs/FaultTolerance/FT_ORBInitializer.cpp
new file mode 100644
index 00000000000..3e2a732dd62
--- /dev/null
+++ b/TAO/orbsvcs/orbsvcs/FaultTolerance/FT_ORBInitializer.cpp
@@ -0,0 +1,140 @@
+// -*- C++ -*-
+//
+// $Id$
+
+#include "orbsvcs/FaultTolerance/FT_ORBInitializer.h"
+#include "orbsvcs/FaultTolerance/FT_PolicyFactory.h"
+#include "orbsvcs/FaultTolerance/FT_ClientRequest_Interceptor.h"
+#include "orbsvcs/FaultTolerance/FT_ServerRequest_Interceptor.h"
+#include "orbsvcs/FT_CORBA_ORBC.h"
+#include "tao/Exception.h"
+
+
+ACE_RCSID (FaultTolerance,
+ FT_ORBInitializer,
+ "$Id$")
+
+TAO_BEGIN_VERSIONED_NAMESPACE_DECL
+
+void
+TAO_FT_ORBInitializer::pre_init (
+ PortableInterceptor::ORBInitInfo_ptr
+ ACE_ENV_ARG_DECL_NOT_USED)
+ ACE_THROW_SPEC ((CORBA::SystemException))
+{
+}
+
+void
+TAO_FT_ORBInitializer::post_init (
+ PortableInterceptor::ORBInitInfo_ptr info
+ ACE_ENV_ARG_DECL)
+ ACE_THROW_SPEC ((CORBA::SystemException))
+{
+ this->register_policy_factories (info
+ ACE_ENV_ARG_PARAMETER);
+ ACE_CHECK;
+
+ this->register_server_request_interceptors (info
+ ACE_ENV_ARG_PARAMETER);
+ ACE_CHECK;
+
+ this->register_client_request_interceptors (info
+ ACE_ENV_ARG_PARAMETER);
+ ACE_CHECK;
+}
+
+void
+TAO_FT_ORBInitializer::register_policy_factories (
+ PortableInterceptor::ORBInitInfo_ptr info
+ ACE_ENV_ARG_DECL)
+ ACE_THROW_SPEC ((CORBA::SystemException))
+{
+ // Register the FTCORBA policy factories.
+
+ PortableInterceptor::PolicyFactory_ptr temp_factory =
+ PortableInterceptor::PolicyFactory::_nil ();
+ PortableInterceptor::PolicyFactory_var policy_factory;
+
+ // This policy factory is used for all FTCORBA related policies.
+
+ ACE_NEW_THROW_EX (temp_factory,
+ TAO_FT_PolicyFactory,
+ CORBA::NO_MEMORY (
+ CORBA::SystemException::_tao_minor_code (
+ TAO::VMCID,
+ ENOMEM),
+ CORBA::COMPLETED_NO));
+ ACE_CHECK;
+
+ policy_factory = temp_factory;
+
+ // Bind the same policy factory to all RTCORBA related policy
+ // types since a single policy factory is used to create each of
+ // the different types of RTCORBA policies.
+
+ CORBA::PolicyType type = FT::REQUEST_DURATION_POLICY;
+ info->register_policy_factory (type,
+ policy_factory.in ()
+ ACE_ENV_ARG_PARAMETER);
+ ACE_CHECK;
+
+ type = FT::HEARTBEAT_POLICY;
+ info->register_policy_factory (type,
+ policy_factory.in ()
+ ACE_ENV_ARG_PARAMETER);
+ ACE_CHECK;
+
+ type = FT::HEARTBEAT_ENABLED_POLICY;
+ info->register_policy_factory (type,
+ policy_factory.in ()
+ ACE_ENV_ARG_PARAMETER);
+ ACE_CHECK;
+
+ // Transfer ownership of the policy factory to the registry.
+ (void) policy_factory._retn ();
+}
+
+void
+TAO_FT_ORBInitializer::register_server_request_interceptors (
+ PortableInterceptor::ORBInitInfo_ptr info
+ ACE_ENV_ARG_DECL)
+ ACE_THROW_SPEC ((CORBA::SystemException))
+{
+ PortableInterceptor::ServerRequestInterceptor_ptr sri =
+ PortableInterceptor::ServerRequestInterceptor::_nil ();
+
+ ACE_NEW_THROW_EX (sri,
+ TAO::FT_ServerRequest_Interceptor,
+ CORBA::NO_MEMORY ());
+
+ PortableInterceptor::ServerRequestInterceptor_var
+ server_interceptor = sri;
+
+ info->add_server_request_interceptor (server_interceptor.in ()
+ ACE_ENV_ARG_PARAMETER);
+ ACE_CHECK;
+}
+
+
+void
+TAO_FT_ORBInitializer::register_client_request_interceptors (
+ PortableInterceptor::ORBInitInfo_ptr info
+ ACE_ENV_ARG_DECL)
+ ACE_THROW_SPEC ((CORBA::SystemException))
+{
+ PortableInterceptor::ClientRequestInterceptor_ptr cri =
+ PortableInterceptor::ClientRequestInterceptor::_nil ();
+
+ ACE_NEW_THROW_EX (cri,
+ TAO::FT_ClientRequest_Interceptor,
+ CORBA::NO_MEMORY ());
+
+ PortableInterceptor::ClientRequestInterceptor_var
+ client_interceptor = cri;
+
+ info->add_client_request_interceptor (client_interceptor.in ()
+ ACE_ENV_ARG_PARAMETER);
+ ACE_CHECK;
+}
+
+TAO_END_VERSIONED_NAMESPACE_DECL
diff --git a/TAO/orbsvcs/orbsvcs/FaultTolerance/FT_ORBInitializer.h b/TAO/orbsvcs/orbsvcs/FaultTolerance/FT_ORBInitializer.h
new file mode 100644
index 00000000000..8493a77ddac
--- /dev/null
+++ b/TAO/orbsvcs/orbsvcs/FaultTolerance/FT_ORBInitializer.h
@@ -0,0 +1,79 @@
+// -*- C++ -*-
+
+//=============================================================================
+/**
+ * @file FT_ORBInitializer.h
+ *
+ * $Id$
+ *
+ * @author Balachandran Natarajan <bala@cs.wustl.edu>
+ */
+//=============================================================================
+#ifndef TAO_FT_ORB_INITIALIZER_H
+#define TAO_FT_ORB_INITIALIZER_H
+
+#include /**/ "ace/pre.h"
+
+#include "tao/corbafwd.h"
+
+#if !defined (ACE_LACKS_PRAGMA_ONCE)
+# pragma once
+#endif /* ACE_LACKS_PRAGMA_ONCE */
+
+#include "tao/PortableInterceptorC.h"
+#include "tao/LocalObject.h"
+#include "orbsvcs/FaultTolerance/fault_tol_export.h"
+
+// This is to remove "inherits via dominance" warnings from MSVC.
+// MSVC is being a little too paranoid.
+#if defined(_MSC_VER)
+#pragma warning(push)
+#pragma warning(disable:4250)
+#endif /* _MSC_VER */
+
+TAO_BEGIN_VERSIONED_NAMESPACE_DECL
+
+/// RTCORBA ORB initializer.
+class TAO_FT_ORBInitializer
+ : public virtual PortableInterceptor::ORBInitializer
+ , public virtual TAO_Local_RefCounted_Object
+{
+public:
+
+ virtual void pre_init (PortableInterceptor::ORBInitInfo_ptr info
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS)
+ ACE_THROW_SPEC ((CORBA::SystemException));
+
+ virtual void post_init (PortableInterceptor::ORBInitInfo_ptr info
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS)
+ ACE_THROW_SPEC ((CORBA::SystemException));
+
+private:
+
+ /// Register FTCORBA policy factories.
+ void register_policy_factories (
+ PortableInterceptor::ORBInitInfo_ptr info
+ ACE_ENV_ARG_DECL)
+ ACE_THROW_SPEC ((CORBA::SystemException));
+
+ /// Register the necessary interceptors.
+ void register_server_request_interceptors (
+ PortableInterceptor::ORBInitInfo_ptr info
+ ACE_ENV_ARG_DECL)
+ ACE_THROW_SPEC ((CORBA::SystemException));
+
+ void register_client_request_interceptors (
+ PortableInterceptor::ORBInitInfo_ptr info
+ ACE_ENV_ARG_DECL)
+ ACE_THROW_SPEC ((CORBA::SystemException));
+};
+
+TAO_END_VERSIONED_NAMESPACE_DECL
+
+#if defined(_MSC_VER)
+#pragma warning(pop)
+#endif /* _MSC_VER */
+
+#include /**/ "ace/post.h"
+
+#endif /* TAO_FT_ORB_INITIALIZER_H */
diff --git a/TAO/orbsvcs/orbsvcs/FaultTolerance/FT_ORB_Utils_export.h b/TAO/orbsvcs/orbsvcs/FaultTolerance/FT_ORB_Utils_export.h
new file mode 100644
index 00000000000..f492009ae85
--- /dev/null
+++ b/TAO/orbsvcs/orbsvcs/FaultTolerance/FT_ORB_Utils_export.h
@@ -0,0 +1,60 @@
+
+// -*- C++ -*-
+// $Id$
+// Definition for Win32 Export directives.
+// This file is generated automatically by generate_export_file.pl TAO_FT_ORB_Utils
+// ------------------------------
+#ifndef TAO_FT_ORB_UTILS_EXPORT_H
+#define TAO_FT_ORB_UTILS_EXPORT_H
+
+#include "ace/config-all.h"
+
+#if defined (TAO_AS_STATIC_LIBS)
+# if !defined (TAO_FT_ORB_UTILS_HAS_DLL)
+# define TAO_FT_ORB_UTILS_HAS_DLL 0
+# endif /* ! TAO_FT_ORB_UTILS_HAS_DLL */
+#else
+# if !defined (TAO_FT_ORB_UTILS_HAS_DLL)
+# define TAO_FT_ORB_UTILS_HAS_DLL 1
+# endif /* ! TAO_FT_ORB_UTILS_HAS_DLL */
+#endif
+
+#if defined (TAO_FT_ORB_UTILS_HAS_DLL) && (TAO_FT_ORB_UTILS_HAS_DLL == 1)
+# if defined (TAO_FT_ORB_UTILS_BUILD_DLL)
+# define TAO_FT_ORB_Utils_Export ACE_Proper_Export_Flag
+# define TAO_FT_ORB_UTILS_SINGLETON_DECLARATION(T) ACE_EXPORT_SINGLETON_DECLARATION (T)
+# define TAO_FT_ORB_UTILS_SINGLETON_DECLARE(SINGLETON_TYPE, CLASS, LOCK) ACE_EXPORT_SINGLETON_DECLARE(SINGLETON_TYPE, CLASS, LOCK)
+# else /* TAO_FT_ORB_UTILS_BUILD_DLL */
+# define TAO_FT_ORB_Utils_Export ACE_Proper_Import_Flag
+# define TAO_FT_ORB_UTILS_SINGLETON_DECLARATION(T) ACE_IMPORT_SINGLETON_DECLARATION (T)
+# define TAO_FT_ORB_UTILS_SINGLETON_DECLARE(SINGLETON_TYPE, CLASS, LOCK) ACE_IMPORT_SINGLETON_DECLARE(SINGLETON_TYPE, CLASS, LOCK)
+# endif /* TAO_FT_ORB_UTILS_BUILD_DLL */
+#else /* TAO_FT_ORB_UTILS_HAS_DLL == 1 */
+# define TAO_FT_ORB_Utils_Export
+# define TAO_FT_ORB_UTILS_SINGLETON_DECLARATION(T)
+# define TAO_FT_ORB_UTILS_SINGLETON_DECLARE(SINGLETON_TYPE, CLASS, LOCK)
+#endif /* TAO_FT_ORB_UTILS_HAS_DLL == 1 */
+
+// Set TAO_FT_ORB_UTILS_NTRACE = 0 to turn on library specific tracing even if
+// tracing is turned off for ACE.
+#if !defined (TAO_FT_ORB_UTILS_NTRACE)
+# if (ACE_NTRACE == 1)
+# define TAO_FT_ORB_UTILS_NTRACE 1
+# else /* (ACE_NTRACE == 1) */
+# define TAO_FT_ORB_UTILS_NTRACE 0
+# endif /* (ACE_NTRACE == 1) */
+#endif /* !TAO_FT_ORB_UTILS_NTRACE */
+
+#if (TAO_FT_ORB_UTILS_NTRACE == 1)
+# define TAO_FT_ORB_UTILS_TRACE(X)
+#else /* (TAO_FT_ORB_UTILS_NTRACE == 1) */
+# if !defined (ACE_HAS_TRACE)
+# define ACE_HAS_TRACE
+# endif /* ACE_HAS_TRACE */
+# define TAO_FT_ORB_UTILS_TRACE(X) ACE_TRACE_IMPL(X)
+# include "ace/Trace.h"
+#endif /* (TAO_FT_ORB_UTILS_NTRACE == 1) */
+
+#endif /* TAO_FT_ORB_UTILS_EXPORT_H */
+
+// End of auto generated file.
diff --git a/TAO/orbsvcs/orbsvcs/FaultTolerance/FT_PolicyFactory.cpp b/TAO/orbsvcs/orbsvcs/FaultTolerance/FT_PolicyFactory.cpp
new file mode 100644
index 00000000000..74758912067
--- /dev/null
+++ b/TAO/orbsvcs/orbsvcs/FaultTolerance/FT_PolicyFactory.cpp
@@ -0,0 +1,38 @@
+// -*- C++ -*-
+//
+// $Id$
+
+#include "orbsvcs/FaultTolerance/FT_PolicyFactory.h"
+#include "orbsvcs/FaultTolerance/FT_Policy_i.h"
+#include "orbsvcs/FT_CORBA_ORBC.h"
+#include "tao/PolicyC.h"
+
+
+ACE_RCSID (FaultTolerance, FT_PolicyFactory, "$Id$")
+
+TAO_BEGIN_VERSIONED_NAMESPACE_DECL
+
+CORBA::Policy_ptr
+TAO_FT_PolicyFactory::create_policy (
+ CORBA::PolicyType type,
+ const CORBA::Any &val
+ ACE_ENV_ARG_DECL)
+ ACE_THROW_SPEC ((CORBA::SystemException,
+ CORBA::PolicyError))
+{
+
+ if (type == FT::REQUEST_DURATION_POLICY)
+ return TAO_FT_Request_Duration_Policy::create (val
+ ACE_ENV_ARG_PARAMETER);
+ else if (type == FT::HEARTBEAT_POLICY)
+ return TAO_FT_Heart_Beat_Policy::create (val
+ ACE_ENV_ARG_PARAMETER);
+ else if (type == FT::HEARTBEAT_ENABLED_POLICY)
+ return TAO_FT_Heart_Beat_Enabled_Policy::create (val
+ ACE_ENV_ARG_PARAMETER);
+
+ ACE_THROW_RETURN (CORBA::PolicyError (CORBA::BAD_POLICY_TYPE),
+ CORBA::Policy::_nil ());
+}
+
+TAO_END_VERSIONED_NAMESPACE_DECL
diff --git a/TAO/orbsvcs/orbsvcs/FaultTolerance/FT_PolicyFactory.h b/TAO/orbsvcs/orbsvcs/FaultTolerance/FT_PolicyFactory.h
new file mode 100644
index 00000000000..bb71603c077
--- /dev/null
+++ b/TAO/orbsvcs/orbsvcs/FaultTolerance/FT_PolicyFactory.h
@@ -0,0 +1,63 @@
+// -*- C++ -*-
+
+//=============================================================================
+/**
+ * @file FT_PolicyFactory.h
+ *
+ * $Id$
+ *
+ * @author Bala Natarajan <bala@cs.wustl.edu>
+ */
+//=============================================================================
+
+
+#ifndef TAO_FT_POLICY_FACTORY_H
+#define TAO_FT_POLICY_FACTORY_H
+
+#include /**/ "ace/pre.h"
+
+#include "tao/corbafwd.h"
+
+
+#if !defined (ACE_LACKS_PRAGMA_ONCE)
+# pragma once
+#endif /* ACE_LACKS_PRAGMA_ONCE */
+
+#include "tao/PortableInterceptorC.h"
+#include "tao/LocalObject.h"
+
+// This is to remove "inherits via dominance" warnings from MSVC.
+// MSVC is being a little too paranoid.
+#if defined(_MSC_VER)
+#pragma warning(push)
+#pragma warning(disable:4250)
+#endif /* _MSC_VER */
+
+#include "orbsvcs/FaultTolerance/fault_tol_export.h"
+
+TAO_BEGIN_VERSIONED_NAMESPACE_DECL
+
+/// Policy factory for all FTCORBA related policies.
+class TAO_FT_PolicyFactory
+ : public PortableInterceptor::PolicyFactory
+ , public TAO_Local_RefCounted_Object
+{
+public:
+
+ virtual CORBA::Policy_ptr create_policy (CORBA::PolicyType type,
+ const CORBA::Any &value
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS)
+ ACE_THROW_SPEC ((CORBA::SystemException,
+ CORBA::PolicyError));
+};
+
+TAO_END_VERSIONED_NAMESPACE_DECL
+
+#if defined(_MSC_VER)
+#pragma warning(pop)
+#endif /* _MSC_VER */
+
+
+#include /**/ "ace/post.h"
+
+#endif /* TAO_FT_POLICY_FACTORY_H */
diff --git a/TAO/orbsvcs/orbsvcs/FaultTolerance/FT_Policy_i.cpp b/TAO/orbsvcs/orbsvcs/FaultTolerance/FT_Policy_i.cpp
new file mode 100644
index 00000000000..c24aa921d17
--- /dev/null
+++ b/TAO/orbsvcs/orbsvcs/FaultTolerance/FT_Policy_i.cpp
@@ -0,0 +1,259 @@
+//$Id$
+#include "orbsvcs/FaultTolerance/FT_Policy_i.h"
+
+#include "tao/debug.h"
+
+#if !defined (__ACE_INLINE__)
+#include "orbsvcs/FaultTolerance/FT_Policy_i.inl"
+#endif /* __ACE_INLINE__ */
+
+ACE_RCSID(FaultTolerance, FT_Policy_i, "$Id$")
+
+TAO_BEGIN_VERSIONED_NAMESPACE_DECL
+
+TimeBase::TimeT
+TAO_FT_Request_Duration_Policy::request_duration_policy_value (ACE_ENV_SINGLE_ARG_DECL_NOT_USED)
+ ACE_THROW_SPEC ((CORBA::SystemException))
+{
+ return this->request_duration_;
+}
+
+CORBA::PolicyType
+TAO_FT_Request_Duration_Policy::policy_type (ACE_ENV_SINGLE_ARG_DECL_NOT_USED)
+ ACE_THROW_SPEC ((CORBA::SystemException))
+{
+ return FT::REQUEST_DURATION_POLICY;
+}
+
+CORBA::Policy_ptr
+TAO_FT_Request_Duration_Policy::create (const CORBA::Any& val
+ ACE_ENV_ARG_DECL)
+{
+ TimeBase::TimeT value;
+ if ((val >>= value) == 0)
+ ACE_THROW_RETURN (CORBA::PolicyError (CORBA::BAD_POLICY_TYPE),
+ CORBA::Policy::_nil ());
+
+ TAO_FT_Request_Duration_Policy *tmp;
+ ACE_NEW_THROW_EX (tmp,
+ TAO_FT_Request_Duration_Policy (value),
+ CORBA::NO_MEMORY (TAO::VMCID,
+ CORBA::COMPLETED_NO));
+ ACE_CHECK_RETURN (CORBA::Policy::_nil ());
+
+ return tmp;
+}
+
+TAO_FT_Request_Duration_Policy *
+TAO_FT_Request_Duration_Policy::clone (void) const
+{
+ TAO_FT_Request_Duration_Policy *copy = 0;
+ ACE_NEW_RETURN (copy,
+ TAO_FT_Request_Duration_Policy (*this),
+ 0);
+ return copy;
+}
+
+CORBA::Policy_ptr
+TAO_FT_Request_Duration_Policy::copy (ACE_ENV_SINGLE_ARG_DECL)
+ ACE_THROW_SPEC ((CORBA::SystemException))
+{
+ TAO_FT_Request_Duration_Policy* tmp;
+ ACE_NEW_THROW_EX (tmp, TAO_FT_Request_Duration_Policy (*this),
+ CORBA::NO_MEMORY (TAO::VMCID,
+ CORBA::COMPLETED_NO));
+ ACE_CHECK_RETURN (CORBA::Policy::_nil ());
+
+ return tmp;
+}
+
+void
+TAO_FT_Request_Duration_Policy::destroy (ACE_ENV_SINGLE_ARG_DECL_NOT_USED)
+ ACE_THROW_SPEC ((CORBA::SystemException))
+{
+}
+
+void
+TAO_FT_Request_Duration_Policy::set_time_value (ACE_Time_Value &time_value)
+{
+ TimeBase::TimeT t = this->request_duration_;
+ TimeBase::TimeT seconds = t / 10000000u;
+ TimeBase::TimeT microseconds = (t % 10000000u) / 10;
+ time_value.set (ACE_U64_TO_U32 (seconds),
+ ACE_U64_TO_U32 (microseconds));
+
+ if (TAO_debug_level > 0)
+ {
+ CORBA::ULong msecs =
+ static_cast<CORBA::ULong> (microseconds / 1000);
+ ACE_DEBUG ((LM_DEBUG,
+ ACE_TEXT ("TAO_FT (%P|%t) - Timeout is <%u>\n"),
+ msecs));
+ }
+}
+
+
+/*****************************************************************/
+
+FT::HeartbeatPolicyValue
+TAO_FT_Heart_Beat_Policy::heartbeat_policy_value (ACE_ENV_SINGLE_ARG_DECL_NOT_USED)
+ ACE_THROW_SPEC ((CORBA::SystemException))
+{
+ FT::HeartbeatPolicyValue val;
+ val.heartbeat = this->heartbeat_;
+ val.heartbeat_interval = this->heartbeat_interval_;
+ val.heartbeat_timeout = this->heartbeat_timeout_;
+
+ return val;
+}
+
+
+CORBA::Policy_ptr
+TAO_FT_Heart_Beat_Policy::create (const CORBA::Any& val
+ ACE_ENV_ARG_DECL)
+{
+ FT::HeartbeatPolicyValue *value;
+ if ((val >>= value) == 0)
+ ACE_THROW_RETURN (CORBA::PolicyError (CORBA::BAD_POLICY_TYPE),
+ CORBA::Policy::_nil ());
+
+ TAO_FT_Heart_Beat_Policy *tmp;
+ ACE_NEW_THROW_EX (tmp,
+ TAO_FT_Heart_Beat_Policy (value->heartbeat,
+ value->heartbeat_interval,
+ value->heartbeat_timeout),
+ CORBA::NO_MEMORY (TAO::VMCID,
+ CORBA::COMPLETED_NO));
+ ACE_CHECK_RETURN (CORBA::Policy::_nil ());
+
+ return tmp;
+}
+
+
+CORBA::PolicyType
+TAO_FT_Heart_Beat_Policy::policy_type (ACE_ENV_SINGLE_ARG_DECL_NOT_USED)
+ ACE_THROW_SPEC ((CORBA::SystemException))
+{
+ return FT::HEARTBEAT_POLICY;
+}
+
+
+CORBA::Policy_ptr
+TAO_FT_Heart_Beat_Policy::copy (ACE_ENV_SINGLE_ARG_DECL)
+ ACE_THROW_SPEC ((CORBA::SystemException))
+{
+ TAO_FT_Heart_Beat_Policy * tmp;
+ ACE_NEW_THROW_EX (tmp, TAO_FT_Heart_Beat_Policy (*this),
+ CORBA::NO_MEMORY (TAO::VMCID,
+ CORBA::COMPLETED_NO));
+ ACE_CHECK_RETURN (CORBA::Policy::_nil ());
+
+ return tmp;
+}
+
+TAO_FT_Heart_Beat_Policy *
+TAO_FT_Heart_Beat_Policy::clone (void) const
+{
+ TAO_FT_Heart_Beat_Policy *copy = 0;
+ ACE_NEW_RETURN (copy,
+ TAO_FT_Heart_Beat_Policy (*this),
+ 0);
+ return copy;
+}
+
+void
+TAO_FT_Heart_Beat_Policy::destroy (ACE_ENV_SINGLE_ARG_DECL_NOT_USED)
+ ACE_THROW_SPEC ((CORBA::SystemException))
+{
+}
+
+void
+TAO_FT_Heart_Beat_Policy::set_time_value (ACE_Time_Value &time_value,
+ const TimeBase::TimeT &timebase)
+{
+ TimeBase::TimeT t = timebase;
+ TimeBase::TimeT seconds = t / 10000000u;
+ TimeBase::TimeT microseconds = (t % 10000000u) / 10;
+ time_value.set (ACE_U64_TO_U32 (seconds),
+ ACE_U64_TO_U32 (microseconds));
+
+ if (TAO_debug_level > 0)
+ {
+ CORBA::ULong msecs =
+ static_cast<CORBA::ULong> (microseconds / 1000);
+ ACE_DEBUG ((LM_DEBUG,
+ ACE_TEXT ("TAO_FT (%P|%t) - Timeout is <%u>\n"),
+ msecs));
+ }
+}
+
+/******************************************************************/
+
+CORBA::Boolean
+TAO_FT_Heart_Beat_Enabled_Policy::heartbeat_enabled_policy_value (
+ ACE_ENV_SINGLE_ARG_DECL_NOT_USED)
+ ACE_THROW_SPEC ((CORBA::SystemException))
+{
+ return this->heartbeat_enabled_value_;
+}
+
+
+CORBA::Policy_ptr
+TAO_FT_Heart_Beat_Enabled_Policy::create (const CORBA::Any& val
+ ACE_ENV_ARG_DECL)
+{
+ CORBA::Boolean value;
+
+ if ((val >>= CORBA::Any::to_boolean (value)) == 0)
+ ACE_THROW_RETURN (CORBA::PolicyError (CORBA::BAD_POLICY_TYPE),
+ CORBA::Policy::_nil ());
+
+ TAO_FT_Heart_Beat_Enabled_Policy *tmp;
+ ACE_NEW_THROW_EX (tmp,
+ TAO_FT_Heart_Beat_Enabled_Policy (value),
+ CORBA::NO_MEMORY (TAO::VMCID,
+ CORBA::COMPLETED_NO));
+ ACE_CHECK_RETURN (CORBA::Policy::_nil ());
+
+ return tmp;
+}
+
+CORBA::PolicyType
+TAO_FT_Heart_Beat_Enabled_Policy::policy_type (ACE_ENV_SINGLE_ARG_DECL_NOT_USED)
+ ACE_THROW_SPEC ((CORBA::SystemException))
+{
+ return FT::HEARTBEAT_ENABLED_POLICY;
+}
+
+
+CORBA::Policy_ptr
+TAO_FT_Heart_Beat_Enabled_Policy::copy (ACE_ENV_SINGLE_ARG_DECL)
+ ACE_THROW_SPEC ((CORBA::SystemException))
+{
+ TAO_FT_Heart_Beat_Enabled_Policy * tmp;
+ ACE_NEW_THROW_EX (tmp, TAO_FT_Heart_Beat_Enabled_Policy (*this),
+ CORBA::NO_MEMORY (TAO::VMCID,
+ CORBA::COMPLETED_NO));
+ ACE_CHECK_RETURN (CORBA::Policy::_nil ());
+
+ return tmp;
+}
+
+TAO_FT_Heart_Beat_Enabled_Policy *
+TAO_FT_Heart_Beat_Enabled_Policy::clone (void) const
+{
+ TAO_FT_Heart_Beat_Enabled_Policy *copy = 0;
+ ACE_NEW_RETURN (copy,
+ TAO_FT_Heart_Beat_Enabled_Policy (*this),
+ 0);
+ return copy;
+}
+
+
+void
+TAO_FT_Heart_Beat_Enabled_Policy::destroy (ACE_ENV_SINGLE_ARG_DECL_NOT_USED)
+ ACE_THROW_SPEC ((CORBA::SystemException))
+{
+}
+
+TAO_END_VERSIONED_NAMESPACE_DECL
diff --git a/TAO/orbsvcs/orbsvcs/FaultTolerance/FT_Policy_i.h b/TAO/orbsvcs/orbsvcs/FaultTolerance/FT_Policy_i.h
new file mode 100644
index 00000000000..8fd5f3a1fc8
--- /dev/null
+++ b/TAO/orbsvcs/orbsvcs/FaultTolerance/FT_Policy_i.h
@@ -0,0 +1,217 @@
+// -*- C++ -*-
+
+//=============================================================================
+/**
+ * @file FT_Policy_i.h
+ *
+ * $Id$
+ *
+ * @author Balachandran Natarajan <bala@cs.wustl.edu>
+ */
+//=============================================================================
+
+
+#ifndef TAO_FT_POLICY_I_H
+#define TAO_FT_POLICY_I_H
+#include /**/ "ace/pre.h"
+
+#include "orbsvcs/FT_CORBA_ORBC.h"
+
+#if defined(_MSC_VER)
+#pragma warning(push)
+#pragma warning(disable:4250)
+#endif /* _MSC_VER */
+
+
+TAO_BEGIN_VERSIONED_NAMESPACE_DECL
+
+/**
+ * @class TAO_FT_Request_Duration_Policy
+ *
+ * @brief FT::RequestDurationPolicy implementation
+ *
+ * This policy controls the request duration in the ORB. The
+ * semantics are like this. On the server side, the server should
+ * retain the details of the request from the client (and the
+ * reply sent to it too) atleast for the time period specified by
+ * this policy value. On the client side, the client uses this
+ * value to calculate the expiration_id in the RequestService
+ * context. The expiration_id is a sort of timeout for the client
+ * to keep trying to connect to server object groups under certain
+ * conditions.
+ */
+class TAO_FT_Request_Duration_Policy
+ : public FT::RequestDurationPolicy,
+ public TAO_Local_RefCounted_Object
+{
+public:
+
+ /// Constructor.
+ TAO_FT_Request_Duration_Policy (const TimeBase::TimeT& relative_expiry);
+
+ /// Copy constructor.
+ TAO_FT_Request_Duration_Policy (const TAO_FT_Request_Duration_Policy &rhs);
+
+ /// Helper method for the implementation of
+ /// CORBA::ORB::create_policy.
+ static CORBA::Policy_ptr create (const CORBA::Any& val
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS);
+
+ /// Returns a copy of <this>.
+ virtual TAO_FT_Request_Duration_Policy *clone (void) const;
+
+ // = The FT::RequestDurationPolicy methods
+ virtual TimeBase::TimeT request_duration_policy_value (ACE_ENV_SINGLE_ARG_DECL)
+ ACE_THROW_SPEC ((CORBA::SystemException));
+
+ virtual CORBA::PolicyType policy_type (
+ ACE_ENV_SINGLE_ARG_DECL_WITH_DEFAULTS)
+ ACE_THROW_SPEC ((CORBA::SystemException));
+
+ virtual CORBA::Policy_ptr copy (
+ ACE_ENV_SINGLE_ARG_DECL_WITH_DEFAULTS)
+ ACE_THROW_SPEC ((CORBA::SystemException));
+
+ virtual void destroy (
+ ACE_ENV_SINGLE_ARG_DECL_WITH_DEFAULTS)
+ ACE_THROW_SPEC ((CORBA::SystemException));
+
+ /// Change the CORBA representation to the ACE representation.
+ void set_time_value (ACE_Time_Value &time_value);
+
+private:
+ /// The attribute
+ TimeBase::TimeT request_duration_;
+};
+
+
+/**
+ * @class TAO_FT_Heart_Beat_Policy
+ *
+ * @brief FT::HeartBeatPolicy
+ *
+ * If this policy is set, it enables the client ORB to send
+ * heartbeats to the server ORB over the open connections.
+ */
+class TAO_FT_Export TAO_FT_Heart_Beat_Policy
+ : public FT::HeartbeatPolicy,
+ public TAO_Local_RefCounted_Object
+{
+public:
+
+ /// Constructor.
+ TAO_FT_Heart_Beat_Policy (const CORBA::Boolean boolean,
+ const TimeBase::TimeT &interval,
+ const TimeBase::TimeT &timeout);
+
+ /// Copy constructor.
+ TAO_FT_Heart_Beat_Policy (const TAO_FT_Heart_Beat_Policy &rhs);
+
+ /// Helper method for the implementation of
+ /// CORBA::ORB::create_policy.
+ static CORBA::Policy_ptr create (const CORBA::Any& val
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS);
+
+ /// Returns a copy of <this>.
+ virtual TAO_FT_Heart_Beat_Policy *clone (void) const;
+
+ // = The FT::HeartBeatPolicy methods
+ virtual FT::HeartbeatPolicyValue heartbeat_policy_value (ACE_ENV_SINGLE_ARG_DECL)
+ ACE_THROW_SPEC ((CORBA::SystemException));
+
+ virtual CORBA::PolicyType policy_type (
+ ACE_ENV_SINGLE_ARG_DECL_WITH_DEFAULTS)
+ ACE_THROW_SPEC ((CORBA::SystemException));
+
+ virtual CORBA::Policy_ptr copy (
+ ACE_ENV_SINGLE_ARG_DECL_WITH_DEFAULTS)
+ ACE_THROW_SPEC ((CORBA::SystemException));
+
+ virtual void destroy (
+ ACE_ENV_SINGLE_ARG_DECL_WITH_DEFAULTS)
+ ACE_THROW_SPEC ((CORBA::SystemException));
+
+ /// Change the CORBA representation to the ACE representation.
+ void set_time_value (ACE_Time_Value &time_value,
+ const TimeBase::TimeT &timebase);
+
+private:
+
+ // The attributes
+ /// <heartbeat_> indicates whether heartbeating is enabled or not.
+ CORBA::Boolean heartbeat_;
+
+ /// Intervals in which heartbeat messages need to be sent
+ TimeBase::TimeT heartbeat_interval_;
+
+ /// The timeouts for the heartbeats
+ TimeBase::TimeT heartbeat_timeout_;
+};
+
+/**
+ * @class TAO_FT_Heart_Beat_Enabled_Policy
+ *
+ * @brief FT::HeartBeatEnabledPolicy
+ *
+ * If this policy is set, it enables the server ORB to set
+ * the TAG_FT_HEARTBEAT_ENABLED component in the IOP profile of
+ * the IOR that it exposes
+ */
+class TAO_FT_Export TAO_FT_Heart_Beat_Enabled_Policy
+ : public FT::HeartbeatEnabledPolicy,
+ public TAO_Local_RefCounted_Object
+{
+public:
+
+ /// Constructor.
+ TAO_FT_Heart_Beat_Enabled_Policy (const CORBA::Boolean boolean);
+
+ /// Copy constructor.
+ TAO_FT_Heart_Beat_Enabled_Policy (
+ const TAO_FT_Heart_Beat_Enabled_Policy &rhs);
+
+ static CORBA::Policy_ptr create (const CORBA::Any& val
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS);
+
+ // Helper method for the implementation of
+ // CORBA::ORB::create_policy.
+
+ /// Returns a copy of <this>.
+ virtual TAO_FT_Heart_Beat_Enabled_Policy *clone (void) const;
+
+ // = The FT::HeartBeatPolicy methods
+ virtual CORBA::Boolean heartbeat_enabled_policy_value (
+ ACE_ENV_SINGLE_ARG_DECL)
+ ACE_THROW_SPEC ((CORBA::SystemException));
+
+ virtual CORBA::PolicyType policy_type (
+ ACE_ENV_SINGLE_ARG_DECL_WITH_DEFAULTS)
+ ACE_THROW_SPEC ((CORBA::SystemException));
+
+ virtual CORBA::Policy_ptr copy (
+ ACE_ENV_SINGLE_ARG_DECL_WITH_DEFAULTS)
+ ACE_THROW_SPEC ((CORBA::SystemException));
+
+ virtual void destroy (
+ ACE_ENV_SINGLE_ARG_DECL_WITH_DEFAULTS)
+ ACE_THROW_SPEC ((CORBA::SystemException));
+
+private:
+
+ /// indicates whether heartbeating is enabled or not.
+ CORBA::Boolean heartbeat_enabled_value_;
+};
+
+TAO_END_VERSIONED_NAMESPACE_DECL
+
+#if defined(_MSC_VER)
+#pragma warning(pop)
+#endif /* _MSC_VER */
+
+#if defined (__ACE_INLINE__)
+#include "orbsvcs/FaultTolerance/FT_Policy_i.inl"
+#endif /* __ACE_INLINE__ */
+
+
+#include /**/ "ace/post.h"
+#endif /* TAO_FT_POLICY_I_H */
diff --git a/TAO/orbsvcs/orbsvcs/FaultTolerance/FT_Policy_i.inl b/TAO/orbsvcs/orbsvcs/FaultTolerance/FT_Policy_i.inl
new file mode 100644
index 00000000000..3aa80e1b0a1
--- /dev/null
+++ b/TAO/orbsvcs/orbsvcs/FaultTolerance/FT_Policy_i.inl
@@ -0,0 +1,80 @@
+// -*- C++ -*-
+//
+//$Id$
+
+TAO_BEGIN_VERSIONED_NAMESPACE_DECL
+
+ACE_INLINE
+TAO_FT_Request_Duration_Policy::TAO_FT_Request_Duration_Policy (const TimeBase::TimeT &duration)
+ :ACE_NESTED_CLASS (CORBA, Object) ()
+ , ACE_NESTED_CLASS (CORBA, Policy) ()
+ , ACE_NESTED_CLASS (CORBA, LocalObject) ()
+ , TAO_Local_RefCounted_Object ()
+ , request_duration_ (duration)
+{
+}
+
+ACE_INLINE
+TAO_FT_Request_Duration_Policy::TAO_FT_Request_Duration_Policy (const TAO_FT_Request_Duration_Policy &rhs)
+ :ACE_NESTED_CLASS (CORBA, Object) ()
+ , ACE_NESTED_CLASS (CORBA, Policy) ()
+ , ACE_NESTED_CLASS (CORBA, LocalObject) ()
+ , FT::RequestDurationPolicy ()
+ , TAO_Local_RefCounted_Object ()
+ , request_duration_ (rhs.request_duration_)
+{
+}
+
+ACE_INLINE
+TAO_FT_Heart_Beat_Policy::TAO_FT_Heart_Beat_Policy (
+ const CORBA::Boolean heartbeat,
+ const TimeBase::TimeT &interval,
+ const TimeBase::TimeT &timeout)
+ : ACE_NESTED_CLASS (CORBA, Object) ()
+ , ACE_NESTED_CLASS (CORBA, Policy) ()
+ , ACE_NESTED_CLASS (CORBA, LocalObject) ()
+ , TAO_Local_RefCounted_Object ()
+ , heartbeat_ (heartbeat)
+ , heartbeat_interval_ (interval)
+ , heartbeat_timeout_ (timeout)
+{
+}
+
+ACE_INLINE
+TAO_FT_Heart_Beat_Policy::TAO_FT_Heart_Beat_Policy (const TAO_FT_Heart_Beat_Policy &rhs)
+ : ACE_NESTED_CLASS (CORBA, Object) ()
+ , ACE_NESTED_CLASS (CORBA, Policy) ()
+ , ACE_NESTED_CLASS (CORBA, LocalObject) ()
+ , FT::HeartbeatPolicy ()
+ , TAO_Local_RefCounted_Object ()
+ , heartbeat_ (rhs.heartbeat_)
+ , heartbeat_interval_ (rhs.heartbeat_interval_)
+ , heartbeat_timeout_ (rhs.heartbeat_timeout_)
+{
+}
+
+
+ACE_INLINE
+TAO_FT_Heart_Beat_Enabled_Policy::TAO_FT_Heart_Beat_Enabled_Policy (
+ const CORBA::Boolean heartbeat)
+ : ACE_NESTED_CLASS (CORBA, Object) ()
+ , ACE_NESTED_CLASS (CORBA, Policy) ()
+ , ACE_NESTED_CLASS (CORBA, LocalObject) ()
+ , TAO_Local_RefCounted_Object ()
+ , heartbeat_enabled_value_ (heartbeat)
+{
+}
+
+ACE_INLINE
+TAO_FT_Heart_Beat_Enabled_Policy::TAO_FT_Heart_Beat_Enabled_Policy (
+ const TAO_FT_Heart_Beat_Enabled_Policy &rhs)
+ : ACE_NESTED_CLASS (CORBA, Object) ()
+ , ACE_NESTED_CLASS (CORBA, Policy) ()
+ , ACE_NESTED_CLASS (CORBA, LocalObject) ()
+ , FT::HeartbeatEnabledPolicy ()
+ , TAO_Local_RefCounted_Object ()
+ , heartbeat_enabled_value_ (rhs.heartbeat_enabled_value_)
+{
+}
+
+TAO_END_VERSIONED_NAMESPACE_DECL
diff --git a/TAO/orbsvcs/orbsvcs/FaultTolerance/FT_ServerORBInitializer.cpp b/TAO/orbsvcs/orbsvcs/FaultTolerance/FT_ServerORBInitializer.cpp
new file mode 100755
index 00000000000..77b99f3035a
--- /dev/null
+++ b/TAO/orbsvcs/orbsvcs/FaultTolerance/FT_ServerORBInitializer.cpp
@@ -0,0 +1,100 @@
+// $Id$
+
+#include "orbsvcs/FaultTolerance/FT_ServerORBInitializer.h"
+#include "orbsvcs/FaultTolerance/FT_ServerPolicyFactory.h"
+#include "orbsvcs/FaultTolerance/FT_ServerRequest_Interceptor.h"
+#include "tao/ORB_Constants.h"
+#include "orbsvcs/FT_CORBA_ORBC.h"
+#include "tao/Exception.h"
+
+
+ACE_RCSID (FaultTolerance,
+ FT_ServerORBInitializer,
+ "$Id$")
+
+TAO_BEGIN_VERSIONED_NAMESPACE_DECL
+
+void
+TAO_FT_ServerORBInitializer::pre_init (
+ PortableInterceptor::ORBInitInfo_ptr
+ ACE_ENV_ARG_DECL_NOT_USED)
+ ACE_THROW_SPEC ((CORBA::SystemException))
+{
+}
+
+void
+TAO_FT_ServerORBInitializer::post_init (
+ PortableInterceptor::ORBInitInfo_ptr info
+ ACE_ENV_ARG_DECL)
+ ACE_THROW_SPEC ((CORBA::SystemException))
+{
+ this->register_policy_factories (info
+ ACE_ENV_ARG_PARAMETER);
+ ACE_CHECK;
+
+ this->register_server_request_interceptors (info
+ ACE_ENV_ARG_PARAMETER);
+ ACE_CHECK;
+}
+
+void
+TAO_FT_ServerORBInitializer::register_policy_factories (
+ PortableInterceptor::ORBInitInfo_ptr info
+ ACE_ENV_ARG_DECL)
+ ACE_THROW_SPEC ((CORBA::SystemException))
+{
+ // Register the FTCORBA policy factories.
+
+ PortableInterceptor::PolicyFactory_ptr temp_factory =
+ PortableInterceptor::PolicyFactory::_nil ();
+ PortableInterceptor::PolicyFactory_var policy_factory;
+
+ // This policy factory is used for all FTCORBA related policies.
+
+ ACE_NEW_THROW_EX (temp_factory,
+ TAO_FT_ServerPolicyFactory,
+ CORBA::NO_MEMORY (
+ CORBA::SystemException::_tao_minor_code (
+ TAO::VMCID,
+ ENOMEM),
+ CORBA::COMPLETED_NO));
+ ACE_CHECK;
+
+ policy_factory = temp_factory;
+
+ // Bind the same policy factory to all FTCORBA related policy
+ // types since a single policy factory is used to create each of
+ // the different types of FTCORBA policies.
+
+
+ CORBA::PolicyType type = FT::HEARTBEAT_ENABLED_POLICY;
+ info->register_policy_factory (type,
+ policy_factory.in ()
+ ACE_ENV_ARG_PARAMETER);
+ ACE_CHECK;
+}
+
+
+void
+TAO_FT_ServerORBInitializer::register_server_request_interceptors (
+ PortableInterceptor::ORBInitInfo_ptr info
+ ACE_ENV_ARG_DECL)
+ ACE_THROW_SPEC ((CORBA::SystemException))
+{
+ PortableInterceptor::ServerRequestInterceptor_ptr sri =
+ PortableInterceptor::ServerRequestInterceptor::_nil ();
+
+ ACE_NEW_THROW_EX (sri,
+ TAO::FT_ServerRequest_Interceptor,
+ CORBA::NO_MEMORY ());
+
+ PortableInterceptor::ServerRequestInterceptor_var
+ server_interceptor = sri;
+
+ info->add_server_request_interceptor (server_interceptor.in ()
+ ACE_ENV_ARG_PARAMETER);
+ ACE_CHECK;
+}
+
+
+TAO_END_VERSIONED_NAMESPACE_DECL
diff --git a/TAO/orbsvcs/orbsvcs/FaultTolerance/FT_ServerORBInitializer.h b/TAO/orbsvcs/orbsvcs/FaultTolerance/FT_ServerORBInitializer.h
new file mode 100755
index 00000000000..0e2711ed429
--- /dev/null
+++ b/TAO/orbsvcs/orbsvcs/FaultTolerance/FT_ServerORBInitializer.h
@@ -0,0 +1,74 @@
+// -*- C++ -*-
+
+//=============================================================================
+/**
+ * @file FT_ServerORBInitializer.h
+ *
+ * $Id$
+ *
+ * @author Balachandran Natarajan <bala@cs.wustl.edu>
+ */
+//=============================================================================
+#ifndef TAO_FT_SERVERORB_INITIALIZER_H
+#define TAO_FT_SERVERORB_INITIALIZER_H
+
+#include /**/ "ace/pre.h"
+
+#include "tao/PI/PI.h"
+
+#if !defined (ACE_LACKS_PRAGMA_ONCE)
+# pragma once
+#endif /* ACE_LACKS_PRAGMA_ONCE */
+
+#include "tao/LocalObject.h"
+#include "orbsvcs/FaultTolerance/FT_ServerORB_export.h"
+
+// This is to remove "inherits via dominance" warnings from MSVC.
+// MSVC is being a little too paranoid.
+#if defined(_MSC_VER)
+#pragma warning(push)
+#pragma warning(disable:4250)
+#endif /* _MSC_VER */
+
+TAO_BEGIN_VERSIONED_NAMESPACE_DECL
+
+/// RTCORBA ORB initializer.
+class TAO_FT_ServerORBInitializer
+ : public virtual PortableInterceptor::ORBInitializer
+ , public virtual TAO_Local_RefCounted_Object
+{
+public:
+
+ virtual void pre_init (PortableInterceptor::ORBInitInfo_ptr info
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS)
+ ACE_THROW_SPEC ((CORBA::SystemException));
+
+ virtual void post_init (PortableInterceptor::ORBInitInfo_ptr info
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS)
+ ACE_THROW_SPEC ((CORBA::SystemException));
+
+private:
+
+ /// Register FTCORBA policy factories.
+ void register_policy_factories (
+ PortableInterceptor::ORBInitInfo_ptr info
+ ACE_ENV_ARG_DECL)
+ ACE_THROW_SPEC ((CORBA::SystemException));
+
+ /// Register the necessary interceptors.
+ void register_server_request_interceptors (
+ PortableInterceptor::ORBInitInfo_ptr info
+ ACE_ENV_ARG_DECL)
+ ACE_THROW_SPEC ((CORBA::SystemException));
+
+};
+
+TAO_END_VERSIONED_NAMESPACE_DECL
+
+#if defined(_MSC_VER)
+#pragma warning(pop)
+#endif /* _MSC_VER */
+
+#include /**/ "ace/post.h"
+
+#endif /* TAO_FT_SERVERORB_INITIALIZER_H */
diff --git a/TAO/orbsvcs/orbsvcs/FaultTolerance/FT_ServerORB_export.h b/TAO/orbsvcs/orbsvcs/FaultTolerance/FT_ServerORB_export.h
new file mode 100644
index 00000000000..565f0b73165
--- /dev/null
+++ b/TAO/orbsvcs/orbsvcs/FaultTolerance/FT_ServerORB_export.h
@@ -0,0 +1,60 @@
+
+// -*- C++ -*-
+// $Id$
+// Definition for Win32 Export directives.
+// This file is generated automatically by generate_export_file.pl TAO_FT_ServerORB
+// ------------------------------
+#ifndef TAO_FT_SERVERORB_EXPORT_H
+#define TAO_FT_SERVERORB_EXPORT_H
+
+#include "ace/config-all.h"
+
+#if defined (TAO_AS_STATIC_LIBS)
+# if !defined (TAO_FT_SERVERORB_HAS_DLL)
+# define TAO_FT_SERVERORB_HAS_DLL 0
+# endif /* ! TAO_FT_SERVERORB_HAS_DLL */
+#else
+# if !defined (TAO_FT_SERVERORB_HAS_DLL)
+# define TAO_FT_SERVERORB_HAS_DLL 1
+# endif /* ! TAO_FT_SERVERORB_HAS_DLL */
+#endif
+
+#if defined (TAO_FT_SERVERORB_HAS_DLL) && (TAO_FT_SERVERORB_HAS_DLL == 1)
+# if defined (TAO_FT_SERVERORB_BUILD_DLL)
+# define TAO_FT_ServerORB_Export ACE_Proper_Export_Flag
+# define TAO_FT_SERVERORB_SINGLETON_DECLARATION(T) ACE_EXPORT_SINGLETON_DECLARATION (T)
+# define TAO_FT_SERVERORB_SINGLETON_DECLARE(SINGLETON_TYPE, CLASS, LOCK) ACE_EXPORT_SINGLETON_DECLARE(SINGLETON_TYPE, CLASS, LOCK)
+# else /* TAO_FT_SERVERORB_BUILD_DLL */
+# define TAO_FT_ServerORB_Export ACE_Proper_Import_Flag
+# define TAO_FT_SERVERORB_SINGLETON_DECLARATION(T) ACE_IMPORT_SINGLETON_DECLARATION (T)
+# define TAO_FT_SERVERORB_SINGLETON_DECLARE(SINGLETON_TYPE, CLASS, LOCK) ACE_IMPORT_SINGLETON_DECLARE(SINGLETON_TYPE, CLASS, LOCK)
+# endif /* TAO_FT_SERVERORB_BUILD_DLL */
+#else /* TAO_FT_SERVERORB_HAS_DLL == 1 */
+# define TAO_FT_ServerORB_Export
+# define TAO_FT_SERVERORB_SINGLETON_DECLARATION(T)
+# define TAO_FT_SERVERORB_SINGLETON_DECLARE(SINGLETON_TYPE, CLASS, LOCK)
+#endif /* TAO_FT_SERVERORB_HAS_DLL == 1 */
+
+// Set TAO_FT_SERVERORB_NTRACE = 0 to turn on library specific tracing even if
+// tracing is turned off for ACE.
+#if !defined (TAO_FT_SERVERORB_NTRACE)
+# if (ACE_NTRACE == 1)
+# define TAO_FT_SERVERORB_NTRACE 1
+# else /* (ACE_NTRACE == 1) */
+# define TAO_FT_SERVERORB_NTRACE 0
+# endif /* (ACE_NTRACE == 1) */
+#endif /* !TAO_FT_SERVERORB_NTRACE */
+
+#if (TAO_FT_SERVERORB_NTRACE == 1)
+# define TAO_FT_SERVERORB_TRACE(X)
+#else /* (TAO_FT_SERVERORB_NTRACE == 1) */
+# if !defined (ACE_HAS_TRACE)
+# define ACE_HAS_TRACE
+# endif /* ACE_HAS_TRACE */
+# define TAO_FT_SERVERORB_TRACE(X) ACE_TRACE_IMPL(X)
+# include "ace/Trace.h"
+#endif /* (TAO_FT_SERVERORB_NTRACE == 1) */
+
+#endif /* TAO_FT_SERVERORB_EXPORT_H */
+
+// End of auto generated file.
diff --git a/TAO/orbsvcs/orbsvcs/FaultTolerance/FT_ServerPolicyFactory.cpp b/TAO/orbsvcs/orbsvcs/FaultTolerance/FT_ServerPolicyFactory.cpp
new file mode 100755
index 00000000000..e1c8fcea33b
--- /dev/null
+++ b/TAO/orbsvcs/orbsvcs/FaultTolerance/FT_ServerPolicyFactory.cpp
@@ -0,0 +1,34 @@
+// -*- C++ -*-
+//
+// $Id$
+
+#include "orbsvcs/FaultTolerance/FT_ServerPolicyFactory.h"
+#include "orbsvcs/FaultTolerance/FT_ServerPolicy_i.h"
+#include "orbsvcs/FT_CORBA_ORBC.h"
+#include "tao/PolicyC.h"
+
+
+ACE_RCSID (FaultTolerance,
+ FT_ServerPolicyFactory,
+ "$Id$")
+
+TAO_BEGIN_VERSIONED_NAMESPACE_DECL
+
+CORBA::Policy_ptr
+TAO_FT_ServerPolicyFactory::create_policy (
+ CORBA::PolicyType type,
+ const CORBA::Any &val
+ ACE_ENV_ARG_DECL)
+ ACE_THROW_SPEC ((CORBA::SystemException,
+ CORBA::PolicyError))
+{
+
+ if (type == FT::HEARTBEAT_ENABLED_POLICY)
+ return TAO_FT_Heart_Beat_Enabled_Policy::create (val
+ ACE_ENV_ARG_PARAMETER);
+
+ ACE_THROW_RETURN (CORBA::PolicyError (CORBA::BAD_POLICY_TYPE),
+ CORBA::Policy::_nil ());
+}
+
+TAO_END_VERSIONED_NAMESPACE_DECL
diff --git a/TAO/orbsvcs/orbsvcs/FaultTolerance/FT_ServerPolicyFactory.h b/TAO/orbsvcs/orbsvcs/FaultTolerance/FT_ServerPolicyFactory.h
new file mode 100755
index 00000000000..2ae22af9f48
--- /dev/null
+++ b/TAO/orbsvcs/orbsvcs/FaultTolerance/FT_ServerPolicyFactory.h
@@ -0,0 +1,60 @@
+// -*- C++ -*-
+
+//=============================================================================
+/**
+ * @file FT_ServerPolicyFactory.h
+ *
+ * $Id$
+ *
+ * @author Bala Natarajan <bala@cs.wustl.edu>
+ */
+//=============================================================================
+
+
+#ifndef TAO_FT_SERVERPOLICY_FACTORY_H
+#define TAO_FT_SERVERPOLICY_FACTORY_H
+
+#include /**/ "ace/pre.h"
+
+#include "tao/PI/PI.h"
+
+#if !defined (ACE_LACKS_PRAGMA_ONCE)
+# pragma once
+#endif /* ACE_LACKS_PRAGMA_ONCE */
+
+#include "tao/LocalObject.h"
+
+// This is to remove "inherits via dominance" warnings from MSVC.
+// MSVC is being a little too paranoid.
+#if defined(_MSC_VER)
+#pragma warning(push)
+#pragma warning(disable:4250)
+#endif /* _MSC_VER */
+
+#include "orbsvcs/FaultTolerance/FT_ServerORB_export.h"
+
+TAO_BEGIN_VERSIONED_NAMESPACE_DECL
+
+/// Policy factory for all FTCORBA related policies.
+class TAO_FT_ServerPolicyFactory
+ : public PortableInterceptor::PolicyFactory
+ , public TAO_Local_RefCounted_Object
+{
+public:
+
+ virtual CORBA::Policy_ptr create_policy (CORBA::PolicyType type,
+ const CORBA::Any &value
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS)
+ ACE_THROW_SPEC ((CORBA::SystemException,
+ CORBA::PolicyError));
+};
+
+TAO_END_VERSIONED_NAMESPACE_DECL
+
+#if defined(_MSC_VER)
+#pragma warning(pop)
+#endif /* _MSC_VER */
+
+#include /**/ "ace/post.h"
+
+#endif /* TAO_FT_POLICY_FACTORY_H */
diff --git a/TAO/orbsvcs/orbsvcs/FaultTolerance/FT_ServerPolicy_i.cpp b/TAO/orbsvcs/orbsvcs/FaultTolerance/FT_ServerPolicy_i.cpp
new file mode 100644
index 00000000000..25e079b7692
--- /dev/null
+++ b/TAO/orbsvcs/orbsvcs/FaultTolerance/FT_ServerPolicy_i.cpp
@@ -0,0 +1,82 @@
+//$Id$
+#include "orbsvcs/FaultTolerance/FT_ServerPolicy_i.h"
+
+#include "tao/debug.h"
+#include "tao/ORB_Constants.h"
+#include "tao/AnyTypeCode/Any.h"
+
+#if !defined (__ACE_INLINE__)
+#include "orbsvcs/FaultTolerance/FT_ServerPolicy_i.inl"
+#endif /* __ACE_INLINE__ */
+
+ACE_RCSID(FaultTolerance, FT_ServerPolicy_i, "$Id$")
+
+TAO_BEGIN_VERSIONED_NAMESPACE_DECL
+
+CORBA::Boolean
+TAO_FT_Heart_Beat_Enabled_Policy::heartbeat_enabled_policy_value (
+ ACE_ENV_SINGLE_ARG_DECL_NOT_USED)
+ ACE_THROW_SPEC ((CORBA::SystemException))
+{
+ return this->heartbeat_enabled_value_;
+}
+
+
+CORBA::Policy_ptr
+TAO_FT_Heart_Beat_Enabled_Policy::create (const CORBA::Any& val
+ ACE_ENV_ARG_DECL)
+{
+ CORBA::Boolean value;
+
+ if ((val >>= CORBA::Any::to_boolean (value)) == 0)
+ ACE_THROW_RETURN (CORBA::PolicyError (CORBA::BAD_POLICY_VALUE),
+ CORBA::Policy::_nil ());
+
+ TAO_FT_Heart_Beat_Enabled_Policy *tmp;
+ ACE_NEW_THROW_EX (tmp,
+ TAO_FT_Heart_Beat_Enabled_Policy (value),
+ CORBA::NO_MEMORY (TAO::VMCID,
+ CORBA::COMPLETED_NO));
+ ACE_CHECK_RETURN (CORBA::Policy::_nil ());
+
+ return tmp;
+}
+
+CORBA::PolicyType
+TAO_FT_Heart_Beat_Enabled_Policy::policy_type (ACE_ENV_SINGLE_ARG_DECL_NOT_USED)
+ ACE_THROW_SPEC ((CORBA::SystemException))
+{
+ return FT::HEARTBEAT_ENABLED_POLICY;
+}
+
+
+CORBA::Policy_ptr
+TAO_FT_Heart_Beat_Enabled_Policy::copy (ACE_ENV_SINGLE_ARG_DECL)
+ ACE_THROW_SPEC ((CORBA::SystemException))
+{
+ TAO_FT_Heart_Beat_Enabled_Policy * tmp;
+ ACE_NEW_THROW_EX (tmp, TAO_FT_Heart_Beat_Enabled_Policy (*this),
+ CORBA::NO_MEMORY (TAO::VMCID,
+ CORBA::COMPLETED_NO));
+ ACE_CHECK_RETURN (CORBA::Policy::_nil ());
+
+ return tmp;
+}
+
+TAO_FT_Heart_Beat_Enabled_Policy *
+TAO_FT_Heart_Beat_Enabled_Policy::clone (void) const
+{
+ TAO_FT_Heart_Beat_Enabled_Policy *copy = 0;
+ ACE_NEW_RETURN (copy,
+ TAO_FT_Heart_Beat_Enabled_Policy (*this),
+ 0);
+ return copy;
+}
+
+void
+TAO_FT_Heart_Beat_Enabled_Policy::destroy (ACE_ENV_SINGLE_ARG_DECL_NOT_USED)
+ ACE_THROW_SPEC ((CORBA::SystemException))
+{
+}
+
+TAO_END_VERSIONED_NAMESPACE_DECL
diff --git a/TAO/orbsvcs/orbsvcs/FaultTolerance/FT_ServerPolicy_i.h b/TAO/orbsvcs/orbsvcs/FaultTolerance/FT_ServerPolicy_i.h
new file mode 100755
index 00000000000..6019cdc8f70
--- /dev/null
+++ b/TAO/orbsvcs/orbsvcs/FaultTolerance/FT_ServerPolicy_i.h
@@ -0,0 +1,96 @@
+// -*- C++ -*-
+
+//=============================================================================
+/**
+ * @file FT_ServerPolicy_i.h
+ *
+ * $Id$
+ *
+ * @author Balachandran Natarajan <bala@cs.wustl.edu>
+ */
+//=============================================================================
+
+
+#ifndef TAO_FT_SERVERPOLICY_I_H
+#define TAO_FT_SERVERPOLICY_I_H
+#include /**/ "ace/pre.h"
+
+#include "orbsvcs/FT_CORBA_ORBC.h"
+
+#if defined(_MSC_VER)
+#pragma warning(push)
+#pragma warning(disable:4250)
+#endif /* _MSC_VER */
+
+#include "orbsvcs/FaultTolerance/FT_ServerORB_export.h"
+#include "tao/LocalObject.h"
+
+TAO_BEGIN_VERSIONED_NAMESPACE_DECL
+
+/**
+ * @class TAO_FT_Heart_Beat_Enabled_Policy
+ *
+ * @brief FT::HeartBeatEnabledPolicy
+ *
+ * If this policy is set, it enables the server ORB to set
+ * the TAG_FT_HEARTBEAT_ENABLED component in the IOP profile of
+ * the IOR that it exposes
+ */
+class TAO_FT_Heart_Beat_Enabled_Policy
+ : public FT::HeartbeatEnabledPolicy
+ , public TAO_Local_RefCounted_Object
+{
+public:
+
+ /// Constructor.
+ TAO_FT_Heart_Beat_Enabled_Policy (const CORBA::Boolean boolean);
+
+ /// Copy constructor.
+ TAO_FT_Heart_Beat_Enabled_Policy (
+ const TAO_FT_Heart_Beat_Enabled_Policy &rhs);
+
+ static CORBA::Policy_ptr create (const CORBA::Any& val
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS);
+
+ // Helper method for the implementation of
+ // CORBA::ORB::create_policy.
+
+ /// Returns a copy of <this>.
+ virtual TAO_FT_Heart_Beat_Enabled_Policy *clone (void) const;
+
+ // = The FT::HeartBeatPolicy methods
+ virtual CORBA::Boolean heartbeat_enabled_policy_value (
+ ACE_ENV_SINGLE_ARG_DECL)
+ ACE_THROW_SPEC ((CORBA::SystemException));
+
+ virtual CORBA::PolicyType policy_type (
+ ACE_ENV_SINGLE_ARG_DECL_WITH_DEFAULTS)
+ ACE_THROW_SPEC ((CORBA::SystemException));
+
+ virtual CORBA::Policy_ptr copy (
+ ACE_ENV_SINGLE_ARG_DECL_WITH_DEFAULTS)
+ ACE_THROW_SPEC ((CORBA::SystemException));
+
+ virtual void destroy (
+ ACE_ENV_SINGLE_ARG_DECL_WITH_DEFAULTS)
+ ACE_THROW_SPEC ((CORBA::SystemException));
+
+private:
+
+ /// indicates whether heartbeating is enabled or not.
+ CORBA::Boolean heartbeat_enabled_value_;
+};
+
+TAO_END_VERSIONED_NAMESPACE_DECL
+
+#if defined(_MSC_VER)
+#pragma warning(pop)
+#endif /* _MSC_VER */
+
+#if defined (__ACE_INLINE__)
+#include "orbsvcs/FaultTolerance/FT_ServerPolicy_i.inl"
+#endif /* __ACE_INLINE__ */
+
+
+#include /**/ "ace/post.h"
+#endif /* TAO_FT_SERVERPOLICY_I_H */
diff --git a/TAO/orbsvcs/orbsvcs/FaultTolerance/FT_ServerPolicy_i.inl b/TAO/orbsvcs/orbsvcs/FaultTolerance/FT_ServerPolicy_i.inl
new file mode 100755
index 00000000000..21dfaed4af7
--- /dev/null
+++ b/TAO/orbsvcs/orbsvcs/FaultTolerance/FT_ServerPolicy_i.inl
@@ -0,0 +1,28 @@
+// -*- C++ -*-
+//
+//$Id$
+
+TAO_BEGIN_VERSIONED_NAMESPACE_DECL
+
+ACE_INLINE
+TAO_FT_Heart_Beat_Enabled_Policy::TAO_FT_Heart_Beat_Enabled_Policy (
+ const CORBA::Boolean heartbeat
+ )
+ : heartbeat_enabled_value_ (heartbeat)
+{
+}
+
+ACE_INLINE
+TAO_FT_Heart_Beat_Enabled_Policy::TAO_FT_Heart_Beat_Enabled_Policy (
+ const TAO_FT_Heart_Beat_Enabled_Policy &rhs
+ )
+ : CORBA::Object (),
+ CORBA::Policy (),
+ CORBA::LocalObject (),
+ FT::HeartbeatEnabledPolicy (),
+ TAO_Local_RefCounted_Object (),
+ heartbeat_enabled_value_ (rhs.heartbeat_enabled_value_)
+{
+}
+
+TAO_END_VERSIONED_NAMESPACE_DECL
diff --git a/TAO/orbsvcs/orbsvcs/FaultTolerance/FT_ServerRequest_Interceptor.cpp b/TAO/orbsvcs/orbsvcs/FaultTolerance/FT_ServerRequest_Interceptor.cpp
new file mode 100644
index 00000000000..64866cc36ed
--- /dev/null
+++ b/TAO/orbsvcs/orbsvcs/FaultTolerance/FT_ServerRequest_Interceptor.cpp
@@ -0,0 +1,237 @@
+#include "orbsvcs/FaultTolerance/FT_ServerRequest_Interceptor.h"
+#include "tao/IOP_IORC.h"
+#include "tao/ORB_Constants.h"
+#include "tao/AnyTypeCode/DynamicC.h"
+#include "tao/AnyTypeCode/TypeCode.h"
+#include "tao/CDR.h"
+#include "orbsvcs/FT_CORBA_ORBC.h"
+#include "ace/Log_Msg.h"
+#include "ace/OS_NS_string.h"
+
+ACE_RCSID (FaultTolerance,
+ FT_ServerRequest_Interceptor,
+ "$Id$")
+
+TAO_BEGIN_VERSIONED_NAMESPACE_DECL
+
+namespace TAO
+{
+ FT_ServerRequest_Interceptor::FT_ServerRequest_Interceptor (void)
+ : object_group_ref_version_ (0)
+ , is_primary_ (false)
+ , iogr_ (0)
+ , orb_ (0)
+ {
+ }
+
+ FT_ServerRequest_Interceptor::~FT_ServerRequest_Interceptor (void)
+ {
+ }
+
+ char *
+ FT_ServerRequest_Interceptor::name (ACE_ENV_SINGLE_ARG_DECL_NOT_USED)
+ ACE_THROW_SPEC ((CORBA::SystemException))
+ {
+ return CORBA::string_dup ("TAO_FT_ServerRequest_Interceptor");
+ }
+
+ void
+ FT_ServerRequest_Interceptor::destroy (ACE_ENV_SINGLE_ARG_DECL_NOT_USED)
+ ACE_THROW_SPEC ((CORBA::SystemException))
+ {
+ }
+
+ void
+ FT_ServerRequest_Interceptor::receive_request_service_contexts (
+ PortableInterceptor::ServerRequestInfo_ptr ri
+ ACE_ENV_ARG_DECL)
+ ACE_THROW_SPEC ((CORBA::SystemException,
+ PortableInterceptor::ForwardRequest))
+ {
+ // Check for the group version service context
+ ACE_TRY
+ {
+ IOP::ServiceContext_var sc =
+ ri->get_request_service_context (IOP::FT_GROUP_VERSION
+ ACE_ENV_ARG_PARAMETER);
+ ACE_TRY_CHECK;
+
+ this->check_iogr_version (sc.in ()
+ ACE_ENV_ARG_PARAMETER);
+ ACE_TRY_CHECK;
+ }
+ ACE_CATCH (CORBA::BAD_PARAM, ex)
+ {
+ // No group version context, no problem just return.
+ return;
+ }
+ ACE_CATCHANY
+ {
+ ACE_RE_THROW;
+ }
+ ACE_ENDTRY;
+ ACE_CHECK;
+
+ }
+
+ void
+ FT_ServerRequest_Interceptor::receive_request (
+ PortableInterceptor::ServerRequestInfo_ptr ri
+ ACE_ENV_ARG_DECL)
+ ACE_THROW_SPEC ((CORBA::SystemException,
+ PortableInterceptor::ForwardRequest))
+ {
+ // Check for the group version service context
+ CORBA::String_var op =
+ ri->operation (ACE_ENV_SINGLE_ARG_PARAMETER);
+ ACE_CHECK;
+
+ if (ACE_OS::strcmp (op.in (),
+ "tao_update_object_group") == 0)
+ {
+ this->update_iogr (ri
+ ACE_ENV_ARG_PARAMETER);
+ ACE_CHECK;
+ }
+
+ // Else the world is fine
+ }
+
+ void
+ FT_ServerRequest_Interceptor::send_reply (
+ PortableInterceptor::ServerRequestInfo_ptr
+ ACE_ENV_ARG_DECL_NOT_USED)
+ ACE_THROW_SPEC ((CORBA::SystemException))
+ {
+ }
+
+ void
+ FT_ServerRequest_Interceptor::send_exception (
+ PortableInterceptor::ServerRequestInfo_ptr
+ ACE_ENV_ARG_DECL_NOT_USED)
+ ACE_THROW_SPEC ((CORBA::SystemException,
+ PortableInterceptor::ForwardRequest))
+ {
+ }
+
+ void
+ FT_ServerRequest_Interceptor::send_other (
+ PortableInterceptor::ServerRequestInfo_ptr
+ ACE_ENV_ARG_DECL_NOT_USED)
+ ACE_THROW_SPEC ((CORBA::SystemException,
+ PortableInterceptor::ForwardRequest))
+ {
+ }
+
+ void
+ FT_ServerRequest_Interceptor::check_iogr_version (
+ const IOP::ServiceContext &svc
+ ACE_ENV_ARG_DECL)
+ ACE_THROW_SPEC ((CORBA::SystemException,
+ PortableInterceptor::ForwardRequest))
+ {
+ TAO_InputCDR cdr (reinterpret_cast<const char*> (svc.context_data.get_buffer ()),
+ svc.context_data.length ());
+
+ CORBA::Boolean byte_order;
+
+ if ((cdr >> ACE_InputCDR::to_boolean (byte_order)) == 0)
+ return;
+
+ cdr.reset_byte_order (static_cast<int> (byte_order));
+
+ FT::FTGroupVersionServiceContext fgvsc;
+
+ if ((cdr >> fgvsc) == 0)
+ ACE_THROW (CORBA::BAD_PARAM (CORBA::OMGVMCID | 28,
+ CORBA::COMPLETED_NO));
+
+
+ if (fgvsc.object_group_ref_version >
+ this->object_group_ref_version_)
+ {
+ ACE_ERROR ((LM_ERROR,
+ ACE_TEXT ("TAO_FT (%P|%t) - Wrong version information ")
+ ACE_TEXT ("within the interceptor (%u > %u)\n"),
+ fgvsc.object_group_ref_version,
+ this->object_group_ref_version_));
+ }
+ else if (fgvsc.object_group_ref_version <
+ this->object_group_ref_version_)
+ {
+ // Notice that this is a permanent forward.
+ ACE_THROW (PortableInterceptor::ForwardRequest (
+ this->iogr_.in()));
+ }
+ else if ((fgvsc.object_group_ref_version ==
+ this->object_group_ref_version_) &&
+ !this->is_primary_)
+ {
+ ACE_THROW (CORBA::TRANSIENT (
+ CORBA::SystemException::_tao_minor_code (
+ TAO::VMCID,
+ EINVAL),
+ CORBA::COMPLETED_NO));
+ }
+ else
+ {
+ // Everything is okay...
+ }
+ }
+
+ void
+ FT_ServerRequest_Interceptor::update_iogr (
+ PortableInterceptor::ServerRequestInfo_ptr ri
+ ACE_ENV_ARG_DECL)
+ ACE_THROW_SPEC ((CORBA::SystemException))
+ {
+ if (this->orb_.in () == 0)
+ {
+ CORBA::String_var orb_id =
+ ri->orb_id (ACE_ENV_SINGLE_ARG_PARAMETER);
+ ACE_CHECK;
+
+ int argc = 0;
+ char **argv = 0;
+
+ this->orb_ =
+ CORBA::ORB_init (argc,
+ argv,
+ orb_id.in ()
+ ACE_ENV_ARG_PARAMETER);
+ ACE_CHECK;
+ }
+
+ Dynamic::ParameterList_var param =
+ ri->arguments (ACE_ENV_SINGLE_ARG_PARAMETER);
+ ACE_CHECK;
+
+ // this is only for checking the tao_update_object_group operation
+ // which accepts three parameters, i.e.,an iogr as a string,
+ // a version object and a boolean.
+ if (param->length () != 3 )
+ ACE_THROW (CORBA::TRANSIENT ());
+
+ const char *str = 0;
+
+ (*param)[0].argument >>= str;
+ (*param)[1].argument >>= this->object_group_ref_version_;
+ (*param)[2].argument >>= CORBA::Any::to_boolean(this->is_primary_);
+
+ CORBA::String_var obj (str);
+
+ this->iogr_ =
+ this->orb_->string_to_object (obj.in ()
+ ACE_ENV_ARG_PARAMETER);
+
+ ACE_CHECK;
+
+ // @@ This exception is a hack to let the RM know that we have
+ // received and updated the IOGR. We will add a special minor code
+ // soon.
+ if (this->iogr_.in ())
+ ACE_THROW (CORBA::TRANSACTION_ROLLEDBACK ());
+ }
+}
+
+TAO_END_VERSIONED_NAMESPACE_DECL
diff --git a/TAO/orbsvcs/orbsvcs/FaultTolerance/FT_ServerRequest_Interceptor.h b/TAO/orbsvcs/orbsvcs/FaultTolerance/FT_ServerRequest_Interceptor.h
new file mode 100644
index 00000000000..78c188d597d
--- /dev/null
+++ b/TAO/orbsvcs/orbsvcs/FaultTolerance/FT_ServerRequest_Interceptor.h
@@ -0,0 +1,138 @@
+// -*- C++ -*-
+
+//=============================================================================
+/**
+ * @file FT_ServerRequest_Interceptor.h
+ *
+ * $Id$
+ *
+ * ServerRequest_Interceptor for the FTORB
+ *
+ * @author Ossama Othman <ossama@uci.edu>
+ */
+//=============================================================================
+
+#ifndef TAO_FT_SERVER_REQUEST_INTERCEPTOR_H
+#define TAO_FT_SERVER_REQUEST_INTERCEPTOR_H
+
+#include "orbsvcs/FaultTolerance/FT_ServerORB_export.h"
+
+#if !defined (ACE_LACKS_PRAGMA_ONCE)
+# pragma once
+#endif /* ACE_LACKS_PRAGMA_ONCE */
+
+#include "tao/PI_Server/PI_Server.h"
+
+#include "tao/LocalObject.h"
+#include "tao/PortableInterceptorC.h"
+#include "tao/ORB.h"
+
+#if defined(_MSC_VER)
+#pragma warning(push)
+#pragma warning(disable:4250)
+#endif /* _MSC_VER */
+
+TAO_BEGIN_VERSIONED_NAMESPACE_DECL
+
+namespace IOP
+{
+ struct ServiceContext;
+}
+namespace TAO
+{
+ /**
+ * @class Server_Request_Interceptor
+ *
+ * @brief Simple concrete server request interceptor for FTORB
+ *
+ *
+ */
+ class FT_ServerRequest_Interceptor
+ : public virtual PortableInterceptor::ServerRequestInterceptor
+ , public virtual TAO_Local_RefCounted_Object
+ {
+ public:
+
+ /// Constructor.
+ FT_ServerRequest_Interceptor (void);
+
+ /// Destructor.
+ ~FT_ServerRequest_Interceptor (void);
+
+ /**
+ * @name Methods Required by the Server Request Interceptor
+ * Interface
+ *
+ * These are methods that must be implemented since they are pure
+ * virtual in the abstract base class. They are the canonical
+ * methods required for all server request interceptors.
+ */
+ //@{
+ /// Return the name of this ServerRequestinterceptor.
+ virtual char * name (ACE_ENV_SINGLE_ARG_DECL)
+ ACE_THROW_SPEC ((CORBA::SystemException));
+
+ virtual void destroy (ACE_ENV_SINGLE_ARG_DECL)
+ ACE_THROW_SPEC ((CORBA::SystemException));
+
+ virtual void receive_request_service_contexts (
+ PortableInterceptor::ServerRequestInfo_ptr ri
+ ACE_ENV_ARG_DECL)
+ ACE_THROW_SPEC ((CORBA::SystemException,
+ PortableInterceptor::ForwardRequest));
+
+ virtual void receive_request (
+ PortableInterceptor::ServerRequestInfo_ptr ri
+ ACE_ENV_ARG_DECL)
+ ACE_THROW_SPEC ((CORBA::SystemException,
+ PortableInterceptor::ForwardRequest));
+
+ virtual void send_reply (
+ PortableInterceptor::ServerRequestInfo_ptr ri
+ ACE_ENV_ARG_DECL)
+ ACE_THROW_SPEC ((CORBA::SystemException));
+
+ virtual void send_exception (
+ PortableInterceptor::ServerRequestInfo_ptr ri
+ ACE_ENV_ARG_DECL)
+ ACE_THROW_SPEC ((CORBA::SystemException,
+ PortableInterceptor::ForwardRequest));
+
+ virtual void send_other (
+ PortableInterceptor::ServerRequestInfo_ptr ri
+ ACE_ENV_ARG_DECL)
+ ACE_THROW_SPEC ((CORBA::SystemException,
+ PortableInterceptor::ForwardRequest));
+ //@}
+ private:
+
+ void check_iogr_version (const IOP::ServiceContext &svc
+ ACE_ENV_ARG_DECL)
+ ACE_THROW_SPEC ((CORBA::SystemException,
+ PortableInterceptor::ForwardRequest));
+
+ void update_iogr (
+ PortableInterceptor::ServerRequestInfo_ptr ri
+ ACE_ENV_ARG_DECL)
+ ACE_THROW_SPEC ((CORBA::SystemException));
+
+ private:
+
+ CORBA::ULong object_group_ref_version_;
+
+ CORBA::Boolean is_primary_;
+
+ CORBA::Object_var iogr_;
+
+ CORBA::ORB_var orb_;
+ };
+
+}
+
+TAO_END_VERSIONED_NAMESPACE_DECL
+
+#if defined(_MSC_VER)
+#pragma warning(pop)
+#endif /* _MSC_VER */
+
+#endif /* TAO_FT_SERVER_REQUEST_INTERCEPTOR_H */
diff --git a/TAO/orbsvcs/orbsvcs/FaultTolerance/FT_ServerService_Activate.cpp b/TAO/orbsvcs/orbsvcs/FaultTolerance/FT_ServerService_Activate.cpp
new file mode 100755
index 00000000000..be4448486c8
--- /dev/null
+++ b/TAO/orbsvcs/orbsvcs/FaultTolerance/FT_ServerService_Activate.cpp
@@ -0,0 +1,55 @@
+#include "orbsvcs/FaultTolerance/FT_ServerService_Activate.h"
+#include "orbsvcs/FaultTolerance/FT_ServerORBInitializer.h"
+#include "tao/ORB_Core.h"
+#include "tao/Service_Callbacks.h"
+#include "tao/ORBInitializer_Registry.h"
+#include "ace/Dynamic_Service.h"
+
+ACE_RCSID(FaultTolerance, FT_ServerService_Activate, "$Id$")
+
+static bool initialized = false;
+
+TAO_BEGIN_VERSIONED_NAMESPACE_DECL
+
+TAO_FT_ServerService_Activate::TAO_FT_ServerService_Activate (void)
+{
+}
+
+TAO_FT_ServerService_Activate::~TAO_FT_ServerService_Activate (void)
+{
+}
+
+int
+TAO_FT_ServerService_Activate::Initializer (void)
+{
+ if (initialized == false)
+ {
+ PortableInterceptor::ORBInitializer_ptr temp_orb_initializer =
+ PortableInterceptor::ORBInitializer::_nil ();
+ PortableInterceptor::ORBInitializer_var orb_initializer;
+
+ // Register the FTCORBA ServerORBInitializer.
+ ACE_NEW_RETURN (temp_orb_initializer,
+ TAO_FT_ServerORBInitializer,
+ -1);
+
+ orb_initializer = temp_orb_initializer;
+
+ PortableInterceptor::register_orb_initializer (orb_initializer.in ());
+
+ initialized = true;
+ }
+
+ return 0;
+}
+
+TAO_END_VERSIONED_NAMESPACE_DECL
+
+ACE_FACTORY_DEFINE (TAO_FT_ServerORB,TAO_FT_ServerService_Activate)
+
+ACE_STATIC_SVC_DEFINE (TAO_FT_ServerService_Activate,
+ ACE_TEXT ("FT_ServerService_Activate"),
+ ACE_SVC_OBJ_T,
+ &ACE_SVC_NAME (TAO_FT_ServerService_Activate),
+ ACE_Service_Type::DELETE_THIS | ACE_Service_Type::DELETE_OBJ,
+ 0)
diff --git a/TAO/orbsvcs/orbsvcs/FaultTolerance/FT_ServerService_Activate.h b/TAO/orbsvcs/orbsvcs/FaultTolerance/FT_ServerService_Activate.h
new file mode 100755
index 00000000000..7c57a64a2c2
--- /dev/null
+++ b/TAO/orbsvcs/orbsvcs/FaultTolerance/FT_ServerService_Activate.h
@@ -0,0 +1,65 @@
+// -*- C++ -*-
+
+//=============================================================================
+/**
+ * @file FT_ServerService_Activate.h
+ *
+ * $Id$
+ *
+ * A concrete implementation of a service callback
+ *
+ * @author Bala Natarajan <bala@cs.wustl.edu>
+ */
+//=============================================================================
+
+#ifndef TAO_FT_SERVERACTIVATE_H
+#define TAO_FT_SERVERACTIVATE_H
+#include /**/ "ace/pre.h"
+
+#include "orbsvcs/FaultTolerance/FT_ServerORB_export.h"
+
+#if !defined (ACE_LACKS_PRAGMA_ONCE)
+# pragma once
+#endif /* ACE_LACKS_PRAGMA_ONCE */
+
+#include "tao/Services_Activate.h"
+#include "ace/Service_Config.h"
+
+TAO_BEGIN_VERSIONED_NAMESPACE_DECL
+
+class TAO_Service_Callbacks;
+
+// Forward declarations
+/**
+ * @class TAO_FT_ServerService_Activate
+ *
+ * @brief A class to dynamically load the FT callback implementations in
+ * to the ORB.
+ *
+ */
+class TAO_FT_ServerORB_Export TAO_FT_ServerService_Activate
+: public ACE_Service_Object
+{
+
+public:
+ /// Constructor
+ TAO_FT_ServerService_Activate (void);
+
+ /// The destructor
+ virtual ~TAO_FT_ServerService_Activate (void);
+
+ /// Used to force the initialization.
+ static int Initializer (void);
+
+};
+
+static int
+TAO_FT_Requires_ServerService_Activate = TAO_FT_ServerService_Activate::Initializer ();
+
+TAO_END_VERSIONED_NAMESPACE_DECL
+
+ACE_STATIC_SVC_DECLARE (TAO_FT_ServerService_Activate)
+ACE_FACTORY_DECLARE (TAO_FT_ServerORB, TAO_FT_ServerService_Activate)
+
+#include /**/ "ace/post.h"
+#endif /*TAO_FT_ACTIVATE_H*/
diff --git a/TAO/orbsvcs/orbsvcs/FaultTolerance/FT_Service_Activate.cpp b/TAO/orbsvcs/orbsvcs/FaultTolerance/FT_Service_Activate.cpp
new file mode 100644
index 00000000000..9c0e8ed16a2
--- /dev/null
+++ b/TAO/orbsvcs/orbsvcs/FaultTolerance/FT_Service_Activate.cpp
@@ -0,0 +1,79 @@
+#include "orbsvcs/FaultTolerance/FT_Service_Activate.h"
+#include "orbsvcs/FaultTolerance/FT_Service_Callbacks.h"
+#include "orbsvcs/FaultTolerance/FT_ORBInitializer.h"
+#include "orbsvcs/FaultTolerance/FT_Endpoint_Selector_Factory.h"
+#include "tao/ORB_Core.h"
+#include "tao/Service_Callbacks.h"
+#include "ace/Dynamic_Service.h"
+
+ACE_RCSID(FaultTolerance, FT_Service_Activate, "$Id$")
+
+static bool initialized = false;
+
+TAO_BEGIN_VERSIONED_NAMESPACE_DECL
+
+TAO_FT_Service_Activate::TAO_FT_Service_Activate (void)
+{
+}
+
+TAO_FT_Service_Activate::~TAO_FT_Service_Activate (void)
+{
+}
+
+TAO_Service_Callbacks *
+TAO_FT_Service_Activate::activate_services (TAO_ORB_Core *orb_core)
+ ACE_THROW_SPEC ((CORBA::SystemException))
+{
+ TAO_FT_Service_Callbacks *ft_service_callback = 0;
+
+ // Construct service callback object
+ ACE_NEW_RETURN (ft_service_callback,
+ TAO_FT_Service_Callbacks (orb_core),
+ 0);
+
+
+ return ft_service_callback;
+}
+
+
+int
+TAO_FT_Service_Activate::Initializer (void)
+{
+ if (initialized == false)
+ {
+ ACE_Service_Config::static_svcs ()->
+ insert (&ace_svc_desc_TAO_FT_Service_Activate);
+
+ PortableInterceptor::ORBInitializer_ptr temp_orb_initializer =
+ PortableInterceptor::ORBInitializer::_nil ();
+ PortableInterceptor::ORBInitializer_var orb_initializer;
+
+ // Register the RTCORBA ORBInitializer.
+ ACE_NEW_RETURN (temp_orb_initializer,
+ TAO_FT_ORBInitializer,
+ -1);
+
+ orb_initializer = temp_orb_initializer;
+
+ PortableInterceptor::register_orb_initializer (orb_initializer.in ());
+
+ // Set the name of the endpoint selector factory
+ TAO_ORB_Core::set_endpoint_selector_factory ("FT_Endpoint_Selector_Factory");
+ ACE_Service_Config::process_directive (ace_svc_desc_TAO_FT_Endpoint_Selector_Factory);
+
+ initialized = true;
+ }
+
+ return 0;
+}
+
+TAO_END_VERSIONED_NAMESPACE_DECL
+
+ACE_FACTORY_DEFINE (TAO_FT,TAO_FT_Service_Activate)
+
+ACE_STATIC_SVC_DEFINE (TAO_FT_Service_Activate,
+ ACE_TEXT ("FT_Service_Activate"),
+ ACE_SVC_OBJ_T,
+ &ACE_SVC_NAME (TAO_FT_Service_Activate),
+ ACE_Service_Type::DELETE_THIS | ACE_Service_Type::DELETE_OBJ,
+ 0)
diff --git a/TAO/orbsvcs/orbsvcs/FaultTolerance/FT_Service_Activate.h b/TAO/orbsvcs/orbsvcs/FaultTolerance/FT_Service_Activate.h
new file mode 100644
index 00000000000..f6d261f2246
--- /dev/null
+++ b/TAO/orbsvcs/orbsvcs/FaultTolerance/FT_Service_Activate.h
@@ -0,0 +1,19 @@
+//=============================================================================
+/**
+ * @file FT_Service_Activate.h
+ *
+ * $Id$
+ *
+ * A concrete implementation of a service callback
+ *
+ * @author Bala Natarajan <bala@cs.wustl.edu>
+ */
+//=============================================================================
+
+#ifndef TAO_FT_ACTIVATE_H
+#define TAO_FT_ACTIVATE_H
+
+#include "orbsvcs/FaultTolerance/FT_ClientService_Activate.h"
+#include "orbsvcs/FaultTolerance/FT_ServerService_Activate.h"
+
+#endif /*TAO_FT_ACTIVATE_H*/
diff --git a/TAO/orbsvcs/orbsvcs/FaultTolerance/FT_Service_Callbacks.cpp b/TAO/orbsvcs/orbsvcs/FaultTolerance/FT_Service_Callbacks.cpp
new file mode 100644
index 00000000000..88dedebea60
--- /dev/null
+++ b/TAO/orbsvcs/orbsvcs/FaultTolerance/FT_Service_Callbacks.cpp
@@ -0,0 +1,325 @@
+// $Id$
+
+#include "orbsvcs/FaultTolerance/FT_Service_Callbacks.h"
+#include "orbsvcs/FaultTolerance/FT_ClientPolicy_i.h"
+
+#include "ace/OS_NS_sys_time.h"
+
+#include "tao/MProfile.h"
+#include "tao/Profile.h"
+#include "tao/Tagged_Components.h"
+#include "tao/Stub.h"
+#include "tao/Invocation_Utils.h"
+#include "tao/ORB_Core.h"
+#include "tao/Client_Strategy_Factory.h"
+#include "tao/CDR.h"
+
+ACE_RCSID (FaultTolerance,
+ FT_Service_Callbacks,
+ "$Id$")
+
+
+TAO_BEGIN_VERSIONED_NAMESPACE_DECL
+
+TAO_FT_Service_Callbacks::TAO_FT_Service_Callbacks (
+ TAO_ORB_Core *orb_core)
+
+ : orb_core_ (orb_core),
+ profile_lock_ (0)
+{
+ this->profile_lock_ =
+ this->orb_core_->client_factory ()->create_profile_lock ();
+}
+
+TAO_FT_Service_Callbacks::~TAO_FT_Service_Callbacks (void)
+{
+ // Delete the memeory for the lock
+ delete this->profile_lock_;
+}
+
+CORBA::Boolean
+TAO_FT_Service_Callbacks::object_is_nil (CORBA::Object_ptr obj)
+{
+ // Get the count
+ CORBA::ULong count =
+ obj->_stubobj ()->base_profiles ().profile_count ();
+
+ // If the profile count is zero then return true
+ if (count == 0)
+ return 1;
+ else
+ {
+ // else if each of the profile is nil
+ for (CORBA::ULong cnt = 0;
+ cnt < count;
+ cnt++)
+ {
+ TAO_Profile *pfile =
+ obj->_stubobj ()->base_profiles ().get_profile (cnt);
+
+ if (pfile != 0)
+ return 0;
+ }
+ }
+
+ // If it reaches here then it should be nill
+ return 1;
+
+}
+
+TAO_Service_Callbacks::Profile_Equivalence
+TAO_FT_Service_Callbacks::is_profile_equivalent (const TAO_Profile *this_p,
+ const TAO_Profile *that_p)
+{
+ const TAO_Tagged_Components &this_comp =
+ this_p->tagged_components ();
+
+ const TAO_Tagged_Components &that_comp =
+ that_p->tagged_components ();
+
+ IOP::TaggedComponent this_tc, that_tc;
+ this_tc.tag = that_tc.tag = IOP::TAG_FT_GROUP;
+
+ if (this_comp.get_component (this_tc) == 1)
+ {
+ if (that_comp.get_component (that_tc) == 1)
+ {
+ TAO_InputCDR this_cdr (reinterpret_cast<const char*> (this_tc.component_data.get_buffer ()),
+ this_tc.component_data.length ());
+
+ TAO_InputCDR that_cdr (reinterpret_cast<const char*> (that_tc.component_data.get_buffer ()),
+ that_tc.component_data.length ());
+
+ CORBA::Boolean this_byte_order;
+ CORBA::Boolean that_byte_order;
+
+ if (this_cdr >> ACE_InputCDR::to_boolean (this_byte_order) == 0 ||
+ that_cdr >> ACE_InputCDR::to_boolean (that_byte_order) == 0)
+ {
+ // Have tags but full of garbage - not equivalent
+ return TAO_Service_Callbacks::NOT_EQUIVALENT;
+ }
+
+ this_cdr.reset_byte_order (static_cast<int> (this_byte_order));
+ that_cdr.reset_byte_order (static_cast<int> (that_byte_order));
+
+
+ FT::TagFTGroupTaggedComponent this_group_component;
+ FT::TagFTGroupTaggedComponent that_group_component;
+
+ this_cdr >> this_group_component;
+ that_cdr >> that_group_component;
+
+ // check if domain id and group id are the same
+ if ((ACE_OS::strcmp (this_group_component.group_domain_id,
+ that_group_component.group_domain_id) == 0) &&
+ (this_group_component.object_group_id ==
+ that_group_component.object_group_id))
+ {
+ // Both have matching tags - true
+ return TAO_Service_Callbacks::EQUIVALENT;
+ }
+ }
+
+ return TAO_Service_Callbacks::NOT_EQUIVALENT;
+ }
+ else
+ {
+ if (that_comp.get_component (that_tc) == 1)
+ {
+ return TAO_Service_Callbacks::NOT_EQUIVALENT;
+ }
+ }
+
+ return TAO_Service_Callbacks::DONT_KNOW;
+}
+
+CORBA::ULong
+TAO_FT_Service_Callbacks::hash_ft (TAO_Profile *p,
+ CORBA::ULong max)
+{
+ // At this point we assume that all the checks for other things
+ // within the profiles have been satisfied
+ TAO_Tagged_Components &this_comp =
+ p->tagged_components ();
+
+ IOP::TaggedComponent tc;
+ tc.tag = IOP::TAG_FT_GROUP;
+
+ if (this_comp.get_component (tc) == 0)
+ return 0;
+
+ // extract the group component
+ TAO_InputCDR cdr (reinterpret_cast<const char*> (tc.component_data.get_buffer ()),
+ tc.component_data.length ());
+
+ CORBA::Boolean byte_order;
+ if ((cdr >> ACE_InputCDR::to_boolean (byte_order)) == 0)
+ {
+ return 0;
+ }
+
+ cdr.reset_byte_order (static_cast<int> (byte_order));
+
+ FT::TagFTGroupTaggedComponent group_component;
+
+ cdr >> group_component;
+
+ return (CORBA::ULong) group_component.object_group_id % max;
+}
+
+CORBA::Boolean
+TAO_FT_Service_Callbacks::is_permanent_forward_condition (const CORBA::Object_ptr obj,
+ const TAO_Service_Context &service_context) const
+{
+ // do as much as possible outside of lock
+ IOP::ServiceContext sc;
+ sc.context_id = IOP::FT_GROUP_VERSION;
+
+ if (service_context.get_context (sc) == 0)
+ return false; /* false */
+
+ IOP::TaggedComponent tc;
+ tc.tag = IOP::TAG_FT_GROUP;
+
+ const TAO_Stub * stub = obj->_stubobj ();
+ // check for forward_profiles, branching to speed up operation on base_profiles
+ if (stub->forward_profiles ())
+ {
+ // set lock, as forward_profiles might be deleted concurrently
+ ACE_MT (ACE_GUARD_RETURN (ACE_Lock,
+ guard,
+ *stub->profile_lock (),
+ 0));
+
+ // even now, the forward profiles might have been deleted in the meanwhile
+ const TAO_MProfile &mprofile = stub->forward_profiles()
+ ? *(stub->forward_profiles())
+ : stub->base_profiles();
+
+ if (mprofile.profile_count() == 0)
+ // releasing lock
+ return false;
+
+ // assuming group-attributes are set for all profiles, check
+ // only the first profile
+ const TAO_Tagged_Components &tagged_components =
+ mprofile.get_profile (0)->tagged_components ();
+
+ if (tagged_components.get_component (tc) == 0)
+ // releasing lock
+ return false; /* false */
+
+ return true; /* true */
+
+ // releasing lock
+ }
+ else /* operate on constant basic_profiles */
+ {
+ const TAO_MProfile &mprofile = stub->base_profiles();
+
+ if (mprofile.profile_count() == 0)
+ return false;
+
+ // assuming group-attributes are set for all profiles, check only the first profile
+ const TAO_Tagged_Components &tagged_components =
+ mprofile.get_profile (0)->tagged_components ();
+
+ if (tagged_components.get_component (tc) == 0)
+ return false; /* false */
+
+ return true; /* true */
+ }
+}
+
+
+TAO::Invocation_Status
+TAO_FT_Service_Callbacks::raise_comm_failure (
+ IOP::ServiceContextList &context_list,
+ TAO_Profile *profile
+ ACE_ENV_ARG_DECL)
+{
+ if (this->restart_policy_check (context_list,
+ profile))
+ return TAO::TAO_INVOKE_RESTART;
+
+ // As the right tags are not found close the connection and throw an
+ // exception
+ ACE_THROW_RETURN (CORBA::COMM_FAILURE (
+ CORBA::SystemException::_tao_minor_code (
+ TAO_INVOCATION_RECV_REQUEST_MINOR_CODE,
+ errno),
+ CORBA::COMPLETED_MAYBE),
+ TAO::TAO_INVOKE_SYSTEM_EXCEPTION);
+}
+
+TAO::Invocation_Status
+TAO_FT_Service_Callbacks::raise_transient_failure (
+ IOP::ServiceContextList &service,
+ TAO_Profile *profile
+ ACE_ENV_ARG_DECL_NOT_USED)
+{
+ if (this->restart_policy_check (service,
+ profile))
+ return TAO::TAO_INVOKE_RESTART;
+
+ // Unlike COMM_FAILURE do not raise an exception since the
+ // completion status is not known and no assumption can be made.
+ return TAO::TAO_INVOKE_SYSTEM_EXCEPTION;
+}
+
+CORBA::Boolean
+TAO_FT_Service_Callbacks::restart_policy_check (
+ IOP::ServiceContextList &service_list,
+ const TAO_Profile *profile)
+{
+ // Check whether the IOP::FT_REQUEST exists within the service
+ // context list and FT::FT_GROUP exists within the profile that we
+ // have
+ IOP::TaggedComponent tagged_component;
+ tagged_component.tag = IOP::TAG_FT_GROUP;
+
+ if (profile->tagged_components ().get_component (tagged_component)
+ == 1)
+ {
+ // Look for the FT_REQUEST context id
+ for (CORBA::ULong i = 0;
+ i < service_list.length ();
+ i++)
+ {
+ if (service_list[i].context_id == IOP::FT_REQUEST)
+ {
+ // This would be a heck of a lot easier if we had the invocation
+ // here rather than just the contexts, but lemons -> lemonade I guess.
+ TAO_InputCDR cdr (reinterpret_cast <const char*> (service_list[i].context_data.get_buffer ()),
+ service_list[i].context_data.length ());
+ CORBA::Boolean byte_order;
+ if ((cdr >> ACE_InputCDR::to_boolean (byte_order)) == 0)
+ return 0;
+ cdr.reset_byte_order (static_cast <int> (byte_order));
+ FT::FTRequestServiceContext ftsrc;
+ if ((cdr >> ftsrc) == 0)
+ return 0;
+
+ return (ftsrc.expiration_time > now ());
+ }
+ }
+ }
+
+ // Failure
+ return 0;
+}
+
+TimeBase::TimeT
+TAO_FT_Service_Callbacks::now (void)
+{
+ // Grab the localtime on the machine where this is running
+ ACE_Time_Value time_val = ACE_OS::gettimeofday ();
+ TimeBase::TimeT sec_part = ((TimeBase::TimeT)time_val.sec ()) * 10000000;
+ TimeBase::TimeT usec_part = ((TimeBase::TimeT)time_val.usec ()) * 10;
+
+ // Add the offset to convert from posix time.
+ return (sec_part + usec_part + ACE_UINT64_LITERAL (0x1B21DD213814000));
+}
+
+TAO_END_VERSIONED_NAMESPACE_DECL
diff --git a/TAO/orbsvcs/orbsvcs/FaultTolerance/FT_Service_Callbacks.h b/TAO/orbsvcs/orbsvcs/FaultTolerance/FT_Service_Callbacks.h
new file mode 100644
index 00000000000..b8f0b2a4d1f
--- /dev/null
+++ b/TAO/orbsvcs/orbsvcs/FaultTolerance/FT_Service_Callbacks.h
@@ -0,0 +1,107 @@
+// -*- C++ -*-
+
+//=============================================================================
+/**
+ * @file FT_Service_Callbacks.h
+ *
+ * $Id$
+ *
+ * A concrete FT service callback implementation
+ *
+ * @author Balachandran Natarajan <bala@cs.wustl.edu>
+ */
+//=============================================================================
+
+#ifndef TAO_FT_CALLBACKS_H
+#define TAO_FT_CALLBACKS_H
+#include /**/ "ace/pre.h"
+
+#include "orbsvcs/FaultTolerance/FT_ClientORB_export.h"
+
+#if !defined (ACE_LACKS_PRAGMA_ONCE)
+# pragma once
+#endif /* ACE_LACKS_PRAGMA_ONCE */
+
+#include "tao/Service_Callbacks.h"
+#include "orbsvcs/FT_CORBA_ORBC.h"
+
+TAO_BEGIN_VERSIONED_NAMESPACE_DECL
+
+class TAO_Profile;
+class TAO_MProfile;
+class TAO_ORB_Core;
+
+/**
+ * @class TAO_FT_Service_Callbacks
+ *
+ * @brief A class to dynamically load the FT callback implementations in
+ * to the ORB.
+ *
+ * An implementation of the service callbacks that allows the
+ * loading of the FT ORB level library in to the ORB
+ */
+class TAO_FT_ClientORB_Export TAO_FT_Service_Callbacks : public TAO_Service_Callbacks
+{
+public:
+ /// Constructor
+ TAO_FT_Service_Callbacks (TAO_ORB_Core *orb_core);
+
+ /// Dtor
+ virtual ~TAO_FT_Service_Callbacks (void);
+
+ /// Check whether <obj> is nil or not. FT spec suggests some
+ /// extensions for a CORBA::is_nil () operation.
+ virtual CORBA::Boolean object_is_nil (CORBA::Object_ptr obj);
+
+ /// Check for equivalency of the two profiles
+ virtual TAO_Service_Callbacks::Profile_Equivalence is_profile_equivalent (
+ const TAO_Profile *,
+ const TAO_Profile *);
+ /// Calculate the hash
+ virtual CORBA::ULong hash_ft (TAO_Profile *p,
+ CORBA::ULong m);
+
+
+ /// Verify condition for permanent forward is given,
+ /// both parameters must provide group attributes.
+ virtual CORBA::Boolean is_permanent_forward_condition
+ (const CORBA::Object_ptr obj,
+ const TAO_Service_Context &service_context) const;
+
+ /// Check whether we need to raise an exception or go for a
+ /// reinvocaton.
+ virtual TAO::Invocation_Status raise_comm_failure (
+ IOP::ServiceContextList &clist,
+ TAO_Profile *profile
+ ACE_ENV_ARG_DECL);
+
+ /// Check whether we need to raise an exception or go for a
+ /// reinvocaton.
+ virtual TAO::Invocation_Status raise_transient_failure (
+ IOP::ServiceContextList &clist,
+ TAO_Profile *profile
+ ACE_ENV_ARG_DECL);
+
+ static TimeBase::TimeT now (void);
+
+private:
+
+ /// Check whether the right flags are available so that we can issue a
+ /// restart.
+ CORBA::Boolean restart_policy_check (IOP::ServiceContextList &service_list,
+ const TAO_Profile *profile);
+
+private:
+ /// The ORB core in which we have been activated
+ TAO_ORB_Core *orb_core_;
+
+ /// Mutex to protect access to the profile that gets passed along
+ /// @@ Lock needs to be removed...
+ ACE_Lock* profile_lock_;
+};
+
+TAO_END_VERSIONED_NAMESPACE_DECL
+
+#include /**/ "ace/post.h"
+
+#endif /*TAO_FT_CALLBACKS_H*/
diff --git a/TAO/orbsvcs/orbsvcs/FaultTolerance/fault_tol_export.h b/TAO/orbsvcs/orbsvcs/FaultTolerance/fault_tol_export.h
new file mode 100644
index 00000000000..2179965445a
--- /dev/null
+++ b/TAO/orbsvcs/orbsvcs/FaultTolerance/fault_tol_export.h
@@ -0,0 +1,40 @@
+
+// -*- C++ -*-
+// $Id$
+// Definition for Win32 Export directives.
+// This file is generated automatically by generate_export_file.pl
+// ------------------------------
+#ifndef TAO_FT_EXPORT_H
+#define TAO_FT_EXPORT_H
+
+#include "ace/config-all.h"
+
+#if defined (TAO_AS_STATIC_LIBS)
+# if !defined (TAO_FT_HAS_DLL)
+# define TAO_FT_HAS_DLL 0
+# endif /* ! TAO_FT_HAS_DLL */
+#else
+# if !defined (TAO_FT_HAS_DLL)
+# define TAO_FT_HAS_DLL 1
+# endif /* ! TAO_FT_HAS_DLL */
+#endif
+
+#if defined (TAO_FT_HAS_DLL) && (TAO_FT_HAS_DLL == 1)
+# if defined (TAO_FT_BUILD_DLL)
+# define TAO_FT_Export ACE_Proper_Export_Flag
+# define TAO_FT_SINGLETON_DECLARATION(T) ACE_EXPORT_SINGLETON_DECLARATION (T)
+# define TAO_FT_SINGLETON_DECLARE(SINGLETON_TYPE, CLASS, LOCK) ACE_EXPORT_SINGLETON_DECLARE(SINGLETON_TYPE, CLASS, LOCK)
+# else /* TAO_FT_BUILD_DLL */
+# define TAO_FT_Export ACE_Proper_Import_Flag
+# define TAO_FT_SINGLETON_DECLARATION(T) ACE_IMPORT_SINGLETON_DECLARATION (T)
+# define TAO_FT_SINGLETON_DECLARE(SINGLETON_TYPE, CLASS, LOCK) ACE_IMPORT_SINGLETON_DECLARE(SINGLETON_TYPE, CLASS, LOCK)
+# endif /* TAO_FT_BUILD_DLL */
+#else /* TAO_FT_HAS_DLL == 1 */
+# define TAO_FT_Export
+# define TAO_FT_SINGLETON_DECLARATION(T)
+# define TAO_FT_SINGLETON_DECLARE(SINGLETON_TYPE, CLASS, LOCK)
+#endif /* TAO_FT_HAS_DLL == 1 */
+
+#endif /* TAO_FT_EXPORT_H */
+
+// End of auto generated file.
diff --git a/TAO/orbsvcs/orbsvcs/FaultTolerance/ftconf.h b/TAO/orbsvcs/orbsvcs/FaultTolerance/ftconf.h
new file mode 100644
index 00000000000..a1b6da98a8c
--- /dev/null
+++ b/TAO/orbsvcs/orbsvcs/FaultTolerance/ftconf.h
@@ -0,0 +1,42 @@
+// -*- C++ -*-
+
+//=============================================================================
+/**
+ * @file ftconf.h
+ *
+ * $Id$
+ *
+ * Build configuration file.
+ *
+ * @author Copyright 1995 by Sun Microsystems, Inc.
+ * @author Chris Cleeland
+ * @author Douglas C. Schmidt
+ */
+//=============================================================================
+
+#ifndef TAO_FTCONF_H
+#define TAO_FTCONF_H
+#include /**/ "ace/pre.h"
+
+#include "ace/config-all.h"
+
+#if !defined (ACE_LACKS_PRAGMA_ONCE)
+# pragma once
+#endif /* ACE_LACKS_PRAGMA_ONCE */
+
+// This is the version of the FT_CORBA spec that TAO supports. The
+// exact use of this version has not been emphasised. But TAO would
+// get TaggedComponents for a group with version number. So, for the
+// present we will have this here and do a sanity check for our
+// supported version and the one we receive -- raise an error if
+// necessary.
+
+#if !defined (TAO_DEF_FT_CORBA_MAJOR)
+#define TAO_DEF_FT_CORBA_MAJOR 1
+#endif /* TAO_DEF_FT_CORBA_MAJOR */
+#if !defined (TAO_DEF_FT_CORBA_MINOR)
+#define TAO_DEF_FT_CORBA_MINOR 0
+#endif /* TAO_DEF_FT_CORBA_MINOR */
+
+#include /**/ "ace/post.h"
+#endif /*TAO_FTCONF_H*/
diff --git a/TAO/orbsvcs/orbsvcs/FtRtEvent.mpc b/TAO/orbsvcs/orbsvcs/FtRtEvent.mpc
new file mode 100644
index 00000000000..b510974a944
--- /dev/null
+++ b/TAO/orbsvcs/orbsvcs/FtRtEvent.mpc
@@ -0,0 +1,83 @@
+// -*- MPC -*-
+// $Id$
+
+project (FtRtEvent) : orbsvcslib, core, ftorbutils, rtevent_serv, naming, minimum_corba, pi_server, tao_versioning_idl_defaults {
+ sharedname = TAO_FtRtEvent
+ idlflags += -Wb,export_macro=TAO_FtRtEvent_Export -Wb,export_include=orbsvcs/FtRtEvent/Utils/ftrtevent_export.h
+ dynamicflags = TAO_FTRTEVENT_BUILD_DLL
+ tagchecks += FtRtEvent
+
+ IDL_Files {
+ idlflags += -GC
+ FTRT.idl
+ FtRtecEventComm.idl
+ FTRT_GroupManager.idl
+ }
+
+ IDL_Files {
+ FtRtecEventChannelAdmin.idl
+ }
+
+ Source_Files (ORBSVCS_COMPONENTS) {
+ FtRtEvent {
+ FTRTC.cpp
+ FTRTS.cpp
+ FtRtecEventCommC.cpp
+ FtRtecEventCommS.cpp
+ FTRT_GroupManagerC.cpp
+ FTRT_GroupManagerS.cpp
+ FtRtecEventChannelAdminC.cpp
+ FtRtecEventChannelAdminS.cpp
+ FtRtEvent/Utils
+ }
+ }
+
+ Template_Files {
+ }
+}
+
+project (FTRT_ClientORB) : messaging, orbsvcslib, pi, core {
+ sharedname = TAO_FTRT_ClientORB
+ dynamicflags = TAO_FTRT_BUILD_DLL
+ tagchecks += FTRT_ClientORB
+
+ IDL_Files {
+ }
+
+ Source_Files (ORBSVCS_COMPONENTS) {
+ FTRT_ClientORB {
+ FtRtEvent/ClientORB
+ }
+ }
+
+ Inline_Files {
+ }
+
+ Template_Files {
+ }
+}
+
+project (FTRT_EventChannel) : orbsvcslib, core, ftrtevent, rtevent_serv, utils, pi_server, corba_messaging {
+ sharedname = TAO_FTRT_EventChannel
+ dynamicflags = TAO_FTRTEC_BUILD_DLL
+ tagchecks += FTRT_EventChannel
+ after += FTORB_Utils
+
+ IDL_Files {
+ }
+
+ Source_Files (ORBSVCS_COMPONENTS) {
+ FTRT_EventChannel {
+ FtRtEvent/EventChannel
+ }
+ }
+ Template_Files {
+ FtRtEvent/EventChannel/ConnectionHandler_T.cpp
+ FtRtEvent/EventChannel/Fault_Detector_T.cpp
+ FtRtEvent/EventChannel/FT_ProxyAdmin_T.cpp
+ }
+
+ Header_Files {
+ FtRtEvent/EventChannel/ftrtec_export.h
+ }
+}
diff --git a/TAO/orbsvcs/orbsvcs/FtRtEvent/ClientORB/FTRT_ClientORB_Initializer.cpp b/TAO/orbsvcs/orbsvcs/FtRtEvent/ClientORB/FTRT_ClientORB_Initializer.cpp
new file mode 100644
index 00000000000..e4ee1d43f28
--- /dev/null
+++ b/TAO/orbsvcs/orbsvcs/FtRtEvent/ClientORB/FTRT_ClientORB_Initializer.cpp
@@ -0,0 +1,35 @@
+// $Id$
+
+#include "orbsvcs/FtRtEvent/ClientORB/FTRT_ClientORB_Initializer.h"
+#include "orbsvcs/FtRtEvent/ClientORB/FTRT_ClientORB_Interceptor.h"
+
+ACE_RCSID (ClientORB,
+ FTRT_ClientORB_Initializer,
+ "$Id$")
+
+TAO_BEGIN_VERSIONED_NAMESPACE_DECL
+
+FTRT_ClientORB_Initializer::FTRT_ClientORB_Initializer (int transaction_depth)
+ : client_interceptor_ ( new FTRT_ClientORB_Interceptor(transaction_depth) )
+{
+}
+
+void
+FTRT_ClientORB_Initializer::pre_init (
+ PortableInterceptor::ORBInitInfo_ptr
+ ACE_ENV_ARG_DECL_NOT_USED)
+ ACE_THROW_SPEC ((CORBA::SystemException))
+{
+}
+
+void
+FTRT_ClientORB_Initializer::post_init (
+ PortableInterceptor::ORBInitInfo_ptr info
+ ACE_ENV_ARG_DECL)
+ ACE_THROW_SPEC ((CORBA::SystemException))
+{
+ info->add_client_request_interceptor (client_interceptor_.in()
+ ACE_ENV_ARG_PARAMETER);
+}
+
+TAO_END_VERSIONED_NAMESPACE_DECL
diff --git a/TAO/orbsvcs/orbsvcs/FtRtEvent/ClientORB/FTRT_ClientORB_Initializer.h b/TAO/orbsvcs/orbsvcs/FtRtEvent/ClientORB/FTRT_ClientORB_Initializer.h
new file mode 100644
index 00000000000..7bfd0791eb1
--- /dev/null
+++ b/TAO/orbsvcs/orbsvcs/FtRtEvent/ClientORB/FTRT_ClientORB_Initializer.h
@@ -0,0 +1,65 @@
+// -*- C++ -*-
+
+//=============================================================================
+/**
+ * @file FTRT_ClientORB_Initializer.h
+ *
+ * $Id$
+ *
+ * @author Huang-Ming Huang <hh1@cse.wustl.edu>
+ */
+//=============================================================================
+
+
+#ifndef FTRT_CLIENTORB_INITIALIZER_H
+#define FTRT_CLIENTORB_INITIALIZER_H
+
+#include /**/ "ace/pre.h"
+
+#include "tao/PI/PI.h"
+
+#if !defined (ACE_LACKS_PRAGMA_ONCE)
+# pragma once
+#endif /* ACE_LACKS_PRAGMA_ONCE */
+
+#include "tao/LocalObject.h"
+
+// This is to remove "inherits via dominance" warnings from MSVC.
+// MSVC is being a little too paranoid.
+#if defined(_MSC_VER)
+#pragma warning(push)
+#pragma warning(disable:4250)
+#endif /* _MSC_VER */
+
+TAO_BEGIN_VERSIONED_NAMESPACE_DECL
+
+/// RTCORBA ORB initializer.
+class FTRT_ClientORB_Initializer
+ : public virtual PortableInterceptor::ORBInitializer,
+ public virtual TAO_Local_RefCounted_Object
+{
+public:
+ /// Priority mapping types
+ FTRT_ClientORB_Initializer (int transaction_depth);
+
+ virtual void pre_init (PortableInterceptor::ORBInitInfo_ptr info
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS)
+ ACE_THROW_SPEC ((CORBA::SystemException));
+
+ virtual void post_init (PortableInterceptor::ORBInitInfo_ptr info
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS)
+ ACE_THROW_SPEC ((CORBA::SystemException));
+private:
+ PortableInterceptor::ClientRequestInterceptor_var client_interceptor_;
+};
+
+TAO_END_VERSIONED_NAMESPACE_DECL
+
+#if defined(_MSC_VER)
+#pragma warning(pop)
+#endif /* _MSC_VER */
+
+
+#include /**/ "ace/post.h"
+
+#endif /* FTRT_CLIENTORB_INITIALIZER_H */
diff --git a/TAO/orbsvcs/orbsvcs/FtRtEvent/ClientORB/FTRT_ClientORB_Interceptor.cpp b/TAO/orbsvcs/orbsvcs/FtRtEvent/ClientORB/FTRT_ClientORB_Interceptor.cpp
new file mode 100644
index 00000000000..1cc5d2fd2de
--- /dev/null
+++ b/TAO/orbsvcs/orbsvcs/FtRtEvent/ClientORB/FTRT_ClientORB_Interceptor.cpp
@@ -0,0 +1,161 @@
+// $Id$
+
+#include "orbsvcs/FtRtEvent/ClientORB/FTRT_ClientORB_Interceptor.h"
+#include "tao/MProfile.h"
+#include "tao/Stub.h"
+#include "tao/CDR.h"
+#include "ace/Log_Msg.h"
+
+ACE_RCSID (ClientORB,
+ FTRT_ClientORB_Interceptor,
+ "$Id$")
+
+TAO_BEGIN_VERSIONED_NAMESPACE_DECL
+
+namespace FTRT {
+ const unsigned FT_TRANSACTION_DEPTH = 30;
+ const unsigned FT_FORWARD = 32;
+}
+
+FTRT_ClientORB_Interceptor::
+FTRT_ClientORB_Interceptor (CORBA::Long transaction_depth)
+ : myname_ ("FTRT_ClientORB_Interceptor")
+ , transaction_depth_(transaction_depth)
+{
+}
+
+FTRT_ClientORB_Interceptor::~FTRT_ClientORB_Interceptor (void)
+{
+}
+
+char *
+FTRT_ClientORB_Interceptor::name (ACE_ENV_SINGLE_ARG_DECL_NOT_USED)
+ ACE_THROW_SPEC ((CORBA::SystemException))
+{
+ return CORBA::string_dup (this->myname_);
+}
+
+void
+FTRT_ClientORB_Interceptor::destroy (ACE_ENV_SINGLE_ARG_DECL_NOT_USED)
+ ACE_THROW_SPEC ((CORBA::SystemException))
+{
+}
+
+void
+FTRT_ClientORB_Interceptor::send_poll (
+ PortableInterceptor::ClientRequestInfo_ptr
+ ACE_ENV_ARG_DECL_NOT_USED)
+ ACE_THROW_SPEC ((CORBA::SystemException))
+{
+}
+
+void
+FTRT_ClientORB_Interceptor::send_request (
+ PortableInterceptor::ClientRequestInfo_ptr ri
+ ACE_ENV_ARG_DECL)
+ ACE_THROW_SPEC ((CORBA::SystemException,
+ PortableInterceptor::ForwardRequest))
+{
+ ACE_TRACE("FTRT_ClientORB_Interceptor::send_request");
+ ACE_TRY
+ {
+ // Add FT_REQUEST context
+ IOP::ServiceContext sc;
+ TAO_OutputCDR cdr;
+
+ if ((cdr << ACE_OutputCDR::from_boolean (TAO_ENCAP_BYTE_ORDER)) ==0)
+ return;
+
+ // Add Transaction Depth Context
+ if ((cdr << transaction_depth_) == 0)
+ return;
+ sc.context_id = FTRT::FT_TRANSACTION_DEPTH;
+
+ ACE_Message_Block mb;
+ ACE_CDR::consolidate(&mb, cdr.begin());
+#if (TAO_NO_COPY_OCTET_SEQUENCES == 1)
+ sc.context_data.replace(mb.length(), &mb);
+#else
+ // If the replace method is not available, we will need
+ // to do the copy manually. First, set the octet sequence length.
+ CORBA::ULong length = mb.length ();
+ sc.context_data.length (length);
+
+ // Now copy over each byte.
+ char* base = mb.data_block ()->base ();
+ for(CORBA::ULong i = 0; i < length; i++)
+ {
+ sc.context_data[i] = base[i];
+ }
+#endif /* TAO_NO_COPY_OCTET_SEQUENCES == 1 */
+
+ ri->add_request_service_context (sc, 0 ACE_ENV_ARG_PARAMETER);
+ ACE_TRY_CHECK;
+ }
+ ACE_CATCHANY
+ {
+ // Not much can be done anyway. Just keep quiet
+ }
+ ACE_ENDTRY;
+ ACE_CHECK;
+}
+
+void
+FTRT_ClientORB_Interceptor::receive_reply (
+ PortableInterceptor::ClientRequestInfo_ptr ri
+ ACE_ENV_ARG_DECL)
+ ACE_THROW_SPEC ((CORBA::SystemException))
+{
+ ACE_TRACE("FTRT_ClientORB_Interceptor::receive_reply");
+
+
+ IOP::ServiceContext_var service_context;
+ ACE_TRY {
+ service_context =
+ ri->get_reply_service_context(FTRT::FT_FORWARD
+ ACE_ENV_ARG_PARAMETER);
+ ACE_TRY_CHECK;
+ }
+ ACE_CATCHANY {
+ return;
+ }
+ ACE_ENDTRY;
+ ACE_CHECK;
+
+
+ const char * buf =
+ reinterpret_cast<const char *> (service_context->context_data.get_buffer ());
+
+ TAO_InputCDR cdr (buf,
+ service_context->context_data.length ());
+
+
+ CORBA::Object_var obj;
+
+ if (cdr >> obj) {
+ // update the target
+ CORBA::Object_var target = ri->target(ACE_ENV_SINGLE_ARG_PARAMETER);
+ target->_stubobj ()->base_profiles ( obj->_stubobj()->base_profiles() );
+ ACE_DEBUG((LM_DEBUG, "target object updated\n"));
+ }
+}
+
+void
+FTRT_ClientORB_Interceptor::receive_other (
+ PortableInterceptor::ClientRequestInfo_ptr
+ ACE_ENV_ARG_DECL_NOT_USED)
+ ACE_THROW_SPEC ((CORBA::SystemException,
+ PortableInterceptor::ForwardRequest))
+{
+}
+
+void
+FTRT_ClientORB_Interceptor::receive_exception (
+ PortableInterceptor::ClientRequestInfo_ptr /* ri */
+ ACE_ENV_ARG_DECL_NOT_USED)
+ ACE_THROW_SPEC ((CORBA::SystemException,
+ PortableInterceptor::ForwardRequest))
+{
+}
+
+TAO_END_VERSIONED_NAMESPACE_DECL
diff --git a/TAO/orbsvcs/orbsvcs/FtRtEvent/ClientORB/FTRT_ClientORB_Interceptor.h b/TAO/orbsvcs/orbsvcs/FtRtEvent/ClientORB/FTRT_ClientORB_Interceptor.h
new file mode 100644
index 00000000000..81512859796
--- /dev/null
+++ b/TAO/orbsvcs/orbsvcs/FtRtEvent/ClientORB/FTRT_ClientORB_Interceptor.h
@@ -0,0 +1,90 @@
+// -*- C++ -*-
+
+//=============================================================================
+/**
+ * @file FTRT_ClientORB_Interceptor.h
+ *
+ * $Id$
+ *
+ * @author Huang-Ming Huang <hh1@cse.wustl.edu>
+ */
+//=============================================================================
+
+
+#ifndef TAO_FTRT_CLIENTORB_INTERCEPTOR_H
+#define TAO_FTRT_CLIENTORB_INTERCEPTOR_H
+
+#include /**/ "ace/pre.h"
+
+
+#include "tao/PI/PI.h"
+#include "tao/PortableInterceptorC.h"
+
+#if !defined (ACE_LACKS_PRAGMA_ONCE)
+# pragma once
+#endif /* ACE_LACKS_PRAGMA_ONCE */
+
+#include "tao/LocalObject.h"
+
+// This is to remove "inherits via dominance" warnings from MSVC.
+// MSVC is being a little too paranoid.
+#if defined(_MSC_VER)
+#pragma warning(push)
+#pragma warning(disable:4250)
+#endif /* _MSC_VER */
+
+TAO_BEGIN_VERSIONED_NAMESPACE_DECL
+
+class FTRT_ClientORB_Interceptor
+ : public virtual PortableInterceptor::ClientRequestInterceptor,
+ public virtual TAO_Local_RefCounted_Object
+{
+public:
+ /// ctor.
+ FTRT_ClientORB_Interceptor (CORBA::Long transaction_depth);
+
+ /// dtor.
+ virtual ~FTRT_ClientORB_Interceptor ();
+
+ /// Canonical name of the interceptor.
+ virtual char * name (ACE_ENV_SINGLE_ARG_DECL_WITH_DEFAULTS)
+ ACE_THROW_SPEC ((CORBA::SystemException));
+
+ virtual void destroy (ACE_ENV_SINGLE_ARG_DECL_WITH_DEFAULTS)
+ ACE_THROW_SPEC ((CORBA::SystemException));
+
+ virtual void send_poll (PortableInterceptor::ClientRequestInfo_ptr
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS)
+ ACE_THROW_SPEC ((CORBA::SystemException));
+
+ virtual void send_request (PortableInterceptor::ClientRequestInfo_ptr ri
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS)
+ ACE_THROW_SPEC ((CORBA::SystemException,
+ PortableInterceptor::ForwardRequest));
+
+ virtual void receive_reply (PortableInterceptor::ClientRequestInfo_ptr ri
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS)
+ ACE_THROW_SPEC ((CORBA::SystemException));
+
+ virtual void receive_other (PortableInterceptor::ClientRequestInfo_ptr
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS)
+ ACE_THROW_SPEC ((CORBA::SystemException,
+ PortableInterceptor::ForwardRequest));
+
+ virtual void receive_exception (PortableInterceptor::ClientRequestInfo_ptr ri
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS)
+ ACE_THROW_SPEC ((CORBA::SystemException,
+ PortableInterceptor::ForwardRequest));
+private:
+ const char *myname_;
+ CORBA::Long transaction_depth_;
+};
+
+TAO_END_VERSIONED_NAMESPACE_DECL
+
+#if defined(_MSC_VER)
+#pragma warning(pop)
+#endif /* _MSC_VER */
+
+#include /**/ "ace/post.h"
+#endif
diff --git a/TAO/orbsvcs/orbsvcs/FtRtEvent/ClientORB/FTRT_ClientORB_Loader.cpp b/TAO/orbsvcs/orbsvcs/FtRtEvent/ClientORB/FTRT_ClientORB_Loader.cpp
new file mode 100644
index 00000000000..adac1b323a4
--- /dev/null
+++ b/TAO/orbsvcs/orbsvcs/FtRtEvent/ClientORB/FTRT_ClientORB_Loader.cpp
@@ -0,0 +1,107 @@
+// $Id$
+
+#include "orbsvcs/FtRtEvent/ClientORB/FTRT_ClientORB_Loader.h"
+
+#include "orbsvcs/FtRtEvent/ClientORB/FTRT_ClientORB_Initializer.h"
+
+#include "tao/debug.h"
+#include "tao/ORB_Constants.h"
+#include "tao/ORBInitializer_Registry.h"
+#include "ace/OS_NS_strings.h"
+
+ACE_RCSID (ClientORB,
+ FTRT_ClientORB_Loader,
+ "$Id$")
+
+
+TAO_BEGIN_VERSIONED_NAMESPACE_DECL
+
+namespace TAO_FTRT {
+ FTRT_ClientORB_Loader::FTRT_ClientORB_Loader (void)
+ {
+ }
+
+ FTRT_ClientORB_Loader::~FTRT_ClientORB_Loader (void)
+ {
+ }
+
+ int FTRT_ClientORB_Loader::init (int argc,
+ ACE_TCHAR* argv[])
+ {
+ static int initialized = 0;
+
+ // Only allow initialization once.
+ if (initialized)
+ return 0;
+
+ initialized = 1;
+
+ // Set defaults.
+ int transaction_depth = 1;
+ int curarg = 0;
+
+ // Parse any service configurator parameters.
+ for (curarg = 0; curarg < argc; curarg++)
+ if (ACE_OS::strcasecmp (argv[curarg],
+ ACE_TEXT("-ORBTransactionDepth")) == 0)
+ {
+ curarg++;
+ if (curarg < argc)
+ transaction_depth = atoi(argv[curarg]);
+ }
+
+
+ // Register the ORB initializer.
+ ACE_TRY_NEW_ENV
+ {
+ PortableInterceptor::ORBInitializer_ptr temp_orb_initializer =
+ PortableInterceptor::ORBInitializer::_nil ();
+ PortableInterceptor::ORBInitializer_var orb_initializer;
+
+ /// Register the RTCORBA ORBInitializer.
+ ACE_NEW_THROW_EX (temp_orb_initializer,
+ FTRT_ClientORB_Initializer(transaction_depth),
+ CORBA::NO_MEMORY (
+ CORBA::SystemException::_tao_minor_code (
+ TAO::VMCID,
+ ENOMEM),
+ CORBA::COMPLETED_NO));
+ ACE_TRY_CHECK;
+ orb_initializer = temp_orb_initializer;
+
+ PortableInterceptor::register_orb_initializer (orb_initializer.in ()
+ ACE_ENV_ARG_PARAMETER);
+ ACE_TRY_CHECK;
+ }
+ ACE_CATCHANY
+ {
+ ACE_PRINT_EXCEPTION (ACE_ANY_EXCEPTION,
+ "Unexpected exception caught while "
+ "initializing the TransactionDepth");
+ return 1;
+ }
+ ACE_ENDTRY;
+
+ return 0;
+ }
+}
+
+TAO_END_VERSIONED_NAMESPACE_DECL
+
+ /////////////////////////////////////////////////////////////////////
+
+ACE_FACTORY_NAMESPACE_DEFINE (
+ TAO_FTRT,
+ FTRT_ClientORB_Loader,
+ TAO_FTRT::FTRT_ClientORB_Loader)
+
+ACE_STATIC_SVC_DEFINE (
+ FTRT_ClientORB_Loader,
+ ACE_TEXT ("FTRT_ClientORB_Service"),
+ ACE_SVC_OBJ_T,
+ &ACE_SVC_NAME (FTRT_ClientORB_Loader),
+ ACE_Service_Type::DELETE_THIS
+ | ACE_Service_Type::DELETE_OBJ,
+ 0)
+
+
diff --git a/TAO/orbsvcs/orbsvcs/FtRtEvent/ClientORB/FTRT_ClientORB_Loader.h b/TAO/orbsvcs/orbsvcs/FtRtEvent/ClientORB/FTRT_ClientORB_Loader.h
new file mode 100644
index 00000000000..e66f632a2e8
--- /dev/null
+++ b/TAO/orbsvcs/orbsvcs/FtRtEvent/ClientORB/FTRT_ClientORB_Loader.h
@@ -0,0 +1,57 @@
+// -*- C++ -*-
+
+//=============================================================================
+/**
+ * @file FTRT_ClientORB_Loader.h
+ *
+ * $Id$
+ *
+ * @author Huang-Ming Huang <hh1@cse.wustl.edu>
+ */
+//=============================================================================
+
+#ifndef FTRT_CLIENTORB_LOADER_H
+#define FTRT_CLIENTORB_LOADER_H
+
+#include /**/ "ace/pre.h"
+
+#include "orbsvcs/FtRtEvent/ClientORB/ftrt_clientorb_export.h"
+
+#include "tao/orbconf.h"
+
+#include "ace/Service_Object.h"
+#include "ace/Service_Config.h"
+
+#if !defined (ACE_LACKS_PRAGMA_ONCE)
+# pragma once
+#endif /* ACE_LACKS_PRAGMA_ONCE */
+
+TAO_BEGIN_VERSIONED_NAMESPACE_DECL
+
+class TAO_ORB_Core;
+
+namespace TAO_FTRT {
+
+ class TAO_FTRT_Export FTRT_ClientORB_Loader : public ACE_Service_Object
+ {
+ public:
+ /// Constructor.
+ FTRT_ClientORB_Loader (void);
+
+ /// Destructor.
+ virtual ~FTRT_ClientORB_Loader (void);
+
+ /// Initialize the TransactionDepth loader hooks.
+ virtual int init (int argc,
+ ACE_TCHAR* []);
+ };
+}
+
+TAO_END_VERSIONED_NAMESPACE_DECL
+
+ACE_STATIC_SVC_DECLARE_EXPORT (TAO_FTRT, FTRT_ClientORB_Loader)
+ACE_STATIC_SVC_REQUIRE(FTRT_ClientORB_Loader)
+ACE_FACTORY_DECLARE (TAO_FTRT, FTRT_ClientORB_Loader)
+
+#include /**/ "ace/post.h"
+#endif //FTRT_CLIENTORB_LOADER_H
diff --git a/TAO/orbsvcs/orbsvcs/FtRtEvent/ClientORB/ftrt_clientorb_export.h b/TAO/orbsvcs/orbsvcs/FtRtEvent/ClientORB/ftrt_clientorb_export.h
new file mode 100644
index 00000000000..9dad27d931a
--- /dev/null
+++ b/TAO/orbsvcs/orbsvcs/FtRtEvent/ClientORB/ftrt_clientorb_export.h
@@ -0,0 +1,60 @@
+
+// -*- C++ -*-
+// $Id$
+// Definition for Win32 Export directives.
+// This file is generated automatically by generate_export_file.pl TAO_FTRT
+// ------------------------------
+#ifndef TAO_FTRT_EXPORT_H
+#define TAO_FTRT_EXPORT_H
+
+#include "ace/config-all.h"
+
+#if defined (TAO_AS_STATIC_LIBS)
+# if !defined (TAO_FTRT_HAS_DLL)
+# define TAO_FTRT_HAS_DLL 0
+# endif /* ! TAO_FTRT_HAS_DLL */
+#else
+# if !defined (TAO_FTRT_HAS_DLL)
+# define TAO_FTRT_HAS_DLL 1
+# endif /* ! TAO_FTRT_HAS_DLL */
+#endif
+
+#if defined (TAO_FTRT_HAS_DLL) && (TAO_FTRT_HAS_DLL == 1)
+# if defined (TAO_FTRT_BUILD_DLL)
+# define TAO_FTRT_Export ACE_Proper_Export_Flag
+# define TAO_FTRT_SINGLETON_DECLARATION(T) ACE_EXPORT_SINGLETON_DECLARATION (T)
+# define TAO_FTRT_SINGLETON_DECLARE(SINGLETON_TYPE, CLASS, LOCK) ACE_EXPORT_SINGLETON_DECLARE(SINGLETON_TYPE, CLASS, LOCK)
+# else /* TAO_FTRT_BUILD_DLL */
+# define TAO_FTRT_Export ACE_Proper_Import_Flag
+# define TAO_FTRT_SINGLETON_DECLARATION(T) ACE_IMPORT_SINGLETON_DECLARATION (T)
+# define TAO_FTRT_SINGLETON_DECLARE(SINGLETON_TYPE, CLASS, LOCK) ACE_IMPORT_SINGLETON_DECLARE(SINGLETON_TYPE, CLASS, LOCK)
+# endif /* TAO_FTRT_BUILD_DLL */
+#else /* TAO_FTRT_HAS_DLL == 1 */
+# define TAO_FTRT_Export
+# define TAO_FTRT_SINGLETON_DECLARATION(T)
+# define TAO_FTRT_SINGLETON_DECLARE(SINGLETON_TYPE, CLASS, LOCK)
+#endif /* TAO_FTRT_HAS_DLL == 1 */
+
+// Set TAO_FTRT_NTRACE = 0 to turn on library specific tracing even if
+// tracing is turned off for ACE.
+#if !defined (TAO_FTRT_NTRACE)
+# if (ACE_NTRACE == 1)
+# define TAO_FTRT_NTRACE 1
+# else /* (ACE_NTRACE == 1) */
+# define TAO_FTRT_NTRACE 0
+# endif /* (ACE_NTRACE == 1) */
+#endif /* !TAO_FTRT_NTRACE */
+
+#if (TAO_FTRT_NTRACE == 1)
+# define TAO_FTRT_TRACE(X)
+#else /* (TAO_FTRT_NTRACE == 1) */
+# if !defined (ACE_HAS_TRACE)
+# define ACE_HAS_TRACE
+# endif /* ACE_HAS_TRACE */
+# define TAO_FTRT_TRACE(X) ACE_TRACE_IMPL(X)
+# include "ace/Trace.h"
+#endif /* (TAO_FTRT_NTRACE == 1) */
+
+#endif /* TAO_FTRT_EXPORT_H */
+
+// End of auto generated file.
diff --git a/TAO/orbsvcs/orbsvcs/FtRtEvent/EventChannel/AMI_Primary_Replication_Strategy.cpp b/TAO/orbsvcs/orbsvcs/FtRtEvent/EventChannel/AMI_Primary_Replication_Strategy.cpp
new file mode 100644
index 00000000000..0bae38d051d
--- /dev/null
+++ b/TAO/orbsvcs/orbsvcs/FtRtEvent/EventChannel/AMI_Primary_Replication_Strategy.cpp
@@ -0,0 +1,222 @@
+// $Id$
+
+#include "orbsvcs/FtRtEvent/EventChannel/AMI_Primary_Replication_Strategy.h"
+#include "ace/Synch_T.h"
+#include "orbsvcs/FtRtEvent/EventChannel/GroupInfoPublisher.h"
+#include "orbsvcs/FtRtEvent/EventChannel/Request_Context_Repository.h"
+#include "orbsvcs/FtRtEvent/EventChannel/create_persistent_poa.h"
+#include "orbsvcs/FtRtEvent/EventChannel/Update_Manager.h"
+#include "tao/Utils/PolicyList_Destroyer.h"
+#include "orbsvcs/FtRtEvent/EventChannel/ObjectGroupManagerHandler.h"
+#include "tao/Utils/Implicit_Deactivator.h"
+#include "../Utils/resolve_init.h"
+#include "../Utils/ScopeGuard.h"
+#include "../Utils/Log.h"
+
+ACE_RCSID (EventChannel,
+ AMI_Primary_Replication_Strategy,
+ "$Id$")
+
+TAO_BEGIN_VERSIONED_NAMESPACE_DECL
+
+AMI_Primary_Replication_Strategy::AMI_Primary_Replication_Strategy(bool mt)
+ : handler_(this),
+ mutex_ (mt ? new ACE_SYNCH_RW_MUTEX : 0)
+{
+}
+
+AMI_Primary_Replication_Strategy::~AMI_Primary_Replication_Strategy()
+{
+ running_= false;
+ this->wait();
+}
+
+int AMI_Primary_Replication_Strategy::acquire_read (void)
+{
+ return mutex_ ? mutex_->acquire_read() : 0;
+}
+
+int AMI_Primary_Replication_Strategy::acquire_write (void)
+{
+ return mutex_ ? mutex_->acquire_write() : 0;
+}
+
+int AMI_Primary_Replication_Strategy::release (void)
+{
+ return mutex_ ? mutex_->release() : 0;
+}
+
+int AMI_Primary_Replication_Strategy::svc()
+{
+ ACE_TRY_NEW_ENV {
+ int argc = 0;
+ char** argv = 0;
+ orb_ = CORBA::ORB_init (argc, argv);
+ ACE_TRY_CHECK;
+
+ root_poa_ = resolve_init<PortableServer::POA>(orb_.in(), "RootPOA"
+ ACE_ENV_ARG_PARAMETER);
+ ACE_TRY_CHECK;
+
+ // create POAManager
+ mgr_ = root_poa_->the_POAManager(ACE_ENV_SINGLE_ARG_PARAMETER);
+ ACE_TRY_CHECK;
+
+
+ mgr_->activate(ACE_ENV_SINGLE_ARG_PARAMETER);
+ ACE_TRY_CHECK;
+
+ PortableServer::IdUniquenessPolicy_var id_uniqueness_policy =
+ root_poa_->create_id_uniqueness_policy(PortableServer::MULTIPLE_ID
+ ACE_ENV_ARG_PARAMETER);
+ ACE_TRY_CHECK
+
+ TAO::Utils::PolicyList_Destroyer policy_list(3);
+ policy_list.length(1);
+ policy_list[0] = PortableServer::IdUniquenessPolicy::_duplicate(
+ id_uniqueness_policy.in()
+ );
+ poa_ = create_persistent_poa(root_poa_, mgr_, "AMI_Update", policy_list
+ ACE_ENV_ARG_PARAMETER);
+ ACE_TRY_CHECK;
+
+ id_uniqueness_policy->destroy();
+
+ running_ = true;
+ while (running_) {
+ if (orb_->work_pending())
+ orb_->perform_work();
+ }
+ orb_->destroy();
+ }
+ ACE_CATCHANY {
+ ACE_PRINT_EXCEPTION(ex, "AMI_Primary_Replication_Strategy::svc");
+ running_ = false;
+ return -1;
+ }
+ ACE_ENDTRY;
+ running_ = false;
+ return 0;
+}
+
+void
+AMI_Primary_Replication_Strategy::replicate_request(
+ const FTRT::State& state,
+ RollbackOperation rollback,
+ const FtRtecEventChannelAdmin::ObjectId& oid
+ ACE_ENV_ARG_DECL)
+{
+ ACE_Auto_Event event;
+ Update_Manager* manager = 0;
+ bool success = false;
+
+ FTRT::TransactionDepth transaction_depth =
+ Request_Context_Repository().get_transaction_depth(ACE_ENV_SINGLE_ARG_PARAMETER);
+ ACE_CHECK;
+
+ const FtRtecEventChannelAdmin::EventChannelList& backups =
+ GroupInfoPublisher::instance()->backups();
+
+ size_t num_backups = backups.length();
+
+ if ((size_t)transaction_depth > num_backups) {
+ TAO_FTRTEC::Log(3, "Throwing FTRT::TransactionDepthTooHigh\n");
+ ACE_THROW(FTRT::TransactionDepthTooHigh());
+ }
+
+ ACE_NEW_THROW_EX(manager,
+ Update_Manager(event, backups.length(), transaction_depth-1, success),
+ CORBA::NO_MEMORY());
+
+
+ Request_Context_Repository().set_transaction_depth(0 ACE_ENV_ARG_PARAMETER);
+ ACE_CHECK;
+
+ for (size_t i = 0; i < num_backups; ++i) {
+ PortableServer::ObjectId oid;
+ ACE_TRY_EX(block1) {
+ FTRT::AMI_UpdateableHandler_ptr handler = handler_.activate(manager, i, oid
+ ACE_ENV_ARG_PARAMETER);
+
+ ACE_TRY_CHECK_EX(block1);
+ FtRtecEventChannelAdmin::EventChannel_ptr obj = backups[i];
+ // send set_update request to all the backup replicas
+
+ obj->sendc_set_update(handler, state
+ ACE_ENV_ARG_PARAMETER);
+ ACE_TRY_CHECK_EX(block1);
+ }
+ ACE_CATCHANY {
+ ACE_PRINT_EXCEPTION(ex, "AMI_Primary_Replication_Strategy::replicate_request : ");
+ manager->handle_exception(i);
+ if (oid.length())
+ poa_->deactivate_object(oid);
+ }
+ ACE_ENDTRY;
+ }
+ // wait until the first transaction_depth replicas replied.
+ event.wait();
+
+ if (!success) { // replication failed, transaction depth too high
+ for (size_t i =0; i < num_backups; ++i) {
+ ACE_TRY_EX(block2) {
+ (backups[i]->*rollback)(oid ACE_ENV_ARG_PARAMETER);
+ ACE_TRY_CHECK_EX(block2);
+ }
+ ACE_CATCHALL {
+ }
+ ACE_ENDTRY;
+ }
+ TAO_FTRTEC::Log(3, "Throwing FTRT::TransactionDepthTooHigh\n");
+ ACE_THROW(FTRT::TransactionDepthTooHigh());
+ }
+
+}
+
+void
+AMI_Primary_Replication_Strategy::add_member(const FTRT::ManagerInfo & info,
+ CORBA::ULong object_group_ref_version
+ ACE_ENV_ARG_DECL)
+{
+ ACE_Auto_Event event;
+ const FtRtecEventChannelAdmin::EventChannelList& backups =
+ GroupInfoPublisher::instance()->backups();
+
+ size_t num_backups = backups.length();
+ ObjectGroupManagerHandler add_member_handler(event, num_backups+1);
+ // The extra one is to prevent the event been signaled prematurely.
+
+ PortableServer::ObjectId_var oid =
+ root_poa_->activate_object(&add_member_handler ACE_ENV_ARG_PARAMETER);
+ ACE_CHECK;
+
+ TAO::Utils::Implicit_Deactivator deactivator(&add_member_handler);
+
+ CORBA::Object_var obj =
+ root_poa_->id_to_reference(oid.in() ACE_ENV_ARG_PARAMETER);
+ ACE_CHECK;
+
+ FTRT::AMI_ObjectGroupManagerHandler_var handler =
+ FTRT::AMI_ObjectGroupManagerHandler::_narrow(obj.in() ACE_ENV_ARG_PARAMETER);
+
+ for (unsigned i = 0; i < num_backups; ++i) {
+ ACE_TRY {
+ backups[i]->sendc_add_member(handler.in(),
+ info,
+ object_group_ref_version
+ ACE_ENV_ARG_PARAMETER);
+ ACE_TRY_CHECK;
+ }
+ ACE_CATCHALL {
+ add_member_handler.add_member_excep(0 ACE_ENV_ARG_PARAMETER);
+ }
+ ACE_ENDTRY;
+ }
+ // decrement the number of members so the event can be signaled once
+ // all replys have been received.
+ add_member_handler.add_member_excep(0 ACE_ENV_ARG_PARAMETER);
+
+ event.wait();
+}
+
+TAO_END_VERSIONED_NAMESPACE_DECL
diff --git a/TAO/orbsvcs/orbsvcs/FtRtEvent/EventChannel/AMI_Primary_Replication_Strategy.h b/TAO/orbsvcs/orbsvcs/FtRtEvent/EventChannel/AMI_Primary_Replication_Strategy.h
new file mode 100644
index 00000000000..24d44799505
--- /dev/null
+++ b/TAO/orbsvcs/orbsvcs/FtRtEvent/EventChannel/AMI_Primary_Replication_Strategy.h
@@ -0,0 +1,67 @@
+// -*- C++ -*-
+
+//=============================================================================
+/**
+ * @file AMI_Primary_Replication_Strategy.h
+ *
+ * $Id$
+ *
+ * @author Huang-Ming Huang <hh1@cse.wustl.edu>
+ */
+//=============================================================================
+
+#ifndef AMI_PRIMARY_REPLICATION_STRATEGY_H
+#define AMI_PRIMARY_REPLICATION_STRATEGY_H
+
+#include "orbsvcs/FtRtEvent/EventChannel/UpdateableHandler.h"
+#include "orbsvcs/FtRtEvent/EventChannel/Replication_Strategy.h"
+#include "orbsvcs/FtRtecEventChannelAdminC.h"
+#include "ace/Task.h"
+
+#if !defined (ACE_LACKS_PRAGMA_ONCE)
+# pragma once
+#endif /* ACE_LACKS_PRAGMA_ONCE */
+
+TAO_BEGIN_VERSIONED_NAMESPACE_DECL
+
+/**
+ * @class AMI_Primary_Replication_Strategy.
+ *
+ * @brief Used by primary replicas when AMI calls are used for replicating requests.
+ */
+
+class AMI_Primary_Replication_Strategy : public Replication_Strategy
+ , public ACE_Task_Base
+{
+public:
+ /**
+ * @param mt Specifies whether multithreaded ORB is used.
+ */
+ AMI_Primary_Replication_Strategy(bool mt);
+ virtual ~AMI_Primary_Replication_Strategy();
+ virtual void replicate_request(const FTRT::State& state,
+ RollbackOperation rollback,
+ const FtRtecEventChannelAdmin::ObjectId& oid
+ ACE_ENV_ARG_DECL);
+ virtual void add_member(const FTRT::ManagerInfo & info,
+ CORBA::ULong object_group_ref_version
+ ACE_ENV_ARG_DECL);
+ virtual int acquire_read (void);
+ virtual int acquire_write (void);
+ virtual int release (void);
+ PortableServer::POA_ptr poa() { return poa_.in(); }
+ CORBA::ORB_ptr orb() { return orb_.in();}
+private:
+ virtual int svc (void);
+ CORBA::ORB_var orb_;
+ PortableServer::POA_var root_poa_;
+ PortableServer::POA_var poa_;
+ PortableServer::POAManager_var mgr_;
+ bool running_;
+ UpdateableHandler handler_;
+ ACE_SYNCH_RW_MUTEX* mutex_;
+};
+
+TAO_END_VERSIONED_NAMESPACE_DECL
+
+#endif // AMI_PRIMARY_REPLICATION_STRATEGY_H
diff --git a/TAO/orbsvcs/orbsvcs/FtRtEvent/EventChannel/AMI_Replication_Strategy.cpp b/TAO/orbsvcs/orbsvcs/FtRtEvent/EventChannel/AMI_Replication_Strategy.cpp
new file mode 100644
index 00000000000..b4073479419
--- /dev/null
+++ b/TAO/orbsvcs/orbsvcs/FtRtEvent/EventChannel/AMI_Replication_Strategy.cpp
@@ -0,0 +1,71 @@
+// $Id$
+
+#include "orbsvcs/FtRtEvent/EventChannel/AMI_Replication_Strategy.h"
+#include "orbsvcs/FtRtEvent/EventChannel/AMI_Primary_Replication_Strategy.h"
+
+#include "ace/Auto_Ptr.h"
+
+
+ACE_RCSID (EventChannel,
+ AMI_Replication_Strategy,
+ "$Id$")
+
+TAO_BEGIN_VERSIONED_NAMESPACE_DECL
+
+AMI_Replication_Strategy::AMI_Replication_Strategy(bool mt)
+ : mt_(mt)
+{
+}
+
+AMI_Replication_Strategy::~AMI_Replication_Strategy()
+{
+}
+
+void
+AMI_Replication_Strategy::replicate_request(
+ const FTRT::State& state,
+ RollbackOperation rollback,
+ const FtRtecEventChannelAdmin::ObjectId& oid
+ ACE_ENV_ARG_DECL_NOT_USED)
+{
+ ACE_UNUSED_ARG(state);
+ ACE_UNUSED_ARG(rollback);
+ ACE_UNUSED_ARG(oid);
+}
+
+void
+AMI_Replication_Strategy::add_member(const FTRT::ManagerInfo & info,
+ CORBA::ULong object_group_ref_version
+ ACE_ENV_ARG_DECL_NOT_USED)
+{
+ ACE_UNUSED_ARG(info);
+ ACE_UNUSED_ARG(object_group_ref_version);
+}
+
+Replication_Strategy*
+AMI_Replication_Strategy::make_primary_strategy()
+{
+ AMI_Primary_Replication_Strategy* result;
+ ACE_NEW_RETURN(result, AMI_Primary_Replication_Strategy(mt_), 0);
+ auto_ptr<AMI_Primary_Replication_Strategy> holder(result);
+ if (result->activate() == 0)
+ return holder.release();
+ return 0;
+}
+
+int AMI_Replication_Strategy::acquire_read (void)
+{
+ return 0;
+}
+
+int AMI_Replication_Strategy::acquire_write (void)
+{
+ return 0;
+}
+
+int AMI_Replication_Strategy::release (void)
+{
+ return 0;
+}
+
+TAO_END_VERSIONED_NAMESPACE_DECL
diff --git a/TAO/orbsvcs/orbsvcs/FtRtEvent/EventChannel/AMI_Replication_Strategy.h b/TAO/orbsvcs/orbsvcs/FtRtEvent/EventChannel/AMI_Replication_Strategy.h
new file mode 100644
index 00000000000..8c25f96305d
--- /dev/null
+++ b/TAO/orbsvcs/orbsvcs/FtRtEvent/EventChannel/AMI_Replication_Strategy.h
@@ -0,0 +1,59 @@
+// -*- C++ -*-
+
+//=============================================================================
+/**
+ * @file AMI_Replication_Strategy.h
+ *
+ * $Id$
+ *
+ * @author Huang-Ming Huang <hh1@cse.wustl.edu>
+ */
+//=============================================================================
+
+#ifndef AMI_REPLICATION_STRATEGY_H
+#define AMI_REPLICATION_STRATEGY_H
+
+#include "orbsvcs/FtRtEvent/EventChannel/Replication_Strategy.h"
+
+#if !defined (ACE_LACKS_PRAGMA_ONCE)
+# pragma once
+#endif /* ACE_LACKS_PRAGMA_ONCE */
+
+#include "orbsvcs/FTRT_GroupManagerC.h"
+#include "tao/PortableServer/PortableServer.h"
+#include "ace/Task.h"
+
+TAO_BEGIN_VERSIONED_NAMESPACE_DECL
+
+/**
+ * @class AMI_Replication_Strategy.
+ *
+ * @brief Used by backup replicas when AMI calls are used for replicating requests.
+ */
+class AMI_Replication_Strategy : public Replication_Strategy
+{
+public:
+ /**
+ * @param mt Specifies whether multithreaded ORB is used.
+ */
+ AMI_Replication_Strategy(bool mt);
+ ~AMI_Replication_Strategy();
+ virtual void replicate_request(const FTRT::State& state,
+ RollbackOperation rollback,
+ const FtRtecEventChannelAdmin::ObjectId& oid
+ ACE_ENV_ARG_DECL);
+ virtual void add_member(const FTRT::ManagerInfo & info,
+ CORBA::ULong object_group_ref_version
+ ACE_ENV_ARG_DECL);
+ virtual Replication_Strategy* make_primary_strategy();
+
+ virtual int acquire_read (void);
+ virtual int acquire_write (void);
+ virtual int release (void);
+private:
+ bool mt_;
+};
+
+TAO_END_VERSIONED_NAMESPACE_DECL
+
+#endif
diff --git a/TAO/orbsvcs/orbsvcs/FtRtEvent/EventChannel/Basic_Replication_Strategy.cpp b/TAO/orbsvcs/orbsvcs/FtRtEvent/EventChannel/Basic_Replication_Strategy.cpp
new file mode 100644
index 00000000000..50a4a5f4dff
--- /dev/null
+++ b/TAO/orbsvcs/orbsvcs/FtRtEvent/EventChannel/Basic_Replication_Strategy.cpp
@@ -0,0 +1,158 @@
+// $Id$
+
+#include "orbsvcs/FtRtEvent/EventChannel/Basic_Replication_Strategy.h"
+#include "orbsvcs/FtRtEvent/EventChannel/GroupInfoPublisher.h"
+#include "orbsvcs/FtRtEvent/EventChannel/FTEC_Event_Channel.h"
+#include "orbsvcs/FtRtEvent/EventChannel/Request_Context_Repository.h"
+#include "../Utils/Log.h"
+
+ACE_RCSID (EventChannel,
+ Basic_Replication_Strategy,
+ "$Id$")
+
+TAO_BEGIN_VERSIONED_NAMESPACE_DECL
+
+/// The mutex has to be recursive; otherwise, if the second replicate_request() is
+/// called while the first replicate_request() is waiting for reply, we will get
+/// a deadlock.
+Basic_Replication_Strategy::Basic_Replication_Strategy(bool mt)
+ : sequence_num_(0)
+ , mutex_(mt ? new ACE_SYNCH_RECURSIVE_MUTEX : 0)
+{
+}
+
+Basic_Replication_Strategy::~Basic_Replication_Strategy()
+{
+ delete mutex_;
+}
+
+void
+Basic_Replication_Strategy::check_validity(ACE_ENV_SINGLE_ARG_DECL)
+{
+ FTRT::SequenceNumber seq_no = Request_Context_Repository().get_sequence_number(ACE_ENV_SINGLE_ARG_PARAMETER);
+ ACE_CHECK;
+
+ TAO_FTRTEC::Log(1 , "check_validity : sequence no = %d\n", sequence_num_);
+
+ if (this->sequence_num_ == 0) {
+ // this is the first set_update received from the primary
+ // sync the sequence number with the primary
+ this->sequence_num_ = seq_no;
+ }
+ else if (seq_no != this->sequence_num_+1) {
+ // out of sync, we missed some set_update() request already
+ // throw exception
+ // client_interceptor_->sequence_num_--;
+ FTRT::OutOfSequence exception;
+ exception.current = this->sequence_num_;
+ TAO_FTRTEC::Log(3, "Throwing FTRT::OutOfSequence (old sequence_num_ = %d)\n", this->sequence_num_);
+ ACE_THROW(FTRT::OutOfSequence(exception));
+ }
+ else
+ this->sequence_num_++;
+}
+
+void twoway_set_update(FtRtecEventChannelAdmin::EventChannel_var successor,
+ const FTRT::State& state
+ ACE_ENV_ARG_DECL)
+{
+ bool finished = true;
+ do {
+ ACE_TRY {
+ successor->set_update(state ACE_ENV_ARG_PARAMETER);
+ ACE_TRY_CHECK;
+ }
+ ACE_CATCH(CORBA::COMM_FAILURE, ex) {
+ if (ex.minor() == 6) finished = false;
+ else
+ ACE_RE_THROW;
+ }
+ ACE_ENDTRY;
+ ACE_CHECK;
+ } while(!finished);
+}
+
+void
+Basic_Replication_Strategy::replicate_request(
+ const FTRT::State& state,
+ RollbackOperation rollback,
+ const FtRtecEventChannelAdmin::ObjectId& oid
+ ACE_ENV_ARG_DECL)
+{
+ ACE_UNUSED_ARG(rollback);
+ ACE_UNUSED_ARG(oid);
+
+ FTRT::TransactionDepth transaction_depth =
+ Request_Context_Repository().get_transaction_depth(ACE_ENV_SINGLE_ARG_PARAMETER);
+ ACE_CHECK;
+
+ GroupInfoPublisherBase * info_publisher = GroupInfoPublisher::instance();
+ FtRtecEventChannelAdmin::EventChannel_var successor = info_publisher->successor();
+ if (!CORBA::is_nil(successor.in())) {
+ if (info_publisher->is_primary())
+ this->sequence_num_++;
+
+ TAO_FTRTEC::Log(1, "replicate_request : sequence no = %d\n", sequence_num_);
+ Request_Context_Repository().set_sequence_number(sequence_num_
+ ACE_ENV_ARG_PARAMETER);
+ ACE_CHECK;
+
+ Request_Context_Repository().set_transaction_depth(transaction_depth-1 ACE_ENV_ARG_PARAMETER);
+ ACE_CHECK;
+
+ if (transaction_depth > 1) {
+ twoway_set_update(successor, state ACE_ENV_ARG_PARAMETER);
+ }
+ else {
+ ACE_TRY_EX(ONEWAY_SET_UPDATE) {
+ successor->oneway_set_update(state ACE_ENV_ARG_PARAMETER);
+ ACE_TRY_CHECK_EX(ONEWAY_SET_UPDATE);
+ }
+ ACE_CATCHANY {
+ }
+ ACE_ENDTRY;
+ }
+ }
+ else if (transaction_depth > 1) {
+ TAO_FTRTEC::Log(3, "Throwing FTRT::TransactionDepthTooHigh\n");
+ ACE_THROW(FTRT::TransactionDepthTooHigh());
+ }
+}
+
+void
+Basic_Replication_Strategy::add_member(const FTRT::ManagerInfo & info,
+ CORBA::ULong object_group_ref_version
+ ACE_ENV_ARG_DECL)
+{
+ FtRtecEventChannelAdmin::EventChannel_var successor = GroupInfoPublisher::instance()->successor();
+ bool finished = true;
+ do {
+ ACE_TRY {
+ successor->add_member(info, object_group_ref_version ACE_ENV_ARG_PARAMETER);
+ ACE_TRY_CHECK;
+ }
+ ACE_CATCH(CORBA::COMM_FAILURE, ex) {
+ if (ex.minor() == 6) finished = false;
+ else ACE_RE_THROW;
+ }
+ ACE_ENDTRY;
+ ACE_CHECK;
+ } while (!finished);
+}
+
+int Basic_Replication_Strategy::acquire_read (void)
+{
+ return mutex_ ? mutex_->acquire_read() : 0;
+}
+
+int Basic_Replication_Strategy::acquire_write (void)
+{
+ return mutex_ ? mutex_->acquire_write() : 0;
+}
+
+int Basic_Replication_Strategy::release (void)
+{
+ return mutex_ ? mutex_->release() : 0;
+}
+
+TAO_END_VERSIONED_NAMESPACE_DECL
diff --git a/TAO/orbsvcs/orbsvcs/FtRtEvent/EventChannel/Basic_Replication_Strategy.h b/TAO/orbsvcs/orbsvcs/FtRtEvent/EventChannel/Basic_Replication_Strategy.h
new file mode 100644
index 00000000000..50b18dd95ee
--- /dev/null
+++ b/TAO/orbsvcs/orbsvcs/FtRtEvent/EventChannel/Basic_Replication_Strategy.h
@@ -0,0 +1,59 @@
+// -*- C++ -*-
+
+//=============================================================================
+/**
+ * @file Basic_Replication_Strategy.h
+ *
+ * $Id$
+ *
+ * @author Huang-Ming Huang <hh1@cse.wustl.edu>
+ */
+//=============================================================================
+#ifndef BASIC_REPLICATION_STRATEGY_H
+#define BASIC_REPLICATION_STRATEGY_H
+#include "orbsvcs/FtRtEvent/EventChannel/Replication_Strategy.h"
+#include "ace/Synch.h"
+
+#if !defined (ACE_LACKS_PRAGMA_ONCE)
+# pragma once
+#endif /* ACE_LACKS_PRAGMA_ONCE */
+
+TAO_BEGIN_VERSIONED_NAMESPACE_DECL
+
+/**
+ * @class Basic_Replication_Strategy
+ *
+ * @brief Use two-way CORBA call to replicate the state to backup replicas.
+ */
+
+class Basic_Replication_Strategy : public Replication_Strategy
+{
+public:
+ /**
+ * @param mt Specifies whether multithreaded ORB is used.
+ */
+ Basic_Replication_Strategy(bool mt);
+ ~Basic_Replication_Strategy();
+
+ virtual void check_validity(ACE_ENV_SINGLE_ARG_DECL);
+
+ virtual void replicate_request(const FTRT::State& state,
+ RollbackOperation rollback,
+ const FtRtecEventChannelAdmin::ObjectId& oid
+ ACE_ENV_ARG_DECL);
+ virtual void add_member(const FTRT::ManagerInfo & info,
+ CORBA::ULong object_group_ref_version
+ ACE_ENV_ARG_DECL);
+
+ virtual int acquire_read (void);
+ virtual int acquire_write (void);
+ virtual int release (void);
+
+private:
+ FTRT::SequenceNumber sequence_num_;
+ ACE_SYNCH_RECURSIVE_MUTEX* mutex_;
+};
+
+TAO_END_VERSIONED_NAMESPACE_DECL
+
+#endif
diff --git a/TAO/orbsvcs/orbsvcs/FtRtEvent/EventChannel/ConnectionHandler_T.cpp b/TAO/orbsvcs/orbsvcs/FtRtEvent/EventChannel/ConnectionHandler_T.cpp
new file mode 100644
index 00000000000..a14d2c327eb
--- /dev/null
+++ b/TAO/orbsvcs/orbsvcs/FtRtEvent/EventChannel/ConnectionHandler_T.cpp
@@ -0,0 +1,96 @@
+// $Id$
+
+TAO_BEGIN_VERSIONED_NAMESPACE_DECL
+
+template <ACE_PEER_STREAM_1>
+int ConnectionAcceptHandler<ACE_PEER_STREAM_2>::open (void * acceptor)
+{
+
+ ACE_TRACE("ConnectionAcceptHandler::open\n");
+ ACE_INET_Addr addr;
+
+ if (this->peer ().get_remote_addr (addr) == -1)
+ return -1;
+
+ reactor_ = static_cast<ACE_Service_Object*> (acceptor)->reactor();
+
+ if (reactor_->register_handler (this,
+ ACE_Event_Handler::READ_MASK) == -1)
+ ACE_ERROR_RETURN ((LM_ERROR,
+ "(%P|%t) can't register with reactor\n"),
+ -1);
+
+ ACE_DEBUG ((LM_DEBUG,
+ "(%P|%t) connected with %s\n",
+ addr.get_host_name ()));
+
+ return 0;
+}
+
+template <ACE_PEER_STREAM_1>
+void ConnectionAcceptHandler<ACE_PEER_STREAM_2>::destroy (void)
+{
+ // Remove ourselves from the reactor
+ reactor_->remove_handler
+ (this,
+ ACE_Event_Handler::READ_MASK | ACE_Event_Handler::DONT_CALL);
+
+ // Shut down the connection to the client.
+ this->peer ().close ();
+
+ // Free our memory.
+ delete this;
+}
+
+// If somebody doesn't like us, they will close() us. Actually, if
+// our open() method returns -1, the Acceptor<> will invoke close()
+// on us for cleanup.
+template <ACE_PEER_STREAM_1>
+int ConnectionAcceptHandler<ACE_PEER_STREAM_2>::close (u_long flags)
+{
+ ACE_UNUSED_ARG (flags);
+
+ this->destroy ();
+ return 0;
+}
+
+
+template <ACE_PEER_STREAM_1>
+int ConnectionAcceptHandler<ACE_PEER_STREAM_2>::handle_input (ACE_HANDLE)
+{
+ char buf[8];
+ if (this->peer().recv(buf, sizeof(buf)))
+ return -1;
+ return 0;
+}
+
+// Clean ourselves up when handle_input() (or handle_timer()) returns -1
+
+template <ACE_PEER_STREAM_1>
+int ConnectionAcceptHandler<ACE_PEER_STREAM_2>::handle_close (ACE_HANDLE,
+ ACE_Reactor_Mask)
+{
+ this->destroy ();
+ return 0;
+}
+
+
+template <ACE_PEER_STREAM_1>
+int ConnectionDetectHandler<ACE_PEER_STREAM_2>::handle_close (ACE_HANDLE,
+ ACE_Reactor_Mask)
+{
+ ACE_TRACE("ConnectionDetectHandler::handle_close\n");
+ close();
+ return 0;
+}
+
+template <ACE_PEER_STREAM_1>
+int ConnectionDetectHandler<ACE_PEER_STREAM_2>::close (u_long )
+{
+ if (listener_)
+ listener_->connection_closed();
+ delete this;
+ return 0;
+}
+
+TAO_END_VERSIONED_NAMESPACE_DECL
diff --git a/TAO/orbsvcs/orbsvcs/FtRtEvent/EventChannel/ConnectionHandler_T.h b/TAO/orbsvcs/orbsvcs/FtRtEvent/EventChannel/ConnectionHandler_T.h
new file mode 100644
index 00000000000..37a7597914d
--- /dev/null
+++ b/TAO/orbsvcs/orbsvcs/FtRtEvent/EventChannel/ConnectionHandler_T.h
@@ -0,0 +1,75 @@
+// -*- C++ -*-
+
+//=============================================================================
+/**
+ * @file ConnectionHandler_T.h
+ *
+ * $Id$
+ *
+ * @author Huang-Ming Huang <hh1@cse.wustl.edu>
+ */
+//=============================================================================
+#ifndef CONNECTIONACCEPTHANDLER_H
+#define CONNECTIONACCEPTHANDLER_H
+
+#include "ace/Event_Handler.h"
+#include "ace/Svc_Handler.h"
+
+#if !defined (ACE_LACKS_PRAGMA_ONCE)
+# pragma once
+#endif /* ACE_LACKS_PRAGMA_ONCE */
+
+#include "tao/Versioned_Namespace.h"
+
+TAO_BEGIN_VERSIONED_NAMESPACE_DECL
+
+template <ACE_PEER_STREAM_1>
+class ConnectionAcceptHandler : public ACE_Svc_Handler <ACE_PEER_STREAM_2, ACE_NULL_SYNCH>
+{
+public:
+ virtual int open (void *);
+ virtual void destroy (void);
+ virtual int close (u_long flags = 0);
+protected:
+
+ virtual int handle_input (ACE_HANDLE);
+ virtual int handle_close (ACE_HANDLE,
+ ACE_Reactor_Mask);
+ ~ConnectionAcceptHandler(){}
+private:
+ ACE_Reactor* reactor_;
+};
+
+TAO_END_VERSIONED_NAMESPACE_DECL
+
+#include "orbsvcs/FtRtEvent/EventChannel/FTEC_Group_Manager.h"
+
+TAO_BEGIN_VERSIONED_NAMESPACE_DECL
+
+template <ACE_PEER_STREAM_1>
+class ConnectionDetectHandler : public ACE_Svc_Handler <ACE_PEER_STREAM_2, ACE_NULL_SYNCH>
+{
+public:
+ ConnectionDetectHandler(TAO_FTEC_Fault_Listener* listener = NULL)
+ : listener_(listener){}
+
+ virtual int close (u_long flags = 0);
+
+ virtual int handle_close (ACE_HANDLE,
+ ACE_Reactor_Mask);
+private:
+ TAO_FTEC_Fault_Listener* listener_;
+};
+
+TAO_END_VERSIONED_NAMESPACE_DECL
+
+#if defined (ACE_TEMPLATES_REQUIRE_SOURCE)
+#include "orbsvcs/FtRtEvent/EventChannel/ConnectionHandler_T.cpp"
+#endif /* ACE_TEMPLATES_REQUIRE_SOURCE */
+
+#if defined (ACE_TEMPLATES_REQUIRE_PRAGMA)
+#pragma implementation ("ConnectionHandler_T.cpp")
+#endif /* ACE_TEMPLATES_REQUIRE_PRAGMA */
+
+#endif
+
diff --git a/TAO/orbsvcs/orbsvcs/FtRtEvent/EventChannel/Dynamic_Bitset.cpp b/TAO/orbsvcs/orbsvcs/FtRtEvent/EventChannel/Dynamic_Bitset.cpp
new file mode 100644
index 00000000000..264de9de473
--- /dev/null
+++ b/TAO/orbsvcs/orbsvcs/FtRtEvent/EventChannel/Dynamic_Bitset.cpp
@@ -0,0 +1,125 @@
+// $Id$
+
+#include "orbsvcs/FtRtEvent/EventChannel/Dynamic_Bitset.h"
+#include <assert.h>
+#include <algorithm>
+
+#if !defined (__ACE_INLINE__)
+#include "orbsvcs/FtRtEvent/EventChannel/Dynamic_Bitset.inl"
+#endif /* __ACE_INLINE__ */
+
+inline unsigned ceil(unsigned numerator, unsigned denominator)
+{
+ return numerator/denominator+ (numerator%denominator ? 1 : 0);
+}
+
+TAO_BEGIN_VERSIONED_NAMESPACE_DECL
+
+Dynamic_Bitset::Dynamic_Bitset(Dynamic_Bitset::size_type size)
+ : buffer_size_(ceil(size,BITS_PER_BLOCK))
+ , bit_size_(size)
+ , buffer_(new block[buffer_size_])
+{
+ memset(buffer_, 0, buffer_size_*BYTES_PER_BLOCK);
+}
+
+
+Dynamic_Bitset& Dynamic_Bitset::operator = (const Dynamic_Bitset& other)
+{
+ Dynamic_Bitset temp(other);
+ // swap buffer
+ block* tmp_blk = temp.buffer_;
+ temp.buffer_ = this->buffer_;
+ this->buffer_= tmp_blk;
+
+ this->buffer_size_ = other.buffer_size_;
+ this->bit_size_ = other.bit_size_;
+ return *this;
+}
+
+Dynamic_Bitset& Dynamic_Bitset::operator &=(const Dynamic_Bitset& other)
+{
+ assert(other.bit_size_ == this->bit_size_);
+ size_type len = ceil(bit_size_,BITS_PER_BLOCK);
+ for (size_type i = 0; i < len; ++i)
+ buffer_[i] &= other.buffer_[i];
+ return *this;
+}
+
+bool Dynamic_Bitset::test(Dynamic_Bitset::size_type bit) const
+{
+ size_type block_pos = bit/BITS_PER_BLOCK;
+ size_type bit_pos = bit%BITS_PER_BLOCK;
+ block mask = 1 << bit_pos;
+ return (buffer_[block_pos] & mask) !=0;
+}
+
+void Dynamic_Bitset::set(Dynamic_Bitset::size_type bit, bool val)
+{
+ size_type block_pos = bit/BITS_PER_BLOCK;
+ size_type bit_pos = bit%BITS_PER_BLOCK;
+ block mask = 1 << bit_pos;
+ if (val == false)
+ mask ^= static_cast<block> (-1);
+ buffer_[block_pos] |= mask;
+}
+
+void Dynamic_Bitset::flip()
+{
+ size_type len = ceil(bit_size_,BITS_PER_BLOCK);
+ block mask = static_cast<block> (-1);
+ for (size_type i = 0; i < len; ++i)
+ buffer_[i] ^= mask;
+}
+
+void Dynamic_Bitset::resize(Dynamic_Bitset::size_type num_bits, bool value)
+{
+ size_type len = ceil(num_bits, BITS_PER_BLOCK);
+ if (len > this->buffer_size_) {
+ Dynamic_Bitset tmp(num_bits);
+ memcpy(tmp.buffer_, this->buffer_, this->buffer_size_*BYTES_PER_BLOCK);
+ block mask = static_cast<block> (-1);
+
+ size_type block_pos = this->bit_size_/BITS_PER_BLOCK;
+ size_type bit_pos = this->bit_size_%BITS_PER_BLOCK;
+
+ if (value) {
+ mask <<= bit_pos;
+ tmp.buffer_[block_pos] |= mask;
+ }
+ else {
+ mask >>= (BITS_PER_BLOCK-bit_pos);
+ tmp.buffer_[block_pos] &= mask;
+ }
+
+
+ for (size_type i = block_pos +1; i < len; ++i) {
+ mask = value ? static_cast<block> (-1) : 0;
+ tmp.buffer_[i] = mask;
+ }
+
+ std::swap(tmp.buffer_, this->buffer_);
+ this->buffer_size_ = tmp.buffer_size_;
+ this->bit_size_ = tmp.bit_size_;
+ }
+ else
+ bit_size_ = num_bits;
+}
+
+bool operator == (const Dynamic_Bitset& lhs, const Dynamic_Bitset& rhs)
+{
+ Dynamic_Bitset::size_type bit_size = lhs.size();
+ if (bit_size != rhs.size())
+ return false;
+ Dynamic_Bitset::size_type block_pos = bit_size/Dynamic_Bitset::BITS_PER_BLOCK;
+ Dynamic_Bitset::size_type bit_pos = bit_size%Dynamic_Bitset::BITS_PER_BLOCK;
+ Dynamic_Bitset::size_type i;
+ for (i = 0; i < block_pos; ++i)
+ if (lhs.buffer_[i] != rhs.buffer_[i])
+ return false;
+ Dynamic_Bitset::block mask = static_cast<Dynamic_Bitset::block> (-1);
+ mask >>= (Dynamic_Bitset::BITS_PER_BLOCK-bit_pos);
+ return ((lhs.buffer_[i] ^ rhs.buffer_[i]) & mask ) == 0;
+}
+
+TAO_END_VERSIONED_NAMESPACE_DECL
diff --git a/TAO/orbsvcs/orbsvcs/FtRtEvent/EventChannel/Dynamic_Bitset.h b/TAO/orbsvcs/orbsvcs/FtRtEvent/EventChannel/Dynamic_Bitset.h
new file mode 100644
index 00000000000..c4da90b00af
--- /dev/null
+++ b/TAO/orbsvcs/orbsvcs/FtRtEvent/EventChannel/Dynamic_Bitset.h
@@ -0,0 +1,76 @@
+// -*- C++ -*-
+
+//=============================================================================
+/**
+ * @file Dynamic_Bitset.h
+ *
+ * $Id$
+ *
+ * @author Huang-Ming Huang <hh1@cse.wustl.edu>
+ */
+//=============================================================================
+#ifndef DYNAMIC_BITSET_H
+#define DYNAMIC_BITSET_H
+
+#include "ace/config-all.h"
+
+#include "tao/Versioned_Namespace.h"
+#include "ace/OS_NS_string.h"
+
+TAO_BEGIN_VERSIONED_NAMESPACE_DECL
+
+/**
+ *
+ */
+class Dynamic_Bitset
+{
+ typedef unsigned block;
+ typedef unsigned size_type;
+ enum {
+ BYTES_PER_BLOCK = sizeof(block),
+ BITS_PER_BLOCK = sizeof(block)*8
+ };
+public:
+ class reference {
+ public:
+ typedef unsigned size_type;
+ reference(Dynamic_Bitset* bitset, size_type bit);
+ reference operator = (bool val);
+ operator bool () const;
+ private:
+ Dynamic_Bitset* bitset_;
+ size_type bit_;
+ };
+
+ Dynamic_Bitset(size_type size=0);
+ ~Dynamic_Bitset();
+ Dynamic_Bitset(const Dynamic_Bitset& other);
+ Dynamic_Bitset& operator = (const Dynamic_Bitset& other);
+ Dynamic_Bitset& operator &=(const Dynamic_Bitset& other);
+
+ reference operator[](size_type bit);
+
+ size_type size() const;
+ bool test(size_type bit) const;
+
+ void set(size_type bit, bool val = true);
+ void flip();
+ void resize(size_type num_bits, bool value = false);
+
+ friend bool operator == (const Dynamic_Bitset& lhs, const Dynamic_Bitset& rhs);
+private:
+ size_type buffer_size_;
+ size_type bit_size_;
+ block* buffer_;
+};
+
+bool operator == (const Dynamic_Bitset& lhs, const Dynamic_Bitset& rhs);
+Dynamic_Bitset operator & (const Dynamic_Bitset& lhs, const Dynamic_Bitset& rhs);
+
+TAO_END_VERSIONED_NAMESPACE_DECL
+
+#if defined (__ACE_INLINE__)
+#include "orbsvcs/FtRtEvent/EventChannel/Dynamic_Bitset.inl"
+#endif /* __ACE_INLINE__ */
+
+#endif
diff --git a/TAO/orbsvcs/orbsvcs/FtRtEvent/EventChannel/Dynamic_Bitset.inl b/TAO/orbsvcs/orbsvcs/FtRtEvent/EventChannel/Dynamic_Bitset.inl
new file mode 100644
index 00000000000..d9a1168d994
--- /dev/null
+++ b/TAO/orbsvcs/orbsvcs/FtRtEvent/EventChannel/Dynamic_Bitset.inl
@@ -0,0 +1,69 @@
+// -*- C++ -*-
+
+//=============================================================================
+/**
+ * @file Dynamic_Bitset.inl
+ *
+ * $Id$
+ *
+ * @author Huang-Ming Huang <hh1@cse.wustl.edu>
+ */
+//=============================================================================
+
+TAO_BEGIN_VERSIONED_NAMESPACE_DECL
+
+ACE_INLINE
+Dynamic_Bitset::~Dynamic_Bitset()
+{
+ delete[] buffer_;
+}
+
+ACE_INLINE
+Dynamic_Bitset::Dynamic_Bitset(const Dynamic_Bitset& other)
+ : buffer_size_(other.buffer_size_)
+ , bit_size_(other.bit_size_)
+ , buffer_(new block[other.buffer_size_])
+{
+ ACE_OS::memcpy(buffer_, other.buffer_, buffer_size_*BYTES_PER_BLOCK);
+}
+
+ACE_INLINE
+Dynamic_Bitset operator & (const Dynamic_Bitset& lhs, const Dynamic_Bitset& rhs)
+{
+ Dynamic_Bitset tmp(lhs);
+ tmp &= rhs;
+ return tmp;
+}
+
+ACE_INLINE
+Dynamic_Bitset::reference::reference(Dynamic_Bitset* bitset, Dynamic_Bitset::reference::size_type bit)
+: bitset_(bitset), bit_(bit)
+{
+}
+
+ACE_INLINE
+Dynamic_Bitset::reference Dynamic_Bitset::reference::operator = (bool val)
+{
+ bitset_->set(bit_, val);
+ return *this;
+}
+
+ACE_INLINE
+Dynamic_Bitset::reference::operator bool () const
+{
+ return bitset_->test(bit_);
+}
+
+ACE_INLINE
+Dynamic_Bitset::size_type Dynamic_Bitset::size() const
+{
+ return bit_size_;
+}
+
+ACE_INLINE
+Dynamic_Bitset::reference Dynamic_Bitset::operator[](Dynamic_Bitset::size_type bit)
+{
+ return Dynamic_Bitset::reference(this, bit);
+}
+
+TAO_END_VERSIONED_NAMESPACE_DECL
diff --git a/TAO/orbsvcs/orbsvcs/FtRtEvent/EventChannel/FTEC_Become_Primary_Listener.cpp b/TAO/orbsvcs/orbsvcs/FtRtEvent/EventChannel/FTEC_Become_Primary_Listener.cpp
new file mode 100644
index 00000000000..7f567ab80bb
--- /dev/null
+++ b/TAO/orbsvcs/orbsvcs/FtRtEvent/EventChannel/FTEC_Become_Primary_Listener.cpp
@@ -0,0 +1,11 @@
+// $Id$
+
+#include "orbsvcs/FtRtEvent/EventChannel/FTEC_Become_Primary_Listener.h"
+
+TAO_BEGIN_VERSIONED_NAMESPACE_DECL
+
+TAO_FTEC_Become_Primary_Listener::~TAO_FTEC_Become_Primary_Listener()
+{
+}
+
+TAO_END_VERSIONED_NAMESPACE_DECL
diff --git a/TAO/orbsvcs/orbsvcs/FtRtEvent/EventChannel/FTEC_Become_Primary_Listener.h b/TAO/orbsvcs/orbsvcs/FtRtEvent/EventChannel/FTEC_Become_Primary_Listener.h
new file mode 100644
index 00000000000..c2a056e29dc
--- /dev/null
+++ b/TAO/orbsvcs/orbsvcs/FtRtEvent/EventChannel/FTEC_Become_Primary_Listener.h
@@ -0,0 +1,31 @@
+// -*- C++ -*-
+
+//=============================================================================
+/**
+ * @file FTEC_Become_Primary_Listener.h
+ *
+ * $Id$
+ *
+ * @author Huang-Ming Huang <hh1@cse.wustl.edu>
+ */
+//=============================================================================
+
+#ifndef TAO_FTEC_BECOME_PRIMARY_LISTENER_H
+#define TAO_FTEC_BECOME_PRIMARY_LISTENER_H
+
+#include "orbsvcs/FtRtEvent/EventChannel/ftrtec_export.h"
+
+#include "tao/Versioned_Namespace.h"
+
+TAO_BEGIN_VERSIONED_NAMESPACE_DECL
+
+class TAO_FTRTEC_Export TAO_FTEC_Become_Primary_Listener
+{
+public:
+ virtual ~TAO_FTEC_Become_Primary_Listener();
+ virtual void become_primary()=0;
+};
+
+TAO_END_VERSIONED_NAMESPACE_DECL
+
+#endif // TAO_FTEC_BECOME_PRIMARY_LISTENER_H
diff --git a/TAO/orbsvcs/orbsvcs/FtRtEvent/EventChannel/FTEC_ConsumerAdmin.cpp b/TAO/orbsvcs/orbsvcs/FtRtEvent/EventChannel/FTEC_ConsumerAdmin.cpp
new file mode 100644
index 00000000000..14ec7a5c533
--- /dev/null
+++ b/TAO/orbsvcs/orbsvcs/FtRtEvent/EventChannel/FTEC_ConsumerAdmin.cpp
@@ -0,0 +1,51 @@
+// $Id$
+
+#include "orbsvcs/Event/EC_ProxyConsumer.h"
+#include "orbsvcs/Event/EC_Event_Channel_Base.h"
+#include "orbsvcs/FtRtEvent/EventChannel/FTEC_ConsumerAdmin.h"
+#include "orbsvcs/FtRtEvent/EventChannel/FTEC_ProxySupplier.h"
+#include "orbsvcs/FtRtEvent/EventChannel/ProxySupplierStateWorker.h"
+
+ACE_RCSID (EventChannel,
+ TAO_FTEC_ConsumerAdmin,
+ "$Id$")
+
+TAO_BEGIN_VERSIONED_NAMESPACE_DECL
+
+const FtRtecEventChannelAdmin::OperationType
+TAO_FTEC_ConsumerAdmin::OBTAIN_ID = FtRtecEventChannelAdmin::OBTAIN_PUSH_SUPPLIER;
+
+
+TAO_FTEC_ConsumerAdmin::TAO_FTEC_ConsumerAdmin (TAO_EC_Event_Channel_Base *ec)
+ : TAO_EC_ConsumerAdmin (ec)
+ , FT_Aspect(this, this->event_channel_->consumer_poa ())
+{
+}
+
+TAO_FTEC_ConsumerAdmin::~TAO_FTEC_ConsumerAdmin (void)
+{
+}
+
+
+
+RtecEventChannelAdmin::ProxyPushSupplier_ptr
+TAO_FTEC_ConsumerAdmin::obtain_push_supplier (ACE_ENV_SINGLE_ARG_DECL)
+ ACE_THROW_SPEC ((CORBA::SystemException))
+{
+ ACE_DEBUG((LM_DEBUG,"obtain_push_supplier\n" ));
+ return obtain_proxy(ACE_ENV_SINGLE_ARG_PARAMETER);
+}
+
+void
+TAO_FTEC_ConsumerAdmin::disconnect(RtecEventChannelAdmin::ProxyPushSupplier_ptr obj)
+{
+ ACE_TRY_NEW_ENV {
+ obj->disconnect_push_supplier(ACE_ENV_SINGLE_ARG_PARAMETER);
+ ACE_TRY_CHECK;
+ }
+ ACE_CATCHALL {
+ }
+ ACE_ENDTRY;
+}
+
+TAO_END_VERSIONED_NAMESPACE_DECL
diff --git a/TAO/orbsvcs/orbsvcs/FtRtEvent/EventChannel/FTEC_ConsumerAdmin.h b/TAO/orbsvcs/orbsvcs/FtRtEvent/EventChannel/FTEC_ConsumerAdmin.h
new file mode 100644
index 00000000000..042172fc555
--- /dev/null
+++ b/TAO/orbsvcs/orbsvcs/FtRtEvent/EventChannel/FTEC_ConsumerAdmin.h
@@ -0,0 +1,73 @@
+// -*- C++ -*-
+
+//=============================================================================
+/**
+ * @file FTEC_ConsumerAdmin.h
+ *
+ * $Id$
+ *
+ * @author Huang-Ming Huang <hh1@cse.wustl.edu>
+ */
+//=============================================================================
+#ifndef TAO_FTEC_CONSUMERADMIN_H
+#define TAO_FTEC_CONSUMERADMIN_H
+#include /**/ "ace/pre.h"
+
+#if !defined (ACE_LACKS_PRAGMA_ONCE)
+# pragma once
+#endif /* ACE_LACKS_PRAGMA_ONCE */
+
+#include "orbsvcs/Event/EC_ConsumerAdmin.h"
+#include "orbsvcs/FtRtEvent/EventChannel/FT_ProxyAdmin_T.h"
+#include "orbsvcs/FtRtEvent/EventChannel/ProxySupplierStateWorker.h"
+
+TAO_BEGIN_VERSIONED_NAMESPACE_DECL
+
+namespace FtRtecEventChannelAdmin {
+ struct ConsumerAdminState;
+}
+
+
+class TAO_FTEC_Event_Channel_Impl;
+class TAO_FTEC_ProxyPushSupplier;
+/**
+ * @class TAO_FTEC_ConsumerAdmin
+ *
+ * @brief Implements the ConsumerAdmin interface, i.e. the factory for
+ * TAO_FTEC_ProxyPushSupplier objects.
+ *
+ */
+class TAO_FTEC_ConsumerAdmin
+ : public TAO_EC_ConsumerAdmin
+ , public FT_ProxyAdmin<TAO_FTEC_ConsumerAdmin,
+ TAO_FTEC_ProxyPushSupplier,
+ RtecEventChannelAdmin::ProxyPushSupplier,
+ FtRtecEventChannelAdmin::ConsumerAdminState>
+{
+public:
+ static const FtRtecEventChannelAdmin::OperationType OBTAIN_ID ;
+
+ typedef FT_ProxyAdmin<TAO_FTEC_ConsumerAdmin,
+ TAO_FTEC_ProxyPushSupplier,
+ RtecEventChannelAdmin::ProxyPushSupplier,
+ FtRtecEventChannelAdmin::ConsumerAdminState>
+ FT_Aspect;
+
+ typedef ProxySupplierStateWorker StateWorker;
+ TAO_FTEC_ConsumerAdmin (TAO_EC_Event_Channel_Base* event_channel);
+
+ /// destructor...
+ virtual ~TAO_FTEC_ConsumerAdmin (void);
+
+ // = The RtecEventChannelAdmin::ConsumerAdmin methods...
+ virtual RtecEventChannelAdmin::ProxyPushSupplier_ptr
+ obtain_push_supplier (ACE_ENV_SINGLE_ARG_DECL_NOT_USED)
+ ACE_THROW_SPEC ((CORBA::SystemException));
+
+ void disconnect(RtecEventChannelAdmin::ProxyPushSupplier_ptr obj);
+};
+
+TAO_END_VERSIONED_NAMESPACE_DECL
+
+#include /**/ "ace/post.h"
+#endif /* TAO_EC_CONSUMERADMIN_H */
diff --git a/TAO/orbsvcs/orbsvcs/FtRtEvent/EventChannel/FTEC_Event_Channel.cpp b/TAO/orbsvcs/orbsvcs/FtRtEvent/EventChannel/FTEC_Event_Channel.cpp
new file mode 100644
index 00000000000..a2e2b7a29cd
--- /dev/null
+++ b/TAO/orbsvcs/orbsvcs/FtRtEvent/EventChannel/FTEC_Event_Channel.cpp
@@ -0,0 +1,428 @@
+// $Id$
+
+#include "ace/Dynamic_Service.h"
+#include "orbsvcs/FtRtEvent/EventChannel/FTEC_Event_Channel.h"
+#include "orbsvcs/FtRtEvent/EventChannel/FTEC_Event_Channel_Impl.h"
+#include "../Utils/activate_with_id.h"
+#include "../Utils/resolve_init.h"
+#include "../Utils/UUID.h"
+#include "orbsvcs/FtRtEvent/EventChannel/Fault_Detector_Loader.h"
+#include "orbsvcs/FtRtEvent/EventChannel/Fault_Detector.h"
+#include "orbsvcs/FtRtEvent/EventChannel/Request_Context_Repository.h"
+#include "orbsvcs/FtRtEvent/EventChannel/Replication_Service.h"
+#include "orbsvcs/FtRtEvent/EventChannel/Identification_Service.h"
+#include "orbsvcs/FtRtEvent/EventChannel/create_persistent_poa.h"
+#include "tao/Utils/PolicyList_Destroyer.h"
+#include "orbsvcs/FtRtEvent/EventChannel/GroupInfoPublisher.h"
+
+ACE_RCSID (EventChannel,
+ TAO_FTEC_Event_Channel,
+ "$Id$")
+
+TAO_BEGIN_VERSIONED_NAMESPACE_DECL
+
+TAO_FTEC_Event_Channel::TAO_FTEC_Event_Channel(CORBA::ORB_var orb,
+ PortableServer::POA_var poa)
+ : orb_(orb)
+ , poa_(poa)
+ , ec_impl_(NULL)
+{
+}
+
+TAO_FTEC_Event_Channel::~TAO_FTEC_Event_Channel()
+{
+ delete ec_impl_;
+}
+
+
+void setup_object_group(TAO_FTEC_Event_Channel* es,
+ CosNaming::NamingContext_ptr naming_context,
+ TAO_FTEC_Event_Channel::MEMBERSHIP membership,
+ FtRtecEventChannelAdmin::EventChannel_ptr ec
+ ACE_ENV_ARG_DECL)
+{
+ if (membership != TAO_FTEC_Event_Channel::UNSPECIFIED) {// register to naming service
+ FTRT::ManagerInfoList member_list;
+ member_list.length(1);
+ member_list[0].the_location = Fault_Detector::instance()->my_location();
+ member_list[0].ior = FTRT::ObjectGroupManager::_duplicate(ec);
+
+ if (membership == TAO_FTEC_Event_Channel::PRIMARY)
+ es->create_group(member_list, 0
+ ACE_ENV_ARG_PARAMETER);
+
+ else { // BACKUP
+ FtRtecEventChannelAdmin::EventChannel_var primary =
+ resolve<FtRtecEventChannelAdmin::EventChannel>(naming_context,
+ FTRTEC::Identification_Service::instance()->name()
+ ACE_ENV_ARG_PARAMETER);
+ ACE_CHECK;
+
+ ACE_DEBUG((LM_DEBUG, "Got Primary address from Naming Service\n"));
+
+ primary->join_group(member_list[0] ACE_ENV_ARG_PARAMETER);
+ }
+ ACE_CHECK;
+ }
+}
+
+
+FtRtecEventChannelAdmin::EventChannel_ptr
+TAO_FTEC_Event_Channel::activate(TAO_FTEC_Event_Channel::MEMBERSHIP membership
+ ACE_ENV_ARG_DECL)
+{
+ FTRTEC::Fault_Detector_Loader* detector_loader =
+ ACE_Dynamic_Service<FTRTEC::Fault_Detector_Loader>::instance("FTRTEC_Fault_Detector");
+
+ detector_loader->init(0, 0);
+
+ if (FTRTEC::Identification_Service::instance() == 0)
+ ACE_ERROR_RETURN((LM_ERROR, "No Identification\n"), 0);
+
+ // initialize naming_contex
+ CosNaming::NamingContext_var naming_context
+ = resolve_init<CosNaming::NamingContext>(orb_.in(), "NameService"
+ ACE_ENV_ARG_PARAMETER);
+ // initialize group info publisher
+ GroupInfoPublisher::instance()->set_naming_context(naming_context);
+
+ if (FTRTEC::Replication_Service::instance()->init(0,0) == -1)
+ return 0;
+
+ GroupInfoPublisher::instance()->subscribe(FTRTEC::Replication_Service::instance());
+
+ Request_Context_Repository().init(orb_.in());
+
+ // get POAManager
+ PortableServer::POAManager_var mgr = poa_->the_POAManager(ACE_ENV_SINGLE_ARG_PARAMETER);
+ ACE_CHECK_RETURN(0);
+
+ TAO::Utils::PolicyList_Destroyer policy_list(2);
+
+ persistent_poa_ =
+ create_persistent_poa(poa_, mgr, "FTEC_Persistant_POA", policy_list ACE_ENV_ARG_PARAMETER);
+ ACE_CHECK_RETURN(0);
+
+ // Activate the Event channel implementation
+
+ TAO_EC_Event_Channel_Attributes attr (persistent_poa_.in (),
+ persistent_poa_.in ());
+
+
+ TAO_FTEC_Event_Channel_Impl* ec;
+ ACE_NEW_THROW_EX (ec,
+ TAO_FTEC_Event_Channel_Impl (attr),
+ CORBA::NO_MEMORY());
+
+ this->ec_impl_ = ec;
+
+ const FtRtecEventComm::ObjectId& object_id
+ = FTRTEC::Identification_Service::instance()->object_id();
+
+ FtRtecEventComm::ObjectId consumer_admin_object_id(object_id);
+ consumer_admin_object_id[9]++;
+
+ FtRtecEventComm::ObjectId supplier_admin_object_id(consumer_admin_object_id);
+ supplier_admin_object_id[9]++;
+
+ ec->activate_object(orb_,
+ supplier_admin_object_id,
+ consumer_admin_object_id
+ ACE_ENV_ARG_PARAMETER);
+ ACE_CHECK_RETURN(0);
+
+ FtRtecEventChannelAdmin::EventChannel_var result;
+ activate_object_with_id(result.out(), persistent_poa_.in(), this, object_id
+ ACE_ENV_ARG_PARAMETER);
+ ACE_CHECK_RETURN(0);
+
+
+ setup_object_group(this,
+ naming_context.in(),
+ membership,
+ result.in()
+ ACE_ENV_ARG_PARAMETER);
+ return result._retn();
+}
+
+
+void TAO_FTEC_Event_Channel::set_listener(TAO_FTEC_Become_Primary_Listener* listener)
+{
+ GroupInfoPublisher::instance()->subscribe(listener);
+}
+
+void TAO_FTEC_Event_Channel::set_update (
+ const FTRT::State & s
+ ACE_ENV_ARG_DECL
+ )
+ ACE_THROW_SPEC ((
+ CORBA::SystemException
+ , FTRT::InvalidUpdate
+ , FTRT::OutOfSequence
+ ))
+{
+ ec_impl_->set_update(s ACE_ENV_ARG_PARAMETER);
+}
+
+void TAO_FTEC_Event_Channel::oneway_set_update (
+ const FTRT::State & s
+ ACE_ENV_ARG_DECL
+ )
+ ACE_THROW_SPEC ((
+ CORBA::SystemException
+ ))
+{
+ ec_impl_->set_update(s ACE_ENV_ARG_PARAMETER);
+}
+
+
+RtecEventChannelAdmin::ConsumerAdmin_ptr
+TAO_FTEC_Event_Channel::for_consumers (ACE_ENV_SINGLE_ARG_DECL)
+ ACE_THROW_SPEC ((CORBA::SystemException))
+{
+ return ec_impl_->for_consumers(ACE_ENV_SINGLE_ARG_PARAMETER);
+}
+
+RtecEventChannelAdmin::SupplierAdmin_ptr
+TAO_FTEC_Event_Channel::for_suppliers (ACE_ENV_SINGLE_ARG_DECL)
+ ACE_THROW_SPEC ((CORBA::SystemException))
+{
+ return ec_impl_->for_suppliers(ACE_ENV_SINGLE_ARG_PARAMETER);
+}
+
+
+void
+TAO_FTEC_Event_Channel::set_state (const FTRT::State & s ACE_ENV_ARG_DECL)
+ ACE_THROW_SPEC ((CORBA::SystemException, FTRT::InvalidState))
+{
+ ACE_DEBUG((LM_DEBUG, "TAO_FTEC_Event_Channel::set_state\n"));
+ ec_impl_->set_state(s ACE_ENV_ARG_PARAMETER);
+}
+
+void
+TAO_FTEC_Event_Channel::destroy (ACE_ENV_SINGLE_ARG_DECL)
+ ACE_THROW_SPEC ((CORBA::SystemException))
+{
+ if (Fault_Detector::instance())
+ Fault_Detector::instance()->stop();
+
+ ec_impl_->destroy (ACE_ENV_SINGLE_ARG_PARAMETER);
+ ACE_CHECK;
+ this->orb_->shutdown ();
+}
+
+RtecEventChannelAdmin::Observer_Handle
+TAO_FTEC_Event_Channel::append_observer (RtecEventChannelAdmin::Observer_ptr
+ ACE_ENV_ARG_DECL)
+ ACE_THROW_SPEC ((
+ CORBA::SystemException,
+ RtecEventChannelAdmin::EventChannel::SYNCHRONIZATION_ERROR,
+ RtecEventChannelAdmin::EventChannel::CANT_APPEND_OBSERVER))
+{
+ /// we have yet to implement the replication of observers
+ /// throw an exception for the moment
+ ACE_THROW_RETURN(RtecEventChannelAdmin::EventChannel::CANT_APPEND_OBSERVER(), 0);
+
+ //return this->ec_impl_->append_observer (observer ACE_ENV_ARG_PARAMETER);
+}
+
+void
+TAO_FTEC_Event_Channel::remove_observer (RtecEventChannelAdmin::Observer_Handle
+ ACE_ENV_ARG_DECL)
+ ACE_THROW_SPEC ((
+ CORBA::SystemException,
+ RtecEventChannelAdmin::EventChannel::SYNCHRONIZATION_ERROR,
+ RtecEventChannelAdmin::EventChannel::CANT_REMOVE_OBSERVER))
+{
+ /// we have yet to implement the replication of observers
+ /// throw an exception for the moment
+ ACE_THROW(RtecEventChannelAdmin::EventChannel::CANT_REMOVE_OBSERVER());
+
+ //ec_impl_->remove_observer (handle ACE_ENV_ARG_PARAMETER);
+}
+
+
+
+CORBA::Boolean
+TAO_FTEC_Event_Channel::start (
+ FTRT::FaultListener_ptr listener,
+ FTRT::Location_out location
+ ACE_ENV_ARG_DECL
+ )
+ ACE_THROW_SPEC ((
+ CORBA::SystemException
+ ))
+{
+ return ec_impl_->start(listener, location ACE_ENV_ARG_PARAMETER);
+}
+
+void
+TAO_FTEC_Event_Channel::create_group (
+ const FTRT::ManagerInfoList & info_list,
+ CORBA::ULong object_group_ref_version
+ ACE_ENV_ARG_DECL
+ )
+ ACE_THROW_SPEC ((
+ CORBA::SystemException
+ , FTRT::PredecessorUnreachable
+ ))
+{
+ ec_impl_->create_group(info_list, object_group_ref_version ACE_ENV_ARG_PARAMETER);
+}
+
+void
+TAO_FTEC_Event_Channel::join_group (
+ const FTRT::ManagerInfo & info
+ ACE_ENV_ARG_DECL
+ )
+ ACE_THROW_SPEC ((
+ CORBA::SystemException
+ ))
+{
+ ec_impl_->join_group(info ACE_ENV_ARG_PARAMETER);
+}
+
+void
+TAO_FTEC_Event_Channel::add_member (
+ const FTRT::ManagerInfo & info,
+ CORBA::ULong object_group_ref_version
+ ACE_ENV_ARG_DECL
+ )
+ ACE_THROW_SPEC ((
+ CORBA::SystemException
+ ))
+{
+ ec_impl_->add_member(info, object_group_ref_version ACE_ENV_ARG_PARAMETER);
+}
+
+void
+TAO_FTEC_Event_Channel::remove_member (
+ const FTRT::Location & crashed_location,
+ CORBA::ULong object_group_ref_version
+ ACE_ENV_ARG_DECL)
+ ACE_THROW_SPEC ((
+ CORBA::SystemException
+ ))
+{
+ ec_impl_->remove_member(crashed_location,
+ object_group_ref_version
+ ACE_ENV_ARG_PARAMETER);
+}
+
+void
+TAO_FTEC_Event_Channel::replica_crashed (
+ const FTRT::Location & location
+ ACE_ENV_ARG_DECL
+ )
+ ACE_THROW_SPEC ((
+ CORBA::SystemException
+ ))
+{
+ ec_impl_->replica_crashed(location ACE_ENV_ARG_PARAMETER);
+}
+
+
+ /// EventChannelFacade Interface
+
+::FtRtecEventChannelAdmin::ObjectId *
+TAO_FTEC_Event_Channel::connect_push_consumer (
+ RtecEventComm::PushConsumer_ptr push_consumer,
+ const RtecEventChannelAdmin::ConsumerQOS & qos
+ ACE_ENV_ARG_DECL
+ )
+ ACE_THROW_SPEC ((
+ CORBA::SystemException
+ , RtecEventChannelAdmin::TypeError
+ ))
+{
+ return ec_impl_->connect_push_consumer(push_consumer, qos
+ ACE_ENV_ARG_PARAMETER);
+}
+
+
+::FtRtecEventChannelAdmin::ObjectId *
+TAO_FTEC_Event_Channel::connect_push_supplier (
+ RtecEventComm::PushSupplier_ptr push_supplier,
+ const RtecEventChannelAdmin::SupplierQOS & qos
+ ACE_ENV_ARG_DECL
+ )
+ ACE_THROW_SPEC ((
+ CORBA::SystemException
+ ))
+{
+ return ec_impl_->connect_push_supplier(push_supplier, qos
+ ACE_ENV_ARG_PARAMETER);
+
+}
+
+void
+TAO_FTEC_Event_Channel::disconnect_push_supplier (
+ const FtRtecEventChannelAdmin::ObjectId & oid
+ ACE_ENV_ARG_DECL
+ )
+ ACE_THROW_SPEC ((
+ CORBA::SystemException
+ ))
+{
+ ec_impl_->disconnect_push_supplier(oid
+ ACE_ENV_ARG_PARAMETER);
+}
+
+void
+TAO_FTEC_Event_Channel::disconnect_push_consumer (
+ const FtRtecEventChannelAdmin::ObjectId & oid
+ ACE_ENV_ARG_DECL
+ )
+ ACE_THROW_SPEC ((
+ CORBA::SystemException
+ ))
+{
+ ec_impl_->disconnect_push_consumer(oid
+ ACE_ENV_ARG_PARAMETER);
+}
+
+void
+TAO_FTEC_Event_Channel::suspend_push_supplier (
+ const FtRtecEventChannelAdmin::ObjectId & oid
+ ACE_ENV_ARG_DECL
+ )
+ ACE_THROW_SPEC ((
+ CORBA::SystemException
+ , FtRtecEventComm::InvalidObjectID
+ ))
+{
+ ec_impl_->suspend_push_supplier(oid
+ ACE_ENV_ARG_PARAMETER);
+}
+
+void
+TAO_FTEC_Event_Channel::resume_push_supplier (
+ const FtRtecEventChannelAdmin::ObjectId & oid
+ ACE_ENV_ARG_DECL
+ )
+ ACE_THROW_SPEC ((
+ CORBA::SystemException
+ , FtRtecEventComm::InvalidObjectID
+ ))
+{
+ ec_impl_->resume_push_supplier(oid
+ ACE_ENV_ARG_PARAMETER);
+}
+
+void
+TAO_FTEC_Event_Channel::push (
+ const FtRtecEventChannelAdmin::ObjectId & oid,
+ const RtecEventComm::EventSet & data
+ ACE_ENV_ARG_DECL
+ )
+ ACE_THROW_SPEC ((
+ CORBA::SystemException
+ , FtRtecEventComm::InvalidObjectID
+ ))
+{
+ ec_impl_->push(oid,
+ data
+ ACE_ENV_ARG_PARAMETER);
+}
+
+TAO_END_VERSIONED_NAMESPACE_DECL
diff --git a/TAO/orbsvcs/orbsvcs/FtRtEvent/EventChannel/FTEC_Event_Channel.h b/TAO/orbsvcs/orbsvcs/FtRtEvent/EventChannel/FTEC_Event_Channel.h
new file mode 100644
index 00000000000..397aa0af43e
--- /dev/null
+++ b/TAO/orbsvcs/orbsvcs/FtRtEvent/EventChannel/FTEC_Event_Channel.h
@@ -0,0 +1,184 @@
+// -*- C++ -*-
+
+//=============================================================================
+/**
+ * @file FTEC_Event_Channel.h
+ *
+ * $Id$
+ *
+ * @author Huang-Ming Huang <hh1@cse.wustl.edu>
+ */
+//=============================================================================
+#ifndef FTEC_EVENT_CHANNEL_H
+#define FTEC_EVENT_CHANNEL_H
+
+#include "orbsvcs/FtRtEvent/EventChannel/ftrtec_export.h"
+#include "orbsvcs/FtRtecEventChannelAdminS.h"
+
+#if !defined (ACE_LACKS_PRAGMA_ONCE)
+# pragma once
+#endif /* ACE_LACKS_PRAGMA_ONCE */
+
+TAO_BEGIN_VERSIONED_NAMESPACE_DECL
+
+class TAO_FTEC_Event_Channel_Impl;
+class TAO_FTEC_Become_Primary_Listener;
+
+class TAO_FTRTEC_Export TAO_FTEC_Event_Channel
+ : public POA_FtRtecEventChannelAdmin::EventChannel
+{
+public:
+
+
+ TAO_FTEC_Event_Channel(CORBA::ORB_var orb,
+ PortableServer::POA_var poa);
+
+ ~TAO_FTEC_Event_Channel();
+
+ enum MEMBERSHIP {
+ UNSPECIFIED,
+ PRIMARY,
+ BACKUP
+ };
+
+ /**
+ * Activates the FT Event Channel.
+ *
+ * If the FT EC is activated as a primary, the EC will register itself to the NameService.
+ * If it is activated as a backup, it will try to look up the primary from the NameService
+ * and then join the object group.
+ *
+ * @param membership Specify the role the activated event channel in an object group.
+ *
+ */
+ FtRtecEventChannelAdmin::EventChannel_ptr
+ activate(MEMBERSHIP membership ACE_ENV_ARG_DECL);
+
+ /**
+ * Registers a listener to accept the notication when this object
+ * becomes the primary of the object group.
+ */
+ void set_listener(TAO_FTEC_Become_Primary_Listener* listener);
+
+
+ /// RtecEventChannelAdmin::EventChannel Interface
+
+ virtual RtecEventChannelAdmin::ConsumerAdmin_ptr
+ for_consumers (ACE_ENV_SINGLE_ARG_DECL)
+ ACE_THROW_SPEC ((CORBA::SystemException));
+
+ virtual RtecEventChannelAdmin::SupplierAdmin_ptr
+ for_suppliers (ACE_ENV_SINGLE_ARG_DECL)
+ ACE_THROW_SPEC ((CORBA::SystemException));
+
+ virtual void destroy (ACE_ENV_SINGLE_ARG_DECL_NOT_USED)
+ ACE_THROW_SPEC ((CORBA::SystemException));
+
+ virtual RtecEventChannelAdmin::Observer_Handle
+ append_observer (RtecEventChannelAdmin::Observer_ptr observer ACE_ENV_ARG_DECL)
+ ACE_THROW_SPEC ((CORBA::SystemException, RtecEventChannelAdmin::EventChannel::SYNCHRONIZATION_ERROR,
+ RtecEventChannelAdmin::EventChannel::CANT_APPEND_OBSERVER));
+
+ virtual void remove_observer (RtecEventChannelAdmin::Observer_Handle ACE_ENV_ARG_DECL)
+ ACE_THROW_SPEC ((CORBA::SystemException,RtecEventChannelAdmin::EventChannel::SYNCHRONIZATION_ERROR,
+ RtecEventChannelAdmin::EventChannel::CANT_REMOVE_OBSERVER));
+
+ /// EventChannelFacade Interface, used by FTEC gateway
+
+ virtual ::FtRtecEventChannelAdmin::ObjectId * connect_push_consumer (
+ RtecEventComm::PushConsumer_ptr push_consumer,
+ const RtecEventChannelAdmin::ConsumerQOS & qos
+ ACE_ENV_ARG_DECL)
+ ACE_THROW_SPEC (( CORBA::SystemException, RtecEventChannelAdmin::TypeError)) ;
+
+
+ virtual ::FtRtecEventChannelAdmin::ObjectId * connect_push_supplier (
+ RtecEventComm::PushSupplier_ptr push_supplier,
+ const RtecEventChannelAdmin::SupplierQOS & qos
+ ACE_ENV_ARG_DECL)
+ ACE_THROW_SPEC ((CORBA::SystemException)) ;
+
+ virtual void disconnect_push_supplier (
+ const FtRtecEventChannelAdmin::ObjectId & oid
+ ACE_ENV_ARG_DECL)
+ ACE_THROW_SPEC ((CORBA::SystemException));
+
+ virtual void disconnect_push_consumer (
+ const FtRtecEventChannelAdmin::ObjectId & oid
+ ACE_ENV_ARG_DECL)
+ ACE_THROW_SPEC ((CORBA::SystemException)) ;
+
+ virtual void suspend_push_supplier (
+ const FtRtecEventChannelAdmin::ObjectId & oid
+ ACE_ENV_ARG_DECL)
+ ACE_THROW_SPEC ((CORBA::SystemException, FtRtecEventComm::InvalidObjectID));
+
+ virtual void resume_push_supplier (
+ const FtRtecEventChannelAdmin::ObjectId & oid
+ ACE_ENV_ARG_DECL)
+ ACE_THROW_SPEC ((CORBA::SystemException, FtRtecEventComm::InvalidObjectID)) ;
+
+ virtual void push (
+ const FtRtecEventChannelAdmin::ObjectId & oid,
+ const RtecEventComm::EventSet & data
+ ACE_ENV_ARG_DECL)
+ ACE_THROW_SPEC ((CORBA::SystemException, FtRtecEventComm::InvalidObjectID));
+
+ /// FTRT::GroupManager Interfaces
+ /// These are used for inter-replica communications
+
+ void set_state (
+ const FTRT::State & s ACE_ENV_ARG_DECL)
+ ACE_THROW_SPEC ((CORBA::SystemException, FTRT::InvalidState));
+
+ virtual void set_update (const FTRT::State & s ACE_ENV_ARG_DECL)
+ ACE_THROW_SPEC ((CORBA::SystemException, FTRT::InvalidUpdate, FTRT::OutOfSequence));
+
+ virtual void oneway_set_update (const FTRT::State & s ACE_ENV_ARG_DECL)
+ ACE_THROW_SPEC ((CORBA::SystemException));
+
+
+ virtual CORBA::Boolean start (
+ FTRT::FaultListener_ptr listener,
+ FTRT::Location_out cur
+ ACE_ENV_ARG_DECL)
+ ACE_THROW_SPEC ((CORBA::SystemException));
+
+ virtual void create_group (
+ const FTRT::ManagerInfoList & info_list,
+ CORBA::ULong object_group_ref_version
+ ACE_ENV_ARG_DECL)
+ ACE_THROW_SPEC ((CORBA::SystemException, FTRT::PredecessorUnreachable)) ;
+
+ virtual void join_group (
+ const FTRT::ManagerInfo & info
+ ACE_ENV_ARG_DECL
+ )ACE_THROW_SPEC ((CORBA::SystemException)) ;
+
+ virtual void add_member (
+ const FTRT::ManagerInfo & info,
+ CORBA::ULong object_group_ref_version
+ ACE_ENV_ARG_DECL)
+ ACE_THROW_SPEC ((CORBA::SystemException)) ;
+
+ virtual void remove_member (
+ const FTRT::Location & crashed_location,
+ CORBA::ULong object_group_ref_version
+ ACE_ENV_ARG_DECL)
+ ACE_THROW_SPEC ((CORBA::SystemException));
+
+ virtual void replica_crashed (
+ const FTRT::Location & location
+ ACE_ENV_ARG_DECL)
+ ACE_THROW_SPEC ((CORBA::SystemException)) ;
+
+
+private:
+ CORBA::ORB_var orb_;
+ PortableServer::POA_var poa_, persistent_poa_;
+ TAO_FTEC_Event_Channel_Impl* ec_impl_;
+};
+
+TAO_END_VERSIONED_NAMESPACE_DECL
+
+#endif
diff --git a/TAO/orbsvcs/orbsvcs/FtRtEvent/EventChannel/FTEC_Event_Channel_Impl.cpp b/TAO/orbsvcs/orbsvcs/FtRtEvent/EventChannel/FTEC_Event_Channel_Impl.cpp
new file mode 100644
index 00000000000..0d85bbe8155
--- /dev/null
+++ b/TAO/orbsvcs/orbsvcs/FtRtEvent/EventChannel/FTEC_Event_Channel_Impl.cpp
@@ -0,0 +1,582 @@
+// $Id$
+
+#include "orbsvcs/FtRtEvent/EventChannel/FTEC_Event_Channel_Impl.h"
+#include "orbsvcs/FtRtEvent/EventChannel/FTEC_Factory.h"
+#include "orbsvcs/FtRtEvent/EventChannel/FTEC_SupplierAdmin.h"
+#include "orbsvcs/FtRtEvent/EventChannel/FTEC_ConsumerAdmin.h"
+#include "orbsvcs/FtRtEvent/EventChannel/FTEC_ProxyConsumer.h"
+#include "orbsvcs/FtRtEvent/EventChannel/FTEC_ProxySupplier.h"
+#include "orbsvcs/FtRtEvent/EventChannel/FtEventServiceInterceptor.h"
+#include "orbsvcs/FtRtEvent/EventChannel/FT_ProxyAdmin_Base.h"
+#include "orbsvcs/FtRtEvent/EventChannel/IOGR_Maker.h"
+#include "orbsvcs/FtRtEvent/EventChannel/Replication_Service.h"
+#include "../Utils/Safe_InputCDR.h"
+#include "orbsvcs/FtRtecEventCommC.h"
+
+
+ACE_RCSID (EventChannel,
+ FTEC_Event_Channel_Impl,
+ "$Id$")
+
+TAO_BEGIN_VERSIONED_NAMESPACE_DECL
+
+void obtain_push_supplier(TAO_FTEC_Event_Channel_Impl* ec,
+ FtRtecEventChannelAdmin::Operation& op
+ ACE_ENV_ARG_DECL)
+{
+ ec->consumer_admin()->obtain_proxy(op ACE_ENV_ARG_PARAMETER);
+ ACE_CHECK;
+}
+
+void obtain_push_consumer(TAO_FTEC_Event_Channel_Impl* ec,
+ FtRtecEventChannelAdmin::Operation& op
+ ACE_ENV_ARG_DECL)
+{
+ ec->supplier_admin()->obtain_proxy(op ACE_ENV_ARG_PARAMETER);
+ ACE_CHECK;
+}
+
+void obtain_push_consumer_and_connect(TAO_FTEC_Event_Channel_Impl* ec,
+ const FtRtecEventChannelAdmin::ObjectId& oid,
+ RtecEventComm::PushSupplier_ptr push_supplier,
+ const RtecEventChannelAdmin::SupplierQOS & qos
+ ACE_ENV_ARG_DECL)
+{
+ Request_Context_Repository().set_object_id(oid ACE_ENV_ARG_PARAMETER);
+
+ RtecEventChannelAdmin::ProxyPushConsumer_var consumer =
+ ec->supplier_admin()->obtain(ACE_ENV_SINGLE_ARG_PARAMETER);
+
+ ACE_CHECK;
+
+ ACE_TRY {
+ consumer->connect_push_supplier(push_supplier, qos
+ ACE_ENV_ARG_PARAMETER);
+ ACE_TRY_CHECK;
+ }
+ ACE_CATCHALL {
+ ec->supplier_admin()->disconnect(consumer.in());
+ ACE_RE_THROW;
+ }
+ ACE_ENDTRY;
+ ACE_CHECK;
+}
+
+
+void connect_push_supplier(TAO_FTEC_Event_Channel_Impl* ec,
+ FtRtecEventChannelAdmin::Operation& op
+ ACE_ENV_ARG_DECL)
+{
+ PortableServer::POA_var poa= ec->supplier_poa();
+ ACE_CHECK;
+ FtRtecEventChannelAdmin::Connect_push_supplier_param& param
+ = op.param.connect_supplier_param();
+
+ TAO_FTEC_ProxyPushConsumer* proxy
+ = ec->find_proxy_push_consumer(op.object_id);
+
+ if (proxy == NULL) {
+ obtain_push_consumer_and_connect(ec,
+ op.object_id,
+ param.push_supplier.in(),
+ param.qos
+ ACE_ENV_ARG_PARAMETER);
+ }
+ else {
+ proxy->connect_push_supplier(param.push_supplier.in(),
+ param.qos
+ ACE_ENV_ARG_PARAMETER);
+ }
+ ACE_CHECK;
+}
+
+void obtain_push_supplier_and_connect(TAO_FTEC_Event_Channel_Impl* ec,
+ const FtRtecEventChannelAdmin::ObjectId& oid,
+ RtecEventComm::PushConsumer_ptr push_consumer,
+ const RtecEventChannelAdmin::ConsumerQOS & qos
+ ACE_ENV_ARG_DECL)
+{
+ Request_Context_Repository().set_object_id(oid ACE_ENV_ARG_PARAMETER);
+
+ RtecEventChannelAdmin::ProxyPushSupplier_var supplier =
+ ec->consumer_admin()->obtain(ACE_ENV_SINGLE_ARG_PARAMETER);
+
+ ACE_CHECK;
+
+ ACE_TRY {
+ supplier->connect_push_consumer(push_consumer, qos
+ ACE_ENV_ARG_PARAMETER);
+ ACE_TRY_CHECK;
+ }
+ ACE_CATCHALL {
+ ec->consumer_admin()->disconnect(supplier.in());
+ ACE_RE_THROW;
+ }
+ ACE_ENDTRY;
+ ACE_CHECK;
+}
+
+
+void connect_push_consumer(TAO_FTEC_Event_Channel_Impl* ec,
+ FtRtecEventChannelAdmin::Operation& op
+ ACE_ENV_ARG_DECL)
+{
+ PortableServer::POA_var poa= ec->consumer_poa();
+ ACE_CHECK;
+ FtRtecEventChannelAdmin::Connect_push_consumer_param& param
+ = op.param.connect_consumer_param();
+
+ TAO_FTEC_ProxyPushSupplier* proxy = ec->find_proxy_push_supplier(op.object_id);
+
+ if (proxy == NULL){
+ obtain_push_supplier_and_connect(ec,
+ op.object_id,
+ param.push_consumer.in(),
+ param.qos
+ ACE_ENV_ARG_PARAMETER);
+ }
+ else {
+ proxy->connect_push_consumer(param.push_consumer.in(),
+ param.qos
+ ACE_ENV_ARG_PARAMETER);
+ }
+ ACE_CHECK;
+}
+
+void disconnect_push_supplier(TAO_FTEC_Event_Channel_Impl* ec,
+ FtRtecEventChannelAdmin::Operation& op
+ ACE_ENV_ARG_DECL)
+{
+ PortableServer::POA_var poa= ec->consumer_poa();
+ ACE_CHECK;
+
+ TAO_FTEC_ProxyPushSupplier* proxy = ec->find_proxy_push_supplier(op.object_id);
+
+
+ if (proxy == NULL) // proxy not found
+ ACE_THROW(FTRT::InvalidUpdate());
+
+ ACE_CHECK;
+ proxy->disconnect_push_supplier(ACE_ENV_SINGLE_ARG_PARAMETER);
+ ACE_CHECK;
+}
+
+void disconnect_push_consumer(TAO_FTEC_Event_Channel_Impl* ec,
+ FtRtecEventChannelAdmin::Operation& op
+ ACE_ENV_ARG_DECL)
+{
+ PortableServer::POA_var poa= ec->supplier_poa();
+ ACE_CHECK;
+
+ TAO_FTEC_ProxyPushConsumer* proxy = ec->find_proxy_push_consumer(op.object_id);
+
+ if (proxy == NULL) // proxy not found
+ ACE_THROW(FTRT::InvalidUpdate());
+
+ ACE_CHECK;
+ proxy->disconnect_push_consumer(ACE_ENV_SINGLE_ARG_PARAMETER);
+ ACE_CHECK;
+}
+
+
+void suspend_connection (TAO_FTEC_Event_Channel_Impl* ec,
+ FtRtecEventChannelAdmin::Operation& op
+ ACE_ENV_ARG_DECL)
+{
+ PortableServer::POA_var poa= ec->consumer_poa();
+ ACE_CHECK;
+
+ TAO_FTEC_ProxyPushSupplier* proxy = ec->find_proxy_push_supplier(op.object_id);
+
+
+ if (proxy == NULL) // proxy not found
+ ACE_THROW(FTRT::InvalidUpdate());
+
+ ACE_CHECK;
+ proxy->suspend_connection(ACE_ENV_SINGLE_ARG_PARAMETER);
+ ACE_CHECK;
+}
+
+void resume_connection(TAO_FTEC_Event_Channel_Impl* ec,
+ FtRtecEventChannelAdmin::Operation& op
+ ACE_ENV_ARG_DECL)
+{
+ TAO_FTEC_ProxyPushSupplier* proxy = ec->find_proxy_push_supplier(op.object_id);
+
+
+ if (proxy == NULL) // proxy not found
+ ACE_THROW(FTRT::InvalidUpdate());
+
+ ACE_CHECK;
+ proxy->resume_connection(ACE_ENV_SINGLE_ARG_PARAMETER);
+ ACE_CHECK;
+}
+
+
+typedef void (*Set_update_fun)(TAO_FTEC_Event_Channel_Impl* ec,
+ FtRtecEventChannelAdmin::Operation& op
+ ACE_ENV_ARG_DECL);
+
+Set_update_fun const update_table[] = {
+ &obtain_push_supplier,
+ &obtain_push_consumer,
+ &disconnect_push_supplier,
+ &disconnect_push_consumer,
+ &suspend_connection,
+ &resume_connection,
+ &connect_push_supplier,
+ &connect_push_consumer
+};
+
+TAO_FTEC_Event_Channel_Impl::TAO_FTEC_Event_Channel_Impl(
+ const TAO_EC_Event_Channel_Attributes& attributes)
+ : TAO_EC_Event_Channel_Base(attributes, new TAO_FTEC_Basic_Factory, false)
+{
+ this->scheduler_ =
+ CORBA::Object::_duplicate (attributes.scheduler);
+
+ this->create_strategies ();
+
+}
+
+TAO_FTEC_Event_Channel_Impl::~TAO_FTEC_Event_Channel_Impl()
+{
+}
+
+
+TAO_FTEC_Basic_Factory*
+TAO_FTEC_Event_Channel_Impl::factory()
+{
+ return static_cast<TAO_FTEC_Basic_Factory*> (TAO_EC_Event_Channel_Base::factory());
+}
+
+
+/// Start the internal threads (if any), etc.
+/// After this call the EC can be used.
+void
+TAO_FTEC_Event_Channel_Impl::activate_object (
+ CORBA::ORB_var orb,
+ const FtRtecEventComm::ObjectId& supplier_admin_oid,
+ const FtRtecEventComm::ObjectId& consumer_admin_oid
+ ACE_ENV_ARG_DECL)
+{
+
+ iogr_maker_.init(orb.in() ACE_ENV_ARG_PARAMETER);
+ ACE_CHECK;
+
+ TAO_EC_Event_Channel_Base::activate(ACE_ENV_SINGLE_ARG_PARAMETER);
+ ACE_CHECK;
+
+ supplier_admin()->activate(supplier_admin_oid ACE_ENV_ARG_PARAMETER);
+ ACE_CHECK;
+
+ consumer_admin()->activate(consumer_admin_oid ACE_ENV_ARG_PARAMETER);
+ ACE_CHECK;
+}
+
+
+
+// = The RtecEventChannelAdmin::EventChannel methods...
+/// The default implementation is:
+/// this->consumer_admin ()->_this (ACE_ENV_SINGLE_ARG_PARAMETER);
+RtecEventChannelAdmin::ConsumerAdmin_ptr
+TAO_FTEC_Event_Channel_Impl::for_consumers (ACE_ENV_SINGLE_ARG_DECL)
+ACE_THROW_SPEC ((CORBA::SystemException))
+{
+ CORBA::Object_var obj = consumer_admin()->reference(ACE_ENV_SINGLE_ARG_PARAMETER);
+ obj = IOGR_Maker::instance()->forge_iogr(obj.in()
+ ACE_ENV_ARG_PARAMETER);
+ return RtecEventChannelAdmin::ConsumerAdmin::_narrow(obj.in() ACE_ENV_ARG_PARAMETER);
+}
+
+
+/// The default implementation is:
+/// this->supplier_admin ()->_this (ACE_ENV_SINGLE_ARG_PARAMETER);
+RtecEventChannelAdmin::SupplierAdmin_ptr
+TAO_FTEC_Event_Channel_Impl::for_suppliers (ACE_ENV_SINGLE_ARG_DECL)
+ACE_THROW_SPEC ((CORBA::SystemException))
+{
+ CORBA::Object_var obj = supplier_admin()->reference(ACE_ENV_SINGLE_ARG_PARAMETER);
+ obj = IOGR_Maker::instance()->forge_iogr(obj.in()
+ ACE_ENV_ARG_PARAMETER);
+ return RtecEventChannelAdmin::SupplierAdmin::_narrow(obj.in() ACE_ENV_ARG_PARAMETER);
+}
+
+
+::FtRtecEventChannelAdmin::ObjectId *
+TAO_FTEC_Event_Channel_Impl::connect_push_consumer (
+ RtecEventComm::PushConsumer_ptr push_consumer,
+ const RtecEventChannelAdmin::ConsumerQOS & qos
+ ACE_ENV_ARG_DECL
+ )
+{
+ CORBA::Any_var any
+ = Request_Context_Repository().get_cached_result(ACE_ENV_SINGLE_ARG_PARAMETER);
+ ACE_CHECK_RETURN(0);
+
+ FtRtecEventChannelAdmin::ObjectId *oid;
+
+ if (any.in() >>= oid) {
+ FtRtecEventChannelAdmin::ObjectId* result;
+ ACE_NEW_THROW_EX(result,
+ FtRtecEventChannelAdmin::ObjectId(*oid),
+ CORBA::NO_MEMORY());
+ return result;
+ }
+
+
+ ACE_NEW_THROW_EX(oid, FtRtecEventChannelAdmin::ObjectId, CORBA::NO_MEMORY());
+
+ FtRtecEventChannelAdmin::ObjectId_var object_id = oid;
+
+ Request_Context_Repository().generate_object_id(*oid ACE_ENV_ARG_PARAMETER);
+
+ obtain_push_supplier_and_connect(this,
+ object_id.in(),
+ push_consumer,
+ qos
+ ACE_ENV_ARG_PARAMETER);
+
+ ACE_CHECK_RETURN(0);
+
+ return object_id._retn();
+}
+
+
+::FtRtecEventChannelAdmin::ObjectId *
+TAO_FTEC_Event_Channel_Impl::connect_push_supplier (
+ RtecEventComm::PushSupplier_ptr push_supplier,
+ const RtecEventChannelAdmin::SupplierQOS & qos
+ ACE_ENV_ARG_DECL
+ )
+{
+ CORBA::Any_var any
+ = Request_Context_Repository().get_cached_result(ACE_ENV_SINGLE_ARG_PARAMETER);
+ ACE_CHECK_RETURN(0);
+
+ FtRtecEventChannelAdmin::ObjectId *oid;
+
+ if (any.in() >>= oid) {
+ FtRtecEventChannelAdmin::ObjectId* result;
+ ACE_NEW_THROW_EX(result,
+ FtRtecEventChannelAdmin::ObjectId(*oid),
+ CORBA::NO_MEMORY());
+ return result;
+ }
+
+
+ ACE_NEW_THROW_EX(oid, FtRtecEventChannelAdmin::ObjectId, CORBA::NO_MEMORY());
+ FtRtecEventChannelAdmin::ObjectId_var object_id = oid;
+
+ Request_Context_Repository().generate_object_id(*oid ACE_ENV_ARG_PARAMETER);
+
+ obtain_push_consumer_and_connect(this,
+ object_id.in(),
+ push_supplier,
+ qos
+ ACE_ENV_ARG_PARAMETER);
+
+ ACE_CHECK_RETURN(0);
+
+ return object_id._retn();
+
+}
+
+void TAO_FTEC_Event_Channel_Impl::disconnect_push_supplier (
+ const FtRtecEventChannelAdmin::ObjectId & oid
+ ACE_ENV_ARG_DECL
+ )
+{
+ if (Request_Context_Repository().is_executed_request())
+ return;
+
+ TAO_FTEC_ProxyPushSupplier* proxy = this->find_proxy_push_supplier(oid);
+
+ if (proxy == NULL) // proxy not found
+ return;
+
+ ACE_CHECK;
+ proxy->disconnect_push_supplier(ACE_ENV_SINGLE_ARG_PARAMETER);
+ ACE_CHECK;
+}
+
+void TAO_FTEC_Event_Channel_Impl::disconnect_push_consumer (
+ const FtRtecEventChannelAdmin::ObjectId & oid
+ ACE_ENV_ARG_DECL
+ )
+{
+ if (Request_Context_Repository().is_executed_request())
+ return;
+
+ TAO_FTEC_ProxyPushConsumer* proxy = this->find_proxy_push_consumer(oid);
+
+ if (proxy == NULL) // proxy not found
+ return;
+
+ ACE_CHECK;
+ proxy->disconnect_push_consumer(ACE_ENV_SINGLE_ARG_PARAMETER);
+ ACE_CHECK;
+}
+
+void TAO_FTEC_Event_Channel_Impl::suspend_push_supplier (
+ const FtRtecEventChannelAdmin::ObjectId & oid
+ ACE_ENV_ARG_DECL
+ )
+{
+ if (Request_Context_Repository().is_executed_request())
+ return;
+
+ TAO_FTEC_ProxyPushSupplier* proxy = this->find_proxy_push_supplier(oid);
+
+ if (proxy == NULL) // proxy not found
+ ACE_THROW(FtRtecEventComm::InvalidObjectID());
+
+ ACE_CHECK;
+ proxy->suspend_connection(ACE_ENV_SINGLE_ARG_PARAMETER);
+ ACE_CHECK;
+}
+
+
+void TAO_FTEC_Event_Channel_Impl::resume_push_supplier (
+ const FtRtecEventChannelAdmin::ObjectId & oid
+ ACE_ENV_ARG_DECL
+ )
+{
+ if (Request_Context_Repository().is_executed_request())
+ return;
+
+ TAO_FTEC_ProxyPushSupplier* proxy = this->find_proxy_push_supplier(oid);
+
+ if (proxy == NULL) // proxy not found
+ ACE_THROW(FtRtecEventComm::InvalidObjectID());
+
+ ACE_CHECK;
+ proxy->resume_connection(ACE_ENV_SINGLE_ARG_PARAMETER);
+ ACE_CHECK;
+}
+
+void TAO_FTEC_Event_Channel_Impl::push (
+ const FtRtecEventChannelAdmin::ObjectId & oid,
+ const RtecEventComm::EventSet & data
+ ACE_ENV_ARG_DECL
+ )
+{
+ TAO_FTEC_ProxyPushConsumer* proxy = this->find_proxy_push_consumer(oid);
+
+ if (proxy == NULL) // proxy not found
+ ACE_THROW(FtRtecEventComm::InvalidObjectID());
+
+ proxy->push(data ACE_ENV_ARG_PARAMETER);
+}
+
+
+
+
+void TAO_FTEC_Event_Channel_Impl::get_state (
+ FtRtecEventChannelAdmin::EventChannelState & state
+ ACE_ENV_ARG_DECL
+ )
+{
+ FtEventServiceInterceptor::instance()->get_state(state.cached_operation_results);
+ this->supplier_admin()->get_state(state.supplier_admin_state ACE_ENV_ARG_PARAMETER);
+ ACE_CHECK;
+ this->consumer_admin()->get_state(state.consumer_admin_state ACE_ENV_ARG_PARAMETER);
+ ACE_CHECK;
+}
+
+
+
+void TAO_FTEC_Event_Channel_Impl::set_state (const FTRT::State & stat
+ ACE_ENV_ARG_DECL)
+{
+ FtRtecEventChannelAdmin::EventChannelState state;
+
+ Safe_InputCDR cdr((const char*)stat.get_buffer(), stat.length());
+ cdr >> state;
+
+ FtEventServiceInterceptor::instance()->set_state(state.cached_operation_results);
+ this->supplier_admin()->set_state(state.supplier_admin_state ACE_ENV_ARG_PARAMETER);
+ ACE_CHECK;
+ this->consumer_admin()->set_state(state.consumer_admin_state ACE_ENV_ARG_PARAMETER);
+ ACE_CHECK;
+}
+
+
+void TAO_FTEC_Event_Channel_Impl::set_update (const FTRT::State & s
+ ACE_ENV_ARG_DECL)
+ ACE_THROW_SPEC ((CORBA::SystemException, FTRT::InvalidUpdate))
+{
+ FTRTEC::Replication_Service::instance()->check_validity(ACE_ENV_SINGLE_ARG_PARAMETER);
+
+ if (!Request_Context_Repository().is_executed_request()) {
+ Safe_InputCDR cdr((const char*)s.get_buffer(), s.length());
+
+ FtRtecEventChannelAdmin::Operation_var op(new FtRtecEventChannelAdmin::Operation);
+ if (!(cdr >> *op)) {
+ ACE_THROW(FTRT::InvalidUpdate() );
+ }
+
+ (update_table[op->param._d()])(this, *op ACE_ENV_ARG_PARAMETER);
+ ACE_CHECK;
+
+ }
+}
+
+
+TAO_FTEC_ConsumerAdmin* TAO_FTEC_Event_Channel_Impl::consumer_admin (void) const
+{
+ return static_cast<TAO_FTEC_ConsumerAdmin*> (TAO_EC_Event_Channel_Base::consumer_admin());
+}
+
+/// Access the supplier admin implementation, useful for controlling
+/// the activation...
+TAO_FTEC_SupplierAdmin* TAO_FTEC_Event_Channel_Impl::supplier_admin (void) const
+{
+ return static_cast<TAO_FTEC_SupplierAdmin*> (TAO_EC_Event_Channel_Base::supplier_admin());
+}
+
+
+TAO_FTEC_ProxyPushSupplier*
+TAO_FTEC_Event_Channel_Impl::find_proxy_push_supplier(const FtRtecEventChannelAdmin::ObjectId& id)
+{
+ ACE_TRY_NEW_ENV {
+ PortableServer::POA_var poa = consumer_poa();
+
+ const PortableServer::Servant servant = poa->id_to_servant(
+ reinterpret_cast<const PortableServer::ObjectId&> (id)
+ ACE_ENV_ARG_PARAMETER);
+ ACE_TRY_CHECK;
+ POA_RtecEventChannelAdmin::ProxyPushSupplier_ptr obj =
+ dynamic_cast<POA_RtecEventChannelAdmin::ProxyPushSupplier_ptr> (servant);
+
+ return static_cast<TAO_FTEC_ProxyPushSupplier*> (obj);
+ }
+ ACE_CATCHALL {
+ }
+ ACE_ENDTRY;
+ return 0;
+}
+
+TAO_FTEC_ProxyPushConsumer*
+TAO_FTEC_Event_Channel_Impl::find_proxy_push_consumer(const FtRtecEventChannelAdmin::ObjectId& id)
+{
+ ACE_TRY_NEW_ENV {
+ PortableServer::POA_var poa= supplier_poa();
+
+ const PortableServer::Servant servant = poa->id_to_servant(
+ reinterpret_cast<const PortableServer::ObjectId&> (id)
+ ACE_ENV_ARG_PARAMETER);
+ ACE_TRY_CHECK;
+
+ POA_RtecEventChannelAdmin::ProxyPushConsumer_ptr obj =
+ dynamic_cast<POA_RtecEventChannelAdmin::ProxyPushConsumer_ptr> (servant);
+
+ return static_cast<TAO_FTEC_ProxyPushConsumer*> (obj);
+ }
+ ACE_CATCHALL {
+ }
+ ACE_ENDTRY;
+ return 0;
+}
+
+TAO_END_VERSIONED_NAMESPACE_DECL
diff --git a/TAO/orbsvcs/orbsvcs/FtRtEvent/EventChannel/FTEC_Event_Channel_Impl.h b/TAO/orbsvcs/orbsvcs/FtRtEvent/EventChannel/FTEC_Event_Channel_Impl.h
new file mode 100644
index 00000000000..ba6c2e1bc0d
--- /dev/null
+++ b/TAO/orbsvcs/orbsvcs/FtRtEvent/EventChannel/FTEC_Event_Channel_Impl.h
@@ -0,0 +1,135 @@
+// -*- C++ -*-
+
+//=============================================================================
+/**
+ * @file FTEC_Event_Channel_Impl.h
+ *
+ * $Id$
+ *
+ * @author Huang-Ming Huang <hh1@cse.wustl.edu>
+ */
+//=============================================================================
+#ifndef TAO_FTEC_EVENT_CHANNEL_H
+#define TAO_FTEC_EVENT_CHANNEL_H
+
+#include "ace/Synch_T.h"
+#include "orbsvcs/Event/EC_Event_Channel_Base.h"
+#include "orbsvcs/FtRtecEventChannelAdminC.h"
+#include "orbsvcs/FtRtEvent/EventChannel/FTEC_Factory.h"
+#include "orbsvcs/FtRtEvent/EventChannel/FTEC_Group_Manager.h"
+#include "orbsvcs/FtRtEvent/EventChannel/IOGR_Maker.h"
+
+#if !defined (ACE_LACKS_PRAGMA_ONCE)
+# pragma once
+#endif /* ACE_LACKS_PRAGMA_ONCE */
+
+TAO_BEGIN_VERSIONED_NAMESPACE_DECL
+
+class TAO_FTEC_ProxyPushSupplier;
+class TAO_FTEC_ProxyPushConsumer;
+class TAO_FTEC_SupplierAdmin;
+class TAO_FTEC_ConsumerAdmin;
+class FT_ProxyAdmin_Base;
+
+class TAO_FTEC_Event_Channel_Impl : public TAO_EC_Event_Channel_Base
+ , public TAO_FTEC_Group_Manager
+{
+public:
+ TAO_FTEC_Event_Channel_Impl(const TAO_EC_Event_Channel_Attributes& attributes);
+
+ ~TAO_FTEC_Event_Channel_Impl();
+
+ /// Start the internal threads (if any), etc.
+ /// After this call the EC can be used.
+ virtual void activate_object (
+ CORBA::ORB_var orb,
+ const FtRtecEventComm::ObjectId& supplier_admin_oid,
+ const FtRtecEventComm::ObjectId& consumer_admin_oid
+ ACE_ENV_ARG_DECL);
+
+
+ // = The RtecEventChannelAdmin::EventChannel methods...
+ virtual RtecEventChannelAdmin::ConsumerAdmin_ptr
+ for_consumers (ACE_ENV_SINGLE_ARG_DECL)
+ ACE_THROW_SPEC ((CORBA::SystemException));
+
+
+ virtual RtecEventChannelAdmin::SupplierAdmin_ptr
+ for_suppliers (ACE_ENV_SINGLE_ARG_DECL)
+ ACE_THROW_SPEC ((CORBA::SystemException));
+
+ void get_state (FtRtecEventChannelAdmin::EventChannelState & s
+ ACE_ENV_ARG_DECL);
+
+ void set_state (const FTRT::State & stat ACE_ENV_ARG_DECL);
+
+ void set_update (const FTRT::State & s ACE_ENV_ARG_DECL)
+ ACE_THROW_SPEC ((CORBA::SystemException, FTRT::InvalidUpdate));
+
+ /// EventChannelFacade Interface
+
+ virtual ::FtRtecEventChannelAdmin::ObjectId * connect_push_consumer (
+ RtecEventComm::PushConsumer_ptr push_consumer,
+ const RtecEventChannelAdmin::ConsumerQOS & qos
+ ACE_ENV_ARG_DECL
+ );
+
+
+ virtual ::FtRtecEventChannelAdmin::ObjectId * connect_push_supplier (
+ RtecEventComm::PushSupplier_ptr push_supplier,
+ const RtecEventChannelAdmin::SupplierQOS & qos
+ ACE_ENV_ARG_DECL
+ );
+
+ virtual void disconnect_push_supplier (
+ const FtRtecEventChannelAdmin::ObjectId & oid
+ ACE_ENV_ARG_DECL
+ );
+
+ virtual void disconnect_push_consumer (
+ const FtRtecEventChannelAdmin::ObjectId & oid
+ ACE_ENV_ARG_DECL
+ );
+
+ virtual void suspend_push_supplier (
+ const FtRtecEventChannelAdmin::ObjectId & oid
+ ACE_ENV_ARG_DECL
+ );
+
+ virtual void resume_push_supplier (
+ const FtRtecEventChannelAdmin::ObjectId & oid
+ ACE_ENV_ARG_DECL
+ );
+
+ virtual void push (
+ const FtRtecEventChannelAdmin::ObjectId & oid,
+ const RtecEventComm::EventSet & data
+ ACE_ENV_ARG_DECL
+ );
+
+ ////////////////////////////////////////////
+
+ /// Access the consumer admin implementation, useful for controlling
+ /// the activation...
+ TAO_FTEC_ConsumerAdmin* consumer_admin (void) const;
+
+ /// Access the supplier admin implementation, useful for controlling
+ /// the activation...
+ TAO_FTEC_SupplierAdmin* supplier_admin (void) const;
+
+ TAO_FTEC_ProxyPushSupplier* find_proxy_push_supplier(const FtRtecEventChannelAdmin::ObjectId& id);
+ TAO_FTEC_ProxyPushConsumer* find_proxy_push_consumer(const FtRtecEventChannelAdmin::ObjectId& id);
+
+
+ CORBA::Object_var make_iogr(CORBA::Object_ptr obj
+ ACE_ENV_ARG_DECL);
+
+protected:
+ TAO_FTEC_Basic_Factory* factory();
+private:
+ IOGR_Maker iogr_maker_;
+};
+
+TAO_END_VERSIONED_NAMESPACE_DECL
+
+#endif
diff --git a/TAO/orbsvcs/orbsvcs/FtRtEvent/EventChannel/FTEC_Factory.cpp b/TAO/orbsvcs/orbsvcs/FtRtEvent/EventChannel/FTEC_Factory.cpp
new file mode 100644
index 00000000000..c0bb7566afa
--- /dev/null
+++ b/TAO/orbsvcs/orbsvcs/FtRtEvent/EventChannel/FTEC_Factory.cpp
@@ -0,0 +1,56 @@
+// $Id$
+#include "orbsvcs/Event/EC_Event_Channel.h"
+#include "orbsvcs/FtRtEvent/EventChannel/FTEC_Event_Channel.h"
+#include "orbsvcs/FtRtEvent/EventChannel/FTEC_Factory.h"
+#include "orbsvcs/FtRtEvent/EventChannel/FTEC_ProxySupplier.h"
+#include "orbsvcs/FtRtEvent/EventChannel/FTEC_ProxyConsumer.h"
+#include "orbsvcs/FtRtEvent/EventChannel/FTEC_SupplierAdmin.h"
+#include "orbsvcs/FtRtEvent/EventChannel/FTEC_ConsumerAdmin.h"
+
+ACE_RCSID (EventChannel,
+ FTEC_Factory,
+ "$Id$")
+
+TAO_BEGIN_VERSIONED_NAMESPACE_DECL
+
+TAO_FTEC_Basic_Factory::TAO_FTEC_Basic_Factory (void)
+{
+}
+
+TAO_EC_ConsumerAdmin*
+TAO_FTEC_Basic_Factory::create_consumer_admin (TAO_EC_Event_Channel_Base* ec)
+{
+ return new TAO_FTEC_ConsumerAdmin(ec);
+}
+
+TAO_EC_SupplierAdmin*
+TAO_FTEC_Basic_Factory::create_supplier_admin (TAO_EC_Event_Channel_Base* ec)
+{
+ return new TAO_FTEC_SupplierAdmin(ec);
+}
+
+TAO_EC_ProxyPushSupplier*
+TAO_FTEC_Basic_Factory::create_proxy_push_supplier (TAO_EC_Event_Channel_Base* ec)
+{
+ return new TAO_FTEC_ProxyPushSupplier(ec, consumer_validate_connection_);
+}
+
+TAO_EC_ProxyPushConsumer*
+TAO_FTEC_Basic_Factory::create_proxy_push_consumer (TAO_EC_Event_Channel_Base* ec)
+{
+ return new TAO_FTEC_ProxyPushConsumer(ec);
+}
+
+void
+TAO_FTEC_Basic_Factory::destroy_proxy_push_supplier (TAO_EC_ProxyPushSupplier* proxy)
+{
+ delete proxy;
+}
+
+void
+TAO_FTEC_Basic_Factory::destroy_proxy_push_consumer (TAO_EC_ProxyPushConsumer* proxy)
+{
+ delete proxy;
+}
+
+TAO_END_VERSIONED_NAMESPACE_DECL
diff --git a/TAO/orbsvcs/orbsvcs/FtRtEvent/EventChannel/FTEC_Factory.h b/TAO/orbsvcs/orbsvcs/FtRtEvent/EventChannel/FTEC_Factory.h
new file mode 100644
index 00000000000..5fd7cb8e131
--- /dev/null
+++ b/TAO/orbsvcs/orbsvcs/FtRtEvent/EventChannel/FTEC_Factory.h
@@ -0,0 +1,49 @@
+// -*- C++ -*-
+
+//=============================================================================
+/**
+ * @file FTEC_Factory.h
+ *
+ * $Id$
+ *
+ * @author Huang-Ming Huang <hh1@cse.wustl.edu>
+ */
+//=============================================================================
+#ifndef FTEC_FACTORY_H
+#define FTEC_FACTORY_H
+
+#include "orbsvcs/Event/EC_Default_Factory.h"
+
+#if !defined (ACE_LACKS_PRAGMA_ONCE)
+# pragma once
+#endif /* ACE_LACKS_PRAGMA_ONCE */
+
+
+TAO_BEGIN_VERSIONED_NAMESPACE_DECL
+
+class TAO_FTEC_Basic_Factory : public TAO_EC_Default_Factory
+{
+public:
+ /// Constructor
+ TAO_FTEC_Basic_Factory (void);
+ virtual TAO_EC_ConsumerAdmin*
+ create_consumer_admin (TAO_EC_Event_Channel_Base*);
+ virtual TAO_EC_SupplierAdmin*
+ create_supplier_admin (TAO_EC_Event_Channel_Base*);
+
+ virtual TAO_EC_ProxyPushSupplier*
+ create_proxy_push_supplier (TAO_EC_Event_Channel_Base*);
+ virtual void
+ destroy_proxy_push_supplier (TAO_EC_ProxyPushSupplier*);
+
+ /// Create and destroy a ProxyPushConsumer
+ virtual TAO_EC_ProxyPushConsumer*
+ create_proxy_push_consumer (TAO_EC_Event_Channel_Base*);
+ virtual void
+ destroy_proxy_push_consumer (TAO_EC_ProxyPushConsumer*);
+};
+
+TAO_END_VERSIONED_NAMESPACE_DECL
+
+#endif
+
diff --git a/TAO/orbsvcs/orbsvcs/FtRtEvent/EventChannel/FTEC_Fault_Listener.h b/TAO/orbsvcs/orbsvcs/FtRtEvent/EventChannel/FTEC_Fault_Listener.h
new file mode 100644
index 00000000000..c2eb737544e
--- /dev/null
+++ b/TAO/orbsvcs/orbsvcs/FtRtEvent/EventChannel/FTEC_Fault_Listener.h
@@ -0,0 +1,29 @@
+// -*- C++ -*-
+
+//=============================================================================
+/**
+ * @file FTEC_Fault_Listener.h
+ *
+ * $Id$
+ *
+ * @author Huang-Ming Huang <hh1@cse.wustl.edu>
+ */
+//=============================================================================
+
+#ifndef TAO_FTEC_FAULT_LISTENER_H
+#define TAO_FTEC_FAULT_LISTENER_H
+
+#include "tao/Versioned_Namespace.h"
+
+TAO_BEGIN_VERSIONED_NAMESPACE_DECL
+
+class TAO_FTEC_Fault_Listener
+{
+public:
+ virtual ~TAO_FTEC_Fault_Listener(){};
+ virtual void connection_closed()=0;
+};
+
+TAO_END_VERSIONED_NAMESPACE_DECL
+
+#endif
diff --git a/TAO/orbsvcs/orbsvcs/FtRtEvent/EventChannel/FTEC_Group_Manager.cpp b/TAO/orbsvcs/orbsvcs/FtRtEvent/EventChannel/FTEC_Group_Manager.cpp
new file mode 100644
index 00000000000..80c7ba30a06
--- /dev/null
+++ b/TAO/orbsvcs/orbsvcs/FtRtEvent/EventChannel/FTEC_Group_Manager.cpp
@@ -0,0 +1,378 @@
+// $Id$
+
+#include "orbsvcs/FtRtEvent/EventChannel/FTEC_Group_Manager.h"
+#include "ace/Synch_T.h"
+#include "orbsvcs/FtRtEvent/EventChannel/Replication_Service.h"
+#include "orbsvcs/FtRtEvent/EventChannel/Fault_Detector.h"
+#include "orbsvcs/FtRtEvent/EventChannel/IOGR_Maker.h"
+#include "orbsvcs/FtRtEvent/EventChannel/GroupInfoPublisher.h"
+#include "orbsvcs/FtRtEvent/EventChannel/Replication_Service.h"
+#include "../Utils/Log.h"
+#include "tao/CDR.h"
+#include "orbsvcs/PortableGroup/PG_Operators.h"
+
+ACE_RCSID (EventChannel,
+ TAO_FTEC_Group_Manager,
+ "$Id$")
+
+TAO_BEGIN_VERSIONED_NAMESPACE_DECL
+
+int find_by_location(const FTRT::ManagerInfoList& list,
+ const FTRT::Location & location)
+{
+ unsigned i;
+ for (i = 0; i < list.length(); ++i) {
+ if (list[i].the_location == location) {
+ return i;
+ }
+ }
+ return i;
+}
+
+/*
+void print(const FTRT::Location& location)
+{
+ ACE_DEBUG((LM_DEBUG, "{"));
+ for (size_t i = 0; i < location.length(); ++i) {
+ ACE_DEBUG((LM_DEBUG, "<%s,%s>", location[i].id.in(), location[i].kind.in()));
+ }
+ ACE_DEBUG((LM_DEBUG, "}"));
+}
+*/
+
+struct TAO_FTEC_Group_Manager_Impl
+{
+ FTRT::ManagerInfoList info_list;
+ unsigned my_position;
+};
+
+TAO_FTEC_Group_Manager::TAO_FTEC_Group_Manager()
+: impl_(new TAO_FTEC_Group_Manager_Impl)
+{
+ Fault_Detector::instance()->set_listener(this);
+}
+
+TAO_FTEC_Group_Manager::~TAO_FTEC_Group_Manager()
+{
+ delete impl_;
+}
+
+CORBA::Boolean TAO_FTEC_Group_Manager::start (
+ FTRT::FaultListener_ptr listener,
+ FTRT::Location_out cur
+ ACE_ENV_ARG_DECL_NOT_USED
+ )
+ ACE_THROW_SPEC ((
+ CORBA::SystemException
+ ))
+{
+ listener_ = listener;
+ ACE_NEW_RETURN(cur , FTRT::Location(Fault_Detector::instance()->my_location()), false);
+ return true;
+}
+
+
+void TAO_FTEC_Group_Manager::create_group (
+ const FTRT::ManagerInfoList & info_list,
+ CORBA::ULong object_group_ref_version
+ ACE_ENV_ARG_DECL)
+{
+ TAO_FTRTEC::Log(1, "create_group\n");
+
+ impl_->info_list = info_list;
+ impl_->my_position = find_by_location(info_list,
+ Fault_Detector::instance()->my_location());
+
+ GroupInfoPublisherBase* publisher = GroupInfoPublisher::instance();
+ GroupInfoPublisherBase::Info_ptr info (
+ publisher->setup_info(impl_->info_list,
+ impl_->my_position,
+ object_group_ref_version
+ ACE_ENV_ARG_PARAMETER));
+ ACE_CHECK;
+
+ publisher->update_info(info);
+
+ IOGR_Maker::instance()->set_ref_version( object_group_ref_version );
+
+ if (impl_->my_position > 0) {
+ Fault_Detector* detector = Fault_Detector::instance();
+ if ( detector->connect(impl_->info_list[impl_->my_position-1].the_location) == -1) {
+ ACE_DEBUG((LM_DEBUG, "Cannot connect to predecesor\n"));
+ ACE_THROW(FTRT::PredecessorUnreachable());
+ }
+ }
+
+ FtRtecEventChannelAdmin::EventChannel_var successor
+ = publisher->successor();
+
+ if (!CORBA::is_nil(successor.in())) {
+ successor->create_group(info_list, object_group_ref_version
+ ACE_ENV_ARG_PARAMETER);
+ ACE_CHECK;
+ }
+}
+
+void TAO_FTEC_Group_Manager::join_group (
+ const FTRT::ManagerInfo & info
+ ACE_ENV_ARG_DECL)
+{
+ TAO_FTRTEC::Log(1, "join group\n");
+ if (impl_->my_position == 0) {
+ FTRTEC::Replication_Service* svc = FTRTEC::Replication_Service::instance();
+ ACE_Write_Guard<FTRTEC::Replication_Service> lock(*svc);
+ add_member(info, IOGR_Maker::instance()->get_ref_version()+1
+ ACE_ENV_ARG_PARAMETER);
+ }
+}
+
+void TAO_FTEC_Group_Manager::add_member (
+ const FTRT::ManagerInfo & info,
+ CORBA::ULong object_group_ref_version
+ ACE_ENV_ARG_DECL)
+{
+ TAO_FTRTEC::Log(1, "add_member location = <%s>\n",
+ (const char*)info.the_location[0].id);
+
+ auto_ptr<TAO_FTEC_Group_Manager_Impl> new_impl(new TAO_FTEC_Group_Manager_Impl);
+
+ new_impl->my_position = impl_->my_position;
+ size_t pos = impl_->info_list.length();
+ new_impl->info_list.length(pos+1);
+ for (size_t i = 0; i < pos; ++i) {
+ new_impl->info_list[i] = impl_->info_list[i];
+ }
+ new_impl->info_list[pos] = info;
+
+ GroupInfoPublisherBase* publisher = GroupInfoPublisher::instance();
+ GroupInfoPublisherBase::Info_ptr group_info (
+ publisher->setup_info(new_impl->info_list,
+ new_impl->my_position,
+ object_group_ref_version
+ ACE_ENV_ARG_PARAMETER));
+ ACE_CHECK;
+
+ int last_one = (impl_->my_position == impl_->info_list.length()-1);
+
+ if (!last_one)
+ {
+ // I am not the last of replica, tell my successor that
+ // a new member has joined in.
+ ACE_TRY_EX(block) {
+ FTRTEC::Replication_Service::instance()->add_member(info, object_group_ref_version
+ ACE_ENV_ARG_PARAMETER);
+ ACE_TRY_CHECK_EX(block);
+ }
+ ACE_CATCHANY {
+ // Unable to send request to all the successors.
+ // Now this node become the last replica of the object group.
+ // update the info list again
+ new_impl->info_list.length(new_impl->my_position+2);
+ new_impl->info_list[new_impl->my_position+1] = info;
+
+ /// group_info = publisher->set_info(..) should be enough.
+ /// However, GCC 2.96 is not happy with that.
+
+ GroupInfoPublisherBase::Info_ptr group_info1 (
+ publisher->setup_info(new_impl->info_list,
+ new_impl->my_position,
+ object_group_ref_version
+ ACE_ENV_ARG_PARAMETER));
+ ACE_CHECK;
+ ACE_AUTO_PTR_RESET(group_info, group_info1.release(), GroupInfoPublisherBase::Info);
+
+ last_one = true;
+ }
+ ACE_ENDTRY;
+ ACE_CHECK;
+ }
+
+ if (last_one)
+ {
+ // this is the last replica in the list
+ // synchornize the state with the newly joined replica.
+ FtRtecEventChannelAdmin::EventChannelState state;
+ get_state(state ACE_ENV_ARG_PARAMETER);
+
+ TAO_OutputCDR cdr;
+ cdr << state;
+
+ FTRT::State s;
+ if (cdr.begin()->cont()) {
+ ACE_Message_Block* blk;
+ ACE_NEW_THROW_EX(blk, ACE_Message_Block, CORBA::NO_MEMORY());
+ ACE_CDR::consolidate(blk, cdr.begin());
+#if (TAO_NO_COPY_OCTET_SEQUENCES == 1)
+ s.replace(blk->length(), blk);
+#else
+ // If the replace method is not available, we will need
+ // to do the copy manually. First, set the octet sequence length.
+ CORBA::ULong length = blk->length ();
+ s.length (length);
+
+ // Now copy over each byte.
+ char* base = blk->data_block ()->base ();
+ for(CORBA::ULong i = 0; i < length; i++)
+ {
+ s[i] = base[i];
+ }
+#endif /* TAO_NO_COPY_OCTET_SEQUENCES == 1 */
+
+ blk->release();
+ }
+ else {
+#if (TAO_NO_COPY_OCTET_SEQUENCES == 1)
+ s.replace(cdr.begin()->length(), cdr.begin());
+#else
+ // If the replace method is not available, we will need
+ // to do the copy manually. First, set the octet sequence length.
+ CORBA::ULong length = cdr.begin ()->length ();
+ s.length (length);
+
+ // Now copy over each byte.
+ char* base = cdr.begin()->data_block ()->base ();
+ for(CORBA::ULong i = 0; i < length; i++)
+ {
+ s[i] = base[i];
+ }
+#endif /* TAO_NO_COPY_OCTET_SEQUENCES == 1 */
+ }
+
+ TAO_FTRTEC::Log(2, "Setting state\n");
+ info.ior->set_state(s ACE_ENV_ARG_PARAMETER);
+ ACE_CHECK;
+ info.ior->create_group(new_impl->info_list,
+ object_group_ref_version
+ ACE_ENV_ARG_PARAMETER);
+ ACE_CHECK;
+ TAO_FTRTEC::Log(2, "After create_group\n");
+ }
+
+ // commit the changes
+ IOGR_Maker::instance()->set_ref_version( object_group_ref_version );
+ publisher->update_info(group_info);
+ delete impl_;
+ impl_ = new_impl.release();
+}
+
+template <class SEQ>
+void remove_item(SEQ & seq, int position)
+{
+ int i = position;
+ int len = seq.length()-1;
+ for (;i < len; ++i)
+ seq[i] = seq[i+1];
+ seq.length(len);
+}
+
+void TAO_FTEC_Group_Manager::replica_crashed (
+ const FTRT::Location & location
+ ACE_ENV_ARG_DECL)
+{
+ TAO_FTRTEC::Log(1, "TAO_FTEC_Group_Manager::replica_crashed\n");
+ FTRTEC::Replication_Service* svc = FTRTEC::Replication_Service::instance();
+ ACE_Write_Guard<FTRTEC::Replication_Service> lock(*svc);
+ remove_member(location, IOGR_Maker::instance()->get_ref_version()+1
+ ACE_ENV_ARG_PARAMETER);
+}
+
+void TAO_FTEC_Group_Manager::remove_member (
+ const FTRT::Location & crashed_location,
+ CORBA::ULong object_group_ref_version
+ ACE_ENV_ARG_DECL)
+{
+ // find my position of this EventChannel in the group
+ unsigned crashed_pos = find_by_location(impl_->info_list, crashed_location);
+ if (crashed_pos >= impl_->info_list.length()) {
+ return;
+ }
+
+ ACE_ASSERT(impl_->my_position != crashed_pos);
+ remove_item(impl_->info_list, crashed_pos);
+
+ if (impl_->my_position > crashed_pos)
+ --impl_->my_position;
+
+ GroupInfoPublisherBase* publisher = GroupInfoPublisher::instance();
+
+ GroupInfoPublisherBase::Info_ptr info (
+ publisher->setup_info(impl_->info_list,
+ impl_->my_position,
+ object_group_ref_version
+ ACE_ENV_ARG_PARAMETER));
+ ACE_CHECK;
+ publisher->update_info(info);
+
+ FtRtecEventChannelAdmin::EventChannel_var successor =
+ publisher->successor();
+
+ IOGR_Maker::instance()->set_ref_version(object_group_ref_version);
+ if (!CORBA::is_nil(successor.in())) {
+ ACE_TRY {
+ successor->remove_member(crashed_location,
+ object_group_ref_version
+ ACE_ENV_ARG_PARAMETER);
+ ACE_TRY_CHECK;
+ }
+ ACE_CATCHALL {
+ }
+ ACE_ENDTRY;
+ }
+
+ TAO_FTRTEC::Log(3, "my_position = %d, crashed_pos = %d\n", impl_->my_position, crashed_pos);
+ if (impl_->my_position == crashed_pos && impl_->my_position > 0)
+ Fault_Detector::instance()->connect(impl_->info_list[impl_->my_position-1].the_location);
+}
+
+void TAO_FTEC_Group_Manager::connection_closed()
+{
+ TAO_FTRTEC::Log(1, "TAO_FTEC_Group_Manager::connection_closed\n");
+ ACE_ASSERT(impl_->my_position > 0);
+
+ // do not use referere here, because the the value pointed by the pointer to
+ // crashed_location will be repliaced by its successor.
+ FTRT::Location crashed_location = impl_->info_list[impl_->my_position-1].the_location;
+
+ ACE_DECLARE_NEW_CORBA_ENV;
+
+ if (impl_->my_position > 1) {
+ // if I am not the new primary, tell the new primary
+ ACE_TRY_EX(block1) {
+ TAO_IOP::TAO_IOR_Manipulation::IORList iors;
+ iors.length(impl_->my_position-1);
+ for (size_t i = 0; i < impl_->my_position-1; ++i)
+ iors[i] = CORBA::Object::_duplicate(impl_->info_list[i].ior.in());
+
+ CORBA::Object_var obj =
+ IOGR_Maker::instance()->merge_iors(iors
+ ACE_ENV_ARG_PARAMETER);
+ ACE_TRY_CHECK_EX(block1);
+
+ FtRtecEventChannelAdmin::EventChannel_var primary =
+ FtRtecEventChannelAdmin::EventChannel::_narrow(obj.in()
+ ACE_ENV_ARG_PARAMETER);
+ ACE_TRY_CHECK_EX(block1);
+ primary->replica_crashed(crashed_location
+ ACE_ENV_ARG_PARAMETER);
+
+ ACE_TRY_CHECK_EX(block1);
+ return;
+ }
+ ACE_CATCHANY {
+ }
+ ACE_ENDTRY;
+ }
+
+ ACE_TRY_EX(block2) {
+ remove_member(crashed_location,
+ IOGR_Maker::instance()->increment_ref_version()
+ ACE_ENV_ARG_PARAMETER);
+ ACE_TRY_CHECK_EX(block2);
+ }
+ ACE_CATCHANY {
+ }
+ ACE_ENDTRY;
+
+}
+
+TAO_END_VERSIONED_NAMESPACE_DECL
diff --git a/TAO/orbsvcs/orbsvcs/FtRtEvent/EventChannel/FTEC_Group_Manager.h b/TAO/orbsvcs/orbsvcs/FtRtEvent/EventChannel/FTEC_Group_Manager.h
new file mode 100644
index 00000000000..0d06c156bf5
--- /dev/null
+++ b/TAO/orbsvcs/orbsvcs/FtRtEvent/EventChannel/FTEC_Group_Manager.h
@@ -0,0 +1,80 @@
+// -*- C++ -*-
+
+//=============================================================================
+/**
+ * @file FTEC_Group_Manager.h
+ *
+ * $Id$
+ *
+ * @author Huang-Ming Huang <hh1@cse.wustl.edu>
+ */
+//=============================================================================
+
+#ifndef TAO_FTEC_GROUP_MANAGER_H
+#define TAO_FTEC_GROUP_MANAGER_H
+
+#include "orbsvcs/FtRtecEventChannelAdminC.h"
+#include "orbsvcs/FtRtEvent/EventChannel/FTEC_Fault_Listener.h"
+
+#if !defined (ACE_LACKS_PRAGMA_ONCE)
+# pragma once
+#endif /* ACE_LACKS_PRAGMA_ONCE */
+
+
+TAO_BEGIN_VERSIONED_NAMESPACE_DECL
+
+struct TAO_FTEC_Group_Manager_Impl;
+
+class TAO_FTEC_Group_Manager : private TAO_FTEC_Fault_Listener
+{
+public:
+ TAO_FTEC_Group_Manager();
+ virtual ~TAO_FTEC_Group_Manager();
+
+ bool init(CORBA::ORB_ptr orb);
+
+ virtual CORBA::Boolean start (
+ FTRT::FaultListener_ptr listener,
+ FTRT::Location_out cur
+ ACE_ENV_ARG_DECL)
+ ACE_THROW_SPEC ((CORBA::SystemException));
+
+ void create_group (
+ const FTRT::ManagerInfoList & info_list,
+ CORBA::ULong object_group_ref_version
+ ACE_ENV_ARG_DECL);
+
+ void join_group (
+ const FTRT::ManagerInfo & info
+ ACE_ENV_ARG_DECL);
+
+ void add_member (
+ const FTRT::ManagerInfo & info,
+ CORBA::ULong object_group_ref_version
+ ACE_ENV_ARG_DECL);
+
+ void remove_member (
+ const FTRT::Location & crashed_location,
+ CORBA::ULong object_group_ref_version
+ ACE_ENV_ARG_DECL);
+
+ void replica_crashed (
+ const FTRT::Location & location
+ ACE_ENV_ARG_DECL);
+
+private:
+ virtual void get_state (
+ FtRtecEventChannelAdmin::EventChannelState & s
+ ACE_ENV_ARG_DECL
+ )=0;
+
+ virtual void connection_closed();
+
+protected:
+ FTRT::FaultListener_var listener_;
+ TAO_FTEC_Group_Manager_Impl* impl_;
+};
+
+TAO_END_VERSIONED_NAMESPACE_DECL
+
+#endif // TAO_FTEC_GROUP_MANAGER_H
diff --git a/TAO/orbsvcs/orbsvcs/FtRtEvent/EventChannel/FTEC_ORBInitializer.cpp b/TAO/orbsvcs/orbsvcs/FtRtEvent/EventChannel/FTEC_ORBInitializer.cpp
new file mode 100644
index 00000000000..410377e8a80
--- /dev/null
+++ b/TAO/orbsvcs/orbsvcs/FtRtEvent/EventChannel/FTEC_ORBInitializer.cpp
@@ -0,0 +1,68 @@
+// $Id$
+
+
+#include "orbsvcs/FtRtEvent/EventChannel/FTEC_ORBInitializer.h"
+#include "orbsvcs/FtRtEvent/EventChannel/Set_Update_Interceptor.h"
+#include "orbsvcs/FtRtEvent/EventChannel/ForwardCtrlServerInterceptor.h"
+#include "orbsvcs/FtRtEvent/EventChannel/FtEventServiceInterceptor.h"
+#include "orbsvcs/FtRtEvent/EventChannel/Request_Context_Repository.h"
+
+ACE_RCSID (EventChannel,
+ FTEC_ORBInitializer,
+ "$Id$")
+
+TAO_BEGIN_VERSIONED_NAMESPACE_DECL
+
+void
+FTEC_ORBInitializer::pre_init (
+ PortableInterceptor::ORBInitInfo_ptr
+ ACE_ENV_ARG_DECL_NOT_USED)
+ ACE_THROW_SPEC ((CORBA::SystemException))
+{
+}
+
+void
+FTEC_ORBInitializer::post_init (
+ PortableInterceptor::ORBInitInfo_ptr info
+ ACE_ENV_ARG_DECL)
+ ACE_THROW_SPEC ((CORBA::SystemException))
+{
+
+ Request_Context_Repository().allocate_slots(info ACE_ENV_ARG_PARAMETER);
+ ACE_CHECK;
+
+ PortableInterceptor::ClientRequestInterceptor_var client_interceptor;
+ PortableInterceptor::ClientRequestInterceptor_ptr ctmp;
+
+ ACE_NEW_THROW_EX(ctmp,
+ TAO_Set_Update_Interceptor,
+ CORBA::NO_MEMORY());
+ ACE_CHECK;
+
+ client_interceptor = ctmp;
+
+ info->add_client_request_interceptor (client_interceptor.in()
+ ACE_ENV_ARG_PARAMETER);
+ ACE_CHECK;
+
+ PortableInterceptor::ServerRequestInterceptor_var server_interceptor;
+ PortableInterceptor::ServerRequestInterceptor_ptr stmp;
+
+ ACE_NEW_THROW_EX(stmp,
+ ForwardCtrlServerInterceptor,
+ CORBA::NO_MEMORY());
+ server_interceptor = stmp;
+
+ info->add_server_request_interceptor (server_interceptor.in()
+ ACE_ENV_ARG_PARAMETER);
+ ACE_CHECK;
+ ACE_NEW_THROW_EX(stmp,
+ FtEventServiceInterceptor,
+ CORBA::NO_MEMORY());
+ server_interceptor = stmp;
+
+ info->add_server_request_interceptor (server_interceptor.in()
+ ACE_ENV_ARG_PARAMETER);
+}
+
+TAO_END_VERSIONED_NAMESPACE_DECL
diff --git a/TAO/orbsvcs/orbsvcs/FtRtEvent/EventChannel/FTEC_ORBInitializer.h b/TAO/orbsvcs/orbsvcs/FtRtEvent/EventChannel/FTEC_ORBInitializer.h
new file mode 100644
index 00000000000..07377cd40e1
--- /dev/null
+++ b/TAO/orbsvcs/orbsvcs/FtRtEvent/EventChannel/FTEC_ORBInitializer.h
@@ -0,0 +1,42 @@
+// -*- C++ -*-
+
+//=============================================================================
+/**
+ * @file FTEC_ORBInitializer.h
+ *
+ * $Id$
+ *
+ * @author Huang-Ming Huang <hh1@cse.wustl.edu>
+ */
+//=============================================================================
+#ifndef FTEC_ORBINITIALIZER__H_
+#define FTEC_ORBINITIALIZER__H_
+#include /**/ "ace/pre.h"
+
+#include "tao/PI/PI.h"
+#include "tao/LocalObject.h"
+
+#if !defined (ACE_LACKS_PRAGMA_ONCE)
+# pragma once
+#endif /* ACE_LACKS_PRAGMA_ONCE */
+
+TAO_BEGIN_VERSIONED_NAMESPACE_DECL
+
+class FTEC_ORBInitializer
+ : public virtual PortableInterceptor::ORBInitializer
+ , public virtual TAO_Local_RefCounted_Object
+{
+public:
+ virtual void pre_init (PortableInterceptor::ORBInitInfo_ptr info
+ ACE_ENV_ARG_DECL)
+ ACE_THROW_SPEC ((CORBA::SystemException));
+
+ virtual void post_init (PortableInterceptor::ORBInitInfo_ptr info
+ ACE_ENV_ARG_DECL)
+ ACE_THROW_SPEC ((CORBA::SystemException));
+};
+
+TAO_END_VERSIONED_NAMESPACE_DECL
+
+#include /**/ "ace/post.h"
+#endif /* FTEC_ORBINITIALIZER__H_ */
diff --git a/TAO/orbsvcs/orbsvcs/FtRtEvent/EventChannel/FTEC_ProxyConsumer.cpp b/TAO/orbsvcs/orbsvcs/FtRtEvent/EventChannel/FTEC_ProxyConsumer.cpp
new file mode 100644
index 00000000000..3f489f9540f
--- /dev/null
+++ b/TAO/orbsvcs/orbsvcs/FtRtEvent/EventChannel/FTEC_ProxyConsumer.cpp
@@ -0,0 +1,134 @@
+// $Id$
+
+#include "orbsvcs/FtRtEvent/EventChannel/FTEC_ProxyConsumer.h"
+#include "orbsvcs/FtRtEvent/EventChannel/Request_Context_Repository.h"
+#include "orbsvcs/FtRtEvent/EventChannel/Replication_Service.h"
+#include "../Utils/activate_with_id.h"
+
+ACE_RCSID (EventChannel,
+ TAO_FTEC_ProxyPushConsumer,
+ "$Id$")
+
+TAO_BEGIN_VERSIONED_NAMESPACE_DECL
+
+const TAO_FTEC_ProxyPushConsumer::RollbackOperation
+ TAO_FTEC_ProxyPushConsumer::rollback_obtain =
+ &FtRtecEventChannelAdmin::EventChannelFacade::disconnect_push_consumer;
+
+TAO_FTEC_ProxyPushConsumer::TAO_FTEC_ProxyPushConsumer (TAO_EC_Event_Channel_Base* event_channel)
+: Inherited(event_channel)
+{
+}
+
+
+const FtRtecEventChannelAdmin::ObjectId&
+TAO_FTEC_ProxyPushConsumer::id() const
+{
+ return object_id_.in();
+}
+
+
+ /// Activate in the POA
+void
+TAO_FTEC_ProxyPushConsumer::activate (
+ RtecEventChannelAdmin::ProxyPushConsumer_ptr &result
+ ACE_ENV_ARG_DECL)
+ ACE_THROW_SPEC ((CORBA::SystemException))
+{
+ result = RtecEventChannelAdmin::ProxyPushConsumer::_nil();
+ ACE_TRY {
+ object_id_ = Request_Context_Repository().get_object_id(ACE_ENV_SINGLE_ARG_PARAMETER);
+ ACE_TRY_CHECK;
+ PortableServer::POA_var poa = _default_POA(ACE_ENV_SINGLE_ARG_PARAMETER);
+ ACE_TRY_CHECK;
+ activate_object_with_id(result, poa.in(), this, id() ACE_ENV_ARG_PARAMETER);
+ ACE_TRY_CHECK;
+ }
+ ACE_CATCHANY
+ {
+ ACE_PRINT_EXCEPTION(ACE_ANY_EXCEPTION, "");
+ // ignore exceptions
+ }
+ ACE_ENDTRY;
+}
+
+ // = The RtecEventChannelAdmin::ProxyPushConsumer methods...
+void TAO_FTEC_ProxyPushConsumer::connect_push_supplier (
+ RtecEventComm::PushSupplier_ptr push_supplier,
+ const RtecEventChannelAdmin::SupplierQOS& qos
+ ACE_ENV_ARG_DECL)
+ ACE_THROW_SPEC ((CORBA::SystemException,
+ RtecEventChannelAdmin::AlreadyConnected))
+{
+ if (Request_Context_Repository().is_executed_request())
+ return;
+
+ FtRtecEventChannelAdmin::Operation update;
+ update.object_id = this->id();
+ FtRtecEventChannelAdmin::Connect_push_supplier_param param;
+ param.push_supplier = RtecEventComm::PushSupplier::_duplicate(push_supplier);
+ param.qos = qos;
+ update.param.connect_supplier_param(param);
+
+ Inherited::connect_push_supplier(push_supplier, qos ACE_ENV_ARG_PARAMETER);
+ ACE_CHECK;
+
+ ACE_TRY {
+ FTRTEC::Replication_Service* svc = FTRTEC::Replication_Service::instance();
+ ACE_Read_Guard<FTRTEC::Replication_Service> locker(*svc);
+
+ svc->replicate_request(update,
+ &FtRtecEventChannelAdmin::EventChannelFacade::disconnect_push_consumer
+ ACE_ENV_ARG_PARAMETER);
+ ACE_TRY_CHECK;
+ }
+ ACE_CATCHALL {
+ this->disconnect_push_consumer(ACE_ENV_SINGLE_ARG_PARAMETER);
+ ACE_RE_THROW;
+ }
+ ACE_ENDTRY;
+ ACE_CHECK;
+}
+
+void TAO_FTEC_ProxyPushConsumer::disconnect_push_consumer (ACE_ENV_SINGLE_ARG_DECL)
+ ACE_THROW_SPEC ((CORBA::SystemException))
+{
+ if (Request_Context_Repository().is_executed_request())
+ return;
+ FtRtecEventChannelAdmin::Operation update;
+ update.object_id = id();
+ update.param._d(FtRtecEventChannelAdmin::DISCONNECT_PUSH_CONSUMER);
+
+ Inherited::disconnect_push_consumer(ACE_ENV_SINGLE_ARG_PARAMETER);
+ ACE_CHECK;
+
+ FTRTEC::Replication_Service* svc = FTRTEC::Replication_Service::instance();
+ ACE_Read_Guard<FTRTEC::Replication_Service> locker(*svc);
+
+ svc->replicate_request(update, 0 ACE_ENV_ARG_PARAMETER);
+ ACE_CHECK;
+}
+
+void TAO_FTEC_ProxyPushConsumer::get_state(FtRtecEventChannelAdmin::ProxyPushConsumerStat& state)
+{
+ state.object_id = this->object_id_.in ();
+ if (this->is_connected()) {
+ FtRtecEventChannelAdmin::ProxyPushConsumerConnectionInfo info;
+ info.push_supplier = this->supplier();
+ info.qos = this->publications();
+ state.parameter.info(info);
+ }
+}
+
+void TAO_FTEC_ProxyPushConsumer::set_state(const FtRtecEventChannelAdmin::ProxyPushConsumerStat& state
+ ACE_ENV_ARG_DECL)
+{
+ if (!CORBA::is_nil(state.parameter.info().push_supplier.in()) )
+ {
+ Inherited::connect_push_supplier(state.parameter.info().push_supplier.in(),
+ state.parameter.info().qos
+ ACE_ENV_ARG_PARAMETER);
+ }
+}
+
+TAO_END_VERSIONED_NAMESPACE_DECL
diff --git a/TAO/orbsvcs/orbsvcs/FtRtEvent/EventChannel/FTEC_ProxyConsumer.h b/TAO/orbsvcs/orbsvcs/FtRtEvent/EventChannel/FTEC_ProxyConsumer.h
new file mode 100644
index 00000000000..518e4f73eb0
--- /dev/null
+++ b/TAO/orbsvcs/orbsvcs/FtRtEvent/EventChannel/FTEC_ProxyConsumer.h
@@ -0,0 +1,67 @@
+// -*- C++ -*-
+
+//=============================================================================
+/**
+ * @file FTEC_ProxyConsumer.h
+ *
+ * $Id$
+ *
+ * @author Huang-Ming Huang <hh1@cse.wustl.edu>
+ */
+//=============================================================================
+#ifndef TAO_FTEC_PROXYCONSUMER_H
+#define TAO_FTEC_PROXYCONSUMER_H
+
+#include "orbsvcs/Event/EC_Default_ProxyConsumer.h"
+#include "ace/SString.h"
+#include "orbsvcs/FtRtecEventChannelAdminC.h"
+#include "orbsvcs/FtRtEvent/EventChannel/Request_Context_Repository.h"
+
+#if !defined (ACE_LACKS_PRAGMA_ONCE)
+# pragma once
+#endif /* ACE_LACKS_PRAGMA_ONCE */
+
+TAO_BEGIN_VERSIONED_NAMESPACE_DECL
+
+class TAO_FTEC_ProxyPushConsumer : public TAO_EC_Default_ProxyPushConsumer
+{
+ typedef TAO_EC_Default_ProxyPushConsumer Inherited;
+public:
+ typedef RtecEventChannelAdmin::ProxyPushConsumer Interface;
+ typedef FtRtecEventChannelAdmin::ProxyPushConsumerStat State;
+ typedef POA_RtecEventChannelAdmin::ProxyPushConsumer_ptr Skeleton;
+
+ TAO_FTEC_ProxyPushConsumer (TAO_EC_Event_Channel_Base* event_channel);
+
+ virtual void activate (
+ RtecEventChannelAdmin::ProxyPushConsumer_ptr &proxy
+ ACE_ENV_ARG_DECL)
+ ACE_THROW_SPEC ((CORBA::SystemException));
+
+
+ // = The RtecEventChannelAdmin::ProxyPushConsumer methods...
+ virtual void connect_push_supplier (
+ RtecEventComm::PushSupplier_ptr push_supplier,
+ const RtecEventChannelAdmin::SupplierQOS& qos
+ ACE_ENV_ARG_DECL)
+ ACE_THROW_SPEC ((CORBA::SystemException,
+ RtecEventChannelAdmin::AlreadyConnected));
+ virtual void disconnect_push_consumer (ACE_ENV_SINGLE_ARG_DECL)
+ ACE_THROW_SPEC ((CORBA::SystemException));
+
+ const FtRtecEventChannelAdmin::ObjectId& id() const;
+ void get_state(FtRtecEventChannelAdmin::ProxyPushConsumerStat& state);
+ void set_state(const FtRtecEventChannelAdmin::ProxyPushConsumerStat& state
+ ACE_ENV_ARG_DECL);
+
+ typedef void (FtRtecEventChannelAdmin::EventChannelFacade::*RollbackOperation)
+ (const FtRtecEventChannelAdmin::ObjectId& ACE_ENV_ARG_DECL);
+
+ static const RollbackOperation rollback_obtain;
+private:
+ FtRtecEventChannelAdmin::ObjectId_var object_id_;
+};
+
+TAO_END_VERSIONED_NAMESPACE_DECL
+
+#endif
diff --git a/TAO/orbsvcs/orbsvcs/FtRtEvent/EventChannel/FTEC_ProxySupplier.cpp b/TAO/orbsvcs/orbsvcs/FtRtEvent/EventChannel/FTEC_ProxySupplier.cpp
new file mode 100644
index 00000000000..62fad4ef9d7
--- /dev/null
+++ b/TAO/orbsvcs/orbsvcs/FtRtEvent/EventChannel/FTEC_ProxySupplier.cpp
@@ -0,0 +1,202 @@
+// $Id$
+
+#include "orbsvcs/FtRtEvent/EventChannel/FTEC_ProxySupplier.h"
+#include "../Utils/activate_with_id.h"
+#include "orbsvcs/FtRtEvent/EventChannel/Request_Context_Repository.h"
+#include "orbsvcs/FtRtEvent/EventChannel/Replication_Service.h"
+
+ACE_RCSID (EventChannel,
+ TAO_FTEC_ProxyPushSupplier,
+ "$Id$")
+
+TAO_BEGIN_VERSIONED_NAMESPACE_DECL
+
+const TAO_FTEC_ProxyPushSupplier::RollbackOperation
+ TAO_FTEC_ProxyPushSupplier::rollback_obtain =
+ &FtRtecEventChannelAdmin::EventChannelFacade::disconnect_push_supplier;
+
+TAO_FTEC_ProxyPushSupplier::TAO_FTEC_ProxyPushSupplier(TAO_EC_Event_Channel_Base* event_channel
+ ,int validate_connection)
+: Inherited(event_channel, validate_connection)
+{
+}
+
+const FtRtecEventChannelAdmin::ObjectId&
+TAO_FTEC_ProxyPushSupplier::id() const
+{
+ return object_id_.in();
+}
+
+ /// Activate in the POA
+void
+TAO_FTEC_ProxyPushSupplier::activate (
+ RtecEventChannelAdmin::ProxyPushSupplier_ptr &result
+ ACE_ENV_ARG_DECL)
+ ACE_THROW_SPEC ((CORBA::SystemException))
+{
+
+ result =
+ RtecEventChannelAdmin::ProxyPushSupplier::_nil();
+ ACE_TRY {
+ object_id_ = Request_Context_Repository().get_object_id(ACE_ENV_SINGLE_ARG_PARAMETER);
+ ACE_TRY_CHECK;
+ PortableServer::POA_var poa = _default_POA(ACE_ENV_SINGLE_ARG_PARAMETER);
+ ACE_TRY_CHECK;
+ activate_object_with_id(result, poa.in(), this, id() ACE_ENV_ARG_PARAMETER);
+ ACE_TRY_CHECK;
+ }
+ ACE_CATCHANY
+ {
+ // ignore exceptions
+ }
+ ACE_ENDTRY;
+}
+
+ // = The RtecEventChannelAdmin::ProxyPushSupplier methods...
+void TAO_FTEC_ProxyPushSupplier::connect_push_consumer (
+ RtecEventComm::PushConsumer_ptr push_consumer,
+ const RtecEventChannelAdmin::ConsumerQOS &qos
+ ACE_ENV_ARG_DECL)
+ ACE_THROW_SPEC ((CORBA::SystemException,
+ RtecEventChannelAdmin::AlreadyConnected,
+ RtecEventChannelAdmin::TypeError))
+{
+ if (Request_Context_Repository().is_executed_request())
+ return;
+
+ FtRtecEventChannelAdmin::Operation update;
+ FtRtecEventChannelAdmin::Connect_push_consumer_param param;
+ update.object_id = this->id();
+ param.push_consumer = RtecEventComm::PushConsumer::_duplicate(push_consumer);
+ param.qos = qos;
+ update.param.connect_consumer_param(param);
+
+ Inherited::connect_push_consumer(push_consumer, qos ACE_ENV_ARG_PARAMETER);
+ ACE_CHECK;
+
+ ACE_TRY {
+ FTRTEC::Replication_Service* svc = FTRTEC::Replication_Service::instance();
+
+ ACE_Read_Guard<FTRTEC::Replication_Service> locker(*svc);
+
+ svc->replicate_request(update,
+ &FtRtecEventChannelAdmin::EventChannelFacade::disconnect_push_supplier
+ ACE_ENV_ARG_PARAMETER);
+ ACE_TRY_CHECK;
+ }
+ ACE_CATCHALL {
+ }
+ ACE_ENDTRY;
+}
+
+
+void TAO_FTEC_ProxyPushSupplier::disconnect_push_supplier (ACE_ENV_SINGLE_ARG_DECL)
+ ACE_THROW_SPEC ((CORBA::SystemException))
+{
+ if (Request_Context_Repository().is_executed_request())
+ return;
+
+ FtRtecEventChannelAdmin::Operation update;
+ update.object_id = id();
+ update.param._d(FtRtecEventChannelAdmin::DISCONNECT_PUSH_SUPPLIER);
+
+ Inherited::disconnect_push_supplier(ACE_ENV_SINGLE_ARG_PARAMETER);
+ ACE_CHECK;
+ FTRTEC::Replication_Service *svc = FTRTEC::Replication_Service::instance();
+
+ ACE_Read_Guard<FTRTEC::Replication_Service> locker(*svc);
+
+ svc->replicate_request(update, 0 ACE_ENV_ARG_PARAMETER);
+ ACE_CHECK;
+}
+
+
+void TAO_FTEC_ProxyPushSupplier::suspend_connection (ACE_ENV_SINGLE_ARG_DECL)
+ ACE_THROW_SPEC ((CORBA::SystemException))
+{
+ if (Request_Context_Repository().is_executed_request())
+ return;
+
+ FtRtecEventChannelAdmin::Operation update;
+ update.object_id = id();
+ update.param._d(FtRtecEventChannelAdmin::SUSPEND_CONNECTION);
+
+ Inherited::suspend_connection(ACE_ENV_SINGLE_ARG_PARAMETER);
+ ACE_CHECK;
+
+ ACE_TRY
+ {
+ FTRTEC::Replication_Service* svc = FTRTEC::Replication_Service::instance();
+ ACE_Read_Guard<FTRTEC::Replication_Service> locker(*svc);
+
+ svc->replicate_request(update,
+ &FtRtecEventChannelAdmin::EventChannelFacade::resume_push_supplier
+ ACE_ENV_ARG_PARAMETER);
+ ACE_TRY_CHECK;
+ }
+ ACE_CATCHALL {
+ this->resume_connection(ACE_ENV_SINGLE_ARG_PARAMETER);
+ ACE_RE_THROW;
+ }
+ ACE_ENDTRY;
+}
+
+void TAO_FTEC_ProxyPushSupplier::resume_connection (ACE_ENV_SINGLE_ARG_DECL)
+ ACE_THROW_SPEC ((CORBA::SystemException))
+{
+ if (Request_Context_Repository().is_executed_request())
+ return;
+
+ Request_Context_Repository().set_object_id(id() ACE_ENV_ARG_PARAMETER);
+ FtRtecEventChannelAdmin::Operation update;
+ update.object_id = id();
+ update.param._d(FtRtecEventChannelAdmin::RESUME_CONNECTION);
+
+ Inherited::resume_connection(ACE_ENV_SINGLE_ARG_PARAMETER);
+ ACE_CHECK;
+
+ ACE_TRY {
+ FTRTEC::Replication_Service* svc = FTRTEC::Replication_Service::instance();
+
+ ACE_Read_Guard<FTRTEC::Replication_Service> locker(*svc);
+
+ svc->replicate_request(update,
+ &FtRtecEventChannelAdmin::EventChannelFacade::suspend_push_supplier
+ ACE_ENV_ARG_PARAMETER);
+ ACE_TRY_CHECK;
+ }
+ ACE_CATCHALL {
+ this->suspend_connection(ACE_ENV_SINGLE_ARG_PARAMETER);
+ ACE_RE_THROW;
+ }
+ ACE_ENDTRY;
+}
+
+
+void TAO_FTEC_ProxyPushSupplier::get_state(FtRtecEventChannelAdmin::ProxyPushSupplierStat& state)
+{
+ state.object_id = this->object_id_.in ();
+ state.suspended = this->is_suspended();
+ if (this->is_connected()) {
+ FtRtecEventChannelAdmin::ProxyPushSupplierConnectionInfo info;
+ info.push_consumer = this->consumer();
+ info.qos = this->subscriptions();
+ state.parameter.info(info);
+ }
+}
+
+
+void TAO_FTEC_ProxyPushSupplier::set_state(const FtRtecEventChannelAdmin::ProxyPushSupplierStat& state
+ ACE_ENV_ARG_DECL)
+{
+ if (!CORBA::is_nil(state.parameter.info().push_consumer.in()))
+ {
+ Inherited::connect_push_consumer(state.parameter.info().push_consumer.in(),
+ state.parameter.info().qos
+ ACE_ENV_ARG_PARAMETER);
+ if (state.suspended)
+ Inherited::suspend_connection(ACE_ENV_SINGLE_ARG_PARAMETER);
+ }
+}
+
+TAO_END_VERSIONED_NAMESPACE_DECL
diff --git a/TAO/orbsvcs/orbsvcs/FtRtEvent/EventChannel/FTEC_ProxySupplier.h b/TAO/orbsvcs/orbsvcs/FtRtEvent/EventChannel/FTEC_ProxySupplier.h
new file mode 100644
index 00000000000..34c38f96400
--- /dev/null
+++ b/TAO/orbsvcs/orbsvcs/FtRtEvent/EventChannel/FTEC_ProxySupplier.h
@@ -0,0 +1,72 @@
+// -*- C++ -*-
+
+//=============================================================================
+/**
+ * @file FTEC_ProxySupplier.h
+ *
+ * $Id$
+ *
+ * @author Huang-Ming Huang <hh1@cse.wustl.edu>
+ */
+//=============================================================================
+
+#ifndef TAO_FTEC_PROXYSUPPLIER_H
+#define TAO_FTEC_PROXYSUPPLIER_H
+#include "orbsvcs/Event/EC_Default_ProxySupplier.h"
+#include "ace/SString.h"
+#include "orbsvcs/FtRtecEventChannelAdminC.h"
+#include "orbsvcs/FtRtEvent/EventChannel/Request_Context_Repository.h"
+
+#if !defined (ACE_LACKS_PRAGMA_ONCE)
+# pragma once
+#endif /* ACE_LACKS_PRAGMA_ONCE */
+
+TAO_BEGIN_VERSIONED_NAMESPACE_DECL
+
+class TAO_FTEC_ProxyPushSupplier : public TAO_EC_Default_ProxyPushSupplier
+{
+ typedef TAO_EC_Default_ProxyPushSupplier Inherited;
+public:
+ typedef RtecEventChannelAdmin::ProxyPushSupplier Interface;
+ typedef FtRtecEventChannelAdmin::ProxyPushSupplierStat State;
+ typedef POA_RtecEventChannelAdmin::ProxyPushSupplier_ptr Skeleton;
+
+ TAO_FTEC_ProxyPushSupplier(TAO_EC_Event_Channel_Base* event_channel,
+ int validate_connection);
+ /// Activate in the POA
+ virtual void activate (
+ RtecEventChannelAdmin::ProxyPushSupplier_ptr &proxy
+ ACE_ENV_ARG_DECL)
+ ACE_THROW_SPEC ((CORBA::SystemException));
+ // = The RtecEventChannelAdmin::ProxyPushSupplier methods...
+ virtual void connect_push_consumer (
+ RtecEventComm::PushConsumer_ptr push_consumer,
+ const RtecEventChannelAdmin::ConsumerQOS &qos
+ ACE_ENV_ARG_DECL)
+ ACE_THROW_SPEC ((CORBA::SystemException,
+ RtecEventChannelAdmin::AlreadyConnected,
+ RtecEventChannelAdmin::TypeError));
+ virtual void disconnect_push_supplier (ACE_ENV_SINGLE_ARG_DECL)
+ ACE_THROW_SPEC ((CORBA::SystemException));
+ virtual void suspend_connection (ACE_ENV_SINGLE_ARG_DECL)
+ ACE_THROW_SPEC ((CORBA::SystemException));
+ virtual void resume_connection (ACE_ENV_SINGLE_ARG_DECL)
+ ACE_THROW_SPEC ((CORBA::SystemException));
+
+ const FtRtecEventChannelAdmin::ObjectId& id() const;
+
+ void get_state(FtRtecEventChannelAdmin::ProxyPushSupplierStat& state);
+ void set_state(const FtRtecEventChannelAdmin::ProxyPushSupplierStat& state
+ ACE_ENV_ARG_DECL);
+
+ typedef void (FtRtecEventChannelAdmin::EventChannelFacade::*RollbackOperation)
+ (const FtRtecEventChannelAdmin::ObjectId& ACE_ENV_ARG_DECL);
+
+ static const RollbackOperation rollback_obtain;
+private:
+ FtRtecEventChannelAdmin::ObjectId_var object_id_;
+};
+
+TAO_END_VERSIONED_NAMESPACE_DECL
+
+#endif
diff --git a/TAO/orbsvcs/orbsvcs/FtRtEvent/EventChannel/FTEC_SupplierAdmin.cpp b/TAO/orbsvcs/orbsvcs/FtRtEvent/EventChannel/FTEC_SupplierAdmin.cpp
new file mode 100644
index 00000000000..74a666746cc
--- /dev/null
+++ b/TAO/orbsvcs/orbsvcs/FtRtEvent/EventChannel/FTEC_SupplierAdmin.cpp
@@ -0,0 +1,49 @@
+// $Id$
+
+#include "orbsvcs/Event/EC_ProxySupplier.h"
+#include "orbsvcs/Event/EC_Event_Channel_Base.h"
+#include "orbsvcs/FtRtEvent/EventChannel/FTEC_SupplierAdmin.h"
+#include "orbsvcs/FtRtEvent/EventChannel/FTEC_ProxyConsumer.h"
+#include "tao/Stub.h"
+
+ACE_RCSID (EventChannel,
+ TAO_FTEC_SupplierAdmin,
+ "$Id$")
+
+TAO_BEGIN_VERSIONED_NAMESPACE_DECL
+
+const FtRtecEventChannelAdmin::OperationType
+TAO_FTEC_SupplierAdmin::OBTAIN_ID = FtRtecEventChannelAdmin::OBTAIN_PUSH_CONSUMER;
+
+TAO_FTEC_SupplierAdmin::TAO_FTEC_SupplierAdmin (TAO_EC_Event_Channel_Base *ec)
+ : TAO_EC_SupplierAdmin (ec)
+ , FT_Aspect(this, this->event_channel_->supplier_poa ())
+{
+}
+
+TAO_FTEC_SupplierAdmin::~TAO_FTEC_SupplierAdmin()
+{
+}
+
+
+RtecEventChannelAdmin::ProxyPushConsumer_ptr
+TAO_FTEC_SupplierAdmin::obtain_push_consumer (ACE_ENV_SINGLE_ARG_DECL)
+ ACE_THROW_SPEC ((CORBA::SystemException))
+{
+ return obtain_proxy(ACE_ENV_SINGLE_ARG_PARAMETER);
+}
+
+void
+TAO_FTEC_SupplierAdmin::disconnect(RtecEventChannelAdmin::ProxyPushConsumer_ptr obj)
+{
+ ACE_TRY_NEW_ENV {
+ obj->disconnect_push_consumer(ACE_ENV_SINGLE_ARG_PARAMETER);
+ ACE_TRY_CHECK;
+ }
+ ACE_CATCHALL
+ {
+ }
+ ACE_ENDTRY;
+}
+
+TAO_END_VERSIONED_NAMESPACE_DECL
diff --git a/TAO/orbsvcs/orbsvcs/FtRtEvent/EventChannel/FTEC_SupplierAdmin.h b/TAO/orbsvcs/orbsvcs/FtRtEvent/EventChannel/FTEC_SupplierAdmin.h
new file mode 100644
index 00000000000..814061c0263
--- /dev/null
+++ b/TAO/orbsvcs/orbsvcs/FtRtEvent/EventChannel/FTEC_SupplierAdmin.h
@@ -0,0 +1,79 @@
+// -*- C++ -*-
+
+//=============================================================================
+/**
+ * @file FTEC_SupplierAdmin.h
+ *
+ * $Id$
+ *
+ * @author Huang-Ming Huang <hh1@cse.wustl.edu>
+ */
+//=============================================================================
+
+#ifndef TAO_FTEC_SUPPLIERADMIN_H
+#define TAO_FTEC_SUPPLIERADMIN_H
+#include /**/ "ace/pre.h"
+
+#include "orbsvcs/FtRtEvent/EventChannel/FTEC_ProxyConsumer.h"
+#include "orbsvcs/FtRtEvent/EventChannel/FT_ProxyAdmin_T.h"
+#include "orbsvcs/FtRtEvent/EventChannel/ProxyConsumerStateWorker.h"
+
+
+#if !defined (ACE_LACKS_PRAGMA_ONCE)
+# pragma once
+#endif /* ACE_LACKS_PRAGMA_ONCE */
+
+#include "orbsvcs/Event/EC_SupplierAdmin.h"
+
+TAO_BEGIN_VERSIONED_NAMESPACE_DECL
+
+class TAO_FTEC_Event_Channel_Impl;
+
+namespace FtRtecEventChannelAdmin {
+ struct SupplierAdminState;
+}
+/**
+ * @class TAO_FTEC_SupplierAdmin
+ *
+ * @brief Implement the RtecEventChannelAdmin::SupplierAdmin interface.
+ *
+ *
+ */
+class TAO_FTEC_SupplierAdmin
+ : public TAO_EC_SupplierAdmin
+ , public FT_ProxyAdmin<TAO_FTEC_SupplierAdmin,
+ TAO_FTEC_ProxyPushConsumer,
+ RtecEventChannelAdmin::ProxyPushConsumer,
+ FtRtecEventChannelAdmin::SupplierAdminState>
+{
+public:
+
+ static const FtRtecEventChannelAdmin::OperationType OBTAIN_ID;
+
+ typedef FT_ProxyAdmin<TAO_FTEC_SupplierAdmin,
+ TAO_FTEC_ProxyPushConsumer,
+ RtecEventChannelAdmin::ProxyPushConsumer,
+ FtRtecEventChannelAdmin::SupplierAdminState>
+ FT_Aspect;
+
+ typedef ProxyConsumerStateWorker StateWorker;
+
+ /// constructor...
+ TAO_FTEC_SupplierAdmin (TAO_EC_Event_Channel_Base* event_channel);
+
+ /// destructor...
+ virtual ~TAO_FTEC_SupplierAdmin (void);
+
+
+ // = The RtecEventChannelAdmin::SupplierAdmin methods...
+ virtual RtecEventChannelAdmin::ProxyPushConsumer_ptr
+ obtain_push_consumer (ACE_ENV_SINGLE_ARG_DECL_NOT_USED)
+ ACE_THROW_SPEC ((CORBA::SystemException));
+
+ void disconnect(RtecEventChannelAdmin::ProxyPushConsumer_ptr obj);
+};
+
+TAO_END_VERSIONED_NAMESPACE_DECL
+
+#include /**/ "ace/post.h"
+#endif /* TAO_FTEC_SUPPLIERADMIN_H */
diff --git a/TAO/orbsvcs/orbsvcs/FtRtEvent/EventChannel/FTRTEC_ServiceActivate.h b/TAO/orbsvcs/orbsvcs/FtRtEvent/EventChannel/FTRTEC_ServiceActivate.h
new file mode 100644
index 00000000000..9666d6e5480
--- /dev/null
+++ b/TAO/orbsvcs/orbsvcs/FtRtEvent/EventChannel/FTRTEC_ServiceActivate.h
@@ -0,0 +1,11 @@
+// $Id$
+
+#ifndef FTRTEC_SERVICE_ACTIVATE_H
+#define FTRTEC_SERVICE_ACTIVATE_H
+
+#include "orbsvcs/FtRtEvent/EventChannel/Fault_Detector_Loader.h"
+#include "orbsvcs/FtRtEvent/EventChannel/Identification_Service.h"
+#include "orbsvcs/FtRtEvent/EventChannel/Replication_Service.h"
+
+#endif
+
diff --git a/TAO/orbsvcs/orbsvcs/FtRtEvent/EventChannel/FT_ProxyAdmin_Base.cpp b/TAO/orbsvcs/orbsvcs/FtRtEvent/EventChannel/FT_ProxyAdmin_Base.cpp
new file mode 100644
index 00000000000..5fb7d08ad06
--- /dev/null
+++ b/TAO/orbsvcs/orbsvcs/FtRtEvent/EventChannel/FT_ProxyAdmin_Base.cpp
@@ -0,0 +1,52 @@
+// $Id$
+
+#include "orbsvcs/FtRtEvent/EventChannel/FT_ProxyAdmin_Base.h"
+#include "tao/PortableServer/PortableServer.h"
+#include "tao/PortableServer/Servant_Base.h"
+#include "tao/PortableServer/PortableServer.h"
+
+
+ACE_RCSID (EventChannel,
+ FT_ProxyAdmin_Base,
+ "$Id$")
+
+TAO_BEGIN_VERSIONED_NAMESPACE_DECL
+
+FT_ProxyAdmin_Base::FT_ProxyAdmin_Base(PortableServer::ServantBase* servant,
+ PortableServer::POA_var poa)
+ : servant_(servant), poa_(poa)
+{
+}
+
+FT_ProxyAdmin_Base::~FT_ProxyAdmin_Base()
+{
+}
+
+void
+FT_ProxyAdmin_Base::activate(const FtRtecEventComm::ObjectId& oid
+ ACE_ENV_ARG_DECL)
+{
+ poa_->activate_object_with_id(
+ reinterpret_cast<const PortableServer::ObjectId&> (oid),
+ servant_
+ ACE_ENV_ARG_PARAMETER);
+ ACE_CHECK;
+ object_id_ = oid;
+}
+
+
+const FtRtecEventComm::ObjectId&
+FT_ProxyAdmin_Base::object_id(ACE_ENV_SINGLE_ARG_DECL_NOT_USED) const
+{
+ return object_id_;
+}
+
+
+CORBA::Object_var
+FT_ProxyAdmin_Base::reference(ACE_ENV_SINGLE_ARG_DECL) const
+{
+ return poa_->servant_to_reference(servant_
+ ACE_ENV_ARG_PARAMETER);
+}
+
+TAO_END_VERSIONED_NAMESPACE_DECL
diff --git a/TAO/orbsvcs/orbsvcs/FtRtEvent/EventChannel/FT_ProxyAdmin_Base.h b/TAO/orbsvcs/orbsvcs/FtRtEvent/EventChannel/FT_ProxyAdmin_Base.h
new file mode 100644
index 00000000000..2c639c0ce6f
--- /dev/null
+++ b/TAO/orbsvcs/orbsvcs/FtRtEvent/EventChannel/FT_ProxyAdmin_Base.h
@@ -0,0 +1,53 @@
+// -*- C++ -*-
+
+//=============================================================================
+/**
+ * @file FT_ProxyAdmin_Base.h
+ *
+ * $Id$
+ *
+ * @author Huang-Ming Huang <hh1@cse.wustl.edu>
+ */
+//=============================================================================
+#ifndef FT_PROXYADMIN_BASE_H
+#define FT_PROXYADMIN_BASE_H
+
+#include /**/ "ace/pre.h"
+
+#include "orbsvcs/FtRtecEventCommC.h"
+
+#if !defined (ACE_LACKS_PRAGMA_ONCE)
+# pragma once
+#endif /* ACE_LACKS_PRAGMA_ONCE */
+
+#include "tao/PortableServer/Servant_Base.h"
+
+TAO_BEGIN_VERSIONED_NAMESPACE_DECL
+
+class FT_ProxyAdmin_Base
+{
+public:
+ FT_ProxyAdmin_Base(PortableServer::ServantBase* servant,
+ PortableServer::POA_var poa);
+ virtual ~FT_ProxyAdmin_Base();
+ void activate(const FtRtecEventComm::ObjectId& oid
+ ACE_ENV_ARG_DECL);
+
+ const FtRtecEventComm::ObjectId& object_id(ACE_ENV_SINGLE_ARG_DECL) const;
+
+ /// Returns an CORBA object reference when the servant is activated
+ CORBA::Object_var reference(ACE_ENV_SINGLE_ARG_DECL) const;
+
+protected:
+
+ PortableServer::ServantBase* servant_;
+ /// Store the default POA.
+ PortableServer::POA_var poa_;
+ /// store the object id
+ FtRtecEventComm::ObjectId object_id_;
+};
+
+TAO_END_VERSIONED_NAMESPACE_DECL
+
+#include /**/ "ace/post.h"
+#endif
diff --git a/TAO/orbsvcs/orbsvcs/FtRtEvent/EventChannel/FT_ProxyAdmin_T.cpp b/TAO/orbsvcs/orbsvcs/FtRtEvent/EventChannel/FT_ProxyAdmin_T.cpp
new file mode 100644
index 00000000000..00c658cef95
--- /dev/null
+++ b/TAO/orbsvcs/orbsvcs/FtRtEvent/EventChannel/FT_ProxyAdmin_T.cpp
@@ -0,0 +1,145 @@
+// $Id$
+
+#include "orbsvcs/FtRtEvent/EventChannel/IOGR_Maker.h"
+#include "orbsvcs/FtRtEvent/EventChannel/Replication_Service.h"
+#include "ace/Synch_T.h"
+
+TAO_BEGIN_VERSIONED_NAMESPACE_DECL
+
+template <class EC_PROXY_ADMIN, class Proxy,
+ class ProxyInterface, class State>
+FT_ProxyAdmin<EC_PROXY_ADMIN, Proxy, ProxyInterface, State>::FT_ProxyAdmin(
+ EC_PROXY_ADMIN* admin, PortableServer::POA_var poa)
+ : FT_ProxyAdmin_Base(admin, poa), admin_(admin)
+{
+}
+
+
+template <class EC_PROXY_ADMIN, class Proxy,
+ class ProxyInterface, class State>
+void
+FT_ProxyAdmin<EC_PROXY_ADMIN, Proxy, ProxyInterface,State>::obtain_proxy (
+ const FtRtecEventChannelAdmin::Operation& op
+ ACE_ENV_ARG_DECL)
+{
+ Request_Context_Repository().set_object_id(op.object_id
+ ACE_ENV_ARG_PARAMETER);
+
+ ProxyInterface_var result
+ = admin_->obtain(ACE_ENV_SINGLE_ARG_PARAMETER);
+ ACE_CHECK;
+
+ FTRTEC::Replication_Service* svc = FTRTEC::Replication_Service::instance();
+ ACE_TRY {
+ ACE_Read_Guard<FTRTEC::Replication_Service> locker(*svc);
+
+ svc->replicate_request(op,
+ Proxy::rollback_obtain
+ ACE_ENV_ARG_PARAMETER);
+ ACE_TRY_CHECK;
+ }
+ ACE_CATCHALL {
+ admin_->disconnect(result.in());
+ ACE_RE_THROW;
+ }
+ ACE_ENDTRY;
+ ACE_CHECK;
+}
+
+template <class EC_PROXY_ADMIN, class Proxy,
+ class ProxyInterface, class State>
+typename FT_ProxyAdmin<EC_PROXY_ADMIN, Proxy, ProxyInterface, State>::ProxyInterface_ptr
+FT_ProxyAdmin<EC_PROXY_ADMIN, Proxy, ProxyInterface, State>::obtain_proxy (ACE_ENV_SINGLE_ARG_DECL)
+{
+ CORBA::Any_var any = Request_Context_Repository().get_cached_result(ACE_ENV_SINGLE_ARG_PARAMETER);
+ ACE_CHECK_RETURN(0);
+
+ CORBA::Object_var obj;
+ if (any >>= CORBA::Any::to_object(obj))
+ return ProxyInterface::_narrow(obj.in() ACE_ENV_ARG_PARAMETER);
+
+ FtRtecEventChannelAdmin::ObjectId oid;
+ Request_Context_Repository().generate_object_id(oid
+ ACE_ENV_ARG_PARAMETER);
+ ACE_CHECK_RETURN(0);
+
+ FtRtecEventChannelAdmin::Operation update;
+
+ update.object_id = oid;
+ update.param._d(EC_PROXY_ADMIN::OBTAIN_ID);
+
+ ProxyInterface_var result
+ = admin_->obtain(ACE_ENV_SINGLE_ARG_PARAMETER);
+ ACE_CHECK_RETURN(0);
+
+ ACE_TRY {
+ FTRTEC::Replication_Service* svc = FTRTEC::Replication_Service::instance();
+ ACE_Read_Guard<FTRTEC::Replication_Service> locker(*svc);
+ obj = IOGR_Maker::instance()->forge_iogr(result.in()
+ ACE_ENV_ARG_PARAMETER);
+ ACE_TRY_CHECK;
+
+ result = ProxyInterface::_narrow(obj.in() ACE_ENV_ARG_PARAMETER);
+ ACE_TRY_CHECK;
+
+ svc->replicate_request(update,
+ Proxy::rollback_obtain
+ ACE_ENV_ARG_PARAMETER);
+ ACE_TRY_CHECK;
+ }
+ ACE_CATCHALL {
+ admin_->disconnect(result.in());
+ ACE_RE_THROW;
+ }
+ ACE_ENDTRY;
+
+ return result._retn();
+}
+
+
+template <class EC_PROXY_ADMIN, class Proxy,
+ class ProxyInterface, class State>
+void FT_ProxyAdmin<EC_PROXY_ADMIN, Proxy, ProxyInterface, State>::get_state(
+ State& state
+ ACE_ENV_ARG_DECL)
+{
+ typename EC_PROXY_ADMIN::StateWorker worker(state.proxies);
+ admin_->for_each(&worker ACE_ENV_ARG_PARAMETER);
+ ACE_CHECK;
+}
+
+template <class EC_PROXY_ADMIN, class Proxy,
+ class ProxyInterface, class State>
+void FT_ProxyAdmin<EC_PROXY_ADMIN, Proxy, ProxyInterface, State>::set_state(
+ const State& state
+ ACE_ENV_ARG_DECL)
+{
+ for (size_t i =0; i < state.proxies.length(); ++i)
+ {
+ const typename Proxy::State& proxy_state
+ = state.proxies[i];
+
+ Request_Context_Repository().set_object_id(proxy_state.object_id
+ ACE_ENV_ARG_PARAMETER);
+ ACE_CHECK;
+
+ ProxyInterface_var
+ proxy_ior = admin_->obtain(ACE_ENV_SINGLE_ARG_PARAMETER);
+ ACE_CHECK;
+
+ typedef typename Proxy::Skeleton Skeleton;
+ const PortableServer::Servant servant = poa_->id_to_servant(
+ reinterpret_cast<const PortableServer::ObjectId&> (proxy_state.object_id)
+ ACE_ENV_ARG_PARAMETER);
+
+ ACE_CHECK;
+ Skeleton skeleton = dynamic_cast<Skeleton> (servant);
+ ACE_CHECK;
+
+ static_cast<Proxy*> (skeleton)->set_state(proxy_state
+ ACE_ENV_ARG_PARAMETER);
+ ACE_CHECK;
+ }
+}
+
+TAO_END_VERSIONED_NAMESPACE_DECL
diff --git a/TAO/orbsvcs/orbsvcs/FtRtEvent/EventChannel/FT_ProxyAdmin_T.h b/TAO/orbsvcs/orbsvcs/FtRtEvent/EventChannel/FT_ProxyAdmin_T.h
new file mode 100644
index 00000000000..92e2bf0ad6d
--- /dev/null
+++ b/TAO/orbsvcs/orbsvcs/FtRtEvent/EventChannel/FT_ProxyAdmin_T.h
@@ -0,0 +1,58 @@
+// -*- C++ -*-
+
+//=============================================================================
+/**
+ * @file FT_ProxyAdmin_T.h
+ *
+ * $Id$
+ *
+ * @author Huang-Ming Huang <hh1@cse.wustl.edu>
+ */
+//=============================================================================
+#ifndef FT_PROXYADMIN_H
+#define FT_PROXYADMIN_H
+
+#include "orbsvcs/FtRtEvent/EventChannel/FT_ProxyAdmin_Base.h"
+#include "../Utils/ScopeGuard.h"
+#include "orbsvcs/FtRtEvent/EventChannel/Request_Context_Repository.h"
+
+#if !defined (ACE_LACKS_PRAGMA_ONCE)
+# pragma once
+#endif /* ACE_LACKS_PRAGMA_ONCE */
+
+TAO_BEGIN_VERSIONED_NAMESPACE_DECL
+
+template <class EC_PROXY_ADMIN, class Proxy,
+ class ProxyInterface, class State>
+class FT_ProxyAdmin : public FT_ProxyAdmin_Base
+{
+public:
+ typedef typename ProxyInterface::_ptr_type ProxyInterface_ptr;
+ typedef typename ProxyInterface::_var_type ProxyInterface_var;
+
+ FT_ProxyAdmin(EC_PROXY_ADMIN* admin,
+ PortableServer::POA_var poa);
+
+ ProxyInterface_ptr obtain_proxy (ACE_ENV_SINGLE_ARG_DECL);
+
+ /// this is used for updating the state
+ void obtain_proxy (const FtRtecEventChannelAdmin::Operation& op
+ ACE_ENV_ARG_DECL);
+
+ void get_state(State& state ACE_ENV_ARG_DECL);
+ void set_state(const State& state ACE_ENV_ARG_DECL);
+private:
+ EC_PROXY_ADMIN* admin_;
+};
+
+TAO_END_VERSIONED_NAMESPACE_DECL
+
+#if defined (ACE_TEMPLATES_REQUIRE_SOURCE)
+#include "orbsvcs/FtRtEvent/EventChannel/FT_ProxyAdmin_T.cpp"
+#endif /* ACE_TEMPLATES_REQUIRE_SOURCE */
+
+#if defined (ACE_TEMPLATES_REQUIRE_PRAGMA)
+#pragma implementation ("FT_ProxyAdmin_T.cpp")
+#endif /* ACE_TEMPLATES_REQUIRE_PRAGMA */
+
+#endif
diff --git a/TAO/orbsvcs/orbsvcs/FtRtEvent/EventChannel/Fault_Detector.cpp b/TAO/orbsvcs/orbsvcs/FtRtEvent/EventChannel/Fault_Detector.cpp
new file mode 100644
index 00000000000..a7cc3c7a391
--- /dev/null
+++ b/TAO/orbsvcs/orbsvcs/FtRtEvent/EventChannel/Fault_Detector.cpp
@@ -0,0 +1,75 @@
+// $Id$
+
+#include "ace/Reactor.h"
+#include "orbsvcs/FtRtEvent/EventChannel/Fault_Detector.h"
+#include "ace/Select_Reactor.h"
+
+ACE_RCSID (EventChannel,
+ Fault_Detector,
+ "$Id$")
+
+TAO_BEGIN_VERSIONED_NAMESPACE_DECL
+
+Fault_Detector::ReactorTask::ReactorTask()
+ : reactor_(new ACE_Select_Reactor, 1)
+{
+}
+
+int
+Fault_Detector::ReactorTask::svc (void)
+{
+ this->reactor_.owner(ACE_OS::thr_self());
+ this->reactor_.run_reactor_event_loop();
+ return 0;
+}
+
+
+Fault_Detector::~Fault_Detector()
+{
+}
+
+const FTRT::Location& Fault_Detector::my_location() const
+{
+ return location_;
+}
+
+namespace {
+ Fault_Detector* detector;
+}
+
+Fault_Detector* Fault_Detector::instance()
+{
+ return detector;
+}
+
+int Fault_Detector::init(int argc, char** argv)
+{
+ detector = this;
+ if (this->parse_conf(argc, argv)==0 &&
+ this->init_acceptor() ==0)
+ {
+ if (!reactor_task_.thr_count() &&
+ reactor_task_.activate (THR_NEW_LWP | THR_JOINABLE, 1) != 0)
+ ACE_ERROR_RETURN ((LM_ERROR,"Cannot activate reactor thread\n"),
+ -1);
+ return 0;
+ }
+ return -1;
+}
+
+void Fault_Detector::stop()
+{
+ reactor_task_.reactor_.end_reactor_event_loop();
+}
+
+void Fault_Detector::set_listener(TAO_FTEC_Fault_Listener* listener)
+{
+ listener_ = listener;
+}
+
+int Fault_Detector::parse_conf(int , char** )
+{
+ return 0;
+}
+
+TAO_END_VERSIONED_NAMESPACE_DECL
diff --git a/TAO/orbsvcs/orbsvcs/FtRtEvent/EventChannel/Fault_Detector.h b/TAO/orbsvcs/orbsvcs/FtRtEvent/EventChannel/Fault_Detector.h
new file mode 100644
index 00000000000..a10fdf62f8f
--- /dev/null
+++ b/TAO/orbsvcs/orbsvcs/FtRtEvent/EventChannel/Fault_Detector.h
@@ -0,0 +1,64 @@
+// -*- C++ -*-
+
+//=============================================================================
+/**
+ * @file Fault_Detector.h
+ *
+ * $Id$
+ *
+ * @author Huang-Ming Huang <hh1@cse.wustl.edu>
+ */
+//=============================================================================
+
+#ifndef FAULT_DETECTOR_H
+#define FAULT_DETECTOR_H
+
+#include "ace/Task.h"
+#include "ace/Reactor.h"
+
+#include "orbsvcs/FTRT_GroupManagerC.h"
+
+#if !defined (ACE_LACKS_PRAGMA_ONCE)
+# pragma once
+#endif /* ACE_LACKS_PRAGMA_ONCE */
+
+TAO_BEGIN_VERSIONED_NAMESPACE_DECL
+
+class TAO_FTEC_Fault_Listener;
+
+class Fault_Detector
+{
+public:
+ virtual ~Fault_Detector();
+
+ static Fault_Detector* instance();
+
+ int init(int argc, ACE_TCHAR** argv);
+ void stop();
+ void set_listener(TAO_FTEC_Fault_Listener*);
+ const FTRT::Location& my_location() const;
+ virtual int connect(const FTRT::Location& location)=0;
+
+private:
+ virtual int init_acceptor()=0;
+ virtual int parse_conf(int argc, ACE_TCHAR** argv);
+
+protected:
+
+ class ReactorTask : public ACE_Task_Base
+ {
+ public:
+ // ctor
+ ReactorTask();
+ virtual int svc (void);
+ ACE_Reactor reactor_;
+ };
+
+ FTRT::Location location_;
+ ReactorTask reactor_task_;
+ TAO_FTEC_Fault_Listener* listener_;
+};
+
+TAO_END_VERSIONED_NAMESPACE_DECL
+
+#endif //FAULT_DETECTOR_H
diff --git a/TAO/orbsvcs/orbsvcs/FtRtEvent/EventChannel/Fault_Detector_Loader.cpp b/TAO/orbsvcs/orbsvcs/FtRtEvent/EventChannel/Fault_Detector_Loader.cpp
new file mode 100644
index 00000000000..56d8c25b846
--- /dev/null
+++ b/TAO/orbsvcs/orbsvcs/FtRtEvent/EventChannel/Fault_Detector_Loader.cpp
@@ -0,0 +1,90 @@
+// $Id$
+
+#include "orbsvcs/FtRtEvent/EventChannel/Fault_Detector_Loader.h"
+#include "orbsvcs/FtRtEvent/EventChannel/Fault_Detector_T.h"
+#include "orbsvcs/FtRtEvent/EventChannel/FTEC_Fault_Listener.h"
+#include "orbsvcs/FtRtEvent/EventChannel/SCTP_Fault_Detector.h"
+#include "ace/SOCK_Acceptor.h"
+#include "ace/SOCK_Connector.h"
+#include "orbsvcs/FtRtEvent/EventChannel/ConnectionHandler_T.h"
+
+#include "ace/Acceptor.h"
+#include "ace/OS_NS_strings.h"
+
+ACE_RCSID (EventChannel,
+ Fault_Detector_Loader,
+ "$Id$")
+
+TAO_BEGIN_VERSIONED_NAMESPACE_DECL
+
+namespace FTRTEC {
+ typedef Fault_Detector_T<
+ ACE_Acceptor<ConnectionAcceptHandler<ACE_SOCK_STREAM> , ACE_SOCK_ACCEPTOR>,
+ ACE_SOCK_Connector, ConnectionDetectHandler<ACE_SOCK_STREAM> >
+ TCP_Fault_Detector;
+
+ Fault_Detector_Loader::Fault_Detector_Loader (void)
+ {
+ }
+
+ Fault_Detector_Loader::~Fault_Detector_Loader (void)
+ {
+ }
+
+ int
+ Fault_Detector_Loader::init (int argc,
+ ACE_TCHAR* argv[])
+ {
+ static int initialized = 0;
+
+ // Only allow initialization once.
+ if (initialized)
+ return 0;
+
+ initialized = 1;
+
+ Fault_Detector* detector = 0;
+
+ // Parse any service configurator parameters.
+ if (argc > 0 && ACE_OS::strcasecmp (argv[0], ACE_TEXT("sctp")) == 0)
+ {
+#if (TAO_HAS_SCIOP == 1)
+ ACE_AUTO_PTR_RESET(detector_, detector, Fault_Detector);
+#else
+ ACE_DEBUG ((LM_DEBUG,
+ "(%P|%t) SCTP not enabled. ",
+ " Enable SCTP and rebuild ACE+TAO \n"));
+#endif /* TAO_HAS_SCIOP */
+ argc--; argv++;
+ }
+ else {
+ ACE_NEW_RETURN(detector, TCP_Fault_Detector, -1);
+ ACE_AUTO_PTR_RESET(detector_, detector, Fault_Detector);
+ }
+ return detector_->init(argc, argv);
+ }
+
+ Fault_Detector*
+ Fault_Detector_Loader::detector()
+ {
+ return detector_.get();
+ }
+}
+
+TAO_END_VERSIONED_NAMESPACE_DECL
+
+ /////////////////////////////////////////////////////////////////////
+
+ACE_FACTORY_NAMESPACE_DEFINE (
+ TAO_FTRTEC,
+ Fault_Detector_Loader,
+ FTRTEC::Fault_Detector_Loader)
+
+ACE_STATIC_SVC_DEFINE (
+ Fault_Detector_Loader,
+ ACE_TEXT ("FTRTEC_Fault_Detector"),
+ ACE_SVC_OBJ_T,
+ &ACE_SVC_NAME (Fault_Detector_Loader),
+ ACE_Service_Type::DELETE_THIS
+ | ACE_Service_Type::DELETE_OBJ,
+ 0)
diff --git a/TAO/orbsvcs/orbsvcs/FtRtEvent/EventChannel/Fault_Detector_Loader.h b/TAO/orbsvcs/orbsvcs/FtRtEvent/EventChannel/Fault_Detector_Loader.h
new file mode 100644
index 00000000000..dbe29fe82da
--- /dev/null
+++ b/TAO/orbsvcs/orbsvcs/FtRtEvent/EventChannel/Fault_Detector_Loader.h
@@ -0,0 +1,59 @@
+// -*- C++ -*-
+
+//=============================================================================
+/**
+ * @file Fault_Detector_Loader.h
+ *
+ * $Id$
+ *
+ * @author Huang-Ming Huang <hh1@cse.wustl.edu>
+ */
+//=============================================================================
+
+#ifndef FAULT_DETECTOR_LOADER_H
+#define FAULT_DETECTOR_LOADER_H
+
+#include /**/ "ace/pre.h"
+
+#include "orbsvcs/FtRtEvent/EventChannel/ftrtec_export.h"
+
+#include "tao/orbconf.h"
+
+#include "ace/Service_Object.h"
+#include "ace/Service_Config.h"
+#include "ace/Auto_Ptr.h"
+
+#if !defined (ACE_LACKS_PRAGMA_ONCE)
+# pragma once
+#endif /* ACE_LACKS_PRAGMA_ONCE */
+
+TAO_BEGIN_VERSIONED_NAMESPACE_DECL
+
+class Fault_Detector;
+
+namespace FTRTEC {
+ class TAO_FTRTEC_Export Fault_Detector_Loader : public ACE_Service_Object
+ {
+ public:
+ /// Constructor.
+ Fault_Detector_Loader (void);
+
+ /// Destructor.
+ virtual ~Fault_Detector_Loader (void);
+
+ virtual int init (int argc,
+ ACE_TCHAR* []);
+ Fault_Detector* detector();
+ private:
+ auto_ptr<Fault_Detector> detector_;
+ };
+}
+
+TAO_END_VERSIONED_NAMESPACE_DECL
+
+ACE_STATIC_SVC_DECLARE_EXPORT (TAO_FTRTEC, Fault_Detector_Loader)
+ACE_STATIC_SVC_REQUIRE(Fault_Detector_Loader)
+ACE_FACTORY_DECLARE (TAO_FTRTEC, Fault_Detector_Loader)
+
+#include /**/ "ace/post.h"
+#endif //FAULT_DETECTOR_LOADER_H
diff --git a/TAO/orbsvcs/orbsvcs/FtRtEvent/EventChannel/Fault_Detector_T.cpp b/TAO/orbsvcs/orbsvcs/FtRtEvent/EventChannel/Fault_Detector_T.cpp
new file mode 100644
index 00000000000..bcf68ca9e98
--- /dev/null
+++ b/TAO/orbsvcs/orbsvcs/FtRtEvent/EventChannel/Fault_Detector_T.cpp
@@ -0,0 +1,65 @@
+
+// $Id$
+
+#include "ace/INET_Addr.h"
+#include "ace/os_include/os_netdb.h"
+
+TAO_BEGIN_VERSIONED_NAMESPACE_DECL
+
+template <class ACCEPTOR, class CONNECTOR, class DETECTION_HANDLER>
+Fault_Detector_T<ACCEPTOR, CONNECTOR, DETECTION_HANDLER>::Fault_Detector_T()
+{
+}
+
+template <class ACCEPTOR, class CONNECTOR, class DETECTION_HANDLER>
+Fault_Detector_T<ACCEPTOR, CONNECTOR, DETECTION_HANDLER>::~Fault_Detector_T()
+{
+}
+
+
+template <class ACCEPTOR, class CONNECTOR, class DETECTION_HANDLER>
+int
+Fault_Detector_T<ACCEPTOR, CONNECTOR, DETECTION_HANDLER>::init_acceptor()
+{
+ typename CONNECTOR::PEER_ADDR listen_addr;
+ if (acceptor_.open(listen_addr, &reactor_task_.reactor_) != 0)
+ ACE_ERROR_RETURN((LM_ERROR, "Connot open acceptor\n"), -1);
+
+ if (acceptor_.acceptor().get_local_addr(listen_addr) !=0)
+ ACE_ERROR_RETURN((LM_ERROR, "Connot get local addr\n"), -1);
+
+ ACE_DEBUG((LM_DEBUG, "listening at %s:%d\n", listen_addr.get_host_name(),
+ listen_addr.get_port_number()));
+ char* buf = CORBA::string_alloc(MAXHOSTNAMELEN);
+ listen_addr.addr_to_string(buf, MAXHOSTNAMELEN, 0);
+ location_.length(1);
+ location_[0].id = buf;
+ return 0;
+}
+
+template <class ACCEPTOR, class CONNECTOR, class DETECTION_HANDLER>
+int
+Fault_Detector_T<ACCEPTOR, CONNECTOR, DETECTION_HANDLER>::connect(const FTRT::Location& location)
+{
+ if (location.length() == 0)
+ return -1;
+
+ typename CONNECTOR::PEER_ADDR prev_addr(location[0].id);
+
+ DETECTION_HANDLER* handler;
+ ACE_NEW_RETURN(handler, DETECTION_HANDLER(listener_), 0) ;
+
+ handler->reactor(&reactor_task_.reactor_);
+ ACE_DEBUG((LM_DEBUG, "connecting to %s\n", location[0].id.in()));
+
+ int result = connector_.connect(handler->peer(), prev_addr);
+
+ if (result == 0)
+ handler->open(this);
+ else
+ handler->close();
+
+ return result ;
+}
+
+TAO_END_VERSIONED_NAMESPACE_DECL
diff --git a/TAO/orbsvcs/orbsvcs/FtRtEvent/EventChannel/Fault_Detector_T.h b/TAO/orbsvcs/orbsvcs/FtRtEvent/EventChannel/Fault_Detector_T.h
new file mode 100644
index 00000000000..45be158a522
--- /dev/null
+++ b/TAO/orbsvcs/orbsvcs/FtRtEvent/EventChannel/Fault_Detector_T.h
@@ -0,0 +1,48 @@
+// -*- C++ -*-
+
+//=============================================================================
+/**
+ * @file Fault_Detector_T.h
+ *
+ * $Id$
+ *
+ * @author Huang-Ming Huang <hh1@cse.wustl.edu>
+ */
+//=============================================================================
+
+#ifndef FAULT_DETECTOR_T_H
+#define FAULT_DETECTOR_T_H
+
+#include "orbsvcs/FtRtEvent/EventChannel/Fault_Detector.h"
+
+#if !defined (ACE_LACKS_PRAGMA_ONCE)
+# pragma once
+#endif /* ACE_LACKS_PRAGMA_ONCE */
+
+TAO_BEGIN_VERSIONED_NAMESPACE_DECL
+
+template <class ACCEPTOR, class CONNECTOR, class DETECTION_HANDLER>
+class Fault_Detector_T : public Fault_Detector
+{
+public:
+ Fault_Detector_T();
+ ~Fault_Detector_T();
+ int connect(const FTRT::Location& addr);
+protected:
+ ACCEPTOR acceptor_;
+ CONNECTOR connector_;
+private:
+ virtual int init_acceptor();
+};
+
+TAO_END_VERSIONED_NAMESPACE_DECL
+
+#if defined (ACE_TEMPLATES_REQUIRE_SOURCE)
+#include "orbsvcs/FtRtEvent/EventChannel/Fault_Detector_T.cpp"
+#endif /* ACE_TEMPLATES_REQUIRE_SOURCE */
+
+#if defined (ACE_TEMPLATES_REQUIRE_PRAGMA)
+#pragma implementation ("Fault_Detector_T.cpp")
+#endif /* ACE_TEMPLATES_REQUIRE_PRAGMA */
+
+#endif
diff --git a/TAO/orbsvcs/orbsvcs/FtRtEvent/EventChannel/Fault_Listener.h b/TAO/orbsvcs/orbsvcs/FtRtEvent/EventChannel/Fault_Listener.h
new file mode 100644
index 00000000000..e66914b0c29
--- /dev/null
+++ b/TAO/orbsvcs/orbsvcs/FtRtEvent/EventChannel/Fault_Listener.h
@@ -0,0 +1,33 @@
+// -*- C++ -*-
+
+//=============================================================================
+/**
+ * @file Fault_Listener.h
+ *
+ * $Id$
+ *
+ * @author Huang-Ming Huang <hh1@cse.wustl.edu>
+ */
+//=============================================================================
+
+#ifndef TAO_FTEC_FAULT_LISTENER_H
+#define TAO_FTEC_FAULT_LISTENER_H
+
+#if !defined (ACE_LACKS_PRAGMA_ONCE)
+# pragma once
+#endif /* ACE_LACKS_PRAGMA_ONCE */
+
+#include "tao/Versioned_Namespace.h"
+
+TAO_BEGIN_VERSIONED_NAMESPACE_DECL
+
+class TAO_FTEC_Fault_Listener
+{
+public:
+ virtual ~TAO_FTEC_Fault_Listener(){};
+ virtual void connection_closed()=0;
+};
+
+TAO_END_VERSIONED_NAMESPACE_DECL
+
+#endif
diff --git a/TAO/orbsvcs/orbsvcs/FtRtEvent/EventChannel/ForwardCtrlServerInterceptor.cpp b/TAO/orbsvcs/orbsvcs/FtRtEvent/EventChannel/ForwardCtrlServerInterceptor.cpp
new file mode 100644
index 00000000000..ee750df8f22
--- /dev/null
+++ b/TAO/orbsvcs/orbsvcs/FtRtEvent/EventChannel/ForwardCtrlServerInterceptor.cpp
@@ -0,0 +1,260 @@
+// $Id$
+
+#include "orbsvcs/FtRtEvent/EventChannel/ForwardCtrlServerInterceptor.h"
+#include "orbsvcs/FtRtEvent/EventChannel/GroupInfoPublisher.h"
+#include "orbsvcs/FtRtEvent/EventChannel/IOGR_Maker.h"
+#include "tao/PortableServer/PortableServer.h"
+#include "../Utils/resolve_init.h"
+#include "../Utils/Safe_InputCDR.h"
+#include "../Utils/Log.h"
+
+#include "tao/Object_KeyC.h"
+#include "tao/ORB_Constants.h"
+
+#include "orbsvcs/FTRTC.h"
+
+ACE_RCSID (EventChannel,
+ ForwardCtrlServerInterceptor,
+ "$Id$")
+
+TAO_BEGIN_VERSIONED_NAMESPACE_DECL
+
+CORBA::Object_ptr get_target(PortableInterceptor::ServerRequestInfo_ptr ri
+ ACE_ENV_ARG_DECL)
+{
+ CORBA::String_var orb_id = ri->orb_id(ACE_ENV_SINGLE_ARG_PARAMETER);
+ ACE_CHECK_RETURN(CORBA::Object::_nil());
+
+ int argc =0;
+ char** argv =0;
+ CORBA::ORB_var orb = CORBA::ORB_init(argc, argv, orb_id.in()
+ ACE_ENV_ARG_PARAMETER);
+ ACE_CHECK_RETURN(CORBA::Object::_nil());
+
+ PortableServer::POA_var poa =
+ resolve_init<PortableServer::POA>(orb.in(), "RootPOA"
+ ACE_ENV_ARG_PARAMETER);
+ ACE_CHECK_RETURN(CORBA::Object::_nil());
+
+ PortableInterceptor::AdapterName_var adaptor_name =
+ ri->adapter_name(ACE_ENV_SINGLE_ARG_PARAMETER);
+ ACE_CHECK_RETURN(CORBA::Object::_nil());
+
+ for (size_t i = 1; i < adaptor_name->length(); ++i) {
+ poa = poa->find_POA((*adaptor_name)[i] , false
+ ACE_ENV_ARG_PARAMETER);
+ ACE_CHECK_RETURN(CORBA::Object::_nil());
+ }
+
+ CORBA::OctetSeq_var oid =
+ ri->object_id(ACE_ENV_SINGLE_ARG_PARAMETER);
+ ACE_CHECK_RETURN(CORBA::Object::_nil());
+
+ CORBA::Object_var obj =
+ poa->id_to_reference(oid.in()
+ ACE_ENV_ARG_PARAMETER);
+ ACE_CHECK_RETURN(CORBA::Object::_nil());
+
+ return obj._retn();
+}
+
+CORBA::Object_ptr get_forward(PortableInterceptor::ServerRequestInfo_ptr ri
+ ACE_ENV_ARG_DECL)
+{
+ CORBA::Object_var target =
+ get_target(ri ACE_ENV_ARG_PARAMETER);
+ ACE_CHECK_RETURN(CORBA::Object::_nil());
+
+ TAO::ObjectKey_var key =
+ target->_key(ACE_ENV_SINGLE_ARG_PARAMETER);
+ ACE_CHECK_RETURN(CORBA::Object::_nil());
+
+ CORBA::Object_var iogr =
+ GroupInfoPublisher::instance()->group_reference();
+
+ CORBA::Object_var forward =
+ IOGR_Maker::instance()->ior_replace_key(iogr.in(), key.in()
+ ACE_ENV_ARG_PARAMETER);
+ ACE_CHECK_RETURN(CORBA::Object::_nil());
+
+ return forward._retn();
+}
+
+
+ForwardCtrlServerInterceptor::ForwardCtrlServerInterceptor()
+{
+}
+
+ForwardCtrlServerInterceptor::~ForwardCtrlServerInterceptor()
+{
+}
+
+char * ForwardCtrlServerInterceptor::name (ACE_ENV_SINGLE_ARG_DECL_NOT_USED)
+ ACE_THROW_SPEC ((CORBA::SystemException))
+{
+ return CORBA::string_dup("ForwardCtrlServerInterceptor");
+}
+
+void ForwardCtrlServerInterceptor::destroy (ACE_ENV_SINGLE_ARG_DECL_NOT_USED)
+ ACE_THROW_SPEC ((CORBA::SystemException))
+{
+}
+
+void ForwardCtrlServerInterceptor::receive_request (PortableInterceptor::ServerRequestInfo_ptr ri
+ ACE_ENV_ARG_DECL)
+ ACE_THROW_SPEC ((CORBA::SystemException,
+ PortableInterceptor::ForwardRequest))
+{
+ ACE_TRY {
+ IOP::ServiceContext_var service_context =
+ ri->get_request_service_context(IOP::FT_GROUP_VERSION
+ ACE_ENV_ARG_PARAMETER);
+ ACE_TRY_CHECK;
+ }
+ ACE_CATCHANY {
+ // not an FT call , continue to process the request
+ return;
+ }
+ ACE_ENDTRY;
+ ACE_CHECK;
+
+ GroupInfoPublisherBase* publisher = GroupInfoPublisher::instance();
+ if (!publisher->is_primary()) {
+ // I am not primary, forword the request to primary
+ CORBA::Object_var forward = get_forward(ri
+ ACE_ENV_ARG_PARAMETER);
+
+ ACE_THROW (PortableInterceptor::ForwardRequest (forward.in()));
+ }
+}
+
+void ForwardCtrlServerInterceptor::receive_request_service_contexts (
+ PortableInterceptor::ServerRequestInfo_ptr
+ ACE_ENV_ARG_DECL_NOT_USED)
+ ACE_THROW_SPEC ((CORBA::SystemException,
+ PortableInterceptor::ForwardRequest))
+{
+}
+
+FT::ObjectGroupRefVersion get_ft_group_version(IOP::ServiceContext_var service_context
+ ACE_ENV_ARG_DECL)
+{
+ Safe_InputCDR cdr (reinterpret_cast<const char*> (service_context->context_data.get_buffer ()),
+ service_context->context_data.length ());
+
+ CORBA::Boolean byte_order;
+
+ if ((cdr >> ACE_InputCDR::to_boolean (byte_order)) == 0)
+ ACE_THROW_RETURN (CORBA::BAD_PARAM (CORBA::OMGVMCID | 28, CORBA::COMPLETED_NO), 0);
+
+ cdr.reset_byte_order (static_cast<int> (byte_order));
+
+ FT::FTGroupVersionServiceContext fgvsc;
+
+ if ((cdr >> fgvsc) == 0)
+ ACE_THROW_RETURN (CORBA::BAD_PARAM (CORBA::OMGVMCID | 28,
+ CORBA::COMPLETED_NO), 0);
+
+ return fgvsc.object_group_ref_version;
+}
+
+
+
+void ForwardCtrlServerInterceptor::send_reply (PortableInterceptor::ServerRequestInfo_ptr ri
+ ACE_ENV_ARG_DECL)
+ ACE_THROW_SPEC ((CORBA::SystemException))
+{
+ IOP::ServiceContext_var service_context;
+ FT::ObjectGroupRefVersion version=0;
+
+ ACE_TRY_EX(block1)
+ {
+ if (!ri->response_expected(ACE_ENV_SINGLE_ARG_PARAMETER))
+ return;
+ ACE_TRY_CHECK_EX(block1);
+
+ service_context =
+ ri->get_request_service_context(IOP::FT_GROUP_VERSION
+ ACE_ENV_ARG_PARAMETER);
+ ACE_TRY_CHECK_EX(block1);
+ // get the ref version service context
+ version =
+ get_ft_group_version(service_context
+ ACE_ENV_ARG_PARAMETER);
+ ACE_TRY_CHECK_EX(block1);
+ }
+ ACE_CATCHALL {
+ // not an FT call , continue to reply the request
+ return;
+ }
+ ACE_ENDTRY;
+
+ // pass a new IOGR if the client use an outdated version
+
+ IOGR_Maker* maker = IOGR_Maker::instance();
+ TAO_FTRTEC::Log(3, "Current GROUP Version = %d, received version = %d\n",
+ maker->get_ref_version(), version);
+
+ if (version < maker->get_ref_version()) {
+ ACE_DEBUG((LM_DEBUG, "Outdated IOGR version, passing new IOGR\n"));
+
+ ACE_TRY_EX(block2) {
+ CORBA::Object_var forward = get_forward(ri
+ ACE_ENV_ARG_PARAMETER);
+ ACE_TRY_CHECK_EX(block2);
+
+ IOP::ServiceContext sc;
+ sc.context_id = FTRT::FT_FORWARD;
+ TAO_OutputCDR cdr;
+
+ //if (!(cdr << ACE_OutputCDR::from_boolean (TAO_ENCAP_BYTE_ORDER)))
+ //ACE_THROW (CORBA::MARSHAL ());
+
+ if ((cdr << forward.in() ) == 0 )
+ ACE_THROW (CORBA::MARSHAL ());
+
+ ACE_Message_Block mb;
+ ACE_CDR::consolidate(&mb, cdr.begin());
+#if (TAO_NO_COPY_OCTET_SEQUENCES == 1)
+ sc.context_data.replace(mb.length(), &mb);
+#else
+ // If the replace method is not available, we will need
+ // to do the copy manually. First, set the octet sequence length.
+ CORBA::ULong length = mb.length ();
+ sc.context_data.length (length);
+
+ // Now copy over each byte.
+ char* base = mb.data_block ()->base ();
+ for(CORBA::ULong i = 0; i < length; i++)
+ {
+ sc.context_data[i] = base[i];
+ }
+#endif /* TAO_NO_COPY_OCTET_SEQUENCES == 1 */
+
+ ri->add_reply_service_context (sc, 0 ACE_ENV_ARG_PARAMETER);
+ ACE_TRY_CHECK_EX(block2);
+
+ ACE_DEBUG((LM_DEBUG, "reply_service_context added\n"));
+ }
+ ACE_CATCHALL {
+ }
+ ACE_ENDTRY;
+ }
+
+}
+
+void ForwardCtrlServerInterceptor::send_exception (PortableInterceptor::ServerRequestInfo_ptr
+ ACE_ENV_ARG_DECL_NOT_USED)
+ ACE_THROW_SPEC ((CORBA::SystemException,
+ PortableInterceptor::ForwardRequest))
+{
+}
+
+void ForwardCtrlServerInterceptor::send_other (PortableInterceptor::ServerRequestInfo_ptr
+ ACE_ENV_ARG_DECL_NOT_USED)
+ ACE_THROW_SPEC ((CORBA::SystemException,
+ PortableInterceptor::ForwardRequest))
+{
+}
+
+TAO_END_VERSIONED_NAMESPACE_DECL
diff --git a/TAO/orbsvcs/orbsvcs/FtRtEvent/EventChannel/ForwardCtrlServerInterceptor.h b/TAO/orbsvcs/orbsvcs/FtRtEvent/EventChannel/ForwardCtrlServerInterceptor.h
new file mode 100644
index 00000000000..d53dc682b0e
--- /dev/null
+++ b/TAO/orbsvcs/orbsvcs/FtRtEvent/EventChannel/ForwardCtrlServerInterceptor.h
@@ -0,0 +1,65 @@
+// -*- C++ -*-
+
+//=============================================================================
+/**
+ * @file ForwardCtrlServerInterceptor.h
+ *
+ * $Id$
+ *
+ * @author Huang-Ming Huang <hh1@cse.wustl.edu>
+ */
+//=============================================================================
+#ifndef FORWARDCTRLSERVERINTERCEPTOR_H
+#define FORWARDCTRLSERVERINTERCEPTOR_H
+
+#include "tao/PI_Server/PI_Server.h"
+#include "tao/PortableInterceptorC.h"
+
+#if !defined (ACE_LACKS_PRAGMA_ONCE)
+# pragma once
+#endif /* ACE_LACKS_PRAGMA_ONCE */
+
+TAO_BEGIN_VERSIONED_NAMESPACE_DECL
+
+class ForwardCtrlServerInterceptor
+ : public PortableInterceptor::ServerRequestInterceptor
+{
+public:
+ ForwardCtrlServerInterceptor();
+ ~ForwardCtrlServerInterceptor();
+
+ virtual char * name (ACE_ENV_SINGLE_ARG_DECL)
+ ACE_THROW_SPEC ((CORBA::SystemException));
+
+ virtual void destroy (ACE_ENV_SINGLE_ARG_DECL)
+ ACE_THROW_SPEC ((CORBA::SystemException));
+
+ virtual void receive_request (PortableInterceptor::ServerRequestInfo_ptr ri
+ ACE_ENV_ARG_DECL)
+ ACE_THROW_SPEC ((CORBA::SystemException,
+ PortableInterceptor::ForwardRequest));
+
+ virtual void receive_request_service_contexts (
+ PortableInterceptor::ServerRequestInfo_ptr
+ ACE_ENV_ARG_DECL)
+ ACE_THROW_SPEC ((CORBA::SystemException,
+ PortableInterceptor::ForwardRequest));
+
+ virtual void send_reply (PortableInterceptor::ServerRequestInfo_ptr ri
+ ACE_ENV_ARG_DECL)
+ ACE_THROW_SPEC ((CORBA::SystemException));
+
+ virtual void send_exception (PortableInterceptor::ServerRequestInfo_ptr ri
+ ACE_ENV_ARG_DECL)
+ ACE_THROW_SPEC ((CORBA::SystemException,
+ PortableInterceptor::ForwardRequest));
+
+ virtual void send_other (PortableInterceptor::ServerRequestInfo_ptr
+ ACE_ENV_ARG_DECL)
+ ACE_THROW_SPEC ((CORBA::SystemException,
+ PortableInterceptor::ForwardRequest));
+};
+
+TAO_END_VERSIONED_NAMESPACE_DECL
+
+#endif
diff --git a/TAO/orbsvcs/orbsvcs/FtRtEvent/EventChannel/FtEventServiceInterceptor.cpp b/TAO/orbsvcs/orbsvcs/FtRtEvent/EventChannel/FtEventServiceInterceptor.cpp
new file mode 100644
index 00000000000..779396ce1ee
--- /dev/null
+++ b/TAO/orbsvcs/orbsvcs/FtRtEvent/EventChannel/FtEventServiceInterceptor.cpp
@@ -0,0 +1,340 @@
+// $Id$
+#include "ace/OS_NS_string.h"
+#include "ace/SString.h"
+#include "orbsvcs/FT_CORBA_ORBC.h"
+#include "orbsvcs/FtRtEvent/EventChannel/FtEventServiceInterceptor.h"
+#include "orbsvcs/FtRtEvent/EventChannel/Request_Context_Repository.h"
+#include "../Utils/Safe_InputCDR.h"
+#include "../Utils/Log.h"
+
+ACE_RCSID (EventChannel,
+ FtEventServiceInterceptor,
+ "$Id$")
+
+TAO_BEGIN_VERSIONED_NAMESPACE_DECL
+
+bool
+CachedRequestTable::is_new_request(const ACE_CString& client_id, CORBA::Long retention_id)
+{
+ TableImpl::ENTRY* entry = 0;
+ return table_.find(client_id, entry) !=0 || entry->int_id_.retention_id != retention_id;
+}
+
+int
+CachedRequestTable::update(const ACE_CString& client_id,
+ CORBA::Long retention_id,
+ const CORBA::Any& result)
+{
+ CachedRequestInfo info;
+ info.retention_id = retention_id;
+ TableImpl::ENTRY* entry=0;
+ if (table_.bind(client_id, info, entry))
+ {
+ entry->int_id_.result = result;
+ return 0;
+ }
+ return -1;
+}
+
+
+
+CORBA::Any
+CachedRequestTable::get_result(const ACE_CString& client_id)
+{
+ TableImpl::ENTRY* entry = 0;
+ if (table_.find(client_id, entry)) {
+ return entry->int_id_.result;
+ }
+ return CORBA::Any();
+}
+
+
+void
+CachedRequestTable::get_state(FtRtecEventChannelAdmin::CachedOptionResults& state)
+{
+ state.length(table_.current_size());
+ TableImpl::iterator last = table_.end();
+ int i = 0;
+
+ for (TableImpl::iterator first = table_.begin();
+ first != last;
+ ++first)
+ {
+ TableImpl::ENTRY& entry = *first;
+ state[i].client_id = ACE_OS::strdup(entry.ext_id_.c_str());
+ state[i].cached_result = entry.int_id_;
+ ++i;
+ }
+
+}
+
+void
+CachedRequestTable::set_state(const FtRtecEventChannelAdmin::CachedOptionResults& state)
+{
+ for (size_t i = 0; i < state.length(); ++i)
+ {
+ table_.bind(state[i].client_id.in(), state[i].cached_result);
+ }
+}
+
+void
+retrieve_ft_request_context(
+ PortableInterceptor::ServerRequestInfo_ptr ri,
+ IOP::ServiceContext_var& service_context,
+ FT::FTRequestServiceContext& ft_request_service_context
+ ACE_ENV_ARG_DECL)
+{
+ service_context = ri->get_request_service_context(IOP::FT_REQUEST ACE_ENV_ARG_PARAMETER);
+ ACE_CHECK;
+
+ const char * buf =
+ reinterpret_cast<const char *> (service_context->context_data.get_buffer ());
+
+ Safe_InputCDR cdr (buf,
+ service_context->context_data.length ());
+
+ CORBA::Boolean byte_order;
+
+ if ((cdr >> ACE_InputCDR::to_boolean (byte_order)) == 0)
+ ACE_THROW (CORBA::BAD_PARAM ());
+
+ cdr.reset_byte_order (static_cast<int> (byte_order));
+
+
+ if ((cdr >> ft_request_service_context) == 0)
+ ACE_THROW (CORBA::BAD_PARAM ());
+
+}
+
+FTRT::TransactionDepth
+get_transaction_depth_context(
+ PortableInterceptor::ServerRequestInfo_ptr ri
+ ACE_ENV_ARG_DECL)
+{
+ IOP::ServiceContext_var service_context;
+ ACE_TRY {
+ service_context = ri->get_request_service_context(FTRT::FT_TRANSACTION_DEPTH
+ ACE_ENV_ARG_PARAMETER);
+ ACE_TRY_CHECK;
+ }
+ ACE_CATCH (CORBA::BAD_PARAM, ex)
+ {
+ ACE_DEBUG((LM_DEBUG, "Received request without transaction depth context\n"));
+ return -1;
+ }
+ ACE_ENDTRY;
+
+ const char * buf =
+ reinterpret_cast<const char *> (service_context->context_data.get_buffer ());
+ Safe_InputCDR cdr (buf,
+ service_context->context_data.length ());
+
+ CORBA::Boolean byte_order;
+
+ if ((cdr >> ACE_InputCDR::to_boolean (byte_order)) == 0)
+ ACE_THROW_RETURN (CORBA::BAD_PARAM (), -1);
+
+ cdr.reset_byte_order (static_cast<int> (byte_order));
+
+ FTRT::TransactionDepth result;
+ if ((cdr >> result) == 0)
+ ACE_THROW_RETURN (CORBA::BAD_PARAM (), -1);
+
+ return result;
+}
+
+FTRT::SequenceNumber
+get_sequence_number_context(
+ PortableInterceptor::ServerRequestInfo_ptr ri
+ ACE_ENV_ARG_DECL)
+{
+ FTRT::SequenceNumber result;
+ IOP::ServiceContext_var service_context;
+ service_context = ri->get_request_service_context(FTRT::FT_SEQUENCE_NUMBER
+ ACE_ENV_ARG_PARAMETER);
+ ACE_CHECK_RETURN(0);
+
+ const char * buf =
+ reinterpret_cast<const char *> (service_context->context_data.get_buffer ());
+ Safe_InputCDR cdr (buf,
+ service_context->context_data.length ());
+
+ CORBA::Boolean byte_order;
+
+ if ((cdr >> ACE_InputCDR::to_boolean (byte_order)) == 0)
+ ACE_THROW_RETURN (CORBA::BAD_PARAM (), 0);
+
+ cdr.reset_byte_order (static_cast<int> (byte_order));
+
+ if ((cdr >> result) == 0)
+ ACE_THROW_RETURN (CORBA::BAD_PARAM (), 0);
+
+ return result;
+}
+
+
+namespace {
+FtEventServiceInterceptor* interceptor;
+}
+
+FtEventServiceInterceptor::FtEventServiceInterceptor ()
+{
+ interceptor = this;
+}
+
+FtEventServiceInterceptor::~FtEventServiceInterceptor ()
+{
+}
+
+FtEventServiceInterceptor*
+FtEventServiceInterceptor::instance()
+{
+ return interceptor;
+}
+
+char *
+FtEventServiceInterceptor::name (ACE_ENV_SINGLE_ARG_DECL_NOT_USED)
+ACE_THROW_SPEC ((CORBA::SystemException))
+{
+ return CORBA::string_dup ("FtEventServiceInterceptor");
+}
+
+void
+FtEventServiceInterceptor::destroy (ACE_ENV_SINGLE_ARG_DECL_NOT_USED)
+ACE_THROW_SPEC ((CORBA::SystemException))
+{
+}
+
+void
+FtEventServiceInterceptor::receive_request_service_contexts (
+ PortableInterceptor::ServerRequestInfo_ptr
+ ACE_ENV_ARG_DECL_NOT_USED)
+ ACE_THROW_SPEC ((CORBA::SystemException,
+ PortableInterceptor::ForwardRequest))
+{
+}
+
+
+void
+FtEventServiceInterceptor::receive_request (PortableInterceptor::ServerRequestInfo_ptr ri
+ ACE_ENV_ARG_DECL)
+ ACE_THROW_SPEC ((CORBA::SystemException,
+ PortableInterceptor::ForwardRequest))
+{
+ CORBA::String_var operation = ri->operation (ACE_ENV_SINGLE_ARG_PARAMETER);
+ ACE_CHECK;
+ if (ACE_OS::strcmp(operation.in(), "push") == 0) {
+ TAO_FTRTEC::Log(3, "Received push command\n");
+ return;
+ }
+
+ ACE_TRY_EX(block1) {
+ FT::FTRequestServiceContext ft_request_service_context;
+ IOP::ServiceContext_var service_context;
+ retrieve_ft_request_context(ri,
+ service_context,
+ ft_request_service_context
+ ACE_ENV_ARG_PARAMETER);
+ ACE_TRY_CHECK_EX(block1);
+
+ bool is_new_request = request_table_.is_new_request(
+ ft_request_service_context.client_id.in(),
+ ft_request_service_context.retention_id);
+
+ CORBA::Any cached_result;
+ if (!is_new_request) {
+ cached_result =
+ request_table_.get_result(ft_request_service_context.client_id.in());
+ }
+
+ Request_Context_Repository().set_cached_result(ri, cached_result
+ ACE_ENV_ARG_PARAMETER);
+ ACE_TRY_CHECK_EX(block1);
+ Request_Context_Repository().set_ft_request_service_context(ri, service_context
+ ACE_ENV_ARG_PARAMETER);
+ ACE_TRY_CHECK_EX(block1);
+
+ ACE_TRY_EX(block2) {
+
+ FTRT::TransactionDepth transaction_depth =
+ get_transaction_depth_context(ri
+ ACE_ENV_ARG_PARAMETER);
+ ACE_TRY_CHECK_EX(block2);
+
+ Request_Context_Repository().set_transaction_depth(ri, transaction_depth
+ ACE_ENV_ARG_PARAMETER);
+ ACE_TRY_CHECK_EX(block2);
+ }
+ ACE_CATCH (CORBA::BAD_PARAM, ex) {
+ }
+ ACE_ENDTRY;
+
+ FTRT::SequenceNumber sequence_no =
+ get_sequence_number_context(ri ACE_ENV_ARG_PARAMETER);
+ ACE_TRY_CHECK_EX(block1);
+
+ Request_Context_Repository().set_sequence_number(ri, sequence_no
+ ACE_ENV_ARG_PARAMETER);
+ ACE_TRY_CHECK_EX(block1);
+ }
+ ACE_CATCH (CORBA::BAD_PARAM, ex) {
+ }
+ ACE_ENDTRY;
+}
+
+void
+FtEventServiceInterceptor::send_reply (PortableInterceptor::ServerRequestInfo_ptr ri
+ ACE_ENV_ARG_DECL)
+ ACE_THROW_SPEC ((CORBA::SystemException))
+{
+ FT::FTRequestServiceContext ft_request_service_context;
+ IOP::ServiceContext_var service_context;
+
+ ACE_TRY {
+ retrieve_ft_request_context(ri,
+ service_context,
+ ft_request_service_context
+ ACE_ENV_ARG_PARAMETER);
+ ACE_TRY_CHECK;
+ }
+ ACE_CATCH (CORBA::BAD_PARAM, ex) {
+ return;
+ }
+ ACE_ENDTRY;
+
+ request_table_.update(ft_request_service_context.client_id.in(),
+ ft_request_service_context.retention_id,
+ *(ri->result()) );
+}
+
+void
+FtEventServiceInterceptor::send_exception (
+ PortableInterceptor::ServerRequestInfo_ptr
+ ACE_ENV_ARG_DECL_NOT_USED)
+ ACE_THROW_SPEC ((CORBA::SystemException,
+ PortableInterceptor::ForwardRequest))
+{
+}
+
+void
+FtEventServiceInterceptor::send_other (PortableInterceptor::ServerRequestInfo_ptr
+ ACE_ENV_ARG_DECL_NOT_USED)
+ ACE_THROW_SPEC ((CORBA::SystemException,
+ PortableInterceptor::ForwardRequest))
+{
+}
+
+
+void
+FtEventServiceInterceptor::get_state(FtRtecEventChannelAdmin::CachedOptionResults& state)
+{
+ request_table_.get_state(state);
+}
+
+void
+FtEventServiceInterceptor::set_state(const FtRtecEventChannelAdmin::CachedOptionResults& state)
+{
+ request_table_.set_state(state);
+}
+
+TAO_END_VERSIONED_NAMESPACE_DECL
diff --git a/TAO/orbsvcs/orbsvcs/FtRtEvent/EventChannel/FtEventServiceInterceptor.h b/TAO/orbsvcs/orbsvcs/FtRtEvent/EventChannel/FtEventServiceInterceptor.h
new file mode 100644
index 00000000000..09a28a81257
--- /dev/null
+++ b/TAO/orbsvcs/orbsvcs/FtRtEvent/EventChannel/FtEventServiceInterceptor.h
@@ -0,0 +1,100 @@
+// -*- C++ -*-
+
+//=============================================================================
+/**
+ * @file FtEventServiceInterceptor.h
+ *
+ * $Id$
+ *
+ * @author Huang-Ming Huang <hh1@cse.wustl.edu>
+ */
+//=============================================================================
+
+#ifndef FTEVENTSERVICEINTERCEPTOR_H
+#define FTEVENTSERVICEINTERCEPTOR_H
+#include "ace/Hash_Map_Manager_T.h"
+#include "ace/SString.h"
+#include "tao/PortableInterceptorC.h"
+#include "tao/LocalObject.h"
+#include "tao/ORB.h"
+#include "orbsvcs/FtRtecEventChannelAdminC.h"
+#include "tao/PI_Server/PI_Server.h"
+#include "tao/PI/PI.h"
+
+#if !defined (ACE_LACKS_PRAGMA_ONCE)
+# pragma once
+#endif /* ACE_LACKS_PRAGMA_ONCE */
+
+TAO_BEGIN_VERSIONED_NAMESPACE_DECL
+
+class TAO_FTEC_Event_Channel_Impl;
+typedef FtRtecEventChannelAdmin::CachedResult CachedRequestInfo;
+
+class CachedRequestTable
+{
+public:
+ bool is_new_request(const ACE_CString& client_id, CORBA::Long retention_id);
+ int update(const ACE_CString& client_id,
+ CORBA::Long retention_id,
+ const CORBA::Any&);
+ CORBA::Any get_result(const ACE_CString& client_id);
+ void get_state(FtRtecEventChannelAdmin::CachedOptionResults& state);
+ void set_state(const FtRtecEventChannelAdmin::CachedOptionResults& state);
+private:
+ typedef ACE_Hash_Map_Manager<ACE_CString, CachedRequestInfo, ACE_SYNCH_MUTEX> TableImpl;
+ TableImpl table_;
+};
+
+
+class FtEventServiceInterceptor :
+ public PortableInterceptor::ServerRequestInterceptor
+{
+public:
+ FtEventServiceInterceptor();
+ ~FtEventServiceInterceptor();
+
+ static FtEventServiceInterceptor* instance();
+ virtual char * name (ACE_ENV_SINGLE_ARG_DECL)
+ ACE_THROW_SPEC ((CORBA::SystemException));
+
+ virtual void destroy (ACE_ENV_SINGLE_ARG_DECL)
+ ACE_THROW_SPEC ((CORBA::SystemException));
+
+ virtual void receive_request (PortableInterceptor::ServerRequestInfo_ptr ri
+ ACE_ENV_ARG_DECL)
+ ACE_THROW_SPEC ((CORBA::SystemException,
+ PortableInterceptor::ForwardRequest));
+
+ virtual void receive_request_service_contexts (
+ PortableInterceptor::ServerRequestInfo_ptr
+ ACE_ENV_ARG_DECL)
+ ACE_THROW_SPEC ((CORBA::SystemException,
+ PortableInterceptor::ForwardRequest));
+
+ virtual void send_reply (PortableInterceptor::ServerRequestInfo_ptr ri
+ ACE_ENV_ARG_DECL)
+ ACE_THROW_SPEC ((CORBA::SystemException));
+
+ virtual void send_exception (PortableInterceptor::ServerRequestInfo_ptr ri
+ ACE_ENV_ARG_DECL)
+ ACE_THROW_SPEC ((CORBA::SystemException,
+ PortableInterceptor::ForwardRequest));
+
+ virtual void send_other (PortableInterceptor::ServerRequestInfo_ptr
+ ACE_ENV_ARG_DECL)
+ ACE_THROW_SPEC ((CORBA::SystemException,
+ PortableInterceptor::ForwardRequest));
+
+ void get_state(FtRtecEventChannelAdmin::CachedOptionResults& state);
+ void set_state(const FtRtecEventChannelAdmin::CachedOptionResults& state);
+private:
+ PortableInterceptor::Current_var pic(PortableInterceptor::ServerRequestInfo_ptr ri
+ ACE_ENV_ARG_DECL);
+
+ CORBA::ORB_var orb_;
+ CachedRequestTable request_table_;
+};
+
+TAO_END_VERSIONED_NAMESPACE_DECL
+
+#endif
diff --git a/TAO/orbsvcs/orbsvcs/FtRtEvent/EventChannel/GroupInfoPublisher.cpp b/TAO/orbsvcs/orbsvcs/FtRtEvent/EventChannel/GroupInfoPublisher.cpp
new file mode 100644
index 00000000000..63d7801689e
--- /dev/null
+++ b/TAO/orbsvcs/orbsvcs/FtRtEvent/EventChannel/GroupInfoPublisher.cpp
@@ -0,0 +1,175 @@
+// $Id$
+
+#include "orbsvcs/FtRtEvent/EventChannel/GroupInfoPublisher.h"
+#include "../Utils/resolve_init.h"
+#include "orbsvcs/FtRtEvent/EventChannel/IOGR_Maker.h"
+#include "orbsvcs/FtRtEvent/EventChannel/Identification_Service.h"
+#include "orbsvcs/FtRtEvent/EventChannel/FTEC_Become_Primary_Listener.h"
+#include "../Utils/Log.h"
+
+//#include "../Utils/log_obj_endpoints.h"
+
+ACE_RCSID (EventChannel,
+ GroupInfoPublisher,
+ "$Id$")
+
+
+TAO_BEGIN_VERSIONED_NAMESPACE_DECL
+
+GroupInfoPublisherBase::GroupInfoPublisherBase()
+ : info_(new Info)
+{
+ info_->primary = false;
+}
+
+
+
+void
+GroupInfoPublisherBase::subscribe(TAO_FTEC_Become_Primary_Listener* listener)
+{
+ subscribers_.push_back(listener);
+}
+
+void GroupInfoPublisherBase::set_naming_context(CosNaming::NamingContext_var naming_context)
+{
+ naming_context_ = naming_context;
+}
+
+bool
+GroupInfoPublisherBase::is_primary() const
+{
+ return info_->primary;
+}
+
+CORBA::Object_var
+GroupInfoPublisherBase::group_reference() const
+{
+ return info_->iogr;
+}
+
+FtRtecEventChannelAdmin::EventChannel_var
+GroupInfoPublisherBase::successor() const
+{
+ return info_->successor;
+}
+
+
+
+const GroupInfoPublisherBase::BackupList&
+GroupInfoPublisherBase::backups() const
+{
+ return info_->backups;
+}
+
+
+
+GroupInfoPublisherBase::Info*
+GroupInfoPublisherBase::setup_info(const FTRT::ManagerInfoList & info_list,
+ int my_position,
+ CORBA::ULong object_group_ref_version
+ ACE_ENV_ARG_DECL)
+{
+ Info_ptr result(new Info);
+
+ result->primary = (my_position == 0);
+
+ /// create the object group
+ size_t len = info_list.length();
+
+ TAO_IOP::TAO_IOR_Manipulation::IORList iors;
+ iors.length(len);
+
+ size_t i;
+ for (i = 0; i < len; ++i) {
+ iors[i] = CORBA::Object::_duplicate(info_list[i].ior.in());
+ }
+
+ CORBA::Object_var obj =
+ IOGR_Maker::instance()->make_iogr(iors,object_group_ref_version
+ ACE_ENV_ARG_PARAMETER);
+ ACE_CHECK_RETURN(0);
+
+ result->iogr =
+ ::FtRtecEventChannelAdmin::EventChannel::_narrow(obj.in()
+ ACE_ENV_ARG_PARAMETER);
+ ACE_CHECK_RETURN(0);
+
+ ACE_DEBUG((LM_DEBUG, "In setup_info\n"));
+ //log_obj_endpoints(result->iogr.in());
+
+ /// check if sucessor changed
+ size_t successors_length = info_list.length() - my_position -1;
+
+ if (successors_length /*!= info_->backups.length() */) {
+ // successor changed, update successor
+ iors.length(successors_length);
+ for (i = 0; i < successors_length; ++i) {
+ iors[i] = CORBA::Object::_duplicate(info_list[i+ my_position+1].ior.in());
+ }
+
+ obj = IOGR_Maker::instance()->merge_iors(iors
+ ACE_ENV_ARG_PARAMETER);
+ ACE_CHECK_RETURN(0);
+
+ result->successor =
+ FtRtecEventChannelAdmin::EventChannel::_narrow(obj.in()
+ ACE_ENV_ARG_PARAMETER);
+ ACE_CHECK_RETURN(0);
+ }
+ /*
+ else {
+ result->successor = info_->successor;
+ }
+
+ if (!CORBA::is_nil(result->successor.in()))
+ {
+ CORBA::PolicyList_var pols;
+ result->successor->_validate_connection (pols.out ());
+ }
+ */
+
+ // update backups
+ result->backups.length(successors_length);
+ for (i = 0; i < successors_length; ++i) {
+ result->backups[i] =
+ FtRtecEventChannelAdmin::EventChannel::_narrow(
+ info_list[i+ my_position+1].ior.in()
+ ACE_ENV_ARG_PARAMETER);
+ //CORBA::PolicyList_var pols;
+ //result->backups[i]->_validate_connection (pols.out ());
+ ACE_CHECK_RETURN(0);
+ }
+ return result.release();
+}
+
+void
+GroupInfoPublisherBase::update_info(GroupInfoPublisherBase::Info_ptr& info)
+{
+ if (info->primary) {
+ if (!info_->primary) {
+ // now we become the primary, notify the subscribers
+ for (size_t i = 0; i < subscribers_.size(); ++i)
+ subscribers_[i]->become_primary();
+ }
+
+ if (!CORBA::is_nil(naming_context_.in())) {
+ TAO_FTRTEC::Log(1, "Registering to the Name Service\n");
+ ACE_TRY_NEW_ENV {
+ naming_context_->rebind(FTRTEC::Identification_Service::instance()->name(),
+ info->iogr.in() ACE_ENV_ARG_PARAMETER);
+ ACE_TRY_CHECK;
+ }
+ ACE_CATCHALL {
+ /// there's nothing we can do if the naming service is down
+ }
+ ACE_ENDTRY;
+ }
+ }
+ info_ = info;
+}
+
+#if defined (ACE_HAS_EXPLICIT_STATIC_TEMPLATE_MEMBER_INSTANTIATION)
+template ACE_Singleton<GroupInfoPublisherBase, ACE_Thread_Mutex> *ACE_Singleton<GroupInfoPublisherBase, ACE_Thread_Mutex>::singleton_;
+#endif /* ACE_HAS_EXPLICIT_STATIC_TEMPLATE_MEMBER_INSTANTIATION */
+
+TAO_END_VERSIONED_NAMESPACE_DECL
diff --git a/TAO/orbsvcs/orbsvcs/FtRtEvent/EventChannel/GroupInfoPublisher.h b/TAO/orbsvcs/orbsvcs/FtRtEvent/EventChannel/GroupInfoPublisher.h
new file mode 100644
index 00000000000..8268bb2dd89
--- /dev/null
+++ b/TAO/orbsvcs/orbsvcs/FtRtEvent/EventChannel/GroupInfoPublisher.h
@@ -0,0 +1,83 @@
+// -*- C++ -*-
+
+//=============================================================================
+/**
+ * @file GroupInfoPublisher.h
+ *
+ * $Id$
+ *
+ * @author Huang-Ming Huang <hh1@cse.wustl.edu>
+ */
+//=============================================================================
+
+#ifndef GROUPINFOPUBLISHER_H
+#define GROUPINFOPUBLISHER_H
+
+#include "orbsvcs/FtRtecEventChannelAdminC.h"
+#include "tao/PortableServer/PortableServer.h"
+#include "ace/Vector_T.h"
+#include "ace/Singleton.h"
+#include "ace/Synch.h"
+#include "ace/Auto_Ptr.h"
+
+#if !defined (ACE_LACKS_PRAGMA_ONCE)
+# pragma once
+#endif /* ACE_LACKS_PRAGMA_ONCE */
+
+TAO_BEGIN_VERSIONED_NAMESPACE_DECL
+
+class TAO_FTEC_Become_Primary_Listener;
+
+class GroupInfoPublisherBase
+{
+public:
+ typedef FtRtecEventChannelAdmin::EventChannelList BackupList;
+
+ struct Info {
+ bool primary;
+ CORBA::Object_var iogr;
+ FtRtecEventChannelAdmin::EventChannel_var successor;
+ BackupList backups;
+ };
+
+ typedef auto_ptr<Info> Info_ptr;
+ friend class ACE_Singleton<GroupInfoPublisherBase, ACE_SYNCH_MUTEX>;
+
+ void subscribe(TAO_FTEC_Become_Primary_Listener* listener);
+ void set_naming_context(CosNaming::NamingContext_var naming_context);
+ bool is_primary() const;
+ CORBA::Object_var group_reference() const;
+
+ FtRtecEventChannelAdmin::EventChannel_var successor() const;
+
+ const BackupList& backups() const;
+
+ Info* setup_info(const FTRT::ManagerInfoList & info_list,
+ int my_position,
+ CORBA::ULong object_group_ref_version
+ ACE_ENV_ARG_DECL);
+
+ void update_info(Info_ptr& info);
+
+ const PortableServer::ObjectId& object_id() const;
+ const CosNaming::Name& name() const;
+
+ void object_id(const char* oid);
+ void name(const char* nam);
+
+private:
+ GroupInfoPublisherBase();
+
+ CosNaming::NamingContext_var naming_context_;
+ typedef ACE_Vector<TAO_FTEC_Become_Primary_Listener*, 2> Subscribers;
+ Subscribers subscribers_;
+ PortableServer::ObjectId object_id_;
+ CosNaming::Name name_;
+ Info_ptr info_;
+};
+
+typedef ACE_Singleton<GroupInfoPublisherBase, ACE_SYNCH_MUTEX> GroupInfoPublisher;
+
+TAO_END_VERSIONED_NAMESPACE_DECL
+
+#endif
diff --git a/TAO/orbsvcs/orbsvcs/FtRtEvent/EventChannel/IOGR_Maker.cpp b/TAO/orbsvcs/orbsvcs/FtRtEvent/EventChannel/IOGR_Maker.cpp
new file mode 100644
index 00000000000..e64501e5e18
--- /dev/null
+++ b/TAO/orbsvcs/orbsvcs/FtRtEvent/EventChannel/IOGR_Maker.cpp
@@ -0,0 +1,269 @@
+// $Id$
+
+#include "orbsvcs/FtRtEvent/EventChannel/IOGR_Maker.h"
+#include "tao/MProfile.h"
+#include "tao/Profile.h"
+#include "tao/Stub.h"
+#include "tao/ORB_Core.h"
+#include "tao/Object_KeyC.h"
+#include "tao/Tagged_Components.h"
+#include "../Utils/resolve_init.h"
+#include "../Utils/Safe_InputCDR.h"
+#include "orbsvcs/FaultTolerance/FT_IOGR_Property.h"
+#include "orbsvcs/FtRtEvent/EventChannel/GroupInfoPublisher.h"
+
+ACE_RCSID (EventChannel,
+ IOGR_Maker,
+ "$Id$")
+
+static IOGR_Maker* maker;
+
+TAO_BEGIN_VERSIONED_NAMESPACE_DECL
+
+IOGR_Maker::IOGR_Maker()
+{
+}
+
+void
+IOGR_Maker::init(CORBA::ORB_ptr orb
+ ACE_ENV_ARG_DECL)
+{
+ iorm_ = resolve_init<TAO_IOP::TAO_IOR_Manipulation>(orb,
+ TAO_OBJID_IORMANIPULATION
+ ACE_ENV_ARG_PARAMETER);
+ ft_tag_component_.group_domain_id = "ft_eventchannel";
+ ft_tag_component_.object_group_id = 0;
+ ft_tag_component_.object_group_ref_version = 0;
+ maker = this;
+}
+
+
+IOGR_Maker*
+IOGR_Maker::instance()
+{
+ return maker;
+}
+
+CORBA::Object_ptr
+IOGR_Maker::merge_iors(const TAO_IOP::TAO_IOR_Manipulation::IORList& list
+ ACE_ENV_ARG_DECL)
+{
+ CORBA::Object_var obj;
+ if (list.length() != 1)
+ obj = iorm_->merge_iors(list ACE_ENV_ARG_PARAMETER);
+ else
+ obj = CORBA::Object::_duplicate(list[0]);
+ return obj._retn();
+}
+
+
+CORBA::Object_ptr
+IOGR_Maker::make_iogr(const TAO_IOP::TAO_IOR_Manipulation::IORList& list,
+ CORBA::ULong object_group_ref_version
+ ACE_ENV_ARG_DECL)
+{
+ /// generate a new IOGR if the object group changes.
+ CORBA::Object_var obj = merge_iors(list ACE_ENV_ARG_PARAMETER);
+ ACE_CHECK_RETURN(CORBA::Object::_nil());
+
+ FT::TagFTGroupTaggedComponent ft_tag_component(ft_tag_component_);
+ /// the generated IOGR should use a new object_group_ref_version
+ ft_tag_component.object_group_ref_version = object_group_ref_version;
+ set_tag_components(obj.in(), list[0], ft_tag_component
+ ACE_ENV_ARG_PARAMETER);
+
+ ACE_CHECK_RETURN(CORBA::Object::_nil());
+ return obj._retn();
+}
+
+void replace_key(char* ior, char* end_ior,
+ const TAO::ObjectKey& oldkey,
+ const TAO::ObjectKey& newkey);
+/// the definition of replace_key() is moved
+/// to replace_key.cpp.
+
+
+CORBA::Object_ptr
+IOGR_Maker::forge_iogr(CORBA::Object_ptr obj
+ ACE_ENV_ARG_DECL)
+{
+ /// forge an IOGR whose object_key is the same with that of \a obj.
+ CORBA::Object_var merged;
+ // make a copy of the object
+ FtRtecEventChannelAdmin::EventChannel_var successor
+ = GroupInfoPublisher::instance()->successor();
+ if (! CORBA::is_nil(successor.in())) {
+ TAO::ObjectKey_var newkey = obj->_key(ACE_ENV_SINGLE_ARG_PARAMETER);
+
+ CORBA::Object_var new_base = ior_replace_key(successor.in(), newkey.in()
+ ACE_ENV_ARG_PARAMETER);
+ ACE_CHECK_RETURN(CORBA::Object::_nil());
+
+ if (CORBA::is_nil( new_base.in() ))
+ return CORBA::Object::_nil();
+
+ TAO_MProfile& base_profiles = new_base->_stubobj ()->base_profiles ();
+
+ TAO_ORB_Core *orb_core = TAO_ORB_Core_instance ();
+
+ TAO_Stub *stub = orb_core->create_stub (CORBA::string_dup(obj->_stubobj ()->type_id.in ()), // give the id string
+ base_profiles
+ ACE_ENV_ARG_PARAMETER);
+ ACE_CHECK_RETURN (CORBA::Object::_nil ());
+
+ // Make the stub memory allocation exception safe for the duration
+ // of this method.
+ TAO_Stub_Auto_Ptr safe_stub (stub);
+
+ // Create the CORBA level proxy
+ CORBA::Object_ptr temp_obj = CORBA::Object::_nil ();
+ ACE_NEW_THROW_EX (temp_obj,
+ CORBA::Object (safe_stub.get ()),
+ CORBA::NO_MEMORY ());
+
+ // Release ownership of the pointers protected by the auto_ptrs since they
+ // no longer need to be protected by this point.
+ stub = safe_stub.release ();
+
+
+ merged =
+ iorm_->add_profiles(obj, temp_obj
+ ACE_ENV_ARG_PARAMETER);
+ ACE_CHECK_RETURN (CORBA::Object::_nil ());
+ }
+ else
+ merged = CORBA::Object::_duplicate(obj);
+
+ set_tag_components(merged.in(), obj, ft_tag_component_
+ ACE_ENV_ARG_PARAMETER);
+
+ ACE_CHECK_RETURN(CORBA::Object::_nil ());
+
+ return merged._retn();
+}
+
+CORBA::Object_ptr
+IOGR_Maker::ior_replace_key(CORBA::Object_ptr obj,
+ const TAO::ObjectKey& key
+ ACE_ENV_ARG_DECL)
+{
+ TAO_OutputCDR out_cdr;
+ if (!(out_cdr << obj))
+ return CORBA::Object::_nil();
+
+ ACE_Message_Block mb;
+
+ ACE_CDR::consolidate(&mb, out_cdr.begin());
+
+ TAO::ObjectKey_var old_key = obj->_key(ACE_ENV_SINGLE_ARG_PARAMETER);
+ ACE_CHECK_RETURN(CORBA::Object::_nil ());
+
+ replace_key(mb.base(), mb.end(),
+ old_key.in(), key);
+
+ CORBA::Object_var new_obj;
+ TAO_InputCDR in_cdr(&mb);
+ if (!(in_cdr >> new_obj))
+ return CORBA::Object::_nil();
+ return new_obj._retn();
+}
+
+bool
+IOGR_Maker::copy_ft_group_component(CORBA::Object_ptr ior)
+{
+ // Get the MProfile
+ TAO_MProfile &mprofile =
+ ior->_stubobj ()->base_profiles ();
+
+ // Looking for a tagged component with a GROUP flag.
+ IOP::TaggedComponent tagged_components;
+ tagged_components.tag = IOP::TAG_FT_GROUP;
+
+ if (mprofile.profile_count () > 0)
+ {
+ // Get the Tagged Components
+ const TAO_Tagged_Components &pfile_tagged =
+ mprofile.get_profile (0)->tagged_components ();
+
+ if (pfile_tagged.get_component (tagged_components) == 1)
+ {
+
+ // Grab the object group version
+ // @@ NOTE: This involves an allocation and a dellocation. This is
+ // really bad.
+ Safe_InputCDR cdr (
+ reinterpret_cast<const char*> (tagged_components.component_data.get_buffer ()),
+ tagged_components.component_data.length ());
+ CORBA::Boolean byte_order;
+
+ if ((cdr >> ACE_InputCDR::to_boolean (byte_order)) == 0)
+ return false;
+
+ cdr.reset_byte_order (static_cast<int> (byte_order));
+
+ return (cdr >> ft_tag_component_) != 0;
+ }
+ }
+
+ return false;
+}
+
+void
+IOGR_Maker::set_ft_domain_id(const char* domain_id)
+{
+ ft_tag_component_.group_domain_id = domain_id;
+}
+
+void
+IOGR_Maker::set_group_id(CORBA::ULongLong id)
+{
+ ft_tag_component_.object_group_id = id;
+}
+
+void
+IOGR_Maker::set_ref_version(CORBA::ULong version)
+{
+ ft_tag_component_.object_group_ref_version = version;
+}
+
+CORBA::ULong
+IOGR_Maker::increment_ref_version()
+{
+ ACE_DEBUG((LM_DEBUG, "new object_group_ref_version = %d\n", ft_tag_component_. object_group_ref_version+1));
+ return ++ft_tag_component_.object_group_ref_version;
+}
+
+CORBA::ULong
+IOGR_Maker::get_ref_version() const
+{
+ return ft_tag_component_.object_group_ref_version;
+}
+
+
+void
+IOGR_Maker::set_tag_components(
+ CORBA::Object_ptr merged,
+ CORBA::Object_ptr primary,
+ FT::TagFTGroupTaggedComponent& ft_tag_component
+ ACE_ENV_ARG_DECL)
+{
+ // set the primary
+ TAO_FT_IOGR_Property prop (ft_tag_component);
+
+
+ prop.remove_primary_tag(merged
+ ACE_ENV_ARG_PARAMETER);
+ ACE_CHECK;
+
+ iorm_->set_primary (&prop, merged, primary
+ ACE_ENV_ARG_PARAMETER);
+ ACE_CHECK;
+ // Set the property
+ iorm_->set_property (&prop,
+ merged
+ ACE_ENV_ARG_PARAMETER);
+
+
+}
+
+TAO_END_VERSIONED_NAMESPACE_DECL
diff --git a/TAO/orbsvcs/orbsvcs/FtRtEvent/EventChannel/IOGR_Maker.h b/TAO/orbsvcs/orbsvcs/FtRtEvent/EventChannel/IOGR_Maker.h
new file mode 100644
index 00000000000..cbc933a61c8
--- /dev/null
+++ b/TAO/orbsvcs/orbsvcs/FtRtEvent/EventChannel/IOGR_Maker.h
@@ -0,0 +1,75 @@
+// -*- C++ -*-
+
+//=============================================================================
+/**
+ * @file IOGR_Maker.h
+ *
+ * $Id$
+ *
+ * @author Huang-Ming Huang <hh1@cse.wustl.edu>
+ */
+//=============================================================================
+
+#ifndef IOGR_MAKER_H
+#define IOGR_MAKER_H
+
+#include "orbsvcs/FT_CORBA_ORBC.h"
+#include "tao/IORManipulation/IORManipulation.h"
+
+#if !defined (ACE_LACKS_PRAGMA_ONCE)
+# pragma once
+#endif /* ACE_LACKS_PRAGMA_ONCE */
+
+TAO_BEGIN_VERSIONED_NAMESPACE_DECL
+
+class IOGR_Maker
+{
+public:
+ IOGR_Maker();
+
+ void init(CORBA::ORB_ptr orb
+ ACE_ENV_ARG_DECL);
+
+ /// instance() will only return a valid object after an
+ /// instance is explicitly created by client and init() is called.
+ static IOGR_Maker* instance();
+
+ /// Create a new object reference by merging the profiles lists in the
+ /// supplied list of one or more object references.
+ CORBA::Object_ptr merge_iors(const TAO_IOP::TAO_IOR_Manipulation::IORList&
+ ACE_ENV_ARG_DECL);
+
+ /// Create a new IOGR (with FT_PRIMARY and FT_GROUP components) by merging
+ /// the profiles lists in the supplied list of one or more object references.
+ CORBA::Object_ptr make_iogr(const TAO_IOP::TAO_IOR_Manipulation::IORList&,
+ CORBA::ULong object_group_ref_version
+ ACE_ENV_ARG_DECL);
+
+ /// Make an new IOGR with obj as primary.
+ CORBA::Object_ptr forge_iogr(CORBA::Object_ptr obj
+ ACE_ENV_ARG_DECL);
+
+ CORBA::Object_ptr ior_replace_key(CORBA::Object_ptr obj,
+ const TAO::ObjectKey& key
+ ACE_ENV_ARG_DECL);
+
+ bool copy_ft_group_component(CORBA::Object_ptr obj);
+
+ void set_ft_domain_id(const char*);
+ void set_group_id(CORBA::ULongLong);
+ void set_ref_version(CORBA::ULong);
+ CORBA::ULong increment_ref_version();
+ CORBA::ULong get_ref_version() const;
+
+private:
+ void set_tag_components(CORBA::Object_ptr merged,
+ CORBA::Object_ptr primary,
+ FT::TagFTGroupTaggedComponent& ft_tag_component
+ ACE_ENV_ARG_DECL);
+ TAO_IOP::TAO_IOR_Manipulation_var iorm_;
+ FT::TagFTGroupTaggedComponent ft_tag_component_;
+};
+
+TAO_END_VERSIONED_NAMESPACE_DECL
+
+#endif
diff --git a/TAO/orbsvcs/orbsvcs/FtRtEvent/EventChannel/Identification_Service.cpp b/TAO/orbsvcs/orbsvcs/FtRtEvent/EventChannel/Identification_Service.cpp
new file mode 100644
index 00000000000..7b356e36f4d
--- /dev/null
+++ b/TAO/orbsvcs/orbsvcs/FtRtEvent/EventChannel/Identification_Service.cpp
@@ -0,0 +1,100 @@
+// $Id$
+
+#include "orbsvcs/FtRtEvent/EventChannel/Identification_Service.h"
+#include "../Utils/UUID.h"
+
+ACE_RCSID (EventChannel,
+ Identification_Service,
+ "$Id$")
+
+
+TAO_BEGIN_VERSIONED_NAMESPACE_DECL
+
+namespace FTRTEC {
+
+ namespace {
+ Identification_Service* service;
+ const char oid[] = "\xF8\xB3\xB1\xFE\xAC\xC6\x07\x11\x02\x0C\x02\x50\xEB\x05\x77\xD0";
+ }
+
+ Identification_Service::Identification_Service()
+ {
+ }
+
+ Identification_Service::~Identification_Service()
+ {
+ }
+
+
+ Identification_Service* Identification_Service::instance()
+ {
+ return service;
+ }
+
+ int Identification_Service::init(int argc, ACE_TCHAR* argv[])
+ {
+ if (service != 0)
+ return 0;
+ name_.length(1);
+ name_[0].id = CORBA::string_dup("FT_EventService");
+
+ while (argc > 1) {
+ if ( ACE_OS::strcasecmp (argv[0], ACE_TEXT("-Object_ID")) == 0) {
+ --argc; ++argv;
+ if (argv[0][0] == '-') continue;
+ else if (argv[0][0] != '$') {
+ UUID uuid(argv[0]);
+ if (!uuid.is_valid())
+ ACE_ERROR_RETURN((LM_ERROR, "Invalid Object_ID\n"), -1);
+ object_id_.length(16);
+ uuid.to_binary(&object_id_[0]);
+ }
+ --argc; ++argv;
+ }
+ else if (ACE_OS::strcasecmp (argv[0], ACE_TEXT("-Name")) ==0) {
+ --argc; ++argv;
+ if (argv[0][0] == '-') continue;
+ else if (argv[0][0] != '$') {
+ name_[0].id = CORBA::string_dup(argv[0]);
+ }
+ --argc; ++argv;
+ }
+ }
+
+ if (object_id_.length() == 0) {
+ // assign an default value for object id
+ object_id_.length(16);
+ memcpy(&object_id_[0], oid, 16);
+ }
+ service = this;
+ return 0;
+ }
+
+
+ const FtRtecEventComm::ObjectId& Identification_Service::object_id() const
+ {
+ return object_id_;
+ }
+
+
+ const CosNaming::Name& Identification_Service::name() const
+ {
+ return name_;
+ }
+}
+
+TAO_END_VERSIONED_NAMESPACE_DECL
+
+ACE_FACTORY_NAMESPACE_DEFINE (
+ TAO_FTRTEC,
+ Identification_Service,
+ FTRTEC::Identification_Service)
+
+ACE_STATIC_SVC_DEFINE (
+ Identification_Service,
+ ACE_TEXT ("FTRTEC_Identification"),
+ ACE_SVC_OBJ_T,
+ &ACE_SVC_NAME (Identification_Service),
+ ACE_Service_Type::DELETE_THIS
+ | ACE_Service_Type::DELETE_OBJ,
+ 0)
diff --git a/TAO/orbsvcs/orbsvcs/FtRtEvent/EventChannel/Identification_Service.h b/TAO/orbsvcs/orbsvcs/FtRtEvent/EventChannel/Identification_Service.h
new file mode 100644
index 00000000000..a932c92b789
--- /dev/null
+++ b/TAO/orbsvcs/orbsvcs/FtRtEvent/EventChannel/Identification_Service.h
@@ -0,0 +1,57 @@
+// -*- C++ -*-
+
+//=============================================================================
+/**
+ * @file Identification_Service.h
+ *
+ * $Id$
+ *
+ * @author Huang-Ming Huang <hh1@cse.wustl.edu>
+ */
+//=============================================================================
+
+#ifndef IDENTIFICATION_SERVICE_H
+#define IDENTIFICATION_SERVICE_H
+
+#include "ace/Service_Object.h"
+#include "orbsvcs/CosNamingC.h"
+#include "orbsvcs/FTRTC.h"
+#include "orbsvcs/FtRtecEventCommC.h"
+#include "orbsvcs/FtRtEvent/EventChannel/ftrtec_export.h"
+
+#if !defined (ACE_LACKS_PRAGMA_ONCE)
+# pragma once
+#endif /* ACE_LACKS_PRAGMA_ONCE */
+
+TAO_BEGIN_VERSIONED_NAMESPACE_DECL
+
+namespace FTRTEC
+{
+ class Identification_Service : public ACE_Service_Object
+ {
+ public:
+ Identification_Service();
+ ~Identification_Service();
+
+ /**
+ * This function returns 0 when init is not called yet.
+ */
+ static Identification_Service* instance();
+
+ int init(int argc, ACE_TCHAR* argv[]);
+
+ const FtRtecEventComm::ObjectId& object_id() const;
+ const CosNaming::Name& name() const;
+ private:
+ FtRtecEventComm::ObjectId object_id_;
+ CosNaming::Name name_;
+ };
+}
+
+TAO_END_VERSIONED_NAMESPACE_DECL
+
+ACE_STATIC_SVC_DECLARE_EXPORT (TAO_FTRTEC, Identification_Service)
+ACE_STATIC_SVC_REQUIRE(Identification_Service)
+ACE_FACTORY_DECLARE (TAO_FTRTEC, Identification_Service)
+
+#endif
diff --git a/TAO/orbsvcs/orbsvcs/FtRtEvent/EventChannel/ObjectGroupManagerHandler.cpp b/TAO/orbsvcs/orbsvcs/FtRtEvent/EventChannel/ObjectGroupManagerHandler.cpp
new file mode 100644
index 00000000000..fbb8c4166a4
--- /dev/null
+++ b/TAO/orbsvcs/orbsvcs/FtRtEvent/EventChannel/ObjectGroupManagerHandler.cpp
@@ -0,0 +1,71 @@
+// $Id$
+#include "orbsvcs/FtRtEvent/EventChannel/ObjectGroupManagerHandler.h"
+
+TAO_BEGIN_VERSIONED_NAMESPACE_DECL
+
+ObjectGroupManagerHandler::ObjectGroupManagerHandler(
+ ACE_Auto_Event& evt, int num_backups)
+: evt_(evt), num_backups_(num_backups)
+{
+}
+
+void
+ObjectGroupManagerHandler::start (CORBA::Boolean ami_return_val,
+ const FTRT::Location & the_location
+ ACE_ENV_ARG_DECL_NOT_USED)
+ ACE_THROW_SPEC ((CORBA::SystemException))
+{
+ ACE_UNUSED_ARG(ami_return_val);
+ ACE_UNUSED_ARG(the_location);
+}
+
+void
+ObjectGroupManagerHandler::start_excep (::Messaging::ExceptionHolder *
+ ACE_ENV_ARG_DECL_NOT_USED)
+ ACE_THROW_SPEC ((CORBA::SystemException))
+{
+}
+
+void ObjectGroupManagerHandler::create_group (ACE_ENV_SINGLE_ARG_DECL_NOT_USED)
+ ACE_THROW_SPEC ((CORBA::SystemException))
+{
+}
+
+
+void
+ObjectGroupManagerHandler::create_group_excep (::Messaging::ExceptionHolder *
+ ACE_ENV_ARG_DECL_NOT_USED)
+ ACE_THROW_SPEC ((CORBA::SystemException))
+{
+}
+
+void
+ObjectGroupManagerHandler::add_member (ACE_ENV_SINGLE_ARG_DECL_NOT_USED)
+ ACE_THROW_SPEC ((CORBA::SystemException))
+{
+ if (--num_backups_ ==0)
+ evt_.signal();
+}
+
+void
+ObjectGroupManagerHandler::add_member_excep (::Messaging::ExceptionHolder *
+ ACE_ENV_ARG_DECL)
+ ACE_THROW_SPEC ((CORBA::SystemException))
+{
+ this->add_member(ACE_ENV_SINGLE_ARG_PARAMETER);
+}
+
+void
+ObjectGroupManagerHandler::set_state (ACE_ENV_SINGLE_ARG_DECL_NOT_USED)
+ ACE_THROW_SPEC ((CORBA::SystemException))
+{
+}
+
+void
+ObjectGroupManagerHandler::set_state_excep (::Messaging::ExceptionHolder *
+ ACE_ENV_ARG_DECL_NOT_USED)
+ ACE_THROW_SPEC ((CORBA::SystemException))
+{
+}
+
+TAO_END_VERSIONED_NAMESPACE_DECL
diff --git a/TAO/orbsvcs/orbsvcs/FtRtEvent/EventChannel/ObjectGroupManagerHandler.h b/TAO/orbsvcs/orbsvcs/FtRtEvent/EventChannel/ObjectGroupManagerHandler.h
new file mode 100644
index 00000000000..8a3938a6c65
--- /dev/null
+++ b/TAO/orbsvcs/orbsvcs/FtRtEvent/EventChannel/ObjectGroupManagerHandler.h
@@ -0,0 +1,61 @@
+// -*- C++ -*-
+
+//=============================================================================
+/**
+ * @file ObjectGroupManagerHandler.h
+ *
+ * $Id$
+ *
+ * @author Huang-Ming Huang <hh1@cse.wustl.edu>
+ */
+//=============================================================================
+#ifndef OBJECTGROUPMANAGERHANDLER_H
+#define OBJECTGROUPMANAGERHANDLER_H
+
+#include "orbsvcs/FTRT_GroupManagerS.h"
+#include "ace/Auto_Event.h"
+
+TAO_BEGIN_VERSIONED_NAMESPACE_DECL
+
+class ObjectGroupManagerHandler
+ : public POA_FTRT::AMI_ObjectGroupManagerHandler
+{
+public:
+ ObjectGroupManagerHandler(ACE_Auto_Event& evt, int num_backups);
+ virtual void start (CORBA::Boolean ami_return_val,
+ const FTRT::Location & the_location
+ ACE_ENV_ARG_DECL)
+ ACE_THROW_SPEC ((CORBA::SystemException));
+
+ virtual void start_excep (::Messaging::ExceptionHolder * excep_holder
+ ACE_ENV_ARG_DECL)
+ ACE_THROW_SPEC ((CORBA::SystemException));
+
+ virtual void create_group (ACE_ENV_SINGLE_ARG_DECL)
+ ACE_THROW_SPEC ((CORBA::SystemException));
+
+ virtual void create_group_excep (::Messaging::ExceptionHolder * excep_holder
+ ACE_ENV_ARG_DECL)
+ ACE_THROW_SPEC ((CORBA::SystemException));
+
+ virtual void add_member (ACE_ENV_SINGLE_ARG_DECL)
+ ACE_THROW_SPEC ((CORBA::SystemException));
+
+ virtual void add_member_excep (::Messaging::ExceptionHolder * excep_holder
+ ACE_ENV_ARG_DECL)
+ ACE_THROW_SPEC ((CORBA::SystemException));
+
+ virtual void set_state (ACE_ENV_SINGLE_ARG_DECL)
+ ACE_THROW_SPEC ((CORBA::SystemException));
+
+ virtual void set_state_excep (::Messaging::ExceptionHolder * excep_holder
+ ACE_ENV_ARG_DECL)
+ ACE_THROW_SPEC ((CORBA::SystemException));
+private:
+ ACE_Auto_Event& evt_;
+ ACE_Atomic_Op< ACE_SYNCH_MUTEX, int > num_backups_;
+};
+
+TAO_END_VERSIONED_NAMESPACE_DECL
+
+#endif
diff --git a/TAO/orbsvcs/orbsvcs/FtRtEvent/EventChannel/ProxyConsumerStateWorker.cpp b/TAO/orbsvcs/orbsvcs/FtRtEvent/EventChannel/ProxyConsumerStateWorker.cpp
new file mode 100644
index 00000000000..8708b6a33d7
--- /dev/null
+++ b/TAO/orbsvcs/orbsvcs/FtRtEvent/EventChannel/ProxyConsumerStateWorker.cpp
@@ -0,0 +1,36 @@
+// $Id$
+
+#include "orbsvcs/FtRtEvent/EventChannel/ProxyConsumerStateWorker.h"
+#include "orbsvcs/Event/EC_Event_Channel_Base.h"
+#include "orbsvcs/Event/EC_ProxySupplier.h"
+
+ACE_RCSID (EventChannel,
+ ProxyConsumerStateWorker,
+ "$Id$")
+
+TAO_BEGIN_VERSIONED_NAMESPACE_DECL
+
+ProxyConsumerStateWorker::ProxyConsumerStateWorker (
+ FtRtecEventChannelAdmin::ProxyConsumerStates& states)
+ : consumerStates_(states)
+{
+}
+
+ProxyConsumerStateWorker::~ProxyConsumerStateWorker()
+{
+}
+
+void ProxyConsumerStateWorker::set_size(size_t size)
+{
+ consumerStates_.length(size);
+ index_ = 0;
+}
+
+void ProxyConsumerStateWorker::work(TAO_EC_ProxyPushConsumer* object
+ ACE_ENV_ARG_DECL_NOT_USED)
+{
+ TAO_FTEC_ProxyPushConsumer* proxy =
+ static_cast<TAO_FTEC_ProxyPushConsumer*> (object);
+ proxy->get_state(consumerStates_[index_++]);
+
+TAO_END_VERSIONED_NAMESPACE_DECL}
diff --git a/TAO/orbsvcs/orbsvcs/FtRtEvent/EventChannel/ProxyConsumerStateWorker.h b/TAO/orbsvcs/orbsvcs/FtRtEvent/EventChannel/ProxyConsumerStateWorker.h
new file mode 100644
index 00000000000..1610cd90ef1
--- /dev/null
+++ b/TAO/orbsvcs/orbsvcs/FtRtEvent/EventChannel/ProxyConsumerStateWorker.h
@@ -0,0 +1,43 @@
+// -*- C++ -*-
+
+//=============================================================================
+/**
+ * @file ProxyConsumerStateWorker.h
+ *
+ * $Id$
+ *
+ * @author Huang-Ming Huang <hh1@cse.wustl.edu>
+ */
+//=============================================================================
+
+#ifndef PROXYCONSUMERSTATEWORKER_H
+#define PROXYCONSUMERSTATEWORKER_H
+
+#include "orbsvcs/Event/EC_SupplierAdmin.h"
+#include "orbsvcs/ESF/ESF_Worker.h"
+#include "orbsvcs/FtRtEvent/EventChannel/FTEC_ProxyConsumer.h"
+
+#if !defined (ACE_LACKS_PRAGMA_ONCE)
+# pragma once
+#endif /* ACE_LACKS_PRAGMA_ONCE */
+
+TAO_BEGIN_VERSIONED_NAMESPACE_DECL
+
+class ProxyConsumerStateWorker
+ : public TAO_ESF_Worker<TAO_EC_ProxyPushConsumer>
+{
+public:
+ ProxyConsumerStateWorker(FtRtecEventChannelAdmin::ProxyConsumerStates& states);
+ ~ProxyConsumerStateWorker();
+
+ virtual void set_size(size_t size);
+ virtual void work(TAO_EC_ProxyPushConsumer* object
+ ACE_ENV_ARG_DECL);
+private:
+ int index_;
+ FtRtecEventChannelAdmin::ProxyConsumerStates& consumerStates_;
+};
+
+TAO_END_VERSIONED_NAMESPACE_DECL
+
+#endif
diff --git a/TAO/orbsvcs/orbsvcs/FtRtEvent/EventChannel/ProxySupplierStateWorker.cpp b/TAO/orbsvcs/orbsvcs/FtRtEvent/EventChannel/ProxySupplierStateWorker.cpp
new file mode 100644
index 00000000000..5618c2d373f
--- /dev/null
+++ b/TAO/orbsvcs/orbsvcs/FtRtEvent/EventChannel/ProxySupplierStateWorker.cpp
@@ -0,0 +1,38 @@
+// $Id$
+
+#include "orbsvcs/FtRtecEventChannelAdminC.h"
+#include "orbsvcs/FtRtEvent/EventChannel/ProxySupplierStateWorker.h"
+#include "orbsvcs/Event/EC_Event_Channel_Base.h"
+#include "orbsvcs/Event/EC_ProxyConsumer.h"
+
+ACE_RCSID (EventChannel,
+ ProxySupplierStateWorker,
+ "$Id$")
+
+TAO_BEGIN_VERSIONED_NAMESPACE_DECL
+
+ProxySupplierStateWorker::ProxySupplierStateWorker (
+ FtRtecEventChannelAdmin::ProxySupplierStates& states)
+ : supplierStates_(states)
+{
+}
+
+ProxySupplierStateWorker::~ProxySupplierStateWorker()
+{
+}
+
+void ProxySupplierStateWorker::set_size(size_t size)
+{
+ supplierStates_.length(size);
+ index_ = 0;
+}
+
+void ProxySupplierStateWorker::work(TAO_EC_ProxyPushSupplier* object
+ ACE_ENV_ARG_DECL_NOT_USED)
+{
+ TAO_FTEC_ProxyPushSupplier* proxy =
+ static_cast<TAO_FTEC_ProxyPushSupplier*> (object);
+ proxy->get_state(supplierStates_[index_++]);
+}
+
+TAO_END_VERSIONED_NAMESPACE_DECL
diff --git a/TAO/orbsvcs/orbsvcs/FtRtEvent/EventChannel/ProxySupplierStateWorker.h b/TAO/orbsvcs/orbsvcs/FtRtEvent/EventChannel/ProxySupplierStateWorker.h
new file mode 100644
index 00000000000..cf9516d100d
--- /dev/null
+++ b/TAO/orbsvcs/orbsvcs/FtRtEvent/EventChannel/ProxySupplierStateWorker.h
@@ -0,0 +1,43 @@
+// -*- C++ -*-
+
+//=============================================================================
+/**
+ * @file ProxySupplierStateWorker.h
+ *
+ * $Id$
+ *
+ * @author Huang-Ming Huang <hh1@cse.wustl.edu>
+ */
+//=============================================================================
+
+#ifndef PROXYSUPPLIERSTATEWORKER_H
+#define PROXYSUPPLIERSTATEWORKER_H
+
+#include "orbsvcs/Event/EC_ConsumerAdmin.h"
+#include "orbsvcs/ESF/ESF_Worker.h"
+#include "orbsvcs/FtRtEvent/EventChannel/FTEC_ProxySupplier.h"
+
+#if !defined (ACE_LACKS_PRAGMA_ONCE)
+# pragma once
+#endif /* ACE_LACKS_PRAGMA_ONCE */
+
+TAO_BEGIN_VERSIONED_NAMESPACE_DECL
+
+class ProxySupplierStateWorker
+ : public TAO_ESF_Worker<TAO_EC_ProxyPushSupplier>
+{
+public:
+ ProxySupplierStateWorker(FtRtecEventChannelAdmin::ProxySupplierStates& states);
+ ~ProxySupplierStateWorker();
+
+ virtual void set_size(size_t size);
+ virtual void work(TAO_EC_ProxyPushSupplier* object
+ ACE_ENV_ARG_DECL);
+private:
+ int index_;
+ FtRtecEventChannelAdmin::ProxySupplierStates& supplierStates_;
+};
+
+TAO_END_VERSIONED_NAMESPACE_DECL
+
+#endif
diff --git a/TAO/orbsvcs/orbsvcs/FtRtEvent/EventChannel/Replication_Service.cpp b/TAO/orbsvcs/orbsvcs/FtRtEvent/EventChannel/Replication_Service.cpp
new file mode 100644
index 00000000000..753cd359248
--- /dev/null
+++ b/TAO/orbsvcs/orbsvcs/FtRtEvent/EventChannel/Replication_Service.cpp
@@ -0,0 +1,210 @@
+// $Id$
+
+#include "orbsvcs/FtRtEvent/EventChannel/Replication_Service.h"
+#include "orbsvcs/FtRtEvent/EventChannel/AMI_Replication_Strategy.h"
+#include "orbsvcs/FtRtEvent/EventChannel/Basic_Replication_Strategy.h"
+#include "orbsvcs/FtRtEvent/EventChannel/FTEC_ORBInitializer.h"
+#include "../Utils/Log.h"
+
+#include "tao/ORBInitializer_Registry.h"
+#include "tao/CDR.h"
+
+#include "ace/Auto_Ptr.h"
+#include "ace/OS_NS_strings.h"
+
+
+ACE_RCSID (EventChannel,
+ Replication_Service,
+ "$Id$")
+
+TAO_BEGIN_VERSIONED_NAMESPACE_DECL
+
+namespace FTRTEC
+{
+ namespace {
+ auto_ptr<Replication_Strategy> replication_strategy;
+ int threads = 1;
+ Replication_Service* service;
+ }
+
+ Replication_Service* Replication_Service::instance()
+ {
+ return service;
+ }
+
+ Replication_Service::Replication_Service()
+ {
+ service = this;
+ }
+
+ Replication_Service::~Replication_Service()
+ {
+ }
+
+ int Replication_Service::init (int argc, ACE_TCHAR* argv[])
+ {
+ static int initialized = 0;
+
+ // Only allow initialization once.
+ if (initialized)
+ return 0;
+
+ initialized = 1;
+ bool ami = false;
+
+ // Parse any service configurator parameters.
+ while (argc > 0) {
+ if (ACE_OS::strcasecmp (argv[0], ACE_TEXT("AMI")) ==0 )
+ ami = true;
+ if (ACE_OS::strcasecmp (argv[0], ACE_TEXT("-threads")) ==0 && argc > 1) {
+ FTRTEC::threads = ACE_OS::atoi(argv[1]);
+ if (FTRTEC::threads ==0 )
+ FTRTEC::threads = 1;
+ ++argv; --argc;
+ }
+ ++argv; --argc;
+ }
+
+ Replication_Strategy* strategy;
+ if (ami) {
+ ACE_NEW_RETURN (strategy, AMI_Replication_Strategy(threads() > 1), -1);
+ TAO_FTRTEC::Log(3, "AMI replication strategy\n");
+ }
+ else {
+ ACE_NEW_RETURN (strategy, Basic_Replication_Strategy(threads() > 1), -1);
+ TAO_FTRTEC::Log(3, "Basic replication strategy\n");
+ }
+
+ ACE_AUTO_PTR_RESET (replication_strategy, strategy, Replication_Strategy);
+
+ ACE_TRY_NEW_ENV
+ {
+ PortableInterceptor::ORBInitializer_ptr temp_orb_initializer =
+ PortableInterceptor::ORBInitializer::_nil ();
+ PortableInterceptor::ORBInitializer_var orb_initializer;
+
+ /// Register the RTCORBA ORBInitializer.
+ ACE_NEW_THROW_EX (temp_orb_initializer,
+ FTEC_ORBInitializer,
+ CORBA::NO_MEMORY ());
+ ACE_TRY_CHECK;
+ orb_initializer = temp_orb_initializer;
+
+ PortableInterceptor::register_orb_initializer (orb_initializer.in ()
+ ACE_ENV_ARG_PARAMETER);
+ ACE_TRY_CHECK;
+ }
+ ACE_CATCHANY
+ {
+ ACE_PRINT_EXCEPTION (ACE_ANY_EXCEPTION,
+ "Unexpected exception caught while "
+ "initializing the TransactionDepth");
+ return -1;
+ }
+ ACE_ENDTRY;
+ return 0;
+ }
+
+
+ void Replication_Service::become_primary()
+ {
+ TAO_FTRTEC::Log(3, "become_primary\n");
+
+ Replication_Strategy* strategy =
+ replication_strategy->make_primary_strategy();
+
+ ACE_ASSERT(strategy);
+
+ if (replication_strategy.get() != strategy) {
+ ACE_AUTO_PTR_RESET(replication_strategy, strategy, Replication_Strategy);
+ }
+ }
+
+ void Replication_Service::check_validity(ACE_ENV_SINGLE_ARG_DECL)
+ {
+ replication_strategy->check_validity(ACE_ENV_SINGLE_ARG_PARAMETER);
+ }
+
+
+ void Replication_Service::replicate_request(const FtRtecEventChannelAdmin::Operation& update,
+ RollbackOperation rollback
+ ACE_ENV_ARG_DECL)
+ {
+ TAO_OutputCDR cdr;
+ cdr << update;
+
+ ACE_Message_Block mb;
+ ACE_CDR::consolidate(&mb, cdr.begin());
+#if (TAO_NO_COPY_OCTET_SEQUENCES == 1)
+ FTRT::State state(mb.length(), &mb);
+#else
+ // If the form of the constructor is not available, we will need
+ // to do the copy manually. First, set the octet sequence length.
+ FTRT::State state;
+ CORBA::ULong length = mb.length ();
+ state.length (length);
+
+ // Now copy over each byte.
+ char* base = mb.data_block ()->base ();
+ for(CORBA::ULong i = 0; i < length; i++)
+ {
+ state[i] = base[i];
+ }
+#endif /* TAO_NO_COPY_OCTET_SEQUENCES == 1 */
+
+
+ replication_strategy->replicate_request(
+ state,
+ rollback,
+ update.object_id
+ ACE_ENV_ARG_PARAMETER);
+ }
+
+ void Replication_Service::add_member(const FTRT::ManagerInfo & info,
+ CORBA::ULong object_group_ref_version
+ ACE_ENV_ARG_DECL)
+ {
+ replication_strategy->add_member(info, object_group_ref_version ACE_ENV_ARG_PARAMETER);
+ }
+
+ int Replication_Service::acquire_read (void)
+ {
+ int r = replication_strategy->acquire_read();
+ TAO_FTRTEC::Log(3, "Read Lock acquired %d\n", r);
+ return r;
+ }
+
+ int Replication_Service::acquire_write (void)
+ {
+ int r= replication_strategy->acquire_write();
+ TAO_FTRTEC::Log(3, "Write Lock acqured %d\n", r);
+ return r;
+ }
+
+ int Replication_Service::release (void)
+ {
+ int r= replication_strategy->release();
+ TAO_FTRTEC::Log(3, "Lock Released %d\n", r);
+ return r;
+ }
+
+ int Replication_Service::threads() const {
+ return FTRTEC::threads;
+ }
+}
+
+TAO_END_VERSIONED_NAMESPACE_DECL
+
+ACE_FACTORY_NAMESPACE_DEFINE (
+ TAO_FTRTEC,
+ Replication_Service,
+ FTRTEC::Replication_Service)
+
+ACE_STATIC_SVC_DEFINE (
+ Replication_Service,
+ ACE_TEXT ("FTRTEC_Replication"),
+ ACE_SVC_OBJ_T,
+ &ACE_SVC_NAME (Replication_Service),
+ ACE_Service_Type::DELETE_THIS
+ | ACE_Service_Type::DELETE_OBJ,
+ 0)
diff --git a/TAO/orbsvcs/orbsvcs/FtRtEvent/EventChannel/Replication_Service.h b/TAO/orbsvcs/orbsvcs/FtRtEvent/EventChannel/Replication_Service.h
new file mode 100644
index 00000000000..e1deca2f103
--- /dev/null
+++ b/TAO/orbsvcs/orbsvcs/FtRtEvent/EventChannel/Replication_Service.h
@@ -0,0 +1,85 @@
+// -*- C++ -*-
+
+//=============================================================================
+/**
+ * @file Replication_Service.h
+ *
+ * $Id$
+ *
+ * @author Huang-Ming Huang <hh1@cse.wustl.edu>
+ */
+//=============================================================================
+
+#ifndef REPLCATION_SERVICE_H
+#define REPLCATION_SERVICE_H
+
+#include "orbsvcs/FtRtecEventChannelAdminC.h"
+#include "orbsvcs/FtRtEvent/EventChannel/FTEC_Become_Primary_Listener.h"
+#include "tao/PortableInterceptorC.h"
+#include "ace/Service_Object.h"
+#include "orbsvcs/FtRtEvent/EventChannel/ftrtec_export.h"
+
+#if !defined (ACE_LACKS_PRAGMA_ONCE)
+# pragma once
+#endif /* ACE_LACKS_PRAGMA_ONCE */
+
+TAO_BEGIN_VERSIONED_NAMESPACE_DECL
+
+namespace FTRTEC
+{
+ class TAO_FTRTEC_Export Replication_Service
+ : public TAO_FTEC_Become_Primary_Listener
+ , public ACE_Service_Object
+ {
+ public:
+ static Replication_Service* instance();
+
+ Replication_Service();
+ ~Replication_Service();
+
+ virtual int init (int argc,
+ ACE_TCHAR* []);
+
+ virtual void become_primary();
+
+ /**
+ * Used for checking if the incoming replication message is out of sequence.
+ */
+ void check_validity(ACE_ENV_SINGLE_ARG_DECL);
+
+ typedef void (FtRtecEventChannelAdmin::EventChannelFacade::*RollbackOperation)
+ (const FtRtecEventChannelAdmin::ObjectId& ACE_ENV_ARG_DECL);
+
+ /**
+ * Replicate a request.
+ *
+ * @param state The request to be replicated.
+ * @param rollback The rollback operation when the replication failed.
+ */
+ void replicate_request(const FtRtecEventChannelAdmin::Operation& update,
+ RollbackOperation rollback
+ ACE_ENV_ARG_DECL);
+
+ /**
+ * Inform the backup replicas that a new replica has joined the object
+ * group.
+ */
+ void add_member(const FTRT::ManagerInfo & info,
+ CORBA::ULong object_group_ref_version
+ ACE_ENV_ARG_DECL);
+
+ int acquire_read (void);
+ int acquire_write (void);
+ int release (void);
+
+ int threads() const;
+ };
+}
+
+TAO_END_VERSIONED_NAMESPACE_DECL
+
+ACE_STATIC_SVC_DECLARE_EXPORT (TAO_FTRTEC, Replication_Service)
+ACE_STATIC_SVC_REQUIRE(Replication_Service)
+ACE_FACTORY_DECLARE (TAO_FTRTEC, Replication_Service)
+
+#endif //REPLCATION_SERVICE_H
diff --git a/TAO/orbsvcs/orbsvcs/FtRtEvent/EventChannel/Replication_Strategy.cpp b/TAO/orbsvcs/orbsvcs/FtRtEvent/EventChannel/Replication_Strategy.cpp
new file mode 100644
index 00000000000..f7cc5f524f7
--- /dev/null
+++ b/TAO/orbsvcs/orbsvcs/FtRtEvent/EventChannel/Replication_Strategy.cpp
@@ -0,0 +1,35 @@
+// $Id$
+
+#include "orbsvcs/FtRtEvent/EventChannel/Replication_Strategy.h"
+#include "orbsvcs/FtRtEvent/EventChannel/FTEC_Event_Channel.h"
+
+ACE_RCSID (EventChannel,
+ Replication_Strategy,
+ "$Id$")
+
+
+TAO_BEGIN_VERSIONED_NAMESPACE_DECL
+
+Replication_Strategy::Replication_Strategy()
+{
+}
+
+
+Replication_Strategy::~Replication_Strategy()
+{
+}
+
+
+void
+Replication_Strategy::check_validity(ACE_ENV_SINGLE_ARG_DECL_NOT_USED)
+{
+}
+
+
+Replication_Strategy*
+Replication_Strategy::make_primary_strategy()
+{
+ return this;
+}
+
+TAO_END_VERSIONED_NAMESPACE_DECL
diff --git a/TAO/orbsvcs/orbsvcs/FtRtEvent/EventChannel/Replication_Strategy.h b/TAO/orbsvcs/orbsvcs/FtRtEvent/EventChannel/Replication_Strategy.h
new file mode 100644
index 00000000000..8c661ee0ee8
--- /dev/null
+++ b/TAO/orbsvcs/orbsvcs/FtRtEvent/EventChannel/Replication_Strategy.h
@@ -0,0 +1,76 @@
+// -*- C++ -*-
+
+//=============================================================================
+/**
+ * @file Replication_Strategy.h
+ *
+ * $Id$
+ *
+ * @author Huang-Ming Huang <hh1@cse.wustl.edu>
+ */
+//=============================================================================
+
+#ifndef REPLICATION_STRATEGY_H
+#define REPLICATION_STRATEGY_H
+#include "orbsvcs/FtRtecEventChannelAdminC.h"
+#include "tao/PortableInterceptorC.h"
+
+#if !defined (ACE_LACKS_PRAGMA_ONCE)
+# pragma once
+#endif /* ACE_LACKS_PRAGMA_ONCE */
+
+TAO_BEGIN_VERSIONED_NAMESPACE_DECL
+
+namespace FTEC {
+ struct ManagerInfo;
+}
+
+class TAO_FTEC_Event_Channel_Impl;
+class Replication_Strategy
+{
+public:
+ Replication_Strategy();
+ virtual ~Replication_Strategy();
+
+ /**
+ * Check if the incoming set_update() request is out of sequence. This is only
+ * used for basic replication strategy. It throws FTRT::OutOfSequence when the
+ * incoming request is not valid.
+ */
+ virtual void check_validity(ACE_ENV_SINGLE_ARG_DECL);
+
+ typedef void (FtRtecEventChannelAdmin::EventChannelFacade::*RollbackOperation)
+ (const FtRtecEventChannelAdmin::ObjectId& ACE_ENV_ARG_DECL);
+
+ /**
+ * Replicate a request.
+ *
+ * @param state The request to be replicated.
+ * @param rollback The rollback operation when the replication failed.
+ * @param oid The object id used for rollback operation.
+ */
+ virtual void replicate_request(const FTRT::State& state,
+ RollbackOperation rollback,
+ const FtRtecEventChannelAdmin::ObjectId& oid
+ ACE_ENV_ARG_DECL)=0;
+
+ /**
+ * Inform the backup replicas that a new replica has joined the object
+ * group.
+ */
+ virtual void add_member(const FTRT::ManagerInfo & info,
+ CORBA::ULong object_group_ref_version
+ ACE_ENV_ARG_DECL)=0;
+
+ virtual Replication_Strategy* make_primary_strategy();
+
+ virtual int acquire_read (void)=0;
+ virtual int acquire_write (void)=0;
+ virtual int release (void)=0;
+
+};
+
+TAO_END_VERSIONED_NAMESPACE_DECL
+
+#endif
+
diff --git a/TAO/orbsvcs/orbsvcs/FtRtEvent/EventChannel/Request_Context_Repository.cpp b/TAO/orbsvcs/orbsvcs/FtRtEvent/EventChannel/Request_Context_Repository.cpp
new file mode 100644
index 00000000000..f04af729152
--- /dev/null
+++ b/TAO/orbsvcs/orbsvcs/FtRtEvent/EventChannel/Request_Context_Repository.cpp
@@ -0,0 +1,316 @@
+// $Id$
+
+#include "orbsvcs/FtRtEvent/EventChannel/Request_Context_Repository.h"
+#include "../Utils/resolve_init.h"
+#include "../Utils/UUID.h"
+
+#include "tao/AnyTypeCode/TypeCode.h"
+#include "tao/PI/PI.h"
+#include "tao/PI_Server/PI_Server.h"
+#include "tao/IOP_IORC.h"
+#include "ace/TSS_T.h"
+
+ACE_RCSID (EventChannel,
+ Request_Context_Repository,
+ "$Id$")
+
+namespace {
+PortableInterceptor::SlotId object_id_slot;
+PortableInterceptor::SlotId cached_result_slot;
+PortableInterceptor::SlotId seq_num_slot;
+PortableInterceptor::SlotId ft_request_service_context_slot;
+PortableInterceptor::SlotId transaction_depth_slot;
+CORBA::ORB_ptr orb;
+ACE_TSS<FtRtecEventChannelAdmin::ObjectId> oid;
+}
+
+TAO_BEGIN_VERSIONED_NAMESPACE_DECL
+
+void
+Request_Context_Repository::allocate_slots(PortableInterceptor::ORBInitInfo_ptr info
+ ACE_ENV_ARG_DECL)
+{
+ object_id_slot = info->allocate_slot_id(ACE_ENV_SINGLE_ARG_PARAMETER);
+ cached_result_slot = info->allocate_slot_id(ACE_ENV_SINGLE_ARG_PARAMETER);
+ seq_num_slot = info->allocate_slot_id(ACE_ENV_SINGLE_ARG_PARAMETER);
+ ft_request_service_context_slot = info->allocate_slot_id(ACE_ENV_SINGLE_ARG_PARAMETER);
+ transaction_depth_slot = info->allocate_slot_id(ACE_ENV_SINGLE_ARG_PARAMETER);
+}
+
+void
+Request_Context_Repository::init(CORBA::ORB_ptr the_orb)
+{
+ orb = the_orb;
+}
+
+void Request_Context_Repository::generate_object_id(
+ FtRtecEventChannelAdmin::ObjectId& oid
+ ACE_ENV_ARG_DECL)
+{
+ oid.length(sizeof(UUID));
+ UUID::create(oid.get_buffer());
+ set_object_id(oid
+ ACE_ENV_ARG_PARAMETER);
+ ACE_CHECK;
+}
+
+void
+Request_Context_Repository::set_object_id(
+ const FtRtecEventChannelAdmin::ObjectId& object_id
+ ACE_ENV_ARG_DECL_NOT_USED)
+{
+ /*
+ PortableInterceptor::Current_var pic =
+ resolve_init<PortableInterceptor::Current>(orb, "PICurrent"
+ ACE_ENV_ARG_PARAMETER);
+ ACE_CHECK;
+
+ CORBA::Any a;
+ a <<= object_id;
+ pic->set_slot(object_id_slot, a
+ ACE_ENV_ARG_PARAMETER);
+
+ ACE_CHECK;
+ */
+ *oid = object_id;
+}
+
+FtRtecEventChannelAdmin::ObjectId_var
+get_object_id(CORBA::Any_var a
+ ACE_ENV_ARG_DECL)
+{
+ FtRtecEventChannelAdmin::ObjectId *object_id, *r;
+ FtRtecEventChannelAdmin::ObjectId_var result;
+
+ if ((a.in() >>= object_id) ==0)
+ ACE_THROW_RETURN(CORBA::NO_MEMORY(), result);
+
+ ACE_NEW_THROW_EX(r,
+ FtRtecEventChannelAdmin::ObjectId(*object_id),
+ CORBA::NO_MEMORY());
+
+ result = r;
+ return result;
+}
+
+
+FtRtecEventChannelAdmin::ObjectId_var
+Request_Context_Repository::get_object_id(ACE_ENV_SINGLE_ARG_DECL)
+{
+ /*
+ PortableInterceptor::Current_var pic =
+ resolve_init<PortableInterceptor::Current>(orb, "PICurrent"
+ ACE_ENV_ARG_PARAMETER);
+ ACE_CHECK_RETURN(FtRtecEventChannelAdmin::ObjectId_var());
+
+ CORBA::Any_var a = pic->get_slot(object_id_slot
+ ACE_ENV_ARG_PARAMETER);
+ ACE_CHECK_RETURN(FtRtecEventChannelAdmin::ObjectId_var());
+
+ return ::get_object_id(a
+ ACE_ENV_ARG_PARAMETER);
+ */
+ FtRtecEventChannelAdmin::ObjectId *object_id;
+ ACE_NEW_THROW_EX(object_id,
+ FtRtecEventChannelAdmin::ObjectId(*oid),
+ CORBA::NO_MEMORY());
+ return FtRtecEventChannelAdmin::ObjectId_var(*object_id);
+}
+
+FtRtecEventChannelAdmin::ObjectId_var
+Request_Context_Repository::get_object_id(
+ PortableInterceptor::ServerRequestInfo_ptr ri
+ ACE_ENV_ARG_DECL)
+{
+ CORBA::Any_var a = ri->get_slot(object_id_slot
+ ACE_ENV_ARG_PARAMETER);
+ ACE_CHECK_RETURN(FtRtecEventChannelAdmin::ObjectId_var());
+
+ return ::get_object_id(a
+ ACE_ENV_ARG_PARAMETER);
+
+}
+
+void
+Request_Context_Repository::set_cached_result(
+ PortableInterceptor::ServerRequestInfo_ptr ri,
+ const CORBA::Any& result
+ ACE_ENV_ARG_DECL)
+{
+ ri->set_slot(cached_result_slot,
+ result ACE_ENV_ARG_PARAMETER);
+}
+
+CORBA::Any_ptr
+Request_Context_Repository::get_cached_result(ACE_ENV_SINGLE_ARG_DECL)
+{
+ PortableInterceptor::Current_var pic =
+ resolve_init<PortableInterceptor::Current>(orb, "PICurrent"
+ ACE_ENV_ARG_PARAMETER);
+ ACE_CHECK_RETURN(0);
+
+ CORBA::Any_var a = pic->get_slot(cached_result_slot
+ ACE_ENV_ARG_PARAMETER);
+ ACE_CHECK_RETURN(0);
+ return a._retn();
+}
+
+bool Request_Context_Repository::is_executed_request()
+{
+ ACE_TRY_NEW_ENV {
+ CORBA::Any_var any = get_cached_result(ACE_ENV_SINGLE_ARG_PARAMETER);
+ ACE_TRY_CHECK;
+ CORBA::TypeCode_var type = any->type();
+ CORBA::TCKind const kind = type->kind(ACE_ENV_SINGLE_ARG_PARAMETER);
+ ACE_TRY_CHECK;
+ return kind != CORBA::tk_null;
+ }
+ ACE_CATCHALL {
+ }
+ ACE_ENDTRY;
+ return false;
+}
+
+void
+Request_Context_Repository::set_sequence_number(
+ PortableInterceptor::ServerRequestInfo_ptr ri,
+ FTRT::SequenceNumber seq_num
+ ACE_ENV_ARG_DECL)
+{
+ CORBA::Any a;
+
+ a <<= seq_num;
+
+ ri->set_slot(seq_num_slot, a ACE_ENV_ARG_PARAMETER);
+}
+
+void
+Request_Context_Repository::set_sequence_number(
+ FTRT::SequenceNumber seq_num
+ ACE_ENV_ARG_DECL)
+{
+ PortableInterceptor::Current_var pic =
+ resolve_init<PortableInterceptor::Current>(orb, "PICurrent"
+ ACE_ENV_ARG_PARAMETER);
+ ACE_CHECK;
+
+ CORBA::Any a;
+
+ a <<= seq_num;
+
+ pic->set_slot(seq_num_slot, a ACE_ENV_ARG_PARAMETER);
+}
+
+
+FTRT::SequenceNumber
+Request_Context_Repository::get_sequence_number(ACE_ENV_SINGLE_ARG_DECL)
+{
+ PortableInterceptor::Current_var pic =
+ resolve_init<PortableInterceptor::Current>(orb, "PICurrent"
+ ACE_ENV_ARG_PARAMETER);
+ ACE_CHECK_RETURN(0);
+ CORBA::Any_var a = pic->get_slot(seq_num_slot ACE_ENV_ARG_PARAMETER);
+ ACE_CHECK_RETURN(0);
+ FTRT::SequenceNumber result = 0;
+ a >>= result;
+ return result;
+}
+
+FTRT::SequenceNumber
+Request_Context_Repository::get_sequence_number(
+ PortableInterceptor::ClientRequestInfo_ptr ri
+ ACE_ENV_ARG_DECL)
+{
+ CORBA::Any_var a = ri->get_slot(seq_num_slot ACE_ENV_ARG_PARAMETER);
+ ACE_CHECK_RETURN(0);
+ FTRT::SequenceNumber result = 0;
+ a >>= result;
+ return result;
+}
+
+void
+Request_Context_Repository::set_ft_request_service_context(
+ PortableInterceptor::ServerRequestInfo_ptr ri,
+ IOP::ServiceContext_var service_context
+ ACE_ENV_ARG_DECL)
+{
+ CORBA::Any a;
+ a <<= service_context.in();
+ ri->set_slot(ft_request_service_context_slot,a
+ ACE_ENV_ARG_PARAMETER);
+}
+
+CORBA::Any_var
+Request_Context_Repository::get_ft_request_service_context(
+ PortableInterceptor::ClientRequestInfo_ptr ri
+ ACE_ENV_ARG_DECL)
+{
+ return ri->get_slot(ft_request_service_context_slot
+ ACE_ENV_ARG_PARAMETER);
+}
+
+void
+Request_Context_Repository::set_transaction_depth(
+ PortableInterceptor::ServerRequestInfo_ptr ri,
+ FTRT::TransactionDepth depth
+ ACE_ENV_ARG_DECL)
+{
+ CORBA::Any a;
+ a <<= depth;
+ ri->set_slot(transaction_depth_slot,a
+ ACE_ENV_ARG_PARAMETER);
+ ACE_CHECK;
+}
+
+void
+Request_Context_Repository::set_transaction_depth(
+ FTRT::TransactionDepth depth
+ ACE_ENV_ARG_DECL)
+{
+ PortableInterceptor::Current_var pic =
+ resolve_init<PortableInterceptor::Current>(orb, "PICurrent"
+ ACE_ENV_ARG_PARAMETER);
+ ACE_CHECK;
+
+ CORBA::Any a;
+ a <<= depth;
+ pic->set_slot(transaction_depth_slot,a
+ ACE_ENV_ARG_PARAMETER);
+ ACE_CHECK;
+}
+
+
+FTRT::TransactionDepth
+Request_Context_Repository::get_transaction_depth(
+ PortableInterceptor::ClientRequestInfo_ptr ri
+ ACE_ENV_ARG_DECL)
+{
+ CORBA::Any_var a = ri->get_slot(transaction_depth_slot
+ ACE_ENV_ARG_PARAMETER);
+ ACE_CHECK_RETURN(0);
+ FTRT::TransactionDepth result=0;
+ a >>= result;
+ return result;
+
+}
+
+FTRT::TransactionDepth
+Request_Context_Repository::get_transaction_depth(
+ ACE_ENV_SINGLE_ARG_DECL)
+{
+ PortableInterceptor::Current_var pic =
+ resolve_init<PortableInterceptor::Current>(orb, "PICurrent"
+ ACE_ENV_ARG_PARAMETER);
+ ACE_CHECK_RETURN(0);
+
+ CORBA::Any_var a = pic->get_slot(transaction_depth_slot
+ ACE_ENV_ARG_PARAMETER);
+ ACE_CHECK_RETURN(0);
+
+ FTRT::TransactionDepth result=0;
+ a >>= result;
+ return result;
+
+}
+
+TAO_END_VERSIONED_NAMESPACE_DECL
diff --git a/TAO/orbsvcs/orbsvcs/FtRtEvent/EventChannel/Request_Context_Repository.h b/TAO/orbsvcs/orbsvcs/FtRtEvent/EventChannel/Request_Context_Repository.h
new file mode 100644
index 00000000000..542f58937ea
--- /dev/null
+++ b/TAO/orbsvcs/orbsvcs/FtRtEvent/EventChannel/Request_Context_Repository.h
@@ -0,0 +1,116 @@
+// -*- C++ -*-
+
+//=============================================================================
+/**
+ * @file Request_Context_Repository.h
+ *
+ * $Id$
+ *
+ * @author Huang-Ming Huang <hh1@cse.wustl.edu>
+ */
+//=============================================================================
+
+#ifndef REQUEST_CONTEXT_REPOSITORY_H
+#define REQUEST_CONTEXT_REPOSITORY_H
+
+#include "orbsvcs/FtRtecEventChannelAdminC.h"
+#include "tao/PortableInterceptorC.h"
+
+#if !defined (ACE_LACKS_PRAGMA_ONCE)
+# pragma once
+#endif /* ACE_LACKS_PRAGMA_ONCE */
+
+TAO_BEGIN_VERSIONED_NAMESPACE_DECL
+
+class TAO_FTEC_Event_Channel_Impl;
+
+namespace PortableInterceptor
+{
+ class ORBInitInfo;
+ typedef ORBInitInfo *ORBInitInfo_ptr;
+
+ class ServerRequestInfo;
+ typedef ServerRequestInfo *ServerRequestInfo_ptr;
+
+ class ClientRequestInfo;
+ typedef ClientRequestInfo *ClientRequestInfo_ptr;
+}
+
+/**
+ * @class Request_Context_Repository
+ *
+ * @brief This class is used to transfer the information between thread context
+ * information and the request context in the portable interceptors. It
+ * encapulates the PICurrent to provide a type safe way for the transfer of
+ * FTEC specific information inside and outside protable interceptors.
+ */
+class Request_Context_Repository
+{
+public:
+
+ void init(CORBA::ORB_ptr orb);
+
+ /**
+ * Used by ORBInitializer to allocate required slots for
+ * FTEC.
+ */
+ void allocate_slots(PortableInterceptor::ORBInitInfo_ptr info
+ ACE_ENV_ARG_DECL);
+
+
+ void generate_object_id(FtRtecEventChannelAdmin::ObjectId& object_id
+ ACE_ENV_ARG_DECL);
+ void set_object_id(const FtRtecEventChannelAdmin::ObjectId& object_id
+ ACE_ENV_ARG_DECL);
+ FtRtecEventChannelAdmin::ObjectId_var get_object_id(ACE_ENV_SINGLE_ARG_DECL);
+ FtRtecEventChannelAdmin::ObjectId_var
+ get_object_id(PortableInterceptor::ServerRequestInfo_ptr ri
+ ACE_ENV_ARG_DECL);
+
+ void set_cached_result(PortableInterceptor::ServerRequestInfo_ptr ri,
+ const CORBA::Any& result
+ ACE_ENV_ARG_DECL);
+
+ CORBA::Any_ptr get_cached_result(ACE_ENV_SINGLE_ARG_DECL);
+ bool is_executed_request();
+
+ void set_sequence_number(PortableInterceptor::ServerRequestInfo_ptr ri,
+ FTRT::SequenceNumber
+ ACE_ENV_ARG_DECL);
+
+ void set_sequence_number(FTRT::SequenceNumber
+ ACE_ENV_ARG_DECL);
+ FTRT::SequenceNumber get_sequence_number(PortableInterceptor::ClientRequestInfo_ptr ri
+ ACE_ENV_ARG_DECL);
+
+ FTRT::SequenceNumber get_sequence_number(ACE_ENV_SINGLE_ARG_DECL);
+
+ void set_ft_request_service_context(
+ PortableInterceptor::ServerRequestInfo_ptr ri,
+ IOP::ServiceContext_var service_context
+ ACE_ENV_ARG_DECL);
+
+ CORBA::Any_var get_ft_request_service_context(
+ PortableInterceptor::ClientRequestInfo_ptr ri
+ ACE_ENV_ARG_DECL);
+
+ void set_transaction_depth(
+ PortableInterceptor::ServerRequestInfo_ptr ri,
+ FTRT::TransactionDepth depth
+ ACE_ENV_ARG_DECL);
+
+ void set_transaction_depth(
+ FTRT::TransactionDepth depth
+ ACE_ENV_ARG_DECL);
+
+ FTRT::TransactionDepth get_transaction_depth(
+ ACE_ENV_SINGLE_ARG_DECL);
+
+ FTRT::TransactionDepth get_transaction_depth(
+ PortableInterceptor::ClientRequestInfo_ptr
+ ACE_ENV_ARG_DECL);
+};
+
+TAO_END_VERSIONED_NAMESPACE_DECL
+
+#endif /// REQUEST_CONTEXT_REPOSITORY_H
diff --git a/TAO/orbsvcs/orbsvcs/FtRtEvent/EventChannel/SCTP_Fault_Detector.cpp b/TAO/orbsvcs/orbsvcs/FtRtEvent/EventChannel/SCTP_Fault_Detector.cpp
new file mode 100644
index 00000000000..222d5daa3fb
--- /dev/null
+++ b/TAO/orbsvcs/orbsvcs/FtRtEvent/EventChannel/SCTP_Fault_Detector.cpp
@@ -0,0 +1,96 @@
+// $Id$
+
+#include "orbsvcs/FtRtEvent/EventChannel/SCTP_Fault_Detector.h"
+
+#if (TAO_HAS_SCIOP == 1)
+
+#include "orbsvcs/FtRtEvent/EventChannel/FTEC_Fault_Listener.h"
+
+#include "ace/OS_NS_strings.h"
+#include "ace/OS_NS_sys_socket.h"
+
+ACE_RCSID (EventChannel,
+ SCTP_Fault_Detector,
+ "$Id$")
+
+#ifndef SCTP_HEARTBEAT_ITVL
+#define SCTP_HEARTBEAT_ITVL 19
+#endif
+#ifndef SOL_SCTP
+#define SOL_SCTP 132
+#endif
+
+TAO_BEGIN_VERSIONED_NAMESPACE_DECL
+
+SCTP_Connector::SCTP_Connector()
+: heart_beat_(0)
+{
+}
+
+int
+SCTP_Connector::connect (ACE_SOCK_SEQPACK_Association &new_association,
+ const ACE_Addr &remote_sap,
+ const ACE_Time_Value *timeout,
+ const ACE_Addr &local_sap,
+ int reuse_addr,
+ int /* flags */,
+ int /* perms */,
+ int protocol)
+{
+ ACE_TRACE ("SCTP_Connector::connect");
+
+ if (this->shared_open (new_association,
+ remote_sap.get_type (),
+ protocol,
+ reuse_addr) == -1)
+ return -1;
+ else if (this->shared_connect_start (new_association,
+ timeout,
+ local_sap) == -1)
+ return -1;
+
+ if (new_association.set_option(SOL_SCTP,
+ SCTP_HEARTBEAT_ITVL,
+ &heart_beat_,
+ sizeof(heart_beat_)) == -1)
+ return -1;
+
+ int result = ACE_OS::connect (new_association.get_handle (),
+ reinterpret_cast<sockaddr *> (remote_sap.get_addr ()),
+ remote_sap.get_size ());
+
+ return this->shared_connect_finish (new_association,
+ timeout,
+ result);
+}
+
+
+inline void SCTP_Connector::set_heart_beat(int hb)
+{
+ heart_beat_ = hb;
+}
+
+
+SCTP_Fault_Detector::~SCTP_Fault_Detector()
+{
+}
+
+
+int SCTP_Fault_Detector::parse_conf(int argc, char** argv)
+{
+ ACE_TRACE ("SCTP_Fault_Detector::parse_conf");
+
+ for (int curarg = 0; curarg < argc; curarg++)
+ if (ACE_OS::strcasecmp (argv[curarg],
+ ACE_TEXT("-HeartBeat")) == 0)
+ {
+ curarg++;
+ if (curarg < argc)
+ connector_.set_heart_beat(atoi(argv[curarg]));
+ }
+ return 0;
+}
+
+TAO_END_VERSIONED_NAMESPACE_DECL
+
+#endif /* ACE_HAS_SCTP == 1 */
diff --git a/TAO/orbsvcs/orbsvcs/FtRtEvent/EventChannel/SCTP_Fault_Detector.h b/TAO/orbsvcs/orbsvcs/FtRtEvent/EventChannel/SCTP_Fault_Detector.h
new file mode 100644
index 00000000000..4e9978afa7f
--- /dev/null
+++ b/TAO/orbsvcs/orbsvcs/FtRtEvent/EventChannel/SCTP_Fault_Detector.h
@@ -0,0 +1,86 @@
+// -*- C++ -*-
+
+//=============================================================================
+/**
+ * @file SCTP_Fault_Detector.h
+ *
+ * $Id$
+ *
+ * @author Huang-Ming Huang <hh1@cse.wustl.edu>
+ */
+//=============================================================================
+
+#ifndef SCTP_FAULT_DETECTOR_H
+#define SCTP_FAULT_DETECTOR_H
+
+#include "tao/orbconf.h"
+
+// make sure that the code compiles cleanly even if SCTP is not
+// available. If SCTP is not installed, program will exit early in
+// main() with an error message
+#if (TAO_HAS_SCIOP == 1)
+
+#include "ace/Acceptor.h"
+#include "ace/Connector.h"
+#include "ace/SOCK_SEQPACK_Association.h"
+#include "ace/SOCK_SEQPACK_Acceptor.h"
+#include "ace/SOCK_SEQPACK_Connector.h"
+#include "ace/Multihomed_INET_Addr.h"
+#include "orbsvcs/FtRtEvent/EventChannel/ConnectionHandler_T.h"
+#include "orbsvcs/FtRtEvent/EventChannel/Fault_Detector_T.h"
+
+#if !defined (ACE_LACKS_PRAGMA_ONCE)
+# pragma once
+#endif /* ACE_LACKS_PRAGMA_ONCE */
+
+
+extern "C" {
+#include <netinet/sctp.h>
+};
+
+#ifndef IPPROTO_SCTP
+#define IPPROTO_SCTP 132
+#endif // !IPPROTO_SCTP
+#ifndef SCTP_NODELAY
+#define SCTP_NODELAY 1
+#endif // SCTP_NODELAY
+
+TAO_BEGIN_VERSIONED_NAMESPACE_DECL
+
+typedef ACE_Acceptor<ConnectionAcceptHandler<ACE_SOCK_SEQPACK_ASSOCIATION>, ACE_SOCK_SEQPACK_ACCEPTOR>
+ SCTP_ConnectionAcceptHandler;
+typedef ConnectionDetectHandler<ACE_SOCK_SEQPACK_ASSOCIATION> SCTP_ConnectionDetectHandler;
+
+class SCTP_Connector : public ACE_SOCK_SEQPACK_Connector
+{
+public:
+ SCTP_Connector();
+ int connect (ACE_SOCK_SEQPACK_Association &new_association,
+ const ACE_Addr &remote_sap,
+ const ACE_Time_Value *timeout = 0,
+ const ACE_Addr &local_sap = ACE_Addr::sap_any,
+ int reuse_addr = 0,
+ int flags = 0,
+ int perms = 0,
+ int protocol = 132);
+ void set_heart_beat(int hb);
+private:
+ int heart_beat_;
+};
+
+class SCTP_Fault_Detector : public Fault_Detector_T<
+ SCTP_ConnectionAcceptHandler,
+ SCTP_Connector,
+ SCTP_ConnectionDetectHandler >
+{
+public:
+ virtual ~SCTP_Fault_Detector();
+private:
+ virtual int parse_conf(int argc, char** argv);
+};
+
+TAO_END_VERSIONED_NAMESPACE_DECL
+
+#endif /* TAO_HAS_SCIOP */
+
+#endif /* SCTP_FAULT_DETECTOR_H */
diff --git a/TAO/orbsvcs/orbsvcs/FtRtEvent/EventChannel/Set_Update_Interceptor.cpp b/TAO/orbsvcs/orbsvcs/FtRtEvent/EventChannel/Set_Update_Interceptor.cpp
new file mode 100644
index 00000000000..58e96befd06
--- /dev/null
+++ b/TAO/orbsvcs/orbsvcs/FtRtEvent/EventChannel/Set_Update_Interceptor.cpp
@@ -0,0 +1,168 @@
+// $Id$
+
+#include "tao/CDR.h"
+#include "orbsvcs/FtRtEvent/EventChannel/Set_Update_Interceptor.h"
+#include "orbsvcs/FTRTC.h"
+#include "orbsvcs/FtRtEvent/EventChannel/Request_Context_Repository.h"
+
+ACE_RCSID (EventChannel,
+ Set_Update_Intercetpor,
+ "$Id$")
+
+TAO_BEGIN_VERSIONED_NAMESPACE_DECL
+
+TAO_Set_Update_Interceptor::TAO_Set_Update_Interceptor ()
+: myname_ ("TAO_Set_Update_Interceptor")
+{
+}
+
+TAO_Set_Update_Interceptor::~TAO_Set_Update_Interceptor (void)
+{
+}
+
+char *
+TAO_Set_Update_Interceptor::name (ACE_ENV_SINGLE_ARG_DECL_NOT_USED)
+ACE_THROW_SPEC ((CORBA::SystemException))
+{
+ return CORBA::string_dup (this->myname_);
+}
+
+void
+TAO_Set_Update_Interceptor::destroy (ACE_ENV_SINGLE_ARG_DECL_NOT_USED)
+ACE_THROW_SPEC ((CORBA::SystemException))
+{
+}
+
+void
+TAO_Set_Update_Interceptor::send_poll (
+ PortableInterceptor::ClientRequestInfo_ptr
+ ACE_ENV_ARG_DECL_NOT_USED)
+ ACE_THROW_SPEC ((CORBA::SystemException))
+{
+ // Do Nothing
+}
+
+void
+TAO_Set_Update_Interceptor::send_request (
+ PortableInterceptor::ClientRequestInfo_ptr ri
+ ACE_ENV_ARG_DECL)
+ ACE_THROW_SPEC ((CORBA::SystemException,
+ PortableInterceptor::ForwardRequest))
+{
+ CORBA::String_var operation = ri->operation (ACE_ENV_SINGLE_ARG_PARAMETER);
+ ACE_CHECK;
+
+ if (strcmp(operation.in(), "set_update")==0 ||
+ strcmp(operation.in(), "oneway_set_update") ==0) {
+ CORBA::Any_var a = Request_Context_Repository().get_ft_request_service_context(ri
+ ACE_ENV_ARG_PARAMETER);
+ ACE_CHECK;
+
+ IOP::ServiceContext* sc;
+
+ if ((a.in() >>= sc) ==0)
+ return;
+
+ ri->add_request_service_context (*sc, 0 ACE_ENV_ARG_PARAMETER);
+ ACE_CHECK;
+
+ FTRT::TransactionDepth transaction_depth =
+ Request_Context_Repository().get_transaction_depth(ri ACE_ENV_ARG_PARAMETER);
+ TAO_OutputCDR cdr;
+ ACE_Message_Block mb;
+
+ if (transaction_depth) {
+ if (!(cdr << ACE_OutputCDR::from_boolean (TAO_ENCAP_BYTE_ORDER)))
+ ACE_THROW (CORBA::MARSHAL ());
+
+ // Add Transaction Depth Context
+ if ((cdr << transaction_depth) == 0)
+ ACE_THROW (CORBA::MARSHAL ());
+ sc->context_id = FTRT::FT_TRANSACTION_DEPTH;
+
+ ACE_CDR::consolidate(&mb, cdr.begin());
+#if (TAO_NO_COPY_OCTET_SEQUENCES == 1)
+ sc->context_data.replace(mb.length(), &mb);
+#else
+ // If the replace method is not available, we will need
+ // to do the copy manually. First, set the octet sequence length.
+ CORBA::ULong length = mb.length ();
+ sc->context_data.length (length);
+
+ // Now copy over each byte.
+ char* base = mb.data_block ()->base ();
+ for(CORBA::ULong i = 0; i < length; i++)
+ {
+ sc->context_data[i] = base[i];
+ }
+#endif /* TAO_NO_COPY_OCTET_SEQUENCES == 1 */
+
+ ri->add_request_service_context (*sc, 0 ACE_ENV_ARG_PARAMETER);
+ ACE_CHECK;
+
+ cdr.reset();
+ }
+
+ // Add Sequence Number Context
+
+ FTRT::SequenceNumber sequence_number =
+ Request_Context_Repository().get_sequence_number(ri ACE_ENV_ARG_PARAMETER);
+
+ ACE_DEBUG((LM_DEBUG, "send_request : sequence_number = %d\n", sequence_number));
+ if (sequence_number != 0) {
+ if (!(cdr << ACE_OutputCDR::from_boolean (TAO_ENCAP_BYTE_ORDER)))
+ ACE_THROW (CORBA::MARSHAL ());
+ if ((cdr << sequence_number) == 0)
+ ACE_THROW (CORBA::MARSHAL ());
+ sc->context_id = FTRT::FT_SEQUENCE_NUMBER;
+
+ ACE_CDR::consolidate(&mb, cdr.begin());
+#if (TAO_NO_COPY_OCTET_SEQUENCES == 1)
+ sc->context_data.replace(mb.length(), &mb);
+#else
+ // If the replace method is not available, we will need
+ // to do the copy manually. First, set the octet sequence length.
+ CORBA::ULong length = mb.length ();
+ sc->context_data.length (length);
+
+ // Now copy over each byte.
+ char* base = mb.data_block ()->base ();
+ for(CORBA::ULong i = 0; i < length; i++)
+ {
+ sc->context_data[i] = base[i];
+ }
+#endif /* TAO_NO_COPY_OCTET_SEQUENCES == 1 */
+
+ ri->add_request_service_context (*sc, 0 ACE_ENV_ARG_PARAMETER);
+ ACE_CHECK;
+ }
+ }
+}
+
+void
+TAO_Set_Update_Interceptor::receive_reply (
+ PortableInterceptor::ClientRequestInfo_ptr
+ ACE_ENV_ARG_DECL_NOT_USED)
+ ACE_THROW_SPEC ((CORBA::SystemException))
+{
+}
+
+void
+TAO_Set_Update_Interceptor::receive_other (
+ PortableInterceptor::ClientRequestInfo_ptr
+ ACE_ENV_ARG_DECL_NOT_USED)
+ ACE_THROW_SPEC ((CORBA::SystemException,
+ PortableInterceptor::ForwardRequest))
+{
+}
+
+void
+TAO_Set_Update_Interceptor::receive_exception (
+ PortableInterceptor::ClientRequestInfo_ptr
+ ACE_ENV_ARG_DECL_NOT_USED)
+ ACE_THROW_SPEC ((CORBA::SystemException,
+ PortableInterceptor::ForwardRequest))
+{
+}
+
+TAO_END_VERSIONED_NAMESPACE_DECL
diff --git a/TAO/orbsvcs/orbsvcs/FtRtEvent/EventChannel/Set_Update_Interceptor.h b/TAO/orbsvcs/orbsvcs/FtRtEvent/EventChannel/Set_Update_Interceptor.h
new file mode 100644
index 00000000000..c164c238281
--- /dev/null
+++ b/TAO/orbsvcs/orbsvcs/FtRtEvent/EventChannel/Set_Update_Interceptor.h
@@ -0,0 +1,86 @@
+// -*- C++ -*-
+
+//=============================================================================
+/**
+ * @file Set_Update_Interceptor.h
+ *
+ * $Id$
+ *
+ * @author Huang-Ming Huang <hh1@cse.wustl.edu>
+ */
+//=============================================================================
+
+#ifndef TAO_SET_UPDATE_INTERCEPTOR_H
+#define TAO_SET_UPDATE_INTERCEPTOR_H
+
+#include "tao/PI/PI.h"
+#include "tao/PortableInterceptorC.h"
+#include "tao/LocalObject.h"
+#include "ace/Atomic_Op.h"
+
+#if !defined (ACE_LACKS_PRAGMA_ONCE)
+# pragma once
+#endif /* ACE_LACKS_PRAGMA_ONCE */
+
+// This is to remove "inherits via dominance" warnings from MSVC.
+#if defined (_MSC_VER)
+# pragma warning (disable : 4250)
+#endif /* _MSC_VER */
+
+TAO_BEGIN_VERSIONED_NAMESPACE_DECL
+
+/**
+ * @class TAO_Set_Update_Interceptor
+ *
+ * @brief Interceptors for adding service context to set_update() and
+ * oneway_set_update() methods.
+ *
+ */
+class TAO_Set_Update_Interceptor
+ : public virtual PortableInterceptor::ClientRequestInterceptor,
+ public virtual TAO_Local_RefCounted_Object
+{
+public:
+ TAO_Set_Update_Interceptor ();
+ // ctor.
+
+ virtual ~TAO_Set_Update_Interceptor ();
+ // dtor.
+
+ virtual char * name (ACE_ENV_SINGLE_ARG_DECL_WITH_DEFAULTS)
+ ACE_THROW_SPEC ((CORBA::SystemException));
+ // Canonical name of the interceptor.
+
+ virtual void destroy (ACE_ENV_SINGLE_ARG_DECL_WITH_DEFAULTS)
+ ACE_THROW_SPEC ((CORBA::SystemException));
+
+ virtual void send_poll (PortableInterceptor::ClientRequestInfo_ptr
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS)
+ ACE_THROW_SPEC ((CORBA::SystemException));
+
+ virtual void send_request (PortableInterceptor::ClientRequestInfo_ptr ri
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS)
+ ACE_THROW_SPEC ((CORBA::SystemException,
+ PortableInterceptor::ForwardRequest));
+
+ virtual void receive_reply (PortableInterceptor::ClientRequestInfo_ptr ri
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS)
+ ACE_THROW_SPEC ((CORBA::SystemException));
+
+ virtual void receive_other (PortableInterceptor::ClientRequestInfo_ptr
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS)
+ ACE_THROW_SPEC ((CORBA::SystemException,
+ PortableInterceptor::ForwardRequest));
+
+ virtual void receive_exception (PortableInterceptor::ClientRequestInfo_ptr ri
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS)
+ ACE_THROW_SPEC ((CORBA::SystemException,
+ PortableInterceptor::ForwardRequest));
+
+private:
+ const char *myname_;
+};
+
+TAO_END_VERSIONED_NAMESPACE_DECL
+
+#endif // TAO_SET_UPDATE_INTERCEPTOR_H
diff --git a/TAO/orbsvcs/orbsvcs/FtRtEvent/EventChannel/Update_Manager.cpp b/TAO/orbsvcs/orbsvcs/FtRtEvent/EventChannel/Update_Manager.cpp
new file mode 100644
index 00000000000..c207baefd16
--- /dev/null
+++ b/TAO/orbsvcs/orbsvcs/FtRtEvent/EventChannel/Update_Manager.cpp
@@ -0,0 +1,61 @@
+// $Id$
+
+#include "orbsvcs/FtRtEvent/EventChannel/Update_Manager.h"
+
+ACE_RCSID (EventChannel,
+ Update_Manager,
+ "$Id$")
+
+TAO_BEGIN_VERSIONED_NAMESPACE_DECL
+
+Update_Manager::Update_Manager(ACE_Auto_Event& evt,
+ int num_backups,
+ int transaction_depth,
+ bool& success)
+ : evt_(evt)
+ , replied_(num_backups)
+ , suicide_condition_(num_backups)
+ , num_backups_(num_backups)
+ , transaction_level_(transaction_depth)
+ , success_(success)
+{
+ suicide_condition_.flip();
+ signal_condition_.resize(transaction_depth, true);
+ signal_condition_.resize(num_backups);
+}
+
+Update_Manager::~Update_Manager()
+{
+}
+
+void Update_Manager::handle_reply(int id)
+{
+ ACE_Guard<ACE_SYNCH_MUTEX> guard(mutex_);
+ replied_[id] = true;
+
+ if ((replied_ & signal_condition_) == signal_condition_) {
+ success_ = true;
+ evt_.signal();
+ }
+ if (replied_ == suicide_condition_)
+ delete this;
+}
+
+void Update_Manager::handle_exception(int id)
+{
+ ACE_Guard<ACE_SYNCH_MUTEX> guard(mutex_);
+ replied_[id] = true;
+ ++transaction_level_;
+
+ if (num_backups_ > transaction_level_) {
+ signal_condition_[transaction_level_]=true;
+ }
+ else {
+ success_ = false;
+ evt_.signal();
+ }
+ if (replied_ == suicide_condition_)
+ delete this;
+}
+
+TAO_END_VERSIONED_NAMESPACE_DECL
diff --git a/TAO/orbsvcs/orbsvcs/FtRtEvent/EventChannel/Update_Manager.h b/TAO/orbsvcs/orbsvcs/FtRtEvent/EventChannel/Update_Manager.h
new file mode 100644
index 00000000000..caacd63fffe
--- /dev/null
+++ b/TAO/orbsvcs/orbsvcs/FtRtEvent/EventChannel/Update_Manager.h
@@ -0,0 +1,52 @@
+// -*- C++ -*-
+
+//=============================================================================
+/**
+ * @file Update_Manager.h
+ *
+ * $Id$
+ *
+ * @author Huang-Ming Huang <hh1@cse.wustl.edu>
+ */
+//=============================================================================
+
+#ifndef UPDATE_MANAGER_H
+#define UPDATE_MANAGER_H
+
+#include "ace/Synch_T.h"
+#include "orbsvcs/FtRtEvent/EventChannel/Dynamic_Bitset.h"
+
+#if !defined (ACE_LACKS_PRAGMA_ONCE)
+# pragma once
+#endif /* ACE_LACKS_PRAGMA_ONCE */
+
+TAO_BEGIN_VERSIONED_NAMESPACE_DECL
+
+typedef Dynamic_Bitset bit_vector;
+
+class Update_Manager
+{
+public:
+ Update_Manager(ACE_Auto_Event& evt,
+ int num_backups,
+ int transaction_depth,
+ bool& success);
+ ~Update_Manager();
+
+ void handle_reply(int id);
+ void handle_exception(int id);
+
+private:
+ ACE_Auto_Event& evt_;
+ bit_vector replied_;
+ bit_vector signal_condition_;
+ bit_vector suicide_condition_;
+ int num_backups_;
+ int transaction_level_;
+ bool& success_;
+ ACE_SYNCH_MUTEX mutex_;
+};
+
+TAO_END_VERSIONED_NAMESPACE_DECL
+
+#endif
diff --git a/TAO/orbsvcs/orbsvcs/FtRtEvent/EventChannel/UpdateableHandler.cpp b/TAO/orbsvcs/orbsvcs/FtRtEvent/EventChannel/UpdateableHandler.cpp
new file mode 100644
index 00000000000..fadeb16f0e0
--- /dev/null
+++ b/TAO/orbsvcs/orbsvcs/FtRtEvent/EventChannel/UpdateableHandler.cpp
@@ -0,0 +1,100 @@
+// $Id$
+
+#include "orbsvcs/FtRtEvent/EventChannel/UpdateableHandler.h"
+#include "orbsvcs/FtRtEvent/EventChannel/Update_Manager.h"
+#include "orbsvcs/FtRtEvent/EventChannel/AMI_Primary_Replication_Strategy.h"
+#include "../Utils/resolve_init.h"
+
+ACE_RCSID (EventChannel,
+ UpdateableHandler,
+ "$Id$")
+
+
+TAO_BEGIN_VERSIONED_NAMESPACE_DECL
+
+UpdateableHandler::UpdateableHandler(AMI_Primary_Replication_Strategy* strategy)
+ : strategy_(strategy)
+{
+}
+
+UpdateableHandler::~UpdateableHandler()
+{
+}
+
+FTRT::AMI_UpdateableHandler_ptr UpdateableHandler::activate(
+ Update_Manager* mgr, int id,
+ PortableServer::ObjectId& object_id
+ ACE_ENV_ARG_DECL)
+{
+ object_id.length(sizeof(mgr) + sizeof(id));
+ memcpy(object_id.get_buffer(), &mgr, sizeof(mgr));
+ memcpy(object_id.get_buffer() + sizeof(mgr), &id, sizeof(id));
+ strategy_->poa()->activate_object_with_id(object_id,
+ this
+ ACE_ENV_ARG_PARAMETER);
+ CORBA::Object_var object = strategy_->poa()->id_to_reference(
+ object_id
+ ACE_ENV_ARG_PARAMETER);
+
+ return FTRT::AMI_UpdateableHandler::_narrow(object.in() ACE_ENV_ARG_PARAMETER);
+}
+
+
+
+void UpdateableHandler::dispatch(UpdateableHandler::Handler handler ACE_ENV_ARG_DECL)
+{
+ PortableServer::Current_var current =
+ resolve_init<PortableServer::Current>(strategy_->orb(),
+ "POACurrent"
+ ACE_ENV_ARG_PARAMETER);
+ ACE_CHECK;
+
+ PortableServer::ObjectId_var object_id =
+ current->get_object_id(ACE_ENV_SINGLE_ARG_PARAMETER);
+ ACE_CHECK;
+
+ Update_Manager* mgr;
+ int id;
+
+ memcpy(&mgr, object_id->get_buffer(), sizeof(mgr));
+ memcpy(&id, object_id->get_buffer()+sizeof(mgr), sizeof(id));
+
+ ACE_DEBUG((LM_DEBUG, "%d\n", id));
+
+ (mgr->*handler)(id);
+
+ strategy_->poa()->deactivate_object(object_id.in());
+}
+
+void UpdateableHandler::set_update (
+ ACE_ENV_SINGLE_ARG_DECL
+ )
+ ACE_THROW_SPEC ((
+ CORBA::SystemException
+ ))
+{
+ ACE_DEBUG((LM_DEBUG,"Received reply from "));
+ dispatch(&Update_Manager::handle_reply ACE_ENV_ARG_PARAMETER);
+}
+void UpdateableHandler::set_update_excep (
+ ::Messaging::ExceptionHolder * excep_holder
+ ACE_ENV_ARG_DECL
+ )
+ ACE_THROW_SPEC ((
+ CORBA::SystemException
+ ))
+{
+ ACE_DEBUG((LM_DEBUG, "Received Exception from"));
+ ACE_TRY {
+ excep_holder->raise_exception();
+ ACE_TRY_CHECK;
+ }
+ ACE_CATCHANY {
+ ACE_PRINT_EXCEPTION(ACE_ANY_EXCEPTION, "A corba exception\n");
+ }
+ ACE_ENDTRY;
+
+ dispatch(&Update_Manager::handle_exception ACE_ENV_ARG_PARAMETER);
+}
+
+TAO_END_VERSIONED_NAMESPACE_DECL
diff --git a/TAO/orbsvcs/orbsvcs/FtRtEvent/EventChannel/UpdateableHandler.h b/TAO/orbsvcs/orbsvcs/FtRtEvent/EventChannel/UpdateableHandler.h
new file mode 100644
index 00000000000..48f621bc1ef
--- /dev/null
+++ b/TAO/orbsvcs/orbsvcs/FtRtEvent/EventChannel/UpdateableHandler.h
@@ -0,0 +1,60 @@
+// -*- C++ -*-
+
+//=============================================================================
+/**
+ * @file UpdateableHandler.h
+ *
+ * $Id$
+ *
+ * @author Huang-Ming Huang <hh1@cse.wustl.edu>
+ */
+//=============================================================================
+
+#ifndef UPDATEABLEHANDLER_H
+#define UPDATEABLEHANDLER_H
+#include "orbsvcs/FTRTS.h"
+
+#if !defined (ACE_LACKS_PRAGMA_ONCE)
+# pragma once
+#endif /* ACE_LACKS_PRAGMA_ONCE */
+
+TAO_BEGIN_VERSIONED_NAMESPACE_DECL
+
+class AMI_Primary_Replication_Strategy;
+class Update_Manager;
+
+class UpdateableHandler : public POA_FTRT::AMI_UpdateableHandler
+{
+public:
+ UpdateableHandler(AMI_Primary_Replication_Strategy* strategy);
+ ~UpdateableHandler();
+
+ FTRT::AMI_UpdateableHandler_ptr activate(
+ Update_Manager* mgr, int id,
+ PortableServer::ObjectId& oid
+ ACE_ENV_ARG_DECL);
+ typedef void (Update_Manager::*Handler)(int);
+
+ void dispatch(Handler handler ACE_ENV_ARG_DECL) ;
+
+ virtual void set_update (
+ ACE_ENV_SINGLE_ARG_DECL
+ )
+ ACE_THROW_SPEC ((
+ CORBA::SystemException
+ ));
+ virtual void set_update_excep (
+ ::Messaging::ExceptionHolder * excep_holder
+ ACE_ENV_ARG_DECL
+ )
+ ACE_THROW_SPEC ((
+ CORBA::SystemException
+ ));
+
+private:
+ AMI_Primary_Replication_Strategy* strategy_;
+};
+
+TAO_END_VERSIONED_NAMESPACE_DECL
+
+#endif
diff --git a/TAO/orbsvcs/orbsvcs/FtRtEvent/EventChannel/create_persistent_poa.cpp b/TAO/orbsvcs/orbsvcs/FtRtEvent/EventChannel/create_persistent_poa.cpp
new file mode 100644
index 00000000000..fe5cd5dbe41
--- /dev/null
+++ b/TAO/orbsvcs/orbsvcs/FtRtEvent/EventChannel/create_persistent_poa.cpp
@@ -0,0 +1,49 @@
+// $Id$
+
+#include "orbsvcs/FtRtEvent/EventChannel/create_persistent_poa.h"
+
+ACE_RCSID (EventChannel,
+ create_persistent_poa,
+ "$Id$")
+
+TAO_BEGIN_VERSIONED_NAMESPACE_DECL
+
+PortableServer::POA_var create_persistent_poa(PortableServer::POA_var root_poa,
+ PortableServer::POAManager_var mgr,
+ const char* name,
+ CORBA::PolicyList& policy_list
+ ACE_ENV_ARG_DECL)
+{
+ PortableServer::POA_var result;
+ PortableServer::LifespanPolicy_var lifespan =
+ root_poa->create_lifespan_policy(PortableServer::PERSISTENT
+ ACE_ENV_ARG_PARAMETER);
+ ACE_CHECK_RETURN(result);
+
+ // create a USER_ID IdAssignmentPolicy object
+ PortableServer::IdAssignmentPolicy_var assign =
+ root_poa->create_id_assignment_policy(PortableServer::USER_ID
+ ACE_ENV_ARG_PARAMETER);
+ ACE_CHECK_RETURN(result);
+
+ // create PolicyList.
+ size_t orig_len = policy_list.length();
+ policy_list.length(orig_len+2);
+ ACE_CHECK_RETURN(result);
+ policy_list[orig_len+0]=
+ PortableServer::LifespanPolicy::_duplicate(lifespan.in());
+ ACE_CHECK_RETURN(result);
+ policy_list[orig_len+1]=
+ PortableServer::IdAssignmentPolicy::_duplicate(assign.in());
+ ACE_CHECK_RETURN(result);
+
+ // create the child POA
+ result = root_poa->create_POA(name, mgr.in(), policy_list
+ ACE_ENV_ARG_PARAMETER);
+
+ ACE_CHECK_RETURN(result);
+
+ return result;
+}
+
+TAO_END_VERSIONED_NAMESPACE_DECL
diff --git a/TAO/orbsvcs/orbsvcs/FtRtEvent/EventChannel/create_persistent_poa.h b/TAO/orbsvcs/orbsvcs/FtRtEvent/EventChannel/create_persistent_poa.h
new file mode 100644
index 00000000000..cd41683ea61
--- /dev/null
+++ b/TAO/orbsvcs/orbsvcs/FtRtEvent/EventChannel/create_persistent_poa.h
@@ -0,0 +1,30 @@
+// -*- C++ -*-
+
+//=============================================================================
+/**
+ * @file create_persistent_poa.h
+ *
+ * $Id$
+ *
+ * @author Huang-Ming Huang <hh1@cse.wustl.edu>
+ */
+//=============================================================================
+#ifndef CREATE_PERSISTENT_POA_H
+#define CREATE_PERSISTENT_POA_H
+#include "tao/PortableServer/PortableServer.h"
+
+#if !defined (ACE_LACKS_PRAGMA_ONCE)
+# pragma once
+#endif /* ACE_LACKS_PRAGMA_ONCE */
+
+TAO_BEGIN_VERSIONED_NAMESPACE_DECL
+
+PortableServer::POA_var create_persistent_poa(PortableServer::POA_var root_poa,
+ PortableServer::POAManager_var mgr,
+ const char* name,
+ CORBA::PolicyList& policy_list
+ ACE_ENV_ARG_DECL);
+
+TAO_END_VERSIONED_NAMESPACE_DECL
+
+#endif
diff --git a/TAO/orbsvcs/orbsvcs/FtRtEvent/EventChannel/ftrtec_export.h b/TAO/orbsvcs/orbsvcs/FtRtEvent/EventChannel/ftrtec_export.h
new file mode 100644
index 00000000000..2c404b4a134
--- /dev/null
+++ b/TAO/orbsvcs/orbsvcs/FtRtEvent/EventChannel/ftrtec_export.h
@@ -0,0 +1,60 @@
+
+// -*- C++ -*-
+// $Id$
+// Definition for Win32 Export directives.
+// This file is generated automatically by generate_export_file.pl TAO_FTRTEC
+// ------------------------------
+#ifndef TAO_FTRTEC_EXPORT_H
+#define TAO_FTRTEC_EXPORT_H
+
+#include "ace/config-all.h"
+
+#if defined (TAO_AS_STATIC_LIBS)
+# if !defined (TAO_FTRTEC_HAS_DLL)
+# define TAO_FTRTEC_HAS_DLL 0
+# endif /* ! TAO_FTRTEC_HAS_DLL */
+#else
+# if !defined (TAO_FTRTEC_HAS_DLL)
+# define TAO_FTRTEC_HAS_DLL 1
+# endif /* ! TAO_FTRTEC_HAS_DLL */
+#endif
+
+#if defined (TAO_FTRTEC_HAS_DLL) && (TAO_FTRTEC_HAS_DLL == 1)
+# if defined (TAO_FTRTEC_BUILD_DLL)
+# define TAO_FTRTEC_Export ACE_Proper_Export_Flag
+# define TAO_FTRTEC_SINGLETON_DECLARATION(T) ACE_EXPORT_SINGLETON_DECLARATION (T)
+# define TAO_FTRTEC_SINGLETON_DECLARE(SINGLETON_TYPE, CLASS, LOCK) ACE_EXPORT_SINGLETON_DECLARE(SINGLETON_TYPE, CLASS, LOCK)
+# else /* TAO_FTRTEC_BUILD_DLL */
+# define TAO_FTRTEC_Export ACE_Proper_Import_Flag
+# define TAO_FTRTEC_SINGLETON_DECLARATION(T) ACE_IMPORT_SINGLETON_DECLARATION (T)
+# define TAO_FTRTEC_SINGLETON_DECLARE(SINGLETON_TYPE, CLASS, LOCK) ACE_IMPORT_SINGLETON_DECLARE(SINGLETON_TYPE, CLASS, LOCK)
+# endif /* TAO_FTRTEC_BUILD_DLL */
+#else /* TAO_FTRTEC_HAS_DLL == 1 */
+# define TAO_FTRTEC_Export
+# define TAO_FTRTEC_SINGLETON_DECLARATION(T)
+# define TAO_FTRTEC_SINGLETON_DECLARE(SINGLETON_TYPE, CLASS, LOCK)
+#endif /* TAO_FTRTEC_HAS_DLL == 1 */
+
+// Set TAO_FTRTEC_NTRACE = 0 to turn on library specific tracing even if
+// tracing is turned off for ACE.
+#if !defined (TAO_FTRTEC_NTRACE)
+# if (ACE_NTRACE == 1)
+# define TAO_FTRTEC_NTRACE 1
+# else /* (ACE_NTRACE == 1) */
+# define TAO_FTRTEC_NTRACE 0
+# endif /* (ACE_NTRACE == 1) */
+#endif /* !TAO_FTRTEC_NTRACE */
+
+#if (TAO_FTRTEC_NTRACE == 1)
+# define TAO_FTRTEC_TRACE(X)
+#else /* (TAO_FTRTEC_NTRACE == 1) */
+# if !defined (ACE_HAS_TRACE)
+# define ACE_HAS_TRACE
+# endif /* ACE_HAS_TRACE */
+# define TAO_FTRTEC_TRACE(X) ACE_TRACE_IMPL(X)
+# include "ace/Trace.h"
+#endif /* (TAO_FTRTEC_NTRACE == 1) */
+
+#endif /* TAO_FTRTEC_EXPORT_H */
+
+// End of auto generated file.
diff --git a/TAO/orbsvcs/orbsvcs/FtRtEvent/EventChannel/replace_key.cpp b/TAO/orbsvcs/orbsvcs/FtRtEvent/EventChannel/replace_key.cpp
new file mode 100644
index 00000000000..8b902ac91bc
--- /dev/null
+++ b/TAO/orbsvcs/orbsvcs/FtRtEvent/EventChannel/replace_key.cpp
@@ -0,0 +1,35 @@
+#include "ace/OS_NS_string.h"
+#include "ace/Log_Msg.h"
+#include "tao/Object_KeyC.h"
+#include <algorithm>
+
+ACE_RCSID (EventChannel,
+ replace_key,
+ "$Id$")
+
+
+/// This function was defined in IOGR_Maker.cpp. It is moved
+/// here because the use of <algorithm> header
+/// file conflicts with the use of auto_ptr in the
+/// VxWorks5.5.1_PPC85XX_DIAB platform.
+
+TAO_BEGIN_VERSIONED_NAMESPACE_DECL
+
+void replace_key(char* ior, char* end_ior,
+ const TAO::ObjectKey& oldkey,
+ const TAO::ObjectKey& newkey)
+{
+ size_t keylen = oldkey.length();
+ ACE_ASSERT(keylen == newkey.length());
+
+ char* pos = ior;
+ const char* oldkey_begin = (const char*)oldkey.get_buffer();
+ const char* oldkey_end = oldkey_begin + keylen;
+
+ while ((pos = std::search(pos, end_ior,oldkey_begin, oldkey_end)) != end_ior) {
+ ACE_OS::memcpy(pos, newkey.get_buffer(), keylen);
+ pos+= keylen;
+ }
+}
+
+TAO_END_VERSIONED_NAMESPACE_DECL
diff --git a/TAO/orbsvcs/orbsvcs/FtRtEvent/Utils/FTEC_Gateway.cpp b/TAO/orbsvcs/orbsvcs/FtRtEvent/Utils/FTEC_Gateway.cpp
new file mode 100644
index 00000000000..afbbaf3d051
--- /dev/null
+++ b/TAO/orbsvcs/orbsvcs/FtRtEvent/Utils/FTEC_Gateway.cpp
@@ -0,0 +1,523 @@
+#include "orbsvcs/FtRtEvent/Utils/FTEC_Gateway.h"
+#include "orbsvcs/FtRtEvent/Utils/activate_with_id.h"
+#include "orbsvcs/FtRtEvent/Utils/UUID.h"
+#include "orbsvcs/FtRtEvent/Utils/resolve_init.h"
+#include "orbsvcs/FtRtecEventCommS.h"
+#include "tao/ORB_Core.h"
+
+ACE_RCSID (Utils,
+ FTEC_Gateway,
+ "$Id$")
+
+#if !defined(__ACE_INLINE__)
+#include "orbsvcs/FtRtEvent/Utils/FTEC_Gateway.inl"
+#endif /* __ACE_INLINE__ */
+
+TAO_BEGIN_VERSIONED_NAMESPACE_DECL
+
+namespace TAO_FTRTEC {
+class FTEC_Gateway_ConsumerAdmin
+ : public POA_RtecEventChannelAdmin::ConsumerAdmin
+{
+public:
+ FTEC_Gateway_ConsumerAdmin(FTEC_Gateway_Impl* impl);
+ ~FTEC_Gateway_ConsumerAdmin();
+ // = The RtecEventChannelAdmin::ConsumerAdmin methods...
+ virtual RtecEventChannelAdmin::ProxyPushSupplier_ptr
+ obtain_push_supplier (ACE_ENV_SINGLE_ARG_DECL_NOT_USED)
+ ACE_THROW_SPEC ((CORBA::SystemException));
+ FTEC_Gateway_Impl* impl_;
+};
+
+class FTEC_Gateway_SupplierAdmin
+ : public POA_RtecEventChannelAdmin::SupplierAdmin
+{
+public:
+ FTEC_Gateway_SupplierAdmin(FTEC_Gateway_Impl* impl);
+ ~FTEC_Gateway_SupplierAdmin();
+ // = The RtecEventChannelAdmin::SupplierAdmin methods...
+ virtual RtecEventChannelAdmin::ProxyPushConsumer_ptr
+ obtain_push_consumer (ACE_ENV_SINGLE_ARG_DECL_NOT_USED)
+ ACE_THROW_SPEC ((CORBA::SystemException));
+ FTEC_Gateway_Impl* impl_;
+};
+
+class FTEC_Gateway_ProxyPushSupplier
+ : public POA_RtecEventChannelAdmin::ProxyPushSupplier
+{
+public:
+ FTEC_Gateway_ProxyPushSupplier(FTEC_Gateway_Impl* impl);
+ ~FTEC_Gateway_ProxyPushSupplier();
+ // = The RtecEventChannelAdmin::ProxyPushSupplier methods...
+ virtual void connect_push_consumer (
+ RtecEventComm::PushConsumer_ptr push_consumer,
+ const RtecEventChannelAdmin::ConsumerQOS &qos
+ ACE_ENV_ARG_DECL_NOT_USED)
+ ACE_THROW_SPEC ((CORBA::SystemException,
+ RtecEventChannelAdmin::AlreadyConnected,
+ RtecEventChannelAdmin::TypeError));
+ virtual void disconnect_push_supplier (ACE_ENV_SINGLE_ARG_DECL_NOT_USED)
+ ACE_THROW_SPEC ((CORBA::SystemException));
+ virtual void suspend_connection (ACE_ENV_SINGLE_ARG_DECL_NOT_USED)
+ ACE_THROW_SPEC ((CORBA::SystemException));
+ virtual void resume_connection (ACE_ENV_SINGLE_ARG_DECL_NOT_USED)
+ ACE_THROW_SPEC ((CORBA::SystemException));
+ FTEC_Gateway_Impl* impl_;
+};
+
+class FTEC_Gateway_ProxyPushConsumer
+ : public POA_RtecEventChannelAdmin::ProxyPushConsumer
+{
+public:
+ FTEC_Gateway_ProxyPushConsumer(FTEC_Gateway_Impl* impl);
+ ~FTEC_Gateway_ProxyPushConsumer();
+
+ virtual void push (const RtecEventComm::EventSet & data
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS)
+ ACE_THROW_SPEC ((CORBA::SystemException));
+ // = The RtecEventChannelAdmin::ProxyPushConsumer methods...
+ virtual void connect_push_supplier (
+ RtecEventComm::PushSupplier_ptr push_supplier,
+ const RtecEventChannelAdmin::SupplierQOS& qos
+ ACE_ENV_ARG_DECL_NOT_USED)
+ ACE_THROW_SPEC ((CORBA::SystemException,
+ RtecEventChannelAdmin::AlreadyConnected));
+ virtual void disconnect_push_consumer (ACE_ENV_SINGLE_ARG_DECL_NOT_USED)
+ ACE_THROW_SPEC ((CORBA::SystemException));
+
+ FTEC_Gateway_Impl* impl_;
+};
+
+class PushConsumerHandler : public POA_FtRtecEventComm::AMI_PushConsumerHandler
+{
+public:
+ PushConsumerHandler();
+ ~PushConsumerHandler();
+ virtual void push (ACE_ENV_SINGLE_ARG_DECL)
+ ACE_THROW_SPEC ((CORBA::SystemException));
+
+ virtual void push_excep (::Messaging::ExceptionHolder * excep_holder ACE_ENV_ARG_DECL)
+ ACE_THROW_SPEC ((CORBA::SystemException));
+};
+
+/**
+ * This is used for remove the interceptors registered in the ORB.
+ */
+class Interceptor_Destoryer : public TAO_ORB_Core
+{
+public:
+ inline static void execute(CORBA::ORB_ptr orb ACE_ENV_ARG_DECL) {
+ static_cast<Interceptor_Destoryer*> (orb->orb_core())->do_it(ACE_ENV_SINGLE_ARG_PARAMETER);
+ }
+private:
+ Interceptor_Destoryer();
+ inline void do_it(ACE_ENV_SINGLE_ARG_DECL) {
+ destroy_interceptors(ACE_ENV_SINGLE_ARG_PARAMETER);
+ };
+};
+
+struct FTEC_Gateway_Impl
+{
+ CORBA::ORB_var orb;
+ PortableServer::POA_var poa;
+ FtRtecEventChannelAdmin::EventChannel_var ftec;
+ RtecEventChannelAdmin::ConsumerAdmin_var consumer_admin;
+ RtecEventChannelAdmin::SupplierAdmin_var supplier_admin;
+ FTEC_Gateway_ConsumerAdmin consumer_admin_servant;
+ FTEC_Gateway_SupplierAdmin supplier_admin_servant;
+ FTEC_Gateway_ProxyPushSupplier proxy_supplier_servant;
+ FTEC_Gateway_ProxyPushConsumer proxy_consumer_servant;
+ PushConsumerHandler push_handler_servant;
+ FtRtecEventComm::AMI_PushConsumerHandler_var push_handler;
+ bool local_orb;
+ FTEC_Gateway_Impl();
+};
+
+FTEC_Gateway_Impl::FTEC_Gateway_Impl()
+: consumer_admin_servant(this),
+ supplier_admin_servant(this),
+ proxy_supplier_servant(this),
+ proxy_consumer_servant(this)
+{
+}
+
+FTEC_Gateway::FTEC_Gateway(CORBA::ORB_ptr orb, FtRtecEventChannelAdmin::EventChannel_ptr ftec)
+: impl_(new FTEC_Gateway_Impl)
+{
+ impl_->local_orb = CORBA::is_nil(orb);
+ if (!impl_->local_orb)
+ impl_->orb = CORBA::ORB::_duplicate(orb);
+ impl_->ftec = FtRtecEventChannelAdmin::EventChannel::_duplicate(ftec);
+}
+
+FTEC_Gateway::~FTEC_Gateway()
+{
+ if (impl_->local_orb)
+ impl_->orb->shutdown();
+ delete impl_;
+}
+
+RtecEventChannelAdmin::EventChannel_ptr
+FTEC_Gateway::activate(PortableServer::POA_ptr root_poa ACE_ENV_ARG_DECL)
+{
+ PortableServer::POA_var poa;
+ PortableServer::POAManager_var mgr;
+
+ if (impl_->local_orb) {
+ int argc = 0;
+ char** argv = 0;
+ impl_->orb = CORBA::ORB_init(argc, argv, "FTEC_GatewayORB"
+ ACE_ENV_ARG_PARAMETER);
+ ACE_CHECK_RETURN(0);
+
+ Interceptor_Destoryer::execute(impl_->orb.in() ACE_ENV_ARG_PARAMETER);
+
+ poa = resolve_init<PortableServer::POA>(impl_->orb.in(), "RootPOA"
+ ACE_ENV_ARG_PARAMETER);
+ ACE_CHECK_RETURN(0);
+
+ mgr = poa->the_POAManager(ACE_ENV_SINGLE_ARG_PARAMETER);
+ ACE_CHECK_RETURN(0);
+
+ mgr->activate(ACE_ENV_SINGLE_ARG_PARAMETER);
+ }
+ else {
+ poa = PortableServer::POA::_duplicate(root_poa);
+ mgr = poa->the_POAManager(ACE_ENV_SINGLE_ARG_PARAMETER);
+ }
+ ACE_CHECK_RETURN(0);
+
+ PortableServer::IdUniquenessPolicy_var id_uniqueness_policy =
+ poa->create_id_uniqueness_policy(PortableServer::MULTIPLE_ID
+ ACE_ENV_ARG_PARAMETER);
+ ACE_CHECK_RETURN(0);
+
+ PortableServer::LifespanPolicy_var lifespan =
+ poa->create_lifespan_policy(PortableServer::PERSISTENT
+ ACE_ENV_ARG_PARAMETER);
+ ACE_CHECK_RETURN(0);
+
+ // create a USER_ID IdAssignmentPolicy object
+ PortableServer::IdAssignmentPolicy_var assign =
+ poa->create_id_assignment_policy(PortableServer::USER_ID
+ ACE_ENV_ARG_PARAMETER);
+ ACE_CHECK_RETURN(0);
+
+ CORBA::PolicyList policy_list;
+ policy_list.length(3);
+
+ policy_list[0] = PortableServer::IdUniquenessPolicy::_duplicate(
+ id_uniqueness_policy.in());
+ policy_list[1]=
+ PortableServer::LifespanPolicy::_duplicate(lifespan.in());
+ policy_list[2]=
+ PortableServer::IdAssignmentPolicy::_duplicate(assign.in());
+
+ impl_->poa = poa->create_POA("gateway_poa", mgr.in(), policy_list
+ ACE_ENV_ARG_PARAMETER);
+ ACE_CHECK_RETURN(0);
+
+ id_uniqueness_policy->destroy();
+ lifespan->destroy();
+ assign->destroy();
+
+ FtRtecEventComm::ObjectId oid;
+ oid.length(16);
+ UUID::create(oid.get_buffer());
+
+ RtecEventChannelAdmin::EventChannel_var gateway;
+
+ activate_object_with_id(gateway.out(), impl_->poa.in(), this, oid ACE_ENV_ARG_PARAMETER);
+ ACE_CHECK_RETURN(0);
+ ++oid[9];
+ activate_object_with_id(impl_->consumer_admin.out(),
+ impl_->poa.in(),
+ &impl_->consumer_admin_servant,
+ oid ACE_ENV_ARG_PARAMETER);
+ ACE_CHECK_RETURN(0);
+ ++oid[9];
+ activate_object_with_id(impl_->supplier_admin.out(),
+ impl_->poa.in(),
+ &impl_->supplier_admin_servant,
+ oid ACE_ENV_ARG_PARAMETER);
+ ACE_CHECK_RETURN(0);
+
+ return gateway._retn();
+}
+
+//= The RtecEventChannelAdmin::EventChannel methods
+RtecEventChannelAdmin::ConsumerAdmin_ptr
+FTEC_Gateway::for_consumers (ACE_ENV_SINGLE_ARG_DECL_NOT_USED)
+ACE_THROW_SPEC ((CORBA::SystemException))
+{
+ return RtecEventChannelAdmin::ConsumerAdmin::_duplicate(impl_->consumer_admin.in());
+}
+
+RtecEventChannelAdmin::SupplierAdmin_ptr
+FTEC_Gateway::for_suppliers (ACE_ENV_SINGLE_ARG_DECL_NOT_USED)
+ACE_THROW_SPEC ((CORBA::SystemException))
+{
+ ACE_DEBUG((LM_DEBUG, "FTEC_Gateway::for_suppliers\n"));
+ return RtecEventChannelAdmin::SupplierAdmin::_duplicate(impl_->supplier_admin.in());
+}
+
+void FTEC_Gateway::destroy (ACE_ENV_SINGLE_ARG_DECL_NOT_USED)
+ACE_THROW_SPEC ((CORBA::SystemException))
+{
+ impl_->ftec->destroy();
+}
+
+RtecEventChannelAdmin::Observer_Handle
+FTEC_Gateway::append_observer (RtecEventChannelAdmin::Observer_ptr observer
+ ACE_ENV_ARG_DECL)
+ ACE_THROW_SPEC ((
+ CORBA::SystemException,
+ RtecEventChannelAdmin::EventChannel::SYNCHRONIZATION_ERROR,
+ RtecEventChannelAdmin::EventChannel::CANT_APPEND_OBSERVER))
+{
+ return impl_->ftec->append_observer(observer ACE_ENV_ARG_PARAMETER);
+}
+
+void FTEC_Gateway::remove_observer (RtecEventChannelAdmin::Observer_Handle handle
+ ACE_ENV_ARG_DECL)
+ ACE_THROW_SPEC ((
+ CORBA::SystemException,
+ RtecEventChannelAdmin::EventChannel::SYNCHRONIZATION_ERROR,
+ RtecEventChannelAdmin::EventChannel::CANT_REMOVE_OBSERVER))
+{
+ impl_->ftec->remove_observer(handle ACE_ENV_ARG_PARAMETER);
+}
+
+void FTEC_Gateway::push(RtecEventChannelAdmin::ProxyPushConsumer_ptr proxy_consumer,
+ const RtecEventComm::EventSet & data
+ ACE_ENV_ARG_DECL)
+{
+ PortableServer::ObjectId_var object_id =
+ impl_->poa->reference_to_id(proxy_consumer ACE_ENV_ARG_PARAMETER);
+ ACE_CHECK;
+ FtRtecEventComm::ObjectId** result;
+ memcpy(&result, &object_id[0], sizeof(FtRtecEventComm::ObjectId**));
+
+ impl_->ftec->push(**result, data ACE_ENV_ARG_PARAMETER);
+ ACE_CHECK;
+}
+
+
+/// FTEC_Gateway_ConsumerAdmin
+
+FTEC_Gateway_ConsumerAdmin::FTEC_Gateway_ConsumerAdmin(FTEC_Gateway_Impl* impl)
+: impl_(impl)
+{
+}
+
+FTEC_Gateway_ConsumerAdmin::~FTEC_Gateway_ConsumerAdmin()
+{
+}
+
+RtecEventChannelAdmin::ProxyPushSupplier_ptr
+FTEC_Gateway_ConsumerAdmin::obtain_push_supplier (ACE_ENV_SINGLE_ARG_DECL)
+ACE_THROW_SPEC ((CORBA::SystemException))
+{
+
+ FtRtecEventComm::ObjectId** remote_proxy_oid_ptr;
+ ACE_NEW_THROW_EX(remote_proxy_oid_ptr, FtRtecEventComm::ObjectId*, CORBA::NO_MEMORY());
+
+ FtRtecEventComm::ObjectId local_oid;
+ local_oid.length(sizeof(remote_proxy_oid_ptr));
+ memcpy(&local_oid[0], &remote_proxy_oid_ptr, sizeof(remote_proxy_oid_ptr));
+
+ RtecEventChannelAdmin::ProxyPushSupplier_ptr result;
+ activate_object_with_id(result, impl_->poa.in(),
+ &impl_->proxy_supplier_servant,
+ local_oid ACE_ENV_ARG_PARAMETER);
+ return result;
+}
+
+/// FTEC_Gateway_SupplierAdmin
+
+FTEC_Gateway_SupplierAdmin::FTEC_Gateway_SupplierAdmin(FTEC_Gateway_Impl* impl)
+: impl_(impl)
+{
+}
+
+FTEC_Gateway_SupplierAdmin::~FTEC_Gateway_SupplierAdmin()
+{
+}
+
+// = The RtecEventChannelAdmin::SupplierAdmin methods...
+RtecEventChannelAdmin::ProxyPushConsumer_ptr
+FTEC_Gateway_SupplierAdmin::obtain_push_consumer (ACE_ENV_SINGLE_ARG_DECL)
+ACE_THROW_SPEC ((CORBA::SystemException))
+{
+ FtRtecEventComm::ObjectId** remote_proxy_oid_ptr;
+ ACE_NEW_THROW_EX(remote_proxy_oid_ptr, FtRtecEventComm::ObjectId*, CORBA::NO_MEMORY());
+
+ FtRtecEventComm::ObjectId local_oid;
+ local_oid.length(sizeof(remote_proxy_oid_ptr));
+ memcpy(&local_oid[0], &remote_proxy_oid_ptr, sizeof(remote_proxy_oid_ptr));
+
+ RtecEventChannelAdmin::ProxyPushConsumer_ptr result;
+ activate_object_with_id(result, impl_->poa.in(),
+ &impl_->proxy_consumer_servant,
+ local_oid ACE_ENV_ARG_PARAMETER);
+ return result;
+}
+
+
+FtRtecEventComm::ObjectId**
+get_remote_oid_ptr(CORBA::ORB_ptr orb ACE_ENV_ARG_DECL)
+{
+ PortableServer::Current_var current =
+ resolve_init<PortableServer::Current>(orb,
+ "POACurrent"
+ ACE_ENV_ARG_PARAMETER);
+ ACE_CHECK_RETURN(0);
+
+ PortableServer::ObjectId_var object_id =
+ current->get_object_id(ACE_ENV_SINGLE_ARG_PARAMETER);
+ ACE_CHECK_RETURN(0);
+
+ FtRtecEventComm::ObjectId** result;
+ memcpy(&result, &object_id[0], sizeof(FtRtecEventComm::ObjectId**));
+ return result;
+}
+
+/// FTEC_Gateway_ProxyPushSupplier
+
+FTEC_Gateway_ProxyPushSupplier::FTEC_Gateway_ProxyPushSupplier(FTEC_Gateway_Impl* impl)
+: impl_(impl)
+{
+}
+
+FTEC_Gateway_ProxyPushSupplier::~FTEC_Gateway_ProxyPushSupplier()
+{
+}
+
+
+// = The RtecEventChannelAdmin::ProxyPushSupplier methods...
+void FTEC_Gateway_ProxyPushSupplier::connect_push_consumer (
+ RtecEventComm::PushConsumer_ptr push_consumer,
+ const RtecEventChannelAdmin::ConsumerQOS &qos
+ ACE_ENV_ARG_DECL)
+ ACE_THROW_SPEC ((CORBA::SystemException,
+ RtecEventChannelAdmin::AlreadyConnected,
+ RtecEventChannelAdmin::TypeError))
+{
+
+ FtRtecEventComm::ObjectId** oid_ptr = get_remote_oid_ptr(impl_->orb.in() ACE_ENV_ARG_PARAMETER);
+ ACE_CHECK;
+
+ *oid_ptr = impl_->ftec->connect_push_consumer(push_consumer, qos ACE_ENV_ARG_PARAMETER);
+ ACE_CHECK;
+}
+
+void FTEC_Gateway_ProxyPushSupplier::disconnect_push_supplier (ACE_ENV_SINGLE_ARG_DECL)
+ ACE_THROW_SPEC ((CORBA::SystemException))
+{
+ FtRtecEventComm::ObjectId** oid_ptr = get_remote_oid_ptr(impl_->orb.in() ACE_ENV_ARG_PARAMETER);
+ ACE_CHECK;
+ impl_->ftec->disconnect_push_supplier(**oid_ptr ACE_ENV_ARG_PARAMETER);
+ ACE_CHECK;
+ delete *oid_ptr;
+ delete oid_ptr;
+}
+
+void FTEC_Gateway_ProxyPushSupplier::suspend_connection (ACE_ENV_SINGLE_ARG_DECL)
+ ACE_THROW_SPEC ((CORBA::SystemException))
+{
+ FtRtecEventComm::ObjectId** oid_ptr = get_remote_oid_ptr(impl_->orb.in() ACE_ENV_ARG_PARAMETER);
+ ACE_CHECK;
+ impl_->ftec->suspend_push_supplier(**oid_ptr ACE_ENV_ARG_PARAMETER);
+ ACE_CHECK;
+}
+
+void FTEC_Gateway_ProxyPushSupplier::resume_connection (ACE_ENV_SINGLE_ARG_DECL)
+ ACE_THROW_SPEC ((CORBA::SystemException))
+{
+ FtRtecEventComm::ObjectId** oid_ptr = get_remote_oid_ptr(impl_->orb.in() ACE_ENV_ARG_PARAMETER);
+ ACE_CHECK;
+ impl_->ftec->resume_push_supplier(**oid_ptr ACE_ENV_ARG_PARAMETER);
+ ACE_CHECK;
+}
+
+/// FTEC_Gateway_ProxyPushConsumer
+
+FTEC_Gateway_ProxyPushConsumer::FTEC_Gateway_ProxyPushConsumer(FTEC_Gateway_Impl* impl)
+: impl_(impl)
+{
+}
+
+FTEC_Gateway_ProxyPushConsumer::~FTEC_Gateway_ProxyPushConsumer()
+{
+}
+
+
+// = The RtecEventChannelAdmin::ProxyPushConsumer methods...
+
+void FTEC_Gateway_ProxyPushConsumer::push (const RtecEventComm::EventSet & data
+ ACE_ENV_ARG_DECL)
+ ACE_THROW_SPEC ((CORBA::SystemException))
+{
+ FtRtecEventComm::ObjectId** oid_ptr = get_remote_oid_ptr(impl_->orb.in() ACE_ENV_ARG_PARAMETER);
+ ACE_CHECK;
+
+ /*
+ if (CORBA::is_nil(impl_->push_handler.in())) {
+ impl_->push_handler = impl_->push_handler_servant._this(ACE_ENV_SINGLE_ARG_PARAMETER);
+ ACE_CHECK;
+ }
+
+ impl_->ftec->sendc_push (impl_->push_handler.in(),
+ **oid_ptr,
+ data ACE_ENV_ARG_PARAMETER);
+ */
+ impl_->ftec->push(**oid_ptr, data ACE_ENV_ARG_PARAMETER);
+ ACE_CHECK;
+}
+
+void FTEC_Gateway_ProxyPushConsumer::connect_push_supplier (
+ RtecEventComm::PushSupplier_ptr push_supplier,
+ const RtecEventChannelAdmin::SupplierQOS& qos
+ ACE_ENV_ARG_DECL)
+ ACE_THROW_SPEC ((CORBA::SystemException,
+ RtecEventChannelAdmin::AlreadyConnected))
+{
+ FtRtecEventComm::ObjectId** oid_ptr = get_remote_oid_ptr(impl_->orb.in() ACE_ENV_ARG_PARAMETER);
+ ACE_CHECK;
+ *oid_ptr = impl_->ftec->connect_push_supplier(push_supplier, qos ACE_ENV_ARG_PARAMETER);
+ ACE_CHECK;
+}
+
+void FTEC_Gateway_ProxyPushConsumer::disconnect_push_consumer (ACE_ENV_SINGLE_ARG_DECL)
+ ACE_THROW_SPEC ((CORBA::SystemException))
+{
+ FtRtecEventComm::ObjectId** oid_ptr = get_remote_oid_ptr(impl_->orb.in() ACE_ENV_ARG_PARAMETER);
+ ACE_CHECK;
+ impl_->ftec->disconnect_push_consumer(**oid_ptr ACE_ENV_ARG_PARAMETER);
+ ACE_CHECK;
+ delete *oid_ptr;
+ delete oid_ptr;
+}
+
+PushConsumerHandler::PushConsumerHandler()
+{
+}
+
+PushConsumerHandler::~PushConsumerHandler()
+{
+}
+
+void PushConsumerHandler::push (ACE_ENV_SINGLE_ARG_DECL_NOT_USED)
+ ACE_THROW_SPEC ((CORBA::SystemException))
+{
+}
+
+void PushConsumerHandler::push_excep (::Messaging::ExceptionHolder *
+ ACE_ENV_ARG_DECL_NOT_USED)
+ ACE_THROW_SPEC ((CORBA::SystemException))
+{
+}
+
+} // TAO_FTRTEC
+
+TAO_END_VERSIONED_NAMESPACE_DECL
diff --git a/TAO/orbsvcs/orbsvcs/FtRtEvent/Utils/FTEC_Gateway.h b/TAO/orbsvcs/orbsvcs/FtRtEvent/Utils/FTEC_Gateway.h
new file mode 100644
index 00000000000..3db7660c7ad
--- /dev/null
+++ b/TAO/orbsvcs/orbsvcs/FtRtEvent/Utils/FTEC_Gateway.h
@@ -0,0 +1,82 @@
+// -*- C++ -*-
+
+//=============================================================================
+/**
+ * @file FTEC_Gateway.h
+ *
+ * $Id$
+ *
+ * @author Huang-Ming Huang <hh1@cse.wustl.edu>
+ */
+//=============================================================================
+#ifndef FTEC_GATEWAY_H
+#define FTEC_GATEWAY_H
+
+#include /**/ "ace/pre.h"
+
+#include "orbsvcs/FtRtecEventChannelAdminC.h"
+#include "orbsvcs/RtecEventChannelAdminS.h"
+
+TAO_BEGIN_VERSIONED_NAMESPACE_DECL
+
+namespace TAO_FTRTEC
+{
+ struct FTEC_Gateway_Impl;
+ class TAO_FtRtEvent_Export FTEC_Gateway :
+ public POA_RtecEventChannelAdmin::EventChannel
+ {
+ public:
+ FTEC_Gateway(CORBA::ORB_ptr orb,
+ FtRtecEventChannelAdmin::EventChannel_ptr ftec);
+ ~FTEC_Gateway();
+
+ RtecEventChannelAdmin::EventChannel_ptr activate
+ (PortableServer::POA_ptr poa
+ ACE_ENV_ARG_DECL);
+
+ RtecEventChannelAdmin::EventChannel_ptr
+ _this(ACE_ENV_SINGLE_ARG_DECL);
+
+ //= The RtecEventChannelAdmin::EventChannel methods
+ virtual RtecEventChannelAdmin::ConsumerAdmin_ptr
+ for_consumers (ACE_ENV_SINGLE_ARG_DECL)
+ ACE_THROW_SPEC((CORBA::SystemException));
+
+ virtual RtecEventChannelAdmin::SupplierAdmin_ptr
+ for_suppliers (ACE_ENV_SINGLE_ARG_DECL)
+ ACE_THROW_SPEC((CORBA::SystemException));
+
+ virtual void destroy (ACE_ENV_SINGLE_ARG_DECL_NOT_USED)
+ ACE_THROW_SPEC((CORBA::SystemException));
+
+ virtual RtecEventChannelAdmin::Observer_Handle
+ append_observer
+ (RtecEventChannelAdmin::Observer_ptr observer
+ ACE_ENV_ARG_DECL) ACE_THROW_SPEC((
+ CORBA::SystemException,
+ RtecEventChannelAdmin::EventChannel::SYNCHRONIZATION_ERROR,
+ RtecEventChannelAdmin::EventChannel::CANT_APPEND_OBSERVER));
+
+ virtual void remove_observer
+ (RtecEventChannelAdmin::Observer_Handle
+ ACE_ENV_ARG_DECL) ACE_THROW_SPEC((
+ CORBA::SystemException,
+ RtecEventChannelAdmin::EventChannel::SYNCHRONIZATION_ERROR,
+ RtecEventChannelAdmin::EventChannel::CANT_REMOVE_OBSERVER));
+
+ void push(RtecEventChannelAdmin::ProxyPushConsumer_ptr proxy_consumer,
+ const RtecEventComm::EventSet & data
+ ACE_ENV_ARG_DECL);
+ private:
+ struct FTEC_Gateway_Impl *impl_;
+ };
+}
+
+TAO_END_VERSIONED_NAMESPACE_DECL
+
+#if defined(__ACE_INLINE__)
+#include "orbsvcs/FtRtEvent/Utils/FTEC_Gateway.inl"
+#endif /* __ACE_INLINE__ */
+
+#include /**/ "ace/post.h"
+#endif
diff --git a/TAO/orbsvcs/orbsvcs/FtRtEvent/Utils/FTEC_Gateway.inl b/TAO/orbsvcs/orbsvcs/FtRtEvent/Utils/FTEC_Gateway.inl
new file mode 100644
index 00000000000..4a4869aece4
--- /dev/null
+++ b/TAO/orbsvcs/orbsvcs/FtRtEvent/Utils/FTEC_Gateway.inl
@@ -0,0 +1,16 @@
+// -*- C++ -*-
+//
+// $Id$
+
+TAO_BEGIN_VERSIONED_NAMESPACE_DECL
+
+namespace TAO_FTRTEC {
+ ACE_INLINE RtecEventChannelAdmin::EventChannel_ptr
+ FTEC_Gateway::_this(ACE_ENV_SINGLE_ARG_DECL)
+ {
+ PortableServer::POA_var poa = _default_POA();
+ return activate(poa.in() ACE_ENV_ARG_PARAMETER);
+ }
+}
+
+TAO_END_VERSIONED_NAMESPACE_DECL
diff --git a/TAO/orbsvcs/orbsvcs/FtRtEvent/Utils/Log.cpp b/TAO/orbsvcs/orbsvcs/FtRtEvent/Utils/Log.cpp
new file mode 100644
index 00000000000..6319f696946
--- /dev/null
+++ b/TAO/orbsvcs/orbsvcs/FtRtEvent/Utils/Log.cpp
@@ -0,0 +1,29 @@
+//$Id$
+#include "orbsvcs/FtRtEvent/Utils/Log.h"
+
+#if !defined(__ACE_INLINE__)
+#include "orbsvcs/FtRtEvent/Utils/Log.inl"
+#endif /* __ACE_INLINE__ */
+
+TAO_BEGIN_VERSIONED_NAMESPACE_DECL
+
+namespace TAO_FTRTEC {
+
+unsigned int Log::log_level_;
+
+#ifndef NDEBUG
+ Log::Log (unsigned int log_level, const ACE_TCHAR* format, ...)
+ {
+ if (log_level_ >= log_level) {
+ va_list p;
+ va_start(p, format);
+ char str[1024];
+ ACE_OS::vsprintf(str, format, p);
+ ACE_DEBUG((LM_DEBUG, str));
+ va_end(p);
+ }
+ }
+#endif
+}
+
+TAO_END_VERSIONED_NAMESPACE_DECL
diff --git a/TAO/orbsvcs/orbsvcs/FtRtEvent/Utils/Log.h b/TAO/orbsvcs/orbsvcs/FtRtEvent/Utils/Log.h
new file mode 100644
index 00000000000..71b95a8a28e
--- /dev/null
+++ b/TAO/orbsvcs/orbsvcs/FtRtEvent/Utils/Log.h
@@ -0,0 +1,48 @@
+// -*- C++ -*-
+
+//=============================================================================
+/**
+ * @file Log.h
+ *
+ * $Id$
+ *
+ * @author Huang-Ming Huang <hh1@cse.wustl.edu>
+ */
+//=============================================================================
+#ifndef FTRTEC_LOG_H
+#define FTRTEC_LOG_H
+
+#include /**/ "ace/pre.h"
+#include "orbsvcs/FtRtEvent/Utils/ftrtevent_export.h"
+#include "tao/Versioned_Namespace.h"
+#include "ace/OS.h"
+#include "ace/Log_Msg.h"
+
+TAO_BEGIN_VERSIONED_NAMESPACE_DECL
+
+namespace TAO_FTRTEC {
+
+ /**
+ * A utility class for logging messages.
+ */
+ class TAO_FtRtEvent_Export Log
+ {
+ public:
+ Log (unsigned int log_level, const ACE_TCHAR* format, ...);
+ static void level(unsigned int log_level);
+ static unsigned int level();
+ static void hexdump(unsigned int log_level, const char* buf, size_t len, const char* msg);
+ private:
+ friend class Trace;
+ static unsigned log_level_;
+ };
+}
+
+TAO_END_VERSIONED_NAMESPACE_DECL
+
+#if defined(__ACE_INLINE__)
+#include "orbsvcs/FtRtEvent/Utils/Log.inl"
+#endif /* __ACE_INLINE__ */
+
+#include /**/ "ace/post.h"
+#endif
diff --git a/TAO/orbsvcs/orbsvcs/FtRtEvent/Utils/Log.inl b/TAO/orbsvcs/orbsvcs/FtRtEvent/Utils/Log.inl
new file mode 100644
index 00000000000..120a88f6557
--- /dev/null
+++ b/TAO/orbsvcs/orbsvcs/FtRtEvent/Utils/Log.inl
@@ -0,0 +1,51 @@
+// -*- C++ -*-
+//
+// $Id$
+
+TAO_BEGIN_VERSIONED_NAMESPACE_DECL
+
+namespace TAO_FTRTEC {
+#ifndef NDEBUG
+ ACE_INLINE
+ void Log::level(unsigned int log_level)
+ {
+ log_level_ = log_level;
+ }
+
+ ACE_INLINE
+ unsigned int Log::level()
+ {
+ return log_level_;
+ }
+
+ ACE_INLINE
+ void Log::hexdump(unsigned int level, const char* buf, size_t len, const char* msg)
+ {
+ if (Log::log_level_ >= level)
+ ACE_HEX_DUMP((LM_DEBUG, buf, len, msg));
+ }
+#else // NDEBUG
+ ACE_INLINE
+ Log::Log (unsigned int, const ACE_TCHAR*, ...)
+ {
+ }
+
+ ACE_INLINE
+ void Log::level(unsigned int )
+ {
+ }
+
+ ACE_INLINE
+ unsigned int Log::level()
+ {
+ return 0;
+ }
+
+ ACE_INLINE
+ void Log::hexdump(unsigned int, const char*, size_t, const char*)
+ {
+ }
+#endif
+}
+
+TAO_END_VERSIONED_NAMESPACE_DECL
diff --git a/TAO/orbsvcs/orbsvcs/FtRtEvent/Utils/Safe_InputCDR.cpp b/TAO/orbsvcs/orbsvcs/FtRtEvent/Utils/Safe_InputCDR.cpp
new file mode 100644
index 00000000000..96f0abfbad5
--- /dev/null
+++ b/TAO/orbsvcs/orbsvcs/FtRtEvent/Utils/Safe_InputCDR.cpp
@@ -0,0 +1,9 @@
+#include "orbsvcs/FtRtEvent/Utils/Safe_InputCDR.h"
+
+ACE_RCSID (Utils,
+ Safe_InputCDR,
+ "$Id$")
+
+#if !defined(__ACE_INLINE__)
+#include "orbsvcs/FtRtEvent/Utils/Safe_InputCDR.inl"
+#endif /* __ACE_INLINE__ */
diff --git a/TAO/orbsvcs/orbsvcs/FtRtEvent/Utils/Safe_InputCDR.h b/TAO/orbsvcs/orbsvcs/FtRtEvent/Utils/Safe_InputCDR.h
new file mode 100644
index 00000000000..b4aede7f570
--- /dev/null
+++ b/TAO/orbsvcs/orbsvcs/FtRtEvent/Utils/Safe_InputCDR.h
@@ -0,0 +1,40 @@
+// -*- C++ -*-
+//=============================================================================
+/**
+ * @file Safe_InputCDR.h
+ *
+ * $Id$
+ *
+ * @author Huang-Ming Huang <hh1@cse.wustl.edu>
+ */
+//=============================================================================
+#ifndef SAFE_INPUTCDR_H
+#define SAFE_INPUTCDR_H
+#include /**/ "ace/pre.h"
+
+#include "orbsvcs/FtRtEvent/Utils/ftrtevent_export.h"
+#include "tao/CDR.h"
+
+TAO_BEGIN_VERSIONED_NAMESPACE_DECL
+
+class TAO_FtRtEvent_Export Safe_InputCDR : public TAO_InputCDR
+{
+public:
+ /**
+ * Create an input stream from an arbitrary buffer.
+ *
+ * This contructor will work no matter the buffer is aligned properly
+ * or not. If the buffer is not properly aligned, it will make a copy
+ * of the buffer.
+ */
+ Safe_InputCDR(const char* buf, int size);
+};
+
+TAO_END_VERSIONED_NAMESPACE_DECL
+
+#if defined(__ACE_INLINE__)
+#include "orbsvcs/FtRtEvent/Utils/Safe_InputCDR.inl"
+#endif /* __ACE_INLINE__ */
+
+#include /**/ "ace/post.h"
+#endif
diff --git a/TAO/orbsvcs/orbsvcs/FtRtEvent/Utils/Safe_InputCDR.inl b/TAO/orbsvcs/orbsvcs/FtRtEvent/Utils/Safe_InputCDR.inl
new file mode 100644
index 00000000000..a4712c153f5
--- /dev/null
+++ b/TAO/orbsvcs/orbsvcs/FtRtEvent/Utils/Safe_InputCDR.inl
@@ -0,0 +1,23 @@
+// -*- C++ -*-
+//
+// $Id$
+
+#include "ace/OS_Memory.h"
+
+TAO_BEGIN_VERSIONED_NAMESPACE_DECL
+
+ACE_INLINE
+Safe_InputCDR::Safe_InputCDR(const char* buf, int size)
+: TAO_InputCDR((ACE_Message_Block*)0)
+{
+ if (ACE_ptr_align_binary(buf, ACE_CDR::MAX_ALIGNMENT) != buf) {
+ ACE_CDR::grow(&start_,size);
+ this->start_.copy(buf, size);
+ }
+ else {
+ this->start_.init(buf,size);
+ this->start_.wr_ptr(size);
+ }
+}
+
+TAO_END_VERSIONED_NAMESPACE_DECL
diff --git a/TAO/orbsvcs/orbsvcs/FtRtEvent/Utils/ScopeGuard.h b/TAO/orbsvcs/orbsvcs/FtRtEvent/Utils/ScopeGuard.h
new file mode 100644
index 00000000000..1b0dc0bc02d
--- /dev/null
+++ b/TAO/orbsvcs/orbsvcs/FtRtEvent/Utils/ScopeGuard.h
@@ -0,0 +1,300 @@
+// -*- C++ -*-
+//=============================================================================
+/**
+ * @file ScopeGuard.h
+ *
+ * $Id$
+ *
+ * @brief This is the code published at
+ * http://www.cuj.com/documents/s=8000/cujcexp1812alexandr/alexandr.htm
+ */
+//=============================================================================
+
+#ifndef SCOPEGUARD_H_
+#define SCOPEGUARD_H_
+
+TAO_BEGIN_VERSIONED_NAMESPACE_DECL
+
+template <class T>
+class RefHolder
+{
+ T& ref_;
+public:
+ RefHolder(T& ref) : ref_(ref) {}
+ operator T& () const
+ {
+ return ref_;
+ }
+private:
+ // Disable assignment - not implemented
+ RefHolder& operator=(const RefHolder&);
+};
+
+template <class T>
+inline RefHolder<T> ByRef(T& t)
+{
+ return RefHolder<T>(t);
+}
+
+class ScopeGuardImplBase
+{
+ ScopeGuardImplBase& operator =(const ScopeGuardImplBase&);
+protected:
+ ~ScopeGuardImplBase()
+ {
+ }
+ ScopeGuardImplBase(const ScopeGuardImplBase& other) throw()
+ : dismissed_(other.dismissed_)
+ {
+ other.Dismiss();
+ }
+ template <typename J>
+ static void SafeExecute(J& j) throw()
+ {
+ if (!j.dismissed_)
+ try
+ {
+ j.Execute();
+ }
+ catch(...)
+ {
+ }
+ }
+
+ mutable bool dismissed_;
+public:
+ ScopeGuardImplBase() throw() : dismissed_(false)
+ {
+ }
+ void Dismiss() const throw()
+ {
+ dismissed_ = true;
+ }
+};
+
+typedef const ScopeGuardImplBase& ScopeGuard;
+
+template <typename F>
+class ScopeGuardImpl0 : public ScopeGuardImplBase
+{
+public:
+ static ScopeGuardImpl0<F> MakeGuard(F fun)
+ {
+ return ScopeGuardImpl0<F>(fun);
+ }
+ ~ScopeGuardImpl0() throw()
+ {
+ SafeExecute(*this);
+ }
+ void Execute()
+ {
+ fun_();
+ }
+protected:
+ ScopeGuardImpl0(F fun) : fun_(fun)
+ {
+ }
+ F fun_;
+};
+
+template <typename F>
+inline ScopeGuardImpl0<F> MakeGuard(F fun)
+{
+ return ScopeGuardImpl0<F>::MakeGuard(fun);
+}
+
+template <typename F, typename P1>
+class ScopeGuardImpl1 : public ScopeGuardImplBase
+{
+public:
+ static ScopeGuardImpl1<F, P1> MakeGuard(F fun, P1 p1)
+ {
+ return ScopeGuardImpl1<F, P1>(fun, p1);
+ }
+ ~ScopeGuardImpl1() throw()
+ {
+ SafeExecute(*this);
+ }
+ void Execute()
+ {
+ fun_(p1_);
+ }
+protected:
+ ScopeGuardImpl1(F fun, P1 p1) : fun_(fun), p1_(p1)
+ {
+ }
+ F fun_;
+ const P1 p1_;
+};
+
+template <typename F, typename P1>
+inline ScopeGuardImpl1<F, P1> MakeGuard(F fun, P1 p1)
+{
+ return ScopeGuardImpl1<F, P1>::MakeGuard(fun, p1);
+}
+
+template <typename F, typename P1, typename P2>
+class ScopeGuardImpl2: public ScopeGuardImplBase
+{
+public:
+ static ScopeGuardImpl2<F, P1, P2> MakeGuard(F fun, P1 p1, P2 p2)
+ {
+ return ScopeGuardImpl2<F, P1, P2>(fun, p1, p2);
+ }
+ ~ScopeGuardImpl2() throw()
+ {
+ SafeExecute(*this);
+ }
+ void Execute()
+ {
+ fun_(p1_, p2_);
+ }
+protected:
+ ScopeGuardImpl2(F fun, P1 p1, P2 p2) : fun_(fun), p1_(p1), p2_(p2)
+ {
+ }
+ F fun_;
+ const P1 p1_;
+ const P2 p2_;
+};
+
+template <typename F, typename P1, typename P2>
+inline ScopeGuardImpl2<F, P1, P2> MakeGuard(F fun, P1 p1, P2 p2)
+{
+ return ScopeGuardImpl2<F, P1, P2>::MakeGuard(fun, p1, p2);
+}
+
+template <typename F, typename P1, typename P2, typename P3>
+class ScopeGuardImpl3 : public ScopeGuardImplBase
+{
+public:
+ static ScopeGuardImpl3<F, P1, P2, P3> MakeGuard(F fun, P1 p1, P2 p2, P3 p3)
+ {
+ return ScopeGuardImpl3<F, P1, P2, P3>(fun, p1, p2, p3);
+ }
+ ~ScopeGuardImpl3() throw()
+ {
+ SafeExecute(*this);
+ }
+ void Execute()
+ {
+ fun_(p1_, p2_, p3_);
+ }
+protected:
+ ScopeGuardImpl3(F fun, P1 p1, P2 p2, P3 p3) : fun_(fun), p1_(p1), p2_(p2), p3_(p3)
+ {
+ }
+ F fun_;
+ const P1 p1_;
+ const P2 p2_;
+ const P3 p3_;
+};
+
+template <typename F, typename P1, typename P2, typename P3>
+inline ScopeGuardImpl3<F, P1, P2, P3> MakeGuard(F fun, P1 p1, P2 p2, P3 p3)
+{
+ return ScopeGuardImpl3<F, P1, P2, P3>::MakeGuard(fun, p1, p2, p3);
+}
+
+//************************************************************
+
+template <class Obj, typename MemFun>
+class ObjScopeGuardImpl0 : public ScopeGuardImplBase
+{
+public:
+ static ObjScopeGuardImpl0<Obj, MemFun> MakeObjGuard(Obj& obj, MemFun memFun)
+ {
+ return ObjScopeGuardImpl0<Obj, MemFun>(obj, memFun);
+ }
+ ~ObjScopeGuardImpl0() throw()
+ {
+ SafeExecute(*this);
+ }
+ void Execute()
+ {
+ (obj_.*memFun_)();
+ }
+protected:
+ ObjScopeGuardImpl0(Obj& obj, MemFun memFun)
+ : obj_(obj), memFun_(memFun) {}
+ Obj& obj_;
+ MemFun memFun_;
+};
+
+template <class Obj, typename MemFun>
+inline ObjScopeGuardImpl0<Obj, MemFun> MakeObjGuard(Obj& obj, MemFun memFun)
+{
+ return ObjScopeGuardImpl0<Obj, MemFun>::MakeObjGuard(obj, memFun);
+}
+
+template <class Obj, typename MemFun, typename P1>
+class ObjScopeGuardImpl1 : public ScopeGuardImplBase
+{
+public:
+ static ObjScopeGuardImpl1<Obj, MemFun, P1> MakeObjGuard(Obj& obj, MemFun memFun, P1 p1)
+ {
+ return ObjScopeGuardImpl1<Obj, MemFun, P1>(obj, memFun, p1);
+ }
+ ~ObjScopeGuardImpl1() throw()
+ {
+ SafeExecute(*this);
+ }
+ void Execute()
+ {
+ (obj_.*memFun_)(p1_);
+ }
+protected:
+ ObjScopeGuardImpl1(Obj& obj, MemFun memFun, P1 p1)
+ : obj_(obj), memFun_(memFun), p1_(p1) {}
+ Obj& obj_;
+ MemFun memFun_;
+ const P1 p1_;
+};
+
+template <class Obj, typename MemFun, typename P1>
+inline ObjScopeGuardImpl1<Obj, MemFun, P1> MakeObjGuard(Obj& obj, MemFun memFun, P1 p1)
+{
+ return ObjScopeGuardImpl1<Obj, MemFun, P1>::MakeObjGuard(obj, memFun, p1);
+}
+
+template <class Obj, typename MemFun, typename P1, typename P2>
+class ObjScopeGuardImpl2 : public ScopeGuardImplBase
+{
+public:
+ static ObjScopeGuardImpl2<Obj, MemFun, P1, P2> MakeObjGuard(Obj& obj, MemFun memFun, P1 p1, P2 p2)
+ {
+ return ObjScopeGuardImpl2<Obj, MemFun, P1, P2>(obj, memFun, p1, p2);
+ }
+ ~ObjScopeGuardImpl2() throw()
+ {
+ SafeExecute(*this);
+ }
+ void Execute()
+ {
+ (obj_.*memFun_)(p1_, p2_);
+ }
+protected:
+ ObjScopeGuardImpl2(Obj& obj, MemFun memFun, P1 p1, P2 p2)
+ : obj_(obj), memFun_(memFun), p1_(p1), p2_(p2) {}
+ Obj& obj_;
+ MemFun memFun_;
+ const P1 p1_;
+ const P2 p2_;
+};
+
+template <class Obj, typename MemFun, typename P1, typename P2>
+inline ObjScopeGuardImpl2<Obj, MemFun, P1, P2> MakeObjGuard(Obj& obj, MemFun memFun, P1 p1, P2 p2)
+{
+ return ObjScopeGuardImpl2<Obj, MemFun, P1, P2>::MakeObjGuard(obj, memFun, p1, p2);
+}
+
+TAO_END_VERSIONED_NAMESPACE_DECL
+
+#define CONCATENATE_DIRECT(s1, s2) s1##s2
+#define CONCATENATE(s1, s2) CONCATENATE_DIRECT(s1, s2)
+#define ANONYMOUS_VARIABLE(str) CONCATENATE(str, __LINE__)
+
+#define ON_BLOCK_EXIT ScopeGuard ANONYMOUS_VARIABLE(scopeGuard) = MakeGuard
+#define ON_BLOCK_EXIT_OBJ ScopeGuard ANONYMOUS_VARIABLE(scopeGuard) = MakeObjGuard
+
+#endif //SCOPEGUARD_H_
diff --git a/TAO/orbsvcs/orbsvcs/FtRtEvent/Utils/UUID.cpp b/TAO/orbsvcs/orbsvcs/FtRtEvent/Utils/UUID.cpp
new file mode 100644
index 00000000000..6a34e95164b
--- /dev/null
+++ b/TAO/orbsvcs/orbsvcs/FtRtEvent/Utils/UUID.cpp
@@ -0,0 +1,167 @@
+//$Id$
+#include "orbsvcs/FtRtEvent/Utils/UUID.h"
+
+ACE_RCSID (Utils,
+ UUID,
+ "$Id$")
+#if !defined(__ACE_INLINE__)
+#include "orbsvcs/FtRtEvent/Utils/UUID.inl"
+#endif /* __ACE_INLINE__ */
+
+TAO_BEGIN_VERSIONED_NAMESPACE_DECL
+
+static union
+{
+ struct
+ {
+ ACE_UINT32 rand1;
+ ACE_UINT16 rand2;
+ } rand_node;
+ ACE_OS::macaddr_node_t mac_address;
+} node;
+
+int
+hex_to_byte (char h)
+{
+ if (h >= '0' && h <= '9') return h - '0';
+ if (h >= 'A' && h <= 'F') return h - 'A' + 10;
+ if (h >= 'a' && h <= 'f') return h - 'a' + 10;
+ return -1;
+}
+
+int
+hexbyte_to_byte (const char *hexbyte)
+{
+ int hi = hex_to_byte(*hexbyte);
+ if (hi == -1) return -1;
+ ++hexbyte;
+
+ int low = hex_to_byte(*hexbyte);
+ if (low == -1) return -1;
+ return (hi << 4) | low;
+}
+
+static const int counts[] = { 4, 2, 2, 2, 6 };
+static const char *seperators = "----";
+
+/**
+ * construct an UUID from the string representation
+ */
+UUID::UUID (const char *string_rep)
+{
+ if (this->from_string(string_rep) == false)
+ rep_.timestamp.hi = 0;
+}
+
+bool
+UUID::from_string (const char *string_rep)
+{
+ int offset = 0;
+
+ for (int i = 0; i < 5; ++i)
+ {
+ for (int j = 0; j < counts[i]; ++j)
+ {
+ int r = hexbyte_to_byte(string_rep);
+ if (r == -1)
+ {
+ return false;
+ }
+
+ rep_.uuid[offset++] = static_cast<unsigned char> (r);
+ string_rep += 2;
+ }
+
+ if (*string_rep++ != seperators[i])
+ {
+ return false;
+ }
+ }
+
+ return true;
+}
+
+static const char *table = "0123456789abcdef";
+
+inline char *
+bytes_to_hex (const unsigned char *bytes,
+ char *dest,
+ int len)
+{
+ for (int i = 0; i < len; ++i)
+ {
+ *dest++ = table[bytes[i] >> 4];
+ *dest++ = table[bytes[i] & 0x0f];
+ }
+
+ return dest;
+}
+
+/**
+ * convert to a string representation
+ */
+void
+UUID::to_string (char *string_rep) const
+{
+ for (int i = 0; i < 5; ++i)
+ {
+ string_rep = bytes_to_hex(rep_.uuid,
+ string_rep,
+ counts[i]);
+ *string_rep++ = seperators[i];
+ }
+}
+
+void
+UUID::create (unsigned char *buffer)
+{
+ static ACE_RANDR_TYPE seed;
+
+ if (seed == 0) seed = ACE_OS::getpid();
+
+ // test if node is properly initialized
+ if (node.rand_node.rand1 == 0)
+ {
+ // initialize the node
+ if (ACE_OS::getmacaddress(&node.mac_address) == -1)
+ {
+ node.rand_node.rand1 = ACE_OS::rand_r(seed);
+ node.rand_node.rand2 = (unsigned short) ACE_OS::rand_r(seed);
+ }
+ }
+
+ // Days in years
+ static ACE_UINT64 SecondsToJan1970 =
+ (static_cast<ACE_UINT64> (365)*(1970-1583) // Days in years
+ + (1970-1583)/4 // Leap days
+ - 3 // Allow for 1700, 1800, 1900 not leap years
+ + 31 // Days in December 1583
+ + 30 // Days in November 1583
+ + 16)*60*60*24; // Days from 15th October
+
+
+ ACE_Time_Value now = ACE_OS::gettimeofday();
+ ACE_UINT64 timestamp = (SecondsToJan1970 + now.sec()) * 10000000 + now.usec() * 10;
+
+ buffer[0] = (unsigned char) (timestamp & 0xff);
+ buffer[1] = (unsigned char) ((timestamp >> 8) & 0xff);
+ buffer[2] = (unsigned char) ((timestamp >> 16) & 0xff);
+ buffer[3] = (unsigned char) ((timestamp >> 24) & 0xff);
+ buffer[4] = (unsigned char) ((timestamp >> 32) & 0xff);
+ buffer[5] = (unsigned char) ((timestamp >> 40) & 0xff);
+
+ // multiplex timestamp with thread id to ensure the uniqueness between thread
+ buffer[6] = (unsigned char) ((timestamp >> 48) & 0xff);
+ // Version number is 1
+ buffer[7] = (unsigned char) (((timestamp >> 56) & 0x0f) + 0x10);
+
+ ACE_UINT16 clockSequence = static_cast<
+ ACE_UINT16> (ACE_OS::rand_r(seed) & 0x2ff);
+
+ buffer[8] = (unsigned char) ((clockSequence >> 8) & 0x1f);
+ buffer[9] = (unsigned char) (clockSequence & 0x1f);
+
+ memcpy(buffer + 10, &node, 6);
+}
+
+TAO_END_VERSIONED_NAMESPACE_DECL
diff --git a/TAO/orbsvcs/orbsvcs/FtRtEvent/Utils/UUID.h b/TAO/orbsvcs/orbsvcs/FtRtEvent/Utils/UUID.h
new file mode 100644
index 00000000000..19b81c44354
--- /dev/null
+++ b/TAO/orbsvcs/orbsvcs/FtRtEvent/Utils/UUID.h
@@ -0,0 +1,123 @@
+// -*- C++ -*-
+//=============================================================================
+/**
+ * @file UUID.h
+ *
+ * $Id$
+ *
+ * @author Huang-Ming Huang <hh1@cse.wustl.edu>
+ */
+//=============================================================================
+#ifndef UUID_H
+#define UUID_H
+#include /**/ "ace/pre.h"
+
+#include "orbsvcs/FtRtEvent/Utils/ftrtevent_export.h"
+#include "tao/Versioned_Namespace.h"
+#include "ace/OS.h"
+#include "ace/SString.h"
+
+#if defined(TAO_EXPORT_MACRO)
+#undef TAO_EXPORT_MACRO
+#endif
+#define TAO_EXPORT_MACRO FtRtEvent_Export
+
+#if defined(TAO_EXPORT_NESTED_CLASSES)
+#if defined(TAO_EXPORT_NESTED_MACRO)
+#undef TAO_EXPORT_NESTED_MACRO
+#endif /* defined (TAO_EXPORT_NESTED_MACRO) */
+#define TAO_EXPORT_NESTED_MACRO FtRtEvent_Export
+#endif /* TAO_EXPORT_NESTED_CLASSES */
+
+TAO_BEGIN_VERSIONED_NAMESPACE_DECL
+
+/**
+ * This is an implementation of Global Unique Identifier
+ * which follows the document draft-leach-uuids-guids-01.txt. The
+ * class layout is compatible with the binary representation of
+ * UUID specified by that document. The default constructor
+ * is used to create an new global unique id, not a NULL UUID.
+ * This class does not use dynamic memory allocation and does
+ * not throw any exception except to_string(ACE_CString&).
+ */
+class TAO_FtRtEvent_Export UUID
+{
+ public:
+ enum
+ {
+ BINRARY_LENGTH= 16,
+
+ // the required length for the string representation including the termination '\0'
+ STRING_LENGTH = 37
+ };
+
+ /* Construct an Global Unique Identifier. */
+ UUID(void);
+
+ /* This is used to create an uninitialized UUID. */
+ UUID(int);
+
+ /*
+ * Construct an UUID from the binary represetation. If you want to avoid a memory
+ * copy operation for this constructor. You can safely reinterpret_cast the 16
+ * bytes buffer into the UUID object and use all the member functions provided in
+ * this class except is_valid() which is only useful if a UUID object is
+ * constructed from the string representation.
+ */
+ UUID(const unsigned char *buffer);
+
+ /*
+ * Construct an UUID from the string representation. Use is_valid() to test if the
+ * construction is successful or not.
+ */
+ UUID(const char *);
+
+ /* Construct an uuid from the string representation. */
+ bool from_string(const char *string_rep);
+
+ bool operator==(const UUID &other) const;
+ bool operator!=(const UUID &other) const;
+
+ /*
+ * Test if the UUID is valid. Used after constructing an UUID from an string
+ * representation. This is done by testing whether the time_hi and time_mid fields
+ * of the timestamp are 0. By current time, those two field shouldn't be 0 at all.
+ */
+ bool is_valid(void) const;
+
+ /*
+ * convert to a string representation the buffer size provided must be at least
+ * STRING_LENGTH
+ */
+ void to_string(char *string_rep) const;
+
+ void to_string(ACE_CString &string) const;
+
+ /*
+ * convert to a string representation the buffer size provided must be at least
+ * BINRARY_LENGTH
+ */
+ void to_binary(unsigned char *binary_rep) const;
+
+ /* create an UUID in the specified buffer */
+ static void create(unsigned char *buffer);
+ private:
+ union
+ {
+ struct
+ {
+ ACE_UINT32 low;
+ ACE_UINT32 hi;
+ } timestamp;
+ unsigned char uuid[BINRARY_LENGTH];
+ } rep_;
+};
+
+TAO_END_VERSIONED_NAMESPACE_DECL
+
+#if defined(__ACE_INLINE__)
+#include "orbsvcs/FtRtEvent/Utils/UUID.inl"
+#endif /* __ACE_INLINE__ */
+
+#include /**/ "ace/post.h"
+#endif
diff --git a/TAO/orbsvcs/orbsvcs/FtRtEvent/Utils/UUID.inl b/TAO/orbsvcs/orbsvcs/FtRtEvent/Utils/UUID.inl
new file mode 100644
index 00000000000..e1238a12ff1
--- /dev/null
+++ b/TAO/orbsvcs/orbsvcs/FtRtEvent/Utils/UUID.inl
@@ -0,0 +1,58 @@
+// -*- C++ -*-
+//
+// $Id$
+
+TAO_BEGIN_VERSIONED_NAMESPACE_DECL
+
+ACE_INLINE
+UUID::UUID()
+{
+ create(rep_.uuid);
+}
+
+ACE_INLINE
+UUID::UUID(int)
+{
+}
+
+/// construct an UUID from the binary represetation
+ACE_INLINE
+UUID::UUID(const unsigned char* id)
+{
+ memcpy(rep_.uuid, id, 16);
+}
+
+ACE_INLINE
+bool UUID::operator == (const UUID& other) const
+{
+ return memcmp(this->rep_.uuid, other.rep_.uuid, BINRARY_LENGTH) == 0;
+}
+
+ACE_INLINE
+bool UUID::operator != (const UUID& other) const
+{
+ return !(*this == other);
+}
+
+
+ACE_INLINE
+bool UUID::is_valid() const
+{
+ return !this->rep_.timestamp.hi;
+}
+
+
+ACE_INLINE
+void UUID::to_binary(unsigned char* binary_rep) const
+{
+ memcpy(binary_rep, rep_.uuid, 16);
+}
+
+ACE_INLINE
+void UUID::to_string(ACE_CString& string) const
+{
+ string.resize(STRING_LENGTH-1);
+ this->to_string(&string[0]);
+}
+
+TAO_END_VERSIONED_NAMESPACE_DECL
diff --git a/TAO/orbsvcs/orbsvcs/FtRtEvent/Utils/activate_with_id.h b/TAO/orbsvcs/orbsvcs/FtRtEvent/Utils/activate_with_id.h
new file mode 100644
index 00000000000..9913cc8c8c9
--- /dev/null
+++ b/TAO/orbsvcs/orbsvcs/FtRtEvent/Utils/activate_with_id.h
@@ -0,0 +1,43 @@
+// -*- C++ -*-
+//=============================================================================
+/**
+ * @file activate_with_id.h
+ *
+ * $Id$
+ *
+ * @author Huang-Ming Huang <hh1@cse.wustl.edu>
+ */
+//=============================================================================
+#ifndef ACTIVATE_WITH_ID_H
+#define ACTIVATE_WITH_ID_H
+
+#include "tao/Versioned_Namespace.h"
+
+TAO_BEGIN_VERSIONED_NAMESPACE_DECL
+
+template<class T>
+void
+activate_object_with_id (T * &result,
+ PortableServer::POA_ptr poa,
+ PortableServer::ServantBase *servant,
+ const FtRtecEventComm::ObjectId &oid
+ ACE_ENV_ARG_DECL)
+{
+ const PortableServer::ObjectId& id =
+ reinterpret_cast<const PortableServer::ObjectId&> (oid);
+ poa->activate_object_with_id(id,
+ servant
+ ACE_ENV_ARG_PARAMETER);
+ ACE_CHECK;
+
+ CORBA::Object_var object =
+ poa->id_to_reference(id
+ ACE_ENV_ARG_PARAMETER);
+ ACE_CHECK;
+
+ result = T::_narrow(object.in() ACE_ENV_ARG_PARAMETER);
+}
+
+TAO_END_VERSIONED_NAMESPACE_DECL
+
+#endif
diff --git a/TAO/orbsvcs/orbsvcs/FtRtEvent/Utils/ftrtevent_export.h b/TAO/orbsvcs/orbsvcs/FtRtEvent/Utils/ftrtevent_export.h
new file mode 100644
index 00000000000..f3133e01cbe
--- /dev/null
+++ b/TAO/orbsvcs/orbsvcs/FtRtEvent/Utils/ftrtevent_export.h
@@ -0,0 +1,73 @@
+
+ // -*- C++ -*-
+
+// $Id$
+// Definition for Win32 Export directives.
+// This file is generated automatically by generate_export_file.pl TAO_FtRtEvent
+// ------------------------------
+#ifndef TAO_FTRTEVENT_EXPORT_H
+#define TAO_FTRTEVENT_EXPORT_H
+
+#include "ace/config-all.h"
+
+#if defined (TAO_AS_STATIC_LIBS)
+# if !defined (TAO_FTRTEVENT_HAS_DLL)
+# define TAO_FTRTEVENT_HAS_DLL 0
+# endif /* ! TAO_FTRTEVENT_HAS_DLL */
+#else
+# if !defined (TAO_FTRTEVENT_HAS_DLL)
+# define TAO_FTRTEVENT_HAS_DLL 1
+# endif /* ! TAO_FTRTEVENT_HAS_DLL */
+#endif
+
+#if defined(TAO_FTRTEVENT_HAS_DLL) \
+&& (TAO_FTRTEVENT_HAS_DLL == 1)
+#if defined(TAO_FTRTEVENT_BUILD_DLL)
+#define TAO_FtRtEvent_Export \
+ ACE_Proper_Export_Flag
+#define TAO_FTRTEVENT_SINGLETON_DECLARATION (T) ACE_EXPORT_SINGLETON_DECLARATION(T)
+#define TAO_FTRTEVENT_SINGLETON_DECLARE (SINGLETON_TYPE, \
+ CLASS, \
+ LOCK) ACE_EXPORT_SINGLETON_DECLARE(SINGLETON_TYPE, \
+ CLASS, \
+ LOCK)
+#else /* TAO_FTRTEVENT_BUILD_DLL */
+#define TAO_FtRtEvent_Export \
+ ACE_Proper_Import_Flag
+#define TAO_FTRTEVENT_SINGLETON_DECLARATION (T) ACE_IMPORT_SINGLETON_DECLARATION(T)
+#define TAO_FTRTEVENT_SINGLETON_DECLARE (SINGLETON_TYPE, \
+ CLASS, \
+ LOCK) ACE_IMPORT_SINGLETON_DECLARE(SINGLETON_TYPE, \
+ CLASS, \
+ LOCK)
+#endif /* TAO_FTRTEVENT_BUILD_DLL */
+#else /* TAO_FTRTEVENT_HAS_DLL == 1 */
+#define TAO_FtRtEvent_Export
+#define TAO_FTRTEVENT_SINGLETON_DECLARATION(T)
+#define TAO_FTRTEVENT_SINGLETON_DECLARE (SINGLETON_TYPE, \
+ CLASS, \
+ LOCK)
+#endif /* TAO_FTRTEVENT_HAS_DLL == 1 */
+
+// Set TAO_FTRTEVENT_NTRACE = 0 to turn on library specific tracing even if
+// tracing is turned off for ACE.
+#if !defined(TAO_FTRTEVENT_NTRACE)
+#if (ACE_NTRACE == 1)
+#define TAO_FTRTEVENT_NTRACE 1
+#else /* (ACE_NTRACE == 1) */
+#define TAO_FTRTEVENT_NTRACE 0
+#endif /* (ACE_NTRACE == 1) */
+#endif /* !TAO_FTRTEVENT_NTRACE */
+
+#if (TAO_FTRTEVENT_NTRACE == 1)
+#define TAO_FTRTEVENT_TRACE(X)
+#else /* (TAO_FTRTEVENT_NTRACE == 1) */
+#if !defined(ACE_HAS_TRACE)
+#define ACE_HAS_TRACE
+#endif /* ACE_HAS_TRACE */
+#define TAO_FTRTEVENT_TRACE(X) ACE_TRACE_IMPL(X)
+#include "ace/Trace.h"
+#endif /* (TAO_FTRTEVENT_NTRACE == 1) */
+#endif /* TAO_FTRTEVENT_EXPORT_H */
+
+// End of auto generated file.
diff --git a/TAO/orbsvcs/orbsvcs/FtRtEvent/Utils/resolve_init.h b/TAO/orbsvcs/orbsvcs/FtRtEvent/Utils/resolve_init.h
new file mode 100644
index 00000000000..c489912d527
--- /dev/null
+++ b/TAO/orbsvcs/orbsvcs/FtRtEvent/Utils/resolve_init.h
@@ -0,0 +1,73 @@
+// -*- C++ -*-
+//=============================================================================
+/**
+ * @file resolve_init.h
+ *
+ * $Id$
+ *
+ * @author Huang-Ming Huang <hh1@cse.wustl.edu>
+ */
+//=============================================================================
+#ifndef RESOVLE_INIT_H
+#define RESOVLE_INIT_H
+
+#include "tao/Versioned_Namespace.h"
+
+TAO_BEGIN_VERSIONED_NAMESPACE_DECL
+
+template<class T>
+typename T::_ptr_type
+resolve_init (CORBA::ORB_ptr orb,
+ const char *id ACE_ENV_ARG_DECL_WITH_DEFAULTS)
+{
+ typename T::_var_type ref;
+ CORBA::Object_var obj;
+ ACE_TRY
+ {
+ CORBA::Object_var obj;
+ obj = orb->resolve_initial_references(id ACE_ENV_ARG_PARAMETER);
+ ACE_TRY_CHECK;
+
+ ref = T::_narrow(obj.in() ACE_ENV_ARG_PARAMETER);
+ }
+
+ ACE_CATCHANY
+ {
+ ACE_ERROR((
+ LM_ERROR,
+ " (%P|%t) Unable to initialize %s.\n",
+ id
+ ));
+ if (!CORBA::is_nil(obj.in()))
+ ACE_ERROR((
+ LM_ERROR,
+ " due to narrowing problem\n"
+ ));
+ ACE_RE_THROW;
+ }
+
+ ACE_ENDTRY;
+ return ref._retn();
+}
+
+#ifdef TAO_Naming_Export
+template<class T>
+typename T::_ptr_type
+resolve (CosNaming::NamingContext_ptr context,
+ const CosNaming::Name &id
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS)
+{
+ CORBA::Object_var obj;
+ obj = context->resolve(id ACE_ENV_ARG_PARAMETER);
+ ACE_CHECK_RETURN(T::_nil());
+
+ ACE_ASSERT(!CORBA::is_nil(obj.in()));
+
+ typename T::_var_type ref = T::_narrow(obj.in() ACE_ENV_ARG_PARAMETER);
+ return ref._retn();
+}
+#endif
+
+TAO_END_VERSIONED_NAMESPACE_DECL
+
+#endif
diff --git a/TAO/orbsvcs/orbsvcs/FtRtecEventChannelAdmin.idl b/TAO/orbsvcs/orbsvcs/FtRtecEventChannelAdmin.idl
new file mode 100644
index 00000000000..866640ef114
--- /dev/null
+++ b/TAO/orbsvcs/orbsvcs/FtRtecEventChannelAdmin.idl
@@ -0,0 +1,194 @@
+// -*- IDL -*-
+
+//=============================================================================
+/**
+ * @file FtRtecEventChannelAdmin.idl
+ *
+ * $Id$
+ *
+ * @author Huang-Ming Huang
+ */
+//=============================================================================
+
+#ifndef TAO_FTRTEC_EVENTCHANNELADMIN_IDL
+#define TAO_FTRTEC_EVENTCHANNELADMIN_IDL
+
+#include "orbsvcs/RtecEventChannelAdmin.idl"
+#include "FTRT.idl"
+#include "FTRT_GroupManager.idl"
+#include "FtRtecEventComm.idl"
+
+module FtRtecEventChannelAdmin
+{
+ typedef FtRtecEventComm::ObjectId ObjectId;
+
+ struct ProxyPushConsumerConnectionInfo
+ {
+ RtecEventComm::PushSupplier push_supplier;
+ RtecEventChannelAdmin::SupplierQOS qos;
+ };
+
+ union ProxyPushConsumerConnectionParamter switch (boolean)
+ {
+ case FALSE:
+ case TRUE:
+ ProxyPushConsumerConnectionInfo info;
+ };
+
+ struct ProxyPushConsumerStat
+ {
+ ObjectId object_id;
+ ProxyPushConsumerConnectionParamter parameter;
+ };
+
+
+ struct ProxyPushSupplierConnectionInfo
+ {
+ RtecEventComm::PushConsumer push_consumer;
+ RtecEventChannelAdmin::ConsumerQOS qos;
+ };
+
+ union ProxyPushSupplierConnectionParamter switch (boolean)
+ {
+ case FALSE:
+ case TRUE:
+ ProxyPushSupplierConnectionInfo info;
+ };
+
+ struct ProxyPushSupplierStat
+ {
+ ObjectId object_id;
+ boolean suspended;
+ ProxyPushSupplierConnectionParamter parameter;
+ };
+
+ typedef sequence<ProxyPushConsumerStat> ProxyConsumerStates;
+ typedef sequence<ProxyPushSupplierStat> ProxySupplierStates;
+
+ struct ConsumerAdminState
+ {
+ ProxySupplierStates proxies;
+ };
+
+ struct SupplierAdminState
+ {
+ ProxyConsumerStates proxies;
+ };
+
+ struct CachedResult
+ {
+ long retention_id;
+ any result;
+ };
+
+
+ struct CacheEntry
+ {
+ string client_id;
+ CachedResult cached_result;
+ };
+
+ typedef sequence<CacheEntry> CachedOptionResults;
+
+ struct EventChannelState
+ {
+ CachedOptionResults cached_operation_results;
+ SupplierAdminState supplier_admin_state;
+ ConsumerAdminState consumer_admin_state;
+ };
+
+ struct Connect_push_consumer_param
+ {
+ RtecEventComm::PushConsumer push_consumer;
+ RtecEventChannelAdmin::ConsumerQOS qos;
+ };
+
+ struct Connect_push_supplier_param
+ {
+ RtecEventComm::PushSupplier push_supplier;
+ RtecEventChannelAdmin::SupplierQOS qos;
+ };
+
+ enum OperationType {
+ OBTAIN_PUSH_SUPPLIER,
+ OBTAIN_PUSH_CONSUMER,
+ DISCONNECT_PUSH_SUPPLIER,
+ DISCONNECT_PUSH_CONSUMER,
+ SUSPEND_CONNECTION,
+ RESUME_CONNECTION,
+ CONNECT_PUSH_SUPPLIER,
+ CONNECT_PUSH_CONSUMER
+ };
+
+ union OperationParam switch(OperationType) {
+ case CONNECT_PUSH_SUPPLIER:
+ Connect_push_supplier_param connect_supplier_param;
+ case CONNECT_PUSH_CONSUMER:
+ Connect_push_consumer_param connect_consumer_param;
+ };
+
+
+ struct Operation {
+ ObjectId object_id;
+ OperationParam param;
+ };
+
+ interface EventChannelFacade : FtRtecEventComm::PushConsumer {
+ /**
+ * Directly connect to push consumer. This method is
+ * equivalent to the effect of executing the following
+ * 3 methods.
+ *
+ * consumer_admin = ec->for_consumers();
+ * proxy_supplier = consumer_admin->obtain_push_supplier();
+ * proxy_supplier->connect_push_consumer(push_consumer,
+ * qos);
+ *
+ * @returns the ObjectId of proxy_push_supplier
+ */
+ ObjectId connect_push_consumer(
+ in RtecEventComm::PushConsumer push_consumer,
+ in RtecEventChannelAdmin::ConsumerQOS qos)
+ raises(RtecEventChannelAdmin::TypeError);
+
+ /**
+ * Directly connect to push supplier. This method is
+ * equivalent to the effect of executing the following
+ * 3 methods.
+ *
+ * supplier_admin = ec->for_suppliers();
+ * push_consumer = supplier_admin->obtain_push_supplier();
+ * push_consumer->connect_push_consumer(proxy_supplier,
+ * qos);
+ *
+ * @returns the ObjectId of proxy_push_consumer
+ */
+ ObjectId connect_push_supplier(
+ in RtecEventComm::PushSupplier push_supplier,
+ in RtecEventChannelAdmin::SupplierQOS qos);
+
+ void disconnect_push_supplier(in ObjectId oid)
+ raises(FtRtecEventComm::InvalidObjectID);
+ void disconnect_push_consumer(in ObjectId oid)
+ raises(FtRtecEventComm::InvalidObjectID);
+ void suspend_push_supplier(in ObjectId oid)
+ raises(FtRtecEventComm::InvalidObjectID);
+ void resume_push_supplier(in ObjectId oid)
+ raises(FtRtecEventComm::InvalidObjectID);
+ };
+
+ exception InvalidState{};
+
+ interface EventChannel : RtecEventChannelAdmin::EventChannel
+ , EventChannelFacade
+ , FTRT::Updateable
+ , FTRT::ObjectGroupManager
+ {
+ };
+
+ typedef sequence<EventChannel> EventChannelList;
+
+};
+
+#endif
+
diff --git a/TAO/orbsvcs/orbsvcs/FtRtecEventComm.idl b/TAO/orbsvcs/orbsvcs/FtRtecEventComm.idl
new file mode 100644
index 00000000000..a1406158952
--- /dev/null
+++ b/TAO/orbsvcs/orbsvcs/FtRtecEventComm.idl
@@ -0,0 +1,32 @@
+// -*- IDL -*-
+
+//=============================================================================
+/**
+ * @file FtRtecEventComm.idl
+ *
+ * $Id$
+ *
+ * @author Huang-Ming Huang
+ */
+//=============================================================================
+
+#ifndef FTRTECEVNETCOMM_H
+#define FTRTECEVNETCOMM_H
+
+#include "orbsvcs/RtecEventComm.idl"
+
+module FtRtecEventComm {
+
+ typedef sequence<octet> ObjectId;
+
+ exception InvalidObjectID {
+ };
+
+ interface PushConsumer {
+ void push(in ObjectId oid, in RtecEventComm::EventSet data)
+ raises(InvalidObjectID);
+ };
+
+};
+
+#endif
diff --git a/TAO/orbsvcs/orbsvcs/GSSUP.idl b/TAO/orbsvcs/orbsvcs/GSSUP.idl
new file mode 100644
index 00000000000..4bb8ed232bc
--- /dev/null
+++ b/TAO/orbsvcs/orbsvcs/GSSUP.idl
@@ -0,0 +1,63 @@
+// -*- IDL -*-
+
+//=============================================================================
+/**
+ * @file GSSUP.idl
+ *
+ * $Id$
+ *
+ * @author Object Management Group
+ */
+//=============================================================================
+
+#ifndef _GSSUP_IDL_
+#define _GSSUP_IDL_
+
+#include <CSI.idl>
+//import ::CSI;
+
+module GSSUP {
+ typeprefix GSSUP "omg.org";
+ // The GSS Object Identifier allocated for the
+ // username/password mechanism is defined below.
+ //
+ // { iso-itu-t (2) international-organization (23) omg (130)
+ // security (1) authentication (1) gssup-mechanism (1) }
+ const CSI::StringOID GSSUPMechOID = "oid:2.23.130.1.1.1";
+
+ // The following structure defines the inner contents of the
+ // username password initial context token. This structure is
+ // CDR encapsulated and appended at the end of the
+ // username/password GSS (initial context) Token.
+ struct InitialContextToken {
+ CSI::UTF8String username;
+ CSI::UTF8String password;
+ CSI::GSS_NT_ExportedName target_name;
+ };
+
+ typedef unsigned long ErrorCode;
+
+ // GSSUP Mechanism-Specific Error Token
+ struct ErrorToken {
+ ErrorCode error_code;
+ };
+
+ // The context validator has chosen not to reveal the GSSUP
+ // specific cause of the failure.
+ const ErrorCode GSS_UP_S_G_UNSPECIFIED = 1;
+
+ // The user identified in the username field of the
+ // GSSUP::InitialContextToken is unknown to the target.
+ const ErrorCode GSS_UP_S_G_NOUSER = 2;
+
+ // The password supplied in the GSSUP::InitialContextToken was
+ // incorrect.
+ const ErrorCode GSS_UP_S_G_BAD_PASSWORD = 3;
+
+ // The target_name supplied in the GSSUP::InitialContextToken does
+ // not match a target_name in a mechanism definition of the target.
+ const ErrorCode GSS_UP_S_G_BAD_TARGET = 4;
+
+}; // GSSUP
+
+#endif
diff --git a/TAO/orbsvcs/orbsvcs/HTIOP.idl b/TAO/orbsvcs/orbsvcs/HTIOP.idl
new file mode 100644
index 00000000000..5dc61ec8cbf
--- /dev/null
+++ b/TAO/orbsvcs/orbsvcs/HTIOP.idl
@@ -0,0 +1,30 @@
+// -*- IDL -*-
+//
+// $Id$
+
+#ifndef HTIOP_IDL
+#define HTIOP_IDL
+
+// This is a OMG specified IDL. When HTIOP modules start getting
+// complicated we may want to have them here.
+#pragma prefix "omg.org"
+
+
+module HTIOP
+{
+ struct ListenPoint
+ {
+ string host;
+ unsigned short port;
+ string htid;
+ };
+
+ typedef sequence<ListenPoint> ListenPointList;
+
+ struct BiDirHTIOPServiceContext
+ {
+ ListenPointList listen_points;
+ };
+};
+
+#endif /* TAO_IIOP_PIDL */
diff --git a/TAO/orbsvcs/orbsvcs/HTIOP.mpc b/TAO/orbsvcs/orbsvcs/HTIOP.mpc
new file mode 100644
index 00000000000..5494d71ef4f
--- /dev/null
+++ b/TAO/orbsvcs/orbsvcs/HTIOP.mpc
@@ -0,0 +1,29 @@
+// -*- MPC -*-
+//
+// $Id$
+
+project : htbp, orbsvcslib, core, tao_versioning_idl_defaults {
+ sharedname = TAO_HTIOP
+ idlflags += -Wb,export_macro=HTIOP_Export -Wb,export_include=orbsvcs/HTIOP/HTIOP_Export.h -SS
+ dynamicflags = HTIOP_BUILD_DLL
+ tagchecks += HTIOP
+ pch_header =
+ pch_source =
+
+ IDL_FILES {
+ HTIOP.idl
+ }
+
+ IDL_Files {
+ idlflags += -Sci -Gp -Gd -Ge 1 -Sc -Sa -Sorb \
+ -o HTIOP
+ idlflags -= -St
+ HTIOP/htiop_endpoints.pidl
+ }
+
+ Source_Files(ORBSVCS_COMPONENTS) {
+ HTIOP {
+ HTIOP
+ }
+ }
+}
diff --git a/TAO/orbsvcs/orbsvcs/HTIOP/HTIOP_Acceptor.cpp b/TAO/orbsvcs/orbsvcs/HTIOP/HTIOP_Acceptor.cpp
new file mode 100644
index 00000000000..4d0bed9f1f8
--- /dev/null
+++ b/TAO/orbsvcs/orbsvcs/HTIOP/HTIOP_Acceptor.cpp
@@ -0,0 +1,889 @@
+// This may look like C, but it's really -*- C++ -*-
+// $Id$
+
+#include "orbsvcs/HTIOP/HTIOP_Acceptor.h"
+#include "orbsvcs/HTIOP/HTIOP_Profile.h"
+#include "ace/HTBP/HTBP_Environment.h"
+#include "ace/HTBP/HTBP_ID_Requestor.h"
+
+#include "tao/MProfile.h"
+#include "tao/ORB_Core.h"
+#include "tao/Server_Strategy_Factory.h"
+#include "tao/debug.h"
+#include "tao/CDR.h"
+#include "tao/Codeset_Manager.h"
+
+#include "ace/Auto_Ptr.h"
+
+#if !defined(__ACE_INLINE__)
+#include "orbsvcs/HTIOP/HTIOP_Acceptor.i"
+#endif /* __ACE_INLINE__ */
+
+ACE_RCSID(HTIOP,
+ TAO_HTIOP_Acceptor,
+ "$Id$")
+
+TAO_BEGIN_VERSIONED_NAMESPACE_DECL
+
+TAO::HTIOP::Acceptor::Acceptor (ACE::HTBP::Environment *ht_env,
+ int is_inside)
+ : TAO_Acceptor (OCI_TAG_HTIOP_PROFILE),
+ addrs_ (0),
+ hosts_ (0),
+ endpoint_count_ (0),
+ hostname_in_ior_ (0),
+ version_ (TAO_DEF_GIOP_MAJOR, TAO_DEF_GIOP_MINOR),
+ orb_core_ (0),
+ base_acceptor_ (),
+ creation_strategy_ (0),
+ concurrency_strategy_ (0),
+ accept_strategy_ (0),
+ ht_env_ (ht_env),
+ inside_ (is_inside)
+{
+}
+
+TAO::HTIOP::Acceptor::~Acceptor (void)
+{
+ // Make sure we are closed before we start destroying the
+ // strategies.
+ this->close ();
+
+ delete this->creation_strategy_;
+ delete this->concurrency_strategy_;
+ delete this->accept_strategy_;
+
+ delete [] this->addrs_;
+
+ for (CORBA::ULong i = 0; i < this->endpoint_count_; ++i)
+ CORBA::string_free (this->hosts_[i]);
+
+ delete [] this->hosts_;
+}
+
+// TODO =
+// 2) For V1.[1,2] there are tagged components
+int
+TAO::HTIOP::Acceptor::create_profile (const TAO::ObjectKey &object_key,
+ TAO_MProfile &mprofile,
+ CORBA::Short priority)
+{
+ // Sanity check.
+ if (this->endpoint_count_ == 0)
+ return -1;
+
+ // Check if multiple endpoints should be put in one profile or
+ // if they should be spread across multiple profiles.
+
+ if (priority == TAO_INVALID_PRIORITY
+ /* && this->orb_core_->orb_params()->shared_profile () == 0 */)
+
+ return this->create_new_profile (object_key,
+ mprofile,
+ priority);
+ else
+ return this->create_shared_profile (object_key,
+ mprofile,
+ priority);
+}
+
+int
+TAO::HTIOP::Acceptor::create_new_profile (const TAO::ObjectKey &object_key,
+ TAO_MProfile &mprofile,
+ CORBA::Short priority)
+{
+ // Adding this->endpoint_count_ to the TAO_MProfile.
+ int count = mprofile.profile_count ();
+ if ((mprofile.size () - count) < this->endpoint_count_
+ && mprofile.grow (count + this->endpoint_count_) == -1)
+ return -1;
+
+ // Create a profile for each acceptor endpoint.
+ for (CORBA::ULong i = 0; i < this->endpoint_count_; ++i)
+ {
+ TAO::HTIOP::Profile *pfile = 0;
+ ACE_NEW_RETURN (pfile,
+ TAO::HTIOP::Profile (this->hosts_[i],
+ this->addrs_[i].get_port_number (),
+ this->addrs_[i].get_htid(),
+ object_key,
+ this->addrs_[i],
+ this->version_,
+ this->orb_core_),
+ -1);
+ pfile->endpoint ()->priority (priority);
+
+ if (mprofile.give_profile (pfile) == -1)
+ {
+ pfile->_decr_refcnt ();
+ pfile = 0;
+ return -1;
+ }
+
+ // Do not add any tagged components to the profile if configured
+ // by the user not to do so, or if an TAO_HTIOP 1.0 endpoint is being
+ // created (TAO_HTIOP 1.0 did not support tagged components).
+ if (this->orb_core_->orb_params ()->std_profile_components () == 0
+ || (this->version_.major == 1 && this->version_.minor == 0))
+ continue;
+
+ pfile->tagged_components ().set_orb_type (TAO_ORB_TYPE);
+
+ TAO_Codeset_Manager *csm = this->orb_core_->codeset_manager();
+ if (csm)
+ csm->set_codeset(pfile->tagged_components());
+ }
+
+ return 0;
+}
+
+int
+TAO::HTIOP::Acceptor::create_shared_profile (const TAO::ObjectKey &object_key,
+ TAO_MProfile &mprofile,
+ CORBA::Short priority)
+{
+ CORBA::ULong index = 0;
+ TAO_Profile *pfile = 0;
+ TAO::HTIOP::Profile *htiop_profile = 0;
+
+ // First see if <mprofile> already contains a TAO_HTIOP profile.
+ for (TAO_PHandle i = 0; i != mprofile.profile_count (); ++i)
+ {
+ pfile = mprofile.get_profile (i);
+ if (pfile->tag () == OCI_TAG_HTIOP_PROFILE)
+ {
+ htiop_profile = dynamic_cast<TAO::HTIOP::Profile *> (pfile);
+ break;
+ }
+ }
+
+ // If <mprofile> doesn't contain a TAO::HTIOP::Profile, we need to create
+ // one.
+ if (htiop_profile == 0)
+ {
+ ACE_NEW_RETURN (htiop_profile,
+ TAO::HTIOP::Profile (this->hosts_[0],
+ this->addrs_[0].get_port_number (),
+ this->addrs_[0].get_htid(),
+ object_key,
+ this->addrs_[0],
+ this->version_,
+ this->orb_core_),
+ -1);
+ htiop_profile->endpoint ()->priority (priority);
+
+ if (mprofile.give_profile (htiop_profile) == -1)
+ {
+ htiop_profile->_decr_refcnt ();
+ htiop_profile = 0;
+ return -1;
+ }
+
+ // Do not add any tagged components to the profile if configured
+ // by the user not to do so, or if an HTIOP 1.0 endpoint is being
+ // created (HTIOP 1.0 did not support tagged components).
+ if (this->orb_core_->orb_params ()->std_profile_components () != 0
+ && (this->version_.major >= 1 && this->version_.minor >= 1))
+ {
+ htiop_profile->tagged_components ().set_orb_type (TAO_ORB_TYPE);
+ TAO_Codeset_Manager *csm = this->orb_core_->codeset_manager();
+ if (csm)
+ csm->set_codeset(htiop_profile->tagged_components());
+ }
+
+ index = 1;
+ }
+
+ // Add any remaining acceptor endpoints to the TAO::HTIOP::Profile.
+ for (;
+ index < this->endpoint_count_;
+ ++index)
+ {
+ TAO::HTIOP::Endpoint *endpoint = 0;
+ ACE_NEW_RETURN (endpoint,
+ TAO::HTIOP::Endpoint (this->hosts_[index],
+ this->addrs_[index].get_port_number (),
+ this->addrs_[index].get_htid(),
+ this->addrs_[index]),
+ -1);
+ endpoint->priority (priority);
+ htiop_profile->add_endpoint (endpoint);
+ }
+
+ return 0;
+}
+
+int
+TAO::HTIOP::Acceptor::is_collocated (const TAO_Endpoint *endpoint)
+{
+ const TAO::HTIOP::Endpoint *endp =
+ dynamic_cast<const TAO::HTIOP::Endpoint *> (endpoint);
+
+ // Make sure the dynamically cast pointer is valid.
+ if (endp == 0)
+ return 0;
+
+ for (CORBA::ULong i = 0; i < this->endpoint_count_; ++i)
+ {
+ // compare the port and host name. Please do *NOT* optimize
+ // this code by comparing the IP address instead. That would
+ // trigger the following bug:
+ //
+ // http://deuce.doc.wustl.edu/bugzilla/show_bug.cgi?id=1220
+ //
+ if (endp->port() == this->addrs_[i].get_port_number())
+ if (endp->port() == 0)
+ return (ACE_OS::strcmp (endp->htid(),
+ this->addrs_[i].get_htid()) == 0);
+ else
+ return (ACE_OS::strcmp(endp->host(), this->hosts_[i]) == 0);
+ // return 1;
+ }
+
+ return 0;
+}
+
+int
+TAO::HTIOP::Acceptor::close (void)
+{
+ return this->base_acceptor_.close ();
+}
+
+int
+TAO::HTIOP::Acceptor::open (TAO_ORB_Core *orb_core,
+ ACE_Reactor *reactor,
+ int major,
+ int minor,
+ const char *address,
+ const char *options)
+{
+ this->orb_core_ = orb_core;
+
+ if (this->hosts_ != 0)
+ {
+ // The hostname cache has already been set!
+ // This is bad mojo, i.e. an internal TAO error.
+ ACE_ERROR_RETURN ((LM_ERROR,
+ ACE_TEXT ("TAO (%P|%t) ")
+ ACE_TEXT ("TAO::HTIOP::Acceptor::open - ")
+ ACE_TEXT ("hostname already set\n\n")),
+ -1);
+ }
+
+ ACE_CString proxy_host;
+ unsigned proxy_port = 0;
+
+ int rp = this->ht_env_->get_proxy_port(proxy_port);
+ if (rp == 0 && proxy_port != 0)
+ ACE_ERROR_RETURN ((LM_ERROR,
+ ACE_TEXT ("TAO (%P|%t) ")
+ ACE_TEXT ("TAO::HTIOP::Acceptor::open - ")
+ ACE_TEXT ("explicit endpoint inside proxy, port %d\n"),
+ proxy_port),
+ -1);
+
+ if (address == 0)
+ return -1;
+
+ if (major >=0 && minor >= 0)
+ this->version_.set_version (static_cast<CORBA::Octet> (major),
+ static_cast<CORBA::Octet> (minor));
+ // Parse options
+ if (this->parse_options (options) == -1)
+ return -1;
+
+ ACE::HTBP::Addr addr;
+
+ // @ Mostly the address is just a host:port but in case it is
+ // host:port#token, remove the #token before this is processed
+ // - priyanka
+ address = ACE_OS::strtok (const_cast<char *> (address), "#");
+
+ // In the common scenario, Acceptor is in the server that is
+ // outside the firewall. It means the address that is sent to
+ // us can be a ACE::HTBP::Outside_Addr which is of the form
+ // host:port:token. The last :token has to be taken into
+ // consideration.
+ const char *port_separator_loc = ACE_OS::strchr (address, ':');
+
+ const char *specified_hostname = 0;
+ char tmp_host[MAXHOSTNAMELEN + 1];
+
+ if (port_separator_loc == address)
+ {
+ // The address is a port number or port name. No hostname was
+ // specified. The hostname for each network interface and the
+ // fully qualified domain name must be obtained.
+
+ // ie. the address can be :port:token or just :port:
+
+ // Check for multiple network interfaces.
+ if (this->probe_interfaces (orb_core) == -1)
+ return -1;
+
+ // First convert the port into a usable form.
+ if (addr.ACE_INET_Addr::set (address + sizeof (':')) != 0)
+ return -1;
+
+ // Now reset the port and set the host.
+ if (addr.ACE_INET_Addr::set (addr.get_port_number (),
+ static_cast<ACE_UINT32> (INADDR_ANY),
+ 1) != 0)
+ return -1;
+ else
+ {
+ return this->open_i (addr,
+ reactor);
+ }
+ }
+ else if (port_separator_loc == 0)
+ {
+ // The address is a hostname. No port was specified, so assume
+ // port zero (port will be chosen for us).
+ if (addr.ACE_INET_Addr::set ((unsigned short) 0, address) != 0)
+ return -1;
+
+ specified_hostname = address;
+ }
+ else
+ {
+ // Host and port were specified.
+ if (addr.ACE_INET_Addr::set (address) != 0)
+ return -1;
+
+ // Extract out just the host part of the address.
+ size_t len = port_separator_loc - address;
+ ACE_OS::memcpy (tmp_host, address, len);
+ tmp_host[len] = '\0';
+
+ specified_hostname = tmp_host;
+ }
+
+ this->endpoint_count_ = 1; // Only one hostname to store
+
+ ACE_NEW_RETURN (this->addrs_,
+ ACE::HTBP::Addr[this->endpoint_count_],
+ -1);
+
+ ACE_NEW_RETURN (this->hosts_,
+ char *[this->endpoint_count_],
+ -1);
+
+ this->hosts_[0] = 0;
+
+ if (this->hostname_in_ior_ != 0)
+ {
+ if (TAO_debug_level > 2)
+ {
+ ACE_DEBUG ((LM_DEBUG,
+ ACE_TEXT ("Overriding address in IOR with %s\n"),
+ this->hostname_in_ior_));
+ }
+
+ if (this->hostname (orb_core,
+ addr,
+ this->hosts_[0],
+ this->hostname_in_ior_) != 0)
+ return -1;
+ }
+ else
+ {
+ if (this->hostname (orb_core,
+ addr,
+ this->hosts_[0],
+ specified_hostname) != 0)
+ return -1;
+ }
+
+ // Copy the addr. The port is (re)set in
+ // TAO::HTIOP::Acceptor::open_i().
+ if (this->addrs_[0].ACE_INET_Addr::set (addr) != 0)
+ return -1;
+
+ return this->open_i (addr,
+ reactor);
+}
+
+int
+TAO::HTIOP::Acceptor::open_default (TAO_ORB_Core *orb_core,
+ ACE_Reactor *reactor,
+ int major,
+ int minor,
+ const char *options)
+{
+ this->orb_core_ = orb_core;
+
+ if (this->hosts_ != 0)
+ {
+ // The hostname cache has already been set!
+ // This is bad mojo, i.e. an internal TAO error.
+ ACE_ERROR_RETURN ((LM_ERROR,
+ ACE_TEXT ("TAO (%P|%t) ")
+ ACE_TEXT ("TAO::HTIOP::Acceptor::open_default - ")
+ ACE_TEXT ("hostname already set\n\n")),
+ -1);
+ }
+
+ if (major >=0 && minor >= 0)
+ this->version_.set_version (static_cast<CORBA::Octet> (major),
+ static_cast<CORBA::Octet> (minor));
+
+ // Parse options
+ if (this->parse_options (options) == -1)
+ return -1;
+
+
+ unsigned proxy_port = 0;
+ if (this->inside_ == 1 ||
+ (this->inside_ == -1 &&
+ this->ht_env_->get_proxy_port(proxy_port) == 0 &&
+ proxy_port != 0))
+ {
+ this->endpoint_count_ = 1;
+ ACE_NEW_RETURN (this->addrs_,
+ ACE::HTBP::Addr[this->endpoint_count_],
+ -1);
+
+ ACE_NEW_RETURN (this->hosts_,
+ char *[this->endpoint_count_],
+ -1);
+
+ ACE_OS::memset (this->hosts_, 0,
+ sizeof (char*) * this->endpoint_count_);
+
+ ACE::HTBP::ID_Requestor req(ht_env_);
+ this->addrs_[0] = req.get_HTID();
+ return 0;
+
+ }
+
+ // Check for multiple network interfaces.
+ if (this->probe_interfaces (orb_core) == -1)
+ return -1;
+
+ // Now that each network interface's hostname has been cached, open
+ // an endpoint on each network interface using the INADDR_ANY
+ // address.
+ ACE::HTBP::Addr addr;
+
+ if (addr.ACE_INET_Addr::set (static_cast<u_short> (0),
+ static_cast<ACE_UINT32> (INADDR_ANY),
+ 1) != 0)
+ return -1;
+
+ return this->open_i (addr,
+ reactor);
+}
+
+int
+TAO::HTIOP::Acceptor::open_i (const ACE::HTBP::Addr& addr,
+ ACE_Reactor *reactor)
+{
+ ACE_NEW_RETURN (this->creation_strategy_,
+ CREATION_STRATEGY (this->orb_core_,0),
+ -1);
+
+ ACE_NEW_RETURN (this->concurrency_strategy_,
+ CONCURRENCY_STRATEGY (),
+ -1);
+
+ ACE_NEW_RETURN (this->accept_strategy_,
+ ACCEPT_STRATEGY (this->orb_core_),
+ -1);
+
+ if (this->base_acceptor_.open (addr,
+ reactor,
+ this->creation_strategy_,
+ this->accept_strategy_,
+ this->concurrency_strategy_) == -1)
+ {
+ if (TAO_debug_level > 0)
+ ACE_DEBUG ((LM_DEBUG,
+ ACE_TEXT ("(%P|%t) TAO::HTIOP::Acceptor::open_i ")
+ ACE_TEXT ("- %p"),
+ ACE_TEXT ("cannot open acceptor")));
+ return -1;
+ }
+
+ ACE::HTBP::Addr address;
+
+ // We do this make sure the port number the endpoint is listening on
+ // gets set in the addr.
+ if (this->accept_strategy_->acceptor ().get_local_addr (address) != 0)
+ {
+ // @@ Should this be a catastrophic error???
+ if (TAO_debug_level > 0)
+ ACE_DEBUG ((LM_DEBUG,
+ ACE_TEXT ("(%P|%t) TAO::HTIOP::Acceptor::open_i ")
+ ACE_TEXT ("- %p\n\n"),
+ ACE_TEXT ("cannot get local addr")));
+ return -1;
+ }
+
+ // Set the port for each addr. If there is more than one network
+ // interface then the endpoint created on each interface will be on
+ // the same port. This is how a wildcard socket bind() is supposed
+ // to work.
+ u_short port = address.get_port_number ();
+
+ for (CORBA::ULong j = 0; j < this->endpoint_count_; ++j)
+ this->addrs_[j].set_port_number (port, 1);
+
+ (void) this->accept_strategy_->acceptor().enable (ACE_CLOEXEC);
+
+ // This avoids having child processes acquire the listen socket thereby
+ // denying the server the opportunity to restart on a well-known endpoint.
+ // This does not affect the aberrent behavior on Win32 platforms.
+
+ if (TAO_debug_level > 5)
+ {
+ for (CORBA::ULong i = 0; i < this->endpoint_count_; ++i)
+ {
+ ACE_DEBUG ((LM_DEBUG,
+ ACE_TEXT ("(%P|%t) TAO::HTIOP::Acceptor::open_i - ")
+ ACE_TEXT ("listening on: <%s:%u>\n"),
+ ACE_TEXT_CHAR_TO_TCHAR(this->hosts_[i]),
+ this->addrs_[i].get_port_number ()));
+ }
+ }
+
+ return 0;
+}
+
+int
+TAO::HTIOP::Acceptor::hostname (TAO_ORB_Core *orb_core,
+ ACE_INET_Addr &addr,
+ char *&host,
+ const char *specified_hostname)
+{
+ if (orb_core->orb_params ()->use_dotted_decimal_addresses ())
+ {
+ // If dotted decimal addresses are enabled,
+ // just return ours.
+ return this->dotted_decimal_address (addr, host);
+ }
+ else if (specified_hostname != 0)
+ {
+ // If the user specified a hostname, pass it back
+ // blindly as it overrides our choice of hostname.
+ host = CORBA::string_dup (specified_hostname);
+ }
+ else
+ {
+ char tmp_host[MAXHOSTNAMELEN + 1];
+
+ // Get the hostname associated with our address
+ if (addr.get_host_name (tmp_host, sizeof (tmp_host)) != 0)
+ {
+ // On failure, just return the decimal address.
+ return this->dotted_decimal_address (addr, host);
+ }
+ else
+ {
+ host = CORBA::string_dup (tmp_host);
+ }
+ }
+
+ return 0;
+}
+
+int
+TAO::HTIOP::Acceptor::dotted_decimal_address (ACE_INET_Addr &addr,
+ char *&host)
+{
+ int result = 0;
+ const char *tmp = 0;
+
+ // If the IP address in the INET_Addr is the INADDR_ANY address,
+ // then force the actual IP address to be used by initializing a new
+ // INET_Addr with the hostname from the original one. If that fails
+ // then something is seriously wrong with the systems networking
+ // setup.
+ if (addr.get_ip_address () == INADDR_ANY)
+ {
+ ACE::HTBP::Addr new_addr;
+ result = new_addr.ACE_INET_Addr::set (addr.get_port_number (),
+ addr.get_host_name ());
+ tmp = new_addr.get_host_addr ();
+ }
+ else
+ tmp = addr.get_host_addr ();
+
+ if (tmp == 0 || result != 0)
+ {
+ if (TAO_debug_level > 0)
+ ACE_DEBUG ((LM_DEBUG,
+ ACE_TEXT ("\n\nTAO (%P|%t) ")
+ ACE_TEXT ("TAO::HTIOP::Acceptor::dotted_decimal_address ")
+ ACE_TEXT ("- %p\n\n"),
+ ACE_TEXT ("cannot determine hostname")));
+ return -1;
+ }
+
+ host = CORBA::string_dup (tmp);
+ return 0;
+}
+
+
+int
+TAO::HTIOP::Acceptor::probe_interfaces (TAO_ORB_Core *orb_core)
+{
+ // Extract the hostname for each network interface, and then cache
+ // it. The hostnames will then be used when creating a
+ // TAO::HTIOP::Profile for each endpoint setup on the probed
+ // network interfaces.
+ size_t if_cnt = 0;
+
+ ACE_INET_Addr *inet_addrs = 0;
+
+ if (ACE::get_ip_interfaces (if_cnt,
+ inet_addrs) != 0
+ && errno != ENOTSUP)
+ {
+ // In the case where errno == ENOTSUP, if_cnt and if_addrs will
+ // not be modified, and will each remain equal to zero. This
+ // causes the default interface to be used.
+ return -1;
+ }
+
+ if (if_cnt == 0 || inet_addrs == 0)
+ {
+ if (TAO_debug_level > 0)
+ {
+ ACE_DEBUG ((LM_WARNING,
+ ACE_TEXT ("TAO (%P|%t) Unable to probe network ")
+ ACE_TEXT ("interfaces. Using default.\n")));
+ }
+
+ if_cnt = 1; // Force the network interface count to be one.
+ delete [] inet_addrs;
+ ACE_NEW_RETURN (inet_addrs,
+ ACE_INET_Addr[if_cnt],
+ -1);
+ }
+
+ // Scan for the loopback interface since it shouldn't be included in
+ // the list of cached hostnames unless it is the only interface.
+ size_t lo_cnt = 0; // Loopback interface count
+ for (size_t j = 0; j < if_cnt; ++j)
+ if (inet_addrs[j].get_ip_address () == INADDR_LOOPBACK)
+ lo_cnt++;
+
+ // The instantiation for this template is in
+ // HTIOP/HTIOP_Connector.cpp.
+ ACE_Auto_Basic_Array_Ptr<ACE_INET_Addr> safe_if_addrs (inet_addrs);
+
+ // If the loopback interface is the only interface then include it
+ // in the list of interfaces to query for a hostname, otherwise
+ // exclude it from the list.
+ if (if_cnt == lo_cnt)
+ this->endpoint_count_ = static_cast<CORBA::ULong> (if_cnt);
+ else
+ this->endpoint_count_ = static_cast<CORBA::ULong> (if_cnt - lo_cnt);
+
+ ACE_NEW_RETURN (this->addrs_,
+ ACE::HTBP::Addr[this->endpoint_count_],
+ -1);
+
+ ACE_NEW_RETURN (this->hosts_,
+ char *[this->endpoint_count_],
+ -1);
+
+ ACE_OS::memset (this->hosts_, 0, sizeof (char*) * this->endpoint_count_);
+
+ // The number of hosts/interfaces we want to cache may not be the
+ // same as the number of detected interfaces so keep a separate
+ // count.
+ size_t host_cnt = 0;
+
+ for (size_t i = 0; i < if_cnt; ++i)
+ {
+ // Ignore any loopback interface if there are other
+ // non-loopback interfaces.
+ if (if_cnt != lo_cnt &&
+ inet_addrs[i].get_ip_address() == INADDR_LOOPBACK)
+ continue;
+
+ if (this->hostname_in_ior_ != 0)
+ {
+ if (TAO_debug_level > 2)
+ {
+ ACE_DEBUG ((LM_DEBUG,
+ ACE_TEXT ("Overriding address in IOR with %s\n"),
+ this->hostname_in_ior_));
+ }
+ if (this->hostname (orb_core,
+ inet_addrs[i],
+ this->hosts_[host_cnt],
+ this->hostname_in_ior_) != 0)
+ return -1;
+ }
+ else
+ {
+ if (this->hostname (orb_core,
+ inet_addrs[i],
+ this->hosts_[host_cnt]) != 0)
+ return -1;
+ }
+
+ // Copy the addr. The port is (re)set in
+ // HTIOP_Acceptor::open_i().
+ if (this->addrs_[host_cnt].ACE_INET_Addr::set (inet_addrs[i]) != 0)
+ return -1;
+
+ host_cnt++;
+ }
+
+ return 0;
+}
+
+CORBA::ULong
+TAO::HTIOP::Acceptor::endpoint_count (void)
+{
+ return this->endpoint_count_;
+}
+
+int
+TAO::HTIOP::Acceptor::object_key (IOP::TaggedProfile &profile,
+ TAO::ObjectKey &object_key)
+{
+ // Create the decoding stream from the encapsulation in the buffer,
+#if (TAO_NO_COPY_OCTET_SEQUENCES == 1)
+ TAO_InputCDR cdr (profile.profile_data.mb ());
+#else
+ TAO_InputCDR cdr (reinterpret_cast<char*> (profile.profile_data.get_buffer ()),
+ profile.profile_data.length ());
+#endif /* TAO_NO_COPY_OCTET_SEQUENCES == 1 */
+
+ CORBA::Octet major;
+ CORBA::Octet minor = CORBA::Octet();
+
+ // Read the version. We just read it here. We don't*do any*
+ // processing.
+ if (!(cdr.read_octet (major)
+ && cdr.read_octet (minor)))
+ {
+ if (TAO_debug_level > 0)
+ {
+ ACE_DEBUG ((LM_DEBUG,
+ ACE_TEXT ("(%P|%t) TAO::HTIOP::Acceptor::object_key")
+ ACE_TEXT (" - v%d.%d\n"),
+ major,
+ minor));
+ }
+ return -1;
+ }
+
+ CORBA::String_var host;
+ CORBA::UShort port = 0;
+
+ // Get host and port. No processing here too..
+ if (cdr.read_string (host.out ()) == 0
+ || cdr.read_ushort (port) == 0)
+ {
+ if (TAO_debug_level > 0)
+ {
+ ACE_DEBUG ((LM_DEBUG,
+ ACE_TEXT ("TAO (%P|%t) TAO::HTIOP::Acceptor::object_key - ")
+ ACE_TEXT ("error while decoding host/port")));
+ }
+ return -1;
+ }
+
+ // ... and object key.
+ if ((cdr >> object_key) == 0)
+ return -1;
+
+ // We are NOT bothered about the rest.
+
+ return 1;
+}
+
+
+int
+TAO::HTIOP::Acceptor::parse_options (const char *str)
+{
+ if (str == 0)
+ return 0; // No options to parse. Not a problem.
+
+ // Use an option format similar to the one used for CGI scripts in
+ // HTTP URLs.
+ // e.g.: option1=foo&option2=bar
+
+ ACE_CString options (str);
+ size_t len = options.length ();
+ const char option_delimiter = '&';
+
+ // Count the number of options.
+ CORBA::ULong option_count = 1;
+ // Number of endpoints in the string (initialized to 1).
+
+ // Only check for endpoints after the protocol specification and
+ // before the object key.
+ for (size_t i = 0; i < len; ++i)
+ if (options[i] == option_delimiter)
+ option_count++;
+
+ // The idea behind the following loop is to split the options into
+ // (option, name) pairs.
+ // For example,
+ // `option1=foo&option2=bar'
+ // will be parsed into:
+ // `option1=foo'
+ // `option2=bar'
+
+ ACE_CString::size_type begin = 0;
+ ACE_CString::size_type end = 0;
+
+ for (CORBA::ULong j = 0; j < option_count; ++j)
+ {
+ if (j < option_count - 1)
+ end = options.find (option_delimiter, begin);
+ else
+ end = len;
+
+ if (end == begin)
+ ACE_ERROR_RETURN ((LM_ERROR,
+ ACE_TEXT ("TAO (%P|%t) Zero length HTIOP option.\n")),
+ -1);
+ else if (end != ACE_CString::npos)
+ {
+ ACE_CString opt = options.substring (begin, end);
+
+ ACE_CString::size_type const slot = opt.find ("=");
+
+ if (slot == len - 1
+ || slot == ACE_CString::npos)
+ ACE_ERROR_RETURN ((LM_ERROR,
+ ACE_TEXT ("TAO (%P|%t) HTIOP option <%s> is ")
+ ACE_TEXT ("missing a value.\n"),
+ opt.c_str ()),
+ -1);
+
+ ACE_CString name = opt.substring (0, slot);
+ ACE_CString value = opt.substring (slot + 1);
+
+ if (name.length () == 0)
+ ACE_ERROR_RETURN ((LM_ERROR,
+ ACE_TEXT ("(%P|%t) Zero length HTIOP ")
+ ACE_TEXT ("option name.\n")),
+ -1);
+ else if (name == "hostname_in_ior")
+ {
+ this->hostname_in_ior_ = value.rep ();
+ }
+ else
+ ACE_ERROR_RETURN ((LM_ERROR,
+ ACE_TEXT ("(%P|%t) Invalid HTIOP option: <%s>\n"),
+ name.c_str ()),
+ -1);
+
+ begin = end + 1;
+ }
+ else
+ break; // No other options.
+ }
+ return 0;
+}
+
+TAO_END_VERSIONED_NAMESPACE_DECL
diff --git a/TAO/orbsvcs/orbsvcs/HTIOP/HTIOP_Acceptor.h b/TAO/orbsvcs/orbsvcs/HTIOP/HTIOP_Acceptor.h
new file mode 100644
index 00000000000..6abbb6f23e9
--- /dev/null
+++ b/TAO/orbsvcs/orbsvcs/HTIOP/HTIOP_Acceptor.h
@@ -0,0 +1,239 @@
+// -*- C++ -*-
+
+//=============================================================================
+/**
+ * @file HTIOP_Acceptor.h
+ *
+ * $Id$
+ *
+ * HTIOP specific acceptor processing
+ *
+ *
+ * @author Priyanka Gontla <gontla_p@ociweb.com>
+ */
+//=============================================================================
+
+
+#ifndef HTIOP_ACCEPTOR_H
+#define HTIOP_ACCEPTOR_H
+#include /**/ "ace/pre.h"
+
+#include "orbsvcs/HTIOP/HTIOP_Completion_Handler.h"
+#include "orbsvcs/HTIOP/HTIOP_Connection_Handler.h"
+
+#if !defined (ACE_LACKS_PRAGMA_ONCE)
+# pragma once
+#endif /* ACE_LACKS_PRAGMA_ONCE */
+
+#include "ace/HTBP/HTBP_Addr.h"
+
+#include "tao/Acceptor_Impl.h"
+#include "tao/Transport_Acceptor.h"
+#include "tao/GIOP_Message_Version.h"
+#include "tao/Object_KeyC.h"
+
+#include "ace/SOCK_Acceptor.h"
+
+ACE_BEGIN_VERSIONED_NAMESPACE_DECL
+namespace ACE
+{
+ namespace HTBP
+ {
+ class Environment;
+ }
+}
+ACE_END_VERSIONED_NAMESPACE_DECL
+
+TAO_BEGIN_VERSIONED_NAMESPACE_DECL
+
+namespace TAO
+{
+ namespace HTIOP
+ {
+
+ // TAO HTIOP_Acceptor concrete call definition
+
+ /**
+ * @class HTIOP_Acceptor
+ *
+ * @brief HTIOP_Acceptor
+ *
+ * The HTIOP-specific bridge class for the concrete acceptor.
+ * Based on IIOP_Acceptor
+ */
+ class HTIOP_Export Acceptor : public TAO_Acceptor
+ {
+ public:
+ /// Constructor.
+ Acceptor (ACE::HTBP::Environment *ht_env,
+ int is_inside);
+
+ /// Destructor.
+ ~Acceptor (void);
+
+ /// @@ Helper method for the implementation repository, should go
+ /// away
+ const ACE::HTBP::Addr& address (void) const;
+
+ /// Returns the array of endpoints in this acceptor
+ const ACE::HTBP::Addr *endpoints (void);
+
+ typedef ACE_Strategy_Acceptor<Completion_Handler, ACE_SOCK_ACCEPTOR> BASE_ACCEPTOR;
+ typedef TAO_Creation_Strategy<Completion_Handler> CREATION_STRATEGY;
+ typedef ACE_Concurrency_Strategy<Completion_Handler> CONCURRENCY_STRATEGY;
+ typedef TAO_Accept_Strategy<Completion_Handler, ACE_SOCK_ACCEPTOR> ACCEPT_STRATEGY;
+
+ /**
+ * The TAO::Acceptor methods, check the documentation in
+ * Transport_Acceptor.h for details.
+ */
+ virtual int open (TAO_ORB_Core *orb_core,
+ ACE_Reactor *reactor,
+ int version_major,
+ int version_minor,
+ const char *address,
+ const char *options = 0);
+
+ virtual int open_default (TAO_ORB_Core *orb_core,
+ ACE_Reactor *reactor,
+ int version_major,
+ int version_minor,
+ const char *options = 0);
+
+ virtual int close (void);
+
+ virtual int create_profile (const TAO::ObjectKey &object_key,
+ TAO_MProfile &mprofile,
+ CORBA::Short priority);
+
+ virtual int is_collocated (const TAO_Endpoint *endpoint);
+
+ virtual CORBA::ULong endpoint_count (void);
+
+ virtual int object_key (IOP::TaggedProfile &profile,
+ TAO::ObjectKey &key);
+
+ /**
+ * Set the host name for the given addr.
+ * A hostname may be forced by using specified_hostname. This
+ * is useful if the given address corresponds to more than one
+ * hostname and the desired one cannot be determined in any
+ * other way.
+ */
+ int hostname (TAO_ORB_Core *orb_core,
+ ACE_INET_Addr &addr,
+ char *&host,
+ const char *specified_hostname = 0);
+
+ /**
+ * Set the host name for the given address using the dotted decimal
+ * format.
+ */
+ int dotted_decimal_address (ACE_INET_Addr &addr,
+ char *&host);
+
+ protected:
+
+ /**
+ * Implement the common part of the open*() methods. This method is
+ * virtual to allow a derived class implementation to be invoked
+ * instead.
+ */
+ virtual int open_i (const ACE::HTBP::Addr &addr,
+ ACE_Reactor *reactor);
+
+ /**
+ * Probe the system for available network interfaces, and initialize
+ * the <addrs_> array with an ACE::HTBP::Addr for each network
+ * interface. The port for each initialized ACE::HTBP::Addr will be
+ * set in the open_i() method. This method only gets invoked when
+ * no explicit hostname is provided in the specified endpoint.
+ */
+ int probe_interfaces (TAO_ORB_Core *orb_core);
+
+ /**
+ * Parse protocol specific options.
+ *
+ * Currently supported: hostname_in_ior -- Provides the means to add
+ * in an alternative hostname in the object reference, such as that
+ * of the outside of a firewall.
+ */
+ virtual int parse_options (const char *options);
+
+ /// Helper method to add a new profile to the mprofile for
+ /// each endpoint.
+ int create_new_profile (const TAO::ObjectKey &object_key,
+ TAO_MProfile &mprofile,
+ CORBA::Short priority);
+
+ /// Helper method to create a profile that contains all of
+ /// our endpoints.
+ int create_shared_profile (const TAO::ObjectKey &object_key,
+ TAO_MProfile &mprofile,
+ CORBA::Short priority);
+
+
+ protected:
+
+ /// Array of ACE::HTBP::Addr instances, each one corresponding to a
+ /// given network interface.
+ ACE::HTBP::Addr *addrs_;
+
+ /**
+ * Cache the information about the endpoints serviced by this
+ * acceptor.
+ * There may in fact be multiple hostnames for this endpoint. For
+ * example, if the IP address is INADDR_ANY (0.0.0.0) then there
+ * will be possibly a different hostname for each interface.
+ */
+ char **hosts_;
+
+ /// The number of host names cached in the hosts_ array (equivalent
+ /// to the number of endpoints opened by this Acceptor).
+ CORBA::ULong endpoint_count_;
+
+ /**
+ * Override the hostname used in the ORBEndPoint.
+ */
+ char *hostname_in_ior_;
+
+ /**
+ * The GIOP version for this endpoint
+ * @@ Theoretically they shouldn't be here!! We need to look at a
+ * way to move this out
+ */
+ TAO_GIOP_Message_Version version_;
+
+ /// ORB Core.
+ TAO_ORB_Core *orb_core_;
+
+ private:
+
+ /// the concrete acceptor, as a pointer to it's base class.
+ BASE_ACCEPTOR base_acceptor_;
+
+ /// Acceptor strategies.
+ CREATION_STRATEGY *creation_strategy_;
+ CONCURRENCY_STRATEGY *concurrency_strategy_;
+ ACCEPT_STRATEGY *accept_strategy_;
+
+ ACE::HTBP::Environment *ht_env_;
+
+ /// Flag used to determine if an acceptor should use an "inside"
+ /// local address, or try to compose an "outside" address.
+ /// If the value is 1, then always use an HTID for local addr,
+ /// otherwise use host:port if 0, or guess based on proxy config
+ /// if -1.
+ int inside_;
+ };
+ }
+}
+
+TAO_END_VERSIONED_NAMESPACE_DECL
+
+#if defined(__ACE_INLINE__)
+#include "orbsvcs/HTIOP/HTIOP_Acceptor.i"
+#endif /* __ACE_INLINE__ */
+
+#include /**/ "ace/post.h"
+#endif /* HTIOP_ACCEPTOR_H */
diff --git a/TAO/orbsvcs/orbsvcs/HTIOP/HTIOP_Acceptor.i b/TAO/orbsvcs/orbsvcs/HTIOP/HTIOP_Acceptor.i
new file mode 100644
index 00000000000..6b3279c0c04
--- /dev/null
+++ b/TAO/orbsvcs/orbsvcs/HTIOP/HTIOP_Acceptor.i
@@ -0,0 +1,28 @@
+// -*- C++ -*-
+//
+// $Id$
+
+TAO_BEGIN_VERSIONED_NAMESPACE_DECL
+
+ACE_INLINE const ACE::HTBP::Addr&
+TAO::HTIOP::Acceptor::address (void) const
+{
+ ACE_ASSERT (this->addrs_ != 0);
+
+ // @@ This is busted.
+ // The Implementation Repository will have to start supporting
+ // IORs with multiple profiles. For now, we just return the
+ // first addr.
+ // -Ossama
+ return this->addrs_[0];
+}
+
+ACE_INLINE const ACE::HTBP::Addr *
+TAO::HTIOP::Acceptor::endpoints (void)
+{
+ ACE_ASSERT (this->addrs_ != 0);
+
+ return this->addrs_;
+}
+
+TAO_END_VERSIONED_NAMESPACE_DECL
diff --git a/TAO/orbsvcs/orbsvcs/HTIOP/HTIOP_Acceptor_Impl.cpp b/TAO/orbsvcs/orbsvcs/HTIOP/HTIOP_Acceptor_Impl.cpp
new file mode 100644
index 00000000000..f990f16ce1b
--- /dev/null
+++ b/TAO/orbsvcs/orbsvcs/HTIOP/HTIOP_Acceptor_Impl.cpp
@@ -0,0 +1,322 @@
+// $Id$
+
+#ifndef HTIOP_ACCEPTOR_IMPL_CPP
+#define HTIOP_ACCEPTOR_IMPL_CPP
+
+#include "orbsvcs/HTIOP/HTIOP_Acceptor_Impl.h"
+#include "orbsvcs/HTIOP/HTIOP_Completion_Handler.h"
+
+#if !defined (ACE_LACKS_PRAGMA_ONCE)
+# pragma once
+#endif /* ACE_LACKS_PRAGMA_ONCE */
+
+#include "ace/HTBP/HTBP_Stream.h"
+#include "ace/HTBP/HTBP_Session.h"
+
+#include "tao/ORB_Core.h"
+#include "tao/ORB_Table.h"
+#include "tao/Server_Strategy_Factory.h"
+#include "tao/Connector_Registry.h"
+#include "tao/Transport_Cache_Manager.h"
+#include "tao/Thread_Lane_Resources.h"
+
+#include "ace/Object_Manager.h"
+
+TAO_BEGIN_VERSIONED_NAMESPACE_DECL
+
+////////////////////////////////////////////////////////////////////////////////
+
+template <class SVC_HANDLER>
+TAO::HTIOP::Creation_Strategy<SVC_HANDLER>::Creation_Strategy (TAO_ORB_Core *orb_core,
+ CORBA::Boolean flag)
+ : orb_core_ (orb_core),
+ lite_flag_ (flag)
+{
+}
+
+template <class SVC_HANDLER> int
+TAO::HTIOP::Creation_Strategy<SVC_HANDLER>::make_svc_handler (SVC_HANDLER *&sh)
+{
+ if (sh == 0)
+ {
+ ACE_DEBUG ((LM_DEBUG, "Make Svc Handler\n"));
+ ACE_NEW_RETURN (sh,
+ SVC_HANDLER (this->orb_core_),
+ -1);
+ }
+
+ return 0;
+}
+
+///////////////////////////////////////////////////////////////////////////////
+
+template <class SVC_HANDLER, ACE_PEER_ACCEPTOR_1>
+TAO::HTIOP::Accept_Strategy<SVC_HANDLER, ACE_PEER_ACCEPTOR_2>::Accept_Strategy (TAO_ORB_Core *orb_core)
+ : orb_core_ (orb_core)
+{
+}
+
+template <class SVC_HANDLER, ACE_PEER_ACCEPTOR_1> int
+TAO::HTIOP::Accept_Strategy<SVC_HANDLER, ACE_PEER_ACCEPTOR_2>::open (
+ const ACE_PEER_ACCEPTOR_ADDR &local_addr,
+ int restart)
+{
+ if (this->peer_acceptor_.open (local_addr, restart) == -1)
+ return -1;
+
+ this->peer_acceptor_.enable (ACE_NONBLOCK);
+
+ return 0;
+}
+
+
+/// Returns the underlying PEER_ACCEPTOR object
+template <class SVC_HANDLER, ACE_PEER_ACCEPTOR_1> ACE_PEER_ACCEPTOR &
+TAO::HTIOP::Accept_Strategy<SVC_HANDLER, ACE_PEER_ACCEPTOR_2>::acceptor (void) const
+{
+ return (ACE_PEER_ACCEPTOR &) this->peer_acceptor_;
+}
+
+/// Returns the underlying PEER_ACCEPTOR object
+template <class SVC_HANDLER, ACE_PEER_ACCEPTOR_1> ACE_HANDLE
+TAO::HTIOP::Accept_Strategy<SVC_HANDLER, ACE_PEER_ACCEPTOR_2>::get_handle (void) const
+{
+ return this->peer_acceptor_.get_handle ();
+}
+
+template <class SVC_HANDLER, ACE_PEER_ACCEPTOR_1> int
+TAO::HTIOP::Accept_Strategy<SVC_HANDLER, ACE_PEER_ACCEPTOR_2>::accept_svc_handler (SVC_HANDLER *svc_handler)
+{
+ ACE_DEBUG ((LM_DEBUG, "accept_svc_handler\n"));
+ if (this->peer_acceptor_.accept (svc_handler->peer (),
+ 0,
+ 0,
+ 1,
+ 0 /* reset_new_handle */) == -1)
+ {
+ svc_handler->close (0);
+
+ return -1;
+ }
+
+ ACE_DEBUG ((LM_DEBUG, "Accept_svc_handler, skipping first_recv\n"));
+ return 0;
+}
+
+template <class SVC_HANDLER, ACE_PEER_ACCEPTOR_1>
+TAO::HTIOP::Strategy_Acceptor<SVC_HANDLER, ACE_PEER_ACCEPTOR_2>::
+Strategy_Acceptor (const ACE_TCHAR service_name[],
+ const ACE_TCHAR service_description[],
+ int use_select,
+ int reuse_addr)
+
+{
+ ACE_UNUSED_ARG (service_name);
+ ACE_UNUSED_ARG (service_description);
+ ACE_UNUSED_ARG (use_select);
+ ACE_UNUSED_ARG (reuse_addr);
+}
+
+template <class SVC_HANDLER, ACE_PEER_ACCEPTOR_1> int
+TAO::HTIOP::Strategy_Acceptor<SVC_HANDLER, ACE_PEER_ACCEPTOR_2>::shared_open (
+ const ACE_PEER_ACCEPTOR_ADDR &local_addr,
+ int protocol_family,
+ int backlog)
+{
+ int error = 0;
+#if defined (ACE_HAS_IPV6)
+ ACE_ASSERT (protocol_family == PF_INET || protocol_family == PF_INET6);
+
+ if (protocol_family == PF_INET6)
+ {
+ sockaddr_in6 local_inet6_addr;
+ ACE_OS::memset (reinterpret_cast<void *> (&local_inet6_addr),
+ 0,
+ sizeof local_inet6_addr);
+
+ if (local_addr == ACE_Addr::sap_any)
+ {
+ local_inet6_addr.sin6_family = AF_INET6;
+ local_inet6_addr.sin6_port = 0;
+ local_inet6_addr.sin6_addr = in6addr_any;
+ }
+ else
+ local_inet6_addr = *reinterpret_cast<sockaddr_in6 *> (local_addr.get_addr ());
+
+ // We probably don't need a bind_port written here.
+ // There are currently no supported OS's that define
+ // ACE_LACKS_WILDCARD_BIND.
+ if (ACE_OS::bind (this->get_handle (),
+ reinterpret_cast<sockaddr *> (&local_inet6_addr),
+ sizeof local_inet6_addr) == -1)
+ error = 1;
+ }
+ else
+#endif
+ if (protocol_family == PF_INET)
+ {
+ sockaddr_in local_inet_addr;
+ ACE_OS::memset (reinterpret_cast<void *> (&local_inet_addr),
+ 0,
+ sizeof local_inet_addr);
+
+ if (local_addr == ACE_Addr::sap_any)
+ {
+ local_inet_addr.sin_port = 0;
+ }
+ else
+ local_inet_addr = *reinterpret_cast<sockaddr_in *> (local_addr.get_addr ());
+ if (local_inet_addr.sin_port == 0)
+ {
+ if (ACE::bind_port (this->get_handle ()) == -1)
+ error = 1;
+ }
+ else if (ACE_OS::bind (this->get_handle (),
+ reinterpret_cast<sockaddr *> (&local_inet_addr),
+ sizeof local_inet_addr) == -1)
+ error = 1;
+ }
+ else if (ACE_OS::bind (this->get_handle (),
+ (sockaddr *) local_addr.get_addr (),
+ local_addr.get_size ()) == -1)
+ error = 1;
+
+ if (error != 0
+ || ACE_OS::listen (this->get_handle (),
+ backlog) == -1)
+ {
+ error = 1;
+ this->close ();
+ }
+
+ return error ? -1 : 0;
+}
+
+template <class SVC_HANDLER, ACE_PEER_ACCEPTOR_1> int
+TAO::HTIOP::Strategy_Acceptor<SVC_HANDLER, ACE_PEER_ACCEPTOR_2>::open(
+ const ACE_PEER_ACCEPTOR_ADDR &local_addr,
+ ACE_Reactor *reactor,
+ TAO::HTIOP::Creation_Strategy<SVC_HANDLER> * cre_s,
+ TAO::HTIOP::Accept_Strategy<SVC_HANDLER, ACE_PEER_ACCEPTOR_2> *acc_s,
+ ACE_Concurrency_Strategy<SVC_HANDLER> *con_s,
+ int reuse_addr)
+{
+ this->reactor (reactor);
+
+ this->accept_strategy_ = acc_s;
+ this->concurrency_strategy_ = con_s;
+ this->creation_strategy_ = cre_s;
+
+ if (this->accept_strategy_->open (local_addr, reuse_addr) == -1)
+ return -1;
+
+ if (this->accept_strategy_->acceptor ().enable (ACE_NONBLOCK) != 0)
+ return -1;
+
+ int result =
+ reactor->register_handler (this,
+ ACE_Event_Handler::ACCEPT_MASK);
+
+
+ return result;
+}
+
+template <class SVC_HANDLER, ACE_PEER_ACCEPTOR_1> int
+TAO::HTIOP::Strategy_Acceptor<SVC_HANDLER, ACE_PEER_ACCEPTOR_2>::close ()
+{
+ ACE_TRACE ("TAO::HTIOP::Strategy_Acceptor<SVC_HANDLER, ACE_PEER_ACCEPTOR_2>::close");
+
+ // Guard against multiple closes.
+ if (this->reactor () != 0)
+ {
+ ACE_HANDLE handle = this->get_handle ();
+
+ this->reactor ()->remove_handler
+ (handle,
+ // We must pass the DONT_CALL flag here to avoid infinite
+ // recursion.
+ ACE_Event_Handler::ACCEPT_MASK | ACE_Event_Handler::DONT_CALL);
+
+ // Shut down the listen socket to recycle the handles.
+ if (this->accept_strategy_->acceptor ().close () == -1)
+ ACE_ERROR ((LM_ERROR,
+ ACE_TEXT ("close\n")));
+ // Set the Reactor to 0 so that we don't try to close down
+ // again.
+ this->reactor (0);
+ }
+ return 0;
+}
+
+template <class SVC_HANDLER, ACE_PEER_ACCEPTOR_1> ACE_HANDLE
+TAO::HTIOP::Strategy_Acceptor<SVC_HANDLER, ACE_PEER_ACCEPTOR_2>::get_handle () const
+{
+ return this->accept_strategy_->get_handle ();
+}
+
+template <class SVC_HANDLER, ACE_PEER_ACCEPTOR_1> int
+TAO::HTIOP::Strategy_Acceptor<SVC_HANDLER, ACE_PEER_ACCEPTOR_2>::handle_input (ACE_HANDLE listener)
+{
+ ACE_Handle_Set conn_handle;
+
+ ACE_Time_Value timeout;
+
+ # if defined (ACE_WIN64)
+ // This arg is ignored on Windows and causes pointer truncation
+ // warnings on 64-bit compiles.
+ int select_width = 0;
+# else
+ int select_width = int (listener) + 1;
+# endif /* ACE_WIN64 */
+
+ // TAO_HTIOP connections cannot be attached to sessions or anything else until
+ // after the HTTP request header is read. So the acceptor here just creates
+ // completion handler that gets the header data and then creates the
+ // association between the connection handler and the session, or
+ // re-establishes an existing session.
+ do
+ {
+ TAO::HTIOP::Completion_Handler *sh = 0;
+ if (this->make_svc_handler(sh) == -1 ||
+ this->accept_svc_handler (sh) == -1 ||
+ this->activate_svc_handler (sh) == -1)
+ return -1;
+ }
+
+ // Now, check to see if there is another connection pending and
+ // break out of the loop if there is none.
+
+ //int use_select = 1;
+ while (1
+ && ACE_OS::select (select_width,
+ conn_handle,
+ 0,
+ 0,
+ &timeout) == 1);
+ return 0;
+}
+
+
+template <class SVC_HANDLER, ACE_PEER_ACCEPTOR_1> int
+TAO::HTIOP::Strategy_Acceptor<SVC_HANDLER, ACE_PEER_ACCEPTOR_2>::activate_svc_handler (SVC_HANDLER *svc_handler)
+{
+ return this->concurrency_strategy_->activate_svc_handler (svc_handler,
+ (void *) this);
+}
+
+
+template <class SVC_HANDLER, ACE_PEER_ACCEPTOR_1> int
+TAO::HTIOP::Strategy_Acceptor<SVC_HANDLER, ACE_PEER_ACCEPTOR_2>::accept_svc_handler (SVC_HANDLER *svc_handler)
+{
+ return this->accept_strategy_->accept_svc_handler (svc_handler);
+}
+
+template <class SVC_HANDLER, ACE_PEER_ACCEPTOR_1> int
+TAO::HTIOP::Strategy_Acceptor<SVC_HANDLER, ACE_PEER_ACCEPTOR_2>::make_svc_handler (SVC_HANDLER *&sh)
+{
+ return this->creation_strategy_->make_svc_handler (sh);
+}
+
+TAO_END_VERSIONED_NAMESPACE_DECL
+
+#endif /* HTIOP_ACCEPTOR_IMPL_CPP */
diff --git a/TAO/orbsvcs/orbsvcs/HTIOP/HTIOP_Acceptor_Impl.h b/TAO/orbsvcs/orbsvcs/HTIOP/HTIOP_Acceptor_Impl.h
new file mode 100644
index 00000000000..9bfc69280c4
--- /dev/null
+++ b/TAO/orbsvcs/orbsvcs/HTIOP/HTIOP_Acceptor_Impl.h
@@ -0,0 +1,156 @@
+// -*- C++ -*-
+
+//=============================================================================
+/**
+ * @file HTIOP_Acceptor_Impl.h
+ *
+ * $Id$
+ *
+ * @author Priyanka Gontla <gontla_p@ociweb.com>
+ */
+//=============================================================================
+
+
+#ifndef HTIOP_ACCEPTOR_IMPL_H
+#define HTIOP_ACCEPTOR_IMPL_H
+#include /**/ "ace/pre.h"
+
+#include "ace/Acceptor.h"
+#include "ace/SOCK_Acceptor.h"
+
+#if !defined (ACE_LACKS_PRAGMA_ONCE)
+# pragma once
+#endif /* ACE_LACKS_PRAGMA_ONCE */
+
+#include "tao/corbafwd.h"
+
+TAO_BEGIN_VERSIONED_NAMESPACE_DECL
+
+// Forward declarations.
+class TAO_ORB_Core;
+
+namespace TAO
+{
+ namespace HTIOP
+ {
+ /**
+ * @class Creation_Strategy
+ *
+ * @brief Creates a Svc_Handler and set the ORB_Core pointer on it.
+ */
+ template <class SVC_HANDLER>
+ class Creation_Strategy : public ACE_Creation_Strategy<SVC_HANDLER>
+ {
+ public:
+ /**
+ * Constructor. <arg> parameter is used to pass any special
+ * state/info to the service handler upon creation.
+
+ */
+ Creation_Strategy (TAO_ORB_Core *orb_core,
+ CORBA::Boolean flag = 0);
+
+ /// Create a SVC_HANDLER and set the ORB_Core pointer on it.
+ int make_svc_handler (SVC_HANDLER *&sh);
+
+ protected:
+ /// Pointer to the ORB Core.
+ TAO_ORB_Core *orb_core_;
+
+ /// Should we use the Lite version for any protocol?
+ CORBA::Boolean lite_flag_;
+ };
+
+ template <class SVC_HANDLER, ACE_PEER_ACCEPTOR_1>
+ class Accept_Strategy
+ {
+ public:
+
+ /// Constructor.
+ Accept_Strategy (TAO_ORB_Core *orb_core);
+
+ /// Initialize the <peer_acceptor_> with <local_addr>. If the
+ /// process runs out of handles, purge some "old" connections.
+ int open (const ACE_PEER_ACCEPTOR_ADDR &local_addr,
+ int restart = 0);
+
+ /// Returns the underlying PEER_ACCEPTOR object
+ ACE_PEER_ACCEPTOR &acceptor (void) const;
+
+ /// Delegates to the <accept> method of the PEER_ACCEPTOR. If the
+ /// process runs out of handles, purge some "old" connections.
+ int accept_svc_handler (SVC_HANDLER *svc_handler);
+
+ ACE_HANDLE get_handle (void) const;
+
+ protected:
+
+ /// Pointer to the ORB Core.
+ TAO_ORB_Core *orb_core_;
+
+ private:
+
+ /// Factory that establishes connections passively
+ ACE_PEER_ACCEPTOR peer_acceptor_;
+ };
+
+
+ template <class SVC_HANDLER, ACE_PEER_ACCEPTOR_1>
+ class Strategy_Acceptor : public ACE_Service_Object
+ {
+ public:
+
+ /// Default constructor.
+ Strategy_Acceptor (const ACE_TCHAR service_name[] = 0,
+ const ACE_TCHAR service_description[] = 0,
+ int use_select = 1,
+ int reuse_addr = 1);
+
+ int open (const ACE_PEER_ACCEPTOR_ADDR &,
+ ACE_Reactor * = ACE_Reactor::instance (),
+ Creation_Strategy<SVC_HANDLER> * = 0,
+ Accept_Strategy<SVC_HANDLER, ACE_PEER_ACCEPTOR_2> * =0,
+ ACE_Concurrency_Strategy<SVC_HANDLER> * = 0,
+ int reuse_addr = 1);
+
+ int close ();
+
+ virtual ACE_HANDLE get_handle (void) const;
+
+
+ private:
+
+ int handle_input (ACE_HANDLE);
+
+ int activate_svc_handler (SVC_HANDLER *svc_handler);
+
+ int accept_svc_handler (SVC_HANDLER *svc_handler);
+
+ int make_svc_handler (SVC_HANDLER *&sh);
+
+ int shared_open (const ACE_PEER_ACCEPTOR_ADDR &,
+ int protocol_family,
+ int backlog);
+
+ Accept_Strategy<SVC_HANDLER, ACE_PEER_ACCEPTOR_2> *accept_strategy_;
+
+ Creation_Strategy<SVC_HANDLER> * creation_strategy_;
+
+ ACE_Concurrency_Strategy<SVC_HANDLER> * concurrency_strategy_;
+ };
+
+ }
+}
+
+TAO_END_VERSIONED_NAMESPACE_DECL
+
+#if defined (ACE_TEMPLATES_REQUIRE_SOURCE)
+#include "orbsvcs/HTIOP/HTIOP_Acceptor_Impl.cpp"
+#endif /* ACE_TEMPLATES_REQUIRE_SOURCE */
+
+#if defined (ACE_TEMPLATES_REQUIRE_PRAGMA)
+#pragma implementation ("HTIOP_Acceptor_Impl.cpp")
+#endif /* ACE_TEMPLATES_REQUIRE_PRAGMA */
+
+#include /**/ "ace/post.h"
+#endif /* HTIOP_AccePTOR_IMPL_H */
diff --git a/TAO/orbsvcs/orbsvcs/HTIOP/HTIOP_Completion_Handler.cpp b/TAO/orbsvcs/orbsvcs/HTIOP/HTIOP_Completion_Handler.cpp
new file mode 100644
index 00000000000..de9b6a14cd2
--- /dev/null
+++ b/TAO/orbsvcs/orbsvcs/HTIOP/HTIOP_Completion_Handler.cpp
@@ -0,0 +1,181 @@
+// $Id$
+
+#include "orbsvcs/HTIOP/HTIOP_Completion_Handler.h"
+
+#include "orbsvcs/HTIOP/HTIOP_Transport.h"
+#include "orbsvcs/HTIOP/HTIOP_Endpoint.h"
+
+#include "ace/HTBP/HTBP_Stream.h"
+#include "ace/HTBP/HTBP_Session.h"
+
+#include "tao/Timeprobe.h"
+#include "tao/debug.h"
+#include "tao/ORB_Core.h"
+#include "tao/Server_Strategy_Factory.h"
+#include "tao/Transport_Cache_Manager.h"
+#include "tao/Thread_Lane_Resources.h"
+#include "tao/Acceptor_Impl.h"
+
+ACE_RCSID (HTIOP,
+ TAO_HTIOP_Completion_Handler,
+ "$Id$")
+
+
+TAO_BEGIN_VERSIONED_NAMESPACE_DECL
+
+TAO::HTIOP::Completion_Handler::Completion_Handler (ACE_Thread_Manager *t)
+ : COMPLETION_BASE(t,0,0),
+ orb_core_ (0),
+ channel_(0),
+ concurrency_strategy_ (0)
+{
+ // This constructor should *never* get called, it is just here to
+ // make the compiler happy: the default implementation of the
+ // Creation_Strategy requires a constructor with that signature, we
+ // don't use that implementation, but some (most?) compilers
+ // instantiate it anyway.
+ ACE_ASSERT (this->orb_core_ != 0);
+}
+
+TAO::HTIOP::Completion_Handler::Completion_Handler (TAO_ORB_Core *orb_core,
+ CORBA::Boolean )
+ : COMPLETION_BASE(orb_core->thr_mgr(),0,0),
+ orb_core_ (orb_core),
+ channel_(0),
+ concurrency_strategy_ (0)
+{
+}
+
+
+TAO::HTIOP::Completion_Handler::~Completion_Handler (void)
+{
+}
+
+int
+TAO::HTIOP::Completion_Handler::open (void*)
+{
+ this->orb_core_->reactor()->register_handler(this,
+ ACE_Event_Handler::READ_MASK);
+
+ ACE_NEW_RETURN (concurrency_strategy_,
+ TAO::HTIOP::CONCURRENCY_STRATEGY2 (this->orb_core_),
+ -1);
+ return 0;
+}
+
+int
+TAO::HTIOP::Completion_Handler::resume_handler (void)
+{
+ return ACE_Event_Handler::ACE_APPLICATION_RESUMES_HANDLER;
+}
+
+int
+TAO::HTIOP::Completion_Handler::handle_input (ACE_HANDLE h)
+{
+ // Create a service handler, using the appropriate creation
+ // strategy.
+ if (this->channel_ == 0)
+ ACE_NEW_RETURN (this->channel_,
+ ACE::HTBP::Channel (h),
+ -1);
+
+ if (this->channel_->pre_recv() != 0)
+ ACE_ERROR_RETURN ((LM_ERROR,
+ "TAO::HTIOP::Completion_Handler: pre_recv not done, "
+ "channel state = %d\n",
+ this->channel_->state()),
+ 0);
+
+ this->reactor()->remove_handler (this,
+ ACE_Event_Handler::READ_MASK |
+ ACE_Event_Handler::DONT_CALL);
+
+ this->channel_->register_notifier(this->reactor());
+
+ // look up session related to the channel.
+ // Do we already have a handler for it?
+ // If so, get the connection handler, otherwise create it new.
+
+ ACE::HTBP::Session *session = this->channel_->session();
+ ACE_Event_Handler *handler = session->handler();
+
+ if (handler == 0)
+ {
+ TAO::HTIOP::Connection_Handler *svc_handler = 0;
+ if (this->make_svc_handler (svc_handler) == -1)
+ {
+ if (TAO_debug_level > 0)
+ ACE_DEBUG ((LM_DEBUG,
+ ACE_TEXT ("TAO::HTIOP::Completion_Handler %p\n"),
+ ACE_TEXT ("make_svc_handler")));
+ return -1;
+ }
+
+ svc_handler->peer().session(session);
+ session->handler (svc_handler);
+
+ svc_handler->transport()->register_handler();
+ svc_handler->open(0);
+#if 0
+ // *** I am not yet sure how to reconsile the notification strategy
+ // with TPC concurrency.
+
+ // Activate the <svc_handler> using the designated concurrency
+ // strategy (note that this method becomes responsible for
+ // handling errors and freeing up the memory if things go
+ // awry...).
+ if (this->concurrency_strategy_->
+ activate_svc_handler (svc_handler,this->arg_) == -1)
+ {
+ // Note that <activate_svc_handler> closes the <svc_handler>
+ // on failure.
+
+ if (TAO_debug_level > 0)
+ ACE_DEBUG ((LM_DEBUG,
+ ACE_TEXT ("%p\n"),
+ ACE_TEXT ("activate_svc_handler")));
+ return -1;
+ }
+#endif /* 0 */
+ }
+
+ if (this->channel_->state() == ACE::HTBP::Channel::Data_Queued)
+ {
+ this->reactor()->notify (session->handler(),
+ ACE_Event_Handler::READ_MASK);
+ }
+ return 0;
+}
+
+int
+TAO::HTIOP::Completion_Handler::make_svc_handler (TAO::HTIOP::Connection_Handler *&sh)
+{
+ if (sh == 0)
+ {
+ // Purge connections (if necessary)
+ this->orb_core_->lane_resources ().transport_cache ().purge ();
+ ACE_NEW_RETURN (sh,
+ TAO::HTIOP::Connection_Handler (this->orb_core_,
+ 0),
+ -1);
+ }
+
+ return 0;
+}
+
+int
+TAO::HTIOP::Completion_Handler::add_transport_to_cache (void)
+{
+ return 0;
+}
+
+int
+TAO::HTIOP::Completion_Handler::handle_close (ACE_HANDLE,
+ ACE_Reactor_Mask)
+{
+ //commit suicide
+ delete this;
+ return 0;
+}
+
+TAO_END_VERSIONED_NAMESPACE_DECL
diff --git a/TAO/orbsvcs/orbsvcs/HTIOP/HTIOP_Completion_Handler.h b/TAO/orbsvcs/orbsvcs/HTIOP/HTIOP_Completion_Handler.h
new file mode 100644
index 00000000000..63ba0a96b34
--- /dev/null
+++ b/TAO/orbsvcs/orbsvcs/HTIOP/HTIOP_Completion_Handler.h
@@ -0,0 +1,99 @@
+// -*- C++ -*-
+
+// ===================================================================
+/**
+ * @file HTIOP_Completion_Handler.h
+ *
+ * $Id$
+ *
+ * @author Priyanka Gontla <gontla_p@ociweb.com>
+ */
+// ===================================================================
+
+#ifndef HTIOP_COMPLETION_HANDLER_H
+#define HTIOP_COMPLETION_HANDLER_H
+#include /**/ "ace/pre.h"
+
+#include "ace/Acceptor.h"
+#include "ace/Reactor.h"
+#include "ace/Svc_Handler.h"
+#include "ace/SOCK_Stream.h"
+#include "tao/Acceptor_Impl.h"
+
+#if !defined (ACE_LACKS_PRAGMA_ONCE)
+#pragma once
+#endif /* ACE_LACKS_PRAGMA_ONCE */
+
+#include "orbsvcs/HTIOP/HTIOP_Export.h"
+#include "orbsvcs/HTIOP/HTIOP_Connection_Handler.h"
+
+TAO_BEGIN_VERSIONED_NAMESPACE_DECL
+
+class TAO_ORB_Core;
+// ****************************************************************
+
+namespace TAO
+{
+ namespace HTIOP
+ {
+
+ /**
+ * @class Completion_Handler
+ *
+ * @brief Helps the HTIOP Acceptor complete a connection.
+ *
+ * The Completion Handler owns a newly accepted connection until the
+ * first data read. At that point, the session and data flow direction
+ * are known so the stream may be handed off to either an existing
+ * session, or to a newly created one.
+ */
+
+ typedef TAO_Concurrency_Strategy<Connection_Handler> CONCURRENCY_STRATEGY2;
+
+ typedef ACE_Svc_Handler<ACE_SOCK_STREAM,ACE_NULL_SYNCH> COMPLETION_BASE;
+
+ class HTIOP_Export Completion_Handler : public COMPLETION_BASE
+ {
+
+ public:
+ Completion_Handler (ACE_Thread_Manager* t = 0);
+ /// Constructor. <arg> parameter is used by the Acceptor to pass the
+ /// protocol configuration properties for this connection.
+ Completion_Handler (TAO_ORB_Core *orb_core,
+ CORBA::Boolean = 0 );
+
+ /// Destructor.
+ ~Completion_Handler (void);
+
+ /// Called by the <Strategy_Acceptor> when the handler is completely
+ /// connected. Argument is unused.
+ virtual int open (void *);
+
+ //@{
+ /** @name Event Handler overloads
+ */
+ virtual int handle_input (ACE_HANDLE);
+
+ virtual int resume_handler (void);
+ virtual int handle_close (ACE_HANDLE, ACE_Reactor_Mask);
+ //@}
+
+ // this does nothing, but satisfies a requirement for the TAO_Accept_stratgy.
+ int add_transport_to_cache (void);
+
+ private:
+ int make_svc_handler (Connection_Handler *&sh);
+ int activate_svc_handler (Connection_Handler *sh);
+
+ TAO_ORB_Core *orb_core_;
+ ACE::HTBP::Channel *channel_;
+
+ CONCURRENCY_STRATEGY2 *concurrency_strategy_;
+ };
+ }
+}
+
+TAO_END_VERSIONED_NAMESPACE_DECL
+
+#include /**/ "ace/post.h"
+#endif /* HTIOP_COMPLETION_HANDLER_H */
diff --git a/TAO/orbsvcs/orbsvcs/HTIOP/HTIOP_Connection_Handler.cpp b/TAO/orbsvcs/orbsvcs/HTIOP/HTIOP_Connection_Handler.cpp
new file mode 100644
index 00000000000..00a99a84351
--- /dev/null
+++ b/TAO/orbsvcs/orbsvcs/HTIOP/HTIOP_Connection_Handler.cpp
@@ -0,0 +1,289 @@
+// $Id$
+
+#include "orbsvcs/HTIOP/HTIOP_Connection_Handler.h"
+
+#include "orbsvcs/HTIOP/HTIOP_Transport.h"
+#include "orbsvcs/HTIOP/HTIOP_Endpoint.h"
+
+#include "ace/HTBP/HTBP_Stream.h"
+#include "ace/HTBP/HTBP_Session.h"
+
+#include "tao/Timeprobe.h"
+#include "tao/debug.h"
+#include "tao/ORB_Core.h"
+#include "tao/ORB.h"
+#include "tao/CDR.h"
+#include "tao/Server_Strategy_Factory.h"
+
+#include "tao/Transport_Cache_Manager.h"
+#include "tao/Thread_Lane_Resources.h"
+#include "tao/Base_Transport_Property.h"
+#include "tao/Resume_Handle.h"
+#include "tao/Protocols_Hooks.h"
+
+ACE_RCSID (HTIOP,
+ TAO_HTIOP_Connection_Handler,
+ "$Id$")
+
+
+TAO_BEGIN_VERSIONED_NAMESPACE_DECL
+
+TAO::HTIOP::Connection_Handler::Connection_Handler (ACE_Thread_Manager *t)
+ : SVC_HANDLER (t,0,0),
+ TAO_Connection_Handler (0)
+{
+ // This constructor should *never* get called, it is just here to
+ // make the compiler happy: the default implementation of the
+ // Creation_Strategy requires a constructor with that signature, we
+ // don't use that implementation, but some (most?) compilers
+ // instantiate it anyway.
+ ACE_ASSERT (this->orb_core () != 0);
+}
+
+TAO::HTIOP::Connection_Handler::Connection_Handler (TAO_ORB_Core *orb_core,
+ CORBA::Boolean flag)
+ : SVC_HANDLER (orb_core->thr_mgr (), 0, 0),
+ TAO_Connection_Handler (orb_core)
+{
+ TAO::HTIOP::Transport* specific_transport = 0;
+ ACE_NEW(specific_transport,
+ TAO::HTIOP::Transport (this, orb_core, flag));
+
+ this->transport (specific_transport);
+}
+
+TAO::HTIOP::Connection_Handler::~Connection_Handler (void)
+{
+}
+
+int
+TAO::HTIOP::Connection_Handler::open_handler (void *v)
+{
+ return this->open (v);
+}
+
+int
+TAO::HTIOP::Connection_Handler::open (void*)
+{
+ if (this->transport ()->wait_strategy ()->non_blocking ())
+ {
+ if (this->peer ().enable (ACE_NONBLOCK) == -1)
+ return -1;
+ }
+
+ // Called by the <Strategy_Acceptor> when the handler is
+ // completely connected.
+
+ ACE::HTBP::Addr remote_addr;
+ if (this->peer ().get_remote_addr (remote_addr) == -1)
+ return -1;
+
+ ACE::HTBP::Addr local_addr;
+ if (this->peer ().get_local_addr (local_addr) == -1)
+ return -1;
+
+ if (local_addr.get_ip_address () == remote_addr.get_ip_address ()
+ && local_addr.get_port_number () == remote_addr.get_port_number ())
+ {
+
+ if (TAO_debug_level > 0)
+ {
+ ACE_TCHAR remote_as_string[MAXHOSTNAMELEN + 16];
+ ACE_TCHAR local_as_string[MAXHOSTNAMELEN + 16];
+
+ (void) remote_addr.addr_to_string (remote_as_string,
+ sizeof(remote_as_string),
+ 0);
+ (void) local_addr.addr_to_string (local_as_string,
+ sizeof(local_as_string),
+ 0);
+ ACE_ERROR ((LM_ERROR,
+ ACE_TEXT("TAO(%P|%t) - TAO::HTIOP::Connection_Handler::open, ")
+ ACE_TEXT("Holy Cow! The remote addr and ")
+ ACE_TEXT("local addr are identical (%s == %s)\n"),
+ remote_as_string, local_as_string));
+ }
+ return -1;
+ }
+
+ if (TAO_debug_level > 0)
+ {
+ ACE_TCHAR client[MAXHOSTNAMELEN + 16];
+
+ // Verify that we can resolve the peer hostname.
+ if (remote_addr.addr_to_string (client, sizeof (client), 0) == -1)
+ return -1;
+
+ ACE_DEBUG ((LM_DEBUG,
+ ACE_TEXT ("TAO (%P|%t) TAO_HTIOP connection to peer ")
+ ACE_TEXT ("<%s> on %d\n"),
+ client, this->peer ().get_handle ()));
+ }
+
+ // Set the id in the transport now that we're active.
+ // Use C-style cast b/c otherwise we get warnings on lots of compilers
+ if (!this->transport ()->post_open ((size_t) this->get_handle ()))
+ return -1;
+
+ this->state_changed (TAO_LF_Event::LFS_SUCCESS,
+ this->orb_core ()->leader_follower ());
+
+ return 0;
+}
+
+int
+TAO::HTIOP::Connection_Handler::resume_handler (void)
+{
+ return ACE_Event_Handler::ACE_APPLICATION_RESUMES_HANDLER;
+}
+
+int
+TAO::HTIOP::Connection_Handler::close_connection (void)
+{
+ return this->close_connection_eh (this);
+}
+
+int
+TAO::HTIOP::Connection_Handler::handle_input (ACE_HANDLE h)
+{
+ // Figure out if the peer is associated with an identified session.
+ // If not, do whatever is necessary to complete the linkage.
+ ACE::HTBP::Session *session = peer().session();
+ if (session == 0)
+ {
+ int result = this->handle_input_eh (h,this);
+
+ if (result != -1 && peer().session())
+ {
+ if (TAO_debug_level > 2)
+ ACE_DEBUG ((LM_DEBUG,
+ ACE_TEXT("TAO::HTIOP::Connection_Handler::handle_input: ")
+ ACE_TEXT("now binding to %d\n"),
+ peer().get_handle()));
+ }
+ return result;
+ }
+ return this->handle_input_eh (h, this);
+}
+
+int
+TAO::HTIOP::Connection_Handler::handle_output (ACE_HANDLE handle)
+{
+ int result =
+ this->handle_output_eh (handle, this);
+
+ if (result == -1)
+ {
+ this->close_connection ();
+ return 0;
+ }
+
+ return result;
+}
+
+int
+TAO::HTIOP::Connection_Handler::handle_close (ACE_HANDLE ,
+ ACE_Reactor_Mask )
+{
+ ACE_ASSERT (0);
+ return 0;
+}
+
+int
+TAO::HTIOP::Connection_Handler::close (u_long)
+{
+ this->state_changed (TAO_LF_Event::LFS_CONNECTION_CLOSED,
+ this->orb_core ()->leader_follower ());
+ this->transport ()->remove_reference ();
+ return 0;
+}
+
+int
+TAO::HTIOP::Connection_Handler::release_os_resources (void)
+{
+ int result = this->peer().close ();
+ return result;
+}
+
+int
+TAO::HTIOP::Connection_Handler::add_transport_to_cache (void)
+{
+ ACE::HTBP::Addr addr;
+
+ // Get the peername.
+ if (this->peer ().get_remote_addr (addr) == -1)
+ return -1;
+
+ // Construct an TAO::HTIOP::Endpoint object
+ TAO::HTIOP::Endpoint endpoint (addr,
+ this->orb_core()->
+ orb_params()->use_dotted_decimal_addresses ());
+
+ // Construct a property object
+ TAO_Base_Transport_Property prop (&endpoint);
+
+ TAO::Transport_Cache_Manager &cache =
+ this->orb_core ()->lane_resources ().transport_cache ();
+
+ // Idle the transport..
+ return cache.cache_idle_transport (&prop,
+ this->transport ());
+}
+
+int
+TAO::HTIOP::Connection_Handler::process_listen_point_list
+(::HTIOP::ListenPointList &listen_list)
+{
+ // Get the size of the list
+ CORBA::ULong len = listen_list.length ();
+
+ for (CORBA::ULong i = 0; i < len; ++ i)
+ {
+ ::HTIOP::ListenPoint listen_point = listen_list[i];
+ ACE::HTBP::Addr addr;
+ if (listen_point.port)
+ addr.ACE_INET_Addr::set (listen_point.port,
+ listen_point.host.in ());
+ else
+ addr.set_htid (listen_point.htid);
+
+ if (TAO_debug_level > 0)
+ {
+ ACE_DEBUG ((LM_DEBUG,
+ ACE_TEXT("(%P|%t) Listening port [%d] on [%s],[%s]\n"),
+ listen_point.port,
+ ACE_TEXT_CHAR_TO_TCHAR(listen_point.host.in ()),
+ ACE_TEXT_CHAR_TO_TCHAR(listen_point.htid.in())));
+ }
+
+ // Construct an TAO::HTIOP::Endpoint object
+ TAO::HTIOP::Endpoint endpoint (addr,
+ this->orb_core()->orb_params()->use_dotted_decimal_addresses ());
+
+ // Construct a property object
+ TAO_Base_Transport_Property prop (&endpoint);
+
+ // Mark the connection as bidirectional
+ prop.set_bidir_flag (1);
+
+ // The property for this handler has changed. Recache the
+ // handler with this property
+ int retval = this->transport ()->recache_transport (&prop);
+ if (retval == -1)
+ return retval;
+
+ // Make the handler idle and ready for use
+ this->transport ()->make_idle ();
+ }
+
+ return 0;
+}
+
+int
+TAO::HTIOP::Connection_Handler::set_dscp_codepoint (
+ CORBA::Boolean /*enable_network_priority*/)
+{
+ return 0;
+}
+
+TAO_END_VERSIONED_NAMESPACE_DECL
diff --git a/TAO/orbsvcs/orbsvcs/HTIOP/HTIOP_Connection_Handler.h b/TAO/orbsvcs/orbsvcs/HTIOP/HTIOP_Connection_Handler.h
new file mode 100644
index 00000000000..2651dafebd0
--- /dev/null
+++ b/TAO/orbsvcs/orbsvcs/HTIOP/HTIOP_Connection_Handler.h
@@ -0,0 +1,135 @@
+// -*- C++ -*-
+
+// ===================================================================
+/**
+ * @file HTIOP_Connection_Handler.h
+ *
+ * $Id$
+ *
+ * @author Priyanka Gontla <gontla_p@ociweb.com>
+ */
+// ===================================================================
+
+#ifndef HTIOP_CONNECTION_HANDLER_H
+#define HTIOP_CONNECTION_HANDLER_H
+#include /**/ "ace/pre.h"
+
+#include "orbsvcs/HTIOP/HTIOP_Transport.h"
+
+#if !defined (ACE_LACKS_PRAGMA_ONCE)
+#pragma once
+#endif /* ACE_LACKS_PRAGMA_ONCE */
+
+
+#include "tao/corbafwd.h"
+#include "tao/Wait_Strategy.h"
+#include "tao/Connection_Handler.h"
+
+#include "ace/Acceptor.h"
+#include "ace/Reactor.h"
+#include "ace/Svc_Handler.h"
+
+TAO_BEGIN_VERSIONED_NAMESPACE_DECL
+
+// Forward Decls
+class TAO_Pluggable_Messaging;
+
+// ****************************************************************
+
+namespace TAO
+{
+ namespace HTIOP
+ {
+
+ /**
+ * @class HTIOP_Connection_Handler
+ *
+ * @brief Handles requests on a single connection.
+ *
+ * The Connection handler which is common for the Acceptor and
+ * the Connector
+ */
+
+
+ class HTIOP_Export Connection_Handler : public SVC_HANDLER,
+ public TAO_Connection_Handler
+ {
+
+ public:
+
+ Connection_Handler (ACE_Thread_Manager* t = 0);
+
+ /// Constructor. <arg> parameter is used by the Acceptor to pass the
+ /// protocol configuration properties for this connection.
+ Connection_Handler (TAO_ORB_Core *orb_core,
+ CORBA::Boolean flag);
+
+ /// Destructor.
+ ~Connection_Handler (void);
+
+ /// Called by the <Strategy_Acceptor> when the handler is completely
+ /// connected. Argument is unused.
+ virtual int open (void *);
+
+ virtual int open_handler (void *);
+
+#if 0 // for now, an active version of HTIOP is not defined, but the
+ // methods are kept here as a place-holder.
+
+ /// = Active object activation method.
+ virtual int activate (long flags = THR_NEW_LWP,
+ int n_threads = 1,
+ int force_active = 0,
+ long priority = ACE_DEFAULT_THREAD_PRIORITY,
+ int grp_id = -1,
+ ACE_Task_Base *task = 0,
+ ACE_hthread_t thread_handles[] = 0,
+ void *stack[] = 0,
+ size_t stack_size[] = 0,
+ ACE_thread_t thread_names[] = 0);
+
+
+ /// Only used when the handler is turned into an active object by
+ /// calling <activate>. This serves as the event loop in such cases.
+ virtual int svc (void);
+#endif /* 0 */
+
+ //@{
+ /** @name Event Handler overloads
+ */
+ virtual int resume_handler (void);
+ virtual int close_connection (void);
+ virtual int handle_input (ACE_HANDLE);
+ virtual int handle_output (ACE_HANDLE);
+ virtual int handle_close (ACE_HANDLE, ACE_Reactor_Mask);
+ virtual int close (u_long = 0);
+ //@}
+
+ /// Add ourselves to Cache.
+ int add_transport_to_cache (void);
+
+ /// Process the <listen_list>
+ int process_listen_point_list (::HTIOP::ListenPointList &listen_list);
+
+ ///Set the Diff-Serv codepoint if the Policy dicates the setting of
+ ///Network Priority This method is a no-op, but implemented to
+ ///satisfy the base class interface.
+ int set_dscp_codepoint (CORBA::Boolean set_network_priority);
+
+
+ //@{
+ /**
+ * @name TAO_Connection Handler overloads
+ */
+ virtual int release_os_resources (void);
+ //@}
+
+ private:
+ };
+ }
+}
+
+TAO_END_VERSIONED_NAMESPACE_DECL
+
+#include /**/ "ace/post.h"
+#endif /* HTIOP_CONNECTION_HANDLER_H */
diff --git a/TAO/orbsvcs/orbsvcs/HTIOP/HTIOP_Connector.cpp b/TAO/orbsvcs/orbsvcs/HTIOP/HTIOP_Connector.cpp
new file mode 100644
index 00000000000..c2a2dde9735
--- /dev/null
+++ b/TAO/orbsvcs/orbsvcs/HTIOP/HTIOP_Connector.cpp
@@ -0,0 +1,420 @@
+// $Id$
+
+#include "orbsvcs/HTIOP/HTIOP_Connector.h"
+#include "orbsvcs/HTIOP/HTIOP_Profile.h"
+
+#include "ace/HTBP/HTBP_Session.h"
+#include "ace/HTBP/HTBP_ID_Requestor.h"
+#include "ace/HTBP/HTBP_Environment.h"
+
+#include "tao/debug.h"
+#include "tao/ORB_Core.h"
+#include "tao/Client_Strategy_Factory.h"
+#include "tao/Environment.h"
+#include "tao/Base_Transport_Property.h"
+#include "tao/Transport_Cache_Manager.h"
+#include "tao/Connect_Strategy.h"
+#include "tao/Thread_Lane_Resources.h"
+#include "tao/Profile_Transport_Resolver.h"
+#include "ace/Strategies_T.h"
+
+ACE_RCSID (HTIOP,
+ TAO_HTIOP_Connector,
+ "$Id$")
+
+
+TAO_BEGIN_VERSIONED_NAMESPACE_DECL
+
+TAO::HTIOP::Connector::Connector (ACE::HTBP::Environment *ht_env)
+ : TAO_Connector (OCI_TAG_HTIOP_PROFILE),
+ connect_creation_strategy_ (),
+ concurrency_strategy_ (),
+ ht_env_ (ht_env)
+{
+}
+
+TAO::HTIOP::Connector::~Connector (void)
+{
+}
+
+int
+TAO::HTIOP::Connector::open (TAO_ORB_Core *orb_core)
+{
+ // Set the ORB Core
+ this->orb_core (orb_core);
+
+ // Create our connect strategy
+ if (this->create_connect_strategy () == -1)
+ return -1;
+
+ /// Our connect creation strategy
+ ACE_NEW_RETURN (this->connect_creation_strategy_,
+ CONNECT_CREATION_STRATEGY
+ (orb_core->thr_mgr (),
+ orb_core,
+ 0),
+ -1);
+
+
+ ACE_NEW_RETURN (this->concurrency_strategy_,
+ CONNECT_CONCURRENCY_STRATEGY (orb_core),
+ -1);
+
+ return 0;
+}
+
+int
+TAO::HTIOP::Connector::close (void)
+{
+ delete this->concurrency_strategy_;
+ delete this->connect_creation_strategy_;
+
+ return 0;
+}
+
+int
+TAO::HTIOP::Connector::set_validate_endpoint (TAO_Endpoint *endpoint)
+{
+ // Set and validate endpoint. We need to do this to initialize our
+ // remote *_Addr's which have not been done during IOR decode.
+
+ /**
+ * @note The above comments talk about initialization. But, based on
+ * code reading, this is more of a validation of the endpoint rather
+ * than setting anything. So, nothing here needs to be modified for
+ * TAO_HTIOP case.
+ */
+ TAO::HTIOP::Endpoint *htiop_endpoint =
+ this->remote_endpoint (endpoint);
+
+ if (htiop_endpoint == 0)
+ return -1;
+
+ const ACE::HTBP::Addr &remote_address =
+ htiop_endpoint->object_addr ();
+
+ // Verify that the remote ACE::HTBP::Addr was initialized properly.
+ // Failure can occur if hostname lookup failed when initializing the
+ // remote ACE::HTBP::Addr.
+ if (remote_address.get_type () != AF_INET &&
+ (remote_address.get_htid() == 0 ||
+ ACE_OS::strlen(remote_address.get_htid()) == 0))
+ {
+ if (TAO_debug_level > 0)
+ {
+ ACE_DEBUG ((LM_DEBUG,
+ ACE_TEXT ("TAO (%P|%t) TAO_HTIOP connection failed.\n")
+ ACE_TEXT ("TAO (%P|%t) This is most likely ")
+ ACE_TEXT ("due to a hostname lookup ")
+ ACE_TEXT ("failure.\n")));
+ }
+
+ return -1;
+ }
+
+ return 0;
+}
+
+TAO_Transport *
+TAO::HTIOP::Connector::make_connection (TAO::Profile_Transport_Resolver *r,
+ TAO_Transport_Descriptor_Interface &desc,
+ ACE_Time_Value *timeout)
+{
+
+ /**
+ * \par
+ * Connector is used only in the processes inside the firewall
+ * This can connect to the remote address as it does always.
+ * If it is needed that the client first connect to the firewall
+ * and the firewall connects to the remote address, the code here
+ * should be modified to accomodate the requirement. And this would
+ * mean that we need to know the firewall address as well in this
+ * method.
+ * Probable checks would be
+ * 1. Check if the endpoint is outside the firewall
+ * 2. If so, connect to the firewall
+ * 3. Make the firewall connect to the outside server.
+ *
+ * \par Dated Oct 15:
+ */
+
+ TAO::HTIOP::Endpoint *htiop_endpoint =
+ this->remote_endpoint (desc.endpoint ());
+
+ if (htiop_endpoint == 0)
+ return 0;
+
+
+ ACE::HTBP::Session_Id_t session_id;
+ ACE_INET_Addr *proxy;
+ ACE_CString proxy_host;
+ unsigned proxy_port;
+
+ int port_set = this->ht_env_->get_proxy_port(proxy_port);
+ int host_set = this->ht_env_->get_proxy_host(proxy_host);
+ if (port_set != 0 ||
+ host_set != 0)
+ {
+ proxy_port = htiop_endpoint->port();
+ proxy_host = htiop_endpoint->host();
+ }
+ else
+ {
+ ACE::HTBP::ID_Requestor req(ht_env_);
+ session_id.local_ = req.get_HTID();
+ }
+
+ if (proxy_port == 0)
+ return 0;
+
+ ACE_NEW_RETURN (proxy,
+ ACE_INET_Addr(static_cast<u_short> (proxy_port),proxy_host.c_str()),
+ 0);
+
+ session_id.peer_ = htiop_endpoint->object_addr ();
+ session_id.id_ = ACE::HTBP::Session::next_session_id();
+
+ if (TAO_debug_level > 2)
+ {
+ char buffer[BUFSIZ];
+ htiop_endpoint->addr_to_string(buffer,BUFSIZ);
+ ACE_DEBUG ((LM_DEBUG,
+ "TAO (%P|%t) - TAO::HTIOP::Connector::make_connection, "
+ "to <%s>\n",
+ buffer));
+ }
+
+ // Get the right synch options
+ ACE_Synch_Options synch_options;
+
+ this->active_connect_strategy_->synch_options (timeout,
+ synch_options);
+
+ // If we don't need to block for a transport just set the timeout to
+ // be zero.
+ ACE_Time_Value tmp_zero (ACE_Time_Value::zero);
+ if (!r->blocked_connect ())
+ {
+ synch_options.timeout (ACE_Time_Value::zero);
+ timeout = &tmp_zero;
+ }
+
+ // This is where we need to set the ACE::HTBP::Stream to the connection
+ // handler.
+ TAO::HTIOP::Connection_Handler *svc_handler = 0;
+
+ // In more traditional connectors, the following code would be part of a
+ // strategized connector's connect() method. This include making the
+ // handler, attaching the session, and activating the handler.
+
+ // Instantiate a ACE::HTBP::Session
+ ACE::HTBP::Session *session = 0;
+ if (ACE::HTBP::Session::find_session (session_id, session) == -1)
+ {
+ ACE_NEW_RETURN (session, ACE::HTBP::Session (session_id,proxy, 1), 0);
+ if (ACE::HTBP::Session::add_session (session) == -1)
+ ACE_ERROR_RETURN ((LM_ERROR,
+ "ACE::HTBP::Initial_Filter::recv_data_header %p",
+ "add_session"),
+ 0);
+ }
+
+ // Make the svc_handler
+ this->connect_creation_strategy_->make_svc_handler (svc_handler);
+ // we now have a connection handler that has an unconnected stream
+
+ svc_handler->peer().session(session);
+ session->handler(svc_handler);
+ ACE::HTBP::Channel *outbound = session->outbound();
+ ACE_UNUSED_ARG (outbound);
+
+ // Activate immediately if we are connected.
+ this->concurrency_strategy_->activate_svc_handler (svc_handler,0);
+
+ // The above code is a rendering of connect() that allows the session to
+ // reacquire a stream rather than opening a new one.
+
+ int closed = svc_handler->is_closed();
+ // At this point, the IIOP Connector has a result from an asynch connect
+ // strategy, which does not apply here. Therefore the whole bit of logic
+ // of dealing with a failed wait but an unclosed svc_handler is skipped.
+
+
+ // Regardless of success or failure, remove the extra #REFCOUNT#.
+ svc_handler->remove_reference ();
+
+ if (closed) // would be result == -1 in IIOP_Connector
+ {
+ if (TAO_debug_level)
+ {
+ ACE_DEBUG ((LM_DEBUG,
+ ACE_TEXT("(%P|%t) - TAO::HTIOP::Connector::make_connection, ")
+ ACE_TEXT("connection to <%s:%d> failed (%p)\n"),
+ htiop_endpoint->host (), htiop_endpoint->port (),
+ "errno"));
+ }
+ return 0;
+ }
+
+ if (TAO_debug_level > 2)
+ ACE_DEBUG ((LM_DEBUG,
+ ACE_TEXT("(%P|%t) - TAO::HTIOP::Connector::make_connection, ")
+ ACE_TEXT("new connection to <%s:%d> on Transport[%d]\n"),
+ htiop_endpoint->host (), htiop_endpoint->port (),
+ svc_handler->peer ().get_handle ()));
+
+ TAO_Transport *transport = svc_handler->transport ();
+
+ // Add the handler to Cache
+ // @todo several other things need to be done regarding the following
+ // code.
+ // @note The cache_transport would probably need to cache the session id
+ // with the local and remote addresses.
+ int retval =
+ this->orb_core ()->lane_resources ().
+ transport_cache ().cache_transport (&desc, transport);
+
+ if (retval != 0)
+ {
+ svc_handler->close();
+ if (TAO_debug_level > 0)
+ {
+ ACE_DEBUG ((LM_DEBUG,
+ ACE_TEXT("(%P|%t) - TAO::HTIOP::Connector::make_connection, ")
+ ACE_TEXT("could not add the new")
+ ACE_TEXT(" connection to cache\n")));
+ }
+ return 0;
+ }
+
+ // If the wait strategy wants us to be registered with the reactor
+ // then we do so.
+ retval = transport->wait_strategy ()->register_handler ();
+ if (retval != 0)
+ {
+ transport->purge_entry ();
+ transport->close_connection();
+
+ if (TAO_debug_level > 0)
+ {
+ ACE_DEBUG ((LM_DEBUG,
+ ACE_TEXT("(%P|%t) - TAO::HTIOP::Connector::make_connection, ")
+ ACE_TEXT("could not register the new connection")
+ ACE_TEXT(" in the reactor\n")));
+ }
+ return 0;
+ }
+
+ return transport;
+}
+
+
+int
+TAO::HTIOP::Connector::cancel_svc_handler (
+ TAO_Connection_Handler * svc_handler)
+{
+ TAO::HTIOP::Connection_Handler* handler=
+ dynamic_cast<TAO::HTIOP::Connection_Handler*> (svc_handler);
+
+ if (handler)
+ // Cancel from the connector
+ // this->base_connector_.cancel (handler);
+ return 0;
+
+ return -1;
+
+}
+
+
+/**
+ * @brief Create a profile and initialize it based on the
+ * encapsulation in <cdr>
+ */
+TAO_Profile *
+TAO::HTIOP::Connector::create_profile (TAO_InputCDR& cdr)
+{
+ TAO_Profile *pfile;
+ ACE_NEW_RETURN (pfile,
+ TAO::HTIOP::Profile (this->orb_core ()),
+ 0);
+
+ int r = pfile->decode (cdr);
+ if (r == -1)
+ {
+ pfile->_decr_refcnt ();
+ pfile = 0;
+ }
+
+ return pfile;
+}
+
+/**
+ * @brief Create a profile with a given endpoint.
+ */
+TAO_Profile *
+TAO::HTIOP::Connector::make_profile (ACE_ENV_SINGLE_ARG_DECL)
+{
+ // The endpoint should be of the form:
+ // N.n@host:port/object_key
+ // or:
+ // host:port/object_key
+
+ TAO_Profile *profile = 0;
+ ACE_NEW_THROW_EX (profile,
+ TAO::HTIOP::Profile (this->orb_core ()),
+ CORBA::NO_MEMORY (
+ CORBA::SystemException::_tao_minor_code (
+ TAO::VMCID,
+ ENOMEM),
+ CORBA::COMPLETED_NO));
+ ACE_CHECK_RETURN (0);
+
+ return profile;
+}
+
+int
+TAO::HTIOP::Connector::check_prefix (const char *endpoint)
+{
+ // Check for a valid string
+ if (!endpoint || !*endpoint)
+ return -1; // Failure
+
+ const char *protocol[] = { "htiop" };
+
+ size_t slot = ACE_OS::strchr (endpoint, ':') - endpoint;
+
+ size_t len0 = ACE_OS::strlen (protocol[0]);
+
+ // Check for the proper prefix in the IOR. If the proper prefix
+ // isn't in the IOR then it is not an IOR we can use.
+ if (slot == len0
+ && ACE_OS::strncasecmp (endpoint, protocol[0], len0) == 0)
+ return 0;
+
+ return -1;
+ // Failure: not an TAO_HTIOP IOR
+ // DO NOT throw an exception here.
+}
+
+char
+TAO::HTIOP::Connector::object_key_delimiter (void) const
+{
+ return TAO::HTIOP::Profile::object_key_delimiter_;
+}
+
+TAO::HTIOP::Endpoint *
+TAO::HTIOP::Connector::remote_endpoint (TAO_Endpoint *endpoint)
+{
+ if (endpoint->tag () != OCI_TAG_HTIOP_PROFILE)
+ return 0;
+
+ TAO::HTIOP::Endpoint *htiop_endpoint =
+ dynamic_cast<TAO::HTIOP::Endpoint *> (endpoint );
+
+ if (htiop_endpoint == 0)
+ return 0;
+
+ return htiop_endpoint;
+}
+
+TAO_END_VERSIONED_NAMESPACE_DECL
diff --git a/TAO/orbsvcs/orbsvcs/HTIOP/HTIOP_Connector.h b/TAO/orbsvcs/orbsvcs/HTIOP/HTIOP_Connector.h
new file mode 100644
index 00000000000..62e06d6a988
--- /dev/null
+++ b/TAO/orbsvcs/orbsvcs/HTIOP/HTIOP_Connector.h
@@ -0,0 +1,137 @@
+// -*- C++ -*-
+
+//=============================================================================
+/**
+ * @file HTIOP_Connector.h
+ *
+ * $Id$
+ *
+ * HTIOP specific connector processing
+ *
+ *
+ * @author Priyanka Gontla <gontla_p@ociweb.com>
+ */
+//=============================================================================
+
+
+#ifndef HTIOP_CONNECTOR_H
+#define HTIOP_CONNECTOR_H
+#include /**/ "ace/pre.h"
+
+#include "tao/Connector_Impl.h"
+
+#if !defined (ACE_LACKS_PRAGMA_ONCE)
+# pragma once
+#endif /* ACE_LACKS_PRAGMA_ONCE */
+
+#include "orbsvcs/HTIOP/HTIOP_Connection_Handler.h"
+
+#include "tao/Transport_Connector.h"
+
+#include "ace/SOCK_Connector.h"
+#include "ace/Connector.h"
+#include "ace/OS.h"
+
+ACE_BEGIN_VERSIONED_NAMESPACE_DECL
+namespace ACE
+{
+ namespace HTBP
+ {
+ class Environment;
+ }
+}
+ACE_END_VERSIONED_NAMESPACE_DECL
+
+// ****************************************************************
+
+TAO_BEGIN_VERSIONED_NAMESPACE_DECL
+
+namespace TAO
+{
+ namespace HTIOP
+ {
+ class Endpoint;
+
+ /**
+ * @class HTIOP_Connector
+ *
+ * @brief HTIOP-specific Connector bridge for pluggable protocols.
+ *
+ * Concrete instance of the TAO_Connector class. Responsible
+ * for establishing a connection with a server and is called from the
+ * Connector_Registory.
+ */
+ class HTIOP_Export Connector : public TAO_Connector
+ {
+ public:
+ typedef TAO_Connect_Concurrency_Strategy<Connection_Handler>
+ CONNECT_CONCURRENCY_STRATEGY;
+
+ typedef TAO_Connect_Creation_Strategy<Connection_Handler>
+ CONNECT_CREATION_STRATEGY;
+
+ /// Initialization and termination methods.
+ /// Constructor.
+ /// {@
+ Connector (ACE::HTBP::Environment *ht_env);
+
+ /// Destructor.
+ ~Connector (void);
+
+ /// @}
+
+
+ /// The TAO_Connector methods, please check the documentation on
+ /// Transport_Connector.h
+ /// {@
+ int open (TAO_ORB_Core *orb_core);
+ int close (void);
+
+ TAO_Profile *create_profile (TAO_InputCDR& cdr);
+
+ virtual int check_prefix (const char *endpoint);
+
+ virtual char object_key_delimiter (void) const;
+ /// @}
+
+ protected:
+
+ // = The TAO_Connector methods, please check the documentation on
+ // Transport_Connector.h
+ int set_validate_endpoint (TAO_Endpoint *ep);
+
+ TAO_Transport *make_connection (TAO::Profile_Transport_Resolver *r,
+ TAO_Transport_Descriptor_Interface &desc,
+ ACE_Time_Value *timeout = 0);
+
+
+ /// More TAO_Connector methods, please check the documentation on
+ /// Transport_Connector.h
+ virtual TAO_Profile *make_profile (ACE_ENV_SINGLE_ARG_DECL);
+
+ /// Cancel the passed cvs handler from the connector
+ /// Its not clear what it means to cancel in HTIOP, since there's no
+ /// base connector.
+ virtual int cancel_svc_handler (TAO_Connection_Handler * svc_handler);
+
+ private:
+
+ /// Return the remote endpoint, a helper function
+ Endpoint *remote_endpoint (TAO_Endpoint *ep);
+
+ /// Our creation strategy
+ CONNECT_CREATION_STRATEGY *connect_creation_strategy_;
+
+ /// Our activation strategy
+ CONNECT_CONCURRENCY_STRATEGY *concurrency_strategy_;
+
+ /// reference to the configuration parameters
+ ACE::HTBP::Environment *ht_env_;
+ };
+ }
+}
+
+TAO_END_VERSIONED_NAMESPACE_DECL
+
+#include /**/ "ace/post.h"
+#endif /* HTIOP_CONNECTOR_H */
diff --git a/TAO/orbsvcs/orbsvcs/HTIOP/HTIOP_Connector_Impl.cpp b/TAO/orbsvcs/orbsvcs/HTIOP/HTIOP_Connector_Impl.cpp
new file mode 100644
index 00000000000..8c891ddaf38
--- /dev/null
+++ b/TAO/orbsvcs/orbsvcs/HTIOP/HTIOP_Connector_Impl.cpp
@@ -0,0 +1,62 @@
+// $Id$
+
+#ifndef HTIOP_CONNECTOR_IMPL_CPP
+#define HTIOP_CONNECTOR_IMPL_CPP
+
+#include "orbsvcs/HTIOP/HTIOP_Connector_Impl.h"
+
+TAO_BEGIN_VERSIONED_NAMESPACE_DECL
+
+template <class SVC_HANDLER>
+TAO::HTIOP::Connect_Creation_Strategy<SVC_HANDLER>::
+Connect_Creation_Strategy (ACE_Thread_Manager* t,
+ TAO_ORB_Core *orb_core,
+ void *arg,
+ CORBA::Boolean flag)
+ : ACE_Creation_Strategy <SVC_HANDLER> (t),
+ orb_core_ (orb_core),
+ arg_ (arg),
+ lite_flag_ (flag)
+{
+
+}
+
+template <class SVC_HANDLER> int
+TAO::HTIOP::Connect_Creation_Strategy<SVC_HANDLER>::make_svc_handler (SVC_HANDLER *&sh)
+{
+ if (sh == 0)
+ ACE_NEW_RETURN (sh,
+ SVC_HANDLER (this->orb_core_,
+ this->lite_flag_,
+ this->arg_),
+ -1);
+
+ // We add to the #REFCOUNT# since the Connector needs this. See
+ // Connector::make_connection() for details.
+ sh->add_reference ();
+
+ return 0;
+}
+
+
+////////////////////////////////////////////////////////////////
+
+template <class SVC_HANDLER>
+TAO::HTIOP::Connect_Concurrency_Strategy<SVC_HANDLER>::
+Connect_Concurrency_Strategy (TAO_ORB_Core *orb_core)
+ : orb_core_ (orb_core)
+{
+}
+
+template <class SVC_HANDLER> int
+TAO::HTIOP::Connect_Concurrency_Strategy<SVC_HANDLER>::
+activate_svc_handler (SVC_HANDLER *sh,
+ void *arg)
+{
+ return ACE_Concurrency_Strategy<SVC_HANDLER>::activate_svc_handler (sh,
+ arg);
+}
+
+TAO_END_VERSIONED_NAMESPACE_DECL
+
+#endif /* HTIOP_CONNECTOR_IMPL_CPP */
diff --git a/TAO/orbsvcs/orbsvcs/HTIOP/HTIOP_Connector_Impl.h b/TAO/orbsvcs/orbsvcs/HTIOP/HTIOP_Connector_Impl.h
new file mode 100644
index 00000000000..5658b346919
--- /dev/null
+++ b/TAO/orbsvcs/orbsvcs/HTIOP/HTIOP_Connector_Impl.h
@@ -0,0 +1,128 @@
+// -*- C++ -*-
+
+// ===================================================================
+/**
+ * @file HTIOP_Connector_Impl.h
+ *
+ * $Id$
+ *
+ * @author Priyanka Gontla <gontla_p@ociweb.com>
+ */
+// ===================================================================
+
+#ifndef HTIOP_CONNECTOR_IMPL_H
+#define HTIOP_CONNECTOR_IMPL_H
+#include /**/ "ace/pre.h"
+
+#include "orbsvcs/HTIOP/HTIOP_Export.h"
+
+#if !defined (ACE_LACKS_PRAGMA_ONCE)
+# pragma once
+#endif /* ACE_LACKS_PRAGMA_ONCE */
+
+#include "tao/corbafwd.h"
+#include "ace/Strategies_T.h"
+
+ACE_BEGIN_VERSIONED_NAMESPACE_DECL
+class ACE_Thread_Manager;
+ACE_END_VERSIONED_NAMESPACE_DECL
+
+TAO_BEGIN_VERSIONED_NAMESPACE_DECL
+
+class TAO_ORB_Core;
+
+namespace TAO
+{
+ namespace HTIOP
+ {
+
+ /**
+ * @class HTIOP_Connect_Creation_Strategy
+ *
+ * @brief Creation strategy helper
+ *
+ * Creates the HTIOP_*_Connection_Handler object for the HTIOP_Connector
+ * objects. This template class can now be used by all the Connector
+ * objects instead of having to duplicate code. This class can be used
+ * to set any required properties on the connection handlers at
+ * creation time.
+ *
+ */
+
+ template <class SVC_HANDLER>
+ class Connect_Creation_Strategy : public ACE_Creation_Strategy<SVC_HANDLER>
+ {
+ public:
+
+ /// Constructor. <arg> parameter is used to pass any special
+ /// state/info to the service handler upon creation. Currently used
+ /// by HTIOP to pass protocol configuration properties.
+ Connect_Creation_Strategy (ACE_Thread_Manager * = 0,
+ TAO_ORB_Core* orb_core = 0,
+ void *arg = 0,
+ CORBA::Boolean flag = 0);
+
+ /// Makes HTIOP_Client_Connection_Handlers
+ virtual int make_svc_handler (SVC_HANDLER *&sh);
+
+
+ private:
+
+ /// Pointer to the ORB_Core on which we are activated
+ TAO_ORB_Core* orb_core_;
+
+ /// Some info/state to be passed to the service handler we create.
+ void *arg_;
+
+ /// Are we using GIOP lite?
+ CORBA::Boolean lite_flag_;
+ };
+
+
+
+ /**
+ * @class HTIOP_Connect_Concurrency_Strategy
+ *
+ * @brief Concurrency strategy helper
+ *
+ * Activates the Svc_Handler, and then if the correct wait strategy is
+ * in use registers the handler with the reactor.
+ *
+ */
+
+ template <class SVC_HANDLER>
+ class Connect_Concurrency_Strategy :
+ public ACE_Concurrency_Strategy<SVC_HANDLER>
+ {
+ public:
+
+ /// Constructor.
+ Connect_Concurrency_Strategy (TAO_ORB_Core *orb_core);
+
+
+ /// Activates the Svc_Handler, and if the right wait strategy is in
+ /// use, registers the handle with the reactor.
+ int activate_svc_handler (SVC_HANDLER *svc_handler,
+ void *arg);
+
+ private:
+
+ /// Pointer to the ORB Core.
+ TAO_ORB_Core *orb_core_;
+
+ };
+ }
+}
+
+TAO_END_VERSIONED_NAMESPACE_DECL
+
+#if defined (ACE_TEMPLATES_REQUIRE_SOURCE)
+#include "orbsvcs/HTIOP/HTIOP_Connector_Impl.cpp"
+#endif /* ACE_TEMPLATES_REQUIRE_SOURCE */
+
+#if defined (ACE_TEMPLATES_REQUIRE_PRAGMA)
+#pragma implementation ("HTIOP_Connector_Impl.cpp")
+#endif /* ACE_TEMPLATES_REQUIRE_PRAGMA */
+
+#include /**/ "ace/post.h"
+#endif /*HTIOP_CONNECTOR_IMPL_H*/
diff --git a/TAO/orbsvcs/orbsvcs/HTIOP/HTIOP_Endpoint.cpp b/TAO/orbsvcs/orbsvcs/HTIOP/HTIOP_Endpoint.cpp
new file mode 100644
index 00000000000..2d3e6da6299
--- /dev/null
+++ b/TAO/orbsvcs/orbsvcs/HTIOP/HTIOP_Endpoint.cpp
@@ -0,0 +1,225 @@
+// $Id$
+
+#include "orbsvcs/HTIOP/HTIOP_Endpoint.h"
+#include "orbsvcs/HTIOP/HTIOP_Profile.h"
+
+#include "ace/os_include/os_netdb.h"
+#include "ace/Log_Msg.h"
+
+#include "tao/IOPC.h"
+#include "tao/debug.h"
+
+
+ACE_RCSID (HTIOP,
+ TAO_HTIOP_Endpoint,
+ "$Id$")
+
+#if !defined (__ACE_INLINE__)
+# include "orbsvcs/HTIOP/HTIOP_Endpoint.i"
+#endif /* __ACE_INLINE__ */
+
+TAO_BEGIN_VERSIONED_NAMESPACE_DECL
+
+TAO::HTIOP::Endpoint::Endpoint (const ACE::HTBP::Addr &addr,
+ int use_dotted_decimal_addresses)
+ : TAO_Endpoint (OCI_TAG_HTIOP_PROFILE),
+ host_ (),
+ port_ (0),
+ htid_ (),
+ object_addr_ (addr),
+ object_addr_set_ (0),
+ next_ (0)
+{
+ this->set (addr, use_dotted_decimal_addresses);
+}
+
+TAO::HTIOP::Endpoint::Endpoint (const char *host,
+ CORBA::UShort port,
+ const char *htid,
+ const ACE::HTBP::Addr &addr)
+ : TAO_Endpoint (OCI_TAG_HTIOP_PROFILE),
+ host_ (),
+ port_ (port),
+ htid_ (),
+ object_addr_ (addr),
+ object_addr_set_ (0),
+ next_ (0)
+{
+ if (host != 0)
+ this->host_ = host;
+ if (htid != 0)
+ this->htid_ = htid;
+}
+
+TAO::HTIOP::Endpoint::Endpoint (void)
+ : TAO_Endpoint (OCI_TAG_HTIOP_PROFILE),
+ host_ (),
+ port_ (0),
+ htid_ (),
+ object_addr_ (),
+ object_addr_set_ (0),
+ next_ (0)
+{
+}
+
+TAO::HTIOP::Endpoint::Endpoint (const char *host,
+ CORBA::UShort port,
+ const char *htid)
+ : TAO_Endpoint (OCI_TAG_HTIOP_PROFILE),
+ host_ (),
+ port_ (port),
+ htid_ (),
+ object_addr_ (),
+ object_addr_set_ (0),
+ next_ (0)
+{
+ if (host != 0)
+ this->host_ = host;
+ if (htid != 0)
+ this->htid_ = htid;
+}
+
+TAO::HTIOP::Endpoint::~Endpoint (void)
+{
+}
+
+int
+TAO::HTIOP::Endpoint::set (const ACE::HTBP::Addr &addr,
+ int use_dotted_decimal_addresses)
+{
+ char tmp_host[MAXHOSTNAMELEN + 1];
+
+ if (use_dotted_decimal_addresses
+ || addr.get_host_name (tmp_host, sizeof (tmp_host)) != 0)
+ {
+ const char *tmp = addr.get_host_addr ();
+ if (tmp == 0)
+ {
+ if (TAO_debug_level > 0)
+ ACE_DEBUG ((LM_DEBUG,
+ ACE_TEXT ("\n\nTAO (%P|%t) ")
+ ACE_TEXT ("TAO::HTIOP::Endpoint::set ")
+ ACE_TEXT ("- %p\n\n"),
+ ACE_TEXT ("cannot determine hostname")));
+ return -1;
+ }
+ else
+ this->host_ = tmp;
+ }
+ else
+ this->host_ = CORBA::string_dup (tmp_host);
+
+ this->port_ = addr.get_port_number();
+ this->htid_ = addr.get_htid();
+ return 0;
+}
+
+int
+TAO::HTIOP::Endpoint::addr_to_string (char *buffer, size_t length)
+{
+ if (this->port_ != 0)
+ {
+ size_t actual_len =
+ ACE_OS::strlen (this->host_.in ()) // chars in host name
+ + sizeof (':') // delimiter
+ + ACE_OS::strlen ("65536") // max port
+ + sizeof ('\0');
+
+ if (length < actual_len)
+ return -1;
+
+ ACE_OS::sprintf (buffer, "%s:%d",
+ this->host_.in (), this->port_);
+ }
+ else
+ {
+ if (length < ACE_OS::strlen (this->htid_.in())+1)
+ return -1;
+ ACE_OS::strcpy (buffer,this->htid_.in());
+ }
+ return 0;
+}
+
+const char *
+TAO::HTIOP::Endpoint::host (const char *h)
+{
+ this->host_ = h;
+
+ return this->host_.in ();
+}
+
+const char *
+TAO::HTIOP::Endpoint::htid (const char *h)
+{
+ this->htid_ = h;
+
+ return this->htid_.in ();
+}
+
+void
+TAO::HTIOP::Endpoint::reset_hint (void)
+{
+ // Commented out for the time being....
+ /* if (this->hint_)
+ this->hint_->cleanup_hint ((void **) &this->hint_); */
+}
+
+TAO_Endpoint *
+TAO::HTIOP::Endpoint::next (void)
+{
+ return this->next_;
+}
+
+TAO_Endpoint *
+TAO::HTIOP::Endpoint::duplicate (void)
+{
+ // @@ Bala, we probably need to make sure that the duplicate has the
+ // same priority as the original. Although it does not matter in
+ // the context this method is currently used, if somebody ends up
+ // using this method for some other purpose later, this will be a
+ // seed for bugs.
+
+ TAO::HTIOP::Endpoint *endpoint = 0;
+
+ ACE_NEW_RETURN (endpoint,
+ TAO::HTIOP::Endpoint (this->host_.in (),
+ this->port_,
+ this->htid_.in(),
+ this->object_addr_),
+ 0);
+
+ return endpoint;
+}
+
+CORBA::Boolean
+TAO::HTIOP::Endpoint::is_equivalent (const TAO_Endpoint *other_endpoint)
+{
+ TAO_Endpoint *endpt =
+ const_cast<TAO_Endpoint *> (other_endpoint);
+
+ TAO::HTIOP::Endpoint *endpoint =
+ dynamic_cast<TAO::HTIOP::Endpoint *> (endpt);
+ if (endpoint == 0)
+ return 0;
+
+ if (this->htid_.in() && ACE_OS::strlen (this->htid_.in()))
+ return (endpoint->htid() &&
+ ACE_OS::strcmp (this->htid_.in(),endpoint->htid()) == 0);
+
+ return (this->port_ == endpoint->port_
+ && (ACE_OS::strcmp(this->host(), endpoint->host()) == 0));
+}
+
+CORBA::ULong
+TAO::HTIOP::Endpoint::hash (void)
+{
+ // We could call ACE::HTBP::Addr::hash() since it does much the same
+ // thing except that it converts the port from network byte order to
+ // host byte order. As such, this implementation is actually less
+ // costly.
+ if (this->htid_.in() && ACE_OS::strlen (this->htid_.in()))
+ return ACE::hash_pjw(this->htid_.in());
+ return this->object_addr ().get_ip_address () + this->port ();
+}
+
+TAO_END_VERSIONED_NAMESPACE_DECL
diff --git a/TAO/orbsvcs/orbsvcs/HTIOP/HTIOP_Endpoint.h b/TAO/orbsvcs/orbsvcs/HTIOP/HTIOP_Endpoint.h
new file mode 100644
index 00000000000..2fa800fd7a4
--- /dev/null
+++ b/TAO/orbsvcs/orbsvcs/HTIOP/HTIOP_Endpoint.h
@@ -0,0 +1,162 @@
+// -*- C++ -*-
+
+//=============================================================================
+/**
+ * @file HTIOP_Endpoint.h
+ *
+ * $Id$
+ *
+ * HTIOP implementation of PP Framework Endpoint interface.
+ *
+ * @author Marina Spivak <marina@cs.wustl.edu>
+ */
+//=============================================================================
+
+
+#ifndef HTIOP_ENDPOINT_H
+#define HTIOP_ENDPOINT_H
+#include /**/ "ace/pre.h"
+
+#include "orbsvcs/HTIOP/HTIOP_Export.h"
+
+#if !defined (ACE_LACKS_PRAGMA_ONCE)
+# pragma once
+#endif /* ACE_LACKS_PRAGMA_ONCE */
+
+#include "ace/HTBP/HTBP_Addr.h"
+
+#include "tao/Endpoint.h"
+#include "tao/ORB.h"
+
+TAO_BEGIN_VERSIONED_NAMESPACE_DECL
+
+namespace TAO
+{
+ namespace HTIOP
+ {
+
+ class Connection_Handler;
+
+ /**
+ * @class Endpoint
+ *
+ * @brief Endpoint
+ *
+ * HTIOP-specific implementation of PP Framework Endpoint interface.
+ */
+ class HTIOP_Export Endpoint : public TAO_Endpoint
+ {
+ public:
+
+ friend class Profile;
+ friend class TAO_SSLIOP_Profile;
+
+ // = Initialization and termination methods.
+
+ /// Default constructor.
+ Endpoint (void);
+
+ /// Constructor. This is the most efficient constructor since it
+ /// does not require any address resolution processing.
+ Endpoint (const char *host,
+ CORBA::UShort port,
+ const char *htid,
+ const ACE::HTBP::Addr &addr);
+
+ /// Constructor.
+ Endpoint (const ACE::HTBP::Addr &addr,
+ int use_dotted_decimal_addresses);
+
+ /// Constructor. This constructor is used when decoding endpoints.
+ Endpoint (const char *host,
+ CORBA::UShort port,
+ const char *htid);
+
+ /// Destructor.
+ ~Endpoint (void);
+
+ // = Implementation of abstract TAO_Endpoint methods. See
+ // Endpoint.h for their documentation.
+
+ virtual TAO_Endpoint *next (void);
+ virtual int addr_to_string (char *buffer, size_t length);
+ virtual void reset_hint (void);
+
+ /// Makes a copy of <this>
+ virtual TAO_Endpoint *duplicate (void);
+
+ /// Return true if this endpoint is equivalent to <other_endpoint>. Two
+ /// endpoints are equivalent iff their port and host are the same.
+ CORBA::Boolean is_equivalent (const TAO_Endpoint *other_endpoint);
+
+ /// Return a hash value for this object.
+ CORBA::ULong hash (void);
+
+ // Allocates memory and returns a copy of <this>
+
+ // = HTIOP_Endpoint-specific methods.
+
+ /// Return a reference to the <object_addr>.
+ const ACE::HTBP::Addr &object_addr (void) const;
+
+ /// Return a pointer to the host string. This object maintains
+ /// ownership of this string.
+ const char *host (void) const;
+
+ /// Copy the string <h> into <host_> and return the resulting pointer.
+ /// This object maintains ownership of this string.
+ const char *host (const char *h);
+
+ /// Return the port number.
+ CORBA::UShort port (void) const;
+
+ /// Set the port number.
+ CORBA::UShort port (CORBA::UShort p);
+
+ /// Return a pointer to the host string. This object maintains
+ /// ownership of this string.
+ const char *htid (void) const;
+
+ /// Copy the string <h> into <host_> and return the resulting pointer.
+ /// This object maintains ownership of this string.
+ const char *htid (const char *h);
+
+ //Connection_Handler *&hint (void);
+ // Access to our <hint_>.
+
+ private:
+
+ /// Helper method for setting INET_Addr.
+ int set (const ACE::HTBP::Addr &addr,
+ int use_dotted_decimal_addresses);
+
+ /// String representing the host name.
+ CORBA::String_var host_;
+
+ /// TCP port number.
+ CORBA::UShort port_;
+
+ CORBA::String_var htid_;
+
+ /// Cached instance of <ACE::HTBP::Addr> for use in making
+ /// invocations, etc.
+ ACE::HTBP::Addr object_addr_;
+
+ /// Flag to indicate if the address has been resolved and set.
+ int object_addr_set_;
+
+ /// HTIOP Endpoints can be stringed into a list. Return the next
+ /// endpoint in the list, if any.
+ Endpoint *next_;
+ };
+ }
+}
+
+TAO_END_VERSIONED_NAMESPACE_DECL
+
+#if defined (__ACE_INLINE__)
+# include "orbsvcs/HTIOP/HTIOP_Endpoint.i"
+#endif /* __ACE_INLINE__ */
+
+#include /**/ "ace/post.h"
+#endif /* HTIOP_PROFILE_H */
diff --git a/TAO/orbsvcs/orbsvcs/HTIOP/HTIOP_Endpoint.i b/TAO/orbsvcs/orbsvcs/HTIOP/HTIOP_Endpoint.i
new file mode 100644
index 00000000000..dffd4f6705b
--- /dev/null
+++ b/TAO/orbsvcs/orbsvcs/HTIOP/HTIOP_Endpoint.i
@@ -0,0 +1,79 @@
+// -*- C++ -*-
+//
+// $Id$
+
+TAO_BEGIN_VERSIONED_NAMESPACE_DECL
+
+ACE_INLINE const ACE::HTBP::Addr &
+TAO::HTIOP::Endpoint::object_addr (void) const
+{
+ // The object_addr_ is initialized here, rather than at IOR decode
+ // time for several reasons:
+ // 1. A request on the object may never be invoked.
+ // 2. The DNS setup may have changed dynamically.
+ // ...etc..
+
+ // Double checked locking optimization.
+ if (!this->object_addr_set_)
+ {
+ // We need to modify the object_addr_ in this method. Do so
+ // using a non-const copy of the <this> pointer.
+ TAO::HTIOP::Endpoint *endpoint =
+ const_cast<TAO::HTIOP::Endpoint *> (this);
+
+ ACE_GUARD_RETURN (TAO_SYNCH_MUTEX,
+ guard,
+ endpoint->addr_lookup_lock_,
+ this->object_addr_ );
+
+ if (!this->object_addr_set_)
+ {
+ if (endpoint->object_addr_.set (this->port_,
+ this->host_.in (),
+ this->htid_.in ()) == -1)
+ {
+ // If this call fails, it most likely due a hostname
+ // lookup failure caused by a DNS misconfiguration. If
+ // a request is made to the object at the given host and
+ // port, then a CORBA::TRANSIENT() exception should be
+ // thrown.
+
+ // Invalidate the ACE::HTBP::Addr. This is used as a flag
+ // to denote that ACE::HTBP::Addr initialization failed.
+ endpoint->object_addr_.set_type (-1);
+ }
+ else
+ {
+ endpoint->object_addr_set_ = 1;
+ }
+ }
+ }
+
+ return this->object_addr_;
+}
+
+ACE_INLINE const char *
+TAO::HTIOP::Endpoint::host (void) const
+{
+ return this->host_.in ();
+}
+
+ACE_INLINE const char *
+TAO::HTIOP::Endpoint::htid (void) const
+{
+ return this->htid_.in ();
+}
+
+ACE_INLINE CORBA::UShort
+TAO::HTIOP::Endpoint::port (void) const
+{
+ return this->port_;
+}
+
+ACE_INLINE CORBA::UShort
+TAO::HTIOP::Endpoint::port (CORBA::UShort p)
+{
+ return this->port_ = p;
+}
+
+TAO_END_VERSIONED_NAMESPACE_DECL
diff --git a/TAO/orbsvcs/orbsvcs/HTIOP/HTIOP_Export.h b/TAO/orbsvcs/orbsvcs/HTIOP/HTIOP_Export.h
new file mode 100644
index 00000000000..858abf88a1a
--- /dev/null
+++ b/TAO/orbsvcs/orbsvcs/HTIOP/HTIOP_Export.h
@@ -0,0 +1,54 @@
+
+// -*- C++ -*-
+// $Id$
+// Definition for Win32 Export directives.
+// This file is generated automatically by generate_export_file.pl -s HTIOP
+// ------------------------------
+#ifndef HTIOP_EXPORT_H
+#define HTIOP_EXPORT_H
+
+#include "ace/config-all.h"
+
+#if defined (ACE_AS_STATIC_LIBS) && !defined (HTIOP_HAS_DLL)
+# define HTIOP_HAS_DLL 0
+#endif /* ACE_AS_STATIC_LIBS && HTIOP_HAS_DLL */
+
+#if !defined (HTIOP_HAS_DLL)
+# define HTIOP_HAS_DLL 1
+#endif /* ! HTIOP_HAS_DLL */
+
+#if defined (HTIOP_HAS_DLL) && (HTIOP_HAS_DLL == 1)
+# if defined (HTIOP_BUILD_DLL)
+# define HTIOP_Export ACE_Proper_Export_Flag
+# define HTIOP_SINGLETON_DECLARATION(T) ACE_EXPORT_SINGLETON_DECLARATION (T)
+# define HTIOP_SINGLETON_DECLARE(SINGLETON_TYPE, CLASS, LOCK) ACE_EXPORT_SINGLETON_DECLARE(SINGLETON_TYPE, CLASS, LOCK)
+# else /* HTIOP_BUILD_DLL */
+# define HTIOP_Export ACE_Proper_Import_Flag
+# define HTIOP_SINGLETON_DECLARATION(T) ACE_IMPORT_SINGLETON_DECLARATION (T)
+# define HTIOP_SINGLETON_DECLARE(SINGLETON_TYPE, CLASS, LOCK) ACE_IMPORT_SINGLETON_DECLARE(SINGLETON_TYPE, CLASS, LOCK)
+# endif /* HTIOP_BUILD_DLL */
+#else /* HTIOP_HAS_DLL == 1 */
+# define HTIOP_Export
+# define HTIOP_SINGLETON_DECLARATION(T)
+# define HTIOP_SINGLETON_DECLARE(SINGLETON_TYPE, CLASS, LOCK)
+#endif /* HTIOP_HAS_DLL == 1 */
+
+// Set HTIOP_NTRACE = 0 to turn on library specific tracing even if
+// tracing is turned off for ACE.
+#if !defined (HTIOP_NTRACE)
+# if (ACE_NTRACE == 1)
+# define HTIOP_NTRACE 1
+# else /* (ACE_NTRACE == 1) */
+# define HTIOP_NTRACE 0
+# endif /* (ACE_NTRACE == 1) */
+#endif /* !HTIOP_NTRACE */
+
+#if (HTIOP_NTRACE == 1)
+# define HTIOP_TRACE(X)
+#else /* (HTIOP_NTRACE == 1) */
+# define HTIOP_TRACE(X) ACE_TRACE_IMPL(X)
+#endif /* (HTIOP_NTRACE == 1) */
+
+#endif /* HTIOP_EXPORT_H */
+
+// End of auto generated file.
diff --git a/TAO/orbsvcs/orbsvcs/HTIOP/HTIOP_Factory.cpp b/TAO/orbsvcs/orbsvcs/HTIOP/HTIOP_Factory.cpp
new file mode 100644
index 00000000000..8542907269b
--- /dev/null
+++ b/TAO/orbsvcs/orbsvcs/HTIOP/HTIOP_Factory.cpp
@@ -0,0 +1,146 @@
+// $Id$
+
+#include "orbsvcs/HTIOP/HTIOP_Factory.h"
+#include "orbsvcs/HTIOP/HTIOP_Acceptor.h"
+#include "orbsvcs/HTIOP/HTIOP_Connector.h"
+#include "orbsvcs/HTIOP/HTIOP_Profile.h"
+
+#include "ace/HTBP/HTBP_Environment.h"
+#include "tao/IOPC.h"
+
+ACE_RCSID (HTIOP,
+ TAOHTIOP_Factory,
+ "$Id$")
+
+static const char the_prefix[] = "htiop";
+
+TAO_BEGIN_VERSIONED_NAMESPACE_DECL
+
+TAO::HTIOP::Protocol_Factory::Protocol_Factory (void)
+ : TAO_Protocol_Factory (OCI_TAG_HTIOP_PROFILE),
+ major_ (TAO_DEF_GIOP_MAJOR),
+ minor_ (TAO_DEF_GIOP_MINOR),
+ ht_env_ (0),
+ inside_ (-1)
+{
+}
+
+TAO::HTIOP::Protocol_Factory::~Protocol_Factory (void)
+{
+ delete this->ht_env_;
+}
+
+int
+TAO::HTIOP::Protocol_Factory::match_prefix (const ACE_CString &prefix)
+{
+ // Check for the proper prefix for this protocol.
+ return (ACE_OS::strcasecmp (prefix.c_str (), ::the_prefix) == 0);
+}
+
+const char *
+TAO::HTIOP::Protocol_Factory::prefix (void) const
+{
+ return ::the_prefix;
+}
+
+char
+TAO::HTIOP::Protocol_Factory::options_delimiter (void) const
+{
+ return '/';
+}
+
+int
+TAO::HTIOP::Protocol_Factory::init (int argc,
+ ACE_TCHAR* argv[])
+{
+ const ACE_TCHAR * config_file = 0;
+ const ACE_TCHAR * persist_file = 0;
+
+ ACE_stat statbuf;
+ int use_registry = 0;
+
+ for (int i = 0; i < argc; i++)
+ {
+ if (ACE_OS::strcasecmp(argv[i], ACE_TEXT("-config")) == 0)
+ {
+ if (++i < argc)
+ if (ACE_OS::stat (argv[i],&statbuf) != -1)
+ config_file = argv[i];
+ }
+ else if (ACE_OS::strcasecmp(argv[i], ACE_TEXT("-env_persist")) == 0)
+ {
+ if (++i < argc)
+ if (ACE_OS::stat (argv[i],&statbuf) != -1)
+ persist_file = argv[i];
+ }
+ else if (ACE_OS::strcasecmp(argv[i], ACE_TEXT("-win32_reg")) == 0)
+ {
+ use_registry = 1;
+ }
+ else if (ACE_OS::strcasecmp(argv[i], ACE_TEXT("-inside")) == 0)
+ {
+ if (++i < argc)
+ this->inside_ = ::atoi (ACE_TEXT_ALWAYS_CHAR(argv[i]));
+ }
+ }
+
+ ACE_NEW_RETURN (this->ht_env_,
+ ACE::HTBP::Environment(0,
+ use_registry,
+ persist_file),
+ -1);
+
+ if (config_file != 0)
+ this->ht_env_->import_config (config_file);
+
+ return 0;
+}
+
+TAO_Acceptor *
+TAO::HTIOP::Protocol_Factory::make_acceptor (void)
+{
+ TAO_Acceptor *acceptor = 0;
+
+ ACE_NEW_RETURN (acceptor,
+ TAO::HTIOP::Acceptor (this->ht_env_,
+ this->inside_),
+ 0);
+ return acceptor;
+}
+
+TAO_Connector *
+TAO::HTIOP::Protocol_Factory::make_connector (void)
+{
+ TAO_Connector *connector = 0;
+ ACE_NEW_RETURN (connector,
+ TAO::HTIOP::Connector (this->ht_env_),
+ 0);
+ return connector;
+}
+
+int
+TAO::HTIOP::Protocol_Factory::requires_explicit_endpoint (void) const
+{
+ return 0;
+}
+
+
+TAO_END_VERSIONED_NAMESPACE_DECL
+
+ACE_STATIC_SVC_DEFINE (TAO_HTIOP_Protocol_Factory,
+ ACE_TEXT ("HTIOP_Factory"),
+ ACE_SVC_OBJ_T,
+ &ACE_SVC_NAME (TAO_HTIOP_Protocol_Factory),
+ ACE_Service_Type::DELETE_THIS |
+ ACE_Service_Type::DELETE_OBJ,
+ 0)
+
+
+// Since the actual class instantiated by the factory is scoped inside a
+// namespace, this macro is used in place of ACE_FACTORY_DEFINE, athough
+// the declaration macro is the same. Note that the second argument must
+// match the name class name used in the ACE_FACTORY_DECLARE, and the
+// third argument is the fully scoped class to be instantiated.
+ACE_FACTORY_NAMESPACE_DEFINE (HTIOP,
+ TAO_HTIOP_Protocol_Factory,
+ TAO::HTIOP::Protocol_Factory)
diff --git a/TAO/orbsvcs/orbsvcs/HTIOP/HTIOP_Factory.h b/TAO/orbsvcs/orbsvcs/HTIOP/HTIOP_Factory.h
new file mode 100644
index 00000000000..276d0f1199e
--- /dev/null
+++ b/TAO/orbsvcs/orbsvcs/HTIOP/HTIOP_Factory.h
@@ -0,0 +1,99 @@
+// -*- C++ -*-
+
+//=============================================================================
+/**
+ * @file HTIOP_Factory.h
+ *
+ * $Id$
+ *
+ * @author Fred Kuhns <fredk@cs.wustl.edu>
+ */
+//=============================================================================
+
+
+#ifndef HTIOP_FACTORY_H
+#define HTIOP_FACTORY_H
+#include /**/ "ace/pre.h"
+
+#include "orbsvcs/HTIOP/HTIOP_Export.h"
+
+#if !defined (ACE_LACKS_PRAGMA_ONCE)
+# pragma once
+#endif /* ACE_LACKS_PRAGMA_ONCE */
+
+#include "tao/Protocol_Factory.h"
+#include "ace/Service_Config.h"
+
+ACE_BEGIN_VERSIONED_NAMESPACE_DECL
+namespace ACE
+{
+ namespace HTBP
+ {
+ class Environment;
+ }
+}
+ACE_END_VERSIONED_NAMESPACE_DECL
+
+TAO_BEGIN_VERSIONED_NAMESPACE_DECL
+
+namespace TAO
+{
+ namespace HTIOP
+ {
+
+ class HTIOP_Export Protocol_Factory : public TAO_Protocol_Factory
+ {
+ public:
+ Protocol_Factory (void);
+ virtual ~Protocol_Factory (void);
+
+ // = Service Configurator hooks.
+ /// Dynamic linking hook
+ virtual int init (int argc, ACE_TCHAR* argv[]);
+
+ /// Verify prefix is a match
+ virtual int match_prefix (const ACE_CString &prefix);
+
+ /// Returns the prefix used by the protocol.
+ virtual const char *prefix (void) const;
+
+ /// Return the character used to mark where an endpoint ends and
+ /// where its options begin.
+ virtual char options_delimiter (void) const;
+
+ // = Check Protocol_Factory.h for a description of these methods.
+ virtual TAO_Acceptor *make_acceptor (void);
+ virtual TAO_Connector *make_connector (void);
+ virtual int requires_explicit_endpoint (void) const;
+
+ private:
+ /// Changing the version number can be used to provide backwards
+ /// compatibility with old clients.
+ int major_;
+ int minor_;
+
+ /// Configuration reference
+ ACE::HTBP::Environment *ht_env_;
+
+ /// Flag used to determine if an acceptor should use an "inside"
+ /// local address, or try to compose an "outside" address.
+ /// If the value is 1, then always use an HTID for local addr,
+ /// otherwise use host:port if 0, or guess based on proxy config
+ /// if -1. The default is -1.
+ int inside_;
+ };
+ }
+}
+
+TAO_END_VERSIONED_NAMESPACE_DECL
+
+// Note that these declarations are placed outside of the scope of the
+// namespace. The generated functions use a C style signature which does
+// not accomodate namespaces, so assuming namespace concatination is an
+// error. The service class name should be composed of a flattened class
+// name, with the namespaces preceeding the class name with '_'.
+ACE_STATIC_SVC_DECLARE_EXPORT (HTIOP, TAO_HTIOP_Protocol_Factory)
+ACE_FACTORY_DECLARE (HTIOP, TAO_HTIOP_Protocol_Factory)
+
+#include /**/ "ace/post.h"
+#endif /* HTIOP_FACTORY_H */
diff --git a/TAO/orbsvcs/orbsvcs/HTIOP/HTIOP_Profile.cpp b/TAO/orbsvcs/orbsvcs/HTIOP/HTIOP_Profile.cpp
new file mode 100644
index 00000000000..63d4a82db22
--- /dev/null
+++ b/TAO/orbsvcs/orbsvcs/HTIOP/HTIOP_Profile.cpp
@@ -0,0 +1,473 @@
+// This may look like C, but it's really -*- C++ -*-
+// $Id$
+
+#include "orbsvcs/HTIOP/HTIOP_Profile.h"
+#include "orbsvcs/HTIOP/htiop_endpointsC.h"
+
+#include "ace/os_include/os_netdb.h"
+
+#include "tao/CDR.h"
+#include "tao/Environment.h"
+#include "tao/ORB.h"
+#include "tao/ORB_Core.h"
+#include "tao/debug.h"
+
+ACE_RCSID(HTIOP,
+ TAO_HTIOP_Profile,
+ "$Id$")
+
+static const char the_prefix[] = "htiop";
+
+TAO_BEGIN_VERSIONED_NAMESPACE_DECL
+
+const char TAO::HTIOP::Profile::object_key_delimiter_ = '/';
+
+char
+TAO::HTIOP::Profile::object_key_delimiter (void) const
+{
+ return TAO::HTIOP::Profile::object_key_delimiter_;
+}
+
+TAO::HTIOP::Profile::Profile (const ACE::HTBP::Addr &addr,
+ const TAO::ObjectKey &object_key,
+ const TAO_GIOP_Message_Version &version,
+ TAO_ORB_Core *orb_core)
+ : TAO_Profile (OCI_TAG_HTIOP_PROFILE,
+ orb_core,
+ object_key,
+ version),
+ endpoint_ (addr,
+ orb_core->orb_params ()->use_dotted_decimal_addresses ()),
+ count_ (1)
+{
+}
+
+TAO::HTIOP::Profile::Profile (const char* host,
+ CORBA::UShort port,
+ const char* htid,
+ const TAO::ObjectKey &object_key,
+ const ACE::HTBP::Addr &addr,
+ const TAO_GIOP_Message_Version &version,
+ TAO_ORB_Core *orb_core)
+ : TAO_Profile (OCI_TAG_HTIOP_PROFILE,
+ orb_core,
+ object_key,
+ version),
+ endpoint_ (host, port, htid, addr),
+ count_ (1)
+{
+}
+
+TAO::HTIOP::Profile::Profile (TAO_ORB_Core *orb_core)
+ : TAO_Profile (OCI_TAG_HTIOP_PROFILE,
+ orb_core,
+ TAO_GIOP_Message_Version (TAO_DEF_GIOP_MAJOR, TAO_DEF_GIOP_MINOR)),
+ endpoint_ (),
+ count_ (1)
+{
+}
+
+TAO::HTIOP::Profile::~Profile (void)
+{
+ // Clean up the list of endpoints since we own it.
+ // Skip the head, since it is not dynamically allocated.
+ TAO_Endpoint *tmp = 0;
+
+ for (TAO_Endpoint *next = this->endpoint ()->next ();
+ next != 0;
+ next = tmp)
+ {
+ tmp = next->next ();
+ delete next;
+ }
+}
+
+// return codes:
+// -1 -> error
+// 0 -> can't understand this version
+// 1 -> success.
+
+int
+TAO::HTIOP::Profile::decode_profile (TAO_InputCDR& cdr)
+{
+
+ // Decode host and port into the <endpoint_>.
+ if (cdr.read_string (this->endpoint_.host_.out ()) == 0
+ || cdr.read_ushort (this->endpoint_.port_) == 0
+ || cdr.read_string (this->endpoint_.htid_.out()) == 0)
+ {
+ if (TAO_debug_level > 0)
+ ACE_DEBUG ((LM_DEBUG,
+ ACE_TEXT ("TAO (%P|%t) TAO::HTIOP::Profile::decode - ")
+ ACE_TEXT ("error while decoding host/port")));
+ return -1;
+ }
+
+ if (cdr.good_bit ())
+ {
+ // Invalidate the object_addr_ until first access.
+ this->endpoint_.object_addr_.set_type (-1);
+
+ return 1;
+ }
+ return -1;
+}
+
+void
+TAO::HTIOP::Profile::parse_string_i (const char *ior
+ ACE_ENV_ARG_DECL)
+{
+ // Pull off the "hostname:port#token/" part of the objref
+ // Copy the string because we are going to modify it...
+
+ const char *okd = ACE_OS::strchr (ior, this->object_key_delimiter_);
+
+ if (okd == 0 || okd == ior)
+ {
+ // No object key delimiter or no hostname specified.
+ ACE_THROW (CORBA::INV_OBJREF
+ (CORBA::SystemException::_tao_minor_code
+ (TAO::VMCID,
+ EINVAL),
+ CORBA::COMPLETED_NO));
+ }
+
+ // Length of host string.
+ CORBA::ULong length_host = 0;
+
+ const char *cp_pos = ACE_OS::strchr (ior, ':'); // Look for a port
+
+ if (cp_pos == ior)
+ {
+ // No hostname specified! It is required by the spec.
+ ACE_THROW (CORBA::INV_OBJREF
+ (CORBA::SystemException::_tao_minor_code
+ (TAO::VMCID,
+ EINVAL),
+ CORBA::COMPLETED_NO));
+ }
+ else if (cp_pos != 0)
+ {
+ // A port number or port name was specified.
+ CORBA::ULong length_port = okd - cp_pos - 1;
+
+ CORBA::String_var tmp = CORBA::string_alloc (length_port);
+
+ ACE_OS::strncpy (tmp.inout (), cp_pos + 1, length_port);
+ tmp[length_port] = '\0';
+
+ this->endpoint_.port_ =
+ static_cast<CORBA::UShort> (ACE_OS::atoi (tmp.in ()));
+
+ length_host = cp_pos - ior;
+ }
+ else
+ length_host = okd - ior;
+
+ CORBA::String_var tmp = CORBA::string_alloc (length_host);
+
+ // Skip the trailing '/'
+ ACE_OS::strncpy (tmp.inout (), ior, length_host);
+ tmp[length_host] = '\0';
+
+ this->endpoint_.host_ = tmp._retn ();
+
+ if (ACE_OS::strcmp (this->endpoint_.host_.in (), "") == 0)
+ {
+ ACE::HTBP::Addr host_addr;
+
+ char tmp_host [MAXHOSTNAMELEN + 1];
+
+ // If no host is specified: assign the default host, i.e. the
+ // local host.
+ if (host_addr.get_host_name (tmp_host,
+ sizeof (tmp_host)) != 0)
+ {
+ // Can't get the IP address since the INET_Addr wasn't
+ // initialized. Just throw an exception.
+
+ if (TAO_debug_level > 0)
+ ACE_DEBUG ((LM_DEBUG,
+ ACE_TEXT ("\n\nTAO (%P|%t) ")
+ ACE_TEXT ("TAO::HTIOP::Profile::parse_string ")
+ ACE_TEXT ("- %p\n\n"),
+ ACE_TEXT ("cannot determine hostname")));
+
+ // @@ What's the right exception to throw here?
+ ACE_THROW (CORBA::INV_OBJREF
+ (CORBA::SystemException::_tao_minor_code
+ (TAO::VMCID,
+ EINVAL),
+ CORBA::COMPLETED_NO));
+ }
+ else
+ this->endpoint_.host_ = CORBA::string_dup (tmp_host);
+ }
+
+ TAO::ObjectKey ok;
+ TAO::ObjectKey::decode_string_to_sequence (ok, okd + 1);
+
+ (void) this->orb_core ()->object_key_table ().bind (ok,
+ this->ref_object_key_);
+}
+
+CORBA::Boolean
+TAO::HTIOP::Profile::do_is_equivalent (const TAO_Profile *other_profile)
+{
+ const TAO::HTIOP::Profile *op =
+ dynamic_cast<const TAO::HTIOP::Profile *> (other_profile);
+
+ if (op == 0)
+ return 0;
+
+ // Check endpoints equivalence.
+ const TAO::HTIOP::Endpoint *other_endp = &op->endpoint_;
+ for (TAO::HTIOP::Endpoint *endp = &this->endpoint_;
+ endp != 0;
+ endp = endp->next_)
+ {
+ if (endp->is_equivalent (other_endp))
+ other_endp = other_endp->next_;
+ else
+ return 0;
+ }
+
+ return 1;
+}
+
+CORBA::ULong
+TAO::HTIOP::Profile::hash (CORBA::ULong max
+ ACE_ENV_ARG_DECL_NOT_USED)
+{
+ // Get the hashvalue for all endpoints.
+ CORBA::ULong hashval = 0;
+ for (TAO::HTIOP::Endpoint *endp = &this->endpoint_;
+ endp != 0;
+ endp = endp->next_)
+ {
+ hashval += endp->hash ();
+ }
+
+ hashval += this->version_.minor;
+ hashval += this->tag ();
+
+ const TAO::ObjectKey &ok =
+ this->ref_object_key_->object_key ();
+
+ if (ok.length () >= 4)
+ {
+ hashval += ok[1];
+ hashval += ok[3];
+ }
+
+ return hashval % max;
+}
+
+TAO_Endpoint*
+TAO::HTIOP::Profile::endpoint (void)
+{
+ return &this->endpoint_;
+}
+
+CORBA::ULong
+TAO::HTIOP::Profile::endpoint_count (void) const
+{
+ return this->count_;
+}
+
+void
+TAO::HTIOP::Profile::add_endpoint (TAO::HTIOP::Endpoint *endp)
+{
+ endp->next_ = this->endpoint_.next_;
+ this->endpoint_.next_ = endp;
+
+ this->count_++;
+}
+
+char *
+TAO::HTIOP::Profile::to_string (ACE_ENV_SINGLE_ARG_DECL_NOT_USED)
+{
+ CORBA::String_var key;
+ TAO::ObjectKey::encode_sequence_to_string (key.inout(),
+ this->ref_object_key_->object_key ());
+
+ size_t buflen = (8 /* "corbaloc" */ +
+ 1 /* colon separator */ +
+ ACE_OS::strlen (::the_prefix) +
+ 1 /* colon separator */ +
+ 1 /* major version */ +
+ 1 /* decimal point */ +
+ 1 /* minor version */ +
+ 1 /* `@' character */ +
+ ACE_OS::strlen (this->endpoint_.host ()) +
+ 1 /* colon separator */ +
+ 5 /* port number */ +
+ 1 /* object key separator */ +
+ ACE_OS::strlen (key.in ()));
+
+ char * buf = CORBA::string_alloc (static_cast<CORBA::ULong> (buflen));
+
+ static const char digits [] = "0123456789";
+
+ ACE_OS::sprintf (buf,
+ "corbaloc:%s:%c.%c@%s:%d%c%s",
+ ::the_prefix,
+ digits [this->version_.major],
+ digits [this->version_.minor],
+ this->endpoint_.host (),
+ this->endpoint_.port (),
+ this->object_key_delimiter_,
+ key.in ());
+
+ return buf;
+}
+
+
+
+const char *
+TAO::HTIOP::Profile::prefix (void)
+{
+ return ::the_prefix;
+}
+
+void
+TAO::HTIOP::Profile::create_profile_body (TAO_OutputCDR &encap) const
+{
+ encap.write_octet (TAO_ENCAP_BYTE_ORDER);
+
+ // The GIOP version
+ encap.write_octet (this->version_.major);
+ encap.write_octet (this->version_.minor);
+
+ // STRING hostname from profile
+ encap.write_string (this->endpoint_.host ());
+
+ // UNSIGNED SHORT port number
+ encap.write_ushort (this->endpoint_.port ());
+
+ // STRING htid
+ encap.write_string (this->endpoint_.htid ());
+
+ // OCTET SEQUENCE for object key
+ if (this->ref_object_key_)
+ encap << this->ref_object_key_->object_key ();
+ else
+ {
+ ACE_ERROR ((LM_ERROR,
+ "(%P|%t) TAO - IIOP_Profile::create_profile_body "
+ "no object key marshalled \n"));
+ }
+
+ if (this->version_.major > 1
+ || this->version_.minor > 0)
+ this->tagged_components ().encode (encap);
+}
+
+int
+TAO::HTIOP::Profile::encode_endpoints ()
+{
+ // Create a data structure and fill it with endpoint info for wire
+ // transfer.
+ // We include information for the head of the list
+ // together with other endpoints because even though its addressing
+ // info is transmitted using standard ProfileBody components, its
+ // priority is not!
+
+ HTIOPEndpointSequence endpoints;
+ endpoints.length (this->count_);
+
+ const TAO::HTIOP::Endpoint *endpoint = &this->endpoint_;
+ for (CORBA::ULong i = 0;
+ i < this->count_;
+ ++i)
+ {
+ endpoints[i].host = endpoint->host ();
+ endpoints[i].port = endpoint->port ();
+ endpoints[i].htid = endpoint->htid ();
+
+ endpoint = endpoint->next_;
+ }
+
+ // Encode the data structure.
+ TAO_OutputCDR out_cdr;
+ if ((out_cdr << ACE_OutputCDR::from_boolean (TAO_ENCAP_BYTE_ORDER)
+ == 0)
+ || (out_cdr << endpoints) == 0)
+ return -1;
+ size_t length = out_cdr.total_length ();
+
+ IOP::TaggedComponent tagged_component;
+ tagged_component.tag = TAO_TAG_ENDPOINTS;
+ tagged_component.component_data.length (static_cast<CORBA::ULong> (length));
+ CORBA::Octet *buf =
+ tagged_component.component_data.get_buffer ();
+
+ for (const ACE_Message_Block *iterator = out_cdr.begin ();
+ iterator != 0;
+ iterator = iterator->cont ())
+ {
+ size_t i_length = iterator->length ();
+ ACE_OS::memcpy (buf, iterator->rd_ptr (), i_length);
+
+ buf += i_length;
+ }
+
+ // Add component with encoded endpoint data to this profile's
+ // TaggedComponents.
+ tagged_components_.set_component (tagged_component);
+
+ return 0;
+}
+
+int
+TAO::HTIOP::Profile::decode_endpoints (void)
+{
+ IOP::TaggedComponent tagged_component;
+ tagged_component.tag = TAO_TAG_ENDPOINTS;
+
+ if (this->tagged_components_.get_component (tagged_component))
+ {
+ const CORBA::Octet *buf =
+ tagged_component.component_data.get_buffer ();
+
+ TAO_InputCDR in_cdr (reinterpret_cast<const char*> (buf),
+ tagged_component.component_data.length ());
+
+ // Extract the Byte Order.
+ CORBA::Boolean byte_order;
+ if ((in_cdr >> ACE_InputCDR::to_boolean (byte_order)) == 0)
+ ACE_ERROR_RETURN ((LM_ERROR,"boolean byte_order extraction failed\n"),
+ -1);
+ in_cdr.reset_byte_order (static_cast<int> (byte_order));
+
+ // Extract endpoints sequence.
+ HTIOPEndpointSequence endpoints;
+
+ if ((in_cdr >> endpoints) == 0)
+ ACE_ERROR_RETURN ((LM_ERROR,"endpoint sequence extraction failed\n"),
+ -1);
+
+ // Use information extracted from the tagged component to
+ // populate the profile. Skip the first endpoint, since it is
+ // always extracted through standard profile body. Also, begin
+ // from the end of the sequence to preserve endpoint order,
+ // since <add_endpoint> method reverses the order of endpoints
+ // in the list.
+ for (CORBA::ULong i = endpoints.length() -1;
+ i > 0;
+ --i)
+ {
+ TAO::HTIOP::Endpoint *endpoint = 0;
+ ACE_NEW_RETURN (endpoint,
+ TAO::HTIOP::Endpoint (endpoints[i].host,
+ endpoints[i].port,
+ endpoints[i].htid),
+ -1);
+ this->add_endpoint (endpoint);
+ }
+ }
+
+ return 0;
+}
+
+TAO_END_VERSIONED_NAMESPACE_DECL
diff --git a/TAO/orbsvcs/orbsvcs/HTIOP/HTIOP_Profile.h b/TAO/orbsvcs/orbsvcs/HTIOP/HTIOP_Profile.h
new file mode 100644
index 00000000000..938666a6bfc
--- /dev/null
+++ b/TAO/orbsvcs/orbsvcs/HTIOP/HTIOP_Profile.h
@@ -0,0 +1,151 @@
+// -*- C++ -*-
+
+//=============================================================================
+/**
+ * @file HTIOP_Profile.h
+ *
+ * $Id$
+ *
+ * HTIOP profile specific processing
+ *
+ *
+ * @author Fred Kuhns <fredk@cs.wustl.edu>
+ */
+//=============================================================================
+
+
+#ifndef HTIOP_PROFILE_H
+#define HTIOP_PROFILE_H
+#include /**/ "ace/pre.h"
+
+#include "tao/Profile.h"
+#if !defined (ACE_LACKS_PRAGMA_ONCE)
+# pragma once
+#endif /* ACE_LACKS_PRAGMA_ONCE */
+
+#include "tao/Object_KeyC.h"
+#include "orbsvcs/HTIOP/HTIOP_Endpoint.h"
+
+#include "ace/Synch.h"
+
+#if !defined (OCI_TAG_HTIOP_PROFILE)
+# define OCI_TAG_HTIOP_PROFILE 0x4f434902U
+#endif
+
+TAO_BEGIN_VERSIONED_NAMESPACE_DECL
+
+namespace TAO
+{
+ namespace HTIOP
+ {
+
+ // TAO HTIOP_Profile concrete Profile definitions
+ /**
+ * @class HTIOP_Profile
+ *
+ * @brief This class defines the protocol specific attributes required
+ * for locating ORBs over a TCP/IP network.
+ *
+ * This class defines the HTIOP profile as specified in the CORBA
+ * specification.
+ */
+ class HTIOP_Export Profile : public TAO_Profile
+ {
+ public:
+ /// The object key delimiter that HTIOP uses or expects.
+ static const char object_key_delimiter_;
+ virtual char object_key_delimiter (void) const;
+
+ /// Return the char string prefix.
+ static const char *prefix (void);
+
+ /// Profile constructor, same as above except the object_key has
+ /// already been marshaled.
+ Profile (const ACE::HTBP::Addr &addr,
+ const TAO::ObjectKey &object_key,
+ const TAO_GIOP_Message_Version &version,
+ TAO_ORB_Core *orb_core);
+
+ /// Profile constructor, this is the most efficient since it
+ /// doesn't require any address resolution processing.
+ Profile (const char *host,
+ CORBA::UShort port,
+ const char *htid,
+ const TAO::ObjectKey &object_key,
+ const ACE::HTBP::Addr &addr,
+ const TAO_GIOP_Message_Version &version,
+ TAO_ORB_Core *orb_core);
+
+ /// Profile constructor, default.
+ Profile (TAO_ORB_Core *orb_core);
+
+ /// Destructor is to be called only through <_decr_refcnt>.
+ ~Profile (void);
+
+ /**
+ * Return a string representation for this profile.
+ * client must deallocate memory.
+ * This is used to create url-style reference. Only one
+ * endpoint is included into the string.
+ */
+ virtual char * to_string (ACE_ENV_SINGLE_ARG_DECL);
+
+ /**
+ * Endpoints are transmitted using TAO-proprietory tagged component.
+ * Component tag is TAO_TAG_ENDPOINTS and component data is an
+ * encapsulation of a sequence of structs, each representing a
+ * single endpoint. Data format is specified in iiop_endpoins.pidl.
+ */
+ virtual int encode_endpoints (void);
+
+ /// Return pointer to the head of this profile's endpoints list.
+ virtual TAO_Endpoint *endpoint (void);
+
+ /// Return how many endpoints this profile contains.
+ virtual CORBA::ULong endpoint_count (void) const;
+
+ /**
+ * Add <endp> to this profile's list of endpoints (it is inserted
+ * next to the head of the list). This profiles takes ownership of
+ * <endp>.
+ */
+ void add_endpoint (Endpoint *endp);
+
+ /// Return a hash value for this object.
+ virtual CORBA::ULong hash (CORBA::ULong max
+ ACE_ENV_ARG_DECL);
+
+ protected:
+
+ /// Template methods. Please see Profile.h for the documentation.
+ virtual int decode_profile (TAO_InputCDR &cdr);
+ virtual int decode_endpoints (void);
+ virtual void parse_string_i (const char *string
+ ACE_ENV_ARG_DECL);
+ virtual void create_profile_body (TAO_OutputCDR &cdr) const;
+ virtual CORBA::Boolean do_is_equivalent (const TAO_Profile *other_profile);
+
+ protected:
+
+ /**
+ * Head of this profile's list of endpoints. This endpoint is not
+ * dynamically allocated because a profile always contains at least
+ * one endpoint.
+ *
+ * Addressing info of the default endpoint, i.e., head of the list,
+ * is transmitted using standard HTIOP ProfileBody components. See
+ * <encode_endpoints> method documentation above for how the rest of
+ * the endpoint list is transmitted.
+ */
+ Endpoint endpoint_;
+
+ /// Number of endpoints in the list headed by <endpoint_>.
+ CORBA::ULong count_;
+ };
+ }
+}
+
+TAO_END_VERSIONED_NAMESPACE_DECL
+
+#include /**/ "ace/post.h"
+#endif /* HTIOP_PROFILE_H */
diff --git a/TAO/orbsvcs/orbsvcs/HTIOP/HTIOP_Transport.cpp b/TAO/orbsvcs/orbsvcs/HTIOP/HTIOP_Transport.cpp
new file mode 100644
index 00000000000..6325f6920dd
--- /dev/null
+++ b/TAO/orbsvcs/orbsvcs/HTIOP/HTIOP_Transport.cpp
@@ -0,0 +1,456 @@
+// $Id$
+
+#include "orbsvcs/HTIOP/HTIOP_Transport.h"
+
+#include "orbsvcs/HTIOP/HTIOP_Connection_Handler.h"
+#include "orbsvcs/HTIOP/HTIOP_Acceptor.h"
+#include "orbsvcs/HTIOP/HTIOP_Profile.h"
+#include "ace/HTBP/HTBP_Session.h"
+
+#include "tao/Acceptor_Registry.h"
+#include "tao/Thread_Lane_Resources.h"
+#include "tao/operation_details.h"
+#include "tao/Timeprobe.h"
+#include "tao/CDR.h"
+#include "tao/Transport_Mux_Strategy.h"
+#include "tao/Wait_Strategy.h"
+#include "tao/Stub.h"
+#include "tao/ORB_Core.h"
+#include "tao/debug.h"
+#include "tao/GIOP_Message_Base.h"
+#include "tao/GIOP_Message_Lite.h"
+#include "tao/Protocols_Hooks.h"
+#include "tao/Adapter.h"
+
+ACE_RCSID (HTIOP,
+ TAO_HTIOP_Transport,
+ "$Id$")
+
+TAO_BEGIN_VERSIONED_NAMESPACE_DECL
+
+TAO::HTIOP::Transport::Transport (TAO::HTIOP::Connection_Handler *h,
+ TAO_ORB_Core *orb_core,
+ CORBA::Boolean flag)
+ : TAO_Transport (OCI_TAG_HTIOP_PROFILE, orb_core),
+ connection_handler_ (h),
+ messaging_object_ (0)
+{
+ if (flag)
+ {
+ // Use the lite version of the protocol
+ ACE_NEW (this->messaging_object_,
+ TAO_GIOP_Message_Lite (orb_core));
+ }
+ else
+ {
+ // Use the normal GIOP object
+ ACE_NEW (this->messaging_object_,
+ TAO_GIOP_Message_Base (orb_core, this));
+ }
+}
+
+TAO::HTIOP::Transport::~Transport (void)
+{
+ delete this->messaging_object_;
+}
+
+ACE_Event_Handler *
+TAO::HTIOP::Transport::event_handler_i (void)
+{
+ return this->connection_handler_;
+}
+
+TAO_Connection_Handler *
+TAO::HTIOP::Transport::connection_handler_i (void)
+{
+ return this->connection_handler_;
+}
+
+TAO_Pluggable_Messaging *
+TAO::HTIOP::Transport::messaging_object (void)
+{
+ return this->messaging_object_;
+}
+
+ssize_t
+TAO::HTIOP::Transport::send (iovec *iov, int iovcnt,
+ size_t &bytes_transferred,
+ const ACE_Time_Value *max_wait_time)
+{
+ ACE_UNUSED_ARG (max_wait_time);
+ ssize_t retval = this->connection_handler_->peer ().sendv (iov, iovcnt,
+ max_wait_time);
+ if (retval > 0)
+ {
+ bytes_transferred = retval;
+ }
+
+ return retval;
+}
+
+ssize_t
+TAO::HTIOP::Transport::recv (char *buf,
+ size_t len,
+ const ACE_Time_Value *max_wait_time)
+{
+ ssize_t n = this->connection_handler_->peer ().recv (buf,
+ len,
+ max_wait_time);
+
+ // Do not print the error message if it is a timeout, which could
+ // occur in thread-per-connection.
+ if (n == -1 &&
+ TAO_debug_level > 4 &&
+ errno != ETIME)
+ {
+
+ ACE_DEBUG ((LM_DEBUG,
+ ACE_TEXT ("TAO (%P|%t) - TAO::HTIOP::Transport[%d]::recv_i, ")
+ ACE_TEXT ("read failure - %m"),
+ this->id ()));
+ }
+
+ // Error handling
+ if (n == -1)
+ {
+ if (errno == EWOULDBLOCK)
+ return 0;
+
+
+ return -1;
+ }
+
+ // Most of the errors handling is common for
+ // Now the message has been read
+
+ // @@ What are the other error handling here??
+ else if (n == 0)
+ {
+ return -1;
+ }
+
+ return n;
+}
+
+int
+TAO::HTIOP::Transport::register_handler (void)
+{
+ if (TAO_debug_level > 4)
+ {
+ ACE_DEBUG ((LM_DEBUG,
+ ACE_TEXT("TAO (%P|%t) - TAO::HTIOP::Transport[%d]::register_handler\n"),
+ this->id ()));
+ }
+
+ ACE_Reactor *r = this->orb_core_->reactor ();
+ if (r == this->connection_handler_->reactor ())
+ return 0;
+
+ // Set the flag in the Connection Handler and in the Wait Strategy
+ // @@Maybe we should set these flags after registering with the
+ // reactor. What if the registration fails???
+ this->ws_->is_registered (1);
+
+ ACE::HTBP::Session *s = this->connection_handler_->peer().session();
+ if (s)
+ s->reactor(r);
+ ACE::HTBP::Channel *ch = s->inbound();
+ return r->register_handler (ch->notifier(),
+ ACE_Event_Handler::READ_MASK);
+}
+
+
+int
+TAO::HTIOP::Transport::send_request (TAO_Stub *stub,
+ TAO_ORB_Core *orb_core,
+ TAO_OutputCDR &stream,
+ int message_semantics,
+ ACE_Time_Value *max_wait_time)
+{
+ if (this->ws_->sending_request (orb_core,
+ message_semantics) == -1)
+
+ return -1;
+
+ if (this->send_message (stream,
+ stub,
+ message_semantics,
+ max_wait_time) == -1)
+ return -1;
+
+ this->first_request_sent();
+
+ return this->idle_after_send ();
+}
+
+int
+TAO::HTIOP::Transport::send_message (TAO_OutputCDR &stream,
+ TAO_Stub *stub,
+ int message_semantics,
+ ACE_Time_Value *max_wait_time)
+{
+ // Format the message in the stream first
+ if (this->messaging_object_->format_message (stream) != 0)
+ return -1;
+
+ // This guarantees to send all data (bytes) or return an error.
+ ssize_t n = this->send_message_shared (stub,
+ message_semantics,
+ stream.begin (),
+ max_wait_time);
+
+ if (n == -1)
+ {
+ // Dont try to be smart and request for %p in the debug
+ // statement. If the event handler is destroyed the transport
+ // would return -1 with errno set to ENOENT. %p then would dump
+ // a core. %m would then be softer on this.
+ if (TAO_debug_level)
+ ACE_DEBUG ((LM_DEBUG,
+ ACE_TEXT ("TAO (%P|%t) - TAO::HTIOP::Transport[%d]::send_message, ")
+ ACE_TEXT (" write failure - %m\n"),
+ this->id ()));
+ return -1;
+ }
+
+ return 1;
+}
+
+int
+TAO::HTIOP::Transport::send_message_shared (TAO_Stub *stub,
+ int message_semantics,
+ const ACE_Message_Block *message_block,
+ ACE_Time_Value *max_wait_time)
+{
+ int r;
+ {
+ ACE_GUARD_RETURN (ACE_Lock, ace_mon, *this->handler_lock_, -1);
+
+ r = this->send_message_shared_i (stub, message_semantics,
+ message_block, max_wait_time);
+ }
+
+ if (r == -1)
+ {
+ this->close_connection ();
+ }
+
+ return r;
+}
+
+int
+TAO::HTIOP::Transport::generate_request_header (TAO_Operation_Details &opdetails,
+ TAO_Target_Specification &spec,
+ TAO_OutputCDR &msg)
+{
+ // Check whether we have a Bi Dir HTIOP policy set, whether the
+ // messaging objects are ready to handle bidirectional connections
+ // and also make sure that we have not recd. or sent any information
+ // regarding this before...
+ if (this->orb_core ()->bidir_giop_policy () &&
+ this->messaging_object_->is_ready_for_bidirectional (msg) &&
+ this->bidirectional_flag () < 0)
+ {
+ this->set_bidir_context_info (opdetails);
+
+ // Set the flag to 1 (i.e., originating side)
+ this->bidirectional_flag (1);
+
+ // At the moment we enable BiDIR giop we have to get a new
+ // request id to make sure that we follow the even/odd rule
+ // for request id's. We only need to do this when enabled
+ // it, after that the Transport Mux Strategy will make sure
+ // that the rule is followed
+ opdetails.request_id (this->tms ()->request_id ());
+ }
+
+ return TAO_Transport::generate_request_header (opdetails,
+ spec,
+ msg);
+}
+
+
+int
+TAO::HTIOP::Transport::messaging_init (CORBA::Octet major,
+ CORBA::Octet minor)
+{
+ this->messaging_object_->init (major,
+ minor);
+ return 1;
+}
+
+int
+TAO::HTIOP::Transport::tear_listen_point_list (TAO_InputCDR &cdr)
+{
+ CORBA::Boolean byte_order;
+ if ((cdr >> ACE_InputCDR::to_boolean (byte_order)) == 0)
+ return -1;
+
+ cdr.reset_byte_order (static_cast<int> (byte_order));
+
+ ::HTIOP::ListenPointList listen_list;
+ if ((cdr >> listen_list) == 0)
+ ACE_ERROR_RETURN ((LM_ERROR,"tear_listen_point_list: no list\n"),-1);
+ //return -1;
+
+ // As we have received a bidirectional information, set the flag to
+ // 1 (i.e., non-originating side)
+ this->bidirectional_flag (0);
+
+ // Just make sure that the connection handler is sane before we go
+ // head and do anything with it.
+ ACE_GUARD_RETURN (ACE_Lock,
+ ace_mon,
+ *this->handler_lock_,
+ -1);
+
+ return this->connection_handler_->process_listen_point_list (listen_list);
+}
+
+void
+TAO::HTIOP::Transport::set_bidir_context_info (TAO_Operation_Details &opdetails)
+{
+ ACE_UNUSED_ARG (opdetails);
+
+ // Get a handle to the acceptor registry
+ TAO_Acceptor_Registry &ar =
+ this->orb_core ()->lane_resources ().acceptor_registry ();
+
+ // Get the first acceptor in the registry
+ TAO_AcceptorSetIterator acceptor = ar.begin ();
+
+ ::HTIOP::ListenPointList listen_point_list;
+
+ for (;
+ acceptor != ar.end ();
+ acceptor++)
+ {
+ // Check whether it is a HTIOP acceptor
+ if ((*acceptor)->tag () == OCI_TAG_HTIOP_PROFILE)
+ {
+ if (this->get_listen_point (listen_point_list,
+ *acceptor) == -1)
+ {
+ ACE_ERROR ((LM_ERROR,
+ ACE_TEXT("TAO (%P|%t) - TAO::HTIOP::Transport::set_bidir_info, "),
+ ACE_TEXT("error getting listen_point \n")));
+
+ return;
+ }
+ }
+ }
+
+ // We have the ListenPointList at this point. Create a output CDR
+ // stream at this point
+ TAO_OutputCDR cdr;
+
+ // Marshall the information into the stream
+ if ((cdr << ACE_OutputCDR::from_boolean (TAO_ENCAP_BYTE_ORDER) == 0)
+ || (cdr << listen_point_list) == 0)
+ return;
+
+ // Add this info in to the svc_list
+ opdetails.request_service_context ().set_context (IOP::BI_DIR_IIOP,
+ cdr);
+
+ return;
+}
+
+int
+TAO::HTIOP::Transport::get_listen_point (::HTIOP::ListenPointList &lp_list,
+ TAO_Acceptor *acceptor)
+{
+ TAO::HTIOP::Acceptor *htiop_acceptor =
+ dynamic_cast<TAO::HTIOP::Acceptor *> (acceptor );
+
+ // Get the array of endpoints serviced by TAO::HTIOP::Acceptor
+ const ACE::HTBP::Addr *endpoint_addr =
+ htiop_acceptor->endpoints ();
+
+ // Get the endpoint count
+ size_t count =
+ htiop_acceptor->endpoint_count ();
+
+ // Get the local address of the connection
+ ACE::HTBP::Addr local_addr;
+ {
+ // Just make sure that the connection handler is sane before we go
+ // head and do anything with it.
+ ACE_GUARD_RETURN (ACE_Lock,
+ ace_mon,
+ *this->handler_lock_,
+ -1);
+
+ if (this->connection_handler_->peer ().get_local_addr (local_addr)
+ == -1)
+ {
+ ACE_ERROR_RETURN ((LM_ERROR,
+ ACE_TEXT ("(%P|%t) Could not resolve local ")
+ ACE_TEXT ("host address in ")
+ ACE_TEXT ("get_listen_point()\n")),
+ -1);
+ }
+ }
+
+ if (local_addr.get_port_number() != 0)
+ {
+
+ // Note: Looks like there is no point in sending the list of
+ // endpoints on interfaces on which this connection has not
+ // been established. If this is wrong, please correct me.
+ CORBA::String_var local_interface;
+
+ // Get the hostname for the local address
+ if (htiop_acceptor->hostname (this->orb_core_,
+ local_addr,
+ local_interface.out ()) == -1)
+ {
+ ACE_ERROR_RETURN ((LM_ERROR,
+ ACE_TEXT ("(%P|%t) Could not resolve local host")
+ ACE_TEXT (" name \n")),
+ -1);
+ }
+
+ for (size_t index = 0;
+ index != count;
+ index++)
+ {
+ if (local_addr.get_ip_address()
+ == endpoint_addr[index].get_ip_address())
+ {
+ // Get the count of the number of elements
+ CORBA::ULong len = lp_list.length ();
+
+ // Increase the length by 1
+ lp_list.length (len + 1);
+
+ // We have the connection and the acceptor endpoint on the
+ // same interface
+ ::HTIOP::ListenPoint &point = lp_list[len];
+ point.host = CORBA::string_dup (local_interface.in ());
+ point.port = endpoint_addr[index].get_port_number ();
+ }
+ }
+ }
+ else
+ {
+ // Only add a single listen point based on the htid in the addr
+ lp_list.length (1);
+ ::HTIOP::ListenPoint &point = lp_list[0];
+ point.host = CORBA::string_dup ("");
+ point.port = 0;
+ point.htid = endpoint_addr[0].get_htid();
+ }
+ return 1;
+}
+
+
+TAO_Connection_Handler *
+TAO::HTIOP::Transport::invalidate_event_handler_i (void)
+{
+ TAO_Connection_Handler * eh = this->connection_handler_;
+ this->connection_handler_ = 0;
+ return eh;
+}
+
+TAO_END_VERSIONED_NAMESPACE_DECL
diff --git a/TAO/orbsvcs/orbsvcs/HTIOP/HTIOP_Transport.h b/TAO/orbsvcs/orbsvcs/HTIOP/HTIOP_Transport.h
new file mode 100644
index 00000000000..6db9ca8dcfc
--- /dev/null
+++ b/TAO/orbsvcs/orbsvcs/HTIOP/HTIOP_Transport.h
@@ -0,0 +1,168 @@
+// -*- C++ -*-
+
+// ===================================================================
+/**
+ * @file HTIOP_Transport.h
+ *
+ * $Id$
+ *
+ * @author Originally by Fred Kuhns <fredk@cs.wustl.edu>
+ * @author Modified by Balachandran Natarajan <bala@cs.wustl.edu>
+ */
+// ===================================================================
+
+#ifndef TAO_HTIOP_TRANSPORT_H
+#define TAO_HTIOP_TRANSPORT_H
+#include /**/ "ace/pre.h"
+
+#include "orbsvcs/HTIOP/HTIOP_Export.h"
+
+#if !defined (ACE_LACKS_PRAGMA_ONCE)
+# pragma once
+#endif /* ACE_LACKS_PRAGMA_ONCE */
+
+#include "orbsvcs/HTIOPC.h"
+
+#include "ace/HTBP/HTBP_Stream.h"
+
+#include "tao/Transport.h"
+
+#include "ace/Synch.h"
+#include "ace/Svc_Handler.h"
+//#include "HTIOP/HTIOPC.h"
+
+# if defined (ACE_HAS_TEMPLATE_TYPEDEFS)
+# define ACE_HTBP_STREAM ACE::HTBP::Stream
+# else /* If TEMPLATES are broken in some form or another */
+# define ACE_HTBP_STREAM ACE::HTBP::Stream, ACE::HTBP::Addr
+#endif /* ACE_HAS_TEMPLATE_TYPEDEFS */
+
+TAO_BEGIN_VERSIONED_NAMESPACE_DECL
+
+// Forward decls.
+class TAO_ORB_Core;
+class TAO_Operation_Details;
+class TAO_Pluggable_Messaging;
+class TAO_Acceptor;
+class TAO_Adapter;
+
+namespace TAO
+{
+ namespace HTIOP
+ {
+ class Connection_Handler;
+
+ // Service Handler for this transport
+ typedef ACE_Svc_Handler<ACE_HTBP_STREAM, ACE_NULL_SYNCH>
+ SVC_HANDLER;
+
+ /**
+ * @class Transport
+ *
+ * @brief Specialization of the base Transport class to handle the
+ * HTIOP protocol.
+ *
+ *
+ *
+ */
+
+ class HTIOP_Export Transport : public TAO_Transport
+ {
+ public:
+
+ /// Constructor.
+ Transport (Connection_Handler *handler,
+ TAO_ORB_Core *orb_core,
+ CORBA::Boolean flag);
+
+ /// Default destructor.
+ ~Transport (void);
+
+ protected:
+
+ /** @name Overridden Template Methods
+ *
+ * Please check the documentation in "tao/Transport.h" for more
+ * details.
+ */
+ //@{
+
+ virtual ACE_Event_Handler * event_handler_i (void);
+ virtual TAO_Connection_Handler * invalidate_event_handler_i (void);
+
+ /// Access the underlying messaging object
+ virtual TAO_Pluggable_Messaging *messaging_object (void);
+
+ virtual ssize_t send (iovec *iov, int iovcnt,
+ size_t &bytes_transferred,
+ const ACE_Time_Value *timeout = 0);
+
+ virtual ssize_t recv (char *buf,
+ size_t len,
+ const ACE_Time_Value *s = 0);
+
+ virtual int register_handler (void);
+
+ virtual int send_message_shared (TAO_Stub *stub,
+ int message_semantics,
+ const ACE_Message_Block *message_block,
+ ACE_Time_Value *max_wait_time);
+
+
+ public:
+ /// @@TODO: These methods IMHO should have more meaningful
+ /// names. The names seem to indicate nothing.
+ virtual int send_request (TAO_Stub *stub,
+ TAO_ORB_Core *orb_core,
+ TAO_OutputCDR &stream,
+ int message_semantics,
+ ACE_Time_Value *max_wait_time);
+
+ virtual int send_message (TAO_OutputCDR &stream,
+ TAO_Stub *stub = 0,
+ int message_semantics =
+ Transport::TAO_TWOWAY_REQUEST,
+ ACE_Time_Value *max_time_wait = 0);
+
+ // @@ This is probably not needed - Priyanka
+ // This is needed because we want to send additional information
+ // such as session id etc. in the header.
+ virtual int generate_request_header (TAO_Operation_Details &opdetails,
+ TAO_Target_Specification &spec,
+ TAO_OutputCDR &msg);
+
+
+ virtual int messaging_init (CORBA::Octet major,
+ CORBA::Octet minor);
+
+ virtual int tear_listen_point_list (TAO_InputCDR &cdr);
+
+ virtual TAO_Connection_Handler * connection_handler_i (void);
+
+ //@}
+
+ private:
+
+ /// Set the Bidirectional context info in the service context list
+ void set_bidir_context_info (TAO_Operation_Details &opdetails);
+
+ /// Add the listen points in <acceptor> to the <listen_point_list>
+ /// if this connection is in the same interface as that of the
+ /// endpoints in the <acceptor>
+ int get_listen_point (::HTIOP::ListenPointList &listen_point_list,
+ TAO_Acceptor *acceptor);
+
+ /// The connection service handler used for accessing lower layer
+ /// communication protocols.
+ Connection_Handler *connection_handler_;
+
+ /// Our messaging object.
+ TAO_Pluggable_Messaging *messaging_object_;
+ };
+ }
+}
+
+TAO_END_VERSIONED_NAMESPACE_DECL
+
+#include /**/ "ace/post.h"
+#endif /* TRANSPORT_H */
diff --git a/TAO/orbsvcs/orbsvcs/HTIOP/README.txt b/TAO/orbsvcs/orbsvcs/HTIOP/README.txt
new file mode 100644
index 00000000000..567e302009e
--- /dev/null
+++ b/TAO/orbsvcs/orbsvcs/HTIOP/README.txt
@@ -0,0 +1,154 @@
+ HTTP Tunneling Inter-ORB Protocol
+
+Introduction
+Components
+HTTP Tunneling Protocol
+HTTP Tunneling Inter-ORB Protocol
+
+Introduction
+
+
+
+1.Terminology
+
+Inside - This refers to any peer that is inside a firewall protected
+enclave, and must forward requests to services through a proxy. It is
+assumed with this protocol that the proxy restricts traffic to HTTP
+requests/replies.
+
+Outside - This refers to any peer is outside of the firewall
+protecting inside peers. The outside peer advertises an endpoint that
+is reachable from the inside peer's proxy.
+
+Proxy - The gateway through which HTTP requests may flow. It is
+assumed that no configuration changes to the proxy are permitted. For
+now, Squid is the only HTTP proxy that is supported by HTIOP, although
+others may also work.
+
+HTID - A unique identifier for peers inside the firewall. This may be
+a self-generated UUID, or it may be an externally generated
+domain-specific identity. This identity is important to allow outside
+peers to identify many different clients, which may reside on locally
+similar or non-routable networks, such as 10.*.*.* or 192.168.*.*.
+
+HTIOP_Factory - This is the service configuration class used to load
+the pluggable protocol via the ACE Service Configuratior. The
+HTIOP_Factory takes the following initialization arguments:
+
+-config <filename> Specifies the text file containing HTBP specific
+ configuration. This value is optional.
+-env_persist <filename> Specifies the name of a flat file containing
+ a previously persisted configuration, or to which
+ new configuration will be persisted. If both
+ -config and -env_persist are specified, the memory
+ mapped file will be loaded first, then the text
+ file interpreted. The new configuration will then
+ be persisted in the flat file.
+-win32_reg If set, then the windows' registry will be used
+ rather than the memory mapped file. This feature
+ is available only on windows.
+-inside [-1|0|1] Explicitly declare that the endpoint is inside or
+ outside the firewall. When set to the default -1,
+ the HTIOP_Factory uses the ACE_HTBP_Environment
+ proxy_host setting to determine if it is inside or
+ outside the firewall. It is only important to be
+ explicit about inside/outside definition when
+ testing without a real proxy. HTIOP is an
+ asymmetric protocol, peers outside the firewall
+ cannot initiate connections to inside peers, and
+ only an inside peer can talk to an outside peer.
+
+2. Components
+
+The HTTP tunneling protocol support consists of two libraries.
+
+. libACE_HTBP is the library that implements the low level HTBP
+Protocol. This allows the the communication between the inside and the
+outside peers through a firewall proxy. It supports direct connections
+as well though the default is the use of a proxy. This library should
+be linked into code that wishes to support such communication.
+
+. libTAO_HTIOP implements an Inter-ORB Protocol, HTIOP, that allows
+TAO to utilize the HTBP Protocol.
+
+3. Directory Structure
+
+. $ACE_ROOT/ace/HTBP
+ Files used for implementing the low level HTBP Protocol.
+
+. $TAO_ROOT/orbsvcs/orbsvcs/HTIOP
+ Files that implements HTIOP protocol.
+
+. $ACE_ROOT/tests/HTBP
+ Tests for the low level HTBP Protocol.
+
+. $TAO_ROOT/orbsvcs/tests/HTIOP
+ Tests for the HTIOP protocol.
+
+4. Requirements for using HTBP Protocol
+ Refer to ace/HTBP/README for details on configuring HTBP clients
+
+5. Using HTIOP in applications
+
+ HTIOP is an Asymmetric protocol. This means that applications inside
+ the firewall must be configured differently than applications on the
+ outside. Inside peers are the only ones which may initiate
+ connections. If a peer to peer relationship is desired, where CORBA
+ invocations flow in either direction, then Bidirectional GIOP must
+ be used.
+
+ One of the challenges imposed by the use of a proxy is that if a
+ connection is idle for long enough the connection may be
+ closed. This means the inside peer must reopen it by sending another
+ request. Since the outside peer cannot reopen the connection, it
+ will queue messages until the inside peer re-establishes a
+ connection, at which time all queued messages are sent.
+
+ A second challenge is that while a proxy will open multiple TCP/IP
+ connections to a server (the outside peer), when faced with multiple
+ simultanious HTTP requests, it will reuse those connections at will
+ to forward any subsequent requests. This means that a socket is
+ associated with a particular HTIOP session for only one HTTP
+ request/reply.
+
+ Apart from loading the protocol, and declaring an endpoint, no
+ modifications to application code are required in order to use
+ HTIOP.
+
+5a. Loading the protocol.
+
+ HTIOP is loaded via svc.conf. See the list of initialization options
+ shown above for details. Here is a sample svc.conf file for loading
+ HTIOP, as it would be used in a server.
+
+dynamic HTIOP_Factory Service_Object *
+ TAO_HTIOP:_make_TAO_HTIOP_Protocol_Factory () ""
+
+static Resource_Factory "-ORBProtocolFactory HTIOP_Factory"
+
+ This example is specifically for a server since no configuration
+ file is specified meaning no proxy host value is set. The following
+ examples could be used to configure a client.
+
+#used on the inside, but no proxy configured
+dynamic HTIOP_Factory Service_Object *
+ TAO_HTIOP:_make_TAO_HTIOP_Protocol_Factory ()
+ "-inside 1"
+
+#used on the inside, with proxy configuration supplied
+dynamic HTIOP_Factory Service_Object *
+ TAO_HTIOP:_make_TAO_HTIOP_Protocol_Factory ()
+ "-config HTBP_Config.txt"
+
+static Resource_Factory "-ORBProtocolFactory HTIOP_Factory"
+
+5b. Declaring an endpoint.
+
+ Since most HTTP proxies restrict outgoing connections only to port
+ 80, it is a requirement that an explicit endpoint be set for
+ HTIOP. The signature is very similar to that of IIOP:
+
+ -ORBEndpoint HTIOP://hostname:80[/hostname_in_ior=www.mybiz.com]
+
+ The optional hostname_in_ior allows HTIOP to be used behind a NAT
+ firewall.
diff --git a/TAO/orbsvcs/orbsvcs/HTIOP/htiop_endpoints.pidl b/TAO/orbsvcs/orbsvcs/HTIOP/htiop_endpoints.pidl
new file mode 100644
index 00000000000..91ec7acef3a
--- /dev/null
+++ b/TAO/orbsvcs/orbsvcs/HTIOP/htiop_endpoints.pidl
@@ -0,0 +1,42 @@
+// -*- IDL -*-
+//
+// $Id$
+
+/*
+ * This file contains idl definition for data structures used to
+ * encapsulate data in TAO_TAG_ENDPOINTS tagged component. This
+ * TAO-specific component is used for transmission of multiple
+ * endpoints per single profile. Data structures defined here are
+ * used for transmission of htiop Endpoints. See HTIOP_Profile.*
+ * for more details.
+ *
+ * This file was used to generate the code in
+ * htiop_endpoints.* The command used to generate code
+ * is:
+ *
+ * tao_idl
+ * -Gp -Gd -Ge 1 -Sc -Sa -DCORBA3 -Sci \
+ * -Wb,export_macro=HTIOP_Export \
+ * -Wb,export_include="HTIOP_Export.h" \
+ * -Wb,pre_include="ace/pre.h" \
+ * -Wb,post_include="ace/post.h" \
+ * htiop_endpoints.pidl
+ */
+
+#ifndef _HTIOP_ENDPOINTS_IDL_
+#define _HTIOP_ENDPOINTS_IDL_
+
+// Stores information for a single HTIOP endpoint.
+struct HTIOP_Endpoint_Info
+{
+ string host;
+ short port;
+ string htid;
+};
+
+// Stores information for a collection of HTIOP endpoints.
+typedef sequence <HTIOP_Endpoint_Info> HTIOPEndpointSequence;
+
+#pragma prefix ""
+
+#endif /* _HTIOP_ENDPOINTS_IDL_ */
diff --git a/TAO/orbsvcs/orbsvcs/HTIOP/htiop_endpointsC.cpp b/TAO/orbsvcs/orbsvcs/HTIOP/htiop_endpointsC.cpp
new file mode 100644
index 00000000000..e0db9e121f9
--- /dev/null
+++ b/TAO/orbsvcs/orbsvcs/HTIOP/htiop_endpointsC.cpp
@@ -0,0 +1,222 @@
+// -*- C++ -*-
+//
+// $Id$
+
+// **** Code generated by the The ACE ORB (TAO) IDL Compiler ****
+// TAO and the TAO IDL Compiler have been developed by:
+// Center for Distributed Object Computing
+// Washington University
+// St. Louis, MO
+// USA
+// http://www.cs.wustl.edu/~schmidt/doc-center.html
+// and
+// Distributed Object Computing Laboratory
+// University of California at Irvine
+// Irvine, CA
+// USA
+// http://doc.ece.uci.edu/
+// and
+// Institute for Software Integrated Systems
+// Vanderbilt University
+// Nashville, TN
+// USA
+// http://www.isis.vanderbilt.edu/
+//
+// Information about TAO is available at:
+// http://www.cs.wustl.edu/~schmidt/TAO.html
+
+// TAO_IDL - Generated from
+// be\be_codegen.cpp:291
+
+
+#include "tao/AnyTypeCode/Null_RefCount_Policy.h"
+#include "tao/AnyTypeCode/TypeCode_Constants.h"
+#include "tao/AnyTypeCode/Alias_TypeCode_Static.h"
+#include "tao/AnyTypeCode/Sequence_TypeCode_Static.h"
+#include "tao/AnyTypeCode/String_TypeCode_Static.h"
+#include "tao/AnyTypeCode/Struct_TypeCode_Static.h"
+#include "tao/AnyTypeCode/TypeCode_Struct_Field.h"
+#include "orbsvcs/HTIOP/htiop_endpointsC.h"
+#include "tao/CDR.h"
+
+#if defined (__BORLANDC__)
+#pragma option -w-rvl -w-rch -w-ccc -w-aus -w-sig
+#endif /* __BORLANDC__ */
+
+// TAO_IDL - Generated from
+// be\be_visitor_arg_traits.cpp:69
+
+TAO_BEGIN_VERSIONED_NAMESPACE_DECL
+
+// Arg traits specializations.
+namespace TAO
+{
+}
+
+
+// TAO_IDL - Generated from
+// be\be_visitor_typecode/struct_typecode.cpp:74
+
+static TAO::TypeCode::Struct_Field<char const *, CORBA::TypeCode_ptr const *> const _tao_fields_HTIOP_Endpoint_Info[] =
+ {
+ { "host", &CORBA::_tc_string },
+ { "port", &CORBA::_tc_short },
+ { "htid", &CORBA::_tc_string }
+
+ };
+static TAO::TypeCode::Struct<char const *,
+ CORBA::TypeCode_ptr const *,
+ TAO::TypeCode::Struct_Field<char const *,
+ CORBA::TypeCode_ptr const *> const *,
+ TAO::Null_RefCount_Policy>
+ _tao_tc_HTIOP_Endpoint_Info (
+ CORBA::tk_struct,
+ "IDL:HTIOP_Endpoint_Info:1.0",
+ "HTIOP_Endpoint_Info",
+ _tao_fields_HTIOP_Endpoint_Info,
+ 3);
+
+::CORBA::TypeCode_ptr const _tc_HTIOP_Endpoint_Info =
+ &_tao_tc_HTIOP_Endpoint_Info;
+
+// TAO_IDL - Generated from
+// be\be_visitor_structure/structure_cs.cpp:66
+
+
+
+// TAO_IDL - Generated from
+// be\be_visitor_sequence/sequence_cs.cpp:65
+
+#if !defined (_HTIOPENDPOINTSEQUENCE_CS_)
+#define _HTIOPENDPOINTSEQUENCE_CS_
+
+HTIOPEndpointSequence::HTIOPEndpointSequence (void)
+{}
+
+HTIOPEndpointSequence::HTIOPEndpointSequence (
+ CORBA::ULong max
+ )
+ : TAO::unbounded_value_sequence<
+ HTIOP_Endpoint_Info
+ >
+ (max)
+{}
+
+HTIOPEndpointSequence::HTIOPEndpointSequence (
+ CORBA::ULong max,
+ CORBA::ULong length,
+ HTIOP_Endpoint_Info * buffer,
+ CORBA::Boolean release
+ )
+ : TAO::unbounded_value_sequence<
+ HTIOP_Endpoint_Info
+ >
+ (max, length, buffer, release)
+{}
+
+HTIOPEndpointSequence::HTIOPEndpointSequence (
+ const HTIOPEndpointSequence &seq
+ )
+ : TAO::unbounded_value_sequence<
+ HTIOP_Endpoint_Info
+ >
+ (seq)
+{}
+
+HTIOPEndpointSequence::~HTIOPEndpointSequence (void)
+{}
+
+#endif /* end #if !defined */
+
+// TAO_IDL - Generated from
+// be\be_visitor_typecode/alias_typecode.cpp:31
+
+
+
+// TAO_IDL - Generated from
+// be\be_visitor_typecode/typecode_defn.cpp:925
+
+
+#ifndef _TAO_TYPECODE_HTIOPEndpointSequence_GUARD
+#define _TAO_TYPECODE_HTIOPEndpointSequence_GUARD
+namespace TAO
+{
+ namespace TypeCode
+ {
+ TAO::TypeCode::Sequence< ::CORBA::TypeCode_ptr const *,
+ TAO::Null_RefCount_Policy>
+ HTIOPEndpointSequence_0 (
+ CORBA::tk_sequence,
+ &_tc_HTIOP_Endpoint_Info,
+ 0U);
+
+ ::CORBA::TypeCode_ptr const tc_HTIOPEndpointSequence_0 =
+ &HTIOPEndpointSequence_0;
+
+ }
+}
+
+
+#endif /* _TAO_TYPECODE_HTIOPEndpointSequence_GUARD */
+static TAO::TypeCode::Alias<char const *,
+ CORBA::TypeCode_ptr const *,
+ TAO::Null_RefCount_Policy>
+ _tao_tc_HTIOPEndpointSequence (
+ CORBA::tk_alias,
+ "IDL:HTIOPEndpointSequence:1.0",
+ "HTIOPEndpointSequence",
+ &TAO::TypeCode::tc_HTIOPEndpointSequence_0);
+
+::CORBA::TypeCode_ptr const _tc_HTIOPEndpointSequence =
+ &_tao_tc_HTIOPEndpointSequence;
+
+// TAO_IDL - Generated from
+// be\be_visitor_structure/cdr_op_cs.cpp:61
+
+CORBA::Boolean operator<< (
+ TAO_OutputCDR &strm,
+ const HTIOP_Endpoint_Info &_tao_aggregate
+ )
+{
+ return
+ (strm << _tao_aggregate.host.in ()) &&
+ (strm << _tao_aggregate.port) &&
+ (strm << _tao_aggregate.htid.in ());
+}
+
+CORBA::Boolean operator>> (
+ TAO_InputCDR &strm,
+ HTIOP_Endpoint_Info &_tao_aggregate
+ )
+{
+ return
+ (strm >> _tao_aggregate.host.out ()) &&
+ (strm >> _tao_aggregate.port) &&
+ (strm >> _tao_aggregate.htid.out ());
+}
+
+// TAO_IDL - Generated from
+// be\be_visitor_sequence/cdr_op_cs.cpp:96
+
+#if !defined _TAO_CDR_OP_HTIOPEndpointSequence_CPP_
+#define _TAO_CDR_OP_HTIOPEndpointSequence_CPP_
+
+CORBA::Boolean operator<< (
+ TAO_OutputCDR &strm,
+ const HTIOPEndpointSequence &_tao_sequence
+ )
+{
+ return TAO::marshal_sequence(strm, _tao_sequence);
+}
+
+CORBA::Boolean operator>> (
+ TAO_InputCDR &strm,
+ HTIOPEndpointSequence &_tao_sequence
+ )
+{
+ return TAO::demarshal_sequence(strm, _tao_sequence);
+}
+
+#endif /* _TAO_CDR_OP_HTIOPEndpointSequence_CPP_ */
+
+TAO_END_VERSIONED_NAMESPACE_DECL
diff --git a/TAO/orbsvcs/orbsvcs/HTIOP/htiop_endpointsC.h b/TAO/orbsvcs/orbsvcs/HTIOP/htiop_endpointsC.h
new file mode 100644
index 00000000000..e8a22b50479
--- /dev/null
+++ b/TAO/orbsvcs/orbsvcs/HTIOP/htiop_endpointsC.h
@@ -0,0 +1,199 @@
+// -*- C++ -*-
+//
+// $Id$
+
+// **** Code generated by the The ACE ORB (TAO) IDL Compiler ****
+// TAO and the TAO IDL Compiler have been developed by:
+// Center for Distributed Object Computing
+// Washington University
+// St. Louis, MO
+// USA
+// http://www.cs.wustl.edu/~schmidt/doc-center.html
+// and
+// Distributed Object Computing Laboratory
+// University of California at Irvine
+// Irvine, CA
+// USA
+// http://doc.ece.uci.edu/
+// and
+// Institute for Software Integrated Systems
+// Vanderbilt University
+// Nashville, TN
+// USA
+// http://www.isis.vanderbilt.edu/
+//
+// Information about TAO is available at:
+// http://www.cs.wustl.edu/~schmidt/TAO.html
+
+// TAO_IDL - Generated from
+// be\be_codegen.cpp:153
+
+#ifndef _TAO_IDL_ORIG_HTIOP_ENDPOINTSC_H_
+#define _TAO_IDL_ORIG_HTIOP_ENDPOINTSC_H_
+
+#include /**/ "ace/pre.h"
+
+
+#include "ace/config-all.h"
+
+#if !defined (ACE_LACKS_PRAGMA_ONCE)
+# pragma once
+#endif /* ACE_LACKS_PRAGMA_ONCE */
+
+#include "orbsvcs/HTIOP/HTIOP_Export.h"
+#include "tao/ORB.h"
+#include "tao/Environment.h"
+#include "tao/Sequence_T.h"
+#include "tao/Seq_Var_T.h"
+#include "tao/Seq_Out_T.h"
+#include "tao/VarOut_T.h"
+#include "tao/String_Manager_T.h"
+
+#if defined (TAO_EXPORT_MACRO)
+#undef TAO_EXPORT_MACRO
+#endif
+#define TAO_EXPORT_MACRO HTIOP_Export
+
+#if defined(_MSC_VER)
+#pragma warning(push)
+#pragma warning(disable:4250)
+#endif /* _MSC_VER */
+
+#if defined (__BORLANDC__)
+#pragma option push -w-rvl -w-rch -w-ccc -w-inl
+#endif /* __BORLANDC__ */
+
+TAO_BEGIN_VERSIONED_NAMESPACE_DECL
+
+// TAO_IDL - Generated from
+// be\be_type.cpp:258
+
+struct HTIOP_Endpoint_Info;
+
+typedef
+ TAO_Var_Var_T<
+ HTIOP_Endpoint_Info
+ >
+ HTIOP_Endpoint_Info_var;
+
+typedef
+ TAO_Out_T<
+ HTIOP_Endpoint_Info
+ >
+ HTIOP_Endpoint_Info_out;
+
+// TAO_IDL - Generated from
+// be\be_visitor_structure/structure_ch.cpp:52
+
+struct HTIOP_Export HTIOP_Endpoint_Info
+{
+ typedef HTIOP_Endpoint_Info_var _var_type;
+
+
+ TAO::String_Manager host;
+ CORBA::Short port;
+ TAO::String_Manager htid;
+};
+
+// TAO_IDL - Generated from
+// be\be_visitor_typecode/typecode_decl.cpp:44
+
+extern HTIOP_Export ::CORBA::TypeCode_ptr const _tc_HTIOP_Endpoint_Info;
+
+// TAO_IDL - Generated from
+// be\be_visitor_sequence/sequence_ch.cpp:101
+
+#if !defined (_HTIOPENDPOINTSEQUENCE_CH_)
+#define _HTIOPENDPOINTSEQUENCE_CH_
+
+class HTIOPEndpointSequence;
+
+typedef
+ TAO_VarSeq_Var_T<
+ HTIOPEndpointSequence
+ >
+ HTIOPEndpointSequence_var;
+
+typedef
+ TAO_Seq_Out_T<
+ HTIOPEndpointSequence
+ >
+ HTIOPEndpointSequence_out;
+
+class HTIOP_Export HTIOPEndpointSequence
+ : public
+ TAO::unbounded_value_sequence<
+ HTIOP_Endpoint_Info
+ >
+{
+public:
+ HTIOPEndpointSequence (void);
+ HTIOPEndpointSequence (CORBA::ULong max);
+ HTIOPEndpointSequence (
+ CORBA::ULong max,
+ CORBA::ULong length,
+ HTIOP_Endpoint_Info* buffer,
+ CORBA::Boolean release = false
+ );
+ HTIOPEndpointSequence (const HTIOPEndpointSequence &);
+ ~HTIOPEndpointSequence (void);
+
+ typedef HTIOPEndpointSequence_var _var_type;
+};
+
+#endif /* end #if !defined */
+
+// TAO_IDL - Generated from
+// be\be_visitor_typecode/typecode_decl.cpp:44
+
+extern HTIOP_Export ::CORBA::TypeCode_ptr const _tc_HTIOPEndpointSequence;
+
+// TAO_IDL - Generated from
+// be\be_visitor_traits.cpp:61
+
+// Traits specializations.
+namespace TAO
+{
+}
+
+// TAO_IDL - Generated from
+// be\be_visitor_structure/cdr_op_ch.cpp:54
+
+HTIOP_Export CORBA::Boolean operator<< (TAO_OutputCDR &, const HTIOP_Endpoint_Info &);
+HTIOP_Export CORBA::Boolean operator>> (TAO_InputCDR &, HTIOP_Endpoint_Info &);
+
+// TAO_IDL - Generated from
+// be\be_visitor_sequence/cdr_op_ch.cpp:71
+
+#if !defined _TAO_CDR_OP_HTIOPEndpointSequence_H_
+#define _TAO_CDR_OP_HTIOPEndpointSequence_H_
+
+HTIOP_Export CORBA::Boolean operator<< (
+ TAO_OutputCDR &,
+ const HTIOPEndpointSequence &
+ );
+HTIOP_Export CORBA::Boolean operator>> (
+ TAO_InputCDR &,
+ HTIOPEndpointSequence &
+ );
+
+#endif /* _TAO_CDR_OP_HTIOPEndpointSequence_H_ */
+
+TAO_END_VERSIONED_NAMESPACE_DECL
+
+// TAO_IDL - Generated from
+// be\be_codegen.cpp:955
+
+#if defined(_MSC_VER)
+#pragma warning(pop)
+#endif /* _MSC_VER */
+
+#if defined (__BORLANDC__)
+#pragma option pop
+#endif /* __BORLANDC__ */
+
+#include /**/ "ace/post.h"
+
+#endif /* ifndef */
+
+
diff --git a/TAO/orbsvcs/orbsvcs/IFRService.mpc b/TAO/orbsvcs/orbsvcs/IFRService.mpc
new file mode 100644
index 00000000000..e0c158052da
--- /dev/null
+++ b/TAO/orbsvcs/orbsvcs/IFRService.mpc
@@ -0,0 +1,21 @@
+// -*- MPC -*-
+// $Id$
+
+project(IFRService) : orbsvcslib, core, typecodefactory, svc_utils, iortable, minimum_corba {
+ avoids += ace_for_tao // Requires ace/Configuration
+ sharedname = TAO_IFRService
+ dynamicflags = TAO_IFRSERVICE_BUILD_DLL
+ tagchecks += IFRService
+
+ IDL_Files {
+ }
+
+ Source_Files(ORBSVCS_COMPONENTS) {
+ IFRService {
+ IFRService
+ }
+ }
+
+ Template_Files {
+ }
+}
diff --git a/TAO/orbsvcs/orbsvcs/IFRService.rc b/TAO/orbsvcs/orbsvcs/IFRService.rc
new file mode 100644
index 00000000000..fd74244fa4f
--- /dev/null
+++ b/TAO/orbsvcs/orbsvcs/IFRService.rc
@@ -0,0 +1,30 @@
+#include "..\..\tao\Version.h"
+
+1 VERSIONINFO
+ FILEVERSION TAO_MAJOR_VERSION,TAO_MINOR_VERSION,TAO_BETA_VERSION,0
+ PRODUCTVERSION TAO_MAJOR_VERSION,TAO_MINOR_VERSION,TAO_BETA_VERSION,0
+ FILEFLAGSMASK 0x3fL
+ FILEFLAGS 0x0L
+ FILEOS 0x4L
+ FILETYPE 0x1L
+ FILESUBTYPE 0x0L
+BEGIN
+ BLOCK "StringFileInfo"
+ BEGIN
+ BLOCK "040904B0"
+ BEGIN
+ VALUE "FileDescription", "IFRService\0"
+ VALUE "FileVersion", TAO_VERSION "\0"
+ VALUE "InternalName", "IFRServiceDLL\0"
+ VALUE "LegalCopyright", "\0"
+ VALUE "LegalTrademarks", "\0"
+ VALUE "OriginalFilename", "IFRService.DLL\0"
+ VALUE "ProductName", "ORBSVCS\0"
+ VALUE "ProductVersion", TAO_VERSION "\0"
+ END
+ END
+ BLOCK "VarFileInfo"
+ BEGIN
+ VALUE "Translation", 0x409, 1200
+ END
+END
diff --git a/TAO/orbsvcs/orbsvcs/IFRService/AbstractInterfaceDef_i.cpp b/TAO/orbsvcs/orbsvcs/IFRService/AbstractInterfaceDef_i.cpp
new file mode 100644
index 00000000000..9c7831e7387
--- /dev/null
+++ b/TAO/orbsvcs/orbsvcs/IFRService/AbstractInterfaceDef_i.cpp
@@ -0,0 +1,62 @@
+// $Id$
+
+#include "orbsvcs/IFRService/AbstractInterfaceDef_i.h"
+#include "orbsvcs/IFRService/Repository_i.h"
+
+ACE_RCSID (IFRService,
+ AbstractInterfaceDef_i,
+ "$Id$")
+
+TAO_BEGIN_VERSIONED_NAMESPACE_DECL
+
+TAO_AbstractInterfaceDef_i::TAO_AbstractInterfaceDef_i (
+ TAO_Repository_i *repo
+ )
+ : TAO_IRObject_i (repo),
+ TAO_Container_i (repo),
+ TAO_Contained_i (repo),
+ TAO_IDLType_i (repo),
+ TAO_InterfaceDef_i (repo)
+{
+}
+
+TAO_AbstractInterfaceDef_i::~TAO_AbstractInterfaceDef_i (void)
+{
+}
+
+CORBA::DefinitionKind
+TAO_AbstractInterfaceDef_i::def_kind (ACE_ENV_SINGLE_ARG_DECL_NOT_USED)
+ ACE_THROW_SPEC ((CORBA::SystemException))
+{
+ return CORBA::dk_AbstractInterface;
+}
+
+CORBA::Boolean
+TAO_AbstractInterfaceDef_i::is_a (const char *interface_id
+ ACE_ENV_ARG_DECL)
+ ACE_THROW_SPEC ((CORBA::SystemException))
+{
+ TAO_IFR_READ_GUARD_RETURN (0);
+
+ this->update_key (ACE_ENV_SINGLE_ARG_PARAMETER);
+ ACE_CHECK_RETURN (0);
+
+ return this->is_a_i (interface_id
+ ACE_ENV_ARG_PARAMETER);
+}
+
+CORBA::Boolean
+TAO_AbstractInterfaceDef_i::is_a_i (const char *interface_id
+ ACE_ENV_ARG_DECL)
+ ACE_THROW_SPEC ((CORBA::SystemException))
+{
+ if (ACE_OS::strcmp (interface_id, "IDL:omg.org/CORBA/AbstractBase:1.0") == 0)
+ {
+ return 1;
+ }
+
+ return this->TAO_InterfaceDef_i::is_a_i (interface_id
+ ACE_ENV_ARG_PARAMETER);
+}
+
+TAO_END_VERSIONED_NAMESPACE_DECL
diff --git a/TAO/orbsvcs/orbsvcs/IFRService/AbstractInterfaceDef_i.h b/TAO/orbsvcs/orbsvcs/IFRService/AbstractInterfaceDef_i.h
new file mode 100644
index 00000000000..b753a1afa16
--- /dev/null
+++ b/TAO/orbsvcs/orbsvcs/IFRService/AbstractInterfaceDef_i.h
@@ -0,0 +1,81 @@
+// -*- C++ -*-
+
+// $Id$
+
+// ============================================================================
+//
+// = LIBRARY
+// TAO/orbsvcs/orbsvcs/IFRService
+//
+// = FILENAME
+// AbstractInterfaceDef_i.h
+//
+// = DESCRIPTION
+// AbstractInterfaceDef servant class.
+//
+// = AUTHOR
+// Jeff Parsons <parsons@cs.wustl.edu>
+//
+// ============================================================================
+
+#ifndef TAO_ABSTRACTINTERFACEDEF_I_H
+#define TAO_ABSTRACTINTERFACEDEF_I_H
+
+#include "orbsvcs/IFRService/InterfaceDef_i.h"
+#include "orbsvcs/IFRService/ifr_service_export.h"
+
+#if !defined (ACE_LACKS_PRAGMA_ONCE)
+# pragma once
+#endif /* ACE_LACKS_PRAGMA_ONCE */
+
+#if defined(_MSC_VER)
+#pragma warning(push)
+#pragma warning(disable:4250)
+#endif /* _MSC_VER */
+
+TAO_BEGIN_VERSIONED_NAMESPACE_DECL
+
+class TAO_IFRService_Export TAO_AbstractInterfaceDef_i
+ : public virtual TAO_InterfaceDef_i
+{
+ // = TITLE
+ // TAO_AbstractInterfaceDef_i
+ //
+ // = DESCRIPTION
+ // Represents an abstract interface definition.
+ //
+public:
+ TAO_AbstractInterfaceDef_i (TAO_Repository_i *repo);
+ // Constructor
+
+ virtual ~TAO_AbstractInterfaceDef_i (void);
+ // Destructor
+
+ virtual CORBA::DefinitionKind def_kind (
+ ACE_ENV_SINGLE_ARG_DECL_WITH_DEFAULTS
+ )
+ ACE_THROW_SPEC ((CORBA::SystemException));
+ // Return our definition kind.
+
+ virtual CORBA::Boolean is_a (
+ const char *interface_id
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS
+ )
+ ACE_THROW_SPEC ((CORBA::SystemException));
+
+ CORBA::Boolean is_a_i (
+ const char *interface_id
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS
+ )
+ ACE_THROW_SPEC ((CORBA::SystemException));
+};
+
+TAO_END_VERSIONED_NAMESPACE_DECL
+
+#if defined(_MSC_VER)
+#pragma warning(pop)
+#endif /* _MSC_VER */
+
+#endif /* TAO_ABSTRACTINTERFACEDEF_I_H */
+
+
diff --git a/TAO/orbsvcs/orbsvcs/IFRService/AliasDef_i.cpp b/TAO/orbsvcs/orbsvcs/IFRService/AliasDef_i.cpp
new file mode 100644
index 00000000000..308a637d9ac
--- /dev/null
+++ b/TAO/orbsvcs/orbsvcs/IFRService/AliasDef_i.cpp
@@ -0,0 +1,141 @@
+// $Id$
+
+#include "orbsvcs/IFRService/AliasDef_i.h"
+#include "orbsvcs/IFRService/Repository_i.h"
+#include "orbsvcs/IFRService/IFR_Service_Utils.h"
+#include "ace/Auto_Ptr.h"
+#include "ace/SString.h"
+
+
+ACE_RCSID (IFRService,
+ AliasDef_i,
+ "$Id$")
+
+TAO_BEGIN_VERSIONED_NAMESPACE_DECL
+
+TAO_AliasDef_i::TAO_AliasDef_i (TAO_Repository_i *repo)
+ : TAO_IRObject_i (repo),
+ TAO_Contained_i (repo),
+ TAO_IDLType_i (repo),
+ TAO_TypedefDef_i (repo)
+{
+}
+
+TAO_AliasDef_i::~TAO_AliasDef_i (void)
+{
+}
+
+CORBA::DefinitionKind
+TAO_AliasDef_i::def_kind (ACE_ENV_SINGLE_ARG_DECL_NOT_USED)
+ ACE_THROW_SPEC ((CORBA::SystemException))
+{
+ return CORBA::dk_Alias;
+}
+
+CORBA::TypeCode_ptr
+TAO_AliasDef_i::type (ACE_ENV_SINGLE_ARG_DECL)
+ ACE_THROW_SPEC ((CORBA::SystemException))
+{
+ TAO_IFR_READ_GUARD_RETURN (CORBA::TypeCode::_nil ());
+
+ this->update_key (ACE_ENV_SINGLE_ARG_PARAMETER);
+ ACE_CHECK_RETURN (CORBA::TypeCode::_nil ());
+
+ return this->type_i (ACE_ENV_SINGLE_ARG_PARAMETER);
+}
+
+CORBA::TypeCode_ptr
+TAO_AliasDef_i::type_i (ACE_ENV_SINGLE_ARG_DECL)
+ ACE_THROW_SPEC ((CORBA::SystemException))
+{
+ ACE_TString id;
+ this->repo_->config ()->get_string_value (this->section_key_,
+ "id",
+ id);
+
+ ACE_TString name;
+ this->repo_->config ()->get_string_value (this->section_key_,
+ "name",
+ name);
+
+ ACE_TString original_type;
+ this->repo_->config ()->get_string_value (this->section_key_,
+ "original_type",
+ original_type);
+
+ TAO_IDLType_i *impl =
+ TAO_IFR_Service_Utils::path_to_idltype (original_type,
+ this->repo_);
+ if (0 == impl)
+ {
+ ACE_THROW_RETURN ( CORBA::OBJECT_NOT_EXIST(), CORBA::TypeCode::_nil () );
+ }
+
+ CORBA::TypeCode_var tc = impl->type_i (ACE_ENV_SINGLE_ARG_PARAMETER);
+ ACE_CHECK_RETURN (CORBA::TypeCode::_nil ());
+
+ return this->repo_->tc_factory ()->create_alias_tc (id.c_str (),
+ name.c_str (),
+ tc.in ()
+ ACE_ENV_ARG_PARAMETER);
+}
+
+CORBA::IDLType_ptr
+TAO_AliasDef_i::original_type_def (ACE_ENV_SINGLE_ARG_DECL)
+ ACE_THROW_SPEC ((CORBA::SystemException))
+{
+ TAO_IFR_READ_GUARD_RETURN (CORBA::IDLType::_nil ());
+
+ this->update_key (ACE_ENV_SINGLE_ARG_PARAMETER);
+ ACE_CHECK_RETURN (CORBA::IDLType::_nil ());
+
+ return this->original_type_def_i (ACE_ENV_SINGLE_ARG_PARAMETER);
+}
+
+CORBA::IDLType_ptr
+TAO_AliasDef_i::original_type_def_i (ACE_ENV_SINGLE_ARG_DECL)
+ ACE_THROW_SPEC ((CORBA::SystemException))
+{
+ ACE_TString original_type;
+ this->repo_->config ()->get_string_value (this->section_key_,
+ "original_type",
+ original_type);
+
+ CORBA::Object_var obj =
+ TAO_IFR_Service_Utils::path_to_ir_object (original_type,
+ this->repo_
+ ACE_ENV_ARG_PARAMETER);
+ ACE_CHECK_RETURN (CORBA::IDLType::_nil ());
+
+ return CORBA::IDLType::_narrow (obj.in ()
+ ACE_ENV_ARG_PARAMETER);
+}
+
+void
+TAO_AliasDef_i::original_type_def (CORBA::IDLType_ptr original_type_def
+ ACE_ENV_ARG_DECL)
+ ACE_THROW_SPEC ((CORBA::SystemException))
+{
+ TAO_IFR_WRITE_GUARD;
+
+ this->update_key (ACE_ENV_SINGLE_ARG_PARAMETER);
+ ACE_CHECK;
+
+ this->original_type_def_i (original_type_def
+ ACE_ENV_ARG_PARAMETER);
+}
+
+void
+TAO_AliasDef_i::original_type_def_i (CORBA::IDLType_ptr original_type_def
+ ACE_ENV_ARG_DECL_NOT_USED)
+ ACE_THROW_SPEC ((CORBA::SystemException))
+{
+ char *original_type =
+ TAO_IFR_Service_Utils::reference_to_path (original_type_def);
+
+ this->repo_->config ()->set_string_value (this->section_key_,
+ "original_type",
+ original_type);
+}
+
+TAO_END_VERSIONED_NAMESPACE_DECL
diff --git a/TAO/orbsvcs/orbsvcs/IFRService/AliasDef_i.h b/TAO/orbsvcs/orbsvcs/IFRService/AliasDef_i.h
new file mode 100644
index 00000000000..7cc9c8826ca
--- /dev/null
+++ b/TAO/orbsvcs/orbsvcs/IFRService/AliasDef_i.h
@@ -0,0 +1,101 @@
+// -*- C++ -*-
+
+// $Id$
+
+// ============================================================================
+//
+// = LIBRARY
+// TAO/orbsvcs/orbsvcs/IFRService
+//
+// = FILENAME
+// AliasDef_i.h
+//
+// = DESCRIPTION
+// AliasDef servant class.
+//
+// = AUTHOR
+// Jeff Parsons <parsons@cs.wustl.edu>
+//
+// ============================================================================
+
+#ifndef TAO_ALIASDEF_I_H
+#define TAO_ALIASDEF_I_H
+
+#include "orbsvcs/IFRService/TypedefDef_i.h"
+#include "orbsvcs/IFRService/ifr_service_export.h"
+
+#if !defined (ACE_LACKS_PRAGMA_ONCE)
+# pragma once
+#endif /* ACE_LACKS_PRAGMA_ONCE */
+
+#if defined(_MSC_VER)
+#pragma warning(push)
+#pragma warning(disable:4250)
+#endif /* _MSC_VER */
+
+TAO_BEGIN_VERSIONED_NAMESPACE_DECL
+
+class TAO_IFRService_Export TAO_AliasDef_i : public virtual TAO_TypedefDef_i
+{
+public:
+ // = TITLE
+ // TAO_AliasDef_i
+ //
+ // = DESCRIPTION
+ // Represents an OMG IDL typedef that aliases another definition.
+ //
+public:
+ TAO_AliasDef_i (TAO_Repository_i *repo);
+ // Constructor
+
+ virtual ~TAO_AliasDef_i (void);
+ // Destructor
+
+ virtual CORBA::DefinitionKind def_kind (
+ ACE_ENV_SINGLE_ARG_DECL_WITH_DEFAULTS)
+
+ ACE_THROW_SPEC ((CORBA::SystemException));
+ // Return our definition kind.
+
+ virtual CORBA::TypeCode_ptr type (
+ ACE_ENV_SINGLE_ARG_DECL_WITH_DEFAULTS)
+
+ ACE_THROW_SPEC ((CORBA::SystemException));
+ // From IDLType_i's pure virtual function.
+
+ virtual CORBA::TypeCode_ptr type_i (
+ ACE_ENV_SINGLE_ARG_DECL_WITH_DEFAULTS)
+
+ ACE_THROW_SPEC ((CORBA::SystemException));
+ // From IDLType_i's pure virtual function.
+
+ virtual CORBA::IDLType_ptr original_type_def (
+ ACE_ENV_SINGLE_ARG_DECL_WITH_DEFAULTS)
+
+ ACE_THROW_SPEC ((CORBA::SystemException));
+
+ CORBA::IDLType_ptr original_type_def_i (
+ ACE_ENV_SINGLE_ARG_DECL_WITH_DEFAULTS)
+
+ ACE_THROW_SPEC ((CORBA::SystemException));
+
+ virtual void original_type_def (
+ CORBA::IDLType_ptr original_type_def
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS)
+
+ ACE_THROW_SPEC ((CORBA::SystemException));
+
+ void original_type_def_i (
+ CORBA::IDLType_ptr original_type_def
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS)
+
+ ACE_THROW_SPEC ((CORBA::SystemException));
+};
+
+TAO_END_VERSIONED_NAMESPACE_DECL
+
+#if defined(_MSC_VER)
+#pragma warning(pop)
+#endif /* _MSC_VER */
+
+#endif /* TAO_ALIASDEF_I_H */
diff --git a/TAO/orbsvcs/orbsvcs/IFRService/ArrayDef_i.cpp b/TAO/orbsvcs/orbsvcs/IFRService/ArrayDef_i.cpp
new file mode 100644
index 00000000000..70022598977
--- /dev/null
+++ b/TAO/orbsvcs/orbsvcs/IFRService/ArrayDef_i.cpp
@@ -0,0 +1,279 @@
+// $Id$
+
+#include "orbsvcs/IFRService/ArrayDef_i.h"
+#include "orbsvcs/IFRService/Repository_i.h"
+#include "orbsvcs/IFRService/IFR_Service_Utils.h"
+#include "ace/Auto_Ptr.h"
+#include "ace/SString.h"
+
+
+ACE_RCSID (IFRService,
+ ArrayDef_i,
+ "$Id$")
+
+TAO_BEGIN_VERSIONED_NAMESPACE_DECL
+
+TAO_ArrayDef_i::TAO_ArrayDef_i (TAO_Repository_i *repo)
+ : TAO_IRObject_i (repo),
+ TAO_IDLType_i (repo)
+{
+}
+
+TAO_ArrayDef_i::~TAO_ArrayDef_i (void)
+{
+}
+
+CORBA::DefinitionKind
+TAO_ArrayDef_i::def_kind (ACE_ENV_SINGLE_ARG_DECL_NOT_USED)
+ ACE_THROW_SPEC ((CORBA::SystemException))
+{
+ return CORBA::dk_Array;
+}
+
+void
+TAO_ArrayDef_i::destroy (ACE_ENV_SINGLE_ARG_DECL)
+ ACE_THROW_SPEC ((CORBA::SystemException))
+{
+ TAO_IFR_WRITE_GUARD;
+
+ this->update_key (ACE_ENV_SINGLE_ARG_PARAMETER);
+ ACE_CHECK;
+
+ this->destroy_i (ACE_ENV_SINGLE_ARG_PARAMETER);
+}
+
+void
+TAO_ArrayDef_i::destroy_i (ACE_ENV_SINGLE_ARG_DECL)
+ ACE_THROW_SPEC ((CORBA::SystemException))
+{
+ // Only if it is (w)string, fixed, array or sequence.
+ this->destroy_element_type (ACE_ENV_SINGLE_ARG_PARAMETER);
+ ACE_CHECK;
+
+ ACE_TString name;
+ this->repo_->config ()->get_string_value (this->section_key_,
+ "name",
+ name);
+
+ this->repo_->config ()->remove_section (this->repo_->arrays_key (),
+ name.c_str (),
+ 0);
+}
+
+CORBA::TypeCode_ptr
+TAO_ArrayDef_i::type (ACE_ENV_SINGLE_ARG_DECL)
+ ACE_THROW_SPEC ((CORBA::SystemException))
+{
+ TAO_IFR_READ_GUARD_RETURN (CORBA::TypeCode::_nil ());
+
+ this->update_key (ACE_ENV_SINGLE_ARG_PARAMETER);
+ ACE_CHECK_RETURN (CORBA::TypeCode::_nil ());
+
+ return this->type_i (ACE_ENV_SINGLE_ARG_PARAMETER);
+}
+
+CORBA::TypeCode_ptr
+TAO_ArrayDef_i::type_i (ACE_ENV_SINGLE_ARG_DECL)
+ ACE_THROW_SPEC ((CORBA::SystemException))
+{
+ CORBA::TypeCode_var element_typecode =
+ this->element_type_i (ACE_ENV_SINGLE_ARG_PARAMETER);
+ ACE_CHECK_RETURN (CORBA::TypeCode::_nil ());
+
+ CORBA::ULong length = this->length_i (ACE_ENV_SINGLE_ARG_PARAMETER);
+ ACE_CHECK_RETURN (CORBA::TypeCode::_nil ());
+
+ return this->repo_->tc_factory ()->create_array_tc (
+ length,
+ element_typecode.in ()
+ ACE_ENV_ARG_PARAMETER
+ );
+}
+
+CORBA::ULong
+TAO_ArrayDef_i::length (ACE_ENV_SINGLE_ARG_DECL)
+ ACE_THROW_SPEC ((CORBA::SystemException))
+{
+ TAO_IFR_READ_GUARD_RETURN (0);
+
+ this->update_key (ACE_ENV_SINGLE_ARG_PARAMETER);
+ ACE_CHECK_RETURN (0);
+
+ return this->length_i (ACE_ENV_SINGLE_ARG_PARAMETER);
+}
+
+CORBA::ULong
+TAO_ArrayDef_i::length_i (ACE_ENV_SINGLE_ARG_DECL_NOT_USED)
+ ACE_THROW_SPEC ((CORBA::SystemException))
+{
+ u_int length = 0;
+ this->repo_->config ()->get_integer_value (this->section_key_,
+ "length",
+ length);
+
+ return static_cast<CORBA::ULong> (length);
+}
+
+void
+TAO_ArrayDef_i::length (CORBA::ULong length
+ ACE_ENV_ARG_DECL)
+ ACE_THROW_SPEC ((CORBA::SystemException))
+{
+ TAO_IFR_WRITE_GUARD;
+
+ this->update_key (ACE_ENV_SINGLE_ARG_PARAMETER);
+ ACE_CHECK;
+
+ this->length_i (length
+ ACE_ENV_ARG_PARAMETER);
+}
+
+void
+TAO_ArrayDef_i::length_i (CORBA::ULong length
+ ACE_ENV_ARG_DECL_NOT_USED)
+ ACE_THROW_SPEC ((CORBA::SystemException))
+{
+ this->repo_->config ()->set_integer_value (this->section_key_,
+ "length",
+ length);
+}
+
+CORBA::TypeCode_ptr
+TAO_ArrayDef_i::element_type (ACE_ENV_SINGLE_ARG_DECL)
+ ACE_THROW_SPEC ((CORBA::SystemException))
+{
+ TAO_IFR_READ_GUARD_RETURN (CORBA::TypeCode::_nil ());
+
+ this->update_key (ACE_ENV_SINGLE_ARG_PARAMETER);
+ ACE_CHECK_RETURN (CORBA::TypeCode::_nil ());
+
+ return this->element_type_i (ACE_ENV_SINGLE_ARG_PARAMETER);
+}
+
+CORBA::TypeCode_ptr
+TAO_ArrayDef_i::element_type_i (ACE_ENV_SINGLE_ARG_DECL)
+ ACE_THROW_SPEC ((CORBA::SystemException))
+{
+ ACE_TString element_path;
+ this->repo_->config ()->get_string_value (this->section_key_,
+ "element_path",
+ element_path);
+ TAO_IDLType_i *impl =
+ TAO_IFR_Service_Utils::path_to_idltype (element_path,
+ this->repo_);
+
+ return impl->type_i (ACE_ENV_SINGLE_ARG_PARAMETER);
+}
+
+CORBA::IDLType_ptr
+TAO_ArrayDef_i::element_type_def (ACE_ENV_SINGLE_ARG_DECL)
+ ACE_THROW_SPEC ((CORBA::SystemException))
+{
+ TAO_IFR_READ_GUARD_RETURN (CORBA::IDLType::_nil ());
+
+ this->update_key (ACE_ENV_SINGLE_ARG_PARAMETER);
+ ACE_CHECK_RETURN (CORBA::IDLType::_nil ());
+
+ return this->element_type_def_i (ACE_ENV_SINGLE_ARG_PARAMETER);
+}
+
+CORBA::IDLType_ptr
+TAO_ArrayDef_i::element_type_def_i (ACE_ENV_SINGLE_ARG_DECL)
+ ACE_THROW_SPEC ((CORBA::SystemException))
+{
+ ACE_TString element_path;
+ this->repo_->config ()->get_string_value (this->section_key_,
+ "element_path",
+ element_path);
+
+ CORBA::Object_var obj =
+ TAO_IFR_Service_Utils::path_to_ir_object (element_path,
+ this->repo_
+ ACE_ENV_ARG_PARAMETER);
+ ACE_CHECK_RETURN (CORBA::IDLType::_nil ());
+
+ return CORBA::IDLType::_narrow (obj.in ()
+ ACE_ENV_ARG_PARAMETER);
+}
+
+void
+TAO_ArrayDef_i::element_type_def (CORBA::IDLType_ptr element_type_def
+ ACE_ENV_ARG_DECL)
+ ACE_THROW_SPEC ((CORBA::SystemException))
+{
+ TAO_IFR_WRITE_GUARD;
+
+ this->update_key (ACE_ENV_SINGLE_ARG_PARAMETER);
+ ACE_CHECK;
+
+ this->element_type_def_i (element_type_def
+ ACE_ENV_ARG_PARAMETER);
+}
+
+void
+TAO_ArrayDef_i::element_type_def_i (CORBA::IDLType_ptr element_type_def
+ ACE_ENV_ARG_DECL)
+ ACE_THROW_SPEC ((CORBA::SystemException))
+{
+ this->destroy_element_type (ACE_ENV_SINGLE_ARG_PARAMETER);
+ ACE_CHECK;
+
+ char *new_element_path =
+ TAO_IFR_Service_Utils::reference_to_path (element_type_def);
+
+ this->repo_->config ()->set_string_value (this->section_key_,
+ "element_path",
+ new_element_path);
+}
+
+void
+TAO_ArrayDef_i::destroy_element_type (
+ ACE_ENV_SINGLE_ARG_DECL
+ )
+ ACE_THROW_SPEC ((CORBA::SystemException))
+{
+ ACE_TString element_path;
+ this->repo_->config ()->get_string_value (this->section_key_,
+ "element_path",
+ element_path);
+
+ ACE_Configuration_Section_Key element_key;
+ this->repo_->config ()->expand_path (this->repo_->root_key (),
+ element_path,
+ element_key,
+ 0);
+
+ u_int kind = 0;
+ this->repo_->config ()->get_integer_value (element_key,
+ "def_kind",
+ kind);
+
+ CORBA::DefinitionKind def_kind =
+ TAO_IFR_Service_Utils::path_to_def_kind (element_path,
+ this->repo_);
+
+ switch (def_kind)
+ {
+ // These exist only as our elements, so the type should
+ // be destroyed when we are destroyed, or when our element type
+ // is mutated.
+ case CORBA::dk_String:
+ case CORBA::dk_Wstring:
+ case CORBA::dk_Fixed:
+ case CORBA::dk_Array:
+ case CORBA::dk_Sequence:
+ {
+ TAO_IDLType_i *impl = this->repo_->select_idltype (def_kind);
+ impl->section_key (element_key);
+
+ impl->destroy_i (ACE_ENV_SINGLE_ARG_PARAMETER);
+ ACE_CHECK;
+
+ break;
+ }
+ default:
+ break;
+ }
+}
+
+TAO_END_VERSIONED_NAMESPACE_DECL
diff --git a/TAO/orbsvcs/orbsvcs/IFRService/ArrayDef_i.h b/TAO/orbsvcs/orbsvcs/IFRService/ArrayDef_i.h
new file mode 100644
index 00000000000..ec0d6966f8d
--- /dev/null
+++ b/TAO/orbsvcs/orbsvcs/IFRService/ArrayDef_i.h
@@ -0,0 +1,148 @@
+// -*- C++ -*-
+
+// $Id$
+
+// ============================================================================
+//
+// = LIBRARY
+// TAO/orbsvcs/orbsvcs/IFRService
+//
+// = FILENAME
+// ArrayDef_i.h
+//
+// = DESCRIPTION
+// ArrayDef servant class.
+//
+// = AUTHOR
+// Jeff Parsons <parsons@cs.wustl.edu>
+//
+// ============================================================================
+
+#ifndef TAO_ARRAYDEF_I_H
+#define TAO_ARRAYDEF_I_H
+
+#include "orbsvcs/IFRService/IDLType_i.h"
+#include "orbsvcs/IFRService/ifr_service_export.h"
+
+#if !defined (ACE_LACKS_PRAGMA_ONCE)
+# pragma once
+#endif /* ACE_LACKS_PRAGMA_ONCE */
+
+#if defined(_MSC_VER)
+#pragma warning(push)
+#pragma warning(disable:4250)
+#endif /* _MSC_VER */
+
+TAO_BEGIN_VERSIONED_NAMESPACE_DECL
+
+class TAO_IFRService_Export TAO_ArrayDef_i : public virtual TAO_IDLType_i
+{
+ // = TITLE
+ // TAO_ArrayDef_i
+ //
+ // = DESCRIPTION
+ // Represents an IDL array type.
+ //
+public:
+ TAO_ArrayDef_i (TAO_Repository_i *repo);
+ // Constructor
+
+ virtual ~TAO_ArrayDef_i (void);
+ // Destructor
+
+ virtual CORBA::DefinitionKind def_kind (
+ ACE_ENV_SINGLE_ARG_DECL_WITH_DEFAULTS)
+
+ ACE_THROW_SPEC ((CORBA::SystemException));
+ // Return our definition kind.
+
+ virtual void destroy (
+ ACE_ENV_SINGLE_ARG_DECL_WITH_DEFAULTS)
+
+ ACE_THROW_SPEC ((CORBA::SystemException));
+ // Remove the repository entry.
+
+ virtual void destroy_i (
+ ACE_ENV_SINGLE_ARG_DECL_WITH_DEFAULTS)
+
+ ACE_THROW_SPEC ((CORBA::SystemException));
+
+ virtual CORBA::TypeCode_ptr type (
+ ACE_ENV_SINGLE_ARG_DECL_WITH_DEFAULTS)
+
+ ACE_THROW_SPEC ((CORBA::SystemException));
+
+ virtual CORBA::TypeCode_ptr type_i (
+ ACE_ENV_SINGLE_ARG_DECL_WITH_DEFAULTS)
+
+ ACE_THROW_SPEC ((CORBA::SystemException));
+
+ virtual CORBA::ULong length (
+ ACE_ENV_SINGLE_ARG_DECL_WITH_DEFAULTS)
+
+ ACE_THROW_SPEC ((CORBA::SystemException));
+
+ CORBA::ULong length_i (
+ ACE_ENV_SINGLE_ARG_DECL_WITH_DEFAULTS)
+
+ ACE_THROW_SPEC ((CORBA::SystemException));
+
+ virtual void length (
+ CORBA::ULong length
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS)
+
+ ACE_THROW_SPEC ((CORBA::SystemException));
+
+ void length_i (
+ CORBA::ULong length
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS)
+
+ ACE_THROW_SPEC ((CORBA::SystemException));
+
+ virtual CORBA::TypeCode_ptr element_type (
+ ACE_ENV_SINGLE_ARG_DECL_WITH_DEFAULTS)
+
+ ACE_THROW_SPEC ((CORBA::SystemException));
+
+ CORBA::TypeCode_ptr element_type_i (
+ ACE_ENV_SINGLE_ARG_DECL_WITH_DEFAULTS)
+
+ ACE_THROW_SPEC ((CORBA::SystemException));
+
+ virtual CORBA::IDLType_ptr element_type_def (
+ ACE_ENV_SINGLE_ARG_DECL_WITH_DEFAULTS)
+
+ ACE_THROW_SPEC ((CORBA::SystemException));
+
+ CORBA::IDLType_ptr element_type_def_i (
+ ACE_ENV_SINGLE_ARG_DECL_WITH_DEFAULTS)
+
+ ACE_THROW_SPEC ((CORBA::SystemException));
+
+ virtual void element_type_def (
+ CORBA::IDLType_ptr element_type_def
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS)
+
+ ACE_THROW_SPEC ((CORBA::SystemException));
+
+ void element_type_def_i (
+ CORBA::IDLType_ptr element_type_def
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS)
+
+ ACE_THROW_SPEC ((CORBA::SystemException));
+
+private:
+ void destroy_element_type (
+ ACE_ENV_SINGLE_ARG_DECL_WITH_DEFAULTS)
+
+ ACE_THROW_SPEC ((CORBA::SystemException));
+ // Destroys an anonymous non-primitive element type.
+};
+
+TAO_END_VERSIONED_NAMESPACE_DECL
+
+#if defined(_MSC_VER)
+#pragma warning(pop)
+#endif /* _MSC_VER */
+
+#endif /* TAO_ARRAYDEF_I_H */
diff --git a/TAO/orbsvcs/orbsvcs/IFRService/AttributeDef_i.cpp b/TAO/orbsvcs/orbsvcs/IFRService/AttributeDef_i.cpp
new file mode 100644
index 00000000000..0d9ce3b6a42
--- /dev/null
+++ b/TAO/orbsvcs/orbsvcs/IFRService/AttributeDef_i.cpp
@@ -0,0 +1,397 @@
+// $Id$
+
+#include "orbsvcs/IFRService/AttributeDef_i.h"
+#include "orbsvcs/IFRService/Repository_i.h"
+#include "orbsvcs/IFRService/IDLType_i.h"
+#include "orbsvcs/IFRService/ExceptionDef_i.h"
+#include "orbsvcs/IFRService/IFR_Service_Utils.h"
+#include "ace/Auto_Ptr.h"
+#include "ace/SString.h"
+
+
+ACE_RCSID (IFRService,
+ AttributeDef_i,
+ "$Id$")
+
+TAO_BEGIN_VERSIONED_NAMESPACE_DECL
+
+TAO_AttributeDef_i::TAO_AttributeDef_i (
+ TAO_Repository_i *repo
+ )
+ : TAO_IRObject_i (repo),
+ TAO_Contained_i (repo)
+{
+}
+
+TAO_AttributeDef_i::~TAO_AttributeDef_i (void)
+{
+}
+
+CORBA::DefinitionKind
+TAO_AttributeDef_i::def_kind (ACE_ENV_SINGLE_ARG_DECL_NOT_USED)
+ ACE_THROW_SPEC ((CORBA::SystemException))
+{
+ return CORBA::dk_Attribute;
+}
+
+CORBA::Contained::Description *
+TAO_AttributeDef_i::describe (ACE_ENV_SINGLE_ARG_DECL)
+ ACE_THROW_SPEC ((CORBA::SystemException))
+{
+ TAO_IFR_READ_GUARD_RETURN (0);
+
+ this->update_key (ACE_ENV_SINGLE_ARG_PARAMETER);
+ ACE_CHECK_RETURN (0);
+
+ return this->describe_i (ACE_ENV_SINGLE_ARG_PARAMETER);
+}
+
+CORBA::Contained::Description *
+TAO_AttributeDef_i::describe_i (ACE_ENV_SINGLE_ARG_DECL)
+ ACE_THROW_SPEC ((CORBA::SystemException))
+{
+ CORBA::Contained::Description *desc_ptr = 0;
+ ACE_NEW_THROW_EX (desc_ptr,
+ CORBA::Contained::Description,
+ CORBA::NO_MEMORY ());
+ ACE_CHECK_RETURN (0);
+
+ CORBA::Contained::Description_var retval = desc_ptr;
+
+ retval->kind = CORBA::dk_Attribute;
+
+ CORBA::AttributeDescription *ad = 0;
+ ACE_NEW_RETURN (ad,
+ CORBA::AttributeDescription,
+ 0);
+
+ this->make_description (*ad
+ ACE_ENV_ARG_PARAMETER);
+ ACE_CHECK_RETURN (0);
+
+ retval->value <<= ad;
+ return retval._retn ();
+}
+
+CORBA::TypeCode_ptr
+TAO_AttributeDef_i::type (ACE_ENV_SINGLE_ARG_DECL)
+ ACE_THROW_SPEC ((CORBA::SystemException))
+{
+ TAO_IFR_READ_GUARD_RETURN (CORBA::TypeCode::_nil ());
+
+ this->update_key (ACE_ENV_SINGLE_ARG_PARAMETER);
+ ACE_CHECK_RETURN (CORBA::TypeCode::_nil ());
+
+ return this->type_i (ACE_ENV_SINGLE_ARG_PARAMETER);
+}
+
+CORBA::TypeCode_ptr
+TAO_AttributeDef_i::type_i (ACE_ENV_SINGLE_ARG_DECL)
+ ACE_THROW_SPEC ((CORBA::SystemException))
+{
+ ACE_TString type_path;
+ this->repo_->config ()->get_string_value (this->section_key_,
+ "type_path",
+ type_path);
+
+ TAO_IDLType_i *impl =
+ TAO_IFR_Service_Utils::path_to_idltype (type_path,
+ this->repo_);
+
+ return impl->type_i (ACE_ENV_SINGLE_ARG_PARAMETER);
+}
+
+CORBA::IDLType_ptr
+TAO_AttributeDef_i::type_def (ACE_ENV_SINGLE_ARG_DECL)
+ ACE_THROW_SPEC ((CORBA::SystemException))
+{
+ TAO_IFR_READ_GUARD_RETURN (CORBA::IDLType::_nil ());
+
+ this->update_key (ACE_ENV_SINGLE_ARG_PARAMETER);
+ ACE_CHECK_RETURN (CORBA::IDLType::_nil ());
+
+ return this->type_def_i (ACE_ENV_SINGLE_ARG_PARAMETER);
+}
+
+CORBA::IDLType_ptr
+TAO_AttributeDef_i::type_def_i (ACE_ENV_SINGLE_ARG_DECL)
+ ACE_THROW_SPEC ((CORBA::SystemException))
+{
+ ACE_TString type_path;
+ this->repo_->config ()->get_string_value (this->section_key_,
+ "type_path",
+ type_path);
+
+ CORBA::Object_var obj =
+ TAO_IFR_Service_Utils::path_to_ir_object (type_path,
+ this->repo_
+ ACE_ENV_ARG_PARAMETER);
+ ACE_CHECK_RETURN (CORBA::IDLType::_nil ());
+
+ CORBA::IDLType_var retval = CORBA::IDLType::_narrow (obj.in ()
+ ACE_ENV_ARG_PARAMETER);
+ ACE_CHECK_RETURN (CORBA::IDLType::_nil ());
+
+ return retval._retn ();
+}
+
+void
+TAO_AttributeDef_i::type_def (CORBA::IDLType_ptr type_def
+ ACE_ENV_ARG_DECL)
+ ACE_THROW_SPEC ((CORBA::SystemException))
+{
+ TAO_IFR_WRITE_GUARD;
+
+ this->update_key (ACE_ENV_SINGLE_ARG_PARAMETER);
+ ACE_CHECK;
+
+ this->type_def_i (type_def
+ ACE_ENV_ARG_PARAMETER);
+}
+
+void
+TAO_AttributeDef_i::type_def_i (CORBA::IDLType_ptr type_def
+ ACE_ENV_ARG_DECL_NOT_USED)
+ ACE_THROW_SPEC ((CORBA::SystemException))
+{
+ char *type_path =
+ TAO_IFR_Service_Utils::reference_to_path (type_def);
+
+ this->repo_->config ()->set_string_value (this->section_key_,
+ "type_path",
+ type_path);
+}
+
+CORBA::AttributeMode
+TAO_AttributeDef_i::mode (ACE_ENV_SINGLE_ARG_DECL)
+ ACE_THROW_SPEC ((CORBA::SystemException))
+{
+ TAO_IFR_READ_GUARD_RETURN (CORBA::ATTR_NORMAL);
+
+ this->update_key (ACE_ENV_SINGLE_ARG_PARAMETER);
+ ACE_CHECK_RETURN (CORBA::ATTR_NORMAL);
+
+ return this->mode_i (ACE_ENV_SINGLE_ARG_PARAMETER);
+}
+
+CORBA::AttributeMode
+TAO_AttributeDef_i::mode_i (ACE_ENV_SINGLE_ARG_DECL_NOT_USED)
+ ACE_THROW_SPEC ((CORBA::SystemException))
+{
+ u_int mode = 0;
+ this->repo_->config ()->get_integer_value (this->section_key_,
+ "mode",
+ mode);
+
+ return static_cast<CORBA::AttributeMode> (mode);
+}
+
+void
+TAO_AttributeDef_i::mode (CORBA::AttributeMode mode
+ ACE_ENV_ARG_DECL)
+ ACE_THROW_SPEC ((CORBA::SystemException))
+{
+ TAO_IFR_WRITE_GUARD;
+
+ this->update_key (ACE_ENV_SINGLE_ARG_PARAMETER);
+ ACE_CHECK;
+
+ this->mode_i (mode
+ ACE_ENV_ARG_PARAMETER);
+}
+
+void
+TAO_AttributeDef_i::mode_i (CORBA::AttributeMode mode
+ ACE_ENV_ARG_DECL_NOT_USED)
+ ACE_THROW_SPEC ((CORBA::SystemException))
+{
+ this->repo_->config ()->set_integer_value (this->section_key_,
+ "mode",
+ mode);
+}
+
+void
+TAO_AttributeDef_i::make_description (
+ CORBA::AttributeDescription &ad
+ ACE_ENV_ARG_DECL
+ )
+ ACE_THROW_SPEC ((CORBA::SystemException))
+{
+ ad.name = this->name_i (ACE_ENV_SINGLE_ARG_PARAMETER);
+ ACE_CHECK;
+
+ ad.id = this->id_i (ACE_ENV_SINGLE_ARG_PARAMETER);
+ ACE_CHECK;
+
+ ACE_TString container_id;
+ this->repo_->config ()->get_string_value (this->section_key_,
+ "container_id",
+ container_id);
+
+ ad.defined_in = container_id.c_str ();
+
+ ad.version = this->version_i (ACE_ENV_SINGLE_ARG_PARAMETER);
+ ACE_CHECK;
+
+ ad.type = this->type_i (ACE_ENV_SINGLE_ARG_PARAMETER);
+ ACE_CHECK;
+
+ ad.mode = this->mode_i (ACE_ENV_SINGLE_ARG_PARAMETER);
+ ACE_CHECK;
+}
+
+CORBA::ExceptionDefSeq *
+TAO_AttributeDef_i::get_exceptions (ACE_ENV_SINGLE_ARG_DECL)
+ ACE_THROW_SPEC ((CORBA::SystemException))
+{
+ ACE_Unbounded_Queue<ACE_TString> path_queue;
+ int index = 0;
+ ACE_Configuration::VALUETYPE type;
+ ACE_TString field_name;
+
+ ACE_Configuration_Section_Key get_excepts_key;
+ int status =
+ this->repo_->config ()->open_section (this->section_key_,
+ "get_excepts",
+ 0,
+ get_excepts_key);
+
+ // This section may not have been created.
+ if (status == 0)
+ {
+ ACE_TString get_except_path;
+ ACE_Configuration_Section_Key dummy;
+
+ while (this->repo_->config ()->enumerate_values (get_excepts_key,
+ index++,
+ field_name,
+ type)
+ == 0)
+ {
+ this->repo_->config ()->get_string_value (get_excepts_key,
+ field_name.c_str (),
+ get_except_path);
+
+ // This exception may have been destroyed
+ status =
+ this->repo_->config ()->expand_path (this->repo_->root_key (),
+ get_except_path,
+ dummy,
+ 0);
+
+ if (status == 0)
+ {
+ path_queue.enqueue_tail (get_except_path);
+ }
+ }
+ }
+
+ CORBA::ULong size = static_cast<CORBA::ULong> (path_queue.size ());
+
+ CORBA::ExceptionDefSeq *get_ed_seq = 0;
+ ACE_NEW_THROW_EX (get_ed_seq,
+ CORBA::ExceptionDefSeq (size),
+ CORBA::NO_MEMORY ());
+ ACE_CHECK_RETURN (0);
+
+ get_ed_seq->length (size);
+ CORBA::ExceptionDefSeq_var retval = get_ed_seq;
+
+ for (CORBA::ULong i = 0; i < size; ++i)
+ {
+ ACE_TString path;
+ path_queue.dequeue_head (path);
+
+ CORBA::Object_var obj =
+ TAO_IFR_Service_Utils::create_objref (CORBA::dk_Exception,
+ path.c_str (),
+ this->repo_
+ ACE_ENV_ARG_PARAMETER);
+ ACE_CHECK_RETURN (0);
+
+ retval[i] = CORBA::ExceptionDef::_narrow (obj.in ()
+ ACE_ENV_ARG_PARAMETER);
+ ACE_CHECK_RETURN (0);
+ }
+
+ return retval._retn ();
+}
+
+CORBA::ExceptionDefSeq *
+TAO_AttributeDef_i::put_exceptions (ACE_ENV_SINGLE_ARG_DECL)
+ ACE_THROW_SPEC ((CORBA::SystemException))
+{
+ ACE_Unbounded_Queue<ACE_TString> path_queue;
+ int index = 0;
+ ACE_Configuration::VALUETYPE type;
+ ACE_TString field_name;
+
+ ACE_Configuration_Section_Key put_excepts_key;
+ int status =
+ this->repo_->config ()->open_section (this->section_key_,
+ "put_excepts",
+ 0,
+ put_excepts_key);
+
+ // This section may not have been created.
+ if (status == 0)
+ {
+ ACE_TString put_except_path;
+ ACE_Configuration_Section_Key dummy;
+
+ while (this->repo_->config ()->enumerate_values (put_excepts_key,
+ index++,
+ field_name,
+ type)
+ == 0)
+ {
+ this->repo_->config ()->get_string_value (put_excepts_key,
+ field_name.c_str (),
+ put_except_path);
+
+ // This exception may have been destroyed
+ status =
+ this->repo_->config ()->expand_path (this->repo_->root_key (),
+ put_except_path,
+ dummy,
+ 0);
+
+ if (status == 0)
+ {
+ path_queue.enqueue_tail (put_except_path);
+ }
+ }
+ }
+
+ CORBA::ULong size = static_cast<CORBA::ULong> (path_queue.size ());
+
+ CORBA::ExceptionDefSeq *put_ed_seq = 0;
+ ACE_NEW_THROW_EX (put_ed_seq,
+ CORBA::ExceptionDefSeq (size),
+ CORBA::NO_MEMORY ());
+ ACE_CHECK_RETURN (0);
+
+ put_ed_seq->length (size);
+ CORBA::ExceptionDefSeq_var retval = put_ed_seq;
+
+ for (CORBA::ULong i = 0; i < size; ++i)
+ {
+ ACE_TString path;
+ path_queue.dequeue_head (path);
+
+ CORBA::Object_var obj =
+ TAO_IFR_Service_Utils::create_objref (CORBA::dk_Exception,
+ path.c_str (),
+ this->repo_
+ ACE_ENV_ARG_PARAMETER);
+ ACE_CHECK_RETURN (0);
+
+ retval[i] = CORBA::ExceptionDef::_narrow (obj.in ()
+ ACE_ENV_ARG_PARAMETER);
+ ACE_CHECK_RETURN (0);
+ }
+
+ return retval._retn ();
+}
+
+TAO_END_VERSIONED_NAMESPACE_DECL
diff --git a/TAO/orbsvcs/orbsvcs/IFRService/AttributeDef_i.h b/TAO/orbsvcs/orbsvcs/IFRService/AttributeDef_i.h
new file mode 100644
index 00000000000..d08b3dfa119
--- /dev/null
+++ b/TAO/orbsvcs/orbsvcs/IFRService/AttributeDef_i.h
@@ -0,0 +1,152 @@
+// -*- C++ -*-
+
+// $Id$
+
+// ============================================================================
+//
+// = LIBRARY
+// TAO/orbsvcs/orbsvcs/IFRService
+//
+// = FILENAME
+// AttributeDef_i.h
+//
+// = DESCRIPTION
+// AttributeDef servant class.
+//
+// = AUTHOR
+// Jeff Parsons <parsons@cs.wustl.edu>
+//
+// ============================================================================
+
+#ifndef TAO_ATTRIBUTEDEF_I_H
+#define TAO_ATTRIBUTEDEF_I_H
+
+#include "orbsvcs/IFRService/Contained_i.h"
+#include "orbsvcs/IFRService/ifr_service_export.h"
+
+#if !defined (ACE_LACKS_PRAGMA_ONCE)
+# pragma once
+#endif /* ACE_LACKS_PRAGMA_ONCE */
+
+#if defined(_MSC_VER)
+#pragma warning(push)
+#pragma warning(disable:4250)
+#endif /* _MSC_VER */
+
+TAO_BEGIN_VERSIONED_NAMESPACE_DECL
+
+class TAO_IFRService_Export TAO_AttributeDef_i : public virtual TAO_Contained_i
+{
+ // = TITLE
+ // TAO_AttributeDef_i
+ //
+ // = DESCRIPTION
+ // Represents the information that describes an attribute
+ // of an interface.
+ //
+public:
+ TAO_AttributeDef_i (TAO_Repository_i *repo);
+ // Constructor
+
+ virtual ~TAO_AttributeDef_i (void);
+ // Destructor
+
+ virtual CORBA::DefinitionKind def_kind (
+ ACE_ENV_SINGLE_ARG_DECL_WITH_DEFAULTS
+ )
+ ACE_THROW_SPEC ((CORBA::SystemException));
+ // Return our definition kind.
+
+ virtual CORBA::Contained::Description *describe (
+ ACE_ENV_SINGLE_ARG_DECL_WITH_DEFAULTS
+ )
+ ACE_THROW_SPEC ((CORBA::SystemException));
+ // From Contained_i's pure virtual function.
+
+ virtual CORBA::Contained::Description *describe_i (
+ ACE_ENV_SINGLE_ARG_DECL_WITH_DEFAULTS
+ )
+ ACE_THROW_SPEC ((CORBA::SystemException));
+ // From Contained_i's pure virtual function.
+
+ virtual CORBA::TypeCode_ptr type (
+ ACE_ENV_SINGLE_ARG_DECL_WITH_DEFAULTS
+ )
+ ACE_THROW_SPEC ((CORBA::SystemException));
+
+ CORBA::TypeCode_ptr type_i (
+ ACE_ENV_SINGLE_ARG_DECL_WITH_DEFAULTS
+ )
+ ACE_THROW_SPEC ((CORBA::SystemException));
+
+ virtual CORBA::IDLType_ptr type_def (
+ ACE_ENV_SINGLE_ARG_DECL_WITH_DEFAULTS
+ )
+ ACE_THROW_SPEC ((CORBA::SystemException));
+
+ CORBA::IDLType_ptr type_def_i (
+ ACE_ENV_SINGLE_ARG_DECL_WITH_DEFAULTS
+ )
+ ACE_THROW_SPEC ((CORBA::SystemException));
+
+ virtual void type_def (
+ CORBA::IDLType_ptr type_def
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS
+ )
+ ACE_THROW_SPEC ((CORBA::SystemException));
+
+ void type_def_i (
+ CORBA::IDLType_ptr type_def
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS
+ )
+ ACE_THROW_SPEC ((CORBA::SystemException));
+
+ virtual CORBA::AttributeMode mode (
+ ACE_ENV_SINGLE_ARG_DECL_WITH_DEFAULTS
+ )
+ ACE_THROW_SPEC ((CORBA::SystemException));
+
+ CORBA::AttributeMode mode_i (
+ ACE_ENV_SINGLE_ARG_DECL_WITH_DEFAULTS
+ )
+ ACE_THROW_SPEC ((CORBA::SystemException));
+
+ virtual void mode (
+ CORBA::AttributeMode mode
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS
+ )
+ ACE_THROW_SPEC ((CORBA::SystemException));
+
+ void mode_i (
+ CORBA::AttributeMode mode
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS
+ )
+ ACE_THROW_SPEC ((CORBA::SystemException));
+
+ void make_description (
+ CORBA::AttributeDescription &ad
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS
+ )
+ ACE_THROW_SPEC ((CORBA::SystemException));
+ // Common code for InterfaceDef to call in
+ // making its own description.
+
+ // These two are called by Contained::move().
+ CORBA::ExceptionDefSeq *get_exceptions (
+ ACE_ENV_SINGLE_ARG_DECL_WITH_DEFAULTS
+ )
+ ACE_THROW_SPEC ((CORBA::SystemException));
+
+ CORBA::ExceptionDefSeq *put_exceptions (
+ ACE_ENV_SINGLE_ARG_DECL_WITH_DEFAULTS
+ )
+ ACE_THROW_SPEC ((CORBA::SystemException));
+};
+
+TAO_END_VERSIONED_NAMESPACE_DECL
+
+#if defined(_MSC_VER)
+#pragma warning(pop)
+#endif /* _MSC_VER */
+
+#endif /* TAO_ATTRIBUTEDEF_I_H */
diff --git a/TAO/orbsvcs/orbsvcs/IFRService/ComponentContainer_i.cpp b/TAO/orbsvcs/orbsvcs/IFRService/ComponentContainer_i.cpp
new file mode 100644
index 00000000000..43e5f4b3ffa
--- /dev/null
+++ b/TAO/orbsvcs/orbsvcs/IFRService/ComponentContainer_i.cpp
@@ -0,0 +1,569 @@
+/* -*- C++ -*- */
+// $Id$
+
+#include "orbsvcs/IFRService/ComponentContainer_i.h"
+#include "orbsvcs/IFRService/Repository_i.h"
+#include "orbsvcs/IFRService/InterfaceDef_i.h"
+#include "orbsvcs/IFRService/ComponentDef_i.h"
+#include "orbsvcs/IFRService/ValueDef_i.h"
+#include "orbsvcs/IFRService/IFR_Service_Utils.h"
+#include "ace/SString.h"
+
+ACE_RCSID (IFRService,
+ ComponentContainer_i,
+ "$Id$")
+
+TAO_BEGIN_VERSIONED_NAMESPACE_DECL
+
+const char *TAO_ComponentContainer_i::tmp_name_holder_ = 0;
+
+TAO_ComponentContainer_i::TAO_ComponentContainer_i (TAO_Repository_i *repo)
+ : TAO_IRObject_i (repo),
+ TAO_Container_i (repo)
+{
+}
+
+TAO_ComponentContainer_i::~TAO_ComponentContainer_i (void)
+{
+}
+
+CORBA::ComponentIR::ComponentDef_ptr
+TAO_ComponentContainer_i::create_component (
+ const char *id,
+ const char *name,
+ const char *version,
+ CORBA::ComponentIR::ComponentDef_ptr base_component,
+ const CORBA::InterfaceDefSeq &supports_interfaces
+ ACE_ENV_ARG_DECL
+ )
+ ACE_THROW_SPEC ((CORBA::SystemException))
+{
+ TAO_IFR_WRITE_GUARD_RETURN (CORBA::ComponentIR::ComponentDef::_nil ());
+
+ this->update_key (ACE_ENV_SINGLE_ARG_PARAMETER);
+ ACE_CHECK_RETURN (CORBA::ComponentIR::ComponentDef::_nil ());
+
+ return this->create_component_i (id,
+ name,
+ version,
+ base_component,
+ supports_interfaces
+ ACE_ENV_ARG_PARAMETER);
+}
+
+CORBA::ComponentIR::ComponentDef_ptr
+TAO_ComponentContainer_i::create_component_i (
+ const char *id,
+ const char *name,
+ const char *version,
+ CORBA::ComponentIR::ComponentDef_ptr base_component,
+ const CORBA::InterfaceDefSeq &supports_interfaces
+ ACE_ENV_ARG_DECL
+ )
+ ACE_THROW_SPEC ((CORBA::SystemException))
+{
+ TAO_ComponentContainer_i::tmp_name_holder_ = name;
+ ACE_Configuration_Section_Key new_key;
+ ACE_TString path =
+ TAO_IFR_Service_Utils::create_common (
+ this->def_kind (),
+ CORBA::dk_Component,
+ this->section_key_,
+ new_key,
+ this->repo_,
+ id,
+ name,
+ &TAO_ComponentContainer_i::same_as_tmp_name,
+ version,
+ "defns"
+ ACE_ENV_ARG_PARAMETER
+ );
+ ACE_CHECK_RETURN (CORBA::ComponentIR::ComponentDef::_nil ());
+
+ if (! CORBA::is_nil (base_component))
+ {
+ const char *base_path =
+ TAO_IFR_Service_Utils::reference_to_path (base_component);
+
+ // Get the servant's key into the temporary key holder, because
+ // the name clash checker for base valuetypes is static, and has
+ // no other way to know about a specific key.
+ this->repo_->config ()->expand_path (
+ this->repo_->root_key (),
+ base_path,
+ TAO_IFR_Service_Utils::tmp_key_,
+ 0
+ );
+ TAO_IFR_Service_Utils::name_exists (&TAO_ComponentDef_i::name_clash,
+ new_key,
+ this->repo_,
+ CORBA::dk_Component
+ ACE_ENV_ARG_PARAMETER);
+ ACE_CHECK_RETURN (CORBA::ComponentIR::ComponentDef::_nil ());
+
+ // Store the id for this - that's what ComponentDescription takes.
+ ACE_TString base_id;
+ this->repo_->config ()->get_string_value (TAO_IFR_Service_Utils::tmp_key_,
+ "id",
+ base_id);
+ this->repo_->config ()->set_string_value (new_key,
+ "base_component",
+ base_id);
+ }
+
+ CORBA::ULong count = supports_interfaces.length ();
+ CORBA::ULong i = 0;
+
+ if (count > 0)
+ {
+ ACE_Configuration_Section_Key supports_key;
+ this->repo_->config ()->open_section (new_key,
+ "supported",
+ 1,
+ supports_key);
+
+ this->repo_->config ()->set_integer_value (supports_key,
+ "count",
+ count);
+
+ const char *supported_path = 0;
+ char *stringified = 0;
+
+ for (i = 0; i < count; ++i)
+ {
+ stringified = TAO_IFR_Service_Utils::int_to_string (i);
+ supported_path =
+ TAO_IFR_Service_Utils::reference_to_path (
+ supports_interfaces[i]
+ );
+ this->repo_->config ()->set_string_value (supports_key,
+ stringified,
+ supported_path);
+ }
+ }
+
+ // Create the object reference.
+ CORBA::Object_var obj =
+ TAO_IFR_Service_Utils::create_objref (CORBA::dk_Component,
+ path.c_str (),
+ this->repo_
+ ACE_ENV_ARG_PARAMETER);
+ ACE_CHECK_RETURN (CORBA::ComponentIR::ComponentDef::_nil ());
+
+ return CORBA::ComponentIR::ComponentDef::_narrow (obj.in ()
+ ACE_ENV_ARG_PARAMETER);
+}
+
+CORBA::ComponentIR::HomeDef_ptr
+TAO_ComponentContainer_i::create_home (
+ const char *id,
+ const char *name,
+ const char *version,
+ CORBA::ComponentIR::HomeDef_ptr base_home,
+ CORBA::ComponentIR::ComponentDef_ptr managed_component,
+ const CORBA::InterfaceDefSeq &supports_interfaces,
+ CORBA::ValueDef_ptr primary_key
+ ACE_ENV_ARG_DECL
+ )
+ ACE_THROW_SPEC ((CORBA::SystemException))
+{
+ TAO_IFR_WRITE_GUARD_RETURN (CORBA::ComponentIR::HomeDef::_nil ());
+
+ this->update_key (ACE_ENV_SINGLE_ARG_PARAMETER);
+ ACE_CHECK_RETURN (CORBA::ComponentIR::HomeDef::_nil ());
+
+ return this->create_home_i (id,
+ name,
+ version,
+ base_home,
+ managed_component,
+ supports_interfaces,
+ primary_key
+ ACE_ENV_ARG_PARAMETER);
+}
+
+CORBA::ComponentIR::HomeDef_ptr
+TAO_ComponentContainer_i::create_home_i (
+ const char *id,
+ const char *name,
+ const char *version,
+ CORBA::ComponentIR::HomeDef_ptr base_home,
+ CORBA::ComponentIR::ComponentDef_ptr managed_component,
+ const CORBA::InterfaceDefSeq &supports_interfaces,
+ CORBA::ValueDef_ptr primary_key
+ ACE_ENV_ARG_DECL
+ )
+ ACE_THROW_SPEC ((CORBA::SystemException))
+{
+ TAO_ComponentContainer_i::tmp_name_holder_ = name;
+ ACE_Configuration_Section_Key new_key;
+ ACE_TString path =
+ TAO_IFR_Service_Utils::create_common (
+ this->def_kind (),
+ CORBA::dk_Home,
+ this->section_key_,
+ new_key,
+ this->repo_,
+ id,
+ name,
+ &TAO_ComponentContainer_i::same_as_tmp_name,
+ version,
+ "defns"
+ ACE_ENV_ARG_PARAMETER
+ );
+ ACE_CHECK_RETURN (CORBA::ComponentIR::HomeDef::_nil ());
+
+ char *base_path = 0;
+
+ if (! CORBA::is_nil (base_home))
+ {
+ base_path = TAO_IFR_Service_Utils::reference_to_path (base_home);
+ this->repo_->config ()->set_string_value (new_key,
+ "base_home",
+ base_path);
+ }
+
+ if (! CORBA::is_nil (managed_component))
+ {
+ base_path =
+ TAO_IFR_Service_Utils::reference_to_path (managed_component);
+ this->repo_->config ()->set_string_value (new_key,
+ "managed",
+ base_path);
+ }
+
+ CORBA::ULong length = supports_interfaces.length ();
+ CORBA::ULong i = 0;
+
+ if (length > 0)
+ {
+ ACE_Configuration_Section_Key supports_key;
+ this->repo_->config ()->open_section (new_key,
+ "supported",
+ 1,
+ supports_key);
+ this->repo_->config ()->set_integer_value (supports_key,
+ "count",
+ length);
+
+ char *supported_path = 0;
+ char *stringified = 0;
+
+ for (i = 0; i < length; ++i)
+ {
+ supported_path =
+ TAO_IFR_Service_Utils::reference_to_path (
+ supports_interfaces[i]
+ );
+ stringified = TAO_IFR_Service_Utils::int_to_string (i);
+ this->repo_->config ()->set_string_value (supports_key,
+ stringified,
+ supported_path);
+ }
+ }
+
+ if (! CORBA::is_nil (primary_key))
+ {
+ char *primary_key_path =
+ TAO_IFR_Service_Utils::reference_to_path (primary_key);
+ this->repo_->config ()->set_string_value (new_key,
+ "primary_key",
+ primary_key_path);
+ }
+
+ // Create the object reference.
+ CORBA::Object_var obj =
+ TAO_IFR_Service_Utils::create_objref (CORBA::dk_Home,
+ path.c_str (),
+ this->repo_
+ ACE_ENV_ARG_PARAMETER);
+ ACE_CHECK_RETURN (CORBA::ComponentIR::HomeDef::_nil ());
+
+ return CORBA::ComponentIR::HomeDef::_narrow (obj.in ()
+ ACE_ENV_ARG_PARAMETER);
+}
+
+CORBA::ComponentIR::EventDef_ptr
+TAO_ComponentContainer_i::create_event (
+ const char *id,
+ const char *name,
+ const char *version,
+ CORBA::Boolean is_custom,
+ CORBA::Boolean is_abstract,
+ CORBA::ValueDef_ptr base_value,
+ CORBA::Boolean is_truncatable,
+ const CORBA::ValueDefSeq &abstract_base_values,
+ const CORBA::InterfaceDefSeq &supported_interfaces,
+ const CORBA::ExtInitializerSeq &initializers
+ ACE_ENV_ARG_DECL
+ )
+ ACE_THROW_SPEC ((CORBA::SystemException))
+{
+ TAO_IFR_WRITE_GUARD_RETURN (CORBA::ComponentIR::EventDef::_nil ());
+
+ this->update_key (ACE_ENV_SINGLE_ARG_PARAMETER);
+ ACE_CHECK_RETURN (CORBA::ComponentIR::EventDef::_nil ());
+
+ return this->create_event_i (id,
+ name,
+ version,
+ is_custom,
+ is_abstract,
+ base_value,
+ is_truncatable,
+ abstract_base_values,
+ supported_interfaces,
+ initializers
+ ACE_ENV_ARG_PARAMETER);
+}
+
+CORBA::ComponentIR::EventDef_ptr
+TAO_ComponentContainer_i::create_event_i (
+ const char *id,
+ const char *name,
+ const char *version,
+ CORBA::Boolean is_custom,
+ CORBA::Boolean is_abstract,
+ CORBA::ValueDef_ptr base_value,
+ CORBA::Boolean is_truncatable,
+ const CORBA::ValueDefSeq &abstract_base_values,
+ const CORBA::InterfaceDefSeq &supported_interfaces,
+ const CORBA::ExtInitializerSeq &initializers
+ ACE_ENV_ARG_DECL
+ )
+ ACE_THROW_SPEC ((CORBA::SystemException))
+{
+ TAO_ComponentContainer_i::tmp_name_holder_ = name;
+ ACE_Configuration_Section_Key new_key;
+ ACE_TString path =
+ TAO_IFR_Service_Utils::create_common (
+ this->def_kind (),
+ CORBA::dk_Event,
+ this->section_key_,
+ new_key,
+ this->repo_,
+ id,
+ name,
+ &TAO_ComponentContainer_i::same_as_tmp_name,
+ version,
+ "defns"
+ ACE_ENV_ARG_PARAMETER
+ );
+ ACE_CHECK_RETURN (CORBA::ComponentIR::EventDef::_nil ());
+
+ this->repo_->config ()->set_integer_value (new_key,
+ "is_custom",
+ (CORBA::ULong) is_custom);
+
+ this->repo_->config ()->set_integer_value (new_key,
+ "is_abstract",
+ (CORBA::ULong) is_abstract);
+
+ this->repo_->config ()->set_integer_value (new_key,
+ "is_truncatable",
+ (CORBA::ULong) is_truncatable);
+
+ if (!CORBA::is_nil (base_value))
+ {
+ const char *base_path =
+ TAO_IFR_Service_Utils::reference_to_path (base_value);
+
+ // Get the servant's key into the temporary key holder, because
+ // the name clash checker for base valuetypes is static, and has
+ // no other way to know about a specific key.
+ this->repo_->config ()->expand_path (
+ this->repo_->root_key (),
+ base_path,
+ TAO_IFR_Service_Utils::tmp_key_,
+ 0
+ );
+ TAO_IFR_Service_Utils::name_exists (&TAO_ValueDef_i::name_clash,
+ new_key,
+ this->repo_,
+ CORBA::dk_Value
+ ACE_ENV_ARG_PARAMETER);
+ ACE_CHECK_RETURN (CORBA::ComponentIR::EventDef::_nil ());
+
+ ACE_TString base_value_id;
+ this->repo_->config ()->get_string_value (TAO_IFR_Service_Utils::tmp_key_,
+ "id",
+ base_value_id);
+
+ this->repo_->config ()->set_string_value (new_key,
+ "base_value",
+ base_value_id);
+ }
+
+ CORBA::ULong length = abstract_base_values.length ();
+ CORBA::ULong i = 0;
+
+ if (length > 0)
+ {
+ ACE_Configuration_Section_Key bases_key;
+ this->repo_->config ()->open_section (new_key,
+ "abstract_bases",
+ 1,
+ bases_key);
+
+ char *base_path = 0;
+
+ for (i = 0; i < length; ++i)
+ {
+ base_path =
+ TAO_IFR_Service_Utils::reference_to_path (
+ abstract_base_values[i]
+ );
+ char *stringified = TAO_IFR_Service_Utils::int_to_string (i);
+ this->repo_->config ()->set_string_value (bases_key,
+ stringified,
+ base_path);
+ }
+ }
+
+ length = supported_interfaces.length ();
+
+ if (length > 0)
+ {
+ ACE_Configuration_Section_Key supported_key;
+ this->repo_->config ()->open_section (new_key,
+ "supported",
+ 1,
+ supported_key);
+
+ this->repo_->config ()->set_integer_value (supported_key,
+ "count",
+ length);
+ char *supported_path = 0;
+
+ for (i = 0; i < length; ++i)
+ {
+ supported_path =
+ TAO_IFR_Service_Utils::reference_to_path (
+ supported_interfaces[i]
+ );
+ char *stringified = TAO_IFR_Service_Utils::int_to_string (i);
+ this->repo_->config ()->set_string_value (supported_key,
+ stringified,
+ supported_path);
+ }
+ }
+
+ length = initializers.length ();
+
+ if (length > 0)
+ {
+ ACE_Configuration_Section_Key initializers_key;
+ this->repo_->config ()->open_section (new_key,
+ "initializers",
+ 1,
+ initializers_key);
+
+ CORBA::ULong count = 0;
+ char *path = 0;
+ char *stringified = 0;
+ ACE_Configuration_Section_Key initializer_key;
+ ACE_Configuration_Section_Key outer_key;
+ ACE_Configuration_Section_Key inner_key;
+ ACE_TString excep_path;
+
+ for (i = 0; i < length; ++i)
+ {
+ stringified = TAO_IFR_Service_Utils::int_to_string (i);
+ this->repo_->config ()->open_section (initializers_key,
+ stringified,
+ 1,
+ initializer_key);
+ this->repo_->config ()->set_string_value (
+ initializer_key,
+ "name",
+ initializers[i].name.in ()
+ );
+
+ count = initializers[i].members.length ();
+
+ if (count > 0)
+ {
+ this->repo_->config ()->open_section (initializer_key,
+ "params",
+ 1,
+ outer_key);
+
+ this->repo_->config ()->set_integer_value (outer_key,
+ "count",
+ count);
+
+ for (CORBA::ULong j = 0; j < count; ++j)
+ {
+ stringified = TAO_IFR_Service_Utils::int_to_string (j);
+ this->repo_->config ()->open_section (outer_key,
+ stringified,
+ 1,
+ inner_key);
+
+ this->repo_->config ()->set_string_value (
+ inner_key,
+ "arg_name",
+ initializers[i].members[j].name.in ()
+ );
+
+ path =
+ TAO_IFR_Service_Utils::reference_to_path (
+ initializers[i].members[j].type_def.in ()
+ );
+
+ this->repo_->config ()->set_string_value (inner_key,
+ "arg_path",
+ path);
+ }
+ }
+
+ count = initializers[i].exceptions.length ();
+
+ if (count > 0)
+ {
+ this->repo_->config ()->open_section (initializer_key,
+ "excepts",
+ 1,
+ outer_key);
+
+ this->repo_->config ()->set_integer_value (outer_key,
+ "count",
+ count);
+
+ for (CORBA::ULong k = 0; k < count; ++k)
+ {
+ this->repo_->config ()->get_string_value (
+ this->repo_->repo_ids_key (),
+ initializers[i].exceptions[k].id.in (),
+ excep_path
+ );
+
+ stringified = TAO_IFR_Service_Utils::int_to_string (k);
+ this->repo_->config ()->set_string_value (outer_key,
+ stringified,
+ excep_path);
+ }
+ }
+ }
+ }
+
+ // Create the object reference.
+ CORBA::Object_var obj =
+ TAO_IFR_Service_Utils::create_objref (CORBA::dk_Event,
+ path.c_str (),
+ this->repo_
+ ACE_ENV_ARG_PARAMETER);
+ ACE_CHECK_RETURN (CORBA::ComponentIR::EventDef::_nil ());
+
+ return CORBA::ComponentIR::EventDef::_narrow (obj.in ()
+ ACE_ENV_ARG_PARAMETER);
+}
+
+int
+TAO_ComponentContainer_i::same_as_tmp_name (const char *name)
+{
+ return
+ ACE_OS::strcmp (TAO_ComponentContainer_i::tmp_name_holder_, name) == 0;
+}
+
+TAO_END_VERSIONED_NAMESPACE_DECL
diff --git a/TAO/orbsvcs/orbsvcs/IFRService/ComponentContainer_i.h b/TAO/orbsvcs/orbsvcs/IFRService/ComponentContainer_i.h
new file mode 100644
index 00000000000..bc1c9e9fec6
--- /dev/null
+++ b/TAO/orbsvcs/orbsvcs/IFRService/ComponentContainer_i.h
@@ -0,0 +1,144 @@
+// -*- C++ -*-
+
+// $Id$
+
+// ============================================================================
+//
+// = LIBRARY
+// TAO/orbsvcs/orbsvcs/IFRService
+//
+// = FILENAME
+// ComponentContainer_i.h
+//
+// = DESCRIPTION
+// ComponentContainer_i servant class.
+//
+// = AUTHOR
+// Jeff Parsons <j.parsons@vanderbilt.edu>
+//
+// ============================================================================
+
+#ifndef TAO_COMPONENTCONTAINER_I_H
+#define TAO_COMPONENTCONTAINER_I_H
+
+#include "orbsvcs/IFRService/Container_i.h"
+#include "orbsvcs/IFRService/ifr_service_export.h"
+
+#if !defined (ACE_LACKS_PRAGMA_ONCE)
+# pragma once
+#endif /* ACE_LACKS_PRAGMA_ONCE */
+
+#include "orbsvcs/IFRService/IFR_ComponentsS.h"
+
+#if defined(_MSC_VER)
+#pragma warning(push)
+#pragma warning(disable:4250)
+#endif /* _MSC_VER */
+
+TAO_BEGIN_VERSIONED_NAMESPACE_DECL
+
+class TAO_IFRService_Export TAO_ComponentContainer_i
+ : public virtual TAO_Container_i
+{
+ // = TITLE
+ // TAO_ComponentContainer_i
+ //
+ // = DESCRIPTION
+ // Base class used to form a containment hierarchy
+ // for component-related types in the Interface Repository.
+ // Defines the relevant create_* methods.
+ //
+public:
+ TAO_ComponentContainer_i (TAO_Repository_i *repo);
+
+ virtual ~TAO_ComponentContainer_i (void);
+
+ virtual CORBA::ComponentIR::ComponentDef_ptr create_component (
+ const char *id,
+ const char *name,
+ const char *version,
+ CORBA::ComponentIR::ComponentDef_ptr base_component,
+ const CORBA::InterfaceDefSeq &supports_interfaces
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS
+ )
+ ACE_THROW_SPEC ((CORBA::SystemException));
+
+ CORBA::ComponentIR::ComponentDef_ptr create_component_i (
+ const char *id,
+ const char *name,
+ const char *version,
+ CORBA::ComponentIR::ComponentDef_ptr base_component,
+ const CORBA::InterfaceDefSeq &supports_interfaces
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS
+ )
+ ACE_THROW_SPEC ((CORBA::SystemException));
+
+ virtual CORBA::ComponentIR::HomeDef_ptr create_home (
+ const char *id,
+ const char *name,
+ const char *version,
+ CORBA::ComponentIR::HomeDef_ptr base_home,
+ CORBA::ComponentIR::ComponentDef_ptr managed_component,
+ const CORBA::InterfaceDefSeq &supports_interfaces,
+ CORBA::ValueDef_ptr primary_key
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS
+ )
+ ACE_THROW_SPEC ((CORBA::SystemException));
+
+ CORBA::ComponentIR::HomeDef_ptr create_home_i (
+ const char *id,
+ const char *name,
+ const char *version,
+ CORBA::ComponentIR::HomeDef_ptr base_home,
+ CORBA::ComponentIR::ComponentDef_ptr managed_component,
+ const CORBA::InterfaceDefSeq &supports_interfaces,
+ CORBA::ValueDef_ptr primary_key
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS
+ )
+ ACE_THROW_SPEC ((CORBA::SystemException));
+
+ virtual CORBA::ComponentIR::EventDef_ptr create_event (
+ const char *id,
+ const char *name,
+ const char *version,
+ CORBA::Boolean is_custom,
+ CORBA::Boolean is_abstract,
+ CORBA::ValueDef_ptr base_value,
+ CORBA::Boolean is_truncatable,
+ const CORBA::ValueDefSeq &abstract_base_values,
+ const CORBA::InterfaceDefSeq &supported_interfaces,
+ const CORBA::ExtInitializerSeq &initializers
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS
+ )
+ ACE_THROW_SPEC ((CORBA::SystemException));
+
+ CORBA::ComponentIR::EventDef_ptr create_event_i (
+ const char *id,
+ const char *name,
+ const char *version,
+ CORBA::Boolean is_custom,
+ CORBA::Boolean is_abstract,
+ CORBA::ValueDef_ptr base_value,
+ CORBA::Boolean is_truncatable,
+ const CORBA::ValueDefSeq &abstract_base_values,
+ const CORBA::InterfaceDefSeq &supported_interfaces,
+ const CORBA::ExtInitializerSeq &initializers
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS
+ )
+ ACE_THROW_SPEC ((CORBA::SystemException));
+
+ static int same_as_tmp_name (const char *name);
+ // Called from TAO_IFR_Service_Utils::name_exisits.
+
+protected:
+ static const char *tmp_name_holder_;
+};
+
+TAO_END_VERSIONED_NAMESPACE_DECL
+
+
+#if defined(_MSC_VER)
+#pragma warning(pop)
+#endif /* _MSC_VER */
+
+#endif /* TAO_COMPONENTCONTAINER_I_H */
diff --git a/TAO/orbsvcs/orbsvcs/IFRService/ComponentDef_i.cpp b/TAO/orbsvcs/orbsvcs/IFRService/ComponentDef_i.cpp
new file mode 100644
index 00000000000..eb42f8bb52b
--- /dev/null
+++ b/TAO/orbsvcs/orbsvcs/IFRService/ComponentDef_i.cpp
@@ -0,0 +1,794 @@
+// $Id$
+
+#include "orbsvcs/IFRService/Repository_i.h"
+#include "orbsvcs/IFRService/ComponentDef_i.h"
+#include "orbsvcs/IFRService/ProvidesDef_i.h"
+#include "orbsvcs/IFRService/UsesDef_i.h"
+#include "orbsvcs/IFRService/EmitsDef_i.h"
+#include "orbsvcs/IFRService/PublishesDef_i.h"
+#include "orbsvcs/IFRService/ConsumesDef_i.h"
+#include "orbsvcs/IFRService/ExtAttributeDef_i.h"
+#include "orbsvcs/IFRService/IFR_Service_Utils.h"
+
+#include "ace/SString.h"
+
+
+ACE_RCSID (IFRService,
+ ComponentDef_i,
+ "$Id$")
+
+TAO_BEGIN_VERSIONED_NAMESPACE_DECL
+
+// Specialization.
+template<>
+void
+TAO_Port_Desc_Seq_Utils<CORBA::ComponentIR::UsesDescriptionSeq>::get_is_multiple (
+ CORBA::ComponentIR::UsesDescriptionSeq &desc_seq,
+ ACE_Configuration *config,
+ ACE_Configuration_Section_Key &key,
+ CORBA::ULong index
+ )
+{
+ CORBA::ULong is_multiple = 0;
+ config->get_integer_value (key,
+ "is_multiple",
+ is_multiple);
+ desc_seq[index].is_multiple =
+ static_cast<CORBA::Boolean> (is_multiple);
+}
+
+// Specialization.
+template<>
+void
+TAO_Port_Desc_Seq_Utils<CORBA::ComponentIR::EventPortDescriptionSeq>::port_base_type (
+ CORBA::ComponentIR::EventPortDescriptionSeq &desc_seq,
+ ACE_TString &holder,
+ CORBA::ULong index
+ )
+{
+ desc_seq[index].event = holder.fast_rep ();
+}
+
+/// Specialization.
+template<>
+void
+TAO_Port_Utils<CORBA::ComponentIR::UsesDef>::set_is_multiple (
+ CORBA::Boolean is_multiple,
+ ACE_Configuration *config,
+ ACE_Configuration_Section_Key &key
+ )
+{
+ config->set_integer_value (key,
+ "is_multiple",
+ is_multiple);
+}
+
+// ==============================================================
+
+TAO_ComponentDef_i::TAO_ComponentDef_i (
+ TAO_Repository_i *repo
+ )
+ : TAO_IRObject_i (repo),
+ TAO_Container_i (repo),
+ TAO_Contained_i (repo),
+ TAO_IDLType_i (repo),
+ TAO_InterfaceDef_i (repo),
+ TAO_InterfaceAttrExtension_i (repo),
+ TAO_ExtInterfaceDef_i (repo)
+{
+}
+
+TAO_ComponentDef_i::~TAO_ComponentDef_i (void)
+{
+}
+
+CORBA::DefinitionKind
+TAO_ComponentDef_i::def_kind (ACE_ENV_SINGLE_ARG_DECL_NOT_USED)
+ ACE_THROW_SPEC ((CORBA::SystemException))
+{
+ return CORBA::dk_Component;
+}
+
+void
+TAO_ComponentDef_i::destroy (ACE_ENV_SINGLE_ARG_DECL)
+ ACE_THROW_SPEC ((CORBA::SystemException))
+{
+ TAO_IFR_WRITE_GUARD;
+
+ this->update_key (ACE_ENV_SINGLE_ARG_PARAMETER);
+ ACE_CHECK;
+
+ this->destroy_i (ACE_ENV_SINGLE_ARG_PARAMETER);
+}
+
+void
+TAO_ComponentDef_i::destroy_i (ACE_ENV_SINGLE_ARG_DECL)
+ ACE_THROW_SPEC ((CORBA::SystemException))
+{
+ // Destroy our special subsections first, then call destroy_i
+ // on our base class.
+
+ TAO_IFR_Generic_Utils<TAO_ProvidesDef_i>::destroy_special (
+ "provides",
+ this->repo_,
+ this->section_key_
+ ACE_ENV_ARG_PARAMETER
+ );
+ ACE_CHECK;
+
+ TAO_IFR_Generic_Utils<TAO_UsesDef_i>::destroy_special (
+ "uses",
+ this->repo_,
+ this->section_key_
+ ACE_ENV_ARG_PARAMETER
+ );
+ ACE_CHECK;
+
+ TAO_IFR_Generic_Utils<TAO_EmitsDef_i>::destroy_special (
+ "emits",
+ this->repo_,
+ this->section_key_
+ ACE_ENV_ARG_PARAMETER
+ );
+ ACE_CHECK;
+
+ TAO_IFR_Generic_Utils<TAO_PublishesDef_i>::destroy_special (
+ "publishes",
+ this->repo_,
+ this->section_key_
+ ACE_ENV_ARG_PARAMETER
+ );
+ ACE_CHECK;
+
+ TAO_IFR_Generic_Utils<TAO_ConsumesDef_i>::destroy_special (
+ "consumes",
+ this->repo_,
+ this->section_key_
+ ACE_ENV_ARG_PARAMETER
+ );
+ ACE_CHECK;
+
+ this->TAO_ExtInterfaceDef_i::destroy_i (ACE_ENV_SINGLE_ARG_PARAMETER);
+}
+
+CORBA::Contained::Description *
+TAO_ComponentDef_i::describe (ACE_ENV_SINGLE_ARG_DECL)
+ ACE_THROW_SPEC ((CORBA::SystemException))
+{
+ TAO_IFR_READ_GUARD_RETURN (0);
+
+ this->update_key (ACE_ENV_SINGLE_ARG_PARAMETER);
+ ACE_CHECK_RETURN (0);
+
+ return this->describe_i (ACE_ENV_SINGLE_ARG_PARAMETER);
+}
+
+CORBA::Contained::Description *
+TAO_ComponentDef_i::describe_i (ACE_ENV_SINGLE_ARG_DECL)
+ ACE_THROW_SPEC ((CORBA::SystemException))
+{
+ CORBA::ComponentIR::ComponentDescription cd;
+ TAO_IFR_Desc_Utils<CORBA::ComponentIR::ComponentDescription,
+ TAO_ComponentDef_i>::fill_desc_begin (
+ cd,
+ this->repo_,
+ this->section_key_
+ ACE_ENV_ARG_PARAMETER
+ );
+ ACE_CHECK_RETURN (0);
+
+ ACE_TString holder;
+ this->repo_->config ()->get_string_value (this->section_key_,
+ "base_component",
+ holder);
+ cd.base_component = holder.fast_rep ();
+
+ CORBA::ULong count = 0;
+ ACE_Configuration_Section_Key supports_key;
+ int status = this->repo_->config ()->open_section (this->section_key_,
+ "supported",
+ 0,
+ supports_key);
+
+ if (status == 0)
+ {
+ this->repo_->config ()->get_integer_value (supports_key,
+ "count",
+ count);
+ }
+
+ cd.supported_interfaces.length (count);
+ char *stringified = 0;
+ CORBA::ULong i = 0;
+
+ for (i = 0; i < count; ++i)
+ {
+ stringified = TAO_IFR_Service_Utils::int_to_string (i);
+ this->repo_->config ()->get_string_value (supports_key,
+ stringified,
+ holder);
+
+ cd.supported_interfaces[i] = holder.c_str ();
+ }
+
+ TAO_Port_Desc_Seq_Utils<
+ CORBA::ComponentIR::ProvidesDescriptionSeq
+ >::port_descriptions (cd.provided_interfaces,
+ this->repo_->config (),
+ this->section_key_,
+ "provides");
+
+ TAO_Port_Desc_Seq_Utils<
+ CORBA::ComponentIR::UsesDescriptionSeq
+ >::port_descriptions (cd.used_interfaces,
+ this->repo_->config (),
+ this->section_key_,
+ "uses");
+
+ TAO_Port_Desc_Seq_Utils<
+ CORBA::ComponentIR::EventPortDescriptionSeq
+ >::port_descriptions (cd.emits_events,
+ this->repo_->config (),
+ this->section_key_,
+ "emits");
+
+ TAO_Port_Desc_Seq_Utils<
+ CORBA::ComponentIR::EventPortDescriptionSeq
+ >::port_descriptions (cd.publishes_events,
+ this->repo_->config (),
+ this->section_key_,
+ "publishes");
+
+ TAO_Port_Desc_Seq_Utils<
+ CORBA::ComponentIR::EventPortDescriptionSeq
+ >::port_descriptions (cd.consumes_events,
+ this->repo_->config (),
+ this->section_key_,
+ "consumes");
+
+ count = 0;
+ ACE_Configuration_Section_Key attrs_key;
+ status =
+ this->repo_->config ()->open_section (this->section_key_,
+ "attrs",
+ 0,
+ attrs_key);
+ if (status == 0)
+ {
+ this->repo_->config ()->get_integer_value (attrs_key,
+ "count",
+ count);
+ }
+
+ cd.attributes.length (count);
+ ACE_Configuration_Section_Key attr_key;
+
+ for (i = 0; i < count; ++i)
+ {
+ stringified = TAO_IFR_Service_Utils::int_to_string (i);
+ this->repo_->config ()->open_section (attrs_key,
+ stringified,
+ 0,
+ attr_key);
+
+ TAO_ExtAttributeDef_i impl (this->repo_);
+ impl.section_key (attr_key);
+ impl.fill_description (cd.attributes[i]
+ ACE_ENV_ARG_PARAMETER);
+ ACE_CHECK_RETURN (0);
+ }
+
+ cd.type = this->type_i (ACE_ENV_SINGLE_ARG_PARAMETER);
+ ACE_CHECK_RETURN (0);
+
+ CORBA::Contained::Description *cont_desc_ptr = 0;
+ ACE_NEW_THROW_EX (cont_desc_ptr,
+ CORBA::Contained::Description,
+ CORBA::NO_MEMORY ());
+ ACE_CHECK_RETURN (0);
+ CORBA::Contained::Description_var retval = cont_desc_ptr;
+
+ cont_desc_ptr->kind = CORBA::dk_Component;
+
+ cont_desc_ptr->value <<= cd;
+ return retval._retn ();
+}
+
+CORBA::TypeCode_ptr
+TAO_ComponentDef_i::type (ACE_ENV_SINGLE_ARG_DECL)
+ ACE_THROW_SPEC ((CORBA::SystemException))
+{
+ TAO_IFR_READ_GUARD_RETURN (CORBA::TypeCode::_nil ());
+
+ this->update_key (ACE_ENV_SINGLE_ARG_PARAMETER);
+ ACE_CHECK_RETURN (CORBA::TypeCode::_nil ());
+
+ return this->type_i (ACE_ENV_SINGLE_ARG_PARAMETER);
+}
+
+CORBA::TypeCode_ptr
+TAO_ComponentDef_i::type_i (ACE_ENV_SINGLE_ARG_DECL)
+ ACE_THROW_SPEC ((CORBA::SystemException))
+{
+ ACE_TString id;
+ this->repo_->config ()->get_string_value (this->section_key_,
+ "id",
+ id);
+
+ ACE_TString name;
+ this->repo_->config ()->get_string_value (this->section_key_,
+ "name",
+ name);
+
+ return this->repo_->tc_factory ()->create_component_tc (
+ id.c_str (),
+ name.c_str ()
+ ACE_ENV_ARG_PARAMETER
+ );
+}
+
+CORBA::InterfaceDefSeq *
+TAO_ComponentDef_i::supported_interfaces (ACE_ENV_SINGLE_ARG_DECL)
+ ACE_THROW_SPEC ((CORBA::SystemException))
+{
+ TAO_IFR_READ_GUARD_RETURN (0);
+
+ this->update_key (ACE_ENV_SINGLE_ARG_PARAMETER);
+ ACE_CHECK_RETURN (0);
+
+ return this->supported_interfaces_i (ACE_ENV_SINGLE_ARG_PARAMETER);
+}
+
+CORBA::InterfaceDefSeq *
+TAO_ComponentDef_i::supported_interfaces_i (ACE_ENV_SINGLE_ARG_DECL)
+ ACE_THROW_SPEC ((CORBA::SystemException))
+{
+ CORBA::InterfaceDefSeq *seq = 0;
+ ACE_NEW_RETURN (seq,
+ CORBA::InterfaceDefSeq (0),
+ 0);
+ CORBA::InterfaceDefSeq_var retval = seq;
+ retval->length (0);
+
+ CORBA::ULong count = 0;
+ ACE_Configuration_Section_Key supported_key;
+ int status =
+ this->repo_->config ()->open_section (this->section_key_,
+ "supported",
+ 0,
+ supported_key);
+
+ if (status == 0)
+ {
+ this->repo_->config ()->get_integer_value (supported_key,
+ "count",
+ count);
+ retval->length (count);
+ char *stringified = 0;
+ ACE_TString path;
+ CORBA::Object_var tmp;
+
+ for (CORBA::ULong i = 0; i < count; ++i)
+ {
+ stringified = TAO_IFR_Service_Utils::int_to_string (i);
+ this->repo_->config ()->get_string_value (supported_key,
+ stringified,
+ path);
+ tmp =
+ TAO_IFR_Service_Utils::path_to_ir_object (path,
+ this->repo_
+ ACE_ENV_ARG_PARAMETER);
+ ACE_CHECK_RETURN (0);
+
+ retval[i] = CORBA::InterfaceDef::_narrow (tmp.in ()
+ ACE_ENV_ARG_PARAMETER);
+ ACE_CHECK_RETURN (0);
+ }
+ }
+
+ return retval._retn ();
+}
+
+void
+TAO_ComponentDef_i::supported_interfaces (
+ const CORBA::InterfaceDefSeq &supported_interfaces
+ ACE_ENV_ARG_DECL
+ )
+ ACE_THROW_SPEC ((CORBA::SystemException))
+{
+ TAO_IFR_WRITE_GUARD;
+
+ this->update_key (ACE_ENV_SINGLE_ARG_PARAMETER);
+ ACE_CHECK;
+
+ this->supported_interfaces_i (supported_interfaces
+ ACE_ENV_ARG_PARAMETER);
+}
+
+void
+TAO_ComponentDef_i::supported_interfaces_i (
+ const CORBA::InterfaceDefSeq &supported_interfaces
+ ACE_ENV_ARG_DECL
+ )
+ ACE_THROW_SPEC ((CORBA::SystemException))
+{
+ // Remove the old supported interfaces.
+ this->repo_->config ()->remove_section (this->section_key_,
+ "supported",
+ 0);
+
+ CORBA::ULong length = supported_interfaces.length ();
+ ACE_Configuration_Section_Key inherited_key;
+ this->repo_->config ()->open_section (this->section_key_,
+ "supported",
+ 1,
+ inherited_key);
+
+ CORBA::String_var name;
+ char *supported_path = 0;
+ ACE_Configuration_Section_Key supported_key;
+
+ for (CORBA::ULong i = 0; i < length; ++i)
+ {
+ supported_path =
+ TAO_IFR_Service_Utils::reference_to_path (
+ supported_interfaces[i]
+ );
+
+ // Get the servant's key into the temporary key holder, because
+ // the name clash checker for base interfaces is static, and has
+ // no other way to know about a specific key.
+ this->repo_->config ()->expand_path (this->repo_->root_key (),
+ supported_path,
+ TAO_IFR_Service_Utils::tmp_key_,
+ 0);
+ TAO_IFR_Service_Utils::name_exists (&TAO_InterfaceDef_i::name_clash,
+ this->section_key_,
+ this->repo_,
+ this->def_kind ()
+ ACE_ENV_ARG_PARAMETER);
+ ACE_CHECK;
+
+ char *stringified = TAO_IFR_Service_Utils::int_to_string (i);
+ this->repo_->config ()->set_string_value (supported_key,
+ stringified,
+ supported_path);
+ }
+}
+
+CORBA::ComponentIR::ComponentDef_ptr
+TAO_ComponentDef_i::base_component (ACE_ENV_SINGLE_ARG_DECL)
+ ACE_THROW_SPEC ((CORBA::SystemException))
+{
+ TAO_IFR_READ_GUARD_RETURN (CORBA::ComponentIR::ComponentDef::_nil ());
+
+ this->update_key (ACE_ENV_SINGLE_ARG_PARAMETER);
+ ACE_CHECK_RETURN (CORBA::ComponentIR::ComponentDef::_nil ());
+
+ return this->base_component_i (ACE_ENV_SINGLE_ARG_PARAMETER);
+}
+
+CORBA::ComponentIR::ComponentDef_ptr
+TAO_ComponentDef_i::base_component_i (ACE_ENV_SINGLE_ARG_DECL)
+ ACE_THROW_SPEC ((CORBA::SystemException))
+{
+ ACE_TString base_id;
+ int status =
+ this->repo_->config ()->get_string_value (this->section_key_,
+ "base_component",
+ base_id);
+
+ if (status != 0)
+ {
+ return CORBA::ComponentIR::ComponentDef::_nil ();
+ }
+
+ CORBA::Contained_var obj = this->repo_->lookup_id (base_id.fast_rep ()
+ ACE_ENV_ARG_PARAMETER);
+ ACE_CHECK_RETURN (CORBA::ComponentIR::ComponentDef::_nil ());
+
+ return CORBA::ComponentIR::ComponentDef::_narrow (obj.in ()
+ ACE_ENV_ARG_PARAMETER);
+}
+
+void
+TAO_ComponentDef_i::base_component (
+ CORBA::ComponentIR::ComponentDef_ptr base_component
+ ACE_ENV_ARG_DECL
+ )
+ ACE_THROW_SPEC ((CORBA::SystemException))
+{
+ TAO_IFR_WRITE_GUARD;
+
+ this->update_key (ACE_ENV_SINGLE_ARG_PARAMETER);
+ ACE_CHECK;
+
+ this->base_component_i (base_component
+ ACE_ENV_ARG_PARAMETER);
+}
+
+void
+TAO_ComponentDef_i::base_component_i (
+ CORBA::ComponentIR::ComponentDef_ptr base_component
+ ACE_ENV_ARG_DECL
+ )
+ ACE_THROW_SPEC ((CORBA::SystemException))
+{
+ if (CORBA::is_nil (base_component))
+ {
+ this->repo_->config ()->remove_value (this->section_key_,
+ "base_component");
+ return;
+ }
+
+ const char *base_path =
+ TAO_IFR_Service_Utils::reference_to_path (base_component);
+
+ // Get the servant's key into the temporary key holder, because
+ // the name clash checker for base valuetypes is static, and has
+ // no other way to know about a specific key.
+ this->repo_->config ()->expand_path (
+ this->repo_->root_key (),
+ base_path,
+ TAO_IFR_Service_Utils::tmp_key_,
+ 0
+ );
+ TAO_IFR_Service_Utils::name_exists (&TAO_ComponentDef_i::name_clash,
+ this->section_key_,
+ this->repo_,
+ CORBA::dk_Component
+ ACE_ENV_ARG_PARAMETER);
+ ACE_CHECK;
+
+ this->repo_->config ()->set_string_value (
+ this->section_key_,
+ "base_component",
+ base_component->_interface_repository_id ()
+ );
+}
+
+CORBA::ComponentIR::ProvidesDef_ptr
+TAO_ComponentDef_i::create_provides (
+ const char *id,
+ const char *name,
+ const char *version,
+ CORBA::InterfaceDef_ptr interface_type
+ ACE_ENV_ARG_DECL
+ )
+ ACE_THROW_SPEC ((CORBA::SystemException))
+{
+ TAO_IFR_WRITE_GUARD_RETURN (CORBA::ComponentIR::ProvidesDef::_nil ());
+
+ this->update_key (ACE_ENV_SINGLE_ARG_PARAMETER);
+ ACE_CHECK_RETURN (CORBA::ComponentIR::ProvidesDef::_nil ());
+
+ return this->create_provides_i (id,
+ name,
+ version,
+ interface_type
+ ACE_ENV_ARG_PARAMETER);
+}
+
+CORBA::ComponentIR::ProvidesDef_ptr
+TAO_ComponentDef_i::create_provides_i (
+ const char *id,
+ const char *name,
+ const char *version,
+ CORBA::InterfaceDef_ptr interface_type
+ ACE_ENV_ARG_DECL
+ )
+ ACE_THROW_SPEC ((CORBA::SystemException))
+{
+ return
+ TAO_Port_Utils<
+ CORBA::ComponentIR::ProvidesDef
+ >::create_entry (id,
+ name,
+ version,
+ "provides",
+ interface_type,
+ 0,
+ this->repo_,
+ CORBA::dk_Provides,
+ this->section_key_
+ ACE_ENV_ARG_PARAMETER);
+}
+
+CORBA::ComponentIR::UsesDef_ptr
+TAO_ComponentDef_i::create_uses (const char *id,
+ const char *name,
+ const char *version,
+ CORBA::InterfaceDef_ptr interface_type,
+ CORBA::Boolean is_multiple
+ ACE_ENV_ARG_DECL)
+ ACE_THROW_SPEC ((CORBA::SystemException))
+{
+ TAO_IFR_WRITE_GUARD_RETURN (CORBA::ComponentIR::UsesDef::_nil ());
+
+ this->update_key (ACE_ENV_SINGLE_ARG_PARAMETER);
+ ACE_CHECK_RETURN (CORBA::ComponentIR::UsesDef::_nil ());
+
+ return this->create_uses_i (id,
+ name,
+ version,
+ interface_type,
+ is_multiple
+ ACE_ENV_ARG_PARAMETER);
+}
+
+CORBA::ComponentIR::UsesDef_ptr
+TAO_ComponentDef_i::create_uses_i (const char *id,
+ const char *name,
+ const char *version,
+ CORBA::InterfaceDef_ptr interface_type,
+ CORBA::Boolean is_multiple
+ ACE_ENV_ARG_DECL)
+ ACE_THROW_SPEC ((CORBA::SystemException))
+{
+ return
+ TAO_Port_Utils<
+ CORBA::ComponentIR::UsesDef
+ >::create_entry (id,
+ name,
+ version,
+ "uses",
+ interface_type,
+ is_multiple,
+ this->repo_,
+ CORBA::dk_Uses,
+ this->section_key_
+ ACE_ENV_ARG_PARAMETER);
+}
+
+CORBA::ComponentIR::EmitsDef_ptr
+TAO_ComponentDef_i::create_emits (const char *id,
+ const char *name,
+ const char *version,
+ CORBA::ValueDef_ptr value
+ ACE_ENV_ARG_DECL)
+ ACE_THROW_SPEC ((CORBA::SystemException))
+{
+ TAO_IFR_WRITE_GUARD_RETURN (CORBA::ComponentIR::EmitsDef::_nil ());
+
+ this->update_key (ACE_ENV_SINGLE_ARG_PARAMETER);
+ ACE_CHECK_RETURN (CORBA::ComponentIR::EmitsDef::_nil ());
+
+ return this->create_emits_i (id,
+ name,
+ version,
+ value
+ ACE_ENV_ARG_PARAMETER);
+}
+
+CORBA::ComponentIR::EmitsDef_ptr
+TAO_ComponentDef_i::create_emits_i (const char *id,
+ const char *name,
+ const char *version,
+ CORBA::ValueDef_ptr value
+ ACE_ENV_ARG_DECL)
+ ACE_THROW_SPEC ((CORBA::SystemException))
+{
+ return
+ TAO_Port_Utils<
+ CORBA::ComponentIR::EmitsDef
+ >::create_entry (id,
+ name,
+ version,
+ "emits",
+ value,
+ 0,
+ this->repo_,
+ CORBA::dk_Emits,
+ this->section_key_
+ ACE_ENV_ARG_PARAMETER);
+}
+
+CORBA::ComponentIR::PublishesDef_ptr
+TAO_ComponentDef_i::create_publishes (const char *id,
+ const char *name,
+ const char *version,
+ CORBA::ValueDef_ptr value
+ ACE_ENV_ARG_DECL)
+ ACE_THROW_SPEC ((CORBA::SystemException))
+{
+ TAO_IFR_WRITE_GUARD_RETURN (CORBA::ComponentIR::PublishesDef::_nil ());
+
+ this->update_key (ACE_ENV_SINGLE_ARG_PARAMETER);
+ ACE_CHECK_RETURN (CORBA::ComponentIR::PublishesDef::_nil ());
+
+ return this->create_publishes_i (id,
+ name,
+ version,
+ value
+ ACE_ENV_ARG_PARAMETER);
+}
+
+CORBA::ComponentIR::PublishesDef_ptr
+TAO_ComponentDef_i::create_publishes_i (const char *id,
+ const char *name,
+ const char *version,
+ CORBA::ValueDef_ptr value
+ ACE_ENV_ARG_DECL)
+ ACE_THROW_SPEC ((CORBA::SystemException))
+{
+ return
+ TAO_Port_Utils<
+ CORBA::ComponentIR::PublishesDef
+ >::create_entry (id,
+ name,
+ version,
+ "publishes",
+ value,
+ 0,
+ this->repo_,
+ CORBA::dk_Publishes,
+ this->section_key_
+ ACE_ENV_ARG_PARAMETER);
+}
+
+CORBA::ComponentIR::ConsumesDef_ptr
+TAO_ComponentDef_i::create_consumes (const char *id,
+ const char *name,
+ const char *version,
+ CORBA::ValueDef_ptr value
+ ACE_ENV_ARG_DECL)
+ ACE_THROW_SPEC ((CORBA::SystemException))
+{
+ TAO_IFR_WRITE_GUARD_RETURN (CORBA::ComponentIR::ConsumesDef::_nil ());
+
+ this->update_key (ACE_ENV_SINGLE_ARG_PARAMETER);
+ ACE_CHECK_RETURN (CORBA::ComponentIR::ConsumesDef::_nil ());
+
+ return this->create_consumes_i (id,
+ name,
+ version,
+ value
+ ACE_ENV_ARG_PARAMETER);
+}
+
+CORBA::ComponentIR::ConsumesDef_ptr
+TAO_ComponentDef_i::create_consumes_i (const char *id,
+ const char *name,
+ const char *version,
+ CORBA::ValueDef_ptr value
+ ACE_ENV_ARG_DECL)
+ ACE_THROW_SPEC ((CORBA::SystemException))
+{
+ return
+ TAO_Port_Utils<
+ CORBA::ComponentIR::ConsumesDef
+ >::create_entry (id,
+ name,
+ version,
+ "consumes",
+ value,
+ 0,
+ this->repo_,
+ CORBA::dk_Consumes,
+ this->section_key_
+ ACE_ENV_ARG_PARAMETER);
+}
+
+int
+TAO_ComponentDef_i::name_clash (const char *name)
+{
+ ACE_TRY_NEW_ENV
+ {
+ TAO_Container_i::tmp_name_holder_ = name;
+ TAO_IFR_Service_Utils::name_exists (&TAO_Container_i::same_as_tmp_name,
+ TAO_IFR_Service_Utils::tmp_key_,
+ TAO_IFR_Service_Utils::repo_,
+ CORBA::dk_Component
+ ACE_ENV_ARG_PARAMETER);
+ ACE_TRY_CHECK;
+ }
+ ACE_CATCHANY
+ {
+ return 1;
+ }
+ ACE_ENDTRY;
+
+ return 0;
+}
+
+TAO_END_VERSIONED_NAMESPACE_DECL
diff --git a/TAO/orbsvcs/orbsvcs/IFRService/ComponentDef_i.h b/TAO/orbsvcs/orbsvcs/IFRService/ComponentDef_i.h
new file mode 100644
index 00000000000..0c05918d563
--- /dev/null
+++ b/TAO/orbsvcs/orbsvcs/IFRService/ComponentDef_i.h
@@ -0,0 +1,249 @@
+// -*- C++ -*-
+
+// $Id$
+
+// ============================================================================
+//
+// = LIBRARY
+// TAO/orbsvcs/orbsvcs/IFRService
+//
+// = FILENAME
+// ComponentDef_i.h
+//
+// = DESCRIPTION
+// ComponentDef servant class.
+//
+// = AUTHOR
+// Jeff Parsons <parsons@cs.wustl.edu>
+//
+// ============================================================================
+
+#ifndef TAO_COMPONENTDEF_I_H
+#define TAO_COMPONENTDEF_I_H
+
+#include "orbsvcs/IFRService/ExtInterfaceDef_i.h"
+#include "orbsvcs/IFRService/ifr_service_export.h"
+
+#if !defined (ACE_LACKS_PRAGMA_ONCE)
+# pragma once
+#endif /* ACE_LACKS_PRAGMA_ONCE */
+
+#include "orbsvcs/IFRService/IFR_ComponentsS.h"
+#include "orbsvcs/IFRService/IFR_Service_Utils_T.h"
+
+#if defined(_MSC_VER)
+#pragma warning(push)
+#pragma warning(disable:4250)
+#endif /* _MSC_VER */
+
+TAO_BEGIN_VERSIONED_NAMESPACE_DECL
+
+class TAO_IFRService_Export TAO_ComponentDef_i
+ : public virtual TAO_ExtInterfaceDef_i
+{
+ // = TITLE
+ // TAO_ComponentDef_i
+ //
+ // = DESCRIPTION
+ // Represents a component definition.
+ //
+public:
+ TAO_ComponentDef_i (TAO_Repository_i *repo);
+ // Constructor
+
+ virtual ~TAO_ComponentDef_i (void);
+ // Destructor
+
+ virtual CORBA::DefinitionKind def_kind (
+ ACE_ENV_SINGLE_ARG_DECL_WITH_DEFAULTS
+ )
+ ACE_THROW_SPEC ((CORBA::SystemException));
+ // Return our definition kind.
+
+ virtual void destroy (
+ ACE_ENV_SINGLE_ARG_DECL_WITH_DEFAULTS
+ )
+ ACE_THROW_SPEC ((CORBA::SystemException));
+ // Remove the repository entry.
+
+ void destroy_i (
+ ACE_ENV_SINGLE_ARG_DECL_WITH_DEFAULTS
+ )
+ ACE_THROW_SPEC ((CORBA::SystemException));
+ // Remove the repository entry.
+
+ virtual CORBA::Contained::Description *describe (
+ ACE_ENV_SINGLE_ARG_DECL_WITH_DEFAULTS
+ )
+ ACE_THROW_SPEC ((CORBA::SystemException));
+ // From Contained_i's pure virtual function.
+
+ CORBA::Contained::Description *describe_i (
+ ACE_ENV_SINGLE_ARG_DECL_WITH_DEFAULTS
+ )
+ ACE_THROW_SPEC ((CORBA::SystemException));
+ // From Contained_i's pure virtual function.
+
+ virtual CORBA::TypeCode_ptr type (
+ ACE_ENV_SINGLE_ARG_DECL_WITH_DEFAULTS
+ )
+ ACE_THROW_SPEC ((CORBA::SystemException));
+ // From IDLType_i's pure virtual function.
+
+ CORBA::TypeCode_ptr type_i (
+ ACE_ENV_SINGLE_ARG_DECL_WITH_DEFAULTS
+ )
+ ACE_THROW_SPEC ((CORBA::SystemException));
+ // From IDLType_i's pure virtual function.
+
+ virtual CORBA::InterfaceDefSeq *supported_interfaces (
+ ACE_ENV_SINGLE_ARG_DECL_WITH_DEFAULTS
+ )
+ ACE_THROW_SPEC ((CORBA::SystemException));
+
+ CORBA::InterfaceDefSeq *supported_interfaces_i (
+ ACE_ENV_SINGLE_ARG_DECL_WITH_DEFAULTS
+ )
+ ACE_THROW_SPEC ((CORBA::SystemException));
+
+ virtual void supported_interfaces (
+ const CORBA::InterfaceDefSeq &supported_interfaces
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS
+ )
+ ACE_THROW_SPEC ((CORBA::SystemException));
+
+ void supported_interfaces_i (
+ const CORBA::InterfaceDefSeq &supported_interfaces
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS
+ )
+ ACE_THROW_SPEC ((CORBA::SystemException));
+
+ virtual CORBA::ComponentIR::ComponentDef_ptr base_component (
+ ACE_ENV_SINGLE_ARG_DECL_WITH_DEFAULTS
+ )
+ ACE_THROW_SPEC ((CORBA::SystemException));
+
+ CORBA::ComponentIR::ComponentDef_ptr base_component_i (
+ ACE_ENV_SINGLE_ARG_DECL_WITH_DEFAULTS
+ )
+ ACE_THROW_SPEC ((CORBA::SystemException));
+
+ virtual void base_component (
+ CORBA::ComponentIR::ComponentDef_ptr base_component
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS
+ )
+ ACE_THROW_SPEC ((CORBA::SystemException));
+
+ void base_component_i (
+ CORBA::ComponentIR::ComponentDef_ptr base_component
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS
+ )
+ ACE_THROW_SPEC ((CORBA::SystemException));
+
+ virtual CORBA::ComponentIR::ProvidesDef_ptr create_provides (
+ const char *id,
+ const char *name,
+ const char *version,
+ CORBA::InterfaceDef_ptr interface_type
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS
+ )
+ ACE_THROW_SPEC ((CORBA::SystemException));
+
+ CORBA::ComponentIR::ProvidesDef_ptr create_provides_i (
+ const char *id,
+ const char *name,
+ const char *version,
+ CORBA::InterfaceDef_ptr interface_type
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS
+ )
+ ACE_THROW_SPEC ((CORBA::SystemException));
+
+ virtual CORBA::ComponentIR::UsesDef_ptr create_uses (
+ const char *id,
+ const char *name,
+ const char *version,
+ CORBA::InterfaceDef_ptr interface_type,
+ CORBA::Boolean is_multiple
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS
+ )
+ ACE_THROW_SPEC ((CORBA::SystemException));
+
+ CORBA::ComponentIR::UsesDef_ptr create_uses_i (
+ const char *id,
+ const char *name,
+ const char *version,
+ CORBA::InterfaceDef_ptr interface_type,
+ CORBA::Boolean is_multiple
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS
+ )
+ ACE_THROW_SPEC ((CORBA::SystemException));
+
+ virtual CORBA::ComponentIR::EmitsDef_ptr create_emits (
+ const char *id,
+ const char *name,
+ const char *version,
+ CORBA::ValueDef_ptr value
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS
+ )
+ ACE_THROW_SPEC ((CORBA::SystemException));
+
+ CORBA::ComponentIR::EmitsDef_ptr create_emits_i (
+ const char *id,
+ const char *name,
+ const char *version,
+ CORBA::ValueDef_ptr value
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS
+ )
+ ACE_THROW_SPEC ((CORBA::SystemException));
+
+ virtual CORBA::ComponentIR::PublishesDef_ptr create_publishes (
+ const char *id,
+ const char *name,
+ const char *version,
+ CORBA::ValueDef_ptr value
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS
+ )
+ ACE_THROW_SPEC ((CORBA::SystemException));
+
+ CORBA::ComponentIR::PublishesDef_ptr create_publishes_i (
+ const char *id,
+ const char *name,
+ const char *version,
+ CORBA::ValueDef_ptr value
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS
+ )
+ ACE_THROW_SPEC ((CORBA::SystemException));
+
+ virtual CORBA::ComponentIR::ConsumesDef_ptr create_consumes (
+ const char *id,
+ const char *name,
+ const char *version,
+ CORBA::ValueDef_ptr value
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS
+ )
+ ACE_THROW_SPEC ((CORBA::SystemException));
+
+ CORBA::ComponentIR::ConsumesDef_ptr create_consumes_i (
+ const char *id,
+ const char *name,
+ const char *version,
+ CORBA::ValueDef_ptr value
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS
+ )
+ ACE_THROW_SPEC ((CORBA::SystemException));
+
+ static int name_clash (const char *name);
+ // Called from TAO_IFR_Service_Utils::name_exists() when we
+ // are a base component.
+};
+
+TAO_END_VERSIONED_NAMESPACE_DECL
+
+#if defined(_MSC_VER)
+#pragma warning(pop)
+#endif /* _MSC_VER */
+
+#endif /* TAO_COMPONENTDEF_I_H */
+
+
+
diff --git a/TAO/orbsvcs/orbsvcs/IFRService/ComponentModuleDef_i.cpp b/TAO/orbsvcs/orbsvcs/IFRService/ComponentModuleDef_i.cpp
new file mode 100644
index 00000000000..474f85baf57
--- /dev/null
+++ b/TAO/orbsvcs/orbsvcs/IFRService/ComponentModuleDef_i.cpp
@@ -0,0 +1,23 @@
+// $Id$
+
+#include "orbsvcs/IFRService/ComponentModuleDef_i.h"
+
+ACE_RCSID (IFRService,
+ ComponentModuleDef_i,
+ "$Id$")
+
+
+TAO_BEGIN_VERSIONED_NAMESPACE_DECL
+
+TAO_ComponentModuleDef_i::TAO_ComponentModuleDef_i (TAO_Repository_i *repo)
+ : TAO_IRObject_i (repo),
+ TAO_Container_i (repo),
+ TAO_ComponentContainer_i (repo)
+{
+}
+
+TAO_ComponentModuleDef_i::~TAO_ComponentModuleDef_i (void)
+{
+}
+
+TAO_END_VERSIONED_NAMESPACE_DECL
diff --git a/TAO/orbsvcs/orbsvcs/IFRService/ComponentModuleDef_i.h b/TAO/orbsvcs/orbsvcs/IFRService/ComponentModuleDef_i.h
new file mode 100644
index 00000000000..6556910861c
--- /dev/null
+++ b/TAO/orbsvcs/orbsvcs/IFRService/ComponentModuleDef_i.h
@@ -0,0 +1,63 @@
+// -*- C++ -*-
+
+// $Id$
+
+// ============================================================================
+//
+// = LIBRARY
+// TAO/orbsvcs/orbsvcs/IFRService
+//
+// = FILENAME
+// ComponentModuleDef_i.h
+//
+// = DESCRIPTION
+// ComponentModuleDef_i servant class.
+//
+// = AUTHOR
+// Jeff Parsons <j.parsons@vanderbilt.edu>
+//
+// ============================================================================
+
+#ifndef TAO_COMPONENTMODULEDEF_I_H
+#define TAO_COMPONENTMODULEDEF_I_H
+
+#include "orbsvcs/IFRService/ComponentContainer_i.h"
+#include "orbsvcs/IFRService/ifr_service_export.h"
+
+#if !defined (ACE_LACKS_PRAGMA_ONCE)
+# pragma once
+#endif /* ACE_LACKS_PRAGMA_ONCE */
+
+#if defined(_MSC_VER)
+#pragma warning(push)
+#pragma warning(disable:4250)
+#endif /* _MSC_VER */
+
+TAO_BEGIN_VERSIONED_NAMESPACE_DECL
+
+class TAO_IFRService_Export TAO_ComponentModuleDef_i
+ : public virtual TAO_ComponentContainer_i
+{
+ // = TITLE
+ // TAO_ComponentModuleDef_i
+ //
+ // = DESCRIPTION
+ // Represents a module definition that may contain Component-related
+ // types.
+ //
+public:
+ TAO_ComponentModuleDef_i (TAO_Repository_i *repo);
+ // Constructor
+
+ virtual ~TAO_ComponentModuleDef_i (void);
+ // Destructor
+};
+
+TAO_END_VERSIONED_NAMESPACE_DECL
+
+#if defined(_MSC_VER)
+#pragma warning(pop)
+#endif /* _MSC_VER */
+
+#endif /* TAO_MODULEDEF_I_H */
+
diff --git a/TAO/orbsvcs/orbsvcs/IFRService/ComponentRepository_i.cpp b/TAO/orbsvcs/orbsvcs/IFRService/ComponentRepository_i.cpp
new file mode 100644
index 00000000000..f0efb71adb1
--- /dev/null
+++ b/TAO/orbsvcs/orbsvcs/IFRService/ComponentRepository_i.cpp
@@ -0,0 +1,245 @@
+/* -*- C++ -*- */
+// $Id$
+
+#include "orbsvcs/IFRService/ComponentRepository_i.h"
+#include "orbsvcs/IFRService/ModuleDef_i.h"
+#include "orbsvcs/IFRService/ComponentDef_i.h"
+#include "orbsvcs/IFRService/HomeDef_i.h"
+#include "orbsvcs/IFRService/EventDef_i.h"
+#include "orbsvcs/IFRService/FinderDef_i.h"
+#include "orbsvcs/IFRService/FactoryDef_i.h"
+#include "orbsvcs/IFRService/EmitsDef_i.h"
+#include "orbsvcs/IFRService/PublishesDef_i.h"
+#include "orbsvcs/IFRService/ConsumesDef_i.h"
+#include "orbsvcs/IFRService/ProvidesDef_i.h"
+#include "orbsvcs/IFRService/UsesDef_i.h"
+
+ACE_RCSID (IFRService,
+ ComponentRepository_i,
+ "$Id$")
+
+
+TAO_BEGIN_VERSIONED_NAMESPACE_DECL
+
+TAO_ComponentRepository_i::TAO_ComponentRepository_i (
+ CORBA::ORB_ptr orb,
+ PortableServer::POA_ptr poa,
+ ACE_Configuration *config
+ )
+ : TAO_IRObject_i (0),
+ TAO_Container_i (0),
+ TAO_Repository_i (orb,
+ poa,
+ config),
+ TAO_ComponentContainer_i (0)
+{
+}
+
+TAO_ComponentRepository_i::~TAO_ComponentRepository_i (void)
+{
+}
+
+int
+TAO_ComponentRepository_i::create_servants_and_poas (
+ ACE_ENV_SINGLE_ARG_DECL
+ )
+{
+ int status =
+ this->TAO_Repository_i::create_servants_and_poas (
+ ACE_ENV_SINGLE_ARG_PARAMETER
+ );
+ ACE_CHECK_RETURN (-1);
+
+ if (status != 0)
+ {
+ return -1;
+ }
+
+ CORBA::PolicyList policies (5);
+ policies.length (5);
+
+ // ID Assignment Policy.
+ policies[0] =
+ this->root_poa_->create_id_assignment_policy (PortableServer::USER_ID
+ ACE_ENV_ARG_PARAMETER);
+ ACE_CHECK_RETURN (-1);
+
+ // Lifespan Policy.
+ policies[1] =
+ this->root_poa_->create_lifespan_policy (PortableServer::PERSISTENT
+ ACE_ENV_ARG_PARAMETER);
+ ACE_CHECK_RETURN (-1);
+
+ // Request Processing Policy.
+ policies[2] =
+ this->root_poa_->create_request_processing_policy (
+ PortableServer::USE_DEFAULT_SERVANT
+ ACE_ENV_ARG_PARAMETER
+ );
+ ACE_CHECK_RETURN (-1);
+
+ // Servant Retention Policy.
+ policies[3] =
+ this->root_poa_->create_servant_retention_policy (
+ PortableServer::NON_RETAIN
+ ACE_ENV_ARG_PARAMETER
+ );
+ ACE_CHECK_RETURN (-1);
+
+ // Id Uniqueness Policy.
+ policies[4] =
+ this->root_poa_->create_id_uniqueness_policy (
+ PortableServer::MULTIPLE_ID
+ ACE_ENV_ARG_PARAMETER
+ );
+ ACE_CHECK_RETURN (-1);
+
+ PortableServer::POAManager_var poa_manager =
+ this->root_poa_->the_POAManager (ACE_ENV_SINGLE_ARG_PARAMETER);
+ ACE_CHECK_RETURN (-1);
+
+#define GEN_IR_OBJECT(name) \
+ this-> name ## _poa_ = \
+ this->root_poa_->create_POA (#name "_poa", \
+ poa_manager.in (), \
+ policies \
+ ACE_ENV_ARG_PARAMETER); \
+ ACE_CHECK_RETURN (-1); \
+ TAO_ ## name ## _i * name ## _impl = 0; \
+ ACE_NEW_RETURN (name ## _impl, \
+ TAO_ ## name ## _i (this), \
+ -1); \
+ ACE_NEW_RETURN (this-> name ## _servant_, \
+ POA_CORBA::ComponentIR:: name ## _tie<TAO_ ## name ## _i> ( \
+ name ## _impl, \
+ this-> name ## _poa_.in (), \
+ 1 \
+ ), \
+ -1); \
+ PortableServer::ServantBase_var name ## _safety ( \
+ this-> name ## _servant_ \
+ ); \
+ this-> name ## _poa_->set_servant (this-> name ## _servant_ \
+ ACE_ENV_ARG_PARAMETER); \
+ ACE_CHECK_RETURN (-1);
+
+ CONCRETE_IR_OBJECT_TYPES
+
+#undef GEN_IR_OBJECT
+#undef CONCRETE_IR_OBJECT_TYPES
+
+ CORBA::ULong length = policies.length ();
+
+ for (CORBA::ULong i = 0; i < length; ++i)
+ {
+ CORBA::Policy_ptr policy = policies[i];
+ policy->destroy (ACE_ENV_SINGLE_ARG_PARAMETER);
+ ACE_CHECK_RETURN (-1);
+ }
+
+ return 0;
+}
+
+TAO_IDLType_i *
+TAO_ComponentRepository_i::select_idltype (
+ CORBA::DefinitionKind def_kind
+ ) const
+{
+ switch (def_kind)
+ {
+ case CORBA::dk_Component:
+ return this->ComponentDef_servant_->_tied_object ();
+ case CORBA::dk_Home:
+ return this->HomeDef_servant_->_tied_object ();
+ default:
+ return this->TAO_Repository_i::select_idltype (def_kind);
+ }
+}
+
+TAO_Container_i *
+TAO_ComponentRepository_i::select_container (
+ CORBA::DefinitionKind def_kind
+ ) const
+{
+ switch (def_kind)
+ {
+ case CORBA::dk_Module:
+ return this->ModuleDef_servant_->_tied_object ();
+ case CORBA::dk_Component:
+ return this->ComponentDef_servant_->_tied_object ();
+ case CORBA::dk_Home:
+ return this->HomeDef_servant_->_tied_object ();
+ default:
+ return this->TAO_Repository_i::select_container (def_kind);
+ }
+}
+
+TAO_Contained_i *
+TAO_ComponentRepository_i::select_contained (
+ CORBA::DefinitionKind def_kind
+ ) const
+{
+ switch (def_kind)
+ {
+ case CORBA::dk_Module:
+ return this->ModuleDef_servant_->_tied_object ();
+ case CORBA::dk_Component:
+ return this->ComponentDef_servant_->_tied_object ();
+ case CORBA::dk_Home:
+ return this->HomeDef_servant_->_tied_object ();
+ case CORBA::dk_Finder:
+ return this->FinderDef_servant_->_tied_object ();
+ case CORBA::dk_Factory:
+ return this->FactoryDef_servant_->_tied_object ();
+ case CORBA::dk_Event:
+ return this->EventDef_servant_->_tied_object ();
+ case CORBA::dk_Emits:
+ return this->EmitsDef_servant_->_tied_object ();
+ case CORBA::dk_Publishes:
+ return this->PublishesDef_servant_->_tied_object ();
+ case CORBA::dk_Consumes:
+ return this->ConsumesDef_servant_->_tied_object ();
+ case CORBA::dk_Provides:
+ return this->ProvidesDef_servant_->_tied_object ();
+ case CORBA::dk_Uses:
+ return this->UsesDef_servant_->_tied_object ();
+ default:
+ return this->TAO_Repository_i::select_contained (def_kind);
+ }
+}
+
+PortableServer::POA_ptr
+TAO_ComponentRepository_i::select_poa (
+ CORBA::DefinitionKind def_kind
+ ) const
+{
+ switch (def_kind)
+ {
+ case CORBA::dk_Module:
+ return this->ModuleDef_poa_.in ();
+ case CORBA::dk_Component:
+ return this->ComponentDef_poa_.in ();
+ case CORBA::dk_Home:
+ return this->HomeDef_poa_.in ();
+ case CORBA::dk_Finder:
+ return this->FinderDef_poa_.in ();
+ case CORBA::dk_Factory:
+ return this->FactoryDef_poa_.in ();
+ case CORBA::dk_Event:
+ return this->EventDef_poa_.in ();
+ case CORBA::dk_Emits:
+ return this->EmitsDef_poa_.in ();
+ case CORBA::dk_Publishes:
+ return this->PublishesDef_poa_.in ();
+ case CORBA::dk_Consumes:
+ return this->ConsumesDef_poa_.in ();
+ case CORBA::dk_Provides:
+ return this->ProvidesDef_poa_.in ();
+ case CORBA::dk_Uses:
+ return this->UsesDef_poa_.in ();
+ default:
+ return this->TAO_Repository_i::select_poa (def_kind);
+ }
+}
+
+TAO_END_VERSIONED_NAMESPACE_DECL
diff --git a/TAO/orbsvcs/orbsvcs/IFRService/ComponentRepository_i.h b/TAO/orbsvcs/orbsvcs/IFRService/ComponentRepository_i.h
new file mode 100644
index 00000000000..7690ee20edc
--- /dev/null
+++ b/TAO/orbsvcs/orbsvcs/IFRService/ComponentRepository_i.h
@@ -0,0 +1,129 @@
+// -*- C++ -*-
+
+// $Id$
+
+// ============================================================================
+//
+// = LIBRARY
+// TAO/orbsvcs/orbsvcs/IFRService
+//
+// = FILENAME
+// ComponentRepository_i.h
+//
+// = DESCRIPTION
+// ComponentRepository servant class.
+//
+// = AUTHOR
+// Jeff Parsons <j.parsons@vanderbiltl.edu>
+//
+// ============================================================================
+
+#ifndef TAO_COMPONENTREPOSITORY_I_H
+#define TAO_COMPONENTREPOSITORY_I_H
+
+#include "orbsvcs/IFRService/Repository_i.h"
+#include "orbsvcs/IFRService/ifr_service_export.h"
+
+#if !defined (ACE_LACKS_PRAGMA_ONCE)
+# pragma once
+#endif /* ACE_LACKS_PRAGMA_ONCE */
+
+#include "orbsvcs/IFRService/ComponentContainer_i.h"
+
+
+TAO_BEGIN_VERSIONED_NAMESPACE_DECL
+
+class TAO_ModuleDef_i;
+class TAO_ComponentDef_i;
+class TAO_HomeDef_i;
+class TAO_FinderDef_i;
+class TAO_FactoryDef_i;
+class TAO_EventDef_i;
+class TAO_EmitsDef_i;
+class TAO_PublishesDef_i;
+class TAO_ConsumesDef_i;
+class TAO_ProvidesDef_i;
+class TAO_UsesDef_i;
+
+#if defined(_MSC_VER)
+#pragma warning(push)
+#pragma warning(disable:4250)
+#endif /* _MSC_VER */
+
+class TAO_IFRService_Export TAO_ComponentRepository_i
+ : public virtual TAO_Repository_i,
+ public virtual TAO_ComponentContainer_i
+{
+ // = TITLE
+ // TAO_ComponentRepository_i
+ //
+ // = DESCRIPTION
+ // Provides global access to the Interface Repository,
+ // including access to information related to
+ // CORBA Components.
+ //
+public:
+ TAO_ComponentRepository_i (CORBA::ORB_ptr orb,
+ PortableServer::POA_ptr poa,
+ ACE_Configuration *config);
+ // Constructor.
+
+ virtual ~TAO_ComponentRepository_i (void);
+ // Destructor.
+
+ virtual int create_servants_and_poas (ACE_ENV_SINGLE_ARG_DECL);
+ // We create a default servant servant for each IR Object
+ // type and its corresponding POA.
+
+ virtual TAO_IDLType_i *select_idltype (
+ CORBA::DefinitionKind def_kind
+ ) const;
+ virtual TAO_Container_i *select_container (
+ CORBA::DefinitionKind def_kind
+ ) const;
+ virtual TAO_Contained_i *select_contained (
+ CORBA::DefinitionKind def_kind
+ ) const;
+ // Return one of our servants for internal use.
+
+ virtual PortableServer::POA_ptr select_poa (
+ CORBA::DefinitionKind def_kind
+ ) const;
+ // Select the right POA for object creation.
+
+protected:
+
+#ifdef CONCRETE_IR_OBJECT_TYPES
+#undef CONCRETE_IR_OBJECT_TYPES
+#endif
+
+#define CONCRETE_IR_OBJECT_TYPES \
+ GEN_IR_OBJECT (ModuleDef) \
+ GEN_IR_OBJECT (ComponentDef) \
+ GEN_IR_OBJECT (HomeDef) \
+ GEN_IR_OBJECT (FinderDef) \
+ GEN_IR_OBJECT (FactoryDef) \
+ GEN_IR_OBJECT (EventDef) \
+ GEN_IR_OBJECT (EmitsDef) \
+ GEN_IR_OBJECT (PublishesDef) \
+ GEN_IR_OBJECT (ConsumesDef) \
+ GEN_IR_OBJECT (ProvidesDef) \
+ GEN_IR_OBJECT (UsesDef)
+
+#define GEN_IR_OBJECT(name) \
+ POA_CORBA::ComponentIR:: name ## _tie<TAO_ ## name ## _i> * name ## _servant_; \
+ PortableServer::POA_var name ## _poa_;
+
+ CONCRETE_IR_OBJECT_TYPES
+
+#undef GEN_IR_OBJECT
+ // Servants for each IR Object type, created at startup.
+};
+
+TAO_END_VERSIONED_NAMESPACE_DECL
+
+#if defined(_MSC_VER)
+#pragma warning(pop)
+#endif /* _MSC_VER */
+
+#endif /* TAO_COMPONENTREPOSITORY_I_H */
diff --git a/TAO/orbsvcs/orbsvcs/IFRService/ConstantDef_i.cpp b/TAO/orbsvcs/orbsvcs/IFRService/ConstantDef_i.cpp
new file mode 100644
index 00000000000..3ca04650d04
--- /dev/null
+++ b/TAO/orbsvcs/orbsvcs/IFRService/ConstantDef_i.cpp
@@ -0,0 +1,313 @@
+// $Id$
+
+#include "orbsvcs/IFRService/ConstantDef_i.h"
+#include "orbsvcs/IFRService/Repository_i.h"
+#include "orbsvcs/IFRService/IFR_Service_Utils.h"
+#include "orbsvcs/IFRService/IDLType_i.h"
+
+#include "tao/AnyTypeCode/Any_Unknown_IDL_Type.h"
+
+#include "ace/Auto_Ptr.h"
+#include "ace/SString.h"
+
+
+ACE_RCSID (IFRService,
+ ConstantDef_i,
+ "$Id$")
+
+
+TAO_BEGIN_VERSIONED_NAMESPACE_DECL
+
+TAO_ConstantDef_i::TAO_ConstantDef_i (
+ TAO_Repository_i *repo
+ )
+ : TAO_IRObject_i (repo),
+ TAO_Contained_i (repo)
+{
+}
+
+TAO_ConstantDef_i::~TAO_ConstantDef_i (void)
+{
+}
+
+CORBA::DefinitionKind
+TAO_ConstantDef_i::def_kind (ACE_ENV_SINGLE_ARG_DECL_NOT_USED)
+ ACE_THROW_SPEC ((CORBA::SystemException))
+{
+ return CORBA::dk_Constant;
+}
+
+CORBA::Contained::Description *
+TAO_ConstantDef_i::describe (ACE_ENV_SINGLE_ARG_DECL)
+ ACE_THROW_SPEC ((CORBA::SystemException))
+{
+ TAO_IFR_READ_GUARD_RETURN (0);
+
+ this->update_key (ACE_ENV_SINGLE_ARG_PARAMETER);
+ ACE_CHECK_RETURN (0);
+
+ return this->describe_i (ACE_ENV_SINGLE_ARG_PARAMETER);
+}
+
+CORBA::Contained::Description *
+TAO_ConstantDef_i::describe_i (ACE_ENV_SINGLE_ARG_DECL)
+ ACE_THROW_SPEC ((CORBA::SystemException))
+{
+ CORBA::Contained::Description *desc_ptr = 0;
+ ACE_NEW_THROW_EX (desc_ptr,
+ CORBA::Contained::Description,
+ CORBA::NO_MEMORY ());
+ ACE_CHECK_RETURN (0);
+
+ CORBA::Contained::Description_var retval = desc_ptr;
+
+ retval->kind = this->def_kind (ACE_ENV_SINGLE_ARG_PARAMETER);
+ ACE_CHECK_RETURN (0);
+
+ CORBA::ConstantDescription cd;
+
+ cd.name = this->name_i (ACE_ENV_SINGLE_ARG_PARAMETER);
+ ACE_CHECK_RETURN (0);
+
+ cd.id = this->id_i (ACE_ENV_SINGLE_ARG_PARAMETER);
+ ACE_CHECK_RETURN (0);
+
+ ACE_TString container_id;
+ this->repo_->config ()->get_string_value (this->section_key_,
+ "container_id",
+ container_id);
+ cd.defined_in = container_id.c_str ();
+
+ cd.version = this->version_i (ACE_ENV_SINGLE_ARG_PARAMETER);
+ ACE_CHECK_RETURN (0);
+
+ cd.type = this->type_i (ACE_ENV_SINGLE_ARG_PARAMETER);
+ ACE_CHECK_RETURN (0);
+
+ CORBA::Any_var val = this->value_i (ACE_ENV_SINGLE_ARG_PARAMETER);
+ ACE_CHECK_RETURN (0);
+
+ cd.value = val.in ();
+
+ retval->value <<= cd;
+ return retval._retn ();
+}
+
+CORBA::TypeCode_ptr
+TAO_ConstantDef_i::type (ACE_ENV_SINGLE_ARG_DECL)
+ ACE_THROW_SPEC ((CORBA::SystemException))
+{
+ TAO_IFR_READ_GUARD_RETURN (CORBA::TypeCode::_nil ());
+
+ this->update_key (ACE_ENV_SINGLE_ARG_PARAMETER);
+ ACE_CHECK_RETURN (CORBA::TypeCode::_nil ());
+
+ return this->type_i (ACE_ENV_SINGLE_ARG_PARAMETER);
+}
+
+CORBA::TypeCode_ptr
+TAO_ConstantDef_i::type_i (ACE_ENV_SINGLE_ARG_DECL)
+ ACE_THROW_SPEC ((CORBA::SystemException))
+{
+ ACE_TString type_path;
+ this->repo_->config ()->get_string_value (this->section_key_,
+ "type_path",
+ type_path);
+
+ TAO_IDLType_i *impl = TAO_IFR_Service_Utils::path_to_idltype (type_path,
+ this->repo_);
+
+ return impl->type_i (ACE_ENV_SINGLE_ARG_PARAMETER);
+}
+
+CORBA::IDLType_ptr
+TAO_ConstantDef_i::type_def (ACE_ENV_SINGLE_ARG_DECL)
+ ACE_THROW_SPEC ((CORBA::SystemException))
+{
+ TAO_IFR_READ_GUARD_RETURN (CORBA::IDLType::_nil ());
+
+ this->update_key (ACE_ENV_SINGLE_ARG_PARAMETER);
+ ACE_CHECK_RETURN (CORBA::IDLType::_nil ());
+
+ return this->type_def_i (ACE_ENV_SINGLE_ARG_PARAMETER);
+}
+
+CORBA::IDLType_ptr
+TAO_ConstantDef_i::type_def_i (ACE_ENV_SINGLE_ARG_DECL)
+ ACE_THROW_SPEC ((CORBA::SystemException))
+{
+ ACE_TString type_path;
+ this->repo_->config ()->get_string_value (this->section_key_,
+ "type_path",
+ type_path);
+
+ CORBA::Object_var obj =
+ TAO_IFR_Service_Utils::path_to_ir_object (type_path,
+ this->repo_
+ ACE_ENV_ARG_PARAMETER);
+ ACE_CHECK_RETURN (CORBA::IDLType::_nil ());
+
+ return CORBA::IDLType::_narrow (obj.in ()
+ ACE_ENV_ARG_PARAMETER);
+}
+
+void
+TAO_ConstantDef_i::type_def (CORBA::IDLType_ptr type_def
+ ACE_ENV_ARG_DECL)
+ ACE_THROW_SPEC ((CORBA::SystemException))
+{
+ TAO_IFR_WRITE_GUARD;
+
+ this->update_key (ACE_ENV_SINGLE_ARG_PARAMETER);
+ ACE_CHECK;
+
+ this->type_def_i (type_def
+ ACE_ENV_ARG_PARAMETER);
+}
+
+void
+TAO_ConstantDef_i::type_def_i (CORBA::IDLType_ptr type_def
+ ACE_ENV_ARG_DECL_NOT_USED)
+ ACE_THROW_SPEC ((CORBA::SystemException))
+{
+ char *type_path = TAO_IFR_Service_Utils::reference_to_path (type_def);
+
+ this->repo_->config ()->set_string_value (this->section_key_,
+ "type_path",
+ type_path);
+}
+
+CORBA::Any *
+TAO_ConstantDef_i::value (ACE_ENV_SINGLE_ARG_DECL)
+ ACE_THROW_SPEC ((CORBA::SystemException))
+{
+ TAO_IFR_READ_GUARD_RETURN (0);
+
+ this->update_key (ACE_ENV_SINGLE_ARG_PARAMETER);
+ ACE_CHECK_RETURN (0);
+
+ return this->value_i (ACE_ENV_SINGLE_ARG_PARAMETER);
+}
+
+CORBA::Any *
+TAO_ConstantDef_i::value_i (ACE_ENV_SINGLE_ARG_DECL)
+ ACE_THROW_SPEC ((CORBA::SystemException))
+{
+ CORBA::TypeCode_var tc = this->type_i (ACE_ENV_SINGLE_ARG_PARAMETER);
+ ACE_CHECK_RETURN (0);
+
+ void *ref = 0;
+ size_t length = 0;
+
+ this->repo_->config ()->get_binary_value (
+ this->section_key_,
+ "value",
+ ref,
+ length
+ );
+
+ char *data = static_cast<char *> (ref);
+ ACE_Auto_Basic_Array_Ptr<char> safety (data);
+
+ ACE_Message_Block mb (data,
+ length);
+ mb.length (length);
+ TAO_InputCDR in_cdr (&mb);
+
+ CORBA::Any *retval = 0;
+ ACE_NEW_THROW_EX (retval,
+ CORBA::Any,
+ CORBA::NO_MEMORY ());
+ ACE_CHECK_RETURN (0);
+
+ TAO::Unknown_IDL_Type *impl = 0;
+ ACE_NEW_THROW_EX (impl,
+ TAO::Unknown_IDL_Type (tc.in (),
+ in_cdr),
+ CORBA::NO_MEMORY ());
+ ACE_CHECK_RETURN (0);
+
+ retval->replace (impl);
+ safety.release ();
+ return retval;
+}
+
+void
+TAO_ConstantDef_i::value (const CORBA::Any &value
+ ACE_ENV_ARG_DECL)
+ ACE_THROW_SPEC ((CORBA::SystemException))
+{
+ TAO_IFR_WRITE_GUARD;
+
+ this->update_key (ACE_ENV_SINGLE_ARG_PARAMETER);
+ ACE_CHECK;
+
+ this->value_i (value
+ ACE_ENV_ARG_PARAMETER);
+}
+
+void
+TAO_ConstantDef_i::value_i (const CORBA::Any &value
+ ACE_ENV_ARG_DECL)
+ ACE_THROW_SPEC ((CORBA::SystemException))
+{
+ CORBA::TypeCode_var my_tc =
+ this->type_i (ACE_ENV_SINGLE_ARG_PARAMETER);
+ ACE_CHECK;
+
+ CORBA::TypeCode_var val_tc = value.type ();
+
+ CORBA::Boolean const equal_tc =
+ my_tc.in ()->equal (val_tc.in ()
+ ACE_ENV_ARG_PARAMETER);
+ ACE_CHECK;
+
+ if (!equal_tc)
+ {
+ return;
+ }
+
+ ACE_Message_Block *mb = 0;
+ TAO::Any_Impl *impl = value.impl ();
+
+ if (impl->encoded ())
+ {
+ TAO::Unknown_IDL_Type *unk =
+ dynamic_cast<TAO::Unknown_IDL_Type *> (impl);
+
+ mb = unk->_tao_get_cdr ().steal_contents ();
+ }
+ else
+ {
+ TAO_OutputCDR out;
+ impl->marshal_value (out);
+ TAO_InputCDR in (out);
+ mb = in.steal_contents ();
+ }
+
+ CORBA::TCKind kind = val_tc->kind (ACE_ENV_SINGLE_ARG_PARAMETER);
+ ACE_CHECK;
+
+ switch (kind)
+ {
+ // The data for these types will be aligned to an 8-byte
+ // boundary, while the rd_ptr may not.
+ case CORBA::tk_double:
+ case CORBA::tk_ulonglong:
+ case CORBA::tk_longlong:
+ case CORBA::tk_longdouble:
+ mb->rd_ptr (ACE_ptr_align_binary (mb->rd_ptr (),
+ ACE_CDR::MAX_ALIGNMENT));
+ break;
+ default:
+ break;
+ }
+
+ mb->crunch ();
+ this->repo_->config ()->set_binary_value (this->section_key_,
+ "value",
+ mb->base (),
+ mb->length ());
+}
+
+TAO_END_VERSIONED_NAMESPACE_DECL
diff --git a/TAO/orbsvcs/orbsvcs/IFRService/ConstantDef_i.h b/TAO/orbsvcs/orbsvcs/IFRService/ConstantDef_i.h
new file mode 100644
index 00000000000..f9243f6d58c
--- /dev/null
+++ b/TAO/orbsvcs/orbsvcs/IFRService/ConstantDef_i.h
@@ -0,0 +1,132 @@
+// -*- C++ -*-
+
+// $Id$
+
+// ============================================================================
+//
+// = LIBRARY
+// TAO/orbsvcs/orbsvcs/IFRService
+//
+// = FILENAME
+// ConstantDef_i.h
+//
+// = DESCRIPTION
+// ConstantDef servant class.
+//
+// = AUTHOR
+// Jeff Parsons <parsons@cs.wustl.edu>
+//
+// ============================================================================
+
+#ifndef TAO_CONSTANTDEF_I_H
+#define TAO_CONSTANTDEF_I_H
+
+#include "orbsvcs/IFRService/Contained_i.h"
+#include "orbsvcs/IFRService/ifr_service_export.h"
+
+#if !defined (ACE_LACKS_PRAGMA_ONCE)
+# pragma once
+#endif /* ACE_LACKS_PRAGMA_ONCE */
+
+#if defined(_MSC_VER)
+#pragma warning(push)
+#pragma warning(disable:4250)
+#endif /* _MSC_VER */
+
+TAO_BEGIN_VERSIONED_NAMESPACE_DECL
+
+class TAO_IFRService_Export TAO_ConstantDef_i : public virtual TAO_Contained_i
+{
+ // = TITLE
+ // TAO_ConstantDef_i
+ //
+ // = DESCRIPTION
+ // Represents a named constant.
+ //
+public:
+ TAO_ConstantDef_i (TAO_Repository_i *repo);
+ // Constructor
+
+ virtual ~TAO_ConstantDef_i (void);
+ // Destructor
+
+ virtual CORBA::DefinitionKind def_kind (
+ ACE_ENV_SINGLE_ARG_DECL_WITH_DEFAULTS)
+
+ ACE_THROW_SPEC ((CORBA::SystemException));
+ // Return our definition kind.
+
+ virtual CORBA::Contained::Description *describe (
+ ACE_ENV_SINGLE_ARG_DECL_WITH_DEFAULTS)
+
+ ACE_THROW_SPEC ((CORBA::SystemException));
+ // From Contained_i's pure virtual function.
+
+ virtual CORBA::Contained::Description *describe_i (
+ ACE_ENV_SINGLE_ARG_DECL_WITH_DEFAULTS)
+
+ ACE_THROW_SPEC ((CORBA::SystemException));
+ // From Contained_i's pure virtual function.
+
+ virtual CORBA::TypeCode_ptr type (
+ ACE_ENV_SINGLE_ARG_DECL_WITH_DEFAULTS)
+
+ ACE_THROW_SPEC ((CORBA::SystemException));
+
+ CORBA::TypeCode_ptr type_i (
+ ACE_ENV_SINGLE_ARG_DECL_WITH_DEFAULTS)
+
+ ACE_THROW_SPEC ((CORBA::SystemException));
+
+ virtual CORBA::IDLType_ptr type_def (
+ ACE_ENV_SINGLE_ARG_DECL_WITH_DEFAULTS)
+
+ ACE_THROW_SPEC ((CORBA::SystemException));
+
+ CORBA::IDLType_ptr type_def_i (
+ ACE_ENV_SINGLE_ARG_DECL_WITH_DEFAULTS)
+
+ ACE_THROW_SPEC ((CORBA::SystemException));
+
+ virtual void type_def (
+ CORBA::IDLType_ptr type_def
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS)
+
+ ACE_THROW_SPEC ((CORBA::SystemException));
+
+ void type_def_i (
+ CORBA::IDLType_ptr type_def
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS)
+
+ ACE_THROW_SPEC ((CORBA::SystemException));
+
+ virtual CORBA::Any *value (
+ ACE_ENV_SINGLE_ARG_DECL_WITH_DEFAULTS)
+
+ ACE_THROW_SPEC ((CORBA::SystemException));
+
+ CORBA::Any *value_i (
+ ACE_ENV_SINGLE_ARG_DECL_WITH_DEFAULTS)
+
+ ACE_THROW_SPEC ((CORBA::SystemException));
+
+ virtual void value (
+ const CORBA::Any &value
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS)
+
+ ACE_THROW_SPEC ((CORBA::SystemException));
+
+ void value_i (
+ const CORBA::Any &value
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS)
+
+ ACE_THROW_SPEC ((CORBA::SystemException));
+};
+
+TAO_END_VERSIONED_NAMESPACE_DECL
+
+#if defined(_MSC_VER)
+#pragma warning(pop)
+#endif /* _MSC_VER */
+
+#endif /* TAO_CONSTANTDEF_I_H */
diff --git a/TAO/orbsvcs/orbsvcs/IFRService/ConsumesDef_i.cpp b/TAO/orbsvcs/orbsvcs/IFRService/ConsumesDef_i.cpp
new file mode 100644
index 00000000000..0b6b8311b7e
--- /dev/null
+++ b/TAO/orbsvcs/orbsvcs/IFRService/ConsumesDef_i.cpp
@@ -0,0 +1,34 @@
+// -*- C++ -*-
+
+// $Id$
+
+#include "orbsvcs/IFRService/Repository_i.h"
+#include "orbsvcs/IFRService/ConsumesDef_i.h"
+
+ACE_RCSID (IFRService,
+ ConsumesDef_i,
+ "$Id$")
+
+TAO_BEGIN_VERSIONED_NAMESPACE_DECL
+
+TAO_ConsumesDef_i::TAO_ConsumesDef_i (
+ TAO_Repository_i *repo
+ )
+ : TAO_IRObject_i (repo),
+ TAO_Contained_i (repo),
+ TAO_EventPortDef_i (repo)
+{
+}
+
+TAO_ConsumesDef_i::~TAO_ConsumesDef_i (void)
+{
+}
+
+CORBA::DefinitionKind
+TAO_ConsumesDef_i::def_kind (ACE_ENV_SINGLE_ARG_DECL_NOT_USED)
+ ACE_THROW_SPEC ((CORBA::SystemException))
+{
+ return CORBA::dk_Consumes;
+}
+
+TAO_END_VERSIONED_NAMESPACE_DECL
diff --git a/TAO/orbsvcs/orbsvcs/IFRService/ConsumesDef_i.h b/TAO/orbsvcs/orbsvcs/IFRService/ConsumesDef_i.h
new file mode 100644
index 00000000000..2bbbef43916
--- /dev/null
+++ b/TAO/orbsvcs/orbsvcs/IFRService/ConsumesDef_i.h
@@ -0,0 +1,68 @@
+// -*- C++ -*-
+
+// $Id$
+
+// ============================================================================
+//
+// = LIBRARY
+// TAO/orbsvcs/orbsvcs/IFRService
+//
+// = FILENAME
+// ConsumesDef_i.h
+//
+// = DESCRIPTION
+// ConsumesDef servant class.
+//
+// = AUTHOR
+// Jeff Parsons <parsons@cs.wustl.edu>
+//
+// ============================================================================
+
+#ifndef TAO_CONSUMESDEF_I_H
+#define TAO_CONSUMESDEF_I_H
+
+#include "orbsvcs/IFRService/EventPortDef_i.h"
+#include "orbsvcs/IFRService/ifr_service_export.h"
+
+#if !defined (ACE_LACKS_PRAGMA_ONCE)
+# pragma once
+#endif /* ACE_LACKS_PRAGMA_ONCE */
+
+#if defined(_MSC_VER)
+#pragma warning(push)
+#pragma warning(disable:4250)
+#endif /* _MSC_VER */
+
+TAO_BEGIN_VERSIONED_NAMESPACE_DECL
+
+class TAO_IFRService_Export TAO_ConsumesDef_i
+ : public virtual TAO_EventPortDef_i
+{
+ // = TITLE
+ // TAO_ConsumesDef_i
+ //
+ // = DESCRIPTION
+ // Represents the definition of an event that is consumed
+ // by a component.
+ //
+public:
+ TAO_ConsumesDef_i (TAO_Repository_i *repo);
+ // Constructor
+
+ virtual ~TAO_ConsumesDef_i (void);
+ // Destructor
+
+ virtual CORBA::DefinitionKind def_kind (
+ ACE_ENV_SINGLE_ARG_DECL_WITH_DEFAULTS
+ )
+ ACE_THROW_SPEC ((CORBA::SystemException));
+ // Return our definition kind.
+};
+
+TAO_END_VERSIONED_NAMESPACE_DECL
+
+#if defined(_MSC_VER)
+#pragma warning(pop)
+#endif /* _MSC_VER */
+
+#endif /* TAO_CONSUMESDEF_I_H */
diff --git a/TAO/orbsvcs/orbsvcs/IFRService/Contained_i.cpp b/TAO/orbsvcs/orbsvcs/IFRService/Contained_i.cpp
new file mode 100644
index 00000000000..b61b34ea4a1
--- /dev/null
+++ b/TAO/orbsvcs/orbsvcs/IFRService/Contained_i.cpp
@@ -0,0 +1,1259 @@
+// $Id$
+
+#include "orbsvcs/IFRService/concrete_classes.h"
+#include "orbsvcs/IFRService/Repository_i.h"
+#include "orbsvcs/IFRService/IFR_Service_Utils.h"
+#include "ace/Auto_Ptr.h"
+#include "ace/SString.h"
+
+
+ACE_RCSID (IFRService,
+ Contained_i,
+ "$Id$")
+
+
+TAO_BEGIN_VERSIONED_NAMESPACE_DECL
+
+const char *TAO_Contained_i::tmp_name_holder_ = 0;
+
+TAO_Contained_i::TAO_Contained_i (
+ TAO_Repository_i *repo
+ )
+ : TAO_IRObject_i (repo)
+{
+}
+
+TAO_Contained_i::~TAO_Contained_i (void)
+{
+}
+
+void
+TAO_Contained_i::destroy (ACE_ENV_SINGLE_ARG_DECL)
+ ACE_THROW_SPEC ((CORBA::SystemException))
+{
+ TAO_IFR_WRITE_GUARD;
+
+ this->update_key (ACE_ENV_SINGLE_ARG_PARAMETER);
+ ACE_CHECK;
+
+ this->destroy_i (ACE_ENV_SINGLE_ARG_PARAMETER);
+}
+
+void
+TAO_Contained_i::destroy_i (ACE_ENV_SINGLE_ARG_DECL_NOT_USED)
+ ACE_THROW_SPEC ((CORBA::SystemException))
+{
+ ACE_TString id;
+ this->repo_->config ()->get_string_value (this->section_key_,
+ "id",
+ id);
+
+ // We'll get the last segment of this below.
+ ACE_TString path;
+ this->repo_->config ()->get_string_value (this->repo_->repo_ids_key (),
+ id.c_str (),
+ path);
+
+ // Remove the repo id.
+ this->repo_->config ()->remove_value (this->repo_->repo_ids_key (),
+ id.c_str ());
+
+ // Remove the database entry.
+ ACE_TString container_id;
+ ACE_Configuration_Section_Key parent_key;
+
+ this->repo_->config ()->get_string_value (this->section_key_,
+ "container_id",
+ container_id);
+
+ if (container_id == "")
+ {
+ parent_key = this->repo_->root_key ();
+ }
+ else
+ {
+ ACE_TString parent_path;
+ this->repo_->config ()->get_string_value (this->repo_->repo_ids_key (),
+ container_id.c_str (),
+ parent_path);
+
+ this->repo_->config ()->expand_path (this->repo_->root_key (),
+ parent_path,
+ parent_key,
+ 0);
+ }
+
+ ACE_Configuration_Section_Key defns_key;
+ this->repo_->config ()->open_section (parent_key,
+ "defns",
+ 0,
+ defns_key);
+
+ ACE_TString last_seg = path.substr (path.rfind ('\\') + 1);
+ this->repo_->config ()->remove_section (defns_key,
+ last_seg.c_str (),
+ 1);
+}
+
+char *
+TAO_Contained_i::id (ACE_ENV_SINGLE_ARG_DECL)
+ ACE_THROW_SPEC ((CORBA::SystemException))
+{
+ TAO_IFR_READ_GUARD_RETURN (0);
+
+ this->update_key (ACE_ENV_SINGLE_ARG_PARAMETER);
+ ACE_CHECK_RETURN (0);
+
+ return this->id_i (ACE_ENV_SINGLE_ARG_PARAMETER);
+}
+
+char *
+TAO_Contained_i::id_i (ACE_ENV_SINGLE_ARG_DECL_NOT_USED)
+ ACE_THROW_SPEC ((CORBA::SystemException))
+{
+ ACE_TString retval;
+ this->repo_->config ()->get_string_value (this->section_key_,
+ "id",
+ retval);
+
+ return CORBA::string_dup (retval.c_str ());
+}
+
+void
+TAO_Contained_i::id (const char *id
+ ACE_ENV_ARG_DECL)
+ ACE_THROW_SPEC ((CORBA::SystemException))
+{
+ TAO_IFR_WRITE_GUARD;
+
+ this->update_key (ACE_ENV_SINGLE_ARG_PARAMETER);
+ ACE_CHECK;
+
+ this->id_i (id
+ ACE_ENV_ARG_PARAMETER);
+}
+
+void
+TAO_Contained_i::id_i (const char *id
+ ACE_ENV_ARG_DECL)
+ ACE_THROW_SPEC ((CORBA::SystemException))
+{
+ ACE_TString tmp;
+ if (this->repo_->config ()->get_string_value (
+ this->repo_->repo_ids_key (),
+ id,
+ tmp
+ )
+ == 0)
+ {
+ // Repository id already exists.
+ ACE_THROW (CORBA::BAD_PARAM (CORBA::OMGVMCID | 2,
+ CORBA::COMPLETED_NO));
+ }
+
+ // Get the old id.
+ ACE_TString old_id;
+ this->repo_->config ()->get_string_value (this->section_key_,
+ "id",
+ old_id);
+
+ ACE_TString path;
+
+ // Fetch our path.
+ this->repo_->config ()->get_string_value (this->repo_->repo_ids_key (),
+ old_id.c_str (),
+ path);
+
+ // Remove the old id.
+ this->repo_->config ()->remove_value (this->repo_->repo_ids_key (),
+ old_id.c_str ());
+
+ // Save our path under the new id.
+ this->repo_->config ()->set_string_value (this->repo_->repo_ids_key (),
+ id,
+ path);
+
+ // Store the new id locally as well.
+ this->repo_->config ()->set_string_value (this->section_key_,
+ "id",
+ id);
+}
+
+char *
+TAO_Contained_i::name (ACE_ENV_SINGLE_ARG_DECL)
+ ACE_THROW_SPEC ((CORBA::SystemException))
+{
+ TAO_IFR_READ_GUARD_RETURN (0);
+
+ this->update_key (ACE_ENV_SINGLE_ARG_PARAMETER);
+ ACE_CHECK_RETURN (0);
+
+ return this->name_i (ACE_ENV_SINGLE_ARG_PARAMETER);
+}
+
+char *
+TAO_Contained_i::name_i (ACE_ENV_SINGLE_ARG_DECL_NOT_USED)
+ ACE_THROW_SPEC ((CORBA::SystemException))
+{
+ ACE_TString retval;
+ this->repo_->config ()->get_string_value (this->section_key_,
+ "name",
+ retval);
+
+ return CORBA::string_dup (retval.c_str ());
+}
+
+char *
+TAO_Contained_i::version (ACE_ENV_SINGLE_ARG_DECL)
+ ACE_THROW_SPEC ((CORBA::SystemException))
+{
+ TAO_IFR_READ_GUARD_RETURN (0);
+
+ this->update_key (ACE_ENV_SINGLE_ARG_PARAMETER);
+ ACE_CHECK_RETURN (0);
+
+ return this->version_i (ACE_ENV_SINGLE_ARG_PARAMETER);
+}
+
+char *
+TAO_Contained_i::version_i (ACE_ENV_SINGLE_ARG_DECL_NOT_USED)
+ ACE_THROW_SPEC ((CORBA::SystemException))
+{
+ ACE_TString retval;
+ this->repo_->config ()->get_string_value (this->section_key_,
+ "version",
+ retval);
+
+ return CORBA::string_dup (retval.c_str ());
+}
+
+void
+TAO_Contained_i::name (const char *name
+ ACE_ENV_ARG_DECL)
+ ACE_THROW_SPEC ((CORBA::SystemException))
+{
+ TAO_IFR_WRITE_GUARD;
+
+ this->update_key (ACE_ENV_SINGLE_ARG_PARAMETER);
+ ACE_CHECK;
+
+ this->name_i (name
+ ACE_ENV_ARG_PARAMETER);
+}
+
+void
+TAO_Contained_i::name_i (const char *name
+ ACE_ENV_ARG_DECL)
+ ACE_THROW_SPEC ((CORBA::SystemException))
+{
+ // Check if name already exists in this container.
+ CORBA::Boolean exists = this->name_exists (name
+ ACE_ENV_ARG_PARAMETER);
+ ACE_CHECK;
+
+ if (exists)
+ {
+ ACE_THROW (CORBA::BAD_PARAM (CORBA::OMGVMCID | 3,
+ CORBA::COMPLETED_NO));
+ }
+
+ // Reset the local name.
+ this->repo_->config ()->set_string_value (this->section_key_,
+ "name",
+ name);
+
+ // Update the absolute name.
+ ACE_TString absolute_name;
+ this->repo_->config ()->get_string_value (this->section_key_,
+ "absolute_name",
+ absolute_name);
+
+ absolute_name = absolute_name.substr (0, absolute_name.rfind (':') + 1);
+ absolute_name += name;
+
+ this->repo_->config ()->set_string_value (this->section_key_,
+ "absolute_name",
+ absolute_name);
+
+ this->contents_name_update (absolute_name,
+ this->section_key_);
+}
+
+void
+TAO_Contained_i::version (const char *version
+ ACE_ENV_ARG_DECL)
+ ACE_THROW_SPEC ((CORBA::SystemException))
+{
+ TAO_IFR_WRITE_GUARD;
+
+ this->update_key (ACE_ENV_SINGLE_ARG_PARAMETER);
+ ACE_CHECK;
+
+ this->version_i (version
+ ACE_ENV_ARG_PARAMETER);
+}
+
+void
+TAO_Contained_i::version_i (const char *version
+ ACE_ENV_ARG_DECL_NOT_USED)
+ ACE_THROW_SPEC ((CORBA::SystemException))
+{
+ this->repo_->config ()->set_string_value (this->section_key_,
+ "version",
+ version);
+}
+
+CORBA::Container_ptr
+TAO_Contained_i::defined_in (ACE_ENV_SINGLE_ARG_DECL)
+ ACE_THROW_SPEC ((CORBA::SystemException))
+{
+ TAO_IFR_READ_GUARD_RETURN (CORBA::Container::_nil ());
+
+ this->update_key (ACE_ENV_SINGLE_ARG_PARAMETER);
+ ACE_CHECK_RETURN (CORBA::Container::_nil ());
+
+ return this->defined_in_i (ACE_ENV_SINGLE_ARG_PARAMETER);
+}
+
+CORBA::Container_ptr
+TAO_Contained_i::defined_in_i (ACE_ENV_SINGLE_ARG_DECL)
+ ACE_THROW_SPEC ((CORBA::SystemException))
+{
+ ACE_TString container_id;
+ this->repo_->config ()->get_string_value (this->section_key_,
+ "container_id",
+ container_id);
+
+ if (container_id == "")
+ {
+ // The repository itself is our container.
+ return this->repo_->repo_objref ();
+ }
+
+ ACE_TString container_path;
+ this->repo_->config ()->get_string_value (this->repo_->repo_ids_key (),
+ container_id.c_str (),
+ container_path);
+
+ CORBA::Object_var obj =
+ TAO_IFR_Service_Utils::path_to_ir_object (container_path,
+ this->repo_
+ ACE_ENV_ARG_PARAMETER);
+ ACE_CHECK_RETURN (CORBA::Container::_nil ());
+
+ CORBA::Container_var retval = CORBA::Container::_narrow (obj.in ()
+ ACE_ENV_ARG_PARAMETER);
+ ACE_CHECK_RETURN (CORBA::Container::_nil ());
+
+ return retval._retn ();
+}
+
+char *
+TAO_Contained_i::absolute_name (ACE_ENV_SINGLE_ARG_DECL)
+ ACE_THROW_SPEC ((CORBA::SystemException))
+{
+ TAO_IFR_READ_GUARD_RETURN (0);
+
+ this->update_key (ACE_ENV_SINGLE_ARG_PARAMETER);
+ ACE_CHECK_RETURN (0);
+
+ return this->absolute_name_i (ACE_ENV_SINGLE_ARG_PARAMETER);
+}
+
+char *
+TAO_Contained_i::absolute_name_i (ACE_ENV_SINGLE_ARG_DECL_NOT_USED)
+ ACE_THROW_SPEC ((CORBA::SystemException))
+{
+ ACE_TString absolute_name;
+ this->repo_->config ()->get_string_value (this->section_key_,
+ "absolute_name",
+ absolute_name);
+
+ return CORBA::string_dup (absolute_name.c_str ());
+}
+
+CORBA::Repository_ptr
+TAO_Contained_i::containing_repository (ACE_ENV_SINGLE_ARG_DECL_NOT_USED)
+ ACE_THROW_SPEC ((CORBA::SystemException))
+{
+ return this->repo_->repo_objref ();
+}
+
+CORBA::Contained::Description *
+TAO_Contained_i::describe (
+ ACE_ENV_SINGLE_ARG_DECL_NOT_USED
+ )
+ ACE_THROW_SPEC ((CORBA::SystemException))
+{
+ // This will always be overridden by derived classes.
+ return 0;
+}
+
+CORBA::Contained::Description *
+TAO_Contained_i::describe_i (
+ ACE_ENV_SINGLE_ARG_DECL_NOT_USED
+ )
+ ACE_THROW_SPEC ((CORBA::SystemException))
+{
+ // This will always be overridden by derived classes.
+ return 0;
+}
+
+void
+TAO_Contained_i::move (CORBA::Container_ptr new_container,
+ const char *new_name,
+ const char *new_version
+ ACE_ENV_ARG_DECL)
+ ACE_THROW_SPEC ((CORBA::SystemException))
+{
+ TAO_IFR_WRITE_GUARD;
+
+ this->update_key (ACE_ENV_SINGLE_ARG_PARAMETER);
+ ACE_CHECK;
+
+ this->move_i (new_container,
+ new_name,
+ new_version,
+ 1
+ ACE_ENV_ARG_PARAMETER);
+}
+
+CORBA::Boolean
+TAO_Contained_i::name_exists (const char *name
+ ACE_ENV_ARG_DECL)
+ ACE_THROW_SPEC ((CORBA::SystemException))
+{
+ ACE_TString container_id;
+ this->repo_->config ()->get_string_value (this->section_key_,
+ "container_id",
+ container_id);
+
+ if (container_id == "")
+ {
+ TAO_Contained_i::tmp_name_holder_ = name;
+ ACE_Configuration_Section_Key root_key = this->repo_->root_key ();
+ TAO_IFR_Service_Utils::name_exists (&TAO_Contained_i::same_as_tmp_name,
+ root_key,
+ this->repo_,
+ CORBA::dk_Repository
+ ACE_ENV_ARG_PARAMETER);
+ return 0;
+ }
+
+ ACE_TString container_path;
+ this->repo_->config ()->get_string_value (this->repo_->repo_ids_key (),
+ container_id.c_str (),
+ container_path);
+
+ ACE_Configuration_Section_Key container_key;
+ this->repo_->config ()->expand_path (this->repo_->root_key (),
+ container_path,
+ container_key,
+ 0);
+
+ ACE_Configuration_Section_Key defns_key;
+ this->repo_->config ()->open_section (container_key,
+ "defns",
+ 0,
+ defns_key);
+
+ ACE_TString section_name;
+ int index = 0;
+
+ while (this->repo_->config ()->enumerate_sections (defns_key,
+ index++,
+ section_name)
+ == 0)
+ {
+ ACE_Configuration_Section_Key defn_key;
+ this->repo_->config ()->open_section (defns_key,
+ section_name.c_str (),
+ 0,
+ defn_key);
+
+ ACE_TString defn_name;
+ this->repo_->config ()->get_string_value (defn_key,
+ "name",
+ defn_name);
+
+ if (defn_name == name)
+ {
+ return 1;
+ }
+ }
+
+ return 0;
+}
+
+void
+TAO_Contained_i::contents_name_update (ACE_TString stem,
+ ACE_Configuration_Section_Key key)
+{
+ ACE_Configuration_Section_Key defns_key;
+ if (this->repo_->config ()->open_section (key,
+ "defns",
+ 0,
+ defns_key)
+ != 0)
+ {
+ return;
+ }
+
+ int index = 0;
+ ACE_TString sub_section;
+ while (this->repo_->config ()->enumerate_sections (defns_key,
+ index++,
+ sub_section)
+ == 0)
+ {
+ ACE_Configuration_Section_Key defn_key;
+
+ this->repo_->config ()->open_section (defns_key,
+ sub_section.c_str (),
+ 0,
+ defn_key);
+
+ ACE_TString name;
+ this->repo_->config ()->get_string_value (defn_key,
+ "name",
+ name);
+
+ ACE_TString absolute_name = stem + "::" + name;
+ this->repo_->config ()->set_string_value (defn_key,
+ "absolute_name",
+ absolute_name);
+
+ this->contents_name_update (absolute_name,
+ defn_key);
+ }
+}
+
+int
+TAO_Contained_i::same_as_tmp_name (const char *name)
+{
+ return ACE_OS::strcmp (TAO_Contained_i::tmp_name_holder_, name) == 0;
+}
+
+void
+TAO_Contained_i::move_i (CORBA::Container_ptr new_container,
+ const char *new_name,
+ const char *new_version,
+ CORBA::Boolean cleanup
+ ACE_ENV_ARG_DECL)
+ ACE_THROW_SPEC ((CORBA::SystemException))
+{
+ CORBA::Repository_var my_repo = this->repo_->repo_objref ();
+
+ CORBA::DefinitionKind container_dk =
+ TAO_IFR_Service_Utils::reference_to_def_kind (new_container,
+ this->repo_);
+
+ ACE_Configuration_Section_Key container_key;
+
+ // Check that we're not trying to move to a different repository,
+ // and set the container impl, used in each switch case below.
+ if (container_dk == CORBA::dk_Repository)
+ {
+ container_key = this->repo_->root_key ();
+ }
+ else
+ {
+ ACE_TString container_path (
+ TAO_IFR_Service_Utils::reference_to_path (new_container)
+ );
+
+ this->repo_->config ()->expand_path (this->repo_->root_key (),
+ container_path,
+ container_key,
+ 0);
+ }
+
+ CORBA::DefinitionKind my_dk =
+ this->def_kind (ACE_ENV_SINGLE_ARG_PARAMETER);
+ ACE_CHECK;
+
+ CORBA::String_var id = this->id_i (ACE_ENV_SINGLE_ARG_PARAMETER);
+ ACE_CHECK;
+
+ // If an exception is thrown, this must be restored.
+ ACE_TString my_path;
+ this->repo_->config ()->get_string_value (this->repo_->repo_ids_key (),
+ id.in (),
+ my_path);
+
+ // Remove the repo id, because the create_* function call will add it
+ // again with a different path value.
+ this->repo_->config ()->remove_value (this->repo_->repo_ids_key (),
+ id.in ());
+
+ // Used for cleanup at the end of this function.
+ ACE_Configuration_Section_Key old_section_key = this->section_key_;
+
+ TAO_Contained_i as_contained (this->repo_);
+ as_contained.section_key (container_key);
+
+ CORBA::String_var container_id =
+ as_contained.id_i (ACE_ENV_SINGLE_ARG_PARAMETER);
+ ACE_CHECK;
+
+ ACE_TString new_id (container_id.in ());
+ new_id =
+ new_id.substr (0, new_id.rfind (':')) + "/" + new_name + ":" + new_version;
+
+ TAO_Container_i container_impl (this->repo_);
+ container_impl.section_key (container_key);
+
+ ACE_TRY
+ {
+ // Call the appropriate create function.
+ switch (my_dk)
+ {
+ case CORBA::dk_Enum:
+ {
+ TAO_EnumDef_i impl (this->repo_);
+ impl.section_key (this->section_key_);
+
+ CORBA::EnumMemberSeq_var members =
+ impl.members_i (ACE_ENV_SINGLE_ARG_PARAMETER);
+ ACE_TRY_CHECK;
+
+ if (container_dk == CORBA::dk_Struct
+ || container_dk == CORBA::dk_Union
+ || container_dk == CORBA::dk_Exception)
+ {
+ this->move_pre_process (new_container,
+ my_path.c_str (),
+ new_name
+ ACE_ENV_ARG_PARAMETER);
+ ACE_TRY_CHECK;
+ }
+
+ CORBA::EnumDef_var new_defn =
+ container_impl.create_enum_i (new_id.c_str (),
+ new_name,
+ new_version,
+ members.in ()
+ ACE_ENV_ARG_PARAMETER);
+ ACE_TRY_CHECK;
+
+ ACE_TString new_path =
+ TAO_IFR_Service_Utils::reference_to_path (new_defn.in ());
+ container_impl.update_refs (new_path.c_str ());
+
+ break;
+ }
+ case CORBA::dk_Alias:
+ {
+ TAO_AliasDef_i impl (this->repo_);
+ impl.section_key (this->section_key_);
+
+ CORBA::IDLType_var otype =
+ impl.original_type_def_i (ACE_ENV_SINGLE_ARG_PARAMETER);
+ ACE_TRY_CHECK;
+
+ CORBA::AliasDef_var new_defn =
+ container_impl.create_alias_i (new_id.c_str (),
+ new_name,
+ new_version,
+ otype.in ()
+ ACE_ENV_ARG_PARAMETER);
+ ACE_TRY_CHECK;
+
+ ACE_TString new_path =
+ TAO_IFR_Service_Utils::reference_to_path (new_defn.in ());
+ container_impl.update_refs (new_path.c_str ());
+
+ break;
+ }
+ case CORBA::dk_Native:
+ {
+ container_impl.create_native_i (new_id.c_str (),
+ new_name,
+ new_version
+ ACE_ENV_ARG_PARAMETER);
+ ACE_TRY_CHECK;
+ break;
+ }
+ case CORBA::dk_ValueBox:
+ {
+ TAO_ValueBoxDef_i impl (this->repo_);
+ impl.section_key (this->section_key_);
+
+ CORBA::IDLType_var otype =
+ impl.original_type_def_i (ACE_ENV_SINGLE_ARG_PARAMETER);
+ ACE_TRY_CHECK;
+
+ CORBA::ValueBoxDef_var new_defn =
+ container_impl.create_value_box_i (new_id.c_str (),
+ new_name,
+ new_version,
+ otype.in ()
+ ACE_ENV_ARG_PARAMETER);
+ ACE_TRY_CHECK;
+
+ ACE_TString new_path =
+ TAO_IFR_Service_Utils::reference_to_path (new_defn.in ());
+ container_impl.update_refs (new_path.c_str ());
+
+ break;
+ }
+ case CORBA::dk_Struct:
+ {
+ TAO_StructDef_i impl (this->repo_);
+ impl.section_key (this->section_key_);
+
+ CORBA::StructMemberSeq_var members =
+ impl.members_i (ACE_ENV_SINGLE_ARG_PARAMETER);
+ ACE_TRY_CHECK;
+
+ if (container_dk == CORBA::dk_Struct
+ || container_dk == CORBA::dk_Union
+ || container_dk == CORBA::dk_Exception)
+ {
+ this->move_pre_process (new_container,
+ my_path.c_str (),
+ new_name
+ ACE_ENV_ARG_PARAMETER);
+ ACE_TRY_CHECK;
+ }
+
+ CORBA::StructDef_var new_defn =
+ container_impl.create_struct_i (new_id.c_str (),
+ new_name,
+ new_version,
+ members.in ()
+ ACE_ENV_ARG_PARAMETER);
+ ACE_TRY_CHECK;
+
+ ACE_TString new_path =
+ TAO_IFR_Service_Utils::reference_to_path (new_defn.in ());
+ container_impl.update_refs (new_path.c_str ());
+
+ this->move_contents (new_defn.in ()
+ ACE_ENV_ARG_PARAMETER);
+
+ break;
+ }
+ case CORBA::dk_Union:
+ {
+ TAO_UnionDef_i impl (this->repo_);
+ impl.section_key (this->section_key_);
+
+ CORBA::IDLType_var disc_type =
+ impl.discriminator_type_def_i (ACE_ENV_SINGLE_ARG_PARAMETER);
+ ACE_TRY_CHECK;
+
+ CORBA::UnionMemberSeq_var members =
+ impl.members_i (ACE_ENV_SINGLE_ARG_PARAMETER);
+ ACE_TRY_CHECK;
+
+ if (container_dk == CORBA::dk_Struct
+ || container_dk == CORBA::dk_Union
+ || container_dk == CORBA::dk_Exception)
+ {
+ this->move_pre_process (new_container,
+ my_path.c_str (),
+ new_name
+ ACE_ENV_ARG_PARAMETER);
+ ACE_TRY_CHECK;
+ }
+
+ CORBA::UnionDef_var new_defn =
+ container_impl.create_union_i (new_id.c_str (),
+ new_name,
+ new_version,
+ disc_type.in (),
+ members.in ()
+ ACE_ENV_ARG_PARAMETER);
+ ACE_TRY_CHECK;
+
+ ACE_TString new_path =
+ TAO_IFR_Service_Utils::reference_to_path (new_defn.in ());
+ container_impl.update_refs (new_path.c_str ());
+
+ this->move_contents (new_defn.in ()
+ ACE_ENV_ARG_PARAMETER);
+
+ break;
+ }
+ case CORBA::dk_Module:
+ {
+ CORBA::ModuleDef_var new_defn =
+ container_impl.create_module_i (new_id.c_str (),
+ new_name,
+ new_version
+ ACE_ENV_ARG_PARAMETER);
+ ACE_TRY_CHECK;
+
+ this->move_contents (new_defn.in ()
+ ACE_ENV_ARG_PARAMETER);
+
+ break;
+ }
+ case CORBA::dk_Exception:
+ {
+ TAO_ExceptionDef_i impl (this->repo_);
+ impl.section_key (this->section_key_);
+
+ CORBA::StructMemberSeq_var members =
+ impl.members_i (ACE_ENV_SINGLE_ARG_PARAMETER);
+ ACE_TRY_CHECK;
+
+ CORBA::ExceptionDef_var new_defn =
+ container_impl.create_exception_i (new_id.c_str (),
+ new_name,
+ new_version,
+ members.in ()
+ ACE_ENV_ARG_PARAMETER);
+ ACE_TRY_CHECK;
+
+ this->move_contents (new_defn.in ()
+ ACE_ENV_ARG_PARAMETER);
+
+ break;
+ }
+ case CORBA::dk_Interface:
+ {
+ TAO_InterfaceDef_i impl (this->repo_);
+ impl.section_key (this->section_key_);
+
+ CORBA::InterfaceDefSeq_var bases =
+ impl.base_interfaces_i (ACE_ENV_SINGLE_ARG_PARAMETER);
+ ACE_TRY_CHECK;
+
+ CORBA::InterfaceDef_var new_defn =
+ container_impl.create_interface_i (new_id.c_str (),
+ new_name,
+ new_version,
+ bases.in ()
+ ACE_ENV_ARG_PARAMETER);
+ ACE_TRY_CHECK;
+
+ ACE_TString new_path =
+ TAO_IFR_Service_Utils::reference_to_path (new_defn.in ());
+ container_impl.update_refs (new_path.c_str ());
+
+ this->move_contents (new_defn.in ()
+ ACE_ENV_ARG_PARAMETER);
+
+ break;
+ }
+ case CORBA::dk_Constant:
+ {
+ TAO_ConstantDef_i impl (this->repo_);
+ impl.section_key (this->section_key_);
+
+ CORBA::IDLType_var type_def =
+ impl.type_def_i (ACE_ENV_SINGLE_ARG_PARAMETER);
+ ACE_TRY_CHECK;
+
+ CORBA::Any_var value = impl.value_i (ACE_ENV_SINGLE_ARG_PARAMETER);
+ ACE_TRY_CHECK;
+
+ container_impl.create_constant_i (new_id.c_str (),
+ new_name,
+ new_version,
+ type_def.in (),
+ value.in ()
+ ACE_ENV_ARG_PARAMETER);
+ ACE_TRY_CHECK;
+ break;
+ }
+ case CORBA::dk_Attribute:
+ {
+ TAO_AttributeDef_i impl (this->repo_);
+ impl.section_key (this->section_key_);
+
+ CORBA::IDLType_var type_def =
+ impl.type_def_i (ACE_ENV_SINGLE_ARG_PARAMETER);
+ ACE_TRY_CHECK;
+
+ CORBA::AttributeMode mode =
+ impl.mode_i (ACE_ENV_SINGLE_ARG_PARAMETER);
+ ACE_TRY_CHECK;
+
+ if (container_dk == CORBA::dk_Interface)
+ {
+ TAO_InterfaceDef_i idef (this->repo_);
+ idef.section_key (container_key);
+
+ idef.create_attribute_i (new_id.c_str (),
+ new_name,
+ new_version,
+ type_def.in (),
+ mode
+ ACE_ENV_ARG_PARAMETER);
+ ACE_TRY_CHECK;
+ break;
+ }
+ else if (container_dk == CORBA::dk_Value)
+ {
+ TAO_ValueDef_i vdef (this->repo_);
+ vdef.section_key (container_key);
+
+ vdef.create_attribute_i (new_id.c_str (),
+ new_name,
+ new_version,
+ type_def.in (),
+ mode
+ ACE_ENV_ARG_PARAMETER);
+ ACE_TRY_CHECK;
+ break;
+ }
+ else
+ {
+ ACE_THROW (CORBA::BAD_PARAM (CORBA::OMGVMCID | 4,
+ CORBA::COMPLETED_NO));
+ }
+ }
+ case CORBA::dk_Operation:
+ {
+ TAO_OperationDef_i impl (this->repo_);
+ impl.section_key (this->section_key_);
+
+ CORBA::IDLType_var result =
+ impl.result_def_i (ACE_ENV_SINGLE_ARG_PARAMETER);
+ ACE_TRY_CHECK;
+
+ CORBA::OperationMode mode =
+ impl.mode_i (ACE_ENV_SINGLE_ARG_PARAMETER);
+ ACE_TRY_CHECK;
+
+ CORBA::ParDescriptionSeq_var params =
+ impl.params_i (ACE_ENV_SINGLE_ARG_PARAMETER);
+ ACE_TRY_CHECK;
+
+ CORBA::ExceptionDefSeq_var exceptions =
+ impl.exceptions_i (ACE_ENV_SINGLE_ARG_PARAMETER);
+ ACE_TRY_CHECK;
+
+ CORBA::ContextIdSeq_var contexts =
+ impl.contexts_i (ACE_ENV_SINGLE_ARG_PARAMETER);
+ ACE_TRY_CHECK;
+
+ if (container_dk == CORBA::dk_Interface)
+ {
+ TAO_InterfaceDef_i idef (this->repo_);
+ idef.section_key (container_key);
+
+ idef.create_operation_i (new_id.c_str (),
+ new_name,
+ new_version,
+ result.in (),
+ mode,
+ params.in (),
+ exceptions.in (),
+ contexts.in ()
+ ACE_ENV_ARG_PARAMETER);
+ ACE_TRY_CHECK;
+ break;
+ }
+ else if (container_dk == CORBA::dk_Value)
+ {
+ TAO_ValueDef_i vdef (this->repo_);
+ impl.section_key (container_key);
+
+ vdef.create_operation_i (new_id.c_str (),
+ new_name,
+ new_version,
+ result.in (),
+ mode,
+ params.in (),
+ exceptions.in (),
+ contexts.in ()
+ ACE_ENV_ARG_PARAMETER);
+ ACE_TRY_CHECK;
+ break;
+ }
+ else
+ {
+ ACE_THROW (CORBA::BAD_PARAM (CORBA::OMGVMCID | 4,
+ CORBA::COMPLETED_NO));
+ }
+ }
+ case CORBA::dk_Value:
+ case CORBA::dk_Home:
+ case CORBA::dk_Component:
+ case CORBA::dk_Factory:
+ case CORBA::dk_Finder:
+ case CORBA::dk_Provides:
+ case CORBA::dk_Uses:
+ case CORBA::dk_Emits:
+ case CORBA::dk_Publishes:
+ case CORBA::dk_Consumes:
+ case CORBA::dk_ValueMember:
+ case CORBA::dk_Event:
+ // TODO
+ default:
+ break;
+ }
+ }
+ ACE_CATCHANY
+ {
+ // If the move was not successful, we must restore this.
+ this->repo_->config ()->set_string_value (
+ this->repo_->repo_ids_key (),
+ id.in (),
+ my_path
+ );
+ ACE_RE_THROW;
+ }
+ ACE_ENDTRY;
+ ACE_CHECK;
+
+ if (cleanup)
+ {
+ // Remove the old database entry.
+ ACE_TString container_id;
+ ACE_Configuration_Section_Key parent_key;
+
+ this->repo_->config ()->get_string_value (old_section_key,
+ "container_id",
+ container_id);
+
+ if (container_id == "")
+ {
+ parent_key = this->repo_->root_key ();
+ }
+ else
+ {
+ ACE_TString parent_path;
+ this->repo_->config ()->get_string_value (
+ this->repo_->repo_ids_key (),
+ container_id.c_str (),
+ parent_path
+ );
+
+ this->repo_->config ()->expand_path (this->repo_->root_key (),
+ parent_path,
+ parent_key,
+ 0);
+ }
+
+ ACE_Configuration_Section_Key defns_key;
+ this->repo_->config ()->open_section (parent_key,
+ "defns",
+ 0,
+ defns_key);
+
+ ACE_TString last_seg = my_path.substr (my_path.rfind ('\\') + 1);
+ this->repo_->config ()->remove_section (defns_key,
+ last_seg.c_str (),
+ 1);
+ }
+}
+
+void
+TAO_Contained_i::move_pre_process (CORBA::Container_ptr container,
+ const char *contained_path,
+ const char *name
+ ACE_ENV_ARG_DECL_NOT_USED)
+ ACE_THROW_SPEC ((CORBA::SystemException))
+{
+ char *container_path =
+ TAO_IFR_Service_Utils::reference_to_path (container);
+
+ ACE_Configuration_Section_Key container_key;
+ this->repo_->config ()->expand_path (this->repo_->root_key (),
+ container_path,
+ container_key,
+ 0);
+
+ ACE_Configuration_Section_Key refs_key;
+ this->repo_->config ()->open_section (container_key,
+ "refs",
+ 0,
+ refs_key);
+
+ int index = 0;
+ ACE_TString section_name;
+ while (this->repo_->config ()->enumerate_sections (refs_key,
+ index++,
+ section_name)
+ == 0)
+ {
+ ACE_Configuration_Section_Key ref_key;
+ this->repo_->config ()->open_section (refs_key,
+ section_name.c_str (),
+ 0,
+ ref_key);
+
+ ACE_TString ref_name;
+ this->repo_->config ()->get_string_value (ref_key,
+ "name",
+ ref_name);
+
+ ACE_TString path;
+ this->repo_->config ()->get_string_value (ref_key,
+ "path",
+ path);
+
+ if (ref_name == name && path == contained_path)
+ {
+ ref_name += this->repo_->extension ();
+ this->repo_->config ()->set_string_value (ref_key,
+ "name",
+ ref_name);
+
+ break;
+ }
+ }
+}
+
+void
+TAO_Contained_i::move_contents (CORBA::Container_ptr new_container
+ ACE_ENV_ARG_DECL)
+ ACE_THROW_SPEC ((CORBA::SystemException))
+{
+ ACE_TString name;
+ ACE_TString version;
+
+ ACE_Configuration_Section_Key defns_key;
+ int status =
+ this->repo_->config ()->open_section (this->section_key_,
+ "defns",
+ 0,
+ defns_key);
+
+ if (status == 0)
+ {
+ u_int count = 0;
+ this->repo_->config ()->get_integer_value (defns_key,
+ "count",
+ count);
+
+ for (u_int i = 0; i < count; ++i)
+ {
+ ACE_Configuration_Section_Key defn_key;
+ char *stringified = TAO_IFR_Service_Utils::int_to_string (i);
+ status =
+ this->repo_->config ()->open_section (defns_key,
+ stringified,
+ 0,
+ defn_key);
+
+ if (status == 0)
+ {
+ this->repo_->config ()->get_string_value (defn_key,
+ "name",
+ name);
+
+ this->repo_->config ()->get_string_value (defn_key,
+ "version",
+ version);
+ u_int kind = 0;
+ this->repo_->config ()->get_integer_value (defn_key,
+ "def_kind",
+ kind);
+ CORBA::DefinitionKind def_kind =
+ static_cast<CORBA::DefinitionKind> (kind);
+
+ TAO_Contained_i *impl = this->repo_->select_contained (def_kind);
+ impl->section_key (defn_key);
+
+ impl->move_i (new_container,
+ name.c_str (),
+ version.c_str (),
+ 0
+ ACE_ENV_ARG_PARAMETER);
+ ACE_CHECK;
+ }
+ }
+ }
+
+ CORBA::DefinitionKind kind = this->def_kind (ACE_ENV_SINGLE_ARG_PARAMETER);
+ ACE_CHECK;
+
+ // Specific to InterfaceDef_i and ValueDef_i
+ if (kind == CORBA::dk_Interface || kind == CORBA::dk_Value)
+ {
+ int index = 0;
+ ACE_TString section_name;
+
+ // Attributes
+ ACE_Configuration_Section_Key attrs_key;
+ int status =
+ this->repo_->config ()->open_section (this->section_key_,
+ "attrs",
+ 0,
+ attrs_key);
+
+ if (status == 0)
+ {
+ while (this->repo_->config ()->enumerate_sections (attrs_key,
+ index++,
+ section_name)
+ == 0)
+ {
+ ACE_Configuration_Section_Key attr_key;
+ this->repo_->config ()->open_section (attrs_key,
+ section_name.c_str (),
+ 0,
+ attr_key);
+
+ this->repo_->config ()->get_string_value (attr_key,
+ "name",
+ name);
+
+ this->repo_->config ()->get_string_value (attr_key,
+ "version",
+ version);
+
+ TAO_AttributeDef_i impl (this->repo_);
+ impl.section_key (attr_key);
+
+ impl.move_i (new_container,
+ name.c_str (),
+ version.c_str (),
+ 0
+ ACE_ENV_ARG_PARAMETER);
+ ACE_CHECK;
+ }
+ }
+
+ index = 0;
+
+ // Operations
+ ACE_Configuration_Section_Key ops_key;
+ status =
+ this->repo_->config ()->open_section (this->section_key_,
+ "ops",
+ 0,
+ ops_key);
+
+ if (status == 0)
+ {
+ while (this->repo_->config ()->enumerate_sections (ops_key,
+ index++,
+ section_name)
+ == 0)
+ {
+ ACE_Configuration_Section_Key op_key;
+ this->repo_->config ()->open_section (ops_key,
+ section_name.c_str (),
+ 0,
+ op_key);
+
+ this->repo_->config ()->get_string_value (op_key,
+ "name",
+ name);
+
+ this->repo_->config ()->get_string_value (op_key,
+ "version",
+ version);
+
+ TAO_OperationDef_i impl (this->repo_);
+ impl.section_key (op_key);
+
+ impl.move_i (new_container,
+ name.c_str (),
+ version.c_str (),
+ 0
+ ACE_ENV_ARG_PARAMETER);
+ ACE_CHECK;
+ }
+ }
+ }
+}
+
+TAO_END_VERSIONED_NAMESPACE_DECL
diff --git a/TAO/orbsvcs/orbsvcs/IFRService/Contained_i.h b/TAO/orbsvcs/orbsvcs/IFRService/Contained_i.h
new file mode 100644
index 00000000000..5729837ce3b
--- /dev/null
+++ b/TAO/orbsvcs/orbsvcs/IFRService/Contained_i.h
@@ -0,0 +1,236 @@
+// -*- C++ -*-
+
+// $Id$
+
+// ============================================================================
+//
+// = LIBRARY
+// TAO/orbsvcs/orbsvcs/IFRService
+//
+// = FILENAME
+// Contained_i.h
+//
+// = DESCRIPTION
+// Contained servant class.
+//
+// = AUTHOR
+// Jeff Parsons <parsons@cs.wustl.edu>
+//
+// ============================================================================
+
+#ifndef TAO_CONTAINED_I_H
+#define TAO_CONTAINED_I_H
+
+#include "orbsvcs/IFRService/IRObject_i.h"
+#include "orbsvcs/IFRService/ifr_service_export.h"
+
+#if !defined (ACE_LACKS_PRAGMA_ONCE)
+# pragma once
+#endif /* ACE_LACKS_PRAGMA_ONCE */
+
+#if defined(_MSC_VER)
+#pragma warning(push)
+#pragma warning(disable:4250)
+#endif /* _MSC_VER */
+
+TAO_BEGIN_VERSIONED_NAMESPACE_DECL
+
+class TAO_IFRService_Export TAO_Contained_i : public virtual TAO_IRObject_i
+{
+ // = TITLE
+ // TAO_Contained_i
+ //
+ // = DESCRIPTION
+ // Abstract base class for all IR objects that are contained
+ // by other IR objects.
+ //
+public:
+ TAO_Contained_i (TAO_Repository_i *repo);
+ // Constructor.
+
+ virtual ~TAO_Contained_i (void);
+ // Destructor.
+
+ virtual void destroy (
+ ACE_ENV_SINGLE_ARG_DECL_WITH_DEFAULTS
+ )
+ ACE_THROW_SPEC ((CORBA::SystemException));
+ // Remove the repository entry.
+
+ virtual void destroy_i (
+ ACE_ENV_SINGLE_ARG_DECL_WITH_DEFAULTS
+ )
+ ACE_THROW_SPEC ((CORBA::SystemException));
+
+ virtual char *id (
+ ACE_ENV_SINGLE_ARG_DECL_WITH_DEFAULTS
+ )
+ ACE_THROW_SPEC ((CORBA::SystemException));
+
+ char *id_i (
+ ACE_ENV_SINGLE_ARG_DECL_WITH_DEFAULTS
+ )
+ ACE_THROW_SPEC ((CORBA::SystemException));
+
+ virtual void id (
+ const char *id
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS
+ )
+ ACE_THROW_SPEC ((CORBA::SystemException));
+
+ void id_i (
+ const char *id
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS
+ )
+ ACE_THROW_SPEC ((CORBA::SystemException));
+
+ virtual char *name (
+ ACE_ENV_SINGLE_ARG_DECL_WITH_DEFAULTS
+ )
+ ACE_THROW_SPEC ((CORBA::SystemException));
+
+ char *name_i (
+ ACE_ENV_SINGLE_ARG_DECL_WITH_DEFAULTS
+ )
+ ACE_THROW_SPEC ((CORBA::SystemException));
+
+ virtual void name (
+ const char *name
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS
+ )
+ ACE_THROW_SPEC ((CORBA::SystemException));
+
+ void name_i (
+ const char *name
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS
+ )
+ ACE_THROW_SPEC ((CORBA::SystemException));
+
+ virtual char *version (
+ ACE_ENV_SINGLE_ARG_DECL_WITH_DEFAULTS
+ )
+ ACE_THROW_SPEC ((CORBA::SystemException));
+
+ char *version_i (
+ ACE_ENV_SINGLE_ARG_DECL_WITH_DEFAULTS
+ )
+ ACE_THROW_SPEC ((CORBA::SystemException));
+
+ virtual void version (
+ const char *version
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS
+ )
+ ACE_THROW_SPEC ((CORBA::SystemException));
+
+ void version_i (
+ const char *version
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS
+ )
+ ACE_THROW_SPEC ((CORBA::SystemException));
+
+ virtual CORBA::Container_ptr defined_in (
+ ACE_ENV_SINGLE_ARG_DECL_WITH_DEFAULTS
+ )
+ ACE_THROW_SPEC ((CORBA::SystemException));
+
+ CORBA::Container_ptr defined_in_i (
+ ACE_ENV_SINGLE_ARG_DECL_WITH_DEFAULTS
+ )
+ ACE_THROW_SPEC ((CORBA::SystemException));
+
+ virtual char *absolute_name (
+ ACE_ENV_SINGLE_ARG_DECL_WITH_DEFAULTS
+ )
+ ACE_THROW_SPEC ((CORBA::SystemException));
+
+ char *absolute_name_i (
+ ACE_ENV_SINGLE_ARG_DECL_WITH_DEFAULTS
+ )
+ ACE_THROW_SPEC ((CORBA::SystemException));
+
+ virtual CORBA::Repository_ptr containing_repository (
+ ACE_ENV_SINGLE_ARG_DECL_WITH_DEFAULTS
+ )
+ ACE_THROW_SPEC ((CORBA::SystemException));
+
+ virtual CORBA::Contained::Description *describe (
+ ACE_ENV_SINGLE_ARG_DECL_WITH_DEFAULTS
+ )
+ ACE_THROW_SPEC ((CORBA::SystemException));
+
+ virtual CORBA::Contained::Description *describe_i (
+ ACE_ENV_SINGLE_ARG_DECL_WITH_DEFAULTS)
+ ACE_THROW_SPEC ((CORBA::SystemException));
+
+ virtual void move (
+ CORBA::Container_ptr new_container,
+ const char *new_name,
+ const char *new_version
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS
+ )
+ ACE_THROW_SPEC ((CORBA::SystemException));
+
+ static int same_as_tmp_name (const char *name);
+ // Called from TAO_IFR_Service_Utils::name_exists.
+
+protected:
+ void move_i (
+ CORBA::Container_ptr new_container,
+ const char *new_name,
+ const char *new_version,
+ CORBA::Boolean cleanup
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS
+ )
+ ACE_THROW_SPEC ((CORBA::SystemException));
+ // Engine for move() with an extra 'cleanup'
+ // parameter. Since a section removal can be
+ // recursive, this need be done only at the top
+ // level.
+
+private:
+ CORBA::Boolean name_exists (
+ const char *name
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS
+ )
+ ACE_THROW_SPEC ((CORBA::SystemException));
+ // Check if <name> already exists in our container
+
+ void contents_name_update (
+ ACE_TString stem,
+ ACE_Configuration_Section_Key key
+ );
+ // Recursively update the scoped name of our contents.
+
+ void move_pre_process (
+ CORBA::Container_ptr container,
+ const char *contained_path,
+ const char *name
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS
+ )
+ ACE_THROW_SPEC ((CORBA::SystemException));
+ // Mangle the names of references that are also
+ // defined in the scope, so a name clash will
+ // not occur when create_* is called. Create_*
+ // unmangles the names.
+
+ void move_contents (
+ CORBA::Container_ptr new_container
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS
+ )
+ ACE_THROW_SPEC ((CORBA::SystemException));
+ // Recursively calls move_i for definitions,
+ // as well as operations and attributes if
+ // applicable.
+
+private:
+ static const char *tmp_name_holder_;
+};
+
+TAO_END_VERSIONED_NAMESPACE_DECL
+
+
+#if defined(_MSC_VER)
+#pragma warning(pop)
+#endif /* _MSC_VER */
+
+#endif /* TAO_CONTAINED_I_H */
diff --git a/TAO/orbsvcs/orbsvcs/IFRService/Container_i.cpp b/TAO/orbsvcs/orbsvcs/IFRService/Container_i.cpp
new file mode 100644
index 00000000000..b729699e35e
--- /dev/null
+++ b/TAO/orbsvcs/orbsvcs/IFRService/Container_i.cpp
@@ -0,0 +1,2684 @@
+// $Id$
+
+#include "orbsvcs/IFRService/Repository_i.h"
+#include "orbsvcs/IFRService/InterfaceDef_i.h"
+#include "orbsvcs/IFRService/ValueDef_i.h"
+#include "orbsvcs/IFRService/ExtValueDef_i.h"
+#include "orbsvcs/IFRService/IFR_Service_Utils.h"
+#include "orbsvcs/IFRService/IFR_Service_Utils_T.h"
+
+#include "tao/IFR_Client/IFR_ComponentsC.h"
+
+#include "tao/AnyTypeCode/Any_Unknown_IDL_Type.h"
+
+#include "ace/Auto_Ptr.h"
+#include "ace/SString.h"
+
+
+ACE_RCSID (IFRService,
+ Container_i,
+ "$Id$")
+
+TAO_BEGIN_VERSIONED_NAMESPACE_DECL
+
+const char *TAO_Container_i::tmp_name_holder_ = 0;
+
+TAO_Container_i::TAO_Container_i (
+ TAO_Repository_i *repo
+ )
+ : TAO_IRObject_i (repo)
+{
+}
+
+TAO_Container_i::~TAO_Container_i (void)
+{
+}
+
+void
+TAO_Container_i::destroy (ACE_ENV_SINGLE_ARG_DECL)
+ ACE_THROW_SPEC ((CORBA::SystemException))
+{
+ TAO_IFR_WRITE_GUARD;
+
+ this->update_key (ACE_ENV_SINGLE_ARG_PARAMETER);
+ ACE_CHECK;
+
+ this->destroy_i (ACE_ENV_SINGLE_ARG_PARAMETER);
+}
+
+void
+TAO_Container_i::destroy_i (ACE_ENV_SINGLE_ARG_DECL)
+ ACE_THROW_SPEC ((CORBA::SystemException))
+{
+ int index = 0;
+ int status;
+ ACE_TString section_name;
+
+ // Destroy and/or remove references.
+
+ ACE_Configuration_Section_Key refs_key;
+ status =
+ this->repo_->config ()->open_section (this->section_key_,
+ "refs",
+ 0,
+ refs_key);
+ // This section may not have been created.
+ if (status == 0)
+ {
+ while (this->repo_->config ()->enumerate_sections (refs_key,
+ index++,
+ section_name)
+ == 0)
+ {
+ ACE_Configuration_Section_Key member_key;
+ this->repo_->config ()->open_section (refs_key,
+ section_name.c_str (),
+ 0,
+ member_key);
+
+ ACE_TString path;
+ this->repo_->config ()->get_string_value (member_key,
+ "path",
+ path);
+
+ ACE_Configuration_Section_Key entry_key;
+ status =
+ this->repo_->config ()->expand_path (this->repo_->root_key (),
+ path,
+ entry_key,
+ 0);
+
+ // This entry may already have been destroyed.
+ if (status == 0)
+ {
+ TAO_IDLType_i *impl =
+ TAO_IFR_Service_Utils::path_to_idltype (path,
+ this->repo_);
+
+ CORBA::DefinitionKind def_kind =
+ impl->def_kind (ACE_ENV_SINGLE_ARG_PARAMETER);
+ ACE_CHECK;
+
+ switch (def_kind)
+ {
+ // These anonymous types were defined in IDL inside this
+ // struct and have no 'contained-in' info of their own,
+ // so they must be destroyed here.
+ case CORBA::dk_String:
+ case CORBA::dk_Wstring:
+ case CORBA::dk_Fixed:
+ case CORBA::dk_Array:
+ case CORBA::dk_Sequence:
+ impl->destroy_i (ACE_ENV_SINGLE_ARG_PARAMETER);
+ ACE_CHECK;
+ break;
+ default:
+ // No other types can be defined in this section of the struct.
+ break;
+ }
+ }
+ }
+
+ this->repo_->config ()->remove_section (this->section_key_,
+ "refs",
+ 1);
+ }
+
+ // Destroy definitions.
+
+ ACE_Configuration_Section_Key defns_key;
+ status =
+ this->repo_->config ()->open_section (this->section_key_,
+ "defns",
+ 0,
+ defns_key);
+
+ // Store our section key for later in case this method is
+ // called recursively
+ ACE_Configuration_Section_Key holder = this->section_key_;
+
+ // This section may not have been created.
+ if (status == 0)
+ {
+ index = 0;
+
+ while (this->repo_->config ()->enumerate_sections (defns_key,
+ index++,
+ section_name)
+ == 0)
+ {
+ ACE_Configuration_Section_Key defn_key;
+ this->repo_->config ()->open_section (defns_key,
+ section_name.c_str (),
+ 0,
+ defn_key);
+ u_int kind = 0;
+ this->repo_->config ()->get_integer_value (defn_key,
+ "def_kind",
+ kind);
+ CORBA::DefinitionKind def_kind =
+ static_cast<CORBA::DefinitionKind> (kind);
+
+ TAO_Contained_i *impl = this->repo_->select_contained (def_kind);
+ impl->section_key (defn_key);
+
+ impl->destroy_i (ACE_ENV_SINGLE_ARG_PARAMETER);
+ ACE_CHECK;
+ }
+
+ // Restore our original section key, in case this method was
+ // called recursively.
+ this->section_key (holder);
+
+ this->repo_->config ()->remove_section (this->section_key_,
+ "defns",
+ 1);
+ }
+}
+
+CORBA::Contained_ptr
+TAO_Container_i::lookup (const char *search_name
+ ACE_ENV_ARG_DECL)
+ ACE_THROW_SPEC ((CORBA::SystemException))
+{
+ TAO_IFR_READ_GUARD_RETURN (0);
+
+ this->update_key (ACE_ENV_SINGLE_ARG_PARAMETER);
+ ACE_CHECK_RETURN (CORBA::Contained::_nil ());
+
+ return this->lookup_i (search_name
+ ACE_ENV_ARG_PARAMETER);
+}
+
+CORBA::Contained_ptr
+TAO_Container_i::lookup_i (const char *search_name
+ ACE_ENV_ARG_DECL)
+ ACE_THROW_SPEC ((CORBA::SystemException))
+{
+ ACE_Configuration_Section_Key iter_key;
+ ACE_Configuration_Section_Key work_key;
+ ACE_TString work_string;
+ ACE_TString section_name;
+ int status = 0;
+ int index = 0;
+ ACE_TString::size_type pos = 0;
+ int so_far_so_good = 0;
+ u_int kind = 0;
+ CORBA::DefinitionKind def_kind = CORBA::dk_none;
+
+
+ if (ACE_OS::strncmp (search_name, "::", 2) == 0)
+ {
+ // We were given an absolute scoped name.
+ work_string = search_name + 2;
+ iter_key = this->repo_->root_key ();
+ }
+ else
+ {
+ // We were given a relative scoped name.
+ work_string = search_name;
+ iter_key = this->section_key_;
+ }
+
+ while (1)
+ {
+ pos = work_string.find ("::");
+ so_far_so_good = 0;
+
+ ACE_Configuration_Section_Key defns_key;
+ status =
+ this->repo_->config ()->open_section (iter_key,
+ "defns",
+ 0,
+ defns_key);
+ if (status == 0)
+ {
+ index = 0;
+
+ while (this->repo_->config ()->enumerate_sections (defns_key,
+ index++,
+ section_name)
+ == 0)
+ {
+ this->repo_->config ()->open_section (defns_key,
+ section_name.c_str (),
+ 0,
+ work_key);
+
+ ACE_TString defn_name;
+ this->repo_->config ()->get_string_value (work_key,
+ "name",
+ defn_name);
+
+ if (defn_name == work_string.substr (0, pos))
+ {
+ iter_key = work_key;
+ so_far_so_good = 1;
+ break;
+ }
+ }
+ }
+
+ if (so_far_so_good)
+ {
+ if (pos != ACE_TString::npos)
+ {
+ work_string = work_string.substr (pos + 2);
+ continue;
+ }
+ else
+ {
+ break;
+ }
+ }
+ else
+ {
+ // Check for attributes and operations, but only if we
+ // are on the last segment of the scoped name.
+ if (pos == ACE_TString::npos)
+ {
+ this->repo_->config ()->get_integer_value (iter_key,
+ "def_kind",
+ kind);
+
+ def_kind = static_cast<CORBA::DefinitionKind> (kind);
+
+ if (def_kind == CORBA::dk_Interface
+ || def_kind == CORBA::dk_Value)
+ {
+ ACE_Configuration_Section_Key attrs_key;
+ status =
+ this->repo_->config ()->open_section (iter_key,
+ "attrs",
+ 0,
+ attrs_key);
+
+ if (status == 0)
+ {
+ index = 0;
+ while (this->repo_->config ()->enumerate_sections (
+ attrs_key,
+ index++,
+ section_name
+ )
+ == 0)
+ {
+ this->repo_->config ()->open_section (
+ attrs_key,
+ section_name.c_str (),
+ 0,
+ work_key
+ );
+
+ ACE_TString attr_name;
+ this->repo_->config ()->get_string_value (
+ work_key,
+ "name",
+ attr_name
+ );
+
+ // If we're here, working name has only one segment.
+ if (attr_name == work_string)
+ {
+ so_far_so_good = 1;
+ break;
+ }
+ }
+ }
+
+ if (so_far_so_good)
+ {
+ break;
+ }
+ else
+ {
+ ACE_Configuration_Section_Key ops_key;
+ status =
+ this->repo_->config ()->open_section (iter_key,
+ "ops",
+ 0,
+ ops_key);
+
+ if (status == 0)
+ {
+ index = 0;
+
+ while (this->repo_->config ()->enumerate_sections (
+ ops_key,
+ index++,
+ section_name
+ )
+ == 0)
+ {
+ this->repo_->config ()->open_section (
+ ops_key,
+ section_name.c_str (),
+ 0,
+ work_key
+ );
+
+ ACE_TString op_name;
+ this->repo_->config ()->get_string_value (
+ work_key,
+ "name",
+ op_name
+ );
+
+ // If we're here, name has only one segment.
+ if (op_name == work_string)
+ {
+ so_far_so_good = 1;
+ break;
+ }
+ }
+
+ if (so_far_so_good)
+ {
+ break;
+ }
+ }
+ }
+ }
+ }
+ }
+
+ return CORBA::Contained::_nil ();
+ }
+
+ ACE_TString id;
+ this->repo_->config ()->get_string_value (work_key,
+ "id",
+ id);
+
+ ACE_TString path;
+ this->repo_->config ()->get_string_value (this->repo_->repo_ids_key (),
+ id.c_str (),
+ path);
+
+ CORBA::Object_var obj =
+ TAO_IFR_Service_Utils::path_to_ir_object (path,
+ this->repo_
+ ACE_ENV_ARG_PARAMETER);
+ ACE_CHECK_RETURN (CORBA::Contained::_nil ());
+
+ return CORBA::Contained::_narrow (obj.in ()
+ ACE_ENV_ARG_PARAMETER);
+}
+
+CORBA::ContainedSeq *
+TAO_Container_i::contents (CORBA::DefinitionKind limit_type,
+ CORBA::Boolean exclude_inherited
+ ACE_ENV_ARG_DECL)
+ ACE_THROW_SPEC ((CORBA::SystemException))
+{
+ TAO_IFR_READ_GUARD_RETURN (0);
+
+ this->update_key (ACE_ENV_SINGLE_ARG_PARAMETER);
+ ACE_CHECK_RETURN (0);
+
+ return this->contents_i (limit_type,
+ exclude_inherited
+ ACE_ENV_ARG_PARAMETER);
+}
+
+CORBA::ContainedSeq *
+TAO_Container_i::contents_i (CORBA::DefinitionKind limit_type,
+ CORBA::Boolean exclude_inherited
+ ACE_ENV_ARG_DECL)
+ ACE_THROW_SPEC ((CORBA::SystemException))
+{
+ CORBA::ContainedSeq *contents = 0;
+ ACE_NEW_THROW_EX (contents,
+ CORBA::ContainedSeq,
+ CORBA::NO_MEMORY ());
+ ACE_CHECK_RETURN (0);
+
+ CORBA::ContainedSeq_var retval = contents;
+ retval->length (0);
+
+ if (limit_type == CORBA::dk_none)
+ {
+ return retval._retn ();
+ }
+
+ ACE_Unbounded_Queue<CORBA::DefinitionKind> kind_queue;
+ ACE_Unbounded_Queue<ACE_TString> path_queue;
+
+ // Definitions
+
+ ACE_Configuration_Section_Key defns_key;
+ int status =
+ this->repo_->config ()->open_section (this->section_key_,
+ "defns",
+ 0,
+ defns_key);
+
+ // If there are no contents (other than possible attributes or
+ // operations), skip this part.
+ if (status == 0)
+ {
+ u_int count = 0;
+ this->repo_->config ()->get_integer_value (defns_key,
+ "count",
+ count);
+
+ for (u_int i = 0; i < count; ++i)
+ {
+ ACE_Configuration_Section_Key defn_key;
+ char *stringified = TAO_IFR_Service_Utils::int_to_string (i);
+ status =
+ this->repo_->config ()->open_section (defns_key,
+ stringified,
+ 0,
+ defn_key);
+
+ if (status == 0)
+ {
+ u_int kind = 0;
+ this->repo_->config ()->get_integer_value (defn_key,
+ "def_kind",
+ kind);
+
+ CORBA::DefinitionKind def_kind =
+ static_cast<CORBA::DefinitionKind> (kind);
+
+ if (limit_type == CORBA::dk_all
+ || limit_type == def_kind)
+ {
+ kind_queue.enqueue_tail (def_kind);
+
+ ACE_TString id;
+ this->repo_->config ()->get_string_value (defn_key,
+ "id",
+ id);
+
+ ACE_TString path;
+ this->repo_->config ()->get_string_value (
+ this->repo_->repo_ids_key (),
+ id.c_str (),
+ path
+ );
+
+ path_queue.enqueue_tail (path);
+ }
+ }
+ }
+ }
+
+ // Base interfaces
+
+ CORBA::DefinitionKind def_kind = this->def_kind (ACE_ENV_SINGLE_ARG_PARAMETER);
+ ACE_CHECK_RETURN (0);
+
+ if (def_kind == CORBA::dk_Interface)
+ {
+ if (limit_type == CORBA::dk_Operation
+ || limit_type == CORBA::dk_Attribute
+ || limit_type == CORBA::dk_all)
+ {
+ TAO_InterfaceDef_i iface (this->repo_);
+ iface.section_key (this->section_key_);
+
+ iface.interface_contents (kind_queue,
+ path_queue,
+ limit_type,
+ exclude_inherited
+ ACE_ENV_ARG_PARAMETER);
+ ACE_CHECK_RETURN (0);
+ }
+ }
+
+ CORBA::ULong size = static_cast<CORBA::ULong> (kind_queue.size ());
+ retval->length (size);
+
+ for (CORBA::ULong j = 0; j < size; ++j)
+ {
+ CORBA::DefinitionKind next_kind = CORBA::dk_none;
+ kind_queue.dequeue_head (next_kind);
+
+ ACE_TString next_path;
+ path_queue.dequeue_head (next_path);
+
+ CORBA::Object_var obj =
+ TAO_IFR_Service_Utils::create_objref (next_kind,
+ next_path.c_str (),
+ this->repo_
+ ACE_ENV_ARG_PARAMETER);
+ ACE_CHECK_RETURN (0);
+
+ CORBA::Contained_var next_cont =
+ CORBA::Contained::_narrow (obj.in ()
+ ACE_ENV_ARG_PARAMETER);
+ ACE_CHECK_RETURN (0);
+
+ retval[j] = next_cont._retn ();
+ }
+
+ return retval._retn ();
+}
+
+CORBA::ContainedSeq *
+TAO_Container_i::lookup_name (const char *search_name,
+ CORBA::Long levels_to_search,
+ CORBA::DefinitionKind limit_type,
+ CORBA::Boolean exclude_inherited
+ ACE_ENV_ARG_DECL)
+ ACE_THROW_SPEC ((CORBA::SystemException))
+{
+ TAO_IFR_READ_GUARD_RETURN (0);
+
+ this->update_key (ACE_ENV_SINGLE_ARG_PARAMETER);
+ ACE_CHECK_RETURN (0);
+
+ return this->lookup_name_i (search_name,
+ levels_to_search,
+ limit_type,
+ exclude_inherited
+ ACE_ENV_ARG_PARAMETER);
+}
+
+CORBA::ContainedSeq *
+TAO_Container_i::lookup_name_i (const char *search_name,
+ CORBA::Long levels_to_search,
+ CORBA::DefinitionKind limit_type,
+ CORBA::Boolean exclude_inherited
+ ACE_ENV_ARG_DECL)
+ ACE_THROW_SPEC ((CORBA::SystemException))
+{
+ ACE_Unbounded_Queue<CORBA::DefinitionKind> kind_queue;
+ ACE_Unbounded_Queue<ACE_TString> path_queue;
+
+ this->lookup_name_recursive (kind_queue,
+ path_queue,
+ search_name,
+ levels_to_search,
+ limit_type,
+ exclude_inherited
+ ACE_ENV_ARG_PARAMETER);
+
+ CORBA::ULong size = static_cast<CORBA::ULong> (kind_queue.size ());
+
+ CORBA::ContainedSeq *holder;
+ ACE_NEW_THROW_EX (holder,
+ CORBA::ContainedSeq (size),
+ CORBA::NO_MEMORY ());
+ ACE_CHECK_RETURN (0);
+
+ CORBA::ContainedSeq_var retval = holder;
+ retval->length (size);
+
+ for (CORBA::ULong i = 0; i < size; ++i)
+ {
+ CORBA::DefinitionKind next_kind = CORBA::dk_none;
+ kind_queue.dequeue_head (next_kind);
+
+ ACE_TString next_path;
+ path_queue.dequeue_head (next_path);
+
+ CORBA::Object_var obj =
+ TAO_IFR_Service_Utils::create_objref (next_kind,
+ next_path.c_str (),
+ this->repo_
+ ACE_ENV_ARG_PARAMETER);
+ ACE_CHECK_RETURN (0);
+
+ CORBA::Contained_var next_cont =
+ CORBA::Contained::_narrow (obj.in ()
+ ACE_ENV_ARG_PARAMETER);
+ ACE_CHECK_RETURN (0);
+
+ retval[i] = next_cont._retn ();
+ }
+
+ return retval._retn ();
+}
+
+CORBA::Container::DescriptionSeq *
+TAO_Container_i::describe_contents (CORBA::DefinitionKind limit_type,
+ CORBA::Boolean exclude_inherited,
+ CORBA::Long max_returned_objs
+ ACE_ENV_ARG_DECL)
+ ACE_THROW_SPEC ((CORBA::SystemException))
+{
+ TAO_IFR_READ_GUARD_RETURN (0);
+
+ this->update_key (ACE_ENV_SINGLE_ARG_PARAMETER);
+ ACE_CHECK_RETURN (0);
+
+ return this->describe_contents_i (limit_type,
+ exclude_inherited,
+ max_returned_objs
+ ACE_ENV_ARG_PARAMETER);
+}
+
+CORBA::Container::DescriptionSeq *
+TAO_Container_i::describe_contents_i (CORBA::DefinitionKind limit_type,
+ CORBA::Boolean exclude_inherited,
+ CORBA::Long max_returned_objs
+ ACE_ENV_ARG_DECL)
+ ACE_THROW_SPEC ((CORBA::SystemException))
+{
+ CORBA::ContainedSeq_var contents = this->contents_i (limit_type,
+ exclude_inherited
+ ACE_ENV_ARG_PARAMETER);
+ ACE_CHECK_RETURN (0);
+
+ CORBA::ULong length = contents->length ();
+ CORBA::ULong ret_len = 0;
+
+ if (max_returned_objs == -1)
+ {
+ ret_len = length;
+ }
+ else
+ {
+ ret_len = length < static_cast<CORBA::ULong> (max_returned_objs)
+ ? length
+ : max_returned_objs;
+ }
+
+ CORBA::Container::DescriptionSeq *desc_seq;
+ ACE_NEW_THROW_EX (desc_seq,
+ CORBA::Container::DescriptionSeq (ret_len),
+ CORBA::NO_MEMORY ());
+ ACE_CHECK_RETURN (0);
+
+ desc_seq->length (ret_len);
+ CORBA::Container::DescriptionSeq_var retval = desc_seq;
+ CORBA::Contained::Description_var desc;
+
+ ACE_Configuration_Section_Key contained_key;
+ PortableServer::ObjectId_var oid;
+ CORBA::String_var tmp;
+ TAO_Contained_i *impl = 0;
+
+ for (CORBA::ULong i = 0; i < ret_len; ++i)
+ {
+ ACE_TString contained_path (
+ TAO_IFR_Service_Utils::reference_to_path (contents[i])
+ );
+ impl = TAO_IFR_Service_Utils::path_to_contained (contained_path,
+ this->repo_);
+
+ desc = impl->describe_i (ACE_ENV_SINGLE_ARG_PARAMETER);
+ ACE_CHECK_RETURN (0);
+
+ retval[i].contained_object = CORBA::Contained::_duplicate (contents[i]);
+
+ retval[i].kind = desc->kind;
+ retval[i].value = desc->value;
+ }
+
+ return retval._retn ();
+}
+
+CORBA::ModuleDef_ptr
+TAO_Container_i::create_module (const char *id,
+ const char *name,
+ const char *version
+ ACE_ENV_ARG_DECL)
+ ACE_THROW_SPEC ((CORBA::SystemException))
+{
+ TAO_IFR_WRITE_GUARD_RETURN (CORBA::ModuleDef::_nil ());
+
+ this->update_key (ACE_ENV_SINGLE_ARG_PARAMETER);
+ ACE_CHECK_RETURN (CORBA::ModuleDef::_nil ());
+
+ return this->create_module_i (id,
+ name,
+ version
+ ACE_ENV_ARG_PARAMETER);
+}
+
+CORBA::ModuleDef_ptr
+TAO_Container_i::create_module_i (const char *id,
+ const char *name,
+ const char *version
+ ACE_ENV_ARG_DECL)
+ ACE_THROW_SPEC ((CORBA::SystemException))
+{
+ // new_key is not needed when creating a module, but it is needed
+ // by most of the other creation methods, so a blank one gets passed in.
+ TAO_Container_i::tmp_name_holder_ = name;
+ ACE_Configuration_Section_Key new_key;
+ ACE_TString path =
+ TAO_IFR_Service_Utils::create_common (this->def_kind (),
+ CORBA::dk_Module,
+ this->section_key_,
+ new_key,
+ this->repo_,
+ id,
+ name,
+ &TAO_Container_i::same_as_tmp_name,
+ version,
+ "defns"
+ ACE_ENV_ARG_PARAMETER);
+ ACE_CHECK_RETURN (CORBA::ModuleDef::_nil ());
+
+ // Create the object reference.
+ CORBA::Object_var obj =
+ TAO_IFR_Service_Utils::create_objref (CORBA::dk_Module,
+ path.c_str (),
+ this->repo_
+ ACE_ENV_ARG_PARAMETER);
+ ACE_CHECK_RETURN (CORBA::ModuleDef::_nil ());
+
+ return CORBA::ComponentIR::ModuleDef::_narrow (obj.in ()
+ ACE_ENV_ARG_PARAMETER);
+}
+
+CORBA::ConstantDef_ptr
+TAO_Container_i::create_constant (const char *id,
+ const char *name,
+ const char *version,
+ CORBA::IDLType_ptr type,
+ const CORBA::Any &value
+ ACE_ENV_ARG_DECL)
+ ACE_THROW_SPEC ((CORBA::SystemException))
+{
+ TAO_IFR_WRITE_GUARD_RETURN (CORBA::ConstantDef::_nil ());
+
+ this->update_key (ACE_ENV_SINGLE_ARG_PARAMETER);
+ ACE_CHECK_RETURN (CORBA::ConstantDef::_nil ());
+
+ return this->create_constant_i (id,
+ name,
+ version,
+ type,
+ value
+ ACE_ENV_ARG_PARAMETER);
+}
+
+CORBA::ConstantDef_ptr
+TAO_Container_i::create_constant_i (const char *id,
+ const char *name,
+ const char *version,
+ CORBA::IDLType_ptr type,
+ const CORBA::Any &value
+ ACE_ENV_ARG_DECL)
+ ACE_THROW_SPEC ((CORBA::SystemException))
+{
+ TAO_Container_i::tmp_name_holder_ = name;
+ ACE_Configuration_Section_Key new_key;
+ ACE_TString path =
+ TAO_IFR_Service_Utils::create_common (this->def_kind (),
+ CORBA::dk_Constant,
+ this->section_key_,
+ new_key,
+ this->repo_,
+ id,
+ name,
+ &TAO_Container_i::same_as_tmp_name,
+ version,
+ "defns"
+ ACE_ENV_ARG_PARAMETER);
+ ACE_CHECK_RETURN (CORBA::ConstantDef::_nil ());
+
+ // Get the path to our type and store it.
+ char *type_path = TAO_IFR_Service_Utils::reference_to_path (type);
+
+ this->repo_->config ()->set_string_value (new_key,
+ "type_path",
+ type_path);
+
+ // Store the value.
+ ACE_Message_Block *mb = 0;
+ TAO::Any_Impl *impl = value.impl ();
+
+ if (impl->encoded ())
+ {
+ TAO::Unknown_IDL_Type *unk =
+ dynamic_cast<TAO::Unknown_IDL_Type *> (impl);
+
+ mb = unk->_tao_get_cdr ().steal_contents ();
+ }
+ else
+ {
+ TAO_OutputCDR out;
+ impl->marshal_value (out);
+ TAO_InputCDR in (out);
+ mb = in.steal_contents ();
+ }
+
+ CORBA::TypeCode_var val_tc = value.type ();
+
+ CORBA::TCKind kind = val_tc->kind (ACE_ENV_SINGLE_ARG_PARAMETER);
+ ACE_CHECK_RETURN (CORBA::ConstantDef::_nil ());
+
+ switch (kind)
+ {
+ // The data for these types requires alignment to an 8-byte
+ // boundary - the default for TAO CDR streams is 4.
+ case CORBA::tk_double:
+ case CORBA::tk_ulonglong:
+ case CORBA::tk_longlong:
+ case CORBA::tk_longdouble:
+ mb->rd_ptr (ACE_ptr_align_binary (mb->rd_ptr (),
+ ACE_CDR::MAX_ALIGNMENT));
+ break;
+ default:
+ break;
+ }
+
+ // Align the read pointer with the base, so mb->length()
+ // will be meaningful.
+ mb->crunch ();
+
+ this->repo_->config ()->set_binary_value (new_key,
+ "value",
+ mb->base (),
+ mb->length ());
+
+ // Create the object reference.
+ CORBA::Object_var obj =
+ TAO_IFR_Service_Utils::create_objref (CORBA::dk_Constant,
+ path.c_str (),
+ this->repo_
+ ACE_ENV_ARG_PARAMETER);
+ ACE_CHECK_RETURN (CORBA::ConstantDef::_nil ());
+
+ return CORBA::ConstantDef::_narrow (obj.in ()
+ ACE_ENV_ARG_PARAMETER);
+}
+
+CORBA::StructDef_ptr
+TAO_Container_i::create_struct (const char *id,
+ const char *name,
+ const char *version,
+ const CORBA::StructMemberSeq &members
+ ACE_ENV_ARG_DECL)
+ ACE_THROW_SPEC ((CORBA::SystemException))
+{
+ TAO_IFR_WRITE_GUARD_RETURN (CORBA::StructDef::_nil ());
+
+ this->update_key (ACE_ENV_SINGLE_ARG_PARAMETER);
+ ACE_CHECK_RETURN (CORBA::StructDef::_nil ());
+
+ return this->create_struct_i (id,
+ name,
+ version,
+ members
+ ACE_ENV_ARG_PARAMETER);
+}
+
+CORBA::StructDef_ptr
+TAO_Container_i::create_struct_i (const char *id,
+ const char *name,
+ const char *version,
+ const CORBA::StructMemberSeq &members
+ ACE_ENV_ARG_DECL)
+ ACE_THROW_SPEC ((CORBA::SystemException))
+{
+ TAO_Container_i::tmp_name_holder_ = name;
+ ACE_Configuration_Section_Key new_key;
+ ACE_TString path =
+ TAO_IFR_Service_Utils::create_common (this->def_kind (),
+ CORBA::dk_Struct,
+ this->section_key_,
+ new_key,
+ this->repo_,
+ id,
+ name,
+ &TAO_Container_i::same_as_tmp_name,
+ version,
+ "defns"
+ ACE_ENV_ARG_PARAMETER);
+ ACE_CHECK_RETURN (CORBA::StructDef::_nil ());
+
+ // Open a section for the struct's members.
+ ACE_Configuration_Section_Key refs_key;
+ this->repo_->config ()->open_section (new_key,
+ "refs",
+ 1,
+ refs_key);
+
+ CORBA::ULong count = members.length ();
+ this->repo_->config ()->set_integer_value (refs_key,
+ "count",
+ count);
+ char *member_path = 0;
+
+ // Create a section for each member. We just store the
+ // member name and the path to its database entry.
+ for (CORBA::ULong i = 0; i < count; ++i)
+ {
+ ACE_Configuration_Section_Key member_key;
+ char *stringified = TAO_IFR_Service_Utils::int_to_string (i);
+ this->repo_->config ()->open_section (refs_key,
+ stringified,
+ 1,
+ member_key);
+
+ this->repo_->config ()->set_string_value (member_key,
+ "name",
+ members[i].name.in ());
+
+ member_path =
+ TAO_IFR_Service_Utils::reference_to_path (members[i].type_def.in ());
+
+ this->repo_->config ()->set_string_value (member_key,
+ "path",
+ member_path);
+ }
+
+ CORBA::DefinitionKind def_kind =
+ this->def_kind (ACE_ENV_SINGLE_ARG_PARAMETER);
+ ACE_CHECK_RETURN (CORBA::StructDef::_nil ());
+
+ if (def_kind == CORBA::dk_Struct
+ || def_kind == CORBA::dk_Union
+ || def_kind == CORBA::dk_Exception)
+ {
+ this->update_refs (path.c_str (),
+ name);
+ }
+
+ // Create the object reference.
+ CORBA::Object_var obj =
+ TAO_IFR_Service_Utils::create_objref (CORBA::dk_Struct,
+ path.c_str (),
+ this->repo_
+ ACE_ENV_ARG_PARAMETER);
+ ACE_CHECK_RETURN (CORBA::StructDef::_nil ());
+
+ return CORBA::StructDef::_narrow (obj.in ()
+ ACE_ENV_ARG_PARAMETER);
+}
+
+CORBA::UnionDef_ptr
+TAO_Container_i::create_union (const char *id,
+ const char *name,
+ const char *version,
+ CORBA::IDLType_ptr discriminator_type,
+ const CORBA::UnionMemberSeq &members
+ ACE_ENV_ARG_DECL)
+ ACE_THROW_SPEC ((CORBA::SystemException))
+{
+ TAO_IFR_WRITE_GUARD_RETURN (CORBA::UnionDef::_nil ());
+
+ this->update_key (ACE_ENV_SINGLE_ARG_PARAMETER);
+ ACE_CHECK_RETURN (CORBA::UnionDef::_nil ());
+
+ return this->create_union_i (id,
+ name,
+ version,
+ discriminator_type,
+ members
+ ACE_ENV_ARG_PARAMETER);
+}
+
+CORBA::UnionDef_ptr
+TAO_Container_i::create_union_i (const char *id,
+ const char *name,
+ const char *version,
+ CORBA::IDLType_ptr discriminator_type,
+ const CORBA::UnionMemberSeq &members
+ ACE_ENV_ARG_DECL)
+ ACE_THROW_SPEC ((CORBA::SystemException))
+{
+ TAO_Container_i::tmp_name_holder_ = name;
+ ACE_Configuration_Section_Key new_key;
+ ACE_TString path =
+ TAO_IFR_Service_Utils::create_common (this->def_kind (),
+ CORBA::dk_Union,
+ this->section_key_,
+ new_key,
+ this->repo_,
+ id,
+ name,
+ &TAO_Container_i::same_as_tmp_name,
+ version,
+ "defns"
+ ACE_ENV_ARG_PARAMETER);
+ ACE_CHECK_RETURN (CORBA::UnionDef::_nil ());
+
+ // Add a field to hold the path to the discriminator type.
+ char *disc_path =
+ TAO_IFR_Service_Utils::reference_to_path (discriminator_type);
+
+ this->repo_->config ()->set_string_value (new_key,
+ "disc_path",
+ disc_path);
+
+ ACE_Configuration_Section_Key refs_key;
+
+ // For the union's members.
+ this->repo_->config ()->open_section (new_key,
+ "refs",
+ 1,
+ refs_key);
+
+ CORBA::ULong count = members.length ();
+ this->repo_->config ()->set_integer_value (refs_key,
+ "count",
+ count);
+ char *member_path = 0;
+
+ // Create a section for each member. We store the member
+ // name, its label value, and the path to its database entry.
+ for (CORBA::ULong i = 0; i < count; ++i)
+ {
+ ACE_Configuration_Section_Key member_key;
+ char *stringified = TAO_IFR_Service_Utils::int_to_string (i);
+ this->repo_->config ()->open_section (refs_key,
+ stringified,
+ 1,
+ member_key);
+
+ this->repo_->config ()->set_string_value (member_key,
+ "name",
+ members[i].name.in ());
+
+ member_path =
+ TAO_IFR_Service_Utils::reference_to_path (members[i].type_def.in ());
+
+ this->repo_->config ()->set_string_value (member_key,
+ "path",
+ member_path);
+
+ this->store_label (member_key,
+ members[i].label
+ ACE_ENV_ARG_PARAMETER);
+ }
+
+ CORBA::DefinitionKind def_kind =
+ this->def_kind (ACE_ENV_SINGLE_ARG_PARAMETER);
+ ACE_CHECK_RETURN (CORBA::UnionDef::_nil ());
+
+ if (def_kind == CORBA::dk_Struct
+ || def_kind == CORBA::dk_Union
+ || def_kind == CORBA::dk_Exception)
+ {
+ this->update_refs (path.c_str (),
+ name);
+ }
+
+ // Create the object reference.
+ CORBA::Object_var obj =
+ TAO_IFR_Service_Utils::create_objref (CORBA::dk_Union,
+ path.c_str (),
+ this->repo_
+ ACE_ENV_ARG_PARAMETER);
+ ACE_CHECK_RETURN (CORBA::UnionDef::_nil ());
+
+ return CORBA::UnionDef::_narrow (obj.in ()
+ ACE_ENV_ARG_PARAMETER);
+}
+
+CORBA::EnumDef_ptr
+TAO_Container_i::create_enum (const char *id,
+ const char *name,
+ const char *version,
+ const CORBA::EnumMemberSeq &members
+ ACE_ENV_ARG_DECL)
+ ACE_THROW_SPEC ((CORBA::SystemException))
+{
+ TAO_IFR_WRITE_GUARD_RETURN (CORBA::EnumDef::_nil ());
+
+ this->update_key (ACE_ENV_SINGLE_ARG_PARAMETER);
+ ACE_CHECK_RETURN (CORBA::EnumDef::_nil ());
+
+ return this->create_enum_i (id,
+ name,
+ version,
+ members
+ ACE_ENV_ARG_PARAMETER);
+}
+
+CORBA::EnumDef_ptr
+TAO_Container_i::create_enum_i (const char *id,
+ const char *name,
+ const char *version,
+ const CORBA::EnumMemberSeq &members
+ ACE_ENV_ARG_DECL)
+ ACE_THROW_SPEC ((CORBA::SystemException))
+{
+ TAO_Container_i::tmp_name_holder_ = name;
+ ACE_Configuration_Section_Key new_key;
+ ACE_TString path =
+ TAO_IFR_Service_Utils::create_common (this->def_kind (),
+ CORBA::dk_Enum,
+ this->section_key_,
+ new_key,
+ this->repo_,
+ id,
+ name,
+ &TAO_Container_i::same_as_tmp_name,
+ version,
+ "defns"
+ ACE_ENV_ARG_PARAMETER);
+ ACE_CHECK_RETURN (CORBA::EnumDef::_nil ());
+
+ // Store the member count of the enum.
+ CORBA::ULong count = members.length ();
+ this->repo_->config ()->set_integer_value (new_key,
+ "count",
+ count);
+
+ // Create a section for each member, named for
+ // its ordinal position in the enum,
+ for (CORBA::ULong i = 0; i < count; i++)
+ {
+ ACE_Configuration_Section_Key member_key;
+ char *stringified = TAO_IFR_Service_Utils::int_to_string (i);
+ this->repo_->config ()->open_section (new_key,
+ stringified,
+ 1,
+ member_key);
+
+ this->repo_->config ()->set_string_value (member_key,
+ "name",
+ members[i]);
+ }
+
+ CORBA::DefinitionKind def_kind =
+ this->def_kind (ACE_ENV_SINGLE_ARG_PARAMETER);
+ ACE_CHECK_RETURN (CORBA::EnumDef::_nil ());
+
+ if (def_kind == CORBA::dk_Struct
+ || def_kind == CORBA::dk_Union
+ || def_kind == CORBA::dk_Exception)
+ {
+ this->update_refs (path.c_str (),
+ name);
+ }
+
+ // Create the object reference.
+ CORBA::Object_var obj =
+ TAO_IFR_Service_Utils::create_objref (CORBA::dk_Enum,
+ path.c_str (),
+ this->repo_
+ ACE_ENV_ARG_PARAMETER);
+ ACE_CHECK_RETURN (CORBA::EnumDef::_nil ());
+
+ return CORBA::EnumDef::_narrow (obj.in ()
+ ACE_ENV_ARG_PARAMETER);
+}
+
+CORBA::AliasDef_ptr
+TAO_Container_i::create_alias (const char *id,
+ const char *name,
+ const char *version,
+ CORBA::IDLType_ptr original_type
+ ACE_ENV_ARG_DECL)
+ ACE_THROW_SPEC ((CORBA::SystemException))
+{
+ TAO_IFR_WRITE_GUARD_RETURN (CORBA::AliasDef::_nil ());
+
+ this->update_key (ACE_ENV_SINGLE_ARG_PARAMETER);
+ ACE_CHECK_RETURN (CORBA::AliasDef::_nil ());
+
+ return this->create_alias_i (id,
+ name,
+ version,
+ original_type
+ ACE_ENV_ARG_PARAMETER);
+}
+
+CORBA::AliasDef_ptr
+TAO_Container_i::create_alias_i (const char *id,
+ const char *name,
+ const char *version,
+ CORBA::IDLType_ptr original_type
+ ACE_ENV_ARG_DECL)
+ ACE_THROW_SPEC ((CORBA::SystemException))
+{
+ TAO_Container_i::tmp_name_holder_ = name;
+ ACE_Configuration_Section_Key new_key;
+ ACE_TString path =
+ TAO_IFR_Service_Utils::create_common (this->def_kind (),
+ CORBA::dk_Alias,
+ this->section_key_,
+ new_key,
+ this->repo_,
+ id,
+ name,
+ &TAO_Container_i::same_as_tmp_name,
+ version,
+ "defns"
+ ACE_ENV_ARG_PARAMETER);
+ ACE_CHECK_RETURN (CORBA::AliasDef::_nil ());
+
+ // Get the path to our original type and store it.
+ char *unalias_path =
+ TAO_IFR_Service_Utils::reference_to_path (original_type);
+
+ this->repo_->config ()->set_string_value (new_key,
+ "original_type",
+ unalias_path);
+
+ // Create the object reference.
+ CORBA::Object_var obj =
+ TAO_IFR_Service_Utils::create_objref (CORBA::dk_Alias,
+ path.c_str (),
+ this->repo_
+ ACE_ENV_ARG_PARAMETER);
+ ACE_CHECK_RETURN (CORBA::AliasDef::_nil ());
+
+ return CORBA::AliasDef::_narrow (obj.in ()
+ ACE_ENV_ARG_PARAMETER);
+}
+
+CORBA::InterfaceDef_ptr
+TAO_Container_i::create_interface (const char *id,
+ const char *name,
+ const char *version,
+ const CORBA::InterfaceDefSeq &base_interfaces
+ ACE_ENV_ARG_DECL)
+ ACE_THROW_SPEC ((CORBA::SystemException))
+{
+ TAO_IFR_WRITE_GUARD_RETURN (CORBA::InterfaceDef::_nil ());
+
+ this->update_key (ACE_ENV_SINGLE_ARG_PARAMETER);
+ ACE_CHECK_RETURN (CORBA::InterfaceDef::_nil ());
+
+ return this->create_interface_i (id,
+ name,
+ version,
+ base_interfaces
+ ACE_ENV_ARG_PARAMETER);
+}
+
+CORBA::InterfaceDef_ptr
+TAO_Container_i::create_interface_i (const char *id,
+ const char *name,
+ const char *version,
+ const CORBA::InterfaceDefSeq &base_interfaces
+ ACE_ENV_ARG_DECL)
+ ACE_THROW_SPEC ((CORBA::SystemException))
+{
+ TAO_Container_i::tmp_name_holder_ = name;
+ ACE_Configuration_Section_Key new_key;
+ ACE_TString path =
+ TAO_IFR_Service_Utils::create_common (this->def_kind (),
+ CORBA::dk_Interface,
+ this->section_key_,
+ new_key,
+ this->repo_,
+ id,
+ name,
+ &TAO_Container_i::same_as_tmp_name,
+ version,
+ "defns"
+ ACE_ENV_ARG_PARAMETER);
+ ACE_CHECK_RETURN (CORBA::InterfaceDef::_nil ());
+
+ CORBA::ULong length = base_interfaces.length ();
+
+ if (length > 0)
+ {
+ // Open a section for the base interfaces.
+ ACE_Configuration_Section_Key inherited_key;
+ this->repo_->config ()->open_section (new_key,
+ "inherited",
+ 1,
+ inherited_key);
+ char *inherited_path = 0;
+
+ // Store the path to each base interface.
+ for (CORBA::ULong i = 0; i < length; ++i)
+ {
+ inherited_path =
+ TAO_IFR_Service_Utils::reference_to_path (
+ base_interfaces[i]
+ );
+ char *stringified = TAO_IFR_Service_Utils::int_to_string (i);
+ this->repo_->config ()->set_string_value (inherited_key,
+ stringified,
+ inherited_path);
+ }
+ }
+
+ // Create the object reference.
+ CORBA::Object_var obj =
+ TAO_IFR_Service_Utils::create_objref (CORBA::dk_Interface,
+ path.c_str (),
+ this->repo_
+ ACE_ENV_ARG_PARAMETER);
+ ACE_CHECK_RETURN (CORBA::InterfaceDef::_nil ());
+
+ return CORBA::InterfaceDef::_narrow (obj.in ()
+ ACE_ENV_ARG_PARAMETER);
+}
+
+CORBA::ValueDef_ptr
+TAO_Container_i::create_value (
+ const char *id,
+ const char *name,
+ const char *version,
+ CORBA::Boolean is_custom,
+ CORBA::Boolean is_abstract,
+ CORBA::ValueDef_ptr base_value,
+ CORBA::Boolean is_truncatable,
+ const CORBA::ValueDefSeq &abstract_base_values,
+ const CORBA::InterfaceDefSeq &supported_interfaces,
+ const CORBA::InitializerSeq &initializers
+ ACE_ENV_ARG_DECL
+ )
+ ACE_THROW_SPEC ((CORBA::SystemException))
+{
+ TAO_IFR_WRITE_GUARD_RETURN (CORBA::ValueDef::_nil ());
+
+ this->update_key (ACE_ENV_SINGLE_ARG_PARAMETER);
+ ACE_CHECK_RETURN (CORBA::ValueDef::_nil ());
+
+ return this->create_value_i (id,
+ name,
+ version,
+ is_custom,
+ is_abstract,
+ base_value,
+ is_truncatable,
+ abstract_base_values,
+ supported_interfaces,
+ initializers
+ ACE_ENV_ARG_PARAMETER);
+}
+
+CORBA::ValueDef_ptr
+TAO_Container_i::create_value_i (
+ const char *id,
+ const char *name,
+ const char *version,
+ CORBA::Boolean is_custom,
+ CORBA::Boolean is_abstract,
+ CORBA::ValueDef_ptr base_value,
+ CORBA::Boolean is_truncatable,
+ const CORBA::ValueDefSeq &abstract_base_values,
+ const CORBA::InterfaceDefSeq &supported_interfaces,
+ const CORBA::InitializerSeq &initializers
+ ACE_ENV_ARG_DECL
+ )
+ ACE_THROW_SPEC ((CORBA::SystemException))
+{
+ ACE_Configuration_Section_Key new_key;
+ ACE_TString path =
+ this->create_value_common (this->def_kind (),
+ this->section_key_,
+ new_key,
+ id,
+ name,
+ version,
+ is_custom,
+ is_abstract,
+ base_value,
+ is_truncatable,
+ abstract_base_values,
+ supported_interfaces
+ ACE_ENV_ARG_PARAMETER);
+ ACE_CHECK_RETURN (CORBA::ValueDef::_nil ());
+
+ TAO_IFR_Generic_Utils<CORBA::InitializerSeq>::set_initializers (
+ initializers,
+ this->repo_->config (),
+ new_key
+ );
+
+ // Create the object reference.
+ CORBA::Object_var obj =
+ TAO_IFR_Service_Utils::create_objref (CORBA::dk_Value,
+ path.c_str (),
+ this->repo_
+ ACE_ENV_ARG_PARAMETER);
+ ACE_CHECK_RETURN (CORBA::ValueDef::_nil ());
+
+ return CORBA::ValueDef::_narrow (obj.in ()
+ ACE_ENV_ARG_PARAMETER);
+}
+
+CORBA::ValueBoxDef_ptr
+TAO_Container_i::create_value_box (const char *id,
+ const char *name,
+ const char *version,
+ CORBA::IDLType_ptr original_type_def
+ ACE_ENV_ARG_DECL)
+ ACE_THROW_SPEC ((CORBA::SystemException))
+{
+ TAO_IFR_WRITE_GUARD_RETURN (CORBA::ValueBoxDef::_nil ());
+
+ this->update_key (ACE_ENV_SINGLE_ARG_PARAMETER);
+ ACE_CHECK_RETURN (CORBA::ValueBoxDef::_nil ());
+
+ return this->create_value_box_i (id,
+ name,
+ version,
+ original_type_def
+ ACE_ENV_ARG_PARAMETER);
+}
+
+CORBA::ValueBoxDef_ptr
+TAO_Container_i::create_value_box_i (const char *id,
+ const char *name,
+ const char *version,
+ CORBA::IDLType_ptr original_type_def
+ ACE_ENV_ARG_DECL )
+ ACE_THROW_SPEC ((CORBA::SystemException))
+{
+ TAO_Container_i::tmp_name_holder_ = name;
+ ACE_Configuration_Section_Key new_key;
+ ACE_TString path =
+ TAO_IFR_Service_Utils::create_common (this->def_kind (),
+ CORBA::dk_ValueBox,
+ this->section_key_,
+ new_key,
+ this->repo_,
+ id,
+ name,
+ &TAO_Container_i::same_as_tmp_name,
+ version,
+ "defns"
+ ACE_ENV_ARG_PARAMETER);
+ ACE_CHECK_RETURN (CORBA::ValueBoxDef::_nil ());
+
+ // Get the path to our original type and store it.
+ char *boxed_path =
+ TAO_IFR_Service_Utils::reference_to_path (original_type_def);
+
+ this->repo_->config ()->set_string_value (new_key,
+ "boxed_type",
+ boxed_path);
+
+ // Create the object reference.
+ CORBA::Object_var obj =
+ TAO_IFR_Service_Utils::create_objref (CORBA::dk_ValueBox,
+ path.c_str (),
+ this->repo_
+ ACE_ENV_ARG_PARAMETER);
+ ACE_CHECK_RETURN (CORBA::ValueBoxDef::_nil ());
+
+ return CORBA::ValueBoxDef::_narrow (obj.in ()
+ ACE_ENV_ARG_PARAMETER);
+}
+
+CORBA::ExceptionDef_ptr
+TAO_Container_i::create_exception (const char *id,
+ const char *name,
+ const char *version,
+ const CORBA::StructMemberSeq &members
+ ACE_ENV_ARG_DECL)
+ ACE_THROW_SPEC ((CORBA::SystemException))
+{
+ TAO_IFR_WRITE_GUARD_RETURN (CORBA::ExceptionDef::_nil ());
+
+ this->update_key (ACE_ENV_SINGLE_ARG_PARAMETER);
+ ACE_CHECK_RETURN (CORBA::ExceptionDef::_nil ());
+
+ return this->create_exception_i (id,
+ name,
+ version,
+ members
+ ACE_ENV_ARG_PARAMETER);
+}
+
+CORBA::ExceptionDef_ptr
+TAO_Container_i::create_exception_i (const char *id,
+ const char *name,
+ const char *version,
+ const CORBA::StructMemberSeq &members
+ ACE_ENV_ARG_DECL)
+ ACE_THROW_SPEC ((CORBA::SystemException))
+{
+ TAO_Container_i::tmp_name_holder_ = name;
+ ACE_Configuration_Section_Key new_key;
+ ACE_TString path =
+ TAO_IFR_Service_Utils::create_common (this->def_kind (),
+ CORBA::dk_Exception,
+ this->section_key_,
+ new_key,
+ this->repo_,
+ id,
+ name,
+ &TAO_Container_i::same_as_tmp_name,
+ version,
+ "defns"
+ ACE_ENV_ARG_PARAMETER);
+ ACE_CHECK_RETURN (CORBA::ExceptionDef::_nil ());
+
+ ACE_Configuration_Section_Key refs_key;
+ this->repo_->config ()->open_section (new_key,
+ "refs",
+ 1,
+ refs_key);
+
+ CORBA::ULong count = members.length ();
+ this->repo_->config ()->set_integer_value (refs_key,
+ "count",
+ count);
+ char *member_path = 0;
+
+ // Create a section for each member. We just store the
+ // member name and the path to its database entry.
+ for (CORBA::ULong i = 0; i < count; ++i)
+ {
+ ACE_Configuration_Section_Key member_key;
+ char *stringified = TAO_IFR_Service_Utils::int_to_string (i);
+ this->repo_->config ()->open_section (refs_key,
+ stringified,
+ 1,
+ member_key);
+
+ this->repo_->config ()->set_string_value (member_key,
+ "name",
+ members[i].name.in ());
+
+ member_path =
+ TAO_IFR_Service_Utils::reference_to_path (members[i].type_def.in ());
+
+ this->repo_->config ()->set_string_value (member_key,
+ "path",
+ member_path);
+ }
+
+ // Create the object reference.
+ CORBA::Object_var obj =
+ TAO_IFR_Service_Utils::create_objref (CORBA::dk_Exception,
+ path.c_str (),
+ this->repo_
+ ACE_ENV_ARG_PARAMETER);
+ ACE_CHECK_RETURN (CORBA::ExceptionDef::_nil ());
+
+ return CORBA::ExceptionDef::_narrow (obj.in ()
+ ACE_ENV_ARG_PARAMETER);
+}
+
+CORBA::NativeDef_ptr
+TAO_Container_i::create_native (const char *id,
+ const char *name,
+ const char *version
+ ACE_ENV_ARG_DECL)
+ ACE_THROW_SPEC ((CORBA::SystemException))
+{
+ TAO_IFR_WRITE_GUARD_RETURN (CORBA::NativeDef::_nil ());
+
+ this->update_key (ACE_ENV_SINGLE_ARG_PARAMETER);
+ ACE_CHECK_RETURN (CORBA::NativeDef::_nil ());
+
+ return this->create_native_i (id,
+ name,
+ version
+ ACE_ENV_ARG_PARAMETER);
+}
+
+CORBA::NativeDef_ptr
+TAO_Container_i::create_native_i (const char *id,
+ const char *name,
+ const char *version
+ ACE_ENV_ARG_DECL)
+ ACE_THROW_SPEC ((CORBA::SystemException))
+{
+ TAO_Container_i::tmp_name_holder_ = name;
+ ACE_Configuration_Section_Key new_key;
+ ACE_TString path =
+ TAO_IFR_Service_Utils::create_common (this->def_kind (),
+ CORBA::dk_Native,
+ this->section_key_,
+ new_key,
+ this->repo_,
+ id,
+ name,
+ &TAO_Container_i::same_as_tmp_name,
+ version,
+ "defns"
+ ACE_ENV_ARG_PARAMETER);
+ ACE_CHECK_RETURN (CORBA::NativeDef::_nil ());
+
+ // Create the object reference.
+ CORBA::Object_var obj =
+ TAO_IFR_Service_Utils::create_objref (CORBA::dk_Native,
+ path.c_str (),
+ this->repo_
+ ACE_ENV_ARG_PARAMETER);
+ ACE_CHECK_RETURN (CORBA::NativeDef::_nil ());
+
+ return CORBA::NativeDef::_narrow (obj.in ()
+ ACE_ENV_ARG_PARAMETER);
+}
+
+CORBA::AbstractInterfaceDef_ptr
+TAO_Container_i::create_abstract_interface (
+ const char *id,
+ const char *name,
+ const char *version,
+ const CORBA::AbstractInterfaceDefSeq &base_interfaces
+ ACE_ENV_ARG_DECL
+ )
+ ACE_THROW_SPEC ((CORBA::SystemException))
+{
+ TAO_IFR_WRITE_GUARD_RETURN (CORBA::AbstractInterfaceDef::_nil ());
+
+ this->update_key (ACE_ENV_SINGLE_ARG_PARAMETER);
+ ACE_CHECK_RETURN (CORBA::AbstractInterfaceDef::_nil ());
+
+ return this->create_abstract_interface_i (id,
+ name,
+ version,
+ base_interfaces
+ ACE_ENV_ARG_PARAMETER);
+}
+
+CORBA::AbstractInterfaceDef_ptr
+TAO_Container_i::create_abstract_interface_i (
+ const char *id,
+ const char *name,
+ const char *version,
+ const CORBA::AbstractInterfaceDefSeq &base_interfaces
+ ACE_ENV_ARG_DECL
+ )
+ ACE_THROW_SPEC ((CORBA::SystemException))
+{
+ TAO_Container_i::tmp_name_holder_ = name;
+ ACE_Configuration_Section_Key new_key;
+ ACE_TString path =
+ TAO_IFR_Service_Utils::create_common (this->def_kind (),
+ CORBA::dk_AbstractInterface,
+ this->section_key_,
+ new_key,
+ this->repo_,
+ id,
+ name,
+ &TAO_Container_i::same_as_tmp_name,
+ version,
+ "defns"
+ ACE_ENV_ARG_PARAMETER);
+ ACE_CHECK_RETURN (CORBA::AbstractInterfaceDef::_nil ());
+
+ CORBA::ULong length = base_interfaces.length ();
+
+ if (length > 0)
+ {
+ // Open a section for the base interfaces.
+ ACE_Configuration_Section_Key inherited_key;
+
+ this->repo_->config ()->open_section (new_key,
+ "inherited",
+ 1,
+ inherited_key);
+ char *inherited_path = 0;
+
+ // Store the path to each base interface.
+ for (CORBA::ULong i = 0; i < length; ++i)
+ {
+ inherited_path =
+ TAO_IFR_Service_Utils::reference_to_path (base_interfaces[i]);
+
+ char *stringified = TAO_IFR_Service_Utils::int_to_string (i);
+ this->repo_->config ()->set_string_value (inherited_key,
+ stringified,
+ inherited_path);
+ }
+ }
+
+ // Create the object reference.
+ CORBA::Object_var obj =
+ TAO_IFR_Service_Utils::create_objref (CORBA::dk_AbstractInterface,
+ path.c_str (),
+ this->repo_
+ ACE_ENV_ARG_PARAMETER);
+ ACE_CHECK_RETURN (CORBA::AbstractInterfaceDef::_nil ());
+
+ return CORBA::AbstractInterfaceDef::_narrow (obj.in ()
+ ACE_ENV_ARG_PARAMETER);
+}
+
+CORBA::LocalInterfaceDef_ptr
+TAO_Container_i::create_local_interface (
+ const char *id,
+ const char *name,
+ const char *version,
+ const CORBA::InterfaceDefSeq &base_interfaces
+ ACE_ENV_ARG_DECL
+ )
+ ACE_THROW_SPEC ((CORBA::SystemException))
+{
+ TAO_IFR_WRITE_GUARD_RETURN (CORBA::LocalInterfaceDef::_nil ());
+
+ this->update_key (ACE_ENV_SINGLE_ARG_PARAMETER);
+ ACE_CHECK_RETURN (CORBA::LocalInterfaceDef::_nil ());
+
+ return this->create_local_interface_i (id,
+ name,
+ version,
+ base_interfaces
+ ACE_ENV_ARG_PARAMETER);
+}
+
+CORBA::LocalInterfaceDef_ptr
+TAO_Container_i::create_local_interface_i (
+ const char *id,
+ const char *name,
+ const char *version,
+ const CORBA::InterfaceDefSeq &base_interfaces
+ ACE_ENV_ARG_DECL
+ )
+ ACE_THROW_SPEC ((CORBA::SystemException))
+{
+ TAO_Container_i::tmp_name_holder_ = name;
+ ACE_Configuration_Section_Key new_key;
+ ACE_TString path =
+ TAO_IFR_Service_Utils::create_common (this->def_kind (),
+ CORBA::dk_LocalInterface,
+ this->section_key_,
+ new_key,
+ this->repo_,
+ id,
+ name,
+ &TAO_Container_i::same_as_tmp_name,
+ version,
+ "defns"
+ ACE_ENV_ARG_PARAMETER);
+ ACE_CHECK_RETURN (CORBA::LocalInterfaceDef::_nil ());
+
+ CORBA::ULong length = base_interfaces.length ();
+
+ if (length > 0)
+ {
+ // Open a section for the base interfaces.
+ ACE_Configuration_Section_Key inherited_key;
+
+ this->repo_->config ()->open_section (new_key,
+ "inherited",
+ 1,
+ inherited_key);
+ char *inherited_path = 0;
+
+ // Store the path to each base interface.
+ for (CORBA::ULong i = 0; i < length; ++i)
+ {
+ inherited_path =
+ TAO_IFR_Service_Utils::reference_to_path (base_interfaces[i]);
+
+ char *stringified = TAO_IFR_Service_Utils::int_to_string (i);
+ this->repo_->config ()->set_string_value (inherited_key,
+ stringified,
+ inherited_path);
+ }
+ }
+
+ // Create the object reference.
+ CORBA::Object_var obj =
+ TAO_IFR_Service_Utils::create_objref (CORBA::dk_LocalInterface,
+ path.c_str (),
+ this->repo_
+ ACE_ENV_ARG_PARAMETER);
+ ACE_CHECK_RETURN (CORBA::LocalInterfaceDef::_nil ());
+
+ return CORBA::LocalInterfaceDef::_narrow (obj.in ()
+ ACE_ENV_ARG_PARAMETER);
+}
+
+CORBA::ExtValueDef_ptr
+TAO_Container_i::create_ext_value (
+ const char *id,
+ const char *name,
+ const char *version,
+ CORBA::Boolean is_custom,
+ CORBA::Boolean is_abstract,
+ CORBA::ValueDef_ptr base_value,
+ CORBA::Boolean is_truncatable,
+ const CORBA::ValueDefSeq &abstract_base_values,
+ const CORBA::InterfaceDefSeq &supported_interfaces,
+ const CORBA::ExtInitializerSeq &initializers
+ ACE_ENV_ARG_DECL
+ )
+ ACE_THROW_SPEC ((CORBA::SystemException))
+{
+ TAO_IFR_WRITE_GUARD_RETURN (CORBA::ExtValueDef::_nil ());
+
+ this->update_key (ACE_ENV_SINGLE_ARG_PARAMETER);
+ ACE_CHECK_RETURN (CORBA::ExtValueDef::_nil ());
+
+ return this->create_ext_value_i (id,
+ name,
+ version,
+ is_custom,
+ is_abstract,
+ base_value,
+ is_truncatable,
+ abstract_base_values,
+ supported_interfaces,
+ initializers
+ ACE_ENV_ARG_PARAMETER);
+}
+
+CORBA::ExtValueDef_ptr
+TAO_Container_i::create_ext_value_i (
+ const char *id,
+ const char *name,
+ const char *version,
+ CORBA::Boolean is_custom,
+ CORBA::Boolean is_abstract,
+ CORBA::ValueDef_ptr base_value,
+ CORBA::Boolean is_truncatable,
+ const CORBA::ValueDefSeq &abstract_base_values,
+ const CORBA::InterfaceDefSeq &supported_interfaces,
+ const CORBA::ExtInitializerSeq &initializers
+ ACE_ENV_ARG_DECL
+ )
+ ACE_THROW_SPEC ((CORBA::SystemException))
+{
+ ACE_Configuration_Section_Key new_key;
+ ACE_TString path =
+ this->create_value_common (this->def_kind (),
+ this->section_key_,
+ new_key,
+ id,
+ name,
+ version,
+ is_custom,
+ is_abstract,
+ base_value,
+ is_truncatable,
+ abstract_base_values,
+ supported_interfaces
+ ACE_ENV_ARG_PARAMETER);
+ ACE_CHECK_RETURN (CORBA::ExtValueDef::_nil ());
+
+ /// This does not handle the initializer exceptions, so we do that below.
+ TAO_IFR_Generic_Utils<CORBA::ExtInitializerSeq>::set_initializers (
+ initializers,
+ this->repo_->config (),
+ new_key
+ );
+
+ CORBA::ULong length = initializers.length ();
+
+ if (length > 0)
+ {
+ ACE_Configuration_Section_Key initializers_key, initializer_key;
+ char *stringified = 0;
+
+ this->repo_->config ()->open_section (new_key,
+ "initializers",
+ 0,
+ initializers_key);
+
+ for (CORBA::ULong i = 0; i < length; ++i)
+ {
+ stringified = TAO_IFR_Service_Utils::int_to_string (i);
+ this->repo_->config ()->open_section (initializers_key,
+ stringified,
+ 0,
+ initializer_key);
+
+ TAO_ExtValueDef_i impl (this->repo_);
+ impl.section_key (new_key);
+ impl.exceptions (initializer_key,
+ "excepts",
+ initializers[i].exceptions);
+ }
+ }
+
+ // Create the object reference.
+ CORBA::Object_var obj =
+ TAO_IFR_Service_Utils::create_objref (CORBA::dk_Value,
+ path.c_str (),
+ this->repo_
+ ACE_ENV_ARG_PARAMETER);
+ ACE_CHECK_RETURN (CORBA::ExtValueDef::_nil ());
+
+ return CORBA::ExtValueDef::_narrow (obj.in ()
+ ACE_ENV_ARG_PARAMETER);
+}
+
+int
+TAO_Container_i::same_as_tmp_name (const char *name)
+{
+ return ACE_OS::strcmp (TAO_Container_i::tmp_name_holder_, name) == 0;
+}
+
+void
+TAO_Container_i::tmp_name_holder (const char *name)
+{
+ TAO_Container_i::tmp_name_holder_ = name;
+}
+
+void
+TAO_Container_i::lookup_name_recursive (
+ ACE_Unbounded_Queue<CORBA::DefinitionKind> &kind_queue,
+ ACE_Unbounded_Queue<ACE_TString> &path_queue,
+ const char *search_name,
+ CORBA::Long levels_to_search,
+ CORBA::DefinitionKind limit_type,
+ CORBA::Boolean exclude_inherited
+ ACE_ENV_ARG_DECL
+ )
+{
+ ACE_Configuration_Section_Key defns_key;
+ int status =
+ this->repo_->config ()->open_section (this->section_key_,
+ "defns",
+ 0,
+ defns_key);
+
+ if (status == 0)
+ {
+ int index = 0;
+ ACE_TString section_name;
+ while (this->repo_->config ()->enumerate_sections (defns_key,
+ index++,
+ section_name)
+ == 0)
+ {
+ ACE_Configuration_Section_Key defn_key;
+ this->repo_->config ()->open_section (defns_key,
+ section_name.c_str (),
+ 0,
+ defn_key);
+
+ u_int kind = 0;
+ this->repo_->config ()->get_integer_value (defn_key,
+ "def_kind",
+ kind);
+
+ CORBA::DefinitionKind def_kind =
+ static_cast<CORBA::DefinitionKind> (kind);
+
+ ACE_TString id;
+ this->repo_->config ()->get_string_value (defn_key,
+ "id",
+ id);
+
+ ACE_TString path;
+ this->repo_->config ()->get_string_value (
+ this->repo_->repo_ids_key (),
+ id.c_str (),
+ path
+ );
+
+ if (limit_type == CORBA::dk_all || limit_type == def_kind)
+ {
+ ACE_TString name;
+ this->repo_->config ()->get_string_value (defn_key,
+ "name",
+ name);
+
+ if (ACE_OS::strcmp (name.c_str (), search_name) == 0)
+ {
+ kind_queue.enqueue_tail (def_kind);
+
+ path_queue.enqueue_tail (path);
+ }
+ }
+
+ if (levels_to_search == -1 || levels_to_search > 1)
+ {
+ TAO_Container_i *impl =
+ TAO_IFR_Service_Utils::path_to_container (path,
+ this->repo_);
+
+ // This member may not be a container.
+ if (impl == 0)
+ {
+ continue;
+ }
+
+ impl->lookup_name_recursive (kind_queue,
+ path_queue,
+ search_name,
+ levels_to_search == -1
+ ? -1
+ : levels_to_search - 1,
+ limit_type,
+ exclude_inherited
+ ACE_ENV_ARG_PARAMETER);
+ ACE_CHECK;
+ }
+ }
+ }
+
+ CORBA::DefinitionKind kind = this->def_kind (ACE_ENV_SINGLE_ARG_PARAMETER);
+ ACE_CHECK;
+
+ if (kind == CORBA::dk_Interface || kind == CORBA::dk_Value)
+ {
+ if (limit_type == CORBA::dk_all || limit_type == CORBA::dk_Attribute)
+ {
+ this->lookup_attr (kind_queue,
+ path_queue,
+ search_name,
+ exclude_inherited);
+ }
+
+ if (limit_type == CORBA::dk_all || limit_type == CORBA::dk_Operation)
+ {
+ this->lookup_op (kind_queue,
+ path_queue,
+ search_name,
+ exclude_inherited);
+ }
+ }
+}
+
+void
+TAO_Container_i:: lookup_attr (
+ ACE_Unbounded_Queue<CORBA::DefinitionKind> &kind_queue,
+ ACE_Unbounded_Queue<ACE_TString> &path_queue,
+ const char *search_name,
+ CORBA::Boolean exclude_inherited
+ )
+{
+ int index = 0;
+ ACE_TString section_name;
+
+ ACE_Configuration_Section_Key sub_key;
+ int status =
+ this->repo_->config ()->open_section (this->section_key_,
+ "attrs",
+ 0,
+ sub_key);
+
+ if (status == 0)
+ {
+ while (this->repo_->config ()->enumerate_sections (sub_key,
+ index++,
+ section_name)
+ == 0)
+ {
+ ACE_Configuration_Section_Key member_key;
+ this->repo_->config ()->open_section (sub_key,
+ section_name.c_str (),
+ 0,
+ member_key);
+
+ ACE_TString name;
+ this->repo_->config ()->get_string_value (member_key,
+ "name",
+ name);
+
+ if (name == search_name)
+ {
+ kind_queue.enqueue_tail (CORBA::dk_Attribute);
+
+ ACE_TString id;
+ this->repo_->config ()->get_string_value (member_key,
+ "id",
+ id);
+
+ ACE_TString path;
+ this->repo_->config ()->get_string_value (
+ this->repo_->repo_ids_key (),
+ id.c_str (),
+ path
+ );
+
+ path_queue.enqueue_tail (path);
+ }
+ }
+ }
+
+ if (exclude_inherited == 0)
+ {
+ ACE_Configuration_Section_Key bases_key;
+ status =
+ this->repo_->config ()->open_section (this->section_key_,
+ "inherited",
+ 0,
+ bases_key);
+
+ if (status == 0)
+ {
+ ACE_Configuration::VALUETYPE type;
+ index = 0;
+ while (this->repo_->config ()->enumerate_values (
+ bases_key,
+ index++,
+ section_name,
+ type
+ )
+ == 0)
+ {
+ ACE_TString path;
+ this->repo_->config ()->get_string_value (
+ bases_key,
+ section_name.c_str (),
+ path);
+
+ ACE_Configuration_Section_Key base_key;
+ this->repo_->config ()->expand_path (this->repo_->root_key (),
+ path,
+ base_key,
+ 0);
+
+ TAO_InterfaceDef_i impl (this->repo_);
+ impl.section_key (base_key);
+
+ impl.lookup_attr (kind_queue,
+ path_queue,
+ search_name,
+ exclude_inherited);
+ }
+ }
+ }
+}
+
+void
+TAO_Container_i::lookup_op (
+ ACE_Unbounded_Queue<CORBA::DefinitionKind> &kind_queue,
+ ACE_Unbounded_Queue<ACE_TString> &path_queue,
+ const char *search_name,
+ CORBA::Boolean exclude_inherited
+ )
+{
+ int index = 0;
+ ACE_TString section_name;
+
+ ACE_Configuration_Section_Key sub_key;
+ int status =
+ this->repo_->config ()->open_section (this->section_key_,
+ "ops",
+ 0,
+ sub_key);
+
+ if (status == 0)
+ {
+ while (this->repo_->config ()->enumerate_sections (sub_key,
+ index++,
+ section_name)
+ == 0)
+ {
+ ACE_Configuration_Section_Key member_key;
+ this->repo_->config ()->open_section (sub_key,
+ section_name.c_str (),
+ 0,
+ member_key);
+
+ ACE_TString name;
+ this->repo_->config ()->get_string_value (member_key,
+ "name",
+ name);
+
+ if (name == search_name)
+ {
+ kind_queue.enqueue_tail (CORBA::dk_Operation);
+
+ ACE_TString id;
+ this->repo_->config ()->get_string_value (member_key,
+ "id",
+ id);
+
+ ACE_TString path;
+ this->repo_->config ()->get_string_value (
+ this->repo_->repo_ids_key (),
+ id.c_str (),
+ path
+ );
+
+ path_queue.enqueue_tail (path);
+ }
+ }
+ }
+
+ if (exclude_inherited == 0)
+ {
+ ACE_Configuration_Section_Key bases_key;
+ status =
+ this->repo_->config ()->open_section (this->section_key_,
+ "inherited",
+ 0,
+ bases_key);
+
+ if (status == 0)
+ {
+ ACE_Configuration::VALUETYPE type;
+ index = 0;
+
+ while (this->repo_->config ()->enumerate_values (
+ bases_key,
+ index++,
+ section_name,
+ type
+ )
+ == 0)
+ {
+ ACE_TString path;
+ this->repo_->config ()->get_string_value (
+ bases_key,
+ section_name.c_str (),
+ path);
+
+ ACE_Configuration_Section_Key base_key;
+ this->repo_->config ()->expand_path (this->repo_->root_key (),
+ path,
+ base_key,
+ 0);
+
+ TAO_InterfaceDef_i impl (this->repo_);
+ impl.section_key (base_key);
+
+ impl.lookup_op (kind_queue,
+ path_queue,
+ search_name,
+ exclude_inherited);
+ }
+ }
+ }
+}
+
+void
+TAO_Container_i::store_label (ACE_Configuration_Section_Key key,
+ const CORBA::Any &value
+ ACE_ENV_ARG_DECL)
+ ACE_THROW_SPEC ((CORBA::SystemException))
+{
+ CORBA::TypeCode_var tc = value.type ();
+
+ CORBA::TCKind kind = tc->kind (ACE_ENV_SINGLE_ARG_PARAMETER);
+ ACE_CHECK;
+
+ u_int result = 0;
+ int default_label = 0;
+
+ switch (kind)
+ {
+ case CORBA::tk_octet:
+ default_label = 1;
+ break;
+ case CORBA::tk_char:
+ {
+ CORBA::Char x;
+ value >>= CORBA::Any::to_char (x);
+ result = static_cast<u_int> (x);
+ break;
+ }
+ case CORBA::tk_wchar:
+ {
+ CORBA::WChar x;
+ value >>= CORBA::Any::to_wchar (x);
+ result = static_cast<u_int> (x);
+ break;
+ }
+ case CORBA::tk_boolean:
+ {
+ CORBA::Boolean x;
+ value >>= CORBA::Any::to_boolean (x);
+ result = static_cast<u_int> (x);
+ break;
+ }
+ case CORBA::tk_short:
+ {
+ CORBA::Short x;
+ value >>= x;
+ result = static_cast<u_int> (x);
+ break;
+ }
+ case CORBA::tk_ushort:
+ {
+ CORBA::UShort x;
+ value >>= x;
+ result = static_cast<u_int> (x);
+ break;
+ }
+ case CORBA::tk_long:
+ {
+ CORBA::Long x;
+ value >>= x;
+ result = static_cast<u_int> (x);
+ break;
+ }
+ case CORBA::tk_ulong:
+ {
+ CORBA::ULong x;
+ value >>= x;
+ result = static_cast<u_int> (x);
+ break;
+ }
+#if !defined (ACE_LACKS_LONGLONG_T)
+ case CORBA::tk_longlong:
+ {
+ CORBA::LongLong x;
+ value >>= x;
+ // We could lose data here.
+ result = static_cast<u_int> (x);
+ break;
+ }
+#endif /* ACE_LACKS_LONGLONG_T */
+#if !(defined (ACE_LACKS_LONGLONG_T) || defined (ACE_LACKS_UNSIGNEDLONGLONG_T))
+ case CORBA::tk_ulonglong:
+ {
+ CORBA::ULongLong x;
+ value >>= x;
+ // We could lose data here.
+ result = static_cast<u_int> (x);
+ break;
+ }
+#endif
+ case CORBA::tk_enum:
+ {
+ CORBA::ULong x;
+ TAO::Any_Impl *impl = value.impl ();
+ TAO_InputCDR in (static_cast<ACE_Message_Block *> (0));
+
+ if (impl->encoded ())
+ {
+ TAO::Unknown_IDL_Type *unk =
+ dynamic_cast<TAO::Unknown_IDL_Type *> (impl);
+
+ in = unk->_tao_get_cdr ();
+ }
+ else
+ {
+ TAO_OutputCDR out;
+ impl->marshal_value (out);
+ TAO_InputCDR tmp (out);
+ in = tmp;
+ }
+
+ in.read_ulong (x);
+ result = static_cast<u_int> (x);
+ break;
+ }
+ default:
+ break;
+ }
+
+ if (default_label == 1)
+ {
+ this->repo_->config ()->set_string_value (key,
+ "label",
+ "default");
+ }
+ else
+ {
+ this->repo_->config ()->set_integer_value (key,
+ "label",
+ result);
+ }
+}
+
+void
+TAO_Container_i::update_refs (const char *path,
+ const char *name)
+{
+ ACE_Configuration_Section_Key refs_key;
+ int status =
+ this->repo_->config ()->open_section (this->section_key_,
+ "refs",
+ 0,
+ refs_key);
+
+ // If this container has no "refs" section, there is nothing to do.
+ if (status != 0)
+ {
+ return;
+ }
+
+ u_int count = 0;
+ this->repo_->config ()->get_integer_value (refs_key,
+ "count",
+ count);
+
+ int index = 0;
+ ACE_TString section_name;
+ while (this->repo_->config ()->enumerate_sections (refs_key,
+ index++,
+ section_name)
+ == 0)
+ {
+ ACE_Configuration_Section_Key ref_key;
+ this->repo_->config ()->open_section (refs_key,
+ section_name.c_str (),
+ 0,
+ ref_key);
+
+ ACE_TString ref_name;
+ this->repo_->config ()->get_string_value (ref_key,
+ "name",
+ ref_name);
+
+ ACE_TString::size_type pos = ref_name.find (this->repo_->extension ());
+
+ // If one of the names has been mangled by move(), fix it.
+ if (pos != ACE_TString::npos)
+ {
+ // If we're just changing the path after doing a 'move',
+ // we don't want to change the name, so we've passed in 0.
+ if (name != 0)
+ {
+ this->repo_->config ()->set_string_value (ref_key,
+ "name",
+ name);
+ }
+ else
+ {
+ this->repo_->config ()->set_string_value (ref_key,
+ "name",
+ ref_name.substr (0, pos));
+ }
+
+ this->repo_->config ()->set_string_value (ref_key,
+ "path",
+ path);
+
+ return;
+ }
+ }
+
+ // If we're just changing the path after doing a 'move', we're done.
+ if (name == 0)
+ {
+ return;
+ }
+
+ // Add a new reference.
+ ACE_Configuration_Section_Key new_key;
+ char *stringified = TAO_IFR_Service_Utils::int_to_string (count);
+ this->repo_->config ()->open_section (refs_key,
+ stringified,
+ 1,
+ new_key);
+
+ this->repo_->config ()->set_string_value (new_key,
+ "name",
+ name);
+
+ this->repo_->config ()->set_string_value (new_key,
+ "path",
+ path);
+
+ this->repo_->config ()->set_integer_value (refs_key,
+ "count",
+ count + 1);
+}
+
+ACE_TString
+TAO_Container_i::create_value_common (
+ CORBA::DefinitionKind container_kind,
+ ACE_Configuration_Section_Key &container_key,
+ ACE_Configuration_Section_Key &new_key,
+ const char *id,
+ const char *name,
+ const char *version,
+ CORBA::Boolean is_custom,
+ CORBA::Boolean is_abstract,
+ CORBA::ValueDef_ptr base_value,
+ CORBA::Boolean is_truncatable,
+ const CORBA::ValueDefSeq &abstract_base_values,
+ const CORBA::InterfaceDefSeq &supported_interfaces
+ ACE_ENV_ARG_DECL
+ )
+{
+ TAO_Container_i::tmp_name_holder_ = name;
+ ACE_TString path;
+ path =
+ TAO_IFR_Service_Utils::create_common (container_kind,
+ CORBA::dk_Value,
+ container_key,
+ new_key,
+ this->repo_,
+ id,
+ name,
+ &TAO_Container_i::same_as_tmp_name,
+ version,
+ "defns"
+ ACE_ENV_ARG_PARAMETER);
+ ACE_CHECK_RETURN (path);
+
+ this->repo_->config ()->set_integer_value (new_key,
+ "is_custom",
+ (CORBA::ULong) is_custom);
+
+ this->repo_->config ()->set_integer_value (new_key,
+ "is_abstract",
+ (CORBA::ULong) is_abstract);
+
+ this->repo_->config ()->set_integer_value (new_key,
+ "is_truncatable",
+ (CORBA::ULong) is_truncatable);
+ if (!CORBA::is_nil (base_value))
+ {
+ const char *base_path =
+ TAO_IFR_Service_Utils::reference_to_path (base_value);
+
+ // Get the servant's key into the temporary key holder, because
+ // the name clash checker for base valuetypes is static, and has
+ // no other way to know about a specific key.
+ this->repo_->config ()->expand_path (
+ this->repo_->root_key (),
+ base_path,
+ TAO_IFR_Service_Utils::tmp_key_,
+ 0
+ );
+ TAO_IFR_Service_Utils::name_exists (&TAO_ValueDef_i::name_clash,
+ new_key,
+ this->repo_,
+ CORBA::dk_Value
+ ACE_ENV_ARG_PARAMETER);
+ ACE_CHECK_RETURN (path);
+
+ ACE_TString base_value_id;
+ this->repo_->config ()->get_string_value (TAO_IFR_Service_Utils::tmp_key_,
+ "id",
+ base_value_id);
+
+ this->repo_->config ()->set_string_value (new_key,
+ "base_value",
+ base_value_id);
+ }
+
+ CORBA::ULong length = abstract_base_values.length ();
+
+ if (length > 0)
+ {
+ ACE_Configuration_Section_Key bases_key;
+ this->repo_->config ()->open_section (this->section_key_,
+ "abstract_bases",
+ 1,
+ bases_key);
+ this->repo_->config ()->set_integer_value (bases_key,
+ "count",
+ length);
+
+ ACE_TString base_id;
+ const char *base_path = 0;
+ char *stringified = 0;
+
+ for (CORBA::ULong i = 0; i < length; ++i)
+ {
+ base_path =
+ TAO_IFR_Service_Utils::reference_to_path (
+ abstract_base_values[i]
+ );
+
+ // Get the servant's key into the temporary key holder, because
+ // the name clash checker for base interfaces is static, and has
+ // no other way to know about a specific key.
+ this->repo_->config ()->expand_path (
+ this->repo_->root_key (),
+ base_path,
+ TAO_IFR_Service_Utils::tmp_key_,
+ 0
+ );
+ TAO_IFR_Service_Utils::name_exists (&TAO_ValueDef_i::name_clash,
+ new_key,
+ this->repo_,
+ CORBA::dk_Value
+ ACE_ENV_ARG_PARAMETER);
+ ACE_CHECK_RETURN (path);
+
+ this->repo_->config ()->get_string_value (
+ TAO_IFR_Service_Utils::tmp_key_,
+ "id",
+ base_id
+ );
+ stringified = TAO_IFR_Service_Utils::int_to_string (i);
+ this->repo_->config ()->set_string_value (bases_key,
+ stringified,
+ base_id);
+ }
+ }
+
+ length = supported_interfaces.length ();
+
+ if (length > 0)
+ {
+ ACE_Configuration_Section_Key supported_key;
+ this->repo_->config ()->open_section (new_key,
+ "supported",
+ 1,
+ supported_key);
+ this->repo_->config ()->set_integer_value (supported_key,
+ "count",
+ length);
+ ACE_TString supported_id;
+ const char *supported_path = 0;
+ CORBA::ULong kind = 0;
+ CORBA::Boolean concrete_seen = 0;
+ CORBA::DefinitionKind def_kind;
+
+ for (CORBA::ULong i = 0; i < length; ++i)
+ {
+ supported_path =
+ TAO_IFR_Service_Utils::reference_to_path (
+ supported_interfaces[i]
+ );
+
+ // Get the servant's key into the temporary key holder, because
+ // the name clash checker for base interfaces is static, and has
+ // no other way to know about a specific key.
+ this->repo_->config ()->expand_path (this->repo_->root_key (),
+ supported_path,
+ TAO_IFR_Service_Utils::tmp_key_,
+ 0);
+ this->repo_->config ()->get_integer_value (
+ TAO_IFR_Service_Utils::tmp_key_,
+ "def_kind",
+ kind);
+ def_kind = static_cast<CORBA::DefinitionKind> (kind);
+
+ if (def_kind == CORBA::dk_Interface)
+ {
+ if (concrete_seen == 0)
+ {
+ concrete_seen = 1;
+ }
+ else
+ {
+ ACE_THROW_RETURN (CORBA::BAD_PARAM (CORBA::OMGVMCID | 12,
+ CORBA::COMPLETED_NO),
+ path);
+ }
+ }
+
+ TAO_IFR_Service_Utils::name_exists (&TAO_ValueDef_i::name_clash,
+ new_key,
+ this->repo_,
+ CORBA::dk_Value
+ ACE_ENV_ARG_PARAMETER);
+ ACE_CHECK_RETURN (path);
+
+ this->repo_->config ()->get_string_value (
+ TAO_IFR_Service_Utils::tmp_key_,
+ "id",
+ supported_id
+ );
+ char *stringified = TAO_IFR_Service_Utils::int_to_string (i);
+ this->repo_->config ()->set_string_value (supported_key,
+ stringified,
+ supported_id);
+ }
+ }
+
+ return path;
+}
+
+TAO_END_VERSIONED_NAMESPACE_DECL
diff --git a/TAO/orbsvcs/orbsvcs/IFRService/Container_i.h b/TAO/orbsvcs/orbsvcs/IFRService/Container_i.h
new file mode 100644
index 00000000000..ab8e833579b
--- /dev/null
+++ b/TAO/orbsvcs/orbsvcs/IFRService/Container_i.h
@@ -0,0 +1,479 @@
+// -*- C++ -*-
+
+// $Id$
+
+// ============================================================================
+//
+// = LIBRARY
+// TAO/orbsvcs/orbsvcs/IFRService
+//
+// = FILENAME
+// Container_i.h
+//
+// = DESCRIPTION
+// Container servant class.
+//
+// = AUTHOR
+// Jeff Parsons <parsons@cs.wustl.edu>
+//
+// ============================================================================
+
+#ifndef TAO_CONTAINER_I_H
+#define TAO_CONTAINER_I_H
+
+#include "orbsvcs/IFRService/IRObject_i.h"
+#include "orbsvcs/IFRService/ifr_service_export.h"
+
+#if !defined (ACE_LACKS_PRAGMA_ONCE)
+# pragma once
+#endif /* ACE_LACKS_PRAGMA_ONCE */
+
+#if defined(_MSC_VER)
+#pragma warning(push)
+#pragma warning(disable:4250)
+#endif /* _MSC_VER */
+
+TAO_BEGIN_VERSIONED_NAMESPACE_DECL
+
+class TAO_Repository_i;
+
+class TAO_IFRService_Export TAO_Container_i : public virtual TAO_IRObject_i
+{
+ // = TITLE
+ // TAO_Container_i
+ //
+ // = DESCRIPTION
+ // Abstract base class used to form a containment hierarchy
+ // in the Interface Repository, by containing objects
+ // derived from the Contained interface.
+ //
+public:
+// template<typename T>
+// friend class TAO_Port_Utils;
+
+ TAO_Container_i (TAO_Repository_i *repo);
+ // Constructor.
+
+ virtual ~TAO_Container_i (void);
+ // Destructor.
+
+ virtual void destroy (
+ ACE_ENV_SINGLE_ARG_DECL_WITH_DEFAULTS
+ )
+ ACE_THROW_SPEC ((CORBA::SystemException));
+ // Remove our contents.
+
+ virtual void destroy_i (
+ ACE_ENV_SINGLE_ARG_DECL_WITH_DEFAULTS
+ )
+ ACE_THROW_SPEC ((CORBA::SystemException));
+
+ virtual CORBA::Contained_ptr lookup (
+ const char *search_name
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS
+ )
+ ACE_THROW_SPEC ((CORBA::SystemException));
+
+ CORBA::Contained_ptr lookup_i (
+ const char *search_name
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS
+ )
+ ACE_THROW_SPEC ((CORBA::SystemException));
+
+ virtual CORBA::ContainedSeq *contents (
+ CORBA::DefinitionKind limit_type,
+ CORBA::Boolean exclude_inherited
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS
+ )
+ ACE_THROW_SPEC ((CORBA::SystemException));
+
+ CORBA::ContainedSeq *contents_i (
+ CORBA::DefinitionKind limit_type,
+ CORBA::Boolean exclude_inherited
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS
+ )
+ ACE_THROW_SPEC ((CORBA::SystemException));
+
+ virtual CORBA::ContainedSeq *lookup_name (
+ const char *search_name,
+ CORBA::Long levels_to_search,
+ CORBA::DefinitionKind limit_type,
+ CORBA::Boolean exclude_inherited
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS
+ )
+ ACE_THROW_SPEC ((CORBA::SystemException));
+
+ CORBA::ContainedSeq *lookup_name_i (
+ const char *search_name,
+ CORBA::Long levels_to_search,
+ CORBA::DefinitionKind limit_type,
+ CORBA::Boolean exclude_inherited
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS
+ )
+ ACE_THROW_SPEC ((CORBA::SystemException));
+
+ virtual CORBA::Container::DescriptionSeq *describe_contents (
+ CORBA::DefinitionKind limit_type,
+ CORBA::Boolean exclude_inherited,
+ CORBA::Long max_returned_objs
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS
+ )
+ ACE_THROW_SPEC ((CORBA::SystemException));
+
+ CORBA::Container::DescriptionSeq *describe_contents_i (
+ CORBA::DefinitionKind limit_type,
+ CORBA::Boolean exclude_inherited,
+ CORBA::Long max_returned_objs
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS
+ )
+ ACE_THROW_SPEC ((CORBA::SystemException));
+
+ virtual CORBA::ModuleDef_ptr create_module (
+ const char *id,
+ const char *name,
+ const char *version
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS
+ )
+ ACE_THROW_SPEC ((CORBA::SystemException));
+
+ CORBA::ModuleDef_ptr create_module_i (
+ const char *id,
+ const char *name,
+ const char *version
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS
+ )
+ ACE_THROW_SPEC ((CORBA::SystemException));
+
+ virtual CORBA::ConstantDef_ptr create_constant (
+ const char *id,
+ const char *name,
+ const char *version,
+ CORBA::IDLType_ptr type,
+ const CORBA::Any & value
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS
+ )
+ ACE_THROW_SPEC ((CORBA::SystemException));
+
+ CORBA::ConstantDef_ptr create_constant_i (
+ const char *id,
+ const char *name,
+ const char *version,
+ CORBA::IDLType_ptr type,
+ const CORBA::Any & value
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS
+ )
+ ACE_THROW_SPEC ((CORBA::SystemException));
+
+ virtual CORBA::StructDef_ptr create_struct (
+ const char *id,
+ const char *name,
+ const char *version,
+ const CORBA::StructMemberSeq &members
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS
+ )
+ ACE_THROW_SPEC ((CORBA::SystemException));
+
+ CORBA::StructDef_ptr create_struct_i (
+ const char *id,
+ const char *name,
+ const char *version,
+ const CORBA::StructMemberSeq &members
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS
+ )
+ ACE_THROW_SPEC ((CORBA::SystemException));
+
+ virtual CORBA::UnionDef_ptr create_union (
+ const char *id,
+ const char *name,
+ const char *version,
+ CORBA::IDLType_ptr discriminator_type,
+ const CORBA::UnionMemberSeq &members
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS
+ )
+ ACE_THROW_SPEC ((CORBA::SystemException));
+
+ CORBA::UnionDef_ptr create_union_i (
+ const char *id,
+ const char *name,
+ const char *version,
+ CORBA::IDLType_ptr discriminator_type,
+ const CORBA::UnionMemberSeq &members
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS
+ )
+ ACE_THROW_SPEC ((CORBA::SystemException));
+
+ virtual CORBA::EnumDef_ptr create_enum (
+ const char *id,
+ const char *name,
+ const char *version,
+ const CORBA::EnumMemberSeq &members
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS
+ )
+ ACE_THROW_SPEC ((CORBA::SystemException));
+
+ CORBA::EnumDef_ptr create_enum_i (
+ const char *id,
+ const char *name,
+ const char *version,
+ const CORBA::EnumMemberSeq &members
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS
+ )
+ ACE_THROW_SPEC ((CORBA::SystemException));
+
+ virtual CORBA::AliasDef_ptr create_alias (
+ const char *id,
+ const char *name,
+ const char *version,
+ CORBA::IDLType_ptr original_type
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS
+ )
+ ACE_THROW_SPEC ((CORBA::SystemException));
+
+ CORBA::AliasDef_ptr create_alias_i (
+ const char *id,
+ const char *name,
+ const char *version,
+ CORBA::IDLType_ptr original_type
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS
+ )
+ ACE_THROW_SPEC ((CORBA::SystemException));
+
+ virtual CORBA::InterfaceDef_ptr create_interface (
+ const char *id,
+ const char *name,
+ const char *version,
+ const CORBA::InterfaceDefSeq &base_interfaces
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS
+ )
+ ACE_THROW_SPEC ((CORBA::SystemException));
+
+ CORBA::InterfaceDef_ptr create_interface_i (
+ const char *id,
+ const char *name,
+ const char *version,
+ const CORBA::InterfaceDefSeq &base_interfaces
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS
+ )
+ ACE_THROW_SPEC ((CORBA::SystemException));
+
+ virtual CORBA::ValueDef_ptr create_value (
+ const char *id,
+ const char *name,
+ const char *version,
+ CORBA::Boolean is_custom,
+ CORBA::Boolean is_abstract,
+ CORBA::ValueDef_ptr base_value,
+ CORBA::Boolean is_truncatable,
+ const CORBA::ValueDefSeq &abstract_base_values,
+ const CORBA::InterfaceDefSeq & supported_interfaces,
+ const CORBA::InitializerSeq &initializers
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS
+ )
+ ACE_THROW_SPEC ((CORBA::SystemException));
+
+ CORBA::ValueDef_ptr create_value_i (
+ const char *id,
+ const char *name,
+ const char *version,
+ CORBA::Boolean is_custom,
+ CORBA::Boolean is_abstract,
+ CORBA::ValueDef_ptr base_value,
+ CORBA::Boolean is_truncatable,
+ const CORBA::ValueDefSeq &abstract_base_values,
+ const CORBA::InterfaceDefSeq & supported_interfaces,
+ const CORBA::InitializerSeq &initializers
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS
+ )
+ ACE_THROW_SPEC ((CORBA::SystemException));
+
+ virtual CORBA::ValueBoxDef_ptr create_value_box (
+ const char *id,
+ const char *name,
+ const char *version,
+ CORBA::IDLType_ptr original_type_def
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS
+ )
+ ACE_THROW_SPEC ((CORBA::SystemException));
+
+ CORBA::ValueBoxDef_ptr create_value_box_i (
+ const char *id,
+ const char *name,
+ const char *version,
+ CORBA::IDLType_ptr original_type_def
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS
+ )
+ ACE_THROW_SPEC ((CORBA::SystemException));
+
+ virtual CORBA::ExceptionDef_ptr create_exception (
+ const char *id,
+ const char *name,
+ const char *version,
+ const CORBA::StructMemberSeq &members
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS
+ )
+ ACE_THROW_SPEC ((CORBA::SystemException));
+
+ CORBA::ExceptionDef_ptr create_exception_i (
+ const char *id,
+ const char *name,
+ const char *version,
+ const CORBA::StructMemberSeq &members
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS
+ )
+ ACE_THROW_SPEC ((CORBA::SystemException));
+
+ virtual CORBA::NativeDef_ptr create_native (
+ const char *id,
+ const char *name,
+ const char *version
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS
+ )
+ ACE_THROW_SPEC ((CORBA::SystemException));
+
+ CORBA::NativeDef_ptr create_native_i (
+ const char *id,
+ const char *name,
+ const char *version
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS
+ )
+ ACE_THROW_SPEC ((CORBA::SystemException));
+
+ virtual CORBA::AbstractInterfaceDef_ptr create_abstract_interface (
+ const char *id,
+ const char *name,
+ const char *version,
+ const CORBA::AbstractInterfaceDefSeq &base_interfaces
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS
+ )
+ ACE_THROW_SPEC ((CORBA::SystemException));
+
+ CORBA::AbstractInterfaceDef_ptr create_abstract_interface_i (
+ const char *id,
+ const char *name,
+ const char *version,
+ const CORBA::AbstractInterfaceDefSeq &base_interfaces
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS
+ )
+ ACE_THROW_SPEC ((CORBA::SystemException));
+
+ virtual CORBA::LocalInterfaceDef_ptr create_local_interface (
+ const char *id,
+ const char *name,
+ const char *version,
+ const CORBA::InterfaceDefSeq &base_interfaces
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS
+ )
+ ACE_THROW_SPEC ((CORBA::SystemException));
+
+ CORBA::LocalInterfaceDef_ptr create_local_interface_i (
+ const char *id,
+ const char *name,
+ const char *version,
+ const CORBA::InterfaceDefSeq &base_interfaces
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS
+ )
+ ACE_THROW_SPEC ((CORBA::SystemException));
+
+ virtual ::CORBA::ExtValueDef_ptr create_ext_value (
+ const char *id,
+ const char *name,
+ const char *version,
+ CORBA::Boolean is_custom,
+ CORBA::Boolean is_abstract,
+ CORBA::ValueDef_ptr base_value,
+ CORBA::Boolean is_truncatable,
+ const CORBA::ValueDefSeq &abstract_base_values,
+ const CORBA::InterfaceDefSeq &supported_interfaces,
+ const CORBA::ExtInitializerSeq &initializers
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS
+ )
+ ACE_THROW_SPEC ((CORBA::SystemException));
+
+ CORBA::ExtValueDef_ptr create_ext_value_i (
+ const char *id,
+ const char *name,
+ const char *version,
+ CORBA::Boolean is_custom,
+ CORBA::Boolean is_abstract,
+ CORBA::ValueDef_ptr base_value,
+ CORBA::Boolean is_truncatable,
+ const CORBA::ValueDefSeq &abstract_base_values,
+ const CORBA::InterfaceDefSeq &supported_interfaces,
+ const CORBA::ExtInitializerSeq &initializers
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS
+ )
+ ACE_THROW_SPEC ((CORBA::SystemException));
+
+ static int same_as_tmp_name (const char *name);
+ // Called from TAO_IFR_Service_Utils::name_exisits.
+
+ static void tmp_name_holder (const char *name);
+ // Accesses the static member.
+
+ void update_refs (
+ const char *path,
+ const char *name = 0
+ );
+ // Used with structs, unions and exceptions.
+
+protected:
+ void store_label (
+ ACE_Configuration_Section_Key key,
+ const CORBA::Any &value
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS
+ )
+ ACE_THROW_SPEC ((CORBA::SystemException));
+ // Store a union member's label value.
+
+ void lookup_attr (
+ ACE_Unbounded_Queue<CORBA::DefinitionKind> &kind_queue,
+ ACE_Unbounded_Queue<ACE_TString> &path_queue,
+ const char *search_name,
+ CORBA::Boolean exclude_inherited
+ );
+
+ void lookup_op (
+ ACE_Unbounded_Queue<CORBA::DefinitionKind> &kind_queue,
+ ACE_Unbounded_Queue<ACE_TString> &path_queue,
+ const char *search_name,
+ CORBA::Boolean exclude_inherited
+ );
+
+private:
+ void lookup_name_recursive (
+ ACE_Unbounded_Queue<CORBA::DefinitionKind> &kind_queue,
+ ACE_Unbounded_Queue<ACE_TString> &path_queue,
+ const char *search_name,
+ CORBA::Long levels_to_search,
+ CORBA::DefinitionKind limit_type,
+ CORBA::Boolean exclude_inherited
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS);
+
+ ACE_TString create_value_common (
+ CORBA::DefinitionKind container_kind,
+ ACE_Configuration_Section_Key &container_key,
+ ACE_Configuration_Section_Key &new_key,
+ const char *id,
+ const char *name,
+ const char *version,
+ CORBA::Boolean is_custom,
+ CORBA::Boolean is_abstract,
+ CORBA::ValueDef_ptr base_value,
+ CORBA::Boolean is_truncatable,
+ const CORBA::ValueDefSeq &abstract_base_values,
+ const CORBA::InterfaceDefSeq &supported_interfaces
+ ACE_ENV_ARG_DECL
+ );
+ // Common code for create_value_i and create_ext_value_i.
+
+protected:
+ static const char *tmp_name_holder_;
+};
+
+TAO_END_VERSIONED_NAMESPACE_DECL
+
+#if defined(_MSC_VER)
+#pragma warning(pop)
+#endif /* _MSC_VER */
+
+#endif /* TAO_CONTAINER_I_H */
diff --git a/TAO/orbsvcs/orbsvcs/IFRService/EmitsDef_i.cpp b/TAO/orbsvcs/orbsvcs/IFRService/EmitsDef_i.cpp
new file mode 100644
index 00000000000..0cbe4a4093d
--- /dev/null
+++ b/TAO/orbsvcs/orbsvcs/IFRService/EmitsDef_i.cpp
@@ -0,0 +1,32 @@
+// $Id$
+
+#include "orbsvcs/IFRService/EmitsDef_i.h"
+#include "orbsvcs/IFRService/Repository_i.h"
+
+ACE_RCSID (IFRService,
+ EmitsDef_i,
+ "$Id$")
+
+
+TAO_BEGIN_VERSIONED_NAMESPACE_DECL
+
+TAO_EmitsDef_i::TAO_EmitsDef_i (TAO_Repository_i *repo)
+ : TAO_IRObject_i (repo),
+ TAO_Contained_i (repo),
+ TAO_EventPortDef_i (repo)
+{
+}
+
+TAO_EmitsDef_i::~TAO_EmitsDef_i (void)
+{
+}
+
+CORBA::DefinitionKind
+TAO_EmitsDef_i::def_kind (ACE_ENV_SINGLE_ARG_DECL_NOT_USED)
+ ACE_THROW_SPEC ((CORBA::SystemException))
+{
+ return CORBA::dk_Emits;
+}
+
+
+TAO_END_VERSIONED_NAMESPACE_DECL
diff --git a/TAO/orbsvcs/orbsvcs/IFRService/EmitsDef_i.h b/TAO/orbsvcs/orbsvcs/IFRService/EmitsDef_i.h
new file mode 100644
index 00000000000..5d8e93fdeba
--- /dev/null
+++ b/TAO/orbsvcs/orbsvcs/IFRService/EmitsDef_i.h
@@ -0,0 +1,68 @@
+// -*- C++ -*-
+
+// $Id$
+
+// ============================================================================
+//
+// = LIBRARY
+// TAO/orbsvcs/orbsvcs/IFRService
+//
+// = FILENAME
+// EmitsDef_i.h
+//
+// = DESCRIPTION
+// EmitsDef servant class.
+//
+// = AUTHOR
+// Jeff Parsons <parsons@cs.wustl.edu>
+//
+// ============================================================================
+
+#ifndef TAO_EMITSDEF_I_H
+#define TAO_EMITSDEF_I_H
+
+#include "orbsvcs/IFRService/EventPortDef_i.h"
+#include "orbsvcs/IFRService/ifr_service_export.h"
+
+#if !defined (ACE_LACKS_PRAGMA_ONCE)
+# pragma once
+#endif /* ACE_LACKS_PRAGMA_ONCE */
+
+#if defined(_MSC_VER)
+#pragma warning(push)
+#pragma warning(disable:4250)
+#endif /* _MSC_VER */
+
+TAO_BEGIN_VERSIONED_NAMESPACE_DECL
+
+class TAO_IFRService_Export TAO_EmitsDef_i
+ : public virtual TAO_EventPortDef_i
+{
+ // = TITLE
+ // TAO_EmitsDef_i
+ //
+ // = DESCRIPTION
+ // Represents the definition of an event that is emitted
+ // by a component.
+ //
+public:
+ TAO_EmitsDef_i (TAO_Repository_i *repo);
+ // Constructor
+
+ virtual ~TAO_EmitsDef_i (void);
+ // Destructor
+
+ virtual CORBA::DefinitionKind def_kind (
+ ACE_ENV_SINGLE_ARG_DECL_WITH_DEFAULTS
+ )
+ ACE_THROW_SPEC ((CORBA::SystemException));
+ // Return our definition kind.
+};
+
+TAO_END_VERSIONED_NAMESPACE_DECL
+
+#if defined(_MSC_VER)
+#pragma warning(pop)
+#endif /* _MSC_VER */
+
+#endif /* TAO_EMITSDEF_I_H */
diff --git a/TAO/orbsvcs/orbsvcs/IFRService/EnumDef_i.cpp b/TAO/orbsvcs/orbsvcs/IFRService/EnumDef_i.cpp
new file mode 100644
index 00000000000..5273788b6de
--- /dev/null
+++ b/TAO/orbsvcs/orbsvcs/IFRService/EnumDef_i.cpp
@@ -0,0 +1,163 @@
+// $Id$
+
+#include "orbsvcs/IFRService/EnumDef_i.h"
+#include "orbsvcs/IFRService/Repository_i.h"
+#include "orbsvcs/IFRService/IFR_Service_Utils.h"
+
+#include "ace/SString.h"
+
+
+ACE_RCSID (IFRService,
+ EnumDef_i,
+ "$Id$")
+
+TAO_BEGIN_VERSIONED_NAMESPACE_DECL
+
+TAO_EnumDef_i::TAO_EnumDef_i (TAO_Repository_i *repo)
+ : TAO_IRObject_i (repo),
+ TAO_Contained_i (repo),
+ TAO_IDLType_i (repo),
+ TAO_TypedefDef_i (repo)
+{
+}
+
+TAO_EnumDef_i::~TAO_EnumDef_i (void)
+{
+}
+
+CORBA::DefinitionKind
+TAO_EnumDef_i::def_kind (ACE_ENV_SINGLE_ARG_DECL_NOT_USED)
+ ACE_THROW_SPEC ((CORBA::SystemException))
+{
+ return CORBA::dk_Enum;
+}
+
+CORBA::TypeCode_ptr
+TAO_EnumDef_i::type (ACE_ENV_SINGLE_ARG_DECL)
+ ACE_THROW_SPEC ((CORBA::SystemException))
+{
+ TAO_IFR_READ_GUARD_RETURN (CORBA::TypeCode::_nil ());
+
+ this->update_key (ACE_ENV_SINGLE_ARG_PARAMETER);
+ ACE_CHECK_RETURN (CORBA::TypeCode::_nil ());
+
+ return this->type_i (ACE_ENV_SINGLE_ARG_PARAMETER);
+}
+
+CORBA::TypeCode_ptr
+TAO_EnumDef_i::type_i (ACE_ENV_SINGLE_ARG_DECL)
+ ACE_THROW_SPEC ((CORBA::SystemException))
+{
+ ACE_TString id;
+ this->repo_->config ()->get_string_value (this->section_key_,
+ "id",
+ id);
+
+ ACE_TString name;
+ this->repo_->config ()->get_string_value (this->section_key_,
+ "name",
+ name);
+
+ CORBA::EnumMemberSeq_var members = this->members_i (ACE_ENV_SINGLE_ARG_PARAMETER);
+ ACE_CHECK_RETURN (CORBA::TypeCode::_nil ());
+
+ return this->repo_->tc_factory ()->create_enum_tc (id.c_str (),
+ name.c_str (),
+ members.in ()
+ ACE_ENV_ARG_PARAMETER);
+}
+
+CORBA::EnumMemberSeq *
+TAO_EnumDef_i::members (ACE_ENV_SINGLE_ARG_DECL)
+ ACE_THROW_SPEC ((CORBA::SystemException))
+{
+ TAO_IFR_READ_GUARD_RETURN (0);
+
+ this->update_key (ACE_ENV_SINGLE_ARG_PARAMETER);
+ ACE_CHECK_RETURN (0);
+
+ return this->members_i (ACE_ENV_SINGLE_ARG_PARAMETER);
+}
+
+CORBA::EnumMemberSeq *
+TAO_EnumDef_i::members_i (ACE_ENV_SINGLE_ARG_DECL)
+ ACE_THROW_SPEC ((CORBA::SystemException))
+{
+ u_int count = 0;
+ this->repo_->config ()->get_integer_value (this->section_key_,
+ "count",
+ count);
+
+ CORBA::EnumMemberSeq *retval = 0;
+ ACE_NEW_THROW_EX (retval,
+ CORBA::EnumMemberSeq (count),
+ CORBA::NO_MEMORY ());
+ ACE_CHECK_RETURN (0);
+
+ retval->length (count);
+
+ for (u_int i = 0; i < count; ++i)
+ {
+ ACE_Configuration_Section_Key member_key;
+ char *stringified = TAO_IFR_Service_Utils::int_to_string (i);
+ this->repo_->config ()->open_section (this->section_key_,
+ stringified,
+ 0,
+ member_key);
+
+ ACE_TString member_name;
+ this->repo_->config ()->get_string_value (member_key,
+ "name",
+ member_name);
+
+ (*retval)[i] = member_name.c_str ();
+ }
+
+ return retval;
+}
+
+void
+TAO_EnumDef_i::members (const CORBA::EnumMemberSeq &members
+ ACE_ENV_ARG_DECL)
+ ACE_THROW_SPEC ((CORBA::SystemException))
+{
+ TAO_IFR_WRITE_GUARD;
+
+ this->update_key (ACE_ENV_SINGLE_ARG_PARAMETER);
+ ACE_CHECK;
+
+ this->members_i (members
+ ACE_ENV_ARG_PARAMETER);
+}
+
+void
+TAO_EnumDef_i::members_i (const CORBA::EnumMemberSeq &members
+ ACE_ENV_ARG_DECL_NOT_USED)
+ ACE_THROW_SPEC ((CORBA::SystemException))
+{
+ this->repo_->config ()->remove_section (this->section_key_,
+ "members",
+ 1);
+
+ CORBA::ULong count = members.length ();
+ this->repo_->config ()->set_integer_value (this->section_key_,
+ "count",
+ count);
+
+ for (CORBA::ULong i = 0; i < count; ++i)
+ {
+ ACE_Configuration_Section_Key member_key;
+ char *stringified = TAO_IFR_Service_Utils::int_to_string (i);
+ this->repo_->config ()->open_section (this->section_key_,
+ stringified,
+ 1,
+ member_key);
+
+ ACE_TString member_name (members[i]);
+ this->repo_->config ()->set_string_value (member_key,
+ "name",
+ member_name);
+ }
+}
+
+TAO_END_VERSIONED_NAMESPACE_DECL
diff --git a/TAO/orbsvcs/orbsvcs/IFRService/EnumDef_i.h b/TAO/orbsvcs/orbsvcs/IFRService/EnumDef_i.h
new file mode 100644
index 00000000000..0bd5b265451
--- /dev/null
+++ b/TAO/orbsvcs/orbsvcs/IFRService/EnumDef_i.h
@@ -0,0 +1,101 @@
+// -*- C++ -*-
+
+// $Id$
+
+// ============================================================================
+//
+// = LIBRARY
+// TAO/orbsvcs/orbsvcs/IFRService
+//
+// = FILENAME
+// EnumDef_i.h
+//
+// = DESCRIPTION
+// EnumDef servant class.
+//
+// = AUTHOR
+// Jeff Parsons <parsons@cs.wustl.edu>
+//
+// ============================================================================
+
+#ifndef TAO_ENUMDEF_I_H
+#define TAO_ENUMDEF_I_H
+
+#include "orbsvcs/IFRService/TypedefDef_i.h"
+#include "orbsvcs/IFRService/ifr_service_export.h"
+
+#if !defined (ACE_LACKS_PRAGMA_ONCE)
+# pragma once
+#endif /* ACE_LACKS_PRAGMA_ONCE */
+
+#if defined(_MSC_VER)
+#pragma warning(push)
+#pragma warning(disable:4250)
+#endif /* _MSC_VER */
+
+TAO_BEGIN_VERSIONED_NAMESPACE_DECL
+
+class TAO_IFRService_Export TAO_EnumDef_i : public virtual TAO_TypedefDef_i
+{
+public:
+ // = TITLE
+ // TAO_EnumDef_i
+ //
+ // = DESCRIPTION
+ // Represents an OMG IDL enumeration definition.
+ //
+public:
+ TAO_EnumDef_i (TAO_Repository_i *repoy);
+ // Constructor
+
+ virtual ~TAO_EnumDef_i (void);
+ // Destructor
+
+ virtual CORBA::DefinitionKind def_kind (
+ ACE_ENV_SINGLE_ARG_DECL_WITH_DEFAULTS)
+
+ ACE_THROW_SPEC ((CORBA::SystemException));
+ // Return our definition kind.
+
+ virtual CORBA::TypeCode_ptr type (
+ ACE_ENV_SINGLE_ARG_DECL_WITH_DEFAULTS)
+
+ ACE_THROW_SPEC ((CORBA::SystemException));
+ // From IDLType_i's pure virtual function.
+
+ virtual CORBA::TypeCode_ptr type_i (
+ ACE_ENV_SINGLE_ARG_DECL_WITH_DEFAULTS)
+
+ ACE_THROW_SPEC ((CORBA::SystemException));
+ // From IDLType_i's pure virtual function.
+
+ virtual CORBA::EnumMemberSeq *members (
+ ACE_ENV_SINGLE_ARG_DECL_WITH_DEFAULTS)
+
+ ACE_THROW_SPEC ((CORBA::SystemException));
+
+ CORBA::EnumMemberSeq *members_i (
+ ACE_ENV_SINGLE_ARG_DECL_WITH_DEFAULTS)
+
+ ACE_THROW_SPEC ((CORBA::SystemException));
+
+ virtual void members (
+ const CORBA::EnumMemberSeq &members
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS)
+
+ ACE_THROW_SPEC ((CORBA::SystemException));
+
+ void members_i (
+ const CORBA::EnumMemberSeq &members
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS)
+
+ ACE_THROW_SPEC ((CORBA::SystemException));
+};
+
+TAO_END_VERSIONED_NAMESPACE_DECL
+
+#if defined(_MSC_VER)
+#pragma warning(pop)
+#endif /* _MSC_VER */
+
+#endif /* TAO_ENUMDEF_I_H */
diff --git a/TAO/orbsvcs/orbsvcs/IFRService/EventDef_i.cpp b/TAO/orbsvcs/orbsvcs/IFRService/EventDef_i.cpp
new file mode 100644
index 00000000000..cd62666f25d
--- /dev/null
+++ b/TAO/orbsvcs/orbsvcs/IFRService/EventDef_i.cpp
@@ -0,0 +1,101 @@
+// $Id$
+
+#include "orbsvcs/IFRService/Repository_i.h"
+#include "orbsvcs/IFRService/EventDef_i.h"
+
+ACE_RCSID (IFRService,
+ EventDef_i,
+ "$Id$")
+
+
+TAO_BEGIN_VERSIONED_NAMESPACE_DECL
+
+TAO_EventDef_i::TAO_EventDef_i (TAO_Repository_i *repo)
+ : TAO_IRObject_i (repo),
+ TAO_Container_i (repo),
+ TAO_Contained_i (repo),
+ TAO_IDLType_i (repo),
+ TAO_ValueDef_i (repo),
+ TAO_ExtValueDef_i (repo)
+{
+}
+
+TAO_EventDef_i::~TAO_EventDef_i (void)
+{
+}
+
+CORBA::DefinitionKind
+TAO_EventDef_i::def_kind (ACE_ENV_SINGLE_ARG_DECL_NOT_USED)
+ ACE_THROW_SPEC ((CORBA::SystemException))
+{
+ return CORBA::dk_Event;
+}
+
+void
+TAO_EventDef_i::destroy (ACE_ENV_SINGLE_ARG_DECL)
+ ACE_THROW_SPEC ((CORBA::SystemException))
+{
+ TAO_IFR_WRITE_GUARD;
+
+ this->update_key (ACE_ENV_SINGLE_ARG_PARAMETER);
+ ACE_CHECK;
+
+ this->destroy_i (ACE_ENV_SINGLE_ARG_PARAMETER);
+}
+
+void
+TAO_EventDef_i::destroy_i (ACE_ENV_SINGLE_ARG_DECL)
+ ACE_THROW_SPEC ((CORBA::SystemException))
+{
+ // An event type is a restriction of a value type, not an extension.
+ this->TAO_ExtValueDef_i::destroy_i (ACE_ENV_SINGLE_ARG_PARAMETER);
+}
+
+CORBA::Contained::Description *
+TAO_EventDef_i::describe (ACE_ENV_SINGLE_ARG_DECL)
+ ACE_THROW_SPEC ((CORBA::SystemException))
+{
+ TAO_IFR_READ_GUARD_RETURN (0);
+
+ this->update_key (ACE_ENV_SINGLE_ARG_PARAMETER);
+ ACE_CHECK_RETURN (0);
+
+ return this->describe_i (ACE_ENV_SINGLE_ARG_PARAMETER);
+}
+
+CORBA::Contained::Description *
+TAO_EventDef_i::describe_i (ACE_ENV_SINGLE_ARG_DECL)
+ ACE_THROW_SPEC ((CORBA::SystemException))
+{
+ return this->TAO_ValueDef_i::describe_i (ACE_ENV_SINGLE_ARG_PARAMETER);
+}
+
+CORBA::Boolean
+TAO_EventDef_i::is_a (const char *event_id
+ ACE_ENV_ARG_DECL)
+ ACE_THROW_SPEC ((CORBA::SystemException))
+{
+ TAO_IFR_READ_GUARD_RETURN (0);
+
+ this->update_key (ACE_ENV_SINGLE_ARG_PARAMETER);
+ ACE_CHECK_RETURN (0);
+
+ return this->is_a_i (event_id
+ ACE_ENV_ARG_PARAMETER);
+}
+
+CORBA::Boolean
+TAO_EventDef_i::is_a_i (const char *event_id
+ ACE_ENV_ARG_DECL)
+ ACE_THROW_SPEC ((CORBA::SystemException))
+{
+ if (ACE_OS::strcmp (event_id, "IDL:omg.org/CORBA/EventBase:1.0") == 0)
+ {
+ return 1;
+ }
+
+ return this->TAO_ValueDef_i::is_a_i (event_id
+ ACE_ENV_ARG_PARAMETER);
+}
+
+TAO_END_VERSIONED_NAMESPACE_DECL
diff --git a/TAO/orbsvcs/orbsvcs/IFRService/EventDef_i.h b/TAO/orbsvcs/orbsvcs/IFRService/EventDef_i.h
new file mode 100644
index 00000000000..a1e280a2882
--- /dev/null
+++ b/TAO/orbsvcs/orbsvcs/IFRService/EventDef_i.h
@@ -0,0 +1,102 @@
+// -*- C++ -*-
+
+// $Id$
+
+// ============================================================================
+//
+// = LIBRARY
+// TAO/orbsvcs/orbsvcs/IFRService
+//
+// = FILENAME
+// EventDef_i.h
+//
+// = DESCRIPTION
+// EventDef servant class.
+//
+// = AUTHOR
+// Jeff Parsons <parsons@cs.wustl.edu>
+//
+// ============================================================================
+
+#ifndef TAO_EVENTDEF_I_H
+#define TAO_EVENTDEF_I_H
+
+#include "orbsvcs/IFRService/ExtValueDef_i.h"
+#include "orbsvcs/IFRService/ifr_service_export.h"
+
+#if !defined (ACE_LACKS_PRAGMA_ONCE)
+# pragma once
+#endif /* ACE_LACKS_PRAGMA_ONCE */
+
+#if defined(_MSC_VER)
+#pragma warning(push)
+#pragma warning(disable:4250)
+#endif /* _MSC_VER */
+
+TAO_BEGIN_VERSIONED_NAMESPACE_DECL
+
+class TAO_IFRService_Export TAO_EventDef_i : public virtual TAO_ExtValueDef_i
+{
+ // = TITLE
+ // TAO_EventDef_i
+ //
+ // = DESCRIPTION
+ // Represents an event definition. It refers to a ValueDef
+ // object that contains information about the event.
+ //
+public:
+ TAO_EventDef_i (TAO_Repository_i *repo);
+ // Constructor
+
+ virtual ~TAO_EventDef_i (void);
+ // Destructor
+
+ virtual CORBA::DefinitionKind def_kind (
+ ACE_ENV_SINGLE_ARG_DECL_WITH_DEFAULTS
+ )
+ ACE_THROW_SPEC ((CORBA::SystemException));
+ // Return our definition kind.
+
+ virtual void destroy (
+ ACE_ENV_SINGLE_ARG_DECL_WITH_DEFAULTS
+ )
+ ACE_THROW_SPEC ((CORBA::SystemException));
+ // Remove the repository entry.
+
+ virtual void destroy_i (
+ ACE_ENV_SINGLE_ARG_DECL_WITH_DEFAULTS
+ )
+ ACE_THROW_SPEC ((CORBA::SystemException));
+
+ virtual CORBA::Contained::Description *describe (
+ ACE_ENV_SINGLE_ARG_DECL_WITH_DEFAULTS
+ )
+ ACE_THROW_SPEC ((CORBA::SystemException));
+ // From Contained_i's pure virtual function.
+
+ virtual CORBA::Contained::Description *describe_i (
+ ACE_ENV_SINGLE_ARG_DECL_WITH_DEFAULTS
+ )
+ ACE_THROW_SPEC ((CORBA::SystemException));
+ // From Contained_i's pure virtual function.
+
+ virtual CORBA::Boolean is_a (
+ const char *event_id
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS
+ )
+ ACE_THROW_SPEC ((CORBA::SystemException));
+
+ CORBA::Boolean is_a_i (
+ const char *event_id
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS
+ )
+ ACE_THROW_SPEC ((CORBA::SystemException));
+};
+
+TAO_END_VERSIONED_NAMESPACE_DECL
+
+#if defined(_MSC_VER)
+#pragma warning(pop)
+#endif /* _MSC_VER */
+
+#endif /* TAO_EVENTDEF_I_H */
diff --git a/TAO/orbsvcs/orbsvcs/IFRService/EventPortDef_i.cpp b/TAO/orbsvcs/orbsvcs/IFRService/EventPortDef_i.cpp
new file mode 100644
index 00000000000..f3d1a44a8f4
--- /dev/null
+++ b/TAO/orbsvcs/orbsvcs/IFRService/EventPortDef_i.cpp
@@ -0,0 +1,200 @@
+// $Id$
+
+#include "orbsvcs/IFRService/Repository_i.h"
+#include "orbsvcs/IFRService/EventPortDef_i.h"
+#include "orbsvcs/IFRService/EventDef_i.h"
+#include "orbsvcs/IFRService/IFR_Service_Utils_T.h"
+#include "orbsvcs/IFRService/IFR_Service_Utils.h"
+
+#include "ace/SString.h"
+
+
+ACE_RCSID (IFRService,
+ EventPortDef_i,
+ "$Id$")
+
+TAO_BEGIN_VERSIONED_NAMESPACE_DECL
+
+TAO_EventPortDef_i::TAO_EventPortDef_i (TAO_Repository_i *repo)
+ : TAO_IRObject_i (repo),
+ TAO_Contained_i (repo)
+{
+}
+
+TAO_EventPortDef_i::~TAO_EventPortDef_i (void)
+{
+}
+
+CORBA::ComponentIR::EventDef_ptr
+TAO_EventPortDef_i::event (
+ ACE_ENV_SINGLE_ARG_DECL
+ )
+ ACE_THROW_SPEC ((CORBA::SystemException))
+{
+ TAO_IFR_READ_GUARD_RETURN (CORBA::ComponentIR::EventDef::_nil ());
+
+ this->update_key (ACE_ENV_SINGLE_ARG_PARAMETER);
+ ACE_CHECK_RETURN (CORBA::ComponentIR::EventDef::_nil ());
+
+ return this->event_i (ACE_ENV_SINGLE_ARG_PARAMETER);
+}
+
+CORBA::ComponentIR::EventDef_ptr
+TAO_EventPortDef_i::event_i (
+ ACE_ENV_SINGLE_ARG_DECL
+ )
+ ACE_THROW_SPEC ((CORBA::SystemException))
+{
+ ACE_TString holder;
+ this->repo_->config ()->get_string_value (this->section_key_,
+ "base_type",
+ holder);
+ CORBA::Contained_var obj = this->repo_->lookup_id (holder.fast_rep ()
+ ACE_ENV_ARG_PARAMETER);
+ ACE_CHECK_RETURN (CORBA::ComponentIR::EventDef::_nil ());
+
+ return CORBA::ComponentIR::EventDef::_narrow (obj.in ()
+ ACE_ENV_ARG_PARAMETER);
+}
+
+void
+TAO_EventPortDef_i::event (
+ CORBA::ComponentIR::EventDef_ptr event
+ ACE_ENV_ARG_DECL
+ )
+ ACE_THROW_SPEC ((CORBA::SystemException))
+{
+ TAO_IFR_WRITE_GUARD;
+
+ this->update_key (ACE_ENV_SINGLE_ARG_PARAMETER);
+ ACE_CHECK;
+
+ this->event_i (event
+ ACE_ENV_ARG_PARAMETER);
+}
+
+void
+TAO_EventPortDef_i::event_i (
+ CORBA::ComponentIR::EventDef_ptr event
+ ACE_ENV_ARG_DECL_NOT_USED
+ )
+ ACE_THROW_SPEC ((CORBA::SystemException))
+{
+ this->repo_->config ()->remove_value (this->section_key_,
+ "base_type");
+
+ if (CORBA::is_nil (event))
+ {
+ return;
+ }
+
+ const char *tmp =
+ TAO_IFR_Service_Utils::reference_to_path (event);
+
+ ACE_Configuration_Section_Key new_key;
+ this->repo_->config ()->expand_path (this->repo_->root_key (),
+ tmp,
+ new_key,
+ 0);
+
+ ACE_TString holder;
+ this->repo_->config ()->get_string_value (new_key,
+ "id",
+ holder);
+
+ this->repo_->config ()->set_string_value (this->section_key_,
+ "base_type",
+ holder);
+}
+
+CORBA::Boolean
+TAO_EventPortDef_i::is_a (
+ const char *event_id
+ ACE_ENV_ARG_DECL
+ )
+ ACE_THROW_SPEC ((CORBA::SystemException))
+{
+ TAO_IFR_READ_GUARD_RETURN (0);
+
+ this->update_key (ACE_ENV_SINGLE_ARG_PARAMETER);
+ ACE_CHECK_RETURN (0);
+
+ return this->is_a_i (event_id
+ ACE_ENV_ARG_PARAMETER);
+}
+
+CORBA::Boolean
+TAO_EventPortDef_i::is_a_i (
+ const char *event_id
+ ACE_ENV_ARG_DECL
+ )
+ ACE_THROW_SPEC ((CORBA::SystemException))
+{
+ ACE_TString holder;
+ this->repo_->config ()->get_string_value (this->section_key_,
+ "base_type",
+ holder);
+ this->repo_->config ()->get_string_value (this->repo_->repo_ids_key (),
+ holder.fast_rep (),
+ holder);
+ ACE_Configuration_Section_Key key;
+ this->repo_->config ()->expand_path (this->repo_->root_key (),
+ holder,
+ key,
+ 0);
+ TAO_EventDef_i impl (this->repo_);
+ impl.section_key (key);
+ return impl.is_a_i (event_id
+ ACE_ENV_ARG_PARAMETER);
+}
+
+CORBA::Contained::Description *
+TAO_EventPortDef_i::describe (ACE_ENV_SINGLE_ARG_DECL)
+ ACE_THROW_SPEC ((CORBA::SystemException))
+{
+ TAO_IFR_READ_GUARD_RETURN (0);
+
+ this->update_key (ACE_ENV_SINGLE_ARG_PARAMETER);
+ ACE_CHECK_RETURN (0);
+
+ return this->describe_i (ACE_ENV_SINGLE_ARG_PARAMETER);
+}
+
+CORBA::Contained::Description *
+TAO_EventPortDef_i::describe_i (ACE_ENV_SINGLE_ARG_DECL)
+ ACE_THROW_SPEC ((CORBA::SystemException))
+{
+ CORBA::ComponentIR::EventPortDescription epd;
+ TAO_IFR_Desc_Utils<CORBA::ComponentIR::EventPortDescription,
+ TAO_EventPortDef_i>::fill_desc_begin (
+ epd,
+ this->repo_,
+ this->section_key_
+ ACE_ENV_ARG_PARAMETER
+ );
+ ACE_CHECK_RETURN (0);
+
+ ACE_TString holder;
+ this->repo_->config ()->get_string_value (this->section_key_,
+ "base_type",
+ holder);
+ epd.event = holder.fast_rep ();
+
+ CORBA::Contained::Description *retval = 0;
+ ACE_NEW_RETURN (retval,
+ CORBA::Contained::Description,
+ 0);
+
+ retval->kind = this->def_kind ();
+ retval->value <<= epd;
+ return retval;
+}
+
+CORBA::DefinitionKind
+TAO_EventPortDef_i::def_kind (ACE_ENV_SINGLE_ARG_DECL_NOT_USED)
+ ACE_THROW_SPEC ((CORBA::SystemException))
+{
+ return CORBA::dk_none;
+}
+
+TAO_END_VERSIONED_NAMESPACE_DECL
diff --git a/TAO/orbsvcs/orbsvcs/IFRService/EventPortDef_i.h b/TAO/orbsvcs/orbsvcs/IFRService/EventPortDef_i.h
new file mode 100644
index 00000000000..dc84527d41f
--- /dev/null
+++ b/TAO/orbsvcs/orbsvcs/IFRService/EventPortDef_i.h
@@ -0,0 +1,123 @@
+// -*- C++ -*-
+
+// $Id$
+
+// ============================================================================
+//
+// = LIBRARY
+// TAO/orbsvcs/orbsvcs/IFRService
+//
+// = FILENAME
+// EventPortDef_i.h
+//
+// = DESCRIPTION
+// EventPortDef_i servant class.
+//
+// = AUTHOR
+// Jeff Parsons <j.parsons@vanderbilt.edu>
+//
+// ============================================================================
+
+#ifndef TAO_EVENTPORTDEF_I_H
+#define TAO_EVENTPORTDEF_I_H
+
+#include "orbsvcs/IFRService/Contained_i.h"
+#include "orbsvcs/IFRService/ifr_service_export.h"
+
+#if !defined (ACE_LACKS_PRAGMA_ONCE)
+# pragma once
+#endif /* ACE_LACKS_PRAGMA_ONCE */
+
+#include "orbsvcs/IFRService/IFR_ComponentsS.h"
+
+#if defined(_MSC_VER)
+#pragma warning(push)
+#pragma warning(disable:4250)
+#endif /* _MSC_VER */
+
+TAO_BEGIN_VERSIONED_NAMESPACE_DECL
+
+class TAO_IFRService_Export TAO_EventPortDef_i
+ : public virtual TAO_Contained_i
+{
+ // = TITLE
+ // TAO_EventPortDef_i
+ //
+ // = DESCRIPTION
+ // Represents an event port definition. EmitsDef_i, PublishesDef_i,
+ // and ConsumesDef_i inherit from this.
+ //
+public:
+ TAO_EventPortDef_i (TAO_Repository_i *repo);
+ /// Constructor
+
+ virtual ~TAO_EventPortDef_i (void);
+ /// Destructor
+
+ virtual CORBA::ComponentIR::EventDef_ptr event (
+ ACE_ENV_SINGLE_ARG_DECL_WITH_DEFAULTS
+ )
+ ACE_THROW_SPEC ((CORBA::SystemException));
+
+ CORBA::ComponentIR::EventDef_ptr event_i (
+ ACE_ENV_SINGLE_ARG_DECL_WITH_DEFAULTS
+ )
+ ACE_THROW_SPEC ((CORBA::SystemException));
+
+ virtual void event (
+ CORBA::ComponentIR::EventDef_ptr event
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS
+ )
+ ACE_THROW_SPEC ((CORBA::SystemException));
+
+ void event_i (
+ CORBA::ComponentIR::EventDef_ptr event
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS
+ )
+ ACE_THROW_SPEC ((CORBA::SystemException));
+
+ virtual CORBA::Boolean is_a (
+ const char *event_id
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS
+ )
+ ACE_THROW_SPEC ((CORBA::SystemException));
+
+ CORBA::Boolean is_a_i (
+ const char *event_id
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS
+ )
+ ACE_THROW_SPEC ((CORBA::SystemException));
+
+ /// This can be the same for the three derived classes, so it is
+ /// implemented here.
+
+ virtual CORBA::Contained::Description *describe (
+ ACE_ENV_SINGLE_ARG_DECL_WITH_DEFAULTS
+ )
+ ACE_THROW_SPEC ((CORBA::SystemException));
+ // From Contained_i's pure virtual function.
+
+ virtual CORBA::Contained::Description *describe_i (
+ ACE_ENV_SINGLE_ARG_DECL_WITH_DEFAULTS
+ )
+ ACE_THROW_SPEC ((CORBA::SystemException));
+ // From Contained_i's pure virtual function.
+
+private:
+ virtual CORBA::DefinitionKind def_kind (
+ ACE_ENV_SINGLE_ARG_DECL_WITH_DEFAULTS
+ )
+ ACE_THROW_SPEC ((CORBA::SystemException));
+ // Dummy method so we can consolidate derived class methods
+ // in this 'abstract' base class.
+};
+
+TAO_END_VERSIONED_NAMESPACE_DECL
+
+#if defined(_MSC_VER)
+#pragma warning(pop)
+#endif /* _MSC_VER */
+
+#endif /* TAO_EVENTPORTDEF_I_H */
+
+
diff --git a/TAO/orbsvcs/orbsvcs/IFRService/ExceptionDef_i.cpp b/TAO/orbsvcs/orbsvcs/IFRService/ExceptionDef_i.cpp
new file mode 100644
index 00000000000..33b7c9eee99
--- /dev/null
+++ b/TAO/orbsvcs/orbsvcs/IFRService/ExceptionDef_i.cpp
@@ -0,0 +1,351 @@
+// $Id$
+
+#include "orbsvcs/IFRService/ExceptionDef_i.h"
+#include "orbsvcs/IFRService/Repository_i.h"
+#include "orbsvcs/IFRService/IDLType_i.h"
+#include "orbsvcs/IFRService/IFR_Service_Utils.h"
+#include "ace/Auto_Ptr.h"
+#include "ace/SString.h"
+
+ACE_RCSID (IFRService,
+ ExceptionDef_i,
+ "$Id$")
+
+TAO_BEGIN_VERSIONED_NAMESPACE_DECL
+
+TAO_ExceptionDef_i::TAO_ExceptionDef_i (
+ TAO_Repository_i *repo
+ )
+ : TAO_IRObject_i (repo),
+ TAO_Contained_i (repo),
+ TAO_Container_i (repo)
+{
+}
+
+TAO_ExceptionDef_i::~TAO_ExceptionDef_i (void)
+{
+}
+
+CORBA::DefinitionKind
+TAO_ExceptionDef_i::def_kind (ACE_ENV_SINGLE_ARG_DECL_NOT_USED)
+ ACE_THROW_SPEC ((CORBA::SystemException))
+{
+ return CORBA::dk_Exception;
+}
+
+void
+TAO_ExceptionDef_i::destroy (ACE_ENV_SINGLE_ARG_DECL)
+ ACE_THROW_SPEC ((CORBA::SystemException))
+{
+ TAO_IFR_WRITE_GUARD;
+
+ this->update_key (ACE_ENV_SINGLE_ARG_PARAMETER);
+ ACE_CHECK;
+
+ this->destroy_i (ACE_ENV_SINGLE_ARG_PARAMETER);
+}
+
+void
+TAO_ExceptionDef_i::destroy_i (ACE_ENV_SINGLE_ARG_DECL)
+ ACE_THROW_SPEC ((CORBA::SystemException))
+{
+ // Destroy our members.
+ TAO_Container_i::destroy_i (ACE_ENV_SINGLE_ARG_PARAMETER);
+ ACE_CHECK;
+
+ // Destroy ourself.
+ TAO_Contained_i::destroy_i (ACE_ENV_SINGLE_ARG_PARAMETER);
+ ACE_CHECK;
+}
+
+CORBA::Contained::Description *
+TAO_ExceptionDef_i::describe (ACE_ENV_SINGLE_ARG_DECL)
+ ACE_THROW_SPEC ((CORBA::SystemException))
+{
+ TAO_IFR_READ_GUARD_RETURN (0);
+
+ this->update_key (ACE_ENV_SINGLE_ARG_PARAMETER);
+ ACE_CHECK_RETURN (0);
+
+ return this->describe_i (ACE_ENV_SINGLE_ARG_PARAMETER);
+}
+
+CORBA::Contained::Description *
+TAO_ExceptionDef_i::describe_i (ACE_ENV_SINGLE_ARG_DECL)
+ ACE_THROW_SPEC ((CORBA::SystemException))
+{
+ CORBA::Contained::Description *desc_ptr = 0;
+ ACE_NEW_THROW_EX (desc_ptr,
+ CORBA::Contained::Description,
+ CORBA::NO_MEMORY ());
+ ACE_CHECK_RETURN (0);
+
+ CORBA::Contained::Description_var retval = desc_ptr;
+
+ retval->kind = this->def_kind (ACE_ENV_SINGLE_ARG_PARAMETER);
+ ACE_CHECK_RETURN (0);
+
+ CORBA::ExceptionDescription ed;
+
+ ed.name = this->name_i (ACE_ENV_SINGLE_ARG_PARAMETER);
+ ACE_CHECK_RETURN (0);
+
+ ed.id = this->id_i (ACE_ENV_SINGLE_ARG_PARAMETER);
+ ACE_CHECK_RETURN (0);
+
+ ACE_TString container_id;
+
+ this->repo_->config ()->get_string_value (this->section_key_,
+ "container_id",
+ container_id);
+
+ ed.defined_in = container_id.c_str ();
+
+ ed.version = this->version_i (ACE_ENV_SINGLE_ARG_PARAMETER);
+ ACE_CHECK_RETURN (0);
+
+ ed.type = this->type_i (ACE_ENV_SINGLE_ARG_PARAMETER);
+ ACE_CHECK_RETURN (0);
+
+ retval->value <<= ed;
+
+ return retval._retn ();
+}
+
+CORBA::TypeCode_ptr
+TAO_ExceptionDef_i::type (ACE_ENV_SINGLE_ARG_DECL)
+ ACE_THROW_SPEC ((CORBA::SystemException))
+{
+ TAO_IFR_READ_GUARD_RETURN (CORBA::TypeCode::_nil ());
+
+ this->update_key (ACE_ENV_SINGLE_ARG_PARAMETER);
+ ACE_CHECK_RETURN (CORBA::TypeCode::_nil ());
+
+ return this->type_i (ACE_ENV_SINGLE_ARG_PARAMETER);
+}
+
+CORBA::TypeCode_ptr
+TAO_ExceptionDef_i::type_i (ACE_ENV_SINGLE_ARG_DECL)
+ ACE_THROW_SPEC ((CORBA::SystemException))
+{
+ ACE_TString id;
+ this->repo_->config ()->get_string_value (this->section_key_,
+ "id",
+ id);
+
+ ACE_TString name;
+ this->repo_->config ()->get_string_value (this->section_key_,
+ "name",
+ name);
+
+ CORBA::StructMemberSeq_var members =
+ this->members_i (ACE_ENV_SINGLE_ARG_PARAMETER);
+ ACE_CHECK_RETURN (CORBA::TypeCode::_nil ());
+
+ return this->repo_->tc_factory ()->create_exception_tc (
+ id.c_str (),
+ name.c_str (),
+ members.in ()
+ ACE_ENV_ARG_PARAMETER
+ );
+}
+
+CORBA::StructMemberSeq *
+TAO_ExceptionDef_i::members (ACE_ENV_SINGLE_ARG_DECL)
+ ACE_THROW_SPEC ((CORBA::SystemException))
+{
+ TAO_IFR_READ_GUARD_RETURN (0);
+
+ this->update_key (ACE_ENV_SINGLE_ARG_PARAMETER);
+ ACE_CHECK_RETURN (0);
+
+ return this->members_i (ACE_ENV_SINGLE_ARG_PARAMETER);
+}
+
+CORBA::StructMemberSeq *
+TAO_ExceptionDef_i::members_i (ACE_ENV_SINGLE_ARG_DECL)
+ ACE_THROW_SPEC ((CORBA::SystemException))
+{
+ ACE_Unbounded_Queue<CORBA::DefinitionKind> kind_queue;
+ ACE_Unbounded_Queue<ACE_TString> path_queue;
+ ACE_Unbounded_Queue<ACE_TString> name_queue;
+
+ ACE_Configuration_Section_Key refs_key;
+ this->repo_->config ()->open_section (this->section_key_,
+ "refs",
+ 0,
+ refs_key);
+
+ u_int count = 0;
+ this->repo_->config ()->get_integer_value (refs_key,
+ "count",
+ count);
+
+ for (u_int i = 0; i < count; ++i)
+ {
+ ACE_Configuration_Section_Key member_key;
+ char *stringified = TAO_IFR_Service_Utils::int_to_string (i);
+ this->repo_->config ()->open_section (refs_key,
+ stringified,
+ 0,
+ member_key);
+
+ ACE_TString path;
+ this->repo_->config ()->get_string_value (member_key,
+ "path",
+ path);
+
+ ACE_Configuration_Section_Key entry_key;
+ int status =
+ this->repo_->config ()->expand_path (this->repo_->root_key (),
+ path,
+ entry_key,
+ 0);
+
+ // This entry may have been removed.
+ if (status == 0)
+ {
+ path_queue.enqueue_tail (path);
+
+ ACE_TString name;
+ this->repo_->config ()->get_string_value (member_key,
+ "name",
+ name);
+
+ name_queue.enqueue_tail (name);
+
+ u_int kind = 0;
+ this->repo_->config ()->get_integer_value (entry_key,
+ "def_kind",
+ kind);
+
+ CORBA::DefinitionKind def_kind =
+ static_cast<CORBA::DefinitionKind> (kind);
+
+ kind_queue.enqueue_tail (def_kind);
+ }
+ }
+
+ CORBA::ULong size = static_cast<CORBA::ULong> (kind_queue.size ());
+
+ CORBA::StructMemberSeq *members = 0;
+ ACE_NEW_THROW_EX (members,
+ CORBA::StructMemberSeq (size),
+ CORBA::NO_MEMORY ());
+ ACE_CHECK_RETURN (0);
+
+ members->length (size);
+
+ CORBA::StructMemberSeq_var retval = members;
+
+ ACE_TString name;
+ ACE_TString path;
+ CORBA::DefinitionKind kind = CORBA::dk_none;
+ CORBA::Object_var obj;
+ ACE_Configuration_Section_Key member_key;
+ TAO_IDLType_i *impl = 0;
+
+ for (CORBA::ULong k = 0; k < size; ++k)
+ {
+ name_queue.dequeue_head (name);
+ retval[k].name = name.c_str ();
+
+ kind_queue.dequeue_head (kind);
+ path_queue.dequeue_head (path);
+
+ obj =
+ TAO_IFR_Service_Utils::create_objref (kind,
+ path.c_str (),
+ this->repo_
+ ACE_ENV_ARG_PARAMETER);
+ ACE_CHECK_RETURN (0);
+
+ retval[k].type_def = CORBA::IDLType::_narrow (obj.in ()
+ ACE_ENV_ARG_PARAMETER);
+ ACE_CHECK_RETURN (0);
+
+ this->repo_->config ()->expand_path (this->repo_->root_key (),
+ path,
+ member_key,
+ 0);
+
+ impl = TAO_IFR_Service_Utils::path_to_idltype (path,
+ this->repo_);
+
+ retval[k].type = impl->type_i (ACE_ENV_SINGLE_ARG_PARAMETER);
+ ACE_CHECK_RETURN (0);
+ }
+
+ return retval._retn ();
+}
+
+void
+TAO_ExceptionDef_i::members (const CORBA::StructMemberSeq &members
+ ACE_ENV_ARG_DECL)
+ ACE_THROW_SPEC ((CORBA::SystemException))
+{
+ TAO_IFR_WRITE_GUARD;
+
+ this->update_key (ACE_ENV_SINGLE_ARG_PARAMETER);
+ ACE_CHECK;
+
+ this->members_i (members
+ ACE_ENV_ARG_PARAMETER);
+}
+
+void
+TAO_ExceptionDef_i::members_i (const CORBA::StructMemberSeq &members
+ ACE_ENV_ARG_DECL)
+ ACE_THROW_SPEC ((CORBA::SystemException))
+{
+ // Destroy our old members, both refs and defns.
+ TAO_Container_i::destroy_i (ACE_ENV_SINGLE_ARG_PARAMETER);
+ ACE_CHECK;
+
+ CORBA::ULong count = members.length ();
+
+ // Exceptions can be empty.
+ if (count > 0)
+ {
+ ACE_TString section_name;
+ ACE_Configuration_Section_Key refs_key;
+
+ this->repo_->config ()->open_section (this->section_key_,
+ "refs",
+ 1,
+ refs_key);
+ char *path = 0;
+
+ // Create a section for each new member. We just store the
+ // member name and the path to its database entry.
+ for (CORBA::ULong i = 0; i < count; ++i)
+ {
+ ACE_Configuration_Section_Key member_key;
+ char *stringified = TAO_IFR_Service_Utils::int_to_string (i);
+ this->repo_->config ()->open_section (refs_key,
+ stringified,
+ 1,
+ member_key);
+
+ ACE_TString name (members[i].name);
+ this->repo_->config ()->set_string_value (member_key,
+ "name",
+ name);
+
+ path =
+ TAO_IFR_Service_Utils::reference_to_path (
+ members[i].type_def.in ()
+ );
+
+ this->repo_->config ()->set_string_value (member_key,
+ "path",
+ path);
+ }
+
+ this->repo_->config ()->set_integer_value (refs_key,
+ "count",
+ count);
+ }
+}
+
+TAO_END_VERSIONED_NAMESPACE_DECL
diff --git a/TAO/orbsvcs/orbsvcs/IFRService/ExceptionDef_i.h b/TAO/orbsvcs/orbsvcs/IFRService/ExceptionDef_i.h
new file mode 100644
index 00000000000..88dd3e8bbd5
--- /dev/null
+++ b/TAO/orbsvcs/orbsvcs/IFRService/ExceptionDef_i.h
@@ -0,0 +1,124 @@
+// -*- C++ -*-
+
+// $Id$
+
+// ============================================================================
+//
+// = LIBRARY
+// TAO/orbsvcs/orbsvcs/IFRService
+//
+// = FILENAME
+// ExceptionDef_i.h
+//
+// = DESCRIPTION
+// ExceptionDef servant class.
+//
+// = AUTHOR
+// Jeff Parsons <parsons@cs.wustl.edu>
+//
+// ============================================================================
+
+#ifndef TAO_EXCEPTIONDEF_I_H
+#define TAO_EXCEPTIONDEF_I_H
+
+#include "orbsvcs/IFRService/Contained_i.h"
+#include "orbsvcs/IFRService/Container_i.h"
+#include "orbsvcs/IFRService/ifr_service_export.h"
+
+#if !defined (ACE_LACKS_PRAGMA_ONCE)
+# pragma once
+#endif /* ACE_LACKS_PRAGMA_ONCE */
+
+#if defined(_MSC_VER)
+#pragma warning(push)
+#pragma warning(disable:4250)
+#endif /* _MSC_VER */
+
+TAO_BEGIN_VERSIONED_NAMESPACE_DECL
+
+class TAO_IFRService_Export TAO_ExceptionDef_i : public virtual TAO_Contained_i,
+ public virtual TAO_Container_i
+{
+ // = TITLE
+ // TAO_ExceptionDef_i
+ //
+ // = DESCRIPTION
+ // Represents an exception definition.
+ //
+public:
+ TAO_ExceptionDef_i (TAO_Repository_i *repo);
+ // Constructor
+
+ virtual ~TAO_ExceptionDef_i (void);
+ // Destructor
+
+ virtual CORBA::DefinitionKind def_kind (
+ ACE_ENV_SINGLE_ARG_DECL_WITH_DEFAULTS)
+
+ ACE_THROW_SPEC ((CORBA::SystemException));
+ // Return our definition kind.
+
+ virtual void destroy (
+ ACE_ENV_SINGLE_ARG_DECL_WITH_DEFAULTS)
+
+ ACE_THROW_SPEC ((CORBA::SystemException));
+ // Remove the repository entry.
+
+ virtual void destroy_i (
+ ACE_ENV_SINGLE_ARG_DECL_WITH_DEFAULTS)
+
+ ACE_THROW_SPEC ((CORBA::SystemException));
+ // Remove the repository entry.
+
+ virtual CORBA::Contained::Description *describe (
+ ACE_ENV_SINGLE_ARG_DECL_WITH_DEFAULTS)
+
+ ACE_THROW_SPEC ((CORBA::SystemException));
+ // From Contained_i's pure virtual function.
+
+ virtual CORBA::Contained::Description *describe_i (
+ ACE_ENV_SINGLE_ARG_DECL_WITH_DEFAULTS)
+
+ ACE_THROW_SPEC ((CORBA::SystemException));
+ // From Contained_i's pure virtual function.
+
+ virtual CORBA::TypeCode_ptr type (
+ ACE_ENV_SINGLE_ARG_DECL_WITH_DEFAULTS)
+
+ ACE_THROW_SPEC ((CORBA::SystemException));
+
+ CORBA::TypeCode_ptr type_i (
+ ACE_ENV_SINGLE_ARG_DECL_WITH_DEFAULTS)
+
+ ACE_THROW_SPEC ((CORBA::SystemException));
+
+ virtual CORBA::StructMemberSeq *members (
+ ACE_ENV_SINGLE_ARG_DECL_WITH_DEFAULTS)
+
+ ACE_THROW_SPEC ((CORBA::SystemException));
+
+ CORBA::StructMemberSeq *members_i (
+ ACE_ENV_SINGLE_ARG_DECL_WITH_DEFAULTS)
+
+ ACE_THROW_SPEC ((CORBA::SystemException));
+
+ virtual void members (
+ const CORBA::StructMemberSeq & members
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS)
+
+ ACE_THROW_SPEC ((CORBA::SystemException));
+
+ void members_i (
+ const CORBA::StructMemberSeq & members
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS)
+
+ ACE_THROW_SPEC ((CORBA::SystemException));
+};
+
+TAO_END_VERSIONED_NAMESPACE_DECL
+
+#if defined(_MSC_VER)
+#pragma warning(pop)
+#endif /* _MSC_VER */
+
+#endif /* TAO_EXCEPTIONDEF_I_H */
diff --git a/TAO/orbsvcs/orbsvcs/IFRService/ExtAbstractInterfaceDef_i.cpp b/TAO/orbsvcs/orbsvcs/IFRService/ExtAbstractInterfaceDef_i.cpp
new file mode 100644
index 00000000000..82ffce83d05
--- /dev/null
+++ b/TAO/orbsvcs/orbsvcs/IFRService/ExtAbstractInterfaceDef_i.cpp
@@ -0,0 +1,43 @@
+// $Id$
+
+#include "orbsvcs/IFRService/ExtAbstractInterfaceDef_i.h"
+#include "orbsvcs/IFRService/Repository_i.h"
+
+ACE_RCSID (IFRService,
+ ExtAbstractInterfaceDef_i,
+ "$Id$")
+
+TAO_BEGIN_VERSIONED_NAMESPACE_DECL
+
+TAO_ExtAbstractInterfaceDef_i::TAO_ExtAbstractInterfaceDef_i (
+ TAO_Repository_i *repo
+ )
+ : TAO_IRObject_i (repo),
+ TAO_Container_i (repo),
+ TAO_Contained_i (repo),
+ TAO_IDLType_i (repo),
+ TAO_InterfaceDef_i (repo),
+ TAO_AbstractInterfaceDef_i (repo),
+ TAO_InterfaceAttrExtension_i (repo)
+{
+}
+
+TAO_ExtAbstractInterfaceDef_i::~TAO_ExtAbstractInterfaceDef_i (void)
+{
+}
+
+// Just call the base class version, this is here only to
+// disambiguate multiple inheritance.
+void
+TAO_ExtAbstractInterfaceDef_i::destroy (ACE_ENV_SINGLE_ARG_DECL)
+ ACE_THROW_SPEC ((CORBA::SystemException))
+{
+ TAO_IFR_WRITE_GUARD;
+
+ this->update_key (ACE_ENV_SINGLE_ARG_PARAMETER);
+ ACE_CHECK;
+
+ TAO_AbstractInterfaceDef_i::destroy_i (ACE_ENV_SINGLE_ARG_PARAMETER);
+}
+
+TAO_END_VERSIONED_NAMESPACE_DECL
diff --git a/TAO/orbsvcs/orbsvcs/IFRService/ExtAbstractInterfaceDef_i.h b/TAO/orbsvcs/orbsvcs/IFRService/ExtAbstractInterfaceDef_i.h
new file mode 100644
index 00000000000..e79471d8e11
--- /dev/null
+++ b/TAO/orbsvcs/orbsvcs/IFRService/ExtAbstractInterfaceDef_i.h
@@ -0,0 +1,70 @@
+// -*- C++ -*-
+
+// $Id$
+
+// ============================================================================
+//
+// = LIBRARY
+// TAO/orbsvcs/orbsvcs/IFRService
+//
+// = FILENAME
+// ExtAbstractInterfaceDef_i.h
+//
+// = DESCRIPTION
+// ExtAbstractInterfaceDef_i servant class.
+//
+// = AUTHOR
+// Jeff Parsons <j.parsons@vanderbilt.edu>
+//
+// ============================================================================
+
+#ifndef TAO_EXTABSTRACTINTERFACEDEF_I_H
+#define TAO_EXTABSTRACTINTERFACEDEF_I_H
+
+#include "orbsvcs/IFRService/AbstractInterfaceDef_i.h"
+#include "orbsvcs/IFRService/ifr_service_export.h"
+
+#if !defined (ACE_LACKS_PRAGMA_ONCE)
+# pragma once
+#endif /* ACE_LACKS_PRAGMA_ONCE */
+
+#include "orbsvcs/IFRService/InterfaceAttrExtension_i.h"
+
+#if defined(_MSC_VER)
+#pragma warning(push)
+#pragma warning(disable:4250)
+#endif /* _MSC_VER */
+
+
+TAO_BEGIN_VERSIONED_NAMESPACE_DECL
+
+class TAO_IFRService_Export TAO_ExtAbstractInterfaceDef_i
+ : public virtual TAO_AbstractInterfaceDef_i,
+ public virtual TAO_InterfaceAttrExtension_i
+{
+ // = TITLE
+ // TAO_ExtAbstractInterfaceDef_i
+ //
+ // = DESCRIPTION
+ // Mixes in IDL3 attribute exceptions.
+ //
+public:
+ TAO_ExtAbstractInterfaceDef_i (TAO_Repository_i *repo);
+ // Constructor
+
+ virtual ~TAO_ExtAbstractInterfaceDef_i (void);
+ // Destructor
+
+ virtual void destroy (
+ ACE_ENV_SINGLE_ARG_DECL_WITH_DEFAULTS
+ )
+ ACE_THROW_SPEC ((CORBA::SystemException));
+};
+
+TAO_END_VERSIONED_NAMESPACE_DECL
+
+#if defined(_MSC_VER)
+#pragma warning(pop)
+#endif /* _MSC_VER */
+
+#endif /* TAO_EXTABSTRACTINTERFACEDEF_I_H */
diff --git a/TAO/orbsvcs/orbsvcs/IFRService/ExtAttributeDef_i.cpp b/TAO/orbsvcs/orbsvcs/IFRService/ExtAttributeDef_i.cpp
new file mode 100644
index 00000000000..62405fe8393
--- /dev/null
+++ b/TAO/orbsvcs/orbsvcs/IFRService/ExtAttributeDef_i.cpp
@@ -0,0 +1,315 @@
+// $Id$
+
+#include "orbsvcs/IFRService/ExtAttributeDef_i.h"
+#include "orbsvcs/IFRService/Repository_i.h"
+#include "orbsvcs/IFRService/ExceptionDef_i.h"
+#include "orbsvcs/IFRService/IFR_Service_Utils.h"
+
+#include "ace/SString.h"
+
+
+ACE_RCSID (IFRService,
+ ExtAttributeDef_i,
+ "$Id$")
+
+
+TAO_BEGIN_VERSIONED_NAMESPACE_DECL
+
+TAO_ExtAttributeDef_i::TAO_ExtAttributeDef_i (TAO_Repository_i *repo)
+ : TAO_IRObject_i (repo),
+ TAO_Contained_i (repo),
+ TAO_AttributeDef_i (repo)
+{
+}
+
+TAO_ExtAttributeDef_i::~TAO_ExtAttributeDef_i (void)
+{
+}
+
+CORBA::ExcDescriptionSeq *
+TAO_ExtAttributeDef_i::get_exceptions (
+ ACE_ENV_SINGLE_ARG_DECL
+ )
+ ACE_THROW_SPEC ((CORBA::SystemException))
+{
+ TAO_IFR_READ_GUARD_RETURN (0);
+
+ this->update_key (ACE_ENV_SINGLE_ARG_PARAMETER);
+ ACE_CHECK_RETURN (0);
+
+ return this->get_exceptions_i (ACE_ENV_SINGLE_ARG_PARAMETER);
+}
+
+CORBA::ExcDescriptionSeq *
+TAO_ExtAttributeDef_i::get_exceptions_i (
+ ACE_ENV_SINGLE_ARG_DECL
+ )
+ ACE_THROW_SPEC ((CORBA::SystemException))
+{
+ CORBA::ExcDescriptionSeq *retval = 0;
+ ACE_NEW_RETURN (retval,
+ CORBA::ExcDescriptionSeq,
+ 0);
+ CORBA::ExcDescriptionSeq_var safe_retval = retval;
+
+ this->fill_exceptions (*retval,
+ "get_excepts"
+ ACE_ENV_ARG_PARAMETER);
+ ACE_CHECK_RETURN (0);
+
+ return safe_retval._retn ();
+}
+
+void
+TAO_ExtAttributeDef_i::get_exceptions (
+ const CORBA::ExcDescriptionSeq &get_exceptions
+ ACE_ENV_ARG_DECL
+ )
+ ACE_THROW_SPEC ((CORBA::SystemException))
+{
+ TAO_IFR_WRITE_GUARD;
+
+ this->update_key (ACE_ENV_SINGLE_ARG_PARAMETER);
+ ACE_CHECK;
+
+ this->get_exceptions_i (get_exceptions
+ ACE_ENV_ARG_PARAMETER);
+}
+
+void
+TAO_ExtAttributeDef_i::get_exceptions_i (
+ const CORBA::ExcDescriptionSeq &get_exceptions
+ ACE_ENV_ARG_DECL_NOT_USED
+ )
+ ACE_THROW_SPEC ((CORBA::SystemException))
+{
+ this->exceptions ("get_excepts",
+ get_exceptions);
+}
+
+CORBA::ExcDescriptionSeq *
+TAO_ExtAttributeDef_i::set_exceptions (
+ ACE_ENV_SINGLE_ARG_DECL
+ )
+ ACE_THROW_SPEC ((CORBA::SystemException))
+{
+ TAO_IFR_READ_GUARD_RETURN (0);
+
+ this->update_key (ACE_ENV_SINGLE_ARG_PARAMETER);
+ ACE_CHECK_RETURN (0);
+
+ return this->set_exceptions_i (ACE_ENV_SINGLE_ARG_PARAMETER);
+}
+
+CORBA::ExcDescriptionSeq *
+TAO_ExtAttributeDef_i::set_exceptions_i (
+ ACE_ENV_SINGLE_ARG_DECL
+ )
+ ACE_THROW_SPEC ((CORBA::SystemException))
+{
+ CORBA::ExcDescriptionSeq *retval = 0;
+ ACE_NEW_RETURN (retval,
+ CORBA::ExcDescriptionSeq,
+ 0);
+ CORBA::ExcDescriptionSeq_var safe_retval = retval;
+
+ this->fill_exceptions (*retval,
+ "put_excepts"
+ ACE_ENV_ARG_PARAMETER);
+ ACE_CHECK_RETURN (0);
+
+ return safe_retval._retn ();
+}
+
+void
+TAO_ExtAttributeDef_i::set_exceptions (
+ const CORBA::ExcDescriptionSeq &set_exceptions
+ ACE_ENV_ARG_DECL
+ )
+ ACE_THROW_SPEC ((CORBA::SystemException))
+{
+ TAO_IFR_WRITE_GUARD;
+
+ this->update_key (ACE_ENV_SINGLE_ARG_PARAMETER);
+ ACE_CHECK;
+
+ this->set_exceptions_i (set_exceptions
+ ACE_ENV_ARG_PARAMETER);
+}
+
+void
+TAO_ExtAttributeDef_i::set_exceptions_i (
+ const CORBA::ExcDescriptionSeq &set_exceptions
+ ACE_ENV_ARG_DECL_NOT_USED
+ )
+ ACE_THROW_SPEC ((CORBA::SystemException))
+{
+ this->exceptions ("put_excepts",
+ set_exceptions);
+}
+
+CORBA::ExtAttributeDescription *
+TAO_ExtAttributeDef_i::describe_attribute (
+ ACE_ENV_SINGLE_ARG_DECL
+ )
+ ACE_THROW_SPEC ((CORBA::SystemException))
+{
+ TAO_IFR_READ_GUARD_RETURN (0);
+
+ this->update_key (ACE_ENV_SINGLE_ARG_PARAMETER);
+ ACE_CHECK_RETURN (0);
+
+ return this->describe_attribute_i (ACE_ENV_SINGLE_ARG_PARAMETER);
+}
+
+CORBA::ExtAttributeDescription *
+TAO_ExtAttributeDef_i::describe_attribute_i (
+ ACE_ENV_SINGLE_ARG_DECL
+ )
+ ACE_THROW_SPEC ((CORBA::SystemException))
+{
+ CORBA::ExtAttributeDescription *retval = 0;
+ ACE_NEW_RETURN (retval,
+ CORBA::ExtAttributeDescription,
+ 0);
+ CORBA::ExtAttributeDescription_var safe_retval = retval;
+
+ this->fill_description (*retval
+ ACE_ENV_ARG_PARAMETER);
+ ACE_CHECK_RETURN (0);
+
+ return safe_retval._retn ();
+}
+
+void
+TAO_ExtAttributeDef_i::fill_description (
+ CORBA::ExtAttributeDescription &desc
+ ACE_ENV_ARG_DECL
+ )
+ ACE_THROW_SPEC ((CORBA::SystemException))
+{
+ desc.name = this->name_i (ACE_ENV_SINGLE_ARG_PARAMETER);
+ ACE_CHECK;
+
+ desc.id = this->id_i (ACE_ENV_SINGLE_ARG_PARAMETER);
+ ACE_CHECK;
+
+ ACE_TString holder;
+ this->repo_->config ()->get_string_value (this->section_key_,
+ "container_id",
+ holder);
+ desc.defined_in = holder.fast_rep ();
+
+ desc.id = this->id_i (ACE_ENV_SINGLE_ARG_PARAMETER);
+ ACE_CHECK;
+
+ desc.type = this->type_i (ACE_ENV_SINGLE_ARG_PARAMETER);
+ ACE_CHECK;
+
+ desc.mode = this->mode_i (ACE_ENV_SINGLE_ARG_PARAMETER);
+ ACE_CHECK;
+
+ this->fill_exceptions (desc.get_exceptions,
+ "get_excepts"
+ ACE_ENV_ARG_PARAMETER);
+ ACE_CHECK;
+
+ this->fill_exceptions (desc.put_exceptions,
+ "put_excepts"
+ ACE_ENV_ARG_PARAMETER);
+}
+
+void
+TAO_ExtAttributeDef_i::fill_exceptions (CORBA::ExcDescriptionSeq &exceptions,
+ const char *sub_section
+ ACE_ENV_ARG_DECL)
+{
+ ACE_Configuration_Section_Key excepts_key;
+ int status =
+ this->repo_->config ()->open_section (this->section_key_,
+ sub_section,
+ 0,
+ excepts_key);
+
+ if (status != 0)
+ {
+ exceptions.length (0);
+ return;
+ }
+
+ CORBA::ULong count = 0;
+ this->repo_->config ()->get_integer_value (excepts_key,
+ "count",
+ count);
+ exceptions.length (count);
+ char *stringified = 0;
+ ACE_TString holder;
+ ACE_Configuration_Section_Key except_key;
+
+ for (CORBA::ULong i = 0; i < count; ++i)
+ {
+ stringified = TAO_IFR_Service_Utils::int_to_string (i);
+ this->repo_->config ()->get_string_value (excepts_key,
+ stringified,
+ holder);
+ this->repo_->config ()->expand_path (this->repo_->root_key (),
+ holder,
+ except_key,
+ 0);
+ this->repo_->config ()->get_string_value (except_key,
+ "name",
+ holder);
+ exceptions[i].name = holder.fast_rep ();
+ this->repo_->config ()->get_string_value (except_key,
+ "id",
+ holder);
+ exceptions[i].id = holder.fast_rep ();
+
+ TAO_ExceptionDef_i impl (this->repo_);
+ impl.section_key (except_key);
+ exceptions[i].type = impl.type_i (ACE_ENV_SINGLE_ARG_PARAMETER);
+ ACE_CHECK;
+
+ this->repo_->config ()->get_string_value (except_key,
+ "container_id",
+ holder);
+ exceptions[i].defined_in = holder.fast_rep ();
+ this->repo_->config ()->get_string_value (except_key,
+ "version",
+ holder);
+ exceptions[i].version = holder.fast_rep ();
+ }
+}
+
+void
+TAO_ExtAttributeDef_i::exceptions (const char *sub_section,
+ const CORBA::ExcDescriptionSeq &exceptions)
+{
+ this->repo_->config ()->remove_section (this->section_key_,
+ sub_section,
+ 0);
+ ACE_Configuration_Section_Key new_key;
+ this->repo_->config ()->open_section (this->section_key_,
+ sub_section,
+ 1,
+ new_key);
+ CORBA::ULong count = exceptions.length ();
+ this->repo_->config ()->set_integer_value (new_key,
+ "count",
+ count);
+ char *stringified = 0;
+ ACE_TString path;
+
+ for (CORBA::ULong i = 0; i < count; ++i)
+ {
+ this->repo_->config ()->get_string_value (this->repo_->repo_ids_key (),
+ exceptions[i].id.in (),
+ path);
+ stringified = TAO_IFR_Service_Utils::int_to_string (i);
+ this->repo_->config ()->set_string_value (new_key,
+ stringified,
+ path);
+ }
+}
+
+TAO_END_VERSIONED_NAMESPACE_DECL
diff --git a/TAO/orbsvcs/orbsvcs/IFRService/ExtAttributeDef_i.h b/TAO/orbsvcs/orbsvcs/IFRService/ExtAttributeDef_i.h
new file mode 100644
index 00000000000..f4d9e54b665
--- /dev/null
+++ b/TAO/orbsvcs/orbsvcs/IFRService/ExtAttributeDef_i.h
@@ -0,0 +1,133 @@
+// -*- C++ -*-
+
+// $Id$
+
+// ============================================================================
+//
+// = LIBRARY
+// TAO/orbsvcs/orbsvcs/IFRService
+//
+// = FILENAME
+// ExtAttributeDef_i.h
+//
+// = DESCRIPTION
+// ExtAttributeDef_i servant class.
+//
+// = AUTHOR
+// Jeff Parsons <j.parsons@vanderbilt.edu>
+//
+// ============================================================================
+
+#ifndef TAO_EXTATTRIBUTEDEF_I_H
+#define TAO_EXTATTRIBUTEDEF_I_H
+
+#include "orbsvcs/IFRService/AttributeDef_i.h"
+#include "orbsvcs/IFRService/ifr_service_export.h"
+
+#if !defined (ACE_LACKS_PRAGMA_ONCE)
+# pragma once
+#endif /* ACE_LACKS_PRAGMA_ONCE */
+
+#if defined(_MSC_VER)
+#pragma warning(push)
+#pragma warning(disable:4250)
+#endif /* _MSC_VER */
+
+TAO_BEGIN_VERSIONED_NAMESPACE_DECL
+
+class TAO_IFRService_Export TAO_ExtAttributeDef_i
+ : public virtual TAO_AttributeDef_i
+{
+ // = TITLE
+ // TAO_ExtAttributeDef_i
+ //
+ // = DESCRIPTION
+ // Adds IDL3 extensions to AttributeDef.
+ //
+public:
+ TAO_ExtAttributeDef_i (TAO_Repository_i *repo);
+ // Constructor
+
+ virtual ~TAO_ExtAttributeDef_i (void);
+ // Destructor
+
+ virtual CORBA::ExcDescriptionSeq *get_exceptions (
+ ACE_ENV_SINGLE_ARG_DECL_WITH_DEFAULTS
+ )
+ ACE_THROW_SPEC ((CORBA::SystemException));
+
+ CORBA::ExcDescriptionSeq *get_exceptions_i (
+ ACE_ENV_SINGLE_ARG_DECL_WITH_DEFAULTS
+ )
+ ACE_THROW_SPEC ((CORBA::SystemException));
+
+ virtual void get_exceptions (
+ const CORBA::ExcDescriptionSeq &get_exceptions
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS
+ )
+ ACE_THROW_SPEC ((CORBA::SystemException));
+
+ void get_exceptions_i (
+ const CORBA::ExcDescriptionSeq &get_exceptions
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS
+ )
+ ACE_THROW_SPEC ((CORBA::SystemException));
+
+ virtual CORBA::ExcDescriptionSeq *set_exceptions (
+ ACE_ENV_SINGLE_ARG_DECL_WITH_DEFAULTS
+ )
+ ACE_THROW_SPEC ((CORBA::SystemException));
+
+ CORBA::ExcDescriptionSeq *set_exceptions_i (
+ ACE_ENV_SINGLE_ARG_DECL_WITH_DEFAULTS
+ )
+ ACE_THROW_SPEC ((CORBA::SystemException));
+
+ virtual void set_exceptions (
+ const CORBA::ExcDescriptionSeq &set_exceptions
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS
+ )
+ ACE_THROW_SPEC ((CORBA::SystemException));
+
+ void set_exceptions_i (
+ const CORBA::ExcDescriptionSeq &set_exceptions
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS
+ )
+ ACE_THROW_SPEC ((CORBA::SystemException));
+
+ virtual CORBA::ExtAttributeDescription *describe_attribute (
+ ACE_ENV_SINGLE_ARG_DECL_WITH_DEFAULTS
+ )
+ ACE_THROW_SPEC ((CORBA::SystemException));
+
+ CORBA::ExtAttributeDescription *describe_attribute_i (
+ ACE_ENV_SINGLE_ARG_DECL_WITH_DEFAULTS
+ )
+ ACE_THROW_SPEC ((CORBA::SystemException));
+
+ // Utility function that fills sequence elements for a
+ // ComponentDescription.
+ void fill_description (
+ CORBA::ExtAttributeDescription &desc
+ ACE_ENV_ARG_DECL
+ )
+ ACE_THROW_SPEC ((CORBA::SystemException));
+
+private:
+ /// Common code for the set and get varieties.
+
+ void fill_exceptions (CORBA::ExcDescriptionSeq &exceptions,
+ const char *sub_section
+ ACE_ENV_ARG_DECL);
+
+ void exceptions (const char *sub_section,
+ const CORBA::ExcDescriptionSeq &exceptions);
+};
+
+TAO_END_VERSIONED_NAMESPACE_DECL
+
+#if defined(_MSC_VER)
+#pragma warning(pop)
+#endif /* _MSC_VER */
+
+#endif /* TAO_EXTATTRIBUTEDEF_I_H */
diff --git a/TAO/orbsvcs/orbsvcs/IFRService/ExtInterfaceDef_i.cpp b/TAO/orbsvcs/orbsvcs/IFRService/ExtInterfaceDef_i.cpp
new file mode 100644
index 00000000000..30f003136b2
--- /dev/null
+++ b/TAO/orbsvcs/orbsvcs/IFRService/ExtInterfaceDef_i.cpp
@@ -0,0 +1,29 @@
+// $Id$
+
+#include "orbsvcs/IFRService/ExtInterfaceDef_i.h"
+#include "orbsvcs/IFRService/Repository_i.h"
+
+ACE_RCSID (IFRService,
+ ExtInterfaceDef_i,
+ "$Id$")
+
+
+TAO_BEGIN_VERSIONED_NAMESPACE_DECL
+
+TAO_ExtInterfaceDef_i::TAO_ExtInterfaceDef_i (
+ TAO_Repository_i *repo
+ )
+ : TAO_IRObject_i (repo),
+ TAO_Container_i (repo),
+ TAO_Contained_i (repo),
+ TAO_IDLType_i (repo),
+ TAO_InterfaceDef_i (repo),
+ TAO_InterfaceAttrExtension_i (repo)
+{
+}
+
+TAO_ExtInterfaceDef_i::~TAO_ExtInterfaceDef_i (void)
+{
+}
+
+TAO_END_VERSIONED_NAMESPACE_DECL
diff --git a/TAO/orbsvcs/orbsvcs/IFRService/ExtInterfaceDef_i.h b/TAO/orbsvcs/orbsvcs/IFRService/ExtInterfaceDef_i.h
new file mode 100644
index 00000000000..11fecc1e6a5
--- /dev/null
+++ b/TAO/orbsvcs/orbsvcs/IFRService/ExtInterfaceDef_i.h
@@ -0,0 +1,65 @@
+// -*- C++ -*-
+
+// $Id$
+
+// ============================================================================
+//
+// = LIBRARY
+// TAO/orbsvcs/orbsvcs/IFRService
+//
+// = FILENAME
+// ExtInterfaceDef_i.h
+//
+// = DESCRIPTION
+// ExtInterfaceDef_i servant class.
+//
+// = AUTHOR
+// Jeff Parsons <j.parsons@vanderbilt.edu>
+//
+// ============================================================================
+
+#ifndef TAO_EXTINTERFACEDEF_I_H
+#define TAO_EXTINTERFACEDEF_I_H
+
+#include "orbsvcs/IFRService/InterfaceDef_i.h"
+#include "orbsvcs/IFRService/ifr_service_export.h"
+
+#if !defined (ACE_LACKS_PRAGMA_ONCE)
+# pragma once
+#endif /* ACE_LACKS_PRAGMA_ONCE */
+
+#include "orbsvcs/IFRService/InterfaceAttrExtension_i.h"
+
+#if defined(_MSC_VER)
+#pragma warning(push)
+#pragma warning(disable:4250)
+#endif /* _MSC_VER */
+
+
+TAO_BEGIN_VERSIONED_NAMESPACE_DECL
+
+class TAO_IFRService_Export TAO_ExtInterfaceDef_i
+ : public virtual TAO_InterfaceDef_i,
+ public virtual TAO_InterfaceAttrExtension_i
+{
+ // = TITLE
+ // TAO_ExtInterfaceDef_i
+ //
+ // = DESCRIPTION
+ // Mixes in TAO_InterfaceAttrExtension_i to get attribute exceptions.
+ //
+public:
+ TAO_ExtInterfaceDef_i (TAO_Repository_i *repo);
+ // Constructor
+
+ virtual ~TAO_ExtInterfaceDef_i (void);
+ // Destructor
+};
+
+TAO_END_VERSIONED_NAMESPACE_DECL
+
+#if defined(_MSC_VER)
+#pragma warning(pop)
+#endif /* _MSC_VER */
+
+#endif /* TAO_EXTINTERFACEDEF_I_H */
diff --git a/TAO/orbsvcs/orbsvcs/IFRService/ExtLocalInterfaceDef_i.cpp b/TAO/orbsvcs/orbsvcs/IFRService/ExtLocalInterfaceDef_i.cpp
new file mode 100644
index 00000000000..3b802bcb762
--- /dev/null
+++ b/TAO/orbsvcs/orbsvcs/IFRService/ExtLocalInterfaceDef_i.cpp
@@ -0,0 +1,43 @@
+// $Id$
+
+#include "orbsvcs/IFRService/ExtLocalInterfaceDef_i.h"
+#include "orbsvcs/IFRService/Repository_i.h"
+
+ACE_RCSID (IFRService,
+ ExtLocalInterfaceDef_i,
+ "$Id$")
+
+TAO_BEGIN_VERSIONED_NAMESPACE_DECL
+
+TAO_ExtLocalInterfaceDef_i::TAO_ExtLocalInterfaceDef_i (
+ TAO_Repository_i *repo
+ )
+ : TAO_IRObject_i (repo),
+ TAO_Container_i (repo),
+ TAO_Contained_i (repo),
+ TAO_IDLType_i (repo),
+ TAO_InterfaceDef_i (repo),
+ TAO_LocalInterfaceDef_i (repo),
+ TAO_InterfaceAttrExtension_i (repo)
+{
+}
+
+TAO_ExtLocalInterfaceDef_i::~TAO_ExtLocalInterfaceDef_i (void)
+{
+}
+
+// Just call the base class version, this is here only to
+// disambiguate multiple inheritance.
+void
+TAO_ExtLocalInterfaceDef_i::destroy (ACE_ENV_SINGLE_ARG_DECL)
+ ACE_THROW_SPEC ((CORBA::SystemException))
+{
+ TAO_IFR_WRITE_GUARD;
+
+ this->update_key (ACE_ENV_SINGLE_ARG_PARAMETER);
+ ACE_CHECK;
+
+ TAO_LocalInterfaceDef_i::destroy_i (ACE_ENV_SINGLE_ARG_PARAMETER);
+}
+
+TAO_END_VERSIONED_NAMESPACE_DECL
diff --git a/TAO/orbsvcs/orbsvcs/IFRService/ExtLocalInterfaceDef_i.h b/TAO/orbsvcs/orbsvcs/IFRService/ExtLocalInterfaceDef_i.h
new file mode 100644
index 00000000000..1e5eec3bcf2
--- /dev/null
+++ b/TAO/orbsvcs/orbsvcs/IFRService/ExtLocalInterfaceDef_i.h
@@ -0,0 +1,70 @@
+// -*- C++ -*-
+
+// $Id$
+
+// ============================================================================
+//
+// = LIBRARY
+// TAO/orbsvcs/orbsvcs/IFRService
+//
+// = FILENAME
+// ExtLocalInterfaceDef_i.h
+//
+// = DESCRIPTION
+// ExtLocalInterfaceDef_i servant class.
+//
+// = AUTHOR
+// Jeff Parsons <j.parsons@vanderbilt.edu>
+//
+// ============================================================================
+
+#ifndef TAO_EXTLOCALINTERFACEDEF_I_H
+#define TAO_EXTLOCALINTERFACEDEF_I_H
+
+#include "orbsvcs/IFRService/LocalInterfaceDef_i.h"
+#include "orbsvcs/IFRService/ifr_service_export.h"
+
+#if !defined (ACE_LACKS_PRAGMA_ONCE)
+# pragma once
+#endif /* ACE_LACKS_PRAGMA_ONCE */
+
+#include "orbsvcs/IFRService/InterfaceAttrExtension_i.h"
+
+#if defined(_MSC_VER)
+#pragma warning(push)
+#pragma warning(disable:4250)
+#endif /* _MSC_VER */
+
+TAO_BEGIN_VERSIONED_NAMESPACE_DECL
+
+class TAO_IFRService_Export TAO_ExtLocalInterfaceDef_i
+ : public virtual TAO_LocalInterfaceDef_i,
+ public virtual TAO_InterfaceAttrExtension_i
+{
+ // = TITLE
+ // TAO_ExtLocaltInterfaceDef_i
+ //
+ // = DESCRIPTION
+ // Mixes in IDL3 attribute exceptions.
+ //
+public:
+ TAO_ExtLocalInterfaceDef_i (TAO_Repository_i *repo);
+ // Constructor
+
+ virtual ~TAO_ExtLocalInterfaceDef_i (void);
+ // Destructor
+
+ virtual void destroy (
+ ACE_ENV_SINGLE_ARG_DECL_WITH_DEFAULTS
+ )
+ ACE_THROW_SPEC ((CORBA::SystemException));
+};
+
+TAO_END_VERSIONED_NAMESPACE_DECL
+
+#if defined(_MSC_VER)
+#pragma warning(pop)
+#endif /* _MSC_VER */
+
+#endif /* TAO_EXTLOCALINTERFACEDEF_I_H */
+
diff --git a/TAO/orbsvcs/orbsvcs/IFRService/ExtValueDef_i.cpp b/TAO/orbsvcs/orbsvcs/IFRService/ExtValueDef_i.cpp
new file mode 100644
index 00000000000..410fd91c7d9
--- /dev/null
+++ b/TAO/orbsvcs/orbsvcs/IFRService/ExtValueDef_i.cpp
@@ -0,0 +1,975 @@
+// $Id$
+
+#include "orbsvcs/IFRService/Repository_i.h"
+#include "orbsvcs/IFRService/ExtValueDef_i.h"
+#include "orbsvcs/IFRService/ExceptionDef_i.h"
+#include "orbsvcs/IFRService/IFR_Service_Utils.h"
+#include "orbsvcs/IFRService/IFR_Service_Utils_T.h"
+
+#include "ace/SString.h"
+
+
+ACE_RCSID (IFRService,
+ ExtValueDef_i,
+ "$Id$")
+
+TAO_BEGIN_VERSIONED_NAMESPACE_DECL
+
+TAO_ExtValueDef_i::TAO_ExtValueDef_i (TAO_Repository_i *repo)
+ : TAO_IRObject_i (repo),
+ TAO_Container_i (repo),
+ TAO_Contained_i (repo),
+ TAO_IDLType_i (repo),
+ TAO_ValueDef_i (repo)
+{
+}
+
+TAO_ExtValueDef_i::~TAO_ExtValueDef_i (void)
+{
+}
+
+CORBA::ExtInitializerSeq *
+TAO_ExtValueDef_i::ext_initializers (
+ ACE_ENV_SINGLE_ARG_DECL
+ )
+ ACE_THROW_SPEC ((CORBA::SystemException))
+{
+ TAO_IFR_READ_GUARD_RETURN (0);
+
+ this->update_key (ACE_ENV_SINGLE_ARG_PARAMETER);
+ ACE_CHECK_RETURN (0);
+
+ return this->ext_initializers_i (ACE_ENV_SINGLE_ARG_PARAMETER);
+}
+
+CORBA::ExtInitializerSeq *
+TAO_ExtValueDef_i::ext_initializers_i (
+ ACE_ENV_SINGLE_ARG_DECL
+ )
+ ACE_THROW_SPEC ((CORBA::SystemException))
+{
+ CORBA::ExtInitializerSeq *iseq = 0;
+ ACE_NEW_RETURN (iseq,
+ CORBA::ExtInitializerSeq,
+ 0);
+ CORBA::ExtInitializerSeq_var retval = iseq;
+
+ ACE_Configuration_Section_Key initializers_key;
+ int status =
+ this->repo_->config ()->open_section (this->section_key_,
+ "initializers",
+ 0,
+ initializers_key);
+
+ if (status != 0)
+ {
+ iseq->length (0);
+ return retval._retn ();
+ }
+
+ CORBA::ULong count = 0;
+ this->repo_->config ()->get_integer_value (initializers_key,
+ "count",
+ count);
+ iseq->length (count);
+ char *stringified = 0;
+ ACE_Configuration_Section_Key initializer_key, params_key, arg_key;
+ ACE_TString holder;
+ CORBA::ULong arg_count = 0;
+
+ for (CORBA::ULong i = 0; i < count; ++i)
+ {
+ stringified = TAO_IFR_Service_Utils::int_to_string (i);
+ this->repo_->config ()->open_section (initializers_key,
+ stringified,
+ 0,
+ initializer_key);
+ this->repo_->config ()->get_string_value (initializer_key,
+ "name",
+ holder);
+ retval[i].name = holder.fast_rep ();
+ status =
+ this->repo_->config ()->open_section (initializer_key,
+ "params",
+ 0,
+ params_key);
+
+ if (status != 0)
+ {
+ retval[i].members.length (0);
+ continue;
+ }
+
+ this->repo_->config ()->get_integer_value (params_key,
+ "count",
+ arg_count);
+ retval[i].members.length (arg_count);
+ CORBA::Object_var obj;
+
+ for (CORBA::ULong j = 0; j < arg_count; ++j)
+ {
+ stringified = TAO_IFR_Service_Utils::int_to_string (j);
+ this->repo_->config ()->open_section (params_key,
+ stringified,
+ 0,
+ arg_key);
+ this->repo_->config ()->get_string_value (arg_key,
+ "arg_name",
+ holder);
+ retval[i].members[j].name = holder.fast_rep ();
+ this->repo_->config ()->get_string_value (arg_key,
+ "arg_path",
+ holder);
+ TAO_IDLType_i *impl =
+ TAO_IFR_Service_Utils::path_to_idltype (holder,
+ this->repo_);
+ retval[i].members[j].type =
+ impl->type_i (ACE_ENV_SINGLE_ARG_PARAMETER);
+ ACE_CHECK_RETURN (0);
+
+ obj =
+ TAO_IFR_Service_Utils::path_to_ir_object (holder,
+ this->repo_
+ ACE_ENV_ARG_PARAMETER);
+ ACE_CHECK_RETURN (0);
+
+ retval[i].members[j].type_def =
+ CORBA::IDLType::_narrow (obj.in ()
+ ACE_ENV_ARG_PARAMETER);
+ ACE_CHECK_RETURN (0);
+ }
+
+ this->fill_exceptions (retval[i].exceptions,
+ initializer_key,
+ "excepts"
+ ACE_ENV_ARG_PARAMETER);
+ ACE_CHECK_RETURN (0);
+ }
+
+ return retval._retn ();
+}
+
+void
+TAO_ExtValueDef_i::ext_initializers (
+ const CORBA::ExtInitializerSeq &ext_initializers
+ ACE_ENV_ARG_DECL
+ )
+ ACE_THROW_SPEC ((CORBA::SystemException))
+{
+ TAO_IFR_WRITE_GUARD;
+
+ this->update_key (ACE_ENV_SINGLE_ARG_PARAMETER);
+ ACE_CHECK;
+
+ this->ext_initializers_i (ext_initializers
+ ACE_ENV_ARG_PARAMETER);
+}
+
+void
+TAO_ExtValueDef_i::ext_initializers_i (
+ const CORBA::ExtInitializerSeq &ext_initializers
+ ACE_ENV_ARG_DECL_NOT_USED
+ )
+ ACE_THROW_SPEC ((CORBA::SystemException))
+{
+ ACE_Configuration *config = this->repo_->config ();
+ config->remove_section (this->section_key_,
+ "initializers",
+ 1);
+
+ /// This does not handle the initializer exceptions, so we do that below.
+ TAO_IFR_Generic_Utils<CORBA::ExtInitializerSeq>::set_initializers (
+ ext_initializers,
+ this->repo_->config (),
+ this->section_key_
+ );
+
+ CORBA::ULong length = ext_initializers.length ();
+
+ if (length > 0)
+ {
+ ACE_Configuration_Section_Key initializers_key, initializer_key;
+ char *stringified = 0;
+
+ this->repo_->config ()->open_section (this->section_key_,
+ "initializers",
+ 0,
+ initializers_key);
+
+ for (CORBA::ULong i = 0; i < length; ++i)
+ {
+ stringified = TAO_IFR_Service_Utils::int_to_string (i);
+ this->repo_->config ()->open_section (initializers_key,
+ stringified,
+ 0,
+ initializer_key);
+
+ this->exceptions (initializer_key,
+ "excepts",
+ ext_initializers[i].exceptions);
+ }
+ }
+}
+
+CORBA::ExtValueDef::ExtFullValueDescription *
+TAO_ExtValueDef_i::describe_ext_value (
+ ACE_ENV_SINGLE_ARG_DECL
+ )
+ ACE_THROW_SPEC ((CORBA::SystemException))
+{
+ TAO_IFR_READ_GUARD_RETURN (0);
+
+ this->update_key (ACE_ENV_SINGLE_ARG_PARAMETER);
+ ACE_CHECK_RETURN (0);
+
+ return this->describe_ext_value_i (ACE_ENV_SINGLE_ARG_PARAMETER);
+}
+
+CORBA::ExtValueDef::ExtFullValueDescription *
+TAO_ExtValueDef_i::describe_ext_value_i (
+ ACE_ENV_SINGLE_ARG_DECL
+ )
+ ACE_THROW_SPEC ((CORBA::SystemException))
+{
+ CORBA::ExtValueDef::ExtFullValueDescription *fv_desc = 0;
+ ACE_NEW_RETURN (fv_desc,
+ CORBA::ExtValueDef::ExtFullValueDescription,
+ 0);
+ CORBA::ExtValueDef::ExtFullValueDescription_var retval = fv_desc;
+
+ ACE_TString holder;
+ this->repo_->config ()->get_string_value (this->section_key_,
+ "name",
+ holder);
+ fv_desc->name = holder.fast_rep ();
+ this->repo_->config ()->get_string_value (this->section_key_,
+ "id",
+ holder);
+ fv_desc->id = holder.fast_rep ();
+
+ CORBA::ULong val = 0;
+
+ this->repo_->config ()->get_integer_value (this->section_key_,
+ "is_abstract",
+ val);
+ fv_desc->is_abstract = static_cast<CORBA::Boolean> (val);
+ this->repo_->config ()->get_integer_value (this->section_key_,
+ "is_custom",
+ val);
+ fv_desc->is_custom = static_cast<CORBA::Boolean> (val);
+ this->repo_->config ()->get_string_value (this->section_key_,
+ "container_id",
+ holder);
+ fv_desc->defined_in = holder.fast_rep ();
+ this->repo_->config ()->get_string_value (this->section_key_,
+ "version",
+ holder);
+ fv_desc->version = holder.fast_rep ();
+
+ // Operations.
+
+ fv_desc->operations.length (0);
+
+ ACE_Configuration_Section_Key ops_key;
+ int status =
+ this->repo_->config ()->open_section (this->section_key_,
+ "ops",
+ 0,
+ ops_key);
+ CORBA::ULong count = 0;
+ CORBA::ULong param_count = 0;
+ char *stringified = 0;
+ CORBA::ULong i = 0;
+ CORBA::ULong j = 0;
+ TAO_IDLType_i *idl_type = 0;
+ CORBA::Object_var obj;
+ ACE_Configuration_Section_Key params_key, excepts_key, except_def_key;
+
+ if (status == 0)
+ {
+ this->repo_->config ()->get_integer_value (ops_key,
+ "count",
+ count);
+ fv_desc->operations.length (count);
+ ACE_Configuration_Section_Key op_key, result_key, contexts_key;
+
+ for (i = 0; i < count; ++i)
+ {
+ stringified = TAO_IFR_Service_Utils::int_to_string (i);
+ this->repo_->config ()->open_section (ops_key,
+ stringified,
+ 0,
+ op_key);
+ this->repo_->config ()->get_string_value (op_key,
+ "name",
+ holder);
+ fv_desc->operations[i].name = holder.fast_rep ();
+ this->repo_->config ()->get_string_value (op_key,
+ "id",
+ holder);
+ fv_desc->operations[i].id = holder.fast_rep ();
+ this->repo_->config ()->get_string_value (this->section_key_,
+ "id",
+ holder);
+ fv_desc->operations[i].defined_in = holder.fast_rep ();
+ this->repo_->config ()->get_string_value (op_key,
+ "result",
+ holder);
+ idl_type =
+ TAO_IFR_Service_Utils::path_to_idltype (holder,
+ this->repo_);
+ fv_desc->operations[i].result =
+ idl_type->type_i (ACE_ENV_SINGLE_ARG_PARAMETER);
+ ACE_CHECK_RETURN (0);
+
+ this->repo_->config ()->get_integer_value (op_key,
+ "mode",
+ val);
+ fv_desc->operations[i].mode = static_cast<CORBA::OperationMode> (val);
+ CORBA::TCKind kind =
+ fv_desc->operations[i].result->kind (ACE_ENV_SINGLE_ARG_PARAMETER);
+ ACE_CHECK_RETURN (0);
+
+ if (fv_desc->operations[i].mode == CORBA::OP_ONEWAY
+ && kind != CORBA::tk_void)
+ {
+ ACE_THROW_RETURN (CORBA::BAD_PARAM (CORBA::OMGVMCID | 31,
+ CORBA::COMPLETED_NO),
+ 0);
+ }
+
+ // Operation contexts.
+
+ TAO_IFR_Strseq_Utils<CORBA::ContextIdSeq>::fill_string_seq (
+ "contexts",
+ this->repo_->config (),
+ op_key,
+ fv_desc->operations[i].contexts
+ );
+
+ // Operation parameters.
+
+ fv_desc->operations[i].parameters.length (0);
+ status =
+ this->repo_->config ()->open_section (op_key,
+ "params",
+ 0,
+ params_key);
+ if (status == 0)
+ {
+ ACE_Configuration_Section_Key param_key;
+ this->repo_->config ()->get_integer_value (params_key,
+ "count",
+ param_count);
+ fv_desc->operations[i].parameters.length (param_count);
+
+ for (j = 0; j < param_count; ++j)
+ {
+ stringified = TAO_IFR_Service_Utils::int_to_string (j);
+ this->repo_->config ()->open_section (params_key,
+ stringified,
+ 0,
+ param_key);
+ this->repo_->config ()->get_string_value (param_key,
+ "name",
+ holder);
+ fv_desc->operations[i].parameters[j].name =
+ holder.fast_rep ();
+ this->repo_->config ()->get_string_value (param_key,
+ "type_path",
+ holder);
+ idl_type =
+ TAO_IFR_Service_Utils::path_to_idltype (holder,
+ this->repo_);
+ fv_desc->operations[i].parameters[j].type =
+ idl_type->type_i (ACE_ENV_SINGLE_ARG_PARAMETER);
+ ACE_CHECK_RETURN (0);
+
+ obj =
+ TAO_IFR_Service_Utils::path_to_ir_object (
+ holder,
+ this->repo_
+ ACE_ENV_ARG_PARAMETER
+ );
+ ACE_CHECK_RETURN (0);
+
+ fv_desc->operations[i].parameters[j].type_def =
+ CORBA::IDLType::_narrow (obj.in ()
+ ACE_ENV_ARG_PARAMETER);
+ ACE_CHECK_RETURN (0);
+
+ this->repo_->config ()->get_integer_value (param_key,
+ "mode",
+ val);
+ fv_desc->operations[i].parameters[j].mode =
+ static_cast<CORBA::ParameterMode> (val);
+ }
+ }
+
+ // Operation exceptions.
+
+ status =
+ this->repo_->config ()->open_section (op_key,
+ "excepts",
+ 0,
+ excepts_key);
+ fv_desc->operations[i].exceptions.length (0);
+
+ if (status == 0)
+ {
+ CORBA::ULong excep_count = 0;
+ this->repo_->config ()->get_integer_value (excepts_key,
+ "count",
+ excep_count);
+ fv_desc->operations[i].exceptions.length (excep_count);
+ ACE_Configuration_Section_Key except_def_key;
+
+ for (j = 0; j < excep_count; ++j)
+ {
+ stringified = TAO_IFR_Service_Utils::int_to_string (j);
+ this->repo_->config ()->get_string_value (excepts_key,
+ stringified,
+ holder);
+
+ this->repo_->config ()->expand_path (
+ this->repo_->root_key (),
+ holder,
+ except_def_key,
+ 0
+ );
+ this->repo_->config ()->get_string_value (except_def_key,
+ "name",
+ holder);
+ fv_desc->operations[i].exceptions[j].name =
+ holder.fast_rep ();
+ this->repo_->config ()->get_string_value (except_def_key,
+ "id",
+ holder);
+ fv_desc->operations[i].exceptions[j].id =
+ holder.fast_rep ();
+ this->repo_->config ()->get_string_value (except_def_key,
+ "container_id",
+ holder);
+ fv_desc->operations[i].exceptions[j].defined_in =
+ holder.fast_rep ();
+ this->repo_->config ()->get_string_value (except_def_key,
+ "version",
+ holder);
+ fv_desc->operations[i].exceptions[j].version =
+ holder.fast_rep ();
+
+ TAO_ExceptionDef_i impl (this->repo_);
+ impl.section_key (except_def_key);
+ fv_desc->operations[i].exceptions[j].type =
+ impl.type_i (ACE_ENV_SINGLE_ARG_PARAMETER);
+ ACE_CHECK_RETURN (0);
+ }
+ }
+ }
+ }
+
+ // Attributes..
+
+ fv_desc->attributes.length (0);
+
+ ACE_Configuration_Section_Key attrs_key;
+ status =
+ this->repo_->config ()->open_section (this->section_key_,
+ "attrs",
+ 0,
+ attrs_key);
+ if (status == 0)
+ {
+ this->repo_->config ()->get_integer_value (attrs_key,
+ "count",
+ count);
+ fv_desc->attributes.length (count);
+ ACE_Configuration_Section_Key attr_key, attr_def_key;
+
+ for (i = 0; i < count; ++i)
+ {
+ stringified = TAO_IFR_Service_Utils::int_to_string (i);
+ this->repo_->config ()->open_section (attrs_key,
+ stringified,
+ 0,
+ attr_key);
+ this->repo_->config ()->get_string_value (attr_key,
+ "name",
+ holder);
+ fv_desc->attributes[i].name = holder.fast_rep ();
+ this->repo_->config ()->get_string_value (attr_key,
+ "id",
+ holder);
+ fv_desc->attributes[i].id = holder.fast_rep ();
+ this->repo_->config ()->get_string_value (attr_key,
+ "version",
+ holder);
+ fv_desc->attributes[i].version = holder.fast_rep ();
+ this->repo_->config ()->get_integer_value (attr_key,
+ "mode",
+ val);
+ fv_desc->attributes[i].mode =
+ static_cast<CORBA::AttributeMode> (val);
+ this->repo_->config ()->get_string_value (attr_key,
+ "type_path",
+ holder);
+
+ // Use the type path for 'defined_in' and 'type'.
+
+ idl_type =
+ TAO_IFR_Service_Utils::path_to_idltype (holder,
+ this->repo_);
+ fv_desc->attributes[i].type =
+ idl_type->type_i (ACE_ENV_SINGLE_ARG_PARAMETER);
+ ACE_CHECK_RETURN (0);
+
+ this->repo_->config ()->expand_path (this->repo_->root_key (),
+ holder,
+ attr_def_key,
+ 0);
+ this->repo_->config ()->get_string_value (attr_def_key,
+ "container_id",
+ holder);
+ fv_desc->attributes[i].defined_in = holder.fast_rep ();
+
+
+ this->fill_exceptions (fv_desc->attributes[i].get_exceptions,
+ attr_key,
+ "get_excepts"
+ ACE_ENV_ARG_PARAMETER);
+ ACE_CHECK_RETURN (0);
+
+
+ this->fill_exceptions (fv_desc->attributes[i].put_exceptions,
+ attr_key,
+ "put_excepts"
+ ACE_ENV_ARG_PARAMETER);
+ ACE_CHECK_RETURN (0);
+ }
+ }
+
+ // Members..
+
+ fv_desc->members.length (0);
+
+ ACE_Configuration_Section_Key members_key;
+ status =
+ this->repo_->config ()->open_section (this->section_key_,
+ "members",
+ 0,
+ members_key);
+ if (status == 0)
+ {
+ this->repo_->config ()->get_integer_value (members_key,
+ "count",
+ count);
+ fv_desc->members.length (count);
+ ACE_Configuration_Section_Key member_key, member_def_key;
+
+ for (i = 0; i < count; ++i)
+ {
+ stringified = TAO_IFR_Service_Utils::int_to_string (i);
+ this->repo_->config ()->open_section (members_key,
+ stringified,
+ 0,
+ member_key);
+ this->repo_->config ()->get_string_value (member_key,
+ "name",
+ holder);
+ fv_desc->members[i].name = holder.fast_rep ();
+ this->repo_->config ()->get_string_value (member_key,
+ "id",
+ holder);
+ fv_desc->members[i].id = holder.fast_rep ();
+ this->repo_->config ()->get_string_value (member_key,
+ "container_id",
+ holder);
+ fv_desc->members[i].defined_in = holder.fast_rep ();
+ this->repo_->config ()->get_string_value (member_key,
+ "version",
+ holder);
+ fv_desc->members[i].version = holder.fast_rep ();
+
+ this->repo_->config ()->get_integer_value (member_key,
+ "access",
+ val);
+ fv_desc->members[i].access =
+ static_cast<CORBA::Visibility> (val);
+
+ // Use type path for 'type' and 'type_def',
+
+ this->repo_->config ()->get_string_value (member_key,
+ "type_path",
+ holder);
+ idl_type =
+ TAO_IFR_Service_Utils::path_to_idltype (holder,
+ this->repo_);
+ fv_desc->members[i].type =
+ idl_type->type_i (ACE_ENV_SINGLE_ARG_PARAMETER);
+ ACE_CHECK_RETURN (0);
+
+ obj =
+ TAO_IFR_Service_Utils::path_to_ir_object (holder,
+ this->repo_
+ ACE_ENV_ARG_PARAMETER);
+ ACE_CHECK_RETURN (0);
+
+ fv_desc->members[i].type_def =
+ CORBA::IDLType::_narrow (obj.in ()
+ ACE_ENV_ARG_PARAMETER);
+ ACE_CHECK_RETURN (0);
+ }
+ }
+
+ // Initializers
+
+ fv_desc->initializers.length (0);
+
+ ACE_Configuration_Section_Key initializers_key;
+ status =
+ this->repo_->config ()->open_section (this->section_key_,
+ "initializers",
+ 0,
+ initializers_key);
+
+ if (status == 0)
+ {
+ this->repo_->config ()->get_integer_value (initializers_key,
+ "count",
+ count);
+ fv_desc->initializers.length (count);
+ ACE_Configuration_Section_Key initializer_key,
+ params_key,
+ arg_key,
+ excepts_key;
+
+ for (i = 0; i < count; ++i)
+ {
+ stringified = TAO_IFR_Service_Utils::int_to_string (i);
+ this->repo_->config ()->open_section (initializers_key,
+ stringified,
+ 0,
+ initializer_key);
+ this->repo_->config ()->get_string_value (initializer_key,
+ "name",
+ holder);
+ fv_desc->initializers[i].name = holder.fast_rep ();
+
+ fv_desc->initializers[i].members.length (0);
+
+ status =
+ this->repo_->config ()->open_section (initializer_key,
+ "params",
+ 0,
+ params_key);
+
+ if (status == 0)
+ {
+ this->repo_->config ()->get_integer_value (params_key,
+ "count",
+ param_count);
+ fv_desc->initializers[i].members.length (param_count);
+
+ for (j = 0; j < param_count; ++j)
+ {
+ stringified = TAO_IFR_Service_Utils::int_to_string (j);
+ this->repo_->config ()->open_section (params_key,
+ stringified,
+ 0,
+ arg_key);
+ this->repo_->config ()->get_string_value (arg_key,
+ "arg_name",
+ holder);
+ fv_desc->initializers[i].members[j].name =
+ holder.fast_rep ();
+ this->repo_->config ()->get_string_value (arg_key,
+ "arg_path",
+ holder);
+ TAO_IDLType_i *impl =
+ TAO_IFR_Service_Utils::path_to_idltype (holder,
+ this->repo_);
+ fv_desc->initializers[i].members[j].type =
+ impl->type_i (ACE_ENV_SINGLE_ARG_PARAMETER);
+ ACE_CHECK_RETURN (0);
+
+ obj =
+ TAO_IFR_Service_Utils::path_to_ir_object (
+ holder,
+ this->repo_
+ ACE_ENV_ARG_PARAMETER
+ );
+ ACE_CHECK_RETURN (0);
+
+ fv_desc->initializers[i].members[j].type_def =
+ CORBA::IDLType::_narrow (obj.in ()
+ ACE_ENV_ARG_PARAMETER);
+ ACE_CHECK_RETURN (0);
+ }
+ }
+
+ this->fill_exceptions (fv_desc->initializers[i].exceptions,
+ initializer_key,
+ "excepts"
+ ACE_ENV_ARG_PARAMETER);
+ ACE_CHECK_RETURN (0);
+ }
+ }
+
+ TAO_IFR_Strseq_Utils<CORBA::RepositoryIdSeq>::fill_string_seq (
+ "supported",
+ this->repo_->config (),
+ this->section_key_,
+ fv_desc->supported_interfaces
+ );
+
+ TAO_IFR_Strseq_Utils<CORBA::RepositoryIdSeq>::fill_string_seq (
+ "abstract_bases",
+ this->repo_->config (),
+ this->section_key_,
+ fv_desc->abstract_base_values
+ );
+
+ this->repo_->config ()->get_integer_value (this->section_key_,
+ "is_truncatable",
+ val);
+ fv_desc->is_truncatable = static_cast<CORBA::Boolean> (val);
+ this->repo_->config ()->get_string_value (this->section_key_,
+ "base_value",
+ holder);
+ fv_desc->base_value = holder.fast_rep ();
+ fv_desc->type = this->type_i (ACE_ENV_SINGLE_ARG_PARAMETER);
+ ACE_CHECK_RETURN (0);
+
+ return retval._retn ();
+}
+
+CORBA::ExtAttributeDef_ptr
+TAO_ExtValueDef_i::create_ext_attribute (
+ const char *id,
+ const char *name,
+ const char *version,
+ CORBA::IDLType_ptr type,
+ CORBA::AttributeMode mode,
+ const CORBA::ExceptionDefSeq &get_exceptions,
+ const CORBA::ExceptionDefSeq &set_exceptions
+ ACE_ENV_ARG_DECL
+ )
+ ACE_THROW_SPEC ((CORBA::SystemException))
+{
+ TAO_IFR_WRITE_GUARD_RETURN (CORBA::ExtAttributeDef::_nil ());
+
+ this->update_key (ACE_ENV_SINGLE_ARG_PARAMETER);
+ ACE_CHECK_RETURN (CORBA::ExtAttributeDef::_nil ());
+
+ return this->create_ext_attribute_i (id,
+ name,
+ version,
+ type,
+ mode,
+ get_exceptions,
+ set_exceptions
+ ACE_ENV_ARG_PARAMETER);
+}
+
+CORBA::ExtAttributeDef_ptr
+TAO_ExtValueDef_i::create_ext_attribute_i (
+ const char *id,
+ const char *name,
+ const char *version,
+ CORBA::IDLType_ptr type,
+ CORBA::AttributeMode mode,
+ const CORBA::ExceptionDefSeq &get_exceptions,
+ const CORBA::ExceptionDefSeq &set_exceptions
+ ACE_ENV_ARG_DECL
+ )
+ ACE_THROW_SPEC ((CORBA::SystemException))
+{
+ TAO_Container_i::tmp_name_holder_ = name;
+ ACE_Configuration_Section_Key new_key;
+
+ // Common to all IR objects created in CORBA::Container.
+ ACE_TString path =
+ TAO_IFR_Service_Utils::create_common (CORBA::dk_Value,
+ CORBA::dk_Attribute,
+ this->section_key_,
+ new_key,
+ this->repo_,
+ id,
+ name,
+ &TAO_Container_i::same_as_tmp_name,
+ version,
+ "attrs"
+ ACE_ENV_ARG_PARAMETER);
+ ACE_CHECK_RETURN (CORBA::ExtAttributeDef::_nil ());
+
+ // Store the path to the attribute's type definition.
+ char *type_path = TAO_IFR_Service_Utils::reference_to_path (type);
+
+ this->repo_->config ()->set_string_value (new_key,
+ "type_path",
+ type_path);
+
+ // Store the attribute's mode.
+ this->repo_->config ()->set_integer_value (new_key,
+ "mode",
+ mode);
+
+ this->exceptions (new_key,
+ "get_excepts",
+ get_exceptions);
+
+ this->exceptions (new_key,
+ "put_excepts",
+ set_exceptions);
+
+ // Create the object reference.
+ CORBA::Object_var obj =
+ TAO_IFR_Service_Utils::create_objref (CORBA::dk_Attribute,
+ path.c_str (),
+ this->repo_
+ ACE_ENV_ARG_PARAMETER);
+ ACE_CHECK_RETURN (CORBA::ExtAttributeDef::_nil ());
+
+ CORBA::ExtAttributeDef_var retval =
+ CORBA::ExtAttributeDef::_narrow (obj.in ()
+ ACE_ENV_ARG_PARAMETER);
+ ACE_CHECK_RETURN (CORBA::ExtAttributeDef::_nil ());
+
+ return retval._retn ();
+}
+
+void
+TAO_ExtValueDef_i::fill_exceptions (CORBA::ExcDescriptionSeq &exceptions,
+ ACE_Configuration_Section_Key &key,
+ const char *sub_section
+ ACE_ENV_ARG_DECL)
+{
+ ACE_Configuration_Section_Key excepts_key;
+ int status =
+ this->repo_->config ()->open_section (key,
+ sub_section,
+ 0,
+ excepts_key);
+
+ if (status != 0)
+ {
+ exceptions.length (0);
+ return;
+ }
+
+ CORBA::ULong count = 0;
+ this->repo_->config ()->get_integer_value (excepts_key,
+ "count",
+ count);
+ exceptions.length (count);
+ char *stringified = 0;
+ ACE_TString holder;
+ ACE_Configuration_Section_Key except_key;
+
+ for (CORBA::ULong i = 0; i < count; ++i)
+ {
+ stringified = TAO_IFR_Service_Utils::int_to_string (i);
+ this->repo_->config ()->get_string_value (excepts_key,
+ stringified,
+ holder);
+ this->repo_->config ()->expand_path (this->repo_->root_key (),
+ holder,
+ except_key,
+ 0);
+ this->repo_->config ()->get_string_value (except_key,
+ "name",
+ holder);
+ exceptions[i].name = holder.fast_rep ();
+ this->repo_->config ()->get_string_value (except_key,
+ "id",
+ holder);
+ exceptions[i].id = holder.fast_rep ();
+
+ TAO_ExceptionDef_i impl (this->repo_);
+ impl.section_key (except_key);
+ exceptions[i].type = impl.type_i (ACE_ENV_SINGLE_ARG_PARAMETER);
+ ACE_CHECK;
+
+ this->repo_->config ()->get_string_value (except_key,
+ "container_id",
+ holder);
+ exceptions[i].defined_in = holder.fast_rep ();
+ this->repo_->config ()->get_string_value (except_key,
+ "version",
+ holder);
+ exceptions[i].version = holder.fast_rep ();
+ }
+}
+
+void
+TAO_ExtValueDef_i::exceptions (ACE_Configuration_Section_Key &key,
+ const char *sub_section,
+ const CORBA::ExcDescriptionSeq &exceptions)
+{
+ CORBA::ULong length = exceptions.length ();
+
+ if (length == 0)
+ {
+ return;
+ }
+
+ ACE_Configuration_Section_Key new_key;
+ this->repo_->config ()->open_section (key,
+ sub_section,
+ 1,
+ new_key);
+ this->repo_->config ()->set_integer_value (new_key,
+ "count",
+ length);
+ char *stringified = 0;
+ ACE_TString path;
+
+ for (CORBA::ULong i = 0; i < length; ++i)
+ {
+ this->repo_->config ()->get_string_value (this->repo_->repo_ids_key (),
+ exceptions[i].id.in (),
+ path);
+ stringified = TAO_IFR_Service_Utils::int_to_string (i);
+ this->repo_->config ()->set_string_value (new_key,
+ stringified,
+ path);
+ }
+}
+
+void
+TAO_ExtValueDef_i::exceptions (ACE_Configuration_Section_Key &key,
+ const char *sub_section,
+ const CORBA::ExceptionDefSeq &exceptions)
+{
+ CORBA::ULong length = exceptions.length ();
+
+ if (length == 0)
+ {
+ return;
+ }
+
+ ACE_Configuration_Section_Key excepts_key;
+ this->repo_->config ()->open_section (key,
+ sub_section,
+ 1,
+ excepts_key);
+
+ this->repo_->config ()->set_integer_value (excepts_key,
+ "count",
+ length);
+ char *stringified = 0;
+ char *type_path = 0;
+
+ for (CORBA::ULong i = 0; i < length; ++i)
+ {
+ type_path =
+ TAO_IFR_Service_Utils::reference_to_path (exceptions[i]);
+
+ stringified = TAO_IFR_Service_Utils::int_to_string (i);
+ this->repo_->config ()->set_string_value (excepts_key,
+ stringified,
+ type_path);
+ }
+}
+
+TAO_END_VERSIONED_NAMESPACE_DECL
diff --git a/TAO/orbsvcs/orbsvcs/IFRService/ExtValueDef_i.h b/TAO/orbsvcs/orbsvcs/IFRService/ExtValueDef_i.h
new file mode 100644
index 00000000000..d2390a47c4a
--- /dev/null
+++ b/TAO/orbsvcs/orbsvcs/IFRService/ExtValueDef_i.h
@@ -0,0 +1,135 @@
+// -*- C++ -*-
+
+// $Id$
+
+// ============================================================================
+//
+// = LIBRARY
+// TAO/orbsvcs/orbsvcs/IFRService
+//
+// = FILENAME
+// ExtValueDef_i.h
+//
+// = DESCRIPTION
+// ExtValueDef_i servant class.
+//
+// = AUTHOR
+// Jeff Parsons <j.parsons@vanderbilt.edu>
+//
+// ============================================================================
+
+#ifndef TAO_EXTVALUEDEF_I_H
+#define TAO_EXTVALUEDEF_I_H
+
+#include "orbsvcs/IFRService/ValueDef_i.h"
+#include "orbsvcs/IFRService/ifr_service_export.h"
+
+#if !defined (ACE_LACKS_PRAGMA_ONCE)
+# pragma once
+#endif /* ACE_LACKS_PRAGMA_ONCE */
+
+#if defined(_MSC_VER)
+#pragma warning(push)
+#pragma warning(disable:4250)
+#endif /* _MSC_VER */
+
+TAO_BEGIN_VERSIONED_NAMESPACE_DECL
+
+class TAO_IFRService_Export TAO_ExtValueDef_i : public virtual TAO_ValueDef_i
+{
+ // = TITLE
+ // TAO_ExtValueDef_i
+ //
+ // = DESCRIPTION
+ // Adds member and methods to TAO_ValueDef_i to get IDL3
+ // attribute exceptions.
+ //
+public:
+ TAO_ExtValueDef_i (TAO_Repository_i *repo);
+ // Constructor
+
+ virtual ~TAO_ExtValueDef_i (void);
+ // Destructor
+
+ virtual CORBA::ExtInitializerSeq *ext_initializers (
+ ACE_ENV_SINGLE_ARG_DECL_WITH_DEFAULTS
+ )
+ ACE_THROW_SPEC ((CORBA::SystemException));
+
+ CORBA::ExtInitializerSeq *ext_initializers_i (
+ ACE_ENV_SINGLE_ARG_DECL_WITH_DEFAULTS
+ )
+ ACE_THROW_SPEC ((CORBA::SystemException));
+
+ virtual void ext_initializers (
+ const CORBA::ExtInitializerSeq &ext_initializers
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS
+ )
+ ACE_THROW_SPEC ((CORBA::SystemException));
+
+ void ext_initializers_i (
+ const CORBA::ExtInitializerSeq &ext_initializers
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS
+ )
+ ACE_THROW_SPEC ((CORBA::SystemException));
+
+ virtual CORBA::ExtValueDef::ExtFullValueDescription *describe_ext_value (
+ ACE_ENV_SINGLE_ARG_DECL_WITH_DEFAULTS
+ )
+ ACE_THROW_SPEC ((CORBA::SystemException));
+
+ CORBA::ExtValueDef::ExtFullValueDescription *describe_ext_value_i (
+ ACE_ENV_SINGLE_ARG_DECL_WITH_DEFAULTS
+ )
+ ACE_THROW_SPEC ((CORBA::SystemException));
+
+ virtual CORBA::ExtAttributeDef_ptr create_ext_attribute (
+ const char *id,
+ const char *name,
+ const char *version,
+ CORBA::IDLType_ptr type,
+ CORBA::AttributeMode mode,
+ const CORBA::ExceptionDefSeq &get_exceptions,
+ const CORBA::ExceptionDefSeq &set_exceptions
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS
+ )
+ ACE_THROW_SPEC ((CORBA::SystemException));
+
+ CORBA::ExtAttributeDef_ptr create_ext_attribute_i (
+ const char *id,
+ const char *name,
+ const char *version,
+ CORBA::IDLType_ptr type,
+ CORBA::AttributeMode mode,
+ const CORBA::ExceptionDefSeq &get_exceptions,
+ const CORBA::ExceptionDefSeq &set_exceptions
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS
+ )
+ ACE_THROW_SPEC ((CORBA::SystemException));
+
+ void exceptions (ACE_Configuration_Section_Key &key,
+ const char *sub_section,
+ const CORBA::ExcDescriptionSeq &exceptions);
+ /// Public because it's also called from
+ /// TAO_Container_i::create_ext_value_i.
+
+private:
+ /// Common code for the set/get operations with attributes and initializers.
+
+ void fill_exceptions (CORBA::ExcDescriptionSeq &exceptions,
+ ACE_Configuration_Section_Key &key,
+ const char *sub_section
+ ACE_ENV_ARG_DECL);
+
+ void exceptions (ACE_Configuration_Section_Key &key,
+ const char *sub_section,
+ const CORBA::ExceptionDefSeq &exceptions);
+};
+
+TAO_END_VERSIONED_NAMESPACE_DECL
+
+#if defined(_MSC_VER)
+#pragma warning(pop)
+#endif /* _MSC_VER */
+
+#endif /* TAO_EXTVALUEDEF_I_H */
diff --git a/TAO/orbsvcs/orbsvcs/IFRService/FactoryDef_i.cpp b/TAO/orbsvcs/orbsvcs/IFRService/FactoryDef_i.cpp
new file mode 100644
index 00000000000..f1fd5ae8157
--- /dev/null
+++ b/TAO/orbsvcs/orbsvcs/IFRService/FactoryDef_i.cpp
@@ -0,0 +1,32 @@
+// $Id$
+
+#include "orbsvcs/IFRService/Repository_i.h"
+#include "orbsvcs/IFRService/FactoryDef_i.h"
+
+ACE_RCSID (IFRService,
+ FactoryDef_i,
+ "$Id$")
+
+TAO_BEGIN_VERSIONED_NAMESPACE_DECL
+
+TAO_FactoryDef_i::TAO_FactoryDef_i (
+ TAO_Repository_i *repo
+ )
+ : TAO_IRObject_i (repo),
+ TAO_Contained_i (repo),
+ TAO_OperationDef_i (repo)
+{
+}
+
+TAO_FactoryDef_i::~TAO_FactoryDef_i (void)
+{
+}
+
+CORBA::DefinitionKind
+TAO_FactoryDef_i::def_kind (ACE_ENV_SINGLE_ARG_DECL_NOT_USED)
+ ACE_THROW_SPEC ((CORBA::SystemException))
+{
+ return CORBA::dk_Factory;
+}
+
+TAO_END_VERSIONED_NAMESPACE_DECL
diff --git a/TAO/orbsvcs/orbsvcs/IFRService/FactoryDef_i.h b/TAO/orbsvcs/orbsvcs/IFRService/FactoryDef_i.h
new file mode 100644
index 00000000000..38a366914ec
--- /dev/null
+++ b/TAO/orbsvcs/orbsvcs/IFRService/FactoryDef_i.h
@@ -0,0 +1,66 @@
+// -*- C++ -*-
+
+// $Id$
+
+// ============================================================================
+//
+// = LIBRARY
+// TAO/orbsvcs/orbsvcs/IFRService
+//
+// = FILENAME
+// FactoryDef_i.h
+//
+// = DESCRIPTION
+// FactoryDef servant class.
+//
+// = AUTHOR
+// Jeff Parsons <parsons@cs.wustl.edu>
+//
+// ============================================================================
+
+#ifndef TAO_FACTORYDEF_I_H
+#define TAO_FACTORYDEF_I_H
+
+#include "orbsvcs/IFRService/OperationDef_i.h"
+#include "orbsvcs/IFRService/ifr_service_export.h"
+
+#if !defined (ACE_LACKS_PRAGMA_ONCE)
+# pragma once
+#endif /* ACE_LACKS_PRAGMA_ONCE */
+
+#if defined(_MSC_VER)
+#pragma warning(push)
+#pragma warning(disable:4250)
+#endif /* _MSC_VER */
+
+TAO_BEGIN_VERSIONED_NAMESPACE_DECL
+
+class TAO_IFRService_Export TAO_FactoryDef_i : public virtual TAO_OperationDef_i
+{
+ // = TITLE
+ // TAO_FactoryDef_i
+ //
+ // = DESCRIPTION
+ // Represents the definition of a factory operation in a home.
+ //
+public:
+ TAO_FactoryDef_i (TAO_Repository_i *repo);
+ // Constructor
+
+ virtual ~TAO_FactoryDef_i (void);
+ // Destructor
+
+ virtual CORBA::DefinitionKind def_kind (
+ ACE_ENV_SINGLE_ARG_DECL_WITH_DEFAULTS
+ )
+ ACE_THROW_SPEC ((CORBA::SystemException));
+ // Return our definition kind.
+};
+
+TAO_END_VERSIONED_NAMESPACE_DECL
+
+#if defined(_MSC_VER)
+#pragma warning(pop)
+#endif /* _MSC_VER */
+
+#endif /* TAO_FACTORYDEF_I_H */
diff --git a/TAO/orbsvcs/orbsvcs/IFRService/FinderDef_i.cpp b/TAO/orbsvcs/orbsvcs/IFRService/FinderDef_i.cpp
new file mode 100644
index 00000000000..6fffd784ad3
--- /dev/null
+++ b/TAO/orbsvcs/orbsvcs/IFRService/FinderDef_i.cpp
@@ -0,0 +1,31 @@
+// $Id$
+
+#include "orbsvcs/IFRService/Repository_i.h"
+#include "orbsvcs/IFRService/FinderDef_i.h"
+
+ACE_RCSID (IFRService,
+ FinderDef_i,
+ "$Id$")
+
+
+TAO_BEGIN_VERSIONED_NAMESPACE_DECL
+
+TAO_FinderDef_i::TAO_FinderDef_i (TAO_Repository_i *repo)
+ : TAO_IRObject_i (repo),
+ TAO_Contained_i (repo),
+ TAO_OperationDef_i (repo)
+{
+}
+
+TAO_FinderDef_i::~TAO_FinderDef_i (void)
+{
+}
+
+CORBA::DefinitionKind
+TAO_FinderDef_i::def_kind (ACE_ENV_SINGLE_ARG_DECL_NOT_USED)
+ ACE_THROW_SPEC ((CORBA::SystemException))
+{
+ return CORBA::dk_Finder;
+}
+
+TAO_END_VERSIONED_NAMESPACE_DECL
diff --git a/TAO/orbsvcs/orbsvcs/IFRService/FinderDef_i.h b/TAO/orbsvcs/orbsvcs/IFRService/FinderDef_i.h
new file mode 100644
index 00000000000..e8ad0a283d7
--- /dev/null
+++ b/TAO/orbsvcs/orbsvcs/IFRService/FinderDef_i.h
@@ -0,0 +1,67 @@
+// -*- C++ -*-
+
+// $Id$
+
+// ============================================================================
+//
+// = LIBRARY
+// TAO/orbsvcs/orbsvcs/IFRService
+//
+// = FILENAME
+// FinderDef_i.h
+//
+// = DESCRIPTION
+// FinderDef servant class.
+//
+// = AUTHOR
+// Jeff Parsons <parsons@cs.wustl.edu>
+//
+// ============================================================================
+
+#ifndef TAO_FINDERDEF_I_H
+#define TAO_FINDERDEF_I_H
+
+#include "orbsvcs/IFRService/OperationDef_i.h"
+#include "orbsvcs/IFRService/ifr_service_export.h"
+
+#if !defined (ACE_LACKS_PRAGMA_ONCE)
+# pragma once
+#endif /* ACE_LACKS_PRAGMA_ONCE */
+
+#if defined(_MSC_VER)
+#pragma warning(push)
+#pragma warning(disable:4250)
+#endif /* _MSC_VER */
+
+
+TAO_BEGIN_VERSIONED_NAMESPACE_DECL
+
+class TAO_IFRService_Export TAO_FinderDef_i : public virtual TAO_OperationDef_i
+{
+ // = TITLE
+ // TAO_FinderDef_i
+ //
+ // = DESCRIPTION
+ // Represents the definition of a finder operation in a home.
+ //
+public:
+ TAO_FinderDef_i (TAO_Repository_i *repo);
+ // Constructor
+
+ virtual ~TAO_FinderDef_i (void);
+ // Destructor
+
+ virtual CORBA::DefinitionKind def_kind (
+ ACE_ENV_SINGLE_ARG_DECL_WITH_DEFAULTS
+ )
+ ACE_THROW_SPEC ((CORBA::SystemException));
+ // Return our definition kind.
+};
+
+TAO_END_VERSIONED_NAMESPACE_DECL
+
+#if defined(_MSC_VER)
+#pragma warning(pop)
+#endif /* _MSC_VER */
+
+#endif /* TAO_FINDERDEF_I_H */
diff --git a/TAO/orbsvcs/orbsvcs/IFRService/FixedDef_i.cpp b/TAO/orbsvcs/orbsvcs/IFRService/FixedDef_i.cpp
new file mode 100644
index 00000000000..f8fdc472f04
--- /dev/null
+++ b/TAO/orbsvcs/orbsvcs/IFRService/FixedDef_i.cpp
@@ -0,0 +1,152 @@
+// $Id$
+
+#include "orbsvcs/IFRService/Repository_i.h"
+#include "orbsvcs/IFRService/FixedDef_i.h"
+
+ACE_RCSID (IFRService,
+ FixedDef_i,
+ "$Id$")
+
+TAO_BEGIN_VERSIONED_NAMESPACE_DECL
+
+TAO_FixedDef_i::TAO_FixedDef_i (TAO_Repository_i *repo)
+ : TAO_IRObject_i (repo),
+ TAO_IDLType_i (repo)
+{
+}
+
+TAO_FixedDef_i::~TAO_FixedDef_i (void)
+{
+}
+
+CORBA::DefinitionKind
+TAO_FixedDef_i::def_kind (ACE_ENV_SINGLE_ARG_DECL_NOT_USED)
+ ACE_THROW_SPEC ((CORBA::SystemException))
+{
+ return CORBA::dk_Fixed;
+}
+
+void
+TAO_FixedDef_i::destroy (ACE_ENV_SINGLE_ARG_DECL)
+ ACE_THROW_SPEC ((CORBA::SystemException))
+{
+ TAO_IFR_WRITE_GUARD;
+
+ this->update_key (ACE_ENV_SINGLE_ARG_PARAMETER);
+ ACE_CHECK;
+
+ this->destroy_i (ACE_ENV_SINGLE_ARG_PARAMETER);
+}
+
+void
+TAO_FixedDef_i::destroy_i (ACE_ENV_SINGLE_ARG_DECL_NOT_USED)
+ ACE_THROW_SPEC ((CORBA::SystemException))
+{
+ // TODO
+}
+
+CORBA::TypeCode_ptr
+TAO_FixedDef_i::type (ACE_ENV_SINGLE_ARG_DECL)
+ ACE_THROW_SPEC ((CORBA::SystemException))
+{
+ TAO_IFR_READ_GUARD_RETURN (CORBA::TypeCode::_nil ());
+
+ this->update_key (ACE_ENV_SINGLE_ARG_PARAMETER);
+ ACE_CHECK_RETURN (CORBA::TypeCode::_nil ());
+
+ return this->type_i (ACE_ENV_SINGLE_ARG_PARAMETER);
+}
+
+CORBA::TypeCode_ptr
+TAO_FixedDef_i::type_i (ACE_ENV_SINGLE_ARG_DECL_NOT_USED)
+ ACE_THROW_SPEC ((CORBA::SystemException))
+{
+ // TODO
+ return CORBA::TypeCode::_nil ();
+}
+
+CORBA::UShort
+TAO_FixedDef_i::digits (ACE_ENV_SINGLE_ARG_DECL)
+ ACE_THROW_SPEC ((CORBA::SystemException))
+{
+ TAO_IFR_READ_GUARD_RETURN (0);
+
+ this->update_key (ACE_ENV_SINGLE_ARG_PARAMETER);
+ ACE_CHECK_RETURN (0);
+
+ return this->digits_i (ACE_ENV_SINGLE_ARG_PARAMETER);
+}
+
+CORBA::UShort
+TAO_FixedDef_i::digits_i (ACE_ENV_SINGLE_ARG_DECL_NOT_USED /* ACE_ENV_SINGLE_ARG_PARAMETER */)
+ ACE_THROW_SPEC ((CORBA::SystemException))
+{
+ // TODO
+ return 0;
+}
+
+void
+TAO_FixedDef_i::digits (CORBA::UShort digits
+ ACE_ENV_ARG_DECL)
+ ACE_THROW_SPEC ((CORBA::SystemException))
+{
+ TAO_IFR_WRITE_GUARD;
+
+ this->update_key (ACE_ENV_SINGLE_ARG_PARAMETER);
+ ACE_CHECK;
+
+ this->digits_i (digits
+ ACE_ENV_ARG_PARAMETER);
+}
+
+void
+TAO_FixedDef_i::digits_i (CORBA::UShort /* digits */
+ ACE_ENV_ARG_DECL_NOT_USED)
+ ACE_THROW_SPEC ((CORBA::SystemException))
+{
+ // TODO
+}
+
+CORBA::Short
+TAO_FixedDef_i::scale (ACE_ENV_SINGLE_ARG_DECL)
+ ACE_THROW_SPEC ((CORBA::SystemException))
+{
+ TAO_IFR_READ_GUARD_RETURN (0);
+
+ this->update_key (ACE_ENV_SINGLE_ARG_PARAMETER);
+ ACE_CHECK_RETURN (0);
+
+ return this->scale_i (ACE_ENV_SINGLE_ARG_PARAMETER);
+}
+
+CORBA::Short
+TAO_FixedDef_i::scale_i (ACE_ENV_SINGLE_ARG_DECL_NOT_USED)
+ ACE_THROW_SPEC ((CORBA::SystemException))
+{
+ // TODO
+ return 0;
+}
+
+void
+TAO_FixedDef_i::scale (CORBA::Short scale
+ ACE_ENV_ARG_DECL)
+ ACE_THROW_SPEC ((CORBA::SystemException))
+{
+ TAO_IFR_WRITE_GUARD;
+
+ this->update_key (ACE_ENV_SINGLE_ARG_PARAMETER);
+ ACE_CHECK;
+
+ this->scale_i (scale
+ ACE_ENV_ARG_PARAMETER);
+}
+
+void
+TAO_FixedDef_i::scale_i (CORBA::Short /* scale */
+ ACE_ENV_ARG_DECL_NOT_USED)
+ ACE_THROW_SPEC ((CORBA::SystemException))
+{
+ // TODO
+}
+
+TAO_END_VERSIONED_NAMESPACE_DECL
diff --git a/TAO/orbsvcs/orbsvcs/IFRService/FixedDef_i.h b/TAO/orbsvcs/orbsvcs/IFRService/FixedDef_i.h
new file mode 100644
index 00000000000..326bc90185b
--- /dev/null
+++ b/TAO/orbsvcs/orbsvcs/IFRService/FixedDef_i.h
@@ -0,0 +1,133 @@
+// -*- C++ -*-
+
+// $Id$
+
+// ============================================================================
+//
+// = LIBRARY
+// TAO/orbsvcs/orbsvcs/IFRService
+//
+// = FILENAME
+// FixedDef_i.h
+//
+// = DESCRIPTION
+// FixedDef servant class.
+//
+// = AUTHOR
+// Jeff Parsons <parsons@cs.wustl.edu>
+//
+// ============================================================================
+
+#ifndef TAO_FIXEDDEF_I_H
+#define TAO_FIXEDDEF_I_H
+
+#include "orbsvcs/IFRService/IDLType_i.h"
+#include "orbsvcs/IFRService/ifr_service_export.h"
+
+#if !defined (ACE_LACKS_PRAGMA_ONCE)
+# pragma once
+#endif /* ACE_LACKS_PRAGMA_ONCE */
+
+#if defined(_MSC_VER)
+#pragma warning(push)
+#pragma warning(disable:4250)
+#endif /* _MSC_VER */
+
+TAO_BEGIN_VERSIONED_NAMESPACE_DECL
+
+class TAO_IFRService_Export TAO_FixedDef_i : public virtual TAO_IDLType_i
+{
+ // = TITLE
+ // TAO_FixedDef_i
+ //
+ // = DESCRIPTION
+ // Represents an IDL fixed type.
+ //
+public:
+ TAO_FixedDef_i (TAO_Repository_i *repo);
+ // Constructor
+
+ virtual ~TAO_FixedDef_i (void);
+ // Destructor
+
+ virtual CORBA::DefinitionKind def_kind (
+ ACE_ENV_SINGLE_ARG_DECL_WITH_DEFAULTS
+ )
+ ACE_THROW_SPEC ((CORBA::SystemException));
+ // Return our definition kind.
+
+ virtual void destroy (
+ ACE_ENV_SINGLE_ARG_DECL_WITH_DEFAULTS
+ )
+ ACE_THROW_SPEC ((CORBA::SystemException));
+ // Remove the repository entry.
+
+ virtual void destroy_i (
+ ACE_ENV_SINGLE_ARG_DECL_WITH_DEFAULTS
+ )
+ ACE_THROW_SPEC ((CORBA::SystemException));
+
+ virtual CORBA::TypeCode_ptr type (
+ ACE_ENV_SINGLE_ARG_DECL_WITH_DEFAULTS
+ )
+ ACE_THROW_SPEC ((CORBA::SystemException));
+ // From IDLType_i's pure virtual function.
+
+ virtual CORBA::TypeCode_ptr type_i (
+ ACE_ENV_SINGLE_ARG_DECL_WITH_DEFAULTS
+ )
+ ACE_THROW_SPEC ((CORBA::SystemException));
+ // From IDLType_i's pure virtual function.
+
+ virtual CORBA::UShort digits (
+ ACE_ENV_SINGLE_ARG_DECL_WITH_DEFAULTS
+ )
+ ACE_THROW_SPEC ((CORBA::SystemException));
+
+ CORBA::UShort digits_i (
+ ACE_ENV_SINGLE_ARG_DECL_WITH_DEFAULTS
+ )
+ ACE_THROW_SPEC ((CORBA::SystemException));
+
+ virtual void digits (
+ CORBA::UShort digits
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS
+ )
+ ACE_THROW_SPEC ((CORBA::SystemException));
+
+ void digits_i (
+ CORBA::UShort digits
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS
+ )
+ ACE_THROW_SPEC ((CORBA::SystemException));
+
+ virtual CORBA::Short scale (
+ ACE_ENV_SINGLE_ARG_DECL_WITH_DEFAULTS
+ )
+ ACE_THROW_SPEC ((CORBA::SystemException));
+
+ CORBA::Short scale_i (
+ ACE_ENV_SINGLE_ARG_DECL_WITH_DEFAULTS
+ )
+ ACE_THROW_SPEC ((CORBA::SystemException));
+
+ virtual void scale (
+ CORBA::Short scale
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS
+ )
+ ACE_THROW_SPEC ((CORBA::SystemException));
+
+ void scale_i (
+ CORBA::Short scale
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS
+ )
+ ACE_THROW_SPEC ((CORBA::SystemException));
+};
+
+TAO_END_VERSIONED_NAMESPACE_DECL
+
+#if defined(_MSC_VER)
+#pragma warning(pop)
+#endif /* _MSC_VER */
+
+#endif /* TAO_FIXEDDEF_I_H */
diff --git a/TAO/orbsvcs/orbsvcs/IFRService/HomeDef_i.cpp b/TAO/orbsvcs/orbsvcs/IFRService/HomeDef_i.cpp
new file mode 100644
index 00000000000..4e8a1741f56
--- /dev/null
+++ b/TAO/orbsvcs/orbsvcs/IFRService/HomeDef_i.cpp
@@ -0,0 +1,1058 @@
+// $Id$
+
+#include "orbsvcs/IFRService/Repository_i.h"
+#include "orbsvcs/IFRService/HomeDef_i.h"
+#include "orbsvcs/IFRService/FactoryDef_i.h"
+#include "orbsvcs/IFRService/FinderDef_i.h"
+#include "orbsvcs/IFRService/ValueDef_i.h"
+#include "orbsvcs/IFRService/ExceptionDef_i.h"
+#include "orbsvcs/IFRService/AttributeDef_i.h"
+#include "orbsvcs/IFRService/IFR_Service_Utils_T.h"
+#include "orbsvcs/IFRService/IFR_Service_Utils.h"
+
+#include "ace/SString.h"
+
+
+ACE_RCSID (IFRService,
+ HomeDef_i,
+ "$Id$")
+
+
+TAO_BEGIN_VERSIONED_NAMESPACE_DECL
+
+TAO_HomeDef_i::TAO_HomeDef_i (TAO_Repository_i *repo)
+ : TAO_IRObject_i (repo),
+ TAO_Container_i (repo),
+ TAO_Contained_i (repo),
+ TAO_IDLType_i (repo),
+ TAO_InterfaceDef_i (repo),
+ TAO_InterfaceAttrExtension_i (repo),
+ TAO_ExtInterfaceDef_i (repo)
+{
+}
+
+TAO_HomeDef_i::~TAO_HomeDef_i (void)
+{
+}
+
+CORBA::DefinitionKind
+TAO_HomeDef_i::def_kind (ACE_ENV_SINGLE_ARG_DECL_NOT_USED)
+ ACE_THROW_SPEC ((CORBA::SystemException))
+{
+ return CORBA::dk_Home;
+}
+
+void
+TAO_HomeDef_i::destroy (ACE_ENV_SINGLE_ARG_DECL)
+ ACE_THROW_SPEC ((CORBA::SystemException))
+{
+ TAO_IFR_WRITE_GUARD;
+
+ this->update_key (ACE_ENV_SINGLE_ARG_PARAMETER);
+ ACE_CHECK;
+
+ this->destroy_i (ACE_ENV_SINGLE_ARG_PARAMETER);
+}
+
+void
+TAO_HomeDef_i::destroy_i (ACE_ENV_SINGLE_ARG_DECL)
+ ACE_THROW_SPEC ((CORBA::SystemException))
+{
+ // Destroy our special subsections first, then call destroy_i
+ // on our base class.
+
+ TAO_IFR_Generic_Utils<TAO_FactoryDef_i>::destroy_special (
+ "factories",
+ this->repo_,
+ this->section_key_
+ ACE_ENV_ARG_PARAMETER
+ );
+ ACE_CHECK;
+
+ TAO_IFR_Generic_Utils<TAO_FinderDef_i>::destroy_special (
+ "finders",
+ this->repo_,
+ this->section_key_
+ ACE_ENV_ARG_PARAMETER
+ );
+ ACE_CHECK;
+
+ this->TAO_ExtInterfaceDef_i::destroy_i (ACE_ENV_SINGLE_ARG_PARAMETER);
+}
+
+CORBA::Contained::Description *
+TAO_HomeDef_i::describe (ACE_ENV_SINGLE_ARG_DECL)
+ ACE_THROW_SPEC ((CORBA::SystemException))
+{
+ TAO_IFR_READ_GUARD_RETURN (0);
+
+ this->update_key (ACE_ENV_SINGLE_ARG_PARAMETER);
+ ACE_CHECK_RETURN (0);
+
+ return this->describe_i (ACE_ENV_SINGLE_ARG_PARAMETER);
+}
+
+CORBA::Contained::Description *
+TAO_HomeDef_i::describe_i (ACE_ENV_SINGLE_ARG_DECL)
+ ACE_THROW_SPEC ((CORBA::SystemException))
+{
+ CORBA::ComponentIR::HomeDescription home_desc;
+
+ TAO_IFR_Desc_Utils<CORBA::ComponentIR::HomeDescription,
+ TAO_HomeDef_i>::fill_desc_begin (home_desc,
+ this->repo_,
+ this->section_key_
+ ACE_ENV_ARG_PARAMETER);
+ ACE_CHECK_RETURN (0);
+
+ ACE_TString holder;
+ int status =
+ this->repo_->config ()->get_string_value (this->section_key_,
+ "base_home",
+ holder);
+
+ ACE_Configuration_Section_Key tmp_key;
+
+ if (status == 0)
+ {
+ this->repo_->config ()->expand_path (this->repo_->root_key (),
+ holder,
+ tmp_key,
+ 0);
+ this->repo_->config ()->get_string_value (tmp_key,
+ "id",
+ holder);
+ home_desc.base_home = holder.fast_rep ();
+ }
+
+ // No need to check the status - this one is required.
+ this->repo_->config ()->get_string_value (this->section_key_,
+ "managed",
+ holder);
+ home_desc.managed_component = holder.fast_rep ();
+ status =
+ this->repo_->config ()->get_string_value (this->section_key_,
+ "primary_key",
+ holder);
+
+ if (status == 0)
+ {
+ this->repo_->config ()->expand_path (this->repo_->root_key (),
+ holder,
+ tmp_key,
+ 0);
+ TAO_ValueDef_i impl (this->repo_);
+ impl.section_key (tmp_key);
+ impl.fill_value_description (home_desc.primary_key
+ ACE_ENV_ARG_PARAMETER);
+ ACE_CHECK_RETURN (0);
+ }
+
+ this->fill_op_desc_seq (this->section_key_,
+ home_desc.factories,
+ "factories"
+ ACE_ENV_ARG_PARAMETER);
+ ACE_CHECK_RETURN (0);
+
+ this->fill_op_desc_seq (this->section_key_,
+ home_desc.finders,
+ "finders"
+ ACE_ENV_ARG_PARAMETER);
+ ACE_CHECK_RETURN (0);
+
+ this->fill_op_desc_seq (this->section_key_,
+ home_desc.operations,
+ "ops"
+ ACE_ENV_ARG_PARAMETER);
+ ACE_CHECK_RETURN (0);
+
+ home_desc.type = this->type_i (ACE_ENV_SINGLE_ARG_PARAMETER);
+ ACE_CHECK_RETURN (0);
+
+ CORBA::Contained::Description *retval = 0;
+ ACE_NEW_RETURN (retval,
+ CORBA::Contained::Description,
+ 0);
+
+ retval->kind = CORBA::dk_Home;
+ retval->value <<= home_desc;
+ return retval;
+}
+
+CORBA::TypeCode_ptr
+TAO_HomeDef_i::type (ACE_ENV_SINGLE_ARG_DECL)
+ ACE_THROW_SPEC ((CORBA::SystemException))
+{
+ TAO_IFR_READ_GUARD_RETURN (CORBA::TypeCode::_nil ());
+
+ this->update_key (ACE_ENV_SINGLE_ARG_PARAMETER);
+ ACE_CHECK_RETURN (CORBA::TypeCode::_nil ());
+
+ return this->type_i (ACE_ENV_SINGLE_ARG_PARAMETER);
+}
+
+CORBA::TypeCode_ptr
+TAO_HomeDef_i::type_i (ACE_ENV_SINGLE_ARG_DECL)
+ ACE_THROW_SPEC ((CORBA::SystemException))
+{
+ ACE_TString id;
+ this->repo_->config ()->get_string_value (this->section_key_,
+ "id",
+ id);
+
+ ACE_TString name;
+ this->repo_->config ()->get_string_value (this->section_key_,
+ "name",
+ name);
+
+ return this->repo_->tc_factory ()->create_home_tc (id.fast_rep (),
+ name.fast_rep ()
+ ACE_ENV_ARG_PARAMETER);
+}
+
+CORBA::ComponentIR::HomeDef_ptr
+TAO_HomeDef_i::base_home (ACE_ENV_SINGLE_ARG_DECL)
+ ACE_THROW_SPEC ((CORBA::SystemException))
+{
+ TAO_IFR_READ_GUARD_RETURN (CORBA::ComponentIR::HomeDef::_nil ());
+
+ this->update_key (ACE_ENV_SINGLE_ARG_PARAMETER);
+ ACE_CHECK_RETURN (CORBA::ComponentIR::HomeDef::_nil ());
+
+ return this->base_home_i (ACE_ENV_SINGLE_ARG_PARAMETER);
+}
+
+CORBA::ComponentIR::HomeDef_ptr
+TAO_HomeDef_i::base_home_i (ACE_ENV_SINGLE_ARG_DECL)
+ ACE_THROW_SPEC ((CORBA::SystemException))
+{
+ ACE_TString path;
+ int status =
+ this->repo_->config ()->get_string_value (this->section_key_,
+ "base_home",
+ path);
+
+ if (status != 0)
+ {
+ return CORBA::ComponentIR::HomeDef::_nil ();
+ }
+
+ CORBA::Object_var obj =
+ TAO_IFR_Service_Utils::path_to_ir_object (path,
+ this->repo_
+ ACE_ENV_ARG_PARAMETER);
+ ACE_CHECK_RETURN (CORBA::ComponentIR::HomeDef::_nil ());
+
+ return CORBA::ComponentIR::HomeDef::_narrow (obj.in ()
+ ACE_ENV_ARG_PARAMETER);
+}
+
+void
+TAO_HomeDef_i::base_home (
+ CORBA::ComponentIR::HomeDef_ptr base_home
+ ACE_ENV_ARG_DECL
+ )
+ ACE_THROW_SPEC ((CORBA::SystemException))
+{
+ TAO_IFR_WRITE_GUARD;
+
+ this->update_key (ACE_ENV_SINGLE_ARG_PARAMETER);
+ ACE_CHECK;
+
+ this->base_home_i (base_home
+ ACE_ENV_ARG_PARAMETER);
+}
+
+void
+TAO_HomeDef_i::base_home_i (
+ CORBA::ComponentIR::HomeDef_ptr base_home
+ ACE_ENV_ARG_DECL_NOT_USED
+ )
+ ACE_THROW_SPEC ((CORBA::SystemException))
+{
+ char *path = TAO_IFR_Service_Utils::reference_to_path (base_home);
+ this->repo_->config ()->set_string_value (this->section_key_,
+ "base_home",
+ path);
+}
+
+CORBA::InterfaceDefSeq *
+TAO_HomeDef_i::supported_interfaces (
+ ACE_ENV_SINGLE_ARG_DECL
+ )
+ ACE_THROW_SPEC ((CORBA::SystemException))
+{
+ TAO_IFR_READ_GUARD_RETURN (0);
+
+ this->update_key (ACE_ENV_SINGLE_ARG_PARAMETER);
+ ACE_CHECK_RETURN (0);
+
+ return this->supported_interfaces_i (ACE_ENV_SINGLE_ARG_PARAMETER);
+}
+
+CORBA::InterfaceDefSeq *
+TAO_HomeDef_i::supported_interfaces_i (
+ ACE_ENV_SINGLE_ARG_DECL
+ )
+ ACE_THROW_SPEC ((CORBA::SystemException))
+{
+ CORBA::InterfaceDefSeq *retval = 0;
+ ACE_NEW_RETURN (retval,
+ CORBA::InterfaceDefSeq,
+ 0);
+ CORBA::InterfaceDefSeq_var safe_retval = retval;
+ retval->length (0);
+ ACE_Configuration_Section_Key supported_key;
+ int status =
+ this->repo_->config ()->open_section (this->section_key_,
+ "supported",
+ 0,
+ supported_key);
+
+ if (status != 0)
+ {
+ return retval;
+ }
+
+ CORBA::ULong count = 0;
+ this->repo_->config ()->get_integer_value (supported_key,
+ "count",
+ count);
+ retval->length (count);
+ char *stringified = 0;
+ ACE_TString holder;
+ CORBA::Object_var obj;
+
+ for (CORBA::ULong i = 0; i < count; ++i)
+ {
+ stringified = TAO_IFR_Service_Utils::int_to_string (i);
+ this->repo_->config ()->get_string_value (supported_key,
+ stringified,
+ holder);
+ obj = TAO_IFR_Service_Utils::path_to_ir_object (holder,
+ this->repo_
+ ACE_ENV_ARG_PARAMETER);
+ ACE_CHECK_RETURN (0);
+
+ safe_retval[i] = CORBA::InterfaceDef::_narrow (obj.in ()
+ ACE_ENV_ARG_PARAMETER);
+ ACE_CHECK_RETURN (0);
+ }
+
+ return safe_retval._retn ();
+}
+
+void
+TAO_HomeDef_i::supported_interfaces (
+ const CORBA::InterfaceDefSeq &supported_interfaces
+ ACE_ENV_ARG_DECL
+ )
+ ACE_THROW_SPEC ((CORBA::SystemException))
+{
+ TAO_IFR_WRITE_GUARD;
+
+ this->update_key (ACE_ENV_SINGLE_ARG_PARAMETER);
+ ACE_CHECK;
+
+ this->supported_interfaces_i (supported_interfaces
+ ACE_ENV_ARG_PARAMETER);
+}
+
+void
+TAO_HomeDef_i::supported_interfaces_i (
+ const CORBA::InterfaceDefSeq &supported_interfaces
+ ACE_ENV_ARG_DECL_NOT_USED
+ )
+ ACE_THROW_SPEC ((CORBA::SystemException))
+{
+ this->repo_->config ()->remove_section (this->section_key_,
+ "supported",
+ 1);
+ CORBA::ULong length = supported_interfaces.length ();
+
+ if (length == 0)
+ {
+ return;
+ }
+
+ ACE_Configuration_Section_Key supported_key;
+ this->repo_->config ()->open_section (this->section_key_,
+ "supported",
+ 1,
+ supported_key);
+ char *stringified = 0;
+ char *path = 0;
+
+ for (CORBA::ULong i = 0; i < length; ++i)
+ {
+ stringified = TAO_IFR_Service_Utils::int_to_string (i);
+ path =
+ TAO_IFR_Service_Utils::reference_to_path (
+ supported_interfaces[i]
+ );
+ this->repo_->config ()->set_string_value (supported_key,
+ stringified,
+ path);
+ }
+}
+
+CORBA::ComponentIR::ComponentDef_ptr
+TAO_HomeDef_i::managed_component (ACE_ENV_SINGLE_ARG_DECL)
+ ACE_THROW_SPEC ((CORBA::SystemException))
+{
+ TAO_IFR_READ_GUARD_RETURN (CORBA::ComponentIR::ComponentDef::_nil ());
+
+ this->update_key (ACE_ENV_SINGLE_ARG_PARAMETER);
+ ACE_CHECK_RETURN (CORBA::ComponentIR::ComponentDef::_nil ());
+
+ return this->managed_component_i (ACE_ENV_SINGLE_ARG_PARAMETER);
+}
+
+CORBA::ComponentIR::ComponentDef_ptr
+TAO_HomeDef_i::managed_component_i (ACE_ENV_SINGLE_ARG_DECL)
+ ACE_THROW_SPEC ((CORBA::SystemException))
+{
+ ACE_TString path;
+ this->repo_->config ()->get_string_value (this->section_key_,
+ "managed",
+ path);
+ CORBA::Object_var obj =
+ TAO_IFR_Service_Utils::path_to_ir_object (path,
+ this->repo_
+ ACE_ENV_ARG_PARAMETER);
+ ACE_CHECK_RETURN (CORBA::ComponentIR::ComponentDef::_nil ());
+
+ return CORBA::ComponentIR::ComponentDef::_narrow (obj.in ()
+ ACE_ENV_ARG_PARAMETER);
+}
+
+void
+TAO_HomeDef_i::managed_component (
+ CORBA::ComponentIR::ComponentDef_ptr managed_component
+ ACE_ENV_ARG_DECL
+ )
+ ACE_THROW_SPEC ((CORBA::SystemException))
+{
+ TAO_IFR_WRITE_GUARD;
+
+ this->update_key (ACE_ENV_SINGLE_ARG_PARAMETER);
+ ACE_CHECK;
+
+ this->managed_component_i (managed_component
+ ACE_ENV_ARG_PARAMETER);
+}
+
+void
+TAO_HomeDef_i::managed_component_i (
+ CORBA::ComponentIR::ComponentDef_ptr managed_component
+ ACE_ENV_ARG_DECL_NOT_USED
+ )
+ ACE_THROW_SPEC ((CORBA::SystemException))
+{
+ char *path = TAO_IFR_Service_Utils::reference_to_path (managed_component);
+ this->repo_->config ()->set_string_value (this->section_key_,
+ "managed",
+ path);
+}
+
+CORBA::ValueDef_ptr
+TAO_HomeDef_i::primary_key (ACE_ENV_SINGLE_ARG_DECL)
+ ACE_THROW_SPEC ((CORBA::SystemException))
+{
+ TAO_IFR_READ_GUARD_RETURN (CORBA::ValueDef::_nil ());
+
+ this->update_key (ACE_ENV_SINGLE_ARG_PARAMETER);
+ ACE_CHECK_RETURN (CORBA::ValueDef::_nil ());
+
+ return this->primary_key_i (ACE_ENV_SINGLE_ARG_PARAMETER);
+}
+
+CORBA::ValueDef_ptr
+TAO_HomeDef_i::primary_key_i (ACE_ENV_SINGLE_ARG_DECL)
+ ACE_THROW_SPEC ((CORBA::SystemException))
+{
+ ACE_TString path;
+ int status =
+ this->repo_->config ()->get_string_value (this->section_key_,
+ "primary_key",
+ path);
+
+ if (status != 0)
+ {
+ return CORBA::ValueDef::_nil ();
+ }
+
+ CORBA::Object_var obj =
+ TAO_IFR_Service_Utils::path_to_ir_object (path,
+ this->repo_
+ ACE_ENV_ARG_PARAMETER);
+ ACE_CHECK_RETURN (CORBA::ValueDef::_nil ());
+
+ return CORBA::ValueDef::_narrow (obj.in ()
+ ACE_ENV_ARG_PARAMETER);
+}
+
+void
+TAO_HomeDef_i::primary_key (
+ CORBA::ValueDef_ptr primary_key
+ ACE_ENV_ARG_DECL
+ )
+ ACE_THROW_SPEC ((CORBA::SystemException))
+{
+ TAO_IFR_WRITE_GUARD;
+
+ this->update_key (ACE_ENV_SINGLE_ARG_PARAMETER);
+ ACE_CHECK;
+
+ this->primary_key_i (primary_key
+ ACE_ENV_ARG_PARAMETER);
+}
+
+void
+TAO_HomeDef_i::primary_key_i (
+ CORBA::ValueDef_ptr primary_key
+ ACE_ENV_ARG_DECL_NOT_USED
+ )
+ ACE_THROW_SPEC ((CORBA::SystemException))
+{
+ if (CORBA::is_nil (primary_key))
+ {
+ this->repo_->config ()->remove_value (this->section_key_,
+ "primary_key");
+ return;
+ }
+
+ char *path = TAO_IFR_Service_Utils::reference_to_path (primary_key);
+ this->repo_->config ()->set_string_value (this->section_key_,
+ "primary_key",
+ path);
+}
+
+CORBA::ComponentIR::FactoryDef_ptr
+TAO_HomeDef_i::create_factory (const char *id,
+ const char *name,
+ const char *version,
+ const CORBA::ParDescriptionSeq &params,
+ const CORBA::ExceptionDefSeq &exceptions
+ ACE_ENV_ARG_DECL)
+ ACE_THROW_SPEC ((CORBA::SystemException))
+{
+ TAO_IFR_WRITE_GUARD_RETURN (CORBA::ComponentIR::FactoryDef::_nil ());
+
+ this->update_key (ACE_ENV_SINGLE_ARG_PARAMETER);
+ ACE_CHECK_RETURN (CORBA::ComponentIR::FactoryDef::_nil ());
+
+ return this->create_factory_i (id,
+ name,
+ version,
+ params,
+ exceptions
+ ACE_ENV_ARG_PARAMETER);
+}
+
+CORBA::ComponentIR::FactoryDef_ptr
+TAO_HomeDef_i::create_factory_i (
+ const char *id,
+ const char *name,
+ const char *version,
+ const CORBA::ParDescriptionSeq &params,
+ const CORBA::ExceptionDefSeq &exceptions
+ ACE_ENV_ARG_DECL
+ )
+ ACE_THROW_SPEC ((CORBA::SystemException))
+{
+ CORBA::Object_var obj = this->create_common (CORBA::dk_Factory,
+ id,
+ name,
+ version,
+ "factories",
+ params,
+ exceptions
+ ACE_ENV_ARG_PARAMETER);
+ ACE_CHECK_RETURN (CORBA::ComponentIR::FactoryDef::_nil ());
+
+ return CORBA::ComponentIR::FactoryDef::_narrow (obj.in ()
+ ACE_ENV_ARG_PARAMETER);
+}
+
+CORBA::ComponentIR::FinderDef_ptr
+TAO_HomeDef_i::create_finder (const char *id,
+ const char *name,
+ const char *version,
+ const CORBA::ParDescriptionSeq &params,
+ const CORBA::ExceptionDefSeq &exceptions
+ ACE_ENV_ARG_DECL)
+ ACE_THROW_SPEC ((CORBA::SystemException))
+{
+ TAO_IFR_WRITE_GUARD_RETURN (CORBA::ComponentIR::FinderDef::_nil ());
+
+ this->update_key (ACE_ENV_SINGLE_ARG_PARAMETER);
+ ACE_CHECK_RETURN (CORBA::ComponentIR::FinderDef::_nil ());
+
+ return this->create_finder_i (id,
+ name,
+ version,
+ params,
+ exceptions
+ ACE_ENV_ARG_PARAMETER);
+}
+
+CORBA::ComponentIR::FinderDef_ptr
+TAO_HomeDef_i::create_finder_i (
+ const char *id,
+ const char *name,
+ const char *version,
+ const CORBA::ParDescriptionSeq &params,
+ const CORBA::ExceptionDefSeq &exceptions
+ ACE_ENV_ARG_DECL
+ )
+ ACE_THROW_SPEC ((CORBA::SystemException))
+{
+ CORBA::Object_var obj = this->create_common (CORBA::dk_Finder,
+ id,
+ name,
+ version,
+ "finders",
+ params,
+ exceptions
+ ACE_ENV_ARG_PARAMETER);
+ ACE_CHECK_RETURN (CORBA::ComponentIR::FinderDef::_nil ());
+
+ return CORBA::ComponentIR::FinderDef::_narrow (obj.in ()
+ ACE_ENV_ARG_PARAMETER);
+}
+
+CORBA::Object_ptr
+TAO_HomeDef_i::create_common (CORBA::DefinitionKind created_kind,
+ const char *id,
+ const char *name,
+ const char *version,
+ const char *sub_section,
+ const CORBA::ParDescriptionSeq &params,
+ const CORBA::ExceptionDefSeq &exceptions
+ ACE_ENV_ARG_DECL)
+{
+ TAO_Container_i::tmp_name_holder_ = name;
+ ACE_Configuration_Section_Key new_key;
+
+ // Common to all IR objects created in CORBA::Container.
+ ACE_TString result_path =
+ TAO_IFR_Service_Utils::create_common (CORBA::dk_Home,
+ created_kind,
+ this->section_key_,
+ new_key,
+ this->repo_,
+ id,
+ name,
+ &TAO_Container_i::same_as_tmp_name,
+ version,
+ sub_section
+ ACE_ENV_ARG_PARAMETER);
+ ACE_CHECK_RETURN (CORBA::Object::_nil ());
+
+ // Set the 'result' field with the path of our managed component.
+ ACE_TString managed_path;
+ this->repo_->config ()->get_string_value (this->section_key_,
+ "managed",
+ managed_path);
+ this->repo_->config ()->set_string_value (new_key,
+ "result",
+ managed_path);
+
+ // Always OP_NORMAL for factories.
+ this->repo_->config ()->set_integer_value (new_key,
+ "mode",
+ CORBA::OP_NORMAL);
+
+ CORBA::ULong i = 0;
+
+ // Store the operation's parameter info.
+ CORBA::ULong length = params.length ();
+
+ if (length > 0)
+ {
+ ACE_Configuration_Section_Key params_key;
+ this->repo_->config ()->open_section (new_key,
+ "params",
+ 1,
+ params_key);
+
+ this->repo_->config ()->set_integer_value (params_key,
+ "count",
+ length);
+ char *type_path = 0;
+ char *stringified = 0;
+ ACE_Configuration_Section_Key param_key;
+
+ for (i = 0; i < length; ++i)
+ {
+ stringified = TAO_IFR_Service_Utils::int_to_string (i);
+ this->repo_->config ()->open_section (params_key,
+ stringified,
+ 1,
+ param_key);
+
+ this->repo_->config ()->set_string_value (param_key,
+ "name",
+ params[i].name.in ());
+ type_path =
+ TAO_IFR_Service_Utils::reference_to_path (
+ params[i].type_def.in ()
+ );
+
+ this->repo_->config ()->set_string_value (param_key,
+ "type_path",
+ type_path);
+
+ if (params[i].mode != CORBA::PARAM_IN)
+ {
+ // @@@ (JP) No OMG-defined exception for this, but maybe there
+ // will be.
+ }
+
+ this->repo_->config ()->set_integer_value (param_key,
+ "mode",
+ CORBA::PARAM_IN);
+ }
+ }
+
+ // Store the operation's exception info.
+ length = exceptions.length ();
+
+ if (length > 0)
+ {
+ ACE_Configuration_Section_Key excepts_key;
+ this->repo_->config ()->open_section (new_key,
+ "excepts",
+ 1,
+ excepts_key);
+
+ this->repo_->config ()->set_integer_value (excepts_key,
+ "count",
+ length);
+ char *type_path = 0;
+
+ for (i = 0; i < length; ++i)
+ {
+ type_path =
+ TAO_IFR_Service_Utils::reference_to_path (exceptions[i]);
+
+ char *stringified = TAO_IFR_Service_Utils::int_to_string (i);
+ this->repo_->config ()->set_string_value (excepts_key,
+ stringified,
+ type_path);
+ }
+ }
+
+ // Create the object reference.
+ return
+ TAO_IFR_Service_Utils::create_objref (created_kind,
+ result_path.c_str (),
+ this->repo_
+ ACE_ENV_ARG_PARAMETER);
+}
+
+void
+TAO_HomeDef_i::fill_op_desc_seq (ACE_Configuration_Section_Key &key,
+ CORBA::OpDescriptionSeq &ods,
+ const char *sub_section
+ ACE_ENV_ARG_DECL)
+{
+ ods.length (0);
+ ACE_Configuration_Section_Key sub_key;
+ int status =
+ this->repo_->config ()->open_section (key,
+ sub_section,
+ 0,
+ sub_key);
+
+ if (status != 0)
+ {
+ return;
+ }
+
+ CORBA::ULong count = 0;
+ this->repo_->config ()->get_integer_value (sub_key,
+ "count",
+ count);
+ ods.length (count);
+ char *stringified = 0;
+
+ for (CORBA::ULong i = 0; i < count; ++i)
+ {
+ stringified = TAO_IFR_Service_Utils::int_to_string (i);
+ this->fill_op_desc (sub_key,
+ ods[i],
+ stringified
+ ACE_ENV_ARG_PARAMETER);
+ ACE_CHECK;
+ }
+}
+
+void
+TAO_HomeDef_i::fill_op_desc (ACE_Configuration_Section_Key &key,
+ CORBA::OperationDescription &od,
+ const char *sub_section
+ ACE_ENV_ARG_DECL)
+{
+ ACE_Configuration_Section_Key op_key;
+ this->repo_->config ()->open_section (key,
+ sub_section,
+ 0,
+ op_key);
+ TAO_IFR_Desc_Utils<CORBA::OperationDescription,
+ TAO_OperationDef_i>::fill_desc_begin (
+ od,
+ this->repo_,
+ op_key
+ ACE_ENV_ARG_PARAMETER
+ );
+ ACE_CHECK;
+
+ ACE_TString result_path;
+ this->repo_->config ()->get_string_value (key,
+ "result",
+ result_path);
+ TAO_IDLType_i *result =
+ TAO_IFR_Service_Utils::path_to_idltype (result_path,
+ this->repo_);
+ od.result = result->type_i (ACE_ENV_SINGLE_ARG_PARAMETER);
+ ACE_CHECK;
+
+ TAO_OperationDef_i impl (this->repo_);
+ impl.section_key (op_key);
+ od.mode = impl.mode_i (ACE_ENV_SINGLE_ARG_PARAMETER);
+ ACE_CHECK;
+
+ TAO_IFR_Strseq_Utils<CORBA::ContextIdSeq>::fill_string_seq (
+ "contexts",
+ this->repo_->config (),
+ op_key,
+ od.contexts
+ );
+
+ this->fill_param_desc_seq (op_key,
+ od.parameters,
+ "params"
+ ACE_ENV_ARG_PARAMETER);
+ ACE_CHECK;
+
+ this->fill_exc_desc_seq (op_key,
+ od.exceptions,
+ "excepts"
+ ACE_ENV_ARG_PARAMETER);
+}
+
+void
+TAO_HomeDef_i::fill_param_desc_seq (ACE_Configuration_Section_Key &key,
+ CORBA::ParDescriptionSeq &pds,
+ const char *sub_section
+ ACE_ENV_ARG_DECL)
+{
+ pds.length (0);
+ ACE_Configuration_Section_Key params_key;
+ int status =
+ this->repo_->config ()->open_section (key,
+ sub_section,
+ 0,
+ params_key);
+
+ if (status != 0)
+ {
+ return;
+ }
+
+ CORBA::ULong count = 0;
+ this->repo_->config ()->get_integer_value (params_key,
+ "count",
+ count);
+ pds.length (count);
+ char *stringified = 0;
+
+ for (CORBA::ULong i = 0; i < count; ++i)
+ {
+ stringified = TAO_IFR_Service_Utils::int_to_string (i);
+ this->fill_param_desc (params_key,
+ pds[i],
+ stringified
+ ACE_ENV_ARG_PARAMETER);
+ ACE_CHECK;
+ }
+}
+
+void
+TAO_HomeDef_i::fill_param_desc (ACE_Configuration_Section_Key &key,
+ CORBA::ParameterDescription &pd,
+ const char *sub_section
+ ACE_ENV_ARG_DECL)
+{
+ ACE_Configuration_Section_Key param_key;
+ this->repo_->config ()->open_section (key,
+ sub_section,
+ 0,
+ param_key);
+ ACE_TString holder;
+ this->repo_->config ()->get_string_value (param_key,
+ "name",
+ holder);
+ pd.name = holder.fast_rep ();
+ this->repo_->config ()->get_string_value (param_key,
+ "type_path",
+ holder);
+ TAO_IDLType_i *impl = TAO_IFR_Service_Utils::path_to_idltype (holder,
+ this->repo_);
+ pd.type = impl->type_i (ACE_ENV_SINGLE_ARG_PARAMETER);
+ ACE_CHECK;
+
+ CORBA::Object_var obj =
+ TAO_IFR_Service_Utils::path_to_ir_object (holder,
+ this->repo_
+ ACE_ENV_ARG_PARAMETER);
+ ACE_CHECK;
+
+ pd.type_def = CORBA::IDLType::_narrow (obj.in ()
+ ACE_ENV_ARG_PARAMETER);
+ ACE_CHECK;
+
+ CORBA::ULong val;
+ this->repo_->config ()->get_integer_value (param_key,
+ "mode",
+ val);
+ pd.mode = static_cast<CORBA::ParameterMode> (val);
+}
+
+void
+TAO_HomeDef_i::fill_exc_desc_seq (ACE_Configuration_Section_Key &key,
+ CORBA::ExcDescriptionSeq &eds,
+ const char *sub_section
+ ACE_ENV_ARG_DECL)
+{
+ eds.length (0);
+ ACE_Configuration_Section_Key excepts_key;
+ int status =
+ this->repo_->config ()->open_section (key,
+ sub_section,
+ 0,
+ excepts_key);
+
+ if (status != 0)
+ {
+ return;
+ }
+
+ CORBA::ULong count = 0;
+ this->repo_->config ()->get_integer_value (excepts_key,
+ "count",
+ count);
+ eds.length (count);
+ char *stringified = 0;
+
+ for (CORBA::ULong i = 0; i < count; ++i)
+ {
+ stringified = TAO_IFR_Service_Utils::int_to_string (i);
+ this->fill_exc_desc (excepts_key,
+ eds[i],
+ stringified
+ ACE_ENV_ARG_PARAMETER);
+ ACE_CHECK;
+ }
+}
+
+void
+TAO_HomeDef_i::fill_exc_desc (ACE_Configuration_Section_Key &key,
+ CORBA::ExceptionDescription &ed,
+ const char *sub_section
+ ACE_ENV_ARG_DECL)
+{
+ ACE_TString path;
+ this->repo_->config ()->get_string_value (key,
+ sub_section,
+ path);
+
+ // Description information for exceptions refers to the definition, not
+ // the reference, so we need the extra step to get
+ // the key of the exception's definition.
+ ACE_Configuration_Section_Key except_def_key;
+ this->repo_->config ()->expand_path (this->repo_->root_key (),
+ path,
+ except_def_key,
+ 0);
+ TAO_IFR_Desc_Utils<CORBA::ExceptionDescription,
+ TAO_ExceptionDef_i>::fill_desc_begin (
+ ed,
+ this->repo_,
+ except_def_key
+ ACE_ENV_ARG_PARAMETER
+ );
+
+ TAO_ExceptionDef_i impl (this->repo_);
+ impl.section_key (except_def_key);
+ ed.type = impl.type_i (ACE_ENV_SINGLE_ARG_PARAMETER);
+}
+
+void
+TAO_HomeDef_i::fill_attr_desc_seq (ACE_Configuration_Section_Key &key,
+ CORBA::ExtAttrDescriptionSeq &eads,
+ const char *sub_section
+ ACE_ENV_ARG_DECL)
+{
+ eads.length (0);
+ ACE_Configuration_Section_Key attrs_key;
+ int status =
+ this->repo_->config ()->open_section (key,
+ sub_section,
+ 0,
+ attrs_key);
+
+ if (status != 0)
+ {
+ return;
+ }
+
+ CORBA::ULong count = 0;
+ this->repo_->config ()->get_integer_value (attrs_key,
+ "count",
+ count);
+ eads.length (count);
+ char *stringified = 0;
+
+ for (CORBA::ULong i = 0; i < count; ++i)
+ {
+ stringified = TAO_IFR_Service_Utils::int_to_string (i);
+ this->fill_attr_desc (attrs_key,
+ eads[i],
+ stringified
+ ACE_ENV_ARG_PARAMETER);
+ ACE_CHECK;
+ }
+}
+
+void
+TAO_HomeDef_i::fill_attr_desc (ACE_Configuration_Section_Key &key,
+ CORBA::ExtAttributeDescription &ead,
+ const char *sub_section
+ ACE_ENV_ARG_DECL)
+{
+ ACE_Configuration_Section_Key attr_key;
+ this->repo_->config ()->open_section (key,
+ sub_section,
+ 0,
+ attr_key);
+ TAO_IFR_Desc_Utils<CORBA::ExtAttributeDescription,
+ TAO_AttributeDef_i>::fill_desc_begin (
+ ead,
+ this->repo_,
+ attr_key
+ ACE_ENV_ARG_PARAMETER
+ );
+ ACE_CHECK;
+
+ TAO_AttributeDef_i impl (this->repo_);
+ impl.section_key (attr_key);
+ ead.type = impl.type_i (ACE_ENV_SINGLE_ARG_PARAMETER);
+ ACE_CHECK;
+
+ ead.mode = impl.mode_i (ACE_ENV_SINGLE_ARG_PARAMETER);
+}
+
+TAO_END_VERSIONED_NAMESPACE_DECL
diff --git a/TAO/orbsvcs/orbsvcs/IFRService/HomeDef_i.h b/TAO/orbsvcs/orbsvcs/IFRService/HomeDef_i.h
new file mode 100644
index 00000000000..7436829cb68
--- /dev/null
+++ b/TAO/orbsvcs/orbsvcs/IFRService/HomeDef_i.h
@@ -0,0 +1,286 @@
+// -*- C++ -*-
+
+// $Id$
+
+// ============================================================================
+//
+// = LIBRARY
+// TAO/orbsvcs/orbsvcs/IFRService
+//
+// = FILENAME
+// HomeDef_i.h
+//
+// = DESCRIPTION
+// HomeDef servant class.
+//
+// = AUTHOR
+// Jeff Parsons <parsons@cs.wustl.edu>
+//
+// ============================================================================
+
+#ifndef TAO_HOMEDEF_I_H
+#define TAO_HOMEDEF_I_H
+
+#include "orbsvcs/IFRService/ExtInterfaceDef_i.h"
+#include "orbsvcs/IFRService/ifr_service_export.h"
+
+#if !defined (ACE_LACKS_PRAGMA_ONCE)
+# pragma once
+#endif /* ACE_LACKS_PRAGMA_ONCE */
+
+#include "orbsvcs/IFRService/IFR_ComponentsS.h"
+
+#if defined(_MSC_VER)
+#pragma warning(push)
+#pragma warning(disable:4250)
+#endif /* _MSC_VER */
+
+
+TAO_BEGIN_VERSIONED_NAMESPACE_DECL
+
+class TAO_IFRService_Export TAO_HomeDef_i
+ : public virtual TAO_ExtInterfaceDef_i
+{
+ // = TITLE
+ // HomTAO_HomeDef_ieDef_i
+ //
+ // = DESCRIPTION
+ // Represents a home definition, containing factory and finder.
+ //
+public:
+ TAO_HomeDef_i (TAO_Repository_i *repo);
+ // Constructor
+
+ virtual ~TAO_HomeDef_i (void);
+ // Destructor
+
+ virtual CORBA::DefinitionKind def_kind (
+ ACE_ENV_SINGLE_ARG_DECL_WITH_DEFAULTS
+ )
+ ACE_THROW_SPEC ((CORBA::SystemException));
+ // Return our definition kind.
+
+ virtual void destroy (
+ ACE_ENV_SINGLE_ARG_DECL_WITH_DEFAULTS
+ )
+ ACE_THROW_SPEC ((CORBA::SystemException));
+ // Remove the repository entry.
+
+ virtual void destroy_i (
+ ACE_ENV_SINGLE_ARG_DECL_WITH_DEFAULTS
+ )
+ ACE_THROW_SPEC ((CORBA::SystemException));
+
+ virtual CORBA::Contained::Description *describe (
+ ACE_ENV_SINGLE_ARG_DECL_WITH_DEFAULTS
+ )
+ ACE_THROW_SPEC ((CORBA::SystemException));
+ // From Contained_i's pure virtual function.
+
+ virtual CORBA::Contained::Description *describe_i (
+ ACE_ENV_SINGLE_ARG_DECL_WITH_DEFAULTS
+ )
+ ACE_THROW_SPEC ((CORBA::SystemException));
+ // From Contained_i's pure virtual function.
+
+ virtual CORBA::TypeCode_ptr type (
+ ACE_ENV_SINGLE_ARG_DECL_WITH_DEFAULTS
+ )
+ ACE_THROW_SPEC ((CORBA::SystemException));
+ // From IDLType_i's pure virtual function.
+
+ virtual CORBA::TypeCode_ptr type_i (
+ ACE_ENV_SINGLE_ARG_DECL_WITH_DEFAULTS
+ )
+ ACE_THROW_SPEC ((CORBA::SystemException));
+ // From IDLType_i's pure virtual function.
+
+ virtual CORBA::ComponentIR::HomeDef_ptr base_home (
+ ACE_ENV_SINGLE_ARG_DECL_WITH_DEFAULTS
+ )
+ ACE_THROW_SPEC ((CORBA::SystemException));
+
+ CORBA::ComponentIR::HomeDef_ptr base_home_i (
+ ACE_ENV_SINGLE_ARG_DECL_WITH_DEFAULTS
+ )
+ ACE_THROW_SPEC ((CORBA::SystemException));
+
+ virtual void base_home (
+ CORBA::ComponentIR::HomeDef_ptr base_home
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS
+ )
+ ACE_THROW_SPEC ((CORBA::SystemException));
+
+ void base_home_i (
+ CORBA::ComponentIR::HomeDef_ptr base_home
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS
+ )
+ ACE_THROW_SPEC ((CORBA::SystemException));
+
+ virtual CORBA::InterfaceDefSeq *supported_interfaces (
+ ACE_ENV_SINGLE_ARG_DECL_WITH_DEFAULTS
+ )
+ ACE_THROW_SPEC ((CORBA::SystemException));
+
+ CORBA::InterfaceDefSeq *supported_interfaces_i (
+ ACE_ENV_SINGLE_ARG_DECL_WITH_DEFAULTS
+ )
+ ACE_THROW_SPEC ((CORBA::SystemException));
+
+ virtual void supported_interfaces (
+ const CORBA::InterfaceDefSeq &supported_interfaces
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS
+ )
+ ACE_THROW_SPEC ((CORBA::SystemException));
+
+ void supported_interfaces_i (
+ const CORBA::InterfaceDefSeq &supported_interfaces
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS
+ )
+ ACE_THROW_SPEC ((CORBA::SystemException));
+
+ virtual CORBA::ComponentIR::ComponentDef_ptr managed_component (
+ ACE_ENV_SINGLE_ARG_DECL_WITH_DEFAULTS
+ )
+ ACE_THROW_SPEC ((CORBA::SystemException));
+
+ CORBA::ComponentIR::ComponentDef_ptr managed_component_i (
+ ACE_ENV_SINGLE_ARG_DECL_WITH_DEFAULTS
+ )
+ ACE_THROW_SPEC ((CORBA::SystemException));
+
+ virtual void managed_component (
+ CORBA::ComponentIR::ComponentDef_ptr managed_component
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS
+ )
+ ACE_THROW_SPEC ((CORBA::SystemException));
+
+ void managed_component_i (
+ CORBA::ComponentIR::ComponentDef_ptr managed_component
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS
+ )
+ ACE_THROW_SPEC ((CORBA::SystemException));
+
+ virtual CORBA::ValueDef_ptr primary_key (
+ ACE_ENV_SINGLE_ARG_DECL_WITH_DEFAULTS
+ )
+ ACE_THROW_SPEC ((CORBA::SystemException));
+
+ CORBA::ValueDef_ptr primary_key_i (
+ ACE_ENV_SINGLE_ARG_DECL_WITH_DEFAULTS
+ )
+ ACE_THROW_SPEC ((CORBA::SystemException));
+
+ virtual void primary_key (
+ CORBA::ValueDef_ptr primary_key
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS
+ )
+ ACE_THROW_SPEC ((CORBA::SystemException));
+
+ void primary_key_i (
+ CORBA::ValueDef_ptr primary_key
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS
+ )
+ ACE_THROW_SPEC ((CORBA::SystemException));
+
+ virtual CORBA::ComponentIR::FactoryDef_ptr create_factory (
+ const char *id,
+ const char *name,
+ const char *version,
+ const CORBA::ParDescriptionSeq &params,
+ const CORBA::ExceptionDefSeq &exceptions
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS
+ )
+ ACE_THROW_SPEC ((CORBA::SystemException));
+
+ CORBA::ComponentIR::FactoryDef_ptr create_factory_i (
+ const char *id,
+ const char *name,
+ const char *version,
+ const CORBA::ParDescriptionSeq &params,
+ const CORBA::ExceptionDefSeq &exceptions
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS
+ )
+ ACE_THROW_SPEC ((CORBA::SystemException));
+
+ virtual CORBA::ComponentIR::FinderDef_ptr create_finder (
+ const char *id,
+ const char *name,
+ const char *version,
+ const CORBA::ParDescriptionSeq &params,
+ const CORBA::ExceptionDefSeq &exceptions
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS
+ )
+ ACE_THROW_SPEC ((CORBA::SystemException));
+
+ CORBA::ComponentIR::FinderDef_ptr create_finder_i (
+ const char *id,
+ const char *name,
+ const char *version,
+ const CORBA::ParDescriptionSeq &params,
+ const CORBA::ExceptionDefSeq &exceptions
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS
+ )
+ ACE_THROW_SPEC ((CORBA::SystemException));
+
+private:
+ // Common code for create_factory_i and create_finder_i.
+ CORBA::Object_ptr create_common (
+ CORBA::DefinitionKind created_kind,
+ const char *id,
+ const char *name,
+ const char *version,
+ const char *sub_section,
+ const CORBA::ParDescriptionSeq &params,
+ const CORBA::ExceptionDefSeq &exceptions
+ ACE_ENV_ARG_DECL
+ );
+
+ void fill_op_desc_seq (ACE_Configuration_Section_Key &key,
+ CORBA::OpDescriptionSeq &ods,
+ const char *sub_section
+ ACE_ENV_ARG_DECL);
+
+ void fill_op_desc (ACE_Configuration_Section_Key &key,
+ CORBA::OperationDescription &od,
+ const char *sub_section
+ ACE_ENV_ARG_DECL);
+
+ void fill_param_desc_seq (ACE_Configuration_Section_Key &key,
+ CORBA::ParDescriptionSeq &pds,
+ const char *sub_section
+ ACE_ENV_ARG_DECL);
+
+ void fill_param_desc (ACE_Configuration_Section_Key &key,
+ CORBA::ParameterDescription &pd,
+ const char *sub_section
+ ACE_ENV_ARG_DECL);
+
+ void fill_exc_desc_seq (ACE_Configuration_Section_Key &key,
+ CORBA::ExcDescriptionSeq &eds,
+ const char *sub_section
+ ACE_ENV_ARG_DECL);
+
+ void fill_exc_desc (ACE_Configuration_Section_Key &key,
+ CORBA::ExceptionDescription &ed,
+ const char *sub_section
+ ACE_ENV_ARG_DECL);
+
+ void fill_attr_desc_seq (ACE_Configuration_Section_Key &key,
+ CORBA::ExtAttrDescriptionSeq &eads,
+ const char *sub_section
+ ACE_ENV_ARG_DECL);
+
+ void fill_attr_desc (ACE_Configuration_Section_Key &key,
+ CORBA::ExtAttributeDescription &ead,
+ const char *sub_section
+ ACE_ENV_ARG_DECL);
+};
+
+TAO_END_VERSIONED_NAMESPACE_DECL
+
+#if defined(_MSC_VER)
+#pragma warning(pop)
+#endif /* _MSC_VER */
+
+#endif /* TAO_HOMEDEF_I_H */
diff --git a/TAO/orbsvcs/orbsvcs/IFRService/IDLType_i.cpp b/TAO/orbsvcs/orbsvcs/IFRService/IDLType_i.cpp
new file mode 100644
index 00000000000..83c64aff90e
--- /dev/null
+++ b/TAO/orbsvcs/orbsvcs/IFRService/IDLType_i.cpp
@@ -0,0 +1,21 @@
+// $Id$
+
+#include "orbsvcs/IFRService/IDLType_i.h"
+
+ACE_RCSID (IFRService,
+ IDLType_i,
+ "$Id$")
+
+
+TAO_BEGIN_VERSIONED_NAMESPACE_DECL
+
+TAO_IDLType_i::TAO_IDLType_i (TAO_Repository_i *repo)
+ : TAO_IRObject_i (repo)
+{
+}
+
+TAO_IDLType_i::~TAO_IDLType_i (void)
+{
+}
+
+TAO_END_VERSIONED_NAMESPACE_DECL
diff --git a/TAO/orbsvcs/orbsvcs/IFRService/IDLType_i.h b/TAO/orbsvcs/orbsvcs/IFRService/IDLType_i.h
new file mode 100644
index 00000000000..8935d63aae6
--- /dev/null
+++ b/TAO/orbsvcs/orbsvcs/IFRService/IDLType_i.h
@@ -0,0 +1,75 @@
+// -*- C++ -*-
+// $Id$
+
+// ============================================================================
+//
+// = LIBRARY
+// TAO/orbsvcs/orbsvcs/IFRService
+//
+// = FILENAME
+// IDLType_i.h
+//
+// = DESCRIPTION
+// IDLType servant class.
+//
+// = AUTHOR
+// Jeff Parsons <parsons@cs.wustl.edu>
+//
+// ============================================================================
+
+#ifndef TAO_IDLTYPE_I_H
+#define TAO_IDLTYPE_I_H
+
+#include "orbsvcs/IFRService/IRObject_i.h"
+#include "orbsvcs/IFRService/ifr_service_export.h"
+
+#if !defined (ACE_LACKS_PRAGMA_ONCE)
+# pragma once
+#endif /* ACE_LACKS_PRAGMA_ONCE */
+
+#if defined(_MSC_VER)
+#pragma warning(push)
+#pragma warning(disable:4250)
+#endif /* _MSC_VER */
+
+TAO_BEGIN_VERSIONED_NAMESPACE_DECL
+
+class TAO_Repository_i;
+
+class TAO_IFRService_Export TAO_IDLType_i : public virtual TAO_IRObject_i
+{
+ // = TITLE
+ // TAO_IDLType_i
+ //
+ // = DESCRIPTION
+ // Abstract base class for all IR objects that represent
+ // OMG IDL types. Provides access to the TypeCode describing
+ // the type.
+ //
+public:
+ TAO_IDLType_i (TAO_Repository_i *repo);
+ // Constructor.
+
+ virtual ~TAO_IDLType_i (void);
+ // Destructor.
+
+ virtual CORBA::TypeCode_ptr type (
+ ACE_ENV_SINGLE_ARG_DECL_WITH_DEFAULTS)
+
+ ACE_THROW_SPEC ((CORBA::SystemException)) = 0;
+ // Defined in concrete classes.
+
+ virtual CORBA::TypeCode_ptr type_i (
+ ACE_ENV_SINGLE_ARG_DECL_WITH_DEFAULTS)
+
+ ACE_THROW_SPEC ((CORBA::SystemException)) = 0;
+ // Defined in concrete classes.
+};
+
+TAO_END_VERSIONED_NAMESPACE_DECL
+
+#if defined(_MSC_VER)
+#pragma warning(pop)
+#endif /* _MSC_VER */
+
+#endif /* TAO_IDLTYPE_I_H */
diff --git a/TAO/orbsvcs/orbsvcs/IFRService/IFR_BaseS.cpp b/TAO/orbsvcs/orbsvcs/IFRService/IFR_BaseS.cpp
new file mode 100644
index 00000000000..3395db49bd8
--- /dev/null
+++ b/TAO/orbsvcs/orbsvcs/IFRService/IFR_BaseS.cpp
@@ -0,0 +1,7987 @@
+// -*- C++ -*-
+//
+// $Id$
+
+// **** Code generated by the The ACE ORB (TAO) IDL Compiler ****
+// TAO and the TAO IDL Compiler have been developed by:
+// Center for Distributed Object Computing
+// Washington University
+// St. Louis, MO
+// USA
+// http://www.cs.wustl.edu/~schmidt/doc-center.html
+// and
+// Distributed Object Computing Laboratory
+// University of California at Irvine
+// Irvine, CA
+// USA
+// http://doc.ece.uci.edu/
+// and
+// Institute for Software Integrated Systems
+// Vanderbilt University
+// Nashville, TN
+// USA
+// http://www.isis.vanderbilt.edu/
+//
+// Information about TAO is available at:
+// http://www.cs.wustl.edu/~schmidt/TAO.html
+
+
+// TAO_IDL - Generated from
+// be\be_codegen.cpp:603
+
+#ifndef _TAO_IDL____ORBSVCS_ORBSVCS_IFRSERVICE_IFR_BASES_CPP_
+#define _TAO_IDL____ORBSVCS_ORBSVCS_IFRSERVICE_IFR_BASES_CPP_
+
+
+#include "IFR_BaseS.h"
+#include "tao/PortableServer/Operation_Table_Perfect_Hash.h"
+#include "tao/PortableServer/Upcall_Command.h"
+#include "tao/PortableServer/Upcall_Wrapper.h"
+#include "tao/TAO_Server_Request.h"
+#include "tao/ORB_Core.h"
+#include "tao/Profile.h"
+#include "tao/Stub.h"
+#include "tao/IFR_Client_Adapter.h"
+#include "tao/Object_T.h"
+#include "tao/AnyTypeCode/TypeCode.h"
+#include "tao/AnyTypeCode/DynamicC.h"
+#include "tao/CDR.h"
+#include "tao/operation_details.h"
+#include "tao/PortableInterceptor.h"
+#include "tao/PortableServer/Basic_SArguments.h"
+#include "tao/PortableServer/Object_SArgument_T.h"
+#include "tao/PortableServer/Special_Basic_SArguments.h"
+#include "tao/PortableServer/UB_String_SArguments.h"
+#include "tao/PortableServer/Var_Size_SArgument_T.h"
+#include "tao/PortableServer/Any_SArg_Traits.h"
+#include "tao/PortableServer/TypeCode_SArg_Traits.h"
+#include "tao/PortableServer/Object_SArg_Traits.h"
+#include "tao/PortableServer/get_arg.h"
+#include "tao/Special_Basic_Arguments.h"
+#include "tao/UB_String_Arguments.h"
+#include "tao/Basic_Arguments.h"
+#include "tao/Object_Argument_T.h"
+#include "tao/Special_Basic_Arguments.h"
+#include "tao/UB_String_Arguments.h"
+#include "tao/Var_Size_Argument_T.h"
+#include "tao/AnyTypeCode/Any_Arg_Traits.h"
+#include "ace/Dynamic_Service.h"
+#include "ace/Malloc_Allocator.h"
+
+#if !defined (__ACE_INLINE__)
+#include "IFR_BaseS.inl"
+#endif /* !defined INLINE */
+
+TAO_BEGIN_VERSIONED_NAMESPACE_DECL
+
+
+
+// TAO_IDL - Generated from
+// be\be_visitor_arg_traits.cpp:72
+
+
+TAO_END_VERSIONED_NAMESPACE_DECL
+
+
+TAO_BEGIN_VERSIONED_NAMESPACE_DECL
+
+
+// Arg traits specializations.
+namespace TAO
+{
+
+ // TAO_IDL - Generated from
+ // be\be_visitor_arg_traits.cpp:817
+
+#if !defined (_CORBA_DEFINITIONKIND__SARG_TRAITS_)
+#define _CORBA_DEFINITIONKIND__SARG_TRAITS_
+
+ template<>
+ class SArg_Traits<CORBA::DefinitionKind>
+ : public
+ Basic_SArg_Traits_T<
+ CORBA::DefinitionKind,
+ TAO::Any_Insert_Policy_Stream <CORBA::DefinitionKind>
+ >
+ {
+ };
+
+#endif /* end #if !defined */
+
+ // TAO_IDL - Generated from
+ // be\be_visitor_arg_traits.cpp:140
+
+#if !defined (_CORBA_CONTAINED__SARG_TRAITS_)
+#define _CORBA_CONTAINED__SARG_TRAITS_
+
+ template<>
+ class SArg_Traits<CORBA::Contained>
+ : public
+ Object_SArg_Traits_T<
+ CORBA::Contained_ptr,
+ CORBA::Contained_var,
+ CORBA::Contained_out,
+ TAO::Any_Insert_Policy_Stream <CORBA::Contained_ptr>
+ >
+ {
+ };
+
+#endif /* end #if !defined */
+
+ // TAO_IDL - Generated from
+ // be\be_visitor_arg_traits.cpp:859
+
+#if !defined (_CORBA_CONTAINED_DESCRIPTION__SARG_TRAITS_)
+#define _CORBA_CONTAINED_DESCRIPTION__SARG_TRAITS_
+
+ template<>
+ class SArg_Traits<CORBA::Contained::Description>
+ : public
+ Var_Size_SArg_Traits_T<
+ CORBA::Contained::Description,
+ TAO::Any_Insert_Policy_Stream <CORBA::Contained::Description>
+ >
+ {
+ };
+
+#endif /* end #if !defined */
+
+ // TAO_IDL - Generated from
+ // be\be_visitor_arg_traits.cpp:140
+
+#if !defined (_CORBA_REPOSITORY__SARG_TRAITS_)
+#define _CORBA_REPOSITORY__SARG_TRAITS_
+
+ template<>
+ class SArg_Traits<CORBA::Repository>
+ : public
+ Object_SArg_Traits_T<
+ CORBA::Repository_ptr,
+ CORBA::Repository_var,
+ CORBA::Repository_out,
+ TAO::Any_Insert_Policy_Stream <CORBA::Repository_ptr>
+ >
+ {
+ };
+
+#endif /* end #if !defined */
+
+ // TAO_IDL - Generated from
+ // be\be_visitor_arg_traits.cpp:140
+
+#if !defined (_CORBA_CONTAINER__SARG_TRAITS_)
+#define _CORBA_CONTAINER__SARG_TRAITS_
+
+ template<>
+ class SArg_Traits<CORBA::Container>
+ : public
+ Object_SArg_Traits_T<
+ CORBA::Container_ptr,
+ CORBA::Container_var,
+ CORBA::Container_out,
+ TAO::Any_Insert_Policy_Stream <CORBA::Container_ptr>
+ >
+ {
+ };
+
+#endif /* end #if !defined */
+
+ // TAO_IDL - Generated from
+ // be\be_visitor_arg_traits.cpp:611
+
+#if !defined (_CORBA_CONTAINER_DESCRIPTIONSEQ__SARG_TRAITS_)
+#define _CORBA_CONTAINER_DESCRIPTIONSEQ__SARG_TRAITS_
+
+ template<>
+ class SArg_Traits<CORBA::Container::DescriptionSeq>
+ : public
+ Var_Size_SArg_Traits_T<
+ CORBA::Container::DescriptionSeq,
+ TAO::Any_Insert_Policy_Stream <CORBA::Container::DescriptionSeq>
+ >
+ {
+ };
+
+#endif /* end #if !defined */
+
+ // TAO_IDL - Generated from
+ // be\be_visitor_arg_traits.cpp:140
+
+#if !defined (_CORBA_MODULEDEF__SARG_TRAITS_)
+#define _CORBA_MODULEDEF__SARG_TRAITS_
+
+ template<>
+ class SArg_Traits<CORBA::ModuleDef>
+ : public
+ Object_SArg_Traits_T<
+ CORBA::ModuleDef_ptr,
+ CORBA::ModuleDef_var,
+ CORBA::ModuleDef_out,
+ TAO::Any_Insert_Policy_Stream <CORBA::ModuleDef_ptr>
+ >
+ {
+ };
+
+#endif /* end #if !defined */
+
+ // TAO_IDL - Generated from
+ // be\be_visitor_arg_traits.cpp:140
+
+#if !defined (_CORBA_CONSTANTDEF__SARG_TRAITS_)
+#define _CORBA_CONSTANTDEF__SARG_TRAITS_
+
+ template<>
+ class SArg_Traits<CORBA::ConstantDef>
+ : public
+ Object_SArg_Traits_T<
+ CORBA::ConstantDef_ptr,
+ CORBA::ConstantDef_var,
+ CORBA::ConstantDef_out,
+ TAO::Any_Insert_Policy_Stream <CORBA::ConstantDef_ptr>
+ >
+ {
+ };
+
+#endif /* end #if !defined */
+
+ // TAO_IDL - Generated from
+ // be\be_visitor_arg_traits.cpp:140
+
+#if !defined (_CORBA_IDLTYPE__SARG_TRAITS_)
+#define _CORBA_IDLTYPE__SARG_TRAITS_
+
+ template<>
+ class SArg_Traits<CORBA::IDLType>
+ : public
+ Object_SArg_Traits_T<
+ CORBA::IDLType_ptr,
+ CORBA::IDLType_var,
+ CORBA::IDLType_out,
+ TAO::Any_Insert_Policy_Stream <CORBA::IDLType_ptr>
+ >
+ {
+ };
+
+#endif /* end #if !defined */
+
+ // TAO_IDL - Generated from
+ // be\be_visitor_arg_traits.cpp:140
+
+#if !defined (_CORBA_STRUCTDEF__SARG_TRAITS_)
+#define _CORBA_STRUCTDEF__SARG_TRAITS_
+
+ template<>
+ class SArg_Traits<CORBA::StructDef>
+ : public
+ Object_SArg_Traits_T<
+ CORBA::StructDef_ptr,
+ CORBA::StructDef_var,
+ CORBA::StructDef_out,
+ TAO::Any_Insert_Policy_Stream <CORBA::StructDef_ptr>
+ >
+ {
+ };
+
+#endif /* end #if !defined */
+
+ // TAO_IDL - Generated from
+ // be\be_visitor_arg_traits.cpp:140
+
+#if !defined (_CORBA_UNIONDEF__SARG_TRAITS_)
+#define _CORBA_UNIONDEF__SARG_TRAITS_
+
+ template<>
+ class SArg_Traits<CORBA::UnionDef>
+ : public
+ Object_SArg_Traits_T<
+ CORBA::UnionDef_ptr,
+ CORBA::UnionDef_var,
+ CORBA::UnionDef_out,
+ TAO::Any_Insert_Policy_Stream <CORBA::UnionDef_ptr>
+ >
+ {
+ };
+
+#endif /* end #if !defined */
+
+ // TAO_IDL - Generated from
+ // be\be_visitor_arg_traits.cpp:140
+
+#if !defined (_CORBA_ENUMDEF__SARG_TRAITS_)
+#define _CORBA_ENUMDEF__SARG_TRAITS_
+
+ template<>
+ class SArg_Traits<CORBA::EnumDef>
+ : public
+ Object_SArg_Traits_T<
+ CORBA::EnumDef_ptr,
+ CORBA::EnumDef_var,
+ CORBA::EnumDef_out,
+ TAO::Any_Insert_Policy_Stream <CORBA::EnumDef_ptr>
+ >
+ {
+ };
+
+#endif /* end #if !defined */
+
+ // TAO_IDL - Generated from
+ // be\be_visitor_arg_traits.cpp:140
+
+#if !defined (_CORBA_ALIASDEF__SARG_TRAITS_)
+#define _CORBA_ALIASDEF__SARG_TRAITS_
+
+ template<>
+ class SArg_Traits<CORBA::AliasDef>
+ : public
+ Object_SArg_Traits_T<
+ CORBA::AliasDef_ptr,
+ CORBA::AliasDef_var,
+ CORBA::AliasDef_out,
+ TAO::Any_Insert_Policy_Stream <CORBA::AliasDef_ptr>
+ >
+ {
+ };
+
+#endif /* end #if !defined */
+
+ // TAO_IDL - Generated from
+ // be\be_visitor_arg_traits.cpp:140
+
+#if !defined (_CORBA_INTERFACEDEF__SARG_TRAITS_)
+#define _CORBA_INTERFACEDEF__SARG_TRAITS_
+
+ template<>
+ class SArg_Traits<CORBA::InterfaceDef>
+ : public
+ Object_SArg_Traits_T<
+ CORBA::InterfaceDef_ptr,
+ CORBA::InterfaceDef_var,
+ CORBA::InterfaceDef_out,
+ TAO::Any_Insert_Policy_Stream <CORBA::InterfaceDef_ptr>
+ >
+ {
+ };
+
+#endif /* end #if !defined */
+
+ // TAO_IDL - Generated from
+ // be\be_visitor_arg_traits.cpp:611
+
+#if !defined (_CORBA_INTERFACEDEFSEQ__SARG_TRAITS_)
+#define _CORBA_INTERFACEDEFSEQ__SARG_TRAITS_
+
+ template<>
+ class SArg_Traits<CORBA::InterfaceDefSeq>
+ : public
+ Var_Size_SArg_Traits_T<
+ CORBA::InterfaceDefSeq,
+ TAO::Any_Insert_Policy_Stream <CORBA::InterfaceDefSeq>
+ >
+ {
+ };
+
+#endif /* end #if !defined */
+
+ // TAO_IDL - Generated from
+ // be\be_visitor_arg_traits.cpp:140
+
+#if !defined (_CORBA_EXCEPTIONDEF__SARG_TRAITS_)
+#define _CORBA_EXCEPTIONDEF__SARG_TRAITS_
+
+ template<>
+ class SArg_Traits<CORBA::ExceptionDef>
+ : public
+ Object_SArg_Traits_T<
+ CORBA::ExceptionDef_ptr,
+ CORBA::ExceptionDef_var,
+ CORBA::ExceptionDef_out,
+ TAO::Any_Insert_Policy_Stream <CORBA::ExceptionDef_ptr>
+ >
+ {
+ };
+
+#endif /* end #if !defined */
+
+ // TAO_IDL - Generated from
+ // be\be_visitor_arg_traits.cpp:140
+
+#if !defined (_CORBA_NATIVEDEF__SARG_TRAITS_)
+#define _CORBA_NATIVEDEF__SARG_TRAITS_
+
+ template<>
+ class SArg_Traits<CORBA::NativeDef>
+ : public
+ Object_SArg_Traits_T<
+ CORBA::NativeDef_ptr,
+ CORBA::NativeDef_var,
+ CORBA::NativeDef_out,
+ TAO::Any_Insert_Policy_Stream <CORBA::NativeDef_ptr>
+ >
+ {
+ };
+
+#endif /* end #if !defined */
+
+ // TAO_IDL - Generated from
+ // be\be_visitor_arg_traits.cpp:140
+
+#if !defined (_CORBA_VALUEDEF__SARG_TRAITS_)
+#define _CORBA_VALUEDEF__SARG_TRAITS_
+
+ template<>
+ class SArg_Traits<CORBA::ValueDef>
+ : public
+ Object_SArg_Traits_T<
+ CORBA::ValueDef_ptr,
+ CORBA::ValueDef_var,
+ CORBA::ValueDef_out,
+ TAO::Any_Insert_Policy_Stream <CORBA::ValueDef_ptr>
+ >
+ {
+ };
+
+#endif /* end #if !defined */
+
+ // TAO_IDL - Generated from
+ // be\be_visitor_arg_traits.cpp:611
+
+#if !defined (_CORBA_VALUEDEFSEQ__SARG_TRAITS_)
+#define _CORBA_VALUEDEFSEQ__SARG_TRAITS_
+
+ template<>
+ class SArg_Traits<CORBA::ValueDefSeq>
+ : public
+ Var_Size_SArg_Traits_T<
+ CORBA::ValueDefSeq,
+ TAO::Any_Insert_Policy_Stream <CORBA::ValueDefSeq>
+ >
+ {
+ };
+
+#endif /* end #if !defined */
+
+ // TAO_IDL - Generated from
+ // be\be_visitor_arg_traits.cpp:140
+
+#if !defined (_CORBA_VALUEBOXDEF__SARG_TRAITS_)
+#define _CORBA_VALUEBOXDEF__SARG_TRAITS_
+
+ template<>
+ class SArg_Traits<CORBA::ValueBoxDef>
+ : public
+ Object_SArg_Traits_T<
+ CORBA::ValueBoxDef_ptr,
+ CORBA::ValueBoxDef_var,
+ CORBA::ValueBoxDef_out,
+ TAO::Any_Insert_Policy_Stream <CORBA::ValueBoxDef_ptr>
+ >
+ {
+ };
+
+#endif /* end #if !defined */
+
+ // TAO_IDL - Generated from
+ // be\be_visitor_arg_traits.cpp:140
+
+#if !defined (_CORBA_ABSTRACTINTERFACEDEF__SARG_TRAITS_)
+#define _CORBA_ABSTRACTINTERFACEDEF__SARG_TRAITS_
+
+ template<>
+ class SArg_Traits<CORBA::AbstractInterfaceDef>
+ : public
+ Object_SArg_Traits_T<
+ CORBA::AbstractInterfaceDef_ptr,
+ CORBA::AbstractInterfaceDef_var,
+ CORBA::AbstractInterfaceDef_out,
+ TAO::Any_Insert_Policy_Stream <CORBA::AbstractInterfaceDef_ptr>
+ >
+ {
+ };
+
+#endif /* end #if !defined */
+
+ // TAO_IDL - Generated from
+ // be\be_visitor_arg_traits.cpp:611
+
+#if !defined (_CORBA_ABSTRACTINTERFACEDEFSEQ__SARG_TRAITS_)
+#define _CORBA_ABSTRACTINTERFACEDEFSEQ__SARG_TRAITS_
+
+ template<>
+ class SArg_Traits<CORBA::AbstractInterfaceDefSeq>
+ : public
+ Var_Size_SArg_Traits_T<
+ CORBA::AbstractInterfaceDefSeq,
+ TAO::Any_Insert_Policy_Stream <CORBA::AbstractInterfaceDefSeq>
+ >
+ {
+ };
+
+#endif /* end #if !defined */
+
+ // TAO_IDL - Generated from
+ // be\be_visitor_arg_traits.cpp:140
+
+#if !defined (_CORBA_LOCALINTERFACEDEF__SARG_TRAITS_)
+#define _CORBA_LOCALINTERFACEDEF__SARG_TRAITS_
+
+ template<>
+ class SArg_Traits<CORBA::LocalInterfaceDef>
+ : public
+ Object_SArg_Traits_T<
+ CORBA::LocalInterfaceDef_ptr,
+ CORBA::LocalInterfaceDef_var,
+ CORBA::LocalInterfaceDef_out,
+ TAO::Any_Insert_Policy_Stream <CORBA::LocalInterfaceDef_ptr>
+ >
+ {
+ };
+
+#endif /* end #if !defined */
+
+ // TAO_IDL - Generated from
+ // be\be_visitor_arg_traits.cpp:140
+
+#if !defined (_CORBA_EXTVALUEDEF__SARG_TRAITS_)
+#define _CORBA_EXTVALUEDEF__SARG_TRAITS_
+
+ template<>
+ class SArg_Traits<CORBA::ExtValueDef>
+ : public
+ Object_SArg_Traits_T<
+ CORBA::ExtValueDef_ptr,
+ CORBA::ExtValueDef_var,
+ CORBA::ExtValueDef_out,
+ TAO::Any_Insert_Policy_Stream <CORBA::ExtValueDef_ptr>
+ >
+ {
+ };
+
+#endif /* end #if !defined */
+
+ // TAO_IDL - Generated from
+ // be\be_visitor_arg_traits.cpp:611
+
+#if !defined (_CORBA_CONTAINEDSEQ__SARG_TRAITS_)
+#define _CORBA_CONTAINEDSEQ__SARG_TRAITS_
+
+ template<>
+ class SArg_Traits<CORBA::ContainedSeq>
+ : public
+ Var_Size_SArg_Traits_T<
+ CORBA::ContainedSeq,
+ TAO::Any_Insert_Policy_Stream <CORBA::ContainedSeq>
+ >
+ {
+ };
+
+#endif /* end #if !defined */
+
+ // TAO_IDL - Generated from
+ // be\be_visitor_arg_traits.cpp:611
+
+#if !defined (_CORBA_STRUCTMEMBERSEQ__SARG_TRAITS_)
+#define _CORBA_STRUCTMEMBERSEQ__SARG_TRAITS_
+
+ template<>
+ class SArg_Traits<CORBA::StructMemberSeq>
+ : public
+ Var_Size_SArg_Traits_T<
+ CORBA::StructMemberSeq,
+ TAO::Any_Insert_Policy_Stream <CORBA::StructMemberSeq>
+ >
+ {
+ };
+
+#endif /* end #if !defined */
+
+ // TAO_IDL - Generated from
+ // be\be_visitor_arg_traits.cpp:611
+
+#if !defined (_CORBA_INITIALIZERSEQ__SARG_TRAITS_)
+#define _CORBA_INITIALIZERSEQ__SARG_TRAITS_
+
+ template<>
+ class SArg_Traits<CORBA::InitializerSeq>
+ : public
+ Var_Size_SArg_Traits_T<
+ CORBA::InitializerSeq,
+ TAO::Any_Insert_Policy_Stream <CORBA::InitializerSeq>
+ >
+ {
+ };
+
+#endif /* end #if !defined */
+
+ // TAO_IDL - Generated from
+ // be\be_visitor_arg_traits.cpp:611
+
+#if !defined (_CORBA_EXTINITIALIZERSEQ__SARG_TRAITS_)
+#define _CORBA_EXTINITIALIZERSEQ__SARG_TRAITS_
+
+ template<>
+ class SArg_Traits<CORBA::ExtInitializerSeq>
+ : public
+ Var_Size_SArg_Traits_T<
+ CORBA::ExtInitializerSeq,
+ TAO::Any_Insert_Policy_Stream <CORBA::ExtInitializerSeq>
+ >
+ {
+ };
+
+#endif /* end #if !defined */
+
+ // TAO_IDL - Generated from
+ // be\be_visitor_arg_traits.cpp:611
+
+#if !defined (_CORBA_UNIONMEMBERSEQ__SARG_TRAITS_)
+#define _CORBA_UNIONMEMBERSEQ__SARG_TRAITS_
+
+ template<>
+ class SArg_Traits<CORBA::UnionMemberSeq>
+ : public
+ Var_Size_SArg_Traits_T<
+ CORBA::UnionMemberSeq,
+ TAO::Any_Insert_Policy_Stream <CORBA::UnionMemberSeq>
+ >
+ {
+ };
+
+#endif /* end #if !defined */
+
+ // TAO_IDL - Generated from
+ // be\be_visitor_arg_traits.cpp:611
+
+#if !defined (_CORBA_ENUMMEMBERSEQ__SARG_TRAITS_)
+#define _CORBA_ENUMMEMBERSEQ__SARG_TRAITS_
+
+ template<>
+ class SArg_Traits<CORBA::EnumMemberSeq>
+ : public
+ Var_Size_SArg_Traits_T<
+ CORBA::EnumMemberSeq,
+ TAO::Any_Insert_Policy_Stream <CORBA::EnumMemberSeq>
+ >
+ {
+ };
+
+#endif /* end #if !defined */
+}
+
+TAO_END_VERSIONED_NAMESPACE_DECL
+
+
+TAO_BEGIN_VERSIONED_NAMESPACE_DECL
+
+
+
+
+// TAO_IDL - Generated from
+// be\be_visitor_arg_traits.cpp:72
+
+
+TAO_END_VERSIONED_NAMESPACE_DECL
+
+
+TAO_BEGIN_VERSIONED_NAMESPACE_DECL
+
+
+// Arg traits specializations.
+namespace TAO
+{
+
+ // TAO_IDL - Generated from
+ // be\be_visitor_arg_traits.cpp:817
+
+#if !defined (_CORBA_DEFINITIONKIND__ARG_TRAITS_)
+#define _CORBA_DEFINITIONKIND__ARG_TRAITS_
+
+ template<>
+ class Arg_Traits<CORBA::DefinitionKind>
+ : public
+ Basic_Arg_Traits_T<
+ CORBA::DefinitionKind,
+ TAO::Any_Insert_Policy_Stream <CORBA::DefinitionKind>
+ >
+ {
+ };
+
+#endif /* end #if !defined */
+
+ // TAO_IDL - Generated from
+ // be\be_visitor_arg_traits.cpp:140
+
+#if !defined (_CORBA_CONTAINED__ARG_TRAITS_)
+#define _CORBA_CONTAINED__ARG_TRAITS_
+
+ template<>
+ class Arg_Traits<CORBA::Contained>
+ : public
+ Object_Arg_Traits_T<
+ CORBA::Contained_ptr,
+ CORBA::Contained_var,
+ CORBA::Contained_out,
+ TAO::Objref_Traits<CORBA::Contained>,
+ TAO::Any_Insert_Policy_Stream <CORBA::Contained_ptr>
+ >
+ {
+ };
+
+#endif /* end #if !defined */
+
+ // TAO_IDL - Generated from
+ // be\be_visitor_arg_traits.cpp:859
+
+#if !defined (_CORBA_CONTAINED_DESCRIPTION__ARG_TRAITS_)
+#define _CORBA_CONTAINED_DESCRIPTION__ARG_TRAITS_
+
+ template<>
+ class Arg_Traits<CORBA::Contained::Description>
+ : public
+ Var_Size_Arg_Traits_T<
+ CORBA::Contained::Description,
+ TAO::Any_Insert_Policy_Stream <CORBA::Contained::Description>
+ >
+ {
+ };
+
+#endif /* end #if !defined */
+
+ // TAO_IDL - Generated from
+ // be\be_visitor_arg_traits.cpp:140
+
+#if !defined (_CORBA_REPOSITORY__ARG_TRAITS_)
+#define _CORBA_REPOSITORY__ARG_TRAITS_
+
+ template<>
+ class Arg_Traits<CORBA::Repository>
+ : public
+ Object_Arg_Traits_T<
+ CORBA::Repository_ptr,
+ CORBA::Repository_var,
+ CORBA::Repository_out,
+ TAO::Objref_Traits<CORBA::Repository>,
+ TAO::Any_Insert_Policy_Stream <CORBA::Repository_ptr>
+ >
+ {
+ };
+
+#endif /* end #if !defined */
+
+ // TAO_IDL - Generated from
+ // be\be_visitor_arg_traits.cpp:140
+
+#if !defined (_CORBA_CONTAINER__ARG_TRAITS_)
+#define _CORBA_CONTAINER__ARG_TRAITS_
+
+ template<>
+ class Arg_Traits<CORBA::Container>
+ : public
+ Object_Arg_Traits_T<
+ CORBA::Container_ptr,
+ CORBA::Container_var,
+ CORBA::Container_out,
+ TAO::Objref_Traits<CORBA::Container>,
+ TAO::Any_Insert_Policy_Stream <CORBA::Container_ptr>
+ >
+ {
+ };
+
+#endif /* end #if !defined */
+
+ // TAO_IDL - Generated from
+ // be\be_visitor_arg_traits.cpp:611
+
+#if !defined (_CORBA_CONTAINER_DESCRIPTIONSEQ__ARG_TRAITS_)
+#define _CORBA_CONTAINER_DESCRIPTIONSEQ__ARG_TRAITS_
+
+ template<>
+ class Arg_Traits<CORBA::Container::DescriptionSeq>
+ : public
+ Var_Size_Arg_Traits_T<
+ CORBA::Container::DescriptionSeq,
+ TAO::Any_Insert_Policy_Stream <CORBA::Container::DescriptionSeq>
+ >
+ {
+ };
+
+#endif /* end #if !defined */
+
+ // TAO_IDL - Generated from
+ // be\be_visitor_arg_traits.cpp:140
+
+#if !defined (_CORBA_MODULEDEF__ARG_TRAITS_)
+#define _CORBA_MODULEDEF__ARG_TRAITS_
+
+ template<>
+ class Arg_Traits<CORBA::ModuleDef>
+ : public
+ Object_Arg_Traits_T<
+ CORBA::ModuleDef_ptr,
+ CORBA::ModuleDef_var,
+ CORBA::ModuleDef_out,
+ TAO::Objref_Traits<CORBA::ModuleDef>,
+ TAO::Any_Insert_Policy_Stream <CORBA::ModuleDef_ptr>
+ >
+ {
+ };
+
+#endif /* end #if !defined */
+
+ // TAO_IDL - Generated from
+ // be\be_visitor_arg_traits.cpp:140
+
+#if !defined (_CORBA_CONSTANTDEF__ARG_TRAITS_)
+#define _CORBA_CONSTANTDEF__ARG_TRAITS_
+
+ template<>
+ class Arg_Traits<CORBA::ConstantDef>
+ : public
+ Object_Arg_Traits_T<
+ CORBA::ConstantDef_ptr,
+ CORBA::ConstantDef_var,
+ CORBA::ConstantDef_out,
+ TAO::Objref_Traits<CORBA::ConstantDef>,
+ TAO::Any_Insert_Policy_Stream <CORBA::ConstantDef_ptr>
+ >
+ {
+ };
+
+#endif /* end #if !defined */
+
+ // TAO_IDL - Generated from
+ // be\be_visitor_arg_traits.cpp:140
+
+#if !defined (_CORBA_IDLTYPE__ARG_TRAITS_)
+#define _CORBA_IDLTYPE__ARG_TRAITS_
+
+ template<>
+ class Arg_Traits<CORBA::IDLType>
+ : public
+ Object_Arg_Traits_T<
+ CORBA::IDLType_ptr,
+ CORBA::IDLType_var,
+ CORBA::IDLType_out,
+ TAO::Objref_Traits<CORBA::IDLType>,
+ TAO::Any_Insert_Policy_Stream <CORBA::IDLType_ptr>
+ >
+ {
+ };
+
+#endif /* end #if !defined */
+
+ // TAO_IDL - Generated from
+ // be\be_visitor_arg_traits.cpp:140
+
+#if !defined (_CORBA_STRUCTDEF__ARG_TRAITS_)
+#define _CORBA_STRUCTDEF__ARG_TRAITS_
+
+ template<>
+ class Arg_Traits<CORBA::StructDef>
+ : public
+ Object_Arg_Traits_T<
+ CORBA::StructDef_ptr,
+ CORBA::StructDef_var,
+ CORBA::StructDef_out,
+ TAO::Objref_Traits<CORBA::StructDef>,
+ TAO::Any_Insert_Policy_Stream <CORBA::StructDef_ptr>
+ >
+ {
+ };
+
+#endif /* end #if !defined */
+
+ // TAO_IDL - Generated from
+ // be\be_visitor_arg_traits.cpp:140
+
+#if !defined (_CORBA_UNIONDEF__ARG_TRAITS_)
+#define _CORBA_UNIONDEF__ARG_TRAITS_
+
+ template<>
+ class Arg_Traits<CORBA::UnionDef>
+ : public
+ Object_Arg_Traits_T<
+ CORBA::UnionDef_ptr,
+ CORBA::UnionDef_var,
+ CORBA::UnionDef_out,
+ TAO::Objref_Traits<CORBA::UnionDef>,
+ TAO::Any_Insert_Policy_Stream <CORBA::UnionDef_ptr>
+ >
+ {
+ };
+
+#endif /* end #if !defined */
+
+ // TAO_IDL - Generated from
+ // be\be_visitor_arg_traits.cpp:140
+
+#if !defined (_CORBA_ENUMDEF__ARG_TRAITS_)
+#define _CORBA_ENUMDEF__ARG_TRAITS_
+
+ template<>
+ class Arg_Traits<CORBA::EnumDef>
+ : public
+ Object_Arg_Traits_T<
+ CORBA::EnumDef_ptr,
+ CORBA::EnumDef_var,
+ CORBA::EnumDef_out,
+ TAO::Objref_Traits<CORBA::EnumDef>,
+ TAO::Any_Insert_Policy_Stream <CORBA::EnumDef_ptr>
+ >
+ {
+ };
+
+#endif /* end #if !defined */
+
+ // TAO_IDL - Generated from
+ // be\be_visitor_arg_traits.cpp:140
+
+#if !defined (_CORBA_ALIASDEF__ARG_TRAITS_)
+#define _CORBA_ALIASDEF__ARG_TRAITS_
+
+ template<>
+ class Arg_Traits<CORBA::AliasDef>
+ : public
+ Object_Arg_Traits_T<
+ CORBA::AliasDef_ptr,
+ CORBA::AliasDef_var,
+ CORBA::AliasDef_out,
+ TAO::Objref_Traits<CORBA::AliasDef>,
+ TAO::Any_Insert_Policy_Stream <CORBA::AliasDef_ptr>
+ >
+ {
+ };
+
+#endif /* end #if !defined */
+
+ // TAO_IDL - Generated from
+ // be\be_visitor_arg_traits.cpp:140
+
+#if !defined (_CORBA_INTERFACEDEF__ARG_TRAITS_)
+#define _CORBA_INTERFACEDEF__ARG_TRAITS_
+
+ template<>
+ class Arg_Traits<CORBA::InterfaceDef>
+ : public
+ Object_Arg_Traits_T<
+ CORBA::InterfaceDef_ptr,
+ CORBA::InterfaceDef_var,
+ CORBA::InterfaceDef_out,
+ TAO::Objref_Traits<CORBA::InterfaceDef>,
+ TAO::Any_Insert_Policy_Stream <CORBA::InterfaceDef_ptr>
+ >
+ {
+ };
+
+#endif /* end #if !defined */
+
+ // TAO_IDL - Generated from
+ // be\be_visitor_arg_traits.cpp:611
+
+#if !defined (_CORBA_INTERFACEDEFSEQ__ARG_TRAITS_)
+#define _CORBA_INTERFACEDEFSEQ__ARG_TRAITS_
+
+ template<>
+ class Arg_Traits<CORBA::InterfaceDefSeq>
+ : public
+ Var_Size_Arg_Traits_T<
+ CORBA::InterfaceDefSeq,
+ TAO::Any_Insert_Policy_Stream <CORBA::InterfaceDefSeq>
+ >
+ {
+ };
+
+#endif /* end #if !defined */
+
+ // TAO_IDL - Generated from
+ // be\be_visitor_arg_traits.cpp:140
+
+#if !defined (_CORBA_EXCEPTIONDEF__ARG_TRAITS_)
+#define _CORBA_EXCEPTIONDEF__ARG_TRAITS_
+
+ template<>
+ class Arg_Traits<CORBA::ExceptionDef>
+ : public
+ Object_Arg_Traits_T<
+ CORBA::ExceptionDef_ptr,
+ CORBA::ExceptionDef_var,
+ CORBA::ExceptionDef_out,
+ TAO::Objref_Traits<CORBA::ExceptionDef>,
+ TAO::Any_Insert_Policy_Stream <CORBA::ExceptionDef_ptr>
+ >
+ {
+ };
+
+#endif /* end #if !defined */
+
+ // TAO_IDL - Generated from
+ // be\be_visitor_arg_traits.cpp:140
+
+#if !defined (_CORBA_NATIVEDEF__ARG_TRAITS_)
+#define _CORBA_NATIVEDEF__ARG_TRAITS_
+
+ template<>
+ class Arg_Traits<CORBA::NativeDef>
+ : public
+ Object_Arg_Traits_T<
+ CORBA::NativeDef_ptr,
+ CORBA::NativeDef_var,
+ CORBA::NativeDef_out,
+ TAO::Objref_Traits<CORBA::NativeDef>,
+ TAO::Any_Insert_Policy_Stream <CORBA::NativeDef_ptr>
+ >
+ {
+ };
+
+#endif /* end #if !defined */
+
+ // TAO_IDL - Generated from
+ // be\be_visitor_arg_traits.cpp:140
+
+#if !defined (_CORBA_VALUEDEF__ARG_TRAITS_)
+#define _CORBA_VALUEDEF__ARG_TRAITS_
+
+ template<>
+ class Arg_Traits<CORBA::ValueDef>
+ : public
+ Object_Arg_Traits_T<
+ CORBA::ValueDef_ptr,
+ CORBA::ValueDef_var,
+ CORBA::ValueDef_out,
+ TAO::Objref_Traits<CORBA::ValueDef>,
+ TAO::Any_Insert_Policy_Stream <CORBA::ValueDef_ptr>
+ >
+ {
+ };
+
+#endif /* end #if !defined */
+
+ // TAO_IDL - Generated from
+ // be\be_visitor_arg_traits.cpp:611
+
+#if !defined (_CORBA_VALUEDEFSEQ__ARG_TRAITS_)
+#define _CORBA_VALUEDEFSEQ__ARG_TRAITS_
+
+ template<>
+ class Arg_Traits<CORBA::ValueDefSeq>
+ : public
+ Var_Size_Arg_Traits_T<
+ CORBA::ValueDefSeq,
+ TAO::Any_Insert_Policy_Stream <CORBA::ValueDefSeq>
+ >
+ {
+ };
+
+#endif /* end #if !defined */
+
+ // TAO_IDL - Generated from
+ // be\be_visitor_arg_traits.cpp:140
+
+#if !defined (_CORBA_VALUEBOXDEF__ARG_TRAITS_)
+#define _CORBA_VALUEBOXDEF__ARG_TRAITS_
+
+ template<>
+ class Arg_Traits<CORBA::ValueBoxDef>
+ : public
+ Object_Arg_Traits_T<
+ CORBA::ValueBoxDef_ptr,
+ CORBA::ValueBoxDef_var,
+ CORBA::ValueBoxDef_out,
+ TAO::Objref_Traits<CORBA::ValueBoxDef>,
+ TAO::Any_Insert_Policy_Stream <CORBA::ValueBoxDef_ptr>
+ >
+ {
+ };
+
+#endif /* end #if !defined */
+
+ // TAO_IDL - Generated from
+ // be\be_visitor_arg_traits.cpp:140
+
+#if !defined (_CORBA_ABSTRACTINTERFACEDEF__ARG_TRAITS_)
+#define _CORBA_ABSTRACTINTERFACEDEF__ARG_TRAITS_
+
+ template<>
+ class Arg_Traits<CORBA::AbstractInterfaceDef>
+ : public
+ Object_Arg_Traits_T<
+ CORBA::AbstractInterfaceDef_ptr,
+ CORBA::AbstractInterfaceDef_var,
+ CORBA::AbstractInterfaceDef_out,
+ TAO::Objref_Traits<CORBA::AbstractInterfaceDef>,
+ TAO::Any_Insert_Policy_Stream <CORBA::AbstractInterfaceDef_ptr>
+ >
+ {
+ };
+
+#endif /* end #if !defined */
+
+ // TAO_IDL - Generated from
+ // be\be_visitor_arg_traits.cpp:611
+
+#if !defined (_CORBA_ABSTRACTINTERFACEDEFSEQ__ARG_TRAITS_)
+#define _CORBA_ABSTRACTINTERFACEDEFSEQ__ARG_TRAITS_
+
+ template<>
+ class Arg_Traits<CORBA::AbstractInterfaceDefSeq>
+ : public
+ Var_Size_Arg_Traits_T<
+ CORBA::AbstractInterfaceDefSeq,
+ TAO::Any_Insert_Policy_Stream <CORBA::AbstractInterfaceDefSeq>
+ >
+ {
+ };
+
+#endif /* end #if !defined */
+
+ // TAO_IDL - Generated from
+ // be\be_visitor_arg_traits.cpp:140
+
+#if !defined (_CORBA_LOCALINTERFACEDEF__ARG_TRAITS_)
+#define _CORBA_LOCALINTERFACEDEF__ARG_TRAITS_
+
+ template<>
+ class Arg_Traits<CORBA::LocalInterfaceDef>
+ : public
+ Object_Arg_Traits_T<
+ CORBA::LocalInterfaceDef_ptr,
+ CORBA::LocalInterfaceDef_var,
+ CORBA::LocalInterfaceDef_out,
+ TAO::Objref_Traits<CORBA::LocalInterfaceDef>,
+ TAO::Any_Insert_Policy_Stream <CORBA::LocalInterfaceDef_ptr>
+ >
+ {
+ };
+
+#endif /* end #if !defined */
+
+ // TAO_IDL - Generated from
+ // be\be_visitor_arg_traits.cpp:140
+
+#if !defined (_CORBA_EXTVALUEDEF__ARG_TRAITS_)
+#define _CORBA_EXTVALUEDEF__ARG_TRAITS_
+
+ template<>
+ class Arg_Traits<CORBA::ExtValueDef>
+ : public
+ Object_Arg_Traits_T<
+ CORBA::ExtValueDef_ptr,
+ CORBA::ExtValueDef_var,
+ CORBA::ExtValueDef_out,
+ TAO::Objref_Traits<CORBA::ExtValueDef>,
+ TAO::Any_Insert_Policy_Stream <CORBA::ExtValueDef_ptr>
+ >
+ {
+ };
+
+#endif /* end #if !defined */
+
+ // TAO_IDL - Generated from
+ // be\be_visitor_arg_traits.cpp:611
+
+#if !defined (_CORBA_CONTAINEDSEQ__ARG_TRAITS_)
+#define _CORBA_CONTAINEDSEQ__ARG_TRAITS_
+
+ template<>
+ class Arg_Traits<CORBA::ContainedSeq>
+ : public
+ Var_Size_Arg_Traits_T<
+ CORBA::ContainedSeq,
+ TAO::Any_Insert_Policy_Stream <CORBA::ContainedSeq>
+ >
+ {
+ };
+
+#endif /* end #if !defined */
+
+ // TAO_IDL - Generated from
+ // be\be_visitor_arg_traits.cpp:611
+
+#if !defined (_CORBA_STRUCTMEMBERSEQ__ARG_TRAITS_)
+#define _CORBA_STRUCTMEMBERSEQ__ARG_TRAITS_
+
+ template<>
+ class Arg_Traits<CORBA::StructMemberSeq>
+ : public
+ Var_Size_Arg_Traits_T<
+ CORBA::StructMemberSeq,
+ TAO::Any_Insert_Policy_Stream <CORBA::StructMemberSeq>
+ >
+ {
+ };
+
+#endif /* end #if !defined */
+
+ // TAO_IDL - Generated from
+ // be\be_visitor_arg_traits.cpp:611
+
+#if !defined (_CORBA_INITIALIZERSEQ__ARG_TRAITS_)
+#define _CORBA_INITIALIZERSEQ__ARG_TRAITS_
+
+ template<>
+ class Arg_Traits<CORBA::InitializerSeq>
+ : public
+ Var_Size_Arg_Traits_T<
+ CORBA::InitializerSeq,
+ TAO::Any_Insert_Policy_Stream <CORBA::InitializerSeq>
+ >
+ {
+ };
+
+#endif /* end #if !defined */
+
+ // TAO_IDL - Generated from
+ // be\be_visitor_arg_traits.cpp:611
+
+#if !defined (_CORBA_EXTINITIALIZERSEQ__ARG_TRAITS_)
+#define _CORBA_EXTINITIALIZERSEQ__ARG_TRAITS_
+
+ template<>
+ class Arg_Traits<CORBA::ExtInitializerSeq>
+ : public
+ Var_Size_Arg_Traits_T<
+ CORBA::ExtInitializerSeq,
+ TAO::Any_Insert_Policy_Stream <CORBA::ExtInitializerSeq>
+ >
+ {
+ };
+
+#endif /* end #if !defined */
+
+ // TAO_IDL - Generated from
+ // be\be_visitor_arg_traits.cpp:611
+
+#if !defined (_CORBA_UNIONMEMBERSEQ__ARG_TRAITS_)
+#define _CORBA_UNIONMEMBERSEQ__ARG_TRAITS_
+
+ template<>
+ class Arg_Traits<CORBA::UnionMemberSeq>
+ : public
+ Var_Size_Arg_Traits_T<
+ CORBA::UnionMemberSeq,
+ TAO::Any_Insert_Policy_Stream <CORBA::UnionMemberSeq>
+ >
+ {
+ };
+
+#endif /* end #if !defined */
+
+ // TAO_IDL - Generated from
+ // be\be_visitor_arg_traits.cpp:611
+
+#if !defined (_CORBA_ENUMMEMBERSEQ__ARG_TRAITS_)
+#define _CORBA_ENUMMEMBERSEQ__ARG_TRAITS_
+
+ template<>
+ class Arg_Traits<CORBA::EnumMemberSeq>
+ : public
+ Var_Size_Arg_Traits_T<
+ CORBA::EnumMemberSeq,
+ TAO::Any_Insert_Policy_Stream <CORBA::EnumMemberSeq>
+ >
+ {
+ };
+
+#endif /* end #if !defined */
+}
+
+TAO_END_VERSIONED_NAMESPACE_DECL
+
+
+TAO_BEGIN_VERSIONED_NAMESPACE_DECL
+
+
+
+
+// TAO_IDL - Generated from
+// be\be_interface.cpp:1499
+
+class TAO_CORBA_IRObject_Perfect_Hash_OpTable
+ : public TAO_Perfect_Hash_OpTable
+{
+private:
+ unsigned int hash (const char *str, unsigned int len);
+
+public:
+ const TAO_operation_db_entry * lookup (const char *str, unsigned int len);
+};
+
+/* C++ code produced by gperf version 2.8 (ACE version) */
+/* Command-line: C:\ACE\latest\ACE_wrappers\bin\gperf.exe -m -M -J -c -C -D -E -T -f 0 -F 0,0 -a -o -t -p -K opname -L C++ -Z TAO_CORBA_IRObject_Perfect_Hash_OpTable -N lookup */
+unsigned int
+TAO_CORBA_IRObject_Perfect_Hash_OpTable::hash (const char *str, unsigned int len)
+{
+ static const unsigned char asso_values[] =
+ {
+#if defined (ACE_MVS)
+ 19, 19, 19, 19, 19, 19, 19, 19, 19, 19,
+ 19, 19, 19, 19, 19, 19, 19, 19, 19, 19,
+ 19, 19, 19, 19, 19, 19, 19, 19, 19, 19,
+ 19, 19, 19, 19, 19, 19, 19, 19, 19, 19,
+ 19, 19, 19, 19, 19, 19, 19, 19, 19, 19,
+ 19, 19, 19, 19, 19, 19, 19, 19, 19, 19,
+ 19, 19, 19, 19, 19, 19, 19, 19, 19, 19,
+ 19, 19, 19, 19, 19, 19, 19, 19, 19, 19,
+ 19, 19, 19, 19, 19, 19, 19, 19, 19, 19,
+ 19, 19, 19, 19, 19, 19, 19, 19, 19, 19,
+ 19, 19, 19, 19, 19, 19, 19, 19, 19, 0,
+ 19, 19, 19, 19, 19, 19, 19, 19, 19, 19,
+ 19, 19, 19, 19, 19, 19, 19, 19, 19, 0,
+ 19, 19, 0, 0, 19, 19, 19, 19, 19, 19,
+ 19, 19, 19, 19, 19, 19, 19, 19, 19, 19,
+ 19, 19, 19, 19, 19, 19, 19, 19, 19, 19,
+ 19, 19, 19, 5, 19, 19, 19, 19, 0, 19,
+ 19, 19, 19, 19, 19, 19, 19, 19, 19, 19,
+ 19, 19, 19, 19, 19, 19, 19, 19, 19, 19,
+ 19, 19, 19, 19, 19, 19, 19, 19, 19, 19,
+ 19, 19, 19, 19, 19, 19, 19, 19, 19, 19,
+ 19, 19, 19, 19, 19, 19, 19, 19, 19, 19,
+ 19, 19, 19, 19, 19, 19, 19, 19, 19, 19,
+ 19, 19, 19, 19, 19, 19, 19, 19, 19, 19,
+ 19, 19, 19, 19, 19, 19, 19, 19, 19, 19,
+ 19, 19, 19, 19, 19, 19,
+#else
+ 19, 19, 19, 19, 19, 19, 19, 19, 19, 19,
+ 19, 19, 19, 19, 19, 19, 19, 19, 19, 19,
+ 19, 19, 19, 19, 19, 19, 19, 19, 19, 19,
+ 19, 19, 19, 19, 19, 19, 19, 19, 19, 19,
+ 19, 19, 19, 19, 19, 19, 19, 19, 19, 19,
+ 19, 19, 19, 19, 19, 19, 19, 19, 19, 19,
+ 19, 19, 19, 19, 19, 19, 19, 19, 19, 19,
+ 19, 19, 19, 19, 19, 19, 19, 19, 19, 19,
+ 19, 19, 19, 19, 19, 19, 19, 19, 19, 19,
+ 19, 19, 19, 19, 19, 0, 19, 0, 19, 19,
+ 0, 0, 19, 19, 19, 19, 19, 19, 19, 19,
+ 19, 19, 19, 19, 19, 19, 5, 19, 19, 19,
+ 19, 0, 19, 19, 19, 19, 19, 19,
+#endif /* ACE_MVS */
+ };
+ return len + asso_values[(int) str[len - 1]] + asso_values[(int) str[0]];
+}
+
+const TAO_operation_db_entry *
+TAO_CORBA_IRObject_Perfect_Hash_OpTable::lookup (const char *str, unsigned int len)
+{
+ enum
+ {
+ TOTAL_KEYWORDS = 7,
+ MIN_WORD_LENGTH = 5,
+ MAX_WORD_LENGTH = 14,
+ MIN_HASH_VALUE = 5,
+ MAX_HASH_VALUE = 18,
+ HASH_VALUE_RANGE = 14,
+ DUPLICATES = 0,
+ WORDLIST_SIZE = 12
+ };
+
+ static const TAO_operation_db_entry wordlist[] =
+ {
+ {"",0,0},{"",0,0},{"",0,0},{"",0,0},{"",0,0},
+ {"_is_a", &POA_CORBA::IRObject::_is_a_skel, 0},
+ {"",0,0},
+ {"destroy", &POA_CORBA::IRObject::destroy_skel, 0},
+ {"",0,0},{"",0,0},
+ {"_interface", &POA_CORBA::IRObject::_interface_skel, 0},
+ {"",0,0},{"",0,0},
+ {"_get_def_kind", &POA_CORBA::IRObject::_get_def_kind_skel, 0},
+ {"_repository_id", &POA_CORBA::IRObject::_repository_id_skel, 0},
+ {"_component", &POA_CORBA::IRObject::_component_skel, 0},
+ {"",0,0},{"",0,0},
+ {"_non_existent", &POA_CORBA::IRObject::_non_existent_skel, 0},
+ };
+
+ if (len <= MAX_WORD_LENGTH && len >= MIN_WORD_LENGTH)
+ {
+ unsigned int key = hash (str, len);
+
+ if (key <= MAX_HASH_VALUE && key >= MIN_HASH_VALUE)
+ {
+ const char *s = wordlist[key].opname;
+
+ if (*str == *s && !strncmp (str + 1, s + 1, len - 1))
+ return &wordlist[key];
+ }
+ }
+ return 0;
+}
+
+static TAO_CORBA_IRObject_Perfect_Hash_OpTable tao_CORBA_IRObject_optable;
+
+// TAO_IDL - Generated from
+// be\be_visitor_interface/interface_ss.cpp:966
+
+TAO::Collocation_Proxy_Broker *
+CORBA__TAO_IRObject_Proxy_Broker_Factory_function ( ::CORBA::Object_ptr)
+{
+ return reinterpret_cast<TAO::Collocation_Proxy_Broker *> (0xdead); // Dummy
+}
+
+int
+CORBA__TAO_IRObject_Proxy_Broker_Factory_Initializer (size_t)
+{
+ CORBA__TAO_IRObject_Proxy_Broker_Factory_function_pointer =
+ CORBA__TAO_IRObject_Proxy_Broker_Factory_function;
+
+ return 0;
+}
+
+static int
+CORBA__TAO_IRObject_Proxy_Broker_Stub_Factory_Initializer_Scarecrow =
+ CORBA__TAO_IRObject_Proxy_Broker_Factory_Initializer (
+ reinterpret_cast<size_t> (CORBA__TAO_IRObject_Proxy_Broker_Factory_Initializer)
+ );
+
+// TAO_IDL - Generated from
+// be\be_visitor_interface/interface_ss.cpp:103
+
+POA_CORBA::IRObject::IRObject (void)
+ : TAO_ServantBase ()
+{
+ this->optable_ = &tao_CORBA_IRObject_optable;
+}
+
+POA_CORBA::IRObject::IRObject (const IRObject& rhs)
+ : TAO_Abstract_ServantBase (rhs),
+ TAO_ServantBase (rhs)
+{
+}
+
+POA_CORBA::IRObject::~IRObject (void)
+{
+}namespace POA_CORBA
+{
+
+
+ // TAO_IDL - Generated from
+ // be\be_visitor_operation/upcall_command_ss.cpp:127
+
+ class _get_def_kind_IRObject
+ : public TAO::Upcall_Command
+ {
+ public:
+ inline _get_def_kind_IRObject (
+ POA_CORBA::IRObject * servant,
+ TAO_Operation_Details const * operation_details,
+ TAO::Argument * const args[])
+ : servant_ (servant)
+ , operation_details_ (operation_details)
+ , args_ (args)
+ {
+ }
+
+ virtual void execute (ACE_ENV_SINGLE_ARG_DECL)
+ {
+ TAO::SArg_Traits< ::CORBA::DefinitionKind>::ret_arg_type retval =
+ TAO::Portable_Server::get_ret_arg< ::CORBA::DefinitionKind> (
+ this->operation_details_,
+ this->args_);
+
+ retval =
+ this->servant_->def_kind (
+ ACE_ENV_SINGLE_ARG_PARAMETER);
+ ACE_CHECK;
+ }
+
+ private:
+ POA_CORBA::IRObject * const servant_;
+ TAO_Operation_Details const * const operation_details_;
+ TAO::Argument * const * const args_;
+ };
+}
+
+
+// TAO_IDL - Generated from
+// be\be_visitor_operation/operation_ss.cpp:190
+
+void POA_CORBA::IRObject::_get_def_kind_skel (
+ TAO_ServerRequest & server_request,
+ void * TAO_INTERCEPTOR (servant_upcall),
+ void * servant
+ ACE_ENV_ARG_DECL
+ )
+{
+#if TAO_HAS_INTERCEPTORS == 1
+ static ::CORBA::TypeCode_ptr const * const exceptions = 0;
+ static ::CORBA::ULong const nexceptions = 0;
+#endif /* TAO_HAS_INTERCEPTORS */
+
+ TAO::SArg_Traits< ::CORBA::DefinitionKind>::ret_val retval;
+
+ TAO::Argument * const args[] =
+ {
+ &retval
+ };
+
+ static size_t const nargs = 1;
+
+ POA_CORBA::IRObject * const impl =
+ static_cast<POA_CORBA::IRObject *> (servant);
+
+ _get_def_kind_IRObject command (
+ impl,
+ server_request.operation_details (),
+ args);
+
+ TAO::Upcall_Wrapper upcall_wrapper;
+ upcall_wrapper.upcall (server_request
+ , args
+ , nargs
+ , command
+#if TAO_HAS_INTERCEPTORS == 1
+ , servant_upcall
+ , exceptions
+ , nexceptions
+#endif /* TAO_HAS_INTERCEPTORS == 1 */
+ ACE_ENV_ARG_PARAMETER);
+ ACE_CHECK;
+}namespace POA_CORBA
+{
+
+
+ // TAO_IDL - Generated from
+ // be\be_visitor_operation/upcall_command_ss.cpp:127
+
+ class destroy_IRObject
+ : public TAO::Upcall_Command
+ {
+ public:
+ inline destroy_IRObject (
+ POA_CORBA::IRObject * servant)
+ : servant_ (servant)
+ {
+ }
+
+ virtual void execute (ACE_ENV_SINGLE_ARG_DECL)
+ {
+ this->servant_->destroy (
+ ACE_ENV_SINGLE_ARG_PARAMETER);
+ ACE_CHECK;
+ }
+
+ private:
+ POA_CORBA::IRObject * const servant_;
+ };
+}
+
+
+// TAO_IDL - Generated from
+// be\be_visitor_operation/operation_ss.cpp:190
+
+void POA_CORBA::IRObject::destroy_skel (
+ TAO_ServerRequest & server_request,
+ void * TAO_INTERCEPTOR (servant_upcall),
+ void * servant
+ ACE_ENV_ARG_DECL
+ )
+{
+#if TAO_HAS_INTERCEPTORS == 1
+ static ::CORBA::TypeCode_ptr const * const exceptions = 0;
+ static ::CORBA::ULong const nexceptions = 0;
+#endif /* TAO_HAS_INTERCEPTORS */
+
+ TAO::SArg_Traits< void>::ret_val retval;
+
+ TAO::Argument * const args[] =
+ {
+ &retval
+ };
+
+ static size_t const nargs = 1;
+
+ POA_CORBA::IRObject * const impl =
+ static_cast<POA_CORBA::IRObject *> (servant);
+
+ destroy_IRObject command (
+ impl);
+
+ TAO::Upcall_Wrapper upcall_wrapper;
+ upcall_wrapper.upcall (server_request
+ , args
+ , nargs
+ , command
+#if TAO_HAS_INTERCEPTORS == 1
+ , servant_upcall
+ , exceptions
+ , nexceptions
+#endif /* TAO_HAS_INTERCEPTORS == 1 */
+ ACE_ENV_ARG_PARAMETER);
+ ACE_CHECK;
+}
+
+// TAO_IDL - Generated from
+// be\be_visitor_interface/interface_ss.cpp:169
+
+namespace POA_CORBA
+{
+
+
+ // TAO_IDL - Generated from
+ // be\be_visitor_operation/upcall_command_ss.cpp:127
+
+ class _is_a_IRObject_Upcall_Command
+ : public TAO::Upcall_Command
+ {
+ public:
+ inline _is_a_IRObject_Upcall_Command (
+ POA_CORBA::IRObject * servant,
+ TAO_Operation_Details const * operation_details,
+ TAO::Argument * const args[])
+ : servant_ (servant)
+ , operation_details_ (operation_details)
+ , args_ (args)
+ {
+ }
+
+ virtual void execute (ACE_ENV_SINGLE_ARG_DECL)
+ {
+ TAO::SArg_Traits< ::ACE_InputCDR::to_boolean>::ret_arg_type retval =
+ TAO::Portable_Server::get_ret_arg< ::ACE_InputCDR::to_boolean> (
+ this->operation_details_,
+ this->args_);
+
+ TAO::SArg_Traits< ::CORBA::Char *>::in_arg_type arg_1 =
+ TAO::Portable_Server::get_in_arg< ::CORBA::Char *> (
+ this->operation_details_,
+ this->args_,
+ 1);
+
+ retval =
+ this->servant_-> _is_a (
+ arg_1
+ ACE_ENV_ARG_PARAMETER);
+ ACE_CHECK;
+ }
+
+ private:
+ POA_CORBA::IRObject * const servant_;
+ TAO_Operation_Details const * const operation_details_;
+ TAO::Argument * const * const args_;
+ };
+}
+
+
+void POA_CORBA::IRObject::_is_a_skel (
+ TAO_ServerRequest & server_request,
+ void * TAO_INTERCEPTOR (servant_upcall),
+ void * servant
+ ACE_ENV_ARG_DECL
+ )
+{
+#if TAO_HAS_INTERCEPTORS == 1
+ static ::CORBA::TypeCode_ptr const * const exceptions = 0;
+ static ::CORBA::ULong const nexceptions = 0;
+#endif /* TAO_HAS_INTERCEPTORS */
+
+ TAO::SArg_Traits< ::ACE_InputCDR::to_boolean>::ret_val retval;
+ TAO::SArg_Traits< ::CORBA::Char *>::in_arg_val _tao_repository_id;
+
+ TAO::Argument * const args[] =
+ {
+ &retval,
+ &_tao_repository_id
+ };
+
+ static size_t const nargs = 2;
+
+ POA_CORBA::IRObject * const impl =
+ static_cast<POA_CORBA::IRObject *> (servant);
+
+ _is_a_IRObject_Upcall_Command command (
+ impl,
+ server_request.operation_details (),
+ args);
+
+ TAO::Upcall_Wrapper upcall_wrapper;
+ upcall_wrapper.upcall (server_request
+ , args
+ , nargs
+ , command
+#if TAO_HAS_INTERCEPTORS == 1
+ , servant_upcall
+ , exceptions
+ , nexceptions
+#endif /* TAO_HAS_INTERCEPTORS == 1 */
+ ACE_ENV_ARG_PARAMETER);
+ ACE_CHECK;
+}namespace POA_CORBA
+{
+
+
+ // TAO_IDL - Generated from
+ // be\be_visitor_operation/upcall_command_ss.cpp:127
+
+ class _non_existent_IRObject_Upcall_Command
+ : public TAO::Upcall_Command
+ {
+ public:
+ inline _non_existent_IRObject_Upcall_Command (
+ POA_CORBA::IRObject * servant,
+ TAO_Operation_Details const * operation_details,
+ TAO::Argument * const args[])
+ : servant_ (servant)
+ , operation_details_ (operation_details)
+ , args_ (args)
+ {
+ }
+
+ virtual void execute (ACE_ENV_SINGLE_ARG_DECL)
+ {
+ TAO::SArg_Traits< ::ACE_InputCDR::to_boolean>::ret_arg_type retval =
+ TAO::Portable_Server::get_ret_arg< ::ACE_InputCDR::to_boolean> (
+ this->operation_details_,
+ this->args_);
+
+ retval =
+ this->servant_-> _non_existent (
+ ACE_ENV_SINGLE_ARG_PARAMETER);
+ ACE_CHECK;
+ }
+
+ private:
+ POA_CORBA::IRObject * const servant_;
+ TAO_Operation_Details const * const operation_details_;
+ TAO::Argument * const * const args_;
+ };
+}
+
+
+void POA_CORBA::IRObject::_non_existent_skel (
+ TAO_ServerRequest & server_request,
+ void * TAO_INTERCEPTOR (servant_upcall),
+ void * servant
+ ACE_ENV_ARG_DECL
+ )
+{
+#if TAO_HAS_INTERCEPTORS == 1
+ static ::CORBA::TypeCode_ptr const * const exceptions = 0;
+ static ::CORBA::ULong const nexceptions = 0;
+#endif /* TAO_HAS_INTERCEPTORS */
+
+ TAO::SArg_Traits< ::ACE_InputCDR::to_boolean>::ret_val retval;
+
+ TAO::Argument * const args[] =
+ {
+ &retval
+ };
+
+ static size_t const nargs = 1;
+
+ POA_CORBA::IRObject * const impl =
+ static_cast<POA_CORBA::IRObject *> (servant);
+
+ _non_existent_IRObject_Upcall_Command command (
+ impl,
+ server_request.operation_details (),
+ args);
+
+ TAO::Upcall_Wrapper upcall_wrapper;
+ upcall_wrapper.upcall (server_request
+ , args
+ , nargs
+ , command
+#if TAO_HAS_INTERCEPTORS == 1
+ , servant_upcall
+ , exceptions
+ , nexceptions
+#endif /* TAO_HAS_INTERCEPTORS == 1 */
+ ACE_ENV_ARG_PARAMETER);
+ ACE_CHECK;
+}namespace POA_CORBA
+{
+
+
+ // TAO_IDL - Generated from
+ // be\be_visitor_operation/upcall_command_ss.cpp:127
+
+ class _repository_id_IRObject_Upcall_Command
+ : public TAO::Upcall_Command
+ {
+ public:
+ inline _repository_id_IRObject_Upcall_Command (
+ POA_CORBA::IRObject * servant,
+ TAO_Operation_Details const * operation_details,
+ TAO::Argument * const args[])
+ : servant_ (servant)
+ , operation_details_ (operation_details)
+ , args_ (args)
+ {
+ }
+
+ virtual void execute (ACE_ENV_SINGLE_ARG_DECL)
+ {
+ TAO::SArg_Traits< ::CORBA::Char *>::ret_arg_type retval =
+ TAO::Portable_Server::get_ret_arg< ::CORBA::Char *> (
+ this->operation_details_,
+ this->args_);
+
+ retval =
+ this->servant_-> _repository_id (
+ ACE_ENV_SINGLE_ARG_PARAMETER);
+ ACE_CHECK;
+ }
+
+ private:
+ POA_CORBA::IRObject * const servant_;
+ TAO_Operation_Details const * const operation_details_;
+ TAO::Argument * const * const args_;
+ };
+}
+
+
+void POA_CORBA::IRObject::_repository_id_skel (
+ TAO_ServerRequest & server_request,
+ void * TAO_INTERCEPTOR (servant_upcall),
+ void * servant
+ ACE_ENV_ARG_DECL
+ )
+{
+#if TAO_HAS_INTERCEPTORS == 1
+ static ::CORBA::TypeCode_ptr const * const exceptions = 0;
+ static ::CORBA::ULong const nexceptions = 0;
+#endif /* TAO_HAS_INTERCEPTORS */
+
+ TAO::SArg_Traits< ::CORBA::Char *>::ret_val retval;
+
+ TAO::Argument * const args[] =
+ {
+ &retval
+ };
+
+ static size_t const nargs = 1;
+
+ POA_CORBA::IRObject * const impl =
+ static_cast<POA_CORBA::IRObject *> (servant);
+
+ _repository_id_IRObject_Upcall_Command command (
+ impl,
+ server_request.operation_details (),
+ args);
+
+ TAO::Upcall_Wrapper upcall_wrapper;
+ upcall_wrapper.upcall (server_request
+ , args
+ , nargs
+ , command
+#if TAO_HAS_INTERCEPTORS == 1
+ , servant_upcall
+ , exceptions
+ , nexceptions
+#endif /* TAO_HAS_INTERCEPTORS == 1 */
+ ACE_ENV_ARG_PARAMETER);
+ ACE_CHECK;
+}
+
+// TAO_IDL - Generated from
+// be\be_visitor_interface/interface_ss.cpp:513
+
+void POA_CORBA::IRObject::_interface_skel (
+ TAO_ServerRequest & server_request,
+ void * /* servant_upcall */,
+ void * servant
+ ACE_ENV_ARG_DECL
+ )
+{
+ TAO_IFR_Client_Adapter *_tao_adapter =
+ ACE_Dynamic_Service<TAO_IFR_Client_Adapter>::instance (
+ TAO_ORB_Core::ifr_client_adapter_name ()
+ );
+
+ if (_tao_adapter == 0)
+ {
+ ACE_THROW ( ::CORBA::INTF_REPOS ( ::CORBA::OMGVMCID | 1,
+ ::CORBA::COMPLETED_NO));
+ }
+
+ POA_CORBA::IRObject * const impl =
+ static_cast<POA_CORBA::IRObject *> (servant);
+ ::CORBA::InterfaceDef_ptr _tao_retval =
+ impl->_get_interface (ACE_ENV_SINGLE_ARG_PARAMETER);
+ ACE_CHECK;
+
+ server_request.init_reply ();
+ TAO_OutputCDR &_tao_out = *server_request.outgoing ();
+
+ ::CORBA::Boolean const _tao_result =
+ _tao_adapter->interfacedef_cdr_insert (
+ _tao_out,
+ _tao_retval
+ );
+
+ _tao_adapter->dispose (_tao_retval);
+
+ if (_tao_result == false)
+ {
+ ACE_THROW ( ::CORBA::MARSHAL ());
+ }
+}namespace POA_CORBA
+{
+
+
+ // TAO_IDL - Generated from
+ // be\be_visitor_operation/upcall_command_ss.cpp:127
+
+ class _get_component_IRObject_Upcall_Command
+ : public TAO::Upcall_Command
+ {
+ public:
+ inline _get_component_IRObject_Upcall_Command (
+ POA_CORBA::IRObject * servant,
+ TAO_Operation_Details const * operation_details,
+ TAO::Argument * const args[])
+ : servant_ (servant)
+ , operation_details_ (operation_details)
+ , args_ (args)
+ {
+ }
+
+ virtual void execute (ACE_ENV_SINGLE_ARG_DECL)
+ {
+ TAO::SArg_Traits< ::CORBA::Object>::ret_arg_type retval =
+ TAO::Portable_Server::get_ret_arg< ::CORBA::Object> (
+ this->operation_details_,
+ this->args_);
+
+ retval =
+ this->servant_-> _get_component (
+ ACE_ENV_SINGLE_ARG_PARAMETER);
+ ACE_CHECK;
+ }
+
+ private:
+ POA_CORBA::IRObject * const servant_;
+ TAO_Operation_Details const * const operation_details_;
+ TAO::Argument * const * const args_;
+ };
+}
+
+
+void POA_CORBA::IRObject::_component_skel (
+ TAO_ServerRequest & server_request,
+ void * TAO_INTERCEPTOR (servant_upcall),
+ void * servant
+ ACE_ENV_ARG_DECL
+ )
+{
+#if TAO_HAS_INTERCEPTORS == 1
+ static ::CORBA::TypeCode_ptr const * const exceptions = 0;
+ static ::CORBA::ULong const nexceptions = 0;
+#endif /* TAO_HAS_INTERCEPTORS */
+
+ TAO::SArg_Traits< ::CORBA::Object>::ret_val retval;
+
+ TAO::Argument * const args[] =
+ {
+ &retval
+ };
+
+ static size_t const nargs = 1;
+
+ POA_CORBA::IRObject * const impl =
+ static_cast<POA_CORBA::IRObject *> (servant);
+
+ _get_component_IRObject_Upcall_Command command (
+ impl,
+ server_request.operation_details (),
+ args);
+
+ TAO::Upcall_Wrapper upcall_wrapper;
+ upcall_wrapper.upcall (server_request
+ , args
+ , nargs
+ , command
+#if TAO_HAS_INTERCEPTORS == 1
+ , servant_upcall
+ , exceptions
+ , nexceptions
+#endif /* TAO_HAS_INTERCEPTORS == 1 */
+ ACE_ENV_ARG_PARAMETER);
+ ACE_CHECK;
+}
+
+::CORBA::Boolean POA_CORBA::IRObject::_is_a (
+ const char* value
+ ACE_ENV_ARG_DECL_NOT_USED
+ )
+{
+ return
+ (
+ !ACE_OS::strcmp (
+ value,
+ "IDL:omg.org/CORBA/IRObject:1.0"
+ ) ||
+ !ACE_OS::strcmp (
+ value,
+ "IDL:omg.org/CORBA/Object:1.0"
+ )
+ );
+}
+
+const char* POA_CORBA::IRObject::_interface_repository_id (void) const
+{
+ return "IDL:omg.org/CORBA/IRObject:1.0";
+}
+
+// TAO_IDL - Generated from
+// be\be_visitor_interface/interface_ss.cpp:903
+
+void POA_CORBA::IRObject::_dispatch (
+ TAO_ServerRequest & req,
+ void * servant_upcall
+ ACE_ENV_ARG_DECL
+ )
+{
+ this->synchronous_upcall_dispatch (req,
+ servant_upcall,
+ this
+ ACE_ENV_ARG_PARAMETER);
+}
+
+// TAO_IDL - Generated from
+// be\be_visitor_interface/interface_ss.cpp:851
+
+CORBA::IRObject *
+POA_CORBA::IRObject::_this (ACE_ENV_SINGLE_ARG_DECL)
+{
+ TAO_Stub *stub = this->_create_stub (ACE_ENV_SINGLE_ARG_PARAMETER);
+ ACE_CHECK_RETURN (0);
+
+ TAO_Stub_Auto_Ptr safe_stub (stub);
+ ::CORBA::Object_ptr tmp = CORBA::Object::_nil ();
+
+ ::CORBA::Boolean const _tao_opt_colloc =
+ stub->servant_orb_var ()->orb_core ()->optimize_collocation_objects ();
+
+ ACE_NEW_RETURN (
+ tmp,
+ ::CORBA::Object (stub, _tao_opt_colloc, this),
+ 0
+ );
+
+ ::CORBA::Object_var obj = tmp;
+ (void) safe_stub.release ();
+
+ typedef ::CORBA::IRObject STUB_SCOPED_NAME;
+ return
+ TAO::Narrow_Utils<STUB_SCOPED_NAME>::unchecked_narrow (
+ obj.in (),
+ CORBA__TAO_IRObject_Proxy_Broker_Factory_function_pointer
+ );
+}
+
+// TAO_IDL - Generated from
+// be\be_interface.cpp:1499
+
+class TAO_CORBA_Contained_Perfect_Hash_OpTable
+ : public TAO_Perfect_Hash_OpTable
+{
+private:
+ unsigned int hash (const char *str, unsigned int len);
+
+public:
+ const TAO_operation_db_entry * lookup (const char *str, unsigned int len);
+};
+
+/* C++ code produced by gperf version 2.8 (ACE version) */
+/* Command-line: C:\ACE\latest\ACE_wrappers\bin\gperf.exe -m -M -J -c -C -D -E -T -f 0 -F 0,0 -a -o -t -p -K opname -L C++ -Z TAO_CORBA_Contained_Perfect_Hash_OpTable -N lookup */
+unsigned int
+TAO_CORBA_Contained_Perfect_Hash_OpTable::hash (const char *str, unsigned int len)
+{
+ static const unsigned char asso_values[] =
+ {
+#if defined (ACE_MVS)
+ 37, 37, 37, 37, 37, 37, 37, 37, 37, 37,
+ 37, 37, 37, 37, 37, 37, 37, 37, 37, 37,
+ 37, 37, 37, 37, 37, 37, 37, 37, 37, 37,
+ 37, 37, 37, 37, 37, 37, 37, 37, 37, 37,
+ 37, 37, 37, 37, 37, 37, 37, 37, 37, 37,
+ 37, 37, 37, 37, 37, 37, 37, 37, 37, 37,
+ 37, 37, 37, 37, 37, 37, 37, 37, 37, 37,
+ 37, 37, 37, 37, 37, 37, 37, 37, 37, 37,
+ 37, 37, 37, 37, 37, 37, 37, 37, 37, 37,
+ 37, 37, 37, 37, 37, 37, 37, 37, 37, 37,
+ 37, 37, 37, 37, 37, 37, 37, 37, 37, 0,
+ 37, 37, 37, 37, 37, 37, 37, 37, 37, 37,
+ 37, 37, 37, 37, 37, 37, 37, 37, 37, 0,
+ 37, 37, 0, 0, 37, 37, 37, 37, 37, 37,
+ 37, 37, 37, 37, 37, 37, 37, 37, 0, 0,
+ 37, 37, 37, 37, 37, 37, 37, 37, 37, 37,
+ 37, 37, 37, 10, 37, 37, 37, 37, 10, 37,
+ 37, 37, 37, 37, 37, 37, 37, 37, 37, 37,
+ 37, 37, 37, 37, 37, 37, 37, 37, 37, 37,
+ 37, 37, 37, 37, 37, 37, 37, 37, 37, 37,
+ 37, 37, 37, 37, 37, 37, 37, 37, 37, 37,
+ 37, 37, 37, 37, 37, 37, 37, 37, 37, 37,
+ 37, 37, 37, 37, 37, 37, 37, 37, 37, 37,
+ 37, 37, 37, 37, 37, 37, 37, 37, 37, 37,
+ 37, 37, 37, 37, 37, 37, 37, 37, 37, 37,
+ 37, 37, 37, 37, 37, 37,
+#else
+ 37, 37, 37, 37, 37, 37, 37, 37, 37, 37,
+ 37, 37, 37, 37, 37, 37, 37, 37, 37, 37,
+ 37, 37, 37, 37, 37, 37, 37, 37, 37, 37,
+ 37, 37, 37, 37, 37, 37, 37, 37, 37, 37,
+ 37, 37, 37, 37, 37, 37, 37, 37, 37, 37,
+ 37, 37, 37, 37, 37, 37, 37, 37, 37, 37,
+ 37, 37, 37, 37, 37, 37, 37, 37, 37, 37,
+ 37, 37, 37, 37, 37, 37, 37, 37, 37, 37,
+ 37, 37, 37, 37, 37, 37, 37, 37, 37, 37,
+ 37, 37, 37, 37, 37, 0, 37, 0, 37, 37,
+ 0, 0, 37, 37, 37, 37, 37, 37, 37, 0,
+ 0, 37, 37, 37, 37, 37, 10, 37, 37, 37,
+ 37, 10, 37, 37, 37, 37, 37, 37,
+#endif /* ACE_MVS */
+ };
+ return len + asso_values[(int) str[len - 1]] + asso_values[(int) str[0]];
+}
+
+const TAO_operation_db_entry *
+TAO_CORBA_Contained_Perfect_Hash_OpTable::lookup (const char *str, unsigned int len)
+{
+ enum
+ {
+ TOTAL_KEYWORDS = 18,
+ MIN_WORD_LENGTH = 4,
+ MAX_WORD_LENGTH = 26,
+ MIN_HASH_VALUE = 4,
+ MAX_HASH_VALUE = 36,
+ HASH_VALUE_RANGE = 33,
+ DUPLICATES = 4,
+ WORDLIST_SIZE = 22
+ };
+
+ static const TAO_operation_db_entry wordlist[] =
+ {
+ {"",0,0},{"",0,0},{"",0,0},{"",0,0},
+ {"move", &POA_CORBA::Contained::move_skel, 0},
+ {"_is_a", &POA_CORBA::Contained::_is_a_skel, 0},
+ {"_get_id", &POA_CORBA::Contained::_get_id_skel, 0},
+ {"_set_id", &POA_CORBA::Contained::_set_id_skel, 0},
+ {"describe", &POA_CORBA::Contained::describe_skel, 0},
+ {"_get_name", &POA_CORBA::Contained::_get_name_skel, 0},
+ {"_set_name", &POA_CORBA::Contained::_set_name_skel, 0},
+ {"_interface", &POA_CORBA::Contained::_interface_skel, 0},
+ {"_get_version", &POA_CORBA::Contained::_get_version_skel, 0},
+ {"_set_version", &POA_CORBA::Contained::_set_version_skel, 0},
+ {"_get_def_kind", &POA_CORBA::Contained::_get_def_kind_skel, 0},
+ {"_repository_id", &POA_CORBA::Contained::_repository_id_skel, 0},
+ {"_get_defined_in", &POA_CORBA::Contained::_get_defined_in_skel, 0},
+ {"destroy", &POA_CORBA::Contained::destroy_skel, 0},
+ {"_get_absolute_name", &POA_CORBA::Contained::_get_absolute_name_skel, 0},
+ {"_component", &POA_CORBA::Contained::_component_skel, 0},
+ {"_non_existent", &POA_CORBA::Contained::_non_existent_skel, 0},
+ {"_get_containing_repository", &POA_CORBA::Contained::_get_containing_repository_skel, 0},
+ };
+
+ static const signed char lookup[] =
+ {
+ -9, -2, -12, -2, 4, 5, -1, 50, 8, -45, 11, -1, -46, 14,
+ 15, 16, -1, 17, 18, -1, 19, -6, -2, 20, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1, 21,
+ };
+
+ if (len <= MAX_WORD_LENGTH && len >= MIN_WORD_LENGTH)
+ {
+ unsigned int key = hash (str, len);
+
+ if (key <= MAX_HASH_VALUE && key >= MIN_HASH_VALUE)
+ {
+ int slot = lookup[key];
+
+ if (slot >= 0 && slot < WORDLIST_SIZE)
+ {
+ const char *s = wordlist[slot].opname;
+
+ if (*str == *s && !strncmp (str + 1, s + 1, len - 1))
+ return &wordlist[slot];
+ }
+ else if (slot < 0 && slot >= -MAX_HASH_VALUE)
+ return 0;
+ else
+ {
+ unsigned int offset = key + slot + (slot > 0 ? -MAX_HASH_VALUE : MAX_HASH_VALUE);
+ const TAO_operation_db_entry *base = &wordlist[-lookup[offset]];
+ const TAO_operation_db_entry *ptr = base + -lookup[offset + 1];
+
+ while (--ptr >= base)
+ if (*str == *ptr->opname && !strncmp (str + 1, ptr->opname + 1, len - 1))
+ return ptr;
+ }
+ }
+ }
+ return 0;
+}
+
+static TAO_CORBA_Contained_Perfect_Hash_OpTable tao_CORBA_Contained_optable;
+
+// TAO_IDL - Generated from
+// be\be_visitor_interface/interface_ss.cpp:966
+
+TAO::Collocation_Proxy_Broker *
+CORBA__TAO_Contained_Proxy_Broker_Factory_function ( ::CORBA::Object_ptr)
+{
+ return reinterpret_cast<TAO::Collocation_Proxy_Broker *> (0xdead); // Dummy
+}
+
+int
+CORBA__TAO_Contained_Proxy_Broker_Factory_Initializer (size_t)
+{
+ CORBA__TAO_Contained_Proxy_Broker_Factory_function_pointer =
+ CORBA__TAO_Contained_Proxy_Broker_Factory_function;
+
+ return 0;
+}
+
+static int
+CORBA__TAO_Contained_Proxy_Broker_Stub_Factory_Initializer_Scarecrow =
+ CORBA__TAO_Contained_Proxy_Broker_Factory_Initializer (
+ reinterpret_cast<size_t> (CORBA__TAO_Contained_Proxy_Broker_Factory_Initializer)
+ );
+
+// TAO_IDL - Generated from
+// be\be_visitor_interface/interface_ss.cpp:103
+
+POA_CORBA::Contained::Contained (void)
+ : TAO_ServantBase ()
+{
+ this->optable_ = &tao_CORBA_Contained_optable;
+}
+
+POA_CORBA::Contained::Contained (const Contained& rhs)
+ : TAO_Abstract_ServantBase (rhs),
+ TAO_ServantBase (rhs),
+ POA_CORBA::IRObject (rhs)
+{
+}
+
+POA_CORBA::Contained::~Contained (void)
+{
+}namespace POA_CORBA
+{
+
+
+ // TAO_IDL - Generated from
+ // be\be_visitor_operation/upcall_command_ss.cpp:127
+
+ class _get_id_Contained
+ : public TAO::Upcall_Command
+ {
+ public:
+ inline _get_id_Contained (
+ POA_CORBA::Contained * servant,
+ TAO_Operation_Details const * operation_details,
+ TAO::Argument * const args[])
+ : servant_ (servant)
+ , operation_details_ (operation_details)
+ , args_ (args)
+ {
+ }
+
+ virtual void execute (ACE_ENV_SINGLE_ARG_DECL)
+ {
+ TAO::SArg_Traits< ::CORBA::RepositoryId>::ret_arg_type retval =
+ TAO::Portable_Server::get_ret_arg< ::CORBA::RepositoryId> (
+ this->operation_details_,
+ this->args_);
+
+ retval =
+ this->servant_->id (
+ ACE_ENV_SINGLE_ARG_PARAMETER);
+ ACE_CHECK;
+ }
+
+ private:
+ POA_CORBA::Contained * const servant_;
+ TAO_Operation_Details const * const operation_details_;
+ TAO::Argument * const * const args_;
+ };
+}
+
+
+// TAO_IDL - Generated from
+// be\be_visitor_operation/operation_ss.cpp:190
+
+void POA_CORBA::Contained::_get_id_skel (
+ TAO_ServerRequest & server_request,
+ void * TAO_INTERCEPTOR (servant_upcall),
+ void * servant
+ ACE_ENV_ARG_DECL
+ )
+{
+#if TAO_HAS_INTERCEPTORS == 1
+ static ::CORBA::TypeCode_ptr const * const exceptions = 0;
+ static ::CORBA::ULong const nexceptions = 0;
+#endif /* TAO_HAS_INTERCEPTORS */
+
+ TAO::SArg_Traits< ::CORBA::RepositoryId>::ret_val retval;
+
+ TAO::Argument * const args[] =
+ {
+ &retval
+ };
+
+ static size_t const nargs = 1;
+
+ POA_CORBA::Contained * const impl =
+ static_cast<POA_CORBA::Contained *> (servant);
+
+ _get_id_Contained command (
+ impl,
+ server_request.operation_details (),
+ args);
+
+ TAO::Upcall_Wrapper upcall_wrapper;
+ upcall_wrapper.upcall (server_request
+ , args
+ , nargs
+ , command
+#if TAO_HAS_INTERCEPTORS == 1
+ , servant_upcall
+ , exceptions
+ , nexceptions
+#endif /* TAO_HAS_INTERCEPTORS == 1 */
+ ACE_ENV_ARG_PARAMETER);
+ ACE_CHECK;
+}namespace POA_CORBA
+{
+
+
+ // TAO_IDL - Generated from
+ // be\be_visitor_operation/upcall_command_ss.cpp:127
+
+ class _set_id_Contained
+ : public TAO::Upcall_Command
+ {
+ public:
+ inline _set_id_Contained (
+ POA_CORBA::Contained * servant,
+ TAO_Operation_Details const * operation_details,
+ TAO::Argument * const args[])
+ : servant_ (servant)
+ , operation_details_ (operation_details)
+ , args_ (args)
+ {
+ }
+
+ virtual void execute (ACE_ENV_SINGLE_ARG_DECL)
+ {
+ TAO::SArg_Traits< ::CORBA::RepositoryId>::in_arg_type arg_1 =
+ TAO::Portable_Server::get_in_arg< ::CORBA::RepositoryId> (
+ this->operation_details_,
+ this->args_,
+ 1);
+
+ this->servant_->id (
+ arg_1
+ ACE_ENV_ARG_PARAMETER);
+ ACE_CHECK;
+ }
+
+ private:
+ POA_CORBA::Contained * const servant_;
+ TAO_Operation_Details const * const operation_details_;
+ TAO::Argument * const * const args_;
+ };
+}
+
+
+// TAO_IDL - Generated from
+// be\be_visitor_operation/operation_ss.cpp:190
+
+void POA_CORBA::Contained::_set_id_skel (
+ TAO_ServerRequest & server_request,
+ void * TAO_INTERCEPTOR (servant_upcall),
+ void * servant
+ ACE_ENV_ARG_DECL
+ )
+{
+#if TAO_HAS_INTERCEPTORS == 1
+ static ::CORBA::TypeCode_ptr const * const exceptions = 0;
+ static ::CORBA::ULong const nexceptions = 0;
+#endif /* TAO_HAS_INTERCEPTORS */
+
+ TAO::SArg_Traits< void>::ret_val retval;
+ TAO::SArg_Traits< ::CORBA::RepositoryId>::in_arg_val _tao_id;
+
+ TAO::Argument * const args[] =
+ {
+ &retval,
+ &_tao_id
+ };
+
+ static size_t const nargs = 2;
+
+ POA_CORBA::Contained * const impl =
+ static_cast<POA_CORBA::Contained *> (servant);
+
+ _set_id_Contained command (
+ impl,
+ server_request.operation_details (),
+ args);
+
+ TAO::Upcall_Wrapper upcall_wrapper;
+ upcall_wrapper.upcall (server_request
+ , args
+ , nargs
+ , command
+#if TAO_HAS_INTERCEPTORS == 1
+ , servant_upcall
+ , exceptions
+ , nexceptions
+#endif /* TAO_HAS_INTERCEPTORS == 1 */
+ ACE_ENV_ARG_PARAMETER);
+ ACE_CHECK;
+}namespace POA_CORBA
+{
+
+
+ // TAO_IDL - Generated from
+ // be\be_visitor_operation/upcall_command_ss.cpp:127
+
+ class _get_name_Contained
+ : public TAO::Upcall_Command
+ {
+ public:
+ inline _get_name_Contained (
+ POA_CORBA::Contained * servant,
+ TAO_Operation_Details const * operation_details,
+ TAO::Argument * const args[])
+ : servant_ (servant)
+ , operation_details_ (operation_details)
+ , args_ (args)
+ {
+ }
+
+ virtual void execute (ACE_ENV_SINGLE_ARG_DECL)
+ {
+ TAO::SArg_Traits< ::CORBA::Identifier>::ret_arg_type retval =
+ TAO::Portable_Server::get_ret_arg< ::CORBA::Identifier> (
+ this->operation_details_,
+ this->args_);
+
+ retval =
+ this->servant_->name (
+ ACE_ENV_SINGLE_ARG_PARAMETER);
+ ACE_CHECK;
+ }
+
+ private:
+ POA_CORBA::Contained * const servant_;
+ TAO_Operation_Details const * const operation_details_;
+ TAO::Argument * const * const args_;
+ };
+}
+
+
+// TAO_IDL - Generated from
+// be\be_visitor_operation/operation_ss.cpp:190
+
+void POA_CORBA::Contained::_get_name_skel (
+ TAO_ServerRequest & server_request,
+ void * TAO_INTERCEPTOR (servant_upcall),
+ void * servant
+ ACE_ENV_ARG_DECL
+ )
+{
+#if TAO_HAS_INTERCEPTORS == 1
+ static ::CORBA::TypeCode_ptr const * const exceptions = 0;
+ static ::CORBA::ULong const nexceptions = 0;
+#endif /* TAO_HAS_INTERCEPTORS */
+
+ TAO::SArg_Traits< ::CORBA::Identifier>::ret_val retval;
+
+ TAO::Argument * const args[] =
+ {
+ &retval
+ };
+
+ static size_t const nargs = 1;
+
+ POA_CORBA::Contained * const impl =
+ static_cast<POA_CORBA::Contained *> (servant);
+
+ _get_name_Contained command (
+ impl,
+ server_request.operation_details (),
+ args);
+
+ TAO::Upcall_Wrapper upcall_wrapper;
+ upcall_wrapper.upcall (server_request
+ , args
+ , nargs
+ , command
+#if TAO_HAS_INTERCEPTORS == 1
+ , servant_upcall
+ , exceptions
+ , nexceptions
+#endif /* TAO_HAS_INTERCEPTORS == 1 */
+ ACE_ENV_ARG_PARAMETER);
+ ACE_CHECK;
+}namespace POA_CORBA
+{
+
+
+ // TAO_IDL - Generated from
+ // be\be_visitor_operation/upcall_command_ss.cpp:127
+
+ class _set_name_Contained
+ : public TAO::Upcall_Command
+ {
+ public:
+ inline _set_name_Contained (
+ POA_CORBA::Contained * servant,
+ TAO_Operation_Details const * operation_details,
+ TAO::Argument * const args[])
+ : servant_ (servant)
+ , operation_details_ (operation_details)
+ , args_ (args)
+ {
+ }
+
+ virtual void execute (ACE_ENV_SINGLE_ARG_DECL)
+ {
+ TAO::SArg_Traits< ::CORBA::Identifier>::in_arg_type arg_1 =
+ TAO::Portable_Server::get_in_arg< ::CORBA::Identifier> (
+ this->operation_details_,
+ this->args_,
+ 1);
+
+ this->servant_->name (
+ arg_1
+ ACE_ENV_ARG_PARAMETER);
+ ACE_CHECK;
+ }
+
+ private:
+ POA_CORBA::Contained * const servant_;
+ TAO_Operation_Details const * const operation_details_;
+ TAO::Argument * const * const args_;
+ };
+}
+
+
+// TAO_IDL - Generated from
+// be\be_visitor_operation/operation_ss.cpp:190
+
+void POA_CORBA::Contained::_set_name_skel (
+ TAO_ServerRequest & server_request,
+ void * TAO_INTERCEPTOR (servant_upcall),
+ void * servant
+ ACE_ENV_ARG_DECL
+ )
+{
+#if TAO_HAS_INTERCEPTORS == 1
+ static ::CORBA::TypeCode_ptr const * const exceptions = 0;
+ static ::CORBA::ULong const nexceptions = 0;
+#endif /* TAO_HAS_INTERCEPTORS */
+
+ TAO::SArg_Traits< void>::ret_val retval;
+ TAO::SArg_Traits< ::CORBA::Identifier>::in_arg_val _tao_name;
+
+ TAO::Argument * const args[] =
+ {
+ &retval,
+ &_tao_name
+ };
+
+ static size_t const nargs = 2;
+
+ POA_CORBA::Contained * const impl =
+ static_cast<POA_CORBA::Contained *> (servant);
+
+ _set_name_Contained command (
+ impl,
+ server_request.operation_details (),
+ args);
+
+ TAO::Upcall_Wrapper upcall_wrapper;
+ upcall_wrapper.upcall (server_request
+ , args
+ , nargs
+ , command
+#if TAO_HAS_INTERCEPTORS == 1
+ , servant_upcall
+ , exceptions
+ , nexceptions
+#endif /* TAO_HAS_INTERCEPTORS == 1 */
+ ACE_ENV_ARG_PARAMETER);
+ ACE_CHECK;
+}namespace POA_CORBA
+{
+
+
+ // TAO_IDL - Generated from
+ // be\be_visitor_operation/upcall_command_ss.cpp:127
+
+ class _get_version_Contained
+ : public TAO::Upcall_Command
+ {
+ public:
+ inline _get_version_Contained (
+ POA_CORBA::Contained * servant,
+ TAO_Operation_Details const * operation_details,
+ TAO::Argument * const args[])
+ : servant_ (servant)
+ , operation_details_ (operation_details)
+ , args_ (args)
+ {
+ }
+
+ virtual void execute (ACE_ENV_SINGLE_ARG_DECL)
+ {
+ TAO::SArg_Traits< ::CORBA::VersionSpec>::ret_arg_type retval =
+ TAO::Portable_Server::get_ret_arg< ::CORBA::VersionSpec> (
+ this->operation_details_,
+ this->args_);
+
+ retval =
+ this->servant_->version (
+ ACE_ENV_SINGLE_ARG_PARAMETER);
+ ACE_CHECK;
+ }
+
+ private:
+ POA_CORBA::Contained * const servant_;
+ TAO_Operation_Details const * const operation_details_;
+ TAO::Argument * const * const args_;
+ };
+}
+
+
+// TAO_IDL - Generated from
+// be\be_visitor_operation/operation_ss.cpp:190
+
+void POA_CORBA::Contained::_get_version_skel (
+ TAO_ServerRequest & server_request,
+ void * TAO_INTERCEPTOR (servant_upcall),
+ void * servant
+ ACE_ENV_ARG_DECL
+ )
+{
+#if TAO_HAS_INTERCEPTORS == 1
+ static ::CORBA::TypeCode_ptr const * const exceptions = 0;
+ static ::CORBA::ULong const nexceptions = 0;
+#endif /* TAO_HAS_INTERCEPTORS */
+
+ TAO::SArg_Traits< ::CORBA::VersionSpec>::ret_val retval;
+
+ TAO::Argument * const args[] =
+ {
+ &retval
+ };
+
+ static size_t const nargs = 1;
+
+ POA_CORBA::Contained * const impl =
+ static_cast<POA_CORBA::Contained *> (servant);
+
+ _get_version_Contained command (
+ impl,
+ server_request.operation_details (),
+ args);
+
+ TAO::Upcall_Wrapper upcall_wrapper;
+ upcall_wrapper.upcall (server_request
+ , args
+ , nargs
+ , command
+#if TAO_HAS_INTERCEPTORS == 1
+ , servant_upcall
+ , exceptions
+ , nexceptions
+#endif /* TAO_HAS_INTERCEPTORS == 1 */
+ ACE_ENV_ARG_PARAMETER);
+ ACE_CHECK;
+}namespace POA_CORBA
+{
+
+
+ // TAO_IDL - Generated from
+ // be\be_visitor_operation/upcall_command_ss.cpp:127
+
+ class _set_version_Contained
+ : public TAO::Upcall_Command
+ {
+ public:
+ inline _set_version_Contained (
+ POA_CORBA::Contained * servant,
+ TAO_Operation_Details const * operation_details,
+ TAO::Argument * const args[])
+ : servant_ (servant)
+ , operation_details_ (operation_details)
+ , args_ (args)
+ {
+ }
+
+ virtual void execute (ACE_ENV_SINGLE_ARG_DECL)
+ {
+ TAO::SArg_Traits< ::CORBA::VersionSpec>::in_arg_type arg_1 =
+ TAO::Portable_Server::get_in_arg< ::CORBA::VersionSpec> (
+ this->operation_details_,
+ this->args_,
+ 1);
+
+ this->servant_->version (
+ arg_1
+ ACE_ENV_ARG_PARAMETER);
+ ACE_CHECK;
+ }
+
+ private:
+ POA_CORBA::Contained * const servant_;
+ TAO_Operation_Details const * const operation_details_;
+ TAO::Argument * const * const args_;
+ };
+}
+
+
+// TAO_IDL - Generated from
+// be\be_visitor_operation/operation_ss.cpp:190
+
+void POA_CORBA::Contained::_set_version_skel (
+ TAO_ServerRequest & server_request,
+ void * TAO_INTERCEPTOR (servant_upcall),
+ void * servant
+ ACE_ENV_ARG_DECL
+ )
+{
+#if TAO_HAS_INTERCEPTORS == 1
+ static ::CORBA::TypeCode_ptr const * const exceptions = 0;
+ static ::CORBA::ULong const nexceptions = 0;
+#endif /* TAO_HAS_INTERCEPTORS */
+
+ TAO::SArg_Traits< void>::ret_val retval;
+ TAO::SArg_Traits< ::CORBA::VersionSpec>::in_arg_val _tao_version;
+
+ TAO::Argument * const args[] =
+ {
+ &retval,
+ &_tao_version
+ };
+
+ static size_t const nargs = 2;
+
+ POA_CORBA::Contained * const impl =
+ static_cast<POA_CORBA::Contained *> (servant);
+
+ _set_version_Contained command (
+ impl,
+ server_request.operation_details (),
+ args);
+
+ TAO::Upcall_Wrapper upcall_wrapper;
+ upcall_wrapper.upcall (server_request
+ , args
+ , nargs
+ , command
+#if TAO_HAS_INTERCEPTORS == 1
+ , servant_upcall
+ , exceptions
+ , nexceptions
+#endif /* TAO_HAS_INTERCEPTORS == 1 */
+ ACE_ENV_ARG_PARAMETER);
+ ACE_CHECK;
+}namespace POA_CORBA
+{
+
+
+ // TAO_IDL - Generated from
+ // be\be_visitor_operation/upcall_command_ss.cpp:127
+
+ class _get_defined_in_Contained
+ : public TAO::Upcall_Command
+ {
+ public:
+ inline _get_defined_in_Contained (
+ POA_CORBA::Contained * servant,
+ TAO_Operation_Details const * operation_details,
+ TAO::Argument * const args[])
+ : servant_ (servant)
+ , operation_details_ (operation_details)
+ , args_ (args)
+ {
+ }
+
+ virtual void execute (ACE_ENV_SINGLE_ARG_DECL)
+ {
+ TAO::SArg_Traits< ::CORBA::Container>::ret_arg_type retval =
+ TAO::Portable_Server::get_ret_arg< ::CORBA::Container> (
+ this->operation_details_,
+ this->args_);
+
+ retval =
+ this->servant_->defined_in (
+ ACE_ENV_SINGLE_ARG_PARAMETER);
+ ACE_CHECK;
+ }
+
+ private:
+ POA_CORBA::Contained * const servant_;
+ TAO_Operation_Details const * const operation_details_;
+ TAO::Argument * const * const args_;
+ };
+}
+
+
+// TAO_IDL - Generated from
+// be\be_visitor_operation/operation_ss.cpp:190
+
+void POA_CORBA::Contained::_get_defined_in_skel (
+ TAO_ServerRequest & server_request,
+ void * TAO_INTERCEPTOR (servant_upcall),
+ void * servant
+ ACE_ENV_ARG_DECL
+ )
+{
+#if TAO_HAS_INTERCEPTORS == 1
+ static ::CORBA::TypeCode_ptr const * const exceptions = 0;
+ static ::CORBA::ULong const nexceptions = 0;
+#endif /* TAO_HAS_INTERCEPTORS */
+
+ TAO::SArg_Traits< ::CORBA::Container>::ret_val retval;
+
+ TAO::Argument * const args[] =
+ {
+ &retval
+ };
+
+ static size_t const nargs = 1;
+
+ POA_CORBA::Contained * const impl =
+ static_cast<POA_CORBA::Contained *> (servant);
+
+ _get_defined_in_Contained command (
+ impl,
+ server_request.operation_details (),
+ args);
+
+ TAO::Upcall_Wrapper upcall_wrapper;
+ upcall_wrapper.upcall (server_request
+ , args
+ , nargs
+ , command
+#if TAO_HAS_INTERCEPTORS == 1
+ , servant_upcall
+ , exceptions
+ , nexceptions
+#endif /* TAO_HAS_INTERCEPTORS == 1 */
+ ACE_ENV_ARG_PARAMETER);
+ ACE_CHECK;
+}namespace POA_CORBA
+{
+
+
+ // TAO_IDL - Generated from
+ // be\be_visitor_operation/upcall_command_ss.cpp:127
+
+ class _get_absolute_name_Contained
+ : public TAO::Upcall_Command
+ {
+ public:
+ inline _get_absolute_name_Contained (
+ POA_CORBA::Contained * servant,
+ TAO_Operation_Details const * operation_details,
+ TAO::Argument * const args[])
+ : servant_ (servant)
+ , operation_details_ (operation_details)
+ , args_ (args)
+ {
+ }
+
+ virtual void execute (ACE_ENV_SINGLE_ARG_DECL)
+ {
+ TAO::SArg_Traits< ::CORBA::ScopedName>::ret_arg_type retval =
+ TAO::Portable_Server::get_ret_arg< ::CORBA::ScopedName> (
+ this->operation_details_,
+ this->args_);
+
+ retval =
+ this->servant_->absolute_name (
+ ACE_ENV_SINGLE_ARG_PARAMETER);
+ ACE_CHECK;
+ }
+
+ private:
+ POA_CORBA::Contained * const servant_;
+ TAO_Operation_Details const * const operation_details_;
+ TAO::Argument * const * const args_;
+ };
+}
+
+
+// TAO_IDL - Generated from
+// be\be_visitor_operation/operation_ss.cpp:190
+
+void POA_CORBA::Contained::_get_absolute_name_skel (
+ TAO_ServerRequest & server_request,
+ void * TAO_INTERCEPTOR (servant_upcall),
+ void * servant
+ ACE_ENV_ARG_DECL
+ )
+{
+#if TAO_HAS_INTERCEPTORS == 1
+ static ::CORBA::TypeCode_ptr const * const exceptions = 0;
+ static ::CORBA::ULong const nexceptions = 0;
+#endif /* TAO_HAS_INTERCEPTORS */
+
+ TAO::SArg_Traits< ::CORBA::ScopedName>::ret_val retval;
+
+ TAO::Argument * const args[] =
+ {
+ &retval
+ };
+
+ static size_t const nargs = 1;
+
+ POA_CORBA::Contained * const impl =
+ static_cast<POA_CORBA::Contained *> (servant);
+
+ _get_absolute_name_Contained command (
+ impl,
+ server_request.operation_details (),
+ args);
+
+ TAO::Upcall_Wrapper upcall_wrapper;
+ upcall_wrapper.upcall (server_request
+ , args
+ , nargs
+ , command
+#if TAO_HAS_INTERCEPTORS == 1
+ , servant_upcall
+ , exceptions
+ , nexceptions
+#endif /* TAO_HAS_INTERCEPTORS == 1 */
+ ACE_ENV_ARG_PARAMETER);
+ ACE_CHECK;
+}namespace POA_CORBA
+{
+
+
+ // TAO_IDL - Generated from
+ // be\be_visitor_operation/upcall_command_ss.cpp:127
+
+ class _get_containing_repository_Contained
+ : public TAO::Upcall_Command
+ {
+ public:
+ inline _get_containing_repository_Contained (
+ POA_CORBA::Contained * servant,
+ TAO_Operation_Details const * operation_details,
+ TAO::Argument * const args[])
+ : servant_ (servant)
+ , operation_details_ (operation_details)
+ , args_ (args)
+ {
+ }
+
+ virtual void execute (ACE_ENV_SINGLE_ARG_DECL)
+ {
+ TAO::SArg_Traits< ::CORBA::Repository>::ret_arg_type retval =
+ TAO::Portable_Server::get_ret_arg< ::CORBA::Repository> (
+ this->operation_details_,
+ this->args_);
+
+ retval =
+ this->servant_->containing_repository (
+ ACE_ENV_SINGLE_ARG_PARAMETER);
+ ACE_CHECK;
+ }
+
+ private:
+ POA_CORBA::Contained * const servant_;
+ TAO_Operation_Details const * const operation_details_;
+ TAO::Argument * const * const args_;
+ };
+}
+
+
+// TAO_IDL - Generated from
+// be\be_visitor_operation/operation_ss.cpp:190
+
+void POA_CORBA::Contained::_get_containing_repository_skel (
+ TAO_ServerRequest & server_request,
+ void * TAO_INTERCEPTOR (servant_upcall),
+ void * servant
+ ACE_ENV_ARG_DECL
+ )
+{
+#if TAO_HAS_INTERCEPTORS == 1
+ static ::CORBA::TypeCode_ptr const * const exceptions = 0;
+ static ::CORBA::ULong const nexceptions = 0;
+#endif /* TAO_HAS_INTERCEPTORS */
+
+ TAO::SArg_Traits< ::CORBA::Repository>::ret_val retval;
+
+ TAO::Argument * const args[] =
+ {
+ &retval
+ };
+
+ static size_t const nargs = 1;
+
+ POA_CORBA::Contained * const impl =
+ static_cast<POA_CORBA::Contained *> (servant);
+
+ _get_containing_repository_Contained command (
+ impl,
+ server_request.operation_details (),
+ args);
+
+ TAO::Upcall_Wrapper upcall_wrapper;
+ upcall_wrapper.upcall (server_request
+ , args
+ , nargs
+ , command
+#if TAO_HAS_INTERCEPTORS == 1
+ , servant_upcall
+ , exceptions
+ , nexceptions
+#endif /* TAO_HAS_INTERCEPTORS == 1 */
+ ACE_ENV_ARG_PARAMETER);
+ ACE_CHECK;
+}namespace POA_CORBA
+{
+
+
+ // TAO_IDL - Generated from
+ // be\be_visitor_operation/upcall_command_ss.cpp:127
+
+ class describe_Contained
+ : public TAO::Upcall_Command
+ {
+ public:
+ inline describe_Contained (
+ POA_CORBA::Contained * servant,
+ TAO_Operation_Details const * operation_details,
+ TAO::Argument * const args[])
+ : servant_ (servant)
+ , operation_details_ (operation_details)
+ , args_ (args)
+ {
+ }
+
+ virtual void execute (ACE_ENV_SINGLE_ARG_DECL)
+ {
+ TAO::SArg_Traits< ::CORBA::Contained::Description>::ret_arg_type retval =
+ TAO::Portable_Server::get_ret_arg< ::CORBA::Contained::Description> (
+ this->operation_details_,
+ this->args_);
+
+ retval =
+ this->servant_->describe (
+ ACE_ENV_SINGLE_ARG_PARAMETER);
+ ACE_CHECK;
+ }
+
+ private:
+ POA_CORBA::Contained * const servant_;
+ TAO_Operation_Details const * const operation_details_;
+ TAO::Argument * const * const args_;
+ };
+}
+
+
+// TAO_IDL - Generated from
+// be\be_visitor_operation/operation_ss.cpp:190
+
+void POA_CORBA::Contained::describe_skel (
+ TAO_ServerRequest & server_request,
+ void * TAO_INTERCEPTOR (servant_upcall),
+ void * servant
+ ACE_ENV_ARG_DECL
+ )
+{
+#if TAO_HAS_INTERCEPTORS == 1
+ static ::CORBA::TypeCode_ptr const * const exceptions = 0;
+ static ::CORBA::ULong const nexceptions = 0;
+#endif /* TAO_HAS_INTERCEPTORS */
+
+ TAO::SArg_Traits< ::CORBA::Contained::Description>::ret_val retval;
+
+ TAO::Argument * const args[] =
+ {
+ &retval
+ };
+
+ static size_t const nargs = 1;
+
+ POA_CORBA::Contained * const impl =
+ static_cast<POA_CORBA::Contained *> (servant);
+
+ describe_Contained command (
+ impl,
+ server_request.operation_details (),
+ args);
+
+ TAO::Upcall_Wrapper upcall_wrapper;
+ upcall_wrapper.upcall (server_request
+ , args
+ , nargs
+ , command
+#if TAO_HAS_INTERCEPTORS == 1
+ , servant_upcall
+ , exceptions
+ , nexceptions
+#endif /* TAO_HAS_INTERCEPTORS == 1 */
+ ACE_ENV_ARG_PARAMETER);
+ ACE_CHECK;
+}namespace POA_CORBA
+{
+
+
+ // TAO_IDL - Generated from
+ // be\be_visitor_operation/upcall_command_ss.cpp:127
+
+ class move_Contained
+ : public TAO::Upcall_Command
+ {
+ public:
+ inline move_Contained (
+ POA_CORBA::Contained * servant,
+ TAO_Operation_Details const * operation_details,
+ TAO::Argument * const args[])
+ : servant_ (servant)
+ , operation_details_ (operation_details)
+ , args_ (args)
+ {
+ }
+
+ virtual void execute (ACE_ENV_SINGLE_ARG_DECL)
+ {
+ TAO::SArg_Traits< ::CORBA::Container>::in_arg_type arg_1 =
+ TAO::Portable_Server::get_in_arg< ::CORBA::Container> (
+ this->operation_details_,
+ this->args_,
+ 1);
+
+ TAO::SArg_Traits< ::CORBA::Identifier>::in_arg_type arg_2 =
+ TAO::Portable_Server::get_in_arg< ::CORBA::Identifier> (
+ this->operation_details_,
+ this->args_,
+ 2);
+
+ TAO::SArg_Traits< ::CORBA::VersionSpec>::in_arg_type arg_3 =
+ TAO::Portable_Server::get_in_arg< ::CORBA::VersionSpec> (
+ this->operation_details_,
+ this->args_,
+ 3);
+
+ this->servant_->move (
+ arg_1
+ , arg_2
+ , arg_3
+ ACE_ENV_ARG_PARAMETER);
+ ACE_CHECK;
+ }
+
+ private:
+ POA_CORBA::Contained * const servant_;
+ TAO_Operation_Details const * const operation_details_;
+ TAO::Argument * const * const args_;
+ };
+}
+
+
+// TAO_IDL - Generated from
+// be\be_visitor_operation/operation_ss.cpp:190
+
+void POA_CORBA::Contained::move_skel (
+ TAO_ServerRequest & server_request,
+ void * TAO_INTERCEPTOR (servant_upcall),
+ void * servant
+ ACE_ENV_ARG_DECL
+ )
+{
+#if TAO_HAS_INTERCEPTORS == 1
+ static ::CORBA::TypeCode_ptr const * const exceptions = 0;
+ static ::CORBA::ULong const nexceptions = 0;
+#endif /* TAO_HAS_INTERCEPTORS */
+
+ TAO::SArg_Traits< void>::ret_val retval;
+ TAO::SArg_Traits< ::CORBA::Container>::in_arg_val _tao_new_container;
+ TAO::SArg_Traits< ::CORBA::Identifier>::in_arg_val _tao_new_name;
+ TAO::SArg_Traits< ::CORBA::VersionSpec>::in_arg_val _tao_new_version;
+
+ TAO::Argument * const args[] =
+ {
+ &retval,
+ &_tao_new_container,
+ &_tao_new_name,
+ &_tao_new_version
+ };
+
+ static size_t const nargs = 4;
+
+ POA_CORBA::Contained * const impl =
+ static_cast<POA_CORBA::Contained *> (servant);
+
+ move_Contained command (
+ impl,
+ server_request.operation_details (),
+ args);
+
+ TAO::Upcall_Wrapper upcall_wrapper;
+ upcall_wrapper.upcall (server_request
+ , args
+ , nargs
+ , command
+#if TAO_HAS_INTERCEPTORS == 1
+ , servant_upcall
+ , exceptions
+ , nexceptions
+#endif /* TAO_HAS_INTERCEPTORS == 1 */
+ ACE_ENV_ARG_PARAMETER);
+ ACE_CHECK;
+}
+
+// TAO_IDL - Generated from
+// be\be_visitor_interface/interface_ss.cpp:169
+
+namespace POA_CORBA
+{
+
+
+ // TAO_IDL - Generated from
+ // be\be_visitor_operation/upcall_command_ss.cpp:127
+
+ class _is_a_Contained_Upcall_Command
+ : public TAO::Upcall_Command
+ {
+ public:
+ inline _is_a_Contained_Upcall_Command (
+ POA_CORBA::Contained * servant,
+ TAO_Operation_Details const * operation_details,
+ TAO::Argument * const args[])
+ : servant_ (servant)
+ , operation_details_ (operation_details)
+ , args_ (args)
+ {
+ }
+
+ virtual void execute (ACE_ENV_SINGLE_ARG_DECL)
+ {
+ TAO::SArg_Traits< ::ACE_InputCDR::to_boolean>::ret_arg_type retval =
+ TAO::Portable_Server::get_ret_arg< ::ACE_InputCDR::to_boolean> (
+ this->operation_details_,
+ this->args_);
+
+ TAO::SArg_Traits< ::CORBA::Char *>::in_arg_type arg_1 =
+ TAO::Portable_Server::get_in_arg< ::CORBA::Char *> (
+ this->operation_details_,
+ this->args_,
+ 1);
+
+ retval =
+ this->servant_-> _is_a (
+ arg_1
+ ACE_ENV_ARG_PARAMETER);
+ ACE_CHECK;
+ }
+
+ private:
+ POA_CORBA::Contained * const servant_;
+ TAO_Operation_Details const * const operation_details_;
+ TAO::Argument * const * const args_;
+ };
+}
+
+
+void POA_CORBA::Contained::_is_a_skel (
+ TAO_ServerRequest & server_request,
+ void * TAO_INTERCEPTOR (servant_upcall),
+ void * servant
+ ACE_ENV_ARG_DECL
+ )
+{
+#if TAO_HAS_INTERCEPTORS == 1
+ static ::CORBA::TypeCode_ptr const * const exceptions = 0;
+ static ::CORBA::ULong const nexceptions = 0;
+#endif /* TAO_HAS_INTERCEPTORS */
+
+ TAO::SArg_Traits< ::ACE_InputCDR::to_boolean>::ret_val retval;
+ TAO::SArg_Traits< ::CORBA::Char *>::in_arg_val _tao_repository_id;
+
+ TAO::Argument * const args[] =
+ {
+ &retval,
+ &_tao_repository_id
+ };
+
+ static size_t const nargs = 2;
+
+ POA_CORBA::Contained * const impl =
+ static_cast<POA_CORBA::Contained *> (servant);
+
+ _is_a_Contained_Upcall_Command command (
+ impl,
+ server_request.operation_details (),
+ args);
+
+ TAO::Upcall_Wrapper upcall_wrapper;
+ upcall_wrapper.upcall (server_request
+ , args
+ , nargs
+ , command
+#if TAO_HAS_INTERCEPTORS == 1
+ , servant_upcall
+ , exceptions
+ , nexceptions
+#endif /* TAO_HAS_INTERCEPTORS == 1 */
+ ACE_ENV_ARG_PARAMETER);
+ ACE_CHECK;
+}namespace POA_CORBA
+{
+
+
+ // TAO_IDL - Generated from
+ // be\be_visitor_operation/upcall_command_ss.cpp:127
+
+ class _non_existent_Contained_Upcall_Command
+ : public TAO::Upcall_Command
+ {
+ public:
+ inline _non_existent_Contained_Upcall_Command (
+ POA_CORBA::Contained * servant,
+ TAO_Operation_Details const * operation_details,
+ TAO::Argument * const args[])
+ : servant_ (servant)
+ , operation_details_ (operation_details)
+ , args_ (args)
+ {
+ }
+
+ virtual void execute (ACE_ENV_SINGLE_ARG_DECL)
+ {
+ TAO::SArg_Traits< ::ACE_InputCDR::to_boolean>::ret_arg_type retval =
+ TAO::Portable_Server::get_ret_arg< ::ACE_InputCDR::to_boolean> (
+ this->operation_details_,
+ this->args_);
+
+ retval =
+ this->servant_-> _non_existent (
+ ACE_ENV_SINGLE_ARG_PARAMETER);
+ ACE_CHECK;
+ }
+
+ private:
+ POA_CORBA::Contained * const servant_;
+ TAO_Operation_Details const * const operation_details_;
+ TAO::Argument * const * const args_;
+ };
+}
+
+
+void POA_CORBA::Contained::_non_existent_skel (
+ TAO_ServerRequest & server_request,
+ void * TAO_INTERCEPTOR (servant_upcall),
+ void * servant
+ ACE_ENV_ARG_DECL
+ )
+{
+#if TAO_HAS_INTERCEPTORS == 1
+ static ::CORBA::TypeCode_ptr const * const exceptions = 0;
+ static ::CORBA::ULong const nexceptions = 0;
+#endif /* TAO_HAS_INTERCEPTORS */
+
+ TAO::SArg_Traits< ::ACE_InputCDR::to_boolean>::ret_val retval;
+
+ TAO::Argument * const args[] =
+ {
+ &retval
+ };
+
+ static size_t const nargs = 1;
+
+ POA_CORBA::Contained * const impl =
+ static_cast<POA_CORBA::Contained *> (servant);
+
+ _non_existent_Contained_Upcall_Command command (
+ impl,
+ server_request.operation_details (),
+ args);
+
+ TAO::Upcall_Wrapper upcall_wrapper;
+ upcall_wrapper.upcall (server_request
+ , args
+ , nargs
+ , command
+#if TAO_HAS_INTERCEPTORS == 1
+ , servant_upcall
+ , exceptions
+ , nexceptions
+#endif /* TAO_HAS_INTERCEPTORS == 1 */
+ ACE_ENV_ARG_PARAMETER);
+ ACE_CHECK;
+}namespace POA_CORBA
+{
+
+
+ // TAO_IDL - Generated from
+ // be\be_visitor_operation/upcall_command_ss.cpp:127
+
+ class _repository_id_Contained_Upcall_Command
+ : public TAO::Upcall_Command
+ {
+ public:
+ inline _repository_id_Contained_Upcall_Command (
+ POA_CORBA::Contained * servant,
+ TAO_Operation_Details const * operation_details,
+ TAO::Argument * const args[])
+ : servant_ (servant)
+ , operation_details_ (operation_details)
+ , args_ (args)
+ {
+ }
+
+ virtual void execute (ACE_ENV_SINGLE_ARG_DECL)
+ {
+ TAO::SArg_Traits< ::CORBA::Char *>::ret_arg_type retval =
+ TAO::Portable_Server::get_ret_arg< ::CORBA::Char *> (
+ this->operation_details_,
+ this->args_);
+
+ retval =
+ this->servant_-> _repository_id (
+ ACE_ENV_SINGLE_ARG_PARAMETER);
+ ACE_CHECK;
+ }
+
+ private:
+ POA_CORBA::Contained * const servant_;
+ TAO_Operation_Details const * const operation_details_;
+ TAO::Argument * const * const args_;
+ };
+}
+
+
+void POA_CORBA::Contained::_repository_id_skel (
+ TAO_ServerRequest & server_request,
+ void * TAO_INTERCEPTOR (servant_upcall),
+ void * servant
+ ACE_ENV_ARG_DECL
+ )
+{
+#if TAO_HAS_INTERCEPTORS == 1
+ static ::CORBA::TypeCode_ptr const * const exceptions = 0;
+ static ::CORBA::ULong const nexceptions = 0;
+#endif /* TAO_HAS_INTERCEPTORS */
+
+ TAO::SArg_Traits< ::CORBA::Char *>::ret_val retval;
+
+ TAO::Argument * const args[] =
+ {
+ &retval
+ };
+
+ static size_t const nargs = 1;
+
+ POA_CORBA::Contained * const impl =
+ static_cast<POA_CORBA::Contained *> (servant);
+
+ _repository_id_Contained_Upcall_Command command (
+ impl,
+ server_request.operation_details (),
+ args);
+
+ TAO::Upcall_Wrapper upcall_wrapper;
+ upcall_wrapper.upcall (server_request
+ , args
+ , nargs
+ , command
+#if TAO_HAS_INTERCEPTORS == 1
+ , servant_upcall
+ , exceptions
+ , nexceptions
+#endif /* TAO_HAS_INTERCEPTORS == 1 */
+ ACE_ENV_ARG_PARAMETER);
+ ACE_CHECK;
+}
+
+// TAO_IDL - Generated from
+// be\be_visitor_interface/interface_ss.cpp:513
+
+void POA_CORBA::Contained::_interface_skel (
+ TAO_ServerRequest & server_request,
+ void * /* servant_upcall */,
+ void * servant
+ ACE_ENV_ARG_DECL
+ )
+{
+ TAO_IFR_Client_Adapter *_tao_adapter =
+ ACE_Dynamic_Service<TAO_IFR_Client_Adapter>::instance (
+ TAO_ORB_Core::ifr_client_adapter_name ()
+ );
+
+ if (_tao_adapter == 0)
+ {
+ ACE_THROW ( ::CORBA::INTF_REPOS ( ::CORBA::OMGVMCID | 1,
+ ::CORBA::COMPLETED_NO));
+ }
+
+ POA_CORBA::Contained * const impl =
+ static_cast<POA_CORBA::Contained *> (servant);
+ ::CORBA::InterfaceDef_ptr _tao_retval =
+ impl->_get_interface (ACE_ENV_SINGLE_ARG_PARAMETER);
+ ACE_CHECK;
+
+ server_request.init_reply ();
+ TAO_OutputCDR &_tao_out = *server_request.outgoing ();
+
+ ::CORBA::Boolean const _tao_result =
+ _tao_adapter->interfacedef_cdr_insert (
+ _tao_out,
+ _tao_retval
+ );
+
+ _tao_adapter->dispose (_tao_retval);
+
+ if (_tao_result == false)
+ {
+ ACE_THROW ( ::CORBA::MARSHAL ());
+ }
+}namespace POA_CORBA
+{
+
+
+ // TAO_IDL - Generated from
+ // be\be_visitor_operation/upcall_command_ss.cpp:127
+
+ class _get_component_Contained_Upcall_Command
+ : public TAO::Upcall_Command
+ {
+ public:
+ inline _get_component_Contained_Upcall_Command (
+ POA_CORBA::Contained * servant,
+ TAO_Operation_Details const * operation_details,
+ TAO::Argument * const args[])
+ : servant_ (servant)
+ , operation_details_ (operation_details)
+ , args_ (args)
+ {
+ }
+
+ virtual void execute (ACE_ENV_SINGLE_ARG_DECL)
+ {
+ TAO::SArg_Traits< ::CORBA::Object>::ret_arg_type retval =
+ TAO::Portable_Server::get_ret_arg< ::CORBA::Object> (
+ this->operation_details_,
+ this->args_);
+
+ retval =
+ this->servant_-> _get_component (
+ ACE_ENV_SINGLE_ARG_PARAMETER);
+ ACE_CHECK;
+ }
+
+ private:
+ POA_CORBA::Contained * const servant_;
+ TAO_Operation_Details const * const operation_details_;
+ TAO::Argument * const * const args_;
+ };
+}
+
+
+void POA_CORBA::Contained::_component_skel (
+ TAO_ServerRequest & server_request,
+ void * TAO_INTERCEPTOR (servant_upcall),
+ void * servant
+ ACE_ENV_ARG_DECL
+ )
+{
+#if TAO_HAS_INTERCEPTORS == 1
+ static ::CORBA::TypeCode_ptr const * const exceptions = 0;
+ static ::CORBA::ULong const nexceptions = 0;
+#endif /* TAO_HAS_INTERCEPTORS */
+
+ TAO::SArg_Traits< ::CORBA::Object>::ret_val retval;
+
+ TAO::Argument * const args[] =
+ {
+ &retval
+ };
+
+ static size_t const nargs = 1;
+
+ POA_CORBA::Contained * const impl =
+ static_cast<POA_CORBA::Contained *> (servant);
+
+ _get_component_Contained_Upcall_Command command (
+ impl,
+ server_request.operation_details (),
+ args);
+
+ TAO::Upcall_Wrapper upcall_wrapper;
+ upcall_wrapper.upcall (server_request
+ , args
+ , nargs
+ , command
+#if TAO_HAS_INTERCEPTORS == 1
+ , servant_upcall
+ , exceptions
+ , nexceptions
+#endif /* TAO_HAS_INTERCEPTORS == 1 */
+ ACE_ENV_ARG_PARAMETER);
+ ACE_CHECK;
+}
+
+::CORBA::Boolean POA_CORBA::Contained::_is_a (
+ const char* value
+ ACE_ENV_ARG_DECL_NOT_USED
+ )
+{
+ return
+ (
+ !ACE_OS::strcmp (
+ value,
+ "IDL:omg.org/CORBA/IRObject:1.0"
+ ) ||
+ !ACE_OS::strcmp (
+ value,
+ "IDL:omg.org/CORBA/Contained:1.0"
+ ) ||
+ !ACE_OS::strcmp (
+ value,
+ "IDL:omg.org/CORBA/Object:1.0"
+ )
+ );
+}
+
+const char* POA_CORBA::Contained::_interface_repository_id (void) const
+{
+ return "IDL:omg.org/CORBA/Contained:1.0";
+}
+
+// TAO_IDL - Generated from
+// be\be_visitor_interface/interface_ss.cpp:903
+
+void POA_CORBA::Contained::_dispatch (
+ TAO_ServerRequest & req,
+ void * servant_upcall
+ ACE_ENV_ARG_DECL
+ )
+{
+ this->synchronous_upcall_dispatch (req,
+ servant_upcall,
+ this
+ ACE_ENV_ARG_PARAMETER);
+}
+
+// TAO_IDL - Generated from
+// be\be_visitor_interface/interface_ss.cpp:851
+
+CORBA::Contained *
+POA_CORBA::Contained::_this (ACE_ENV_SINGLE_ARG_DECL)
+{
+ TAO_Stub *stub = this->_create_stub (ACE_ENV_SINGLE_ARG_PARAMETER);
+ ACE_CHECK_RETURN (0);
+
+ TAO_Stub_Auto_Ptr safe_stub (stub);
+ ::CORBA::Object_ptr tmp = CORBA::Object::_nil ();
+
+ ::CORBA::Boolean const _tao_opt_colloc =
+ stub->servant_orb_var ()->orb_core ()->optimize_collocation_objects ();
+
+ ACE_NEW_RETURN (
+ tmp,
+ ::CORBA::Object (stub, _tao_opt_colloc, this),
+ 0
+ );
+
+ ::CORBA::Object_var obj = tmp;
+ (void) safe_stub.release ();
+
+ typedef ::CORBA::Contained STUB_SCOPED_NAME;
+ return
+ TAO::Narrow_Utils<STUB_SCOPED_NAME>::unchecked_narrow (
+ obj.in (),
+ CORBA__TAO_Contained_Proxy_Broker_Factory_function_pointer
+ );
+}
+
+// TAO_IDL - Generated from
+// be\be_interface.cpp:1499
+
+class TAO_CORBA_Container_Perfect_Hash_OpTable
+ : public TAO_Perfect_Hash_OpTable
+{
+private:
+ unsigned int hash (const char *str, unsigned int len);
+
+public:
+ const TAO_operation_db_entry * lookup (const char *str, unsigned int len);
+};
+
+/* C++ code produced by gperf version 2.8 (ACE version) */
+/* Command-line: C:\ACE\latest\ACE_wrappers\bin\gperf.exe -m -M -J -c -C -D -E -T -f 0 -F 0,0 -a -o -t -p -K opname -L C++ -Z TAO_CORBA_Container_Perfect_Hash_OpTable -N lookup */
+unsigned int
+TAO_CORBA_Container_Perfect_Hash_OpTable::hash (const char *str, unsigned int len)
+{
+ static const unsigned char asso_values[] =
+ {
+#if defined (ACE_MVS)
+ 41, 41, 41, 41, 41, 41, 41, 41, 41, 41,
+ 41, 41, 41, 41, 41, 41, 41, 41, 41, 41,
+ 41, 41, 41, 41, 41, 41, 41, 41, 41, 41,
+ 41, 41, 41, 41, 41, 41, 41, 41, 41, 41,
+ 41, 41, 41, 41, 41, 41, 41, 41, 41, 41,
+ 41, 41, 41, 41, 41, 41, 41, 41, 41, 41,
+ 41, 41, 41, 41, 41, 41, 41, 41, 41, 41,
+ 41, 41, 41, 41, 41, 41, 41, 41, 41, 41,
+ 41, 41, 41, 41, 41, 41, 41, 41, 41, 41,
+ 41, 41, 41, 41, 41, 41, 41, 41, 41, 41,
+ 41, 41, 41, 41, 41, 41, 41, 41, 41, 20,
+ 41, 41, 41, 41, 41, 41, 41, 41, 41, 41,
+ 41, 41, 41, 41, 41, 41, 41, 41, 41, 15,
+ 41, 0, 0, 0, 41, 41, 41, 41, 41, 41,
+ 41, 41, 41, 41, 41, 41, 41, 0, 20, 5,
+ 41, 0, 41, 41, 41, 41, 41, 41, 41, 41,
+ 41, 41, 15, 5, 41, 41, 41, 10, 0, 41,
+ 41, 41, 41, 41, 41, 41, 41, 41, 41, 41,
+ 41, 41, 41, 41, 41, 41, 41, 41, 41, 41,
+ 41, 41, 41, 41, 41, 41, 41, 41, 41, 41,
+ 41, 41, 41, 41, 41, 41, 41, 41, 41, 41,
+ 41, 41, 41, 41, 41, 41, 41, 41, 41, 41,
+ 41, 41, 41, 41, 41, 41, 41, 41, 41, 41,
+ 41, 41, 41, 41, 41, 41, 41, 41, 41, 41,
+ 41, 41, 41, 41, 41, 41, 41, 41, 41, 41,
+ 41, 41, 41, 41, 41, 41,
+#else
+ 41, 41, 41, 41, 41, 41, 41, 41, 41, 41,
+ 41, 41, 41, 41, 41, 41, 41, 41, 41, 41,
+ 41, 41, 41, 41, 41, 41, 41, 41, 41, 41,
+ 41, 41, 41, 41, 41, 41, 41, 41, 41, 41,
+ 41, 41, 41, 41, 41, 41, 41, 41, 41, 41,
+ 41, 41, 41, 41, 41, 41, 41, 41, 41, 41,
+ 41, 41, 41, 41, 41, 41, 41, 41, 41, 41,
+ 41, 41, 41, 41, 41, 41, 41, 41, 41, 41,
+ 41, 41, 41, 41, 41, 41, 41, 41, 41, 41,
+ 41, 41, 41, 41, 41, 20, 41, 15, 41, 0,
+ 0, 0, 41, 41, 41, 41, 41, 41, 0, 20,
+ 5, 41, 0, 41, 41, 15, 5, 41, 41, 41,
+ 10, 0, 41, 41, 41, 41, 41, 41,
+#endif /* ACE_MVS */
+ };
+ return len + asso_values[(int) str[len - 1]] + asso_values[(int) str[0]];
+}
+
+const TAO_operation_db_entry *
+TAO_CORBA_Container_Perfect_Hash_OpTable::lookup (const char *str, unsigned int len)
+{
+ enum
+ {
+ TOTAL_KEYWORDS = 25,
+ MIN_WORD_LENGTH = 5,
+ MAX_WORD_LENGTH = 25,
+ MIN_HASH_VALUE = 6,
+ MAX_HASH_VALUE = 40,
+ HASH_VALUE_RANGE = 35,
+ DUPLICATES = 3,
+ WORDLIST_SIZE = 31
+ };
+
+ static const TAO_operation_db_entry wordlist[] =
+ {
+ {"",0,0},{"",0,0},{"",0,0},{"",0,0},{"",0,0},{"",0,0},
+ {"lookup", &POA_CORBA::Container::lookup_skel, 0},
+ {"destroy", &POA_CORBA::Container::destroy_skel, 0},
+ {"lookup_name", &POA_CORBA::Container::lookup_name_skel, 0},
+ {"create_value", &POA_CORBA::Container::create_value_skel, 0},
+ {"create_module", &POA_CORBA::Container::create_module_skel, 0},
+ {"create_native", &POA_CORBA::Container::create_native_skel, 0},
+ {"create_interface", &POA_CORBA::Container::create_interface_skel, 0},
+ {"create_ext_value", &POA_CORBA::Container::create_ext_value_skel, 0},
+ {"create_union", &POA_CORBA::Container::create_union_skel, 0},
+ {"create_struct", &POA_CORBA::Container::create_struct_skel, 0},
+ {"create_constant", &POA_CORBA::Container::create_constant_skel, 0},
+ {"create_exception", &POA_CORBA::Container::create_exception_skel, 0},
+ {"create_local_interface", &POA_CORBA::Container::create_local_interface_skel, 0},
+ {"contents", &POA_CORBA::Container::contents_skel, 0},
+ {"create_abstract_interface", &POA_CORBA::Container::create_abstract_interface_skel, 0},
+ {"create_value_box", &POA_CORBA::Container::create_value_box_skel, 0},
+ {"create_alias", &POA_CORBA::Container::create_alias_skel, 0},
+ {"_interface", &POA_CORBA::Container::_interface_skel, 0},
+ {"create_enum", &POA_CORBA::Container::create_enum_skel, 0},
+ {"describe_contents", &POA_CORBA::Container::describe_contents_skel, 0},
+ {"_get_def_kind", &POA_CORBA::Container::_get_def_kind_skel, 0},
+ {"_repository_id", &POA_CORBA::Container::_repository_id_skel, 0},
+ {"_component", &POA_CORBA::Container::_component_skel, 0},
+ {"_non_existent", &POA_CORBA::Container::_non_existent_skel, 0},
+ {"_is_a", &POA_CORBA::Container::_is_a_skel, 0},
+ };
+
+ static const signed char lookup[] =
+ {
+ -1, -1, -1, -1, -1, -1, 6, 7, -1, -10, -2, 8, 9, -44,
+ -12, -2, -42, 14, 15, -1, 16, 17, 18, 19, -1, 20, 21, 22,
+ -1, -1, 23, 24, 25, 26, 27, 28, -1, -1, 29, -1, 30,
+ };
+
+ if (len <= MAX_WORD_LENGTH && len >= MIN_WORD_LENGTH)
+ {
+ unsigned int key = hash (str, len);
+
+ if (key <= MAX_HASH_VALUE && key >= MIN_HASH_VALUE)
+ {
+ int slot = lookup[key];
+
+ if (slot >= 0 && slot < WORDLIST_SIZE)
+ {
+ const char *s = wordlist[slot].opname;
+
+ if (*str == *s && !strncmp (str + 1, s + 1, len - 1))
+ return &wordlist[slot];
+ }
+ else if (slot < 0 && slot >= -MAX_HASH_VALUE)
+ return 0;
+ else
+ {
+ unsigned int offset = key + slot + (slot > 0 ? -MAX_HASH_VALUE : MAX_HASH_VALUE);
+ const TAO_operation_db_entry *base = &wordlist[-lookup[offset]];
+ const TAO_operation_db_entry *ptr = base + -lookup[offset + 1];
+
+ while (--ptr >= base)
+ if (*str == *ptr->opname && !strncmp (str + 1, ptr->opname + 1, len - 1))
+ return ptr;
+ }
+ }
+ }
+ return 0;
+}
+
+static TAO_CORBA_Container_Perfect_Hash_OpTable tao_CORBA_Container_optable;
+
+// TAO_IDL - Generated from
+// be\be_visitor_interface/interface_ss.cpp:966
+
+TAO::Collocation_Proxy_Broker *
+CORBA__TAO_Container_Proxy_Broker_Factory_function ( ::CORBA::Object_ptr)
+{
+ return reinterpret_cast<TAO::Collocation_Proxy_Broker *> (0xdead); // Dummy
+}
+
+int
+CORBA__TAO_Container_Proxy_Broker_Factory_Initializer (size_t)
+{
+ CORBA__TAO_Container_Proxy_Broker_Factory_function_pointer =
+ CORBA__TAO_Container_Proxy_Broker_Factory_function;
+
+ return 0;
+}
+
+static int
+CORBA__TAO_Container_Proxy_Broker_Stub_Factory_Initializer_Scarecrow =
+ CORBA__TAO_Container_Proxy_Broker_Factory_Initializer (
+ reinterpret_cast<size_t> (CORBA__TAO_Container_Proxy_Broker_Factory_Initializer)
+ );
+
+// TAO_IDL - Generated from
+// be\be_visitor_interface/interface_ss.cpp:103
+
+POA_CORBA::Container::Container (void)
+ : TAO_ServantBase ()
+{
+ this->optable_ = &tao_CORBA_Container_optable;
+}
+
+POA_CORBA::Container::Container (const Container& rhs)
+ : TAO_Abstract_ServantBase (rhs),
+ TAO_ServantBase (rhs),
+ POA_CORBA::IRObject (rhs)
+{
+}
+
+POA_CORBA::Container::~Container (void)
+{
+}namespace POA_CORBA
+{
+
+
+ // TAO_IDL - Generated from
+ // be\be_visitor_operation/upcall_command_ss.cpp:127
+
+ class lookup_Container
+ : public TAO::Upcall_Command
+ {
+ public:
+ inline lookup_Container (
+ POA_CORBA::Container * servant,
+ TAO_Operation_Details const * operation_details,
+ TAO::Argument * const args[])
+ : servant_ (servant)
+ , operation_details_ (operation_details)
+ , args_ (args)
+ {
+ }
+
+ virtual void execute (ACE_ENV_SINGLE_ARG_DECL)
+ {
+ TAO::SArg_Traits< ::CORBA::Contained>::ret_arg_type retval =
+ TAO::Portable_Server::get_ret_arg< ::CORBA::Contained> (
+ this->operation_details_,
+ this->args_);
+
+ TAO::SArg_Traits< ::CORBA::ScopedName>::in_arg_type arg_1 =
+ TAO::Portable_Server::get_in_arg< ::CORBA::ScopedName> (
+ this->operation_details_,
+ this->args_,
+ 1);
+
+ retval =
+ this->servant_->lookup (
+ arg_1
+ ACE_ENV_ARG_PARAMETER);
+ ACE_CHECK;
+ }
+
+ private:
+ POA_CORBA::Container * const servant_;
+ TAO_Operation_Details const * const operation_details_;
+ TAO::Argument * const * const args_;
+ };
+}
+
+
+// TAO_IDL - Generated from
+// be\be_visitor_operation/operation_ss.cpp:190
+
+void POA_CORBA::Container::lookup_skel (
+ TAO_ServerRequest & server_request,
+ void * TAO_INTERCEPTOR (servant_upcall),
+ void * servant
+ ACE_ENV_ARG_DECL
+ )
+{
+#if TAO_HAS_INTERCEPTORS == 1
+ static ::CORBA::TypeCode_ptr const * const exceptions = 0;
+ static ::CORBA::ULong const nexceptions = 0;
+#endif /* TAO_HAS_INTERCEPTORS */
+
+ TAO::SArg_Traits< ::CORBA::Contained>::ret_val retval;
+ TAO::SArg_Traits< ::CORBA::ScopedName>::in_arg_val _tao_search_name;
+
+ TAO::Argument * const args[] =
+ {
+ &retval,
+ &_tao_search_name
+ };
+
+ static size_t const nargs = 2;
+
+ POA_CORBA::Container * const impl =
+ static_cast<POA_CORBA::Container *> (servant);
+
+ lookup_Container command (
+ impl,
+ server_request.operation_details (),
+ args);
+
+ TAO::Upcall_Wrapper upcall_wrapper;
+ upcall_wrapper.upcall (server_request
+ , args
+ , nargs
+ , command
+#if TAO_HAS_INTERCEPTORS == 1
+ , servant_upcall
+ , exceptions
+ , nexceptions
+#endif /* TAO_HAS_INTERCEPTORS == 1 */
+ ACE_ENV_ARG_PARAMETER);
+ ACE_CHECK;
+}namespace POA_CORBA
+{
+
+
+ // TAO_IDL - Generated from
+ // be\be_visitor_operation/upcall_command_ss.cpp:127
+
+ class contents_Container
+ : public TAO::Upcall_Command
+ {
+ public:
+ inline contents_Container (
+ POA_CORBA::Container * servant,
+ TAO_Operation_Details const * operation_details,
+ TAO::Argument * const args[])
+ : servant_ (servant)
+ , operation_details_ (operation_details)
+ , args_ (args)
+ {
+ }
+
+ virtual void execute (ACE_ENV_SINGLE_ARG_DECL)
+ {
+ TAO::SArg_Traits< ::CORBA::ContainedSeq>::ret_arg_type retval =
+ TAO::Portable_Server::get_ret_arg< ::CORBA::ContainedSeq> (
+ this->operation_details_,
+ this->args_);
+
+ TAO::SArg_Traits< ::CORBA::DefinitionKind>::in_arg_type arg_1 =
+ TAO::Portable_Server::get_in_arg< ::CORBA::DefinitionKind> (
+ this->operation_details_,
+ this->args_,
+ 1);
+
+ TAO::SArg_Traits< ::ACE_InputCDR::to_boolean>::in_arg_type arg_2 =
+ TAO::Portable_Server::get_in_arg< ::ACE_InputCDR::to_boolean> (
+ this->operation_details_,
+ this->args_,
+ 2);
+
+ retval =
+ this->servant_->contents (
+ arg_1
+ , arg_2
+ ACE_ENV_ARG_PARAMETER);
+ ACE_CHECK;
+ }
+
+ private:
+ POA_CORBA::Container * const servant_;
+ TAO_Operation_Details const * const operation_details_;
+ TAO::Argument * const * const args_;
+ };
+}
+
+
+// TAO_IDL - Generated from
+// be\be_visitor_operation/operation_ss.cpp:190
+
+void POA_CORBA::Container::contents_skel (
+ TAO_ServerRequest & server_request,
+ void * TAO_INTERCEPTOR (servant_upcall),
+ void * servant
+ ACE_ENV_ARG_DECL
+ )
+{
+#if TAO_HAS_INTERCEPTORS == 1
+ static ::CORBA::TypeCode_ptr const * const exceptions = 0;
+ static ::CORBA::ULong const nexceptions = 0;
+#endif /* TAO_HAS_INTERCEPTORS */
+
+ TAO::SArg_Traits< ::CORBA::ContainedSeq>::ret_val retval;
+ TAO::SArg_Traits< ::CORBA::DefinitionKind>::in_arg_val _tao_limit_type;
+ TAO::SArg_Traits< ::ACE_InputCDR::to_boolean>::in_arg_val _tao_exclude_inherited;
+
+ TAO::Argument * const args[] =
+ {
+ &retval,
+ &_tao_limit_type,
+ &_tao_exclude_inherited
+ };
+
+ static size_t const nargs = 3;
+
+ POA_CORBA::Container * const impl =
+ static_cast<POA_CORBA::Container *> (servant);
+
+ contents_Container command (
+ impl,
+ server_request.operation_details (),
+ args);
+
+ TAO::Upcall_Wrapper upcall_wrapper;
+ upcall_wrapper.upcall (server_request
+ , args
+ , nargs
+ , command
+#if TAO_HAS_INTERCEPTORS == 1
+ , servant_upcall
+ , exceptions
+ , nexceptions
+#endif /* TAO_HAS_INTERCEPTORS == 1 */
+ ACE_ENV_ARG_PARAMETER);
+ ACE_CHECK;
+}namespace POA_CORBA
+{
+
+
+ // TAO_IDL - Generated from
+ // be\be_visitor_operation/upcall_command_ss.cpp:127
+
+ class lookup_name_Container
+ : public TAO::Upcall_Command
+ {
+ public:
+ inline lookup_name_Container (
+ POA_CORBA::Container * servant,
+ TAO_Operation_Details const * operation_details,
+ TAO::Argument * const args[])
+ : servant_ (servant)
+ , operation_details_ (operation_details)
+ , args_ (args)
+ {
+ }
+
+ virtual void execute (ACE_ENV_SINGLE_ARG_DECL)
+ {
+ TAO::SArg_Traits< ::CORBA::ContainedSeq>::ret_arg_type retval =
+ TAO::Portable_Server::get_ret_arg< ::CORBA::ContainedSeq> (
+ this->operation_details_,
+ this->args_);
+
+ TAO::SArg_Traits< ::CORBA::Identifier>::in_arg_type arg_1 =
+ TAO::Portable_Server::get_in_arg< ::CORBA::Identifier> (
+ this->operation_details_,
+ this->args_,
+ 1);
+
+ TAO::SArg_Traits< ::CORBA::Long>::in_arg_type arg_2 =
+ TAO::Portable_Server::get_in_arg< ::CORBA::Long> (
+ this->operation_details_,
+ this->args_,
+ 2);
+
+ TAO::SArg_Traits< ::CORBA::DefinitionKind>::in_arg_type arg_3 =
+ TAO::Portable_Server::get_in_arg< ::CORBA::DefinitionKind> (
+ this->operation_details_,
+ this->args_,
+ 3);
+
+ TAO::SArg_Traits< ::ACE_InputCDR::to_boolean>::in_arg_type arg_4 =
+ TAO::Portable_Server::get_in_arg< ::ACE_InputCDR::to_boolean> (
+ this->operation_details_,
+ this->args_,
+ 4);
+
+ retval =
+ this->servant_->lookup_name (
+ arg_1
+ , arg_2
+ , arg_3
+ , arg_4
+ ACE_ENV_ARG_PARAMETER);
+ ACE_CHECK;
+ }
+
+ private:
+ POA_CORBA::Container * const servant_;
+ TAO_Operation_Details const * const operation_details_;
+ TAO::Argument * const * const args_;
+ };
+}
+
+
+// TAO_IDL - Generated from
+// be\be_visitor_operation/operation_ss.cpp:190
+
+void POA_CORBA::Container::lookup_name_skel (
+ TAO_ServerRequest & server_request,
+ void * TAO_INTERCEPTOR (servant_upcall),
+ void * servant
+ ACE_ENV_ARG_DECL
+ )
+{
+#if TAO_HAS_INTERCEPTORS == 1
+ static ::CORBA::TypeCode_ptr const * const exceptions = 0;
+ static ::CORBA::ULong const nexceptions = 0;
+#endif /* TAO_HAS_INTERCEPTORS */
+
+ TAO::SArg_Traits< ::CORBA::ContainedSeq>::ret_val retval;
+ TAO::SArg_Traits< ::CORBA::Identifier>::in_arg_val _tao_search_name;
+ TAO::SArg_Traits< ::CORBA::Long>::in_arg_val _tao_levels_to_search;
+ TAO::SArg_Traits< ::CORBA::DefinitionKind>::in_arg_val _tao_limit_type;
+ TAO::SArg_Traits< ::ACE_InputCDR::to_boolean>::in_arg_val _tao_exclude_inherited;
+
+ TAO::Argument * const args[] =
+ {
+ &retval,
+ &_tao_search_name,
+ &_tao_levels_to_search,
+ &_tao_limit_type,
+ &_tao_exclude_inherited
+ };
+
+ static size_t const nargs = 5;
+
+ POA_CORBA::Container * const impl =
+ static_cast<POA_CORBA::Container *> (servant);
+
+ lookup_name_Container command (
+ impl,
+ server_request.operation_details (),
+ args);
+
+ TAO::Upcall_Wrapper upcall_wrapper;
+ upcall_wrapper.upcall (server_request
+ , args
+ , nargs
+ , command
+#if TAO_HAS_INTERCEPTORS == 1
+ , servant_upcall
+ , exceptions
+ , nexceptions
+#endif /* TAO_HAS_INTERCEPTORS == 1 */
+ ACE_ENV_ARG_PARAMETER);
+ ACE_CHECK;
+}namespace POA_CORBA
+{
+
+
+ // TAO_IDL - Generated from
+ // be\be_visitor_operation/upcall_command_ss.cpp:127
+
+ class describe_contents_Container
+ : public TAO::Upcall_Command
+ {
+ public:
+ inline describe_contents_Container (
+ POA_CORBA::Container * servant,
+ TAO_Operation_Details const * operation_details,
+ TAO::Argument * const args[])
+ : servant_ (servant)
+ , operation_details_ (operation_details)
+ , args_ (args)
+ {
+ }
+
+ virtual void execute (ACE_ENV_SINGLE_ARG_DECL)
+ {
+ TAO::SArg_Traits< ::CORBA::Container::DescriptionSeq>::ret_arg_type retval =
+ TAO::Portable_Server::get_ret_arg< ::CORBA::Container::DescriptionSeq> (
+ this->operation_details_,
+ this->args_);
+
+ TAO::SArg_Traits< ::CORBA::DefinitionKind>::in_arg_type arg_1 =
+ TAO::Portable_Server::get_in_arg< ::CORBA::DefinitionKind> (
+ this->operation_details_,
+ this->args_,
+ 1);
+
+ TAO::SArg_Traits< ::ACE_InputCDR::to_boolean>::in_arg_type arg_2 =
+ TAO::Portable_Server::get_in_arg< ::ACE_InputCDR::to_boolean> (
+ this->operation_details_,
+ this->args_,
+ 2);
+
+ TAO::SArg_Traits< ::CORBA::Long>::in_arg_type arg_3 =
+ TAO::Portable_Server::get_in_arg< ::CORBA::Long> (
+ this->operation_details_,
+ this->args_,
+ 3);
+
+ retval =
+ this->servant_->describe_contents (
+ arg_1
+ , arg_2
+ , arg_3
+ ACE_ENV_ARG_PARAMETER);
+ ACE_CHECK;
+ }
+
+ private:
+ POA_CORBA::Container * const servant_;
+ TAO_Operation_Details const * const operation_details_;
+ TAO::Argument * const * const args_;
+ };
+}
+
+
+// TAO_IDL - Generated from
+// be\be_visitor_operation/operation_ss.cpp:190
+
+void POA_CORBA::Container::describe_contents_skel (
+ TAO_ServerRequest & server_request,
+ void * TAO_INTERCEPTOR (servant_upcall),
+ void * servant
+ ACE_ENV_ARG_DECL
+ )
+{
+#if TAO_HAS_INTERCEPTORS == 1
+ static ::CORBA::TypeCode_ptr const * const exceptions = 0;
+ static ::CORBA::ULong const nexceptions = 0;
+#endif /* TAO_HAS_INTERCEPTORS */
+
+ TAO::SArg_Traits< ::CORBA::Container::DescriptionSeq>::ret_val retval;
+ TAO::SArg_Traits< ::CORBA::DefinitionKind>::in_arg_val _tao_limit_type;
+ TAO::SArg_Traits< ::ACE_InputCDR::to_boolean>::in_arg_val _tao_exclude_inherited;
+ TAO::SArg_Traits< ::CORBA::Long>::in_arg_val _tao_max_returned_objs;
+
+ TAO::Argument * const args[] =
+ {
+ &retval,
+ &_tao_limit_type,
+ &_tao_exclude_inherited,
+ &_tao_max_returned_objs
+ };
+
+ static size_t const nargs = 4;
+
+ POA_CORBA::Container * const impl =
+ static_cast<POA_CORBA::Container *> (servant);
+
+ describe_contents_Container command (
+ impl,
+ server_request.operation_details (),
+ args);
+
+ TAO::Upcall_Wrapper upcall_wrapper;
+ upcall_wrapper.upcall (server_request
+ , args
+ , nargs
+ , command
+#if TAO_HAS_INTERCEPTORS == 1
+ , servant_upcall
+ , exceptions
+ , nexceptions
+#endif /* TAO_HAS_INTERCEPTORS == 1 */
+ ACE_ENV_ARG_PARAMETER);
+ ACE_CHECK;
+}namespace POA_CORBA
+{
+
+
+ // TAO_IDL - Generated from
+ // be\be_visitor_operation/upcall_command_ss.cpp:127
+
+ class create_module_Container
+ : public TAO::Upcall_Command
+ {
+ public:
+ inline create_module_Container (
+ POA_CORBA::Container * servant,
+ TAO_Operation_Details const * operation_details,
+ TAO::Argument * const args[])
+ : servant_ (servant)
+ , operation_details_ (operation_details)
+ , args_ (args)
+ {
+ }
+
+ virtual void execute (ACE_ENV_SINGLE_ARG_DECL)
+ {
+ TAO::SArg_Traits< ::CORBA::ModuleDef>::ret_arg_type retval =
+ TAO::Portable_Server::get_ret_arg< ::CORBA::ModuleDef> (
+ this->operation_details_,
+ this->args_);
+
+ TAO::SArg_Traits< ::CORBA::RepositoryId>::in_arg_type arg_1 =
+ TAO::Portable_Server::get_in_arg< ::CORBA::RepositoryId> (
+ this->operation_details_,
+ this->args_,
+ 1);
+
+ TAO::SArg_Traits< ::CORBA::Identifier>::in_arg_type arg_2 =
+ TAO::Portable_Server::get_in_arg< ::CORBA::Identifier> (
+ this->operation_details_,
+ this->args_,
+ 2);
+
+ TAO::SArg_Traits< ::CORBA::VersionSpec>::in_arg_type arg_3 =
+ TAO::Portable_Server::get_in_arg< ::CORBA::VersionSpec> (
+ this->operation_details_,
+ this->args_,
+ 3);
+
+ retval =
+ this->servant_->create_module (
+ arg_1
+ , arg_2
+ , arg_3
+ ACE_ENV_ARG_PARAMETER);
+ ACE_CHECK;
+ }
+
+ private:
+ POA_CORBA::Container * const servant_;
+ TAO_Operation_Details const * const operation_details_;
+ TAO::Argument * const * const args_;
+ };
+}
+
+
+// TAO_IDL - Generated from
+// be\be_visitor_operation/operation_ss.cpp:190
+
+void POA_CORBA::Container::create_module_skel (
+ TAO_ServerRequest & server_request,
+ void * TAO_INTERCEPTOR (servant_upcall),
+ void * servant
+ ACE_ENV_ARG_DECL
+ )
+{
+#if TAO_HAS_INTERCEPTORS == 1
+ static ::CORBA::TypeCode_ptr const * const exceptions = 0;
+ static ::CORBA::ULong const nexceptions = 0;
+#endif /* TAO_HAS_INTERCEPTORS */
+
+ TAO::SArg_Traits< ::CORBA::ModuleDef>::ret_val retval;
+ TAO::SArg_Traits< ::CORBA::RepositoryId>::in_arg_val _tao_id;
+ TAO::SArg_Traits< ::CORBA::Identifier>::in_arg_val _tao_name;
+ TAO::SArg_Traits< ::CORBA::VersionSpec>::in_arg_val _tao_version;
+
+ TAO::Argument * const args[] =
+ {
+ &retval,
+ &_tao_id,
+ &_tao_name,
+ &_tao_version
+ };
+
+ static size_t const nargs = 4;
+
+ POA_CORBA::Container * const impl =
+ static_cast<POA_CORBA::Container *> (servant);
+
+ create_module_Container command (
+ impl,
+ server_request.operation_details (),
+ args);
+
+ TAO::Upcall_Wrapper upcall_wrapper;
+ upcall_wrapper.upcall (server_request
+ , args
+ , nargs
+ , command
+#if TAO_HAS_INTERCEPTORS == 1
+ , servant_upcall
+ , exceptions
+ , nexceptions
+#endif /* TAO_HAS_INTERCEPTORS == 1 */
+ ACE_ENV_ARG_PARAMETER);
+ ACE_CHECK;
+}namespace POA_CORBA
+{
+
+
+ // TAO_IDL - Generated from
+ // be\be_visitor_operation/upcall_command_ss.cpp:127
+
+ class create_constant_Container
+ : public TAO::Upcall_Command
+ {
+ public:
+ inline create_constant_Container (
+ POA_CORBA::Container * servant,
+ TAO_Operation_Details const * operation_details,
+ TAO::Argument * const args[])
+ : servant_ (servant)
+ , operation_details_ (operation_details)
+ , args_ (args)
+ {
+ }
+
+ virtual void execute (ACE_ENV_SINGLE_ARG_DECL)
+ {
+ TAO::SArg_Traits< ::CORBA::ConstantDef>::ret_arg_type retval =
+ TAO::Portable_Server::get_ret_arg< ::CORBA::ConstantDef> (
+ this->operation_details_,
+ this->args_);
+
+ TAO::SArg_Traits< ::CORBA::RepositoryId>::in_arg_type arg_1 =
+ TAO::Portable_Server::get_in_arg< ::CORBA::RepositoryId> (
+ this->operation_details_,
+ this->args_,
+ 1);
+
+ TAO::SArg_Traits< ::CORBA::Identifier>::in_arg_type arg_2 =
+ TAO::Portable_Server::get_in_arg< ::CORBA::Identifier> (
+ this->operation_details_,
+ this->args_,
+ 2);
+
+ TAO::SArg_Traits< ::CORBA::VersionSpec>::in_arg_type arg_3 =
+ TAO::Portable_Server::get_in_arg< ::CORBA::VersionSpec> (
+ this->operation_details_,
+ this->args_,
+ 3);
+
+ TAO::SArg_Traits< ::CORBA::IDLType>::in_arg_type arg_4 =
+ TAO::Portable_Server::get_in_arg< ::CORBA::IDLType> (
+ this->operation_details_,
+ this->args_,
+ 4);
+
+ TAO::SArg_Traits< ::CORBA::Any>::in_arg_type arg_5 =
+ TAO::Portable_Server::get_in_arg< ::CORBA::Any> (
+ this->operation_details_,
+ this->args_,
+ 5);
+
+ retval =
+ this->servant_->create_constant (
+ arg_1
+ , arg_2
+ , arg_3
+ , arg_4
+ , arg_5
+ ACE_ENV_ARG_PARAMETER);
+ ACE_CHECK;
+ }
+
+ private:
+ POA_CORBA::Container * const servant_;
+ TAO_Operation_Details const * const operation_details_;
+ TAO::Argument * const * const args_;
+ };
+}
+
+
+// TAO_IDL - Generated from
+// be\be_visitor_operation/operation_ss.cpp:190
+
+void POA_CORBA::Container::create_constant_skel (
+ TAO_ServerRequest & server_request,
+ void * TAO_INTERCEPTOR (servant_upcall),
+ void * servant
+ ACE_ENV_ARG_DECL
+ )
+{
+#if TAO_HAS_INTERCEPTORS == 1
+ static ::CORBA::TypeCode_ptr const * const exceptions = 0;
+ static ::CORBA::ULong const nexceptions = 0;
+#endif /* TAO_HAS_INTERCEPTORS */
+
+ TAO::SArg_Traits< ::CORBA::ConstantDef>::ret_val retval;
+ TAO::SArg_Traits< ::CORBA::RepositoryId>::in_arg_val _tao_id;
+ TAO::SArg_Traits< ::CORBA::Identifier>::in_arg_val _tao_name;
+ TAO::SArg_Traits< ::CORBA::VersionSpec>::in_arg_val _tao_version;
+ TAO::SArg_Traits< ::CORBA::IDLType>::in_arg_val _tao_type;
+ TAO::SArg_Traits< ::CORBA::Any>::in_arg_val _tao_value;
+
+ TAO::Argument * const args[] =
+ {
+ &retval,
+ &_tao_id,
+ &_tao_name,
+ &_tao_version,
+ &_tao_type,
+ &_tao_value
+ };
+
+ static size_t const nargs = 6;
+
+ POA_CORBA::Container * const impl =
+ static_cast<POA_CORBA::Container *> (servant);
+
+ create_constant_Container command (
+ impl,
+ server_request.operation_details (),
+ args);
+
+ TAO::Upcall_Wrapper upcall_wrapper;
+ upcall_wrapper.upcall (server_request
+ , args
+ , nargs
+ , command
+#if TAO_HAS_INTERCEPTORS == 1
+ , servant_upcall
+ , exceptions
+ , nexceptions
+#endif /* TAO_HAS_INTERCEPTORS == 1 */
+ ACE_ENV_ARG_PARAMETER);
+ ACE_CHECK;
+}namespace POA_CORBA
+{
+
+
+ // TAO_IDL - Generated from
+ // be\be_visitor_operation/upcall_command_ss.cpp:127
+
+ class create_struct_Container
+ : public TAO::Upcall_Command
+ {
+ public:
+ inline create_struct_Container (
+ POA_CORBA::Container * servant,
+ TAO_Operation_Details const * operation_details,
+ TAO::Argument * const args[])
+ : servant_ (servant)
+ , operation_details_ (operation_details)
+ , args_ (args)
+ {
+ }
+
+ virtual void execute (ACE_ENV_SINGLE_ARG_DECL)
+ {
+ TAO::SArg_Traits< ::CORBA::StructDef>::ret_arg_type retval =
+ TAO::Portable_Server::get_ret_arg< ::CORBA::StructDef> (
+ this->operation_details_,
+ this->args_);
+
+ TAO::SArg_Traits< ::CORBA::RepositoryId>::in_arg_type arg_1 =
+ TAO::Portable_Server::get_in_arg< ::CORBA::RepositoryId> (
+ this->operation_details_,
+ this->args_,
+ 1);
+
+ TAO::SArg_Traits< ::CORBA::Identifier>::in_arg_type arg_2 =
+ TAO::Portable_Server::get_in_arg< ::CORBA::Identifier> (
+ this->operation_details_,
+ this->args_,
+ 2);
+
+ TAO::SArg_Traits< ::CORBA::VersionSpec>::in_arg_type arg_3 =
+ TAO::Portable_Server::get_in_arg< ::CORBA::VersionSpec> (
+ this->operation_details_,
+ this->args_,
+ 3);
+
+ TAO::SArg_Traits< ::CORBA::StructMemberSeq>::in_arg_type arg_4 =
+ TAO::Portable_Server::get_in_arg< ::CORBA::StructMemberSeq> (
+ this->operation_details_,
+ this->args_,
+ 4);
+
+ retval =
+ this->servant_->create_struct (
+ arg_1
+ , arg_2
+ , arg_3
+ , arg_4
+ ACE_ENV_ARG_PARAMETER);
+ ACE_CHECK;
+ }
+
+ private:
+ POA_CORBA::Container * const servant_;
+ TAO_Operation_Details const * const operation_details_;
+ TAO::Argument * const * const args_;
+ };
+}
+
+
+// TAO_IDL - Generated from
+// be\be_visitor_operation/operation_ss.cpp:190
+
+void POA_CORBA::Container::create_struct_skel (
+ TAO_ServerRequest & server_request,
+ void * TAO_INTERCEPTOR (servant_upcall),
+ void * servant
+ ACE_ENV_ARG_DECL
+ )
+{
+#if TAO_HAS_INTERCEPTORS == 1
+ static ::CORBA::TypeCode_ptr const * const exceptions = 0;
+ static ::CORBA::ULong const nexceptions = 0;
+#endif /* TAO_HAS_INTERCEPTORS */
+
+ TAO::SArg_Traits< ::CORBA::StructDef>::ret_val retval;
+ TAO::SArg_Traits< ::CORBA::RepositoryId>::in_arg_val _tao_id;
+ TAO::SArg_Traits< ::CORBA::Identifier>::in_arg_val _tao_name;
+ TAO::SArg_Traits< ::CORBA::VersionSpec>::in_arg_val _tao_version;
+ TAO::SArg_Traits< ::CORBA::StructMemberSeq>::in_arg_val _tao_members;
+
+ TAO::Argument * const args[] =
+ {
+ &retval,
+ &_tao_id,
+ &_tao_name,
+ &_tao_version,
+ &_tao_members
+ };
+
+ static size_t const nargs = 5;
+
+ POA_CORBA::Container * const impl =
+ static_cast<POA_CORBA::Container *> (servant);
+
+ create_struct_Container command (
+ impl,
+ server_request.operation_details (),
+ args);
+
+ TAO::Upcall_Wrapper upcall_wrapper;
+ upcall_wrapper.upcall (server_request
+ , args
+ , nargs
+ , command
+#if TAO_HAS_INTERCEPTORS == 1
+ , servant_upcall
+ , exceptions
+ , nexceptions
+#endif /* TAO_HAS_INTERCEPTORS == 1 */
+ ACE_ENV_ARG_PARAMETER);
+ ACE_CHECK;
+}namespace POA_CORBA
+{
+
+
+ // TAO_IDL - Generated from
+ // be\be_visitor_operation/upcall_command_ss.cpp:127
+
+ class create_union_Container
+ : public TAO::Upcall_Command
+ {
+ public:
+ inline create_union_Container (
+ POA_CORBA::Container * servant,
+ TAO_Operation_Details const * operation_details,
+ TAO::Argument * const args[])
+ : servant_ (servant)
+ , operation_details_ (operation_details)
+ , args_ (args)
+ {
+ }
+
+ virtual void execute (ACE_ENV_SINGLE_ARG_DECL)
+ {
+ TAO::SArg_Traits< ::CORBA::UnionDef>::ret_arg_type retval =
+ TAO::Portable_Server::get_ret_arg< ::CORBA::UnionDef> (
+ this->operation_details_,
+ this->args_);
+
+ TAO::SArg_Traits< ::CORBA::RepositoryId>::in_arg_type arg_1 =
+ TAO::Portable_Server::get_in_arg< ::CORBA::RepositoryId> (
+ this->operation_details_,
+ this->args_,
+ 1);
+
+ TAO::SArg_Traits< ::CORBA::Identifier>::in_arg_type arg_2 =
+ TAO::Portable_Server::get_in_arg< ::CORBA::Identifier> (
+ this->operation_details_,
+ this->args_,
+ 2);
+
+ TAO::SArg_Traits< ::CORBA::VersionSpec>::in_arg_type arg_3 =
+ TAO::Portable_Server::get_in_arg< ::CORBA::VersionSpec> (
+ this->operation_details_,
+ this->args_,
+ 3);
+
+ TAO::SArg_Traits< ::CORBA::IDLType>::in_arg_type arg_4 =
+ TAO::Portable_Server::get_in_arg< ::CORBA::IDLType> (
+ this->operation_details_,
+ this->args_,
+ 4);
+
+ TAO::SArg_Traits< ::CORBA::UnionMemberSeq>::in_arg_type arg_5 =
+ TAO::Portable_Server::get_in_arg< ::CORBA::UnionMemberSeq> (
+ this->operation_details_,
+ this->args_,
+ 5);
+
+ retval =
+ this->servant_->create_union (
+ arg_1
+ , arg_2
+ , arg_3
+ , arg_4
+ , arg_5
+ ACE_ENV_ARG_PARAMETER);
+ ACE_CHECK;
+ }
+
+ private:
+ POA_CORBA::Container * const servant_;
+ TAO_Operation_Details const * const operation_details_;
+ TAO::Argument * const * const args_;
+ };
+}
+
+
+// TAO_IDL - Generated from
+// be\be_visitor_operation/operation_ss.cpp:190
+
+void POA_CORBA::Container::create_union_skel (
+ TAO_ServerRequest & server_request,
+ void * TAO_INTERCEPTOR (servant_upcall),
+ void * servant
+ ACE_ENV_ARG_DECL
+ )
+{
+#if TAO_HAS_INTERCEPTORS == 1
+ static ::CORBA::TypeCode_ptr const * const exceptions = 0;
+ static ::CORBA::ULong const nexceptions = 0;
+#endif /* TAO_HAS_INTERCEPTORS */
+
+ TAO::SArg_Traits< ::CORBA::UnionDef>::ret_val retval;
+ TAO::SArg_Traits< ::CORBA::RepositoryId>::in_arg_val _tao_id;
+ TAO::SArg_Traits< ::CORBA::Identifier>::in_arg_val _tao_name;
+ TAO::SArg_Traits< ::CORBA::VersionSpec>::in_arg_val _tao_version;
+ TAO::SArg_Traits< ::CORBA::IDLType>::in_arg_val _tao_discriminator_type;
+ TAO::SArg_Traits< ::CORBA::UnionMemberSeq>::in_arg_val _tao_members;
+
+ TAO::Argument * const args[] =
+ {
+ &retval,
+ &_tao_id,
+ &_tao_name,
+ &_tao_version,
+ &_tao_discriminator_type,
+ &_tao_members
+ };
+
+ static size_t const nargs = 6;
+
+ POA_CORBA::Container * const impl =
+ static_cast<POA_CORBA::Container *> (servant);
+
+ create_union_Container command (
+ impl,
+ server_request.operation_details (),
+ args);
+
+ TAO::Upcall_Wrapper upcall_wrapper;
+ upcall_wrapper.upcall (server_request
+ , args
+ , nargs
+ , command
+#if TAO_HAS_INTERCEPTORS == 1
+ , servant_upcall
+ , exceptions
+ , nexceptions
+#endif /* TAO_HAS_INTERCEPTORS == 1 */
+ ACE_ENV_ARG_PARAMETER);
+ ACE_CHECK;
+}namespace POA_CORBA
+{
+
+
+ // TAO_IDL - Generated from
+ // be\be_visitor_operation/upcall_command_ss.cpp:127
+
+ class create_enum_Container
+ : public TAO::Upcall_Command
+ {
+ public:
+ inline create_enum_Container (
+ POA_CORBA::Container * servant,
+ TAO_Operation_Details const * operation_details,
+ TAO::Argument * const args[])
+ : servant_ (servant)
+ , operation_details_ (operation_details)
+ , args_ (args)
+ {
+ }
+
+ virtual void execute (ACE_ENV_SINGLE_ARG_DECL)
+ {
+ TAO::SArg_Traits< ::CORBA::EnumDef>::ret_arg_type retval =
+ TAO::Portable_Server::get_ret_arg< ::CORBA::EnumDef> (
+ this->operation_details_,
+ this->args_);
+
+ TAO::SArg_Traits< ::CORBA::RepositoryId>::in_arg_type arg_1 =
+ TAO::Portable_Server::get_in_arg< ::CORBA::RepositoryId> (
+ this->operation_details_,
+ this->args_,
+ 1);
+
+ TAO::SArg_Traits< ::CORBA::Identifier>::in_arg_type arg_2 =
+ TAO::Portable_Server::get_in_arg< ::CORBA::Identifier> (
+ this->operation_details_,
+ this->args_,
+ 2);
+
+ TAO::SArg_Traits< ::CORBA::VersionSpec>::in_arg_type arg_3 =
+ TAO::Portable_Server::get_in_arg< ::CORBA::VersionSpec> (
+ this->operation_details_,
+ this->args_,
+ 3);
+
+ TAO::SArg_Traits< ::CORBA::EnumMemberSeq>::in_arg_type arg_4 =
+ TAO::Portable_Server::get_in_arg< ::CORBA::EnumMemberSeq> (
+ this->operation_details_,
+ this->args_,
+ 4);
+
+ retval =
+ this->servant_->create_enum (
+ arg_1
+ , arg_2
+ , arg_3
+ , arg_4
+ ACE_ENV_ARG_PARAMETER);
+ ACE_CHECK;
+ }
+
+ private:
+ POA_CORBA::Container * const servant_;
+ TAO_Operation_Details const * const operation_details_;
+ TAO::Argument * const * const args_;
+ };
+}
+
+
+// TAO_IDL - Generated from
+// be\be_visitor_operation/operation_ss.cpp:190
+
+void POA_CORBA::Container::create_enum_skel (
+ TAO_ServerRequest & server_request,
+ void * TAO_INTERCEPTOR (servant_upcall),
+ void * servant
+ ACE_ENV_ARG_DECL
+ )
+{
+#if TAO_HAS_INTERCEPTORS == 1
+ static ::CORBA::TypeCode_ptr const * const exceptions = 0;
+ static ::CORBA::ULong const nexceptions = 0;
+#endif /* TAO_HAS_INTERCEPTORS */
+
+ TAO::SArg_Traits< ::CORBA::EnumDef>::ret_val retval;
+ TAO::SArg_Traits< ::CORBA::RepositoryId>::in_arg_val _tao_id;
+ TAO::SArg_Traits< ::CORBA::Identifier>::in_arg_val _tao_name;
+ TAO::SArg_Traits< ::CORBA::VersionSpec>::in_arg_val _tao_version;
+ TAO::SArg_Traits< ::CORBA::EnumMemberSeq>::in_arg_val _tao_members;
+
+ TAO::Argument * const args[] =
+ {
+ &retval,
+ &_tao_id,
+ &_tao_name,
+ &_tao_version,
+ &_tao_members
+ };
+
+ static size_t const nargs = 5;
+
+ POA_CORBA::Container * const impl =
+ static_cast<POA_CORBA::Container *> (servant);
+
+ create_enum_Container command (
+ impl,
+ server_request.operation_details (),
+ args);
+
+ TAO::Upcall_Wrapper upcall_wrapper;
+ upcall_wrapper.upcall (server_request
+ , args
+ , nargs
+ , command
+#if TAO_HAS_INTERCEPTORS == 1
+ , servant_upcall
+ , exceptions
+ , nexceptions
+#endif /* TAO_HAS_INTERCEPTORS == 1 */
+ ACE_ENV_ARG_PARAMETER);
+ ACE_CHECK;
+}namespace POA_CORBA
+{
+
+
+ // TAO_IDL - Generated from
+ // be\be_visitor_operation/upcall_command_ss.cpp:127
+
+ class create_alias_Container
+ : public TAO::Upcall_Command
+ {
+ public:
+ inline create_alias_Container (
+ POA_CORBA::Container * servant,
+ TAO_Operation_Details const * operation_details,
+ TAO::Argument * const args[])
+ : servant_ (servant)
+ , operation_details_ (operation_details)
+ , args_ (args)
+ {
+ }
+
+ virtual void execute (ACE_ENV_SINGLE_ARG_DECL)
+ {
+ TAO::SArg_Traits< ::CORBA::AliasDef>::ret_arg_type retval =
+ TAO::Portable_Server::get_ret_arg< ::CORBA::AliasDef> (
+ this->operation_details_,
+ this->args_);
+
+ TAO::SArg_Traits< ::CORBA::RepositoryId>::in_arg_type arg_1 =
+ TAO::Portable_Server::get_in_arg< ::CORBA::RepositoryId> (
+ this->operation_details_,
+ this->args_,
+ 1);
+
+ TAO::SArg_Traits< ::CORBA::Identifier>::in_arg_type arg_2 =
+ TAO::Portable_Server::get_in_arg< ::CORBA::Identifier> (
+ this->operation_details_,
+ this->args_,
+ 2);
+
+ TAO::SArg_Traits< ::CORBA::VersionSpec>::in_arg_type arg_3 =
+ TAO::Portable_Server::get_in_arg< ::CORBA::VersionSpec> (
+ this->operation_details_,
+ this->args_,
+ 3);
+
+ TAO::SArg_Traits< ::CORBA::IDLType>::in_arg_type arg_4 =
+ TAO::Portable_Server::get_in_arg< ::CORBA::IDLType> (
+ this->operation_details_,
+ this->args_,
+ 4);
+
+ retval =
+ this->servant_->create_alias (
+ arg_1
+ , arg_2
+ , arg_3
+ , arg_4
+ ACE_ENV_ARG_PARAMETER);
+ ACE_CHECK;
+ }
+
+ private:
+ POA_CORBA::Container * const servant_;
+ TAO_Operation_Details const * const operation_details_;
+ TAO::Argument * const * const args_;
+ };
+}
+
+
+// TAO_IDL - Generated from
+// be\be_visitor_operation/operation_ss.cpp:190
+
+void POA_CORBA::Container::create_alias_skel (
+ TAO_ServerRequest & server_request,
+ void * TAO_INTERCEPTOR (servant_upcall),
+ void * servant
+ ACE_ENV_ARG_DECL
+ )
+{
+#if TAO_HAS_INTERCEPTORS == 1
+ static ::CORBA::TypeCode_ptr const * const exceptions = 0;
+ static ::CORBA::ULong const nexceptions = 0;
+#endif /* TAO_HAS_INTERCEPTORS */
+
+ TAO::SArg_Traits< ::CORBA::AliasDef>::ret_val retval;
+ TAO::SArg_Traits< ::CORBA::RepositoryId>::in_arg_val _tao_id;
+ TAO::SArg_Traits< ::CORBA::Identifier>::in_arg_val _tao_name;
+ TAO::SArg_Traits< ::CORBA::VersionSpec>::in_arg_val _tao_version;
+ TAO::SArg_Traits< ::CORBA::IDLType>::in_arg_val _tao_original_type;
+
+ TAO::Argument * const args[] =
+ {
+ &retval,
+ &_tao_id,
+ &_tao_name,
+ &_tao_version,
+ &_tao_original_type
+ };
+
+ static size_t const nargs = 5;
+
+ POA_CORBA::Container * const impl =
+ static_cast<POA_CORBA::Container *> (servant);
+
+ create_alias_Container command (
+ impl,
+ server_request.operation_details (),
+ args);
+
+ TAO::Upcall_Wrapper upcall_wrapper;
+ upcall_wrapper.upcall (server_request
+ , args
+ , nargs
+ , command
+#if TAO_HAS_INTERCEPTORS == 1
+ , servant_upcall
+ , exceptions
+ , nexceptions
+#endif /* TAO_HAS_INTERCEPTORS == 1 */
+ ACE_ENV_ARG_PARAMETER);
+ ACE_CHECK;
+}namespace POA_CORBA
+{
+
+
+ // TAO_IDL - Generated from
+ // be\be_visitor_operation/upcall_command_ss.cpp:127
+
+ class create_interface_Container
+ : public TAO::Upcall_Command
+ {
+ public:
+ inline create_interface_Container (
+ POA_CORBA::Container * servant,
+ TAO_Operation_Details const * operation_details,
+ TAO::Argument * const args[])
+ : servant_ (servant)
+ , operation_details_ (operation_details)
+ , args_ (args)
+ {
+ }
+
+ virtual void execute (ACE_ENV_SINGLE_ARG_DECL)
+ {
+ TAO::SArg_Traits< ::CORBA::InterfaceDef>::ret_arg_type retval =
+ TAO::Portable_Server::get_ret_arg< ::CORBA::InterfaceDef> (
+ this->operation_details_,
+ this->args_);
+
+ TAO::SArg_Traits< ::CORBA::RepositoryId>::in_arg_type arg_1 =
+ TAO::Portable_Server::get_in_arg< ::CORBA::RepositoryId> (
+ this->operation_details_,
+ this->args_,
+ 1);
+
+ TAO::SArg_Traits< ::CORBA::Identifier>::in_arg_type arg_2 =
+ TAO::Portable_Server::get_in_arg< ::CORBA::Identifier> (
+ this->operation_details_,
+ this->args_,
+ 2);
+
+ TAO::SArg_Traits< ::CORBA::VersionSpec>::in_arg_type arg_3 =
+ TAO::Portable_Server::get_in_arg< ::CORBA::VersionSpec> (
+ this->operation_details_,
+ this->args_,
+ 3);
+
+ TAO::SArg_Traits< ::CORBA::InterfaceDefSeq>::in_arg_type arg_4 =
+ TAO::Portable_Server::get_in_arg< ::CORBA::InterfaceDefSeq> (
+ this->operation_details_,
+ this->args_,
+ 4);
+
+ retval =
+ this->servant_->create_interface (
+ arg_1
+ , arg_2
+ , arg_3
+ , arg_4
+ ACE_ENV_ARG_PARAMETER);
+ ACE_CHECK;
+ }
+
+ private:
+ POA_CORBA::Container * const servant_;
+ TAO_Operation_Details const * const operation_details_;
+ TAO::Argument * const * const args_;
+ };
+}
+
+
+// TAO_IDL - Generated from
+// be\be_visitor_operation/operation_ss.cpp:190
+
+void POA_CORBA::Container::create_interface_skel (
+ TAO_ServerRequest & server_request,
+ void * TAO_INTERCEPTOR (servant_upcall),
+ void * servant
+ ACE_ENV_ARG_DECL
+ )
+{
+#if TAO_HAS_INTERCEPTORS == 1
+ static ::CORBA::TypeCode_ptr const * const exceptions = 0;
+ static ::CORBA::ULong const nexceptions = 0;
+#endif /* TAO_HAS_INTERCEPTORS */
+
+ TAO::SArg_Traits< ::CORBA::InterfaceDef>::ret_val retval;
+ TAO::SArg_Traits< ::CORBA::RepositoryId>::in_arg_val _tao_id;
+ TAO::SArg_Traits< ::CORBA::Identifier>::in_arg_val _tao_name;
+ TAO::SArg_Traits< ::CORBA::VersionSpec>::in_arg_val _tao_version;
+ TAO::SArg_Traits< ::CORBA::InterfaceDefSeq>::in_arg_val _tao_base_interfaces;
+
+ TAO::Argument * const args[] =
+ {
+ &retval,
+ &_tao_id,
+ &_tao_name,
+ &_tao_version,
+ &_tao_base_interfaces
+ };
+
+ static size_t const nargs = 5;
+
+ POA_CORBA::Container * const impl =
+ static_cast<POA_CORBA::Container *> (servant);
+
+ create_interface_Container command (
+ impl,
+ server_request.operation_details (),
+ args);
+
+ TAO::Upcall_Wrapper upcall_wrapper;
+ upcall_wrapper.upcall (server_request
+ , args
+ , nargs
+ , command
+#if TAO_HAS_INTERCEPTORS == 1
+ , servant_upcall
+ , exceptions
+ , nexceptions
+#endif /* TAO_HAS_INTERCEPTORS == 1 */
+ ACE_ENV_ARG_PARAMETER);
+ ACE_CHECK;
+}namespace POA_CORBA
+{
+
+
+ // TAO_IDL - Generated from
+ // be\be_visitor_operation/upcall_command_ss.cpp:127
+
+ class create_value_Container
+ : public TAO::Upcall_Command
+ {
+ public:
+ inline create_value_Container (
+ POA_CORBA::Container * servant,
+ TAO_Operation_Details const * operation_details,
+ TAO::Argument * const args[])
+ : servant_ (servant)
+ , operation_details_ (operation_details)
+ , args_ (args)
+ {
+ }
+
+ virtual void execute (ACE_ENV_SINGLE_ARG_DECL)
+ {
+ TAO::SArg_Traits< ::CORBA::ValueDef>::ret_arg_type retval =
+ TAO::Portable_Server::get_ret_arg< ::CORBA::ValueDef> (
+ this->operation_details_,
+ this->args_);
+
+ TAO::SArg_Traits< ::CORBA::RepositoryId>::in_arg_type arg_1 =
+ TAO::Portable_Server::get_in_arg< ::CORBA::RepositoryId> (
+ this->operation_details_,
+ this->args_,
+ 1);
+
+ TAO::SArg_Traits< ::CORBA::Identifier>::in_arg_type arg_2 =
+ TAO::Portable_Server::get_in_arg< ::CORBA::Identifier> (
+ this->operation_details_,
+ this->args_,
+ 2);
+
+ TAO::SArg_Traits< ::CORBA::VersionSpec>::in_arg_type arg_3 =
+ TAO::Portable_Server::get_in_arg< ::CORBA::VersionSpec> (
+ this->operation_details_,
+ this->args_,
+ 3);
+
+ TAO::SArg_Traits< ::ACE_InputCDR::to_boolean>::in_arg_type arg_4 =
+ TAO::Portable_Server::get_in_arg< ::ACE_InputCDR::to_boolean> (
+ this->operation_details_,
+ this->args_,
+ 4);
+
+ TAO::SArg_Traits< ::ACE_InputCDR::to_boolean>::in_arg_type arg_5 =
+ TAO::Portable_Server::get_in_arg< ::ACE_InputCDR::to_boolean> (
+ this->operation_details_,
+ this->args_,
+ 5);
+
+ TAO::SArg_Traits< ::CORBA::ValueDef>::in_arg_type arg_6 =
+ TAO::Portable_Server::get_in_arg< ::CORBA::ValueDef> (
+ this->operation_details_,
+ this->args_,
+ 6);
+
+ TAO::SArg_Traits< ::ACE_InputCDR::to_boolean>::in_arg_type arg_7 =
+ TAO::Portable_Server::get_in_arg< ::ACE_InputCDR::to_boolean> (
+ this->operation_details_,
+ this->args_,
+ 7);
+
+ TAO::SArg_Traits< ::CORBA::ValueDefSeq>::in_arg_type arg_8 =
+ TAO::Portable_Server::get_in_arg< ::CORBA::ValueDefSeq> (
+ this->operation_details_,
+ this->args_,
+ 8);
+
+ TAO::SArg_Traits< ::CORBA::InterfaceDefSeq>::in_arg_type arg_9 =
+ TAO::Portable_Server::get_in_arg< ::CORBA::InterfaceDefSeq> (
+ this->operation_details_,
+ this->args_,
+ 9);
+
+ TAO::SArg_Traits< ::CORBA::InitializerSeq>::in_arg_type arg_10 =
+ TAO::Portable_Server::get_in_arg< ::CORBA::InitializerSeq> (
+ this->operation_details_,
+ this->args_,
+ 10);
+
+ retval =
+ this->servant_->create_value (
+ arg_1
+ , arg_2
+ , arg_3
+ , arg_4
+ , arg_5
+ , arg_6
+ , arg_7
+ , arg_8
+ , arg_9
+ , arg_10
+ ACE_ENV_ARG_PARAMETER);
+ ACE_CHECK;
+ }
+
+ private:
+ POA_CORBA::Container * const servant_;
+ TAO_Operation_Details const * const operation_details_;
+ TAO::Argument * const * const args_;
+ };
+}
+
+
+// TAO_IDL - Generated from
+// be\be_visitor_operation/operation_ss.cpp:190
+
+void POA_CORBA::Container::create_value_skel (
+ TAO_ServerRequest & server_request,
+ void * TAO_INTERCEPTOR (servant_upcall),
+ void * servant
+ ACE_ENV_ARG_DECL
+ )
+{
+#if TAO_HAS_INTERCEPTORS == 1
+ static ::CORBA::TypeCode_ptr const * const exceptions = 0;
+ static ::CORBA::ULong const nexceptions = 0;
+#endif /* TAO_HAS_INTERCEPTORS */
+
+ TAO::SArg_Traits< ::CORBA::ValueDef>::ret_val retval;
+ TAO::SArg_Traits< ::CORBA::RepositoryId>::in_arg_val _tao_id;
+ TAO::SArg_Traits< ::CORBA::Identifier>::in_arg_val _tao_name;
+ TAO::SArg_Traits< ::CORBA::VersionSpec>::in_arg_val _tao_version;
+ TAO::SArg_Traits< ::ACE_InputCDR::to_boolean>::in_arg_val _tao_is_custom;
+ TAO::SArg_Traits< ::ACE_InputCDR::to_boolean>::in_arg_val _tao_is_abstract;
+ TAO::SArg_Traits< ::CORBA::ValueDef>::in_arg_val _tao_base_value;
+ TAO::SArg_Traits< ::ACE_InputCDR::to_boolean>::in_arg_val _tao_is_truncatable;
+ TAO::SArg_Traits< ::CORBA::ValueDefSeq>::in_arg_val _tao_abstract_base_values;
+ TAO::SArg_Traits< ::CORBA::InterfaceDefSeq>::in_arg_val _tao_supported_interfaces;
+ TAO::SArg_Traits< ::CORBA::InitializerSeq>::in_arg_val _tao_initializers;
+
+ TAO::Argument * const args[] =
+ {
+ &retval,
+ &_tao_id,
+ &_tao_name,
+ &_tao_version,
+ &_tao_is_custom,
+ &_tao_is_abstract,
+ &_tao_base_value,
+ &_tao_is_truncatable,
+ &_tao_abstract_base_values,
+ &_tao_supported_interfaces,
+ &_tao_initializers
+ };
+
+ static size_t const nargs = 11;
+
+ POA_CORBA::Container * const impl =
+ static_cast<POA_CORBA::Container *> (servant);
+
+ create_value_Container command (
+ impl,
+ server_request.operation_details (),
+ args);
+
+ TAO::Upcall_Wrapper upcall_wrapper;
+ upcall_wrapper.upcall (server_request
+ , args
+ , nargs
+ , command
+#if TAO_HAS_INTERCEPTORS == 1
+ , servant_upcall
+ , exceptions
+ , nexceptions
+#endif /* TAO_HAS_INTERCEPTORS == 1 */
+ ACE_ENV_ARG_PARAMETER);
+ ACE_CHECK;
+}namespace POA_CORBA
+{
+
+
+ // TAO_IDL - Generated from
+ // be\be_visitor_operation/upcall_command_ss.cpp:127
+
+ class create_value_box_Container
+ : public TAO::Upcall_Command
+ {
+ public:
+ inline create_value_box_Container (
+ POA_CORBA::Container * servant,
+ TAO_Operation_Details const * operation_details,
+ TAO::Argument * const args[])
+ : servant_ (servant)
+ , operation_details_ (operation_details)
+ , args_ (args)
+ {
+ }
+
+ virtual void execute (ACE_ENV_SINGLE_ARG_DECL)
+ {
+ TAO::SArg_Traits< ::CORBA::ValueBoxDef>::ret_arg_type retval =
+ TAO::Portable_Server::get_ret_arg< ::CORBA::ValueBoxDef> (
+ this->operation_details_,
+ this->args_);
+
+ TAO::SArg_Traits< ::CORBA::RepositoryId>::in_arg_type arg_1 =
+ TAO::Portable_Server::get_in_arg< ::CORBA::RepositoryId> (
+ this->operation_details_,
+ this->args_,
+ 1);
+
+ TAO::SArg_Traits< ::CORBA::Identifier>::in_arg_type arg_2 =
+ TAO::Portable_Server::get_in_arg< ::CORBA::Identifier> (
+ this->operation_details_,
+ this->args_,
+ 2);
+
+ TAO::SArg_Traits< ::CORBA::VersionSpec>::in_arg_type arg_3 =
+ TAO::Portable_Server::get_in_arg< ::CORBA::VersionSpec> (
+ this->operation_details_,
+ this->args_,
+ 3);
+
+ TAO::SArg_Traits< ::CORBA::IDLType>::in_arg_type arg_4 =
+ TAO::Portable_Server::get_in_arg< ::CORBA::IDLType> (
+ this->operation_details_,
+ this->args_,
+ 4);
+
+ retval =
+ this->servant_->create_value_box (
+ arg_1
+ , arg_2
+ , arg_3
+ , arg_4
+ ACE_ENV_ARG_PARAMETER);
+ ACE_CHECK;
+ }
+
+ private:
+ POA_CORBA::Container * const servant_;
+ TAO_Operation_Details const * const operation_details_;
+ TAO::Argument * const * const args_;
+ };
+}
+
+
+// TAO_IDL - Generated from
+// be\be_visitor_operation/operation_ss.cpp:190
+
+void POA_CORBA::Container::create_value_box_skel (
+ TAO_ServerRequest & server_request,
+ void * TAO_INTERCEPTOR (servant_upcall),
+ void * servant
+ ACE_ENV_ARG_DECL
+ )
+{
+#if TAO_HAS_INTERCEPTORS == 1
+ static ::CORBA::TypeCode_ptr const * const exceptions = 0;
+ static ::CORBA::ULong const nexceptions = 0;
+#endif /* TAO_HAS_INTERCEPTORS */
+
+ TAO::SArg_Traits< ::CORBA::ValueBoxDef>::ret_val retval;
+ TAO::SArg_Traits< ::CORBA::RepositoryId>::in_arg_val _tao_id;
+ TAO::SArg_Traits< ::CORBA::Identifier>::in_arg_val _tao_name;
+ TAO::SArg_Traits< ::CORBA::VersionSpec>::in_arg_val _tao_version;
+ TAO::SArg_Traits< ::CORBA::IDLType>::in_arg_val _tao_original_type_def;
+
+ TAO::Argument * const args[] =
+ {
+ &retval,
+ &_tao_id,
+ &_tao_name,
+ &_tao_version,
+ &_tao_original_type_def
+ };
+
+ static size_t const nargs = 5;
+
+ POA_CORBA::Container * const impl =
+ static_cast<POA_CORBA::Container *> (servant);
+
+ create_value_box_Container command (
+ impl,
+ server_request.operation_details (),
+ args);
+
+ TAO::Upcall_Wrapper upcall_wrapper;
+ upcall_wrapper.upcall (server_request
+ , args
+ , nargs
+ , command
+#if TAO_HAS_INTERCEPTORS == 1
+ , servant_upcall
+ , exceptions
+ , nexceptions
+#endif /* TAO_HAS_INTERCEPTORS == 1 */
+ ACE_ENV_ARG_PARAMETER);
+ ACE_CHECK;
+}namespace POA_CORBA
+{
+
+
+ // TAO_IDL - Generated from
+ // be\be_visitor_operation/upcall_command_ss.cpp:127
+
+ class create_exception_Container
+ : public TAO::Upcall_Command
+ {
+ public:
+ inline create_exception_Container (
+ POA_CORBA::Container * servant,
+ TAO_Operation_Details const * operation_details,
+ TAO::Argument * const args[])
+ : servant_ (servant)
+ , operation_details_ (operation_details)
+ , args_ (args)
+ {
+ }
+
+ virtual void execute (ACE_ENV_SINGLE_ARG_DECL)
+ {
+ TAO::SArg_Traits< ::CORBA::ExceptionDef>::ret_arg_type retval =
+ TAO::Portable_Server::get_ret_arg< ::CORBA::ExceptionDef> (
+ this->operation_details_,
+ this->args_);
+
+ TAO::SArg_Traits< ::CORBA::RepositoryId>::in_arg_type arg_1 =
+ TAO::Portable_Server::get_in_arg< ::CORBA::RepositoryId> (
+ this->operation_details_,
+ this->args_,
+ 1);
+
+ TAO::SArg_Traits< ::CORBA::Identifier>::in_arg_type arg_2 =
+ TAO::Portable_Server::get_in_arg< ::CORBA::Identifier> (
+ this->operation_details_,
+ this->args_,
+ 2);
+
+ TAO::SArg_Traits< ::CORBA::VersionSpec>::in_arg_type arg_3 =
+ TAO::Portable_Server::get_in_arg< ::CORBA::VersionSpec> (
+ this->operation_details_,
+ this->args_,
+ 3);
+
+ TAO::SArg_Traits< ::CORBA::StructMemberSeq>::in_arg_type arg_4 =
+ TAO::Portable_Server::get_in_arg< ::CORBA::StructMemberSeq> (
+ this->operation_details_,
+ this->args_,
+ 4);
+
+ retval =
+ this->servant_->create_exception (
+ arg_1
+ , arg_2
+ , arg_3
+ , arg_4
+ ACE_ENV_ARG_PARAMETER);
+ ACE_CHECK;
+ }
+
+ private:
+ POA_CORBA::Container * const servant_;
+ TAO_Operation_Details const * const operation_details_;
+ TAO::Argument * const * const args_;
+ };
+}
+
+
+// TAO_IDL - Generated from
+// be\be_visitor_operation/operation_ss.cpp:190
+
+void POA_CORBA::Container::create_exception_skel (
+ TAO_ServerRequest & server_request,
+ void * TAO_INTERCEPTOR (servant_upcall),
+ void * servant
+ ACE_ENV_ARG_DECL
+ )
+{
+#if TAO_HAS_INTERCEPTORS == 1
+ static ::CORBA::TypeCode_ptr const * const exceptions = 0;
+ static ::CORBA::ULong const nexceptions = 0;
+#endif /* TAO_HAS_INTERCEPTORS */
+
+ TAO::SArg_Traits< ::CORBA::ExceptionDef>::ret_val retval;
+ TAO::SArg_Traits< ::CORBA::RepositoryId>::in_arg_val _tao_id;
+ TAO::SArg_Traits< ::CORBA::Identifier>::in_arg_val _tao_name;
+ TAO::SArg_Traits< ::CORBA::VersionSpec>::in_arg_val _tao_version;
+ TAO::SArg_Traits< ::CORBA::StructMemberSeq>::in_arg_val _tao_members;
+
+ TAO::Argument * const args[] =
+ {
+ &retval,
+ &_tao_id,
+ &_tao_name,
+ &_tao_version,
+ &_tao_members
+ };
+
+ static size_t const nargs = 5;
+
+ POA_CORBA::Container * const impl =
+ static_cast<POA_CORBA::Container *> (servant);
+
+ create_exception_Container command (
+ impl,
+ server_request.operation_details (),
+ args);
+
+ TAO::Upcall_Wrapper upcall_wrapper;
+ upcall_wrapper.upcall (server_request
+ , args
+ , nargs
+ , command
+#if TAO_HAS_INTERCEPTORS == 1
+ , servant_upcall
+ , exceptions
+ , nexceptions
+#endif /* TAO_HAS_INTERCEPTORS == 1 */
+ ACE_ENV_ARG_PARAMETER);
+ ACE_CHECK;
+}namespace POA_CORBA
+{
+
+
+ // TAO_IDL - Generated from
+ // be\be_visitor_operation/upcall_command_ss.cpp:127
+
+ class create_native_Container
+ : public TAO::Upcall_Command
+ {
+ public:
+ inline create_native_Container (
+ POA_CORBA::Container * servant,
+ TAO_Operation_Details const * operation_details,
+ TAO::Argument * const args[])
+ : servant_ (servant)
+ , operation_details_ (operation_details)
+ , args_ (args)
+ {
+ }
+
+ virtual void execute (ACE_ENV_SINGLE_ARG_DECL)
+ {
+ TAO::SArg_Traits< ::CORBA::NativeDef>::ret_arg_type retval =
+ TAO::Portable_Server::get_ret_arg< ::CORBA::NativeDef> (
+ this->operation_details_,
+ this->args_);
+
+ TAO::SArg_Traits< ::CORBA::RepositoryId>::in_arg_type arg_1 =
+ TAO::Portable_Server::get_in_arg< ::CORBA::RepositoryId> (
+ this->operation_details_,
+ this->args_,
+ 1);
+
+ TAO::SArg_Traits< ::CORBA::Identifier>::in_arg_type arg_2 =
+ TAO::Portable_Server::get_in_arg< ::CORBA::Identifier> (
+ this->operation_details_,
+ this->args_,
+ 2);
+
+ TAO::SArg_Traits< ::CORBA::VersionSpec>::in_arg_type arg_3 =
+ TAO::Portable_Server::get_in_arg< ::CORBA::VersionSpec> (
+ this->operation_details_,
+ this->args_,
+ 3);
+
+ retval =
+ this->servant_->create_native (
+ arg_1
+ , arg_2
+ , arg_3
+ ACE_ENV_ARG_PARAMETER);
+ ACE_CHECK;
+ }
+
+ private:
+ POA_CORBA::Container * const servant_;
+ TAO_Operation_Details const * const operation_details_;
+ TAO::Argument * const * const args_;
+ };
+}
+
+
+// TAO_IDL - Generated from
+// be\be_visitor_operation/operation_ss.cpp:190
+
+void POA_CORBA::Container::create_native_skel (
+ TAO_ServerRequest & server_request,
+ void * TAO_INTERCEPTOR (servant_upcall),
+ void * servant
+ ACE_ENV_ARG_DECL
+ )
+{
+#if TAO_HAS_INTERCEPTORS == 1
+ static ::CORBA::TypeCode_ptr const * const exceptions = 0;
+ static ::CORBA::ULong const nexceptions = 0;
+#endif /* TAO_HAS_INTERCEPTORS */
+
+ TAO::SArg_Traits< ::CORBA::NativeDef>::ret_val retval;
+ TAO::SArg_Traits< ::CORBA::RepositoryId>::in_arg_val _tao_id;
+ TAO::SArg_Traits< ::CORBA::Identifier>::in_arg_val _tao_name;
+ TAO::SArg_Traits< ::CORBA::VersionSpec>::in_arg_val _tao_version;
+
+ TAO::Argument * const args[] =
+ {
+ &retval,
+ &_tao_id,
+ &_tao_name,
+ &_tao_version
+ };
+
+ static size_t const nargs = 4;
+
+ POA_CORBA::Container * const impl =
+ static_cast<POA_CORBA::Container *> (servant);
+
+ create_native_Container command (
+ impl,
+ server_request.operation_details (),
+ args);
+
+ TAO::Upcall_Wrapper upcall_wrapper;
+ upcall_wrapper.upcall (server_request
+ , args
+ , nargs
+ , command
+#if TAO_HAS_INTERCEPTORS == 1
+ , servant_upcall
+ , exceptions
+ , nexceptions
+#endif /* TAO_HAS_INTERCEPTORS == 1 */
+ ACE_ENV_ARG_PARAMETER);
+ ACE_CHECK;
+}namespace POA_CORBA
+{
+
+
+ // TAO_IDL - Generated from
+ // be\be_visitor_operation/upcall_command_ss.cpp:127
+
+ class create_abstract_interface_Container
+ : public TAO::Upcall_Command
+ {
+ public:
+ inline create_abstract_interface_Container (
+ POA_CORBA::Container * servant,
+ TAO_Operation_Details const * operation_details,
+ TAO::Argument * const args[])
+ : servant_ (servant)
+ , operation_details_ (operation_details)
+ , args_ (args)
+ {
+ }
+
+ virtual void execute (ACE_ENV_SINGLE_ARG_DECL)
+ {
+ TAO::SArg_Traits< ::CORBA::AbstractInterfaceDef>::ret_arg_type retval =
+ TAO::Portable_Server::get_ret_arg< ::CORBA::AbstractInterfaceDef> (
+ this->operation_details_,
+ this->args_);
+
+ TAO::SArg_Traits< ::CORBA::RepositoryId>::in_arg_type arg_1 =
+ TAO::Portable_Server::get_in_arg< ::CORBA::RepositoryId> (
+ this->operation_details_,
+ this->args_,
+ 1);
+
+ TAO::SArg_Traits< ::CORBA::Identifier>::in_arg_type arg_2 =
+ TAO::Portable_Server::get_in_arg< ::CORBA::Identifier> (
+ this->operation_details_,
+ this->args_,
+ 2);
+
+ TAO::SArg_Traits< ::CORBA::VersionSpec>::in_arg_type arg_3 =
+ TAO::Portable_Server::get_in_arg< ::CORBA::VersionSpec> (
+ this->operation_details_,
+ this->args_,
+ 3);
+
+ TAO::SArg_Traits< ::CORBA::AbstractInterfaceDefSeq>::in_arg_type arg_4 =
+ TAO::Portable_Server::get_in_arg< ::CORBA::AbstractInterfaceDefSeq> (
+ this->operation_details_,
+ this->args_,
+ 4);
+
+ retval =
+ this->servant_->create_abstract_interface (
+ arg_1
+ , arg_2
+ , arg_3
+ , arg_4
+ ACE_ENV_ARG_PARAMETER);
+ ACE_CHECK;
+ }
+
+ private:
+ POA_CORBA::Container * const servant_;
+ TAO_Operation_Details const * const operation_details_;
+ TAO::Argument * const * const args_;
+ };
+}
+
+
+// TAO_IDL - Generated from
+// be\be_visitor_operation/operation_ss.cpp:190
+
+void POA_CORBA::Container::create_abstract_interface_skel (
+ TAO_ServerRequest & server_request,
+ void * TAO_INTERCEPTOR (servant_upcall),
+ void * servant
+ ACE_ENV_ARG_DECL
+ )
+{
+#if TAO_HAS_INTERCEPTORS == 1
+ static ::CORBA::TypeCode_ptr const * const exceptions = 0;
+ static ::CORBA::ULong const nexceptions = 0;
+#endif /* TAO_HAS_INTERCEPTORS */
+
+ TAO::SArg_Traits< ::CORBA::AbstractInterfaceDef>::ret_val retval;
+ TAO::SArg_Traits< ::CORBA::RepositoryId>::in_arg_val _tao_id;
+ TAO::SArg_Traits< ::CORBA::Identifier>::in_arg_val _tao_name;
+ TAO::SArg_Traits< ::CORBA::VersionSpec>::in_arg_val _tao_version;
+ TAO::SArg_Traits< ::CORBA::AbstractInterfaceDefSeq>::in_arg_val _tao_base_interfaces;
+
+ TAO::Argument * const args[] =
+ {
+ &retval,
+ &_tao_id,
+ &_tao_name,
+ &_tao_version,
+ &_tao_base_interfaces
+ };
+
+ static size_t const nargs = 5;
+
+ POA_CORBA::Container * const impl =
+ static_cast<POA_CORBA::Container *> (servant);
+
+ create_abstract_interface_Container command (
+ impl,
+ server_request.operation_details (),
+ args);
+
+ TAO::Upcall_Wrapper upcall_wrapper;
+ upcall_wrapper.upcall (server_request
+ , args
+ , nargs
+ , command
+#if TAO_HAS_INTERCEPTORS == 1
+ , servant_upcall
+ , exceptions
+ , nexceptions
+#endif /* TAO_HAS_INTERCEPTORS == 1 */
+ ACE_ENV_ARG_PARAMETER);
+ ACE_CHECK;
+}namespace POA_CORBA
+{
+
+
+ // TAO_IDL - Generated from
+ // be\be_visitor_operation/upcall_command_ss.cpp:127
+
+ class create_local_interface_Container
+ : public TAO::Upcall_Command
+ {
+ public:
+ inline create_local_interface_Container (
+ POA_CORBA::Container * servant,
+ TAO_Operation_Details const * operation_details,
+ TAO::Argument * const args[])
+ : servant_ (servant)
+ , operation_details_ (operation_details)
+ , args_ (args)
+ {
+ }
+
+ virtual void execute (ACE_ENV_SINGLE_ARG_DECL)
+ {
+ TAO::SArg_Traits< ::CORBA::LocalInterfaceDef>::ret_arg_type retval =
+ TAO::Portable_Server::get_ret_arg< ::CORBA::LocalInterfaceDef> (
+ this->operation_details_,
+ this->args_);
+
+ TAO::SArg_Traits< ::CORBA::RepositoryId>::in_arg_type arg_1 =
+ TAO::Portable_Server::get_in_arg< ::CORBA::RepositoryId> (
+ this->operation_details_,
+ this->args_,
+ 1);
+
+ TAO::SArg_Traits< ::CORBA::Identifier>::in_arg_type arg_2 =
+ TAO::Portable_Server::get_in_arg< ::CORBA::Identifier> (
+ this->operation_details_,
+ this->args_,
+ 2);
+
+ TAO::SArg_Traits< ::CORBA::VersionSpec>::in_arg_type arg_3 =
+ TAO::Portable_Server::get_in_arg< ::CORBA::VersionSpec> (
+ this->operation_details_,
+ this->args_,
+ 3);
+
+ TAO::SArg_Traits< ::CORBA::InterfaceDefSeq>::in_arg_type arg_4 =
+ TAO::Portable_Server::get_in_arg< ::CORBA::InterfaceDefSeq> (
+ this->operation_details_,
+ this->args_,
+ 4);
+
+ retval =
+ this->servant_->create_local_interface (
+ arg_1
+ , arg_2
+ , arg_3
+ , arg_4
+ ACE_ENV_ARG_PARAMETER);
+ ACE_CHECK;
+ }
+
+ private:
+ POA_CORBA::Container * const servant_;
+ TAO_Operation_Details const * const operation_details_;
+ TAO::Argument * const * const args_;
+ };
+}
+
+
+// TAO_IDL - Generated from
+// be\be_visitor_operation/operation_ss.cpp:190
+
+void POA_CORBA::Container::create_local_interface_skel (
+ TAO_ServerRequest & server_request,
+ void * TAO_INTERCEPTOR (servant_upcall),
+ void * servant
+ ACE_ENV_ARG_DECL
+ )
+{
+#if TAO_HAS_INTERCEPTORS == 1
+ static ::CORBA::TypeCode_ptr const * const exceptions = 0;
+ static ::CORBA::ULong const nexceptions = 0;
+#endif /* TAO_HAS_INTERCEPTORS */
+
+ TAO::SArg_Traits< ::CORBA::LocalInterfaceDef>::ret_val retval;
+ TAO::SArg_Traits< ::CORBA::RepositoryId>::in_arg_val _tao_id;
+ TAO::SArg_Traits< ::CORBA::Identifier>::in_arg_val _tao_name;
+ TAO::SArg_Traits< ::CORBA::VersionSpec>::in_arg_val _tao_version;
+ TAO::SArg_Traits< ::CORBA::InterfaceDefSeq>::in_arg_val _tao_base_interfaces;
+
+ TAO::Argument * const args[] =
+ {
+ &retval,
+ &_tao_id,
+ &_tao_name,
+ &_tao_version,
+ &_tao_base_interfaces
+ };
+
+ static size_t const nargs = 5;
+
+ POA_CORBA::Container * const impl =
+ static_cast<POA_CORBA::Container *> (servant);
+
+ create_local_interface_Container command (
+ impl,
+ server_request.operation_details (),
+ args);
+
+ TAO::Upcall_Wrapper upcall_wrapper;
+ upcall_wrapper.upcall (server_request
+ , args
+ , nargs
+ , command
+#if TAO_HAS_INTERCEPTORS == 1
+ , servant_upcall
+ , exceptions
+ , nexceptions
+#endif /* TAO_HAS_INTERCEPTORS == 1 */
+ ACE_ENV_ARG_PARAMETER);
+ ACE_CHECK;
+}namespace POA_CORBA
+{
+
+
+ // TAO_IDL - Generated from
+ // be\be_visitor_operation/upcall_command_ss.cpp:127
+
+ class create_ext_value_Container
+ : public TAO::Upcall_Command
+ {
+ public:
+ inline create_ext_value_Container (
+ POA_CORBA::Container * servant,
+ TAO_Operation_Details const * operation_details,
+ TAO::Argument * const args[])
+ : servant_ (servant)
+ , operation_details_ (operation_details)
+ , args_ (args)
+ {
+ }
+
+ virtual void execute (ACE_ENV_SINGLE_ARG_DECL)
+ {
+ TAO::SArg_Traits< ::CORBA::ExtValueDef>::ret_arg_type retval =
+ TAO::Portable_Server::get_ret_arg< ::CORBA::ExtValueDef> (
+ this->operation_details_,
+ this->args_);
+
+ TAO::SArg_Traits< ::CORBA::RepositoryId>::in_arg_type arg_1 =
+ TAO::Portable_Server::get_in_arg< ::CORBA::RepositoryId> (
+ this->operation_details_,
+ this->args_,
+ 1);
+
+ TAO::SArg_Traits< ::CORBA::Identifier>::in_arg_type arg_2 =
+ TAO::Portable_Server::get_in_arg< ::CORBA::Identifier> (
+ this->operation_details_,
+ this->args_,
+ 2);
+
+ TAO::SArg_Traits< ::CORBA::VersionSpec>::in_arg_type arg_3 =
+ TAO::Portable_Server::get_in_arg< ::CORBA::VersionSpec> (
+ this->operation_details_,
+ this->args_,
+ 3);
+
+ TAO::SArg_Traits< ::ACE_InputCDR::to_boolean>::in_arg_type arg_4 =
+ TAO::Portable_Server::get_in_arg< ::ACE_InputCDR::to_boolean> (
+ this->operation_details_,
+ this->args_,
+ 4);
+
+ TAO::SArg_Traits< ::ACE_InputCDR::to_boolean>::in_arg_type arg_5 =
+ TAO::Portable_Server::get_in_arg< ::ACE_InputCDR::to_boolean> (
+ this->operation_details_,
+ this->args_,
+ 5);
+
+ TAO::SArg_Traits< ::CORBA::ValueDef>::in_arg_type arg_6 =
+ TAO::Portable_Server::get_in_arg< ::CORBA::ValueDef> (
+ this->operation_details_,
+ this->args_,
+ 6);
+
+ TAO::SArg_Traits< ::ACE_InputCDR::to_boolean>::in_arg_type arg_7 =
+ TAO::Portable_Server::get_in_arg< ::ACE_InputCDR::to_boolean> (
+ this->operation_details_,
+ this->args_,
+ 7);
+
+ TAO::SArg_Traits< ::CORBA::ValueDefSeq>::in_arg_type arg_8 =
+ TAO::Portable_Server::get_in_arg< ::CORBA::ValueDefSeq> (
+ this->operation_details_,
+ this->args_,
+ 8);
+
+ TAO::SArg_Traits< ::CORBA::InterfaceDefSeq>::in_arg_type arg_9 =
+ TAO::Portable_Server::get_in_arg< ::CORBA::InterfaceDefSeq> (
+ this->operation_details_,
+ this->args_,
+ 9);
+
+ TAO::SArg_Traits< ::CORBA::ExtInitializerSeq>::in_arg_type arg_10 =
+ TAO::Portable_Server::get_in_arg< ::CORBA::ExtInitializerSeq> (
+ this->operation_details_,
+ this->args_,
+ 10);
+
+ retval =
+ this->servant_->create_ext_value (
+ arg_1
+ , arg_2
+ , arg_3
+ , arg_4
+ , arg_5
+ , arg_6
+ , arg_7
+ , arg_8
+ , arg_9
+ , arg_10
+ ACE_ENV_ARG_PARAMETER);
+ ACE_CHECK;
+ }
+
+ private:
+ POA_CORBA::Container * const servant_;
+ TAO_Operation_Details const * const operation_details_;
+ TAO::Argument * const * const args_;
+ };
+}
+
+
+// TAO_IDL - Generated from
+// be\be_visitor_operation/operation_ss.cpp:190
+
+void POA_CORBA::Container::create_ext_value_skel (
+ TAO_ServerRequest & server_request,
+ void * TAO_INTERCEPTOR (servant_upcall),
+ void * servant
+ ACE_ENV_ARG_DECL
+ )
+{
+#if TAO_HAS_INTERCEPTORS == 1
+ static ::CORBA::TypeCode_ptr const * const exceptions = 0;
+ static ::CORBA::ULong const nexceptions = 0;
+#endif /* TAO_HAS_INTERCEPTORS */
+
+ TAO::SArg_Traits< ::CORBA::ExtValueDef>::ret_val retval;
+ TAO::SArg_Traits< ::CORBA::RepositoryId>::in_arg_val _tao_id;
+ TAO::SArg_Traits< ::CORBA::Identifier>::in_arg_val _tao_name;
+ TAO::SArg_Traits< ::CORBA::VersionSpec>::in_arg_val _tao_version;
+ TAO::SArg_Traits< ::ACE_InputCDR::to_boolean>::in_arg_val _tao_is_custom;
+ TAO::SArg_Traits< ::ACE_InputCDR::to_boolean>::in_arg_val _tao_is_abstract;
+ TAO::SArg_Traits< ::CORBA::ValueDef>::in_arg_val _tao_base_value;
+ TAO::SArg_Traits< ::ACE_InputCDR::to_boolean>::in_arg_val _tao_is_truncatable;
+ TAO::SArg_Traits< ::CORBA::ValueDefSeq>::in_arg_val _tao_abstract_base_values;
+ TAO::SArg_Traits< ::CORBA::InterfaceDefSeq>::in_arg_val _tao_supported_interfaces;
+ TAO::SArg_Traits< ::CORBA::ExtInitializerSeq>::in_arg_val _tao_initializers;
+
+ TAO::Argument * const args[] =
+ {
+ &retval,
+ &_tao_id,
+ &_tao_name,
+ &_tao_version,
+ &_tao_is_custom,
+ &_tao_is_abstract,
+ &_tao_base_value,
+ &_tao_is_truncatable,
+ &_tao_abstract_base_values,
+ &_tao_supported_interfaces,
+ &_tao_initializers
+ };
+
+ static size_t const nargs = 11;
+
+ POA_CORBA::Container * const impl =
+ static_cast<POA_CORBA::Container *> (servant);
+
+ create_ext_value_Container command (
+ impl,
+ server_request.operation_details (),
+ args);
+
+ TAO::Upcall_Wrapper upcall_wrapper;
+ upcall_wrapper.upcall (server_request
+ , args
+ , nargs
+ , command
+#if TAO_HAS_INTERCEPTORS == 1
+ , servant_upcall
+ , exceptions
+ , nexceptions
+#endif /* TAO_HAS_INTERCEPTORS == 1 */
+ ACE_ENV_ARG_PARAMETER);
+ ACE_CHECK;
+}
+
+// TAO_IDL - Generated from
+// be\be_visitor_interface/interface_ss.cpp:169
+
+namespace POA_CORBA
+{
+
+
+ // TAO_IDL - Generated from
+ // be\be_visitor_operation/upcall_command_ss.cpp:127
+
+ class _is_a_Container_Upcall_Command
+ : public TAO::Upcall_Command
+ {
+ public:
+ inline _is_a_Container_Upcall_Command (
+ POA_CORBA::Container * servant,
+ TAO_Operation_Details const * operation_details,
+ TAO::Argument * const args[])
+ : servant_ (servant)
+ , operation_details_ (operation_details)
+ , args_ (args)
+ {
+ }
+
+ virtual void execute (ACE_ENV_SINGLE_ARG_DECL)
+ {
+ TAO::SArg_Traits< ::ACE_InputCDR::to_boolean>::ret_arg_type retval =
+ TAO::Portable_Server::get_ret_arg< ::ACE_InputCDR::to_boolean> (
+ this->operation_details_,
+ this->args_);
+
+ TAO::SArg_Traits< ::CORBA::Char *>::in_arg_type arg_1 =
+ TAO::Portable_Server::get_in_arg< ::CORBA::Char *> (
+ this->operation_details_,
+ this->args_,
+ 1);
+
+ retval =
+ this->servant_-> _is_a (
+ arg_1
+ ACE_ENV_ARG_PARAMETER);
+ ACE_CHECK;
+ }
+
+ private:
+ POA_CORBA::Container * const servant_;
+ TAO_Operation_Details const * const operation_details_;
+ TAO::Argument * const * const args_;
+ };
+}
+
+
+void POA_CORBA::Container::_is_a_skel (
+ TAO_ServerRequest & server_request,
+ void * TAO_INTERCEPTOR (servant_upcall),
+ void * servant
+ ACE_ENV_ARG_DECL
+ )
+{
+#if TAO_HAS_INTERCEPTORS == 1
+ static ::CORBA::TypeCode_ptr const * const exceptions = 0;
+ static ::CORBA::ULong const nexceptions = 0;
+#endif /* TAO_HAS_INTERCEPTORS */
+
+ TAO::SArg_Traits< ::ACE_InputCDR::to_boolean>::ret_val retval;
+ TAO::SArg_Traits< ::CORBA::Char *>::in_arg_val _tao_repository_id;
+
+ TAO::Argument * const args[] =
+ {
+ &retval,
+ &_tao_repository_id
+ };
+
+ static size_t const nargs = 2;
+
+ POA_CORBA::Container * const impl =
+ static_cast<POA_CORBA::Container *> (servant);
+
+ _is_a_Container_Upcall_Command command (
+ impl,
+ server_request.operation_details (),
+ args);
+
+ TAO::Upcall_Wrapper upcall_wrapper;
+ upcall_wrapper.upcall (server_request
+ , args
+ , nargs
+ , command
+#if TAO_HAS_INTERCEPTORS == 1
+ , servant_upcall
+ , exceptions
+ , nexceptions
+#endif /* TAO_HAS_INTERCEPTORS == 1 */
+ ACE_ENV_ARG_PARAMETER);
+ ACE_CHECK;
+}namespace POA_CORBA
+{
+
+
+ // TAO_IDL - Generated from
+ // be\be_visitor_operation/upcall_command_ss.cpp:127
+
+ class _non_existent_Container_Upcall_Command
+ : public TAO::Upcall_Command
+ {
+ public:
+ inline _non_existent_Container_Upcall_Command (
+ POA_CORBA::Container * servant,
+ TAO_Operation_Details const * operation_details,
+ TAO::Argument * const args[])
+ : servant_ (servant)
+ , operation_details_ (operation_details)
+ , args_ (args)
+ {
+ }
+
+ virtual void execute (ACE_ENV_SINGLE_ARG_DECL)
+ {
+ TAO::SArg_Traits< ::ACE_InputCDR::to_boolean>::ret_arg_type retval =
+ TAO::Portable_Server::get_ret_arg< ::ACE_InputCDR::to_boolean> (
+ this->operation_details_,
+ this->args_);
+
+ retval =
+ this->servant_-> _non_existent (
+ ACE_ENV_SINGLE_ARG_PARAMETER);
+ ACE_CHECK;
+ }
+
+ private:
+ POA_CORBA::Container * const servant_;
+ TAO_Operation_Details const * const operation_details_;
+ TAO::Argument * const * const args_;
+ };
+}
+
+
+void POA_CORBA::Container::_non_existent_skel (
+ TAO_ServerRequest & server_request,
+ void * TAO_INTERCEPTOR (servant_upcall),
+ void * servant
+ ACE_ENV_ARG_DECL
+ )
+{
+#if TAO_HAS_INTERCEPTORS == 1
+ static ::CORBA::TypeCode_ptr const * const exceptions = 0;
+ static ::CORBA::ULong const nexceptions = 0;
+#endif /* TAO_HAS_INTERCEPTORS */
+
+ TAO::SArg_Traits< ::ACE_InputCDR::to_boolean>::ret_val retval;
+
+ TAO::Argument * const args[] =
+ {
+ &retval
+ };
+
+ static size_t const nargs = 1;
+
+ POA_CORBA::Container * const impl =
+ static_cast<POA_CORBA::Container *> (servant);
+
+ _non_existent_Container_Upcall_Command command (
+ impl,
+ server_request.operation_details (),
+ args);
+
+ TAO::Upcall_Wrapper upcall_wrapper;
+ upcall_wrapper.upcall (server_request
+ , args
+ , nargs
+ , command
+#if TAO_HAS_INTERCEPTORS == 1
+ , servant_upcall
+ , exceptions
+ , nexceptions
+#endif /* TAO_HAS_INTERCEPTORS == 1 */
+ ACE_ENV_ARG_PARAMETER);
+ ACE_CHECK;
+}namespace POA_CORBA
+{
+
+
+ // TAO_IDL - Generated from
+ // be\be_visitor_operation/upcall_command_ss.cpp:127
+
+ class _repository_id_Container_Upcall_Command
+ : public TAO::Upcall_Command
+ {
+ public:
+ inline _repository_id_Container_Upcall_Command (
+ POA_CORBA::Container * servant,
+ TAO_Operation_Details const * operation_details,
+ TAO::Argument * const args[])
+ : servant_ (servant)
+ , operation_details_ (operation_details)
+ , args_ (args)
+ {
+ }
+
+ virtual void execute (ACE_ENV_SINGLE_ARG_DECL)
+ {
+ TAO::SArg_Traits< ::CORBA::Char *>::ret_arg_type retval =
+ TAO::Portable_Server::get_ret_arg< ::CORBA::Char *> (
+ this->operation_details_,
+ this->args_);
+
+ retval =
+ this->servant_-> _repository_id (
+ ACE_ENV_SINGLE_ARG_PARAMETER);
+ ACE_CHECK;
+ }
+
+ private:
+ POA_CORBA::Container * const servant_;
+ TAO_Operation_Details const * const operation_details_;
+ TAO::Argument * const * const args_;
+ };
+}
+
+
+void POA_CORBA::Container::_repository_id_skel (
+ TAO_ServerRequest & server_request,
+ void * TAO_INTERCEPTOR (servant_upcall),
+ void * servant
+ ACE_ENV_ARG_DECL
+ )
+{
+#if TAO_HAS_INTERCEPTORS == 1
+ static ::CORBA::TypeCode_ptr const * const exceptions = 0;
+ static ::CORBA::ULong const nexceptions = 0;
+#endif /* TAO_HAS_INTERCEPTORS */
+
+ TAO::SArg_Traits< ::CORBA::Char *>::ret_val retval;
+
+ TAO::Argument * const args[] =
+ {
+ &retval
+ };
+
+ static size_t const nargs = 1;
+
+ POA_CORBA::Container * const impl =
+ static_cast<POA_CORBA::Container *> (servant);
+
+ _repository_id_Container_Upcall_Command command (
+ impl,
+ server_request.operation_details (),
+ args);
+
+ TAO::Upcall_Wrapper upcall_wrapper;
+ upcall_wrapper.upcall (server_request
+ , args
+ , nargs
+ , command
+#if TAO_HAS_INTERCEPTORS == 1
+ , servant_upcall
+ , exceptions
+ , nexceptions
+#endif /* TAO_HAS_INTERCEPTORS == 1 */
+ ACE_ENV_ARG_PARAMETER);
+ ACE_CHECK;
+}
+
+// TAO_IDL - Generated from
+// be\be_visitor_interface/interface_ss.cpp:513
+
+void POA_CORBA::Container::_interface_skel (
+ TAO_ServerRequest & server_request,
+ void * /* servant_upcall */,
+ void * servant
+ ACE_ENV_ARG_DECL
+ )
+{
+ TAO_IFR_Client_Adapter *_tao_adapter =
+ ACE_Dynamic_Service<TAO_IFR_Client_Adapter>::instance (
+ TAO_ORB_Core::ifr_client_adapter_name ()
+ );
+
+ if (_tao_adapter == 0)
+ {
+ ACE_THROW ( ::CORBA::INTF_REPOS ( ::CORBA::OMGVMCID | 1,
+ ::CORBA::COMPLETED_NO));
+ }
+
+ POA_CORBA::Container * const impl =
+ static_cast<POA_CORBA::Container *> (servant);
+ ::CORBA::InterfaceDef_ptr _tao_retval =
+ impl->_get_interface (ACE_ENV_SINGLE_ARG_PARAMETER);
+ ACE_CHECK;
+
+ server_request.init_reply ();
+ TAO_OutputCDR &_tao_out = *server_request.outgoing ();
+
+ ::CORBA::Boolean const _tao_result =
+ _tao_adapter->interfacedef_cdr_insert (
+ _tao_out,
+ _tao_retval
+ );
+
+ _tao_adapter->dispose (_tao_retval);
+
+ if (_tao_result == false)
+ {
+ ACE_THROW ( ::CORBA::MARSHAL ());
+ }
+}namespace POA_CORBA
+{
+
+
+ // TAO_IDL - Generated from
+ // be\be_visitor_operation/upcall_command_ss.cpp:127
+
+ class _get_component_Container_Upcall_Command
+ : public TAO::Upcall_Command
+ {
+ public:
+ inline _get_component_Container_Upcall_Command (
+ POA_CORBA::Container * servant,
+ TAO_Operation_Details const * operation_details,
+ TAO::Argument * const args[])
+ : servant_ (servant)
+ , operation_details_ (operation_details)
+ , args_ (args)
+ {
+ }
+
+ virtual void execute (ACE_ENV_SINGLE_ARG_DECL)
+ {
+ TAO::SArg_Traits< ::CORBA::Object>::ret_arg_type retval =
+ TAO::Portable_Server::get_ret_arg< ::CORBA::Object> (
+ this->operation_details_,
+ this->args_);
+
+ retval =
+ this->servant_-> _get_component (
+ ACE_ENV_SINGLE_ARG_PARAMETER);
+ ACE_CHECK;
+ }
+
+ private:
+ POA_CORBA::Container * const servant_;
+ TAO_Operation_Details const * const operation_details_;
+ TAO::Argument * const * const args_;
+ };
+}
+
+
+void POA_CORBA::Container::_component_skel (
+ TAO_ServerRequest & server_request,
+ void * TAO_INTERCEPTOR (servant_upcall),
+ void * servant
+ ACE_ENV_ARG_DECL
+ )
+{
+#if TAO_HAS_INTERCEPTORS == 1
+ static ::CORBA::TypeCode_ptr const * const exceptions = 0;
+ static ::CORBA::ULong const nexceptions = 0;
+#endif /* TAO_HAS_INTERCEPTORS */
+
+ TAO::SArg_Traits< ::CORBA::Object>::ret_val retval;
+
+ TAO::Argument * const args[] =
+ {
+ &retval
+ };
+
+ static size_t const nargs = 1;
+
+ POA_CORBA::Container * const impl =
+ static_cast<POA_CORBA::Container *> (servant);
+
+ _get_component_Container_Upcall_Command command (
+ impl,
+ server_request.operation_details (),
+ args);
+
+ TAO::Upcall_Wrapper upcall_wrapper;
+ upcall_wrapper.upcall (server_request
+ , args
+ , nargs
+ , command
+#if TAO_HAS_INTERCEPTORS == 1
+ , servant_upcall
+ , exceptions
+ , nexceptions
+#endif /* TAO_HAS_INTERCEPTORS == 1 */
+ ACE_ENV_ARG_PARAMETER);
+ ACE_CHECK;
+}
+
+::CORBA::Boolean POA_CORBA::Container::_is_a (
+ const char* value
+ ACE_ENV_ARG_DECL_NOT_USED
+ )
+{
+ return
+ (
+ !ACE_OS::strcmp (
+ value,
+ "IDL:omg.org/CORBA/IRObject:1.0"
+ ) ||
+ !ACE_OS::strcmp (
+ value,
+ "IDL:omg.org/CORBA/Container:1.0"
+ ) ||
+ !ACE_OS::strcmp (
+ value,
+ "IDL:omg.org/CORBA/Object:1.0"
+ )
+ );
+}
+
+const char* POA_CORBA::Container::_interface_repository_id (void) const
+{
+ return "IDL:omg.org/CORBA/Container:1.0";
+}
+
+// TAO_IDL - Generated from
+// be\be_visitor_interface/interface_ss.cpp:903
+
+void POA_CORBA::Container::_dispatch (
+ TAO_ServerRequest & req,
+ void * servant_upcall
+ ACE_ENV_ARG_DECL
+ )
+{
+ this->synchronous_upcall_dispatch (req,
+ servant_upcall,
+ this
+ ACE_ENV_ARG_PARAMETER);
+}
+
+// TAO_IDL - Generated from
+// be\be_visitor_interface/interface_ss.cpp:851
+
+CORBA::Container *
+POA_CORBA::Container::_this (ACE_ENV_SINGLE_ARG_DECL)
+{
+ TAO_Stub *stub = this->_create_stub (ACE_ENV_SINGLE_ARG_PARAMETER);
+ ACE_CHECK_RETURN (0);
+
+ TAO_Stub_Auto_Ptr safe_stub (stub);
+ ::CORBA::Object_ptr tmp = CORBA::Object::_nil ();
+
+ ::CORBA::Boolean const _tao_opt_colloc =
+ stub->servant_orb_var ()->orb_core ()->optimize_collocation_objects ();
+
+ ACE_NEW_RETURN (
+ tmp,
+ ::CORBA::Object (stub, _tao_opt_colloc, this),
+ 0
+ );
+
+ ::CORBA::Object_var obj = tmp;
+ (void) safe_stub.release ();
+
+ typedef ::CORBA::Container STUB_SCOPED_NAME;
+ return
+ TAO::Narrow_Utils<STUB_SCOPED_NAME>::unchecked_narrow (
+ obj.in (),
+ CORBA__TAO_Container_Proxy_Broker_Factory_function_pointer
+ );
+}
+
+// TAO_IDL - Generated from
+// be\be_interface.cpp:1499
+
+class TAO_CORBA_IDLType_Perfect_Hash_OpTable
+ : public TAO_Perfect_Hash_OpTable
+{
+private:
+ unsigned int hash (const char *str, unsigned int len);
+
+public:
+ const TAO_operation_db_entry * lookup (const char *str, unsigned int len);
+};
+
+/* C++ code produced by gperf version 2.8 (ACE version) */
+/* Command-line: C:\ACE\latest\ACE_wrappers\bin\gperf.exe -m -M -J -c -C -D -E -T -f 0 -F 0,0 -a -o -t -p -K opname -L C++ -Z TAO_CORBA_IDLType_Perfect_Hash_OpTable -N lookup */
+unsigned int
+TAO_CORBA_IDLType_Perfect_Hash_OpTable::hash (const char *str, unsigned int len)
+{
+ static const unsigned char asso_values[] =
+ {
+#if defined (ACE_MVS)
+ 19, 19, 19, 19, 19, 19, 19, 19, 19, 19,
+ 19, 19, 19, 19, 19, 19, 19, 19, 19, 19,
+ 19, 19, 19, 19, 19, 19, 19, 19, 19, 19,
+ 19, 19, 19, 19, 19, 19, 19, 19, 19, 19,
+ 19, 19, 19, 19, 19, 19, 19, 19, 19, 19,
+ 19, 19, 19, 19, 19, 19, 19, 19, 19, 19,
+ 19, 19, 19, 19, 19, 19, 19, 19, 19, 19,
+ 19, 19, 19, 19, 19, 19, 19, 19, 19, 19,
+ 19, 19, 19, 19, 19, 19, 19, 19, 19, 19,
+ 19, 19, 19, 19, 19, 19, 19, 19, 19, 19,
+ 19, 19, 19, 19, 19, 19, 19, 19, 19, 0,
+ 19, 19, 19, 19, 19, 19, 19, 19, 19, 19,
+ 19, 19, 19, 19, 19, 19, 19, 19, 19, 0,
+ 19, 19, 0, 0, 19, 19, 19, 19, 19, 19,
+ 19, 19, 19, 19, 19, 19, 19, 19, 19, 19,
+ 19, 19, 19, 19, 19, 19, 19, 19, 19, 19,
+ 19, 19, 19, 5, 19, 19, 19, 19, 0, 19,
+ 19, 19, 19, 19, 19, 19, 19, 19, 19, 19,
+ 19, 19, 19, 19, 19, 19, 19, 19, 19, 19,
+ 19, 19, 19, 19, 19, 19, 19, 19, 19, 19,
+ 19, 19, 19, 19, 19, 19, 19, 19, 19, 19,
+ 19, 19, 19, 19, 19, 19, 19, 19, 19, 19,
+ 19, 19, 19, 19, 19, 19, 19, 19, 19, 19,
+ 19, 19, 19, 19, 19, 19, 19, 19, 19, 19,
+ 19, 19, 19, 19, 19, 19, 19, 19, 19, 19,
+ 19, 19, 19, 19, 19, 19,
+#else
+ 19, 19, 19, 19, 19, 19, 19, 19, 19, 19,
+ 19, 19, 19, 19, 19, 19, 19, 19, 19, 19,
+ 19, 19, 19, 19, 19, 19, 19, 19, 19, 19,
+ 19, 19, 19, 19, 19, 19, 19, 19, 19, 19,
+ 19, 19, 19, 19, 19, 19, 19, 19, 19, 19,
+ 19, 19, 19, 19, 19, 19, 19, 19, 19, 19,
+ 19, 19, 19, 19, 19, 19, 19, 19, 19, 19,
+ 19, 19, 19, 19, 19, 19, 19, 19, 19, 19,
+ 19, 19, 19, 19, 19, 19, 19, 19, 19, 19,
+ 19, 19, 19, 19, 19, 0, 19, 0, 19, 19,
+ 0, 0, 19, 19, 19, 19, 19, 19, 19, 19,
+ 19, 19, 19, 19, 19, 19, 5, 19, 19, 19,
+ 19, 0, 19, 19, 19, 19, 19, 19,
+#endif /* ACE_MVS */
+ };
+ return len + asso_values[(int) str[len - 1]] + asso_values[(int) str[0]];
+}
+
+const TAO_operation_db_entry *
+TAO_CORBA_IDLType_Perfect_Hash_OpTable::lookup (const char *str, unsigned int len)
+{
+ enum
+ {
+ TOTAL_KEYWORDS = 8,
+ MIN_WORD_LENGTH = 5,
+ MAX_WORD_LENGTH = 14,
+ MIN_HASH_VALUE = 5,
+ MAX_HASH_VALUE = 18,
+ HASH_VALUE_RANGE = 14,
+ DUPLICATES = 0,
+ WORDLIST_SIZE = 13
+ };
+
+ static const TAO_operation_db_entry wordlist[] =
+ {
+ {"",0,0},{"",0,0},{"",0,0},{"",0,0},{"",0,0},
+ {"_is_a", &POA_CORBA::IDLType::_is_a_skel, 0},
+ {"",0,0},
+ {"destroy", &POA_CORBA::IDLType::destroy_skel, 0},
+ {"",0,0},
+ {"_get_type", &POA_CORBA::IDLType::_get_type_skel, 0},
+ {"_interface", &POA_CORBA::IDLType::_interface_skel, 0},
+ {"",0,0},{"",0,0},
+ {"_get_def_kind", &POA_CORBA::IDLType::_get_def_kind_skel, 0},
+ {"_repository_id", &POA_CORBA::IDLType::_repository_id_skel, 0},
+ {"_component", &POA_CORBA::IDLType::_component_skel, 0},
+ {"",0,0},{"",0,0},
+ {"_non_existent", &POA_CORBA::IDLType::_non_existent_skel, 0},
+ };
+
+ if (len <= MAX_WORD_LENGTH && len >= MIN_WORD_LENGTH)
+ {
+ unsigned int key = hash (str, len);
+
+ if (key <= MAX_HASH_VALUE && key >= MIN_HASH_VALUE)
+ {
+ const char *s = wordlist[key].opname;
+
+ if (*str == *s && !strncmp (str + 1, s + 1, len - 1))
+ return &wordlist[key];
+ }
+ }
+ return 0;
+}
+
+static TAO_CORBA_IDLType_Perfect_Hash_OpTable tao_CORBA_IDLType_optable;
+
+// TAO_IDL - Generated from
+// be\be_visitor_interface/interface_ss.cpp:966
+
+TAO::Collocation_Proxy_Broker *
+CORBA__TAO_IDLType_Proxy_Broker_Factory_function ( ::CORBA::Object_ptr)
+{
+ return reinterpret_cast<TAO::Collocation_Proxy_Broker *> (0xdead); // Dummy
+}
+
+int
+CORBA__TAO_IDLType_Proxy_Broker_Factory_Initializer (size_t)
+{
+ CORBA__TAO_IDLType_Proxy_Broker_Factory_function_pointer =
+ CORBA__TAO_IDLType_Proxy_Broker_Factory_function;
+
+ return 0;
+}
+
+static int
+CORBA__TAO_IDLType_Proxy_Broker_Stub_Factory_Initializer_Scarecrow =
+ CORBA__TAO_IDLType_Proxy_Broker_Factory_Initializer (
+ reinterpret_cast<size_t> (CORBA__TAO_IDLType_Proxy_Broker_Factory_Initializer)
+ );
+
+// TAO_IDL - Generated from
+// be\be_visitor_interface/interface_ss.cpp:103
+
+POA_CORBA::IDLType::IDLType (void)
+ : TAO_ServantBase ()
+{
+ this->optable_ = &tao_CORBA_IDLType_optable;
+}
+
+POA_CORBA::IDLType::IDLType (const IDLType& rhs)
+ : TAO_Abstract_ServantBase (rhs),
+ TAO_ServantBase (rhs),
+ POA_CORBA::IRObject (rhs)
+{
+}
+
+POA_CORBA::IDLType::~IDLType (void)
+{
+}namespace POA_CORBA
+{
+
+
+ // TAO_IDL - Generated from
+ // be\be_visitor_operation/upcall_command_ss.cpp:127
+
+ class _get_type_IDLType
+ : public TAO::Upcall_Command
+ {
+ public:
+ inline _get_type_IDLType (
+ POA_CORBA::IDLType * servant,
+ TAO_Operation_Details const * operation_details,
+ TAO::Argument * const args[])
+ : servant_ (servant)
+ , operation_details_ (operation_details)
+ , args_ (args)
+ {
+ }
+
+ virtual void execute (ACE_ENV_SINGLE_ARG_DECL)
+ {
+ TAO::SArg_Traits< ::CORBA::TypeCode>::ret_arg_type retval =
+ TAO::Portable_Server::get_ret_arg< ::CORBA::TypeCode> (
+ this->operation_details_,
+ this->args_);
+
+ retval =
+ this->servant_->type (
+ ACE_ENV_SINGLE_ARG_PARAMETER);
+ ACE_CHECK;
+ }
+
+ private:
+ POA_CORBA::IDLType * const servant_;
+ TAO_Operation_Details const * const operation_details_;
+ TAO::Argument * const * const args_;
+ };
+}
+
+
+// TAO_IDL - Generated from
+// be\be_visitor_operation/operation_ss.cpp:190
+
+void POA_CORBA::IDLType::_get_type_skel (
+ TAO_ServerRequest & server_request,
+ void * TAO_INTERCEPTOR (servant_upcall),
+ void * servant
+ ACE_ENV_ARG_DECL
+ )
+{
+#if TAO_HAS_INTERCEPTORS == 1
+ static ::CORBA::TypeCode_ptr const * const exceptions = 0;
+ static ::CORBA::ULong const nexceptions = 0;
+#endif /* TAO_HAS_INTERCEPTORS */
+
+ TAO::SArg_Traits< ::CORBA::TypeCode>::ret_val retval;
+
+ TAO::Argument * const args[] =
+ {
+ &retval
+ };
+
+ static size_t const nargs = 1;
+
+ POA_CORBA::IDLType * const impl =
+ static_cast<POA_CORBA::IDLType *> (servant);
+
+ _get_type_IDLType command (
+ impl,
+ server_request.operation_details (),
+ args);
+
+ TAO::Upcall_Wrapper upcall_wrapper;
+ upcall_wrapper.upcall (server_request
+ , args
+ , nargs
+ , command
+#if TAO_HAS_INTERCEPTORS == 1
+ , servant_upcall
+ , exceptions
+ , nexceptions
+#endif /* TAO_HAS_INTERCEPTORS == 1 */
+ ACE_ENV_ARG_PARAMETER);
+ ACE_CHECK;
+}
+
+// TAO_IDL - Generated from
+// be\be_visitor_interface/interface_ss.cpp:169
+
+namespace POA_CORBA
+{
+
+
+ // TAO_IDL - Generated from
+ // be\be_visitor_operation/upcall_command_ss.cpp:127
+
+ class _is_a_IDLType_Upcall_Command
+ : public TAO::Upcall_Command
+ {
+ public:
+ inline _is_a_IDLType_Upcall_Command (
+ POA_CORBA::IDLType * servant,
+ TAO_Operation_Details const * operation_details,
+ TAO::Argument * const args[])
+ : servant_ (servant)
+ , operation_details_ (operation_details)
+ , args_ (args)
+ {
+ }
+
+ virtual void execute (ACE_ENV_SINGLE_ARG_DECL)
+ {
+ TAO::SArg_Traits< ::ACE_InputCDR::to_boolean>::ret_arg_type retval =
+ TAO::Portable_Server::get_ret_arg< ::ACE_InputCDR::to_boolean> (
+ this->operation_details_,
+ this->args_);
+
+ TAO::SArg_Traits< ::CORBA::Char *>::in_arg_type arg_1 =
+ TAO::Portable_Server::get_in_arg< ::CORBA::Char *> (
+ this->operation_details_,
+ this->args_,
+ 1);
+
+ retval =
+ this->servant_-> _is_a (
+ arg_1
+ ACE_ENV_ARG_PARAMETER);
+ ACE_CHECK;
+ }
+
+ private:
+ POA_CORBA::IDLType * const servant_;
+ TAO_Operation_Details const * const operation_details_;
+ TAO::Argument * const * const args_;
+ };
+}
+
+
+void POA_CORBA::IDLType::_is_a_skel (
+ TAO_ServerRequest & server_request,
+ void * TAO_INTERCEPTOR (servant_upcall),
+ void * servant
+ ACE_ENV_ARG_DECL
+ )
+{
+#if TAO_HAS_INTERCEPTORS == 1
+ static ::CORBA::TypeCode_ptr const * const exceptions = 0;
+ static ::CORBA::ULong const nexceptions = 0;
+#endif /* TAO_HAS_INTERCEPTORS */
+
+ TAO::SArg_Traits< ::ACE_InputCDR::to_boolean>::ret_val retval;
+ TAO::SArg_Traits< ::CORBA::Char *>::in_arg_val _tao_repository_id;
+
+ TAO::Argument * const args[] =
+ {
+ &retval,
+ &_tao_repository_id
+ };
+
+ static size_t const nargs = 2;
+
+ POA_CORBA::IDLType * const impl =
+ static_cast<POA_CORBA::IDLType *> (servant);
+
+ _is_a_IDLType_Upcall_Command command (
+ impl,
+ server_request.operation_details (),
+ args);
+
+ TAO::Upcall_Wrapper upcall_wrapper;
+ upcall_wrapper.upcall (server_request
+ , args
+ , nargs
+ , command
+#if TAO_HAS_INTERCEPTORS == 1
+ , servant_upcall
+ , exceptions
+ , nexceptions
+#endif /* TAO_HAS_INTERCEPTORS == 1 */
+ ACE_ENV_ARG_PARAMETER);
+ ACE_CHECK;
+}namespace POA_CORBA
+{
+
+
+ // TAO_IDL - Generated from
+ // be\be_visitor_operation/upcall_command_ss.cpp:127
+
+ class _non_existent_IDLType_Upcall_Command
+ : public TAO::Upcall_Command
+ {
+ public:
+ inline _non_existent_IDLType_Upcall_Command (
+ POA_CORBA::IDLType * servant,
+ TAO_Operation_Details const * operation_details,
+ TAO::Argument * const args[])
+ : servant_ (servant)
+ , operation_details_ (operation_details)
+ , args_ (args)
+ {
+ }
+
+ virtual void execute (ACE_ENV_SINGLE_ARG_DECL)
+ {
+ TAO::SArg_Traits< ::ACE_InputCDR::to_boolean>::ret_arg_type retval =
+ TAO::Portable_Server::get_ret_arg< ::ACE_InputCDR::to_boolean> (
+ this->operation_details_,
+ this->args_);
+
+ retval =
+ this->servant_-> _non_existent (
+ ACE_ENV_SINGLE_ARG_PARAMETER);
+ ACE_CHECK;
+ }
+
+ private:
+ POA_CORBA::IDLType * const servant_;
+ TAO_Operation_Details const * const operation_details_;
+ TAO::Argument * const * const args_;
+ };
+}
+
+
+void POA_CORBA::IDLType::_non_existent_skel (
+ TAO_ServerRequest & server_request,
+ void * TAO_INTERCEPTOR (servant_upcall),
+ void * servant
+ ACE_ENV_ARG_DECL
+ )
+{
+#if TAO_HAS_INTERCEPTORS == 1
+ static ::CORBA::TypeCode_ptr const * const exceptions = 0;
+ static ::CORBA::ULong const nexceptions = 0;
+#endif /* TAO_HAS_INTERCEPTORS */
+
+ TAO::SArg_Traits< ::ACE_InputCDR::to_boolean>::ret_val retval;
+
+ TAO::Argument * const args[] =
+ {
+ &retval
+ };
+
+ static size_t const nargs = 1;
+
+ POA_CORBA::IDLType * const impl =
+ static_cast<POA_CORBA::IDLType *> (servant);
+
+ _non_existent_IDLType_Upcall_Command command (
+ impl,
+ server_request.operation_details (),
+ args);
+
+ TAO::Upcall_Wrapper upcall_wrapper;
+ upcall_wrapper.upcall (server_request
+ , args
+ , nargs
+ , command
+#if TAO_HAS_INTERCEPTORS == 1
+ , servant_upcall
+ , exceptions
+ , nexceptions
+#endif /* TAO_HAS_INTERCEPTORS == 1 */
+ ACE_ENV_ARG_PARAMETER);
+ ACE_CHECK;
+}namespace POA_CORBA
+{
+
+
+ // TAO_IDL - Generated from
+ // be\be_visitor_operation/upcall_command_ss.cpp:127
+
+ class _repository_id_IDLType_Upcall_Command
+ : public TAO::Upcall_Command
+ {
+ public:
+ inline _repository_id_IDLType_Upcall_Command (
+ POA_CORBA::IDLType * servant,
+ TAO_Operation_Details const * operation_details,
+ TAO::Argument * const args[])
+ : servant_ (servant)
+ , operation_details_ (operation_details)
+ , args_ (args)
+ {
+ }
+
+ virtual void execute (ACE_ENV_SINGLE_ARG_DECL)
+ {
+ TAO::SArg_Traits< ::CORBA::Char *>::ret_arg_type retval =
+ TAO::Portable_Server::get_ret_arg< ::CORBA::Char *> (
+ this->operation_details_,
+ this->args_);
+
+ retval =
+ this->servant_-> _repository_id (
+ ACE_ENV_SINGLE_ARG_PARAMETER);
+ ACE_CHECK;
+ }
+
+ private:
+ POA_CORBA::IDLType * const servant_;
+ TAO_Operation_Details const * const operation_details_;
+ TAO::Argument * const * const args_;
+ };
+}
+
+
+void POA_CORBA::IDLType::_repository_id_skel (
+ TAO_ServerRequest & server_request,
+ void * TAO_INTERCEPTOR (servant_upcall),
+ void * servant
+ ACE_ENV_ARG_DECL
+ )
+{
+#if TAO_HAS_INTERCEPTORS == 1
+ static ::CORBA::TypeCode_ptr const * const exceptions = 0;
+ static ::CORBA::ULong const nexceptions = 0;
+#endif /* TAO_HAS_INTERCEPTORS */
+
+ TAO::SArg_Traits< ::CORBA::Char *>::ret_val retval;
+
+ TAO::Argument * const args[] =
+ {
+ &retval
+ };
+
+ static size_t const nargs = 1;
+
+ POA_CORBA::IDLType * const impl =
+ static_cast<POA_CORBA::IDLType *> (servant);
+
+ _repository_id_IDLType_Upcall_Command command (
+ impl,
+ server_request.operation_details (),
+ args);
+
+ TAO::Upcall_Wrapper upcall_wrapper;
+ upcall_wrapper.upcall (server_request
+ , args
+ , nargs
+ , command
+#if TAO_HAS_INTERCEPTORS == 1
+ , servant_upcall
+ , exceptions
+ , nexceptions
+#endif /* TAO_HAS_INTERCEPTORS == 1 */
+ ACE_ENV_ARG_PARAMETER);
+ ACE_CHECK;
+}
+
+// TAO_IDL - Generated from
+// be\be_visitor_interface/interface_ss.cpp:513
+
+void POA_CORBA::IDLType::_interface_skel (
+ TAO_ServerRequest & server_request,
+ void * /* servant_upcall */,
+ void * servant
+ ACE_ENV_ARG_DECL
+ )
+{
+ TAO_IFR_Client_Adapter *_tao_adapter =
+ ACE_Dynamic_Service<TAO_IFR_Client_Adapter>::instance (
+ TAO_ORB_Core::ifr_client_adapter_name ()
+ );
+
+ if (_tao_adapter == 0)
+ {
+ ACE_THROW ( ::CORBA::INTF_REPOS ( ::CORBA::OMGVMCID | 1,
+ ::CORBA::COMPLETED_NO));
+ }
+
+ POA_CORBA::IDLType * const impl =
+ static_cast<POA_CORBA::IDLType *> (servant);
+ ::CORBA::InterfaceDef_ptr _tao_retval =
+ impl->_get_interface (ACE_ENV_SINGLE_ARG_PARAMETER);
+ ACE_CHECK;
+
+ server_request.init_reply ();
+ TAO_OutputCDR &_tao_out = *server_request.outgoing ();
+
+ ::CORBA::Boolean const _tao_result =
+ _tao_adapter->interfacedef_cdr_insert (
+ _tao_out,
+ _tao_retval
+ );
+
+ _tao_adapter->dispose (_tao_retval);
+
+ if (_tao_result == false)
+ {
+ ACE_THROW ( ::CORBA::MARSHAL ());
+ }
+}namespace POA_CORBA
+{
+
+
+ // TAO_IDL - Generated from
+ // be\be_visitor_operation/upcall_command_ss.cpp:127
+
+ class _get_component_IDLType_Upcall_Command
+ : public TAO::Upcall_Command
+ {
+ public:
+ inline _get_component_IDLType_Upcall_Command (
+ POA_CORBA::IDLType * servant,
+ TAO_Operation_Details const * operation_details,
+ TAO::Argument * const args[])
+ : servant_ (servant)
+ , operation_details_ (operation_details)
+ , args_ (args)
+ {
+ }
+
+ virtual void execute (ACE_ENV_SINGLE_ARG_DECL)
+ {
+ TAO::SArg_Traits< ::CORBA::Object>::ret_arg_type retval =
+ TAO::Portable_Server::get_ret_arg< ::CORBA::Object> (
+ this->operation_details_,
+ this->args_);
+
+ retval =
+ this->servant_-> _get_component (
+ ACE_ENV_SINGLE_ARG_PARAMETER);
+ ACE_CHECK;
+ }
+
+ private:
+ POA_CORBA::IDLType * const servant_;
+ TAO_Operation_Details const * const operation_details_;
+ TAO::Argument * const * const args_;
+ };
+}
+
+
+void POA_CORBA::IDLType::_component_skel (
+ TAO_ServerRequest & server_request,
+ void * TAO_INTERCEPTOR (servant_upcall),
+ void * servant
+ ACE_ENV_ARG_DECL
+ )
+{
+#if TAO_HAS_INTERCEPTORS == 1
+ static ::CORBA::TypeCode_ptr const * const exceptions = 0;
+ static ::CORBA::ULong const nexceptions = 0;
+#endif /* TAO_HAS_INTERCEPTORS */
+
+ TAO::SArg_Traits< ::CORBA::Object>::ret_val retval;
+
+ TAO::Argument * const args[] =
+ {
+ &retval
+ };
+
+ static size_t const nargs = 1;
+
+ POA_CORBA::IDLType * const impl =
+ static_cast<POA_CORBA::IDLType *> (servant);
+
+ _get_component_IDLType_Upcall_Command command (
+ impl,
+ server_request.operation_details (),
+ args);
+
+ TAO::Upcall_Wrapper upcall_wrapper;
+ upcall_wrapper.upcall (server_request
+ , args
+ , nargs
+ , command
+#if TAO_HAS_INTERCEPTORS == 1
+ , servant_upcall
+ , exceptions
+ , nexceptions
+#endif /* TAO_HAS_INTERCEPTORS == 1 */
+ ACE_ENV_ARG_PARAMETER);
+ ACE_CHECK;
+}
+
+::CORBA::Boolean POA_CORBA::IDLType::_is_a (
+ const char* value
+ ACE_ENV_ARG_DECL_NOT_USED
+ )
+{
+ return
+ (
+ !ACE_OS::strcmp (
+ value,
+ "IDL:omg.org/CORBA/IRObject:1.0"
+ ) ||
+ !ACE_OS::strcmp (
+ value,
+ "IDL:omg.org/CORBA/IDLType:1.0"
+ ) ||
+ !ACE_OS::strcmp (
+ value,
+ "IDL:omg.org/CORBA/Object:1.0"
+ )
+ );
+}
+
+const char* POA_CORBA::IDLType::_interface_repository_id (void) const
+{
+ return "IDL:omg.org/CORBA/IDLType:1.0";
+}
+
+// TAO_IDL - Generated from
+// be\be_visitor_interface/interface_ss.cpp:903
+
+void POA_CORBA::IDLType::_dispatch (
+ TAO_ServerRequest & req,
+ void * servant_upcall
+ ACE_ENV_ARG_DECL
+ )
+{
+ this->synchronous_upcall_dispatch (req,
+ servant_upcall,
+ this
+ ACE_ENV_ARG_PARAMETER);
+}
+
+// TAO_IDL - Generated from
+// be\be_visitor_interface/interface_ss.cpp:851
+
+CORBA::IDLType *
+POA_CORBA::IDLType::_this (ACE_ENV_SINGLE_ARG_DECL)
+{
+ TAO_Stub *stub = this->_create_stub (ACE_ENV_SINGLE_ARG_PARAMETER);
+ ACE_CHECK_RETURN (0);
+
+ TAO_Stub_Auto_Ptr safe_stub (stub);
+ ::CORBA::Object_ptr tmp = CORBA::Object::_nil ();
+
+ ::CORBA::Boolean const _tao_opt_colloc =
+ stub->servant_orb_var ()->orb_core ()->optimize_collocation_objects ();
+
+ ACE_NEW_RETURN (
+ tmp,
+ ::CORBA::Object (stub, _tao_opt_colloc, this),
+ 0
+ );
+
+ ::CORBA::Object_var obj = tmp;
+ (void) safe_stub.release ();
+
+ typedef ::CORBA::IDLType STUB_SCOPED_NAME;
+ return
+ TAO::Narrow_Utils<STUB_SCOPED_NAME>::unchecked_narrow (
+ obj.in (),
+ CORBA__TAO_IDLType_Proxy_Broker_Factory_function_pointer
+ );
+}
+
+// TAO_IDL - Generated from
+// be\be_interface.cpp:1499
+
+class TAO_CORBA_TypedefDef_Perfect_Hash_OpTable
+ : public TAO_Perfect_Hash_OpTable
+{
+private:
+ unsigned int hash (const char *str, unsigned int len);
+
+public:
+ const TAO_operation_db_entry * lookup (const char *str, unsigned int len);
+};
+
+/* C++ code produced by gperf version 2.8 (ACE version) */
+/* Command-line: C:\ACE\latest\ACE_wrappers\bin\gperf.exe -m -M -J -c -C -D -E -T -f 0 -F 0,0 -a -o -t -p -K opname -L C++ -Z TAO_CORBA_TypedefDef_Perfect_Hash_OpTable -N lookup */
+unsigned int
+TAO_CORBA_TypedefDef_Perfect_Hash_OpTable::hash (const char *str, unsigned int len)
+{
+ static const unsigned char asso_values[] =
+ {
+#if defined (ACE_MVS)
+ 37, 37, 37, 37, 37, 37, 37, 37, 37, 37,
+ 37, 37, 37, 37, 37, 37, 37, 37, 37, 37,
+ 37, 37, 37, 37, 37, 37, 37, 37, 37, 37,
+ 37, 37, 37, 37, 37, 37, 37, 37, 37, 37,
+ 37, 37, 37, 37, 37, 37, 37, 37, 37, 37,
+ 37, 37, 37, 37, 37, 37, 37, 37, 37, 37,
+ 37, 37, 37, 37, 37, 37, 37, 37, 37, 37,
+ 37, 37, 37, 37, 37, 37, 37, 37, 37, 37,
+ 37, 37, 37, 37, 37, 37, 37, 37, 37, 37,
+ 37, 37, 37, 37, 37, 37, 37, 37, 37, 37,
+ 37, 37, 37, 37, 37, 37, 37, 37, 37, 0,
+ 37, 37, 37, 37, 37, 37, 37, 37, 37, 37,
+ 37, 37, 37, 37, 37, 37, 37, 37, 37, 0,
+ 37, 37, 0, 0, 37, 37, 37, 37, 37, 37,
+ 37, 37, 37, 37, 37, 37, 37, 37, 0, 0,
+ 37, 37, 37, 37, 37, 37, 37, 37, 37, 37,
+ 37, 37, 37, 10, 37, 37, 37, 37, 10, 37,
+ 37, 37, 37, 37, 37, 37, 37, 37, 37, 37,
+ 37, 37, 37, 37, 37, 37, 37, 37, 37, 37,
+ 37, 37, 37, 37, 37, 37, 37, 37, 37, 37,
+ 37, 37, 37, 37, 37, 37, 37, 37, 37, 37,
+ 37, 37, 37, 37, 37, 37, 37, 37, 37, 37,
+ 37, 37, 37, 37, 37, 37, 37, 37, 37, 37,
+ 37, 37, 37, 37, 37, 37, 37, 37, 37, 37,
+ 37, 37, 37, 37, 37, 37, 37, 37, 37, 37,
+ 37, 37, 37, 37, 37, 37,
+#else
+ 37, 37, 37, 37, 37, 37, 37, 37, 37, 37,
+ 37, 37, 37, 37, 37, 37, 37, 37, 37, 37,
+ 37, 37, 37, 37, 37, 37, 37, 37, 37, 37,
+ 37, 37, 37, 37, 37, 37, 37, 37, 37, 37,
+ 37, 37, 37, 37, 37, 37, 37, 37, 37, 37,
+ 37, 37, 37, 37, 37, 37, 37, 37, 37, 37,
+ 37, 37, 37, 37, 37, 37, 37, 37, 37, 37,
+ 37, 37, 37, 37, 37, 37, 37, 37, 37, 37,
+ 37, 37, 37, 37, 37, 37, 37, 37, 37, 37,
+ 37, 37, 37, 37, 37, 0, 37, 0, 37, 37,
+ 0, 0, 37, 37, 37, 37, 37, 37, 37, 0,
+ 0, 37, 37, 37, 37, 37, 10, 37, 37, 37,
+ 37, 10, 37, 37, 37, 37, 37, 37,
+#endif /* ACE_MVS */
+ };
+ return len + asso_values[(int) str[len - 1]] + asso_values[(int) str[0]];
+}
+
+const TAO_operation_db_entry *
+TAO_CORBA_TypedefDef_Perfect_Hash_OpTable::lookup (const char *str, unsigned int len)
+{
+ enum
+ {
+ TOTAL_KEYWORDS = 19,
+ MIN_WORD_LENGTH = 4,
+ MAX_WORD_LENGTH = 26,
+ MIN_HASH_VALUE = 4,
+ MAX_HASH_VALUE = 36,
+ HASH_VALUE_RANGE = 33,
+ DUPLICATES = 5,
+ WORDLIST_SIZE = 23
+ };
+
+ static const TAO_operation_db_entry wordlist[] =
+ {
+ {"",0,0},{"",0,0},{"",0,0},{"",0,0},
+ {"move", &POA_CORBA::TypedefDef::move_skel, 0},
+ {"_is_a", &POA_CORBA::TypedefDef::_is_a_skel, 0},
+ {"_get_id", &POA_CORBA::TypedefDef::_get_id_skel, 0},
+ {"_set_id", &POA_CORBA::TypedefDef::_set_id_skel, 0},
+ {"describe", &POA_CORBA::TypedefDef::describe_skel, 0},
+ {"_get_name", &POA_CORBA::TypedefDef::_get_name_skel, 0},
+ {"_get_type", &POA_CORBA::TypedefDef::_get_type_skel, 0},
+ {"_set_name", &POA_CORBA::TypedefDef::_set_name_skel, 0},
+ {"_interface", &POA_CORBA::TypedefDef::_interface_skel, 0},
+ {"_get_version", &POA_CORBA::TypedefDef::_get_version_skel, 0},
+ {"_set_version", &POA_CORBA::TypedefDef::_set_version_skel, 0},
+ {"_get_def_kind", &POA_CORBA::TypedefDef::_get_def_kind_skel, 0},
+ {"_repository_id", &POA_CORBA::TypedefDef::_repository_id_skel, 0},
+ {"_get_defined_in", &POA_CORBA::TypedefDef::_get_defined_in_skel, 0},
+ {"destroy", &POA_CORBA::TypedefDef::destroy_skel, 0},
+ {"_get_absolute_name", &POA_CORBA::TypedefDef::_get_absolute_name_skel, 0},
+ {"_component", &POA_CORBA::TypedefDef::_component_skel, 0},
+ {"_non_existent", &POA_CORBA::TypedefDef::_non_existent_skel, 0},
+ {"_get_containing_repository", &POA_CORBA::TypedefDef::_get_containing_repository_skel, 0},
+ };
+
+ static const signed char lookup[] =
+ {
+ -9, -3, -13, -2, 4, 5, -1, 50, 8, -45, 12, -1, -46, 15,
+ 16, 17, -1, 18, 19, -1, 20, -6, -2, 21, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1, 22,
+ };
+
+ if (len <= MAX_WORD_LENGTH && len >= MIN_WORD_LENGTH)
+ {
+ unsigned int key = hash (str, len);
+
+ if (key <= MAX_HASH_VALUE && key >= MIN_HASH_VALUE)
+ {
+ int slot = lookup[key];
+
+ if (slot >= 0 && slot < WORDLIST_SIZE)
+ {
+ const char *s = wordlist[slot].opname;
+
+ if (*str == *s && !strncmp (str + 1, s + 1, len - 1))
+ return &wordlist[slot];
+ }
+ else if (slot < 0 && slot >= -MAX_HASH_VALUE)
+ return 0;
+ else
+ {
+ unsigned int offset = key + slot + (slot > 0 ? -MAX_HASH_VALUE : MAX_HASH_VALUE);
+ const TAO_operation_db_entry *base = &wordlist[-lookup[offset]];
+ const TAO_operation_db_entry *ptr = base + -lookup[offset + 1];
+
+ while (--ptr >= base)
+ if (*str == *ptr->opname && !strncmp (str + 1, ptr->opname + 1, len - 1))
+ return ptr;
+ }
+ }
+ }
+ return 0;
+}
+
+static TAO_CORBA_TypedefDef_Perfect_Hash_OpTable tao_CORBA_TypedefDef_optable;
+
+// TAO_IDL - Generated from
+// be\be_visitor_interface/interface_ss.cpp:966
+
+TAO::Collocation_Proxy_Broker *
+CORBA__TAO_TypedefDef_Proxy_Broker_Factory_function ( ::CORBA::Object_ptr)
+{
+ return reinterpret_cast<TAO::Collocation_Proxy_Broker *> (0xdead); // Dummy
+}
+
+int
+CORBA__TAO_TypedefDef_Proxy_Broker_Factory_Initializer (size_t)
+{
+ CORBA__TAO_TypedefDef_Proxy_Broker_Factory_function_pointer =
+ CORBA__TAO_TypedefDef_Proxy_Broker_Factory_function;
+
+ return 0;
+}
+
+static int
+CORBA__TAO_TypedefDef_Proxy_Broker_Stub_Factory_Initializer_Scarecrow =
+ CORBA__TAO_TypedefDef_Proxy_Broker_Factory_Initializer (
+ reinterpret_cast<size_t> (CORBA__TAO_TypedefDef_Proxy_Broker_Factory_Initializer)
+ );
+
+// TAO_IDL - Generated from
+// be\be_visitor_interface/interface_ss.cpp:103
+
+POA_CORBA::TypedefDef::TypedefDef (void)
+ : TAO_ServantBase ()
+{
+ this->optable_ = &tao_CORBA_TypedefDef_optable;
+}
+
+POA_CORBA::TypedefDef::TypedefDef (const TypedefDef& rhs)
+ : TAO_Abstract_ServantBase (rhs),
+ TAO_ServantBase (rhs),
+ POA_CORBA::IRObject (rhs),
+ POA_CORBA::Contained (rhs),
+ POA_CORBA::IDLType (rhs)
+{
+}
+
+POA_CORBA::TypedefDef::~TypedefDef (void)
+{
+}
+
+// TAO_IDL - Generated from
+// be\be_visitor_interface/interface_ss.cpp:169
+
+namespace POA_CORBA
+{
+
+
+ // TAO_IDL - Generated from
+ // be\be_visitor_operation/upcall_command_ss.cpp:127
+
+ class _is_a_TypedefDef_Upcall_Command
+ : public TAO::Upcall_Command
+ {
+ public:
+ inline _is_a_TypedefDef_Upcall_Command (
+ POA_CORBA::TypedefDef * servant,
+ TAO_Operation_Details const * operation_details,
+ TAO::Argument * const args[])
+ : servant_ (servant)
+ , operation_details_ (operation_details)
+ , args_ (args)
+ {
+ }
+
+ virtual void execute (ACE_ENV_SINGLE_ARG_DECL)
+ {
+ TAO::SArg_Traits< ::ACE_InputCDR::to_boolean>::ret_arg_type retval =
+ TAO::Portable_Server::get_ret_arg< ::ACE_InputCDR::to_boolean> (
+ this->operation_details_,
+ this->args_);
+
+ TAO::SArg_Traits< ::CORBA::Char *>::in_arg_type arg_1 =
+ TAO::Portable_Server::get_in_arg< ::CORBA::Char *> (
+ this->operation_details_,
+ this->args_,
+ 1);
+
+ retval =
+ this->servant_-> _is_a (
+ arg_1
+ ACE_ENV_ARG_PARAMETER);
+ ACE_CHECK;
+ }
+
+ private:
+ POA_CORBA::TypedefDef * const servant_;
+ TAO_Operation_Details const * const operation_details_;
+ TAO::Argument * const * const args_;
+ };
+}
+
+
+void POA_CORBA::TypedefDef::_is_a_skel (
+ TAO_ServerRequest & server_request,
+ void * TAO_INTERCEPTOR (servant_upcall),
+ void * servant
+ ACE_ENV_ARG_DECL
+ )
+{
+#if TAO_HAS_INTERCEPTORS == 1
+ static ::CORBA::TypeCode_ptr const * const exceptions = 0;
+ static ::CORBA::ULong const nexceptions = 0;
+#endif /* TAO_HAS_INTERCEPTORS */
+
+ TAO::SArg_Traits< ::ACE_InputCDR::to_boolean>::ret_val retval;
+ TAO::SArg_Traits< ::CORBA::Char *>::in_arg_val _tao_repository_id;
+
+ TAO::Argument * const args[] =
+ {
+ &retval,
+ &_tao_repository_id
+ };
+
+ static size_t const nargs = 2;
+
+ POA_CORBA::TypedefDef * const impl =
+ static_cast<POA_CORBA::TypedefDef *> (servant);
+
+ _is_a_TypedefDef_Upcall_Command command (
+ impl,
+ server_request.operation_details (),
+ args);
+
+ TAO::Upcall_Wrapper upcall_wrapper;
+ upcall_wrapper.upcall (server_request
+ , args
+ , nargs
+ , command
+#if TAO_HAS_INTERCEPTORS == 1
+ , servant_upcall
+ , exceptions
+ , nexceptions
+#endif /* TAO_HAS_INTERCEPTORS == 1 */
+ ACE_ENV_ARG_PARAMETER);
+ ACE_CHECK;
+}namespace POA_CORBA
+{
+
+
+ // TAO_IDL - Generated from
+ // be\be_visitor_operation/upcall_command_ss.cpp:127
+
+ class _non_existent_TypedefDef_Upcall_Command
+ : public TAO::Upcall_Command
+ {
+ public:
+ inline _non_existent_TypedefDef_Upcall_Command (
+ POA_CORBA::TypedefDef * servant,
+ TAO_Operation_Details const * operation_details,
+ TAO::Argument * const args[])
+ : servant_ (servant)
+ , operation_details_ (operation_details)
+ , args_ (args)
+ {
+ }
+
+ virtual void execute (ACE_ENV_SINGLE_ARG_DECL)
+ {
+ TAO::SArg_Traits< ::ACE_InputCDR::to_boolean>::ret_arg_type retval =
+ TAO::Portable_Server::get_ret_arg< ::ACE_InputCDR::to_boolean> (
+ this->operation_details_,
+ this->args_);
+
+ retval =
+ this->servant_-> _non_existent (
+ ACE_ENV_SINGLE_ARG_PARAMETER);
+ ACE_CHECK;
+ }
+
+ private:
+ POA_CORBA::TypedefDef * const servant_;
+ TAO_Operation_Details const * const operation_details_;
+ TAO::Argument * const * const args_;
+ };
+}
+
+
+void POA_CORBA::TypedefDef::_non_existent_skel (
+ TAO_ServerRequest & server_request,
+ void * TAO_INTERCEPTOR (servant_upcall),
+ void * servant
+ ACE_ENV_ARG_DECL
+ )
+{
+#if TAO_HAS_INTERCEPTORS == 1
+ static ::CORBA::TypeCode_ptr const * const exceptions = 0;
+ static ::CORBA::ULong const nexceptions = 0;
+#endif /* TAO_HAS_INTERCEPTORS */
+
+ TAO::SArg_Traits< ::ACE_InputCDR::to_boolean>::ret_val retval;
+
+ TAO::Argument * const args[] =
+ {
+ &retval
+ };
+
+ static size_t const nargs = 1;
+
+ POA_CORBA::TypedefDef * const impl =
+ static_cast<POA_CORBA::TypedefDef *> (servant);
+
+ _non_existent_TypedefDef_Upcall_Command command (
+ impl,
+ server_request.operation_details (),
+ args);
+
+ TAO::Upcall_Wrapper upcall_wrapper;
+ upcall_wrapper.upcall (server_request
+ , args
+ , nargs
+ , command
+#if TAO_HAS_INTERCEPTORS == 1
+ , servant_upcall
+ , exceptions
+ , nexceptions
+#endif /* TAO_HAS_INTERCEPTORS == 1 */
+ ACE_ENV_ARG_PARAMETER);
+ ACE_CHECK;
+}namespace POA_CORBA
+{
+
+
+ // TAO_IDL - Generated from
+ // be\be_visitor_operation/upcall_command_ss.cpp:127
+
+ class _repository_id_TypedefDef_Upcall_Command
+ : public TAO::Upcall_Command
+ {
+ public:
+ inline _repository_id_TypedefDef_Upcall_Command (
+ POA_CORBA::TypedefDef * servant,
+ TAO_Operation_Details const * operation_details,
+ TAO::Argument * const args[])
+ : servant_ (servant)
+ , operation_details_ (operation_details)
+ , args_ (args)
+ {
+ }
+
+ virtual void execute (ACE_ENV_SINGLE_ARG_DECL)
+ {
+ TAO::SArg_Traits< ::CORBA::Char *>::ret_arg_type retval =
+ TAO::Portable_Server::get_ret_arg< ::CORBA::Char *> (
+ this->operation_details_,
+ this->args_);
+
+ retval =
+ this->servant_-> _repository_id (
+ ACE_ENV_SINGLE_ARG_PARAMETER);
+ ACE_CHECK;
+ }
+
+ private:
+ POA_CORBA::TypedefDef * const servant_;
+ TAO_Operation_Details const * const operation_details_;
+ TAO::Argument * const * const args_;
+ };
+}
+
+
+void POA_CORBA::TypedefDef::_repository_id_skel (
+ TAO_ServerRequest & server_request,
+ void * TAO_INTERCEPTOR (servant_upcall),
+ void * servant
+ ACE_ENV_ARG_DECL
+ )
+{
+#if TAO_HAS_INTERCEPTORS == 1
+ static ::CORBA::TypeCode_ptr const * const exceptions = 0;
+ static ::CORBA::ULong const nexceptions = 0;
+#endif /* TAO_HAS_INTERCEPTORS */
+
+ TAO::SArg_Traits< ::CORBA::Char *>::ret_val retval;
+
+ TAO::Argument * const args[] =
+ {
+ &retval
+ };
+
+ static size_t const nargs = 1;
+
+ POA_CORBA::TypedefDef * const impl =
+ static_cast<POA_CORBA::TypedefDef *> (servant);
+
+ _repository_id_TypedefDef_Upcall_Command command (
+ impl,
+ server_request.operation_details (),
+ args);
+
+ TAO::Upcall_Wrapper upcall_wrapper;
+ upcall_wrapper.upcall (server_request
+ , args
+ , nargs
+ , command
+#if TAO_HAS_INTERCEPTORS == 1
+ , servant_upcall
+ , exceptions
+ , nexceptions
+#endif /* TAO_HAS_INTERCEPTORS == 1 */
+ ACE_ENV_ARG_PARAMETER);
+ ACE_CHECK;
+}
+
+// TAO_IDL - Generated from
+// be\be_visitor_interface/interface_ss.cpp:513
+
+void POA_CORBA::TypedefDef::_interface_skel (
+ TAO_ServerRequest & server_request,
+ void * /* servant_upcall */,
+ void * servant
+ ACE_ENV_ARG_DECL
+ )
+{
+ TAO_IFR_Client_Adapter *_tao_adapter =
+ ACE_Dynamic_Service<TAO_IFR_Client_Adapter>::instance (
+ TAO_ORB_Core::ifr_client_adapter_name ()
+ );
+
+ if (_tao_adapter == 0)
+ {
+ ACE_THROW ( ::CORBA::INTF_REPOS ( ::CORBA::OMGVMCID | 1,
+ ::CORBA::COMPLETED_NO));
+ }
+
+ POA_CORBA::TypedefDef * const impl =
+ static_cast<POA_CORBA::TypedefDef *> (servant);
+ ::CORBA::InterfaceDef_ptr _tao_retval =
+ impl->_get_interface (ACE_ENV_SINGLE_ARG_PARAMETER);
+ ACE_CHECK;
+
+ server_request.init_reply ();
+ TAO_OutputCDR &_tao_out = *server_request.outgoing ();
+
+ ::CORBA::Boolean const _tao_result =
+ _tao_adapter->interfacedef_cdr_insert (
+ _tao_out,
+ _tao_retval
+ );
+
+ _tao_adapter->dispose (_tao_retval);
+
+ if (_tao_result == false)
+ {
+ ACE_THROW ( ::CORBA::MARSHAL ());
+ }
+}namespace POA_CORBA
+{
+
+
+ // TAO_IDL - Generated from
+ // be\be_visitor_operation/upcall_command_ss.cpp:127
+
+ class _get_component_TypedefDef_Upcall_Command
+ : public TAO::Upcall_Command
+ {
+ public:
+ inline _get_component_TypedefDef_Upcall_Command (
+ POA_CORBA::TypedefDef * servant,
+ TAO_Operation_Details const * operation_details,
+ TAO::Argument * const args[])
+ : servant_ (servant)
+ , operation_details_ (operation_details)
+ , args_ (args)
+ {
+ }
+
+ virtual void execute (ACE_ENV_SINGLE_ARG_DECL)
+ {
+ TAO::SArg_Traits< ::CORBA::Object>::ret_arg_type retval =
+ TAO::Portable_Server::get_ret_arg< ::CORBA::Object> (
+ this->operation_details_,
+ this->args_);
+
+ retval =
+ this->servant_-> _get_component (
+ ACE_ENV_SINGLE_ARG_PARAMETER);
+ ACE_CHECK;
+ }
+
+ private:
+ POA_CORBA::TypedefDef * const servant_;
+ TAO_Operation_Details const * const operation_details_;
+ TAO::Argument * const * const args_;
+ };
+}
+
+
+void POA_CORBA::TypedefDef::_component_skel (
+ TAO_ServerRequest & server_request,
+ void * TAO_INTERCEPTOR (servant_upcall),
+ void * servant
+ ACE_ENV_ARG_DECL
+ )
+{
+#if TAO_HAS_INTERCEPTORS == 1
+ static ::CORBA::TypeCode_ptr const * const exceptions = 0;
+ static ::CORBA::ULong const nexceptions = 0;
+#endif /* TAO_HAS_INTERCEPTORS */
+
+ TAO::SArg_Traits< ::CORBA::Object>::ret_val retval;
+
+ TAO::Argument * const args[] =
+ {
+ &retval
+ };
+
+ static size_t const nargs = 1;
+
+ POA_CORBA::TypedefDef * const impl =
+ static_cast<POA_CORBA::TypedefDef *> (servant);
+
+ _get_component_TypedefDef_Upcall_Command command (
+ impl,
+ server_request.operation_details (),
+ args);
+
+ TAO::Upcall_Wrapper upcall_wrapper;
+ upcall_wrapper.upcall (server_request
+ , args
+ , nargs
+ , command
+#if TAO_HAS_INTERCEPTORS == 1
+ , servant_upcall
+ , exceptions
+ , nexceptions
+#endif /* TAO_HAS_INTERCEPTORS == 1 */
+ ACE_ENV_ARG_PARAMETER);
+ ACE_CHECK;
+}
+
+::CORBA::Boolean POA_CORBA::TypedefDef::_is_a (
+ const char* value
+ ACE_ENV_ARG_DECL_NOT_USED
+ )
+{
+ return
+ (
+ !ACE_OS::strcmp (
+ value,
+ "IDL:omg.org/CORBA/IRObject:1.0"
+ ) ||
+ !ACE_OS::strcmp (
+ value,
+ "IDL:omg.org/CORBA/Contained:1.0"
+ ) ||
+ !ACE_OS::strcmp (
+ value,
+ "IDL:omg.org/CORBA/IDLType:1.0"
+ ) ||
+ !ACE_OS::strcmp (
+ value,
+ "IDL:omg.org/CORBA/TypedefDef:1.0"
+ ) ||
+ !ACE_OS::strcmp (
+ value,
+ "IDL:omg.org/CORBA/Object:1.0"
+ )
+ );
+}
+
+const char* POA_CORBA::TypedefDef::_interface_repository_id (void) const
+{
+ return "IDL:omg.org/CORBA/TypedefDef:1.0";
+}
+
+// TAO_IDL - Generated from
+// be\be_visitor_interface/interface_ss.cpp:903
+
+void POA_CORBA::TypedefDef::_dispatch (
+ TAO_ServerRequest & req,
+ void * servant_upcall
+ ACE_ENV_ARG_DECL
+ )
+{
+ this->synchronous_upcall_dispatch (req,
+ servant_upcall,
+ this
+ ACE_ENV_ARG_PARAMETER);
+}
+
+// TAO_IDL - Generated from
+// be\be_visitor_interface/interface_ss.cpp:851
+
+CORBA::TypedefDef *
+POA_CORBA::TypedefDef::_this (ACE_ENV_SINGLE_ARG_DECL)
+{
+ TAO_Stub *stub = this->_create_stub (ACE_ENV_SINGLE_ARG_PARAMETER);
+ ACE_CHECK_RETURN (0);
+
+ TAO_Stub_Auto_Ptr safe_stub (stub);
+ ::CORBA::Object_ptr tmp = CORBA::Object::_nil ();
+
+ ::CORBA::Boolean const _tao_opt_colloc =
+ stub->servant_orb_var ()->orb_core ()->optimize_collocation_objects ();
+
+ ACE_NEW_RETURN (
+ tmp,
+ ::CORBA::Object (stub, _tao_opt_colloc, this),
+ 0
+ );
+
+ ::CORBA::Object_var obj = tmp;
+ (void) safe_stub.release ();
+
+ typedef ::CORBA::TypedefDef STUB_SCOPED_NAME;
+ return
+ TAO::Narrow_Utils<STUB_SCOPED_NAME>::unchecked_narrow (
+ obj.in (),
+ CORBA__TAO_TypedefDef_Proxy_Broker_Factory_function_pointer
+ );
+}
+
+TAO_END_VERSIONED_NAMESPACE_DECL
+
+
+
+#endif /* ifndef */
+
diff --git a/TAO/orbsvcs/orbsvcs/IFRService/IFR_BaseS.h b/TAO/orbsvcs/orbsvcs/IFRService/IFR_BaseS.h
new file mode 100644
index 00000000000..21a0ef54637
--- /dev/null
+++ b/TAO/orbsvcs/orbsvcs/IFRService/IFR_BaseS.h
@@ -0,0 +1,1261 @@
+// -*- C++ -*-
+//
+// $Id$
+
+// **** Code generated by the The ACE ORB (TAO) IDL Compiler ****
+// TAO and the TAO IDL Compiler have been developed by:
+// Center for Distributed Object Computing
+// Washington University
+// St. Louis, MO
+// USA
+// http://www.cs.wustl.edu/~schmidt/doc-center.html
+// and
+// Distributed Object Computing Laboratory
+// University of California at Irvine
+// Irvine, CA
+// USA
+// http://doc.ece.uci.edu/
+// and
+// Institute for Software Integrated Systems
+// Vanderbilt University
+// Nashville, TN
+// USA
+// http://www.isis.vanderbilt.edu/
+//
+// Information about TAO is available at:
+// http://www.cs.wustl.edu/~schmidt/TAO.html
+
+// TAO_IDL - Generated from
+// be\be_codegen.cpp:409
+
+#ifndef _TAO_IDL____ORBSVCS_ORBSVCS_IFRSERVICE_IFR_BASES_H_
+#define _TAO_IDL____ORBSVCS_ORBSVCS_IFRSERVICE_IFR_BASES_H_
+
+#include /**/ "ace/pre.h"
+
+#include "tao/IFR_Client/IFR_BaseC.h"
+#include "tao/orb_typesS.h"
+#include "tao/Typecode_typesS.h"
+
+#if !defined (ACE_LACKS_PRAGMA_ONCE)
+# pragma once
+#endif /* ACE_LACKS_PRAGMA_ONCE */
+
+#include "tao/Collocation_Proxy_Broker.h"
+#include "tao/PortableServer/PortableServer.h"
+#include "tao/PortableServer/Servant_Base.h"
+
+TAO_BEGIN_VERSIONED_NAMESPACE_DECL
+
+
+
+// TAO_IDL - Generated from
+// be\be_visitor_module/module_sh.cpp:49
+
+namespace POA_CORBA
+{
+
+
+ // TAO_IDL - Generated from
+ // be\be_visitor_interface/interface_sh.cpp:87
+
+ class IRObject;
+ typedef IRObject *IRObject_ptr;
+
+ class IRObject
+ : public virtual PortableServer::ServantBase
+ {
+ protected:
+ IRObject (void);
+
+ public:
+ // Useful for template programming.
+ typedef ::CORBA::IRObject _stub_type;
+ typedef ::CORBA::IRObject_ptr _stub_ptr_type;
+ typedef ::CORBA::IRObject_var _stub_var_type;
+
+ IRObject (const IRObject& rhs);
+ virtual ~IRObject (void);
+
+ virtual ::CORBA::Boolean _is_a (
+ const char* logical_type_id
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS
+ );
+
+ static void _is_a_skel (
+ TAO_ServerRequest & req,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL
+ );
+
+ static void _non_existent_skel (
+ TAO_ServerRequest & req,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL
+ );
+
+ static void _interface_skel (
+ TAO_ServerRequest & req,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL
+ );
+
+ static void _component_skel (
+ TAO_ServerRequest & req,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL
+ );
+
+ static void _repository_id_skel (
+ TAO_ServerRequest & req,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL
+ );
+
+ virtual void _dispatch (
+ TAO_ServerRequest & req,
+ void * servant_upcall
+ ACE_ENV_ARG_DECL
+ );
+
+ ::CORBA::IRObject *_this (
+
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS
+ );
+
+ virtual const char* _interface_repository_id (void) const;
+
+ // TAO_IDL - Generated from
+ // be\be_visitor_operation/operation_sh.cpp:45
+
+ virtual ::CORBA::DefinitionKind def_kind (
+ ACE_ENV_SINGLE_ARG_DECL_WITH_DEFAULTS
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ )) = 0;
+
+ static void _get_def_kind_skel (
+ TAO_ServerRequest & server_request,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL
+ );
+
+ // TAO_IDL - Generated from
+ // be\be_visitor_operation/operation_sh.cpp:45
+
+ virtual void destroy (
+ ACE_ENV_SINGLE_ARG_DECL_WITH_DEFAULTS
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ )) = 0;
+
+ static void destroy_skel (
+ TAO_ServerRequest & server_request,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL
+ );
+ };
+
+ // TAO_IDL - Generated from
+ // be\be_visitor_interface/interface_sh.cpp:87
+
+ class Contained;
+ typedef Contained *Contained_ptr;
+
+ class Contained
+ : public virtual POA_CORBA::IRObject
+ {
+ protected:
+ Contained (void);
+
+ public:
+ // Useful for template programming.
+ typedef ::CORBA::Contained _stub_type;
+ typedef ::CORBA::Contained_ptr _stub_ptr_type;
+ typedef ::CORBA::Contained_var _stub_var_type;
+
+ Contained (const Contained& rhs);
+ virtual ~Contained (void);
+
+ virtual ::CORBA::Boolean _is_a (
+ const char* logical_type_id
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS
+ );
+
+ static void _is_a_skel (
+ TAO_ServerRequest & req,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL
+ );
+
+ static void _non_existent_skel (
+ TAO_ServerRequest & req,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL
+ );
+
+ static void _interface_skel (
+ TAO_ServerRequest & req,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL
+ );
+
+ static void _component_skel (
+ TAO_ServerRequest & req,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL
+ );
+
+ static void _repository_id_skel (
+ TAO_ServerRequest & req,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL
+ );
+
+ virtual void _dispatch (
+ TAO_ServerRequest & req,
+ void * servant_upcall
+ ACE_ENV_ARG_DECL
+ );
+
+ ::CORBA::Contained *_this (
+
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS
+ );
+
+ virtual const char* _interface_repository_id (void) const;
+
+ // TAO_IDL - Generated from
+ // be\be_visitor_operation/operation_sh.cpp:45
+
+ virtual char * id (
+ ACE_ENV_SINGLE_ARG_DECL_WITH_DEFAULTS
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ )) = 0;
+
+ static void _get_id_skel (
+ TAO_ServerRequest & server_request,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL
+ );
+
+ // TAO_IDL - Generated from
+ // be\be_visitor_operation/operation_sh.cpp:45
+
+ virtual void id (
+ const char * id
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ )) = 0;
+
+ static void _set_id_skel (
+ TAO_ServerRequest & server_request,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL
+ );
+
+ // TAO_IDL - Generated from
+ // be\be_visitor_operation/operation_sh.cpp:45
+
+ virtual char * name (
+ ACE_ENV_SINGLE_ARG_DECL_WITH_DEFAULTS
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ )) = 0;
+
+ static void _get_name_skel (
+ TAO_ServerRequest & server_request,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL
+ );
+
+ // TAO_IDL - Generated from
+ // be\be_visitor_operation/operation_sh.cpp:45
+
+ virtual void name (
+ const char * name
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ )) = 0;
+
+ static void _set_name_skel (
+ TAO_ServerRequest & server_request,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL
+ );
+
+ // TAO_IDL - Generated from
+ // be\be_visitor_operation/operation_sh.cpp:45
+
+ virtual char * version (
+ ACE_ENV_SINGLE_ARG_DECL_WITH_DEFAULTS
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ )) = 0;
+
+ static void _get_version_skel (
+ TAO_ServerRequest & server_request,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL
+ );
+
+ // TAO_IDL - Generated from
+ // be\be_visitor_operation/operation_sh.cpp:45
+
+ virtual void version (
+ const char * version
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ )) = 0;
+
+ static void _set_version_skel (
+ TAO_ServerRequest & server_request,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL
+ );
+
+ // TAO_IDL - Generated from
+ // be\be_visitor_operation/operation_sh.cpp:45
+
+ virtual ::CORBA::Container_ptr defined_in (
+ ACE_ENV_SINGLE_ARG_DECL_WITH_DEFAULTS
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ )) = 0;
+
+ static void _get_defined_in_skel (
+ TAO_ServerRequest & server_request,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL
+ );
+
+ // TAO_IDL - Generated from
+ // be\be_visitor_operation/operation_sh.cpp:45
+
+ virtual char * absolute_name (
+ ACE_ENV_SINGLE_ARG_DECL_WITH_DEFAULTS
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ )) = 0;
+
+ static void _get_absolute_name_skel (
+ TAO_ServerRequest & server_request,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL
+ );
+
+ // TAO_IDL - Generated from
+ // be\be_visitor_operation/operation_sh.cpp:45
+
+ virtual ::CORBA::Repository_ptr containing_repository (
+ ACE_ENV_SINGLE_ARG_DECL_WITH_DEFAULTS
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ )) = 0;
+
+ static void _get_containing_repository_skel (
+ TAO_ServerRequest & server_request,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL
+ );
+
+ // TAO_IDL - Generated from
+ // be\be_visitor_operation/operation_sh.cpp:45
+
+ virtual ::CORBA::Contained::Description * describe (
+ ACE_ENV_SINGLE_ARG_DECL_WITH_DEFAULTS
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ )) = 0;
+
+ static void describe_skel (
+ TAO_ServerRequest & server_request,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL
+ );
+
+ // TAO_IDL - Generated from
+ // be\be_visitor_operation/operation_sh.cpp:45
+
+ virtual void move (
+ ::CORBA::Container_ptr new_container,
+ const char * new_name,
+ const char * new_version
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ )) = 0;
+
+ static void move_skel (
+ TAO_ServerRequest & server_request,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL
+ );
+
+ static void
+ _get_def_kind_skel (
+ TAO_ServerRequest & server_request,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS
+ );
+
+ // TAO_IDL - Generated from
+ // be\be_interface.cpp:1955
+
+ static void
+ destroy_skel (
+ TAO_ServerRequest & server_request,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS
+ );
+ };
+
+ // TAO_IDL - Generated from
+ // be\be_visitor_interface/interface_sh.cpp:87
+
+ class Container;
+ typedef Container *Container_ptr;
+
+ class Container
+ : public virtual POA_CORBA::IRObject
+ {
+ protected:
+ Container (void);
+
+ public:
+ // Useful for template programming.
+ typedef ::CORBA::Container _stub_type;
+ typedef ::CORBA::Container_ptr _stub_ptr_type;
+ typedef ::CORBA::Container_var _stub_var_type;
+
+ Container (const Container& rhs);
+ virtual ~Container (void);
+
+ virtual ::CORBA::Boolean _is_a (
+ const char* logical_type_id
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS
+ );
+
+ static void _is_a_skel (
+ TAO_ServerRequest & req,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL
+ );
+
+ static void _non_existent_skel (
+ TAO_ServerRequest & req,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL
+ );
+
+ static void _interface_skel (
+ TAO_ServerRequest & req,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL
+ );
+
+ static void _component_skel (
+ TAO_ServerRequest & req,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL
+ );
+
+ static void _repository_id_skel (
+ TAO_ServerRequest & req,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL
+ );
+
+ virtual void _dispatch (
+ TAO_ServerRequest & req,
+ void * servant_upcall
+ ACE_ENV_ARG_DECL
+ );
+
+ ::CORBA::Container *_this (
+
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS
+ );
+
+ virtual const char* _interface_repository_id (void) const;
+
+ // TAO_IDL - Generated from
+ // be\be_visitor_operation/operation_sh.cpp:45
+
+ virtual ::CORBA::Contained_ptr lookup (
+ const char * search_name
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ )) = 0;
+
+ static void lookup_skel (
+ TAO_ServerRequest & server_request,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL
+ );
+
+ // TAO_IDL - Generated from
+ // be\be_visitor_operation/operation_sh.cpp:45
+
+ virtual ::CORBA::ContainedSeq * contents (
+ ::CORBA::DefinitionKind limit_type,
+ ::CORBA::Boolean exclude_inherited
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ )) = 0;
+
+ static void contents_skel (
+ TAO_ServerRequest & server_request,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL
+ );
+
+ // TAO_IDL - Generated from
+ // be\be_visitor_operation/operation_sh.cpp:45
+
+ virtual ::CORBA::ContainedSeq * lookup_name (
+ const char * search_name,
+ ::CORBA::Long levels_to_search,
+ ::CORBA::DefinitionKind limit_type,
+ ::CORBA::Boolean exclude_inherited
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ )) = 0;
+
+ static void lookup_name_skel (
+ TAO_ServerRequest & server_request,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL
+ );
+
+ // TAO_IDL - Generated from
+ // be\be_visitor_operation/operation_sh.cpp:45
+
+ virtual ::CORBA::Container::DescriptionSeq * describe_contents (
+ ::CORBA::DefinitionKind limit_type,
+ ::CORBA::Boolean exclude_inherited,
+ ::CORBA::Long max_returned_objs
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ )) = 0;
+
+ static void describe_contents_skel (
+ TAO_ServerRequest & server_request,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL
+ );
+
+ // TAO_IDL - Generated from
+ // be\be_visitor_operation/operation_sh.cpp:45
+
+ virtual ::CORBA::ModuleDef_ptr create_module (
+ const char * id,
+ const char * name,
+ const char * version
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ )) = 0;
+
+ static void create_module_skel (
+ TAO_ServerRequest & server_request,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL
+ );
+
+ // TAO_IDL - Generated from
+ // be\be_visitor_operation/operation_sh.cpp:45
+
+ virtual ::CORBA::ConstantDef_ptr create_constant (
+ const char * id,
+ const char * name,
+ const char * version,
+ ::CORBA::IDLType_ptr type,
+ const ::CORBA::Any & value
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ )) = 0;
+
+ static void create_constant_skel (
+ TAO_ServerRequest & server_request,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL
+ );
+
+ // TAO_IDL - Generated from
+ // be\be_visitor_operation/operation_sh.cpp:45
+
+ virtual ::CORBA::StructDef_ptr create_struct (
+ const char * id,
+ const char * name,
+ const char * version,
+ const ::CORBA::StructMemberSeq & members
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ )) = 0;
+
+ static void create_struct_skel (
+ TAO_ServerRequest & server_request,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL
+ );
+
+ // TAO_IDL - Generated from
+ // be\be_visitor_operation/operation_sh.cpp:45
+
+ virtual ::CORBA::UnionDef_ptr create_union (
+ const char * id,
+ const char * name,
+ const char * version,
+ ::CORBA::IDLType_ptr discriminator_type,
+ const ::CORBA::UnionMemberSeq & members
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ )) = 0;
+
+ static void create_union_skel (
+ TAO_ServerRequest & server_request,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL
+ );
+
+ // TAO_IDL - Generated from
+ // be\be_visitor_operation/operation_sh.cpp:45
+
+ virtual ::CORBA::EnumDef_ptr create_enum (
+ const char * id,
+ const char * name,
+ const char * version,
+ const ::CORBA::EnumMemberSeq & members
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ )) = 0;
+
+ static void create_enum_skel (
+ TAO_ServerRequest & server_request,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL
+ );
+
+ // TAO_IDL - Generated from
+ // be\be_visitor_operation/operation_sh.cpp:45
+
+ virtual ::CORBA::AliasDef_ptr create_alias (
+ const char * id,
+ const char * name,
+ const char * version,
+ ::CORBA::IDLType_ptr original_type
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ )) = 0;
+
+ static void create_alias_skel (
+ TAO_ServerRequest & server_request,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL
+ );
+
+ // TAO_IDL - Generated from
+ // be\be_visitor_operation/operation_sh.cpp:45
+
+ virtual ::CORBA::InterfaceDef_ptr create_interface (
+ const char * id,
+ const char * name,
+ const char * version,
+ const ::CORBA::InterfaceDefSeq & base_interfaces
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ )) = 0;
+
+ static void create_interface_skel (
+ TAO_ServerRequest & server_request,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL
+ );
+
+ // TAO_IDL - Generated from
+ // be\be_visitor_operation/operation_sh.cpp:45
+
+ virtual ::CORBA::ValueDef_ptr create_value (
+ const char * id,
+ const char * name,
+ const char * version,
+ ::CORBA::Boolean is_custom,
+ ::CORBA::Boolean is_abstract,
+ ::CORBA::ValueDef_ptr base_value,
+ ::CORBA::Boolean is_truncatable,
+ const ::CORBA::ValueDefSeq & abstract_base_values,
+ const ::CORBA::InterfaceDefSeq & supported_interfaces,
+ const ::CORBA::InitializerSeq & initializers
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ )) = 0;
+
+ static void create_value_skel (
+ TAO_ServerRequest & server_request,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL
+ );
+
+ // TAO_IDL - Generated from
+ // be\be_visitor_operation/operation_sh.cpp:45
+
+ virtual ::CORBA::ValueBoxDef_ptr create_value_box (
+ const char * id,
+ const char * name,
+ const char * version,
+ ::CORBA::IDLType_ptr original_type_def
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ )) = 0;
+
+ static void create_value_box_skel (
+ TAO_ServerRequest & server_request,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL
+ );
+
+ // TAO_IDL - Generated from
+ // be\be_visitor_operation/operation_sh.cpp:45
+
+ virtual ::CORBA::ExceptionDef_ptr create_exception (
+ const char * id,
+ const char * name,
+ const char * version,
+ const ::CORBA::StructMemberSeq & members
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ )) = 0;
+
+ static void create_exception_skel (
+ TAO_ServerRequest & server_request,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL
+ );
+
+ // TAO_IDL - Generated from
+ // be\be_visitor_operation/operation_sh.cpp:45
+
+ virtual ::CORBA::NativeDef_ptr create_native (
+ const char * id,
+ const char * name,
+ const char * version
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ )) = 0;
+
+ static void create_native_skel (
+ TAO_ServerRequest & server_request,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL
+ );
+
+ // TAO_IDL - Generated from
+ // be\be_visitor_operation/operation_sh.cpp:45
+
+ virtual ::CORBA::AbstractInterfaceDef_ptr create_abstract_interface (
+ const char * id,
+ const char * name,
+ const char * version,
+ const ::CORBA::AbstractInterfaceDefSeq & base_interfaces
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ )) = 0;
+
+ static void create_abstract_interface_skel (
+ TAO_ServerRequest & server_request,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL
+ );
+
+ // TAO_IDL - Generated from
+ // be\be_visitor_operation/operation_sh.cpp:45
+
+ virtual ::CORBA::LocalInterfaceDef_ptr create_local_interface (
+ const char * id,
+ const char * name,
+ const char * version,
+ const ::CORBA::InterfaceDefSeq & base_interfaces
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ )) = 0;
+
+ static void create_local_interface_skel (
+ TAO_ServerRequest & server_request,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL
+ );
+
+ // TAO_IDL - Generated from
+ // be\be_visitor_operation/operation_sh.cpp:45
+
+ virtual ::CORBA::ExtValueDef_ptr create_ext_value (
+ const char * id,
+ const char * name,
+ const char * version,
+ ::CORBA::Boolean is_custom,
+ ::CORBA::Boolean is_abstract,
+ ::CORBA::ValueDef_ptr base_value,
+ ::CORBA::Boolean is_truncatable,
+ const ::CORBA::ValueDefSeq & abstract_base_values,
+ const ::CORBA::InterfaceDefSeq & supported_interfaces,
+ const ::CORBA::ExtInitializerSeq & initializers
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ )) = 0;
+
+ static void create_ext_value_skel (
+ TAO_ServerRequest & server_request,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL
+ );
+
+ static void
+ _get_def_kind_skel (
+ TAO_ServerRequest & server_request,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS
+ );
+
+ // TAO_IDL - Generated from
+ // be\be_interface.cpp:1955
+
+ static void
+ destroy_skel (
+ TAO_ServerRequest & server_request,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS
+ );
+ };
+
+ // TAO_IDL - Generated from
+ // be\be_visitor_interface/interface_sh.cpp:87
+
+ class IDLType;
+ typedef IDLType *IDLType_ptr;
+
+ class IDLType
+ : public virtual POA_CORBA::IRObject
+ {
+ protected:
+ IDLType (void);
+
+ public:
+ // Useful for template programming.
+ typedef ::CORBA::IDLType _stub_type;
+ typedef ::CORBA::IDLType_ptr _stub_ptr_type;
+ typedef ::CORBA::IDLType_var _stub_var_type;
+
+ IDLType (const IDLType& rhs);
+ virtual ~IDLType (void);
+
+ virtual ::CORBA::Boolean _is_a (
+ const char* logical_type_id
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS
+ );
+
+ static void _is_a_skel (
+ TAO_ServerRequest & req,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL
+ );
+
+ static void _non_existent_skel (
+ TAO_ServerRequest & req,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL
+ );
+
+ static void _interface_skel (
+ TAO_ServerRequest & req,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL
+ );
+
+ static void _component_skel (
+ TAO_ServerRequest & req,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL
+ );
+
+ static void _repository_id_skel (
+ TAO_ServerRequest & req,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL
+ );
+
+ virtual void _dispatch (
+ TAO_ServerRequest & req,
+ void * servant_upcall
+ ACE_ENV_ARG_DECL
+ );
+
+ ::CORBA::IDLType *_this (
+
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS
+ );
+
+ virtual const char* _interface_repository_id (void) const;
+
+ // TAO_IDL - Generated from
+ // be\be_visitor_operation/operation_sh.cpp:45
+
+ virtual ::CORBA::TypeCode_ptr type (
+ ACE_ENV_SINGLE_ARG_DECL_WITH_DEFAULTS
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ )) = 0;
+
+ static void _get_type_skel (
+ TAO_ServerRequest & server_request,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL
+ );
+
+ static void
+ _get_def_kind_skel (
+ TAO_ServerRequest & server_request,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS
+ );
+
+ // TAO_IDL - Generated from
+ // be\be_interface.cpp:1955
+
+ static void
+ destroy_skel (
+ TAO_ServerRequest & server_request,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS
+ );
+ };
+
+ // TAO_IDL - Generated from
+ // be\be_visitor_interface/interface_sh.cpp:87
+
+ class TypedefDef;
+ typedef TypedefDef *TypedefDef_ptr;
+
+ class TypedefDef
+ : public virtual POA_CORBA::Contained,
+ public virtual POA_CORBA::IDLType
+ {
+ protected:
+ TypedefDef (void);
+
+ public:
+ // Useful for template programming.
+ typedef ::CORBA::TypedefDef _stub_type;
+ typedef ::CORBA::TypedefDef_ptr _stub_ptr_type;
+ typedef ::CORBA::TypedefDef_var _stub_var_type;
+
+ TypedefDef (const TypedefDef& rhs);
+ virtual ~TypedefDef (void);
+
+ virtual ::CORBA::Boolean _is_a (
+ const char* logical_type_id
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS
+ );
+
+ static void _is_a_skel (
+ TAO_ServerRequest & req,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL
+ );
+
+ static void _non_existent_skel (
+ TAO_ServerRequest & req,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL
+ );
+
+ static void _interface_skel (
+ TAO_ServerRequest & req,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL
+ );
+
+ static void _component_skel (
+ TAO_ServerRequest & req,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL
+ );
+
+ static void _repository_id_skel (
+ TAO_ServerRequest & req,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL
+ );
+
+ virtual void _dispatch (
+ TAO_ServerRequest & req,
+ void * servant_upcall
+ ACE_ENV_ARG_DECL
+ );
+
+ ::CORBA::TypedefDef *_this (
+
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS
+ );
+
+ virtual const char* _interface_repository_id (void) const;
+
+ static void
+ _get_def_kind_skel (
+ TAO_ServerRequest & server_request,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS
+ );
+
+ // TAO_IDL - Generated from
+ // be\be_interface.cpp:1955
+
+ static void
+ destroy_skel (
+ TAO_ServerRequest & server_request,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS
+ );
+
+ static void
+ _get_id_skel (
+ TAO_ServerRequest & server_request,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS
+ );
+
+ static void
+ _set_id_skel (
+ TAO_ServerRequest & server_request,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS
+ );
+
+ static void
+ _get_name_skel (
+ TAO_ServerRequest & server_request,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS
+ );
+
+ static void
+ _set_name_skel (
+ TAO_ServerRequest & server_request,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS
+ );
+
+ static void
+ _get_version_skel (
+ TAO_ServerRequest & server_request,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS
+ );
+
+ static void
+ _set_version_skel (
+ TAO_ServerRequest & server_request,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS
+ );
+
+ static void
+ _get_defined_in_skel (
+ TAO_ServerRequest & server_request,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS
+ );
+
+ static void
+ _get_absolute_name_skel (
+ TAO_ServerRequest & server_request,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS
+ );
+
+ static void
+ _get_containing_repository_skel (
+ TAO_ServerRequest & server_request,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS
+ );
+
+ // TAO_IDL - Generated from
+ // be\be_interface.cpp:1955
+
+ static void
+ describe_skel (
+ TAO_ServerRequest & server_request,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS
+ );
+
+ // TAO_IDL - Generated from
+ // be\be_interface.cpp:1955
+
+ static void
+ move_skel (
+ TAO_ServerRequest & server_request,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS
+ );
+
+ static void
+ _get_type_skel (
+ TAO_ServerRequest & server_request,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS
+ );
+ };
+
+// TAO_IDL - Generated from
+// be\be_visitor_module/module_sh.cpp:80
+
+} // module CORBA
+
+// TAO_IDL - Generated from
+// be\be_codegen.cpp:1219
+
+
+
+TAO_END_VERSIONED_NAMESPACE_DECL
+
+#include "IFR_BaseS_T.h"
+
+#if defined (__ACE_INLINE__)
+#include "IFR_BaseS.inl"
+#endif /* defined INLINE */
+
+#include /**/ "ace/post.h"
+#endif /* ifndef */
+
diff --git a/TAO/orbsvcs/orbsvcs/IFRService/IFR_BaseS.inl b/TAO/orbsvcs/orbsvcs/IFRService/IFR_BaseS.inl
new file mode 100644
index 00000000000..b1c86bdf5b9
--- /dev/null
+++ b/TAO/orbsvcs/orbsvcs/IFRService/IFR_BaseS.inl
@@ -0,0 +1,414 @@
+// -*- C++ -*-
+//
+// $Id$
+
+// **** Code generated by the The ACE ORB (TAO) IDL Compiler ****
+// TAO and the TAO IDL Compiler have been developed by:
+// Center for Distributed Object Computing
+// Washington University
+// St. Louis, MO
+// USA
+// http://www.cs.wustl.edu/~schmidt/doc-center.html
+// and
+// Distributed Object Computing Laboratory
+// University of California at Irvine
+// Irvine, CA
+// USA
+// http://doc.ece.uci.edu/
+// and
+// Institute for Software Integrated Systems
+// Vanderbilt University
+// Nashville, TN
+// USA
+// http://www.isis.vanderbilt.edu/
+//
+// Information about TAO is available at:
+// http://www.cs.wustl.edu/~schmidt/TAO.html
+
+
+TAO_BEGIN_VERSIONED_NAMESPACE_DECL
+
+
+
+ACE_INLINE
+void
+POA_CORBA::Contained::_get_def_kind_skel (
+ TAO_ServerRequest & server_request,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL
+ )
+{
+ POA_CORBA::IRObject * const impl = static_cast<POA_CORBA::Contained *> (servant);
+ POA_CORBA::IRObject::_get_def_kind_skel (
+ server_request,
+ servant_upcall,
+ impl
+ ACE_ENV_ARG_PARAMETER
+ );
+}
+
+// TAO_IDL - Generated from
+// be\be_interface.cpp:1955
+
+ACE_INLINE
+void
+POA_CORBA::Contained::destroy_skel (
+ TAO_ServerRequest & server_request,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL
+ )
+{
+ POA_CORBA::IRObject * const impl = static_cast<POA_CORBA::Contained *> (servant);
+ POA_CORBA::IRObject::destroy_skel (
+ server_request,
+ servant_upcall,
+ impl
+ ACE_ENV_ARG_PARAMETER
+ );
+}
+
+ACE_INLINE
+void
+POA_CORBA::Container::_get_def_kind_skel (
+ TAO_ServerRequest & server_request,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL
+ )
+{
+ POA_CORBA::IRObject * const impl = static_cast<POA_CORBA::Container *> (servant);
+ POA_CORBA::IRObject::_get_def_kind_skel (
+ server_request,
+ servant_upcall,
+ impl
+ ACE_ENV_ARG_PARAMETER
+ );
+}
+
+// TAO_IDL - Generated from
+// be\be_interface.cpp:1955
+
+ACE_INLINE
+void
+POA_CORBA::Container::destroy_skel (
+ TAO_ServerRequest & server_request,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL
+ )
+{
+ POA_CORBA::IRObject * const impl = static_cast<POA_CORBA::Container *> (servant);
+ POA_CORBA::IRObject::destroy_skel (
+ server_request,
+ servant_upcall,
+ impl
+ ACE_ENV_ARG_PARAMETER
+ );
+}
+
+ACE_INLINE
+void
+POA_CORBA::IDLType::_get_def_kind_skel (
+ TAO_ServerRequest & server_request,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL
+ )
+{
+ POA_CORBA::IRObject * const impl = static_cast<POA_CORBA::IDLType *> (servant);
+ POA_CORBA::IRObject::_get_def_kind_skel (
+ server_request,
+ servant_upcall,
+ impl
+ ACE_ENV_ARG_PARAMETER
+ );
+}
+
+// TAO_IDL - Generated from
+// be\be_interface.cpp:1955
+
+ACE_INLINE
+void
+POA_CORBA::IDLType::destroy_skel (
+ TAO_ServerRequest & server_request,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL
+ )
+{
+ POA_CORBA::IRObject * const impl = static_cast<POA_CORBA::IDLType *> (servant);
+ POA_CORBA::IRObject::destroy_skel (
+ server_request,
+ servant_upcall,
+ impl
+ ACE_ENV_ARG_PARAMETER
+ );
+}
+
+ACE_INLINE
+void
+POA_CORBA::TypedefDef::_get_def_kind_skel (
+ TAO_ServerRequest & server_request,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL
+ )
+{
+ POA_CORBA::IRObject * const impl = static_cast<POA_CORBA::TypedefDef *> (servant);
+ POA_CORBA::IRObject::_get_def_kind_skel (
+ server_request,
+ servant_upcall,
+ impl
+ ACE_ENV_ARG_PARAMETER
+ );
+}
+
+// TAO_IDL - Generated from
+// be\be_interface.cpp:1955
+
+ACE_INLINE
+void
+POA_CORBA::TypedefDef::destroy_skel (
+ TAO_ServerRequest & server_request,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL
+ )
+{
+ POA_CORBA::IRObject * const impl = static_cast<POA_CORBA::TypedefDef *> (servant);
+ POA_CORBA::IRObject::destroy_skel (
+ server_request,
+ servant_upcall,
+ impl
+ ACE_ENV_ARG_PARAMETER
+ );
+}
+
+ACE_INLINE
+void
+POA_CORBA::TypedefDef::_get_id_skel (
+ TAO_ServerRequest & server_request,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL
+ )
+{
+ POA_CORBA::Contained * const impl = static_cast<POA_CORBA::TypedefDef *> (servant);
+ POA_CORBA::Contained::_get_id_skel (
+ server_request,
+ servant_upcall,
+ impl
+ ACE_ENV_ARG_PARAMETER
+ );
+}
+
+ACE_INLINE
+void
+POA_CORBA::TypedefDef::_set_id_skel (
+ TAO_ServerRequest & server_request,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL
+ )
+{
+ POA_CORBA::Contained * const impl = static_cast<POA_CORBA::TypedefDef *> (servant);
+ POA_CORBA::Contained::_set_id_skel (
+ server_request,
+ servant_upcall,
+ impl
+ ACE_ENV_ARG_PARAMETER
+ );
+}
+
+ACE_INLINE
+void
+POA_CORBA::TypedefDef::_get_name_skel (
+ TAO_ServerRequest & server_request,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL
+ )
+{
+ POA_CORBA::Contained * const impl = static_cast<POA_CORBA::TypedefDef *> (servant);
+ POA_CORBA::Contained::_get_name_skel (
+ server_request,
+ servant_upcall,
+ impl
+ ACE_ENV_ARG_PARAMETER
+ );
+}
+
+ACE_INLINE
+void
+POA_CORBA::TypedefDef::_set_name_skel (
+ TAO_ServerRequest & server_request,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL
+ )
+{
+ POA_CORBA::Contained * const impl = static_cast<POA_CORBA::TypedefDef *> (servant);
+ POA_CORBA::Contained::_set_name_skel (
+ server_request,
+ servant_upcall,
+ impl
+ ACE_ENV_ARG_PARAMETER
+ );
+}
+
+ACE_INLINE
+void
+POA_CORBA::TypedefDef::_get_version_skel (
+ TAO_ServerRequest & server_request,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL
+ )
+{
+ POA_CORBA::Contained * const impl = static_cast<POA_CORBA::TypedefDef *> (servant);
+ POA_CORBA::Contained::_get_version_skel (
+ server_request,
+ servant_upcall,
+ impl
+ ACE_ENV_ARG_PARAMETER
+ );
+}
+
+ACE_INLINE
+void
+POA_CORBA::TypedefDef::_set_version_skel (
+ TAO_ServerRequest & server_request,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL
+ )
+{
+ POA_CORBA::Contained * const impl = static_cast<POA_CORBA::TypedefDef *> (servant);
+ POA_CORBA::Contained::_set_version_skel (
+ server_request,
+ servant_upcall,
+ impl
+ ACE_ENV_ARG_PARAMETER
+ );
+}
+
+ACE_INLINE
+void
+POA_CORBA::TypedefDef::_get_defined_in_skel (
+ TAO_ServerRequest & server_request,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL
+ )
+{
+ POA_CORBA::Contained * const impl = static_cast<POA_CORBA::TypedefDef *> (servant);
+ POA_CORBA::Contained::_get_defined_in_skel (
+ server_request,
+ servant_upcall,
+ impl
+ ACE_ENV_ARG_PARAMETER
+ );
+}
+
+ACE_INLINE
+void
+POA_CORBA::TypedefDef::_get_absolute_name_skel (
+ TAO_ServerRequest & server_request,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL
+ )
+{
+ POA_CORBA::Contained * const impl = static_cast<POA_CORBA::TypedefDef *> (servant);
+ POA_CORBA::Contained::_get_absolute_name_skel (
+ server_request,
+ servant_upcall,
+ impl
+ ACE_ENV_ARG_PARAMETER
+ );
+}
+
+ACE_INLINE
+void
+POA_CORBA::TypedefDef::_get_containing_repository_skel (
+ TAO_ServerRequest & server_request,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL
+ )
+{
+ POA_CORBA::Contained * const impl = static_cast<POA_CORBA::TypedefDef *> (servant);
+ POA_CORBA::Contained::_get_containing_repository_skel (
+ server_request,
+ servant_upcall,
+ impl
+ ACE_ENV_ARG_PARAMETER
+ );
+}
+
+// TAO_IDL - Generated from
+// be\be_interface.cpp:1955
+
+ACE_INLINE
+void
+POA_CORBA::TypedefDef::describe_skel (
+ TAO_ServerRequest & server_request,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL
+ )
+{
+ POA_CORBA::Contained * const impl = static_cast<POA_CORBA::TypedefDef *> (servant);
+ POA_CORBA::Contained::describe_skel (
+ server_request,
+ servant_upcall,
+ impl
+ ACE_ENV_ARG_PARAMETER
+ );
+}
+
+// TAO_IDL - Generated from
+// be\be_interface.cpp:1955
+
+ACE_INLINE
+void
+POA_CORBA::TypedefDef::move_skel (
+ TAO_ServerRequest & server_request,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL
+ )
+{
+ POA_CORBA::Contained * const impl = static_cast<POA_CORBA::TypedefDef *> (servant);
+ POA_CORBA::Contained::move_skel (
+ server_request,
+ servant_upcall,
+ impl
+ ACE_ENV_ARG_PARAMETER
+ );
+}
+
+ACE_INLINE
+void
+POA_CORBA::TypedefDef::_get_type_skel (
+ TAO_ServerRequest & server_request,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL
+ )
+{
+ POA_CORBA::IDLType * const impl = static_cast<POA_CORBA::TypedefDef *> (servant);
+ POA_CORBA::IDLType::_get_type_skel (
+ server_request,
+ servant_upcall,
+ impl
+ ACE_ENV_ARG_PARAMETER
+ );
+}
+
+
+TAO_END_VERSIONED_NAMESPACE_DECL
+
+
diff --git a/TAO/orbsvcs/orbsvcs/IFRService/IFR_BaseS_T.cpp b/TAO/orbsvcs/orbsvcs/IFRService/IFR_BaseS_T.cpp
new file mode 100644
index 00000000000..eb850447fe4
--- /dev/null
+++ b/TAO/orbsvcs/orbsvcs/IFRService/IFR_BaseS_T.cpp
@@ -0,0 +1,49 @@
+// -*- C++ -*-
+//
+// $Id$
+
+// **** Code generated by the The ACE ORB (TAO) IDL Compiler ****
+// TAO and the TAO IDL Compiler have been developed by:
+// Center for Distributed Object Computing
+// Washington University
+// St. Louis, MO
+// USA
+// http://www.cs.wustl.edu/~schmidt/doc-center.html
+// and
+// Distributed Object Computing Laboratory
+// University of California at Irvine
+// Irvine, CA
+// USA
+// http://doc.ece.uci.edu/
+// and
+// Institute for Software Integrated Systems
+// Vanderbilt University
+// Nashville, TN
+// USA
+// http://www.isis.vanderbilt.edu/
+//
+// Information about TAO is available at:
+// http://www.cs.wustl.edu/~schmidt/TAO.html
+
+// TAO_IDL - Generated from
+// be\be_codegen.cpp:683
+
+#ifndef _TAO_IDL____ORBSVCS_ORBSVCS_IFRSERVICE_IFR_BASES_T_CPP_
+#define _TAO_IDL____ORBSVCS_ORBSVCS_IFRSERVICE_IFR_BASES_T_CPP_
+
+#include "IFR_BaseS_T.h"
+
+#if !defined (__ACE_INLINE__)
+#include "IFR_BaseS_T.inl"
+#endif /* !defined INLINE */
+
+
+
+TAO_BEGIN_VERSIONED_NAMESPACE_DECL
+
+
+
+TAO_END_VERSIONED_NAMESPACE_DECL
+
+
+#endif /* ifndef */
diff --git a/TAO/orbsvcs/orbsvcs/IFRService/IFR_BaseS_T.h b/TAO/orbsvcs/orbsvcs/IFRService/IFR_BaseS_T.h
new file mode 100644
index 00000000000..cf226a5d3c5
--- /dev/null
+++ b/TAO/orbsvcs/orbsvcs/IFRService/IFR_BaseS_T.h
@@ -0,0 +1,927 @@
+// -*- C++ -*-
+//
+// $Id$
+
+// **** Code generated by the The ACE ORB (TAO) IDL Compiler ****
+// TAO and the TAO IDL Compiler have been developed by:
+// Center for Distributed Object Computing
+// Washington University
+// St. Louis, MO
+// USA
+// http://www.cs.wustl.edu/~schmidt/doc-center.html
+// and
+// Distributed Object Computing Laboratory
+// University of California at Irvine
+// Irvine, CA
+// USA
+// http://doc.ece.uci.edu/
+// and
+// Institute for Software Integrated Systems
+// Vanderbilt University
+// Nashville, TN
+// USA
+// http://www.isis.vanderbilt.edu/
+//
+// Information about TAO is available at:
+// http://www.cs.wustl.edu/~schmidt/TAO.html
+
+// TAO_IDL - Generated from
+// be\be_codegen.cpp:545
+
+#ifndef _TAO_IDL____ORBSVCS_ORBSVCS_IFRSERVICE_IFR_BASES_T_H_
+#define _TAO_IDL____ORBSVCS_ORBSVCS_IFRSERVICE_IFR_BASES_T_H_
+
+#include /**/ "ace/pre.h"
+
+TAO_BEGIN_VERSIONED_NAMESPACE_DECL
+
+
+
+// TAO_IDL - Generated from
+// be\be_visitor_root/root_sth.cpp:116
+
+namespace POA_CORBA
+{
+
+ // TAO_IDL - Generated from
+ // be\be_visitor_interface/tie_sh.cpp:87
+
+ // TIE class: Refer to CORBA v2.2, Section 20.34.4
+ template <class T>
+ class IRObject_tie : public IRObject
+ {
+ public:
+ /// the T& ctor
+ IRObject_tie (T &t);
+ /// ctor taking a POA
+ IRObject_tie (T &t, PortableServer::POA_ptr poa);
+ /// ctor taking pointer and an ownership flag
+ IRObject_tie (T *tp, ::CORBA::Boolean release = true);
+ /// ctor with T*, ownership flag and a POA
+ IRObject_tie (
+ T *tp,
+ PortableServer::POA_ptr poa,
+ ::CORBA::Boolean release = true
+ );
+ /// dtor
+
+ ~IRObject_tie (void);
+ // TIE specific functions
+ /// return the underlying object
+ T *_tied_object (void);
+ /// set the underlying object
+ void _tied_object (T &obj);
+ /// set the underlying object and the ownership flag
+ void _tied_object (T *obj, ::CORBA::Boolean release = true);
+ /// do we own it
+ ::CORBA::Boolean _is_owner (void);
+ /// set the ownership
+
+ void _is_owner ( ::CORBA::Boolean b);
+ // overridden ServantBase operations
+ PortableServer::POA_ptr _default_POA (
+ ACE_ENV_SINGLE_ARG_DECL_WITH_DEFAULTS
+ );
+
+ // TAO_IDL - Generated from
+ // be\be_visitor_operation/tie_sh.cpp:60
+
+ ::CORBA::DefinitionKind def_kind (
+ ACE_ENV_SINGLE_ARG_DECL_WITH_DEFAULTS
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ));
+
+ // TAO_IDL - Generated from
+ // be\be_visitor_operation/tie_sh.cpp:60
+
+ void destroy (
+ ACE_ENV_SINGLE_ARG_DECL_WITH_DEFAULTS
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ));
+
+ private:
+ T *ptr_;
+ PortableServer::POA_var poa_;
+ ::CORBA::Boolean rel_;
+
+ // copy and assignment are not allowed
+ IRObject_tie (const IRObject_tie &);
+ void operator= (const IRObject_tie &);
+ };
+
+ // TAO_IDL - Generated from
+ // be\be_visitor_interface/tie_sh.cpp:87
+
+ // TIE class: Refer to CORBA v2.2, Section 20.34.4
+ template <class T>
+ class Contained_tie : public Contained
+ {
+ public:
+ /// the T& ctor
+ Contained_tie (T &t);
+ /// ctor taking a POA
+ Contained_tie (T &t, PortableServer::POA_ptr poa);
+ /// ctor taking pointer and an ownership flag
+ Contained_tie (T *tp, ::CORBA::Boolean release = true);
+ /// ctor with T*, ownership flag and a POA
+ Contained_tie (
+ T *tp,
+ PortableServer::POA_ptr poa,
+ ::CORBA::Boolean release = true
+ );
+ /// dtor
+
+ ~Contained_tie (void);
+ // TIE specific functions
+ /// return the underlying object
+ T *_tied_object (void);
+ /// set the underlying object
+ void _tied_object (T &obj);
+ /// set the underlying object and the ownership flag
+ void _tied_object (T *obj, ::CORBA::Boolean release = true);
+ /// do we own it
+ ::CORBA::Boolean _is_owner (void);
+ /// set the ownership
+
+ void _is_owner ( ::CORBA::Boolean b);
+ // overridden ServantBase operations
+ PortableServer::POA_ptr _default_POA (
+ ACE_ENV_SINGLE_ARG_DECL_WITH_DEFAULTS
+ );
+
+ // TAO_IDL - Generated from
+ // be\be_visitor_operation/tie_sh.cpp:60
+
+ ::CORBA::DefinitionKind def_kind (
+ ACE_ENV_SINGLE_ARG_DECL_WITH_DEFAULTS
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ));
+
+ // TAO_IDL - Generated from
+ // be\be_visitor_operation/tie_sh.cpp:60
+
+ void destroy (
+ ACE_ENV_SINGLE_ARG_DECL_WITH_DEFAULTS
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ));
+
+ // TAO_IDL - Generated from
+ // be\be_visitor_operation/tie_sh.cpp:60
+
+ char * id (
+ ACE_ENV_SINGLE_ARG_DECL_WITH_DEFAULTS
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ));
+
+ // TAO_IDL - Generated from
+ // be\be_visitor_operation/tie_sh.cpp:60
+
+ void id (
+ const char * id
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ));
+
+ // TAO_IDL - Generated from
+ // be\be_visitor_operation/tie_sh.cpp:60
+
+ char * name (
+ ACE_ENV_SINGLE_ARG_DECL_WITH_DEFAULTS
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ));
+
+ // TAO_IDL - Generated from
+ // be\be_visitor_operation/tie_sh.cpp:60
+
+ void name (
+ const char * name
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ));
+
+ // TAO_IDL - Generated from
+ // be\be_visitor_operation/tie_sh.cpp:60
+
+ char * version (
+ ACE_ENV_SINGLE_ARG_DECL_WITH_DEFAULTS
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ));
+
+ // TAO_IDL - Generated from
+ // be\be_visitor_operation/tie_sh.cpp:60
+
+ void version (
+ const char * version
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ));
+
+ // TAO_IDL - Generated from
+ // be\be_visitor_operation/tie_sh.cpp:60
+
+ ::CORBA::Container_ptr defined_in (
+ ACE_ENV_SINGLE_ARG_DECL_WITH_DEFAULTS
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ));
+
+ // TAO_IDL - Generated from
+ // be\be_visitor_operation/tie_sh.cpp:60
+
+ char * absolute_name (
+ ACE_ENV_SINGLE_ARG_DECL_WITH_DEFAULTS
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ));
+
+ // TAO_IDL - Generated from
+ // be\be_visitor_operation/tie_sh.cpp:60
+
+ ::CORBA::Repository_ptr containing_repository (
+ ACE_ENV_SINGLE_ARG_DECL_WITH_DEFAULTS
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ));
+
+ // TAO_IDL - Generated from
+ // be\be_visitor_operation/tie_sh.cpp:60
+
+ ::CORBA::Contained::Description * describe (
+ ACE_ENV_SINGLE_ARG_DECL_WITH_DEFAULTS
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ));
+
+ // TAO_IDL - Generated from
+ // be\be_visitor_operation/tie_sh.cpp:60
+
+ void move (
+ ::CORBA::Container_ptr new_container,
+ const char * new_name,
+ const char * new_version
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ));
+
+ private:
+ T *ptr_;
+ PortableServer::POA_var poa_;
+ ::CORBA::Boolean rel_;
+
+ // copy and assignment are not allowed
+ Contained_tie (const Contained_tie &);
+ void operator= (const Contained_tie &);
+ };
+
+ // TAO_IDL - Generated from
+ // be\be_visitor_interface/tie_sh.cpp:87
+
+ // TIE class: Refer to CORBA v2.2, Section 20.34.4
+ template <class T>
+ class Container_tie : public Container
+ {
+ public:
+ /// the T& ctor
+ Container_tie (T &t);
+ /// ctor taking a POA
+ Container_tie (T &t, PortableServer::POA_ptr poa);
+ /// ctor taking pointer and an ownership flag
+ Container_tie (T *tp, ::CORBA::Boolean release = true);
+ /// ctor with T*, ownership flag and a POA
+ Container_tie (
+ T *tp,
+ PortableServer::POA_ptr poa,
+ ::CORBA::Boolean release = true
+ );
+ /// dtor
+
+ ~Container_tie (void);
+ // TIE specific functions
+ /// return the underlying object
+ T *_tied_object (void);
+ /// set the underlying object
+ void _tied_object (T &obj);
+ /// set the underlying object and the ownership flag
+ void _tied_object (T *obj, ::CORBA::Boolean release = true);
+ /// do we own it
+ ::CORBA::Boolean _is_owner (void);
+ /// set the ownership
+
+ void _is_owner ( ::CORBA::Boolean b);
+ // overridden ServantBase operations
+ PortableServer::POA_ptr _default_POA (
+ ACE_ENV_SINGLE_ARG_DECL_WITH_DEFAULTS
+ );
+
+ // TAO_IDL - Generated from
+ // be\be_visitor_operation/tie_sh.cpp:60
+
+ ::CORBA::DefinitionKind def_kind (
+ ACE_ENV_SINGLE_ARG_DECL_WITH_DEFAULTS
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ));
+
+ // TAO_IDL - Generated from
+ // be\be_visitor_operation/tie_sh.cpp:60
+
+ void destroy (
+ ACE_ENV_SINGLE_ARG_DECL_WITH_DEFAULTS
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ));
+
+ // TAO_IDL - Generated from
+ // be\be_visitor_operation/tie_sh.cpp:60
+
+ ::CORBA::Contained_ptr lookup (
+ const char * search_name
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ));
+
+ // TAO_IDL - Generated from
+ // be\be_visitor_operation/tie_sh.cpp:60
+
+ ::CORBA::ContainedSeq * contents (
+ ::CORBA::DefinitionKind limit_type,
+ ::CORBA::Boolean exclude_inherited
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ));
+
+ // TAO_IDL - Generated from
+ // be\be_visitor_operation/tie_sh.cpp:60
+
+ ::CORBA::ContainedSeq * lookup_name (
+ const char * search_name,
+ ::CORBA::Long levels_to_search,
+ ::CORBA::DefinitionKind limit_type,
+ ::CORBA::Boolean exclude_inherited
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ));
+
+ // TAO_IDL - Generated from
+ // be\be_visitor_operation/tie_sh.cpp:60
+
+ ::CORBA::Container::DescriptionSeq * describe_contents (
+ ::CORBA::DefinitionKind limit_type,
+ ::CORBA::Boolean exclude_inherited,
+ ::CORBA::Long max_returned_objs
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ));
+
+ // TAO_IDL - Generated from
+ // be\be_visitor_operation/tie_sh.cpp:60
+
+ ::CORBA::ModuleDef_ptr create_module (
+ const char * id,
+ const char * name,
+ const char * version
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ));
+
+ // TAO_IDL - Generated from
+ // be\be_visitor_operation/tie_sh.cpp:60
+
+ ::CORBA::ConstantDef_ptr create_constant (
+ const char * id,
+ const char * name,
+ const char * version,
+ ::CORBA::IDLType_ptr type,
+ const ::CORBA::Any & value
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ));
+
+ // TAO_IDL - Generated from
+ // be\be_visitor_operation/tie_sh.cpp:60
+
+ ::CORBA::StructDef_ptr create_struct (
+ const char * id,
+ const char * name,
+ const char * version,
+ const ::CORBA::StructMemberSeq & members
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ));
+
+ // TAO_IDL - Generated from
+ // be\be_visitor_operation/tie_sh.cpp:60
+
+ ::CORBA::UnionDef_ptr create_union (
+ const char * id,
+ const char * name,
+ const char * version,
+ ::CORBA::IDLType_ptr discriminator_type,
+ const ::CORBA::UnionMemberSeq & members
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ));
+
+ // TAO_IDL - Generated from
+ // be\be_visitor_operation/tie_sh.cpp:60
+
+ ::CORBA::EnumDef_ptr create_enum (
+ const char * id,
+ const char * name,
+ const char * version,
+ const ::CORBA::EnumMemberSeq & members
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ));
+
+ // TAO_IDL - Generated from
+ // be\be_visitor_operation/tie_sh.cpp:60
+
+ ::CORBA::AliasDef_ptr create_alias (
+ const char * id,
+ const char * name,
+ const char * version,
+ ::CORBA::IDLType_ptr original_type
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ));
+
+ // TAO_IDL - Generated from
+ // be\be_visitor_operation/tie_sh.cpp:60
+
+ ::CORBA::InterfaceDef_ptr create_interface (
+ const char * id,
+ const char * name,
+ const char * version,
+ const ::CORBA::InterfaceDefSeq & base_interfaces
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ));
+
+ // TAO_IDL - Generated from
+ // be\be_visitor_operation/tie_sh.cpp:60
+
+ ::CORBA::ValueDef_ptr create_value (
+ const char * id,
+ const char * name,
+ const char * version,
+ ::CORBA::Boolean is_custom,
+ ::CORBA::Boolean is_abstract,
+ ::CORBA::ValueDef_ptr base_value,
+ ::CORBA::Boolean is_truncatable,
+ const ::CORBA::ValueDefSeq & abstract_base_values,
+ const ::CORBA::InterfaceDefSeq & supported_interfaces,
+ const ::CORBA::InitializerSeq & initializers
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ));
+
+ // TAO_IDL - Generated from
+ // be\be_visitor_operation/tie_sh.cpp:60
+
+ ::CORBA::ValueBoxDef_ptr create_value_box (
+ const char * id,
+ const char * name,
+ const char * version,
+ ::CORBA::IDLType_ptr original_type_def
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ));
+
+ // TAO_IDL - Generated from
+ // be\be_visitor_operation/tie_sh.cpp:60
+
+ ::CORBA::ExceptionDef_ptr create_exception (
+ const char * id,
+ const char * name,
+ const char * version,
+ const ::CORBA::StructMemberSeq & members
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ));
+
+ // TAO_IDL - Generated from
+ // be\be_visitor_operation/tie_sh.cpp:60
+
+ ::CORBA::NativeDef_ptr create_native (
+ const char * id,
+ const char * name,
+ const char * version
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ));
+
+ // TAO_IDL - Generated from
+ // be\be_visitor_operation/tie_sh.cpp:60
+
+ ::CORBA::AbstractInterfaceDef_ptr create_abstract_interface (
+ const char * id,
+ const char * name,
+ const char * version,
+ const ::CORBA::AbstractInterfaceDefSeq & base_interfaces
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ));
+
+ // TAO_IDL - Generated from
+ // be\be_visitor_operation/tie_sh.cpp:60
+
+ ::CORBA::LocalInterfaceDef_ptr create_local_interface (
+ const char * id,
+ const char * name,
+ const char * version,
+ const ::CORBA::InterfaceDefSeq & base_interfaces
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ));
+
+ // TAO_IDL - Generated from
+ // be\be_visitor_operation/tie_sh.cpp:60
+
+ ::CORBA::ExtValueDef_ptr create_ext_value (
+ const char * id,
+ const char * name,
+ const char * version,
+ ::CORBA::Boolean is_custom,
+ ::CORBA::Boolean is_abstract,
+ ::CORBA::ValueDef_ptr base_value,
+ ::CORBA::Boolean is_truncatable,
+ const ::CORBA::ValueDefSeq & abstract_base_values,
+ const ::CORBA::InterfaceDefSeq & supported_interfaces,
+ const ::CORBA::ExtInitializerSeq & initializers
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ));
+
+ private:
+ T *ptr_;
+ PortableServer::POA_var poa_;
+ ::CORBA::Boolean rel_;
+
+ // copy and assignment are not allowed
+ Container_tie (const Container_tie &);
+ void operator= (const Container_tie &);
+ };
+
+ // TAO_IDL - Generated from
+ // be\be_visitor_interface/tie_sh.cpp:87
+
+ // TIE class: Refer to CORBA v2.2, Section 20.34.4
+ template <class T>
+ class IDLType_tie : public IDLType
+ {
+ public:
+ /// the T& ctor
+ IDLType_tie (T &t);
+ /// ctor taking a POA
+ IDLType_tie (T &t, PortableServer::POA_ptr poa);
+ /// ctor taking pointer and an ownership flag
+ IDLType_tie (T *tp, ::CORBA::Boolean release = true);
+ /// ctor with T*, ownership flag and a POA
+ IDLType_tie (
+ T *tp,
+ PortableServer::POA_ptr poa,
+ ::CORBA::Boolean release = true
+ );
+ /// dtor
+
+ ~IDLType_tie (void);
+ // TIE specific functions
+ /// return the underlying object
+ T *_tied_object (void);
+ /// set the underlying object
+ void _tied_object (T &obj);
+ /// set the underlying object and the ownership flag
+ void _tied_object (T *obj, ::CORBA::Boolean release = true);
+ /// do we own it
+ ::CORBA::Boolean _is_owner (void);
+ /// set the ownership
+
+ void _is_owner ( ::CORBA::Boolean b);
+ // overridden ServantBase operations
+ PortableServer::POA_ptr _default_POA (
+ ACE_ENV_SINGLE_ARG_DECL_WITH_DEFAULTS
+ );
+
+ // TAO_IDL - Generated from
+ // be\be_visitor_operation/tie_sh.cpp:60
+
+ ::CORBA::DefinitionKind def_kind (
+ ACE_ENV_SINGLE_ARG_DECL_WITH_DEFAULTS
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ));
+
+ // TAO_IDL - Generated from
+ // be\be_visitor_operation/tie_sh.cpp:60
+
+ void destroy (
+ ACE_ENV_SINGLE_ARG_DECL_WITH_DEFAULTS
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ));
+
+ // TAO_IDL - Generated from
+ // be\be_visitor_operation/tie_sh.cpp:60
+
+ ::CORBA::TypeCode_ptr type (
+ ACE_ENV_SINGLE_ARG_DECL_WITH_DEFAULTS
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ));
+
+ private:
+ T *ptr_;
+ PortableServer::POA_var poa_;
+ ::CORBA::Boolean rel_;
+
+ // copy and assignment are not allowed
+ IDLType_tie (const IDLType_tie &);
+ void operator= (const IDLType_tie &);
+ };
+
+ // TAO_IDL - Generated from
+ // be\be_visitor_interface/tie_sh.cpp:87
+
+ // TIE class: Refer to CORBA v2.2, Section 20.34.4
+ template <class T>
+ class TypedefDef_tie : public TypedefDef
+ {
+ public:
+ /// the T& ctor
+ TypedefDef_tie (T &t);
+ /// ctor taking a POA
+ TypedefDef_tie (T &t, PortableServer::POA_ptr poa);
+ /// ctor taking pointer and an ownership flag
+ TypedefDef_tie (T *tp, ::CORBA::Boolean release = true);
+ /// ctor with T*, ownership flag and a POA
+ TypedefDef_tie (
+ T *tp,
+ PortableServer::POA_ptr poa,
+ ::CORBA::Boolean release = true
+ );
+ /// dtor
+
+ ~TypedefDef_tie (void);
+ // TIE specific functions
+ /// return the underlying object
+ T *_tied_object (void);
+ /// set the underlying object
+ void _tied_object (T &obj);
+ /// set the underlying object and the ownership flag
+ void _tied_object (T *obj, ::CORBA::Boolean release = true);
+ /// do we own it
+ ::CORBA::Boolean _is_owner (void);
+ /// set the ownership
+
+ void _is_owner ( ::CORBA::Boolean b);
+ // overridden ServantBase operations
+ PortableServer::POA_ptr _default_POA (
+ ACE_ENV_SINGLE_ARG_DECL_WITH_DEFAULTS
+ );
+
+ // TAO_IDL - Generated from
+ // be\be_visitor_operation/tie_sh.cpp:60
+
+ ::CORBA::DefinitionKind def_kind (
+ ACE_ENV_SINGLE_ARG_DECL_WITH_DEFAULTS
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ));
+
+ // TAO_IDL - Generated from
+ // be\be_visitor_operation/tie_sh.cpp:60
+
+ void destroy (
+ ACE_ENV_SINGLE_ARG_DECL_WITH_DEFAULTS
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ));
+
+ // TAO_IDL - Generated from
+ // be\be_visitor_operation/tie_sh.cpp:60
+
+ char * id (
+ ACE_ENV_SINGLE_ARG_DECL_WITH_DEFAULTS
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ));
+
+ // TAO_IDL - Generated from
+ // be\be_visitor_operation/tie_sh.cpp:60
+
+ void id (
+ const char * id
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ));
+
+ // TAO_IDL - Generated from
+ // be\be_visitor_operation/tie_sh.cpp:60
+
+ char * name (
+ ACE_ENV_SINGLE_ARG_DECL_WITH_DEFAULTS
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ));
+
+ // TAO_IDL - Generated from
+ // be\be_visitor_operation/tie_sh.cpp:60
+
+ void name (
+ const char * name
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ));
+
+ // TAO_IDL - Generated from
+ // be\be_visitor_operation/tie_sh.cpp:60
+
+ char * version (
+ ACE_ENV_SINGLE_ARG_DECL_WITH_DEFAULTS
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ));
+
+ // TAO_IDL - Generated from
+ // be\be_visitor_operation/tie_sh.cpp:60
+
+ void version (
+ const char * version
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ));
+
+ // TAO_IDL - Generated from
+ // be\be_visitor_operation/tie_sh.cpp:60
+
+ ::CORBA::Container_ptr defined_in (
+ ACE_ENV_SINGLE_ARG_DECL_WITH_DEFAULTS
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ));
+
+ // TAO_IDL - Generated from
+ // be\be_visitor_operation/tie_sh.cpp:60
+
+ char * absolute_name (
+ ACE_ENV_SINGLE_ARG_DECL_WITH_DEFAULTS
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ));
+
+ // TAO_IDL - Generated from
+ // be\be_visitor_operation/tie_sh.cpp:60
+
+ ::CORBA::Repository_ptr containing_repository (
+ ACE_ENV_SINGLE_ARG_DECL_WITH_DEFAULTS
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ));
+
+ // TAO_IDL - Generated from
+ // be\be_visitor_operation/tie_sh.cpp:60
+
+ ::CORBA::Contained::Description * describe (
+ ACE_ENV_SINGLE_ARG_DECL_WITH_DEFAULTS
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ));
+
+ // TAO_IDL - Generated from
+ // be\be_visitor_operation/tie_sh.cpp:60
+
+ void move (
+ ::CORBA::Container_ptr new_container,
+ const char * new_name,
+ const char * new_version
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ));
+
+ // TAO_IDL - Generated from
+ // be\be_visitor_operation/tie_sh.cpp:60
+
+ ::CORBA::TypeCode_ptr type (
+ ACE_ENV_SINGLE_ARG_DECL_WITH_DEFAULTS
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ));
+
+ private:
+ T *ptr_;
+ PortableServer::POA_var poa_;
+ ::CORBA::Boolean rel_;
+
+ // copy and assignment are not allowed
+ TypedefDef_tie (const TypedefDef_tie &);
+ void operator= (const TypedefDef_tie &);
+ };
+} // module CORBA
+
+// TAO_IDL - Generated from
+// be\be_codegen.cpp:1322
+
+
+TAO_END_VERSIONED_NAMESPACE_DECL
+
+#if defined (__ACE_INLINE__)
+#include "IFR_BaseS_T.inl"
+#endif /* defined INLINE */
+
+#if defined (ACE_TEMPLATES_REQUIRE_SOURCE)
+#include "IFR_BaseS_T.cpp"
+#endif /* defined REQUIRED SOURCE */
+
+#if defined (ACE_TEMPLATES_REQUIRE_PRAGMA)
+#pragma implementation ("IFR_BaseS_T.cpp")
+#endif /* defined REQUIRED PRAGMA */
+
+#include /**/ "ace/post.h"
+#endif /* ifndef */
+
diff --git a/TAO/orbsvcs/orbsvcs/IFRService/IFR_BaseS_T.inl b/TAO/orbsvcs/orbsvcs/IFRService/IFR_BaseS_T.inl
new file mode 100644
index 00000000000..9a0772db14d
--- /dev/null
+++ b/TAO/orbsvcs/orbsvcs/IFRService/IFR_BaseS_T.inl
@@ -0,0 +1,1512 @@
+// -*- C++ -*-
+//
+// $Id$
+
+// **** Code generated by the The ACE ORB (TAO) IDL Compiler ****
+// TAO and the TAO IDL Compiler have been developed by:
+// Center for Distributed Object Computing
+// Washington University
+// St. Louis, MO
+// USA
+// http://www.cs.wustl.edu/~schmidt/doc-center.html
+// and
+// Distributed Object Computing Laboratory
+// University of California at Irvine
+// Irvine, CA
+// USA
+// http://doc.ece.uci.edu/
+// and
+// Institute for Software Integrated Systems
+// Vanderbilt University
+// Nashville, TN
+// USA
+// http://www.isis.vanderbilt.edu/
+//
+// Information about TAO is available at:
+// http://www.cs.wustl.edu/~schmidt/TAO.html
+
+
+TAO_BEGIN_VERSIONED_NAMESPACE_DECL
+
+
+
+// TAO_IDL - Generated from
+// be\be_visitor_interface/tie_si.cpp:96
+
+template <class T> ACE_INLINE
+POA_CORBA::IRObject_tie<T>::IRObject_tie (T &t)
+ : ptr_ (&t),
+ poa_ (PortableServer::POA::_nil ()),
+ rel_ (0)
+{}
+
+template <class T> ACE_INLINE
+POA_CORBA::IRObject_tie<T>::IRObject_tie (T &t, PortableServer::POA_ptr poa)
+ : ptr_ (&t),
+ poa_ (PortableServer::POA::_duplicate (poa)),
+ rel_ (0)
+{}
+
+template <class T> ACE_INLINE
+POA_CORBA::IRObject_tie<T>::IRObject_tie (T *tp, ::CORBA::Boolean release)
+ : ptr_ (tp),
+ poa_ (PortableServer::POA::_nil ()),
+ rel_ (release)
+{}
+
+template <class T> ACE_INLINE
+POA_CORBA::IRObject_tie<T>::IRObject_tie (T *tp, PortableServer::POA_ptr poa, ::CORBA::Boolean release)
+ : ptr_ (tp),
+ poa_ (PortableServer::POA::_duplicate (poa)),
+ rel_ (release)
+{}
+
+template <class T> ACE_INLINE
+POA_CORBA::IRObject_tie<T>::~IRObject_tie (void)
+{
+ if (this->rel_)
+ {
+ delete this->ptr_;
+ }
+}
+
+template <class T> ACE_INLINE T *
+POA_CORBA::IRObject_tie<T>::_tied_object (void)
+{
+ return this->ptr_;
+}
+
+template <class T> ACE_INLINE void
+POA_CORBA::IRObject_tie<T>::_tied_object (T &obj)
+{
+ if (this->rel_)
+ {
+ delete this->ptr_;
+ }
+
+ this->ptr_ = &obj;
+ this->rel_ = 0;
+}
+
+template <class T> ACE_INLINE void
+POA_CORBA::IRObject_tie<T>::_tied_object (T *obj, ::CORBA::Boolean release)
+{
+ if (this->rel_)
+ {
+ delete this->ptr_;
+ }
+
+ this->ptr_ = obj;
+ this->rel_ = release;
+}
+
+template <class T> ACE_INLINE ::CORBA::Boolean
+POA_CORBA::IRObject_tie<T>::_is_owner (void)
+{
+ return this->rel_;
+}
+
+template <class T> ACE_INLINE void
+POA_CORBA::IRObject_tie<T>::_is_owner ( ::CORBA::Boolean b)
+{
+ this->rel_ = b;
+}
+
+template <class T> ACE_INLINE PortableServer::POA_ptr
+POA_CORBA::IRObject_tie<T>::_default_POA (ACE_ENV_SINGLE_ARG_DECL)
+{
+ if (! ::CORBA::is_nil (this->poa_.in ()))
+ {
+ return PortableServer::POA::_duplicate (this->poa_.in ());
+ }
+
+ return this->IRObject::_default_POA (ACE_ENV_SINGLE_ARG_PARAMETER);
+}
+
+// TAO_IDL - Generated from
+// be\be_visitor_operation/tie_si.cpp:101
+
+template <class T> ACE_INLINE
+::CORBA::DefinitionKind POA_CORBA::IRObject_tie<T>::def_kind (
+ ACE_ENV_SINGLE_ARG_DECL
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ))
+{
+ return this->ptr_->def_kind (
+ ACE_ENV_SINGLE_ARG_PARAMETER
+ );
+}
+
+// TAO_IDL - Generated from
+// be\be_visitor_operation/tie_si.cpp:101
+
+template <class T> ACE_INLINE
+void POA_CORBA::IRObject_tie<T>::destroy (
+ ACE_ENV_SINGLE_ARG_DECL
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ))
+{
+ this->ptr_->destroy (
+ ACE_ENV_SINGLE_ARG_PARAMETER
+ );
+}
+
+// TAO_IDL - Generated from
+// be\be_visitor_interface/tie_si.cpp:96
+
+template <class T> ACE_INLINE
+POA_CORBA::Contained_tie<T>::Contained_tie (T &t)
+ : ptr_ (&t),
+ poa_ (PortableServer::POA::_nil ()),
+ rel_ (0)
+{}
+
+template <class T> ACE_INLINE
+POA_CORBA::Contained_tie<T>::Contained_tie (T &t, PortableServer::POA_ptr poa)
+ : ptr_ (&t),
+ poa_ (PortableServer::POA::_duplicate (poa)),
+ rel_ (0)
+{}
+
+template <class T> ACE_INLINE
+POA_CORBA::Contained_tie<T>::Contained_tie (T *tp, ::CORBA::Boolean release)
+ : ptr_ (tp),
+ poa_ (PortableServer::POA::_nil ()),
+ rel_ (release)
+{}
+
+template <class T> ACE_INLINE
+POA_CORBA::Contained_tie<T>::Contained_tie (T *tp, PortableServer::POA_ptr poa, ::CORBA::Boolean release)
+ : ptr_ (tp),
+ poa_ (PortableServer::POA::_duplicate (poa)),
+ rel_ (release)
+{}
+
+template <class T> ACE_INLINE
+POA_CORBA::Contained_tie<T>::~Contained_tie (void)
+{
+ if (this->rel_)
+ {
+ delete this->ptr_;
+ }
+}
+
+template <class T> ACE_INLINE T *
+POA_CORBA::Contained_tie<T>::_tied_object (void)
+{
+ return this->ptr_;
+}
+
+template <class T> ACE_INLINE void
+POA_CORBA::Contained_tie<T>::_tied_object (T &obj)
+{
+ if (this->rel_)
+ {
+ delete this->ptr_;
+ }
+
+ this->ptr_ = &obj;
+ this->rel_ = 0;
+}
+
+template <class T> ACE_INLINE void
+POA_CORBA::Contained_tie<T>::_tied_object (T *obj, ::CORBA::Boolean release)
+{
+ if (this->rel_)
+ {
+ delete this->ptr_;
+ }
+
+ this->ptr_ = obj;
+ this->rel_ = release;
+}
+
+template <class T> ACE_INLINE ::CORBA::Boolean
+POA_CORBA::Contained_tie<T>::_is_owner (void)
+{
+ return this->rel_;
+}
+
+template <class T> ACE_INLINE void
+POA_CORBA::Contained_tie<T>::_is_owner ( ::CORBA::Boolean b)
+{
+ this->rel_ = b;
+}
+
+template <class T> ACE_INLINE PortableServer::POA_ptr
+POA_CORBA::Contained_tie<T>::_default_POA (ACE_ENV_SINGLE_ARG_DECL)
+{
+ if (! ::CORBA::is_nil (this->poa_.in ()))
+ {
+ return PortableServer::POA::_duplicate (this->poa_.in ());
+ }
+
+ return this->Contained::_default_POA (ACE_ENV_SINGLE_ARG_PARAMETER);
+}
+
+// TAO_IDL - Generated from
+// be\be_visitor_operation/tie_si.cpp:101
+
+template <class T> ACE_INLINE
+::CORBA::DefinitionKind POA_CORBA::Contained_tie<T>::def_kind (
+ ACE_ENV_SINGLE_ARG_DECL
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ))
+{
+ return this->ptr_->def_kind (
+ ACE_ENV_SINGLE_ARG_PARAMETER
+ );
+}
+
+// TAO_IDL - Generated from
+// be\be_visitor_operation/tie_si.cpp:101
+
+template <class T> ACE_INLINE
+void POA_CORBA::Contained_tie<T>::destroy (
+ ACE_ENV_SINGLE_ARG_DECL
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ))
+{
+ this->ptr_->destroy (
+ ACE_ENV_SINGLE_ARG_PARAMETER
+ );
+}
+
+// TAO_IDL - Generated from
+// be\be_visitor_operation/tie_si.cpp:101
+
+template <class T> ACE_INLINE
+char * POA_CORBA::Contained_tie<T>::id (
+ ACE_ENV_SINGLE_ARG_DECL
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ))
+{
+ return this->ptr_->id (
+ ACE_ENV_SINGLE_ARG_PARAMETER
+ );
+}
+
+// TAO_IDL - Generated from
+// be\be_visitor_operation/tie_si.cpp:101
+
+template <class T> ACE_INLINE
+void POA_CORBA::Contained_tie<T>::id (
+ const char * id
+ ACE_ENV_ARG_DECL
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ))
+{
+ this->ptr_->id (
+ id
+ ACE_ENV_ARG_PARAMETER
+ );
+}
+
+// TAO_IDL - Generated from
+// be\be_visitor_operation/tie_si.cpp:101
+
+template <class T> ACE_INLINE
+char * POA_CORBA::Contained_tie<T>::name (
+ ACE_ENV_SINGLE_ARG_DECL
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ))
+{
+ return this->ptr_->name (
+ ACE_ENV_SINGLE_ARG_PARAMETER
+ );
+}
+
+// TAO_IDL - Generated from
+// be\be_visitor_operation/tie_si.cpp:101
+
+template <class T> ACE_INLINE
+void POA_CORBA::Contained_tie<T>::name (
+ const char * name
+ ACE_ENV_ARG_DECL
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ))
+{
+ this->ptr_->name (
+ name
+ ACE_ENV_ARG_PARAMETER
+ );
+}
+
+// TAO_IDL - Generated from
+// be\be_visitor_operation/tie_si.cpp:101
+
+template <class T> ACE_INLINE
+char * POA_CORBA::Contained_tie<T>::version (
+ ACE_ENV_SINGLE_ARG_DECL
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ))
+{
+ return this->ptr_->version (
+ ACE_ENV_SINGLE_ARG_PARAMETER
+ );
+}
+
+// TAO_IDL - Generated from
+// be\be_visitor_operation/tie_si.cpp:101
+
+template <class T> ACE_INLINE
+void POA_CORBA::Contained_tie<T>::version (
+ const char * version
+ ACE_ENV_ARG_DECL
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ))
+{
+ this->ptr_->version (
+ version
+ ACE_ENV_ARG_PARAMETER
+ );
+}
+
+// TAO_IDL - Generated from
+// be\be_visitor_operation/tie_si.cpp:101
+
+template <class T> ACE_INLINE
+::CORBA::Container_ptr POA_CORBA::Contained_tie<T>::defined_in (
+ ACE_ENV_SINGLE_ARG_DECL
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ))
+{
+ return this->ptr_->defined_in (
+ ACE_ENV_SINGLE_ARG_PARAMETER
+ );
+}
+
+// TAO_IDL - Generated from
+// be\be_visitor_operation/tie_si.cpp:101
+
+template <class T> ACE_INLINE
+char * POA_CORBA::Contained_tie<T>::absolute_name (
+ ACE_ENV_SINGLE_ARG_DECL
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ))
+{
+ return this->ptr_->absolute_name (
+ ACE_ENV_SINGLE_ARG_PARAMETER
+ );
+}
+
+// TAO_IDL - Generated from
+// be\be_visitor_operation/tie_si.cpp:101
+
+template <class T> ACE_INLINE
+::CORBA::Repository_ptr POA_CORBA::Contained_tie<T>::containing_repository (
+ ACE_ENV_SINGLE_ARG_DECL
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ))
+{
+ return this->ptr_->containing_repository (
+ ACE_ENV_SINGLE_ARG_PARAMETER
+ );
+}
+
+// TAO_IDL - Generated from
+// be\be_visitor_operation/tie_si.cpp:101
+
+template <class T> ACE_INLINE
+::CORBA::Contained::Description * POA_CORBA::Contained_tie<T>::describe (
+ ACE_ENV_SINGLE_ARG_DECL
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ))
+{
+ return this->ptr_->describe (
+ ACE_ENV_SINGLE_ARG_PARAMETER
+ );
+}
+
+// TAO_IDL - Generated from
+// be\be_visitor_operation/tie_si.cpp:101
+
+template <class T> ACE_INLINE
+void POA_CORBA::Contained_tie<T>::move (
+ ::CORBA::Container_ptr new_container,
+ const char * new_name,
+ const char * new_version
+ ACE_ENV_ARG_DECL
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ))
+{
+ this->ptr_->move (
+ new_container,
+ new_name,
+ new_version
+ ACE_ENV_ARG_PARAMETER
+ );
+}
+
+// TAO_IDL - Generated from
+// be\be_visitor_interface/tie_si.cpp:96
+
+template <class T> ACE_INLINE
+POA_CORBA::Container_tie<T>::Container_tie (T &t)
+ : ptr_ (&t),
+ poa_ (PortableServer::POA::_nil ()),
+ rel_ (0)
+{}
+
+template <class T> ACE_INLINE
+POA_CORBA::Container_tie<T>::Container_tie (T &t, PortableServer::POA_ptr poa)
+ : ptr_ (&t),
+ poa_ (PortableServer::POA::_duplicate (poa)),
+ rel_ (0)
+{}
+
+template <class T> ACE_INLINE
+POA_CORBA::Container_tie<T>::Container_tie (T *tp, ::CORBA::Boolean release)
+ : ptr_ (tp),
+ poa_ (PortableServer::POA::_nil ()),
+ rel_ (release)
+{}
+
+template <class T> ACE_INLINE
+POA_CORBA::Container_tie<T>::Container_tie (T *tp, PortableServer::POA_ptr poa, ::CORBA::Boolean release)
+ : ptr_ (tp),
+ poa_ (PortableServer::POA::_duplicate (poa)),
+ rel_ (release)
+{}
+
+template <class T> ACE_INLINE
+POA_CORBA::Container_tie<T>::~Container_tie (void)
+{
+ if (this->rel_)
+ {
+ delete this->ptr_;
+ }
+}
+
+template <class T> ACE_INLINE T *
+POA_CORBA::Container_tie<T>::_tied_object (void)
+{
+ return this->ptr_;
+}
+
+template <class T> ACE_INLINE void
+POA_CORBA::Container_tie<T>::_tied_object (T &obj)
+{
+ if (this->rel_)
+ {
+ delete this->ptr_;
+ }
+
+ this->ptr_ = &obj;
+ this->rel_ = 0;
+}
+
+template <class T> ACE_INLINE void
+POA_CORBA::Container_tie<T>::_tied_object (T *obj, ::CORBA::Boolean release)
+{
+ if (this->rel_)
+ {
+ delete this->ptr_;
+ }
+
+ this->ptr_ = obj;
+ this->rel_ = release;
+}
+
+template <class T> ACE_INLINE ::CORBA::Boolean
+POA_CORBA::Container_tie<T>::_is_owner (void)
+{
+ return this->rel_;
+}
+
+template <class T> ACE_INLINE void
+POA_CORBA::Container_tie<T>::_is_owner ( ::CORBA::Boolean b)
+{
+ this->rel_ = b;
+}
+
+template <class T> ACE_INLINE PortableServer::POA_ptr
+POA_CORBA::Container_tie<T>::_default_POA (ACE_ENV_SINGLE_ARG_DECL)
+{
+ if (! ::CORBA::is_nil (this->poa_.in ()))
+ {
+ return PortableServer::POA::_duplicate (this->poa_.in ());
+ }
+
+ return this->Container::_default_POA (ACE_ENV_SINGLE_ARG_PARAMETER);
+}
+
+// TAO_IDL - Generated from
+// be\be_visitor_operation/tie_si.cpp:101
+
+template <class T> ACE_INLINE
+::CORBA::DefinitionKind POA_CORBA::Container_tie<T>::def_kind (
+ ACE_ENV_SINGLE_ARG_DECL
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ))
+{
+ return this->ptr_->def_kind (
+ ACE_ENV_SINGLE_ARG_PARAMETER
+ );
+}
+
+// TAO_IDL - Generated from
+// be\be_visitor_operation/tie_si.cpp:101
+
+template <class T> ACE_INLINE
+void POA_CORBA::Container_tie<T>::destroy (
+ ACE_ENV_SINGLE_ARG_DECL
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ))
+{
+ this->ptr_->destroy (
+ ACE_ENV_SINGLE_ARG_PARAMETER
+ );
+}
+
+// TAO_IDL - Generated from
+// be\be_visitor_operation/tie_si.cpp:101
+
+template <class T> ACE_INLINE
+::CORBA::Contained_ptr POA_CORBA::Container_tie<T>::lookup (
+ const char * search_name
+ ACE_ENV_ARG_DECL
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ))
+{
+ return this->ptr_->lookup (
+ search_name
+ ACE_ENV_ARG_PARAMETER
+ );
+}
+
+// TAO_IDL - Generated from
+// be\be_visitor_operation/tie_si.cpp:101
+
+template <class T> ACE_INLINE
+::CORBA::ContainedSeq * POA_CORBA::Container_tie<T>::contents (
+ ::CORBA::DefinitionKind limit_type,
+ ::CORBA::Boolean exclude_inherited
+ ACE_ENV_ARG_DECL
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ))
+{
+ return this->ptr_->contents (
+ limit_type,
+ exclude_inherited
+ ACE_ENV_ARG_PARAMETER
+ );
+}
+
+// TAO_IDL - Generated from
+// be\be_visitor_operation/tie_si.cpp:101
+
+template <class T> ACE_INLINE
+::CORBA::ContainedSeq * POA_CORBA::Container_tie<T>::lookup_name (
+ const char * search_name,
+ ::CORBA::Long levels_to_search,
+ ::CORBA::DefinitionKind limit_type,
+ ::CORBA::Boolean exclude_inherited
+ ACE_ENV_ARG_DECL
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ))
+{
+ return this->ptr_->lookup_name (
+ search_name,
+ levels_to_search,
+ limit_type,
+ exclude_inherited
+ ACE_ENV_ARG_PARAMETER
+ );
+}
+
+// TAO_IDL - Generated from
+// be\be_visitor_operation/tie_si.cpp:101
+
+template <class T> ACE_INLINE
+::CORBA::Container::DescriptionSeq * POA_CORBA::Container_tie<T>::describe_contents (
+ ::CORBA::DefinitionKind limit_type,
+ ::CORBA::Boolean exclude_inherited,
+ ::CORBA::Long max_returned_objs
+ ACE_ENV_ARG_DECL
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ))
+{
+ return this->ptr_->describe_contents (
+ limit_type,
+ exclude_inherited,
+ max_returned_objs
+ ACE_ENV_ARG_PARAMETER
+ );
+}
+
+// TAO_IDL - Generated from
+// be\be_visitor_operation/tie_si.cpp:101
+
+template <class T> ACE_INLINE
+::CORBA::ModuleDef_ptr POA_CORBA::Container_tie<T>::create_module (
+ const char * id,
+ const char * name,
+ const char * version
+ ACE_ENV_ARG_DECL
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ))
+{
+ return this->ptr_->create_module (
+ id,
+ name,
+ version
+ ACE_ENV_ARG_PARAMETER
+ );
+}
+
+// TAO_IDL - Generated from
+// be\be_visitor_operation/tie_si.cpp:101
+
+template <class T> ACE_INLINE
+::CORBA::ConstantDef_ptr POA_CORBA::Container_tie<T>::create_constant (
+ const char * id,
+ const char * name,
+ const char * version,
+ ::CORBA::IDLType_ptr type,
+ const ::CORBA::Any & value
+ ACE_ENV_ARG_DECL
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ))
+{
+ return this->ptr_->create_constant (
+ id,
+ name,
+ version,
+ type,
+ value
+ ACE_ENV_ARG_PARAMETER
+ );
+}
+
+// TAO_IDL - Generated from
+// be\be_visitor_operation/tie_si.cpp:101
+
+template <class T> ACE_INLINE
+::CORBA::StructDef_ptr POA_CORBA::Container_tie<T>::create_struct (
+ const char * id,
+ const char * name,
+ const char * version,
+ const ::CORBA::StructMemberSeq & members
+ ACE_ENV_ARG_DECL
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ))
+{
+ return this->ptr_->create_struct (
+ id,
+ name,
+ version,
+ members
+ ACE_ENV_ARG_PARAMETER
+ );
+}
+
+// TAO_IDL - Generated from
+// be\be_visitor_operation/tie_si.cpp:101
+
+template <class T> ACE_INLINE
+::CORBA::UnionDef_ptr POA_CORBA::Container_tie<T>::create_union (
+ const char * id,
+ const char * name,
+ const char * version,
+ ::CORBA::IDLType_ptr discriminator_type,
+ const ::CORBA::UnionMemberSeq & members
+ ACE_ENV_ARG_DECL
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ))
+{
+ return this->ptr_->create_union (
+ id,
+ name,
+ version,
+ discriminator_type,
+ members
+ ACE_ENV_ARG_PARAMETER
+ );
+}
+
+// TAO_IDL - Generated from
+// be\be_visitor_operation/tie_si.cpp:101
+
+template <class T> ACE_INLINE
+::CORBA::EnumDef_ptr POA_CORBA::Container_tie<T>::create_enum (
+ const char * id,
+ const char * name,
+ const char * version,
+ const ::CORBA::EnumMemberSeq & members
+ ACE_ENV_ARG_DECL
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ))
+{
+ return this->ptr_->create_enum (
+ id,
+ name,
+ version,
+ members
+ ACE_ENV_ARG_PARAMETER
+ );
+}
+
+// TAO_IDL - Generated from
+// be\be_visitor_operation/tie_si.cpp:101
+
+template <class T> ACE_INLINE
+::CORBA::AliasDef_ptr POA_CORBA::Container_tie<T>::create_alias (
+ const char * id,
+ const char * name,
+ const char * version,
+ ::CORBA::IDLType_ptr original_type
+ ACE_ENV_ARG_DECL
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ))
+{
+ return this->ptr_->create_alias (
+ id,
+ name,
+ version,
+ original_type
+ ACE_ENV_ARG_PARAMETER
+ );
+}
+
+// TAO_IDL - Generated from
+// be\be_visitor_operation/tie_si.cpp:101
+
+template <class T> ACE_INLINE
+::CORBA::InterfaceDef_ptr POA_CORBA::Container_tie<T>::create_interface (
+ const char * id,
+ const char * name,
+ const char * version,
+ const ::CORBA::InterfaceDefSeq & base_interfaces
+ ACE_ENV_ARG_DECL
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ))
+{
+ return this->ptr_->create_interface (
+ id,
+ name,
+ version,
+ base_interfaces
+ ACE_ENV_ARG_PARAMETER
+ );
+}
+
+// TAO_IDL - Generated from
+// be\be_visitor_operation/tie_si.cpp:101
+
+template <class T> ACE_INLINE
+::CORBA::ValueDef_ptr POA_CORBA::Container_tie<T>::create_value (
+ const char * id,
+ const char * name,
+ const char * version,
+ ::CORBA::Boolean is_custom,
+ ::CORBA::Boolean is_abstract,
+ ::CORBA::ValueDef_ptr base_value,
+ ::CORBA::Boolean is_truncatable,
+ const ::CORBA::ValueDefSeq & abstract_base_values,
+ const ::CORBA::InterfaceDefSeq & supported_interfaces,
+ const ::CORBA::InitializerSeq & initializers
+ ACE_ENV_ARG_DECL
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ))
+{
+ return this->ptr_->create_value (
+ id,
+ name,
+ version,
+ is_custom,
+ is_abstract,
+ base_value,
+ is_truncatable,
+ abstract_base_values,
+ supported_interfaces,
+ initializers
+ ACE_ENV_ARG_PARAMETER
+ );
+}
+
+// TAO_IDL - Generated from
+// be\be_visitor_operation/tie_si.cpp:101
+
+template <class T> ACE_INLINE
+::CORBA::ValueBoxDef_ptr POA_CORBA::Container_tie<T>::create_value_box (
+ const char * id,
+ const char * name,
+ const char * version,
+ ::CORBA::IDLType_ptr original_type_def
+ ACE_ENV_ARG_DECL
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ))
+{
+ return this->ptr_->create_value_box (
+ id,
+ name,
+ version,
+ original_type_def
+ ACE_ENV_ARG_PARAMETER
+ );
+}
+
+// TAO_IDL - Generated from
+// be\be_visitor_operation/tie_si.cpp:101
+
+template <class T> ACE_INLINE
+::CORBA::ExceptionDef_ptr POA_CORBA::Container_tie<T>::create_exception (
+ const char * id,
+ const char * name,
+ const char * version,
+ const ::CORBA::StructMemberSeq & members
+ ACE_ENV_ARG_DECL
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ))
+{
+ return this->ptr_->create_exception (
+ id,
+ name,
+ version,
+ members
+ ACE_ENV_ARG_PARAMETER
+ );
+}
+
+// TAO_IDL - Generated from
+// be\be_visitor_operation/tie_si.cpp:101
+
+template <class T> ACE_INLINE
+::CORBA::NativeDef_ptr POA_CORBA::Container_tie<T>::create_native (
+ const char * id,
+ const char * name,
+ const char * version
+ ACE_ENV_ARG_DECL
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ))
+{
+ return this->ptr_->create_native (
+ id,
+ name,
+ version
+ ACE_ENV_ARG_PARAMETER
+ );
+}
+
+// TAO_IDL - Generated from
+// be\be_visitor_operation/tie_si.cpp:101
+
+template <class T> ACE_INLINE
+::CORBA::AbstractInterfaceDef_ptr POA_CORBA::Container_tie<T>::create_abstract_interface (
+ const char * id,
+ const char * name,
+ const char * version,
+ const ::CORBA::AbstractInterfaceDefSeq & base_interfaces
+ ACE_ENV_ARG_DECL
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ))
+{
+ return this->ptr_->create_abstract_interface (
+ id,
+ name,
+ version,
+ base_interfaces
+ ACE_ENV_ARG_PARAMETER
+ );
+}
+
+// TAO_IDL - Generated from
+// be\be_visitor_operation/tie_si.cpp:101
+
+template <class T> ACE_INLINE
+::CORBA::LocalInterfaceDef_ptr POA_CORBA::Container_tie<T>::create_local_interface (
+ const char * id,
+ const char * name,
+ const char * version,
+ const ::CORBA::InterfaceDefSeq & base_interfaces
+ ACE_ENV_ARG_DECL
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ))
+{
+ return this->ptr_->create_local_interface (
+ id,
+ name,
+ version,
+ base_interfaces
+ ACE_ENV_ARG_PARAMETER
+ );
+}
+
+// TAO_IDL - Generated from
+// be\be_visitor_operation/tie_si.cpp:101
+
+template <class T> ACE_INLINE
+::CORBA::ExtValueDef_ptr POA_CORBA::Container_tie<T>::create_ext_value (
+ const char * id,
+ const char * name,
+ const char * version,
+ ::CORBA::Boolean is_custom,
+ ::CORBA::Boolean is_abstract,
+ ::CORBA::ValueDef_ptr base_value,
+ ::CORBA::Boolean is_truncatable,
+ const ::CORBA::ValueDefSeq & abstract_base_values,
+ const ::CORBA::InterfaceDefSeq & supported_interfaces,
+ const ::CORBA::ExtInitializerSeq & initializers
+ ACE_ENV_ARG_DECL
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ))
+{
+ return this->ptr_->create_ext_value (
+ id,
+ name,
+ version,
+ is_custom,
+ is_abstract,
+ base_value,
+ is_truncatable,
+ abstract_base_values,
+ supported_interfaces,
+ initializers
+ ACE_ENV_ARG_PARAMETER
+ );
+}
+
+// TAO_IDL - Generated from
+// be\be_visitor_interface/tie_si.cpp:96
+
+template <class T> ACE_INLINE
+POA_CORBA::IDLType_tie<T>::IDLType_tie (T &t)
+ : ptr_ (&t),
+ poa_ (PortableServer::POA::_nil ()),
+ rel_ (0)
+{}
+
+template <class T> ACE_INLINE
+POA_CORBA::IDLType_tie<T>::IDLType_tie (T &t, PortableServer::POA_ptr poa)
+ : ptr_ (&t),
+ poa_ (PortableServer::POA::_duplicate (poa)),
+ rel_ (0)
+{}
+
+template <class T> ACE_INLINE
+POA_CORBA::IDLType_tie<T>::IDLType_tie (T *tp, ::CORBA::Boolean release)
+ : ptr_ (tp),
+ poa_ (PortableServer::POA::_nil ()),
+ rel_ (release)
+{}
+
+template <class T> ACE_INLINE
+POA_CORBA::IDLType_tie<T>::IDLType_tie (T *tp, PortableServer::POA_ptr poa, ::CORBA::Boolean release)
+ : ptr_ (tp),
+ poa_ (PortableServer::POA::_duplicate (poa)),
+ rel_ (release)
+{}
+
+template <class T> ACE_INLINE
+POA_CORBA::IDLType_tie<T>::~IDLType_tie (void)
+{
+ if (this->rel_)
+ {
+ delete this->ptr_;
+ }
+}
+
+template <class T> ACE_INLINE T *
+POA_CORBA::IDLType_tie<T>::_tied_object (void)
+{
+ return this->ptr_;
+}
+
+template <class T> ACE_INLINE void
+POA_CORBA::IDLType_tie<T>::_tied_object (T &obj)
+{
+ if (this->rel_)
+ {
+ delete this->ptr_;
+ }
+
+ this->ptr_ = &obj;
+ this->rel_ = 0;
+}
+
+template <class T> ACE_INLINE void
+POA_CORBA::IDLType_tie<T>::_tied_object (T *obj, ::CORBA::Boolean release)
+{
+ if (this->rel_)
+ {
+ delete this->ptr_;
+ }
+
+ this->ptr_ = obj;
+ this->rel_ = release;
+}
+
+template <class T> ACE_INLINE ::CORBA::Boolean
+POA_CORBA::IDLType_tie<T>::_is_owner (void)
+{
+ return this->rel_;
+}
+
+template <class T> ACE_INLINE void
+POA_CORBA::IDLType_tie<T>::_is_owner ( ::CORBA::Boolean b)
+{
+ this->rel_ = b;
+}
+
+template <class T> ACE_INLINE PortableServer::POA_ptr
+POA_CORBA::IDLType_tie<T>::_default_POA (ACE_ENV_SINGLE_ARG_DECL)
+{
+ if (! ::CORBA::is_nil (this->poa_.in ()))
+ {
+ return PortableServer::POA::_duplicate (this->poa_.in ());
+ }
+
+ return this->IDLType::_default_POA (ACE_ENV_SINGLE_ARG_PARAMETER);
+}
+
+// TAO_IDL - Generated from
+// be\be_visitor_operation/tie_si.cpp:101
+
+template <class T> ACE_INLINE
+::CORBA::DefinitionKind POA_CORBA::IDLType_tie<T>::def_kind (
+ ACE_ENV_SINGLE_ARG_DECL
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ))
+{
+ return this->ptr_->def_kind (
+ ACE_ENV_SINGLE_ARG_PARAMETER
+ );
+}
+
+// TAO_IDL - Generated from
+// be\be_visitor_operation/tie_si.cpp:101
+
+template <class T> ACE_INLINE
+void POA_CORBA::IDLType_tie<T>::destroy (
+ ACE_ENV_SINGLE_ARG_DECL
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ))
+{
+ this->ptr_->destroy (
+ ACE_ENV_SINGLE_ARG_PARAMETER
+ );
+}
+
+// TAO_IDL - Generated from
+// be\be_visitor_operation/tie_si.cpp:101
+
+template <class T> ACE_INLINE
+::CORBA::TypeCode_ptr POA_CORBA::IDLType_tie<T>::type (
+ ACE_ENV_SINGLE_ARG_DECL
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ))
+{
+ return this->ptr_->type (
+ ACE_ENV_SINGLE_ARG_PARAMETER
+ );
+}
+
+// TAO_IDL - Generated from
+// be\be_visitor_interface/tie_si.cpp:96
+
+template <class T> ACE_INLINE
+POA_CORBA::TypedefDef_tie<T>::TypedefDef_tie (T &t)
+ : ptr_ (&t),
+ poa_ (PortableServer::POA::_nil ()),
+ rel_ (0)
+{}
+
+template <class T> ACE_INLINE
+POA_CORBA::TypedefDef_tie<T>::TypedefDef_tie (T &t, PortableServer::POA_ptr poa)
+ : ptr_ (&t),
+ poa_ (PortableServer::POA::_duplicate (poa)),
+ rel_ (0)
+{}
+
+template <class T> ACE_INLINE
+POA_CORBA::TypedefDef_tie<T>::TypedefDef_tie (T *tp, ::CORBA::Boolean release)
+ : ptr_ (tp),
+ poa_ (PortableServer::POA::_nil ()),
+ rel_ (release)
+{}
+
+template <class T> ACE_INLINE
+POA_CORBA::TypedefDef_tie<T>::TypedefDef_tie (T *tp, PortableServer::POA_ptr poa, ::CORBA::Boolean release)
+ : ptr_ (tp),
+ poa_ (PortableServer::POA::_duplicate (poa)),
+ rel_ (release)
+{}
+
+template <class T> ACE_INLINE
+POA_CORBA::TypedefDef_tie<T>::~TypedefDef_tie (void)
+{
+ if (this->rel_)
+ {
+ delete this->ptr_;
+ }
+}
+
+template <class T> ACE_INLINE T *
+POA_CORBA::TypedefDef_tie<T>::_tied_object (void)
+{
+ return this->ptr_;
+}
+
+template <class T> ACE_INLINE void
+POA_CORBA::TypedefDef_tie<T>::_tied_object (T &obj)
+{
+ if (this->rel_)
+ {
+ delete this->ptr_;
+ }
+
+ this->ptr_ = &obj;
+ this->rel_ = 0;
+}
+
+template <class T> ACE_INLINE void
+POA_CORBA::TypedefDef_tie<T>::_tied_object (T *obj, ::CORBA::Boolean release)
+{
+ if (this->rel_)
+ {
+ delete this->ptr_;
+ }
+
+ this->ptr_ = obj;
+ this->rel_ = release;
+}
+
+template <class T> ACE_INLINE ::CORBA::Boolean
+POA_CORBA::TypedefDef_tie<T>::_is_owner (void)
+{
+ return this->rel_;
+}
+
+template <class T> ACE_INLINE void
+POA_CORBA::TypedefDef_tie<T>::_is_owner ( ::CORBA::Boolean b)
+{
+ this->rel_ = b;
+}
+
+template <class T> ACE_INLINE PortableServer::POA_ptr
+POA_CORBA::TypedefDef_tie<T>::_default_POA (ACE_ENV_SINGLE_ARG_DECL)
+{
+ if (! ::CORBA::is_nil (this->poa_.in ()))
+ {
+ return PortableServer::POA::_duplicate (this->poa_.in ());
+ }
+
+ return this->TypedefDef::_default_POA (ACE_ENV_SINGLE_ARG_PARAMETER);
+}
+
+// TAO_IDL - Generated from
+// be\be_visitor_operation/tie_si.cpp:101
+
+template <class T> ACE_INLINE
+::CORBA::DefinitionKind POA_CORBA::TypedefDef_tie<T>::def_kind (
+ ACE_ENV_SINGLE_ARG_DECL
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ))
+{
+ return this->ptr_->def_kind (
+ ACE_ENV_SINGLE_ARG_PARAMETER
+ );
+}
+
+// TAO_IDL - Generated from
+// be\be_visitor_operation/tie_si.cpp:101
+
+template <class T> ACE_INLINE
+void POA_CORBA::TypedefDef_tie<T>::destroy (
+ ACE_ENV_SINGLE_ARG_DECL
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ))
+{
+ this->ptr_->destroy (
+ ACE_ENV_SINGLE_ARG_PARAMETER
+ );
+}
+
+// TAO_IDL - Generated from
+// be\be_visitor_operation/tie_si.cpp:101
+
+template <class T> ACE_INLINE
+char * POA_CORBA::TypedefDef_tie<T>::id (
+ ACE_ENV_SINGLE_ARG_DECL
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ))
+{
+ return this->ptr_->id (
+ ACE_ENV_SINGLE_ARG_PARAMETER
+ );
+}
+
+// TAO_IDL - Generated from
+// be\be_visitor_operation/tie_si.cpp:101
+
+template <class T> ACE_INLINE
+void POA_CORBA::TypedefDef_tie<T>::id (
+ const char * id
+ ACE_ENV_ARG_DECL
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ))
+{
+ this->ptr_->id (
+ id
+ ACE_ENV_ARG_PARAMETER
+ );
+}
+
+// TAO_IDL - Generated from
+// be\be_visitor_operation/tie_si.cpp:101
+
+template <class T> ACE_INLINE
+char * POA_CORBA::TypedefDef_tie<T>::name (
+ ACE_ENV_SINGLE_ARG_DECL
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ))
+{
+ return this->ptr_->name (
+ ACE_ENV_SINGLE_ARG_PARAMETER
+ );
+}
+
+// TAO_IDL - Generated from
+// be\be_visitor_operation/tie_si.cpp:101
+
+template <class T> ACE_INLINE
+void POA_CORBA::TypedefDef_tie<T>::name (
+ const char * name
+ ACE_ENV_ARG_DECL
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ))
+{
+ this->ptr_->name (
+ name
+ ACE_ENV_ARG_PARAMETER
+ );
+}
+
+// TAO_IDL - Generated from
+// be\be_visitor_operation/tie_si.cpp:101
+
+template <class T> ACE_INLINE
+char * POA_CORBA::TypedefDef_tie<T>::version (
+ ACE_ENV_SINGLE_ARG_DECL
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ))
+{
+ return this->ptr_->version (
+ ACE_ENV_SINGLE_ARG_PARAMETER
+ );
+}
+
+// TAO_IDL - Generated from
+// be\be_visitor_operation/tie_si.cpp:101
+
+template <class T> ACE_INLINE
+void POA_CORBA::TypedefDef_tie<T>::version (
+ const char * version
+ ACE_ENV_ARG_DECL
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ))
+{
+ this->ptr_->version (
+ version
+ ACE_ENV_ARG_PARAMETER
+ );
+}
+
+// TAO_IDL - Generated from
+// be\be_visitor_operation/tie_si.cpp:101
+
+template <class T> ACE_INLINE
+::CORBA::Container_ptr POA_CORBA::TypedefDef_tie<T>::defined_in (
+ ACE_ENV_SINGLE_ARG_DECL
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ))
+{
+ return this->ptr_->defined_in (
+ ACE_ENV_SINGLE_ARG_PARAMETER
+ );
+}
+
+// TAO_IDL - Generated from
+// be\be_visitor_operation/tie_si.cpp:101
+
+template <class T> ACE_INLINE
+char * POA_CORBA::TypedefDef_tie<T>::absolute_name (
+ ACE_ENV_SINGLE_ARG_DECL
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ))
+{
+ return this->ptr_->absolute_name (
+ ACE_ENV_SINGLE_ARG_PARAMETER
+ );
+}
+
+// TAO_IDL - Generated from
+// be\be_visitor_operation/tie_si.cpp:101
+
+template <class T> ACE_INLINE
+::CORBA::Repository_ptr POA_CORBA::TypedefDef_tie<T>::containing_repository (
+ ACE_ENV_SINGLE_ARG_DECL
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ))
+{
+ return this->ptr_->containing_repository (
+ ACE_ENV_SINGLE_ARG_PARAMETER
+ );
+}
+
+// TAO_IDL - Generated from
+// be\be_visitor_operation/tie_si.cpp:101
+
+template <class T> ACE_INLINE
+::CORBA::Contained::Description * POA_CORBA::TypedefDef_tie<T>::describe (
+ ACE_ENV_SINGLE_ARG_DECL
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ))
+{
+ return this->ptr_->describe (
+ ACE_ENV_SINGLE_ARG_PARAMETER
+ );
+}
+
+// TAO_IDL - Generated from
+// be\be_visitor_operation/tie_si.cpp:101
+
+template <class T> ACE_INLINE
+void POA_CORBA::TypedefDef_tie<T>::move (
+ ::CORBA::Container_ptr new_container,
+ const char * new_name,
+ const char * new_version
+ ACE_ENV_ARG_DECL
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ))
+{
+ this->ptr_->move (
+ new_container,
+ new_name,
+ new_version
+ ACE_ENV_ARG_PARAMETER
+ );
+}
+
+// TAO_IDL - Generated from
+// be\be_visitor_operation/tie_si.cpp:101
+
+template <class T> ACE_INLINE
+::CORBA::TypeCode_ptr POA_CORBA::TypedefDef_tie<T>::type (
+ ACE_ENV_SINGLE_ARG_DECL
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ))
+{
+ return this->ptr_->type (
+ ACE_ENV_SINGLE_ARG_PARAMETER
+ );
+}
+
+
+TAO_END_VERSIONED_NAMESPACE_DECL
+
diff --git a/TAO/orbsvcs/orbsvcs/IFRService/IFR_BasicS.cpp b/TAO/orbsvcs/orbsvcs/IFRService/IFR_BasicS.cpp
new file mode 100644
index 00000000000..119645a9727
--- /dev/null
+++ b/TAO/orbsvcs/orbsvcs/IFRService/IFR_BasicS.cpp
@@ -0,0 +1,23928 @@
+// -*- C++ -*-
+//
+// $Id$
+
+// **** Code generated by the The ACE ORB (TAO) IDL Compiler ****
+// TAO and the TAO IDL Compiler have been developed by:
+// Center for Distributed Object Computing
+// Washington University
+// St. Louis, MO
+// USA
+// http://www.cs.wustl.edu/~schmidt/doc-center.html
+// and
+// Distributed Object Computing Laboratory
+// University of California at Irvine
+// Irvine, CA
+// USA
+// http://doc.ece.uci.edu/
+// and
+// Institute for Software Integrated Systems
+// Vanderbilt University
+// Nashville, TN
+// USA
+// http://www.isis.vanderbilt.edu/
+//
+// Information about TAO is available at:
+// http://www.cs.wustl.edu/~schmidt/TAO.html
+
+
+// TAO_IDL - Generated from
+// be\be_codegen.cpp:603
+
+#ifndef _TAO_IDL____ORBSVCS_ORBSVCS_IFRSERVICE_IFR_BASICS_CPP_
+#define _TAO_IDL____ORBSVCS_ORBSVCS_IFRSERVICE_IFR_BASICS_CPP_
+
+
+#include "IFR_BasicS.h"
+#include "tao/PortableServer/Operation_Table_Perfect_Hash.h"
+#include "tao/PortableServer/Upcall_Command.h"
+#include "tao/PortableServer/Upcall_Wrapper.h"
+#include "tao/TAO_Server_Request.h"
+#include "tao/ORB_Core.h"
+#include "tao/Profile.h"
+#include "tao/Stub.h"
+#include "tao/IFR_Client_Adapter.h"
+#include "tao/Object_T.h"
+#include "tao/AnyTypeCode/TypeCode.h"
+#include "tao/AnyTypeCode/DynamicC.h"
+#include "tao/CDR.h"
+#include "tao/operation_details.h"
+#include "tao/PortableInterceptor.h"
+#include "tao/PortableServer/Basic_SArguments.h"
+#include "tao/PortableServer/Object_SArgument_T.h"
+#include "tao/PortableServer/Special_Basic_SArguments.h"
+#include "tao/PortableServer/UB_String_SArguments.h"
+#include "tao/PortableServer/Var_Size_SArgument_T.h"
+#include "tao/PortableServer/Any_SArg_Traits.h"
+#include "tao/PortableServer/TypeCode_SArg_Traits.h"
+#include "tao/PortableServer/Object_SArg_Traits.h"
+#include "tao/PortableServer/get_arg.h"
+#include "tao/Special_Basic_Arguments.h"
+#include "tao/UB_String_Arguments.h"
+#include "tao/Basic_Arguments.h"
+#include "tao/Object_Argument_T.h"
+#include "tao/Special_Basic_Arguments.h"
+#include "tao/UB_String_Arguments.h"
+#include "tao/Var_Size_Argument_T.h"
+#include "tao/AnyTypeCode/Any_Arg_Traits.h"
+#include "ace/Dynamic_Service.h"
+#include "ace/Malloc_Allocator.h"
+
+#if !defined (__ACE_INLINE__)
+#include "IFR_BasicS.inl"
+#endif /* !defined INLINE */
+
+TAO_BEGIN_VERSIONED_NAMESPACE_DECL
+
+
+
+// TAO_IDL - Generated from
+// be\be_visitor_arg_traits.cpp:72
+
+
+TAO_END_VERSIONED_NAMESPACE_DECL
+
+
+TAO_BEGIN_VERSIONED_NAMESPACE_DECL
+
+
+// Arg traits specializations.
+namespace TAO
+{
+
+ // TAO_IDL - Generated from
+ // be\be_visitor_arg_traits.cpp:817
+
+#if !defined (_CORBA_DEFINITIONKIND__SARG_TRAITS_)
+#define _CORBA_DEFINITIONKIND__SARG_TRAITS_
+
+ template<>
+ class SArg_Traits<CORBA::DefinitionKind>
+ : public
+ Basic_SArg_Traits_T<
+ CORBA::DefinitionKind,
+ TAO::Any_Insert_Policy_Stream <CORBA::DefinitionKind>
+ >
+ {
+ };
+
+#endif /* end #if !defined */
+
+ // TAO_IDL - Generated from
+ // be\be_visitor_arg_traits.cpp:140
+
+#if !defined (_CORBA_CONTAINED__SARG_TRAITS_)
+#define _CORBA_CONTAINED__SARG_TRAITS_
+
+ template<>
+ class SArg_Traits<CORBA::Contained>
+ : public
+ Object_SArg_Traits_T<
+ CORBA::Contained_ptr,
+ CORBA::Contained_var,
+ CORBA::Contained_out,
+ TAO::Any_Insert_Policy_Stream <CORBA::Contained_ptr>
+ >
+ {
+ };
+
+#endif /* end #if !defined */
+
+ // TAO_IDL - Generated from
+ // be\be_visitor_arg_traits.cpp:140
+
+#if !defined (_CORBA_REPOSITORY__SARG_TRAITS_)
+#define _CORBA_REPOSITORY__SARG_TRAITS_
+
+ template<>
+ class SArg_Traits<CORBA::Repository>
+ : public
+ Object_SArg_Traits_T<
+ CORBA::Repository_ptr,
+ CORBA::Repository_var,
+ CORBA::Repository_out,
+ TAO::Any_Insert_Policy_Stream <CORBA::Repository_ptr>
+ >
+ {
+ };
+
+#endif /* end #if !defined */
+
+ // TAO_IDL - Generated from
+ // be\be_visitor_arg_traits.cpp:140
+
+#if !defined (_CORBA_CONTAINER__SARG_TRAITS_)
+#define _CORBA_CONTAINER__SARG_TRAITS_
+
+ template<>
+ class SArg_Traits<CORBA::Container>
+ : public
+ Object_SArg_Traits_T<
+ CORBA::Container_ptr,
+ CORBA::Container_var,
+ CORBA::Container_out,
+ TAO::Any_Insert_Policy_Stream <CORBA::Container_ptr>
+ >
+ {
+ };
+
+#endif /* end #if !defined */
+
+ // TAO_IDL - Generated from
+ // be\be_visitor_arg_traits.cpp:140
+
+#if !defined (_CORBA_IDLTYPE__SARG_TRAITS_)
+#define _CORBA_IDLTYPE__SARG_TRAITS_
+
+ template<>
+ class SArg_Traits<CORBA::IDLType>
+ : public
+ Object_SArg_Traits_T<
+ CORBA::IDLType_ptr,
+ CORBA::IDLType_var,
+ CORBA::IDLType_out,
+ TAO::Any_Insert_Policy_Stream <CORBA::IDLType_ptr>
+ >
+ {
+ };
+
+#endif /* end #if !defined */
+
+ // TAO_IDL - Generated from
+ // be\be_visitor_arg_traits.cpp:611
+
+#if !defined (_CORBA_INTERFACEDEFSEQ__SARG_TRAITS_)
+#define _CORBA_INTERFACEDEFSEQ__SARG_TRAITS_
+
+ template<>
+ class SArg_Traits<CORBA::InterfaceDefSeq>
+ : public
+ Var_Size_SArg_Traits_T<
+ CORBA::InterfaceDefSeq,
+ TAO::Any_Insert_Policy_Stream <CORBA::InterfaceDefSeq>
+ >
+ {
+ };
+
+#endif /* end #if !defined */
+
+ // TAO_IDL - Generated from
+ // be\be_visitor_arg_traits.cpp:611
+
+#if !defined (_CORBA_STRUCTMEMBERSEQ__SARG_TRAITS_)
+#define _CORBA_STRUCTMEMBERSEQ__SARG_TRAITS_
+
+ template<>
+ class SArg_Traits<CORBA::StructMemberSeq>
+ : public
+ Var_Size_SArg_Traits_T<
+ CORBA::StructMemberSeq,
+ TAO::Any_Insert_Policy_Stream <CORBA::StructMemberSeq>
+ >
+ {
+ };
+
+#endif /* end #if !defined */
+
+ // TAO_IDL - Generated from
+ // be\be_visitor_arg_traits.cpp:611
+
+#if !defined (_CORBA_EXCDESCRIPTIONSEQ__SARG_TRAITS_)
+#define _CORBA_EXCDESCRIPTIONSEQ__SARG_TRAITS_
+
+ template<>
+ class SArg_Traits<CORBA::ExcDescriptionSeq>
+ : public
+ Var_Size_SArg_Traits_T<
+ CORBA::ExcDescriptionSeq,
+ TAO::Any_Insert_Policy_Stream <CORBA::ExcDescriptionSeq>
+ >
+ {
+ };
+
+#endif /* end #if !defined */
+
+ // TAO_IDL - Generated from
+ // be\be_visitor_arg_traits.cpp:611
+
+#if !defined (_CORBA_UNIONMEMBERSEQ__SARG_TRAITS_)
+#define _CORBA_UNIONMEMBERSEQ__SARG_TRAITS_
+
+ template<>
+ class SArg_Traits<CORBA::UnionMemberSeq>
+ : public
+ Var_Size_SArg_Traits_T<
+ CORBA::UnionMemberSeq,
+ TAO::Any_Insert_Policy_Stream <CORBA::UnionMemberSeq>
+ >
+ {
+ };
+
+#endif /* end #if !defined */
+
+ // TAO_IDL - Generated from
+ // be\be_visitor_arg_traits.cpp:611
+
+#if !defined (_CORBA_ENUMMEMBERSEQ__SARG_TRAITS_)
+#define _CORBA_ENUMMEMBERSEQ__SARG_TRAITS_
+
+ template<>
+ class SArg_Traits<CORBA::EnumMemberSeq>
+ : public
+ Var_Size_SArg_Traits_T<
+ CORBA::EnumMemberSeq,
+ TAO::Any_Insert_Policy_Stream <CORBA::EnumMemberSeq>
+ >
+ {
+ };
+
+#endif /* end #if !defined */
+
+ // TAO_IDL - Generated from
+ // be\be_visitor_arg_traits.cpp:140
+
+#if !defined (_CORBA_PRIMITIVEDEF__SARG_TRAITS_)
+#define _CORBA_PRIMITIVEDEF__SARG_TRAITS_
+
+ template<>
+ class SArg_Traits<CORBA::PrimitiveDef>
+ : public
+ Object_SArg_Traits_T<
+ CORBA::PrimitiveDef_ptr,
+ CORBA::PrimitiveDef_var,
+ CORBA::PrimitiveDef_out,
+ TAO::Any_Insert_Policy_Stream <CORBA::PrimitiveDef_ptr>
+ >
+ {
+ };
+
+#endif /* end #if !defined */
+
+ // TAO_IDL - Generated from
+ // be\be_visitor_arg_traits.cpp:140
+
+#if !defined (_CORBA_STRINGDEF__SARG_TRAITS_)
+#define _CORBA_STRINGDEF__SARG_TRAITS_
+
+ template<>
+ class SArg_Traits<CORBA::StringDef>
+ : public
+ Object_SArg_Traits_T<
+ CORBA::StringDef_ptr,
+ CORBA::StringDef_var,
+ CORBA::StringDef_out,
+ TAO::Any_Insert_Policy_Stream <CORBA::StringDef_ptr>
+ >
+ {
+ };
+
+#endif /* end #if !defined */
+
+ // TAO_IDL - Generated from
+ // be\be_visitor_arg_traits.cpp:140
+
+#if !defined (_CORBA_SEQUENCEDEF__SARG_TRAITS_)
+#define _CORBA_SEQUENCEDEF__SARG_TRAITS_
+
+ template<>
+ class SArg_Traits<CORBA::SequenceDef>
+ : public
+ Object_SArg_Traits_T<
+ CORBA::SequenceDef_ptr,
+ CORBA::SequenceDef_var,
+ CORBA::SequenceDef_out,
+ TAO::Any_Insert_Policy_Stream <CORBA::SequenceDef_ptr>
+ >
+ {
+ };
+
+#endif /* end #if !defined */
+
+ // TAO_IDL - Generated from
+ // be\be_visitor_arg_traits.cpp:140
+
+#if !defined (_CORBA_ARRAYDEF__SARG_TRAITS_)
+#define _CORBA_ARRAYDEF__SARG_TRAITS_
+
+ template<>
+ class SArg_Traits<CORBA::ArrayDef>
+ : public
+ Object_SArg_Traits_T<
+ CORBA::ArrayDef_ptr,
+ CORBA::ArrayDef_var,
+ CORBA::ArrayDef_out,
+ TAO::Any_Insert_Policy_Stream <CORBA::ArrayDef_ptr>
+ >
+ {
+ };
+
+#endif /* end #if !defined */
+
+ // TAO_IDL - Generated from
+ // be\be_visitor_arg_traits.cpp:140
+
+#if !defined (_CORBA_WSTRINGDEF__SARG_TRAITS_)
+#define _CORBA_WSTRINGDEF__SARG_TRAITS_
+
+ template<>
+ class SArg_Traits<CORBA::WstringDef>
+ : public
+ Object_SArg_Traits_T<
+ CORBA::WstringDef_ptr,
+ CORBA::WstringDef_var,
+ CORBA::WstringDef_out,
+ TAO::Any_Insert_Policy_Stream <CORBA::WstringDef_ptr>
+ >
+ {
+ };
+
+#endif /* end #if !defined */
+
+ // TAO_IDL - Generated from
+ // be\be_visitor_arg_traits.cpp:140
+
+#if !defined (_CORBA_FIXEDDEF__SARG_TRAITS_)
+#define _CORBA_FIXEDDEF__SARG_TRAITS_
+
+ template<>
+ class SArg_Traits<CORBA::FixedDef>
+ : public
+ Object_SArg_Traits_T<
+ CORBA::FixedDef_ptr,
+ CORBA::FixedDef_var,
+ CORBA::FixedDef_out,
+ TAO::Any_Insert_Policy_Stream <CORBA::FixedDef_ptr>
+ >
+ {
+ };
+
+#endif /* end #if !defined */
+
+ // TAO_IDL - Generated from
+ // be\be_visitor_arg_traits.cpp:817
+
+#if !defined (_CORBA_PRIMITIVEKIND__SARG_TRAITS_)
+#define _CORBA_PRIMITIVEKIND__SARG_TRAITS_
+
+ template<>
+ class SArg_Traits<CORBA::PrimitiveKind>
+ : public
+ Basic_SArg_Traits_T<
+ CORBA::PrimitiveKind,
+ TAO::Any_Insert_Policy_Stream <CORBA::PrimitiveKind>
+ >
+ {
+ };
+
+#endif /* end #if !defined */
+
+ // TAO_IDL - Generated from
+ // be\be_visitor_arg_traits.cpp:611
+
+#if !defined (_CORBA_EXCEPTIONDEFSEQ__SARG_TRAITS_)
+#define _CORBA_EXCEPTIONDEFSEQ__SARG_TRAITS_
+
+ template<>
+ class SArg_Traits<CORBA::ExceptionDefSeq>
+ : public
+ Var_Size_SArg_Traits_T<
+ CORBA::ExceptionDefSeq,
+ TAO::Any_Insert_Policy_Stream <CORBA::ExceptionDefSeq>
+ >
+ {
+ };
+
+#endif /* end #if !defined */
+
+ // TAO_IDL - Generated from
+ // be\be_visitor_arg_traits.cpp:817
+
+#if !defined (_CORBA_ATTRIBUTEMODE__SARG_TRAITS_)
+#define _CORBA_ATTRIBUTEMODE__SARG_TRAITS_
+
+ template<>
+ class SArg_Traits<CORBA::AttributeMode>
+ : public
+ Basic_SArg_Traits_T<
+ CORBA::AttributeMode,
+ TAO::Any_Insert_Policy_Stream <CORBA::AttributeMode>
+ >
+ {
+ };
+
+#endif /* end #if !defined */
+
+ // TAO_IDL - Generated from
+ // be\be_visitor_arg_traits.cpp:140
+
+#if !defined (_CORBA_ATTRIBUTEDEF__SARG_TRAITS_)
+#define _CORBA_ATTRIBUTEDEF__SARG_TRAITS_
+
+ template<>
+ class SArg_Traits<CORBA::AttributeDef>
+ : public
+ Object_SArg_Traits_T<
+ CORBA::AttributeDef_ptr,
+ CORBA::AttributeDef_var,
+ CORBA::AttributeDef_out,
+ TAO::Any_Insert_Policy_Stream <CORBA::AttributeDef_ptr>
+ >
+ {
+ };
+
+#endif /* end #if !defined */
+
+ // TAO_IDL - Generated from
+ // be\be_visitor_arg_traits.cpp:859
+
+#if !defined (_CORBA_EXTATTRIBUTEDESCRIPTION__SARG_TRAITS_)
+#define _CORBA_EXTATTRIBUTEDESCRIPTION__SARG_TRAITS_
+
+ template<>
+ class SArg_Traits<CORBA::ExtAttributeDescription>
+ : public
+ Var_Size_SArg_Traits_T<
+ CORBA::ExtAttributeDescription,
+ TAO::Any_Insert_Policy_Stream <CORBA::ExtAttributeDescription>
+ >
+ {
+ };
+
+#endif /* end #if !defined */
+
+ // TAO_IDL - Generated from
+ // be\be_visitor_arg_traits.cpp:140
+
+#if !defined (_CORBA_EXTATTRIBUTEDEF__SARG_TRAITS_)
+#define _CORBA_EXTATTRIBUTEDEF__SARG_TRAITS_
+
+ template<>
+ class SArg_Traits<CORBA::ExtAttributeDef>
+ : public
+ Object_SArg_Traits_T<
+ CORBA::ExtAttributeDef_ptr,
+ CORBA::ExtAttributeDef_var,
+ CORBA::ExtAttributeDef_out,
+ TAO::Any_Insert_Policy_Stream <CORBA::ExtAttributeDef_ptr>
+ >
+ {
+ };
+
+#endif /* end #if !defined */
+
+ // TAO_IDL - Generated from
+ // be\be_visitor_arg_traits.cpp:817
+
+#if !defined (_CORBA_OPERATIONMODE__SARG_TRAITS_)
+#define _CORBA_OPERATIONMODE__SARG_TRAITS_
+
+ template<>
+ class SArg_Traits<CORBA::OperationMode>
+ : public
+ Basic_SArg_Traits_T<
+ CORBA::OperationMode,
+ TAO::Any_Insert_Policy_Stream <CORBA::OperationMode>
+ >
+ {
+ };
+
+#endif /* end #if !defined */
+
+ // TAO_IDL - Generated from
+ // be\be_visitor_arg_traits.cpp:611
+
+#if !defined (_CORBA_PARDESCRIPTIONSEQ__SARG_TRAITS_)
+#define _CORBA_PARDESCRIPTIONSEQ__SARG_TRAITS_
+
+ template<>
+ class SArg_Traits<CORBA::ParDescriptionSeq>
+ : public
+ Var_Size_SArg_Traits_T<
+ CORBA::ParDescriptionSeq,
+ TAO::Any_Insert_Policy_Stream <CORBA::ParDescriptionSeq>
+ >
+ {
+ };
+
+#endif /* end #if !defined */
+
+ // TAO_IDL - Generated from
+ // be\be_visitor_arg_traits.cpp:611
+
+#if !defined (_CORBA_CONTEXTIDSEQ__SARG_TRAITS_)
+#define _CORBA_CONTEXTIDSEQ__SARG_TRAITS_
+
+ template<>
+ class SArg_Traits<CORBA::ContextIdSeq>
+ : public
+ Var_Size_SArg_Traits_T<
+ CORBA::ContextIdSeq,
+ TAO::Any_Insert_Policy_Stream <CORBA::ContextIdSeq>
+ >
+ {
+ };
+
+#endif /* end #if !defined */
+
+ // TAO_IDL - Generated from
+ // be\be_visitor_arg_traits.cpp:140
+
+#if !defined (_CORBA_OPERATIONDEF__SARG_TRAITS_)
+#define _CORBA_OPERATIONDEF__SARG_TRAITS_
+
+ template<>
+ class SArg_Traits<CORBA::OperationDef>
+ : public
+ Object_SArg_Traits_T<
+ CORBA::OperationDef_ptr,
+ CORBA::OperationDef_var,
+ CORBA::OperationDef_out,
+ TAO::Any_Insert_Policy_Stream <CORBA::OperationDef_ptr>
+ >
+ {
+ };
+
+#endif /* end #if !defined */
+
+ // TAO_IDL - Generated from
+ // be\be_visitor_arg_traits.cpp:859
+
+#if !defined (_CORBA_INTERFACEDEF_FULLINTERFACEDESCRIPTION__SARG_TRAITS_)
+#define _CORBA_INTERFACEDEF_FULLINTERFACEDESCRIPTION__SARG_TRAITS_
+
+ template<>
+ class SArg_Traits<CORBA::InterfaceDef::FullInterfaceDescription>
+ : public
+ Var_Size_SArg_Traits_T<
+ CORBA::InterfaceDef::FullInterfaceDescription,
+ TAO::Any_Insert_Policy_Stream <CORBA::InterfaceDef::FullInterfaceDescription>
+ >
+ {
+ };
+
+#endif /* end #if !defined */
+
+ // TAO_IDL - Generated from
+ // be\be_visitor_arg_traits.cpp:859
+
+#if !defined (_CORBA_INTERFACEATTREXTENSION_EXTFULLINTERFACEDESCRIPTION__SARG_TRAITS_)
+#define _CORBA_INTERFACEATTREXTENSION_EXTFULLINTERFACEDESCRIPTION__SARG_TRAITS_
+
+ template<>
+ class SArg_Traits<CORBA::InterfaceAttrExtension::ExtFullInterfaceDescription>
+ : public
+ Var_Size_SArg_Traits_T<
+ CORBA::InterfaceAttrExtension::ExtFullInterfaceDescription,
+ TAO::Any_Insert_Policy_Stream <CORBA::InterfaceAttrExtension::ExtFullInterfaceDescription>
+ >
+ {
+ };
+
+#endif /* end #if !defined */
+}
+
+TAO_END_VERSIONED_NAMESPACE_DECL
+
+
+TAO_BEGIN_VERSIONED_NAMESPACE_DECL
+
+
+
+
+// TAO_IDL - Generated from
+// be\be_visitor_arg_traits.cpp:72
+
+
+TAO_END_VERSIONED_NAMESPACE_DECL
+
+
+TAO_BEGIN_VERSIONED_NAMESPACE_DECL
+
+
+// Arg traits specializations.
+namespace TAO
+{
+
+ // TAO_IDL - Generated from
+ // be\be_visitor_arg_traits.cpp:817
+
+#if !defined (_CORBA_DEFINITIONKIND__ARG_TRAITS_)
+#define _CORBA_DEFINITIONKIND__ARG_TRAITS_
+
+ template<>
+ class Arg_Traits<CORBA::DefinitionKind>
+ : public
+ Basic_Arg_Traits_T<
+ CORBA::DefinitionKind,
+ TAO::Any_Insert_Policy_Stream <CORBA::DefinitionKind>
+ >
+ {
+ };
+
+#endif /* end #if !defined */
+
+ // TAO_IDL - Generated from
+ // be\be_visitor_arg_traits.cpp:140
+
+#if !defined (_CORBA_CONTAINED__ARG_TRAITS_)
+#define _CORBA_CONTAINED__ARG_TRAITS_
+
+ template<>
+ class Arg_Traits<CORBA::Contained>
+ : public
+ Object_Arg_Traits_T<
+ CORBA::Contained_ptr,
+ CORBA::Contained_var,
+ CORBA::Contained_out,
+ TAO::Objref_Traits<CORBA::Contained>,
+ TAO::Any_Insert_Policy_Stream <CORBA::Contained_ptr>
+ >
+ {
+ };
+
+#endif /* end #if !defined */
+
+ // TAO_IDL - Generated from
+ // be\be_visitor_arg_traits.cpp:140
+
+#if !defined (_CORBA_REPOSITORY__ARG_TRAITS_)
+#define _CORBA_REPOSITORY__ARG_TRAITS_
+
+ template<>
+ class Arg_Traits<CORBA::Repository>
+ : public
+ Object_Arg_Traits_T<
+ CORBA::Repository_ptr,
+ CORBA::Repository_var,
+ CORBA::Repository_out,
+ TAO::Objref_Traits<CORBA::Repository>,
+ TAO::Any_Insert_Policy_Stream <CORBA::Repository_ptr>
+ >
+ {
+ };
+
+#endif /* end #if !defined */
+
+ // TAO_IDL - Generated from
+ // be\be_visitor_arg_traits.cpp:140
+
+#if !defined (_CORBA_CONTAINER__ARG_TRAITS_)
+#define _CORBA_CONTAINER__ARG_TRAITS_
+
+ template<>
+ class Arg_Traits<CORBA::Container>
+ : public
+ Object_Arg_Traits_T<
+ CORBA::Container_ptr,
+ CORBA::Container_var,
+ CORBA::Container_out,
+ TAO::Objref_Traits<CORBA::Container>,
+ TAO::Any_Insert_Policy_Stream <CORBA::Container_ptr>
+ >
+ {
+ };
+
+#endif /* end #if !defined */
+
+ // TAO_IDL - Generated from
+ // be\be_visitor_arg_traits.cpp:140
+
+#if !defined (_CORBA_IDLTYPE__ARG_TRAITS_)
+#define _CORBA_IDLTYPE__ARG_TRAITS_
+
+ template<>
+ class Arg_Traits<CORBA::IDLType>
+ : public
+ Object_Arg_Traits_T<
+ CORBA::IDLType_ptr,
+ CORBA::IDLType_var,
+ CORBA::IDLType_out,
+ TAO::Objref_Traits<CORBA::IDLType>,
+ TAO::Any_Insert_Policy_Stream <CORBA::IDLType_ptr>
+ >
+ {
+ };
+
+#endif /* end #if !defined */
+
+ // TAO_IDL - Generated from
+ // be\be_visitor_arg_traits.cpp:611
+
+#if !defined (_CORBA_INTERFACEDEFSEQ__ARG_TRAITS_)
+#define _CORBA_INTERFACEDEFSEQ__ARG_TRAITS_
+
+ template<>
+ class Arg_Traits<CORBA::InterfaceDefSeq>
+ : public
+ Var_Size_Arg_Traits_T<
+ CORBA::InterfaceDefSeq,
+ TAO::Any_Insert_Policy_Stream <CORBA::InterfaceDefSeq>
+ >
+ {
+ };
+
+#endif /* end #if !defined */
+
+ // TAO_IDL - Generated from
+ // be\be_visitor_arg_traits.cpp:611
+
+#if !defined (_CORBA_STRUCTMEMBERSEQ__ARG_TRAITS_)
+#define _CORBA_STRUCTMEMBERSEQ__ARG_TRAITS_
+
+ template<>
+ class Arg_Traits<CORBA::StructMemberSeq>
+ : public
+ Var_Size_Arg_Traits_T<
+ CORBA::StructMemberSeq,
+ TAO::Any_Insert_Policy_Stream <CORBA::StructMemberSeq>
+ >
+ {
+ };
+
+#endif /* end #if !defined */
+
+ // TAO_IDL - Generated from
+ // be\be_visitor_arg_traits.cpp:611
+
+#if !defined (_CORBA_EXCDESCRIPTIONSEQ__ARG_TRAITS_)
+#define _CORBA_EXCDESCRIPTIONSEQ__ARG_TRAITS_
+
+ template<>
+ class Arg_Traits<CORBA::ExcDescriptionSeq>
+ : public
+ Var_Size_Arg_Traits_T<
+ CORBA::ExcDescriptionSeq,
+ TAO::Any_Insert_Policy_Stream <CORBA::ExcDescriptionSeq>
+ >
+ {
+ };
+
+#endif /* end #if !defined */
+
+ // TAO_IDL - Generated from
+ // be\be_visitor_arg_traits.cpp:611
+
+#if !defined (_CORBA_UNIONMEMBERSEQ__ARG_TRAITS_)
+#define _CORBA_UNIONMEMBERSEQ__ARG_TRAITS_
+
+ template<>
+ class Arg_Traits<CORBA::UnionMemberSeq>
+ : public
+ Var_Size_Arg_Traits_T<
+ CORBA::UnionMemberSeq,
+ TAO::Any_Insert_Policy_Stream <CORBA::UnionMemberSeq>
+ >
+ {
+ };
+
+#endif /* end #if !defined */
+
+ // TAO_IDL - Generated from
+ // be\be_visitor_arg_traits.cpp:611
+
+#if !defined (_CORBA_ENUMMEMBERSEQ__ARG_TRAITS_)
+#define _CORBA_ENUMMEMBERSEQ__ARG_TRAITS_
+
+ template<>
+ class Arg_Traits<CORBA::EnumMemberSeq>
+ : public
+ Var_Size_Arg_Traits_T<
+ CORBA::EnumMemberSeq,
+ TAO::Any_Insert_Policy_Stream <CORBA::EnumMemberSeq>
+ >
+ {
+ };
+
+#endif /* end #if !defined */
+
+ // TAO_IDL - Generated from
+ // be\be_visitor_arg_traits.cpp:140
+
+#if !defined (_CORBA_PRIMITIVEDEF__ARG_TRAITS_)
+#define _CORBA_PRIMITIVEDEF__ARG_TRAITS_
+
+ template<>
+ class Arg_Traits<CORBA::PrimitiveDef>
+ : public
+ Object_Arg_Traits_T<
+ CORBA::PrimitiveDef_ptr,
+ CORBA::PrimitiveDef_var,
+ CORBA::PrimitiveDef_out,
+ TAO::Objref_Traits<CORBA::PrimitiveDef>,
+ TAO::Any_Insert_Policy_Stream <CORBA::PrimitiveDef_ptr>
+ >
+ {
+ };
+
+#endif /* end #if !defined */
+
+ // TAO_IDL - Generated from
+ // be\be_visitor_arg_traits.cpp:140
+
+#if !defined (_CORBA_STRINGDEF__ARG_TRAITS_)
+#define _CORBA_STRINGDEF__ARG_TRAITS_
+
+ template<>
+ class Arg_Traits<CORBA::StringDef>
+ : public
+ Object_Arg_Traits_T<
+ CORBA::StringDef_ptr,
+ CORBA::StringDef_var,
+ CORBA::StringDef_out,
+ TAO::Objref_Traits<CORBA::StringDef>,
+ TAO::Any_Insert_Policy_Stream <CORBA::StringDef_ptr>
+ >
+ {
+ };
+
+#endif /* end #if !defined */
+
+ // TAO_IDL - Generated from
+ // be\be_visitor_arg_traits.cpp:140
+
+#if !defined (_CORBA_SEQUENCEDEF__ARG_TRAITS_)
+#define _CORBA_SEQUENCEDEF__ARG_TRAITS_
+
+ template<>
+ class Arg_Traits<CORBA::SequenceDef>
+ : public
+ Object_Arg_Traits_T<
+ CORBA::SequenceDef_ptr,
+ CORBA::SequenceDef_var,
+ CORBA::SequenceDef_out,
+ TAO::Objref_Traits<CORBA::SequenceDef>,
+ TAO::Any_Insert_Policy_Stream <CORBA::SequenceDef_ptr>
+ >
+ {
+ };
+
+#endif /* end #if !defined */
+
+ // TAO_IDL - Generated from
+ // be\be_visitor_arg_traits.cpp:140
+
+#if !defined (_CORBA_ARRAYDEF__ARG_TRAITS_)
+#define _CORBA_ARRAYDEF__ARG_TRAITS_
+
+ template<>
+ class Arg_Traits<CORBA::ArrayDef>
+ : public
+ Object_Arg_Traits_T<
+ CORBA::ArrayDef_ptr,
+ CORBA::ArrayDef_var,
+ CORBA::ArrayDef_out,
+ TAO::Objref_Traits<CORBA::ArrayDef>,
+ TAO::Any_Insert_Policy_Stream <CORBA::ArrayDef_ptr>
+ >
+ {
+ };
+
+#endif /* end #if !defined */
+
+ // TAO_IDL - Generated from
+ // be\be_visitor_arg_traits.cpp:140
+
+#if !defined (_CORBA_WSTRINGDEF__ARG_TRAITS_)
+#define _CORBA_WSTRINGDEF__ARG_TRAITS_
+
+ template<>
+ class Arg_Traits<CORBA::WstringDef>
+ : public
+ Object_Arg_Traits_T<
+ CORBA::WstringDef_ptr,
+ CORBA::WstringDef_var,
+ CORBA::WstringDef_out,
+ TAO::Objref_Traits<CORBA::WstringDef>,
+ TAO::Any_Insert_Policy_Stream <CORBA::WstringDef_ptr>
+ >
+ {
+ };
+
+#endif /* end #if !defined */
+
+ // TAO_IDL - Generated from
+ // be\be_visitor_arg_traits.cpp:140
+
+#if !defined (_CORBA_FIXEDDEF__ARG_TRAITS_)
+#define _CORBA_FIXEDDEF__ARG_TRAITS_
+
+ template<>
+ class Arg_Traits<CORBA::FixedDef>
+ : public
+ Object_Arg_Traits_T<
+ CORBA::FixedDef_ptr,
+ CORBA::FixedDef_var,
+ CORBA::FixedDef_out,
+ TAO::Objref_Traits<CORBA::FixedDef>,
+ TAO::Any_Insert_Policy_Stream <CORBA::FixedDef_ptr>
+ >
+ {
+ };
+
+#endif /* end #if !defined */
+
+ // TAO_IDL - Generated from
+ // be\be_visitor_arg_traits.cpp:817
+
+#if !defined (_CORBA_PRIMITIVEKIND__ARG_TRAITS_)
+#define _CORBA_PRIMITIVEKIND__ARG_TRAITS_
+
+ template<>
+ class Arg_Traits<CORBA::PrimitiveKind>
+ : public
+ Basic_Arg_Traits_T<
+ CORBA::PrimitiveKind,
+ TAO::Any_Insert_Policy_Stream <CORBA::PrimitiveKind>
+ >
+ {
+ };
+
+#endif /* end #if !defined */
+
+ // TAO_IDL - Generated from
+ // be\be_visitor_arg_traits.cpp:611
+
+#if !defined (_CORBA_EXCEPTIONDEFSEQ__ARG_TRAITS_)
+#define _CORBA_EXCEPTIONDEFSEQ__ARG_TRAITS_
+
+ template<>
+ class Arg_Traits<CORBA::ExceptionDefSeq>
+ : public
+ Var_Size_Arg_Traits_T<
+ CORBA::ExceptionDefSeq,
+ TAO::Any_Insert_Policy_Stream <CORBA::ExceptionDefSeq>
+ >
+ {
+ };
+
+#endif /* end #if !defined */
+
+ // TAO_IDL - Generated from
+ // be\be_visitor_arg_traits.cpp:817
+
+#if !defined (_CORBA_ATTRIBUTEMODE__ARG_TRAITS_)
+#define _CORBA_ATTRIBUTEMODE__ARG_TRAITS_
+
+ template<>
+ class Arg_Traits<CORBA::AttributeMode>
+ : public
+ Basic_Arg_Traits_T<
+ CORBA::AttributeMode,
+ TAO::Any_Insert_Policy_Stream <CORBA::AttributeMode>
+ >
+ {
+ };
+
+#endif /* end #if !defined */
+
+ // TAO_IDL - Generated from
+ // be\be_visitor_arg_traits.cpp:140
+
+#if !defined (_CORBA_ATTRIBUTEDEF__ARG_TRAITS_)
+#define _CORBA_ATTRIBUTEDEF__ARG_TRAITS_
+
+ template<>
+ class Arg_Traits<CORBA::AttributeDef>
+ : public
+ Object_Arg_Traits_T<
+ CORBA::AttributeDef_ptr,
+ CORBA::AttributeDef_var,
+ CORBA::AttributeDef_out,
+ TAO::Objref_Traits<CORBA::AttributeDef>,
+ TAO::Any_Insert_Policy_Stream <CORBA::AttributeDef_ptr>
+ >
+ {
+ };
+
+#endif /* end #if !defined */
+
+ // TAO_IDL - Generated from
+ // be\be_visitor_arg_traits.cpp:859
+
+#if !defined (_CORBA_EXTATTRIBUTEDESCRIPTION__ARG_TRAITS_)
+#define _CORBA_EXTATTRIBUTEDESCRIPTION__ARG_TRAITS_
+
+ template<>
+ class Arg_Traits<CORBA::ExtAttributeDescription>
+ : public
+ Var_Size_Arg_Traits_T<
+ CORBA::ExtAttributeDescription,
+ TAO::Any_Insert_Policy_Stream <CORBA::ExtAttributeDescription>
+ >
+ {
+ };
+
+#endif /* end #if !defined */
+
+ // TAO_IDL - Generated from
+ // be\be_visitor_arg_traits.cpp:140
+
+#if !defined (_CORBA_EXTATTRIBUTEDEF__ARG_TRAITS_)
+#define _CORBA_EXTATTRIBUTEDEF__ARG_TRAITS_
+
+ template<>
+ class Arg_Traits<CORBA::ExtAttributeDef>
+ : public
+ Object_Arg_Traits_T<
+ CORBA::ExtAttributeDef_ptr,
+ CORBA::ExtAttributeDef_var,
+ CORBA::ExtAttributeDef_out,
+ TAO::Objref_Traits<CORBA::ExtAttributeDef>,
+ TAO::Any_Insert_Policy_Stream <CORBA::ExtAttributeDef_ptr>
+ >
+ {
+ };
+
+#endif /* end #if !defined */
+
+ // TAO_IDL - Generated from
+ // be\be_visitor_arg_traits.cpp:817
+
+#if !defined (_CORBA_OPERATIONMODE__ARG_TRAITS_)
+#define _CORBA_OPERATIONMODE__ARG_TRAITS_
+
+ template<>
+ class Arg_Traits<CORBA::OperationMode>
+ : public
+ Basic_Arg_Traits_T<
+ CORBA::OperationMode,
+ TAO::Any_Insert_Policy_Stream <CORBA::OperationMode>
+ >
+ {
+ };
+
+#endif /* end #if !defined */
+
+ // TAO_IDL - Generated from
+ // be\be_visitor_arg_traits.cpp:611
+
+#if !defined (_CORBA_PARDESCRIPTIONSEQ__ARG_TRAITS_)
+#define _CORBA_PARDESCRIPTIONSEQ__ARG_TRAITS_
+
+ template<>
+ class Arg_Traits<CORBA::ParDescriptionSeq>
+ : public
+ Var_Size_Arg_Traits_T<
+ CORBA::ParDescriptionSeq,
+ TAO::Any_Insert_Policy_Stream <CORBA::ParDescriptionSeq>
+ >
+ {
+ };
+
+#endif /* end #if !defined */
+
+ // TAO_IDL - Generated from
+ // be\be_visitor_arg_traits.cpp:611
+
+#if !defined (_CORBA_CONTEXTIDSEQ__ARG_TRAITS_)
+#define _CORBA_CONTEXTIDSEQ__ARG_TRAITS_
+
+ template<>
+ class Arg_Traits<CORBA::ContextIdSeq>
+ : public
+ Var_Size_Arg_Traits_T<
+ CORBA::ContextIdSeq,
+ TAO::Any_Insert_Policy_Stream <CORBA::ContextIdSeq>
+ >
+ {
+ };
+
+#endif /* end #if !defined */
+
+ // TAO_IDL - Generated from
+ // be\be_visitor_arg_traits.cpp:140
+
+#if !defined (_CORBA_OPERATIONDEF__ARG_TRAITS_)
+#define _CORBA_OPERATIONDEF__ARG_TRAITS_
+
+ template<>
+ class Arg_Traits<CORBA::OperationDef>
+ : public
+ Object_Arg_Traits_T<
+ CORBA::OperationDef_ptr,
+ CORBA::OperationDef_var,
+ CORBA::OperationDef_out,
+ TAO::Objref_Traits<CORBA::OperationDef>,
+ TAO::Any_Insert_Policy_Stream <CORBA::OperationDef_ptr>
+ >
+ {
+ };
+
+#endif /* end #if !defined */
+
+ // TAO_IDL - Generated from
+ // be\be_visitor_arg_traits.cpp:859
+
+#if !defined (_CORBA_INTERFACEDEF_FULLINTERFACEDESCRIPTION__ARG_TRAITS_)
+#define _CORBA_INTERFACEDEF_FULLINTERFACEDESCRIPTION__ARG_TRAITS_
+
+ template<>
+ class Arg_Traits<CORBA::InterfaceDef::FullInterfaceDescription>
+ : public
+ Var_Size_Arg_Traits_T<
+ CORBA::InterfaceDef::FullInterfaceDescription,
+ TAO::Any_Insert_Policy_Stream <CORBA::InterfaceDef::FullInterfaceDescription>
+ >
+ {
+ };
+
+#endif /* end #if !defined */
+
+ // TAO_IDL - Generated from
+ // be\be_visitor_arg_traits.cpp:859
+
+#if !defined (_CORBA_INTERFACEATTREXTENSION_EXTFULLINTERFACEDESCRIPTION__ARG_TRAITS_)
+#define _CORBA_INTERFACEATTREXTENSION_EXTFULLINTERFACEDESCRIPTION__ARG_TRAITS_
+
+ template<>
+ class Arg_Traits<CORBA::InterfaceAttrExtension::ExtFullInterfaceDescription>
+ : public
+ Var_Size_Arg_Traits_T<
+ CORBA::InterfaceAttrExtension::ExtFullInterfaceDescription,
+ TAO::Any_Insert_Policy_Stream <CORBA::InterfaceAttrExtension::ExtFullInterfaceDescription>
+ >
+ {
+ };
+
+#endif /* end #if !defined */
+}
+
+TAO_END_VERSIONED_NAMESPACE_DECL
+
+
+TAO_BEGIN_VERSIONED_NAMESPACE_DECL
+
+
+
+
+// TAO_IDL - Generated from
+// be\be_interface.cpp:1499
+
+class TAO_CORBA_Repository_Perfect_Hash_OpTable
+ : public TAO_Perfect_Hash_OpTable
+{
+private:
+ unsigned int hash (const char *str, unsigned int len);
+
+public:
+ const TAO_operation_db_entry * lookup (const char *str, unsigned int len);
+};
+
+/* C++ code produced by gperf version 2.8 (ACE version) */
+/* Command-line: C:\ACE\latest\ACE_wrappers\bin\gperf.exe -m -M -J -c -C -D -E -T -f 0 -F 0,0 -a -o -t -p -K opname -L C++ -Z TAO_CORBA_Repository_Perfect_Hash_OpTable -N lookup */
+unsigned int
+TAO_CORBA_Repository_Perfect_Hash_OpTable::hash (const char *str, unsigned int len)
+{
+ static const unsigned char asso_values[] =
+ {
+#if defined (ACE_MVS)
+ 58, 58, 58, 58, 58, 58, 58, 58, 58, 58,
+ 58, 58, 58, 58, 58, 58, 58, 58, 58, 58,
+ 58, 58, 58, 58, 58, 58, 58, 58, 58, 58,
+ 58, 58, 58, 58, 58, 58, 58, 58, 58, 58,
+ 58, 58, 58, 58, 58, 58, 58, 58, 58, 58,
+ 58, 58, 58, 58, 58, 58, 58, 58, 58, 58,
+ 58, 58, 58, 58, 58, 58, 58, 58, 58, 58,
+ 58, 58, 58, 58, 58, 58, 58, 58, 58, 58,
+ 58, 58, 58, 58, 58, 58, 58, 58, 58, 58,
+ 58, 58, 58, 58, 58, 58, 58, 58, 58, 58,
+ 58, 58, 58, 58, 58, 58, 58, 58, 58, 27,
+ 58, 58, 58, 58, 58, 58, 58, 58, 58, 58,
+ 58, 58, 58, 58, 58, 58, 58, 58, 58, 25,
+ 58, 0, 4, 10, 58, 20, 58, 58, 58, 58,
+ 58, 58, 58, 58, 58, 58, 58, 8, 25, 15,
+ 58, 0, 58, 58, 58, 58, 58, 58, 58, 58,
+ 58, 58, 30, 0, 58, 58, 58, 25, 0, 58,
+ 58, 58, 58, 58, 58, 58, 58, 58, 58, 58,
+ 58, 58, 58, 58, 58, 58, 58, 58, 58, 58,
+ 58, 58, 58, 58, 58, 58, 58, 58, 58, 58,
+ 58, 58, 58, 58, 58, 58, 58, 58, 58, 58,
+ 58, 58, 58, 58, 58, 58, 58, 58, 58, 58,
+ 58, 58, 58, 58, 58, 58, 58, 58, 58, 58,
+ 58, 58, 58, 58, 58, 58, 58, 58, 58, 58,
+ 58, 58, 58, 58, 58, 58, 58, 58, 58, 58,
+ 58, 58, 58, 58, 58, 58,
+#else
+ 58, 58, 58, 58, 58, 58, 58, 58, 58, 58,
+ 58, 58, 58, 58, 58, 58, 58, 58, 58, 58,
+ 58, 58, 58, 58, 58, 58, 58, 58, 58, 58,
+ 58, 58, 58, 58, 58, 58, 58, 58, 58, 58,
+ 58, 58, 58, 58, 58, 58, 58, 58, 58, 58,
+ 58, 58, 58, 58, 58, 58, 58, 58, 58, 58,
+ 58, 58, 58, 58, 58, 58, 58, 58, 58, 58,
+ 58, 58, 58, 58, 58, 58, 58, 58, 58, 58,
+ 58, 58, 58, 58, 58, 58, 58, 58, 58, 58,
+ 58, 58, 58, 58, 58, 27, 58, 25, 58, 0,
+ 4, 10, 58, 20, 58, 58, 58, 58, 8, 25,
+ 15, 58, 0, 58, 58, 30, 0, 58, 58, 58,
+ 25, 0, 58, 58, 58, 58, 58, 58,
+#endif /* ACE_MVS */
+ };
+ return len + asso_values[(int) str[len - 1]] + asso_values[(int) str[0]];
+}
+
+const TAO_operation_db_entry *
+TAO_CORBA_Repository_Perfect_Hash_OpTable::lookup (const char *str, unsigned int len)
+{
+ enum
+ {
+ TOTAL_KEYWORDS = 33,
+ MIN_WORD_LENGTH = 5,
+ MAX_WORD_LENGTH = 25,
+ MIN_HASH_VALUE = 11,
+ MAX_HASH_VALUE = 57,
+ HASH_VALUE_RANGE = 47,
+ DUPLICATES = 3,
+ WORDLIST_SIZE = 44
+ };
+
+ static const TAO_operation_db_entry wordlist[] =
+ {
+ {"",0,0},{"",0,0},{"",0,0},{"",0,0},{"",0,0},{"",0,0},{"",0,0},{"",0,0},{"",0,0},
+ {"",0,0},{"",0,0},
+ {"destroy", &POA_CORBA::Repository::destroy_skel, 0},
+ {"create_array", &POA_CORBA::Repository::create_array_skel, 0},
+ {"create_struct", &POA_CORBA::Repository::create_struct_skel, 0},
+ {"lookup", &POA_CORBA::Repository::lookup_skel, 0},
+ {"create_constant", &POA_CORBA::Repository::create_constant_skel, 0},
+ {"create_fixed", &POA_CORBA::Repository::create_fixed_skel, 0},
+ {"lookup_id", &POA_CORBA::Repository::lookup_id_skel, 0},
+ {"create_value", &POA_CORBA::Repository::create_value_skel, 0},
+ {"create_module", &POA_CORBA::Repository::create_module_skel, 0},
+ {"create_native", &POA_CORBA::Repository::create_native_skel, 0},
+ {"create_sequence", &POA_CORBA::Repository::create_sequence_skel, 0},
+ {"create_interface", &POA_CORBA::Repository::create_interface_skel, 0},
+ {"create_ext_value", &POA_CORBA::Repository::create_ext_value_skel, 0},
+ {"create_union", &POA_CORBA::Repository::create_union_skel, 0},
+ {"lookup_name", &POA_CORBA::Repository::lookup_name_skel, 0},
+ {"create_exception", &POA_CORBA::Repository::create_exception_skel, 0},
+ {"create_local_interface", &POA_CORBA::Repository::create_local_interface_skel, 0},
+ {"create_string", &POA_CORBA::Repository::create_string_skel, 0},
+ {"create_wstring", &POA_CORBA::Repository::create_wstring_skel, 0},
+ {"create_abstract_interface", &POA_CORBA::Repository::create_abstract_interface_skel, 0},
+ {"create_enum", &POA_CORBA::Repository::create_enum_skel, 0},
+ {"_component", &POA_CORBA::Repository::_component_skel, 0},
+ {"contents", &POA_CORBA::Repository::contents_skel, 0},
+ {"_non_existent", &POA_CORBA::Repository::_non_existent_skel, 0},
+ {"create_value_box", &POA_CORBA::Repository::create_value_box_skel, 0},
+ {"create_alias", &POA_CORBA::Repository::create_alias_skel, 0},
+ {"get_primitive", &POA_CORBA::Repository::get_primitive_skel, 0},
+ {"_get_def_kind", &POA_CORBA::Repository::_get_def_kind_skel, 0},
+ {"_repository_id", &POA_CORBA::Repository::_repository_id_skel, 0},
+ {"_interface", &POA_CORBA::Repository::_interface_skel, 0},
+ {"describe_contents", &POA_CORBA::Repository::describe_contents_skel, 0},
+ {"get_canonical_typecode", &POA_CORBA::Repository::get_canonical_typecode_skel, 0},
+ {"_is_a", &POA_CORBA::Repository::_is_a_skel, 0},
+ };
+
+ static const signed char lookup[] =
+ {
+ -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 11, 12, 13,
+ 14, 15, 16, -19, -2, -22, -2, 17, 18, -63, -1, 21, -64, 24,
+ -1, 25, -1, 26, 27, 28, 29, 30, 31, 32, 33, -1, 34, 35,
+ 36, 37, 38, 39, -1, 40, -1, -1, -1, 41, 42, -1, -1, -1,
+ -1, 43,
+ };
+
+ if (len <= MAX_WORD_LENGTH && len >= MIN_WORD_LENGTH)
+ {
+ unsigned int key = hash (str, len);
+
+ if (key <= MAX_HASH_VALUE && key >= MIN_HASH_VALUE)
+ {
+ int slot = lookup[key];
+
+ if (slot >= 0 && slot < WORDLIST_SIZE)
+ {
+ const char *s = wordlist[slot].opname;
+
+ if (*str == *s && !strncmp (str + 1, s + 1, len - 1))
+ return &wordlist[slot];
+ }
+ else if (slot < 0 && slot >= -MAX_HASH_VALUE)
+ return 0;
+ else
+ {
+ unsigned int offset = key + slot + (slot > 0 ? -MAX_HASH_VALUE : MAX_HASH_VALUE);
+ const TAO_operation_db_entry *base = &wordlist[-lookup[offset]];
+ const TAO_operation_db_entry *ptr = base + -lookup[offset + 1];
+
+ while (--ptr >= base)
+ if (*str == *ptr->opname && !strncmp (str + 1, ptr->opname + 1, len - 1))
+ return ptr;
+ }
+ }
+ }
+ return 0;
+}
+
+static TAO_CORBA_Repository_Perfect_Hash_OpTable tao_CORBA_Repository_optable;
+
+// TAO_IDL - Generated from
+// be\be_visitor_interface/interface_ss.cpp:966
+
+TAO::Collocation_Proxy_Broker *
+CORBA__TAO_Repository_Proxy_Broker_Factory_function ( ::CORBA::Object_ptr)
+{
+ return reinterpret_cast<TAO::Collocation_Proxy_Broker *> (0xdead); // Dummy
+}
+
+int
+CORBA__TAO_Repository_Proxy_Broker_Factory_Initializer (size_t)
+{
+ CORBA__TAO_Repository_Proxy_Broker_Factory_function_pointer =
+ CORBA__TAO_Repository_Proxy_Broker_Factory_function;
+
+ return 0;
+}
+
+static int
+CORBA__TAO_Repository_Proxy_Broker_Stub_Factory_Initializer_Scarecrow =
+ CORBA__TAO_Repository_Proxy_Broker_Factory_Initializer (
+ reinterpret_cast<size_t> (CORBA__TAO_Repository_Proxy_Broker_Factory_Initializer)
+ );
+
+// TAO_IDL - Generated from
+// be\be_visitor_interface/interface_ss.cpp:103
+
+POA_CORBA::Repository::Repository (void)
+ : TAO_ServantBase ()
+{
+ this->optable_ = &tao_CORBA_Repository_optable;
+}
+
+POA_CORBA::Repository::Repository (const Repository& rhs)
+ : TAO_Abstract_ServantBase (rhs),
+ TAO_ServantBase (rhs),
+ POA_CORBA::IRObject (rhs),
+ POA_CORBA::Container (rhs)
+{
+}
+
+POA_CORBA::Repository::~Repository (void)
+{
+}namespace POA_CORBA
+{
+
+
+ // TAO_IDL - Generated from
+ // be\be_visitor_operation/upcall_command_ss.cpp:127
+
+ class lookup_id_Repository
+ : public TAO::Upcall_Command
+ {
+ public:
+ inline lookup_id_Repository (
+ POA_CORBA::Repository * servant,
+ TAO_Operation_Details const * operation_details,
+ TAO::Argument * const args[])
+ : servant_ (servant)
+ , operation_details_ (operation_details)
+ , args_ (args)
+ {
+ }
+
+ virtual void execute (ACE_ENV_SINGLE_ARG_DECL)
+ {
+ TAO::SArg_Traits< ::CORBA::Contained>::ret_arg_type retval =
+ TAO::Portable_Server::get_ret_arg< ::CORBA::Contained> (
+ this->operation_details_,
+ this->args_);
+
+ TAO::SArg_Traits< ::CORBA::RepositoryId>::in_arg_type arg_1 =
+ TAO::Portable_Server::get_in_arg< ::CORBA::RepositoryId> (
+ this->operation_details_,
+ this->args_,
+ 1);
+
+ retval =
+ this->servant_->lookup_id (
+ arg_1
+ ACE_ENV_ARG_PARAMETER);
+ ACE_CHECK;
+ }
+
+ private:
+ POA_CORBA::Repository * const servant_;
+ TAO_Operation_Details const * const operation_details_;
+ TAO::Argument * const * const args_;
+ };
+}
+
+
+// TAO_IDL - Generated from
+// be\be_visitor_operation/operation_ss.cpp:190
+
+void POA_CORBA::Repository::lookup_id_skel (
+ TAO_ServerRequest & server_request,
+ void * TAO_INTERCEPTOR (servant_upcall),
+ void * servant
+ ACE_ENV_ARG_DECL
+ )
+{
+#if TAO_HAS_INTERCEPTORS == 1
+ static ::CORBA::TypeCode_ptr const * const exceptions = 0;
+ static ::CORBA::ULong const nexceptions = 0;
+#endif /* TAO_HAS_INTERCEPTORS */
+
+ TAO::SArg_Traits< ::CORBA::Contained>::ret_val retval;
+ TAO::SArg_Traits< ::CORBA::RepositoryId>::in_arg_val _tao_search_id;
+
+ TAO::Argument * const args[] =
+ {
+ &retval,
+ &_tao_search_id
+ };
+
+ static size_t const nargs = 2;
+
+ POA_CORBA::Repository * const impl =
+ static_cast<POA_CORBA::Repository *> (servant);
+
+ lookup_id_Repository command (
+ impl,
+ server_request.operation_details (),
+ args);
+
+ TAO::Upcall_Wrapper upcall_wrapper;
+ upcall_wrapper.upcall (server_request
+ , args
+ , nargs
+ , command
+#if TAO_HAS_INTERCEPTORS == 1
+ , servant_upcall
+ , exceptions
+ , nexceptions
+#endif /* TAO_HAS_INTERCEPTORS == 1 */
+ ACE_ENV_ARG_PARAMETER);
+ ACE_CHECK;
+}namespace POA_CORBA
+{
+
+
+ // TAO_IDL - Generated from
+ // be\be_visitor_operation/upcall_command_ss.cpp:127
+
+ class get_canonical_typecode_Repository
+ : public TAO::Upcall_Command
+ {
+ public:
+ inline get_canonical_typecode_Repository (
+ POA_CORBA::Repository * servant,
+ TAO_Operation_Details const * operation_details,
+ TAO::Argument * const args[])
+ : servant_ (servant)
+ , operation_details_ (operation_details)
+ , args_ (args)
+ {
+ }
+
+ virtual void execute (ACE_ENV_SINGLE_ARG_DECL)
+ {
+ TAO::SArg_Traits< ::CORBA::TypeCode>::ret_arg_type retval =
+ TAO::Portable_Server::get_ret_arg< ::CORBA::TypeCode> (
+ this->operation_details_,
+ this->args_);
+
+ TAO::SArg_Traits< ::CORBA::TypeCode>::in_arg_type arg_1 =
+ TAO::Portable_Server::get_in_arg< ::CORBA::TypeCode> (
+ this->operation_details_,
+ this->args_,
+ 1);
+
+ retval =
+ this->servant_->get_canonical_typecode (
+ arg_1
+ ACE_ENV_ARG_PARAMETER);
+ ACE_CHECK;
+ }
+
+ private:
+ POA_CORBA::Repository * const servant_;
+ TAO_Operation_Details const * const operation_details_;
+ TAO::Argument * const * const args_;
+ };
+}
+
+
+// TAO_IDL - Generated from
+// be\be_visitor_operation/operation_ss.cpp:190
+
+void POA_CORBA::Repository::get_canonical_typecode_skel (
+ TAO_ServerRequest & server_request,
+ void * TAO_INTERCEPTOR (servant_upcall),
+ void * servant
+ ACE_ENV_ARG_DECL
+ )
+{
+#if TAO_HAS_INTERCEPTORS == 1
+ static ::CORBA::TypeCode_ptr const * const exceptions = 0;
+ static ::CORBA::ULong const nexceptions = 0;
+#endif /* TAO_HAS_INTERCEPTORS */
+
+ TAO::SArg_Traits< ::CORBA::TypeCode>::ret_val retval;
+ TAO::SArg_Traits< ::CORBA::TypeCode>::in_arg_val _tao_tc;
+
+ TAO::Argument * const args[] =
+ {
+ &retval,
+ &_tao_tc
+ };
+
+ static size_t const nargs = 2;
+
+ POA_CORBA::Repository * const impl =
+ static_cast<POA_CORBA::Repository *> (servant);
+
+ get_canonical_typecode_Repository command (
+ impl,
+ server_request.operation_details (),
+ args);
+
+ TAO::Upcall_Wrapper upcall_wrapper;
+ upcall_wrapper.upcall (server_request
+ , args
+ , nargs
+ , command
+#if TAO_HAS_INTERCEPTORS == 1
+ , servant_upcall
+ , exceptions
+ , nexceptions
+#endif /* TAO_HAS_INTERCEPTORS == 1 */
+ ACE_ENV_ARG_PARAMETER);
+ ACE_CHECK;
+}namespace POA_CORBA
+{
+
+
+ // TAO_IDL - Generated from
+ // be\be_visitor_operation/upcall_command_ss.cpp:127
+
+ class get_primitive_Repository
+ : public TAO::Upcall_Command
+ {
+ public:
+ inline get_primitive_Repository (
+ POA_CORBA::Repository * servant,
+ TAO_Operation_Details const * operation_details,
+ TAO::Argument * const args[])
+ : servant_ (servant)
+ , operation_details_ (operation_details)
+ , args_ (args)
+ {
+ }
+
+ virtual void execute (ACE_ENV_SINGLE_ARG_DECL)
+ {
+ TAO::SArg_Traits< ::CORBA::PrimitiveDef>::ret_arg_type retval =
+ TAO::Portable_Server::get_ret_arg< ::CORBA::PrimitiveDef> (
+ this->operation_details_,
+ this->args_);
+
+ TAO::SArg_Traits< ::CORBA::PrimitiveKind>::in_arg_type arg_1 =
+ TAO::Portable_Server::get_in_arg< ::CORBA::PrimitiveKind> (
+ this->operation_details_,
+ this->args_,
+ 1);
+
+ retval =
+ this->servant_->get_primitive (
+ arg_1
+ ACE_ENV_ARG_PARAMETER);
+ ACE_CHECK;
+ }
+
+ private:
+ POA_CORBA::Repository * const servant_;
+ TAO_Operation_Details const * const operation_details_;
+ TAO::Argument * const * const args_;
+ };
+}
+
+
+// TAO_IDL - Generated from
+// be\be_visitor_operation/operation_ss.cpp:190
+
+void POA_CORBA::Repository::get_primitive_skel (
+ TAO_ServerRequest & server_request,
+ void * TAO_INTERCEPTOR (servant_upcall),
+ void * servant
+ ACE_ENV_ARG_DECL
+ )
+{
+#if TAO_HAS_INTERCEPTORS == 1
+ static ::CORBA::TypeCode_ptr const * const exceptions = 0;
+ static ::CORBA::ULong const nexceptions = 0;
+#endif /* TAO_HAS_INTERCEPTORS */
+
+ TAO::SArg_Traits< ::CORBA::PrimitiveDef>::ret_val retval;
+ TAO::SArg_Traits< ::CORBA::PrimitiveKind>::in_arg_val _tao_kind;
+
+ TAO::Argument * const args[] =
+ {
+ &retval,
+ &_tao_kind
+ };
+
+ static size_t const nargs = 2;
+
+ POA_CORBA::Repository * const impl =
+ static_cast<POA_CORBA::Repository *> (servant);
+
+ get_primitive_Repository command (
+ impl,
+ server_request.operation_details (),
+ args);
+
+ TAO::Upcall_Wrapper upcall_wrapper;
+ upcall_wrapper.upcall (server_request
+ , args
+ , nargs
+ , command
+#if TAO_HAS_INTERCEPTORS == 1
+ , servant_upcall
+ , exceptions
+ , nexceptions
+#endif /* TAO_HAS_INTERCEPTORS == 1 */
+ ACE_ENV_ARG_PARAMETER);
+ ACE_CHECK;
+}namespace POA_CORBA
+{
+
+
+ // TAO_IDL - Generated from
+ // be\be_visitor_operation/upcall_command_ss.cpp:127
+
+ class create_string_Repository
+ : public TAO::Upcall_Command
+ {
+ public:
+ inline create_string_Repository (
+ POA_CORBA::Repository * servant,
+ TAO_Operation_Details const * operation_details,
+ TAO::Argument * const args[])
+ : servant_ (servant)
+ , operation_details_ (operation_details)
+ , args_ (args)
+ {
+ }
+
+ virtual void execute (ACE_ENV_SINGLE_ARG_DECL)
+ {
+ TAO::SArg_Traits< ::CORBA::StringDef>::ret_arg_type retval =
+ TAO::Portable_Server::get_ret_arg< ::CORBA::StringDef> (
+ this->operation_details_,
+ this->args_);
+
+ TAO::SArg_Traits< ::CORBA::ULong>::in_arg_type arg_1 =
+ TAO::Portable_Server::get_in_arg< ::CORBA::ULong> (
+ this->operation_details_,
+ this->args_,
+ 1);
+
+ retval =
+ this->servant_->create_string (
+ arg_1
+ ACE_ENV_ARG_PARAMETER);
+ ACE_CHECK;
+ }
+
+ private:
+ POA_CORBA::Repository * const servant_;
+ TAO_Operation_Details const * const operation_details_;
+ TAO::Argument * const * const args_;
+ };
+}
+
+
+// TAO_IDL - Generated from
+// be\be_visitor_operation/operation_ss.cpp:190
+
+void POA_CORBA::Repository::create_string_skel (
+ TAO_ServerRequest & server_request,
+ void * TAO_INTERCEPTOR (servant_upcall),
+ void * servant
+ ACE_ENV_ARG_DECL
+ )
+{
+#if TAO_HAS_INTERCEPTORS == 1
+ static ::CORBA::TypeCode_ptr const * const exceptions = 0;
+ static ::CORBA::ULong const nexceptions = 0;
+#endif /* TAO_HAS_INTERCEPTORS */
+
+ TAO::SArg_Traits< ::CORBA::StringDef>::ret_val retval;
+ TAO::SArg_Traits< ::CORBA::ULong>::in_arg_val _tao_bound;
+
+ TAO::Argument * const args[] =
+ {
+ &retval,
+ &_tao_bound
+ };
+
+ static size_t const nargs = 2;
+
+ POA_CORBA::Repository * const impl =
+ static_cast<POA_CORBA::Repository *> (servant);
+
+ create_string_Repository command (
+ impl,
+ server_request.operation_details (),
+ args);
+
+ TAO::Upcall_Wrapper upcall_wrapper;
+ upcall_wrapper.upcall (server_request
+ , args
+ , nargs
+ , command
+#if TAO_HAS_INTERCEPTORS == 1
+ , servant_upcall
+ , exceptions
+ , nexceptions
+#endif /* TAO_HAS_INTERCEPTORS == 1 */
+ ACE_ENV_ARG_PARAMETER);
+ ACE_CHECK;
+}namespace POA_CORBA
+{
+
+
+ // TAO_IDL - Generated from
+ // be\be_visitor_operation/upcall_command_ss.cpp:127
+
+ class create_wstring_Repository
+ : public TAO::Upcall_Command
+ {
+ public:
+ inline create_wstring_Repository (
+ POA_CORBA::Repository * servant,
+ TAO_Operation_Details const * operation_details,
+ TAO::Argument * const args[])
+ : servant_ (servant)
+ , operation_details_ (operation_details)
+ , args_ (args)
+ {
+ }
+
+ virtual void execute (ACE_ENV_SINGLE_ARG_DECL)
+ {
+ TAO::SArg_Traits< ::CORBA::WstringDef>::ret_arg_type retval =
+ TAO::Portable_Server::get_ret_arg< ::CORBA::WstringDef> (
+ this->operation_details_,
+ this->args_);
+
+ TAO::SArg_Traits< ::CORBA::ULong>::in_arg_type arg_1 =
+ TAO::Portable_Server::get_in_arg< ::CORBA::ULong> (
+ this->operation_details_,
+ this->args_,
+ 1);
+
+ retval =
+ this->servant_->create_wstring (
+ arg_1
+ ACE_ENV_ARG_PARAMETER);
+ ACE_CHECK;
+ }
+
+ private:
+ POA_CORBA::Repository * const servant_;
+ TAO_Operation_Details const * const operation_details_;
+ TAO::Argument * const * const args_;
+ };
+}
+
+
+// TAO_IDL - Generated from
+// be\be_visitor_operation/operation_ss.cpp:190
+
+void POA_CORBA::Repository::create_wstring_skel (
+ TAO_ServerRequest & server_request,
+ void * TAO_INTERCEPTOR (servant_upcall),
+ void * servant
+ ACE_ENV_ARG_DECL
+ )
+{
+#if TAO_HAS_INTERCEPTORS == 1
+ static ::CORBA::TypeCode_ptr const * const exceptions = 0;
+ static ::CORBA::ULong const nexceptions = 0;
+#endif /* TAO_HAS_INTERCEPTORS */
+
+ TAO::SArg_Traits< ::CORBA::WstringDef>::ret_val retval;
+ TAO::SArg_Traits< ::CORBA::ULong>::in_arg_val _tao_bound;
+
+ TAO::Argument * const args[] =
+ {
+ &retval,
+ &_tao_bound
+ };
+
+ static size_t const nargs = 2;
+
+ POA_CORBA::Repository * const impl =
+ static_cast<POA_CORBA::Repository *> (servant);
+
+ create_wstring_Repository command (
+ impl,
+ server_request.operation_details (),
+ args);
+
+ TAO::Upcall_Wrapper upcall_wrapper;
+ upcall_wrapper.upcall (server_request
+ , args
+ , nargs
+ , command
+#if TAO_HAS_INTERCEPTORS == 1
+ , servant_upcall
+ , exceptions
+ , nexceptions
+#endif /* TAO_HAS_INTERCEPTORS == 1 */
+ ACE_ENV_ARG_PARAMETER);
+ ACE_CHECK;
+}namespace POA_CORBA
+{
+
+
+ // TAO_IDL - Generated from
+ // be\be_visitor_operation/upcall_command_ss.cpp:127
+
+ class create_sequence_Repository
+ : public TAO::Upcall_Command
+ {
+ public:
+ inline create_sequence_Repository (
+ POA_CORBA::Repository * servant,
+ TAO_Operation_Details const * operation_details,
+ TAO::Argument * const args[])
+ : servant_ (servant)
+ , operation_details_ (operation_details)
+ , args_ (args)
+ {
+ }
+
+ virtual void execute (ACE_ENV_SINGLE_ARG_DECL)
+ {
+ TAO::SArg_Traits< ::CORBA::SequenceDef>::ret_arg_type retval =
+ TAO::Portable_Server::get_ret_arg< ::CORBA::SequenceDef> (
+ this->operation_details_,
+ this->args_);
+
+ TAO::SArg_Traits< ::CORBA::ULong>::in_arg_type arg_1 =
+ TAO::Portable_Server::get_in_arg< ::CORBA::ULong> (
+ this->operation_details_,
+ this->args_,
+ 1);
+
+ TAO::SArg_Traits< ::CORBA::IDLType>::in_arg_type arg_2 =
+ TAO::Portable_Server::get_in_arg< ::CORBA::IDLType> (
+ this->operation_details_,
+ this->args_,
+ 2);
+
+ retval =
+ this->servant_->create_sequence (
+ arg_1
+ , arg_2
+ ACE_ENV_ARG_PARAMETER);
+ ACE_CHECK;
+ }
+
+ private:
+ POA_CORBA::Repository * const servant_;
+ TAO_Operation_Details const * const operation_details_;
+ TAO::Argument * const * const args_;
+ };
+}
+
+
+// TAO_IDL - Generated from
+// be\be_visitor_operation/operation_ss.cpp:190
+
+void POA_CORBA::Repository::create_sequence_skel (
+ TAO_ServerRequest & server_request,
+ void * TAO_INTERCEPTOR (servant_upcall),
+ void * servant
+ ACE_ENV_ARG_DECL
+ )
+{
+#if TAO_HAS_INTERCEPTORS == 1
+ static ::CORBA::TypeCode_ptr const * const exceptions = 0;
+ static ::CORBA::ULong const nexceptions = 0;
+#endif /* TAO_HAS_INTERCEPTORS */
+
+ TAO::SArg_Traits< ::CORBA::SequenceDef>::ret_val retval;
+ TAO::SArg_Traits< ::CORBA::ULong>::in_arg_val _tao_bound;
+ TAO::SArg_Traits< ::CORBA::IDLType>::in_arg_val _tao_element_type;
+
+ TAO::Argument * const args[] =
+ {
+ &retval,
+ &_tao_bound,
+ &_tao_element_type
+ };
+
+ static size_t const nargs = 3;
+
+ POA_CORBA::Repository * const impl =
+ static_cast<POA_CORBA::Repository *> (servant);
+
+ create_sequence_Repository command (
+ impl,
+ server_request.operation_details (),
+ args);
+
+ TAO::Upcall_Wrapper upcall_wrapper;
+ upcall_wrapper.upcall (server_request
+ , args
+ , nargs
+ , command
+#if TAO_HAS_INTERCEPTORS == 1
+ , servant_upcall
+ , exceptions
+ , nexceptions
+#endif /* TAO_HAS_INTERCEPTORS == 1 */
+ ACE_ENV_ARG_PARAMETER);
+ ACE_CHECK;
+}namespace POA_CORBA
+{
+
+
+ // TAO_IDL - Generated from
+ // be\be_visitor_operation/upcall_command_ss.cpp:127
+
+ class create_array_Repository
+ : public TAO::Upcall_Command
+ {
+ public:
+ inline create_array_Repository (
+ POA_CORBA::Repository * servant,
+ TAO_Operation_Details const * operation_details,
+ TAO::Argument * const args[])
+ : servant_ (servant)
+ , operation_details_ (operation_details)
+ , args_ (args)
+ {
+ }
+
+ virtual void execute (ACE_ENV_SINGLE_ARG_DECL)
+ {
+ TAO::SArg_Traits< ::CORBA::ArrayDef>::ret_arg_type retval =
+ TAO::Portable_Server::get_ret_arg< ::CORBA::ArrayDef> (
+ this->operation_details_,
+ this->args_);
+
+ TAO::SArg_Traits< ::CORBA::ULong>::in_arg_type arg_1 =
+ TAO::Portable_Server::get_in_arg< ::CORBA::ULong> (
+ this->operation_details_,
+ this->args_,
+ 1);
+
+ TAO::SArg_Traits< ::CORBA::IDLType>::in_arg_type arg_2 =
+ TAO::Portable_Server::get_in_arg< ::CORBA::IDLType> (
+ this->operation_details_,
+ this->args_,
+ 2);
+
+ retval =
+ this->servant_->create_array (
+ arg_1
+ , arg_2
+ ACE_ENV_ARG_PARAMETER);
+ ACE_CHECK;
+ }
+
+ private:
+ POA_CORBA::Repository * const servant_;
+ TAO_Operation_Details const * const operation_details_;
+ TAO::Argument * const * const args_;
+ };
+}
+
+
+// TAO_IDL - Generated from
+// be\be_visitor_operation/operation_ss.cpp:190
+
+void POA_CORBA::Repository::create_array_skel (
+ TAO_ServerRequest & server_request,
+ void * TAO_INTERCEPTOR (servant_upcall),
+ void * servant
+ ACE_ENV_ARG_DECL
+ )
+{
+#if TAO_HAS_INTERCEPTORS == 1
+ static ::CORBA::TypeCode_ptr const * const exceptions = 0;
+ static ::CORBA::ULong const nexceptions = 0;
+#endif /* TAO_HAS_INTERCEPTORS */
+
+ TAO::SArg_Traits< ::CORBA::ArrayDef>::ret_val retval;
+ TAO::SArg_Traits< ::CORBA::ULong>::in_arg_val _tao_length;
+ TAO::SArg_Traits< ::CORBA::IDLType>::in_arg_val _tao_element_type;
+
+ TAO::Argument * const args[] =
+ {
+ &retval,
+ &_tao_length,
+ &_tao_element_type
+ };
+
+ static size_t const nargs = 3;
+
+ POA_CORBA::Repository * const impl =
+ static_cast<POA_CORBA::Repository *> (servant);
+
+ create_array_Repository command (
+ impl,
+ server_request.operation_details (),
+ args);
+
+ TAO::Upcall_Wrapper upcall_wrapper;
+ upcall_wrapper.upcall (server_request
+ , args
+ , nargs
+ , command
+#if TAO_HAS_INTERCEPTORS == 1
+ , servant_upcall
+ , exceptions
+ , nexceptions
+#endif /* TAO_HAS_INTERCEPTORS == 1 */
+ ACE_ENV_ARG_PARAMETER);
+ ACE_CHECK;
+}namespace POA_CORBA
+{
+
+
+ // TAO_IDL - Generated from
+ // be\be_visitor_operation/upcall_command_ss.cpp:127
+
+ class create_fixed_Repository
+ : public TAO::Upcall_Command
+ {
+ public:
+ inline create_fixed_Repository (
+ POA_CORBA::Repository * servant,
+ TAO_Operation_Details const * operation_details,
+ TAO::Argument * const args[])
+ : servant_ (servant)
+ , operation_details_ (operation_details)
+ , args_ (args)
+ {
+ }
+
+ virtual void execute (ACE_ENV_SINGLE_ARG_DECL)
+ {
+ TAO::SArg_Traits< ::CORBA::FixedDef>::ret_arg_type retval =
+ TAO::Portable_Server::get_ret_arg< ::CORBA::FixedDef> (
+ this->operation_details_,
+ this->args_);
+
+ TAO::SArg_Traits< ::CORBA::UShort>::in_arg_type arg_1 =
+ TAO::Portable_Server::get_in_arg< ::CORBA::UShort> (
+ this->operation_details_,
+ this->args_,
+ 1);
+
+ TAO::SArg_Traits< ::CORBA::Short>::in_arg_type arg_2 =
+ TAO::Portable_Server::get_in_arg< ::CORBA::Short> (
+ this->operation_details_,
+ this->args_,
+ 2);
+
+ retval =
+ this->servant_->create_fixed (
+ arg_1
+ , arg_2
+ ACE_ENV_ARG_PARAMETER);
+ ACE_CHECK;
+ }
+
+ private:
+ POA_CORBA::Repository * const servant_;
+ TAO_Operation_Details const * const operation_details_;
+ TAO::Argument * const * const args_;
+ };
+}
+
+
+// TAO_IDL - Generated from
+// be\be_visitor_operation/operation_ss.cpp:190
+
+void POA_CORBA::Repository::create_fixed_skel (
+ TAO_ServerRequest & server_request,
+ void * TAO_INTERCEPTOR (servant_upcall),
+ void * servant
+ ACE_ENV_ARG_DECL
+ )
+{
+#if TAO_HAS_INTERCEPTORS == 1
+ static ::CORBA::TypeCode_ptr const * const exceptions = 0;
+ static ::CORBA::ULong const nexceptions = 0;
+#endif /* TAO_HAS_INTERCEPTORS */
+
+ TAO::SArg_Traits< ::CORBA::FixedDef>::ret_val retval;
+ TAO::SArg_Traits< ::CORBA::UShort>::in_arg_val _tao_digits;
+ TAO::SArg_Traits< ::CORBA::Short>::in_arg_val _tao_scale;
+
+ TAO::Argument * const args[] =
+ {
+ &retval,
+ &_tao_digits,
+ &_tao_scale
+ };
+
+ static size_t const nargs = 3;
+
+ POA_CORBA::Repository * const impl =
+ static_cast<POA_CORBA::Repository *> (servant);
+
+ create_fixed_Repository command (
+ impl,
+ server_request.operation_details (),
+ args);
+
+ TAO::Upcall_Wrapper upcall_wrapper;
+ upcall_wrapper.upcall (server_request
+ , args
+ , nargs
+ , command
+#if TAO_HAS_INTERCEPTORS == 1
+ , servant_upcall
+ , exceptions
+ , nexceptions
+#endif /* TAO_HAS_INTERCEPTORS == 1 */
+ ACE_ENV_ARG_PARAMETER);
+ ACE_CHECK;
+}
+
+// TAO_IDL - Generated from
+// be\be_visitor_interface/interface_ss.cpp:169
+
+namespace POA_CORBA
+{
+
+
+ // TAO_IDL - Generated from
+ // be\be_visitor_operation/upcall_command_ss.cpp:127
+
+ class _is_a_Repository_Upcall_Command
+ : public TAO::Upcall_Command
+ {
+ public:
+ inline _is_a_Repository_Upcall_Command (
+ POA_CORBA::Repository * servant,
+ TAO_Operation_Details const * operation_details,
+ TAO::Argument * const args[])
+ : servant_ (servant)
+ , operation_details_ (operation_details)
+ , args_ (args)
+ {
+ }
+
+ virtual void execute (ACE_ENV_SINGLE_ARG_DECL)
+ {
+ TAO::SArg_Traits< ::ACE_InputCDR::to_boolean>::ret_arg_type retval =
+ TAO::Portable_Server::get_ret_arg< ::ACE_InputCDR::to_boolean> (
+ this->operation_details_,
+ this->args_);
+
+ TAO::SArg_Traits< ::CORBA::Char *>::in_arg_type arg_1 =
+ TAO::Portable_Server::get_in_arg< ::CORBA::Char *> (
+ this->operation_details_,
+ this->args_,
+ 1);
+
+ retval =
+ this->servant_-> _is_a (
+ arg_1
+ ACE_ENV_ARG_PARAMETER);
+ ACE_CHECK;
+ }
+
+ private:
+ POA_CORBA::Repository * const servant_;
+ TAO_Operation_Details const * const operation_details_;
+ TAO::Argument * const * const args_;
+ };
+}
+
+
+void POA_CORBA::Repository::_is_a_skel (
+ TAO_ServerRequest & server_request,
+ void * TAO_INTERCEPTOR (servant_upcall),
+ void * servant
+ ACE_ENV_ARG_DECL
+ )
+{
+#if TAO_HAS_INTERCEPTORS == 1
+ static ::CORBA::TypeCode_ptr const * const exceptions = 0;
+ static ::CORBA::ULong const nexceptions = 0;
+#endif /* TAO_HAS_INTERCEPTORS */
+
+ TAO::SArg_Traits< ::ACE_InputCDR::to_boolean>::ret_val retval;
+ TAO::SArg_Traits< ::CORBA::Char *>::in_arg_val _tao_repository_id;
+
+ TAO::Argument * const args[] =
+ {
+ &retval,
+ &_tao_repository_id
+ };
+
+ static size_t const nargs = 2;
+
+ POA_CORBA::Repository * const impl =
+ static_cast<POA_CORBA::Repository *> (servant);
+
+ _is_a_Repository_Upcall_Command command (
+ impl,
+ server_request.operation_details (),
+ args);
+
+ TAO::Upcall_Wrapper upcall_wrapper;
+ upcall_wrapper.upcall (server_request
+ , args
+ , nargs
+ , command
+#if TAO_HAS_INTERCEPTORS == 1
+ , servant_upcall
+ , exceptions
+ , nexceptions
+#endif /* TAO_HAS_INTERCEPTORS == 1 */
+ ACE_ENV_ARG_PARAMETER);
+ ACE_CHECK;
+}namespace POA_CORBA
+{
+
+
+ // TAO_IDL - Generated from
+ // be\be_visitor_operation/upcall_command_ss.cpp:127
+
+ class _non_existent_Repository_Upcall_Command
+ : public TAO::Upcall_Command
+ {
+ public:
+ inline _non_existent_Repository_Upcall_Command (
+ POA_CORBA::Repository * servant,
+ TAO_Operation_Details const * operation_details,
+ TAO::Argument * const args[])
+ : servant_ (servant)
+ , operation_details_ (operation_details)
+ , args_ (args)
+ {
+ }
+
+ virtual void execute (ACE_ENV_SINGLE_ARG_DECL)
+ {
+ TAO::SArg_Traits< ::ACE_InputCDR::to_boolean>::ret_arg_type retval =
+ TAO::Portable_Server::get_ret_arg< ::ACE_InputCDR::to_boolean> (
+ this->operation_details_,
+ this->args_);
+
+ retval =
+ this->servant_-> _non_existent (
+ ACE_ENV_SINGLE_ARG_PARAMETER);
+ ACE_CHECK;
+ }
+
+ private:
+ POA_CORBA::Repository * const servant_;
+ TAO_Operation_Details const * const operation_details_;
+ TAO::Argument * const * const args_;
+ };
+}
+
+
+void POA_CORBA::Repository::_non_existent_skel (
+ TAO_ServerRequest & server_request,
+ void * TAO_INTERCEPTOR (servant_upcall),
+ void * servant
+ ACE_ENV_ARG_DECL
+ )
+{
+#if TAO_HAS_INTERCEPTORS == 1
+ static ::CORBA::TypeCode_ptr const * const exceptions = 0;
+ static ::CORBA::ULong const nexceptions = 0;
+#endif /* TAO_HAS_INTERCEPTORS */
+
+ TAO::SArg_Traits< ::ACE_InputCDR::to_boolean>::ret_val retval;
+
+ TAO::Argument * const args[] =
+ {
+ &retval
+ };
+
+ static size_t const nargs = 1;
+
+ POA_CORBA::Repository * const impl =
+ static_cast<POA_CORBA::Repository *> (servant);
+
+ _non_existent_Repository_Upcall_Command command (
+ impl,
+ server_request.operation_details (),
+ args);
+
+ TAO::Upcall_Wrapper upcall_wrapper;
+ upcall_wrapper.upcall (server_request
+ , args
+ , nargs
+ , command
+#if TAO_HAS_INTERCEPTORS == 1
+ , servant_upcall
+ , exceptions
+ , nexceptions
+#endif /* TAO_HAS_INTERCEPTORS == 1 */
+ ACE_ENV_ARG_PARAMETER);
+ ACE_CHECK;
+}namespace POA_CORBA
+{
+
+
+ // TAO_IDL - Generated from
+ // be\be_visitor_operation/upcall_command_ss.cpp:127
+
+ class _repository_id_Repository_Upcall_Command
+ : public TAO::Upcall_Command
+ {
+ public:
+ inline _repository_id_Repository_Upcall_Command (
+ POA_CORBA::Repository * servant,
+ TAO_Operation_Details const * operation_details,
+ TAO::Argument * const args[])
+ : servant_ (servant)
+ , operation_details_ (operation_details)
+ , args_ (args)
+ {
+ }
+
+ virtual void execute (ACE_ENV_SINGLE_ARG_DECL)
+ {
+ TAO::SArg_Traits< ::CORBA::Char *>::ret_arg_type retval =
+ TAO::Portable_Server::get_ret_arg< ::CORBA::Char *> (
+ this->operation_details_,
+ this->args_);
+
+ retval =
+ this->servant_-> _repository_id (
+ ACE_ENV_SINGLE_ARG_PARAMETER);
+ ACE_CHECK;
+ }
+
+ private:
+ POA_CORBA::Repository * const servant_;
+ TAO_Operation_Details const * const operation_details_;
+ TAO::Argument * const * const args_;
+ };
+}
+
+
+void POA_CORBA::Repository::_repository_id_skel (
+ TAO_ServerRequest & server_request,
+ void * TAO_INTERCEPTOR (servant_upcall),
+ void * servant
+ ACE_ENV_ARG_DECL
+ )
+{
+#if TAO_HAS_INTERCEPTORS == 1
+ static ::CORBA::TypeCode_ptr const * const exceptions = 0;
+ static ::CORBA::ULong const nexceptions = 0;
+#endif /* TAO_HAS_INTERCEPTORS */
+
+ TAO::SArg_Traits< ::CORBA::Char *>::ret_val retval;
+
+ TAO::Argument * const args[] =
+ {
+ &retval
+ };
+
+ static size_t const nargs = 1;
+
+ POA_CORBA::Repository * const impl =
+ static_cast<POA_CORBA::Repository *> (servant);
+
+ _repository_id_Repository_Upcall_Command command (
+ impl,
+ server_request.operation_details (),
+ args);
+
+ TAO::Upcall_Wrapper upcall_wrapper;
+ upcall_wrapper.upcall (server_request
+ , args
+ , nargs
+ , command
+#if TAO_HAS_INTERCEPTORS == 1
+ , servant_upcall
+ , exceptions
+ , nexceptions
+#endif /* TAO_HAS_INTERCEPTORS == 1 */
+ ACE_ENV_ARG_PARAMETER);
+ ACE_CHECK;
+}
+
+// TAO_IDL - Generated from
+// be\be_visitor_interface/interface_ss.cpp:513
+
+void POA_CORBA::Repository::_interface_skel (
+ TAO_ServerRequest & server_request,
+ void * /* servant_upcall */,
+ void * servant
+ ACE_ENV_ARG_DECL
+ )
+{
+ TAO_IFR_Client_Adapter *_tao_adapter =
+ ACE_Dynamic_Service<TAO_IFR_Client_Adapter>::instance (
+ TAO_ORB_Core::ifr_client_adapter_name ()
+ );
+
+ if (_tao_adapter == 0)
+ {
+ ACE_THROW ( ::CORBA::INTF_REPOS ( ::CORBA::OMGVMCID | 1,
+ ::CORBA::COMPLETED_NO));
+ }
+
+ POA_CORBA::Repository * const impl =
+ static_cast<POA_CORBA::Repository *> (servant);
+ ::CORBA::InterfaceDef_ptr _tao_retval =
+ impl->_get_interface (ACE_ENV_SINGLE_ARG_PARAMETER);
+ ACE_CHECK;
+
+ server_request.init_reply ();
+ TAO_OutputCDR &_tao_out = *server_request.outgoing ();
+
+ ::CORBA::Boolean const _tao_result =
+ _tao_adapter->interfacedef_cdr_insert (
+ _tao_out,
+ _tao_retval
+ );
+
+ _tao_adapter->dispose (_tao_retval);
+
+ if (_tao_result == false)
+ {
+ ACE_THROW ( ::CORBA::MARSHAL ());
+ }
+}namespace POA_CORBA
+{
+
+
+ // TAO_IDL - Generated from
+ // be\be_visitor_operation/upcall_command_ss.cpp:127
+
+ class _get_component_Repository_Upcall_Command
+ : public TAO::Upcall_Command
+ {
+ public:
+ inline _get_component_Repository_Upcall_Command (
+ POA_CORBA::Repository * servant,
+ TAO_Operation_Details const * operation_details,
+ TAO::Argument * const args[])
+ : servant_ (servant)
+ , operation_details_ (operation_details)
+ , args_ (args)
+ {
+ }
+
+ virtual void execute (ACE_ENV_SINGLE_ARG_DECL)
+ {
+ TAO::SArg_Traits< ::CORBA::Object>::ret_arg_type retval =
+ TAO::Portable_Server::get_ret_arg< ::CORBA::Object> (
+ this->operation_details_,
+ this->args_);
+
+ retval =
+ this->servant_-> _get_component (
+ ACE_ENV_SINGLE_ARG_PARAMETER);
+ ACE_CHECK;
+ }
+
+ private:
+ POA_CORBA::Repository * const servant_;
+ TAO_Operation_Details const * const operation_details_;
+ TAO::Argument * const * const args_;
+ };
+}
+
+
+void POA_CORBA::Repository::_component_skel (
+ TAO_ServerRequest & server_request,
+ void * TAO_INTERCEPTOR (servant_upcall),
+ void * servant
+ ACE_ENV_ARG_DECL
+ )
+{
+#if TAO_HAS_INTERCEPTORS == 1
+ static ::CORBA::TypeCode_ptr const * const exceptions = 0;
+ static ::CORBA::ULong const nexceptions = 0;
+#endif /* TAO_HAS_INTERCEPTORS */
+
+ TAO::SArg_Traits< ::CORBA::Object>::ret_val retval;
+
+ TAO::Argument * const args[] =
+ {
+ &retval
+ };
+
+ static size_t const nargs = 1;
+
+ POA_CORBA::Repository * const impl =
+ static_cast<POA_CORBA::Repository *> (servant);
+
+ _get_component_Repository_Upcall_Command command (
+ impl,
+ server_request.operation_details (),
+ args);
+
+ TAO::Upcall_Wrapper upcall_wrapper;
+ upcall_wrapper.upcall (server_request
+ , args
+ , nargs
+ , command
+#if TAO_HAS_INTERCEPTORS == 1
+ , servant_upcall
+ , exceptions
+ , nexceptions
+#endif /* TAO_HAS_INTERCEPTORS == 1 */
+ ACE_ENV_ARG_PARAMETER);
+ ACE_CHECK;
+}
+
+::CORBA::Boolean POA_CORBA::Repository::_is_a (
+ const char* value
+ ACE_ENV_ARG_DECL_NOT_USED
+ )
+{
+ return
+ (
+ !ACE_OS::strcmp (
+ value,
+ "IDL:omg.org/CORBA/IRObject:1.0"
+ ) ||
+ !ACE_OS::strcmp (
+ value,
+ "IDL:omg.org/CORBA/Container:1.0"
+ ) ||
+ !ACE_OS::strcmp (
+ value,
+ "IDL:omg.org/CORBA/Repository:1.0"
+ ) ||
+ !ACE_OS::strcmp (
+ value,
+ "IDL:omg.org/CORBA/Object:1.0"
+ )
+ );
+}
+
+const char* POA_CORBA::Repository::_interface_repository_id (void) const
+{
+ return "IDL:omg.org/CORBA/Repository:1.0";
+}
+
+// TAO_IDL - Generated from
+// be\be_visitor_interface/interface_ss.cpp:903
+
+void POA_CORBA::Repository::_dispatch (
+ TAO_ServerRequest & req,
+ void * servant_upcall
+ ACE_ENV_ARG_DECL
+ )
+{
+ this->synchronous_upcall_dispatch (req,
+ servant_upcall,
+ this
+ ACE_ENV_ARG_PARAMETER);
+}
+
+// TAO_IDL - Generated from
+// be\be_visitor_interface/interface_ss.cpp:851
+
+CORBA::Repository *
+POA_CORBA::Repository::_this (ACE_ENV_SINGLE_ARG_DECL)
+{
+ TAO_Stub *stub = this->_create_stub (ACE_ENV_SINGLE_ARG_PARAMETER);
+ ACE_CHECK_RETURN (0);
+
+ TAO_Stub_Auto_Ptr safe_stub (stub);
+ ::CORBA::Object_ptr tmp = CORBA::Object::_nil ();
+
+ ::CORBA::Boolean const _tao_opt_colloc =
+ stub->servant_orb_var ()->orb_core ()->optimize_collocation_objects ();
+
+ ACE_NEW_RETURN (
+ tmp,
+ ::CORBA::Object (stub, _tao_opt_colloc, this),
+ 0
+ );
+
+ ::CORBA::Object_var obj = tmp;
+ (void) safe_stub.release ();
+
+ typedef ::CORBA::Repository STUB_SCOPED_NAME;
+ return
+ TAO::Narrow_Utils<STUB_SCOPED_NAME>::unchecked_narrow (
+ obj.in (),
+ CORBA__TAO_Repository_Proxy_Broker_Factory_function_pointer
+ );
+}
+
+// TAO_IDL - Generated from
+// be\be_interface.cpp:1499
+
+class TAO_CORBA_ModuleDef_Perfect_Hash_OpTable
+ : public TAO_Perfect_Hash_OpTable
+{
+private:
+ unsigned int hash (const char *str, unsigned int len);
+
+public:
+ const TAO_operation_db_entry * lookup (const char *str, unsigned int len);
+};
+
+/* C++ code produced by gperf version 2.8 (ACE version) */
+/* Command-line: C:\ACE\latest\ACE_wrappers\bin\gperf.exe -m -M -J -c -C -D -E -T -f 0 -F 0,0 -a -o -t -p -K opname -L C++ -Z TAO_CORBA_ModuleDef_Perfect_Hash_OpTable -N lookup */
+unsigned int
+TAO_CORBA_ModuleDef_Perfect_Hash_OpTable::hash (const char *str, unsigned int len)
+{
+ static const unsigned char asso_values[] =
+ {
+#if defined (ACE_MVS)
+ 64, 64, 64, 64, 64, 64, 64, 64, 64, 64,
+ 64, 64, 64, 64, 64, 64, 64, 64, 64, 64,
+ 64, 64, 64, 64, 64, 64, 64, 64, 64, 64,
+ 64, 64, 64, 64, 64, 64, 64, 64, 64, 64,
+ 64, 64, 64, 64, 64, 64, 64, 64, 64, 64,
+ 64, 64, 64, 64, 64, 64, 64, 64, 64, 64,
+ 64, 64, 64, 64, 64, 64, 64, 64, 64, 64,
+ 64, 64, 64, 64, 64, 64, 64, 64, 64, 64,
+ 64, 64, 64, 64, 64, 64, 64, 64, 64, 64,
+ 64, 64, 64, 64, 64, 64, 64, 64, 64, 64,
+ 64, 64, 64, 64, 64, 64, 64, 64, 64, 20,
+ 64, 64, 64, 64, 64, 64, 64, 64, 64, 64,
+ 64, 64, 64, 64, 64, 64, 64, 64, 64, 10,
+ 64, 0, 20, 0, 64, 64, 64, 64, 64, 64,
+ 64, 64, 64, 64, 64, 64, 64, 20, 0, 5,
+ 64, 10, 64, 64, 64, 64, 64, 64, 64, 64,
+ 64, 64, 15, 30, 64, 64, 64, 10, 5, 64,
+ 64, 64, 64, 64, 64, 64, 64, 64, 64, 64,
+ 64, 64, 64, 64, 64, 64, 64, 64, 64, 64,
+ 64, 64, 64, 64, 64, 64, 64, 64, 64, 64,
+ 64, 64, 64, 64, 64, 64, 64, 64, 64, 64,
+ 64, 64, 64, 64, 64, 64, 64, 64, 64, 64,
+ 64, 64, 64, 64, 64, 64, 64, 64, 64, 64,
+ 64, 64, 64, 64, 64, 64, 64, 64, 64, 64,
+ 64, 64, 64, 64, 64, 64, 64, 64, 64, 64,
+ 64, 64, 64, 64, 64, 64,
+#else
+ 64, 64, 64, 64, 64, 64, 64, 64, 64, 64,
+ 64, 64, 64, 64, 64, 64, 64, 64, 64, 64,
+ 64, 64, 64, 64, 64, 64, 64, 64, 64, 64,
+ 64, 64, 64, 64, 64, 64, 64, 64, 64, 64,
+ 64, 64, 64, 64, 64, 64, 64, 64, 64, 64,
+ 64, 64, 64, 64, 64, 64, 64, 64, 64, 64,
+ 64, 64, 64, 64, 64, 64, 64, 64, 64, 64,
+ 64, 64, 64, 64, 64, 64, 64, 64, 64, 64,
+ 64, 64, 64, 64, 64, 64, 64, 64, 64, 64,
+ 64, 64, 64, 64, 64, 20, 64, 10, 64, 0,
+ 20, 0, 64, 64, 64, 64, 64, 64, 20, 0,
+ 5, 64, 10, 64, 64, 15, 30, 64, 64, 64,
+ 10, 5, 64, 64, 64, 64, 64, 64,
+#endif /* ACE_MVS */
+ };
+ return len + asso_values[(int) str[len - 1]] + asso_values[(int) str[0]];
+}
+
+const TAO_operation_db_entry *
+TAO_CORBA_ModuleDef_Perfect_Hash_OpTable::lookup (const char *str, unsigned int len)
+{
+ enum
+ {
+ TOTAL_KEYWORDS = 36,
+ MIN_WORD_LENGTH = 4,
+ MAX_WORD_LENGTH = 26,
+ MIN_HASH_VALUE = 4,
+ MAX_HASH_VALUE = 63,
+ HASH_VALUE_RANGE = 60,
+ DUPLICATES = 6,
+ WORDLIST_SIZE = 40
+ };
+
+ static const TAO_operation_db_entry wordlist[] =
+ {
+ {"",0,0},{"",0,0},{"",0,0},{"",0,0},
+ {"move", &POA_CORBA::ModuleDef::move_skel, 0},
+ {"create_enum", &POA_CORBA::ModuleDef::create_enum_skel, 0},
+ {"create_value", &POA_CORBA::ModuleDef::create_value_skel, 0},
+ {"create_module", &POA_CORBA::ModuleDef::create_module_skel, 0},
+ {"create_native", &POA_CORBA::ModuleDef::create_native_skel, 0},
+ {"create_interface", &POA_CORBA::ModuleDef::create_interface_skel, 0},
+ {"create_ext_value", &POA_CORBA::ModuleDef::create_ext_value_skel, 0},
+ {"create_union", &POA_CORBA::ModuleDef::create_union_skel, 0},
+ {"create_exception", &POA_CORBA::ModuleDef::create_exception_skel, 0},
+ {"create_local_interface", &POA_CORBA::ModuleDef::create_local_interface_skel, 0},
+ {"contents", &POA_CORBA::ModuleDef::contents_skel, 0},
+ {"create_abstract_interface", &POA_CORBA::ModuleDef::create_abstract_interface_skel, 0},
+ {"create_value_box", &POA_CORBA::ModuleDef::create_value_box_skel, 0},
+ {"create_alias", &POA_CORBA::ModuleDef::create_alias_skel, 0},
+ {"describe", &POA_CORBA::ModuleDef::describe_skel, 0},
+ {"_get_name", &POA_CORBA::ModuleDef::_get_name_skel, 0},
+ {"_set_name", &POA_CORBA::ModuleDef::_set_name_skel, 0},
+ {"_interface", &POA_CORBA::ModuleDef::_interface_skel, 0},
+ {"lookup_name", &POA_CORBA::ModuleDef::lookup_name_skel, 0},
+ {"destroy", &POA_CORBA::ModuleDef::destroy_skel, 0},
+ {"_is_a", &POA_CORBA::ModuleDef::_is_a_skel, 0},
+ {"lookup", &POA_CORBA::ModuleDef::lookup_skel, 0},
+ {"_get_version", &POA_CORBA::ModuleDef::_get_version_skel, 0},
+ {"_set_version", &POA_CORBA::ModuleDef::_set_version_skel, 0},
+ {"_get_absolute_name", &POA_CORBA::ModuleDef::_get_absolute_name_skel, 0},
+ {"_get_defined_in", &POA_CORBA::ModuleDef::_get_defined_in_skel, 0},
+ {"create_struct", &POA_CORBA::ModuleDef::create_struct_skel, 0},
+ {"create_constant", &POA_CORBA::ModuleDef::create_constant_skel, 0},
+ {"_get_id", &POA_CORBA::ModuleDef::_get_id_skel, 0},
+ {"_set_id", &POA_CORBA::ModuleDef::_set_id_skel, 0},
+ {"_get_containing_repository", &POA_CORBA::ModuleDef::_get_containing_repository_skel, 0},
+ {"describe_contents", &POA_CORBA::ModuleDef::describe_contents_skel, 0},
+ {"_get_def_kind", &POA_CORBA::ModuleDef::_get_def_kind_skel, 0},
+ {"_repository_id", &POA_CORBA::ModuleDef::_repository_id_skel, 0},
+ {"_component", &POA_CORBA::ModuleDef::_component_skel, 0},
+ {"_non_existent", &POA_CORBA::ModuleDef::_non_existent_skel, 0},
+ };
+
+ static const signed char lookup[] =
+ {
+ -1, -1, -1, -1, 4, -1, -1, -1, -1, -7, -2, 5, 6, -67,
+ -9, -2, -65, 11, -1, -19, -2, 12, 13, 14, -1, 15, 16, 17,
+ 18, -73, 21, 22, 23, -26, -2, 24, 25, -67, 28, -1, 29, -32,
+ -2, 30, -1, 31, -1, -69, -1, -1, -1, 34, 35, 36, 37, -1,
+ -1, -1, -1, -1, 38, -1, -1, 39,
+ };
+
+ if (len <= MAX_WORD_LENGTH && len >= MIN_WORD_LENGTH)
+ {
+ unsigned int key = hash (str, len);
+
+ if (key <= MAX_HASH_VALUE && key >= MIN_HASH_VALUE)
+ {
+ int slot = lookup[key];
+
+ if (slot >= 0 && slot < WORDLIST_SIZE)
+ {
+ const char *s = wordlist[slot].opname;
+
+ if (*str == *s && !strncmp (str + 1, s + 1, len - 1))
+ return &wordlist[slot];
+ }
+ else if (slot < 0 && slot >= -MAX_HASH_VALUE)
+ return 0;
+ else
+ {
+ unsigned int offset = key + slot + (slot > 0 ? -MAX_HASH_VALUE : MAX_HASH_VALUE);
+ const TAO_operation_db_entry *base = &wordlist[-lookup[offset]];
+ const TAO_operation_db_entry *ptr = base + -lookup[offset + 1];
+
+ while (--ptr >= base)
+ if (*str == *ptr->opname && !strncmp (str + 1, ptr->opname + 1, len - 1))
+ return ptr;
+ }
+ }
+ }
+ return 0;
+}
+
+static TAO_CORBA_ModuleDef_Perfect_Hash_OpTable tao_CORBA_ModuleDef_optable;
+
+// TAO_IDL - Generated from
+// be\be_visitor_interface/interface_ss.cpp:966
+
+TAO::Collocation_Proxy_Broker *
+CORBA__TAO_ModuleDef_Proxy_Broker_Factory_function ( ::CORBA::Object_ptr)
+{
+ return reinterpret_cast<TAO::Collocation_Proxy_Broker *> (0xdead); // Dummy
+}
+
+int
+CORBA__TAO_ModuleDef_Proxy_Broker_Factory_Initializer (size_t)
+{
+ CORBA__TAO_ModuleDef_Proxy_Broker_Factory_function_pointer =
+ CORBA__TAO_ModuleDef_Proxy_Broker_Factory_function;
+
+ return 0;
+}
+
+static int
+CORBA__TAO_ModuleDef_Proxy_Broker_Stub_Factory_Initializer_Scarecrow =
+ CORBA__TAO_ModuleDef_Proxy_Broker_Factory_Initializer (
+ reinterpret_cast<size_t> (CORBA__TAO_ModuleDef_Proxy_Broker_Factory_Initializer)
+ );
+
+// TAO_IDL - Generated from
+// be\be_visitor_interface/interface_ss.cpp:103
+
+POA_CORBA::ModuleDef::ModuleDef (void)
+ : TAO_ServantBase ()
+{
+ this->optable_ = &tao_CORBA_ModuleDef_optable;
+}
+
+POA_CORBA::ModuleDef::ModuleDef (const ModuleDef& rhs)
+ : TAO_Abstract_ServantBase (rhs),
+ TAO_ServantBase (rhs),
+ POA_CORBA::IRObject (rhs),
+ POA_CORBA::Container (rhs),
+ POA_CORBA::Contained (rhs)
+{
+}
+
+POA_CORBA::ModuleDef::~ModuleDef (void)
+{
+}
+
+// TAO_IDL - Generated from
+// be\be_visitor_interface/interface_ss.cpp:169
+
+namespace POA_CORBA
+{
+
+
+ // TAO_IDL - Generated from
+ // be\be_visitor_operation/upcall_command_ss.cpp:127
+
+ class _is_a_ModuleDef_Upcall_Command
+ : public TAO::Upcall_Command
+ {
+ public:
+ inline _is_a_ModuleDef_Upcall_Command (
+ POA_CORBA::ModuleDef * servant,
+ TAO_Operation_Details const * operation_details,
+ TAO::Argument * const args[])
+ : servant_ (servant)
+ , operation_details_ (operation_details)
+ , args_ (args)
+ {
+ }
+
+ virtual void execute (ACE_ENV_SINGLE_ARG_DECL)
+ {
+ TAO::SArg_Traits< ::ACE_InputCDR::to_boolean>::ret_arg_type retval =
+ TAO::Portable_Server::get_ret_arg< ::ACE_InputCDR::to_boolean> (
+ this->operation_details_,
+ this->args_);
+
+ TAO::SArg_Traits< ::CORBA::Char *>::in_arg_type arg_1 =
+ TAO::Portable_Server::get_in_arg< ::CORBA::Char *> (
+ this->operation_details_,
+ this->args_,
+ 1);
+
+ retval =
+ this->servant_-> _is_a (
+ arg_1
+ ACE_ENV_ARG_PARAMETER);
+ ACE_CHECK;
+ }
+
+ private:
+ POA_CORBA::ModuleDef * const servant_;
+ TAO_Operation_Details const * const operation_details_;
+ TAO::Argument * const * const args_;
+ };
+}
+
+
+void POA_CORBA::ModuleDef::_is_a_skel (
+ TAO_ServerRequest & server_request,
+ void * TAO_INTERCEPTOR (servant_upcall),
+ void * servant
+ ACE_ENV_ARG_DECL
+ )
+{
+#if TAO_HAS_INTERCEPTORS == 1
+ static ::CORBA::TypeCode_ptr const * const exceptions = 0;
+ static ::CORBA::ULong const nexceptions = 0;
+#endif /* TAO_HAS_INTERCEPTORS */
+
+ TAO::SArg_Traits< ::ACE_InputCDR::to_boolean>::ret_val retval;
+ TAO::SArg_Traits< ::CORBA::Char *>::in_arg_val _tao_repository_id;
+
+ TAO::Argument * const args[] =
+ {
+ &retval,
+ &_tao_repository_id
+ };
+
+ static size_t const nargs = 2;
+
+ POA_CORBA::ModuleDef * const impl =
+ static_cast<POA_CORBA::ModuleDef *> (servant);
+
+ _is_a_ModuleDef_Upcall_Command command (
+ impl,
+ server_request.operation_details (),
+ args);
+
+ TAO::Upcall_Wrapper upcall_wrapper;
+ upcall_wrapper.upcall (server_request
+ , args
+ , nargs
+ , command
+#if TAO_HAS_INTERCEPTORS == 1
+ , servant_upcall
+ , exceptions
+ , nexceptions
+#endif /* TAO_HAS_INTERCEPTORS == 1 */
+ ACE_ENV_ARG_PARAMETER);
+ ACE_CHECK;
+}namespace POA_CORBA
+{
+
+
+ // TAO_IDL - Generated from
+ // be\be_visitor_operation/upcall_command_ss.cpp:127
+
+ class _non_existent_ModuleDef_Upcall_Command
+ : public TAO::Upcall_Command
+ {
+ public:
+ inline _non_existent_ModuleDef_Upcall_Command (
+ POA_CORBA::ModuleDef * servant,
+ TAO_Operation_Details const * operation_details,
+ TAO::Argument * const args[])
+ : servant_ (servant)
+ , operation_details_ (operation_details)
+ , args_ (args)
+ {
+ }
+
+ virtual void execute (ACE_ENV_SINGLE_ARG_DECL)
+ {
+ TAO::SArg_Traits< ::ACE_InputCDR::to_boolean>::ret_arg_type retval =
+ TAO::Portable_Server::get_ret_arg< ::ACE_InputCDR::to_boolean> (
+ this->operation_details_,
+ this->args_);
+
+ retval =
+ this->servant_-> _non_existent (
+ ACE_ENV_SINGLE_ARG_PARAMETER);
+ ACE_CHECK;
+ }
+
+ private:
+ POA_CORBA::ModuleDef * const servant_;
+ TAO_Operation_Details const * const operation_details_;
+ TAO::Argument * const * const args_;
+ };
+}
+
+
+void POA_CORBA::ModuleDef::_non_existent_skel (
+ TAO_ServerRequest & server_request,
+ void * TAO_INTERCEPTOR (servant_upcall),
+ void * servant
+ ACE_ENV_ARG_DECL
+ )
+{
+#if TAO_HAS_INTERCEPTORS == 1
+ static ::CORBA::TypeCode_ptr const * const exceptions = 0;
+ static ::CORBA::ULong const nexceptions = 0;
+#endif /* TAO_HAS_INTERCEPTORS */
+
+ TAO::SArg_Traits< ::ACE_InputCDR::to_boolean>::ret_val retval;
+
+ TAO::Argument * const args[] =
+ {
+ &retval
+ };
+
+ static size_t const nargs = 1;
+
+ POA_CORBA::ModuleDef * const impl =
+ static_cast<POA_CORBA::ModuleDef *> (servant);
+
+ _non_existent_ModuleDef_Upcall_Command command (
+ impl,
+ server_request.operation_details (),
+ args);
+
+ TAO::Upcall_Wrapper upcall_wrapper;
+ upcall_wrapper.upcall (server_request
+ , args
+ , nargs
+ , command
+#if TAO_HAS_INTERCEPTORS == 1
+ , servant_upcall
+ , exceptions
+ , nexceptions
+#endif /* TAO_HAS_INTERCEPTORS == 1 */
+ ACE_ENV_ARG_PARAMETER);
+ ACE_CHECK;
+}namespace POA_CORBA
+{
+
+
+ // TAO_IDL - Generated from
+ // be\be_visitor_operation/upcall_command_ss.cpp:127
+
+ class _repository_id_ModuleDef_Upcall_Command
+ : public TAO::Upcall_Command
+ {
+ public:
+ inline _repository_id_ModuleDef_Upcall_Command (
+ POA_CORBA::ModuleDef * servant,
+ TAO_Operation_Details const * operation_details,
+ TAO::Argument * const args[])
+ : servant_ (servant)
+ , operation_details_ (operation_details)
+ , args_ (args)
+ {
+ }
+
+ virtual void execute (ACE_ENV_SINGLE_ARG_DECL)
+ {
+ TAO::SArg_Traits< ::CORBA::Char *>::ret_arg_type retval =
+ TAO::Portable_Server::get_ret_arg< ::CORBA::Char *> (
+ this->operation_details_,
+ this->args_);
+
+ retval =
+ this->servant_-> _repository_id (
+ ACE_ENV_SINGLE_ARG_PARAMETER);
+ ACE_CHECK;
+ }
+
+ private:
+ POA_CORBA::ModuleDef * const servant_;
+ TAO_Operation_Details const * const operation_details_;
+ TAO::Argument * const * const args_;
+ };
+}
+
+
+void POA_CORBA::ModuleDef::_repository_id_skel (
+ TAO_ServerRequest & server_request,
+ void * TAO_INTERCEPTOR (servant_upcall),
+ void * servant
+ ACE_ENV_ARG_DECL
+ )
+{
+#if TAO_HAS_INTERCEPTORS == 1
+ static ::CORBA::TypeCode_ptr const * const exceptions = 0;
+ static ::CORBA::ULong const nexceptions = 0;
+#endif /* TAO_HAS_INTERCEPTORS */
+
+ TAO::SArg_Traits< ::CORBA::Char *>::ret_val retval;
+
+ TAO::Argument * const args[] =
+ {
+ &retval
+ };
+
+ static size_t const nargs = 1;
+
+ POA_CORBA::ModuleDef * const impl =
+ static_cast<POA_CORBA::ModuleDef *> (servant);
+
+ _repository_id_ModuleDef_Upcall_Command command (
+ impl,
+ server_request.operation_details (),
+ args);
+
+ TAO::Upcall_Wrapper upcall_wrapper;
+ upcall_wrapper.upcall (server_request
+ , args
+ , nargs
+ , command
+#if TAO_HAS_INTERCEPTORS == 1
+ , servant_upcall
+ , exceptions
+ , nexceptions
+#endif /* TAO_HAS_INTERCEPTORS == 1 */
+ ACE_ENV_ARG_PARAMETER);
+ ACE_CHECK;
+}
+
+// TAO_IDL - Generated from
+// be\be_visitor_interface/interface_ss.cpp:513
+
+void POA_CORBA::ModuleDef::_interface_skel (
+ TAO_ServerRequest & server_request,
+ void * /* servant_upcall */,
+ void * servant
+ ACE_ENV_ARG_DECL
+ )
+{
+ TAO_IFR_Client_Adapter *_tao_adapter =
+ ACE_Dynamic_Service<TAO_IFR_Client_Adapter>::instance (
+ TAO_ORB_Core::ifr_client_adapter_name ()
+ );
+
+ if (_tao_adapter == 0)
+ {
+ ACE_THROW ( ::CORBA::INTF_REPOS ( ::CORBA::OMGVMCID | 1,
+ ::CORBA::COMPLETED_NO));
+ }
+
+ POA_CORBA::ModuleDef * const impl =
+ static_cast<POA_CORBA::ModuleDef *> (servant);
+ ::CORBA::InterfaceDef_ptr _tao_retval =
+ impl->_get_interface (ACE_ENV_SINGLE_ARG_PARAMETER);
+ ACE_CHECK;
+
+ server_request.init_reply ();
+ TAO_OutputCDR &_tao_out = *server_request.outgoing ();
+
+ ::CORBA::Boolean const _tao_result =
+ _tao_adapter->interfacedef_cdr_insert (
+ _tao_out,
+ _tao_retval
+ );
+
+ _tao_adapter->dispose (_tao_retval);
+
+ if (_tao_result == false)
+ {
+ ACE_THROW ( ::CORBA::MARSHAL ());
+ }
+}namespace POA_CORBA
+{
+
+
+ // TAO_IDL - Generated from
+ // be\be_visitor_operation/upcall_command_ss.cpp:127
+
+ class _get_component_ModuleDef_Upcall_Command
+ : public TAO::Upcall_Command
+ {
+ public:
+ inline _get_component_ModuleDef_Upcall_Command (
+ POA_CORBA::ModuleDef * servant,
+ TAO_Operation_Details const * operation_details,
+ TAO::Argument * const args[])
+ : servant_ (servant)
+ , operation_details_ (operation_details)
+ , args_ (args)
+ {
+ }
+
+ virtual void execute (ACE_ENV_SINGLE_ARG_DECL)
+ {
+ TAO::SArg_Traits< ::CORBA::Object>::ret_arg_type retval =
+ TAO::Portable_Server::get_ret_arg< ::CORBA::Object> (
+ this->operation_details_,
+ this->args_);
+
+ retval =
+ this->servant_-> _get_component (
+ ACE_ENV_SINGLE_ARG_PARAMETER);
+ ACE_CHECK;
+ }
+
+ private:
+ POA_CORBA::ModuleDef * const servant_;
+ TAO_Operation_Details const * const operation_details_;
+ TAO::Argument * const * const args_;
+ };
+}
+
+
+void POA_CORBA::ModuleDef::_component_skel (
+ TAO_ServerRequest & server_request,
+ void * TAO_INTERCEPTOR (servant_upcall),
+ void * servant
+ ACE_ENV_ARG_DECL
+ )
+{
+#if TAO_HAS_INTERCEPTORS == 1
+ static ::CORBA::TypeCode_ptr const * const exceptions = 0;
+ static ::CORBA::ULong const nexceptions = 0;
+#endif /* TAO_HAS_INTERCEPTORS */
+
+ TAO::SArg_Traits< ::CORBA::Object>::ret_val retval;
+
+ TAO::Argument * const args[] =
+ {
+ &retval
+ };
+
+ static size_t const nargs = 1;
+
+ POA_CORBA::ModuleDef * const impl =
+ static_cast<POA_CORBA::ModuleDef *> (servant);
+
+ _get_component_ModuleDef_Upcall_Command command (
+ impl,
+ server_request.operation_details (),
+ args);
+
+ TAO::Upcall_Wrapper upcall_wrapper;
+ upcall_wrapper.upcall (server_request
+ , args
+ , nargs
+ , command
+#if TAO_HAS_INTERCEPTORS == 1
+ , servant_upcall
+ , exceptions
+ , nexceptions
+#endif /* TAO_HAS_INTERCEPTORS == 1 */
+ ACE_ENV_ARG_PARAMETER);
+ ACE_CHECK;
+}
+
+::CORBA::Boolean POA_CORBA::ModuleDef::_is_a (
+ const char* value
+ ACE_ENV_ARG_DECL_NOT_USED
+ )
+{
+ return
+ (
+ !ACE_OS::strcmp (
+ value,
+ "IDL:omg.org/CORBA/IRObject:1.0"
+ ) ||
+ !ACE_OS::strcmp (
+ value,
+ "IDL:omg.org/CORBA/Container:1.0"
+ ) ||
+ !ACE_OS::strcmp (
+ value,
+ "IDL:omg.org/CORBA/Contained:1.0"
+ ) ||
+ !ACE_OS::strcmp (
+ value,
+ "IDL:omg.org/CORBA/ModuleDef:1.0"
+ ) ||
+ !ACE_OS::strcmp (
+ value,
+ "IDL:omg.org/CORBA/Object:1.0"
+ )
+ );
+}
+
+const char* POA_CORBA::ModuleDef::_interface_repository_id (void) const
+{
+ return "IDL:omg.org/CORBA/ModuleDef:1.0";
+}
+
+// TAO_IDL - Generated from
+// be\be_visitor_interface/interface_ss.cpp:903
+
+void POA_CORBA::ModuleDef::_dispatch (
+ TAO_ServerRequest & req,
+ void * servant_upcall
+ ACE_ENV_ARG_DECL
+ )
+{
+ this->synchronous_upcall_dispatch (req,
+ servant_upcall,
+ this
+ ACE_ENV_ARG_PARAMETER);
+}
+
+// TAO_IDL - Generated from
+// be\be_visitor_interface/interface_ss.cpp:851
+
+CORBA::ModuleDef *
+POA_CORBA::ModuleDef::_this (ACE_ENV_SINGLE_ARG_DECL)
+{
+ TAO_Stub *stub = this->_create_stub (ACE_ENV_SINGLE_ARG_PARAMETER);
+ ACE_CHECK_RETURN (0);
+
+ TAO_Stub_Auto_Ptr safe_stub (stub);
+ ::CORBA::Object_ptr tmp = CORBA::Object::_nil ();
+
+ ::CORBA::Boolean const _tao_opt_colloc =
+ stub->servant_orb_var ()->orb_core ()->optimize_collocation_objects ();
+
+ ACE_NEW_RETURN (
+ tmp,
+ ::CORBA::Object (stub, _tao_opt_colloc, this),
+ 0
+ );
+
+ ::CORBA::Object_var obj = tmp;
+ (void) safe_stub.release ();
+
+ typedef ::CORBA::ModuleDef STUB_SCOPED_NAME;
+ return
+ TAO::Narrow_Utils<STUB_SCOPED_NAME>::unchecked_narrow (
+ obj.in (),
+ CORBA__TAO_ModuleDef_Proxy_Broker_Factory_function_pointer
+ );
+}
+
+// TAO_IDL - Generated from
+// be\be_interface.cpp:1499
+
+class TAO_CORBA_ConstantDef_Perfect_Hash_OpTable
+ : public TAO_Perfect_Hash_OpTable
+{
+private:
+ unsigned int hash (const char *str, unsigned int len);
+
+public:
+ const TAO_operation_db_entry * lookup (const char *str, unsigned int len);
+};
+
+/* C++ code produced by gperf version 2.8 (ACE version) */
+/* Command-line: C:\ACE\latest\ACE_wrappers\bin\gperf.exe -m -M -J -c -C -D -E -T -f 0 -F 0,0 -a -o -t -p -K opname -L C++ -Z TAO_CORBA_ConstantDef_Perfect_Hash_OpTable -N lookup */
+unsigned int
+TAO_CORBA_ConstantDef_Perfect_Hash_OpTable::hash (const char *str, unsigned int len)
+{
+ static const unsigned char asso_values[] =
+ {
+#if defined (ACE_MVS)
+ 37, 37, 37, 37, 37, 37, 37, 37, 37, 37,
+ 37, 37, 37, 37, 37, 37, 37, 37, 37, 37,
+ 37, 37, 37, 37, 37, 37, 37, 37, 37, 37,
+ 37, 37, 37, 37, 37, 37, 37, 37, 37, 37,
+ 37, 37, 37, 37, 37, 37, 37, 37, 37, 37,
+ 37, 37, 37, 37, 37, 37, 37, 37, 37, 37,
+ 37, 37, 37, 37, 37, 37, 37, 37, 37, 37,
+ 37, 37, 37, 37, 37, 37, 37, 37, 37, 37,
+ 37, 37, 37, 37, 37, 37, 37, 37, 37, 37,
+ 37, 37, 37, 37, 37, 37, 37, 37, 37, 37,
+ 37, 37, 37, 37, 37, 37, 37, 37, 37, 0,
+ 37, 37, 37, 37, 37, 37, 37, 37, 37, 37,
+ 37, 37, 37, 37, 37, 37, 37, 37, 37, 0,
+ 37, 37, 0, 0, 15, 37, 37, 37, 37, 37,
+ 37, 37, 37, 37, 37, 37, 37, 37, 0, 0,
+ 37, 37, 37, 37, 37, 37, 37, 37, 37, 37,
+ 37, 37, 37, 10, 37, 37, 37, 37, 10, 37,
+ 37, 37, 37, 37, 37, 37, 37, 37, 37, 37,
+ 37, 37, 37, 37, 37, 37, 37, 37, 37, 37,
+ 37, 37, 37, 37, 37, 37, 37, 37, 37, 37,
+ 37, 37, 37, 37, 37, 37, 37, 37, 37, 37,
+ 37, 37, 37, 37, 37, 37, 37, 37, 37, 37,
+ 37, 37, 37, 37, 37, 37, 37, 37, 37, 37,
+ 37, 37, 37, 37, 37, 37, 37, 37, 37, 37,
+ 37, 37, 37, 37, 37, 37, 37, 37, 37, 37,
+ 37, 37, 37, 37, 37, 37,
+#else
+ 37, 37, 37, 37, 37, 37, 37, 37, 37, 37,
+ 37, 37, 37, 37, 37, 37, 37, 37, 37, 37,
+ 37, 37, 37, 37, 37, 37, 37, 37, 37, 37,
+ 37, 37, 37, 37, 37, 37, 37, 37, 37, 37,
+ 37, 37, 37, 37, 37, 37, 37, 37, 37, 37,
+ 37, 37, 37, 37, 37, 37, 37, 37, 37, 37,
+ 37, 37, 37, 37, 37, 37, 37, 37, 37, 37,
+ 37, 37, 37, 37, 37, 37, 37, 37, 37, 37,
+ 37, 37, 37, 37, 37, 37, 37, 37, 37, 37,
+ 37, 37, 37, 37, 37, 0, 37, 0, 37, 37,
+ 0, 0, 15, 37, 37, 37, 37, 37, 37, 0,
+ 0, 37, 37, 37, 37, 37, 10, 37, 37, 37,
+ 37, 10, 37, 37, 37, 37, 37, 37,
+#endif /* ACE_MVS */
+ };
+ return len + asso_values[(int) str[len - 1]] + asso_values[(int) str[0]];
+}
+
+const TAO_operation_db_entry *
+TAO_CORBA_ConstantDef_Perfect_Hash_OpTable::lookup (const char *str, unsigned int len)
+{
+ enum
+ {
+ TOTAL_KEYWORDS = 23,
+ MIN_WORD_LENGTH = 4,
+ MAX_WORD_LENGTH = 26,
+ MIN_HASH_VALUE = 4,
+ MAX_HASH_VALUE = 36,
+ HASH_VALUE_RANGE = 33,
+ DUPLICATES = 8,
+ WORDLIST_SIZE = 27
+ };
+
+ static const TAO_operation_db_entry wordlist[] =
+ {
+ {"",0,0},{"",0,0},{"",0,0},{"",0,0},
+ {"move", &POA_CORBA::ConstantDef::move_skel, 0},
+ {"_is_a", &POA_CORBA::ConstantDef::_is_a_skel, 0},
+ {"_get_id", &POA_CORBA::ConstantDef::_get_id_skel, 0},
+ {"_set_id", &POA_CORBA::ConstantDef::_set_id_skel, 0},
+ {"describe", &POA_CORBA::ConstantDef::describe_skel, 0},
+ {"_get_name", &POA_CORBA::ConstantDef::_get_name_skel, 0},
+ {"_get_type", &POA_CORBA::ConstantDef::_get_type_skel, 0},
+ {"_set_name", &POA_CORBA::ConstantDef::_set_name_skel, 0},
+ {"_get_value", &POA_CORBA::ConstantDef::_get_value_skel, 0},
+ {"_interface", &POA_CORBA::ConstantDef::_interface_skel, 0},
+ {"_set_value", &POA_CORBA::ConstantDef::_set_value_skel, 0},
+ {"_get_version", &POA_CORBA::ConstantDef::_get_version_skel, 0},
+ {"_set_version", &POA_CORBA::ConstantDef::_set_version_skel, 0},
+ {"_get_def_kind", &POA_CORBA::ConstantDef::_get_def_kind_skel, 0},
+ {"_repository_id", &POA_CORBA::ConstantDef::_repository_id_skel, 0},
+ {"_get_defined_in", &POA_CORBA::ConstantDef::_get_defined_in_skel, 0},
+ {"destroy", &POA_CORBA::ConstantDef::destroy_skel, 0},
+ {"_get_absolute_name", &POA_CORBA::ConstantDef::_get_absolute_name_skel, 0},
+ {"_component", &POA_CORBA::ConstantDef::_component_skel, 0},
+ {"_non_existent", &POA_CORBA::ConstantDef::_non_existent_skel, 0},
+ {"_get_type_def", &POA_CORBA::ConstantDef::_get_type_def_skel, 0},
+ {"_set_type_def", &POA_CORBA::ConstantDef::_set_type_def_skel, 0},
+ {"_get_containing_repository", &POA_CORBA::ConstantDef::_get_containing_repository_skel, 0},
+ };
+
+ static const signed char lookup[] =
+ {
+ -12, -3, -15, -2, 4, 5, -1, 53, 8, 48, -46, -1, -46, 17,
+ 18, 19, -1, 20, 21, -1, 22, -9, -3, 23, -6, -2, -24, -2,
+ -38, -1, -1, -1, -1, -1, -1, -1, 26,
+ };
+
+ if (len <= MAX_WORD_LENGTH && len >= MIN_WORD_LENGTH)
+ {
+ unsigned int key = hash (str, len);
+
+ if (key <= MAX_HASH_VALUE && key >= MIN_HASH_VALUE)
+ {
+ int slot = lookup[key];
+
+ if (slot >= 0 && slot < WORDLIST_SIZE)
+ {
+ const char *s = wordlist[slot].opname;
+
+ if (*str == *s && !strncmp (str + 1, s + 1, len - 1))
+ return &wordlist[slot];
+ }
+ else if (slot < 0 && slot >= -MAX_HASH_VALUE)
+ return 0;
+ else
+ {
+ unsigned int offset = key + slot + (slot > 0 ? -MAX_HASH_VALUE : MAX_HASH_VALUE);
+ const TAO_operation_db_entry *base = &wordlist[-lookup[offset]];
+ const TAO_operation_db_entry *ptr = base + -lookup[offset + 1];
+
+ while (--ptr >= base)
+ if (*str == *ptr->opname && !strncmp (str + 1, ptr->opname + 1, len - 1))
+ return ptr;
+ }
+ }
+ }
+ return 0;
+}
+
+static TAO_CORBA_ConstantDef_Perfect_Hash_OpTable tao_CORBA_ConstantDef_optable;
+
+// TAO_IDL - Generated from
+// be\be_visitor_interface/interface_ss.cpp:966
+
+TAO::Collocation_Proxy_Broker *
+CORBA__TAO_ConstantDef_Proxy_Broker_Factory_function ( ::CORBA::Object_ptr)
+{
+ return reinterpret_cast<TAO::Collocation_Proxy_Broker *> (0xdead); // Dummy
+}
+
+int
+CORBA__TAO_ConstantDef_Proxy_Broker_Factory_Initializer (size_t)
+{
+ CORBA__TAO_ConstantDef_Proxy_Broker_Factory_function_pointer =
+ CORBA__TAO_ConstantDef_Proxy_Broker_Factory_function;
+
+ return 0;
+}
+
+static int
+CORBA__TAO_ConstantDef_Proxy_Broker_Stub_Factory_Initializer_Scarecrow =
+ CORBA__TAO_ConstantDef_Proxy_Broker_Factory_Initializer (
+ reinterpret_cast<size_t> (CORBA__TAO_ConstantDef_Proxy_Broker_Factory_Initializer)
+ );
+
+// TAO_IDL - Generated from
+// be\be_visitor_interface/interface_ss.cpp:103
+
+POA_CORBA::ConstantDef::ConstantDef (void)
+ : TAO_ServantBase ()
+{
+ this->optable_ = &tao_CORBA_ConstantDef_optable;
+}
+
+POA_CORBA::ConstantDef::ConstantDef (const ConstantDef& rhs)
+ : TAO_Abstract_ServantBase (rhs),
+ TAO_ServantBase (rhs),
+ POA_CORBA::IRObject (rhs),
+ POA_CORBA::Contained (rhs)
+{
+}
+
+POA_CORBA::ConstantDef::~ConstantDef (void)
+{
+}namespace POA_CORBA
+{
+
+
+ // TAO_IDL - Generated from
+ // be\be_visitor_operation/upcall_command_ss.cpp:127
+
+ class _get_type_ConstantDef
+ : public TAO::Upcall_Command
+ {
+ public:
+ inline _get_type_ConstantDef (
+ POA_CORBA::ConstantDef * servant,
+ TAO_Operation_Details const * operation_details,
+ TAO::Argument * const args[])
+ : servant_ (servant)
+ , operation_details_ (operation_details)
+ , args_ (args)
+ {
+ }
+
+ virtual void execute (ACE_ENV_SINGLE_ARG_DECL)
+ {
+ TAO::SArg_Traits< ::CORBA::TypeCode>::ret_arg_type retval =
+ TAO::Portable_Server::get_ret_arg< ::CORBA::TypeCode> (
+ this->operation_details_,
+ this->args_);
+
+ retval =
+ this->servant_->type (
+ ACE_ENV_SINGLE_ARG_PARAMETER);
+ ACE_CHECK;
+ }
+
+ private:
+ POA_CORBA::ConstantDef * const servant_;
+ TAO_Operation_Details const * const operation_details_;
+ TAO::Argument * const * const args_;
+ };
+}
+
+
+// TAO_IDL - Generated from
+// be\be_visitor_operation/operation_ss.cpp:190
+
+void POA_CORBA::ConstantDef::_get_type_skel (
+ TAO_ServerRequest & server_request,
+ void * TAO_INTERCEPTOR (servant_upcall),
+ void * servant
+ ACE_ENV_ARG_DECL
+ )
+{
+#if TAO_HAS_INTERCEPTORS == 1
+ static ::CORBA::TypeCode_ptr const * const exceptions = 0;
+ static ::CORBA::ULong const nexceptions = 0;
+#endif /* TAO_HAS_INTERCEPTORS */
+
+ TAO::SArg_Traits< ::CORBA::TypeCode>::ret_val retval;
+
+ TAO::Argument * const args[] =
+ {
+ &retval
+ };
+
+ static size_t const nargs = 1;
+
+ POA_CORBA::ConstantDef * const impl =
+ static_cast<POA_CORBA::ConstantDef *> (servant);
+
+ _get_type_ConstantDef command (
+ impl,
+ server_request.operation_details (),
+ args);
+
+ TAO::Upcall_Wrapper upcall_wrapper;
+ upcall_wrapper.upcall (server_request
+ , args
+ , nargs
+ , command
+#if TAO_HAS_INTERCEPTORS == 1
+ , servant_upcall
+ , exceptions
+ , nexceptions
+#endif /* TAO_HAS_INTERCEPTORS == 1 */
+ ACE_ENV_ARG_PARAMETER);
+ ACE_CHECK;
+}namespace POA_CORBA
+{
+
+
+ // TAO_IDL - Generated from
+ // be\be_visitor_operation/upcall_command_ss.cpp:127
+
+ class _get_type_def_ConstantDef
+ : public TAO::Upcall_Command
+ {
+ public:
+ inline _get_type_def_ConstantDef (
+ POA_CORBA::ConstantDef * servant,
+ TAO_Operation_Details const * operation_details,
+ TAO::Argument * const args[])
+ : servant_ (servant)
+ , operation_details_ (operation_details)
+ , args_ (args)
+ {
+ }
+
+ virtual void execute (ACE_ENV_SINGLE_ARG_DECL)
+ {
+ TAO::SArg_Traits< ::CORBA::IDLType>::ret_arg_type retval =
+ TAO::Portable_Server::get_ret_arg< ::CORBA::IDLType> (
+ this->operation_details_,
+ this->args_);
+
+ retval =
+ this->servant_->type_def (
+ ACE_ENV_SINGLE_ARG_PARAMETER);
+ ACE_CHECK;
+ }
+
+ private:
+ POA_CORBA::ConstantDef * const servant_;
+ TAO_Operation_Details const * const operation_details_;
+ TAO::Argument * const * const args_;
+ };
+}
+
+
+// TAO_IDL - Generated from
+// be\be_visitor_operation/operation_ss.cpp:190
+
+void POA_CORBA::ConstantDef::_get_type_def_skel (
+ TAO_ServerRequest & server_request,
+ void * TAO_INTERCEPTOR (servant_upcall),
+ void * servant
+ ACE_ENV_ARG_DECL
+ )
+{
+#if TAO_HAS_INTERCEPTORS == 1
+ static ::CORBA::TypeCode_ptr const * const exceptions = 0;
+ static ::CORBA::ULong const nexceptions = 0;
+#endif /* TAO_HAS_INTERCEPTORS */
+
+ TAO::SArg_Traits< ::CORBA::IDLType>::ret_val retval;
+
+ TAO::Argument * const args[] =
+ {
+ &retval
+ };
+
+ static size_t const nargs = 1;
+
+ POA_CORBA::ConstantDef * const impl =
+ static_cast<POA_CORBA::ConstantDef *> (servant);
+
+ _get_type_def_ConstantDef command (
+ impl,
+ server_request.operation_details (),
+ args);
+
+ TAO::Upcall_Wrapper upcall_wrapper;
+ upcall_wrapper.upcall (server_request
+ , args
+ , nargs
+ , command
+#if TAO_HAS_INTERCEPTORS == 1
+ , servant_upcall
+ , exceptions
+ , nexceptions
+#endif /* TAO_HAS_INTERCEPTORS == 1 */
+ ACE_ENV_ARG_PARAMETER);
+ ACE_CHECK;
+}namespace POA_CORBA
+{
+
+
+ // TAO_IDL - Generated from
+ // be\be_visitor_operation/upcall_command_ss.cpp:127
+
+ class _set_type_def_ConstantDef
+ : public TAO::Upcall_Command
+ {
+ public:
+ inline _set_type_def_ConstantDef (
+ POA_CORBA::ConstantDef * servant,
+ TAO_Operation_Details const * operation_details,
+ TAO::Argument * const args[])
+ : servant_ (servant)
+ , operation_details_ (operation_details)
+ , args_ (args)
+ {
+ }
+
+ virtual void execute (ACE_ENV_SINGLE_ARG_DECL)
+ {
+ TAO::SArg_Traits< ::CORBA::IDLType>::in_arg_type arg_1 =
+ TAO::Portable_Server::get_in_arg< ::CORBA::IDLType> (
+ this->operation_details_,
+ this->args_,
+ 1);
+
+ this->servant_->type_def (
+ arg_1
+ ACE_ENV_ARG_PARAMETER);
+ ACE_CHECK;
+ }
+
+ private:
+ POA_CORBA::ConstantDef * const servant_;
+ TAO_Operation_Details const * const operation_details_;
+ TAO::Argument * const * const args_;
+ };
+}
+
+
+// TAO_IDL - Generated from
+// be\be_visitor_operation/operation_ss.cpp:190
+
+void POA_CORBA::ConstantDef::_set_type_def_skel (
+ TAO_ServerRequest & server_request,
+ void * TAO_INTERCEPTOR (servant_upcall),
+ void * servant
+ ACE_ENV_ARG_DECL
+ )
+{
+#if TAO_HAS_INTERCEPTORS == 1
+ static ::CORBA::TypeCode_ptr const * const exceptions = 0;
+ static ::CORBA::ULong const nexceptions = 0;
+#endif /* TAO_HAS_INTERCEPTORS */
+
+ TAO::SArg_Traits< void>::ret_val retval;
+ TAO::SArg_Traits< ::CORBA::IDLType>::in_arg_val _tao_type_def;
+
+ TAO::Argument * const args[] =
+ {
+ &retval,
+ &_tao_type_def
+ };
+
+ static size_t const nargs = 2;
+
+ POA_CORBA::ConstantDef * const impl =
+ static_cast<POA_CORBA::ConstantDef *> (servant);
+
+ _set_type_def_ConstantDef command (
+ impl,
+ server_request.operation_details (),
+ args);
+
+ TAO::Upcall_Wrapper upcall_wrapper;
+ upcall_wrapper.upcall (server_request
+ , args
+ , nargs
+ , command
+#if TAO_HAS_INTERCEPTORS == 1
+ , servant_upcall
+ , exceptions
+ , nexceptions
+#endif /* TAO_HAS_INTERCEPTORS == 1 */
+ ACE_ENV_ARG_PARAMETER);
+ ACE_CHECK;
+}namespace POA_CORBA
+{
+
+
+ // TAO_IDL - Generated from
+ // be\be_visitor_operation/upcall_command_ss.cpp:127
+
+ class _get_value_ConstantDef
+ : public TAO::Upcall_Command
+ {
+ public:
+ inline _get_value_ConstantDef (
+ POA_CORBA::ConstantDef * servant,
+ TAO_Operation_Details const * operation_details,
+ TAO::Argument * const args[])
+ : servant_ (servant)
+ , operation_details_ (operation_details)
+ , args_ (args)
+ {
+ }
+
+ virtual void execute (ACE_ENV_SINGLE_ARG_DECL)
+ {
+ TAO::SArg_Traits< ::CORBA::Any>::ret_arg_type retval =
+ TAO::Portable_Server::get_ret_arg< ::CORBA::Any> (
+ this->operation_details_,
+ this->args_);
+
+ retval =
+ this->servant_->value (
+ ACE_ENV_SINGLE_ARG_PARAMETER);
+ ACE_CHECK;
+ }
+
+ private:
+ POA_CORBA::ConstantDef * const servant_;
+ TAO_Operation_Details const * const operation_details_;
+ TAO::Argument * const * const args_;
+ };
+}
+
+
+// TAO_IDL - Generated from
+// be\be_visitor_operation/operation_ss.cpp:190
+
+void POA_CORBA::ConstantDef::_get_value_skel (
+ TAO_ServerRequest & server_request,
+ void * TAO_INTERCEPTOR (servant_upcall),
+ void * servant
+ ACE_ENV_ARG_DECL
+ )
+{
+#if TAO_HAS_INTERCEPTORS == 1
+ static ::CORBA::TypeCode_ptr const * const exceptions = 0;
+ static ::CORBA::ULong const nexceptions = 0;
+#endif /* TAO_HAS_INTERCEPTORS */
+
+ TAO::SArg_Traits< ::CORBA::Any>::ret_val retval;
+
+ TAO::Argument * const args[] =
+ {
+ &retval
+ };
+
+ static size_t const nargs = 1;
+
+ POA_CORBA::ConstantDef * const impl =
+ static_cast<POA_CORBA::ConstantDef *> (servant);
+
+ _get_value_ConstantDef command (
+ impl,
+ server_request.operation_details (),
+ args);
+
+ TAO::Upcall_Wrapper upcall_wrapper;
+ upcall_wrapper.upcall (server_request
+ , args
+ , nargs
+ , command
+#if TAO_HAS_INTERCEPTORS == 1
+ , servant_upcall
+ , exceptions
+ , nexceptions
+#endif /* TAO_HAS_INTERCEPTORS == 1 */
+ ACE_ENV_ARG_PARAMETER);
+ ACE_CHECK;
+}namespace POA_CORBA
+{
+
+
+ // TAO_IDL - Generated from
+ // be\be_visitor_operation/upcall_command_ss.cpp:127
+
+ class _set_value_ConstantDef
+ : public TAO::Upcall_Command
+ {
+ public:
+ inline _set_value_ConstantDef (
+ POA_CORBA::ConstantDef * servant,
+ TAO_Operation_Details const * operation_details,
+ TAO::Argument * const args[])
+ : servant_ (servant)
+ , operation_details_ (operation_details)
+ , args_ (args)
+ {
+ }
+
+ virtual void execute (ACE_ENV_SINGLE_ARG_DECL)
+ {
+ TAO::SArg_Traits< ::CORBA::Any>::in_arg_type arg_1 =
+ TAO::Portable_Server::get_in_arg< ::CORBA::Any> (
+ this->operation_details_,
+ this->args_,
+ 1);
+
+ this->servant_->value (
+ arg_1
+ ACE_ENV_ARG_PARAMETER);
+ ACE_CHECK;
+ }
+
+ private:
+ POA_CORBA::ConstantDef * const servant_;
+ TAO_Operation_Details const * const operation_details_;
+ TAO::Argument * const * const args_;
+ };
+}
+
+
+// TAO_IDL - Generated from
+// be\be_visitor_operation/operation_ss.cpp:190
+
+void POA_CORBA::ConstantDef::_set_value_skel (
+ TAO_ServerRequest & server_request,
+ void * TAO_INTERCEPTOR (servant_upcall),
+ void * servant
+ ACE_ENV_ARG_DECL
+ )
+{
+#if TAO_HAS_INTERCEPTORS == 1
+ static ::CORBA::TypeCode_ptr const * const exceptions = 0;
+ static ::CORBA::ULong const nexceptions = 0;
+#endif /* TAO_HAS_INTERCEPTORS */
+
+ TAO::SArg_Traits< void>::ret_val retval;
+ TAO::SArg_Traits< ::CORBA::Any>::in_arg_val _tao_value;
+
+ TAO::Argument * const args[] =
+ {
+ &retval,
+ &_tao_value
+ };
+
+ static size_t const nargs = 2;
+
+ POA_CORBA::ConstantDef * const impl =
+ static_cast<POA_CORBA::ConstantDef *> (servant);
+
+ _set_value_ConstantDef command (
+ impl,
+ server_request.operation_details (),
+ args);
+
+ TAO::Upcall_Wrapper upcall_wrapper;
+ upcall_wrapper.upcall (server_request
+ , args
+ , nargs
+ , command
+#if TAO_HAS_INTERCEPTORS == 1
+ , servant_upcall
+ , exceptions
+ , nexceptions
+#endif /* TAO_HAS_INTERCEPTORS == 1 */
+ ACE_ENV_ARG_PARAMETER);
+ ACE_CHECK;
+}
+
+// TAO_IDL - Generated from
+// be\be_visitor_interface/interface_ss.cpp:169
+
+namespace POA_CORBA
+{
+
+
+ // TAO_IDL - Generated from
+ // be\be_visitor_operation/upcall_command_ss.cpp:127
+
+ class _is_a_ConstantDef_Upcall_Command
+ : public TAO::Upcall_Command
+ {
+ public:
+ inline _is_a_ConstantDef_Upcall_Command (
+ POA_CORBA::ConstantDef * servant,
+ TAO_Operation_Details const * operation_details,
+ TAO::Argument * const args[])
+ : servant_ (servant)
+ , operation_details_ (operation_details)
+ , args_ (args)
+ {
+ }
+
+ virtual void execute (ACE_ENV_SINGLE_ARG_DECL)
+ {
+ TAO::SArg_Traits< ::ACE_InputCDR::to_boolean>::ret_arg_type retval =
+ TAO::Portable_Server::get_ret_arg< ::ACE_InputCDR::to_boolean> (
+ this->operation_details_,
+ this->args_);
+
+ TAO::SArg_Traits< ::CORBA::Char *>::in_arg_type arg_1 =
+ TAO::Portable_Server::get_in_arg< ::CORBA::Char *> (
+ this->operation_details_,
+ this->args_,
+ 1);
+
+ retval =
+ this->servant_-> _is_a (
+ arg_1
+ ACE_ENV_ARG_PARAMETER);
+ ACE_CHECK;
+ }
+
+ private:
+ POA_CORBA::ConstantDef * const servant_;
+ TAO_Operation_Details const * const operation_details_;
+ TAO::Argument * const * const args_;
+ };
+}
+
+
+void POA_CORBA::ConstantDef::_is_a_skel (
+ TAO_ServerRequest & server_request,
+ void * TAO_INTERCEPTOR (servant_upcall),
+ void * servant
+ ACE_ENV_ARG_DECL
+ )
+{
+#if TAO_HAS_INTERCEPTORS == 1
+ static ::CORBA::TypeCode_ptr const * const exceptions = 0;
+ static ::CORBA::ULong const nexceptions = 0;
+#endif /* TAO_HAS_INTERCEPTORS */
+
+ TAO::SArg_Traits< ::ACE_InputCDR::to_boolean>::ret_val retval;
+ TAO::SArg_Traits< ::CORBA::Char *>::in_arg_val _tao_repository_id;
+
+ TAO::Argument * const args[] =
+ {
+ &retval,
+ &_tao_repository_id
+ };
+
+ static size_t const nargs = 2;
+
+ POA_CORBA::ConstantDef * const impl =
+ static_cast<POA_CORBA::ConstantDef *> (servant);
+
+ _is_a_ConstantDef_Upcall_Command command (
+ impl,
+ server_request.operation_details (),
+ args);
+
+ TAO::Upcall_Wrapper upcall_wrapper;
+ upcall_wrapper.upcall (server_request
+ , args
+ , nargs
+ , command
+#if TAO_HAS_INTERCEPTORS == 1
+ , servant_upcall
+ , exceptions
+ , nexceptions
+#endif /* TAO_HAS_INTERCEPTORS == 1 */
+ ACE_ENV_ARG_PARAMETER);
+ ACE_CHECK;
+}namespace POA_CORBA
+{
+
+
+ // TAO_IDL - Generated from
+ // be\be_visitor_operation/upcall_command_ss.cpp:127
+
+ class _non_existent_ConstantDef_Upcall_Command
+ : public TAO::Upcall_Command
+ {
+ public:
+ inline _non_existent_ConstantDef_Upcall_Command (
+ POA_CORBA::ConstantDef * servant,
+ TAO_Operation_Details const * operation_details,
+ TAO::Argument * const args[])
+ : servant_ (servant)
+ , operation_details_ (operation_details)
+ , args_ (args)
+ {
+ }
+
+ virtual void execute (ACE_ENV_SINGLE_ARG_DECL)
+ {
+ TAO::SArg_Traits< ::ACE_InputCDR::to_boolean>::ret_arg_type retval =
+ TAO::Portable_Server::get_ret_arg< ::ACE_InputCDR::to_boolean> (
+ this->operation_details_,
+ this->args_);
+
+ retval =
+ this->servant_-> _non_existent (
+ ACE_ENV_SINGLE_ARG_PARAMETER);
+ ACE_CHECK;
+ }
+
+ private:
+ POA_CORBA::ConstantDef * const servant_;
+ TAO_Operation_Details const * const operation_details_;
+ TAO::Argument * const * const args_;
+ };
+}
+
+
+void POA_CORBA::ConstantDef::_non_existent_skel (
+ TAO_ServerRequest & server_request,
+ void * TAO_INTERCEPTOR (servant_upcall),
+ void * servant
+ ACE_ENV_ARG_DECL
+ )
+{
+#if TAO_HAS_INTERCEPTORS == 1
+ static ::CORBA::TypeCode_ptr const * const exceptions = 0;
+ static ::CORBA::ULong const nexceptions = 0;
+#endif /* TAO_HAS_INTERCEPTORS */
+
+ TAO::SArg_Traits< ::ACE_InputCDR::to_boolean>::ret_val retval;
+
+ TAO::Argument * const args[] =
+ {
+ &retval
+ };
+
+ static size_t const nargs = 1;
+
+ POA_CORBA::ConstantDef * const impl =
+ static_cast<POA_CORBA::ConstantDef *> (servant);
+
+ _non_existent_ConstantDef_Upcall_Command command (
+ impl,
+ server_request.operation_details (),
+ args);
+
+ TAO::Upcall_Wrapper upcall_wrapper;
+ upcall_wrapper.upcall (server_request
+ , args
+ , nargs
+ , command
+#if TAO_HAS_INTERCEPTORS == 1
+ , servant_upcall
+ , exceptions
+ , nexceptions
+#endif /* TAO_HAS_INTERCEPTORS == 1 */
+ ACE_ENV_ARG_PARAMETER);
+ ACE_CHECK;
+}namespace POA_CORBA
+{
+
+
+ // TAO_IDL - Generated from
+ // be\be_visitor_operation/upcall_command_ss.cpp:127
+
+ class _repository_id_ConstantDef_Upcall_Command
+ : public TAO::Upcall_Command
+ {
+ public:
+ inline _repository_id_ConstantDef_Upcall_Command (
+ POA_CORBA::ConstantDef * servant,
+ TAO_Operation_Details const * operation_details,
+ TAO::Argument * const args[])
+ : servant_ (servant)
+ , operation_details_ (operation_details)
+ , args_ (args)
+ {
+ }
+
+ virtual void execute (ACE_ENV_SINGLE_ARG_DECL)
+ {
+ TAO::SArg_Traits< ::CORBA::Char *>::ret_arg_type retval =
+ TAO::Portable_Server::get_ret_arg< ::CORBA::Char *> (
+ this->operation_details_,
+ this->args_);
+
+ retval =
+ this->servant_-> _repository_id (
+ ACE_ENV_SINGLE_ARG_PARAMETER);
+ ACE_CHECK;
+ }
+
+ private:
+ POA_CORBA::ConstantDef * const servant_;
+ TAO_Operation_Details const * const operation_details_;
+ TAO::Argument * const * const args_;
+ };
+}
+
+
+void POA_CORBA::ConstantDef::_repository_id_skel (
+ TAO_ServerRequest & server_request,
+ void * TAO_INTERCEPTOR (servant_upcall),
+ void * servant
+ ACE_ENV_ARG_DECL
+ )
+{
+#if TAO_HAS_INTERCEPTORS == 1
+ static ::CORBA::TypeCode_ptr const * const exceptions = 0;
+ static ::CORBA::ULong const nexceptions = 0;
+#endif /* TAO_HAS_INTERCEPTORS */
+
+ TAO::SArg_Traits< ::CORBA::Char *>::ret_val retval;
+
+ TAO::Argument * const args[] =
+ {
+ &retval
+ };
+
+ static size_t const nargs = 1;
+
+ POA_CORBA::ConstantDef * const impl =
+ static_cast<POA_CORBA::ConstantDef *> (servant);
+
+ _repository_id_ConstantDef_Upcall_Command command (
+ impl,
+ server_request.operation_details (),
+ args);
+
+ TAO::Upcall_Wrapper upcall_wrapper;
+ upcall_wrapper.upcall (server_request
+ , args
+ , nargs
+ , command
+#if TAO_HAS_INTERCEPTORS == 1
+ , servant_upcall
+ , exceptions
+ , nexceptions
+#endif /* TAO_HAS_INTERCEPTORS == 1 */
+ ACE_ENV_ARG_PARAMETER);
+ ACE_CHECK;
+}
+
+// TAO_IDL - Generated from
+// be\be_visitor_interface/interface_ss.cpp:513
+
+void POA_CORBA::ConstantDef::_interface_skel (
+ TAO_ServerRequest & server_request,
+ void * /* servant_upcall */,
+ void * servant
+ ACE_ENV_ARG_DECL
+ )
+{
+ TAO_IFR_Client_Adapter *_tao_adapter =
+ ACE_Dynamic_Service<TAO_IFR_Client_Adapter>::instance (
+ TAO_ORB_Core::ifr_client_adapter_name ()
+ );
+
+ if (_tao_adapter == 0)
+ {
+ ACE_THROW ( ::CORBA::INTF_REPOS ( ::CORBA::OMGVMCID | 1,
+ ::CORBA::COMPLETED_NO));
+ }
+
+ POA_CORBA::ConstantDef * const impl =
+ static_cast<POA_CORBA::ConstantDef *> (servant);
+ ::CORBA::InterfaceDef_ptr _tao_retval =
+ impl->_get_interface (ACE_ENV_SINGLE_ARG_PARAMETER);
+ ACE_CHECK;
+
+ server_request.init_reply ();
+ TAO_OutputCDR &_tao_out = *server_request.outgoing ();
+
+ ::CORBA::Boolean const _tao_result =
+ _tao_adapter->interfacedef_cdr_insert (
+ _tao_out,
+ _tao_retval
+ );
+
+ _tao_adapter->dispose (_tao_retval);
+
+ if (_tao_result == false)
+ {
+ ACE_THROW ( ::CORBA::MARSHAL ());
+ }
+}namespace POA_CORBA
+{
+
+
+ // TAO_IDL - Generated from
+ // be\be_visitor_operation/upcall_command_ss.cpp:127
+
+ class _get_component_ConstantDef_Upcall_Command
+ : public TAO::Upcall_Command
+ {
+ public:
+ inline _get_component_ConstantDef_Upcall_Command (
+ POA_CORBA::ConstantDef * servant,
+ TAO_Operation_Details const * operation_details,
+ TAO::Argument * const args[])
+ : servant_ (servant)
+ , operation_details_ (operation_details)
+ , args_ (args)
+ {
+ }
+
+ virtual void execute (ACE_ENV_SINGLE_ARG_DECL)
+ {
+ TAO::SArg_Traits< ::CORBA::Object>::ret_arg_type retval =
+ TAO::Portable_Server::get_ret_arg< ::CORBA::Object> (
+ this->operation_details_,
+ this->args_);
+
+ retval =
+ this->servant_-> _get_component (
+ ACE_ENV_SINGLE_ARG_PARAMETER);
+ ACE_CHECK;
+ }
+
+ private:
+ POA_CORBA::ConstantDef * const servant_;
+ TAO_Operation_Details const * const operation_details_;
+ TAO::Argument * const * const args_;
+ };
+}
+
+
+void POA_CORBA::ConstantDef::_component_skel (
+ TAO_ServerRequest & server_request,
+ void * TAO_INTERCEPTOR (servant_upcall),
+ void * servant
+ ACE_ENV_ARG_DECL
+ )
+{
+#if TAO_HAS_INTERCEPTORS == 1
+ static ::CORBA::TypeCode_ptr const * const exceptions = 0;
+ static ::CORBA::ULong const nexceptions = 0;
+#endif /* TAO_HAS_INTERCEPTORS */
+
+ TAO::SArg_Traits< ::CORBA::Object>::ret_val retval;
+
+ TAO::Argument * const args[] =
+ {
+ &retval
+ };
+
+ static size_t const nargs = 1;
+
+ POA_CORBA::ConstantDef * const impl =
+ static_cast<POA_CORBA::ConstantDef *> (servant);
+
+ _get_component_ConstantDef_Upcall_Command command (
+ impl,
+ server_request.operation_details (),
+ args);
+
+ TAO::Upcall_Wrapper upcall_wrapper;
+ upcall_wrapper.upcall (server_request
+ , args
+ , nargs
+ , command
+#if TAO_HAS_INTERCEPTORS == 1
+ , servant_upcall
+ , exceptions
+ , nexceptions
+#endif /* TAO_HAS_INTERCEPTORS == 1 */
+ ACE_ENV_ARG_PARAMETER);
+ ACE_CHECK;
+}
+
+::CORBA::Boolean POA_CORBA::ConstantDef::_is_a (
+ const char* value
+ ACE_ENV_ARG_DECL_NOT_USED
+ )
+{
+ return
+ (
+ !ACE_OS::strcmp (
+ value,
+ "IDL:omg.org/CORBA/IRObject:1.0"
+ ) ||
+ !ACE_OS::strcmp (
+ value,
+ "IDL:omg.org/CORBA/Contained:1.0"
+ ) ||
+ !ACE_OS::strcmp (
+ value,
+ "IDL:omg.org/CORBA/ConstantDef:1.0"
+ ) ||
+ !ACE_OS::strcmp (
+ value,
+ "IDL:omg.org/CORBA/Object:1.0"
+ )
+ );
+}
+
+const char* POA_CORBA::ConstantDef::_interface_repository_id (void) const
+{
+ return "IDL:omg.org/CORBA/ConstantDef:1.0";
+}
+
+// TAO_IDL - Generated from
+// be\be_visitor_interface/interface_ss.cpp:903
+
+void POA_CORBA::ConstantDef::_dispatch (
+ TAO_ServerRequest & req,
+ void * servant_upcall
+ ACE_ENV_ARG_DECL
+ )
+{
+ this->synchronous_upcall_dispatch (req,
+ servant_upcall,
+ this
+ ACE_ENV_ARG_PARAMETER);
+}
+
+// TAO_IDL - Generated from
+// be\be_visitor_interface/interface_ss.cpp:851
+
+CORBA::ConstantDef *
+POA_CORBA::ConstantDef::_this (ACE_ENV_SINGLE_ARG_DECL)
+{
+ TAO_Stub *stub = this->_create_stub (ACE_ENV_SINGLE_ARG_PARAMETER);
+ ACE_CHECK_RETURN (0);
+
+ TAO_Stub_Auto_Ptr safe_stub (stub);
+ ::CORBA::Object_ptr tmp = CORBA::Object::_nil ();
+
+ ::CORBA::Boolean const _tao_opt_colloc =
+ stub->servant_orb_var ()->orb_core ()->optimize_collocation_objects ();
+
+ ACE_NEW_RETURN (
+ tmp,
+ ::CORBA::Object (stub, _tao_opt_colloc, this),
+ 0
+ );
+
+ ::CORBA::Object_var obj = tmp;
+ (void) safe_stub.release ();
+
+ typedef ::CORBA::ConstantDef STUB_SCOPED_NAME;
+ return
+ TAO::Narrow_Utils<STUB_SCOPED_NAME>::unchecked_narrow (
+ obj.in (),
+ CORBA__TAO_ConstantDef_Proxy_Broker_Factory_function_pointer
+ );
+}
+
+// TAO_IDL - Generated from
+// be\be_interface.cpp:1499
+
+class TAO_CORBA_StructDef_Perfect_Hash_OpTable
+ : public TAO_Perfect_Hash_OpTable
+{
+private:
+ unsigned int hash (const char *str, unsigned int len);
+
+public:
+ const TAO_operation_db_entry * lookup (const char *str, unsigned int len);
+};
+
+/* C++ code produced by gperf version 2.8 (ACE version) */
+/* Command-line: C:\ACE\latest\ACE_wrappers\bin\gperf.exe -m -M -J -c -C -D -E -T -f 0 -F 0,0 -a -o -t -p -K opname -L C++ -Z TAO_CORBA_StructDef_Perfect_Hash_OpTable -N lookup */
+unsigned int
+TAO_CORBA_StructDef_Perfect_Hash_OpTable::hash (const char *str, unsigned int len)
+{
+ static const unsigned char asso_values[] =
+ {
+#if defined (ACE_MVS)
+ 61, 61, 61, 61, 61, 61, 61, 61, 61, 61,
+ 61, 61, 61, 61, 61, 61, 61, 61, 61, 61,
+ 61, 61, 61, 61, 61, 61, 61, 61, 61, 61,
+ 61, 61, 61, 61, 61, 61, 61, 61, 61, 61,
+ 61, 61, 61, 61, 61, 61, 61, 61, 61, 61,
+ 61, 61, 61, 61, 61, 61, 61, 61, 61, 61,
+ 61, 61, 61, 61, 61, 61, 61, 61, 61, 61,
+ 61, 61, 61, 61, 61, 61, 61, 61, 61, 61,
+ 61, 61, 61, 61, 61, 61, 61, 61, 61, 61,
+ 61, 61, 61, 61, 61, 61, 61, 61, 61, 61,
+ 61, 61, 61, 61, 61, 61, 61, 61, 61, 0,
+ 61, 61, 61, 61, 61, 61, 61, 61, 61, 61,
+ 61, 61, 61, 61, 61, 61, 61, 61, 61, 0,
+ 61, 25, 8, 0, 61, 61, 61, 61, 61, 61,
+ 61, 61, 61, 61, 61, 61, 61, 0, 15, 5,
+ 61, 0, 61, 61, 61, 61, 61, 61, 61, 61,
+ 61, 61, 20, 20, 61, 61, 61, 15, 10, 61,
+ 61, 61, 61, 61, 61, 61, 61, 61, 61, 61,
+ 61, 61, 61, 61, 61, 61, 61, 61, 61, 61,
+ 61, 61, 61, 61, 61, 61, 61, 61, 61, 61,
+ 61, 61, 61, 61, 61, 61, 61, 61, 61, 61,
+ 61, 61, 61, 61, 61, 61, 61, 61, 61, 61,
+ 61, 61, 61, 61, 61, 61, 61, 61, 61, 61,
+ 61, 61, 61, 61, 61, 61, 61, 61, 61, 61,
+ 61, 61, 61, 61, 61, 61, 61, 61, 61, 61,
+ 61, 61, 61, 61, 61, 61,
+#else
+ 61, 61, 61, 61, 61, 61, 61, 61, 61, 61,
+ 61, 61, 61, 61, 61, 61, 61, 61, 61, 61,
+ 61, 61, 61, 61, 61, 61, 61, 61, 61, 61,
+ 61, 61, 61, 61, 61, 61, 61, 61, 61, 61,
+ 61, 61, 61, 61, 61, 61, 61, 61, 61, 61,
+ 61, 61, 61, 61, 61, 61, 61, 61, 61, 61,
+ 61, 61, 61, 61, 61, 61, 61, 61, 61, 61,
+ 61, 61, 61, 61, 61, 61, 61, 61, 61, 61,
+ 61, 61, 61, 61, 61, 61, 61, 61, 61, 61,
+ 61, 61, 61, 61, 61, 0, 61, 0, 61, 25,
+ 8, 0, 61, 61, 61, 61, 61, 61, 0, 15,
+ 5, 61, 0, 61, 61, 20, 20, 61, 61, 61,
+ 15, 10, 61, 61, 61, 61, 61, 61,
+#endif /* ACE_MVS */
+ };
+ return len + asso_values[(int) str[len - 1]] + asso_values[(int) str[0]];
+}
+
+const TAO_operation_db_entry *
+TAO_CORBA_StructDef_Perfect_Hash_OpTable::lookup (const char *str, unsigned int len)
+{
+ enum
+ {
+ TOTAL_KEYWORDS = 39,
+ MIN_WORD_LENGTH = 4,
+ MAX_WORD_LENGTH = 26,
+ MIN_HASH_VALUE = 5,
+ MAX_HASH_VALUE = 60,
+ HASH_VALUE_RANGE = 56,
+ DUPLICATES = 8,
+ WORDLIST_SIZE = 44
+ };
+
+ static const TAO_operation_db_entry wordlist[] =
+ {
+ {"",0,0},{"",0,0},{"",0,0},{"",0,0},{"",0,0},
+ {"_is_a", &POA_CORBA::StructDef::_is_a_skel, 0},
+ {"lookup", &POA_CORBA::StructDef::lookup_skel, 0},
+ {"_get_name", &POA_CORBA::StructDef::_get_name_skel, 0},
+ {"_get_type", &POA_CORBA::StructDef::_get_type_skel, 0},
+ {"_set_name", &POA_CORBA::StructDef::_set_name_skel, 0},
+ {"_interface", &POA_CORBA::StructDef::_interface_skel, 0},
+ {"lookup_name", &POA_CORBA::StructDef::lookup_name_skel, 0},
+ {"_get_id", &POA_CORBA::StructDef::_get_id_skel, 0},
+ {"_set_id", &POA_CORBA::StructDef::_set_id_skel, 0},
+ {"describe", &POA_CORBA::StructDef::describe_skel, 0},
+ {"_get_version", &POA_CORBA::StructDef::_get_version_skel, 0},
+ {"_set_version", &POA_CORBA::StructDef::_set_version_skel, 0},
+ {"_get_absolute_name", &POA_CORBA::StructDef::_get_absolute_name_skel, 0},
+ {"move", &POA_CORBA::StructDef::move_skel, 0},
+ {"_get_defined_in", &POA_CORBA::StructDef::_get_defined_in_skel, 0},
+ {"_get_def_kind", &POA_CORBA::StructDef::_get_def_kind_skel, 0},
+ {"_repository_id", &POA_CORBA::StructDef::_repository_id_skel, 0},
+ {"destroy", &POA_CORBA::StructDef::destroy_skel, 0},
+ {"_component", &POA_CORBA::StructDef::_component_skel, 0},
+ {"_get_members", &POA_CORBA::StructDef::_get_members_skel, 0},
+ {"_set_members", &POA_CORBA::StructDef::_set_members_skel, 0},
+ {"_non_existent", &POA_CORBA::StructDef::_non_existent_skel, 0},
+ {"_get_containing_repository", &POA_CORBA::StructDef::_get_containing_repository_skel, 0},
+ {"create_value", &POA_CORBA::StructDef::create_value_skel, 0},
+ {"create_module", &POA_CORBA::StructDef::create_module_skel, 0},
+ {"create_native", &POA_CORBA::StructDef::create_native_skel, 0},
+ {"create_interface", &POA_CORBA::StructDef::create_interface_skel, 0},
+ {"create_ext_value", &POA_CORBA::StructDef::create_ext_value_skel, 0},
+ {"create_union", &POA_CORBA::StructDef::create_union_skel, 0},
+ {"describe_contents", &POA_CORBA::StructDef::describe_contents_skel, 0},
+ {"create_exception", &POA_CORBA::StructDef::create_exception_skel, 0},
+ {"create_local_interface", &POA_CORBA::StructDef::create_local_interface_skel, 0},
+ {"create_abstract_interface", &POA_CORBA::StructDef::create_abstract_interface_skel, 0},
+ {"create_enum", &POA_CORBA::StructDef::create_enum_skel, 0},
+ {"contents", &POA_CORBA::StructDef::contents_skel, 0},
+ {"create_value_box", &POA_CORBA::StructDef::create_value_box_skel, 0},
+ {"create_alias", &POA_CORBA::StructDef::create_alias_skel, 0},
+ {"create_struct", &POA_CORBA::StructDef::create_struct_skel, 0},
+ {"create_constant", &POA_CORBA::StructDef::create_constant_skel, 0},
+ };
+
+ static const signed char lookup[] =
+ {
+ -1, -1, -1, -7, -3, 5, 6, -12, -2, -66, 10, 11, -1, -15,
+ -2, -68, 14, -64, 17, 18, 19, 20, 21, -1, -1, 22, -1, -1,
+ -24, -2, 23, -1, -64, 26, -29, -2, 27, 28, -64, -31, -2, -62,
+ 33, -1, -1, 34, 35, 36, -1, -1, 37, 38, -1, 39, -1, -1,
+ 40, 41, 42, -1, 43,
+ };
+
+ if (len <= MAX_WORD_LENGTH && len >= MIN_WORD_LENGTH)
+ {
+ unsigned int key = hash (str, len);
+
+ if (key <= MAX_HASH_VALUE && key >= MIN_HASH_VALUE)
+ {
+ int slot = lookup[key];
+
+ if (slot >= 0 && slot < WORDLIST_SIZE)
+ {
+ const char *s = wordlist[slot].opname;
+
+ if (*str == *s && !strncmp (str + 1, s + 1, len - 1))
+ return &wordlist[slot];
+ }
+ else if (slot < 0 && slot >= -MAX_HASH_VALUE)
+ return 0;
+ else
+ {
+ unsigned int offset = key + slot + (slot > 0 ? -MAX_HASH_VALUE : MAX_HASH_VALUE);
+ const TAO_operation_db_entry *base = &wordlist[-lookup[offset]];
+ const TAO_operation_db_entry *ptr = base + -lookup[offset + 1];
+
+ while (--ptr >= base)
+ if (*str == *ptr->opname && !strncmp (str + 1, ptr->opname + 1, len - 1))
+ return ptr;
+ }
+ }
+ }
+ return 0;
+}
+
+static TAO_CORBA_StructDef_Perfect_Hash_OpTable tao_CORBA_StructDef_optable;
+
+// TAO_IDL - Generated from
+// be\be_visitor_interface/interface_ss.cpp:966
+
+TAO::Collocation_Proxy_Broker *
+CORBA__TAO_StructDef_Proxy_Broker_Factory_function ( ::CORBA::Object_ptr)
+{
+ return reinterpret_cast<TAO::Collocation_Proxy_Broker *> (0xdead); // Dummy
+}
+
+int
+CORBA__TAO_StructDef_Proxy_Broker_Factory_Initializer (size_t)
+{
+ CORBA__TAO_StructDef_Proxy_Broker_Factory_function_pointer =
+ CORBA__TAO_StructDef_Proxy_Broker_Factory_function;
+
+ return 0;
+}
+
+static int
+CORBA__TAO_StructDef_Proxy_Broker_Stub_Factory_Initializer_Scarecrow =
+ CORBA__TAO_StructDef_Proxy_Broker_Factory_Initializer (
+ reinterpret_cast<size_t> (CORBA__TAO_StructDef_Proxy_Broker_Factory_Initializer)
+ );
+
+// TAO_IDL - Generated from
+// be\be_visitor_interface/interface_ss.cpp:103
+
+POA_CORBA::StructDef::StructDef (void)
+ : TAO_ServantBase ()
+{
+ this->optable_ = &tao_CORBA_StructDef_optable;
+}
+
+POA_CORBA::StructDef::StructDef (const StructDef& rhs)
+ : TAO_Abstract_ServantBase (rhs),
+ TAO_ServantBase (rhs),
+ POA_CORBA::IRObject (rhs),
+ POA_CORBA::Contained (rhs),
+ POA_CORBA::IDLType (rhs),
+ POA_CORBA::TypedefDef (rhs),
+ POA_CORBA::Container (rhs)
+{
+}
+
+POA_CORBA::StructDef::~StructDef (void)
+{
+}namespace POA_CORBA
+{
+
+
+ // TAO_IDL - Generated from
+ // be\be_visitor_operation/upcall_command_ss.cpp:127
+
+ class _get_members_StructDef
+ : public TAO::Upcall_Command
+ {
+ public:
+ inline _get_members_StructDef (
+ POA_CORBA::StructDef * servant,
+ TAO_Operation_Details const * operation_details,
+ TAO::Argument * const args[])
+ : servant_ (servant)
+ , operation_details_ (operation_details)
+ , args_ (args)
+ {
+ }
+
+ virtual void execute (ACE_ENV_SINGLE_ARG_DECL)
+ {
+ TAO::SArg_Traits< ::CORBA::StructMemberSeq>::ret_arg_type retval =
+ TAO::Portable_Server::get_ret_arg< ::CORBA::StructMemberSeq> (
+ this->operation_details_,
+ this->args_);
+
+ retval =
+ this->servant_->members (
+ ACE_ENV_SINGLE_ARG_PARAMETER);
+ ACE_CHECK;
+ }
+
+ private:
+ POA_CORBA::StructDef * const servant_;
+ TAO_Operation_Details const * const operation_details_;
+ TAO::Argument * const * const args_;
+ };
+}
+
+
+// TAO_IDL - Generated from
+// be\be_visitor_operation/operation_ss.cpp:190
+
+void POA_CORBA::StructDef::_get_members_skel (
+ TAO_ServerRequest & server_request,
+ void * TAO_INTERCEPTOR (servant_upcall),
+ void * servant
+ ACE_ENV_ARG_DECL
+ )
+{
+#if TAO_HAS_INTERCEPTORS == 1
+ static ::CORBA::TypeCode_ptr const * const exceptions = 0;
+ static ::CORBA::ULong const nexceptions = 0;
+#endif /* TAO_HAS_INTERCEPTORS */
+
+ TAO::SArg_Traits< ::CORBA::StructMemberSeq>::ret_val retval;
+
+ TAO::Argument * const args[] =
+ {
+ &retval
+ };
+
+ static size_t const nargs = 1;
+
+ POA_CORBA::StructDef * const impl =
+ static_cast<POA_CORBA::StructDef *> (servant);
+
+ _get_members_StructDef command (
+ impl,
+ server_request.operation_details (),
+ args);
+
+ TAO::Upcall_Wrapper upcall_wrapper;
+ upcall_wrapper.upcall (server_request
+ , args
+ , nargs
+ , command
+#if TAO_HAS_INTERCEPTORS == 1
+ , servant_upcall
+ , exceptions
+ , nexceptions
+#endif /* TAO_HAS_INTERCEPTORS == 1 */
+ ACE_ENV_ARG_PARAMETER);
+ ACE_CHECK;
+}namespace POA_CORBA
+{
+
+
+ // TAO_IDL - Generated from
+ // be\be_visitor_operation/upcall_command_ss.cpp:127
+
+ class _set_members_StructDef
+ : public TAO::Upcall_Command
+ {
+ public:
+ inline _set_members_StructDef (
+ POA_CORBA::StructDef * servant,
+ TAO_Operation_Details const * operation_details,
+ TAO::Argument * const args[])
+ : servant_ (servant)
+ , operation_details_ (operation_details)
+ , args_ (args)
+ {
+ }
+
+ virtual void execute (ACE_ENV_SINGLE_ARG_DECL)
+ {
+ TAO::SArg_Traits< ::CORBA::StructMemberSeq>::in_arg_type arg_1 =
+ TAO::Portable_Server::get_in_arg< ::CORBA::StructMemberSeq> (
+ this->operation_details_,
+ this->args_,
+ 1);
+
+ this->servant_->members (
+ arg_1
+ ACE_ENV_ARG_PARAMETER);
+ ACE_CHECK;
+ }
+
+ private:
+ POA_CORBA::StructDef * const servant_;
+ TAO_Operation_Details const * const operation_details_;
+ TAO::Argument * const * const args_;
+ };
+}
+
+
+// TAO_IDL - Generated from
+// be\be_visitor_operation/operation_ss.cpp:190
+
+void POA_CORBA::StructDef::_set_members_skel (
+ TAO_ServerRequest & server_request,
+ void * TAO_INTERCEPTOR (servant_upcall),
+ void * servant
+ ACE_ENV_ARG_DECL
+ )
+{
+#if TAO_HAS_INTERCEPTORS == 1
+ static ::CORBA::TypeCode_ptr const * const exceptions = 0;
+ static ::CORBA::ULong const nexceptions = 0;
+#endif /* TAO_HAS_INTERCEPTORS */
+
+ TAO::SArg_Traits< void>::ret_val retval;
+ TAO::SArg_Traits< ::CORBA::StructMemberSeq>::in_arg_val _tao_members;
+
+ TAO::Argument * const args[] =
+ {
+ &retval,
+ &_tao_members
+ };
+
+ static size_t const nargs = 2;
+
+ POA_CORBA::StructDef * const impl =
+ static_cast<POA_CORBA::StructDef *> (servant);
+
+ _set_members_StructDef command (
+ impl,
+ server_request.operation_details (),
+ args);
+
+ TAO::Upcall_Wrapper upcall_wrapper;
+ upcall_wrapper.upcall (server_request
+ , args
+ , nargs
+ , command
+#if TAO_HAS_INTERCEPTORS == 1
+ , servant_upcall
+ , exceptions
+ , nexceptions
+#endif /* TAO_HAS_INTERCEPTORS == 1 */
+ ACE_ENV_ARG_PARAMETER);
+ ACE_CHECK;
+}
+
+// TAO_IDL - Generated from
+// be\be_visitor_interface/interface_ss.cpp:169
+
+namespace POA_CORBA
+{
+
+
+ // TAO_IDL - Generated from
+ // be\be_visitor_operation/upcall_command_ss.cpp:127
+
+ class _is_a_StructDef_Upcall_Command
+ : public TAO::Upcall_Command
+ {
+ public:
+ inline _is_a_StructDef_Upcall_Command (
+ POA_CORBA::StructDef * servant,
+ TAO_Operation_Details const * operation_details,
+ TAO::Argument * const args[])
+ : servant_ (servant)
+ , operation_details_ (operation_details)
+ , args_ (args)
+ {
+ }
+
+ virtual void execute (ACE_ENV_SINGLE_ARG_DECL)
+ {
+ TAO::SArg_Traits< ::ACE_InputCDR::to_boolean>::ret_arg_type retval =
+ TAO::Portable_Server::get_ret_arg< ::ACE_InputCDR::to_boolean> (
+ this->operation_details_,
+ this->args_);
+
+ TAO::SArg_Traits< ::CORBA::Char *>::in_arg_type arg_1 =
+ TAO::Portable_Server::get_in_arg< ::CORBA::Char *> (
+ this->operation_details_,
+ this->args_,
+ 1);
+
+ retval =
+ this->servant_-> _is_a (
+ arg_1
+ ACE_ENV_ARG_PARAMETER);
+ ACE_CHECK;
+ }
+
+ private:
+ POA_CORBA::StructDef * const servant_;
+ TAO_Operation_Details const * const operation_details_;
+ TAO::Argument * const * const args_;
+ };
+}
+
+
+void POA_CORBA::StructDef::_is_a_skel (
+ TAO_ServerRequest & server_request,
+ void * TAO_INTERCEPTOR (servant_upcall),
+ void * servant
+ ACE_ENV_ARG_DECL
+ )
+{
+#if TAO_HAS_INTERCEPTORS == 1
+ static ::CORBA::TypeCode_ptr const * const exceptions = 0;
+ static ::CORBA::ULong const nexceptions = 0;
+#endif /* TAO_HAS_INTERCEPTORS */
+
+ TAO::SArg_Traits< ::ACE_InputCDR::to_boolean>::ret_val retval;
+ TAO::SArg_Traits< ::CORBA::Char *>::in_arg_val _tao_repository_id;
+
+ TAO::Argument * const args[] =
+ {
+ &retval,
+ &_tao_repository_id
+ };
+
+ static size_t const nargs = 2;
+
+ POA_CORBA::StructDef * const impl =
+ static_cast<POA_CORBA::StructDef *> (servant);
+
+ _is_a_StructDef_Upcall_Command command (
+ impl,
+ server_request.operation_details (),
+ args);
+
+ TAO::Upcall_Wrapper upcall_wrapper;
+ upcall_wrapper.upcall (server_request
+ , args
+ , nargs
+ , command
+#if TAO_HAS_INTERCEPTORS == 1
+ , servant_upcall
+ , exceptions
+ , nexceptions
+#endif /* TAO_HAS_INTERCEPTORS == 1 */
+ ACE_ENV_ARG_PARAMETER);
+ ACE_CHECK;
+}namespace POA_CORBA
+{
+
+
+ // TAO_IDL - Generated from
+ // be\be_visitor_operation/upcall_command_ss.cpp:127
+
+ class _non_existent_StructDef_Upcall_Command
+ : public TAO::Upcall_Command
+ {
+ public:
+ inline _non_existent_StructDef_Upcall_Command (
+ POA_CORBA::StructDef * servant,
+ TAO_Operation_Details const * operation_details,
+ TAO::Argument * const args[])
+ : servant_ (servant)
+ , operation_details_ (operation_details)
+ , args_ (args)
+ {
+ }
+
+ virtual void execute (ACE_ENV_SINGLE_ARG_DECL)
+ {
+ TAO::SArg_Traits< ::ACE_InputCDR::to_boolean>::ret_arg_type retval =
+ TAO::Portable_Server::get_ret_arg< ::ACE_InputCDR::to_boolean> (
+ this->operation_details_,
+ this->args_);
+
+ retval =
+ this->servant_-> _non_existent (
+ ACE_ENV_SINGLE_ARG_PARAMETER);
+ ACE_CHECK;
+ }
+
+ private:
+ POA_CORBA::StructDef * const servant_;
+ TAO_Operation_Details const * const operation_details_;
+ TAO::Argument * const * const args_;
+ };
+}
+
+
+void POA_CORBA::StructDef::_non_existent_skel (
+ TAO_ServerRequest & server_request,
+ void * TAO_INTERCEPTOR (servant_upcall),
+ void * servant
+ ACE_ENV_ARG_DECL
+ )
+{
+#if TAO_HAS_INTERCEPTORS == 1
+ static ::CORBA::TypeCode_ptr const * const exceptions = 0;
+ static ::CORBA::ULong const nexceptions = 0;
+#endif /* TAO_HAS_INTERCEPTORS */
+
+ TAO::SArg_Traits< ::ACE_InputCDR::to_boolean>::ret_val retval;
+
+ TAO::Argument * const args[] =
+ {
+ &retval
+ };
+
+ static size_t const nargs = 1;
+
+ POA_CORBA::StructDef * const impl =
+ static_cast<POA_CORBA::StructDef *> (servant);
+
+ _non_existent_StructDef_Upcall_Command command (
+ impl,
+ server_request.operation_details (),
+ args);
+
+ TAO::Upcall_Wrapper upcall_wrapper;
+ upcall_wrapper.upcall (server_request
+ , args
+ , nargs
+ , command
+#if TAO_HAS_INTERCEPTORS == 1
+ , servant_upcall
+ , exceptions
+ , nexceptions
+#endif /* TAO_HAS_INTERCEPTORS == 1 */
+ ACE_ENV_ARG_PARAMETER);
+ ACE_CHECK;
+}namespace POA_CORBA
+{
+
+
+ // TAO_IDL - Generated from
+ // be\be_visitor_operation/upcall_command_ss.cpp:127
+
+ class _repository_id_StructDef_Upcall_Command
+ : public TAO::Upcall_Command
+ {
+ public:
+ inline _repository_id_StructDef_Upcall_Command (
+ POA_CORBA::StructDef * servant,
+ TAO_Operation_Details const * operation_details,
+ TAO::Argument * const args[])
+ : servant_ (servant)
+ , operation_details_ (operation_details)
+ , args_ (args)
+ {
+ }
+
+ virtual void execute (ACE_ENV_SINGLE_ARG_DECL)
+ {
+ TAO::SArg_Traits< ::CORBA::Char *>::ret_arg_type retval =
+ TAO::Portable_Server::get_ret_arg< ::CORBA::Char *> (
+ this->operation_details_,
+ this->args_);
+
+ retval =
+ this->servant_-> _repository_id (
+ ACE_ENV_SINGLE_ARG_PARAMETER);
+ ACE_CHECK;
+ }
+
+ private:
+ POA_CORBA::StructDef * const servant_;
+ TAO_Operation_Details const * const operation_details_;
+ TAO::Argument * const * const args_;
+ };
+}
+
+
+void POA_CORBA::StructDef::_repository_id_skel (
+ TAO_ServerRequest & server_request,
+ void * TAO_INTERCEPTOR (servant_upcall),
+ void * servant
+ ACE_ENV_ARG_DECL
+ )
+{
+#if TAO_HAS_INTERCEPTORS == 1
+ static ::CORBA::TypeCode_ptr const * const exceptions = 0;
+ static ::CORBA::ULong const nexceptions = 0;
+#endif /* TAO_HAS_INTERCEPTORS */
+
+ TAO::SArg_Traits< ::CORBA::Char *>::ret_val retval;
+
+ TAO::Argument * const args[] =
+ {
+ &retval
+ };
+
+ static size_t const nargs = 1;
+
+ POA_CORBA::StructDef * const impl =
+ static_cast<POA_CORBA::StructDef *> (servant);
+
+ _repository_id_StructDef_Upcall_Command command (
+ impl,
+ server_request.operation_details (),
+ args);
+
+ TAO::Upcall_Wrapper upcall_wrapper;
+ upcall_wrapper.upcall (server_request
+ , args
+ , nargs
+ , command
+#if TAO_HAS_INTERCEPTORS == 1
+ , servant_upcall
+ , exceptions
+ , nexceptions
+#endif /* TAO_HAS_INTERCEPTORS == 1 */
+ ACE_ENV_ARG_PARAMETER);
+ ACE_CHECK;
+}
+
+// TAO_IDL - Generated from
+// be\be_visitor_interface/interface_ss.cpp:513
+
+void POA_CORBA::StructDef::_interface_skel (
+ TAO_ServerRequest & server_request,
+ void * /* servant_upcall */,
+ void * servant
+ ACE_ENV_ARG_DECL
+ )
+{
+ TAO_IFR_Client_Adapter *_tao_adapter =
+ ACE_Dynamic_Service<TAO_IFR_Client_Adapter>::instance (
+ TAO_ORB_Core::ifr_client_adapter_name ()
+ );
+
+ if (_tao_adapter == 0)
+ {
+ ACE_THROW ( ::CORBA::INTF_REPOS ( ::CORBA::OMGVMCID | 1,
+ ::CORBA::COMPLETED_NO));
+ }
+
+ POA_CORBA::StructDef * const impl =
+ static_cast<POA_CORBA::StructDef *> (servant);
+ ::CORBA::InterfaceDef_ptr _tao_retval =
+ impl->_get_interface (ACE_ENV_SINGLE_ARG_PARAMETER);
+ ACE_CHECK;
+
+ server_request.init_reply ();
+ TAO_OutputCDR &_tao_out = *server_request.outgoing ();
+
+ ::CORBA::Boolean const _tao_result =
+ _tao_adapter->interfacedef_cdr_insert (
+ _tao_out,
+ _tao_retval
+ );
+
+ _tao_adapter->dispose (_tao_retval);
+
+ if (_tao_result == false)
+ {
+ ACE_THROW ( ::CORBA::MARSHAL ());
+ }
+}namespace POA_CORBA
+{
+
+
+ // TAO_IDL - Generated from
+ // be\be_visitor_operation/upcall_command_ss.cpp:127
+
+ class _get_component_StructDef_Upcall_Command
+ : public TAO::Upcall_Command
+ {
+ public:
+ inline _get_component_StructDef_Upcall_Command (
+ POA_CORBA::StructDef * servant,
+ TAO_Operation_Details const * operation_details,
+ TAO::Argument * const args[])
+ : servant_ (servant)
+ , operation_details_ (operation_details)
+ , args_ (args)
+ {
+ }
+
+ virtual void execute (ACE_ENV_SINGLE_ARG_DECL)
+ {
+ TAO::SArg_Traits< ::CORBA::Object>::ret_arg_type retval =
+ TAO::Portable_Server::get_ret_arg< ::CORBA::Object> (
+ this->operation_details_,
+ this->args_);
+
+ retval =
+ this->servant_-> _get_component (
+ ACE_ENV_SINGLE_ARG_PARAMETER);
+ ACE_CHECK;
+ }
+
+ private:
+ POA_CORBA::StructDef * const servant_;
+ TAO_Operation_Details const * const operation_details_;
+ TAO::Argument * const * const args_;
+ };
+}
+
+
+void POA_CORBA::StructDef::_component_skel (
+ TAO_ServerRequest & server_request,
+ void * TAO_INTERCEPTOR (servant_upcall),
+ void * servant
+ ACE_ENV_ARG_DECL
+ )
+{
+#if TAO_HAS_INTERCEPTORS == 1
+ static ::CORBA::TypeCode_ptr const * const exceptions = 0;
+ static ::CORBA::ULong const nexceptions = 0;
+#endif /* TAO_HAS_INTERCEPTORS */
+
+ TAO::SArg_Traits< ::CORBA::Object>::ret_val retval;
+
+ TAO::Argument * const args[] =
+ {
+ &retval
+ };
+
+ static size_t const nargs = 1;
+
+ POA_CORBA::StructDef * const impl =
+ static_cast<POA_CORBA::StructDef *> (servant);
+
+ _get_component_StructDef_Upcall_Command command (
+ impl,
+ server_request.operation_details (),
+ args);
+
+ TAO::Upcall_Wrapper upcall_wrapper;
+ upcall_wrapper.upcall (server_request
+ , args
+ , nargs
+ , command
+#if TAO_HAS_INTERCEPTORS == 1
+ , servant_upcall
+ , exceptions
+ , nexceptions
+#endif /* TAO_HAS_INTERCEPTORS == 1 */
+ ACE_ENV_ARG_PARAMETER);
+ ACE_CHECK;
+}
+
+::CORBA::Boolean POA_CORBA::StructDef::_is_a (
+ const char* value
+ ACE_ENV_ARG_DECL_NOT_USED
+ )
+{
+ return
+ (
+ !ACE_OS::strcmp (
+ value,
+ "IDL:omg.org/CORBA/IRObject:1.0"
+ ) ||
+ !ACE_OS::strcmp (
+ value,
+ "IDL:omg.org/CORBA/Contained:1.0"
+ ) ||
+ !ACE_OS::strcmp (
+ value,
+ "IDL:omg.org/CORBA/IDLType:1.0"
+ ) ||
+ !ACE_OS::strcmp (
+ value,
+ "IDL:omg.org/CORBA/TypedefDef:1.0"
+ ) ||
+ !ACE_OS::strcmp (
+ value,
+ "IDL:omg.org/CORBA/Container:1.0"
+ ) ||
+ !ACE_OS::strcmp (
+ value,
+ "IDL:omg.org/CORBA/StructDef:1.0"
+ ) ||
+ !ACE_OS::strcmp (
+ value,
+ "IDL:omg.org/CORBA/Object:1.0"
+ )
+ );
+}
+
+const char* POA_CORBA::StructDef::_interface_repository_id (void) const
+{
+ return "IDL:omg.org/CORBA/StructDef:1.0";
+}
+
+// TAO_IDL - Generated from
+// be\be_visitor_interface/interface_ss.cpp:903
+
+void POA_CORBA::StructDef::_dispatch (
+ TAO_ServerRequest & req,
+ void * servant_upcall
+ ACE_ENV_ARG_DECL
+ )
+{
+ this->synchronous_upcall_dispatch (req,
+ servant_upcall,
+ this
+ ACE_ENV_ARG_PARAMETER);
+}
+
+// TAO_IDL - Generated from
+// be\be_visitor_interface/interface_ss.cpp:851
+
+CORBA::StructDef *
+POA_CORBA::StructDef::_this (ACE_ENV_SINGLE_ARG_DECL)
+{
+ TAO_Stub *stub = this->_create_stub (ACE_ENV_SINGLE_ARG_PARAMETER);
+ ACE_CHECK_RETURN (0);
+
+ TAO_Stub_Auto_Ptr safe_stub (stub);
+ ::CORBA::Object_ptr tmp = CORBA::Object::_nil ();
+
+ ::CORBA::Boolean const _tao_opt_colloc =
+ stub->servant_orb_var ()->orb_core ()->optimize_collocation_objects ();
+
+ ACE_NEW_RETURN (
+ tmp,
+ ::CORBA::Object (stub, _tao_opt_colloc, this),
+ 0
+ );
+
+ ::CORBA::Object_var obj = tmp;
+ (void) safe_stub.release ();
+
+ typedef ::CORBA::StructDef STUB_SCOPED_NAME;
+ return
+ TAO::Narrow_Utils<STUB_SCOPED_NAME>::unchecked_narrow (
+ obj.in (),
+ CORBA__TAO_StructDef_Proxy_Broker_Factory_function_pointer
+ );
+}
+
+// TAO_IDL - Generated from
+// be\be_interface.cpp:1499
+
+class TAO_CORBA_UnionDef_Perfect_Hash_OpTable
+ : public TAO_Perfect_Hash_OpTable
+{
+private:
+ unsigned int hash (const char *str, unsigned int len);
+
+public:
+ const TAO_operation_db_entry * lookup (const char *str, unsigned int len);
+};
+
+/* C++ code produced by gperf version 2.8 (ACE version) */
+/* Command-line: C:\ACE\latest\ACE_wrappers\bin\gperf.exe -m -M -J -c -C -D -E -T -f 0 -F 0,0 -a -o -t -p -K opname -L C++ -Z TAO_CORBA_UnionDef_Perfect_Hash_OpTable -N lookup */
+unsigned int
+TAO_CORBA_UnionDef_Perfect_Hash_OpTable::hash (const char *str, unsigned int len)
+{
+ static const unsigned char asso_values[] =
+ {
+#if defined (ACE_MVS)
+ 86, 86, 86, 86, 86, 86, 86, 86, 86, 86,
+ 86, 86, 86, 86, 86, 86, 86, 86, 86, 86,
+ 86, 86, 86, 86, 86, 86, 86, 86, 86, 86,
+ 86, 86, 86, 86, 86, 86, 86, 86, 86, 86,
+ 86, 86, 86, 86, 86, 86, 86, 86, 86, 86,
+ 86, 86, 86, 86, 86, 86, 86, 86, 86, 86,
+ 86, 86, 86, 86, 86, 86, 86, 86, 86, 86,
+ 86, 86, 86, 86, 86, 86, 86, 86, 86, 86,
+ 86, 86, 86, 86, 86, 86, 86, 86, 86, 86,
+ 86, 86, 86, 86, 86, 86, 86, 86, 86, 86,
+ 86, 86, 86, 86, 86, 86, 86, 86, 86, 0,
+ 86, 86, 86, 86, 86, 86, 86, 86, 86, 86,
+ 86, 86, 86, 86, 86, 86, 86, 86, 86, 0,
+ 86, 25, 35, 0, 35, 86, 86, 86, 86, 86,
+ 86, 86, 86, 86, 86, 86, 86, 0, 0, 15,
+ 86, 0, 86, 86, 86, 86, 86, 86, 86, 86,
+ 86, 86, 20, 45, 86, 86, 86, 5, 25, 86,
+ 86, 86, 86, 86, 86, 86, 86, 86, 86, 86,
+ 86, 86, 86, 86, 86, 86, 86, 86, 86, 86,
+ 86, 86, 86, 86, 86, 86, 86, 86, 86, 86,
+ 86, 86, 86, 86, 86, 86, 86, 86, 86, 86,
+ 86, 86, 86, 86, 86, 86, 86, 86, 86, 86,
+ 86, 86, 86, 86, 86, 86, 86, 86, 86, 86,
+ 86, 86, 86, 86, 86, 86, 86, 86, 86, 86,
+ 86, 86, 86, 86, 86, 86, 86, 86, 86, 86,
+ 86, 86, 86, 86, 86, 86,
+#else
+ 86, 86, 86, 86, 86, 86, 86, 86, 86, 86,
+ 86, 86, 86, 86, 86, 86, 86, 86, 86, 86,
+ 86, 86, 86, 86, 86, 86, 86, 86, 86, 86,
+ 86, 86, 86, 86, 86, 86, 86, 86, 86, 86,
+ 86, 86, 86, 86, 86, 86, 86, 86, 86, 86,
+ 86, 86, 86, 86, 86, 86, 86, 86, 86, 86,
+ 86, 86, 86, 86, 86, 86, 86, 86, 86, 86,
+ 86, 86, 86, 86, 86, 86, 86, 86, 86, 86,
+ 86, 86, 86, 86, 86, 86, 86, 86, 86, 86,
+ 86, 86, 86, 86, 86, 0, 86, 0, 86, 25,
+ 35, 0, 35, 86, 86, 86, 86, 86, 0, 0,
+ 15, 86, 0, 86, 86, 20, 45, 86, 86, 86,
+ 5, 25, 86, 86, 86, 86, 86, 86,
+#endif /* ACE_MVS */
+ };
+ return len + asso_values[(int) str[len - 1]] + asso_values[(int) str[0]];
+}
+
+const TAO_operation_db_entry *
+TAO_CORBA_UnionDef_Perfect_Hash_OpTable::lookup (const char *str, unsigned int len)
+{
+ enum
+ {
+ TOTAL_KEYWORDS = 42,
+ MIN_WORD_LENGTH = 4,
+ MAX_WORD_LENGTH = 27,
+ MIN_HASH_VALUE = 4,
+ MAX_HASH_VALUE = 85,
+ HASH_VALUE_RANGE = 82,
+ DUPLICATES = 9,
+ WORDLIST_SIZE = 46
+ };
+
+ static const TAO_operation_db_entry wordlist[] =
+ {
+ {"",0,0},{"",0,0},{"",0,0},{"",0,0},
+ {"move", &POA_CORBA::UnionDef::move_skel, 0},
+ {"_is_a", &POA_CORBA::UnionDef::_is_a_skel, 0},
+ {"lookup", &POA_CORBA::UnionDef::lookup_skel, 0},
+ {"_get_name", &POA_CORBA::UnionDef::_get_name_skel, 0},
+ {"_get_type", &POA_CORBA::UnionDef::_get_type_skel, 0},
+ {"_set_name", &POA_CORBA::UnionDef::_set_name_skel, 0},
+ {"_interface", &POA_CORBA::UnionDef::_interface_skel, 0},
+ {"lookup_name", &POA_CORBA::UnionDef::lookup_name_skel, 0},
+ {"_get_absolute_name", &POA_CORBA::UnionDef::_get_absolute_name_skel, 0},
+ {"_get_discriminator_type", &POA_CORBA::UnionDef::_get_discriminator_type_skel, 0},
+ {"_get_version", &POA_CORBA::UnionDef::_get_version_skel, 0},
+ {"_set_version", &POA_CORBA::UnionDef::_set_version_skel, 0},
+ {"_get_defined_in", &POA_CORBA::UnionDef::_get_defined_in_skel, 0},
+ {"_get_members", &POA_CORBA::UnionDef::_get_members_skel, 0},
+ {"_set_members", &POA_CORBA::UnionDef::_set_members_skel, 0},
+ {"create_enum", &POA_CORBA::UnionDef::create_enum_skel, 0},
+ {"create_value", &POA_CORBA::UnionDef::create_value_skel, 0},
+ {"create_module", &POA_CORBA::UnionDef::create_module_skel, 0},
+ {"create_native", &POA_CORBA::UnionDef::create_native_skel, 0},
+ {"create_interface", &POA_CORBA::UnionDef::create_interface_skel, 0},
+ {"create_ext_value", &POA_CORBA::UnionDef::create_ext_value_skel, 0},
+ {"_get_id", &POA_CORBA::UnionDef::_get_id_skel, 0},
+ {"_set_id", &POA_CORBA::UnionDef::_set_id_skel, 0},
+ {"describe", &POA_CORBA::UnionDef::describe_skel, 0},
+ {"create_value_box", &POA_CORBA::UnionDef::create_value_box_skel, 0},
+ {"create_local_interface", &POA_CORBA::UnionDef::create_local_interface_skel, 0},
+ {"_get_def_kind", &POA_CORBA::UnionDef::_get_def_kind_skel, 0},
+ {"_repository_id", &POA_CORBA::UnionDef::_repository_id_skel, 0},
+ {"create_abstract_interface", &POA_CORBA::UnionDef::create_abstract_interface_skel, 0},
+ {"_get_containing_repository", &POA_CORBA::UnionDef::_get_containing_repository_skel, 0},
+ {"create_union", &POA_CORBA::UnionDef::create_union_skel, 0},
+ {"contents", &POA_CORBA::UnionDef::contents_skel, 0},
+ {"_component", &POA_CORBA::UnionDef::_component_skel, 0},
+ {"create_exception", &POA_CORBA::UnionDef::create_exception_skel, 0},
+ {"create_alias", &POA_CORBA::UnionDef::create_alias_skel, 0},
+ {"_non_existent", &POA_CORBA::UnionDef::_non_existent_skel, 0},
+ {"_get_discriminator_type_def", &POA_CORBA::UnionDef::_get_discriminator_type_def_skel, 0},
+ {"_set_discriminator_type_def", &POA_CORBA::UnionDef::_set_discriminator_type_def_skel, 0},
+ {"destroy", &POA_CORBA::UnionDef::destroy_skel, 0},
+ {"describe_contents", &POA_CORBA::UnionDef::describe_contents_skel, 0},
+ {"create_struct", &POA_CORBA::UnionDef::create_struct_skel, 0},
+ {"create_constant", &POA_CORBA::UnionDef::create_constant_skel, 0},
+ };
+
+ static const signed char lookup[] =
+ {
+ -1, -1, -1, -1, 4, 5, 6, -7, -3, -87, 10, 11, -1, -1,
+ -1, -1, -1, -1, 12, -1, -1, -14, -2, 13, -1, -17, -2, -91,
+ -21, -2, 16, -1, -92, -1, -23, -2, 19, 20, -95, -25, -2, -92,
+ -88, 27, -1, -1, 28, 29, 30, 31, 32, 33, 34, 35, -1, 36,
+ 37, 38, 39, -1, -40, -2, -87, -1, -1, -1, -1, 42, -1, -1,
+ -1, -1, 43, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 44,
+ -1, 45,
+ };
+
+ if (len <= MAX_WORD_LENGTH && len >= MIN_WORD_LENGTH)
+ {
+ unsigned int key = hash (str, len);
+
+ if (key <= MAX_HASH_VALUE && key >= MIN_HASH_VALUE)
+ {
+ int slot = lookup[key];
+
+ if (slot >= 0 && slot < WORDLIST_SIZE)
+ {
+ const char *s = wordlist[slot].opname;
+
+ if (*str == *s && !strncmp (str + 1, s + 1, len - 1))
+ return &wordlist[slot];
+ }
+ else if (slot < 0 && slot >= -MAX_HASH_VALUE)
+ return 0;
+ else
+ {
+ unsigned int offset = key + slot + (slot > 0 ? -MAX_HASH_VALUE : MAX_HASH_VALUE);
+ const TAO_operation_db_entry *base = &wordlist[-lookup[offset]];
+ const TAO_operation_db_entry *ptr = base + -lookup[offset + 1];
+
+ while (--ptr >= base)
+ if (*str == *ptr->opname && !strncmp (str + 1, ptr->opname + 1, len - 1))
+ return ptr;
+ }
+ }
+ }
+ return 0;
+}
+
+static TAO_CORBA_UnionDef_Perfect_Hash_OpTable tao_CORBA_UnionDef_optable;
+
+// TAO_IDL - Generated from
+// be\be_visitor_interface/interface_ss.cpp:966
+
+TAO::Collocation_Proxy_Broker *
+CORBA__TAO_UnionDef_Proxy_Broker_Factory_function ( ::CORBA::Object_ptr)
+{
+ return reinterpret_cast<TAO::Collocation_Proxy_Broker *> (0xdead); // Dummy
+}
+
+int
+CORBA__TAO_UnionDef_Proxy_Broker_Factory_Initializer (size_t)
+{
+ CORBA__TAO_UnionDef_Proxy_Broker_Factory_function_pointer =
+ CORBA__TAO_UnionDef_Proxy_Broker_Factory_function;
+
+ return 0;
+}
+
+static int
+CORBA__TAO_UnionDef_Proxy_Broker_Stub_Factory_Initializer_Scarecrow =
+ CORBA__TAO_UnionDef_Proxy_Broker_Factory_Initializer (
+ reinterpret_cast<size_t> (CORBA__TAO_UnionDef_Proxy_Broker_Factory_Initializer)
+ );
+
+// TAO_IDL - Generated from
+// be\be_visitor_interface/interface_ss.cpp:103
+
+POA_CORBA::UnionDef::UnionDef (void)
+ : TAO_ServantBase ()
+{
+ this->optable_ = &tao_CORBA_UnionDef_optable;
+}
+
+POA_CORBA::UnionDef::UnionDef (const UnionDef& rhs)
+ : TAO_Abstract_ServantBase (rhs),
+ TAO_ServantBase (rhs),
+ POA_CORBA::IRObject (rhs),
+ POA_CORBA::Contained (rhs),
+ POA_CORBA::IDLType (rhs),
+ POA_CORBA::TypedefDef (rhs),
+ POA_CORBA::Container (rhs)
+{
+}
+
+POA_CORBA::UnionDef::~UnionDef (void)
+{
+}namespace POA_CORBA
+{
+
+
+ // TAO_IDL - Generated from
+ // be\be_visitor_operation/upcall_command_ss.cpp:127
+
+ class _get_discriminator_type_UnionDef
+ : public TAO::Upcall_Command
+ {
+ public:
+ inline _get_discriminator_type_UnionDef (
+ POA_CORBA::UnionDef * servant,
+ TAO_Operation_Details const * operation_details,
+ TAO::Argument * const args[])
+ : servant_ (servant)
+ , operation_details_ (operation_details)
+ , args_ (args)
+ {
+ }
+
+ virtual void execute (ACE_ENV_SINGLE_ARG_DECL)
+ {
+ TAO::SArg_Traits< ::CORBA::TypeCode>::ret_arg_type retval =
+ TAO::Portable_Server::get_ret_arg< ::CORBA::TypeCode> (
+ this->operation_details_,
+ this->args_);
+
+ retval =
+ this->servant_->discriminator_type (
+ ACE_ENV_SINGLE_ARG_PARAMETER);
+ ACE_CHECK;
+ }
+
+ private:
+ POA_CORBA::UnionDef * const servant_;
+ TAO_Operation_Details const * const operation_details_;
+ TAO::Argument * const * const args_;
+ };
+}
+
+
+// TAO_IDL - Generated from
+// be\be_visitor_operation/operation_ss.cpp:190
+
+void POA_CORBA::UnionDef::_get_discriminator_type_skel (
+ TAO_ServerRequest & server_request,
+ void * TAO_INTERCEPTOR (servant_upcall),
+ void * servant
+ ACE_ENV_ARG_DECL
+ )
+{
+#if TAO_HAS_INTERCEPTORS == 1
+ static ::CORBA::TypeCode_ptr const * const exceptions = 0;
+ static ::CORBA::ULong const nexceptions = 0;
+#endif /* TAO_HAS_INTERCEPTORS */
+
+ TAO::SArg_Traits< ::CORBA::TypeCode>::ret_val retval;
+
+ TAO::Argument * const args[] =
+ {
+ &retval
+ };
+
+ static size_t const nargs = 1;
+
+ POA_CORBA::UnionDef * const impl =
+ static_cast<POA_CORBA::UnionDef *> (servant);
+
+ _get_discriminator_type_UnionDef command (
+ impl,
+ server_request.operation_details (),
+ args);
+
+ TAO::Upcall_Wrapper upcall_wrapper;
+ upcall_wrapper.upcall (server_request
+ , args
+ , nargs
+ , command
+#if TAO_HAS_INTERCEPTORS == 1
+ , servant_upcall
+ , exceptions
+ , nexceptions
+#endif /* TAO_HAS_INTERCEPTORS == 1 */
+ ACE_ENV_ARG_PARAMETER);
+ ACE_CHECK;
+}namespace POA_CORBA
+{
+
+
+ // TAO_IDL - Generated from
+ // be\be_visitor_operation/upcall_command_ss.cpp:127
+
+ class _get_discriminator_type_def_UnionDef
+ : public TAO::Upcall_Command
+ {
+ public:
+ inline _get_discriminator_type_def_UnionDef (
+ POA_CORBA::UnionDef * servant,
+ TAO_Operation_Details const * operation_details,
+ TAO::Argument * const args[])
+ : servant_ (servant)
+ , operation_details_ (operation_details)
+ , args_ (args)
+ {
+ }
+
+ virtual void execute (ACE_ENV_SINGLE_ARG_DECL)
+ {
+ TAO::SArg_Traits< ::CORBA::IDLType>::ret_arg_type retval =
+ TAO::Portable_Server::get_ret_arg< ::CORBA::IDLType> (
+ this->operation_details_,
+ this->args_);
+
+ retval =
+ this->servant_->discriminator_type_def (
+ ACE_ENV_SINGLE_ARG_PARAMETER);
+ ACE_CHECK;
+ }
+
+ private:
+ POA_CORBA::UnionDef * const servant_;
+ TAO_Operation_Details const * const operation_details_;
+ TAO::Argument * const * const args_;
+ };
+}
+
+
+// TAO_IDL - Generated from
+// be\be_visitor_operation/operation_ss.cpp:190
+
+void POA_CORBA::UnionDef::_get_discriminator_type_def_skel (
+ TAO_ServerRequest & server_request,
+ void * TAO_INTERCEPTOR (servant_upcall),
+ void * servant
+ ACE_ENV_ARG_DECL
+ )
+{
+#if TAO_HAS_INTERCEPTORS == 1
+ static ::CORBA::TypeCode_ptr const * const exceptions = 0;
+ static ::CORBA::ULong const nexceptions = 0;
+#endif /* TAO_HAS_INTERCEPTORS */
+
+ TAO::SArg_Traits< ::CORBA::IDLType>::ret_val retval;
+
+ TAO::Argument * const args[] =
+ {
+ &retval
+ };
+
+ static size_t const nargs = 1;
+
+ POA_CORBA::UnionDef * const impl =
+ static_cast<POA_CORBA::UnionDef *> (servant);
+
+ _get_discriminator_type_def_UnionDef command (
+ impl,
+ server_request.operation_details (),
+ args);
+
+ TAO::Upcall_Wrapper upcall_wrapper;
+ upcall_wrapper.upcall (server_request
+ , args
+ , nargs
+ , command
+#if TAO_HAS_INTERCEPTORS == 1
+ , servant_upcall
+ , exceptions
+ , nexceptions
+#endif /* TAO_HAS_INTERCEPTORS == 1 */
+ ACE_ENV_ARG_PARAMETER);
+ ACE_CHECK;
+}namespace POA_CORBA
+{
+
+
+ // TAO_IDL - Generated from
+ // be\be_visitor_operation/upcall_command_ss.cpp:127
+
+ class _set_discriminator_type_def_UnionDef
+ : public TAO::Upcall_Command
+ {
+ public:
+ inline _set_discriminator_type_def_UnionDef (
+ POA_CORBA::UnionDef * servant,
+ TAO_Operation_Details const * operation_details,
+ TAO::Argument * const args[])
+ : servant_ (servant)
+ , operation_details_ (operation_details)
+ , args_ (args)
+ {
+ }
+
+ virtual void execute (ACE_ENV_SINGLE_ARG_DECL)
+ {
+ TAO::SArg_Traits< ::CORBA::IDLType>::in_arg_type arg_1 =
+ TAO::Portable_Server::get_in_arg< ::CORBA::IDLType> (
+ this->operation_details_,
+ this->args_,
+ 1);
+
+ this->servant_->discriminator_type_def (
+ arg_1
+ ACE_ENV_ARG_PARAMETER);
+ ACE_CHECK;
+ }
+
+ private:
+ POA_CORBA::UnionDef * const servant_;
+ TAO_Operation_Details const * const operation_details_;
+ TAO::Argument * const * const args_;
+ };
+}
+
+
+// TAO_IDL - Generated from
+// be\be_visitor_operation/operation_ss.cpp:190
+
+void POA_CORBA::UnionDef::_set_discriminator_type_def_skel (
+ TAO_ServerRequest & server_request,
+ void * TAO_INTERCEPTOR (servant_upcall),
+ void * servant
+ ACE_ENV_ARG_DECL
+ )
+{
+#if TAO_HAS_INTERCEPTORS == 1
+ static ::CORBA::TypeCode_ptr const * const exceptions = 0;
+ static ::CORBA::ULong const nexceptions = 0;
+#endif /* TAO_HAS_INTERCEPTORS */
+
+ TAO::SArg_Traits< void>::ret_val retval;
+ TAO::SArg_Traits< ::CORBA::IDLType>::in_arg_val _tao_discriminator_type_def;
+
+ TAO::Argument * const args[] =
+ {
+ &retval,
+ &_tao_discriminator_type_def
+ };
+
+ static size_t const nargs = 2;
+
+ POA_CORBA::UnionDef * const impl =
+ static_cast<POA_CORBA::UnionDef *> (servant);
+
+ _set_discriminator_type_def_UnionDef command (
+ impl,
+ server_request.operation_details (),
+ args);
+
+ TAO::Upcall_Wrapper upcall_wrapper;
+ upcall_wrapper.upcall (server_request
+ , args
+ , nargs
+ , command
+#if TAO_HAS_INTERCEPTORS == 1
+ , servant_upcall
+ , exceptions
+ , nexceptions
+#endif /* TAO_HAS_INTERCEPTORS == 1 */
+ ACE_ENV_ARG_PARAMETER);
+ ACE_CHECK;
+}namespace POA_CORBA
+{
+
+
+ // TAO_IDL - Generated from
+ // be\be_visitor_operation/upcall_command_ss.cpp:127
+
+ class _get_members_UnionDef
+ : public TAO::Upcall_Command
+ {
+ public:
+ inline _get_members_UnionDef (
+ POA_CORBA::UnionDef * servant,
+ TAO_Operation_Details const * operation_details,
+ TAO::Argument * const args[])
+ : servant_ (servant)
+ , operation_details_ (operation_details)
+ , args_ (args)
+ {
+ }
+
+ virtual void execute (ACE_ENV_SINGLE_ARG_DECL)
+ {
+ TAO::SArg_Traits< ::CORBA::UnionMemberSeq>::ret_arg_type retval =
+ TAO::Portable_Server::get_ret_arg< ::CORBA::UnionMemberSeq> (
+ this->operation_details_,
+ this->args_);
+
+ retval =
+ this->servant_->members (
+ ACE_ENV_SINGLE_ARG_PARAMETER);
+ ACE_CHECK;
+ }
+
+ private:
+ POA_CORBA::UnionDef * const servant_;
+ TAO_Operation_Details const * const operation_details_;
+ TAO::Argument * const * const args_;
+ };
+}
+
+
+// TAO_IDL - Generated from
+// be\be_visitor_operation/operation_ss.cpp:190
+
+void POA_CORBA::UnionDef::_get_members_skel (
+ TAO_ServerRequest & server_request,
+ void * TAO_INTERCEPTOR (servant_upcall),
+ void * servant
+ ACE_ENV_ARG_DECL
+ )
+{
+#if TAO_HAS_INTERCEPTORS == 1
+ static ::CORBA::TypeCode_ptr const * const exceptions = 0;
+ static ::CORBA::ULong const nexceptions = 0;
+#endif /* TAO_HAS_INTERCEPTORS */
+
+ TAO::SArg_Traits< ::CORBA::UnionMemberSeq>::ret_val retval;
+
+ TAO::Argument * const args[] =
+ {
+ &retval
+ };
+
+ static size_t const nargs = 1;
+
+ POA_CORBA::UnionDef * const impl =
+ static_cast<POA_CORBA::UnionDef *> (servant);
+
+ _get_members_UnionDef command (
+ impl,
+ server_request.operation_details (),
+ args);
+
+ TAO::Upcall_Wrapper upcall_wrapper;
+ upcall_wrapper.upcall (server_request
+ , args
+ , nargs
+ , command
+#if TAO_HAS_INTERCEPTORS == 1
+ , servant_upcall
+ , exceptions
+ , nexceptions
+#endif /* TAO_HAS_INTERCEPTORS == 1 */
+ ACE_ENV_ARG_PARAMETER);
+ ACE_CHECK;
+}namespace POA_CORBA
+{
+
+
+ // TAO_IDL - Generated from
+ // be\be_visitor_operation/upcall_command_ss.cpp:127
+
+ class _set_members_UnionDef
+ : public TAO::Upcall_Command
+ {
+ public:
+ inline _set_members_UnionDef (
+ POA_CORBA::UnionDef * servant,
+ TAO_Operation_Details const * operation_details,
+ TAO::Argument * const args[])
+ : servant_ (servant)
+ , operation_details_ (operation_details)
+ , args_ (args)
+ {
+ }
+
+ virtual void execute (ACE_ENV_SINGLE_ARG_DECL)
+ {
+ TAO::SArg_Traits< ::CORBA::UnionMemberSeq>::in_arg_type arg_1 =
+ TAO::Portable_Server::get_in_arg< ::CORBA::UnionMemberSeq> (
+ this->operation_details_,
+ this->args_,
+ 1);
+
+ this->servant_->members (
+ arg_1
+ ACE_ENV_ARG_PARAMETER);
+ ACE_CHECK;
+ }
+
+ private:
+ POA_CORBA::UnionDef * const servant_;
+ TAO_Operation_Details const * const operation_details_;
+ TAO::Argument * const * const args_;
+ };
+}
+
+
+// TAO_IDL - Generated from
+// be\be_visitor_operation/operation_ss.cpp:190
+
+void POA_CORBA::UnionDef::_set_members_skel (
+ TAO_ServerRequest & server_request,
+ void * TAO_INTERCEPTOR (servant_upcall),
+ void * servant
+ ACE_ENV_ARG_DECL
+ )
+{
+#if TAO_HAS_INTERCEPTORS == 1
+ static ::CORBA::TypeCode_ptr const * const exceptions = 0;
+ static ::CORBA::ULong const nexceptions = 0;
+#endif /* TAO_HAS_INTERCEPTORS */
+
+ TAO::SArg_Traits< void>::ret_val retval;
+ TAO::SArg_Traits< ::CORBA::UnionMemberSeq>::in_arg_val _tao_members;
+
+ TAO::Argument * const args[] =
+ {
+ &retval,
+ &_tao_members
+ };
+
+ static size_t const nargs = 2;
+
+ POA_CORBA::UnionDef * const impl =
+ static_cast<POA_CORBA::UnionDef *> (servant);
+
+ _set_members_UnionDef command (
+ impl,
+ server_request.operation_details (),
+ args);
+
+ TAO::Upcall_Wrapper upcall_wrapper;
+ upcall_wrapper.upcall (server_request
+ , args
+ , nargs
+ , command
+#if TAO_HAS_INTERCEPTORS == 1
+ , servant_upcall
+ , exceptions
+ , nexceptions
+#endif /* TAO_HAS_INTERCEPTORS == 1 */
+ ACE_ENV_ARG_PARAMETER);
+ ACE_CHECK;
+}
+
+// TAO_IDL - Generated from
+// be\be_visitor_interface/interface_ss.cpp:169
+
+namespace POA_CORBA
+{
+
+
+ // TAO_IDL - Generated from
+ // be\be_visitor_operation/upcall_command_ss.cpp:127
+
+ class _is_a_UnionDef_Upcall_Command
+ : public TAO::Upcall_Command
+ {
+ public:
+ inline _is_a_UnionDef_Upcall_Command (
+ POA_CORBA::UnionDef * servant,
+ TAO_Operation_Details const * operation_details,
+ TAO::Argument * const args[])
+ : servant_ (servant)
+ , operation_details_ (operation_details)
+ , args_ (args)
+ {
+ }
+
+ virtual void execute (ACE_ENV_SINGLE_ARG_DECL)
+ {
+ TAO::SArg_Traits< ::ACE_InputCDR::to_boolean>::ret_arg_type retval =
+ TAO::Portable_Server::get_ret_arg< ::ACE_InputCDR::to_boolean> (
+ this->operation_details_,
+ this->args_);
+
+ TAO::SArg_Traits< ::CORBA::Char *>::in_arg_type arg_1 =
+ TAO::Portable_Server::get_in_arg< ::CORBA::Char *> (
+ this->operation_details_,
+ this->args_,
+ 1);
+
+ retval =
+ this->servant_-> _is_a (
+ arg_1
+ ACE_ENV_ARG_PARAMETER);
+ ACE_CHECK;
+ }
+
+ private:
+ POA_CORBA::UnionDef * const servant_;
+ TAO_Operation_Details const * const operation_details_;
+ TAO::Argument * const * const args_;
+ };
+}
+
+
+void POA_CORBA::UnionDef::_is_a_skel (
+ TAO_ServerRequest & server_request,
+ void * TAO_INTERCEPTOR (servant_upcall),
+ void * servant
+ ACE_ENV_ARG_DECL
+ )
+{
+#if TAO_HAS_INTERCEPTORS == 1
+ static ::CORBA::TypeCode_ptr const * const exceptions = 0;
+ static ::CORBA::ULong const nexceptions = 0;
+#endif /* TAO_HAS_INTERCEPTORS */
+
+ TAO::SArg_Traits< ::ACE_InputCDR::to_boolean>::ret_val retval;
+ TAO::SArg_Traits< ::CORBA::Char *>::in_arg_val _tao_repository_id;
+
+ TAO::Argument * const args[] =
+ {
+ &retval,
+ &_tao_repository_id
+ };
+
+ static size_t const nargs = 2;
+
+ POA_CORBA::UnionDef * const impl =
+ static_cast<POA_CORBA::UnionDef *> (servant);
+
+ _is_a_UnionDef_Upcall_Command command (
+ impl,
+ server_request.operation_details (),
+ args);
+
+ TAO::Upcall_Wrapper upcall_wrapper;
+ upcall_wrapper.upcall (server_request
+ , args
+ , nargs
+ , command
+#if TAO_HAS_INTERCEPTORS == 1
+ , servant_upcall
+ , exceptions
+ , nexceptions
+#endif /* TAO_HAS_INTERCEPTORS == 1 */
+ ACE_ENV_ARG_PARAMETER);
+ ACE_CHECK;
+}namespace POA_CORBA
+{
+
+
+ // TAO_IDL - Generated from
+ // be\be_visitor_operation/upcall_command_ss.cpp:127
+
+ class _non_existent_UnionDef_Upcall_Command
+ : public TAO::Upcall_Command
+ {
+ public:
+ inline _non_existent_UnionDef_Upcall_Command (
+ POA_CORBA::UnionDef * servant,
+ TAO_Operation_Details const * operation_details,
+ TAO::Argument * const args[])
+ : servant_ (servant)
+ , operation_details_ (operation_details)
+ , args_ (args)
+ {
+ }
+
+ virtual void execute (ACE_ENV_SINGLE_ARG_DECL)
+ {
+ TAO::SArg_Traits< ::ACE_InputCDR::to_boolean>::ret_arg_type retval =
+ TAO::Portable_Server::get_ret_arg< ::ACE_InputCDR::to_boolean> (
+ this->operation_details_,
+ this->args_);
+
+ retval =
+ this->servant_-> _non_existent (
+ ACE_ENV_SINGLE_ARG_PARAMETER);
+ ACE_CHECK;
+ }
+
+ private:
+ POA_CORBA::UnionDef * const servant_;
+ TAO_Operation_Details const * const operation_details_;
+ TAO::Argument * const * const args_;
+ };
+}
+
+
+void POA_CORBA::UnionDef::_non_existent_skel (
+ TAO_ServerRequest & server_request,
+ void * TAO_INTERCEPTOR (servant_upcall),
+ void * servant
+ ACE_ENV_ARG_DECL
+ )
+{
+#if TAO_HAS_INTERCEPTORS == 1
+ static ::CORBA::TypeCode_ptr const * const exceptions = 0;
+ static ::CORBA::ULong const nexceptions = 0;
+#endif /* TAO_HAS_INTERCEPTORS */
+
+ TAO::SArg_Traits< ::ACE_InputCDR::to_boolean>::ret_val retval;
+
+ TAO::Argument * const args[] =
+ {
+ &retval
+ };
+
+ static size_t const nargs = 1;
+
+ POA_CORBA::UnionDef * const impl =
+ static_cast<POA_CORBA::UnionDef *> (servant);
+
+ _non_existent_UnionDef_Upcall_Command command (
+ impl,
+ server_request.operation_details (),
+ args);
+
+ TAO::Upcall_Wrapper upcall_wrapper;
+ upcall_wrapper.upcall (server_request
+ , args
+ , nargs
+ , command
+#if TAO_HAS_INTERCEPTORS == 1
+ , servant_upcall
+ , exceptions
+ , nexceptions
+#endif /* TAO_HAS_INTERCEPTORS == 1 */
+ ACE_ENV_ARG_PARAMETER);
+ ACE_CHECK;
+}namespace POA_CORBA
+{
+
+
+ // TAO_IDL - Generated from
+ // be\be_visitor_operation/upcall_command_ss.cpp:127
+
+ class _repository_id_UnionDef_Upcall_Command
+ : public TAO::Upcall_Command
+ {
+ public:
+ inline _repository_id_UnionDef_Upcall_Command (
+ POA_CORBA::UnionDef * servant,
+ TAO_Operation_Details const * operation_details,
+ TAO::Argument * const args[])
+ : servant_ (servant)
+ , operation_details_ (operation_details)
+ , args_ (args)
+ {
+ }
+
+ virtual void execute (ACE_ENV_SINGLE_ARG_DECL)
+ {
+ TAO::SArg_Traits< ::CORBA::Char *>::ret_arg_type retval =
+ TAO::Portable_Server::get_ret_arg< ::CORBA::Char *> (
+ this->operation_details_,
+ this->args_);
+
+ retval =
+ this->servant_-> _repository_id (
+ ACE_ENV_SINGLE_ARG_PARAMETER);
+ ACE_CHECK;
+ }
+
+ private:
+ POA_CORBA::UnionDef * const servant_;
+ TAO_Operation_Details const * const operation_details_;
+ TAO::Argument * const * const args_;
+ };
+}
+
+
+void POA_CORBA::UnionDef::_repository_id_skel (
+ TAO_ServerRequest & server_request,
+ void * TAO_INTERCEPTOR (servant_upcall),
+ void * servant
+ ACE_ENV_ARG_DECL
+ )
+{
+#if TAO_HAS_INTERCEPTORS == 1
+ static ::CORBA::TypeCode_ptr const * const exceptions = 0;
+ static ::CORBA::ULong const nexceptions = 0;
+#endif /* TAO_HAS_INTERCEPTORS */
+
+ TAO::SArg_Traits< ::CORBA::Char *>::ret_val retval;
+
+ TAO::Argument * const args[] =
+ {
+ &retval
+ };
+
+ static size_t const nargs = 1;
+
+ POA_CORBA::UnionDef * const impl =
+ static_cast<POA_CORBA::UnionDef *> (servant);
+
+ _repository_id_UnionDef_Upcall_Command command (
+ impl,
+ server_request.operation_details (),
+ args);
+
+ TAO::Upcall_Wrapper upcall_wrapper;
+ upcall_wrapper.upcall (server_request
+ , args
+ , nargs
+ , command
+#if TAO_HAS_INTERCEPTORS == 1
+ , servant_upcall
+ , exceptions
+ , nexceptions
+#endif /* TAO_HAS_INTERCEPTORS == 1 */
+ ACE_ENV_ARG_PARAMETER);
+ ACE_CHECK;
+}
+
+// TAO_IDL - Generated from
+// be\be_visitor_interface/interface_ss.cpp:513
+
+void POA_CORBA::UnionDef::_interface_skel (
+ TAO_ServerRequest & server_request,
+ void * /* servant_upcall */,
+ void * servant
+ ACE_ENV_ARG_DECL
+ )
+{
+ TAO_IFR_Client_Adapter *_tao_adapter =
+ ACE_Dynamic_Service<TAO_IFR_Client_Adapter>::instance (
+ TAO_ORB_Core::ifr_client_adapter_name ()
+ );
+
+ if (_tao_adapter == 0)
+ {
+ ACE_THROW ( ::CORBA::INTF_REPOS ( ::CORBA::OMGVMCID | 1,
+ ::CORBA::COMPLETED_NO));
+ }
+
+ POA_CORBA::UnionDef * const impl =
+ static_cast<POA_CORBA::UnionDef *> (servant);
+ ::CORBA::InterfaceDef_ptr _tao_retval =
+ impl->_get_interface (ACE_ENV_SINGLE_ARG_PARAMETER);
+ ACE_CHECK;
+
+ server_request.init_reply ();
+ TAO_OutputCDR &_tao_out = *server_request.outgoing ();
+
+ ::CORBA::Boolean const _tao_result =
+ _tao_adapter->interfacedef_cdr_insert (
+ _tao_out,
+ _tao_retval
+ );
+
+ _tao_adapter->dispose (_tao_retval);
+
+ if (_tao_result == false)
+ {
+ ACE_THROW ( ::CORBA::MARSHAL ());
+ }
+}namespace POA_CORBA
+{
+
+
+ // TAO_IDL - Generated from
+ // be\be_visitor_operation/upcall_command_ss.cpp:127
+
+ class _get_component_UnionDef_Upcall_Command
+ : public TAO::Upcall_Command
+ {
+ public:
+ inline _get_component_UnionDef_Upcall_Command (
+ POA_CORBA::UnionDef * servant,
+ TAO_Operation_Details const * operation_details,
+ TAO::Argument * const args[])
+ : servant_ (servant)
+ , operation_details_ (operation_details)
+ , args_ (args)
+ {
+ }
+
+ virtual void execute (ACE_ENV_SINGLE_ARG_DECL)
+ {
+ TAO::SArg_Traits< ::CORBA::Object>::ret_arg_type retval =
+ TAO::Portable_Server::get_ret_arg< ::CORBA::Object> (
+ this->operation_details_,
+ this->args_);
+
+ retval =
+ this->servant_-> _get_component (
+ ACE_ENV_SINGLE_ARG_PARAMETER);
+ ACE_CHECK;
+ }
+
+ private:
+ POA_CORBA::UnionDef * const servant_;
+ TAO_Operation_Details const * const operation_details_;
+ TAO::Argument * const * const args_;
+ };
+}
+
+
+void POA_CORBA::UnionDef::_component_skel (
+ TAO_ServerRequest & server_request,
+ void * TAO_INTERCEPTOR (servant_upcall),
+ void * servant
+ ACE_ENV_ARG_DECL
+ )
+{
+#if TAO_HAS_INTERCEPTORS == 1
+ static ::CORBA::TypeCode_ptr const * const exceptions = 0;
+ static ::CORBA::ULong const nexceptions = 0;
+#endif /* TAO_HAS_INTERCEPTORS */
+
+ TAO::SArg_Traits< ::CORBA::Object>::ret_val retval;
+
+ TAO::Argument * const args[] =
+ {
+ &retval
+ };
+
+ static size_t const nargs = 1;
+
+ POA_CORBA::UnionDef * const impl =
+ static_cast<POA_CORBA::UnionDef *> (servant);
+
+ _get_component_UnionDef_Upcall_Command command (
+ impl,
+ server_request.operation_details (),
+ args);
+
+ TAO::Upcall_Wrapper upcall_wrapper;
+ upcall_wrapper.upcall (server_request
+ , args
+ , nargs
+ , command
+#if TAO_HAS_INTERCEPTORS == 1
+ , servant_upcall
+ , exceptions
+ , nexceptions
+#endif /* TAO_HAS_INTERCEPTORS == 1 */
+ ACE_ENV_ARG_PARAMETER);
+ ACE_CHECK;
+}
+
+::CORBA::Boolean POA_CORBA::UnionDef::_is_a (
+ const char* value
+ ACE_ENV_ARG_DECL_NOT_USED
+ )
+{
+ return
+ (
+ !ACE_OS::strcmp (
+ value,
+ "IDL:omg.org/CORBA/IRObject:1.0"
+ ) ||
+ !ACE_OS::strcmp (
+ value,
+ "IDL:omg.org/CORBA/Contained:1.0"
+ ) ||
+ !ACE_OS::strcmp (
+ value,
+ "IDL:omg.org/CORBA/IDLType:1.0"
+ ) ||
+ !ACE_OS::strcmp (
+ value,
+ "IDL:omg.org/CORBA/TypedefDef:1.0"
+ ) ||
+ !ACE_OS::strcmp (
+ value,
+ "IDL:omg.org/CORBA/Container:1.0"
+ ) ||
+ !ACE_OS::strcmp (
+ value,
+ "IDL:omg.org/CORBA/UnionDef:1.0"
+ ) ||
+ !ACE_OS::strcmp (
+ value,
+ "IDL:omg.org/CORBA/Object:1.0"
+ )
+ );
+}
+
+const char* POA_CORBA::UnionDef::_interface_repository_id (void) const
+{
+ return "IDL:omg.org/CORBA/UnionDef:1.0";
+}
+
+// TAO_IDL - Generated from
+// be\be_visitor_interface/interface_ss.cpp:903
+
+void POA_CORBA::UnionDef::_dispatch (
+ TAO_ServerRequest & req,
+ void * servant_upcall
+ ACE_ENV_ARG_DECL
+ )
+{
+ this->synchronous_upcall_dispatch (req,
+ servant_upcall,
+ this
+ ACE_ENV_ARG_PARAMETER);
+}
+
+// TAO_IDL - Generated from
+// be\be_visitor_interface/interface_ss.cpp:851
+
+CORBA::UnionDef *
+POA_CORBA::UnionDef::_this (ACE_ENV_SINGLE_ARG_DECL)
+{
+ TAO_Stub *stub = this->_create_stub (ACE_ENV_SINGLE_ARG_PARAMETER);
+ ACE_CHECK_RETURN (0);
+
+ TAO_Stub_Auto_Ptr safe_stub (stub);
+ ::CORBA::Object_ptr tmp = CORBA::Object::_nil ();
+
+ ::CORBA::Boolean const _tao_opt_colloc =
+ stub->servant_orb_var ()->orb_core ()->optimize_collocation_objects ();
+
+ ACE_NEW_RETURN (
+ tmp,
+ ::CORBA::Object (stub, _tao_opt_colloc, this),
+ 0
+ );
+
+ ::CORBA::Object_var obj = tmp;
+ (void) safe_stub.release ();
+
+ typedef ::CORBA::UnionDef STUB_SCOPED_NAME;
+ return
+ TAO::Narrow_Utils<STUB_SCOPED_NAME>::unchecked_narrow (
+ obj.in (),
+ CORBA__TAO_UnionDef_Proxy_Broker_Factory_function_pointer
+ );
+}
+
+// TAO_IDL - Generated from
+// be\be_interface.cpp:1499
+
+class TAO_CORBA_EnumDef_Perfect_Hash_OpTable
+ : public TAO_Perfect_Hash_OpTable
+{
+private:
+ unsigned int hash (const char *str, unsigned int len);
+
+public:
+ const TAO_operation_db_entry * lookup (const char *str, unsigned int len);
+};
+
+/* C++ code produced by gperf version 2.8 (ACE version) */
+/* Command-line: C:\ACE\latest\ACE_wrappers\bin\gperf.exe -m -M -J -c -C -D -E -T -f 0 -F 0,0 -a -o -t -p -K opname -L C++ -Z TAO_CORBA_EnumDef_Perfect_Hash_OpTable -N lookup */
+unsigned int
+TAO_CORBA_EnumDef_Perfect_Hash_OpTable::hash (const char *str, unsigned int len)
+{
+ static const unsigned char asso_values[] =
+ {
+#if defined (ACE_MVS)
+ 37, 37, 37, 37, 37, 37, 37, 37, 37, 37,
+ 37, 37, 37, 37, 37, 37, 37, 37, 37, 37,
+ 37, 37, 37, 37, 37, 37, 37, 37, 37, 37,
+ 37, 37, 37, 37, 37, 37, 37, 37, 37, 37,
+ 37, 37, 37, 37, 37, 37, 37, 37, 37, 37,
+ 37, 37, 37, 37, 37, 37, 37, 37, 37, 37,
+ 37, 37, 37, 37, 37, 37, 37, 37, 37, 37,
+ 37, 37, 37, 37, 37, 37, 37, 37, 37, 37,
+ 37, 37, 37, 37, 37, 37, 37, 37, 37, 37,
+ 37, 37, 37, 37, 37, 37, 37, 37, 37, 37,
+ 37, 37, 37, 37, 37, 37, 37, 37, 37, 0,
+ 37, 37, 37, 37, 37, 37, 37, 37, 37, 37,
+ 37, 37, 37, 37, 37, 37, 37, 37, 37, 0,
+ 37, 37, 0, 0, 37, 37, 37, 37, 37, 37,
+ 37, 37, 37, 37, 37, 37, 37, 37, 0, 0,
+ 37, 37, 37, 37, 37, 37, 37, 37, 37, 37,
+ 37, 37, 10, 10, 37, 37, 37, 37, 10, 37,
+ 37, 37, 37, 37, 37, 37, 37, 37, 37, 37,
+ 37, 37, 37, 37, 37, 37, 37, 37, 37, 37,
+ 37, 37, 37, 37, 37, 37, 37, 37, 37, 37,
+ 37, 37, 37, 37, 37, 37, 37, 37, 37, 37,
+ 37, 37, 37, 37, 37, 37, 37, 37, 37, 37,
+ 37, 37, 37, 37, 37, 37, 37, 37, 37, 37,
+ 37, 37, 37, 37, 37, 37, 37, 37, 37, 37,
+ 37, 37, 37, 37, 37, 37, 37, 37, 37, 37,
+ 37, 37, 37, 37, 37, 37,
+#else
+ 37, 37, 37, 37, 37, 37, 37, 37, 37, 37,
+ 37, 37, 37, 37, 37, 37, 37, 37, 37, 37,
+ 37, 37, 37, 37, 37, 37, 37, 37, 37, 37,
+ 37, 37, 37, 37, 37, 37, 37, 37, 37, 37,
+ 37, 37, 37, 37, 37, 37, 37, 37, 37, 37,
+ 37, 37, 37, 37, 37, 37, 37, 37, 37, 37,
+ 37, 37, 37, 37, 37, 37, 37, 37, 37, 37,
+ 37, 37, 37, 37, 37, 37, 37, 37, 37, 37,
+ 37, 37, 37, 37, 37, 37, 37, 37, 37, 37,
+ 37, 37, 37, 37, 37, 0, 37, 0, 37, 37,
+ 0, 0, 37, 37, 37, 37, 37, 37, 37, 0,
+ 0, 37, 37, 37, 37, 10, 10, 37, 37, 37,
+ 37, 10, 37, 37, 37, 37, 37, 37,
+#endif /* ACE_MVS */
+ };
+ return len + asso_values[(int) str[len - 1]] + asso_values[(int) str[0]];
+}
+
+const TAO_operation_db_entry *
+TAO_CORBA_EnumDef_Perfect_Hash_OpTable::lookup (const char *str, unsigned int len)
+{
+ enum
+ {
+ TOTAL_KEYWORDS = 21,
+ MIN_WORD_LENGTH = 4,
+ MAX_WORD_LENGTH = 26,
+ MIN_HASH_VALUE = 4,
+ MAX_HASH_VALUE = 36,
+ HASH_VALUE_RANGE = 33,
+ DUPLICATES = 6,
+ WORDLIST_SIZE = 25
+ };
+
+ static const TAO_operation_db_entry wordlist[] =
+ {
+ {"",0,0},{"",0,0},{"",0,0},{"",0,0},
+ {"move", &POA_CORBA::EnumDef::move_skel, 0},
+ {"_is_a", &POA_CORBA::EnumDef::_is_a_skel, 0},
+ {"_get_id", &POA_CORBA::EnumDef::_get_id_skel, 0},
+ {"_set_id", &POA_CORBA::EnumDef::_set_id_skel, 0},
+ {"describe", &POA_CORBA::EnumDef::describe_skel, 0},
+ {"_get_name", &POA_CORBA::EnumDef::_get_name_skel, 0},
+ {"_get_type", &POA_CORBA::EnumDef::_get_type_skel, 0},
+ {"_set_name", &POA_CORBA::EnumDef::_set_name_skel, 0},
+ {"_interface", &POA_CORBA::EnumDef::_interface_skel, 0},
+ {"_get_version", &POA_CORBA::EnumDef::_get_version_skel, 0},
+ {"_set_version", &POA_CORBA::EnumDef::_set_version_skel, 0},
+ {"_get_def_kind", &POA_CORBA::EnumDef::_get_def_kind_skel, 0},
+ {"_repository_id", &POA_CORBA::EnumDef::_repository_id_skel, 0},
+ {"_get_defined_in", &POA_CORBA::EnumDef::_get_defined_in_skel, 0},
+ {"destroy", &POA_CORBA::EnumDef::destroy_skel, 0},
+ {"_get_absolute_name", &POA_CORBA::EnumDef::_get_absolute_name_skel, 0},
+ {"_component", &POA_CORBA::EnumDef::_component_skel, 0},
+ {"_get_members", &POA_CORBA::EnumDef::_get_members_skel, 0},
+ {"_set_members", &POA_CORBA::EnumDef::_set_members_skel, 0},
+ {"_non_existent", &POA_CORBA::EnumDef::_non_existent_skel, 0},
+ {"_get_containing_repository", &POA_CORBA::EnumDef::_get_containing_repository_skel, 0},
+ };
+
+ static const signed char lookup[] =
+ {
+ -13, -2, -21, -2, 4, 5, -1, 55, 8, 51, 12, -1, -48, 15,
+ 16, 17, -1, 18, 19, -1, 20, -1, -56, 23, -9, -3, -6, -2,
+ -1, -1, -1, -1, -1, -1, -1, -1, 24,
+ };
+
+ if (len <= MAX_WORD_LENGTH && len >= MIN_WORD_LENGTH)
+ {
+ unsigned int key = hash (str, len);
+
+ if (key <= MAX_HASH_VALUE && key >= MIN_HASH_VALUE)
+ {
+ int slot = lookup[key];
+
+ if (slot >= 0 && slot < WORDLIST_SIZE)
+ {
+ const char *s = wordlist[slot].opname;
+
+ if (*str == *s && !strncmp (str + 1, s + 1, len - 1))
+ return &wordlist[slot];
+ }
+ else if (slot < 0 && slot >= -MAX_HASH_VALUE)
+ return 0;
+ else
+ {
+ unsigned int offset = key + slot + (slot > 0 ? -MAX_HASH_VALUE : MAX_HASH_VALUE);
+ const TAO_operation_db_entry *base = &wordlist[-lookup[offset]];
+ const TAO_operation_db_entry *ptr = base + -lookup[offset + 1];
+
+ while (--ptr >= base)
+ if (*str == *ptr->opname && !strncmp (str + 1, ptr->opname + 1, len - 1))
+ return ptr;
+ }
+ }
+ }
+ return 0;
+}
+
+static TAO_CORBA_EnumDef_Perfect_Hash_OpTable tao_CORBA_EnumDef_optable;
+
+// TAO_IDL - Generated from
+// be\be_visitor_interface/interface_ss.cpp:966
+
+TAO::Collocation_Proxy_Broker *
+CORBA__TAO_EnumDef_Proxy_Broker_Factory_function ( ::CORBA::Object_ptr)
+{
+ return reinterpret_cast<TAO::Collocation_Proxy_Broker *> (0xdead); // Dummy
+}
+
+int
+CORBA__TAO_EnumDef_Proxy_Broker_Factory_Initializer (size_t)
+{
+ CORBA__TAO_EnumDef_Proxy_Broker_Factory_function_pointer =
+ CORBA__TAO_EnumDef_Proxy_Broker_Factory_function;
+
+ return 0;
+}
+
+static int
+CORBA__TAO_EnumDef_Proxy_Broker_Stub_Factory_Initializer_Scarecrow =
+ CORBA__TAO_EnumDef_Proxy_Broker_Factory_Initializer (
+ reinterpret_cast<size_t> (CORBA__TAO_EnumDef_Proxy_Broker_Factory_Initializer)
+ );
+
+// TAO_IDL - Generated from
+// be\be_visitor_interface/interface_ss.cpp:103
+
+POA_CORBA::EnumDef::EnumDef (void)
+ : TAO_ServantBase ()
+{
+ this->optable_ = &tao_CORBA_EnumDef_optable;
+}
+
+POA_CORBA::EnumDef::EnumDef (const EnumDef& rhs)
+ : TAO_Abstract_ServantBase (rhs),
+ TAO_ServantBase (rhs),
+ POA_CORBA::IRObject (rhs),
+ POA_CORBA::Contained (rhs),
+ POA_CORBA::IDLType (rhs),
+ POA_CORBA::TypedefDef (rhs)
+{
+}
+
+POA_CORBA::EnumDef::~EnumDef (void)
+{
+}namespace POA_CORBA
+{
+
+
+ // TAO_IDL - Generated from
+ // be\be_visitor_operation/upcall_command_ss.cpp:127
+
+ class _get_members_EnumDef
+ : public TAO::Upcall_Command
+ {
+ public:
+ inline _get_members_EnumDef (
+ POA_CORBA::EnumDef * servant,
+ TAO_Operation_Details const * operation_details,
+ TAO::Argument * const args[])
+ : servant_ (servant)
+ , operation_details_ (operation_details)
+ , args_ (args)
+ {
+ }
+
+ virtual void execute (ACE_ENV_SINGLE_ARG_DECL)
+ {
+ TAO::SArg_Traits< ::CORBA::EnumMemberSeq>::ret_arg_type retval =
+ TAO::Portable_Server::get_ret_arg< ::CORBA::EnumMemberSeq> (
+ this->operation_details_,
+ this->args_);
+
+ retval =
+ this->servant_->members (
+ ACE_ENV_SINGLE_ARG_PARAMETER);
+ ACE_CHECK;
+ }
+
+ private:
+ POA_CORBA::EnumDef * const servant_;
+ TAO_Operation_Details const * const operation_details_;
+ TAO::Argument * const * const args_;
+ };
+}
+
+
+// TAO_IDL - Generated from
+// be\be_visitor_operation/operation_ss.cpp:190
+
+void POA_CORBA::EnumDef::_get_members_skel (
+ TAO_ServerRequest & server_request,
+ void * TAO_INTERCEPTOR (servant_upcall),
+ void * servant
+ ACE_ENV_ARG_DECL
+ )
+{
+#if TAO_HAS_INTERCEPTORS == 1
+ static ::CORBA::TypeCode_ptr const * const exceptions = 0;
+ static ::CORBA::ULong const nexceptions = 0;
+#endif /* TAO_HAS_INTERCEPTORS */
+
+ TAO::SArg_Traits< ::CORBA::EnumMemberSeq>::ret_val retval;
+
+ TAO::Argument * const args[] =
+ {
+ &retval
+ };
+
+ static size_t const nargs = 1;
+
+ POA_CORBA::EnumDef * const impl =
+ static_cast<POA_CORBA::EnumDef *> (servant);
+
+ _get_members_EnumDef command (
+ impl,
+ server_request.operation_details (),
+ args);
+
+ TAO::Upcall_Wrapper upcall_wrapper;
+ upcall_wrapper.upcall (server_request
+ , args
+ , nargs
+ , command
+#if TAO_HAS_INTERCEPTORS == 1
+ , servant_upcall
+ , exceptions
+ , nexceptions
+#endif /* TAO_HAS_INTERCEPTORS == 1 */
+ ACE_ENV_ARG_PARAMETER);
+ ACE_CHECK;
+}namespace POA_CORBA
+{
+
+
+ // TAO_IDL - Generated from
+ // be\be_visitor_operation/upcall_command_ss.cpp:127
+
+ class _set_members_EnumDef
+ : public TAO::Upcall_Command
+ {
+ public:
+ inline _set_members_EnumDef (
+ POA_CORBA::EnumDef * servant,
+ TAO_Operation_Details const * operation_details,
+ TAO::Argument * const args[])
+ : servant_ (servant)
+ , operation_details_ (operation_details)
+ , args_ (args)
+ {
+ }
+
+ virtual void execute (ACE_ENV_SINGLE_ARG_DECL)
+ {
+ TAO::SArg_Traits< ::CORBA::EnumMemberSeq>::in_arg_type arg_1 =
+ TAO::Portable_Server::get_in_arg< ::CORBA::EnumMemberSeq> (
+ this->operation_details_,
+ this->args_,
+ 1);
+
+ this->servant_->members (
+ arg_1
+ ACE_ENV_ARG_PARAMETER);
+ ACE_CHECK;
+ }
+
+ private:
+ POA_CORBA::EnumDef * const servant_;
+ TAO_Operation_Details const * const operation_details_;
+ TAO::Argument * const * const args_;
+ };
+}
+
+
+// TAO_IDL - Generated from
+// be\be_visitor_operation/operation_ss.cpp:190
+
+void POA_CORBA::EnumDef::_set_members_skel (
+ TAO_ServerRequest & server_request,
+ void * TAO_INTERCEPTOR (servant_upcall),
+ void * servant
+ ACE_ENV_ARG_DECL
+ )
+{
+#if TAO_HAS_INTERCEPTORS == 1
+ static ::CORBA::TypeCode_ptr const * const exceptions = 0;
+ static ::CORBA::ULong const nexceptions = 0;
+#endif /* TAO_HAS_INTERCEPTORS */
+
+ TAO::SArg_Traits< void>::ret_val retval;
+ TAO::SArg_Traits< ::CORBA::EnumMemberSeq>::in_arg_val _tao_members;
+
+ TAO::Argument * const args[] =
+ {
+ &retval,
+ &_tao_members
+ };
+
+ static size_t const nargs = 2;
+
+ POA_CORBA::EnumDef * const impl =
+ static_cast<POA_CORBA::EnumDef *> (servant);
+
+ _set_members_EnumDef command (
+ impl,
+ server_request.operation_details (),
+ args);
+
+ TAO::Upcall_Wrapper upcall_wrapper;
+ upcall_wrapper.upcall (server_request
+ , args
+ , nargs
+ , command
+#if TAO_HAS_INTERCEPTORS == 1
+ , servant_upcall
+ , exceptions
+ , nexceptions
+#endif /* TAO_HAS_INTERCEPTORS == 1 */
+ ACE_ENV_ARG_PARAMETER);
+ ACE_CHECK;
+}
+
+// TAO_IDL - Generated from
+// be\be_visitor_interface/interface_ss.cpp:169
+
+namespace POA_CORBA
+{
+
+
+ // TAO_IDL - Generated from
+ // be\be_visitor_operation/upcall_command_ss.cpp:127
+
+ class _is_a_EnumDef_Upcall_Command
+ : public TAO::Upcall_Command
+ {
+ public:
+ inline _is_a_EnumDef_Upcall_Command (
+ POA_CORBA::EnumDef * servant,
+ TAO_Operation_Details const * operation_details,
+ TAO::Argument * const args[])
+ : servant_ (servant)
+ , operation_details_ (operation_details)
+ , args_ (args)
+ {
+ }
+
+ virtual void execute (ACE_ENV_SINGLE_ARG_DECL)
+ {
+ TAO::SArg_Traits< ::ACE_InputCDR::to_boolean>::ret_arg_type retval =
+ TAO::Portable_Server::get_ret_arg< ::ACE_InputCDR::to_boolean> (
+ this->operation_details_,
+ this->args_);
+
+ TAO::SArg_Traits< ::CORBA::Char *>::in_arg_type arg_1 =
+ TAO::Portable_Server::get_in_arg< ::CORBA::Char *> (
+ this->operation_details_,
+ this->args_,
+ 1);
+
+ retval =
+ this->servant_-> _is_a (
+ arg_1
+ ACE_ENV_ARG_PARAMETER);
+ ACE_CHECK;
+ }
+
+ private:
+ POA_CORBA::EnumDef * const servant_;
+ TAO_Operation_Details const * const operation_details_;
+ TAO::Argument * const * const args_;
+ };
+}
+
+
+void POA_CORBA::EnumDef::_is_a_skel (
+ TAO_ServerRequest & server_request,
+ void * TAO_INTERCEPTOR (servant_upcall),
+ void * servant
+ ACE_ENV_ARG_DECL
+ )
+{
+#if TAO_HAS_INTERCEPTORS == 1
+ static ::CORBA::TypeCode_ptr const * const exceptions = 0;
+ static ::CORBA::ULong const nexceptions = 0;
+#endif /* TAO_HAS_INTERCEPTORS */
+
+ TAO::SArg_Traits< ::ACE_InputCDR::to_boolean>::ret_val retval;
+ TAO::SArg_Traits< ::CORBA::Char *>::in_arg_val _tao_repository_id;
+
+ TAO::Argument * const args[] =
+ {
+ &retval,
+ &_tao_repository_id
+ };
+
+ static size_t const nargs = 2;
+
+ POA_CORBA::EnumDef * const impl =
+ static_cast<POA_CORBA::EnumDef *> (servant);
+
+ _is_a_EnumDef_Upcall_Command command (
+ impl,
+ server_request.operation_details (),
+ args);
+
+ TAO::Upcall_Wrapper upcall_wrapper;
+ upcall_wrapper.upcall (server_request
+ , args
+ , nargs
+ , command
+#if TAO_HAS_INTERCEPTORS == 1
+ , servant_upcall
+ , exceptions
+ , nexceptions
+#endif /* TAO_HAS_INTERCEPTORS == 1 */
+ ACE_ENV_ARG_PARAMETER);
+ ACE_CHECK;
+}namespace POA_CORBA
+{
+
+
+ // TAO_IDL - Generated from
+ // be\be_visitor_operation/upcall_command_ss.cpp:127
+
+ class _non_existent_EnumDef_Upcall_Command
+ : public TAO::Upcall_Command
+ {
+ public:
+ inline _non_existent_EnumDef_Upcall_Command (
+ POA_CORBA::EnumDef * servant,
+ TAO_Operation_Details const * operation_details,
+ TAO::Argument * const args[])
+ : servant_ (servant)
+ , operation_details_ (operation_details)
+ , args_ (args)
+ {
+ }
+
+ virtual void execute (ACE_ENV_SINGLE_ARG_DECL)
+ {
+ TAO::SArg_Traits< ::ACE_InputCDR::to_boolean>::ret_arg_type retval =
+ TAO::Portable_Server::get_ret_arg< ::ACE_InputCDR::to_boolean> (
+ this->operation_details_,
+ this->args_);
+
+ retval =
+ this->servant_-> _non_existent (
+ ACE_ENV_SINGLE_ARG_PARAMETER);
+ ACE_CHECK;
+ }
+
+ private:
+ POA_CORBA::EnumDef * const servant_;
+ TAO_Operation_Details const * const operation_details_;
+ TAO::Argument * const * const args_;
+ };
+}
+
+
+void POA_CORBA::EnumDef::_non_existent_skel (
+ TAO_ServerRequest & server_request,
+ void * TAO_INTERCEPTOR (servant_upcall),
+ void * servant
+ ACE_ENV_ARG_DECL
+ )
+{
+#if TAO_HAS_INTERCEPTORS == 1
+ static ::CORBA::TypeCode_ptr const * const exceptions = 0;
+ static ::CORBA::ULong const nexceptions = 0;
+#endif /* TAO_HAS_INTERCEPTORS */
+
+ TAO::SArg_Traits< ::ACE_InputCDR::to_boolean>::ret_val retval;
+
+ TAO::Argument * const args[] =
+ {
+ &retval
+ };
+
+ static size_t const nargs = 1;
+
+ POA_CORBA::EnumDef * const impl =
+ static_cast<POA_CORBA::EnumDef *> (servant);
+
+ _non_existent_EnumDef_Upcall_Command command (
+ impl,
+ server_request.operation_details (),
+ args);
+
+ TAO::Upcall_Wrapper upcall_wrapper;
+ upcall_wrapper.upcall (server_request
+ , args
+ , nargs
+ , command
+#if TAO_HAS_INTERCEPTORS == 1
+ , servant_upcall
+ , exceptions
+ , nexceptions
+#endif /* TAO_HAS_INTERCEPTORS == 1 */
+ ACE_ENV_ARG_PARAMETER);
+ ACE_CHECK;
+}namespace POA_CORBA
+{
+
+
+ // TAO_IDL - Generated from
+ // be\be_visitor_operation/upcall_command_ss.cpp:127
+
+ class _repository_id_EnumDef_Upcall_Command
+ : public TAO::Upcall_Command
+ {
+ public:
+ inline _repository_id_EnumDef_Upcall_Command (
+ POA_CORBA::EnumDef * servant,
+ TAO_Operation_Details const * operation_details,
+ TAO::Argument * const args[])
+ : servant_ (servant)
+ , operation_details_ (operation_details)
+ , args_ (args)
+ {
+ }
+
+ virtual void execute (ACE_ENV_SINGLE_ARG_DECL)
+ {
+ TAO::SArg_Traits< ::CORBA::Char *>::ret_arg_type retval =
+ TAO::Portable_Server::get_ret_arg< ::CORBA::Char *> (
+ this->operation_details_,
+ this->args_);
+
+ retval =
+ this->servant_-> _repository_id (
+ ACE_ENV_SINGLE_ARG_PARAMETER);
+ ACE_CHECK;
+ }
+
+ private:
+ POA_CORBA::EnumDef * const servant_;
+ TAO_Operation_Details const * const operation_details_;
+ TAO::Argument * const * const args_;
+ };
+}
+
+
+void POA_CORBA::EnumDef::_repository_id_skel (
+ TAO_ServerRequest & server_request,
+ void * TAO_INTERCEPTOR (servant_upcall),
+ void * servant
+ ACE_ENV_ARG_DECL
+ )
+{
+#if TAO_HAS_INTERCEPTORS == 1
+ static ::CORBA::TypeCode_ptr const * const exceptions = 0;
+ static ::CORBA::ULong const nexceptions = 0;
+#endif /* TAO_HAS_INTERCEPTORS */
+
+ TAO::SArg_Traits< ::CORBA::Char *>::ret_val retval;
+
+ TAO::Argument * const args[] =
+ {
+ &retval
+ };
+
+ static size_t const nargs = 1;
+
+ POA_CORBA::EnumDef * const impl =
+ static_cast<POA_CORBA::EnumDef *> (servant);
+
+ _repository_id_EnumDef_Upcall_Command command (
+ impl,
+ server_request.operation_details (),
+ args);
+
+ TAO::Upcall_Wrapper upcall_wrapper;
+ upcall_wrapper.upcall (server_request
+ , args
+ , nargs
+ , command
+#if TAO_HAS_INTERCEPTORS == 1
+ , servant_upcall
+ , exceptions
+ , nexceptions
+#endif /* TAO_HAS_INTERCEPTORS == 1 */
+ ACE_ENV_ARG_PARAMETER);
+ ACE_CHECK;
+}
+
+// TAO_IDL - Generated from
+// be\be_visitor_interface/interface_ss.cpp:513
+
+void POA_CORBA::EnumDef::_interface_skel (
+ TAO_ServerRequest & server_request,
+ void * /* servant_upcall */,
+ void * servant
+ ACE_ENV_ARG_DECL
+ )
+{
+ TAO_IFR_Client_Adapter *_tao_adapter =
+ ACE_Dynamic_Service<TAO_IFR_Client_Adapter>::instance (
+ TAO_ORB_Core::ifr_client_adapter_name ()
+ );
+
+ if (_tao_adapter == 0)
+ {
+ ACE_THROW ( ::CORBA::INTF_REPOS ( ::CORBA::OMGVMCID | 1,
+ ::CORBA::COMPLETED_NO));
+ }
+
+ POA_CORBA::EnumDef * const impl =
+ static_cast<POA_CORBA::EnumDef *> (servant);
+ ::CORBA::InterfaceDef_ptr _tao_retval =
+ impl->_get_interface (ACE_ENV_SINGLE_ARG_PARAMETER);
+ ACE_CHECK;
+
+ server_request.init_reply ();
+ TAO_OutputCDR &_tao_out = *server_request.outgoing ();
+
+ ::CORBA::Boolean const _tao_result =
+ _tao_adapter->interfacedef_cdr_insert (
+ _tao_out,
+ _tao_retval
+ );
+
+ _tao_adapter->dispose (_tao_retval);
+
+ if (_tao_result == false)
+ {
+ ACE_THROW ( ::CORBA::MARSHAL ());
+ }
+}namespace POA_CORBA
+{
+
+
+ // TAO_IDL - Generated from
+ // be\be_visitor_operation/upcall_command_ss.cpp:127
+
+ class _get_component_EnumDef_Upcall_Command
+ : public TAO::Upcall_Command
+ {
+ public:
+ inline _get_component_EnumDef_Upcall_Command (
+ POA_CORBA::EnumDef * servant,
+ TAO_Operation_Details const * operation_details,
+ TAO::Argument * const args[])
+ : servant_ (servant)
+ , operation_details_ (operation_details)
+ , args_ (args)
+ {
+ }
+
+ virtual void execute (ACE_ENV_SINGLE_ARG_DECL)
+ {
+ TAO::SArg_Traits< ::CORBA::Object>::ret_arg_type retval =
+ TAO::Portable_Server::get_ret_arg< ::CORBA::Object> (
+ this->operation_details_,
+ this->args_);
+
+ retval =
+ this->servant_-> _get_component (
+ ACE_ENV_SINGLE_ARG_PARAMETER);
+ ACE_CHECK;
+ }
+
+ private:
+ POA_CORBA::EnumDef * const servant_;
+ TAO_Operation_Details const * const operation_details_;
+ TAO::Argument * const * const args_;
+ };
+}
+
+
+void POA_CORBA::EnumDef::_component_skel (
+ TAO_ServerRequest & server_request,
+ void * TAO_INTERCEPTOR (servant_upcall),
+ void * servant
+ ACE_ENV_ARG_DECL
+ )
+{
+#if TAO_HAS_INTERCEPTORS == 1
+ static ::CORBA::TypeCode_ptr const * const exceptions = 0;
+ static ::CORBA::ULong const nexceptions = 0;
+#endif /* TAO_HAS_INTERCEPTORS */
+
+ TAO::SArg_Traits< ::CORBA::Object>::ret_val retval;
+
+ TAO::Argument * const args[] =
+ {
+ &retval
+ };
+
+ static size_t const nargs = 1;
+
+ POA_CORBA::EnumDef * const impl =
+ static_cast<POA_CORBA::EnumDef *> (servant);
+
+ _get_component_EnumDef_Upcall_Command command (
+ impl,
+ server_request.operation_details (),
+ args);
+
+ TAO::Upcall_Wrapper upcall_wrapper;
+ upcall_wrapper.upcall (server_request
+ , args
+ , nargs
+ , command
+#if TAO_HAS_INTERCEPTORS == 1
+ , servant_upcall
+ , exceptions
+ , nexceptions
+#endif /* TAO_HAS_INTERCEPTORS == 1 */
+ ACE_ENV_ARG_PARAMETER);
+ ACE_CHECK;
+}
+
+::CORBA::Boolean POA_CORBA::EnumDef::_is_a (
+ const char* value
+ ACE_ENV_ARG_DECL_NOT_USED
+ )
+{
+ return
+ (
+ !ACE_OS::strcmp (
+ value,
+ "IDL:omg.org/CORBA/IRObject:1.0"
+ ) ||
+ !ACE_OS::strcmp (
+ value,
+ "IDL:omg.org/CORBA/Contained:1.0"
+ ) ||
+ !ACE_OS::strcmp (
+ value,
+ "IDL:omg.org/CORBA/IDLType:1.0"
+ ) ||
+ !ACE_OS::strcmp (
+ value,
+ "IDL:omg.org/CORBA/TypedefDef:1.0"
+ ) ||
+ !ACE_OS::strcmp (
+ value,
+ "IDL:omg.org/CORBA/EnumDef:1.0"
+ ) ||
+ !ACE_OS::strcmp (
+ value,
+ "IDL:omg.org/CORBA/Object:1.0"
+ )
+ );
+}
+
+const char* POA_CORBA::EnumDef::_interface_repository_id (void) const
+{
+ return "IDL:omg.org/CORBA/EnumDef:1.0";
+}
+
+// TAO_IDL - Generated from
+// be\be_visitor_interface/interface_ss.cpp:903
+
+void POA_CORBA::EnumDef::_dispatch (
+ TAO_ServerRequest & req,
+ void * servant_upcall
+ ACE_ENV_ARG_DECL
+ )
+{
+ this->synchronous_upcall_dispatch (req,
+ servant_upcall,
+ this
+ ACE_ENV_ARG_PARAMETER);
+}
+
+// TAO_IDL - Generated from
+// be\be_visitor_interface/interface_ss.cpp:851
+
+CORBA::EnumDef *
+POA_CORBA::EnumDef::_this (ACE_ENV_SINGLE_ARG_DECL)
+{
+ TAO_Stub *stub = this->_create_stub (ACE_ENV_SINGLE_ARG_PARAMETER);
+ ACE_CHECK_RETURN (0);
+
+ TAO_Stub_Auto_Ptr safe_stub (stub);
+ ::CORBA::Object_ptr tmp = CORBA::Object::_nil ();
+
+ ::CORBA::Boolean const _tao_opt_colloc =
+ stub->servant_orb_var ()->orb_core ()->optimize_collocation_objects ();
+
+ ACE_NEW_RETURN (
+ tmp,
+ ::CORBA::Object (stub, _tao_opt_colloc, this),
+ 0
+ );
+
+ ::CORBA::Object_var obj = tmp;
+ (void) safe_stub.release ();
+
+ typedef ::CORBA::EnumDef STUB_SCOPED_NAME;
+ return
+ TAO::Narrow_Utils<STUB_SCOPED_NAME>::unchecked_narrow (
+ obj.in (),
+ CORBA__TAO_EnumDef_Proxy_Broker_Factory_function_pointer
+ );
+}
+
+// TAO_IDL - Generated from
+// be\be_interface.cpp:1499
+
+class TAO_CORBA_AliasDef_Perfect_Hash_OpTable
+ : public TAO_Perfect_Hash_OpTable
+{
+private:
+ unsigned int hash (const char *str, unsigned int len);
+
+public:
+ const TAO_operation_db_entry * lookup (const char *str, unsigned int len);
+};
+
+/* C++ code produced by gperf version 2.8 (ACE version) */
+/* Command-line: C:\ACE\latest\ACE_wrappers\bin\gperf.exe -m -M -J -c -C -D -E -T -f 0 -F 0,0 -a -o -t -p -K opname -L C++ -Z TAO_CORBA_AliasDef_Perfect_Hash_OpTable -N lookup */
+unsigned int
+TAO_CORBA_AliasDef_Perfect_Hash_OpTable::hash (const char *str, unsigned int len)
+{
+ static const unsigned char asso_values[] =
+ {
+#if defined (ACE_MVS)
+ 37, 37, 37, 37, 37, 37, 37, 37, 37, 37,
+ 37, 37, 37, 37, 37, 37, 37, 37, 37, 37,
+ 37, 37, 37, 37, 37, 37, 37, 37, 37, 37,
+ 37, 37, 37, 37, 37, 37, 37, 37, 37, 37,
+ 37, 37, 37, 37, 37, 37, 37, 37, 37, 37,
+ 37, 37, 37, 37, 37, 37, 37, 37, 37, 37,
+ 37, 37, 37, 37, 37, 37, 37, 37, 37, 37,
+ 37, 37, 37, 37, 37, 37, 37, 37, 37, 37,
+ 37, 37, 37, 37, 37, 37, 37, 37, 37, 37,
+ 37, 37, 37, 37, 37, 37, 37, 37, 37, 37,
+ 37, 37, 37, 37, 37, 37, 37, 37, 37, 0,
+ 37, 37, 37, 37, 37, 37, 37, 37, 37, 37,
+ 37, 37, 37, 37, 37, 37, 37, 37, 37, 0,
+ 37, 37, 0, 0, 0, 37, 37, 37, 37, 37,
+ 37, 37, 37, 37, 37, 37, 37, 37, 0, 0,
+ 37, 37, 37, 37, 37, 37, 37, 37, 37, 37,
+ 37, 37, 37, 10, 37, 37, 37, 37, 10, 37,
+ 37, 37, 37, 37, 37, 37, 37, 37, 37, 37,
+ 37, 37, 37, 37, 37, 37, 37, 37, 37, 37,
+ 37, 37, 37, 37, 37, 37, 37, 37, 37, 37,
+ 37, 37, 37, 37, 37, 37, 37, 37, 37, 37,
+ 37, 37, 37, 37, 37, 37, 37, 37, 37, 37,
+ 37, 37, 37, 37, 37, 37, 37, 37, 37, 37,
+ 37, 37, 37, 37, 37, 37, 37, 37, 37, 37,
+ 37, 37, 37, 37, 37, 37, 37, 37, 37, 37,
+ 37, 37, 37, 37, 37, 37,
+#else
+ 37, 37, 37, 37, 37, 37, 37, 37, 37, 37,
+ 37, 37, 37, 37, 37, 37, 37, 37, 37, 37,
+ 37, 37, 37, 37, 37, 37, 37, 37, 37, 37,
+ 37, 37, 37, 37, 37, 37, 37, 37, 37, 37,
+ 37, 37, 37, 37, 37, 37, 37, 37, 37, 37,
+ 37, 37, 37, 37, 37, 37, 37, 37, 37, 37,
+ 37, 37, 37, 37, 37, 37, 37, 37, 37, 37,
+ 37, 37, 37, 37, 37, 37, 37, 37, 37, 37,
+ 37, 37, 37, 37, 37, 37, 37, 37, 37, 37,
+ 37, 37, 37, 37, 37, 0, 37, 0, 37, 37,
+ 0, 0, 0, 37, 37, 37, 37, 37, 37, 0,
+ 0, 37, 37, 37, 37, 37, 10, 37, 37, 37,
+ 37, 10, 37, 37, 37, 37, 37, 37,
+#endif /* ACE_MVS */
+ };
+ return len + asso_values[(int) str[len - 1]] + asso_values[(int) str[0]];
+}
+
+const TAO_operation_db_entry *
+TAO_CORBA_AliasDef_Perfect_Hash_OpTable::lookup (const char *str, unsigned int len)
+{
+ enum
+ {
+ TOTAL_KEYWORDS = 21,
+ MIN_WORD_LENGTH = 4,
+ MAX_WORD_LENGTH = 26,
+ MIN_HASH_VALUE = 4,
+ MAX_HASH_VALUE = 36,
+ HASH_VALUE_RANGE = 33,
+ DUPLICATES = 6,
+ WORDLIST_SIZE = 25
+ };
+
+ static const TAO_operation_db_entry wordlist[] =
+ {
+ {"",0,0},{"",0,0},{"",0,0},{"",0,0},
+ {"move", &POA_CORBA::AliasDef::move_skel, 0},
+ {"_is_a", &POA_CORBA::AliasDef::_is_a_skel, 0},
+ {"_get_id", &POA_CORBA::AliasDef::_get_id_skel, 0},
+ {"_set_id", &POA_CORBA::AliasDef::_set_id_skel, 0},
+ {"describe", &POA_CORBA::AliasDef::describe_skel, 0},
+ {"_get_name", &POA_CORBA::AliasDef::_get_name_skel, 0},
+ {"_get_type", &POA_CORBA::AliasDef::_get_type_skel, 0},
+ {"_set_name", &POA_CORBA::AliasDef::_set_name_skel, 0},
+ {"_interface", &POA_CORBA::AliasDef::_interface_skel, 0},
+ {"_get_version", &POA_CORBA::AliasDef::_get_version_skel, 0},
+ {"_set_version", &POA_CORBA::AliasDef::_set_version_skel, 0},
+ {"_get_def_kind", &POA_CORBA::AliasDef::_get_def_kind_skel, 0},
+ {"_repository_id", &POA_CORBA::AliasDef::_repository_id_skel, 0},
+ {"_get_defined_in", &POA_CORBA::AliasDef::_get_defined_in_skel, 0},
+ {"destroy", &POA_CORBA::AliasDef::destroy_skel, 0},
+ {"_get_absolute_name", &POA_CORBA::AliasDef::_get_absolute_name_skel, 0},
+ {"_component", &POA_CORBA::AliasDef::_component_skel, 0},
+ {"_get_original_type_def", &POA_CORBA::AliasDef::_get_original_type_def_skel, 0},
+ {"_set_original_type_def", &POA_CORBA::AliasDef::_set_original_type_def_skel, 0},
+ {"_non_existent", &POA_CORBA::AliasDef::_non_existent_skel, 0},
+ {"_get_containing_repository", &POA_CORBA::AliasDef::_get_containing_repository_skel, 0},
+ };
+
+ static const signed char lookup[] =
+ {
+ -13, -2, -21, -2, 4, 5, -1, 55, 8, 51, 12, -1, -48, 15,
+ 16, 17, -1, 18, 19, -1, 20, -1, -56, 23, -9, -3, -6, -2,
+ -1, -1, -1, -1, -1, -1, -1, -1, 24,
+ };
+
+ if (len <= MAX_WORD_LENGTH && len >= MIN_WORD_LENGTH)
+ {
+ unsigned int key = hash (str, len);
+
+ if (key <= MAX_HASH_VALUE && key >= MIN_HASH_VALUE)
+ {
+ int slot = lookup[key];
+
+ if (slot >= 0 && slot < WORDLIST_SIZE)
+ {
+ const char *s = wordlist[slot].opname;
+
+ if (*str == *s && !strncmp (str + 1, s + 1, len - 1))
+ return &wordlist[slot];
+ }
+ else if (slot < 0 && slot >= -MAX_HASH_VALUE)
+ return 0;
+ else
+ {
+ unsigned int offset = key + slot + (slot > 0 ? -MAX_HASH_VALUE : MAX_HASH_VALUE);
+ const TAO_operation_db_entry *base = &wordlist[-lookup[offset]];
+ const TAO_operation_db_entry *ptr = base + -lookup[offset + 1];
+
+ while (--ptr >= base)
+ if (*str == *ptr->opname && !strncmp (str + 1, ptr->opname + 1, len - 1))
+ return ptr;
+ }
+ }
+ }
+ return 0;
+}
+
+static TAO_CORBA_AliasDef_Perfect_Hash_OpTable tao_CORBA_AliasDef_optable;
+
+// TAO_IDL - Generated from
+// be\be_visitor_interface/interface_ss.cpp:966
+
+TAO::Collocation_Proxy_Broker *
+CORBA__TAO_AliasDef_Proxy_Broker_Factory_function ( ::CORBA::Object_ptr)
+{
+ return reinterpret_cast<TAO::Collocation_Proxy_Broker *> (0xdead); // Dummy
+}
+
+int
+CORBA__TAO_AliasDef_Proxy_Broker_Factory_Initializer (size_t)
+{
+ CORBA__TAO_AliasDef_Proxy_Broker_Factory_function_pointer =
+ CORBA__TAO_AliasDef_Proxy_Broker_Factory_function;
+
+ return 0;
+}
+
+static int
+CORBA__TAO_AliasDef_Proxy_Broker_Stub_Factory_Initializer_Scarecrow =
+ CORBA__TAO_AliasDef_Proxy_Broker_Factory_Initializer (
+ reinterpret_cast<size_t> (CORBA__TAO_AliasDef_Proxy_Broker_Factory_Initializer)
+ );
+
+// TAO_IDL - Generated from
+// be\be_visitor_interface/interface_ss.cpp:103
+
+POA_CORBA::AliasDef::AliasDef (void)
+ : TAO_ServantBase ()
+{
+ this->optable_ = &tao_CORBA_AliasDef_optable;
+}
+
+POA_CORBA::AliasDef::AliasDef (const AliasDef& rhs)
+ : TAO_Abstract_ServantBase (rhs),
+ TAO_ServantBase (rhs),
+ POA_CORBA::IRObject (rhs),
+ POA_CORBA::Contained (rhs),
+ POA_CORBA::IDLType (rhs),
+ POA_CORBA::TypedefDef (rhs)
+{
+}
+
+POA_CORBA::AliasDef::~AliasDef (void)
+{
+}namespace POA_CORBA
+{
+
+
+ // TAO_IDL - Generated from
+ // be\be_visitor_operation/upcall_command_ss.cpp:127
+
+ class _get_original_type_def_AliasDef
+ : public TAO::Upcall_Command
+ {
+ public:
+ inline _get_original_type_def_AliasDef (
+ POA_CORBA::AliasDef * servant,
+ TAO_Operation_Details const * operation_details,
+ TAO::Argument * const args[])
+ : servant_ (servant)
+ , operation_details_ (operation_details)
+ , args_ (args)
+ {
+ }
+
+ virtual void execute (ACE_ENV_SINGLE_ARG_DECL)
+ {
+ TAO::SArg_Traits< ::CORBA::IDLType>::ret_arg_type retval =
+ TAO::Portable_Server::get_ret_arg< ::CORBA::IDLType> (
+ this->operation_details_,
+ this->args_);
+
+ retval =
+ this->servant_->original_type_def (
+ ACE_ENV_SINGLE_ARG_PARAMETER);
+ ACE_CHECK;
+ }
+
+ private:
+ POA_CORBA::AliasDef * const servant_;
+ TAO_Operation_Details const * const operation_details_;
+ TAO::Argument * const * const args_;
+ };
+}
+
+
+// TAO_IDL - Generated from
+// be\be_visitor_operation/operation_ss.cpp:190
+
+void POA_CORBA::AliasDef::_get_original_type_def_skel (
+ TAO_ServerRequest & server_request,
+ void * TAO_INTERCEPTOR (servant_upcall),
+ void * servant
+ ACE_ENV_ARG_DECL
+ )
+{
+#if TAO_HAS_INTERCEPTORS == 1
+ static ::CORBA::TypeCode_ptr const * const exceptions = 0;
+ static ::CORBA::ULong const nexceptions = 0;
+#endif /* TAO_HAS_INTERCEPTORS */
+
+ TAO::SArg_Traits< ::CORBA::IDLType>::ret_val retval;
+
+ TAO::Argument * const args[] =
+ {
+ &retval
+ };
+
+ static size_t const nargs = 1;
+
+ POA_CORBA::AliasDef * const impl =
+ static_cast<POA_CORBA::AliasDef *> (servant);
+
+ _get_original_type_def_AliasDef command (
+ impl,
+ server_request.operation_details (),
+ args);
+
+ TAO::Upcall_Wrapper upcall_wrapper;
+ upcall_wrapper.upcall (server_request
+ , args
+ , nargs
+ , command
+#if TAO_HAS_INTERCEPTORS == 1
+ , servant_upcall
+ , exceptions
+ , nexceptions
+#endif /* TAO_HAS_INTERCEPTORS == 1 */
+ ACE_ENV_ARG_PARAMETER);
+ ACE_CHECK;
+}namespace POA_CORBA
+{
+
+
+ // TAO_IDL - Generated from
+ // be\be_visitor_operation/upcall_command_ss.cpp:127
+
+ class _set_original_type_def_AliasDef
+ : public TAO::Upcall_Command
+ {
+ public:
+ inline _set_original_type_def_AliasDef (
+ POA_CORBA::AliasDef * servant,
+ TAO_Operation_Details const * operation_details,
+ TAO::Argument * const args[])
+ : servant_ (servant)
+ , operation_details_ (operation_details)
+ , args_ (args)
+ {
+ }
+
+ virtual void execute (ACE_ENV_SINGLE_ARG_DECL)
+ {
+ TAO::SArg_Traits< ::CORBA::IDLType>::in_arg_type arg_1 =
+ TAO::Portable_Server::get_in_arg< ::CORBA::IDLType> (
+ this->operation_details_,
+ this->args_,
+ 1);
+
+ this->servant_->original_type_def (
+ arg_1
+ ACE_ENV_ARG_PARAMETER);
+ ACE_CHECK;
+ }
+
+ private:
+ POA_CORBA::AliasDef * const servant_;
+ TAO_Operation_Details const * const operation_details_;
+ TAO::Argument * const * const args_;
+ };
+}
+
+
+// TAO_IDL - Generated from
+// be\be_visitor_operation/operation_ss.cpp:190
+
+void POA_CORBA::AliasDef::_set_original_type_def_skel (
+ TAO_ServerRequest & server_request,
+ void * TAO_INTERCEPTOR (servant_upcall),
+ void * servant
+ ACE_ENV_ARG_DECL
+ )
+{
+#if TAO_HAS_INTERCEPTORS == 1
+ static ::CORBA::TypeCode_ptr const * const exceptions = 0;
+ static ::CORBA::ULong const nexceptions = 0;
+#endif /* TAO_HAS_INTERCEPTORS */
+
+ TAO::SArg_Traits< void>::ret_val retval;
+ TAO::SArg_Traits< ::CORBA::IDLType>::in_arg_val _tao_original_type_def;
+
+ TAO::Argument * const args[] =
+ {
+ &retval,
+ &_tao_original_type_def
+ };
+
+ static size_t const nargs = 2;
+
+ POA_CORBA::AliasDef * const impl =
+ static_cast<POA_CORBA::AliasDef *> (servant);
+
+ _set_original_type_def_AliasDef command (
+ impl,
+ server_request.operation_details (),
+ args);
+
+ TAO::Upcall_Wrapper upcall_wrapper;
+ upcall_wrapper.upcall (server_request
+ , args
+ , nargs
+ , command
+#if TAO_HAS_INTERCEPTORS == 1
+ , servant_upcall
+ , exceptions
+ , nexceptions
+#endif /* TAO_HAS_INTERCEPTORS == 1 */
+ ACE_ENV_ARG_PARAMETER);
+ ACE_CHECK;
+}
+
+// TAO_IDL - Generated from
+// be\be_visitor_interface/interface_ss.cpp:169
+
+namespace POA_CORBA
+{
+
+
+ // TAO_IDL - Generated from
+ // be\be_visitor_operation/upcall_command_ss.cpp:127
+
+ class _is_a_AliasDef_Upcall_Command
+ : public TAO::Upcall_Command
+ {
+ public:
+ inline _is_a_AliasDef_Upcall_Command (
+ POA_CORBA::AliasDef * servant,
+ TAO_Operation_Details const * operation_details,
+ TAO::Argument * const args[])
+ : servant_ (servant)
+ , operation_details_ (operation_details)
+ , args_ (args)
+ {
+ }
+
+ virtual void execute (ACE_ENV_SINGLE_ARG_DECL)
+ {
+ TAO::SArg_Traits< ::ACE_InputCDR::to_boolean>::ret_arg_type retval =
+ TAO::Portable_Server::get_ret_arg< ::ACE_InputCDR::to_boolean> (
+ this->operation_details_,
+ this->args_);
+
+ TAO::SArg_Traits< ::CORBA::Char *>::in_arg_type arg_1 =
+ TAO::Portable_Server::get_in_arg< ::CORBA::Char *> (
+ this->operation_details_,
+ this->args_,
+ 1);
+
+ retval =
+ this->servant_-> _is_a (
+ arg_1
+ ACE_ENV_ARG_PARAMETER);
+ ACE_CHECK;
+ }
+
+ private:
+ POA_CORBA::AliasDef * const servant_;
+ TAO_Operation_Details const * const operation_details_;
+ TAO::Argument * const * const args_;
+ };
+}
+
+
+void POA_CORBA::AliasDef::_is_a_skel (
+ TAO_ServerRequest & server_request,
+ void * TAO_INTERCEPTOR (servant_upcall),
+ void * servant
+ ACE_ENV_ARG_DECL
+ )
+{
+#if TAO_HAS_INTERCEPTORS == 1
+ static ::CORBA::TypeCode_ptr const * const exceptions = 0;
+ static ::CORBA::ULong const nexceptions = 0;
+#endif /* TAO_HAS_INTERCEPTORS */
+
+ TAO::SArg_Traits< ::ACE_InputCDR::to_boolean>::ret_val retval;
+ TAO::SArg_Traits< ::CORBA::Char *>::in_arg_val _tao_repository_id;
+
+ TAO::Argument * const args[] =
+ {
+ &retval,
+ &_tao_repository_id
+ };
+
+ static size_t const nargs = 2;
+
+ POA_CORBA::AliasDef * const impl =
+ static_cast<POA_CORBA::AliasDef *> (servant);
+
+ _is_a_AliasDef_Upcall_Command command (
+ impl,
+ server_request.operation_details (),
+ args);
+
+ TAO::Upcall_Wrapper upcall_wrapper;
+ upcall_wrapper.upcall (server_request
+ , args
+ , nargs
+ , command
+#if TAO_HAS_INTERCEPTORS == 1
+ , servant_upcall
+ , exceptions
+ , nexceptions
+#endif /* TAO_HAS_INTERCEPTORS == 1 */
+ ACE_ENV_ARG_PARAMETER);
+ ACE_CHECK;
+}namespace POA_CORBA
+{
+
+
+ // TAO_IDL - Generated from
+ // be\be_visitor_operation/upcall_command_ss.cpp:127
+
+ class _non_existent_AliasDef_Upcall_Command
+ : public TAO::Upcall_Command
+ {
+ public:
+ inline _non_existent_AliasDef_Upcall_Command (
+ POA_CORBA::AliasDef * servant,
+ TAO_Operation_Details const * operation_details,
+ TAO::Argument * const args[])
+ : servant_ (servant)
+ , operation_details_ (operation_details)
+ , args_ (args)
+ {
+ }
+
+ virtual void execute (ACE_ENV_SINGLE_ARG_DECL)
+ {
+ TAO::SArg_Traits< ::ACE_InputCDR::to_boolean>::ret_arg_type retval =
+ TAO::Portable_Server::get_ret_arg< ::ACE_InputCDR::to_boolean> (
+ this->operation_details_,
+ this->args_);
+
+ retval =
+ this->servant_-> _non_existent (
+ ACE_ENV_SINGLE_ARG_PARAMETER);
+ ACE_CHECK;
+ }
+
+ private:
+ POA_CORBA::AliasDef * const servant_;
+ TAO_Operation_Details const * const operation_details_;
+ TAO::Argument * const * const args_;
+ };
+}
+
+
+void POA_CORBA::AliasDef::_non_existent_skel (
+ TAO_ServerRequest & server_request,
+ void * TAO_INTERCEPTOR (servant_upcall),
+ void * servant
+ ACE_ENV_ARG_DECL
+ )
+{
+#if TAO_HAS_INTERCEPTORS == 1
+ static ::CORBA::TypeCode_ptr const * const exceptions = 0;
+ static ::CORBA::ULong const nexceptions = 0;
+#endif /* TAO_HAS_INTERCEPTORS */
+
+ TAO::SArg_Traits< ::ACE_InputCDR::to_boolean>::ret_val retval;
+
+ TAO::Argument * const args[] =
+ {
+ &retval
+ };
+
+ static size_t const nargs = 1;
+
+ POA_CORBA::AliasDef * const impl =
+ static_cast<POA_CORBA::AliasDef *> (servant);
+
+ _non_existent_AliasDef_Upcall_Command command (
+ impl,
+ server_request.operation_details (),
+ args);
+
+ TAO::Upcall_Wrapper upcall_wrapper;
+ upcall_wrapper.upcall (server_request
+ , args
+ , nargs
+ , command
+#if TAO_HAS_INTERCEPTORS == 1
+ , servant_upcall
+ , exceptions
+ , nexceptions
+#endif /* TAO_HAS_INTERCEPTORS == 1 */
+ ACE_ENV_ARG_PARAMETER);
+ ACE_CHECK;
+}namespace POA_CORBA
+{
+
+
+ // TAO_IDL - Generated from
+ // be\be_visitor_operation/upcall_command_ss.cpp:127
+
+ class _repository_id_AliasDef_Upcall_Command
+ : public TAO::Upcall_Command
+ {
+ public:
+ inline _repository_id_AliasDef_Upcall_Command (
+ POA_CORBA::AliasDef * servant,
+ TAO_Operation_Details const * operation_details,
+ TAO::Argument * const args[])
+ : servant_ (servant)
+ , operation_details_ (operation_details)
+ , args_ (args)
+ {
+ }
+
+ virtual void execute (ACE_ENV_SINGLE_ARG_DECL)
+ {
+ TAO::SArg_Traits< ::CORBA::Char *>::ret_arg_type retval =
+ TAO::Portable_Server::get_ret_arg< ::CORBA::Char *> (
+ this->operation_details_,
+ this->args_);
+
+ retval =
+ this->servant_-> _repository_id (
+ ACE_ENV_SINGLE_ARG_PARAMETER);
+ ACE_CHECK;
+ }
+
+ private:
+ POA_CORBA::AliasDef * const servant_;
+ TAO_Operation_Details const * const operation_details_;
+ TAO::Argument * const * const args_;
+ };
+}
+
+
+void POA_CORBA::AliasDef::_repository_id_skel (
+ TAO_ServerRequest & server_request,
+ void * TAO_INTERCEPTOR (servant_upcall),
+ void * servant
+ ACE_ENV_ARG_DECL
+ )
+{
+#if TAO_HAS_INTERCEPTORS == 1
+ static ::CORBA::TypeCode_ptr const * const exceptions = 0;
+ static ::CORBA::ULong const nexceptions = 0;
+#endif /* TAO_HAS_INTERCEPTORS */
+
+ TAO::SArg_Traits< ::CORBA::Char *>::ret_val retval;
+
+ TAO::Argument * const args[] =
+ {
+ &retval
+ };
+
+ static size_t const nargs = 1;
+
+ POA_CORBA::AliasDef * const impl =
+ static_cast<POA_CORBA::AliasDef *> (servant);
+
+ _repository_id_AliasDef_Upcall_Command command (
+ impl,
+ server_request.operation_details (),
+ args);
+
+ TAO::Upcall_Wrapper upcall_wrapper;
+ upcall_wrapper.upcall (server_request
+ , args
+ , nargs
+ , command
+#if TAO_HAS_INTERCEPTORS == 1
+ , servant_upcall
+ , exceptions
+ , nexceptions
+#endif /* TAO_HAS_INTERCEPTORS == 1 */
+ ACE_ENV_ARG_PARAMETER);
+ ACE_CHECK;
+}
+
+// TAO_IDL - Generated from
+// be\be_visitor_interface/interface_ss.cpp:513
+
+void POA_CORBA::AliasDef::_interface_skel (
+ TAO_ServerRequest & server_request,
+ void * /* servant_upcall */,
+ void * servant
+ ACE_ENV_ARG_DECL
+ )
+{
+ TAO_IFR_Client_Adapter *_tao_adapter =
+ ACE_Dynamic_Service<TAO_IFR_Client_Adapter>::instance (
+ TAO_ORB_Core::ifr_client_adapter_name ()
+ );
+
+ if (_tao_adapter == 0)
+ {
+ ACE_THROW ( ::CORBA::INTF_REPOS ( ::CORBA::OMGVMCID | 1,
+ ::CORBA::COMPLETED_NO));
+ }
+
+ POA_CORBA::AliasDef * const impl =
+ static_cast<POA_CORBA::AliasDef *> (servant);
+ ::CORBA::InterfaceDef_ptr _tao_retval =
+ impl->_get_interface (ACE_ENV_SINGLE_ARG_PARAMETER);
+ ACE_CHECK;
+
+ server_request.init_reply ();
+ TAO_OutputCDR &_tao_out = *server_request.outgoing ();
+
+ ::CORBA::Boolean const _tao_result =
+ _tao_adapter->interfacedef_cdr_insert (
+ _tao_out,
+ _tao_retval
+ );
+
+ _tao_adapter->dispose (_tao_retval);
+
+ if (_tao_result == false)
+ {
+ ACE_THROW ( ::CORBA::MARSHAL ());
+ }
+}namespace POA_CORBA
+{
+
+
+ // TAO_IDL - Generated from
+ // be\be_visitor_operation/upcall_command_ss.cpp:127
+
+ class _get_component_AliasDef_Upcall_Command
+ : public TAO::Upcall_Command
+ {
+ public:
+ inline _get_component_AliasDef_Upcall_Command (
+ POA_CORBA::AliasDef * servant,
+ TAO_Operation_Details const * operation_details,
+ TAO::Argument * const args[])
+ : servant_ (servant)
+ , operation_details_ (operation_details)
+ , args_ (args)
+ {
+ }
+
+ virtual void execute (ACE_ENV_SINGLE_ARG_DECL)
+ {
+ TAO::SArg_Traits< ::CORBA::Object>::ret_arg_type retval =
+ TAO::Portable_Server::get_ret_arg< ::CORBA::Object> (
+ this->operation_details_,
+ this->args_);
+
+ retval =
+ this->servant_-> _get_component (
+ ACE_ENV_SINGLE_ARG_PARAMETER);
+ ACE_CHECK;
+ }
+
+ private:
+ POA_CORBA::AliasDef * const servant_;
+ TAO_Operation_Details const * const operation_details_;
+ TAO::Argument * const * const args_;
+ };
+}
+
+
+void POA_CORBA::AliasDef::_component_skel (
+ TAO_ServerRequest & server_request,
+ void * TAO_INTERCEPTOR (servant_upcall),
+ void * servant
+ ACE_ENV_ARG_DECL
+ )
+{
+#if TAO_HAS_INTERCEPTORS == 1
+ static ::CORBA::TypeCode_ptr const * const exceptions = 0;
+ static ::CORBA::ULong const nexceptions = 0;
+#endif /* TAO_HAS_INTERCEPTORS */
+
+ TAO::SArg_Traits< ::CORBA::Object>::ret_val retval;
+
+ TAO::Argument * const args[] =
+ {
+ &retval
+ };
+
+ static size_t const nargs = 1;
+
+ POA_CORBA::AliasDef * const impl =
+ static_cast<POA_CORBA::AliasDef *> (servant);
+
+ _get_component_AliasDef_Upcall_Command command (
+ impl,
+ server_request.operation_details (),
+ args);
+
+ TAO::Upcall_Wrapper upcall_wrapper;
+ upcall_wrapper.upcall (server_request
+ , args
+ , nargs
+ , command
+#if TAO_HAS_INTERCEPTORS == 1
+ , servant_upcall
+ , exceptions
+ , nexceptions
+#endif /* TAO_HAS_INTERCEPTORS == 1 */
+ ACE_ENV_ARG_PARAMETER);
+ ACE_CHECK;
+}
+
+::CORBA::Boolean POA_CORBA::AliasDef::_is_a (
+ const char* value
+ ACE_ENV_ARG_DECL_NOT_USED
+ )
+{
+ return
+ (
+ !ACE_OS::strcmp (
+ value,
+ "IDL:omg.org/CORBA/IRObject:1.0"
+ ) ||
+ !ACE_OS::strcmp (
+ value,
+ "IDL:omg.org/CORBA/Contained:1.0"
+ ) ||
+ !ACE_OS::strcmp (
+ value,
+ "IDL:omg.org/CORBA/IDLType:1.0"
+ ) ||
+ !ACE_OS::strcmp (
+ value,
+ "IDL:omg.org/CORBA/TypedefDef:1.0"
+ ) ||
+ !ACE_OS::strcmp (
+ value,
+ "IDL:omg.org/CORBA/AliasDef:1.0"
+ ) ||
+ !ACE_OS::strcmp (
+ value,
+ "IDL:omg.org/CORBA/Object:1.0"
+ )
+ );
+}
+
+const char* POA_CORBA::AliasDef::_interface_repository_id (void) const
+{
+ return "IDL:omg.org/CORBA/AliasDef:1.0";
+}
+
+// TAO_IDL - Generated from
+// be\be_visitor_interface/interface_ss.cpp:903
+
+void POA_CORBA::AliasDef::_dispatch (
+ TAO_ServerRequest & req,
+ void * servant_upcall
+ ACE_ENV_ARG_DECL
+ )
+{
+ this->synchronous_upcall_dispatch (req,
+ servant_upcall,
+ this
+ ACE_ENV_ARG_PARAMETER);
+}
+
+// TAO_IDL - Generated from
+// be\be_visitor_interface/interface_ss.cpp:851
+
+CORBA::AliasDef *
+POA_CORBA::AliasDef::_this (ACE_ENV_SINGLE_ARG_DECL)
+{
+ TAO_Stub *stub = this->_create_stub (ACE_ENV_SINGLE_ARG_PARAMETER);
+ ACE_CHECK_RETURN (0);
+
+ TAO_Stub_Auto_Ptr safe_stub (stub);
+ ::CORBA::Object_ptr tmp = CORBA::Object::_nil ();
+
+ ::CORBA::Boolean const _tao_opt_colloc =
+ stub->servant_orb_var ()->orb_core ()->optimize_collocation_objects ();
+
+ ACE_NEW_RETURN (
+ tmp,
+ ::CORBA::Object (stub, _tao_opt_colloc, this),
+ 0
+ );
+
+ ::CORBA::Object_var obj = tmp;
+ (void) safe_stub.release ();
+
+ typedef ::CORBA::AliasDef STUB_SCOPED_NAME;
+ return
+ TAO::Narrow_Utils<STUB_SCOPED_NAME>::unchecked_narrow (
+ obj.in (),
+ CORBA__TAO_AliasDef_Proxy_Broker_Factory_function_pointer
+ );
+}
+
+// TAO_IDL - Generated from
+// be\be_interface.cpp:1499
+
+class TAO_CORBA_NativeDef_Perfect_Hash_OpTable
+ : public TAO_Perfect_Hash_OpTable
+{
+private:
+ unsigned int hash (const char *str, unsigned int len);
+
+public:
+ const TAO_operation_db_entry * lookup (const char *str, unsigned int len);
+};
+
+/* C++ code produced by gperf version 2.8 (ACE version) */
+/* Command-line: C:\ACE\latest\ACE_wrappers\bin\gperf.exe -m -M -J -c -C -D -E -T -f 0 -F 0,0 -a -o -t -p -K opname -L C++ -Z TAO_CORBA_NativeDef_Perfect_Hash_OpTable -N lookup */
+unsigned int
+TAO_CORBA_NativeDef_Perfect_Hash_OpTable::hash (const char *str, unsigned int len)
+{
+ static const unsigned char asso_values[] =
+ {
+#if defined (ACE_MVS)
+ 37, 37, 37, 37, 37, 37, 37, 37, 37, 37,
+ 37, 37, 37, 37, 37, 37, 37, 37, 37, 37,
+ 37, 37, 37, 37, 37, 37, 37, 37, 37, 37,
+ 37, 37, 37, 37, 37, 37, 37, 37, 37, 37,
+ 37, 37, 37, 37, 37, 37, 37, 37, 37, 37,
+ 37, 37, 37, 37, 37, 37, 37, 37, 37, 37,
+ 37, 37, 37, 37, 37, 37, 37, 37, 37, 37,
+ 37, 37, 37, 37, 37, 37, 37, 37, 37, 37,
+ 37, 37, 37, 37, 37, 37, 37, 37, 37, 37,
+ 37, 37, 37, 37, 37, 37, 37, 37, 37, 37,
+ 37, 37, 37, 37, 37, 37, 37, 37, 37, 0,
+ 37, 37, 37, 37, 37, 37, 37, 37, 37, 37,
+ 37, 37, 37, 37, 37, 37, 37, 37, 37, 0,
+ 37, 37, 0, 0, 37, 37, 37, 37, 37, 37,
+ 37, 37, 37, 37, 37, 37, 37, 37, 0, 0,
+ 37, 37, 37, 37, 37, 37, 37, 37, 37, 37,
+ 37, 37, 37, 10, 37, 37, 37, 37, 10, 37,
+ 37, 37, 37, 37, 37, 37, 37, 37, 37, 37,
+ 37, 37, 37, 37, 37, 37, 37, 37, 37, 37,
+ 37, 37, 37, 37, 37, 37, 37, 37, 37, 37,
+ 37, 37, 37, 37, 37, 37, 37, 37, 37, 37,
+ 37, 37, 37, 37, 37, 37, 37, 37, 37, 37,
+ 37, 37, 37, 37, 37, 37, 37, 37, 37, 37,
+ 37, 37, 37, 37, 37, 37, 37, 37, 37, 37,
+ 37, 37, 37, 37, 37, 37, 37, 37, 37, 37,
+ 37, 37, 37, 37, 37, 37,
+#else
+ 37, 37, 37, 37, 37, 37, 37, 37, 37, 37,
+ 37, 37, 37, 37, 37, 37, 37, 37, 37, 37,
+ 37, 37, 37, 37, 37, 37, 37, 37, 37, 37,
+ 37, 37, 37, 37, 37, 37, 37, 37, 37, 37,
+ 37, 37, 37, 37, 37, 37, 37, 37, 37, 37,
+ 37, 37, 37, 37, 37, 37, 37, 37, 37, 37,
+ 37, 37, 37, 37, 37, 37, 37, 37, 37, 37,
+ 37, 37, 37, 37, 37, 37, 37, 37, 37, 37,
+ 37, 37, 37, 37, 37, 37, 37, 37, 37, 37,
+ 37, 37, 37, 37, 37, 0, 37, 0, 37, 37,
+ 0, 0, 37, 37, 37, 37, 37, 37, 37, 0,
+ 0, 37, 37, 37, 37, 37, 10, 37, 37, 37,
+ 37, 10, 37, 37, 37, 37, 37, 37,
+#endif /* ACE_MVS */
+ };
+ return len + asso_values[(int) str[len - 1]] + asso_values[(int) str[0]];
+}
+
+const TAO_operation_db_entry *
+TAO_CORBA_NativeDef_Perfect_Hash_OpTable::lookup (const char *str, unsigned int len)
+{
+ enum
+ {
+ TOTAL_KEYWORDS = 19,
+ MIN_WORD_LENGTH = 4,
+ MAX_WORD_LENGTH = 26,
+ MIN_HASH_VALUE = 4,
+ MAX_HASH_VALUE = 36,
+ HASH_VALUE_RANGE = 33,
+ DUPLICATES = 5,
+ WORDLIST_SIZE = 23
+ };
+
+ static const TAO_operation_db_entry wordlist[] =
+ {
+ {"",0,0},{"",0,0},{"",0,0},{"",0,0},
+ {"move", &POA_CORBA::NativeDef::move_skel, 0},
+ {"_is_a", &POA_CORBA::NativeDef::_is_a_skel, 0},
+ {"_get_id", &POA_CORBA::NativeDef::_get_id_skel, 0},
+ {"_set_id", &POA_CORBA::NativeDef::_set_id_skel, 0},
+ {"describe", &POA_CORBA::NativeDef::describe_skel, 0},
+ {"_get_name", &POA_CORBA::NativeDef::_get_name_skel, 0},
+ {"_get_type", &POA_CORBA::NativeDef::_get_type_skel, 0},
+ {"_set_name", &POA_CORBA::NativeDef::_set_name_skel, 0},
+ {"_interface", &POA_CORBA::NativeDef::_interface_skel, 0},
+ {"_get_version", &POA_CORBA::NativeDef::_get_version_skel, 0},
+ {"_set_version", &POA_CORBA::NativeDef::_set_version_skel, 0},
+ {"_get_def_kind", &POA_CORBA::NativeDef::_get_def_kind_skel, 0},
+ {"_repository_id", &POA_CORBA::NativeDef::_repository_id_skel, 0},
+ {"_get_defined_in", &POA_CORBA::NativeDef::_get_defined_in_skel, 0},
+ {"destroy", &POA_CORBA::NativeDef::destroy_skel, 0},
+ {"_get_absolute_name", &POA_CORBA::NativeDef::_get_absolute_name_skel, 0},
+ {"_component", &POA_CORBA::NativeDef::_component_skel, 0},
+ {"_non_existent", &POA_CORBA::NativeDef::_non_existent_skel, 0},
+ {"_get_containing_repository", &POA_CORBA::NativeDef::_get_containing_repository_skel, 0},
+ };
+
+ static const signed char lookup[] =
+ {
+ -9, -3, -13, -2, 4, 5, -1, 50, 8, -45, 12, -1, -46, 15,
+ 16, 17, -1, 18, 19, -1, 20, -6, -2, 21, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1, 22,
+ };
+
+ if (len <= MAX_WORD_LENGTH && len >= MIN_WORD_LENGTH)
+ {
+ unsigned int key = hash (str, len);
+
+ if (key <= MAX_HASH_VALUE && key >= MIN_HASH_VALUE)
+ {
+ int slot = lookup[key];
+
+ if (slot >= 0 && slot < WORDLIST_SIZE)
+ {
+ const char *s = wordlist[slot].opname;
+
+ if (*str == *s && !strncmp (str + 1, s + 1, len - 1))
+ return &wordlist[slot];
+ }
+ else if (slot < 0 && slot >= -MAX_HASH_VALUE)
+ return 0;
+ else
+ {
+ unsigned int offset = key + slot + (slot > 0 ? -MAX_HASH_VALUE : MAX_HASH_VALUE);
+ const TAO_operation_db_entry *base = &wordlist[-lookup[offset]];
+ const TAO_operation_db_entry *ptr = base + -lookup[offset + 1];
+
+ while (--ptr >= base)
+ if (*str == *ptr->opname && !strncmp (str + 1, ptr->opname + 1, len - 1))
+ return ptr;
+ }
+ }
+ }
+ return 0;
+}
+
+static TAO_CORBA_NativeDef_Perfect_Hash_OpTable tao_CORBA_NativeDef_optable;
+
+// TAO_IDL - Generated from
+// be\be_visitor_interface/interface_ss.cpp:966
+
+TAO::Collocation_Proxy_Broker *
+CORBA__TAO_NativeDef_Proxy_Broker_Factory_function ( ::CORBA::Object_ptr)
+{
+ return reinterpret_cast<TAO::Collocation_Proxy_Broker *> (0xdead); // Dummy
+}
+
+int
+CORBA__TAO_NativeDef_Proxy_Broker_Factory_Initializer (size_t)
+{
+ CORBA__TAO_NativeDef_Proxy_Broker_Factory_function_pointer =
+ CORBA__TAO_NativeDef_Proxy_Broker_Factory_function;
+
+ return 0;
+}
+
+static int
+CORBA__TAO_NativeDef_Proxy_Broker_Stub_Factory_Initializer_Scarecrow =
+ CORBA__TAO_NativeDef_Proxy_Broker_Factory_Initializer (
+ reinterpret_cast<size_t> (CORBA__TAO_NativeDef_Proxy_Broker_Factory_Initializer)
+ );
+
+// TAO_IDL - Generated from
+// be\be_visitor_interface/interface_ss.cpp:103
+
+POA_CORBA::NativeDef::NativeDef (void)
+ : TAO_ServantBase ()
+{
+ this->optable_ = &tao_CORBA_NativeDef_optable;
+}
+
+POA_CORBA::NativeDef::NativeDef (const NativeDef& rhs)
+ : TAO_Abstract_ServantBase (rhs),
+ TAO_ServantBase (rhs),
+ POA_CORBA::IRObject (rhs),
+ POA_CORBA::Contained (rhs),
+ POA_CORBA::IDLType (rhs),
+ POA_CORBA::TypedefDef (rhs)
+{
+}
+
+POA_CORBA::NativeDef::~NativeDef (void)
+{
+}
+
+// TAO_IDL - Generated from
+// be\be_visitor_interface/interface_ss.cpp:169
+
+namespace POA_CORBA
+{
+
+
+ // TAO_IDL - Generated from
+ // be\be_visitor_operation/upcall_command_ss.cpp:127
+
+ class _is_a_NativeDef_Upcall_Command
+ : public TAO::Upcall_Command
+ {
+ public:
+ inline _is_a_NativeDef_Upcall_Command (
+ POA_CORBA::NativeDef * servant,
+ TAO_Operation_Details const * operation_details,
+ TAO::Argument * const args[])
+ : servant_ (servant)
+ , operation_details_ (operation_details)
+ , args_ (args)
+ {
+ }
+
+ virtual void execute (ACE_ENV_SINGLE_ARG_DECL)
+ {
+ TAO::SArg_Traits< ::ACE_InputCDR::to_boolean>::ret_arg_type retval =
+ TAO::Portable_Server::get_ret_arg< ::ACE_InputCDR::to_boolean> (
+ this->operation_details_,
+ this->args_);
+
+ TAO::SArg_Traits< ::CORBA::Char *>::in_arg_type arg_1 =
+ TAO::Portable_Server::get_in_arg< ::CORBA::Char *> (
+ this->operation_details_,
+ this->args_,
+ 1);
+
+ retval =
+ this->servant_-> _is_a (
+ arg_1
+ ACE_ENV_ARG_PARAMETER);
+ ACE_CHECK;
+ }
+
+ private:
+ POA_CORBA::NativeDef * const servant_;
+ TAO_Operation_Details const * const operation_details_;
+ TAO::Argument * const * const args_;
+ };
+}
+
+
+void POA_CORBA::NativeDef::_is_a_skel (
+ TAO_ServerRequest & server_request,
+ void * TAO_INTERCEPTOR (servant_upcall),
+ void * servant
+ ACE_ENV_ARG_DECL
+ )
+{
+#if TAO_HAS_INTERCEPTORS == 1
+ static ::CORBA::TypeCode_ptr const * const exceptions = 0;
+ static ::CORBA::ULong const nexceptions = 0;
+#endif /* TAO_HAS_INTERCEPTORS */
+
+ TAO::SArg_Traits< ::ACE_InputCDR::to_boolean>::ret_val retval;
+ TAO::SArg_Traits< ::CORBA::Char *>::in_arg_val _tao_repository_id;
+
+ TAO::Argument * const args[] =
+ {
+ &retval,
+ &_tao_repository_id
+ };
+
+ static size_t const nargs = 2;
+
+ POA_CORBA::NativeDef * const impl =
+ static_cast<POA_CORBA::NativeDef *> (servant);
+
+ _is_a_NativeDef_Upcall_Command command (
+ impl,
+ server_request.operation_details (),
+ args);
+
+ TAO::Upcall_Wrapper upcall_wrapper;
+ upcall_wrapper.upcall (server_request
+ , args
+ , nargs
+ , command
+#if TAO_HAS_INTERCEPTORS == 1
+ , servant_upcall
+ , exceptions
+ , nexceptions
+#endif /* TAO_HAS_INTERCEPTORS == 1 */
+ ACE_ENV_ARG_PARAMETER);
+ ACE_CHECK;
+}namespace POA_CORBA
+{
+
+
+ // TAO_IDL - Generated from
+ // be\be_visitor_operation/upcall_command_ss.cpp:127
+
+ class _non_existent_NativeDef_Upcall_Command
+ : public TAO::Upcall_Command
+ {
+ public:
+ inline _non_existent_NativeDef_Upcall_Command (
+ POA_CORBA::NativeDef * servant,
+ TAO_Operation_Details const * operation_details,
+ TAO::Argument * const args[])
+ : servant_ (servant)
+ , operation_details_ (operation_details)
+ , args_ (args)
+ {
+ }
+
+ virtual void execute (ACE_ENV_SINGLE_ARG_DECL)
+ {
+ TAO::SArg_Traits< ::ACE_InputCDR::to_boolean>::ret_arg_type retval =
+ TAO::Portable_Server::get_ret_arg< ::ACE_InputCDR::to_boolean> (
+ this->operation_details_,
+ this->args_);
+
+ retval =
+ this->servant_-> _non_existent (
+ ACE_ENV_SINGLE_ARG_PARAMETER);
+ ACE_CHECK;
+ }
+
+ private:
+ POA_CORBA::NativeDef * const servant_;
+ TAO_Operation_Details const * const operation_details_;
+ TAO::Argument * const * const args_;
+ };
+}
+
+
+void POA_CORBA::NativeDef::_non_existent_skel (
+ TAO_ServerRequest & server_request,
+ void * TAO_INTERCEPTOR (servant_upcall),
+ void * servant
+ ACE_ENV_ARG_DECL
+ )
+{
+#if TAO_HAS_INTERCEPTORS == 1
+ static ::CORBA::TypeCode_ptr const * const exceptions = 0;
+ static ::CORBA::ULong const nexceptions = 0;
+#endif /* TAO_HAS_INTERCEPTORS */
+
+ TAO::SArg_Traits< ::ACE_InputCDR::to_boolean>::ret_val retval;
+
+ TAO::Argument * const args[] =
+ {
+ &retval
+ };
+
+ static size_t const nargs = 1;
+
+ POA_CORBA::NativeDef * const impl =
+ static_cast<POA_CORBA::NativeDef *> (servant);
+
+ _non_existent_NativeDef_Upcall_Command command (
+ impl,
+ server_request.operation_details (),
+ args);
+
+ TAO::Upcall_Wrapper upcall_wrapper;
+ upcall_wrapper.upcall (server_request
+ , args
+ , nargs
+ , command
+#if TAO_HAS_INTERCEPTORS == 1
+ , servant_upcall
+ , exceptions
+ , nexceptions
+#endif /* TAO_HAS_INTERCEPTORS == 1 */
+ ACE_ENV_ARG_PARAMETER);
+ ACE_CHECK;
+}namespace POA_CORBA
+{
+
+
+ // TAO_IDL - Generated from
+ // be\be_visitor_operation/upcall_command_ss.cpp:127
+
+ class _repository_id_NativeDef_Upcall_Command
+ : public TAO::Upcall_Command
+ {
+ public:
+ inline _repository_id_NativeDef_Upcall_Command (
+ POA_CORBA::NativeDef * servant,
+ TAO_Operation_Details const * operation_details,
+ TAO::Argument * const args[])
+ : servant_ (servant)
+ , operation_details_ (operation_details)
+ , args_ (args)
+ {
+ }
+
+ virtual void execute (ACE_ENV_SINGLE_ARG_DECL)
+ {
+ TAO::SArg_Traits< ::CORBA::Char *>::ret_arg_type retval =
+ TAO::Portable_Server::get_ret_arg< ::CORBA::Char *> (
+ this->operation_details_,
+ this->args_);
+
+ retval =
+ this->servant_-> _repository_id (
+ ACE_ENV_SINGLE_ARG_PARAMETER);
+ ACE_CHECK;
+ }
+
+ private:
+ POA_CORBA::NativeDef * const servant_;
+ TAO_Operation_Details const * const operation_details_;
+ TAO::Argument * const * const args_;
+ };
+}
+
+
+void POA_CORBA::NativeDef::_repository_id_skel (
+ TAO_ServerRequest & server_request,
+ void * TAO_INTERCEPTOR (servant_upcall),
+ void * servant
+ ACE_ENV_ARG_DECL
+ )
+{
+#if TAO_HAS_INTERCEPTORS == 1
+ static ::CORBA::TypeCode_ptr const * const exceptions = 0;
+ static ::CORBA::ULong const nexceptions = 0;
+#endif /* TAO_HAS_INTERCEPTORS */
+
+ TAO::SArg_Traits< ::CORBA::Char *>::ret_val retval;
+
+ TAO::Argument * const args[] =
+ {
+ &retval
+ };
+
+ static size_t const nargs = 1;
+
+ POA_CORBA::NativeDef * const impl =
+ static_cast<POA_CORBA::NativeDef *> (servant);
+
+ _repository_id_NativeDef_Upcall_Command command (
+ impl,
+ server_request.operation_details (),
+ args);
+
+ TAO::Upcall_Wrapper upcall_wrapper;
+ upcall_wrapper.upcall (server_request
+ , args
+ , nargs
+ , command
+#if TAO_HAS_INTERCEPTORS == 1
+ , servant_upcall
+ , exceptions
+ , nexceptions
+#endif /* TAO_HAS_INTERCEPTORS == 1 */
+ ACE_ENV_ARG_PARAMETER);
+ ACE_CHECK;
+}
+
+// TAO_IDL - Generated from
+// be\be_visitor_interface/interface_ss.cpp:513
+
+void POA_CORBA::NativeDef::_interface_skel (
+ TAO_ServerRequest & server_request,
+ void * /* servant_upcall */,
+ void * servant
+ ACE_ENV_ARG_DECL
+ )
+{
+ TAO_IFR_Client_Adapter *_tao_adapter =
+ ACE_Dynamic_Service<TAO_IFR_Client_Adapter>::instance (
+ TAO_ORB_Core::ifr_client_adapter_name ()
+ );
+
+ if (_tao_adapter == 0)
+ {
+ ACE_THROW ( ::CORBA::INTF_REPOS ( ::CORBA::OMGVMCID | 1,
+ ::CORBA::COMPLETED_NO));
+ }
+
+ POA_CORBA::NativeDef * const impl =
+ static_cast<POA_CORBA::NativeDef *> (servant);
+ ::CORBA::InterfaceDef_ptr _tao_retval =
+ impl->_get_interface (ACE_ENV_SINGLE_ARG_PARAMETER);
+ ACE_CHECK;
+
+ server_request.init_reply ();
+ TAO_OutputCDR &_tao_out = *server_request.outgoing ();
+
+ ::CORBA::Boolean const _tao_result =
+ _tao_adapter->interfacedef_cdr_insert (
+ _tao_out,
+ _tao_retval
+ );
+
+ _tao_adapter->dispose (_tao_retval);
+
+ if (_tao_result == false)
+ {
+ ACE_THROW ( ::CORBA::MARSHAL ());
+ }
+}namespace POA_CORBA
+{
+
+
+ // TAO_IDL - Generated from
+ // be\be_visitor_operation/upcall_command_ss.cpp:127
+
+ class _get_component_NativeDef_Upcall_Command
+ : public TAO::Upcall_Command
+ {
+ public:
+ inline _get_component_NativeDef_Upcall_Command (
+ POA_CORBA::NativeDef * servant,
+ TAO_Operation_Details const * operation_details,
+ TAO::Argument * const args[])
+ : servant_ (servant)
+ , operation_details_ (operation_details)
+ , args_ (args)
+ {
+ }
+
+ virtual void execute (ACE_ENV_SINGLE_ARG_DECL)
+ {
+ TAO::SArg_Traits< ::CORBA::Object>::ret_arg_type retval =
+ TAO::Portable_Server::get_ret_arg< ::CORBA::Object> (
+ this->operation_details_,
+ this->args_);
+
+ retval =
+ this->servant_-> _get_component (
+ ACE_ENV_SINGLE_ARG_PARAMETER);
+ ACE_CHECK;
+ }
+
+ private:
+ POA_CORBA::NativeDef * const servant_;
+ TAO_Operation_Details const * const operation_details_;
+ TAO::Argument * const * const args_;
+ };
+}
+
+
+void POA_CORBA::NativeDef::_component_skel (
+ TAO_ServerRequest & server_request,
+ void * TAO_INTERCEPTOR (servant_upcall),
+ void * servant
+ ACE_ENV_ARG_DECL
+ )
+{
+#if TAO_HAS_INTERCEPTORS == 1
+ static ::CORBA::TypeCode_ptr const * const exceptions = 0;
+ static ::CORBA::ULong const nexceptions = 0;
+#endif /* TAO_HAS_INTERCEPTORS */
+
+ TAO::SArg_Traits< ::CORBA::Object>::ret_val retval;
+
+ TAO::Argument * const args[] =
+ {
+ &retval
+ };
+
+ static size_t const nargs = 1;
+
+ POA_CORBA::NativeDef * const impl =
+ static_cast<POA_CORBA::NativeDef *> (servant);
+
+ _get_component_NativeDef_Upcall_Command command (
+ impl,
+ server_request.operation_details (),
+ args);
+
+ TAO::Upcall_Wrapper upcall_wrapper;
+ upcall_wrapper.upcall (server_request
+ , args
+ , nargs
+ , command
+#if TAO_HAS_INTERCEPTORS == 1
+ , servant_upcall
+ , exceptions
+ , nexceptions
+#endif /* TAO_HAS_INTERCEPTORS == 1 */
+ ACE_ENV_ARG_PARAMETER);
+ ACE_CHECK;
+}
+
+::CORBA::Boolean POA_CORBA::NativeDef::_is_a (
+ const char* value
+ ACE_ENV_ARG_DECL_NOT_USED
+ )
+{
+ return
+ (
+ !ACE_OS::strcmp (
+ value,
+ "IDL:omg.org/CORBA/IRObject:1.0"
+ ) ||
+ !ACE_OS::strcmp (
+ value,
+ "IDL:omg.org/CORBA/Contained:1.0"
+ ) ||
+ !ACE_OS::strcmp (
+ value,
+ "IDL:omg.org/CORBA/IDLType:1.0"
+ ) ||
+ !ACE_OS::strcmp (
+ value,
+ "IDL:omg.org/CORBA/TypedefDef:1.0"
+ ) ||
+ !ACE_OS::strcmp (
+ value,
+ "IDL:omg.org/CORBA/NativeDef:1.0"
+ ) ||
+ !ACE_OS::strcmp (
+ value,
+ "IDL:omg.org/CORBA/Object:1.0"
+ )
+ );
+}
+
+const char* POA_CORBA::NativeDef::_interface_repository_id (void) const
+{
+ return "IDL:omg.org/CORBA/NativeDef:1.0";
+}
+
+// TAO_IDL - Generated from
+// be\be_visitor_interface/interface_ss.cpp:903
+
+void POA_CORBA::NativeDef::_dispatch (
+ TAO_ServerRequest & req,
+ void * servant_upcall
+ ACE_ENV_ARG_DECL
+ )
+{
+ this->synchronous_upcall_dispatch (req,
+ servant_upcall,
+ this
+ ACE_ENV_ARG_PARAMETER);
+}
+
+// TAO_IDL - Generated from
+// be\be_visitor_interface/interface_ss.cpp:851
+
+CORBA::NativeDef *
+POA_CORBA::NativeDef::_this (ACE_ENV_SINGLE_ARG_DECL)
+{
+ TAO_Stub *stub = this->_create_stub (ACE_ENV_SINGLE_ARG_PARAMETER);
+ ACE_CHECK_RETURN (0);
+
+ TAO_Stub_Auto_Ptr safe_stub (stub);
+ ::CORBA::Object_ptr tmp = CORBA::Object::_nil ();
+
+ ::CORBA::Boolean const _tao_opt_colloc =
+ stub->servant_orb_var ()->orb_core ()->optimize_collocation_objects ();
+
+ ACE_NEW_RETURN (
+ tmp,
+ ::CORBA::Object (stub, _tao_opt_colloc, this),
+ 0
+ );
+
+ ::CORBA::Object_var obj = tmp;
+ (void) safe_stub.release ();
+
+ typedef ::CORBA::NativeDef STUB_SCOPED_NAME;
+ return
+ TAO::Narrow_Utils<STUB_SCOPED_NAME>::unchecked_narrow (
+ obj.in (),
+ CORBA__TAO_NativeDef_Proxy_Broker_Factory_function_pointer
+ );
+}
+
+// TAO_IDL - Generated from
+// be\be_interface.cpp:1499
+
+class TAO_CORBA_PrimitiveDef_Perfect_Hash_OpTable
+ : public TAO_Perfect_Hash_OpTable
+{
+private:
+ unsigned int hash (const char *str, unsigned int len);
+
+public:
+ const TAO_operation_db_entry * lookup (const char *str, unsigned int len);
+};
+
+/* C++ code produced by gperf version 2.8 (ACE version) */
+/* Command-line: C:\ACE\latest\ACE_wrappers\bin\gperf.exe -m -M -J -c -C -D -E -T -f 0 -F 0,0 -a -o -t -p -K opname -L C++ -Z TAO_CORBA_PrimitiveDef_Perfect_Hash_OpTable -N lookup */
+unsigned int
+TAO_CORBA_PrimitiveDef_Perfect_Hash_OpTable::hash (const char *str, unsigned int len)
+{
+ static const unsigned char asso_values[] =
+ {
+#if defined (ACE_MVS)
+ 21, 21, 21, 21, 21, 21, 21, 21, 21, 21,
+ 21, 21, 21, 21, 21, 21, 21, 21, 21, 21,
+ 21, 21, 21, 21, 21, 21, 21, 21, 21, 21,
+ 21, 21, 21, 21, 21, 21, 21, 21, 21, 21,
+ 21, 21, 21, 21, 21, 21, 21, 21, 21, 21,
+ 21, 21, 21, 21, 21, 21, 21, 21, 21, 21,
+ 21, 21, 21, 21, 21, 21, 21, 21, 21, 21,
+ 21, 21, 21, 21, 21, 21, 21, 21, 21, 21,
+ 21, 21, 21, 21, 21, 21, 21, 21, 21, 21,
+ 21, 21, 21, 21, 21, 21, 21, 21, 21, 21,
+ 21, 21, 21, 21, 21, 21, 21, 21, 21, 0,
+ 21, 21, 21, 21, 21, 21, 21, 21, 21, 21,
+ 21, 21, 21, 21, 21, 21, 21, 21, 21, 0,
+ 21, 21, 0, 10, 21, 21, 21, 21, 21, 21,
+ 21, 21, 21, 21, 21, 21, 21, 21, 21, 21,
+ 21, 21, 21, 21, 21, 21, 21, 21, 21, 21,
+ 21, 21, 21, 5, 21, 21, 21, 21, 0, 21,
+ 21, 21, 21, 21, 21, 21, 21, 21, 21, 21,
+ 21, 21, 21, 21, 21, 21, 21, 21, 21, 21,
+ 21, 21, 21, 21, 21, 21, 21, 21, 21, 21,
+ 21, 21, 21, 21, 21, 21, 21, 21, 21, 21,
+ 21, 21, 21, 21, 21, 21, 21, 21, 21, 21,
+ 21, 21, 21, 21, 21, 21, 21, 21, 21, 21,
+ 21, 21, 21, 21, 21, 21, 21, 21, 21, 21,
+ 21, 21, 21, 21, 21, 21, 21, 21, 21, 21,
+ 21, 21, 21, 21, 21, 21,
+#else
+ 21, 21, 21, 21, 21, 21, 21, 21, 21, 21,
+ 21, 21, 21, 21, 21, 21, 21, 21, 21, 21,
+ 21, 21, 21, 21, 21, 21, 21, 21, 21, 21,
+ 21, 21, 21, 21, 21, 21, 21, 21, 21, 21,
+ 21, 21, 21, 21, 21, 21, 21, 21, 21, 21,
+ 21, 21, 21, 21, 21, 21, 21, 21, 21, 21,
+ 21, 21, 21, 21, 21, 21, 21, 21, 21, 21,
+ 21, 21, 21, 21, 21, 21, 21, 21, 21, 21,
+ 21, 21, 21, 21, 21, 21, 21, 21, 21, 21,
+ 21, 21, 21, 21, 21, 0, 21, 0, 21, 21,
+ 0, 10, 21, 21, 21, 21, 21, 21, 21, 21,
+ 21, 21, 21, 21, 21, 21, 5, 21, 21, 21,
+ 21, 0, 21, 21, 21, 21, 21, 21,
+#endif /* ACE_MVS */
+ };
+ return len + asso_values[(int) str[len - 1]] + asso_values[(int) str[0]];
+}
+
+const TAO_operation_db_entry *
+TAO_CORBA_PrimitiveDef_Perfect_Hash_OpTable::lookup (const char *str, unsigned int len)
+{
+ enum
+ {
+ TOTAL_KEYWORDS = 9,
+ MIN_WORD_LENGTH = 5,
+ MAX_WORD_LENGTH = 14,
+ MIN_HASH_VALUE = 5,
+ MAX_HASH_VALUE = 20,
+ HASH_VALUE_RANGE = 16,
+ DUPLICATES = 0,
+ WORDLIST_SIZE = 14
+ };
+
+ static const TAO_operation_db_entry wordlist[] =
+ {
+ {"",0,0},{"",0,0},{"",0,0},{"",0,0},{"",0,0},
+ {"_is_a", &POA_CORBA::PrimitiveDef::_is_a_skel, 0},
+ {"",0,0},
+ {"destroy", &POA_CORBA::PrimitiveDef::destroy_skel, 0},
+ {"",0,0},
+ {"_get_kind", &POA_CORBA::PrimitiveDef::_get_kind_skel, 0},
+ {"",0,0},{"",0,0},{"",0,0},
+ {"_get_def_kind", &POA_CORBA::PrimitiveDef::_get_def_kind_skel, 0},
+ {"_repository_id", &POA_CORBA::PrimitiveDef::_repository_id_skel, 0},
+ {"_component", &POA_CORBA::PrimitiveDef::_component_skel, 0},
+ {"",0,0},{"",0,0},
+ {"_non_existent", &POA_CORBA::PrimitiveDef::_non_existent_skel, 0},
+ {"_get_type", &POA_CORBA::PrimitiveDef::_get_type_skel, 0},
+ {"_interface", &POA_CORBA::PrimitiveDef::_interface_skel, 0},
+ };
+
+ if (len <= MAX_WORD_LENGTH && len >= MIN_WORD_LENGTH)
+ {
+ unsigned int key = hash (str, len);
+
+ if (key <= MAX_HASH_VALUE && key >= MIN_HASH_VALUE)
+ {
+ const char *s = wordlist[key].opname;
+
+ if (*str == *s && !strncmp (str + 1, s + 1, len - 1))
+ return &wordlist[key];
+ }
+ }
+ return 0;
+}
+
+static TAO_CORBA_PrimitiveDef_Perfect_Hash_OpTable tao_CORBA_PrimitiveDef_optable;
+
+// TAO_IDL - Generated from
+// be\be_visitor_interface/interface_ss.cpp:966
+
+TAO::Collocation_Proxy_Broker *
+CORBA__TAO_PrimitiveDef_Proxy_Broker_Factory_function ( ::CORBA::Object_ptr)
+{
+ return reinterpret_cast<TAO::Collocation_Proxy_Broker *> (0xdead); // Dummy
+}
+
+int
+CORBA__TAO_PrimitiveDef_Proxy_Broker_Factory_Initializer (size_t)
+{
+ CORBA__TAO_PrimitiveDef_Proxy_Broker_Factory_function_pointer =
+ CORBA__TAO_PrimitiveDef_Proxy_Broker_Factory_function;
+
+ return 0;
+}
+
+static int
+CORBA__TAO_PrimitiveDef_Proxy_Broker_Stub_Factory_Initializer_Scarecrow =
+ CORBA__TAO_PrimitiveDef_Proxy_Broker_Factory_Initializer (
+ reinterpret_cast<size_t> (CORBA__TAO_PrimitiveDef_Proxy_Broker_Factory_Initializer)
+ );
+
+// TAO_IDL - Generated from
+// be\be_visitor_interface/interface_ss.cpp:103
+
+POA_CORBA::PrimitiveDef::PrimitiveDef (void)
+ : TAO_ServantBase ()
+{
+ this->optable_ = &tao_CORBA_PrimitiveDef_optable;
+}
+
+POA_CORBA::PrimitiveDef::PrimitiveDef (const PrimitiveDef& rhs)
+ : TAO_Abstract_ServantBase (rhs),
+ TAO_ServantBase (rhs),
+ POA_CORBA::IRObject (rhs),
+ POA_CORBA::IDLType (rhs)
+{
+}
+
+POA_CORBA::PrimitiveDef::~PrimitiveDef (void)
+{
+}namespace POA_CORBA
+{
+
+
+ // TAO_IDL - Generated from
+ // be\be_visitor_operation/upcall_command_ss.cpp:127
+
+ class _get_kind_PrimitiveDef
+ : public TAO::Upcall_Command
+ {
+ public:
+ inline _get_kind_PrimitiveDef (
+ POA_CORBA::PrimitiveDef * servant,
+ TAO_Operation_Details const * operation_details,
+ TAO::Argument * const args[])
+ : servant_ (servant)
+ , operation_details_ (operation_details)
+ , args_ (args)
+ {
+ }
+
+ virtual void execute (ACE_ENV_SINGLE_ARG_DECL)
+ {
+ TAO::SArg_Traits< ::CORBA::PrimitiveKind>::ret_arg_type retval =
+ TAO::Portable_Server::get_ret_arg< ::CORBA::PrimitiveKind> (
+ this->operation_details_,
+ this->args_);
+
+ retval =
+ this->servant_->kind (
+ ACE_ENV_SINGLE_ARG_PARAMETER);
+ ACE_CHECK;
+ }
+
+ private:
+ POA_CORBA::PrimitiveDef * const servant_;
+ TAO_Operation_Details const * const operation_details_;
+ TAO::Argument * const * const args_;
+ };
+}
+
+
+// TAO_IDL - Generated from
+// be\be_visitor_operation/operation_ss.cpp:190
+
+void POA_CORBA::PrimitiveDef::_get_kind_skel (
+ TAO_ServerRequest & server_request,
+ void * TAO_INTERCEPTOR (servant_upcall),
+ void * servant
+ ACE_ENV_ARG_DECL
+ )
+{
+#if TAO_HAS_INTERCEPTORS == 1
+ static ::CORBA::TypeCode_ptr const * const exceptions = 0;
+ static ::CORBA::ULong const nexceptions = 0;
+#endif /* TAO_HAS_INTERCEPTORS */
+
+ TAO::SArg_Traits< ::CORBA::PrimitiveKind>::ret_val retval;
+
+ TAO::Argument * const args[] =
+ {
+ &retval
+ };
+
+ static size_t const nargs = 1;
+
+ POA_CORBA::PrimitiveDef * const impl =
+ static_cast<POA_CORBA::PrimitiveDef *> (servant);
+
+ _get_kind_PrimitiveDef command (
+ impl,
+ server_request.operation_details (),
+ args);
+
+ TAO::Upcall_Wrapper upcall_wrapper;
+ upcall_wrapper.upcall (server_request
+ , args
+ , nargs
+ , command
+#if TAO_HAS_INTERCEPTORS == 1
+ , servant_upcall
+ , exceptions
+ , nexceptions
+#endif /* TAO_HAS_INTERCEPTORS == 1 */
+ ACE_ENV_ARG_PARAMETER);
+ ACE_CHECK;
+}
+
+// TAO_IDL - Generated from
+// be\be_visitor_interface/interface_ss.cpp:169
+
+namespace POA_CORBA
+{
+
+
+ // TAO_IDL - Generated from
+ // be\be_visitor_operation/upcall_command_ss.cpp:127
+
+ class _is_a_PrimitiveDef_Upcall_Command
+ : public TAO::Upcall_Command
+ {
+ public:
+ inline _is_a_PrimitiveDef_Upcall_Command (
+ POA_CORBA::PrimitiveDef * servant,
+ TAO_Operation_Details const * operation_details,
+ TAO::Argument * const args[])
+ : servant_ (servant)
+ , operation_details_ (operation_details)
+ , args_ (args)
+ {
+ }
+
+ virtual void execute (ACE_ENV_SINGLE_ARG_DECL)
+ {
+ TAO::SArg_Traits< ::ACE_InputCDR::to_boolean>::ret_arg_type retval =
+ TAO::Portable_Server::get_ret_arg< ::ACE_InputCDR::to_boolean> (
+ this->operation_details_,
+ this->args_);
+
+ TAO::SArg_Traits< ::CORBA::Char *>::in_arg_type arg_1 =
+ TAO::Portable_Server::get_in_arg< ::CORBA::Char *> (
+ this->operation_details_,
+ this->args_,
+ 1);
+
+ retval =
+ this->servant_-> _is_a (
+ arg_1
+ ACE_ENV_ARG_PARAMETER);
+ ACE_CHECK;
+ }
+
+ private:
+ POA_CORBA::PrimitiveDef * const servant_;
+ TAO_Operation_Details const * const operation_details_;
+ TAO::Argument * const * const args_;
+ };
+}
+
+
+void POA_CORBA::PrimitiveDef::_is_a_skel (
+ TAO_ServerRequest & server_request,
+ void * TAO_INTERCEPTOR (servant_upcall),
+ void * servant
+ ACE_ENV_ARG_DECL
+ )
+{
+#if TAO_HAS_INTERCEPTORS == 1
+ static ::CORBA::TypeCode_ptr const * const exceptions = 0;
+ static ::CORBA::ULong const nexceptions = 0;
+#endif /* TAO_HAS_INTERCEPTORS */
+
+ TAO::SArg_Traits< ::ACE_InputCDR::to_boolean>::ret_val retval;
+ TAO::SArg_Traits< ::CORBA::Char *>::in_arg_val _tao_repository_id;
+
+ TAO::Argument * const args[] =
+ {
+ &retval,
+ &_tao_repository_id
+ };
+
+ static size_t const nargs = 2;
+
+ POA_CORBA::PrimitiveDef * const impl =
+ static_cast<POA_CORBA::PrimitiveDef *> (servant);
+
+ _is_a_PrimitiveDef_Upcall_Command command (
+ impl,
+ server_request.operation_details (),
+ args);
+
+ TAO::Upcall_Wrapper upcall_wrapper;
+ upcall_wrapper.upcall (server_request
+ , args
+ , nargs
+ , command
+#if TAO_HAS_INTERCEPTORS == 1
+ , servant_upcall
+ , exceptions
+ , nexceptions
+#endif /* TAO_HAS_INTERCEPTORS == 1 */
+ ACE_ENV_ARG_PARAMETER);
+ ACE_CHECK;
+}namespace POA_CORBA
+{
+
+
+ // TAO_IDL - Generated from
+ // be\be_visitor_operation/upcall_command_ss.cpp:127
+
+ class _non_existent_PrimitiveDef_Upcall_Command
+ : public TAO::Upcall_Command
+ {
+ public:
+ inline _non_existent_PrimitiveDef_Upcall_Command (
+ POA_CORBA::PrimitiveDef * servant,
+ TAO_Operation_Details const * operation_details,
+ TAO::Argument * const args[])
+ : servant_ (servant)
+ , operation_details_ (operation_details)
+ , args_ (args)
+ {
+ }
+
+ virtual void execute (ACE_ENV_SINGLE_ARG_DECL)
+ {
+ TAO::SArg_Traits< ::ACE_InputCDR::to_boolean>::ret_arg_type retval =
+ TAO::Portable_Server::get_ret_arg< ::ACE_InputCDR::to_boolean> (
+ this->operation_details_,
+ this->args_);
+
+ retval =
+ this->servant_-> _non_existent (
+ ACE_ENV_SINGLE_ARG_PARAMETER);
+ ACE_CHECK;
+ }
+
+ private:
+ POA_CORBA::PrimitiveDef * const servant_;
+ TAO_Operation_Details const * const operation_details_;
+ TAO::Argument * const * const args_;
+ };
+}
+
+
+void POA_CORBA::PrimitiveDef::_non_existent_skel (
+ TAO_ServerRequest & server_request,
+ void * TAO_INTERCEPTOR (servant_upcall),
+ void * servant
+ ACE_ENV_ARG_DECL
+ )
+{
+#if TAO_HAS_INTERCEPTORS == 1
+ static ::CORBA::TypeCode_ptr const * const exceptions = 0;
+ static ::CORBA::ULong const nexceptions = 0;
+#endif /* TAO_HAS_INTERCEPTORS */
+
+ TAO::SArg_Traits< ::ACE_InputCDR::to_boolean>::ret_val retval;
+
+ TAO::Argument * const args[] =
+ {
+ &retval
+ };
+
+ static size_t const nargs = 1;
+
+ POA_CORBA::PrimitiveDef * const impl =
+ static_cast<POA_CORBA::PrimitiveDef *> (servant);
+
+ _non_existent_PrimitiveDef_Upcall_Command command (
+ impl,
+ server_request.operation_details (),
+ args);
+
+ TAO::Upcall_Wrapper upcall_wrapper;
+ upcall_wrapper.upcall (server_request
+ , args
+ , nargs
+ , command
+#if TAO_HAS_INTERCEPTORS == 1
+ , servant_upcall
+ , exceptions
+ , nexceptions
+#endif /* TAO_HAS_INTERCEPTORS == 1 */
+ ACE_ENV_ARG_PARAMETER);
+ ACE_CHECK;
+}namespace POA_CORBA
+{
+
+
+ // TAO_IDL - Generated from
+ // be\be_visitor_operation/upcall_command_ss.cpp:127
+
+ class _repository_id_PrimitiveDef_Upcall_Command
+ : public TAO::Upcall_Command
+ {
+ public:
+ inline _repository_id_PrimitiveDef_Upcall_Command (
+ POA_CORBA::PrimitiveDef * servant,
+ TAO_Operation_Details const * operation_details,
+ TAO::Argument * const args[])
+ : servant_ (servant)
+ , operation_details_ (operation_details)
+ , args_ (args)
+ {
+ }
+
+ virtual void execute (ACE_ENV_SINGLE_ARG_DECL)
+ {
+ TAO::SArg_Traits< ::CORBA::Char *>::ret_arg_type retval =
+ TAO::Portable_Server::get_ret_arg< ::CORBA::Char *> (
+ this->operation_details_,
+ this->args_);
+
+ retval =
+ this->servant_-> _repository_id (
+ ACE_ENV_SINGLE_ARG_PARAMETER);
+ ACE_CHECK;
+ }
+
+ private:
+ POA_CORBA::PrimitiveDef * const servant_;
+ TAO_Operation_Details const * const operation_details_;
+ TAO::Argument * const * const args_;
+ };
+}
+
+
+void POA_CORBA::PrimitiveDef::_repository_id_skel (
+ TAO_ServerRequest & server_request,
+ void * TAO_INTERCEPTOR (servant_upcall),
+ void * servant
+ ACE_ENV_ARG_DECL
+ )
+{
+#if TAO_HAS_INTERCEPTORS == 1
+ static ::CORBA::TypeCode_ptr const * const exceptions = 0;
+ static ::CORBA::ULong const nexceptions = 0;
+#endif /* TAO_HAS_INTERCEPTORS */
+
+ TAO::SArg_Traits< ::CORBA::Char *>::ret_val retval;
+
+ TAO::Argument * const args[] =
+ {
+ &retval
+ };
+
+ static size_t const nargs = 1;
+
+ POA_CORBA::PrimitiveDef * const impl =
+ static_cast<POA_CORBA::PrimitiveDef *> (servant);
+
+ _repository_id_PrimitiveDef_Upcall_Command command (
+ impl,
+ server_request.operation_details (),
+ args);
+
+ TAO::Upcall_Wrapper upcall_wrapper;
+ upcall_wrapper.upcall (server_request
+ , args
+ , nargs
+ , command
+#if TAO_HAS_INTERCEPTORS == 1
+ , servant_upcall
+ , exceptions
+ , nexceptions
+#endif /* TAO_HAS_INTERCEPTORS == 1 */
+ ACE_ENV_ARG_PARAMETER);
+ ACE_CHECK;
+}
+
+// TAO_IDL - Generated from
+// be\be_visitor_interface/interface_ss.cpp:513
+
+void POA_CORBA::PrimitiveDef::_interface_skel (
+ TAO_ServerRequest & server_request,
+ void * /* servant_upcall */,
+ void * servant
+ ACE_ENV_ARG_DECL
+ )
+{
+ TAO_IFR_Client_Adapter *_tao_adapter =
+ ACE_Dynamic_Service<TAO_IFR_Client_Adapter>::instance (
+ TAO_ORB_Core::ifr_client_adapter_name ()
+ );
+
+ if (_tao_adapter == 0)
+ {
+ ACE_THROW ( ::CORBA::INTF_REPOS ( ::CORBA::OMGVMCID | 1,
+ ::CORBA::COMPLETED_NO));
+ }
+
+ POA_CORBA::PrimitiveDef * const impl =
+ static_cast<POA_CORBA::PrimitiveDef *> (servant);
+ ::CORBA::InterfaceDef_ptr _tao_retval =
+ impl->_get_interface (ACE_ENV_SINGLE_ARG_PARAMETER);
+ ACE_CHECK;
+
+ server_request.init_reply ();
+ TAO_OutputCDR &_tao_out = *server_request.outgoing ();
+
+ ::CORBA::Boolean const _tao_result =
+ _tao_adapter->interfacedef_cdr_insert (
+ _tao_out,
+ _tao_retval
+ );
+
+ _tao_adapter->dispose (_tao_retval);
+
+ if (_tao_result == false)
+ {
+ ACE_THROW ( ::CORBA::MARSHAL ());
+ }
+}namespace POA_CORBA
+{
+
+
+ // TAO_IDL - Generated from
+ // be\be_visitor_operation/upcall_command_ss.cpp:127
+
+ class _get_component_PrimitiveDef_Upcall_Command
+ : public TAO::Upcall_Command
+ {
+ public:
+ inline _get_component_PrimitiveDef_Upcall_Command (
+ POA_CORBA::PrimitiveDef * servant,
+ TAO_Operation_Details const * operation_details,
+ TAO::Argument * const args[])
+ : servant_ (servant)
+ , operation_details_ (operation_details)
+ , args_ (args)
+ {
+ }
+
+ virtual void execute (ACE_ENV_SINGLE_ARG_DECL)
+ {
+ TAO::SArg_Traits< ::CORBA::Object>::ret_arg_type retval =
+ TAO::Portable_Server::get_ret_arg< ::CORBA::Object> (
+ this->operation_details_,
+ this->args_);
+
+ retval =
+ this->servant_-> _get_component (
+ ACE_ENV_SINGLE_ARG_PARAMETER);
+ ACE_CHECK;
+ }
+
+ private:
+ POA_CORBA::PrimitiveDef * const servant_;
+ TAO_Operation_Details const * const operation_details_;
+ TAO::Argument * const * const args_;
+ };
+}
+
+
+void POA_CORBA::PrimitiveDef::_component_skel (
+ TAO_ServerRequest & server_request,
+ void * TAO_INTERCEPTOR (servant_upcall),
+ void * servant
+ ACE_ENV_ARG_DECL
+ )
+{
+#if TAO_HAS_INTERCEPTORS == 1
+ static ::CORBA::TypeCode_ptr const * const exceptions = 0;
+ static ::CORBA::ULong const nexceptions = 0;
+#endif /* TAO_HAS_INTERCEPTORS */
+
+ TAO::SArg_Traits< ::CORBA::Object>::ret_val retval;
+
+ TAO::Argument * const args[] =
+ {
+ &retval
+ };
+
+ static size_t const nargs = 1;
+
+ POA_CORBA::PrimitiveDef * const impl =
+ static_cast<POA_CORBA::PrimitiveDef *> (servant);
+
+ _get_component_PrimitiveDef_Upcall_Command command (
+ impl,
+ server_request.operation_details (),
+ args);
+
+ TAO::Upcall_Wrapper upcall_wrapper;
+ upcall_wrapper.upcall (server_request
+ , args
+ , nargs
+ , command
+#if TAO_HAS_INTERCEPTORS == 1
+ , servant_upcall
+ , exceptions
+ , nexceptions
+#endif /* TAO_HAS_INTERCEPTORS == 1 */
+ ACE_ENV_ARG_PARAMETER);
+ ACE_CHECK;
+}
+
+::CORBA::Boolean POA_CORBA::PrimitiveDef::_is_a (
+ const char* value
+ ACE_ENV_ARG_DECL_NOT_USED
+ )
+{
+ return
+ (
+ !ACE_OS::strcmp (
+ value,
+ "IDL:omg.org/CORBA/IRObject:1.0"
+ ) ||
+ !ACE_OS::strcmp (
+ value,
+ "IDL:omg.org/CORBA/IDLType:1.0"
+ ) ||
+ !ACE_OS::strcmp (
+ value,
+ "IDL:omg.org/CORBA/PrimitiveDef:1.0"
+ ) ||
+ !ACE_OS::strcmp (
+ value,
+ "IDL:omg.org/CORBA/Object:1.0"
+ )
+ );
+}
+
+const char* POA_CORBA::PrimitiveDef::_interface_repository_id (void) const
+{
+ return "IDL:omg.org/CORBA/PrimitiveDef:1.0";
+}
+
+// TAO_IDL - Generated from
+// be\be_visitor_interface/interface_ss.cpp:903
+
+void POA_CORBA::PrimitiveDef::_dispatch (
+ TAO_ServerRequest & req,
+ void * servant_upcall
+ ACE_ENV_ARG_DECL
+ )
+{
+ this->synchronous_upcall_dispatch (req,
+ servant_upcall,
+ this
+ ACE_ENV_ARG_PARAMETER);
+}
+
+// TAO_IDL - Generated from
+// be\be_visitor_interface/interface_ss.cpp:851
+
+CORBA::PrimitiveDef *
+POA_CORBA::PrimitiveDef::_this (ACE_ENV_SINGLE_ARG_DECL)
+{
+ TAO_Stub *stub = this->_create_stub (ACE_ENV_SINGLE_ARG_PARAMETER);
+ ACE_CHECK_RETURN (0);
+
+ TAO_Stub_Auto_Ptr safe_stub (stub);
+ ::CORBA::Object_ptr tmp = CORBA::Object::_nil ();
+
+ ::CORBA::Boolean const _tao_opt_colloc =
+ stub->servant_orb_var ()->orb_core ()->optimize_collocation_objects ();
+
+ ACE_NEW_RETURN (
+ tmp,
+ ::CORBA::Object (stub, _tao_opt_colloc, this),
+ 0
+ );
+
+ ::CORBA::Object_var obj = tmp;
+ (void) safe_stub.release ();
+
+ typedef ::CORBA::PrimitiveDef STUB_SCOPED_NAME;
+ return
+ TAO::Narrow_Utils<STUB_SCOPED_NAME>::unchecked_narrow (
+ obj.in (),
+ CORBA__TAO_PrimitiveDef_Proxy_Broker_Factory_function_pointer
+ );
+}
+
+// TAO_IDL - Generated from
+// be\be_interface.cpp:1499
+
+class TAO_CORBA_StringDef_Perfect_Hash_OpTable
+ : public TAO_Perfect_Hash_OpTable
+{
+private:
+ unsigned int hash (const char *str, unsigned int len);
+
+public:
+ const TAO_operation_db_entry * lookup (const char *str, unsigned int len);
+};
+
+/* C++ code produced by gperf version 2.8 (ACE version) */
+/* Command-line: C:\ACE\latest\ACE_wrappers\bin\gperf.exe -m -M -J -c -C -D -E -T -f 0 -F 0,0 -a -o -t -p -K opname -L C++ -Z TAO_CORBA_StringDef_Perfect_Hash_OpTable -N lookup */
+unsigned int
+TAO_CORBA_StringDef_Perfect_Hash_OpTable::hash (const char *str, unsigned int len)
+{
+ static const unsigned char asso_values[] =
+ {
+#if defined (ACE_MVS)
+ 21, 21, 21, 21, 21, 21, 21, 21, 21, 21,
+ 21, 21, 21, 21, 21, 21, 21, 21, 21, 21,
+ 21, 21, 21, 21, 21, 21, 21, 21, 21, 21,
+ 21, 21, 21, 21, 21, 21, 21, 21, 21, 21,
+ 21, 21, 21, 21, 21, 21, 21, 21, 21, 21,
+ 21, 21, 21, 21, 21, 21, 21, 21, 21, 21,
+ 21, 21, 21, 21, 21, 21, 21, 21, 21, 21,
+ 21, 21, 21, 21, 21, 21, 21, 21, 21, 21,
+ 21, 21, 21, 21, 21, 21, 21, 21, 21, 21,
+ 21, 21, 21, 21, 21, 21, 21, 21, 21, 21,
+ 21, 21, 21, 21, 21, 21, 21, 21, 21, 0,
+ 21, 21, 21, 21, 21, 21, 21, 21, 21, 21,
+ 21, 21, 21, 21, 21, 21, 21, 21, 21, 0,
+ 21, 21, 0, 10, 21, 21, 21, 21, 21, 21,
+ 21, 21, 21, 21, 21, 21, 21, 21, 21, 21,
+ 21, 21, 21, 21, 21, 21, 21, 21, 21, 21,
+ 21, 21, 21, 5, 21, 21, 21, 21, 0, 21,
+ 21, 21, 21, 21, 21, 21, 21, 21, 21, 21,
+ 21, 21, 21, 21, 21, 21, 21, 21, 21, 21,
+ 21, 21, 21, 21, 21, 21, 21, 21, 21, 21,
+ 21, 21, 21, 21, 21, 21, 21, 21, 21, 21,
+ 21, 21, 21, 21, 21, 21, 21, 21, 21, 21,
+ 21, 21, 21, 21, 21, 21, 21, 21, 21, 21,
+ 21, 21, 21, 21, 21, 21, 21, 21, 21, 21,
+ 21, 21, 21, 21, 21, 21, 21, 21, 21, 21,
+ 21, 21, 21, 21, 21, 21,
+#else
+ 21, 21, 21, 21, 21, 21, 21, 21, 21, 21,
+ 21, 21, 21, 21, 21, 21, 21, 21, 21, 21,
+ 21, 21, 21, 21, 21, 21, 21, 21, 21, 21,
+ 21, 21, 21, 21, 21, 21, 21, 21, 21, 21,
+ 21, 21, 21, 21, 21, 21, 21, 21, 21, 21,
+ 21, 21, 21, 21, 21, 21, 21, 21, 21, 21,
+ 21, 21, 21, 21, 21, 21, 21, 21, 21, 21,
+ 21, 21, 21, 21, 21, 21, 21, 21, 21, 21,
+ 21, 21, 21, 21, 21, 21, 21, 21, 21, 21,
+ 21, 21, 21, 21, 21, 0, 21, 0, 21, 21,
+ 0, 10, 21, 21, 21, 21, 21, 21, 21, 21,
+ 21, 21, 21, 21, 21, 21, 5, 21, 21, 21,
+ 21, 0, 21, 21, 21, 21, 21, 21,
+#endif /* ACE_MVS */
+ };
+ return len + asso_values[(int) str[len - 1]] + asso_values[(int) str[0]];
+}
+
+const TAO_operation_db_entry *
+TAO_CORBA_StringDef_Perfect_Hash_OpTable::lookup (const char *str, unsigned int len)
+{
+ enum
+ {
+ TOTAL_KEYWORDS = 10,
+ MIN_WORD_LENGTH = 5,
+ MAX_WORD_LENGTH = 14,
+ MIN_HASH_VALUE = 5,
+ MAX_HASH_VALUE = 20,
+ HASH_VALUE_RANGE = 16,
+ DUPLICATES = 2,
+ WORDLIST_SIZE = 15
+ };
+
+ static const TAO_operation_db_entry wordlist[] =
+ {
+ {"",0,0},{"",0,0},{"",0,0},{"",0,0},{"",0,0},
+ {"_is_a", &POA_CORBA::StringDef::_is_a_skel, 0},
+ {"destroy", &POA_CORBA::StringDef::destroy_skel, 0},
+ {"_get_bound", &POA_CORBA::StringDef::_get_bound_skel, 0},
+ {"_set_bound", &POA_CORBA::StringDef::_set_bound_skel, 0},
+ {"_get_def_kind", &POA_CORBA::StringDef::_get_def_kind_skel, 0},
+ {"_repository_id", &POA_CORBA::StringDef::_repository_id_skel, 0},
+ {"_component", &POA_CORBA::StringDef::_component_skel, 0},
+ {"_non_existent", &POA_CORBA::StringDef::_non_existent_skel, 0},
+ {"_get_type", &POA_CORBA::StringDef::_get_type_skel, 0},
+ {"_interface", &POA_CORBA::StringDef::_interface_skel, 0},
+ };
+
+ static const signed char lookup[] =
+ {
+ -1, -1, -1, -1, -1, 5, -1, 6, -7, -2, -22, -1, -1, 9,
+ 10, 11, -1, -1, 12, 13, 14,
+ };
+
+ if (len <= MAX_WORD_LENGTH && len >= MIN_WORD_LENGTH)
+ {
+ unsigned int key = hash (str, len);
+
+ if (key <= MAX_HASH_VALUE && key >= MIN_HASH_VALUE)
+ {
+ int slot = lookup[key];
+
+ if (slot >= 0 && slot < WORDLIST_SIZE)
+ {
+ const char *s = wordlist[slot].opname;
+
+ if (*str == *s && !strncmp (str + 1, s + 1, len - 1))
+ return &wordlist[slot];
+ }
+ else if (slot < 0 && slot >= -MAX_HASH_VALUE)
+ return 0;
+ else
+ {
+ unsigned int offset = key + slot + (slot > 0 ? -MAX_HASH_VALUE : MAX_HASH_VALUE);
+ const TAO_operation_db_entry *base = &wordlist[-lookup[offset]];
+ const TAO_operation_db_entry *ptr = base + -lookup[offset + 1];
+
+ while (--ptr >= base)
+ if (*str == *ptr->opname && !strncmp (str + 1, ptr->opname + 1, len - 1))
+ return ptr;
+ }
+ }
+ }
+ return 0;
+}
+
+static TAO_CORBA_StringDef_Perfect_Hash_OpTable tao_CORBA_StringDef_optable;
+
+// TAO_IDL - Generated from
+// be\be_visitor_interface/interface_ss.cpp:966
+
+TAO::Collocation_Proxy_Broker *
+CORBA__TAO_StringDef_Proxy_Broker_Factory_function ( ::CORBA::Object_ptr)
+{
+ return reinterpret_cast<TAO::Collocation_Proxy_Broker *> (0xdead); // Dummy
+}
+
+int
+CORBA__TAO_StringDef_Proxy_Broker_Factory_Initializer (size_t)
+{
+ CORBA__TAO_StringDef_Proxy_Broker_Factory_function_pointer =
+ CORBA__TAO_StringDef_Proxy_Broker_Factory_function;
+
+ return 0;
+}
+
+static int
+CORBA__TAO_StringDef_Proxy_Broker_Stub_Factory_Initializer_Scarecrow =
+ CORBA__TAO_StringDef_Proxy_Broker_Factory_Initializer (
+ reinterpret_cast<size_t> (CORBA__TAO_StringDef_Proxy_Broker_Factory_Initializer)
+ );
+
+// TAO_IDL - Generated from
+// be\be_visitor_interface/interface_ss.cpp:103
+
+POA_CORBA::StringDef::StringDef (void)
+ : TAO_ServantBase ()
+{
+ this->optable_ = &tao_CORBA_StringDef_optable;
+}
+
+POA_CORBA::StringDef::StringDef (const StringDef& rhs)
+ : TAO_Abstract_ServantBase (rhs),
+ TAO_ServantBase (rhs),
+ POA_CORBA::IRObject (rhs),
+ POA_CORBA::IDLType (rhs)
+{
+}
+
+POA_CORBA::StringDef::~StringDef (void)
+{
+}namespace POA_CORBA
+{
+
+
+ // TAO_IDL - Generated from
+ // be\be_visitor_operation/upcall_command_ss.cpp:127
+
+ class _get_bound_StringDef
+ : public TAO::Upcall_Command
+ {
+ public:
+ inline _get_bound_StringDef (
+ POA_CORBA::StringDef * servant,
+ TAO_Operation_Details const * operation_details,
+ TAO::Argument * const args[])
+ : servant_ (servant)
+ , operation_details_ (operation_details)
+ , args_ (args)
+ {
+ }
+
+ virtual void execute (ACE_ENV_SINGLE_ARG_DECL)
+ {
+ TAO::SArg_Traits< ::CORBA::ULong>::ret_arg_type retval =
+ TAO::Portable_Server::get_ret_arg< ::CORBA::ULong> (
+ this->operation_details_,
+ this->args_);
+
+ retval =
+ this->servant_->bound (
+ ACE_ENV_SINGLE_ARG_PARAMETER);
+ ACE_CHECK;
+ }
+
+ private:
+ POA_CORBA::StringDef * const servant_;
+ TAO_Operation_Details const * const operation_details_;
+ TAO::Argument * const * const args_;
+ };
+}
+
+
+// TAO_IDL - Generated from
+// be\be_visitor_operation/operation_ss.cpp:190
+
+void POA_CORBA::StringDef::_get_bound_skel (
+ TAO_ServerRequest & server_request,
+ void * TAO_INTERCEPTOR (servant_upcall),
+ void * servant
+ ACE_ENV_ARG_DECL
+ )
+{
+#if TAO_HAS_INTERCEPTORS == 1
+ static ::CORBA::TypeCode_ptr const * const exceptions = 0;
+ static ::CORBA::ULong const nexceptions = 0;
+#endif /* TAO_HAS_INTERCEPTORS */
+
+ TAO::SArg_Traits< ::CORBA::ULong>::ret_val retval;
+
+ TAO::Argument * const args[] =
+ {
+ &retval
+ };
+
+ static size_t const nargs = 1;
+
+ POA_CORBA::StringDef * const impl =
+ static_cast<POA_CORBA::StringDef *> (servant);
+
+ _get_bound_StringDef command (
+ impl,
+ server_request.operation_details (),
+ args);
+
+ TAO::Upcall_Wrapper upcall_wrapper;
+ upcall_wrapper.upcall (server_request
+ , args
+ , nargs
+ , command
+#if TAO_HAS_INTERCEPTORS == 1
+ , servant_upcall
+ , exceptions
+ , nexceptions
+#endif /* TAO_HAS_INTERCEPTORS == 1 */
+ ACE_ENV_ARG_PARAMETER);
+ ACE_CHECK;
+}namespace POA_CORBA
+{
+
+
+ // TAO_IDL - Generated from
+ // be\be_visitor_operation/upcall_command_ss.cpp:127
+
+ class _set_bound_StringDef
+ : public TAO::Upcall_Command
+ {
+ public:
+ inline _set_bound_StringDef (
+ POA_CORBA::StringDef * servant,
+ TAO_Operation_Details const * operation_details,
+ TAO::Argument * const args[])
+ : servant_ (servant)
+ , operation_details_ (operation_details)
+ , args_ (args)
+ {
+ }
+
+ virtual void execute (ACE_ENV_SINGLE_ARG_DECL)
+ {
+ TAO::SArg_Traits< ::CORBA::ULong>::in_arg_type arg_1 =
+ TAO::Portable_Server::get_in_arg< ::CORBA::ULong> (
+ this->operation_details_,
+ this->args_,
+ 1);
+
+ this->servant_->bound (
+ arg_1
+ ACE_ENV_ARG_PARAMETER);
+ ACE_CHECK;
+ }
+
+ private:
+ POA_CORBA::StringDef * const servant_;
+ TAO_Operation_Details const * const operation_details_;
+ TAO::Argument * const * const args_;
+ };
+}
+
+
+// TAO_IDL - Generated from
+// be\be_visitor_operation/operation_ss.cpp:190
+
+void POA_CORBA::StringDef::_set_bound_skel (
+ TAO_ServerRequest & server_request,
+ void * TAO_INTERCEPTOR (servant_upcall),
+ void * servant
+ ACE_ENV_ARG_DECL
+ )
+{
+#if TAO_HAS_INTERCEPTORS == 1
+ static ::CORBA::TypeCode_ptr const * const exceptions = 0;
+ static ::CORBA::ULong const nexceptions = 0;
+#endif /* TAO_HAS_INTERCEPTORS */
+
+ TAO::SArg_Traits< void>::ret_val retval;
+ TAO::SArg_Traits< ::CORBA::ULong>::in_arg_val _tao_bound;
+
+ TAO::Argument * const args[] =
+ {
+ &retval,
+ &_tao_bound
+ };
+
+ static size_t const nargs = 2;
+
+ POA_CORBA::StringDef * const impl =
+ static_cast<POA_CORBA::StringDef *> (servant);
+
+ _set_bound_StringDef command (
+ impl,
+ server_request.operation_details (),
+ args);
+
+ TAO::Upcall_Wrapper upcall_wrapper;
+ upcall_wrapper.upcall (server_request
+ , args
+ , nargs
+ , command
+#if TAO_HAS_INTERCEPTORS == 1
+ , servant_upcall
+ , exceptions
+ , nexceptions
+#endif /* TAO_HAS_INTERCEPTORS == 1 */
+ ACE_ENV_ARG_PARAMETER);
+ ACE_CHECK;
+}
+
+// TAO_IDL - Generated from
+// be\be_visitor_interface/interface_ss.cpp:169
+
+namespace POA_CORBA
+{
+
+
+ // TAO_IDL - Generated from
+ // be\be_visitor_operation/upcall_command_ss.cpp:127
+
+ class _is_a_StringDef_Upcall_Command
+ : public TAO::Upcall_Command
+ {
+ public:
+ inline _is_a_StringDef_Upcall_Command (
+ POA_CORBA::StringDef * servant,
+ TAO_Operation_Details const * operation_details,
+ TAO::Argument * const args[])
+ : servant_ (servant)
+ , operation_details_ (operation_details)
+ , args_ (args)
+ {
+ }
+
+ virtual void execute (ACE_ENV_SINGLE_ARG_DECL)
+ {
+ TAO::SArg_Traits< ::ACE_InputCDR::to_boolean>::ret_arg_type retval =
+ TAO::Portable_Server::get_ret_arg< ::ACE_InputCDR::to_boolean> (
+ this->operation_details_,
+ this->args_);
+
+ TAO::SArg_Traits< ::CORBA::Char *>::in_arg_type arg_1 =
+ TAO::Portable_Server::get_in_arg< ::CORBA::Char *> (
+ this->operation_details_,
+ this->args_,
+ 1);
+
+ retval =
+ this->servant_-> _is_a (
+ arg_1
+ ACE_ENV_ARG_PARAMETER);
+ ACE_CHECK;
+ }
+
+ private:
+ POA_CORBA::StringDef * const servant_;
+ TAO_Operation_Details const * const operation_details_;
+ TAO::Argument * const * const args_;
+ };
+}
+
+
+void POA_CORBA::StringDef::_is_a_skel (
+ TAO_ServerRequest & server_request,
+ void * TAO_INTERCEPTOR (servant_upcall),
+ void * servant
+ ACE_ENV_ARG_DECL
+ )
+{
+#if TAO_HAS_INTERCEPTORS == 1
+ static ::CORBA::TypeCode_ptr const * const exceptions = 0;
+ static ::CORBA::ULong const nexceptions = 0;
+#endif /* TAO_HAS_INTERCEPTORS */
+
+ TAO::SArg_Traits< ::ACE_InputCDR::to_boolean>::ret_val retval;
+ TAO::SArg_Traits< ::CORBA::Char *>::in_arg_val _tao_repository_id;
+
+ TAO::Argument * const args[] =
+ {
+ &retval,
+ &_tao_repository_id
+ };
+
+ static size_t const nargs = 2;
+
+ POA_CORBA::StringDef * const impl =
+ static_cast<POA_CORBA::StringDef *> (servant);
+
+ _is_a_StringDef_Upcall_Command command (
+ impl,
+ server_request.operation_details (),
+ args);
+
+ TAO::Upcall_Wrapper upcall_wrapper;
+ upcall_wrapper.upcall (server_request
+ , args
+ , nargs
+ , command
+#if TAO_HAS_INTERCEPTORS == 1
+ , servant_upcall
+ , exceptions
+ , nexceptions
+#endif /* TAO_HAS_INTERCEPTORS == 1 */
+ ACE_ENV_ARG_PARAMETER);
+ ACE_CHECK;
+}namespace POA_CORBA
+{
+
+
+ // TAO_IDL - Generated from
+ // be\be_visitor_operation/upcall_command_ss.cpp:127
+
+ class _non_existent_StringDef_Upcall_Command
+ : public TAO::Upcall_Command
+ {
+ public:
+ inline _non_existent_StringDef_Upcall_Command (
+ POA_CORBA::StringDef * servant,
+ TAO_Operation_Details const * operation_details,
+ TAO::Argument * const args[])
+ : servant_ (servant)
+ , operation_details_ (operation_details)
+ , args_ (args)
+ {
+ }
+
+ virtual void execute (ACE_ENV_SINGLE_ARG_DECL)
+ {
+ TAO::SArg_Traits< ::ACE_InputCDR::to_boolean>::ret_arg_type retval =
+ TAO::Portable_Server::get_ret_arg< ::ACE_InputCDR::to_boolean> (
+ this->operation_details_,
+ this->args_);
+
+ retval =
+ this->servant_-> _non_existent (
+ ACE_ENV_SINGLE_ARG_PARAMETER);
+ ACE_CHECK;
+ }
+
+ private:
+ POA_CORBA::StringDef * const servant_;
+ TAO_Operation_Details const * const operation_details_;
+ TAO::Argument * const * const args_;
+ };
+}
+
+
+void POA_CORBA::StringDef::_non_existent_skel (
+ TAO_ServerRequest & server_request,
+ void * TAO_INTERCEPTOR (servant_upcall),
+ void * servant
+ ACE_ENV_ARG_DECL
+ )
+{
+#if TAO_HAS_INTERCEPTORS == 1
+ static ::CORBA::TypeCode_ptr const * const exceptions = 0;
+ static ::CORBA::ULong const nexceptions = 0;
+#endif /* TAO_HAS_INTERCEPTORS */
+
+ TAO::SArg_Traits< ::ACE_InputCDR::to_boolean>::ret_val retval;
+
+ TAO::Argument * const args[] =
+ {
+ &retval
+ };
+
+ static size_t const nargs = 1;
+
+ POA_CORBA::StringDef * const impl =
+ static_cast<POA_CORBA::StringDef *> (servant);
+
+ _non_existent_StringDef_Upcall_Command command (
+ impl,
+ server_request.operation_details (),
+ args);
+
+ TAO::Upcall_Wrapper upcall_wrapper;
+ upcall_wrapper.upcall (server_request
+ , args
+ , nargs
+ , command
+#if TAO_HAS_INTERCEPTORS == 1
+ , servant_upcall
+ , exceptions
+ , nexceptions
+#endif /* TAO_HAS_INTERCEPTORS == 1 */
+ ACE_ENV_ARG_PARAMETER);
+ ACE_CHECK;
+}namespace POA_CORBA
+{
+
+
+ // TAO_IDL - Generated from
+ // be\be_visitor_operation/upcall_command_ss.cpp:127
+
+ class _repository_id_StringDef_Upcall_Command
+ : public TAO::Upcall_Command
+ {
+ public:
+ inline _repository_id_StringDef_Upcall_Command (
+ POA_CORBA::StringDef * servant,
+ TAO_Operation_Details const * operation_details,
+ TAO::Argument * const args[])
+ : servant_ (servant)
+ , operation_details_ (operation_details)
+ , args_ (args)
+ {
+ }
+
+ virtual void execute (ACE_ENV_SINGLE_ARG_DECL)
+ {
+ TAO::SArg_Traits< ::CORBA::Char *>::ret_arg_type retval =
+ TAO::Portable_Server::get_ret_arg< ::CORBA::Char *> (
+ this->operation_details_,
+ this->args_);
+
+ retval =
+ this->servant_-> _repository_id (
+ ACE_ENV_SINGLE_ARG_PARAMETER);
+ ACE_CHECK;
+ }
+
+ private:
+ POA_CORBA::StringDef * const servant_;
+ TAO_Operation_Details const * const operation_details_;
+ TAO::Argument * const * const args_;
+ };
+}
+
+
+void POA_CORBA::StringDef::_repository_id_skel (
+ TAO_ServerRequest & server_request,
+ void * TAO_INTERCEPTOR (servant_upcall),
+ void * servant
+ ACE_ENV_ARG_DECL
+ )
+{
+#if TAO_HAS_INTERCEPTORS == 1
+ static ::CORBA::TypeCode_ptr const * const exceptions = 0;
+ static ::CORBA::ULong const nexceptions = 0;
+#endif /* TAO_HAS_INTERCEPTORS */
+
+ TAO::SArg_Traits< ::CORBA::Char *>::ret_val retval;
+
+ TAO::Argument * const args[] =
+ {
+ &retval
+ };
+
+ static size_t const nargs = 1;
+
+ POA_CORBA::StringDef * const impl =
+ static_cast<POA_CORBA::StringDef *> (servant);
+
+ _repository_id_StringDef_Upcall_Command command (
+ impl,
+ server_request.operation_details (),
+ args);
+
+ TAO::Upcall_Wrapper upcall_wrapper;
+ upcall_wrapper.upcall (server_request
+ , args
+ , nargs
+ , command
+#if TAO_HAS_INTERCEPTORS == 1
+ , servant_upcall
+ , exceptions
+ , nexceptions
+#endif /* TAO_HAS_INTERCEPTORS == 1 */
+ ACE_ENV_ARG_PARAMETER);
+ ACE_CHECK;
+}
+
+// TAO_IDL - Generated from
+// be\be_visitor_interface/interface_ss.cpp:513
+
+void POA_CORBA::StringDef::_interface_skel (
+ TAO_ServerRequest & server_request,
+ void * /* servant_upcall */,
+ void * servant
+ ACE_ENV_ARG_DECL
+ )
+{
+ TAO_IFR_Client_Adapter *_tao_adapter =
+ ACE_Dynamic_Service<TAO_IFR_Client_Adapter>::instance (
+ TAO_ORB_Core::ifr_client_adapter_name ()
+ );
+
+ if (_tao_adapter == 0)
+ {
+ ACE_THROW ( ::CORBA::INTF_REPOS ( ::CORBA::OMGVMCID | 1,
+ ::CORBA::COMPLETED_NO));
+ }
+
+ POA_CORBA::StringDef * const impl =
+ static_cast<POA_CORBA::StringDef *> (servant);
+ ::CORBA::InterfaceDef_ptr _tao_retval =
+ impl->_get_interface (ACE_ENV_SINGLE_ARG_PARAMETER);
+ ACE_CHECK;
+
+ server_request.init_reply ();
+ TAO_OutputCDR &_tao_out = *server_request.outgoing ();
+
+ ::CORBA::Boolean const _tao_result =
+ _tao_adapter->interfacedef_cdr_insert (
+ _tao_out,
+ _tao_retval
+ );
+
+ _tao_adapter->dispose (_tao_retval);
+
+ if (_tao_result == false)
+ {
+ ACE_THROW ( ::CORBA::MARSHAL ());
+ }
+}namespace POA_CORBA
+{
+
+
+ // TAO_IDL - Generated from
+ // be\be_visitor_operation/upcall_command_ss.cpp:127
+
+ class _get_component_StringDef_Upcall_Command
+ : public TAO::Upcall_Command
+ {
+ public:
+ inline _get_component_StringDef_Upcall_Command (
+ POA_CORBA::StringDef * servant,
+ TAO_Operation_Details const * operation_details,
+ TAO::Argument * const args[])
+ : servant_ (servant)
+ , operation_details_ (operation_details)
+ , args_ (args)
+ {
+ }
+
+ virtual void execute (ACE_ENV_SINGLE_ARG_DECL)
+ {
+ TAO::SArg_Traits< ::CORBA::Object>::ret_arg_type retval =
+ TAO::Portable_Server::get_ret_arg< ::CORBA::Object> (
+ this->operation_details_,
+ this->args_);
+
+ retval =
+ this->servant_-> _get_component (
+ ACE_ENV_SINGLE_ARG_PARAMETER);
+ ACE_CHECK;
+ }
+
+ private:
+ POA_CORBA::StringDef * const servant_;
+ TAO_Operation_Details const * const operation_details_;
+ TAO::Argument * const * const args_;
+ };
+}
+
+
+void POA_CORBA::StringDef::_component_skel (
+ TAO_ServerRequest & server_request,
+ void * TAO_INTERCEPTOR (servant_upcall),
+ void * servant
+ ACE_ENV_ARG_DECL
+ )
+{
+#if TAO_HAS_INTERCEPTORS == 1
+ static ::CORBA::TypeCode_ptr const * const exceptions = 0;
+ static ::CORBA::ULong const nexceptions = 0;
+#endif /* TAO_HAS_INTERCEPTORS */
+
+ TAO::SArg_Traits< ::CORBA::Object>::ret_val retval;
+
+ TAO::Argument * const args[] =
+ {
+ &retval
+ };
+
+ static size_t const nargs = 1;
+
+ POA_CORBA::StringDef * const impl =
+ static_cast<POA_CORBA::StringDef *> (servant);
+
+ _get_component_StringDef_Upcall_Command command (
+ impl,
+ server_request.operation_details (),
+ args);
+
+ TAO::Upcall_Wrapper upcall_wrapper;
+ upcall_wrapper.upcall (server_request
+ , args
+ , nargs
+ , command
+#if TAO_HAS_INTERCEPTORS == 1
+ , servant_upcall
+ , exceptions
+ , nexceptions
+#endif /* TAO_HAS_INTERCEPTORS == 1 */
+ ACE_ENV_ARG_PARAMETER);
+ ACE_CHECK;
+}
+
+::CORBA::Boolean POA_CORBA::StringDef::_is_a (
+ const char* value
+ ACE_ENV_ARG_DECL_NOT_USED
+ )
+{
+ return
+ (
+ !ACE_OS::strcmp (
+ value,
+ "IDL:omg.org/CORBA/IRObject:1.0"
+ ) ||
+ !ACE_OS::strcmp (
+ value,
+ "IDL:omg.org/CORBA/IDLType:1.0"
+ ) ||
+ !ACE_OS::strcmp (
+ value,
+ "IDL:omg.org/CORBA/StringDef:1.0"
+ ) ||
+ !ACE_OS::strcmp (
+ value,
+ "IDL:omg.org/CORBA/Object:1.0"
+ )
+ );
+}
+
+const char* POA_CORBA::StringDef::_interface_repository_id (void) const
+{
+ return "IDL:omg.org/CORBA/StringDef:1.0";
+}
+
+// TAO_IDL - Generated from
+// be\be_visitor_interface/interface_ss.cpp:903
+
+void POA_CORBA::StringDef::_dispatch (
+ TAO_ServerRequest & req,
+ void * servant_upcall
+ ACE_ENV_ARG_DECL
+ )
+{
+ this->synchronous_upcall_dispatch (req,
+ servant_upcall,
+ this
+ ACE_ENV_ARG_PARAMETER);
+}
+
+// TAO_IDL - Generated from
+// be\be_visitor_interface/interface_ss.cpp:851
+
+CORBA::StringDef *
+POA_CORBA::StringDef::_this (ACE_ENV_SINGLE_ARG_DECL)
+{
+ TAO_Stub *stub = this->_create_stub (ACE_ENV_SINGLE_ARG_PARAMETER);
+ ACE_CHECK_RETURN (0);
+
+ TAO_Stub_Auto_Ptr safe_stub (stub);
+ ::CORBA::Object_ptr tmp = CORBA::Object::_nil ();
+
+ ::CORBA::Boolean const _tao_opt_colloc =
+ stub->servant_orb_var ()->orb_core ()->optimize_collocation_objects ();
+
+ ACE_NEW_RETURN (
+ tmp,
+ ::CORBA::Object (stub, _tao_opt_colloc, this),
+ 0
+ );
+
+ ::CORBA::Object_var obj = tmp;
+ (void) safe_stub.release ();
+
+ typedef ::CORBA::StringDef STUB_SCOPED_NAME;
+ return
+ TAO::Narrow_Utils<STUB_SCOPED_NAME>::unchecked_narrow (
+ obj.in (),
+ CORBA__TAO_StringDef_Proxy_Broker_Factory_function_pointer
+ );
+}
+
+// TAO_IDL - Generated from
+// be\be_interface.cpp:1499
+
+class TAO_CORBA_WstringDef_Perfect_Hash_OpTable
+ : public TAO_Perfect_Hash_OpTable
+{
+private:
+ unsigned int hash (const char *str, unsigned int len);
+
+public:
+ const TAO_operation_db_entry * lookup (const char *str, unsigned int len);
+};
+
+/* C++ code produced by gperf version 2.8 (ACE version) */
+/* Command-line: C:\ACE\latest\ACE_wrappers\bin\gperf.exe -m -M -J -c -C -D -E -T -f 0 -F 0,0 -a -o -t -p -K opname -L C++ -Z TAO_CORBA_WstringDef_Perfect_Hash_OpTable -N lookup */
+unsigned int
+TAO_CORBA_WstringDef_Perfect_Hash_OpTable::hash (const char *str, unsigned int len)
+{
+ static const unsigned char asso_values[] =
+ {
+#if defined (ACE_MVS)
+ 21, 21, 21, 21, 21, 21, 21, 21, 21, 21,
+ 21, 21, 21, 21, 21, 21, 21, 21, 21, 21,
+ 21, 21, 21, 21, 21, 21, 21, 21, 21, 21,
+ 21, 21, 21, 21, 21, 21, 21, 21, 21, 21,
+ 21, 21, 21, 21, 21, 21, 21, 21, 21, 21,
+ 21, 21, 21, 21, 21, 21, 21, 21, 21, 21,
+ 21, 21, 21, 21, 21, 21, 21, 21, 21, 21,
+ 21, 21, 21, 21, 21, 21, 21, 21, 21, 21,
+ 21, 21, 21, 21, 21, 21, 21, 21, 21, 21,
+ 21, 21, 21, 21, 21, 21, 21, 21, 21, 21,
+ 21, 21, 21, 21, 21, 21, 21, 21, 21, 0,
+ 21, 21, 21, 21, 21, 21, 21, 21, 21, 21,
+ 21, 21, 21, 21, 21, 21, 21, 21, 21, 0,
+ 21, 21, 0, 10, 21, 21, 21, 21, 21, 21,
+ 21, 21, 21, 21, 21, 21, 21, 21, 21, 21,
+ 21, 21, 21, 21, 21, 21, 21, 21, 21, 21,
+ 21, 21, 21, 5, 21, 21, 21, 21, 0, 21,
+ 21, 21, 21, 21, 21, 21, 21, 21, 21, 21,
+ 21, 21, 21, 21, 21, 21, 21, 21, 21, 21,
+ 21, 21, 21, 21, 21, 21, 21, 21, 21, 21,
+ 21, 21, 21, 21, 21, 21, 21, 21, 21, 21,
+ 21, 21, 21, 21, 21, 21, 21, 21, 21, 21,
+ 21, 21, 21, 21, 21, 21, 21, 21, 21, 21,
+ 21, 21, 21, 21, 21, 21, 21, 21, 21, 21,
+ 21, 21, 21, 21, 21, 21, 21, 21, 21, 21,
+ 21, 21, 21, 21, 21, 21,
+#else
+ 21, 21, 21, 21, 21, 21, 21, 21, 21, 21,
+ 21, 21, 21, 21, 21, 21, 21, 21, 21, 21,
+ 21, 21, 21, 21, 21, 21, 21, 21, 21, 21,
+ 21, 21, 21, 21, 21, 21, 21, 21, 21, 21,
+ 21, 21, 21, 21, 21, 21, 21, 21, 21, 21,
+ 21, 21, 21, 21, 21, 21, 21, 21, 21, 21,
+ 21, 21, 21, 21, 21, 21, 21, 21, 21, 21,
+ 21, 21, 21, 21, 21, 21, 21, 21, 21, 21,
+ 21, 21, 21, 21, 21, 21, 21, 21, 21, 21,
+ 21, 21, 21, 21, 21, 0, 21, 0, 21, 21,
+ 0, 10, 21, 21, 21, 21, 21, 21, 21, 21,
+ 21, 21, 21, 21, 21, 21, 5, 21, 21, 21,
+ 21, 0, 21, 21, 21, 21, 21, 21,
+#endif /* ACE_MVS */
+ };
+ return len + asso_values[(int) str[len - 1]] + asso_values[(int) str[0]];
+}
+
+const TAO_operation_db_entry *
+TAO_CORBA_WstringDef_Perfect_Hash_OpTable::lookup (const char *str, unsigned int len)
+{
+ enum
+ {
+ TOTAL_KEYWORDS = 10,
+ MIN_WORD_LENGTH = 5,
+ MAX_WORD_LENGTH = 14,
+ MIN_HASH_VALUE = 5,
+ MAX_HASH_VALUE = 20,
+ HASH_VALUE_RANGE = 16,
+ DUPLICATES = 2,
+ WORDLIST_SIZE = 15
+ };
+
+ static const TAO_operation_db_entry wordlist[] =
+ {
+ {"",0,0},{"",0,0},{"",0,0},{"",0,0},{"",0,0},
+ {"_is_a", &POA_CORBA::WstringDef::_is_a_skel, 0},
+ {"destroy", &POA_CORBA::WstringDef::destroy_skel, 0},
+ {"_get_bound", &POA_CORBA::WstringDef::_get_bound_skel, 0},
+ {"_set_bound", &POA_CORBA::WstringDef::_set_bound_skel, 0},
+ {"_get_def_kind", &POA_CORBA::WstringDef::_get_def_kind_skel, 0},
+ {"_repository_id", &POA_CORBA::WstringDef::_repository_id_skel, 0},
+ {"_component", &POA_CORBA::WstringDef::_component_skel, 0},
+ {"_non_existent", &POA_CORBA::WstringDef::_non_existent_skel, 0},
+ {"_get_type", &POA_CORBA::WstringDef::_get_type_skel, 0},
+ {"_interface", &POA_CORBA::WstringDef::_interface_skel, 0},
+ };
+
+ static const signed char lookup[] =
+ {
+ -1, -1, -1, -1, -1, 5, -1, 6, -7, -2, -22, -1, -1, 9,
+ 10, 11, -1, -1, 12, 13, 14,
+ };
+
+ if (len <= MAX_WORD_LENGTH && len >= MIN_WORD_LENGTH)
+ {
+ unsigned int key = hash (str, len);
+
+ if (key <= MAX_HASH_VALUE && key >= MIN_HASH_VALUE)
+ {
+ int slot = lookup[key];
+
+ if (slot >= 0 && slot < WORDLIST_SIZE)
+ {
+ const char *s = wordlist[slot].opname;
+
+ if (*str == *s && !strncmp (str + 1, s + 1, len - 1))
+ return &wordlist[slot];
+ }
+ else if (slot < 0 && slot >= -MAX_HASH_VALUE)
+ return 0;
+ else
+ {
+ unsigned int offset = key + slot + (slot > 0 ? -MAX_HASH_VALUE : MAX_HASH_VALUE);
+ const TAO_operation_db_entry *base = &wordlist[-lookup[offset]];
+ const TAO_operation_db_entry *ptr = base + -lookup[offset + 1];
+
+ while (--ptr >= base)
+ if (*str == *ptr->opname && !strncmp (str + 1, ptr->opname + 1, len - 1))
+ return ptr;
+ }
+ }
+ }
+ return 0;
+}
+
+static TAO_CORBA_WstringDef_Perfect_Hash_OpTable tao_CORBA_WstringDef_optable;
+
+// TAO_IDL - Generated from
+// be\be_visitor_interface/interface_ss.cpp:966
+
+TAO::Collocation_Proxy_Broker *
+CORBA__TAO_WstringDef_Proxy_Broker_Factory_function ( ::CORBA::Object_ptr)
+{
+ return reinterpret_cast<TAO::Collocation_Proxy_Broker *> (0xdead); // Dummy
+}
+
+int
+CORBA__TAO_WstringDef_Proxy_Broker_Factory_Initializer (size_t)
+{
+ CORBA__TAO_WstringDef_Proxy_Broker_Factory_function_pointer =
+ CORBA__TAO_WstringDef_Proxy_Broker_Factory_function;
+
+ return 0;
+}
+
+static int
+CORBA__TAO_WstringDef_Proxy_Broker_Stub_Factory_Initializer_Scarecrow =
+ CORBA__TAO_WstringDef_Proxy_Broker_Factory_Initializer (
+ reinterpret_cast<size_t> (CORBA__TAO_WstringDef_Proxy_Broker_Factory_Initializer)
+ );
+
+// TAO_IDL - Generated from
+// be\be_visitor_interface/interface_ss.cpp:103
+
+POA_CORBA::WstringDef::WstringDef (void)
+ : TAO_ServantBase ()
+{
+ this->optable_ = &tao_CORBA_WstringDef_optable;
+}
+
+POA_CORBA::WstringDef::WstringDef (const WstringDef& rhs)
+ : TAO_Abstract_ServantBase (rhs),
+ TAO_ServantBase (rhs),
+ POA_CORBA::IRObject (rhs),
+ POA_CORBA::IDLType (rhs)
+{
+}
+
+POA_CORBA::WstringDef::~WstringDef (void)
+{
+}namespace POA_CORBA
+{
+
+
+ // TAO_IDL - Generated from
+ // be\be_visitor_operation/upcall_command_ss.cpp:127
+
+ class _get_bound_WstringDef
+ : public TAO::Upcall_Command
+ {
+ public:
+ inline _get_bound_WstringDef (
+ POA_CORBA::WstringDef * servant,
+ TAO_Operation_Details const * operation_details,
+ TAO::Argument * const args[])
+ : servant_ (servant)
+ , operation_details_ (operation_details)
+ , args_ (args)
+ {
+ }
+
+ virtual void execute (ACE_ENV_SINGLE_ARG_DECL)
+ {
+ TAO::SArg_Traits< ::CORBA::ULong>::ret_arg_type retval =
+ TAO::Portable_Server::get_ret_arg< ::CORBA::ULong> (
+ this->operation_details_,
+ this->args_);
+
+ retval =
+ this->servant_->bound (
+ ACE_ENV_SINGLE_ARG_PARAMETER);
+ ACE_CHECK;
+ }
+
+ private:
+ POA_CORBA::WstringDef * const servant_;
+ TAO_Operation_Details const * const operation_details_;
+ TAO::Argument * const * const args_;
+ };
+}
+
+
+// TAO_IDL - Generated from
+// be\be_visitor_operation/operation_ss.cpp:190
+
+void POA_CORBA::WstringDef::_get_bound_skel (
+ TAO_ServerRequest & server_request,
+ void * TAO_INTERCEPTOR (servant_upcall),
+ void * servant
+ ACE_ENV_ARG_DECL
+ )
+{
+#if TAO_HAS_INTERCEPTORS == 1
+ static ::CORBA::TypeCode_ptr const * const exceptions = 0;
+ static ::CORBA::ULong const nexceptions = 0;
+#endif /* TAO_HAS_INTERCEPTORS */
+
+ TAO::SArg_Traits< ::CORBA::ULong>::ret_val retval;
+
+ TAO::Argument * const args[] =
+ {
+ &retval
+ };
+
+ static size_t const nargs = 1;
+
+ POA_CORBA::WstringDef * const impl =
+ static_cast<POA_CORBA::WstringDef *> (servant);
+
+ _get_bound_WstringDef command (
+ impl,
+ server_request.operation_details (),
+ args);
+
+ TAO::Upcall_Wrapper upcall_wrapper;
+ upcall_wrapper.upcall (server_request
+ , args
+ , nargs
+ , command
+#if TAO_HAS_INTERCEPTORS == 1
+ , servant_upcall
+ , exceptions
+ , nexceptions
+#endif /* TAO_HAS_INTERCEPTORS == 1 */
+ ACE_ENV_ARG_PARAMETER);
+ ACE_CHECK;
+}namespace POA_CORBA
+{
+
+
+ // TAO_IDL - Generated from
+ // be\be_visitor_operation/upcall_command_ss.cpp:127
+
+ class _set_bound_WstringDef
+ : public TAO::Upcall_Command
+ {
+ public:
+ inline _set_bound_WstringDef (
+ POA_CORBA::WstringDef * servant,
+ TAO_Operation_Details const * operation_details,
+ TAO::Argument * const args[])
+ : servant_ (servant)
+ , operation_details_ (operation_details)
+ , args_ (args)
+ {
+ }
+
+ virtual void execute (ACE_ENV_SINGLE_ARG_DECL)
+ {
+ TAO::SArg_Traits< ::CORBA::ULong>::in_arg_type arg_1 =
+ TAO::Portable_Server::get_in_arg< ::CORBA::ULong> (
+ this->operation_details_,
+ this->args_,
+ 1);
+
+ this->servant_->bound (
+ arg_1
+ ACE_ENV_ARG_PARAMETER);
+ ACE_CHECK;
+ }
+
+ private:
+ POA_CORBA::WstringDef * const servant_;
+ TAO_Operation_Details const * const operation_details_;
+ TAO::Argument * const * const args_;
+ };
+}
+
+
+// TAO_IDL - Generated from
+// be\be_visitor_operation/operation_ss.cpp:190
+
+void POA_CORBA::WstringDef::_set_bound_skel (
+ TAO_ServerRequest & server_request,
+ void * TAO_INTERCEPTOR (servant_upcall),
+ void * servant
+ ACE_ENV_ARG_DECL
+ )
+{
+#if TAO_HAS_INTERCEPTORS == 1
+ static ::CORBA::TypeCode_ptr const * const exceptions = 0;
+ static ::CORBA::ULong const nexceptions = 0;
+#endif /* TAO_HAS_INTERCEPTORS */
+
+ TAO::SArg_Traits< void>::ret_val retval;
+ TAO::SArg_Traits< ::CORBA::ULong>::in_arg_val _tao_bound;
+
+ TAO::Argument * const args[] =
+ {
+ &retval,
+ &_tao_bound
+ };
+
+ static size_t const nargs = 2;
+
+ POA_CORBA::WstringDef * const impl =
+ static_cast<POA_CORBA::WstringDef *> (servant);
+
+ _set_bound_WstringDef command (
+ impl,
+ server_request.operation_details (),
+ args);
+
+ TAO::Upcall_Wrapper upcall_wrapper;
+ upcall_wrapper.upcall (server_request
+ , args
+ , nargs
+ , command
+#if TAO_HAS_INTERCEPTORS == 1
+ , servant_upcall
+ , exceptions
+ , nexceptions
+#endif /* TAO_HAS_INTERCEPTORS == 1 */
+ ACE_ENV_ARG_PARAMETER);
+ ACE_CHECK;
+}
+
+// TAO_IDL - Generated from
+// be\be_visitor_interface/interface_ss.cpp:169
+
+namespace POA_CORBA
+{
+
+
+ // TAO_IDL - Generated from
+ // be\be_visitor_operation/upcall_command_ss.cpp:127
+
+ class _is_a_WstringDef_Upcall_Command
+ : public TAO::Upcall_Command
+ {
+ public:
+ inline _is_a_WstringDef_Upcall_Command (
+ POA_CORBA::WstringDef * servant,
+ TAO_Operation_Details const * operation_details,
+ TAO::Argument * const args[])
+ : servant_ (servant)
+ , operation_details_ (operation_details)
+ , args_ (args)
+ {
+ }
+
+ virtual void execute (ACE_ENV_SINGLE_ARG_DECL)
+ {
+ TAO::SArg_Traits< ::ACE_InputCDR::to_boolean>::ret_arg_type retval =
+ TAO::Portable_Server::get_ret_arg< ::ACE_InputCDR::to_boolean> (
+ this->operation_details_,
+ this->args_);
+
+ TAO::SArg_Traits< ::CORBA::Char *>::in_arg_type arg_1 =
+ TAO::Portable_Server::get_in_arg< ::CORBA::Char *> (
+ this->operation_details_,
+ this->args_,
+ 1);
+
+ retval =
+ this->servant_-> _is_a (
+ arg_1
+ ACE_ENV_ARG_PARAMETER);
+ ACE_CHECK;
+ }
+
+ private:
+ POA_CORBA::WstringDef * const servant_;
+ TAO_Operation_Details const * const operation_details_;
+ TAO::Argument * const * const args_;
+ };
+}
+
+
+void POA_CORBA::WstringDef::_is_a_skel (
+ TAO_ServerRequest & server_request,
+ void * TAO_INTERCEPTOR (servant_upcall),
+ void * servant
+ ACE_ENV_ARG_DECL
+ )
+{
+#if TAO_HAS_INTERCEPTORS == 1
+ static ::CORBA::TypeCode_ptr const * const exceptions = 0;
+ static ::CORBA::ULong const nexceptions = 0;
+#endif /* TAO_HAS_INTERCEPTORS */
+
+ TAO::SArg_Traits< ::ACE_InputCDR::to_boolean>::ret_val retval;
+ TAO::SArg_Traits< ::CORBA::Char *>::in_arg_val _tao_repository_id;
+
+ TAO::Argument * const args[] =
+ {
+ &retval,
+ &_tao_repository_id
+ };
+
+ static size_t const nargs = 2;
+
+ POA_CORBA::WstringDef * const impl =
+ static_cast<POA_CORBA::WstringDef *> (servant);
+
+ _is_a_WstringDef_Upcall_Command command (
+ impl,
+ server_request.operation_details (),
+ args);
+
+ TAO::Upcall_Wrapper upcall_wrapper;
+ upcall_wrapper.upcall (server_request
+ , args
+ , nargs
+ , command
+#if TAO_HAS_INTERCEPTORS == 1
+ , servant_upcall
+ , exceptions
+ , nexceptions
+#endif /* TAO_HAS_INTERCEPTORS == 1 */
+ ACE_ENV_ARG_PARAMETER);
+ ACE_CHECK;
+}namespace POA_CORBA
+{
+
+
+ // TAO_IDL - Generated from
+ // be\be_visitor_operation/upcall_command_ss.cpp:127
+
+ class _non_existent_WstringDef_Upcall_Command
+ : public TAO::Upcall_Command
+ {
+ public:
+ inline _non_existent_WstringDef_Upcall_Command (
+ POA_CORBA::WstringDef * servant,
+ TAO_Operation_Details const * operation_details,
+ TAO::Argument * const args[])
+ : servant_ (servant)
+ , operation_details_ (operation_details)
+ , args_ (args)
+ {
+ }
+
+ virtual void execute (ACE_ENV_SINGLE_ARG_DECL)
+ {
+ TAO::SArg_Traits< ::ACE_InputCDR::to_boolean>::ret_arg_type retval =
+ TAO::Portable_Server::get_ret_arg< ::ACE_InputCDR::to_boolean> (
+ this->operation_details_,
+ this->args_);
+
+ retval =
+ this->servant_-> _non_existent (
+ ACE_ENV_SINGLE_ARG_PARAMETER);
+ ACE_CHECK;
+ }
+
+ private:
+ POA_CORBA::WstringDef * const servant_;
+ TAO_Operation_Details const * const operation_details_;
+ TAO::Argument * const * const args_;
+ };
+}
+
+
+void POA_CORBA::WstringDef::_non_existent_skel (
+ TAO_ServerRequest & server_request,
+ void * TAO_INTERCEPTOR (servant_upcall),
+ void * servant
+ ACE_ENV_ARG_DECL
+ )
+{
+#if TAO_HAS_INTERCEPTORS == 1
+ static ::CORBA::TypeCode_ptr const * const exceptions = 0;
+ static ::CORBA::ULong const nexceptions = 0;
+#endif /* TAO_HAS_INTERCEPTORS */
+
+ TAO::SArg_Traits< ::ACE_InputCDR::to_boolean>::ret_val retval;
+
+ TAO::Argument * const args[] =
+ {
+ &retval
+ };
+
+ static size_t const nargs = 1;
+
+ POA_CORBA::WstringDef * const impl =
+ static_cast<POA_CORBA::WstringDef *> (servant);
+
+ _non_existent_WstringDef_Upcall_Command command (
+ impl,
+ server_request.operation_details (),
+ args);
+
+ TAO::Upcall_Wrapper upcall_wrapper;
+ upcall_wrapper.upcall (server_request
+ , args
+ , nargs
+ , command
+#if TAO_HAS_INTERCEPTORS == 1
+ , servant_upcall
+ , exceptions
+ , nexceptions
+#endif /* TAO_HAS_INTERCEPTORS == 1 */
+ ACE_ENV_ARG_PARAMETER);
+ ACE_CHECK;
+}namespace POA_CORBA
+{
+
+
+ // TAO_IDL - Generated from
+ // be\be_visitor_operation/upcall_command_ss.cpp:127
+
+ class _repository_id_WstringDef_Upcall_Command
+ : public TAO::Upcall_Command
+ {
+ public:
+ inline _repository_id_WstringDef_Upcall_Command (
+ POA_CORBA::WstringDef * servant,
+ TAO_Operation_Details const * operation_details,
+ TAO::Argument * const args[])
+ : servant_ (servant)
+ , operation_details_ (operation_details)
+ , args_ (args)
+ {
+ }
+
+ virtual void execute (ACE_ENV_SINGLE_ARG_DECL)
+ {
+ TAO::SArg_Traits< ::CORBA::Char *>::ret_arg_type retval =
+ TAO::Portable_Server::get_ret_arg< ::CORBA::Char *> (
+ this->operation_details_,
+ this->args_);
+
+ retval =
+ this->servant_-> _repository_id (
+ ACE_ENV_SINGLE_ARG_PARAMETER);
+ ACE_CHECK;
+ }
+
+ private:
+ POA_CORBA::WstringDef * const servant_;
+ TAO_Operation_Details const * const operation_details_;
+ TAO::Argument * const * const args_;
+ };
+}
+
+
+void POA_CORBA::WstringDef::_repository_id_skel (
+ TAO_ServerRequest & server_request,
+ void * TAO_INTERCEPTOR (servant_upcall),
+ void * servant
+ ACE_ENV_ARG_DECL
+ )
+{
+#if TAO_HAS_INTERCEPTORS == 1
+ static ::CORBA::TypeCode_ptr const * const exceptions = 0;
+ static ::CORBA::ULong const nexceptions = 0;
+#endif /* TAO_HAS_INTERCEPTORS */
+
+ TAO::SArg_Traits< ::CORBA::Char *>::ret_val retval;
+
+ TAO::Argument * const args[] =
+ {
+ &retval
+ };
+
+ static size_t const nargs = 1;
+
+ POA_CORBA::WstringDef * const impl =
+ static_cast<POA_CORBA::WstringDef *> (servant);
+
+ _repository_id_WstringDef_Upcall_Command command (
+ impl,
+ server_request.operation_details (),
+ args);
+
+ TAO::Upcall_Wrapper upcall_wrapper;
+ upcall_wrapper.upcall (server_request
+ , args
+ , nargs
+ , command
+#if TAO_HAS_INTERCEPTORS == 1
+ , servant_upcall
+ , exceptions
+ , nexceptions
+#endif /* TAO_HAS_INTERCEPTORS == 1 */
+ ACE_ENV_ARG_PARAMETER);
+ ACE_CHECK;
+}
+
+// TAO_IDL - Generated from
+// be\be_visitor_interface/interface_ss.cpp:513
+
+void POA_CORBA::WstringDef::_interface_skel (
+ TAO_ServerRequest & server_request,
+ void * /* servant_upcall */,
+ void * servant
+ ACE_ENV_ARG_DECL
+ )
+{
+ TAO_IFR_Client_Adapter *_tao_adapter =
+ ACE_Dynamic_Service<TAO_IFR_Client_Adapter>::instance (
+ TAO_ORB_Core::ifr_client_adapter_name ()
+ );
+
+ if (_tao_adapter == 0)
+ {
+ ACE_THROW ( ::CORBA::INTF_REPOS ( ::CORBA::OMGVMCID | 1,
+ ::CORBA::COMPLETED_NO));
+ }
+
+ POA_CORBA::WstringDef * const impl =
+ static_cast<POA_CORBA::WstringDef *> (servant);
+ ::CORBA::InterfaceDef_ptr _tao_retval =
+ impl->_get_interface (ACE_ENV_SINGLE_ARG_PARAMETER);
+ ACE_CHECK;
+
+ server_request.init_reply ();
+ TAO_OutputCDR &_tao_out = *server_request.outgoing ();
+
+ ::CORBA::Boolean const _tao_result =
+ _tao_adapter->interfacedef_cdr_insert (
+ _tao_out,
+ _tao_retval
+ );
+
+ _tao_adapter->dispose (_tao_retval);
+
+ if (_tao_result == false)
+ {
+ ACE_THROW ( ::CORBA::MARSHAL ());
+ }
+}namespace POA_CORBA
+{
+
+
+ // TAO_IDL - Generated from
+ // be\be_visitor_operation/upcall_command_ss.cpp:127
+
+ class _get_component_WstringDef_Upcall_Command
+ : public TAO::Upcall_Command
+ {
+ public:
+ inline _get_component_WstringDef_Upcall_Command (
+ POA_CORBA::WstringDef * servant,
+ TAO_Operation_Details const * operation_details,
+ TAO::Argument * const args[])
+ : servant_ (servant)
+ , operation_details_ (operation_details)
+ , args_ (args)
+ {
+ }
+
+ virtual void execute (ACE_ENV_SINGLE_ARG_DECL)
+ {
+ TAO::SArg_Traits< ::CORBA::Object>::ret_arg_type retval =
+ TAO::Portable_Server::get_ret_arg< ::CORBA::Object> (
+ this->operation_details_,
+ this->args_);
+
+ retval =
+ this->servant_-> _get_component (
+ ACE_ENV_SINGLE_ARG_PARAMETER);
+ ACE_CHECK;
+ }
+
+ private:
+ POA_CORBA::WstringDef * const servant_;
+ TAO_Operation_Details const * const operation_details_;
+ TAO::Argument * const * const args_;
+ };
+}
+
+
+void POA_CORBA::WstringDef::_component_skel (
+ TAO_ServerRequest & server_request,
+ void * TAO_INTERCEPTOR (servant_upcall),
+ void * servant
+ ACE_ENV_ARG_DECL
+ )
+{
+#if TAO_HAS_INTERCEPTORS == 1
+ static ::CORBA::TypeCode_ptr const * const exceptions = 0;
+ static ::CORBA::ULong const nexceptions = 0;
+#endif /* TAO_HAS_INTERCEPTORS */
+
+ TAO::SArg_Traits< ::CORBA::Object>::ret_val retval;
+
+ TAO::Argument * const args[] =
+ {
+ &retval
+ };
+
+ static size_t const nargs = 1;
+
+ POA_CORBA::WstringDef * const impl =
+ static_cast<POA_CORBA::WstringDef *> (servant);
+
+ _get_component_WstringDef_Upcall_Command command (
+ impl,
+ server_request.operation_details (),
+ args);
+
+ TAO::Upcall_Wrapper upcall_wrapper;
+ upcall_wrapper.upcall (server_request
+ , args
+ , nargs
+ , command
+#if TAO_HAS_INTERCEPTORS == 1
+ , servant_upcall
+ , exceptions
+ , nexceptions
+#endif /* TAO_HAS_INTERCEPTORS == 1 */
+ ACE_ENV_ARG_PARAMETER);
+ ACE_CHECK;
+}
+
+::CORBA::Boolean POA_CORBA::WstringDef::_is_a (
+ const char* value
+ ACE_ENV_ARG_DECL_NOT_USED
+ )
+{
+ return
+ (
+ !ACE_OS::strcmp (
+ value,
+ "IDL:omg.org/CORBA/IRObject:1.0"
+ ) ||
+ !ACE_OS::strcmp (
+ value,
+ "IDL:omg.org/CORBA/IDLType:1.0"
+ ) ||
+ !ACE_OS::strcmp (
+ value,
+ "IDL:omg.org/CORBA/WstringDef:1.0"
+ ) ||
+ !ACE_OS::strcmp (
+ value,
+ "IDL:omg.org/CORBA/Object:1.0"
+ )
+ );
+}
+
+const char* POA_CORBA::WstringDef::_interface_repository_id (void) const
+{
+ return "IDL:omg.org/CORBA/WstringDef:1.0";
+}
+
+// TAO_IDL - Generated from
+// be\be_visitor_interface/interface_ss.cpp:903
+
+void POA_CORBA::WstringDef::_dispatch (
+ TAO_ServerRequest & req,
+ void * servant_upcall
+ ACE_ENV_ARG_DECL
+ )
+{
+ this->synchronous_upcall_dispatch (req,
+ servant_upcall,
+ this
+ ACE_ENV_ARG_PARAMETER);
+}
+
+// TAO_IDL - Generated from
+// be\be_visitor_interface/interface_ss.cpp:851
+
+CORBA::WstringDef *
+POA_CORBA::WstringDef::_this (ACE_ENV_SINGLE_ARG_DECL)
+{
+ TAO_Stub *stub = this->_create_stub (ACE_ENV_SINGLE_ARG_PARAMETER);
+ ACE_CHECK_RETURN (0);
+
+ TAO_Stub_Auto_Ptr safe_stub (stub);
+ ::CORBA::Object_ptr tmp = CORBA::Object::_nil ();
+
+ ::CORBA::Boolean const _tao_opt_colloc =
+ stub->servant_orb_var ()->orb_core ()->optimize_collocation_objects ();
+
+ ACE_NEW_RETURN (
+ tmp,
+ ::CORBA::Object (stub, _tao_opt_colloc, this),
+ 0
+ );
+
+ ::CORBA::Object_var obj = tmp;
+ (void) safe_stub.release ();
+
+ typedef ::CORBA::WstringDef STUB_SCOPED_NAME;
+ return
+ TAO::Narrow_Utils<STUB_SCOPED_NAME>::unchecked_narrow (
+ obj.in (),
+ CORBA__TAO_WstringDef_Proxy_Broker_Factory_function_pointer
+ );
+}
+
+// TAO_IDL - Generated from
+// be\be_interface.cpp:1499
+
+class TAO_CORBA_SequenceDef_Perfect_Hash_OpTable
+ : public TAO_Perfect_Hash_OpTable
+{
+private:
+ unsigned int hash (const char *str, unsigned int len);
+
+public:
+ const TAO_operation_db_entry * lookup (const char *str, unsigned int len);
+};
+
+/* C++ code produced by gperf version 2.8 (ACE version) */
+/* Command-line: C:\ACE\latest\ACE_wrappers\bin\gperf.exe -m -M -J -c -C -D -E -T -f 0 -F 0,0 -a -o -t -p -K opname -L C++ -Z TAO_CORBA_SequenceDef_Perfect_Hash_OpTable -N lookup */
+unsigned int
+TAO_CORBA_SequenceDef_Perfect_Hash_OpTable::hash (const char *str, unsigned int len)
+{
+ static const unsigned char asso_values[] =
+ {
+#if defined (ACE_MVS)
+ 28, 28, 28, 28, 28, 28, 28, 28, 28, 28,
+ 28, 28, 28, 28, 28, 28, 28, 28, 28, 28,
+ 28, 28, 28, 28, 28, 28, 28, 28, 28, 28,
+ 28, 28, 28, 28, 28, 28, 28, 28, 28, 28,
+ 28, 28, 28, 28, 28, 28, 28, 28, 28, 28,
+ 28, 28, 28, 28, 28, 28, 28, 28, 28, 28,
+ 28, 28, 28, 28, 28, 28, 28, 28, 28, 28,
+ 28, 28, 28, 28, 28, 28, 28, 28, 28, 28,
+ 28, 28, 28, 28, 28, 28, 28, 28, 28, 28,
+ 28, 28, 28, 28, 28, 28, 28, 28, 28, 28,
+ 28, 28, 28, 28, 28, 28, 28, 28, 28, 0,
+ 28, 28, 28, 28, 28, 28, 28, 28, 28, 28,
+ 28, 28, 28, 28, 28, 28, 28, 28, 28, 0,
+ 28, 28, 0, 10, 0, 28, 28, 28, 28, 28,
+ 28, 28, 28, 28, 28, 28, 28, 28, 28, 28,
+ 28, 28, 28, 28, 28, 28, 28, 28, 28, 28,
+ 28, 28, 28, 5, 28, 28, 28, 28, 0, 28,
+ 28, 28, 28, 28, 28, 28, 28, 28, 28, 28,
+ 28, 28, 28, 28, 28, 28, 28, 28, 28, 28,
+ 28, 28, 28, 28, 28, 28, 28, 28, 28, 28,
+ 28, 28, 28, 28, 28, 28, 28, 28, 28, 28,
+ 28, 28, 28, 28, 28, 28, 28, 28, 28, 28,
+ 28, 28, 28, 28, 28, 28, 28, 28, 28, 28,
+ 28, 28, 28, 28, 28, 28, 28, 28, 28, 28,
+ 28, 28, 28, 28, 28, 28, 28, 28, 28, 28,
+ 28, 28, 28, 28, 28, 28,
+#else
+ 28, 28, 28, 28, 28, 28, 28, 28, 28, 28,
+ 28, 28, 28, 28, 28, 28, 28, 28, 28, 28,
+ 28, 28, 28, 28, 28, 28, 28, 28, 28, 28,
+ 28, 28, 28, 28, 28, 28, 28, 28, 28, 28,
+ 28, 28, 28, 28, 28, 28, 28, 28, 28, 28,
+ 28, 28, 28, 28, 28, 28, 28, 28, 28, 28,
+ 28, 28, 28, 28, 28, 28, 28, 28, 28, 28,
+ 28, 28, 28, 28, 28, 28, 28, 28, 28, 28,
+ 28, 28, 28, 28, 28, 28, 28, 28, 28, 28,
+ 28, 28, 28, 28, 28, 0, 28, 0, 28, 28,
+ 0, 10, 0, 28, 28, 28, 28, 28, 28, 28,
+ 28, 28, 28, 28, 28, 28, 5, 28, 28, 28,
+ 28, 0, 28, 28, 28, 28, 28, 28,
+#endif /* ACE_MVS */
+ };
+ return len + asso_values[(int) str[len - 1]] + asso_values[(int) str[0]];
+}
+
+const TAO_operation_db_entry *
+TAO_CORBA_SequenceDef_Perfect_Hash_OpTable::lookup (const char *str, unsigned int len)
+{
+ enum
+ {
+ TOTAL_KEYWORDS = 13,
+ MIN_WORD_LENGTH = 5,
+ MAX_WORD_LENGTH = 21,
+ MIN_HASH_VALUE = 5,
+ MAX_HASH_VALUE = 27,
+ HASH_VALUE_RANGE = 23,
+ DUPLICATES = 3,
+ WORDLIST_SIZE = 18
+ };
+
+ static const TAO_operation_db_entry wordlist[] =
+ {
+ {"",0,0},{"",0,0},{"",0,0},{"",0,0},{"",0,0},
+ {"_is_a", &POA_CORBA::SequenceDef::_is_a_skel, 0},
+ {"destroy", &POA_CORBA::SequenceDef::destroy_skel, 0},
+ {"_get_bound", &POA_CORBA::SequenceDef::_get_bound_skel, 0},
+ {"_set_bound", &POA_CORBA::SequenceDef::_set_bound_skel, 0},
+ {"_get_def_kind", &POA_CORBA::SequenceDef::_get_def_kind_skel, 0},
+ {"_repository_id", &POA_CORBA::SequenceDef::_repository_id_skel, 0},
+ {"_component", &POA_CORBA::SequenceDef::_component_skel, 0},
+ {"_non_existent", &POA_CORBA::SequenceDef::_non_existent_skel, 0},
+ {"_get_type", &POA_CORBA::SequenceDef::_get_type_skel, 0},
+ {"_interface", &POA_CORBA::SequenceDef::_interface_skel, 0},
+ {"_get_element_type_def", &POA_CORBA::SequenceDef::_get_element_type_def_skel, 0},
+ {"_set_element_type_def", &POA_CORBA::SequenceDef::_set_element_type_def_skel, 0},
+ {"_get_element_type", &POA_CORBA::SequenceDef::_get_element_type_skel, 0},
+ };
+
+ static const signed char lookup[] =
+ {
+ -1, -1, -1, -1, -1, 5, -1, 6, -7, -2, -29, -1, -1, 9,
+ 10, 11, -15, -2, 12, 13, 14, -32, -1, -1, -1, -1, -1, 17,
+
+ };
+
+ if (len <= MAX_WORD_LENGTH && len >= MIN_WORD_LENGTH)
+ {
+ unsigned int key = hash (str, len);
+
+ if (key <= MAX_HASH_VALUE && key >= MIN_HASH_VALUE)
+ {
+ int slot = lookup[key];
+
+ if (slot >= 0 && slot < WORDLIST_SIZE)
+ {
+ const char *s = wordlist[slot].opname;
+
+ if (*str == *s && !strncmp (str + 1, s + 1, len - 1))
+ return &wordlist[slot];
+ }
+ else if (slot < 0 && slot >= -MAX_HASH_VALUE)
+ return 0;
+ else
+ {
+ unsigned int offset = key + slot + (slot > 0 ? -MAX_HASH_VALUE : MAX_HASH_VALUE);
+ const TAO_operation_db_entry *base = &wordlist[-lookup[offset]];
+ const TAO_operation_db_entry *ptr = base + -lookup[offset + 1];
+
+ while (--ptr >= base)
+ if (*str == *ptr->opname && !strncmp (str + 1, ptr->opname + 1, len - 1))
+ return ptr;
+ }
+ }
+ }
+ return 0;
+}
+
+static TAO_CORBA_SequenceDef_Perfect_Hash_OpTable tao_CORBA_SequenceDef_optable;
+
+// TAO_IDL - Generated from
+// be\be_visitor_interface/interface_ss.cpp:966
+
+TAO::Collocation_Proxy_Broker *
+CORBA__TAO_SequenceDef_Proxy_Broker_Factory_function ( ::CORBA::Object_ptr)
+{
+ return reinterpret_cast<TAO::Collocation_Proxy_Broker *> (0xdead); // Dummy
+}
+
+int
+CORBA__TAO_SequenceDef_Proxy_Broker_Factory_Initializer (size_t)
+{
+ CORBA__TAO_SequenceDef_Proxy_Broker_Factory_function_pointer =
+ CORBA__TAO_SequenceDef_Proxy_Broker_Factory_function;
+
+ return 0;
+}
+
+static int
+CORBA__TAO_SequenceDef_Proxy_Broker_Stub_Factory_Initializer_Scarecrow =
+ CORBA__TAO_SequenceDef_Proxy_Broker_Factory_Initializer (
+ reinterpret_cast<size_t> (CORBA__TAO_SequenceDef_Proxy_Broker_Factory_Initializer)
+ );
+
+// TAO_IDL - Generated from
+// be\be_visitor_interface/interface_ss.cpp:103
+
+POA_CORBA::SequenceDef::SequenceDef (void)
+ : TAO_ServantBase ()
+{
+ this->optable_ = &tao_CORBA_SequenceDef_optable;
+}
+
+POA_CORBA::SequenceDef::SequenceDef (const SequenceDef& rhs)
+ : TAO_Abstract_ServantBase (rhs),
+ TAO_ServantBase (rhs),
+ POA_CORBA::IRObject (rhs),
+ POA_CORBA::IDLType (rhs)
+{
+}
+
+POA_CORBA::SequenceDef::~SequenceDef (void)
+{
+}namespace POA_CORBA
+{
+
+
+ // TAO_IDL - Generated from
+ // be\be_visitor_operation/upcall_command_ss.cpp:127
+
+ class _get_bound_SequenceDef
+ : public TAO::Upcall_Command
+ {
+ public:
+ inline _get_bound_SequenceDef (
+ POA_CORBA::SequenceDef * servant,
+ TAO_Operation_Details const * operation_details,
+ TAO::Argument * const args[])
+ : servant_ (servant)
+ , operation_details_ (operation_details)
+ , args_ (args)
+ {
+ }
+
+ virtual void execute (ACE_ENV_SINGLE_ARG_DECL)
+ {
+ TAO::SArg_Traits< ::CORBA::ULong>::ret_arg_type retval =
+ TAO::Portable_Server::get_ret_arg< ::CORBA::ULong> (
+ this->operation_details_,
+ this->args_);
+
+ retval =
+ this->servant_->bound (
+ ACE_ENV_SINGLE_ARG_PARAMETER);
+ ACE_CHECK;
+ }
+
+ private:
+ POA_CORBA::SequenceDef * const servant_;
+ TAO_Operation_Details const * const operation_details_;
+ TAO::Argument * const * const args_;
+ };
+}
+
+
+// TAO_IDL - Generated from
+// be\be_visitor_operation/operation_ss.cpp:190
+
+void POA_CORBA::SequenceDef::_get_bound_skel (
+ TAO_ServerRequest & server_request,
+ void * TAO_INTERCEPTOR (servant_upcall),
+ void * servant
+ ACE_ENV_ARG_DECL
+ )
+{
+#if TAO_HAS_INTERCEPTORS == 1
+ static ::CORBA::TypeCode_ptr const * const exceptions = 0;
+ static ::CORBA::ULong const nexceptions = 0;
+#endif /* TAO_HAS_INTERCEPTORS */
+
+ TAO::SArg_Traits< ::CORBA::ULong>::ret_val retval;
+
+ TAO::Argument * const args[] =
+ {
+ &retval
+ };
+
+ static size_t const nargs = 1;
+
+ POA_CORBA::SequenceDef * const impl =
+ static_cast<POA_CORBA::SequenceDef *> (servant);
+
+ _get_bound_SequenceDef command (
+ impl,
+ server_request.operation_details (),
+ args);
+
+ TAO::Upcall_Wrapper upcall_wrapper;
+ upcall_wrapper.upcall (server_request
+ , args
+ , nargs
+ , command
+#if TAO_HAS_INTERCEPTORS == 1
+ , servant_upcall
+ , exceptions
+ , nexceptions
+#endif /* TAO_HAS_INTERCEPTORS == 1 */
+ ACE_ENV_ARG_PARAMETER);
+ ACE_CHECK;
+}namespace POA_CORBA
+{
+
+
+ // TAO_IDL - Generated from
+ // be\be_visitor_operation/upcall_command_ss.cpp:127
+
+ class _set_bound_SequenceDef
+ : public TAO::Upcall_Command
+ {
+ public:
+ inline _set_bound_SequenceDef (
+ POA_CORBA::SequenceDef * servant,
+ TAO_Operation_Details const * operation_details,
+ TAO::Argument * const args[])
+ : servant_ (servant)
+ , operation_details_ (operation_details)
+ , args_ (args)
+ {
+ }
+
+ virtual void execute (ACE_ENV_SINGLE_ARG_DECL)
+ {
+ TAO::SArg_Traits< ::CORBA::ULong>::in_arg_type arg_1 =
+ TAO::Portable_Server::get_in_arg< ::CORBA::ULong> (
+ this->operation_details_,
+ this->args_,
+ 1);
+
+ this->servant_->bound (
+ arg_1
+ ACE_ENV_ARG_PARAMETER);
+ ACE_CHECK;
+ }
+
+ private:
+ POA_CORBA::SequenceDef * const servant_;
+ TAO_Operation_Details const * const operation_details_;
+ TAO::Argument * const * const args_;
+ };
+}
+
+
+// TAO_IDL - Generated from
+// be\be_visitor_operation/operation_ss.cpp:190
+
+void POA_CORBA::SequenceDef::_set_bound_skel (
+ TAO_ServerRequest & server_request,
+ void * TAO_INTERCEPTOR (servant_upcall),
+ void * servant
+ ACE_ENV_ARG_DECL
+ )
+{
+#if TAO_HAS_INTERCEPTORS == 1
+ static ::CORBA::TypeCode_ptr const * const exceptions = 0;
+ static ::CORBA::ULong const nexceptions = 0;
+#endif /* TAO_HAS_INTERCEPTORS */
+
+ TAO::SArg_Traits< void>::ret_val retval;
+ TAO::SArg_Traits< ::CORBA::ULong>::in_arg_val _tao_bound;
+
+ TAO::Argument * const args[] =
+ {
+ &retval,
+ &_tao_bound
+ };
+
+ static size_t const nargs = 2;
+
+ POA_CORBA::SequenceDef * const impl =
+ static_cast<POA_CORBA::SequenceDef *> (servant);
+
+ _set_bound_SequenceDef command (
+ impl,
+ server_request.operation_details (),
+ args);
+
+ TAO::Upcall_Wrapper upcall_wrapper;
+ upcall_wrapper.upcall (server_request
+ , args
+ , nargs
+ , command
+#if TAO_HAS_INTERCEPTORS == 1
+ , servant_upcall
+ , exceptions
+ , nexceptions
+#endif /* TAO_HAS_INTERCEPTORS == 1 */
+ ACE_ENV_ARG_PARAMETER);
+ ACE_CHECK;
+}namespace POA_CORBA
+{
+
+
+ // TAO_IDL - Generated from
+ // be\be_visitor_operation/upcall_command_ss.cpp:127
+
+ class _get_element_type_SequenceDef
+ : public TAO::Upcall_Command
+ {
+ public:
+ inline _get_element_type_SequenceDef (
+ POA_CORBA::SequenceDef * servant,
+ TAO_Operation_Details const * operation_details,
+ TAO::Argument * const args[])
+ : servant_ (servant)
+ , operation_details_ (operation_details)
+ , args_ (args)
+ {
+ }
+
+ virtual void execute (ACE_ENV_SINGLE_ARG_DECL)
+ {
+ TAO::SArg_Traits< ::CORBA::TypeCode>::ret_arg_type retval =
+ TAO::Portable_Server::get_ret_arg< ::CORBA::TypeCode> (
+ this->operation_details_,
+ this->args_);
+
+ retval =
+ this->servant_->element_type (
+ ACE_ENV_SINGLE_ARG_PARAMETER);
+ ACE_CHECK;
+ }
+
+ private:
+ POA_CORBA::SequenceDef * const servant_;
+ TAO_Operation_Details const * const operation_details_;
+ TAO::Argument * const * const args_;
+ };
+}
+
+
+// TAO_IDL - Generated from
+// be\be_visitor_operation/operation_ss.cpp:190
+
+void POA_CORBA::SequenceDef::_get_element_type_skel (
+ TAO_ServerRequest & server_request,
+ void * TAO_INTERCEPTOR (servant_upcall),
+ void * servant
+ ACE_ENV_ARG_DECL
+ )
+{
+#if TAO_HAS_INTERCEPTORS == 1
+ static ::CORBA::TypeCode_ptr const * const exceptions = 0;
+ static ::CORBA::ULong const nexceptions = 0;
+#endif /* TAO_HAS_INTERCEPTORS */
+
+ TAO::SArg_Traits< ::CORBA::TypeCode>::ret_val retval;
+
+ TAO::Argument * const args[] =
+ {
+ &retval
+ };
+
+ static size_t const nargs = 1;
+
+ POA_CORBA::SequenceDef * const impl =
+ static_cast<POA_CORBA::SequenceDef *> (servant);
+
+ _get_element_type_SequenceDef command (
+ impl,
+ server_request.operation_details (),
+ args);
+
+ TAO::Upcall_Wrapper upcall_wrapper;
+ upcall_wrapper.upcall (server_request
+ , args
+ , nargs
+ , command
+#if TAO_HAS_INTERCEPTORS == 1
+ , servant_upcall
+ , exceptions
+ , nexceptions
+#endif /* TAO_HAS_INTERCEPTORS == 1 */
+ ACE_ENV_ARG_PARAMETER);
+ ACE_CHECK;
+}namespace POA_CORBA
+{
+
+
+ // TAO_IDL - Generated from
+ // be\be_visitor_operation/upcall_command_ss.cpp:127
+
+ class _get_element_type_def_SequenceDef
+ : public TAO::Upcall_Command
+ {
+ public:
+ inline _get_element_type_def_SequenceDef (
+ POA_CORBA::SequenceDef * servant,
+ TAO_Operation_Details const * operation_details,
+ TAO::Argument * const args[])
+ : servant_ (servant)
+ , operation_details_ (operation_details)
+ , args_ (args)
+ {
+ }
+
+ virtual void execute (ACE_ENV_SINGLE_ARG_DECL)
+ {
+ TAO::SArg_Traits< ::CORBA::IDLType>::ret_arg_type retval =
+ TAO::Portable_Server::get_ret_arg< ::CORBA::IDLType> (
+ this->operation_details_,
+ this->args_);
+
+ retval =
+ this->servant_->element_type_def (
+ ACE_ENV_SINGLE_ARG_PARAMETER);
+ ACE_CHECK;
+ }
+
+ private:
+ POA_CORBA::SequenceDef * const servant_;
+ TAO_Operation_Details const * const operation_details_;
+ TAO::Argument * const * const args_;
+ };
+}
+
+
+// TAO_IDL - Generated from
+// be\be_visitor_operation/operation_ss.cpp:190
+
+void POA_CORBA::SequenceDef::_get_element_type_def_skel (
+ TAO_ServerRequest & server_request,
+ void * TAO_INTERCEPTOR (servant_upcall),
+ void * servant
+ ACE_ENV_ARG_DECL
+ )
+{
+#if TAO_HAS_INTERCEPTORS == 1
+ static ::CORBA::TypeCode_ptr const * const exceptions = 0;
+ static ::CORBA::ULong const nexceptions = 0;
+#endif /* TAO_HAS_INTERCEPTORS */
+
+ TAO::SArg_Traits< ::CORBA::IDLType>::ret_val retval;
+
+ TAO::Argument * const args[] =
+ {
+ &retval
+ };
+
+ static size_t const nargs = 1;
+
+ POA_CORBA::SequenceDef * const impl =
+ static_cast<POA_CORBA::SequenceDef *> (servant);
+
+ _get_element_type_def_SequenceDef command (
+ impl,
+ server_request.operation_details (),
+ args);
+
+ TAO::Upcall_Wrapper upcall_wrapper;
+ upcall_wrapper.upcall (server_request
+ , args
+ , nargs
+ , command
+#if TAO_HAS_INTERCEPTORS == 1
+ , servant_upcall
+ , exceptions
+ , nexceptions
+#endif /* TAO_HAS_INTERCEPTORS == 1 */
+ ACE_ENV_ARG_PARAMETER);
+ ACE_CHECK;
+}namespace POA_CORBA
+{
+
+
+ // TAO_IDL - Generated from
+ // be\be_visitor_operation/upcall_command_ss.cpp:127
+
+ class _set_element_type_def_SequenceDef
+ : public TAO::Upcall_Command
+ {
+ public:
+ inline _set_element_type_def_SequenceDef (
+ POA_CORBA::SequenceDef * servant,
+ TAO_Operation_Details const * operation_details,
+ TAO::Argument * const args[])
+ : servant_ (servant)
+ , operation_details_ (operation_details)
+ , args_ (args)
+ {
+ }
+
+ virtual void execute (ACE_ENV_SINGLE_ARG_DECL)
+ {
+ TAO::SArg_Traits< ::CORBA::IDLType>::in_arg_type arg_1 =
+ TAO::Portable_Server::get_in_arg< ::CORBA::IDLType> (
+ this->operation_details_,
+ this->args_,
+ 1);
+
+ this->servant_->element_type_def (
+ arg_1
+ ACE_ENV_ARG_PARAMETER);
+ ACE_CHECK;
+ }
+
+ private:
+ POA_CORBA::SequenceDef * const servant_;
+ TAO_Operation_Details const * const operation_details_;
+ TAO::Argument * const * const args_;
+ };
+}
+
+
+// TAO_IDL - Generated from
+// be\be_visitor_operation/operation_ss.cpp:190
+
+void POA_CORBA::SequenceDef::_set_element_type_def_skel (
+ TAO_ServerRequest & server_request,
+ void * TAO_INTERCEPTOR (servant_upcall),
+ void * servant
+ ACE_ENV_ARG_DECL
+ )
+{
+#if TAO_HAS_INTERCEPTORS == 1
+ static ::CORBA::TypeCode_ptr const * const exceptions = 0;
+ static ::CORBA::ULong const nexceptions = 0;
+#endif /* TAO_HAS_INTERCEPTORS */
+
+ TAO::SArg_Traits< void>::ret_val retval;
+ TAO::SArg_Traits< ::CORBA::IDLType>::in_arg_val _tao_element_type_def;
+
+ TAO::Argument * const args[] =
+ {
+ &retval,
+ &_tao_element_type_def
+ };
+
+ static size_t const nargs = 2;
+
+ POA_CORBA::SequenceDef * const impl =
+ static_cast<POA_CORBA::SequenceDef *> (servant);
+
+ _set_element_type_def_SequenceDef command (
+ impl,
+ server_request.operation_details (),
+ args);
+
+ TAO::Upcall_Wrapper upcall_wrapper;
+ upcall_wrapper.upcall (server_request
+ , args
+ , nargs
+ , command
+#if TAO_HAS_INTERCEPTORS == 1
+ , servant_upcall
+ , exceptions
+ , nexceptions
+#endif /* TAO_HAS_INTERCEPTORS == 1 */
+ ACE_ENV_ARG_PARAMETER);
+ ACE_CHECK;
+}
+
+// TAO_IDL - Generated from
+// be\be_visitor_interface/interface_ss.cpp:169
+
+namespace POA_CORBA
+{
+
+
+ // TAO_IDL - Generated from
+ // be\be_visitor_operation/upcall_command_ss.cpp:127
+
+ class _is_a_SequenceDef_Upcall_Command
+ : public TAO::Upcall_Command
+ {
+ public:
+ inline _is_a_SequenceDef_Upcall_Command (
+ POA_CORBA::SequenceDef * servant,
+ TAO_Operation_Details const * operation_details,
+ TAO::Argument * const args[])
+ : servant_ (servant)
+ , operation_details_ (operation_details)
+ , args_ (args)
+ {
+ }
+
+ virtual void execute (ACE_ENV_SINGLE_ARG_DECL)
+ {
+ TAO::SArg_Traits< ::ACE_InputCDR::to_boolean>::ret_arg_type retval =
+ TAO::Portable_Server::get_ret_arg< ::ACE_InputCDR::to_boolean> (
+ this->operation_details_,
+ this->args_);
+
+ TAO::SArg_Traits< ::CORBA::Char *>::in_arg_type arg_1 =
+ TAO::Portable_Server::get_in_arg< ::CORBA::Char *> (
+ this->operation_details_,
+ this->args_,
+ 1);
+
+ retval =
+ this->servant_-> _is_a (
+ arg_1
+ ACE_ENV_ARG_PARAMETER);
+ ACE_CHECK;
+ }
+
+ private:
+ POA_CORBA::SequenceDef * const servant_;
+ TAO_Operation_Details const * const operation_details_;
+ TAO::Argument * const * const args_;
+ };
+}
+
+
+void POA_CORBA::SequenceDef::_is_a_skel (
+ TAO_ServerRequest & server_request,
+ void * TAO_INTERCEPTOR (servant_upcall),
+ void * servant
+ ACE_ENV_ARG_DECL
+ )
+{
+#if TAO_HAS_INTERCEPTORS == 1
+ static ::CORBA::TypeCode_ptr const * const exceptions = 0;
+ static ::CORBA::ULong const nexceptions = 0;
+#endif /* TAO_HAS_INTERCEPTORS */
+
+ TAO::SArg_Traits< ::ACE_InputCDR::to_boolean>::ret_val retval;
+ TAO::SArg_Traits< ::CORBA::Char *>::in_arg_val _tao_repository_id;
+
+ TAO::Argument * const args[] =
+ {
+ &retval,
+ &_tao_repository_id
+ };
+
+ static size_t const nargs = 2;
+
+ POA_CORBA::SequenceDef * const impl =
+ static_cast<POA_CORBA::SequenceDef *> (servant);
+
+ _is_a_SequenceDef_Upcall_Command command (
+ impl,
+ server_request.operation_details (),
+ args);
+
+ TAO::Upcall_Wrapper upcall_wrapper;
+ upcall_wrapper.upcall (server_request
+ , args
+ , nargs
+ , command
+#if TAO_HAS_INTERCEPTORS == 1
+ , servant_upcall
+ , exceptions
+ , nexceptions
+#endif /* TAO_HAS_INTERCEPTORS == 1 */
+ ACE_ENV_ARG_PARAMETER);
+ ACE_CHECK;
+}namespace POA_CORBA
+{
+
+
+ // TAO_IDL - Generated from
+ // be\be_visitor_operation/upcall_command_ss.cpp:127
+
+ class _non_existent_SequenceDef_Upcall_Command
+ : public TAO::Upcall_Command
+ {
+ public:
+ inline _non_existent_SequenceDef_Upcall_Command (
+ POA_CORBA::SequenceDef * servant,
+ TAO_Operation_Details const * operation_details,
+ TAO::Argument * const args[])
+ : servant_ (servant)
+ , operation_details_ (operation_details)
+ , args_ (args)
+ {
+ }
+
+ virtual void execute (ACE_ENV_SINGLE_ARG_DECL)
+ {
+ TAO::SArg_Traits< ::ACE_InputCDR::to_boolean>::ret_arg_type retval =
+ TAO::Portable_Server::get_ret_arg< ::ACE_InputCDR::to_boolean> (
+ this->operation_details_,
+ this->args_);
+
+ retval =
+ this->servant_-> _non_existent (
+ ACE_ENV_SINGLE_ARG_PARAMETER);
+ ACE_CHECK;
+ }
+
+ private:
+ POA_CORBA::SequenceDef * const servant_;
+ TAO_Operation_Details const * const operation_details_;
+ TAO::Argument * const * const args_;
+ };
+}
+
+
+void POA_CORBA::SequenceDef::_non_existent_skel (
+ TAO_ServerRequest & server_request,
+ void * TAO_INTERCEPTOR (servant_upcall),
+ void * servant
+ ACE_ENV_ARG_DECL
+ )
+{
+#if TAO_HAS_INTERCEPTORS == 1
+ static ::CORBA::TypeCode_ptr const * const exceptions = 0;
+ static ::CORBA::ULong const nexceptions = 0;
+#endif /* TAO_HAS_INTERCEPTORS */
+
+ TAO::SArg_Traits< ::ACE_InputCDR::to_boolean>::ret_val retval;
+
+ TAO::Argument * const args[] =
+ {
+ &retval
+ };
+
+ static size_t const nargs = 1;
+
+ POA_CORBA::SequenceDef * const impl =
+ static_cast<POA_CORBA::SequenceDef *> (servant);
+
+ _non_existent_SequenceDef_Upcall_Command command (
+ impl,
+ server_request.operation_details (),
+ args);
+
+ TAO::Upcall_Wrapper upcall_wrapper;
+ upcall_wrapper.upcall (server_request
+ , args
+ , nargs
+ , command
+#if TAO_HAS_INTERCEPTORS == 1
+ , servant_upcall
+ , exceptions
+ , nexceptions
+#endif /* TAO_HAS_INTERCEPTORS == 1 */
+ ACE_ENV_ARG_PARAMETER);
+ ACE_CHECK;
+}namespace POA_CORBA
+{
+
+
+ // TAO_IDL - Generated from
+ // be\be_visitor_operation/upcall_command_ss.cpp:127
+
+ class _repository_id_SequenceDef_Upcall_Command
+ : public TAO::Upcall_Command
+ {
+ public:
+ inline _repository_id_SequenceDef_Upcall_Command (
+ POA_CORBA::SequenceDef * servant,
+ TAO_Operation_Details const * operation_details,
+ TAO::Argument * const args[])
+ : servant_ (servant)
+ , operation_details_ (operation_details)
+ , args_ (args)
+ {
+ }
+
+ virtual void execute (ACE_ENV_SINGLE_ARG_DECL)
+ {
+ TAO::SArg_Traits< ::CORBA::Char *>::ret_arg_type retval =
+ TAO::Portable_Server::get_ret_arg< ::CORBA::Char *> (
+ this->operation_details_,
+ this->args_);
+
+ retval =
+ this->servant_-> _repository_id (
+ ACE_ENV_SINGLE_ARG_PARAMETER);
+ ACE_CHECK;
+ }
+
+ private:
+ POA_CORBA::SequenceDef * const servant_;
+ TAO_Operation_Details const * const operation_details_;
+ TAO::Argument * const * const args_;
+ };
+}
+
+
+void POA_CORBA::SequenceDef::_repository_id_skel (
+ TAO_ServerRequest & server_request,
+ void * TAO_INTERCEPTOR (servant_upcall),
+ void * servant
+ ACE_ENV_ARG_DECL
+ )
+{
+#if TAO_HAS_INTERCEPTORS == 1
+ static ::CORBA::TypeCode_ptr const * const exceptions = 0;
+ static ::CORBA::ULong const nexceptions = 0;
+#endif /* TAO_HAS_INTERCEPTORS */
+
+ TAO::SArg_Traits< ::CORBA::Char *>::ret_val retval;
+
+ TAO::Argument * const args[] =
+ {
+ &retval
+ };
+
+ static size_t const nargs = 1;
+
+ POA_CORBA::SequenceDef * const impl =
+ static_cast<POA_CORBA::SequenceDef *> (servant);
+
+ _repository_id_SequenceDef_Upcall_Command command (
+ impl,
+ server_request.operation_details (),
+ args);
+
+ TAO::Upcall_Wrapper upcall_wrapper;
+ upcall_wrapper.upcall (server_request
+ , args
+ , nargs
+ , command
+#if TAO_HAS_INTERCEPTORS == 1
+ , servant_upcall
+ , exceptions
+ , nexceptions
+#endif /* TAO_HAS_INTERCEPTORS == 1 */
+ ACE_ENV_ARG_PARAMETER);
+ ACE_CHECK;
+}
+
+// TAO_IDL - Generated from
+// be\be_visitor_interface/interface_ss.cpp:513
+
+void POA_CORBA::SequenceDef::_interface_skel (
+ TAO_ServerRequest & server_request,
+ void * /* servant_upcall */,
+ void * servant
+ ACE_ENV_ARG_DECL
+ )
+{
+ TAO_IFR_Client_Adapter *_tao_adapter =
+ ACE_Dynamic_Service<TAO_IFR_Client_Adapter>::instance (
+ TAO_ORB_Core::ifr_client_adapter_name ()
+ );
+
+ if (_tao_adapter == 0)
+ {
+ ACE_THROW ( ::CORBA::INTF_REPOS ( ::CORBA::OMGVMCID | 1,
+ ::CORBA::COMPLETED_NO));
+ }
+
+ POA_CORBA::SequenceDef * const impl =
+ static_cast<POA_CORBA::SequenceDef *> (servant);
+ ::CORBA::InterfaceDef_ptr _tao_retval =
+ impl->_get_interface (ACE_ENV_SINGLE_ARG_PARAMETER);
+ ACE_CHECK;
+
+ server_request.init_reply ();
+ TAO_OutputCDR &_tao_out = *server_request.outgoing ();
+
+ ::CORBA::Boolean const _tao_result =
+ _tao_adapter->interfacedef_cdr_insert (
+ _tao_out,
+ _tao_retval
+ );
+
+ _tao_adapter->dispose (_tao_retval);
+
+ if (_tao_result == false)
+ {
+ ACE_THROW ( ::CORBA::MARSHAL ());
+ }
+}namespace POA_CORBA
+{
+
+
+ // TAO_IDL - Generated from
+ // be\be_visitor_operation/upcall_command_ss.cpp:127
+
+ class _get_component_SequenceDef_Upcall_Command
+ : public TAO::Upcall_Command
+ {
+ public:
+ inline _get_component_SequenceDef_Upcall_Command (
+ POA_CORBA::SequenceDef * servant,
+ TAO_Operation_Details const * operation_details,
+ TAO::Argument * const args[])
+ : servant_ (servant)
+ , operation_details_ (operation_details)
+ , args_ (args)
+ {
+ }
+
+ virtual void execute (ACE_ENV_SINGLE_ARG_DECL)
+ {
+ TAO::SArg_Traits< ::CORBA::Object>::ret_arg_type retval =
+ TAO::Portable_Server::get_ret_arg< ::CORBA::Object> (
+ this->operation_details_,
+ this->args_);
+
+ retval =
+ this->servant_-> _get_component (
+ ACE_ENV_SINGLE_ARG_PARAMETER);
+ ACE_CHECK;
+ }
+
+ private:
+ POA_CORBA::SequenceDef * const servant_;
+ TAO_Operation_Details const * const operation_details_;
+ TAO::Argument * const * const args_;
+ };
+}
+
+
+void POA_CORBA::SequenceDef::_component_skel (
+ TAO_ServerRequest & server_request,
+ void * TAO_INTERCEPTOR (servant_upcall),
+ void * servant
+ ACE_ENV_ARG_DECL
+ )
+{
+#if TAO_HAS_INTERCEPTORS == 1
+ static ::CORBA::TypeCode_ptr const * const exceptions = 0;
+ static ::CORBA::ULong const nexceptions = 0;
+#endif /* TAO_HAS_INTERCEPTORS */
+
+ TAO::SArg_Traits< ::CORBA::Object>::ret_val retval;
+
+ TAO::Argument * const args[] =
+ {
+ &retval
+ };
+
+ static size_t const nargs = 1;
+
+ POA_CORBA::SequenceDef * const impl =
+ static_cast<POA_CORBA::SequenceDef *> (servant);
+
+ _get_component_SequenceDef_Upcall_Command command (
+ impl,
+ server_request.operation_details (),
+ args);
+
+ TAO::Upcall_Wrapper upcall_wrapper;
+ upcall_wrapper.upcall (server_request
+ , args
+ , nargs
+ , command
+#if TAO_HAS_INTERCEPTORS == 1
+ , servant_upcall
+ , exceptions
+ , nexceptions
+#endif /* TAO_HAS_INTERCEPTORS == 1 */
+ ACE_ENV_ARG_PARAMETER);
+ ACE_CHECK;
+}
+
+::CORBA::Boolean POA_CORBA::SequenceDef::_is_a (
+ const char* value
+ ACE_ENV_ARG_DECL_NOT_USED
+ )
+{
+ return
+ (
+ !ACE_OS::strcmp (
+ value,
+ "IDL:omg.org/CORBA/IRObject:1.0"
+ ) ||
+ !ACE_OS::strcmp (
+ value,
+ "IDL:omg.org/CORBA/IDLType:1.0"
+ ) ||
+ !ACE_OS::strcmp (
+ value,
+ "IDL:omg.org/CORBA/SequenceDef:1.0"
+ ) ||
+ !ACE_OS::strcmp (
+ value,
+ "IDL:omg.org/CORBA/Object:1.0"
+ )
+ );
+}
+
+const char* POA_CORBA::SequenceDef::_interface_repository_id (void) const
+{
+ return "IDL:omg.org/CORBA/SequenceDef:1.0";
+}
+
+// TAO_IDL - Generated from
+// be\be_visitor_interface/interface_ss.cpp:903
+
+void POA_CORBA::SequenceDef::_dispatch (
+ TAO_ServerRequest & req,
+ void * servant_upcall
+ ACE_ENV_ARG_DECL
+ )
+{
+ this->synchronous_upcall_dispatch (req,
+ servant_upcall,
+ this
+ ACE_ENV_ARG_PARAMETER);
+}
+
+// TAO_IDL - Generated from
+// be\be_visitor_interface/interface_ss.cpp:851
+
+CORBA::SequenceDef *
+POA_CORBA::SequenceDef::_this (ACE_ENV_SINGLE_ARG_DECL)
+{
+ TAO_Stub *stub = this->_create_stub (ACE_ENV_SINGLE_ARG_PARAMETER);
+ ACE_CHECK_RETURN (0);
+
+ TAO_Stub_Auto_Ptr safe_stub (stub);
+ ::CORBA::Object_ptr tmp = CORBA::Object::_nil ();
+
+ ::CORBA::Boolean const _tao_opt_colloc =
+ stub->servant_orb_var ()->orb_core ()->optimize_collocation_objects ();
+
+ ACE_NEW_RETURN (
+ tmp,
+ ::CORBA::Object (stub, _tao_opt_colloc, this),
+ 0
+ );
+
+ ::CORBA::Object_var obj = tmp;
+ (void) safe_stub.release ();
+
+ typedef ::CORBA::SequenceDef STUB_SCOPED_NAME;
+ return
+ TAO::Narrow_Utils<STUB_SCOPED_NAME>::unchecked_narrow (
+ obj.in (),
+ CORBA__TAO_SequenceDef_Proxy_Broker_Factory_function_pointer
+ );
+}
+
+// TAO_IDL - Generated from
+// be\be_interface.cpp:1499
+
+class TAO_CORBA_ArrayDef_Perfect_Hash_OpTable
+ : public TAO_Perfect_Hash_OpTable
+{
+private:
+ unsigned int hash (const char *str, unsigned int len);
+
+public:
+ const TAO_operation_db_entry * lookup (const char *str, unsigned int len);
+};
+
+/* C++ code produced by gperf version 2.8 (ACE version) */
+/* Command-line: C:\ACE\latest\ACE_wrappers\bin\gperf.exe -m -M -J -c -C -D -E -T -f 0 -F 0,0 -a -o -t -p -K opname -L C++ -Z TAO_CORBA_ArrayDef_Perfect_Hash_OpTable -N lookup */
+unsigned int
+TAO_CORBA_ArrayDef_Perfect_Hash_OpTable::hash (const char *str, unsigned int len)
+{
+ static const unsigned char asso_values[] =
+ {
+#if defined (ACE_MVS)
+ 22, 22, 22, 22, 22, 22, 22, 22, 22, 22,
+ 22, 22, 22, 22, 22, 22, 22, 22, 22, 22,
+ 22, 22, 22, 22, 22, 22, 22, 22, 22, 22,
+ 22, 22, 22, 22, 22, 22, 22, 22, 22, 22,
+ 22, 22, 22, 22, 22, 22, 22, 22, 22, 22,
+ 22, 22, 22, 22, 22, 22, 22, 22, 22, 22,
+ 22, 22, 22, 22, 22, 22, 22, 22, 22, 22,
+ 22, 22, 22, 22, 22, 22, 22, 22, 22, 22,
+ 22, 22, 22, 22, 22, 22, 22, 22, 22, 22,
+ 22, 22, 22, 22, 22, 22, 22, 22, 22, 22,
+ 22, 22, 22, 22, 22, 22, 22, 22, 22, 0,
+ 22, 22, 22, 22, 22, 22, 22, 22, 22, 22,
+ 22, 22, 22, 22, 22, 22, 22, 22, 22, 0,
+ 22, 22, 0, 0, 0, 22, 0, 22, 22, 22,
+ 22, 22, 22, 22, 22, 22, 22, 22, 22, 22,
+ 22, 22, 22, 22, 22, 22, 22, 22, 22, 22,
+ 22, 22, 22, 5, 22, 22, 22, 22, 0, 22,
+ 22, 22, 22, 22, 22, 22, 22, 22, 22, 22,
+ 22, 22, 22, 22, 22, 22, 22, 22, 22, 22,
+ 22, 22, 22, 22, 22, 22, 22, 22, 22, 22,
+ 22, 22, 22, 22, 22, 22, 22, 22, 22, 22,
+ 22, 22, 22, 22, 22, 22, 22, 22, 22, 22,
+ 22, 22, 22, 22, 22, 22, 22, 22, 22, 22,
+ 22, 22, 22, 22, 22, 22, 22, 22, 22, 22,
+ 22, 22, 22, 22, 22, 22, 22, 22, 22, 22,
+ 22, 22, 22, 22, 22, 22,
+#else
+ 22, 22, 22, 22, 22, 22, 22, 22, 22, 22,
+ 22, 22, 22, 22, 22, 22, 22, 22, 22, 22,
+ 22, 22, 22, 22, 22, 22, 22, 22, 22, 22,
+ 22, 22, 22, 22, 22, 22, 22, 22, 22, 22,
+ 22, 22, 22, 22, 22, 22, 22, 22, 22, 22,
+ 22, 22, 22, 22, 22, 22, 22, 22, 22, 22,
+ 22, 22, 22, 22, 22, 22, 22, 22, 22, 22,
+ 22, 22, 22, 22, 22, 22, 22, 22, 22, 22,
+ 22, 22, 22, 22, 22, 22, 22, 22, 22, 22,
+ 22, 22, 22, 22, 22, 0, 22, 0, 22, 22,
+ 0, 0, 0, 22, 0, 22, 22, 22, 22, 22,
+ 22, 22, 22, 22, 22, 22, 5, 22, 22, 22,
+ 22, 0, 22, 22, 22, 22, 22, 22,
+#endif /* ACE_MVS */
+ };
+ return len + asso_values[(int) str[len - 1]] + asso_values[(int) str[0]];
+}
+
+const TAO_operation_db_entry *
+TAO_CORBA_ArrayDef_Perfect_Hash_OpTable::lookup (const char *str, unsigned int len)
+{
+ enum
+ {
+ TOTAL_KEYWORDS = 13,
+ MIN_WORD_LENGTH = 5,
+ MAX_WORD_LENGTH = 21,
+ MIN_HASH_VALUE = 5,
+ MAX_HASH_VALUE = 21,
+ HASH_VALUE_RANGE = 17,
+ DUPLICATES = 3,
+ WORDLIST_SIZE = 18
+ };
+
+ static const TAO_operation_db_entry wordlist[] =
+ {
+ {"",0,0},{"",0,0},{"",0,0},{"",0,0},{"",0,0},
+ {"_is_a", &POA_CORBA::ArrayDef::_is_a_skel, 0},
+ {"destroy", &POA_CORBA::ArrayDef::destroy_skel, 0},
+ {"_get_type", &POA_CORBA::ArrayDef::_get_type_skel, 0},
+ {"_interface", &POA_CORBA::ArrayDef::_interface_skel, 0},
+ {"_get_length", &POA_CORBA::ArrayDef::_get_length_skel, 0},
+ {"_set_length", &POA_CORBA::ArrayDef::_set_length_skel, 0},
+ {"_get_def_kind", &POA_CORBA::ArrayDef::_get_def_kind_skel, 0},
+ {"_repository_id", &POA_CORBA::ArrayDef::_repository_id_skel, 0},
+ {"_component", &POA_CORBA::ArrayDef::_component_skel, 0},
+ {"_get_element_type", &POA_CORBA::ArrayDef::_get_element_type_skel, 0},
+ {"_non_existent", &POA_CORBA::ArrayDef::_non_existent_skel, 0},
+ {"_get_element_type_def", &POA_CORBA::ArrayDef::_get_element_type_def_skel, 0},
+ {"_set_element_type_def", &POA_CORBA::ArrayDef::_set_element_type_def_skel, 0},
+ };
+
+ static const signed char lookup[] =
+ {
+ -1, -1, -1, -9, -2, 5, -1, 6, -1, 7, 8, -29, -1, 11,
+ 12, 13, -1, 14, 15, -16, -2, -23,
+ };
+
+ if (len <= MAX_WORD_LENGTH && len >= MIN_WORD_LENGTH)
+ {
+ unsigned int key = hash (str, len);
+
+ if (key <= MAX_HASH_VALUE && key >= MIN_HASH_VALUE)
+ {
+ int slot = lookup[key];
+
+ if (slot >= 0 && slot < WORDLIST_SIZE)
+ {
+ const char *s = wordlist[slot].opname;
+
+ if (*str == *s && !strncmp (str + 1, s + 1, len - 1))
+ return &wordlist[slot];
+ }
+ else if (slot < 0 && slot >= -MAX_HASH_VALUE)
+ return 0;
+ else
+ {
+ unsigned int offset = key + slot + (slot > 0 ? -MAX_HASH_VALUE : MAX_HASH_VALUE);
+ const TAO_operation_db_entry *base = &wordlist[-lookup[offset]];
+ const TAO_operation_db_entry *ptr = base + -lookup[offset + 1];
+
+ while (--ptr >= base)
+ if (*str == *ptr->opname && !strncmp (str + 1, ptr->opname + 1, len - 1))
+ return ptr;
+ }
+ }
+ }
+ return 0;
+}
+
+static TAO_CORBA_ArrayDef_Perfect_Hash_OpTable tao_CORBA_ArrayDef_optable;
+
+// TAO_IDL - Generated from
+// be\be_visitor_interface/interface_ss.cpp:966
+
+TAO::Collocation_Proxy_Broker *
+CORBA__TAO_ArrayDef_Proxy_Broker_Factory_function ( ::CORBA::Object_ptr)
+{
+ return reinterpret_cast<TAO::Collocation_Proxy_Broker *> (0xdead); // Dummy
+}
+
+int
+CORBA__TAO_ArrayDef_Proxy_Broker_Factory_Initializer (size_t)
+{
+ CORBA__TAO_ArrayDef_Proxy_Broker_Factory_function_pointer =
+ CORBA__TAO_ArrayDef_Proxy_Broker_Factory_function;
+
+ return 0;
+}
+
+static int
+CORBA__TAO_ArrayDef_Proxy_Broker_Stub_Factory_Initializer_Scarecrow =
+ CORBA__TAO_ArrayDef_Proxy_Broker_Factory_Initializer (
+ reinterpret_cast<size_t> (CORBA__TAO_ArrayDef_Proxy_Broker_Factory_Initializer)
+ );
+
+// TAO_IDL - Generated from
+// be\be_visitor_interface/interface_ss.cpp:103
+
+POA_CORBA::ArrayDef::ArrayDef (void)
+ : TAO_ServantBase ()
+{
+ this->optable_ = &tao_CORBA_ArrayDef_optable;
+}
+
+POA_CORBA::ArrayDef::ArrayDef (const ArrayDef& rhs)
+ : TAO_Abstract_ServantBase (rhs),
+ TAO_ServantBase (rhs),
+ POA_CORBA::IRObject (rhs),
+ POA_CORBA::IDLType (rhs)
+{
+}
+
+POA_CORBA::ArrayDef::~ArrayDef (void)
+{
+}namespace POA_CORBA
+{
+
+
+ // TAO_IDL - Generated from
+ // be\be_visitor_operation/upcall_command_ss.cpp:127
+
+ class _get_length_ArrayDef
+ : public TAO::Upcall_Command
+ {
+ public:
+ inline _get_length_ArrayDef (
+ POA_CORBA::ArrayDef * servant,
+ TAO_Operation_Details const * operation_details,
+ TAO::Argument * const args[])
+ : servant_ (servant)
+ , operation_details_ (operation_details)
+ , args_ (args)
+ {
+ }
+
+ virtual void execute (ACE_ENV_SINGLE_ARG_DECL)
+ {
+ TAO::SArg_Traits< ::CORBA::ULong>::ret_arg_type retval =
+ TAO::Portable_Server::get_ret_arg< ::CORBA::ULong> (
+ this->operation_details_,
+ this->args_);
+
+ retval =
+ this->servant_->length (
+ ACE_ENV_SINGLE_ARG_PARAMETER);
+ ACE_CHECK;
+ }
+
+ private:
+ POA_CORBA::ArrayDef * const servant_;
+ TAO_Operation_Details const * const operation_details_;
+ TAO::Argument * const * const args_;
+ };
+}
+
+
+// TAO_IDL - Generated from
+// be\be_visitor_operation/operation_ss.cpp:190
+
+void POA_CORBA::ArrayDef::_get_length_skel (
+ TAO_ServerRequest & server_request,
+ void * TAO_INTERCEPTOR (servant_upcall),
+ void * servant
+ ACE_ENV_ARG_DECL
+ )
+{
+#if TAO_HAS_INTERCEPTORS == 1
+ static ::CORBA::TypeCode_ptr const * const exceptions = 0;
+ static ::CORBA::ULong const nexceptions = 0;
+#endif /* TAO_HAS_INTERCEPTORS */
+
+ TAO::SArg_Traits< ::CORBA::ULong>::ret_val retval;
+
+ TAO::Argument * const args[] =
+ {
+ &retval
+ };
+
+ static size_t const nargs = 1;
+
+ POA_CORBA::ArrayDef * const impl =
+ static_cast<POA_CORBA::ArrayDef *> (servant);
+
+ _get_length_ArrayDef command (
+ impl,
+ server_request.operation_details (),
+ args);
+
+ TAO::Upcall_Wrapper upcall_wrapper;
+ upcall_wrapper.upcall (server_request
+ , args
+ , nargs
+ , command
+#if TAO_HAS_INTERCEPTORS == 1
+ , servant_upcall
+ , exceptions
+ , nexceptions
+#endif /* TAO_HAS_INTERCEPTORS == 1 */
+ ACE_ENV_ARG_PARAMETER);
+ ACE_CHECK;
+}namespace POA_CORBA
+{
+
+
+ // TAO_IDL - Generated from
+ // be\be_visitor_operation/upcall_command_ss.cpp:127
+
+ class _set_length_ArrayDef
+ : public TAO::Upcall_Command
+ {
+ public:
+ inline _set_length_ArrayDef (
+ POA_CORBA::ArrayDef * servant,
+ TAO_Operation_Details const * operation_details,
+ TAO::Argument * const args[])
+ : servant_ (servant)
+ , operation_details_ (operation_details)
+ , args_ (args)
+ {
+ }
+
+ virtual void execute (ACE_ENV_SINGLE_ARG_DECL)
+ {
+ TAO::SArg_Traits< ::CORBA::ULong>::in_arg_type arg_1 =
+ TAO::Portable_Server::get_in_arg< ::CORBA::ULong> (
+ this->operation_details_,
+ this->args_,
+ 1);
+
+ this->servant_->length (
+ arg_1
+ ACE_ENV_ARG_PARAMETER);
+ ACE_CHECK;
+ }
+
+ private:
+ POA_CORBA::ArrayDef * const servant_;
+ TAO_Operation_Details const * const operation_details_;
+ TAO::Argument * const * const args_;
+ };
+}
+
+
+// TAO_IDL - Generated from
+// be\be_visitor_operation/operation_ss.cpp:190
+
+void POA_CORBA::ArrayDef::_set_length_skel (
+ TAO_ServerRequest & server_request,
+ void * TAO_INTERCEPTOR (servant_upcall),
+ void * servant
+ ACE_ENV_ARG_DECL
+ )
+{
+#if TAO_HAS_INTERCEPTORS == 1
+ static ::CORBA::TypeCode_ptr const * const exceptions = 0;
+ static ::CORBA::ULong const nexceptions = 0;
+#endif /* TAO_HAS_INTERCEPTORS */
+
+ TAO::SArg_Traits< void>::ret_val retval;
+ TAO::SArg_Traits< ::CORBA::ULong>::in_arg_val _tao_length;
+
+ TAO::Argument * const args[] =
+ {
+ &retval,
+ &_tao_length
+ };
+
+ static size_t const nargs = 2;
+
+ POA_CORBA::ArrayDef * const impl =
+ static_cast<POA_CORBA::ArrayDef *> (servant);
+
+ _set_length_ArrayDef command (
+ impl,
+ server_request.operation_details (),
+ args);
+
+ TAO::Upcall_Wrapper upcall_wrapper;
+ upcall_wrapper.upcall (server_request
+ , args
+ , nargs
+ , command
+#if TAO_HAS_INTERCEPTORS == 1
+ , servant_upcall
+ , exceptions
+ , nexceptions
+#endif /* TAO_HAS_INTERCEPTORS == 1 */
+ ACE_ENV_ARG_PARAMETER);
+ ACE_CHECK;
+}namespace POA_CORBA
+{
+
+
+ // TAO_IDL - Generated from
+ // be\be_visitor_operation/upcall_command_ss.cpp:127
+
+ class _get_element_type_ArrayDef
+ : public TAO::Upcall_Command
+ {
+ public:
+ inline _get_element_type_ArrayDef (
+ POA_CORBA::ArrayDef * servant,
+ TAO_Operation_Details const * operation_details,
+ TAO::Argument * const args[])
+ : servant_ (servant)
+ , operation_details_ (operation_details)
+ , args_ (args)
+ {
+ }
+
+ virtual void execute (ACE_ENV_SINGLE_ARG_DECL)
+ {
+ TAO::SArg_Traits< ::CORBA::TypeCode>::ret_arg_type retval =
+ TAO::Portable_Server::get_ret_arg< ::CORBA::TypeCode> (
+ this->operation_details_,
+ this->args_);
+
+ retval =
+ this->servant_->element_type (
+ ACE_ENV_SINGLE_ARG_PARAMETER);
+ ACE_CHECK;
+ }
+
+ private:
+ POA_CORBA::ArrayDef * const servant_;
+ TAO_Operation_Details const * const operation_details_;
+ TAO::Argument * const * const args_;
+ };
+}
+
+
+// TAO_IDL - Generated from
+// be\be_visitor_operation/operation_ss.cpp:190
+
+void POA_CORBA::ArrayDef::_get_element_type_skel (
+ TAO_ServerRequest & server_request,
+ void * TAO_INTERCEPTOR (servant_upcall),
+ void * servant
+ ACE_ENV_ARG_DECL
+ )
+{
+#if TAO_HAS_INTERCEPTORS == 1
+ static ::CORBA::TypeCode_ptr const * const exceptions = 0;
+ static ::CORBA::ULong const nexceptions = 0;
+#endif /* TAO_HAS_INTERCEPTORS */
+
+ TAO::SArg_Traits< ::CORBA::TypeCode>::ret_val retval;
+
+ TAO::Argument * const args[] =
+ {
+ &retval
+ };
+
+ static size_t const nargs = 1;
+
+ POA_CORBA::ArrayDef * const impl =
+ static_cast<POA_CORBA::ArrayDef *> (servant);
+
+ _get_element_type_ArrayDef command (
+ impl,
+ server_request.operation_details (),
+ args);
+
+ TAO::Upcall_Wrapper upcall_wrapper;
+ upcall_wrapper.upcall (server_request
+ , args
+ , nargs
+ , command
+#if TAO_HAS_INTERCEPTORS == 1
+ , servant_upcall
+ , exceptions
+ , nexceptions
+#endif /* TAO_HAS_INTERCEPTORS == 1 */
+ ACE_ENV_ARG_PARAMETER);
+ ACE_CHECK;
+}namespace POA_CORBA
+{
+
+
+ // TAO_IDL - Generated from
+ // be\be_visitor_operation/upcall_command_ss.cpp:127
+
+ class _get_element_type_def_ArrayDef
+ : public TAO::Upcall_Command
+ {
+ public:
+ inline _get_element_type_def_ArrayDef (
+ POA_CORBA::ArrayDef * servant,
+ TAO_Operation_Details const * operation_details,
+ TAO::Argument * const args[])
+ : servant_ (servant)
+ , operation_details_ (operation_details)
+ , args_ (args)
+ {
+ }
+
+ virtual void execute (ACE_ENV_SINGLE_ARG_DECL)
+ {
+ TAO::SArg_Traits< ::CORBA::IDLType>::ret_arg_type retval =
+ TAO::Portable_Server::get_ret_arg< ::CORBA::IDLType> (
+ this->operation_details_,
+ this->args_);
+
+ retval =
+ this->servant_->element_type_def (
+ ACE_ENV_SINGLE_ARG_PARAMETER);
+ ACE_CHECK;
+ }
+
+ private:
+ POA_CORBA::ArrayDef * const servant_;
+ TAO_Operation_Details const * const operation_details_;
+ TAO::Argument * const * const args_;
+ };
+}
+
+
+// TAO_IDL - Generated from
+// be\be_visitor_operation/operation_ss.cpp:190
+
+void POA_CORBA::ArrayDef::_get_element_type_def_skel (
+ TAO_ServerRequest & server_request,
+ void * TAO_INTERCEPTOR (servant_upcall),
+ void * servant
+ ACE_ENV_ARG_DECL
+ )
+{
+#if TAO_HAS_INTERCEPTORS == 1
+ static ::CORBA::TypeCode_ptr const * const exceptions = 0;
+ static ::CORBA::ULong const nexceptions = 0;
+#endif /* TAO_HAS_INTERCEPTORS */
+
+ TAO::SArg_Traits< ::CORBA::IDLType>::ret_val retval;
+
+ TAO::Argument * const args[] =
+ {
+ &retval
+ };
+
+ static size_t const nargs = 1;
+
+ POA_CORBA::ArrayDef * const impl =
+ static_cast<POA_CORBA::ArrayDef *> (servant);
+
+ _get_element_type_def_ArrayDef command (
+ impl,
+ server_request.operation_details (),
+ args);
+
+ TAO::Upcall_Wrapper upcall_wrapper;
+ upcall_wrapper.upcall (server_request
+ , args
+ , nargs
+ , command
+#if TAO_HAS_INTERCEPTORS == 1
+ , servant_upcall
+ , exceptions
+ , nexceptions
+#endif /* TAO_HAS_INTERCEPTORS == 1 */
+ ACE_ENV_ARG_PARAMETER);
+ ACE_CHECK;
+}namespace POA_CORBA
+{
+
+
+ // TAO_IDL - Generated from
+ // be\be_visitor_operation/upcall_command_ss.cpp:127
+
+ class _set_element_type_def_ArrayDef
+ : public TAO::Upcall_Command
+ {
+ public:
+ inline _set_element_type_def_ArrayDef (
+ POA_CORBA::ArrayDef * servant,
+ TAO_Operation_Details const * operation_details,
+ TAO::Argument * const args[])
+ : servant_ (servant)
+ , operation_details_ (operation_details)
+ , args_ (args)
+ {
+ }
+
+ virtual void execute (ACE_ENV_SINGLE_ARG_DECL)
+ {
+ TAO::SArg_Traits< ::CORBA::IDLType>::in_arg_type arg_1 =
+ TAO::Portable_Server::get_in_arg< ::CORBA::IDLType> (
+ this->operation_details_,
+ this->args_,
+ 1);
+
+ this->servant_->element_type_def (
+ arg_1
+ ACE_ENV_ARG_PARAMETER);
+ ACE_CHECK;
+ }
+
+ private:
+ POA_CORBA::ArrayDef * const servant_;
+ TAO_Operation_Details const * const operation_details_;
+ TAO::Argument * const * const args_;
+ };
+}
+
+
+// TAO_IDL - Generated from
+// be\be_visitor_operation/operation_ss.cpp:190
+
+void POA_CORBA::ArrayDef::_set_element_type_def_skel (
+ TAO_ServerRequest & server_request,
+ void * TAO_INTERCEPTOR (servant_upcall),
+ void * servant
+ ACE_ENV_ARG_DECL
+ )
+{
+#if TAO_HAS_INTERCEPTORS == 1
+ static ::CORBA::TypeCode_ptr const * const exceptions = 0;
+ static ::CORBA::ULong const nexceptions = 0;
+#endif /* TAO_HAS_INTERCEPTORS */
+
+ TAO::SArg_Traits< void>::ret_val retval;
+ TAO::SArg_Traits< ::CORBA::IDLType>::in_arg_val _tao_element_type_def;
+
+ TAO::Argument * const args[] =
+ {
+ &retval,
+ &_tao_element_type_def
+ };
+
+ static size_t const nargs = 2;
+
+ POA_CORBA::ArrayDef * const impl =
+ static_cast<POA_CORBA::ArrayDef *> (servant);
+
+ _set_element_type_def_ArrayDef command (
+ impl,
+ server_request.operation_details (),
+ args);
+
+ TAO::Upcall_Wrapper upcall_wrapper;
+ upcall_wrapper.upcall (server_request
+ , args
+ , nargs
+ , command
+#if TAO_HAS_INTERCEPTORS == 1
+ , servant_upcall
+ , exceptions
+ , nexceptions
+#endif /* TAO_HAS_INTERCEPTORS == 1 */
+ ACE_ENV_ARG_PARAMETER);
+ ACE_CHECK;
+}
+
+// TAO_IDL - Generated from
+// be\be_visitor_interface/interface_ss.cpp:169
+
+namespace POA_CORBA
+{
+
+
+ // TAO_IDL - Generated from
+ // be\be_visitor_operation/upcall_command_ss.cpp:127
+
+ class _is_a_ArrayDef_Upcall_Command
+ : public TAO::Upcall_Command
+ {
+ public:
+ inline _is_a_ArrayDef_Upcall_Command (
+ POA_CORBA::ArrayDef * servant,
+ TAO_Operation_Details const * operation_details,
+ TAO::Argument * const args[])
+ : servant_ (servant)
+ , operation_details_ (operation_details)
+ , args_ (args)
+ {
+ }
+
+ virtual void execute (ACE_ENV_SINGLE_ARG_DECL)
+ {
+ TAO::SArg_Traits< ::ACE_InputCDR::to_boolean>::ret_arg_type retval =
+ TAO::Portable_Server::get_ret_arg< ::ACE_InputCDR::to_boolean> (
+ this->operation_details_,
+ this->args_);
+
+ TAO::SArg_Traits< ::CORBA::Char *>::in_arg_type arg_1 =
+ TAO::Portable_Server::get_in_arg< ::CORBA::Char *> (
+ this->operation_details_,
+ this->args_,
+ 1);
+
+ retval =
+ this->servant_-> _is_a (
+ arg_1
+ ACE_ENV_ARG_PARAMETER);
+ ACE_CHECK;
+ }
+
+ private:
+ POA_CORBA::ArrayDef * const servant_;
+ TAO_Operation_Details const * const operation_details_;
+ TAO::Argument * const * const args_;
+ };
+}
+
+
+void POA_CORBA::ArrayDef::_is_a_skel (
+ TAO_ServerRequest & server_request,
+ void * TAO_INTERCEPTOR (servant_upcall),
+ void * servant
+ ACE_ENV_ARG_DECL
+ )
+{
+#if TAO_HAS_INTERCEPTORS == 1
+ static ::CORBA::TypeCode_ptr const * const exceptions = 0;
+ static ::CORBA::ULong const nexceptions = 0;
+#endif /* TAO_HAS_INTERCEPTORS */
+
+ TAO::SArg_Traits< ::ACE_InputCDR::to_boolean>::ret_val retval;
+ TAO::SArg_Traits< ::CORBA::Char *>::in_arg_val _tao_repository_id;
+
+ TAO::Argument * const args[] =
+ {
+ &retval,
+ &_tao_repository_id
+ };
+
+ static size_t const nargs = 2;
+
+ POA_CORBA::ArrayDef * const impl =
+ static_cast<POA_CORBA::ArrayDef *> (servant);
+
+ _is_a_ArrayDef_Upcall_Command command (
+ impl,
+ server_request.operation_details (),
+ args);
+
+ TAO::Upcall_Wrapper upcall_wrapper;
+ upcall_wrapper.upcall (server_request
+ , args
+ , nargs
+ , command
+#if TAO_HAS_INTERCEPTORS == 1
+ , servant_upcall
+ , exceptions
+ , nexceptions
+#endif /* TAO_HAS_INTERCEPTORS == 1 */
+ ACE_ENV_ARG_PARAMETER);
+ ACE_CHECK;
+}namespace POA_CORBA
+{
+
+
+ // TAO_IDL - Generated from
+ // be\be_visitor_operation/upcall_command_ss.cpp:127
+
+ class _non_existent_ArrayDef_Upcall_Command
+ : public TAO::Upcall_Command
+ {
+ public:
+ inline _non_existent_ArrayDef_Upcall_Command (
+ POA_CORBA::ArrayDef * servant,
+ TAO_Operation_Details const * operation_details,
+ TAO::Argument * const args[])
+ : servant_ (servant)
+ , operation_details_ (operation_details)
+ , args_ (args)
+ {
+ }
+
+ virtual void execute (ACE_ENV_SINGLE_ARG_DECL)
+ {
+ TAO::SArg_Traits< ::ACE_InputCDR::to_boolean>::ret_arg_type retval =
+ TAO::Portable_Server::get_ret_arg< ::ACE_InputCDR::to_boolean> (
+ this->operation_details_,
+ this->args_);
+
+ retval =
+ this->servant_-> _non_existent (
+ ACE_ENV_SINGLE_ARG_PARAMETER);
+ ACE_CHECK;
+ }
+
+ private:
+ POA_CORBA::ArrayDef * const servant_;
+ TAO_Operation_Details const * const operation_details_;
+ TAO::Argument * const * const args_;
+ };
+}
+
+
+void POA_CORBA::ArrayDef::_non_existent_skel (
+ TAO_ServerRequest & server_request,
+ void * TAO_INTERCEPTOR (servant_upcall),
+ void * servant
+ ACE_ENV_ARG_DECL
+ )
+{
+#if TAO_HAS_INTERCEPTORS == 1
+ static ::CORBA::TypeCode_ptr const * const exceptions = 0;
+ static ::CORBA::ULong const nexceptions = 0;
+#endif /* TAO_HAS_INTERCEPTORS */
+
+ TAO::SArg_Traits< ::ACE_InputCDR::to_boolean>::ret_val retval;
+
+ TAO::Argument * const args[] =
+ {
+ &retval
+ };
+
+ static size_t const nargs = 1;
+
+ POA_CORBA::ArrayDef * const impl =
+ static_cast<POA_CORBA::ArrayDef *> (servant);
+
+ _non_existent_ArrayDef_Upcall_Command command (
+ impl,
+ server_request.operation_details (),
+ args);
+
+ TAO::Upcall_Wrapper upcall_wrapper;
+ upcall_wrapper.upcall (server_request
+ , args
+ , nargs
+ , command
+#if TAO_HAS_INTERCEPTORS == 1
+ , servant_upcall
+ , exceptions
+ , nexceptions
+#endif /* TAO_HAS_INTERCEPTORS == 1 */
+ ACE_ENV_ARG_PARAMETER);
+ ACE_CHECK;
+}namespace POA_CORBA
+{
+
+
+ // TAO_IDL - Generated from
+ // be\be_visitor_operation/upcall_command_ss.cpp:127
+
+ class _repository_id_ArrayDef_Upcall_Command
+ : public TAO::Upcall_Command
+ {
+ public:
+ inline _repository_id_ArrayDef_Upcall_Command (
+ POA_CORBA::ArrayDef * servant,
+ TAO_Operation_Details const * operation_details,
+ TAO::Argument * const args[])
+ : servant_ (servant)
+ , operation_details_ (operation_details)
+ , args_ (args)
+ {
+ }
+
+ virtual void execute (ACE_ENV_SINGLE_ARG_DECL)
+ {
+ TAO::SArg_Traits< ::CORBA::Char *>::ret_arg_type retval =
+ TAO::Portable_Server::get_ret_arg< ::CORBA::Char *> (
+ this->operation_details_,
+ this->args_);
+
+ retval =
+ this->servant_-> _repository_id (
+ ACE_ENV_SINGLE_ARG_PARAMETER);
+ ACE_CHECK;
+ }
+
+ private:
+ POA_CORBA::ArrayDef * const servant_;
+ TAO_Operation_Details const * const operation_details_;
+ TAO::Argument * const * const args_;
+ };
+}
+
+
+void POA_CORBA::ArrayDef::_repository_id_skel (
+ TAO_ServerRequest & server_request,
+ void * TAO_INTERCEPTOR (servant_upcall),
+ void * servant
+ ACE_ENV_ARG_DECL
+ )
+{
+#if TAO_HAS_INTERCEPTORS == 1
+ static ::CORBA::TypeCode_ptr const * const exceptions = 0;
+ static ::CORBA::ULong const nexceptions = 0;
+#endif /* TAO_HAS_INTERCEPTORS */
+
+ TAO::SArg_Traits< ::CORBA::Char *>::ret_val retval;
+
+ TAO::Argument * const args[] =
+ {
+ &retval
+ };
+
+ static size_t const nargs = 1;
+
+ POA_CORBA::ArrayDef * const impl =
+ static_cast<POA_CORBA::ArrayDef *> (servant);
+
+ _repository_id_ArrayDef_Upcall_Command command (
+ impl,
+ server_request.operation_details (),
+ args);
+
+ TAO::Upcall_Wrapper upcall_wrapper;
+ upcall_wrapper.upcall (server_request
+ , args
+ , nargs
+ , command
+#if TAO_HAS_INTERCEPTORS == 1
+ , servant_upcall
+ , exceptions
+ , nexceptions
+#endif /* TAO_HAS_INTERCEPTORS == 1 */
+ ACE_ENV_ARG_PARAMETER);
+ ACE_CHECK;
+}
+
+// TAO_IDL - Generated from
+// be\be_visitor_interface/interface_ss.cpp:513
+
+void POA_CORBA::ArrayDef::_interface_skel (
+ TAO_ServerRequest & server_request,
+ void * /* servant_upcall */,
+ void * servant
+ ACE_ENV_ARG_DECL
+ )
+{
+ TAO_IFR_Client_Adapter *_tao_adapter =
+ ACE_Dynamic_Service<TAO_IFR_Client_Adapter>::instance (
+ TAO_ORB_Core::ifr_client_adapter_name ()
+ );
+
+ if (_tao_adapter == 0)
+ {
+ ACE_THROW ( ::CORBA::INTF_REPOS ( ::CORBA::OMGVMCID | 1,
+ ::CORBA::COMPLETED_NO));
+ }
+
+ POA_CORBA::ArrayDef * const impl =
+ static_cast<POA_CORBA::ArrayDef *> (servant);
+ ::CORBA::InterfaceDef_ptr _tao_retval =
+ impl->_get_interface (ACE_ENV_SINGLE_ARG_PARAMETER);
+ ACE_CHECK;
+
+ server_request.init_reply ();
+ TAO_OutputCDR &_tao_out = *server_request.outgoing ();
+
+ ::CORBA::Boolean const _tao_result =
+ _tao_adapter->interfacedef_cdr_insert (
+ _tao_out,
+ _tao_retval
+ );
+
+ _tao_adapter->dispose (_tao_retval);
+
+ if (_tao_result == false)
+ {
+ ACE_THROW ( ::CORBA::MARSHAL ());
+ }
+}namespace POA_CORBA
+{
+
+
+ // TAO_IDL - Generated from
+ // be\be_visitor_operation/upcall_command_ss.cpp:127
+
+ class _get_component_ArrayDef_Upcall_Command
+ : public TAO::Upcall_Command
+ {
+ public:
+ inline _get_component_ArrayDef_Upcall_Command (
+ POA_CORBA::ArrayDef * servant,
+ TAO_Operation_Details const * operation_details,
+ TAO::Argument * const args[])
+ : servant_ (servant)
+ , operation_details_ (operation_details)
+ , args_ (args)
+ {
+ }
+
+ virtual void execute (ACE_ENV_SINGLE_ARG_DECL)
+ {
+ TAO::SArg_Traits< ::CORBA::Object>::ret_arg_type retval =
+ TAO::Portable_Server::get_ret_arg< ::CORBA::Object> (
+ this->operation_details_,
+ this->args_);
+
+ retval =
+ this->servant_-> _get_component (
+ ACE_ENV_SINGLE_ARG_PARAMETER);
+ ACE_CHECK;
+ }
+
+ private:
+ POA_CORBA::ArrayDef * const servant_;
+ TAO_Operation_Details const * const operation_details_;
+ TAO::Argument * const * const args_;
+ };
+}
+
+
+void POA_CORBA::ArrayDef::_component_skel (
+ TAO_ServerRequest & server_request,
+ void * TAO_INTERCEPTOR (servant_upcall),
+ void * servant
+ ACE_ENV_ARG_DECL
+ )
+{
+#if TAO_HAS_INTERCEPTORS == 1
+ static ::CORBA::TypeCode_ptr const * const exceptions = 0;
+ static ::CORBA::ULong const nexceptions = 0;
+#endif /* TAO_HAS_INTERCEPTORS */
+
+ TAO::SArg_Traits< ::CORBA::Object>::ret_val retval;
+
+ TAO::Argument * const args[] =
+ {
+ &retval
+ };
+
+ static size_t const nargs = 1;
+
+ POA_CORBA::ArrayDef * const impl =
+ static_cast<POA_CORBA::ArrayDef *> (servant);
+
+ _get_component_ArrayDef_Upcall_Command command (
+ impl,
+ server_request.operation_details (),
+ args);
+
+ TAO::Upcall_Wrapper upcall_wrapper;
+ upcall_wrapper.upcall (server_request
+ , args
+ , nargs
+ , command
+#if TAO_HAS_INTERCEPTORS == 1
+ , servant_upcall
+ , exceptions
+ , nexceptions
+#endif /* TAO_HAS_INTERCEPTORS == 1 */
+ ACE_ENV_ARG_PARAMETER);
+ ACE_CHECK;
+}
+
+::CORBA::Boolean POA_CORBA::ArrayDef::_is_a (
+ const char* value
+ ACE_ENV_ARG_DECL_NOT_USED
+ )
+{
+ return
+ (
+ !ACE_OS::strcmp (
+ value,
+ "IDL:omg.org/CORBA/IRObject:1.0"
+ ) ||
+ !ACE_OS::strcmp (
+ value,
+ "IDL:omg.org/CORBA/IDLType:1.0"
+ ) ||
+ !ACE_OS::strcmp (
+ value,
+ "IDL:omg.org/CORBA/ArrayDef:1.0"
+ ) ||
+ !ACE_OS::strcmp (
+ value,
+ "IDL:omg.org/CORBA/Object:1.0"
+ )
+ );
+}
+
+const char* POA_CORBA::ArrayDef::_interface_repository_id (void) const
+{
+ return "IDL:omg.org/CORBA/ArrayDef:1.0";
+}
+
+// TAO_IDL - Generated from
+// be\be_visitor_interface/interface_ss.cpp:903
+
+void POA_CORBA::ArrayDef::_dispatch (
+ TAO_ServerRequest & req,
+ void * servant_upcall
+ ACE_ENV_ARG_DECL
+ )
+{
+ this->synchronous_upcall_dispatch (req,
+ servant_upcall,
+ this
+ ACE_ENV_ARG_PARAMETER);
+}
+
+// TAO_IDL - Generated from
+// be\be_visitor_interface/interface_ss.cpp:851
+
+CORBA::ArrayDef *
+POA_CORBA::ArrayDef::_this (ACE_ENV_SINGLE_ARG_DECL)
+{
+ TAO_Stub *stub = this->_create_stub (ACE_ENV_SINGLE_ARG_PARAMETER);
+ ACE_CHECK_RETURN (0);
+
+ TAO_Stub_Auto_Ptr safe_stub (stub);
+ ::CORBA::Object_ptr tmp = CORBA::Object::_nil ();
+
+ ::CORBA::Boolean const _tao_opt_colloc =
+ stub->servant_orb_var ()->orb_core ()->optimize_collocation_objects ();
+
+ ACE_NEW_RETURN (
+ tmp,
+ ::CORBA::Object (stub, _tao_opt_colloc, this),
+ 0
+ );
+
+ ::CORBA::Object_var obj = tmp;
+ (void) safe_stub.release ();
+
+ typedef ::CORBA::ArrayDef STUB_SCOPED_NAME;
+ return
+ TAO::Narrow_Utils<STUB_SCOPED_NAME>::unchecked_narrow (
+ obj.in (),
+ CORBA__TAO_ArrayDef_Proxy_Broker_Factory_function_pointer
+ );
+}
+
+// TAO_IDL - Generated from
+// be\be_interface.cpp:1499
+
+class TAO_CORBA_ExceptionDef_Perfect_Hash_OpTable
+ : public TAO_Perfect_Hash_OpTable
+{
+private:
+ unsigned int hash (const char *str, unsigned int len);
+
+public:
+ const TAO_operation_db_entry * lookup (const char *str, unsigned int len);
+};
+
+/* C++ code produced by gperf version 2.8 (ACE version) */
+/* Command-line: C:\ACE\latest\ACE_wrappers\bin\gperf.exe -m -M -J -c -C -D -E -T -f 0 -F 0,0 -a -o -t -p -K opname -L C++ -Z TAO_CORBA_ExceptionDef_Perfect_Hash_OpTable -N lookup */
+unsigned int
+TAO_CORBA_ExceptionDef_Perfect_Hash_OpTable::hash (const char *str, unsigned int len)
+{
+ static const unsigned char asso_values[] =
+ {
+#if defined (ACE_MVS)
+ 61, 61, 61, 61, 61, 61, 61, 61, 61, 61,
+ 61, 61, 61, 61, 61, 61, 61, 61, 61, 61,
+ 61, 61, 61, 61, 61, 61, 61, 61, 61, 61,
+ 61, 61, 61, 61, 61, 61, 61, 61, 61, 61,
+ 61, 61, 61, 61, 61, 61, 61, 61, 61, 61,
+ 61, 61, 61, 61, 61, 61, 61, 61, 61, 61,
+ 61, 61, 61, 61, 61, 61, 61, 61, 61, 61,
+ 61, 61, 61, 61, 61, 61, 61, 61, 61, 61,
+ 61, 61, 61, 61, 61, 61, 61, 61, 61, 61,
+ 61, 61, 61, 61, 61, 61, 61, 61, 61, 61,
+ 61, 61, 61, 61, 61, 61, 61, 61, 61, 0,
+ 61, 61, 61, 61, 61, 61, 61, 61, 61, 61,
+ 61, 61, 61, 61, 61, 61, 61, 61, 61, 0,
+ 61, 25, 8, 0, 61, 61, 61, 61, 61, 61,
+ 61, 61, 61, 61, 61, 61, 61, 0, 15, 5,
+ 61, 0, 61, 61, 61, 61, 61, 61, 61, 61,
+ 61, 61, 20, 20, 61, 61, 61, 15, 10, 61,
+ 61, 61, 61, 61, 61, 61, 61, 61, 61, 61,
+ 61, 61, 61, 61, 61, 61, 61, 61, 61, 61,
+ 61, 61, 61, 61, 61, 61, 61, 61, 61, 61,
+ 61, 61, 61, 61, 61, 61, 61, 61, 61, 61,
+ 61, 61, 61, 61, 61, 61, 61, 61, 61, 61,
+ 61, 61, 61, 61, 61, 61, 61, 61, 61, 61,
+ 61, 61, 61, 61, 61, 61, 61, 61, 61, 61,
+ 61, 61, 61, 61, 61, 61, 61, 61, 61, 61,
+ 61, 61, 61, 61, 61, 61,
+#else
+ 61, 61, 61, 61, 61, 61, 61, 61, 61, 61,
+ 61, 61, 61, 61, 61, 61, 61, 61, 61, 61,
+ 61, 61, 61, 61, 61, 61, 61, 61, 61, 61,
+ 61, 61, 61, 61, 61, 61, 61, 61, 61, 61,
+ 61, 61, 61, 61, 61, 61, 61, 61, 61, 61,
+ 61, 61, 61, 61, 61, 61, 61, 61, 61, 61,
+ 61, 61, 61, 61, 61, 61, 61, 61, 61, 61,
+ 61, 61, 61, 61, 61, 61, 61, 61, 61, 61,
+ 61, 61, 61, 61, 61, 61, 61, 61, 61, 61,
+ 61, 61, 61, 61, 61, 0, 61, 0, 61, 25,
+ 8, 0, 61, 61, 61, 61, 61, 61, 0, 15,
+ 5, 61, 0, 61, 61, 20, 20, 61, 61, 61,
+ 15, 10, 61, 61, 61, 61, 61, 61,
+#endif /* ACE_MVS */
+ };
+ return len + asso_values[(int) str[len - 1]] + asso_values[(int) str[0]];
+}
+
+const TAO_operation_db_entry *
+TAO_CORBA_ExceptionDef_Perfect_Hash_OpTable::lookup (const char *str, unsigned int len)
+{
+ enum
+ {
+ TOTAL_KEYWORDS = 39,
+ MIN_WORD_LENGTH = 4,
+ MAX_WORD_LENGTH = 26,
+ MIN_HASH_VALUE = 5,
+ MAX_HASH_VALUE = 60,
+ HASH_VALUE_RANGE = 56,
+ DUPLICATES = 8,
+ WORDLIST_SIZE = 44
+ };
+
+ static const TAO_operation_db_entry wordlist[] =
+ {
+ {"",0,0},{"",0,0},{"",0,0},{"",0,0},{"",0,0},
+ {"_is_a", &POA_CORBA::ExceptionDef::_is_a_skel, 0},
+ {"lookup", &POA_CORBA::ExceptionDef::lookup_skel, 0},
+ {"_get_name", &POA_CORBA::ExceptionDef::_get_name_skel, 0},
+ {"_get_type", &POA_CORBA::ExceptionDef::_get_type_skel, 0},
+ {"_set_name", &POA_CORBA::ExceptionDef::_set_name_skel, 0},
+ {"_interface", &POA_CORBA::ExceptionDef::_interface_skel, 0},
+ {"lookup_name", &POA_CORBA::ExceptionDef::lookup_name_skel, 0},
+ {"_get_id", &POA_CORBA::ExceptionDef::_get_id_skel, 0},
+ {"_set_id", &POA_CORBA::ExceptionDef::_set_id_skel, 0},
+ {"describe", &POA_CORBA::ExceptionDef::describe_skel, 0},
+ {"_get_version", &POA_CORBA::ExceptionDef::_get_version_skel, 0},
+ {"_set_version", &POA_CORBA::ExceptionDef::_set_version_skel, 0},
+ {"_get_absolute_name", &POA_CORBA::ExceptionDef::_get_absolute_name_skel, 0},
+ {"move", &POA_CORBA::ExceptionDef::move_skel, 0},
+ {"_get_defined_in", &POA_CORBA::ExceptionDef::_get_defined_in_skel, 0},
+ {"_get_def_kind", &POA_CORBA::ExceptionDef::_get_def_kind_skel, 0},
+ {"_repository_id", &POA_CORBA::ExceptionDef::_repository_id_skel, 0},
+ {"destroy", &POA_CORBA::ExceptionDef::destroy_skel, 0},
+ {"_component", &POA_CORBA::ExceptionDef::_component_skel, 0},
+ {"_get_members", &POA_CORBA::ExceptionDef::_get_members_skel, 0},
+ {"_set_members", &POA_CORBA::ExceptionDef::_set_members_skel, 0},
+ {"_non_existent", &POA_CORBA::ExceptionDef::_non_existent_skel, 0},
+ {"_get_containing_repository", &POA_CORBA::ExceptionDef::_get_containing_repository_skel, 0},
+ {"create_value", &POA_CORBA::ExceptionDef::create_value_skel, 0},
+ {"create_module", &POA_CORBA::ExceptionDef::create_module_skel, 0},
+ {"create_native", &POA_CORBA::ExceptionDef::create_native_skel, 0},
+ {"create_interface", &POA_CORBA::ExceptionDef::create_interface_skel, 0},
+ {"create_ext_value", &POA_CORBA::ExceptionDef::create_ext_value_skel, 0},
+ {"create_union", &POA_CORBA::ExceptionDef::create_union_skel, 0},
+ {"describe_contents", &POA_CORBA::ExceptionDef::describe_contents_skel, 0},
+ {"create_exception", &POA_CORBA::ExceptionDef::create_exception_skel, 0},
+ {"create_local_interface", &POA_CORBA::ExceptionDef::create_local_interface_skel, 0},
+ {"create_abstract_interface", &POA_CORBA::ExceptionDef::create_abstract_interface_skel, 0},
+ {"create_enum", &POA_CORBA::ExceptionDef::create_enum_skel, 0},
+ {"contents", &POA_CORBA::ExceptionDef::contents_skel, 0},
+ {"create_value_box", &POA_CORBA::ExceptionDef::create_value_box_skel, 0},
+ {"create_alias", &POA_CORBA::ExceptionDef::create_alias_skel, 0},
+ {"create_struct", &POA_CORBA::ExceptionDef::create_struct_skel, 0},
+ {"create_constant", &POA_CORBA::ExceptionDef::create_constant_skel, 0},
+ };
+
+ static const signed char lookup[] =
+ {
+ -1, -1, -1, -7, -3, 5, 6, -12, -2, -66, 10, 11, -1, -15,
+ -2, -68, 14, -64, 17, 18, 19, 20, 21, -1, -1, 22, -1, -1,
+ -24, -2, 23, -1, -64, 26, -29, -2, 27, 28, -64, -31, -2, -62,
+ 33, -1, -1, 34, 35, 36, -1, -1, 37, 38, -1, 39, -1, -1,
+ 40, 41, 42, -1, 43,
+ };
+
+ if (len <= MAX_WORD_LENGTH && len >= MIN_WORD_LENGTH)
+ {
+ unsigned int key = hash (str, len);
+
+ if (key <= MAX_HASH_VALUE && key >= MIN_HASH_VALUE)
+ {
+ int slot = lookup[key];
+
+ if (slot >= 0 && slot < WORDLIST_SIZE)
+ {
+ const char *s = wordlist[slot].opname;
+
+ if (*str == *s && !strncmp (str + 1, s + 1, len - 1))
+ return &wordlist[slot];
+ }
+ else if (slot < 0 && slot >= -MAX_HASH_VALUE)
+ return 0;
+ else
+ {
+ unsigned int offset = key + slot + (slot > 0 ? -MAX_HASH_VALUE : MAX_HASH_VALUE);
+ const TAO_operation_db_entry *base = &wordlist[-lookup[offset]];
+ const TAO_operation_db_entry *ptr = base + -lookup[offset + 1];
+
+ while (--ptr >= base)
+ if (*str == *ptr->opname && !strncmp (str + 1, ptr->opname + 1, len - 1))
+ return ptr;
+ }
+ }
+ }
+ return 0;
+}
+
+static TAO_CORBA_ExceptionDef_Perfect_Hash_OpTable tao_CORBA_ExceptionDef_optable;
+
+// TAO_IDL - Generated from
+// be\be_visitor_interface/interface_ss.cpp:966
+
+TAO::Collocation_Proxy_Broker *
+CORBA__TAO_ExceptionDef_Proxy_Broker_Factory_function ( ::CORBA::Object_ptr)
+{
+ return reinterpret_cast<TAO::Collocation_Proxy_Broker *> (0xdead); // Dummy
+}
+
+int
+CORBA__TAO_ExceptionDef_Proxy_Broker_Factory_Initializer (size_t)
+{
+ CORBA__TAO_ExceptionDef_Proxy_Broker_Factory_function_pointer =
+ CORBA__TAO_ExceptionDef_Proxy_Broker_Factory_function;
+
+ return 0;
+}
+
+static int
+CORBA__TAO_ExceptionDef_Proxy_Broker_Stub_Factory_Initializer_Scarecrow =
+ CORBA__TAO_ExceptionDef_Proxy_Broker_Factory_Initializer (
+ reinterpret_cast<size_t> (CORBA__TAO_ExceptionDef_Proxy_Broker_Factory_Initializer)
+ );
+
+// TAO_IDL - Generated from
+// be\be_visitor_interface/interface_ss.cpp:103
+
+POA_CORBA::ExceptionDef::ExceptionDef (void)
+ : TAO_ServantBase ()
+{
+ this->optable_ = &tao_CORBA_ExceptionDef_optable;
+}
+
+POA_CORBA::ExceptionDef::ExceptionDef (const ExceptionDef& rhs)
+ : TAO_Abstract_ServantBase (rhs),
+ TAO_ServantBase (rhs),
+ POA_CORBA::IRObject (rhs),
+ POA_CORBA::Contained (rhs),
+ POA_CORBA::Container (rhs)
+{
+}
+
+POA_CORBA::ExceptionDef::~ExceptionDef (void)
+{
+}namespace POA_CORBA
+{
+
+
+ // TAO_IDL - Generated from
+ // be\be_visitor_operation/upcall_command_ss.cpp:127
+
+ class _get_type_ExceptionDef
+ : public TAO::Upcall_Command
+ {
+ public:
+ inline _get_type_ExceptionDef (
+ POA_CORBA::ExceptionDef * servant,
+ TAO_Operation_Details const * operation_details,
+ TAO::Argument * const args[])
+ : servant_ (servant)
+ , operation_details_ (operation_details)
+ , args_ (args)
+ {
+ }
+
+ virtual void execute (ACE_ENV_SINGLE_ARG_DECL)
+ {
+ TAO::SArg_Traits< ::CORBA::TypeCode>::ret_arg_type retval =
+ TAO::Portable_Server::get_ret_arg< ::CORBA::TypeCode> (
+ this->operation_details_,
+ this->args_);
+
+ retval =
+ this->servant_->type (
+ ACE_ENV_SINGLE_ARG_PARAMETER);
+ ACE_CHECK;
+ }
+
+ private:
+ POA_CORBA::ExceptionDef * const servant_;
+ TAO_Operation_Details const * const operation_details_;
+ TAO::Argument * const * const args_;
+ };
+}
+
+
+// TAO_IDL - Generated from
+// be\be_visitor_operation/operation_ss.cpp:190
+
+void POA_CORBA::ExceptionDef::_get_type_skel (
+ TAO_ServerRequest & server_request,
+ void * TAO_INTERCEPTOR (servant_upcall),
+ void * servant
+ ACE_ENV_ARG_DECL
+ )
+{
+#if TAO_HAS_INTERCEPTORS == 1
+ static ::CORBA::TypeCode_ptr const * const exceptions = 0;
+ static ::CORBA::ULong const nexceptions = 0;
+#endif /* TAO_HAS_INTERCEPTORS */
+
+ TAO::SArg_Traits< ::CORBA::TypeCode>::ret_val retval;
+
+ TAO::Argument * const args[] =
+ {
+ &retval
+ };
+
+ static size_t const nargs = 1;
+
+ POA_CORBA::ExceptionDef * const impl =
+ static_cast<POA_CORBA::ExceptionDef *> (servant);
+
+ _get_type_ExceptionDef command (
+ impl,
+ server_request.operation_details (),
+ args);
+
+ TAO::Upcall_Wrapper upcall_wrapper;
+ upcall_wrapper.upcall (server_request
+ , args
+ , nargs
+ , command
+#if TAO_HAS_INTERCEPTORS == 1
+ , servant_upcall
+ , exceptions
+ , nexceptions
+#endif /* TAO_HAS_INTERCEPTORS == 1 */
+ ACE_ENV_ARG_PARAMETER);
+ ACE_CHECK;
+}namespace POA_CORBA
+{
+
+
+ // TAO_IDL - Generated from
+ // be\be_visitor_operation/upcall_command_ss.cpp:127
+
+ class _get_members_ExceptionDef
+ : public TAO::Upcall_Command
+ {
+ public:
+ inline _get_members_ExceptionDef (
+ POA_CORBA::ExceptionDef * servant,
+ TAO_Operation_Details const * operation_details,
+ TAO::Argument * const args[])
+ : servant_ (servant)
+ , operation_details_ (operation_details)
+ , args_ (args)
+ {
+ }
+
+ virtual void execute (ACE_ENV_SINGLE_ARG_DECL)
+ {
+ TAO::SArg_Traits< ::CORBA::StructMemberSeq>::ret_arg_type retval =
+ TAO::Portable_Server::get_ret_arg< ::CORBA::StructMemberSeq> (
+ this->operation_details_,
+ this->args_);
+
+ retval =
+ this->servant_->members (
+ ACE_ENV_SINGLE_ARG_PARAMETER);
+ ACE_CHECK;
+ }
+
+ private:
+ POA_CORBA::ExceptionDef * const servant_;
+ TAO_Operation_Details const * const operation_details_;
+ TAO::Argument * const * const args_;
+ };
+}
+
+
+// TAO_IDL - Generated from
+// be\be_visitor_operation/operation_ss.cpp:190
+
+void POA_CORBA::ExceptionDef::_get_members_skel (
+ TAO_ServerRequest & server_request,
+ void * TAO_INTERCEPTOR (servant_upcall),
+ void * servant
+ ACE_ENV_ARG_DECL
+ )
+{
+#if TAO_HAS_INTERCEPTORS == 1
+ static ::CORBA::TypeCode_ptr const * const exceptions = 0;
+ static ::CORBA::ULong const nexceptions = 0;
+#endif /* TAO_HAS_INTERCEPTORS */
+
+ TAO::SArg_Traits< ::CORBA::StructMemberSeq>::ret_val retval;
+
+ TAO::Argument * const args[] =
+ {
+ &retval
+ };
+
+ static size_t const nargs = 1;
+
+ POA_CORBA::ExceptionDef * const impl =
+ static_cast<POA_CORBA::ExceptionDef *> (servant);
+
+ _get_members_ExceptionDef command (
+ impl,
+ server_request.operation_details (),
+ args);
+
+ TAO::Upcall_Wrapper upcall_wrapper;
+ upcall_wrapper.upcall (server_request
+ , args
+ , nargs
+ , command
+#if TAO_HAS_INTERCEPTORS == 1
+ , servant_upcall
+ , exceptions
+ , nexceptions
+#endif /* TAO_HAS_INTERCEPTORS == 1 */
+ ACE_ENV_ARG_PARAMETER);
+ ACE_CHECK;
+}namespace POA_CORBA
+{
+
+
+ // TAO_IDL - Generated from
+ // be\be_visitor_operation/upcall_command_ss.cpp:127
+
+ class _set_members_ExceptionDef
+ : public TAO::Upcall_Command
+ {
+ public:
+ inline _set_members_ExceptionDef (
+ POA_CORBA::ExceptionDef * servant,
+ TAO_Operation_Details const * operation_details,
+ TAO::Argument * const args[])
+ : servant_ (servant)
+ , operation_details_ (operation_details)
+ , args_ (args)
+ {
+ }
+
+ virtual void execute (ACE_ENV_SINGLE_ARG_DECL)
+ {
+ TAO::SArg_Traits< ::CORBA::StructMemberSeq>::in_arg_type arg_1 =
+ TAO::Portable_Server::get_in_arg< ::CORBA::StructMemberSeq> (
+ this->operation_details_,
+ this->args_,
+ 1);
+
+ this->servant_->members (
+ arg_1
+ ACE_ENV_ARG_PARAMETER);
+ ACE_CHECK;
+ }
+
+ private:
+ POA_CORBA::ExceptionDef * const servant_;
+ TAO_Operation_Details const * const operation_details_;
+ TAO::Argument * const * const args_;
+ };
+}
+
+
+// TAO_IDL - Generated from
+// be\be_visitor_operation/operation_ss.cpp:190
+
+void POA_CORBA::ExceptionDef::_set_members_skel (
+ TAO_ServerRequest & server_request,
+ void * TAO_INTERCEPTOR (servant_upcall),
+ void * servant
+ ACE_ENV_ARG_DECL
+ )
+{
+#if TAO_HAS_INTERCEPTORS == 1
+ static ::CORBA::TypeCode_ptr const * const exceptions = 0;
+ static ::CORBA::ULong const nexceptions = 0;
+#endif /* TAO_HAS_INTERCEPTORS */
+
+ TAO::SArg_Traits< void>::ret_val retval;
+ TAO::SArg_Traits< ::CORBA::StructMemberSeq>::in_arg_val _tao_members;
+
+ TAO::Argument * const args[] =
+ {
+ &retval,
+ &_tao_members
+ };
+
+ static size_t const nargs = 2;
+
+ POA_CORBA::ExceptionDef * const impl =
+ static_cast<POA_CORBA::ExceptionDef *> (servant);
+
+ _set_members_ExceptionDef command (
+ impl,
+ server_request.operation_details (),
+ args);
+
+ TAO::Upcall_Wrapper upcall_wrapper;
+ upcall_wrapper.upcall (server_request
+ , args
+ , nargs
+ , command
+#if TAO_HAS_INTERCEPTORS == 1
+ , servant_upcall
+ , exceptions
+ , nexceptions
+#endif /* TAO_HAS_INTERCEPTORS == 1 */
+ ACE_ENV_ARG_PARAMETER);
+ ACE_CHECK;
+}
+
+// TAO_IDL - Generated from
+// be\be_visitor_interface/interface_ss.cpp:169
+
+namespace POA_CORBA
+{
+
+
+ // TAO_IDL - Generated from
+ // be\be_visitor_operation/upcall_command_ss.cpp:127
+
+ class _is_a_ExceptionDef_Upcall_Command
+ : public TAO::Upcall_Command
+ {
+ public:
+ inline _is_a_ExceptionDef_Upcall_Command (
+ POA_CORBA::ExceptionDef * servant,
+ TAO_Operation_Details const * operation_details,
+ TAO::Argument * const args[])
+ : servant_ (servant)
+ , operation_details_ (operation_details)
+ , args_ (args)
+ {
+ }
+
+ virtual void execute (ACE_ENV_SINGLE_ARG_DECL)
+ {
+ TAO::SArg_Traits< ::ACE_InputCDR::to_boolean>::ret_arg_type retval =
+ TAO::Portable_Server::get_ret_arg< ::ACE_InputCDR::to_boolean> (
+ this->operation_details_,
+ this->args_);
+
+ TAO::SArg_Traits< ::CORBA::Char *>::in_arg_type arg_1 =
+ TAO::Portable_Server::get_in_arg< ::CORBA::Char *> (
+ this->operation_details_,
+ this->args_,
+ 1);
+
+ retval =
+ this->servant_-> _is_a (
+ arg_1
+ ACE_ENV_ARG_PARAMETER);
+ ACE_CHECK;
+ }
+
+ private:
+ POA_CORBA::ExceptionDef * const servant_;
+ TAO_Operation_Details const * const operation_details_;
+ TAO::Argument * const * const args_;
+ };
+}
+
+
+void POA_CORBA::ExceptionDef::_is_a_skel (
+ TAO_ServerRequest & server_request,
+ void * TAO_INTERCEPTOR (servant_upcall),
+ void * servant
+ ACE_ENV_ARG_DECL
+ )
+{
+#if TAO_HAS_INTERCEPTORS == 1
+ static ::CORBA::TypeCode_ptr const * const exceptions = 0;
+ static ::CORBA::ULong const nexceptions = 0;
+#endif /* TAO_HAS_INTERCEPTORS */
+
+ TAO::SArg_Traits< ::ACE_InputCDR::to_boolean>::ret_val retval;
+ TAO::SArg_Traits< ::CORBA::Char *>::in_arg_val _tao_repository_id;
+
+ TAO::Argument * const args[] =
+ {
+ &retval,
+ &_tao_repository_id
+ };
+
+ static size_t const nargs = 2;
+
+ POA_CORBA::ExceptionDef * const impl =
+ static_cast<POA_CORBA::ExceptionDef *> (servant);
+
+ _is_a_ExceptionDef_Upcall_Command command (
+ impl,
+ server_request.operation_details (),
+ args);
+
+ TAO::Upcall_Wrapper upcall_wrapper;
+ upcall_wrapper.upcall (server_request
+ , args
+ , nargs
+ , command
+#if TAO_HAS_INTERCEPTORS == 1
+ , servant_upcall
+ , exceptions
+ , nexceptions
+#endif /* TAO_HAS_INTERCEPTORS == 1 */
+ ACE_ENV_ARG_PARAMETER);
+ ACE_CHECK;
+}namespace POA_CORBA
+{
+
+
+ // TAO_IDL - Generated from
+ // be\be_visitor_operation/upcall_command_ss.cpp:127
+
+ class _non_existent_ExceptionDef_Upcall_Command
+ : public TAO::Upcall_Command
+ {
+ public:
+ inline _non_existent_ExceptionDef_Upcall_Command (
+ POA_CORBA::ExceptionDef * servant,
+ TAO_Operation_Details const * operation_details,
+ TAO::Argument * const args[])
+ : servant_ (servant)
+ , operation_details_ (operation_details)
+ , args_ (args)
+ {
+ }
+
+ virtual void execute (ACE_ENV_SINGLE_ARG_DECL)
+ {
+ TAO::SArg_Traits< ::ACE_InputCDR::to_boolean>::ret_arg_type retval =
+ TAO::Portable_Server::get_ret_arg< ::ACE_InputCDR::to_boolean> (
+ this->operation_details_,
+ this->args_);
+
+ retval =
+ this->servant_-> _non_existent (
+ ACE_ENV_SINGLE_ARG_PARAMETER);
+ ACE_CHECK;
+ }
+
+ private:
+ POA_CORBA::ExceptionDef * const servant_;
+ TAO_Operation_Details const * const operation_details_;
+ TAO::Argument * const * const args_;
+ };
+}
+
+
+void POA_CORBA::ExceptionDef::_non_existent_skel (
+ TAO_ServerRequest & server_request,
+ void * TAO_INTERCEPTOR (servant_upcall),
+ void * servant
+ ACE_ENV_ARG_DECL
+ )
+{
+#if TAO_HAS_INTERCEPTORS == 1
+ static ::CORBA::TypeCode_ptr const * const exceptions = 0;
+ static ::CORBA::ULong const nexceptions = 0;
+#endif /* TAO_HAS_INTERCEPTORS */
+
+ TAO::SArg_Traits< ::ACE_InputCDR::to_boolean>::ret_val retval;
+
+ TAO::Argument * const args[] =
+ {
+ &retval
+ };
+
+ static size_t const nargs = 1;
+
+ POA_CORBA::ExceptionDef * const impl =
+ static_cast<POA_CORBA::ExceptionDef *> (servant);
+
+ _non_existent_ExceptionDef_Upcall_Command command (
+ impl,
+ server_request.operation_details (),
+ args);
+
+ TAO::Upcall_Wrapper upcall_wrapper;
+ upcall_wrapper.upcall (server_request
+ , args
+ , nargs
+ , command
+#if TAO_HAS_INTERCEPTORS == 1
+ , servant_upcall
+ , exceptions
+ , nexceptions
+#endif /* TAO_HAS_INTERCEPTORS == 1 */
+ ACE_ENV_ARG_PARAMETER);
+ ACE_CHECK;
+}namespace POA_CORBA
+{
+
+
+ // TAO_IDL - Generated from
+ // be\be_visitor_operation/upcall_command_ss.cpp:127
+
+ class _repository_id_ExceptionDef_Upcall_Command
+ : public TAO::Upcall_Command
+ {
+ public:
+ inline _repository_id_ExceptionDef_Upcall_Command (
+ POA_CORBA::ExceptionDef * servant,
+ TAO_Operation_Details const * operation_details,
+ TAO::Argument * const args[])
+ : servant_ (servant)
+ , operation_details_ (operation_details)
+ , args_ (args)
+ {
+ }
+
+ virtual void execute (ACE_ENV_SINGLE_ARG_DECL)
+ {
+ TAO::SArg_Traits< ::CORBA::Char *>::ret_arg_type retval =
+ TAO::Portable_Server::get_ret_arg< ::CORBA::Char *> (
+ this->operation_details_,
+ this->args_);
+
+ retval =
+ this->servant_-> _repository_id (
+ ACE_ENV_SINGLE_ARG_PARAMETER);
+ ACE_CHECK;
+ }
+
+ private:
+ POA_CORBA::ExceptionDef * const servant_;
+ TAO_Operation_Details const * const operation_details_;
+ TAO::Argument * const * const args_;
+ };
+}
+
+
+void POA_CORBA::ExceptionDef::_repository_id_skel (
+ TAO_ServerRequest & server_request,
+ void * TAO_INTERCEPTOR (servant_upcall),
+ void * servant
+ ACE_ENV_ARG_DECL
+ )
+{
+#if TAO_HAS_INTERCEPTORS == 1
+ static ::CORBA::TypeCode_ptr const * const exceptions = 0;
+ static ::CORBA::ULong const nexceptions = 0;
+#endif /* TAO_HAS_INTERCEPTORS */
+
+ TAO::SArg_Traits< ::CORBA::Char *>::ret_val retval;
+
+ TAO::Argument * const args[] =
+ {
+ &retval
+ };
+
+ static size_t const nargs = 1;
+
+ POA_CORBA::ExceptionDef * const impl =
+ static_cast<POA_CORBA::ExceptionDef *> (servant);
+
+ _repository_id_ExceptionDef_Upcall_Command command (
+ impl,
+ server_request.operation_details (),
+ args);
+
+ TAO::Upcall_Wrapper upcall_wrapper;
+ upcall_wrapper.upcall (server_request
+ , args
+ , nargs
+ , command
+#if TAO_HAS_INTERCEPTORS == 1
+ , servant_upcall
+ , exceptions
+ , nexceptions
+#endif /* TAO_HAS_INTERCEPTORS == 1 */
+ ACE_ENV_ARG_PARAMETER);
+ ACE_CHECK;
+}
+
+// TAO_IDL - Generated from
+// be\be_visitor_interface/interface_ss.cpp:513
+
+void POA_CORBA::ExceptionDef::_interface_skel (
+ TAO_ServerRequest & server_request,
+ void * /* servant_upcall */,
+ void * servant
+ ACE_ENV_ARG_DECL
+ )
+{
+ TAO_IFR_Client_Adapter *_tao_adapter =
+ ACE_Dynamic_Service<TAO_IFR_Client_Adapter>::instance (
+ TAO_ORB_Core::ifr_client_adapter_name ()
+ );
+
+ if (_tao_adapter == 0)
+ {
+ ACE_THROW ( ::CORBA::INTF_REPOS ( ::CORBA::OMGVMCID | 1,
+ ::CORBA::COMPLETED_NO));
+ }
+
+ POA_CORBA::ExceptionDef * const impl =
+ static_cast<POA_CORBA::ExceptionDef *> (servant);
+ ::CORBA::InterfaceDef_ptr _tao_retval =
+ impl->_get_interface (ACE_ENV_SINGLE_ARG_PARAMETER);
+ ACE_CHECK;
+
+ server_request.init_reply ();
+ TAO_OutputCDR &_tao_out = *server_request.outgoing ();
+
+ ::CORBA::Boolean const _tao_result =
+ _tao_adapter->interfacedef_cdr_insert (
+ _tao_out,
+ _tao_retval
+ );
+
+ _tao_adapter->dispose (_tao_retval);
+
+ if (_tao_result == false)
+ {
+ ACE_THROW ( ::CORBA::MARSHAL ());
+ }
+}namespace POA_CORBA
+{
+
+
+ // TAO_IDL - Generated from
+ // be\be_visitor_operation/upcall_command_ss.cpp:127
+
+ class _get_component_ExceptionDef_Upcall_Command
+ : public TAO::Upcall_Command
+ {
+ public:
+ inline _get_component_ExceptionDef_Upcall_Command (
+ POA_CORBA::ExceptionDef * servant,
+ TAO_Operation_Details const * operation_details,
+ TAO::Argument * const args[])
+ : servant_ (servant)
+ , operation_details_ (operation_details)
+ , args_ (args)
+ {
+ }
+
+ virtual void execute (ACE_ENV_SINGLE_ARG_DECL)
+ {
+ TAO::SArg_Traits< ::CORBA::Object>::ret_arg_type retval =
+ TAO::Portable_Server::get_ret_arg< ::CORBA::Object> (
+ this->operation_details_,
+ this->args_);
+
+ retval =
+ this->servant_-> _get_component (
+ ACE_ENV_SINGLE_ARG_PARAMETER);
+ ACE_CHECK;
+ }
+
+ private:
+ POA_CORBA::ExceptionDef * const servant_;
+ TAO_Operation_Details const * const operation_details_;
+ TAO::Argument * const * const args_;
+ };
+}
+
+
+void POA_CORBA::ExceptionDef::_component_skel (
+ TAO_ServerRequest & server_request,
+ void * TAO_INTERCEPTOR (servant_upcall),
+ void * servant
+ ACE_ENV_ARG_DECL
+ )
+{
+#if TAO_HAS_INTERCEPTORS == 1
+ static ::CORBA::TypeCode_ptr const * const exceptions = 0;
+ static ::CORBA::ULong const nexceptions = 0;
+#endif /* TAO_HAS_INTERCEPTORS */
+
+ TAO::SArg_Traits< ::CORBA::Object>::ret_val retval;
+
+ TAO::Argument * const args[] =
+ {
+ &retval
+ };
+
+ static size_t const nargs = 1;
+
+ POA_CORBA::ExceptionDef * const impl =
+ static_cast<POA_CORBA::ExceptionDef *> (servant);
+
+ _get_component_ExceptionDef_Upcall_Command command (
+ impl,
+ server_request.operation_details (),
+ args);
+
+ TAO::Upcall_Wrapper upcall_wrapper;
+ upcall_wrapper.upcall (server_request
+ , args
+ , nargs
+ , command
+#if TAO_HAS_INTERCEPTORS == 1
+ , servant_upcall
+ , exceptions
+ , nexceptions
+#endif /* TAO_HAS_INTERCEPTORS == 1 */
+ ACE_ENV_ARG_PARAMETER);
+ ACE_CHECK;
+}
+
+::CORBA::Boolean POA_CORBA::ExceptionDef::_is_a (
+ const char* value
+ ACE_ENV_ARG_DECL_NOT_USED
+ )
+{
+ return
+ (
+ !ACE_OS::strcmp (
+ value,
+ "IDL:omg.org/CORBA/IRObject:1.0"
+ ) ||
+ !ACE_OS::strcmp (
+ value,
+ "IDL:omg.org/CORBA/Contained:1.0"
+ ) ||
+ !ACE_OS::strcmp (
+ value,
+ "IDL:omg.org/CORBA/Container:1.0"
+ ) ||
+ !ACE_OS::strcmp (
+ value,
+ "IDL:omg.org/CORBA/ExceptionDef:1.0"
+ ) ||
+ !ACE_OS::strcmp (
+ value,
+ "IDL:omg.org/CORBA/Object:1.0"
+ )
+ );
+}
+
+const char* POA_CORBA::ExceptionDef::_interface_repository_id (void) const
+{
+ return "IDL:omg.org/CORBA/ExceptionDef:1.0";
+}
+
+// TAO_IDL - Generated from
+// be\be_visitor_interface/interface_ss.cpp:903
+
+void POA_CORBA::ExceptionDef::_dispatch (
+ TAO_ServerRequest & req,
+ void * servant_upcall
+ ACE_ENV_ARG_DECL
+ )
+{
+ this->synchronous_upcall_dispatch (req,
+ servant_upcall,
+ this
+ ACE_ENV_ARG_PARAMETER);
+}
+
+// TAO_IDL - Generated from
+// be\be_visitor_interface/interface_ss.cpp:851
+
+CORBA::ExceptionDef *
+POA_CORBA::ExceptionDef::_this (ACE_ENV_SINGLE_ARG_DECL)
+{
+ TAO_Stub *stub = this->_create_stub (ACE_ENV_SINGLE_ARG_PARAMETER);
+ ACE_CHECK_RETURN (0);
+
+ TAO_Stub_Auto_Ptr safe_stub (stub);
+ ::CORBA::Object_ptr tmp = CORBA::Object::_nil ();
+
+ ::CORBA::Boolean const _tao_opt_colloc =
+ stub->servant_orb_var ()->orb_core ()->optimize_collocation_objects ();
+
+ ACE_NEW_RETURN (
+ tmp,
+ ::CORBA::Object (stub, _tao_opt_colloc, this),
+ 0
+ );
+
+ ::CORBA::Object_var obj = tmp;
+ (void) safe_stub.release ();
+
+ typedef ::CORBA::ExceptionDef STUB_SCOPED_NAME;
+ return
+ TAO::Narrow_Utils<STUB_SCOPED_NAME>::unchecked_narrow (
+ obj.in (),
+ CORBA__TAO_ExceptionDef_Proxy_Broker_Factory_function_pointer
+ );
+}
+
+// TAO_IDL - Generated from
+// be\be_interface.cpp:1499
+
+class TAO_CORBA_AttributeDef_Perfect_Hash_OpTable
+ : public TAO_Perfect_Hash_OpTable
+{
+private:
+ unsigned int hash (const char *str, unsigned int len);
+
+public:
+ const TAO_operation_db_entry * lookup (const char *str, unsigned int len);
+};
+
+/* C++ code produced by gperf version 2.8 (ACE version) */
+/* Command-line: C:\ACE\latest\ACE_wrappers\bin\gperf.exe -m -M -J -c -C -D -E -T -f 0 -F 0,0 -a -o -t -p -K opname -L C++ -Z TAO_CORBA_AttributeDef_Perfect_Hash_OpTable -N lookup */
+unsigned int
+TAO_CORBA_AttributeDef_Perfect_Hash_OpTable::hash (const char *str, unsigned int len)
+{
+ static const unsigned char asso_values[] =
+ {
+#if defined (ACE_MVS)
+ 37, 37, 37, 37, 37, 37, 37, 37, 37, 37,
+ 37, 37, 37, 37, 37, 37, 37, 37, 37, 37,
+ 37, 37, 37, 37, 37, 37, 37, 37, 37, 37,
+ 37, 37, 37, 37, 37, 37, 37, 37, 37, 37,
+ 37, 37, 37, 37, 37, 37, 37, 37, 37, 37,
+ 37, 37, 37, 37, 37, 37, 37, 37, 37, 37,
+ 37, 37, 37, 37, 37, 37, 37, 37, 37, 37,
+ 37, 37, 37, 37, 37, 37, 37, 37, 37, 37,
+ 37, 37, 37, 37, 37, 37, 37, 37, 37, 37,
+ 37, 37, 37, 37, 37, 37, 37, 37, 37, 37,
+ 37, 37, 37, 37, 37, 37, 37, 37, 37, 0,
+ 37, 37, 37, 37, 37, 37, 37, 37, 37, 37,
+ 37, 37, 37, 37, 37, 37, 37, 37, 37, 0,
+ 37, 37, 0, 0, 15, 37, 37, 37, 37, 37,
+ 37, 37, 37, 37, 37, 37, 37, 37, 0, 0,
+ 37, 37, 37, 37, 37, 37, 37, 37, 37, 37,
+ 37, 37, 37, 10, 37, 37, 37, 37, 10, 37,
+ 37, 37, 37, 37, 37, 37, 37, 37, 37, 37,
+ 37, 37, 37, 37, 37, 37, 37, 37, 37, 37,
+ 37, 37, 37, 37, 37, 37, 37, 37, 37, 37,
+ 37, 37, 37, 37, 37, 37, 37, 37, 37, 37,
+ 37, 37, 37, 37, 37, 37, 37, 37, 37, 37,
+ 37, 37, 37, 37, 37, 37, 37, 37, 37, 37,
+ 37, 37, 37, 37, 37, 37, 37, 37, 37, 37,
+ 37, 37, 37, 37, 37, 37, 37, 37, 37, 37,
+ 37, 37, 37, 37, 37, 37,
+#else
+ 37, 37, 37, 37, 37, 37, 37, 37, 37, 37,
+ 37, 37, 37, 37, 37, 37, 37, 37, 37, 37,
+ 37, 37, 37, 37, 37, 37, 37, 37, 37, 37,
+ 37, 37, 37, 37, 37, 37, 37, 37, 37, 37,
+ 37, 37, 37, 37, 37, 37, 37, 37, 37, 37,
+ 37, 37, 37, 37, 37, 37, 37, 37, 37, 37,
+ 37, 37, 37, 37, 37, 37, 37, 37, 37, 37,
+ 37, 37, 37, 37, 37, 37, 37, 37, 37, 37,
+ 37, 37, 37, 37, 37, 37, 37, 37, 37, 37,
+ 37, 37, 37, 37, 37, 0, 37, 0, 37, 37,
+ 0, 0, 15, 37, 37, 37, 37, 37, 37, 0,
+ 0, 37, 37, 37, 37, 37, 10, 37, 37, 37,
+ 37, 10, 37, 37, 37, 37, 37, 37,
+#endif /* ACE_MVS */
+ };
+ return len + asso_values[(int) str[len - 1]] + asso_values[(int) str[0]];
+}
+
+const TAO_operation_db_entry *
+TAO_CORBA_AttributeDef_Perfect_Hash_OpTable::lookup (const char *str, unsigned int len)
+{
+ enum
+ {
+ TOTAL_KEYWORDS = 23,
+ MIN_WORD_LENGTH = 4,
+ MAX_WORD_LENGTH = 26,
+ MIN_HASH_VALUE = 4,
+ MAX_HASH_VALUE = 36,
+ HASH_VALUE_RANGE = 33,
+ DUPLICATES = 8,
+ WORDLIST_SIZE = 27
+ };
+
+ static const TAO_operation_db_entry wordlist[] =
+ {
+ {"",0,0},{"",0,0},{"",0,0},{"",0,0},
+ {"move", &POA_CORBA::AttributeDef::move_skel, 0},
+ {"_is_a", &POA_CORBA::AttributeDef::_is_a_skel, 0},
+ {"_get_id", &POA_CORBA::AttributeDef::_get_id_skel, 0},
+ {"_set_id", &POA_CORBA::AttributeDef::_set_id_skel, 0},
+ {"describe", &POA_CORBA::AttributeDef::describe_skel, 0},
+ {"_get_name", &POA_CORBA::AttributeDef::_get_name_skel, 0},
+ {"_set_mode", &POA_CORBA::AttributeDef::_set_mode_skel, 0},
+ {"_get_mode", &POA_CORBA::AttributeDef::_get_mode_skel, 0},
+ {"_get_type", &POA_CORBA::AttributeDef::_get_type_skel, 0},
+ {"_set_name", &POA_CORBA::AttributeDef::_set_name_skel, 0},
+ {"_interface", &POA_CORBA::AttributeDef::_interface_skel, 0},
+ {"_get_version", &POA_CORBA::AttributeDef::_get_version_skel, 0},
+ {"_set_version", &POA_CORBA::AttributeDef::_set_version_skel, 0},
+ {"_get_def_kind", &POA_CORBA::AttributeDef::_get_def_kind_skel, 0},
+ {"_repository_id", &POA_CORBA::AttributeDef::_repository_id_skel, 0},
+ {"_get_defined_in", &POA_CORBA::AttributeDef::_get_defined_in_skel, 0},
+ {"destroy", &POA_CORBA::AttributeDef::destroy_skel, 0},
+ {"_get_absolute_name", &POA_CORBA::AttributeDef::_get_absolute_name_skel, 0},
+ {"_component", &POA_CORBA::AttributeDef::_component_skel, 0},
+ {"_non_existent", &POA_CORBA::AttributeDef::_non_existent_skel, 0},
+ {"_get_type_def", &POA_CORBA::AttributeDef::_get_type_def_skel, 0},
+ {"_set_type_def", &POA_CORBA::AttributeDef::_set_type_def_skel, 0},
+ {"_get_containing_repository", &POA_CORBA::AttributeDef::_get_containing_repository_skel, 0},
+ };
+
+ static const signed char lookup[] =
+ {
+ -9, -5, -15, -2, 4, 5, -1, 50, 8, -45, 14, -1, -46, 17,
+ 18, 19, -1, 20, 21, -1, 22, -6, -2, 23, -1, -1, -24, -2,
+ -38, -1, -1, -1, -1, -1, -1, -1, 26,
+ };
+
+ if (len <= MAX_WORD_LENGTH && len >= MIN_WORD_LENGTH)
+ {
+ unsigned int key = hash (str, len);
+
+ if (key <= MAX_HASH_VALUE && key >= MIN_HASH_VALUE)
+ {
+ int slot = lookup[key];
+
+ if (slot >= 0 && slot < WORDLIST_SIZE)
+ {
+ const char *s = wordlist[slot].opname;
+
+ if (*str == *s && !strncmp (str + 1, s + 1, len - 1))
+ return &wordlist[slot];
+ }
+ else if (slot < 0 && slot >= -MAX_HASH_VALUE)
+ return 0;
+ else
+ {
+ unsigned int offset = key + slot + (slot > 0 ? -MAX_HASH_VALUE : MAX_HASH_VALUE);
+ const TAO_operation_db_entry *base = &wordlist[-lookup[offset]];
+ const TAO_operation_db_entry *ptr = base + -lookup[offset + 1];
+
+ while (--ptr >= base)
+ if (*str == *ptr->opname && !strncmp (str + 1, ptr->opname + 1, len - 1))
+ return ptr;
+ }
+ }
+ }
+ return 0;
+}
+
+static TAO_CORBA_AttributeDef_Perfect_Hash_OpTable tao_CORBA_AttributeDef_optable;
+
+// TAO_IDL - Generated from
+// be\be_visitor_interface/interface_ss.cpp:966
+
+TAO::Collocation_Proxy_Broker *
+CORBA__TAO_AttributeDef_Proxy_Broker_Factory_function ( ::CORBA::Object_ptr)
+{
+ return reinterpret_cast<TAO::Collocation_Proxy_Broker *> (0xdead); // Dummy
+}
+
+int
+CORBA__TAO_AttributeDef_Proxy_Broker_Factory_Initializer (size_t)
+{
+ CORBA__TAO_AttributeDef_Proxy_Broker_Factory_function_pointer =
+ CORBA__TAO_AttributeDef_Proxy_Broker_Factory_function;
+
+ return 0;
+}
+
+static int
+CORBA__TAO_AttributeDef_Proxy_Broker_Stub_Factory_Initializer_Scarecrow =
+ CORBA__TAO_AttributeDef_Proxy_Broker_Factory_Initializer (
+ reinterpret_cast<size_t> (CORBA__TAO_AttributeDef_Proxy_Broker_Factory_Initializer)
+ );
+
+// TAO_IDL - Generated from
+// be\be_visitor_interface/interface_ss.cpp:103
+
+POA_CORBA::AttributeDef::AttributeDef (void)
+ : TAO_ServantBase ()
+{
+ this->optable_ = &tao_CORBA_AttributeDef_optable;
+}
+
+POA_CORBA::AttributeDef::AttributeDef (const AttributeDef& rhs)
+ : TAO_Abstract_ServantBase (rhs),
+ TAO_ServantBase (rhs),
+ POA_CORBA::IRObject (rhs),
+ POA_CORBA::Contained (rhs)
+{
+}
+
+POA_CORBA::AttributeDef::~AttributeDef (void)
+{
+}namespace POA_CORBA
+{
+
+
+ // TAO_IDL - Generated from
+ // be\be_visitor_operation/upcall_command_ss.cpp:127
+
+ class _get_type_AttributeDef
+ : public TAO::Upcall_Command
+ {
+ public:
+ inline _get_type_AttributeDef (
+ POA_CORBA::AttributeDef * servant,
+ TAO_Operation_Details const * operation_details,
+ TAO::Argument * const args[])
+ : servant_ (servant)
+ , operation_details_ (operation_details)
+ , args_ (args)
+ {
+ }
+
+ virtual void execute (ACE_ENV_SINGLE_ARG_DECL)
+ {
+ TAO::SArg_Traits< ::CORBA::TypeCode>::ret_arg_type retval =
+ TAO::Portable_Server::get_ret_arg< ::CORBA::TypeCode> (
+ this->operation_details_,
+ this->args_);
+
+ retval =
+ this->servant_->type (
+ ACE_ENV_SINGLE_ARG_PARAMETER);
+ ACE_CHECK;
+ }
+
+ private:
+ POA_CORBA::AttributeDef * const servant_;
+ TAO_Operation_Details const * const operation_details_;
+ TAO::Argument * const * const args_;
+ };
+}
+
+
+// TAO_IDL - Generated from
+// be\be_visitor_operation/operation_ss.cpp:190
+
+void POA_CORBA::AttributeDef::_get_type_skel (
+ TAO_ServerRequest & server_request,
+ void * TAO_INTERCEPTOR (servant_upcall),
+ void * servant
+ ACE_ENV_ARG_DECL
+ )
+{
+#if TAO_HAS_INTERCEPTORS == 1
+ static ::CORBA::TypeCode_ptr const * const exceptions = 0;
+ static ::CORBA::ULong const nexceptions = 0;
+#endif /* TAO_HAS_INTERCEPTORS */
+
+ TAO::SArg_Traits< ::CORBA::TypeCode>::ret_val retval;
+
+ TAO::Argument * const args[] =
+ {
+ &retval
+ };
+
+ static size_t const nargs = 1;
+
+ POA_CORBA::AttributeDef * const impl =
+ static_cast<POA_CORBA::AttributeDef *> (servant);
+
+ _get_type_AttributeDef command (
+ impl,
+ server_request.operation_details (),
+ args);
+
+ TAO::Upcall_Wrapper upcall_wrapper;
+ upcall_wrapper.upcall (server_request
+ , args
+ , nargs
+ , command
+#if TAO_HAS_INTERCEPTORS == 1
+ , servant_upcall
+ , exceptions
+ , nexceptions
+#endif /* TAO_HAS_INTERCEPTORS == 1 */
+ ACE_ENV_ARG_PARAMETER);
+ ACE_CHECK;
+}namespace POA_CORBA
+{
+
+
+ // TAO_IDL - Generated from
+ // be\be_visitor_operation/upcall_command_ss.cpp:127
+
+ class _get_type_def_AttributeDef
+ : public TAO::Upcall_Command
+ {
+ public:
+ inline _get_type_def_AttributeDef (
+ POA_CORBA::AttributeDef * servant,
+ TAO_Operation_Details const * operation_details,
+ TAO::Argument * const args[])
+ : servant_ (servant)
+ , operation_details_ (operation_details)
+ , args_ (args)
+ {
+ }
+
+ virtual void execute (ACE_ENV_SINGLE_ARG_DECL)
+ {
+ TAO::SArg_Traits< ::CORBA::IDLType>::ret_arg_type retval =
+ TAO::Portable_Server::get_ret_arg< ::CORBA::IDLType> (
+ this->operation_details_,
+ this->args_);
+
+ retval =
+ this->servant_->type_def (
+ ACE_ENV_SINGLE_ARG_PARAMETER);
+ ACE_CHECK;
+ }
+
+ private:
+ POA_CORBA::AttributeDef * const servant_;
+ TAO_Operation_Details const * const operation_details_;
+ TAO::Argument * const * const args_;
+ };
+}
+
+
+// TAO_IDL - Generated from
+// be\be_visitor_operation/operation_ss.cpp:190
+
+void POA_CORBA::AttributeDef::_get_type_def_skel (
+ TAO_ServerRequest & server_request,
+ void * TAO_INTERCEPTOR (servant_upcall),
+ void * servant
+ ACE_ENV_ARG_DECL
+ )
+{
+#if TAO_HAS_INTERCEPTORS == 1
+ static ::CORBA::TypeCode_ptr const * const exceptions = 0;
+ static ::CORBA::ULong const nexceptions = 0;
+#endif /* TAO_HAS_INTERCEPTORS */
+
+ TAO::SArg_Traits< ::CORBA::IDLType>::ret_val retval;
+
+ TAO::Argument * const args[] =
+ {
+ &retval
+ };
+
+ static size_t const nargs = 1;
+
+ POA_CORBA::AttributeDef * const impl =
+ static_cast<POA_CORBA::AttributeDef *> (servant);
+
+ _get_type_def_AttributeDef command (
+ impl,
+ server_request.operation_details (),
+ args);
+
+ TAO::Upcall_Wrapper upcall_wrapper;
+ upcall_wrapper.upcall (server_request
+ , args
+ , nargs
+ , command
+#if TAO_HAS_INTERCEPTORS == 1
+ , servant_upcall
+ , exceptions
+ , nexceptions
+#endif /* TAO_HAS_INTERCEPTORS == 1 */
+ ACE_ENV_ARG_PARAMETER);
+ ACE_CHECK;
+}namespace POA_CORBA
+{
+
+
+ // TAO_IDL - Generated from
+ // be\be_visitor_operation/upcall_command_ss.cpp:127
+
+ class _set_type_def_AttributeDef
+ : public TAO::Upcall_Command
+ {
+ public:
+ inline _set_type_def_AttributeDef (
+ POA_CORBA::AttributeDef * servant,
+ TAO_Operation_Details const * operation_details,
+ TAO::Argument * const args[])
+ : servant_ (servant)
+ , operation_details_ (operation_details)
+ , args_ (args)
+ {
+ }
+
+ virtual void execute (ACE_ENV_SINGLE_ARG_DECL)
+ {
+ TAO::SArg_Traits< ::CORBA::IDLType>::in_arg_type arg_1 =
+ TAO::Portable_Server::get_in_arg< ::CORBA::IDLType> (
+ this->operation_details_,
+ this->args_,
+ 1);
+
+ this->servant_->type_def (
+ arg_1
+ ACE_ENV_ARG_PARAMETER);
+ ACE_CHECK;
+ }
+
+ private:
+ POA_CORBA::AttributeDef * const servant_;
+ TAO_Operation_Details const * const operation_details_;
+ TAO::Argument * const * const args_;
+ };
+}
+
+
+// TAO_IDL - Generated from
+// be\be_visitor_operation/operation_ss.cpp:190
+
+void POA_CORBA::AttributeDef::_set_type_def_skel (
+ TAO_ServerRequest & server_request,
+ void * TAO_INTERCEPTOR (servant_upcall),
+ void * servant
+ ACE_ENV_ARG_DECL
+ )
+{
+#if TAO_HAS_INTERCEPTORS == 1
+ static ::CORBA::TypeCode_ptr const * const exceptions = 0;
+ static ::CORBA::ULong const nexceptions = 0;
+#endif /* TAO_HAS_INTERCEPTORS */
+
+ TAO::SArg_Traits< void>::ret_val retval;
+ TAO::SArg_Traits< ::CORBA::IDLType>::in_arg_val _tao_type_def;
+
+ TAO::Argument * const args[] =
+ {
+ &retval,
+ &_tao_type_def
+ };
+
+ static size_t const nargs = 2;
+
+ POA_CORBA::AttributeDef * const impl =
+ static_cast<POA_CORBA::AttributeDef *> (servant);
+
+ _set_type_def_AttributeDef command (
+ impl,
+ server_request.operation_details (),
+ args);
+
+ TAO::Upcall_Wrapper upcall_wrapper;
+ upcall_wrapper.upcall (server_request
+ , args
+ , nargs
+ , command
+#if TAO_HAS_INTERCEPTORS == 1
+ , servant_upcall
+ , exceptions
+ , nexceptions
+#endif /* TAO_HAS_INTERCEPTORS == 1 */
+ ACE_ENV_ARG_PARAMETER);
+ ACE_CHECK;
+}namespace POA_CORBA
+{
+
+
+ // TAO_IDL - Generated from
+ // be\be_visitor_operation/upcall_command_ss.cpp:127
+
+ class _get_mode_AttributeDef
+ : public TAO::Upcall_Command
+ {
+ public:
+ inline _get_mode_AttributeDef (
+ POA_CORBA::AttributeDef * servant,
+ TAO_Operation_Details const * operation_details,
+ TAO::Argument * const args[])
+ : servant_ (servant)
+ , operation_details_ (operation_details)
+ , args_ (args)
+ {
+ }
+
+ virtual void execute (ACE_ENV_SINGLE_ARG_DECL)
+ {
+ TAO::SArg_Traits< ::CORBA::AttributeMode>::ret_arg_type retval =
+ TAO::Portable_Server::get_ret_arg< ::CORBA::AttributeMode> (
+ this->operation_details_,
+ this->args_);
+
+ retval =
+ this->servant_->mode (
+ ACE_ENV_SINGLE_ARG_PARAMETER);
+ ACE_CHECK;
+ }
+
+ private:
+ POA_CORBA::AttributeDef * const servant_;
+ TAO_Operation_Details const * const operation_details_;
+ TAO::Argument * const * const args_;
+ };
+}
+
+
+// TAO_IDL - Generated from
+// be\be_visitor_operation/operation_ss.cpp:190
+
+void POA_CORBA::AttributeDef::_get_mode_skel (
+ TAO_ServerRequest & server_request,
+ void * TAO_INTERCEPTOR (servant_upcall),
+ void * servant
+ ACE_ENV_ARG_DECL
+ )
+{
+#if TAO_HAS_INTERCEPTORS == 1
+ static ::CORBA::TypeCode_ptr const * const exceptions = 0;
+ static ::CORBA::ULong const nexceptions = 0;
+#endif /* TAO_HAS_INTERCEPTORS */
+
+ TAO::SArg_Traits< ::CORBA::AttributeMode>::ret_val retval;
+
+ TAO::Argument * const args[] =
+ {
+ &retval
+ };
+
+ static size_t const nargs = 1;
+
+ POA_CORBA::AttributeDef * const impl =
+ static_cast<POA_CORBA::AttributeDef *> (servant);
+
+ _get_mode_AttributeDef command (
+ impl,
+ server_request.operation_details (),
+ args);
+
+ TAO::Upcall_Wrapper upcall_wrapper;
+ upcall_wrapper.upcall (server_request
+ , args
+ , nargs
+ , command
+#if TAO_HAS_INTERCEPTORS == 1
+ , servant_upcall
+ , exceptions
+ , nexceptions
+#endif /* TAO_HAS_INTERCEPTORS == 1 */
+ ACE_ENV_ARG_PARAMETER);
+ ACE_CHECK;
+}namespace POA_CORBA
+{
+
+
+ // TAO_IDL - Generated from
+ // be\be_visitor_operation/upcall_command_ss.cpp:127
+
+ class _set_mode_AttributeDef
+ : public TAO::Upcall_Command
+ {
+ public:
+ inline _set_mode_AttributeDef (
+ POA_CORBA::AttributeDef * servant,
+ TAO_Operation_Details const * operation_details,
+ TAO::Argument * const args[])
+ : servant_ (servant)
+ , operation_details_ (operation_details)
+ , args_ (args)
+ {
+ }
+
+ virtual void execute (ACE_ENV_SINGLE_ARG_DECL)
+ {
+ TAO::SArg_Traits< ::CORBA::AttributeMode>::in_arg_type arg_1 =
+ TAO::Portable_Server::get_in_arg< ::CORBA::AttributeMode> (
+ this->operation_details_,
+ this->args_,
+ 1);
+
+ this->servant_->mode (
+ arg_1
+ ACE_ENV_ARG_PARAMETER);
+ ACE_CHECK;
+ }
+
+ private:
+ POA_CORBA::AttributeDef * const servant_;
+ TAO_Operation_Details const * const operation_details_;
+ TAO::Argument * const * const args_;
+ };
+}
+
+
+// TAO_IDL - Generated from
+// be\be_visitor_operation/operation_ss.cpp:190
+
+void POA_CORBA::AttributeDef::_set_mode_skel (
+ TAO_ServerRequest & server_request,
+ void * TAO_INTERCEPTOR (servant_upcall),
+ void * servant
+ ACE_ENV_ARG_DECL
+ )
+{
+#if TAO_HAS_INTERCEPTORS == 1
+ static ::CORBA::TypeCode_ptr const * const exceptions = 0;
+ static ::CORBA::ULong const nexceptions = 0;
+#endif /* TAO_HAS_INTERCEPTORS */
+
+ TAO::SArg_Traits< void>::ret_val retval;
+ TAO::SArg_Traits< ::CORBA::AttributeMode>::in_arg_val _tao_mode;
+
+ TAO::Argument * const args[] =
+ {
+ &retval,
+ &_tao_mode
+ };
+
+ static size_t const nargs = 2;
+
+ POA_CORBA::AttributeDef * const impl =
+ static_cast<POA_CORBA::AttributeDef *> (servant);
+
+ _set_mode_AttributeDef command (
+ impl,
+ server_request.operation_details (),
+ args);
+
+ TAO::Upcall_Wrapper upcall_wrapper;
+ upcall_wrapper.upcall (server_request
+ , args
+ , nargs
+ , command
+#if TAO_HAS_INTERCEPTORS == 1
+ , servant_upcall
+ , exceptions
+ , nexceptions
+#endif /* TAO_HAS_INTERCEPTORS == 1 */
+ ACE_ENV_ARG_PARAMETER);
+ ACE_CHECK;
+}
+
+// TAO_IDL - Generated from
+// be\be_visitor_interface/interface_ss.cpp:169
+
+namespace POA_CORBA
+{
+
+
+ // TAO_IDL - Generated from
+ // be\be_visitor_operation/upcall_command_ss.cpp:127
+
+ class _is_a_AttributeDef_Upcall_Command
+ : public TAO::Upcall_Command
+ {
+ public:
+ inline _is_a_AttributeDef_Upcall_Command (
+ POA_CORBA::AttributeDef * servant,
+ TAO_Operation_Details const * operation_details,
+ TAO::Argument * const args[])
+ : servant_ (servant)
+ , operation_details_ (operation_details)
+ , args_ (args)
+ {
+ }
+
+ virtual void execute (ACE_ENV_SINGLE_ARG_DECL)
+ {
+ TAO::SArg_Traits< ::ACE_InputCDR::to_boolean>::ret_arg_type retval =
+ TAO::Portable_Server::get_ret_arg< ::ACE_InputCDR::to_boolean> (
+ this->operation_details_,
+ this->args_);
+
+ TAO::SArg_Traits< ::CORBA::Char *>::in_arg_type arg_1 =
+ TAO::Portable_Server::get_in_arg< ::CORBA::Char *> (
+ this->operation_details_,
+ this->args_,
+ 1);
+
+ retval =
+ this->servant_-> _is_a (
+ arg_1
+ ACE_ENV_ARG_PARAMETER);
+ ACE_CHECK;
+ }
+
+ private:
+ POA_CORBA::AttributeDef * const servant_;
+ TAO_Operation_Details const * const operation_details_;
+ TAO::Argument * const * const args_;
+ };
+}
+
+
+void POA_CORBA::AttributeDef::_is_a_skel (
+ TAO_ServerRequest & server_request,
+ void * TAO_INTERCEPTOR (servant_upcall),
+ void * servant
+ ACE_ENV_ARG_DECL
+ )
+{
+#if TAO_HAS_INTERCEPTORS == 1
+ static ::CORBA::TypeCode_ptr const * const exceptions = 0;
+ static ::CORBA::ULong const nexceptions = 0;
+#endif /* TAO_HAS_INTERCEPTORS */
+
+ TAO::SArg_Traits< ::ACE_InputCDR::to_boolean>::ret_val retval;
+ TAO::SArg_Traits< ::CORBA::Char *>::in_arg_val _tao_repository_id;
+
+ TAO::Argument * const args[] =
+ {
+ &retval,
+ &_tao_repository_id
+ };
+
+ static size_t const nargs = 2;
+
+ POA_CORBA::AttributeDef * const impl =
+ static_cast<POA_CORBA::AttributeDef *> (servant);
+
+ _is_a_AttributeDef_Upcall_Command command (
+ impl,
+ server_request.operation_details (),
+ args);
+
+ TAO::Upcall_Wrapper upcall_wrapper;
+ upcall_wrapper.upcall (server_request
+ , args
+ , nargs
+ , command
+#if TAO_HAS_INTERCEPTORS == 1
+ , servant_upcall
+ , exceptions
+ , nexceptions
+#endif /* TAO_HAS_INTERCEPTORS == 1 */
+ ACE_ENV_ARG_PARAMETER);
+ ACE_CHECK;
+}namespace POA_CORBA
+{
+
+
+ // TAO_IDL - Generated from
+ // be\be_visitor_operation/upcall_command_ss.cpp:127
+
+ class _non_existent_AttributeDef_Upcall_Command
+ : public TAO::Upcall_Command
+ {
+ public:
+ inline _non_existent_AttributeDef_Upcall_Command (
+ POA_CORBA::AttributeDef * servant,
+ TAO_Operation_Details const * operation_details,
+ TAO::Argument * const args[])
+ : servant_ (servant)
+ , operation_details_ (operation_details)
+ , args_ (args)
+ {
+ }
+
+ virtual void execute (ACE_ENV_SINGLE_ARG_DECL)
+ {
+ TAO::SArg_Traits< ::ACE_InputCDR::to_boolean>::ret_arg_type retval =
+ TAO::Portable_Server::get_ret_arg< ::ACE_InputCDR::to_boolean> (
+ this->operation_details_,
+ this->args_);
+
+ retval =
+ this->servant_-> _non_existent (
+ ACE_ENV_SINGLE_ARG_PARAMETER);
+ ACE_CHECK;
+ }
+
+ private:
+ POA_CORBA::AttributeDef * const servant_;
+ TAO_Operation_Details const * const operation_details_;
+ TAO::Argument * const * const args_;
+ };
+}
+
+
+void POA_CORBA::AttributeDef::_non_existent_skel (
+ TAO_ServerRequest & server_request,
+ void * TAO_INTERCEPTOR (servant_upcall),
+ void * servant
+ ACE_ENV_ARG_DECL
+ )
+{
+#if TAO_HAS_INTERCEPTORS == 1
+ static ::CORBA::TypeCode_ptr const * const exceptions = 0;
+ static ::CORBA::ULong const nexceptions = 0;
+#endif /* TAO_HAS_INTERCEPTORS */
+
+ TAO::SArg_Traits< ::ACE_InputCDR::to_boolean>::ret_val retval;
+
+ TAO::Argument * const args[] =
+ {
+ &retval
+ };
+
+ static size_t const nargs = 1;
+
+ POA_CORBA::AttributeDef * const impl =
+ static_cast<POA_CORBA::AttributeDef *> (servant);
+
+ _non_existent_AttributeDef_Upcall_Command command (
+ impl,
+ server_request.operation_details (),
+ args);
+
+ TAO::Upcall_Wrapper upcall_wrapper;
+ upcall_wrapper.upcall (server_request
+ , args
+ , nargs
+ , command
+#if TAO_HAS_INTERCEPTORS == 1
+ , servant_upcall
+ , exceptions
+ , nexceptions
+#endif /* TAO_HAS_INTERCEPTORS == 1 */
+ ACE_ENV_ARG_PARAMETER);
+ ACE_CHECK;
+}namespace POA_CORBA
+{
+
+
+ // TAO_IDL - Generated from
+ // be\be_visitor_operation/upcall_command_ss.cpp:127
+
+ class _repository_id_AttributeDef_Upcall_Command
+ : public TAO::Upcall_Command
+ {
+ public:
+ inline _repository_id_AttributeDef_Upcall_Command (
+ POA_CORBA::AttributeDef * servant,
+ TAO_Operation_Details const * operation_details,
+ TAO::Argument * const args[])
+ : servant_ (servant)
+ , operation_details_ (operation_details)
+ , args_ (args)
+ {
+ }
+
+ virtual void execute (ACE_ENV_SINGLE_ARG_DECL)
+ {
+ TAO::SArg_Traits< ::CORBA::Char *>::ret_arg_type retval =
+ TAO::Portable_Server::get_ret_arg< ::CORBA::Char *> (
+ this->operation_details_,
+ this->args_);
+
+ retval =
+ this->servant_-> _repository_id (
+ ACE_ENV_SINGLE_ARG_PARAMETER);
+ ACE_CHECK;
+ }
+
+ private:
+ POA_CORBA::AttributeDef * const servant_;
+ TAO_Operation_Details const * const operation_details_;
+ TAO::Argument * const * const args_;
+ };
+}
+
+
+void POA_CORBA::AttributeDef::_repository_id_skel (
+ TAO_ServerRequest & server_request,
+ void * TAO_INTERCEPTOR (servant_upcall),
+ void * servant
+ ACE_ENV_ARG_DECL
+ )
+{
+#if TAO_HAS_INTERCEPTORS == 1
+ static ::CORBA::TypeCode_ptr const * const exceptions = 0;
+ static ::CORBA::ULong const nexceptions = 0;
+#endif /* TAO_HAS_INTERCEPTORS */
+
+ TAO::SArg_Traits< ::CORBA::Char *>::ret_val retval;
+
+ TAO::Argument * const args[] =
+ {
+ &retval
+ };
+
+ static size_t const nargs = 1;
+
+ POA_CORBA::AttributeDef * const impl =
+ static_cast<POA_CORBA::AttributeDef *> (servant);
+
+ _repository_id_AttributeDef_Upcall_Command command (
+ impl,
+ server_request.operation_details (),
+ args);
+
+ TAO::Upcall_Wrapper upcall_wrapper;
+ upcall_wrapper.upcall (server_request
+ , args
+ , nargs
+ , command
+#if TAO_HAS_INTERCEPTORS == 1
+ , servant_upcall
+ , exceptions
+ , nexceptions
+#endif /* TAO_HAS_INTERCEPTORS == 1 */
+ ACE_ENV_ARG_PARAMETER);
+ ACE_CHECK;
+}
+
+// TAO_IDL - Generated from
+// be\be_visitor_interface/interface_ss.cpp:513
+
+void POA_CORBA::AttributeDef::_interface_skel (
+ TAO_ServerRequest & server_request,
+ void * /* servant_upcall */,
+ void * servant
+ ACE_ENV_ARG_DECL
+ )
+{
+ TAO_IFR_Client_Adapter *_tao_adapter =
+ ACE_Dynamic_Service<TAO_IFR_Client_Adapter>::instance (
+ TAO_ORB_Core::ifr_client_adapter_name ()
+ );
+
+ if (_tao_adapter == 0)
+ {
+ ACE_THROW ( ::CORBA::INTF_REPOS ( ::CORBA::OMGVMCID | 1,
+ ::CORBA::COMPLETED_NO));
+ }
+
+ POA_CORBA::AttributeDef * const impl =
+ static_cast<POA_CORBA::AttributeDef *> (servant);
+ ::CORBA::InterfaceDef_ptr _tao_retval =
+ impl->_get_interface (ACE_ENV_SINGLE_ARG_PARAMETER);
+ ACE_CHECK;
+
+ server_request.init_reply ();
+ TAO_OutputCDR &_tao_out = *server_request.outgoing ();
+
+ ::CORBA::Boolean const _tao_result =
+ _tao_adapter->interfacedef_cdr_insert (
+ _tao_out,
+ _tao_retval
+ );
+
+ _tao_adapter->dispose (_tao_retval);
+
+ if (_tao_result == false)
+ {
+ ACE_THROW ( ::CORBA::MARSHAL ());
+ }
+}namespace POA_CORBA
+{
+
+
+ // TAO_IDL - Generated from
+ // be\be_visitor_operation/upcall_command_ss.cpp:127
+
+ class _get_component_AttributeDef_Upcall_Command
+ : public TAO::Upcall_Command
+ {
+ public:
+ inline _get_component_AttributeDef_Upcall_Command (
+ POA_CORBA::AttributeDef * servant,
+ TAO_Operation_Details const * operation_details,
+ TAO::Argument * const args[])
+ : servant_ (servant)
+ , operation_details_ (operation_details)
+ , args_ (args)
+ {
+ }
+
+ virtual void execute (ACE_ENV_SINGLE_ARG_DECL)
+ {
+ TAO::SArg_Traits< ::CORBA::Object>::ret_arg_type retval =
+ TAO::Portable_Server::get_ret_arg< ::CORBA::Object> (
+ this->operation_details_,
+ this->args_);
+
+ retval =
+ this->servant_-> _get_component (
+ ACE_ENV_SINGLE_ARG_PARAMETER);
+ ACE_CHECK;
+ }
+
+ private:
+ POA_CORBA::AttributeDef * const servant_;
+ TAO_Operation_Details const * const operation_details_;
+ TAO::Argument * const * const args_;
+ };
+}
+
+
+void POA_CORBA::AttributeDef::_component_skel (
+ TAO_ServerRequest & server_request,
+ void * TAO_INTERCEPTOR (servant_upcall),
+ void * servant
+ ACE_ENV_ARG_DECL
+ )
+{
+#if TAO_HAS_INTERCEPTORS == 1
+ static ::CORBA::TypeCode_ptr const * const exceptions = 0;
+ static ::CORBA::ULong const nexceptions = 0;
+#endif /* TAO_HAS_INTERCEPTORS */
+
+ TAO::SArg_Traits< ::CORBA::Object>::ret_val retval;
+
+ TAO::Argument * const args[] =
+ {
+ &retval
+ };
+
+ static size_t const nargs = 1;
+
+ POA_CORBA::AttributeDef * const impl =
+ static_cast<POA_CORBA::AttributeDef *> (servant);
+
+ _get_component_AttributeDef_Upcall_Command command (
+ impl,
+ server_request.operation_details (),
+ args);
+
+ TAO::Upcall_Wrapper upcall_wrapper;
+ upcall_wrapper.upcall (server_request
+ , args
+ , nargs
+ , command
+#if TAO_HAS_INTERCEPTORS == 1
+ , servant_upcall
+ , exceptions
+ , nexceptions
+#endif /* TAO_HAS_INTERCEPTORS == 1 */
+ ACE_ENV_ARG_PARAMETER);
+ ACE_CHECK;
+}
+
+::CORBA::Boolean POA_CORBA::AttributeDef::_is_a (
+ const char* value
+ ACE_ENV_ARG_DECL_NOT_USED
+ )
+{
+ return
+ (
+ !ACE_OS::strcmp (
+ value,
+ "IDL:omg.org/CORBA/IRObject:1.0"
+ ) ||
+ !ACE_OS::strcmp (
+ value,
+ "IDL:omg.org/CORBA/Contained:1.0"
+ ) ||
+ !ACE_OS::strcmp (
+ value,
+ "IDL:omg.org/CORBA/AttributeDef:1.0"
+ ) ||
+ !ACE_OS::strcmp (
+ value,
+ "IDL:omg.org/CORBA/Object:1.0"
+ )
+ );
+}
+
+const char* POA_CORBA::AttributeDef::_interface_repository_id (void) const
+{
+ return "IDL:omg.org/CORBA/AttributeDef:1.0";
+}
+
+// TAO_IDL - Generated from
+// be\be_visitor_interface/interface_ss.cpp:903
+
+void POA_CORBA::AttributeDef::_dispatch (
+ TAO_ServerRequest & req,
+ void * servant_upcall
+ ACE_ENV_ARG_DECL
+ )
+{
+ this->synchronous_upcall_dispatch (req,
+ servant_upcall,
+ this
+ ACE_ENV_ARG_PARAMETER);
+}
+
+// TAO_IDL - Generated from
+// be\be_visitor_interface/interface_ss.cpp:851
+
+CORBA::AttributeDef *
+POA_CORBA::AttributeDef::_this (ACE_ENV_SINGLE_ARG_DECL)
+{
+ TAO_Stub *stub = this->_create_stub (ACE_ENV_SINGLE_ARG_PARAMETER);
+ ACE_CHECK_RETURN (0);
+
+ TAO_Stub_Auto_Ptr safe_stub (stub);
+ ::CORBA::Object_ptr tmp = CORBA::Object::_nil ();
+
+ ::CORBA::Boolean const _tao_opt_colloc =
+ stub->servant_orb_var ()->orb_core ()->optimize_collocation_objects ();
+
+ ACE_NEW_RETURN (
+ tmp,
+ ::CORBA::Object (stub, _tao_opt_colloc, this),
+ 0
+ );
+
+ ::CORBA::Object_var obj = tmp;
+ (void) safe_stub.release ();
+
+ typedef ::CORBA::AttributeDef STUB_SCOPED_NAME;
+ return
+ TAO::Narrow_Utils<STUB_SCOPED_NAME>::unchecked_narrow (
+ obj.in (),
+ CORBA__TAO_AttributeDef_Proxy_Broker_Factory_function_pointer
+ );
+}
+
+// TAO_IDL - Generated from
+// be\be_interface.cpp:1499
+
+class TAO_CORBA_ExtAttributeDef_Perfect_Hash_OpTable
+ : public TAO_Perfect_Hash_OpTable
+{
+private:
+ unsigned int hash (const char *str, unsigned int len);
+
+public:
+ const TAO_operation_db_entry * lookup (const char *str, unsigned int len);
+};
+
+/* C++ code produced by gperf version 2.8 (ACE version) */
+/* Command-line: C:\ACE\latest\ACE_wrappers\bin\gperf.exe -m -M -J -c -C -D -E -T -f 0 -F 0,0 -a -o -t -p -K opname -L C++ -Z TAO_CORBA_ExtAttributeDef_Perfect_Hash_OpTable -N lookup */
+unsigned int
+TAO_CORBA_ExtAttributeDef_Perfect_Hash_OpTable::hash (const char *str, unsigned int len)
+{
+ static const unsigned char asso_values[] =
+ {
+#if defined (ACE_MVS)
+ 44, 44, 44, 44, 44, 44, 44, 44, 44, 44,
+ 44, 44, 44, 44, 44, 44, 44, 44, 44, 44,
+ 44, 44, 44, 44, 44, 44, 44, 44, 44, 44,
+ 44, 44, 44, 44, 44, 44, 44, 44, 44, 44,
+ 44, 44, 44, 44, 44, 44, 44, 44, 44, 44,
+ 44, 44, 44, 44, 44, 44, 44, 44, 44, 44,
+ 44, 44, 44, 44, 44, 44, 44, 44, 44, 44,
+ 44, 44, 44, 44, 44, 44, 44, 44, 44, 44,
+ 44, 44, 44, 44, 44, 44, 44, 44, 44, 44,
+ 44, 44, 44, 44, 44, 44, 44, 44, 44, 44,
+ 44, 44, 44, 44, 44, 44, 44, 44, 44, 0,
+ 44, 44, 44, 44, 44, 44, 44, 44, 44, 44,
+ 44, 44, 44, 44, 44, 44, 44, 44, 44, 0,
+ 44, 44, 15, 0, 25, 44, 44, 44, 44, 44,
+ 44, 44, 44, 44, 44, 44, 44, 44, 0, 0,
+ 44, 44, 44, 44, 44, 44, 44, 44, 44, 44,
+ 44, 44, 0, 30, 44, 44, 44, 44, 5, 44,
+ 44, 44, 44, 44, 44, 44, 44, 44, 44, 44,
+ 44, 44, 44, 44, 44, 44, 44, 44, 44, 44,
+ 44, 44, 44, 44, 44, 44, 44, 44, 44, 44,
+ 44, 44, 44, 44, 44, 44, 44, 44, 44, 44,
+ 44, 44, 44, 44, 44, 44, 44, 44, 44, 44,
+ 44, 44, 44, 44, 44, 44, 44, 44, 44, 44,
+ 44, 44, 44, 44, 44, 44, 44, 44, 44, 44,
+ 44, 44, 44, 44, 44, 44, 44, 44, 44, 44,
+ 44, 44, 44, 44, 44, 44,
+#else
+ 44, 44, 44, 44, 44, 44, 44, 44, 44, 44,
+ 44, 44, 44, 44, 44, 44, 44, 44, 44, 44,
+ 44, 44, 44, 44, 44, 44, 44, 44, 44, 44,
+ 44, 44, 44, 44, 44, 44, 44, 44, 44, 44,
+ 44, 44, 44, 44, 44, 44, 44, 44, 44, 44,
+ 44, 44, 44, 44, 44, 44, 44, 44, 44, 44,
+ 44, 44, 44, 44, 44, 44, 44, 44, 44, 44,
+ 44, 44, 44, 44, 44, 44, 44, 44, 44, 44,
+ 44, 44, 44, 44, 44, 44, 44, 44, 44, 44,
+ 44, 44, 44, 44, 44, 0, 44, 0, 44, 44,
+ 15, 0, 25, 44, 44, 44, 44, 44, 44, 0,
+ 0, 44, 44, 44, 44, 0, 30, 44, 44, 44,
+ 44, 5, 44, 44, 44, 44, 44, 44,
+#endif /* ACE_MVS */
+ };
+ return len + asso_values[(int) str[len - 1]] + asso_values[(int) str[0]];
+}
+
+const TAO_operation_db_entry *
+TAO_CORBA_ExtAttributeDef_Perfect_Hash_OpTable::lookup (const char *str, unsigned int len)
+{
+ enum
+ {
+ TOTAL_KEYWORDS = 28,
+ MIN_WORD_LENGTH = 4,
+ MAX_WORD_LENGTH = 26,
+ MIN_HASH_VALUE = 4,
+ MAX_HASH_VALUE = 43,
+ HASH_VALUE_RANGE = 40,
+ DUPLICATES = 11,
+ WORDLIST_SIZE = 32
+ };
+
+ static const TAO_operation_db_entry wordlist[] =
+ {
+ {"",0,0},{"",0,0},{"",0,0},{"",0,0},
+ {"move", &POA_CORBA::ExtAttributeDef::move_skel, 0},
+ {"_is_a", &POA_CORBA::ExtAttributeDef::_is_a_skel, 0},
+ {"_get_name", &POA_CORBA::ExtAttributeDef::_get_name_skel, 0},
+ {"_set_mode", &POA_CORBA::ExtAttributeDef::_set_mode_skel, 0},
+ {"_get_mode", &POA_CORBA::ExtAttributeDef::_get_mode_skel, 0},
+ {"_get_type", &POA_CORBA::ExtAttributeDef::_get_type_skel, 0},
+ {"_set_name", &POA_CORBA::ExtAttributeDef::_set_name_skel, 0},
+ {"_interface", &POA_CORBA::ExtAttributeDef::_interface_skel, 0},
+ {"_get_version", &POA_CORBA::ExtAttributeDef::_get_version_skel, 0},
+ {"_set_version", &POA_CORBA::ExtAttributeDef::_set_version_skel, 0},
+ {"_get_defined_in", &POA_CORBA::ExtAttributeDef::_get_defined_in_skel, 0},
+ {"_get_absolute_name", &POA_CORBA::ExtAttributeDef::_get_absolute_name_skel, 0},
+ {"_get_get_exceptions", &POA_CORBA::ExtAttributeDef::_get_get_exceptions_skel, 0},
+ {"_set_set_exceptions", &POA_CORBA::ExtAttributeDef::_set_set_exceptions_skel, 0},
+ {"_get_set_exceptions", &POA_CORBA::ExtAttributeDef::_get_set_exceptions_skel, 0},
+ {"_set_get_exceptions", &POA_CORBA::ExtAttributeDef::_set_get_exceptions_skel, 0},
+ {"_get_id", &POA_CORBA::ExtAttributeDef::_get_id_skel, 0},
+ {"_set_id", &POA_CORBA::ExtAttributeDef::_set_id_skel, 0},
+ {"describe", &POA_CORBA::ExtAttributeDef::describe_skel, 0},
+ {"destroy", &POA_CORBA::ExtAttributeDef::destroy_skel, 0},
+ {"_get_def_kind", &POA_CORBA::ExtAttributeDef::_get_def_kind_skel, 0},
+ {"_repository_id", &POA_CORBA::ExtAttributeDef::_repository_id_skel, 0},
+ {"_get_containing_repository", &POA_CORBA::ExtAttributeDef::_get_containing_repository_skel, 0},
+ {"describe_attribute", &POA_CORBA::ExtAttributeDef::describe_attribute_skel, 0},
+ {"_get_type_def", &POA_CORBA::ExtAttributeDef::_get_type_def_skel, 0},
+ {"_set_type_def", &POA_CORBA::ExtAttributeDef::_set_type_def_skel, 0},
+ {"_component", &POA_CORBA::ExtAttributeDef::_component_skel, 0},
+ {"_non_existent", &POA_CORBA::ExtAttributeDef::_non_existent_skel, 0},
+ };
+
+ static const signed char lookup[] =
+ {
+ -1, -1, -6, -5, 4, 5, -1, -12, -2, -50, 11, -1, -48, -1,
+ -1, 14, -16, -4, 15, -46, -20, -2, -45, 22, -1, -1, -1, 23,
+ 24, 25, -1, 26, -1, 27, -1, -1, -28, -2, -45, -1, 30, -1,
+ -1, 31,
+ };
+
+ if (len <= MAX_WORD_LENGTH && len >= MIN_WORD_LENGTH)
+ {
+ unsigned int key = hash (str, len);
+
+ if (key <= MAX_HASH_VALUE && key >= MIN_HASH_VALUE)
+ {
+ int slot = lookup[key];
+
+ if (slot >= 0 && slot < WORDLIST_SIZE)
+ {
+ const char *s = wordlist[slot].opname;
+
+ if (*str == *s && !strncmp (str + 1, s + 1, len - 1))
+ return &wordlist[slot];
+ }
+ else if (slot < 0 && slot >= -MAX_HASH_VALUE)
+ return 0;
+ else
+ {
+ unsigned int offset = key + slot + (slot > 0 ? -MAX_HASH_VALUE : MAX_HASH_VALUE);
+ const TAO_operation_db_entry *base = &wordlist[-lookup[offset]];
+ const TAO_operation_db_entry *ptr = base + -lookup[offset + 1];
+
+ while (--ptr >= base)
+ if (*str == *ptr->opname && !strncmp (str + 1, ptr->opname + 1, len - 1))
+ return ptr;
+ }
+ }
+ }
+ return 0;
+}
+
+static TAO_CORBA_ExtAttributeDef_Perfect_Hash_OpTable tao_CORBA_ExtAttributeDef_optable;
+
+// TAO_IDL - Generated from
+// be\be_visitor_interface/interface_ss.cpp:966
+
+TAO::Collocation_Proxy_Broker *
+CORBA__TAO_ExtAttributeDef_Proxy_Broker_Factory_function ( ::CORBA::Object_ptr)
+{
+ return reinterpret_cast<TAO::Collocation_Proxy_Broker *> (0xdead); // Dummy
+}
+
+int
+CORBA__TAO_ExtAttributeDef_Proxy_Broker_Factory_Initializer (size_t)
+{
+ CORBA__TAO_ExtAttributeDef_Proxy_Broker_Factory_function_pointer =
+ CORBA__TAO_ExtAttributeDef_Proxy_Broker_Factory_function;
+
+ return 0;
+}
+
+static int
+CORBA__TAO_ExtAttributeDef_Proxy_Broker_Stub_Factory_Initializer_Scarecrow =
+ CORBA__TAO_ExtAttributeDef_Proxy_Broker_Factory_Initializer (
+ reinterpret_cast<size_t> (CORBA__TAO_ExtAttributeDef_Proxy_Broker_Factory_Initializer)
+ );
+
+// TAO_IDL - Generated from
+// be\be_visitor_interface/interface_ss.cpp:103
+
+POA_CORBA::ExtAttributeDef::ExtAttributeDef (void)
+ : TAO_ServantBase ()
+{
+ this->optable_ = &tao_CORBA_ExtAttributeDef_optable;
+}
+
+POA_CORBA::ExtAttributeDef::ExtAttributeDef (const ExtAttributeDef& rhs)
+ : TAO_Abstract_ServantBase (rhs),
+ TAO_ServantBase (rhs),
+ POA_CORBA::IRObject (rhs),
+ POA_CORBA::Contained (rhs),
+ POA_CORBA::AttributeDef (rhs)
+{
+}
+
+POA_CORBA::ExtAttributeDef::~ExtAttributeDef (void)
+{
+}namespace POA_CORBA
+{
+
+
+ // TAO_IDL - Generated from
+ // be\be_visitor_operation/upcall_command_ss.cpp:127
+
+ class _get_get_exceptions_ExtAttributeDef
+ : public TAO::Upcall_Command
+ {
+ public:
+ inline _get_get_exceptions_ExtAttributeDef (
+ POA_CORBA::ExtAttributeDef * servant,
+ TAO_Operation_Details const * operation_details,
+ TAO::Argument * const args[])
+ : servant_ (servant)
+ , operation_details_ (operation_details)
+ , args_ (args)
+ {
+ }
+
+ virtual void execute (ACE_ENV_SINGLE_ARG_DECL)
+ {
+ TAO::SArg_Traits< ::CORBA::ExcDescriptionSeq>::ret_arg_type retval =
+ TAO::Portable_Server::get_ret_arg< ::CORBA::ExcDescriptionSeq> (
+ this->operation_details_,
+ this->args_);
+
+ retval =
+ this->servant_->get_exceptions (
+ ACE_ENV_SINGLE_ARG_PARAMETER);
+ ACE_CHECK;
+ }
+
+ private:
+ POA_CORBA::ExtAttributeDef * const servant_;
+ TAO_Operation_Details const * const operation_details_;
+ TAO::Argument * const * const args_;
+ };
+}
+
+
+// TAO_IDL - Generated from
+// be\be_visitor_operation/operation_ss.cpp:190
+
+void POA_CORBA::ExtAttributeDef::_get_get_exceptions_skel (
+ TAO_ServerRequest & server_request,
+ void * TAO_INTERCEPTOR (servant_upcall),
+ void * servant
+ ACE_ENV_ARG_DECL
+ )
+{
+#if TAO_HAS_INTERCEPTORS == 1
+ static ::CORBA::TypeCode_ptr const * const exceptions = 0;
+ static ::CORBA::ULong const nexceptions = 0;
+#endif /* TAO_HAS_INTERCEPTORS */
+
+ TAO::SArg_Traits< ::CORBA::ExcDescriptionSeq>::ret_val retval;
+
+ TAO::Argument * const args[] =
+ {
+ &retval
+ };
+
+ static size_t const nargs = 1;
+
+ POA_CORBA::ExtAttributeDef * const impl =
+ static_cast<POA_CORBA::ExtAttributeDef *> (servant);
+
+ _get_get_exceptions_ExtAttributeDef command (
+ impl,
+ server_request.operation_details (),
+ args);
+
+ TAO::Upcall_Wrapper upcall_wrapper;
+ upcall_wrapper.upcall (server_request
+ , args
+ , nargs
+ , command
+#if TAO_HAS_INTERCEPTORS == 1
+ , servant_upcall
+ , exceptions
+ , nexceptions
+#endif /* TAO_HAS_INTERCEPTORS == 1 */
+ ACE_ENV_ARG_PARAMETER);
+ ACE_CHECK;
+}namespace POA_CORBA
+{
+
+
+ // TAO_IDL - Generated from
+ // be\be_visitor_operation/upcall_command_ss.cpp:127
+
+ class _set_get_exceptions_ExtAttributeDef
+ : public TAO::Upcall_Command
+ {
+ public:
+ inline _set_get_exceptions_ExtAttributeDef (
+ POA_CORBA::ExtAttributeDef * servant,
+ TAO_Operation_Details const * operation_details,
+ TAO::Argument * const args[])
+ : servant_ (servant)
+ , operation_details_ (operation_details)
+ , args_ (args)
+ {
+ }
+
+ virtual void execute (ACE_ENV_SINGLE_ARG_DECL)
+ {
+ TAO::SArg_Traits< ::CORBA::ExcDescriptionSeq>::in_arg_type arg_1 =
+ TAO::Portable_Server::get_in_arg< ::CORBA::ExcDescriptionSeq> (
+ this->operation_details_,
+ this->args_,
+ 1);
+
+ this->servant_->get_exceptions (
+ arg_1
+ ACE_ENV_ARG_PARAMETER);
+ ACE_CHECK;
+ }
+
+ private:
+ POA_CORBA::ExtAttributeDef * const servant_;
+ TAO_Operation_Details const * const operation_details_;
+ TAO::Argument * const * const args_;
+ };
+}
+
+
+// TAO_IDL - Generated from
+// be\be_visitor_operation/operation_ss.cpp:190
+
+void POA_CORBA::ExtAttributeDef::_set_get_exceptions_skel (
+ TAO_ServerRequest & server_request,
+ void * TAO_INTERCEPTOR (servant_upcall),
+ void * servant
+ ACE_ENV_ARG_DECL
+ )
+{
+#if TAO_HAS_INTERCEPTORS == 1
+ static ::CORBA::TypeCode_ptr const * const exceptions = 0;
+ static ::CORBA::ULong const nexceptions = 0;
+#endif /* TAO_HAS_INTERCEPTORS */
+
+ TAO::SArg_Traits< void>::ret_val retval;
+ TAO::SArg_Traits< ::CORBA::ExcDescriptionSeq>::in_arg_val _tao_get_exceptions;
+
+ TAO::Argument * const args[] =
+ {
+ &retval,
+ &_tao_get_exceptions
+ };
+
+ static size_t const nargs = 2;
+
+ POA_CORBA::ExtAttributeDef * const impl =
+ static_cast<POA_CORBA::ExtAttributeDef *> (servant);
+
+ _set_get_exceptions_ExtAttributeDef command (
+ impl,
+ server_request.operation_details (),
+ args);
+
+ TAO::Upcall_Wrapper upcall_wrapper;
+ upcall_wrapper.upcall (server_request
+ , args
+ , nargs
+ , command
+#if TAO_HAS_INTERCEPTORS == 1
+ , servant_upcall
+ , exceptions
+ , nexceptions
+#endif /* TAO_HAS_INTERCEPTORS == 1 */
+ ACE_ENV_ARG_PARAMETER);
+ ACE_CHECK;
+}namespace POA_CORBA
+{
+
+
+ // TAO_IDL - Generated from
+ // be\be_visitor_operation/upcall_command_ss.cpp:127
+
+ class _get_set_exceptions_ExtAttributeDef
+ : public TAO::Upcall_Command
+ {
+ public:
+ inline _get_set_exceptions_ExtAttributeDef (
+ POA_CORBA::ExtAttributeDef * servant,
+ TAO_Operation_Details const * operation_details,
+ TAO::Argument * const args[])
+ : servant_ (servant)
+ , operation_details_ (operation_details)
+ , args_ (args)
+ {
+ }
+
+ virtual void execute (ACE_ENV_SINGLE_ARG_DECL)
+ {
+ TAO::SArg_Traits< ::CORBA::ExcDescriptionSeq>::ret_arg_type retval =
+ TAO::Portable_Server::get_ret_arg< ::CORBA::ExcDescriptionSeq> (
+ this->operation_details_,
+ this->args_);
+
+ retval =
+ this->servant_->set_exceptions (
+ ACE_ENV_SINGLE_ARG_PARAMETER);
+ ACE_CHECK;
+ }
+
+ private:
+ POA_CORBA::ExtAttributeDef * const servant_;
+ TAO_Operation_Details const * const operation_details_;
+ TAO::Argument * const * const args_;
+ };
+}
+
+
+// TAO_IDL - Generated from
+// be\be_visitor_operation/operation_ss.cpp:190
+
+void POA_CORBA::ExtAttributeDef::_get_set_exceptions_skel (
+ TAO_ServerRequest & server_request,
+ void * TAO_INTERCEPTOR (servant_upcall),
+ void * servant
+ ACE_ENV_ARG_DECL
+ )
+{
+#if TAO_HAS_INTERCEPTORS == 1
+ static ::CORBA::TypeCode_ptr const * const exceptions = 0;
+ static ::CORBA::ULong const nexceptions = 0;
+#endif /* TAO_HAS_INTERCEPTORS */
+
+ TAO::SArg_Traits< ::CORBA::ExcDescriptionSeq>::ret_val retval;
+
+ TAO::Argument * const args[] =
+ {
+ &retval
+ };
+
+ static size_t const nargs = 1;
+
+ POA_CORBA::ExtAttributeDef * const impl =
+ static_cast<POA_CORBA::ExtAttributeDef *> (servant);
+
+ _get_set_exceptions_ExtAttributeDef command (
+ impl,
+ server_request.operation_details (),
+ args);
+
+ TAO::Upcall_Wrapper upcall_wrapper;
+ upcall_wrapper.upcall (server_request
+ , args
+ , nargs
+ , command
+#if TAO_HAS_INTERCEPTORS == 1
+ , servant_upcall
+ , exceptions
+ , nexceptions
+#endif /* TAO_HAS_INTERCEPTORS == 1 */
+ ACE_ENV_ARG_PARAMETER);
+ ACE_CHECK;
+}namespace POA_CORBA
+{
+
+
+ // TAO_IDL - Generated from
+ // be\be_visitor_operation/upcall_command_ss.cpp:127
+
+ class _set_set_exceptions_ExtAttributeDef
+ : public TAO::Upcall_Command
+ {
+ public:
+ inline _set_set_exceptions_ExtAttributeDef (
+ POA_CORBA::ExtAttributeDef * servant,
+ TAO_Operation_Details const * operation_details,
+ TAO::Argument * const args[])
+ : servant_ (servant)
+ , operation_details_ (operation_details)
+ , args_ (args)
+ {
+ }
+
+ virtual void execute (ACE_ENV_SINGLE_ARG_DECL)
+ {
+ TAO::SArg_Traits< ::CORBA::ExcDescriptionSeq>::in_arg_type arg_1 =
+ TAO::Portable_Server::get_in_arg< ::CORBA::ExcDescriptionSeq> (
+ this->operation_details_,
+ this->args_,
+ 1);
+
+ this->servant_->set_exceptions (
+ arg_1
+ ACE_ENV_ARG_PARAMETER);
+ ACE_CHECK;
+ }
+
+ private:
+ POA_CORBA::ExtAttributeDef * const servant_;
+ TAO_Operation_Details const * const operation_details_;
+ TAO::Argument * const * const args_;
+ };
+}
+
+
+// TAO_IDL - Generated from
+// be\be_visitor_operation/operation_ss.cpp:190
+
+void POA_CORBA::ExtAttributeDef::_set_set_exceptions_skel (
+ TAO_ServerRequest & server_request,
+ void * TAO_INTERCEPTOR (servant_upcall),
+ void * servant
+ ACE_ENV_ARG_DECL
+ )
+{
+#if TAO_HAS_INTERCEPTORS == 1
+ static ::CORBA::TypeCode_ptr const * const exceptions = 0;
+ static ::CORBA::ULong const nexceptions = 0;
+#endif /* TAO_HAS_INTERCEPTORS */
+
+ TAO::SArg_Traits< void>::ret_val retval;
+ TAO::SArg_Traits< ::CORBA::ExcDescriptionSeq>::in_arg_val _tao_set_exceptions;
+
+ TAO::Argument * const args[] =
+ {
+ &retval,
+ &_tao_set_exceptions
+ };
+
+ static size_t const nargs = 2;
+
+ POA_CORBA::ExtAttributeDef * const impl =
+ static_cast<POA_CORBA::ExtAttributeDef *> (servant);
+
+ _set_set_exceptions_ExtAttributeDef command (
+ impl,
+ server_request.operation_details (),
+ args);
+
+ TAO::Upcall_Wrapper upcall_wrapper;
+ upcall_wrapper.upcall (server_request
+ , args
+ , nargs
+ , command
+#if TAO_HAS_INTERCEPTORS == 1
+ , servant_upcall
+ , exceptions
+ , nexceptions
+#endif /* TAO_HAS_INTERCEPTORS == 1 */
+ ACE_ENV_ARG_PARAMETER);
+ ACE_CHECK;
+}namespace POA_CORBA
+{
+
+
+ // TAO_IDL - Generated from
+ // be\be_visitor_operation/upcall_command_ss.cpp:127
+
+ class describe_attribute_ExtAttributeDef
+ : public TAO::Upcall_Command
+ {
+ public:
+ inline describe_attribute_ExtAttributeDef (
+ POA_CORBA::ExtAttributeDef * servant,
+ TAO_Operation_Details const * operation_details,
+ TAO::Argument * const args[])
+ : servant_ (servant)
+ , operation_details_ (operation_details)
+ , args_ (args)
+ {
+ }
+
+ virtual void execute (ACE_ENV_SINGLE_ARG_DECL)
+ {
+ TAO::SArg_Traits< ::CORBA::ExtAttributeDescription>::ret_arg_type retval =
+ TAO::Portable_Server::get_ret_arg< ::CORBA::ExtAttributeDescription> (
+ this->operation_details_,
+ this->args_);
+
+ retval =
+ this->servant_->describe_attribute (
+ ACE_ENV_SINGLE_ARG_PARAMETER);
+ ACE_CHECK;
+ }
+
+ private:
+ POA_CORBA::ExtAttributeDef * const servant_;
+ TAO_Operation_Details const * const operation_details_;
+ TAO::Argument * const * const args_;
+ };
+}
+
+
+// TAO_IDL - Generated from
+// be\be_visitor_operation/operation_ss.cpp:190
+
+void POA_CORBA::ExtAttributeDef::describe_attribute_skel (
+ TAO_ServerRequest & server_request,
+ void * TAO_INTERCEPTOR (servant_upcall),
+ void * servant
+ ACE_ENV_ARG_DECL
+ )
+{
+#if TAO_HAS_INTERCEPTORS == 1
+ static ::CORBA::TypeCode_ptr const * const exceptions = 0;
+ static ::CORBA::ULong const nexceptions = 0;
+#endif /* TAO_HAS_INTERCEPTORS */
+
+ TAO::SArg_Traits< ::CORBA::ExtAttributeDescription>::ret_val retval;
+
+ TAO::Argument * const args[] =
+ {
+ &retval
+ };
+
+ static size_t const nargs = 1;
+
+ POA_CORBA::ExtAttributeDef * const impl =
+ static_cast<POA_CORBA::ExtAttributeDef *> (servant);
+
+ describe_attribute_ExtAttributeDef command (
+ impl,
+ server_request.operation_details (),
+ args);
+
+ TAO::Upcall_Wrapper upcall_wrapper;
+ upcall_wrapper.upcall (server_request
+ , args
+ , nargs
+ , command
+#if TAO_HAS_INTERCEPTORS == 1
+ , servant_upcall
+ , exceptions
+ , nexceptions
+#endif /* TAO_HAS_INTERCEPTORS == 1 */
+ ACE_ENV_ARG_PARAMETER);
+ ACE_CHECK;
+}
+
+// TAO_IDL - Generated from
+// be\be_visitor_interface/interface_ss.cpp:169
+
+namespace POA_CORBA
+{
+
+
+ // TAO_IDL - Generated from
+ // be\be_visitor_operation/upcall_command_ss.cpp:127
+
+ class _is_a_ExtAttributeDef_Upcall_Command
+ : public TAO::Upcall_Command
+ {
+ public:
+ inline _is_a_ExtAttributeDef_Upcall_Command (
+ POA_CORBA::ExtAttributeDef * servant,
+ TAO_Operation_Details const * operation_details,
+ TAO::Argument * const args[])
+ : servant_ (servant)
+ , operation_details_ (operation_details)
+ , args_ (args)
+ {
+ }
+
+ virtual void execute (ACE_ENV_SINGLE_ARG_DECL)
+ {
+ TAO::SArg_Traits< ::ACE_InputCDR::to_boolean>::ret_arg_type retval =
+ TAO::Portable_Server::get_ret_arg< ::ACE_InputCDR::to_boolean> (
+ this->operation_details_,
+ this->args_);
+
+ TAO::SArg_Traits< ::CORBA::Char *>::in_arg_type arg_1 =
+ TAO::Portable_Server::get_in_arg< ::CORBA::Char *> (
+ this->operation_details_,
+ this->args_,
+ 1);
+
+ retval =
+ this->servant_-> _is_a (
+ arg_1
+ ACE_ENV_ARG_PARAMETER);
+ ACE_CHECK;
+ }
+
+ private:
+ POA_CORBA::ExtAttributeDef * const servant_;
+ TAO_Operation_Details const * const operation_details_;
+ TAO::Argument * const * const args_;
+ };
+}
+
+
+void POA_CORBA::ExtAttributeDef::_is_a_skel (
+ TAO_ServerRequest & server_request,
+ void * TAO_INTERCEPTOR (servant_upcall),
+ void * servant
+ ACE_ENV_ARG_DECL
+ )
+{
+#if TAO_HAS_INTERCEPTORS == 1
+ static ::CORBA::TypeCode_ptr const * const exceptions = 0;
+ static ::CORBA::ULong const nexceptions = 0;
+#endif /* TAO_HAS_INTERCEPTORS */
+
+ TAO::SArg_Traits< ::ACE_InputCDR::to_boolean>::ret_val retval;
+ TAO::SArg_Traits< ::CORBA::Char *>::in_arg_val _tao_repository_id;
+
+ TAO::Argument * const args[] =
+ {
+ &retval,
+ &_tao_repository_id
+ };
+
+ static size_t const nargs = 2;
+
+ POA_CORBA::ExtAttributeDef * const impl =
+ static_cast<POA_CORBA::ExtAttributeDef *> (servant);
+
+ _is_a_ExtAttributeDef_Upcall_Command command (
+ impl,
+ server_request.operation_details (),
+ args);
+
+ TAO::Upcall_Wrapper upcall_wrapper;
+ upcall_wrapper.upcall (server_request
+ , args
+ , nargs
+ , command
+#if TAO_HAS_INTERCEPTORS == 1
+ , servant_upcall
+ , exceptions
+ , nexceptions
+#endif /* TAO_HAS_INTERCEPTORS == 1 */
+ ACE_ENV_ARG_PARAMETER);
+ ACE_CHECK;
+}namespace POA_CORBA
+{
+
+
+ // TAO_IDL - Generated from
+ // be\be_visitor_operation/upcall_command_ss.cpp:127
+
+ class _non_existent_ExtAttributeDef_Upcall_Command
+ : public TAO::Upcall_Command
+ {
+ public:
+ inline _non_existent_ExtAttributeDef_Upcall_Command (
+ POA_CORBA::ExtAttributeDef * servant,
+ TAO_Operation_Details const * operation_details,
+ TAO::Argument * const args[])
+ : servant_ (servant)
+ , operation_details_ (operation_details)
+ , args_ (args)
+ {
+ }
+
+ virtual void execute (ACE_ENV_SINGLE_ARG_DECL)
+ {
+ TAO::SArg_Traits< ::ACE_InputCDR::to_boolean>::ret_arg_type retval =
+ TAO::Portable_Server::get_ret_arg< ::ACE_InputCDR::to_boolean> (
+ this->operation_details_,
+ this->args_);
+
+ retval =
+ this->servant_-> _non_existent (
+ ACE_ENV_SINGLE_ARG_PARAMETER);
+ ACE_CHECK;
+ }
+
+ private:
+ POA_CORBA::ExtAttributeDef * const servant_;
+ TAO_Operation_Details const * const operation_details_;
+ TAO::Argument * const * const args_;
+ };
+}
+
+
+void POA_CORBA::ExtAttributeDef::_non_existent_skel (
+ TAO_ServerRequest & server_request,
+ void * TAO_INTERCEPTOR (servant_upcall),
+ void * servant
+ ACE_ENV_ARG_DECL
+ )
+{
+#if TAO_HAS_INTERCEPTORS == 1
+ static ::CORBA::TypeCode_ptr const * const exceptions = 0;
+ static ::CORBA::ULong const nexceptions = 0;
+#endif /* TAO_HAS_INTERCEPTORS */
+
+ TAO::SArg_Traits< ::ACE_InputCDR::to_boolean>::ret_val retval;
+
+ TAO::Argument * const args[] =
+ {
+ &retval
+ };
+
+ static size_t const nargs = 1;
+
+ POA_CORBA::ExtAttributeDef * const impl =
+ static_cast<POA_CORBA::ExtAttributeDef *> (servant);
+
+ _non_existent_ExtAttributeDef_Upcall_Command command (
+ impl,
+ server_request.operation_details (),
+ args);
+
+ TAO::Upcall_Wrapper upcall_wrapper;
+ upcall_wrapper.upcall (server_request
+ , args
+ , nargs
+ , command
+#if TAO_HAS_INTERCEPTORS == 1
+ , servant_upcall
+ , exceptions
+ , nexceptions
+#endif /* TAO_HAS_INTERCEPTORS == 1 */
+ ACE_ENV_ARG_PARAMETER);
+ ACE_CHECK;
+}namespace POA_CORBA
+{
+
+
+ // TAO_IDL - Generated from
+ // be\be_visitor_operation/upcall_command_ss.cpp:127
+
+ class _repository_id_ExtAttributeDef_Upcall_Command
+ : public TAO::Upcall_Command
+ {
+ public:
+ inline _repository_id_ExtAttributeDef_Upcall_Command (
+ POA_CORBA::ExtAttributeDef * servant,
+ TAO_Operation_Details const * operation_details,
+ TAO::Argument * const args[])
+ : servant_ (servant)
+ , operation_details_ (operation_details)
+ , args_ (args)
+ {
+ }
+
+ virtual void execute (ACE_ENV_SINGLE_ARG_DECL)
+ {
+ TAO::SArg_Traits< ::CORBA::Char *>::ret_arg_type retval =
+ TAO::Portable_Server::get_ret_arg< ::CORBA::Char *> (
+ this->operation_details_,
+ this->args_);
+
+ retval =
+ this->servant_-> _repository_id (
+ ACE_ENV_SINGLE_ARG_PARAMETER);
+ ACE_CHECK;
+ }
+
+ private:
+ POA_CORBA::ExtAttributeDef * const servant_;
+ TAO_Operation_Details const * const operation_details_;
+ TAO::Argument * const * const args_;
+ };
+}
+
+
+void POA_CORBA::ExtAttributeDef::_repository_id_skel (
+ TAO_ServerRequest & server_request,
+ void * TAO_INTERCEPTOR (servant_upcall),
+ void * servant
+ ACE_ENV_ARG_DECL
+ )
+{
+#if TAO_HAS_INTERCEPTORS == 1
+ static ::CORBA::TypeCode_ptr const * const exceptions = 0;
+ static ::CORBA::ULong const nexceptions = 0;
+#endif /* TAO_HAS_INTERCEPTORS */
+
+ TAO::SArg_Traits< ::CORBA::Char *>::ret_val retval;
+
+ TAO::Argument * const args[] =
+ {
+ &retval
+ };
+
+ static size_t const nargs = 1;
+
+ POA_CORBA::ExtAttributeDef * const impl =
+ static_cast<POA_CORBA::ExtAttributeDef *> (servant);
+
+ _repository_id_ExtAttributeDef_Upcall_Command command (
+ impl,
+ server_request.operation_details (),
+ args);
+
+ TAO::Upcall_Wrapper upcall_wrapper;
+ upcall_wrapper.upcall (server_request
+ , args
+ , nargs
+ , command
+#if TAO_HAS_INTERCEPTORS == 1
+ , servant_upcall
+ , exceptions
+ , nexceptions
+#endif /* TAO_HAS_INTERCEPTORS == 1 */
+ ACE_ENV_ARG_PARAMETER);
+ ACE_CHECK;
+}
+
+// TAO_IDL - Generated from
+// be\be_visitor_interface/interface_ss.cpp:513
+
+void POA_CORBA::ExtAttributeDef::_interface_skel (
+ TAO_ServerRequest & server_request,
+ void * /* servant_upcall */,
+ void * servant
+ ACE_ENV_ARG_DECL
+ )
+{
+ TAO_IFR_Client_Adapter *_tao_adapter =
+ ACE_Dynamic_Service<TAO_IFR_Client_Adapter>::instance (
+ TAO_ORB_Core::ifr_client_adapter_name ()
+ );
+
+ if (_tao_adapter == 0)
+ {
+ ACE_THROW ( ::CORBA::INTF_REPOS ( ::CORBA::OMGVMCID | 1,
+ ::CORBA::COMPLETED_NO));
+ }
+
+ POA_CORBA::ExtAttributeDef * const impl =
+ static_cast<POA_CORBA::ExtAttributeDef *> (servant);
+ ::CORBA::InterfaceDef_ptr _tao_retval =
+ impl->_get_interface (ACE_ENV_SINGLE_ARG_PARAMETER);
+ ACE_CHECK;
+
+ server_request.init_reply ();
+ TAO_OutputCDR &_tao_out = *server_request.outgoing ();
+
+ ::CORBA::Boolean const _tao_result =
+ _tao_adapter->interfacedef_cdr_insert (
+ _tao_out,
+ _tao_retval
+ );
+
+ _tao_adapter->dispose (_tao_retval);
+
+ if (_tao_result == false)
+ {
+ ACE_THROW ( ::CORBA::MARSHAL ());
+ }
+}namespace POA_CORBA
+{
+
+
+ // TAO_IDL - Generated from
+ // be\be_visitor_operation/upcall_command_ss.cpp:127
+
+ class _get_component_ExtAttributeDef_Upcall_Command
+ : public TAO::Upcall_Command
+ {
+ public:
+ inline _get_component_ExtAttributeDef_Upcall_Command (
+ POA_CORBA::ExtAttributeDef * servant,
+ TAO_Operation_Details const * operation_details,
+ TAO::Argument * const args[])
+ : servant_ (servant)
+ , operation_details_ (operation_details)
+ , args_ (args)
+ {
+ }
+
+ virtual void execute (ACE_ENV_SINGLE_ARG_DECL)
+ {
+ TAO::SArg_Traits< ::CORBA::Object>::ret_arg_type retval =
+ TAO::Portable_Server::get_ret_arg< ::CORBA::Object> (
+ this->operation_details_,
+ this->args_);
+
+ retval =
+ this->servant_-> _get_component (
+ ACE_ENV_SINGLE_ARG_PARAMETER);
+ ACE_CHECK;
+ }
+
+ private:
+ POA_CORBA::ExtAttributeDef * const servant_;
+ TAO_Operation_Details const * const operation_details_;
+ TAO::Argument * const * const args_;
+ };
+}
+
+
+void POA_CORBA::ExtAttributeDef::_component_skel (
+ TAO_ServerRequest & server_request,
+ void * TAO_INTERCEPTOR (servant_upcall),
+ void * servant
+ ACE_ENV_ARG_DECL
+ )
+{
+#if TAO_HAS_INTERCEPTORS == 1
+ static ::CORBA::TypeCode_ptr const * const exceptions = 0;
+ static ::CORBA::ULong const nexceptions = 0;
+#endif /* TAO_HAS_INTERCEPTORS */
+
+ TAO::SArg_Traits< ::CORBA::Object>::ret_val retval;
+
+ TAO::Argument * const args[] =
+ {
+ &retval
+ };
+
+ static size_t const nargs = 1;
+
+ POA_CORBA::ExtAttributeDef * const impl =
+ static_cast<POA_CORBA::ExtAttributeDef *> (servant);
+
+ _get_component_ExtAttributeDef_Upcall_Command command (
+ impl,
+ server_request.operation_details (),
+ args);
+
+ TAO::Upcall_Wrapper upcall_wrapper;
+ upcall_wrapper.upcall (server_request
+ , args
+ , nargs
+ , command
+#if TAO_HAS_INTERCEPTORS == 1
+ , servant_upcall
+ , exceptions
+ , nexceptions
+#endif /* TAO_HAS_INTERCEPTORS == 1 */
+ ACE_ENV_ARG_PARAMETER);
+ ACE_CHECK;
+}
+
+::CORBA::Boolean POA_CORBA::ExtAttributeDef::_is_a (
+ const char* value
+ ACE_ENV_ARG_DECL_NOT_USED
+ )
+{
+ return
+ (
+ !ACE_OS::strcmp (
+ value,
+ "IDL:omg.org/CORBA/IRObject:1.0"
+ ) ||
+ !ACE_OS::strcmp (
+ value,
+ "IDL:omg.org/CORBA/Contained:1.0"
+ ) ||
+ !ACE_OS::strcmp (
+ value,
+ "IDL:omg.org/CORBA/AttributeDef:1.0"
+ ) ||
+ !ACE_OS::strcmp (
+ value,
+ "IDL:omg.org/CORBA/ExtAttributeDef:1.0"
+ ) ||
+ !ACE_OS::strcmp (
+ value,
+ "IDL:omg.org/CORBA/Object:1.0"
+ )
+ );
+}
+
+const char* POA_CORBA::ExtAttributeDef::_interface_repository_id (void) const
+{
+ return "IDL:omg.org/CORBA/ExtAttributeDef:1.0";
+}
+
+// TAO_IDL - Generated from
+// be\be_visitor_interface/interface_ss.cpp:903
+
+void POA_CORBA::ExtAttributeDef::_dispatch (
+ TAO_ServerRequest & req,
+ void * servant_upcall
+ ACE_ENV_ARG_DECL
+ )
+{
+ this->synchronous_upcall_dispatch (req,
+ servant_upcall,
+ this
+ ACE_ENV_ARG_PARAMETER);
+}
+
+// TAO_IDL - Generated from
+// be\be_visitor_interface/interface_ss.cpp:851
+
+CORBA::ExtAttributeDef *
+POA_CORBA::ExtAttributeDef::_this (ACE_ENV_SINGLE_ARG_DECL)
+{
+ TAO_Stub *stub = this->_create_stub (ACE_ENV_SINGLE_ARG_PARAMETER);
+ ACE_CHECK_RETURN (0);
+
+ TAO_Stub_Auto_Ptr safe_stub (stub);
+ ::CORBA::Object_ptr tmp = CORBA::Object::_nil ();
+
+ ::CORBA::Boolean const _tao_opt_colloc =
+ stub->servant_orb_var ()->orb_core ()->optimize_collocation_objects ();
+
+ ACE_NEW_RETURN (
+ tmp,
+ ::CORBA::Object (stub, _tao_opt_colloc, this),
+ 0
+ );
+
+ ::CORBA::Object_var obj = tmp;
+ (void) safe_stub.release ();
+
+ typedef ::CORBA::ExtAttributeDef STUB_SCOPED_NAME;
+ return
+ TAO::Narrow_Utils<STUB_SCOPED_NAME>::unchecked_narrow (
+ obj.in (),
+ CORBA__TAO_ExtAttributeDef_Proxy_Broker_Factory_function_pointer
+ );
+}
+
+// TAO_IDL - Generated from
+// be\be_interface.cpp:1499
+
+class TAO_CORBA_OperationDef_Perfect_Hash_OpTable
+ : public TAO_Perfect_Hash_OpTable
+{
+private:
+ unsigned int hash (const char *str, unsigned int len);
+
+public:
+ const TAO_operation_db_entry * lookup (const char *str, unsigned int len);
+};
+
+/* C++ code produced by gperf version 2.8 (ACE version) */
+/* Command-line: C:\ACE\latest\ACE_wrappers\bin\gperf.exe -m -M -J -c -C -D -E -T -f 0 -F 0,0 -a -o -t -p -K opname -L C++ -Z TAO_CORBA_OperationDef_Perfect_Hash_OpTable -N lookup */
+unsigned int
+TAO_CORBA_OperationDef_Perfect_Hash_OpTable::hash (const char *str, unsigned int len)
+{
+ static const unsigned char asso_values[] =
+ {
+#if defined (ACE_MVS)
+ 37, 37, 37, 37, 37, 37, 37, 37, 37, 37,
+ 37, 37, 37, 37, 37, 37, 37, 37, 37, 37,
+ 37, 37, 37, 37, 37, 37, 37, 37, 37, 37,
+ 37, 37, 37, 37, 37, 37, 37, 37, 37, 37,
+ 37, 37, 37, 37, 37, 37, 37, 37, 37, 37,
+ 37, 37, 37, 37, 37, 37, 37, 37, 37, 37,
+ 37, 37, 37, 37, 37, 37, 37, 37, 37, 37,
+ 37, 37, 37, 37, 37, 37, 37, 37, 37, 37,
+ 37, 37, 37, 37, 37, 37, 37, 37, 37, 37,
+ 37, 37, 37, 37, 37, 37, 37, 37, 37, 37,
+ 37, 37, 37, 37, 37, 37, 37, 37, 37, 0,
+ 37, 37, 37, 37, 37, 37, 37, 37, 37, 37,
+ 37, 37, 37, 37, 37, 37, 37, 37, 37, 0,
+ 37, 37, 15, 0, 10, 37, 37, 37, 37, 37,
+ 37, 37, 37, 37, 37, 37, 37, 37, 0, 5,
+ 37, 37, 37, 37, 37, 37, 37, 37, 37, 37,
+ 37, 37, 0, 20, 37, 37, 37, 37, 10, 37,
+ 37, 37, 37, 37, 37, 37, 37, 37, 37, 37,
+ 37, 37, 37, 37, 37, 37, 37, 37, 37, 37,
+ 37, 37, 37, 37, 37, 37, 37, 37, 37, 37,
+ 37, 37, 37, 37, 37, 37, 37, 37, 37, 37,
+ 37, 37, 37, 37, 37, 37, 37, 37, 37, 37,
+ 37, 37, 37, 37, 37, 37, 37, 37, 37, 37,
+ 37, 37, 37, 37, 37, 37, 37, 37, 37, 37,
+ 37, 37, 37, 37, 37, 37, 37, 37, 37, 37,
+ 37, 37, 37, 37, 37, 37,
+#else
+ 37, 37, 37, 37, 37, 37, 37, 37, 37, 37,
+ 37, 37, 37, 37, 37, 37, 37, 37, 37, 37,
+ 37, 37, 37, 37, 37, 37, 37, 37, 37, 37,
+ 37, 37, 37, 37, 37, 37, 37, 37, 37, 37,
+ 37, 37, 37, 37, 37, 37, 37, 37, 37, 37,
+ 37, 37, 37, 37, 37, 37, 37, 37, 37, 37,
+ 37, 37, 37, 37, 37, 37, 37, 37, 37, 37,
+ 37, 37, 37, 37, 37, 37, 37, 37, 37, 37,
+ 37, 37, 37, 37, 37, 37, 37, 37, 37, 37,
+ 37, 37, 37, 37, 37, 0, 37, 0, 37, 37,
+ 15, 0, 10, 37, 37, 37, 37, 37, 37, 0,
+ 5, 37, 37, 37, 37, 0, 20, 37, 37, 37,
+ 37, 10, 37, 37, 37, 37, 37, 37,
+#endif /* ACE_MVS */
+ };
+ return len + asso_values[(int) str[len - 1]] + asso_values[(int) str[0]];
+}
+
+const TAO_operation_db_entry *
+TAO_CORBA_OperationDef_Perfect_Hash_OpTable::lookup (const char *str, unsigned int len)
+{
+ enum
+ {
+ TOTAL_KEYWORDS = 29,
+ MIN_WORD_LENGTH = 4,
+ MAX_WORD_LENGTH = 26,
+ MIN_HASH_VALUE = 4,
+ MAX_HASH_VALUE = 36,
+ HASH_VALUE_RANGE = 33,
+ DUPLICATES = 10,
+ WORDLIST_SIZE = 33
+ };
+
+ static const TAO_operation_db_entry wordlist[] =
+ {
+ {"",0,0},{"",0,0},{"",0,0},{"",0,0},
+ {"move", &POA_CORBA::OperationDef::move_skel, 0},
+ {"_is_a", &POA_CORBA::OperationDef::_is_a_skel, 0},
+ {"_get_name", &POA_CORBA::OperationDef::_get_name_skel, 0},
+ {"_set_mode", &POA_CORBA::OperationDef::_set_mode_skel, 0},
+ {"_get_mode", &POA_CORBA::OperationDef::_get_mode_skel, 0},
+ {"_set_name", &POA_CORBA::OperationDef::_set_name_skel, 0},
+ {"_interface", &POA_CORBA::OperationDef::_interface_skel, 0},
+ {"_get_params", &POA_CORBA::OperationDef::_get_params_skel, 0},
+ {"_set_params", &POA_CORBA::OperationDef::_set_params_skel, 0},
+ {"_get_contexts", &POA_CORBA::OperationDef::_get_contexts_skel, 0},
+ {"_set_contexts", &POA_CORBA::OperationDef::_set_contexts_skel, 0},
+ {"_get_exceptions", &POA_CORBA::OperationDef::_get_exceptions_skel, 0},
+ {"_set_exceptions", &POA_CORBA::OperationDef::_set_exceptions_skel, 0},
+ {"_get_version", &POA_CORBA::OperationDef::_get_version_skel, 0},
+ {"_set_version", &POA_CORBA::OperationDef::_set_version_skel, 0},
+ {"_get_absolute_name", &POA_CORBA::OperationDef::_get_absolute_name_skel, 0},
+ {"_get_defined_in", &POA_CORBA::OperationDef::_get_defined_in_skel, 0},
+ {"_get_id", &POA_CORBA::OperationDef::_get_id_skel, 0},
+ {"_set_id", &POA_CORBA::OperationDef::_set_id_skel, 0},
+ {"describe", &POA_CORBA::OperationDef::describe_skel, 0},
+ {"_get_result_def", &POA_CORBA::OperationDef::_get_result_def_skel, 0},
+ {"_set_result_def", &POA_CORBA::OperationDef::_set_result_def_skel, 0},
+ {"_get_def_kind", &POA_CORBA::OperationDef::_get_def_kind_skel, 0},
+ {"_repository_id", &POA_CORBA::OperationDef::_repository_id_skel, 0},
+ {"_component", &POA_CORBA::OperationDef::_component_skel, 0},
+ {"_get_result", &POA_CORBA::OperationDef::_get_result_skel, 0},
+ {"destroy", &POA_CORBA::OperationDef::destroy_skel, 0},
+ {"_non_existent", &POA_CORBA::OperationDef::_non_existent_skel, 0},
+ {"_get_containing_repository", &POA_CORBA::OperationDef::_get_containing_repository_skel, 0},
+ };
+
+ if (len <= MAX_WORD_LENGTH && len >= MIN_WORD_LENGTH)
+ {
+ unsigned int key = hash (str, len);
+
+ if (key <= MAX_HASH_VALUE && key >= MIN_HASH_VALUE)
+ {
+ {
+ const TAO_operation_db_entry *resword;
+
+ switch (key)
+ {
+ case 4:
+ resword = &wordlist[4]; break;
+ case 5:
+ resword = &wordlist[5]; break;
+ case 9:
+ resword = &wordlist[6];
+ if (*str == *resword->opname && !strncmp (str + 1, resword->opname + 1, len - 1)) return resword;
+ resword = &wordlist[7];
+ if (*str == *resword->opname && !strncmp (str + 1, resword->opname + 1, len - 1)) return resword;
+ resword = &wordlist[8];
+ if (*str == *resword->opname && !strncmp (str + 1, resword->opname + 1, len - 1)) return resword;
+ resword = &wordlist[9];
+ if (*str == *resword->opname && !strncmp (str + 1, resword->opname + 1, len - 1)) return resword;
+ return 0;
+ case 10:
+ resword = &wordlist[10]; break;
+ case 11:
+ resword = &wordlist[11];
+ if (*str == *resword->opname && !strncmp (str + 1, resword->opname + 1, len - 1)) return resword;
+ resword = &wordlist[12];
+ if (*str == *resword->opname && !strncmp (str + 1, resword->opname + 1, len - 1)) return resword;
+ return 0;
+ case 13:
+ resword = &wordlist[13];
+ if (*str == *resword->opname && !strncmp (str + 1, resword->opname + 1, len - 1)) return resword;
+ resword = &wordlist[14];
+ if (*str == *resword->opname && !strncmp (str + 1, resword->opname + 1, len - 1)) return resword;
+ return 0;
+ case 15:
+ resword = &wordlist[15];
+ if (*str == *resword->opname && !strncmp (str + 1, resword->opname + 1, len - 1)) return resword;
+ resword = &wordlist[16];
+ if (*str == *resword->opname && !strncmp (str + 1, resword->opname + 1, len - 1)) return resword;
+ return 0;
+ case 17:
+ resword = &wordlist[17];
+ if (*str == *resword->opname && !strncmp (str + 1, resword->opname + 1, len - 1)) return resword;
+ resword = &wordlist[18];
+ if (*str == *resword->opname && !strncmp (str + 1, resword->opname + 1, len - 1)) return resword;
+ return 0;
+ case 18:
+ resword = &wordlist[19]; break;
+ case 20:
+ resword = &wordlist[20]; break;
+ case 22:
+ resword = &wordlist[21];
+ if (*str == *resword->opname && !strncmp (str + 1, resword->opname + 1, len - 1)) return resword;
+ resword = &wordlist[22];
+ if (*str == *resword->opname && !strncmp (str + 1, resword->opname + 1, len - 1)) return resword;
+ return 0;
+ case 23:
+ resword = &wordlist[23]; break;
+ case 25:
+ resword = &wordlist[24];
+ if (*str == *resword->opname && !strncmp (str + 1, resword->opname + 1, len - 1)) return resword;
+ resword = &wordlist[25];
+ if (*str == *resword->opname && !strncmp (str + 1, resword->opname + 1, len - 1)) return resword;
+ return 0;
+ case 28:
+ resword = &wordlist[26]; break;
+ case 29:
+ resword = &wordlist[27]; break;
+ case 30:
+ resword = &wordlist[28]; break;
+ case 31:
+ resword = &wordlist[29]; break;
+ case 32:
+ resword = &wordlist[30]; break;
+ case 33:
+ resword = &wordlist[31]; break;
+ case 36:
+ resword = &wordlist[32]; break;
+ default: return 0;
+ }
+ if (*str == *resword->opname && !strncmp (str + 1, resword->opname + 1, len - 1))
+ return resword;
+ return 0;
+ }
+ }
+ }
+ return 0;
+}
+
+static TAO_CORBA_OperationDef_Perfect_Hash_OpTable tao_CORBA_OperationDef_optable;
+
+// TAO_IDL - Generated from
+// be\be_visitor_interface/interface_ss.cpp:966
+
+TAO::Collocation_Proxy_Broker *
+CORBA__TAO_OperationDef_Proxy_Broker_Factory_function ( ::CORBA::Object_ptr)
+{
+ return reinterpret_cast<TAO::Collocation_Proxy_Broker *> (0xdead); // Dummy
+}
+
+int
+CORBA__TAO_OperationDef_Proxy_Broker_Factory_Initializer (size_t)
+{
+ CORBA__TAO_OperationDef_Proxy_Broker_Factory_function_pointer =
+ CORBA__TAO_OperationDef_Proxy_Broker_Factory_function;
+
+ return 0;
+}
+
+static int
+CORBA__TAO_OperationDef_Proxy_Broker_Stub_Factory_Initializer_Scarecrow =
+ CORBA__TAO_OperationDef_Proxy_Broker_Factory_Initializer (
+ reinterpret_cast<size_t> (CORBA__TAO_OperationDef_Proxy_Broker_Factory_Initializer)
+ );
+
+// TAO_IDL - Generated from
+// be\be_visitor_interface/interface_ss.cpp:103
+
+POA_CORBA::OperationDef::OperationDef (void)
+ : TAO_ServantBase ()
+{
+ this->optable_ = &tao_CORBA_OperationDef_optable;
+}
+
+POA_CORBA::OperationDef::OperationDef (const OperationDef& rhs)
+ : TAO_Abstract_ServantBase (rhs),
+ TAO_ServantBase (rhs),
+ POA_CORBA::IRObject (rhs),
+ POA_CORBA::Contained (rhs)
+{
+}
+
+POA_CORBA::OperationDef::~OperationDef (void)
+{
+}namespace POA_CORBA
+{
+
+
+ // TAO_IDL - Generated from
+ // be\be_visitor_operation/upcall_command_ss.cpp:127
+
+ class _get_result_OperationDef
+ : public TAO::Upcall_Command
+ {
+ public:
+ inline _get_result_OperationDef (
+ POA_CORBA::OperationDef * servant,
+ TAO_Operation_Details const * operation_details,
+ TAO::Argument * const args[])
+ : servant_ (servant)
+ , operation_details_ (operation_details)
+ , args_ (args)
+ {
+ }
+
+ virtual void execute (ACE_ENV_SINGLE_ARG_DECL)
+ {
+ TAO::SArg_Traits< ::CORBA::TypeCode>::ret_arg_type retval =
+ TAO::Portable_Server::get_ret_arg< ::CORBA::TypeCode> (
+ this->operation_details_,
+ this->args_);
+
+ retval =
+ this->servant_->result (
+ ACE_ENV_SINGLE_ARG_PARAMETER);
+ ACE_CHECK;
+ }
+
+ private:
+ POA_CORBA::OperationDef * const servant_;
+ TAO_Operation_Details const * const operation_details_;
+ TAO::Argument * const * const args_;
+ };
+}
+
+
+// TAO_IDL - Generated from
+// be\be_visitor_operation/operation_ss.cpp:190
+
+void POA_CORBA::OperationDef::_get_result_skel (
+ TAO_ServerRequest & server_request,
+ void * TAO_INTERCEPTOR (servant_upcall),
+ void * servant
+ ACE_ENV_ARG_DECL
+ )
+{
+#if TAO_HAS_INTERCEPTORS == 1
+ static ::CORBA::TypeCode_ptr const * const exceptions = 0;
+ static ::CORBA::ULong const nexceptions = 0;
+#endif /* TAO_HAS_INTERCEPTORS */
+
+ TAO::SArg_Traits< ::CORBA::TypeCode>::ret_val retval;
+
+ TAO::Argument * const args[] =
+ {
+ &retval
+ };
+
+ static size_t const nargs = 1;
+
+ POA_CORBA::OperationDef * const impl =
+ static_cast<POA_CORBA::OperationDef *> (servant);
+
+ _get_result_OperationDef command (
+ impl,
+ server_request.operation_details (),
+ args);
+
+ TAO::Upcall_Wrapper upcall_wrapper;
+ upcall_wrapper.upcall (server_request
+ , args
+ , nargs
+ , command
+#if TAO_HAS_INTERCEPTORS == 1
+ , servant_upcall
+ , exceptions
+ , nexceptions
+#endif /* TAO_HAS_INTERCEPTORS == 1 */
+ ACE_ENV_ARG_PARAMETER);
+ ACE_CHECK;
+}namespace POA_CORBA
+{
+
+
+ // TAO_IDL - Generated from
+ // be\be_visitor_operation/upcall_command_ss.cpp:127
+
+ class _get_result_def_OperationDef
+ : public TAO::Upcall_Command
+ {
+ public:
+ inline _get_result_def_OperationDef (
+ POA_CORBA::OperationDef * servant,
+ TAO_Operation_Details const * operation_details,
+ TAO::Argument * const args[])
+ : servant_ (servant)
+ , operation_details_ (operation_details)
+ , args_ (args)
+ {
+ }
+
+ virtual void execute (ACE_ENV_SINGLE_ARG_DECL)
+ {
+ TAO::SArg_Traits< ::CORBA::IDLType>::ret_arg_type retval =
+ TAO::Portable_Server::get_ret_arg< ::CORBA::IDLType> (
+ this->operation_details_,
+ this->args_);
+
+ retval =
+ this->servant_->result_def (
+ ACE_ENV_SINGLE_ARG_PARAMETER);
+ ACE_CHECK;
+ }
+
+ private:
+ POA_CORBA::OperationDef * const servant_;
+ TAO_Operation_Details const * const operation_details_;
+ TAO::Argument * const * const args_;
+ };
+}
+
+
+// TAO_IDL - Generated from
+// be\be_visitor_operation/operation_ss.cpp:190
+
+void POA_CORBA::OperationDef::_get_result_def_skel (
+ TAO_ServerRequest & server_request,
+ void * TAO_INTERCEPTOR (servant_upcall),
+ void * servant
+ ACE_ENV_ARG_DECL
+ )
+{
+#if TAO_HAS_INTERCEPTORS == 1
+ static ::CORBA::TypeCode_ptr const * const exceptions = 0;
+ static ::CORBA::ULong const nexceptions = 0;
+#endif /* TAO_HAS_INTERCEPTORS */
+
+ TAO::SArg_Traits< ::CORBA::IDLType>::ret_val retval;
+
+ TAO::Argument * const args[] =
+ {
+ &retval
+ };
+
+ static size_t const nargs = 1;
+
+ POA_CORBA::OperationDef * const impl =
+ static_cast<POA_CORBA::OperationDef *> (servant);
+
+ _get_result_def_OperationDef command (
+ impl,
+ server_request.operation_details (),
+ args);
+
+ TAO::Upcall_Wrapper upcall_wrapper;
+ upcall_wrapper.upcall (server_request
+ , args
+ , nargs
+ , command
+#if TAO_HAS_INTERCEPTORS == 1
+ , servant_upcall
+ , exceptions
+ , nexceptions
+#endif /* TAO_HAS_INTERCEPTORS == 1 */
+ ACE_ENV_ARG_PARAMETER);
+ ACE_CHECK;
+}namespace POA_CORBA
+{
+
+
+ // TAO_IDL - Generated from
+ // be\be_visitor_operation/upcall_command_ss.cpp:127
+
+ class _set_result_def_OperationDef
+ : public TAO::Upcall_Command
+ {
+ public:
+ inline _set_result_def_OperationDef (
+ POA_CORBA::OperationDef * servant,
+ TAO_Operation_Details const * operation_details,
+ TAO::Argument * const args[])
+ : servant_ (servant)
+ , operation_details_ (operation_details)
+ , args_ (args)
+ {
+ }
+
+ virtual void execute (ACE_ENV_SINGLE_ARG_DECL)
+ {
+ TAO::SArg_Traits< ::CORBA::IDLType>::in_arg_type arg_1 =
+ TAO::Portable_Server::get_in_arg< ::CORBA::IDLType> (
+ this->operation_details_,
+ this->args_,
+ 1);
+
+ this->servant_->result_def (
+ arg_1
+ ACE_ENV_ARG_PARAMETER);
+ ACE_CHECK;
+ }
+
+ private:
+ POA_CORBA::OperationDef * const servant_;
+ TAO_Operation_Details const * const operation_details_;
+ TAO::Argument * const * const args_;
+ };
+}
+
+
+// TAO_IDL - Generated from
+// be\be_visitor_operation/operation_ss.cpp:190
+
+void POA_CORBA::OperationDef::_set_result_def_skel (
+ TAO_ServerRequest & server_request,
+ void * TAO_INTERCEPTOR (servant_upcall),
+ void * servant
+ ACE_ENV_ARG_DECL
+ )
+{
+#if TAO_HAS_INTERCEPTORS == 1
+ static ::CORBA::TypeCode_ptr const * const exceptions = 0;
+ static ::CORBA::ULong const nexceptions = 0;
+#endif /* TAO_HAS_INTERCEPTORS */
+
+ TAO::SArg_Traits< void>::ret_val retval;
+ TAO::SArg_Traits< ::CORBA::IDLType>::in_arg_val _tao_result_def;
+
+ TAO::Argument * const args[] =
+ {
+ &retval,
+ &_tao_result_def
+ };
+
+ static size_t const nargs = 2;
+
+ POA_CORBA::OperationDef * const impl =
+ static_cast<POA_CORBA::OperationDef *> (servant);
+
+ _set_result_def_OperationDef command (
+ impl,
+ server_request.operation_details (),
+ args);
+
+ TAO::Upcall_Wrapper upcall_wrapper;
+ upcall_wrapper.upcall (server_request
+ , args
+ , nargs
+ , command
+#if TAO_HAS_INTERCEPTORS == 1
+ , servant_upcall
+ , exceptions
+ , nexceptions
+#endif /* TAO_HAS_INTERCEPTORS == 1 */
+ ACE_ENV_ARG_PARAMETER);
+ ACE_CHECK;
+}namespace POA_CORBA
+{
+
+
+ // TAO_IDL - Generated from
+ // be\be_visitor_operation/upcall_command_ss.cpp:127
+
+ class _get_params_OperationDef
+ : public TAO::Upcall_Command
+ {
+ public:
+ inline _get_params_OperationDef (
+ POA_CORBA::OperationDef * servant,
+ TAO_Operation_Details const * operation_details,
+ TAO::Argument * const args[])
+ : servant_ (servant)
+ , operation_details_ (operation_details)
+ , args_ (args)
+ {
+ }
+
+ virtual void execute (ACE_ENV_SINGLE_ARG_DECL)
+ {
+ TAO::SArg_Traits< ::CORBA::ParDescriptionSeq>::ret_arg_type retval =
+ TAO::Portable_Server::get_ret_arg< ::CORBA::ParDescriptionSeq> (
+ this->operation_details_,
+ this->args_);
+
+ retval =
+ this->servant_->params (
+ ACE_ENV_SINGLE_ARG_PARAMETER);
+ ACE_CHECK;
+ }
+
+ private:
+ POA_CORBA::OperationDef * const servant_;
+ TAO_Operation_Details const * const operation_details_;
+ TAO::Argument * const * const args_;
+ };
+}
+
+
+// TAO_IDL - Generated from
+// be\be_visitor_operation/operation_ss.cpp:190
+
+void POA_CORBA::OperationDef::_get_params_skel (
+ TAO_ServerRequest & server_request,
+ void * TAO_INTERCEPTOR (servant_upcall),
+ void * servant
+ ACE_ENV_ARG_DECL
+ )
+{
+#if TAO_HAS_INTERCEPTORS == 1
+ static ::CORBA::TypeCode_ptr const * const exceptions = 0;
+ static ::CORBA::ULong const nexceptions = 0;
+#endif /* TAO_HAS_INTERCEPTORS */
+
+ TAO::SArg_Traits< ::CORBA::ParDescriptionSeq>::ret_val retval;
+
+ TAO::Argument * const args[] =
+ {
+ &retval
+ };
+
+ static size_t const nargs = 1;
+
+ POA_CORBA::OperationDef * const impl =
+ static_cast<POA_CORBA::OperationDef *> (servant);
+
+ _get_params_OperationDef command (
+ impl,
+ server_request.operation_details (),
+ args);
+
+ TAO::Upcall_Wrapper upcall_wrapper;
+ upcall_wrapper.upcall (server_request
+ , args
+ , nargs
+ , command
+#if TAO_HAS_INTERCEPTORS == 1
+ , servant_upcall
+ , exceptions
+ , nexceptions
+#endif /* TAO_HAS_INTERCEPTORS == 1 */
+ ACE_ENV_ARG_PARAMETER);
+ ACE_CHECK;
+}namespace POA_CORBA
+{
+
+
+ // TAO_IDL - Generated from
+ // be\be_visitor_operation/upcall_command_ss.cpp:127
+
+ class _set_params_OperationDef
+ : public TAO::Upcall_Command
+ {
+ public:
+ inline _set_params_OperationDef (
+ POA_CORBA::OperationDef * servant,
+ TAO_Operation_Details const * operation_details,
+ TAO::Argument * const args[])
+ : servant_ (servant)
+ , operation_details_ (operation_details)
+ , args_ (args)
+ {
+ }
+
+ virtual void execute (ACE_ENV_SINGLE_ARG_DECL)
+ {
+ TAO::SArg_Traits< ::CORBA::ParDescriptionSeq>::in_arg_type arg_1 =
+ TAO::Portable_Server::get_in_arg< ::CORBA::ParDescriptionSeq> (
+ this->operation_details_,
+ this->args_,
+ 1);
+
+ this->servant_->params (
+ arg_1
+ ACE_ENV_ARG_PARAMETER);
+ ACE_CHECK;
+ }
+
+ private:
+ POA_CORBA::OperationDef * const servant_;
+ TAO_Operation_Details const * const operation_details_;
+ TAO::Argument * const * const args_;
+ };
+}
+
+
+// TAO_IDL - Generated from
+// be\be_visitor_operation/operation_ss.cpp:190
+
+void POA_CORBA::OperationDef::_set_params_skel (
+ TAO_ServerRequest & server_request,
+ void * TAO_INTERCEPTOR (servant_upcall),
+ void * servant
+ ACE_ENV_ARG_DECL
+ )
+{
+#if TAO_HAS_INTERCEPTORS == 1
+ static ::CORBA::TypeCode_ptr const * const exceptions = 0;
+ static ::CORBA::ULong const nexceptions = 0;
+#endif /* TAO_HAS_INTERCEPTORS */
+
+ TAO::SArg_Traits< void>::ret_val retval;
+ TAO::SArg_Traits< ::CORBA::ParDescriptionSeq>::in_arg_val _tao_params;
+
+ TAO::Argument * const args[] =
+ {
+ &retval,
+ &_tao_params
+ };
+
+ static size_t const nargs = 2;
+
+ POA_CORBA::OperationDef * const impl =
+ static_cast<POA_CORBA::OperationDef *> (servant);
+
+ _set_params_OperationDef command (
+ impl,
+ server_request.operation_details (),
+ args);
+
+ TAO::Upcall_Wrapper upcall_wrapper;
+ upcall_wrapper.upcall (server_request
+ , args
+ , nargs
+ , command
+#if TAO_HAS_INTERCEPTORS == 1
+ , servant_upcall
+ , exceptions
+ , nexceptions
+#endif /* TAO_HAS_INTERCEPTORS == 1 */
+ ACE_ENV_ARG_PARAMETER);
+ ACE_CHECK;
+}namespace POA_CORBA
+{
+
+
+ // TAO_IDL - Generated from
+ // be\be_visitor_operation/upcall_command_ss.cpp:127
+
+ class _get_mode_OperationDef
+ : public TAO::Upcall_Command
+ {
+ public:
+ inline _get_mode_OperationDef (
+ POA_CORBA::OperationDef * servant,
+ TAO_Operation_Details const * operation_details,
+ TAO::Argument * const args[])
+ : servant_ (servant)
+ , operation_details_ (operation_details)
+ , args_ (args)
+ {
+ }
+
+ virtual void execute (ACE_ENV_SINGLE_ARG_DECL)
+ {
+ TAO::SArg_Traits< ::CORBA::OperationMode>::ret_arg_type retval =
+ TAO::Portable_Server::get_ret_arg< ::CORBA::OperationMode> (
+ this->operation_details_,
+ this->args_);
+
+ retval =
+ this->servant_->mode (
+ ACE_ENV_SINGLE_ARG_PARAMETER);
+ ACE_CHECK;
+ }
+
+ private:
+ POA_CORBA::OperationDef * const servant_;
+ TAO_Operation_Details const * const operation_details_;
+ TAO::Argument * const * const args_;
+ };
+}
+
+
+// TAO_IDL - Generated from
+// be\be_visitor_operation/operation_ss.cpp:190
+
+void POA_CORBA::OperationDef::_get_mode_skel (
+ TAO_ServerRequest & server_request,
+ void * TAO_INTERCEPTOR (servant_upcall),
+ void * servant
+ ACE_ENV_ARG_DECL
+ )
+{
+#if TAO_HAS_INTERCEPTORS == 1
+ static ::CORBA::TypeCode_ptr const * const exceptions = 0;
+ static ::CORBA::ULong const nexceptions = 0;
+#endif /* TAO_HAS_INTERCEPTORS */
+
+ TAO::SArg_Traits< ::CORBA::OperationMode>::ret_val retval;
+
+ TAO::Argument * const args[] =
+ {
+ &retval
+ };
+
+ static size_t const nargs = 1;
+
+ POA_CORBA::OperationDef * const impl =
+ static_cast<POA_CORBA::OperationDef *> (servant);
+
+ _get_mode_OperationDef command (
+ impl,
+ server_request.operation_details (),
+ args);
+
+ TAO::Upcall_Wrapper upcall_wrapper;
+ upcall_wrapper.upcall (server_request
+ , args
+ , nargs
+ , command
+#if TAO_HAS_INTERCEPTORS == 1
+ , servant_upcall
+ , exceptions
+ , nexceptions
+#endif /* TAO_HAS_INTERCEPTORS == 1 */
+ ACE_ENV_ARG_PARAMETER);
+ ACE_CHECK;
+}namespace POA_CORBA
+{
+
+
+ // TAO_IDL - Generated from
+ // be\be_visitor_operation/upcall_command_ss.cpp:127
+
+ class _set_mode_OperationDef
+ : public TAO::Upcall_Command
+ {
+ public:
+ inline _set_mode_OperationDef (
+ POA_CORBA::OperationDef * servant,
+ TAO_Operation_Details const * operation_details,
+ TAO::Argument * const args[])
+ : servant_ (servant)
+ , operation_details_ (operation_details)
+ , args_ (args)
+ {
+ }
+
+ virtual void execute (ACE_ENV_SINGLE_ARG_DECL)
+ {
+ TAO::SArg_Traits< ::CORBA::OperationMode>::in_arg_type arg_1 =
+ TAO::Portable_Server::get_in_arg< ::CORBA::OperationMode> (
+ this->operation_details_,
+ this->args_,
+ 1);
+
+ this->servant_->mode (
+ arg_1
+ ACE_ENV_ARG_PARAMETER);
+ ACE_CHECK;
+ }
+
+ private:
+ POA_CORBA::OperationDef * const servant_;
+ TAO_Operation_Details const * const operation_details_;
+ TAO::Argument * const * const args_;
+ };
+}
+
+
+// TAO_IDL - Generated from
+// be\be_visitor_operation/operation_ss.cpp:190
+
+void POA_CORBA::OperationDef::_set_mode_skel (
+ TAO_ServerRequest & server_request,
+ void * TAO_INTERCEPTOR (servant_upcall),
+ void * servant
+ ACE_ENV_ARG_DECL
+ )
+{
+#if TAO_HAS_INTERCEPTORS == 1
+ static ::CORBA::TypeCode_ptr const * const exceptions = 0;
+ static ::CORBA::ULong const nexceptions = 0;
+#endif /* TAO_HAS_INTERCEPTORS */
+
+ TAO::SArg_Traits< void>::ret_val retval;
+ TAO::SArg_Traits< ::CORBA::OperationMode>::in_arg_val _tao_mode;
+
+ TAO::Argument * const args[] =
+ {
+ &retval,
+ &_tao_mode
+ };
+
+ static size_t const nargs = 2;
+
+ POA_CORBA::OperationDef * const impl =
+ static_cast<POA_CORBA::OperationDef *> (servant);
+
+ _set_mode_OperationDef command (
+ impl,
+ server_request.operation_details (),
+ args);
+
+ TAO::Upcall_Wrapper upcall_wrapper;
+ upcall_wrapper.upcall (server_request
+ , args
+ , nargs
+ , command
+#if TAO_HAS_INTERCEPTORS == 1
+ , servant_upcall
+ , exceptions
+ , nexceptions
+#endif /* TAO_HAS_INTERCEPTORS == 1 */
+ ACE_ENV_ARG_PARAMETER);
+ ACE_CHECK;
+}namespace POA_CORBA
+{
+
+
+ // TAO_IDL - Generated from
+ // be\be_visitor_operation/upcall_command_ss.cpp:127
+
+ class _get_contexts_OperationDef
+ : public TAO::Upcall_Command
+ {
+ public:
+ inline _get_contexts_OperationDef (
+ POA_CORBA::OperationDef * servant,
+ TAO_Operation_Details const * operation_details,
+ TAO::Argument * const args[])
+ : servant_ (servant)
+ , operation_details_ (operation_details)
+ , args_ (args)
+ {
+ }
+
+ virtual void execute (ACE_ENV_SINGLE_ARG_DECL)
+ {
+ TAO::SArg_Traits< ::CORBA::ContextIdSeq>::ret_arg_type retval =
+ TAO::Portable_Server::get_ret_arg< ::CORBA::ContextIdSeq> (
+ this->operation_details_,
+ this->args_);
+
+ retval =
+ this->servant_->contexts (
+ ACE_ENV_SINGLE_ARG_PARAMETER);
+ ACE_CHECK;
+ }
+
+ private:
+ POA_CORBA::OperationDef * const servant_;
+ TAO_Operation_Details const * const operation_details_;
+ TAO::Argument * const * const args_;
+ };
+}
+
+
+// TAO_IDL - Generated from
+// be\be_visitor_operation/operation_ss.cpp:190
+
+void POA_CORBA::OperationDef::_get_contexts_skel (
+ TAO_ServerRequest & server_request,
+ void * TAO_INTERCEPTOR (servant_upcall),
+ void * servant
+ ACE_ENV_ARG_DECL
+ )
+{
+#if TAO_HAS_INTERCEPTORS == 1
+ static ::CORBA::TypeCode_ptr const * const exceptions = 0;
+ static ::CORBA::ULong const nexceptions = 0;
+#endif /* TAO_HAS_INTERCEPTORS */
+
+ TAO::SArg_Traits< ::CORBA::ContextIdSeq>::ret_val retval;
+
+ TAO::Argument * const args[] =
+ {
+ &retval
+ };
+
+ static size_t const nargs = 1;
+
+ POA_CORBA::OperationDef * const impl =
+ static_cast<POA_CORBA::OperationDef *> (servant);
+
+ _get_contexts_OperationDef command (
+ impl,
+ server_request.operation_details (),
+ args);
+
+ TAO::Upcall_Wrapper upcall_wrapper;
+ upcall_wrapper.upcall (server_request
+ , args
+ , nargs
+ , command
+#if TAO_HAS_INTERCEPTORS == 1
+ , servant_upcall
+ , exceptions
+ , nexceptions
+#endif /* TAO_HAS_INTERCEPTORS == 1 */
+ ACE_ENV_ARG_PARAMETER);
+ ACE_CHECK;
+}namespace POA_CORBA
+{
+
+
+ // TAO_IDL - Generated from
+ // be\be_visitor_operation/upcall_command_ss.cpp:127
+
+ class _set_contexts_OperationDef
+ : public TAO::Upcall_Command
+ {
+ public:
+ inline _set_contexts_OperationDef (
+ POA_CORBA::OperationDef * servant,
+ TAO_Operation_Details const * operation_details,
+ TAO::Argument * const args[])
+ : servant_ (servant)
+ , operation_details_ (operation_details)
+ , args_ (args)
+ {
+ }
+
+ virtual void execute (ACE_ENV_SINGLE_ARG_DECL)
+ {
+ TAO::SArg_Traits< ::CORBA::ContextIdSeq>::in_arg_type arg_1 =
+ TAO::Portable_Server::get_in_arg< ::CORBA::ContextIdSeq> (
+ this->operation_details_,
+ this->args_,
+ 1);
+
+ this->servant_->contexts (
+ arg_1
+ ACE_ENV_ARG_PARAMETER);
+ ACE_CHECK;
+ }
+
+ private:
+ POA_CORBA::OperationDef * const servant_;
+ TAO_Operation_Details const * const operation_details_;
+ TAO::Argument * const * const args_;
+ };
+}
+
+
+// TAO_IDL - Generated from
+// be\be_visitor_operation/operation_ss.cpp:190
+
+void POA_CORBA::OperationDef::_set_contexts_skel (
+ TAO_ServerRequest & server_request,
+ void * TAO_INTERCEPTOR (servant_upcall),
+ void * servant
+ ACE_ENV_ARG_DECL
+ )
+{
+#if TAO_HAS_INTERCEPTORS == 1
+ static ::CORBA::TypeCode_ptr const * const exceptions = 0;
+ static ::CORBA::ULong const nexceptions = 0;
+#endif /* TAO_HAS_INTERCEPTORS */
+
+ TAO::SArg_Traits< void>::ret_val retval;
+ TAO::SArg_Traits< ::CORBA::ContextIdSeq>::in_arg_val _tao_contexts;
+
+ TAO::Argument * const args[] =
+ {
+ &retval,
+ &_tao_contexts
+ };
+
+ static size_t const nargs = 2;
+
+ POA_CORBA::OperationDef * const impl =
+ static_cast<POA_CORBA::OperationDef *> (servant);
+
+ _set_contexts_OperationDef command (
+ impl,
+ server_request.operation_details (),
+ args);
+
+ TAO::Upcall_Wrapper upcall_wrapper;
+ upcall_wrapper.upcall (server_request
+ , args
+ , nargs
+ , command
+#if TAO_HAS_INTERCEPTORS == 1
+ , servant_upcall
+ , exceptions
+ , nexceptions
+#endif /* TAO_HAS_INTERCEPTORS == 1 */
+ ACE_ENV_ARG_PARAMETER);
+ ACE_CHECK;
+}namespace POA_CORBA
+{
+
+
+ // TAO_IDL - Generated from
+ // be\be_visitor_operation/upcall_command_ss.cpp:127
+
+ class _get_exceptions_OperationDef
+ : public TAO::Upcall_Command
+ {
+ public:
+ inline _get_exceptions_OperationDef (
+ POA_CORBA::OperationDef * servant,
+ TAO_Operation_Details const * operation_details,
+ TAO::Argument * const args[])
+ : servant_ (servant)
+ , operation_details_ (operation_details)
+ , args_ (args)
+ {
+ }
+
+ virtual void execute (ACE_ENV_SINGLE_ARG_DECL)
+ {
+ TAO::SArg_Traits< ::CORBA::ExceptionDefSeq>::ret_arg_type retval =
+ TAO::Portable_Server::get_ret_arg< ::CORBA::ExceptionDefSeq> (
+ this->operation_details_,
+ this->args_);
+
+ retval =
+ this->servant_->exceptions (
+ ACE_ENV_SINGLE_ARG_PARAMETER);
+ ACE_CHECK;
+ }
+
+ private:
+ POA_CORBA::OperationDef * const servant_;
+ TAO_Operation_Details const * const operation_details_;
+ TAO::Argument * const * const args_;
+ };
+}
+
+
+// TAO_IDL - Generated from
+// be\be_visitor_operation/operation_ss.cpp:190
+
+void POA_CORBA::OperationDef::_get_exceptions_skel (
+ TAO_ServerRequest & server_request,
+ void * TAO_INTERCEPTOR (servant_upcall),
+ void * servant
+ ACE_ENV_ARG_DECL
+ )
+{
+#if TAO_HAS_INTERCEPTORS == 1
+ static ::CORBA::TypeCode_ptr const * const exceptions = 0;
+ static ::CORBA::ULong const nexceptions = 0;
+#endif /* TAO_HAS_INTERCEPTORS */
+
+ TAO::SArg_Traits< ::CORBA::ExceptionDefSeq>::ret_val retval;
+
+ TAO::Argument * const args[] =
+ {
+ &retval
+ };
+
+ static size_t const nargs = 1;
+
+ POA_CORBA::OperationDef * const impl =
+ static_cast<POA_CORBA::OperationDef *> (servant);
+
+ _get_exceptions_OperationDef command (
+ impl,
+ server_request.operation_details (),
+ args);
+
+ TAO::Upcall_Wrapper upcall_wrapper;
+ upcall_wrapper.upcall (server_request
+ , args
+ , nargs
+ , command
+#if TAO_HAS_INTERCEPTORS == 1
+ , servant_upcall
+ , exceptions
+ , nexceptions
+#endif /* TAO_HAS_INTERCEPTORS == 1 */
+ ACE_ENV_ARG_PARAMETER);
+ ACE_CHECK;
+}namespace POA_CORBA
+{
+
+
+ // TAO_IDL - Generated from
+ // be\be_visitor_operation/upcall_command_ss.cpp:127
+
+ class _set_exceptions_OperationDef
+ : public TAO::Upcall_Command
+ {
+ public:
+ inline _set_exceptions_OperationDef (
+ POA_CORBA::OperationDef * servant,
+ TAO_Operation_Details const * operation_details,
+ TAO::Argument * const args[])
+ : servant_ (servant)
+ , operation_details_ (operation_details)
+ , args_ (args)
+ {
+ }
+
+ virtual void execute (ACE_ENV_SINGLE_ARG_DECL)
+ {
+ TAO::SArg_Traits< ::CORBA::ExceptionDefSeq>::in_arg_type arg_1 =
+ TAO::Portable_Server::get_in_arg< ::CORBA::ExceptionDefSeq> (
+ this->operation_details_,
+ this->args_,
+ 1);
+
+ this->servant_->exceptions (
+ arg_1
+ ACE_ENV_ARG_PARAMETER);
+ ACE_CHECK;
+ }
+
+ private:
+ POA_CORBA::OperationDef * const servant_;
+ TAO_Operation_Details const * const operation_details_;
+ TAO::Argument * const * const args_;
+ };
+}
+
+
+// TAO_IDL - Generated from
+// be\be_visitor_operation/operation_ss.cpp:190
+
+void POA_CORBA::OperationDef::_set_exceptions_skel (
+ TAO_ServerRequest & server_request,
+ void * TAO_INTERCEPTOR (servant_upcall),
+ void * servant
+ ACE_ENV_ARG_DECL
+ )
+{
+#if TAO_HAS_INTERCEPTORS == 1
+ static ::CORBA::TypeCode_ptr const * const exceptions = 0;
+ static ::CORBA::ULong const nexceptions = 0;
+#endif /* TAO_HAS_INTERCEPTORS */
+
+ TAO::SArg_Traits< void>::ret_val retval;
+ TAO::SArg_Traits< ::CORBA::ExceptionDefSeq>::in_arg_val _tao_exceptions;
+
+ TAO::Argument * const args[] =
+ {
+ &retval,
+ &_tao_exceptions
+ };
+
+ static size_t const nargs = 2;
+
+ POA_CORBA::OperationDef * const impl =
+ static_cast<POA_CORBA::OperationDef *> (servant);
+
+ _set_exceptions_OperationDef command (
+ impl,
+ server_request.operation_details (),
+ args);
+
+ TAO::Upcall_Wrapper upcall_wrapper;
+ upcall_wrapper.upcall (server_request
+ , args
+ , nargs
+ , command
+#if TAO_HAS_INTERCEPTORS == 1
+ , servant_upcall
+ , exceptions
+ , nexceptions
+#endif /* TAO_HAS_INTERCEPTORS == 1 */
+ ACE_ENV_ARG_PARAMETER);
+ ACE_CHECK;
+}
+
+// TAO_IDL - Generated from
+// be\be_visitor_interface/interface_ss.cpp:169
+
+namespace POA_CORBA
+{
+
+
+ // TAO_IDL - Generated from
+ // be\be_visitor_operation/upcall_command_ss.cpp:127
+
+ class _is_a_OperationDef_Upcall_Command
+ : public TAO::Upcall_Command
+ {
+ public:
+ inline _is_a_OperationDef_Upcall_Command (
+ POA_CORBA::OperationDef * servant,
+ TAO_Operation_Details const * operation_details,
+ TAO::Argument * const args[])
+ : servant_ (servant)
+ , operation_details_ (operation_details)
+ , args_ (args)
+ {
+ }
+
+ virtual void execute (ACE_ENV_SINGLE_ARG_DECL)
+ {
+ TAO::SArg_Traits< ::ACE_InputCDR::to_boolean>::ret_arg_type retval =
+ TAO::Portable_Server::get_ret_arg< ::ACE_InputCDR::to_boolean> (
+ this->operation_details_,
+ this->args_);
+
+ TAO::SArg_Traits< ::CORBA::Char *>::in_arg_type arg_1 =
+ TAO::Portable_Server::get_in_arg< ::CORBA::Char *> (
+ this->operation_details_,
+ this->args_,
+ 1);
+
+ retval =
+ this->servant_-> _is_a (
+ arg_1
+ ACE_ENV_ARG_PARAMETER);
+ ACE_CHECK;
+ }
+
+ private:
+ POA_CORBA::OperationDef * const servant_;
+ TAO_Operation_Details const * const operation_details_;
+ TAO::Argument * const * const args_;
+ };
+}
+
+
+void POA_CORBA::OperationDef::_is_a_skel (
+ TAO_ServerRequest & server_request,
+ void * TAO_INTERCEPTOR (servant_upcall),
+ void * servant
+ ACE_ENV_ARG_DECL
+ )
+{
+#if TAO_HAS_INTERCEPTORS == 1
+ static ::CORBA::TypeCode_ptr const * const exceptions = 0;
+ static ::CORBA::ULong const nexceptions = 0;
+#endif /* TAO_HAS_INTERCEPTORS */
+
+ TAO::SArg_Traits< ::ACE_InputCDR::to_boolean>::ret_val retval;
+ TAO::SArg_Traits< ::CORBA::Char *>::in_arg_val _tao_repository_id;
+
+ TAO::Argument * const args[] =
+ {
+ &retval,
+ &_tao_repository_id
+ };
+
+ static size_t const nargs = 2;
+
+ POA_CORBA::OperationDef * const impl =
+ static_cast<POA_CORBA::OperationDef *> (servant);
+
+ _is_a_OperationDef_Upcall_Command command (
+ impl,
+ server_request.operation_details (),
+ args);
+
+ TAO::Upcall_Wrapper upcall_wrapper;
+ upcall_wrapper.upcall (server_request
+ , args
+ , nargs
+ , command
+#if TAO_HAS_INTERCEPTORS == 1
+ , servant_upcall
+ , exceptions
+ , nexceptions
+#endif /* TAO_HAS_INTERCEPTORS == 1 */
+ ACE_ENV_ARG_PARAMETER);
+ ACE_CHECK;
+}namespace POA_CORBA
+{
+
+
+ // TAO_IDL - Generated from
+ // be\be_visitor_operation/upcall_command_ss.cpp:127
+
+ class _non_existent_OperationDef_Upcall_Command
+ : public TAO::Upcall_Command
+ {
+ public:
+ inline _non_existent_OperationDef_Upcall_Command (
+ POA_CORBA::OperationDef * servant,
+ TAO_Operation_Details const * operation_details,
+ TAO::Argument * const args[])
+ : servant_ (servant)
+ , operation_details_ (operation_details)
+ , args_ (args)
+ {
+ }
+
+ virtual void execute (ACE_ENV_SINGLE_ARG_DECL)
+ {
+ TAO::SArg_Traits< ::ACE_InputCDR::to_boolean>::ret_arg_type retval =
+ TAO::Portable_Server::get_ret_arg< ::ACE_InputCDR::to_boolean> (
+ this->operation_details_,
+ this->args_);
+
+ retval =
+ this->servant_-> _non_existent (
+ ACE_ENV_SINGLE_ARG_PARAMETER);
+ ACE_CHECK;
+ }
+
+ private:
+ POA_CORBA::OperationDef * const servant_;
+ TAO_Operation_Details const * const operation_details_;
+ TAO::Argument * const * const args_;
+ };
+}
+
+
+void POA_CORBA::OperationDef::_non_existent_skel (
+ TAO_ServerRequest & server_request,
+ void * TAO_INTERCEPTOR (servant_upcall),
+ void * servant
+ ACE_ENV_ARG_DECL
+ )
+{
+#if TAO_HAS_INTERCEPTORS == 1
+ static ::CORBA::TypeCode_ptr const * const exceptions = 0;
+ static ::CORBA::ULong const nexceptions = 0;
+#endif /* TAO_HAS_INTERCEPTORS */
+
+ TAO::SArg_Traits< ::ACE_InputCDR::to_boolean>::ret_val retval;
+
+ TAO::Argument * const args[] =
+ {
+ &retval
+ };
+
+ static size_t const nargs = 1;
+
+ POA_CORBA::OperationDef * const impl =
+ static_cast<POA_CORBA::OperationDef *> (servant);
+
+ _non_existent_OperationDef_Upcall_Command command (
+ impl,
+ server_request.operation_details (),
+ args);
+
+ TAO::Upcall_Wrapper upcall_wrapper;
+ upcall_wrapper.upcall (server_request
+ , args
+ , nargs
+ , command
+#if TAO_HAS_INTERCEPTORS == 1
+ , servant_upcall
+ , exceptions
+ , nexceptions
+#endif /* TAO_HAS_INTERCEPTORS == 1 */
+ ACE_ENV_ARG_PARAMETER);
+ ACE_CHECK;
+}namespace POA_CORBA
+{
+
+
+ // TAO_IDL - Generated from
+ // be\be_visitor_operation/upcall_command_ss.cpp:127
+
+ class _repository_id_OperationDef_Upcall_Command
+ : public TAO::Upcall_Command
+ {
+ public:
+ inline _repository_id_OperationDef_Upcall_Command (
+ POA_CORBA::OperationDef * servant,
+ TAO_Operation_Details const * operation_details,
+ TAO::Argument * const args[])
+ : servant_ (servant)
+ , operation_details_ (operation_details)
+ , args_ (args)
+ {
+ }
+
+ virtual void execute (ACE_ENV_SINGLE_ARG_DECL)
+ {
+ TAO::SArg_Traits< ::CORBA::Char *>::ret_arg_type retval =
+ TAO::Portable_Server::get_ret_arg< ::CORBA::Char *> (
+ this->operation_details_,
+ this->args_);
+
+ retval =
+ this->servant_-> _repository_id (
+ ACE_ENV_SINGLE_ARG_PARAMETER);
+ ACE_CHECK;
+ }
+
+ private:
+ POA_CORBA::OperationDef * const servant_;
+ TAO_Operation_Details const * const operation_details_;
+ TAO::Argument * const * const args_;
+ };
+}
+
+
+void POA_CORBA::OperationDef::_repository_id_skel (
+ TAO_ServerRequest & server_request,
+ void * TAO_INTERCEPTOR (servant_upcall),
+ void * servant
+ ACE_ENV_ARG_DECL
+ )
+{
+#if TAO_HAS_INTERCEPTORS == 1
+ static ::CORBA::TypeCode_ptr const * const exceptions = 0;
+ static ::CORBA::ULong const nexceptions = 0;
+#endif /* TAO_HAS_INTERCEPTORS */
+
+ TAO::SArg_Traits< ::CORBA::Char *>::ret_val retval;
+
+ TAO::Argument * const args[] =
+ {
+ &retval
+ };
+
+ static size_t const nargs = 1;
+
+ POA_CORBA::OperationDef * const impl =
+ static_cast<POA_CORBA::OperationDef *> (servant);
+
+ _repository_id_OperationDef_Upcall_Command command (
+ impl,
+ server_request.operation_details (),
+ args);
+
+ TAO::Upcall_Wrapper upcall_wrapper;
+ upcall_wrapper.upcall (server_request
+ , args
+ , nargs
+ , command
+#if TAO_HAS_INTERCEPTORS == 1
+ , servant_upcall
+ , exceptions
+ , nexceptions
+#endif /* TAO_HAS_INTERCEPTORS == 1 */
+ ACE_ENV_ARG_PARAMETER);
+ ACE_CHECK;
+}
+
+// TAO_IDL - Generated from
+// be\be_visitor_interface/interface_ss.cpp:513
+
+void POA_CORBA::OperationDef::_interface_skel (
+ TAO_ServerRequest & server_request,
+ void * /* servant_upcall */,
+ void * servant
+ ACE_ENV_ARG_DECL
+ )
+{
+ TAO_IFR_Client_Adapter *_tao_adapter =
+ ACE_Dynamic_Service<TAO_IFR_Client_Adapter>::instance (
+ TAO_ORB_Core::ifr_client_adapter_name ()
+ );
+
+ if (_tao_adapter == 0)
+ {
+ ACE_THROW ( ::CORBA::INTF_REPOS ( ::CORBA::OMGVMCID | 1,
+ ::CORBA::COMPLETED_NO));
+ }
+
+ POA_CORBA::OperationDef * const impl =
+ static_cast<POA_CORBA::OperationDef *> (servant);
+ ::CORBA::InterfaceDef_ptr _tao_retval =
+ impl->_get_interface (ACE_ENV_SINGLE_ARG_PARAMETER);
+ ACE_CHECK;
+
+ server_request.init_reply ();
+ TAO_OutputCDR &_tao_out = *server_request.outgoing ();
+
+ ::CORBA::Boolean const _tao_result =
+ _tao_adapter->interfacedef_cdr_insert (
+ _tao_out,
+ _tao_retval
+ );
+
+ _tao_adapter->dispose (_tao_retval);
+
+ if (_tao_result == false)
+ {
+ ACE_THROW ( ::CORBA::MARSHAL ());
+ }
+}namespace POA_CORBA
+{
+
+
+ // TAO_IDL - Generated from
+ // be\be_visitor_operation/upcall_command_ss.cpp:127
+
+ class _get_component_OperationDef_Upcall_Command
+ : public TAO::Upcall_Command
+ {
+ public:
+ inline _get_component_OperationDef_Upcall_Command (
+ POA_CORBA::OperationDef * servant,
+ TAO_Operation_Details const * operation_details,
+ TAO::Argument * const args[])
+ : servant_ (servant)
+ , operation_details_ (operation_details)
+ , args_ (args)
+ {
+ }
+
+ virtual void execute (ACE_ENV_SINGLE_ARG_DECL)
+ {
+ TAO::SArg_Traits< ::CORBA::Object>::ret_arg_type retval =
+ TAO::Portable_Server::get_ret_arg< ::CORBA::Object> (
+ this->operation_details_,
+ this->args_);
+
+ retval =
+ this->servant_-> _get_component (
+ ACE_ENV_SINGLE_ARG_PARAMETER);
+ ACE_CHECK;
+ }
+
+ private:
+ POA_CORBA::OperationDef * const servant_;
+ TAO_Operation_Details const * const operation_details_;
+ TAO::Argument * const * const args_;
+ };
+}
+
+
+void POA_CORBA::OperationDef::_component_skel (
+ TAO_ServerRequest & server_request,
+ void * TAO_INTERCEPTOR (servant_upcall),
+ void * servant
+ ACE_ENV_ARG_DECL
+ )
+{
+#if TAO_HAS_INTERCEPTORS == 1
+ static ::CORBA::TypeCode_ptr const * const exceptions = 0;
+ static ::CORBA::ULong const nexceptions = 0;
+#endif /* TAO_HAS_INTERCEPTORS */
+
+ TAO::SArg_Traits< ::CORBA::Object>::ret_val retval;
+
+ TAO::Argument * const args[] =
+ {
+ &retval
+ };
+
+ static size_t const nargs = 1;
+
+ POA_CORBA::OperationDef * const impl =
+ static_cast<POA_CORBA::OperationDef *> (servant);
+
+ _get_component_OperationDef_Upcall_Command command (
+ impl,
+ server_request.operation_details (),
+ args);
+
+ TAO::Upcall_Wrapper upcall_wrapper;
+ upcall_wrapper.upcall (server_request
+ , args
+ , nargs
+ , command
+#if TAO_HAS_INTERCEPTORS == 1
+ , servant_upcall
+ , exceptions
+ , nexceptions
+#endif /* TAO_HAS_INTERCEPTORS == 1 */
+ ACE_ENV_ARG_PARAMETER);
+ ACE_CHECK;
+}
+
+::CORBA::Boolean POA_CORBA::OperationDef::_is_a (
+ const char* value
+ ACE_ENV_ARG_DECL_NOT_USED
+ )
+{
+ return
+ (
+ !ACE_OS::strcmp (
+ value,
+ "IDL:omg.org/CORBA/IRObject:1.0"
+ ) ||
+ !ACE_OS::strcmp (
+ value,
+ "IDL:omg.org/CORBA/Contained:1.0"
+ ) ||
+ !ACE_OS::strcmp (
+ value,
+ "IDL:omg.org/CORBA/OperationDef:1.0"
+ ) ||
+ !ACE_OS::strcmp (
+ value,
+ "IDL:omg.org/CORBA/Object:1.0"
+ )
+ );
+}
+
+const char* POA_CORBA::OperationDef::_interface_repository_id (void) const
+{
+ return "IDL:omg.org/CORBA/OperationDef:1.0";
+}
+
+// TAO_IDL - Generated from
+// be\be_visitor_interface/interface_ss.cpp:903
+
+void POA_CORBA::OperationDef::_dispatch (
+ TAO_ServerRequest & req,
+ void * servant_upcall
+ ACE_ENV_ARG_DECL
+ )
+{
+ this->synchronous_upcall_dispatch (req,
+ servant_upcall,
+ this
+ ACE_ENV_ARG_PARAMETER);
+}
+
+// TAO_IDL - Generated from
+// be\be_visitor_interface/interface_ss.cpp:851
+
+CORBA::OperationDef *
+POA_CORBA::OperationDef::_this (ACE_ENV_SINGLE_ARG_DECL)
+{
+ TAO_Stub *stub = this->_create_stub (ACE_ENV_SINGLE_ARG_PARAMETER);
+ ACE_CHECK_RETURN (0);
+
+ TAO_Stub_Auto_Ptr safe_stub (stub);
+ ::CORBA::Object_ptr tmp = CORBA::Object::_nil ();
+
+ ::CORBA::Boolean const _tao_opt_colloc =
+ stub->servant_orb_var ()->orb_core ()->optimize_collocation_objects ();
+
+ ACE_NEW_RETURN (
+ tmp,
+ ::CORBA::Object (stub, _tao_opt_colloc, this),
+ 0
+ );
+
+ ::CORBA::Object_var obj = tmp;
+ (void) safe_stub.release ();
+
+ typedef ::CORBA::OperationDef STUB_SCOPED_NAME;
+ return
+ TAO::Narrow_Utils<STUB_SCOPED_NAME>::unchecked_narrow (
+ obj.in (),
+ CORBA__TAO_OperationDef_Proxy_Broker_Factory_function_pointer
+ );
+}
+
+// TAO_IDL - Generated from
+// be\be_interface.cpp:1499
+
+class TAO_CORBA_InterfaceDef_Perfect_Hash_OpTable
+ : public TAO_Perfect_Hash_OpTable
+{
+private:
+ unsigned int hash (const char *str, unsigned int len);
+
+public:
+ const TAO_operation_db_entry * lookup (const char *str, unsigned int len);
+};
+
+/* C++ code produced by gperf version 2.8 (ACE version) */
+/* Command-line: C:\ACE\latest\ACE_wrappers\bin\gperf.exe -m -M -J -c -C -D -E -T -f 0 -F 0,0 -a -o -t -p -K opname -L C++ -Z TAO_CORBA_InterfaceDef_Perfect_Hash_OpTable -N lookup */
+unsigned int
+TAO_CORBA_InterfaceDef_Perfect_Hash_OpTable::hash (const char *str, unsigned int len)
+{
+ static const unsigned char asso_values[] =
+ {
+#if defined (ACE_MVS)
+ 81, 81, 81, 81, 81, 81, 81, 81, 81, 81,
+ 81, 81, 81, 81, 81, 81, 81, 81, 81, 81,
+ 81, 81, 81, 81, 81, 81, 81, 81, 81, 81,
+ 81, 81, 81, 81, 81, 81, 81, 81, 81, 81,
+ 81, 81, 81, 81, 81, 81, 81, 81, 81, 81,
+ 81, 81, 81, 81, 81, 81, 81, 81, 81, 81,
+ 81, 81, 81, 81, 81, 81, 81, 81, 81, 81,
+ 81, 81, 81, 81, 81, 81, 81, 81, 81, 81,
+ 81, 81, 81, 81, 81, 81, 81, 81, 81, 81,
+ 81, 81, 81, 81, 81, 81, 81, 81, 81, 81,
+ 81, 81, 81, 81, 81, 81, 81, 81, 81, 0,
+ 81, 81, 81, 81, 81, 81, 81, 81, 81, 81,
+ 81, 81, 81, 81, 81, 81, 81, 81, 81, 0,
+ 81, 30, 20, 0, 81, 81, 81, 10, 81, 81,
+ 81, 81, 81, 81, 81, 81, 81, 0, 0, 5,
+ 81, 0, 81, 81, 81, 81, 81, 81, 81, 81,
+ 81, 81, 20, 35, 81, 81, 81, 10, 5, 81,
+ 81, 81, 81, 81, 81, 81, 81, 81, 81, 81,
+ 81, 81, 81, 81, 81, 81, 81, 81, 81, 81,
+ 81, 81, 81, 81, 81, 81, 81, 81, 81, 81,
+ 81, 81, 81, 81, 81, 81, 81, 81, 81, 81,
+ 81, 81, 81, 81, 81, 81, 81, 81, 81, 81,
+ 81, 81, 81, 81, 81, 81, 81, 81, 81, 81,
+ 81, 81, 81, 81, 81, 81, 81, 81, 81, 81,
+ 81, 81, 81, 81, 81, 81, 81, 81, 81, 81,
+ 81, 81, 81, 81, 81, 81,
+#else
+ 81, 81, 81, 81, 81, 81, 81, 81, 81, 81,
+ 81, 81, 81, 81, 81, 81, 81, 81, 81, 81,
+ 81, 81, 81, 81, 81, 81, 81, 81, 81, 81,
+ 81, 81, 81, 81, 81, 81, 81, 81, 81, 81,
+ 81, 81, 81, 81, 81, 81, 81, 81, 81, 81,
+ 81, 81, 81, 81, 81, 81, 81, 81, 81, 81,
+ 81, 81, 81, 81, 81, 81, 81, 81, 81, 81,
+ 81, 81, 81, 81, 81, 81, 81, 81, 81, 81,
+ 81, 81, 81, 81, 81, 81, 81, 81, 81, 81,
+ 81, 81, 81, 81, 81, 0, 81, 0, 81, 30,
+ 20, 0, 81, 81, 81, 10, 81, 81, 0, 0,
+ 5, 81, 0, 81, 81, 20, 35, 81, 81, 81,
+ 10, 5, 81, 81, 81, 81, 81, 81,
+#endif /* ACE_MVS */
+ };
+ return len + asso_values[(int) str[len - 1]] + asso_values[(int) str[0]];
+}
+
+const TAO_operation_db_entry *
+TAO_CORBA_InterfaceDef_Perfect_Hash_OpTable::lookup (const char *str, unsigned int len)
+{
+ enum
+ {
+ TOTAL_KEYWORDS = 43,
+ MIN_WORD_LENGTH = 4,
+ MAX_WORD_LENGTH = 26,
+ MIN_HASH_VALUE = 4,
+ MAX_HASH_VALUE = 80,
+ HASH_VALUE_RANGE = 77,
+ DUPLICATES = 10,
+ WORDLIST_SIZE = 47
+ };
+
+ static const TAO_operation_db_entry wordlist[] =
+ {
+ {"",0,0},{"",0,0},{"",0,0},{"",0,0},
+ {"move", &POA_CORBA::InterfaceDef::move_skel, 0},
+ {"_is_a", &POA_CORBA::InterfaceDef::_is_a_skel, 0},
+ {"lookup", &POA_CORBA::InterfaceDef::lookup_skel, 0},
+ {"_get_name", &POA_CORBA::InterfaceDef::_get_name_skel, 0},
+ {"_get_type", &POA_CORBA::InterfaceDef::_get_type_skel, 0},
+ {"_set_name", &POA_CORBA::InterfaceDef::_set_name_skel, 0},
+ {"_interface", &POA_CORBA::InterfaceDef::_interface_skel, 0},
+ {"lookup_name", &POA_CORBA::InterfaceDef::lookup_name_skel, 0},
+ {"is_a", &POA_CORBA::InterfaceDef::is_a_skel, 0},
+ {"_get_version", &POA_CORBA::InterfaceDef::_get_version_skel, 0},
+ {"_set_version", &POA_CORBA::InterfaceDef::_set_version_skel, 0},
+ {"_get_absolute_name", &POA_CORBA::InterfaceDef::_get_absolute_name_skel, 0},
+ {"_get_defined_in", &POA_CORBA::InterfaceDef::_get_defined_in_skel, 0},
+ {"_get_id", &POA_CORBA::InterfaceDef::_get_id_skel, 0},
+ {"_set_id", &POA_CORBA::InterfaceDef::_set_id_skel, 0},
+ {"describe", &POA_CORBA::InterfaceDef::describe_skel, 0},
+ {"_get_containing_repository", &POA_CORBA::InterfaceDef::_get_containing_repository_skel, 0},
+ {"destroy", &POA_CORBA::InterfaceDef::destroy_skel, 0},
+ {"_get_def_kind", &POA_CORBA::InterfaceDef::_get_def_kind_skel, 0},
+ {"_repository_id", &POA_CORBA::InterfaceDef::_repository_id_skel, 0},
+ {"describe_interface", &POA_CORBA::InterfaceDef::describe_interface_skel, 0},
+ {"_get_base_interfaces", &POA_CORBA::InterfaceDef::_get_base_interfaces_skel, 0},
+ {"_set_base_interfaces", &POA_CORBA::InterfaceDef::_set_base_interfaces_skel, 0},
+ {"create_enum", &POA_CORBA::InterfaceDef::create_enum_skel, 0},
+ {"create_value", &POA_CORBA::InterfaceDef::create_value_skel, 0},
+ {"create_module", &POA_CORBA::InterfaceDef::create_module_skel, 0},
+ {"create_native", &POA_CORBA::InterfaceDef::create_native_skel, 0},
+ {"_component", &POA_CORBA::InterfaceDef::_component_skel, 0},
+ {"create_interface", &POA_CORBA::InterfaceDef::create_interface_skel, 0},
+ {"create_attribute", &POA_CORBA::InterfaceDef::create_attribute_skel, 0},
+ {"create_ext_value", &POA_CORBA::InterfaceDef::create_ext_value_skel, 0},
+ {"create_union", &POA_CORBA::InterfaceDef::create_union_skel, 0},
+ {"_non_existent", &POA_CORBA::InterfaceDef::_non_existent_skel, 0},
+ {"create_exception", &POA_CORBA::InterfaceDef::create_exception_skel, 0},
+ {"create_operation", &POA_CORBA::InterfaceDef::create_operation_skel, 0},
+ {"create_local_interface", &POA_CORBA::InterfaceDef::create_local_interface_skel, 0},
+ {"create_abstract_interface", &POA_CORBA::InterfaceDef::create_abstract_interface_skel, 0},
+ {"create_value_box", &POA_CORBA::InterfaceDef::create_value_box_skel, 0},
+ {"describe_contents", &POA_CORBA::InterfaceDef::describe_contents_skel, 0},
+ {"contents", &POA_CORBA::InterfaceDef::contents_skel, 0},
+ {"create_alias", &POA_CORBA::InterfaceDef::create_alias_skel, 0},
+ {"create_struct", &POA_CORBA::InterfaceDef::create_struct_skel, 0},
+ {"create_constant", &POA_CORBA::InterfaceDef::create_constant_skel, 0},
+ };
+
+ static const signed char lookup[] =
+ {
+ -1, -1, -1, -1, 4, 5, 6, -7, -3, -82, 10, 11, -1, -1,
+ 12, -13, -2, -82, 15, -1, 16, -1, -1, -17, -2, -25, -2, -84,
+ 19, -29, -2, 20, 21, 22, 23, -1, -32, -3, 24, -1, -95, 27,
+ 28, -94, -1, 31, -90, 35, 36, -37, -2, -82, 39, -1, -1, 40,
+ 41, 42, 43, -1, -1, -1, 44, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1, 45, -1, 46,
+ };
+
+ if (len <= MAX_WORD_LENGTH && len >= MIN_WORD_LENGTH)
+ {
+ unsigned int key = hash (str, len);
+
+ if (key <= MAX_HASH_VALUE && key >= MIN_HASH_VALUE)
+ {
+ int slot = lookup[key];
+
+ if (slot >= 0 && slot < WORDLIST_SIZE)
+ {
+ const char *s = wordlist[slot].opname;
+
+ if (*str == *s && !strncmp (str + 1, s + 1, len - 1))
+ return &wordlist[slot];
+ }
+ else if (slot < 0 && slot >= -MAX_HASH_VALUE)
+ return 0;
+ else
+ {
+ unsigned int offset = key + slot + (slot > 0 ? -MAX_HASH_VALUE : MAX_HASH_VALUE);
+ const TAO_operation_db_entry *base = &wordlist[-lookup[offset]];
+ const TAO_operation_db_entry *ptr = base + -lookup[offset + 1];
+
+ while (--ptr >= base)
+ if (*str == *ptr->opname && !strncmp (str + 1, ptr->opname + 1, len - 1))
+ return ptr;
+ }
+ }
+ }
+ return 0;
+}
+
+static TAO_CORBA_InterfaceDef_Perfect_Hash_OpTable tao_CORBA_InterfaceDef_optable;
+
+// TAO_IDL - Generated from
+// be\be_visitor_interface/interface_ss.cpp:966
+
+TAO::Collocation_Proxy_Broker *
+CORBA__TAO_InterfaceDef_Proxy_Broker_Factory_function ( ::CORBA::Object_ptr)
+{
+ return reinterpret_cast<TAO::Collocation_Proxy_Broker *> (0xdead); // Dummy
+}
+
+int
+CORBA__TAO_InterfaceDef_Proxy_Broker_Factory_Initializer (size_t)
+{
+ CORBA__TAO_InterfaceDef_Proxy_Broker_Factory_function_pointer =
+ CORBA__TAO_InterfaceDef_Proxy_Broker_Factory_function;
+
+ return 0;
+}
+
+static int
+CORBA__TAO_InterfaceDef_Proxy_Broker_Stub_Factory_Initializer_Scarecrow =
+ CORBA__TAO_InterfaceDef_Proxy_Broker_Factory_Initializer (
+ reinterpret_cast<size_t> (CORBA__TAO_InterfaceDef_Proxy_Broker_Factory_Initializer)
+ );
+
+// TAO_IDL - Generated from
+// be\be_visitor_interface/interface_ss.cpp:103
+
+POA_CORBA::InterfaceDef::InterfaceDef (void)
+ : TAO_ServantBase ()
+{
+ this->optable_ = &tao_CORBA_InterfaceDef_optable;
+}
+
+POA_CORBA::InterfaceDef::InterfaceDef (const InterfaceDef& rhs)
+ : TAO_Abstract_ServantBase (rhs),
+ TAO_ServantBase (rhs),
+ POA_CORBA::IRObject (rhs),
+ POA_CORBA::Container (rhs),
+ POA_CORBA::Contained (rhs),
+ POA_CORBA::IDLType (rhs)
+{
+}
+
+POA_CORBA::InterfaceDef::~InterfaceDef (void)
+{
+}namespace POA_CORBA
+{
+
+
+ // TAO_IDL - Generated from
+ // be\be_visitor_operation/upcall_command_ss.cpp:127
+
+ class _get_base_interfaces_InterfaceDef
+ : public TAO::Upcall_Command
+ {
+ public:
+ inline _get_base_interfaces_InterfaceDef (
+ POA_CORBA::InterfaceDef * servant,
+ TAO_Operation_Details const * operation_details,
+ TAO::Argument * const args[])
+ : servant_ (servant)
+ , operation_details_ (operation_details)
+ , args_ (args)
+ {
+ }
+
+ virtual void execute (ACE_ENV_SINGLE_ARG_DECL)
+ {
+ TAO::SArg_Traits< ::CORBA::InterfaceDefSeq>::ret_arg_type retval =
+ TAO::Portable_Server::get_ret_arg< ::CORBA::InterfaceDefSeq> (
+ this->operation_details_,
+ this->args_);
+
+ retval =
+ this->servant_->base_interfaces (
+ ACE_ENV_SINGLE_ARG_PARAMETER);
+ ACE_CHECK;
+ }
+
+ private:
+ POA_CORBA::InterfaceDef * const servant_;
+ TAO_Operation_Details const * const operation_details_;
+ TAO::Argument * const * const args_;
+ };
+}
+
+
+// TAO_IDL - Generated from
+// be\be_visitor_operation/operation_ss.cpp:190
+
+void POA_CORBA::InterfaceDef::_get_base_interfaces_skel (
+ TAO_ServerRequest & server_request,
+ void * TAO_INTERCEPTOR (servant_upcall),
+ void * servant
+ ACE_ENV_ARG_DECL
+ )
+{
+#if TAO_HAS_INTERCEPTORS == 1
+ static ::CORBA::TypeCode_ptr const * const exceptions = 0;
+ static ::CORBA::ULong const nexceptions = 0;
+#endif /* TAO_HAS_INTERCEPTORS */
+
+ TAO::SArg_Traits< ::CORBA::InterfaceDefSeq>::ret_val retval;
+
+ TAO::Argument * const args[] =
+ {
+ &retval
+ };
+
+ static size_t const nargs = 1;
+
+ POA_CORBA::InterfaceDef * const impl =
+ static_cast<POA_CORBA::InterfaceDef *> (servant);
+
+ _get_base_interfaces_InterfaceDef command (
+ impl,
+ server_request.operation_details (),
+ args);
+
+ TAO::Upcall_Wrapper upcall_wrapper;
+ upcall_wrapper.upcall (server_request
+ , args
+ , nargs
+ , command
+#if TAO_HAS_INTERCEPTORS == 1
+ , servant_upcall
+ , exceptions
+ , nexceptions
+#endif /* TAO_HAS_INTERCEPTORS == 1 */
+ ACE_ENV_ARG_PARAMETER);
+ ACE_CHECK;
+}namespace POA_CORBA
+{
+
+
+ // TAO_IDL - Generated from
+ // be\be_visitor_operation/upcall_command_ss.cpp:127
+
+ class _set_base_interfaces_InterfaceDef
+ : public TAO::Upcall_Command
+ {
+ public:
+ inline _set_base_interfaces_InterfaceDef (
+ POA_CORBA::InterfaceDef * servant,
+ TAO_Operation_Details const * operation_details,
+ TAO::Argument * const args[])
+ : servant_ (servant)
+ , operation_details_ (operation_details)
+ , args_ (args)
+ {
+ }
+
+ virtual void execute (ACE_ENV_SINGLE_ARG_DECL)
+ {
+ TAO::SArg_Traits< ::CORBA::InterfaceDefSeq>::in_arg_type arg_1 =
+ TAO::Portable_Server::get_in_arg< ::CORBA::InterfaceDefSeq> (
+ this->operation_details_,
+ this->args_,
+ 1);
+
+ this->servant_->base_interfaces (
+ arg_1
+ ACE_ENV_ARG_PARAMETER);
+ ACE_CHECK;
+ }
+
+ private:
+ POA_CORBA::InterfaceDef * const servant_;
+ TAO_Operation_Details const * const operation_details_;
+ TAO::Argument * const * const args_;
+ };
+}
+
+
+// TAO_IDL - Generated from
+// be\be_visitor_operation/operation_ss.cpp:190
+
+void POA_CORBA::InterfaceDef::_set_base_interfaces_skel (
+ TAO_ServerRequest & server_request,
+ void * TAO_INTERCEPTOR (servant_upcall),
+ void * servant
+ ACE_ENV_ARG_DECL
+ )
+{
+#if TAO_HAS_INTERCEPTORS == 1
+ static ::CORBA::TypeCode_ptr const * const exceptions = 0;
+ static ::CORBA::ULong const nexceptions = 0;
+#endif /* TAO_HAS_INTERCEPTORS */
+
+ TAO::SArg_Traits< void>::ret_val retval;
+ TAO::SArg_Traits< ::CORBA::InterfaceDefSeq>::in_arg_val _tao_base_interfaces;
+
+ TAO::Argument * const args[] =
+ {
+ &retval,
+ &_tao_base_interfaces
+ };
+
+ static size_t const nargs = 2;
+
+ POA_CORBA::InterfaceDef * const impl =
+ static_cast<POA_CORBA::InterfaceDef *> (servant);
+
+ _set_base_interfaces_InterfaceDef command (
+ impl,
+ server_request.operation_details (),
+ args);
+
+ TAO::Upcall_Wrapper upcall_wrapper;
+ upcall_wrapper.upcall (server_request
+ , args
+ , nargs
+ , command
+#if TAO_HAS_INTERCEPTORS == 1
+ , servant_upcall
+ , exceptions
+ , nexceptions
+#endif /* TAO_HAS_INTERCEPTORS == 1 */
+ ACE_ENV_ARG_PARAMETER);
+ ACE_CHECK;
+}namespace POA_CORBA
+{
+
+
+ // TAO_IDL - Generated from
+ // be\be_visitor_operation/upcall_command_ss.cpp:127
+
+ class is_a_InterfaceDef
+ : public TAO::Upcall_Command
+ {
+ public:
+ inline is_a_InterfaceDef (
+ POA_CORBA::InterfaceDef * servant,
+ TAO_Operation_Details const * operation_details,
+ TAO::Argument * const args[])
+ : servant_ (servant)
+ , operation_details_ (operation_details)
+ , args_ (args)
+ {
+ }
+
+ virtual void execute (ACE_ENV_SINGLE_ARG_DECL)
+ {
+ TAO::SArg_Traits< ::ACE_InputCDR::to_boolean>::ret_arg_type retval =
+ TAO::Portable_Server::get_ret_arg< ::ACE_InputCDR::to_boolean> (
+ this->operation_details_,
+ this->args_);
+
+ TAO::SArg_Traits< ::CORBA::RepositoryId>::in_arg_type arg_1 =
+ TAO::Portable_Server::get_in_arg< ::CORBA::RepositoryId> (
+ this->operation_details_,
+ this->args_,
+ 1);
+
+ retval =
+ this->servant_->is_a (
+ arg_1
+ ACE_ENV_ARG_PARAMETER);
+ ACE_CHECK;
+ }
+
+ private:
+ POA_CORBA::InterfaceDef * const servant_;
+ TAO_Operation_Details const * const operation_details_;
+ TAO::Argument * const * const args_;
+ };
+}
+
+
+// TAO_IDL - Generated from
+// be\be_visitor_operation/operation_ss.cpp:190
+
+void POA_CORBA::InterfaceDef::is_a_skel (
+ TAO_ServerRequest & server_request,
+ void * TAO_INTERCEPTOR (servant_upcall),
+ void * servant
+ ACE_ENV_ARG_DECL
+ )
+{
+#if TAO_HAS_INTERCEPTORS == 1
+ static ::CORBA::TypeCode_ptr const * const exceptions = 0;
+ static ::CORBA::ULong const nexceptions = 0;
+#endif /* TAO_HAS_INTERCEPTORS */
+
+ TAO::SArg_Traits< ::ACE_InputCDR::to_boolean>::ret_val retval;
+ TAO::SArg_Traits< ::CORBA::RepositoryId>::in_arg_val _tao_interface_id;
+
+ TAO::Argument * const args[] =
+ {
+ &retval,
+ &_tao_interface_id
+ };
+
+ static size_t const nargs = 2;
+
+ POA_CORBA::InterfaceDef * const impl =
+ static_cast<POA_CORBA::InterfaceDef *> (servant);
+
+ is_a_InterfaceDef command (
+ impl,
+ server_request.operation_details (),
+ args);
+
+ TAO::Upcall_Wrapper upcall_wrapper;
+ upcall_wrapper.upcall (server_request
+ , args
+ , nargs
+ , command
+#if TAO_HAS_INTERCEPTORS == 1
+ , servant_upcall
+ , exceptions
+ , nexceptions
+#endif /* TAO_HAS_INTERCEPTORS == 1 */
+ ACE_ENV_ARG_PARAMETER);
+ ACE_CHECK;
+}namespace POA_CORBA
+{
+
+
+ // TAO_IDL - Generated from
+ // be\be_visitor_operation/upcall_command_ss.cpp:127
+
+ class describe_interface_InterfaceDef
+ : public TAO::Upcall_Command
+ {
+ public:
+ inline describe_interface_InterfaceDef (
+ POA_CORBA::InterfaceDef * servant,
+ TAO_Operation_Details const * operation_details,
+ TAO::Argument * const args[])
+ : servant_ (servant)
+ , operation_details_ (operation_details)
+ , args_ (args)
+ {
+ }
+
+ virtual void execute (ACE_ENV_SINGLE_ARG_DECL)
+ {
+ TAO::SArg_Traits< ::CORBA::InterfaceDef::FullInterfaceDescription>::ret_arg_type retval =
+ TAO::Portable_Server::get_ret_arg< ::CORBA::InterfaceDef::FullInterfaceDescription> (
+ this->operation_details_,
+ this->args_);
+
+ retval =
+ this->servant_->describe_interface (
+ ACE_ENV_SINGLE_ARG_PARAMETER);
+ ACE_CHECK;
+ }
+
+ private:
+ POA_CORBA::InterfaceDef * const servant_;
+ TAO_Operation_Details const * const operation_details_;
+ TAO::Argument * const * const args_;
+ };
+}
+
+
+// TAO_IDL - Generated from
+// be\be_visitor_operation/operation_ss.cpp:190
+
+void POA_CORBA::InterfaceDef::describe_interface_skel (
+ TAO_ServerRequest & server_request,
+ void * TAO_INTERCEPTOR (servant_upcall),
+ void * servant
+ ACE_ENV_ARG_DECL
+ )
+{
+#if TAO_HAS_INTERCEPTORS == 1
+ static ::CORBA::TypeCode_ptr const * const exceptions = 0;
+ static ::CORBA::ULong const nexceptions = 0;
+#endif /* TAO_HAS_INTERCEPTORS */
+
+ TAO::SArg_Traits< ::CORBA::InterfaceDef::FullInterfaceDescription>::ret_val retval;
+
+ TAO::Argument * const args[] =
+ {
+ &retval
+ };
+
+ static size_t const nargs = 1;
+
+ POA_CORBA::InterfaceDef * const impl =
+ static_cast<POA_CORBA::InterfaceDef *> (servant);
+
+ describe_interface_InterfaceDef command (
+ impl,
+ server_request.operation_details (),
+ args);
+
+ TAO::Upcall_Wrapper upcall_wrapper;
+ upcall_wrapper.upcall (server_request
+ , args
+ , nargs
+ , command
+#if TAO_HAS_INTERCEPTORS == 1
+ , servant_upcall
+ , exceptions
+ , nexceptions
+#endif /* TAO_HAS_INTERCEPTORS == 1 */
+ ACE_ENV_ARG_PARAMETER);
+ ACE_CHECK;
+}namespace POA_CORBA
+{
+
+
+ // TAO_IDL - Generated from
+ // be\be_visitor_operation/upcall_command_ss.cpp:127
+
+ class create_attribute_InterfaceDef
+ : public TAO::Upcall_Command
+ {
+ public:
+ inline create_attribute_InterfaceDef (
+ POA_CORBA::InterfaceDef * servant,
+ TAO_Operation_Details const * operation_details,
+ TAO::Argument * const args[])
+ : servant_ (servant)
+ , operation_details_ (operation_details)
+ , args_ (args)
+ {
+ }
+
+ virtual void execute (ACE_ENV_SINGLE_ARG_DECL)
+ {
+ TAO::SArg_Traits< ::CORBA::AttributeDef>::ret_arg_type retval =
+ TAO::Portable_Server::get_ret_arg< ::CORBA::AttributeDef> (
+ this->operation_details_,
+ this->args_);
+
+ TAO::SArg_Traits< ::CORBA::RepositoryId>::in_arg_type arg_1 =
+ TAO::Portable_Server::get_in_arg< ::CORBA::RepositoryId> (
+ this->operation_details_,
+ this->args_,
+ 1);
+
+ TAO::SArg_Traits< ::CORBA::Identifier>::in_arg_type arg_2 =
+ TAO::Portable_Server::get_in_arg< ::CORBA::Identifier> (
+ this->operation_details_,
+ this->args_,
+ 2);
+
+ TAO::SArg_Traits< ::CORBA::VersionSpec>::in_arg_type arg_3 =
+ TAO::Portable_Server::get_in_arg< ::CORBA::VersionSpec> (
+ this->operation_details_,
+ this->args_,
+ 3);
+
+ TAO::SArg_Traits< ::CORBA::IDLType>::in_arg_type arg_4 =
+ TAO::Portable_Server::get_in_arg< ::CORBA::IDLType> (
+ this->operation_details_,
+ this->args_,
+ 4);
+
+ TAO::SArg_Traits< ::CORBA::AttributeMode>::in_arg_type arg_5 =
+ TAO::Portable_Server::get_in_arg< ::CORBA::AttributeMode> (
+ this->operation_details_,
+ this->args_,
+ 5);
+
+ retval =
+ this->servant_->create_attribute (
+ arg_1
+ , arg_2
+ , arg_3
+ , arg_4
+ , arg_5
+ ACE_ENV_ARG_PARAMETER);
+ ACE_CHECK;
+ }
+
+ private:
+ POA_CORBA::InterfaceDef * const servant_;
+ TAO_Operation_Details const * const operation_details_;
+ TAO::Argument * const * const args_;
+ };
+}
+
+
+// TAO_IDL - Generated from
+// be\be_visitor_operation/operation_ss.cpp:190
+
+void POA_CORBA::InterfaceDef::create_attribute_skel (
+ TAO_ServerRequest & server_request,
+ void * TAO_INTERCEPTOR (servant_upcall),
+ void * servant
+ ACE_ENV_ARG_DECL
+ )
+{
+#if TAO_HAS_INTERCEPTORS == 1
+ static ::CORBA::TypeCode_ptr const * const exceptions = 0;
+ static ::CORBA::ULong const nexceptions = 0;
+#endif /* TAO_HAS_INTERCEPTORS */
+
+ TAO::SArg_Traits< ::CORBA::AttributeDef>::ret_val retval;
+ TAO::SArg_Traits< ::CORBA::RepositoryId>::in_arg_val _tao_id;
+ TAO::SArg_Traits< ::CORBA::Identifier>::in_arg_val _tao_name;
+ TAO::SArg_Traits< ::CORBA::VersionSpec>::in_arg_val _tao_version;
+ TAO::SArg_Traits< ::CORBA::IDLType>::in_arg_val _tao_type;
+ TAO::SArg_Traits< ::CORBA::AttributeMode>::in_arg_val _tao_mode;
+
+ TAO::Argument * const args[] =
+ {
+ &retval,
+ &_tao_id,
+ &_tao_name,
+ &_tao_version,
+ &_tao_type,
+ &_tao_mode
+ };
+
+ static size_t const nargs = 6;
+
+ POA_CORBA::InterfaceDef * const impl =
+ static_cast<POA_CORBA::InterfaceDef *> (servant);
+
+ create_attribute_InterfaceDef command (
+ impl,
+ server_request.operation_details (),
+ args);
+
+ TAO::Upcall_Wrapper upcall_wrapper;
+ upcall_wrapper.upcall (server_request
+ , args
+ , nargs
+ , command
+#if TAO_HAS_INTERCEPTORS == 1
+ , servant_upcall
+ , exceptions
+ , nexceptions
+#endif /* TAO_HAS_INTERCEPTORS == 1 */
+ ACE_ENV_ARG_PARAMETER);
+ ACE_CHECK;
+}namespace POA_CORBA
+{
+
+
+ // TAO_IDL - Generated from
+ // be\be_visitor_operation/upcall_command_ss.cpp:127
+
+ class create_operation_InterfaceDef
+ : public TAO::Upcall_Command
+ {
+ public:
+ inline create_operation_InterfaceDef (
+ POA_CORBA::InterfaceDef * servant,
+ TAO_Operation_Details const * operation_details,
+ TAO::Argument * const args[])
+ : servant_ (servant)
+ , operation_details_ (operation_details)
+ , args_ (args)
+ {
+ }
+
+ virtual void execute (ACE_ENV_SINGLE_ARG_DECL)
+ {
+ TAO::SArg_Traits< ::CORBA::OperationDef>::ret_arg_type retval =
+ TAO::Portable_Server::get_ret_arg< ::CORBA::OperationDef> (
+ this->operation_details_,
+ this->args_);
+
+ TAO::SArg_Traits< ::CORBA::RepositoryId>::in_arg_type arg_1 =
+ TAO::Portable_Server::get_in_arg< ::CORBA::RepositoryId> (
+ this->operation_details_,
+ this->args_,
+ 1);
+
+ TAO::SArg_Traits< ::CORBA::Identifier>::in_arg_type arg_2 =
+ TAO::Portable_Server::get_in_arg< ::CORBA::Identifier> (
+ this->operation_details_,
+ this->args_,
+ 2);
+
+ TAO::SArg_Traits< ::CORBA::VersionSpec>::in_arg_type arg_3 =
+ TAO::Portable_Server::get_in_arg< ::CORBA::VersionSpec> (
+ this->operation_details_,
+ this->args_,
+ 3);
+
+ TAO::SArg_Traits< ::CORBA::IDLType>::in_arg_type arg_4 =
+ TAO::Portable_Server::get_in_arg< ::CORBA::IDLType> (
+ this->operation_details_,
+ this->args_,
+ 4);
+
+ TAO::SArg_Traits< ::CORBA::OperationMode>::in_arg_type arg_5 =
+ TAO::Portable_Server::get_in_arg< ::CORBA::OperationMode> (
+ this->operation_details_,
+ this->args_,
+ 5);
+
+ TAO::SArg_Traits< ::CORBA::ParDescriptionSeq>::in_arg_type arg_6 =
+ TAO::Portable_Server::get_in_arg< ::CORBA::ParDescriptionSeq> (
+ this->operation_details_,
+ this->args_,
+ 6);
+
+ TAO::SArg_Traits< ::CORBA::ExceptionDefSeq>::in_arg_type arg_7 =
+ TAO::Portable_Server::get_in_arg< ::CORBA::ExceptionDefSeq> (
+ this->operation_details_,
+ this->args_,
+ 7);
+
+ TAO::SArg_Traits< ::CORBA::ContextIdSeq>::in_arg_type arg_8 =
+ TAO::Portable_Server::get_in_arg< ::CORBA::ContextIdSeq> (
+ this->operation_details_,
+ this->args_,
+ 8);
+
+ retval =
+ this->servant_->create_operation (
+ arg_1
+ , arg_2
+ , arg_3
+ , arg_4
+ , arg_5
+ , arg_6
+ , arg_7
+ , arg_8
+ ACE_ENV_ARG_PARAMETER);
+ ACE_CHECK;
+ }
+
+ private:
+ POA_CORBA::InterfaceDef * const servant_;
+ TAO_Operation_Details const * const operation_details_;
+ TAO::Argument * const * const args_;
+ };
+}
+
+
+// TAO_IDL - Generated from
+// be\be_visitor_operation/operation_ss.cpp:190
+
+void POA_CORBA::InterfaceDef::create_operation_skel (
+ TAO_ServerRequest & server_request,
+ void * TAO_INTERCEPTOR (servant_upcall),
+ void * servant
+ ACE_ENV_ARG_DECL
+ )
+{
+#if TAO_HAS_INTERCEPTORS == 1
+ static ::CORBA::TypeCode_ptr const * const exceptions = 0;
+ static ::CORBA::ULong const nexceptions = 0;
+#endif /* TAO_HAS_INTERCEPTORS */
+
+ TAO::SArg_Traits< ::CORBA::OperationDef>::ret_val retval;
+ TAO::SArg_Traits< ::CORBA::RepositoryId>::in_arg_val _tao_id;
+ TAO::SArg_Traits< ::CORBA::Identifier>::in_arg_val _tao_name;
+ TAO::SArg_Traits< ::CORBA::VersionSpec>::in_arg_val _tao_version;
+ TAO::SArg_Traits< ::CORBA::IDLType>::in_arg_val _tao_result;
+ TAO::SArg_Traits< ::CORBA::OperationMode>::in_arg_val _tao_mode;
+ TAO::SArg_Traits< ::CORBA::ParDescriptionSeq>::in_arg_val _tao_params;
+ TAO::SArg_Traits< ::CORBA::ExceptionDefSeq>::in_arg_val _tao_exceptions;
+ TAO::SArg_Traits< ::CORBA::ContextIdSeq>::in_arg_val _tao_contexts;
+
+ TAO::Argument * const args[] =
+ {
+ &retval,
+ &_tao_id,
+ &_tao_name,
+ &_tao_version,
+ &_tao_result,
+ &_tao_mode,
+ &_tao_params,
+ &_tao_exceptions,
+ &_tao_contexts
+ };
+
+ static size_t const nargs = 9;
+
+ POA_CORBA::InterfaceDef * const impl =
+ static_cast<POA_CORBA::InterfaceDef *> (servant);
+
+ create_operation_InterfaceDef command (
+ impl,
+ server_request.operation_details (),
+ args);
+
+ TAO::Upcall_Wrapper upcall_wrapper;
+ upcall_wrapper.upcall (server_request
+ , args
+ , nargs
+ , command
+#if TAO_HAS_INTERCEPTORS == 1
+ , servant_upcall
+ , exceptions
+ , nexceptions
+#endif /* TAO_HAS_INTERCEPTORS == 1 */
+ ACE_ENV_ARG_PARAMETER);
+ ACE_CHECK;
+}
+
+// TAO_IDL - Generated from
+// be\be_visitor_interface/interface_ss.cpp:169
+
+namespace POA_CORBA
+{
+
+
+ // TAO_IDL - Generated from
+ // be\be_visitor_operation/upcall_command_ss.cpp:127
+
+ class _is_a_InterfaceDef_Upcall_Command
+ : public TAO::Upcall_Command
+ {
+ public:
+ inline _is_a_InterfaceDef_Upcall_Command (
+ POA_CORBA::InterfaceDef * servant,
+ TAO_Operation_Details const * operation_details,
+ TAO::Argument * const args[])
+ : servant_ (servant)
+ , operation_details_ (operation_details)
+ , args_ (args)
+ {
+ }
+
+ virtual void execute (ACE_ENV_SINGLE_ARG_DECL)
+ {
+ TAO::SArg_Traits< ::ACE_InputCDR::to_boolean>::ret_arg_type retval =
+ TAO::Portable_Server::get_ret_arg< ::ACE_InputCDR::to_boolean> (
+ this->operation_details_,
+ this->args_);
+
+ TAO::SArg_Traits< ::CORBA::Char *>::in_arg_type arg_1 =
+ TAO::Portable_Server::get_in_arg< ::CORBA::Char *> (
+ this->operation_details_,
+ this->args_,
+ 1);
+
+ retval =
+ this->servant_-> _is_a (
+ arg_1
+ ACE_ENV_ARG_PARAMETER);
+ ACE_CHECK;
+ }
+
+ private:
+ POA_CORBA::InterfaceDef * const servant_;
+ TAO_Operation_Details const * const operation_details_;
+ TAO::Argument * const * const args_;
+ };
+}
+
+
+void POA_CORBA::InterfaceDef::_is_a_skel (
+ TAO_ServerRequest & server_request,
+ void * TAO_INTERCEPTOR (servant_upcall),
+ void * servant
+ ACE_ENV_ARG_DECL
+ )
+{
+#if TAO_HAS_INTERCEPTORS == 1
+ static ::CORBA::TypeCode_ptr const * const exceptions = 0;
+ static ::CORBA::ULong const nexceptions = 0;
+#endif /* TAO_HAS_INTERCEPTORS */
+
+ TAO::SArg_Traits< ::ACE_InputCDR::to_boolean>::ret_val retval;
+ TAO::SArg_Traits< ::CORBA::Char *>::in_arg_val _tao_repository_id;
+
+ TAO::Argument * const args[] =
+ {
+ &retval,
+ &_tao_repository_id
+ };
+
+ static size_t const nargs = 2;
+
+ POA_CORBA::InterfaceDef * const impl =
+ static_cast<POA_CORBA::InterfaceDef *> (servant);
+
+ _is_a_InterfaceDef_Upcall_Command command (
+ impl,
+ server_request.operation_details (),
+ args);
+
+ TAO::Upcall_Wrapper upcall_wrapper;
+ upcall_wrapper.upcall (server_request
+ , args
+ , nargs
+ , command
+#if TAO_HAS_INTERCEPTORS == 1
+ , servant_upcall
+ , exceptions
+ , nexceptions
+#endif /* TAO_HAS_INTERCEPTORS == 1 */
+ ACE_ENV_ARG_PARAMETER);
+ ACE_CHECK;
+}namespace POA_CORBA
+{
+
+
+ // TAO_IDL - Generated from
+ // be\be_visitor_operation/upcall_command_ss.cpp:127
+
+ class _non_existent_InterfaceDef_Upcall_Command
+ : public TAO::Upcall_Command
+ {
+ public:
+ inline _non_existent_InterfaceDef_Upcall_Command (
+ POA_CORBA::InterfaceDef * servant,
+ TAO_Operation_Details const * operation_details,
+ TAO::Argument * const args[])
+ : servant_ (servant)
+ , operation_details_ (operation_details)
+ , args_ (args)
+ {
+ }
+
+ virtual void execute (ACE_ENV_SINGLE_ARG_DECL)
+ {
+ TAO::SArg_Traits< ::ACE_InputCDR::to_boolean>::ret_arg_type retval =
+ TAO::Portable_Server::get_ret_arg< ::ACE_InputCDR::to_boolean> (
+ this->operation_details_,
+ this->args_);
+
+ retval =
+ this->servant_-> _non_existent (
+ ACE_ENV_SINGLE_ARG_PARAMETER);
+ ACE_CHECK;
+ }
+
+ private:
+ POA_CORBA::InterfaceDef * const servant_;
+ TAO_Operation_Details const * const operation_details_;
+ TAO::Argument * const * const args_;
+ };
+}
+
+
+void POA_CORBA::InterfaceDef::_non_existent_skel (
+ TAO_ServerRequest & server_request,
+ void * TAO_INTERCEPTOR (servant_upcall),
+ void * servant
+ ACE_ENV_ARG_DECL
+ )
+{
+#if TAO_HAS_INTERCEPTORS == 1
+ static ::CORBA::TypeCode_ptr const * const exceptions = 0;
+ static ::CORBA::ULong const nexceptions = 0;
+#endif /* TAO_HAS_INTERCEPTORS */
+
+ TAO::SArg_Traits< ::ACE_InputCDR::to_boolean>::ret_val retval;
+
+ TAO::Argument * const args[] =
+ {
+ &retval
+ };
+
+ static size_t const nargs = 1;
+
+ POA_CORBA::InterfaceDef * const impl =
+ static_cast<POA_CORBA::InterfaceDef *> (servant);
+
+ _non_existent_InterfaceDef_Upcall_Command command (
+ impl,
+ server_request.operation_details (),
+ args);
+
+ TAO::Upcall_Wrapper upcall_wrapper;
+ upcall_wrapper.upcall (server_request
+ , args
+ , nargs
+ , command
+#if TAO_HAS_INTERCEPTORS == 1
+ , servant_upcall
+ , exceptions
+ , nexceptions
+#endif /* TAO_HAS_INTERCEPTORS == 1 */
+ ACE_ENV_ARG_PARAMETER);
+ ACE_CHECK;
+}namespace POA_CORBA
+{
+
+
+ // TAO_IDL - Generated from
+ // be\be_visitor_operation/upcall_command_ss.cpp:127
+
+ class _repository_id_InterfaceDef_Upcall_Command
+ : public TAO::Upcall_Command
+ {
+ public:
+ inline _repository_id_InterfaceDef_Upcall_Command (
+ POA_CORBA::InterfaceDef * servant,
+ TAO_Operation_Details const * operation_details,
+ TAO::Argument * const args[])
+ : servant_ (servant)
+ , operation_details_ (operation_details)
+ , args_ (args)
+ {
+ }
+
+ virtual void execute (ACE_ENV_SINGLE_ARG_DECL)
+ {
+ TAO::SArg_Traits< ::CORBA::Char *>::ret_arg_type retval =
+ TAO::Portable_Server::get_ret_arg< ::CORBA::Char *> (
+ this->operation_details_,
+ this->args_);
+
+ retval =
+ this->servant_-> _repository_id (
+ ACE_ENV_SINGLE_ARG_PARAMETER);
+ ACE_CHECK;
+ }
+
+ private:
+ POA_CORBA::InterfaceDef * const servant_;
+ TAO_Operation_Details const * const operation_details_;
+ TAO::Argument * const * const args_;
+ };
+}
+
+
+void POA_CORBA::InterfaceDef::_repository_id_skel (
+ TAO_ServerRequest & server_request,
+ void * TAO_INTERCEPTOR (servant_upcall),
+ void * servant
+ ACE_ENV_ARG_DECL
+ )
+{
+#if TAO_HAS_INTERCEPTORS == 1
+ static ::CORBA::TypeCode_ptr const * const exceptions = 0;
+ static ::CORBA::ULong const nexceptions = 0;
+#endif /* TAO_HAS_INTERCEPTORS */
+
+ TAO::SArg_Traits< ::CORBA::Char *>::ret_val retval;
+
+ TAO::Argument * const args[] =
+ {
+ &retval
+ };
+
+ static size_t const nargs = 1;
+
+ POA_CORBA::InterfaceDef * const impl =
+ static_cast<POA_CORBA::InterfaceDef *> (servant);
+
+ _repository_id_InterfaceDef_Upcall_Command command (
+ impl,
+ server_request.operation_details (),
+ args);
+
+ TAO::Upcall_Wrapper upcall_wrapper;
+ upcall_wrapper.upcall (server_request
+ , args
+ , nargs
+ , command
+#if TAO_HAS_INTERCEPTORS == 1
+ , servant_upcall
+ , exceptions
+ , nexceptions
+#endif /* TAO_HAS_INTERCEPTORS == 1 */
+ ACE_ENV_ARG_PARAMETER);
+ ACE_CHECK;
+}
+
+// TAO_IDL - Generated from
+// be\be_visitor_interface/interface_ss.cpp:513
+
+void POA_CORBA::InterfaceDef::_interface_skel (
+ TAO_ServerRequest & server_request,
+ void * /* servant_upcall */,
+ void * servant
+ ACE_ENV_ARG_DECL
+ )
+{
+ TAO_IFR_Client_Adapter *_tao_adapter =
+ ACE_Dynamic_Service<TAO_IFR_Client_Adapter>::instance (
+ TAO_ORB_Core::ifr_client_adapter_name ()
+ );
+
+ if (_tao_adapter == 0)
+ {
+ ACE_THROW ( ::CORBA::INTF_REPOS ( ::CORBA::OMGVMCID | 1,
+ ::CORBA::COMPLETED_NO));
+ }
+
+ POA_CORBA::InterfaceDef * const impl =
+ static_cast<POA_CORBA::InterfaceDef *> (servant);
+ ::CORBA::InterfaceDef_ptr _tao_retval =
+ impl->_get_interface (ACE_ENV_SINGLE_ARG_PARAMETER);
+ ACE_CHECK;
+
+ server_request.init_reply ();
+ TAO_OutputCDR &_tao_out = *server_request.outgoing ();
+
+ ::CORBA::Boolean const _tao_result =
+ _tao_adapter->interfacedef_cdr_insert (
+ _tao_out,
+ _tao_retval
+ );
+
+ _tao_adapter->dispose (_tao_retval);
+
+ if (_tao_result == false)
+ {
+ ACE_THROW ( ::CORBA::MARSHAL ());
+ }
+}namespace POA_CORBA
+{
+
+
+ // TAO_IDL - Generated from
+ // be\be_visitor_operation/upcall_command_ss.cpp:127
+
+ class _get_component_InterfaceDef_Upcall_Command
+ : public TAO::Upcall_Command
+ {
+ public:
+ inline _get_component_InterfaceDef_Upcall_Command (
+ POA_CORBA::InterfaceDef * servant,
+ TAO_Operation_Details const * operation_details,
+ TAO::Argument * const args[])
+ : servant_ (servant)
+ , operation_details_ (operation_details)
+ , args_ (args)
+ {
+ }
+
+ virtual void execute (ACE_ENV_SINGLE_ARG_DECL)
+ {
+ TAO::SArg_Traits< ::CORBA::Object>::ret_arg_type retval =
+ TAO::Portable_Server::get_ret_arg< ::CORBA::Object> (
+ this->operation_details_,
+ this->args_);
+
+ retval =
+ this->servant_-> _get_component (
+ ACE_ENV_SINGLE_ARG_PARAMETER);
+ ACE_CHECK;
+ }
+
+ private:
+ POA_CORBA::InterfaceDef * const servant_;
+ TAO_Operation_Details const * const operation_details_;
+ TAO::Argument * const * const args_;
+ };
+}
+
+
+void POA_CORBA::InterfaceDef::_component_skel (
+ TAO_ServerRequest & server_request,
+ void * TAO_INTERCEPTOR (servant_upcall),
+ void * servant
+ ACE_ENV_ARG_DECL
+ )
+{
+#if TAO_HAS_INTERCEPTORS == 1
+ static ::CORBA::TypeCode_ptr const * const exceptions = 0;
+ static ::CORBA::ULong const nexceptions = 0;
+#endif /* TAO_HAS_INTERCEPTORS */
+
+ TAO::SArg_Traits< ::CORBA::Object>::ret_val retval;
+
+ TAO::Argument * const args[] =
+ {
+ &retval
+ };
+
+ static size_t const nargs = 1;
+
+ POA_CORBA::InterfaceDef * const impl =
+ static_cast<POA_CORBA::InterfaceDef *> (servant);
+
+ _get_component_InterfaceDef_Upcall_Command command (
+ impl,
+ server_request.operation_details (),
+ args);
+
+ TAO::Upcall_Wrapper upcall_wrapper;
+ upcall_wrapper.upcall (server_request
+ , args
+ , nargs
+ , command
+#if TAO_HAS_INTERCEPTORS == 1
+ , servant_upcall
+ , exceptions
+ , nexceptions
+#endif /* TAO_HAS_INTERCEPTORS == 1 */
+ ACE_ENV_ARG_PARAMETER);
+ ACE_CHECK;
+}
+
+::CORBA::Boolean POA_CORBA::InterfaceDef::_is_a (
+ const char* value
+ ACE_ENV_ARG_DECL_NOT_USED
+ )
+{
+ return
+ (
+ !ACE_OS::strcmp (
+ value,
+ "IDL:omg.org/CORBA/IRObject:1.0"
+ ) ||
+ !ACE_OS::strcmp (
+ value,
+ "IDL:omg.org/CORBA/Container:1.0"
+ ) ||
+ !ACE_OS::strcmp (
+ value,
+ "IDL:omg.org/CORBA/Contained:1.0"
+ ) ||
+ !ACE_OS::strcmp (
+ value,
+ "IDL:omg.org/CORBA/IDLType:1.0"
+ ) ||
+ !ACE_OS::strcmp (
+ value,
+ "IDL:omg.org/CORBA/InterfaceDef:1.0"
+ ) ||
+ !ACE_OS::strcmp (
+ value,
+ "IDL:omg.org/CORBA/Object:1.0"
+ )
+ );
+}
+
+const char* POA_CORBA::InterfaceDef::_interface_repository_id (void) const
+{
+ return "IDL:omg.org/CORBA/InterfaceDef:1.0";
+}
+
+// TAO_IDL - Generated from
+// be\be_visitor_interface/interface_ss.cpp:903
+
+void POA_CORBA::InterfaceDef::_dispatch (
+ TAO_ServerRequest & req,
+ void * servant_upcall
+ ACE_ENV_ARG_DECL
+ )
+{
+ this->synchronous_upcall_dispatch (req,
+ servant_upcall,
+ this
+ ACE_ENV_ARG_PARAMETER);
+}
+
+// TAO_IDL - Generated from
+// be\be_visitor_interface/interface_ss.cpp:851
+
+CORBA::InterfaceDef *
+POA_CORBA::InterfaceDef::_this (ACE_ENV_SINGLE_ARG_DECL)
+{
+ TAO_Stub *stub = this->_create_stub (ACE_ENV_SINGLE_ARG_PARAMETER);
+ ACE_CHECK_RETURN (0);
+
+ TAO_Stub_Auto_Ptr safe_stub (stub);
+ ::CORBA::Object_ptr tmp = CORBA::Object::_nil ();
+
+ ::CORBA::Boolean const _tao_opt_colloc =
+ stub->servant_orb_var ()->orb_core ()->optimize_collocation_objects ();
+
+ ACE_NEW_RETURN (
+ tmp,
+ ::CORBA::Object (stub, _tao_opt_colloc, this),
+ 0
+ );
+
+ ::CORBA::Object_var obj = tmp;
+ (void) safe_stub.release ();
+
+ typedef ::CORBA::InterfaceDef STUB_SCOPED_NAME;
+ return
+ TAO::Narrow_Utils<STUB_SCOPED_NAME>::unchecked_narrow (
+ obj.in (),
+ CORBA__TAO_InterfaceDef_Proxy_Broker_Factory_function_pointer
+ );
+}
+
+// TAO_IDL - Generated from
+// be\be_interface.cpp:1499
+
+class TAO_CORBA_InterfaceAttrExtension_Perfect_Hash_OpTable
+ : public TAO_Perfect_Hash_OpTable
+{
+private:
+ unsigned int hash (const char *str, unsigned int len);
+
+public:
+ const TAO_operation_db_entry * lookup (const char *str, unsigned int len);
+};
+
+/* C++ code produced by gperf version 2.8 (ACE version) */
+/* Command-line: C:\ACE\latest\ACE_wrappers\bin\gperf.exe -m -M -J -c -C -D -E -T -f 0 -F 0,0 -a -o -t -p -K opname -L C++ -Z TAO_CORBA_InterfaceAttrExtension_Perfect_Hash_OpTable -N lookup */
+unsigned int
+TAO_CORBA_InterfaceAttrExtension_Perfect_Hash_OpTable::hash (const char *str, unsigned int len)
+{
+ static const unsigned char asso_values[] =
+ {
+#if defined (ACE_MVS)
+ 23, 23, 23, 23, 23, 23, 23, 23, 23, 23,
+ 23, 23, 23, 23, 23, 23, 23, 23, 23, 23,
+ 23, 23, 23, 23, 23, 23, 23, 23, 23, 23,
+ 23, 23, 23, 23, 23, 23, 23, 23, 23, 23,
+ 23, 23, 23, 23, 23, 23, 23, 23, 23, 23,
+ 23, 23, 23, 23, 23, 23, 23, 23, 23, 23,
+ 23, 23, 23, 23, 23, 23, 23, 23, 23, 23,
+ 23, 23, 23, 23, 23, 23, 23, 23, 23, 23,
+ 23, 23, 23, 23, 23, 23, 23, 23, 23, 23,
+ 23, 23, 23, 23, 23, 23, 23, 23, 23, 23,
+ 23, 23, 23, 23, 23, 23, 23, 23, 23, 0,
+ 23, 23, 23, 23, 23, 23, 23, 23, 23, 23,
+ 23, 23, 23, 23, 23, 23, 23, 23, 23, 0,
+ 23, 0, 0, 0, 23, 23, 23, 23, 23, 23,
+ 23, 23, 23, 23, 23, 23, 23, 23, 23, 23,
+ 23, 23, 23, 23, 23, 23, 23, 23, 23, 23,
+ 23, 23, 23, 5, 23, 23, 23, 23, 23, 23,
+ 23, 23, 23, 23, 23, 23, 23, 23, 23, 23,
+ 23, 23, 23, 23, 23, 23, 23, 23, 23, 23,
+ 23, 23, 23, 23, 23, 23, 23, 23, 23, 23,
+ 23, 23, 23, 23, 23, 23, 23, 23, 23, 23,
+ 23, 23, 23, 23, 23, 23, 23, 23, 23, 23,
+ 23, 23, 23, 23, 23, 23, 23, 23, 23, 23,
+ 23, 23, 23, 23, 23, 23, 23, 23, 23, 23,
+ 23, 23, 23, 23, 23, 23, 23, 23, 23, 23,
+ 23, 23, 23, 23, 23, 23,
+#else
+ 23, 23, 23, 23, 23, 23, 23, 23, 23, 23,
+ 23, 23, 23, 23, 23, 23, 23, 23, 23, 23,
+ 23, 23, 23, 23, 23, 23, 23, 23, 23, 23,
+ 23, 23, 23, 23, 23, 23, 23, 23, 23, 23,
+ 23, 23, 23, 23, 23, 23, 23, 23, 23, 23,
+ 23, 23, 23, 23, 23, 23, 23, 23, 23, 23,
+ 23, 23, 23, 23, 23, 23, 23, 23, 23, 23,
+ 23, 23, 23, 23, 23, 23, 23, 23, 23, 23,
+ 23, 23, 23, 23, 23, 23, 23, 23, 23, 23,
+ 23, 23, 23, 23, 23, 0, 23, 0, 23, 0,
+ 0, 0, 23, 23, 23, 23, 23, 23, 23, 23,
+ 23, 23, 23, 23, 23, 23, 5, 23, 23, 23,
+ 23, 23, 23, 23, 23, 23, 23, 23,
+#endif /* ACE_MVS */
+ };
+ return len + asso_values[(int) str[len - 1]] + asso_values[(int) str[0]];
+}
+
+const TAO_operation_db_entry *
+TAO_CORBA_InterfaceAttrExtension_Perfect_Hash_OpTable::lookup (const char *str, unsigned int len)
+{
+ enum
+ {
+ TOTAL_KEYWORDS = 7,
+ MIN_WORD_LENGTH = 5,
+ MAX_WORD_LENGTH = 22,
+ MIN_HASH_VALUE = 5,
+ MAX_HASH_VALUE = 22,
+ HASH_VALUE_RANGE = 18,
+ DUPLICATES = 0,
+ WORDLIST_SIZE = 12
+ };
+
+ static const TAO_operation_db_entry wordlist[] =
+ {
+ {"",0,0},{"",0,0},{"",0,0},{"",0,0},{"",0,0},
+ {"_is_a", &POA_CORBA::InterfaceAttrExtension::_is_a_skel, 0},
+ {"",0,0},{"",0,0},{"",0,0},{"",0,0},
+ {"_interface", &POA_CORBA::InterfaceAttrExtension::_interface_skel, 0},
+ {"",0,0},{"",0,0},{"",0,0},
+ {"_repository_id", &POA_CORBA::InterfaceAttrExtension::_repository_id_skel, 0},
+ {"_component", &POA_CORBA::InterfaceAttrExtension::_component_skel, 0},
+ {"",0,0},{"",0,0},
+ {"_non_existent", &POA_CORBA::InterfaceAttrExtension::_non_existent_skel, 0},
+ {"",0,0},
+ {"create_ext_attribute", &POA_CORBA::InterfaceAttrExtension::create_ext_attribute_skel, 0},
+ {"",0,0},
+ {"describe_ext_interface", &POA_CORBA::InterfaceAttrExtension::describe_ext_interface_skel, 0},
+ };
+
+ if (len <= MAX_WORD_LENGTH && len >= MIN_WORD_LENGTH)
+ {
+ unsigned int key = hash (str, len);
+
+ if (key <= MAX_HASH_VALUE && key >= MIN_HASH_VALUE)
+ {
+ const char *s = wordlist[key].opname;
+
+ if (*str == *s && !strncmp (str + 1, s + 1, len - 1))
+ return &wordlist[key];
+ }
+ }
+ return 0;
+}
+
+static TAO_CORBA_InterfaceAttrExtension_Perfect_Hash_OpTable tao_CORBA_InterfaceAttrExtension_optable;
+
+// TAO_IDL - Generated from
+// be\be_visitor_interface/interface_ss.cpp:966
+
+TAO::Collocation_Proxy_Broker *
+CORBA__TAO_InterfaceAttrExtension_Proxy_Broker_Factory_function ( ::CORBA::Object_ptr)
+{
+ return reinterpret_cast<TAO::Collocation_Proxy_Broker *> (0xdead); // Dummy
+}
+
+int
+CORBA__TAO_InterfaceAttrExtension_Proxy_Broker_Factory_Initializer (size_t)
+{
+ CORBA__TAO_InterfaceAttrExtension_Proxy_Broker_Factory_function_pointer =
+ CORBA__TAO_InterfaceAttrExtension_Proxy_Broker_Factory_function;
+
+ return 0;
+}
+
+static int
+CORBA__TAO_InterfaceAttrExtension_Proxy_Broker_Stub_Factory_Initializer_Scarecrow =
+ CORBA__TAO_InterfaceAttrExtension_Proxy_Broker_Factory_Initializer (
+ reinterpret_cast<size_t> (CORBA__TAO_InterfaceAttrExtension_Proxy_Broker_Factory_Initializer)
+ );
+
+// TAO_IDL - Generated from
+// be\be_visitor_interface/interface_ss.cpp:103
+
+POA_CORBA::InterfaceAttrExtension::InterfaceAttrExtension (void)
+ : TAO_ServantBase ()
+{
+ this->optable_ = &tao_CORBA_InterfaceAttrExtension_optable;
+}
+
+POA_CORBA::InterfaceAttrExtension::InterfaceAttrExtension (const InterfaceAttrExtension& rhs)
+ : TAO_Abstract_ServantBase (rhs),
+ TAO_ServantBase (rhs)
+{
+}
+
+POA_CORBA::InterfaceAttrExtension::~InterfaceAttrExtension (void)
+{
+}namespace POA_CORBA
+{
+
+
+ // TAO_IDL - Generated from
+ // be\be_visitor_operation/upcall_command_ss.cpp:127
+
+ class describe_ext_interface_InterfaceAttrExtension
+ : public TAO::Upcall_Command
+ {
+ public:
+ inline describe_ext_interface_InterfaceAttrExtension (
+ POA_CORBA::InterfaceAttrExtension * servant,
+ TAO_Operation_Details const * operation_details,
+ TAO::Argument * const args[])
+ : servant_ (servant)
+ , operation_details_ (operation_details)
+ , args_ (args)
+ {
+ }
+
+ virtual void execute (ACE_ENV_SINGLE_ARG_DECL)
+ {
+ TAO::SArg_Traits< ::CORBA::InterfaceAttrExtension::ExtFullInterfaceDescription>::ret_arg_type retval =
+ TAO::Portable_Server::get_ret_arg< ::CORBA::InterfaceAttrExtension::ExtFullInterfaceDescription> (
+ this->operation_details_,
+ this->args_);
+
+ retval =
+ this->servant_->describe_ext_interface (
+ ACE_ENV_SINGLE_ARG_PARAMETER);
+ ACE_CHECK;
+ }
+
+ private:
+ POA_CORBA::InterfaceAttrExtension * const servant_;
+ TAO_Operation_Details const * const operation_details_;
+ TAO::Argument * const * const args_;
+ };
+}
+
+
+// TAO_IDL - Generated from
+// be\be_visitor_operation/operation_ss.cpp:190
+
+void POA_CORBA::InterfaceAttrExtension::describe_ext_interface_skel (
+ TAO_ServerRequest & server_request,
+ void * TAO_INTERCEPTOR (servant_upcall),
+ void * servant
+ ACE_ENV_ARG_DECL
+ )
+{
+#if TAO_HAS_INTERCEPTORS == 1
+ static ::CORBA::TypeCode_ptr const * const exceptions = 0;
+ static ::CORBA::ULong const nexceptions = 0;
+#endif /* TAO_HAS_INTERCEPTORS */
+
+ TAO::SArg_Traits< ::CORBA::InterfaceAttrExtension::ExtFullInterfaceDescription>::ret_val retval;
+
+ TAO::Argument * const args[] =
+ {
+ &retval
+ };
+
+ static size_t const nargs = 1;
+
+ POA_CORBA::InterfaceAttrExtension * const impl =
+ static_cast<POA_CORBA::InterfaceAttrExtension *> (servant);
+
+ describe_ext_interface_InterfaceAttrExtension command (
+ impl,
+ server_request.operation_details (),
+ args);
+
+ TAO::Upcall_Wrapper upcall_wrapper;
+ upcall_wrapper.upcall (server_request
+ , args
+ , nargs
+ , command
+#if TAO_HAS_INTERCEPTORS == 1
+ , servant_upcall
+ , exceptions
+ , nexceptions
+#endif /* TAO_HAS_INTERCEPTORS == 1 */
+ ACE_ENV_ARG_PARAMETER);
+ ACE_CHECK;
+}namespace POA_CORBA
+{
+
+
+ // TAO_IDL - Generated from
+ // be\be_visitor_operation/upcall_command_ss.cpp:127
+
+ class create_ext_attribute_InterfaceAttrExtension
+ : public TAO::Upcall_Command
+ {
+ public:
+ inline create_ext_attribute_InterfaceAttrExtension (
+ POA_CORBA::InterfaceAttrExtension * servant,
+ TAO_Operation_Details const * operation_details,
+ TAO::Argument * const args[])
+ : servant_ (servant)
+ , operation_details_ (operation_details)
+ , args_ (args)
+ {
+ }
+
+ virtual void execute (ACE_ENV_SINGLE_ARG_DECL)
+ {
+ TAO::SArg_Traits< ::CORBA::ExtAttributeDef>::ret_arg_type retval =
+ TAO::Portable_Server::get_ret_arg< ::CORBA::ExtAttributeDef> (
+ this->operation_details_,
+ this->args_);
+
+ TAO::SArg_Traits< ::CORBA::RepositoryId>::in_arg_type arg_1 =
+ TAO::Portable_Server::get_in_arg< ::CORBA::RepositoryId> (
+ this->operation_details_,
+ this->args_,
+ 1);
+
+ TAO::SArg_Traits< ::CORBA::Identifier>::in_arg_type arg_2 =
+ TAO::Portable_Server::get_in_arg< ::CORBA::Identifier> (
+ this->operation_details_,
+ this->args_,
+ 2);
+
+ TAO::SArg_Traits< ::CORBA::VersionSpec>::in_arg_type arg_3 =
+ TAO::Portable_Server::get_in_arg< ::CORBA::VersionSpec> (
+ this->operation_details_,
+ this->args_,
+ 3);
+
+ TAO::SArg_Traits< ::CORBA::IDLType>::in_arg_type arg_4 =
+ TAO::Portable_Server::get_in_arg< ::CORBA::IDLType> (
+ this->operation_details_,
+ this->args_,
+ 4);
+
+ TAO::SArg_Traits< ::CORBA::AttributeMode>::in_arg_type arg_5 =
+ TAO::Portable_Server::get_in_arg< ::CORBA::AttributeMode> (
+ this->operation_details_,
+ this->args_,
+ 5);
+
+ TAO::SArg_Traits< ::CORBA::ExceptionDefSeq>::in_arg_type arg_6 =
+ TAO::Portable_Server::get_in_arg< ::CORBA::ExceptionDefSeq> (
+ this->operation_details_,
+ this->args_,
+ 6);
+
+ TAO::SArg_Traits< ::CORBA::ExceptionDefSeq>::in_arg_type arg_7 =
+ TAO::Portable_Server::get_in_arg< ::CORBA::ExceptionDefSeq> (
+ this->operation_details_,
+ this->args_,
+ 7);
+
+ retval =
+ this->servant_->create_ext_attribute (
+ arg_1
+ , arg_2
+ , arg_3
+ , arg_4
+ , arg_5
+ , arg_6
+ , arg_7
+ ACE_ENV_ARG_PARAMETER);
+ ACE_CHECK;
+ }
+
+ private:
+ POA_CORBA::InterfaceAttrExtension * const servant_;
+ TAO_Operation_Details const * const operation_details_;
+ TAO::Argument * const * const args_;
+ };
+}
+
+
+// TAO_IDL - Generated from
+// be\be_visitor_operation/operation_ss.cpp:190
+
+void POA_CORBA::InterfaceAttrExtension::create_ext_attribute_skel (
+ TAO_ServerRequest & server_request,
+ void * TAO_INTERCEPTOR (servant_upcall),
+ void * servant
+ ACE_ENV_ARG_DECL
+ )
+{
+#if TAO_HAS_INTERCEPTORS == 1
+ static ::CORBA::TypeCode_ptr const * const exceptions = 0;
+ static ::CORBA::ULong const nexceptions = 0;
+#endif /* TAO_HAS_INTERCEPTORS */
+
+ TAO::SArg_Traits< ::CORBA::ExtAttributeDef>::ret_val retval;
+ TAO::SArg_Traits< ::CORBA::RepositoryId>::in_arg_val _tao_id;
+ TAO::SArg_Traits< ::CORBA::Identifier>::in_arg_val _tao_name;
+ TAO::SArg_Traits< ::CORBA::VersionSpec>::in_arg_val _tao_version;
+ TAO::SArg_Traits< ::CORBA::IDLType>::in_arg_val _tao_type;
+ TAO::SArg_Traits< ::CORBA::AttributeMode>::in_arg_val _tao_mode;
+ TAO::SArg_Traits< ::CORBA::ExceptionDefSeq>::in_arg_val _tao_get_exceptions;
+ TAO::SArg_Traits< ::CORBA::ExceptionDefSeq>::in_arg_val _tao_set_exceptions;
+
+ TAO::Argument * const args[] =
+ {
+ &retval,
+ &_tao_id,
+ &_tao_name,
+ &_tao_version,
+ &_tao_type,
+ &_tao_mode,
+ &_tao_get_exceptions,
+ &_tao_set_exceptions
+ };
+
+ static size_t const nargs = 8;
+
+ POA_CORBA::InterfaceAttrExtension * const impl =
+ static_cast<POA_CORBA::InterfaceAttrExtension *> (servant);
+
+ create_ext_attribute_InterfaceAttrExtension command (
+ impl,
+ server_request.operation_details (),
+ args);
+
+ TAO::Upcall_Wrapper upcall_wrapper;
+ upcall_wrapper.upcall (server_request
+ , args
+ , nargs
+ , command
+#if TAO_HAS_INTERCEPTORS == 1
+ , servant_upcall
+ , exceptions
+ , nexceptions
+#endif /* TAO_HAS_INTERCEPTORS == 1 */
+ ACE_ENV_ARG_PARAMETER);
+ ACE_CHECK;
+}
+
+// TAO_IDL - Generated from
+// be\be_visitor_interface/interface_ss.cpp:169
+
+namespace POA_CORBA
+{
+
+
+ // TAO_IDL - Generated from
+ // be\be_visitor_operation/upcall_command_ss.cpp:127
+
+ class _is_a_InterfaceAttrExtension_Upcall_Command
+ : public TAO::Upcall_Command
+ {
+ public:
+ inline _is_a_InterfaceAttrExtension_Upcall_Command (
+ POA_CORBA::InterfaceAttrExtension * servant,
+ TAO_Operation_Details const * operation_details,
+ TAO::Argument * const args[])
+ : servant_ (servant)
+ , operation_details_ (operation_details)
+ , args_ (args)
+ {
+ }
+
+ virtual void execute (ACE_ENV_SINGLE_ARG_DECL)
+ {
+ TAO::SArg_Traits< ::ACE_InputCDR::to_boolean>::ret_arg_type retval =
+ TAO::Portable_Server::get_ret_arg< ::ACE_InputCDR::to_boolean> (
+ this->operation_details_,
+ this->args_);
+
+ TAO::SArg_Traits< ::CORBA::Char *>::in_arg_type arg_1 =
+ TAO::Portable_Server::get_in_arg< ::CORBA::Char *> (
+ this->operation_details_,
+ this->args_,
+ 1);
+
+ retval =
+ this->servant_-> _is_a (
+ arg_1
+ ACE_ENV_ARG_PARAMETER);
+ ACE_CHECK;
+ }
+
+ private:
+ POA_CORBA::InterfaceAttrExtension * const servant_;
+ TAO_Operation_Details const * const operation_details_;
+ TAO::Argument * const * const args_;
+ };
+}
+
+
+void POA_CORBA::InterfaceAttrExtension::_is_a_skel (
+ TAO_ServerRequest & server_request,
+ void * TAO_INTERCEPTOR (servant_upcall),
+ void * servant
+ ACE_ENV_ARG_DECL
+ )
+{
+#if TAO_HAS_INTERCEPTORS == 1
+ static ::CORBA::TypeCode_ptr const * const exceptions = 0;
+ static ::CORBA::ULong const nexceptions = 0;
+#endif /* TAO_HAS_INTERCEPTORS */
+
+ TAO::SArg_Traits< ::ACE_InputCDR::to_boolean>::ret_val retval;
+ TAO::SArg_Traits< ::CORBA::Char *>::in_arg_val _tao_repository_id;
+
+ TAO::Argument * const args[] =
+ {
+ &retval,
+ &_tao_repository_id
+ };
+
+ static size_t const nargs = 2;
+
+ POA_CORBA::InterfaceAttrExtension * const impl =
+ static_cast<POA_CORBA::InterfaceAttrExtension *> (servant);
+
+ _is_a_InterfaceAttrExtension_Upcall_Command command (
+ impl,
+ server_request.operation_details (),
+ args);
+
+ TAO::Upcall_Wrapper upcall_wrapper;
+ upcall_wrapper.upcall (server_request
+ , args
+ , nargs
+ , command
+#if TAO_HAS_INTERCEPTORS == 1
+ , servant_upcall
+ , exceptions
+ , nexceptions
+#endif /* TAO_HAS_INTERCEPTORS == 1 */
+ ACE_ENV_ARG_PARAMETER);
+ ACE_CHECK;
+}namespace POA_CORBA
+{
+
+
+ // TAO_IDL - Generated from
+ // be\be_visitor_operation/upcall_command_ss.cpp:127
+
+ class _non_existent_InterfaceAttrExtension_Upcall_Command
+ : public TAO::Upcall_Command
+ {
+ public:
+ inline _non_existent_InterfaceAttrExtension_Upcall_Command (
+ POA_CORBA::InterfaceAttrExtension * servant,
+ TAO_Operation_Details const * operation_details,
+ TAO::Argument * const args[])
+ : servant_ (servant)
+ , operation_details_ (operation_details)
+ , args_ (args)
+ {
+ }
+
+ virtual void execute (ACE_ENV_SINGLE_ARG_DECL)
+ {
+ TAO::SArg_Traits< ::ACE_InputCDR::to_boolean>::ret_arg_type retval =
+ TAO::Portable_Server::get_ret_arg< ::ACE_InputCDR::to_boolean> (
+ this->operation_details_,
+ this->args_);
+
+ retval =
+ this->servant_-> _non_existent (
+ ACE_ENV_SINGLE_ARG_PARAMETER);
+ ACE_CHECK;
+ }
+
+ private:
+ POA_CORBA::InterfaceAttrExtension * const servant_;
+ TAO_Operation_Details const * const operation_details_;
+ TAO::Argument * const * const args_;
+ };
+}
+
+
+void POA_CORBA::InterfaceAttrExtension::_non_existent_skel (
+ TAO_ServerRequest & server_request,
+ void * TAO_INTERCEPTOR (servant_upcall),
+ void * servant
+ ACE_ENV_ARG_DECL
+ )
+{
+#if TAO_HAS_INTERCEPTORS == 1
+ static ::CORBA::TypeCode_ptr const * const exceptions = 0;
+ static ::CORBA::ULong const nexceptions = 0;
+#endif /* TAO_HAS_INTERCEPTORS */
+
+ TAO::SArg_Traits< ::ACE_InputCDR::to_boolean>::ret_val retval;
+
+ TAO::Argument * const args[] =
+ {
+ &retval
+ };
+
+ static size_t const nargs = 1;
+
+ POA_CORBA::InterfaceAttrExtension * const impl =
+ static_cast<POA_CORBA::InterfaceAttrExtension *> (servant);
+
+ _non_existent_InterfaceAttrExtension_Upcall_Command command (
+ impl,
+ server_request.operation_details (),
+ args);
+
+ TAO::Upcall_Wrapper upcall_wrapper;
+ upcall_wrapper.upcall (server_request
+ , args
+ , nargs
+ , command
+#if TAO_HAS_INTERCEPTORS == 1
+ , servant_upcall
+ , exceptions
+ , nexceptions
+#endif /* TAO_HAS_INTERCEPTORS == 1 */
+ ACE_ENV_ARG_PARAMETER);
+ ACE_CHECK;
+}namespace POA_CORBA
+{
+
+
+ // TAO_IDL - Generated from
+ // be\be_visitor_operation/upcall_command_ss.cpp:127
+
+ class _repository_id_InterfaceAttrExtension_Upcall_Command
+ : public TAO::Upcall_Command
+ {
+ public:
+ inline _repository_id_InterfaceAttrExtension_Upcall_Command (
+ POA_CORBA::InterfaceAttrExtension * servant,
+ TAO_Operation_Details const * operation_details,
+ TAO::Argument * const args[])
+ : servant_ (servant)
+ , operation_details_ (operation_details)
+ , args_ (args)
+ {
+ }
+
+ virtual void execute (ACE_ENV_SINGLE_ARG_DECL)
+ {
+ TAO::SArg_Traits< ::CORBA::Char *>::ret_arg_type retval =
+ TAO::Portable_Server::get_ret_arg< ::CORBA::Char *> (
+ this->operation_details_,
+ this->args_);
+
+ retval =
+ this->servant_-> _repository_id (
+ ACE_ENV_SINGLE_ARG_PARAMETER);
+ ACE_CHECK;
+ }
+
+ private:
+ POA_CORBA::InterfaceAttrExtension * const servant_;
+ TAO_Operation_Details const * const operation_details_;
+ TAO::Argument * const * const args_;
+ };
+}
+
+
+void POA_CORBA::InterfaceAttrExtension::_repository_id_skel (
+ TAO_ServerRequest & server_request,
+ void * TAO_INTERCEPTOR (servant_upcall),
+ void * servant
+ ACE_ENV_ARG_DECL
+ )
+{
+#if TAO_HAS_INTERCEPTORS == 1
+ static ::CORBA::TypeCode_ptr const * const exceptions = 0;
+ static ::CORBA::ULong const nexceptions = 0;
+#endif /* TAO_HAS_INTERCEPTORS */
+
+ TAO::SArg_Traits< ::CORBA::Char *>::ret_val retval;
+
+ TAO::Argument * const args[] =
+ {
+ &retval
+ };
+
+ static size_t const nargs = 1;
+
+ POA_CORBA::InterfaceAttrExtension * const impl =
+ static_cast<POA_CORBA::InterfaceAttrExtension *> (servant);
+
+ _repository_id_InterfaceAttrExtension_Upcall_Command command (
+ impl,
+ server_request.operation_details (),
+ args);
+
+ TAO::Upcall_Wrapper upcall_wrapper;
+ upcall_wrapper.upcall (server_request
+ , args
+ , nargs
+ , command
+#if TAO_HAS_INTERCEPTORS == 1
+ , servant_upcall
+ , exceptions
+ , nexceptions
+#endif /* TAO_HAS_INTERCEPTORS == 1 */
+ ACE_ENV_ARG_PARAMETER);
+ ACE_CHECK;
+}
+
+// TAO_IDL - Generated from
+// be\be_visitor_interface/interface_ss.cpp:513
+
+void POA_CORBA::InterfaceAttrExtension::_interface_skel (
+ TAO_ServerRequest & server_request,
+ void * /* servant_upcall */,
+ void * servant
+ ACE_ENV_ARG_DECL
+ )
+{
+ TAO_IFR_Client_Adapter *_tao_adapter =
+ ACE_Dynamic_Service<TAO_IFR_Client_Adapter>::instance (
+ TAO_ORB_Core::ifr_client_adapter_name ()
+ );
+
+ if (_tao_adapter == 0)
+ {
+ ACE_THROW ( ::CORBA::INTF_REPOS ( ::CORBA::OMGVMCID | 1,
+ ::CORBA::COMPLETED_NO));
+ }
+
+ POA_CORBA::InterfaceAttrExtension * const impl =
+ static_cast<POA_CORBA::InterfaceAttrExtension *> (servant);
+ ::CORBA::InterfaceDef_ptr _tao_retval =
+ impl->_get_interface (ACE_ENV_SINGLE_ARG_PARAMETER);
+ ACE_CHECK;
+
+ server_request.init_reply ();
+ TAO_OutputCDR &_tao_out = *server_request.outgoing ();
+
+ ::CORBA::Boolean const _tao_result =
+ _tao_adapter->interfacedef_cdr_insert (
+ _tao_out,
+ _tao_retval
+ );
+
+ _tao_adapter->dispose (_tao_retval);
+
+ if (_tao_result == false)
+ {
+ ACE_THROW ( ::CORBA::MARSHAL ());
+ }
+}namespace POA_CORBA
+{
+
+
+ // TAO_IDL - Generated from
+ // be\be_visitor_operation/upcall_command_ss.cpp:127
+
+ class _get_component_InterfaceAttrExtension_Upcall_Command
+ : public TAO::Upcall_Command
+ {
+ public:
+ inline _get_component_InterfaceAttrExtension_Upcall_Command (
+ POA_CORBA::InterfaceAttrExtension * servant,
+ TAO_Operation_Details const * operation_details,
+ TAO::Argument * const args[])
+ : servant_ (servant)
+ , operation_details_ (operation_details)
+ , args_ (args)
+ {
+ }
+
+ virtual void execute (ACE_ENV_SINGLE_ARG_DECL)
+ {
+ TAO::SArg_Traits< ::CORBA::Object>::ret_arg_type retval =
+ TAO::Portable_Server::get_ret_arg< ::CORBA::Object> (
+ this->operation_details_,
+ this->args_);
+
+ retval =
+ this->servant_-> _get_component (
+ ACE_ENV_SINGLE_ARG_PARAMETER);
+ ACE_CHECK;
+ }
+
+ private:
+ POA_CORBA::InterfaceAttrExtension * const servant_;
+ TAO_Operation_Details const * const operation_details_;
+ TAO::Argument * const * const args_;
+ };
+}
+
+
+void POA_CORBA::InterfaceAttrExtension::_component_skel (
+ TAO_ServerRequest & server_request,
+ void * TAO_INTERCEPTOR (servant_upcall),
+ void * servant
+ ACE_ENV_ARG_DECL
+ )
+{
+#if TAO_HAS_INTERCEPTORS == 1
+ static ::CORBA::TypeCode_ptr const * const exceptions = 0;
+ static ::CORBA::ULong const nexceptions = 0;
+#endif /* TAO_HAS_INTERCEPTORS */
+
+ TAO::SArg_Traits< ::CORBA::Object>::ret_val retval;
+
+ TAO::Argument * const args[] =
+ {
+ &retval
+ };
+
+ static size_t const nargs = 1;
+
+ POA_CORBA::InterfaceAttrExtension * const impl =
+ static_cast<POA_CORBA::InterfaceAttrExtension *> (servant);
+
+ _get_component_InterfaceAttrExtension_Upcall_Command command (
+ impl,
+ server_request.operation_details (),
+ args);
+
+ TAO::Upcall_Wrapper upcall_wrapper;
+ upcall_wrapper.upcall (server_request
+ , args
+ , nargs
+ , command
+#if TAO_HAS_INTERCEPTORS == 1
+ , servant_upcall
+ , exceptions
+ , nexceptions
+#endif /* TAO_HAS_INTERCEPTORS == 1 */
+ ACE_ENV_ARG_PARAMETER);
+ ACE_CHECK;
+}
+
+::CORBA::Boolean POA_CORBA::InterfaceAttrExtension::_is_a (
+ const char* value
+ ACE_ENV_ARG_DECL_NOT_USED
+ )
+{
+ return
+ (
+ !ACE_OS::strcmp (
+ value,
+ "IDL:omg.org/CORBA/InterfaceAttrExtension:1.0"
+ ) ||
+ !ACE_OS::strcmp (
+ value,
+ "IDL:omg.org/CORBA/Object:1.0"
+ )
+ );
+}
+
+const char* POA_CORBA::InterfaceAttrExtension::_interface_repository_id (void) const
+{
+ return "IDL:omg.org/CORBA/InterfaceAttrExtension:1.0";
+}
+
+// TAO_IDL - Generated from
+// be\be_visitor_interface/interface_ss.cpp:903
+
+void POA_CORBA::InterfaceAttrExtension::_dispatch (
+ TAO_ServerRequest & req,
+ void * servant_upcall
+ ACE_ENV_ARG_DECL
+ )
+{
+ this->synchronous_upcall_dispatch (req,
+ servant_upcall,
+ this
+ ACE_ENV_ARG_PARAMETER);
+}
+
+// TAO_IDL - Generated from
+// be\be_visitor_interface/interface_ss.cpp:851
+
+CORBA::InterfaceAttrExtension *
+POA_CORBA::InterfaceAttrExtension::_this (ACE_ENV_SINGLE_ARG_DECL)
+{
+ TAO_Stub *stub = this->_create_stub (ACE_ENV_SINGLE_ARG_PARAMETER);
+ ACE_CHECK_RETURN (0);
+
+ TAO_Stub_Auto_Ptr safe_stub (stub);
+ ::CORBA::Object_ptr tmp = CORBA::Object::_nil ();
+
+ ::CORBA::Boolean const _tao_opt_colloc =
+ stub->servant_orb_var ()->orb_core ()->optimize_collocation_objects ();
+
+ ACE_NEW_RETURN (
+ tmp,
+ ::CORBA::Object (stub, _tao_opt_colloc, this),
+ 0
+ );
+
+ ::CORBA::Object_var obj = tmp;
+ (void) safe_stub.release ();
+
+ typedef ::CORBA::InterfaceAttrExtension STUB_SCOPED_NAME;
+ return
+ TAO::Narrow_Utils<STUB_SCOPED_NAME>::unchecked_narrow (
+ obj.in (),
+ CORBA__TAO_InterfaceAttrExtension_Proxy_Broker_Factory_function_pointer
+ );
+}
+
+// TAO_IDL - Generated from
+// be\be_interface.cpp:1499
+
+class TAO_CORBA_ExtInterfaceDef_Perfect_Hash_OpTable
+ : public TAO_Perfect_Hash_OpTable
+{
+private:
+ unsigned int hash (const char *str, unsigned int len);
+
+public:
+ const TAO_operation_db_entry * lookup (const char *str, unsigned int len);
+};
+
+/* C++ code produced by gperf version 2.8 (ACE version) */
+/* Command-line: C:\ACE\latest\ACE_wrappers\bin\gperf.exe -m -M -J -c -C -D -E -T -f 0 -F 0,0 -a -o -t -p -K opname -L C++ -Z TAO_CORBA_ExtInterfaceDef_Perfect_Hash_OpTable -N lookup */
+unsigned int
+TAO_CORBA_ExtInterfaceDef_Perfect_Hash_OpTable::hash (const char *str, unsigned int len)
+{
+ static const unsigned char asso_values[] =
+ {
+#if defined (ACE_MVS)
+ 74, 74, 74, 74, 74, 74, 74, 74, 74, 74,
+ 74, 74, 74, 74, 74, 74, 74, 74, 74, 74,
+ 74, 74, 74, 74, 74, 74, 74, 74, 74, 74,
+ 74, 74, 74, 74, 74, 74, 74, 74, 74, 74,
+ 74, 74, 74, 74, 74, 74, 74, 74, 74, 74,
+ 74, 74, 74, 74, 74, 74, 74, 74, 74, 74,
+ 74, 74, 74, 74, 74, 74, 74, 74, 74, 74,
+ 74, 74, 74, 74, 74, 74, 74, 74, 74, 74,
+ 74, 74, 74, 74, 74, 74, 74, 74, 74, 74,
+ 74, 74, 74, 74, 74, 74, 74, 74, 74, 74,
+ 74, 74, 74, 74, 74, 74, 74, 74, 74, 30,
+ 74, 74, 74, 74, 74, 74, 74, 74, 74, 74,
+ 74, 74, 74, 74, 74, 74, 74, 74, 74, 0,
+ 74, 0, 20, 0, 74, 74, 74, 5, 74, 74,
+ 74, 74, 74, 74, 74, 74, 74, 15, 0, 5,
+ 74, 15, 74, 74, 74, 74, 74, 74, 74, 74,
+ 74, 74, 15, 30, 74, 74, 74, 15, 5, 74,
+ 74, 74, 74, 74, 74, 74, 74, 74, 74, 74,
+ 74, 74, 74, 74, 74, 74, 74, 74, 74, 74,
+ 74, 74, 74, 74, 74, 74, 74, 74, 74, 74,
+ 74, 74, 74, 74, 74, 74, 74, 74, 74, 74,
+ 74, 74, 74, 74, 74, 74, 74, 74, 74, 74,
+ 74, 74, 74, 74, 74, 74, 74, 74, 74, 74,
+ 74, 74, 74, 74, 74, 74, 74, 74, 74, 74,
+ 74, 74, 74, 74, 74, 74, 74, 74, 74, 74,
+ 74, 74, 74, 74, 74, 74,
+#else
+ 74, 74, 74, 74, 74, 74, 74, 74, 74, 74,
+ 74, 74, 74, 74, 74, 74, 74, 74, 74, 74,
+ 74, 74, 74, 74, 74, 74, 74, 74, 74, 74,
+ 74, 74, 74, 74, 74, 74, 74, 74, 74, 74,
+ 74, 74, 74, 74, 74, 74, 74, 74, 74, 74,
+ 74, 74, 74, 74, 74, 74, 74, 74, 74, 74,
+ 74, 74, 74, 74, 74, 74, 74, 74, 74, 74,
+ 74, 74, 74, 74, 74, 74, 74, 74, 74, 74,
+ 74, 74, 74, 74, 74, 74, 74, 74, 74, 74,
+ 74, 74, 74, 74, 74, 30, 74, 0, 74, 0,
+ 20, 0, 74, 74, 74, 5, 74, 74, 15, 0,
+ 5, 74, 15, 74, 74, 15, 30, 74, 74, 74,
+ 15, 5, 74, 74, 74, 74, 74, 74,
+#endif /* ACE_MVS */
+ };
+ return len + asso_values[(int) str[len - 1]] + asso_values[(int) str[0]];
+}
+
+const TAO_operation_db_entry *
+TAO_CORBA_ExtInterfaceDef_Perfect_Hash_OpTable::lookup (const char *str, unsigned int len)
+{
+ enum
+ {
+ TOTAL_KEYWORDS = 45,
+ MIN_WORD_LENGTH = 4,
+ MAX_WORD_LENGTH = 26,
+ MIN_HASH_VALUE = 4,
+ MAX_HASH_VALUE = 73,
+ HASH_VALUE_RANGE = 70,
+ DUPLICATES = 10,
+ WORDLIST_SIZE = 49
+ };
+
+ static const TAO_operation_db_entry wordlist[] =
+ {
+ {"",0,0},{"",0,0},{"",0,0},{"",0,0},
+ {"move", &POA_CORBA::ExtInterfaceDef::move_skel, 0},
+ {"is_a", &POA_CORBA::ExtInterfaceDef::is_a_skel, 0},
+ {"create_enum", &POA_CORBA::ExtInterfaceDef::create_enum_skel, 0},
+ {"create_value", &POA_CORBA::ExtInterfaceDef::create_value_skel, 0},
+ {"create_module", &POA_CORBA::ExtInterfaceDef::create_module_skel, 0},
+ {"create_native", &POA_CORBA::ExtInterfaceDef::create_native_skel, 0},
+ {"create_interface", &POA_CORBA::ExtInterfaceDef::create_interface_skel, 0},
+ {"create_attribute", &POA_CORBA::ExtInterfaceDef::create_attribute_skel, 0},
+ {"create_ext_value", &POA_CORBA::ExtInterfaceDef::create_ext_value_skel, 0},
+ {"create_union", &POA_CORBA::ExtInterfaceDef::create_union_skel, 0},
+ {"create_ext_attribute", &POA_CORBA::ExtInterfaceDef::create_ext_attribute_skel, 0},
+ {"create_exception", &POA_CORBA::ExtInterfaceDef::create_exception_skel, 0},
+ {"create_operation", &POA_CORBA::ExtInterfaceDef::create_operation_skel, 0},
+ {"create_local_interface", &POA_CORBA::ExtInterfaceDef::create_local_interface_skel, 0},
+ {"contents", &POA_CORBA::ExtInterfaceDef::contents_skel, 0},
+ {"create_abstract_interface", &POA_CORBA::ExtInterfaceDef::create_abstract_interface_skel, 0},
+ {"lookup_name", &POA_CORBA::ExtInterfaceDef::lookup_name_skel, 0},
+ {"create_alias", &POA_CORBA::ExtInterfaceDef::create_alias_skel, 0},
+ {"describe", &POA_CORBA::ExtInterfaceDef::describe_skel, 0},
+ {"create_value_box", &POA_CORBA::ExtInterfaceDef::create_value_box_skel, 0},
+ {"destroy", &POA_CORBA::ExtInterfaceDef::destroy_skel, 0},
+ {"_is_a", &POA_CORBA::ExtInterfaceDef::_is_a_skel, 0},
+ {"lookup", &POA_CORBA::ExtInterfaceDef::lookup_skel, 0},
+ {"describe_interface", &POA_CORBA::ExtInterfaceDef::describe_interface_skel, 0},
+ {"_get_name", &POA_CORBA::ExtInterfaceDef::_get_name_skel, 0},
+ {"_get_type", &POA_CORBA::ExtInterfaceDef::_get_type_skel, 0},
+ {"_set_name", &POA_CORBA::ExtInterfaceDef::_set_name_skel, 0},
+ {"_interface", &POA_CORBA::ExtInterfaceDef::_interface_skel, 0},
+ {"describe_ext_interface", &POA_CORBA::ExtInterfaceDef::describe_ext_interface_skel, 0},
+ {"create_struct", &POA_CORBA::ExtInterfaceDef::create_struct_skel, 0},
+ {"create_constant", &POA_CORBA::ExtInterfaceDef::create_constant_skel, 0},
+ {"_get_version", &POA_CORBA::ExtInterfaceDef::_get_version_skel, 0},
+ {"_set_version", &POA_CORBA::ExtInterfaceDef::_set_version_skel, 0},
+ {"_get_absolute_name", &POA_CORBA::ExtInterfaceDef::_get_absolute_name_skel, 0},
+ {"_get_defined_in", &POA_CORBA::ExtInterfaceDef::_get_defined_in_skel, 0},
+ {"describe_contents", &POA_CORBA::ExtInterfaceDef::describe_contents_skel, 0},
+ {"_get_id", &POA_CORBA::ExtInterfaceDef::_get_id_skel, 0},
+ {"_set_id", &POA_CORBA::ExtInterfaceDef::_set_id_skel, 0},
+ {"_get_containing_repository", &POA_CORBA::ExtInterfaceDef::_get_containing_repository_skel, 0},
+ {"_get_def_kind", &POA_CORBA::ExtInterfaceDef::_get_def_kind_skel, 0},
+ {"_repository_id", &POA_CORBA::ExtInterfaceDef::_repository_id_skel, 0},
+ {"_get_base_interfaces", &POA_CORBA::ExtInterfaceDef::_get_base_interfaces_skel, 0},
+ {"_set_base_interfaces", &POA_CORBA::ExtInterfaceDef::_set_base_interfaces_skel, 0},
+ {"_component", &POA_CORBA::ExtInterfaceDef::_component_skel, 0},
+ {"_non_existent", &POA_CORBA::ExtInterfaceDef::_non_existent_skel, 0},
+ };
+
+ static const signed char lookup[] =
+ {
+ -1, -1, -1, -1, 4, -1, -1, -8, -2, 5, -1, 6, 7, -79,
+ -10, -3, -75, 13, -15, -2, 14, -76, 17, 18, -1, 19, 20, 21,
+ 22, -28, -3, 23, 24, -35, -2, 25, 26, -1, 27, -83, 31, -1,
+ 32, 33, -1, 34, -1, -87, 37, -1, 38, -1, 39, -1, -1, -40,
+ -2, -75, -1, -45, -2, 42, -1, 43, 44, -79, -1, -1, -1, -1,
+ 47, -1, -1, 48,
+ };
+
+ if (len <= MAX_WORD_LENGTH && len >= MIN_WORD_LENGTH)
+ {
+ unsigned int key = hash (str, len);
+
+ if (key <= MAX_HASH_VALUE && key >= MIN_HASH_VALUE)
+ {
+ int slot = lookup[key];
+
+ if (slot >= 0 && slot < WORDLIST_SIZE)
+ {
+ const char *s = wordlist[slot].opname;
+
+ if (*str == *s && !strncmp (str + 1, s + 1, len - 1))
+ return &wordlist[slot];
+ }
+ else if (slot < 0 && slot >= -MAX_HASH_VALUE)
+ return 0;
+ else
+ {
+ unsigned int offset = key + slot + (slot > 0 ? -MAX_HASH_VALUE : MAX_HASH_VALUE);
+ const TAO_operation_db_entry *base = &wordlist[-lookup[offset]];
+ const TAO_operation_db_entry *ptr = base + -lookup[offset + 1];
+
+ while (--ptr >= base)
+ if (*str == *ptr->opname && !strncmp (str + 1, ptr->opname + 1, len - 1))
+ return ptr;
+ }
+ }
+ }
+ return 0;
+}
+
+static TAO_CORBA_ExtInterfaceDef_Perfect_Hash_OpTable tao_CORBA_ExtInterfaceDef_optable;
+
+// TAO_IDL - Generated from
+// be\be_visitor_interface/interface_ss.cpp:966
+
+TAO::Collocation_Proxy_Broker *
+CORBA__TAO_ExtInterfaceDef_Proxy_Broker_Factory_function ( ::CORBA::Object_ptr)
+{
+ return reinterpret_cast<TAO::Collocation_Proxy_Broker *> (0xdead); // Dummy
+}
+
+int
+CORBA__TAO_ExtInterfaceDef_Proxy_Broker_Factory_Initializer (size_t)
+{
+ CORBA__TAO_ExtInterfaceDef_Proxy_Broker_Factory_function_pointer =
+ CORBA__TAO_ExtInterfaceDef_Proxy_Broker_Factory_function;
+
+ return 0;
+}
+
+static int
+CORBA__TAO_ExtInterfaceDef_Proxy_Broker_Stub_Factory_Initializer_Scarecrow =
+ CORBA__TAO_ExtInterfaceDef_Proxy_Broker_Factory_Initializer (
+ reinterpret_cast<size_t> (CORBA__TAO_ExtInterfaceDef_Proxy_Broker_Factory_Initializer)
+ );
+
+// TAO_IDL - Generated from
+// be\be_visitor_interface/interface_ss.cpp:103
+
+POA_CORBA::ExtInterfaceDef::ExtInterfaceDef (void)
+ : TAO_ServantBase ()
+{
+ this->optable_ = &tao_CORBA_ExtInterfaceDef_optable;
+}
+
+POA_CORBA::ExtInterfaceDef::ExtInterfaceDef (const ExtInterfaceDef& rhs)
+ : TAO_Abstract_ServantBase (rhs),
+ TAO_ServantBase (rhs),
+ POA_CORBA::IRObject (rhs),
+ POA_CORBA::Container (rhs),
+ POA_CORBA::Contained (rhs),
+ POA_CORBA::IDLType (rhs),
+ POA_CORBA::InterfaceDef (rhs),
+ POA_CORBA::InterfaceAttrExtension (rhs)
+{
+}
+
+POA_CORBA::ExtInterfaceDef::~ExtInterfaceDef (void)
+{
+}
+
+// TAO_IDL - Generated from
+// be\be_visitor_interface/interface_ss.cpp:169
+
+namespace POA_CORBA
+{
+
+
+ // TAO_IDL - Generated from
+ // be\be_visitor_operation/upcall_command_ss.cpp:127
+
+ class _is_a_ExtInterfaceDef_Upcall_Command
+ : public TAO::Upcall_Command
+ {
+ public:
+ inline _is_a_ExtInterfaceDef_Upcall_Command (
+ POA_CORBA::ExtInterfaceDef * servant,
+ TAO_Operation_Details const * operation_details,
+ TAO::Argument * const args[])
+ : servant_ (servant)
+ , operation_details_ (operation_details)
+ , args_ (args)
+ {
+ }
+
+ virtual void execute (ACE_ENV_SINGLE_ARG_DECL)
+ {
+ TAO::SArg_Traits< ::ACE_InputCDR::to_boolean>::ret_arg_type retval =
+ TAO::Portable_Server::get_ret_arg< ::ACE_InputCDR::to_boolean> (
+ this->operation_details_,
+ this->args_);
+
+ TAO::SArg_Traits< ::CORBA::Char *>::in_arg_type arg_1 =
+ TAO::Portable_Server::get_in_arg< ::CORBA::Char *> (
+ this->operation_details_,
+ this->args_,
+ 1);
+
+ retval =
+ this->servant_-> _is_a (
+ arg_1
+ ACE_ENV_ARG_PARAMETER);
+ ACE_CHECK;
+ }
+
+ private:
+ POA_CORBA::ExtInterfaceDef * const servant_;
+ TAO_Operation_Details const * const operation_details_;
+ TAO::Argument * const * const args_;
+ };
+}
+
+
+void POA_CORBA::ExtInterfaceDef::_is_a_skel (
+ TAO_ServerRequest & server_request,
+ void * TAO_INTERCEPTOR (servant_upcall),
+ void * servant
+ ACE_ENV_ARG_DECL
+ )
+{
+#if TAO_HAS_INTERCEPTORS == 1
+ static ::CORBA::TypeCode_ptr const * const exceptions = 0;
+ static ::CORBA::ULong const nexceptions = 0;
+#endif /* TAO_HAS_INTERCEPTORS */
+
+ TAO::SArg_Traits< ::ACE_InputCDR::to_boolean>::ret_val retval;
+ TAO::SArg_Traits< ::CORBA::Char *>::in_arg_val _tao_repository_id;
+
+ TAO::Argument * const args[] =
+ {
+ &retval,
+ &_tao_repository_id
+ };
+
+ static size_t const nargs = 2;
+
+ POA_CORBA::ExtInterfaceDef * const impl =
+ static_cast<POA_CORBA::ExtInterfaceDef *> (servant);
+
+ _is_a_ExtInterfaceDef_Upcall_Command command (
+ impl,
+ server_request.operation_details (),
+ args);
+
+ TAO::Upcall_Wrapper upcall_wrapper;
+ upcall_wrapper.upcall (server_request
+ , args
+ , nargs
+ , command
+#if TAO_HAS_INTERCEPTORS == 1
+ , servant_upcall
+ , exceptions
+ , nexceptions
+#endif /* TAO_HAS_INTERCEPTORS == 1 */
+ ACE_ENV_ARG_PARAMETER);
+ ACE_CHECK;
+}namespace POA_CORBA
+{
+
+
+ // TAO_IDL - Generated from
+ // be\be_visitor_operation/upcall_command_ss.cpp:127
+
+ class _non_existent_ExtInterfaceDef_Upcall_Command
+ : public TAO::Upcall_Command
+ {
+ public:
+ inline _non_existent_ExtInterfaceDef_Upcall_Command (
+ POA_CORBA::ExtInterfaceDef * servant,
+ TAO_Operation_Details const * operation_details,
+ TAO::Argument * const args[])
+ : servant_ (servant)
+ , operation_details_ (operation_details)
+ , args_ (args)
+ {
+ }
+
+ virtual void execute (ACE_ENV_SINGLE_ARG_DECL)
+ {
+ TAO::SArg_Traits< ::ACE_InputCDR::to_boolean>::ret_arg_type retval =
+ TAO::Portable_Server::get_ret_arg< ::ACE_InputCDR::to_boolean> (
+ this->operation_details_,
+ this->args_);
+
+ retval =
+ this->servant_-> _non_existent (
+ ACE_ENV_SINGLE_ARG_PARAMETER);
+ ACE_CHECK;
+ }
+
+ private:
+ POA_CORBA::ExtInterfaceDef * const servant_;
+ TAO_Operation_Details const * const operation_details_;
+ TAO::Argument * const * const args_;
+ };
+}
+
+
+void POA_CORBA::ExtInterfaceDef::_non_existent_skel (
+ TAO_ServerRequest & server_request,
+ void * TAO_INTERCEPTOR (servant_upcall),
+ void * servant
+ ACE_ENV_ARG_DECL
+ )
+{
+#if TAO_HAS_INTERCEPTORS == 1
+ static ::CORBA::TypeCode_ptr const * const exceptions = 0;
+ static ::CORBA::ULong const nexceptions = 0;
+#endif /* TAO_HAS_INTERCEPTORS */
+
+ TAO::SArg_Traits< ::ACE_InputCDR::to_boolean>::ret_val retval;
+
+ TAO::Argument * const args[] =
+ {
+ &retval
+ };
+
+ static size_t const nargs = 1;
+
+ POA_CORBA::ExtInterfaceDef * const impl =
+ static_cast<POA_CORBA::ExtInterfaceDef *> (servant);
+
+ _non_existent_ExtInterfaceDef_Upcall_Command command (
+ impl,
+ server_request.operation_details (),
+ args);
+
+ TAO::Upcall_Wrapper upcall_wrapper;
+ upcall_wrapper.upcall (server_request
+ , args
+ , nargs
+ , command
+#if TAO_HAS_INTERCEPTORS == 1
+ , servant_upcall
+ , exceptions
+ , nexceptions
+#endif /* TAO_HAS_INTERCEPTORS == 1 */
+ ACE_ENV_ARG_PARAMETER);
+ ACE_CHECK;
+}namespace POA_CORBA
+{
+
+
+ // TAO_IDL - Generated from
+ // be\be_visitor_operation/upcall_command_ss.cpp:127
+
+ class _repository_id_ExtInterfaceDef_Upcall_Command
+ : public TAO::Upcall_Command
+ {
+ public:
+ inline _repository_id_ExtInterfaceDef_Upcall_Command (
+ POA_CORBA::ExtInterfaceDef * servant,
+ TAO_Operation_Details const * operation_details,
+ TAO::Argument * const args[])
+ : servant_ (servant)
+ , operation_details_ (operation_details)
+ , args_ (args)
+ {
+ }
+
+ virtual void execute (ACE_ENV_SINGLE_ARG_DECL)
+ {
+ TAO::SArg_Traits< ::CORBA::Char *>::ret_arg_type retval =
+ TAO::Portable_Server::get_ret_arg< ::CORBA::Char *> (
+ this->operation_details_,
+ this->args_);
+
+ retval =
+ this->servant_-> _repository_id (
+ ACE_ENV_SINGLE_ARG_PARAMETER);
+ ACE_CHECK;
+ }
+
+ private:
+ POA_CORBA::ExtInterfaceDef * const servant_;
+ TAO_Operation_Details const * const operation_details_;
+ TAO::Argument * const * const args_;
+ };
+}
+
+
+void POA_CORBA::ExtInterfaceDef::_repository_id_skel (
+ TAO_ServerRequest & server_request,
+ void * TAO_INTERCEPTOR (servant_upcall),
+ void * servant
+ ACE_ENV_ARG_DECL
+ )
+{
+#if TAO_HAS_INTERCEPTORS == 1
+ static ::CORBA::TypeCode_ptr const * const exceptions = 0;
+ static ::CORBA::ULong const nexceptions = 0;
+#endif /* TAO_HAS_INTERCEPTORS */
+
+ TAO::SArg_Traits< ::CORBA::Char *>::ret_val retval;
+
+ TAO::Argument * const args[] =
+ {
+ &retval
+ };
+
+ static size_t const nargs = 1;
+
+ POA_CORBA::ExtInterfaceDef * const impl =
+ static_cast<POA_CORBA::ExtInterfaceDef *> (servant);
+
+ _repository_id_ExtInterfaceDef_Upcall_Command command (
+ impl,
+ server_request.operation_details (),
+ args);
+
+ TAO::Upcall_Wrapper upcall_wrapper;
+ upcall_wrapper.upcall (server_request
+ , args
+ , nargs
+ , command
+#if TAO_HAS_INTERCEPTORS == 1
+ , servant_upcall
+ , exceptions
+ , nexceptions
+#endif /* TAO_HAS_INTERCEPTORS == 1 */
+ ACE_ENV_ARG_PARAMETER);
+ ACE_CHECK;
+}
+
+// TAO_IDL - Generated from
+// be\be_visitor_interface/interface_ss.cpp:513
+
+void POA_CORBA::ExtInterfaceDef::_interface_skel (
+ TAO_ServerRequest & server_request,
+ void * /* servant_upcall */,
+ void * servant
+ ACE_ENV_ARG_DECL
+ )
+{
+ TAO_IFR_Client_Adapter *_tao_adapter =
+ ACE_Dynamic_Service<TAO_IFR_Client_Adapter>::instance (
+ TAO_ORB_Core::ifr_client_adapter_name ()
+ );
+
+ if (_tao_adapter == 0)
+ {
+ ACE_THROW ( ::CORBA::INTF_REPOS ( ::CORBA::OMGVMCID | 1,
+ ::CORBA::COMPLETED_NO));
+ }
+
+ POA_CORBA::ExtInterfaceDef * const impl =
+ static_cast<POA_CORBA::ExtInterfaceDef *> (servant);
+ ::CORBA::InterfaceDef_ptr _tao_retval =
+ impl->_get_interface (ACE_ENV_SINGLE_ARG_PARAMETER);
+ ACE_CHECK;
+
+ server_request.init_reply ();
+ TAO_OutputCDR &_tao_out = *server_request.outgoing ();
+
+ ::CORBA::Boolean const _tao_result =
+ _tao_adapter->interfacedef_cdr_insert (
+ _tao_out,
+ _tao_retval
+ );
+
+ _tao_adapter->dispose (_tao_retval);
+
+ if (_tao_result == false)
+ {
+ ACE_THROW ( ::CORBA::MARSHAL ());
+ }
+}namespace POA_CORBA
+{
+
+
+ // TAO_IDL - Generated from
+ // be\be_visitor_operation/upcall_command_ss.cpp:127
+
+ class _get_component_ExtInterfaceDef_Upcall_Command
+ : public TAO::Upcall_Command
+ {
+ public:
+ inline _get_component_ExtInterfaceDef_Upcall_Command (
+ POA_CORBA::ExtInterfaceDef * servant,
+ TAO_Operation_Details const * operation_details,
+ TAO::Argument * const args[])
+ : servant_ (servant)
+ , operation_details_ (operation_details)
+ , args_ (args)
+ {
+ }
+
+ virtual void execute (ACE_ENV_SINGLE_ARG_DECL)
+ {
+ TAO::SArg_Traits< ::CORBA::Object>::ret_arg_type retval =
+ TAO::Portable_Server::get_ret_arg< ::CORBA::Object> (
+ this->operation_details_,
+ this->args_);
+
+ retval =
+ this->servant_-> _get_component (
+ ACE_ENV_SINGLE_ARG_PARAMETER);
+ ACE_CHECK;
+ }
+
+ private:
+ POA_CORBA::ExtInterfaceDef * const servant_;
+ TAO_Operation_Details const * const operation_details_;
+ TAO::Argument * const * const args_;
+ };
+}
+
+
+void POA_CORBA::ExtInterfaceDef::_component_skel (
+ TAO_ServerRequest & server_request,
+ void * TAO_INTERCEPTOR (servant_upcall),
+ void * servant
+ ACE_ENV_ARG_DECL
+ )
+{
+#if TAO_HAS_INTERCEPTORS == 1
+ static ::CORBA::TypeCode_ptr const * const exceptions = 0;
+ static ::CORBA::ULong const nexceptions = 0;
+#endif /* TAO_HAS_INTERCEPTORS */
+
+ TAO::SArg_Traits< ::CORBA::Object>::ret_val retval;
+
+ TAO::Argument * const args[] =
+ {
+ &retval
+ };
+
+ static size_t const nargs = 1;
+
+ POA_CORBA::ExtInterfaceDef * const impl =
+ static_cast<POA_CORBA::ExtInterfaceDef *> (servant);
+
+ _get_component_ExtInterfaceDef_Upcall_Command command (
+ impl,
+ server_request.operation_details (),
+ args);
+
+ TAO::Upcall_Wrapper upcall_wrapper;
+ upcall_wrapper.upcall (server_request
+ , args
+ , nargs
+ , command
+#if TAO_HAS_INTERCEPTORS == 1
+ , servant_upcall
+ , exceptions
+ , nexceptions
+#endif /* TAO_HAS_INTERCEPTORS == 1 */
+ ACE_ENV_ARG_PARAMETER);
+ ACE_CHECK;
+}
+
+::CORBA::Boolean POA_CORBA::ExtInterfaceDef::_is_a (
+ const char* value
+ ACE_ENV_ARG_DECL_NOT_USED
+ )
+{
+ return
+ (
+ !ACE_OS::strcmp (
+ value,
+ "IDL:omg.org/CORBA/IRObject:1.0"
+ ) ||
+ !ACE_OS::strcmp (
+ value,
+ "IDL:omg.org/CORBA/Container:1.0"
+ ) ||
+ !ACE_OS::strcmp (
+ value,
+ "IDL:omg.org/CORBA/Contained:1.0"
+ ) ||
+ !ACE_OS::strcmp (
+ value,
+ "IDL:omg.org/CORBA/IDLType:1.0"
+ ) ||
+ !ACE_OS::strcmp (
+ value,
+ "IDL:omg.org/CORBA/InterfaceDef:1.0"
+ ) ||
+ !ACE_OS::strcmp (
+ value,
+ "IDL:omg.org/CORBA/InterfaceAttrExtension:1.0"
+ ) ||
+ !ACE_OS::strcmp (
+ value,
+ "IDL:omg.org/CORBA/ExtInterfaceDef:1.0"
+ ) ||
+ !ACE_OS::strcmp (
+ value,
+ "IDL:omg.org/CORBA/Object:1.0"
+ )
+ );
+}
+
+const char* POA_CORBA::ExtInterfaceDef::_interface_repository_id (void) const
+{
+ return "IDL:omg.org/CORBA/ExtInterfaceDef:1.0";
+}
+
+// TAO_IDL - Generated from
+// be\be_visitor_interface/interface_ss.cpp:903
+
+void POA_CORBA::ExtInterfaceDef::_dispatch (
+ TAO_ServerRequest & req,
+ void * servant_upcall
+ ACE_ENV_ARG_DECL
+ )
+{
+ this->synchronous_upcall_dispatch (req,
+ servant_upcall,
+ this
+ ACE_ENV_ARG_PARAMETER);
+}
+
+// TAO_IDL - Generated from
+// be\be_visitor_interface/interface_ss.cpp:851
+
+CORBA::ExtInterfaceDef *
+POA_CORBA::ExtInterfaceDef::_this (ACE_ENV_SINGLE_ARG_DECL)
+{
+ TAO_Stub *stub = this->_create_stub (ACE_ENV_SINGLE_ARG_PARAMETER);
+ ACE_CHECK_RETURN (0);
+
+ TAO_Stub_Auto_Ptr safe_stub (stub);
+ ::CORBA::Object_ptr tmp = CORBA::Object::_nil ();
+
+ ::CORBA::Boolean const _tao_opt_colloc =
+ stub->servant_orb_var ()->orb_core ()->optimize_collocation_objects ();
+
+ ACE_NEW_RETURN (
+ tmp,
+ ::CORBA::Object (stub, _tao_opt_colloc, this),
+ 0
+ );
+
+ ::CORBA::Object_var obj = tmp;
+ (void) safe_stub.release ();
+
+ typedef ::CORBA::ExtInterfaceDef STUB_SCOPED_NAME;
+ return
+ TAO::Narrow_Utils<STUB_SCOPED_NAME>::unchecked_narrow (
+ obj.in (),
+ CORBA__TAO_ExtInterfaceDef_Proxy_Broker_Factory_function_pointer
+ );
+}
+
+// TAO_IDL - Generated from
+// be\be_interface.cpp:1499
+
+class TAO_CORBA_AbstractInterfaceDef_Perfect_Hash_OpTable
+ : public TAO_Perfect_Hash_OpTable
+{
+private:
+ unsigned int hash (const char *str, unsigned int len);
+
+public:
+ const TAO_operation_db_entry * lookup (const char *str, unsigned int len);
+};
+
+/* C++ code produced by gperf version 2.8 (ACE version) */
+/* Command-line: C:\ACE\latest\ACE_wrappers\bin\gperf.exe -m -M -J -c -C -D -E -T -f 0 -F 0,0 -a -o -t -p -K opname -L C++ -Z TAO_CORBA_AbstractInterfaceDef_Perfect_Hash_OpTable -N lookup */
+unsigned int
+TAO_CORBA_AbstractInterfaceDef_Perfect_Hash_OpTable::hash (const char *str, unsigned int len)
+{
+ static const unsigned char asso_values[] =
+ {
+#if defined (ACE_MVS)
+ 81, 81, 81, 81, 81, 81, 81, 81, 81, 81,
+ 81, 81, 81, 81, 81, 81, 81, 81, 81, 81,
+ 81, 81, 81, 81, 81, 81, 81, 81, 81, 81,
+ 81, 81, 81, 81, 81, 81, 81, 81, 81, 81,
+ 81, 81, 81, 81, 81, 81, 81, 81, 81, 81,
+ 81, 81, 81, 81, 81, 81, 81, 81, 81, 81,
+ 81, 81, 81, 81, 81, 81, 81, 81, 81, 81,
+ 81, 81, 81, 81, 81, 81, 81, 81, 81, 81,
+ 81, 81, 81, 81, 81, 81, 81, 81, 81, 81,
+ 81, 81, 81, 81, 81, 81, 81, 81, 81, 81,
+ 81, 81, 81, 81, 81, 81, 81, 81, 81, 0,
+ 81, 81, 81, 81, 81, 81, 81, 81, 81, 81,
+ 81, 81, 81, 81, 81, 81, 81, 81, 81, 0,
+ 81, 30, 20, 0, 81, 81, 81, 10, 81, 81,
+ 81, 81, 81, 81, 81, 81, 81, 0, 0, 5,
+ 81, 0, 81, 81, 81, 81, 81, 81, 81, 81,
+ 81, 81, 20, 35, 81, 81, 81, 10, 5, 81,
+ 81, 81, 81, 81, 81, 81, 81, 81, 81, 81,
+ 81, 81, 81, 81, 81, 81, 81, 81, 81, 81,
+ 81, 81, 81, 81, 81, 81, 81, 81, 81, 81,
+ 81, 81, 81, 81, 81, 81, 81, 81, 81, 81,
+ 81, 81, 81, 81, 81, 81, 81, 81, 81, 81,
+ 81, 81, 81, 81, 81, 81, 81, 81, 81, 81,
+ 81, 81, 81, 81, 81, 81, 81, 81, 81, 81,
+ 81, 81, 81, 81, 81, 81, 81, 81, 81, 81,
+ 81, 81, 81, 81, 81, 81,
+#else
+ 81, 81, 81, 81, 81, 81, 81, 81, 81, 81,
+ 81, 81, 81, 81, 81, 81, 81, 81, 81, 81,
+ 81, 81, 81, 81, 81, 81, 81, 81, 81, 81,
+ 81, 81, 81, 81, 81, 81, 81, 81, 81, 81,
+ 81, 81, 81, 81, 81, 81, 81, 81, 81, 81,
+ 81, 81, 81, 81, 81, 81, 81, 81, 81, 81,
+ 81, 81, 81, 81, 81, 81, 81, 81, 81, 81,
+ 81, 81, 81, 81, 81, 81, 81, 81, 81, 81,
+ 81, 81, 81, 81, 81, 81, 81, 81, 81, 81,
+ 81, 81, 81, 81, 81, 0, 81, 0, 81, 30,
+ 20, 0, 81, 81, 81, 10, 81, 81, 0, 0,
+ 5, 81, 0, 81, 81, 20, 35, 81, 81, 81,
+ 10, 5, 81, 81, 81, 81, 81, 81,
+#endif /* ACE_MVS */
+ };
+ return len + asso_values[(int) str[len - 1]] + asso_values[(int) str[0]];
+}
+
+const TAO_operation_db_entry *
+TAO_CORBA_AbstractInterfaceDef_Perfect_Hash_OpTable::lookup (const char *str, unsigned int len)
+{
+ enum
+ {
+ TOTAL_KEYWORDS = 43,
+ MIN_WORD_LENGTH = 4,
+ MAX_WORD_LENGTH = 26,
+ MIN_HASH_VALUE = 4,
+ MAX_HASH_VALUE = 80,
+ HASH_VALUE_RANGE = 77,
+ DUPLICATES = 10,
+ WORDLIST_SIZE = 47
+ };
+
+ static const TAO_operation_db_entry wordlist[] =
+ {
+ {"",0,0},{"",0,0},{"",0,0},{"",0,0},
+ {"move", &POA_CORBA::AbstractInterfaceDef::move_skel, 0},
+ {"_is_a", &POA_CORBA::AbstractInterfaceDef::_is_a_skel, 0},
+ {"lookup", &POA_CORBA::AbstractInterfaceDef::lookup_skel, 0},
+ {"_get_name", &POA_CORBA::AbstractInterfaceDef::_get_name_skel, 0},
+ {"_get_type", &POA_CORBA::AbstractInterfaceDef::_get_type_skel, 0},
+ {"_set_name", &POA_CORBA::AbstractInterfaceDef::_set_name_skel, 0},
+ {"_interface", &POA_CORBA::AbstractInterfaceDef::_interface_skel, 0},
+ {"lookup_name", &POA_CORBA::AbstractInterfaceDef::lookup_name_skel, 0},
+ {"is_a", &POA_CORBA::AbstractInterfaceDef::is_a_skel, 0},
+ {"_get_version", &POA_CORBA::AbstractInterfaceDef::_get_version_skel, 0},
+ {"_set_version", &POA_CORBA::AbstractInterfaceDef::_set_version_skel, 0},
+ {"_get_absolute_name", &POA_CORBA::AbstractInterfaceDef::_get_absolute_name_skel, 0},
+ {"_get_defined_in", &POA_CORBA::AbstractInterfaceDef::_get_defined_in_skel, 0},
+ {"_get_id", &POA_CORBA::AbstractInterfaceDef::_get_id_skel, 0},
+ {"_set_id", &POA_CORBA::AbstractInterfaceDef::_set_id_skel, 0},
+ {"describe", &POA_CORBA::AbstractInterfaceDef::describe_skel, 0},
+ {"_get_containing_repository", &POA_CORBA::AbstractInterfaceDef::_get_containing_repository_skel, 0},
+ {"destroy", &POA_CORBA::AbstractInterfaceDef::destroy_skel, 0},
+ {"_get_def_kind", &POA_CORBA::AbstractInterfaceDef::_get_def_kind_skel, 0},
+ {"_repository_id", &POA_CORBA::AbstractInterfaceDef::_repository_id_skel, 0},
+ {"describe_interface", &POA_CORBA::AbstractInterfaceDef::describe_interface_skel, 0},
+ {"_get_base_interfaces", &POA_CORBA::AbstractInterfaceDef::_get_base_interfaces_skel, 0},
+ {"_set_base_interfaces", &POA_CORBA::AbstractInterfaceDef::_set_base_interfaces_skel, 0},
+ {"create_enum", &POA_CORBA::AbstractInterfaceDef::create_enum_skel, 0},
+ {"create_value", &POA_CORBA::AbstractInterfaceDef::create_value_skel, 0},
+ {"create_module", &POA_CORBA::AbstractInterfaceDef::create_module_skel, 0},
+ {"create_native", &POA_CORBA::AbstractInterfaceDef::create_native_skel, 0},
+ {"_component", &POA_CORBA::AbstractInterfaceDef::_component_skel, 0},
+ {"create_interface", &POA_CORBA::AbstractInterfaceDef::create_interface_skel, 0},
+ {"create_attribute", &POA_CORBA::AbstractInterfaceDef::create_attribute_skel, 0},
+ {"create_ext_value", &POA_CORBA::AbstractInterfaceDef::create_ext_value_skel, 0},
+ {"create_union", &POA_CORBA::AbstractInterfaceDef::create_union_skel, 0},
+ {"_non_existent", &POA_CORBA::AbstractInterfaceDef::_non_existent_skel, 0},
+ {"create_exception", &POA_CORBA::AbstractInterfaceDef::create_exception_skel, 0},
+ {"create_operation", &POA_CORBA::AbstractInterfaceDef::create_operation_skel, 0},
+ {"create_local_interface", &POA_CORBA::AbstractInterfaceDef::create_local_interface_skel, 0},
+ {"create_abstract_interface", &POA_CORBA::AbstractInterfaceDef::create_abstract_interface_skel, 0},
+ {"create_value_box", &POA_CORBA::AbstractInterfaceDef::create_value_box_skel, 0},
+ {"describe_contents", &POA_CORBA::AbstractInterfaceDef::describe_contents_skel, 0},
+ {"contents", &POA_CORBA::AbstractInterfaceDef::contents_skel, 0},
+ {"create_alias", &POA_CORBA::AbstractInterfaceDef::create_alias_skel, 0},
+ {"create_struct", &POA_CORBA::AbstractInterfaceDef::create_struct_skel, 0},
+ {"create_constant", &POA_CORBA::AbstractInterfaceDef::create_constant_skel, 0},
+ };
+
+ static const signed char lookup[] =
+ {
+ -1, -1, -1, -1, 4, 5, 6, -7, -3, -82, 10, 11, -1, -1,
+ 12, -13, -2, -82, 15, -1, 16, -1, -1, -17, -2, -25, -2, -84,
+ 19, -29, -2, 20, 21, 22, 23, -1, -32, -3, 24, -1, -95, 27,
+ 28, -94, -1, 31, -90, 35, 36, -37, -2, -82, 39, -1, -1, 40,
+ 41, 42, 43, -1, -1, -1, 44, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1, 45, -1, 46,
+ };
+
+ if (len <= MAX_WORD_LENGTH && len >= MIN_WORD_LENGTH)
+ {
+ unsigned int key = hash (str, len);
+
+ if (key <= MAX_HASH_VALUE && key >= MIN_HASH_VALUE)
+ {
+ int slot = lookup[key];
+
+ if (slot >= 0 && slot < WORDLIST_SIZE)
+ {
+ const char *s = wordlist[slot].opname;
+
+ if (*str == *s && !strncmp (str + 1, s + 1, len - 1))
+ return &wordlist[slot];
+ }
+ else if (slot < 0 && slot >= -MAX_HASH_VALUE)
+ return 0;
+ else
+ {
+ unsigned int offset = key + slot + (slot > 0 ? -MAX_HASH_VALUE : MAX_HASH_VALUE);
+ const TAO_operation_db_entry *base = &wordlist[-lookup[offset]];
+ const TAO_operation_db_entry *ptr = base + -lookup[offset + 1];
+
+ while (--ptr >= base)
+ if (*str == *ptr->opname && !strncmp (str + 1, ptr->opname + 1, len - 1))
+ return ptr;
+ }
+ }
+ }
+ return 0;
+}
+
+static TAO_CORBA_AbstractInterfaceDef_Perfect_Hash_OpTable tao_CORBA_AbstractInterfaceDef_optable;
+
+// TAO_IDL - Generated from
+// be\be_visitor_interface/interface_ss.cpp:966
+
+TAO::Collocation_Proxy_Broker *
+CORBA__TAO_AbstractInterfaceDef_Proxy_Broker_Factory_function ( ::CORBA::Object_ptr)
+{
+ return reinterpret_cast<TAO::Collocation_Proxy_Broker *> (0xdead); // Dummy
+}
+
+int
+CORBA__TAO_AbstractInterfaceDef_Proxy_Broker_Factory_Initializer (size_t)
+{
+ CORBA__TAO_AbstractInterfaceDef_Proxy_Broker_Factory_function_pointer =
+ CORBA__TAO_AbstractInterfaceDef_Proxy_Broker_Factory_function;
+
+ return 0;
+}
+
+static int
+CORBA__TAO_AbstractInterfaceDef_Proxy_Broker_Stub_Factory_Initializer_Scarecrow =
+ CORBA__TAO_AbstractInterfaceDef_Proxy_Broker_Factory_Initializer (
+ reinterpret_cast<size_t> (CORBA__TAO_AbstractInterfaceDef_Proxy_Broker_Factory_Initializer)
+ );
+
+// TAO_IDL - Generated from
+// be\be_visitor_interface/interface_ss.cpp:103
+
+POA_CORBA::AbstractInterfaceDef::AbstractInterfaceDef (void)
+ : TAO_ServantBase ()
+{
+ this->optable_ = &tao_CORBA_AbstractInterfaceDef_optable;
+}
+
+POA_CORBA::AbstractInterfaceDef::AbstractInterfaceDef (const AbstractInterfaceDef& rhs)
+ : TAO_Abstract_ServantBase (rhs),
+ TAO_ServantBase (rhs),
+ POA_CORBA::IRObject (rhs),
+ POA_CORBA::Container (rhs),
+ POA_CORBA::Contained (rhs),
+ POA_CORBA::IDLType (rhs),
+ POA_CORBA::InterfaceDef (rhs)
+{
+}
+
+POA_CORBA::AbstractInterfaceDef::~AbstractInterfaceDef (void)
+{
+}
+
+// TAO_IDL - Generated from
+// be\be_visitor_interface/interface_ss.cpp:169
+
+namespace POA_CORBA
+{
+
+
+ // TAO_IDL - Generated from
+ // be\be_visitor_operation/upcall_command_ss.cpp:127
+
+ class _is_a_AbstractInterfaceDef_Upcall_Command
+ : public TAO::Upcall_Command
+ {
+ public:
+ inline _is_a_AbstractInterfaceDef_Upcall_Command (
+ POA_CORBA::AbstractInterfaceDef * servant,
+ TAO_Operation_Details const * operation_details,
+ TAO::Argument * const args[])
+ : servant_ (servant)
+ , operation_details_ (operation_details)
+ , args_ (args)
+ {
+ }
+
+ virtual void execute (ACE_ENV_SINGLE_ARG_DECL)
+ {
+ TAO::SArg_Traits< ::ACE_InputCDR::to_boolean>::ret_arg_type retval =
+ TAO::Portable_Server::get_ret_arg< ::ACE_InputCDR::to_boolean> (
+ this->operation_details_,
+ this->args_);
+
+ TAO::SArg_Traits< ::CORBA::Char *>::in_arg_type arg_1 =
+ TAO::Portable_Server::get_in_arg< ::CORBA::Char *> (
+ this->operation_details_,
+ this->args_,
+ 1);
+
+ retval =
+ this->servant_-> _is_a (
+ arg_1
+ ACE_ENV_ARG_PARAMETER);
+ ACE_CHECK;
+ }
+
+ private:
+ POA_CORBA::AbstractInterfaceDef * const servant_;
+ TAO_Operation_Details const * const operation_details_;
+ TAO::Argument * const * const args_;
+ };
+}
+
+
+void POA_CORBA::AbstractInterfaceDef::_is_a_skel (
+ TAO_ServerRequest & server_request,
+ void * TAO_INTERCEPTOR (servant_upcall),
+ void * servant
+ ACE_ENV_ARG_DECL
+ )
+{
+#if TAO_HAS_INTERCEPTORS == 1
+ static ::CORBA::TypeCode_ptr const * const exceptions = 0;
+ static ::CORBA::ULong const nexceptions = 0;
+#endif /* TAO_HAS_INTERCEPTORS */
+
+ TAO::SArg_Traits< ::ACE_InputCDR::to_boolean>::ret_val retval;
+ TAO::SArg_Traits< ::CORBA::Char *>::in_arg_val _tao_repository_id;
+
+ TAO::Argument * const args[] =
+ {
+ &retval,
+ &_tao_repository_id
+ };
+
+ static size_t const nargs = 2;
+
+ POA_CORBA::AbstractInterfaceDef * const impl =
+ static_cast<POA_CORBA::AbstractInterfaceDef *> (servant);
+
+ _is_a_AbstractInterfaceDef_Upcall_Command command (
+ impl,
+ server_request.operation_details (),
+ args);
+
+ TAO::Upcall_Wrapper upcall_wrapper;
+ upcall_wrapper.upcall (server_request
+ , args
+ , nargs
+ , command
+#if TAO_HAS_INTERCEPTORS == 1
+ , servant_upcall
+ , exceptions
+ , nexceptions
+#endif /* TAO_HAS_INTERCEPTORS == 1 */
+ ACE_ENV_ARG_PARAMETER);
+ ACE_CHECK;
+}namespace POA_CORBA
+{
+
+
+ // TAO_IDL - Generated from
+ // be\be_visitor_operation/upcall_command_ss.cpp:127
+
+ class _non_existent_AbstractInterfaceDef_Upcall_Command
+ : public TAO::Upcall_Command
+ {
+ public:
+ inline _non_existent_AbstractInterfaceDef_Upcall_Command (
+ POA_CORBA::AbstractInterfaceDef * servant,
+ TAO_Operation_Details const * operation_details,
+ TAO::Argument * const args[])
+ : servant_ (servant)
+ , operation_details_ (operation_details)
+ , args_ (args)
+ {
+ }
+
+ virtual void execute (ACE_ENV_SINGLE_ARG_DECL)
+ {
+ TAO::SArg_Traits< ::ACE_InputCDR::to_boolean>::ret_arg_type retval =
+ TAO::Portable_Server::get_ret_arg< ::ACE_InputCDR::to_boolean> (
+ this->operation_details_,
+ this->args_);
+
+ retval =
+ this->servant_-> _non_existent (
+ ACE_ENV_SINGLE_ARG_PARAMETER);
+ ACE_CHECK;
+ }
+
+ private:
+ POA_CORBA::AbstractInterfaceDef * const servant_;
+ TAO_Operation_Details const * const operation_details_;
+ TAO::Argument * const * const args_;
+ };
+}
+
+
+void POA_CORBA::AbstractInterfaceDef::_non_existent_skel (
+ TAO_ServerRequest & server_request,
+ void * TAO_INTERCEPTOR (servant_upcall),
+ void * servant
+ ACE_ENV_ARG_DECL
+ )
+{
+#if TAO_HAS_INTERCEPTORS == 1
+ static ::CORBA::TypeCode_ptr const * const exceptions = 0;
+ static ::CORBA::ULong const nexceptions = 0;
+#endif /* TAO_HAS_INTERCEPTORS */
+
+ TAO::SArg_Traits< ::ACE_InputCDR::to_boolean>::ret_val retval;
+
+ TAO::Argument * const args[] =
+ {
+ &retval
+ };
+
+ static size_t const nargs = 1;
+
+ POA_CORBA::AbstractInterfaceDef * const impl =
+ static_cast<POA_CORBA::AbstractInterfaceDef *> (servant);
+
+ _non_existent_AbstractInterfaceDef_Upcall_Command command (
+ impl,
+ server_request.operation_details (),
+ args);
+
+ TAO::Upcall_Wrapper upcall_wrapper;
+ upcall_wrapper.upcall (server_request
+ , args
+ , nargs
+ , command
+#if TAO_HAS_INTERCEPTORS == 1
+ , servant_upcall
+ , exceptions
+ , nexceptions
+#endif /* TAO_HAS_INTERCEPTORS == 1 */
+ ACE_ENV_ARG_PARAMETER);
+ ACE_CHECK;
+}namespace POA_CORBA
+{
+
+
+ // TAO_IDL - Generated from
+ // be\be_visitor_operation/upcall_command_ss.cpp:127
+
+ class _repository_id_AbstractInterfaceDef_Upcall_Command
+ : public TAO::Upcall_Command
+ {
+ public:
+ inline _repository_id_AbstractInterfaceDef_Upcall_Command (
+ POA_CORBA::AbstractInterfaceDef * servant,
+ TAO_Operation_Details const * operation_details,
+ TAO::Argument * const args[])
+ : servant_ (servant)
+ , operation_details_ (operation_details)
+ , args_ (args)
+ {
+ }
+
+ virtual void execute (ACE_ENV_SINGLE_ARG_DECL)
+ {
+ TAO::SArg_Traits< ::CORBA::Char *>::ret_arg_type retval =
+ TAO::Portable_Server::get_ret_arg< ::CORBA::Char *> (
+ this->operation_details_,
+ this->args_);
+
+ retval =
+ this->servant_-> _repository_id (
+ ACE_ENV_SINGLE_ARG_PARAMETER);
+ ACE_CHECK;
+ }
+
+ private:
+ POA_CORBA::AbstractInterfaceDef * const servant_;
+ TAO_Operation_Details const * const operation_details_;
+ TAO::Argument * const * const args_;
+ };
+}
+
+
+void POA_CORBA::AbstractInterfaceDef::_repository_id_skel (
+ TAO_ServerRequest & server_request,
+ void * TAO_INTERCEPTOR (servant_upcall),
+ void * servant
+ ACE_ENV_ARG_DECL
+ )
+{
+#if TAO_HAS_INTERCEPTORS == 1
+ static ::CORBA::TypeCode_ptr const * const exceptions = 0;
+ static ::CORBA::ULong const nexceptions = 0;
+#endif /* TAO_HAS_INTERCEPTORS */
+
+ TAO::SArg_Traits< ::CORBA::Char *>::ret_val retval;
+
+ TAO::Argument * const args[] =
+ {
+ &retval
+ };
+
+ static size_t const nargs = 1;
+
+ POA_CORBA::AbstractInterfaceDef * const impl =
+ static_cast<POA_CORBA::AbstractInterfaceDef *> (servant);
+
+ _repository_id_AbstractInterfaceDef_Upcall_Command command (
+ impl,
+ server_request.operation_details (),
+ args);
+
+ TAO::Upcall_Wrapper upcall_wrapper;
+ upcall_wrapper.upcall (server_request
+ , args
+ , nargs
+ , command
+#if TAO_HAS_INTERCEPTORS == 1
+ , servant_upcall
+ , exceptions
+ , nexceptions
+#endif /* TAO_HAS_INTERCEPTORS == 1 */
+ ACE_ENV_ARG_PARAMETER);
+ ACE_CHECK;
+}
+
+// TAO_IDL - Generated from
+// be\be_visitor_interface/interface_ss.cpp:513
+
+void POA_CORBA::AbstractInterfaceDef::_interface_skel (
+ TAO_ServerRequest & server_request,
+ void * /* servant_upcall */,
+ void * servant
+ ACE_ENV_ARG_DECL
+ )
+{
+ TAO_IFR_Client_Adapter *_tao_adapter =
+ ACE_Dynamic_Service<TAO_IFR_Client_Adapter>::instance (
+ TAO_ORB_Core::ifr_client_adapter_name ()
+ );
+
+ if (_tao_adapter == 0)
+ {
+ ACE_THROW ( ::CORBA::INTF_REPOS ( ::CORBA::OMGVMCID | 1,
+ ::CORBA::COMPLETED_NO));
+ }
+
+ POA_CORBA::AbstractInterfaceDef * const impl =
+ static_cast<POA_CORBA::AbstractInterfaceDef *> (servant);
+ ::CORBA::InterfaceDef_ptr _tao_retval =
+ impl->_get_interface (ACE_ENV_SINGLE_ARG_PARAMETER);
+ ACE_CHECK;
+
+ server_request.init_reply ();
+ TAO_OutputCDR &_tao_out = *server_request.outgoing ();
+
+ ::CORBA::Boolean const _tao_result =
+ _tao_adapter->interfacedef_cdr_insert (
+ _tao_out,
+ _tao_retval
+ );
+
+ _tao_adapter->dispose (_tao_retval);
+
+ if (_tao_result == false)
+ {
+ ACE_THROW ( ::CORBA::MARSHAL ());
+ }
+}namespace POA_CORBA
+{
+
+
+ // TAO_IDL - Generated from
+ // be\be_visitor_operation/upcall_command_ss.cpp:127
+
+ class _get_component_AbstractInterfaceDef_Upcall_Command
+ : public TAO::Upcall_Command
+ {
+ public:
+ inline _get_component_AbstractInterfaceDef_Upcall_Command (
+ POA_CORBA::AbstractInterfaceDef * servant,
+ TAO_Operation_Details const * operation_details,
+ TAO::Argument * const args[])
+ : servant_ (servant)
+ , operation_details_ (operation_details)
+ , args_ (args)
+ {
+ }
+
+ virtual void execute (ACE_ENV_SINGLE_ARG_DECL)
+ {
+ TAO::SArg_Traits< ::CORBA::Object>::ret_arg_type retval =
+ TAO::Portable_Server::get_ret_arg< ::CORBA::Object> (
+ this->operation_details_,
+ this->args_);
+
+ retval =
+ this->servant_-> _get_component (
+ ACE_ENV_SINGLE_ARG_PARAMETER);
+ ACE_CHECK;
+ }
+
+ private:
+ POA_CORBA::AbstractInterfaceDef * const servant_;
+ TAO_Operation_Details const * const operation_details_;
+ TAO::Argument * const * const args_;
+ };
+}
+
+
+void POA_CORBA::AbstractInterfaceDef::_component_skel (
+ TAO_ServerRequest & server_request,
+ void * TAO_INTERCEPTOR (servant_upcall),
+ void * servant
+ ACE_ENV_ARG_DECL
+ )
+{
+#if TAO_HAS_INTERCEPTORS == 1
+ static ::CORBA::TypeCode_ptr const * const exceptions = 0;
+ static ::CORBA::ULong const nexceptions = 0;
+#endif /* TAO_HAS_INTERCEPTORS */
+
+ TAO::SArg_Traits< ::CORBA::Object>::ret_val retval;
+
+ TAO::Argument * const args[] =
+ {
+ &retval
+ };
+
+ static size_t const nargs = 1;
+
+ POA_CORBA::AbstractInterfaceDef * const impl =
+ static_cast<POA_CORBA::AbstractInterfaceDef *> (servant);
+
+ _get_component_AbstractInterfaceDef_Upcall_Command command (
+ impl,
+ server_request.operation_details (),
+ args);
+
+ TAO::Upcall_Wrapper upcall_wrapper;
+ upcall_wrapper.upcall (server_request
+ , args
+ , nargs
+ , command
+#if TAO_HAS_INTERCEPTORS == 1
+ , servant_upcall
+ , exceptions
+ , nexceptions
+#endif /* TAO_HAS_INTERCEPTORS == 1 */
+ ACE_ENV_ARG_PARAMETER);
+ ACE_CHECK;
+}
+
+::CORBA::Boolean POA_CORBA::AbstractInterfaceDef::_is_a (
+ const char* value
+ ACE_ENV_ARG_DECL_NOT_USED
+ )
+{
+ return
+ (
+ !ACE_OS::strcmp (
+ value,
+ "IDL:omg.org/CORBA/IRObject:1.0"
+ ) ||
+ !ACE_OS::strcmp (
+ value,
+ "IDL:omg.org/CORBA/Container:1.0"
+ ) ||
+ !ACE_OS::strcmp (
+ value,
+ "IDL:omg.org/CORBA/Contained:1.0"
+ ) ||
+ !ACE_OS::strcmp (
+ value,
+ "IDL:omg.org/CORBA/IDLType:1.0"
+ ) ||
+ !ACE_OS::strcmp (
+ value,
+ "IDL:omg.org/CORBA/InterfaceDef:1.0"
+ ) ||
+ !ACE_OS::strcmp (
+ value,
+ "IDL:omg.org/CORBA/AbstractInterfaceDef:1.0"
+ ) ||
+ !ACE_OS::strcmp (
+ value,
+ "IDL:omg.org/CORBA/Object:1.0"
+ )
+ );
+}
+
+const char* POA_CORBA::AbstractInterfaceDef::_interface_repository_id (void) const
+{
+ return "IDL:omg.org/CORBA/AbstractInterfaceDef:1.0";
+}
+
+// TAO_IDL - Generated from
+// be\be_visitor_interface/interface_ss.cpp:903
+
+void POA_CORBA::AbstractInterfaceDef::_dispatch (
+ TAO_ServerRequest & req,
+ void * servant_upcall
+ ACE_ENV_ARG_DECL
+ )
+{
+ this->synchronous_upcall_dispatch (req,
+ servant_upcall,
+ this
+ ACE_ENV_ARG_PARAMETER);
+}
+
+// TAO_IDL - Generated from
+// be\be_visitor_interface/interface_ss.cpp:851
+
+CORBA::AbstractInterfaceDef *
+POA_CORBA::AbstractInterfaceDef::_this (ACE_ENV_SINGLE_ARG_DECL)
+{
+ TAO_Stub *stub = this->_create_stub (ACE_ENV_SINGLE_ARG_PARAMETER);
+ ACE_CHECK_RETURN (0);
+
+ TAO_Stub_Auto_Ptr safe_stub (stub);
+ ::CORBA::Object_ptr tmp = CORBA::Object::_nil ();
+
+ ::CORBA::Boolean const _tao_opt_colloc =
+ stub->servant_orb_var ()->orb_core ()->optimize_collocation_objects ();
+
+ ACE_NEW_RETURN (
+ tmp,
+ ::CORBA::Object (stub, _tao_opt_colloc, this),
+ 0
+ );
+
+ ::CORBA::Object_var obj = tmp;
+ (void) safe_stub.release ();
+
+ typedef ::CORBA::AbstractInterfaceDef STUB_SCOPED_NAME;
+ return
+ TAO::Narrow_Utils<STUB_SCOPED_NAME>::unchecked_narrow (
+ obj.in (),
+ CORBA__TAO_AbstractInterfaceDef_Proxy_Broker_Factory_function_pointer
+ );
+}
+
+// TAO_IDL - Generated from
+// be\be_interface.cpp:1499
+
+class TAO_CORBA_ExtAbstractInterfaceDef_Perfect_Hash_OpTable
+ : public TAO_Perfect_Hash_OpTable
+{
+private:
+ unsigned int hash (const char *str, unsigned int len);
+
+public:
+ const TAO_operation_db_entry * lookup (const char *str, unsigned int len);
+};
+
+/* C++ code produced by gperf version 2.8 (ACE version) */
+/* Command-line: C:\ACE\latest\ACE_wrappers\bin\gperf.exe -m -M -J -c -C -D -E -T -f 0 -F 0,0 -a -o -t -p -K opname -L C++ -Z TAO_CORBA_ExtAbstractInterfaceDef_Perfect_Hash_OpTable -N lookup */
+unsigned int
+TAO_CORBA_ExtAbstractInterfaceDef_Perfect_Hash_OpTable::hash (const char *str, unsigned int len)
+{
+ static const unsigned char asso_values[] =
+ {
+#if defined (ACE_MVS)
+ 74, 74, 74, 74, 74, 74, 74, 74, 74, 74,
+ 74, 74, 74, 74, 74, 74, 74, 74, 74, 74,
+ 74, 74, 74, 74, 74, 74, 74, 74, 74, 74,
+ 74, 74, 74, 74, 74, 74, 74, 74, 74, 74,
+ 74, 74, 74, 74, 74, 74, 74, 74, 74, 74,
+ 74, 74, 74, 74, 74, 74, 74, 74, 74, 74,
+ 74, 74, 74, 74, 74, 74, 74, 74, 74, 74,
+ 74, 74, 74, 74, 74, 74, 74, 74, 74, 74,
+ 74, 74, 74, 74, 74, 74, 74, 74, 74, 74,
+ 74, 74, 74, 74, 74, 74, 74, 74, 74, 74,
+ 74, 74, 74, 74, 74, 74, 74, 74, 74, 30,
+ 74, 74, 74, 74, 74, 74, 74, 74, 74, 74,
+ 74, 74, 74, 74, 74, 74, 74, 74, 74, 0,
+ 74, 0, 20, 0, 74, 74, 74, 5, 74, 74,
+ 74, 74, 74, 74, 74, 74, 74, 15, 0, 5,
+ 74, 15, 74, 74, 74, 74, 74, 74, 74, 74,
+ 74, 74, 15, 30, 74, 74, 74, 15, 5, 74,
+ 74, 74, 74, 74, 74, 74, 74, 74, 74, 74,
+ 74, 74, 74, 74, 74, 74, 74, 74, 74, 74,
+ 74, 74, 74, 74, 74, 74, 74, 74, 74, 74,
+ 74, 74, 74, 74, 74, 74, 74, 74, 74, 74,
+ 74, 74, 74, 74, 74, 74, 74, 74, 74, 74,
+ 74, 74, 74, 74, 74, 74, 74, 74, 74, 74,
+ 74, 74, 74, 74, 74, 74, 74, 74, 74, 74,
+ 74, 74, 74, 74, 74, 74, 74, 74, 74, 74,
+ 74, 74, 74, 74, 74, 74,
+#else
+ 74, 74, 74, 74, 74, 74, 74, 74, 74, 74,
+ 74, 74, 74, 74, 74, 74, 74, 74, 74, 74,
+ 74, 74, 74, 74, 74, 74, 74, 74, 74, 74,
+ 74, 74, 74, 74, 74, 74, 74, 74, 74, 74,
+ 74, 74, 74, 74, 74, 74, 74, 74, 74, 74,
+ 74, 74, 74, 74, 74, 74, 74, 74, 74, 74,
+ 74, 74, 74, 74, 74, 74, 74, 74, 74, 74,
+ 74, 74, 74, 74, 74, 74, 74, 74, 74, 74,
+ 74, 74, 74, 74, 74, 74, 74, 74, 74, 74,
+ 74, 74, 74, 74, 74, 30, 74, 0, 74, 0,
+ 20, 0, 74, 74, 74, 5, 74, 74, 15, 0,
+ 5, 74, 15, 74, 74, 15, 30, 74, 74, 74,
+ 15, 5, 74, 74, 74, 74, 74, 74,
+#endif /* ACE_MVS */
+ };
+ return len + asso_values[(int) str[len - 1]] + asso_values[(int) str[0]];
+}
+
+const TAO_operation_db_entry *
+TAO_CORBA_ExtAbstractInterfaceDef_Perfect_Hash_OpTable::lookup (const char *str, unsigned int len)
+{
+ enum
+ {
+ TOTAL_KEYWORDS = 45,
+ MIN_WORD_LENGTH = 4,
+ MAX_WORD_LENGTH = 26,
+ MIN_HASH_VALUE = 4,
+ MAX_HASH_VALUE = 73,
+ HASH_VALUE_RANGE = 70,
+ DUPLICATES = 10,
+ WORDLIST_SIZE = 49
+ };
+
+ static const TAO_operation_db_entry wordlist[] =
+ {
+ {"",0,0},{"",0,0},{"",0,0},{"",0,0},
+ {"move", &POA_CORBA::ExtAbstractInterfaceDef::move_skel, 0},
+ {"is_a", &POA_CORBA::ExtAbstractInterfaceDef::is_a_skel, 0},
+ {"create_enum", &POA_CORBA::ExtAbstractInterfaceDef::create_enum_skel, 0},
+ {"create_value", &POA_CORBA::ExtAbstractInterfaceDef::create_value_skel, 0},
+ {"create_module", &POA_CORBA::ExtAbstractInterfaceDef::create_module_skel, 0},
+ {"create_native", &POA_CORBA::ExtAbstractInterfaceDef::create_native_skel, 0},
+ {"create_interface", &POA_CORBA::ExtAbstractInterfaceDef::create_interface_skel, 0},
+ {"create_attribute", &POA_CORBA::ExtAbstractInterfaceDef::create_attribute_skel, 0},
+ {"create_ext_value", &POA_CORBA::ExtAbstractInterfaceDef::create_ext_value_skel, 0},
+ {"create_union", &POA_CORBA::ExtAbstractInterfaceDef::create_union_skel, 0},
+ {"create_ext_attribute", &POA_CORBA::ExtAbstractInterfaceDef::create_ext_attribute_skel, 0},
+ {"create_exception", &POA_CORBA::ExtAbstractInterfaceDef::create_exception_skel, 0},
+ {"create_operation", &POA_CORBA::ExtAbstractInterfaceDef::create_operation_skel, 0},
+ {"create_local_interface", &POA_CORBA::ExtAbstractInterfaceDef::create_local_interface_skel, 0},
+ {"contents", &POA_CORBA::ExtAbstractInterfaceDef::contents_skel, 0},
+ {"create_abstract_interface", &POA_CORBA::ExtAbstractInterfaceDef::create_abstract_interface_skel, 0},
+ {"lookup_name", &POA_CORBA::ExtAbstractInterfaceDef::lookup_name_skel, 0},
+ {"create_alias", &POA_CORBA::ExtAbstractInterfaceDef::create_alias_skel, 0},
+ {"describe", &POA_CORBA::ExtAbstractInterfaceDef::describe_skel, 0},
+ {"create_value_box", &POA_CORBA::ExtAbstractInterfaceDef::create_value_box_skel, 0},
+ {"destroy", &POA_CORBA::ExtAbstractInterfaceDef::destroy_skel, 0},
+ {"_is_a", &POA_CORBA::ExtAbstractInterfaceDef::_is_a_skel, 0},
+ {"lookup", &POA_CORBA::ExtAbstractInterfaceDef::lookup_skel, 0},
+ {"describe_interface", &POA_CORBA::ExtAbstractInterfaceDef::describe_interface_skel, 0},
+ {"_get_name", &POA_CORBA::ExtAbstractInterfaceDef::_get_name_skel, 0},
+ {"_get_type", &POA_CORBA::ExtAbstractInterfaceDef::_get_type_skel, 0},
+ {"_set_name", &POA_CORBA::ExtAbstractInterfaceDef::_set_name_skel, 0},
+ {"_interface", &POA_CORBA::ExtAbstractInterfaceDef::_interface_skel, 0},
+ {"describe_ext_interface", &POA_CORBA::ExtAbstractInterfaceDef::describe_ext_interface_skel, 0},
+ {"create_struct", &POA_CORBA::ExtAbstractInterfaceDef::create_struct_skel, 0},
+ {"create_constant", &POA_CORBA::ExtAbstractInterfaceDef::create_constant_skel, 0},
+ {"_get_version", &POA_CORBA::ExtAbstractInterfaceDef::_get_version_skel, 0},
+ {"_set_version", &POA_CORBA::ExtAbstractInterfaceDef::_set_version_skel, 0},
+ {"_get_absolute_name", &POA_CORBA::ExtAbstractInterfaceDef::_get_absolute_name_skel, 0},
+ {"_get_defined_in", &POA_CORBA::ExtAbstractInterfaceDef::_get_defined_in_skel, 0},
+ {"describe_contents", &POA_CORBA::ExtAbstractInterfaceDef::describe_contents_skel, 0},
+ {"_get_id", &POA_CORBA::ExtAbstractInterfaceDef::_get_id_skel, 0},
+ {"_set_id", &POA_CORBA::ExtAbstractInterfaceDef::_set_id_skel, 0},
+ {"_get_containing_repository", &POA_CORBA::ExtAbstractInterfaceDef::_get_containing_repository_skel, 0},
+ {"_get_def_kind", &POA_CORBA::ExtAbstractInterfaceDef::_get_def_kind_skel, 0},
+ {"_repository_id", &POA_CORBA::ExtAbstractInterfaceDef::_repository_id_skel, 0},
+ {"_get_base_interfaces", &POA_CORBA::ExtAbstractInterfaceDef::_get_base_interfaces_skel, 0},
+ {"_set_base_interfaces", &POA_CORBA::ExtAbstractInterfaceDef::_set_base_interfaces_skel, 0},
+ {"_component", &POA_CORBA::ExtAbstractInterfaceDef::_component_skel, 0},
+ {"_non_existent", &POA_CORBA::ExtAbstractInterfaceDef::_non_existent_skel, 0},
+ };
+
+ static const signed char lookup[] =
+ {
+ -1, -1, -1, -1, 4, -1, -1, -8, -2, 5, -1, 6, 7, -79,
+ -10, -3, -75, 13, -15, -2, 14, -76, 17, 18, -1, 19, 20, 21,
+ 22, -28, -3, 23, 24, -35, -2, 25, 26, -1, 27, -83, 31, -1,
+ 32, 33, -1, 34, -1, -87, 37, -1, 38, -1, 39, -1, -1, -40,
+ -2, -75, -1, -45, -2, 42, -1, 43, 44, -79, -1, -1, -1, -1,
+ 47, -1, -1, 48,
+ };
+
+ if (len <= MAX_WORD_LENGTH && len >= MIN_WORD_LENGTH)
+ {
+ unsigned int key = hash (str, len);
+
+ if (key <= MAX_HASH_VALUE && key >= MIN_HASH_VALUE)
+ {
+ int slot = lookup[key];
+
+ if (slot >= 0 && slot < WORDLIST_SIZE)
+ {
+ const char *s = wordlist[slot].opname;
+
+ if (*str == *s && !strncmp (str + 1, s + 1, len - 1))
+ return &wordlist[slot];
+ }
+ else if (slot < 0 && slot >= -MAX_HASH_VALUE)
+ return 0;
+ else
+ {
+ unsigned int offset = key + slot + (slot > 0 ? -MAX_HASH_VALUE : MAX_HASH_VALUE);
+ const TAO_operation_db_entry *base = &wordlist[-lookup[offset]];
+ const TAO_operation_db_entry *ptr = base + -lookup[offset + 1];
+
+ while (--ptr >= base)
+ if (*str == *ptr->opname && !strncmp (str + 1, ptr->opname + 1, len - 1))
+ return ptr;
+ }
+ }
+ }
+ return 0;
+}
+
+static TAO_CORBA_ExtAbstractInterfaceDef_Perfect_Hash_OpTable tao_CORBA_ExtAbstractInterfaceDef_optable;
+
+// TAO_IDL - Generated from
+// be\be_visitor_interface/interface_ss.cpp:966
+
+TAO::Collocation_Proxy_Broker *
+CORBA__TAO_ExtAbstractInterfaceDef_Proxy_Broker_Factory_function ( ::CORBA::Object_ptr)
+{
+ return reinterpret_cast<TAO::Collocation_Proxy_Broker *> (0xdead); // Dummy
+}
+
+int
+CORBA__TAO_ExtAbstractInterfaceDef_Proxy_Broker_Factory_Initializer (size_t)
+{
+ CORBA__TAO_ExtAbstractInterfaceDef_Proxy_Broker_Factory_function_pointer =
+ CORBA__TAO_ExtAbstractInterfaceDef_Proxy_Broker_Factory_function;
+
+ return 0;
+}
+
+static int
+CORBA__TAO_ExtAbstractInterfaceDef_Proxy_Broker_Stub_Factory_Initializer_Scarecrow =
+ CORBA__TAO_ExtAbstractInterfaceDef_Proxy_Broker_Factory_Initializer (
+ reinterpret_cast<size_t> (CORBA__TAO_ExtAbstractInterfaceDef_Proxy_Broker_Factory_Initializer)
+ );
+
+// TAO_IDL - Generated from
+// be\be_visitor_interface/interface_ss.cpp:103
+
+POA_CORBA::ExtAbstractInterfaceDef::ExtAbstractInterfaceDef (void)
+ : TAO_ServantBase ()
+{
+ this->optable_ = &tao_CORBA_ExtAbstractInterfaceDef_optable;
+}
+
+POA_CORBA::ExtAbstractInterfaceDef::ExtAbstractInterfaceDef (const ExtAbstractInterfaceDef& rhs)
+ : TAO_Abstract_ServantBase (rhs),
+ TAO_ServantBase (rhs),
+ POA_CORBA::IRObject (rhs),
+ POA_CORBA::Container (rhs),
+ POA_CORBA::Contained (rhs),
+ POA_CORBA::IDLType (rhs),
+ POA_CORBA::InterfaceDef (rhs),
+ POA_CORBA::AbstractInterfaceDef (rhs),
+ POA_CORBA::InterfaceAttrExtension (rhs)
+{
+}
+
+POA_CORBA::ExtAbstractInterfaceDef::~ExtAbstractInterfaceDef (void)
+{
+}
+
+// TAO_IDL - Generated from
+// be\be_visitor_interface/interface_ss.cpp:169
+
+namespace POA_CORBA
+{
+
+
+ // TAO_IDL - Generated from
+ // be\be_visitor_operation/upcall_command_ss.cpp:127
+
+ class _is_a_ExtAbstractInterfaceDef_Upcall_Command
+ : public TAO::Upcall_Command
+ {
+ public:
+ inline _is_a_ExtAbstractInterfaceDef_Upcall_Command (
+ POA_CORBA::ExtAbstractInterfaceDef * servant,
+ TAO_Operation_Details const * operation_details,
+ TAO::Argument * const args[])
+ : servant_ (servant)
+ , operation_details_ (operation_details)
+ , args_ (args)
+ {
+ }
+
+ virtual void execute (ACE_ENV_SINGLE_ARG_DECL)
+ {
+ TAO::SArg_Traits< ::ACE_InputCDR::to_boolean>::ret_arg_type retval =
+ TAO::Portable_Server::get_ret_arg< ::ACE_InputCDR::to_boolean> (
+ this->operation_details_,
+ this->args_);
+
+ TAO::SArg_Traits< ::CORBA::Char *>::in_arg_type arg_1 =
+ TAO::Portable_Server::get_in_arg< ::CORBA::Char *> (
+ this->operation_details_,
+ this->args_,
+ 1);
+
+ retval =
+ this->servant_-> _is_a (
+ arg_1
+ ACE_ENV_ARG_PARAMETER);
+ ACE_CHECK;
+ }
+
+ private:
+ POA_CORBA::ExtAbstractInterfaceDef * const servant_;
+ TAO_Operation_Details const * const operation_details_;
+ TAO::Argument * const * const args_;
+ };
+}
+
+
+void POA_CORBA::ExtAbstractInterfaceDef::_is_a_skel (
+ TAO_ServerRequest & server_request,
+ void * TAO_INTERCEPTOR (servant_upcall),
+ void * servant
+ ACE_ENV_ARG_DECL
+ )
+{
+#if TAO_HAS_INTERCEPTORS == 1
+ static ::CORBA::TypeCode_ptr const * const exceptions = 0;
+ static ::CORBA::ULong const nexceptions = 0;
+#endif /* TAO_HAS_INTERCEPTORS */
+
+ TAO::SArg_Traits< ::ACE_InputCDR::to_boolean>::ret_val retval;
+ TAO::SArg_Traits< ::CORBA::Char *>::in_arg_val _tao_repository_id;
+
+ TAO::Argument * const args[] =
+ {
+ &retval,
+ &_tao_repository_id
+ };
+
+ static size_t const nargs = 2;
+
+ POA_CORBA::ExtAbstractInterfaceDef * const impl =
+ static_cast<POA_CORBA::ExtAbstractInterfaceDef *> (servant);
+
+ _is_a_ExtAbstractInterfaceDef_Upcall_Command command (
+ impl,
+ server_request.operation_details (),
+ args);
+
+ TAO::Upcall_Wrapper upcall_wrapper;
+ upcall_wrapper.upcall (server_request
+ , args
+ , nargs
+ , command
+#if TAO_HAS_INTERCEPTORS == 1
+ , servant_upcall
+ , exceptions
+ , nexceptions
+#endif /* TAO_HAS_INTERCEPTORS == 1 */
+ ACE_ENV_ARG_PARAMETER);
+ ACE_CHECK;
+}namespace POA_CORBA
+{
+
+
+ // TAO_IDL - Generated from
+ // be\be_visitor_operation/upcall_command_ss.cpp:127
+
+ class _non_existent_ExtAbstractInterfaceDef_Upcall_Command
+ : public TAO::Upcall_Command
+ {
+ public:
+ inline _non_existent_ExtAbstractInterfaceDef_Upcall_Command (
+ POA_CORBA::ExtAbstractInterfaceDef * servant,
+ TAO_Operation_Details const * operation_details,
+ TAO::Argument * const args[])
+ : servant_ (servant)
+ , operation_details_ (operation_details)
+ , args_ (args)
+ {
+ }
+
+ virtual void execute (ACE_ENV_SINGLE_ARG_DECL)
+ {
+ TAO::SArg_Traits< ::ACE_InputCDR::to_boolean>::ret_arg_type retval =
+ TAO::Portable_Server::get_ret_arg< ::ACE_InputCDR::to_boolean> (
+ this->operation_details_,
+ this->args_);
+
+ retval =
+ this->servant_-> _non_existent (
+ ACE_ENV_SINGLE_ARG_PARAMETER);
+ ACE_CHECK;
+ }
+
+ private:
+ POA_CORBA::ExtAbstractInterfaceDef * const servant_;
+ TAO_Operation_Details const * const operation_details_;
+ TAO::Argument * const * const args_;
+ };
+}
+
+
+void POA_CORBA::ExtAbstractInterfaceDef::_non_existent_skel (
+ TAO_ServerRequest & server_request,
+ void * TAO_INTERCEPTOR (servant_upcall),
+ void * servant
+ ACE_ENV_ARG_DECL
+ )
+{
+#if TAO_HAS_INTERCEPTORS == 1
+ static ::CORBA::TypeCode_ptr const * const exceptions = 0;
+ static ::CORBA::ULong const nexceptions = 0;
+#endif /* TAO_HAS_INTERCEPTORS */
+
+ TAO::SArg_Traits< ::ACE_InputCDR::to_boolean>::ret_val retval;
+
+ TAO::Argument * const args[] =
+ {
+ &retval
+ };
+
+ static size_t const nargs = 1;
+
+ POA_CORBA::ExtAbstractInterfaceDef * const impl =
+ static_cast<POA_CORBA::ExtAbstractInterfaceDef *> (servant);
+
+ _non_existent_ExtAbstractInterfaceDef_Upcall_Command command (
+ impl,
+ server_request.operation_details (),
+ args);
+
+ TAO::Upcall_Wrapper upcall_wrapper;
+ upcall_wrapper.upcall (server_request
+ , args
+ , nargs
+ , command
+#if TAO_HAS_INTERCEPTORS == 1
+ , servant_upcall
+ , exceptions
+ , nexceptions
+#endif /* TAO_HAS_INTERCEPTORS == 1 */
+ ACE_ENV_ARG_PARAMETER);
+ ACE_CHECK;
+}namespace POA_CORBA
+{
+
+
+ // TAO_IDL - Generated from
+ // be\be_visitor_operation/upcall_command_ss.cpp:127
+
+ class _repository_id_ExtAbstractInterfaceDef_Upcall_Command
+ : public TAO::Upcall_Command
+ {
+ public:
+ inline _repository_id_ExtAbstractInterfaceDef_Upcall_Command (
+ POA_CORBA::ExtAbstractInterfaceDef * servant,
+ TAO_Operation_Details const * operation_details,
+ TAO::Argument * const args[])
+ : servant_ (servant)
+ , operation_details_ (operation_details)
+ , args_ (args)
+ {
+ }
+
+ virtual void execute (ACE_ENV_SINGLE_ARG_DECL)
+ {
+ TAO::SArg_Traits< ::CORBA::Char *>::ret_arg_type retval =
+ TAO::Portable_Server::get_ret_arg< ::CORBA::Char *> (
+ this->operation_details_,
+ this->args_);
+
+ retval =
+ this->servant_-> _repository_id (
+ ACE_ENV_SINGLE_ARG_PARAMETER);
+ ACE_CHECK;
+ }
+
+ private:
+ POA_CORBA::ExtAbstractInterfaceDef * const servant_;
+ TAO_Operation_Details const * const operation_details_;
+ TAO::Argument * const * const args_;
+ };
+}
+
+
+void POA_CORBA::ExtAbstractInterfaceDef::_repository_id_skel (
+ TAO_ServerRequest & server_request,
+ void * TAO_INTERCEPTOR (servant_upcall),
+ void * servant
+ ACE_ENV_ARG_DECL
+ )
+{
+#if TAO_HAS_INTERCEPTORS == 1
+ static ::CORBA::TypeCode_ptr const * const exceptions = 0;
+ static ::CORBA::ULong const nexceptions = 0;
+#endif /* TAO_HAS_INTERCEPTORS */
+
+ TAO::SArg_Traits< ::CORBA::Char *>::ret_val retval;
+
+ TAO::Argument * const args[] =
+ {
+ &retval
+ };
+
+ static size_t const nargs = 1;
+
+ POA_CORBA::ExtAbstractInterfaceDef * const impl =
+ static_cast<POA_CORBA::ExtAbstractInterfaceDef *> (servant);
+
+ _repository_id_ExtAbstractInterfaceDef_Upcall_Command command (
+ impl,
+ server_request.operation_details (),
+ args);
+
+ TAO::Upcall_Wrapper upcall_wrapper;
+ upcall_wrapper.upcall (server_request
+ , args
+ , nargs
+ , command
+#if TAO_HAS_INTERCEPTORS == 1
+ , servant_upcall
+ , exceptions
+ , nexceptions
+#endif /* TAO_HAS_INTERCEPTORS == 1 */
+ ACE_ENV_ARG_PARAMETER);
+ ACE_CHECK;
+}
+
+// TAO_IDL - Generated from
+// be\be_visitor_interface/interface_ss.cpp:513
+
+void POA_CORBA::ExtAbstractInterfaceDef::_interface_skel (
+ TAO_ServerRequest & server_request,
+ void * /* servant_upcall */,
+ void * servant
+ ACE_ENV_ARG_DECL
+ )
+{
+ TAO_IFR_Client_Adapter *_tao_adapter =
+ ACE_Dynamic_Service<TAO_IFR_Client_Adapter>::instance (
+ TAO_ORB_Core::ifr_client_adapter_name ()
+ );
+
+ if (_tao_adapter == 0)
+ {
+ ACE_THROW ( ::CORBA::INTF_REPOS ( ::CORBA::OMGVMCID | 1,
+ ::CORBA::COMPLETED_NO));
+ }
+
+ POA_CORBA::ExtAbstractInterfaceDef * const impl =
+ static_cast<POA_CORBA::ExtAbstractInterfaceDef *> (servant);
+ ::CORBA::InterfaceDef_ptr _tao_retval =
+ impl->_get_interface (ACE_ENV_SINGLE_ARG_PARAMETER);
+ ACE_CHECK;
+
+ server_request.init_reply ();
+ TAO_OutputCDR &_tao_out = *server_request.outgoing ();
+
+ ::CORBA::Boolean const _tao_result =
+ _tao_adapter->interfacedef_cdr_insert (
+ _tao_out,
+ _tao_retval
+ );
+
+ _tao_adapter->dispose (_tao_retval);
+
+ if (_tao_result == false)
+ {
+ ACE_THROW ( ::CORBA::MARSHAL ());
+ }
+}namespace POA_CORBA
+{
+
+
+ // TAO_IDL - Generated from
+ // be\be_visitor_operation/upcall_command_ss.cpp:127
+
+ class _get_component_ExtAbstractInterfaceDef_Upcall_Command
+ : public TAO::Upcall_Command
+ {
+ public:
+ inline _get_component_ExtAbstractInterfaceDef_Upcall_Command (
+ POA_CORBA::ExtAbstractInterfaceDef * servant,
+ TAO_Operation_Details const * operation_details,
+ TAO::Argument * const args[])
+ : servant_ (servant)
+ , operation_details_ (operation_details)
+ , args_ (args)
+ {
+ }
+
+ virtual void execute (ACE_ENV_SINGLE_ARG_DECL)
+ {
+ TAO::SArg_Traits< ::CORBA::Object>::ret_arg_type retval =
+ TAO::Portable_Server::get_ret_arg< ::CORBA::Object> (
+ this->operation_details_,
+ this->args_);
+
+ retval =
+ this->servant_-> _get_component (
+ ACE_ENV_SINGLE_ARG_PARAMETER);
+ ACE_CHECK;
+ }
+
+ private:
+ POA_CORBA::ExtAbstractInterfaceDef * const servant_;
+ TAO_Operation_Details const * const operation_details_;
+ TAO::Argument * const * const args_;
+ };
+}
+
+
+void POA_CORBA::ExtAbstractInterfaceDef::_component_skel (
+ TAO_ServerRequest & server_request,
+ void * TAO_INTERCEPTOR (servant_upcall),
+ void * servant
+ ACE_ENV_ARG_DECL
+ )
+{
+#if TAO_HAS_INTERCEPTORS == 1
+ static ::CORBA::TypeCode_ptr const * const exceptions = 0;
+ static ::CORBA::ULong const nexceptions = 0;
+#endif /* TAO_HAS_INTERCEPTORS */
+
+ TAO::SArg_Traits< ::CORBA::Object>::ret_val retval;
+
+ TAO::Argument * const args[] =
+ {
+ &retval
+ };
+
+ static size_t const nargs = 1;
+
+ POA_CORBA::ExtAbstractInterfaceDef * const impl =
+ static_cast<POA_CORBA::ExtAbstractInterfaceDef *> (servant);
+
+ _get_component_ExtAbstractInterfaceDef_Upcall_Command command (
+ impl,
+ server_request.operation_details (),
+ args);
+
+ TAO::Upcall_Wrapper upcall_wrapper;
+ upcall_wrapper.upcall (server_request
+ , args
+ , nargs
+ , command
+#if TAO_HAS_INTERCEPTORS == 1
+ , servant_upcall
+ , exceptions
+ , nexceptions
+#endif /* TAO_HAS_INTERCEPTORS == 1 */
+ ACE_ENV_ARG_PARAMETER);
+ ACE_CHECK;
+}
+
+::CORBA::Boolean POA_CORBA::ExtAbstractInterfaceDef::_is_a (
+ const char* value
+ ACE_ENV_ARG_DECL_NOT_USED
+ )
+{
+ return
+ (
+ !ACE_OS::strcmp (
+ value,
+ "IDL:omg.org/CORBA/IRObject:1.0"
+ ) ||
+ !ACE_OS::strcmp (
+ value,
+ "IDL:omg.org/CORBA/Container:1.0"
+ ) ||
+ !ACE_OS::strcmp (
+ value,
+ "IDL:omg.org/CORBA/Contained:1.0"
+ ) ||
+ !ACE_OS::strcmp (
+ value,
+ "IDL:omg.org/CORBA/IDLType:1.0"
+ ) ||
+ !ACE_OS::strcmp (
+ value,
+ "IDL:omg.org/CORBA/InterfaceDef:1.0"
+ ) ||
+ !ACE_OS::strcmp (
+ value,
+ "IDL:omg.org/CORBA/AbstractInterfaceDef:1.0"
+ ) ||
+ !ACE_OS::strcmp (
+ value,
+ "IDL:omg.org/CORBA/InterfaceAttrExtension:1.0"
+ ) ||
+ !ACE_OS::strcmp (
+ value,
+ "IDL:omg.org/CORBA/ExtAbstractInterfaceDef:1.0"
+ ) ||
+ !ACE_OS::strcmp (
+ value,
+ "IDL:omg.org/CORBA/Object:1.0"
+ )
+ );
+}
+
+const char* POA_CORBA::ExtAbstractInterfaceDef::_interface_repository_id (void) const
+{
+ return "IDL:omg.org/CORBA/ExtAbstractInterfaceDef:1.0";
+}
+
+// TAO_IDL - Generated from
+// be\be_visitor_interface/interface_ss.cpp:903
+
+void POA_CORBA::ExtAbstractInterfaceDef::_dispatch (
+ TAO_ServerRequest & req,
+ void * servant_upcall
+ ACE_ENV_ARG_DECL
+ )
+{
+ this->synchronous_upcall_dispatch (req,
+ servant_upcall,
+ this
+ ACE_ENV_ARG_PARAMETER);
+}
+
+// TAO_IDL - Generated from
+// be\be_visitor_interface/interface_ss.cpp:851
+
+CORBA::ExtAbstractInterfaceDef *
+POA_CORBA::ExtAbstractInterfaceDef::_this (ACE_ENV_SINGLE_ARG_DECL)
+{
+ TAO_Stub *stub = this->_create_stub (ACE_ENV_SINGLE_ARG_PARAMETER);
+ ACE_CHECK_RETURN (0);
+
+ TAO_Stub_Auto_Ptr safe_stub (stub);
+ ::CORBA::Object_ptr tmp = CORBA::Object::_nil ();
+
+ ::CORBA::Boolean const _tao_opt_colloc =
+ stub->servant_orb_var ()->orb_core ()->optimize_collocation_objects ();
+
+ ACE_NEW_RETURN (
+ tmp,
+ ::CORBA::Object (stub, _tao_opt_colloc, this),
+ 0
+ );
+
+ ::CORBA::Object_var obj = tmp;
+ (void) safe_stub.release ();
+
+ typedef ::CORBA::ExtAbstractInterfaceDef STUB_SCOPED_NAME;
+ return
+ TAO::Narrow_Utils<STUB_SCOPED_NAME>::unchecked_narrow (
+ obj.in (),
+ CORBA__TAO_ExtAbstractInterfaceDef_Proxy_Broker_Factory_function_pointer
+ );
+}
+
+// TAO_IDL - Generated from
+// be\be_interface.cpp:1499
+
+class TAO_CORBA_LocalInterfaceDef_Perfect_Hash_OpTable
+ : public TAO_Perfect_Hash_OpTable
+{
+private:
+ unsigned int hash (const char *str, unsigned int len);
+
+public:
+ const TAO_operation_db_entry * lookup (const char *str, unsigned int len);
+};
+
+/* C++ code produced by gperf version 2.8 (ACE version) */
+/* Command-line: C:\ACE\latest\ACE_wrappers\bin\gperf.exe -m -M -J -c -C -D -E -T -f 0 -F 0,0 -a -o -t -p -K opname -L C++ -Z TAO_CORBA_LocalInterfaceDef_Perfect_Hash_OpTable -N lookup */
+unsigned int
+TAO_CORBA_LocalInterfaceDef_Perfect_Hash_OpTable::hash (const char *str, unsigned int len)
+{
+ static const unsigned char asso_values[] =
+ {
+#if defined (ACE_MVS)
+ 81, 81, 81, 81, 81, 81, 81, 81, 81, 81,
+ 81, 81, 81, 81, 81, 81, 81, 81, 81, 81,
+ 81, 81, 81, 81, 81, 81, 81, 81, 81, 81,
+ 81, 81, 81, 81, 81, 81, 81, 81, 81, 81,
+ 81, 81, 81, 81, 81, 81, 81, 81, 81, 81,
+ 81, 81, 81, 81, 81, 81, 81, 81, 81, 81,
+ 81, 81, 81, 81, 81, 81, 81, 81, 81, 81,
+ 81, 81, 81, 81, 81, 81, 81, 81, 81, 81,
+ 81, 81, 81, 81, 81, 81, 81, 81, 81, 81,
+ 81, 81, 81, 81, 81, 81, 81, 81, 81, 81,
+ 81, 81, 81, 81, 81, 81, 81, 81, 81, 0,
+ 81, 81, 81, 81, 81, 81, 81, 81, 81, 81,
+ 81, 81, 81, 81, 81, 81, 81, 81, 81, 0,
+ 81, 30, 20, 0, 81, 81, 81, 10, 81, 81,
+ 81, 81, 81, 81, 81, 81, 81, 0, 0, 5,
+ 81, 0, 81, 81, 81, 81, 81, 81, 81, 81,
+ 81, 81, 20, 35, 81, 81, 81, 10, 5, 81,
+ 81, 81, 81, 81, 81, 81, 81, 81, 81, 81,
+ 81, 81, 81, 81, 81, 81, 81, 81, 81, 81,
+ 81, 81, 81, 81, 81, 81, 81, 81, 81, 81,
+ 81, 81, 81, 81, 81, 81, 81, 81, 81, 81,
+ 81, 81, 81, 81, 81, 81, 81, 81, 81, 81,
+ 81, 81, 81, 81, 81, 81, 81, 81, 81, 81,
+ 81, 81, 81, 81, 81, 81, 81, 81, 81, 81,
+ 81, 81, 81, 81, 81, 81, 81, 81, 81, 81,
+ 81, 81, 81, 81, 81, 81,
+#else
+ 81, 81, 81, 81, 81, 81, 81, 81, 81, 81,
+ 81, 81, 81, 81, 81, 81, 81, 81, 81, 81,
+ 81, 81, 81, 81, 81, 81, 81, 81, 81, 81,
+ 81, 81, 81, 81, 81, 81, 81, 81, 81, 81,
+ 81, 81, 81, 81, 81, 81, 81, 81, 81, 81,
+ 81, 81, 81, 81, 81, 81, 81, 81, 81, 81,
+ 81, 81, 81, 81, 81, 81, 81, 81, 81, 81,
+ 81, 81, 81, 81, 81, 81, 81, 81, 81, 81,
+ 81, 81, 81, 81, 81, 81, 81, 81, 81, 81,
+ 81, 81, 81, 81, 81, 0, 81, 0, 81, 30,
+ 20, 0, 81, 81, 81, 10, 81, 81, 0, 0,
+ 5, 81, 0, 81, 81, 20, 35, 81, 81, 81,
+ 10, 5, 81, 81, 81, 81, 81, 81,
+#endif /* ACE_MVS */
+ };
+ return len + asso_values[(int) str[len - 1]] + asso_values[(int) str[0]];
+}
+
+const TAO_operation_db_entry *
+TAO_CORBA_LocalInterfaceDef_Perfect_Hash_OpTable::lookup (const char *str, unsigned int len)
+{
+ enum
+ {
+ TOTAL_KEYWORDS = 43,
+ MIN_WORD_LENGTH = 4,
+ MAX_WORD_LENGTH = 26,
+ MIN_HASH_VALUE = 4,
+ MAX_HASH_VALUE = 80,
+ HASH_VALUE_RANGE = 77,
+ DUPLICATES = 10,
+ WORDLIST_SIZE = 47
+ };
+
+ static const TAO_operation_db_entry wordlist[] =
+ {
+ {"",0,0},{"",0,0},{"",0,0},{"",0,0},
+ {"move", &POA_CORBA::LocalInterfaceDef::move_skel, 0},
+ {"_is_a", &POA_CORBA::LocalInterfaceDef::_is_a_skel, 0},
+ {"lookup", &POA_CORBA::LocalInterfaceDef::lookup_skel, 0},
+ {"_get_name", &POA_CORBA::LocalInterfaceDef::_get_name_skel, 0},
+ {"_get_type", &POA_CORBA::LocalInterfaceDef::_get_type_skel, 0},
+ {"_set_name", &POA_CORBA::LocalInterfaceDef::_set_name_skel, 0},
+ {"_interface", &POA_CORBA::LocalInterfaceDef::_interface_skel, 0},
+ {"lookup_name", &POA_CORBA::LocalInterfaceDef::lookup_name_skel, 0},
+ {"is_a", &POA_CORBA::LocalInterfaceDef::is_a_skel, 0},
+ {"_get_version", &POA_CORBA::LocalInterfaceDef::_get_version_skel, 0},
+ {"_set_version", &POA_CORBA::LocalInterfaceDef::_set_version_skel, 0},
+ {"_get_absolute_name", &POA_CORBA::LocalInterfaceDef::_get_absolute_name_skel, 0},
+ {"_get_defined_in", &POA_CORBA::LocalInterfaceDef::_get_defined_in_skel, 0},
+ {"_get_id", &POA_CORBA::LocalInterfaceDef::_get_id_skel, 0},
+ {"_set_id", &POA_CORBA::LocalInterfaceDef::_set_id_skel, 0},
+ {"describe", &POA_CORBA::LocalInterfaceDef::describe_skel, 0},
+ {"_get_containing_repository", &POA_CORBA::LocalInterfaceDef::_get_containing_repository_skel, 0},
+ {"destroy", &POA_CORBA::LocalInterfaceDef::destroy_skel, 0},
+ {"_get_def_kind", &POA_CORBA::LocalInterfaceDef::_get_def_kind_skel, 0},
+ {"_repository_id", &POA_CORBA::LocalInterfaceDef::_repository_id_skel, 0},
+ {"describe_interface", &POA_CORBA::LocalInterfaceDef::describe_interface_skel, 0},
+ {"_get_base_interfaces", &POA_CORBA::LocalInterfaceDef::_get_base_interfaces_skel, 0},
+ {"_set_base_interfaces", &POA_CORBA::LocalInterfaceDef::_set_base_interfaces_skel, 0},
+ {"create_enum", &POA_CORBA::LocalInterfaceDef::create_enum_skel, 0},
+ {"create_value", &POA_CORBA::LocalInterfaceDef::create_value_skel, 0},
+ {"create_module", &POA_CORBA::LocalInterfaceDef::create_module_skel, 0},
+ {"create_native", &POA_CORBA::LocalInterfaceDef::create_native_skel, 0},
+ {"_component", &POA_CORBA::LocalInterfaceDef::_component_skel, 0},
+ {"create_interface", &POA_CORBA::LocalInterfaceDef::create_interface_skel, 0},
+ {"create_attribute", &POA_CORBA::LocalInterfaceDef::create_attribute_skel, 0},
+ {"create_ext_value", &POA_CORBA::LocalInterfaceDef::create_ext_value_skel, 0},
+ {"create_union", &POA_CORBA::LocalInterfaceDef::create_union_skel, 0},
+ {"_non_existent", &POA_CORBA::LocalInterfaceDef::_non_existent_skel, 0},
+ {"create_exception", &POA_CORBA::LocalInterfaceDef::create_exception_skel, 0},
+ {"create_operation", &POA_CORBA::LocalInterfaceDef::create_operation_skel, 0},
+ {"create_local_interface", &POA_CORBA::LocalInterfaceDef::create_local_interface_skel, 0},
+ {"create_abstract_interface", &POA_CORBA::LocalInterfaceDef::create_abstract_interface_skel, 0},
+ {"create_value_box", &POA_CORBA::LocalInterfaceDef::create_value_box_skel, 0},
+ {"describe_contents", &POA_CORBA::LocalInterfaceDef::describe_contents_skel, 0},
+ {"contents", &POA_CORBA::LocalInterfaceDef::contents_skel, 0},
+ {"create_alias", &POA_CORBA::LocalInterfaceDef::create_alias_skel, 0},
+ {"create_struct", &POA_CORBA::LocalInterfaceDef::create_struct_skel, 0},
+ {"create_constant", &POA_CORBA::LocalInterfaceDef::create_constant_skel, 0},
+ };
+
+ static const signed char lookup[] =
+ {
+ -1, -1, -1, -1, 4, 5, 6, -7, -3, -82, 10, 11, -1, -1,
+ 12, -13, -2, -82, 15, -1, 16, -1, -1, -17, -2, -25, -2, -84,
+ 19, -29, -2, 20, 21, 22, 23, -1, -32, -3, 24, -1, -95, 27,
+ 28, -94, -1, 31, -90, 35, 36, -37, -2, -82, 39, -1, -1, 40,
+ 41, 42, 43, -1, -1, -1, 44, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1, 45, -1, 46,
+ };
+
+ if (len <= MAX_WORD_LENGTH && len >= MIN_WORD_LENGTH)
+ {
+ unsigned int key = hash (str, len);
+
+ if (key <= MAX_HASH_VALUE && key >= MIN_HASH_VALUE)
+ {
+ int slot = lookup[key];
+
+ if (slot >= 0 && slot < WORDLIST_SIZE)
+ {
+ const char *s = wordlist[slot].opname;
+
+ if (*str == *s && !strncmp (str + 1, s + 1, len - 1))
+ return &wordlist[slot];
+ }
+ else if (slot < 0 && slot >= -MAX_HASH_VALUE)
+ return 0;
+ else
+ {
+ unsigned int offset = key + slot + (slot > 0 ? -MAX_HASH_VALUE : MAX_HASH_VALUE);
+ const TAO_operation_db_entry *base = &wordlist[-lookup[offset]];
+ const TAO_operation_db_entry *ptr = base + -lookup[offset + 1];
+
+ while (--ptr >= base)
+ if (*str == *ptr->opname && !strncmp (str + 1, ptr->opname + 1, len - 1))
+ return ptr;
+ }
+ }
+ }
+ return 0;
+}
+
+static TAO_CORBA_LocalInterfaceDef_Perfect_Hash_OpTable tao_CORBA_LocalInterfaceDef_optable;
+
+// TAO_IDL - Generated from
+// be\be_visitor_interface/interface_ss.cpp:966
+
+TAO::Collocation_Proxy_Broker *
+CORBA__TAO_LocalInterfaceDef_Proxy_Broker_Factory_function ( ::CORBA::Object_ptr)
+{
+ return reinterpret_cast<TAO::Collocation_Proxy_Broker *> (0xdead); // Dummy
+}
+
+int
+CORBA__TAO_LocalInterfaceDef_Proxy_Broker_Factory_Initializer (size_t)
+{
+ CORBA__TAO_LocalInterfaceDef_Proxy_Broker_Factory_function_pointer =
+ CORBA__TAO_LocalInterfaceDef_Proxy_Broker_Factory_function;
+
+ return 0;
+}
+
+static int
+CORBA__TAO_LocalInterfaceDef_Proxy_Broker_Stub_Factory_Initializer_Scarecrow =
+ CORBA__TAO_LocalInterfaceDef_Proxy_Broker_Factory_Initializer (
+ reinterpret_cast<size_t> (CORBA__TAO_LocalInterfaceDef_Proxy_Broker_Factory_Initializer)
+ );
+
+// TAO_IDL - Generated from
+// be\be_visitor_interface/interface_ss.cpp:103
+
+POA_CORBA::LocalInterfaceDef::LocalInterfaceDef (void)
+ : TAO_ServantBase ()
+{
+ this->optable_ = &tao_CORBA_LocalInterfaceDef_optable;
+}
+
+POA_CORBA::LocalInterfaceDef::LocalInterfaceDef (const LocalInterfaceDef& rhs)
+ : TAO_Abstract_ServantBase (rhs),
+ TAO_ServantBase (rhs),
+ POA_CORBA::IRObject (rhs),
+ POA_CORBA::Container (rhs),
+ POA_CORBA::Contained (rhs),
+ POA_CORBA::IDLType (rhs),
+ POA_CORBA::InterfaceDef (rhs)
+{
+}
+
+POA_CORBA::LocalInterfaceDef::~LocalInterfaceDef (void)
+{
+}
+
+// TAO_IDL - Generated from
+// be\be_visitor_interface/interface_ss.cpp:169
+
+namespace POA_CORBA
+{
+
+
+ // TAO_IDL - Generated from
+ // be\be_visitor_operation/upcall_command_ss.cpp:127
+
+ class _is_a_LocalInterfaceDef_Upcall_Command
+ : public TAO::Upcall_Command
+ {
+ public:
+ inline _is_a_LocalInterfaceDef_Upcall_Command (
+ POA_CORBA::LocalInterfaceDef * servant,
+ TAO_Operation_Details const * operation_details,
+ TAO::Argument * const args[])
+ : servant_ (servant)
+ , operation_details_ (operation_details)
+ , args_ (args)
+ {
+ }
+
+ virtual void execute (ACE_ENV_SINGLE_ARG_DECL)
+ {
+ TAO::SArg_Traits< ::ACE_InputCDR::to_boolean>::ret_arg_type retval =
+ TAO::Portable_Server::get_ret_arg< ::ACE_InputCDR::to_boolean> (
+ this->operation_details_,
+ this->args_);
+
+ TAO::SArg_Traits< ::CORBA::Char *>::in_arg_type arg_1 =
+ TAO::Portable_Server::get_in_arg< ::CORBA::Char *> (
+ this->operation_details_,
+ this->args_,
+ 1);
+
+ retval =
+ this->servant_-> _is_a (
+ arg_1
+ ACE_ENV_ARG_PARAMETER);
+ ACE_CHECK;
+ }
+
+ private:
+ POA_CORBA::LocalInterfaceDef * const servant_;
+ TAO_Operation_Details const * const operation_details_;
+ TAO::Argument * const * const args_;
+ };
+}
+
+
+void POA_CORBA::LocalInterfaceDef::_is_a_skel (
+ TAO_ServerRequest & server_request,
+ void * TAO_INTERCEPTOR (servant_upcall),
+ void * servant
+ ACE_ENV_ARG_DECL
+ )
+{
+#if TAO_HAS_INTERCEPTORS == 1
+ static ::CORBA::TypeCode_ptr const * const exceptions = 0;
+ static ::CORBA::ULong const nexceptions = 0;
+#endif /* TAO_HAS_INTERCEPTORS */
+
+ TAO::SArg_Traits< ::ACE_InputCDR::to_boolean>::ret_val retval;
+ TAO::SArg_Traits< ::CORBA::Char *>::in_arg_val _tao_repository_id;
+
+ TAO::Argument * const args[] =
+ {
+ &retval,
+ &_tao_repository_id
+ };
+
+ static size_t const nargs = 2;
+
+ POA_CORBA::LocalInterfaceDef * const impl =
+ static_cast<POA_CORBA::LocalInterfaceDef *> (servant);
+
+ _is_a_LocalInterfaceDef_Upcall_Command command (
+ impl,
+ server_request.operation_details (),
+ args);
+
+ TAO::Upcall_Wrapper upcall_wrapper;
+ upcall_wrapper.upcall (server_request
+ , args
+ , nargs
+ , command
+#if TAO_HAS_INTERCEPTORS == 1
+ , servant_upcall
+ , exceptions
+ , nexceptions
+#endif /* TAO_HAS_INTERCEPTORS == 1 */
+ ACE_ENV_ARG_PARAMETER);
+ ACE_CHECK;
+}namespace POA_CORBA
+{
+
+
+ // TAO_IDL - Generated from
+ // be\be_visitor_operation/upcall_command_ss.cpp:127
+
+ class _non_existent_LocalInterfaceDef_Upcall_Command
+ : public TAO::Upcall_Command
+ {
+ public:
+ inline _non_existent_LocalInterfaceDef_Upcall_Command (
+ POA_CORBA::LocalInterfaceDef * servant,
+ TAO_Operation_Details const * operation_details,
+ TAO::Argument * const args[])
+ : servant_ (servant)
+ , operation_details_ (operation_details)
+ , args_ (args)
+ {
+ }
+
+ virtual void execute (ACE_ENV_SINGLE_ARG_DECL)
+ {
+ TAO::SArg_Traits< ::ACE_InputCDR::to_boolean>::ret_arg_type retval =
+ TAO::Portable_Server::get_ret_arg< ::ACE_InputCDR::to_boolean> (
+ this->operation_details_,
+ this->args_);
+
+ retval =
+ this->servant_-> _non_existent (
+ ACE_ENV_SINGLE_ARG_PARAMETER);
+ ACE_CHECK;
+ }
+
+ private:
+ POA_CORBA::LocalInterfaceDef * const servant_;
+ TAO_Operation_Details const * const operation_details_;
+ TAO::Argument * const * const args_;
+ };
+}
+
+
+void POA_CORBA::LocalInterfaceDef::_non_existent_skel (
+ TAO_ServerRequest & server_request,
+ void * TAO_INTERCEPTOR (servant_upcall),
+ void * servant
+ ACE_ENV_ARG_DECL
+ )
+{
+#if TAO_HAS_INTERCEPTORS == 1
+ static ::CORBA::TypeCode_ptr const * const exceptions = 0;
+ static ::CORBA::ULong const nexceptions = 0;
+#endif /* TAO_HAS_INTERCEPTORS */
+
+ TAO::SArg_Traits< ::ACE_InputCDR::to_boolean>::ret_val retval;
+
+ TAO::Argument * const args[] =
+ {
+ &retval
+ };
+
+ static size_t const nargs = 1;
+
+ POA_CORBA::LocalInterfaceDef * const impl =
+ static_cast<POA_CORBA::LocalInterfaceDef *> (servant);
+
+ _non_existent_LocalInterfaceDef_Upcall_Command command (
+ impl,
+ server_request.operation_details (),
+ args);
+
+ TAO::Upcall_Wrapper upcall_wrapper;
+ upcall_wrapper.upcall (server_request
+ , args
+ , nargs
+ , command
+#if TAO_HAS_INTERCEPTORS == 1
+ , servant_upcall
+ , exceptions
+ , nexceptions
+#endif /* TAO_HAS_INTERCEPTORS == 1 */
+ ACE_ENV_ARG_PARAMETER);
+ ACE_CHECK;
+}namespace POA_CORBA
+{
+
+
+ // TAO_IDL - Generated from
+ // be\be_visitor_operation/upcall_command_ss.cpp:127
+
+ class _repository_id_LocalInterfaceDef_Upcall_Command
+ : public TAO::Upcall_Command
+ {
+ public:
+ inline _repository_id_LocalInterfaceDef_Upcall_Command (
+ POA_CORBA::LocalInterfaceDef * servant,
+ TAO_Operation_Details const * operation_details,
+ TAO::Argument * const args[])
+ : servant_ (servant)
+ , operation_details_ (operation_details)
+ , args_ (args)
+ {
+ }
+
+ virtual void execute (ACE_ENV_SINGLE_ARG_DECL)
+ {
+ TAO::SArg_Traits< ::CORBA::Char *>::ret_arg_type retval =
+ TAO::Portable_Server::get_ret_arg< ::CORBA::Char *> (
+ this->operation_details_,
+ this->args_);
+
+ retval =
+ this->servant_-> _repository_id (
+ ACE_ENV_SINGLE_ARG_PARAMETER);
+ ACE_CHECK;
+ }
+
+ private:
+ POA_CORBA::LocalInterfaceDef * const servant_;
+ TAO_Operation_Details const * const operation_details_;
+ TAO::Argument * const * const args_;
+ };
+}
+
+
+void POA_CORBA::LocalInterfaceDef::_repository_id_skel (
+ TAO_ServerRequest & server_request,
+ void * TAO_INTERCEPTOR (servant_upcall),
+ void * servant
+ ACE_ENV_ARG_DECL
+ )
+{
+#if TAO_HAS_INTERCEPTORS == 1
+ static ::CORBA::TypeCode_ptr const * const exceptions = 0;
+ static ::CORBA::ULong const nexceptions = 0;
+#endif /* TAO_HAS_INTERCEPTORS */
+
+ TAO::SArg_Traits< ::CORBA::Char *>::ret_val retval;
+
+ TAO::Argument * const args[] =
+ {
+ &retval
+ };
+
+ static size_t const nargs = 1;
+
+ POA_CORBA::LocalInterfaceDef * const impl =
+ static_cast<POA_CORBA::LocalInterfaceDef *> (servant);
+
+ _repository_id_LocalInterfaceDef_Upcall_Command command (
+ impl,
+ server_request.operation_details (),
+ args);
+
+ TAO::Upcall_Wrapper upcall_wrapper;
+ upcall_wrapper.upcall (server_request
+ , args
+ , nargs
+ , command
+#if TAO_HAS_INTERCEPTORS == 1
+ , servant_upcall
+ , exceptions
+ , nexceptions
+#endif /* TAO_HAS_INTERCEPTORS == 1 */
+ ACE_ENV_ARG_PARAMETER);
+ ACE_CHECK;
+}
+
+// TAO_IDL - Generated from
+// be\be_visitor_interface/interface_ss.cpp:513
+
+void POA_CORBA::LocalInterfaceDef::_interface_skel (
+ TAO_ServerRequest & server_request,
+ void * /* servant_upcall */,
+ void * servant
+ ACE_ENV_ARG_DECL
+ )
+{
+ TAO_IFR_Client_Adapter *_tao_adapter =
+ ACE_Dynamic_Service<TAO_IFR_Client_Adapter>::instance (
+ TAO_ORB_Core::ifr_client_adapter_name ()
+ );
+
+ if (_tao_adapter == 0)
+ {
+ ACE_THROW ( ::CORBA::INTF_REPOS ( ::CORBA::OMGVMCID | 1,
+ ::CORBA::COMPLETED_NO));
+ }
+
+ POA_CORBA::LocalInterfaceDef * const impl =
+ static_cast<POA_CORBA::LocalInterfaceDef *> (servant);
+ ::CORBA::InterfaceDef_ptr _tao_retval =
+ impl->_get_interface (ACE_ENV_SINGLE_ARG_PARAMETER);
+ ACE_CHECK;
+
+ server_request.init_reply ();
+ TAO_OutputCDR &_tao_out = *server_request.outgoing ();
+
+ ::CORBA::Boolean const _tao_result =
+ _tao_adapter->interfacedef_cdr_insert (
+ _tao_out,
+ _tao_retval
+ );
+
+ _tao_adapter->dispose (_tao_retval);
+
+ if (_tao_result == false)
+ {
+ ACE_THROW ( ::CORBA::MARSHAL ());
+ }
+}namespace POA_CORBA
+{
+
+
+ // TAO_IDL - Generated from
+ // be\be_visitor_operation/upcall_command_ss.cpp:127
+
+ class _get_component_LocalInterfaceDef_Upcall_Command
+ : public TAO::Upcall_Command
+ {
+ public:
+ inline _get_component_LocalInterfaceDef_Upcall_Command (
+ POA_CORBA::LocalInterfaceDef * servant,
+ TAO_Operation_Details const * operation_details,
+ TAO::Argument * const args[])
+ : servant_ (servant)
+ , operation_details_ (operation_details)
+ , args_ (args)
+ {
+ }
+
+ virtual void execute (ACE_ENV_SINGLE_ARG_DECL)
+ {
+ TAO::SArg_Traits< ::CORBA::Object>::ret_arg_type retval =
+ TAO::Portable_Server::get_ret_arg< ::CORBA::Object> (
+ this->operation_details_,
+ this->args_);
+
+ retval =
+ this->servant_-> _get_component (
+ ACE_ENV_SINGLE_ARG_PARAMETER);
+ ACE_CHECK;
+ }
+
+ private:
+ POA_CORBA::LocalInterfaceDef * const servant_;
+ TAO_Operation_Details const * const operation_details_;
+ TAO::Argument * const * const args_;
+ };
+}
+
+
+void POA_CORBA::LocalInterfaceDef::_component_skel (
+ TAO_ServerRequest & server_request,
+ void * TAO_INTERCEPTOR (servant_upcall),
+ void * servant
+ ACE_ENV_ARG_DECL
+ )
+{
+#if TAO_HAS_INTERCEPTORS == 1
+ static ::CORBA::TypeCode_ptr const * const exceptions = 0;
+ static ::CORBA::ULong const nexceptions = 0;
+#endif /* TAO_HAS_INTERCEPTORS */
+
+ TAO::SArg_Traits< ::CORBA::Object>::ret_val retval;
+
+ TAO::Argument * const args[] =
+ {
+ &retval
+ };
+
+ static size_t const nargs = 1;
+
+ POA_CORBA::LocalInterfaceDef * const impl =
+ static_cast<POA_CORBA::LocalInterfaceDef *> (servant);
+
+ _get_component_LocalInterfaceDef_Upcall_Command command (
+ impl,
+ server_request.operation_details (),
+ args);
+
+ TAO::Upcall_Wrapper upcall_wrapper;
+ upcall_wrapper.upcall (server_request
+ , args
+ , nargs
+ , command
+#if TAO_HAS_INTERCEPTORS == 1
+ , servant_upcall
+ , exceptions
+ , nexceptions
+#endif /* TAO_HAS_INTERCEPTORS == 1 */
+ ACE_ENV_ARG_PARAMETER);
+ ACE_CHECK;
+}
+
+::CORBA::Boolean POA_CORBA::LocalInterfaceDef::_is_a (
+ const char* value
+ ACE_ENV_ARG_DECL_NOT_USED
+ )
+{
+ return
+ (
+ !ACE_OS::strcmp (
+ value,
+ "IDL:omg.org/CORBA/IRObject:1.0"
+ ) ||
+ !ACE_OS::strcmp (
+ value,
+ "IDL:omg.org/CORBA/Container:1.0"
+ ) ||
+ !ACE_OS::strcmp (
+ value,
+ "IDL:omg.org/CORBA/Contained:1.0"
+ ) ||
+ !ACE_OS::strcmp (
+ value,
+ "IDL:omg.org/CORBA/IDLType:1.0"
+ ) ||
+ !ACE_OS::strcmp (
+ value,
+ "IDL:omg.org/CORBA/InterfaceDef:1.0"
+ ) ||
+ !ACE_OS::strcmp (
+ value,
+ "IDL:omg.org/CORBA/LocalInterfaceDef:1.0"
+ ) ||
+ !ACE_OS::strcmp (
+ value,
+ "IDL:omg.org/CORBA/Object:1.0"
+ )
+ );
+}
+
+const char* POA_CORBA::LocalInterfaceDef::_interface_repository_id (void) const
+{
+ return "IDL:omg.org/CORBA/LocalInterfaceDef:1.0";
+}
+
+// TAO_IDL - Generated from
+// be\be_visitor_interface/interface_ss.cpp:903
+
+void POA_CORBA::LocalInterfaceDef::_dispatch (
+ TAO_ServerRequest & req,
+ void * servant_upcall
+ ACE_ENV_ARG_DECL
+ )
+{
+ this->synchronous_upcall_dispatch (req,
+ servant_upcall,
+ this
+ ACE_ENV_ARG_PARAMETER);
+}
+
+// TAO_IDL - Generated from
+// be\be_visitor_interface/interface_ss.cpp:851
+
+CORBA::LocalInterfaceDef *
+POA_CORBA::LocalInterfaceDef::_this (ACE_ENV_SINGLE_ARG_DECL)
+{
+ TAO_Stub *stub = this->_create_stub (ACE_ENV_SINGLE_ARG_PARAMETER);
+ ACE_CHECK_RETURN (0);
+
+ TAO_Stub_Auto_Ptr safe_stub (stub);
+ ::CORBA::Object_ptr tmp = CORBA::Object::_nil ();
+
+ ::CORBA::Boolean const _tao_opt_colloc =
+ stub->servant_orb_var ()->orb_core ()->optimize_collocation_objects ();
+
+ ACE_NEW_RETURN (
+ tmp,
+ ::CORBA::Object (stub, _tao_opt_colloc, this),
+ 0
+ );
+
+ ::CORBA::Object_var obj = tmp;
+ (void) safe_stub.release ();
+
+ typedef ::CORBA::LocalInterfaceDef STUB_SCOPED_NAME;
+ return
+ TAO::Narrow_Utils<STUB_SCOPED_NAME>::unchecked_narrow (
+ obj.in (),
+ CORBA__TAO_LocalInterfaceDef_Proxy_Broker_Factory_function_pointer
+ );
+}
+
+// TAO_IDL - Generated from
+// be\be_interface.cpp:1499
+
+class TAO_CORBA_ExtLocalInterfaceDef_Perfect_Hash_OpTable
+ : public TAO_Perfect_Hash_OpTable
+{
+private:
+ unsigned int hash (const char *str, unsigned int len);
+
+public:
+ const TAO_operation_db_entry * lookup (const char *str, unsigned int len);
+};
+
+/* C++ code produced by gperf version 2.8 (ACE version) */
+/* Command-line: C:\ACE\latest\ACE_wrappers\bin\gperf.exe -m -M -J -c -C -D -E -T -f 0 -F 0,0 -a -o -t -p -K opname -L C++ -Z TAO_CORBA_ExtLocalInterfaceDef_Perfect_Hash_OpTable -N lookup */
+unsigned int
+TAO_CORBA_ExtLocalInterfaceDef_Perfect_Hash_OpTable::hash (const char *str, unsigned int len)
+{
+ static const unsigned char asso_values[] =
+ {
+#if defined (ACE_MVS)
+ 74, 74, 74, 74, 74, 74, 74, 74, 74, 74,
+ 74, 74, 74, 74, 74, 74, 74, 74, 74, 74,
+ 74, 74, 74, 74, 74, 74, 74, 74, 74, 74,
+ 74, 74, 74, 74, 74, 74, 74, 74, 74, 74,
+ 74, 74, 74, 74, 74, 74, 74, 74, 74, 74,
+ 74, 74, 74, 74, 74, 74, 74, 74, 74, 74,
+ 74, 74, 74, 74, 74, 74, 74, 74, 74, 74,
+ 74, 74, 74, 74, 74, 74, 74, 74, 74, 74,
+ 74, 74, 74, 74, 74, 74, 74, 74, 74, 74,
+ 74, 74, 74, 74, 74, 74, 74, 74, 74, 74,
+ 74, 74, 74, 74, 74, 74, 74, 74, 74, 30,
+ 74, 74, 74, 74, 74, 74, 74, 74, 74, 74,
+ 74, 74, 74, 74, 74, 74, 74, 74, 74, 0,
+ 74, 0, 20, 0, 74, 74, 74, 5, 74, 74,
+ 74, 74, 74, 74, 74, 74, 74, 15, 0, 5,
+ 74, 15, 74, 74, 74, 74, 74, 74, 74, 74,
+ 74, 74, 15, 30, 74, 74, 74, 15, 5, 74,
+ 74, 74, 74, 74, 74, 74, 74, 74, 74, 74,
+ 74, 74, 74, 74, 74, 74, 74, 74, 74, 74,
+ 74, 74, 74, 74, 74, 74, 74, 74, 74, 74,
+ 74, 74, 74, 74, 74, 74, 74, 74, 74, 74,
+ 74, 74, 74, 74, 74, 74, 74, 74, 74, 74,
+ 74, 74, 74, 74, 74, 74, 74, 74, 74, 74,
+ 74, 74, 74, 74, 74, 74, 74, 74, 74, 74,
+ 74, 74, 74, 74, 74, 74, 74, 74, 74, 74,
+ 74, 74, 74, 74, 74, 74,
+#else
+ 74, 74, 74, 74, 74, 74, 74, 74, 74, 74,
+ 74, 74, 74, 74, 74, 74, 74, 74, 74, 74,
+ 74, 74, 74, 74, 74, 74, 74, 74, 74, 74,
+ 74, 74, 74, 74, 74, 74, 74, 74, 74, 74,
+ 74, 74, 74, 74, 74, 74, 74, 74, 74, 74,
+ 74, 74, 74, 74, 74, 74, 74, 74, 74, 74,
+ 74, 74, 74, 74, 74, 74, 74, 74, 74, 74,
+ 74, 74, 74, 74, 74, 74, 74, 74, 74, 74,
+ 74, 74, 74, 74, 74, 74, 74, 74, 74, 74,
+ 74, 74, 74, 74, 74, 30, 74, 0, 74, 0,
+ 20, 0, 74, 74, 74, 5, 74, 74, 15, 0,
+ 5, 74, 15, 74, 74, 15, 30, 74, 74, 74,
+ 15, 5, 74, 74, 74, 74, 74, 74,
+#endif /* ACE_MVS */
+ };
+ return len + asso_values[(int) str[len - 1]] + asso_values[(int) str[0]];
+}
+
+const TAO_operation_db_entry *
+TAO_CORBA_ExtLocalInterfaceDef_Perfect_Hash_OpTable::lookup (const char *str, unsigned int len)
+{
+ enum
+ {
+ TOTAL_KEYWORDS = 45,
+ MIN_WORD_LENGTH = 4,
+ MAX_WORD_LENGTH = 26,
+ MIN_HASH_VALUE = 4,
+ MAX_HASH_VALUE = 73,
+ HASH_VALUE_RANGE = 70,
+ DUPLICATES = 10,
+ WORDLIST_SIZE = 49
+ };
+
+ static const TAO_operation_db_entry wordlist[] =
+ {
+ {"",0,0},{"",0,0},{"",0,0},{"",0,0},
+ {"move", &POA_CORBA::ExtLocalInterfaceDef::move_skel, 0},
+ {"is_a", &POA_CORBA::ExtLocalInterfaceDef::is_a_skel, 0},
+ {"create_enum", &POA_CORBA::ExtLocalInterfaceDef::create_enum_skel, 0},
+ {"create_value", &POA_CORBA::ExtLocalInterfaceDef::create_value_skel, 0},
+ {"create_module", &POA_CORBA::ExtLocalInterfaceDef::create_module_skel, 0},
+ {"create_native", &POA_CORBA::ExtLocalInterfaceDef::create_native_skel, 0},
+ {"create_interface", &POA_CORBA::ExtLocalInterfaceDef::create_interface_skel, 0},
+ {"create_attribute", &POA_CORBA::ExtLocalInterfaceDef::create_attribute_skel, 0},
+ {"create_ext_value", &POA_CORBA::ExtLocalInterfaceDef::create_ext_value_skel, 0},
+ {"create_union", &POA_CORBA::ExtLocalInterfaceDef::create_union_skel, 0},
+ {"create_ext_attribute", &POA_CORBA::ExtLocalInterfaceDef::create_ext_attribute_skel, 0},
+ {"create_exception", &POA_CORBA::ExtLocalInterfaceDef::create_exception_skel, 0},
+ {"create_operation", &POA_CORBA::ExtLocalInterfaceDef::create_operation_skel, 0},
+ {"create_local_interface", &POA_CORBA::ExtLocalInterfaceDef::create_local_interface_skel, 0},
+ {"contents", &POA_CORBA::ExtLocalInterfaceDef::contents_skel, 0},
+ {"create_abstract_interface", &POA_CORBA::ExtLocalInterfaceDef::create_abstract_interface_skel, 0},
+ {"lookup_name", &POA_CORBA::ExtLocalInterfaceDef::lookup_name_skel, 0},
+ {"create_alias", &POA_CORBA::ExtLocalInterfaceDef::create_alias_skel, 0},
+ {"describe", &POA_CORBA::ExtLocalInterfaceDef::describe_skel, 0},
+ {"create_value_box", &POA_CORBA::ExtLocalInterfaceDef::create_value_box_skel, 0},
+ {"destroy", &POA_CORBA::ExtLocalInterfaceDef::destroy_skel, 0},
+ {"_is_a", &POA_CORBA::ExtLocalInterfaceDef::_is_a_skel, 0},
+ {"lookup", &POA_CORBA::ExtLocalInterfaceDef::lookup_skel, 0},
+ {"describe_interface", &POA_CORBA::ExtLocalInterfaceDef::describe_interface_skel, 0},
+ {"_get_name", &POA_CORBA::ExtLocalInterfaceDef::_get_name_skel, 0},
+ {"_get_type", &POA_CORBA::ExtLocalInterfaceDef::_get_type_skel, 0},
+ {"_set_name", &POA_CORBA::ExtLocalInterfaceDef::_set_name_skel, 0},
+ {"_interface", &POA_CORBA::ExtLocalInterfaceDef::_interface_skel, 0},
+ {"describe_ext_interface", &POA_CORBA::ExtLocalInterfaceDef::describe_ext_interface_skel, 0},
+ {"create_struct", &POA_CORBA::ExtLocalInterfaceDef::create_struct_skel, 0},
+ {"create_constant", &POA_CORBA::ExtLocalInterfaceDef::create_constant_skel, 0},
+ {"_get_version", &POA_CORBA::ExtLocalInterfaceDef::_get_version_skel, 0},
+ {"_set_version", &POA_CORBA::ExtLocalInterfaceDef::_set_version_skel, 0},
+ {"_get_absolute_name", &POA_CORBA::ExtLocalInterfaceDef::_get_absolute_name_skel, 0},
+ {"_get_defined_in", &POA_CORBA::ExtLocalInterfaceDef::_get_defined_in_skel, 0},
+ {"describe_contents", &POA_CORBA::ExtLocalInterfaceDef::describe_contents_skel, 0},
+ {"_get_id", &POA_CORBA::ExtLocalInterfaceDef::_get_id_skel, 0},
+ {"_set_id", &POA_CORBA::ExtLocalInterfaceDef::_set_id_skel, 0},
+ {"_get_containing_repository", &POA_CORBA::ExtLocalInterfaceDef::_get_containing_repository_skel, 0},
+ {"_get_def_kind", &POA_CORBA::ExtLocalInterfaceDef::_get_def_kind_skel, 0},
+ {"_repository_id", &POA_CORBA::ExtLocalInterfaceDef::_repository_id_skel, 0},
+ {"_get_base_interfaces", &POA_CORBA::ExtLocalInterfaceDef::_get_base_interfaces_skel, 0},
+ {"_set_base_interfaces", &POA_CORBA::ExtLocalInterfaceDef::_set_base_interfaces_skel, 0},
+ {"_component", &POA_CORBA::ExtLocalInterfaceDef::_component_skel, 0},
+ {"_non_existent", &POA_CORBA::ExtLocalInterfaceDef::_non_existent_skel, 0},
+ };
+
+ static const signed char lookup[] =
+ {
+ -1, -1, -1, -1, 4, -1, -1, -8, -2, 5, -1, 6, 7, -79,
+ -10, -3, -75, 13, -15, -2, 14, -76, 17, 18, -1, 19, 20, 21,
+ 22, -28, -3, 23, 24, -35, -2, 25, 26, -1, 27, -83, 31, -1,
+ 32, 33, -1, 34, -1, -87, 37, -1, 38, -1, 39, -1, -1, -40,
+ -2, -75, -1, -45, -2, 42, -1, 43, 44, -79, -1, -1, -1, -1,
+ 47, -1, -1, 48,
+ };
+
+ if (len <= MAX_WORD_LENGTH && len >= MIN_WORD_LENGTH)
+ {
+ unsigned int key = hash (str, len);
+
+ if (key <= MAX_HASH_VALUE && key >= MIN_HASH_VALUE)
+ {
+ int slot = lookup[key];
+
+ if (slot >= 0 && slot < WORDLIST_SIZE)
+ {
+ const char *s = wordlist[slot].opname;
+
+ if (*str == *s && !strncmp (str + 1, s + 1, len - 1))
+ return &wordlist[slot];
+ }
+ else if (slot < 0 && slot >= -MAX_HASH_VALUE)
+ return 0;
+ else
+ {
+ unsigned int offset = key + slot + (slot > 0 ? -MAX_HASH_VALUE : MAX_HASH_VALUE);
+ const TAO_operation_db_entry *base = &wordlist[-lookup[offset]];
+ const TAO_operation_db_entry *ptr = base + -lookup[offset + 1];
+
+ while (--ptr >= base)
+ if (*str == *ptr->opname && !strncmp (str + 1, ptr->opname + 1, len - 1))
+ return ptr;
+ }
+ }
+ }
+ return 0;
+}
+
+static TAO_CORBA_ExtLocalInterfaceDef_Perfect_Hash_OpTable tao_CORBA_ExtLocalInterfaceDef_optable;
+
+// TAO_IDL - Generated from
+// be\be_visitor_interface/interface_ss.cpp:966
+
+TAO::Collocation_Proxy_Broker *
+CORBA__TAO_ExtLocalInterfaceDef_Proxy_Broker_Factory_function ( ::CORBA::Object_ptr)
+{
+ return reinterpret_cast<TAO::Collocation_Proxy_Broker *> (0xdead); // Dummy
+}
+
+int
+CORBA__TAO_ExtLocalInterfaceDef_Proxy_Broker_Factory_Initializer (size_t)
+{
+ CORBA__TAO_ExtLocalInterfaceDef_Proxy_Broker_Factory_function_pointer =
+ CORBA__TAO_ExtLocalInterfaceDef_Proxy_Broker_Factory_function;
+
+ return 0;
+}
+
+static int
+CORBA__TAO_ExtLocalInterfaceDef_Proxy_Broker_Stub_Factory_Initializer_Scarecrow =
+ CORBA__TAO_ExtLocalInterfaceDef_Proxy_Broker_Factory_Initializer (
+ reinterpret_cast<size_t> (CORBA__TAO_ExtLocalInterfaceDef_Proxy_Broker_Factory_Initializer)
+ );
+
+// TAO_IDL - Generated from
+// be\be_visitor_interface/interface_ss.cpp:103
+
+POA_CORBA::ExtLocalInterfaceDef::ExtLocalInterfaceDef (void)
+ : TAO_ServantBase ()
+{
+ this->optable_ = &tao_CORBA_ExtLocalInterfaceDef_optable;
+}
+
+POA_CORBA::ExtLocalInterfaceDef::ExtLocalInterfaceDef (const ExtLocalInterfaceDef& rhs)
+ : TAO_Abstract_ServantBase (rhs),
+ TAO_ServantBase (rhs),
+ POA_CORBA::IRObject (rhs),
+ POA_CORBA::Container (rhs),
+ POA_CORBA::Contained (rhs),
+ POA_CORBA::IDLType (rhs),
+ POA_CORBA::InterfaceDef (rhs),
+ POA_CORBA::LocalInterfaceDef (rhs),
+ POA_CORBA::InterfaceAttrExtension (rhs)
+{
+}
+
+POA_CORBA::ExtLocalInterfaceDef::~ExtLocalInterfaceDef (void)
+{
+}
+
+// TAO_IDL - Generated from
+// be\be_visitor_interface/interface_ss.cpp:169
+
+namespace POA_CORBA
+{
+
+
+ // TAO_IDL - Generated from
+ // be\be_visitor_operation/upcall_command_ss.cpp:127
+
+ class _is_a_ExtLocalInterfaceDef_Upcall_Command
+ : public TAO::Upcall_Command
+ {
+ public:
+ inline _is_a_ExtLocalInterfaceDef_Upcall_Command (
+ POA_CORBA::ExtLocalInterfaceDef * servant,
+ TAO_Operation_Details const * operation_details,
+ TAO::Argument * const args[])
+ : servant_ (servant)
+ , operation_details_ (operation_details)
+ , args_ (args)
+ {
+ }
+
+ virtual void execute (ACE_ENV_SINGLE_ARG_DECL)
+ {
+ TAO::SArg_Traits< ::ACE_InputCDR::to_boolean>::ret_arg_type retval =
+ TAO::Portable_Server::get_ret_arg< ::ACE_InputCDR::to_boolean> (
+ this->operation_details_,
+ this->args_);
+
+ TAO::SArg_Traits< ::CORBA::Char *>::in_arg_type arg_1 =
+ TAO::Portable_Server::get_in_arg< ::CORBA::Char *> (
+ this->operation_details_,
+ this->args_,
+ 1);
+
+ retval =
+ this->servant_-> _is_a (
+ arg_1
+ ACE_ENV_ARG_PARAMETER);
+ ACE_CHECK;
+ }
+
+ private:
+ POA_CORBA::ExtLocalInterfaceDef * const servant_;
+ TAO_Operation_Details const * const operation_details_;
+ TAO::Argument * const * const args_;
+ };
+}
+
+
+void POA_CORBA::ExtLocalInterfaceDef::_is_a_skel (
+ TAO_ServerRequest & server_request,
+ void * TAO_INTERCEPTOR (servant_upcall),
+ void * servant
+ ACE_ENV_ARG_DECL
+ )
+{
+#if TAO_HAS_INTERCEPTORS == 1
+ static ::CORBA::TypeCode_ptr const * const exceptions = 0;
+ static ::CORBA::ULong const nexceptions = 0;
+#endif /* TAO_HAS_INTERCEPTORS */
+
+ TAO::SArg_Traits< ::ACE_InputCDR::to_boolean>::ret_val retval;
+ TAO::SArg_Traits< ::CORBA::Char *>::in_arg_val _tao_repository_id;
+
+ TAO::Argument * const args[] =
+ {
+ &retval,
+ &_tao_repository_id
+ };
+
+ static size_t const nargs = 2;
+
+ POA_CORBA::ExtLocalInterfaceDef * const impl =
+ static_cast<POA_CORBA::ExtLocalInterfaceDef *> (servant);
+
+ _is_a_ExtLocalInterfaceDef_Upcall_Command command (
+ impl,
+ server_request.operation_details (),
+ args);
+
+ TAO::Upcall_Wrapper upcall_wrapper;
+ upcall_wrapper.upcall (server_request
+ , args
+ , nargs
+ , command
+#if TAO_HAS_INTERCEPTORS == 1
+ , servant_upcall
+ , exceptions
+ , nexceptions
+#endif /* TAO_HAS_INTERCEPTORS == 1 */
+ ACE_ENV_ARG_PARAMETER);
+ ACE_CHECK;
+}namespace POA_CORBA
+{
+
+
+ // TAO_IDL - Generated from
+ // be\be_visitor_operation/upcall_command_ss.cpp:127
+
+ class _non_existent_ExtLocalInterfaceDef_Upcall_Command
+ : public TAO::Upcall_Command
+ {
+ public:
+ inline _non_existent_ExtLocalInterfaceDef_Upcall_Command (
+ POA_CORBA::ExtLocalInterfaceDef * servant,
+ TAO_Operation_Details const * operation_details,
+ TAO::Argument * const args[])
+ : servant_ (servant)
+ , operation_details_ (operation_details)
+ , args_ (args)
+ {
+ }
+
+ virtual void execute (ACE_ENV_SINGLE_ARG_DECL)
+ {
+ TAO::SArg_Traits< ::ACE_InputCDR::to_boolean>::ret_arg_type retval =
+ TAO::Portable_Server::get_ret_arg< ::ACE_InputCDR::to_boolean> (
+ this->operation_details_,
+ this->args_);
+
+ retval =
+ this->servant_-> _non_existent (
+ ACE_ENV_SINGLE_ARG_PARAMETER);
+ ACE_CHECK;
+ }
+
+ private:
+ POA_CORBA::ExtLocalInterfaceDef * const servant_;
+ TAO_Operation_Details const * const operation_details_;
+ TAO::Argument * const * const args_;
+ };
+}
+
+
+void POA_CORBA::ExtLocalInterfaceDef::_non_existent_skel (
+ TAO_ServerRequest & server_request,
+ void * TAO_INTERCEPTOR (servant_upcall),
+ void * servant
+ ACE_ENV_ARG_DECL
+ )
+{
+#if TAO_HAS_INTERCEPTORS == 1
+ static ::CORBA::TypeCode_ptr const * const exceptions = 0;
+ static ::CORBA::ULong const nexceptions = 0;
+#endif /* TAO_HAS_INTERCEPTORS */
+
+ TAO::SArg_Traits< ::ACE_InputCDR::to_boolean>::ret_val retval;
+
+ TAO::Argument * const args[] =
+ {
+ &retval
+ };
+
+ static size_t const nargs = 1;
+
+ POA_CORBA::ExtLocalInterfaceDef * const impl =
+ static_cast<POA_CORBA::ExtLocalInterfaceDef *> (servant);
+
+ _non_existent_ExtLocalInterfaceDef_Upcall_Command command (
+ impl,
+ server_request.operation_details (),
+ args);
+
+ TAO::Upcall_Wrapper upcall_wrapper;
+ upcall_wrapper.upcall (server_request
+ , args
+ , nargs
+ , command
+#if TAO_HAS_INTERCEPTORS == 1
+ , servant_upcall
+ , exceptions
+ , nexceptions
+#endif /* TAO_HAS_INTERCEPTORS == 1 */
+ ACE_ENV_ARG_PARAMETER);
+ ACE_CHECK;
+}namespace POA_CORBA
+{
+
+
+ // TAO_IDL - Generated from
+ // be\be_visitor_operation/upcall_command_ss.cpp:127
+
+ class _repository_id_ExtLocalInterfaceDef_Upcall_Command
+ : public TAO::Upcall_Command
+ {
+ public:
+ inline _repository_id_ExtLocalInterfaceDef_Upcall_Command (
+ POA_CORBA::ExtLocalInterfaceDef * servant,
+ TAO_Operation_Details const * operation_details,
+ TAO::Argument * const args[])
+ : servant_ (servant)
+ , operation_details_ (operation_details)
+ , args_ (args)
+ {
+ }
+
+ virtual void execute (ACE_ENV_SINGLE_ARG_DECL)
+ {
+ TAO::SArg_Traits< ::CORBA::Char *>::ret_arg_type retval =
+ TAO::Portable_Server::get_ret_arg< ::CORBA::Char *> (
+ this->operation_details_,
+ this->args_);
+
+ retval =
+ this->servant_-> _repository_id (
+ ACE_ENV_SINGLE_ARG_PARAMETER);
+ ACE_CHECK;
+ }
+
+ private:
+ POA_CORBA::ExtLocalInterfaceDef * const servant_;
+ TAO_Operation_Details const * const operation_details_;
+ TAO::Argument * const * const args_;
+ };
+}
+
+
+void POA_CORBA::ExtLocalInterfaceDef::_repository_id_skel (
+ TAO_ServerRequest & server_request,
+ void * TAO_INTERCEPTOR (servant_upcall),
+ void * servant
+ ACE_ENV_ARG_DECL
+ )
+{
+#if TAO_HAS_INTERCEPTORS == 1
+ static ::CORBA::TypeCode_ptr const * const exceptions = 0;
+ static ::CORBA::ULong const nexceptions = 0;
+#endif /* TAO_HAS_INTERCEPTORS */
+
+ TAO::SArg_Traits< ::CORBA::Char *>::ret_val retval;
+
+ TAO::Argument * const args[] =
+ {
+ &retval
+ };
+
+ static size_t const nargs = 1;
+
+ POA_CORBA::ExtLocalInterfaceDef * const impl =
+ static_cast<POA_CORBA::ExtLocalInterfaceDef *> (servant);
+
+ _repository_id_ExtLocalInterfaceDef_Upcall_Command command (
+ impl,
+ server_request.operation_details (),
+ args);
+
+ TAO::Upcall_Wrapper upcall_wrapper;
+ upcall_wrapper.upcall (server_request
+ , args
+ , nargs
+ , command
+#if TAO_HAS_INTERCEPTORS == 1
+ , servant_upcall
+ , exceptions
+ , nexceptions
+#endif /* TAO_HAS_INTERCEPTORS == 1 */
+ ACE_ENV_ARG_PARAMETER);
+ ACE_CHECK;
+}
+
+// TAO_IDL - Generated from
+// be\be_visitor_interface/interface_ss.cpp:513
+
+void POA_CORBA::ExtLocalInterfaceDef::_interface_skel (
+ TAO_ServerRequest & server_request,
+ void * /* servant_upcall */,
+ void * servant
+ ACE_ENV_ARG_DECL
+ )
+{
+ TAO_IFR_Client_Adapter *_tao_adapter =
+ ACE_Dynamic_Service<TAO_IFR_Client_Adapter>::instance (
+ TAO_ORB_Core::ifr_client_adapter_name ()
+ );
+
+ if (_tao_adapter == 0)
+ {
+ ACE_THROW ( ::CORBA::INTF_REPOS ( ::CORBA::OMGVMCID | 1,
+ ::CORBA::COMPLETED_NO));
+ }
+
+ POA_CORBA::ExtLocalInterfaceDef * const impl =
+ static_cast<POA_CORBA::ExtLocalInterfaceDef *> (servant);
+ ::CORBA::InterfaceDef_ptr _tao_retval =
+ impl->_get_interface (ACE_ENV_SINGLE_ARG_PARAMETER);
+ ACE_CHECK;
+
+ server_request.init_reply ();
+ TAO_OutputCDR &_tao_out = *server_request.outgoing ();
+
+ ::CORBA::Boolean const _tao_result =
+ _tao_adapter->interfacedef_cdr_insert (
+ _tao_out,
+ _tao_retval
+ );
+
+ _tao_adapter->dispose (_tao_retval);
+
+ if (_tao_result == false)
+ {
+ ACE_THROW ( ::CORBA::MARSHAL ());
+ }
+}namespace POA_CORBA
+{
+
+
+ // TAO_IDL - Generated from
+ // be\be_visitor_operation/upcall_command_ss.cpp:127
+
+ class _get_component_ExtLocalInterfaceDef_Upcall_Command
+ : public TAO::Upcall_Command
+ {
+ public:
+ inline _get_component_ExtLocalInterfaceDef_Upcall_Command (
+ POA_CORBA::ExtLocalInterfaceDef * servant,
+ TAO_Operation_Details const * operation_details,
+ TAO::Argument * const args[])
+ : servant_ (servant)
+ , operation_details_ (operation_details)
+ , args_ (args)
+ {
+ }
+
+ virtual void execute (ACE_ENV_SINGLE_ARG_DECL)
+ {
+ TAO::SArg_Traits< ::CORBA::Object>::ret_arg_type retval =
+ TAO::Portable_Server::get_ret_arg< ::CORBA::Object> (
+ this->operation_details_,
+ this->args_);
+
+ retval =
+ this->servant_-> _get_component (
+ ACE_ENV_SINGLE_ARG_PARAMETER);
+ ACE_CHECK;
+ }
+
+ private:
+ POA_CORBA::ExtLocalInterfaceDef * const servant_;
+ TAO_Operation_Details const * const operation_details_;
+ TAO::Argument * const * const args_;
+ };
+}
+
+
+void POA_CORBA::ExtLocalInterfaceDef::_component_skel (
+ TAO_ServerRequest & server_request,
+ void * TAO_INTERCEPTOR (servant_upcall),
+ void * servant
+ ACE_ENV_ARG_DECL
+ )
+{
+#if TAO_HAS_INTERCEPTORS == 1
+ static ::CORBA::TypeCode_ptr const * const exceptions = 0;
+ static ::CORBA::ULong const nexceptions = 0;
+#endif /* TAO_HAS_INTERCEPTORS */
+
+ TAO::SArg_Traits< ::CORBA::Object>::ret_val retval;
+
+ TAO::Argument * const args[] =
+ {
+ &retval
+ };
+
+ static size_t const nargs = 1;
+
+ POA_CORBA::ExtLocalInterfaceDef * const impl =
+ static_cast<POA_CORBA::ExtLocalInterfaceDef *> (servant);
+
+ _get_component_ExtLocalInterfaceDef_Upcall_Command command (
+ impl,
+ server_request.operation_details (),
+ args);
+
+ TAO::Upcall_Wrapper upcall_wrapper;
+ upcall_wrapper.upcall (server_request
+ , args
+ , nargs
+ , command
+#if TAO_HAS_INTERCEPTORS == 1
+ , servant_upcall
+ , exceptions
+ , nexceptions
+#endif /* TAO_HAS_INTERCEPTORS == 1 */
+ ACE_ENV_ARG_PARAMETER);
+ ACE_CHECK;
+}
+
+::CORBA::Boolean POA_CORBA::ExtLocalInterfaceDef::_is_a (
+ const char* value
+ ACE_ENV_ARG_DECL_NOT_USED
+ )
+{
+ return
+ (
+ !ACE_OS::strcmp (
+ value,
+ "IDL:omg.org/CORBA/IRObject:1.0"
+ ) ||
+ !ACE_OS::strcmp (
+ value,
+ "IDL:omg.org/CORBA/Container:1.0"
+ ) ||
+ !ACE_OS::strcmp (
+ value,
+ "IDL:omg.org/CORBA/Contained:1.0"
+ ) ||
+ !ACE_OS::strcmp (
+ value,
+ "IDL:omg.org/CORBA/IDLType:1.0"
+ ) ||
+ !ACE_OS::strcmp (
+ value,
+ "IDL:omg.org/CORBA/InterfaceDef:1.0"
+ ) ||
+ !ACE_OS::strcmp (
+ value,
+ "IDL:omg.org/CORBA/LocalInterfaceDef:1.0"
+ ) ||
+ !ACE_OS::strcmp (
+ value,
+ "IDL:omg.org/CORBA/InterfaceAttrExtension:1.0"
+ ) ||
+ !ACE_OS::strcmp (
+ value,
+ "IDL:omg.org/CORBA/ExtLocalInterfaceDef:1.0"
+ ) ||
+ !ACE_OS::strcmp (
+ value,
+ "IDL:omg.org/CORBA/Object:1.0"
+ )
+ );
+}
+
+const char* POA_CORBA::ExtLocalInterfaceDef::_interface_repository_id (void) const
+{
+ return "IDL:omg.org/CORBA/ExtLocalInterfaceDef:1.0";
+}
+
+// TAO_IDL - Generated from
+// be\be_visitor_interface/interface_ss.cpp:903
+
+void POA_CORBA::ExtLocalInterfaceDef::_dispatch (
+ TAO_ServerRequest & req,
+ void * servant_upcall
+ ACE_ENV_ARG_DECL
+ )
+{
+ this->synchronous_upcall_dispatch (req,
+ servant_upcall,
+ this
+ ACE_ENV_ARG_PARAMETER);
+}
+
+// TAO_IDL - Generated from
+// be\be_visitor_interface/interface_ss.cpp:851
+
+CORBA::ExtLocalInterfaceDef *
+POA_CORBA::ExtLocalInterfaceDef::_this (ACE_ENV_SINGLE_ARG_DECL)
+{
+ TAO_Stub *stub = this->_create_stub (ACE_ENV_SINGLE_ARG_PARAMETER);
+ ACE_CHECK_RETURN (0);
+
+ TAO_Stub_Auto_Ptr safe_stub (stub);
+ ::CORBA::Object_ptr tmp = CORBA::Object::_nil ();
+
+ ::CORBA::Boolean const _tao_opt_colloc =
+ stub->servant_orb_var ()->orb_core ()->optimize_collocation_objects ();
+
+ ACE_NEW_RETURN (
+ tmp,
+ ::CORBA::Object (stub, _tao_opt_colloc, this),
+ 0
+ );
+
+ ::CORBA::Object_var obj = tmp;
+ (void) safe_stub.release ();
+
+ typedef ::CORBA::ExtLocalInterfaceDef STUB_SCOPED_NAME;
+ return
+ TAO::Narrow_Utils<STUB_SCOPED_NAME>::unchecked_narrow (
+ obj.in (),
+ CORBA__TAO_ExtLocalInterfaceDef_Proxy_Broker_Factory_function_pointer
+ );
+}
+
+TAO_END_VERSIONED_NAMESPACE_DECL
+
+
+
+#endif /* ifndef */
+
diff --git a/TAO/orbsvcs/orbsvcs/IFRService/IFR_BasicS.h b/TAO/orbsvcs/orbsvcs/IFRService/IFR_BasicS.h
new file mode 100644
index 00000000000..4082020639a
--- /dev/null
+++ b/TAO/orbsvcs/orbsvcs/IFRService/IFR_BasicS.h
@@ -0,0 +1,7898 @@
+// -*- C++ -*-
+//
+// $Id$
+
+// **** Code generated by the The ACE ORB (TAO) IDL Compiler ****
+// TAO and the TAO IDL Compiler have been developed by:
+// Center for Distributed Object Computing
+// Washington University
+// St. Louis, MO
+// USA
+// http://www.cs.wustl.edu/~schmidt/doc-center.html
+// and
+// Distributed Object Computing Laboratory
+// University of California at Irvine
+// Irvine, CA
+// USA
+// http://doc.ece.uci.edu/
+// and
+// Institute for Software Integrated Systems
+// Vanderbilt University
+// Nashville, TN
+// USA
+// http://www.isis.vanderbilt.edu/
+//
+// Information about TAO is available at:
+// http://www.cs.wustl.edu/~schmidt/TAO.html
+
+// TAO_IDL - Generated from
+// be\be_codegen.cpp:409
+
+#ifndef _TAO_IDL____ORBSVCS_ORBSVCS_IFRSERVICE_IFR_BASICS_H_
+#define _TAO_IDL____ORBSVCS_ORBSVCS_IFRSERVICE_IFR_BASICS_H_
+
+#include /**/ "ace/pre.h"
+
+#include "tao/IFR_Client/IFR_BasicC.h"
+#include "orbsvcs/IFRService/IFR_BaseS.h"
+#include "tao/ParameterModeS.h"
+
+#if !defined (ACE_LACKS_PRAGMA_ONCE)
+# pragma once
+#endif /* ACE_LACKS_PRAGMA_ONCE */
+
+#include "tao/Collocation_Proxy_Broker.h"
+#include "tao/PortableServer/PortableServer.h"
+#include "tao/PortableServer/Servant_Base.h"
+
+TAO_BEGIN_VERSIONED_NAMESPACE_DECL
+
+
+
+// TAO_IDL - Generated from
+// be\be_visitor_module/module_sh.cpp:49
+
+namespace POA_CORBA
+{
+
+
+ // TAO_IDL - Generated from
+ // be\be_visitor_interface/interface_sh.cpp:87
+
+ class Repository;
+ typedef Repository *Repository_ptr;
+
+ class Repository
+ : public virtual POA_CORBA::Container
+ {
+ protected:
+ Repository (void);
+
+ public:
+ // Useful for template programming.
+ typedef ::CORBA::Repository _stub_type;
+ typedef ::CORBA::Repository_ptr _stub_ptr_type;
+ typedef ::CORBA::Repository_var _stub_var_type;
+
+ Repository (const Repository& rhs);
+ virtual ~Repository (void);
+
+ virtual ::CORBA::Boolean _is_a (
+ const char* logical_type_id
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS
+ );
+
+ static void _is_a_skel (
+ TAO_ServerRequest & req,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL
+ );
+
+ static void _non_existent_skel (
+ TAO_ServerRequest & req,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL
+ );
+
+ static void _interface_skel (
+ TAO_ServerRequest & req,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL
+ );
+
+ static void _component_skel (
+ TAO_ServerRequest & req,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL
+ );
+
+ static void _repository_id_skel (
+ TAO_ServerRequest & req,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL
+ );
+
+ virtual void _dispatch (
+ TAO_ServerRequest & req,
+ void * servant_upcall
+ ACE_ENV_ARG_DECL
+ );
+
+ ::CORBA::Repository *_this (
+
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS
+ );
+
+ virtual const char* _interface_repository_id (void) const;
+
+ // TAO_IDL - Generated from
+ // be\be_visitor_operation/operation_sh.cpp:45
+
+ virtual ::CORBA::Contained_ptr lookup_id (
+ const char * search_id
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ )) = 0;
+
+ static void lookup_id_skel (
+ TAO_ServerRequest & server_request,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL
+ );
+
+ // TAO_IDL - Generated from
+ // be\be_visitor_operation/operation_sh.cpp:45
+
+ virtual ::CORBA::TypeCode_ptr get_canonical_typecode (
+ ::CORBA::TypeCode_ptr tc
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ )) = 0;
+
+ static void get_canonical_typecode_skel (
+ TAO_ServerRequest & server_request,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL
+ );
+
+ // TAO_IDL - Generated from
+ // be\be_visitor_operation/operation_sh.cpp:45
+
+ virtual ::CORBA::PrimitiveDef_ptr get_primitive (
+ ::CORBA::PrimitiveKind kind
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ )) = 0;
+
+ static void get_primitive_skel (
+ TAO_ServerRequest & server_request,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL
+ );
+
+ // TAO_IDL - Generated from
+ // be\be_visitor_operation/operation_sh.cpp:45
+
+ virtual ::CORBA::StringDef_ptr create_string (
+ ::CORBA::ULong bound
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ )) = 0;
+
+ static void create_string_skel (
+ TAO_ServerRequest & server_request,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL
+ );
+
+ // TAO_IDL - Generated from
+ // be\be_visitor_operation/operation_sh.cpp:45
+
+ virtual ::CORBA::WstringDef_ptr create_wstring (
+ ::CORBA::ULong bound
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ )) = 0;
+
+ static void create_wstring_skel (
+ TAO_ServerRequest & server_request,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL
+ );
+
+ // TAO_IDL - Generated from
+ // be\be_visitor_operation/operation_sh.cpp:45
+
+ virtual ::CORBA::SequenceDef_ptr create_sequence (
+ ::CORBA::ULong bound,
+ ::CORBA::IDLType_ptr element_type
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ )) = 0;
+
+ static void create_sequence_skel (
+ TAO_ServerRequest & server_request,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL
+ );
+
+ // TAO_IDL - Generated from
+ // be\be_visitor_operation/operation_sh.cpp:45
+
+ virtual ::CORBA::ArrayDef_ptr create_array (
+ ::CORBA::ULong length,
+ ::CORBA::IDLType_ptr element_type
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ )) = 0;
+
+ static void create_array_skel (
+ TAO_ServerRequest & server_request,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL
+ );
+
+ // TAO_IDL - Generated from
+ // be\be_visitor_operation/operation_sh.cpp:45
+
+ virtual ::CORBA::FixedDef_ptr create_fixed (
+ ::CORBA::UShort digits,
+ ::CORBA::Short scale
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ )) = 0;
+
+ static void create_fixed_skel (
+ TAO_ServerRequest & server_request,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL
+ );
+
+ static void
+ _get_def_kind_skel (
+ TAO_ServerRequest & server_request,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS
+ );
+
+ // TAO_IDL - Generated from
+ // be\be_interface.cpp:1955
+
+ static void
+ destroy_skel (
+ TAO_ServerRequest & server_request,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS
+ );
+
+ // TAO_IDL - Generated from
+ // be\be_interface.cpp:1955
+
+ static void
+ lookup_skel (
+ TAO_ServerRequest & server_request,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS
+ );
+
+ // TAO_IDL - Generated from
+ // be\be_interface.cpp:1955
+
+ static void
+ contents_skel (
+ TAO_ServerRequest & server_request,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS
+ );
+
+ // TAO_IDL - Generated from
+ // be\be_interface.cpp:1955
+
+ static void
+ lookup_name_skel (
+ TAO_ServerRequest & server_request,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS
+ );
+
+ // TAO_IDL - Generated from
+ // be\be_interface.cpp:1955
+
+ static void
+ describe_contents_skel (
+ TAO_ServerRequest & server_request,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS
+ );
+
+ // TAO_IDL - Generated from
+ // be\be_interface.cpp:1955
+
+ static void
+ create_module_skel (
+ TAO_ServerRequest & server_request,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS
+ );
+
+ // TAO_IDL - Generated from
+ // be\be_interface.cpp:1955
+
+ static void
+ create_constant_skel (
+ TAO_ServerRequest & server_request,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS
+ );
+
+ // TAO_IDL - Generated from
+ // be\be_interface.cpp:1955
+
+ static void
+ create_struct_skel (
+ TAO_ServerRequest & server_request,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS
+ );
+
+ // TAO_IDL - Generated from
+ // be\be_interface.cpp:1955
+
+ static void
+ create_union_skel (
+ TAO_ServerRequest & server_request,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS
+ );
+
+ // TAO_IDL - Generated from
+ // be\be_interface.cpp:1955
+
+ static void
+ create_enum_skel (
+ TAO_ServerRequest & server_request,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS
+ );
+
+ // TAO_IDL - Generated from
+ // be\be_interface.cpp:1955
+
+ static void
+ create_alias_skel (
+ TAO_ServerRequest & server_request,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS
+ );
+
+ // TAO_IDL - Generated from
+ // be\be_interface.cpp:1955
+
+ static void
+ create_interface_skel (
+ TAO_ServerRequest & server_request,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS
+ );
+
+ // TAO_IDL - Generated from
+ // be\be_interface.cpp:1955
+
+ static void
+ create_value_skel (
+ TAO_ServerRequest & server_request,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS
+ );
+
+ // TAO_IDL - Generated from
+ // be\be_interface.cpp:1955
+
+ static void
+ create_value_box_skel (
+ TAO_ServerRequest & server_request,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS
+ );
+
+ // TAO_IDL - Generated from
+ // be\be_interface.cpp:1955
+
+ static void
+ create_exception_skel (
+ TAO_ServerRequest & server_request,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS
+ );
+
+ // TAO_IDL - Generated from
+ // be\be_interface.cpp:1955
+
+ static void
+ create_native_skel (
+ TAO_ServerRequest & server_request,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS
+ );
+
+ // TAO_IDL - Generated from
+ // be\be_interface.cpp:1955
+
+ static void
+ create_abstract_interface_skel (
+ TAO_ServerRequest & server_request,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS
+ );
+
+ // TAO_IDL - Generated from
+ // be\be_interface.cpp:1955
+
+ static void
+ create_local_interface_skel (
+ TAO_ServerRequest & server_request,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS
+ );
+
+ // TAO_IDL - Generated from
+ // be\be_interface.cpp:1955
+
+ static void
+ create_ext_value_skel (
+ TAO_ServerRequest & server_request,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS
+ );
+ };
+
+ // TAO_IDL - Generated from
+ // be\be_visitor_interface/interface_sh.cpp:87
+
+ class ModuleDef;
+ typedef ModuleDef *ModuleDef_ptr;
+
+ class ModuleDef
+ : public virtual POA_CORBA::Container,
+ public virtual POA_CORBA::Contained
+ {
+ protected:
+ ModuleDef (void);
+
+ public:
+ // Useful for template programming.
+ typedef ::CORBA::ModuleDef _stub_type;
+ typedef ::CORBA::ModuleDef_ptr _stub_ptr_type;
+ typedef ::CORBA::ModuleDef_var _stub_var_type;
+
+ ModuleDef (const ModuleDef& rhs);
+ virtual ~ModuleDef (void);
+
+ virtual ::CORBA::Boolean _is_a (
+ const char* logical_type_id
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS
+ );
+
+ static void _is_a_skel (
+ TAO_ServerRequest & req,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL
+ );
+
+ static void _non_existent_skel (
+ TAO_ServerRequest & req,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL
+ );
+
+ static void _interface_skel (
+ TAO_ServerRequest & req,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL
+ );
+
+ static void _component_skel (
+ TAO_ServerRequest & req,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL
+ );
+
+ static void _repository_id_skel (
+ TAO_ServerRequest & req,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL
+ );
+
+ virtual void _dispatch (
+ TAO_ServerRequest & req,
+ void * servant_upcall
+ ACE_ENV_ARG_DECL
+ );
+
+ ::CORBA::ModuleDef *_this (
+
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS
+ );
+
+ virtual const char* _interface_repository_id (void) const;
+
+ static void
+ _get_def_kind_skel (
+ TAO_ServerRequest & server_request,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS
+ );
+
+ // TAO_IDL - Generated from
+ // be\be_interface.cpp:1955
+
+ static void
+ destroy_skel (
+ TAO_ServerRequest & server_request,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS
+ );
+
+ // TAO_IDL - Generated from
+ // be\be_interface.cpp:1955
+
+ static void
+ lookup_skel (
+ TAO_ServerRequest & server_request,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS
+ );
+
+ // TAO_IDL - Generated from
+ // be\be_interface.cpp:1955
+
+ static void
+ contents_skel (
+ TAO_ServerRequest & server_request,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS
+ );
+
+ // TAO_IDL - Generated from
+ // be\be_interface.cpp:1955
+
+ static void
+ lookup_name_skel (
+ TAO_ServerRequest & server_request,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS
+ );
+
+ // TAO_IDL - Generated from
+ // be\be_interface.cpp:1955
+
+ static void
+ describe_contents_skel (
+ TAO_ServerRequest & server_request,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS
+ );
+
+ // TAO_IDL - Generated from
+ // be\be_interface.cpp:1955
+
+ static void
+ create_module_skel (
+ TAO_ServerRequest & server_request,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS
+ );
+
+ // TAO_IDL - Generated from
+ // be\be_interface.cpp:1955
+
+ static void
+ create_constant_skel (
+ TAO_ServerRequest & server_request,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS
+ );
+
+ // TAO_IDL - Generated from
+ // be\be_interface.cpp:1955
+
+ static void
+ create_struct_skel (
+ TAO_ServerRequest & server_request,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS
+ );
+
+ // TAO_IDL - Generated from
+ // be\be_interface.cpp:1955
+
+ static void
+ create_union_skel (
+ TAO_ServerRequest & server_request,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS
+ );
+
+ // TAO_IDL - Generated from
+ // be\be_interface.cpp:1955
+
+ static void
+ create_enum_skel (
+ TAO_ServerRequest & server_request,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS
+ );
+
+ // TAO_IDL - Generated from
+ // be\be_interface.cpp:1955
+
+ static void
+ create_alias_skel (
+ TAO_ServerRequest & server_request,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS
+ );
+
+ // TAO_IDL - Generated from
+ // be\be_interface.cpp:1955
+
+ static void
+ create_interface_skel (
+ TAO_ServerRequest & server_request,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS
+ );
+
+ // TAO_IDL - Generated from
+ // be\be_interface.cpp:1955
+
+ static void
+ create_value_skel (
+ TAO_ServerRequest & server_request,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS
+ );
+
+ // TAO_IDL - Generated from
+ // be\be_interface.cpp:1955
+
+ static void
+ create_value_box_skel (
+ TAO_ServerRequest & server_request,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS
+ );
+
+ // TAO_IDL - Generated from
+ // be\be_interface.cpp:1955
+
+ static void
+ create_exception_skel (
+ TAO_ServerRequest & server_request,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS
+ );
+
+ // TAO_IDL - Generated from
+ // be\be_interface.cpp:1955
+
+ static void
+ create_native_skel (
+ TAO_ServerRequest & server_request,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS
+ );
+
+ // TAO_IDL - Generated from
+ // be\be_interface.cpp:1955
+
+ static void
+ create_abstract_interface_skel (
+ TAO_ServerRequest & server_request,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS
+ );
+
+ // TAO_IDL - Generated from
+ // be\be_interface.cpp:1955
+
+ static void
+ create_local_interface_skel (
+ TAO_ServerRequest & server_request,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS
+ );
+
+ // TAO_IDL - Generated from
+ // be\be_interface.cpp:1955
+
+ static void
+ create_ext_value_skel (
+ TAO_ServerRequest & server_request,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS
+ );
+
+ static void
+ _get_id_skel (
+ TAO_ServerRequest & server_request,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS
+ );
+
+ static void
+ _set_id_skel (
+ TAO_ServerRequest & server_request,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS
+ );
+
+ static void
+ _get_name_skel (
+ TAO_ServerRequest & server_request,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS
+ );
+
+ static void
+ _set_name_skel (
+ TAO_ServerRequest & server_request,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS
+ );
+
+ static void
+ _get_version_skel (
+ TAO_ServerRequest & server_request,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS
+ );
+
+ static void
+ _set_version_skel (
+ TAO_ServerRequest & server_request,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS
+ );
+
+ static void
+ _get_defined_in_skel (
+ TAO_ServerRequest & server_request,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS
+ );
+
+ static void
+ _get_absolute_name_skel (
+ TAO_ServerRequest & server_request,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS
+ );
+
+ static void
+ _get_containing_repository_skel (
+ TAO_ServerRequest & server_request,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS
+ );
+
+ // TAO_IDL - Generated from
+ // be\be_interface.cpp:1955
+
+ static void
+ describe_skel (
+ TAO_ServerRequest & server_request,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS
+ );
+
+ // TAO_IDL - Generated from
+ // be\be_interface.cpp:1955
+
+ static void
+ move_skel (
+ TAO_ServerRequest & server_request,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS
+ );
+ };
+
+ // TAO_IDL - Generated from
+ // be\be_visitor_interface/interface_sh.cpp:87
+
+ class ConstantDef;
+ typedef ConstantDef *ConstantDef_ptr;
+
+ class ConstantDef
+ : public virtual POA_CORBA::Contained
+ {
+ protected:
+ ConstantDef (void);
+
+ public:
+ // Useful for template programming.
+ typedef ::CORBA::ConstantDef _stub_type;
+ typedef ::CORBA::ConstantDef_ptr _stub_ptr_type;
+ typedef ::CORBA::ConstantDef_var _stub_var_type;
+
+ ConstantDef (const ConstantDef& rhs);
+ virtual ~ConstantDef (void);
+
+ virtual ::CORBA::Boolean _is_a (
+ const char* logical_type_id
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS
+ );
+
+ static void _is_a_skel (
+ TAO_ServerRequest & req,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL
+ );
+
+ static void _non_existent_skel (
+ TAO_ServerRequest & req,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL
+ );
+
+ static void _interface_skel (
+ TAO_ServerRequest & req,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL
+ );
+
+ static void _component_skel (
+ TAO_ServerRequest & req,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL
+ );
+
+ static void _repository_id_skel (
+ TAO_ServerRequest & req,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL
+ );
+
+ virtual void _dispatch (
+ TAO_ServerRequest & req,
+ void * servant_upcall
+ ACE_ENV_ARG_DECL
+ );
+
+ ::CORBA::ConstantDef *_this (
+
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS
+ );
+
+ virtual const char* _interface_repository_id (void) const;
+
+ // TAO_IDL - Generated from
+ // be\be_visitor_operation/operation_sh.cpp:45
+
+ virtual ::CORBA::TypeCode_ptr type (
+ ACE_ENV_SINGLE_ARG_DECL_WITH_DEFAULTS
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ )) = 0;
+
+ static void _get_type_skel (
+ TAO_ServerRequest & server_request,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL
+ );
+
+ // TAO_IDL - Generated from
+ // be\be_visitor_operation/operation_sh.cpp:45
+
+ virtual ::CORBA::IDLType_ptr type_def (
+ ACE_ENV_SINGLE_ARG_DECL_WITH_DEFAULTS
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ )) = 0;
+
+ static void _get_type_def_skel (
+ TAO_ServerRequest & server_request,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL
+ );
+
+ // TAO_IDL - Generated from
+ // be\be_visitor_operation/operation_sh.cpp:45
+
+ virtual void type_def (
+ ::CORBA::IDLType_ptr type_def
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ )) = 0;
+
+ static void _set_type_def_skel (
+ TAO_ServerRequest & server_request,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL
+ );
+
+ // TAO_IDL - Generated from
+ // be\be_visitor_operation/operation_sh.cpp:45
+
+ virtual ::CORBA::Any * value (
+ ACE_ENV_SINGLE_ARG_DECL_WITH_DEFAULTS
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ )) = 0;
+
+ static void _get_value_skel (
+ TAO_ServerRequest & server_request,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL
+ );
+
+ // TAO_IDL - Generated from
+ // be\be_visitor_operation/operation_sh.cpp:45
+
+ virtual void value (
+ const ::CORBA::Any & value
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ )) = 0;
+
+ static void _set_value_skel (
+ TAO_ServerRequest & server_request,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL
+ );
+
+ static void
+ _get_def_kind_skel (
+ TAO_ServerRequest & server_request,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS
+ );
+
+ // TAO_IDL - Generated from
+ // be\be_interface.cpp:1955
+
+ static void
+ destroy_skel (
+ TAO_ServerRequest & server_request,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS
+ );
+
+ static void
+ _get_id_skel (
+ TAO_ServerRequest & server_request,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS
+ );
+
+ static void
+ _set_id_skel (
+ TAO_ServerRequest & server_request,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS
+ );
+
+ static void
+ _get_name_skel (
+ TAO_ServerRequest & server_request,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS
+ );
+
+ static void
+ _set_name_skel (
+ TAO_ServerRequest & server_request,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS
+ );
+
+ static void
+ _get_version_skel (
+ TAO_ServerRequest & server_request,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS
+ );
+
+ static void
+ _set_version_skel (
+ TAO_ServerRequest & server_request,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS
+ );
+
+ static void
+ _get_defined_in_skel (
+ TAO_ServerRequest & server_request,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS
+ );
+
+ static void
+ _get_absolute_name_skel (
+ TAO_ServerRequest & server_request,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS
+ );
+
+ static void
+ _get_containing_repository_skel (
+ TAO_ServerRequest & server_request,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS
+ );
+
+ // TAO_IDL - Generated from
+ // be\be_interface.cpp:1955
+
+ static void
+ describe_skel (
+ TAO_ServerRequest & server_request,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS
+ );
+
+ // TAO_IDL - Generated from
+ // be\be_interface.cpp:1955
+
+ static void
+ move_skel (
+ TAO_ServerRequest & server_request,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS
+ );
+ };
+
+ // TAO_IDL - Generated from
+ // be\be_visitor_interface/interface_sh.cpp:87
+
+ class StructDef;
+ typedef StructDef *StructDef_ptr;
+
+ class StructDef
+ : public virtual POA_CORBA::TypedefDef,
+ public virtual POA_CORBA::Container
+ {
+ protected:
+ StructDef (void);
+
+ public:
+ // Useful for template programming.
+ typedef ::CORBA::StructDef _stub_type;
+ typedef ::CORBA::StructDef_ptr _stub_ptr_type;
+ typedef ::CORBA::StructDef_var _stub_var_type;
+
+ StructDef (const StructDef& rhs);
+ virtual ~StructDef (void);
+
+ virtual ::CORBA::Boolean _is_a (
+ const char* logical_type_id
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS
+ );
+
+ static void _is_a_skel (
+ TAO_ServerRequest & req,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL
+ );
+
+ static void _non_existent_skel (
+ TAO_ServerRequest & req,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL
+ );
+
+ static void _interface_skel (
+ TAO_ServerRequest & req,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL
+ );
+
+ static void _component_skel (
+ TAO_ServerRequest & req,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL
+ );
+
+ static void _repository_id_skel (
+ TAO_ServerRequest & req,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL
+ );
+
+ virtual void _dispatch (
+ TAO_ServerRequest & req,
+ void * servant_upcall
+ ACE_ENV_ARG_DECL
+ );
+
+ ::CORBA::StructDef *_this (
+
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS
+ );
+
+ virtual const char* _interface_repository_id (void) const;
+
+ // TAO_IDL - Generated from
+ // be\be_visitor_operation/operation_sh.cpp:45
+
+ virtual ::CORBA::StructMemberSeq * members (
+ ACE_ENV_SINGLE_ARG_DECL_WITH_DEFAULTS
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ )) = 0;
+
+ static void _get_members_skel (
+ TAO_ServerRequest & server_request,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL
+ );
+
+ // TAO_IDL - Generated from
+ // be\be_visitor_operation/operation_sh.cpp:45
+
+ virtual void members (
+ const ::CORBA::StructMemberSeq & members
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ )) = 0;
+
+ static void _set_members_skel (
+ TAO_ServerRequest & server_request,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL
+ );
+
+ static void
+ _get_def_kind_skel (
+ TAO_ServerRequest & server_request,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS
+ );
+
+ // TAO_IDL - Generated from
+ // be\be_interface.cpp:1955
+
+ static void
+ destroy_skel (
+ TAO_ServerRequest & server_request,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS
+ );
+
+ static void
+ _get_id_skel (
+ TAO_ServerRequest & server_request,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS
+ );
+
+ static void
+ _set_id_skel (
+ TAO_ServerRequest & server_request,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS
+ );
+
+ static void
+ _get_name_skel (
+ TAO_ServerRequest & server_request,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS
+ );
+
+ static void
+ _set_name_skel (
+ TAO_ServerRequest & server_request,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS
+ );
+
+ static void
+ _get_version_skel (
+ TAO_ServerRequest & server_request,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS
+ );
+
+ static void
+ _set_version_skel (
+ TAO_ServerRequest & server_request,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS
+ );
+
+ static void
+ _get_defined_in_skel (
+ TAO_ServerRequest & server_request,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS
+ );
+
+ static void
+ _get_absolute_name_skel (
+ TAO_ServerRequest & server_request,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS
+ );
+
+ static void
+ _get_containing_repository_skel (
+ TAO_ServerRequest & server_request,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS
+ );
+
+ // TAO_IDL - Generated from
+ // be\be_interface.cpp:1955
+
+ static void
+ describe_skel (
+ TAO_ServerRequest & server_request,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS
+ );
+
+ // TAO_IDL - Generated from
+ // be\be_interface.cpp:1955
+
+ static void
+ move_skel (
+ TAO_ServerRequest & server_request,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS
+ );
+
+ static void
+ _get_type_skel (
+ TAO_ServerRequest & server_request,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS
+ );
+
+ // TAO_IDL - Generated from
+ // be\be_interface.cpp:1955
+
+ static void
+ lookup_skel (
+ TAO_ServerRequest & server_request,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS
+ );
+
+ // TAO_IDL - Generated from
+ // be\be_interface.cpp:1955
+
+ static void
+ contents_skel (
+ TAO_ServerRequest & server_request,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS
+ );
+
+ // TAO_IDL - Generated from
+ // be\be_interface.cpp:1955
+
+ static void
+ lookup_name_skel (
+ TAO_ServerRequest & server_request,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS
+ );
+
+ // TAO_IDL - Generated from
+ // be\be_interface.cpp:1955
+
+ static void
+ describe_contents_skel (
+ TAO_ServerRequest & server_request,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS
+ );
+
+ // TAO_IDL - Generated from
+ // be\be_interface.cpp:1955
+
+ static void
+ create_module_skel (
+ TAO_ServerRequest & server_request,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS
+ );
+
+ // TAO_IDL - Generated from
+ // be\be_interface.cpp:1955
+
+ static void
+ create_constant_skel (
+ TAO_ServerRequest & server_request,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS
+ );
+
+ // TAO_IDL - Generated from
+ // be\be_interface.cpp:1955
+
+ static void
+ create_struct_skel (
+ TAO_ServerRequest & server_request,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS
+ );
+
+ // TAO_IDL - Generated from
+ // be\be_interface.cpp:1955
+
+ static void
+ create_union_skel (
+ TAO_ServerRequest & server_request,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS
+ );
+
+ // TAO_IDL - Generated from
+ // be\be_interface.cpp:1955
+
+ static void
+ create_enum_skel (
+ TAO_ServerRequest & server_request,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS
+ );
+
+ // TAO_IDL - Generated from
+ // be\be_interface.cpp:1955
+
+ static void
+ create_alias_skel (
+ TAO_ServerRequest & server_request,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS
+ );
+
+ // TAO_IDL - Generated from
+ // be\be_interface.cpp:1955
+
+ static void
+ create_interface_skel (
+ TAO_ServerRequest & server_request,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS
+ );
+
+ // TAO_IDL - Generated from
+ // be\be_interface.cpp:1955
+
+ static void
+ create_value_skel (
+ TAO_ServerRequest & server_request,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS
+ );
+
+ // TAO_IDL - Generated from
+ // be\be_interface.cpp:1955
+
+ static void
+ create_value_box_skel (
+ TAO_ServerRequest & server_request,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS
+ );
+
+ // TAO_IDL - Generated from
+ // be\be_interface.cpp:1955
+
+ static void
+ create_exception_skel (
+ TAO_ServerRequest & server_request,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS
+ );
+
+ // TAO_IDL - Generated from
+ // be\be_interface.cpp:1955
+
+ static void
+ create_native_skel (
+ TAO_ServerRequest & server_request,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS
+ );
+
+ // TAO_IDL - Generated from
+ // be\be_interface.cpp:1955
+
+ static void
+ create_abstract_interface_skel (
+ TAO_ServerRequest & server_request,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS
+ );
+
+ // TAO_IDL - Generated from
+ // be\be_interface.cpp:1955
+
+ static void
+ create_local_interface_skel (
+ TAO_ServerRequest & server_request,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS
+ );
+
+ // TAO_IDL - Generated from
+ // be\be_interface.cpp:1955
+
+ static void
+ create_ext_value_skel (
+ TAO_ServerRequest & server_request,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS
+ );
+ };
+
+ // TAO_IDL - Generated from
+ // be\be_visitor_interface/interface_sh.cpp:87
+
+ class UnionDef;
+ typedef UnionDef *UnionDef_ptr;
+
+ class UnionDef
+ : public virtual POA_CORBA::TypedefDef,
+ public virtual POA_CORBA::Container
+ {
+ protected:
+ UnionDef (void);
+
+ public:
+ // Useful for template programming.
+ typedef ::CORBA::UnionDef _stub_type;
+ typedef ::CORBA::UnionDef_ptr _stub_ptr_type;
+ typedef ::CORBA::UnionDef_var _stub_var_type;
+
+ UnionDef (const UnionDef& rhs);
+ virtual ~UnionDef (void);
+
+ virtual ::CORBA::Boolean _is_a (
+ const char* logical_type_id
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS
+ );
+
+ static void _is_a_skel (
+ TAO_ServerRequest & req,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL
+ );
+
+ static void _non_existent_skel (
+ TAO_ServerRequest & req,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL
+ );
+
+ static void _interface_skel (
+ TAO_ServerRequest & req,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL
+ );
+
+ static void _component_skel (
+ TAO_ServerRequest & req,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL
+ );
+
+ static void _repository_id_skel (
+ TAO_ServerRequest & req,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL
+ );
+
+ virtual void _dispatch (
+ TAO_ServerRequest & req,
+ void * servant_upcall
+ ACE_ENV_ARG_DECL
+ );
+
+ ::CORBA::UnionDef *_this (
+
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS
+ );
+
+ virtual const char* _interface_repository_id (void) const;
+
+ // TAO_IDL - Generated from
+ // be\be_visitor_operation/operation_sh.cpp:45
+
+ virtual ::CORBA::TypeCode_ptr discriminator_type (
+ ACE_ENV_SINGLE_ARG_DECL_WITH_DEFAULTS
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ )) = 0;
+
+ static void _get_discriminator_type_skel (
+ TAO_ServerRequest & server_request,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL
+ );
+
+ // TAO_IDL - Generated from
+ // be\be_visitor_operation/operation_sh.cpp:45
+
+ virtual ::CORBA::IDLType_ptr discriminator_type_def (
+ ACE_ENV_SINGLE_ARG_DECL_WITH_DEFAULTS
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ )) = 0;
+
+ static void _get_discriminator_type_def_skel (
+ TAO_ServerRequest & server_request,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL
+ );
+
+ // TAO_IDL - Generated from
+ // be\be_visitor_operation/operation_sh.cpp:45
+
+ virtual void discriminator_type_def (
+ ::CORBA::IDLType_ptr discriminator_type_def
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ )) = 0;
+
+ static void _set_discriminator_type_def_skel (
+ TAO_ServerRequest & server_request,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL
+ );
+
+ // TAO_IDL - Generated from
+ // be\be_visitor_operation/operation_sh.cpp:45
+
+ virtual ::CORBA::UnionMemberSeq * members (
+ ACE_ENV_SINGLE_ARG_DECL_WITH_DEFAULTS
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ )) = 0;
+
+ static void _get_members_skel (
+ TAO_ServerRequest & server_request,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL
+ );
+
+ // TAO_IDL - Generated from
+ // be\be_visitor_operation/operation_sh.cpp:45
+
+ virtual void members (
+ const ::CORBA::UnionMemberSeq & members
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ )) = 0;
+
+ static void _set_members_skel (
+ TAO_ServerRequest & server_request,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL
+ );
+
+ static void
+ _get_def_kind_skel (
+ TAO_ServerRequest & server_request,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS
+ );
+
+ // TAO_IDL - Generated from
+ // be\be_interface.cpp:1955
+
+ static void
+ destroy_skel (
+ TAO_ServerRequest & server_request,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS
+ );
+
+ static void
+ _get_id_skel (
+ TAO_ServerRequest & server_request,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS
+ );
+
+ static void
+ _set_id_skel (
+ TAO_ServerRequest & server_request,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS
+ );
+
+ static void
+ _get_name_skel (
+ TAO_ServerRequest & server_request,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS
+ );
+
+ static void
+ _set_name_skel (
+ TAO_ServerRequest & server_request,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS
+ );
+
+ static void
+ _get_version_skel (
+ TAO_ServerRequest & server_request,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS
+ );
+
+ static void
+ _set_version_skel (
+ TAO_ServerRequest & server_request,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS
+ );
+
+ static void
+ _get_defined_in_skel (
+ TAO_ServerRequest & server_request,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS
+ );
+
+ static void
+ _get_absolute_name_skel (
+ TAO_ServerRequest & server_request,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS
+ );
+
+ static void
+ _get_containing_repository_skel (
+ TAO_ServerRequest & server_request,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS
+ );
+
+ // TAO_IDL - Generated from
+ // be\be_interface.cpp:1955
+
+ static void
+ describe_skel (
+ TAO_ServerRequest & server_request,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS
+ );
+
+ // TAO_IDL - Generated from
+ // be\be_interface.cpp:1955
+
+ static void
+ move_skel (
+ TAO_ServerRequest & server_request,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS
+ );
+
+ static void
+ _get_type_skel (
+ TAO_ServerRequest & server_request,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS
+ );
+
+ // TAO_IDL - Generated from
+ // be\be_interface.cpp:1955
+
+ static void
+ lookup_skel (
+ TAO_ServerRequest & server_request,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS
+ );
+
+ // TAO_IDL - Generated from
+ // be\be_interface.cpp:1955
+
+ static void
+ contents_skel (
+ TAO_ServerRequest & server_request,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS
+ );
+
+ // TAO_IDL - Generated from
+ // be\be_interface.cpp:1955
+
+ static void
+ lookup_name_skel (
+ TAO_ServerRequest & server_request,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS
+ );
+
+ // TAO_IDL - Generated from
+ // be\be_interface.cpp:1955
+
+ static void
+ describe_contents_skel (
+ TAO_ServerRequest & server_request,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS
+ );
+
+ // TAO_IDL - Generated from
+ // be\be_interface.cpp:1955
+
+ static void
+ create_module_skel (
+ TAO_ServerRequest & server_request,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS
+ );
+
+ // TAO_IDL - Generated from
+ // be\be_interface.cpp:1955
+
+ static void
+ create_constant_skel (
+ TAO_ServerRequest & server_request,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS
+ );
+
+ // TAO_IDL - Generated from
+ // be\be_interface.cpp:1955
+
+ static void
+ create_struct_skel (
+ TAO_ServerRequest & server_request,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS
+ );
+
+ // TAO_IDL - Generated from
+ // be\be_interface.cpp:1955
+
+ static void
+ create_union_skel (
+ TAO_ServerRequest & server_request,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS
+ );
+
+ // TAO_IDL - Generated from
+ // be\be_interface.cpp:1955
+
+ static void
+ create_enum_skel (
+ TAO_ServerRequest & server_request,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS
+ );
+
+ // TAO_IDL - Generated from
+ // be\be_interface.cpp:1955
+
+ static void
+ create_alias_skel (
+ TAO_ServerRequest & server_request,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS
+ );
+
+ // TAO_IDL - Generated from
+ // be\be_interface.cpp:1955
+
+ static void
+ create_interface_skel (
+ TAO_ServerRequest & server_request,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS
+ );
+
+ // TAO_IDL - Generated from
+ // be\be_interface.cpp:1955
+
+ static void
+ create_value_skel (
+ TAO_ServerRequest & server_request,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS
+ );
+
+ // TAO_IDL - Generated from
+ // be\be_interface.cpp:1955
+
+ static void
+ create_value_box_skel (
+ TAO_ServerRequest & server_request,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS
+ );
+
+ // TAO_IDL - Generated from
+ // be\be_interface.cpp:1955
+
+ static void
+ create_exception_skel (
+ TAO_ServerRequest & server_request,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS
+ );
+
+ // TAO_IDL - Generated from
+ // be\be_interface.cpp:1955
+
+ static void
+ create_native_skel (
+ TAO_ServerRequest & server_request,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS
+ );
+
+ // TAO_IDL - Generated from
+ // be\be_interface.cpp:1955
+
+ static void
+ create_abstract_interface_skel (
+ TAO_ServerRequest & server_request,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS
+ );
+
+ // TAO_IDL - Generated from
+ // be\be_interface.cpp:1955
+
+ static void
+ create_local_interface_skel (
+ TAO_ServerRequest & server_request,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS
+ );
+
+ // TAO_IDL - Generated from
+ // be\be_interface.cpp:1955
+
+ static void
+ create_ext_value_skel (
+ TAO_ServerRequest & server_request,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS
+ );
+ };
+
+ // TAO_IDL - Generated from
+ // be\be_visitor_interface/interface_sh.cpp:87
+
+ class EnumDef;
+ typedef EnumDef *EnumDef_ptr;
+
+ class EnumDef
+ : public virtual POA_CORBA::TypedefDef
+ {
+ protected:
+ EnumDef (void);
+
+ public:
+ // Useful for template programming.
+ typedef ::CORBA::EnumDef _stub_type;
+ typedef ::CORBA::EnumDef_ptr _stub_ptr_type;
+ typedef ::CORBA::EnumDef_var _stub_var_type;
+
+ EnumDef (const EnumDef& rhs);
+ virtual ~EnumDef (void);
+
+ virtual ::CORBA::Boolean _is_a (
+ const char* logical_type_id
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS
+ );
+
+ static void _is_a_skel (
+ TAO_ServerRequest & req,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL
+ );
+
+ static void _non_existent_skel (
+ TAO_ServerRequest & req,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL
+ );
+
+ static void _interface_skel (
+ TAO_ServerRequest & req,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL
+ );
+
+ static void _component_skel (
+ TAO_ServerRequest & req,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL
+ );
+
+ static void _repository_id_skel (
+ TAO_ServerRequest & req,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL
+ );
+
+ virtual void _dispatch (
+ TAO_ServerRequest & req,
+ void * servant_upcall
+ ACE_ENV_ARG_DECL
+ );
+
+ ::CORBA::EnumDef *_this (
+
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS
+ );
+
+ virtual const char* _interface_repository_id (void) const;
+
+ // TAO_IDL - Generated from
+ // be\be_visitor_operation/operation_sh.cpp:45
+
+ virtual ::CORBA::EnumMemberSeq * members (
+ ACE_ENV_SINGLE_ARG_DECL_WITH_DEFAULTS
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ )) = 0;
+
+ static void _get_members_skel (
+ TAO_ServerRequest & server_request,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL
+ );
+
+ // TAO_IDL - Generated from
+ // be\be_visitor_operation/operation_sh.cpp:45
+
+ virtual void members (
+ const ::CORBA::EnumMemberSeq & members
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ )) = 0;
+
+ static void _set_members_skel (
+ TAO_ServerRequest & server_request,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL
+ );
+
+ static void
+ _get_def_kind_skel (
+ TAO_ServerRequest & server_request,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS
+ );
+
+ // TAO_IDL - Generated from
+ // be\be_interface.cpp:1955
+
+ static void
+ destroy_skel (
+ TAO_ServerRequest & server_request,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS
+ );
+
+ static void
+ _get_id_skel (
+ TAO_ServerRequest & server_request,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS
+ );
+
+ static void
+ _set_id_skel (
+ TAO_ServerRequest & server_request,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS
+ );
+
+ static void
+ _get_name_skel (
+ TAO_ServerRequest & server_request,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS
+ );
+
+ static void
+ _set_name_skel (
+ TAO_ServerRequest & server_request,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS
+ );
+
+ static void
+ _get_version_skel (
+ TAO_ServerRequest & server_request,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS
+ );
+
+ static void
+ _set_version_skel (
+ TAO_ServerRequest & server_request,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS
+ );
+
+ static void
+ _get_defined_in_skel (
+ TAO_ServerRequest & server_request,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS
+ );
+
+ static void
+ _get_absolute_name_skel (
+ TAO_ServerRequest & server_request,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS
+ );
+
+ static void
+ _get_containing_repository_skel (
+ TAO_ServerRequest & server_request,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS
+ );
+
+ // TAO_IDL - Generated from
+ // be\be_interface.cpp:1955
+
+ static void
+ describe_skel (
+ TAO_ServerRequest & server_request,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS
+ );
+
+ // TAO_IDL - Generated from
+ // be\be_interface.cpp:1955
+
+ static void
+ move_skel (
+ TAO_ServerRequest & server_request,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS
+ );
+
+ static void
+ _get_type_skel (
+ TAO_ServerRequest & server_request,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS
+ );
+ };
+
+ // TAO_IDL - Generated from
+ // be\be_visitor_interface/interface_sh.cpp:87
+
+ class AliasDef;
+ typedef AliasDef *AliasDef_ptr;
+
+ class AliasDef
+ : public virtual POA_CORBA::TypedefDef
+ {
+ protected:
+ AliasDef (void);
+
+ public:
+ // Useful for template programming.
+ typedef ::CORBA::AliasDef _stub_type;
+ typedef ::CORBA::AliasDef_ptr _stub_ptr_type;
+ typedef ::CORBA::AliasDef_var _stub_var_type;
+
+ AliasDef (const AliasDef& rhs);
+ virtual ~AliasDef (void);
+
+ virtual ::CORBA::Boolean _is_a (
+ const char* logical_type_id
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS
+ );
+
+ static void _is_a_skel (
+ TAO_ServerRequest & req,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL
+ );
+
+ static void _non_existent_skel (
+ TAO_ServerRequest & req,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL
+ );
+
+ static void _interface_skel (
+ TAO_ServerRequest & req,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL
+ );
+
+ static void _component_skel (
+ TAO_ServerRequest & req,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL
+ );
+
+ static void _repository_id_skel (
+ TAO_ServerRequest & req,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL
+ );
+
+ virtual void _dispatch (
+ TAO_ServerRequest & req,
+ void * servant_upcall
+ ACE_ENV_ARG_DECL
+ );
+
+ ::CORBA::AliasDef *_this (
+
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS
+ );
+
+ virtual const char* _interface_repository_id (void) const;
+
+ // TAO_IDL - Generated from
+ // be\be_visitor_operation/operation_sh.cpp:45
+
+ virtual ::CORBA::IDLType_ptr original_type_def (
+ ACE_ENV_SINGLE_ARG_DECL_WITH_DEFAULTS
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ )) = 0;
+
+ static void _get_original_type_def_skel (
+ TAO_ServerRequest & server_request,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL
+ );
+
+ // TAO_IDL - Generated from
+ // be\be_visitor_operation/operation_sh.cpp:45
+
+ virtual void original_type_def (
+ ::CORBA::IDLType_ptr original_type_def
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ )) = 0;
+
+ static void _set_original_type_def_skel (
+ TAO_ServerRequest & server_request,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL
+ );
+
+ static void
+ _get_def_kind_skel (
+ TAO_ServerRequest & server_request,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS
+ );
+
+ // TAO_IDL - Generated from
+ // be\be_interface.cpp:1955
+
+ static void
+ destroy_skel (
+ TAO_ServerRequest & server_request,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS
+ );
+
+ static void
+ _get_id_skel (
+ TAO_ServerRequest & server_request,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS
+ );
+
+ static void
+ _set_id_skel (
+ TAO_ServerRequest & server_request,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS
+ );
+
+ static void
+ _get_name_skel (
+ TAO_ServerRequest & server_request,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS
+ );
+
+ static void
+ _set_name_skel (
+ TAO_ServerRequest & server_request,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS
+ );
+
+ static void
+ _get_version_skel (
+ TAO_ServerRequest & server_request,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS
+ );
+
+ static void
+ _set_version_skel (
+ TAO_ServerRequest & server_request,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS
+ );
+
+ static void
+ _get_defined_in_skel (
+ TAO_ServerRequest & server_request,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS
+ );
+
+ static void
+ _get_absolute_name_skel (
+ TAO_ServerRequest & server_request,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS
+ );
+
+ static void
+ _get_containing_repository_skel (
+ TAO_ServerRequest & server_request,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS
+ );
+
+ // TAO_IDL - Generated from
+ // be\be_interface.cpp:1955
+
+ static void
+ describe_skel (
+ TAO_ServerRequest & server_request,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS
+ );
+
+ // TAO_IDL - Generated from
+ // be\be_interface.cpp:1955
+
+ static void
+ move_skel (
+ TAO_ServerRequest & server_request,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS
+ );
+
+ static void
+ _get_type_skel (
+ TAO_ServerRequest & server_request,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS
+ );
+ };
+
+ // TAO_IDL - Generated from
+ // be\be_visitor_interface/interface_sh.cpp:87
+
+ class NativeDef;
+ typedef NativeDef *NativeDef_ptr;
+
+ class NativeDef
+ : public virtual POA_CORBA::TypedefDef
+ {
+ protected:
+ NativeDef (void);
+
+ public:
+ // Useful for template programming.
+ typedef ::CORBA::NativeDef _stub_type;
+ typedef ::CORBA::NativeDef_ptr _stub_ptr_type;
+ typedef ::CORBA::NativeDef_var _stub_var_type;
+
+ NativeDef (const NativeDef& rhs);
+ virtual ~NativeDef (void);
+
+ virtual ::CORBA::Boolean _is_a (
+ const char* logical_type_id
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS
+ );
+
+ static void _is_a_skel (
+ TAO_ServerRequest & req,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL
+ );
+
+ static void _non_existent_skel (
+ TAO_ServerRequest & req,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL
+ );
+
+ static void _interface_skel (
+ TAO_ServerRequest & req,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL
+ );
+
+ static void _component_skel (
+ TAO_ServerRequest & req,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL
+ );
+
+ static void _repository_id_skel (
+ TAO_ServerRequest & req,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL
+ );
+
+ virtual void _dispatch (
+ TAO_ServerRequest & req,
+ void * servant_upcall
+ ACE_ENV_ARG_DECL
+ );
+
+ ::CORBA::NativeDef *_this (
+
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS
+ );
+
+ virtual const char* _interface_repository_id (void) const;
+
+ static void
+ _get_def_kind_skel (
+ TAO_ServerRequest & server_request,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS
+ );
+
+ // TAO_IDL - Generated from
+ // be\be_interface.cpp:1955
+
+ static void
+ destroy_skel (
+ TAO_ServerRequest & server_request,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS
+ );
+
+ static void
+ _get_id_skel (
+ TAO_ServerRequest & server_request,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS
+ );
+
+ static void
+ _set_id_skel (
+ TAO_ServerRequest & server_request,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS
+ );
+
+ static void
+ _get_name_skel (
+ TAO_ServerRequest & server_request,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS
+ );
+
+ static void
+ _set_name_skel (
+ TAO_ServerRequest & server_request,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS
+ );
+
+ static void
+ _get_version_skel (
+ TAO_ServerRequest & server_request,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS
+ );
+
+ static void
+ _set_version_skel (
+ TAO_ServerRequest & server_request,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS
+ );
+
+ static void
+ _get_defined_in_skel (
+ TAO_ServerRequest & server_request,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS
+ );
+
+ static void
+ _get_absolute_name_skel (
+ TAO_ServerRequest & server_request,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS
+ );
+
+ static void
+ _get_containing_repository_skel (
+ TAO_ServerRequest & server_request,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS
+ );
+
+ // TAO_IDL - Generated from
+ // be\be_interface.cpp:1955
+
+ static void
+ describe_skel (
+ TAO_ServerRequest & server_request,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS
+ );
+
+ // TAO_IDL - Generated from
+ // be\be_interface.cpp:1955
+
+ static void
+ move_skel (
+ TAO_ServerRequest & server_request,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS
+ );
+
+ static void
+ _get_type_skel (
+ TAO_ServerRequest & server_request,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS
+ );
+ };
+
+ // TAO_IDL - Generated from
+ // be\be_visitor_interface/interface_sh.cpp:87
+
+ class PrimitiveDef;
+ typedef PrimitiveDef *PrimitiveDef_ptr;
+
+ class PrimitiveDef
+ : public virtual POA_CORBA::IDLType
+ {
+ protected:
+ PrimitiveDef (void);
+
+ public:
+ // Useful for template programming.
+ typedef ::CORBA::PrimitiveDef _stub_type;
+ typedef ::CORBA::PrimitiveDef_ptr _stub_ptr_type;
+ typedef ::CORBA::PrimitiveDef_var _stub_var_type;
+
+ PrimitiveDef (const PrimitiveDef& rhs);
+ virtual ~PrimitiveDef (void);
+
+ virtual ::CORBA::Boolean _is_a (
+ const char* logical_type_id
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS
+ );
+
+ static void _is_a_skel (
+ TAO_ServerRequest & req,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL
+ );
+
+ static void _non_existent_skel (
+ TAO_ServerRequest & req,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL
+ );
+
+ static void _interface_skel (
+ TAO_ServerRequest & req,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL
+ );
+
+ static void _component_skel (
+ TAO_ServerRequest & req,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL
+ );
+
+ static void _repository_id_skel (
+ TAO_ServerRequest & req,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL
+ );
+
+ virtual void _dispatch (
+ TAO_ServerRequest & req,
+ void * servant_upcall
+ ACE_ENV_ARG_DECL
+ );
+
+ ::CORBA::PrimitiveDef *_this (
+
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS
+ );
+
+ virtual const char* _interface_repository_id (void) const;
+
+ // TAO_IDL - Generated from
+ // be\be_visitor_operation/operation_sh.cpp:45
+
+ virtual ::CORBA::PrimitiveKind kind (
+ ACE_ENV_SINGLE_ARG_DECL_WITH_DEFAULTS
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ )) = 0;
+
+ static void _get_kind_skel (
+ TAO_ServerRequest & server_request,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL
+ );
+
+ static void
+ _get_def_kind_skel (
+ TAO_ServerRequest & server_request,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS
+ );
+
+ // TAO_IDL - Generated from
+ // be\be_interface.cpp:1955
+
+ static void
+ destroy_skel (
+ TAO_ServerRequest & server_request,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS
+ );
+
+ static void
+ _get_type_skel (
+ TAO_ServerRequest & server_request,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS
+ );
+ };
+
+ // TAO_IDL - Generated from
+ // be\be_visitor_interface/interface_sh.cpp:87
+
+ class StringDef;
+ typedef StringDef *StringDef_ptr;
+
+ class StringDef
+ : public virtual POA_CORBA::IDLType
+ {
+ protected:
+ StringDef (void);
+
+ public:
+ // Useful for template programming.
+ typedef ::CORBA::StringDef _stub_type;
+ typedef ::CORBA::StringDef_ptr _stub_ptr_type;
+ typedef ::CORBA::StringDef_var _stub_var_type;
+
+ StringDef (const StringDef& rhs);
+ virtual ~StringDef (void);
+
+ virtual ::CORBA::Boolean _is_a (
+ const char* logical_type_id
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS
+ );
+
+ static void _is_a_skel (
+ TAO_ServerRequest & req,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL
+ );
+
+ static void _non_existent_skel (
+ TAO_ServerRequest & req,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL
+ );
+
+ static void _interface_skel (
+ TAO_ServerRequest & req,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL
+ );
+
+ static void _component_skel (
+ TAO_ServerRequest & req,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL
+ );
+
+ static void _repository_id_skel (
+ TAO_ServerRequest & req,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL
+ );
+
+ virtual void _dispatch (
+ TAO_ServerRequest & req,
+ void * servant_upcall
+ ACE_ENV_ARG_DECL
+ );
+
+ ::CORBA::StringDef *_this (
+
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS
+ );
+
+ virtual const char* _interface_repository_id (void) const;
+
+ // TAO_IDL - Generated from
+ // be\be_visitor_operation/operation_sh.cpp:45
+
+ virtual ::CORBA::ULong bound (
+ ACE_ENV_SINGLE_ARG_DECL_WITH_DEFAULTS
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ )) = 0;
+
+ static void _get_bound_skel (
+ TAO_ServerRequest & server_request,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL
+ );
+
+ // TAO_IDL - Generated from
+ // be\be_visitor_operation/operation_sh.cpp:45
+
+ virtual void bound (
+ ::CORBA::ULong bound
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ )) = 0;
+
+ static void _set_bound_skel (
+ TAO_ServerRequest & server_request,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL
+ );
+
+ static void
+ _get_def_kind_skel (
+ TAO_ServerRequest & server_request,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS
+ );
+
+ // TAO_IDL - Generated from
+ // be\be_interface.cpp:1955
+
+ static void
+ destroy_skel (
+ TAO_ServerRequest & server_request,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS
+ );
+
+ static void
+ _get_type_skel (
+ TAO_ServerRequest & server_request,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS
+ );
+ };
+
+ // TAO_IDL - Generated from
+ // be\be_visitor_interface/interface_sh.cpp:87
+
+ class WstringDef;
+ typedef WstringDef *WstringDef_ptr;
+
+ class WstringDef
+ : public virtual POA_CORBA::IDLType
+ {
+ protected:
+ WstringDef (void);
+
+ public:
+ // Useful for template programming.
+ typedef ::CORBA::WstringDef _stub_type;
+ typedef ::CORBA::WstringDef_ptr _stub_ptr_type;
+ typedef ::CORBA::WstringDef_var _stub_var_type;
+
+ WstringDef (const WstringDef& rhs);
+ virtual ~WstringDef (void);
+
+ virtual ::CORBA::Boolean _is_a (
+ const char* logical_type_id
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS
+ );
+
+ static void _is_a_skel (
+ TAO_ServerRequest & req,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL
+ );
+
+ static void _non_existent_skel (
+ TAO_ServerRequest & req,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL
+ );
+
+ static void _interface_skel (
+ TAO_ServerRequest & req,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL
+ );
+
+ static void _component_skel (
+ TAO_ServerRequest & req,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL
+ );
+
+ static void _repository_id_skel (
+ TAO_ServerRequest & req,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL
+ );
+
+ virtual void _dispatch (
+ TAO_ServerRequest & req,
+ void * servant_upcall
+ ACE_ENV_ARG_DECL
+ );
+
+ ::CORBA::WstringDef *_this (
+
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS
+ );
+
+ virtual const char* _interface_repository_id (void) const;
+
+ // TAO_IDL - Generated from
+ // be\be_visitor_operation/operation_sh.cpp:45
+
+ virtual ::CORBA::ULong bound (
+ ACE_ENV_SINGLE_ARG_DECL_WITH_DEFAULTS
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ )) = 0;
+
+ static void _get_bound_skel (
+ TAO_ServerRequest & server_request,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL
+ );
+
+ // TAO_IDL - Generated from
+ // be\be_visitor_operation/operation_sh.cpp:45
+
+ virtual void bound (
+ ::CORBA::ULong bound
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ )) = 0;
+
+ static void _set_bound_skel (
+ TAO_ServerRequest & server_request,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL
+ );
+
+ static void
+ _get_def_kind_skel (
+ TAO_ServerRequest & server_request,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS
+ );
+
+ // TAO_IDL - Generated from
+ // be\be_interface.cpp:1955
+
+ static void
+ destroy_skel (
+ TAO_ServerRequest & server_request,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS
+ );
+
+ static void
+ _get_type_skel (
+ TAO_ServerRequest & server_request,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS
+ );
+ };
+
+ // TAO_IDL - Generated from
+ // be\be_visitor_interface/interface_sh.cpp:87
+
+ class SequenceDef;
+ typedef SequenceDef *SequenceDef_ptr;
+
+ class SequenceDef
+ : public virtual POA_CORBA::IDLType
+ {
+ protected:
+ SequenceDef (void);
+
+ public:
+ // Useful for template programming.
+ typedef ::CORBA::SequenceDef _stub_type;
+ typedef ::CORBA::SequenceDef_ptr _stub_ptr_type;
+ typedef ::CORBA::SequenceDef_var _stub_var_type;
+
+ SequenceDef (const SequenceDef& rhs);
+ virtual ~SequenceDef (void);
+
+ virtual ::CORBA::Boolean _is_a (
+ const char* logical_type_id
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS
+ );
+
+ static void _is_a_skel (
+ TAO_ServerRequest & req,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL
+ );
+
+ static void _non_existent_skel (
+ TAO_ServerRequest & req,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL
+ );
+
+ static void _interface_skel (
+ TAO_ServerRequest & req,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL
+ );
+
+ static void _component_skel (
+ TAO_ServerRequest & req,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL
+ );
+
+ static void _repository_id_skel (
+ TAO_ServerRequest & req,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL
+ );
+
+ virtual void _dispatch (
+ TAO_ServerRequest & req,
+ void * servant_upcall
+ ACE_ENV_ARG_DECL
+ );
+
+ ::CORBA::SequenceDef *_this (
+
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS
+ );
+
+ virtual const char* _interface_repository_id (void) const;
+
+ // TAO_IDL - Generated from
+ // be\be_visitor_operation/operation_sh.cpp:45
+
+ virtual ::CORBA::ULong bound (
+ ACE_ENV_SINGLE_ARG_DECL_WITH_DEFAULTS
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ )) = 0;
+
+ static void _get_bound_skel (
+ TAO_ServerRequest & server_request,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL
+ );
+
+ // TAO_IDL - Generated from
+ // be\be_visitor_operation/operation_sh.cpp:45
+
+ virtual void bound (
+ ::CORBA::ULong bound
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ )) = 0;
+
+ static void _set_bound_skel (
+ TAO_ServerRequest & server_request,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL
+ );
+
+ // TAO_IDL - Generated from
+ // be\be_visitor_operation/operation_sh.cpp:45
+
+ virtual ::CORBA::TypeCode_ptr element_type (
+ ACE_ENV_SINGLE_ARG_DECL_WITH_DEFAULTS
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ )) = 0;
+
+ static void _get_element_type_skel (
+ TAO_ServerRequest & server_request,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL
+ );
+
+ // TAO_IDL - Generated from
+ // be\be_visitor_operation/operation_sh.cpp:45
+
+ virtual ::CORBA::IDLType_ptr element_type_def (
+ ACE_ENV_SINGLE_ARG_DECL_WITH_DEFAULTS
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ )) = 0;
+
+ static void _get_element_type_def_skel (
+ TAO_ServerRequest & server_request,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL
+ );
+
+ // TAO_IDL - Generated from
+ // be\be_visitor_operation/operation_sh.cpp:45
+
+ virtual void element_type_def (
+ ::CORBA::IDLType_ptr element_type_def
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ )) = 0;
+
+ static void _set_element_type_def_skel (
+ TAO_ServerRequest & server_request,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL
+ );
+
+ static void
+ _get_def_kind_skel (
+ TAO_ServerRequest & server_request,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS
+ );
+
+ // TAO_IDL - Generated from
+ // be\be_interface.cpp:1955
+
+ static void
+ destroy_skel (
+ TAO_ServerRequest & server_request,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS
+ );
+
+ static void
+ _get_type_skel (
+ TAO_ServerRequest & server_request,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS
+ );
+ };
+
+ // TAO_IDL - Generated from
+ // be\be_visitor_interface/interface_sh.cpp:87
+
+ class ArrayDef;
+ typedef ArrayDef *ArrayDef_ptr;
+
+ class ArrayDef
+ : public virtual POA_CORBA::IDLType
+ {
+ protected:
+ ArrayDef (void);
+
+ public:
+ // Useful for template programming.
+ typedef ::CORBA::ArrayDef _stub_type;
+ typedef ::CORBA::ArrayDef_ptr _stub_ptr_type;
+ typedef ::CORBA::ArrayDef_var _stub_var_type;
+
+ ArrayDef (const ArrayDef& rhs);
+ virtual ~ArrayDef (void);
+
+ virtual ::CORBA::Boolean _is_a (
+ const char* logical_type_id
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS
+ );
+
+ static void _is_a_skel (
+ TAO_ServerRequest & req,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL
+ );
+
+ static void _non_existent_skel (
+ TAO_ServerRequest & req,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL
+ );
+
+ static void _interface_skel (
+ TAO_ServerRequest & req,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL
+ );
+
+ static void _component_skel (
+ TAO_ServerRequest & req,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL
+ );
+
+ static void _repository_id_skel (
+ TAO_ServerRequest & req,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL
+ );
+
+ virtual void _dispatch (
+ TAO_ServerRequest & req,
+ void * servant_upcall
+ ACE_ENV_ARG_DECL
+ );
+
+ ::CORBA::ArrayDef *_this (
+
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS
+ );
+
+ virtual const char* _interface_repository_id (void) const;
+
+ // TAO_IDL - Generated from
+ // be\be_visitor_operation/operation_sh.cpp:45
+
+ virtual ::CORBA::ULong length (
+ ACE_ENV_SINGLE_ARG_DECL_WITH_DEFAULTS
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ )) = 0;
+
+ static void _get_length_skel (
+ TAO_ServerRequest & server_request,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL
+ );
+
+ // TAO_IDL - Generated from
+ // be\be_visitor_operation/operation_sh.cpp:45
+
+ virtual void length (
+ ::CORBA::ULong length
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ )) = 0;
+
+ static void _set_length_skel (
+ TAO_ServerRequest & server_request,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL
+ );
+
+ // TAO_IDL - Generated from
+ // be\be_visitor_operation/operation_sh.cpp:45
+
+ virtual ::CORBA::TypeCode_ptr element_type (
+ ACE_ENV_SINGLE_ARG_DECL_WITH_DEFAULTS
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ )) = 0;
+
+ static void _get_element_type_skel (
+ TAO_ServerRequest & server_request,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL
+ );
+
+ // TAO_IDL - Generated from
+ // be\be_visitor_operation/operation_sh.cpp:45
+
+ virtual ::CORBA::IDLType_ptr element_type_def (
+ ACE_ENV_SINGLE_ARG_DECL_WITH_DEFAULTS
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ )) = 0;
+
+ static void _get_element_type_def_skel (
+ TAO_ServerRequest & server_request,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL
+ );
+
+ // TAO_IDL - Generated from
+ // be\be_visitor_operation/operation_sh.cpp:45
+
+ virtual void element_type_def (
+ ::CORBA::IDLType_ptr element_type_def
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ )) = 0;
+
+ static void _set_element_type_def_skel (
+ TAO_ServerRequest & server_request,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL
+ );
+
+ static void
+ _get_def_kind_skel (
+ TAO_ServerRequest & server_request,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS
+ );
+
+ // TAO_IDL - Generated from
+ // be\be_interface.cpp:1955
+
+ static void
+ destroy_skel (
+ TAO_ServerRequest & server_request,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS
+ );
+
+ static void
+ _get_type_skel (
+ TAO_ServerRequest & server_request,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS
+ );
+ };
+
+ // TAO_IDL - Generated from
+ // be\be_visitor_interface/interface_sh.cpp:87
+
+ class ExceptionDef;
+ typedef ExceptionDef *ExceptionDef_ptr;
+
+ class ExceptionDef
+ : public virtual POA_CORBA::Contained,
+ public virtual POA_CORBA::Container
+ {
+ protected:
+ ExceptionDef (void);
+
+ public:
+ // Useful for template programming.
+ typedef ::CORBA::ExceptionDef _stub_type;
+ typedef ::CORBA::ExceptionDef_ptr _stub_ptr_type;
+ typedef ::CORBA::ExceptionDef_var _stub_var_type;
+
+ ExceptionDef (const ExceptionDef& rhs);
+ virtual ~ExceptionDef (void);
+
+ virtual ::CORBA::Boolean _is_a (
+ const char* logical_type_id
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS
+ );
+
+ static void _is_a_skel (
+ TAO_ServerRequest & req,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL
+ );
+
+ static void _non_existent_skel (
+ TAO_ServerRequest & req,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL
+ );
+
+ static void _interface_skel (
+ TAO_ServerRequest & req,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL
+ );
+
+ static void _component_skel (
+ TAO_ServerRequest & req,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL
+ );
+
+ static void _repository_id_skel (
+ TAO_ServerRequest & req,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL
+ );
+
+ virtual void _dispatch (
+ TAO_ServerRequest & req,
+ void * servant_upcall
+ ACE_ENV_ARG_DECL
+ );
+
+ ::CORBA::ExceptionDef *_this (
+
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS
+ );
+
+ virtual const char* _interface_repository_id (void) const;
+
+ // TAO_IDL - Generated from
+ // be\be_visitor_operation/operation_sh.cpp:45
+
+ virtual ::CORBA::TypeCode_ptr type (
+ ACE_ENV_SINGLE_ARG_DECL_WITH_DEFAULTS
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ )) = 0;
+
+ static void _get_type_skel (
+ TAO_ServerRequest & server_request,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL
+ );
+
+ // TAO_IDL - Generated from
+ // be\be_visitor_operation/operation_sh.cpp:45
+
+ virtual ::CORBA::StructMemberSeq * members (
+ ACE_ENV_SINGLE_ARG_DECL_WITH_DEFAULTS
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ )) = 0;
+
+ static void _get_members_skel (
+ TAO_ServerRequest & server_request,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL
+ );
+
+ // TAO_IDL - Generated from
+ // be\be_visitor_operation/operation_sh.cpp:45
+
+ virtual void members (
+ const ::CORBA::StructMemberSeq & members
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ )) = 0;
+
+ static void _set_members_skel (
+ TAO_ServerRequest & server_request,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL
+ );
+
+ static void
+ _get_def_kind_skel (
+ TAO_ServerRequest & server_request,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS
+ );
+
+ // TAO_IDL - Generated from
+ // be\be_interface.cpp:1955
+
+ static void
+ destroy_skel (
+ TAO_ServerRequest & server_request,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS
+ );
+
+ static void
+ _get_id_skel (
+ TAO_ServerRequest & server_request,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS
+ );
+
+ static void
+ _set_id_skel (
+ TAO_ServerRequest & server_request,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS
+ );
+
+ static void
+ _get_name_skel (
+ TAO_ServerRequest & server_request,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS
+ );
+
+ static void
+ _set_name_skel (
+ TAO_ServerRequest & server_request,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS
+ );
+
+ static void
+ _get_version_skel (
+ TAO_ServerRequest & server_request,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS
+ );
+
+ static void
+ _set_version_skel (
+ TAO_ServerRequest & server_request,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS
+ );
+
+ static void
+ _get_defined_in_skel (
+ TAO_ServerRequest & server_request,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS
+ );
+
+ static void
+ _get_absolute_name_skel (
+ TAO_ServerRequest & server_request,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS
+ );
+
+ static void
+ _get_containing_repository_skel (
+ TAO_ServerRequest & server_request,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS
+ );
+
+ // TAO_IDL - Generated from
+ // be\be_interface.cpp:1955
+
+ static void
+ describe_skel (
+ TAO_ServerRequest & server_request,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS
+ );
+
+ // TAO_IDL - Generated from
+ // be\be_interface.cpp:1955
+
+ static void
+ move_skel (
+ TAO_ServerRequest & server_request,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS
+ );
+
+ // TAO_IDL - Generated from
+ // be\be_interface.cpp:1955
+
+ static void
+ lookup_skel (
+ TAO_ServerRequest & server_request,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS
+ );
+
+ // TAO_IDL - Generated from
+ // be\be_interface.cpp:1955
+
+ static void
+ contents_skel (
+ TAO_ServerRequest & server_request,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS
+ );
+
+ // TAO_IDL - Generated from
+ // be\be_interface.cpp:1955
+
+ static void
+ lookup_name_skel (
+ TAO_ServerRequest & server_request,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS
+ );
+
+ // TAO_IDL - Generated from
+ // be\be_interface.cpp:1955
+
+ static void
+ describe_contents_skel (
+ TAO_ServerRequest & server_request,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS
+ );
+
+ // TAO_IDL - Generated from
+ // be\be_interface.cpp:1955
+
+ static void
+ create_module_skel (
+ TAO_ServerRequest & server_request,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS
+ );
+
+ // TAO_IDL - Generated from
+ // be\be_interface.cpp:1955
+
+ static void
+ create_constant_skel (
+ TAO_ServerRequest & server_request,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS
+ );
+
+ // TAO_IDL - Generated from
+ // be\be_interface.cpp:1955
+
+ static void
+ create_struct_skel (
+ TAO_ServerRequest & server_request,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS
+ );
+
+ // TAO_IDL - Generated from
+ // be\be_interface.cpp:1955
+
+ static void
+ create_union_skel (
+ TAO_ServerRequest & server_request,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS
+ );
+
+ // TAO_IDL - Generated from
+ // be\be_interface.cpp:1955
+
+ static void
+ create_enum_skel (
+ TAO_ServerRequest & server_request,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS
+ );
+
+ // TAO_IDL - Generated from
+ // be\be_interface.cpp:1955
+
+ static void
+ create_alias_skel (
+ TAO_ServerRequest & server_request,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS
+ );
+
+ // TAO_IDL - Generated from
+ // be\be_interface.cpp:1955
+
+ static void
+ create_interface_skel (
+ TAO_ServerRequest & server_request,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS
+ );
+
+ // TAO_IDL - Generated from
+ // be\be_interface.cpp:1955
+
+ static void
+ create_value_skel (
+ TAO_ServerRequest & server_request,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS
+ );
+
+ // TAO_IDL - Generated from
+ // be\be_interface.cpp:1955
+
+ static void
+ create_value_box_skel (
+ TAO_ServerRequest & server_request,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS
+ );
+
+ // TAO_IDL - Generated from
+ // be\be_interface.cpp:1955
+
+ static void
+ create_exception_skel (
+ TAO_ServerRequest & server_request,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS
+ );
+
+ // TAO_IDL - Generated from
+ // be\be_interface.cpp:1955
+
+ static void
+ create_native_skel (
+ TAO_ServerRequest & server_request,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS
+ );
+
+ // TAO_IDL - Generated from
+ // be\be_interface.cpp:1955
+
+ static void
+ create_abstract_interface_skel (
+ TAO_ServerRequest & server_request,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS
+ );
+
+ // TAO_IDL - Generated from
+ // be\be_interface.cpp:1955
+
+ static void
+ create_local_interface_skel (
+ TAO_ServerRequest & server_request,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS
+ );
+
+ // TAO_IDL - Generated from
+ // be\be_interface.cpp:1955
+
+ static void
+ create_ext_value_skel (
+ TAO_ServerRequest & server_request,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS
+ );
+ };
+
+ // TAO_IDL - Generated from
+ // be\be_visitor_interface/interface_sh.cpp:87
+
+ class AttributeDef;
+ typedef AttributeDef *AttributeDef_ptr;
+
+ class AttributeDef
+ : public virtual POA_CORBA::Contained
+ {
+ protected:
+ AttributeDef (void);
+
+ public:
+ // Useful for template programming.
+ typedef ::CORBA::AttributeDef _stub_type;
+ typedef ::CORBA::AttributeDef_ptr _stub_ptr_type;
+ typedef ::CORBA::AttributeDef_var _stub_var_type;
+
+ AttributeDef (const AttributeDef& rhs);
+ virtual ~AttributeDef (void);
+
+ virtual ::CORBA::Boolean _is_a (
+ const char* logical_type_id
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS
+ );
+
+ static void _is_a_skel (
+ TAO_ServerRequest & req,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL
+ );
+
+ static void _non_existent_skel (
+ TAO_ServerRequest & req,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL
+ );
+
+ static void _interface_skel (
+ TAO_ServerRequest & req,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL
+ );
+
+ static void _component_skel (
+ TAO_ServerRequest & req,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL
+ );
+
+ static void _repository_id_skel (
+ TAO_ServerRequest & req,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL
+ );
+
+ virtual void _dispatch (
+ TAO_ServerRequest & req,
+ void * servant_upcall
+ ACE_ENV_ARG_DECL
+ );
+
+ ::CORBA::AttributeDef *_this (
+
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS
+ );
+
+ virtual const char* _interface_repository_id (void) const;
+
+ // TAO_IDL - Generated from
+ // be\be_visitor_operation/operation_sh.cpp:45
+
+ virtual ::CORBA::TypeCode_ptr type (
+ ACE_ENV_SINGLE_ARG_DECL_WITH_DEFAULTS
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ )) = 0;
+
+ static void _get_type_skel (
+ TAO_ServerRequest & server_request,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL
+ );
+
+ // TAO_IDL - Generated from
+ // be\be_visitor_operation/operation_sh.cpp:45
+
+ virtual ::CORBA::IDLType_ptr type_def (
+ ACE_ENV_SINGLE_ARG_DECL_WITH_DEFAULTS
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ )) = 0;
+
+ static void _get_type_def_skel (
+ TAO_ServerRequest & server_request,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL
+ );
+
+ // TAO_IDL - Generated from
+ // be\be_visitor_operation/operation_sh.cpp:45
+
+ virtual void type_def (
+ ::CORBA::IDLType_ptr type_def
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ )) = 0;
+
+ static void _set_type_def_skel (
+ TAO_ServerRequest & server_request,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL
+ );
+
+ // TAO_IDL - Generated from
+ // be\be_visitor_operation/operation_sh.cpp:45
+
+ virtual ::CORBA::AttributeMode mode (
+ ACE_ENV_SINGLE_ARG_DECL_WITH_DEFAULTS
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ )) = 0;
+
+ static void _get_mode_skel (
+ TAO_ServerRequest & server_request,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL
+ );
+
+ // TAO_IDL - Generated from
+ // be\be_visitor_operation/operation_sh.cpp:45
+
+ virtual void mode (
+ ::CORBA::AttributeMode mode
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ )) = 0;
+
+ static void _set_mode_skel (
+ TAO_ServerRequest & server_request,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL
+ );
+
+ static void
+ _get_def_kind_skel (
+ TAO_ServerRequest & server_request,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS
+ );
+
+ // TAO_IDL - Generated from
+ // be\be_interface.cpp:1955
+
+ static void
+ destroy_skel (
+ TAO_ServerRequest & server_request,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS
+ );
+
+ static void
+ _get_id_skel (
+ TAO_ServerRequest & server_request,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS
+ );
+
+ static void
+ _set_id_skel (
+ TAO_ServerRequest & server_request,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS
+ );
+
+ static void
+ _get_name_skel (
+ TAO_ServerRequest & server_request,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS
+ );
+
+ static void
+ _set_name_skel (
+ TAO_ServerRequest & server_request,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS
+ );
+
+ static void
+ _get_version_skel (
+ TAO_ServerRequest & server_request,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS
+ );
+
+ static void
+ _set_version_skel (
+ TAO_ServerRequest & server_request,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS
+ );
+
+ static void
+ _get_defined_in_skel (
+ TAO_ServerRequest & server_request,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS
+ );
+
+ static void
+ _get_absolute_name_skel (
+ TAO_ServerRequest & server_request,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS
+ );
+
+ static void
+ _get_containing_repository_skel (
+ TAO_ServerRequest & server_request,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS
+ );
+
+ // TAO_IDL - Generated from
+ // be\be_interface.cpp:1955
+
+ static void
+ describe_skel (
+ TAO_ServerRequest & server_request,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS
+ );
+
+ // TAO_IDL - Generated from
+ // be\be_interface.cpp:1955
+
+ static void
+ move_skel (
+ TAO_ServerRequest & server_request,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS
+ );
+ };
+
+ // TAO_IDL - Generated from
+ // be\be_visitor_interface/interface_sh.cpp:87
+
+ class ExtAttributeDef;
+ typedef ExtAttributeDef *ExtAttributeDef_ptr;
+
+ class ExtAttributeDef
+ : public virtual POA_CORBA::AttributeDef
+ {
+ protected:
+ ExtAttributeDef (void);
+
+ public:
+ // Useful for template programming.
+ typedef ::CORBA::ExtAttributeDef _stub_type;
+ typedef ::CORBA::ExtAttributeDef_ptr _stub_ptr_type;
+ typedef ::CORBA::ExtAttributeDef_var _stub_var_type;
+
+ ExtAttributeDef (const ExtAttributeDef& rhs);
+ virtual ~ExtAttributeDef (void);
+
+ virtual ::CORBA::Boolean _is_a (
+ const char* logical_type_id
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS
+ );
+
+ static void _is_a_skel (
+ TAO_ServerRequest & req,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL
+ );
+
+ static void _non_existent_skel (
+ TAO_ServerRequest & req,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL
+ );
+
+ static void _interface_skel (
+ TAO_ServerRequest & req,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL
+ );
+
+ static void _component_skel (
+ TAO_ServerRequest & req,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL
+ );
+
+ static void _repository_id_skel (
+ TAO_ServerRequest & req,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL
+ );
+
+ virtual void _dispatch (
+ TAO_ServerRequest & req,
+ void * servant_upcall
+ ACE_ENV_ARG_DECL
+ );
+
+ ::CORBA::ExtAttributeDef *_this (
+
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS
+ );
+
+ virtual const char* _interface_repository_id (void) const;
+
+ // TAO_IDL - Generated from
+ // be\be_visitor_operation/operation_sh.cpp:45
+
+ virtual ::CORBA::ExcDescriptionSeq * get_exceptions (
+ ACE_ENV_SINGLE_ARG_DECL_WITH_DEFAULTS
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ )) = 0;
+
+ static void _get_get_exceptions_skel (
+ TAO_ServerRequest & server_request,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL
+ );
+
+ // TAO_IDL - Generated from
+ // be\be_visitor_operation/operation_sh.cpp:45
+
+ virtual void get_exceptions (
+ const ::CORBA::ExcDescriptionSeq & get_exceptions
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ )) = 0;
+
+ static void _set_get_exceptions_skel (
+ TAO_ServerRequest & server_request,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL
+ );
+
+ // TAO_IDL - Generated from
+ // be\be_visitor_operation/operation_sh.cpp:45
+
+ virtual ::CORBA::ExcDescriptionSeq * set_exceptions (
+ ACE_ENV_SINGLE_ARG_DECL_WITH_DEFAULTS
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ )) = 0;
+
+ static void _get_set_exceptions_skel (
+ TAO_ServerRequest & server_request,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL
+ );
+
+ // TAO_IDL - Generated from
+ // be\be_visitor_operation/operation_sh.cpp:45
+
+ virtual void set_exceptions (
+ const ::CORBA::ExcDescriptionSeq & set_exceptions
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ )) = 0;
+
+ static void _set_set_exceptions_skel (
+ TAO_ServerRequest & server_request,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL
+ );
+
+ // TAO_IDL - Generated from
+ // be\be_visitor_operation/operation_sh.cpp:45
+
+ virtual ::CORBA::ExtAttributeDescription * describe_attribute (
+ ACE_ENV_SINGLE_ARG_DECL_WITH_DEFAULTS
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ )) = 0;
+
+ static void describe_attribute_skel (
+ TAO_ServerRequest & server_request,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL
+ );
+
+ static void
+ _get_def_kind_skel (
+ TAO_ServerRequest & server_request,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS
+ );
+
+ // TAO_IDL - Generated from
+ // be\be_interface.cpp:1955
+
+ static void
+ destroy_skel (
+ TAO_ServerRequest & server_request,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS
+ );
+
+ static void
+ _get_id_skel (
+ TAO_ServerRequest & server_request,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS
+ );
+
+ static void
+ _set_id_skel (
+ TAO_ServerRequest & server_request,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS
+ );
+
+ static void
+ _get_name_skel (
+ TAO_ServerRequest & server_request,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS
+ );
+
+ static void
+ _set_name_skel (
+ TAO_ServerRequest & server_request,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS
+ );
+
+ static void
+ _get_version_skel (
+ TAO_ServerRequest & server_request,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS
+ );
+
+ static void
+ _set_version_skel (
+ TAO_ServerRequest & server_request,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS
+ );
+
+ static void
+ _get_defined_in_skel (
+ TAO_ServerRequest & server_request,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS
+ );
+
+ static void
+ _get_absolute_name_skel (
+ TAO_ServerRequest & server_request,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS
+ );
+
+ static void
+ _get_containing_repository_skel (
+ TAO_ServerRequest & server_request,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS
+ );
+
+ // TAO_IDL - Generated from
+ // be\be_interface.cpp:1955
+
+ static void
+ describe_skel (
+ TAO_ServerRequest & server_request,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS
+ );
+
+ // TAO_IDL - Generated from
+ // be\be_interface.cpp:1955
+
+ static void
+ move_skel (
+ TAO_ServerRequest & server_request,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS
+ );
+
+ static void
+ _get_type_skel (
+ TAO_ServerRequest & server_request,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS
+ );
+
+ static void
+ _get_type_def_skel (
+ TAO_ServerRequest & server_request,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS
+ );
+
+ static void
+ _set_type_def_skel (
+ TAO_ServerRequest & server_request,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS
+ );
+
+ static void
+ _get_mode_skel (
+ TAO_ServerRequest & server_request,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS
+ );
+
+ static void
+ _set_mode_skel (
+ TAO_ServerRequest & server_request,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS
+ );
+ };
+
+ // TAO_IDL - Generated from
+ // be\be_visitor_interface/interface_sh.cpp:87
+
+ class OperationDef;
+ typedef OperationDef *OperationDef_ptr;
+
+ class OperationDef
+ : public virtual POA_CORBA::Contained
+ {
+ protected:
+ OperationDef (void);
+
+ public:
+ // Useful for template programming.
+ typedef ::CORBA::OperationDef _stub_type;
+ typedef ::CORBA::OperationDef_ptr _stub_ptr_type;
+ typedef ::CORBA::OperationDef_var _stub_var_type;
+
+ OperationDef (const OperationDef& rhs);
+ virtual ~OperationDef (void);
+
+ virtual ::CORBA::Boolean _is_a (
+ const char* logical_type_id
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS
+ );
+
+ static void _is_a_skel (
+ TAO_ServerRequest & req,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL
+ );
+
+ static void _non_existent_skel (
+ TAO_ServerRequest & req,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL
+ );
+
+ static void _interface_skel (
+ TAO_ServerRequest & req,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL
+ );
+
+ static void _component_skel (
+ TAO_ServerRequest & req,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL
+ );
+
+ static void _repository_id_skel (
+ TAO_ServerRequest & req,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL
+ );
+
+ virtual void _dispatch (
+ TAO_ServerRequest & req,
+ void * servant_upcall
+ ACE_ENV_ARG_DECL
+ );
+
+ ::CORBA::OperationDef *_this (
+
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS
+ );
+
+ virtual const char* _interface_repository_id (void) const;
+
+ // TAO_IDL - Generated from
+ // be\be_visitor_operation/operation_sh.cpp:45
+
+ virtual ::CORBA::TypeCode_ptr result (
+ ACE_ENV_SINGLE_ARG_DECL_WITH_DEFAULTS
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ )) = 0;
+
+ static void _get_result_skel (
+ TAO_ServerRequest & server_request,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL
+ );
+
+ // TAO_IDL - Generated from
+ // be\be_visitor_operation/operation_sh.cpp:45
+
+ virtual ::CORBA::IDLType_ptr result_def (
+ ACE_ENV_SINGLE_ARG_DECL_WITH_DEFAULTS
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ )) = 0;
+
+ static void _get_result_def_skel (
+ TAO_ServerRequest & server_request,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL
+ );
+
+ // TAO_IDL - Generated from
+ // be\be_visitor_operation/operation_sh.cpp:45
+
+ virtual void result_def (
+ ::CORBA::IDLType_ptr result_def
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ )) = 0;
+
+ static void _set_result_def_skel (
+ TAO_ServerRequest & server_request,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL
+ );
+
+ // TAO_IDL - Generated from
+ // be\be_visitor_operation/operation_sh.cpp:45
+
+ virtual ::CORBA::ParDescriptionSeq * params (
+ ACE_ENV_SINGLE_ARG_DECL_WITH_DEFAULTS
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ )) = 0;
+
+ static void _get_params_skel (
+ TAO_ServerRequest & server_request,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL
+ );
+
+ // TAO_IDL - Generated from
+ // be\be_visitor_operation/operation_sh.cpp:45
+
+ virtual void params (
+ const ::CORBA::ParDescriptionSeq & params
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ )) = 0;
+
+ static void _set_params_skel (
+ TAO_ServerRequest & server_request,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL
+ );
+
+ // TAO_IDL - Generated from
+ // be\be_visitor_operation/operation_sh.cpp:45
+
+ virtual ::CORBA::OperationMode mode (
+ ACE_ENV_SINGLE_ARG_DECL_WITH_DEFAULTS
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ )) = 0;
+
+ static void _get_mode_skel (
+ TAO_ServerRequest & server_request,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL
+ );
+
+ // TAO_IDL - Generated from
+ // be\be_visitor_operation/operation_sh.cpp:45
+
+ virtual void mode (
+ ::CORBA::OperationMode mode
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ )) = 0;
+
+ static void _set_mode_skel (
+ TAO_ServerRequest & server_request,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL
+ );
+
+ // TAO_IDL - Generated from
+ // be\be_visitor_operation/operation_sh.cpp:45
+
+ virtual ::CORBA::ContextIdSeq * contexts (
+ ACE_ENV_SINGLE_ARG_DECL_WITH_DEFAULTS
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ )) = 0;
+
+ static void _get_contexts_skel (
+ TAO_ServerRequest & server_request,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL
+ );
+
+ // TAO_IDL - Generated from
+ // be\be_visitor_operation/operation_sh.cpp:45
+
+ virtual void contexts (
+ const ::CORBA::ContextIdSeq & contexts
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ )) = 0;
+
+ static void _set_contexts_skel (
+ TAO_ServerRequest & server_request,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL
+ );
+
+ // TAO_IDL - Generated from
+ // be\be_visitor_operation/operation_sh.cpp:45
+
+ virtual ::CORBA::ExceptionDefSeq * exceptions (
+ ACE_ENV_SINGLE_ARG_DECL_WITH_DEFAULTS
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ )) = 0;
+
+ static void _get_exceptions_skel (
+ TAO_ServerRequest & server_request,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL
+ );
+
+ // TAO_IDL - Generated from
+ // be\be_visitor_operation/operation_sh.cpp:45
+
+ virtual void exceptions (
+ const ::CORBA::ExceptionDefSeq & exceptions
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ )) = 0;
+
+ static void _set_exceptions_skel (
+ TAO_ServerRequest & server_request,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL
+ );
+
+ static void
+ _get_def_kind_skel (
+ TAO_ServerRequest & server_request,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS
+ );
+
+ // TAO_IDL - Generated from
+ // be\be_interface.cpp:1955
+
+ static void
+ destroy_skel (
+ TAO_ServerRequest & server_request,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS
+ );
+
+ static void
+ _get_id_skel (
+ TAO_ServerRequest & server_request,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS
+ );
+
+ static void
+ _set_id_skel (
+ TAO_ServerRequest & server_request,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS
+ );
+
+ static void
+ _get_name_skel (
+ TAO_ServerRequest & server_request,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS
+ );
+
+ static void
+ _set_name_skel (
+ TAO_ServerRequest & server_request,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS
+ );
+
+ static void
+ _get_version_skel (
+ TAO_ServerRequest & server_request,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS
+ );
+
+ static void
+ _set_version_skel (
+ TAO_ServerRequest & server_request,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS
+ );
+
+ static void
+ _get_defined_in_skel (
+ TAO_ServerRequest & server_request,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS
+ );
+
+ static void
+ _get_absolute_name_skel (
+ TAO_ServerRequest & server_request,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS
+ );
+
+ static void
+ _get_containing_repository_skel (
+ TAO_ServerRequest & server_request,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS
+ );
+
+ // TAO_IDL - Generated from
+ // be\be_interface.cpp:1955
+
+ static void
+ describe_skel (
+ TAO_ServerRequest & server_request,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS
+ );
+
+ // TAO_IDL - Generated from
+ // be\be_interface.cpp:1955
+
+ static void
+ move_skel (
+ TAO_ServerRequest & server_request,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS
+ );
+ };
+
+ // TAO_IDL - Generated from
+ // be\be_visitor_interface/interface_sh.cpp:87
+
+ class InterfaceDef;
+ typedef InterfaceDef *InterfaceDef_ptr;
+
+ class InterfaceDef
+ : public virtual POA_CORBA::Container,
+ public virtual POA_CORBA::Contained,
+ public virtual POA_CORBA::IDLType
+ {
+ protected:
+ InterfaceDef (void);
+
+ public:
+ // Useful for template programming.
+ typedef ::CORBA::InterfaceDef _stub_type;
+ typedef ::CORBA::InterfaceDef_ptr _stub_ptr_type;
+ typedef ::CORBA::InterfaceDef_var _stub_var_type;
+
+ InterfaceDef (const InterfaceDef& rhs);
+ virtual ~InterfaceDef (void);
+
+ virtual ::CORBA::Boolean _is_a (
+ const char* logical_type_id
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS
+ );
+
+ static void _is_a_skel (
+ TAO_ServerRequest & req,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL
+ );
+
+ static void _non_existent_skel (
+ TAO_ServerRequest & req,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL
+ );
+
+ static void _interface_skel (
+ TAO_ServerRequest & req,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL
+ );
+
+ static void _component_skel (
+ TAO_ServerRequest & req,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL
+ );
+
+ static void _repository_id_skel (
+ TAO_ServerRequest & req,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL
+ );
+
+ virtual void _dispatch (
+ TAO_ServerRequest & req,
+ void * servant_upcall
+ ACE_ENV_ARG_DECL
+ );
+
+ ::CORBA::InterfaceDef *_this (
+
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS
+ );
+
+ virtual const char* _interface_repository_id (void) const;
+
+ // TAO_IDL - Generated from
+ // be\be_visitor_operation/operation_sh.cpp:45
+
+ virtual ::CORBA::InterfaceDefSeq * base_interfaces (
+ ACE_ENV_SINGLE_ARG_DECL_WITH_DEFAULTS
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ )) = 0;
+
+ static void _get_base_interfaces_skel (
+ TAO_ServerRequest & server_request,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL
+ );
+
+ // TAO_IDL - Generated from
+ // be\be_visitor_operation/operation_sh.cpp:45
+
+ virtual void base_interfaces (
+ const ::CORBA::InterfaceDefSeq & base_interfaces
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ )) = 0;
+
+ static void _set_base_interfaces_skel (
+ TAO_ServerRequest & server_request,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL
+ );
+
+ // TAO_IDL - Generated from
+ // be\be_visitor_operation/operation_sh.cpp:45
+
+ virtual ::CORBA::Boolean is_a (
+ const char * interface_id
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ )) = 0;
+
+ static void is_a_skel (
+ TAO_ServerRequest & server_request,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL
+ );
+
+ // TAO_IDL - Generated from
+ // be\be_visitor_operation/operation_sh.cpp:45
+
+ virtual ::CORBA::InterfaceDef::FullInterfaceDescription * describe_interface (
+ ACE_ENV_SINGLE_ARG_DECL_WITH_DEFAULTS
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ )) = 0;
+
+ static void describe_interface_skel (
+ TAO_ServerRequest & server_request,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL
+ );
+
+ // TAO_IDL - Generated from
+ // be\be_visitor_operation/operation_sh.cpp:45
+
+ virtual ::CORBA::AttributeDef_ptr create_attribute (
+ const char * id,
+ const char * name,
+ const char * version,
+ ::CORBA::IDLType_ptr type,
+ ::CORBA::AttributeMode mode
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ )) = 0;
+
+ static void create_attribute_skel (
+ TAO_ServerRequest & server_request,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL
+ );
+
+ // TAO_IDL - Generated from
+ // be\be_visitor_operation/operation_sh.cpp:45
+
+ virtual ::CORBA::OperationDef_ptr create_operation (
+ const char * id,
+ const char * name,
+ const char * version,
+ ::CORBA::IDLType_ptr result,
+ ::CORBA::OperationMode mode,
+ const ::CORBA::ParDescriptionSeq & params,
+ const ::CORBA::ExceptionDefSeq & exceptions,
+ const ::CORBA::ContextIdSeq & contexts
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ )) = 0;
+
+ static void create_operation_skel (
+ TAO_ServerRequest & server_request,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL
+ );
+
+ static void
+ _get_def_kind_skel (
+ TAO_ServerRequest & server_request,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS
+ );
+
+ // TAO_IDL - Generated from
+ // be\be_interface.cpp:1955
+
+ static void
+ destroy_skel (
+ TAO_ServerRequest & server_request,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS
+ );
+
+ // TAO_IDL - Generated from
+ // be\be_interface.cpp:1955
+
+ static void
+ lookup_skel (
+ TAO_ServerRequest & server_request,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS
+ );
+
+ // TAO_IDL - Generated from
+ // be\be_interface.cpp:1955
+
+ static void
+ contents_skel (
+ TAO_ServerRequest & server_request,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS
+ );
+
+ // TAO_IDL - Generated from
+ // be\be_interface.cpp:1955
+
+ static void
+ lookup_name_skel (
+ TAO_ServerRequest & server_request,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS
+ );
+
+ // TAO_IDL - Generated from
+ // be\be_interface.cpp:1955
+
+ static void
+ describe_contents_skel (
+ TAO_ServerRequest & server_request,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS
+ );
+
+ // TAO_IDL - Generated from
+ // be\be_interface.cpp:1955
+
+ static void
+ create_module_skel (
+ TAO_ServerRequest & server_request,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS
+ );
+
+ // TAO_IDL - Generated from
+ // be\be_interface.cpp:1955
+
+ static void
+ create_constant_skel (
+ TAO_ServerRequest & server_request,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS
+ );
+
+ // TAO_IDL - Generated from
+ // be\be_interface.cpp:1955
+
+ static void
+ create_struct_skel (
+ TAO_ServerRequest & server_request,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS
+ );
+
+ // TAO_IDL - Generated from
+ // be\be_interface.cpp:1955
+
+ static void
+ create_union_skel (
+ TAO_ServerRequest & server_request,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS
+ );
+
+ // TAO_IDL - Generated from
+ // be\be_interface.cpp:1955
+
+ static void
+ create_enum_skel (
+ TAO_ServerRequest & server_request,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS
+ );
+
+ // TAO_IDL - Generated from
+ // be\be_interface.cpp:1955
+
+ static void
+ create_alias_skel (
+ TAO_ServerRequest & server_request,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS
+ );
+
+ // TAO_IDL - Generated from
+ // be\be_interface.cpp:1955
+
+ static void
+ create_interface_skel (
+ TAO_ServerRequest & server_request,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS
+ );
+
+ // TAO_IDL - Generated from
+ // be\be_interface.cpp:1955
+
+ static void
+ create_value_skel (
+ TAO_ServerRequest & server_request,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS
+ );
+
+ // TAO_IDL - Generated from
+ // be\be_interface.cpp:1955
+
+ static void
+ create_value_box_skel (
+ TAO_ServerRequest & server_request,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS
+ );
+
+ // TAO_IDL - Generated from
+ // be\be_interface.cpp:1955
+
+ static void
+ create_exception_skel (
+ TAO_ServerRequest & server_request,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS
+ );
+
+ // TAO_IDL - Generated from
+ // be\be_interface.cpp:1955
+
+ static void
+ create_native_skel (
+ TAO_ServerRequest & server_request,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS
+ );
+
+ // TAO_IDL - Generated from
+ // be\be_interface.cpp:1955
+
+ static void
+ create_abstract_interface_skel (
+ TAO_ServerRequest & server_request,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS
+ );
+
+ // TAO_IDL - Generated from
+ // be\be_interface.cpp:1955
+
+ static void
+ create_local_interface_skel (
+ TAO_ServerRequest & server_request,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS
+ );
+
+ // TAO_IDL - Generated from
+ // be\be_interface.cpp:1955
+
+ static void
+ create_ext_value_skel (
+ TAO_ServerRequest & server_request,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS
+ );
+
+ static void
+ _get_id_skel (
+ TAO_ServerRequest & server_request,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS
+ );
+
+ static void
+ _set_id_skel (
+ TAO_ServerRequest & server_request,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS
+ );
+
+ static void
+ _get_name_skel (
+ TAO_ServerRequest & server_request,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS
+ );
+
+ static void
+ _set_name_skel (
+ TAO_ServerRequest & server_request,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS
+ );
+
+ static void
+ _get_version_skel (
+ TAO_ServerRequest & server_request,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS
+ );
+
+ static void
+ _set_version_skel (
+ TAO_ServerRequest & server_request,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS
+ );
+
+ static void
+ _get_defined_in_skel (
+ TAO_ServerRequest & server_request,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS
+ );
+
+ static void
+ _get_absolute_name_skel (
+ TAO_ServerRequest & server_request,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS
+ );
+
+ static void
+ _get_containing_repository_skel (
+ TAO_ServerRequest & server_request,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS
+ );
+
+ // TAO_IDL - Generated from
+ // be\be_interface.cpp:1955
+
+ static void
+ describe_skel (
+ TAO_ServerRequest & server_request,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS
+ );
+
+ // TAO_IDL - Generated from
+ // be\be_interface.cpp:1955
+
+ static void
+ move_skel (
+ TAO_ServerRequest & server_request,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS
+ );
+
+ static void
+ _get_type_skel (
+ TAO_ServerRequest & server_request,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS
+ );
+ };
+
+ // TAO_IDL - Generated from
+ // be\be_visitor_interface/interface_sh.cpp:87
+
+ class InterfaceAttrExtension;
+ typedef InterfaceAttrExtension *InterfaceAttrExtension_ptr;
+
+ class InterfaceAttrExtension
+ : public virtual PortableServer::ServantBase
+ {
+ protected:
+ InterfaceAttrExtension (void);
+
+ public:
+ // Useful for template programming.
+ typedef ::CORBA::InterfaceAttrExtension _stub_type;
+ typedef ::CORBA::InterfaceAttrExtension_ptr _stub_ptr_type;
+ typedef ::CORBA::InterfaceAttrExtension_var _stub_var_type;
+
+ InterfaceAttrExtension (const InterfaceAttrExtension& rhs);
+ virtual ~InterfaceAttrExtension (void);
+
+ virtual ::CORBA::Boolean _is_a (
+ const char* logical_type_id
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS
+ );
+
+ static void _is_a_skel (
+ TAO_ServerRequest & req,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL
+ );
+
+ static void _non_existent_skel (
+ TAO_ServerRequest & req,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL
+ );
+
+ static void _interface_skel (
+ TAO_ServerRequest & req,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL
+ );
+
+ static void _component_skel (
+ TAO_ServerRequest & req,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL
+ );
+
+ static void _repository_id_skel (
+ TAO_ServerRequest & req,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL
+ );
+
+ virtual void _dispatch (
+ TAO_ServerRequest & req,
+ void * servant_upcall
+ ACE_ENV_ARG_DECL
+ );
+
+ ::CORBA::InterfaceAttrExtension *_this (
+
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS
+ );
+
+ virtual const char* _interface_repository_id (void) const;
+
+ // TAO_IDL - Generated from
+ // be\be_visitor_operation/operation_sh.cpp:45
+
+ virtual ::CORBA::InterfaceAttrExtension::ExtFullInterfaceDescription * describe_ext_interface (
+ ACE_ENV_SINGLE_ARG_DECL_WITH_DEFAULTS
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ )) = 0;
+
+ static void describe_ext_interface_skel (
+ TAO_ServerRequest & server_request,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL
+ );
+
+ // TAO_IDL - Generated from
+ // be\be_visitor_operation/operation_sh.cpp:45
+
+ virtual ::CORBA::ExtAttributeDef_ptr create_ext_attribute (
+ const char * id,
+ const char * name,
+ const char * version,
+ ::CORBA::IDLType_ptr type,
+ ::CORBA::AttributeMode mode,
+ const ::CORBA::ExceptionDefSeq & get_exceptions,
+ const ::CORBA::ExceptionDefSeq & set_exceptions
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ )) = 0;
+
+ static void create_ext_attribute_skel (
+ TAO_ServerRequest & server_request,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL
+ );
+ };
+
+ // TAO_IDL - Generated from
+ // be\be_visitor_interface/interface_sh.cpp:87
+
+ class ExtInterfaceDef;
+ typedef ExtInterfaceDef *ExtInterfaceDef_ptr;
+
+ class ExtInterfaceDef
+ : public virtual POA_CORBA::InterfaceDef,
+ public virtual POA_CORBA::InterfaceAttrExtension
+ {
+ protected:
+ ExtInterfaceDef (void);
+
+ public:
+ // Useful for template programming.
+ typedef ::CORBA::ExtInterfaceDef _stub_type;
+ typedef ::CORBA::ExtInterfaceDef_ptr _stub_ptr_type;
+ typedef ::CORBA::ExtInterfaceDef_var _stub_var_type;
+
+ ExtInterfaceDef (const ExtInterfaceDef& rhs);
+ virtual ~ExtInterfaceDef (void);
+
+ virtual ::CORBA::Boolean _is_a (
+ const char* logical_type_id
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS
+ );
+
+ static void _is_a_skel (
+ TAO_ServerRequest & req,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL
+ );
+
+ static void _non_existent_skel (
+ TAO_ServerRequest & req,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL
+ );
+
+ static void _interface_skel (
+ TAO_ServerRequest & req,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL
+ );
+
+ static void _component_skel (
+ TAO_ServerRequest & req,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL
+ );
+
+ static void _repository_id_skel (
+ TAO_ServerRequest & req,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL
+ );
+
+ virtual void _dispatch (
+ TAO_ServerRequest & req,
+ void * servant_upcall
+ ACE_ENV_ARG_DECL
+ );
+
+ ::CORBA::ExtInterfaceDef *_this (
+
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS
+ );
+
+ virtual const char* _interface_repository_id (void) const;
+
+ static void
+ _get_def_kind_skel (
+ TAO_ServerRequest & server_request,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS
+ );
+
+ // TAO_IDL - Generated from
+ // be\be_interface.cpp:1955
+
+ static void
+ destroy_skel (
+ TAO_ServerRequest & server_request,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS
+ );
+
+ // TAO_IDL - Generated from
+ // be\be_interface.cpp:1955
+
+ static void
+ lookup_skel (
+ TAO_ServerRequest & server_request,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS
+ );
+
+ // TAO_IDL - Generated from
+ // be\be_interface.cpp:1955
+
+ static void
+ contents_skel (
+ TAO_ServerRequest & server_request,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS
+ );
+
+ // TAO_IDL - Generated from
+ // be\be_interface.cpp:1955
+
+ static void
+ lookup_name_skel (
+ TAO_ServerRequest & server_request,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS
+ );
+
+ // TAO_IDL - Generated from
+ // be\be_interface.cpp:1955
+
+ static void
+ describe_contents_skel (
+ TAO_ServerRequest & server_request,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS
+ );
+
+ // TAO_IDL - Generated from
+ // be\be_interface.cpp:1955
+
+ static void
+ create_module_skel (
+ TAO_ServerRequest & server_request,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS
+ );
+
+ // TAO_IDL - Generated from
+ // be\be_interface.cpp:1955
+
+ static void
+ create_constant_skel (
+ TAO_ServerRequest & server_request,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS
+ );
+
+ // TAO_IDL - Generated from
+ // be\be_interface.cpp:1955
+
+ static void
+ create_struct_skel (
+ TAO_ServerRequest & server_request,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS
+ );
+
+ // TAO_IDL - Generated from
+ // be\be_interface.cpp:1955
+
+ static void
+ create_union_skel (
+ TAO_ServerRequest & server_request,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS
+ );
+
+ // TAO_IDL - Generated from
+ // be\be_interface.cpp:1955
+
+ static void
+ create_enum_skel (
+ TAO_ServerRequest & server_request,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS
+ );
+
+ // TAO_IDL - Generated from
+ // be\be_interface.cpp:1955
+
+ static void
+ create_alias_skel (
+ TAO_ServerRequest & server_request,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS
+ );
+
+ // TAO_IDL - Generated from
+ // be\be_interface.cpp:1955
+
+ static void
+ create_interface_skel (
+ TAO_ServerRequest & server_request,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS
+ );
+
+ // TAO_IDL - Generated from
+ // be\be_interface.cpp:1955
+
+ static void
+ create_value_skel (
+ TAO_ServerRequest & server_request,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS
+ );
+
+ // TAO_IDL - Generated from
+ // be\be_interface.cpp:1955
+
+ static void
+ create_value_box_skel (
+ TAO_ServerRequest & server_request,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS
+ );
+
+ // TAO_IDL - Generated from
+ // be\be_interface.cpp:1955
+
+ static void
+ create_exception_skel (
+ TAO_ServerRequest & server_request,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS
+ );
+
+ // TAO_IDL - Generated from
+ // be\be_interface.cpp:1955
+
+ static void
+ create_native_skel (
+ TAO_ServerRequest & server_request,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS
+ );
+
+ // TAO_IDL - Generated from
+ // be\be_interface.cpp:1955
+
+ static void
+ create_abstract_interface_skel (
+ TAO_ServerRequest & server_request,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS
+ );
+
+ // TAO_IDL - Generated from
+ // be\be_interface.cpp:1955
+
+ static void
+ create_local_interface_skel (
+ TAO_ServerRequest & server_request,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS
+ );
+
+ // TAO_IDL - Generated from
+ // be\be_interface.cpp:1955
+
+ static void
+ create_ext_value_skel (
+ TAO_ServerRequest & server_request,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS
+ );
+
+ static void
+ _get_id_skel (
+ TAO_ServerRequest & server_request,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS
+ );
+
+ static void
+ _set_id_skel (
+ TAO_ServerRequest & server_request,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS
+ );
+
+ static void
+ _get_name_skel (
+ TAO_ServerRequest & server_request,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS
+ );
+
+ static void
+ _set_name_skel (
+ TAO_ServerRequest & server_request,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS
+ );
+
+ static void
+ _get_version_skel (
+ TAO_ServerRequest & server_request,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS
+ );
+
+ static void
+ _set_version_skel (
+ TAO_ServerRequest & server_request,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS
+ );
+
+ static void
+ _get_defined_in_skel (
+ TAO_ServerRequest & server_request,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS
+ );
+
+ static void
+ _get_absolute_name_skel (
+ TAO_ServerRequest & server_request,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS
+ );
+
+ static void
+ _get_containing_repository_skel (
+ TAO_ServerRequest & server_request,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS
+ );
+
+ // TAO_IDL - Generated from
+ // be\be_interface.cpp:1955
+
+ static void
+ describe_skel (
+ TAO_ServerRequest & server_request,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS
+ );
+
+ // TAO_IDL - Generated from
+ // be\be_interface.cpp:1955
+
+ static void
+ move_skel (
+ TAO_ServerRequest & server_request,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS
+ );
+
+ static void
+ _get_type_skel (
+ TAO_ServerRequest & server_request,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS
+ );
+
+ static void
+ _get_base_interfaces_skel (
+ TAO_ServerRequest & server_request,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS
+ );
+
+ static void
+ _set_base_interfaces_skel (
+ TAO_ServerRequest & server_request,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS
+ );
+
+ // TAO_IDL - Generated from
+ // be\be_interface.cpp:1955
+
+ static void
+ is_a_skel (
+ TAO_ServerRequest & server_request,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS
+ );
+
+ // TAO_IDL - Generated from
+ // be\be_interface.cpp:1955
+
+ static void
+ describe_interface_skel (
+ TAO_ServerRequest & server_request,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS
+ );
+
+ // TAO_IDL - Generated from
+ // be\be_interface.cpp:1955
+
+ static void
+ create_attribute_skel (
+ TAO_ServerRequest & server_request,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS
+ );
+
+ // TAO_IDL - Generated from
+ // be\be_interface.cpp:1955
+
+ static void
+ create_operation_skel (
+ TAO_ServerRequest & server_request,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS
+ );
+
+ // TAO_IDL - Generated from
+ // be\be_interface.cpp:1955
+
+ static void
+ describe_ext_interface_skel (
+ TAO_ServerRequest & server_request,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS
+ );
+
+ // TAO_IDL - Generated from
+ // be\be_interface.cpp:1955
+
+ static void
+ create_ext_attribute_skel (
+ TAO_ServerRequest & server_request,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS
+ );
+ };
+
+ // TAO_IDL - Generated from
+ // be\be_visitor_interface/interface_sh.cpp:87
+
+ class AbstractInterfaceDef;
+ typedef AbstractInterfaceDef *AbstractInterfaceDef_ptr;
+
+ class AbstractInterfaceDef
+ : public virtual POA_CORBA::InterfaceDef
+ {
+ protected:
+ AbstractInterfaceDef (void);
+
+ public:
+ // Useful for template programming.
+ typedef ::CORBA::AbstractInterfaceDef _stub_type;
+ typedef ::CORBA::AbstractInterfaceDef_ptr _stub_ptr_type;
+ typedef ::CORBA::AbstractInterfaceDef_var _stub_var_type;
+
+ AbstractInterfaceDef (const AbstractInterfaceDef& rhs);
+ virtual ~AbstractInterfaceDef (void);
+
+ virtual ::CORBA::Boolean _is_a (
+ const char* logical_type_id
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS
+ );
+
+ static void _is_a_skel (
+ TAO_ServerRequest & req,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL
+ );
+
+ static void _non_existent_skel (
+ TAO_ServerRequest & req,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL
+ );
+
+ static void _interface_skel (
+ TAO_ServerRequest & req,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL
+ );
+
+ static void _component_skel (
+ TAO_ServerRequest & req,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL
+ );
+
+ static void _repository_id_skel (
+ TAO_ServerRequest & req,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL
+ );
+
+ virtual void _dispatch (
+ TAO_ServerRequest & req,
+ void * servant_upcall
+ ACE_ENV_ARG_DECL
+ );
+
+ ::CORBA::AbstractInterfaceDef *_this (
+
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS
+ );
+
+ virtual const char* _interface_repository_id (void) const;
+
+ static void
+ _get_def_kind_skel (
+ TAO_ServerRequest & server_request,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS
+ );
+
+ // TAO_IDL - Generated from
+ // be\be_interface.cpp:1955
+
+ static void
+ destroy_skel (
+ TAO_ServerRequest & server_request,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS
+ );
+
+ // TAO_IDL - Generated from
+ // be\be_interface.cpp:1955
+
+ static void
+ lookup_skel (
+ TAO_ServerRequest & server_request,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS
+ );
+
+ // TAO_IDL - Generated from
+ // be\be_interface.cpp:1955
+
+ static void
+ contents_skel (
+ TAO_ServerRequest & server_request,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS
+ );
+
+ // TAO_IDL - Generated from
+ // be\be_interface.cpp:1955
+
+ static void
+ lookup_name_skel (
+ TAO_ServerRequest & server_request,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS
+ );
+
+ // TAO_IDL - Generated from
+ // be\be_interface.cpp:1955
+
+ static void
+ describe_contents_skel (
+ TAO_ServerRequest & server_request,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS
+ );
+
+ // TAO_IDL - Generated from
+ // be\be_interface.cpp:1955
+
+ static void
+ create_module_skel (
+ TAO_ServerRequest & server_request,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS
+ );
+
+ // TAO_IDL - Generated from
+ // be\be_interface.cpp:1955
+
+ static void
+ create_constant_skel (
+ TAO_ServerRequest & server_request,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS
+ );
+
+ // TAO_IDL - Generated from
+ // be\be_interface.cpp:1955
+
+ static void
+ create_struct_skel (
+ TAO_ServerRequest & server_request,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS
+ );
+
+ // TAO_IDL - Generated from
+ // be\be_interface.cpp:1955
+
+ static void
+ create_union_skel (
+ TAO_ServerRequest & server_request,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS
+ );
+
+ // TAO_IDL - Generated from
+ // be\be_interface.cpp:1955
+
+ static void
+ create_enum_skel (
+ TAO_ServerRequest & server_request,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS
+ );
+
+ // TAO_IDL - Generated from
+ // be\be_interface.cpp:1955
+
+ static void
+ create_alias_skel (
+ TAO_ServerRequest & server_request,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS
+ );
+
+ // TAO_IDL - Generated from
+ // be\be_interface.cpp:1955
+
+ static void
+ create_interface_skel (
+ TAO_ServerRequest & server_request,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS
+ );
+
+ // TAO_IDL - Generated from
+ // be\be_interface.cpp:1955
+
+ static void
+ create_value_skel (
+ TAO_ServerRequest & server_request,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS
+ );
+
+ // TAO_IDL - Generated from
+ // be\be_interface.cpp:1955
+
+ static void
+ create_value_box_skel (
+ TAO_ServerRequest & server_request,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS
+ );
+
+ // TAO_IDL - Generated from
+ // be\be_interface.cpp:1955
+
+ static void
+ create_exception_skel (
+ TAO_ServerRequest & server_request,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS
+ );
+
+ // TAO_IDL - Generated from
+ // be\be_interface.cpp:1955
+
+ static void
+ create_native_skel (
+ TAO_ServerRequest & server_request,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS
+ );
+
+ // TAO_IDL - Generated from
+ // be\be_interface.cpp:1955
+
+ static void
+ create_abstract_interface_skel (
+ TAO_ServerRequest & server_request,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS
+ );
+
+ // TAO_IDL - Generated from
+ // be\be_interface.cpp:1955
+
+ static void
+ create_local_interface_skel (
+ TAO_ServerRequest & server_request,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS
+ );
+
+ // TAO_IDL - Generated from
+ // be\be_interface.cpp:1955
+
+ static void
+ create_ext_value_skel (
+ TAO_ServerRequest & server_request,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS
+ );
+
+ static void
+ _get_id_skel (
+ TAO_ServerRequest & server_request,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS
+ );
+
+ static void
+ _set_id_skel (
+ TAO_ServerRequest & server_request,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS
+ );
+
+ static void
+ _get_name_skel (
+ TAO_ServerRequest & server_request,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS
+ );
+
+ static void
+ _set_name_skel (
+ TAO_ServerRequest & server_request,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS
+ );
+
+ static void
+ _get_version_skel (
+ TAO_ServerRequest & server_request,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS
+ );
+
+ static void
+ _set_version_skel (
+ TAO_ServerRequest & server_request,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS
+ );
+
+ static void
+ _get_defined_in_skel (
+ TAO_ServerRequest & server_request,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS
+ );
+
+ static void
+ _get_absolute_name_skel (
+ TAO_ServerRequest & server_request,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS
+ );
+
+ static void
+ _get_containing_repository_skel (
+ TAO_ServerRequest & server_request,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS
+ );
+
+ // TAO_IDL - Generated from
+ // be\be_interface.cpp:1955
+
+ static void
+ describe_skel (
+ TAO_ServerRequest & server_request,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS
+ );
+
+ // TAO_IDL - Generated from
+ // be\be_interface.cpp:1955
+
+ static void
+ move_skel (
+ TAO_ServerRequest & server_request,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS
+ );
+
+ static void
+ _get_type_skel (
+ TAO_ServerRequest & server_request,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS
+ );
+
+ static void
+ _get_base_interfaces_skel (
+ TAO_ServerRequest & server_request,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS
+ );
+
+ static void
+ _set_base_interfaces_skel (
+ TAO_ServerRequest & server_request,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS
+ );
+
+ // TAO_IDL - Generated from
+ // be\be_interface.cpp:1955
+
+ static void
+ is_a_skel (
+ TAO_ServerRequest & server_request,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS
+ );
+
+ // TAO_IDL - Generated from
+ // be\be_interface.cpp:1955
+
+ static void
+ describe_interface_skel (
+ TAO_ServerRequest & server_request,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS
+ );
+
+ // TAO_IDL - Generated from
+ // be\be_interface.cpp:1955
+
+ static void
+ create_attribute_skel (
+ TAO_ServerRequest & server_request,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS
+ );
+
+ // TAO_IDL - Generated from
+ // be\be_interface.cpp:1955
+
+ static void
+ create_operation_skel (
+ TAO_ServerRequest & server_request,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS
+ );
+ };
+
+ // TAO_IDL - Generated from
+ // be\be_visitor_interface/interface_sh.cpp:87
+
+ class ExtAbstractInterfaceDef;
+ typedef ExtAbstractInterfaceDef *ExtAbstractInterfaceDef_ptr;
+
+ class ExtAbstractInterfaceDef
+ : public virtual POA_CORBA::AbstractInterfaceDef,
+ public virtual POA_CORBA::InterfaceAttrExtension
+ {
+ protected:
+ ExtAbstractInterfaceDef (void);
+
+ public:
+ // Useful for template programming.
+ typedef ::CORBA::ExtAbstractInterfaceDef _stub_type;
+ typedef ::CORBA::ExtAbstractInterfaceDef_ptr _stub_ptr_type;
+ typedef ::CORBA::ExtAbstractInterfaceDef_var _stub_var_type;
+
+ ExtAbstractInterfaceDef (const ExtAbstractInterfaceDef& rhs);
+ virtual ~ExtAbstractInterfaceDef (void);
+
+ virtual ::CORBA::Boolean _is_a (
+ const char* logical_type_id
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS
+ );
+
+ static void _is_a_skel (
+ TAO_ServerRequest & req,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL
+ );
+
+ static void _non_existent_skel (
+ TAO_ServerRequest & req,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL
+ );
+
+ static void _interface_skel (
+ TAO_ServerRequest & req,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL
+ );
+
+ static void _component_skel (
+ TAO_ServerRequest & req,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL
+ );
+
+ static void _repository_id_skel (
+ TAO_ServerRequest & req,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL
+ );
+
+ virtual void _dispatch (
+ TAO_ServerRequest & req,
+ void * servant_upcall
+ ACE_ENV_ARG_DECL
+ );
+
+ ::CORBA::ExtAbstractInterfaceDef *_this (
+
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS
+ );
+
+ virtual const char* _interface_repository_id (void) const;
+
+ static void
+ _get_def_kind_skel (
+ TAO_ServerRequest & server_request,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS
+ );
+
+ // TAO_IDL - Generated from
+ // be\be_interface.cpp:1955
+
+ static void
+ destroy_skel (
+ TAO_ServerRequest & server_request,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS
+ );
+
+ // TAO_IDL - Generated from
+ // be\be_interface.cpp:1955
+
+ static void
+ lookup_skel (
+ TAO_ServerRequest & server_request,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS
+ );
+
+ // TAO_IDL - Generated from
+ // be\be_interface.cpp:1955
+
+ static void
+ contents_skel (
+ TAO_ServerRequest & server_request,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS
+ );
+
+ // TAO_IDL - Generated from
+ // be\be_interface.cpp:1955
+
+ static void
+ lookup_name_skel (
+ TAO_ServerRequest & server_request,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS
+ );
+
+ // TAO_IDL - Generated from
+ // be\be_interface.cpp:1955
+
+ static void
+ describe_contents_skel (
+ TAO_ServerRequest & server_request,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS
+ );
+
+ // TAO_IDL - Generated from
+ // be\be_interface.cpp:1955
+
+ static void
+ create_module_skel (
+ TAO_ServerRequest & server_request,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS
+ );
+
+ // TAO_IDL - Generated from
+ // be\be_interface.cpp:1955
+
+ static void
+ create_constant_skel (
+ TAO_ServerRequest & server_request,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS
+ );
+
+ // TAO_IDL - Generated from
+ // be\be_interface.cpp:1955
+
+ static void
+ create_struct_skel (
+ TAO_ServerRequest & server_request,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS
+ );
+
+ // TAO_IDL - Generated from
+ // be\be_interface.cpp:1955
+
+ static void
+ create_union_skel (
+ TAO_ServerRequest & server_request,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS
+ );
+
+ // TAO_IDL - Generated from
+ // be\be_interface.cpp:1955
+
+ static void
+ create_enum_skel (
+ TAO_ServerRequest & server_request,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS
+ );
+
+ // TAO_IDL - Generated from
+ // be\be_interface.cpp:1955
+
+ static void
+ create_alias_skel (
+ TAO_ServerRequest & server_request,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS
+ );
+
+ // TAO_IDL - Generated from
+ // be\be_interface.cpp:1955
+
+ static void
+ create_interface_skel (
+ TAO_ServerRequest & server_request,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS
+ );
+
+ // TAO_IDL - Generated from
+ // be\be_interface.cpp:1955
+
+ static void
+ create_value_skel (
+ TAO_ServerRequest & server_request,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS
+ );
+
+ // TAO_IDL - Generated from
+ // be\be_interface.cpp:1955
+
+ static void
+ create_value_box_skel (
+ TAO_ServerRequest & server_request,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS
+ );
+
+ // TAO_IDL - Generated from
+ // be\be_interface.cpp:1955
+
+ static void
+ create_exception_skel (
+ TAO_ServerRequest & server_request,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS
+ );
+
+ // TAO_IDL - Generated from
+ // be\be_interface.cpp:1955
+
+ static void
+ create_native_skel (
+ TAO_ServerRequest & server_request,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS
+ );
+
+ // TAO_IDL - Generated from
+ // be\be_interface.cpp:1955
+
+ static void
+ create_abstract_interface_skel (
+ TAO_ServerRequest & server_request,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS
+ );
+
+ // TAO_IDL - Generated from
+ // be\be_interface.cpp:1955
+
+ static void
+ create_local_interface_skel (
+ TAO_ServerRequest & server_request,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS
+ );
+
+ // TAO_IDL - Generated from
+ // be\be_interface.cpp:1955
+
+ static void
+ create_ext_value_skel (
+ TAO_ServerRequest & server_request,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS
+ );
+
+ static void
+ _get_id_skel (
+ TAO_ServerRequest & server_request,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS
+ );
+
+ static void
+ _set_id_skel (
+ TAO_ServerRequest & server_request,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS
+ );
+
+ static void
+ _get_name_skel (
+ TAO_ServerRequest & server_request,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS
+ );
+
+ static void
+ _set_name_skel (
+ TAO_ServerRequest & server_request,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS
+ );
+
+ static void
+ _get_version_skel (
+ TAO_ServerRequest & server_request,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS
+ );
+
+ static void
+ _set_version_skel (
+ TAO_ServerRequest & server_request,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS
+ );
+
+ static void
+ _get_defined_in_skel (
+ TAO_ServerRequest & server_request,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS
+ );
+
+ static void
+ _get_absolute_name_skel (
+ TAO_ServerRequest & server_request,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS
+ );
+
+ static void
+ _get_containing_repository_skel (
+ TAO_ServerRequest & server_request,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS
+ );
+
+ // TAO_IDL - Generated from
+ // be\be_interface.cpp:1955
+
+ static void
+ describe_skel (
+ TAO_ServerRequest & server_request,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS
+ );
+
+ // TAO_IDL - Generated from
+ // be\be_interface.cpp:1955
+
+ static void
+ move_skel (
+ TAO_ServerRequest & server_request,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS
+ );
+
+ static void
+ _get_type_skel (
+ TAO_ServerRequest & server_request,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS
+ );
+
+ static void
+ _get_base_interfaces_skel (
+ TAO_ServerRequest & server_request,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS
+ );
+
+ static void
+ _set_base_interfaces_skel (
+ TAO_ServerRequest & server_request,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS
+ );
+
+ // TAO_IDL - Generated from
+ // be\be_interface.cpp:1955
+
+ static void
+ is_a_skel (
+ TAO_ServerRequest & server_request,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS
+ );
+
+ // TAO_IDL - Generated from
+ // be\be_interface.cpp:1955
+
+ static void
+ describe_interface_skel (
+ TAO_ServerRequest & server_request,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS
+ );
+
+ // TAO_IDL - Generated from
+ // be\be_interface.cpp:1955
+
+ static void
+ create_attribute_skel (
+ TAO_ServerRequest & server_request,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS
+ );
+
+ // TAO_IDL - Generated from
+ // be\be_interface.cpp:1955
+
+ static void
+ create_operation_skel (
+ TAO_ServerRequest & server_request,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS
+ );
+
+ // TAO_IDL - Generated from
+ // be\be_interface.cpp:1955
+
+ static void
+ describe_ext_interface_skel (
+ TAO_ServerRequest & server_request,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS
+ );
+
+ // TAO_IDL - Generated from
+ // be\be_interface.cpp:1955
+
+ static void
+ create_ext_attribute_skel (
+ TAO_ServerRequest & server_request,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS
+ );
+ };
+
+ // TAO_IDL - Generated from
+ // be\be_visitor_interface/interface_sh.cpp:87
+
+ class LocalInterfaceDef;
+ typedef LocalInterfaceDef *LocalInterfaceDef_ptr;
+
+ class LocalInterfaceDef
+ : public virtual POA_CORBA::InterfaceDef
+ {
+ protected:
+ LocalInterfaceDef (void);
+
+ public:
+ // Useful for template programming.
+ typedef ::CORBA::LocalInterfaceDef _stub_type;
+ typedef ::CORBA::LocalInterfaceDef_ptr _stub_ptr_type;
+ typedef ::CORBA::LocalInterfaceDef_var _stub_var_type;
+
+ LocalInterfaceDef (const LocalInterfaceDef& rhs);
+ virtual ~LocalInterfaceDef (void);
+
+ virtual ::CORBA::Boolean _is_a (
+ const char* logical_type_id
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS
+ );
+
+ static void _is_a_skel (
+ TAO_ServerRequest & req,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL
+ );
+
+ static void _non_existent_skel (
+ TAO_ServerRequest & req,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL
+ );
+
+ static void _interface_skel (
+ TAO_ServerRequest & req,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL
+ );
+
+ static void _component_skel (
+ TAO_ServerRequest & req,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL
+ );
+
+ static void _repository_id_skel (
+ TAO_ServerRequest & req,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL
+ );
+
+ virtual void _dispatch (
+ TAO_ServerRequest & req,
+ void * servant_upcall
+ ACE_ENV_ARG_DECL
+ );
+
+ ::CORBA::LocalInterfaceDef *_this (
+
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS
+ );
+
+ virtual const char* _interface_repository_id (void) const;
+
+ static void
+ _get_def_kind_skel (
+ TAO_ServerRequest & server_request,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS
+ );
+
+ // TAO_IDL - Generated from
+ // be\be_interface.cpp:1955
+
+ static void
+ destroy_skel (
+ TAO_ServerRequest & server_request,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS
+ );
+
+ // TAO_IDL - Generated from
+ // be\be_interface.cpp:1955
+
+ static void
+ lookup_skel (
+ TAO_ServerRequest & server_request,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS
+ );
+
+ // TAO_IDL - Generated from
+ // be\be_interface.cpp:1955
+
+ static void
+ contents_skel (
+ TAO_ServerRequest & server_request,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS
+ );
+
+ // TAO_IDL - Generated from
+ // be\be_interface.cpp:1955
+
+ static void
+ lookup_name_skel (
+ TAO_ServerRequest & server_request,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS
+ );
+
+ // TAO_IDL - Generated from
+ // be\be_interface.cpp:1955
+
+ static void
+ describe_contents_skel (
+ TAO_ServerRequest & server_request,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS
+ );
+
+ // TAO_IDL - Generated from
+ // be\be_interface.cpp:1955
+
+ static void
+ create_module_skel (
+ TAO_ServerRequest & server_request,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS
+ );
+
+ // TAO_IDL - Generated from
+ // be\be_interface.cpp:1955
+
+ static void
+ create_constant_skel (
+ TAO_ServerRequest & server_request,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS
+ );
+
+ // TAO_IDL - Generated from
+ // be\be_interface.cpp:1955
+
+ static void
+ create_struct_skel (
+ TAO_ServerRequest & server_request,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS
+ );
+
+ // TAO_IDL - Generated from
+ // be\be_interface.cpp:1955
+
+ static void
+ create_union_skel (
+ TAO_ServerRequest & server_request,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS
+ );
+
+ // TAO_IDL - Generated from
+ // be\be_interface.cpp:1955
+
+ static void
+ create_enum_skel (
+ TAO_ServerRequest & server_request,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS
+ );
+
+ // TAO_IDL - Generated from
+ // be\be_interface.cpp:1955
+
+ static void
+ create_alias_skel (
+ TAO_ServerRequest & server_request,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS
+ );
+
+ // TAO_IDL - Generated from
+ // be\be_interface.cpp:1955
+
+ static void
+ create_interface_skel (
+ TAO_ServerRequest & server_request,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS
+ );
+
+ // TAO_IDL - Generated from
+ // be\be_interface.cpp:1955
+
+ static void
+ create_value_skel (
+ TAO_ServerRequest & server_request,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS
+ );
+
+ // TAO_IDL - Generated from
+ // be\be_interface.cpp:1955
+
+ static void
+ create_value_box_skel (
+ TAO_ServerRequest & server_request,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS
+ );
+
+ // TAO_IDL - Generated from
+ // be\be_interface.cpp:1955
+
+ static void
+ create_exception_skel (
+ TAO_ServerRequest & server_request,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS
+ );
+
+ // TAO_IDL - Generated from
+ // be\be_interface.cpp:1955
+
+ static void
+ create_native_skel (
+ TAO_ServerRequest & server_request,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS
+ );
+
+ // TAO_IDL - Generated from
+ // be\be_interface.cpp:1955
+
+ static void
+ create_abstract_interface_skel (
+ TAO_ServerRequest & server_request,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS
+ );
+
+ // TAO_IDL - Generated from
+ // be\be_interface.cpp:1955
+
+ static void
+ create_local_interface_skel (
+ TAO_ServerRequest & server_request,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS
+ );
+
+ // TAO_IDL - Generated from
+ // be\be_interface.cpp:1955
+
+ static void
+ create_ext_value_skel (
+ TAO_ServerRequest & server_request,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS
+ );
+
+ static void
+ _get_id_skel (
+ TAO_ServerRequest & server_request,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS
+ );
+
+ static void
+ _set_id_skel (
+ TAO_ServerRequest & server_request,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS
+ );
+
+ static void
+ _get_name_skel (
+ TAO_ServerRequest & server_request,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS
+ );
+
+ static void
+ _set_name_skel (
+ TAO_ServerRequest & server_request,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS
+ );
+
+ static void
+ _get_version_skel (
+ TAO_ServerRequest & server_request,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS
+ );
+
+ static void
+ _set_version_skel (
+ TAO_ServerRequest & server_request,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS
+ );
+
+ static void
+ _get_defined_in_skel (
+ TAO_ServerRequest & server_request,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS
+ );
+
+ static void
+ _get_absolute_name_skel (
+ TAO_ServerRequest & server_request,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS
+ );
+
+ static void
+ _get_containing_repository_skel (
+ TAO_ServerRequest & server_request,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS
+ );
+
+ // TAO_IDL - Generated from
+ // be\be_interface.cpp:1955
+
+ static void
+ describe_skel (
+ TAO_ServerRequest & server_request,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS
+ );
+
+ // TAO_IDL - Generated from
+ // be\be_interface.cpp:1955
+
+ static void
+ move_skel (
+ TAO_ServerRequest & server_request,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS
+ );
+
+ static void
+ _get_type_skel (
+ TAO_ServerRequest & server_request,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS
+ );
+
+ static void
+ _get_base_interfaces_skel (
+ TAO_ServerRequest & server_request,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS
+ );
+
+ static void
+ _set_base_interfaces_skel (
+ TAO_ServerRequest & server_request,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS
+ );
+
+ // TAO_IDL - Generated from
+ // be\be_interface.cpp:1955
+
+ static void
+ is_a_skel (
+ TAO_ServerRequest & server_request,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS
+ );
+
+ // TAO_IDL - Generated from
+ // be\be_interface.cpp:1955
+
+ static void
+ describe_interface_skel (
+ TAO_ServerRequest & server_request,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS
+ );
+
+ // TAO_IDL - Generated from
+ // be\be_interface.cpp:1955
+
+ static void
+ create_attribute_skel (
+ TAO_ServerRequest & server_request,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS
+ );
+
+ // TAO_IDL - Generated from
+ // be\be_interface.cpp:1955
+
+ static void
+ create_operation_skel (
+ TAO_ServerRequest & server_request,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS
+ );
+ };
+
+ // TAO_IDL - Generated from
+ // be\be_visitor_interface/interface_sh.cpp:87
+
+ class ExtLocalInterfaceDef;
+ typedef ExtLocalInterfaceDef *ExtLocalInterfaceDef_ptr;
+
+ class ExtLocalInterfaceDef
+ : public virtual POA_CORBA::LocalInterfaceDef,
+ public virtual POA_CORBA::InterfaceAttrExtension
+ {
+ protected:
+ ExtLocalInterfaceDef (void);
+
+ public:
+ // Useful for template programming.
+ typedef ::CORBA::ExtLocalInterfaceDef _stub_type;
+ typedef ::CORBA::ExtLocalInterfaceDef_ptr _stub_ptr_type;
+ typedef ::CORBA::ExtLocalInterfaceDef_var _stub_var_type;
+
+ ExtLocalInterfaceDef (const ExtLocalInterfaceDef& rhs);
+ virtual ~ExtLocalInterfaceDef (void);
+
+ virtual ::CORBA::Boolean _is_a (
+ const char* logical_type_id
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS
+ );
+
+ static void _is_a_skel (
+ TAO_ServerRequest & req,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL
+ );
+
+ static void _non_existent_skel (
+ TAO_ServerRequest & req,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL
+ );
+
+ static void _interface_skel (
+ TAO_ServerRequest & req,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL
+ );
+
+ static void _component_skel (
+ TAO_ServerRequest & req,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL
+ );
+
+ static void _repository_id_skel (
+ TAO_ServerRequest & req,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL
+ );
+
+ virtual void _dispatch (
+ TAO_ServerRequest & req,
+ void * servant_upcall
+ ACE_ENV_ARG_DECL
+ );
+
+ ::CORBA::ExtLocalInterfaceDef *_this (
+
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS
+ );
+
+ virtual const char* _interface_repository_id (void) const;
+
+ static void
+ _get_def_kind_skel (
+ TAO_ServerRequest & server_request,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS
+ );
+
+ // TAO_IDL - Generated from
+ // be\be_interface.cpp:1955
+
+ static void
+ destroy_skel (
+ TAO_ServerRequest & server_request,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS
+ );
+
+ // TAO_IDL - Generated from
+ // be\be_interface.cpp:1955
+
+ static void
+ lookup_skel (
+ TAO_ServerRequest & server_request,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS
+ );
+
+ // TAO_IDL - Generated from
+ // be\be_interface.cpp:1955
+
+ static void
+ contents_skel (
+ TAO_ServerRequest & server_request,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS
+ );
+
+ // TAO_IDL - Generated from
+ // be\be_interface.cpp:1955
+
+ static void
+ lookup_name_skel (
+ TAO_ServerRequest & server_request,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS
+ );
+
+ // TAO_IDL - Generated from
+ // be\be_interface.cpp:1955
+
+ static void
+ describe_contents_skel (
+ TAO_ServerRequest & server_request,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS
+ );
+
+ // TAO_IDL - Generated from
+ // be\be_interface.cpp:1955
+
+ static void
+ create_module_skel (
+ TAO_ServerRequest & server_request,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS
+ );
+
+ // TAO_IDL - Generated from
+ // be\be_interface.cpp:1955
+
+ static void
+ create_constant_skel (
+ TAO_ServerRequest & server_request,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS
+ );
+
+ // TAO_IDL - Generated from
+ // be\be_interface.cpp:1955
+
+ static void
+ create_struct_skel (
+ TAO_ServerRequest & server_request,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS
+ );
+
+ // TAO_IDL - Generated from
+ // be\be_interface.cpp:1955
+
+ static void
+ create_union_skel (
+ TAO_ServerRequest & server_request,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS
+ );
+
+ // TAO_IDL - Generated from
+ // be\be_interface.cpp:1955
+
+ static void
+ create_enum_skel (
+ TAO_ServerRequest & server_request,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS
+ );
+
+ // TAO_IDL - Generated from
+ // be\be_interface.cpp:1955
+
+ static void
+ create_alias_skel (
+ TAO_ServerRequest & server_request,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS
+ );
+
+ // TAO_IDL - Generated from
+ // be\be_interface.cpp:1955
+
+ static void
+ create_interface_skel (
+ TAO_ServerRequest & server_request,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS
+ );
+
+ // TAO_IDL - Generated from
+ // be\be_interface.cpp:1955
+
+ static void
+ create_value_skel (
+ TAO_ServerRequest & server_request,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS
+ );
+
+ // TAO_IDL - Generated from
+ // be\be_interface.cpp:1955
+
+ static void
+ create_value_box_skel (
+ TAO_ServerRequest & server_request,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS
+ );
+
+ // TAO_IDL - Generated from
+ // be\be_interface.cpp:1955
+
+ static void
+ create_exception_skel (
+ TAO_ServerRequest & server_request,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS
+ );
+
+ // TAO_IDL - Generated from
+ // be\be_interface.cpp:1955
+
+ static void
+ create_native_skel (
+ TAO_ServerRequest & server_request,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS
+ );
+
+ // TAO_IDL - Generated from
+ // be\be_interface.cpp:1955
+
+ static void
+ create_abstract_interface_skel (
+ TAO_ServerRequest & server_request,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS
+ );
+
+ // TAO_IDL - Generated from
+ // be\be_interface.cpp:1955
+
+ static void
+ create_local_interface_skel (
+ TAO_ServerRequest & server_request,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS
+ );
+
+ // TAO_IDL - Generated from
+ // be\be_interface.cpp:1955
+
+ static void
+ create_ext_value_skel (
+ TAO_ServerRequest & server_request,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS
+ );
+
+ static void
+ _get_id_skel (
+ TAO_ServerRequest & server_request,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS
+ );
+
+ static void
+ _set_id_skel (
+ TAO_ServerRequest & server_request,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS
+ );
+
+ static void
+ _get_name_skel (
+ TAO_ServerRequest & server_request,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS
+ );
+
+ static void
+ _set_name_skel (
+ TAO_ServerRequest & server_request,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS
+ );
+
+ static void
+ _get_version_skel (
+ TAO_ServerRequest & server_request,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS
+ );
+
+ static void
+ _set_version_skel (
+ TAO_ServerRequest & server_request,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS
+ );
+
+ static void
+ _get_defined_in_skel (
+ TAO_ServerRequest & server_request,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS
+ );
+
+ static void
+ _get_absolute_name_skel (
+ TAO_ServerRequest & server_request,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS
+ );
+
+ static void
+ _get_containing_repository_skel (
+ TAO_ServerRequest & server_request,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS
+ );
+
+ // TAO_IDL - Generated from
+ // be\be_interface.cpp:1955
+
+ static void
+ describe_skel (
+ TAO_ServerRequest & server_request,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS
+ );
+
+ // TAO_IDL - Generated from
+ // be\be_interface.cpp:1955
+
+ static void
+ move_skel (
+ TAO_ServerRequest & server_request,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS
+ );
+
+ static void
+ _get_type_skel (
+ TAO_ServerRequest & server_request,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS
+ );
+
+ static void
+ _get_base_interfaces_skel (
+ TAO_ServerRequest & server_request,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS
+ );
+
+ static void
+ _set_base_interfaces_skel (
+ TAO_ServerRequest & server_request,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS
+ );
+
+ // TAO_IDL - Generated from
+ // be\be_interface.cpp:1955
+
+ static void
+ is_a_skel (
+ TAO_ServerRequest & server_request,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS
+ );
+
+ // TAO_IDL - Generated from
+ // be\be_interface.cpp:1955
+
+ static void
+ describe_interface_skel (
+ TAO_ServerRequest & server_request,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS
+ );
+
+ // TAO_IDL - Generated from
+ // be\be_interface.cpp:1955
+
+ static void
+ create_attribute_skel (
+ TAO_ServerRequest & server_request,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS
+ );
+
+ // TAO_IDL - Generated from
+ // be\be_interface.cpp:1955
+
+ static void
+ create_operation_skel (
+ TAO_ServerRequest & server_request,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS
+ );
+
+ // TAO_IDL - Generated from
+ // be\be_interface.cpp:1955
+
+ static void
+ describe_ext_interface_skel (
+ TAO_ServerRequest & server_request,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS
+ );
+
+ // TAO_IDL - Generated from
+ // be\be_interface.cpp:1955
+
+ static void
+ create_ext_attribute_skel (
+ TAO_ServerRequest & server_request,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS
+ );
+ };
+
+// TAO_IDL - Generated from
+// be\be_visitor_module/module_sh.cpp:80
+
+} // module CORBA
+
+// TAO_IDL - Generated from
+// be\be_codegen.cpp:1219
+
+
+
+TAO_END_VERSIONED_NAMESPACE_DECL
+
+#include "IFR_BasicS_T.h"
+
+#if defined (__ACE_INLINE__)
+#include "IFR_BasicS.inl"
+#endif /* defined INLINE */
+
+#include /**/ "ace/post.h"
+#endif /* ifndef */
+
diff --git a/TAO/orbsvcs/orbsvcs/IFRService/IFR_BasicS.inl b/TAO/orbsvcs/orbsvcs/IFRService/IFR_BasicS.inl
new file mode 100644
index 00000000000..302ffa66e28
--- /dev/null
+++ b/TAO/orbsvcs/orbsvcs/IFRService/IFR_BasicS.inl
@@ -0,0 +1,9663 @@
+// -*- C++ -*-
+//
+// $Id$
+
+// **** Code generated by the The ACE ORB (TAO) IDL Compiler ****
+// TAO and the TAO IDL Compiler have been developed by:
+// Center for Distributed Object Computing
+// Washington University
+// St. Louis, MO
+// USA
+// http://www.cs.wustl.edu/~schmidt/doc-center.html
+// and
+// Distributed Object Computing Laboratory
+// University of California at Irvine
+// Irvine, CA
+// USA
+// http://doc.ece.uci.edu/
+// and
+// Institute for Software Integrated Systems
+// Vanderbilt University
+// Nashville, TN
+// USA
+// http://www.isis.vanderbilt.edu/
+//
+// Information about TAO is available at:
+// http://www.cs.wustl.edu/~schmidt/TAO.html
+
+
+TAO_BEGIN_VERSIONED_NAMESPACE_DECL
+
+
+
+ACE_INLINE
+void
+POA_CORBA::Repository::_get_def_kind_skel (
+ TAO_ServerRequest & server_request,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL
+ )
+{
+ POA_CORBA::IRObject * const impl = static_cast<POA_CORBA::Repository *> (servant);
+ POA_CORBA::IRObject::_get_def_kind_skel (
+ server_request,
+ servant_upcall,
+ impl
+ ACE_ENV_ARG_PARAMETER
+ );
+}
+
+// TAO_IDL - Generated from
+// be\be_interface.cpp:1955
+
+ACE_INLINE
+void
+POA_CORBA::Repository::destroy_skel (
+ TAO_ServerRequest & server_request,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL
+ )
+{
+ POA_CORBA::IRObject * const impl = static_cast<POA_CORBA::Repository *> (servant);
+ POA_CORBA::IRObject::destroy_skel (
+ server_request,
+ servant_upcall,
+ impl
+ ACE_ENV_ARG_PARAMETER
+ );
+}
+
+// TAO_IDL - Generated from
+// be\be_interface.cpp:1955
+
+ACE_INLINE
+void
+POA_CORBA::Repository::lookup_skel (
+ TAO_ServerRequest & server_request,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL
+ )
+{
+ POA_CORBA::Container * const impl = static_cast<POA_CORBA::Repository *> (servant);
+ POA_CORBA::Container::lookup_skel (
+ server_request,
+ servant_upcall,
+ impl
+ ACE_ENV_ARG_PARAMETER
+ );
+}
+
+// TAO_IDL - Generated from
+// be\be_interface.cpp:1955
+
+ACE_INLINE
+void
+POA_CORBA::Repository::contents_skel (
+ TAO_ServerRequest & server_request,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL
+ )
+{
+ POA_CORBA::Container * const impl = static_cast<POA_CORBA::Repository *> (servant);
+ POA_CORBA::Container::contents_skel (
+ server_request,
+ servant_upcall,
+ impl
+ ACE_ENV_ARG_PARAMETER
+ );
+}
+
+// TAO_IDL - Generated from
+// be\be_interface.cpp:1955
+
+ACE_INLINE
+void
+POA_CORBA::Repository::lookup_name_skel (
+ TAO_ServerRequest & server_request,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL
+ )
+{
+ POA_CORBA::Container * const impl = static_cast<POA_CORBA::Repository *> (servant);
+ POA_CORBA::Container::lookup_name_skel (
+ server_request,
+ servant_upcall,
+ impl
+ ACE_ENV_ARG_PARAMETER
+ );
+}
+
+// TAO_IDL - Generated from
+// be\be_interface.cpp:1955
+
+ACE_INLINE
+void
+POA_CORBA::Repository::describe_contents_skel (
+ TAO_ServerRequest & server_request,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL
+ )
+{
+ POA_CORBA::Container * const impl = static_cast<POA_CORBA::Repository *> (servant);
+ POA_CORBA::Container::describe_contents_skel (
+ server_request,
+ servant_upcall,
+ impl
+ ACE_ENV_ARG_PARAMETER
+ );
+}
+
+// TAO_IDL - Generated from
+// be\be_interface.cpp:1955
+
+ACE_INLINE
+void
+POA_CORBA::Repository::create_module_skel (
+ TAO_ServerRequest & server_request,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL
+ )
+{
+ POA_CORBA::Container * const impl = static_cast<POA_CORBA::Repository *> (servant);
+ POA_CORBA::Container::create_module_skel (
+ server_request,
+ servant_upcall,
+ impl
+ ACE_ENV_ARG_PARAMETER
+ );
+}
+
+// TAO_IDL - Generated from
+// be\be_interface.cpp:1955
+
+ACE_INLINE
+void
+POA_CORBA::Repository::create_constant_skel (
+ TAO_ServerRequest & server_request,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL
+ )
+{
+ POA_CORBA::Container * const impl = static_cast<POA_CORBA::Repository *> (servant);
+ POA_CORBA::Container::create_constant_skel (
+ server_request,
+ servant_upcall,
+ impl
+ ACE_ENV_ARG_PARAMETER
+ );
+}
+
+// TAO_IDL - Generated from
+// be\be_interface.cpp:1955
+
+ACE_INLINE
+void
+POA_CORBA::Repository::create_struct_skel (
+ TAO_ServerRequest & server_request,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL
+ )
+{
+ POA_CORBA::Container * const impl = static_cast<POA_CORBA::Repository *> (servant);
+ POA_CORBA::Container::create_struct_skel (
+ server_request,
+ servant_upcall,
+ impl
+ ACE_ENV_ARG_PARAMETER
+ );
+}
+
+// TAO_IDL - Generated from
+// be\be_interface.cpp:1955
+
+ACE_INLINE
+void
+POA_CORBA::Repository::create_union_skel (
+ TAO_ServerRequest & server_request,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL
+ )
+{
+ POA_CORBA::Container * const impl = static_cast<POA_CORBA::Repository *> (servant);
+ POA_CORBA::Container::create_union_skel (
+ server_request,
+ servant_upcall,
+ impl
+ ACE_ENV_ARG_PARAMETER
+ );
+}
+
+// TAO_IDL - Generated from
+// be\be_interface.cpp:1955
+
+ACE_INLINE
+void
+POA_CORBA::Repository::create_enum_skel (
+ TAO_ServerRequest & server_request,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL
+ )
+{
+ POA_CORBA::Container * const impl = static_cast<POA_CORBA::Repository *> (servant);
+ POA_CORBA::Container::create_enum_skel (
+ server_request,
+ servant_upcall,
+ impl
+ ACE_ENV_ARG_PARAMETER
+ );
+}
+
+// TAO_IDL - Generated from
+// be\be_interface.cpp:1955
+
+ACE_INLINE
+void
+POA_CORBA::Repository::create_alias_skel (
+ TAO_ServerRequest & server_request,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL
+ )
+{
+ POA_CORBA::Container * const impl = static_cast<POA_CORBA::Repository *> (servant);
+ POA_CORBA::Container::create_alias_skel (
+ server_request,
+ servant_upcall,
+ impl
+ ACE_ENV_ARG_PARAMETER
+ );
+}
+
+// TAO_IDL - Generated from
+// be\be_interface.cpp:1955
+
+ACE_INLINE
+void
+POA_CORBA::Repository::create_interface_skel (
+ TAO_ServerRequest & server_request,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL
+ )
+{
+ POA_CORBA::Container * const impl = static_cast<POA_CORBA::Repository *> (servant);
+ POA_CORBA::Container::create_interface_skel (
+ server_request,
+ servant_upcall,
+ impl
+ ACE_ENV_ARG_PARAMETER
+ );
+}
+
+// TAO_IDL - Generated from
+// be\be_interface.cpp:1955
+
+ACE_INLINE
+void
+POA_CORBA::Repository::create_value_skel (
+ TAO_ServerRequest & server_request,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL
+ )
+{
+ POA_CORBA::Container * const impl = static_cast<POA_CORBA::Repository *> (servant);
+ POA_CORBA::Container::create_value_skel (
+ server_request,
+ servant_upcall,
+ impl
+ ACE_ENV_ARG_PARAMETER
+ );
+}
+
+// TAO_IDL - Generated from
+// be\be_interface.cpp:1955
+
+ACE_INLINE
+void
+POA_CORBA::Repository::create_value_box_skel (
+ TAO_ServerRequest & server_request,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL
+ )
+{
+ POA_CORBA::Container * const impl = static_cast<POA_CORBA::Repository *> (servant);
+ POA_CORBA::Container::create_value_box_skel (
+ server_request,
+ servant_upcall,
+ impl
+ ACE_ENV_ARG_PARAMETER
+ );
+}
+
+// TAO_IDL - Generated from
+// be\be_interface.cpp:1955
+
+ACE_INLINE
+void
+POA_CORBA::Repository::create_exception_skel (
+ TAO_ServerRequest & server_request,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL
+ )
+{
+ POA_CORBA::Container * const impl = static_cast<POA_CORBA::Repository *> (servant);
+ POA_CORBA::Container::create_exception_skel (
+ server_request,
+ servant_upcall,
+ impl
+ ACE_ENV_ARG_PARAMETER
+ );
+}
+
+// TAO_IDL - Generated from
+// be\be_interface.cpp:1955
+
+ACE_INLINE
+void
+POA_CORBA::Repository::create_native_skel (
+ TAO_ServerRequest & server_request,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL
+ )
+{
+ POA_CORBA::Container * const impl = static_cast<POA_CORBA::Repository *> (servant);
+ POA_CORBA::Container::create_native_skel (
+ server_request,
+ servant_upcall,
+ impl
+ ACE_ENV_ARG_PARAMETER
+ );
+}
+
+// TAO_IDL - Generated from
+// be\be_interface.cpp:1955
+
+ACE_INLINE
+void
+POA_CORBA::Repository::create_abstract_interface_skel (
+ TAO_ServerRequest & server_request,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL
+ )
+{
+ POA_CORBA::Container * const impl = static_cast<POA_CORBA::Repository *> (servant);
+ POA_CORBA::Container::create_abstract_interface_skel (
+ server_request,
+ servant_upcall,
+ impl
+ ACE_ENV_ARG_PARAMETER
+ );
+}
+
+// TAO_IDL - Generated from
+// be\be_interface.cpp:1955
+
+ACE_INLINE
+void
+POA_CORBA::Repository::create_local_interface_skel (
+ TAO_ServerRequest & server_request,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL
+ )
+{
+ POA_CORBA::Container * const impl = static_cast<POA_CORBA::Repository *> (servant);
+ POA_CORBA::Container::create_local_interface_skel (
+ server_request,
+ servant_upcall,
+ impl
+ ACE_ENV_ARG_PARAMETER
+ );
+}
+
+// TAO_IDL - Generated from
+// be\be_interface.cpp:1955
+
+ACE_INLINE
+void
+POA_CORBA::Repository::create_ext_value_skel (
+ TAO_ServerRequest & server_request,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL
+ )
+{
+ POA_CORBA::Container * const impl = static_cast<POA_CORBA::Repository *> (servant);
+ POA_CORBA::Container::create_ext_value_skel (
+ server_request,
+ servant_upcall,
+ impl
+ ACE_ENV_ARG_PARAMETER
+ );
+}
+
+ACE_INLINE
+void
+POA_CORBA::ModuleDef::_get_def_kind_skel (
+ TAO_ServerRequest & server_request,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL
+ )
+{
+ POA_CORBA::IRObject * const impl = static_cast<POA_CORBA::ModuleDef *> (servant);
+ POA_CORBA::IRObject::_get_def_kind_skel (
+ server_request,
+ servant_upcall,
+ impl
+ ACE_ENV_ARG_PARAMETER
+ );
+}
+
+// TAO_IDL - Generated from
+// be\be_interface.cpp:1955
+
+ACE_INLINE
+void
+POA_CORBA::ModuleDef::destroy_skel (
+ TAO_ServerRequest & server_request,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL
+ )
+{
+ POA_CORBA::IRObject * const impl = static_cast<POA_CORBA::ModuleDef *> (servant);
+ POA_CORBA::IRObject::destroy_skel (
+ server_request,
+ servant_upcall,
+ impl
+ ACE_ENV_ARG_PARAMETER
+ );
+}
+
+// TAO_IDL - Generated from
+// be\be_interface.cpp:1955
+
+ACE_INLINE
+void
+POA_CORBA::ModuleDef::lookup_skel (
+ TAO_ServerRequest & server_request,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL
+ )
+{
+ POA_CORBA::Container * const impl = static_cast<POA_CORBA::ModuleDef *> (servant);
+ POA_CORBA::Container::lookup_skel (
+ server_request,
+ servant_upcall,
+ impl
+ ACE_ENV_ARG_PARAMETER
+ );
+}
+
+// TAO_IDL - Generated from
+// be\be_interface.cpp:1955
+
+ACE_INLINE
+void
+POA_CORBA::ModuleDef::contents_skel (
+ TAO_ServerRequest & server_request,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL
+ )
+{
+ POA_CORBA::Container * const impl = static_cast<POA_CORBA::ModuleDef *> (servant);
+ POA_CORBA::Container::contents_skel (
+ server_request,
+ servant_upcall,
+ impl
+ ACE_ENV_ARG_PARAMETER
+ );
+}
+
+// TAO_IDL - Generated from
+// be\be_interface.cpp:1955
+
+ACE_INLINE
+void
+POA_CORBA::ModuleDef::lookup_name_skel (
+ TAO_ServerRequest & server_request,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL
+ )
+{
+ POA_CORBA::Container * const impl = static_cast<POA_CORBA::ModuleDef *> (servant);
+ POA_CORBA::Container::lookup_name_skel (
+ server_request,
+ servant_upcall,
+ impl
+ ACE_ENV_ARG_PARAMETER
+ );
+}
+
+// TAO_IDL - Generated from
+// be\be_interface.cpp:1955
+
+ACE_INLINE
+void
+POA_CORBA::ModuleDef::describe_contents_skel (
+ TAO_ServerRequest & server_request,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL
+ )
+{
+ POA_CORBA::Container * const impl = static_cast<POA_CORBA::ModuleDef *> (servant);
+ POA_CORBA::Container::describe_contents_skel (
+ server_request,
+ servant_upcall,
+ impl
+ ACE_ENV_ARG_PARAMETER
+ );
+}
+
+// TAO_IDL - Generated from
+// be\be_interface.cpp:1955
+
+ACE_INLINE
+void
+POA_CORBA::ModuleDef::create_module_skel (
+ TAO_ServerRequest & server_request,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL
+ )
+{
+ POA_CORBA::Container * const impl = static_cast<POA_CORBA::ModuleDef *> (servant);
+ POA_CORBA::Container::create_module_skel (
+ server_request,
+ servant_upcall,
+ impl
+ ACE_ENV_ARG_PARAMETER
+ );
+}
+
+// TAO_IDL - Generated from
+// be\be_interface.cpp:1955
+
+ACE_INLINE
+void
+POA_CORBA::ModuleDef::create_constant_skel (
+ TAO_ServerRequest & server_request,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL
+ )
+{
+ POA_CORBA::Container * const impl = static_cast<POA_CORBA::ModuleDef *> (servant);
+ POA_CORBA::Container::create_constant_skel (
+ server_request,
+ servant_upcall,
+ impl
+ ACE_ENV_ARG_PARAMETER
+ );
+}
+
+// TAO_IDL - Generated from
+// be\be_interface.cpp:1955
+
+ACE_INLINE
+void
+POA_CORBA::ModuleDef::create_struct_skel (
+ TAO_ServerRequest & server_request,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL
+ )
+{
+ POA_CORBA::Container * const impl = static_cast<POA_CORBA::ModuleDef *> (servant);
+ POA_CORBA::Container::create_struct_skel (
+ server_request,
+ servant_upcall,
+ impl
+ ACE_ENV_ARG_PARAMETER
+ );
+}
+
+// TAO_IDL - Generated from
+// be\be_interface.cpp:1955
+
+ACE_INLINE
+void
+POA_CORBA::ModuleDef::create_union_skel (
+ TAO_ServerRequest & server_request,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL
+ )
+{
+ POA_CORBA::Container * const impl = static_cast<POA_CORBA::ModuleDef *> (servant);
+ POA_CORBA::Container::create_union_skel (
+ server_request,
+ servant_upcall,
+ impl
+ ACE_ENV_ARG_PARAMETER
+ );
+}
+
+// TAO_IDL - Generated from
+// be\be_interface.cpp:1955
+
+ACE_INLINE
+void
+POA_CORBA::ModuleDef::create_enum_skel (
+ TAO_ServerRequest & server_request,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL
+ )
+{
+ POA_CORBA::Container * const impl = static_cast<POA_CORBA::ModuleDef *> (servant);
+ POA_CORBA::Container::create_enum_skel (
+ server_request,
+ servant_upcall,
+ impl
+ ACE_ENV_ARG_PARAMETER
+ );
+}
+
+// TAO_IDL - Generated from
+// be\be_interface.cpp:1955
+
+ACE_INLINE
+void
+POA_CORBA::ModuleDef::create_alias_skel (
+ TAO_ServerRequest & server_request,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL
+ )
+{
+ POA_CORBA::Container * const impl = static_cast<POA_CORBA::ModuleDef *> (servant);
+ POA_CORBA::Container::create_alias_skel (
+ server_request,
+ servant_upcall,
+ impl
+ ACE_ENV_ARG_PARAMETER
+ );
+}
+
+// TAO_IDL - Generated from
+// be\be_interface.cpp:1955
+
+ACE_INLINE
+void
+POA_CORBA::ModuleDef::create_interface_skel (
+ TAO_ServerRequest & server_request,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL
+ )
+{
+ POA_CORBA::Container * const impl = static_cast<POA_CORBA::ModuleDef *> (servant);
+ POA_CORBA::Container::create_interface_skel (
+ server_request,
+ servant_upcall,
+ impl
+ ACE_ENV_ARG_PARAMETER
+ );
+}
+
+// TAO_IDL - Generated from
+// be\be_interface.cpp:1955
+
+ACE_INLINE
+void
+POA_CORBA::ModuleDef::create_value_skel (
+ TAO_ServerRequest & server_request,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL
+ )
+{
+ POA_CORBA::Container * const impl = static_cast<POA_CORBA::ModuleDef *> (servant);
+ POA_CORBA::Container::create_value_skel (
+ server_request,
+ servant_upcall,
+ impl
+ ACE_ENV_ARG_PARAMETER
+ );
+}
+
+// TAO_IDL - Generated from
+// be\be_interface.cpp:1955
+
+ACE_INLINE
+void
+POA_CORBA::ModuleDef::create_value_box_skel (
+ TAO_ServerRequest & server_request,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL
+ )
+{
+ POA_CORBA::Container * const impl = static_cast<POA_CORBA::ModuleDef *> (servant);
+ POA_CORBA::Container::create_value_box_skel (
+ server_request,
+ servant_upcall,
+ impl
+ ACE_ENV_ARG_PARAMETER
+ );
+}
+
+// TAO_IDL - Generated from
+// be\be_interface.cpp:1955
+
+ACE_INLINE
+void
+POA_CORBA::ModuleDef::create_exception_skel (
+ TAO_ServerRequest & server_request,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL
+ )
+{
+ POA_CORBA::Container * const impl = static_cast<POA_CORBA::ModuleDef *> (servant);
+ POA_CORBA::Container::create_exception_skel (
+ server_request,
+ servant_upcall,
+ impl
+ ACE_ENV_ARG_PARAMETER
+ );
+}
+
+// TAO_IDL - Generated from
+// be\be_interface.cpp:1955
+
+ACE_INLINE
+void
+POA_CORBA::ModuleDef::create_native_skel (
+ TAO_ServerRequest & server_request,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL
+ )
+{
+ POA_CORBA::Container * const impl = static_cast<POA_CORBA::ModuleDef *> (servant);
+ POA_CORBA::Container::create_native_skel (
+ server_request,
+ servant_upcall,
+ impl
+ ACE_ENV_ARG_PARAMETER
+ );
+}
+
+// TAO_IDL - Generated from
+// be\be_interface.cpp:1955
+
+ACE_INLINE
+void
+POA_CORBA::ModuleDef::create_abstract_interface_skel (
+ TAO_ServerRequest & server_request,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL
+ )
+{
+ POA_CORBA::Container * const impl = static_cast<POA_CORBA::ModuleDef *> (servant);
+ POA_CORBA::Container::create_abstract_interface_skel (
+ server_request,
+ servant_upcall,
+ impl
+ ACE_ENV_ARG_PARAMETER
+ );
+}
+
+// TAO_IDL - Generated from
+// be\be_interface.cpp:1955
+
+ACE_INLINE
+void
+POA_CORBA::ModuleDef::create_local_interface_skel (
+ TAO_ServerRequest & server_request,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL
+ )
+{
+ POA_CORBA::Container * const impl = static_cast<POA_CORBA::ModuleDef *> (servant);
+ POA_CORBA::Container::create_local_interface_skel (
+ server_request,
+ servant_upcall,
+ impl
+ ACE_ENV_ARG_PARAMETER
+ );
+}
+
+// TAO_IDL - Generated from
+// be\be_interface.cpp:1955
+
+ACE_INLINE
+void
+POA_CORBA::ModuleDef::create_ext_value_skel (
+ TAO_ServerRequest & server_request,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL
+ )
+{
+ POA_CORBA::Container * const impl = static_cast<POA_CORBA::ModuleDef *> (servant);
+ POA_CORBA::Container::create_ext_value_skel (
+ server_request,
+ servant_upcall,
+ impl
+ ACE_ENV_ARG_PARAMETER
+ );
+}
+
+ACE_INLINE
+void
+POA_CORBA::ModuleDef::_get_id_skel (
+ TAO_ServerRequest & server_request,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL
+ )
+{
+ POA_CORBA::Contained * const impl = static_cast<POA_CORBA::ModuleDef *> (servant);
+ POA_CORBA::Contained::_get_id_skel (
+ server_request,
+ servant_upcall,
+ impl
+ ACE_ENV_ARG_PARAMETER
+ );
+}
+
+ACE_INLINE
+void
+POA_CORBA::ModuleDef::_set_id_skel (
+ TAO_ServerRequest & server_request,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL
+ )
+{
+ POA_CORBA::Contained * const impl = static_cast<POA_CORBA::ModuleDef *> (servant);
+ POA_CORBA::Contained::_set_id_skel (
+ server_request,
+ servant_upcall,
+ impl
+ ACE_ENV_ARG_PARAMETER
+ );
+}
+
+ACE_INLINE
+void
+POA_CORBA::ModuleDef::_get_name_skel (
+ TAO_ServerRequest & server_request,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL
+ )
+{
+ POA_CORBA::Contained * const impl = static_cast<POA_CORBA::ModuleDef *> (servant);
+ POA_CORBA::Contained::_get_name_skel (
+ server_request,
+ servant_upcall,
+ impl
+ ACE_ENV_ARG_PARAMETER
+ );
+}
+
+ACE_INLINE
+void
+POA_CORBA::ModuleDef::_set_name_skel (
+ TAO_ServerRequest & server_request,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL
+ )
+{
+ POA_CORBA::Contained * const impl = static_cast<POA_CORBA::ModuleDef *> (servant);
+ POA_CORBA::Contained::_set_name_skel (
+ server_request,
+ servant_upcall,
+ impl
+ ACE_ENV_ARG_PARAMETER
+ );
+}
+
+ACE_INLINE
+void
+POA_CORBA::ModuleDef::_get_version_skel (
+ TAO_ServerRequest & server_request,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL
+ )
+{
+ POA_CORBA::Contained * const impl = static_cast<POA_CORBA::ModuleDef *> (servant);
+ POA_CORBA::Contained::_get_version_skel (
+ server_request,
+ servant_upcall,
+ impl
+ ACE_ENV_ARG_PARAMETER
+ );
+}
+
+ACE_INLINE
+void
+POA_CORBA::ModuleDef::_set_version_skel (
+ TAO_ServerRequest & server_request,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL
+ )
+{
+ POA_CORBA::Contained * const impl = static_cast<POA_CORBA::ModuleDef *> (servant);
+ POA_CORBA::Contained::_set_version_skel (
+ server_request,
+ servant_upcall,
+ impl
+ ACE_ENV_ARG_PARAMETER
+ );
+}
+
+ACE_INLINE
+void
+POA_CORBA::ModuleDef::_get_defined_in_skel (
+ TAO_ServerRequest & server_request,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL
+ )
+{
+ POA_CORBA::Contained * const impl = static_cast<POA_CORBA::ModuleDef *> (servant);
+ POA_CORBA::Contained::_get_defined_in_skel (
+ server_request,
+ servant_upcall,
+ impl
+ ACE_ENV_ARG_PARAMETER
+ );
+}
+
+ACE_INLINE
+void
+POA_CORBA::ModuleDef::_get_absolute_name_skel (
+ TAO_ServerRequest & server_request,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL
+ )
+{
+ POA_CORBA::Contained * const impl = static_cast<POA_CORBA::ModuleDef *> (servant);
+ POA_CORBA::Contained::_get_absolute_name_skel (
+ server_request,
+ servant_upcall,
+ impl
+ ACE_ENV_ARG_PARAMETER
+ );
+}
+
+ACE_INLINE
+void
+POA_CORBA::ModuleDef::_get_containing_repository_skel (
+ TAO_ServerRequest & server_request,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL
+ )
+{
+ POA_CORBA::Contained * const impl = static_cast<POA_CORBA::ModuleDef *> (servant);
+ POA_CORBA::Contained::_get_containing_repository_skel (
+ server_request,
+ servant_upcall,
+ impl
+ ACE_ENV_ARG_PARAMETER
+ );
+}
+
+// TAO_IDL - Generated from
+// be\be_interface.cpp:1955
+
+ACE_INLINE
+void
+POA_CORBA::ModuleDef::describe_skel (
+ TAO_ServerRequest & server_request,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL
+ )
+{
+ POA_CORBA::Contained * const impl = static_cast<POA_CORBA::ModuleDef *> (servant);
+ POA_CORBA::Contained::describe_skel (
+ server_request,
+ servant_upcall,
+ impl
+ ACE_ENV_ARG_PARAMETER
+ );
+}
+
+// TAO_IDL - Generated from
+// be\be_interface.cpp:1955
+
+ACE_INLINE
+void
+POA_CORBA::ModuleDef::move_skel (
+ TAO_ServerRequest & server_request,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL
+ )
+{
+ POA_CORBA::Contained * const impl = static_cast<POA_CORBA::ModuleDef *> (servant);
+ POA_CORBA::Contained::move_skel (
+ server_request,
+ servant_upcall,
+ impl
+ ACE_ENV_ARG_PARAMETER
+ );
+}
+
+ACE_INLINE
+void
+POA_CORBA::ConstantDef::_get_def_kind_skel (
+ TAO_ServerRequest & server_request,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL
+ )
+{
+ POA_CORBA::IRObject * const impl = static_cast<POA_CORBA::ConstantDef *> (servant);
+ POA_CORBA::IRObject::_get_def_kind_skel (
+ server_request,
+ servant_upcall,
+ impl
+ ACE_ENV_ARG_PARAMETER
+ );
+}
+
+// TAO_IDL - Generated from
+// be\be_interface.cpp:1955
+
+ACE_INLINE
+void
+POA_CORBA::ConstantDef::destroy_skel (
+ TAO_ServerRequest & server_request,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL
+ )
+{
+ POA_CORBA::IRObject * const impl = static_cast<POA_CORBA::ConstantDef *> (servant);
+ POA_CORBA::IRObject::destroy_skel (
+ server_request,
+ servant_upcall,
+ impl
+ ACE_ENV_ARG_PARAMETER
+ );
+}
+
+ACE_INLINE
+void
+POA_CORBA::ConstantDef::_get_id_skel (
+ TAO_ServerRequest & server_request,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL
+ )
+{
+ POA_CORBA::Contained * const impl = static_cast<POA_CORBA::ConstantDef *> (servant);
+ POA_CORBA::Contained::_get_id_skel (
+ server_request,
+ servant_upcall,
+ impl
+ ACE_ENV_ARG_PARAMETER
+ );
+}
+
+ACE_INLINE
+void
+POA_CORBA::ConstantDef::_set_id_skel (
+ TAO_ServerRequest & server_request,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL
+ )
+{
+ POA_CORBA::Contained * const impl = static_cast<POA_CORBA::ConstantDef *> (servant);
+ POA_CORBA::Contained::_set_id_skel (
+ server_request,
+ servant_upcall,
+ impl
+ ACE_ENV_ARG_PARAMETER
+ );
+}
+
+ACE_INLINE
+void
+POA_CORBA::ConstantDef::_get_name_skel (
+ TAO_ServerRequest & server_request,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL
+ )
+{
+ POA_CORBA::Contained * const impl = static_cast<POA_CORBA::ConstantDef *> (servant);
+ POA_CORBA::Contained::_get_name_skel (
+ server_request,
+ servant_upcall,
+ impl
+ ACE_ENV_ARG_PARAMETER
+ );
+}
+
+ACE_INLINE
+void
+POA_CORBA::ConstantDef::_set_name_skel (
+ TAO_ServerRequest & server_request,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL
+ )
+{
+ POA_CORBA::Contained * const impl = static_cast<POA_CORBA::ConstantDef *> (servant);
+ POA_CORBA::Contained::_set_name_skel (
+ server_request,
+ servant_upcall,
+ impl
+ ACE_ENV_ARG_PARAMETER
+ );
+}
+
+ACE_INLINE
+void
+POA_CORBA::ConstantDef::_get_version_skel (
+ TAO_ServerRequest & server_request,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL
+ )
+{
+ POA_CORBA::Contained * const impl = static_cast<POA_CORBA::ConstantDef *> (servant);
+ POA_CORBA::Contained::_get_version_skel (
+ server_request,
+ servant_upcall,
+ impl
+ ACE_ENV_ARG_PARAMETER
+ );
+}
+
+ACE_INLINE
+void
+POA_CORBA::ConstantDef::_set_version_skel (
+ TAO_ServerRequest & server_request,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL
+ )
+{
+ POA_CORBA::Contained * const impl = static_cast<POA_CORBA::ConstantDef *> (servant);
+ POA_CORBA::Contained::_set_version_skel (
+ server_request,
+ servant_upcall,
+ impl
+ ACE_ENV_ARG_PARAMETER
+ );
+}
+
+ACE_INLINE
+void
+POA_CORBA::ConstantDef::_get_defined_in_skel (
+ TAO_ServerRequest & server_request,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL
+ )
+{
+ POA_CORBA::Contained * const impl = static_cast<POA_CORBA::ConstantDef *> (servant);
+ POA_CORBA::Contained::_get_defined_in_skel (
+ server_request,
+ servant_upcall,
+ impl
+ ACE_ENV_ARG_PARAMETER
+ );
+}
+
+ACE_INLINE
+void
+POA_CORBA::ConstantDef::_get_absolute_name_skel (
+ TAO_ServerRequest & server_request,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL
+ )
+{
+ POA_CORBA::Contained * const impl = static_cast<POA_CORBA::ConstantDef *> (servant);
+ POA_CORBA::Contained::_get_absolute_name_skel (
+ server_request,
+ servant_upcall,
+ impl
+ ACE_ENV_ARG_PARAMETER
+ );
+}
+
+ACE_INLINE
+void
+POA_CORBA::ConstantDef::_get_containing_repository_skel (
+ TAO_ServerRequest & server_request,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL
+ )
+{
+ POA_CORBA::Contained * const impl = static_cast<POA_CORBA::ConstantDef *> (servant);
+ POA_CORBA::Contained::_get_containing_repository_skel (
+ server_request,
+ servant_upcall,
+ impl
+ ACE_ENV_ARG_PARAMETER
+ );
+}
+
+// TAO_IDL - Generated from
+// be\be_interface.cpp:1955
+
+ACE_INLINE
+void
+POA_CORBA::ConstantDef::describe_skel (
+ TAO_ServerRequest & server_request,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL
+ )
+{
+ POA_CORBA::Contained * const impl = static_cast<POA_CORBA::ConstantDef *> (servant);
+ POA_CORBA::Contained::describe_skel (
+ server_request,
+ servant_upcall,
+ impl
+ ACE_ENV_ARG_PARAMETER
+ );
+}
+
+// TAO_IDL - Generated from
+// be\be_interface.cpp:1955
+
+ACE_INLINE
+void
+POA_CORBA::ConstantDef::move_skel (
+ TAO_ServerRequest & server_request,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL
+ )
+{
+ POA_CORBA::Contained * const impl = static_cast<POA_CORBA::ConstantDef *> (servant);
+ POA_CORBA::Contained::move_skel (
+ server_request,
+ servant_upcall,
+ impl
+ ACE_ENV_ARG_PARAMETER
+ );
+}
+
+ACE_INLINE
+void
+POA_CORBA::StructDef::_get_def_kind_skel (
+ TAO_ServerRequest & server_request,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL
+ )
+{
+ POA_CORBA::IRObject * const impl = static_cast<POA_CORBA::StructDef *> (servant);
+ POA_CORBA::IRObject::_get_def_kind_skel (
+ server_request,
+ servant_upcall,
+ impl
+ ACE_ENV_ARG_PARAMETER
+ );
+}
+
+// TAO_IDL - Generated from
+// be\be_interface.cpp:1955
+
+ACE_INLINE
+void
+POA_CORBA::StructDef::destroy_skel (
+ TAO_ServerRequest & server_request,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL
+ )
+{
+ POA_CORBA::IRObject * const impl = static_cast<POA_CORBA::StructDef *> (servant);
+ POA_CORBA::IRObject::destroy_skel (
+ server_request,
+ servant_upcall,
+ impl
+ ACE_ENV_ARG_PARAMETER
+ );
+}
+
+ACE_INLINE
+void
+POA_CORBA::StructDef::_get_id_skel (
+ TAO_ServerRequest & server_request,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL
+ )
+{
+ POA_CORBA::Contained * const impl = static_cast<POA_CORBA::StructDef *> (servant);
+ POA_CORBA::Contained::_get_id_skel (
+ server_request,
+ servant_upcall,
+ impl
+ ACE_ENV_ARG_PARAMETER
+ );
+}
+
+ACE_INLINE
+void
+POA_CORBA::StructDef::_set_id_skel (
+ TAO_ServerRequest & server_request,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL
+ )
+{
+ POA_CORBA::Contained * const impl = static_cast<POA_CORBA::StructDef *> (servant);
+ POA_CORBA::Contained::_set_id_skel (
+ server_request,
+ servant_upcall,
+ impl
+ ACE_ENV_ARG_PARAMETER
+ );
+}
+
+ACE_INLINE
+void
+POA_CORBA::StructDef::_get_name_skel (
+ TAO_ServerRequest & server_request,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL
+ )
+{
+ POA_CORBA::Contained * const impl = static_cast<POA_CORBA::StructDef *> (servant);
+ POA_CORBA::Contained::_get_name_skel (
+ server_request,
+ servant_upcall,
+ impl
+ ACE_ENV_ARG_PARAMETER
+ );
+}
+
+ACE_INLINE
+void
+POA_CORBA::StructDef::_set_name_skel (
+ TAO_ServerRequest & server_request,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL
+ )
+{
+ POA_CORBA::Contained * const impl = static_cast<POA_CORBA::StructDef *> (servant);
+ POA_CORBA::Contained::_set_name_skel (
+ server_request,
+ servant_upcall,
+ impl
+ ACE_ENV_ARG_PARAMETER
+ );
+}
+
+ACE_INLINE
+void
+POA_CORBA::StructDef::_get_version_skel (
+ TAO_ServerRequest & server_request,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL
+ )
+{
+ POA_CORBA::Contained * const impl = static_cast<POA_CORBA::StructDef *> (servant);
+ POA_CORBA::Contained::_get_version_skel (
+ server_request,
+ servant_upcall,
+ impl
+ ACE_ENV_ARG_PARAMETER
+ );
+}
+
+ACE_INLINE
+void
+POA_CORBA::StructDef::_set_version_skel (
+ TAO_ServerRequest & server_request,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL
+ )
+{
+ POA_CORBA::Contained * const impl = static_cast<POA_CORBA::StructDef *> (servant);
+ POA_CORBA::Contained::_set_version_skel (
+ server_request,
+ servant_upcall,
+ impl
+ ACE_ENV_ARG_PARAMETER
+ );
+}
+
+ACE_INLINE
+void
+POA_CORBA::StructDef::_get_defined_in_skel (
+ TAO_ServerRequest & server_request,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL
+ )
+{
+ POA_CORBA::Contained * const impl = static_cast<POA_CORBA::StructDef *> (servant);
+ POA_CORBA::Contained::_get_defined_in_skel (
+ server_request,
+ servant_upcall,
+ impl
+ ACE_ENV_ARG_PARAMETER
+ );
+}
+
+ACE_INLINE
+void
+POA_CORBA::StructDef::_get_absolute_name_skel (
+ TAO_ServerRequest & server_request,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL
+ )
+{
+ POA_CORBA::Contained * const impl = static_cast<POA_CORBA::StructDef *> (servant);
+ POA_CORBA::Contained::_get_absolute_name_skel (
+ server_request,
+ servant_upcall,
+ impl
+ ACE_ENV_ARG_PARAMETER
+ );
+}
+
+ACE_INLINE
+void
+POA_CORBA::StructDef::_get_containing_repository_skel (
+ TAO_ServerRequest & server_request,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL
+ )
+{
+ POA_CORBA::Contained * const impl = static_cast<POA_CORBA::StructDef *> (servant);
+ POA_CORBA::Contained::_get_containing_repository_skel (
+ server_request,
+ servant_upcall,
+ impl
+ ACE_ENV_ARG_PARAMETER
+ );
+}
+
+// TAO_IDL - Generated from
+// be\be_interface.cpp:1955
+
+ACE_INLINE
+void
+POA_CORBA::StructDef::describe_skel (
+ TAO_ServerRequest & server_request,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL
+ )
+{
+ POA_CORBA::Contained * const impl = static_cast<POA_CORBA::StructDef *> (servant);
+ POA_CORBA::Contained::describe_skel (
+ server_request,
+ servant_upcall,
+ impl
+ ACE_ENV_ARG_PARAMETER
+ );
+}
+
+// TAO_IDL - Generated from
+// be\be_interface.cpp:1955
+
+ACE_INLINE
+void
+POA_CORBA::StructDef::move_skel (
+ TAO_ServerRequest & server_request,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL
+ )
+{
+ POA_CORBA::Contained * const impl = static_cast<POA_CORBA::StructDef *> (servant);
+ POA_CORBA::Contained::move_skel (
+ server_request,
+ servant_upcall,
+ impl
+ ACE_ENV_ARG_PARAMETER
+ );
+}
+
+ACE_INLINE
+void
+POA_CORBA::StructDef::_get_type_skel (
+ TAO_ServerRequest & server_request,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL
+ )
+{
+ POA_CORBA::IDLType * const impl = static_cast<POA_CORBA::StructDef *> (servant);
+ POA_CORBA::IDLType::_get_type_skel (
+ server_request,
+ servant_upcall,
+ impl
+ ACE_ENV_ARG_PARAMETER
+ );
+}
+
+// TAO_IDL - Generated from
+// be\be_interface.cpp:1955
+
+ACE_INLINE
+void
+POA_CORBA::StructDef::lookup_skel (
+ TAO_ServerRequest & server_request,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL
+ )
+{
+ POA_CORBA::Container * const impl = static_cast<POA_CORBA::StructDef *> (servant);
+ POA_CORBA::Container::lookup_skel (
+ server_request,
+ servant_upcall,
+ impl
+ ACE_ENV_ARG_PARAMETER
+ );
+}
+
+// TAO_IDL - Generated from
+// be\be_interface.cpp:1955
+
+ACE_INLINE
+void
+POA_CORBA::StructDef::contents_skel (
+ TAO_ServerRequest & server_request,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL
+ )
+{
+ POA_CORBA::Container * const impl = static_cast<POA_CORBA::StructDef *> (servant);
+ POA_CORBA::Container::contents_skel (
+ server_request,
+ servant_upcall,
+ impl
+ ACE_ENV_ARG_PARAMETER
+ );
+}
+
+// TAO_IDL - Generated from
+// be\be_interface.cpp:1955
+
+ACE_INLINE
+void
+POA_CORBA::StructDef::lookup_name_skel (
+ TAO_ServerRequest & server_request,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL
+ )
+{
+ POA_CORBA::Container * const impl = static_cast<POA_CORBA::StructDef *> (servant);
+ POA_CORBA::Container::lookup_name_skel (
+ server_request,
+ servant_upcall,
+ impl
+ ACE_ENV_ARG_PARAMETER
+ );
+}
+
+// TAO_IDL - Generated from
+// be\be_interface.cpp:1955
+
+ACE_INLINE
+void
+POA_CORBA::StructDef::describe_contents_skel (
+ TAO_ServerRequest & server_request,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL
+ )
+{
+ POA_CORBA::Container * const impl = static_cast<POA_CORBA::StructDef *> (servant);
+ POA_CORBA::Container::describe_contents_skel (
+ server_request,
+ servant_upcall,
+ impl
+ ACE_ENV_ARG_PARAMETER
+ );
+}
+
+// TAO_IDL - Generated from
+// be\be_interface.cpp:1955
+
+ACE_INLINE
+void
+POA_CORBA::StructDef::create_module_skel (
+ TAO_ServerRequest & server_request,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL
+ )
+{
+ POA_CORBA::Container * const impl = static_cast<POA_CORBA::StructDef *> (servant);
+ POA_CORBA::Container::create_module_skel (
+ server_request,
+ servant_upcall,
+ impl
+ ACE_ENV_ARG_PARAMETER
+ );
+}
+
+// TAO_IDL - Generated from
+// be\be_interface.cpp:1955
+
+ACE_INLINE
+void
+POA_CORBA::StructDef::create_constant_skel (
+ TAO_ServerRequest & server_request,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL
+ )
+{
+ POA_CORBA::Container * const impl = static_cast<POA_CORBA::StructDef *> (servant);
+ POA_CORBA::Container::create_constant_skel (
+ server_request,
+ servant_upcall,
+ impl
+ ACE_ENV_ARG_PARAMETER
+ );
+}
+
+// TAO_IDL - Generated from
+// be\be_interface.cpp:1955
+
+ACE_INLINE
+void
+POA_CORBA::StructDef::create_struct_skel (
+ TAO_ServerRequest & server_request,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL
+ )
+{
+ POA_CORBA::Container * const impl = static_cast<POA_CORBA::StructDef *> (servant);
+ POA_CORBA::Container::create_struct_skel (
+ server_request,
+ servant_upcall,
+ impl
+ ACE_ENV_ARG_PARAMETER
+ );
+}
+
+// TAO_IDL - Generated from
+// be\be_interface.cpp:1955
+
+ACE_INLINE
+void
+POA_CORBA::StructDef::create_union_skel (
+ TAO_ServerRequest & server_request,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL
+ )
+{
+ POA_CORBA::Container * const impl = static_cast<POA_CORBA::StructDef *> (servant);
+ POA_CORBA::Container::create_union_skel (
+ server_request,
+ servant_upcall,
+ impl
+ ACE_ENV_ARG_PARAMETER
+ );
+}
+
+// TAO_IDL - Generated from
+// be\be_interface.cpp:1955
+
+ACE_INLINE
+void
+POA_CORBA::StructDef::create_enum_skel (
+ TAO_ServerRequest & server_request,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL
+ )
+{
+ POA_CORBA::Container * const impl = static_cast<POA_CORBA::StructDef *> (servant);
+ POA_CORBA::Container::create_enum_skel (
+ server_request,
+ servant_upcall,
+ impl
+ ACE_ENV_ARG_PARAMETER
+ );
+}
+
+// TAO_IDL - Generated from
+// be\be_interface.cpp:1955
+
+ACE_INLINE
+void
+POA_CORBA::StructDef::create_alias_skel (
+ TAO_ServerRequest & server_request,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL
+ )
+{
+ POA_CORBA::Container * const impl = static_cast<POA_CORBA::StructDef *> (servant);
+ POA_CORBA::Container::create_alias_skel (
+ server_request,
+ servant_upcall,
+ impl
+ ACE_ENV_ARG_PARAMETER
+ );
+}
+
+// TAO_IDL - Generated from
+// be\be_interface.cpp:1955
+
+ACE_INLINE
+void
+POA_CORBA::StructDef::create_interface_skel (
+ TAO_ServerRequest & server_request,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL
+ )
+{
+ POA_CORBA::Container * const impl = static_cast<POA_CORBA::StructDef *> (servant);
+ POA_CORBA::Container::create_interface_skel (
+ server_request,
+ servant_upcall,
+ impl
+ ACE_ENV_ARG_PARAMETER
+ );
+}
+
+// TAO_IDL - Generated from
+// be\be_interface.cpp:1955
+
+ACE_INLINE
+void
+POA_CORBA::StructDef::create_value_skel (
+ TAO_ServerRequest & server_request,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL
+ )
+{
+ POA_CORBA::Container * const impl = static_cast<POA_CORBA::StructDef *> (servant);
+ POA_CORBA::Container::create_value_skel (
+ server_request,
+ servant_upcall,
+ impl
+ ACE_ENV_ARG_PARAMETER
+ );
+}
+
+// TAO_IDL - Generated from
+// be\be_interface.cpp:1955
+
+ACE_INLINE
+void
+POA_CORBA::StructDef::create_value_box_skel (
+ TAO_ServerRequest & server_request,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL
+ )
+{
+ POA_CORBA::Container * const impl = static_cast<POA_CORBA::StructDef *> (servant);
+ POA_CORBA::Container::create_value_box_skel (
+ server_request,
+ servant_upcall,
+ impl
+ ACE_ENV_ARG_PARAMETER
+ );
+}
+
+// TAO_IDL - Generated from
+// be\be_interface.cpp:1955
+
+ACE_INLINE
+void
+POA_CORBA::StructDef::create_exception_skel (
+ TAO_ServerRequest & server_request,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL
+ )
+{
+ POA_CORBA::Container * const impl = static_cast<POA_CORBA::StructDef *> (servant);
+ POA_CORBA::Container::create_exception_skel (
+ server_request,
+ servant_upcall,
+ impl
+ ACE_ENV_ARG_PARAMETER
+ );
+}
+
+// TAO_IDL - Generated from
+// be\be_interface.cpp:1955
+
+ACE_INLINE
+void
+POA_CORBA::StructDef::create_native_skel (
+ TAO_ServerRequest & server_request,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL
+ )
+{
+ POA_CORBA::Container * const impl = static_cast<POA_CORBA::StructDef *> (servant);
+ POA_CORBA::Container::create_native_skel (
+ server_request,
+ servant_upcall,
+ impl
+ ACE_ENV_ARG_PARAMETER
+ );
+}
+
+// TAO_IDL - Generated from
+// be\be_interface.cpp:1955
+
+ACE_INLINE
+void
+POA_CORBA::StructDef::create_abstract_interface_skel (
+ TAO_ServerRequest & server_request,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL
+ )
+{
+ POA_CORBA::Container * const impl = static_cast<POA_CORBA::StructDef *> (servant);
+ POA_CORBA::Container::create_abstract_interface_skel (
+ server_request,
+ servant_upcall,
+ impl
+ ACE_ENV_ARG_PARAMETER
+ );
+}
+
+// TAO_IDL - Generated from
+// be\be_interface.cpp:1955
+
+ACE_INLINE
+void
+POA_CORBA::StructDef::create_local_interface_skel (
+ TAO_ServerRequest & server_request,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL
+ )
+{
+ POA_CORBA::Container * const impl = static_cast<POA_CORBA::StructDef *> (servant);
+ POA_CORBA::Container::create_local_interface_skel (
+ server_request,
+ servant_upcall,
+ impl
+ ACE_ENV_ARG_PARAMETER
+ );
+}
+
+// TAO_IDL - Generated from
+// be\be_interface.cpp:1955
+
+ACE_INLINE
+void
+POA_CORBA::StructDef::create_ext_value_skel (
+ TAO_ServerRequest & server_request,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL
+ )
+{
+ POA_CORBA::Container * const impl = static_cast<POA_CORBA::StructDef *> (servant);
+ POA_CORBA::Container::create_ext_value_skel (
+ server_request,
+ servant_upcall,
+ impl
+ ACE_ENV_ARG_PARAMETER
+ );
+}
+
+ACE_INLINE
+void
+POA_CORBA::UnionDef::_get_def_kind_skel (
+ TAO_ServerRequest & server_request,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL
+ )
+{
+ POA_CORBA::IRObject * const impl = static_cast<POA_CORBA::UnionDef *> (servant);
+ POA_CORBA::IRObject::_get_def_kind_skel (
+ server_request,
+ servant_upcall,
+ impl
+ ACE_ENV_ARG_PARAMETER
+ );
+}
+
+// TAO_IDL - Generated from
+// be\be_interface.cpp:1955
+
+ACE_INLINE
+void
+POA_CORBA::UnionDef::destroy_skel (
+ TAO_ServerRequest & server_request,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL
+ )
+{
+ POA_CORBA::IRObject * const impl = static_cast<POA_CORBA::UnionDef *> (servant);
+ POA_CORBA::IRObject::destroy_skel (
+ server_request,
+ servant_upcall,
+ impl
+ ACE_ENV_ARG_PARAMETER
+ );
+}
+
+ACE_INLINE
+void
+POA_CORBA::UnionDef::_get_id_skel (
+ TAO_ServerRequest & server_request,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL
+ )
+{
+ POA_CORBA::Contained * const impl = static_cast<POA_CORBA::UnionDef *> (servant);
+ POA_CORBA::Contained::_get_id_skel (
+ server_request,
+ servant_upcall,
+ impl
+ ACE_ENV_ARG_PARAMETER
+ );
+}
+
+ACE_INLINE
+void
+POA_CORBA::UnionDef::_set_id_skel (
+ TAO_ServerRequest & server_request,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL
+ )
+{
+ POA_CORBA::Contained * const impl = static_cast<POA_CORBA::UnionDef *> (servant);
+ POA_CORBA::Contained::_set_id_skel (
+ server_request,
+ servant_upcall,
+ impl
+ ACE_ENV_ARG_PARAMETER
+ );
+}
+
+ACE_INLINE
+void
+POA_CORBA::UnionDef::_get_name_skel (
+ TAO_ServerRequest & server_request,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL
+ )
+{
+ POA_CORBA::Contained * const impl = static_cast<POA_CORBA::UnionDef *> (servant);
+ POA_CORBA::Contained::_get_name_skel (
+ server_request,
+ servant_upcall,
+ impl
+ ACE_ENV_ARG_PARAMETER
+ );
+}
+
+ACE_INLINE
+void
+POA_CORBA::UnionDef::_set_name_skel (
+ TAO_ServerRequest & server_request,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL
+ )
+{
+ POA_CORBA::Contained * const impl = static_cast<POA_CORBA::UnionDef *> (servant);
+ POA_CORBA::Contained::_set_name_skel (
+ server_request,
+ servant_upcall,
+ impl
+ ACE_ENV_ARG_PARAMETER
+ );
+}
+
+ACE_INLINE
+void
+POA_CORBA::UnionDef::_get_version_skel (
+ TAO_ServerRequest & server_request,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL
+ )
+{
+ POA_CORBA::Contained * const impl = static_cast<POA_CORBA::UnionDef *> (servant);
+ POA_CORBA::Contained::_get_version_skel (
+ server_request,
+ servant_upcall,
+ impl
+ ACE_ENV_ARG_PARAMETER
+ );
+}
+
+ACE_INLINE
+void
+POA_CORBA::UnionDef::_set_version_skel (
+ TAO_ServerRequest & server_request,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL
+ )
+{
+ POA_CORBA::Contained * const impl = static_cast<POA_CORBA::UnionDef *> (servant);
+ POA_CORBA::Contained::_set_version_skel (
+ server_request,
+ servant_upcall,
+ impl
+ ACE_ENV_ARG_PARAMETER
+ );
+}
+
+ACE_INLINE
+void
+POA_CORBA::UnionDef::_get_defined_in_skel (
+ TAO_ServerRequest & server_request,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL
+ )
+{
+ POA_CORBA::Contained * const impl = static_cast<POA_CORBA::UnionDef *> (servant);
+ POA_CORBA::Contained::_get_defined_in_skel (
+ server_request,
+ servant_upcall,
+ impl
+ ACE_ENV_ARG_PARAMETER
+ );
+}
+
+ACE_INLINE
+void
+POA_CORBA::UnionDef::_get_absolute_name_skel (
+ TAO_ServerRequest & server_request,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL
+ )
+{
+ POA_CORBA::Contained * const impl = static_cast<POA_CORBA::UnionDef *> (servant);
+ POA_CORBA::Contained::_get_absolute_name_skel (
+ server_request,
+ servant_upcall,
+ impl
+ ACE_ENV_ARG_PARAMETER
+ );
+}
+
+ACE_INLINE
+void
+POA_CORBA::UnionDef::_get_containing_repository_skel (
+ TAO_ServerRequest & server_request,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL
+ )
+{
+ POA_CORBA::Contained * const impl = static_cast<POA_CORBA::UnionDef *> (servant);
+ POA_CORBA::Contained::_get_containing_repository_skel (
+ server_request,
+ servant_upcall,
+ impl
+ ACE_ENV_ARG_PARAMETER
+ );
+}
+
+// TAO_IDL - Generated from
+// be\be_interface.cpp:1955
+
+ACE_INLINE
+void
+POA_CORBA::UnionDef::describe_skel (
+ TAO_ServerRequest & server_request,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL
+ )
+{
+ POA_CORBA::Contained * const impl = static_cast<POA_CORBA::UnionDef *> (servant);
+ POA_CORBA::Contained::describe_skel (
+ server_request,
+ servant_upcall,
+ impl
+ ACE_ENV_ARG_PARAMETER
+ );
+}
+
+// TAO_IDL - Generated from
+// be\be_interface.cpp:1955
+
+ACE_INLINE
+void
+POA_CORBA::UnionDef::move_skel (
+ TAO_ServerRequest & server_request,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL
+ )
+{
+ POA_CORBA::Contained * const impl = static_cast<POA_CORBA::UnionDef *> (servant);
+ POA_CORBA::Contained::move_skel (
+ server_request,
+ servant_upcall,
+ impl
+ ACE_ENV_ARG_PARAMETER
+ );
+}
+
+ACE_INLINE
+void
+POA_CORBA::UnionDef::_get_type_skel (
+ TAO_ServerRequest & server_request,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL
+ )
+{
+ POA_CORBA::IDLType * const impl = static_cast<POA_CORBA::UnionDef *> (servant);
+ POA_CORBA::IDLType::_get_type_skel (
+ server_request,
+ servant_upcall,
+ impl
+ ACE_ENV_ARG_PARAMETER
+ );
+}
+
+// TAO_IDL - Generated from
+// be\be_interface.cpp:1955
+
+ACE_INLINE
+void
+POA_CORBA::UnionDef::lookup_skel (
+ TAO_ServerRequest & server_request,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL
+ )
+{
+ POA_CORBA::Container * const impl = static_cast<POA_CORBA::UnionDef *> (servant);
+ POA_CORBA::Container::lookup_skel (
+ server_request,
+ servant_upcall,
+ impl
+ ACE_ENV_ARG_PARAMETER
+ );
+}
+
+// TAO_IDL - Generated from
+// be\be_interface.cpp:1955
+
+ACE_INLINE
+void
+POA_CORBA::UnionDef::contents_skel (
+ TAO_ServerRequest & server_request,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL
+ )
+{
+ POA_CORBA::Container * const impl = static_cast<POA_CORBA::UnionDef *> (servant);
+ POA_CORBA::Container::contents_skel (
+ server_request,
+ servant_upcall,
+ impl
+ ACE_ENV_ARG_PARAMETER
+ );
+}
+
+// TAO_IDL - Generated from
+// be\be_interface.cpp:1955
+
+ACE_INLINE
+void
+POA_CORBA::UnionDef::lookup_name_skel (
+ TAO_ServerRequest & server_request,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL
+ )
+{
+ POA_CORBA::Container * const impl = static_cast<POA_CORBA::UnionDef *> (servant);
+ POA_CORBA::Container::lookup_name_skel (
+ server_request,
+ servant_upcall,
+ impl
+ ACE_ENV_ARG_PARAMETER
+ );
+}
+
+// TAO_IDL - Generated from
+// be\be_interface.cpp:1955
+
+ACE_INLINE
+void
+POA_CORBA::UnionDef::describe_contents_skel (
+ TAO_ServerRequest & server_request,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL
+ )
+{
+ POA_CORBA::Container * const impl = static_cast<POA_CORBA::UnionDef *> (servant);
+ POA_CORBA::Container::describe_contents_skel (
+ server_request,
+ servant_upcall,
+ impl
+ ACE_ENV_ARG_PARAMETER
+ );
+}
+
+// TAO_IDL - Generated from
+// be\be_interface.cpp:1955
+
+ACE_INLINE
+void
+POA_CORBA::UnionDef::create_module_skel (
+ TAO_ServerRequest & server_request,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL
+ )
+{
+ POA_CORBA::Container * const impl = static_cast<POA_CORBA::UnionDef *> (servant);
+ POA_CORBA::Container::create_module_skel (
+ server_request,
+ servant_upcall,
+ impl
+ ACE_ENV_ARG_PARAMETER
+ );
+}
+
+// TAO_IDL - Generated from
+// be\be_interface.cpp:1955
+
+ACE_INLINE
+void
+POA_CORBA::UnionDef::create_constant_skel (
+ TAO_ServerRequest & server_request,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL
+ )
+{
+ POA_CORBA::Container * const impl = static_cast<POA_CORBA::UnionDef *> (servant);
+ POA_CORBA::Container::create_constant_skel (
+ server_request,
+ servant_upcall,
+ impl
+ ACE_ENV_ARG_PARAMETER
+ );
+}
+
+// TAO_IDL - Generated from
+// be\be_interface.cpp:1955
+
+ACE_INLINE
+void
+POA_CORBA::UnionDef::create_struct_skel (
+ TAO_ServerRequest & server_request,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL
+ )
+{
+ POA_CORBA::Container * const impl = static_cast<POA_CORBA::UnionDef *> (servant);
+ POA_CORBA::Container::create_struct_skel (
+ server_request,
+ servant_upcall,
+ impl
+ ACE_ENV_ARG_PARAMETER
+ );
+}
+
+// TAO_IDL - Generated from
+// be\be_interface.cpp:1955
+
+ACE_INLINE
+void
+POA_CORBA::UnionDef::create_union_skel (
+ TAO_ServerRequest & server_request,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL
+ )
+{
+ POA_CORBA::Container * const impl = static_cast<POA_CORBA::UnionDef *> (servant);
+ POA_CORBA::Container::create_union_skel (
+ server_request,
+ servant_upcall,
+ impl
+ ACE_ENV_ARG_PARAMETER
+ );
+}
+
+// TAO_IDL - Generated from
+// be\be_interface.cpp:1955
+
+ACE_INLINE
+void
+POA_CORBA::UnionDef::create_enum_skel (
+ TAO_ServerRequest & server_request,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL
+ )
+{
+ POA_CORBA::Container * const impl = static_cast<POA_CORBA::UnionDef *> (servant);
+ POA_CORBA::Container::create_enum_skel (
+ server_request,
+ servant_upcall,
+ impl
+ ACE_ENV_ARG_PARAMETER
+ );
+}
+
+// TAO_IDL - Generated from
+// be\be_interface.cpp:1955
+
+ACE_INLINE
+void
+POA_CORBA::UnionDef::create_alias_skel (
+ TAO_ServerRequest & server_request,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL
+ )
+{
+ POA_CORBA::Container * const impl = static_cast<POA_CORBA::UnionDef *> (servant);
+ POA_CORBA::Container::create_alias_skel (
+ server_request,
+ servant_upcall,
+ impl
+ ACE_ENV_ARG_PARAMETER
+ );
+}
+
+// TAO_IDL - Generated from
+// be\be_interface.cpp:1955
+
+ACE_INLINE
+void
+POA_CORBA::UnionDef::create_interface_skel (
+ TAO_ServerRequest & server_request,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL
+ )
+{
+ POA_CORBA::Container * const impl = static_cast<POA_CORBA::UnionDef *> (servant);
+ POA_CORBA::Container::create_interface_skel (
+ server_request,
+ servant_upcall,
+ impl
+ ACE_ENV_ARG_PARAMETER
+ );
+}
+
+// TAO_IDL - Generated from
+// be\be_interface.cpp:1955
+
+ACE_INLINE
+void
+POA_CORBA::UnionDef::create_value_skel (
+ TAO_ServerRequest & server_request,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL
+ )
+{
+ POA_CORBA::Container * const impl = static_cast<POA_CORBA::UnionDef *> (servant);
+ POA_CORBA::Container::create_value_skel (
+ server_request,
+ servant_upcall,
+ impl
+ ACE_ENV_ARG_PARAMETER
+ );
+}
+
+// TAO_IDL - Generated from
+// be\be_interface.cpp:1955
+
+ACE_INLINE
+void
+POA_CORBA::UnionDef::create_value_box_skel (
+ TAO_ServerRequest & server_request,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL
+ )
+{
+ POA_CORBA::Container * const impl = static_cast<POA_CORBA::UnionDef *> (servant);
+ POA_CORBA::Container::create_value_box_skel (
+ server_request,
+ servant_upcall,
+ impl
+ ACE_ENV_ARG_PARAMETER
+ );
+}
+
+// TAO_IDL - Generated from
+// be\be_interface.cpp:1955
+
+ACE_INLINE
+void
+POA_CORBA::UnionDef::create_exception_skel (
+ TAO_ServerRequest & server_request,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL
+ )
+{
+ POA_CORBA::Container * const impl = static_cast<POA_CORBA::UnionDef *> (servant);
+ POA_CORBA::Container::create_exception_skel (
+ server_request,
+ servant_upcall,
+ impl
+ ACE_ENV_ARG_PARAMETER
+ );
+}
+
+// TAO_IDL - Generated from
+// be\be_interface.cpp:1955
+
+ACE_INLINE
+void
+POA_CORBA::UnionDef::create_native_skel (
+ TAO_ServerRequest & server_request,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL
+ )
+{
+ POA_CORBA::Container * const impl = static_cast<POA_CORBA::UnionDef *> (servant);
+ POA_CORBA::Container::create_native_skel (
+ server_request,
+ servant_upcall,
+ impl
+ ACE_ENV_ARG_PARAMETER
+ );
+}
+
+// TAO_IDL - Generated from
+// be\be_interface.cpp:1955
+
+ACE_INLINE
+void
+POA_CORBA::UnionDef::create_abstract_interface_skel (
+ TAO_ServerRequest & server_request,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL
+ )
+{
+ POA_CORBA::Container * const impl = static_cast<POA_CORBA::UnionDef *> (servant);
+ POA_CORBA::Container::create_abstract_interface_skel (
+ server_request,
+ servant_upcall,
+ impl
+ ACE_ENV_ARG_PARAMETER
+ );
+}
+
+// TAO_IDL - Generated from
+// be\be_interface.cpp:1955
+
+ACE_INLINE
+void
+POA_CORBA::UnionDef::create_local_interface_skel (
+ TAO_ServerRequest & server_request,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL
+ )
+{
+ POA_CORBA::Container * const impl = static_cast<POA_CORBA::UnionDef *> (servant);
+ POA_CORBA::Container::create_local_interface_skel (
+ server_request,
+ servant_upcall,
+ impl
+ ACE_ENV_ARG_PARAMETER
+ );
+}
+
+// TAO_IDL - Generated from
+// be\be_interface.cpp:1955
+
+ACE_INLINE
+void
+POA_CORBA::UnionDef::create_ext_value_skel (
+ TAO_ServerRequest & server_request,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL
+ )
+{
+ POA_CORBA::Container * const impl = static_cast<POA_CORBA::UnionDef *> (servant);
+ POA_CORBA::Container::create_ext_value_skel (
+ server_request,
+ servant_upcall,
+ impl
+ ACE_ENV_ARG_PARAMETER
+ );
+}
+
+ACE_INLINE
+void
+POA_CORBA::EnumDef::_get_def_kind_skel (
+ TAO_ServerRequest & server_request,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL
+ )
+{
+ POA_CORBA::IRObject * const impl = static_cast<POA_CORBA::EnumDef *> (servant);
+ POA_CORBA::IRObject::_get_def_kind_skel (
+ server_request,
+ servant_upcall,
+ impl
+ ACE_ENV_ARG_PARAMETER
+ );
+}
+
+// TAO_IDL - Generated from
+// be\be_interface.cpp:1955
+
+ACE_INLINE
+void
+POA_CORBA::EnumDef::destroy_skel (
+ TAO_ServerRequest & server_request,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL
+ )
+{
+ POA_CORBA::IRObject * const impl = static_cast<POA_CORBA::EnumDef *> (servant);
+ POA_CORBA::IRObject::destroy_skel (
+ server_request,
+ servant_upcall,
+ impl
+ ACE_ENV_ARG_PARAMETER
+ );
+}
+
+ACE_INLINE
+void
+POA_CORBA::EnumDef::_get_id_skel (
+ TAO_ServerRequest & server_request,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL
+ )
+{
+ POA_CORBA::Contained * const impl = static_cast<POA_CORBA::EnumDef *> (servant);
+ POA_CORBA::Contained::_get_id_skel (
+ server_request,
+ servant_upcall,
+ impl
+ ACE_ENV_ARG_PARAMETER
+ );
+}
+
+ACE_INLINE
+void
+POA_CORBA::EnumDef::_set_id_skel (
+ TAO_ServerRequest & server_request,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL
+ )
+{
+ POA_CORBA::Contained * const impl = static_cast<POA_CORBA::EnumDef *> (servant);
+ POA_CORBA::Contained::_set_id_skel (
+ server_request,
+ servant_upcall,
+ impl
+ ACE_ENV_ARG_PARAMETER
+ );
+}
+
+ACE_INLINE
+void
+POA_CORBA::EnumDef::_get_name_skel (
+ TAO_ServerRequest & server_request,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL
+ )
+{
+ POA_CORBA::Contained * const impl = static_cast<POA_CORBA::EnumDef *> (servant);
+ POA_CORBA::Contained::_get_name_skel (
+ server_request,
+ servant_upcall,
+ impl
+ ACE_ENV_ARG_PARAMETER
+ );
+}
+
+ACE_INLINE
+void
+POA_CORBA::EnumDef::_set_name_skel (
+ TAO_ServerRequest & server_request,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL
+ )
+{
+ POA_CORBA::Contained * const impl = static_cast<POA_CORBA::EnumDef *> (servant);
+ POA_CORBA::Contained::_set_name_skel (
+ server_request,
+ servant_upcall,
+ impl
+ ACE_ENV_ARG_PARAMETER
+ );
+}
+
+ACE_INLINE
+void
+POA_CORBA::EnumDef::_get_version_skel (
+ TAO_ServerRequest & server_request,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL
+ )
+{
+ POA_CORBA::Contained * const impl = static_cast<POA_CORBA::EnumDef *> (servant);
+ POA_CORBA::Contained::_get_version_skel (
+ server_request,
+ servant_upcall,
+ impl
+ ACE_ENV_ARG_PARAMETER
+ );
+}
+
+ACE_INLINE
+void
+POA_CORBA::EnumDef::_set_version_skel (
+ TAO_ServerRequest & server_request,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL
+ )
+{
+ POA_CORBA::Contained * const impl = static_cast<POA_CORBA::EnumDef *> (servant);
+ POA_CORBA::Contained::_set_version_skel (
+ server_request,
+ servant_upcall,
+ impl
+ ACE_ENV_ARG_PARAMETER
+ );
+}
+
+ACE_INLINE
+void
+POA_CORBA::EnumDef::_get_defined_in_skel (
+ TAO_ServerRequest & server_request,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL
+ )
+{
+ POA_CORBA::Contained * const impl = static_cast<POA_CORBA::EnumDef *> (servant);
+ POA_CORBA::Contained::_get_defined_in_skel (
+ server_request,
+ servant_upcall,
+ impl
+ ACE_ENV_ARG_PARAMETER
+ );
+}
+
+ACE_INLINE
+void
+POA_CORBA::EnumDef::_get_absolute_name_skel (
+ TAO_ServerRequest & server_request,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL
+ )
+{
+ POA_CORBA::Contained * const impl = static_cast<POA_CORBA::EnumDef *> (servant);
+ POA_CORBA::Contained::_get_absolute_name_skel (
+ server_request,
+ servant_upcall,
+ impl
+ ACE_ENV_ARG_PARAMETER
+ );
+}
+
+ACE_INLINE
+void
+POA_CORBA::EnumDef::_get_containing_repository_skel (
+ TAO_ServerRequest & server_request,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL
+ )
+{
+ POA_CORBA::Contained * const impl = static_cast<POA_CORBA::EnumDef *> (servant);
+ POA_CORBA::Contained::_get_containing_repository_skel (
+ server_request,
+ servant_upcall,
+ impl
+ ACE_ENV_ARG_PARAMETER
+ );
+}
+
+// TAO_IDL - Generated from
+// be\be_interface.cpp:1955
+
+ACE_INLINE
+void
+POA_CORBA::EnumDef::describe_skel (
+ TAO_ServerRequest & server_request,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL
+ )
+{
+ POA_CORBA::Contained * const impl = static_cast<POA_CORBA::EnumDef *> (servant);
+ POA_CORBA::Contained::describe_skel (
+ server_request,
+ servant_upcall,
+ impl
+ ACE_ENV_ARG_PARAMETER
+ );
+}
+
+// TAO_IDL - Generated from
+// be\be_interface.cpp:1955
+
+ACE_INLINE
+void
+POA_CORBA::EnumDef::move_skel (
+ TAO_ServerRequest & server_request,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL
+ )
+{
+ POA_CORBA::Contained * const impl = static_cast<POA_CORBA::EnumDef *> (servant);
+ POA_CORBA::Contained::move_skel (
+ server_request,
+ servant_upcall,
+ impl
+ ACE_ENV_ARG_PARAMETER
+ );
+}
+
+ACE_INLINE
+void
+POA_CORBA::EnumDef::_get_type_skel (
+ TAO_ServerRequest & server_request,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL
+ )
+{
+ POA_CORBA::IDLType * const impl = static_cast<POA_CORBA::EnumDef *> (servant);
+ POA_CORBA::IDLType::_get_type_skel (
+ server_request,
+ servant_upcall,
+ impl
+ ACE_ENV_ARG_PARAMETER
+ );
+}
+
+ACE_INLINE
+void
+POA_CORBA::AliasDef::_get_def_kind_skel (
+ TAO_ServerRequest & server_request,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL
+ )
+{
+ POA_CORBA::IRObject * const impl = static_cast<POA_CORBA::AliasDef *> (servant);
+ POA_CORBA::IRObject::_get_def_kind_skel (
+ server_request,
+ servant_upcall,
+ impl
+ ACE_ENV_ARG_PARAMETER
+ );
+}
+
+// TAO_IDL - Generated from
+// be\be_interface.cpp:1955
+
+ACE_INLINE
+void
+POA_CORBA::AliasDef::destroy_skel (
+ TAO_ServerRequest & server_request,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL
+ )
+{
+ POA_CORBA::IRObject * const impl = static_cast<POA_CORBA::AliasDef *> (servant);
+ POA_CORBA::IRObject::destroy_skel (
+ server_request,
+ servant_upcall,
+ impl
+ ACE_ENV_ARG_PARAMETER
+ );
+}
+
+ACE_INLINE
+void
+POA_CORBA::AliasDef::_get_id_skel (
+ TAO_ServerRequest & server_request,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL
+ )
+{
+ POA_CORBA::Contained * const impl = static_cast<POA_CORBA::AliasDef *> (servant);
+ POA_CORBA::Contained::_get_id_skel (
+ server_request,
+ servant_upcall,
+ impl
+ ACE_ENV_ARG_PARAMETER
+ );
+}
+
+ACE_INLINE
+void
+POA_CORBA::AliasDef::_set_id_skel (
+ TAO_ServerRequest & server_request,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL
+ )
+{
+ POA_CORBA::Contained * const impl = static_cast<POA_CORBA::AliasDef *> (servant);
+ POA_CORBA::Contained::_set_id_skel (
+ server_request,
+ servant_upcall,
+ impl
+ ACE_ENV_ARG_PARAMETER
+ );
+}
+
+ACE_INLINE
+void
+POA_CORBA::AliasDef::_get_name_skel (
+ TAO_ServerRequest & server_request,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL
+ )
+{
+ POA_CORBA::Contained * const impl = static_cast<POA_CORBA::AliasDef *> (servant);
+ POA_CORBA::Contained::_get_name_skel (
+ server_request,
+ servant_upcall,
+ impl
+ ACE_ENV_ARG_PARAMETER
+ );
+}
+
+ACE_INLINE
+void
+POA_CORBA::AliasDef::_set_name_skel (
+ TAO_ServerRequest & server_request,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL
+ )
+{
+ POA_CORBA::Contained * const impl = static_cast<POA_CORBA::AliasDef *> (servant);
+ POA_CORBA::Contained::_set_name_skel (
+ server_request,
+ servant_upcall,
+ impl
+ ACE_ENV_ARG_PARAMETER
+ );
+}
+
+ACE_INLINE
+void
+POA_CORBA::AliasDef::_get_version_skel (
+ TAO_ServerRequest & server_request,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL
+ )
+{
+ POA_CORBA::Contained * const impl = static_cast<POA_CORBA::AliasDef *> (servant);
+ POA_CORBA::Contained::_get_version_skel (
+ server_request,
+ servant_upcall,
+ impl
+ ACE_ENV_ARG_PARAMETER
+ );
+}
+
+ACE_INLINE
+void
+POA_CORBA::AliasDef::_set_version_skel (
+ TAO_ServerRequest & server_request,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL
+ )
+{
+ POA_CORBA::Contained * const impl = static_cast<POA_CORBA::AliasDef *> (servant);
+ POA_CORBA::Contained::_set_version_skel (
+ server_request,
+ servant_upcall,
+ impl
+ ACE_ENV_ARG_PARAMETER
+ );
+}
+
+ACE_INLINE
+void
+POA_CORBA::AliasDef::_get_defined_in_skel (
+ TAO_ServerRequest & server_request,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL
+ )
+{
+ POA_CORBA::Contained * const impl = static_cast<POA_CORBA::AliasDef *> (servant);
+ POA_CORBA::Contained::_get_defined_in_skel (
+ server_request,
+ servant_upcall,
+ impl
+ ACE_ENV_ARG_PARAMETER
+ );
+}
+
+ACE_INLINE
+void
+POA_CORBA::AliasDef::_get_absolute_name_skel (
+ TAO_ServerRequest & server_request,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL
+ )
+{
+ POA_CORBA::Contained * const impl = static_cast<POA_CORBA::AliasDef *> (servant);
+ POA_CORBA::Contained::_get_absolute_name_skel (
+ server_request,
+ servant_upcall,
+ impl
+ ACE_ENV_ARG_PARAMETER
+ );
+}
+
+ACE_INLINE
+void
+POA_CORBA::AliasDef::_get_containing_repository_skel (
+ TAO_ServerRequest & server_request,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL
+ )
+{
+ POA_CORBA::Contained * const impl = static_cast<POA_CORBA::AliasDef *> (servant);
+ POA_CORBA::Contained::_get_containing_repository_skel (
+ server_request,
+ servant_upcall,
+ impl
+ ACE_ENV_ARG_PARAMETER
+ );
+}
+
+// TAO_IDL - Generated from
+// be\be_interface.cpp:1955
+
+ACE_INLINE
+void
+POA_CORBA::AliasDef::describe_skel (
+ TAO_ServerRequest & server_request,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL
+ )
+{
+ POA_CORBA::Contained * const impl = static_cast<POA_CORBA::AliasDef *> (servant);
+ POA_CORBA::Contained::describe_skel (
+ server_request,
+ servant_upcall,
+ impl
+ ACE_ENV_ARG_PARAMETER
+ );
+}
+
+// TAO_IDL - Generated from
+// be\be_interface.cpp:1955
+
+ACE_INLINE
+void
+POA_CORBA::AliasDef::move_skel (
+ TAO_ServerRequest & server_request,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL
+ )
+{
+ POA_CORBA::Contained * const impl = static_cast<POA_CORBA::AliasDef *> (servant);
+ POA_CORBA::Contained::move_skel (
+ server_request,
+ servant_upcall,
+ impl
+ ACE_ENV_ARG_PARAMETER
+ );
+}
+
+ACE_INLINE
+void
+POA_CORBA::AliasDef::_get_type_skel (
+ TAO_ServerRequest & server_request,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL
+ )
+{
+ POA_CORBA::IDLType * const impl = static_cast<POA_CORBA::AliasDef *> (servant);
+ POA_CORBA::IDLType::_get_type_skel (
+ server_request,
+ servant_upcall,
+ impl
+ ACE_ENV_ARG_PARAMETER
+ );
+}
+
+ACE_INLINE
+void
+POA_CORBA::NativeDef::_get_def_kind_skel (
+ TAO_ServerRequest & server_request,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL
+ )
+{
+ POA_CORBA::IRObject * const impl = static_cast<POA_CORBA::NativeDef *> (servant);
+ POA_CORBA::IRObject::_get_def_kind_skel (
+ server_request,
+ servant_upcall,
+ impl
+ ACE_ENV_ARG_PARAMETER
+ );
+}
+
+// TAO_IDL - Generated from
+// be\be_interface.cpp:1955
+
+ACE_INLINE
+void
+POA_CORBA::NativeDef::destroy_skel (
+ TAO_ServerRequest & server_request,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL
+ )
+{
+ POA_CORBA::IRObject * const impl = static_cast<POA_CORBA::NativeDef *> (servant);
+ POA_CORBA::IRObject::destroy_skel (
+ server_request,
+ servant_upcall,
+ impl
+ ACE_ENV_ARG_PARAMETER
+ );
+}
+
+ACE_INLINE
+void
+POA_CORBA::NativeDef::_get_id_skel (
+ TAO_ServerRequest & server_request,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL
+ )
+{
+ POA_CORBA::Contained * const impl = static_cast<POA_CORBA::NativeDef *> (servant);
+ POA_CORBA::Contained::_get_id_skel (
+ server_request,
+ servant_upcall,
+ impl
+ ACE_ENV_ARG_PARAMETER
+ );
+}
+
+ACE_INLINE
+void
+POA_CORBA::NativeDef::_set_id_skel (
+ TAO_ServerRequest & server_request,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL
+ )
+{
+ POA_CORBA::Contained * const impl = static_cast<POA_CORBA::NativeDef *> (servant);
+ POA_CORBA::Contained::_set_id_skel (
+ server_request,
+ servant_upcall,
+ impl
+ ACE_ENV_ARG_PARAMETER
+ );
+}
+
+ACE_INLINE
+void
+POA_CORBA::NativeDef::_get_name_skel (
+ TAO_ServerRequest & server_request,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL
+ )
+{
+ POA_CORBA::Contained * const impl = static_cast<POA_CORBA::NativeDef *> (servant);
+ POA_CORBA::Contained::_get_name_skel (
+ server_request,
+ servant_upcall,
+ impl
+ ACE_ENV_ARG_PARAMETER
+ );
+}
+
+ACE_INLINE
+void
+POA_CORBA::NativeDef::_set_name_skel (
+ TAO_ServerRequest & server_request,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL
+ )
+{
+ POA_CORBA::Contained * const impl = static_cast<POA_CORBA::NativeDef *> (servant);
+ POA_CORBA::Contained::_set_name_skel (
+ server_request,
+ servant_upcall,
+ impl
+ ACE_ENV_ARG_PARAMETER
+ );
+}
+
+ACE_INLINE
+void
+POA_CORBA::NativeDef::_get_version_skel (
+ TAO_ServerRequest & server_request,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL
+ )
+{
+ POA_CORBA::Contained * const impl = static_cast<POA_CORBA::NativeDef *> (servant);
+ POA_CORBA::Contained::_get_version_skel (
+ server_request,
+ servant_upcall,
+ impl
+ ACE_ENV_ARG_PARAMETER
+ );
+}
+
+ACE_INLINE
+void
+POA_CORBA::NativeDef::_set_version_skel (
+ TAO_ServerRequest & server_request,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL
+ )
+{
+ POA_CORBA::Contained * const impl = static_cast<POA_CORBA::NativeDef *> (servant);
+ POA_CORBA::Contained::_set_version_skel (
+ server_request,
+ servant_upcall,
+ impl
+ ACE_ENV_ARG_PARAMETER
+ );
+}
+
+ACE_INLINE
+void
+POA_CORBA::NativeDef::_get_defined_in_skel (
+ TAO_ServerRequest & server_request,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL
+ )
+{
+ POA_CORBA::Contained * const impl = static_cast<POA_CORBA::NativeDef *> (servant);
+ POA_CORBA::Contained::_get_defined_in_skel (
+ server_request,
+ servant_upcall,
+ impl
+ ACE_ENV_ARG_PARAMETER
+ );
+}
+
+ACE_INLINE
+void
+POA_CORBA::NativeDef::_get_absolute_name_skel (
+ TAO_ServerRequest & server_request,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL
+ )
+{
+ POA_CORBA::Contained * const impl = static_cast<POA_CORBA::NativeDef *> (servant);
+ POA_CORBA::Contained::_get_absolute_name_skel (
+ server_request,
+ servant_upcall,
+ impl
+ ACE_ENV_ARG_PARAMETER
+ );
+}
+
+ACE_INLINE
+void
+POA_CORBA::NativeDef::_get_containing_repository_skel (
+ TAO_ServerRequest & server_request,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL
+ )
+{
+ POA_CORBA::Contained * const impl = static_cast<POA_CORBA::NativeDef *> (servant);
+ POA_CORBA::Contained::_get_containing_repository_skel (
+ server_request,
+ servant_upcall,
+ impl
+ ACE_ENV_ARG_PARAMETER
+ );
+}
+
+// TAO_IDL - Generated from
+// be\be_interface.cpp:1955
+
+ACE_INLINE
+void
+POA_CORBA::NativeDef::describe_skel (
+ TAO_ServerRequest & server_request,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL
+ )
+{
+ POA_CORBA::Contained * const impl = static_cast<POA_CORBA::NativeDef *> (servant);
+ POA_CORBA::Contained::describe_skel (
+ server_request,
+ servant_upcall,
+ impl
+ ACE_ENV_ARG_PARAMETER
+ );
+}
+
+// TAO_IDL - Generated from
+// be\be_interface.cpp:1955
+
+ACE_INLINE
+void
+POA_CORBA::NativeDef::move_skel (
+ TAO_ServerRequest & server_request,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL
+ )
+{
+ POA_CORBA::Contained * const impl = static_cast<POA_CORBA::NativeDef *> (servant);
+ POA_CORBA::Contained::move_skel (
+ server_request,
+ servant_upcall,
+ impl
+ ACE_ENV_ARG_PARAMETER
+ );
+}
+
+ACE_INLINE
+void
+POA_CORBA::NativeDef::_get_type_skel (
+ TAO_ServerRequest & server_request,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL
+ )
+{
+ POA_CORBA::IDLType * const impl = static_cast<POA_CORBA::NativeDef *> (servant);
+ POA_CORBA::IDLType::_get_type_skel (
+ server_request,
+ servant_upcall,
+ impl
+ ACE_ENV_ARG_PARAMETER
+ );
+}
+
+ACE_INLINE
+void
+POA_CORBA::PrimitiveDef::_get_def_kind_skel (
+ TAO_ServerRequest & server_request,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL
+ )
+{
+ POA_CORBA::IRObject * const impl = static_cast<POA_CORBA::PrimitiveDef *> (servant);
+ POA_CORBA::IRObject::_get_def_kind_skel (
+ server_request,
+ servant_upcall,
+ impl
+ ACE_ENV_ARG_PARAMETER
+ );
+}
+
+// TAO_IDL - Generated from
+// be\be_interface.cpp:1955
+
+ACE_INLINE
+void
+POA_CORBA::PrimitiveDef::destroy_skel (
+ TAO_ServerRequest & server_request,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL
+ )
+{
+ POA_CORBA::IRObject * const impl = static_cast<POA_CORBA::PrimitiveDef *> (servant);
+ POA_CORBA::IRObject::destroy_skel (
+ server_request,
+ servant_upcall,
+ impl
+ ACE_ENV_ARG_PARAMETER
+ );
+}
+
+ACE_INLINE
+void
+POA_CORBA::PrimitiveDef::_get_type_skel (
+ TAO_ServerRequest & server_request,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL
+ )
+{
+ POA_CORBA::IDLType * const impl = static_cast<POA_CORBA::PrimitiveDef *> (servant);
+ POA_CORBA::IDLType::_get_type_skel (
+ server_request,
+ servant_upcall,
+ impl
+ ACE_ENV_ARG_PARAMETER
+ );
+}
+
+ACE_INLINE
+void
+POA_CORBA::StringDef::_get_def_kind_skel (
+ TAO_ServerRequest & server_request,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL
+ )
+{
+ POA_CORBA::IRObject * const impl = static_cast<POA_CORBA::StringDef *> (servant);
+ POA_CORBA::IRObject::_get_def_kind_skel (
+ server_request,
+ servant_upcall,
+ impl
+ ACE_ENV_ARG_PARAMETER
+ );
+}
+
+// TAO_IDL - Generated from
+// be\be_interface.cpp:1955
+
+ACE_INLINE
+void
+POA_CORBA::StringDef::destroy_skel (
+ TAO_ServerRequest & server_request,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL
+ )
+{
+ POA_CORBA::IRObject * const impl = static_cast<POA_CORBA::StringDef *> (servant);
+ POA_CORBA::IRObject::destroy_skel (
+ server_request,
+ servant_upcall,
+ impl
+ ACE_ENV_ARG_PARAMETER
+ );
+}
+
+ACE_INLINE
+void
+POA_CORBA::StringDef::_get_type_skel (
+ TAO_ServerRequest & server_request,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL
+ )
+{
+ POA_CORBA::IDLType * const impl = static_cast<POA_CORBA::StringDef *> (servant);
+ POA_CORBA::IDLType::_get_type_skel (
+ server_request,
+ servant_upcall,
+ impl
+ ACE_ENV_ARG_PARAMETER
+ );
+}
+
+ACE_INLINE
+void
+POA_CORBA::WstringDef::_get_def_kind_skel (
+ TAO_ServerRequest & server_request,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL
+ )
+{
+ POA_CORBA::IRObject * const impl = static_cast<POA_CORBA::WstringDef *> (servant);
+ POA_CORBA::IRObject::_get_def_kind_skel (
+ server_request,
+ servant_upcall,
+ impl
+ ACE_ENV_ARG_PARAMETER
+ );
+}
+
+// TAO_IDL - Generated from
+// be\be_interface.cpp:1955
+
+ACE_INLINE
+void
+POA_CORBA::WstringDef::destroy_skel (
+ TAO_ServerRequest & server_request,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL
+ )
+{
+ POA_CORBA::IRObject * const impl = static_cast<POA_CORBA::WstringDef *> (servant);
+ POA_CORBA::IRObject::destroy_skel (
+ server_request,
+ servant_upcall,
+ impl
+ ACE_ENV_ARG_PARAMETER
+ );
+}
+
+ACE_INLINE
+void
+POA_CORBA::WstringDef::_get_type_skel (
+ TAO_ServerRequest & server_request,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL
+ )
+{
+ POA_CORBA::IDLType * const impl = static_cast<POA_CORBA::WstringDef *> (servant);
+ POA_CORBA::IDLType::_get_type_skel (
+ server_request,
+ servant_upcall,
+ impl
+ ACE_ENV_ARG_PARAMETER
+ );
+}
+
+ACE_INLINE
+void
+POA_CORBA::SequenceDef::_get_def_kind_skel (
+ TAO_ServerRequest & server_request,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL
+ )
+{
+ POA_CORBA::IRObject * const impl = static_cast<POA_CORBA::SequenceDef *> (servant);
+ POA_CORBA::IRObject::_get_def_kind_skel (
+ server_request,
+ servant_upcall,
+ impl
+ ACE_ENV_ARG_PARAMETER
+ );
+}
+
+// TAO_IDL - Generated from
+// be\be_interface.cpp:1955
+
+ACE_INLINE
+void
+POA_CORBA::SequenceDef::destroy_skel (
+ TAO_ServerRequest & server_request,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL
+ )
+{
+ POA_CORBA::IRObject * const impl = static_cast<POA_CORBA::SequenceDef *> (servant);
+ POA_CORBA::IRObject::destroy_skel (
+ server_request,
+ servant_upcall,
+ impl
+ ACE_ENV_ARG_PARAMETER
+ );
+}
+
+ACE_INLINE
+void
+POA_CORBA::SequenceDef::_get_type_skel (
+ TAO_ServerRequest & server_request,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL
+ )
+{
+ POA_CORBA::IDLType * const impl = static_cast<POA_CORBA::SequenceDef *> (servant);
+ POA_CORBA::IDLType::_get_type_skel (
+ server_request,
+ servant_upcall,
+ impl
+ ACE_ENV_ARG_PARAMETER
+ );
+}
+
+ACE_INLINE
+void
+POA_CORBA::ArrayDef::_get_def_kind_skel (
+ TAO_ServerRequest & server_request,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL
+ )
+{
+ POA_CORBA::IRObject * const impl = static_cast<POA_CORBA::ArrayDef *> (servant);
+ POA_CORBA::IRObject::_get_def_kind_skel (
+ server_request,
+ servant_upcall,
+ impl
+ ACE_ENV_ARG_PARAMETER
+ );
+}
+
+// TAO_IDL - Generated from
+// be\be_interface.cpp:1955
+
+ACE_INLINE
+void
+POA_CORBA::ArrayDef::destroy_skel (
+ TAO_ServerRequest & server_request,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL
+ )
+{
+ POA_CORBA::IRObject * const impl = static_cast<POA_CORBA::ArrayDef *> (servant);
+ POA_CORBA::IRObject::destroy_skel (
+ server_request,
+ servant_upcall,
+ impl
+ ACE_ENV_ARG_PARAMETER
+ );
+}
+
+ACE_INLINE
+void
+POA_CORBA::ArrayDef::_get_type_skel (
+ TAO_ServerRequest & server_request,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL
+ )
+{
+ POA_CORBA::IDLType * const impl = static_cast<POA_CORBA::ArrayDef *> (servant);
+ POA_CORBA::IDLType::_get_type_skel (
+ server_request,
+ servant_upcall,
+ impl
+ ACE_ENV_ARG_PARAMETER
+ );
+}
+
+ACE_INLINE
+void
+POA_CORBA::ExceptionDef::_get_def_kind_skel (
+ TAO_ServerRequest & server_request,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL
+ )
+{
+ POA_CORBA::IRObject * const impl = static_cast<POA_CORBA::ExceptionDef *> (servant);
+ POA_CORBA::IRObject::_get_def_kind_skel (
+ server_request,
+ servant_upcall,
+ impl
+ ACE_ENV_ARG_PARAMETER
+ );
+}
+
+// TAO_IDL - Generated from
+// be\be_interface.cpp:1955
+
+ACE_INLINE
+void
+POA_CORBA::ExceptionDef::destroy_skel (
+ TAO_ServerRequest & server_request,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL
+ )
+{
+ POA_CORBA::IRObject * const impl = static_cast<POA_CORBA::ExceptionDef *> (servant);
+ POA_CORBA::IRObject::destroy_skel (
+ server_request,
+ servant_upcall,
+ impl
+ ACE_ENV_ARG_PARAMETER
+ );
+}
+
+ACE_INLINE
+void
+POA_CORBA::ExceptionDef::_get_id_skel (
+ TAO_ServerRequest & server_request,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL
+ )
+{
+ POA_CORBA::Contained * const impl = static_cast<POA_CORBA::ExceptionDef *> (servant);
+ POA_CORBA::Contained::_get_id_skel (
+ server_request,
+ servant_upcall,
+ impl
+ ACE_ENV_ARG_PARAMETER
+ );
+}
+
+ACE_INLINE
+void
+POA_CORBA::ExceptionDef::_set_id_skel (
+ TAO_ServerRequest & server_request,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL
+ )
+{
+ POA_CORBA::Contained * const impl = static_cast<POA_CORBA::ExceptionDef *> (servant);
+ POA_CORBA::Contained::_set_id_skel (
+ server_request,
+ servant_upcall,
+ impl
+ ACE_ENV_ARG_PARAMETER
+ );
+}
+
+ACE_INLINE
+void
+POA_CORBA::ExceptionDef::_get_name_skel (
+ TAO_ServerRequest & server_request,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL
+ )
+{
+ POA_CORBA::Contained * const impl = static_cast<POA_CORBA::ExceptionDef *> (servant);
+ POA_CORBA::Contained::_get_name_skel (
+ server_request,
+ servant_upcall,
+ impl
+ ACE_ENV_ARG_PARAMETER
+ );
+}
+
+ACE_INLINE
+void
+POA_CORBA::ExceptionDef::_set_name_skel (
+ TAO_ServerRequest & server_request,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL
+ )
+{
+ POA_CORBA::Contained * const impl = static_cast<POA_CORBA::ExceptionDef *> (servant);
+ POA_CORBA::Contained::_set_name_skel (
+ server_request,
+ servant_upcall,
+ impl
+ ACE_ENV_ARG_PARAMETER
+ );
+}
+
+ACE_INLINE
+void
+POA_CORBA::ExceptionDef::_get_version_skel (
+ TAO_ServerRequest & server_request,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL
+ )
+{
+ POA_CORBA::Contained * const impl = static_cast<POA_CORBA::ExceptionDef *> (servant);
+ POA_CORBA::Contained::_get_version_skel (
+ server_request,
+ servant_upcall,
+ impl
+ ACE_ENV_ARG_PARAMETER
+ );
+}
+
+ACE_INLINE
+void
+POA_CORBA::ExceptionDef::_set_version_skel (
+ TAO_ServerRequest & server_request,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL
+ )
+{
+ POA_CORBA::Contained * const impl = static_cast<POA_CORBA::ExceptionDef *> (servant);
+ POA_CORBA::Contained::_set_version_skel (
+ server_request,
+ servant_upcall,
+ impl
+ ACE_ENV_ARG_PARAMETER
+ );
+}
+
+ACE_INLINE
+void
+POA_CORBA::ExceptionDef::_get_defined_in_skel (
+ TAO_ServerRequest & server_request,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL
+ )
+{
+ POA_CORBA::Contained * const impl = static_cast<POA_CORBA::ExceptionDef *> (servant);
+ POA_CORBA::Contained::_get_defined_in_skel (
+ server_request,
+ servant_upcall,
+ impl
+ ACE_ENV_ARG_PARAMETER
+ );
+}
+
+ACE_INLINE
+void
+POA_CORBA::ExceptionDef::_get_absolute_name_skel (
+ TAO_ServerRequest & server_request,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL
+ )
+{
+ POA_CORBA::Contained * const impl = static_cast<POA_CORBA::ExceptionDef *> (servant);
+ POA_CORBA::Contained::_get_absolute_name_skel (
+ server_request,
+ servant_upcall,
+ impl
+ ACE_ENV_ARG_PARAMETER
+ );
+}
+
+ACE_INLINE
+void
+POA_CORBA::ExceptionDef::_get_containing_repository_skel (
+ TAO_ServerRequest & server_request,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL
+ )
+{
+ POA_CORBA::Contained * const impl = static_cast<POA_CORBA::ExceptionDef *> (servant);
+ POA_CORBA::Contained::_get_containing_repository_skel (
+ server_request,
+ servant_upcall,
+ impl
+ ACE_ENV_ARG_PARAMETER
+ );
+}
+
+// TAO_IDL - Generated from
+// be\be_interface.cpp:1955
+
+ACE_INLINE
+void
+POA_CORBA::ExceptionDef::describe_skel (
+ TAO_ServerRequest & server_request,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL
+ )
+{
+ POA_CORBA::Contained * const impl = static_cast<POA_CORBA::ExceptionDef *> (servant);
+ POA_CORBA::Contained::describe_skel (
+ server_request,
+ servant_upcall,
+ impl
+ ACE_ENV_ARG_PARAMETER
+ );
+}
+
+// TAO_IDL - Generated from
+// be\be_interface.cpp:1955
+
+ACE_INLINE
+void
+POA_CORBA::ExceptionDef::move_skel (
+ TAO_ServerRequest & server_request,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL
+ )
+{
+ POA_CORBA::Contained * const impl = static_cast<POA_CORBA::ExceptionDef *> (servant);
+ POA_CORBA::Contained::move_skel (
+ server_request,
+ servant_upcall,
+ impl
+ ACE_ENV_ARG_PARAMETER
+ );
+}
+
+// TAO_IDL - Generated from
+// be\be_interface.cpp:1955
+
+ACE_INLINE
+void
+POA_CORBA::ExceptionDef::lookup_skel (
+ TAO_ServerRequest & server_request,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL
+ )
+{
+ POA_CORBA::Container * const impl = static_cast<POA_CORBA::ExceptionDef *> (servant);
+ POA_CORBA::Container::lookup_skel (
+ server_request,
+ servant_upcall,
+ impl
+ ACE_ENV_ARG_PARAMETER
+ );
+}
+
+// TAO_IDL - Generated from
+// be\be_interface.cpp:1955
+
+ACE_INLINE
+void
+POA_CORBA::ExceptionDef::contents_skel (
+ TAO_ServerRequest & server_request,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL
+ )
+{
+ POA_CORBA::Container * const impl = static_cast<POA_CORBA::ExceptionDef *> (servant);
+ POA_CORBA::Container::contents_skel (
+ server_request,
+ servant_upcall,
+ impl
+ ACE_ENV_ARG_PARAMETER
+ );
+}
+
+// TAO_IDL - Generated from
+// be\be_interface.cpp:1955
+
+ACE_INLINE
+void
+POA_CORBA::ExceptionDef::lookup_name_skel (
+ TAO_ServerRequest & server_request,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL
+ )
+{
+ POA_CORBA::Container * const impl = static_cast<POA_CORBA::ExceptionDef *> (servant);
+ POA_CORBA::Container::lookup_name_skel (
+ server_request,
+ servant_upcall,
+ impl
+ ACE_ENV_ARG_PARAMETER
+ );
+}
+
+// TAO_IDL - Generated from
+// be\be_interface.cpp:1955
+
+ACE_INLINE
+void
+POA_CORBA::ExceptionDef::describe_contents_skel (
+ TAO_ServerRequest & server_request,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL
+ )
+{
+ POA_CORBA::Container * const impl = static_cast<POA_CORBA::ExceptionDef *> (servant);
+ POA_CORBA::Container::describe_contents_skel (
+ server_request,
+ servant_upcall,
+ impl
+ ACE_ENV_ARG_PARAMETER
+ );
+}
+
+// TAO_IDL - Generated from
+// be\be_interface.cpp:1955
+
+ACE_INLINE
+void
+POA_CORBA::ExceptionDef::create_module_skel (
+ TAO_ServerRequest & server_request,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL
+ )
+{
+ POA_CORBA::Container * const impl = static_cast<POA_CORBA::ExceptionDef *> (servant);
+ POA_CORBA::Container::create_module_skel (
+ server_request,
+ servant_upcall,
+ impl
+ ACE_ENV_ARG_PARAMETER
+ );
+}
+
+// TAO_IDL - Generated from
+// be\be_interface.cpp:1955
+
+ACE_INLINE
+void
+POA_CORBA::ExceptionDef::create_constant_skel (
+ TAO_ServerRequest & server_request,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL
+ )
+{
+ POA_CORBA::Container * const impl = static_cast<POA_CORBA::ExceptionDef *> (servant);
+ POA_CORBA::Container::create_constant_skel (
+ server_request,
+ servant_upcall,
+ impl
+ ACE_ENV_ARG_PARAMETER
+ );
+}
+
+// TAO_IDL - Generated from
+// be\be_interface.cpp:1955
+
+ACE_INLINE
+void
+POA_CORBA::ExceptionDef::create_struct_skel (
+ TAO_ServerRequest & server_request,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL
+ )
+{
+ POA_CORBA::Container * const impl = static_cast<POA_CORBA::ExceptionDef *> (servant);
+ POA_CORBA::Container::create_struct_skel (
+ server_request,
+ servant_upcall,
+ impl
+ ACE_ENV_ARG_PARAMETER
+ );
+}
+
+// TAO_IDL - Generated from
+// be\be_interface.cpp:1955
+
+ACE_INLINE
+void
+POA_CORBA::ExceptionDef::create_union_skel (
+ TAO_ServerRequest & server_request,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL
+ )
+{
+ POA_CORBA::Container * const impl = static_cast<POA_CORBA::ExceptionDef *> (servant);
+ POA_CORBA::Container::create_union_skel (
+ server_request,
+ servant_upcall,
+ impl
+ ACE_ENV_ARG_PARAMETER
+ );
+}
+
+// TAO_IDL - Generated from
+// be\be_interface.cpp:1955
+
+ACE_INLINE
+void
+POA_CORBA::ExceptionDef::create_enum_skel (
+ TAO_ServerRequest & server_request,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL
+ )
+{
+ POA_CORBA::Container * const impl = static_cast<POA_CORBA::ExceptionDef *> (servant);
+ POA_CORBA::Container::create_enum_skel (
+ server_request,
+ servant_upcall,
+ impl
+ ACE_ENV_ARG_PARAMETER
+ );
+}
+
+// TAO_IDL - Generated from
+// be\be_interface.cpp:1955
+
+ACE_INLINE
+void
+POA_CORBA::ExceptionDef::create_alias_skel (
+ TAO_ServerRequest & server_request,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL
+ )
+{
+ POA_CORBA::Container * const impl = static_cast<POA_CORBA::ExceptionDef *> (servant);
+ POA_CORBA::Container::create_alias_skel (
+ server_request,
+ servant_upcall,
+ impl
+ ACE_ENV_ARG_PARAMETER
+ );
+}
+
+// TAO_IDL - Generated from
+// be\be_interface.cpp:1955
+
+ACE_INLINE
+void
+POA_CORBA::ExceptionDef::create_interface_skel (
+ TAO_ServerRequest & server_request,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL
+ )
+{
+ POA_CORBA::Container * const impl = static_cast<POA_CORBA::ExceptionDef *> (servant);
+ POA_CORBA::Container::create_interface_skel (
+ server_request,
+ servant_upcall,
+ impl
+ ACE_ENV_ARG_PARAMETER
+ );
+}
+
+// TAO_IDL - Generated from
+// be\be_interface.cpp:1955
+
+ACE_INLINE
+void
+POA_CORBA::ExceptionDef::create_value_skel (
+ TAO_ServerRequest & server_request,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL
+ )
+{
+ POA_CORBA::Container * const impl = static_cast<POA_CORBA::ExceptionDef *> (servant);
+ POA_CORBA::Container::create_value_skel (
+ server_request,
+ servant_upcall,
+ impl
+ ACE_ENV_ARG_PARAMETER
+ );
+}
+
+// TAO_IDL - Generated from
+// be\be_interface.cpp:1955
+
+ACE_INLINE
+void
+POA_CORBA::ExceptionDef::create_value_box_skel (
+ TAO_ServerRequest & server_request,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL
+ )
+{
+ POA_CORBA::Container * const impl = static_cast<POA_CORBA::ExceptionDef *> (servant);
+ POA_CORBA::Container::create_value_box_skel (
+ server_request,
+ servant_upcall,
+ impl
+ ACE_ENV_ARG_PARAMETER
+ );
+}
+
+// TAO_IDL - Generated from
+// be\be_interface.cpp:1955
+
+ACE_INLINE
+void
+POA_CORBA::ExceptionDef::create_exception_skel (
+ TAO_ServerRequest & server_request,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL
+ )
+{
+ POA_CORBA::Container * const impl = static_cast<POA_CORBA::ExceptionDef *> (servant);
+ POA_CORBA::Container::create_exception_skel (
+ server_request,
+ servant_upcall,
+ impl
+ ACE_ENV_ARG_PARAMETER
+ );
+}
+
+// TAO_IDL - Generated from
+// be\be_interface.cpp:1955
+
+ACE_INLINE
+void
+POA_CORBA::ExceptionDef::create_native_skel (
+ TAO_ServerRequest & server_request,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL
+ )
+{
+ POA_CORBA::Container * const impl = static_cast<POA_CORBA::ExceptionDef *> (servant);
+ POA_CORBA::Container::create_native_skel (
+ server_request,
+ servant_upcall,
+ impl
+ ACE_ENV_ARG_PARAMETER
+ );
+}
+
+// TAO_IDL - Generated from
+// be\be_interface.cpp:1955
+
+ACE_INLINE
+void
+POA_CORBA::ExceptionDef::create_abstract_interface_skel (
+ TAO_ServerRequest & server_request,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL
+ )
+{
+ POA_CORBA::Container * const impl = static_cast<POA_CORBA::ExceptionDef *> (servant);
+ POA_CORBA::Container::create_abstract_interface_skel (
+ server_request,
+ servant_upcall,
+ impl
+ ACE_ENV_ARG_PARAMETER
+ );
+}
+
+// TAO_IDL - Generated from
+// be\be_interface.cpp:1955
+
+ACE_INLINE
+void
+POA_CORBA::ExceptionDef::create_local_interface_skel (
+ TAO_ServerRequest & server_request,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL
+ )
+{
+ POA_CORBA::Container * const impl = static_cast<POA_CORBA::ExceptionDef *> (servant);
+ POA_CORBA::Container::create_local_interface_skel (
+ server_request,
+ servant_upcall,
+ impl
+ ACE_ENV_ARG_PARAMETER
+ );
+}
+
+// TAO_IDL - Generated from
+// be\be_interface.cpp:1955
+
+ACE_INLINE
+void
+POA_CORBA::ExceptionDef::create_ext_value_skel (
+ TAO_ServerRequest & server_request,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL
+ )
+{
+ POA_CORBA::Container * const impl = static_cast<POA_CORBA::ExceptionDef *> (servant);
+ POA_CORBA::Container::create_ext_value_skel (
+ server_request,
+ servant_upcall,
+ impl
+ ACE_ENV_ARG_PARAMETER
+ );
+}
+
+ACE_INLINE
+void
+POA_CORBA::AttributeDef::_get_def_kind_skel (
+ TAO_ServerRequest & server_request,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL
+ )
+{
+ POA_CORBA::IRObject * const impl = static_cast<POA_CORBA::AttributeDef *> (servant);
+ POA_CORBA::IRObject::_get_def_kind_skel (
+ server_request,
+ servant_upcall,
+ impl
+ ACE_ENV_ARG_PARAMETER
+ );
+}
+
+// TAO_IDL - Generated from
+// be\be_interface.cpp:1955
+
+ACE_INLINE
+void
+POA_CORBA::AttributeDef::destroy_skel (
+ TAO_ServerRequest & server_request,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL
+ )
+{
+ POA_CORBA::IRObject * const impl = static_cast<POA_CORBA::AttributeDef *> (servant);
+ POA_CORBA::IRObject::destroy_skel (
+ server_request,
+ servant_upcall,
+ impl
+ ACE_ENV_ARG_PARAMETER
+ );
+}
+
+ACE_INLINE
+void
+POA_CORBA::AttributeDef::_get_id_skel (
+ TAO_ServerRequest & server_request,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL
+ )
+{
+ POA_CORBA::Contained * const impl = static_cast<POA_CORBA::AttributeDef *> (servant);
+ POA_CORBA::Contained::_get_id_skel (
+ server_request,
+ servant_upcall,
+ impl
+ ACE_ENV_ARG_PARAMETER
+ );
+}
+
+ACE_INLINE
+void
+POA_CORBA::AttributeDef::_set_id_skel (
+ TAO_ServerRequest & server_request,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL
+ )
+{
+ POA_CORBA::Contained * const impl = static_cast<POA_CORBA::AttributeDef *> (servant);
+ POA_CORBA::Contained::_set_id_skel (
+ server_request,
+ servant_upcall,
+ impl
+ ACE_ENV_ARG_PARAMETER
+ );
+}
+
+ACE_INLINE
+void
+POA_CORBA::AttributeDef::_get_name_skel (
+ TAO_ServerRequest & server_request,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL
+ )
+{
+ POA_CORBA::Contained * const impl = static_cast<POA_CORBA::AttributeDef *> (servant);
+ POA_CORBA::Contained::_get_name_skel (
+ server_request,
+ servant_upcall,
+ impl
+ ACE_ENV_ARG_PARAMETER
+ );
+}
+
+ACE_INLINE
+void
+POA_CORBA::AttributeDef::_set_name_skel (
+ TAO_ServerRequest & server_request,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL
+ )
+{
+ POA_CORBA::Contained * const impl = static_cast<POA_CORBA::AttributeDef *> (servant);
+ POA_CORBA::Contained::_set_name_skel (
+ server_request,
+ servant_upcall,
+ impl
+ ACE_ENV_ARG_PARAMETER
+ );
+}
+
+ACE_INLINE
+void
+POA_CORBA::AttributeDef::_get_version_skel (
+ TAO_ServerRequest & server_request,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL
+ )
+{
+ POA_CORBA::Contained * const impl = static_cast<POA_CORBA::AttributeDef *> (servant);
+ POA_CORBA::Contained::_get_version_skel (
+ server_request,
+ servant_upcall,
+ impl
+ ACE_ENV_ARG_PARAMETER
+ );
+}
+
+ACE_INLINE
+void
+POA_CORBA::AttributeDef::_set_version_skel (
+ TAO_ServerRequest & server_request,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL
+ )
+{
+ POA_CORBA::Contained * const impl = static_cast<POA_CORBA::AttributeDef *> (servant);
+ POA_CORBA::Contained::_set_version_skel (
+ server_request,
+ servant_upcall,
+ impl
+ ACE_ENV_ARG_PARAMETER
+ );
+}
+
+ACE_INLINE
+void
+POA_CORBA::AttributeDef::_get_defined_in_skel (
+ TAO_ServerRequest & server_request,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL
+ )
+{
+ POA_CORBA::Contained * const impl = static_cast<POA_CORBA::AttributeDef *> (servant);
+ POA_CORBA::Contained::_get_defined_in_skel (
+ server_request,
+ servant_upcall,
+ impl
+ ACE_ENV_ARG_PARAMETER
+ );
+}
+
+ACE_INLINE
+void
+POA_CORBA::AttributeDef::_get_absolute_name_skel (
+ TAO_ServerRequest & server_request,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL
+ )
+{
+ POA_CORBA::Contained * const impl = static_cast<POA_CORBA::AttributeDef *> (servant);
+ POA_CORBA::Contained::_get_absolute_name_skel (
+ server_request,
+ servant_upcall,
+ impl
+ ACE_ENV_ARG_PARAMETER
+ );
+}
+
+ACE_INLINE
+void
+POA_CORBA::AttributeDef::_get_containing_repository_skel (
+ TAO_ServerRequest & server_request,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL
+ )
+{
+ POA_CORBA::Contained * const impl = static_cast<POA_CORBA::AttributeDef *> (servant);
+ POA_CORBA::Contained::_get_containing_repository_skel (
+ server_request,
+ servant_upcall,
+ impl
+ ACE_ENV_ARG_PARAMETER
+ );
+}
+
+// TAO_IDL - Generated from
+// be\be_interface.cpp:1955
+
+ACE_INLINE
+void
+POA_CORBA::AttributeDef::describe_skel (
+ TAO_ServerRequest & server_request,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL
+ )
+{
+ POA_CORBA::Contained * const impl = static_cast<POA_CORBA::AttributeDef *> (servant);
+ POA_CORBA::Contained::describe_skel (
+ server_request,
+ servant_upcall,
+ impl
+ ACE_ENV_ARG_PARAMETER
+ );
+}
+
+// TAO_IDL - Generated from
+// be\be_interface.cpp:1955
+
+ACE_INLINE
+void
+POA_CORBA::AttributeDef::move_skel (
+ TAO_ServerRequest & server_request,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL
+ )
+{
+ POA_CORBA::Contained * const impl = static_cast<POA_CORBA::AttributeDef *> (servant);
+ POA_CORBA::Contained::move_skel (
+ server_request,
+ servant_upcall,
+ impl
+ ACE_ENV_ARG_PARAMETER
+ );
+}
+
+ACE_INLINE
+void
+POA_CORBA::ExtAttributeDef::_get_def_kind_skel (
+ TAO_ServerRequest & server_request,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL
+ )
+{
+ POA_CORBA::IRObject * const impl = static_cast<POA_CORBA::ExtAttributeDef *> (servant);
+ POA_CORBA::IRObject::_get_def_kind_skel (
+ server_request,
+ servant_upcall,
+ impl
+ ACE_ENV_ARG_PARAMETER
+ );
+}
+
+// TAO_IDL - Generated from
+// be\be_interface.cpp:1955
+
+ACE_INLINE
+void
+POA_CORBA::ExtAttributeDef::destroy_skel (
+ TAO_ServerRequest & server_request,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL
+ )
+{
+ POA_CORBA::IRObject * const impl = static_cast<POA_CORBA::ExtAttributeDef *> (servant);
+ POA_CORBA::IRObject::destroy_skel (
+ server_request,
+ servant_upcall,
+ impl
+ ACE_ENV_ARG_PARAMETER
+ );
+}
+
+ACE_INLINE
+void
+POA_CORBA::ExtAttributeDef::_get_id_skel (
+ TAO_ServerRequest & server_request,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL
+ )
+{
+ POA_CORBA::Contained * const impl = static_cast<POA_CORBA::ExtAttributeDef *> (servant);
+ POA_CORBA::Contained::_get_id_skel (
+ server_request,
+ servant_upcall,
+ impl
+ ACE_ENV_ARG_PARAMETER
+ );
+}
+
+ACE_INLINE
+void
+POA_CORBA::ExtAttributeDef::_set_id_skel (
+ TAO_ServerRequest & server_request,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL
+ )
+{
+ POA_CORBA::Contained * const impl = static_cast<POA_CORBA::ExtAttributeDef *> (servant);
+ POA_CORBA::Contained::_set_id_skel (
+ server_request,
+ servant_upcall,
+ impl
+ ACE_ENV_ARG_PARAMETER
+ );
+}
+
+ACE_INLINE
+void
+POA_CORBA::ExtAttributeDef::_get_name_skel (
+ TAO_ServerRequest & server_request,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL
+ )
+{
+ POA_CORBA::Contained * const impl = static_cast<POA_CORBA::ExtAttributeDef *> (servant);
+ POA_CORBA::Contained::_get_name_skel (
+ server_request,
+ servant_upcall,
+ impl
+ ACE_ENV_ARG_PARAMETER
+ );
+}
+
+ACE_INLINE
+void
+POA_CORBA::ExtAttributeDef::_set_name_skel (
+ TAO_ServerRequest & server_request,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL
+ )
+{
+ POA_CORBA::Contained * const impl = static_cast<POA_CORBA::ExtAttributeDef *> (servant);
+ POA_CORBA::Contained::_set_name_skel (
+ server_request,
+ servant_upcall,
+ impl
+ ACE_ENV_ARG_PARAMETER
+ );
+}
+
+ACE_INLINE
+void
+POA_CORBA::ExtAttributeDef::_get_version_skel (
+ TAO_ServerRequest & server_request,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL
+ )
+{
+ POA_CORBA::Contained * const impl = static_cast<POA_CORBA::ExtAttributeDef *> (servant);
+ POA_CORBA::Contained::_get_version_skel (
+ server_request,
+ servant_upcall,
+ impl
+ ACE_ENV_ARG_PARAMETER
+ );
+}
+
+ACE_INLINE
+void
+POA_CORBA::ExtAttributeDef::_set_version_skel (
+ TAO_ServerRequest & server_request,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL
+ )
+{
+ POA_CORBA::Contained * const impl = static_cast<POA_CORBA::ExtAttributeDef *> (servant);
+ POA_CORBA::Contained::_set_version_skel (
+ server_request,
+ servant_upcall,
+ impl
+ ACE_ENV_ARG_PARAMETER
+ );
+}
+
+ACE_INLINE
+void
+POA_CORBA::ExtAttributeDef::_get_defined_in_skel (
+ TAO_ServerRequest & server_request,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL
+ )
+{
+ POA_CORBA::Contained * const impl = static_cast<POA_CORBA::ExtAttributeDef *> (servant);
+ POA_CORBA::Contained::_get_defined_in_skel (
+ server_request,
+ servant_upcall,
+ impl
+ ACE_ENV_ARG_PARAMETER
+ );
+}
+
+ACE_INLINE
+void
+POA_CORBA::ExtAttributeDef::_get_absolute_name_skel (
+ TAO_ServerRequest & server_request,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL
+ )
+{
+ POA_CORBA::Contained * const impl = static_cast<POA_CORBA::ExtAttributeDef *> (servant);
+ POA_CORBA::Contained::_get_absolute_name_skel (
+ server_request,
+ servant_upcall,
+ impl
+ ACE_ENV_ARG_PARAMETER
+ );
+}
+
+ACE_INLINE
+void
+POA_CORBA::ExtAttributeDef::_get_containing_repository_skel (
+ TAO_ServerRequest & server_request,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL
+ )
+{
+ POA_CORBA::Contained * const impl = static_cast<POA_CORBA::ExtAttributeDef *> (servant);
+ POA_CORBA::Contained::_get_containing_repository_skel (
+ server_request,
+ servant_upcall,
+ impl
+ ACE_ENV_ARG_PARAMETER
+ );
+}
+
+// TAO_IDL - Generated from
+// be\be_interface.cpp:1955
+
+ACE_INLINE
+void
+POA_CORBA::ExtAttributeDef::describe_skel (
+ TAO_ServerRequest & server_request,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL
+ )
+{
+ POA_CORBA::Contained * const impl = static_cast<POA_CORBA::ExtAttributeDef *> (servant);
+ POA_CORBA::Contained::describe_skel (
+ server_request,
+ servant_upcall,
+ impl
+ ACE_ENV_ARG_PARAMETER
+ );
+}
+
+// TAO_IDL - Generated from
+// be\be_interface.cpp:1955
+
+ACE_INLINE
+void
+POA_CORBA::ExtAttributeDef::move_skel (
+ TAO_ServerRequest & server_request,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL
+ )
+{
+ POA_CORBA::Contained * const impl = static_cast<POA_CORBA::ExtAttributeDef *> (servant);
+ POA_CORBA::Contained::move_skel (
+ server_request,
+ servant_upcall,
+ impl
+ ACE_ENV_ARG_PARAMETER
+ );
+}
+
+ACE_INLINE
+void
+POA_CORBA::ExtAttributeDef::_get_type_skel (
+ TAO_ServerRequest & server_request,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL
+ )
+{
+ POA_CORBA::AttributeDef * const impl = static_cast<POA_CORBA::ExtAttributeDef *> (servant);
+ POA_CORBA::AttributeDef::_get_type_skel (
+ server_request,
+ servant_upcall,
+ impl
+ ACE_ENV_ARG_PARAMETER
+ );
+}
+
+ACE_INLINE
+void
+POA_CORBA::ExtAttributeDef::_get_type_def_skel (
+ TAO_ServerRequest & server_request,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL
+ )
+{
+ POA_CORBA::AttributeDef * const impl = static_cast<POA_CORBA::ExtAttributeDef *> (servant);
+ POA_CORBA::AttributeDef::_get_type_def_skel (
+ server_request,
+ servant_upcall,
+ impl
+ ACE_ENV_ARG_PARAMETER
+ );
+}
+
+ACE_INLINE
+void
+POA_CORBA::ExtAttributeDef::_set_type_def_skel (
+ TAO_ServerRequest & server_request,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL
+ )
+{
+ POA_CORBA::AttributeDef * const impl = static_cast<POA_CORBA::ExtAttributeDef *> (servant);
+ POA_CORBA::AttributeDef::_set_type_def_skel (
+ server_request,
+ servant_upcall,
+ impl
+ ACE_ENV_ARG_PARAMETER
+ );
+}
+
+ACE_INLINE
+void
+POA_CORBA::ExtAttributeDef::_get_mode_skel (
+ TAO_ServerRequest & server_request,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL
+ )
+{
+ POA_CORBA::AttributeDef * const impl = static_cast<POA_CORBA::ExtAttributeDef *> (servant);
+ POA_CORBA::AttributeDef::_get_mode_skel (
+ server_request,
+ servant_upcall,
+ impl
+ ACE_ENV_ARG_PARAMETER
+ );
+}
+
+ACE_INLINE
+void
+POA_CORBA::ExtAttributeDef::_set_mode_skel (
+ TAO_ServerRequest & server_request,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL
+ )
+{
+ POA_CORBA::AttributeDef * const impl = static_cast<POA_CORBA::ExtAttributeDef *> (servant);
+ POA_CORBA::AttributeDef::_set_mode_skel (
+ server_request,
+ servant_upcall,
+ impl
+ ACE_ENV_ARG_PARAMETER
+ );
+}
+
+ACE_INLINE
+void
+POA_CORBA::OperationDef::_get_def_kind_skel (
+ TAO_ServerRequest & server_request,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL
+ )
+{
+ POA_CORBA::IRObject * const impl = static_cast<POA_CORBA::OperationDef *> (servant);
+ POA_CORBA::IRObject::_get_def_kind_skel (
+ server_request,
+ servant_upcall,
+ impl
+ ACE_ENV_ARG_PARAMETER
+ );
+}
+
+// TAO_IDL - Generated from
+// be\be_interface.cpp:1955
+
+ACE_INLINE
+void
+POA_CORBA::OperationDef::destroy_skel (
+ TAO_ServerRequest & server_request,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL
+ )
+{
+ POA_CORBA::IRObject * const impl = static_cast<POA_CORBA::OperationDef *> (servant);
+ POA_CORBA::IRObject::destroy_skel (
+ server_request,
+ servant_upcall,
+ impl
+ ACE_ENV_ARG_PARAMETER
+ );
+}
+
+ACE_INLINE
+void
+POA_CORBA::OperationDef::_get_id_skel (
+ TAO_ServerRequest & server_request,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL
+ )
+{
+ POA_CORBA::Contained * const impl = static_cast<POA_CORBA::OperationDef *> (servant);
+ POA_CORBA::Contained::_get_id_skel (
+ server_request,
+ servant_upcall,
+ impl
+ ACE_ENV_ARG_PARAMETER
+ );
+}
+
+ACE_INLINE
+void
+POA_CORBA::OperationDef::_set_id_skel (
+ TAO_ServerRequest & server_request,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL
+ )
+{
+ POA_CORBA::Contained * const impl = static_cast<POA_CORBA::OperationDef *> (servant);
+ POA_CORBA::Contained::_set_id_skel (
+ server_request,
+ servant_upcall,
+ impl
+ ACE_ENV_ARG_PARAMETER
+ );
+}
+
+ACE_INLINE
+void
+POA_CORBA::OperationDef::_get_name_skel (
+ TAO_ServerRequest & server_request,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL
+ )
+{
+ POA_CORBA::Contained * const impl = static_cast<POA_CORBA::OperationDef *> (servant);
+ POA_CORBA::Contained::_get_name_skel (
+ server_request,
+ servant_upcall,
+ impl
+ ACE_ENV_ARG_PARAMETER
+ );
+}
+
+ACE_INLINE
+void
+POA_CORBA::OperationDef::_set_name_skel (
+ TAO_ServerRequest & server_request,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL
+ )
+{
+ POA_CORBA::Contained * const impl = static_cast<POA_CORBA::OperationDef *> (servant);
+ POA_CORBA::Contained::_set_name_skel (
+ server_request,
+ servant_upcall,
+ impl
+ ACE_ENV_ARG_PARAMETER
+ );
+}
+
+ACE_INLINE
+void
+POA_CORBA::OperationDef::_get_version_skel (
+ TAO_ServerRequest & server_request,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL
+ )
+{
+ POA_CORBA::Contained * const impl = static_cast<POA_CORBA::OperationDef *> (servant);
+ POA_CORBA::Contained::_get_version_skel (
+ server_request,
+ servant_upcall,
+ impl
+ ACE_ENV_ARG_PARAMETER
+ );
+}
+
+ACE_INLINE
+void
+POA_CORBA::OperationDef::_set_version_skel (
+ TAO_ServerRequest & server_request,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL
+ )
+{
+ POA_CORBA::Contained * const impl = static_cast<POA_CORBA::OperationDef *> (servant);
+ POA_CORBA::Contained::_set_version_skel (
+ server_request,
+ servant_upcall,
+ impl
+ ACE_ENV_ARG_PARAMETER
+ );
+}
+
+ACE_INLINE
+void
+POA_CORBA::OperationDef::_get_defined_in_skel (
+ TAO_ServerRequest & server_request,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL
+ )
+{
+ POA_CORBA::Contained * const impl = static_cast<POA_CORBA::OperationDef *> (servant);
+ POA_CORBA::Contained::_get_defined_in_skel (
+ server_request,
+ servant_upcall,
+ impl
+ ACE_ENV_ARG_PARAMETER
+ );
+}
+
+ACE_INLINE
+void
+POA_CORBA::OperationDef::_get_absolute_name_skel (
+ TAO_ServerRequest & server_request,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL
+ )
+{
+ POA_CORBA::Contained * const impl = static_cast<POA_CORBA::OperationDef *> (servant);
+ POA_CORBA::Contained::_get_absolute_name_skel (
+ server_request,
+ servant_upcall,
+ impl
+ ACE_ENV_ARG_PARAMETER
+ );
+}
+
+ACE_INLINE
+void
+POA_CORBA::OperationDef::_get_containing_repository_skel (
+ TAO_ServerRequest & server_request,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL
+ )
+{
+ POA_CORBA::Contained * const impl = static_cast<POA_CORBA::OperationDef *> (servant);
+ POA_CORBA::Contained::_get_containing_repository_skel (
+ server_request,
+ servant_upcall,
+ impl
+ ACE_ENV_ARG_PARAMETER
+ );
+}
+
+// TAO_IDL - Generated from
+// be\be_interface.cpp:1955
+
+ACE_INLINE
+void
+POA_CORBA::OperationDef::describe_skel (
+ TAO_ServerRequest & server_request,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL
+ )
+{
+ POA_CORBA::Contained * const impl = static_cast<POA_CORBA::OperationDef *> (servant);
+ POA_CORBA::Contained::describe_skel (
+ server_request,
+ servant_upcall,
+ impl
+ ACE_ENV_ARG_PARAMETER
+ );
+}
+
+// TAO_IDL - Generated from
+// be\be_interface.cpp:1955
+
+ACE_INLINE
+void
+POA_CORBA::OperationDef::move_skel (
+ TAO_ServerRequest & server_request,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL
+ )
+{
+ POA_CORBA::Contained * const impl = static_cast<POA_CORBA::OperationDef *> (servant);
+ POA_CORBA::Contained::move_skel (
+ server_request,
+ servant_upcall,
+ impl
+ ACE_ENV_ARG_PARAMETER
+ );
+}
+
+ACE_INLINE
+void
+POA_CORBA::InterfaceDef::_get_def_kind_skel (
+ TAO_ServerRequest & server_request,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL
+ )
+{
+ POA_CORBA::IRObject * const impl = static_cast<POA_CORBA::InterfaceDef *> (servant);
+ POA_CORBA::IRObject::_get_def_kind_skel (
+ server_request,
+ servant_upcall,
+ impl
+ ACE_ENV_ARG_PARAMETER
+ );
+}
+
+// TAO_IDL - Generated from
+// be\be_interface.cpp:1955
+
+ACE_INLINE
+void
+POA_CORBA::InterfaceDef::destroy_skel (
+ TAO_ServerRequest & server_request,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL
+ )
+{
+ POA_CORBA::IRObject * const impl = static_cast<POA_CORBA::InterfaceDef *> (servant);
+ POA_CORBA::IRObject::destroy_skel (
+ server_request,
+ servant_upcall,
+ impl
+ ACE_ENV_ARG_PARAMETER
+ );
+}
+
+// TAO_IDL - Generated from
+// be\be_interface.cpp:1955
+
+ACE_INLINE
+void
+POA_CORBA::InterfaceDef::lookup_skel (
+ TAO_ServerRequest & server_request,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL
+ )
+{
+ POA_CORBA::Container * const impl = static_cast<POA_CORBA::InterfaceDef *> (servant);
+ POA_CORBA::Container::lookup_skel (
+ server_request,
+ servant_upcall,
+ impl
+ ACE_ENV_ARG_PARAMETER
+ );
+}
+
+// TAO_IDL - Generated from
+// be\be_interface.cpp:1955
+
+ACE_INLINE
+void
+POA_CORBA::InterfaceDef::contents_skel (
+ TAO_ServerRequest & server_request,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL
+ )
+{
+ POA_CORBA::Container * const impl = static_cast<POA_CORBA::InterfaceDef *> (servant);
+ POA_CORBA::Container::contents_skel (
+ server_request,
+ servant_upcall,
+ impl
+ ACE_ENV_ARG_PARAMETER
+ );
+}
+
+// TAO_IDL - Generated from
+// be\be_interface.cpp:1955
+
+ACE_INLINE
+void
+POA_CORBA::InterfaceDef::lookup_name_skel (
+ TAO_ServerRequest & server_request,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL
+ )
+{
+ POA_CORBA::Container * const impl = static_cast<POA_CORBA::InterfaceDef *> (servant);
+ POA_CORBA::Container::lookup_name_skel (
+ server_request,
+ servant_upcall,
+ impl
+ ACE_ENV_ARG_PARAMETER
+ );
+}
+
+// TAO_IDL - Generated from
+// be\be_interface.cpp:1955
+
+ACE_INLINE
+void
+POA_CORBA::InterfaceDef::describe_contents_skel (
+ TAO_ServerRequest & server_request,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL
+ )
+{
+ POA_CORBA::Container * const impl = static_cast<POA_CORBA::InterfaceDef *> (servant);
+ POA_CORBA::Container::describe_contents_skel (
+ server_request,
+ servant_upcall,
+ impl
+ ACE_ENV_ARG_PARAMETER
+ );
+}
+
+// TAO_IDL - Generated from
+// be\be_interface.cpp:1955
+
+ACE_INLINE
+void
+POA_CORBA::InterfaceDef::create_module_skel (
+ TAO_ServerRequest & server_request,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL
+ )
+{
+ POA_CORBA::Container * const impl = static_cast<POA_CORBA::InterfaceDef *> (servant);
+ POA_CORBA::Container::create_module_skel (
+ server_request,
+ servant_upcall,
+ impl
+ ACE_ENV_ARG_PARAMETER
+ );
+}
+
+// TAO_IDL - Generated from
+// be\be_interface.cpp:1955
+
+ACE_INLINE
+void
+POA_CORBA::InterfaceDef::create_constant_skel (
+ TAO_ServerRequest & server_request,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL
+ )
+{
+ POA_CORBA::Container * const impl = static_cast<POA_CORBA::InterfaceDef *> (servant);
+ POA_CORBA::Container::create_constant_skel (
+ server_request,
+ servant_upcall,
+ impl
+ ACE_ENV_ARG_PARAMETER
+ );
+}
+
+// TAO_IDL - Generated from
+// be\be_interface.cpp:1955
+
+ACE_INLINE
+void
+POA_CORBA::InterfaceDef::create_struct_skel (
+ TAO_ServerRequest & server_request,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL
+ )
+{
+ POA_CORBA::Container * const impl = static_cast<POA_CORBA::InterfaceDef *> (servant);
+ POA_CORBA::Container::create_struct_skel (
+ server_request,
+ servant_upcall,
+ impl
+ ACE_ENV_ARG_PARAMETER
+ );
+}
+
+// TAO_IDL - Generated from
+// be\be_interface.cpp:1955
+
+ACE_INLINE
+void
+POA_CORBA::InterfaceDef::create_union_skel (
+ TAO_ServerRequest & server_request,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL
+ )
+{
+ POA_CORBA::Container * const impl = static_cast<POA_CORBA::InterfaceDef *> (servant);
+ POA_CORBA::Container::create_union_skel (
+ server_request,
+ servant_upcall,
+ impl
+ ACE_ENV_ARG_PARAMETER
+ );
+}
+
+// TAO_IDL - Generated from
+// be\be_interface.cpp:1955
+
+ACE_INLINE
+void
+POA_CORBA::InterfaceDef::create_enum_skel (
+ TAO_ServerRequest & server_request,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL
+ )
+{
+ POA_CORBA::Container * const impl = static_cast<POA_CORBA::InterfaceDef *> (servant);
+ POA_CORBA::Container::create_enum_skel (
+ server_request,
+ servant_upcall,
+ impl
+ ACE_ENV_ARG_PARAMETER
+ );
+}
+
+// TAO_IDL - Generated from
+// be\be_interface.cpp:1955
+
+ACE_INLINE
+void
+POA_CORBA::InterfaceDef::create_alias_skel (
+ TAO_ServerRequest & server_request,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL
+ )
+{
+ POA_CORBA::Container * const impl = static_cast<POA_CORBA::InterfaceDef *> (servant);
+ POA_CORBA::Container::create_alias_skel (
+ server_request,
+ servant_upcall,
+ impl
+ ACE_ENV_ARG_PARAMETER
+ );
+}
+
+// TAO_IDL - Generated from
+// be\be_interface.cpp:1955
+
+ACE_INLINE
+void
+POA_CORBA::InterfaceDef::create_interface_skel (
+ TAO_ServerRequest & server_request,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL
+ )
+{
+ POA_CORBA::Container * const impl = static_cast<POA_CORBA::InterfaceDef *> (servant);
+ POA_CORBA::Container::create_interface_skel (
+ server_request,
+ servant_upcall,
+ impl
+ ACE_ENV_ARG_PARAMETER
+ );
+}
+
+// TAO_IDL - Generated from
+// be\be_interface.cpp:1955
+
+ACE_INLINE
+void
+POA_CORBA::InterfaceDef::create_value_skel (
+ TAO_ServerRequest & server_request,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL
+ )
+{
+ POA_CORBA::Container * const impl = static_cast<POA_CORBA::InterfaceDef *> (servant);
+ POA_CORBA::Container::create_value_skel (
+ server_request,
+ servant_upcall,
+ impl
+ ACE_ENV_ARG_PARAMETER
+ );
+}
+
+// TAO_IDL - Generated from
+// be\be_interface.cpp:1955
+
+ACE_INLINE
+void
+POA_CORBA::InterfaceDef::create_value_box_skel (
+ TAO_ServerRequest & server_request,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL
+ )
+{
+ POA_CORBA::Container * const impl = static_cast<POA_CORBA::InterfaceDef *> (servant);
+ POA_CORBA::Container::create_value_box_skel (
+ server_request,
+ servant_upcall,
+ impl
+ ACE_ENV_ARG_PARAMETER
+ );
+}
+
+// TAO_IDL - Generated from
+// be\be_interface.cpp:1955
+
+ACE_INLINE
+void
+POA_CORBA::InterfaceDef::create_exception_skel (
+ TAO_ServerRequest & server_request,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL
+ )
+{
+ POA_CORBA::Container * const impl = static_cast<POA_CORBA::InterfaceDef *> (servant);
+ POA_CORBA::Container::create_exception_skel (
+ server_request,
+ servant_upcall,
+ impl
+ ACE_ENV_ARG_PARAMETER
+ );
+}
+
+// TAO_IDL - Generated from
+// be\be_interface.cpp:1955
+
+ACE_INLINE
+void
+POA_CORBA::InterfaceDef::create_native_skel (
+ TAO_ServerRequest & server_request,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL
+ )
+{
+ POA_CORBA::Container * const impl = static_cast<POA_CORBA::InterfaceDef *> (servant);
+ POA_CORBA::Container::create_native_skel (
+ server_request,
+ servant_upcall,
+ impl
+ ACE_ENV_ARG_PARAMETER
+ );
+}
+
+// TAO_IDL - Generated from
+// be\be_interface.cpp:1955
+
+ACE_INLINE
+void
+POA_CORBA::InterfaceDef::create_abstract_interface_skel (
+ TAO_ServerRequest & server_request,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL
+ )
+{
+ POA_CORBA::Container * const impl = static_cast<POA_CORBA::InterfaceDef *> (servant);
+ POA_CORBA::Container::create_abstract_interface_skel (
+ server_request,
+ servant_upcall,
+ impl
+ ACE_ENV_ARG_PARAMETER
+ );
+}
+
+// TAO_IDL - Generated from
+// be\be_interface.cpp:1955
+
+ACE_INLINE
+void
+POA_CORBA::InterfaceDef::create_local_interface_skel (
+ TAO_ServerRequest & server_request,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL
+ )
+{
+ POA_CORBA::Container * const impl = static_cast<POA_CORBA::InterfaceDef *> (servant);
+ POA_CORBA::Container::create_local_interface_skel (
+ server_request,
+ servant_upcall,
+ impl
+ ACE_ENV_ARG_PARAMETER
+ );
+}
+
+// TAO_IDL - Generated from
+// be\be_interface.cpp:1955
+
+ACE_INLINE
+void
+POA_CORBA::InterfaceDef::create_ext_value_skel (
+ TAO_ServerRequest & server_request,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL
+ )
+{
+ POA_CORBA::Container * const impl = static_cast<POA_CORBA::InterfaceDef *> (servant);
+ POA_CORBA::Container::create_ext_value_skel (
+ server_request,
+ servant_upcall,
+ impl
+ ACE_ENV_ARG_PARAMETER
+ );
+}
+
+ACE_INLINE
+void
+POA_CORBA::InterfaceDef::_get_id_skel (
+ TAO_ServerRequest & server_request,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL
+ )
+{
+ POA_CORBA::Contained * const impl = static_cast<POA_CORBA::InterfaceDef *> (servant);
+ POA_CORBA::Contained::_get_id_skel (
+ server_request,
+ servant_upcall,
+ impl
+ ACE_ENV_ARG_PARAMETER
+ );
+}
+
+ACE_INLINE
+void
+POA_CORBA::InterfaceDef::_set_id_skel (
+ TAO_ServerRequest & server_request,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL
+ )
+{
+ POA_CORBA::Contained * const impl = static_cast<POA_CORBA::InterfaceDef *> (servant);
+ POA_CORBA::Contained::_set_id_skel (
+ server_request,
+ servant_upcall,
+ impl
+ ACE_ENV_ARG_PARAMETER
+ );
+}
+
+ACE_INLINE
+void
+POA_CORBA::InterfaceDef::_get_name_skel (
+ TAO_ServerRequest & server_request,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL
+ )
+{
+ POA_CORBA::Contained * const impl = static_cast<POA_CORBA::InterfaceDef *> (servant);
+ POA_CORBA::Contained::_get_name_skel (
+ server_request,
+ servant_upcall,
+ impl
+ ACE_ENV_ARG_PARAMETER
+ );
+}
+
+ACE_INLINE
+void
+POA_CORBA::InterfaceDef::_set_name_skel (
+ TAO_ServerRequest & server_request,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL
+ )
+{
+ POA_CORBA::Contained * const impl = static_cast<POA_CORBA::InterfaceDef *> (servant);
+ POA_CORBA::Contained::_set_name_skel (
+ server_request,
+ servant_upcall,
+ impl
+ ACE_ENV_ARG_PARAMETER
+ );
+}
+
+ACE_INLINE
+void
+POA_CORBA::InterfaceDef::_get_version_skel (
+ TAO_ServerRequest & server_request,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL
+ )
+{
+ POA_CORBA::Contained * const impl = static_cast<POA_CORBA::InterfaceDef *> (servant);
+ POA_CORBA::Contained::_get_version_skel (
+ server_request,
+ servant_upcall,
+ impl
+ ACE_ENV_ARG_PARAMETER
+ );
+}
+
+ACE_INLINE
+void
+POA_CORBA::InterfaceDef::_set_version_skel (
+ TAO_ServerRequest & server_request,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL
+ )
+{
+ POA_CORBA::Contained * const impl = static_cast<POA_CORBA::InterfaceDef *> (servant);
+ POA_CORBA::Contained::_set_version_skel (
+ server_request,
+ servant_upcall,
+ impl
+ ACE_ENV_ARG_PARAMETER
+ );
+}
+
+ACE_INLINE
+void
+POA_CORBA::InterfaceDef::_get_defined_in_skel (
+ TAO_ServerRequest & server_request,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL
+ )
+{
+ POA_CORBA::Contained * const impl = static_cast<POA_CORBA::InterfaceDef *> (servant);
+ POA_CORBA::Contained::_get_defined_in_skel (
+ server_request,
+ servant_upcall,
+ impl
+ ACE_ENV_ARG_PARAMETER
+ );
+}
+
+ACE_INLINE
+void
+POA_CORBA::InterfaceDef::_get_absolute_name_skel (
+ TAO_ServerRequest & server_request,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL
+ )
+{
+ POA_CORBA::Contained * const impl = static_cast<POA_CORBA::InterfaceDef *> (servant);
+ POA_CORBA::Contained::_get_absolute_name_skel (
+ server_request,
+ servant_upcall,
+ impl
+ ACE_ENV_ARG_PARAMETER
+ );
+}
+
+ACE_INLINE
+void
+POA_CORBA::InterfaceDef::_get_containing_repository_skel (
+ TAO_ServerRequest & server_request,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL
+ )
+{
+ POA_CORBA::Contained * const impl = static_cast<POA_CORBA::InterfaceDef *> (servant);
+ POA_CORBA::Contained::_get_containing_repository_skel (
+ server_request,
+ servant_upcall,
+ impl
+ ACE_ENV_ARG_PARAMETER
+ );
+}
+
+// TAO_IDL - Generated from
+// be\be_interface.cpp:1955
+
+ACE_INLINE
+void
+POA_CORBA::InterfaceDef::describe_skel (
+ TAO_ServerRequest & server_request,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL
+ )
+{
+ POA_CORBA::Contained * const impl = static_cast<POA_CORBA::InterfaceDef *> (servant);
+ POA_CORBA::Contained::describe_skel (
+ server_request,
+ servant_upcall,
+ impl
+ ACE_ENV_ARG_PARAMETER
+ );
+}
+
+// TAO_IDL - Generated from
+// be\be_interface.cpp:1955
+
+ACE_INLINE
+void
+POA_CORBA::InterfaceDef::move_skel (
+ TAO_ServerRequest & server_request,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL
+ )
+{
+ POA_CORBA::Contained * const impl = static_cast<POA_CORBA::InterfaceDef *> (servant);
+ POA_CORBA::Contained::move_skel (
+ server_request,
+ servant_upcall,
+ impl
+ ACE_ENV_ARG_PARAMETER
+ );
+}
+
+ACE_INLINE
+void
+POA_CORBA::InterfaceDef::_get_type_skel (
+ TAO_ServerRequest & server_request,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL
+ )
+{
+ POA_CORBA::IDLType * const impl = static_cast<POA_CORBA::InterfaceDef *> (servant);
+ POA_CORBA::IDLType::_get_type_skel (
+ server_request,
+ servant_upcall,
+ impl
+ ACE_ENV_ARG_PARAMETER
+ );
+}
+
+ACE_INLINE
+void
+POA_CORBA::ExtInterfaceDef::_get_def_kind_skel (
+ TAO_ServerRequest & server_request,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL
+ )
+{
+ POA_CORBA::IRObject * const impl = static_cast<POA_CORBA::ExtInterfaceDef *> (servant);
+ POA_CORBA::IRObject::_get_def_kind_skel (
+ server_request,
+ servant_upcall,
+ impl
+ ACE_ENV_ARG_PARAMETER
+ );
+}
+
+// TAO_IDL - Generated from
+// be\be_interface.cpp:1955
+
+ACE_INLINE
+void
+POA_CORBA::ExtInterfaceDef::destroy_skel (
+ TAO_ServerRequest & server_request,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL
+ )
+{
+ POA_CORBA::IRObject * const impl = static_cast<POA_CORBA::ExtInterfaceDef *> (servant);
+ POA_CORBA::IRObject::destroy_skel (
+ server_request,
+ servant_upcall,
+ impl
+ ACE_ENV_ARG_PARAMETER
+ );
+}
+
+// TAO_IDL - Generated from
+// be\be_interface.cpp:1955
+
+ACE_INLINE
+void
+POA_CORBA::ExtInterfaceDef::lookup_skel (
+ TAO_ServerRequest & server_request,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL
+ )
+{
+ POA_CORBA::Container * const impl = static_cast<POA_CORBA::ExtInterfaceDef *> (servant);
+ POA_CORBA::Container::lookup_skel (
+ server_request,
+ servant_upcall,
+ impl
+ ACE_ENV_ARG_PARAMETER
+ );
+}
+
+// TAO_IDL - Generated from
+// be\be_interface.cpp:1955
+
+ACE_INLINE
+void
+POA_CORBA::ExtInterfaceDef::contents_skel (
+ TAO_ServerRequest & server_request,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL
+ )
+{
+ POA_CORBA::Container * const impl = static_cast<POA_CORBA::ExtInterfaceDef *> (servant);
+ POA_CORBA::Container::contents_skel (
+ server_request,
+ servant_upcall,
+ impl
+ ACE_ENV_ARG_PARAMETER
+ );
+}
+
+// TAO_IDL - Generated from
+// be\be_interface.cpp:1955
+
+ACE_INLINE
+void
+POA_CORBA::ExtInterfaceDef::lookup_name_skel (
+ TAO_ServerRequest & server_request,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL
+ )
+{
+ POA_CORBA::Container * const impl = static_cast<POA_CORBA::ExtInterfaceDef *> (servant);
+ POA_CORBA::Container::lookup_name_skel (
+ server_request,
+ servant_upcall,
+ impl
+ ACE_ENV_ARG_PARAMETER
+ );
+}
+
+// TAO_IDL - Generated from
+// be\be_interface.cpp:1955
+
+ACE_INLINE
+void
+POA_CORBA::ExtInterfaceDef::describe_contents_skel (
+ TAO_ServerRequest & server_request,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL
+ )
+{
+ POA_CORBA::Container * const impl = static_cast<POA_CORBA::ExtInterfaceDef *> (servant);
+ POA_CORBA::Container::describe_contents_skel (
+ server_request,
+ servant_upcall,
+ impl
+ ACE_ENV_ARG_PARAMETER
+ );
+}
+
+// TAO_IDL - Generated from
+// be\be_interface.cpp:1955
+
+ACE_INLINE
+void
+POA_CORBA::ExtInterfaceDef::create_module_skel (
+ TAO_ServerRequest & server_request,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL
+ )
+{
+ POA_CORBA::Container * const impl = static_cast<POA_CORBA::ExtInterfaceDef *> (servant);
+ POA_CORBA::Container::create_module_skel (
+ server_request,
+ servant_upcall,
+ impl
+ ACE_ENV_ARG_PARAMETER
+ );
+}
+
+// TAO_IDL - Generated from
+// be\be_interface.cpp:1955
+
+ACE_INLINE
+void
+POA_CORBA::ExtInterfaceDef::create_constant_skel (
+ TAO_ServerRequest & server_request,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL
+ )
+{
+ POA_CORBA::Container * const impl = static_cast<POA_CORBA::ExtInterfaceDef *> (servant);
+ POA_CORBA::Container::create_constant_skel (
+ server_request,
+ servant_upcall,
+ impl
+ ACE_ENV_ARG_PARAMETER
+ );
+}
+
+// TAO_IDL - Generated from
+// be\be_interface.cpp:1955
+
+ACE_INLINE
+void
+POA_CORBA::ExtInterfaceDef::create_struct_skel (
+ TAO_ServerRequest & server_request,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL
+ )
+{
+ POA_CORBA::Container * const impl = static_cast<POA_CORBA::ExtInterfaceDef *> (servant);
+ POA_CORBA::Container::create_struct_skel (
+ server_request,
+ servant_upcall,
+ impl
+ ACE_ENV_ARG_PARAMETER
+ );
+}
+
+// TAO_IDL - Generated from
+// be\be_interface.cpp:1955
+
+ACE_INLINE
+void
+POA_CORBA::ExtInterfaceDef::create_union_skel (
+ TAO_ServerRequest & server_request,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL
+ )
+{
+ POA_CORBA::Container * const impl = static_cast<POA_CORBA::ExtInterfaceDef *> (servant);
+ POA_CORBA::Container::create_union_skel (
+ server_request,
+ servant_upcall,
+ impl
+ ACE_ENV_ARG_PARAMETER
+ );
+}
+
+// TAO_IDL - Generated from
+// be\be_interface.cpp:1955
+
+ACE_INLINE
+void
+POA_CORBA::ExtInterfaceDef::create_enum_skel (
+ TAO_ServerRequest & server_request,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL
+ )
+{
+ POA_CORBA::Container * const impl = static_cast<POA_CORBA::ExtInterfaceDef *> (servant);
+ POA_CORBA::Container::create_enum_skel (
+ server_request,
+ servant_upcall,
+ impl
+ ACE_ENV_ARG_PARAMETER
+ );
+}
+
+// TAO_IDL - Generated from
+// be\be_interface.cpp:1955
+
+ACE_INLINE
+void
+POA_CORBA::ExtInterfaceDef::create_alias_skel (
+ TAO_ServerRequest & server_request,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL
+ )
+{
+ POA_CORBA::Container * const impl = static_cast<POA_CORBA::ExtInterfaceDef *> (servant);
+ POA_CORBA::Container::create_alias_skel (
+ server_request,
+ servant_upcall,
+ impl
+ ACE_ENV_ARG_PARAMETER
+ );
+}
+
+// TAO_IDL - Generated from
+// be\be_interface.cpp:1955
+
+ACE_INLINE
+void
+POA_CORBA::ExtInterfaceDef::create_interface_skel (
+ TAO_ServerRequest & server_request,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL
+ )
+{
+ POA_CORBA::Container * const impl = static_cast<POA_CORBA::ExtInterfaceDef *> (servant);
+ POA_CORBA::Container::create_interface_skel (
+ server_request,
+ servant_upcall,
+ impl
+ ACE_ENV_ARG_PARAMETER
+ );
+}
+
+// TAO_IDL - Generated from
+// be\be_interface.cpp:1955
+
+ACE_INLINE
+void
+POA_CORBA::ExtInterfaceDef::create_value_skel (
+ TAO_ServerRequest & server_request,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL
+ )
+{
+ POA_CORBA::Container * const impl = static_cast<POA_CORBA::ExtInterfaceDef *> (servant);
+ POA_CORBA::Container::create_value_skel (
+ server_request,
+ servant_upcall,
+ impl
+ ACE_ENV_ARG_PARAMETER
+ );
+}
+
+// TAO_IDL - Generated from
+// be\be_interface.cpp:1955
+
+ACE_INLINE
+void
+POA_CORBA::ExtInterfaceDef::create_value_box_skel (
+ TAO_ServerRequest & server_request,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL
+ )
+{
+ POA_CORBA::Container * const impl = static_cast<POA_CORBA::ExtInterfaceDef *> (servant);
+ POA_CORBA::Container::create_value_box_skel (
+ server_request,
+ servant_upcall,
+ impl
+ ACE_ENV_ARG_PARAMETER
+ );
+}
+
+// TAO_IDL - Generated from
+// be\be_interface.cpp:1955
+
+ACE_INLINE
+void
+POA_CORBA::ExtInterfaceDef::create_exception_skel (
+ TAO_ServerRequest & server_request,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL
+ )
+{
+ POA_CORBA::Container * const impl = static_cast<POA_CORBA::ExtInterfaceDef *> (servant);
+ POA_CORBA::Container::create_exception_skel (
+ server_request,
+ servant_upcall,
+ impl
+ ACE_ENV_ARG_PARAMETER
+ );
+}
+
+// TAO_IDL - Generated from
+// be\be_interface.cpp:1955
+
+ACE_INLINE
+void
+POA_CORBA::ExtInterfaceDef::create_native_skel (
+ TAO_ServerRequest & server_request,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL
+ )
+{
+ POA_CORBA::Container * const impl = static_cast<POA_CORBA::ExtInterfaceDef *> (servant);
+ POA_CORBA::Container::create_native_skel (
+ server_request,
+ servant_upcall,
+ impl
+ ACE_ENV_ARG_PARAMETER
+ );
+}
+
+// TAO_IDL - Generated from
+// be\be_interface.cpp:1955
+
+ACE_INLINE
+void
+POA_CORBA::ExtInterfaceDef::create_abstract_interface_skel (
+ TAO_ServerRequest & server_request,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL
+ )
+{
+ POA_CORBA::Container * const impl = static_cast<POA_CORBA::ExtInterfaceDef *> (servant);
+ POA_CORBA::Container::create_abstract_interface_skel (
+ server_request,
+ servant_upcall,
+ impl
+ ACE_ENV_ARG_PARAMETER
+ );
+}
+
+// TAO_IDL - Generated from
+// be\be_interface.cpp:1955
+
+ACE_INLINE
+void
+POA_CORBA::ExtInterfaceDef::create_local_interface_skel (
+ TAO_ServerRequest & server_request,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL
+ )
+{
+ POA_CORBA::Container * const impl = static_cast<POA_CORBA::ExtInterfaceDef *> (servant);
+ POA_CORBA::Container::create_local_interface_skel (
+ server_request,
+ servant_upcall,
+ impl
+ ACE_ENV_ARG_PARAMETER
+ );
+}
+
+// TAO_IDL - Generated from
+// be\be_interface.cpp:1955
+
+ACE_INLINE
+void
+POA_CORBA::ExtInterfaceDef::create_ext_value_skel (
+ TAO_ServerRequest & server_request,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL
+ )
+{
+ POA_CORBA::Container * const impl = static_cast<POA_CORBA::ExtInterfaceDef *> (servant);
+ POA_CORBA::Container::create_ext_value_skel (
+ server_request,
+ servant_upcall,
+ impl
+ ACE_ENV_ARG_PARAMETER
+ );
+}
+
+ACE_INLINE
+void
+POA_CORBA::ExtInterfaceDef::_get_id_skel (
+ TAO_ServerRequest & server_request,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL
+ )
+{
+ POA_CORBA::Contained * const impl = static_cast<POA_CORBA::ExtInterfaceDef *> (servant);
+ POA_CORBA::Contained::_get_id_skel (
+ server_request,
+ servant_upcall,
+ impl
+ ACE_ENV_ARG_PARAMETER
+ );
+}
+
+ACE_INLINE
+void
+POA_CORBA::ExtInterfaceDef::_set_id_skel (
+ TAO_ServerRequest & server_request,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL
+ )
+{
+ POA_CORBA::Contained * const impl = static_cast<POA_CORBA::ExtInterfaceDef *> (servant);
+ POA_CORBA::Contained::_set_id_skel (
+ server_request,
+ servant_upcall,
+ impl
+ ACE_ENV_ARG_PARAMETER
+ );
+}
+
+ACE_INLINE
+void
+POA_CORBA::ExtInterfaceDef::_get_name_skel (
+ TAO_ServerRequest & server_request,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL
+ )
+{
+ POA_CORBA::Contained * const impl = static_cast<POA_CORBA::ExtInterfaceDef *> (servant);
+ POA_CORBA::Contained::_get_name_skel (
+ server_request,
+ servant_upcall,
+ impl
+ ACE_ENV_ARG_PARAMETER
+ );
+}
+
+ACE_INLINE
+void
+POA_CORBA::ExtInterfaceDef::_set_name_skel (
+ TAO_ServerRequest & server_request,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL
+ )
+{
+ POA_CORBA::Contained * const impl = static_cast<POA_CORBA::ExtInterfaceDef *> (servant);
+ POA_CORBA::Contained::_set_name_skel (
+ server_request,
+ servant_upcall,
+ impl
+ ACE_ENV_ARG_PARAMETER
+ );
+}
+
+ACE_INLINE
+void
+POA_CORBA::ExtInterfaceDef::_get_version_skel (
+ TAO_ServerRequest & server_request,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL
+ )
+{
+ POA_CORBA::Contained * const impl = static_cast<POA_CORBA::ExtInterfaceDef *> (servant);
+ POA_CORBA::Contained::_get_version_skel (
+ server_request,
+ servant_upcall,
+ impl
+ ACE_ENV_ARG_PARAMETER
+ );
+}
+
+ACE_INLINE
+void
+POA_CORBA::ExtInterfaceDef::_set_version_skel (
+ TAO_ServerRequest & server_request,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL
+ )
+{
+ POA_CORBA::Contained * const impl = static_cast<POA_CORBA::ExtInterfaceDef *> (servant);
+ POA_CORBA::Contained::_set_version_skel (
+ server_request,
+ servant_upcall,
+ impl
+ ACE_ENV_ARG_PARAMETER
+ );
+}
+
+ACE_INLINE
+void
+POA_CORBA::ExtInterfaceDef::_get_defined_in_skel (
+ TAO_ServerRequest & server_request,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL
+ )
+{
+ POA_CORBA::Contained * const impl = static_cast<POA_CORBA::ExtInterfaceDef *> (servant);
+ POA_CORBA::Contained::_get_defined_in_skel (
+ server_request,
+ servant_upcall,
+ impl
+ ACE_ENV_ARG_PARAMETER
+ );
+}
+
+ACE_INLINE
+void
+POA_CORBA::ExtInterfaceDef::_get_absolute_name_skel (
+ TAO_ServerRequest & server_request,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL
+ )
+{
+ POA_CORBA::Contained * const impl = static_cast<POA_CORBA::ExtInterfaceDef *> (servant);
+ POA_CORBA::Contained::_get_absolute_name_skel (
+ server_request,
+ servant_upcall,
+ impl
+ ACE_ENV_ARG_PARAMETER
+ );
+}
+
+ACE_INLINE
+void
+POA_CORBA::ExtInterfaceDef::_get_containing_repository_skel (
+ TAO_ServerRequest & server_request,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL
+ )
+{
+ POA_CORBA::Contained * const impl = static_cast<POA_CORBA::ExtInterfaceDef *> (servant);
+ POA_CORBA::Contained::_get_containing_repository_skel (
+ server_request,
+ servant_upcall,
+ impl
+ ACE_ENV_ARG_PARAMETER
+ );
+}
+
+// TAO_IDL - Generated from
+// be\be_interface.cpp:1955
+
+ACE_INLINE
+void
+POA_CORBA::ExtInterfaceDef::describe_skel (
+ TAO_ServerRequest & server_request,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL
+ )
+{
+ POA_CORBA::Contained * const impl = static_cast<POA_CORBA::ExtInterfaceDef *> (servant);
+ POA_CORBA::Contained::describe_skel (
+ server_request,
+ servant_upcall,
+ impl
+ ACE_ENV_ARG_PARAMETER
+ );
+}
+
+// TAO_IDL - Generated from
+// be\be_interface.cpp:1955
+
+ACE_INLINE
+void
+POA_CORBA::ExtInterfaceDef::move_skel (
+ TAO_ServerRequest & server_request,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL
+ )
+{
+ POA_CORBA::Contained * const impl = static_cast<POA_CORBA::ExtInterfaceDef *> (servant);
+ POA_CORBA::Contained::move_skel (
+ server_request,
+ servant_upcall,
+ impl
+ ACE_ENV_ARG_PARAMETER
+ );
+}
+
+ACE_INLINE
+void
+POA_CORBA::ExtInterfaceDef::_get_type_skel (
+ TAO_ServerRequest & server_request,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL
+ )
+{
+ POA_CORBA::IDLType * const impl = static_cast<POA_CORBA::ExtInterfaceDef *> (servant);
+ POA_CORBA::IDLType::_get_type_skel (
+ server_request,
+ servant_upcall,
+ impl
+ ACE_ENV_ARG_PARAMETER
+ );
+}
+
+ACE_INLINE
+void
+POA_CORBA::ExtInterfaceDef::_get_base_interfaces_skel (
+ TAO_ServerRequest & server_request,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL
+ )
+{
+ POA_CORBA::InterfaceDef * const impl = static_cast<POA_CORBA::ExtInterfaceDef *> (servant);
+ POA_CORBA::InterfaceDef::_get_base_interfaces_skel (
+ server_request,
+ servant_upcall,
+ impl
+ ACE_ENV_ARG_PARAMETER
+ );
+}
+
+ACE_INLINE
+void
+POA_CORBA::ExtInterfaceDef::_set_base_interfaces_skel (
+ TAO_ServerRequest & server_request,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL
+ )
+{
+ POA_CORBA::InterfaceDef * const impl = static_cast<POA_CORBA::ExtInterfaceDef *> (servant);
+ POA_CORBA::InterfaceDef::_set_base_interfaces_skel (
+ server_request,
+ servant_upcall,
+ impl
+ ACE_ENV_ARG_PARAMETER
+ );
+}
+
+// TAO_IDL - Generated from
+// be\be_interface.cpp:1955
+
+ACE_INLINE
+void
+POA_CORBA::ExtInterfaceDef::is_a_skel (
+ TAO_ServerRequest & server_request,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL
+ )
+{
+ POA_CORBA::InterfaceDef * const impl = static_cast<POA_CORBA::ExtInterfaceDef *> (servant);
+ POA_CORBA::InterfaceDef::is_a_skel (
+ server_request,
+ servant_upcall,
+ impl
+ ACE_ENV_ARG_PARAMETER
+ );
+}
+
+// TAO_IDL - Generated from
+// be\be_interface.cpp:1955
+
+ACE_INLINE
+void
+POA_CORBA::ExtInterfaceDef::describe_interface_skel (
+ TAO_ServerRequest & server_request,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL
+ )
+{
+ POA_CORBA::InterfaceDef * const impl = static_cast<POA_CORBA::ExtInterfaceDef *> (servant);
+ POA_CORBA::InterfaceDef::describe_interface_skel (
+ server_request,
+ servant_upcall,
+ impl
+ ACE_ENV_ARG_PARAMETER
+ );
+}
+
+// TAO_IDL - Generated from
+// be\be_interface.cpp:1955
+
+ACE_INLINE
+void
+POA_CORBA::ExtInterfaceDef::create_attribute_skel (
+ TAO_ServerRequest & server_request,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL
+ )
+{
+ POA_CORBA::InterfaceDef * const impl = static_cast<POA_CORBA::ExtInterfaceDef *> (servant);
+ POA_CORBA::InterfaceDef::create_attribute_skel (
+ server_request,
+ servant_upcall,
+ impl
+ ACE_ENV_ARG_PARAMETER
+ );
+}
+
+// TAO_IDL - Generated from
+// be\be_interface.cpp:1955
+
+ACE_INLINE
+void
+POA_CORBA::ExtInterfaceDef::create_operation_skel (
+ TAO_ServerRequest & server_request,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL
+ )
+{
+ POA_CORBA::InterfaceDef * const impl = static_cast<POA_CORBA::ExtInterfaceDef *> (servant);
+ POA_CORBA::InterfaceDef::create_operation_skel (
+ server_request,
+ servant_upcall,
+ impl
+ ACE_ENV_ARG_PARAMETER
+ );
+}
+
+// TAO_IDL - Generated from
+// be\be_interface.cpp:1955
+
+ACE_INLINE
+void
+POA_CORBA::ExtInterfaceDef::describe_ext_interface_skel (
+ TAO_ServerRequest & server_request,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL
+ )
+{
+ POA_CORBA::InterfaceAttrExtension * const impl = static_cast<POA_CORBA::ExtInterfaceDef *> (servant);
+ POA_CORBA::InterfaceAttrExtension::describe_ext_interface_skel (
+ server_request,
+ servant_upcall,
+ impl
+ ACE_ENV_ARG_PARAMETER
+ );
+}
+
+// TAO_IDL - Generated from
+// be\be_interface.cpp:1955
+
+ACE_INLINE
+void
+POA_CORBA::ExtInterfaceDef::create_ext_attribute_skel (
+ TAO_ServerRequest & server_request,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL
+ )
+{
+ POA_CORBA::InterfaceAttrExtension * const impl = static_cast<POA_CORBA::ExtInterfaceDef *> (servant);
+ POA_CORBA::InterfaceAttrExtension::create_ext_attribute_skel (
+ server_request,
+ servant_upcall,
+ impl
+ ACE_ENV_ARG_PARAMETER
+ );
+}
+
+ACE_INLINE
+void
+POA_CORBA::AbstractInterfaceDef::_get_def_kind_skel (
+ TAO_ServerRequest & server_request,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL
+ )
+{
+ POA_CORBA::IRObject * const impl = static_cast<POA_CORBA::AbstractInterfaceDef *> (servant);
+ POA_CORBA::IRObject::_get_def_kind_skel (
+ server_request,
+ servant_upcall,
+ impl
+ ACE_ENV_ARG_PARAMETER
+ );
+}
+
+// TAO_IDL - Generated from
+// be\be_interface.cpp:1955
+
+ACE_INLINE
+void
+POA_CORBA::AbstractInterfaceDef::destroy_skel (
+ TAO_ServerRequest & server_request,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL
+ )
+{
+ POA_CORBA::IRObject * const impl = static_cast<POA_CORBA::AbstractInterfaceDef *> (servant);
+ POA_CORBA::IRObject::destroy_skel (
+ server_request,
+ servant_upcall,
+ impl
+ ACE_ENV_ARG_PARAMETER
+ );
+}
+
+// TAO_IDL - Generated from
+// be\be_interface.cpp:1955
+
+ACE_INLINE
+void
+POA_CORBA::AbstractInterfaceDef::lookup_skel (
+ TAO_ServerRequest & server_request,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL
+ )
+{
+ POA_CORBA::Container * const impl = static_cast<POA_CORBA::AbstractInterfaceDef *> (servant);
+ POA_CORBA::Container::lookup_skel (
+ server_request,
+ servant_upcall,
+ impl
+ ACE_ENV_ARG_PARAMETER
+ );
+}
+
+// TAO_IDL - Generated from
+// be\be_interface.cpp:1955
+
+ACE_INLINE
+void
+POA_CORBA::AbstractInterfaceDef::contents_skel (
+ TAO_ServerRequest & server_request,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL
+ )
+{
+ POA_CORBA::Container * const impl = static_cast<POA_CORBA::AbstractInterfaceDef *> (servant);
+ POA_CORBA::Container::contents_skel (
+ server_request,
+ servant_upcall,
+ impl
+ ACE_ENV_ARG_PARAMETER
+ );
+}
+
+// TAO_IDL - Generated from
+// be\be_interface.cpp:1955
+
+ACE_INLINE
+void
+POA_CORBA::AbstractInterfaceDef::lookup_name_skel (
+ TAO_ServerRequest & server_request,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL
+ )
+{
+ POA_CORBA::Container * const impl = static_cast<POA_CORBA::AbstractInterfaceDef *> (servant);
+ POA_CORBA::Container::lookup_name_skel (
+ server_request,
+ servant_upcall,
+ impl
+ ACE_ENV_ARG_PARAMETER
+ );
+}
+
+// TAO_IDL - Generated from
+// be\be_interface.cpp:1955
+
+ACE_INLINE
+void
+POA_CORBA::AbstractInterfaceDef::describe_contents_skel (
+ TAO_ServerRequest & server_request,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL
+ )
+{
+ POA_CORBA::Container * const impl = static_cast<POA_CORBA::AbstractInterfaceDef *> (servant);
+ POA_CORBA::Container::describe_contents_skel (
+ server_request,
+ servant_upcall,
+ impl
+ ACE_ENV_ARG_PARAMETER
+ );
+}
+
+// TAO_IDL - Generated from
+// be\be_interface.cpp:1955
+
+ACE_INLINE
+void
+POA_CORBA::AbstractInterfaceDef::create_module_skel (
+ TAO_ServerRequest & server_request,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL
+ )
+{
+ POA_CORBA::Container * const impl = static_cast<POA_CORBA::AbstractInterfaceDef *> (servant);
+ POA_CORBA::Container::create_module_skel (
+ server_request,
+ servant_upcall,
+ impl
+ ACE_ENV_ARG_PARAMETER
+ );
+}
+
+// TAO_IDL - Generated from
+// be\be_interface.cpp:1955
+
+ACE_INLINE
+void
+POA_CORBA::AbstractInterfaceDef::create_constant_skel (
+ TAO_ServerRequest & server_request,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL
+ )
+{
+ POA_CORBA::Container * const impl = static_cast<POA_CORBA::AbstractInterfaceDef *> (servant);
+ POA_CORBA::Container::create_constant_skel (
+ server_request,
+ servant_upcall,
+ impl
+ ACE_ENV_ARG_PARAMETER
+ );
+}
+
+// TAO_IDL - Generated from
+// be\be_interface.cpp:1955
+
+ACE_INLINE
+void
+POA_CORBA::AbstractInterfaceDef::create_struct_skel (
+ TAO_ServerRequest & server_request,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL
+ )
+{
+ POA_CORBA::Container * const impl = static_cast<POA_CORBA::AbstractInterfaceDef *> (servant);
+ POA_CORBA::Container::create_struct_skel (
+ server_request,
+ servant_upcall,
+ impl
+ ACE_ENV_ARG_PARAMETER
+ );
+}
+
+// TAO_IDL - Generated from
+// be\be_interface.cpp:1955
+
+ACE_INLINE
+void
+POA_CORBA::AbstractInterfaceDef::create_union_skel (
+ TAO_ServerRequest & server_request,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL
+ )
+{
+ POA_CORBA::Container * const impl = static_cast<POA_CORBA::AbstractInterfaceDef *> (servant);
+ POA_CORBA::Container::create_union_skel (
+ server_request,
+ servant_upcall,
+ impl
+ ACE_ENV_ARG_PARAMETER
+ );
+}
+
+// TAO_IDL - Generated from
+// be\be_interface.cpp:1955
+
+ACE_INLINE
+void
+POA_CORBA::AbstractInterfaceDef::create_enum_skel (
+ TAO_ServerRequest & server_request,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL
+ )
+{
+ POA_CORBA::Container * const impl = static_cast<POA_CORBA::AbstractInterfaceDef *> (servant);
+ POA_CORBA::Container::create_enum_skel (
+ server_request,
+ servant_upcall,
+ impl
+ ACE_ENV_ARG_PARAMETER
+ );
+}
+
+// TAO_IDL - Generated from
+// be\be_interface.cpp:1955
+
+ACE_INLINE
+void
+POA_CORBA::AbstractInterfaceDef::create_alias_skel (
+ TAO_ServerRequest & server_request,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL
+ )
+{
+ POA_CORBA::Container * const impl = static_cast<POA_CORBA::AbstractInterfaceDef *> (servant);
+ POA_CORBA::Container::create_alias_skel (
+ server_request,
+ servant_upcall,
+ impl
+ ACE_ENV_ARG_PARAMETER
+ );
+}
+
+// TAO_IDL - Generated from
+// be\be_interface.cpp:1955
+
+ACE_INLINE
+void
+POA_CORBA::AbstractInterfaceDef::create_interface_skel (
+ TAO_ServerRequest & server_request,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL
+ )
+{
+ POA_CORBA::Container * const impl = static_cast<POA_CORBA::AbstractInterfaceDef *> (servant);
+ POA_CORBA::Container::create_interface_skel (
+ server_request,
+ servant_upcall,
+ impl
+ ACE_ENV_ARG_PARAMETER
+ );
+}
+
+// TAO_IDL - Generated from
+// be\be_interface.cpp:1955
+
+ACE_INLINE
+void
+POA_CORBA::AbstractInterfaceDef::create_value_skel (
+ TAO_ServerRequest & server_request,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL
+ )
+{
+ POA_CORBA::Container * const impl = static_cast<POA_CORBA::AbstractInterfaceDef *> (servant);
+ POA_CORBA::Container::create_value_skel (
+ server_request,
+ servant_upcall,
+ impl
+ ACE_ENV_ARG_PARAMETER
+ );
+}
+
+// TAO_IDL - Generated from
+// be\be_interface.cpp:1955
+
+ACE_INLINE
+void
+POA_CORBA::AbstractInterfaceDef::create_value_box_skel (
+ TAO_ServerRequest & server_request,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL
+ )
+{
+ POA_CORBA::Container * const impl = static_cast<POA_CORBA::AbstractInterfaceDef *> (servant);
+ POA_CORBA::Container::create_value_box_skel (
+ server_request,
+ servant_upcall,
+ impl
+ ACE_ENV_ARG_PARAMETER
+ );
+}
+
+// TAO_IDL - Generated from
+// be\be_interface.cpp:1955
+
+ACE_INLINE
+void
+POA_CORBA::AbstractInterfaceDef::create_exception_skel (
+ TAO_ServerRequest & server_request,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL
+ )
+{
+ POA_CORBA::Container * const impl = static_cast<POA_CORBA::AbstractInterfaceDef *> (servant);
+ POA_CORBA::Container::create_exception_skel (
+ server_request,
+ servant_upcall,
+ impl
+ ACE_ENV_ARG_PARAMETER
+ );
+}
+
+// TAO_IDL - Generated from
+// be\be_interface.cpp:1955
+
+ACE_INLINE
+void
+POA_CORBA::AbstractInterfaceDef::create_native_skel (
+ TAO_ServerRequest & server_request,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL
+ )
+{
+ POA_CORBA::Container * const impl = static_cast<POA_CORBA::AbstractInterfaceDef *> (servant);
+ POA_CORBA::Container::create_native_skel (
+ server_request,
+ servant_upcall,
+ impl
+ ACE_ENV_ARG_PARAMETER
+ );
+}
+
+// TAO_IDL - Generated from
+// be\be_interface.cpp:1955
+
+ACE_INLINE
+void
+POA_CORBA::AbstractInterfaceDef::create_abstract_interface_skel (
+ TAO_ServerRequest & server_request,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL
+ )
+{
+ POA_CORBA::Container * const impl = static_cast<POA_CORBA::AbstractInterfaceDef *> (servant);
+ POA_CORBA::Container::create_abstract_interface_skel (
+ server_request,
+ servant_upcall,
+ impl
+ ACE_ENV_ARG_PARAMETER
+ );
+}
+
+// TAO_IDL - Generated from
+// be\be_interface.cpp:1955
+
+ACE_INLINE
+void
+POA_CORBA::AbstractInterfaceDef::create_local_interface_skel (
+ TAO_ServerRequest & server_request,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL
+ )
+{
+ POA_CORBA::Container * const impl = static_cast<POA_CORBA::AbstractInterfaceDef *> (servant);
+ POA_CORBA::Container::create_local_interface_skel (
+ server_request,
+ servant_upcall,
+ impl
+ ACE_ENV_ARG_PARAMETER
+ );
+}
+
+// TAO_IDL - Generated from
+// be\be_interface.cpp:1955
+
+ACE_INLINE
+void
+POA_CORBA::AbstractInterfaceDef::create_ext_value_skel (
+ TAO_ServerRequest & server_request,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL
+ )
+{
+ POA_CORBA::Container * const impl = static_cast<POA_CORBA::AbstractInterfaceDef *> (servant);
+ POA_CORBA::Container::create_ext_value_skel (
+ server_request,
+ servant_upcall,
+ impl
+ ACE_ENV_ARG_PARAMETER
+ );
+}
+
+ACE_INLINE
+void
+POA_CORBA::AbstractInterfaceDef::_get_id_skel (
+ TAO_ServerRequest & server_request,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL
+ )
+{
+ POA_CORBA::Contained * const impl = static_cast<POA_CORBA::AbstractInterfaceDef *> (servant);
+ POA_CORBA::Contained::_get_id_skel (
+ server_request,
+ servant_upcall,
+ impl
+ ACE_ENV_ARG_PARAMETER
+ );
+}
+
+ACE_INLINE
+void
+POA_CORBA::AbstractInterfaceDef::_set_id_skel (
+ TAO_ServerRequest & server_request,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL
+ )
+{
+ POA_CORBA::Contained * const impl = static_cast<POA_CORBA::AbstractInterfaceDef *> (servant);
+ POA_CORBA::Contained::_set_id_skel (
+ server_request,
+ servant_upcall,
+ impl
+ ACE_ENV_ARG_PARAMETER
+ );
+}
+
+ACE_INLINE
+void
+POA_CORBA::AbstractInterfaceDef::_get_name_skel (
+ TAO_ServerRequest & server_request,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL
+ )
+{
+ POA_CORBA::Contained * const impl = static_cast<POA_CORBA::AbstractInterfaceDef *> (servant);
+ POA_CORBA::Contained::_get_name_skel (
+ server_request,
+ servant_upcall,
+ impl
+ ACE_ENV_ARG_PARAMETER
+ );
+}
+
+ACE_INLINE
+void
+POA_CORBA::AbstractInterfaceDef::_set_name_skel (
+ TAO_ServerRequest & server_request,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL
+ )
+{
+ POA_CORBA::Contained * const impl = static_cast<POA_CORBA::AbstractInterfaceDef *> (servant);
+ POA_CORBA::Contained::_set_name_skel (
+ server_request,
+ servant_upcall,
+ impl
+ ACE_ENV_ARG_PARAMETER
+ );
+}
+
+ACE_INLINE
+void
+POA_CORBA::AbstractInterfaceDef::_get_version_skel (
+ TAO_ServerRequest & server_request,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL
+ )
+{
+ POA_CORBA::Contained * const impl = static_cast<POA_CORBA::AbstractInterfaceDef *> (servant);
+ POA_CORBA::Contained::_get_version_skel (
+ server_request,
+ servant_upcall,
+ impl
+ ACE_ENV_ARG_PARAMETER
+ );
+}
+
+ACE_INLINE
+void
+POA_CORBA::AbstractInterfaceDef::_set_version_skel (
+ TAO_ServerRequest & server_request,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL
+ )
+{
+ POA_CORBA::Contained * const impl = static_cast<POA_CORBA::AbstractInterfaceDef *> (servant);
+ POA_CORBA::Contained::_set_version_skel (
+ server_request,
+ servant_upcall,
+ impl
+ ACE_ENV_ARG_PARAMETER
+ );
+}
+
+ACE_INLINE
+void
+POA_CORBA::AbstractInterfaceDef::_get_defined_in_skel (
+ TAO_ServerRequest & server_request,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL
+ )
+{
+ POA_CORBA::Contained * const impl = static_cast<POA_CORBA::AbstractInterfaceDef *> (servant);
+ POA_CORBA::Contained::_get_defined_in_skel (
+ server_request,
+ servant_upcall,
+ impl
+ ACE_ENV_ARG_PARAMETER
+ );
+}
+
+ACE_INLINE
+void
+POA_CORBA::AbstractInterfaceDef::_get_absolute_name_skel (
+ TAO_ServerRequest & server_request,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL
+ )
+{
+ POA_CORBA::Contained * const impl = static_cast<POA_CORBA::AbstractInterfaceDef *> (servant);
+ POA_CORBA::Contained::_get_absolute_name_skel (
+ server_request,
+ servant_upcall,
+ impl
+ ACE_ENV_ARG_PARAMETER
+ );
+}
+
+ACE_INLINE
+void
+POA_CORBA::AbstractInterfaceDef::_get_containing_repository_skel (
+ TAO_ServerRequest & server_request,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL
+ )
+{
+ POA_CORBA::Contained * const impl = static_cast<POA_CORBA::AbstractInterfaceDef *> (servant);
+ POA_CORBA::Contained::_get_containing_repository_skel (
+ server_request,
+ servant_upcall,
+ impl
+ ACE_ENV_ARG_PARAMETER
+ );
+}
+
+// TAO_IDL - Generated from
+// be\be_interface.cpp:1955
+
+ACE_INLINE
+void
+POA_CORBA::AbstractInterfaceDef::describe_skel (
+ TAO_ServerRequest & server_request,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL
+ )
+{
+ POA_CORBA::Contained * const impl = static_cast<POA_CORBA::AbstractInterfaceDef *> (servant);
+ POA_CORBA::Contained::describe_skel (
+ server_request,
+ servant_upcall,
+ impl
+ ACE_ENV_ARG_PARAMETER
+ );
+}
+
+// TAO_IDL - Generated from
+// be\be_interface.cpp:1955
+
+ACE_INLINE
+void
+POA_CORBA::AbstractInterfaceDef::move_skel (
+ TAO_ServerRequest & server_request,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL
+ )
+{
+ POA_CORBA::Contained * const impl = static_cast<POA_CORBA::AbstractInterfaceDef *> (servant);
+ POA_CORBA::Contained::move_skel (
+ server_request,
+ servant_upcall,
+ impl
+ ACE_ENV_ARG_PARAMETER
+ );
+}
+
+ACE_INLINE
+void
+POA_CORBA::AbstractInterfaceDef::_get_type_skel (
+ TAO_ServerRequest & server_request,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL
+ )
+{
+ POA_CORBA::IDLType * const impl = static_cast<POA_CORBA::AbstractInterfaceDef *> (servant);
+ POA_CORBA::IDLType::_get_type_skel (
+ server_request,
+ servant_upcall,
+ impl
+ ACE_ENV_ARG_PARAMETER
+ );
+}
+
+ACE_INLINE
+void
+POA_CORBA::AbstractInterfaceDef::_get_base_interfaces_skel (
+ TAO_ServerRequest & server_request,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL
+ )
+{
+ POA_CORBA::InterfaceDef * const impl = static_cast<POA_CORBA::AbstractInterfaceDef *> (servant);
+ POA_CORBA::InterfaceDef::_get_base_interfaces_skel (
+ server_request,
+ servant_upcall,
+ impl
+ ACE_ENV_ARG_PARAMETER
+ );
+}
+
+ACE_INLINE
+void
+POA_CORBA::AbstractInterfaceDef::_set_base_interfaces_skel (
+ TAO_ServerRequest & server_request,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL
+ )
+{
+ POA_CORBA::InterfaceDef * const impl = static_cast<POA_CORBA::AbstractInterfaceDef *> (servant);
+ POA_CORBA::InterfaceDef::_set_base_interfaces_skel (
+ server_request,
+ servant_upcall,
+ impl
+ ACE_ENV_ARG_PARAMETER
+ );
+}
+
+// TAO_IDL - Generated from
+// be\be_interface.cpp:1955
+
+ACE_INLINE
+void
+POA_CORBA::AbstractInterfaceDef::is_a_skel (
+ TAO_ServerRequest & server_request,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL
+ )
+{
+ POA_CORBA::InterfaceDef * const impl = static_cast<POA_CORBA::AbstractInterfaceDef *> (servant);
+ POA_CORBA::InterfaceDef::is_a_skel (
+ server_request,
+ servant_upcall,
+ impl
+ ACE_ENV_ARG_PARAMETER
+ );
+}
+
+// TAO_IDL - Generated from
+// be\be_interface.cpp:1955
+
+ACE_INLINE
+void
+POA_CORBA::AbstractInterfaceDef::describe_interface_skel (
+ TAO_ServerRequest & server_request,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL
+ )
+{
+ POA_CORBA::InterfaceDef * const impl = static_cast<POA_CORBA::AbstractInterfaceDef *> (servant);
+ POA_CORBA::InterfaceDef::describe_interface_skel (
+ server_request,
+ servant_upcall,
+ impl
+ ACE_ENV_ARG_PARAMETER
+ );
+}
+
+// TAO_IDL - Generated from
+// be\be_interface.cpp:1955
+
+ACE_INLINE
+void
+POA_CORBA::AbstractInterfaceDef::create_attribute_skel (
+ TAO_ServerRequest & server_request,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL
+ )
+{
+ POA_CORBA::InterfaceDef * const impl = static_cast<POA_CORBA::AbstractInterfaceDef *> (servant);
+ POA_CORBA::InterfaceDef::create_attribute_skel (
+ server_request,
+ servant_upcall,
+ impl
+ ACE_ENV_ARG_PARAMETER
+ );
+}
+
+// TAO_IDL - Generated from
+// be\be_interface.cpp:1955
+
+ACE_INLINE
+void
+POA_CORBA::AbstractInterfaceDef::create_operation_skel (
+ TAO_ServerRequest & server_request,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL
+ )
+{
+ POA_CORBA::InterfaceDef * const impl = static_cast<POA_CORBA::AbstractInterfaceDef *> (servant);
+ POA_CORBA::InterfaceDef::create_operation_skel (
+ server_request,
+ servant_upcall,
+ impl
+ ACE_ENV_ARG_PARAMETER
+ );
+}
+
+ACE_INLINE
+void
+POA_CORBA::ExtAbstractInterfaceDef::_get_def_kind_skel (
+ TAO_ServerRequest & server_request,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL
+ )
+{
+ POA_CORBA::IRObject * const impl = static_cast<POA_CORBA::ExtAbstractInterfaceDef *> (servant);
+ POA_CORBA::IRObject::_get_def_kind_skel (
+ server_request,
+ servant_upcall,
+ impl
+ ACE_ENV_ARG_PARAMETER
+ );
+}
+
+// TAO_IDL - Generated from
+// be\be_interface.cpp:1955
+
+ACE_INLINE
+void
+POA_CORBA::ExtAbstractInterfaceDef::destroy_skel (
+ TAO_ServerRequest & server_request,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL
+ )
+{
+ POA_CORBA::IRObject * const impl = static_cast<POA_CORBA::ExtAbstractInterfaceDef *> (servant);
+ POA_CORBA::IRObject::destroy_skel (
+ server_request,
+ servant_upcall,
+ impl
+ ACE_ENV_ARG_PARAMETER
+ );
+}
+
+// TAO_IDL - Generated from
+// be\be_interface.cpp:1955
+
+ACE_INLINE
+void
+POA_CORBA::ExtAbstractInterfaceDef::lookup_skel (
+ TAO_ServerRequest & server_request,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL
+ )
+{
+ POA_CORBA::Container * const impl = static_cast<POA_CORBA::ExtAbstractInterfaceDef *> (servant);
+ POA_CORBA::Container::lookup_skel (
+ server_request,
+ servant_upcall,
+ impl
+ ACE_ENV_ARG_PARAMETER
+ );
+}
+
+// TAO_IDL - Generated from
+// be\be_interface.cpp:1955
+
+ACE_INLINE
+void
+POA_CORBA::ExtAbstractInterfaceDef::contents_skel (
+ TAO_ServerRequest & server_request,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL
+ )
+{
+ POA_CORBA::Container * const impl = static_cast<POA_CORBA::ExtAbstractInterfaceDef *> (servant);
+ POA_CORBA::Container::contents_skel (
+ server_request,
+ servant_upcall,
+ impl
+ ACE_ENV_ARG_PARAMETER
+ );
+}
+
+// TAO_IDL - Generated from
+// be\be_interface.cpp:1955
+
+ACE_INLINE
+void
+POA_CORBA::ExtAbstractInterfaceDef::lookup_name_skel (
+ TAO_ServerRequest & server_request,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL
+ )
+{
+ POA_CORBA::Container * const impl = static_cast<POA_CORBA::ExtAbstractInterfaceDef *> (servant);
+ POA_CORBA::Container::lookup_name_skel (
+ server_request,
+ servant_upcall,
+ impl
+ ACE_ENV_ARG_PARAMETER
+ );
+}
+
+// TAO_IDL - Generated from
+// be\be_interface.cpp:1955
+
+ACE_INLINE
+void
+POA_CORBA::ExtAbstractInterfaceDef::describe_contents_skel (
+ TAO_ServerRequest & server_request,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL
+ )
+{
+ POA_CORBA::Container * const impl = static_cast<POA_CORBA::ExtAbstractInterfaceDef *> (servant);
+ POA_CORBA::Container::describe_contents_skel (
+ server_request,
+ servant_upcall,
+ impl
+ ACE_ENV_ARG_PARAMETER
+ );
+}
+
+// TAO_IDL - Generated from
+// be\be_interface.cpp:1955
+
+ACE_INLINE
+void
+POA_CORBA::ExtAbstractInterfaceDef::create_module_skel (
+ TAO_ServerRequest & server_request,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL
+ )
+{
+ POA_CORBA::Container * const impl = static_cast<POA_CORBA::ExtAbstractInterfaceDef *> (servant);
+ POA_CORBA::Container::create_module_skel (
+ server_request,
+ servant_upcall,
+ impl
+ ACE_ENV_ARG_PARAMETER
+ );
+}
+
+// TAO_IDL - Generated from
+// be\be_interface.cpp:1955
+
+ACE_INLINE
+void
+POA_CORBA::ExtAbstractInterfaceDef::create_constant_skel (
+ TAO_ServerRequest & server_request,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL
+ )
+{
+ POA_CORBA::Container * const impl = static_cast<POA_CORBA::ExtAbstractInterfaceDef *> (servant);
+ POA_CORBA::Container::create_constant_skel (
+ server_request,
+ servant_upcall,
+ impl
+ ACE_ENV_ARG_PARAMETER
+ );
+}
+
+// TAO_IDL - Generated from
+// be\be_interface.cpp:1955
+
+ACE_INLINE
+void
+POA_CORBA::ExtAbstractInterfaceDef::create_struct_skel (
+ TAO_ServerRequest & server_request,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL
+ )
+{
+ POA_CORBA::Container * const impl = static_cast<POA_CORBA::ExtAbstractInterfaceDef *> (servant);
+ POA_CORBA::Container::create_struct_skel (
+ server_request,
+ servant_upcall,
+ impl
+ ACE_ENV_ARG_PARAMETER
+ );
+}
+
+// TAO_IDL - Generated from
+// be\be_interface.cpp:1955
+
+ACE_INLINE
+void
+POA_CORBA::ExtAbstractInterfaceDef::create_union_skel (
+ TAO_ServerRequest & server_request,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL
+ )
+{
+ POA_CORBA::Container * const impl = static_cast<POA_CORBA::ExtAbstractInterfaceDef *> (servant);
+ POA_CORBA::Container::create_union_skel (
+ server_request,
+ servant_upcall,
+ impl
+ ACE_ENV_ARG_PARAMETER
+ );
+}
+
+// TAO_IDL - Generated from
+// be\be_interface.cpp:1955
+
+ACE_INLINE
+void
+POA_CORBA::ExtAbstractInterfaceDef::create_enum_skel (
+ TAO_ServerRequest & server_request,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL
+ )
+{
+ POA_CORBA::Container * const impl = static_cast<POA_CORBA::ExtAbstractInterfaceDef *> (servant);
+ POA_CORBA::Container::create_enum_skel (
+ server_request,
+ servant_upcall,
+ impl
+ ACE_ENV_ARG_PARAMETER
+ );
+}
+
+// TAO_IDL - Generated from
+// be\be_interface.cpp:1955
+
+ACE_INLINE
+void
+POA_CORBA::ExtAbstractInterfaceDef::create_alias_skel (
+ TAO_ServerRequest & server_request,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL
+ )
+{
+ POA_CORBA::Container * const impl = static_cast<POA_CORBA::ExtAbstractInterfaceDef *> (servant);
+ POA_CORBA::Container::create_alias_skel (
+ server_request,
+ servant_upcall,
+ impl
+ ACE_ENV_ARG_PARAMETER
+ );
+}
+
+// TAO_IDL - Generated from
+// be\be_interface.cpp:1955
+
+ACE_INLINE
+void
+POA_CORBA::ExtAbstractInterfaceDef::create_interface_skel (
+ TAO_ServerRequest & server_request,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL
+ )
+{
+ POA_CORBA::Container * const impl = static_cast<POA_CORBA::ExtAbstractInterfaceDef *> (servant);
+ POA_CORBA::Container::create_interface_skel (
+ server_request,
+ servant_upcall,
+ impl
+ ACE_ENV_ARG_PARAMETER
+ );
+}
+
+// TAO_IDL - Generated from
+// be\be_interface.cpp:1955
+
+ACE_INLINE
+void
+POA_CORBA::ExtAbstractInterfaceDef::create_value_skel (
+ TAO_ServerRequest & server_request,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL
+ )
+{
+ POA_CORBA::Container * const impl = static_cast<POA_CORBA::ExtAbstractInterfaceDef *> (servant);
+ POA_CORBA::Container::create_value_skel (
+ server_request,
+ servant_upcall,
+ impl
+ ACE_ENV_ARG_PARAMETER
+ );
+}
+
+// TAO_IDL - Generated from
+// be\be_interface.cpp:1955
+
+ACE_INLINE
+void
+POA_CORBA::ExtAbstractInterfaceDef::create_value_box_skel (
+ TAO_ServerRequest & server_request,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL
+ )
+{
+ POA_CORBA::Container * const impl = static_cast<POA_CORBA::ExtAbstractInterfaceDef *> (servant);
+ POA_CORBA::Container::create_value_box_skel (
+ server_request,
+ servant_upcall,
+ impl
+ ACE_ENV_ARG_PARAMETER
+ );
+}
+
+// TAO_IDL - Generated from
+// be\be_interface.cpp:1955
+
+ACE_INLINE
+void
+POA_CORBA::ExtAbstractInterfaceDef::create_exception_skel (
+ TAO_ServerRequest & server_request,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL
+ )
+{
+ POA_CORBA::Container * const impl = static_cast<POA_CORBA::ExtAbstractInterfaceDef *> (servant);
+ POA_CORBA::Container::create_exception_skel (
+ server_request,
+ servant_upcall,
+ impl
+ ACE_ENV_ARG_PARAMETER
+ );
+}
+
+// TAO_IDL - Generated from
+// be\be_interface.cpp:1955
+
+ACE_INLINE
+void
+POA_CORBA::ExtAbstractInterfaceDef::create_native_skel (
+ TAO_ServerRequest & server_request,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL
+ )
+{
+ POA_CORBA::Container * const impl = static_cast<POA_CORBA::ExtAbstractInterfaceDef *> (servant);
+ POA_CORBA::Container::create_native_skel (
+ server_request,
+ servant_upcall,
+ impl
+ ACE_ENV_ARG_PARAMETER
+ );
+}
+
+// TAO_IDL - Generated from
+// be\be_interface.cpp:1955
+
+ACE_INLINE
+void
+POA_CORBA::ExtAbstractInterfaceDef::create_abstract_interface_skel (
+ TAO_ServerRequest & server_request,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL
+ )
+{
+ POA_CORBA::Container * const impl = static_cast<POA_CORBA::ExtAbstractInterfaceDef *> (servant);
+ POA_CORBA::Container::create_abstract_interface_skel (
+ server_request,
+ servant_upcall,
+ impl
+ ACE_ENV_ARG_PARAMETER
+ );
+}
+
+// TAO_IDL - Generated from
+// be\be_interface.cpp:1955
+
+ACE_INLINE
+void
+POA_CORBA::ExtAbstractInterfaceDef::create_local_interface_skel (
+ TAO_ServerRequest & server_request,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL
+ )
+{
+ POA_CORBA::Container * const impl = static_cast<POA_CORBA::ExtAbstractInterfaceDef *> (servant);
+ POA_CORBA::Container::create_local_interface_skel (
+ server_request,
+ servant_upcall,
+ impl
+ ACE_ENV_ARG_PARAMETER
+ );
+}
+
+// TAO_IDL - Generated from
+// be\be_interface.cpp:1955
+
+ACE_INLINE
+void
+POA_CORBA::ExtAbstractInterfaceDef::create_ext_value_skel (
+ TAO_ServerRequest & server_request,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL
+ )
+{
+ POA_CORBA::Container * const impl = static_cast<POA_CORBA::ExtAbstractInterfaceDef *> (servant);
+ POA_CORBA::Container::create_ext_value_skel (
+ server_request,
+ servant_upcall,
+ impl
+ ACE_ENV_ARG_PARAMETER
+ );
+}
+
+ACE_INLINE
+void
+POA_CORBA::ExtAbstractInterfaceDef::_get_id_skel (
+ TAO_ServerRequest & server_request,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL
+ )
+{
+ POA_CORBA::Contained * const impl = static_cast<POA_CORBA::ExtAbstractInterfaceDef *> (servant);
+ POA_CORBA::Contained::_get_id_skel (
+ server_request,
+ servant_upcall,
+ impl
+ ACE_ENV_ARG_PARAMETER
+ );
+}
+
+ACE_INLINE
+void
+POA_CORBA::ExtAbstractInterfaceDef::_set_id_skel (
+ TAO_ServerRequest & server_request,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL
+ )
+{
+ POA_CORBA::Contained * const impl = static_cast<POA_CORBA::ExtAbstractInterfaceDef *> (servant);
+ POA_CORBA::Contained::_set_id_skel (
+ server_request,
+ servant_upcall,
+ impl
+ ACE_ENV_ARG_PARAMETER
+ );
+}
+
+ACE_INLINE
+void
+POA_CORBA::ExtAbstractInterfaceDef::_get_name_skel (
+ TAO_ServerRequest & server_request,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL
+ )
+{
+ POA_CORBA::Contained * const impl = static_cast<POA_CORBA::ExtAbstractInterfaceDef *> (servant);
+ POA_CORBA::Contained::_get_name_skel (
+ server_request,
+ servant_upcall,
+ impl
+ ACE_ENV_ARG_PARAMETER
+ );
+}
+
+ACE_INLINE
+void
+POA_CORBA::ExtAbstractInterfaceDef::_set_name_skel (
+ TAO_ServerRequest & server_request,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL
+ )
+{
+ POA_CORBA::Contained * const impl = static_cast<POA_CORBA::ExtAbstractInterfaceDef *> (servant);
+ POA_CORBA::Contained::_set_name_skel (
+ server_request,
+ servant_upcall,
+ impl
+ ACE_ENV_ARG_PARAMETER
+ );
+}
+
+ACE_INLINE
+void
+POA_CORBA::ExtAbstractInterfaceDef::_get_version_skel (
+ TAO_ServerRequest & server_request,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL
+ )
+{
+ POA_CORBA::Contained * const impl = static_cast<POA_CORBA::ExtAbstractInterfaceDef *> (servant);
+ POA_CORBA::Contained::_get_version_skel (
+ server_request,
+ servant_upcall,
+ impl
+ ACE_ENV_ARG_PARAMETER
+ );
+}
+
+ACE_INLINE
+void
+POA_CORBA::ExtAbstractInterfaceDef::_set_version_skel (
+ TAO_ServerRequest & server_request,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL
+ )
+{
+ POA_CORBA::Contained * const impl = static_cast<POA_CORBA::ExtAbstractInterfaceDef *> (servant);
+ POA_CORBA::Contained::_set_version_skel (
+ server_request,
+ servant_upcall,
+ impl
+ ACE_ENV_ARG_PARAMETER
+ );
+}
+
+ACE_INLINE
+void
+POA_CORBA::ExtAbstractInterfaceDef::_get_defined_in_skel (
+ TAO_ServerRequest & server_request,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL
+ )
+{
+ POA_CORBA::Contained * const impl = static_cast<POA_CORBA::ExtAbstractInterfaceDef *> (servant);
+ POA_CORBA::Contained::_get_defined_in_skel (
+ server_request,
+ servant_upcall,
+ impl
+ ACE_ENV_ARG_PARAMETER
+ );
+}
+
+ACE_INLINE
+void
+POA_CORBA::ExtAbstractInterfaceDef::_get_absolute_name_skel (
+ TAO_ServerRequest & server_request,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL
+ )
+{
+ POA_CORBA::Contained * const impl = static_cast<POA_CORBA::ExtAbstractInterfaceDef *> (servant);
+ POA_CORBA::Contained::_get_absolute_name_skel (
+ server_request,
+ servant_upcall,
+ impl
+ ACE_ENV_ARG_PARAMETER
+ );
+}
+
+ACE_INLINE
+void
+POA_CORBA::ExtAbstractInterfaceDef::_get_containing_repository_skel (
+ TAO_ServerRequest & server_request,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL
+ )
+{
+ POA_CORBA::Contained * const impl = static_cast<POA_CORBA::ExtAbstractInterfaceDef *> (servant);
+ POA_CORBA::Contained::_get_containing_repository_skel (
+ server_request,
+ servant_upcall,
+ impl
+ ACE_ENV_ARG_PARAMETER
+ );
+}
+
+// TAO_IDL - Generated from
+// be\be_interface.cpp:1955
+
+ACE_INLINE
+void
+POA_CORBA::ExtAbstractInterfaceDef::describe_skel (
+ TAO_ServerRequest & server_request,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL
+ )
+{
+ POA_CORBA::Contained * const impl = static_cast<POA_CORBA::ExtAbstractInterfaceDef *> (servant);
+ POA_CORBA::Contained::describe_skel (
+ server_request,
+ servant_upcall,
+ impl
+ ACE_ENV_ARG_PARAMETER
+ );
+}
+
+// TAO_IDL - Generated from
+// be\be_interface.cpp:1955
+
+ACE_INLINE
+void
+POA_CORBA::ExtAbstractInterfaceDef::move_skel (
+ TAO_ServerRequest & server_request,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL
+ )
+{
+ POA_CORBA::Contained * const impl = static_cast<POA_CORBA::ExtAbstractInterfaceDef *> (servant);
+ POA_CORBA::Contained::move_skel (
+ server_request,
+ servant_upcall,
+ impl
+ ACE_ENV_ARG_PARAMETER
+ );
+}
+
+ACE_INLINE
+void
+POA_CORBA::ExtAbstractInterfaceDef::_get_type_skel (
+ TAO_ServerRequest & server_request,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL
+ )
+{
+ POA_CORBA::IDLType * const impl = static_cast<POA_CORBA::ExtAbstractInterfaceDef *> (servant);
+ POA_CORBA::IDLType::_get_type_skel (
+ server_request,
+ servant_upcall,
+ impl
+ ACE_ENV_ARG_PARAMETER
+ );
+}
+
+ACE_INLINE
+void
+POA_CORBA::ExtAbstractInterfaceDef::_get_base_interfaces_skel (
+ TAO_ServerRequest & server_request,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL
+ )
+{
+ POA_CORBA::InterfaceDef * const impl = static_cast<POA_CORBA::ExtAbstractInterfaceDef *> (servant);
+ POA_CORBA::InterfaceDef::_get_base_interfaces_skel (
+ server_request,
+ servant_upcall,
+ impl
+ ACE_ENV_ARG_PARAMETER
+ );
+}
+
+ACE_INLINE
+void
+POA_CORBA::ExtAbstractInterfaceDef::_set_base_interfaces_skel (
+ TAO_ServerRequest & server_request,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL
+ )
+{
+ POA_CORBA::InterfaceDef * const impl = static_cast<POA_CORBA::ExtAbstractInterfaceDef *> (servant);
+ POA_CORBA::InterfaceDef::_set_base_interfaces_skel (
+ server_request,
+ servant_upcall,
+ impl
+ ACE_ENV_ARG_PARAMETER
+ );
+}
+
+// TAO_IDL - Generated from
+// be\be_interface.cpp:1955
+
+ACE_INLINE
+void
+POA_CORBA::ExtAbstractInterfaceDef::is_a_skel (
+ TAO_ServerRequest & server_request,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL
+ )
+{
+ POA_CORBA::InterfaceDef * const impl = static_cast<POA_CORBA::ExtAbstractInterfaceDef *> (servant);
+ POA_CORBA::InterfaceDef::is_a_skel (
+ server_request,
+ servant_upcall,
+ impl
+ ACE_ENV_ARG_PARAMETER
+ );
+}
+
+// TAO_IDL - Generated from
+// be\be_interface.cpp:1955
+
+ACE_INLINE
+void
+POA_CORBA::ExtAbstractInterfaceDef::describe_interface_skel (
+ TAO_ServerRequest & server_request,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL
+ )
+{
+ POA_CORBA::InterfaceDef * const impl = static_cast<POA_CORBA::ExtAbstractInterfaceDef *> (servant);
+ POA_CORBA::InterfaceDef::describe_interface_skel (
+ server_request,
+ servant_upcall,
+ impl
+ ACE_ENV_ARG_PARAMETER
+ );
+}
+
+// TAO_IDL - Generated from
+// be\be_interface.cpp:1955
+
+ACE_INLINE
+void
+POA_CORBA::ExtAbstractInterfaceDef::create_attribute_skel (
+ TAO_ServerRequest & server_request,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL
+ )
+{
+ POA_CORBA::InterfaceDef * const impl = static_cast<POA_CORBA::ExtAbstractInterfaceDef *> (servant);
+ POA_CORBA::InterfaceDef::create_attribute_skel (
+ server_request,
+ servant_upcall,
+ impl
+ ACE_ENV_ARG_PARAMETER
+ );
+}
+
+// TAO_IDL - Generated from
+// be\be_interface.cpp:1955
+
+ACE_INLINE
+void
+POA_CORBA::ExtAbstractInterfaceDef::create_operation_skel (
+ TAO_ServerRequest & server_request,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL
+ )
+{
+ POA_CORBA::InterfaceDef * const impl = static_cast<POA_CORBA::ExtAbstractInterfaceDef *> (servant);
+ POA_CORBA::InterfaceDef::create_operation_skel (
+ server_request,
+ servant_upcall,
+ impl
+ ACE_ENV_ARG_PARAMETER
+ );
+}
+
+// TAO_IDL - Generated from
+// be\be_interface.cpp:1955
+
+ACE_INLINE
+void
+POA_CORBA::ExtAbstractInterfaceDef::describe_ext_interface_skel (
+ TAO_ServerRequest & server_request,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL
+ )
+{
+ POA_CORBA::InterfaceAttrExtension * const impl = static_cast<POA_CORBA::ExtAbstractInterfaceDef *> (servant);
+ POA_CORBA::InterfaceAttrExtension::describe_ext_interface_skel (
+ server_request,
+ servant_upcall,
+ impl
+ ACE_ENV_ARG_PARAMETER
+ );
+}
+
+// TAO_IDL - Generated from
+// be\be_interface.cpp:1955
+
+ACE_INLINE
+void
+POA_CORBA::ExtAbstractInterfaceDef::create_ext_attribute_skel (
+ TAO_ServerRequest & server_request,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL
+ )
+{
+ POA_CORBA::InterfaceAttrExtension * const impl = static_cast<POA_CORBA::ExtAbstractInterfaceDef *> (servant);
+ POA_CORBA::InterfaceAttrExtension::create_ext_attribute_skel (
+ server_request,
+ servant_upcall,
+ impl
+ ACE_ENV_ARG_PARAMETER
+ );
+}
+
+ACE_INLINE
+void
+POA_CORBA::LocalInterfaceDef::_get_def_kind_skel (
+ TAO_ServerRequest & server_request,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL
+ )
+{
+ POA_CORBA::IRObject * const impl = static_cast<POA_CORBA::LocalInterfaceDef *> (servant);
+ POA_CORBA::IRObject::_get_def_kind_skel (
+ server_request,
+ servant_upcall,
+ impl
+ ACE_ENV_ARG_PARAMETER
+ );
+}
+
+// TAO_IDL - Generated from
+// be\be_interface.cpp:1955
+
+ACE_INLINE
+void
+POA_CORBA::LocalInterfaceDef::destroy_skel (
+ TAO_ServerRequest & server_request,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL
+ )
+{
+ POA_CORBA::IRObject * const impl = static_cast<POA_CORBA::LocalInterfaceDef *> (servant);
+ POA_CORBA::IRObject::destroy_skel (
+ server_request,
+ servant_upcall,
+ impl
+ ACE_ENV_ARG_PARAMETER
+ );
+}
+
+// TAO_IDL - Generated from
+// be\be_interface.cpp:1955
+
+ACE_INLINE
+void
+POA_CORBA::LocalInterfaceDef::lookup_skel (
+ TAO_ServerRequest & server_request,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL
+ )
+{
+ POA_CORBA::Container * const impl = static_cast<POA_CORBA::LocalInterfaceDef *> (servant);
+ POA_CORBA::Container::lookup_skel (
+ server_request,
+ servant_upcall,
+ impl
+ ACE_ENV_ARG_PARAMETER
+ );
+}
+
+// TAO_IDL - Generated from
+// be\be_interface.cpp:1955
+
+ACE_INLINE
+void
+POA_CORBA::LocalInterfaceDef::contents_skel (
+ TAO_ServerRequest & server_request,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL
+ )
+{
+ POA_CORBA::Container * const impl = static_cast<POA_CORBA::LocalInterfaceDef *> (servant);
+ POA_CORBA::Container::contents_skel (
+ server_request,
+ servant_upcall,
+ impl
+ ACE_ENV_ARG_PARAMETER
+ );
+}
+
+// TAO_IDL - Generated from
+// be\be_interface.cpp:1955
+
+ACE_INLINE
+void
+POA_CORBA::LocalInterfaceDef::lookup_name_skel (
+ TAO_ServerRequest & server_request,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL
+ )
+{
+ POA_CORBA::Container * const impl = static_cast<POA_CORBA::LocalInterfaceDef *> (servant);
+ POA_CORBA::Container::lookup_name_skel (
+ server_request,
+ servant_upcall,
+ impl
+ ACE_ENV_ARG_PARAMETER
+ );
+}
+
+// TAO_IDL - Generated from
+// be\be_interface.cpp:1955
+
+ACE_INLINE
+void
+POA_CORBA::LocalInterfaceDef::describe_contents_skel (
+ TAO_ServerRequest & server_request,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL
+ )
+{
+ POA_CORBA::Container * const impl = static_cast<POA_CORBA::LocalInterfaceDef *> (servant);
+ POA_CORBA::Container::describe_contents_skel (
+ server_request,
+ servant_upcall,
+ impl
+ ACE_ENV_ARG_PARAMETER
+ );
+}
+
+// TAO_IDL - Generated from
+// be\be_interface.cpp:1955
+
+ACE_INLINE
+void
+POA_CORBA::LocalInterfaceDef::create_module_skel (
+ TAO_ServerRequest & server_request,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL
+ )
+{
+ POA_CORBA::Container * const impl = static_cast<POA_CORBA::LocalInterfaceDef *> (servant);
+ POA_CORBA::Container::create_module_skel (
+ server_request,
+ servant_upcall,
+ impl
+ ACE_ENV_ARG_PARAMETER
+ );
+}
+
+// TAO_IDL - Generated from
+// be\be_interface.cpp:1955
+
+ACE_INLINE
+void
+POA_CORBA::LocalInterfaceDef::create_constant_skel (
+ TAO_ServerRequest & server_request,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL
+ )
+{
+ POA_CORBA::Container * const impl = static_cast<POA_CORBA::LocalInterfaceDef *> (servant);
+ POA_CORBA::Container::create_constant_skel (
+ server_request,
+ servant_upcall,
+ impl
+ ACE_ENV_ARG_PARAMETER
+ );
+}
+
+// TAO_IDL - Generated from
+// be\be_interface.cpp:1955
+
+ACE_INLINE
+void
+POA_CORBA::LocalInterfaceDef::create_struct_skel (
+ TAO_ServerRequest & server_request,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL
+ )
+{
+ POA_CORBA::Container * const impl = static_cast<POA_CORBA::LocalInterfaceDef *> (servant);
+ POA_CORBA::Container::create_struct_skel (
+ server_request,
+ servant_upcall,
+ impl
+ ACE_ENV_ARG_PARAMETER
+ );
+}
+
+// TAO_IDL - Generated from
+// be\be_interface.cpp:1955
+
+ACE_INLINE
+void
+POA_CORBA::LocalInterfaceDef::create_union_skel (
+ TAO_ServerRequest & server_request,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL
+ )
+{
+ POA_CORBA::Container * const impl = static_cast<POA_CORBA::LocalInterfaceDef *> (servant);
+ POA_CORBA::Container::create_union_skel (
+ server_request,
+ servant_upcall,
+ impl
+ ACE_ENV_ARG_PARAMETER
+ );
+}
+
+// TAO_IDL - Generated from
+// be\be_interface.cpp:1955
+
+ACE_INLINE
+void
+POA_CORBA::LocalInterfaceDef::create_enum_skel (
+ TAO_ServerRequest & server_request,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL
+ )
+{
+ POA_CORBA::Container * const impl = static_cast<POA_CORBA::LocalInterfaceDef *> (servant);
+ POA_CORBA::Container::create_enum_skel (
+ server_request,
+ servant_upcall,
+ impl
+ ACE_ENV_ARG_PARAMETER
+ );
+}
+
+// TAO_IDL - Generated from
+// be\be_interface.cpp:1955
+
+ACE_INLINE
+void
+POA_CORBA::LocalInterfaceDef::create_alias_skel (
+ TAO_ServerRequest & server_request,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL
+ )
+{
+ POA_CORBA::Container * const impl = static_cast<POA_CORBA::LocalInterfaceDef *> (servant);
+ POA_CORBA::Container::create_alias_skel (
+ server_request,
+ servant_upcall,
+ impl
+ ACE_ENV_ARG_PARAMETER
+ );
+}
+
+// TAO_IDL - Generated from
+// be\be_interface.cpp:1955
+
+ACE_INLINE
+void
+POA_CORBA::LocalInterfaceDef::create_interface_skel (
+ TAO_ServerRequest & server_request,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL
+ )
+{
+ POA_CORBA::Container * const impl = static_cast<POA_CORBA::LocalInterfaceDef *> (servant);
+ POA_CORBA::Container::create_interface_skel (
+ server_request,
+ servant_upcall,
+ impl
+ ACE_ENV_ARG_PARAMETER
+ );
+}
+
+// TAO_IDL - Generated from
+// be\be_interface.cpp:1955
+
+ACE_INLINE
+void
+POA_CORBA::LocalInterfaceDef::create_value_skel (
+ TAO_ServerRequest & server_request,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL
+ )
+{
+ POA_CORBA::Container * const impl = static_cast<POA_CORBA::LocalInterfaceDef *> (servant);
+ POA_CORBA::Container::create_value_skel (
+ server_request,
+ servant_upcall,
+ impl
+ ACE_ENV_ARG_PARAMETER
+ );
+}
+
+// TAO_IDL - Generated from
+// be\be_interface.cpp:1955
+
+ACE_INLINE
+void
+POA_CORBA::LocalInterfaceDef::create_value_box_skel (
+ TAO_ServerRequest & server_request,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL
+ )
+{
+ POA_CORBA::Container * const impl = static_cast<POA_CORBA::LocalInterfaceDef *> (servant);
+ POA_CORBA::Container::create_value_box_skel (
+ server_request,
+ servant_upcall,
+ impl
+ ACE_ENV_ARG_PARAMETER
+ );
+}
+
+// TAO_IDL - Generated from
+// be\be_interface.cpp:1955
+
+ACE_INLINE
+void
+POA_CORBA::LocalInterfaceDef::create_exception_skel (
+ TAO_ServerRequest & server_request,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL
+ )
+{
+ POA_CORBA::Container * const impl = static_cast<POA_CORBA::LocalInterfaceDef *> (servant);
+ POA_CORBA::Container::create_exception_skel (
+ server_request,
+ servant_upcall,
+ impl
+ ACE_ENV_ARG_PARAMETER
+ );
+}
+
+// TAO_IDL - Generated from
+// be\be_interface.cpp:1955
+
+ACE_INLINE
+void
+POA_CORBA::LocalInterfaceDef::create_native_skel (
+ TAO_ServerRequest & server_request,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL
+ )
+{
+ POA_CORBA::Container * const impl = static_cast<POA_CORBA::LocalInterfaceDef *> (servant);
+ POA_CORBA::Container::create_native_skel (
+ server_request,
+ servant_upcall,
+ impl
+ ACE_ENV_ARG_PARAMETER
+ );
+}
+
+// TAO_IDL - Generated from
+// be\be_interface.cpp:1955
+
+ACE_INLINE
+void
+POA_CORBA::LocalInterfaceDef::create_abstract_interface_skel (
+ TAO_ServerRequest & server_request,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL
+ )
+{
+ POA_CORBA::Container * const impl = static_cast<POA_CORBA::LocalInterfaceDef *> (servant);
+ POA_CORBA::Container::create_abstract_interface_skel (
+ server_request,
+ servant_upcall,
+ impl
+ ACE_ENV_ARG_PARAMETER
+ );
+}
+
+// TAO_IDL - Generated from
+// be\be_interface.cpp:1955
+
+ACE_INLINE
+void
+POA_CORBA::LocalInterfaceDef::create_local_interface_skel (
+ TAO_ServerRequest & server_request,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL
+ )
+{
+ POA_CORBA::Container * const impl = static_cast<POA_CORBA::LocalInterfaceDef *> (servant);
+ POA_CORBA::Container::create_local_interface_skel (
+ server_request,
+ servant_upcall,
+ impl
+ ACE_ENV_ARG_PARAMETER
+ );
+}
+
+// TAO_IDL - Generated from
+// be\be_interface.cpp:1955
+
+ACE_INLINE
+void
+POA_CORBA::LocalInterfaceDef::create_ext_value_skel (
+ TAO_ServerRequest & server_request,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL
+ )
+{
+ POA_CORBA::Container * const impl = static_cast<POA_CORBA::LocalInterfaceDef *> (servant);
+ POA_CORBA::Container::create_ext_value_skel (
+ server_request,
+ servant_upcall,
+ impl
+ ACE_ENV_ARG_PARAMETER
+ );
+}
+
+ACE_INLINE
+void
+POA_CORBA::LocalInterfaceDef::_get_id_skel (
+ TAO_ServerRequest & server_request,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL
+ )
+{
+ POA_CORBA::Contained * const impl = static_cast<POA_CORBA::LocalInterfaceDef *> (servant);
+ POA_CORBA::Contained::_get_id_skel (
+ server_request,
+ servant_upcall,
+ impl
+ ACE_ENV_ARG_PARAMETER
+ );
+}
+
+ACE_INLINE
+void
+POA_CORBA::LocalInterfaceDef::_set_id_skel (
+ TAO_ServerRequest & server_request,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL
+ )
+{
+ POA_CORBA::Contained * const impl = static_cast<POA_CORBA::LocalInterfaceDef *> (servant);
+ POA_CORBA::Contained::_set_id_skel (
+ server_request,
+ servant_upcall,
+ impl
+ ACE_ENV_ARG_PARAMETER
+ );
+}
+
+ACE_INLINE
+void
+POA_CORBA::LocalInterfaceDef::_get_name_skel (
+ TAO_ServerRequest & server_request,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL
+ )
+{
+ POA_CORBA::Contained * const impl = static_cast<POA_CORBA::LocalInterfaceDef *> (servant);
+ POA_CORBA::Contained::_get_name_skel (
+ server_request,
+ servant_upcall,
+ impl
+ ACE_ENV_ARG_PARAMETER
+ );
+}
+
+ACE_INLINE
+void
+POA_CORBA::LocalInterfaceDef::_set_name_skel (
+ TAO_ServerRequest & server_request,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL
+ )
+{
+ POA_CORBA::Contained * const impl = static_cast<POA_CORBA::LocalInterfaceDef *> (servant);
+ POA_CORBA::Contained::_set_name_skel (
+ server_request,
+ servant_upcall,
+ impl
+ ACE_ENV_ARG_PARAMETER
+ );
+}
+
+ACE_INLINE
+void
+POA_CORBA::LocalInterfaceDef::_get_version_skel (
+ TAO_ServerRequest & server_request,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL
+ )
+{
+ POA_CORBA::Contained * const impl = static_cast<POA_CORBA::LocalInterfaceDef *> (servant);
+ POA_CORBA::Contained::_get_version_skel (
+ server_request,
+ servant_upcall,
+ impl
+ ACE_ENV_ARG_PARAMETER
+ );
+}
+
+ACE_INLINE
+void
+POA_CORBA::LocalInterfaceDef::_set_version_skel (
+ TAO_ServerRequest & server_request,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL
+ )
+{
+ POA_CORBA::Contained * const impl = static_cast<POA_CORBA::LocalInterfaceDef *> (servant);
+ POA_CORBA::Contained::_set_version_skel (
+ server_request,
+ servant_upcall,
+ impl
+ ACE_ENV_ARG_PARAMETER
+ );
+}
+
+ACE_INLINE
+void
+POA_CORBA::LocalInterfaceDef::_get_defined_in_skel (
+ TAO_ServerRequest & server_request,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL
+ )
+{
+ POA_CORBA::Contained * const impl = static_cast<POA_CORBA::LocalInterfaceDef *> (servant);
+ POA_CORBA::Contained::_get_defined_in_skel (
+ server_request,
+ servant_upcall,
+ impl
+ ACE_ENV_ARG_PARAMETER
+ );
+}
+
+ACE_INLINE
+void
+POA_CORBA::LocalInterfaceDef::_get_absolute_name_skel (
+ TAO_ServerRequest & server_request,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL
+ )
+{
+ POA_CORBA::Contained * const impl = static_cast<POA_CORBA::LocalInterfaceDef *> (servant);
+ POA_CORBA::Contained::_get_absolute_name_skel (
+ server_request,
+ servant_upcall,
+ impl
+ ACE_ENV_ARG_PARAMETER
+ );
+}
+
+ACE_INLINE
+void
+POA_CORBA::LocalInterfaceDef::_get_containing_repository_skel (
+ TAO_ServerRequest & server_request,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL
+ )
+{
+ POA_CORBA::Contained * const impl = static_cast<POA_CORBA::LocalInterfaceDef *> (servant);
+ POA_CORBA::Contained::_get_containing_repository_skel (
+ server_request,
+ servant_upcall,
+ impl
+ ACE_ENV_ARG_PARAMETER
+ );
+}
+
+// TAO_IDL - Generated from
+// be\be_interface.cpp:1955
+
+ACE_INLINE
+void
+POA_CORBA::LocalInterfaceDef::describe_skel (
+ TAO_ServerRequest & server_request,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL
+ )
+{
+ POA_CORBA::Contained * const impl = static_cast<POA_CORBA::LocalInterfaceDef *> (servant);
+ POA_CORBA::Contained::describe_skel (
+ server_request,
+ servant_upcall,
+ impl
+ ACE_ENV_ARG_PARAMETER
+ );
+}
+
+// TAO_IDL - Generated from
+// be\be_interface.cpp:1955
+
+ACE_INLINE
+void
+POA_CORBA::LocalInterfaceDef::move_skel (
+ TAO_ServerRequest & server_request,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL
+ )
+{
+ POA_CORBA::Contained * const impl = static_cast<POA_CORBA::LocalInterfaceDef *> (servant);
+ POA_CORBA::Contained::move_skel (
+ server_request,
+ servant_upcall,
+ impl
+ ACE_ENV_ARG_PARAMETER
+ );
+}
+
+ACE_INLINE
+void
+POA_CORBA::LocalInterfaceDef::_get_type_skel (
+ TAO_ServerRequest & server_request,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL
+ )
+{
+ POA_CORBA::IDLType * const impl = static_cast<POA_CORBA::LocalInterfaceDef *> (servant);
+ POA_CORBA::IDLType::_get_type_skel (
+ server_request,
+ servant_upcall,
+ impl
+ ACE_ENV_ARG_PARAMETER
+ );
+}
+
+ACE_INLINE
+void
+POA_CORBA::LocalInterfaceDef::_get_base_interfaces_skel (
+ TAO_ServerRequest & server_request,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL
+ )
+{
+ POA_CORBA::InterfaceDef * const impl = static_cast<POA_CORBA::LocalInterfaceDef *> (servant);
+ POA_CORBA::InterfaceDef::_get_base_interfaces_skel (
+ server_request,
+ servant_upcall,
+ impl
+ ACE_ENV_ARG_PARAMETER
+ );
+}
+
+ACE_INLINE
+void
+POA_CORBA::LocalInterfaceDef::_set_base_interfaces_skel (
+ TAO_ServerRequest & server_request,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL
+ )
+{
+ POA_CORBA::InterfaceDef * const impl = static_cast<POA_CORBA::LocalInterfaceDef *> (servant);
+ POA_CORBA::InterfaceDef::_set_base_interfaces_skel (
+ server_request,
+ servant_upcall,
+ impl
+ ACE_ENV_ARG_PARAMETER
+ );
+}
+
+// TAO_IDL - Generated from
+// be\be_interface.cpp:1955
+
+ACE_INLINE
+void
+POA_CORBA::LocalInterfaceDef::is_a_skel (
+ TAO_ServerRequest & server_request,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL
+ )
+{
+ POA_CORBA::InterfaceDef * const impl = static_cast<POA_CORBA::LocalInterfaceDef *> (servant);
+ POA_CORBA::InterfaceDef::is_a_skel (
+ server_request,
+ servant_upcall,
+ impl
+ ACE_ENV_ARG_PARAMETER
+ );
+}
+
+// TAO_IDL - Generated from
+// be\be_interface.cpp:1955
+
+ACE_INLINE
+void
+POA_CORBA::LocalInterfaceDef::describe_interface_skel (
+ TAO_ServerRequest & server_request,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL
+ )
+{
+ POA_CORBA::InterfaceDef * const impl = static_cast<POA_CORBA::LocalInterfaceDef *> (servant);
+ POA_CORBA::InterfaceDef::describe_interface_skel (
+ server_request,
+ servant_upcall,
+ impl
+ ACE_ENV_ARG_PARAMETER
+ );
+}
+
+// TAO_IDL - Generated from
+// be\be_interface.cpp:1955
+
+ACE_INLINE
+void
+POA_CORBA::LocalInterfaceDef::create_attribute_skel (
+ TAO_ServerRequest & server_request,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL
+ )
+{
+ POA_CORBA::InterfaceDef * const impl = static_cast<POA_CORBA::LocalInterfaceDef *> (servant);
+ POA_CORBA::InterfaceDef::create_attribute_skel (
+ server_request,
+ servant_upcall,
+ impl
+ ACE_ENV_ARG_PARAMETER
+ );
+}
+
+// TAO_IDL - Generated from
+// be\be_interface.cpp:1955
+
+ACE_INLINE
+void
+POA_CORBA::LocalInterfaceDef::create_operation_skel (
+ TAO_ServerRequest & server_request,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL
+ )
+{
+ POA_CORBA::InterfaceDef * const impl = static_cast<POA_CORBA::LocalInterfaceDef *> (servant);
+ POA_CORBA::InterfaceDef::create_operation_skel (
+ server_request,
+ servant_upcall,
+ impl
+ ACE_ENV_ARG_PARAMETER
+ );
+}
+
+ACE_INLINE
+void
+POA_CORBA::ExtLocalInterfaceDef::_get_def_kind_skel (
+ TAO_ServerRequest & server_request,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL
+ )
+{
+ POA_CORBA::IRObject * const impl = static_cast<POA_CORBA::ExtLocalInterfaceDef *> (servant);
+ POA_CORBA::IRObject::_get_def_kind_skel (
+ server_request,
+ servant_upcall,
+ impl
+ ACE_ENV_ARG_PARAMETER
+ );
+}
+
+// TAO_IDL - Generated from
+// be\be_interface.cpp:1955
+
+ACE_INLINE
+void
+POA_CORBA::ExtLocalInterfaceDef::destroy_skel (
+ TAO_ServerRequest & server_request,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL
+ )
+{
+ POA_CORBA::IRObject * const impl = static_cast<POA_CORBA::ExtLocalInterfaceDef *> (servant);
+ POA_CORBA::IRObject::destroy_skel (
+ server_request,
+ servant_upcall,
+ impl
+ ACE_ENV_ARG_PARAMETER
+ );
+}
+
+// TAO_IDL - Generated from
+// be\be_interface.cpp:1955
+
+ACE_INLINE
+void
+POA_CORBA::ExtLocalInterfaceDef::lookup_skel (
+ TAO_ServerRequest & server_request,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL
+ )
+{
+ POA_CORBA::Container * const impl = static_cast<POA_CORBA::ExtLocalInterfaceDef *> (servant);
+ POA_CORBA::Container::lookup_skel (
+ server_request,
+ servant_upcall,
+ impl
+ ACE_ENV_ARG_PARAMETER
+ );
+}
+
+// TAO_IDL - Generated from
+// be\be_interface.cpp:1955
+
+ACE_INLINE
+void
+POA_CORBA::ExtLocalInterfaceDef::contents_skel (
+ TAO_ServerRequest & server_request,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL
+ )
+{
+ POA_CORBA::Container * const impl = static_cast<POA_CORBA::ExtLocalInterfaceDef *> (servant);
+ POA_CORBA::Container::contents_skel (
+ server_request,
+ servant_upcall,
+ impl
+ ACE_ENV_ARG_PARAMETER
+ );
+}
+
+// TAO_IDL - Generated from
+// be\be_interface.cpp:1955
+
+ACE_INLINE
+void
+POA_CORBA::ExtLocalInterfaceDef::lookup_name_skel (
+ TAO_ServerRequest & server_request,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL
+ )
+{
+ POA_CORBA::Container * const impl = static_cast<POA_CORBA::ExtLocalInterfaceDef *> (servant);
+ POA_CORBA::Container::lookup_name_skel (
+ server_request,
+ servant_upcall,
+ impl
+ ACE_ENV_ARG_PARAMETER
+ );
+}
+
+// TAO_IDL - Generated from
+// be\be_interface.cpp:1955
+
+ACE_INLINE
+void
+POA_CORBA::ExtLocalInterfaceDef::describe_contents_skel (
+ TAO_ServerRequest & server_request,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL
+ )
+{
+ POA_CORBA::Container * const impl = static_cast<POA_CORBA::ExtLocalInterfaceDef *> (servant);
+ POA_CORBA::Container::describe_contents_skel (
+ server_request,
+ servant_upcall,
+ impl
+ ACE_ENV_ARG_PARAMETER
+ );
+}
+
+// TAO_IDL - Generated from
+// be\be_interface.cpp:1955
+
+ACE_INLINE
+void
+POA_CORBA::ExtLocalInterfaceDef::create_module_skel (
+ TAO_ServerRequest & server_request,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL
+ )
+{
+ POA_CORBA::Container * const impl = static_cast<POA_CORBA::ExtLocalInterfaceDef *> (servant);
+ POA_CORBA::Container::create_module_skel (
+ server_request,
+ servant_upcall,
+ impl
+ ACE_ENV_ARG_PARAMETER
+ );
+}
+
+// TAO_IDL - Generated from
+// be\be_interface.cpp:1955
+
+ACE_INLINE
+void
+POA_CORBA::ExtLocalInterfaceDef::create_constant_skel (
+ TAO_ServerRequest & server_request,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL
+ )
+{
+ POA_CORBA::Container * const impl = static_cast<POA_CORBA::ExtLocalInterfaceDef *> (servant);
+ POA_CORBA::Container::create_constant_skel (
+ server_request,
+ servant_upcall,
+ impl
+ ACE_ENV_ARG_PARAMETER
+ );
+}
+
+// TAO_IDL - Generated from
+// be\be_interface.cpp:1955
+
+ACE_INLINE
+void
+POA_CORBA::ExtLocalInterfaceDef::create_struct_skel (
+ TAO_ServerRequest & server_request,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL
+ )
+{
+ POA_CORBA::Container * const impl = static_cast<POA_CORBA::ExtLocalInterfaceDef *> (servant);
+ POA_CORBA::Container::create_struct_skel (
+ server_request,
+ servant_upcall,
+ impl
+ ACE_ENV_ARG_PARAMETER
+ );
+}
+
+// TAO_IDL - Generated from
+// be\be_interface.cpp:1955
+
+ACE_INLINE
+void
+POA_CORBA::ExtLocalInterfaceDef::create_union_skel (
+ TAO_ServerRequest & server_request,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL
+ )
+{
+ POA_CORBA::Container * const impl = static_cast<POA_CORBA::ExtLocalInterfaceDef *> (servant);
+ POA_CORBA::Container::create_union_skel (
+ server_request,
+ servant_upcall,
+ impl
+ ACE_ENV_ARG_PARAMETER
+ );
+}
+
+// TAO_IDL - Generated from
+// be\be_interface.cpp:1955
+
+ACE_INLINE
+void
+POA_CORBA::ExtLocalInterfaceDef::create_enum_skel (
+ TAO_ServerRequest & server_request,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL
+ )
+{
+ POA_CORBA::Container * const impl = static_cast<POA_CORBA::ExtLocalInterfaceDef *> (servant);
+ POA_CORBA::Container::create_enum_skel (
+ server_request,
+ servant_upcall,
+ impl
+ ACE_ENV_ARG_PARAMETER
+ );
+}
+
+// TAO_IDL - Generated from
+// be\be_interface.cpp:1955
+
+ACE_INLINE
+void
+POA_CORBA::ExtLocalInterfaceDef::create_alias_skel (
+ TAO_ServerRequest & server_request,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL
+ )
+{
+ POA_CORBA::Container * const impl = static_cast<POA_CORBA::ExtLocalInterfaceDef *> (servant);
+ POA_CORBA::Container::create_alias_skel (
+ server_request,
+ servant_upcall,
+ impl
+ ACE_ENV_ARG_PARAMETER
+ );
+}
+
+// TAO_IDL - Generated from
+// be\be_interface.cpp:1955
+
+ACE_INLINE
+void
+POA_CORBA::ExtLocalInterfaceDef::create_interface_skel (
+ TAO_ServerRequest & server_request,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL
+ )
+{
+ POA_CORBA::Container * const impl = static_cast<POA_CORBA::ExtLocalInterfaceDef *> (servant);
+ POA_CORBA::Container::create_interface_skel (
+ server_request,
+ servant_upcall,
+ impl
+ ACE_ENV_ARG_PARAMETER
+ );
+}
+
+// TAO_IDL - Generated from
+// be\be_interface.cpp:1955
+
+ACE_INLINE
+void
+POA_CORBA::ExtLocalInterfaceDef::create_value_skel (
+ TAO_ServerRequest & server_request,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL
+ )
+{
+ POA_CORBA::Container * const impl = static_cast<POA_CORBA::ExtLocalInterfaceDef *> (servant);
+ POA_CORBA::Container::create_value_skel (
+ server_request,
+ servant_upcall,
+ impl
+ ACE_ENV_ARG_PARAMETER
+ );
+}
+
+// TAO_IDL - Generated from
+// be\be_interface.cpp:1955
+
+ACE_INLINE
+void
+POA_CORBA::ExtLocalInterfaceDef::create_value_box_skel (
+ TAO_ServerRequest & server_request,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL
+ )
+{
+ POA_CORBA::Container * const impl = static_cast<POA_CORBA::ExtLocalInterfaceDef *> (servant);
+ POA_CORBA::Container::create_value_box_skel (
+ server_request,
+ servant_upcall,
+ impl
+ ACE_ENV_ARG_PARAMETER
+ );
+}
+
+// TAO_IDL - Generated from
+// be\be_interface.cpp:1955
+
+ACE_INLINE
+void
+POA_CORBA::ExtLocalInterfaceDef::create_exception_skel (
+ TAO_ServerRequest & server_request,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL
+ )
+{
+ POA_CORBA::Container * const impl = static_cast<POA_CORBA::ExtLocalInterfaceDef *> (servant);
+ POA_CORBA::Container::create_exception_skel (
+ server_request,
+ servant_upcall,
+ impl
+ ACE_ENV_ARG_PARAMETER
+ );
+}
+
+// TAO_IDL - Generated from
+// be\be_interface.cpp:1955
+
+ACE_INLINE
+void
+POA_CORBA::ExtLocalInterfaceDef::create_native_skel (
+ TAO_ServerRequest & server_request,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL
+ )
+{
+ POA_CORBA::Container * const impl = static_cast<POA_CORBA::ExtLocalInterfaceDef *> (servant);
+ POA_CORBA::Container::create_native_skel (
+ server_request,
+ servant_upcall,
+ impl
+ ACE_ENV_ARG_PARAMETER
+ );
+}
+
+// TAO_IDL - Generated from
+// be\be_interface.cpp:1955
+
+ACE_INLINE
+void
+POA_CORBA::ExtLocalInterfaceDef::create_abstract_interface_skel (
+ TAO_ServerRequest & server_request,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL
+ )
+{
+ POA_CORBA::Container * const impl = static_cast<POA_CORBA::ExtLocalInterfaceDef *> (servant);
+ POA_CORBA::Container::create_abstract_interface_skel (
+ server_request,
+ servant_upcall,
+ impl
+ ACE_ENV_ARG_PARAMETER
+ );
+}
+
+// TAO_IDL - Generated from
+// be\be_interface.cpp:1955
+
+ACE_INLINE
+void
+POA_CORBA::ExtLocalInterfaceDef::create_local_interface_skel (
+ TAO_ServerRequest & server_request,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL
+ )
+{
+ POA_CORBA::Container * const impl = static_cast<POA_CORBA::ExtLocalInterfaceDef *> (servant);
+ POA_CORBA::Container::create_local_interface_skel (
+ server_request,
+ servant_upcall,
+ impl
+ ACE_ENV_ARG_PARAMETER
+ );
+}
+
+// TAO_IDL - Generated from
+// be\be_interface.cpp:1955
+
+ACE_INLINE
+void
+POA_CORBA::ExtLocalInterfaceDef::create_ext_value_skel (
+ TAO_ServerRequest & server_request,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL
+ )
+{
+ POA_CORBA::Container * const impl = static_cast<POA_CORBA::ExtLocalInterfaceDef *> (servant);
+ POA_CORBA::Container::create_ext_value_skel (
+ server_request,
+ servant_upcall,
+ impl
+ ACE_ENV_ARG_PARAMETER
+ );
+}
+
+ACE_INLINE
+void
+POA_CORBA::ExtLocalInterfaceDef::_get_id_skel (
+ TAO_ServerRequest & server_request,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL
+ )
+{
+ POA_CORBA::Contained * const impl = static_cast<POA_CORBA::ExtLocalInterfaceDef *> (servant);
+ POA_CORBA::Contained::_get_id_skel (
+ server_request,
+ servant_upcall,
+ impl
+ ACE_ENV_ARG_PARAMETER
+ );
+}
+
+ACE_INLINE
+void
+POA_CORBA::ExtLocalInterfaceDef::_set_id_skel (
+ TAO_ServerRequest & server_request,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL
+ )
+{
+ POA_CORBA::Contained * const impl = static_cast<POA_CORBA::ExtLocalInterfaceDef *> (servant);
+ POA_CORBA::Contained::_set_id_skel (
+ server_request,
+ servant_upcall,
+ impl
+ ACE_ENV_ARG_PARAMETER
+ );
+}
+
+ACE_INLINE
+void
+POA_CORBA::ExtLocalInterfaceDef::_get_name_skel (
+ TAO_ServerRequest & server_request,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL
+ )
+{
+ POA_CORBA::Contained * const impl = static_cast<POA_CORBA::ExtLocalInterfaceDef *> (servant);
+ POA_CORBA::Contained::_get_name_skel (
+ server_request,
+ servant_upcall,
+ impl
+ ACE_ENV_ARG_PARAMETER
+ );
+}
+
+ACE_INLINE
+void
+POA_CORBA::ExtLocalInterfaceDef::_set_name_skel (
+ TAO_ServerRequest & server_request,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL
+ )
+{
+ POA_CORBA::Contained * const impl = static_cast<POA_CORBA::ExtLocalInterfaceDef *> (servant);
+ POA_CORBA::Contained::_set_name_skel (
+ server_request,
+ servant_upcall,
+ impl
+ ACE_ENV_ARG_PARAMETER
+ );
+}
+
+ACE_INLINE
+void
+POA_CORBA::ExtLocalInterfaceDef::_get_version_skel (
+ TAO_ServerRequest & server_request,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL
+ )
+{
+ POA_CORBA::Contained * const impl = static_cast<POA_CORBA::ExtLocalInterfaceDef *> (servant);
+ POA_CORBA::Contained::_get_version_skel (
+ server_request,
+ servant_upcall,
+ impl
+ ACE_ENV_ARG_PARAMETER
+ );
+}
+
+ACE_INLINE
+void
+POA_CORBA::ExtLocalInterfaceDef::_set_version_skel (
+ TAO_ServerRequest & server_request,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL
+ )
+{
+ POA_CORBA::Contained * const impl = static_cast<POA_CORBA::ExtLocalInterfaceDef *> (servant);
+ POA_CORBA::Contained::_set_version_skel (
+ server_request,
+ servant_upcall,
+ impl
+ ACE_ENV_ARG_PARAMETER
+ );
+}
+
+ACE_INLINE
+void
+POA_CORBA::ExtLocalInterfaceDef::_get_defined_in_skel (
+ TAO_ServerRequest & server_request,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL
+ )
+{
+ POA_CORBA::Contained * const impl = static_cast<POA_CORBA::ExtLocalInterfaceDef *> (servant);
+ POA_CORBA::Contained::_get_defined_in_skel (
+ server_request,
+ servant_upcall,
+ impl
+ ACE_ENV_ARG_PARAMETER
+ );
+}
+
+ACE_INLINE
+void
+POA_CORBA::ExtLocalInterfaceDef::_get_absolute_name_skel (
+ TAO_ServerRequest & server_request,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL
+ )
+{
+ POA_CORBA::Contained * const impl = static_cast<POA_CORBA::ExtLocalInterfaceDef *> (servant);
+ POA_CORBA::Contained::_get_absolute_name_skel (
+ server_request,
+ servant_upcall,
+ impl
+ ACE_ENV_ARG_PARAMETER
+ );
+}
+
+ACE_INLINE
+void
+POA_CORBA::ExtLocalInterfaceDef::_get_containing_repository_skel (
+ TAO_ServerRequest & server_request,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL
+ )
+{
+ POA_CORBA::Contained * const impl = static_cast<POA_CORBA::ExtLocalInterfaceDef *> (servant);
+ POA_CORBA::Contained::_get_containing_repository_skel (
+ server_request,
+ servant_upcall,
+ impl
+ ACE_ENV_ARG_PARAMETER
+ );
+}
+
+// TAO_IDL - Generated from
+// be\be_interface.cpp:1955
+
+ACE_INLINE
+void
+POA_CORBA::ExtLocalInterfaceDef::describe_skel (
+ TAO_ServerRequest & server_request,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL
+ )
+{
+ POA_CORBA::Contained * const impl = static_cast<POA_CORBA::ExtLocalInterfaceDef *> (servant);
+ POA_CORBA::Contained::describe_skel (
+ server_request,
+ servant_upcall,
+ impl
+ ACE_ENV_ARG_PARAMETER
+ );
+}
+
+// TAO_IDL - Generated from
+// be\be_interface.cpp:1955
+
+ACE_INLINE
+void
+POA_CORBA::ExtLocalInterfaceDef::move_skel (
+ TAO_ServerRequest & server_request,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL
+ )
+{
+ POA_CORBA::Contained * const impl = static_cast<POA_CORBA::ExtLocalInterfaceDef *> (servant);
+ POA_CORBA::Contained::move_skel (
+ server_request,
+ servant_upcall,
+ impl
+ ACE_ENV_ARG_PARAMETER
+ );
+}
+
+ACE_INLINE
+void
+POA_CORBA::ExtLocalInterfaceDef::_get_type_skel (
+ TAO_ServerRequest & server_request,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL
+ )
+{
+ POA_CORBA::IDLType * const impl = static_cast<POA_CORBA::ExtLocalInterfaceDef *> (servant);
+ POA_CORBA::IDLType::_get_type_skel (
+ server_request,
+ servant_upcall,
+ impl
+ ACE_ENV_ARG_PARAMETER
+ );
+}
+
+ACE_INLINE
+void
+POA_CORBA::ExtLocalInterfaceDef::_get_base_interfaces_skel (
+ TAO_ServerRequest & server_request,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL
+ )
+{
+ POA_CORBA::InterfaceDef * const impl = static_cast<POA_CORBA::ExtLocalInterfaceDef *> (servant);
+ POA_CORBA::InterfaceDef::_get_base_interfaces_skel (
+ server_request,
+ servant_upcall,
+ impl
+ ACE_ENV_ARG_PARAMETER
+ );
+}
+
+ACE_INLINE
+void
+POA_CORBA::ExtLocalInterfaceDef::_set_base_interfaces_skel (
+ TAO_ServerRequest & server_request,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL
+ )
+{
+ POA_CORBA::InterfaceDef * const impl = static_cast<POA_CORBA::ExtLocalInterfaceDef *> (servant);
+ POA_CORBA::InterfaceDef::_set_base_interfaces_skel (
+ server_request,
+ servant_upcall,
+ impl
+ ACE_ENV_ARG_PARAMETER
+ );
+}
+
+// TAO_IDL - Generated from
+// be\be_interface.cpp:1955
+
+ACE_INLINE
+void
+POA_CORBA::ExtLocalInterfaceDef::is_a_skel (
+ TAO_ServerRequest & server_request,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL
+ )
+{
+ POA_CORBA::InterfaceDef * const impl = static_cast<POA_CORBA::ExtLocalInterfaceDef *> (servant);
+ POA_CORBA::InterfaceDef::is_a_skel (
+ server_request,
+ servant_upcall,
+ impl
+ ACE_ENV_ARG_PARAMETER
+ );
+}
+
+// TAO_IDL - Generated from
+// be\be_interface.cpp:1955
+
+ACE_INLINE
+void
+POA_CORBA::ExtLocalInterfaceDef::describe_interface_skel (
+ TAO_ServerRequest & server_request,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL
+ )
+{
+ POA_CORBA::InterfaceDef * const impl = static_cast<POA_CORBA::ExtLocalInterfaceDef *> (servant);
+ POA_CORBA::InterfaceDef::describe_interface_skel (
+ server_request,
+ servant_upcall,
+ impl
+ ACE_ENV_ARG_PARAMETER
+ );
+}
+
+// TAO_IDL - Generated from
+// be\be_interface.cpp:1955
+
+ACE_INLINE
+void
+POA_CORBA::ExtLocalInterfaceDef::create_attribute_skel (
+ TAO_ServerRequest & server_request,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL
+ )
+{
+ POA_CORBA::InterfaceDef * const impl = static_cast<POA_CORBA::ExtLocalInterfaceDef *> (servant);
+ POA_CORBA::InterfaceDef::create_attribute_skel (
+ server_request,
+ servant_upcall,
+ impl
+ ACE_ENV_ARG_PARAMETER
+ );
+}
+
+// TAO_IDL - Generated from
+// be\be_interface.cpp:1955
+
+ACE_INLINE
+void
+POA_CORBA::ExtLocalInterfaceDef::create_operation_skel (
+ TAO_ServerRequest & server_request,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL
+ )
+{
+ POA_CORBA::InterfaceDef * const impl = static_cast<POA_CORBA::ExtLocalInterfaceDef *> (servant);
+ POA_CORBA::InterfaceDef::create_operation_skel (
+ server_request,
+ servant_upcall,
+ impl
+ ACE_ENV_ARG_PARAMETER
+ );
+}
+
+// TAO_IDL - Generated from
+// be\be_interface.cpp:1955
+
+ACE_INLINE
+void
+POA_CORBA::ExtLocalInterfaceDef::describe_ext_interface_skel (
+ TAO_ServerRequest & server_request,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL
+ )
+{
+ POA_CORBA::InterfaceAttrExtension * const impl = static_cast<POA_CORBA::ExtLocalInterfaceDef *> (servant);
+ POA_CORBA::InterfaceAttrExtension::describe_ext_interface_skel (
+ server_request,
+ servant_upcall,
+ impl
+ ACE_ENV_ARG_PARAMETER
+ );
+}
+
+// TAO_IDL - Generated from
+// be\be_interface.cpp:1955
+
+ACE_INLINE
+void
+POA_CORBA::ExtLocalInterfaceDef::create_ext_attribute_skel (
+ TAO_ServerRequest & server_request,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL
+ )
+{
+ POA_CORBA::InterfaceAttrExtension * const impl = static_cast<POA_CORBA::ExtLocalInterfaceDef *> (servant);
+ POA_CORBA::InterfaceAttrExtension::create_ext_attribute_skel (
+ server_request,
+ servant_upcall,
+ impl
+ ACE_ENV_ARG_PARAMETER
+ );
+}
+
+
+TAO_END_VERSIONED_NAMESPACE_DECL
+
+
diff --git a/TAO/orbsvcs/orbsvcs/IFRService/IFR_BasicS_T.cpp b/TAO/orbsvcs/orbsvcs/IFRService/IFR_BasicS_T.cpp
new file mode 100644
index 00000000000..d95b6d48dac
--- /dev/null
+++ b/TAO/orbsvcs/orbsvcs/IFRService/IFR_BasicS_T.cpp
@@ -0,0 +1,49 @@
+// -*- C++ -*-
+//
+// $Id$
+
+// **** Code generated by the The ACE ORB (TAO) IDL Compiler ****
+// TAO and the TAO IDL Compiler have been developed by:
+// Center for Distributed Object Computing
+// Washington University
+// St. Louis, MO
+// USA
+// http://www.cs.wustl.edu/~schmidt/doc-center.html
+// and
+// Distributed Object Computing Laboratory
+// University of California at Irvine
+// Irvine, CA
+// USA
+// http://doc.ece.uci.edu/
+// and
+// Institute for Software Integrated Systems
+// Vanderbilt University
+// Nashville, TN
+// USA
+// http://www.isis.vanderbilt.edu/
+//
+// Information about TAO is available at:
+// http://www.cs.wustl.edu/~schmidt/TAO.html
+
+// TAO_IDL - Generated from
+// be\be_codegen.cpp:683
+
+#ifndef _TAO_IDL____ORBSVCS_ORBSVCS_IFRSERVICE_IFR_BASICS_T_CPP_
+#define _TAO_IDL____ORBSVCS_ORBSVCS_IFRSERVICE_IFR_BASICS_T_CPP_
+
+#include "IFR_BasicS_T.h"
+
+#if !defined (__ACE_INLINE__)
+#include "IFR_BasicS_T.inl"
+#endif /* !defined INLINE */
+
+
+
+TAO_BEGIN_VERSIONED_NAMESPACE_DECL
+
+
+
+TAO_END_VERSIONED_NAMESPACE_DECL
+
+
+#endif /* ifndef */
diff --git a/TAO/orbsvcs/orbsvcs/IFRService/IFR_BasicS_T.h b/TAO/orbsvcs/orbsvcs/IFRService/IFR_BasicS_T.h
new file mode 100644
index 00000000000..e316d990dc1
--- /dev/null
+++ b/TAO/orbsvcs/orbsvcs/IFRService/IFR_BasicS_T.h
@@ -0,0 +1,7971 @@
+// -*- C++ -*-
+//
+// $Id$
+
+// **** Code generated by the The ACE ORB (TAO) IDL Compiler ****
+// TAO and the TAO IDL Compiler have been developed by:
+// Center for Distributed Object Computing
+// Washington University
+// St. Louis, MO
+// USA
+// http://www.cs.wustl.edu/~schmidt/doc-center.html
+// and
+// Distributed Object Computing Laboratory
+// University of California at Irvine
+// Irvine, CA
+// USA
+// http://doc.ece.uci.edu/
+// and
+// Institute for Software Integrated Systems
+// Vanderbilt University
+// Nashville, TN
+// USA
+// http://www.isis.vanderbilt.edu/
+//
+// Information about TAO is available at:
+// http://www.cs.wustl.edu/~schmidt/TAO.html
+
+// TAO_IDL - Generated from
+// be\be_codegen.cpp:545
+
+#ifndef _TAO_IDL____ORBSVCS_ORBSVCS_IFRSERVICE_IFR_BASICS_T_H_
+#define _TAO_IDL____ORBSVCS_ORBSVCS_IFRSERVICE_IFR_BASICS_T_H_
+
+#include /**/ "ace/pre.h"
+
+TAO_BEGIN_VERSIONED_NAMESPACE_DECL
+
+
+
+// TAO_IDL - Generated from
+// be\be_visitor_root/root_sth.cpp:116
+
+namespace POA_CORBA
+{
+
+ // TAO_IDL - Generated from
+ // be\be_visitor_interface/tie_sh.cpp:87
+
+ // TIE class: Refer to CORBA v2.2, Section 20.34.4
+ template <class T>
+ class Repository_tie : public Repository
+ {
+ public:
+ /// the T& ctor
+ Repository_tie (T &t);
+ /// ctor taking a POA
+ Repository_tie (T &t, PortableServer::POA_ptr poa);
+ /// ctor taking pointer and an ownership flag
+ Repository_tie (T *tp, ::CORBA::Boolean release = true);
+ /// ctor with T*, ownership flag and a POA
+ Repository_tie (
+ T *tp,
+ PortableServer::POA_ptr poa,
+ ::CORBA::Boolean release = true
+ );
+ /// dtor
+
+ ~Repository_tie (void);
+ // TIE specific functions
+ /// return the underlying object
+ T *_tied_object (void);
+ /// set the underlying object
+ void _tied_object (T &obj);
+ /// set the underlying object and the ownership flag
+ void _tied_object (T *obj, ::CORBA::Boolean release = true);
+ /// do we own it
+ ::CORBA::Boolean _is_owner (void);
+ /// set the ownership
+
+ void _is_owner ( ::CORBA::Boolean b);
+ // overridden ServantBase operations
+ PortableServer::POA_ptr _default_POA (
+ ACE_ENV_SINGLE_ARG_DECL_WITH_DEFAULTS
+ );
+
+ // TAO_IDL - Generated from
+ // be\be_visitor_operation/tie_sh.cpp:60
+
+ ::CORBA::DefinitionKind def_kind (
+ ACE_ENV_SINGLE_ARG_DECL_WITH_DEFAULTS
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ));
+
+ // TAO_IDL - Generated from
+ // be\be_visitor_operation/tie_sh.cpp:60
+
+ void destroy (
+ ACE_ENV_SINGLE_ARG_DECL_WITH_DEFAULTS
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ));
+
+ // TAO_IDL - Generated from
+ // be\be_visitor_operation/tie_sh.cpp:60
+
+ ::CORBA::Contained_ptr lookup (
+ const char * search_name
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ));
+
+ // TAO_IDL - Generated from
+ // be\be_visitor_operation/tie_sh.cpp:60
+
+ ::CORBA::ContainedSeq * contents (
+ ::CORBA::DefinitionKind limit_type,
+ ::CORBA::Boolean exclude_inherited
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ));
+
+ // TAO_IDL - Generated from
+ // be\be_visitor_operation/tie_sh.cpp:60
+
+ ::CORBA::ContainedSeq * lookup_name (
+ const char * search_name,
+ ::CORBA::Long levels_to_search,
+ ::CORBA::DefinitionKind limit_type,
+ ::CORBA::Boolean exclude_inherited
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ));
+
+ // TAO_IDL - Generated from
+ // be\be_visitor_operation/tie_sh.cpp:60
+
+ ::CORBA::Container::DescriptionSeq * describe_contents (
+ ::CORBA::DefinitionKind limit_type,
+ ::CORBA::Boolean exclude_inherited,
+ ::CORBA::Long max_returned_objs
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ));
+
+ // TAO_IDL - Generated from
+ // be\be_visitor_operation/tie_sh.cpp:60
+
+ ::CORBA::ModuleDef_ptr create_module (
+ const char * id,
+ const char * name,
+ const char * version
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ));
+
+ // TAO_IDL - Generated from
+ // be\be_visitor_operation/tie_sh.cpp:60
+
+ ::CORBA::ConstantDef_ptr create_constant (
+ const char * id,
+ const char * name,
+ const char * version,
+ ::CORBA::IDLType_ptr type,
+ const ::CORBA::Any & value
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ));
+
+ // TAO_IDL - Generated from
+ // be\be_visitor_operation/tie_sh.cpp:60
+
+ ::CORBA::StructDef_ptr create_struct (
+ const char * id,
+ const char * name,
+ const char * version,
+ const ::CORBA::StructMemberSeq & members
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ));
+
+ // TAO_IDL - Generated from
+ // be\be_visitor_operation/tie_sh.cpp:60
+
+ ::CORBA::UnionDef_ptr create_union (
+ const char * id,
+ const char * name,
+ const char * version,
+ ::CORBA::IDLType_ptr discriminator_type,
+ const ::CORBA::UnionMemberSeq & members
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ));
+
+ // TAO_IDL - Generated from
+ // be\be_visitor_operation/tie_sh.cpp:60
+
+ ::CORBA::EnumDef_ptr create_enum (
+ const char * id,
+ const char * name,
+ const char * version,
+ const ::CORBA::EnumMemberSeq & members
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ));
+
+ // TAO_IDL - Generated from
+ // be\be_visitor_operation/tie_sh.cpp:60
+
+ ::CORBA::AliasDef_ptr create_alias (
+ const char * id,
+ const char * name,
+ const char * version,
+ ::CORBA::IDLType_ptr original_type
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ));
+
+ // TAO_IDL - Generated from
+ // be\be_visitor_operation/tie_sh.cpp:60
+
+ ::CORBA::InterfaceDef_ptr create_interface (
+ const char * id,
+ const char * name,
+ const char * version,
+ const ::CORBA::InterfaceDefSeq & base_interfaces
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ));
+
+ // TAO_IDL - Generated from
+ // be\be_visitor_operation/tie_sh.cpp:60
+
+ ::CORBA::ValueDef_ptr create_value (
+ const char * id,
+ const char * name,
+ const char * version,
+ ::CORBA::Boolean is_custom,
+ ::CORBA::Boolean is_abstract,
+ ::CORBA::ValueDef_ptr base_value,
+ ::CORBA::Boolean is_truncatable,
+ const ::CORBA::ValueDefSeq & abstract_base_values,
+ const ::CORBA::InterfaceDefSeq & supported_interfaces,
+ const ::CORBA::InitializerSeq & initializers
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ));
+
+ // TAO_IDL - Generated from
+ // be\be_visitor_operation/tie_sh.cpp:60
+
+ ::CORBA::ValueBoxDef_ptr create_value_box (
+ const char * id,
+ const char * name,
+ const char * version,
+ ::CORBA::IDLType_ptr original_type_def
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ));
+
+ // TAO_IDL - Generated from
+ // be\be_visitor_operation/tie_sh.cpp:60
+
+ ::CORBA::ExceptionDef_ptr create_exception (
+ const char * id,
+ const char * name,
+ const char * version,
+ const ::CORBA::StructMemberSeq & members
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ));
+
+ // TAO_IDL - Generated from
+ // be\be_visitor_operation/tie_sh.cpp:60
+
+ ::CORBA::NativeDef_ptr create_native (
+ const char * id,
+ const char * name,
+ const char * version
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ));
+
+ // TAO_IDL - Generated from
+ // be\be_visitor_operation/tie_sh.cpp:60
+
+ ::CORBA::AbstractInterfaceDef_ptr create_abstract_interface (
+ const char * id,
+ const char * name,
+ const char * version,
+ const ::CORBA::AbstractInterfaceDefSeq & base_interfaces
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ));
+
+ // TAO_IDL - Generated from
+ // be\be_visitor_operation/tie_sh.cpp:60
+
+ ::CORBA::LocalInterfaceDef_ptr create_local_interface (
+ const char * id,
+ const char * name,
+ const char * version,
+ const ::CORBA::InterfaceDefSeq & base_interfaces
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ));
+
+ // TAO_IDL - Generated from
+ // be\be_visitor_operation/tie_sh.cpp:60
+
+ ::CORBA::ExtValueDef_ptr create_ext_value (
+ const char * id,
+ const char * name,
+ const char * version,
+ ::CORBA::Boolean is_custom,
+ ::CORBA::Boolean is_abstract,
+ ::CORBA::ValueDef_ptr base_value,
+ ::CORBA::Boolean is_truncatable,
+ const ::CORBA::ValueDefSeq & abstract_base_values,
+ const ::CORBA::InterfaceDefSeq & supported_interfaces,
+ const ::CORBA::ExtInitializerSeq & initializers
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ));
+
+ // TAO_IDL - Generated from
+ // be\be_visitor_operation/tie_sh.cpp:60
+
+ ::CORBA::Contained_ptr lookup_id (
+ const char * search_id
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ));
+
+ // TAO_IDL - Generated from
+ // be\be_visitor_operation/tie_sh.cpp:60
+
+ ::CORBA::TypeCode_ptr get_canonical_typecode (
+ ::CORBA::TypeCode_ptr tc
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ));
+
+ // TAO_IDL - Generated from
+ // be\be_visitor_operation/tie_sh.cpp:60
+
+ ::CORBA::PrimitiveDef_ptr get_primitive (
+ ::CORBA::PrimitiveKind kind
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ));
+
+ // TAO_IDL - Generated from
+ // be\be_visitor_operation/tie_sh.cpp:60
+
+ ::CORBA::StringDef_ptr create_string (
+ ::CORBA::ULong bound
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ));
+
+ // TAO_IDL - Generated from
+ // be\be_visitor_operation/tie_sh.cpp:60
+
+ ::CORBA::WstringDef_ptr create_wstring (
+ ::CORBA::ULong bound
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ));
+
+ // TAO_IDL - Generated from
+ // be\be_visitor_operation/tie_sh.cpp:60
+
+ ::CORBA::SequenceDef_ptr create_sequence (
+ ::CORBA::ULong bound,
+ ::CORBA::IDLType_ptr element_type
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ));
+
+ // TAO_IDL - Generated from
+ // be\be_visitor_operation/tie_sh.cpp:60
+
+ ::CORBA::ArrayDef_ptr create_array (
+ ::CORBA::ULong length,
+ ::CORBA::IDLType_ptr element_type
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ));
+
+ // TAO_IDL - Generated from
+ // be\be_visitor_operation/tie_sh.cpp:60
+
+ ::CORBA::FixedDef_ptr create_fixed (
+ ::CORBA::UShort digits,
+ ::CORBA::Short scale
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ));
+
+ private:
+ T *ptr_;
+ PortableServer::POA_var poa_;
+ ::CORBA::Boolean rel_;
+
+ // copy and assignment are not allowed
+ Repository_tie (const Repository_tie &);
+ void operator= (const Repository_tie &);
+ };
+
+ // TAO_IDL - Generated from
+ // be\be_visitor_interface/tie_sh.cpp:87
+
+ // TIE class: Refer to CORBA v2.2, Section 20.34.4
+ template <class T>
+ class ModuleDef_tie : public ModuleDef
+ {
+ public:
+ /// the T& ctor
+ ModuleDef_tie (T &t);
+ /// ctor taking a POA
+ ModuleDef_tie (T &t, PortableServer::POA_ptr poa);
+ /// ctor taking pointer and an ownership flag
+ ModuleDef_tie (T *tp, ::CORBA::Boolean release = true);
+ /// ctor with T*, ownership flag and a POA
+ ModuleDef_tie (
+ T *tp,
+ PortableServer::POA_ptr poa,
+ ::CORBA::Boolean release = true
+ );
+ /// dtor
+
+ ~ModuleDef_tie (void);
+ // TIE specific functions
+ /// return the underlying object
+ T *_tied_object (void);
+ /// set the underlying object
+ void _tied_object (T &obj);
+ /// set the underlying object and the ownership flag
+ void _tied_object (T *obj, ::CORBA::Boolean release = true);
+ /// do we own it
+ ::CORBA::Boolean _is_owner (void);
+ /// set the ownership
+
+ void _is_owner ( ::CORBA::Boolean b);
+ // overridden ServantBase operations
+ PortableServer::POA_ptr _default_POA (
+ ACE_ENV_SINGLE_ARG_DECL_WITH_DEFAULTS
+ );
+
+ // TAO_IDL - Generated from
+ // be\be_visitor_operation/tie_sh.cpp:60
+
+ ::CORBA::DefinitionKind def_kind (
+ ACE_ENV_SINGLE_ARG_DECL_WITH_DEFAULTS
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ));
+
+ // TAO_IDL - Generated from
+ // be\be_visitor_operation/tie_sh.cpp:60
+
+ void destroy (
+ ACE_ENV_SINGLE_ARG_DECL_WITH_DEFAULTS
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ));
+
+ // TAO_IDL - Generated from
+ // be\be_visitor_operation/tie_sh.cpp:60
+
+ ::CORBA::Contained_ptr lookup (
+ const char * search_name
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ));
+
+ // TAO_IDL - Generated from
+ // be\be_visitor_operation/tie_sh.cpp:60
+
+ ::CORBA::ContainedSeq * contents (
+ ::CORBA::DefinitionKind limit_type,
+ ::CORBA::Boolean exclude_inherited
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ));
+
+ // TAO_IDL - Generated from
+ // be\be_visitor_operation/tie_sh.cpp:60
+
+ ::CORBA::ContainedSeq * lookup_name (
+ const char * search_name,
+ ::CORBA::Long levels_to_search,
+ ::CORBA::DefinitionKind limit_type,
+ ::CORBA::Boolean exclude_inherited
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ));
+
+ // TAO_IDL - Generated from
+ // be\be_visitor_operation/tie_sh.cpp:60
+
+ ::CORBA::Container::DescriptionSeq * describe_contents (
+ ::CORBA::DefinitionKind limit_type,
+ ::CORBA::Boolean exclude_inherited,
+ ::CORBA::Long max_returned_objs
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ));
+
+ // TAO_IDL - Generated from
+ // be\be_visitor_operation/tie_sh.cpp:60
+
+ ::CORBA::ModuleDef_ptr create_module (
+ const char * id,
+ const char * name,
+ const char * version
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ));
+
+ // TAO_IDL - Generated from
+ // be\be_visitor_operation/tie_sh.cpp:60
+
+ ::CORBA::ConstantDef_ptr create_constant (
+ const char * id,
+ const char * name,
+ const char * version,
+ ::CORBA::IDLType_ptr type,
+ const ::CORBA::Any & value
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ));
+
+ // TAO_IDL - Generated from
+ // be\be_visitor_operation/tie_sh.cpp:60
+
+ ::CORBA::StructDef_ptr create_struct (
+ const char * id,
+ const char * name,
+ const char * version,
+ const ::CORBA::StructMemberSeq & members
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ));
+
+ // TAO_IDL - Generated from
+ // be\be_visitor_operation/tie_sh.cpp:60
+
+ ::CORBA::UnionDef_ptr create_union (
+ const char * id,
+ const char * name,
+ const char * version,
+ ::CORBA::IDLType_ptr discriminator_type,
+ const ::CORBA::UnionMemberSeq & members
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ));
+
+ // TAO_IDL - Generated from
+ // be\be_visitor_operation/tie_sh.cpp:60
+
+ ::CORBA::EnumDef_ptr create_enum (
+ const char * id,
+ const char * name,
+ const char * version,
+ const ::CORBA::EnumMemberSeq & members
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ));
+
+ // TAO_IDL - Generated from
+ // be\be_visitor_operation/tie_sh.cpp:60
+
+ ::CORBA::AliasDef_ptr create_alias (
+ const char * id,
+ const char * name,
+ const char * version,
+ ::CORBA::IDLType_ptr original_type
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ));
+
+ // TAO_IDL - Generated from
+ // be\be_visitor_operation/tie_sh.cpp:60
+
+ ::CORBA::InterfaceDef_ptr create_interface (
+ const char * id,
+ const char * name,
+ const char * version,
+ const ::CORBA::InterfaceDefSeq & base_interfaces
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ));
+
+ // TAO_IDL - Generated from
+ // be\be_visitor_operation/tie_sh.cpp:60
+
+ ::CORBA::ValueDef_ptr create_value (
+ const char * id,
+ const char * name,
+ const char * version,
+ ::CORBA::Boolean is_custom,
+ ::CORBA::Boolean is_abstract,
+ ::CORBA::ValueDef_ptr base_value,
+ ::CORBA::Boolean is_truncatable,
+ const ::CORBA::ValueDefSeq & abstract_base_values,
+ const ::CORBA::InterfaceDefSeq & supported_interfaces,
+ const ::CORBA::InitializerSeq & initializers
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ));
+
+ // TAO_IDL - Generated from
+ // be\be_visitor_operation/tie_sh.cpp:60
+
+ ::CORBA::ValueBoxDef_ptr create_value_box (
+ const char * id,
+ const char * name,
+ const char * version,
+ ::CORBA::IDLType_ptr original_type_def
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ));
+
+ // TAO_IDL - Generated from
+ // be\be_visitor_operation/tie_sh.cpp:60
+
+ ::CORBA::ExceptionDef_ptr create_exception (
+ const char * id,
+ const char * name,
+ const char * version,
+ const ::CORBA::StructMemberSeq & members
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ));
+
+ // TAO_IDL - Generated from
+ // be\be_visitor_operation/tie_sh.cpp:60
+
+ ::CORBA::NativeDef_ptr create_native (
+ const char * id,
+ const char * name,
+ const char * version
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ));
+
+ // TAO_IDL - Generated from
+ // be\be_visitor_operation/tie_sh.cpp:60
+
+ ::CORBA::AbstractInterfaceDef_ptr create_abstract_interface (
+ const char * id,
+ const char * name,
+ const char * version,
+ const ::CORBA::AbstractInterfaceDefSeq & base_interfaces
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ));
+
+ // TAO_IDL - Generated from
+ // be\be_visitor_operation/tie_sh.cpp:60
+
+ ::CORBA::LocalInterfaceDef_ptr create_local_interface (
+ const char * id,
+ const char * name,
+ const char * version,
+ const ::CORBA::InterfaceDefSeq & base_interfaces
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ));
+
+ // TAO_IDL - Generated from
+ // be\be_visitor_operation/tie_sh.cpp:60
+
+ ::CORBA::ExtValueDef_ptr create_ext_value (
+ const char * id,
+ const char * name,
+ const char * version,
+ ::CORBA::Boolean is_custom,
+ ::CORBA::Boolean is_abstract,
+ ::CORBA::ValueDef_ptr base_value,
+ ::CORBA::Boolean is_truncatable,
+ const ::CORBA::ValueDefSeq & abstract_base_values,
+ const ::CORBA::InterfaceDefSeq & supported_interfaces,
+ const ::CORBA::ExtInitializerSeq & initializers
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ));
+
+ // TAO_IDL - Generated from
+ // be\be_visitor_operation/tie_sh.cpp:60
+
+ char * id (
+ ACE_ENV_SINGLE_ARG_DECL_WITH_DEFAULTS
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ));
+
+ // TAO_IDL - Generated from
+ // be\be_visitor_operation/tie_sh.cpp:60
+
+ void id (
+ const char * id
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ));
+
+ // TAO_IDL - Generated from
+ // be\be_visitor_operation/tie_sh.cpp:60
+
+ char * name (
+ ACE_ENV_SINGLE_ARG_DECL_WITH_DEFAULTS
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ));
+
+ // TAO_IDL - Generated from
+ // be\be_visitor_operation/tie_sh.cpp:60
+
+ void name (
+ const char * name
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ));
+
+ // TAO_IDL - Generated from
+ // be\be_visitor_operation/tie_sh.cpp:60
+
+ char * version (
+ ACE_ENV_SINGLE_ARG_DECL_WITH_DEFAULTS
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ));
+
+ // TAO_IDL - Generated from
+ // be\be_visitor_operation/tie_sh.cpp:60
+
+ void version (
+ const char * version
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ));
+
+ // TAO_IDL - Generated from
+ // be\be_visitor_operation/tie_sh.cpp:60
+
+ ::CORBA::Container_ptr defined_in (
+ ACE_ENV_SINGLE_ARG_DECL_WITH_DEFAULTS
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ));
+
+ // TAO_IDL - Generated from
+ // be\be_visitor_operation/tie_sh.cpp:60
+
+ char * absolute_name (
+ ACE_ENV_SINGLE_ARG_DECL_WITH_DEFAULTS
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ));
+
+ // TAO_IDL - Generated from
+ // be\be_visitor_operation/tie_sh.cpp:60
+
+ ::CORBA::Repository_ptr containing_repository (
+ ACE_ENV_SINGLE_ARG_DECL_WITH_DEFAULTS
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ));
+
+ // TAO_IDL - Generated from
+ // be\be_visitor_operation/tie_sh.cpp:60
+
+ ::CORBA::Contained::Description * describe (
+ ACE_ENV_SINGLE_ARG_DECL_WITH_DEFAULTS
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ));
+
+ // TAO_IDL - Generated from
+ // be\be_visitor_operation/tie_sh.cpp:60
+
+ void move (
+ ::CORBA::Container_ptr new_container,
+ const char * new_name,
+ const char * new_version
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ));
+
+ private:
+ T *ptr_;
+ PortableServer::POA_var poa_;
+ ::CORBA::Boolean rel_;
+
+ // copy and assignment are not allowed
+ ModuleDef_tie (const ModuleDef_tie &);
+ void operator= (const ModuleDef_tie &);
+ };
+
+ // TAO_IDL - Generated from
+ // be\be_visitor_interface/tie_sh.cpp:87
+
+ // TIE class: Refer to CORBA v2.2, Section 20.34.4
+ template <class T>
+ class ConstantDef_tie : public ConstantDef
+ {
+ public:
+ /// the T& ctor
+ ConstantDef_tie (T &t);
+ /// ctor taking a POA
+ ConstantDef_tie (T &t, PortableServer::POA_ptr poa);
+ /// ctor taking pointer and an ownership flag
+ ConstantDef_tie (T *tp, ::CORBA::Boolean release = true);
+ /// ctor with T*, ownership flag and a POA
+ ConstantDef_tie (
+ T *tp,
+ PortableServer::POA_ptr poa,
+ ::CORBA::Boolean release = true
+ );
+ /// dtor
+
+ ~ConstantDef_tie (void);
+ // TIE specific functions
+ /// return the underlying object
+ T *_tied_object (void);
+ /// set the underlying object
+ void _tied_object (T &obj);
+ /// set the underlying object and the ownership flag
+ void _tied_object (T *obj, ::CORBA::Boolean release = true);
+ /// do we own it
+ ::CORBA::Boolean _is_owner (void);
+ /// set the ownership
+
+ void _is_owner ( ::CORBA::Boolean b);
+ // overridden ServantBase operations
+ PortableServer::POA_ptr _default_POA (
+ ACE_ENV_SINGLE_ARG_DECL_WITH_DEFAULTS
+ );
+
+ // TAO_IDL - Generated from
+ // be\be_visitor_operation/tie_sh.cpp:60
+
+ ::CORBA::DefinitionKind def_kind (
+ ACE_ENV_SINGLE_ARG_DECL_WITH_DEFAULTS
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ));
+
+ // TAO_IDL - Generated from
+ // be\be_visitor_operation/tie_sh.cpp:60
+
+ void destroy (
+ ACE_ENV_SINGLE_ARG_DECL_WITH_DEFAULTS
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ));
+
+ // TAO_IDL - Generated from
+ // be\be_visitor_operation/tie_sh.cpp:60
+
+ char * id (
+ ACE_ENV_SINGLE_ARG_DECL_WITH_DEFAULTS
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ));
+
+ // TAO_IDL - Generated from
+ // be\be_visitor_operation/tie_sh.cpp:60
+
+ void id (
+ const char * id
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ));
+
+ // TAO_IDL - Generated from
+ // be\be_visitor_operation/tie_sh.cpp:60
+
+ char * name (
+ ACE_ENV_SINGLE_ARG_DECL_WITH_DEFAULTS
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ));
+
+ // TAO_IDL - Generated from
+ // be\be_visitor_operation/tie_sh.cpp:60
+
+ void name (
+ const char * name
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ));
+
+ // TAO_IDL - Generated from
+ // be\be_visitor_operation/tie_sh.cpp:60
+
+ char * version (
+ ACE_ENV_SINGLE_ARG_DECL_WITH_DEFAULTS
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ));
+
+ // TAO_IDL - Generated from
+ // be\be_visitor_operation/tie_sh.cpp:60
+
+ void version (
+ const char * version
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ));
+
+ // TAO_IDL - Generated from
+ // be\be_visitor_operation/tie_sh.cpp:60
+
+ ::CORBA::Container_ptr defined_in (
+ ACE_ENV_SINGLE_ARG_DECL_WITH_DEFAULTS
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ));
+
+ // TAO_IDL - Generated from
+ // be\be_visitor_operation/tie_sh.cpp:60
+
+ char * absolute_name (
+ ACE_ENV_SINGLE_ARG_DECL_WITH_DEFAULTS
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ));
+
+ // TAO_IDL - Generated from
+ // be\be_visitor_operation/tie_sh.cpp:60
+
+ ::CORBA::Repository_ptr containing_repository (
+ ACE_ENV_SINGLE_ARG_DECL_WITH_DEFAULTS
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ));
+
+ // TAO_IDL - Generated from
+ // be\be_visitor_operation/tie_sh.cpp:60
+
+ ::CORBA::Contained::Description * describe (
+ ACE_ENV_SINGLE_ARG_DECL_WITH_DEFAULTS
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ));
+
+ // TAO_IDL - Generated from
+ // be\be_visitor_operation/tie_sh.cpp:60
+
+ void move (
+ ::CORBA::Container_ptr new_container,
+ const char * new_name,
+ const char * new_version
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ));
+
+ // TAO_IDL - Generated from
+ // be\be_visitor_operation/tie_sh.cpp:60
+
+ ::CORBA::TypeCode_ptr type (
+ ACE_ENV_SINGLE_ARG_DECL_WITH_DEFAULTS
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ));
+
+ // TAO_IDL - Generated from
+ // be\be_visitor_operation/tie_sh.cpp:60
+
+ ::CORBA::IDLType_ptr type_def (
+ ACE_ENV_SINGLE_ARG_DECL_WITH_DEFAULTS
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ));
+
+ // TAO_IDL - Generated from
+ // be\be_visitor_operation/tie_sh.cpp:60
+
+ void type_def (
+ ::CORBA::IDLType_ptr type_def
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ));
+
+ // TAO_IDL - Generated from
+ // be\be_visitor_operation/tie_sh.cpp:60
+
+ ::CORBA::Any * value (
+ ACE_ENV_SINGLE_ARG_DECL_WITH_DEFAULTS
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ));
+
+ // TAO_IDL - Generated from
+ // be\be_visitor_operation/tie_sh.cpp:60
+
+ void value (
+ const ::CORBA::Any & value
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ));
+
+ private:
+ T *ptr_;
+ PortableServer::POA_var poa_;
+ ::CORBA::Boolean rel_;
+
+ // copy and assignment are not allowed
+ ConstantDef_tie (const ConstantDef_tie &);
+ void operator= (const ConstantDef_tie &);
+ };
+
+ // TAO_IDL - Generated from
+ // be\be_visitor_interface/tie_sh.cpp:87
+
+ // TIE class: Refer to CORBA v2.2, Section 20.34.4
+ template <class T>
+ class StructDef_tie : public StructDef
+ {
+ public:
+ /// the T& ctor
+ StructDef_tie (T &t);
+ /// ctor taking a POA
+ StructDef_tie (T &t, PortableServer::POA_ptr poa);
+ /// ctor taking pointer and an ownership flag
+ StructDef_tie (T *tp, ::CORBA::Boolean release = true);
+ /// ctor with T*, ownership flag and a POA
+ StructDef_tie (
+ T *tp,
+ PortableServer::POA_ptr poa,
+ ::CORBA::Boolean release = true
+ );
+ /// dtor
+
+ ~StructDef_tie (void);
+ // TIE specific functions
+ /// return the underlying object
+ T *_tied_object (void);
+ /// set the underlying object
+ void _tied_object (T &obj);
+ /// set the underlying object and the ownership flag
+ void _tied_object (T *obj, ::CORBA::Boolean release = true);
+ /// do we own it
+ ::CORBA::Boolean _is_owner (void);
+ /// set the ownership
+
+ void _is_owner ( ::CORBA::Boolean b);
+ // overridden ServantBase operations
+ PortableServer::POA_ptr _default_POA (
+ ACE_ENV_SINGLE_ARG_DECL_WITH_DEFAULTS
+ );
+
+ // TAO_IDL - Generated from
+ // be\be_visitor_operation/tie_sh.cpp:60
+
+ ::CORBA::DefinitionKind def_kind (
+ ACE_ENV_SINGLE_ARG_DECL_WITH_DEFAULTS
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ));
+
+ // TAO_IDL - Generated from
+ // be\be_visitor_operation/tie_sh.cpp:60
+
+ void destroy (
+ ACE_ENV_SINGLE_ARG_DECL_WITH_DEFAULTS
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ));
+
+ // TAO_IDL - Generated from
+ // be\be_visitor_operation/tie_sh.cpp:60
+
+ char * id (
+ ACE_ENV_SINGLE_ARG_DECL_WITH_DEFAULTS
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ));
+
+ // TAO_IDL - Generated from
+ // be\be_visitor_operation/tie_sh.cpp:60
+
+ void id (
+ const char * id
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ));
+
+ // TAO_IDL - Generated from
+ // be\be_visitor_operation/tie_sh.cpp:60
+
+ char * name (
+ ACE_ENV_SINGLE_ARG_DECL_WITH_DEFAULTS
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ));
+
+ // TAO_IDL - Generated from
+ // be\be_visitor_operation/tie_sh.cpp:60
+
+ void name (
+ const char * name
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ));
+
+ // TAO_IDL - Generated from
+ // be\be_visitor_operation/tie_sh.cpp:60
+
+ char * version (
+ ACE_ENV_SINGLE_ARG_DECL_WITH_DEFAULTS
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ));
+
+ // TAO_IDL - Generated from
+ // be\be_visitor_operation/tie_sh.cpp:60
+
+ void version (
+ const char * version
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ));
+
+ // TAO_IDL - Generated from
+ // be\be_visitor_operation/tie_sh.cpp:60
+
+ ::CORBA::Container_ptr defined_in (
+ ACE_ENV_SINGLE_ARG_DECL_WITH_DEFAULTS
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ));
+
+ // TAO_IDL - Generated from
+ // be\be_visitor_operation/tie_sh.cpp:60
+
+ char * absolute_name (
+ ACE_ENV_SINGLE_ARG_DECL_WITH_DEFAULTS
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ));
+
+ // TAO_IDL - Generated from
+ // be\be_visitor_operation/tie_sh.cpp:60
+
+ ::CORBA::Repository_ptr containing_repository (
+ ACE_ENV_SINGLE_ARG_DECL_WITH_DEFAULTS
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ));
+
+ // TAO_IDL - Generated from
+ // be\be_visitor_operation/tie_sh.cpp:60
+
+ ::CORBA::Contained::Description * describe (
+ ACE_ENV_SINGLE_ARG_DECL_WITH_DEFAULTS
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ));
+
+ // TAO_IDL - Generated from
+ // be\be_visitor_operation/tie_sh.cpp:60
+
+ void move (
+ ::CORBA::Container_ptr new_container,
+ const char * new_name,
+ const char * new_version
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ));
+
+ // TAO_IDL - Generated from
+ // be\be_visitor_operation/tie_sh.cpp:60
+
+ ::CORBA::TypeCode_ptr type (
+ ACE_ENV_SINGLE_ARG_DECL_WITH_DEFAULTS
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ));
+
+ // TAO_IDL - Generated from
+ // be\be_visitor_operation/tie_sh.cpp:60
+
+ ::CORBA::Contained_ptr lookup (
+ const char * search_name
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ));
+
+ // TAO_IDL - Generated from
+ // be\be_visitor_operation/tie_sh.cpp:60
+
+ ::CORBA::ContainedSeq * contents (
+ ::CORBA::DefinitionKind limit_type,
+ ::CORBA::Boolean exclude_inherited
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ));
+
+ // TAO_IDL - Generated from
+ // be\be_visitor_operation/tie_sh.cpp:60
+
+ ::CORBA::ContainedSeq * lookup_name (
+ const char * search_name,
+ ::CORBA::Long levels_to_search,
+ ::CORBA::DefinitionKind limit_type,
+ ::CORBA::Boolean exclude_inherited
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ));
+
+ // TAO_IDL - Generated from
+ // be\be_visitor_operation/tie_sh.cpp:60
+
+ ::CORBA::Container::DescriptionSeq * describe_contents (
+ ::CORBA::DefinitionKind limit_type,
+ ::CORBA::Boolean exclude_inherited,
+ ::CORBA::Long max_returned_objs
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ));
+
+ // TAO_IDL - Generated from
+ // be\be_visitor_operation/tie_sh.cpp:60
+
+ ::CORBA::ModuleDef_ptr create_module (
+ const char * id,
+ const char * name,
+ const char * version
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ));
+
+ // TAO_IDL - Generated from
+ // be\be_visitor_operation/tie_sh.cpp:60
+
+ ::CORBA::ConstantDef_ptr create_constant (
+ const char * id,
+ const char * name,
+ const char * version,
+ ::CORBA::IDLType_ptr type,
+ const ::CORBA::Any & value
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ));
+
+ // TAO_IDL - Generated from
+ // be\be_visitor_operation/tie_sh.cpp:60
+
+ ::CORBA::StructDef_ptr create_struct (
+ const char * id,
+ const char * name,
+ const char * version,
+ const ::CORBA::StructMemberSeq & members
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ));
+
+ // TAO_IDL - Generated from
+ // be\be_visitor_operation/tie_sh.cpp:60
+
+ ::CORBA::UnionDef_ptr create_union (
+ const char * id,
+ const char * name,
+ const char * version,
+ ::CORBA::IDLType_ptr discriminator_type,
+ const ::CORBA::UnionMemberSeq & members
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ));
+
+ // TAO_IDL - Generated from
+ // be\be_visitor_operation/tie_sh.cpp:60
+
+ ::CORBA::EnumDef_ptr create_enum (
+ const char * id,
+ const char * name,
+ const char * version,
+ const ::CORBA::EnumMemberSeq & members
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ));
+
+ // TAO_IDL - Generated from
+ // be\be_visitor_operation/tie_sh.cpp:60
+
+ ::CORBA::AliasDef_ptr create_alias (
+ const char * id,
+ const char * name,
+ const char * version,
+ ::CORBA::IDLType_ptr original_type
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ));
+
+ // TAO_IDL - Generated from
+ // be\be_visitor_operation/tie_sh.cpp:60
+
+ ::CORBA::InterfaceDef_ptr create_interface (
+ const char * id,
+ const char * name,
+ const char * version,
+ const ::CORBA::InterfaceDefSeq & base_interfaces
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ));
+
+ // TAO_IDL - Generated from
+ // be\be_visitor_operation/tie_sh.cpp:60
+
+ ::CORBA::ValueDef_ptr create_value (
+ const char * id,
+ const char * name,
+ const char * version,
+ ::CORBA::Boolean is_custom,
+ ::CORBA::Boolean is_abstract,
+ ::CORBA::ValueDef_ptr base_value,
+ ::CORBA::Boolean is_truncatable,
+ const ::CORBA::ValueDefSeq & abstract_base_values,
+ const ::CORBA::InterfaceDefSeq & supported_interfaces,
+ const ::CORBA::InitializerSeq & initializers
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ));
+
+ // TAO_IDL - Generated from
+ // be\be_visitor_operation/tie_sh.cpp:60
+
+ ::CORBA::ValueBoxDef_ptr create_value_box (
+ const char * id,
+ const char * name,
+ const char * version,
+ ::CORBA::IDLType_ptr original_type_def
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ));
+
+ // TAO_IDL - Generated from
+ // be\be_visitor_operation/tie_sh.cpp:60
+
+ ::CORBA::ExceptionDef_ptr create_exception (
+ const char * id,
+ const char * name,
+ const char * version,
+ const ::CORBA::StructMemberSeq & members
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ));
+
+ // TAO_IDL - Generated from
+ // be\be_visitor_operation/tie_sh.cpp:60
+
+ ::CORBA::NativeDef_ptr create_native (
+ const char * id,
+ const char * name,
+ const char * version
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ));
+
+ // TAO_IDL - Generated from
+ // be\be_visitor_operation/tie_sh.cpp:60
+
+ ::CORBA::AbstractInterfaceDef_ptr create_abstract_interface (
+ const char * id,
+ const char * name,
+ const char * version,
+ const ::CORBA::AbstractInterfaceDefSeq & base_interfaces
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ));
+
+ // TAO_IDL - Generated from
+ // be\be_visitor_operation/tie_sh.cpp:60
+
+ ::CORBA::LocalInterfaceDef_ptr create_local_interface (
+ const char * id,
+ const char * name,
+ const char * version,
+ const ::CORBA::InterfaceDefSeq & base_interfaces
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ));
+
+ // TAO_IDL - Generated from
+ // be\be_visitor_operation/tie_sh.cpp:60
+
+ ::CORBA::ExtValueDef_ptr create_ext_value (
+ const char * id,
+ const char * name,
+ const char * version,
+ ::CORBA::Boolean is_custom,
+ ::CORBA::Boolean is_abstract,
+ ::CORBA::ValueDef_ptr base_value,
+ ::CORBA::Boolean is_truncatable,
+ const ::CORBA::ValueDefSeq & abstract_base_values,
+ const ::CORBA::InterfaceDefSeq & supported_interfaces,
+ const ::CORBA::ExtInitializerSeq & initializers
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ));
+
+ // TAO_IDL - Generated from
+ // be\be_visitor_operation/tie_sh.cpp:60
+
+ ::CORBA::StructMemberSeq * members (
+ ACE_ENV_SINGLE_ARG_DECL_WITH_DEFAULTS
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ));
+
+ // TAO_IDL - Generated from
+ // be\be_visitor_operation/tie_sh.cpp:60
+
+ void members (
+ const ::CORBA::StructMemberSeq & members
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ));
+
+ private:
+ T *ptr_;
+ PortableServer::POA_var poa_;
+ ::CORBA::Boolean rel_;
+
+ // copy and assignment are not allowed
+ StructDef_tie (const StructDef_tie &);
+ void operator= (const StructDef_tie &);
+ };
+
+ // TAO_IDL - Generated from
+ // be\be_visitor_interface/tie_sh.cpp:87
+
+ // TIE class: Refer to CORBA v2.2, Section 20.34.4
+ template <class T>
+ class UnionDef_tie : public UnionDef
+ {
+ public:
+ /// the T& ctor
+ UnionDef_tie (T &t);
+ /// ctor taking a POA
+ UnionDef_tie (T &t, PortableServer::POA_ptr poa);
+ /// ctor taking pointer and an ownership flag
+ UnionDef_tie (T *tp, ::CORBA::Boolean release = true);
+ /// ctor with T*, ownership flag and a POA
+ UnionDef_tie (
+ T *tp,
+ PortableServer::POA_ptr poa,
+ ::CORBA::Boolean release = true
+ );
+ /// dtor
+
+ ~UnionDef_tie (void);
+ // TIE specific functions
+ /// return the underlying object
+ T *_tied_object (void);
+ /// set the underlying object
+ void _tied_object (T &obj);
+ /// set the underlying object and the ownership flag
+ void _tied_object (T *obj, ::CORBA::Boolean release = true);
+ /// do we own it
+ ::CORBA::Boolean _is_owner (void);
+ /// set the ownership
+
+ void _is_owner ( ::CORBA::Boolean b);
+ // overridden ServantBase operations
+ PortableServer::POA_ptr _default_POA (
+ ACE_ENV_SINGLE_ARG_DECL_WITH_DEFAULTS
+ );
+
+ // TAO_IDL - Generated from
+ // be\be_visitor_operation/tie_sh.cpp:60
+
+ ::CORBA::DefinitionKind def_kind (
+ ACE_ENV_SINGLE_ARG_DECL_WITH_DEFAULTS
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ));
+
+ // TAO_IDL - Generated from
+ // be\be_visitor_operation/tie_sh.cpp:60
+
+ void destroy (
+ ACE_ENV_SINGLE_ARG_DECL_WITH_DEFAULTS
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ));
+
+ // TAO_IDL - Generated from
+ // be\be_visitor_operation/tie_sh.cpp:60
+
+ char * id (
+ ACE_ENV_SINGLE_ARG_DECL_WITH_DEFAULTS
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ));
+
+ // TAO_IDL - Generated from
+ // be\be_visitor_operation/tie_sh.cpp:60
+
+ void id (
+ const char * id
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ));
+
+ // TAO_IDL - Generated from
+ // be\be_visitor_operation/tie_sh.cpp:60
+
+ char * name (
+ ACE_ENV_SINGLE_ARG_DECL_WITH_DEFAULTS
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ));
+
+ // TAO_IDL - Generated from
+ // be\be_visitor_operation/tie_sh.cpp:60
+
+ void name (
+ const char * name
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ));
+
+ // TAO_IDL - Generated from
+ // be\be_visitor_operation/tie_sh.cpp:60
+
+ char * version (
+ ACE_ENV_SINGLE_ARG_DECL_WITH_DEFAULTS
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ));
+
+ // TAO_IDL - Generated from
+ // be\be_visitor_operation/tie_sh.cpp:60
+
+ void version (
+ const char * version
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ));
+
+ // TAO_IDL - Generated from
+ // be\be_visitor_operation/tie_sh.cpp:60
+
+ ::CORBA::Container_ptr defined_in (
+ ACE_ENV_SINGLE_ARG_DECL_WITH_DEFAULTS
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ));
+
+ // TAO_IDL - Generated from
+ // be\be_visitor_operation/tie_sh.cpp:60
+
+ char * absolute_name (
+ ACE_ENV_SINGLE_ARG_DECL_WITH_DEFAULTS
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ));
+
+ // TAO_IDL - Generated from
+ // be\be_visitor_operation/tie_sh.cpp:60
+
+ ::CORBA::Repository_ptr containing_repository (
+ ACE_ENV_SINGLE_ARG_DECL_WITH_DEFAULTS
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ));
+
+ // TAO_IDL - Generated from
+ // be\be_visitor_operation/tie_sh.cpp:60
+
+ ::CORBA::Contained::Description * describe (
+ ACE_ENV_SINGLE_ARG_DECL_WITH_DEFAULTS
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ));
+
+ // TAO_IDL - Generated from
+ // be\be_visitor_operation/tie_sh.cpp:60
+
+ void move (
+ ::CORBA::Container_ptr new_container,
+ const char * new_name,
+ const char * new_version
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ));
+
+ // TAO_IDL - Generated from
+ // be\be_visitor_operation/tie_sh.cpp:60
+
+ ::CORBA::TypeCode_ptr type (
+ ACE_ENV_SINGLE_ARG_DECL_WITH_DEFAULTS
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ));
+
+ // TAO_IDL - Generated from
+ // be\be_visitor_operation/tie_sh.cpp:60
+
+ ::CORBA::Contained_ptr lookup (
+ const char * search_name
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ));
+
+ // TAO_IDL - Generated from
+ // be\be_visitor_operation/tie_sh.cpp:60
+
+ ::CORBA::ContainedSeq * contents (
+ ::CORBA::DefinitionKind limit_type,
+ ::CORBA::Boolean exclude_inherited
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ));
+
+ // TAO_IDL - Generated from
+ // be\be_visitor_operation/tie_sh.cpp:60
+
+ ::CORBA::ContainedSeq * lookup_name (
+ const char * search_name,
+ ::CORBA::Long levels_to_search,
+ ::CORBA::DefinitionKind limit_type,
+ ::CORBA::Boolean exclude_inherited
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ));
+
+ // TAO_IDL - Generated from
+ // be\be_visitor_operation/tie_sh.cpp:60
+
+ ::CORBA::Container::DescriptionSeq * describe_contents (
+ ::CORBA::DefinitionKind limit_type,
+ ::CORBA::Boolean exclude_inherited,
+ ::CORBA::Long max_returned_objs
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ));
+
+ // TAO_IDL - Generated from
+ // be\be_visitor_operation/tie_sh.cpp:60
+
+ ::CORBA::ModuleDef_ptr create_module (
+ const char * id,
+ const char * name,
+ const char * version
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ));
+
+ // TAO_IDL - Generated from
+ // be\be_visitor_operation/tie_sh.cpp:60
+
+ ::CORBA::ConstantDef_ptr create_constant (
+ const char * id,
+ const char * name,
+ const char * version,
+ ::CORBA::IDLType_ptr type,
+ const ::CORBA::Any & value
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ));
+
+ // TAO_IDL - Generated from
+ // be\be_visitor_operation/tie_sh.cpp:60
+
+ ::CORBA::StructDef_ptr create_struct (
+ const char * id,
+ const char * name,
+ const char * version,
+ const ::CORBA::StructMemberSeq & members
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ));
+
+ // TAO_IDL - Generated from
+ // be\be_visitor_operation/tie_sh.cpp:60
+
+ ::CORBA::UnionDef_ptr create_union (
+ const char * id,
+ const char * name,
+ const char * version,
+ ::CORBA::IDLType_ptr discriminator_type,
+ const ::CORBA::UnionMemberSeq & members
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ));
+
+ // TAO_IDL - Generated from
+ // be\be_visitor_operation/tie_sh.cpp:60
+
+ ::CORBA::EnumDef_ptr create_enum (
+ const char * id,
+ const char * name,
+ const char * version,
+ const ::CORBA::EnumMemberSeq & members
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ));
+
+ // TAO_IDL - Generated from
+ // be\be_visitor_operation/tie_sh.cpp:60
+
+ ::CORBA::AliasDef_ptr create_alias (
+ const char * id,
+ const char * name,
+ const char * version,
+ ::CORBA::IDLType_ptr original_type
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ));
+
+ // TAO_IDL - Generated from
+ // be\be_visitor_operation/tie_sh.cpp:60
+
+ ::CORBA::InterfaceDef_ptr create_interface (
+ const char * id,
+ const char * name,
+ const char * version,
+ const ::CORBA::InterfaceDefSeq & base_interfaces
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ));
+
+ // TAO_IDL - Generated from
+ // be\be_visitor_operation/tie_sh.cpp:60
+
+ ::CORBA::ValueDef_ptr create_value (
+ const char * id,
+ const char * name,
+ const char * version,
+ ::CORBA::Boolean is_custom,
+ ::CORBA::Boolean is_abstract,
+ ::CORBA::ValueDef_ptr base_value,
+ ::CORBA::Boolean is_truncatable,
+ const ::CORBA::ValueDefSeq & abstract_base_values,
+ const ::CORBA::InterfaceDefSeq & supported_interfaces,
+ const ::CORBA::InitializerSeq & initializers
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ));
+
+ // TAO_IDL - Generated from
+ // be\be_visitor_operation/tie_sh.cpp:60
+
+ ::CORBA::ValueBoxDef_ptr create_value_box (
+ const char * id,
+ const char * name,
+ const char * version,
+ ::CORBA::IDLType_ptr original_type_def
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ));
+
+ // TAO_IDL - Generated from
+ // be\be_visitor_operation/tie_sh.cpp:60
+
+ ::CORBA::ExceptionDef_ptr create_exception (
+ const char * id,
+ const char * name,
+ const char * version,
+ const ::CORBA::StructMemberSeq & members
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ));
+
+ // TAO_IDL - Generated from
+ // be\be_visitor_operation/tie_sh.cpp:60
+
+ ::CORBA::NativeDef_ptr create_native (
+ const char * id,
+ const char * name,
+ const char * version
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ));
+
+ // TAO_IDL - Generated from
+ // be\be_visitor_operation/tie_sh.cpp:60
+
+ ::CORBA::AbstractInterfaceDef_ptr create_abstract_interface (
+ const char * id,
+ const char * name,
+ const char * version,
+ const ::CORBA::AbstractInterfaceDefSeq & base_interfaces
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ));
+
+ // TAO_IDL - Generated from
+ // be\be_visitor_operation/tie_sh.cpp:60
+
+ ::CORBA::LocalInterfaceDef_ptr create_local_interface (
+ const char * id,
+ const char * name,
+ const char * version,
+ const ::CORBA::InterfaceDefSeq & base_interfaces
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ));
+
+ // TAO_IDL - Generated from
+ // be\be_visitor_operation/tie_sh.cpp:60
+
+ ::CORBA::ExtValueDef_ptr create_ext_value (
+ const char * id,
+ const char * name,
+ const char * version,
+ ::CORBA::Boolean is_custom,
+ ::CORBA::Boolean is_abstract,
+ ::CORBA::ValueDef_ptr base_value,
+ ::CORBA::Boolean is_truncatable,
+ const ::CORBA::ValueDefSeq & abstract_base_values,
+ const ::CORBA::InterfaceDefSeq & supported_interfaces,
+ const ::CORBA::ExtInitializerSeq & initializers
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ));
+
+ // TAO_IDL - Generated from
+ // be\be_visitor_operation/tie_sh.cpp:60
+
+ ::CORBA::TypeCode_ptr discriminator_type (
+ ACE_ENV_SINGLE_ARG_DECL_WITH_DEFAULTS
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ));
+
+ // TAO_IDL - Generated from
+ // be\be_visitor_operation/tie_sh.cpp:60
+
+ ::CORBA::IDLType_ptr discriminator_type_def (
+ ACE_ENV_SINGLE_ARG_DECL_WITH_DEFAULTS
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ));
+
+ // TAO_IDL - Generated from
+ // be\be_visitor_operation/tie_sh.cpp:60
+
+ void discriminator_type_def (
+ ::CORBA::IDLType_ptr discriminator_type_def
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ));
+
+ // TAO_IDL - Generated from
+ // be\be_visitor_operation/tie_sh.cpp:60
+
+ ::CORBA::UnionMemberSeq * members (
+ ACE_ENV_SINGLE_ARG_DECL_WITH_DEFAULTS
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ));
+
+ // TAO_IDL - Generated from
+ // be\be_visitor_operation/tie_sh.cpp:60
+
+ void members (
+ const ::CORBA::UnionMemberSeq & members
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ));
+
+ private:
+ T *ptr_;
+ PortableServer::POA_var poa_;
+ ::CORBA::Boolean rel_;
+
+ // copy and assignment are not allowed
+ UnionDef_tie (const UnionDef_tie &);
+ void operator= (const UnionDef_tie &);
+ };
+
+ // TAO_IDL - Generated from
+ // be\be_visitor_interface/tie_sh.cpp:87
+
+ // TIE class: Refer to CORBA v2.2, Section 20.34.4
+ template <class T>
+ class EnumDef_tie : public EnumDef
+ {
+ public:
+ /// the T& ctor
+ EnumDef_tie (T &t);
+ /// ctor taking a POA
+ EnumDef_tie (T &t, PortableServer::POA_ptr poa);
+ /// ctor taking pointer and an ownership flag
+ EnumDef_tie (T *tp, ::CORBA::Boolean release = true);
+ /// ctor with T*, ownership flag and a POA
+ EnumDef_tie (
+ T *tp,
+ PortableServer::POA_ptr poa,
+ ::CORBA::Boolean release = true
+ );
+ /// dtor
+
+ ~EnumDef_tie (void);
+ // TIE specific functions
+ /// return the underlying object
+ T *_tied_object (void);
+ /// set the underlying object
+ void _tied_object (T &obj);
+ /// set the underlying object and the ownership flag
+ void _tied_object (T *obj, ::CORBA::Boolean release = true);
+ /// do we own it
+ ::CORBA::Boolean _is_owner (void);
+ /// set the ownership
+
+ void _is_owner ( ::CORBA::Boolean b);
+ // overridden ServantBase operations
+ PortableServer::POA_ptr _default_POA (
+ ACE_ENV_SINGLE_ARG_DECL_WITH_DEFAULTS
+ );
+
+ // TAO_IDL - Generated from
+ // be\be_visitor_operation/tie_sh.cpp:60
+
+ ::CORBA::DefinitionKind def_kind (
+ ACE_ENV_SINGLE_ARG_DECL_WITH_DEFAULTS
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ));
+
+ // TAO_IDL - Generated from
+ // be\be_visitor_operation/tie_sh.cpp:60
+
+ void destroy (
+ ACE_ENV_SINGLE_ARG_DECL_WITH_DEFAULTS
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ));
+
+ // TAO_IDL - Generated from
+ // be\be_visitor_operation/tie_sh.cpp:60
+
+ char * id (
+ ACE_ENV_SINGLE_ARG_DECL_WITH_DEFAULTS
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ));
+
+ // TAO_IDL - Generated from
+ // be\be_visitor_operation/tie_sh.cpp:60
+
+ void id (
+ const char * id
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ));
+
+ // TAO_IDL - Generated from
+ // be\be_visitor_operation/tie_sh.cpp:60
+
+ char * name (
+ ACE_ENV_SINGLE_ARG_DECL_WITH_DEFAULTS
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ));
+
+ // TAO_IDL - Generated from
+ // be\be_visitor_operation/tie_sh.cpp:60
+
+ void name (
+ const char * name
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ));
+
+ // TAO_IDL - Generated from
+ // be\be_visitor_operation/tie_sh.cpp:60
+
+ char * version (
+ ACE_ENV_SINGLE_ARG_DECL_WITH_DEFAULTS
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ));
+
+ // TAO_IDL - Generated from
+ // be\be_visitor_operation/tie_sh.cpp:60
+
+ void version (
+ const char * version
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ));
+
+ // TAO_IDL - Generated from
+ // be\be_visitor_operation/tie_sh.cpp:60
+
+ ::CORBA::Container_ptr defined_in (
+ ACE_ENV_SINGLE_ARG_DECL_WITH_DEFAULTS
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ));
+
+ // TAO_IDL - Generated from
+ // be\be_visitor_operation/tie_sh.cpp:60
+
+ char * absolute_name (
+ ACE_ENV_SINGLE_ARG_DECL_WITH_DEFAULTS
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ));
+
+ // TAO_IDL - Generated from
+ // be\be_visitor_operation/tie_sh.cpp:60
+
+ ::CORBA::Repository_ptr containing_repository (
+ ACE_ENV_SINGLE_ARG_DECL_WITH_DEFAULTS
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ));
+
+ // TAO_IDL - Generated from
+ // be\be_visitor_operation/tie_sh.cpp:60
+
+ ::CORBA::Contained::Description * describe (
+ ACE_ENV_SINGLE_ARG_DECL_WITH_DEFAULTS
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ));
+
+ // TAO_IDL - Generated from
+ // be\be_visitor_operation/tie_sh.cpp:60
+
+ void move (
+ ::CORBA::Container_ptr new_container,
+ const char * new_name,
+ const char * new_version
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ));
+
+ // TAO_IDL - Generated from
+ // be\be_visitor_operation/tie_sh.cpp:60
+
+ ::CORBA::TypeCode_ptr type (
+ ACE_ENV_SINGLE_ARG_DECL_WITH_DEFAULTS
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ));
+
+ // TAO_IDL - Generated from
+ // be\be_visitor_operation/tie_sh.cpp:60
+
+ ::CORBA::EnumMemberSeq * members (
+ ACE_ENV_SINGLE_ARG_DECL_WITH_DEFAULTS
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ));
+
+ // TAO_IDL - Generated from
+ // be\be_visitor_operation/tie_sh.cpp:60
+
+ void members (
+ const ::CORBA::EnumMemberSeq & members
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ));
+
+ private:
+ T *ptr_;
+ PortableServer::POA_var poa_;
+ ::CORBA::Boolean rel_;
+
+ // copy and assignment are not allowed
+ EnumDef_tie (const EnumDef_tie &);
+ void operator= (const EnumDef_tie &);
+ };
+
+ // TAO_IDL - Generated from
+ // be\be_visitor_interface/tie_sh.cpp:87
+
+ // TIE class: Refer to CORBA v2.2, Section 20.34.4
+ template <class T>
+ class AliasDef_tie : public AliasDef
+ {
+ public:
+ /// the T& ctor
+ AliasDef_tie (T &t);
+ /// ctor taking a POA
+ AliasDef_tie (T &t, PortableServer::POA_ptr poa);
+ /// ctor taking pointer and an ownership flag
+ AliasDef_tie (T *tp, ::CORBA::Boolean release = true);
+ /// ctor with T*, ownership flag and a POA
+ AliasDef_tie (
+ T *tp,
+ PortableServer::POA_ptr poa,
+ ::CORBA::Boolean release = true
+ );
+ /// dtor
+
+ ~AliasDef_tie (void);
+ // TIE specific functions
+ /// return the underlying object
+ T *_tied_object (void);
+ /// set the underlying object
+ void _tied_object (T &obj);
+ /// set the underlying object and the ownership flag
+ void _tied_object (T *obj, ::CORBA::Boolean release = true);
+ /// do we own it
+ ::CORBA::Boolean _is_owner (void);
+ /// set the ownership
+
+ void _is_owner ( ::CORBA::Boolean b);
+ // overridden ServantBase operations
+ PortableServer::POA_ptr _default_POA (
+ ACE_ENV_SINGLE_ARG_DECL_WITH_DEFAULTS
+ );
+
+ // TAO_IDL - Generated from
+ // be\be_visitor_operation/tie_sh.cpp:60
+
+ ::CORBA::DefinitionKind def_kind (
+ ACE_ENV_SINGLE_ARG_DECL_WITH_DEFAULTS
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ));
+
+ // TAO_IDL - Generated from
+ // be\be_visitor_operation/tie_sh.cpp:60
+
+ void destroy (
+ ACE_ENV_SINGLE_ARG_DECL_WITH_DEFAULTS
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ));
+
+ // TAO_IDL - Generated from
+ // be\be_visitor_operation/tie_sh.cpp:60
+
+ char * id (
+ ACE_ENV_SINGLE_ARG_DECL_WITH_DEFAULTS
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ));
+
+ // TAO_IDL - Generated from
+ // be\be_visitor_operation/tie_sh.cpp:60
+
+ void id (
+ const char * id
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ));
+
+ // TAO_IDL - Generated from
+ // be\be_visitor_operation/tie_sh.cpp:60
+
+ char * name (
+ ACE_ENV_SINGLE_ARG_DECL_WITH_DEFAULTS
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ));
+
+ // TAO_IDL - Generated from
+ // be\be_visitor_operation/tie_sh.cpp:60
+
+ void name (
+ const char * name
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ));
+
+ // TAO_IDL - Generated from
+ // be\be_visitor_operation/tie_sh.cpp:60
+
+ char * version (
+ ACE_ENV_SINGLE_ARG_DECL_WITH_DEFAULTS
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ));
+
+ // TAO_IDL - Generated from
+ // be\be_visitor_operation/tie_sh.cpp:60
+
+ void version (
+ const char * version
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ));
+
+ // TAO_IDL - Generated from
+ // be\be_visitor_operation/tie_sh.cpp:60
+
+ ::CORBA::Container_ptr defined_in (
+ ACE_ENV_SINGLE_ARG_DECL_WITH_DEFAULTS
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ));
+
+ // TAO_IDL - Generated from
+ // be\be_visitor_operation/tie_sh.cpp:60
+
+ char * absolute_name (
+ ACE_ENV_SINGLE_ARG_DECL_WITH_DEFAULTS
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ));
+
+ // TAO_IDL - Generated from
+ // be\be_visitor_operation/tie_sh.cpp:60
+
+ ::CORBA::Repository_ptr containing_repository (
+ ACE_ENV_SINGLE_ARG_DECL_WITH_DEFAULTS
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ));
+
+ // TAO_IDL - Generated from
+ // be\be_visitor_operation/tie_sh.cpp:60
+
+ ::CORBA::Contained::Description * describe (
+ ACE_ENV_SINGLE_ARG_DECL_WITH_DEFAULTS
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ));
+
+ // TAO_IDL - Generated from
+ // be\be_visitor_operation/tie_sh.cpp:60
+
+ void move (
+ ::CORBA::Container_ptr new_container,
+ const char * new_name,
+ const char * new_version
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ));
+
+ // TAO_IDL - Generated from
+ // be\be_visitor_operation/tie_sh.cpp:60
+
+ ::CORBA::TypeCode_ptr type (
+ ACE_ENV_SINGLE_ARG_DECL_WITH_DEFAULTS
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ));
+
+ // TAO_IDL - Generated from
+ // be\be_visitor_operation/tie_sh.cpp:60
+
+ ::CORBA::IDLType_ptr original_type_def (
+ ACE_ENV_SINGLE_ARG_DECL_WITH_DEFAULTS
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ));
+
+ // TAO_IDL - Generated from
+ // be\be_visitor_operation/tie_sh.cpp:60
+
+ void original_type_def (
+ ::CORBA::IDLType_ptr original_type_def
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ));
+
+ private:
+ T *ptr_;
+ PortableServer::POA_var poa_;
+ ::CORBA::Boolean rel_;
+
+ // copy and assignment are not allowed
+ AliasDef_tie (const AliasDef_tie &);
+ void operator= (const AliasDef_tie &);
+ };
+
+ // TAO_IDL - Generated from
+ // be\be_visitor_interface/tie_sh.cpp:87
+
+ // TIE class: Refer to CORBA v2.2, Section 20.34.4
+ template <class T>
+ class NativeDef_tie : public NativeDef
+ {
+ public:
+ /// the T& ctor
+ NativeDef_tie (T &t);
+ /// ctor taking a POA
+ NativeDef_tie (T &t, PortableServer::POA_ptr poa);
+ /// ctor taking pointer and an ownership flag
+ NativeDef_tie (T *tp, ::CORBA::Boolean release = true);
+ /// ctor with T*, ownership flag and a POA
+ NativeDef_tie (
+ T *tp,
+ PortableServer::POA_ptr poa,
+ ::CORBA::Boolean release = true
+ );
+ /// dtor
+
+ ~NativeDef_tie (void);
+ // TIE specific functions
+ /// return the underlying object
+ T *_tied_object (void);
+ /// set the underlying object
+ void _tied_object (T &obj);
+ /// set the underlying object and the ownership flag
+ void _tied_object (T *obj, ::CORBA::Boolean release = true);
+ /// do we own it
+ ::CORBA::Boolean _is_owner (void);
+ /// set the ownership
+
+ void _is_owner ( ::CORBA::Boolean b);
+ // overridden ServantBase operations
+ PortableServer::POA_ptr _default_POA (
+ ACE_ENV_SINGLE_ARG_DECL_WITH_DEFAULTS
+ );
+
+ // TAO_IDL - Generated from
+ // be\be_visitor_operation/tie_sh.cpp:60
+
+ ::CORBA::DefinitionKind def_kind (
+ ACE_ENV_SINGLE_ARG_DECL_WITH_DEFAULTS
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ));
+
+ // TAO_IDL - Generated from
+ // be\be_visitor_operation/tie_sh.cpp:60
+
+ void destroy (
+ ACE_ENV_SINGLE_ARG_DECL_WITH_DEFAULTS
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ));
+
+ // TAO_IDL - Generated from
+ // be\be_visitor_operation/tie_sh.cpp:60
+
+ char * id (
+ ACE_ENV_SINGLE_ARG_DECL_WITH_DEFAULTS
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ));
+
+ // TAO_IDL - Generated from
+ // be\be_visitor_operation/tie_sh.cpp:60
+
+ void id (
+ const char * id
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ));
+
+ // TAO_IDL - Generated from
+ // be\be_visitor_operation/tie_sh.cpp:60
+
+ char * name (
+ ACE_ENV_SINGLE_ARG_DECL_WITH_DEFAULTS
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ));
+
+ // TAO_IDL - Generated from
+ // be\be_visitor_operation/tie_sh.cpp:60
+
+ void name (
+ const char * name
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ));
+
+ // TAO_IDL - Generated from
+ // be\be_visitor_operation/tie_sh.cpp:60
+
+ char * version (
+ ACE_ENV_SINGLE_ARG_DECL_WITH_DEFAULTS
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ));
+
+ // TAO_IDL - Generated from
+ // be\be_visitor_operation/tie_sh.cpp:60
+
+ void version (
+ const char * version
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ));
+
+ // TAO_IDL - Generated from
+ // be\be_visitor_operation/tie_sh.cpp:60
+
+ ::CORBA::Container_ptr defined_in (
+ ACE_ENV_SINGLE_ARG_DECL_WITH_DEFAULTS
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ));
+
+ // TAO_IDL - Generated from
+ // be\be_visitor_operation/tie_sh.cpp:60
+
+ char * absolute_name (
+ ACE_ENV_SINGLE_ARG_DECL_WITH_DEFAULTS
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ));
+
+ // TAO_IDL - Generated from
+ // be\be_visitor_operation/tie_sh.cpp:60
+
+ ::CORBA::Repository_ptr containing_repository (
+ ACE_ENV_SINGLE_ARG_DECL_WITH_DEFAULTS
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ));
+
+ // TAO_IDL - Generated from
+ // be\be_visitor_operation/tie_sh.cpp:60
+
+ ::CORBA::Contained::Description * describe (
+ ACE_ENV_SINGLE_ARG_DECL_WITH_DEFAULTS
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ));
+
+ // TAO_IDL - Generated from
+ // be\be_visitor_operation/tie_sh.cpp:60
+
+ void move (
+ ::CORBA::Container_ptr new_container,
+ const char * new_name,
+ const char * new_version
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ));
+
+ // TAO_IDL - Generated from
+ // be\be_visitor_operation/tie_sh.cpp:60
+
+ ::CORBA::TypeCode_ptr type (
+ ACE_ENV_SINGLE_ARG_DECL_WITH_DEFAULTS
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ));
+
+ private:
+ T *ptr_;
+ PortableServer::POA_var poa_;
+ ::CORBA::Boolean rel_;
+
+ // copy and assignment are not allowed
+ NativeDef_tie (const NativeDef_tie &);
+ void operator= (const NativeDef_tie &);
+ };
+
+ // TAO_IDL - Generated from
+ // be\be_visitor_interface/tie_sh.cpp:87
+
+ // TIE class: Refer to CORBA v2.2, Section 20.34.4
+ template <class T>
+ class PrimitiveDef_tie : public PrimitiveDef
+ {
+ public:
+ /// the T& ctor
+ PrimitiveDef_tie (T &t);
+ /// ctor taking a POA
+ PrimitiveDef_tie (T &t, PortableServer::POA_ptr poa);
+ /// ctor taking pointer and an ownership flag
+ PrimitiveDef_tie (T *tp, ::CORBA::Boolean release = true);
+ /// ctor with T*, ownership flag and a POA
+ PrimitiveDef_tie (
+ T *tp,
+ PortableServer::POA_ptr poa,
+ ::CORBA::Boolean release = true
+ );
+ /// dtor
+
+ ~PrimitiveDef_tie (void);
+ // TIE specific functions
+ /// return the underlying object
+ T *_tied_object (void);
+ /// set the underlying object
+ void _tied_object (T &obj);
+ /// set the underlying object and the ownership flag
+ void _tied_object (T *obj, ::CORBA::Boolean release = true);
+ /// do we own it
+ ::CORBA::Boolean _is_owner (void);
+ /// set the ownership
+
+ void _is_owner ( ::CORBA::Boolean b);
+ // overridden ServantBase operations
+ PortableServer::POA_ptr _default_POA (
+ ACE_ENV_SINGLE_ARG_DECL_WITH_DEFAULTS
+ );
+
+ // TAO_IDL - Generated from
+ // be\be_visitor_operation/tie_sh.cpp:60
+
+ ::CORBA::DefinitionKind def_kind (
+ ACE_ENV_SINGLE_ARG_DECL_WITH_DEFAULTS
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ));
+
+ // TAO_IDL - Generated from
+ // be\be_visitor_operation/tie_sh.cpp:60
+
+ void destroy (
+ ACE_ENV_SINGLE_ARG_DECL_WITH_DEFAULTS
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ));
+
+ // TAO_IDL - Generated from
+ // be\be_visitor_operation/tie_sh.cpp:60
+
+ ::CORBA::TypeCode_ptr type (
+ ACE_ENV_SINGLE_ARG_DECL_WITH_DEFAULTS
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ));
+
+ // TAO_IDL - Generated from
+ // be\be_visitor_operation/tie_sh.cpp:60
+
+ ::CORBA::PrimitiveKind kind (
+ ACE_ENV_SINGLE_ARG_DECL_WITH_DEFAULTS
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ));
+
+ private:
+ T *ptr_;
+ PortableServer::POA_var poa_;
+ ::CORBA::Boolean rel_;
+
+ // copy and assignment are not allowed
+ PrimitiveDef_tie (const PrimitiveDef_tie &);
+ void operator= (const PrimitiveDef_tie &);
+ };
+
+ // TAO_IDL - Generated from
+ // be\be_visitor_interface/tie_sh.cpp:87
+
+ // TIE class: Refer to CORBA v2.2, Section 20.34.4
+ template <class T>
+ class StringDef_tie : public StringDef
+ {
+ public:
+ /// the T& ctor
+ StringDef_tie (T &t);
+ /// ctor taking a POA
+ StringDef_tie (T &t, PortableServer::POA_ptr poa);
+ /// ctor taking pointer and an ownership flag
+ StringDef_tie (T *tp, ::CORBA::Boolean release = true);
+ /// ctor with T*, ownership flag and a POA
+ StringDef_tie (
+ T *tp,
+ PortableServer::POA_ptr poa,
+ ::CORBA::Boolean release = true
+ );
+ /// dtor
+
+ ~StringDef_tie (void);
+ // TIE specific functions
+ /// return the underlying object
+ T *_tied_object (void);
+ /// set the underlying object
+ void _tied_object (T &obj);
+ /// set the underlying object and the ownership flag
+ void _tied_object (T *obj, ::CORBA::Boolean release = true);
+ /// do we own it
+ ::CORBA::Boolean _is_owner (void);
+ /// set the ownership
+
+ void _is_owner ( ::CORBA::Boolean b);
+ // overridden ServantBase operations
+ PortableServer::POA_ptr _default_POA (
+ ACE_ENV_SINGLE_ARG_DECL_WITH_DEFAULTS
+ );
+
+ // TAO_IDL - Generated from
+ // be\be_visitor_operation/tie_sh.cpp:60
+
+ ::CORBA::DefinitionKind def_kind (
+ ACE_ENV_SINGLE_ARG_DECL_WITH_DEFAULTS
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ));
+
+ // TAO_IDL - Generated from
+ // be\be_visitor_operation/tie_sh.cpp:60
+
+ void destroy (
+ ACE_ENV_SINGLE_ARG_DECL_WITH_DEFAULTS
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ));
+
+ // TAO_IDL - Generated from
+ // be\be_visitor_operation/tie_sh.cpp:60
+
+ ::CORBA::TypeCode_ptr type (
+ ACE_ENV_SINGLE_ARG_DECL_WITH_DEFAULTS
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ));
+
+ // TAO_IDL - Generated from
+ // be\be_visitor_operation/tie_sh.cpp:60
+
+ ::CORBA::ULong bound (
+ ACE_ENV_SINGLE_ARG_DECL_WITH_DEFAULTS
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ));
+
+ // TAO_IDL - Generated from
+ // be\be_visitor_operation/tie_sh.cpp:60
+
+ void bound (
+ ::CORBA::ULong bound
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ));
+
+ private:
+ T *ptr_;
+ PortableServer::POA_var poa_;
+ ::CORBA::Boolean rel_;
+
+ // copy and assignment are not allowed
+ StringDef_tie (const StringDef_tie &);
+ void operator= (const StringDef_tie &);
+ };
+
+ // TAO_IDL - Generated from
+ // be\be_visitor_interface/tie_sh.cpp:87
+
+ // TIE class: Refer to CORBA v2.2, Section 20.34.4
+ template <class T>
+ class WstringDef_tie : public WstringDef
+ {
+ public:
+ /// the T& ctor
+ WstringDef_tie (T &t);
+ /// ctor taking a POA
+ WstringDef_tie (T &t, PortableServer::POA_ptr poa);
+ /// ctor taking pointer and an ownership flag
+ WstringDef_tie (T *tp, ::CORBA::Boolean release = true);
+ /// ctor with T*, ownership flag and a POA
+ WstringDef_tie (
+ T *tp,
+ PortableServer::POA_ptr poa,
+ ::CORBA::Boolean release = true
+ );
+ /// dtor
+
+ ~WstringDef_tie (void);
+ // TIE specific functions
+ /// return the underlying object
+ T *_tied_object (void);
+ /// set the underlying object
+ void _tied_object (T &obj);
+ /// set the underlying object and the ownership flag
+ void _tied_object (T *obj, ::CORBA::Boolean release = true);
+ /// do we own it
+ ::CORBA::Boolean _is_owner (void);
+ /// set the ownership
+
+ void _is_owner ( ::CORBA::Boolean b);
+ // overridden ServantBase operations
+ PortableServer::POA_ptr _default_POA (
+ ACE_ENV_SINGLE_ARG_DECL_WITH_DEFAULTS
+ );
+
+ // TAO_IDL - Generated from
+ // be\be_visitor_operation/tie_sh.cpp:60
+
+ ::CORBA::DefinitionKind def_kind (
+ ACE_ENV_SINGLE_ARG_DECL_WITH_DEFAULTS
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ));
+
+ // TAO_IDL - Generated from
+ // be\be_visitor_operation/tie_sh.cpp:60
+
+ void destroy (
+ ACE_ENV_SINGLE_ARG_DECL_WITH_DEFAULTS
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ));
+
+ // TAO_IDL - Generated from
+ // be\be_visitor_operation/tie_sh.cpp:60
+
+ ::CORBA::TypeCode_ptr type (
+ ACE_ENV_SINGLE_ARG_DECL_WITH_DEFAULTS
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ));
+
+ // TAO_IDL - Generated from
+ // be\be_visitor_operation/tie_sh.cpp:60
+
+ ::CORBA::ULong bound (
+ ACE_ENV_SINGLE_ARG_DECL_WITH_DEFAULTS
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ));
+
+ // TAO_IDL - Generated from
+ // be\be_visitor_operation/tie_sh.cpp:60
+
+ void bound (
+ ::CORBA::ULong bound
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ));
+
+ private:
+ T *ptr_;
+ PortableServer::POA_var poa_;
+ ::CORBA::Boolean rel_;
+
+ // copy and assignment are not allowed
+ WstringDef_tie (const WstringDef_tie &);
+ void operator= (const WstringDef_tie &);
+ };
+
+ // TAO_IDL - Generated from
+ // be\be_visitor_interface/tie_sh.cpp:87
+
+ // TIE class: Refer to CORBA v2.2, Section 20.34.4
+ template <class T>
+ class SequenceDef_tie : public SequenceDef
+ {
+ public:
+ /// the T& ctor
+ SequenceDef_tie (T &t);
+ /// ctor taking a POA
+ SequenceDef_tie (T &t, PortableServer::POA_ptr poa);
+ /// ctor taking pointer and an ownership flag
+ SequenceDef_tie (T *tp, ::CORBA::Boolean release = true);
+ /// ctor with T*, ownership flag and a POA
+ SequenceDef_tie (
+ T *tp,
+ PortableServer::POA_ptr poa,
+ ::CORBA::Boolean release = true
+ );
+ /// dtor
+
+ ~SequenceDef_tie (void);
+ // TIE specific functions
+ /// return the underlying object
+ T *_tied_object (void);
+ /// set the underlying object
+ void _tied_object (T &obj);
+ /// set the underlying object and the ownership flag
+ void _tied_object (T *obj, ::CORBA::Boolean release = true);
+ /// do we own it
+ ::CORBA::Boolean _is_owner (void);
+ /// set the ownership
+
+ void _is_owner ( ::CORBA::Boolean b);
+ // overridden ServantBase operations
+ PortableServer::POA_ptr _default_POA (
+ ACE_ENV_SINGLE_ARG_DECL_WITH_DEFAULTS
+ );
+
+ // TAO_IDL - Generated from
+ // be\be_visitor_operation/tie_sh.cpp:60
+
+ ::CORBA::DefinitionKind def_kind (
+ ACE_ENV_SINGLE_ARG_DECL_WITH_DEFAULTS
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ));
+
+ // TAO_IDL - Generated from
+ // be\be_visitor_operation/tie_sh.cpp:60
+
+ void destroy (
+ ACE_ENV_SINGLE_ARG_DECL_WITH_DEFAULTS
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ));
+
+ // TAO_IDL - Generated from
+ // be\be_visitor_operation/tie_sh.cpp:60
+
+ ::CORBA::TypeCode_ptr type (
+ ACE_ENV_SINGLE_ARG_DECL_WITH_DEFAULTS
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ));
+
+ // TAO_IDL - Generated from
+ // be\be_visitor_operation/tie_sh.cpp:60
+
+ ::CORBA::ULong bound (
+ ACE_ENV_SINGLE_ARG_DECL_WITH_DEFAULTS
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ));
+
+ // TAO_IDL - Generated from
+ // be\be_visitor_operation/tie_sh.cpp:60
+
+ void bound (
+ ::CORBA::ULong bound
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ));
+
+ // TAO_IDL - Generated from
+ // be\be_visitor_operation/tie_sh.cpp:60
+
+ ::CORBA::TypeCode_ptr element_type (
+ ACE_ENV_SINGLE_ARG_DECL_WITH_DEFAULTS
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ));
+
+ // TAO_IDL - Generated from
+ // be\be_visitor_operation/tie_sh.cpp:60
+
+ ::CORBA::IDLType_ptr element_type_def (
+ ACE_ENV_SINGLE_ARG_DECL_WITH_DEFAULTS
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ));
+
+ // TAO_IDL - Generated from
+ // be\be_visitor_operation/tie_sh.cpp:60
+
+ void element_type_def (
+ ::CORBA::IDLType_ptr element_type_def
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ));
+
+ private:
+ T *ptr_;
+ PortableServer::POA_var poa_;
+ ::CORBA::Boolean rel_;
+
+ // copy and assignment are not allowed
+ SequenceDef_tie (const SequenceDef_tie &);
+ void operator= (const SequenceDef_tie &);
+ };
+
+ // TAO_IDL - Generated from
+ // be\be_visitor_interface/tie_sh.cpp:87
+
+ // TIE class: Refer to CORBA v2.2, Section 20.34.4
+ template <class T>
+ class ArrayDef_tie : public ArrayDef
+ {
+ public:
+ /// the T& ctor
+ ArrayDef_tie (T &t);
+ /// ctor taking a POA
+ ArrayDef_tie (T &t, PortableServer::POA_ptr poa);
+ /// ctor taking pointer and an ownership flag
+ ArrayDef_tie (T *tp, ::CORBA::Boolean release = true);
+ /// ctor with T*, ownership flag and a POA
+ ArrayDef_tie (
+ T *tp,
+ PortableServer::POA_ptr poa,
+ ::CORBA::Boolean release = true
+ );
+ /// dtor
+
+ ~ArrayDef_tie (void);
+ // TIE specific functions
+ /// return the underlying object
+ T *_tied_object (void);
+ /// set the underlying object
+ void _tied_object (T &obj);
+ /// set the underlying object and the ownership flag
+ void _tied_object (T *obj, ::CORBA::Boolean release = true);
+ /// do we own it
+ ::CORBA::Boolean _is_owner (void);
+ /// set the ownership
+
+ void _is_owner ( ::CORBA::Boolean b);
+ // overridden ServantBase operations
+ PortableServer::POA_ptr _default_POA (
+ ACE_ENV_SINGLE_ARG_DECL_WITH_DEFAULTS
+ );
+
+ // TAO_IDL - Generated from
+ // be\be_visitor_operation/tie_sh.cpp:60
+
+ ::CORBA::DefinitionKind def_kind (
+ ACE_ENV_SINGLE_ARG_DECL_WITH_DEFAULTS
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ));
+
+ // TAO_IDL - Generated from
+ // be\be_visitor_operation/tie_sh.cpp:60
+
+ void destroy (
+ ACE_ENV_SINGLE_ARG_DECL_WITH_DEFAULTS
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ));
+
+ // TAO_IDL - Generated from
+ // be\be_visitor_operation/tie_sh.cpp:60
+
+ ::CORBA::TypeCode_ptr type (
+ ACE_ENV_SINGLE_ARG_DECL_WITH_DEFAULTS
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ));
+
+ // TAO_IDL - Generated from
+ // be\be_visitor_operation/tie_sh.cpp:60
+
+ ::CORBA::ULong length (
+ ACE_ENV_SINGLE_ARG_DECL_WITH_DEFAULTS
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ));
+
+ // TAO_IDL - Generated from
+ // be\be_visitor_operation/tie_sh.cpp:60
+
+ void length (
+ ::CORBA::ULong length
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ));
+
+ // TAO_IDL - Generated from
+ // be\be_visitor_operation/tie_sh.cpp:60
+
+ ::CORBA::TypeCode_ptr element_type (
+ ACE_ENV_SINGLE_ARG_DECL_WITH_DEFAULTS
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ));
+
+ // TAO_IDL - Generated from
+ // be\be_visitor_operation/tie_sh.cpp:60
+
+ ::CORBA::IDLType_ptr element_type_def (
+ ACE_ENV_SINGLE_ARG_DECL_WITH_DEFAULTS
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ));
+
+ // TAO_IDL - Generated from
+ // be\be_visitor_operation/tie_sh.cpp:60
+
+ void element_type_def (
+ ::CORBA::IDLType_ptr element_type_def
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ));
+
+ private:
+ T *ptr_;
+ PortableServer::POA_var poa_;
+ ::CORBA::Boolean rel_;
+
+ // copy and assignment are not allowed
+ ArrayDef_tie (const ArrayDef_tie &);
+ void operator= (const ArrayDef_tie &);
+ };
+
+ // TAO_IDL - Generated from
+ // be\be_visitor_interface/tie_sh.cpp:87
+
+ // TIE class: Refer to CORBA v2.2, Section 20.34.4
+ template <class T>
+ class ExceptionDef_tie : public ExceptionDef
+ {
+ public:
+ /// the T& ctor
+ ExceptionDef_tie (T &t);
+ /// ctor taking a POA
+ ExceptionDef_tie (T &t, PortableServer::POA_ptr poa);
+ /// ctor taking pointer and an ownership flag
+ ExceptionDef_tie (T *tp, ::CORBA::Boolean release = true);
+ /// ctor with T*, ownership flag and a POA
+ ExceptionDef_tie (
+ T *tp,
+ PortableServer::POA_ptr poa,
+ ::CORBA::Boolean release = true
+ );
+ /// dtor
+
+ ~ExceptionDef_tie (void);
+ // TIE specific functions
+ /// return the underlying object
+ T *_tied_object (void);
+ /// set the underlying object
+ void _tied_object (T &obj);
+ /// set the underlying object and the ownership flag
+ void _tied_object (T *obj, ::CORBA::Boolean release = true);
+ /// do we own it
+ ::CORBA::Boolean _is_owner (void);
+ /// set the ownership
+
+ void _is_owner ( ::CORBA::Boolean b);
+ // overridden ServantBase operations
+ PortableServer::POA_ptr _default_POA (
+ ACE_ENV_SINGLE_ARG_DECL_WITH_DEFAULTS
+ );
+
+ // TAO_IDL - Generated from
+ // be\be_visitor_operation/tie_sh.cpp:60
+
+ ::CORBA::DefinitionKind def_kind (
+ ACE_ENV_SINGLE_ARG_DECL_WITH_DEFAULTS
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ));
+
+ // TAO_IDL - Generated from
+ // be\be_visitor_operation/tie_sh.cpp:60
+
+ void destroy (
+ ACE_ENV_SINGLE_ARG_DECL_WITH_DEFAULTS
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ));
+
+ // TAO_IDL - Generated from
+ // be\be_visitor_operation/tie_sh.cpp:60
+
+ char * id (
+ ACE_ENV_SINGLE_ARG_DECL_WITH_DEFAULTS
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ));
+
+ // TAO_IDL - Generated from
+ // be\be_visitor_operation/tie_sh.cpp:60
+
+ void id (
+ const char * id
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ));
+
+ // TAO_IDL - Generated from
+ // be\be_visitor_operation/tie_sh.cpp:60
+
+ char * name (
+ ACE_ENV_SINGLE_ARG_DECL_WITH_DEFAULTS
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ));
+
+ // TAO_IDL - Generated from
+ // be\be_visitor_operation/tie_sh.cpp:60
+
+ void name (
+ const char * name
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ));
+
+ // TAO_IDL - Generated from
+ // be\be_visitor_operation/tie_sh.cpp:60
+
+ char * version (
+ ACE_ENV_SINGLE_ARG_DECL_WITH_DEFAULTS
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ));
+
+ // TAO_IDL - Generated from
+ // be\be_visitor_operation/tie_sh.cpp:60
+
+ void version (
+ const char * version
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ));
+
+ // TAO_IDL - Generated from
+ // be\be_visitor_operation/tie_sh.cpp:60
+
+ ::CORBA::Container_ptr defined_in (
+ ACE_ENV_SINGLE_ARG_DECL_WITH_DEFAULTS
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ));
+
+ // TAO_IDL - Generated from
+ // be\be_visitor_operation/tie_sh.cpp:60
+
+ char * absolute_name (
+ ACE_ENV_SINGLE_ARG_DECL_WITH_DEFAULTS
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ));
+
+ // TAO_IDL - Generated from
+ // be\be_visitor_operation/tie_sh.cpp:60
+
+ ::CORBA::Repository_ptr containing_repository (
+ ACE_ENV_SINGLE_ARG_DECL_WITH_DEFAULTS
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ));
+
+ // TAO_IDL - Generated from
+ // be\be_visitor_operation/tie_sh.cpp:60
+
+ ::CORBA::Contained::Description * describe (
+ ACE_ENV_SINGLE_ARG_DECL_WITH_DEFAULTS
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ));
+
+ // TAO_IDL - Generated from
+ // be\be_visitor_operation/tie_sh.cpp:60
+
+ void move (
+ ::CORBA::Container_ptr new_container,
+ const char * new_name,
+ const char * new_version
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ));
+
+ // TAO_IDL - Generated from
+ // be\be_visitor_operation/tie_sh.cpp:60
+
+ ::CORBA::Contained_ptr lookup (
+ const char * search_name
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ));
+
+ // TAO_IDL - Generated from
+ // be\be_visitor_operation/tie_sh.cpp:60
+
+ ::CORBA::ContainedSeq * contents (
+ ::CORBA::DefinitionKind limit_type,
+ ::CORBA::Boolean exclude_inherited
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ));
+
+ // TAO_IDL - Generated from
+ // be\be_visitor_operation/tie_sh.cpp:60
+
+ ::CORBA::ContainedSeq * lookup_name (
+ const char * search_name,
+ ::CORBA::Long levels_to_search,
+ ::CORBA::DefinitionKind limit_type,
+ ::CORBA::Boolean exclude_inherited
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ));
+
+ // TAO_IDL - Generated from
+ // be\be_visitor_operation/tie_sh.cpp:60
+
+ ::CORBA::Container::DescriptionSeq * describe_contents (
+ ::CORBA::DefinitionKind limit_type,
+ ::CORBA::Boolean exclude_inherited,
+ ::CORBA::Long max_returned_objs
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ));
+
+ // TAO_IDL - Generated from
+ // be\be_visitor_operation/tie_sh.cpp:60
+
+ ::CORBA::ModuleDef_ptr create_module (
+ const char * id,
+ const char * name,
+ const char * version
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ));
+
+ // TAO_IDL - Generated from
+ // be\be_visitor_operation/tie_sh.cpp:60
+
+ ::CORBA::ConstantDef_ptr create_constant (
+ const char * id,
+ const char * name,
+ const char * version,
+ ::CORBA::IDLType_ptr type,
+ const ::CORBA::Any & value
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ));
+
+ // TAO_IDL - Generated from
+ // be\be_visitor_operation/tie_sh.cpp:60
+
+ ::CORBA::StructDef_ptr create_struct (
+ const char * id,
+ const char * name,
+ const char * version,
+ const ::CORBA::StructMemberSeq & members
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ));
+
+ // TAO_IDL - Generated from
+ // be\be_visitor_operation/tie_sh.cpp:60
+
+ ::CORBA::UnionDef_ptr create_union (
+ const char * id,
+ const char * name,
+ const char * version,
+ ::CORBA::IDLType_ptr discriminator_type,
+ const ::CORBA::UnionMemberSeq & members
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ));
+
+ // TAO_IDL - Generated from
+ // be\be_visitor_operation/tie_sh.cpp:60
+
+ ::CORBA::EnumDef_ptr create_enum (
+ const char * id,
+ const char * name,
+ const char * version,
+ const ::CORBA::EnumMemberSeq & members
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ));
+
+ // TAO_IDL - Generated from
+ // be\be_visitor_operation/tie_sh.cpp:60
+
+ ::CORBA::AliasDef_ptr create_alias (
+ const char * id,
+ const char * name,
+ const char * version,
+ ::CORBA::IDLType_ptr original_type
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ));
+
+ // TAO_IDL - Generated from
+ // be\be_visitor_operation/tie_sh.cpp:60
+
+ ::CORBA::InterfaceDef_ptr create_interface (
+ const char * id,
+ const char * name,
+ const char * version,
+ const ::CORBA::InterfaceDefSeq & base_interfaces
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ));
+
+ // TAO_IDL - Generated from
+ // be\be_visitor_operation/tie_sh.cpp:60
+
+ ::CORBA::ValueDef_ptr create_value (
+ const char * id,
+ const char * name,
+ const char * version,
+ ::CORBA::Boolean is_custom,
+ ::CORBA::Boolean is_abstract,
+ ::CORBA::ValueDef_ptr base_value,
+ ::CORBA::Boolean is_truncatable,
+ const ::CORBA::ValueDefSeq & abstract_base_values,
+ const ::CORBA::InterfaceDefSeq & supported_interfaces,
+ const ::CORBA::InitializerSeq & initializers
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ));
+
+ // TAO_IDL - Generated from
+ // be\be_visitor_operation/tie_sh.cpp:60
+
+ ::CORBA::ValueBoxDef_ptr create_value_box (
+ const char * id,
+ const char * name,
+ const char * version,
+ ::CORBA::IDLType_ptr original_type_def
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ));
+
+ // TAO_IDL - Generated from
+ // be\be_visitor_operation/tie_sh.cpp:60
+
+ ::CORBA::ExceptionDef_ptr create_exception (
+ const char * id,
+ const char * name,
+ const char * version,
+ const ::CORBA::StructMemberSeq & members
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ));
+
+ // TAO_IDL - Generated from
+ // be\be_visitor_operation/tie_sh.cpp:60
+
+ ::CORBA::NativeDef_ptr create_native (
+ const char * id,
+ const char * name,
+ const char * version
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ));
+
+ // TAO_IDL - Generated from
+ // be\be_visitor_operation/tie_sh.cpp:60
+
+ ::CORBA::AbstractInterfaceDef_ptr create_abstract_interface (
+ const char * id,
+ const char * name,
+ const char * version,
+ const ::CORBA::AbstractInterfaceDefSeq & base_interfaces
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ));
+
+ // TAO_IDL - Generated from
+ // be\be_visitor_operation/tie_sh.cpp:60
+
+ ::CORBA::LocalInterfaceDef_ptr create_local_interface (
+ const char * id,
+ const char * name,
+ const char * version,
+ const ::CORBA::InterfaceDefSeq & base_interfaces
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ));
+
+ // TAO_IDL - Generated from
+ // be\be_visitor_operation/tie_sh.cpp:60
+
+ ::CORBA::ExtValueDef_ptr create_ext_value (
+ const char * id,
+ const char * name,
+ const char * version,
+ ::CORBA::Boolean is_custom,
+ ::CORBA::Boolean is_abstract,
+ ::CORBA::ValueDef_ptr base_value,
+ ::CORBA::Boolean is_truncatable,
+ const ::CORBA::ValueDefSeq & abstract_base_values,
+ const ::CORBA::InterfaceDefSeq & supported_interfaces,
+ const ::CORBA::ExtInitializerSeq & initializers
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ));
+
+ // TAO_IDL - Generated from
+ // be\be_visitor_operation/tie_sh.cpp:60
+
+ ::CORBA::TypeCode_ptr type (
+ ACE_ENV_SINGLE_ARG_DECL_WITH_DEFAULTS
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ));
+
+ // TAO_IDL - Generated from
+ // be\be_visitor_operation/tie_sh.cpp:60
+
+ ::CORBA::StructMemberSeq * members (
+ ACE_ENV_SINGLE_ARG_DECL_WITH_DEFAULTS
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ));
+
+ // TAO_IDL - Generated from
+ // be\be_visitor_operation/tie_sh.cpp:60
+
+ void members (
+ const ::CORBA::StructMemberSeq & members
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ));
+
+ private:
+ T *ptr_;
+ PortableServer::POA_var poa_;
+ ::CORBA::Boolean rel_;
+
+ // copy and assignment are not allowed
+ ExceptionDef_tie (const ExceptionDef_tie &);
+ void operator= (const ExceptionDef_tie &);
+ };
+
+ // TAO_IDL - Generated from
+ // be\be_visitor_interface/tie_sh.cpp:87
+
+ // TIE class: Refer to CORBA v2.2, Section 20.34.4
+ template <class T>
+ class AttributeDef_tie : public AttributeDef
+ {
+ public:
+ /// the T& ctor
+ AttributeDef_tie (T &t);
+ /// ctor taking a POA
+ AttributeDef_tie (T &t, PortableServer::POA_ptr poa);
+ /// ctor taking pointer and an ownership flag
+ AttributeDef_tie (T *tp, ::CORBA::Boolean release = true);
+ /// ctor with T*, ownership flag and a POA
+ AttributeDef_tie (
+ T *tp,
+ PortableServer::POA_ptr poa,
+ ::CORBA::Boolean release = true
+ );
+ /// dtor
+
+ ~AttributeDef_tie (void);
+ // TIE specific functions
+ /// return the underlying object
+ T *_tied_object (void);
+ /// set the underlying object
+ void _tied_object (T &obj);
+ /// set the underlying object and the ownership flag
+ void _tied_object (T *obj, ::CORBA::Boolean release = true);
+ /// do we own it
+ ::CORBA::Boolean _is_owner (void);
+ /// set the ownership
+
+ void _is_owner ( ::CORBA::Boolean b);
+ // overridden ServantBase operations
+ PortableServer::POA_ptr _default_POA (
+ ACE_ENV_SINGLE_ARG_DECL_WITH_DEFAULTS
+ );
+
+ // TAO_IDL - Generated from
+ // be\be_visitor_operation/tie_sh.cpp:60
+
+ ::CORBA::DefinitionKind def_kind (
+ ACE_ENV_SINGLE_ARG_DECL_WITH_DEFAULTS
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ));
+
+ // TAO_IDL - Generated from
+ // be\be_visitor_operation/tie_sh.cpp:60
+
+ void destroy (
+ ACE_ENV_SINGLE_ARG_DECL_WITH_DEFAULTS
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ));
+
+ // TAO_IDL - Generated from
+ // be\be_visitor_operation/tie_sh.cpp:60
+
+ char * id (
+ ACE_ENV_SINGLE_ARG_DECL_WITH_DEFAULTS
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ));
+
+ // TAO_IDL - Generated from
+ // be\be_visitor_operation/tie_sh.cpp:60
+
+ void id (
+ const char * id
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ));
+
+ // TAO_IDL - Generated from
+ // be\be_visitor_operation/tie_sh.cpp:60
+
+ char * name (
+ ACE_ENV_SINGLE_ARG_DECL_WITH_DEFAULTS
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ));
+
+ // TAO_IDL - Generated from
+ // be\be_visitor_operation/tie_sh.cpp:60
+
+ void name (
+ const char * name
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ));
+
+ // TAO_IDL - Generated from
+ // be\be_visitor_operation/tie_sh.cpp:60
+
+ char * version (
+ ACE_ENV_SINGLE_ARG_DECL_WITH_DEFAULTS
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ));
+
+ // TAO_IDL - Generated from
+ // be\be_visitor_operation/tie_sh.cpp:60
+
+ void version (
+ const char * version
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ));
+
+ // TAO_IDL - Generated from
+ // be\be_visitor_operation/tie_sh.cpp:60
+
+ ::CORBA::Container_ptr defined_in (
+ ACE_ENV_SINGLE_ARG_DECL_WITH_DEFAULTS
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ));
+
+ // TAO_IDL - Generated from
+ // be\be_visitor_operation/tie_sh.cpp:60
+
+ char * absolute_name (
+ ACE_ENV_SINGLE_ARG_DECL_WITH_DEFAULTS
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ));
+
+ // TAO_IDL - Generated from
+ // be\be_visitor_operation/tie_sh.cpp:60
+
+ ::CORBA::Repository_ptr containing_repository (
+ ACE_ENV_SINGLE_ARG_DECL_WITH_DEFAULTS
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ));
+
+ // TAO_IDL - Generated from
+ // be\be_visitor_operation/tie_sh.cpp:60
+
+ ::CORBA::Contained::Description * describe (
+ ACE_ENV_SINGLE_ARG_DECL_WITH_DEFAULTS
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ));
+
+ // TAO_IDL - Generated from
+ // be\be_visitor_operation/tie_sh.cpp:60
+
+ void move (
+ ::CORBA::Container_ptr new_container,
+ const char * new_name,
+ const char * new_version
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ));
+
+ // TAO_IDL - Generated from
+ // be\be_visitor_operation/tie_sh.cpp:60
+
+ ::CORBA::TypeCode_ptr type (
+ ACE_ENV_SINGLE_ARG_DECL_WITH_DEFAULTS
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ));
+
+ // TAO_IDL - Generated from
+ // be\be_visitor_operation/tie_sh.cpp:60
+
+ ::CORBA::IDLType_ptr type_def (
+ ACE_ENV_SINGLE_ARG_DECL_WITH_DEFAULTS
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ));
+
+ // TAO_IDL - Generated from
+ // be\be_visitor_operation/tie_sh.cpp:60
+
+ void type_def (
+ ::CORBA::IDLType_ptr type_def
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ));
+
+ // TAO_IDL - Generated from
+ // be\be_visitor_operation/tie_sh.cpp:60
+
+ ::CORBA::AttributeMode mode (
+ ACE_ENV_SINGLE_ARG_DECL_WITH_DEFAULTS
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ));
+
+ // TAO_IDL - Generated from
+ // be\be_visitor_operation/tie_sh.cpp:60
+
+ void mode (
+ ::CORBA::AttributeMode mode
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ));
+
+ private:
+ T *ptr_;
+ PortableServer::POA_var poa_;
+ ::CORBA::Boolean rel_;
+
+ // copy and assignment are not allowed
+ AttributeDef_tie (const AttributeDef_tie &);
+ void operator= (const AttributeDef_tie &);
+ };
+
+ // TAO_IDL - Generated from
+ // be\be_visitor_interface/tie_sh.cpp:87
+
+ // TIE class: Refer to CORBA v2.2, Section 20.34.4
+ template <class T>
+ class ExtAttributeDef_tie : public ExtAttributeDef
+ {
+ public:
+ /// the T& ctor
+ ExtAttributeDef_tie (T &t);
+ /// ctor taking a POA
+ ExtAttributeDef_tie (T &t, PortableServer::POA_ptr poa);
+ /// ctor taking pointer and an ownership flag
+ ExtAttributeDef_tie (T *tp, ::CORBA::Boolean release = true);
+ /// ctor with T*, ownership flag and a POA
+ ExtAttributeDef_tie (
+ T *tp,
+ PortableServer::POA_ptr poa,
+ ::CORBA::Boolean release = true
+ );
+ /// dtor
+
+ ~ExtAttributeDef_tie (void);
+ // TIE specific functions
+ /// return the underlying object
+ T *_tied_object (void);
+ /// set the underlying object
+ void _tied_object (T &obj);
+ /// set the underlying object and the ownership flag
+ void _tied_object (T *obj, ::CORBA::Boolean release = true);
+ /// do we own it
+ ::CORBA::Boolean _is_owner (void);
+ /// set the ownership
+
+ void _is_owner ( ::CORBA::Boolean b);
+ // overridden ServantBase operations
+ PortableServer::POA_ptr _default_POA (
+ ACE_ENV_SINGLE_ARG_DECL_WITH_DEFAULTS
+ );
+
+ // TAO_IDL - Generated from
+ // be\be_visitor_operation/tie_sh.cpp:60
+
+ ::CORBA::DefinitionKind def_kind (
+ ACE_ENV_SINGLE_ARG_DECL_WITH_DEFAULTS
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ));
+
+ // TAO_IDL - Generated from
+ // be\be_visitor_operation/tie_sh.cpp:60
+
+ void destroy (
+ ACE_ENV_SINGLE_ARG_DECL_WITH_DEFAULTS
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ));
+
+ // TAO_IDL - Generated from
+ // be\be_visitor_operation/tie_sh.cpp:60
+
+ char * id (
+ ACE_ENV_SINGLE_ARG_DECL_WITH_DEFAULTS
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ));
+
+ // TAO_IDL - Generated from
+ // be\be_visitor_operation/tie_sh.cpp:60
+
+ void id (
+ const char * id
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ));
+
+ // TAO_IDL - Generated from
+ // be\be_visitor_operation/tie_sh.cpp:60
+
+ char * name (
+ ACE_ENV_SINGLE_ARG_DECL_WITH_DEFAULTS
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ));
+
+ // TAO_IDL - Generated from
+ // be\be_visitor_operation/tie_sh.cpp:60
+
+ void name (
+ const char * name
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ));
+
+ // TAO_IDL - Generated from
+ // be\be_visitor_operation/tie_sh.cpp:60
+
+ char * version (
+ ACE_ENV_SINGLE_ARG_DECL_WITH_DEFAULTS
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ));
+
+ // TAO_IDL - Generated from
+ // be\be_visitor_operation/tie_sh.cpp:60
+
+ void version (
+ const char * version
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ));
+
+ // TAO_IDL - Generated from
+ // be\be_visitor_operation/tie_sh.cpp:60
+
+ ::CORBA::Container_ptr defined_in (
+ ACE_ENV_SINGLE_ARG_DECL_WITH_DEFAULTS
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ));
+
+ // TAO_IDL - Generated from
+ // be\be_visitor_operation/tie_sh.cpp:60
+
+ char * absolute_name (
+ ACE_ENV_SINGLE_ARG_DECL_WITH_DEFAULTS
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ));
+
+ // TAO_IDL - Generated from
+ // be\be_visitor_operation/tie_sh.cpp:60
+
+ ::CORBA::Repository_ptr containing_repository (
+ ACE_ENV_SINGLE_ARG_DECL_WITH_DEFAULTS
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ));
+
+ // TAO_IDL - Generated from
+ // be\be_visitor_operation/tie_sh.cpp:60
+
+ ::CORBA::Contained::Description * describe (
+ ACE_ENV_SINGLE_ARG_DECL_WITH_DEFAULTS
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ));
+
+ // TAO_IDL - Generated from
+ // be\be_visitor_operation/tie_sh.cpp:60
+
+ void move (
+ ::CORBA::Container_ptr new_container,
+ const char * new_name,
+ const char * new_version
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ));
+
+ // TAO_IDL - Generated from
+ // be\be_visitor_operation/tie_sh.cpp:60
+
+ ::CORBA::TypeCode_ptr type (
+ ACE_ENV_SINGLE_ARG_DECL_WITH_DEFAULTS
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ));
+
+ // TAO_IDL - Generated from
+ // be\be_visitor_operation/tie_sh.cpp:60
+
+ ::CORBA::IDLType_ptr type_def (
+ ACE_ENV_SINGLE_ARG_DECL_WITH_DEFAULTS
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ));
+
+ // TAO_IDL - Generated from
+ // be\be_visitor_operation/tie_sh.cpp:60
+
+ void type_def (
+ ::CORBA::IDLType_ptr type_def
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ));
+
+ // TAO_IDL - Generated from
+ // be\be_visitor_operation/tie_sh.cpp:60
+
+ ::CORBA::AttributeMode mode (
+ ACE_ENV_SINGLE_ARG_DECL_WITH_DEFAULTS
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ));
+
+ // TAO_IDL - Generated from
+ // be\be_visitor_operation/tie_sh.cpp:60
+
+ void mode (
+ ::CORBA::AttributeMode mode
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ));
+
+ // TAO_IDL - Generated from
+ // be\be_visitor_operation/tie_sh.cpp:60
+
+ ::CORBA::ExcDescriptionSeq * get_exceptions (
+ ACE_ENV_SINGLE_ARG_DECL_WITH_DEFAULTS
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ));
+
+ // TAO_IDL - Generated from
+ // be\be_visitor_operation/tie_sh.cpp:60
+
+ void get_exceptions (
+ const ::CORBA::ExcDescriptionSeq & get_exceptions
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ));
+
+ // TAO_IDL - Generated from
+ // be\be_visitor_operation/tie_sh.cpp:60
+
+ ::CORBA::ExcDescriptionSeq * set_exceptions (
+ ACE_ENV_SINGLE_ARG_DECL_WITH_DEFAULTS
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ));
+
+ // TAO_IDL - Generated from
+ // be\be_visitor_operation/tie_sh.cpp:60
+
+ void set_exceptions (
+ const ::CORBA::ExcDescriptionSeq & set_exceptions
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ));
+
+ // TAO_IDL - Generated from
+ // be\be_visitor_operation/tie_sh.cpp:60
+
+ ::CORBA::ExtAttributeDescription * describe_attribute (
+ ACE_ENV_SINGLE_ARG_DECL_WITH_DEFAULTS
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ));
+
+ private:
+ T *ptr_;
+ PortableServer::POA_var poa_;
+ ::CORBA::Boolean rel_;
+
+ // copy and assignment are not allowed
+ ExtAttributeDef_tie (const ExtAttributeDef_tie &);
+ void operator= (const ExtAttributeDef_tie &);
+ };
+
+ // TAO_IDL - Generated from
+ // be\be_visitor_interface/tie_sh.cpp:87
+
+ // TIE class: Refer to CORBA v2.2, Section 20.34.4
+ template <class T>
+ class OperationDef_tie : public OperationDef
+ {
+ public:
+ /// the T& ctor
+ OperationDef_tie (T &t);
+ /// ctor taking a POA
+ OperationDef_tie (T &t, PortableServer::POA_ptr poa);
+ /// ctor taking pointer and an ownership flag
+ OperationDef_tie (T *tp, ::CORBA::Boolean release = true);
+ /// ctor with T*, ownership flag and a POA
+ OperationDef_tie (
+ T *tp,
+ PortableServer::POA_ptr poa,
+ ::CORBA::Boolean release = true
+ );
+ /// dtor
+
+ ~OperationDef_tie (void);
+ // TIE specific functions
+ /// return the underlying object
+ T *_tied_object (void);
+ /// set the underlying object
+ void _tied_object (T &obj);
+ /// set the underlying object and the ownership flag
+ void _tied_object (T *obj, ::CORBA::Boolean release = true);
+ /// do we own it
+ ::CORBA::Boolean _is_owner (void);
+ /// set the ownership
+
+ void _is_owner ( ::CORBA::Boolean b);
+ // overridden ServantBase operations
+ PortableServer::POA_ptr _default_POA (
+ ACE_ENV_SINGLE_ARG_DECL_WITH_DEFAULTS
+ );
+
+ // TAO_IDL - Generated from
+ // be\be_visitor_operation/tie_sh.cpp:60
+
+ ::CORBA::DefinitionKind def_kind (
+ ACE_ENV_SINGLE_ARG_DECL_WITH_DEFAULTS
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ));
+
+ // TAO_IDL - Generated from
+ // be\be_visitor_operation/tie_sh.cpp:60
+
+ void destroy (
+ ACE_ENV_SINGLE_ARG_DECL_WITH_DEFAULTS
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ));
+
+ // TAO_IDL - Generated from
+ // be\be_visitor_operation/tie_sh.cpp:60
+
+ char * id (
+ ACE_ENV_SINGLE_ARG_DECL_WITH_DEFAULTS
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ));
+
+ // TAO_IDL - Generated from
+ // be\be_visitor_operation/tie_sh.cpp:60
+
+ void id (
+ const char * id
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ));
+
+ // TAO_IDL - Generated from
+ // be\be_visitor_operation/tie_sh.cpp:60
+
+ char * name (
+ ACE_ENV_SINGLE_ARG_DECL_WITH_DEFAULTS
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ));
+
+ // TAO_IDL - Generated from
+ // be\be_visitor_operation/tie_sh.cpp:60
+
+ void name (
+ const char * name
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ));
+
+ // TAO_IDL - Generated from
+ // be\be_visitor_operation/tie_sh.cpp:60
+
+ char * version (
+ ACE_ENV_SINGLE_ARG_DECL_WITH_DEFAULTS
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ));
+
+ // TAO_IDL - Generated from
+ // be\be_visitor_operation/tie_sh.cpp:60
+
+ void version (
+ const char * version
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ));
+
+ // TAO_IDL - Generated from
+ // be\be_visitor_operation/tie_sh.cpp:60
+
+ ::CORBA::Container_ptr defined_in (
+ ACE_ENV_SINGLE_ARG_DECL_WITH_DEFAULTS
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ));
+
+ // TAO_IDL - Generated from
+ // be\be_visitor_operation/tie_sh.cpp:60
+
+ char * absolute_name (
+ ACE_ENV_SINGLE_ARG_DECL_WITH_DEFAULTS
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ));
+
+ // TAO_IDL - Generated from
+ // be\be_visitor_operation/tie_sh.cpp:60
+
+ ::CORBA::Repository_ptr containing_repository (
+ ACE_ENV_SINGLE_ARG_DECL_WITH_DEFAULTS
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ));
+
+ // TAO_IDL - Generated from
+ // be\be_visitor_operation/tie_sh.cpp:60
+
+ ::CORBA::Contained::Description * describe (
+ ACE_ENV_SINGLE_ARG_DECL_WITH_DEFAULTS
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ));
+
+ // TAO_IDL - Generated from
+ // be\be_visitor_operation/tie_sh.cpp:60
+
+ void move (
+ ::CORBA::Container_ptr new_container,
+ const char * new_name,
+ const char * new_version
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ));
+
+ // TAO_IDL - Generated from
+ // be\be_visitor_operation/tie_sh.cpp:60
+
+ ::CORBA::TypeCode_ptr result (
+ ACE_ENV_SINGLE_ARG_DECL_WITH_DEFAULTS
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ));
+
+ // TAO_IDL - Generated from
+ // be\be_visitor_operation/tie_sh.cpp:60
+
+ ::CORBA::IDLType_ptr result_def (
+ ACE_ENV_SINGLE_ARG_DECL_WITH_DEFAULTS
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ));
+
+ // TAO_IDL - Generated from
+ // be\be_visitor_operation/tie_sh.cpp:60
+
+ void result_def (
+ ::CORBA::IDLType_ptr result_def
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ));
+
+ // TAO_IDL - Generated from
+ // be\be_visitor_operation/tie_sh.cpp:60
+
+ ::CORBA::ParDescriptionSeq * params (
+ ACE_ENV_SINGLE_ARG_DECL_WITH_DEFAULTS
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ));
+
+ // TAO_IDL - Generated from
+ // be\be_visitor_operation/tie_sh.cpp:60
+
+ void params (
+ const ::CORBA::ParDescriptionSeq & params
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ));
+
+ // TAO_IDL - Generated from
+ // be\be_visitor_operation/tie_sh.cpp:60
+
+ ::CORBA::OperationMode mode (
+ ACE_ENV_SINGLE_ARG_DECL_WITH_DEFAULTS
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ));
+
+ // TAO_IDL - Generated from
+ // be\be_visitor_operation/tie_sh.cpp:60
+
+ void mode (
+ ::CORBA::OperationMode mode
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ));
+
+ // TAO_IDL - Generated from
+ // be\be_visitor_operation/tie_sh.cpp:60
+
+ ::CORBA::ContextIdSeq * contexts (
+ ACE_ENV_SINGLE_ARG_DECL_WITH_DEFAULTS
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ));
+
+ // TAO_IDL - Generated from
+ // be\be_visitor_operation/tie_sh.cpp:60
+
+ void contexts (
+ const ::CORBA::ContextIdSeq & contexts
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ));
+
+ // TAO_IDL - Generated from
+ // be\be_visitor_operation/tie_sh.cpp:60
+
+ ::CORBA::ExceptionDefSeq * exceptions (
+ ACE_ENV_SINGLE_ARG_DECL_WITH_DEFAULTS
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ));
+
+ // TAO_IDL - Generated from
+ // be\be_visitor_operation/tie_sh.cpp:60
+
+ void exceptions (
+ const ::CORBA::ExceptionDefSeq & exceptions
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ));
+
+ private:
+ T *ptr_;
+ PortableServer::POA_var poa_;
+ ::CORBA::Boolean rel_;
+
+ // copy and assignment are not allowed
+ OperationDef_tie (const OperationDef_tie &);
+ void operator= (const OperationDef_tie &);
+ };
+
+ // TAO_IDL - Generated from
+ // be\be_visitor_interface/tie_sh.cpp:87
+
+ // TIE class: Refer to CORBA v2.2, Section 20.34.4
+ template <class T>
+ class InterfaceDef_tie : public InterfaceDef
+ {
+ public:
+ /// the T& ctor
+ InterfaceDef_tie (T &t);
+ /// ctor taking a POA
+ InterfaceDef_tie (T &t, PortableServer::POA_ptr poa);
+ /// ctor taking pointer and an ownership flag
+ InterfaceDef_tie (T *tp, ::CORBA::Boolean release = true);
+ /// ctor with T*, ownership flag and a POA
+ InterfaceDef_tie (
+ T *tp,
+ PortableServer::POA_ptr poa,
+ ::CORBA::Boolean release = true
+ );
+ /// dtor
+
+ ~InterfaceDef_tie (void);
+ // TIE specific functions
+ /// return the underlying object
+ T *_tied_object (void);
+ /// set the underlying object
+ void _tied_object (T &obj);
+ /// set the underlying object and the ownership flag
+ void _tied_object (T *obj, ::CORBA::Boolean release = true);
+ /// do we own it
+ ::CORBA::Boolean _is_owner (void);
+ /// set the ownership
+
+ void _is_owner ( ::CORBA::Boolean b);
+ // overridden ServantBase operations
+ PortableServer::POA_ptr _default_POA (
+ ACE_ENV_SINGLE_ARG_DECL_WITH_DEFAULTS
+ );
+
+ // TAO_IDL - Generated from
+ // be\be_visitor_operation/tie_sh.cpp:60
+
+ ::CORBA::DefinitionKind def_kind (
+ ACE_ENV_SINGLE_ARG_DECL_WITH_DEFAULTS
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ));
+
+ // TAO_IDL - Generated from
+ // be\be_visitor_operation/tie_sh.cpp:60
+
+ void destroy (
+ ACE_ENV_SINGLE_ARG_DECL_WITH_DEFAULTS
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ));
+
+ // TAO_IDL - Generated from
+ // be\be_visitor_operation/tie_sh.cpp:60
+
+ ::CORBA::Contained_ptr lookup (
+ const char * search_name
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ));
+
+ // TAO_IDL - Generated from
+ // be\be_visitor_operation/tie_sh.cpp:60
+
+ ::CORBA::ContainedSeq * contents (
+ ::CORBA::DefinitionKind limit_type,
+ ::CORBA::Boolean exclude_inherited
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ));
+
+ // TAO_IDL - Generated from
+ // be\be_visitor_operation/tie_sh.cpp:60
+
+ ::CORBA::ContainedSeq * lookup_name (
+ const char * search_name,
+ ::CORBA::Long levels_to_search,
+ ::CORBA::DefinitionKind limit_type,
+ ::CORBA::Boolean exclude_inherited
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ));
+
+ // TAO_IDL - Generated from
+ // be\be_visitor_operation/tie_sh.cpp:60
+
+ ::CORBA::Container::DescriptionSeq * describe_contents (
+ ::CORBA::DefinitionKind limit_type,
+ ::CORBA::Boolean exclude_inherited,
+ ::CORBA::Long max_returned_objs
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ));
+
+ // TAO_IDL - Generated from
+ // be\be_visitor_operation/tie_sh.cpp:60
+
+ ::CORBA::ModuleDef_ptr create_module (
+ const char * id,
+ const char * name,
+ const char * version
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ));
+
+ // TAO_IDL - Generated from
+ // be\be_visitor_operation/tie_sh.cpp:60
+
+ ::CORBA::ConstantDef_ptr create_constant (
+ const char * id,
+ const char * name,
+ const char * version,
+ ::CORBA::IDLType_ptr type,
+ const ::CORBA::Any & value
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ));
+
+ // TAO_IDL - Generated from
+ // be\be_visitor_operation/tie_sh.cpp:60
+
+ ::CORBA::StructDef_ptr create_struct (
+ const char * id,
+ const char * name,
+ const char * version,
+ const ::CORBA::StructMemberSeq & members
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ));
+
+ // TAO_IDL - Generated from
+ // be\be_visitor_operation/tie_sh.cpp:60
+
+ ::CORBA::UnionDef_ptr create_union (
+ const char * id,
+ const char * name,
+ const char * version,
+ ::CORBA::IDLType_ptr discriminator_type,
+ const ::CORBA::UnionMemberSeq & members
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ));
+
+ // TAO_IDL - Generated from
+ // be\be_visitor_operation/tie_sh.cpp:60
+
+ ::CORBA::EnumDef_ptr create_enum (
+ const char * id,
+ const char * name,
+ const char * version,
+ const ::CORBA::EnumMemberSeq & members
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ));
+
+ // TAO_IDL - Generated from
+ // be\be_visitor_operation/tie_sh.cpp:60
+
+ ::CORBA::AliasDef_ptr create_alias (
+ const char * id,
+ const char * name,
+ const char * version,
+ ::CORBA::IDLType_ptr original_type
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ));
+
+ // TAO_IDL - Generated from
+ // be\be_visitor_operation/tie_sh.cpp:60
+
+ ::CORBA::InterfaceDef_ptr create_interface (
+ const char * id,
+ const char * name,
+ const char * version,
+ const ::CORBA::InterfaceDefSeq & base_interfaces
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ));
+
+ // TAO_IDL - Generated from
+ // be\be_visitor_operation/tie_sh.cpp:60
+
+ ::CORBA::ValueDef_ptr create_value (
+ const char * id,
+ const char * name,
+ const char * version,
+ ::CORBA::Boolean is_custom,
+ ::CORBA::Boolean is_abstract,
+ ::CORBA::ValueDef_ptr base_value,
+ ::CORBA::Boolean is_truncatable,
+ const ::CORBA::ValueDefSeq & abstract_base_values,
+ const ::CORBA::InterfaceDefSeq & supported_interfaces,
+ const ::CORBA::InitializerSeq & initializers
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ));
+
+ // TAO_IDL - Generated from
+ // be\be_visitor_operation/tie_sh.cpp:60
+
+ ::CORBA::ValueBoxDef_ptr create_value_box (
+ const char * id,
+ const char * name,
+ const char * version,
+ ::CORBA::IDLType_ptr original_type_def
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ));
+
+ // TAO_IDL - Generated from
+ // be\be_visitor_operation/tie_sh.cpp:60
+
+ ::CORBA::ExceptionDef_ptr create_exception (
+ const char * id,
+ const char * name,
+ const char * version,
+ const ::CORBA::StructMemberSeq & members
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ));
+
+ // TAO_IDL - Generated from
+ // be\be_visitor_operation/tie_sh.cpp:60
+
+ ::CORBA::NativeDef_ptr create_native (
+ const char * id,
+ const char * name,
+ const char * version
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ));
+
+ // TAO_IDL - Generated from
+ // be\be_visitor_operation/tie_sh.cpp:60
+
+ ::CORBA::AbstractInterfaceDef_ptr create_abstract_interface (
+ const char * id,
+ const char * name,
+ const char * version,
+ const ::CORBA::AbstractInterfaceDefSeq & base_interfaces
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ));
+
+ // TAO_IDL - Generated from
+ // be\be_visitor_operation/tie_sh.cpp:60
+
+ ::CORBA::LocalInterfaceDef_ptr create_local_interface (
+ const char * id,
+ const char * name,
+ const char * version,
+ const ::CORBA::InterfaceDefSeq & base_interfaces
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ));
+
+ // TAO_IDL - Generated from
+ // be\be_visitor_operation/tie_sh.cpp:60
+
+ ::CORBA::ExtValueDef_ptr create_ext_value (
+ const char * id,
+ const char * name,
+ const char * version,
+ ::CORBA::Boolean is_custom,
+ ::CORBA::Boolean is_abstract,
+ ::CORBA::ValueDef_ptr base_value,
+ ::CORBA::Boolean is_truncatable,
+ const ::CORBA::ValueDefSeq & abstract_base_values,
+ const ::CORBA::InterfaceDefSeq & supported_interfaces,
+ const ::CORBA::ExtInitializerSeq & initializers
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ));
+
+ // TAO_IDL - Generated from
+ // be\be_visitor_operation/tie_sh.cpp:60
+
+ char * id (
+ ACE_ENV_SINGLE_ARG_DECL_WITH_DEFAULTS
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ));
+
+ // TAO_IDL - Generated from
+ // be\be_visitor_operation/tie_sh.cpp:60
+
+ void id (
+ const char * id
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ));
+
+ // TAO_IDL - Generated from
+ // be\be_visitor_operation/tie_sh.cpp:60
+
+ char * name (
+ ACE_ENV_SINGLE_ARG_DECL_WITH_DEFAULTS
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ));
+
+ // TAO_IDL - Generated from
+ // be\be_visitor_operation/tie_sh.cpp:60
+
+ void name (
+ const char * name
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ));
+
+ // TAO_IDL - Generated from
+ // be\be_visitor_operation/tie_sh.cpp:60
+
+ char * version (
+ ACE_ENV_SINGLE_ARG_DECL_WITH_DEFAULTS
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ));
+
+ // TAO_IDL - Generated from
+ // be\be_visitor_operation/tie_sh.cpp:60
+
+ void version (
+ const char * version
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ));
+
+ // TAO_IDL - Generated from
+ // be\be_visitor_operation/tie_sh.cpp:60
+
+ ::CORBA::Container_ptr defined_in (
+ ACE_ENV_SINGLE_ARG_DECL_WITH_DEFAULTS
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ));
+
+ // TAO_IDL - Generated from
+ // be\be_visitor_operation/tie_sh.cpp:60
+
+ char * absolute_name (
+ ACE_ENV_SINGLE_ARG_DECL_WITH_DEFAULTS
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ));
+
+ // TAO_IDL - Generated from
+ // be\be_visitor_operation/tie_sh.cpp:60
+
+ ::CORBA::Repository_ptr containing_repository (
+ ACE_ENV_SINGLE_ARG_DECL_WITH_DEFAULTS
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ));
+
+ // TAO_IDL - Generated from
+ // be\be_visitor_operation/tie_sh.cpp:60
+
+ ::CORBA::Contained::Description * describe (
+ ACE_ENV_SINGLE_ARG_DECL_WITH_DEFAULTS
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ));
+
+ // TAO_IDL - Generated from
+ // be\be_visitor_operation/tie_sh.cpp:60
+
+ void move (
+ ::CORBA::Container_ptr new_container,
+ const char * new_name,
+ const char * new_version
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ));
+
+ // TAO_IDL - Generated from
+ // be\be_visitor_operation/tie_sh.cpp:60
+
+ ::CORBA::TypeCode_ptr type (
+ ACE_ENV_SINGLE_ARG_DECL_WITH_DEFAULTS
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ));
+
+ // TAO_IDL - Generated from
+ // be\be_visitor_operation/tie_sh.cpp:60
+
+ ::CORBA::InterfaceDefSeq * base_interfaces (
+ ACE_ENV_SINGLE_ARG_DECL_WITH_DEFAULTS
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ));
+
+ // TAO_IDL - Generated from
+ // be\be_visitor_operation/tie_sh.cpp:60
+
+ void base_interfaces (
+ const ::CORBA::InterfaceDefSeq & base_interfaces
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ));
+
+ // TAO_IDL - Generated from
+ // be\be_visitor_operation/tie_sh.cpp:60
+
+ ::CORBA::Boolean is_a (
+ const char * interface_id
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ));
+
+ // TAO_IDL - Generated from
+ // be\be_visitor_operation/tie_sh.cpp:60
+
+ ::CORBA::InterfaceDef::FullInterfaceDescription * describe_interface (
+ ACE_ENV_SINGLE_ARG_DECL_WITH_DEFAULTS
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ));
+
+ // TAO_IDL - Generated from
+ // be\be_visitor_operation/tie_sh.cpp:60
+
+ ::CORBA::AttributeDef_ptr create_attribute (
+ const char * id,
+ const char * name,
+ const char * version,
+ ::CORBA::IDLType_ptr type,
+ ::CORBA::AttributeMode mode
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ));
+
+ // TAO_IDL - Generated from
+ // be\be_visitor_operation/tie_sh.cpp:60
+
+ ::CORBA::OperationDef_ptr create_operation (
+ const char * id,
+ const char * name,
+ const char * version,
+ ::CORBA::IDLType_ptr result,
+ ::CORBA::OperationMode mode,
+ const ::CORBA::ParDescriptionSeq & params,
+ const ::CORBA::ExceptionDefSeq & exceptions,
+ const ::CORBA::ContextIdSeq & contexts
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ));
+
+ private:
+ T *ptr_;
+ PortableServer::POA_var poa_;
+ ::CORBA::Boolean rel_;
+
+ // copy and assignment are not allowed
+ InterfaceDef_tie (const InterfaceDef_tie &);
+ void operator= (const InterfaceDef_tie &);
+ };
+
+ // TAO_IDL - Generated from
+ // be\be_visitor_interface/tie_sh.cpp:87
+
+ // TIE class: Refer to CORBA v2.2, Section 20.34.4
+ template <class T>
+ class InterfaceAttrExtension_tie : public InterfaceAttrExtension
+ {
+ public:
+ /// the T& ctor
+ InterfaceAttrExtension_tie (T &t);
+ /// ctor taking a POA
+ InterfaceAttrExtension_tie (T &t, PortableServer::POA_ptr poa);
+ /// ctor taking pointer and an ownership flag
+ InterfaceAttrExtension_tie (T *tp, ::CORBA::Boolean release = true);
+ /// ctor with T*, ownership flag and a POA
+ InterfaceAttrExtension_tie (
+ T *tp,
+ PortableServer::POA_ptr poa,
+ ::CORBA::Boolean release = true
+ );
+ /// dtor
+
+ ~InterfaceAttrExtension_tie (void);
+ // TIE specific functions
+ /// return the underlying object
+ T *_tied_object (void);
+ /// set the underlying object
+ void _tied_object (T &obj);
+ /// set the underlying object and the ownership flag
+ void _tied_object (T *obj, ::CORBA::Boolean release = true);
+ /// do we own it
+ ::CORBA::Boolean _is_owner (void);
+ /// set the ownership
+
+ void _is_owner ( ::CORBA::Boolean b);
+ // overridden ServantBase operations
+ PortableServer::POA_ptr _default_POA (
+ ACE_ENV_SINGLE_ARG_DECL_WITH_DEFAULTS
+ );
+
+ // TAO_IDL - Generated from
+ // be\be_visitor_operation/tie_sh.cpp:60
+
+ ::CORBA::InterfaceAttrExtension::ExtFullInterfaceDescription * describe_ext_interface (
+ ACE_ENV_SINGLE_ARG_DECL_WITH_DEFAULTS
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ));
+
+ // TAO_IDL - Generated from
+ // be\be_visitor_operation/tie_sh.cpp:60
+
+ ::CORBA::ExtAttributeDef_ptr create_ext_attribute (
+ const char * id,
+ const char * name,
+ const char * version,
+ ::CORBA::IDLType_ptr type,
+ ::CORBA::AttributeMode mode,
+ const ::CORBA::ExceptionDefSeq & get_exceptions,
+ const ::CORBA::ExceptionDefSeq & set_exceptions
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ));
+
+ private:
+ T *ptr_;
+ PortableServer::POA_var poa_;
+ ::CORBA::Boolean rel_;
+
+ // copy and assignment are not allowed
+ InterfaceAttrExtension_tie (const InterfaceAttrExtension_tie &);
+ void operator= (const InterfaceAttrExtension_tie &);
+ };
+
+ // TAO_IDL - Generated from
+ // be\be_visitor_interface/tie_sh.cpp:87
+
+ // TIE class: Refer to CORBA v2.2, Section 20.34.4
+ template <class T>
+ class ExtInterfaceDef_tie : public ExtInterfaceDef
+ {
+ public:
+ /// the T& ctor
+ ExtInterfaceDef_tie (T &t);
+ /// ctor taking a POA
+ ExtInterfaceDef_tie (T &t, PortableServer::POA_ptr poa);
+ /// ctor taking pointer and an ownership flag
+ ExtInterfaceDef_tie (T *tp, ::CORBA::Boolean release = true);
+ /// ctor with T*, ownership flag and a POA
+ ExtInterfaceDef_tie (
+ T *tp,
+ PortableServer::POA_ptr poa,
+ ::CORBA::Boolean release = true
+ );
+ /// dtor
+
+ ~ExtInterfaceDef_tie (void);
+ // TIE specific functions
+ /// return the underlying object
+ T *_tied_object (void);
+ /// set the underlying object
+ void _tied_object (T &obj);
+ /// set the underlying object and the ownership flag
+ void _tied_object (T *obj, ::CORBA::Boolean release = true);
+ /// do we own it
+ ::CORBA::Boolean _is_owner (void);
+ /// set the ownership
+
+ void _is_owner ( ::CORBA::Boolean b);
+ // overridden ServantBase operations
+ PortableServer::POA_ptr _default_POA (
+ ACE_ENV_SINGLE_ARG_DECL_WITH_DEFAULTS
+ );
+
+ // TAO_IDL - Generated from
+ // be\be_visitor_operation/tie_sh.cpp:60
+
+ ::CORBA::DefinitionKind def_kind (
+ ACE_ENV_SINGLE_ARG_DECL_WITH_DEFAULTS
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ));
+
+ // TAO_IDL - Generated from
+ // be\be_visitor_operation/tie_sh.cpp:60
+
+ void destroy (
+ ACE_ENV_SINGLE_ARG_DECL_WITH_DEFAULTS
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ));
+
+ // TAO_IDL - Generated from
+ // be\be_visitor_operation/tie_sh.cpp:60
+
+ ::CORBA::Contained_ptr lookup (
+ const char * search_name
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ));
+
+ // TAO_IDL - Generated from
+ // be\be_visitor_operation/tie_sh.cpp:60
+
+ ::CORBA::ContainedSeq * contents (
+ ::CORBA::DefinitionKind limit_type,
+ ::CORBA::Boolean exclude_inherited
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ));
+
+ // TAO_IDL - Generated from
+ // be\be_visitor_operation/tie_sh.cpp:60
+
+ ::CORBA::ContainedSeq * lookup_name (
+ const char * search_name,
+ ::CORBA::Long levels_to_search,
+ ::CORBA::DefinitionKind limit_type,
+ ::CORBA::Boolean exclude_inherited
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ));
+
+ // TAO_IDL - Generated from
+ // be\be_visitor_operation/tie_sh.cpp:60
+
+ ::CORBA::Container::DescriptionSeq * describe_contents (
+ ::CORBA::DefinitionKind limit_type,
+ ::CORBA::Boolean exclude_inherited,
+ ::CORBA::Long max_returned_objs
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ));
+
+ // TAO_IDL - Generated from
+ // be\be_visitor_operation/tie_sh.cpp:60
+
+ ::CORBA::ModuleDef_ptr create_module (
+ const char * id,
+ const char * name,
+ const char * version
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ));
+
+ // TAO_IDL - Generated from
+ // be\be_visitor_operation/tie_sh.cpp:60
+
+ ::CORBA::ConstantDef_ptr create_constant (
+ const char * id,
+ const char * name,
+ const char * version,
+ ::CORBA::IDLType_ptr type,
+ const ::CORBA::Any & value
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ));
+
+ // TAO_IDL - Generated from
+ // be\be_visitor_operation/tie_sh.cpp:60
+
+ ::CORBA::StructDef_ptr create_struct (
+ const char * id,
+ const char * name,
+ const char * version,
+ const ::CORBA::StructMemberSeq & members
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ));
+
+ // TAO_IDL - Generated from
+ // be\be_visitor_operation/tie_sh.cpp:60
+
+ ::CORBA::UnionDef_ptr create_union (
+ const char * id,
+ const char * name,
+ const char * version,
+ ::CORBA::IDLType_ptr discriminator_type,
+ const ::CORBA::UnionMemberSeq & members
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ));
+
+ // TAO_IDL - Generated from
+ // be\be_visitor_operation/tie_sh.cpp:60
+
+ ::CORBA::EnumDef_ptr create_enum (
+ const char * id,
+ const char * name,
+ const char * version,
+ const ::CORBA::EnumMemberSeq & members
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ));
+
+ // TAO_IDL - Generated from
+ // be\be_visitor_operation/tie_sh.cpp:60
+
+ ::CORBA::AliasDef_ptr create_alias (
+ const char * id,
+ const char * name,
+ const char * version,
+ ::CORBA::IDLType_ptr original_type
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ));
+
+ // TAO_IDL - Generated from
+ // be\be_visitor_operation/tie_sh.cpp:60
+
+ ::CORBA::InterfaceDef_ptr create_interface (
+ const char * id,
+ const char * name,
+ const char * version,
+ const ::CORBA::InterfaceDefSeq & base_interfaces
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ));
+
+ // TAO_IDL - Generated from
+ // be\be_visitor_operation/tie_sh.cpp:60
+
+ ::CORBA::ValueDef_ptr create_value (
+ const char * id,
+ const char * name,
+ const char * version,
+ ::CORBA::Boolean is_custom,
+ ::CORBA::Boolean is_abstract,
+ ::CORBA::ValueDef_ptr base_value,
+ ::CORBA::Boolean is_truncatable,
+ const ::CORBA::ValueDefSeq & abstract_base_values,
+ const ::CORBA::InterfaceDefSeq & supported_interfaces,
+ const ::CORBA::InitializerSeq & initializers
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ));
+
+ // TAO_IDL - Generated from
+ // be\be_visitor_operation/tie_sh.cpp:60
+
+ ::CORBA::ValueBoxDef_ptr create_value_box (
+ const char * id,
+ const char * name,
+ const char * version,
+ ::CORBA::IDLType_ptr original_type_def
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ));
+
+ // TAO_IDL - Generated from
+ // be\be_visitor_operation/tie_sh.cpp:60
+
+ ::CORBA::ExceptionDef_ptr create_exception (
+ const char * id,
+ const char * name,
+ const char * version,
+ const ::CORBA::StructMemberSeq & members
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ));
+
+ // TAO_IDL - Generated from
+ // be\be_visitor_operation/tie_sh.cpp:60
+
+ ::CORBA::NativeDef_ptr create_native (
+ const char * id,
+ const char * name,
+ const char * version
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ));
+
+ // TAO_IDL - Generated from
+ // be\be_visitor_operation/tie_sh.cpp:60
+
+ ::CORBA::AbstractInterfaceDef_ptr create_abstract_interface (
+ const char * id,
+ const char * name,
+ const char * version,
+ const ::CORBA::AbstractInterfaceDefSeq & base_interfaces
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ));
+
+ // TAO_IDL - Generated from
+ // be\be_visitor_operation/tie_sh.cpp:60
+
+ ::CORBA::LocalInterfaceDef_ptr create_local_interface (
+ const char * id,
+ const char * name,
+ const char * version,
+ const ::CORBA::InterfaceDefSeq & base_interfaces
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ));
+
+ // TAO_IDL - Generated from
+ // be\be_visitor_operation/tie_sh.cpp:60
+
+ ::CORBA::ExtValueDef_ptr create_ext_value (
+ const char * id,
+ const char * name,
+ const char * version,
+ ::CORBA::Boolean is_custom,
+ ::CORBA::Boolean is_abstract,
+ ::CORBA::ValueDef_ptr base_value,
+ ::CORBA::Boolean is_truncatable,
+ const ::CORBA::ValueDefSeq & abstract_base_values,
+ const ::CORBA::InterfaceDefSeq & supported_interfaces,
+ const ::CORBA::ExtInitializerSeq & initializers
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ));
+
+ // TAO_IDL - Generated from
+ // be\be_visitor_operation/tie_sh.cpp:60
+
+ char * id (
+ ACE_ENV_SINGLE_ARG_DECL_WITH_DEFAULTS
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ));
+
+ // TAO_IDL - Generated from
+ // be\be_visitor_operation/tie_sh.cpp:60
+
+ void id (
+ const char * id
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ));
+
+ // TAO_IDL - Generated from
+ // be\be_visitor_operation/tie_sh.cpp:60
+
+ char * name (
+ ACE_ENV_SINGLE_ARG_DECL_WITH_DEFAULTS
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ));
+
+ // TAO_IDL - Generated from
+ // be\be_visitor_operation/tie_sh.cpp:60
+
+ void name (
+ const char * name
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ));
+
+ // TAO_IDL - Generated from
+ // be\be_visitor_operation/tie_sh.cpp:60
+
+ char * version (
+ ACE_ENV_SINGLE_ARG_DECL_WITH_DEFAULTS
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ));
+
+ // TAO_IDL - Generated from
+ // be\be_visitor_operation/tie_sh.cpp:60
+
+ void version (
+ const char * version
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ));
+
+ // TAO_IDL - Generated from
+ // be\be_visitor_operation/tie_sh.cpp:60
+
+ ::CORBA::Container_ptr defined_in (
+ ACE_ENV_SINGLE_ARG_DECL_WITH_DEFAULTS
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ));
+
+ // TAO_IDL - Generated from
+ // be\be_visitor_operation/tie_sh.cpp:60
+
+ char * absolute_name (
+ ACE_ENV_SINGLE_ARG_DECL_WITH_DEFAULTS
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ));
+
+ // TAO_IDL - Generated from
+ // be\be_visitor_operation/tie_sh.cpp:60
+
+ ::CORBA::Repository_ptr containing_repository (
+ ACE_ENV_SINGLE_ARG_DECL_WITH_DEFAULTS
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ));
+
+ // TAO_IDL - Generated from
+ // be\be_visitor_operation/tie_sh.cpp:60
+
+ ::CORBA::Contained::Description * describe (
+ ACE_ENV_SINGLE_ARG_DECL_WITH_DEFAULTS
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ));
+
+ // TAO_IDL - Generated from
+ // be\be_visitor_operation/tie_sh.cpp:60
+
+ void move (
+ ::CORBA::Container_ptr new_container,
+ const char * new_name,
+ const char * new_version
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ));
+
+ // TAO_IDL - Generated from
+ // be\be_visitor_operation/tie_sh.cpp:60
+
+ ::CORBA::TypeCode_ptr type (
+ ACE_ENV_SINGLE_ARG_DECL_WITH_DEFAULTS
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ));
+
+ // TAO_IDL - Generated from
+ // be\be_visitor_operation/tie_sh.cpp:60
+
+ ::CORBA::InterfaceDefSeq * base_interfaces (
+ ACE_ENV_SINGLE_ARG_DECL_WITH_DEFAULTS
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ));
+
+ // TAO_IDL - Generated from
+ // be\be_visitor_operation/tie_sh.cpp:60
+
+ void base_interfaces (
+ const ::CORBA::InterfaceDefSeq & base_interfaces
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ));
+
+ // TAO_IDL - Generated from
+ // be\be_visitor_operation/tie_sh.cpp:60
+
+ ::CORBA::Boolean is_a (
+ const char * interface_id
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ));
+
+ // TAO_IDL - Generated from
+ // be\be_visitor_operation/tie_sh.cpp:60
+
+ ::CORBA::InterfaceDef::FullInterfaceDescription * describe_interface (
+ ACE_ENV_SINGLE_ARG_DECL_WITH_DEFAULTS
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ));
+
+ // TAO_IDL - Generated from
+ // be\be_visitor_operation/tie_sh.cpp:60
+
+ ::CORBA::AttributeDef_ptr create_attribute (
+ const char * id,
+ const char * name,
+ const char * version,
+ ::CORBA::IDLType_ptr type,
+ ::CORBA::AttributeMode mode
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ));
+
+ // TAO_IDL - Generated from
+ // be\be_visitor_operation/tie_sh.cpp:60
+
+ ::CORBA::OperationDef_ptr create_operation (
+ const char * id,
+ const char * name,
+ const char * version,
+ ::CORBA::IDLType_ptr result,
+ ::CORBA::OperationMode mode,
+ const ::CORBA::ParDescriptionSeq & params,
+ const ::CORBA::ExceptionDefSeq & exceptions,
+ const ::CORBA::ContextIdSeq & contexts
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ));
+
+ // TAO_IDL - Generated from
+ // be\be_visitor_operation/tie_sh.cpp:60
+
+ ::CORBA::InterfaceAttrExtension::ExtFullInterfaceDescription * describe_ext_interface (
+ ACE_ENV_SINGLE_ARG_DECL_WITH_DEFAULTS
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ));
+
+ // TAO_IDL - Generated from
+ // be\be_visitor_operation/tie_sh.cpp:60
+
+ ::CORBA::ExtAttributeDef_ptr create_ext_attribute (
+ const char * id,
+ const char * name,
+ const char * version,
+ ::CORBA::IDLType_ptr type,
+ ::CORBA::AttributeMode mode,
+ const ::CORBA::ExceptionDefSeq & get_exceptions,
+ const ::CORBA::ExceptionDefSeq & set_exceptions
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ));
+
+ private:
+ T *ptr_;
+ PortableServer::POA_var poa_;
+ ::CORBA::Boolean rel_;
+
+ // copy and assignment are not allowed
+ ExtInterfaceDef_tie (const ExtInterfaceDef_tie &);
+ void operator= (const ExtInterfaceDef_tie &);
+ };
+
+ // TAO_IDL - Generated from
+ // be\be_visitor_interface/tie_sh.cpp:87
+
+ // TIE class: Refer to CORBA v2.2, Section 20.34.4
+ template <class T>
+ class AbstractInterfaceDef_tie : public AbstractInterfaceDef
+ {
+ public:
+ /// the T& ctor
+ AbstractInterfaceDef_tie (T &t);
+ /// ctor taking a POA
+ AbstractInterfaceDef_tie (T &t, PortableServer::POA_ptr poa);
+ /// ctor taking pointer and an ownership flag
+ AbstractInterfaceDef_tie (T *tp, ::CORBA::Boolean release = true);
+ /// ctor with T*, ownership flag and a POA
+ AbstractInterfaceDef_tie (
+ T *tp,
+ PortableServer::POA_ptr poa,
+ ::CORBA::Boolean release = true
+ );
+ /// dtor
+
+ ~AbstractInterfaceDef_tie (void);
+ // TIE specific functions
+ /// return the underlying object
+ T *_tied_object (void);
+ /// set the underlying object
+ void _tied_object (T &obj);
+ /// set the underlying object and the ownership flag
+ void _tied_object (T *obj, ::CORBA::Boolean release = true);
+ /// do we own it
+ ::CORBA::Boolean _is_owner (void);
+ /// set the ownership
+
+ void _is_owner ( ::CORBA::Boolean b);
+ // overridden ServantBase operations
+ PortableServer::POA_ptr _default_POA (
+ ACE_ENV_SINGLE_ARG_DECL_WITH_DEFAULTS
+ );
+
+ // TAO_IDL - Generated from
+ // be\be_visitor_operation/tie_sh.cpp:60
+
+ ::CORBA::DefinitionKind def_kind (
+ ACE_ENV_SINGLE_ARG_DECL_WITH_DEFAULTS
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ));
+
+ // TAO_IDL - Generated from
+ // be\be_visitor_operation/tie_sh.cpp:60
+
+ void destroy (
+ ACE_ENV_SINGLE_ARG_DECL_WITH_DEFAULTS
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ));
+
+ // TAO_IDL - Generated from
+ // be\be_visitor_operation/tie_sh.cpp:60
+
+ ::CORBA::Contained_ptr lookup (
+ const char * search_name
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ));
+
+ // TAO_IDL - Generated from
+ // be\be_visitor_operation/tie_sh.cpp:60
+
+ ::CORBA::ContainedSeq * contents (
+ ::CORBA::DefinitionKind limit_type,
+ ::CORBA::Boolean exclude_inherited
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ));
+
+ // TAO_IDL - Generated from
+ // be\be_visitor_operation/tie_sh.cpp:60
+
+ ::CORBA::ContainedSeq * lookup_name (
+ const char * search_name,
+ ::CORBA::Long levels_to_search,
+ ::CORBA::DefinitionKind limit_type,
+ ::CORBA::Boolean exclude_inherited
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ));
+
+ // TAO_IDL - Generated from
+ // be\be_visitor_operation/tie_sh.cpp:60
+
+ ::CORBA::Container::DescriptionSeq * describe_contents (
+ ::CORBA::DefinitionKind limit_type,
+ ::CORBA::Boolean exclude_inherited,
+ ::CORBA::Long max_returned_objs
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ));
+
+ // TAO_IDL - Generated from
+ // be\be_visitor_operation/tie_sh.cpp:60
+
+ ::CORBA::ModuleDef_ptr create_module (
+ const char * id,
+ const char * name,
+ const char * version
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ));
+
+ // TAO_IDL - Generated from
+ // be\be_visitor_operation/tie_sh.cpp:60
+
+ ::CORBA::ConstantDef_ptr create_constant (
+ const char * id,
+ const char * name,
+ const char * version,
+ ::CORBA::IDLType_ptr type,
+ const ::CORBA::Any & value
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ));
+
+ // TAO_IDL - Generated from
+ // be\be_visitor_operation/tie_sh.cpp:60
+
+ ::CORBA::StructDef_ptr create_struct (
+ const char * id,
+ const char * name,
+ const char * version,
+ const ::CORBA::StructMemberSeq & members
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ));
+
+ // TAO_IDL - Generated from
+ // be\be_visitor_operation/tie_sh.cpp:60
+
+ ::CORBA::UnionDef_ptr create_union (
+ const char * id,
+ const char * name,
+ const char * version,
+ ::CORBA::IDLType_ptr discriminator_type,
+ const ::CORBA::UnionMemberSeq & members
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ));
+
+ // TAO_IDL - Generated from
+ // be\be_visitor_operation/tie_sh.cpp:60
+
+ ::CORBA::EnumDef_ptr create_enum (
+ const char * id,
+ const char * name,
+ const char * version,
+ const ::CORBA::EnumMemberSeq & members
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ));
+
+ // TAO_IDL - Generated from
+ // be\be_visitor_operation/tie_sh.cpp:60
+
+ ::CORBA::AliasDef_ptr create_alias (
+ const char * id,
+ const char * name,
+ const char * version,
+ ::CORBA::IDLType_ptr original_type
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ));
+
+ // TAO_IDL - Generated from
+ // be\be_visitor_operation/tie_sh.cpp:60
+
+ ::CORBA::InterfaceDef_ptr create_interface (
+ const char * id,
+ const char * name,
+ const char * version,
+ const ::CORBA::InterfaceDefSeq & base_interfaces
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ));
+
+ // TAO_IDL - Generated from
+ // be\be_visitor_operation/tie_sh.cpp:60
+
+ ::CORBA::ValueDef_ptr create_value (
+ const char * id,
+ const char * name,
+ const char * version,
+ ::CORBA::Boolean is_custom,
+ ::CORBA::Boolean is_abstract,
+ ::CORBA::ValueDef_ptr base_value,
+ ::CORBA::Boolean is_truncatable,
+ const ::CORBA::ValueDefSeq & abstract_base_values,
+ const ::CORBA::InterfaceDefSeq & supported_interfaces,
+ const ::CORBA::InitializerSeq & initializers
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ));
+
+ // TAO_IDL - Generated from
+ // be\be_visitor_operation/tie_sh.cpp:60
+
+ ::CORBA::ValueBoxDef_ptr create_value_box (
+ const char * id,
+ const char * name,
+ const char * version,
+ ::CORBA::IDLType_ptr original_type_def
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ));
+
+ // TAO_IDL - Generated from
+ // be\be_visitor_operation/tie_sh.cpp:60
+
+ ::CORBA::ExceptionDef_ptr create_exception (
+ const char * id,
+ const char * name,
+ const char * version,
+ const ::CORBA::StructMemberSeq & members
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ));
+
+ // TAO_IDL - Generated from
+ // be\be_visitor_operation/tie_sh.cpp:60
+
+ ::CORBA::NativeDef_ptr create_native (
+ const char * id,
+ const char * name,
+ const char * version
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ));
+
+ // TAO_IDL - Generated from
+ // be\be_visitor_operation/tie_sh.cpp:60
+
+ ::CORBA::AbstractInterfaceDef_ptr create_abstract_interface (
+ const char * id,
+ const char * name,
+ const char * version,
+ const ::CORBA::AbstractInterfaceDefSeq & base_interfaces
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ));
+
+ // TAO_IDL - Generated from
+ // be\be_visitor_operation/tie_sh.cpp:60
+
+ ::CORBA::LocalInterfaceDef_ptr create_local_interface (
+ const char * id,
+ const char * name,
+ const char * version,
+ const ::CORBA::InterfaceDefSeq & base_interfaces
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ));
+
+ // TAO_IDL - Generated from
+ // be\be_visitor_operation/tie_sh.cpp:60
+
+ ::CORBA::ExtValueDef_ptr create_ext_value (
+ const char * id,
+ const char * name,
+ const char * version,
+ ::CORBA::Boolean is_custom,
+ ::CORBA::Boolean is_abstract,
+ ::CORBA::ValueDef_ptr base_value,
+ ::CORBA::Boolean is_truncatable,
+ const ::CORBA::ValueDefSeq & abstract_base_values,
+ const ::CORBA::InterfaceDefSeq & supported_interfaces,
+ const ::CORBA::ExtInitializerSeq & initializers
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ));
+
+ // TAO_IDL - Generated from
+ // be\be_visitor_operation/tie_sh.cpp:60
+
+ char * id (
+ ACE_ENV_SINGLE_ARG_DECL_WITH_DEFAULTS
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ));
+
+ // TAO_IDL - Generated from
+ // be\be_visitor_operation/tie_sh.cpp:60
+
+ void id (
+ const char * id
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ));
+
+ // TAO_IDL - Generated from
+ // be\be_visitor_operation/tie_sh.cpp:60
+
+ char * name (
+ ACE_ENV_SINGLE_ARG_DECL_WITH_DEFAULTS
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ));
+
+ // TAO_IDL - Generated from
+ // be\be_visitor_operation/tie_sh.cpp:60
+
+ void name (
+ const char * name
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ));
+
+ // TAO_IDL - Generated from
+ // be\be_visitor_operation/tie_sh.cpp:60
+
+ char * version (
+ ACE_ENV_SINGLE_ARG_DECL_WITH_DEFAULTS
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ));
+
+ // TAO_IDL - Generated from
+ // be\be_visitor_operation/tie_sh.cpp:60
+
+ void version (
+ const char * version
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ));
+
+ // TAO_IDL - Generated from
+ // be\be_visitor_operation/tie_sh.cpp:60
+
+ ::CORBA::Container_ptr defined_in (
+ ACE_ENV_SINGLE_ARG_DECL_WITH_DEFAULTS
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ));
+
+ // TAO_IDL - Generated from
+ // be\be_visitor_operation/tie_sh.cpp:60
+
+ char * absolute_name (
+ ACE_ENV_SINGLE_ARG_DECL_WITH_DEFAULTS
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ));
+
+ // TAO_IDL - Generated from
+ // be\be_visitor_operation/tie_sh.cpp:60
+
+ ::CORBA::Repository_ptr containing_repository (
+ ACE_ENV_SINGLE_ARG_DECL_WITH_DEFAULTS
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ));
+
+ // TAO_IDL - Generated from
+ // be\be_visitor_operation/tie_sh.cpp:60
+
+ ::CORBA::Contained::Description * describe (
+ ACE_ENV_SINGLE_ARG_DECL_WITH_DEFAULTS
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ));
+
+ // TAO_IDL - Generated from
+ // be\be_visitor_operation/tie_sh.cpp:60
+
+ void move (
+ ::CORBA::Container_ptr new_container,
+ const char * new_name,
+ const char * new_version
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ));
+
+ // TAO_IDL - Generated from
+ // be\be_visitor_operation/tie_sh.cpp:60
+
+ ::CORBA::TypeCode_ptr type (
+ ACE_ENV_SINGLE_ARG_DECL_WITH_DEFAULTS
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ));
+
+ // TAO_IDL - Generated from
+ // be\be_visitor_operation/tie_sh.cpp:60
+
+ ::CORBA::InterfaceDefSeq * base_interfaces (
+ ACE_ENV_SINGLE_ARG_DECL_WITH_DEFAULTS
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ));
+
+ // TAO_IDL - Generated from
+ // be\be_visitor_operation/tie_sh.cpp:60
+
+ void base_interfaces (
+ const ::CORBA::InterfaceDefSeq & base_interfaces
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ));
+
+ // TAO_IDL - Generated from
+ // be\be_visitor_operation/tie_sh.cpp:60
+
+ ::CORBA::Boolean is_a (
+ const char * interface_id
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ));
+
+ // TAO_IDL - Generated from
+ // be\be_visitor_operation/tie_sh.cpp:60
+
+ ::CORBA::InterfaceDef::FullInterfaceDescription * describe_interface (
+ ACE_ENV_SINGLE_ARG_DECL_WITH_DEFAULTS
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ));
+
+ // TAO_IDL - Generated from
+ // be\be_visitor_operation/tie_sh.cpp:60
+
+ ::CORBA::AttributeDef_ptr create_attribute (
+ const char * id,
+ const char * name,
+ const char * version,
+ ::CORBA::IDLType_ptr type,
+ ::CORBA::AttributeMode mode
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ));
+
+ // TAO_IDL - Generated from
+ // be\be_visitor_operation/tie_sh.cpp:60
+
+ ::CORBA::OperationDef_ptr create_operation (
+ const char * id,
+ const char * name,
+ const char * version,
+ ::CORBA::IDLType_ptr result,
+ ::CORBA::OperationMode mode,
+ const ::CORBA::ParDescriptionSeq & params,
+ const ::CORBA::ExceptionDefSeq & exceptions,
+ const ::CORBA::ContextIdSeq & contexts
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ));
+
+ private:
+ T *ptr_;
+ PortableServer::POA_var poa_;
+ ::CORBA::Boolean rel_;
+
+ // copy and assignment are not allowed
+ AbstractInterfaceDef_tie (const AbstractInterfaceDef_tie &);
+ void operator= (const AbstractInterfaceDef_tie &);
+ };
+
+ // TAO_IDL - Generated from
+ // be\be_visitor_interface/tie_sh.cpp:87
+
+ // TIE class: Refer to CORBA v2.2, Section 20.34.4
+ template <class T>
+ class ExtAbstractInterfaceDef_tie : public ExtAbstractInterfaceDef
+ {
+ public:
+ /// the T& ctor
+ ExtAbstractInterfaceDef_tie (T &t);
+ /// ctor taking a POA
+ ExtAbstractInterfaceDef_tie (T &t, PortableServer::POA_ptr poa);
+ /// ctor taking pointer and an ownership flag
+ ExtAbstractInterfaceDef_tie (T *tp, ::CORBA::Boolean release = true);
+ /// ctor with T*, ownership flag and a POA
+ ExtAbstractInterfaceDef_tie (
+ T *tp,
+ PortableServer::POA_ptr poa,
+ ::CORBA::Boolean release = true
+ );
+ /// dtor
+
+ ~ExtAbstractInterfaceDef_tie (void);
+ // TIE specific functions
+ /// return the underlying object
+ T *_tied_object (void);
+ /// set the underlying object
+ void _tied_object (T &obj);
+ /// set the underlying object and the ownership flag
+ void _tied_object (T *obj, ::CORBA::Boolean release = true);
+ /// do we own it
+ ::CORBA::Boolean _is_owner (void);
+ /// set the ownership
+
+ void _is_owner ( ::CORBA::Boolean b);
+ // overridden ServantBase operations
+ PortableServer::POA_ptr _default_POA (
+ ACE_ENV_SINGLE_ARG_DECL_WITH_DEFAULTS
+ );
+
+ // TAO_IDL - Generated from
+ // be\be_visitor_operation/tie_sh.cpp:60
+
+ ::CORBA::DefinitionKind def_kind (
+ ACE_ENV_SINGLE_ARG_DECL_WITH_DEFAULTS
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ));
+
+ // TAO_IDL - Generated from
+ // be\be_visitor_operation/tie_sh.cpp:60
+
+ void destroy (
+ ACE_ENV_SINGLE_ARG_DECL_WITH_DEFAULTS
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ));
+
+ // TAO_IDL - Generated from
+ // be\be_visitor_operation/tie_sh.cpp:60
+
+ ::CORBA::Contained_ptr lookup (
+ const char * search_name
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ));
+
+ // TAO_IDL - Generated from
+ // be\be_visitor_operation/tie_sh.cpp:60
+
+ ::CORBA::ContainedSeq * contents (
+ ::CORBA::DefinitionKind limit_type,
+ ::CORBA::Boolean exclude_inherited
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ));
+
+ // TAO_IDL - Generated from
+ // be\be_visitor_operation/tie_sh.cpp:60
+
+ ::CORBA::ContainedSeq * lookup_name (
+ const char * search_name,
+ ::CORBA::Long levels_to_search,
+ ::CORBA::DefinitionKind limit_type,
+ ::CORBA::Boolean exclude_inherited
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ));
+
+ // TAO_IDL - Generated from
+ // be\be_visitor_operation/tie_sh.cpp:60
+
+ ::CORBA::Container::DescriptionSeq * describe_contents (
+ ::CORBA::DefinitionKind limit_type,
+ ::CORBA::Boolean exclude_inherited,
+ ::CORBA::Long max_returned_objs
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ));
+
+ // TAO_IDL - Generated from
+ // be\be_visitor_operation/tie_sh.cpp:60
+
+ ::CORBA::ModuleDef_ptr create_module (
+ const char * id,
+ const char * name,
+ const char * version
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ));
+
+ // TAO_IDL - Generated from
+ // be\be_visitor_operation/tie_sh.cpp:60
+
+ ::CORBA::ConstantDef_ptr create_constant (
+ const char * id,
+ const char * name,
+ const char * version,
+ ::CORBA::IDLType_ptr type,
+ const ::CORBA::Any & value
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ));
+
+ // TAO_IDL - Generated from
+ // be\be_visitor_operation/tie_sh.cpp:60
+
+ ::CORBA::StructDef_ptr create_struct (
+ const char * id,
+ const char * name,
+ const char * version,
+ const ::CORBA::StructMemberSeq & members
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ));
+
+ // TAO_IDL - Generated from
+ // be\be_visitor_operation/tie_sh.cpp:60
+
+ ::CORBA::UnionDef_ptr create_union (
+ const char * id,
+ const char * name,
+ const char * version,
+ ::CORBA::IDLType_ptr discriminator_type,
+ const ::CORBA::UnionMemberSeq & members
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ));
+
+ // TAO_IDL - Generated from
+ // be\be_visitor_operation/tie_sh.cpp:60
+
+ ::CORBA::EnumDef_ptr create_enum (
+ const char * id,
+ const char * name,
+ const char * version,
+ const ::CORBA::EnumMemberSeq & members
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ));
+
+ // TAO_IDL - Generated from
+ // be\be_visitor_operation/tie_sh.cpp:60
+
+ ::CORBA::AliasDef_ptr create_alias (
+ const char * id,
+ const char * name,
+ const char * version,
+ ::CORBA::IDLType_ptr original_type
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ));
+
+ // TAO_IDL - Generated from
+ // be\be_visitor_operation/tie_sh.cpp:60
+
+ ::CORBA::InterfaceDef_ptr create_interface (
+ const char * id,
+ const char * name,
+ const char * version,
+ const ::CORBA::InterfaceDefSeq & base_interfaces
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ));
+
+ // TAO_IDL - Generated from
+ // be\be_visitor_operation/tie_sh.cpp:60
+
+ ::CORBA::ValueDef_ptr create_value (
+ const char * id,
+ const char * name,
+ const char * version,
+ ::CORBA::Boolean is_custom,
+ ::CORBA::Boolean is_abstract,
+ ::CORBA::ValueDef_ptr base_value,
+ ::CORBA::Boolean is_truncatable,
+ const ::CORBA::ValueDefSeq & abstract_base_values,
+ const ::CORBA::InterfaceDefSeq & supported_interfaces,
+ const ::CORBA::InitializerSeq & initializers
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ));
+
+ // TAO_IDL - Generated from
+ // be\be_visitor_operation/tie_sh.cpp:60
+
+ ::CORBA::ValueBoxDef_ptr create_value_box (
+ const char * id,
+ const char * name,
+ const char * version,
+ ::CORBA::IDLType_ptr original_type_def
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ));
+
+ // TAO_IDL - Generated from
+ // be\be_visitor_operation/tie_sh.cpp:60
+
+ ::CORBA::ExceptionDef_ptr create_exception (
+ const char * id,
+ const char * name,
+ const char * version,
+ const ::CORBA::StructMemberSeq & members
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ));
+
+ // TAO_IDL - Generated from
+ // be\be_visitor_operation/tie_sh.cpp:60
+
+ ::CORBA::NativeDef_ptr create_native (
+ const char * id,
+ const char * name,
+ const char * version
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ));
+
+ // TAO_IDL - Generated from
+ // be\be_visitor_operation/tie_sh.cpp:60
+
+ ::CORBA::AbstractInterfaceDef_ptr create_abstract_interface (
+ const char * id,
+ const char * name,
+ const char * version,
+ const ::CORBA::AbstractInterfaceDefSeq & base_interfaces
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ));
+
+ // TAO_IDL - Generated from
+ // be\be_visitor_operation/tie_sh.cpp:60
+
+ ::CORBA::LocalInterfaceDef_ptr create_local_interface (
+ const char * id,
+ const char * name,
+ const char * version,
+ const ::CORBA::InterfaceDefSeq & base_interfaces
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ));
+
+ // TAO_IDL - Generated from
+ // be\be_visitor_operation/tie_sh.cpp:60
+
+ ::CORBA::ExtValueDef_ptr create_ext_value (
+ const char * id,
+ const char * name,
+ const char * version,
+ ::CORBA::Boolean is_custom,
+ ::CORBA::Boolean is_abstract,
+ ::CORBA::ValueDef_ptr base_value,
+ ::CORBA::Boolean is_truncatable,
+ const ::CORBA::ValueDefSeq & abstract_base_values,
+ const ::CORBA::InterfaceDefSeq & supported_interfaces,
+ const ::CORBA::ExtInitializerSeq & initializers
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ));
+
+ // TAO_IDL - Generated from
+ // be\be_visitor_operation/tie_sh.cpp:60
+
+ char * id (
+ ACE_ENV_SINGLE_ARG_DECL_WITH_DEFAULTS
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ));
+
+ // TAO_IDL - Generated from
+ // be\be_visitor_operation/tie_sh.cpp:60
+
+ void id (
+ const char * id
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ));
+
+ // TAO_IDL - Generated from
+ // be\be_visitor_operation/tie_sh.cpp:60
+
+ char * name (
+ ACE_ENV_SINGLE_ARG_DECL_WITH_DEFAULTS
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ));
+
+ // TAO_IDL - Generated from
+ // be\be_visitor_operation/tie_sh.cpp:60
+
+ void name (
+ const char * name
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ));
+
+ // TAO_IDL - Generated from
+ // be\be_visitor_operation/tie_sh.cpp:60
+
+ char * version (
+ ACE_ENV_SINGLE_ARG_DECL_WITH_DEFAULTS
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ));
+
+ // TAO_IDL - Generated from
+ // be\be_visitor_operation/tie_sh.cpp:60
+
+ void version (
+ const char * version
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ));
+
+ // TAO_IDL - Generated from
+ // be\be_visitor_operation/tie_sh.cpp:60
+
+ ::CORBA::Container_ptr defined_in (
+ ACE_ENV_SINGLE_ARG_DECL_WITH_DEFAULTS
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ));
+
+ // TAO_IDL - Generated from
+ // be\be_visitor_operation/tie_sh.cpp:60
+
+ char * absolute_name (
+ ACE_ENV_SINGLE_ARG_DECL_WITH_DEFAULTS
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ));
+
+ // TAO_IDL - Generated from
+ // be\be_visitor_operation/tie_sh.cpp:60
+
+ ::CORBA::Repository_ptr containing_repository (
+ ACE_ENV_SINGLE_ARG_DECL_WITH_DEFAULTS
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ));
+
+ // TAO_IDL - Generated from
+ // be\be_visitor_operation/tie_sh.cpp:60
+
+ ::CORBA::Contained::Description * describe (
+ ACE_ENV_SINGLE_ARG_DECL_WITH_DEFAULTS
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ));
+
+ // TAO_IDL - Generated from
+ // be\be_visitor_operation/tie_sh.cpp:60
+
+ void move (
+ ::CORBA::Container_ptr new_container,
+ const char * new_name,
+ const char * new_version
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ));
+
+ // TAO_IDL - Generated from
+ // be\be_visitor_operation/tie_sh.cpp:60
+
+ ::CORBA::TypeCode_ptr type (
+ ACE_ENV_SINGLE_ARG_DECL_WITH_DEFAULTS
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ));
+
+ // TAO_IDL - Generated from
+ // be\be_visitor_operation/tie_sh.cpp:60
+
+ ::CORBA::InterfaceDefSeq * base_interfaces (
+ ACE_ENV_SINGLE_ARG_DECL_WITH_DEFAULTS
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ));
+
+ // TAO_IDL - Generated from
+ // be\be_visitor_operation/tie_sh.cpp:60
+
+ void base_interfaces (
+ const ::CORBA::InterfaceDefSeq & base_interfaces
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ));
+
+ // TAO_IDL - Generated from
+ // be\be_visitor_operation/tie_sh.cpp:60
+
+ ::CORBA::Boolean is_a (
+ const char * interface_id
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ));
+
+ // TAO_IDL - Generated from
+ // be\be_visitor_operation/tie_sh.cpp:60
+
+ ::CORBA::InterfaceDef::FullInterfaceDescription * describe_interface (
+ ACE_ENV_SINGLE_ARG_DECL_WITH_DEFAULTS
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ));
+
+ // TAO_IDL - Generated from
+ // be\be_visitor_operation/tie_sh.cpp:60
+
+ ::CORBA::AttributeDef_ptr create_attribute (
+ const char * id,
+ const char * name,
+ const char * version,
+ ::CORBA::IDLType_ptr type,
+ ::CORBA::AttributeMode mode
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ));
+
+ // TAO_IDL - Generated from
+ // be\be_visitor_operation/tie_sh.cpp:60
+
+ ::CORBA::OperationDef_ptr create_operation (
+ const char * id,
+ const char * name,
+ const char * version,
+ ::CORBA::IDLType_ptr result,
+ ::CORBA::OperationMode mode,
+ const ::CORBA::ParDescriptionSeq & params,
+ const ::CORBA::ExceptionDefSeq & exceptions,
+ const ::CORBA::ContextIdSeq & contexts
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ));
+
+ // TAO_IDL - Generated from
+ // be\be_visitor_operation/tie_sh.cpp:60
+
+ ::CORBA::InterfaceAttrExtension::ExtFullInterfaceDescription * describe_ext_interface (
+ ACE_ENV_SINGLE_ARG_DECL_WITH_DEFAULTS
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ));
+
+ // TAO_IDL - Generated from
+ // be\be_visitor_operation/tie_sh.cpp:60
+
+ ::CORBA::ExtAttributeDef_ptr create_ext_attribute (
+ const char * id,
+ const char * name,
+ const char * version,
+ ::CORBA::IDLType_ptr type,
+ ::CORBA::AttributeMode mode,
+ const ::CORBA::ExceptionDefSeq & get_exceptions,
+ const ::CORBA::ExceptionDefSeq & set_exceptions
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ));
+
+ private:
+ T *ptr_;
+ PortableServer::POA_var poa_;
+ ::CORBA::Boolean rel_;
+
+ // copy and assignment are not allowed
+ ExtAbstractInterfaceDef_tie (const ExtAbstractInterfaceDef_tie &);
+ void operator= (const ExtAbstractInterfaceDef_tie &);
+ };
+
+ // TAO_IDL - Generated from
+ // be\be_visitor_interface/tie_sh.cpp:87
+
+ // TIE class: Refer to CORBA v2.2, Section 20.34.4
+ template <class T>
+ class LocalInterfaceDef_tie : public LocalInterfaceDef
+ {
+ public:
+ /// the T& ctor
+ LocalInterfaceDef_tie (T &t);
+ /// ctor taking a POA
+ LocalInterfaceDef_tie (T &t, PortableServer::POA_ptr poa);
+ /// ctor taking pointer and an ownership flag
+ LocalInterfaceDef_tie (T *tp, ::CORBA::Boolean release = true);
+ /// ctor with T*, ownership flag and a POA
+ LocalInterfaceDef_tie (
+ T *tp,
+ PortableServer::POA_ptr poa,
+ ::CORBA::Boolean release = true
+ );
+ /// dtor
+
+ ~LocalInterfaceDef_tie (void);
+ // TIE specific functions
+ /// return the underlying object
+ T *_tied_object (void);
+ /// set the underlying object
+ void _tied_object (T &obj);
+ /// set the underlying object and the ownership flag
+ void _tied_object (T *obj, ::CORBA::Boolean release = true);
+ /// do we own it
+ ::CORBA::Boolean _is_owner (void);
+ /// set the ownership
+
+ void _is_owner ( ::CORBA::Boolean b);
+ // overridden ServantBase operations
+ PortableServer::POA_ptr _default_POA (
+ ACE_ENV_SINGLE_ARG_DECL_WITH_DEFAULTS
+ );
+
+ // TAO_IDL - Generated from
+ // be\be_visitor_operation/tie_sh.cpp:60
+
+ ::CORBA::DefinitionKind def_kind (
+ ACE_ENV_SINGLE_ARG_DECL_WITH_DEFAULTS
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ));
+
+ // TAO_IDL - Generated from
+ // be\be_visitor_operation/tie_sh.cpp:60
+
+ void destroy (
+ ACE_ENV_SINGLE_ARG_DECL_WITH_DEFAULTS
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ));
+
+ // TAO_IDL - Generated from
+ // be\be_visitor_operation/tie_sh.cpp:60
+
+ ::CORBA::Contained_ptr lookup (
+ const char * search_name
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ));
+
+ // TAO_IDL - Generated from
+ // be\be_visitor_operation/tie_sh.cpp:60
+
+ ::CORBA::ContainedSeq * contents (
+ ::CORBA::DefinitionKind limit_type,
+ ::CORBA::Boolean exclude_inherited
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ));
+
+ // TAO_IDL - Generated from
+ // be\be_visitor_operation/tie_sh.cpp:60
+
+ ::CORBA::ContainedSeq * lookup_name (
+ const char * search_name,
+ ::CORBA::Long levels_to_search,
+ ::CORBA::DefinitionKind limit_type,
+ ::CORBA::Boolean exclude_inherited
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ));
+
+ // TAO_IDL - Generated from
+ // be\be_visitor_operation/tie_sh.cpp:60
+
+ ::CORBA::Container::DescriptionSeq * describe_contents (
+ ::CORBA::DefinitionKind limit_type,
+ ::CORBA::Boolean exclude_inherited,
+ ::CORBA::Long max_returned_objs
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ));
+
+ // TAO_IDL - Generated from
+ // be\be_visitor_operation/tie_sh.cpp:60
+
+ ::CORBA::ModuleDef_ptr create_module (
+ const char * id,
+ const char * name,
+ const char * version
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ));
+
+ // TAO_IDL - Generated from
+ // be\be_visitor_operation/tie_sh.cpp:60
+
+ ::CORBA::ConstantDef_ptr create_constant (
+ const char * id,
+ const char * name,
+ const char * version,
+ ::CORBA::IDLType_ptr type,
+ const ::CORBA::Any & value
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ));
+
+ // TAO_IDL - Generated from
+ // be\be_visitor_operation/tie_sh.cpp:60
+
+ ::CORBA::StructDef_ptr create_struct (
+ const char * id,
+ const char * name,
+ const char * version,
+ const ::CORBA::StructMemberSeq & members
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ));
+
+ // TAO_IDL - Generated from
+ // be\be_visitor_operation/tie_sh.cpp:60
+
+ ::CORBA::UnionDef_ptr create_union (
+ const char * id,
+ const char * name,
+ const char * version,
+ ::CORBA::IDLType_ptr discriminator_type,
+ const ::CORBA::UnionMemberSeq & members
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ));
+
+ // TAO_IDL - Generated from
+ // be\be_visitor_operation/tie_sh.cpp:60
+
+ ::CORBA::EnumDef_ptr create_enum (
+ const char * id,
+ const char * name,
+ const char * version,
+ const ::CORBA::EnumMemberSeq & members
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ));
+
+ // TAO_IDL - Generated from
+ // be\be_visitor_operation/tie_sh.cpp:60
+
+ ::CORBA::AliasDef_ptr create_alias (
+ const char * id,
+ const char * name,
+ const char * version,
+ ::CORBA::IDLType_ptr original_type
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ));
+
+ // TAO_IDL - Generated from
+ // be\be_visitor_operation/tie_sh.cpp:60
+
+ ::CORBA::InterfaceDef_ptr create_interface (
+ const char * id,
+ const char * name,
+ const char * version,
+ const ::CORBA::InterfaceDefSeq & base_interfaces
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ));
+
+ // TAO_IDL - Generated from
+ // be\be_visitor_operation/tie_sh.cpp:60
+
+ ::CORBA::ValueDef_ptr create_value (
+ const char * id,
+ const char * name,
+ const char * version,
+ ::CORBA::Boolean is_custom,
+ ::CORBA::Boolean is_abstract,
+ ::CORBA::ValueDef_ptr base_value,
+ ::CORBA::Boolean is_truncatable,
+ const ::CORBA::ValueDefSeq & abstract_base_values,
+ const ::CORBA::InterfaceDefSeq & supported_interfaces,
+ const ::CORBA::InitializerSeq & initializers
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ));
+
+ // TAO_IDL - Generated from
+ // be\be_visitor_operation/tie_sh.cpp:60
+
+ ::CORBA::ValueBoxDef_ptr create_value_box (
+ const char * id,
+ const char * name,
+ const char * version,
+ ::CORBA::IDLType_ptr original_type_def
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ));
+
+ // TAO_IDL - Generated from
+ // be\be_visitor_operation/tie_sh.cpp:60
+
+ ::CORBA::ExceptionDef_ptr create_exception (
+ const char * id,
+ const char * name,
+ const char * version,
+ const ::CORBA::StructMemberSeq & members
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ));
+
+ // TAO_IDL - Generated from
+ // be\be_visitor_operation/tie_sh.cpp:60
+
+ ::CORBA::NativeDef_ptr create_native (
+ const char * id,
+ const char * name,
+ const char * version
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ));
+
+ // TAO_IDL - Generated from
+ // be\be_visitor_operation/tie_sh.cpp:60
+
+ ::CORBA::AbstractInterfaceDef_ptr create_abstract_interface (
+ const char * id,
+ const char * name,
+ const char * version,
+ const ::CORBA::AbstractInterfaceDefSeq & base_interfaces
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ));
+
+ // TAO_IDL - Generated from
+ // be\be_visitor_operation/tie_sh.cpp:60
+
+ ::CORBA::LocalInterfaceDef_ptr create_local_interface (
+ const char * id,
+ const char * name,
+ const char * version,
+ const ::CORBA::InterfaceDefSeq & base_interfaces
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ));
+
+ // TAO_IDL - Generated from
+ // be\be_visitor_operation/tie_sh.cpp:60
+
+ ::CORBA::ExtValueDef_ptr create_ext_value (
+ const char * id,
+ const char * name,
+ const char * version,
+ ::CORBA::Boolean is_custom,
+ ::CORBA::Boolean is_abstract,
+ ::CORBA::ValueDef_ptr base_value,
+ ::CORBA::Boolean is_truncatable,
+ const ::CORBA::ValueDefSeq & abstract_base_values,
+ const ::CORBA::InterfaceDefSeq & supported_interfaces,
+ const ::CORBA::ExtInitializerSeq & initializers
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ));
+
+ // TAO_IDL - Generated from
+ // be\be_visitor_operation/tie_sh.cpp:60
+
+ char * id (
+ ACE_ENV_SINGLE_ARG_DECL_WITH_DEFAULTS
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ));
+
+ // TAO_IDL - Generated from
+ // be\be_visitor_operation/tie_sh.cpp:60
+
+ void id (
+ const char * id
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ));
+
+ // TAO_IDL - Generated from
+ // be\be_visitor_operation/tie_sh.cpp:60
+
+ char * name (
+ ACE_ENV_SINGLE_ARG_DECL_WITH_DEFAULTS
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ));
+
+ // TAO_IDL - Generated from
+ // be\be_visitor_operation/tie_sh.cpp:60
+
+ void name (
+ const char * name
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ));
+
+ // TAO_IDL - Generated from
+ // be\be_visitor_operation/tie_sh.cpp:60
+
+ char * version (
+ ACE_ENV_SINGLE_ARG_DECL_WITH_DEFAULTS
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ));
+
+ // TAO_IDL - Generated from
+ // be\be_visitor_operation/tie_sh.cpp:60
+
+ void version (
+ const char * version
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ));
+
+ // TAO_IDL - Generated from
+ // be\be_visitor_operation/tie_sh.cpp:60
+
+ ::CORBA::Container_ptr defined_in (
+ ACE_ENV_SINGLE_ARG_DECL_WITH_DEFAULTS
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ));
+
+ // TAO_IDL - Generated from
+ // be\be_visitor_operation/tie_sh.cpp:60
+
+ char * absolute_name (
+ ACE_ENV_SINGLE_ARG_DECL_WITH_DEFAULTS
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ));
+
+ // TAO_IDL - Generated from
+ // be\be_visitor_operation/tie_sh.cpp:60
+
+ ::CORBA::Repository_ptr containing_repository (
+ ACE_ENV_SINGLE_ARG_DECL_WITH_DEFAULTS
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ));
+
+ // TAO_IDL - Generated from
+ // be\be_visitor_operation/tie_sh.cpp:60
+
+ ::CORBA::Contained::Description * describe (
+ ACE_ENV_SINGLE_ARG_DECL_WITH_DEFAULTS
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ));
+
+ // TAO_IDL - Generated from
+ // be\be_visitor_operation/tie_sh.cpp:60
+
+ void move (
+ ::CORBA::Container_ptr new_container,
+ const char * new_name,
+ const char * new_version
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ));
+
+ // TAO_IDL - Generated from
+ // be\be_visitor_operation/tie_sh.cpp:60
+
+ ::CORBA::TypeCode_ptr type (
+ ACE_ENV_SINGLE_ARG_DECL_WITH_DEFAULTS
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ));
+
+ // TAO_IDL - Generated from
+ // be\be_visitor_operation/tie_sh.cpp:60
+
+ ::CORBA::InterfaceDefSeq * base_interfaces (
+ ACE_ENV_SINGLE_ARG_DECL_WITH_DEFAULTS
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ));
+
+ // TAO_IDL - Generated from
+ // be\be_visitor_operation/tie_sh.cpp:60
+
+ void base_interfaces (
+ const ::CORBA::InterfaceDefSeq & base_interfaces
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ));
+
+ // TAO_IDL - Generated from
+ // be\be_visitor_operation/tie_sh.cpp:60
+
+ ::CORBA::Boolean is_a (
+ const char * interface_id
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ));
+
+ // TAO_IDL - Generated from
+ // be\be_visitor_operation/tie_sh.cpp:60
+
+ ::CORBA::InterfaceDef::FullInterfaceDescription * describe_interface (
+ ACE_ENV_SINGLE_ARG_DECL_WITH_DEFAULTS
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ));
+
+ // TAO_IDL - Generated from
+ // be\be_visitor_operation/tie_sh.cpp:60
+
+ ::CORBA::AttributeDef_ptr create_attribute (
+ const char * id,
+ const char * name,
+ const char * version,
+ ::CORBA::IDLType_ptr type,
+ ::CORBA::AttributeMode mode
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ));
+
+ // TAO_IDL - Generated from
+ // be\be_visitor_operation/tie_sh.cpp:60
+
+ ::CORBA::OperationDef_ptr create_operation (
+ const char * id,
+ const char * name,
+ const char * version,
+ ::CORBA::IDLType_ptr result,
+ ::CORBA::OperationMode mode,
+ const ::CORBA::ParDescriptionSeq & params,
+ const ::CORBA::ExceptionDefSeq & exceptions,
+ const ::CORBA::ContextIdSeq & contexts
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ));
+
+ private:
+ T *ptr_;
+ PortableServer::POA_var poa_;
+ ::CORBA::Boolean rel_;
+
+ // copy and assignment are not allowed
+ LocalInterfaceDef_tie (const LocalInterfaceDef_tie &);
+ void operator= (const LocalInterfaceDef_tie &);
+ };
+
+ // TAO_IDL - Generated from
+ // be\be_visitor_interface/tie_sh.cpp:87
+
+ // TIE class: Refer to CORBA v2.2, Section 20.34.4
+ template <class T>
+ class ExtLocalInterfaceDef_tie : public ExtLocalInterfaceDef
+ {
+ public:
+ /// the T& ctor
+ ExtLocalInterfaceDef_tie (T &t);
+ /// ctor taking a POA
+ ExtLocalInterfaceDef_tie (T &t, PortableServer::POA_ptr poa);
+ /// ctor taking pointer and an ownership flag
+ ExtLocalInterfaceDef_tie (T *tp, ::CORBA::Boolean release = true);
+ /// ctor with T*, ownership flag and a POA
+ ExtLocalInterfaceDef_tie (
+ T *tp,
+ PortableServer::POA_ptr poa,
+ ::CORBA::Boolean release = true
+ );
+ /// dtor
+
+ ~ExtLocalInterfaceDef_tie (void);
+ // TIE specific functions
+ /// return the underlying object
+ T *_tied_object (void);
+ /// set the underlying object
+ void _tied_object (T &obj);
+ /// set the underlying object and the ownership flag
+ void _tied_object (T *obj, ::CORBA::Boolean release = true);
+ /// do we own it
+ ::CORBA::Boolean _is_owner (void);
+ /// set the ownership
+
+ void _is_owner ( ::CORBA::Boolean b);
+ // overridden ServantBase operations
+ PortableServer::POA_ptr _default_POA (
+ ACE_ENV_SINGLE_ARG_DECL_WITH_DEFAULTS
+ );
+
+ // TAO_IDL - Generated from
+ // be\be_visitor_operation/tie_sh.cpp:60
+
+ ::CORBA::DefinitionKind def_kind (
+ ACE_ENV_SINGLE_ARG_DECL_WITH_DEFAULTS
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ));
+
+ // TAO_IDL - Generated from
+ // be\be_visitor_operation/tie_sh.cpp:60
+
+ void destroy (
+ ACE_ENV_SINGLE_ARG_DECL_WITH_DEFAULTS
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ));
+
+ // TAO_IDL - Generated from
+ // be\be_visitor_operation/tie_sh.cpp:60
+
+ ::CORBA::Contained_ptr lookup (
+ const char * search_name
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ));
+
+ // TAO_IDL - Generated from
+ // be\be_visitor_operation/tie_sh.cpp:60
+
+ ::CORBA::ContainedSeq * contents (
+ ::CORBA::DefinitionKind limit_type,
+ ::CORBA::Boolean exclude_inherited
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ));
+
+ // TAO_IDL - Generated from
+ // be\be_visitor_operation/tie_sh.cpp:60
+
+ ::CORBA::ContainedSeq * lookup_name (
+ const char * search_name,
+ ::CORBA::Long levels_to_search,
+ ::CORBA::DefinitionKind limit_type,
+ ::CORBA::Boolean exclude_inherited
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ));
+
+ // TAO_IDL - Generated from
+ // be\be_visitor_operation/tie_sh.cpp:60
+
+ ::CORBA::Container::DescriptionSeq * describe_contents (
+ ::CORBA::DefinitionKind limit_type,
+ ::CORBA::Boolean exclude_inherited,
+ ::CORBA::Long max_returned_objs
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ));
+
+ // TAO_IDL - Generated from
+ // be\be_visitor_operation/tie_sh.cpp:60
+
+ ::CORBA::ModuleDef_ptr create_module (
+ const char * id,
+ const char * name,
+ const char * version
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ));
+
+ // TAO_IDL - Generated from
+ // be\be_visitor_operation/tie_sh.cpp:60
+
+ ::CORBA::ConstantDef_ptr create_constant (
+ const char * id,
+ const char * name,
+ const char * version,
+ ::CORBA::IDLType_ptr type,
+ const ::CORBA::Any & value
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ));
+
+ // TAO_IDL - Generated from
+ // be\be_visitor_operation/tie_sh.cpp:60
+
+ ::CORBA::StructDef_ptr create_struct (
+ const char * id,
+ const char * name,
+ const char * version,
+ const ::CORBA::StructMemberSeq & members
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ));
+
+ // TAO_IDL - Generated from
+ // be\be_visitor_operation/tie_sh.cpp:60
+
+ ::CORBA::UnionDef_ptr create_union (
+ const char * id,
+ const char * name,
+ const char * version,
+ ::CORBA::IDLType_ptr discriminator_type,
+ const ::CORBA::UnionMemberSeq & members
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ));
+
+ // TAO_IDL - Generated from
+ // be\be_visitor_operation/tie_sh.cpp:60
+
+ ::CORBA::EnumDef_ptr create_enum (
+ const char * id,
+ const char * name,
+ const char * version,
+ const ::CORBA::EnumMemberSeq & members
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ));
+
+ // TAO_IDL - Generated from
+ // be\be_visitor_operation/tie_sh.cpp:60
+
+ ::CORBA::AliasDef_ptr create_alias (
+ const char * id,
+ const char * name,
+ const char * version,
+ ::CORBA::IDLType_ptr original_type
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ));
+
+ // TAO_IDL - Generated from
+ // be\be_visitor_operation/tie_sh.cpp:60
+
+ ::CORBA::InterfaceDef_ptr create_interface (
+ const char * id,
+ const char * name,
+ const char * version,
+ const ::CORBA::InterfaceDefSeq & base_interfaces
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ));
+
+ // TAO_IDL - Generated from
+ // be\be_visitor_operation/tie_sh.cpp:60
+
+ ::CORBA::ValueDef_ptr create_value (
+ const char * id,
+ const char * name,
+ const char * version,
+ ::CORBA::Boolean is_custom,
+ ::CORBA::Boolean is_abstract,
+ ::CORBA::ValueDef_ptr base_value,
+ ::CORBA::Boolean is_truncatable,
+ const ::CORBA::ValueDefSeq & abstract_base_values,
+ const ::CORBA::InterfaceDefSeq & supported_interfaces,
+ const ::CORBA::InitializerSeq & initializers
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ));
+
+ // TAO_IDL - Generated from
+ // be\be_visitor_operation/tie_sh.cpp:60
+
+ ::CORBA::ValueBoxDef_ptr create_value_box (
+ const char * id,
+ const char * name,
+ const char * version,
+ ::CORBA::IDLType_ptr original_type_def
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ));
+
+ // TAO_IDL - Generated from
+ // be\be_visitor_operation/tie_sh.cpp:60
+
+ ::CORBA::ExceptionDef_ptr create_exception (
+ const char * id,
+ const char * name,
+ const char * version,
+ const ::CORBA::StructMemberSeq & members
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ));
+
+ // TAO_IDL - Generated from
+ // be\be_visitor_operation/tie_sh.cpp:60
+
+ ::CORBA::NativeDef_ptr create_native (
+ const char * id,
+ const char * name,
+ const char * version
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ));
+
+ // TAO_IDL - Generated from
+ // be\be_visitor_operation/tie_sh.cpp:60
+
+ ::CORBA::AbstractInterfaceDef_ptr create_abstract_interface (
+ const char * id,
+ const char * name,
+ const char * version,
+ const ::CORBA::AbstractInterfaceDefSeq & base_interfaces
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ));
+
+ // TAO_IDL - Generated from
+ // be\be_visitor_operation/tie_sh.cpp:60
+
+ ::CORBA::LocalInterfaceDef_ptr create_local_interface (
+ const char * id,
+ const char * name,
+ const char * version,
+ const ::CORBA::InterfaceDefSeq & base_interfaces
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ));
+
+ // TAO_IDL - Generated from
+ // be\be_visitor_operation/tie_sh.cpp:60
+
+ ::CORBA::ExtValueDef_ptr create_ext_value (
+ const char * id,
+ const char * name,
+ const char * version,
+ ::CORBA::Boolean is_custom,
+ ::CORBA::Boolean is_abstract,
+ ::CORBA::ValueDef_ptr base_value,
+ ::CORBA::Boolean is_truncatable,
+ const ::CORBA::ValueDefSeq & abstract_base_values,
+ const ::CORBA::InterfaceDefSeq & supported_interfaces,
+ const ::CORBA::ExtInitializerSeq & initializers
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ));
+
+ // TAO_IDL - Generated from
+ // be\be_visitor_operation/tie_sh.cpp:60
+
+ char * id (
+ ACE_ENV_SINGLE_ARG_DECL_WITH_DEFAULTS
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ));
+
+ // TAO_IDL - Generated from
+ // be\be_visitor_operation/tie_sh.cpp:60
+
+ void id (
+ const char * id
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ));
+
+ // TAO_IDL - Generated from
+ // be\be_visitor_operation/tie_sh.cpp:60
+
+ char * name (
+ ACE_ENV_SINGLE_ARG_DECL_WITH_DEFAULTS
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ));
+
+ // TAO_IDL - Generated from
+ // be\be_visitor_operation/tie_sh.cpp:60
+
+ void name (
+ const char * name
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ));
+
+ // TAO_IDL - Generated from
+ // be\be_visitor_operation/tie_sh.cpp:60
+
+ char * version (
+ ACE_ENV_SINGLE_ARG_DECL_WITH_DEFAULTS
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ));
+
+ // TAO_IDL - Generated from
+ // be\be_visitor_operation/tie_sh.cpp:60
+
+ void version (
+ const char * version
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ));
+
+ // TAO_IDL - Generated from
+ // be\be_visitor_operation/tie_sh.cpp:60
+
+ ::CORBA::Container_ptr defined_in (
+ ACE_ENV_SINGLE_ARG_DECL_WITH_DEFAULTS
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ));
+
+ // TAO_IDL - Generated from
+ // be\be_visitor_operation/tie_sh.cpp:60
+
+ char * absolute_name (
+ ACE_ENV_SINGLE_ARG_DECL_WITH_DEFAULTS
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ));
+
+ // TAO_IDL - Generated from
+ // be\be_visitor_operation/tie_sh.cpp:60
+
+ ::CORBA::Repository_ptr containing_repository (
+ ACE_ENV_SINGLE_ARG_DECL_WITH_DEFAULTS
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ));
+
+ // TAO_IDL - Generated from
+ // be\be_visitor_operation/tie_sh.cpp:60
+
+ ::CORBA::Contained::Description * describe (
+ ACE_ENV_SINGLE_ARG_DECL_WITH_DEFAULTS
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ));
+
+ // TAO_IDL - Generated from
+ // be\be_visitor_operation/tie_sh.cpp:60
+
+ void move (
+ ::CORBA::Container_ptr new_container,
+ const char * new_name,
+ const char * new_version
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ));
+
+ // TAO_IDL - Generated from
+ // be\be_visitor_operation/tie_sh.cpp:60
+
+ ::CORBA::TypeCode_ptr type (
+ ACE_ENV_SINGLE_ARG_DECL_WITH_DEFAULTS
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ));
+
+ // TAO_IDL - Generated from
+ // be\be_visitor_operation/tie_sh.cpp:60
+
+ ::CORBA::InterfaceDefSeq * base_interfaces (
+ ACE_ENV_SINGLE_ARG_DECL_WITH_DEFAULTS
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ));
+
+ // TAO_IDL - Generated from
+ // be\be_visitor_operation/tie_sh.cpp:60
+
+ void base_interfaces (
+ const ::CORBA::InterfaceDefSeq & base_interfaces
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ));
+
+ // TAO_IDL - Generated from
+ // be\be_visitor_operation/tie_sh.cpp:60
+
+ ::CORBA::Boolean is_a (
+ const char * interface_id
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ));
+
+ // TAO_IDL - Generated from
+ // be\be_visitor_operation/tie_sh.cpp:60
+
+ ::CORBA::InterfaceDef::FullInterfaceDescription * describe_interface (
+ ACE_ENV_SINGLE_ARG_DECL_WITH_DEFAULTS
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ));
+
+ // TAO_IDL - Generated from
+ // be\be_visitor_operation/tie_sh.cpp:60
+
+ ::CORBA::AttributeDef_ptr create_attribute (
+ const char * id,
+ const char * name,
+ const char * version,
+ ::CORBA::IDLType_ptr type,
+ ::CORBA::AttributeMode mode
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ));
+
+ // TAO_IDL - Generated from
+ // be\be_visitor_operation/tie_sh.cpp:60
+
+ ::CORBA::OperationDef_ptr create_operation (
+ const char * id,
+ const char * name,
+ const char * version,
+ ::CORBA::IDLType_ptr result,
+ ::CORBA::OperationMode mode,
+ const ::CORBA::ParDescriptionSeq & params,
+ const ::CORBA::ExceptionDefSeq & exceptions,
+ const ::CORBA::ContextIdSeq & contexts
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ));
+
+ // TAO_IDL - Generated from
+ // be\be_visitor_operation/tie_sh.cpp:60
+
+ ::CORBA::InterfaceAttrExtension::ExtFullInterfaceDescription * describe_ext_interface (
+ ACE_ENV_SINGLE_ARG_DECL_WITH_DEFAULTS
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ));
+
+ // TAO_IDL - Generated from
+ // be\be_visitor_operation/tie_sh.cpp:60
+
+ ::CORBA::ExtAttributeDef_ptr create_ext_attribute (
+ const char * id,
+ const char * name,
+ const char * version,
+ ::CORBA::IDLType_ptr type,
+ ::CORBA::AttributeMode mode,
+ const ::CORBA::ExceptionDefSeq & get_exceptions,
+ const ::CORBA::ExceptionDefSeq & set_exceptions
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ));
+
+ private:
+ T *ptr_;
+ PortableServer::POA_var poa_;
+ ::CORBA::Boolean rel_;
+
+ // copy and assignment are not allowed
+ ExtLocalInterfaceDef_tie (const ExtLocalInterfaceDef_tie &);
+ void operator= (const ExtLocalInterfaceDef_tie &);
+ };
+} // module CORBA
+
+// TAO_IDL - Generated from
+// be\be_codegen.cpp:1322
+
+
+TAO_END_VERSIONED_NAMESPACE_DECL
+
+#if defined (__ACE_INLINE__)
+#include "IFR_BasicS_T.inl"
+#endif /* defined INLINE */
+
+#if defined (ACE_TEMPLATES_REQUIRE_SOURCE)
+#include "IFR_BasicS_T.cpp"
+#endif /* defined REQUIRED SOURCE */
+
+#if defined (ACE_TEMPLATES_REQUIRE_PRAGMA)
+#pragma implementation ("IFR_BasicS_T.cpp")
+#endif /* defined REQUIRED PRAGMA */
+
+#include /**/ "ace/post.h"
+#endif /* ifndef */
+
diff --git a/TAO/orbsvcs/orbsvcs/IFRService/IFR_BasicS_T.inl b/TAO/orbsvcs/orbsvcs/IFRService/IFR_BasicS_T.inl
new file mode 100644
index 00000000000..dcc845194d3
--- /dev/null
+++ b/TAO/orbsvcs/orbsvcs/IFRService/IFR_BasicS_T.inl
@@ -0,0 +1,13439 @@
+// -*- C++ -*-
+//
+// $Id$
+
+// **** Code generated by the The ACE ORB (TAO) IDL Compiler ****
+// TAO and the TAO IDL Compiler have been developed by:
+// Center for Distributed Object Computing
+// Washington University
+// St. Louis, MO
+// USA
+// http://www.cs.wustl.edu/~schmidt/doc-center.html
+// and
+// Distributed Object Computing Laboratory
+// University of California at Irvine
+// Irvine, CA
+// USA
+// http://doc.ece.uci.edu/
+// and
+// Institute for Software Integrated Systems
+// Vanderbilt University
+// Nashville, TN
+// USA
+// http://www.isis.vanderbilt.edu/
+//
+// Information about TAO is available at:
+// http://www.cs.wustl.edu/~schmidt/TAO.html
+
+
+TAO_BEGIN_VERSIONED_NAMESPACE_DECL
+
+
+
+// TAO_IDL - Generated from
+// be\be_visitor_interface/tie_si.cpp:96
+
+template <class T> ACE_INLINE
+POA_CORBA::Repository_tie<T>::Repository_tie (T &t)
+ : ptr_ (&t),
+ poa_ (PortableServer::POA::_nil ()),
+ rel_ (0)
+{}
+
+template <class T> ACE_INLINE
+POA_CORBA::Repository_tie<T>::Repository_tie (T &t, PortableServer::POA_ptr poa)
+ : ptr_ (&t),
+ poa_ (PortableServer::POA::_duplicate (poa)),
+ rel_ (0)
+{}
+
+template <class T> ACE_INLINE
+POA_CORBA::Repository_tie<T>::Repository_tie (T *tp, ::CORBA::Boolean release)
+ : ptr_ (tp),
+ poa_ (PortableServer::POA::_nil ()),
+ rel_ (release)
+{}
+
+template <class T> ACE_INLINE
+POA_CORBA::Repository_tie<T>::Repository_tie (T *tp, PortableServer::POA_ptr poa, ::CORBA::Boolean release)
+ : ptr_ (tp),
+ poa_ (PortableServer::POA::_duplicate (poa)),
+ rel_ (release)
+{}
+
+template <class T> ACE_INLINE
+POA_CORBA::Repository_tie<T>::~Repository_tie (void)
+{
+ if (this->rel_)
+ {
+ delete this->ptr_;
+ }
+}
+
+template <class T> ACE_INLINE T *
+POA_CORBA::Repository_tie<T>::_tied_object (void)
+{
+ return this->ptr_;
+}
+
+template <class T> ACE_INLINE void
+POA_CORBA::Repository_tie<T>::_tied_object (T &obj)
+{
+ if (this->rel_)
+ {
+ delete this->ptr_;
+ }
+
+ this->ptr_ = &obj;
+ this->rel_ = 0;
+}
+
+template <class T> ACE_INLINE void
+POA_CORBA::Repository_tie<T>::_tied_object (T *obj, ::CORBA::Boolean release)
+{
+ if (this->rel_)
+ {
+ delete this->ptr_;
+ }
+
+ this->ptr_ = obj;
+ this->rel_ = release;
+}
+
+template <class T> ACE_INLINE ::CORBA::Boolean
+POA_CORBA::Repository_tie<T>::_is_owner (void)
+{
+ return this->rel_;
+}
+
+template <class T> ACE_INLINE void
+POA_CORBA::Repository_tie<T>::_is_owner ( ::CORBA::Boolean b)
+{
+ this->rel_ = b;
+}
+
+template <class T> ACE_INLINE PortableServer::POA_ptr
+POA_CORBA::Repository_tie<T>::_default_POA (ACE_ENV_SINGLE_ARG_DECL)
+{
+ if (! ::CORBA::is_nil (this->poa_.in ()))
+ {
+ return PortableServer::POA::_duplicate (this->poa_.in ());
+ }
+
+ return this->Repository::_default_POA (ACE_ENV_SINGLE_ARG_PARAMETER);
+}
+
+// TAO_IDL - Generated from
+// be\be_visitor_operation/tie_si.cpp:101
+
+template <class T> ACE_INLINE
+::CORBA::DefinitionKind POA_CORBA::Repository_tie<T>::def_kind (
+ ACE_ENV_SINGLE_ARG_DECL
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ))
+{
+ return this->ptr_->def_kind (
+ ACE_ENV_SINGLE_ARG_PARAMETER
+ );
+}
+
+// TAO_IDL - Generated from
+// be\be_visitor_operation/tie_si.cpp:101
+
+template <class T> ACE_INLINE
+void POA_CORBA::Repository_tie<T>::destroy (
+ ACE_ENV_SINGLE_ARG_DECL
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ))
+{
+ this->ptr_->destroy (
+ ACE_ENV_SINGLE_ARG_PARAMETER
+ );
+}
+
+// TAO_IDL - Generated from
+// be\be_visitor_operation/tie_si.cpp:101
+
+template <class T> ACE_INLINE
+::CORBA::Contained_ptr POA_CORBA::Repository_tie<T>::lookup (
+ const char * search_name
+ ACE_ENV_ARG_DECL
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ))
+{
+ return this->ptr_->lookup (
+ search_name
+ ACE_ENV_ARG_PARAMETER
+ );
+}
+
+// TAO_IDL - Generated from
+// be\be_visitor_operation/tie_si.cpp:101
+
+template <class T> ACE_INLINE
+::CORBA::ContainedSeq * POA_CORBA::Repository_tie<T>::contents (
+ ::CORBA::DefinitionKind limit_type,
+ ::CORBA::Boolean exclude_inherited
+ ACE_ENV_ARG_DECL
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ))
+{
+ return this->ptr_->contents (
+ limit_type,
+ exclude_inherited
+ ACE_ENV_ARG_PARAMETER
+ );
+}
+
+// TAO_IDL - Generated from
+// be\be_visitor_operation/tie_si.cpp:101
+
+template <class T> ACE_INLINE
+::CORBA::ContainedSeq * POA_CORBA::Repository_tie<T>::lookup_name (
+ const char * search_name,
+ ::CORBA::Long levels_to_search,
+ ::CORBA::DefinitionKind limit_type,
+ ::CORBA::Boolean exclude_inherited
+ ACE_ENV_ARG_DECL
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ))
+{
+ return this->ptr_->lookup_name (
+ search_name,
+ levels_to_search,
+ limit_type,
+ exclude_inherited
+ ACE_ENV_ARG_PARAMETER
+ );
+}
+
+// TAO_IDL - Generated from
+// be\be_visitor_operation/tie_si.cpp:101
+
+template <class T> ACE_INLINE
+::CORBA::Container::DescriptionSeq * POA_CORBA::Repository_tie<T>::describe_contents (
+ ::CORBA::DefinitionKind limit_type,
+ ::CORBA::Boolean exclude_inherited,
+ ::CORBA::Long max_returned_objs
+ ACE_ENV_ARG_DECL
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ))
+{
+ return this->ptr_->describe_contents (
+ limit_type,
+ exclude_inherited,
+ max_returned_objs
+ ACE_ENV_ARG_PARAMETER
+ );
+}
+
+// TAO_IDL - Generated from
+// be\be_visitor_operation/tie_si.cpp:101
+
+template <class T> ACE_INLINE
+::CORBA::ModuleDef_ptr POA_CORBA::Repository_tie<T>::create_module (
+ const char * id,
+ const char * name,
+ const char * version
+ ACE_ENV_ARG_DECL
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ))
+{
+ return this->ptr_->create_module (
+ id,
+ name,
+ version
+ ACE_ENV_ARG_PARAMETER
+ );
+}
+
+// TAO_IDL - Generated from
+// be\be_visitor_operation/tie_si.cpp:101
+
+template <class T> ACE_INLINE
+::CORBA::ConstantDef_ptr POA_CORBA::Repository_tie<T>::create_constant (
+ const char * id,
+ const char * name,
+ const char * version,
+ ::CORBA::IDLType_ptr type,
+ const ::CORBA::Any & value
+ ACE_ENV_ARG_DECL
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ))
+{
+ return this->ptr_->create_constant (
+ id,
+ name,
+ version,
+ type,
+ value
+ ACE_ENV_ARG_PARAMETER
+ );
+}
+
+// TAO_IDL - Generated from
+// be\be_visitor_operation/tie_si.cpp:101
+
+template <class T> ACE_INLINE
+::CORBA::StructDef_ptr POA_CORBA::Repository_tie<T>::create_struct (
+ const char * id,
+ const char * name,
+ const char * version,
+ const ::CORBA::StructMemberSeq & members
+ ACE_ENV_ARG_DECL
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ))
+{
+ return this->ptr_->create_struct (
+ id,
+ name,
+ version,
+ members
+ ACE_ENV_ARG_PARAMETER
+ );
+}
+
+// TAO_IDL - Generated from
+// be\be_visitor_operation/tie_si.cpp:101
+
+template <class T> ACE_INLINE
+::CORBA::UnionDef_ptr POA_CORBA::Repository_tie<T>::create_union (
+ const char * id,
+ const char * name,
+ const char * version,
+ ::CORBA::IDLType_ptr discriminator_type,
+ const ::CORBA::UnionMemberSeq & members
+ ACE_ENV_ARG_DECL
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ))
+{
+ return this->ptr_->create_union (
+ id,
+ name,
+ version,
+ discriminator_type,
+ members
+ ACE_ENV_ARG_PARAMETER
+ );
+}
+
+// TAO_IDL - Generated from
+// be\be_visitor_operation/tie_si.cpp:101
+
+template <class T> ACE_INLINE
+::CORBA::EnumDef_ptr POA_CORBA::Repository_tie<T>::create_enum (
+ const char * id,
+ const char * name,
+ const char * version,
+ const ::CORBA::EnumMemberSeq & members
+ ACE_ENV_ARG_DECL
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ))
+{
+ return this->ptr_->create_enum (
+ id,
+ name,
+ version,
+ members
+ ACE_ENV_ARG_PARAMETER
+ );
+}
+
+// TAO_IDL - Generated from
+// be\be_visitor_operation/tie_si.cpp:101
+
+template <class T> ACE_INLINE
+::CORBA::AliasDef_ptr POA_CORBA::Repository_tie<T>::create_alias (
+ const char * id,
+ const char * name,
+ const char * version,
+ ::CORBA::IDLType_ptr original_type
+ ACE_ENV_ARG_DECL
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ))
+{
+ return this->ptr_->create_alias (
+ id,
+ name,
+ version,
+ original_type
+ ACE_ENV_ARG_PARAMETER
+ );
+}
+
+// TAO_IDL - Generated from
+// be\be_visitor_operation/tie_si.cpp:101
+
+template <class T> ACE_INLINE
+::CORBA::InterfaceDef_ptr POA_CORBA::Repository_tie<T>::create_interface (
+ const char * id,
+ const char * name,
+ const char * version,
+ const ::CORBA::InterfaceDefSeq & base_interfaces
+ ACE_ENV_ARG_DECL
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ))
+{
+ return this->ptr_->create_interface (
+ id,
+ name,
+ version,
+ base_interfaces
+ ACE_ENV_ARG_PARAMETER
+ );
+}
+
+// TAO_IDL - Generated from
+// be\be_visitor_operation/tie_si.cpp:101
+
+template <class T> ACE_INLINE
+::CORBA::ValueDef_ptr POA_CORBA::Repository_tie<T>::create_value (
+ const char * id,
+ const char * name,
+ const char * version,
+ ::CORBA::Boolean is_custom,
+ ::CORBA::Boolean is_abstract,
+ ::CORBA::ValueDef_ptr base_value,
+ ::CORBA::Boolean is_truncatable,
+ const ::CORBA::ValueDefSeq & abstract_base_values,
+ const ::CORBA::InterfaceDefSeq & supported_interfaces,
+ const ::CORBA::InitializerSeq & initializers
+ ACE_ENV_ARG_DECL
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ))
+{
+ return this->ptr_->create_value (
+ id,
+ name,
+ version,
+ is_custom,
+ is_abstract,
+ base_value,
+ is_truncatable,
+ abstract_base_values,
+ supported_interfaces,
+ initializers
+ ACE_ENV_ARG_PARAMETER
+ );
+}
+
+// TAO_IDL - Generated from
+// be\be_visitor_operation/tie_si.cpp:101
+
+template <class T> ACE_INLINE
+::CORBA::ValueBoxDef_ptr POA_CORBA::Repository_tie<T>::create_value_box (
+ const char * id,
+ const char * name,
+ const char * version,
+ ::CORBA::IDLType_ptr original_type_def
+ ACE_ENV_ARG_DECL
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ))
+{
+ return this->ptr_->create_value_box (
+ id,
+ name,
+ version,
+ original_type_def
+ ACE_ENV_ARG_PARAMETER
+ );
+}
+
+// TAO_IDL - Generated from
+// be\be_visitor_operation/tie_si.cpp:101
+
+template <class T> ACE_INLINE
+::CORBA::ExceptionDef_ptr POA_CORBA::Repository_tie<T>::create_exception (
+ const char * id,
+ const char * name,
+ const char * version,
+ const ::CORBA::StructMemberSeq & members
+ ACE_ENV_ARG_DECL
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ))
+{
+ return this->ptr_->create_exception (
+ id,
+ name,
+ version,
+ members
+ ACE_ENV_ARG_PARAMETER
+ );
+}
+
+// TAO_IDL - Generated from
+// be\be_visitor_operation/tie_si.cpp:101
+
+template <class T> ACE_INLINE
+::CORBA::NativeDef_ptr POA_CORBA::Repository_tie<T>::create_native (
+ const char * id,
+ const char * name,
+ const char * version
+ ACE_ENV_ARG_DECL
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ))
+{
+ return this->ptr_->create_native (
+ id,
+ name,
+ version
+ ACE_ENV_ARG_PARAMETER
+ );
+}
+
+// TAO_IDL - Generated from
+// be\be_visitor_operation/tie_si.cpp:101
+
+template <class T> ACE_INLINE
+::CORBA::AbstractInterfaceDef_ptr POA_CORBA::Repository_tie<T>::create_abstract_interface (
+ const char * id,
+ const char * name,
+ const char * version,
+ const ::CORBA::AbstractInterfaceDefSeq & base_interfaces
+ ACE_ENV_ARG_DECL
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ))
+{
+ return this->ptr_->create_abstract_interface (
+ id,
+ name,
+ version,
+ base_interfaces
+ ACE_ENV_ARG_PARAMETER
+ );
+}
+
+// TAO_IDL - Generated from
+// be\be_visitor_operation/tie_si.cpp:101
+
+template <class T> ACE_INLINE
+::CORBA::LocalInterfaceDef_ptr POA_CORBA::Repository_tie<T>::create_local_interface (
+ const char * id,
+ const char * name,
+ const char * version,
+ const ::CORBA::InterfaceDefSeq & base_interfaces
+ ACE_ENV_ARG_DECL
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ))
+{
+ return this->ptr_->create_local_interface (
+ id,
+ name,
+ version,
+ base_interfaces
+ ACE_ENV_ARG_PARAMETER
+ );
+}
+
+// TAO_IDL - Generated from
+// be\be_visitor_operation/tie_si.cpp:101
+
+template <class T> ACE_INLINE
+::CORBA::ExtValueDef_ptr POA_CORBA::Repository_tie<T>::create_ext_value (
+ const char * id,
+ const char * name,
+ const char * version,
+ ::CORBA::Boolean is_custom,
+ ::CORBA::Boolean is_abstract,
+ ::CORBA::ValueDef_ptr base_value,
+ ::CORBA::Boolean is_truncatable,
+ const ::CORBA::ValueDefSeq & abstract_base_values,
+ const ::CORBA::InterfaceDefSeq & supported_interfaces,
+ const ::CORBA::ExtInitializerSeq & initializers
+ ACE_ENV_ARG_DECL
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ))
+{
+ return this->ptr_->create_ext_value (
+ id,
+ name,
+ version,
+ is_custom,
+ is_abstract,
+ base_value,
+ is_truncatable,
+ abstract_base_values,
+ supported_interfaces,
+ initializers
+ ACE_ENV_ARG_PARAMETER
+ );
+}
+
+// TAO_IDL - Generated from
+// be\be_visitor_operation/tie_si.cpp:101
+
+template <class T> ACE_INLINE
+::CORBA::Contained_ptr POA_CORBA::Repository_tie<T>::lookup_id (
+ const char * search_id
+ ACE_ENV_ARG_DECL
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ))
+{
+ return this->ptr_->lookup_id (
+ search_id
+ ACE_ENV_ARG_PARAMETER
+ );
+}
+
+// TAO_IDL - Generated from
+// be\be_visitor_operation/tie_si.cpp:101
+
+template <class T> ACE_INLINE
+::CORBA::TypeCode_ptr POA_CORBA::Repository_tie<T>::get_canonical_typecode (
+ ::CORBA::TypeCode_ptr tc
+ ACE_ENV_ARG_DECL
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ))
+{
+ return this->ptr_->get_canonical_typecode (
+ tc
+ ACE_ENV_ARG_PARAMETER
+ );
+}
+
+// TAO_IDL - Generated from
+// be\be_visitor_operation/tie_si.cpp:101
+
+template <class T> ACE_INLINE
+::CORBA::PrimitiveDef_ptr POA_CORBA::Repository_tie<T>::get_primitive (
+ ::CORBA::PrimitiveKind kind
+ ACE_ENV_ARG_DECL
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ))
+{
+ return this->ptr_->get_primitive (
+ kind
+ ACE_ENV_ARG_PARAMETER
+ );
+}
+
+// TAO_IDL - Generated from
+// be\be_visitor_operation/tie_si.cpp:101
+
+template <class T> ACE_INLINE
+::CORBA::StringDef_ptr POA_CORBA::Repository_tie<T>::create_string (
+ ::CORBA::ULong bound
+ ACE_ENV_ARG_DECL
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ))
+{
+ return this->ptr_->create_string (
+ bound
+ ACE_ENV_ARG_PARAMETER
+ );
+}
+
+// TAO_IDL - Generated from
+// be\be_visitor_operation/tie_si.cpp:101
+
+template <class T> ACE_INLINE
+::CORBA::WstringDef_ptr POA_CORBA::Repository_tie<T>::create_wstring (
+ ::CORBA::ULong bound
+ ACE_ENV_ARG_DECL
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ))
+{
+ return this->ptr_->create_wstring (
+ bound
+ ACE_ENV_ARG_PARAMETER
+ );
+}
+
+// TAO_IDL - Generated from
+// be\be_visitor_operation/tie_si.cpp:101
+
+template <class T> ACE_INLINE
+::CORBA::SequenceDef_ptr POA_CORBA::Repository_tie<T>::create_sequence (
+ ::CORBA::ULong bound,
+ ::CORBA::IDLType_ptr element_type
+ ACE_ENV_ARG_DECL
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ))
+{
+ return this->ptr_->create_sequence (
+ bound,
+ element_type
+ ACE_ENV_ARG_PARAMETER
+ );
+}
+
+// TAO_IDL - Generated from
+// be\be_visitor_operation/tie_si.cpp:101
+
+template <class T> ACE_INLINE
+::CORBA::ArrayDef_ptr POA_CORBA::Repository_tie<T>::create_array (
+ ::CORBA::ULong length,
+ ::CORBA::IDLType_ptr element_type
+ ACE_ENV_ARG_DECL
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ))
+{
+ return this->ptr_->create_array (
+ length,
+ element_type
+ ACE_ENV_ARG_PARAMETER
+ );
+}
+
+// TAO_IDL - Generated from
+// be\be_visitor_operation/tie_si.cpp:101
+
+template <class T> ACE_INLINE
+::CORBA::FixedDef_ptr POA_CORBA::Repository_tie<T>::create_fixed (
+ ::CORBA::UShort digits,
+ ::CORBA::Short scale
+ ACE_ENV_ARG_DECL
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ))
+{
+ return this->ptr_->create_fixed (
+ digits,
+ scale
+ ACE_ENV_ARG_PARAMETER
+ );
+}
+
+// TAO_IDL - Generated from
+// be\be_visitor_interface/tie_si.cpp:96
+
+template <class T> ACE_INLINE
+POA_CORBA::ModuleDef_tie<T>::ModuleDef_tie (T &t)
+ : ptr_ (&t),
+ poa_ (PortableServer::POA::_nil ()),
+ rel_ (0)
+{}
+
+template <class T> ACE_INLINE
+POA_CORBA::ModuleDef_tie<T>::ModuleDef_tie (T &t, PortableServer::POA_ptr poa)
+ : ptr_ (&t),
+ poa_ (PortableServer::POA::_duplicate (poa)),
+ rel_ (0)
+{}
+
+template <class T> ACE_INLINE
+POA_CORBA::ModuleDef_tie<T>::ModuleDef_tie (T *tp, ::CORBA::Boolean release)
+ : ptr_ (tp),
+ poa_ (PortableServer::POA::_nil ()),
+ rel_ (release)
+{}
+
+template <class T> ACE_INLINE
+POA_CORBA::ModuleDef_tie<T>::ModuleDef_tie (T *tp, PortableServer::POA_ptr poa, ::CORBA::Boolean release)
+ : ptr_ (tp),
+ poa_ (PortableServer::POA::_duplicate (poa)),
+ rel_ (release)
+{}
+
+template <class T> ACE_INLINE
+POA_CORBA::ModuleDef_tie<T>::~ModuleDef_tie (void)
+{
+ if (this->rel_)
+ {
+ delete this->ptr_;
+ }
+}
+
+template <class T> ACE_INLINE T *
+POA_CORBA::ModuleDef_tie<T>::_tied_object (void)
+{
+ return this->ptr_;
+}
+
+template <class T> ACE_INLINE void
+POA_CORBA::ModuleDef_tie<T>::_tied_object (T &obj)
+{
+ if (this->rel_)
+ {
+ delete this->ptr_;
+ }
+
+ this->ptr_ = &obj;
+ this->rel_ = 0;
+}
+
+template <class T> ACE_INLINE void
+POA_CORBA::ModuleDef_tie<T>::_tied_object (T *obj, ::CORBA::Boolean release)
+{
+ if (this->rel_)
+ {
+ delete this->ptr_;
+ }
+
+ this->ptr_ = obj;
+ this->rel_ = release;
+}
+
+template <class T> ACE_INLINE ::CORBA::Boolean
+POA_CORBA::ModuleDef_tie<T>::_is_owner (void)
+{
+ return this->rel_;
+}
+
+template <class T> ACE_INLINE void
+POA_CORBA::ModuleDef_tie<T>::_is_owner ( ::CORBA::Boolean b)
+{
+ this->rel_ = b;
+}
+
+template <class T> ACE_INLINE PortableServer::POA_ptr
+POA_CORBA::ModuleDef_tie<T>::_default_POA (ACE_ENV_SINGLE_ARG_DECL)
+{
+ if (! ::CORBA::is_nil (this->poa_.in ()))
+ {
+ return PortableServer::POA::_duplicate (this->poa_.in ());
+ }
+
+ return this->ModuleDef::_default_POA (ACE_ENV_SINGLE_ARG_PARAMETER);
+}
+
+// TAO_IDL - Generated from
+// be\be_visitor_operation/tie_si.cpp:101
+
+template <class T> ACE_INLINE
+::CORBA::DefinitionKind POA_CORBA::ModuleDef_tie<T>::def_kind (
+ ACE_ENV_SINGLE_ARG_DECL
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ))
+{
+ return this->ptr_->def_kind (
+ ACE_ENV_SINGLE_ARG_PARAMETER
+ );
+}
+
+// TAO_IDL - Generated from
+// be\be_visitor_operation/tie_si.cpp:101
+
+template <class T> ACE_INLINE
+void POA_CORBA::ModuleDef_tie<T>::destroy (
+ ACE_ENV_SINGLE_ARG_DECL
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ))
+{
+ this->ptr_->destroy (
+ ACE_ENV_SINGLE_ARG_PARAMETER
+ );
+}
+
+// TAO_IDL - Generated from
+// be\be_visitor_operation/tie_si.cpp:101
+
+template <class T> ACE_INLINE
+::CORBA::Contained_ptr POA_CORBA::ModuleDef_tie<T>::lookup (
+ const char * search_name
+ ACE_ENV_ARG_DECL
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ))
+{
+ return this->ptr_->lookup (
+ search_name
+ ACE_ENV_ARG_PARAMETER
+ );
+}
+
+// TAO_IDL - Generated from
+// be\be_visitor_operation/tie_si.cpp:101
+
+template <class T> ACE_INLINE
+::CORBA::ContainedSeq * POA_CORBA::ModuleDef_tie<T>::contents (
+ ::CORBA::DefinitionKind limit_type,
+ ::CORBA::Boolean exclude_inherited
+ ACE_ENV_ARG_DECL
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ))
+{
+ return this->ptr_->contents (
+ limit_type,
+ exclude_inherited
+ ACE_ENV_ARG_PARAMETER
+ );
+}
+
+// TAO_IDL - Generated from
+// be\be_visitor_operation/tie_si.cpp:101
+
+template <class T> ACE_INLINE
+::CORBA::ContainedSeq * POA_CORBA::ModuleDef_tie<T>::lookup_name (
+ const char * search_name,
+ ::CORBA::Long levels_to_search,
+ ::CORBA::DefinitionKind limit_type,
+ ::CORBA::Boolean exclude_inherited
+ ACE_ENV_ARG_DECL
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ))
+{
+ return this->ptr_->lookup_name (
+ search_name,
+ levels_to_search,
+ limit_type,
+ exclude_inherited
+ ACE_ENV_ARG_PARAMETER
+ );
+}
+
+// TAO_IDL - Generated from
+// be\be_visitor_operation/tie_si.cpp:101
+
+template <class T> ACE_INLINE
+::CORBA::Container::DescriptionSeq * POA_CORBA::ModuleDef_tie<T>::describe_contents (
+ ::CORBA::DefinitionKind limit_type,
+ ::CORBA::Boolean exclude_inherited,
+ ::CORBA::Long max_returned_objs
+ ACE_ENV_ARG_DECL
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ))
+{
+ return this->ptr_->describe_contents (
+ limit_type,
+ exclude_inherited,
+ max_returned_objs
+ ACE_ENV_ARG_PARAMETER
+ );
+}
+
+// TAO_IDL - Generated from
+// be\be_visitor_operation/tie_si.cpp:101
+
+template <class T> ACE_INLINE
+::CORBA::ModuleDef_ptr POA_CORBA::ModuleDef_tie<T>::create_module (
+ const char * id,
+ const char * name,
+ const char * version
+ ACE_ENV_ARG_DECL
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ))
+{
+ return this->ptr_->create_module (
+ id,
+ name,
+ version
+ ACE_ENV_ARG_PARAMETER
+ );
+}
+
+// TAO_IDL - Generated from
+// be\be_visitor_operation/tie_si.cpp:101
+
+template <class T> ACE_INLINE
+::CORBA::ConstantDef_ptr POA_CORBA::ModuleDef_tie<T>::create_constant (
+ const char * id,
+ const char * name,
+ const char * version,
+ ::CORBA::IDLType_ptr type,
+ const ::CORBA::Any & value
+ ACE_ENV_ARG_DECL
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ))
+{
+ return this->ptr_->create_constant (
+ id,
+ name,
+ version,
+ type,
+ value
+ ACE_ENV_ARG_PARAMETER
+ );
+}
+
+// TAO_IDL - Generated from
+// be\be_visitor_operation/tie_si.cpp:101
+
+template <class T> ACE_INLINE
+::CORBA::StructDef_ptr POA_CORBA::ModuleDef_tie<T>::create_struct (
+ const char * id,
+ const char * name,
+ const char * version,
+ const ::CORBA::StructMemberSeq & members
+ ACE_ENV_ARG_DECL
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ))
+{
+ return this->ptr_->create_struct (
+ id,
+ name,
+ version,
+ members
+ ACE_ENV_ARG_PARAMETER
+ );
+}
+
+// TAO_IDL - Generated from
+// be\be_visitor_operation/tie_si.cpp:101
+
+template <class T> ACE_INLINE
+::CORBA::UnionDef_ptr POA_CORBA::ModuleDef_tie<T>::create_union (
+ const char * id,
+ const char * name,
+ const char * version,
+ ::CORBA::IDLType_ptr discriminator_type,
+ const ::CORBA::UnionMemberSeq & members
+ ACE_ENV_ARG_DECL
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ))
+{
+ return this->ptr_->create_union (
+ id,
+ name,
+ version,
+ discriminator_type,
+ members
+ ACE_ENV_ARG_PARAMETER
+ );
+}
+
+// TAO_IDL - Generated from
+// be\be_visitor_operation/tie_si.cpp:101
+
+template <class T> ACE_INLINE
+::CORBA::EnumDef_ptr POA_CORBA::ModuleDef_tie<T>::create_enum (
+ const char * id,
+ const char * name,
+ const char * version,
+ const ::CORBA::EnumMemberSeq & members
+ ACE_ENV_ARG_DECL
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ))
+{
+ return this->ptr_->create_enum (
+ id,
+ name,
+ version,
+ members
+ ACE_ENV_ARG_PARAMETER
+ );
+}
+
+// TAO_IDL - Generated from
+// be\be_visitor_operation/tie_si.cpp:101
+
+template <class T> ACE_INLINE
+::CORBA::AliasDef_ptr POA_CORBA::ModuleDef_tie<T>::create_alias (
+ const char * id,
+ const char * name,
+ const char * version,
+ ::CORBA::IDLType_ptr original_type
+ ACE_ENV_ARG_DECL
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ))
+{
+ return this->ptr_->create_alias (
+ id,
+ name,
+ version,
+ original_type
+ ACE_ENV_ARG_PARAMETER
+ );
+}
+
+// TAO_IDL - Generated from
+// be\be_visitor_operation/tie_si.cpp:101
+
+template <class T> ACE_INLINE
+::CORBA::InterfaceDef_ptr POA_CORBA::ModuleDef_tie<T>::create_interface (
+ const char * id,
+ const char * name,
+ const char * version,
+ const ::CORBA::InterfaceDefSeq & base_interfaces
+ ACE_ENV_ARG_DECL
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ))
+{
+ return this->ptr_->create_interface (
+ id,
+ name,
+ version,
+ base_interfaces
+ ACE_ENV_ARG_PARAMETER
+ );
+}
+
+// TAO_IDL - Generated from
+// be\be_visitor_operation/tie_si.cpp:101
+
+template <class T> ACE_INLINE
+::CORBA::ValueDef_ptr POA_CORBA::ModuleDef_tie<T>::create_value (
+ const char * id,
+ const char * name,
+ const char * version,
+ ::CORBA::Boolean is_custom,
+ ::CORBA::Boolean is_abstract,
+ ::CORBA::ValueDef_ptr base_value,
+ ::CORBA::Boolean is_truncatable,
+ const ::CORBA::ValueDefSeq & abstract_base_values,
+ const ::CORBA::InterfaceDefSeq & supported_interfaces,
+ const ::CORBA::InitializerSeq & initializers
+ ACE_ENV_ARG_DECL
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ))
+{
+ return this->ptr_->create_value (
+ id,
+ name,
+ version,
+ is_custom,
+ is_abstract,
+ base_value,
+ is_truncatable,
+ abstract_base_values,
+ supported_interfaces,
+ initializers
+ ACE_ENV_ARG_PARAMETER
+ );
+}
+
+// TAO_IDL - Generated from
+// be\be_visitor_operation/tie_si.cpp:101
+
+template <class T> ACE_INLINE
+::CORBA::ValueBoxDef_ptr POA_CORBA::ModuleDef_tie<T>::create_value_box (
+ const char * id,
+ const char * name,
+ const char * version,
+ ::CORBA::IDLType_ptr original_type_def
+ ACE_ENV_ARG_DECL
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ))
+{
+ return this->ptr_->create_value_box (
+ id,
+ name,
+ version,
+ original_type_def
+ ACE_ENV_ARG_PARAMETER
+ );
+}
+
+// TAO_IDL - Generated from
+// be\be_visitor_operation/tie_si.cpp:101
+
+template <class T> ACE_INLINE
+::CORBA::ExceptionDef_ptr POA_CORBA::ModuleDef_tie<T>::create_exception (
+ const char * id,
+ const char * name,
+ const char * version,
+ const ::CORBA::StructMemberSeq & members
+ ACE_ENV_ARG_DECL
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ))
+{
+ return this->ptr_->create_exception (
+ id,
+ name,
+ version,
+ members
+ ACE_ENV_ARG_PARAMETER
+ );
+}
+
+// TAO_IDL - Generated from
+// be\be_visitor_operation/tie_si.cpp:101
+
+template <class T> ACE_INLINE
+::CORBA::NativeDef_ptr POA_CORBA::ModuleDef_tie<T>::create_native (
+ const char * id,
+ const char * name,
+ const char * version
+ ACE_ENV_ARG_DECL
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ))
+{
+ return this->ptr_->create_native (
+ id,
+ name,
+ version
+ ACE_ENV_ARG_PARAMETER
+ );
+}
+
+// TAO_IDL - Generated from
+// be\be_visitor_operation/tie_si.cpp:101
+
+template <class T> ACE_INLINE
+::CORBA::AbstractInterfaceDef_ptr POA_CORBA::ModuleDef_tie<T>::create_abstract_interface (
+ const char * id,
+ const char * name,
+ const char * version,
+ const ::CORBA::AbstractInterfaceDefSeq & base_interfaces
+ ACE_ENV_ARG_DECL
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ))
+{
+ return this->ptr_->create_abstract_interface (
+ id,
+ name,
+ version,
+ base_interfaces
+ ACE_ENV_ARG_PARAMETER
+ );
+}
+
+// TAO_IDL - Generated from
+// be\be_visitor_operation/tie_si.cpp:101
+
+template <class T> ACE_INLINE
+::CORBA::LocalInterfaceDef_ptr POA_CORBA::ModuleDef_tie<T>::create_local_interface (
+ const char * id,
+ const char * name,
+ const char * version,
+ const ::CORBA::InterfaceDefSeq & base_interfaces
+ ACE_ENV_ARG_DECL
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ))
+{
+ return this->ptr_->create_local_interface (
+ id,
+ name,
+ version,
+ base_interfaces
+ ACE_ENV_ARG_PARAMETER
+ );
+}
+
+// TAO_IDL - Generated from
+// be\be_visitor_operation/tie_si.cpp:101
+
+template <class T> ACE_INLINE
+::CORBA::ExtValueDef_ptr POA_CORBA::ModuleDef_tie<T>::create_ext_value (
+ const char * id,
+ const char * name,
+ const char * version,
+ ::CORBA::Boolean is_custom,
+ ::CORBA::Boolean is_abstract,
+ ::CORBA::ValueDef_ptr base_value,
+ ::CORBA::Boolean is_truncatable,
+ const ::CORBA::ValueDefSeq & abstract_base_values,
+ const ::CORBA::InterfaceDefSeq & supported_interfaces,
+ const ::CORBA::ExtInitializerSeq & initializers
+ ACE_ENV_ARG_DECL
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ))
+{
+ return this->ptr_->create_ext_value (
+ id,
+ name,
+ version,
+ is_custom,
+ is_abstract,
+ base_value,
+ is_truncatable,
+ abstract_base_values,
+ supported_interfaces,
+ initializers
+ ACE_ENV_ARG_PARAMETER
+ );
+}
+
+// TAO_IDL - Generated from
+// be\be_visitor_operation/tie_si.cpp:101
+
+template <class T> ACE_INLINE
+char * POA_CORBA::ModuleDef_tie<T>::id (
+ ACE_ENV_SINGLE_ARG_DECL
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ))
+{
+ return this->ptr_->id (
+ ACE_ENV_SINGLE_ARG_PARAMETER
+ );
+}
+
+// TAO_IDL - Generated from
+// be\be_visitor_operation/tie_si.cpp:101
+
+template <class T> ACE_INLINE
+void POA_CORBA::ModuleDef_tie<T>::id (
+ const char * id
+ ACE_ENV_ARG_DECL
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ))
+{
+ this->ptr_->id (
+ id
+ ACE_ENV_ARG_PARAMETER
+ );
+}
+
+// TAO_IDL - Generated from
+// be\be_visitor_operation/tie_si.cpp:101
+
+template <class T> ACE_INLINE
+char * POA_CORBA::ModuleDef_tie<T>::name (
+ ACE_ENV_SINGLE_ARG_DECL
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ))
+{
+ return this->ptr_->name (
+ ACE_ENV_SINGLE_ARG_PARAMETER
+ );
+}
+
+// TAO_IDL - Generated from
+// be\be_visitor_operation/tie_si.cpp:101
+
+template <class T> ACE_INLINE
+void POA_CORBA::ModuleDef_tie<T>::name (
+ const char * name
+ ACE_ENV_ARG_DECL
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ))
+{
+ this->ptr_->name (
+ name
+ ACE_ENV_ARG_PARAMETER
+ );
+}
+
+// TAO_IDL - Generated from
+// be\be_visitor_operation/tie_si.cpp:101
+
+template <class T> ACE_INLINE
+char * POA_CORBA::ModuleDef_tie<T>::version (
+ ACE_ENV_SINGLE_ARG_DECL
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ))
+{
+ return this->ptr_->version (
+ ACE_ENV_SINGLE_ARG_PARAMETER
+ );
+}
+
+// TAO_IDL - Generated from
+// be\be_visitor_operation/tie_si.cpp:101
+
+template <class T> ACE_INLINE
+void POA_CORBA::ModuleDef_tie<T>::version (
+ const char * version
+ ACE_ENV_ARG_DECL
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ))
+{
+ this->ptr_->version (
+ version
+ ACE_ENV_ARG_PARAMETER
+ );
+}
+
+// TAO_IDL - Generated from
+// be\be_visitor_operation/tie_si.cpp:101
+
+template <class T> ACE_INLINE
+::CORBA::Container_ptr POA_CORBA::ModuleDef_tie<T>::defined_in (
+ ACE_ENV_SINGLE_ARG_DECL
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ))
+{
+ return this->ptr_->defined_in (
+ ACE_ENV_SINGLE_ARG_PARAMETER
+ );
+}
+
+// TAO_IDL - Generated from
+// be\be_visitor_operation/tie_si.cpp:101
+
+template <class T> ACE_INLINE
+char * POA_CORBA::ModuleDef_tie<T>::absolute_name (
+ ACE_ENV_SINGLE_ARG_DECL
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ))
+{
+ return this->ptr_->absolute_name (
+ ACE_ENV_SINGLE_ARG_PARAMETER
+ );
+}
+
+// TAO_IDL - Generated from
+// be\be_visitor_operation/tie_si.cpp:101
+
+template <class T> ACE_INLINE
+::CORBA::Repository_ptr POA_CORBA::ModuleDef_tie<T>::containing_repository (
+ ACE_ENV_SINGLE_ARG_DECL
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ))
+{
+ return this->ptr_->containing_repository (
+ ACE_ENV_SINGLE_ARG_PARAMETER
+ );
+}
+
+// TAO_IDL - Generated from
+// be\be_visitor_operation/tie_si.cpp:101
+
+template <class T> ACE_INLINE
+::CORBA::Contained::Description * POA_CORBA::ModuleDef_tie<T>::describe (
+ ACE_ENV_SINGLE_ARG_DECL
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ))
+{
+ return this->ptr_->describe (
+ ACE_ENV_SINGLE_ARG_PARAMETER
+ );
+}
+
+// TAO_IDL - Generated from
+// be\be_visitor_operation/tie_si.cpp:101
+
+template <class T> ACE_INLINE
+void POA_CORBA::ModuleDef_tie<T>::move (
+ ::CORBA::Container_ptr new_container,
+ const char * new_name,
+ const char * new_version
+ ACE_ENV_ARG_DECL
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ))
+{
+ this->ptr_->move (
+ new_container,
+ new_name,
+ new_version
+ ACE_ENV_ARG_PARAMETER
+ );
+}
+
+// TAO_IDL - Generated from
+// be\be_visitor_interface/tie_si.cpp:96
+
+template <class T> ACE_INLINE
+POA_CORBA::ConstantDef_tie<T>::ConstantDef_tie (T &t)
+ : ptr_ (&t),
+ poa_ (PortableServer::POA::_nil ()),
+ rel_ (0)
+{}
+
+template <class T> ACE_INLINE
+POA_CORBA::ConstantDef_tie<T>::ConstantDef_tie (T &t, PortableServer::POA_ptr poa)
+ : ptr_ (&t),
+ poa_ (PortableServer::POA::_duplicate (poa)),
+ rel_ (0)
+{}
+
+template <class T> ACE_INLINE
+POA_CORBA::ConstantDef_tie<T>::ConstantDef_tie (T *tp, ::CORBA::Boolean release)
+ : ptr_ (tp),
+ poa_ (PortableServer::POA::_nil ()),
+ rel_ (release)
+{}
+
+template <class T> ACE_INLINE
+POA_CORBA::ConstantDef_tie<T>::ConstantDef_tie (T *tp, PortableServer::POA_ptr poa, ::CORBA::Boolean release)
+ : ptr_ (tp),
+ poa_ (PortableServer::POA::_duplicate (poa)),
+ rel_ (release)
+{}
+
+template <class T> ACE_INLINE
+POA_CORBA::ConstantDef_tie<T>::~ConstantDef_tie (void)
+{
+ if (this->rel_)
+ {
+ delete this->ptr_;
+ }
+}
+
+template <class T> ACE_INLINE T *
+POA_CORBA::ConstantDef_tie<T>::_tied_object (void)
+{
+ return this->ptr_;
+}
+
+template <class T> ACE_INLINE void
+POA_CORBA::ConstantDef_tie<T>::_tied_object (T &obj)
+{
+ if (this->rel_)
+ {
+ delete this->ptr_;
+ }
+
+ this->ptr_ = &obj;
+ this->rel_ = 0;
+}
+
+template <class T> ACE_INLINE void
+POA_CORBA::ConstantDef_tie<T>::_tied_object (T *obj, ::CORBA::Boolean release)
+{
+ if (this->rel_)
+ {
+ delete this->ptr_;
+ }
+
+ this->ptr_ = obj;
+ this->rel_ = release;
+}
+
+template <class T> ACE_INLINE ::CORBA::Boolean
+POA_CORBA::ConstantDef_tie<T>::_is_owner (void)
+{
+ return this->rel_;
+}
+
+template <class T> ACE_INLINE void
+POA_CORBA::ConstantDef_tie<T>::_is_owner ( ::CORBA::Boolean b)
+{
+ this->rel_ = b;
+}
+
+template <class T> ACE_INLINE PortableServer::POA_ptr
+POA_CORBA::ConstantDef_tie<T>::_default_POA (ACE_ENV_SINGLE_ARG_DECL)
+{
+ if (! ::CORBA::is_nil (this->poa_.in ()))
+ {
+ return PortableServer::POA::_duplicate (this->poa_.in ());
+ }
+
+ return this->ConstantDef::_default_POA (ACE_ENV_SINGLE_ARG_PARAMETER);
+}
+
+// TAO_IDL - Generated from
+// be\be_visitor_operation/tie_si.cpp:101
+
+template <class T> ACE_INLINE
+::CORBA::DefinitionKind POA_CORBA::ConstantDef_tie<T>::def_kind (
+ ACE_ENV_SINGLE_ARG_DECL
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ))
+{
+ return this->ptr_->def_kind (
+ ACE_ENV_SINGLE_ARG_PARAMETER
+ );
+}
+
+// TAO_IDL - Generated from
+// be\be_visitor_operation/tie_si.cpp:101
+
+template <class T> ACE_INLINE
+void POA_CORBA::ConstantDef_tie<T>::destroy (
+ ACE_ENV_SINGLE_ARG_DECL
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ))
+{
+ this->ptr_->destroy (
+ ACE_ENV_SINGLE_ARG_PARAMETER
+ );
+}
+
+// TAO_IDL - Generated from
+// be\be_visitor_operation/tie_si.cpp:101
+
+template <class T> ACE_INLINE
+char * POA_CORBA::ConstantDef_tie<T>::id (
+ ACE_ENV_SINGLE_ARG_DECL
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ))
+{
+ return this->ptr_->id (
+ ACE_ENV_SINGLE_ARG_PARAMETER
+ );
+}
+
+// TAO_IDL - Generated from
+// be\be_visitor_operation/tie_si.cpp:101
+
+template <class T> ACE_INLINE
+void POA_CORBA::ConstantDef_tie<T>::id (
+ const char * id
+ ACE_ENV_ARG_DECL
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ))
+{
+ this->ptr_->id (
+ id
+ ACE_ENV_ARG_PARAMETER
+ );
+}
+
+// TAO_IDL - Generated from
+// be\be_visitor_operation/tie_si.cpp:101
+
+template <class T> ACE_INLINE
+char * POA_CORBA::ConstantDef_tie<T>::name (
+ ACE_ENV_SINGLE_ARG_DECL
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ))
+{
+ return this->ptr_->name (
+ ACE_ENV_SINGLE_ARG_PARAMETER
+ );
+}
+
+// TAO_IDL - Generated from
+// be\be_visitor_operation/tie_si.cpp:101
+
+template <class T> ACE_INLINE
+void POA_CORBA::ConstantDef_tie<T>::name (
+ const char * name
+ ACE_ENV_ARG_DECL
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ))
+{
+ this->ptr_->name (
+ name
+ ACE_ENV_ARG_PARAMETER
+ );
+}
+
+// TAO_IDL - Generated from
+// be\be_visitor_operation/tie_si.cpp:101
+
+template <class T> ACE_INLINE
+char * POA_CORBA::ConstantDef_tie<T>::version (
+ ACE_ENV_SINGLE_ARG_DECL
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ))
+{
+ return this->ptr_->version (
+ ACE_ENV_SINGLE_ARG_PARAMETER
+ );
+}
+
+// TAO_IDL - Generated from
+// be\be_visitor_operation/tie_si.cpp:101
+
+template <class T> ACE_INLINE
+void POA_CORBA::ConstantDef_tie<T>::version (
+ const char * version
+ ACE_ENV_ARG_DECL
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ))
+{
+ this->ptr_->version (
+ version
+ ACE_ENV_ARG_PARAMETER
+ );
+}
+
+// TAO_IDL - Generated from
+// be\be_visitor_operation/tie_si.cpp:101
+
+template <class T> ACE_INLINE
+::CORBA::Container_ptr POA_CORBA::ConstantDef_tie<T>::defined_in (
+ ACE_ENV_SINGLE_ARG_DECL
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ))
+{
+ return this->ptr_->defined_in (
+ ACE_ENV_SINGLE_ARG_PARAMETER
+ );
+}
+
+// TAO_IDL - Generated from
+// be\be_visitor_operation/tie_si.cpp:101
+
+template <class T> ACE_INLINE
+char * POA_CORBA::ConstantDef_tie<T>::absolute_name (
+ ACE_ENV_SINGLE_ARG_DECL
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ))
+{
+ return this->ptr_->absolute_name (
+ ACE_ENV_SINGLE_ARG_PARAMETER
+ );
+}
+
+// TAO_IDL - Generated from
+// be\be_visitor_operation/tie_si.cpp:101
+
+template <class T> ACE_INLINE
+::CORBA::Repository_ptr POA_CORBA::ConstantDef_tie<T>::containing_repository (
+ ACE_ENV_SINGLE_ARG_DECL
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ))
+{
+ return this->ptr_->containing_repository (
+ ACE_ENV_SINGLE_ARG_PARAMETER
+ );
+}
+
+// TAO_IDL - Generated from
+// be\be_visitor_operation/tie_si.cpp:101
+
+template <class T> ACE_INLINE
+::CORBA::Contained::Description * POA_CORBA::ConstantDef_tie<T>::describe (
+ ACE_ENV_SINGLE_ARG_DECL
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ))
+{
+ return this->ptr_->describe (
+ ACE_ENV_SINGLE_ARG_PARAMETER
+ );
+}
+
+// TAO_IDL - Generated from
+// be\be_visitor_operation/tie_si.cpp:101
+
+template <class T> ACE_INLINE
+void POA_CORBA::ConstantDef_tie<T>::move (
+ ::CORBA::Container_ptr new_container,
+ const char * new_name,
+ const char * new_version
+ ACE_ENV_ARG_DECL
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ))
+{
+ this->ptr_->move (
+ new_container,
+ new_name,
+ new_version
+ ACE_ENV_ARG_PARAMETER
+ );
+}
+
+// TAO_IDL - Generated from
+// be\be_visitor_operation/tie_si.cpp:101
+
+template <class T> ACE_INLINE
+::CORBA::TypeCode_ptr POA_CORBA::ConstantDef_tie<T>::type (
+ ACE_ENV_SINGLE_ARG_DECL
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ))
+{
+ return this->ptr_->type (
+ ACE_ENV_SINGLE_ARG_PARAMETER
+ );
+}
+
+// TAO_IDL - Generated from
+// be\be_visitor_operation/tie_si.cpp:101
+
+template <class T> ACE_INLINE
+::CORBA::IDLType_ptr POA_CORBA::ConstantDef_tie<T>::type_def (
+ ACE_ENV_SINGLE_ARG_DECL
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ))
+{
+ return this->ptr_->type_def (
+ ACE_ENV_SINGLE_ARG_PARAMETER
+ );
+}
+
+// TAO_IDL - Generated from
+// be\be_visitor_operation/tie_si.cpp:101
+
+template <class T> ACE_INLINE
+void POA_CORBA::ConstantDef_tie<T>::type_def (
+ ::CORBA::IDLType_ptr type_def
+ ACE_ENV_ARG_DECL
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ))
+{
+ this->ptr_->type_def (
+ type_def
+ ACE_ENV_ARG_PARAMETER
+ );
+}
+
+// TAO_IDL - Generated from
+// be\be_visitor_operation/tie_si.cpp:101
+
+template <class T> ACE_INLINE
+::CORBA::Any * POA_CORBA::ConstantDef_tie<T>::value (
+ ACE_ENV_SINGLE_ARG_DECL
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ))
+{
+ return this->ptr_->value (
+ ACE_ENV_SINGLE_ARG_PARAMETER
+ );
+}
+
+// TAO_IDL - Generated from
+// be\be_visitor_operation/tie_si.cpp:101
+
+template <class T> ACE_INLINE
+void POA_CORBA::ConstantDef_tie<T>::value (
+ const ::CORBA::Any & value
+ ACE_ENV_ARG_DECL
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ))
+{
+ this->ptr_->value (
+ value
+ ACE_ENV_ARG_PARAMETER
+ );
+}
+
+// TAO_IDL - Generated from
+// be\be_visitor_interface/tie_si.cpp:96
+
+template <class T> ACE_INLINE
+POA_CORBA::StructDef_tie<T>::StructDef_tie (T &t)
+ : ptr_ (&t),
+ poa_ (PortableServer::POA::_nil ()),
+ rel_ (0)
+{}
+
+template <class T> ACE_INLINE
+POA_CORBA::StructDef_tie<T>::StructDef_tie (T &t, PortableServer::POA_ptr poa)
+ : ptr_ (&t),
+ poa_ (PortableServer::POA::_duplicate (poa)),
+ rel_ (0)
+{}
+
+template <class T> ACE_INLINE
+POA_CORBA::StructDef_tie<T>::StructDef_tie (T *tp, ::CORBA::Boolean release)
+ : ptr_ (tp),
+ poa_ (PortableServer::POA::_nil ()),
+ rel_ (release)
+{}
+
+template <class T> ACE_INLINE
+POA_CORBA::StructDef_tie<T>::StructDef_tie (T *tp, PortableServer::POA_ptr poa, ::CORBA::Boolean release)
+ : ptr_ (tp),
+ poa_ (PortableServer::POA::_duplicate (poa)),
+ rel_ (release)
+{}
+
+template <class T> ACE_INLINE
+POA_CORBA::StructDef_tie<T>::~StructDef_tie (void)
+{
+ if (this->rel_)
+ {
+ delete this->ptr_;
+ }
+}
+
+template <class T> ACE_INLINE T *
+POA_CORBA::StructDef_tie<T>::_tied_object (void)
+{
+ return this->ptr_;
+}
+
+template <class T> ACE_INLINE void
+POA_CORBA::StructDef_tie<T>::_tied_object (T &obj)
+{
+ if (this->rel_)
+ {
+ delete this->ptr_;
+ }
+
+ this->ptr_ = &obj;
+ this->rel_ = 0;
+}
+
+template <class T> ACE_INLINE void
+POA_CORBA::StructDef_tie<T>::_tied_object (T *obj, ::CORBA::Boolean release)
+{
+ if (this->rel_)
+ {
+ delete this->ptr_;
+ }
+
+ this->ptr_ = obj;
+ this->rel_ = release;
+}
+
+template <class T> ACE_INLINE ::CORBA::Boolean
+POA_CORBA::StructDef_tie<T>::_is_owner (void)
+{
+ return this->rel_;
+}
+
+template <class T> ACE_INLINE void
+POA_CORBA::StructDef_tie<T>::_is_owner ( ::CORBA::Boolean b)
+{
+ this->rel_ = b;
+}
+
+template <class T> ACE_INLINE PortableServer::POA_ptr
+POA_CORBA::StructDef_tie<T>::_default_POA (ACE_ENV_SINGLE_ARG_DECL)
+{
+ if (! ::CORBA::is_nil (this->poa_.in ()))
+ {
+ return PortableServer::POA::_duplicate (this->poa_.in ());
+ }
+
+ return this->StructDef::_default_POA (ACE_ENV_SINGLE_ARG_PARAMETER);
+}
+
+// TAO_IDL - Generated from
+// be\be_visitor_operation/tie_si.cpp:101
+
+template <class T> ACE_INLINE
+::CORBA::DefinitionKind POA_CORBA::StructDef_tie<T>::def_kind (
+ ACE_ENV_SINGLE_ARG_DECL
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ))
+{
+ return this->ptr_->def_kind (
+ ACE_ENV_SINGLE_ARG_PARAMETER
+ );
+}
+
+// TAO_IDL - Generated from
+// be\be_visitor_operation/tie_si.cpp:101
+
+template <class T> ACE_INLINE
+void POA_CORBA::StructDef_tie<T>::destroy (
+ ACE_ENV_SINGLE_ARG_DECL
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ))
+{
+ this->ptr_->destroy (
+ ACE_ENV_SINGLE_ARG_PARAMETER
+ );
+}
+
+// TAO_IDL - Generated from
+// be\be_visitor_operation/tie_si.cpp:101
+
+template <class T> ACE_INLINE
+char * POA_CORBA::StructDef_tie<T>::id (
+ ACE_ENV_SINGLE_ARG_DECL
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ))
+{
+ return this->ptr_->id (
+ ACE_ENV_SINGLE_ARG_PARAMETER
+ );
+}
+
+// TAO_IDL - Generated from
+// be\be_visitor_operation/tie_si.cpp:101
+
+template <class T> ACE_INLINE
+void POA_CORBA::StructDef_tie<T>::id (
+ const char * id
+ ACE_ENV_ARG_DECL
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ))
+{
+ this->ptr_->id (
+ id
+ ACE_ENV_ARG_PARAMETER
+ );
+}
+
+// TAO_IDL - Generated from
+// be\be_visitor_operation/tie_si.cpp:101
+
+template <class T> ACE_INLINE
+char * POA_CORBA::StructDef_tie<T>::name (
+ ACE_ENV_SINGLE_ARG_DECL
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ))
+{
+ return this->ptr_->name (
+ ACE_ENV_SINGLE_ARG_PARAMETER
+ );
+}
+
+// TAO_IDL - Generated from
+// be\be_visitor_operation/tie_si.cpp:101
+
+template <class T> ACE_INLINE
+void POA_CORBA::StructDef_tie<T>::name (
+ const char * name
+ ACE_ENV_ARG_DECL
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ))
+{
+ this->ptr_->name (
+ name
+ ACE_ENV_ARG_PARAMETER
+ );
+}
+
+// TAO_IDL - Generated from
+// be\be_visitor_operation/tie_si.cpp:101
+
+template <class T> ACE_INLINE
+char * POA_CORBA::StructDef_tie<T>::version (
+ ACE_ENV_SINGLE_ARG_DECL
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ))
+{
+ return this->ptr_->version (
+ ACE_ENV_SINGLE_ARG_PARAMETER
+ );
+}
+
+// TAO_IDL - Generated from
+// be\be_visitor_operation/tie_si.cpp:101
+
+template <class T> ACE_INLINE
+void POA_CORBA::StructDef_tie<T>::version (
+ const char * version
+ ACE_ENV_ARG_DECL
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ))
+{
+ this->ptr_->version (
+ version
+ ACE_ENV_ARG_PARAMETER
+ );
+}
+
+// TAO_IDL - Generated from
+// be\be_visitor_operation/tie_si.cpp:101
+
+template <class T> ACE_INLINE
+::CORBA::Container_ptr POA_CORBA::StructDef_tie<T>::defined_in (
+ ACE_ENV_SINGLE_ARG_DECL
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ))
+{
+ return this->ptr_->defined_in (
+ ACE_ENV_SINGLE_ARG_PARAMETER
+ );
+}
+
+// TAO_IDL - Generated from
+// be\be_visitor_operation/tie_si.cpp:101
+
+template <class T> ACE_INLINE
+char * POA_CORBA::StructDef_tie<T>::absolute_name (
+ ACE_ENV_SINGLE_ARG_DECL
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ))
+{
+ return this->ptr_->absolute_name (
+ ACE_ENV_SINGLE_ARG_PARAMETER
+ );
+}
+
+// TAO_IDL - Generated from
+// be\be_visitor_operation/tie_si.cpp:101
+
+template <class T> ACE_INLINE
+::CORBA::Repository_ptr POA_CORBA::StructDef_tie<T>::containing_repository (
+ ACE_ENV_SINGLE_ARG_DECL
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ))
+{
+ return this->ptr_->containing_repository (
+ ACE_ENV_SINGLE_ARG_PARAMETER
+ );
+}
+
+// TAO_IDL - Generated from
+// be\be_visitor_operation/tie_si.cpp:101
+
+template <class T> ACE_INLINE
+::CORBA::Contained::Description * POA_CORBA::StructDef_tie<T>::describe (
+ ACE_ENV_SINGLE_ARG_DECL
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ))
+{
+ return this->ptr_->describe (
+ ACE_ENV_SINGLE_ARG_PARAMETER
+ );
+}
+
+// TAO_IDL - Generated from
+// be\be_visitor_operation/tie_si.cpp:101
+
+template <class T> ACE_INLINE
+void POA_CORBA::StructDef_tie<T>::move (
+ ::CORBA::Container_ptr new_container,
+ const char * new_name,
+ const char * new_version
+ ACE_ENV_ARG_DECL
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ))
+{
+ this->ptr_->move (
+ new_container,
+ new_name,
+ new_version
+ ACE_ENV_ARG_PARAMETER
+ );
+}
+
+// TAO_IDL - Generated from
+// be\be_visitor_operation/tie_si.cpp:101
+
+template <class T> ACE_INLINE
+::CORBA::TypeCode_ptr POA_CORBA::StructDef_tie<T>::type (
+ ACE_ENV_SINGLE_ARG_DECL
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ))
+{
+ return this->ptr_->type (
+ ACE_ENV_SINGLE_ARG_PARAMETER
+ );
+}
+
+// TAO_IDL - Generated from
+// be\be_visitor_operation/tie_si.cpp:101
+
+template <class T> ACE_INLINE
+::CORBA::Contained_ptr POA_CORBA::StructDef_tie<T>::lookup (
+ const char * search_name
+ ACE_ENV_ARG_DECL
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ))
+{
+ return this->ptr_->lookup (
+ search_name
+ ACE_ENV_ARG_PARAMETER
+ );
+}
+
+// TAO_IDL - Generated from
+// be\be_visitor_operation/tie_si.cpp:101
+
+template <class T> ACE_INLINE
+::CORBA::ContainedSeq * POA_CORBA::StructDef_tie<T>::contents (
+ ::CORBA::DefinitionKind limit_type,
+ ::CORBA::Boolean exclude_inherited
+ ACE_ENV_ARG_DECL
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ))
+{
+ return this->ptr_->contents (
+ limit_type,
+ exclude_inherited
+ ACE_ENV_ARG_PARAMETER
+ );
+}
+
+// TAO_IDL - Generated from
+// be\be_visitor_operation/tie_si.cpp:101
+
+template <class T> ACE_INLINE
+::CORBA::ContainedSeq * POA_CORBA::StructDef_tie<T>::lookup_name (
+ const char * search_name,
+ ::CORBA::Long levels_to_search,
+ ::CORBA::DefinitionKind limit_type,
+ ::CORBA::Boolean exclude_inherited
+ ACE_ENV_ARG_DECL
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ))
+{
+ return this->ptr_->lookup_name (
+ search_name,
+ levels_to_search,
+ limit_type,
+ exclude_inherited
+ ACE_ENV_ARG_PARAMETER
+ );
+}
+
+// TAO_IDL - Generated from
+// be\be_visitor_operation/tie_si.cpp:101
+
+template <class T> ACE_INLINE
+::CORBA::Container::DescriptionSeq * POA_CORBA::StructDef_tie<T>::describe_contents (
+ ::CORBA::DefinitionKind limit_type,
+ ::CORBA::Boolean exclude_inherited,
+ ::CORBA::Long max_returned_objs
+ ACE_ENV_ARG_DECL
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ))
+{
+ return this->ptr_->describe_contents (
+ limit_type,
+ exclude_inherited,
+ max_returned_objs
+ ACE_ENV_ARG_PARAMETER
+ );
+}
+
+// TAO_IDL - Generated from
+// be\be_visitor_operation/tie_si.cpp:101
+
+template <class T> ACE_INLINE
+::CORBA::ModuleDef_ptr POA_CORBA::StructDef_tie<T>::create_module (
+ const char * id,
+ const char * name,
+ const char * version
+ ACE_ENV_ARG_DECL
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ))
+{
+ return this->ptr_->create_module (
+ id,
+ name,
+ version
+ ACE_ENV_ARG_PARAMETER
+ );
+}
+
+// TAO_IDL - Generated from
+// be\be_visitor_operation/tie_si.cpp:101
+
+template <class T> ACE_INLINE
+::CORBA::ConstantDef_ptr POA_CORBA::StructDef_tie<T>::create_constant (
+ const char * id,
+ const char * name,
+ const char * version,
+ ::CORBA::IDLType_ptr type,
+ const ::CORBA::Any & value
+ ACE_ENV_ARG_DECL
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ))
+{
+ return this->ptr_->create_constant (
+ id,
+ name,
+ version,
+ type,
+ value
+ ACE_ENV_ARG_PARAMETER
+ );
+}
+
+// TAO_IDL - Generated from
+// be\be_visitor_operation/tie_si.cpp:101
+
+template <class T> ACE_INLINE
+::CORBA::StructDef_ptr POA_CORBA::StructDef_tie<T>::create_struct (
+ const char * id,
+ const char * name,
+ const char * version,
+ const ::CORBA::StructMemberSeq & members
+ ACE_ENV_ARG_DECL
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ))
+{
+ return this->ptr_->create_struct (
+ id,
+ name,
+ version,
+ members
+ ACE_ENV_ARG_PARAMETER
+ );
+}
+
+// TAO_IDL - Generated from
+// be\be_visitor_operation/tie_si.cpp:101
+
+template <class T> ACE_INLINE
+::CORBA::UnionDef_ptr POA_CORBA::StructDef_tie<T>::create_union (
+ const char * id,
+ const char * name,
+ const char * version,
+ ::CORBA::IDLType_ptr discriminator_type,
+ const ::CORBA::UnionMemberSeq & members
+ ACE_ENV_ARG_DECL
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ))
+{
+ return this->ptr_->create_union (
+ id,
+ name,
+ version,
+ discriminator_type,
+ members
+ ACE_ENV_ARG_PARAMETER
+ );
+}
+
+// TAO_IDL - Generated from
+// be\be_visitor_operation/tie_si.cpp:101
+
+template <class T> ACE_INLINE
+::CORBA::EnumDef_ptr POA_CORBA::StructDef_tie<T>::create_enum (
+ const char * id,
+ const char * name,
+ const char * version,
+ const ::CORBA::EnumMemberSeq & members
+ ACE_ENV_ARG_DECL
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ))
+{
+ return this->ptr_->create_enum (
+ id,
+ name,
+ version,
+ members
+ ACE_ENV_ARG_PARAMETER
+ );
+}
+
+// TAO_IDL - Generated from
+// be\be_visitor_operation/tie_si.cpp:101
+
+template <class T> ACE_INLINE
+::CORBA::AliasDef_ptr POA_CORBA::StructDef_tie<T>::create_alias (
+ const char * id,
+ const char * name,
+ const char * version,
+ ::CORBA::IDLType_ptr original_type
+ ACE_ENV_ARG_DECL
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ))
+{
+ return this->ptr_->create_alias (
+ id,
+ name,
+ version,
+ original_type
+ ACE_ENV_ARG_PARAMETER
+ );
+}
+
+// TAO_IDL - Generated from
+// be\be_visitor_operation/tie_si.cpp:101
+
+template <class T> ACE_INLINE
+::CORBA::InterfaceDef_ptr POA_CORBA::StructDef_tie<T>::create_interface (
+ const char * id,
+ const char * name,
+ const char * version,
+ const ::CORBA::InterfaceDefSeq & base_interfaces
+ ACE_ENV_ARG_DECL
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ))
+{
+ return this->ptr_->create_interface (
+ id,
+ name,
+ version,
+ base_interfaces
+ ACE_ENV_ARG_PARAMETER
+ );
+}
+
+// TAO_IDL - Generated from
+// be\be_visitor_operation/tie_si.cpp:101
+
+template <class T> ACE_INLINE
+::CORBA::ValueDef_ptr POA_CORBA::StructDef_tie<T>::create_value (
+ const char * id,
+ const char * name,
+ const char * version,
+ ::CORBA::Boolean is_custom,
+ ::CORBA::Boolean is_abstract,
+ ::CORBA::ValueDef_ptr base_value,
+ ::CORBA::Boolean is_truncatable,
+ const ::CORBA::ValueDefSeq & abstract_base_values,
+ const ::CORBA::InterfaceDefSeq & supported_interfaces,
+ const ::CORBA::InitializerSeq & initializers
+ ACE_ENV_ARG_DECL
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ))
+{
+ return this->ptr_->create_value (
+ id,
+ name,
+ version,
+ is_custom,
+ is_abstract,
+ base_value,
+ is_truncatable,
+ abstract_base_values,
+ supported_interfaces,
+ initializers
+ ACE_ENV_ARG_PARAMETER
+ );
+}
+
+// TAO_IDL - Generated from
+// be\be_visitor_operation/tie_si.cpp:101
+
+template <class T> ACE_INLINE
+::CORBA::ValueBoxDef_ptr POA_CORBA::StructDef_tie<T>::create_value_box (
+ const char * id,
+ const char * name,
+ const char * version,
+ ::CORBA::IDLType_ptr original_type_def
+ ACE_ENV_ARG_DECL
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ))
+{
+ return this->ptr_->create_value_box (
+ id,
+ name,
+ version,
+ original_type_def
+ ACE_ENV_ARG_PARAMETER
+ );
+}
+
+// TAO_IDL - Generated from
+// be\be_visitor_operation/tie_si.cpp:101
+
+template <class T> ACE_INLINE
+::CORBA::ExceptionDef_ptr POA_CORBA::StructDef_tie<T>::create_exception (
+ const char * id,
+ const char * name,
+ const char * version,
+ const ::CORBA::StructMemberSeq & members
+ ACE_ENV_ARG_DECL
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ))
+{
+ return this->ptr_->create_exception (
+ id,
+ name,
+ version,
+ members
+ ACE_ENV_ARG_PARAMETER
+ );
+}
+
+// TAO_IDL - Generated from
+// be\be_visitor_operation/tie_si.cpp:101
+
+template <class T> ACE_INLINE
+::CORBA::NativeDef_ptr POA_CORBA::StructDef_tie<T>::create_native (
+ const char * id,
+ const char * name,
+ const char * version
+ ACE_ENV_ARG_DECL
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ))
+{
+ return this->ptr_->create_native (
+ id,
+ name,
+ version
+ ACE_ENV_ARG_PARAMETER
+ );
+}
+
+// TAO_IDL - Generated from
+// be\be_visitor_operation/tie_si.cpp:101
+
+template <class T> ACE_INLINE
+::CORBA::AbstractInterfaceDef_ptr POA_CORBA::StructDef_tie<T>::create_abstract_interface (
+ const char * id,
+ const char * name,
+ const char * version,
+ const ::CORBA::AbstractInterfaceDefSeq & base_interfaces
+ ACE_ENV_ARG_DECL
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ))
+{
+ return this->ptr_->create_abstract_interface (
+ id,
+ name,
+ version,
+ base_interfaces
+ ACE_ENV_ARG_PARAMETER
+ );
+}
+
+// TAO_IDL - Generated from
+// be\be_visitor_operation/tie_si.cpp:101
+
+template <class T> ACE_INLINE
+::CORBA::LocalInterfaceDef_ptr POA_CORBA::StructDef_tie<T>::create_local_interface (
+ const char * id,
+ const char * name,
+ const char * version,
+ const ::CORBA::InterfaceDefSeq & base_interfaces
+ ACE_ENV_ARG_DECL
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ))
+{
+ return this->ptr_->create_local_interface (
+ id,
+ name,
+ version,
+ base_interfaces
+ ACE_ENV_ARG_PARAMETER
+ );
+}
+
+// TAO_IDL - Generated from
+// be\be_visitor_operation/tie_si.cpp:101
+
+template <class T> ACE_INLINE
+::CORBA::ExtValueDef_ptr POA_CORBA::StructDef_tie<T>::create_ext_value (
+ const char * id,
+ const char * name,
+ const char * version,
+ ::CORBA::Boolean is_custom,
+ ::CORBA::Boolean is_abstract,
+ ::CORBA::ValueDef_ptr base_value,
+ ::CORBA::Boolean is_truncatable,
+ const ::CORBA::ValueDefSeq & abstract_base_values,
+ const ::CORBA::InterfaceDefSeq & supported_interfaces,
+ const ::CORBA::ExtInitializerSeq & initializers
+ ACE_ENV_ARG_DECL
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ))
+{
+ return this->ptr_->create_ext_value (
+ id,
+ name,
+ version,
+ is_custom,
+ is_abstract,
+ base_value,
+ is_truncatable,
+ abstract_base_values,
+ supported_interfaces,
+ initializers
+ ACE_ENV_ARG_PARAMETER
+ );
+}
+
+// TAO_IDL - Generated from
+// be\be_visitor_operation/tie_si.cpp:101
+
+template <class T> ACE_INLINE
+::CORBA::StructMemberSeq * POA_CORBA::StructDef_tie<T>::members (
+ ACE_ENV_SINGLE_ARG_DECL
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ))
+{
+ return this->ptr_->members (
+ ACE_ENV_SINGLE_ARG_PARAMETER
+ );
+}
+
+// TAO_IDL - Generated from
+// be\be_visitor_operation/tie_si.cpp:101
+
+template <class T> ACE_INLINE
+void POA_CORBA::StructDef_tie<T>::members (
+ const ::CORBA::StructMemberSeq & members
+ ACE_ENV_ARG_DECL
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ))
+{
+ this->ptr_->members (
+ members
+ ACE_ENV_ARG_PARAMETER
+ );
+}
+
+// TAO_IDL - Generated from
+// be\be_visitor_interface/tie_si.cpp:96
+
+template <class T> ACE_INLINE
+POA_CORBA::UnionDef_tie<T>::UnionDef_tie (T &t)
+ : ptr_ (&t),
+ poa_ (PortableServer::POA::_nil ()),
+ rel_ (0)
+{}
+
+template <class T> ACE_INLINE
+POA_CORBA::UnionDef_tie<T>::UnionDef_tie (T &t, PortableServer::POA_ptr poa)
+ : ptr_ (&t),
+ poa_ (PortableServer::POA::_duplicate (poa)),
+ rel_ (0)
+{}
+
+template <class T> ACE_INLINE
+POA_CORBA::UnionDef_tie<T>::UnionDef_tie (T *tp, ::CORBA::Boolean release)
+ : ptr_ (tp),
+ poa_ (PortableServer::POA::_nil ()),
+ rel_ (release)
+{}
+
+template <class T> ACE_INLINE
+POA_CORBA::UnionDef_tie<T>::UnionDef_tie (T *tp, PortableServer::POA_ptr poa, ::CORBA::Boolean release)
+ : ptr_ (tp),
+ poa_ (PortableServer::POA::_duplicate (poa)),
+ rel_ (release)
+{}
+
+template <class T> ACE_INLINE
+POA_CORBA::UnionDef_tie<T>::~UnionDef_tie (void)
+{
+ if (this->rel_)
+ {
+ delete this->ptr_;
+ }
+}
+
+template <class T> ACE_INLINE T *
+POA_CORBA::UnionDef_tie<T>::_tied_object (void)
+{
+ return this->ptr_;
+}
+
+template <class T> ACE_INLINE void
+POA_CORBA::UnionDef_tie<T>::_tied_object (T &obj)
+{
+ if (this->rel_)
+ {
+ delete this->ptr_;
+ }
+
+ this->ptr_ = &obj;
+ this->rel_ = 0;
+}
+
+template <class T> ACE_INLINE void
+POA_CORBA::UnionDef_tie<T>::_tied_object (T *obj, ::CORBA::Boolean release)
+{
+ if (this->rel_)
+ {
+ delete this->ptr_;
+ }
+
+ this->ptr_ = obj;
+ this->rel_ = release;
+}
+
+template <class T> ACE_INLINE ::CORBA::Boolean
+POA_CORBA::UnionDef_tie<T>::_is_owner (void)
+{
+ return this->rel_;
+}
+
+template <class T> ACE_INLINE void
+POA_CORBA::UnionDef_tie<T>::_is_owner ( ::CORBA::Boolean b)
+{
+ this->rel_ = b;
+}
+
+template <class T> ACE_INLINE PortableServer::POA_ptr
+POA_CORBA::UnionDef_tie<T>::_default_POA (ACE_ENV_SINGLE_ARG_DECL)
+{
+ if (! ::CORBA::is_nil (this->poa_.in ()))
+ {
+ return PortableServer::POA::_duplicate (this->poa_.in ());
+ }
+
+ return this->UnionDef::_default_POA (ACE_ENV_SINGLE_ARG_PARAMETER);
+}
+
+// TAO_IDL - Generated from
+// be\be_visitor_operation/tie_si.cpp:101
+
+template <class T> ACE_INLINE
+::CORBA::DefinitionKind POA_CORBA::UnionDef_tie<T>::def_kind (
+ ACE_ENV_SINGLE_ARG_DECL
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ))
+{
+ return this->ptr_->def_kind (
+ ACE_ENV_SINGLE_ARG_PARAMETER
+ );
+}
+
+// TAO_IDL - Generated from
+// be\be_visitor_operation/tie_si.cpp:101
+
+template <class T> ACE_INLINE
+void POA_CORBA::UnionDef_tie<T>::destroy (
+ ACE_ENV_SINGLE_ARG_DECL
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ))
+{
+ this->ptr_->destroy (
+ ACE_ENV_SINGLE_ARG_PARAMETER
+ );
+}
+
+// TAO_IDL - Generated from
+// be\be_visitor_operation/tie_si.cpp:101
+
+template <class T> ACE_INLINE
+char * POA_CORBA::UnionDef_tie<T>::id (
+ ACE_ENV_SINGLE_ARG_DECL
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ))
+{
+ return this->ptr_->id (
+ ACE_ENV_SINGLE_ARG_PARAMETER
+ );
+}
+
+// TAO_IDL - Generated from
+// be\be_visitor_operation/tie_si.cpp:101
+
+template <class T> ACE_INLINE
+void POA_CORBA::UnionDef_tie<T>::id (
+ const char * id
+ ACE_ENV_ARG_DECL
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ))
+{
+ this->ptr_->id (
+ id
+ ACE_ENV_ARG_PARAMETER
+ );
+}
+
+// TAO_IDL - Generated from
+// be\be_visitor_operation/tie_si.cpp:101
+
+template <class T> ACE_INLINE
+char * POA_CORBA::UnionDef_tie<T>::name (
+ ACE_ENV_SINGLE_ARG_DECL
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ))
+{
+ return this->ptr_->name (
+ ACE_ENV_SINGLE_ARG_PARAMETER
+ );
+}
+
+// TAO_IDL - Generated from
+// be\be_visitor_operation/tie_si.cpp:101
+
+template <class T> ACE_INLINE
+void POA_CORBA::UnionDef_tie<T>::name (
+ const char * name
+ ACE_ENV_ARG_DECL
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ))
+{
+ this->ptr_->name (
+ name
+ ACE_ENV_ARG_PARAMETER
+ );
+}
+
+// TAO_IDL - Generated from
+// be\be_visitor_operation/tie_si.cpp:101
+
+template <class T> ACE_INLINE
+char * POA_CORBA::UnionDef_tie<T>::version (
+ ACE_ENV_SINGLE_ARG_DECL
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ))
+{
+ return this->ptr_->version (
+ ACE_ENV_SINGLE_ARG_PARAMETER
+ );
+}
+
+// TAO_IDL - Generated from
+// be\be_visitor_operation/tie_si.cpp:101
+
+template <class T> ACE_INLINE
+void POA_CORBA::UnionDef_tie<T>::version (
+ const char * version
+ ACE_ENV_ARG_DECL
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ))
+{
+ this->ptr_->version (
+ version
+ ACE_ENV_ARG_PARAMETER
+ );
+}
+
+// TAO_IDL - Generated from
+// be\be_visitor_operation/tie_si.cpp:101
+
+template <class T> ACE_INLINE
+::CORBA::Container_ptr POA_CORBA::UnionDef_tie<T>::defined_in (
+ ACE_ENV_SINGLE_ARG_DECL
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ))
+{
+ return this->ptr_->defined_in (
+ ACE_ENV_SINGLE_ARG_PARAMETER
+ );
+}
+
+// TAO_IDL - Generated from
+// be\be_visitor_operation/tie_si.cpp:101
+
+template <class T> ACE_INLINE
+char * POA_CORBA::UnionDef_tie<T>::absolute_name (
+ ACE_ENV_SINGLE_ARG_DECL
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ))
+{
+ return this->ptr_->absolute_name (
+ ACE_ENV_SINGLE_ARG_PARAMETER
+ );
+}
+
+// TAO_IDL - Generated from
+// be\be_visitor_operation/tie_si.cpp:101
+
+template <class T> ACE_INLINE
+::CORBA::Repository_ptr POA_CORBA::UnionDef_tie<T>::containing_repository (
+ ACE_ENV_SINGLE_ARG_DECL
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ))
+{
+ return this->ptr_->containing_repository (
+ ACE_ENV_SINGLE_ARG_PARAMETER
+ );
+}
+
+// TAO_IDL - Generated from
+// be\be_visitor_operation/tie_si.cpp:101
+
+template <class T> ACE_INLINE
+::CORBA::Contained::Description * POA_CORBA::UnionDef_tie<T>::describe (
+ ACE_ENV_SINGLE_ARG_DECL
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ))
+{
+ return this->ptr_->describe (
+ ACE_ENV_SINGLE_ARG_PARAMETER
+ );
+}
+
+// TAO_IDL - Generated from
+// be\be_visitor_operation/tie_si.cpp:101
+
+template <class T> ACE_INLINE
+void POA_CORBA::UnionDef_tie<T>::move (
+ ::CORBA::Container_ptr new_container,
+ const char * new_name,
+ const char * new_version
+ ACE_ENV_ARG_DECL
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ))
+{
+ this->ptr_->move (
+ new_container,
+ new_name,
+ new_version
+ ACE_ENV_ARG_PARAMETER
+ );
+}
+
+// TAO_IDL - Generated from
+// be\be_visitor_operation/tie_si.cpp:101
+
+template <class T> ACE_INLINE
+::CORBA::TypeCode_ptr POA_CORBA::UnionDef_tie<T>::type (
+ ACE_ENV_SINGLE_ARG_DECL
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ))
+{
+ return this->ptr_->type (
+ ACE_ENV_SINGLE_ARG_PARAMETER
+ );
+}
+
+// TAO_IDL - Generated from
+// be\be_visitor_operation/tie_si.cpp:101
+
+template <class T> ACE_INLINE
+::CORBA::Contained_ptr POA_CORBA::UnionDef_tie<T>::lookup (
+ const char * search_name
+ ACE_ENV_ARG_DECL
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ))
+{
+ return this->ptr_->lookup (
+ search_name
+ ACE_ENV_ARG_PARAMETER
+ );
+}
+
+// TAO_IDL - Generated from
+// be\be_visitor_operation/tie_si.cpp:101
+
+template <class T> ACE_INLINE
+::CORBA::ContainedSeq * POA_CORBA::UnionDef_tie<T>::contents (
+ ::CORBA::DefinitionKind limit_type,
+ ::CORBA::Boolean exclude_inherited
+ ACE_ENV_ARG_DECL
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ))
+{
+ return this->ptr_->contents (
+ limit_type,
+ exclude_inherited
+ ACE_ENV_ARG_PARAMETER
+ );
+}
+
+// TAO_IDL - Generated from
+// be\be_visitor_operation/tie_si.cpp:101
+
+template <class T> ACE_INLINE
+::CORBA::ContainedSeq * POA_CORBA::UnionDef_tie<T>::lookup_name (
+ const char * search_name,
+ ::CORBA::Long levels_to_search,
+ ::CORBA::DefinitionKind limit_type,
+ ::CORBA::Boolean exclude_inherited
+ ACE_ENV_ARG_DECL
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ))
+{
+ return this->ptr_->lookup_name (
+ search_name,
+ levels_to_search,
+ limit_type,
+ exclude_inherited
+ ACE_ENV_ARG_PARAMETER
+ );
+}
+
+// TAO_IDL - Generated from
+// be\be_visitor_operation/tie_si.cpp:101
+
+template <class T> ACE_INLINE
+::CORBA::Container::DescriptionSeq * POA_CORBA::UnionDef_tie<T>::describe_contents (
+ ::CORBA::DefinitionKind limit_type,
+ ::CORBA::Boolean exclude_inherited,
+ ::CORBA::Long max_returned_objs
+ ACE_ENV_ARG_DECL
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ))
+{
+ return this->ptr_->describe_contents (
+ limit_type,
+ exclude_inherited,
+ max_returned_objs
+ ACE_ENV_ARG_PARAMETER
+ );
+}
+
+// TAO_IDL - Generated from
+// be\be_visitor_operation/tie_si.cpp:101
+
+template <class T> ACE_INLINE
+::CORBA::ModuleDef_ptr POA_CORBA::UnionDef_tie<T>::create_module (
+ const char * id,
+ const char * name,
+ const char * version
+ ACE_ENV_ARG_DECL
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ))
+{
+ return this->ptr_->create_module (
+ id,
+ name,
+ version
+ ACE_ENV_ARG_PARAMETER
+ );
+}
+
+// TAO_IDL - Generated from
+// be\be_visitor_operation/tie_si.cpp:101
+
+template <class T> ACE_INLINE
+::CORBA::ConstantDef_ptr POA_CORBA::UnionDef_tie<T>::create_constant (
+ const char * id,
+ const char * name,
+ const char * version,
+ ::CORBA::IDLType_ptr type,
+ const ::CORBA::Any & value
+ ACE_ENV_ARG_DECL
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ))
+{
+ return this->ptr_->create_constant (
+ id,
+ name,
+ version,
+ type,
+ value
+ ACE_ENV_ARG_PARAMETER
+ );
+}
+
+// TAO_IDL - Generated from
+// be\be_visitor_operation/tie_si.cpp:101
+
+template <class T> ACE_INLINE
+::CORBA::StructDef_ptr POA_CORBA::UnionDef_tie<T>::create_struct (
+ const char * id,
+ const char * name,
+ const char * version,
+ const ::CORBA::StructMemberSeq & members
+ ACE_ENV_ARG_DECL
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ))
+{
+ return this->ptr_->create_struct (
+ id,
+ name,
+ version,
+ members
+ ACE_ENV_ARG_PARAMETER
+ );
+}
+
+// TAO_IDL - Generated from
+// be\be_visitor_operation/tie_si.cpp:101
+
+template <class T> ACE_INLINE
+::CORBA::UnionDef_ptr POA_CORBA::UnionDef_tie<T>::create_union (
+ const char * id,
+ const char * name,
+ const char * version,
+ ::CORBA::IDLType_ptr discriminator_type,
+ const ::CORBA::UnionMemberSeq & members
+ ACE_ENV_ARG_DECL
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ))
+{
+ return this->ptr_->create_union (
+ id,
+ name,
+ version,
+ discriminator_type,
+ members
+ ACE_ENV_ARG_PARAMETER
+ );
+}
+
+// TAO_IDL - Generated from
+// be\be_visitor_operation/tie_si.cpp:101
+
+template <class T> ACE_INLINE
+::CORBA::EnumDef_ptr POA_CORBA::UnionDef_tie<T>::create_enum (
+ const char * id,
+ const char * name,
+ const char * version,
+ const ::CORBA::EnumMemberSeq & members
+ ACE_ENV_ARG_DECL
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ))
+{
+ return this->ptr_->create_enum (
+ id,
+ name,
+ version,
+ members
+ ACE_ENV_ARG_PARAMETER
+ );
+}
+
+// TAO_IDL - Generated from
+// be\be_visitor_operation/tie_si.cpp:101
+
+template <class T> ACE_INLINE
+::CORBA::AliasDef_ptr POA_CORBA::UnionDef_tie<T>::create_alias (
+ const char * id,
+ const char * name,
+ const char * version,
+ ::CORBA::IDLType_ptr original_type
+ ACE_ENV_ARG_DECL
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ))
+{
+ return this->ptr_->create_alias (
+ id,
+ name,
+ version,
+ original_type
+ ACE_ENV_ARG_PARAMETER
+ );
+}
+
+// TAO_IDL - Generated from
+// be\be_visitor_operation/tie_si.cpp:101
+
+template <class T> ACE_INLINE
+::CORBA::InterfaceDef_ptr POA_CORBA::UnionDef_tie<T>::create_interface (
+ const char * id,
+ const char * name,
+ const char * version,
+ const ::CORBA::InterfaceDefSeq & base_interfaces
+ ACE_ENV_ARG_DECL
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ))
+{
+ return this->ptr_->create_interface (
+ id,
+ name,
+ version,
+ base_interfaces
+ ACE_ENV_ARG_PARAMETER
+ );
+}
+
+// TAO_IDL - Generated from
+// be\be_visitor_operation/tie_si.cpp:101
+
+template <class T> ACE_INLINE
+::CORBA::ValueDef_ptr POA_CORBA::UnionDef_tie<T>::create_value (
+ const char * id,
+ const char * name,
+ const char * version,
+ ::CORBA::Boolean is_custom,
+ ::CORBA::Boolean is_abstract,
+ ::CORBA::ValueDef_ptr base_value,
+ ::CORBA::Boolean is_truncatable,
+ const ::CORBA::ValueDefSeq & abstract_base_values,
+ const ::CORBA::InterfaceDefSeq & supported_interfaces,
+ const ::CORBA::InitializerSeq & initializers
+ ACE_ENV_ARG_DECL
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ))
+{
+ return this->ptr_->create_value (
+ id,
+ name,
+ version,
+ is_custom,
+ is_abstract,
+ base_value,
+ is_truncatable,
+ abstract_base_values,
+ supported_interfaces,
+ initializers
+ ACE_ENV_ARG_PARAMETER
+ );
+}
+
+// TAO_IDL - Generated from
+// be\be_visitor_operation/tie_si.cpp:101
+
+template <class T> ACE_INLINE
+::CORBA::ValueBoxDef_ptr POA_CORBA::UnionDef_tie<T>::create_value_box (
+ const char * id,
+ const char * name,
+ const char * version,
+ ::CORBA::IDLType_ptr original_type_def
+ ACE_ENV_ARG_DECL
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ))
+{
+ return this->ptr_->create_value_box (
+ id,
+ name,
+ version,
+ original_type_def
+ ACE_ENV_ARG_PARAMETER
+ );
+}
+
+// TAO_IDL - Generated from
+// be\be_visitor_operation/tie_si.cpp:101
+
+template <class T> ACE_INLINE
+::CORBA::ExceptionDef_ptr POA_CORBA::UnionDef_tie<T>::create_exception (
+ const char * id,
+ const char * name,
+ const char * version,
+ const ::CORBA::StructMemberSeq & members
+ ACE_ENV_ARG_DECL
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ))
+{
+ return this->ptr_->create_exception (
+ id,
+ name,
+ version,
+ members
+ ACE_ENV_ARG_PARAMETER
+ );
+}
+
+// TAO_IDL - Generated from
+// be\be_visitor_operation/tie_si.cpp:101
+
+template <class T> ACE_INLINE
+::CORBA::NativeDef_ptr POA_CORBA::UnionDef_tie<T>::create_native (
+ const char * id,
+ const char * name,
+ const char * version
+ ACE_ENV_ARG_DECL
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ))
+{
+ return this->ptr_->create_native (
+ id,
+ name,
+ version
+ ACE_ENV_ARG_PARAMETER
+ );
+}
+
+// TAO_IDL - Generated from
+// be\be_visitor_operation/tie_si.cpp:101
+
+template <class T> ACE_INLINE
+::CORBA::AbstractInterfaceDef_ptr POA_CORBA::UnionDef_tie<T>::create_abstract_interface (
+ const char * id,
+ const char * name,
+ const char * version,
+ const ::CORBA::AbstractInterfaceDefSeq & base_interfaces
+ ACE_ENV_ARG_DECL
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ))
+{
+ return this->ptr_->create_abstract_interface (
+ id,
+ name,
+ version,
+ base_interfaces
+ ACE_ENV_ARG_PARAMETER
+ );
+}
+
+// TAO_IDL - Generated from
+// be\be_visitor_operation/tie_si.cpp:101
+
+template <class T> ACE_INLINE
+::CORBA::LocalInterfaceDef_ptr POA_CORBA::UnionDef_tie<T>::create_local_interface (
+ const char * id,
+ const char * name,
+ const char * version,
+ const ::CORBA::InterfaceDefSeq & base_interfaces
+ ACE_ENV_ARG_DECL
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ))
+{
+ return this->ptr_->create_local_interface (
+ id,
+ name,
+ version,
+ base_interfaces
+ ACE_ENV_ARG_PARAMETER
+ );
+}
+
+// TAO_IDL - Generated from
+// be\be_visitor_operation/tie_si.cpp:101
+
+template <class T> ACE_INLINE
+::CORBA::ExtValueDef_ptr POA_CORBA::UnionDef_tie<T>::create_ext_value (
+ const char * id,
+ const char * name,
+ const char * version,
+ ::CORBA::Boolean is_custom,
+ ::CORBA::Boolean is_abstract,
+ ::CORBA::ValueDef_ptr base_value,
+ ::CORBA::Boolean is_truncatable,
+ const ::CORBA::ValueDefSeq & abstract_base_values,
+ const ::CORBA::InterfaceDefSeq & supported_interfaces,
+ const ::CORBA::ExtInitializerSeq & initializers
+ ACE_ENV_ARG_DECL
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ))
+{
+ return this->ptr_->create_ext_value (
+ id,
+ name,
+ version,
+ is_custom,
+ is_abstract,
+ base_value,
+ is_truncatable,
+ abstract_base_values,
+ supported_interfaces,
+ initializers
+ ACE_ENV_ARG_PARAMETER
+ );
+}
+
+// TAO_IDL - Generated from
+// be\be_visitor_operation/tie_si.cpp:101
+
+template <class T> ACE_INLINE
+::CORBA::TypeCode_ptr POA_CORBA::UnionDef_tie<T>::discriminator_type (
+ ACE_ENV_SINGLE_ARG_DECL
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ))
+{
+ return this->ptr_->discriminator_type (
+ ACE_ENV_SINGLE_ARG_PARAMETER
+ );
+}
+
+// TAO_IDL - Generated from
+// be\be_visitor_operation/tie_si.cpp:101
+
+template <class T> ACE_INLINE
+::CORBA::IDLType_ptr POA_CORBA::UnionDef_tie<T>::discriminator_type_def (
+ ACE_ENV_SINGLE_ARG_DECL
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ))
+{
+ return this->ptr_->discriminator_type_def (
+ ACE_ENV_SINGLE_ARG_PARAMETER
+ );
+}
+
+// TAO_IDL - Generated from
+// be\be_visitor_operation/tie_si.cpp:101
+
+template <class T> ACE_INLINE
+void POA_CORBA::UnionDef_tie<T>::discriminator_type_def (
+ ::CORBA::IDLType_ptr discriminator_type_def
+ ACE_ENV_ARG_DECL
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ))
+{
+ this->ptr_->discriminator_type_def (
+ discriminator_type_def
+ ACE_ENV_ARG_PARAMETER
+ );
+}
+
+// TAO_IDL - Generated from
+// be\be_visitor_operation/tie_si.cpp:101
+
+template <class T> ACE_INLINE
+::CORBA::UnionMemberSeq * POA_CORBA::UnionDef_tie<T>::members (
+ ACE_ENV_SINGLE_ARG_DECL
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ))
+{
+ return this->ptr_->members (
+ ACE_ENV_SINGLE_ARG_PARAMETER
+ );
+}
+
+// TAO_IDL - Generated from
+// be\be_visitor_operation/tie_si.cpp:101
+
+template <class T> ACE_INLINE
+void POA_CORBA::UnionDef_tie<T>::members (
+ const ::CORBA::UnionMemberSeq & members
+ ACE_ENV_ARG_DECL
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ))
+{
+ this->ptr_->members (
+ members
+ ACE_ENV_ARG_PARAMETER
+ );
+}
+
+// TAO_IDL - Generated from
+// be\be_visitor_interface/tie_si.cpp:96
+
+template <class T> ACE_INLINE
+POA_CORBA::EnumDef_tie<T>::EnumDef_tie (T &t)
+ : ptr_ (&t),
+ poa_ (PortableServer::POA::_nil ()),
+ rel_ (0)
+{}
+
+template <class T> ACE_INLINE
+POA_CORBA::EnumDef_tie<T>::EnumDef_tie (T &t, PortableServer::POA_ptr poa)
+ : ptr_ (&t),
+ poa_ (PortableServer::POA::_duplicate (poa)),
+ rel_ (0)
+{}
+
+template <class T> ACE_INLINE
+POA_CORBA::EnumDef_tie<T>::EnumDef_tie (T *tp, ::CORBA::Boolean release)
+ : ptr_ (tp),
+ poa_ (PortableServer::POA::_nil ()),
+ rel_ (release)
+{}
+
+template <class T> ACE_INLINE
+POA_CORBA::EnumDef_tie<T>::EnumDef_tie (T *tp, PortableServer::POA_ptr poa, ::CORBA::Boolean release)
+ : ptr_ (tp),
+ poa_ (PortableServer::POA::_duplicate (poa)),
+ rel_ (release)
+{}
+
+template <class T> ACE_INLINE
+POA_CORBA::EnumDef_tie<T>::~EnumDef_tie (void)
+{
+ if (this->rel_)
+ {
+ delete this->ptr_;
+ }
+}
+
+template <class T> ACE_INLINE T *
+POA_CORBA::EnumDef_tie<T>::_tied_object (void)
+{
+ return this->ptr_;
+}
+
+template <class T> ACE_INLINE void
+POA_CORBA::EnumDef_tie<T>::_tied_object (T &obj)
+{
+ if (this->rel_)
+ {
+ delete this->ptr_;
+ }
+
+ this->ptr_ = &obj;
+ this->rel_ = 0;
+}
+
+template <class T> ACE_INLINE void
+POA_CORBA::EnumDef_tie<T>::_tied_object (T *obj, ::CORBA::Boolean release)
+{
+ if (this->rel_)
+ {
+ delete this->ptr_;
+ }
+
+ this->ptr_ = obj;
+ this->rel_ = release;
+}
+
+template <class T> ACE_INLINE ::CORBA::Boolean
+POA_CORBA::EnumDef_tie<T>::_is_owner (void)
+{
+ return this->rel_;
+}
+
+template <class T> ACE_INLINE void
+POA_CORBA::EnumDef_tie<T>::_is_owner ( ::CORBA::Boolean b)
+{
+ this->rel_ = b;
+}
+
+template <class T> ACE_INLINE PortableServer::POA_ptr
+POA_CORBA::EnumDef_tie<T>::_default_POA (ACE_ENV_SINGLE_ARG_DECL)
+{
+ if (! ::CORBA::is_nil (this->poa_.in ()))
+ {
+ return PortableServer::POA::_duplicate (this->poa_.in ());
+ }
+
+ return this->EnumDef::_default_POA (ACE_ENV_SINGLE_ARG_PARAMETER);
+}
+
+// TAO_IDL - Generated from
+// be\be_visitor_operation/tie_si.cpp:101
+
+template <class T> ACE_INLINE
+::CORBA::DefinitionKind POA_CORBA::EnumDef_tie<T>::def_kind (
+ ACE_ENV_SINGLE_ARG_DECL
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ))
+{
+ return this->ptr_->def_kind (
+ ACE_ENV_SINGLE_ARG_PARAMETER
+ );
+}
+
+// TAO_IDL - Generated from
+// be\be_visitor_operation/tie_si.cpp:101
+
+template <class T> ACE_INLINE
+void POA_CORBA::EnumDef_tie<T>::destroy (
+ ACE_ENV_SINGLE_ARG_DECL
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ))
+{
+ this->ptr_->destroy (
+ ACE_ENV_SINGLE_ARG_PARAMETER
+ );
+}
+
+// TAO_IDL - Generated from
+// be\be_visitor_operation/tie_si.cpp:101
+
+template <class T> ACE_INLINE
+char * POA_CORBA::EnumDef_tie<T>::id (
+ ACE_ENV_SINGLE_ARG_DECL
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ))
+{
+ return this->ptr_->id (
+ ACE_ENV_SINGLE_ARG_PARAMETER
+ );
+}
+
+// TAO_IDL - Generated from
+// be\be_visitor_operation/tie_si.cpp:101
+
+template <class T> ACE_INLINE
+void POA_CORBA::EnumDef_tie<T>::id (
+ const char * id
+ ACE_ENV_ARG_DECL
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ))
+{
+ this->ptr_->id (
+ id
+ ACE_ENV_ARG_PARAMETER
+ );
+}
+
+// TAO_IDL - Generated from
+// be\be_visitor_operation/tie_si.cpp:101
+
+template <class T> ACE_INLINE
+char * POA_CORBA::EnumDef_tie<T>::name (
+ ACE_ENV_SINGLE_ARG_DECL
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ))
+{
+ return this->ptr_->name (
+ ACE_ENV_SINGLE_ARG_PARAMETER
+ );
+}
+
+// TAO_IDL - Generated from
+// be\be_visitor_operation/tie_si.cpp:101
+
+template <class T> ACE_INLINE
+void POA_CORBA::EnumDef_tie<T>::name (
+ const char * name
+ ACE_ENV_ARG_DECL
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ))
+{
+ this->ptr_->name (
+ name
+ ACE_ENV_ARG_PARAMETER
+ );
+}
+
+// TAO_IDL - Generated from
+// be\be_visitor_operation/tie_si.cpp:101
+
+template <class T> ACE_INLINE
+char * POA_CORBA::EnumDef_tie<T>::version (
+ ACE_ENV_SINGLE_ARG_DECL
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ))
+{
+ return this->ptr_->version (
+ ACE_ENV_SINGLE_ARG_PARAMETER
+ );
+}
+
+// TAO_IDL - Generated from
+// be\be_visitor_operation/tie_si.cpp:101
+
+template <class T> ACE_INLINE
+void POA_CORBA::EnumDef_tie<T>::version (
+ const char * version
+ ACE_ENV_ARG_DECL
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ))
+{
+ this->ptr_->version (
+ version
+ ACE_ENV_ARG_PARAMETER
+ );
+}
+
+// TAO_IDL - Generated from
+// be\be_visitor_operation/tie_si.cpp:101
+
+template <class T> ACE_INLINE
+::CORBA::Container_ptr POA_CORBA::EnumDef_tie<T>::defined_in (
+ ACE_ENV_SINGLE_ARG_DECL
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ))
+{
+ return this->ptr_->defined_in (
+ ACE_ENV_SINGLE_ARG_PARAMETER
+ );
+}
+
+// TAO_IDL - Generated from
+// be\be_visitor_operation/tie_si.cpp:101
+
+template <class T> ACE_INLINE
+char * POA_CORBA::EnumDef_tie<T>::absolute_name (
+ ACE_ENV_SINGLE_ARG_DECL
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ))
+{
+ return this->ptr_->absolute_name (
+ ACE_ENV_SINGLE_ARG_PARAMETER
+ );
+}
+
+// TAO_IDL - Generated from
+// be\be_visitor_operation/tie_si.cpp:101
+
+template <class T> ACE_INLINE
+::CORBA::Repository_ptr POA_CORBA::EnumDef_tie<T>::containing_repository (
+ ACE_ENV_SINGLE_ARG_DECL
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ))
+{
+ return this->ptr_->containing_repository (
+ ACE_ENV_SINGLE_ARG_PARAMETER
+ );
+}
+
+// TAO_IDL - Generated from
+// be\be_visitor_operation/tie_si.cpp:101
+
+template <class T> ACE_INLINE
+::CORBA::Contained::Description * POA_CORBA::EnumDef_tie<T>::describe (
+ ACE_ENV_SINGLE_ARG_DECL
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ))
+{
+ return this->ptr_->describe (
+ ACE_ENV_SINGLE_ARG_PARAMETER
+ );
+}
+
+// TAO_IDL - Generated from
+// be\be_visitor_operation/tie_si.cpp:101
+
+template <class T> ACE_INLINE
+void POA_CORBA::EnumDef_tie<T>::move (
+ ::CORBA::Container_ptr new_container,
+ const char * new_name,
+ const char * new_version
+ ACE_ENV_ARG_DECL
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ))
+{
+ this->ptr_->move (
+ new_container,
+ new_name,
+ new_version
+ ACE_ENV_ARG_PARAMETER
+ );
+}
+
+// TAO_IDL - Generated from
+// be\be_visitor_operation/tie_si.cpp:101
+
+template <class T> ACE_INLINE
+::CORBA::TypeCode_ptr POA_CORBA::EnumDef_tie<T>::type (
+ ACE_ENV_SINGLE_ARG_DECL
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ))
+{
+ return this->ptr_->type (
+ ACE_ENV_SINGLE_ARG_PARAMETER
+ );
+}
+
+// TAO_IDL - Generated from
+// be\be_visitor_operation/tie_si.cpp:101
+
+template <class T> ACE_INLINE
+::CORBA::EnumMemberSeq * POA_CORBA::EnumDef_tie<T>::members (
+ ACE_ENV_SINGLE_ARG_DECL
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ))
+{
+ return this->ptr_->members (
+ ACE_ENV_SINGLE_ARG_PARAMETER
+ );
+}
+
+// TAO_IDL - Generated from
+// be\be_visitor_operation/tie_si.cpp:101
+
+template <class T> ACE_INLINE
+void POA_CORBA::EnumDef_tie<T>::members (
+ const ::CORBA::EnumMemberSeq & members
+ ACE_ENV_ARG_DECL
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ))
+{
+ this->ptr_->members (
+ members
+ ACE_ENV_ARG_PARAMETER
+ );
+}
+
+// TAO_IDL - Generated from
+// be\be_visitor_interface/tie_si.cpp:96
+
+template <class T> ACE_INLINE
+POA_CORBA::AliasDef_tie<T>::AliasDef_tie (T &t)
+ : ptr_ (&t),
+ poa_ (PortableServer::POA::_nil ()),
+ rel_ (0)
+{}
+
+template <class T> ACE_INLINE
+POA_CORBA::AliasDef_tie<T>::AliasDef_tie (T &t, PortableServer::POA_ptr poa)
+ : ptr_ (&t),
+ poa_ (PortableServer::POA::_duplicate (poa)),
+ rel_ (0)
+{}
+
+template <class T> ACE_INLINE
+POA_CORBA::AliasDef_tie<T>::AliasDef_tie (T *tp, ::CORBA::Boolean release)
+ : ptr_ (tp),
+ poa_ (PortableServer::POA::_nil ()),
+ rel_ (release)
+{}
+
+template <class T> ACE_INLINE
+POA_CORBA::AliasDef_tie<T>::AliasDef_tie (T *tp, PortableServer::POA_ptr poa, ::CORBA::Boolean release)
+ : ptr_ (tp),
+ poa_ (PortableServer::POA::_duplicate (poa)),
+ rel_ (release)
+{}
+
+template <class T> ACE_INLINE
+POA_CORBA::AliasDef_tie<T>::~AliasDef_tie (void)
+{
+ if (this->rel_)
+ {
+ delete this->ptr_;
+ }
+}
+
+template <class T> ACE_INLINE T *
+POA_CORBA::AliasDef_tie<T>::_tied_object (void)
+{
+ return this->ptr_;
+}
+
+template <class T> ACE_INLINE void
+POA_CORBA::AliasDef_tie<T>::_tied_object (T &obj)
+{
+ if (this->rel_)
+ {
+ delete this->ptr_;
+ }
+
+ this->ptr_ = &obj;
+ this->rel_ = 0;
+}
+
+template <class T> ACE_INLINE void
+POA_CORBA::AliasDef_tie<T>::_tied_object (T *obj, ::CORBA::Boolean release)
+{
+ if (this->rel_)
+ {
+ delete this->ptr_;
+ }
+
+ this->ptr_ = obj;
+ this->rel_ = release;
+}
+
+template <class T> ACE_INLINE ::CORBA::Boolean
+POA_CORBA::AliasDef_tie<T>::_is_owner (void)
+{
+ return this->rel_;
+}
+
+template <class T> ACE_INLINE void
+POA_CORBA::AliasDef_tie<T>::_is_owner ( ::CORBA::Boolean b)
+{
+ this->rel_ = b;
+}
+
+template <class T> ACE_INLINE PortableServer::POA_ptr
+POA_CORBA::AliasDef_tie<T>::_default_POA (ACE_ENV_SINGLE_ARG_DECL)
+{
+ if (! ::CORBA::is_nil (this->poa_.in ()))
+ {
+ return PortableServer::POA::_duplicate (this->poa_.in ());
+ }
+
+ return this->AliasDef::_default_POA (ACE_ENV_SINGLE_ARG_PARAMETER);
+}
+
+// TAO_IDL - Generated from
+// be\be_visitor_operation/tie_si.cpp:101
+
+template <class T> ACE_INLINE
+::CORBA::DefinitionKind POA_CORBA::AliasDef_tie<T>::def_kind (
+ ACE_ENV_SINGLE_ARG_DECL
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ))
+{
+ return this->ptr_->def_kind (
+ ACE_ENV_SINGLE_ARG_PARAMETER
+ );
+}
+
+// TAO_IDL - Generated from
+// be\be_visitor_operation/tie_si.cpp:101
+
+template <class T> ACE_INLINE
+void POA_CORBA::AliasDef_tie<T>::destroy (
+ ACE_ENV_SINGLE_ARG_DECL
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ))
+{
+ this->ptr_->destroy (
+ ACE_ENV_SINGLE_ARG_PARAMETER
+ );
+}
+
+// TAO_IDL - Generated from
+// be\be_visitor_operation/tie_si.cpp:101
+
+template <class T> ACE_INLINE
+char * POA_CORBA::AliasDef_tie<T>::id (
+ ACE_ENV_SINGLE_ARG_DECL
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ))
+{
+ return this->ptr_->id (
+ ACE_ENV_SINGLE_ARG_PARAMETER
+ );
+}
+
+// TAO_IDL - Generated from
+// be\be_visitor_operation/tie_si.cpp:101
+
+template <class T> ACE_INLINE
+void POA_CORBA::AliasDef_tie<T>::id (
+ const char * id
+ ACE_ENV_ARG_DECL
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ))
+{
+ this->ptr_->id (
+ id
+ ACE_ENV_ARG_PARAMETER
+ );
+}
+
+// TAO_IDL - Generated from
+// be\be_visitor_operation/tie_si.cpp:101
+
+template <class T> ACE_INLINE
+char * POA_CORBA::AliasDef_tie<T>::name (
+ ACE_ENV_SINGLE_ARG_DECL
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ))
+{
+ return this->ptr_->name (
+ ACE_ENV_SINGLE_ARG_PARAMETER
+ );
+}
+
+// TAO_IDL - Generated from
+// be\be_visitor_operation/tie_si.cpp:101
+
+template <class T> ACE_INLINE
+void POA_CORBA::AliasDef_tie<T>::name (
+ const char * name
+ ACE_ENV_ARG_DECL
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ))
+{
+ this->ptr_->name (
+ name
+ ACE_ENV_ARG_PARAMETER
+ );
+}
+
+// TAO_IDL - Generated from
+// be\be_visitor_operation/tie_si.cpp:101
+
+template <class T> ACE_INLINE
+char * POA_CORBA::AliasDef_tie<T>::version (
+ ACE_ENV_SINGLE_ARG_DECL
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ))
+{
+ return this->ptr_->version (
+ ACE_ENV_SINGLE_ARG_PARAMETER
+ );
+}
+
+// TAO_IDL - Generated from
+// be\be_visitor_operation/tie_si.cpp:101
+
+template <class T> ACE_INLINE
+void POA_CORBA::AliasDef_tie<T>::version (
+ const char * version
+ ACE_ENV_ARG_DECL
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ))
+{
+ this->ptr_->version (
+ version
+ ACE_ENV_ARG_PARAMETER
+ );
+}
+
+// TAO_IDL - Generated from
+// be\be_visitor_operation/tie_si.cpp:101
+
+template <class T> ACE_INLINE
+::CORBA::Container_ptr POA_CORBA::AliasDef_tie<T>::defined_in (
+ ACE_ENV_SINGLE_ARG_DECL
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ))
+{
+ return this->ptr_->defined_in (
+ ACE_ENV_SINGLE_ARG_PARAMETER
+ );
+}
+
+// TAO_IDL - Generated from
+// be\be_visitor_operation/tie_si.cpp:101
+
+template <class T> ACE_INLINE
+char * POA_CORBA::AliasDef_tie<T>::absolute_name (
+ ACE_ENV_SINGLE_ARG_DECL
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ))
+{
+ return this->ptr_->absolute_name (
+ ACE_ENV_SINGLE_ARG_PARAMETER
+ );
+}
+
+// TAO_IDL - Generated from
+// be\be_visitor_operation/tie_si.cpp:101
+
+template <class T> ACE_INLINE
+::CORBA::Repository_ptr POA_CORBA::AliasDef_tie<T>::containing_repository (
+ ACE_ENV_SINGLE_ARG_DECL
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ))
+{
+ return this->ptr_->containing_repository (
+ ACE_ENV_SINGLE_ARG_PARAMETER
+ );
+}
+
+// TAO_IDL - Generated from
+// be\be_visitor_operation/tie_si.cpp:101
+
+template <class T> ACE_INLINE
+::CORBA::Contained::Description * POA_CORBA::AliasDef_tie<T>::describe (
+ ACE_ENV_SINGLE_ARG_DECL
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ))
+{
+ return this->ptr_->describe (
+ ACE_ENV_SINGLE_ARG_PARAMETER
+ );
+}
+
+// TAO_IDL - Generated from
+// be\be_visitor_operation/tie_si.cpp:101
+
+template <class T> ACE_INLINE
+void POA_CORBA::AliasDef_tie<T>::move (
+ ::CORBA::Container_ptr new_container,
+ const char * new_name,
+ const char * new_version
+ ACE_ENV_ARG_DECL
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ))
+{
+ this->ptr_->move (
+ new_container,
+ new_name,
+ new_version
+ ACE_ENV_ARG_PARAMETER
+ );
+}
+
+// TAO_IDL - Generated from
+// be\be_visitor_operation/tie_si.cpp:101
+
+template <class T> ACE_INLINE
+::CORBA::TypeCode_ptr POA_CORBA::AliasDef_tie<T>::type (
+ ACE_ENV_SINGLE_ARG_DECL
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ))
+{
+ return this->ptr_->type (
+ ACE_ENV_SINGLE_ARG_PARAMETER
+ );
+}
+
+// TAO_IDL - Generated from
+// be\be_visitor_operation/tie_si.cpp:101
+
+template <class T> ACE_INLINE
+::CORBA::IDLType_ptr POA_CORBA::AliasDef_tie<T>::original_type_def (
+ ACE_ENV_SINGLE_ARG_DECL
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ))
+{
+ return this->ptr_->original_type_def (
+ ACE_ENV_SINGLE_ARG_PARAMETER
+ );
+}
+
+// TAO_IDL - Generated from
+// be\be_visitor_operation/tie_si.cpp:101
+
+template <class T> ACE_INLINE
+void POA_CORBA::AliasDef_tie<T>::original_type_def (
+ ::CORBA::IDLType_ptr original_type_def
+ ACE_ENV_ARG_DECL
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ))
+{
+ this->ptr_->original_type_def (
+ original_type_def
+ ACE_ENV_ARG_PARAMETER
+ );
+}
+
+// TAO_IDL - Generated from
+// be\be_visitor_interface/tie_si.cpp:96
+
+template <class T> ACE_INLINE
+POA_CORBA::NativeDef_tie<T>::NativeDef_tie (T &t)
+ : ptr_ (&t),
+ poa_ (PortableServer::POA::_nil ()),
+ rel_ (0)
+{}
+
+template <class T> ACE_INLINE
+POA_CORBA::NativeDef_tie<T>::NativeDef_tie (T &t, PortableServer::POA_ptr poa)
+ : ptr_ (&t),
+ poa_ (PortableServer::POA::_duplicate (poa)),
+ rel_ (0)
+{}
+
+template <class T> ACE_INLINE
+POA_CORBA::NativeDef_tie<T>::NativeDef_tie (T *tp, ::CORBA::Boolean release)
+ : ptr_ (tp),
+ poa_ (PortableServer::POA::_nil ()),
+ rel_ (release)
+{}
+
+template <class T> ACE_INLINE
+POA_CORBA::NativeDef_tie<T>::NativeDef_tie (T *tp, PortableServer::POA_ptr poa, ::CORBA::Boolean release)
+ : ptr_ (tp),
+ poa_ (PortableServer::POA::_duplicate (poa)),
+ rel_ (release)
+{}
+
+template <class T> ACE_INLINE
+POA_CORBA::NativeDef_tie<T>::~NativeDef_tie (void)
+{
+ if (this->rel_)
+ {
+ delete this->ptr_;
+ }
+}
+
+template <class T> ACE_INLINE T *
+POA_CORBA::NativeDef_tie<T>::_tied_object (void)
+{
+ return this->ptr_;
+}
+
+template <class T> ACE_INLINE void
+POA_CORBA::NativeDef_tie<T>::_tied_object (T &obj)
+{
+ if (this->rel_)
+ {
+ delete this->ptr_;
+ }
+
+ this->ptr_ = &obj;
+ this->rel_ = 0;
+}
+
+template <class T> ACE_INLINE void
+POA_CORBA::NativeDef_tie<T>::_tied_object (T *obj, ::CORBA::Boolean release)
+{
+ if (this->rel_)
+ {
+ delete this->ptr_;
+ }
+
+ this->ptr_ = obj;
+ this->rel_ = release;
+}
+
+template <class T> ACE_INLINE ::CORBA::Boolean
+POA_CORBA::NativeDef_tie<T>::_is_owner (void)
+{
+ return this->rel_;
+}
+
+template <class T> ACE_INLINE void
+POA_CORBA::NativeDef_tie<T>::_is_owner ( ::CORBA::Boolean b)
+{
+ this->rel_ = b;
+}
+
+template <class T> ACE_INLINE PortableServer::POA_ptr
+POA_CORBA::NativeDef_tie<T>::_default_POA (ACE_ENV_SINGLE_ARG_DECL)
+{
+ if (! ::CORBA::is_nil (this->poa_.in ()))
+ {
+ return PortableServer::POA::_duplicate (this->poa_.in ());
+ }
+
+ return this->NativeDef::_default_POA (ACE_ENV_SINGLE_ARG_PARAMETER);
+}
+
+// TAO_IDL - Generated from
+// be\be_visitor_operation/tie_si.cpp:101
+
+template <class T> ACE_INLINE
+::CORBA::DefinitionKind POA_CORBA::NativeDef_tie<T>::def_kind (
+ ACE_ENV_SINGLE_ARG_DECL
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ))
+{
+ return this->ptr_->def_kind (
+ ACE_ENV_SINGLE_ARG_PARAMETER
+ );
+}
+
+// TAO_IDL - Generated from
+// be\be_visitor_operation/tie_si.cpp:101
+
+template <class T> ACE_INLINE
+void POA_CORBA::NativeDef_tie<T>::destroy (
+ ACE_ENV_SINGLE_ARG_DECL
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ))
+{
+ this->ptr_->destroy (
+ ACE_ENV_SINGLE_ARG_PARAMETER
+ );
+}
+
+// TAO_IDL - Generated from
+// be\be_visitor_operation/tie_si.cpp:101
+
+template <class T> ACE_INLINE
+char * POA_CORBA::NativeDef_tie<T>::id (
+ ACE_ENV_SINGLE_ARG_DECL
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ))
+{
+ return this->ptr_->id (
+ ACE_ENV_SINGLE_ARG_PARAMETER
+ );
+}
+
+// TAO_IDL - Generated from
+// be\be_visitor_operation/tie_si.cpp:101
+
+template <class T> ACE_INLINE
+void POA_CORBA::NativeDef_tie<T>::id (
+ const char * id
+ ACE_ENV_ARG_DECL
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ))
+{
+ this->ptr_->id (
+ id
+ ACE_ENV_ARG_PARAMETER
+ );
+}
+
+// TAO_IDL - Generated from
+// be\be_visitor_operation/tie_si.cpp:101
+
+template <class T> ACE_INLINE
+char * POA_CORBA::NativeDef_tie<T>::name (
+ ACE_ENV_SINGLE_ARG_DECL
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ))
+{
+ return this->ptr_->name (
+ ACE_ENV_SINGLE_ARG_PARAMETER
+ );
+}
+
+// TAO_IDL - Generated from
+// be\be_visitor_operation/tie_si.cpp:101
+
+template <class T> ACE_INLINE
+void POA_CORBA::NativeDef_tie<T>::name (
+ const char * name
+ ACE_ENV_ARG_DECL
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ))
+{
+ this->ptr_->name (
+ name
+ ACE_ENV_ARG_PARAMETER
+ );
+}
+
+// TAO_IDL - Generated from
+// be\be_visitor_operation/tie_si.cpp:101
+
+template <class T> ACE_INLINE
+char * POA_CORBA::NativeDef_tie<T>::version (
+ ACE_ENV_SINGLE_ARG_DECL
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ))
+{
+ return this->ptr_->version (
+ ACE_ENV_SINGLE_ARG_PARAMETER
+ );
+}
+
+// TAO_IDL - Generated from
+// be\be_visitor_operation/tie_si.cpp:101
+
+template <class T> ACE_INLINE
+void POA_CORBA::NativeDef_tie<T>::version (
+ const char * version
+ ACE_ENV_ARG_DECL
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ))
+{
+ this->ptr_->version (
+ version
+ ACE_ENV_ARG_PARAMETER
+ );
+}
+
+// TAO_IDL - Generated from
+// be\be_visitor_operation/tie_si.cpp:101
+
+template <class T> ACE_INLINE
+::CORBA::Container_ptr POA_CORBA::NativeDef_tie<T>::defined_in (
+ ACE_ENV_SINGLE_ARG_DECL
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ))
+{
+ return this->ptr_->defined_in (
+ ACE_ENV_SINGLE_ARG_PARAMETER
+ );
+}
+
+// TAO_IDL - Generated from
+// be\be_visitor_operation/tie_si.cpp:101
+
+template <class T> ACE_INLINE
+char * POA_CORBA::NativeDef_tie<T>::absolute_name (
+ ACE_ENV_SINGLE_ARG_DECL
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ))
+{
+ return this->ptr_->absolute_name (
+ ACE_ENV_SINGLE_ARG_PARAMETER
+ );
+}
+
+// TAO_IDL - Generated from
+// be\be_visitor_operation/tie_si.cpp:101
+
+template <class T> ACE_INLINE
+::CORBA::Repository_ptr POA_CORBA::NativeDef_tie<T>::containing_repository (
+ ACE_ENV_SINGLE_ARG_DECL
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ))
+{
+ return this->ptr_->containing_repository (
+ ACE_ENV_SINGLE_ARG_PARAMETER
+ );
+}
+
+// TAO_IDL - Generated from
+// be\be_visitor_operation/tie_si.cpp:101
+
+template <class T> ACE_INLINE
+::CORBA::Contained::Description * POA_CORBA::NativeDef_tie<T>::describe (
+ ACE_ENV_SINGLE_ARG_DECL
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ))
+{
+ return this->ptr_->describe (
+ ACE_ENV_SINGLE_ARG_PARAMETER
+ );
+}
+
+// TAO_IDL - Generated from
+// be\be_visitor_operation/tie_si.cpp:101
+
+template <class T> ACE_INLINE
+void POA_CORBA::NativeDef_tie<T>::move (
+ ::CORBA::Container_ptr new_container,
+ const char * new_name,
+ const char * new_version
+ ACE_ENV_ARG_DECL
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ))
+{
+ this->ptr_->move (
+ new_container,
+ new_name,
+ new_version
+ ACE_ENV_ARG_PARAMETER
+ );
+}
+
+// TAO_IDL - Generated from
+// be\be_visitor_operation/tie_si.cpp:101
+
+template <class T> ACE_INLINE
+::CORBA::TypeCode_ptr POA_CORBA::NativeDef_tie<T>::type (
+ ACE_ENV_SINGLE_ARG_DECL
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ))
+{
+ return this->ptr_->type (
+ ACE_ENV_SINGLE_ARG_PARAMETER
+ );
+}
+
+// TAO_IDL - Generated from
+// be\be_visitor_interface/tie_si.cpp:96
+
+template <class T> ACE_INLINE
+POA_CORBA::PrimitiveDef_tie<T>::PrimitiveDef_tie (T &t)
+ : ptr_ (&t),
+ poa_ (PortableServer::POA::_nil ()),
+ rel_ (0)
+{}
+
+template <class T> ACE_INLINE
+POA_CORBA::PrimitiveDef_tie<T>::PrimitiveDef_tie (T &t, PortableServer::POA_ptr poa)
+ : ptr_ (&t),
+ poa_ (PortableServer::POA::_duplicate (poa)),
+ rel_ (0)
+{}
+
+template <class T> ACE_INLINE
+POA_CORBA::PrimitiveDef_tie<T>::PrimitiveDef_tie (T *tp, ::CORBA::Boolean release)
+ : ptr_ (tp),
+ poa_ (PortableServer::POA::_nil ()),
+ rel_ (release)
+{}
+
+template <class T> ACE_INLINE
+POA_CORBA::PrimitiveDef_tie<T>::PrimitiveDef_tie (T *tp, PortableServer::POA_ptr poa, ::CORBA::Boolean release)
+ : ptr_ (tp),
+ poa_ (PortableServer::POA::_duplicate (poa)),
+ rel_ (release)
+{}
+
+template <class T> ACE_INLINE
+POA_CORBA::PrimitiveDef_tie<T>::~PrimitiveDef_tie (void)
+{
+ if (this->rel_)
+ {
+ delete this->ptr_;
+ }
+}
+
+template <class T> ACE_INLINE T *
+POA_CORBA::PrimitiveDef_tie<T>::_tied_object (void)
+{
+ return this->ptr_;
+}
+
+template <class T> ACE_INLINE void
+POA_CORBA::PrimitiveDef_tie<T>::_tied_object (T &obj)
+{
+ if (this->rel_)
+ {
+ delete this->ptr_;
+ }
+
+ this->ptr_ = &obj;
+ this->rel_ = 0;
+}
+
+template <class T> ACE_INLINE void
+POA_CORBA::PrimitiveDef_tie<T>::_tied_object (T *obj, ::CORBA::Boolean release)
+{
+ if (this->rel_)
+ {
+ delete this->ptr_;
+ }
+
+ this->ptr_ = obj;
+ this->rel_ = release;
+}
+
+template <class T> ACE_INLINE ::CORBA::Boolean
+POA_CORBA::PrimitiveDef_tie<T>::_is_owner (void)
+{
+ return this->rel_;
+}
+
+template <class T> ACE_INLINE void
+POA_CORBA::PrimitiveDef_tie<T>::_is_owner ( ::CORBA::Boolean b)
+{
+ this->rel_ = b;
+}
+
+template <class T> ACE_INLINE PortableServer::POA_ptr
+POA_CORBA::PrimitiveDef_tie<T>::_default_POA (ACE_ENV_SINGLE_ARG_DECL)
+{
+ if (! ::CORBA::is_nil (this->poa_.in ()))
+ {
+ return PortableServer::POA::_duplicate (this->poa_.in ());
+ }
+
+ return this->PrimitiveDef::_default_POA (ACE_ENV_SINGLE_ARG_PARAMETER);
+}
+
+// TAO_IDL - Generated from
+// be\be_visitor_operation/tie_si.cpp:101
+
+template <class T> ACE_INLINE
+::CORBA::DefinitionKind POA_CORBA::PrimitiveDef_tie<T>::def_kind (
+ ACE_ENV_SINGLE_ARG_DECL
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ))
+{
+ return this->ptr_->def_kind (
+ ACE_ENV_SINGLE_ARG_PARAMETER
+ );
+}
+
+// TAO_IDL - Generated from
+// be\be_visitor_operation/tie_si.cpp:101
+
+template <class T> ACE_INLINE
+void POA_CORBA::PrimitiveDef_tie<T>::destroy (
+ ACE_ENV_SINGLE_ARG_DECL
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ))
+{
+ this->ptr_->destroy (
+ ACE_ENV_SINGLE_ARG_PARAMETER
+ );
+}
+
+// TAO_IDL - Generated from
+// be\be_visitor_operation/tie_si.cpp:101
+
+template <class T> ACE_INLINE
+::CORBA::TypeCode_ptr POA_CORBA::PrimitiveDef_tie<T>::type (
+ ACE_ENV_SINGLE_ARG_DECL
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ))
+{
+ return this->ptr_->type (
+ ACE_ENV_SINGLE_ARG_PARAMETER
+ );
+}
+
+// TAO_IDL - Generated from
+// be\be_visitor_operation/tie_si.cpp:101
+
+template <class T> ACE_INLINE
+::CORBA::PrimitiveKind POA_CORBA::PrimitiveDef_tie<T>::kind (
+ ACE_ENV_SINGLE_ARG_DECL
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ))
+{
+ return this->ptr_->kind (
+ ACE_ENV_SINGLE_ARG_PARAMETER
+ );
+}
+
+// TAO_IDL - Generated from
+// be\be_visitor_interface/tie_si.cpp:96
+
+template <class T> ACE_INLINE
+POA_CORBA::StringDef_tie<T>::StringDef_tie (T &t)
+ : ptr_ (&t),
+ poa_ (PortableServer::POA::_nil ()),
+ rel_ (0)
+{}
+
+template <class T> ACE_INLINE
+POA_CORBA::StringDef_tie<T>::StringDef_tie (T &t, PortableServer::POA_ptr poa)
+ : ptr_ (&t),
+ poa_ (PortableServer::POA::_duplicate (poa)),
+ rel_ (0)
+{}
+
+template <class T> ACE_INLINE
+POA_CORBA::StringDef_tie<T>::StringDef_tie (T *tp, ::CORBA::Boolean release)
+ : ptr_ (tp),
+ poa_ (PortableServer::POA::_nil ()),
+ rel_ (release)
+{}
+
+template <class T> ACE_INLINE
+POA_CORBA::StringDef_tie<T>::StringDef_tie (T *tp, PortableServer::POA_ptr poa, ::CORBA::Boolean release)
+ : ptr_ (tp),
+ poa_ (PortableServer::POA::_duplicate (poa)),
+ rel_ (release)
+{}
+
+template <class T> ACE_INLINE
+POA_CORBA::StringDef_tie<T>::~StringDef_tie (void)
+{
+ if (this->rel_)
+ {
+ delete this->ptr_;
+ }
+}
+
+template <class T> ACE_INLINE T *
+POA_CORBA::StringDef_tie<T>::_tied_object (void)
+{
+ return this->ptr_;
+}
+
+template <class T> ACE_INLINE void
+POA_CORBA::StringDef_tie<T>::_tied_object (T &obj)
+{
+ if (this->rel_)
+ {
+ delete this->ptr_;
+ }
+
+ this->ptr_ = &obj;
+ this->rel_ = 0;
+}
+
+template <class T> ACE_INLINE void
+POA_CORBA::StringDef_tie<T>::_tied_object (T *obj, ::CORBA::Boolean release)
+{
+ if (this->rel_)
+ {
+ delete this->ptr_;
+ }
+
+ this->ptr_ = obj;
+ this->rel_ = release;
+}
+
+template <class T> ACE_INLINE ::CORBA::Boolean
+POA_CORBA::StringDef_tie<T>::_is_owner (void)
+{
+ return this->rel_;
+}
+
+template <class T> ACE_INLINE void
+POA_CORBA::StringDef_tie<T>::_is_owner ( ::CORBA::Boolean b)
+{
+ this->rel_ = b;
+}
+
+template <class T> ACE_INLINE PortableServer::POA_ptr
+POA_CORBA::StringDef_tie<T>::_default_POA (ACE_ENV_SINGLE_ARG_DECL)
+{
+ if (! ::CORBA::is_nil (this->poa_.in ()))
+ {
+ return PortableServer::POA::_duplicate (this->poa_.in ());
+ }
+
+ return this->StringDef::_default_POA (ACE_ENV_SINGLE_ARG_PARAMETER);
+}
+
+// TAO_IDL - Generated from
+// be\be_visitor_operation/tie_si.cpp:101
+
+template <class T> ACE_INLINE
+::CORBA::DefinitionKind POA_CORBA::StringDef_tie<T>::def_kind (
+ ACE_ENV_SINGLE_ARG_DECL
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ))
+{
+ return this->ptr_->def_kind (
+ ACE_ENV_SINGLE_ARG_PARAMETER
+ );
+}
+
+// TAO_IDL - Generated from
+// be\be_visitor_operation/tie_si.cpp:101
+
+template <class T> ACE_INLINE
+void POA_CORBA::StringDef_tie<T>::destroy (
+ ACE_ENV_SINGLE_ARG_DECL
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ))
+{
+ this->ptr_->destroy (
+ ACE_ENV_SINGLE_ARG_PARAMETER
+ );
+}
+
+// TAO_IDL - Generated from
+// be\be_visitor_operation/tie_si.cpp:101
+
+template <class T> ACE_INLINE
+::CORBA::TypeCode_ptr POA_CORBA::StringDef_tie<T>::type (
+ ACE_ENV_SINGLE_ARG_DECL
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ))
+{
+ return this->ptr_->type (
+ ACE_ENV_SINGLE_ARG_PARAMETER
+ );
+}
+
+// TAO_IDL - Generated from
+// be\be_visitor_operation/tie_si.cpp:101
+
+template <class T> ACE_INLINE
+::CORBA::ULong POA_CORBA::StringDef_tie<T>::bound (
+ ACE_ENV_SINGLE_ARG_DECL
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ))
+{
+ return this->ptr_->bound (
+ ACE_ENV_SINGLE_ARG_PARAMETER
+ );
+}
+
+// TAO_IDL - Generated from
+// be\be_visitor_operation/tie_si.cpp:101
+
+template <class T> ACE_INLINE
+void POA_CORBA::StringDef_tie<T>::bound (
+ ::CORBA::ULong bound
+ ACE_ENV_ARG_DECL
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ))
+{
+ this->ptr_->bound (
+ bound
+ ACE_ENV_ARG_PARAMETER
+ );
+}
+
+// TAO_IDL - Generated from
+// be\be_visitor_interface/tie_si.cpp:96
+
+template <class T> ACE_INLINE
+POA_CORBA::WstringDef_tie<T>::WstringDef_tie (T &t)
+ : ptr_ (&t),
+ poa_ (PortableServer::POA::_nil ()),
+ rel_ (0)
+{}
+
+template <class T> ACE_INLINE
+POA_CORBA::WstringDef_tie<T>::WstringDef_tie (T &t, PortableServer::POA_ptr poa)
+ : ptr_ (&t),
+ poa_ (PortableServer::POA::_duplicate (poa)),
+ rel_ (0)
+{}
+
+template <class T> ACE_INLINE
+POA_CORBA::WstringDef_tie<T>::WstringDef_tie (T *tp, ::CORBA::Boolean release)
+ : ptr_ (tp),
+ poa_ (PortableServer::POA::_nil ()),
+ rel_ (release)
+{}
+
+template <class T> ACE_INLINE
+POA_CORBA::WstringDef_tie<T>::WstringDef_tie (T *tp, PortableServer::POA_ptr poa, ::CORBA::Boolean release)
+ : ptr_ (tp),
+ poa_ (PortableServer::POA::_duplicate (poa)),
+ rel_ (release)
+{}
+
+template <class T> ACE_INLINE
+POA_CORBA::WstringDef_tie<T>::~WstringDef_tie (void)
+{
+ if (this->rel_)
+ {
+ delete this->ptr_;
+ }
+}
+
+template <class T> ACE_INLINE T *
+POA_CORBA::WstringDef_tie<T>::_tied_object (void)
+{
+ return this->ptr_;
+}
+
+template <class T> ACE_INLINE void
+POA_CORBA::WstringDef_tie<T>::_tied_object (T &obj)
+{
+ if (this->rel_)
+ {
+ delete this->ptr_;
+ }
+
+ this->ptr_ = &obj;
+ this->rel_ = 0;
+}
+
+template <class T> ACE_INLINE void
+POA_CORBA::WstringDef_tie<T>::_tied_object (T *obj, ::CORBA::Boolean release)
+{
+ if (this->rel_)
+ {
+ delete this->ptr_;
+ }
+
+ this->ptr_ = obj;
+ this->rel_ = release;
+}
+
+template <class T> ACE_INLINE ::CORBA::Boolean
+POA_CORBA::WstringDef_tie<T>::_is_owner (void)
+{
+ return this->rel_;
+}
+
+template <class T> ACE_INLINE void
+POA_CORBA::WstringDef_tie<T>::_is_owner ( ::CORBA::Boolean b)
+{
+ this->rel_ = b;
+}
+
+template <class T> ACE_INLINE PortableServer::POA_ptr
+POA_CORBA::WstringDef_tie<T>::_default_POA (ACE_ENV_SINGLE_ARG_DECL)
+{
+ if (! ::CORBA::is_nil (this->poa_.in ()))
+ {
+ return PortableServer::POA::_duplicate (this->poa_.in ());
+ }
+
+ return this->WstringDef::_default_POA (ACE_ENV_SINGLE_ARG_PARAMETER);
+}
+
+// TAO_IDL - Generated from
+// be\be_visitor_operation/tie_si.cpp:101
+
+template <class T> ACE_INLINE
+::CORBA::DefinitionKind POA_CORBA::WstringDef_tie<T>::def_kind (
+ ACE_ENV_SINGLE_ARG_DECL
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ))
+{
+ return this->ptr_->def_kind (
+ ACE_ENV_SINGLE_ARG_PARAMETER
+ );
+}
+
+// TAO_IDL - Generated from
+// be\be_visitor_operation/tie_si.cpp:101
+
+template <class T> ACE_INLINE
+void POA_CORBA::WstringDef_tie<T>::destroy (
+ ACE_ENV_SINGLE_ARG_DECL
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ))
+{
+ this->ptr_->destroy (
+ ACE_ENV_SINGLE_ARG_PARAMETER
+ );
+}
+
+// TAO_IDL - Generated from
+// be\be_visitor_operation/tie_si.cpp:101
+
+template <class T> ACE_INLINE
+::CORBA::TypeCode_ptr POA_CORBA::WstringDef_tie<T>::type (
+ ACE_ENV_SINGLE_ARG_DECL
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ))
+{
+ return this->ptr_->type (
+ ACE_ENV_SINGLE_ARG_PARAMETER
+ );
+}
+
+// TAO_IDL - Generated from
+// be\be_visitor_operation/tie_si.cpp:101
+
+template <class T> ACE_INLINE
+::CORBA::ULong POA_CORBA::WstringDef_tie<T>::bound (
+ ACE_ENV_SINGLE_ARG_DECL
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ))
+{
+ return this->ptr_->bound (
+ ACE_ENV_SINGLE_ARG_PARAMETER
+ );
+}
+
+// TAO_IDL - Generated from
+// be\be_visitor_operation/tie_si.cpp:101
+
+template <class T> ACE_INLINE
+void POA_CORBA::WstringDef_tie<T>::bound (
+ ::CORBA::ULong bound
+ ACE_ENV_ARG_DECL
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ))
+{
+ this->ptr_->bound (
+ bound
+ ACE_ENV_ARG_PARAMETER
+ );
+}
+
+// TAO_IDL - Generated from
+// be\be_visitor_interface/tie_si.cpp:96
+
+template <class T> ACE_INLINE
+POA_CORBA::SequenceDef_tie<T>::SequenceDef_tie (T &t)
+ : ptr_ (&t),
+ poa_ (PortableServer::POA::_nil ()),
+ rel_ (0)
+{}
+
+template <class T> ACE_INLINE
+POA_CORBA::SequenceDef_tie<T>::SequenceDef_tie (T &t, PortableServer::POA_ptr poa)
+ : ptr_ (&t),
+ poa_ (PortableServer::POA::_duplicate (poa)),
+ rel_ (0)
+{}
+
+template <class T> ACE_INLINE
+POA_CORBA::SequenceDef_tie<T>::SequenceDef_tie (T *tp, ::CORBA::Boolean release)
+ : ptr_ (tp),
+ poa_ (PortableServer::POA::_nil ()),
+ rel_ (release)
+{}
+
+template <class T> ACE_INLINE
+POA_CORBA::SequenceDef_tie<T>::SequenceDef_tie (T *tp, PortableServer::POA_ptr poa, ::CORBA::Boolean release)
+ : ptr_ (tp),
+ poa_ (PortableServer::POA::_duplicate (poa)),
+ rel_ (release)
+{}
+
+template <class T> ACE_INLINE
+POA_CORBA::SequenceDef_tie<T>::~SequenceDef_tie (void)
+{
+ if (this->rel_)
+ {
+ delete this->ptr_;
+ }
+}
+
+template <class T> ACE_INLINE T *
+POA_CORBA::SequenceDef_tie<T>::_tied_object (void)
+{
+ return this->ptr_;
+}
+
+template <class T> ACE_INLINE void
+POA_CORBA::SequenceDef_tie<T>::_tied_object (T &obj)
+{
+ if (this->rel_)
+ {
+ delete this->ptr_;
+ }
+
+ this->ptr_ = &obj;
+ this->rel_ = 0;
+}
+
+template <class T> ACE_INLINE void
+POA_CORBA::SequenceDef_tie<T>::_tied_object (T *obj, ::CORBA::Boolean release)
+{
+ if (this->rel_)
+ {
+ delete this->ptr_;
+ }
+
+ this->ptr_ = obj;
+ this->rel_ = release;
+}
+
+template <class T> ACE_INLINE ::CORBA::Boolean
+POA_CORBA::SequenceDef_tie<T>::_is_owner (void)
+{
+ return this->rel_;
+}
+
+template <class T> ACE_INLINE void
+POA_CORBA::SequenceDef_tie<T>::_is_owner ( ::CORBA::Boolean b)
+{
+ this->rel_ = b;
+}
+
+template <class T> ACE_INLINE PortableServer::POA_ptr
+POA_CORBA::SequenceDef_tie<T>::_default_POA (ACE_ENV_SINGLE_ARG_DECL)
+{
+ if (! ::CORBA::is_nil (this->poa_.in ()))
+ {
+ return PortableServer::POA::_duplicate (this->poa_.in ());
+ }
+
+ return this->SequenceDef::_default_POA (ACE_ENV_SINGLE_ARG_PARAMETER);
+}
+
+// TAO_IDL - Generated from
+// be\be_visitor_operation/tie_si.cpp:101
+
+template <class T> ACE_INLINE
+::CORBA::DefinitionKind POA_CORBA::SequenceDef_tie<T>::def_kind (
+ ACE_ENV_SINGLE_ARG_DECL
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ))
+{
+ return this->ptr_->def_kind (
+ ACE_ENV_SINGLE_ARG_PARAMETER
+ );
+}
+
+// TAO_IDL - Generated from
+// be\be_visitor_operation/tie_si.cpp:101
+
+template <class T> ACE_INLINE
+void POA_CORBA::SequenceDef_tie<T>::destroy (
+ ACE_ENV_SINGLE_ARG_DECL
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ))
+{
+ this->ptr_->destroy (
+ ACE_ENV_SINGLE_ARG_PARAMETER
+ );
+}
+
+// TAO_IDL - Generated from
+// be\be_visitor_operation/tie_si.cpp:101
+
+template <class T> ACE_INLINE
+::CORBA::TypeCode_ptr POA_CORBA::SequenceDef_tie<T>::type (
+ ACE_ENV_SINGLE_ARG_DECL
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ))
+{
+ return this->ptr_->type (
+ ACE_ENV_SINGLE_ARG_PARAMETER
+ );
+}
+
+// TAO_IDL - Generated from
+// be\be_visitor_operation/tie_si.cpp:101
+
+template <class T> ACE_INLINE
+::CORBA::ULong POA_CORBA::SequenceDef_tie<T>::bound (
+ ACE_ENV_SINGLE_ARG_DECL
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ))
+{
+ return this->ptr_->bound (
+ ACE_ENV_SINGLE_ARG_PARAMETER
+ );
+}
+
+// TAO_IDL - Generated from
+// be\be_visitor_operation/tie_si.cpp:101
+
+template <class T> ACE_INLINE
+void POA_CORBA::SequenceDef_tie<T>::bound (
+ ::CORBA::ULong bound
+ ACE_ENV_ARG_DECL
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ))
+{
+ this->ptr_->bound (
+ bound
+ ACE_ENV_ARG_PARAMETER
+ );
+}
+
+// TAO_IDL - Generated from
+// be\be_visitor_operation/tie_si.cpp:101
+
+template <class T> ACE_INLINE
+::CORBA::TypeCode_ptr POA_CORBA::SequenceDef_tie<T>::element_type (
+ ACE_ENV_SINGLE_ARG_DECL
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ))
+{
+ return this->ptr_->element_type (
+ ACE_ENV_SINGLE_ARG_PARAMETER
+ );
+}
+
+// TAO_IDL - Generated from
+// be\be_visitor_operation/tie_si.cpp:101
+
+template <class T> ACE_INLINE
+::CORBA::IDLType_ptr POA_CORBA::SequenceDef_tie<T>::element_type_def (
+ ACE_ENV_SINGLE_ARG_DECL
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ))
+{
+ return this->ptr_->element_type_def (
+ ACE_ENV_SINGLE_ARG_PARAMETER
+ );
+}
+
+// TAO_IDL - Generated from
+// be\be_visitor_operation/tie_si.cpp:101
+
+template <class T> ACE_INLINE
+void POA_CORBA::SequenceDef_tie<T>::element_type_def (
+ ::CORBA::IDLType_ptr element_type_def
+ ACE_ENV_ARG_DECL
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ))
+{
+ this->ptr_->element_type_def (
+ element_type_def
+ ACE_ENV_ARG_PARAMETER
+ );
+}
+
+// TAO_IDL - Generated from
+// be\be_visitor_interface/tie_si.cpp:96
+
+template <class T> ACE_INLINE
+POA_CORBA::ArrayDef_tie<T>::ArrayDef_tie (T &t)
+ : ptr_ (&t),
+ poa_ (PortableServer::POA::_nil ()),
+ rel_ (0)
+{}
+
+template <class T> ACE_INLINE
+POA_CORBA::ArrayDef_tie<T>::ArrayDef_tie (T &t, PortableServer::POA_ptr poa)
+ : ptr_ (&t),
+ poa_ (PortableServer::POA::_duplicate (poa)),
+ rel_ (0)
+{}
+
+template <class T> ACE_INLINE
+POA_CORBA::ArrayDef_tie<T>::ArrayDef_tie (T *tp, ::CORBA::Boolean release)
+ : ptr_ (tp),
+ poa_ (PortableServer::POA::_nil ()),
+ rel_ (release)
+{}
+
+template <class T> ACE_INLINE
+POA_CORBA::ArrayDef_tie<T>::ArrayDef_tie (T *tp, PortableServer::POA_ptr poa, ::CORBA::Boolean release)
+ : ptr_ (tp),
+ poa_ (PortableServer::POA::_duplicate (poa)),
+ rel_ (release)
+{}
+
+template <class T> ACE_INLINE
+POA_CORBA::ArrayDef_tie<T>::~ArrayDef_tie (void)
+{
+ if (this->rel_)
+ {
+ delete this->ptr_;
+ }
+}
+
+template <class T> ACE_INLINE T *
+POA_CORBA::ArrayDef_tie<T>::_tied_object (void)
+{
+ return this->ptr_;
+}
+
+template <class T> ACE_INLINE void
+POA_CORBA::ArrayDef_tie<T>::_tied_object (T &obj)
+{
+ if (this->rel_)
+ {
+ delete this->ptr_;
+ }
+
+ this->ptr_ = &obj;
+ this->rel_ = 0;
+}
+
+template <class T> ACE_INLINE void
+POA_CORBA::ArrayDef_tie<T>::_tied_object (T *obj, ::CORBA::Boolean release)
+{
+ if (this->rel_)
+ {
+ delete this->ptr_;
+ }
+
+ this->ptr_ = obj;
+ this->rel_ = release;
+}
+
+template <class T> ACE_INLINE ::CORBA::Boolean
+POA_CORBA::ArrayDef_tie<T>::_is_owner (void)
+{
+ return this->rel_;
+}
+
+template <class T> ACE_INLINE void
+POA_CORBA::ArrayDef_tie<T>::_is_owner ( ::CORBA::Boolean b)
+{
+ this->rel_ = b;
+}
+
+template <class T> ACE_INLINE PortableServer::POA_ptr
+POA_CORBA::ArrayDef_tie<T>::_default_POA (ACE_ENV_SINGLE_ARG_DECL)
+{
+ if (! ::CORBA::is_nil (this->poa_.in ()))
+ {
+ return PortableServer::POA::_duplicate (this->poa_.in ());
+ }
+
+ return this->ArrayDef::_default_POA (ACE_ENV_SINGLE_ARG_PARAMETER);
+}
+
+// TAO_IDL - Generated from
+// be\be_visitor_operation/tie_si.cpp:101
+
+template <class T> ACE_INLINE
+::CORBA::DefinitionKind POA_CORBA::ArrayDef_tie<T>::def_kind (
+ ACE_ENV_SINGLE_ARG_DECL
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ))
+{
+ return this->ptr_->def_kind (
+ ACE_ENV_SINGLE_ARG_PARAMETER
+ );
+}
+
+// TAO_IDL - Generated from
+// be\be_visitor_operation/tie_si.cpp:101
+
+template <class T> ACE_INLINE
+void POA_CORBA::ArrayDef_tie<T>::destroy (
+ ACE_ENV_SINGLE_ARG_DECL
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ))
+{
+ this->ptr_->destroy (
+ ACE_ENV_SINGLE_ARG_PARAMETER
+ );
+}
+
+// TAO_IDL - Generated from
+// be\be_visitor_operation/tie_si.cpp:101
+
+template <class T> ACE_INLINE
+::CORBA::TypeCode_ptr POA_CORBA::ArrayDef_tie<T>::type (
+ ACE_ENV_SINGLE_ARG_DECL
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ))
+{
+ return this->ptr_->type (
+ ACE_ENV_SINGLE_ARG_PARAMETER
+ );
+}
+
+// TAO_IDL - Generated from
+// be\be_visitor_operation/tie_si.cpp:101
+
+template <class T> ACE_INLINE
+::CORBA::ULong POA_CORBA::ArrayDef_tie<T>::length (
+ ACE_ENV_SINGLE_ARG_DECL
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ))
+{
+ return this->ptr_->length (
+ ACE_ENV_SINGLE_ARG_PARAMETER
+ );
+}
+
+// TAO_IDL - Generated from
+// be\be_visitor_operation/tie_si.cpp:101
+
+template <class T> ACE_INLINE
+void POA_CORBA::ArrayDef_tie<T>::length (
+ ::CORBA::ULong length
+ ACE_ENV_ARG_DECL
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ))
+{
+ this->ptr_->length (
+ length
+ ACE_ENV_ARG_PARAMETER
+ );
+}
+
+// TAO_IDL - Generated from
+// be\be_visitor_operation/tie_si.cpp:101
+
+template <class T> ACE_INLINE
+::CORBA::TypeCode_ptr POA_CORBA::ArrayDef_tie<T>::element_type (
+ ACE_ENV_SINGLE_ARG_DECL
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ))
+{
+ return this->ptr_->element_type (
+ ACE_ENV_SINGLE_ARG_PARAMETER
+ );
+}
+
+// TAO_IDL - Generated from
+// be\be_visitor_operation/tie_si.cpp:101
+
+template <class T> ACE_INLINE
+::CORBA::IDLType_ptr POA_CORBA::ArrayDef_tie<T>::element_type_def (
+ ACE_ENV_SINGLE_ARG_DECL
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ))
+{
+ return this->ptr_->element_type_def (
+ ACE_ENV_SINGLE_ARG_PARAMETER
+ );
+}
+
+// TAO_IDL - Generated from
+// be\be_visitor_operation/tie_si.cpp:101
+
+template <class T> ACE_INLINE
+void POA_CORBA::ArrayDef_tie<T>::element_type_def (
+ ::CORBA::IDLType_ptr element_type_def
+ ACE_ENV_ARG_DECL
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ))
+{
+ this->ptr_->element_type_def (
+ element_type_def
+ ACE_ENV_ARG_PARAMETER
+ );
+}
+
+// TAO_IDL - Generated from
+// be\be_visitor_interface/tie_si.cpp:96
+
+template <class T> ACE_INLINE
+POA_CORBA::ExceptionDef_tie<T>::ExceptionDef_tie (T &t)
+ : ptr_ (&t),
+ poa_ (PortableServer::POA::_nil ()),
+ rel_ (0)
+{}
+
+template <class T> ACE_INLINE
+POA_CORBA::ExceptionDef_tie<T>::ExceptionDef_tie (T &t, PortableServer::POA_ptr poa)
+ : ptr_ (&t),
+ poa_ (PortableServer::POA::_duplicate (poa)),
+ rel_ (0)
+{}
+
+template <class T> ACE_INLINE
+POA_CORBA::ExceptionDef_tie<T>::ExceptionDef_tie (T *tp, ::CORBA::Boolean release)
+ : ptr_ (tp),
+ poa_ (PortableServer::POA::_nil ()),
+ rel_ (release)
+{}
+
+template <class T> ACE_INLINE
+POA_CORBA::ExceptionDef_tie<T>::ExceptionDef_tie (T *tp, PortableServer::POA_ptr poa, ::CORBA::Boolean release)
+ : ptr_ (tp),
+ poa_ (PortableServer::POA::_duplicate (poa)),
+ rel_ (release)
+{}
+
+template <class T> ACE_INLINE
+POA_CORBA::ExceptionDef_tie<T>::~ExceptionDef_tie (void)
+{
+ if (this->rel_)
+ {
+ delete this->ptr_;
+ }
+}
+
+template <class T> ACE_INLINE T *
+POA_CORBA::ExceptionDef_tie<T>::_tied_object (void)
+{
+ return this->ptr_;
+}
+
+template <class T> ACE_INLINE void
+POA_CORBA::ExceptionDef_tie<T>::_tied_object (T &obj)
+{
+ if (this->rel_)
+ {
+ delete this->ptr_;
+ }
+
+ this->ptr_ = &obj;
+ this->rel_ = 0;
+}
+
+template <class T> ACE_INLINE void
+POA_CORBA::ExceptionDef_tie<T>::_tied_object (T *obj, ::CORBA::Boolean release)
+{
+ if (this->rel_)
+ {
+ delete this->ptr_;
+ }
+
+ this->ptr_ = obj;
+ this->rel_ = release;
+}
+
+template <class T> ACE_INLINE ::CORBA::Boolean
+POA_CORBA::ExceptionDef_tie<T>::_is_owner (void)
+{
+ return this->rel_;
+}
+
+template <class T> ACE_INLINE void
+POA_CORBA::ExceptionDef_tie<T>::_is_owner ( ::CORBA::Boolean b)
+{
+ this->rel_ = b;
+}
+
+template <class T> ACE_INLINE PortableServer::POA_ptr
+POA_CORBA::ExceptionDef_tie<T>::_default_POA (ACE_ENV_SINGLE_ARG_DECL)
+{
+ if (! ::CORBA::is_nil (this->poa_.in ()))
+ {
+ return PortableServer::POA::_duplicate (this->poa_.in ());
+ }
+
+ return this->ExceptionDef::_default_POA (ACE_ENV_SINGLE_ARG_PARAMETER);
+}
+
+// TAO_IDL - Generated from
+// be\be_visitor_operation/tie_si.cpp:101
+
+template <class T> ACE_INLINE
+::CORBA::DefinitionKind POA_CORBA::ExceptionDef_tie<T>::def_kind (
+ ACE_ENV_SINGLE_ARG_DECL
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ))
+{
+ return this->ptr_->def_kind (
+ ACE_ENV_SINGLE_ARG_PARAMETER
+ );
+}
+
+// TAO_IDL - Generated from
+// be\be_visitor_operation/tie_si.cpp:101
+
+template <class T> ACE_INLINE
+void POA_CORBA::ExceptionDef_tie<T>::destroy (
+ ACE_ENV_SINGLE_ARG_DECL
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ))
+{
+ this->ptr_->destroy (
+ ACE_ENV_SINGLE_ARG_PARAMETER
+ );
+}
+
+// TAO_IDL - Generated from
+// be\be_visitor_operation/tie_si.cpp:101
+
+template <class T> ACE_INLINE
+char * POA_CORBA::ExceptionDef_tie<T>::id (
+ ACE_ENV_SINGLE_ARG_DECL
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ))
+{
+ return this->ptr_->id (
+ ACE_ENV_SINGLE_ARG_PARAMETER
+ );
+}
+
+// TAO_IDL - Generated from
+// be\be_visitor_operation/tie_si.cpp:101
+
+template <class T> ACE_INLINE
+void POA_CORBA::ExceptionDef_tie<T>::id (
+ const char * id
+ ACE_ENV_ARG_DECL
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ))
+{
+ this->ptr_->id (
+ id
+ ACE_ENV_ARG_PARAMETER
+ );
+}
+
+// TAO_IDL - Generated from
+// be\be_visitor_operation/tie_si.cpp:101
+
+template <class T> ACE_INLINE
+char * POA_CORBA::ExceptionDef_tie<T>::name (
+ ACE_ENV_SINGLE_ARG_DECL
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ))
+{
+ return this->ptr_->name (
+ ACE_ENV_SINGLE_ARG_PARAMETER
+ );
+}
+
+// TAO_IDL - Generated from
+// be\be_visitor_operation/tie_si.cpp:101
+
+template <class T> ACE_INLINE
+void POA_CORBA::ExceptionDef_tie<T>::name (
+ const char * name
+ ACE_ENV_ARG_DECL
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ))
+{
+ this->ptr_->name (
+ name
+ ACE_ENV_ARG_PARAMETER
+ );
+}
+
+// TAO_IDL - Generated from
+// be\be_visitor_operation/tie_si.cpp:101
+
+template <class T> ACE_INLINE
+char * POA_CORBA::ExceptionDef_tie<T>::version (
+ ACE_ENV_SINGLE_ARG_DECL
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ))
+{
+ return this->ptr_->version (
+ ACE_ENV_SINGLE_ARG_PARAMETER
+ );
+}
+
+// TAO_IDL - Generated from
+// be\be_visitor_operation/tie_si.cpp:101
+
+template <class T> ACE_INLINE
+void POA_CORBA::ExceptionDef_tie<T>::version (
+ const char * version
+ ACE_ENV_ARG_DECL
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ))
+{
+ this->ptr_->version (
+ version
+ ACE_ENV_ARG_PARAMETER
+ );
+}
+
+// TAO_IDL - Generated from
+// be\be_visitor_operation/tie_si.cpp:101
+
+template <class T> ACE_INLINE
+::CORBA::Container_ptr POA_CORBA::ExceptionDef_tie<T>::defined_in (
+ ACE_ENV_SINGLE_ARG_DECL
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ))
+{
+ return this->ptr_->defined_in (
+ ACE_ENV_SINGLE_ARG_PARAMETER
+ );
+}
+
+// TAO_IDL - Generated from
+// be\be_visitor_operation/tie_si.cpp:101
+
+template <class T> ACE_INLINE
+char * POA_CORBA::ExceptionDef_tie<T>::absolute_name (
+ ACE_ENV_SINGLE_ARG_DECL
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ))
+{
+ return this->ptr_->absolute_name (
+ ACE_ENV_SINGLE_ARG_PARAMETER
+ );
+}
+
+// TAO_IDL - Generated from
+// be\be_visitor_operation/tie_si.cpp:101
+
+template <class T> ACE_INLINE
+::CORBA::Repository_ptr POA_CORBA::ExceptionDef_tie<T>::containing_repository (
+ ACE_ENV_SINGLE_ARG_DECL
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ))
+{
+ return this->ptr_->containing_repository (
+ ACE_ENV_SINGLE_ARG_PARAMETER
+ );
+}
+
+// TAO_IDL - Generated from
+// be\be_visitor_operation/tie_si.cpp:101
+
+template <class T> ACE_INLINE
+::CORBA::Contained::Description * POA_CORBA::ExceptionDef_tie<T>::describe (
+ ACE_ENV_SINGLE_ARG_DECL
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ))
+{
+ return this->ptr_->describe (
+ ACE_ENV_SINGLE_ARG_PARAMETER
+ );
+}
+
+// TAO_IDL - Generated from
+// be\be_visitor_operation/tie_si.cpp:101
+
+template <class T> ACE_INLINE
+void POA_CORBA::ExceptionDef_tie<T>::move (
+ ::CORBA::Container_ptr new_container,
+ const char * new_name,
+ const char * new_version
+ ACE_ENV_ARG_DECL
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ))
+{
+ this->ptr_->move (
+ new_container,
+ new_name,
+ new_version
+ ACE_ENV_ARG_PARAMETER
+ );
+}
+
+// TAO_IDL - Generated from
+// be\be_visitor_operation/tie_si.cpp:101
+
+template <class T> ACE_INLINE
+::CORBA::Contained_ptr POA_CORBA::ExceptionDef_tie<T>::lookup (
+ const char * search_name
+ ACE_ENV_ARG_DECL
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ))
+{
+ return this->ptr_->lookup (
+ search_name
+ ACE_ENV_ARG_PARAMETER
+ );
+}
+
+// TAO_IDL - Generated from
+// be\be_visitor_operation/tie_si.cpp:101
+
+template <class T> ACE_INLINE
+::CORBA::ContainedSeq * POA_CORBA::ExceptionDef_tie<T>::contents (
+ ::CORBA::DefinitionKind limit_type,
+ ::CORBA::Boolean exclude_inherited
+ ACE_ENV_ARG_DECL
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ))
+{
+ return this->ptr_->contents (
+ limit_type,
+ exclude_inherited
+ ACE_ENV_ARG_PARAMETER
+ );
+}
+
+// TAO_IDL - Generated from
+// be\be_visitor_operation/tie_si.cpp:101
+
+template <class T> ACE_INLINE
+::CORBA::ContainedSeq * POA_CORBA::ExceptionDef_tie<T>::lookup_name (
+ const char * search_name,
+ ::CORBA::Long levels_to_search,
+ ::CORBA::DefinitionKind limit_type,
+ ::CORBA::Boolean exclude_inherited
+ ACE_ENV_ARG_DECL
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ))
+{
+ return this->ptr_->lookup_name (
+ search_name,
+ levels_to_search,
+ limit_type,
+ exclude_inherited
+ ACE_ENV_ARG_PARAMETER
+ );
+}
+
+// TAO_IDL - Generated from
+// be\be_visitor_operation/tie_si.cpp:101
+
+template <class T> ACE_INLINE
+::CORBA::Container::DescriptionSeq * POA_CORBA::ExceptionDef_tie<T>::describe_contents (
+ ::CORBA::DefinitionKind limit_type,
+ ::CORBA::Boolean exclude_inherited,
+ ::CORBA::Long max_returned_objs
+ ACE_ENV_ARG_DECL
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ))
+{
+ return this->ptr_->describe_contents (
+ limit_type,
+ exclude_inherited,
+ max_returned_objs
+ ACE_ENV_ARG_PARAMETER
+ );
+}
+
+// TAO_IDL - Generated from
+// be\be_visitor_operation/tie_si.cpp:101
+
+template <class T> ACE_INLINE
+::CORBA::ModuleDef_ptr POA_CORBA::ExceptionDef_tie<T>::create_module (
+ const char * id,
+ const char * name,
+ const char * version
+ ACE_ENV_ARG_DECL
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ))
+{
+ return this->ptr_->create_module (
+ id,
+ name,
+ version
+ ACE_ENV_ARG_PARAMETER
+ );
+}
+
+// TAO_IDL - Generated from
+// be\be_visitor_operation/tie_si.cpp:101
+
+template <class T> ACE_INLINE
+::CORBA::ConstantDef_ptr POA_CORBA::ExceptionDef_tie<T>::create_constant (
+ const char * id,
+ const char * name,
+ const char * version,
+ ::CORBA::IDLType_ptr type,
+ const ::CORBA::Any & value
+ ACE_ENV_ARG_DECL
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ))
+{
+ return this->ptr_->create_constant (
+ id,
+ name,
+ version,
+ type,
+ value
+ ACE_ENV_ARG_PARAMETER
+ );
+}
+
+// TAO_IDL - Generated from
+// be\be_visitor_operation/tie_si.cpp:101
+
+template <class T> ACE_INLINE
+::CORBA::StructDef_ptr POA_CORBA::ExceptionDef_tie<T>::create_struct (
+ const char * id,
+ const char * name,
+ const char * version,
+ const ::CORBA::StructMemberSeq & members
+ ACE_ENV_ARG_DECL
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ))
+{
+ return this->ptr_->create_struct (
+ id,
+ name,
+ version,
+ members
+ ACE_ENV_ARG_PARAMETER
+ );
+}
+
+// TAO_IDL - Generated from
+// be\be_visitor_operation/tie_si.cpp:101
+
+template <class T> ACE_INLINE
+::CORBA::UnionDef_ptr POA_CORBA::ExceptionDef_tie<T>::create_union (
+ const char * id,
+ const char * name,
+ const char * version,
+ ::CORBA::IDLType_ptr discriminator_type,
+ const ::CORBA::UnionMemberSeq & members
+ ACE_ENV_ARG_DECL
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ))
+{
+ return this->ptr_->create_union (
+ id,
+ name,
+ version,
+ discriminator_type,
+ members
+ ACE_ENV_ARG_PARAMETER
+ );
+}
+
+// TAO_IDL - Generated from
+// be\be_visitor_operation/tie_si.cpp:101
+
+template <class T> ACE_INLINE
+::CORBA::EnumDef_ptr POA_CORBA::ExceptionDef_tie<T>::create_enum (
+ const char * id,
+ const char * name,
+ const char * version,
+ const ::CORBA::EnumMemberSeq & members
+ ACE_ENV_ARG_DECL
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ))
+{
+ return this->ptr_->create_enum (
+ id,
+ name,
+ version,
+ members
+ ACE_ENV_ARG_PARAMETER
+ );
+}
+
+// TAO_IDL - Generated from
+// be\be_visitor_operation/tie_si.cpp:101
+
+template <class T> ACE_INLINE
+::CORBA::AliasDef_ptr POA_CORBA::ExceptionDef_tie<T>::create_alias (
+ const char * id,
+ const char * name,
+ const char * version,
+ ::CORBA::IDLType_ptr original_type
+ ACE_ENV_ARG_DECL
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ))
+{
+ return this->ptr_->create_alias (
+ id,
+ name,
+ version,
+ original_type
+ ACE_ENV_ARG_PARAMETER
+ );
+}
+
+// TAO_IDL - Generated from
+// be\be_visitor_operation/tie_si.cpp:101
+
+template <class T> ACE_INLINE
+::CORBA::InterfaceDef_ptr POA_CORBA::ExceptionDef_tie<T>::create_interface (
+ const char * id,
+ const char * name,
+ const char * version,
+ const ::CORBA::InterfaceDefSeq & base_interfaces
+ ACE_ENV_ARG_DECL
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ))
+{
+ return this->ptr_->create_interface (
+ id,
+ name,
+ version,
+ base_interfaces
+ ACE_ENV_ARG_PARAMETER
+ );
+}
+
+// TAO_IDL - Generated from
+// be\be_visitor_operation/tie_si.cpp:101
+
+template <class T> ACE_INLINE
+::CORBA::ValueDef_ptr POA_CORBA::ExceptionDef_tie<T>::create_value (
+ const char * id,
+ const char * name,
+ const char * version,
+ ::CORBA::Boolean is_custom,
+ ::CORBA::Boolean is_abstract,
+ ::CORBA::ValueDef_ptr base_value,
+ ::CORBA::Boolean is_truncatable,
+ const ::CORBA::ValueDefSeq & abstract_base_values,
+ const ::CORBA::InterfaceDefSeq & supported_interfaces,
+ const ::CORBA::InitializerSeq & initializers
+ ACE_ENV_ARG_DECL
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ))
+{
+ return this->ptr_->create_value (
+ id,
+ name,
+ version,
+ is_custom,
+ is_abstract,
+ base_value,
+ is_truncatable,
+ abstract_base_values,
+ supported_interfaces,
+ initializers
+ ACE_ENV_ARG_PARAMETER
+ );
+}
+
+// TAO_IDL - Generated from
+// be\be_visitor_operation/tie_si.cpp:101
+
+template <class T> ACE_INLINE
+::CORBA::ValueBoxDef_ptr POA_CORBA::ExceptionDef_tie<T>::create_value_box (
+ const char * id,
+ const char * name,
+ const char * version,
+ ::CORBA::IDLType_ptr original_type_def
+ ACE_ENV_ARG_DECL
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ))
+{
+ return this->ptr_->create_value_box (
+ id,
+ name,
+ version,
+ original_type_def
+ ACE_ENV_ARG_PARAMETER
+ );
+}
+
+// TAO_IDL - Generated from
+// be\be_visitor_operation/tie_si.cpp:101
+
+template <class T> ACE_INLINE
+::CORBA::ExceptionDef_ptr POA_CORBA::ExceptionDef_tie<T>::create_exception (
+ const char * id,
+ const char * name,
+ const char * version,
+ const ::CORBA::StructMemberSeq & members
+ ACE_ENV_ARG_DECL
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ))
+{
+ return this->ptr_->create_exception (
+ id,
+ name,
+ version,
+ members
+ ACE_ENV_ARG_PARAMETER
+ );
+}
+
+// TAO_IDL - Generated from
+// be\be_visitor_operation/tie_si.cpp:101
+
+template <class T> ACE_INLINE
+::CORBA::NativeDef_ptr POA_CORBA::ExceptionDef_tie<T>::create_native (
+ const char * id,
+ const char * name,
+ const char * version
+ ACE_ENV_ARG_DECL
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ))
+{
+ return this->ptr_->create_native (
+ id,
+ name,
+ version
+ ACE_ENV_ARG_PARAMETER
+ );
+}
+
+// TAO_IDL - Generated from
+// be\be_visitor_operation/tie_si.cpp:101
+
+template <class T> ACE_INLINE
+::CORBA::AbstractInterfaceDef_ptr POA_CORBA::ExceptionDef_tie<T>::create_abstract_interface (
+ const char * id,
+ const char * name,
+ const char * version,
+ const ::CORBA::AbstractInterfaceDefSeq & base_interfaces
+ ACE_ENV_ARG_DECL
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ))
+{
+ return this->ptr_->create_abstract_interface (
+ id,
+ name,
+ version,
+ base_interfaces
+ ACE_ENV_ARG_PARAMETER
+ );
+}
+
+// TAO_IDL - Generated from
+// be\be_visitor_operation/tie_si.cpp:101
+
+template <class T> ACE_INLINE
+::CORBA::LocalInterfaceDef_ptr POA_CORBA::ExceptionDef_tie<T>::create_local_interface (
+ const char * id,
+ const char * name,
+ const char * version,
+ const ::CORBA::InterfaceDefSeq & base_interfaces
+ ACE_ENV_ARG_DECL
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ))
+{
+ return this->ptr_->create_local_interface (
+ id,
+ name,
+ version,
+ base_interfaces
+ ACE_ENV_ARG_PARAMETER
+ );
+}
+
+// TAO_IDL - Generated from
+// be\be_visitor_operation/tie_si.cpp:101
+
+template <class T> ACE_INLINE
+::CORBA::ExtValueDef_ptr POA_CORBA::ExceptionDef_tie<T>::create_ext_value (
+ const char * id,
+ const char * name,
+ const char * version,
+ ::CORBA::Boolean is_custom,
+ ::CORBA::Boolean is_abstract,
+ ::CORBA::ValueDef_ptr base_value,
+ ::CORBA::Boolean is_truncatable,
+ const ::CORBA::ValueDefSeq & abstract_base_values,
+ const ::CORBA::InterfaceDefSeq & supported_interfaces,
+ const ::CORBA::ExtInitializerSeq & initializers
+ ACE_ENV_ARG_DECL
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ))
+{
+ return this->ptr_->create_ext_value (
+ id,
+ name,
+ version,
+ is_custom,
+ is_abstract,
+ base_value,
+ is_truncatable,
+ abstract_base_values,
+ supported_interfaces,
+ initializers
+ ACE_ENV_ARG_PARAMETER
+ );
+}
+
+// TAO_IDL - Generated from
+// be\be_visitor_operation/tie_si.cpp:101
+
+template <class T> ACE_INLINE
+::CORBA::TypeCode_ptr POA_CORBA::ExceptionDef_tie<T>::type (
+ ACE_ENV_SINGLE_ARG_DECL
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ))
+{
+ return this->ptr_->type (
+ ACE_ENV_SINGLE_ARG_PARAMETER
+ );
+}
+
+// TAO_IDL - Generated from
+// be\be_visitor_operation/tie_si.cpp:101
+
+template <class T> ACE_INLINE
+::CORBA::StructMemberSeq * POA_CORBA::ExceptionDef_tie<T>::members (
+ ACE_ENV_SINGLE_ARG_DECL
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ))
+{
+ return this->ptr_->members (
+ ACE_ENV_SINGLE_ARG_PARAMETER
+ );
+}
+
+// TAO_IDL - Generated from
+// be\be_visitor_operation/tie_si.cpp:101
+
+template <class T> ACE_INLINE
+void POA_CORBA::ExceptionDef_tie<T>::members (
+ const ::CORBA::StructMemberSeq & members
+ ACE_ENV_ARG_DECL
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ))
+{
+ this->ptr_->members (
+ members
+ ACE_ENV_ARG_PARAMETER
+ );
+}
+
+// TAO_IDL - Generated from
+// be\be_visitor_interface/tie_si.cpp:96
+
+template <class T> ACE_INLINE
+POA_CORBA::AttributeDef_tie<T>::AttributeDef_tie (T &t)
+ : ptr_ (&t),
+ poa_ (PortableServer::POA::_nil ()),
+ rel_ (0)
+{}
+
+template <class T> ACE_INLINE
+POA_CORBA::AttributeDef_tie<T>::AttributeDef_tie (T &t, PortableServer::POA_ptr poa)
+ : ptr_ (&t),
+ poa_ (PortableServer::POA::_duplicate (poa)),
+ rel_ (0)
+{}
+
+template <class T> ACE_INLINE
+POA_CORBA::AttributeDef_tie<T>::AttributeDef_tie (T *tp, ::CORBA::Boolean release)
+ : ptr_ (tp),
+ poa_ (PortableServer::POA::_nil ()),
+ rel_ (release)
+{}
+
+template <class T> ACE_INLINE
+POA_CORBA::AttributeDef_tie<T>::AttributeDef_tie (T *tp, PortableServer::POA_ptr poa, ::CORBA::Boolean release)
+ : ptr_ (tp),
+ poa_ (PortableServer::POA::_duplicate (poa)),
+ rel_ (release)
+{}
+
+template <class T> ACE_INLINE
+POA_CORBA::AttributeDef_tie<T>::~AttributeDef_tie (void)
+{
+ if (this->rel_)
+ {
+ delete this->ptr_;
+ }
+}
+
+template <class T> ACE_INLINE T *
+POA_CORBA::AttributeDef_tie<T>::_tied_object (void)
+{
+ return this->ptr_;
+}
+
+template <class T> ACE_INLINE void
+POA_CORBA::AttributeDef_tie<T>::_tied_object (T &obj)
+{
+ if (this->rel_)
+ {
+ delete this->ptr_;
+ }
+
+ this->ptr_ = &obj;
+ this->rel_ = 0;
+}
+
+template <class T> ACE_INLINE void
+POA_CORBA::AttributeDef_tie<T>::_tied_object (T *obj, ::CORBA::Boolean release)
+{
+ if (this->rel_)
+ {
+ delete this->ptr_;
+ }
+
+ this->ptr_ = obj;
+ this->rel_ = release;
+}
+
+template <class T> ACE_INLINE ::CORBA::Boolean
+POA_CORBA::AttributeDef_tie<T>::_is_owner (void)
+{
+ return this->rel_;
+}
+
+template <class T> ACE_INLINE void
+POA_CORBA::AttributeDef_tie<T>::_is_owner ( ::CORBA::Boolean b)
+{
+ this->rel_ = b;
+}
+
+template <class T> ACE_INLINE PortableServer::POA_ptr
+POA_CORBA::AttributeDef_tie<T>::_default_POA (ACE_ENV_SINGLE_ARG_DECL)
+{
+ if (! ::CORBA::is_nil (this->poa_.in ()))
+ {
+ return PortableServer::POA::_duplicate (this->poa_.in ());
+ }
+
+ return this->AttributeDef::_default_POA (ACE_ENV_SINGLE_ARG_PARAMETER);
+}
+
+// TAO_IDL - Generated from
+// be\be_visitor_operation/tie_si.cpp:101
+
+template <class T> ACE_INLINE
+::CORBA::DefinitionKind POA_CORBA::AttributeDef_tie<T>::def_kind (
+ ACE_ENV_SINGLE_ARG_DECL
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ))
+{
+ return this->ptr_->def_kind (
+ ACE_ENV_SINGLE_ARG_PARAMETER
+ );
+}
+
+// TAO_IDL - Generated from
+// be\be_visitor_operation/tie_si.cpp:101
+
+template <class T> ACE_INLINE
+void POA_CORBA::AttributeDef_tie<T>::destroy (
+ ACE_ENV_SINGLE_ARG_DECL
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ))
+{
+ this->ptr_->destroy (
+ ACE_ENV_SINGLE_ARG_PARAMETER
+ );
+}
+
+// TAO_IDL - Generated from
+// be\be_visitor_operation/tie_si.cpp:101
+
+template <class T> ACE_INLINE
+char * POA_CORBA::AttributeDef_tie<T>::id (
+ ACE_ENV_SINGLE_ARG_DECL
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ))
+{
+ return this->ptr_->id (
+ ACE_ENV_SINGLE_ARG_PARAMETER
+ );
+}
+
+// TAO_IDL - Generated from
+// be\be_visitor_operation/tie_si.cpp:101
+
+template <class T> ACE_INLINE
+void POA_CORBA::AttributeDef_tie<T>::id (
+ const char * id
+ ACE_ENV_ARG_DECL
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ))
+{
+ this->ptr_->id (
+ id
+ ACE_ENV_ARG_PARAMETER
+ );
+}
+
+// TAO_IDL - Generated from
+// be\be_visitor_operation/tie_si.cpp:101
+
+template <class T> ACE_INLINE
+char * POA_CORBA::AttributeDef_tie<T>::name (
+ ACE_ENV_SINGLE_ARG_DECL
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ))
+{
+ return this->ptr_->name (
+ ACE_ENV_SINGLE_ARG_PARAMETER
+ );
+}
+
+// TAO_IDL - Generated from
+// be\be_visitor_operation/tie_si.cpp:101
+
+template <class T> ACE_INLINE
+void POA_CORBA::AttributeDef_tie<T>::name (
+ const char * name
+ ACE_ENV_ARG_DECL
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ))
+{
+ this->ptr_->name (
+ name
+ ACE_ENV_ARG_PARAMETER
+ );
+}
+
+// TAO_IDL - Generated from
+// be\be_visitor_operation/tie_si.cpp:101
+
+template <class T> ACE_INLINE
+char * POA_CORBA::AttributeDef_tie<T>::version (
+ ACE_ENV_SINGLE_ARG_DECL
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ))
+{
+ return this->ptr_->version (
+ ACE_ENV_SINGLE_ARG_PARAMETER
+ );
+}
+
+// TAO_IDL - Generated from
+// be\be_visitor_operation/tie_si.cpp:101
+
+template <class T> ACE_INLINE
+void POA_CORBA::AttributeDef_tie<T>::version (
+ const char * version
+ ACE_ENV_ARG_DECL
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ))
+{
+ this->ptr_->version (
+ version
+ ACE_ENV_ARG_PARAMETER
+ );
+}
+
+// TAO_IDL - Generated from
+// be\be_visitor_operation/tie_si.cpp:101
+
+template <class T> ACE_INLINE
+::CORBA::Container_ptr POA_CORBA::AttributeDef_tie<T>::defined_in (
+ ACE_ENV_SINGLE_ARG_DECL
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ))
+{
+ return this->ptr_->defined_in (
+ ACE_ENV_SINGLE_ARG_PARAMETER
+ );
+}
+
+// TAO_IDL - Generated from
+// be\be_visitor_operation/tie_si.cpp:101
+
+template <class T> ACE_INLINE
+char * POA_CORBA::AttributeDef_tie<T>::absolute_name (
+ ACE_ENV_SINGLE_ARG_DECL
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ))
+{
+ return this->ptr_->absolute_name (
+ ACE_ENV_SINGLE_ARG_PARAMETER
+ );
+}
+
+// TAO_IDL - Generated from
+// be\be_visitor_operation/tie_si.cpp:101
+
+template <class T> ACE_INLINE
+::CORBA::Repository_ptr POA_CORBA::AttributeDef_tie<T>::containing_repository (
+ ACE_ENV_SINGLE_ARG_DECL
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ))
+{
+ return this->ptr_->containing_repository (
+ ACE_ENV_SINGLE_ARG_PARAMETER
+ );
+}
+
+// TAO_IDL - Generated from
+// be\be_visitor_operation/tie_si.cpp:101
+
+template <class T> ACE_INLINE
+::CORBA::Contained::Description * POA_CORBA::AttributeDef_tie<T>::describe (
+ ACE_ENV_SINGLE_ARG_DECL
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ))
+{
+ return this->ptr_->describe (
+ ACE_ENV_SINGLE_ARG_PARAMETER
+ );
+}
+
+// TAO_IDL - Generated from
+// be\be_visitor_operation/tie_si.cpp:101
+
+template <class T> ACE_INLINE
+void POA_CORBA::AttributeDef_tie<T>::move (
+ ::CORBA::Container_ptr new_container,
+ const char * new_name,
+ const char * new_version
+ ACE_ENV_ARG_DECL
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ))
+{
+ this->ptr_->move (
+ new_container,
+ new_name,
+ new_version
+ ACE_ENV_ARG_PARAMETER
+ );
+}
+
+// TAO_IDL - Generated from
+// be\be_visitor_operation/tie_si.cpp:101
+
+template <class T> ACE_INLINE
+::CORBA::TypeCode_ptr POA_CORBA::AttributeDef_tie<T>::type (
+ ACE_ENV_SINGLE_ARG_DECL
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ))
+{
+ return this->ptr_->type (
+ ACE_ENV_SINGLE_ARG_PARAMETER
+ );
+}
+
+// TAO_IDL - Generated from
+// be\be_visitor_operation/tie_si.cpp:101
+
+template <class T> ACE_INLINE
+::CORBA::IDLType_ptr POA_CORBA::AttributeDef_tie<T>::type_def (
+ ACE_ENV_SINGLE_ARG_DECL
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ))
+{
+ return this->ptr_->type_def (
+ ACE_ENV_SINGLE_ARG_PARAMETER
+ );
+}
+
+// TAO_IDL - Generated from
+// be\be_visitor_operation/tie_si.cpp:101
+
+template <class T> ACE_INLINE
+void POA_CORBA::AttributeDef_tie<T>::type_def (
+ ::CORBA::IDLType_ptr type_def
+ ACE_ENV_ARG_DECL
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ))
+{
+ this->ptr_->type_def (
+ type_def
+ ACE_ENV_ARG_PARAMETER
+ );
+}
+
+// TAO_IDL - Generated from
+// be\be_visitor_operation/tie_si.cpp:101
+
+template <class T> ACE_INLINE
+::CORBA::AttributeMode POA_CORBA::AttributeDef_tie<T>::mode (
+ ACE_ENV_SINGLE_ARG_DECL
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ))
+{
+ return this->ptr_->mode (
+ ACE_ENV_SINGLE_ARG_PARAMETER
+ );
+}
+
+// TAO_IDL - Generated from
+// be\be_visitor_operation/tie_si.cpp:101
+
+template <class T> ACE_INLINE
+void POA_CORBA::AttributeDef_tie<T>::mode (
+ ::CORBA::AttributeMode mode
+ ACE_ENV_ARG_DECL
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ))
+{
+ this->ptr_->mode (
+ mode
+ ACE_ENV_ARG_PARAMETER
+ );
+}
+
+// TAO_IDL - Generated from
+// be\be_visitor_interface/tie_si.cpp:96
+
+template <class T> ACE_INLINE
+POA_CORBA::ExtAttributeDef_tie<T>::ExtAttributeDef_tie (T &t)
+ : ptr_ (&t),
+ poa_ (PortableServer::POA::_nil ()),
+ rel_ (0)
+{}
+
+template <class T> ACE_INLINE
+POA_CORBA::ExtAttributeDef_tie<T>::ExtAttributeDef_tie (T &t, PortableServer::POA_ptr poa)
+ : ptr_ (&t),
+ poa_ (PortableServer::POA::_duplicate (poa)),
+ rel_ (0)
+{}
+
+template <class T> ACE_INLINE
+POA_CORBA::ExtAttributeDef_tie<T>::ExtAttributeDef_tie (T *tp, ::CORBA::Boolean release)
+ : ptr_ (tp),
+ poa_ (PortableServer::POA::_nil ()),
+ rel_ (release)
+{}
+
+template <class T> ACE_INLINE
+POA_CORBA::ExtAttributeDef_tie<T>::ExtAttributeDef_tie (T *tp, PortableServer::POA_ptr poa, ::CORBA::Boolean release)
+ : ptr_ (tp),
+ poa_ (PortableServer::POA::_duplicate (poa)),
+ rel_ (release)
+{}
+
+template <class T> ACE_INLINE
+POA_CORBA::ExtAttributeDef_tie<T>::~ExtAttributeDef_tie (void)
+{
+ if (this->rel_)
+ {
+ delete this->ptr_;
+ }
+}
+
+template <class T> ACE_INLINE T *
+POA_CORBA::ExtAttributeDef_tie<T>::_tied_object (void)
+{
+ return this->ptr_;
+}
+
+template <class T> ACE_INLINE void
+POA_CORBA::ExtAttributeDef_tie<T>::_tied_object (T &obj)
+{
+ if (this->rel_)
+ {
+ delete this->ptr_;
+ }
+
+ this->ptr_ = &obj;
+ this->rel_ = 0;
+}
+
+template <class T> ACE_INLINE void
+POA_CORBA::ExtAttributeDef_tie<T>::_tied_object (T *obj, ::CORBA::Boolean release)
+{
+ if (this->rel_)
+ {
+ delete this->ptr_;
+ }
+
+ this->ptr_ = obj;
+ this->rel_ = release;
+}
+
+template <class T> ACE_INLINE ::CORBA::Boolean
+POA_CORBA::ExtAttributeDef_tie<T>::_is_owner (void)
+{
+ return this->rel_;
+}
+
+template <class T> ACE_INLINE void
+POA_CORBA::ExtAttributeDef_tie<T>::_is_owner ( ::CORBA::Boolean b)
+{
+ this->rel_ = b;
+}
+
+template <class T> ACE_INLINE PortableServer::POA_ptr
+POA_CORBA::ExtAttributeDef_tie<T>::_default_POA (ACE_ENV_SINGLE_ARG_DECL)
+{
+ if (! ::CORBA::is_nil (this->poa_.in ()))
+ {
+ return PortableServer::POA::_duplicate (this->poa_.in ());
+ }
+
+ return this->ExtAttributeDef::_default_POA (ACE_ENV_SINGLE_ARG_PARAMETER);
+}
+
+// TAO_IDL - Generated from
+// be\be_visitor_operation/tie_si.cpp:101
+
+template <class T> ACE_INLINE
+::CORBA::DefinitionKind POA_CORBA::ExtAttributeDef_tie<T>::def_kind (
+ ACE_ENV_SINGLE_ARG_DECL
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ))
+{
+ return this->ptr_->def_kind (
+ ACE_ENV_SINGLE_ARG_PARAMETER
+ );
+}
+
+// TAO_IDL - Generated from
+// be\be_visitor_operation/tie_si.cpp:101
+
+template <class T> ACE_INLINE
+void POA_CORBA::ExtAttributeDef_tie<T>::destroy (
+ ACE_ENV_SINGLE_ARG_DECL
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ))
+{
+ this->ptr_->destroy (
+ ACE_ENV_SINGLE_ARG_PARAMETER
+ );
+}
+
+// TAO_IDL - Generated from
+// be\be_visitor_operation/tie_si.cpp:101
+
+template <class T> ACE_INLINE
+char * POA_CORBA::ExtAttributeDef_tie<T>::id (
+ ACE_ENV_SINGLE_ARG_DECL
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ))
+{
+ return this->ptr_->id (
+ ACE_ENV_SINGLE_ARG_PARAMETER
+ );
+}
+
+// TAO_IDL - Generated from
+// be\be_visitor_operation/tie_si.cpp:101
+
+template <class T> ACE_INLINE
+void POA_CORBA::ExtAttributeDef_tie<T>::id (
+ const char * id
+ ACE_ENV_ARG_DECL
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ))
+{
+ this->ptr_->id (
+ id
+ ACE_ENV_ARG_PARAMETER
+ );
+}
+
+// TAO_IDL - Generated from
+// be\be_visitor_operation/tie_si.cpp:101
+
+template <class T> ACE_INLINE
+char * POA_CORBA::ExtAttributeDef_tie<T>::name (
+ ACE_ENV_SINGLE_ARG_DECL
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ))
+{
+ return this->ptr_->name (
+ ACE_ENV_SINGLE_ARG_PARAMETER
+ );
+}
+
+// TAO_IDL - Generated from
+// be\be_visitor_operation/tie_si.cpp:101
+
+template <class T> ACE_INLINE
+void POA_CORBA::ExtAttributeDef_tie<T>::name (
+ const char * name
+ ACE_ENV_ARG_DECL
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ))
+{
+ this->ptr_->name (
+ name
+ ACE_ENV_ARG_PARAMETER
+ );
+}
+
+// TAO_IDL - Generated from
+// be\be_visitor_operation/tie_si.cpp:101
+
+template <class T> ACE_INLINE
+char * POA_CORBA::ExtAttributeDef_tie<T>::version (
+ ACE_ENV_SINGLE_ARG_DECL
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ))
+{
+ return this->ptr_->version (
+ ACE_ENV_SINGLE_ARG_PARAMETER
+ );
+}
+
+// TAO_IDL - Generated from
+// be\be_visitor_operation/tie_si.cpp:101
+
+template <class T> ACE_INLINE
+void POA_CORBA::ExtAttributeDef_tie<T>::version (
+ const char * version
+ ACE_ENV_ARG_DECL
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ))
+{
+ this->ptr_->version (
+ version
+ ACE_ENV_ARG_PARAMETER
+ );
+}
+
+// TAO_IDL - Generated from
+// be\be_visitor_operation/tie_si.cpp:101
+
+template <class T> ACE_INLINE
+::CORBA::Container_ptr POA_CORBA::ExtAttributeDef_tie<T>::defined_in (
+ ACE_ENV_SINGLE_ARG_DECL
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ))
+{
+ return this->ptr_->defined_in (
+ ACE_ENV_SINGLE_ARG_PARAMETER
+ );
+}
+
+// TAO_IDL - Generated from
+// be\be_visitor_operation/tie_si.cpp:101
+
+template <class T> ACE_INLINE
+char * POA_CORBA::ExtAttributeDef_tie<T>::absolute_name (
+ ACE_ENV_SINGLE_ARG_DECL
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ))
+{
+ return this->ptr_->absolute_name (
+ ACE_ENV_SINGLE_ARG_PARAMETER
+ );
+}
+
+// TAO_IDL - Generated from
+// be\be_visitor_operation/tie_si.cpp:101
+
+template <class T> ACE_INLINE
+::CORBA::Repository_ptr POA_CORBA::ExtAttributeDef_tie<T>::containing_repository (
+ ACE_ENV_SINGLE_ARG_DECL
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ))
+{
+ return this->ptr_->containing_repository (
+ ACE_ENV_SINGLE_ARG_PARAMETER
+ );
+}
+
+// TAO_IDL - Generated from
+// be\be_visitor_operation/tie_si.cpp:101
+
+template <class T> ACE_INLINE
+::CORBA::Contained::Description * POA_CORBA::ExtAttributeDef_tie<T>::describe (
+ ACE_ENV_SINGLE_ARG_DECL
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ))
+{
+ return this->ptr_->describe (
+ ACE_ENV_SINGLE_ARG_PARAMETER
+ );
+}
+
+// TAO_IDL - Generated from
+// be\be_visitor_operation/tie_si.cpp:101
+
+template <class T> ACE_INLINE
+void POA_CORBA::ExtAttributeDef_tie<T>::move (
+ ::CORBA::Container_ptr new_container,
+ const char * new_name,
+ const char * new_version
+ ACE_ENV_ARG_DECL
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ))
+{
+ this->ptr_->move (
+ new_container,
+ new_name,
+ new_version
+ ACE_ENV_ARG_PARAMETER
+ );
+}
+
+// TAO_IDL - Generated from
+// be\be_visitor_operation/tie_si.cpp:101
+
+template <class T> ACE_INLINE
+::CORBA::TypeCode_ptr POA_CORBA::ExtAttributeDef_tie<T>::type (
+ ACE_ENV_SINGLE_ARG_DECL
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ))
+{
+ return this->ptr_->type (
+ ACE_ENV_SINGLE_ARG_PARAMETER
+ );
+}
+
+// TAO_IDL - Generated from
+// be\be_visitor_operation/tie_si.cpp:101
+
+template <class T> ACE_INLINE
+::CORBA::IDLType_ptr POA_CORBA::ExtAttributeDef_tie<T>::type_def (
+ ACE_ENV_SINGLE_ARG_DECL
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ))
+{
+ return this->ptr_->type_def (
+ ACE_ENV_SINGLE_ARG_PARAMETER
+ );
+}
+
+// TAO_IDL - Generated from
+// be\be_visitor_operation/tie_si.cpp:101
+
+template <class T> ACE_INLINE
+void POA_CORBA::ExtAttributeDef_tie<T>::type_def (
+ ::CORBA::IDLType_ptr type_def
+ ACE_ENV_ARG_DECL
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ))
+{
+ this->ptr_->type_def (
+ type_def
+ ACE_ENV_ARG_PARAMETER
+ );
+}
+
+// TAO_IDL - Generated from
+// be\be_visitor_operation/tie_si.cpp:101
+
+template <class T> ACE_INLINE
+::CORBA::AttributeMode POA_CORBA::ExtAttributeDef_tie<T>::mode (
+ ACE_ENV_SINGLE_ARG_DECL
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ))
+{
+ return this->ptr_->mode (
+ ACE_ENV_SINGLE_ARG_PARAMETER
+ );
+}
+
+// TAO_IDL - Generated from
+// be\be_visitor_operation/tie_si.cpp:101
+
+template <class T> ACE_INLINE
+void POA_CORBA::ExtAttributeDef_tie<T>::mode (
+ ::CORBA::AttributeMode mode
+ ACE_ENV_ARG_DECL
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ))
+{
+ this->ptr_->mode (
+ mode
+ ACE_ENV_ARG_PARAMETER
+ );
+}
+
+// TAO_IDL - Generated from
+// be\be_visitor_operation/tie_si.cpp:101
+
+template <class T> ACE_INLINE
+::CORBA::ExcDescriptionSeq * POA_CORBA::ExtAttributeDef_tie<T>::get_exceptions (
+ ACE_ENV_SINGLE_ARG_DECL
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ))
+{
+ return this->ptr_->get_exceptions (
+ ACE_ENV_SINGLE_ARG_PARAMETER
+ );
+}
+
+// TAO_IDL - Generated from
+// be\be_visitor_operation/tie_si.cpp:101
+
+template <class T> ACE_INLINE
+void POA_CORBA::ExtAttributeDef_tie<T>::get_exceptions (
+ const ::CORBA::ExcDescriptionSeq & get_exceptions
+ ACE_ENV_ARG_DECL
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ))
+{
+ this->ptr_->get_exceptions (
+ get_exceptions
+ ACE_ENV_ARG_PARAMETER
+ );
+}
+
+// TAO_IDL - Generated from
+// be\be_visitor_operation/tie_si.cpp:101
+
+template <class T> ACE_INLINE
+::CORBA::ExcDescriptionSeq * POA_CORBA::ExtAttributeDef_tie<T>::set_exceptions (
+ ACE_ENV_SINGLE_ARG_DECL
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ))
+{
+ return this->ptr_->set_exceptions (
+ ACE_ENV_SINGLE_ARG_PARAMETER
+ );
+}
+
+// TAO_IDL - Generated from
+// be\be_visitor_operation/tie_si.cpp:101
+
+template <class T> ACE_INLINE
+void POA_CORBA::ExtAttributeDef_tie<T>::set_exceptions (
+ const ::CORBA::ExcDescriptionSeq & set_exceptions
+ ACE_ENV_ARG_DECL
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ))
+{
+ this->ptr_->set_exceptions (
+ set_exceptions
+ ACE_ENV_ARG_PARAMETER
+ );
+}
+
+// TAO_IDL - Generated from
+// be\be_visitor_operation/tie_si.cpp:101
+
+template <class T> ACE_INLINE
+::CORBA::ExtAttributeDescription * POA_CORBA::ExtAttributeDef_tie<T>::describe_attribute (
+ ACE_ENV_SINGLE_ARG_DECL
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ))
+{
+ return this->ptr_->describe_attribute (
+ ACE_ENV_SINGLE_ARG_PARAMETER
+ );
+}
+
+// TAO_IDL - Generated from
+// be\be_visitor_interface/tie_si.cpp:96
+
+template <class T> ACE_INLINE
+POA_CORBA::OperationDef_tie<T>::OperationDef_tie (T &t)
+ : ptr_ (&t),
+ poa_ (PortableServer::POA::_nil ()),
+ rel_ (0)
+{}
+
+template <class T> ACE_INLINE
+POA_CORBA::OperationDef_tie<T>::OperationDef_tie (T &t, PortableServer::POA_ptr poa)
+ : ptr_ (&t),
+ poa_ (PortableServer::POA::_duplicate (poa)),
+ rel_ (0)
+{}
+
+template <class T> ACE_INLINE
+POA_CORBA::OperationDef_tie<T>::OperationDef_tie (T *tp, ::CORBA::Boolean release)
+ : ptr_ (tp),
+ poa_ (PortableServer::POA::_nil ()),
+ rel_ (release)
+{}
+
+template <class T> ACE_INLINE
+POA_CORBA::OperationDef_tie<T>::OperationDef_tie (T *tp, PortableServer::POA_ptr poa, ::CORBA::Boolean release)
+ : ptr_ (tp),
+ poa_ (PortableServer::POA::_duplicate (poa)),
+ rel_ (release)
+{}
+
+template <class T> ACE_INLINE
+POA_CORBA::OperationDef_tie<T>::~OperationDef_tie (void)
+{
+ if (this->rel_)
+ {
+ delete this->ptr_;
+ }
+}
+
+template <class T> ACE_INLINE T *
+POA_CORBA::OperationDef_tie<T>::_tied_object (void)
+{
+ return this->ptr_;
+}
+
+template <class T> ACE_INLINE void
+POA_CORBA::OperationDef_tie<T>::_tied_object (T &obj)
+{
+ if (this->rel_)
+ {
+ delete this->ptr_;
+ }
+
+ this->ptr_ = &obj;
+ this->rel_ = 0;
+}
+
+template <class T> ACE_INLINE void
+POA_CORBA::OperationDef_tie<T>::_tied_object (T *obj, ::CORBA::Boolean release)
+{
+ if (this->rel_)
+ {
+ delete this->ptr_;
+ }
+
+ this->ptr_ = obj;
+ this->rel_ = release;
+}
+
+template <class T> ACE_INLINE ::CORBA::Boolean
+POA_CORBA::OperationDef_tie<T>::_is_owner (void)
+{
+ return this->rel_;
+}
+
+template <class T> ACE_INLINE void
+POA_CORBA::OperationDef_tie<T>::_is_owner ( ::CORBA::Boolean b)
+{
+ this->rel_ = b;
+}
+
+template <class T> ACE_INLINE PortableServer::POA_ptr
+POA_CORBA::OperationDef_tie<T>::_default_POA (ACE_ENV_SINGLE_ARG_DECL)
+{
+ if (! ::CORBA::is_nil (this->poa_.in ()))
+ {
+ return PortableServer::POA::_duplicate (this->poa_.in ());
+ }
+
+ return this->OperationDef::_default_POA (ACE_ENV_SINGLE_ARG_PARAMETER);
+}
+
+// TAO_IDL - Generated from
+// be\be_visitor_operation/tie_si.cpp:101
+
+template <class T> ACE_INLINE
+::CORBA::DefinitionKind POA_CORBA::OperationDef_tie<T>::def_kind (
+ ACE_ENV_SINGLE_ARG_DECL
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ))
+{
+ return this->ptr_->def_kind (
+ ACE_ENV_SINGLE_ARG_PARAMETER
+ );
+}
+
+// TAO_IDL - Generated from
+// be\be_visitor_operation/tie_si.cpp:101
+
+template <class T> ACE_INLINE
+void POA_CORBA::OperationDef_tie<T>::destroy (
+ ACE_ENV_SINGLE_ARG_DECL
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ))
+{
+ this->ptr_->destroy (
+ ACE_ENV_SINGLE_ARG_PARAMETER
+ );
+}
+
+// TAO_IDL - Generated from
+// be\be_visitor_operation/tie_si.cpp:101
+
+template <class T> ACE_INLINE
+char * POA_CORBA::OperationDef_tie<T>::id (
+ ACE_ENV_SINGLE_ARG_DECL
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ))
+{
+ return this->ptr_->id (
+ ACE_ENV_SINGLE_ARG_PARAMETER
+ );
+}
+
+// TAO_IDL - Generated from
+// be\be_visitor_operation/tie_si.cpp:101
+
+template <class T> ACE_INLINE
+void POA_CORBA::OperationDef_tie<T>::id (
+ const char * id
+ ACE_ENV_ARG_DECL
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ))
+{
+ this->ptr_->id (
+ id
+ ACE_ENV_ARG_PARAMETER
+ );
+}
+
+// TAO_IDL - Generated from
+// be\be_visitor_operation/tie_si.cpp:101
+
+template <class T> ACE_INLINE
+char * POA_CORBA::OperationDef_tie<T>::name (
+ ACE_ENV_SINGLE_ARG_DECL
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ))
+{
+ return this->ptr_->name (
+ ACE_ENV_SINGLE_ARG_PARAMETER
+ );
+}
+
+// TAO_IDL - Generated from
+// be\be_visitor_operation/tie_si.cpp:101
+
+template <class T> ACE_INLINE
+void POA_CORBA::OperationDef_tie<T>::name (
+ const char * name
+ ACE_ENV_ARG_DECL
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ))
+{
+ this->ptr_->name (
+ name
+ ACE_ENV_ARG_PARAMETER
+ );
+}
+
+// TAO_IDL - Generated from
+// be\be_visitor_operation/tie_si.cpp:101
+
+template <class T> ACE_INLINE
+char * POA_CORBA::OperationDef_tie<T>::version (
+ ACE_ENV_SINGLE_ARG_DECL
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ))
+{
+ return this->ptr_->version (
+ ACE_ENV_SINGLE_ARG_PARAMETER
+ );
+}
+
+// TAO_IDL - Generated from
+// be\be_visitor_operation/tie_si.cpp:101
+
+template <class T> ACE_INLINE
+void POA_CORBA::OperationDef_tie<T>::version (
+ const char * version
+ ACE_ENV_ARG_DECL
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ))
+{
+ this->ptr_->version (
+ version
+ ACE_ENV_ARG_PARAMETER
+ );
+}
+
+// TAO_IDL - Generated from
+// be\be_visitor_operation/tie_si.cpp:101
+
+template <class T> ACE_INLINE
+::CORBA::Container_ptr POA_CORBA::OperationDef_tie<T>::defined_in (
+ ACE_ENV_SINGLE_ARG_DECL
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ))
+{
+ return this->ptr_->defined_in (
+ ACE_ENV_SINGLE_ARG_PARAMETER
+ );
+}
+
+// TAO_IDL - Generated from
+// be\be_visitor_operation/tie_si.cpp:101
+
+template <class T> ACE_INLINE
+char * POA_CORBA::OperationDef_tie<T>::absolute_name (
+ ACE_ENV_SINGLE_ARG_DECL
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ))
+{
+ return this->ptr_->absolute_name (
+ ACE_ENV_SINGLE_ARG_PARAMETER
+ );
+}
+
+// TAO_IDL - Generated from
+// be\be_visitor_operation/tie_si.cpp:101
+
+template <class T> ACE_INLINE
+::CORBA::Repository_ptr POA_CORBA::OperationDef_tie<T>::containing_repository (
+ ACE_ENV_SINGLE_ARG_DECL
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ))
+{
+ return this->ptr_->containing_repository (
+ ACE_ENV_SINGLE_ARG_PARAMETER
+ );
+}
+
+// TAO_IDL - Generated from
+// be\be_visitor_operation/tie_si.cpp:101
+
+template <class T> ACE_INLINE
+::CORBA::Contained::Description * POA_CORBA::OperationDef_tie<T>::describe (
+ ACE_ENV_SINGLE_ARG_DECL
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ))
+{
+ return this->ptr_->describe (
+ ACE_ENV_SINGLE_ARG_PARAMETER
+ );
+}
+
+// TAO_IDL - Generated from
+// be\be_visitor_operation/tie_si.cpp:101
+
+template <class T> ACE_INLINE
+void POA_CORBA::OperationDef_tie<T>::move (
+ ::CORBA::Container_ptr new_container,
+ const char * new_name,
+ const char * new_version
+ ACE_ENV_ARG_DECL
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ))
+{
+ this->ptr_->move (
+ new_container,
+ new_name,
+ new_version
+ ACE_ENV_ARG_PARAMETER
+ );
+}
+
+// TAO_IDL - Generated from
+// be\be_visitor_operation/tie_si.cpp:101
+
+template <class T> ACE_INLINE
+::CORBA::TypeCode_ptr POA_CORBA::OperationDef_tie<T>::result (
+ ACE_ENV_SINGLE_ARG_DECL
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ))
+{
+ return this->ptr_->result (
+ ACE_ENV_SINGLE_ARG_PARAMETER
+ );
+}
+
+// TAO_IDL - Generated from
+// be\be_visitor_operation/tie_si.cpp:101
+
+template <class T> ACE_INLINE
+::CORBA::IDLType_ptr POA_CORBA::OperationDef_tie<T>::result_def (
+ ACE_ENV_SINGLE_ARG_DECL
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ))
+{
+ return this->ptr_->result_def (
+ ACE_ENV_SINGLE_ARG_PARAMETER
+ );
+}
+
+// TAO_IDL - Generated from
+// be\be_visitor_operation/tie_si.cpp:101
+
+template <class T> ACE_INLINE
+void POA_CORBA::OperationDef_tie<T>::result_def (
+ ::CORBA::IDLType_ptr result_def
+ ACE_ENV_ARG_DECL
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ))
+{
+ this->ptr_->result_def (
+ result_def
+ ACE_ENV_ARG_PARAMETER
+ );
+}
+
+// TAO_IDL - Generated from
+// be\be_visitor_operation/tie_si.cpp:101
+
+template <class T> ACE_INLINE
+::CORBA::ParDescriptionSeq * POA_CORBA::OperationDef_tie<T>::params (
+ ACE_ENV_SINGLE_ARG_DECL
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ))
+{
+ return this->ptr_->params (
+ ACE_ENV_SINGLE_ARG_PARAMETER
+ );
+}
+
+// TAO_IDL - Generated from
+// be\be_visitor_operation/tie_si.cpp:101
+
+template <class T> ACE_INLINE
+void POA_CORBA::OperationDef_tie<T>::params (
+ const ::CORBA::ParDescriptionSeq & params
+ ACE_ENV_ARG_DECL
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ))
+{
+ this->ptr_->params (
+ params
+ ACE_ENV_ARG_PARAMETER
+ );
+}
+
+// TAO_IDL - Generated from
+// be\be_visitor_operation/tie_si.cpp:101
+
+template <class T> ACE_INLINE
+::CORBA::OperationMode POA_CORBA::OperationDef_tie<T>::mode (
+ ACE_ENV_SINGLE_ARG_DECL
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ))
+{
+ return this->ptr_->mode (
+ ACE_ENV_SINGLE_ARG_PARAMETER
+ );
+}
+
+// TAO_IDL - Generated from
+// be\be_visitor_operation/tie_si.cpp:101
+
+template <class T> ACE_INLINE
+void POA_CORBA::OperationDef_tie<T>::mode (
+ ::CORBA::OperationMode mode
+ ACE_ENV_ARG_DECL
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ))
+{
+ this->ptr_->mode (
+ mode
+ ACE_ENV_ARG_PARAMETER
+ );
+}
+
+// TAO_IDL - Generated from
+// be\be_visitor_operation/tie_si.cpp:101
+
+template <class T> ACE_INLINE
+::CORBA::ContextIdSeq * POA_CORBA::OperationDef_tie<T>::contexts (
+ ACE_ENV_SINGLE_ARG_DECL
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ))
+{
+ return this->ptr_->contexts (
+ ACE_ENV_SINGLE_ARG_PARAMETER
+ );
+}
+
+// TAO_IDL - Generated from
+// be\be_visitor_operation/tie_si.cpp:101
+
+template <class T> ACE_INLINE
+void POA_CORBA::OperationDef_tie<T>::contexts (
+ const ::CORBA::ContextIdSeq & contexts
+ ACE_ENV_ARG_DECL
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ))
+{
+ this->ptr_->contexts (
+ contexts
+ ACE_ENV_ARG_PARAMETER
+ );
+}
+
+// TAO_IDL - Generated from
+// be\be_visitor_operation/tie_si.cpp:101
+
+template <class T> ACE_INLINE
+::CORBA::ExceptionDefSeq * POA_CORBA::OperationDef_tie<T>::exceptions (
+ ACE_ENV_SINGLE_ARG_DECL
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ))
+{
+ return this->ptr_->exceptions (
+ ACE_ENV_SINGLE_ARG_PARAMETER
+ );
+}
+
+// TAO_IDL - Generated from
+// be\be_visitor_operation/tie_si.cpp:101
+
+template <class T> ACE_INLINE
+void POA_CORBA::OperationDef_tie<T>::exceptions (
+ const ::CORBA::ExceptionDefSeq & exceptions
+ ACE_ENV_ARG_DECL
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ))
+{
+ this->ptr_->exceptions (
+ exceptions
+ ACE_ENV_ARG_PARAMETER
+ );
+}
+
+// TAO_IDL - Generated from
+// be\be_visitor_interface/tie_si.cpp:96
+
+template <class T> ACE_INLINE
+POA_CORBA::InterfaceDef_tie<T>::InterfaceDef_tie (T &t)
+ : ptr_ (&t),
+ poa_ (PortableServer::POA::_nil ()),
+ rel_ (0)
+{}
+
+template <class T> ACE_INLINE
+POA_CORBA::InterfaceDef_tie<T>::InterfaceDef_tie (T &t, PortableServer::POA_ptr poa)
+ : ptr_ (&t),
+ poa_ (PortableServer::POA::_duplicate (poa)),
+ rel_ (0)
+{}
+
+template <class T> ACE_INLINE
+POA_CORBA::InterfaceDef_tie<T>::InterfaceDef_tie (T *tp, ::CORBA::Boolean release)
+ : ptr_ (tp),
+ poa_ (PortableServer::POA::_nil ()),
+ rel_ (release)
+{}
+
+template <class T> ACE_INLINE
+POA_CORBA::InterfaceDef_tie<T>::InterfaceDef_tie (T *tp, PortableServer::POA_ptr poa, ::CORBA::Boolean release)
+ : ptr_ (tp),
+ poa_ (PortableServer::POA::_duplicate (poa)),
+ rel_ (release)
+{}
+
+template <class T> ACE_INLINE
+POA_CORBA::InterfaceDef_tie<T>::~InterfaceDef_tie (void)
+{
+ if (this->rel_)
+ {
+ delete this->ptr_;
+ }
+}
+
+template <class T> ACE_INLINE T *
+POA_CORBA::InterfaceDef_tie<T>::_tied_object (void)
+{
+ return this->ptr_;
+}
+
+template <class T> ACE_INLINE void
+POA_CORBA::InterfaceDef_tie<T>::_tied_object (T &obj)
+{
+ if (this->rel_)
+ {
+ delete this->ptr_;
+ }
+
+ this->ptr_ = &obj;
+ this->rel_ = 0;
+}
+
+template <class T> ACE_INLINE void
+POA_CORBA::InterfaceDef_tie<T>::_tied_object (T *obj, ::CORBA::Boolean release)
+{
+ if (this->rel_)
+ {
+ delete this->ptr_;
+ }
+
+ this->ptr_ = obj;
+ this->rel_ = release;
+}
+
+template <class T> ACE_INLINE ::CORBA::Boolean
+POA_CORBA::InterfaceDef_tie<T>::_is_owner (void)
+{
+ return this->rel_;
+}
+
+template <class T> ACE_INLINE void
+POA_CORBA::InterfaceDef_tie<T>::_is_owner ( ::CORBA::Boolean b)
+{
+ this->rel_ = b;
+}
+
+template <class T> ACE_INLINE PortableServer::POA_ptr
+POA_CORBA::InterfaceDef_tie<T>::_default_POA (ACE_ENV_SINGLE_ARG_DECL)
+{
+ if (! ::CORBA::is_nil (this->poa_.in ()))
+ {
+ return PortableServer::POA::_duplicate (this->poa_.in ());
+ }
+
+ return this->InterfaceDef::_default_POA (ACE_ENV_SINGLE_ARG_PARAMETER);
+}
+
+// TAO_IDL - Generated from
+// be\be_visitor_operation/tie_si.cpp:101
+
+template <class T> ACE_INLINE
+::CORBA::DefinitionKind POA_CORBA::InterfaceDef_tie<T>::def_kind (
+ ACE_ENV_SINGLE_ARG_DECL
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ))
+{
+ return this->ptr_->def_kind (
+ ACE_ENV_SINGLE_ARG_PARAMETER
+ );
+}
+
+// TAO_IDL - Generated from
+// be\be_visitor_operation/tie_si.cpp:101
+
+template <class T> ACE_INLINE
+void POA_CORBA::InterfaceDef_tie<T>::destroy (
+ ACE_ENV_SINGLE_ARG_DECL
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ))
+{
+ this->ptr_->destroy (
+ ACE_ENV_SINGLE_ARG_PARAMETER
+ );
+}
+
+// TAO_IDL - Generated from
+// be\be_visitor_operation/tie_si.cpp:101
+
+template <class T> ACE_INLINE
+::CORBA::Contained_ptr POA_CORBA::InterfaceDef_tie<T>::lookup (
+ const char * search_name
+ ACE_ENV_ARG_DECL
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ))
+{
+ return this->ptr_->lookup (
+ search_name
+ ACE_ENV_ARG_PARAMETER
+ );
+}
+
+// TAO_IDL - Generated from
+// be\be_visitor_operation/tie_si.cpp:101
+
+template <class T> ACE_INLINE
+::CORBA::ContainedSeq * POA_CORBA::InterfaceDef_tie<T>::contents (
+ ::CORBA::DefinitionKind limit_type,
+ ::CORBA::Boolean exclude_inherited
+ ACE_ENV_ARG_DECL
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ))
+{
+ return this->ptr_->contents (
+ limit_type,
+ exclude_inherited
+ ACE_ENV_ARG_PARAMETER
+ );
+}
+
+// TAO_IDL - Generated from
+// be\be_visitor_operation/tie_si.cpp:101
+
+template <class T> ACE_INLINE
+::CORBA::ContainedSeq * POA_CORBA::InterfaceDef_tie<T>::lookup_name (
+ const char * search_name,
+ ::CORBA::Long levels_to_search,
+ ::CORBA::DefinitionKind limit_type,
+ ::CORBA::Boolean exclude_inherited
+ ACE_ENV_ARG_DECL
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ))
+{
+ return this->ptr_->lookup_name (
+ search_name,
+ levels_to_search,
+ limit_type,
+ exclude_inherited
+ ACE_ENV_ARG_PARAMETER
+ );
+}
+
+// TAO_IDL - Generated from
+// be\be_visitor_operation/tie_si.cpp:101
+
+template <class T> ACE_INLINE
+::CORBA::Container::DescriptionSeq * POA_CORBA::InterfaceDef_tie<T>::describe_contents (
+ ::CORBA::DefinitionKind limit_type,
+ ::CORBA::Boolean exclude_inherited,
+ ::CORBA::Long max_returned_objs
+ ACE_ENV_ARG_DECL
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ))
+{
+ return this->ptr_->describe_contents (
+ limit_type,
+ exclude_inherited,
+ max_returned_objs
+ ACE_ENV_ARG_PARAMETER
+ );
+}
+
+// TAO_IDL - Generated from
+// be\be_visitor_operation/tie_si.cpp:101
+
+template <class T> ACE_INLINE
+::CORBA::ModuleDef_ptr POA_CORBA::InterfaceDef_tie<T>::create_module (
+ const char * id,
+ const char * name,
+ const char * version
+ ACE_ENV_ARG_DECL
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ))
+{
+ return this->ptr_->create_module (
+ id,
+ name,
+ version
+ ACE_ENV_ARG_PARAMETER
+ );
+}
+
+// TAO_IDL - Generated from
+// be\be_visitor_operation/tie_si.cpp:101
+
+template <class T> ACE_INLINE
+::CORBA::ConstantDef_ptr POA_CORBA::InterfaceDef_tie<T>::create_constant (
+ const char * id,
+ const char * name,
+ const char * version,
+ ::CORBA::IDLType_ptr type,
+ const ::CORBA::Any & value
+ ACE_ENV_ARG_DECL
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ))
+{
+ return this->ptr_->create_constant (
+ id,
+ name,
+ version,
+ type,
+ value
+ ACE_ENV_ARG_PARAMETER
+ );
+}
+
+// TAO_IDL - Generated from
+// be\be_visitor_operation/tie_si.cpp:101
+
+template <class T> ACE_INLINE
+::CORBA::StructDef_ptr POA_CORBA::InterfaceDef_tie<T>::create_struct (
+ const char * id,
+ const char * name,
+ const char * version,
+ const ::CORBA::StructMemberSeq & members
+ ACE_ENV_ARG_DECL
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ))
+{
+ return this->ptr_->create_struct (
+ id,
+ name,
+ version,
+ members
+ ACE_ENV_ARG_PARAMETER
+ );
+}
+
+// TAO_IDL - Generated from
+// be\be_visitor_operation/tie_si.cpp:101
+
+template <class T> ACE_INLINE
+::CORBA::UnionDef_ptr POA_CORBA::InterfaceDef_tie<T>::create_union (
+ const char * id,
+ const char * name,
+ const char * version,
+ ::CORBA::IDLType_ptr discriminator_type,
+ const ::CORBA::UnionMemberSeq & members
+ ACE_ENV_ARG_DECL
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ))
+{
+ return this->ptr_->create_union (
+ id,
+ name,
+ version,
+ discriminator_type,
+ members
+ ACE_ENV_ARG_PARAMETER
+ );
+}
+
+// TAO_IDL - Generated from
+// be\be_visitor_operation/tie_si.cpp:101
+
+template <class T> ACE_INLINE
+::CORBA::EnumDef_ptr POA_CORBA::InterfaceDef_tie<T>::create_enum (
+ const char * id,
+ const char * name,
+ const char * version,
+ const ::CORBA::EnumMemberSeq & members
+ ACE_ENV_ARG_DECL
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ))
+{
+ return this->ptr_->create_enum (
+ id,
+ name,
+ version,
+ members
+ ACE_ENV_ARG_PARAMETER
+ );
+}
+
+// TAO_IDL - Generated from
+// be\be_visitor_operation/tie_si.cpp:101
+
+template <class T> ACE_INLINE
+::CORBA::AliasDef_ptr POA_CORBA::InterfaceDef_tie<T>::create_alias (
+ const char * id,
+ const char * name,
+ const char * version,
+ ::CORBA::IDLType_ptr original_type
+ ACE_ENV_ARG_DECL
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ))
+{
+ return this->ptr_->create_alias (
+ id,
+ name,
+ version,
+ original_type
+ ACE_ENV_ARG_PARAMETER
+ );
+}
+
+// TAO_IDL - Generated from
+// be\be_visitor_operation/tie_si.cpp:101
+
+template <class T> ACE_INLINE
+::CORBA::InterfaceDef_ptr POA_CORBA::InterfaceDef_tie<T>::create_interface (
+ const char * id,
+ const char * name,
+ const char * version,
+ const ::CORBA::InterfaceDefSeq & base_interfaces
+ ACE_ENV_ARG_DECL
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ))
+{
+ return this->ptr_->create_interface (
+ id,
+ name,
+ version,
+ base_interfaces
+ ACE_ENV_ARG_PARAMETER
+ );
+}
+
+// TAO_IDL - Generated from
+// be\be_visitor_operation/tie_si.cpp:101
+
+template <class T> ACE_INLINE
+::CORBA::ValueDef_ptr POA_CORBA::InterfaceDef_tie<T>::create_value (
+ const char * id,
+ const char * name,
+ const char * version,
+ ::CORBA::Boolean is_custom,
+ ::CORBA::Boolean is_abstract,
+ ::CORBA::ValueDef_ptr base_value,
+ ::CORBA::Boolean is_truncatable,
+ const ::CORBA::ValueDefSeq & abstract_base_values,
+ const ::CORBA::InterfaceDefSeq & supported_interfaces,
+ const ::CORBA::InitializerSeq & initializers
+ ACE_ENV_ARG_DECL
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ))
+{
+ return this->ptr_->create_value (
+ id,
+ name,
+ version,
+ is_custom,
+ is_abstract,
+ base_value,
+ is_truncatable,
+ abstract_base_values,
+ supported_interfaces,
+ initializers
+ ACE_ENV_ARG_PARAMETER
+ );
+}
+
+// TAO_IDL - Generated from
+// be\be_visitor_operation/tie_si.cpp:101
+
+template <class T> ACE_INLINE
+::CORBA::ValueBoxDef_ptr POA_CORBA::InterfaceDef_tie<T>::create_value_box (
+ const char * id,
+ const char * name,
+ const char * version,
+ ::CORBA::IDLType_ptr original_type_def
+ ACE_ENV_ARG_DECL
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ))
+{
+ return this->ptr_->create_value_box (
+ id,
+ name,
+ version,
+ original_type_def
+ ACE_ENV_ARG_PARAMETER
+ );
+}
+
+// TAO_IDL - Generated from
+// be\be_visitor_operation/tie_si.cpp:101
+
+template <class T> ACE_INLINE
+::CORBA::ExceptionDef_ptr POA_CORBA::InterfaceDef_tie<T>::create_exception (
+ const char * id,
+ const char * name,
+ const char * version,
+ const ::CORBA::StructMemberSeq & members
+ ACE_ENV_ARG_DECL
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ))
+{
+ return this->ptr_->create_exception (
+ id,
+ name,
+ version,
+ members
+ ACE_ENV_ARG_PARAMETER
+ );
+}
+
+// TAO_IDL - Generated from
+// be\be_visitor_operation/tie_si.cpp:101
+
+template <class T> ACE_INLINE
+::CORBA::NativeDef_ptr POA_CORBA::InterfaceDef_tie<T>::create_native (
+ const char * id,
+ const char * name,
+ const char * version
+ ACE_ENV_ARG_DECL
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ))
+{
+ return this->ptr_->create_native (
+ id,
+ name,
+ version
+ ACE_ENV_ARG_PARAMETER
+ );
+}
+
+// TAO_IDL - Generated from
+// be\be_visitor_operation/tie_si.cpp:101
+
+template <class T> ACE_INLINE
+::CORBA::AbstractInterfaceDef_ptr POA_CORBA::InterfaceDef_tie<T>::create_abstract_interface (
+ const char * id,
+ const char * name,
+ const char * version,
+ const ::CORBA::AbstractInterfaceDefSeq & base_interfaces
+ ACE_ENV_ARG_DECL
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ))
+{
+ return this->ptr_->create_abstract_interface (
+ id,
+ name,
+ version,
+ base_interfaces
+ ACE_ENV_ARG_PARAMETER
+ );
+}
+
+// TAO_IDL - Generated from
+// be\be_visitor_operation/tie_si.cpp:101
+
+template <class T> ACE_INLINE
+::CORBA::LocalInterfaceDef_ptr POA_CORBA::InterfaceDef_tie<T>::create_local_interface (
+ const char * id,
+ const char * name,
+ const char * version,
+ const ::CORBA::InterfaceDefSeq & base_interfaces
+ ACE_ENV_ARG_DECL
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ))
+{
+ return this->ptr_->create_local_interface (
+ id,
+ name,
+ version,
+ base_interfaces
+ ACE_ENV_ARG_PARAMETER
+ );
+}
+
+// TAO_IDL - Generated from
+// be\be_visitor_operation/tie_si.cpp:101
+
+template <class T> ACE_INLINE
+::CORBA::ExtValueDef_ptr POA_CORBA::InterfaceDef_tie<T>::create_ext_value (
+ const char * id,
+ const char * name,
+ const char * version,
+ ::CORBA::Boolean is_custom,
+ ::CORBA::Boolean is_abstract,
+ ::CORBA::ValueDef_ptr base_value,
+ ::CORBA::Boolean is_truncatable,
+ const ::CORBA::ValueDefSeq & abstract_base_values,
+ const ::CORBA::InterfaceDefSeq & supported_interfaces,
+ const ::CORBA::ExtInitializerSeq & initializers
+ ACE_ENV_ARG_DECL
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ))
+{
+ return this->ptr_->create_ext_value (
+ id,
+ name,
+ version,
+ is_custom,
+ is_abstract,
+ base_value,
+ is_truncatable,
+ abstract_base_values,
+ supported_interfaces,
+ initializers
+ ACE_ENV_ARG_PARAMETER
+ );
+}
+
+// TAO_IDL - Generated from
+// be\be_visitor_operation/tie_si.cpp:101
+
+template <class T> ACE_INLINE
+char * POA_CORBA::InterfaceDef_tie<T>::id (
+ ACE_ENV_SINGLE_ARG_DECL
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ))
+{
+ return this->ptr_->id (
+ ACE_ENV_SINGLE_ARG_PARAMETER
+ );
+}
+
+// TAO_IDL - Generated from
+// be\be_visitor_operation/tie_si.cpp:101
+
+template <class T> ACE_INLINE
+void POA_CORBA::InterfaceDef_tie<T>::id (
+ const char * id
+ ACE_ENV_ARG_DECL
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ))
+{
+ this->ptr_->id (
+ id
+ ACE_ENV_ARG_PARAMETER
+ );
+}
+
+// TAO_IDL - Generated from
+// be\be_visitor_operation/tie_si.cpp:101
+
+template <class T> ACE_INLINE
+char * POA_CORBA::InterfaceDef_tie<T>::name (
+ ACE_ENV_SINGLE_ARG_DECL
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ))
+{
+ return this->ptr_->name (
+ ACE_ENV_SINGLE_ARG_PARAMETER
+ );
+}
+
+// TAO_IDL - Generated from
+// be\be_visitor_operation/tie_si.cpp:101
+
+template <class T> ACE_INLINE
+void POA_CORBA::InterfaceDef_tie<T>::name (
+ const char * name
+ ACE_ENV_ARG_DECL
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ))
+{
+ this->ptr_->name (
+ name
+ ACE_ENV_ARG_PARAMETER
+ );
+}
+
+// TAO_IDL - Generated from
+// be\be_visitor_operation/tie_si.cpp:101
+
+template <class T> ACE_INLINE
+char * POA_CORBA::InterfaceDef_tie<T>::version (
+ ACE_ENV_SINGLE_ARG_DECL
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ))
+{
+ return this->ptr_->version (
+ ACE_ENV_SINGLE_ARG_PARAMETER
+ );
+}
+
+// TAO_IDL - Generated from
+// be\be_visitor_operation/tie_si.cpp:101
+
+template <class T> ACE_INLINE
+void POA_CORBA::InterfaceDef_tie<T>::version (
+ const char * version
+ ACE_ENV_ARG_DECL
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ))
+{
+ this->ptr_->version (
+ version
+ ACE_ENV_ARG_PARAMETER
+ );
+}
+
+// TAO_IDL - Generated from
+// be\be_visitor_operation/tie_si.cpp:101
+
+template <class T> ACE_INLINE
+::CORBA::Container_ptr POA_CORBA::InterfaceDef_tie<T>::defined_in (
+ ACE_ENV_SINGLE_ARG_DECL
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ))
+{
+ return this->ptr_->defined_in (
+ ACE_ENV_SINGLE_ARG_PARAMETER
+ );
+}
+
+// TAO_IDL - Generated from
+// be\be_visitor_operation/tie_si.cpp:101
+
+template <class T> ACE_INLINE
+char * POA_CORBA::InterfaceDef_tie<T>::absolute_name (
+ ACE_ENV_SINGLE_ARG_DECL
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ))
+{
+ return this->ptr_->absolute_name (
+ ACE_ENV_SINGLE_ARG_PARAMETER
+ );
+}
+
+// TAO_IDL - Generated from
+// be\be_visitor_operation/tie_si.cpp:101
+
+template <class T> ACE_INLINE
+::CORBA::Repository_ptr POA_CORBA::InterfaceDef_tie<T>::containing_repository (
+ ACE_ENV_SINGLE_ARG_DECL
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ))
+{
+ return this->ptr_->containing_repository (
+ ACE_ENV_SINGLE_ARG_PARAMETER
+ );
+}
+
+// TAO_IDL - Generated from
+// be\be_visitor_operation/tie_si.cpp:101
+
+template <class T> ACE_INLINE
+::CORBA::Contained::Description * POA_CORBA::InterfaceDef_tie<T>::describe (
+ ACE_ENV_SINGLE_ARG_DECL
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ))
+{
+ return this->ptr_->describe (
+ ACE_ENV_SINGLE_ARG_PARAMETER
+ );
+}
+
+// TAO_IDL - Generated from
+// be\be_visitor_operation/tie_si.cpp:101
+
+template <class T> ACE_INLINE
+void POA_CORBA::InterfaceDef_tie<T>::move (
+ ::CORBA::Container_ptr new_container,
+ const char * new_name,
+ const char * new_version
+ ACE_ENV_ARG_DECL
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ))
+{
+ this->ptr_->move (
+ new_container,
+ new_name,
+ new_version
+ ACE_ENV_ARG_PARAMETER
+ );
+}
+
+// TAO_IDL - Generated from
+// be\be_visitor_operation/tie_si.cpp:101
+
+template <class T> ACE_INLINE
+::CORBA::TypeCode_ptr POA_CORBA::InterfaceDef_tie<T>::type (
+ ACE_ENV_SINGLE_ARG_DECL
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ))
+{
+ return this->ptr_->type (
+ ACE_ENV_SINGLE_ARG_PARAMETER
+ );
+}
+
+// TAO_IDL - Generated from
+// be\be_visitor_operation/tie_si.cpp:101
+
+template <class T> ACE_INLINE
+::CORBA::InterfaceDefSeq * POA_CORBA::InterfaceDef_tie<T>::base_interfaces (
+ ACE_ENV_SINGLE_ARG_DECL
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ))
+{
+ return this->ptr_->base_interfaces (
+ ACE_ENV_SINGLE_ARG_PARAMETER
+ );
+}
+
+// TAO_IDL - Generated from
+// be\be_visitor_operation/tie_si.cpp:101
+
+template <class T> ACE_INLINE
+void POA_CORBA::InterfaceDef_tie<T>::base_interfaces (
+ const ::CORBA::InterfaceDefSeq & base_interfaces
+ ACE_ENV_ARG_DECL
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ))
+{
+ this->ptr_->base_interfaces (
+ base_interfaces
+ ACE_ENV_ARG_PARAMETER
+ );
+}
+
+// TAO_IDL - Generated from
+// be\be_visitor_operation/tie_si.cpp:101
+
+template <class T> ACE_INLINE
+::CORBA::Boolean POA_CORBA::InterfaceDef_tie<T>::is_a (
+ const char * interface_id
+ ACE_ENV_ARG_DECL
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ))
+{
+ return this->ptr_->is_a (
+ interface_id
+ ACE_ENV_ARG_PARAMETER
+ );
+}
+
+// TAO_IDL - Generated from
+// be\be_visitor_operation/tie_si.cpp:101
+
+template <class T> ACE_INLINE
+::CORBA::InterfaceDef::FullInterfaceDescription * POA_CORBA::InterfaceDef_tie<T>::describe_interface (
+ ACE_ENV_SINGLE_ARG_DECL
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ))
+{
+ return this->ptr_->describe_interface (
+ ACE_ENV_SINGLE_ARG_PARAMETER
+ );
+}
+
+// TAO_IDL - Generated from
+// be\be_visitor_operation/tie_si.cpp:101
+
+template <class T> ACE_INLINE
+::CORBA::AttributeDef_ptr POA_CORBA::InterfaceDef_tie<T>::create_attribute (
+ const char * id,
+ const char * name,
+ const char * version,
+ ::CORBA::IDLType_ptr type,
+ ::CORBA::AttributeMode mode
+ ACE_ENV_ARG_DECL
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ))
+{
+ return this->ptr_->create_attribute (
+ id,
+ name,
+ version,
+ type,
+ mode
+ ACE_ENV_ARG_PARAMETER
+ );
+}
+
+// TAO_IDL - Generated from
+// be\be_visitor_operation/tie_si.cpp:101
+
+template <class T> ACE_INLINE
+::CORBA::OperationDef_ptr POA_CORBA::InterfaceDef_tie<T>::create_operation (
+ const char * id,
+ const char * name,
+ const char * version,
+ ::CORBA::IDLType_ptr result,
+ ::CORBA::OperationMode mode,
+ const ::CORBA::ParDescriptionSeq & params,
+ const ::CORBA::ExceptionDefSeq & exceptions,
+ const ::CORBA::ContextIdSeq & contexts
+ ACE_ENV_ARG_DECL
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ))
+{
+ return this->ptr_->create_operation (
+ id,
+ name,
+ version,
+ result,
+ mode,
+ params,
+ exceptions,
+ contexts
+ ACE_ENV_ARG_PARAMETER
+ );
+}
+
+// TAO_IDL - Generated from
+// be\be_visitor_interface/tie_si.cpp:96
+
+template <class T> ACE_INLINE
+POA_CORBA::InterfaceAttrExtension_tie<T>::InterfaceAttrExtension_tie (T &t)
+ : ptr_ (&t),
+ poa_ (PortableServer::POA::_nil ()),
+ rel_ (0)
+{}
+
+template <class T> ACE_INLINE
+POA_CORBA::InterfaceAttrExtension_tie<T>::InterfaceAttrExtension_tie (T &t, PortableServer::POA_ptr poa)
+ : ptr_ (&t),
+ poa_ (PortableServer::POA::_duplicate (poa)),
+ rel_ (0)
+{}
+
+template <class T> ACE_INLINE
+POA_CORBA::InterfaceAttrExtension_tie<T>::InterfaceAttrExtension_tie (T *tp, ::CORBA::Boolean release)
+ : ptr_ (tp),
+ poa_ (PortableServer::POA::_nil ()),
+ rel_ (release)
+{}
+
+template <class T> ACE_INLINE
+POA_CORBA::InterfaceAttrExtension_tie<T>::InterfaceAttrExtension_tie (T *tp, PortableServer::POA_ptr poa, ::CORBA::Boolean release)
+ : ptr_ (tp),
+ poa_ (PortableServer::POA::_duplicate (poa)),
+ rel_ (release)
+{}
+
+template <class T> ACE_INLINE
+POA_CORBA::InterfaceAttrExtension_tie<T>::~InterfaceAttrExtension_tie (void)
+{
+ if (this->rel_)
+ {
+ delete this->ptr_;
+ }
+}
+
+template <class T> ACE_INLINE T *
+POA_CORBA::InterfaceAttrExtension_tie<T>::_tied_object (void)
+{
+ return this->ptr_;
+}
+
+template <class T> ACE_INLINE void
+POA_CORBA::InterfaceAttrExtension_tie<T>::_tied_object (T &obj)
+{
+ if (this->rel_)
+ {
+ delete this->ptr_;
+ }
+
+ this->ptr_ = &obj;
+ this->rel_ = 0;
+}
+
+template <class T> ACE_INLINE void
+POA_CORBA::InterfaceAttrExtension_tie<T>::_tied_object (T *obj, ::CORBA::Boolean release)
+{
+ if (this->rel_)
+ {
+ delete this->ptr_;
+ }
+
+ this->ptr_ = obj;
+ this->rel_ = release;
+}
+
+template <class T> ACE_INLINE ::CORBA::Boolean
+POA_CORBA::InterfaceAttrExtension_tie<T>::_is_owner (void)
+{
+ return this->rel_;
+}
+
+template <class T> ACE_INLINE void
+POA_CORBA::InterfaceAttrExtension_tie<T>::_is_owner ( ::CORBA::Boolean b)
+{
+ this->rel_ = b;
+}
+
+template <class T> ACE_INLINE PortableServer::POA_ptr
+POA_CORBA::InterfaceAttrExtension_tie<T>::_default_POA (ACE_ENV_SINGLE_ARG_DECL)
+{
+ if (! ::CORBA::is_nil (this->poa_.in ()))
+ {
+ return PortableServer::POA::_duplicate (this->poa_.in ());
+ }
+
+ return this->InterfaceAttrExtension::_default_POA (ACE_ENV_SINGLE_ARG_PARAMETER);
+}
+
+// TAO_IDL - Generated from
+// be\be_visitor_operation/tie_si.cpp:101
+
+template <class T> ACE_INLINE
+::CORBA::InterfaceAttrExtension::ExtFullInterfaceDescription * POA_CORBA::InterfaceAttrExtension_tie<T>::describe_ext_interface (
+ ACE_ENV_SINGLE_ARG_DECL
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ))
+{
+ return this->ptr_->describe_ext_interface (
+ ACE_ENV_SINGLE_ARG_PARAMETER
+ );
+}
+
+// TAO_IDL - Generated from
+// be\be_visitor_operation/tie_si.cpp:101
+
+template <class T> ACE_INLINE
+::CORBA::ExtAttributeDef_ptr POA_CORBA::InterfaceAttrExtension_tie<T>::create_ext_attribute (
+ const char * id,
+ const char * name,
+ const char * version,
+ ::CORBA::IDLType_ptr type,
+ ::CORBA::AttributeMode mode,
+ const ::CORBA::ExceptionDefSeq & get_exceptions,
+ const ::CORBA::ExceptionDefSeq & set_exceptions
+ ACE_ENV_ARG_DECL
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ))
+{
+ return this->ptr_->create_ext_attribute (
+ id,
+ name,
+ version,
+ type,
+ mode,
+ get_exceptions,
+ set_exceptions
+ ACE_ENV_ARG_PARAMETER
+ );
+}
+
+// TAO_IDL - Generated from
+// be\be_visitor_interface/tie_si.cpp:96
+
+template <class T> ACE_INLINE
+POA_CORBA::ExtInterfaceDef_tie<T>::ExtInterfaceDef_tie (T &t)
+ : ptr_ (&t),
+ poa_ (PortableServer::POA::_nil ()),
+ rel_ (0)
+{}
+
+template <class T> ACE_INLINE
+POA_CORBA::ExtInterfaceDef_tie<T>::ExtInterfaceDef_tie (T &t, PortableServer::POA_ptr poa)
+ : ptr_ (&t),
+ poa_ (PortableServer::POA::_duplicate (poa)),
+ rel_ (0)
+{}
+
+template <class T> ACE_INLINE
+POA_CORBA::ExtInterfaceDef_tie<T>::ExtInterfaceDef_tie (T *tp, ::CORBA::Boolean release)
+ : ptr_ (tp),
+ poa_ (PortableServer::POA::_nil ()),
+ rel_ (release)
+{}
+
+template <class T> ACE_INLINE
+POA_CORBA::ExtInterfaceDef_tie<T>::ExtInterfaceDef_tie (T *tp, PortableServer::POA_ptr poa, ::CORBA::Boolean release)
+ : ptr_ (tp),
+ poa_ (PortableServer::POA::_duplicate (poa)),
+ rel_ (release)
+{}
+
+template <class T> ACE_INLINE
+POA_CORBA::ExtInterfaceDef_tie<T>::~ExtInterfaceDef_tie (void)
+{
+ if (this->rel_)
+ {
+ delete this->ptr_;
+ }
+}
+
+template <class T> ACE_INLINE T *
+POA_CORBA::ExtInterfaceDef_tie<T>::_tied_object (void)
+{
+ return this->ptr_;
+}
+
+template <class T> ACE_INLINE void
+POA_CORBA::ExtInterfaceDef_tie<T>::_tied_object (T &obj)
+{
+ if (this->rel_)
+ {
+ delete this->ptr_;
+ }
+
+ this->ptr_ = &obj;
+ this->rel_ = 0;
+}
+
+template <class T> ACE_INLINE void
+POA_CORBA::ExtInterfaceDef_tie<T>::_tied_object (T *obj, ::CORBA::Boolean release)
+{
+ if (this->rel_)
+ {
+ delete this->ptr_;
+ }
+
+ this->ptr_ = obj;
+ this->rel_ = release;
+}
+
+template <class T> ACE_INLINE ::CORBA::Boolean
+POA_CORBA::ExtInterfaceDef_tie<T>::_is_owner (void)
+{
+ return this->rel_;
+}
+
+template <class T> ACE_INLINE void
+POA_CORBA::ExtInterfaceDef_tie<T>::_is_owner ( ::CORBA::Boolean b)
+{
+ this->rel_ = b;
+}
+
+template <class T> ACE_INLINE PortableServer::POA_ptr
+POA_CORBA::ExtInterfaceDef_tie<T>::_default_POA (ACE_ENV_SINGLE_ARG_DECL)
+{
+ if (! ::CORBA::is_nil (this->poa_.in ()))
+ {
+ return PortableServer::POA::_duplicate (this->poa_.in ());
+ }
+
+ return this->ExtInterfaceDef::_default_POA (ACE_ENV_SINGLE_ARG_PARAMETER);
+}
+
+// TAO_IDL - Generated from
+// be\be_visitor_operation/tie_si.cpp:101
+
+template <class T> ACE_INLINE
+::CORBA::DefinitionKind POA_CORBA::ExtInterfaceDef_tie<T>::def_kind (
+ ACE_ENV_SINGLE_ARG_DECL
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ))
+{
+ return this->ptr_->def_kind (
+ ACE_ENV_SINGLE_ARG_PARAMETER
+ );
+}
+
+// TAO_IDL - Generated from
+// be\be_visitor_operation/tie_si.cpp:101
+
+template <class T> ACE_INLINE
+void POA_CORBA::ExtInterfaceDef_tie<T>::destroy (
+ ACE_ENV_SINGLE_ARG_DECL
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ))
+{
+ this->ptr_->destroy (
+ ACE_ENV_SINGLE_ARG_PARAMETER
+ );
+}
+
+// TAO_IDL - Generated from
+// be\be_visitor_operation/tie_si.cpp:101
+
+template <class T> ACE_INLINE
+::CORBA::Contained_ptr POA_CORBA::ExtInterfaceDef_tie<T>::lookup (
+ const char * search_name
+ ACE_ENV_ARG_DECL
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ))
+{
+ return this->ptr_->lookup (
+ search_name
+ ACE_ENV_ARG_PARAMETER
+ );
+}
+
+// TAO_IDL - Generated from
+// be\be_visitor_operation/tie_si.cpp:101
+
+template <class T> ACE_INLINE
+::CORBA::ContainedSeq * POA_CORBA::ExtInterfaceDef_tie<T>::contents (
+ ::CORBA::DefinitionKind limit_type,
+ ::CORBA::Boolean exclude_inherited
+ ACE_ENV_ARG_DECL
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ))
+{
+ return this->ptr_->contents (
+ limit_type,
+ exclude_inherited
+ ACE_ENV_ARG_PARAMETER
+ );
+}
+
+// TAO_IDL - Generated from
+// be\be_visitor_operation/tie_si.cpp:101
+
+template <class T> ACE_INLINE
+::CORBA::ContainedSeq * POA_CORBA::ExtInterfaceDef_tie<T>::lookup_name (
+ const char * search_name,
+ ::CORBA::Long levels_to_search,
+ ::CORBA::DefinitionKind limit_type,
+ ::CORBA::Boolean exclude_inherited
+ ACE_ENV_ARG_DECL
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ))
+{
+ return this->ptr_->lookup_name (
+ search_name,
+ levels_to_search,
+ limit_type,
+ exclude_inherited
+ ACE_ENV_ARG_PARAMETER
+ );
+}
+
+// TAO_IDL - Generated from
+// be\be_visitor_operation/tie_si.cpp:101
+
+template <class T> ACE_INLINE
+::CORBA::Container::DescriptionSeq * POA_CORBA::ExtInterfaceDef_tie<T>::describe_contents (
+ ::CORBA::DefinitionKind limit_type,
+ ::CORBA::Boolean exclude_inherited,
+ ::CORBA::Long max_returned_objs
+ ACE_ENV_ARG_DECL
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ))
+{
+ return this->ptr_->describe_contents (
+ limit_type,
+ exclude_inherited,
+ max_returned_objs
+ ACE_ENV_ARG_PARAMETER
+ );
+}
+
+// TAO_IDL - Generated from
+// be\be_visitor_operation/tie_si.cpp:101
+
+template <class T> ACE_INLINE
+::CORBA::ModuleDef_ptr POA_CORBA::ExtInterfaceDef_tie<T>::create_module (
+ const char * id,
+ const char * name,
+ const char * version
+ ACE_ENV_ARG_DECL
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ))
+{
+ return this->ptr_->create_module (
+ id,
+ name,
+ version
+ ACE_ENV_ARG_PARAMETER
+ );
+}
+
+// TAO_IDL - Generated from
+// be\be_visitor_operation/tie_si.cpp:101
+
+template <class T> ACE_INLINE
+::CORBA::ConstantDef_ptr POA_CORBA::ExtInterfaceDef_tie<T>::create_constant (
+ const char * id,
+ const char * name,
+ const char * version,
+ ::CORBA::IDLType_ptr type,
+ const ::CORBA::Any & value
+ ACE_ENV_ARG_DECL
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ))
+{
+ return this->ptr_->create_constant (
+ id,
+ name,
+ version,
+ type,
+ value
+ ACE_ENV_ARG_PARAMETER
+ );
+}
+
+// TAO_IDL - Generated from
+// be\be_visitor_operation/tie_si.cpp:101
+
+template <class T> ACE_INLINE
+::CORBA::StructDef_ptr POA_CORBA::ExtInterfaceDef_tie<T>::create_struct (
+ const char * id,
+ const char * name,
+ const char * version,
+ const ::CORBA::StructMemberSeq & members
+ ACE_ENV_ARG_DECL
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ))
+{
+ return this->ptr_->create_struct (
+ id,
+ name,
+ version,
+ members
+ ACE_ENV_ARG_PARAMETER
+ );
+}
+
+// TAO_IDL - Generated from
+// be\be_visitor_operation/tie_si.cpp:101
+
+template <class T> ACE_INLINE
+::CORBA::UnionDef_ptr POA_CORBA::ExtInterfaceDef_tie<T>::create_union (
+ const char * id,
+ const char * name,
+ const char * version,
+ ::CORBA::IDLType_ptr discriminator_type,
+ const ::CORBA::UnionMemberSeq & members
+ ACE_ENV_ARG_DECL
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ))
+{
+ return this->ptr_->create_union (
+ id,
+ name,
+ version,
+ discriminator_type,
+ members
+ ACE_ENV_ARG_PARAMETER
+ );
+}
+
+// TAO_IDL - Generated from
+// be\be_visitor_operation/tie_si.cpp:101
+
+template <class T> ACE_INLINE
+::CORBA::EnumDef_ptr POA_CORBA::ExtInterfaceDef_tie<T>::create_enum (
+ const char * id,
+ const char * name,
+ const char * version,
+ const ::CORBA::EnumMemberSeq & members
+ ACE_ENV_ARG_DECL
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ))
+{
+ return this->ptr_->create_enum (
+ id,
+ name,
+ version,
+ members
+ ACE_ENV_ARG_PARAMETER
+ );
+}
+
+// TAO_IDL - Generated from
+// be\be_visitor_operation/tie_si.cpp:101
+
+template <class T> ACE_INLINE
+::CORBA::AliasDef_ptr POA_CORBA::ExtInterfaceDef_tie<T>::create_alias (
+ const char * id,
+ const char * name,
+ const char * version,
+ ::CORBA::IDLType_ptr original_type
+ ACE_ENV_ARG_DECL
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ))
+{
+ return this->ptr_->create_alias (
+ id,
+ name,
+ version,
+ original_type
+ ACE_ENV_ARG_PARAMETER
+ );
+}
+
+// TAO_IDL - Generated from
+// be\be_visitor_operation/tie_si.cpp:101
+
+template <class T> ACE_INLINE
+::CORBA::InterfaceDef_ptr POA_CORBA::ExtInterfaceDef_tie<T>::create_interface (
+ const char * id,
+ const char * name,
+ const char * version,
+ const ::CORBA::InterfaceDefSeq & base_interfaces
+ ACE_ENV_ARG_DECL
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ))
+{
+ return this->ptr_->create_interface (
+ id,
+ name,
+ version,
+ base_interfaces
+ ACE_ENV_ARG_PARAMETER
+ );
+}
+
+// TAO_IDL - Generated from
+// be\be_visitor_operation/tie_si.cpp:101
+
+template <class T> ACE_INLINE
+::CORBA::ValueDef_ptr POA_CORBA::ExtInterfaceDef_tie<T>::create_value (
+ const char * id,
+ const char * name,
+ const char * version,
+ ::CORBA::Boolean is_custom,
+ ::CORBA::Boolean is_abstract,
+ ::CORBA::ValueDef_ptr base_value,
+ ::CORBA::Boolean is_truncatable,
+ const ::CORBA::ValueDefSeq & abstract_base_values,
+ const ::CORBA::InterfaceDefSeq & supported_interfaces,
+ const ::CORBA::InitializerSeq & initializers
+ ACE_ENV_ARG_DECL
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ))
+{
+ return this->ptr_->create_value (
+ id,
+ name,
+ version,
+ is_custom,
+ is_abstract,
+ base_value,
+ is_truncatable,
+ abstract_base_values,
+ supported_interfaces,
+ initializers
+ ACE_ENV_ARG_PARAMETER
+ );
+}
+
+// TAO_IDL - Generated from
+// be\be_visitor_operation/tie_si.cpp:101
+
+template <class T> ACE_INLINE
+::CORBA::ValueBoxDef_ptr POA_CORBA::ExtInterfaceDef_tie<T>::create_value_box (
+ const char * id,
+ const char * name,
+ const char * version,
+ ::CORBA::IDLType_ptr original_type_def
+ ACE_ENV_ARG_DECL
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ))
+{
+ return this->ptr_->create_value_box (
+ id,
+ name,
+ version,
+ original_type_def
+ ACE_ENV_ARG_PARAMETER
+ );
+}
+
+// TAO_IDL - Generated from
+// be\be_visitor_operation/tie_si.cpp:101
+
+template <class T> ACE_INLINE
+::CORBA::ExceptionDef_ptr POA_CORBA::ExtInterfaceDef_tie<T>::create_exception (
+ const char * id,
+ const char * name,
+ const char * version,
+ const ::CORBA::StructMemberSeq & members
+ ACE_ENV_ARG_DECL
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ))
+{
+ return this->ptr_->create_exception (
+ id,
+ name,
+ version,
+ members
+ ACE_ENV_ARG_PARAMETER
+ );
+}
+
+// TAO_IDL - Generated from
+// be\be_visitor_operation/tie_si.cpp:101
+
+template <class T> ACE_INLINE
+::CORBA::NativeDef_ptr POA_CORBA::ExtInterfaceDef_tie<T>::create_native (
+ const char * id,
+ const char * name,
+ const char * version
+ ACE_ENV_ARG_DECL
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ))
+{
+ return this->ptr_->create_native (
+ id,
+ name,
+ version
+ ACE_ENV_ARG_PARAMETER
+ );
+}
+
+// TAO_IDL - Generated from
+// be\be_visitor_operation/tie_si.cpp:101
+
+template <class T> ACE_INLINE
+::CORBA::AbstractInterfaceDef_ptr POA_CORBA::ExtInterfaceDef_tie<T>::create_abstract_interface (
+ const char * id,
+ const char * name,
+ const char * version,
+ const ::CORBA::AbstractInterfaceDefSeq & base_interfaces
+ ACE_ENV_ARG_DECL
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ))
+{
+ return this->ptr_->create_abstract_interface (
+ id,
+ name,
+ version,
+ base_interfaces
+ ACE_ENV_ARG_PARAMETER
+ );
+}
+
+// TAO_IDL - Generated from
+// be\be_visitor_operation/tie_si.cpp:101
+
+template <class T> ACE_INLINE
+::CORBA::LocalInterfaceDef_ptr POA_CORBA::ExtInterfaceDef_tie<T>::create_local_interface (
+ const char * id,
+ const char * name,
+ const char * version,
+ const ::CORBA::InterfaceDefSeq & base_interfaces
+ ACE_ENV_ARG_DECL
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ))
+{
+ return this->ptr_->create_local_interface (
+ id,
+ name,
+ version,
+ base_interfaces
+ ACE_ENV_ARG_PARAMETER
+ );
+}
+
+// TAO_IDL - Generated from
+// be\be_visitor_operation/tie_si.cpp:101
+
+template <class T> ACE_INLINE
+::CORBA::ExtValueDef_ptr POA_CORBA::ExtInterfaceDef_tie<T>::create_ext_value (
+ const char * id,
+ const char * name,
+ const char * version,
+ ::CORBA::Boolean is_custom,
+ ::CORBA::Boolean is_abstract,
+ ::CORBA::ValueDef_ptr base_value,
+ ::CORBA::Boolean is_truncatable,
+ const ::CORBA::ValueDefSeq & abstract_base_values,
+ const ::CORBA::InterfaceDefSeq & supported_interfaces,
+ const ::CORBA::ExtInitializerSeq & initializers
+ ACE_ENV_ARG_DECL
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ))
+{
+ return this->ptr_->create_ext_value (
+ id,
+ name,
+ version,
+ is_custom,
+ is_abstract,
+ base_value,
+ is_truncatable,
+ abstract_base_values,
+ supported_interfaces,
+ initializers
+ ACE_ENV_ARG_PARAMETER
+ );
+}
+
+// TAO_IDL - Generated from
+// be\be_visitor_operation/tie_si.cpp:101
+
+template <class T> ACE_INLINE
+char * POA_CORBA::ExtInterfaceDef_tie<T>::id (
+ ACE_ENV_SINGLE_ARG_DECL
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ))
+{
+ return this->ptr_->id (
+ ACE_ENV_SINGLE_ARG_PARAMETER
+ );
+}
+
+// TAO_IDL - Generated from
+// be\be_visitor_operation/tie_si.cpp:101
+
+template <class T> ACE_INLINE
+void POA_CORBA::ExtInterfaceDef_tie<T>::id (
+ const char * id
+ ACE_ENV_ARG_DECL
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ))
+{
+ this->ptr_->id (
+ id
+ ACE_ENV_ARG_PARAMETER
+ );
+}
+
+// TAO_IDL - Generated from
+// be\be_visitor_operation/tie_si.cpp:101
+
+template <class T> ACE_INLINE
+char * POA_CORBA::ExtInterfaceDef_tie<T>::name (
+ ACE_ENV_SINGLE_ARG_DECL
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ))
+{
+ return this->ptr_->name (
+ ACE_ENV_SINGLE_ARG_PARAMETER
+ );
+}
+
+// TAO_IDL - Generated from
+// be\be_visitor_operation/tie_si.cpp:101
+
+template <class T> ACE_INLINE
+void POA_CORBA::ExtInterfaceDef_tie<T>::name (
+ const char * name
+ ACE_ENV_ARG_DECL
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ))
+{
+ this->ptr_->name (
+ name
+ ACE_ENV_ARG_PARAMETER
+ );
+}
+
+// TAO_IDL - Generated from
+// be\be_visitor_operation/tie_si.cpp:101
+
+template <class T> ACE_INLINE
+char * POA_CORBA::ExtInterfaceDef_tie<T>::version (
+ ACE_ENV_SINGLE_ARG_DECL
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ))
+{
+ return this->ptr_->version (
+ ACE_ENV_SINGLE_ARG_PARAMETER
+ );
+}
+
+// TAO_IDL - Generated from
+// be\be_visitor_operation/tie_si.cpp:101
+
+template <class T> ACE_INLINE
+void POA_CORBA::ExtInterfaceDef_tie<T>::version (
+ const char * version
+ ACE_ENV_ARG_DECL
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ))
+{
+ this->ptr_->version (
+ version
+ ACE_ENV_ARG_PARAMETER
+ );
+}
+
+// TAO_IDL - Generated from
+// be\be_visitor_operation/tie_si.cpp:101
+
+template <class T> ACE_INLINE
+::CORBA::Container_ptr POA_CORBA::ExtInterfaceDef_tie<T>::defined_in (
+ ACE_ENV_SINGLE_ARG_DECL
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ))
+{
+ return this->ptr_->defined_in (
+ ACE_ENV_SINGLE_ARG_PARAMETER
+ );
+}
+
+// TAO_IDL - Generated from
+// be\be_visitor_operation/tie_si.cpp:101
+
+template <class T> ACE_INLINE
+char * POA_CORBA::ExtInterfaceDef_tie<T>::absolute_name (
+ ACE_ENV_SINGLE_ARG_DECL
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ))
+{
+ return this->ptr_->absolute_name (
+ ACE_ENV_SINGLE_ARG_PARAMETER
+ );
+}
+
+// TAO_IDL - Generated from
+// be\be_visitor_operation/tie_si.cpp:101
+
+template <class T> ACE_INLINE
+::CORBA::Repository_ptr POA_CORBA::ExtInterfaceDef_tie<T>::containing_repository (
+ ACE_ENV_SINGLE_ARG_DECL
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ))
+{
+ return this->ptr_->containing_repository (
+ ACE_ENV_SINGLE_ARG_PARAMETER
+ );
+}
+
+// TAO_IDL - Generated from
+// be\be_visitor_operation/tie_si.cpp:101
+
+template <class T> ACE_INLINE
+::CORBA::Contained::Description * POA_CORBA::ExtInterfaceDef_tie<T>::describe (
+ ACE_ENV_SINGLE_ARG_DECL
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ))
+{
+ return this->ptr_->describe (
+ ACE_ENV_SINGLE_ARG_PARAMETER
+ );
+}
+
+// TAO_IDL - Generated from
+// be\be_visitor_operation/tie_si.cpp:101
+
+template <class T> ACE_INLINE
+void POA_CORBA::ExtInterfaceDef_tie<T>::move (
+ ::CORBA::Container_ptr new_container,
+ const char * new_name,
+ const char * new_version
+ ACE_ENV_ARG_DECL
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ))
+{
+ this->ptr_->move (
+ new_container,
+ new_name,
+ new_version
+ ACE_ENV_ARG_PARAMETER
+ );
+}
+
+// TAO_IDL - Generated from
+// be\be_visitor_operation/tie_si.cpp:101
+
+template <class T> ACE_INLINE
+::CORBA::TypeCode_ptr POA_CORBA::ExtInterfaceDef_tie<T>::type (
+ ACE_ENV_SINGLE_ARG_DECL
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ))
+{
+ return this->ptr_->type (
+ ACE_ENV_SINGLE_ARG_PARAMETER
+ );
+}
+
+// TAO_IDL - Generated from
+// be\be_visitor_operation/tie_si.cpp:101
+
+template <class T> ACE_INLINE
+::CORBA::InterfaceDefSeq * POA_CORBA::ExtInterfaceDef_tie<T>::base_interfaces (
+ ACE_ENV_SINGLE_ARG_DECL
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ))
+{
+ return this->ptr_->base_interfaces (
+ ACE_ENV_SINGLE_ARG_PARAMETER
+ );
+}
+
+// TAO_IDL - Generated from
+// be\be_visitor_operation/tie_si.cpp:101
+
+template <class T> ACE_INLINE
+void POA_CORBA::ExtInterfaceDef_tie<T>::base_interfaces (
+ const ::CORBA::InterfaceDefSeq & base_interfaces
+ ACE_ENV_ARG_DECL
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ))
+{
+ this->ptr_->base_interfaces (
+ base_interfaces
+ ACE_ENV_ARG_PARAMETER
+ );
+}
+
+// TAO_IDL - Generated from
+// be\be_visitor_operation/tie_si.cpp:101
+
+template <class T> ACE_INLINE
+::CORBA::Boolean POA_CORBA::ExtInterfaceDef_tie<T>::is_a (
+ const char * interface_id
+ ACE_ENV_ARG_DECL
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ))
+{
+ return this->ptr_->is_a (
+ interface_id
+ ACE_ENV_ARG_PARAMETER
+ );
+}
+
+// TAO_IDL - Generated from
+// be\be_visitor_operation/tie_si.cpp:101
+
+template <class T> ACE_INLINE
+::CORBA::InterfaceDef::FullInterfaceDescription * POA_CORBA::ExtInterfaceDef_tie<T>::describe_interface (
+ ACE_ENV_SINGLE_ARG_DECL
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ))
+{
+ return this->ptr_->describe_interface (
+ ACE_ENV_SINGLE_ARG_PARAMETER
+ );
+}
+
+// TAO_IDL - Generated from
+// be\be_visitor_operation/tie_si.cpp:101
+
+template <class T> ACE_INLINE
+::CORBA::AttributeDef_ptr POA_CORBA::ExtInterfaceDef_tie<T>::create_attribute (
+ const char * id,
+ const char * name,
+ const char * version,
+ ::CORBA::IDLType_ptr type,
+ ::CORBA::AttributeMode mode
+ ACE_ENV_ARG_DECL
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ))
+{
+ return this->ptr_->create_attribute (
+ id,
+ name,
+ version,
+ type,
+ mode
+ ACE_ENV_ARG_PARAMETER
+ );
+}
+
+// TAO_IDL - Generated from
+// be\be_visitor_operation/tie_si.cpp:101
+
+template <class T> ACE_INLINE
+::CORBA::OperationDef_ptr POA_CORBA::ExtInterfaceDef_tie<T>::create_operation (
+ const char * id,
+ const char * name,
+ const char * version,
+ ::CORBA::IDLType_ptr result,
+ ::CORBA::OperationMode mode,
+ const ::CORBA::ParDescriptionSeq & params,
+ const ::CORBA::ExceptionDefSeq & exceptions,
+ const ::CORBA::ContextIdSeq & contexts
+ ACE_ENV_ARG_DECL
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ))
+{
+ return this->ptr_->create_operation (
+ id,
+ name,
+ version,
+ result,
+ mode,
+ params,
+ exceptions,
+ contexts
+ ACE_ENV_ARG_PARAMETER
+ );
+}
+
+// TAO_IDL - Generated from
+// be\be_visitor_operation/tie_si.cpp:101
+
+template <class T> ACE_INLINE
+::CORBA::InterfaceAttrExtension::ExtFullInterfaceDescription * POA_CORBA::ExtInterfaceDef_tie<T>::describe_ext_interface (
+ ACE_ENV_SINGLE_ARG_DECL
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ))
+{
+ return this->ptr_->describe_ext_interface (
+ ACE_ENV_SINGLE_ARG_PARAMETER
+ );
+}
+
+// TAO_IDL - Generated from
+// be\be_visitor_operation/tie_si.cpp:101
+
+template <class T> ACE_INLINE
+::CORBA::ExtAttributeDef_ptr POA_CORBA::ExtInterfaceDef_tie<T>::create_ext_attribute (
+ const char * id,
+ const char * name,
+ const char * version,
+ ::CORBA::IDLType_ptr type,
+ ::CORBA::AttributeMode mode,
+ const ::CORBA::ExceptionDefSeq & get_exceptions,
+ const ::CORBA::ExceptionDefSeq & set_exceptions
+ ACE_ENV_ARG_DECL
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ))
+{
+ return this->ptr_->create_ext_attribute (
+ id,
+ name,
+ version,
+ type,
+ mode,
+ get_exceptions,
+ set_exceptions
+ ACE_ENV_ARG_PARAMETER
+ );
+}
+
+// TAO_IDL - Generated from
+// be\be_visitor_interface/tie_si.cpp:96
+
+template <class T> ACE_INLINE
+POA_CORBA::AbstractInterfaceDef_tie<T>::AbstractInterfaceDef_tie (T &t)
+ : ptr_ (&t),
+ poa_ (PortableServer::POA::_nil ()),
+ rel_ (0)
+{}
+
+template <class T> ACE_INLINE
+POA_CORBA::AbstractInterfaceDef_tie<T>::AbstractInterfaceDef_tie (T &t, PortableServer::POA_ptr poa)
+ : ptr_ (&t),
+ poa_ (PortableServer::POA::_duplicate (poa)),
+ rel_ (0)
+{}
+
+template <class T> ACE_INLINE
+POA_CORBA::AbstractInterfaceDef_tie<T>::AbstractInterfaceDef_tie (T *tp, ::CORBA::Boolean release)
+ : ptr_ (tp),
+ poa_ (PortableServer::POA::_nil ()),
+ rel_ (release)
+{}
+
+template <class T> ACE_INLINE
+POA_CORBA::AbstractInterfaceDef_tie<T>::AbstractInterfaceDef_tie (T *tp, PortableServer::POA_ptr poa, ::CORBA::Boolean release)
+ : ptr_ (tp),
+ poa_ (PortableServer::POA::_duplicate (poa)),
+ rel_ (release)
+{}
+
+template <class T> ACE_INLINE
+POA_CORBA::AbstractInterfaceDef_tie<T>::~AbstractInterfaceDef_tie (void)
+{
+ if (this->rel_)
+ {
+ delete this->ptr_;
+ }
+}
+
+template <class T> ACE_INLINE T *
+POA_CORBA::AbstractInterfaceDef_tie<T>::_tied_object (void)
+{
+ return this->ptr_;
+}
+
+template <class T> ACE_INLINE void
+POA_CORBA::AbstractInterfaceDef_tie<T>::_tied_object (T &obj)
+{
+ if (this->rel_)
+ {
+ delete this->ptr_;
+ }
+
+ this->ptr_ = &obj;
+ this->rel_ = 0;
+}
+
+template <class T> ACE_INLINE void
+POA_CORBA::AbstractInterfaceDef_tie<T>::_tied_object (T *obj, ::CORBA::Boolean release)
+{
+ if (this->rel_)
+ {
+ delete this->ptr_;
+ }
+
+ this->ptr_ = obj;
+ this->rel_ = release;
+}
+
+template <class T> ACE_INLINE ::CORBA::Boolean
+POA_CORBA::AbstractInterfaceDef_tie<T>::_is_owner (void)
+{
+ return this->rel_;
+}
+
+template <class T> ACE_INLINE void
+POA_CORBA::AbstractInterfaceDef_tie<T>::_is_owner ( ::CORBA::Boolean b)
+{
+ this->rel_ = b;
+}
+
+template <class T> ACE_INLINE PortableServer::POA_ptr
+POA_CORBA::AbstractInterfaceDef_tie<T>::_default_POA (ACE_ENV_SINGLE_ARG_DECL)
+{
+ if (! ::CORBA::is_nil (this->poa_.in ()))
+ {
+ return PortableServer::POA::_duplicate (this->poa_.in ());
+ }
+
+ return this->AbstractInterfaceDef::_default_POA (ACE_ENV_SINGLE_ARG_PARAMETER);
+}
+
+// TAO_IDL - Generated from
+// be\be_visitor_operation/tie_si.cpp:101
+
+template <class T> ACE_INLINE
+::CORBA::DefinitionKind POA_CORBA::AbstractInterfaceDef_tie<T>::def_kind (
+ ACE_ENV_SINGLE_ARG_DECL
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ))
+{
+ return this->ptr_->def_kind (
+ ACE_ENV_SINGLE_ARG_PARAMETER
+ );
+}
+
+// TAO_IDL - Generated from
+// be\be_visitor_operation/tie_si.cpp:101
+
+template <class T> ACE_INLINE
+void POA_CORBA::AbstractInterfaceDef_tie<T>::destroy (
+ ACE_ENV_SINGLE_ARG_DECL
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ))
+{
+ this->ptr_->destroy (
+ ACE_ENV_SINGLE_ARG_PARAMETER
+ );
+}
+
+// TAO_IDL - Generated from
+// be\be_visitor_operation/tie_si.cpp:101
+
+template <class T> ACE_INLINE
+::CORBA::Contained_ptr POA_CORBA::AbstractInterfaceDef_tie<T>::lookup (
+ const char * search_name
+ ACE_ENV_ARG_DECL
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ))
+{
+ return this->ptr_->lookup (
+ search_name
+ ACE_ENV_ARG_PARAMETER
+ );
+}
+
+// TAO_IDL - Generated from
+// be\be_visitor_operation/tie_si.cpp:101
+
+template <class T> ACE_INLINE
+::CORBA::ContainedSeq * POA_CORBA::AbstractInterfaceDef_tie<T>::contents (
+ ::CORBA::DefinitionKind limit_type,
+ ::CORBA::Boolean exclude_inherited
+ ACE_ENV_ARG_DECL
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ))
+{
+ return this->ptr_->contents (
+ limit_type,
+ exclude_inherited
+ ACE_ENV_ARG_PARAMETER
+ );
+}
+
+// TAO_IDL - Generated from
+// be\be_visitor_operation/tie_si.cpp:101
+
+template <class T> ACE_INLINE
+::CORBA::ContainedSeq * POA_CORBA::AbstractInterfaceDef_tie<T>::lookup_name (
+ const char * search_name,
+ ::CORBA::Long levels_to_search,
+ ::CORBA::DefinitionKind limit_type,
+ ::CORBA::Boolean exclude_inherited
+ ACE_ENV_ARG_DECL
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ))
+{
+ return this->ptr_->lookup_name (
+ search_name,
+ levels_to_search,
+ limit_type,
+ exclude_inherited
+ ACE_ENV_ARG_PARAMETER
+ );
+}
+
+// TAO_IDL - Generated from
+// be\be_visitor_operation/tie_si.cpp:101
+
+template <class T> ACE_INLINE
+::CORBA::Container::DescriptionSeq * POA_CORBA::AbstractInterfaceDef_tie<T>::describe_contents (
+ ::CORBA::DefinitionKind limit_type,
+ ::CORBA::Boolean exclude_inherited,
+ ::CORBA::Long max_returned_objs
+ ACE_ENV_ARG_DECL
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ))
+{
+ return this->ptr_->describe_contents (
+ limit_type,
+ exclude_inherited,
+ max_returned_objs
+ ACE_ENV_ARG_PARAMETER
+ );
+}
+
+// TAO_IDL - Generated from
+// be\be_visitor_operation/tie_si.cpp:101
+
+template <class T> ACE_INLINE
+::CORBA::ModuleDef_ptr POA_CORBA::AbstractInterfaceDef_tie<T>::create_module (
+ const char * id,
+ const char * name,
+ const char * version
+ ACE_ENV_ARG_DECL
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ))
+{
+ return this->ptr_->create_module (
+ id,
+ name,
+ version
+ ACE_ENV_ARG_PARAMETER
+ );
+}
+
+// TAO_IDL - Generated from
+// be\be_visitor_operation/tie_si.cpp:101
+
+template <class T> ACE_INLINE
+::CORBA::ConstantDef_ptr POA_CORBA::AbstractInterfaceDef_tie<T>::create_constant (
+ const char * id,
+ const char * name,
+ const char * version,
+ ::CORBA::IDLType_ptr type,
+ const ::CORBA::Any & value
+ ACE_ENV_ARG_DECL
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ))
+{
+ return this->ptr_->create_constant (
+ id,
+ name,
+ version,
+ type,
+ value
+ ACE_ENV_ARG_PARAMETER
+ );
+}
+
+// TAO_IDL - Generated from
+// be\be_visitor_operation/tie_si.cpp:101
+
+template <class T> ACE_INLINE
+::CORBA::StructDef_ptr POA_CORBA::AbstractInterfaceDef_tie<T>::create_struct (
+ const char * id,
+ const char * name,
+ const char * version,
+ const ::CORBA::StructMemberSeq & members
+ ACE_ENV_ARG_DECL
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ))
+{
+ return this->ptr_->create_struct (
+ id,
+ name,
+ version,
+ members
+ ACE_ENV_ARG_PARAMETER
+ );
+}
+
+// TAO_IDL - Generated from
+// be\be_visitor_operation/tie_si.cpp:101
+
+template <class T> ACE_INLINE
+::CORBA::UnionDef_ptr POA_CORBA::AbstractInterfaceDef_tie<T>::create_union (
+ const char * id,
+ const char * name,
+ const char * version,
+ ::CORBA::IDLType_ptr discriminator_type,
+ const ::CORBA::UnionMemberSeq & members
+ ACE_ENV_ARG_DECL
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ))
+{
+ return this->ptr_->create_union (
+ id,
+ name,
+ version,
+ discriminator_type,
+ members
+ ACE_ENV_ARG_PARAMETER
+ );
+}
+
+// TAO_IDL - Generated from
+// be\be_visitor_operation/tie_si.cpp:101
+
+template <class T> ACE_INLINE
+::CORBA::EnumDef_ptr POA_CORBA::AbstractInterfaceDef_tie<T>::create_enum (
+ const char * id,
+ const char * name,
+ const char * version,
+ const ::CORBA::EnumMemberSeq & members
+ ACE_ENV_ARG_DECL
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ))
+{
+ return this->ptr_->create_enum (
+ id,
+ name,
+ version,
+ members
+ ACE_ENV_ARG_PARAMETER
+ );
+}
+
+// TAO_IDL - Generated from
+// be\be_visitor_operation/tie_si.cpp:101
+
+template <class T> ACE_INLINE
+::CORBA::AliasDef_ptr POA_CORBA::AbstractInterfaceDef_tie<T>::create_alias (
+ const char * id,
+ const char * name,
+ const char * version,
+ ::CORBA::IDLType_ptr original_type
+ ACE_ENV_ARG_DECL
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ))
+{
+ return this->ptr_->create_alias (
+ id,
+ name,
+ version,
+ original_type
+ ACE_ENV_ARG_PARAMETER
+ );
+}
+
+// TAO_IDL - Generated from
+// be\be_visitor_operation/tie_si.cpp:101
+
+template <class T> ACE_INLINE
+::CORBA::InterfaceDef_ptr POA_CORBA::AbstractInterfaceDef_tie<T>::create_interface (
+ const char * id,
+ const char * name,
+ const char * version,
+ const ::CORBA::InterfaceDefSeq & base_interfaces
+ ACE_ENV_ARG_DECL
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ))
+{
+ return this->ptr_->create_interface (
+ id,
+ name,
+ version,
+ base_interfaces
+ ACE_ENV_ARG_PARAMETER
+ );
+}
+
+// TAO_IDL - Generated from
+// be\be_visitor_operation/tie_si.cpp:101
+
+template <class T> ACE_INLINE
+::CORBA::ValueDef_ptr POA_CORBA::AbstractInterfaceDef_tie<T>::create_value (
+ const char * id,
+ const char * name,
+ const char * version,
+ ::CORBA::Boolean is_custom,
+ ::CORBA::Boolean is_abstract,
+ ::CORBA::ValueDef_ptr base_value,
+ ::CORBA::Boolean is_truncatable,
+ const ::CORBA::ValueDefSeq & abstract_base_values,
+ const ::CORBA::InterfaceDefSeq & supported_interfaces,
+ const ::CORBA::InitializerSeq & initializers
+ ACE_ENV_ARG_DECL
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ))
+{
+ return this->ptr_->create_value (
+ id,
+ name,
+ version,
+ is_custom,
+ is_abstract,
+ base_value,
+ is_truncatable,
+ abstract_base_values,
+ supported_interfaces,
+ initializers
+ ACE_ENV_ARG_PARAMETER
+ );
+}
+
+// TAO_IDL - Generated from
+// be\be_visitor_operation/tie_si.cpp:101
+
+template <class T> ACE_INLINE
+::CORBA::ValueBoxDef_ptr POA_CORBA::AbstractInterfaceDef_tie<T>::create_value_box (
+ const char * id,
+ const char * name,
+ const char * version,
+ ::CORBA::IDLType_ptr original_type_def
+ ACE_ENV_ARG_DECL
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ))
+{
+ return this->ptr_->create_value_box (
+ id,
+ name,
+ version,
+ original_type_def
+ ACE_ENV_ARG_PARAMETER
+ );
+}
+
+// TAO_IDL - Generated from
+// be\be_visitor_operation/tie_si.cpp:101
+
+template <class T> ACE_INLINE
+::CORBA::ExceptionDef_ptr POA_CORBA::AbstractInterfaceDef_tie<T>::create_exception (
+ const char * id,
+ const char * name,
+ const char * version,
+ const ::CORBA::StructMemberSeq & members
+ ACE_ENV_ARG_DECL
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ))
+{
+ return this->ptr_->create_exception (
+ id,
+ name,
+ version,
+ members
+ ACE_ENV_ARG_PARAMETER
+ );
+}
+
+// TAO_IDL - Generated from
+// be\be_visitor_operation/tie_si.cpp:101
+
+template <class T> ACE_INLINE
+::CORBA::NativeDef_ptr POA_CORBA::AbstractInterfaceDef_tie<T>::create_native (
+ const char * id,
+ const char * name,
+ const char * version
+ ACE_ENV_ARG_DECL
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ))
+{
+ return this->ptr_->create_native (
+ id,
+ name,
+ version
+ ACE_ENV_ARG_PARAMETER
+ );
+}
+
+// TAO_IDL - Generated from
+// be\be_visitor_operation/tie_si.cpp:101
+
+template <class T> ACE_INLINE
+::CORBA::AbstractInterfaceDef_ptr POA_CORBA::AbstractInterfaceDef_tie<T>::create_abstract_interface (
+ const char * id,
+ const char * name,
+ const char * version,
+ const ::CORBA::AbstractInterfaceDefSeq & base_interfaces
+ ACE_ENV_ARG_DECL
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ))
+{
+ return this->ptr_->create_abstract_interface (
+ id,
+ name,
+ version,
+ base_interfaces
+ ACE_ENV_ARG_PARAMETER
+ );
+}
+
+// TAO_IDL - Generated from
+// be\be_visitor_operation/tie_si.cpp:101
+
+template <class T> ACE_INLINE
+::CORBA::LocalInterfaceDef_ptr POA_CORBA::AbstractInterfaceDef_tie<T>::create_local_interface (
+ const char * id,
+ const char * name,
+ const char * version,
+ const ::CORBA::InterfaceDefSeq & base_interfaces
+ ACE_ENV_ARG_DECL
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ))
+{
+ return this->ptr_->create_local_interface (
+ id,
+ name,
+ version,
+ base_interfaces
+ ACE_ENV_ARG_PARAMETER
+ );
+}
+
+// TAO_IDL - Generated from
+// be\be_visitor_operation/tie_si.cpp:101
+
+template <class T> ACE_INLINE
+::CORBA::ExtValueDef_ptr POA_CORBA::AbstractInterfaceDef_tie<T>::create_ext_value (
+ const char * id,
+ const char * name,
+ const char * version,
+ ::CORBA::Boolean is_custom,
+ ::CORBA::Boolean is_abstract,
+ ::CORBA::ValueDef_ptr base_value,
+ ::CORBA::Boolean is_truncatable,
+ const ::CORBA::ValueDefSeq & abstract_base_values,
+ const ::CORBA::InterfaceDefSeq & supported_interfaces,
+ const ::CORBA::ExtInitializerSeq & initializers
+ ACE_ENV_ARG_DECL
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ))
+{
+ return this->ptr_->create_ext_value (
+ id,
+ name,
+ version,
+ is_custom,
+ is_abstract,
+ base_value,
+ is_truncatable,
+ abstract_base_values,
+ supported_interfaces,
+ initializers
+ ACE_ENV_ARG_PARAMETER
+ );
+}
+
+// TAO_IDL - Generated from
+// be\be_visitor_operation/tie_si.cpp:101
+
+template <class T> ACE_INLINE
+char * POA_CORBA::AbstractInterfaceDef_tie<T>::id (
+ ACE_ENV_SINGLE_ARG_DECL
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ))
+{
+ return this->ptr_->id (
+ ACE_ENV_SINGLE_ARG_PARAMETER
+ );
+}
+
+// TAO_IDL - Generated from
+// be\be_visitor_operation/tie_si.cpp:101
+
+template <class T> ACE_INLINE
+void POA_CORBA::AbstractInterfaceDef_tie<T>::id (
+ const char * id
+ ACE_ENV_ARG_DECL
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ))
+{
+ this->ptr_->id (
+ id
+ ACE_ENV_ARG_PARAMETER
+ );
+}
+
+// TAO_IDL - Generated from
+// be\be_visitor_operation/tie_si.cpp:101
+
+template <class T> ACE_INLINE
+char * POA_CORBA::AbstractInterfaceDef_tie<T>::name (
+ ACE_ENV_SINGLE_ARG_DECL
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ))
+{
+ return this->ptr_->name (
+ ACE_ENV_SINGLE_ARG_PARAMETER
+ );
+}
+
+// TAO_IDL - Generated from
+// be\be_visitor_operation/tie_si.cpp:101
+
+template <class T> ACE_INLINE
+void POA_CORBA::AbstractInterfaceDef_tie<T>::name (
+ const char * name
+ ACE_ENV_ARG_DECL
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ))
+{
+ this->ptr_->name (
+ name
+ ACE_ENV_ARG_PARAMETER
+ );
+}
+
+// TAO_IDL - Generated from
+// be\be_visitor_operation/tie_si.cpp:101
+
+template <class T> ACE_INLINE
+char * POA_CORBA::AbstractInterfaceDef_tie<T>::version (
+ ACE_ENV_SINGLE_ARG_DECL
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ))
+{
+ return this->ptr_->version (
+ ACE_ENV_SINGLE_ARG_PARAMETER
+ );
+}
+
+// TAO_IDL - Generated from
+// be\be_visitor_operation/tie_si.cpp:101
+
+template <class T> ACE_INLINE
+void POA_CORBA::AbstractInterfaceDef_tie<T>::version (
+ const char * version
+ ACE_ENV_ARG_DECL
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ))
+{
+ this->ptr_->version (
+ version
+ ACE_ENV_ARG_PARAMETER
+ );
+}
+
+// TAO_IDL - Generated from
+// be\be_visitor_operation/tie_si.cpp:101
+
+template <class T> ACE_INLINE
+::CORBA::Container_ptr POA_CORBA::AbstractInterfaceDef_tie<T>::defined_in (
+ ACE_ENV_SINGLE_ARG_DECL
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ))
+{
+ return this->ptr_->defined_in (
+ ACE_ENV_SINGLE_ARG_PARAMETER
+ );
+}
+
+// TAO_IDL - Generated from
+// be\be_visitor_operation/tie_si.cpp:101
+
+template <class T> ACE_INLINE
+char * POA_CORBA::AbstractInterfaceDef_tie<T>::absolute_name (
+ ACE_ENV_SINGLE_ARG_DECL
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ))
+{
+ return this->ptr_->absolute_name (
+ ACE_ENV_SINGLE_ARG_PARAMETER
+ );
+}
+
+// TAO_IDL - Generated from
+// be\be_visitor_operation/tie_si.cpp:101
+
+template <class T> ACE_INLINE
+::CORBA::Repository_ptr POA_CORBA::AbstractInterfaceDef_tie<T>::containing_repository (
+ ACE_ENV_SINGLE_ARG_DECL
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ))
+{
+ return this->ptr_->containing_repository (
+ ACE_ENV_SINGLE_ARG_PARAMETER
+ );
+}
+
+// TAO_IDL - Generated from
+// be\be_visitor_operation/tie_si.cpp:101
+
+template <class T> ACE_INLINE
+::CORBA::Contained::Description * POA_CORBA::AbstractInterfaceDef_tie<T>::describe (
+ ACE_ENV_SINGLE_ARG_DECL
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ))
+{
+ return this->ptr_->describe (
+ ACE_ENV_SINGLE_ARG_PARAMETER
+ );
+}
+
+// TAO_IDL - Generated from
+// be\be_visitor_operation/tie_si.cpp:101
+
+template <class T> ACE_INLINE
+void POA_CORBA::AbstractInterfaceDef_tie<T>::move (
+ ::CORBA::Container_ptr new_container,
+ const char * new_name,
+ const char * new_version
+ ACE_ENV_ARG_DECL
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ))
+{
+ this->ptr_->move (
+ new_container,
+ new_name,
+ new_version
+ ACE_ENV_ARG_PARAMETER
+ );
+}
+
+// TAO_IDL - Generated from
+// be\be_visitor_operation/tie_si.cpp:101
+
+template <class T> ACE_INLINE
+::CORBA::TypeCode_ptr POA_CORBA::AbstractInterfaceDef_tie<T>::type (
+ ACE_ENV_SINGLE_ARG_DECL
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ))
+{
+ return this->ptr_->type (
+ ACE_ENV_SINGLE_ARG_PARAMETER
+ );
+}
+
+// TAO_IDL - Generated from
+// be\be_visitor_operation/tie_si.cpp:101
+
+template <class T> ACE_INLINE
+::CORBA::InterfaceDefSeq * POA_CORBA::AbstractInterfaceDef_tie<T>::base_interfaces (
+ ACE_ENV_SINGLE_ARG_DECL
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ))
+{
+ return this->ptr_->base_interfaces (
+ ACE_ENV_SINGLE_ARG_PARAMETER
+ );
+}
+
+// TAO_IDL - Generated from
+// be\be_visitor_operation/tie_si.cpp:101
+
+template <class T> ACE_INLINE
+void POA_CORBA::AbstractInterfaceDef_tie<T>::base_interfaces (
+ const ::CORBA::InterfaceDefSeq & base_interfaces
+ ACE_ENV_ARG_DECL
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ))
+{
+ this->ptr_->base_interfaces (
+ base_interfaces
+ ACE_ENV_ARG_PARAMETER
+ );
+}
+
+// TAO_IDL - Generated from
+// be\be_visitor_operation/tie_si.cpp:101
+
+template <class T> ACE_INLINE
+::CORBA::Boolean POA_CORBA::AbstractInterfaceDef_tie<T>::is_a (
+ const char * interface_id
+ ACE_ENV_ARG_DECL
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ))
+{
+ return this->ptr_->is_a (
+ interface_id
+ ACE_ENV_ARG_PARAMETER
+ );
+}
+
+// TAO_IDL - Generated from
+// be\be_visitor_operation/tie_si.cpp:101
+
+template <class T> ACE_INLINE
+::CORBA::InterfaceDef::FullInterfaceDescription * POA_CORBA::AbstractInterfaceDef_tie<T>::describe_interface (
+ ACE_ENV_SINGLE_ARG_DECL
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ))
+{
+ return this->ptr_->describe_interface (
+ ACE_ENV_SINGLE_ARG_PARAMETER
+ );
+}
+
+// TAO_IDL - Generated from
+// be\be_visitor_operation/tie_si.cpp:101
+
+template <class T> ACE_INLINE
+::CORBA::AttributeDef_ptr POA_CORBA::AbstractInterfaceDef_tie<T>::create_attribute (
+ const char * id,
+ const char * name,
+ const char * version,
+ ::CORBA::IDLType_ptr type,
+ ::CORBA::AttributeMode mode
+ ACE_ENV_ARG_DECL
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ))
+{
+ return this->ptr_->create_attribute (
+ id,
+ name,
+ version,
+ type,
+ mode
+ ACE_ENV_ARG_PARAMETER
+ );
+}
+
+// TAO_IDL - Generated from
+// be\be_visitor_operation/tie_si.cpp:101
+
+template <class T> ACE_INLINE
+::CORBA::OperationDef_ptr POA_CORBA::AbstractInterfaceDef_tie<T>::create_operation (
+ const char * id,
+ const char * name,
+ const char * version,
+ ::CORBA::IDLType_ptr result,
+ ::CORBA::OperationMode mode,
+ const ::CORBA::ParDescriptionSeq & params,
+ const ::CORBA::ExceptionDefSeq & exceptions,
+ const ::CORBA::ContextIdSeq & contexts
+ ACE_ENV_ARG_DECL
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ))
+{
+ return this->ptr_->create_operation (
+ id,
+ name,
+ version,
+ result,
+ mode,
+ params,
+ exceptions,
+ contexts
+ ACE_ENV_ARG_PARAMETER
+ );
+}
+
+// TAO_IDL - Generated from
+// be\be_visitor_interface/tie_si.cpp:96
+
+template <class T> ACE_INLINE
+POA_CORBA::ExtAbstractInterfaceDef_tie<T>::ExtAbstractInterfaceDef_tie (T &t)
+ : ptr_ (&t),
+ poa_ (PortableServer::POA::_nil ()),
+ rel_ (0)
+{}
+
+template <class T> ACE_INLINE
+POA_CORBA::ExtAbstractInterfaceDef_tie<T>::ExtAbstractInterfaceDef_tie (T &t, PortableServer::POA_ptr poa)
+ : ptr_ (&t),
+ poa_ (PortableServer::POA::_duplicate (poa)),
+ rel_ (0)
+{}
+
+template <class T> ACE_INLINE
+POA_CORBA::ExtAbstractInterfaceDef_tie<T>::ExtAbstractInterfaceDef_tie (T *tp, ::CORBA::Boolean release)
+ : ptr_ (tp),
+ poa_ (PortableServer::POA::_nil ()),
+ rel_ (release)
+{}
+
+template <class T> ACE_INLINE
+POA_CORBA::ExtAbstractInterfaceDef_tie<T>::ExtAbstractInterfaceDef_tie (T *tp, PortableServer::POA_ptr poa, ::CORBA::Boolean release)
+ : ptr_ (tp),
+ poa_ (PortableServer::POA::_duplicate (poa)),
+ rel_ (release)
+{}
+
+template <class T> ACE_INLINE
+POA_CORBA::ExtAbstractInterfaceDef_tie<T>::~ExtAbstractInterfaceDef_tie (void)
+{
+ if (this->rel_)
+ {
+ delete this->ptr_;
+ }
+}
+
+template <class T> ACE_INLINE T *
+POA_CORBA::ExtAbstractInterfaceDef_tie<T>::_tied_object (void)
+{
+ return this->ptr_;
+}
+
+template <class T> ACE_INLINE void
+POA_CORBA::ExtAbstractInterfaceDef_tie<T>::_tied_object (T &obj)
+{
+ if (this->rel_)
+ {
+ delete this->ptr_;
+ }
+
+ this->ptr_ = &obj;
+ this->rel_ = 0;
+}
+
+template <class T> ACE_INLINE void
+POA_CORBA::ExtAbstractInterfaceDef_tie<T>::_tied_object (T *obj, ::CORBA::Boolean release)
+{
+ if (this->rel_)
+ {
+ delete this->ptr_;
+ }
+
+ this->ptr_ = obj;
+ this->rel_ = release;
+}
+
+template <class T> ACE_INLINE ::CORBA::Boolean
+POA_CORBA::ExtAbstractInterfaceDef_tie<T>::_is_owner (void)
+{
+ return this->rel_;
+}
+
+template <class T> ACE_INLINE void
+POA_CORBA::ExtAbstractInterfaceDef_tie<T>::_is_owner ( ::CORBA::Boolean b)
+{
+ this->rel_ = b;
+}
+
+template <class T> ACE_INLINE PortableServer::POA_ptr
+POA_CORBA::ExtAbstractInterfaceDef_tie<T>::_default_POA (ACE_ENV_SINGLE_ARG_DECL)
+{
+ if (! ::CORBA::is_nil (this->poa_.in ()))
+ {
+ return PortableServer::POA::_duplicate (this->poa_.in ());
+ }
+
+ return this->ExtAbstractInterfaceDef::_default_POA (ACE_ENV_SINGLE_ARG_PARAMETER);
+}
+
+// TAO_IDL - Generated from
+// be\be_visitor_operation/tie_si.cpp:101
+
+template <class T> ACE_INLINE
+::CORBA::DefinitionKind POA_CORBA::ExtAbstractInterfaceDef_tie<T>::def_kind (
+ ACE_ENV_SINGLE_ARG_DECL
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ))
+{
+ return this->ptr_->def_kind (
+ ACE_ENV_SINGLE_ARG_PARAMETER
+ );
+}
+
+// TAO_IDL - Generated from
+// be\be_visitor_operation/tie_si.cpp:101
+
+template <class T> ACE_INLINE
+void POA_CORBA::ExtAbstractInterfaceDef_tie<T>::destroy (
+ ACE_ENV_SINGLE_ARG_DECL
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ))
+{
+ this->ptr_->destroy (
+ ACE_ENV_SINGLE_ARG_PARAMETER
+ );
+}
+
+// TAO_IDL - Generated from
+// be\be_visitor_operation/tie_si.cpp:101
+
+template <class T> ACE_INLINE
+::CORBA::Contained_ptr POA_CORBA::ExtAbstractInterfaceDef_tie<T>::lookup (
+ const char * search_name
+ ACE_ENV_ARG_DECL
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ))
+{
+ return this->ptr_->lookup (
+ search_name
+ ACE_ENV_ARG_PARAMETER
+ );
+}
+
+// TAO_IDL - Generated from
+// be\be_visitor_operation/tie_si.cpp:101
+
+template <class T> ACE_INLINE
+::CORBA::ContainedSeq * POA_CORBA::ExtAbstractInterfaceDef_tie<T>::contents (
+ ::CORBA::DefinitionKind limit_type,
+ ::CORBA::Boolean exclude_inherited
+ ACE_ENV_ARG_DECL
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ))
+{
+ return this->ptr_->contents (
+ limit_type,
+ exclude_inherited
+ ACE_ENV_ARG_PARAMETER
+ );
+}
+
+// TAO_IDL - Generated from
+// be\be_visitor_operation/tie_si.cpp:101
+
+template <class T> ACE_INLINE
+::CORBA::ContainedSeq * POA_CORBA::ExtAbstractInterfaceDef_tie<T>::lookup_name (
+ const char * search_name,
+ ::CORBA::Long levels_to_search,
+ ::CORBA::DefinitionKind limit_type,
+ ::CORBA::Boolean exclude_inherited
+ ACE_ENV_ARG_DECL
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ))
+{
+ return this->ptr_->lookup_name (
+ search_name,
+ levels_to_search,
+ limit_type,
+ exclude_inherited
+ ACE_ENV_ARG_PARAMETER
+ );
+}
+
+// TAO_IDL - Generated from
+// be\be_visitor_operation/tie_si.cpp:101
+
+template <class T> ACE_INLINE
+::CORBA::Container::DescriptionSeq * POA_CORBA::ExtAbstractInterfaceDef_tie<T>::describe_contents (
+ ::CORBA::DefinitionKind limit_type,
+ ::CORBA::Boolean exclude_inherited,
+ ::CORBA::Long max_returned_objs
+ ACE_ENV_ARG_DECL
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ))
+{
+ return this->ptr_->describe_contents (
+ limit_type,
+ exclude_inherited,
+ max_returned_objs
+ ACE_ENV_ARG_PARAMETER
+ );
+}
+
+// TAO_IDL - Generated from
+// be\be_visitor_operation/tie_si.cpp:101
+
+template <class T> ACE_INLINE
+::CORBA::ModuleDef_ptr POA_CORBA::ExtAbstractInterfaceDef_tie<T>::create_module (
+ const char * id,
+ const char * name,
+ const char * version
+ ACE_ENV_ARG_DECL
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ))
+{
+ return this->ptr_->create_module (
+ id,
+ name,
+ version
+ ACE_ENV_ARG_PARAMETER
+ );
+}
+
+// TAO_IDL - Generated from
+// be\be_visitor_operation/tie_si.cpp:101
+
+template <class T> ACE_INLINE
+::CORBA::ConstantDef_ptr POA_CORBA::ExtAbstractInterfaceDef_tie<T>::create_constant (
+ const char * id,
+ const char * name,
+ const char * version,
+ ::CORBA::IDLType_ptr type,
+ const ::CORBA::Any & value
+ ACE_ENV_ARG_DECL
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ))
+{
+ return this->ptr_->create_constant (
+ id,
+ name,
+ version,
+ type,
+ value
+ ACE_ENV_ARG_PARAMETER
+ );
+}
+
+// TAO_IDL - Generated from
+// be\be_visitor_operation/tie_si.cpp:101
+
+template <class T> ACE_INLINE
+::CORBA::StructDef_ptr POA_CORBA::ExtAbstractInterfaceDef_tie<T>::create_struct (
+ const char * id,
+ const char * name,
+ const char * version,
+ const ::CORBA::StructMemberSeq & members
+ ACE_ENV_ARG_DECL
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ))
+{
+ return this->ptr_->create_struct (
+ id,
+ name,
+ version,
+ members
+ ACE_ENV_ARG_PARAMETER
+ );
+}
+
+// TAO_IDL - Generated from
+// be\be_visitor_operation/tie_si.cpp:101
+
+template <class T> ACE_INLINE
+::CORBA::UnionDef_ptr POA_CORBA::ExtAbstractInterfaceDef_tie<T>::create_union (
+ const char * id,
+ const char * name,
+ const char * version,
+ ::CORBA::IDLType_ptr discriminator_type,
+ const ::CORBA::UnionMemberSeq & members
+ ACE_ENV_ARG_DECL
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ))
+{
+ return this->ptr_->create_union (
+ id,
+ name,
+ version,
+ discriminator_type,
+ members
+ ACE_ENV_ARG_PARAMETER
+ );
+}
+
+// TAO_IDL - Generated from
+// be\be_visitor_operation/tie_si.cpp:101
+
+template <class T> ACE_INLINE
+::CORBA::EnumDef_ptr POA_CORBA::ExtAbstractInterfaceDef_tie<T>::create_enum (
+ const char * id,
+ const char * name,
+ const char * version,
+ const ::CORBA::EnumMemberSeq & members
+ ACE_ENV_ARG_DECL
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ))
+{
+ return this->ptr_->create_enum (
+ id,
+ name,
+ version,
+ members
+ ACE_ENV_ARG_PARAMETER
+ );
+}
+
+// TAO_IDL - Generated from
+// be\be_visitor_operation/tie_si.cpp:101
+
+template <class T> ACE_INLINE
+::CORBA::AliasDef_ptr POA_CORBA::ExtAbstractInterfaceDef_tie<T>::create_alias (
+ const char * id,
+ const char * name,
+ const char * version,
+ ::CORBA::IDLType_ptr original_type
+ ACE_ENV_ARG_DECL
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ))
+{
+ return this->ptr_->create_alias (
+ id,
+ name,
+ version,
+ original_type
+ ACE_ENV_ARG_PARAMETER
+ );
+}
+
+// TAO_IDL - Generated from
+// be\be_visitor_operation/tie_si.cpp:101
+
+template <class T> ACE_INLINE
+::CORBA::InterfaceDef_ptr POA_CORBA::ExtAbstractInterfaceDef_tie<T>::create_interface (
+ const char * id,
+ const char * name,
+ const char * version,
+ const ::CORBA::InterfaceDefSeq & base_interfaces
+ ACE_ENV_ARG_DECL
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ))
+{
+ return this->ptr_->create_interface (
+ id,
+ name,
+ version,
+ base_interfaces
+ ACE_ENV_ARG_PARAMETER
+ );
+}
+
+// TAO_IDL - Generated from
+// be\be_visitor_operation/tie_si.cpp:101
+
+template <class T> ACE_INLINE
+::CORBA::ValueDef_ptr POA_CORBA::ExtAbstractInterfaceDef_tie<T>::create_value (
+ const char * id,
+ const char * name,
+ const char * version,
+ ::CORBA::Boolean is_custom,
+ ::CORBA::Boolean is_abstract,
+ ::CORBA::ValueDef_ptr base_value,
+ ::CORBA::Boolean is_truncatable,
+ const ::CORBA::ValueDefSeq & abstract_base_values,
+ const ::CORBA::InterfaceDefSeq & supported_interfaces,
+ const ::CORBA::InitializerSeq & initializers
+ ACE_ENV_ARG_DECL
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ))
+{
+ return this->ptr_->create_value (
+ id,
+ name,
+ version,
+ is_custom,
+ is_abstract,
+ base_value,
+ is_truncatable,
+ abstract_base_values,
+ supported_interfaces,
+ initializers
+ ACE_ENV_ARG_PARAMETER
+ );
+}
+
+// TAO_IDL - Generated from
+// be\be_visitor_operation/tie_si.cpp:101
+
+template <class T> ACE_INLINE
+::CORBA::ValueBoxDef_ptr POA_CORBA::ExtAbstractInterfaceDef_tie<T>::create_value_box (
+ const char * id,
+ const char * name,
+ const char * version,
+ ::CORBA::IDLType_ptr original_type_def
+ ACE_ENV_ARG_DECL
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ))
+{
+ return this->ptr_->create_value_box (
+ id,
+ name,
+ version,
+ original_type_def
+ ACE_ENV_ARG_PARAMETER
+ );
+}
+
+// TAO_IDL - Generated from
+// be\be_visitor_operation/tie_si.cpp:101
+
+template <class T> ACE_INLINE
+::CORBA::ExceptionDef_ptr POA_CORBA::ExtAbstractInterfaceDef_tie<T>::create_exception (
+ const char * id,
+ const char * name,
+ const char * version,
+ const ::CORBA::StructMemberSeq & members
+ ACE_ENV_ARG_DECL
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ))
+{
+ return this->ptr_->create_exception (
+ id,
+ name,
+ version,
+ members
+ ACE_ENV_ARG_PARAMETER
+ );
+}
+
+// TAO_IDL - Generated from
+// be\be_visitor_operation/tie_si.cpp:101
+
+template <class T> ACE_INLINE
+::CORBA::NativeDef_ptr POA_CORBA::ExtAbstractInterfaceDef_tie<T>::create_native (
+ const char * id,
+ const char * name,
+ const char * version
+ ACE_ENV_ARG_DECL
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ))
+{
+ return this->ptr_->create_native (
+ id,
+ name,
+ version
+ ACE_ENV_ARG_PARAMETER
+ );
+}
+
+// TAO_IDL - Generated from
+// be\be_visitor_operation/tie_si.cpp:101
+
+template <class T> ACE_INLINE
+::CORBA::AbstractInterfaceDef_ptr POA_CORBA::ExtAbstractInterfaceDef_tie<T>::create_abstract_interface (
+ const char * id,
+ const char * name,
+ const char * version,
+ const ::CORBA::AbstractInterfaceDefSeq & base_interfaces
+ ACE_ENV_ARG_DECL
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ))
+{
+ return this->ptr_->create_abstract_interface (
+ id,
+ name,
+ version,
+ base_interfaces
+ ACE_ENV_ARG_PARAMETER
+ );
+}
+
+// TAO_IDL - Generated from
+// be\be_visitor_operation/tie_si.cpp:101
+
+template <class T> ACE_INLINE
+::CORBA::LocalInterfaceDef_ptr POA_CORBA::ExtAbstractInterfaceDef_tie<T>::create_local_interface (
+ const char * id,
+ const char * name,
+ const char * version,
+ const ::CORBA::InterfaceDefSeq & base_interfaces
+ ACE_ENV_ARG_DECL
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ))
+{
+ return this->ptr_->create_local_interface (
+ id,
+ name,
+ version,
+ base_interfaces
+ ACE_ENV_ARG_PARAMETER
+ );
+}
+
+// TAO_IDL - Generated from
+// be\be_visitor_operation/tie_si.cpp:101
+
+template <class T> ACE_INLINE
+::CORBA::ExtValueDef_ptr POA_CORBA::ExtAbstractInterfaceDef_tie<T>::create_ext_value (
+ const char * id,
+ const char * name,
+ const char * version,
+ ::CORBA::Boolean is_custom,
+ ::CORBA::Boolean is_abstract,
+ ::CORBA::ValueDef_ptr base_value,
+ ::CORBA::Boolean is_truncatable,
+ const ::CORBA::ValueDefSeq & abstract_base_values,
+ const ::CORBA::InterfaceDefSeq & supported_interfaces,
+ const ::CORBA::ExtInitializerSeq & initializers
+ ACE_ENV_ARG_DECL
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ))
+{
+ return this->ptr_->create_ext_value (
+ id,
+ name,
+ version,
+ is_custom,
+ is_abstract,
+ base_value,
+ is_truncatable,
+ abstract_base_values,
+ supported_interfaces,
+ initializers
+ ACE_ENV_ARG_PARAMETER
+ );
+}
+
+// TAO_IDL - Generated from
+// be\be_visitor_operation/tie_si.cpp:101
+
+template <class T> ACE_INLINE
+char * POA_CORBA::ExtAbstractInterfaceDef_tie<T>::id (
+ ACE_ENV_SINGLE_ARG_DECL
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ))
+{
+ return this->ptr_->id (
+ ACE_ENV_SINGLE_ARG_PARAMETER
+ );
+}
+
+// TAO_IDL - Generated from
+// be\be_visitor_operation/tie_si.cpp:101
+
+template <class T> ACE_INLINE
+void POA_CORBA::ExtAbstractInterfaceDef_tie<T>::id (
+ const char * id
+ ACE_ENV_ARG_DECL
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ))
+{
+ this->ptr_->id (
+ id
+ ACE_ENV_ARG_PARAMETER
+ );
+}
+
+// TAO_IDL - Generated from
+// be\be_visitor_operation/tie_si.cpp:101
+
+template <class T> ACE_INLINE
+char * POA_CORBA::ExtAbstractInterfaceDef_tie<T>::name (
+ ACE_ENV_SINGLE_ARG_DECL
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ))
+{
+ return this->ptr_->name (
+ ACE_ENV_SINGLE_ARG_PARAMETER
+ );
+}
+
+// TAO_IDL - Generated from
+// be\be_visitor_operation/tie_si.cpp:101
+
+template <class T> ACE_INLINE
+void POA_CORBA::ExtAbstractInterfaceDef_tie<T>::name (
+ const char * name
+ ACE_ENV_ARG_DECL
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ))
+{
+ this->ptr_->name (
+ name
+ ACE_ENV_ARG_PARAMETER
+ );
+}
+
+// TAO_IDL - Generated from
+// be\be_visitor_operation/tie_si.cpp:101
+
+template <class T> ACE_INLINE
+char * POA_CORBA::ExtAbstractInterfaceDef_tie<T>::version (
+ ACE_ENV_SINGLE_ARG_DECL
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ))
+{
+ return this->ptr_->version (
+ ACE_ENV_SINGLE_ARG_PARAMETER
+ );
+}
+
+// TAO_IDL - Generated from
+// be\be_visitor_operation/tie_si.cpp:101
+
+template <class T> ACE_INLINE
+void POA_CORBA::ExtAbstractInterfaceDef_tie<T>::version (
+ const char * version
+ ACE_ENV_ARG_DECL
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ))
+{
+ this->ptr_->version (
+ version
+ ACE_ENV_ARG_PARAMETER
+ );
+}
+
+// TAO_IDL - Generated from
+// be\be_visitor_operation/tie_si.cpp:101
+
+template <class T> ACE_INLINE
+::CORBA::Container_ptr POA_CORBA::ExtAbstractInterfaceDef_tie<T>::defined_in (
+ ACE_ENV_SINGLE_ARG_DECL
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ))
+{
+ return this->ptr_->defined_in (
+ ACE_ENV_SINGLE_ARG_PARAMETER
+ );
+}
+
+// TAO_IDL - Generated from
+// be\be_visitor_operation/tie_si.cpp:101
+
+template <class T> ACE_INLINE
+char * POA_CORBA::ExtAbstractInterfaceDef_tie<T>::absolute_name (
+ ACE_ENV_SINGLE_ARG_DECL
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ))
+{
+ return this->ptr_->absolute_name (
+ ACE_ENV_SINGLE_ARG_PARAMETER
+ );
+}
+
+// TAO_IDL - Generated from
+// be\be_visitor_operation/tie_si.cpp:101
+
+template <class T> ACE_INLINE
+::CORBA::Repository_ptr POA_CORBA::ExtAbstractInterfaceDef_tie<T>::containing_repository (
+ ACE_ENV_SINGLE_ARG_DECL
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ))
+{
+ return this->ptr_->containing_repository (
+ ACE_ENV_SINGLE_ARG_PARAMETER
+ );
+}
+
+// TAO_IDL - Generated from
+// be\be_visitor_operation/tie_si.cpp:101
+
+template <class T> ACE_INLINE
+::CORBA::Contained::Description * POA_CORBA::ExtAbstractInterfaceDef_tie<T>::describe (
+ ACE_ENV_SINGLE_ARG_DECL
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ))
+{
+ return this->ptr_->describe (
+ ACE_ENV_SINGLE_ARG_PARAMETER
+ );
+}
+
+// TAO_IDL - Generated from
+// be\be_visitor_operation/tie_si.cpp:101
+
+template <class T> ACE_INLINE
+void POA_CORBA::ExtAbstractInterfaceDef_tie<T>::move (
+ ::CORBA::Container_ptr new_container,
+ const char * new_name,
+ const char * new_version
+ ACE_ENV_ARG_DECL
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ))
+{
+ this->ptr_->move (
+ new_container,
+ new_name,
+ new_version
+ ACE_ENV_ARG_PARAMETER
+ );
+}
+
+// TAO_IDL - Generated from
+// be\be_visitor_operation/tie_si.cpp:101
+
+template <class T> ACE_INLINE
+::CORBA::TypeCode_ptr POA_CORBA::ExtAbstractInterfaceDef_tie<T>::type (
+ ACE_ENV_SINGLE_ARG_DECL
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ))
+{
+ return this->ptr_->type (
+ ACE_ENV_SINGLE_ARG_PARAMETER
+ );
+}
+
+// TAO_IDL - Generated from
+// be\be_visitor_operation/tie_si.cpp:101
+
+template <class T> ACE_INLINE
+::CORBA::InterfaceDefSeq * POA_CORBA::ExtAbstractInterfaceDef_tie<T>::base_interfaces (
+ ACE_ENV_SINGLE_ARG_DECL
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ))
+{
+ return this->ptr_->base_interfaces (
+ ACE_ENV_SINGLE_ARG_PARAMETER
+ );
+}
+
+// TAO_IDL - Generated from
+// be\be_visitor_operation/tie_si.cpp:101
+
+template <class T> ACE_INLINE
+void POA_CORBA::ExtAbstractInterfaceDef_tie<T>::base_interfaces (
+ const ::CORBA::InterfaceDefSeq & base_interfaces
+ ACE_ENV_ARG_DECL
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ))
+{
+ this->ptr_->base_interfaces (
+ base_interfaces
+ ACE_ENV_ARG_PARAMETER
+ );
+}
+
+// TAO_IDL - Generated from
+// be\be_visitor_operation/tie_si.cpp:101
+
+template <class T> ACE_INLINE
+::CORBA::Boolean POA_CORBA::ExtAbstractInterfaceDef_tie<T>::is_a (
+ const char * interface_id
+ ACE_ENV_ARG_DECL
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ))
+{
+ return this->ptr_->is_a (
+ interface_id
+ ACE_ENV_ARG_PARAMETER
+ );
+}
+
+// TAO_IDL - Generated from
+// be\be_visitor_operation/tie_si.cpp:101
+
+template <class T> ACE_INLINE
+::CORBA::InterfaceDef::FullInterfaceDescription * POA_CORBA::ExtAbstractInterfaceDef_tie<T>::describe_interface (
+ ACE_ENV_SINGLE_ARG_DECL
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ))
+{
+ return this->ptr_->describe_interface (
+ ACE_ENV_SINGLE_ARG_PARAMETER
+ );
+}
+
+// TAO_IDL - Generated from
+// be\be_visitor_operation/tie_si.cpp:101
+
+template <class T> ACE_INLINE
+::CORBA::AttributeDef_ptr POA_CORBA::ExtAbstractInterfaceDef_tie<T>::create_attribute (
+ const char * id,
+ const char * name,
+ const char * version,
+ ::CORBA::IDLType_ptr type,
+ ::CORBA::AttributeMode mode
+ ACE_ENV_ARG_DECL
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ))
+{
+ return this->ptr_->create_attribute (
+ id,
+ name,
+ version,
+ type,
+ mode
+ ACE_ENV_ARG_PARAMETER
+ );
+}
+
+// TAO_IDL - Generated from
+// be\be_visitor_operation/tie_si.cpp:101
+
+template <class T> ACE_INLINE
+::CORBA::OperationDef_ptr POA_CORBA::ExtAbstractInterfaceDef_tie<T>::create_operation (
+ const char * id,
+ const char * name,
+ const char * version,
+ ::CORBA::IDLType_ptr result,
+ ::CORBA::OperationMode mode,
+ const ::CORBA::ParDescriptionSeq & params,
+ const ::CORBA::ExceptionDefSeq & exceptions,
+ const ::CORBA::ContextIdSeq & contexts
+ ACE_ENV_ARG_DECL
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ))
+{
+ return this->ptr_->create_operation (
+ id,
+ name,
+ version,
+ result,
+ mode,
+ params,
+ exceptions,
+ contexts
+ ACE_ENV_ARG_PARAMETER
+ );
+}
+
+// TAO_IDL - Generated from
+// be\be_visitor_operation/tie_si.cpp:101
+
+template <class T> ACE_INLINE
+::CORBA::InterfaceAttrExtension::ExtFullInterfaceDescription * POA_CORBA::ExtAbstractInterfaceDef_tie<T>::describe_ext_interface (
+ ACE_ENV_SINGLE_ARG_DECL
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ))
+{
+ return this->ptr_->describe_ext_interface (
+ ACE_ENV_SINGLE_ARG_PARAMETER
+ );
+}
+
+// TAO_IDL - Generated from
+// be\be_visitor_operation/tie_si.cpp:101
+
+template <class T> ACE_INLINE
+::CORBA::ExtAttributeDef_ptr POA_CORBA::ExtAbstractInterfaceDef_tie<T>::create_ext_attribute (
+ const char * id,
+ const char * name,
+ const char * version,
+ ::CORBA::IDLType_ptr type,
+ ::CORBA::AttributeMode mode,
+ const ::CORBA::ExceptionDefSeq & get_exceptions,
+ const ::CORBA::ExceptionDefSeq & set_exceptions
+ ACE_ENV_ARG_DECL
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ))
+{
+ return this->ptr_->create_ext_attribute (
+ id,
+ name,
+ version,
+ type,
+ mode,
+ get_exceptions,
+ set_exceptions
+ ACE_ENV_ARG_PARAMETER
+ );
+}
+
+// TAO_IDL - Generated from
+// be\be_visitor_interface/tie_si.cpp:96
+
+template <class T> ACE_INLINE
+POA_CORBA::LocalInterfaceDef_tie<T>::LocalInterfaceDef_tie (T &t)
+ : ptr_ (&t),
+ poa_ (PortableServer::POA::_nil ()),
+ rel_ (0)
+{}
+
+template <class T> ACE_INLINE
+POA_CORBA::LocalInterfaceDef_tie<T>::LocalInterfaceDef_tie (T &t, PortableServer::POA_ptr poa)
+ : ptr_ (&t),
+ poa_ (PortableServer::POA::_duplicate (poa)),
+ rel_ (0)
+{}
+
+template <class T> ACE_INLINE
+POA_CORBA::LocalInterfaceDef_tie<T>::LocalInterfaceDef_tie (T *tp, ::CORBA::Boolean release)
+ : ptr_ (tp),
+ poa_ (PortableServer::POA::_nil ()),
+ rel_ (release)
+{}
+
+template <class T> ACE_INLINE
+POA_CORBA::LocalInterfaceDef_tie<T>::LocalInterfaceDef_tie (T *tp, PortableServer::POA_ptr poa, ::CORBA::Boolean release)
+ : ptr_ (tp),
+ poa_ (PortableServer::POA::_duplicate (poa)),
+ rel_ (release)
+{}
+
+template <class T> ACE_INLINE
+POA_CORBA::LocalInterfaceDef_tie<T>::~LocalInterfaceDef_tie (void)
+{
+ if (this->rel_)
+ {
+ delete this->ptr_;
+ }
+}
+
+template <class T> ACE_INLINE T *
+POA_CORBA::LocalInterfaceDef_tie<T>::_tied_object (void)
+{
+ return this->ptr_;
+}
+
+template <class T> ACE_INLINE void
+POA_CORBA::LocalInterfaceDef_tie<T>::_tied_object (T &obj)
+{
+ if (this->rel_)
+ {
+ delete this->ptr_;
+ }
+
+ this->ptr_ = &obj;
+ this->rel_ = 0;
+}
+
+template <class T> ACE_INLINE void
+POA_CORBA::LocalInterfaceDef_tie<T>::_tied_object (T *obj, ::CORBA::Boolean release)
+{
+ if (this->rel_)
+ {
+ delete this->ptr_;
+ }
+
+ this->ptr_ = obj;
+ this->rel_ = release;
+}
+
+template <class T> ACE_INLINE ::CORBA::Boolean
+POA_CORBA::LocalInterfaceDef_tie<T>::_is_owner (void)
+{
+ return this->rel_;
+}
+
+template <class T> ACE_INLINE void
+POA_CORBA::LocalInterfaceDef_tie<T>::_is_owner ( ::CORBA::Boolean b)
+{
+ this->rel_ = b;
+}
+
+template <class T> ACE_INLINE PortableServer::POA_ptr
+POA_CORBA::LocalInterfaceDef_tie<T>::_default_POA (ACE_ENV_SINGLE_ARG_DECL)
+{
+ if (! ::CORBA::is_nil (this->poa_.in ()))
+ {
+ return PortableServer::POA::_duplicate (this->poa_.in ());
+ }
+
+ return this->LocalInterfaceDef::_default_POA (ACE_ENV_SINGLE_ARG_PARAMETER);
+}
+
+// TAO_IDL - Generated from
+// be\be_visitor_operation/tie_si.cpp:101
+
+template <class T> ACE_INLINE
+::CORBA::DefinitionKind POA_CORBA::LocalInterfaceDef_tie<T>::def_kind (
+ ACE_ENV_SINGLE_ARG_DECL
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ))
+{
+ return this->ptr_->def_kind (
+ ACE_ENV_SINGLE_ARG_PARAMETER
+ );
+}
+
+// TAO_IDL - Generated from
+// be\be_visitor_operation/tie_si.cpp:101
+
+template <class T> ACE_INLINE
+void POA_CORBA::LocalInterfaceDef_tie<T>::destroy (
+ ACE_ENV_SINGLE_ARG_DECL
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ))
+{
+ this->ptr_->destroy (
+ ACE_ENV_SINGLE_ARG_PARAMETER
+ );
+}
+
+// TAO_IDL - Generated from
+// be\be_visitor_operation/tie_si.cpp:101
+
+template <class T> ACE_INLINE
+::CORBA::Contained_ptr POA_CORBA::LocalInterfaceDef_tie<T>::lookup (
+ const char * search_name
+ ACE_ENV_ARG_DECL
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ))
+{
+ return this->ptr_->lookup (
+ search_name
+ ACE_ENV_ARG_PARAMETER
+ );
+}
+
+// TAO_IDL - Generated from
+// be\be_visitor_operation/tie_si.cpp:101
+
+template <class T> ACE_INLINE
+::CORBA::ContainedSeq * POA_CORBA::LocalInterfaceDef_tie<T>::contents (
+ ::CORBA::DefinitionKind limit_type,
+ ::CORBA::Boolean exclude_inherited
+ ACE_ENV_ARG_DECL
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ))
+{
+ return this->ptr_->contents (
+ limit_type,
+ exclude_inherited
+ ACE_ENV_ARG_PARAMETER
+ );
+}
+
+// TAO_IDL - Generated from
+// be\be_visitor_operation/tie_si.cpp:101
+
+template <class T> ACE_INLINE
+::CORBA::ContainedSeq * POA_CORBA::LocalInterfaceDef_tie<T>::lookup_name (
+ const char * search_name,
+ ::CORBA::Long levels_to_search,
+ ::CORBA::DefinitionKind limit_type,
+ ::CORBA::Boolean exclude_inherited
+ ACE_ENV_ARG_DECL
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ))
+{
+ return this->ptr_->lookup_name (
+ search_name,
+ levels_to_search,
+ limit_type,
+ exclude_inherited
+ ACE_ENV_ARG_PARAMETER
+ );
+}
+
+// TAO_IDL - Generated from
+// be\be_visitor_operation/tie_si.cpp:101
+
+template <class T> ACE_INLINE
+::CORBA::Container::DescriptionSeq * POA_CORBA::LocalInterfaceDef_tie<T>::describe_contents (
+ ::CORBA::DefinitionKind limit_type,
+ ::CORBA::Boolean exclude_inherited,
+ ::CORBA::Long max_returned_objs
+ ACE_ENV_ARG_DECL
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ))
+{
+ return this->ptr_->describe_contents (
+ limit_type,
+ exclude_inherited,
+ max_returned_objs
+ ACE_ENV_ARG_PARAMETER
+ );
+}
+
+// TAO_IDL - Generated from
+// be\be_visitor_operation/tie_si.cpp:101
+
+template <class T> ACE_INLINE
+::CORBA::ModuleDef_ptr POA_CORBA::LocalInterfaceDef_tie<T>::create_module (
+ const char * id,
+ const char * name,
+ const char * version
+ ACE_ENV_ARG_DECL
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ))
+{
+ return this->ptr_->create_module (
+ id,
+ name,
+ version
+ ACE_ENV_ARG_PARAMETER
+ );
+}
+
+// TAO_IDL - Generated from
+// be\be_visitor_operation/tie_si.cpp:101
+
+template <class T> ACE_INLINE
+::CORBA::ConstantDef_ptr POA_CORBA::LocalInterfaceDef_tie<T>::create_constant (
+ const char * id,
+ const char * name,
+ const char * version,
+ ::CORBA::IDLType_ptr type,
+ const ::CORBA::Any & value
+ ACE_ENV_ARG_DECL
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ))
+{
+ return this->ptr_->create_constant (
+ id,
+ name,
+ version,
+ type,
+ value
+ ACE_ENV_ARG_PARAMETER
+ );
+}
+
+// TAO_IDL - Generated from
+// be\be_visitor_operation/tie_si.cpp:101
+
+template <class T> ACE_INLINE
+::CORBA::StructDef_ptr POA_CORBA::LocalInterfaceDef_tie<T>::create_struct (
+ const char * id,
+ const char * name,
+ const char * version,
+ const ::CORBA::StructMemberSeq & members
+ ACE_ENV_ARG_DECL
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ))
+{
+ return this->ptr_->create_struct (
+ id,
+ name,
+ version,
+ members
+ ACE_ENV_ARG_PARAMETER
+ );
+}
+
+// TAO_IDL - Generated from
+// be\be_visitor_operation/tie_si.cpp:101
+
+template <class T> ACE_INLINE
+::CORBA::UnionDef_ptr POA_CORBA::LocalInterfaceDef_tie<T>::create_union (
+ const char * id,
+ const char * name,
+ const char * version,
+ ::CORBA::IDLType_ptr discriminator_type,
+ const ::CORBA::UnionMemberSeq & members
+ ACE_ENV_ARG_DECL
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ))
+{
+ return this->ptr_->create_union (
+ id,
+ name,
+ version,
+ discriminator_type,
+ members
+ ACE_ENV_ARG_PARAMETER
+ );
+}
+
+// TAO_IDL - Generated from
+// be\be_visitor_operation/tie_si.cpp:101
+
+template <class T> ACE_INLINE
+::CORBA::EnumDef_ptr POA_CORBA::LocalInterfaceDef_tie<T>::create_enum (
+ const char * id,
+ const char * name,
+ const char * version,
+ const ::CORBA::EnumMemberSeq & members
+ ACE_ENV_ARG_DECL
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ))
+{
+ return this->ptr_->create_enum (
+ id,
+ name,
+ version,
+ members
+ ACE_ENV_ARG_PARAMETER
+ );
+}
+
+// TAO_IDL - Generated from
+// be\be_visitor_operation/tie_si.cpp:101
+
+template <class T> ACE_INLINE
+::CORBA::AliasDef_ptr POA_CORBA::LocalInterfaceDef_tie<T>::create_alias (
+ const char * id,
+ const char * name,
+ const char * version,
+ ::CORBA::IDLType_ptr original_type
+ ACE_ENV_ARG_DECL
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ))
+{
+ return this->ptr_->create_alias (
+ id,
+ name,
+ version,
+ original_type
+ ACE_ENV_ARG_PARAMETER
+ );
+}
+
+// TAO_IDL - Generated from
+// be\be_visitor_operation/tie_si.cpp:101
+
+template <class T> ACE_INLINE
+::CORBA::InterfaceDef_ptr POA_CORBA::LocalInterfaceDef_tie<T>::create_interface (
+ const char * id,
+ const char * name,
+ const char * version,
+ const ::CORBA::InterfaceDefSeq & base_interfaces
+ ACE_ENV_ARG_DECL
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ))
+{
+ return this->ptr_->create_interface (
+ id,
+ name,
+ version,
+ base_interfaces
+ ACE_ENV_ARG_PARAMETER
+ );
+}
+
+// TAO_IDL - Generated from
+// be\be_visitor_operation/tie_si.cpp:101
+
+template <class T> ACE_INLINE
+::CORBA::ValueDef_ptr POA_CORBA::LocalInterfaceDef_tie<T>::create_value (
+ const char * id,
+ const char * name,
+ const char * version,
+ ::CORBA::Boolean is_custom,
+ ::CORBA::Boolean is_abstract,
+ ::CORBA::ValueDef_ptr base_value,
+ ::CORBA::Boolean is_truncatable,
+ const ::CORBA::ValueDefSeq & abstract_base_values,
+ const ::CORBA::InterfaceDefSeq & supported_interfaces,
+ const ::CORBA::InitializerSeq & initializers
+ ACE_ENV_ARG_DECL
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ))
+{
+ return this->ptr_->create_value (
+ id,
+ name,
+ version,
+ is_custom,
+ is_abstract,
+ base_value,
+ is_truncatable,
+ abstract_base_values,
+ supported_interfaces,
+ initializers
+ ACE_ENV_ARG_PARAMETER
+ );
+}
+
+// TAO_IDL - Generated from
+// be\be_visitor_operation/tie_si.cpp:101
+
+template <class T> ACE_INLINE
+::CORBA::ValueBoxDef_ptr POA_CORBA::LocalInterfaceDef_tie<T>::create_value_box (
+ const char * id,
+ const char * name,
+ const char * version,
+ ::CORBA::IDLType_ptr original_type_def
+ ACE_ENV_ARG_DECL
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ))
+{
+ return this->ptr_->create_value_box (
+ id,
+ name,
+ version,
+ original_type_def
+ ACE_ENV_ARG_PARAMETER
+ );
+}
+
+// TAO_IDL - Generated from
+// be\be_visitor_operation/tie_si.cpp:101
+
+template <class T> ACE_INLINE
+::CORBA::ExceptionDef_ptr POA_CORBA::LocalInterfaceDef_tie<T>::create_exception (
+ const char * id,
+ const char * name,
+ const char * version,
+ const ::CORBA::StructMemberSeq & members
+ ACE_ENV_ARG_DECL
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ))
+{
+ return this->ptr_->create_exception (
+ id,
+ name,
+ version,
+ members
+ ACE_ENV_ARG_PARAMETER
+ );
+}
+
+// TAO_IDL - Generated from
+// be\be_visitor_operation/tie_si.cpp:101
+
+template <class T> ACE_INLINE
+::CORBA::NativeDef_ptr POA_CORBA::LocalInterfaceDef_tie<T>::create_native (
+ const char * id,
+ const char * name,
+ const char * version
+ ACE_ENV_ARG_DECL
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ))
+{
+ return this->ptr_->create_native (
+ id,
+ name,
+ version
+ ACE_ENV_ARG_PARAMETER
+ );
+}
+
+// TAO_IDL - Generated from
+// be\be_visitor_operation/tie_si.cpp:101
+
+template <class T> ACE_INLINE
+::CORBA::AbstractInterfaceDef_ptr POA_CORBA::LocalInterfaceDef_tie<T>::create_abstract_interface (
+ const char * id,
+ const char * name,
+ const char * version,
+ const ::CORBA::AbstractInterfaceDefSeq & base_interfaces
+ ACE_ENV_ARG_DECL
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ))
+{
+ return this->ptr_->create_abstract_interface (
+ id,
+ name,
+ version,
+ base_interfaces
+ ACE_ENV_ARG_PARAMETER
+ );
+}
+
+// TAO_IDL - Generated from
+// be\be_visitor_operation/tie_si.cpp:101
+
+template <class T> ACE_INLINE
+::CORBA::LocalInterfaceDef_ptr POA_CORBA::LocalInterfaceDef_tie<T>::create_local_interface (
+ const char * id,
+ const char * name,
+ const char * version,
+ const ::CORBA::InterfaceDefSeq & base_interfaces
+ ACE_ENV_ARG_DECL
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ))
+{
+ return this->ptr_->create_local_interface (
+ id,
+ name,
+ version,
+ base_interfaces
+ ACE_ENV_ARG_PARAMETER
+ );
+}
+
+// TAO_IDL - Generated from
+// be\be_visitor_operation/tie_si.cpp:101
+
+template <class T> ACE_INLINE
+::CORBA::ExtValueDef_ptr POA_CORBA::LocalInterfaceDef_tie<T>::create_ext_value (
+ const char * id,
+ const char * name,
+ const char * version,
+ ::CORBA::Boolean is_custom,
+ ::CORBA::Boolean is_abstract,
+ ::CORBA::ValueDef_ptr base_value,
+ ::CORBA::Boolean is_truncatable,
+ const ::CORBA::ValueDefSeq & abstract_base_values,
+ const ::CORBA::InterfaceDefSeq & supported_interfaces,
+ const ::CORBA::ExtInitializerSeq & initializers
+ ACE_ENV_ARG_DECL
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ))
+{
+ return this->ptr_->create_ext_value (
+ id,
+ name,
+ version,
+ is_custom,
+ is_abstract,
+ base_value,
+ is_truncatable,
+ abstract_base_values,
+ supported_interfaces,
+ initializers
+ ACE_ENV_ARG_PARAMETER
+ );
+}
+
+// TAO_IDL - Generated from
+// be\be_visitor_operation/tie_si.cpp:101
+
+template <class T> ACE_INLINE
+char * POA_CORBA::LocalInterfaceDef_tie<T>::id (
+ ACE_ENV_SINGLE_ARG_DECL
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ))
+{
+ return this->ptr_->id (
+ ACE_ENV_SINGLE_ARG_PARAMETER
+ );
+}
+
+// TAO_IDL - Generated from
+// be\be_visitor_operation/tie_si.cpp:101
+
+template <class T> ACE_INLINE
+void POA_CORBA::LocalInterfaceDef_tie<T>::id (
+ const char * id
+ ACE_ENV_ARG_DECL
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ))
+{
+ this->ptr_->id (
+ id
+ ACE_ENV_ARG_PARAMETER
+ );
+}
+
+// TAO_IDL - Generated from
+// be\be_visitor_operation/tie_si.cpp:101
+
+template <class T> ACE_INLINE
+char * POA_CORBA::LocalInterfaceDef_tie<T>::name (
+ ACE_ENV_SINGLE_ARG_DECL
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ))
+{
+ return this->ptr_->name (
+ ACE_ENV_SINGLE_ARG_PARAMETER
+ );
+}
+
+// TAO_IDL - Generated from
+// be\be_visitor_operation/tie_si.cpp:101
+
+template <class T> ACE_INLINE
+void POA_CORBA::LocalInterfaceDef_tie<T>::name (
+ const char * name
+ ACE_ENV_ARG_DECL
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ))
+{
+ this->ptr_->name (
+ name
+ ACE_ENV_ARG_PARAMETER
+ );
+}
+
+// TAO_IDL - Generated from
+// be\be_visitor_operation/tie_si.cpp:101
+
+template <class T> ACE_INLINE
+char * POA_CORBA::LocalInterfaceDef_tie<T>::version (
+ ACE_ENV_SINGLE_ARG_DECL
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ))
+{
+ return this->ptr_->version (
+ ACE_ENV_SINGLE_ARG_PARAMETER
+ );
+}
+
+// TAO_IDL - Generated from
+// be\be_visitor_operation/tie_si.cpp:101
+
+template <class T> ACE_INLINE
+void POA_CORBA::LocalInterfaceDef_tie<T>::version (
+ const char * version
+ ACE_ENV_ARG_DECL
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ))
+{
+ this->ptr_->version (
+ version
+ ACE_ENV_ARG_PARAMETER
+ );
+}
+
+// TAO_IDL - Generated from
+// be\be_visitor_operation/tie_si.cpp:101
+
+template <class T> ACE_INLINE
+::CORBA::Container_ptr POA_CORBA::LocalInterfaceDef_tie<T>::defined_in (
+ ACE_ENV_SINGLE_ARG_DECL
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ))
+{
+ return this->ptr_->defined_in (
+ ACE_ENV_SINGLE_ARG_PARAMETER
+ );
+}
+
+// TAO_IDL - Generated from
+// be\be_visitor_operation/tie_si.cpp:101
+
+template <class T> ACE_INLINE
+char * POA_CORBA::LocalInterfaceDef_tie<T>::absolute_name (
+ ACE_ENV_SINGLE_ARG_DECL
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ))
+{
+ return this->ptr_->absolute_name (
+ ACE_ENV_SINGLE_ARG_PARAMETER
+ );
+}
+
+// TAO_IDL - Generated from
+// be\be_visitor_operation/tie_si.cpp:101
+
+template <class T> ACE_INLINE
+::CORBA::Repository_ptr POA_CORBA::LocalInterfaceDef_tie<T>::containing_repository (
+ ACE_ENV_SINGLE_ARG_DECL
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ))
+{
+ return this->ptr_->containing_repository (
+ ACE_ENV_SINGLE_ARG_PARAMETER
+ );
+}
+
+// TAO_IDL - Generated from
+// be\be_visitor_operation/tie_si.cpp:101
+
+template <class T> ACE_INLINE
+::CORBA::Contained::Description * POA_CORBA::LocalInterfaceDef_tie<T>::describe (
+ ACE_ENV_SINGLE_ARG_DECL
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ))
+{
+ return this->ptr_->describe (
+ ACE_ENV_SINGLE_ARG_PARAMETER
+ );
+}
+
+// TAO_IDL - Generated from
+// be\be_visitor_operation/tie_si.cpp:101
+
+template <class T> ACE_INLINE
+void POA_CORBA::LocalInterfaceDef_tie<T>::move (
+ ::CORBA::Container_ptr new_container,
+ const char * new_name,
+ const char * new_version
+ ACE_ENV_ARG_DECL
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ))
+{
+ this->ptr_->move (
+ new_container,
+ new_name,
+ new_version
+ ACE_ENV_ARG_PARAMETER
+ );
+}
+
+// TAO_IDL - Generated from
+// be\be_visitor_operation/tie_si.cpp:101
+
+template <class T> ACE_INLINE
+::CORBA::TypeCode_ptr POA_CORBA::LocalInterfaceDef_tie<T>::type (
+ ACE_ENV_SINGLE_ARG_DECL
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ))
+{
+ return this->ptr_->type (
+ ACE_ENV_SINGLE_ARG_PARAMETER
+ );
+}
+
+// TAO_IDL - Generated from
+// be\be_visitor_operation/tie_si.cpp:101
+
+template <class T> ACE_INLINE
+::CORBA::InterfaceDefSeq * POA_CORBA::LocalInterfaceDef_tie<T>::base_interfaces (
+ ACE_ENV_SINGLE_ARG_DECL
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ))
+{
+ return this->ptr_->base_interfaces (
+ ACE_ENV_SINGLE_ARG_PARAMETER
+ );
+}
+
+// TAO_IDL - Generated from
+// be\be_visitor_operation/tie_si.cpp:101
+
+template <class T> ACE_INLINE
+void POA_CORBA::LocalInterfaceDef_tie<T>::base_interfaces (
+ const ::CORBA::InterfaceDefSeq & base_interfaces
+ ACE_ENV_ARG_DECL
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ))
+{
+ this->ptr_->base_interfaces (
+ base_interfaces
+ ACE_ENV_ARG_PARAMETER
+ );
+}
+
+// TAO_IDL - Generated from
+// be\be_visitor_operation/tie_si.cpp:101
+
+template <class T> ACE_INLINE
+::CORBA::Boolean POA_CORBA::LocalInterfaceDef_tie<T>::is_a (
+ const char * interface_id
+ ACE_ENV_ARG_DECL
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ))
+{
+ return this->ptr_->is_a (
+ interface_id
+ ACE_ENV_ARG_PARAMETER
+ );
+}
+
+// TAO_IDL - Generated from
+// be\be_visitor_operation/tie_si.cpp:101
+
+template <class T> ACE_INLINE
+::CORBA::InterfaceDef::FullInterfaceDescription * POA_CORBA::LocalInterfaceDef_tie<T>::describe_interface (
+ ACE_ENV_SINGLE_ARG_DECL
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ))
+{
+ return this->ptr_->describe_interface (
+ ACE_ENV_SINGLE_ARG_PARAMETER
+ );
+}
+
+// TAO_IDL - Generated from
+// be\be_visitor_operation/tie_si.cpp:101
+
+template <class T> ACE_INLINE
+::CORBA::AttributeDef_ptr POA_CORBA::LocalInterfaceDef_tie<T>::create_attribute (
+ const char * id,
+ const char * name,
+ const char * version,
+ ::CORBA::IDLType_ptr type,
+ ::CORBA::AttributeMode mode
+ ACE_ENV_ARG_DECL
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ))
+{
+ return this->ptr_->create_attribute (
+ id,
+ name,
+ version,
+ type,
+ mode
+ ACE_ENV_ARG_PARAMETER
+ );
+}
+
+// TAO_IDL - Generated from
+// be\be_visitor_operation/tie_si.cpp:101
+
+template <class T> ACE_INLINE
+::CORBA::OperationDef_ptr POA_CORBA::LocalInterfaceDef_tie<T>::create_operation (
+ const char * id,
+ const char * name,
+ const char * version,
+ ::CORBA::IDLType_ptr result,
+ ::CORBA::OperationMode mode,
+ const ::CORBA::ParDescriptionSeq & params,
+ const ::CORBA::ExceptionDefSeq & exceptions,
+ const ::CORBA::ContextIdSeq & contexts
+ ACE_ENV_ARG_DECL
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ))
+{
+ return this->ptr_->create_operation (
+ id,
+ name,
+ version,
+ result,
+ mode,
+ params,
+ exceptions,
+ contexts
+ ACE_ENV_ARG_PARAMETER
+ );
+}
+
+// TAO_IDL - Generated from
+// be\be_visitor_interface/tie_si.cpp:96
+
+template <class T> ACE_INLINE
+POA_CORBA::ExtLocalInterfaceDef_tie<T>::ExtLocalInterfaceDef_tie (T &t)
+ : ptr_ (&t),
+ poa_ (PortableServer::POA::_nil ()),
+ rel_ (0)
+{}
+
+template <class T> ACE_INLINE
+POA_CORBA::ExtLocalInterfaceDef_tie<T>::ExtLocalInterfaceDef_tie (T &t, PortableServer::POA_ptr poa)
+ : ptr_ (&t),
+ poa_ (PortableServer::POA::_duplicate (poa)),
+ rel_ (0)
+{}
+
+template <class T> ACE_INLINE
+POA_CORBA::ExtLocalInterfaceDef_tie<T>::ExtLocalInterfaceDef_tie (T *tp, ::CORBA::Boolean release)
+ : ptr_ (tp),
+ poa_ (PortableServer::POA::_nil ()),
+ rel_ (release)
+{}
+
+template <class T> ACE_INLINE
+POA_CORBA::ExtLocalInterfaceDef_tie<T>::ExtLocalInterfaceDef_tie (T *tp, PortableServer::POA_ptr poa, ::CORBA::Boolean release)
+ : ptr_ (tp),
+ poa_ (PortableServer::POA::_duplicate (poa)),
+ rel_ (release)
+{}
+
+template <class T> ACE_INLINE
+POA_CORBA::ExtLocalInterfaceDef_tie<T>::~ExtLocalInterfaceDef_tie (void)
+{
+ if (this->rel_)
+ {
+ delete this->ptr_;
+ }
+}
+
+template <class T> ACE_INLINE T *
+POA_CORBA::ExtLocalInterfaceDef_tie<T>::_tied_object (void)
+{
+ return this->ptr_;
+}
+
+template <class T> ACE_INLINE void
+POA_CORBA::ExtLocalInterfaceDef_tie<T>::_tied_object (T &obj)
+{
+ if (this->rel_)
+ {
+ delete this->ptr_;
+ }
+
+ this->ptr_ = &obj;
+ this->rel_ = 0;
+}
+
+template <class T> ACE_INLINE void
+POA_CORBA::ExtLocalInterfaceDef_tie<T>::_tied_object (T *obj, ::CORBA::Boolean release)
+{
+ if (this->rel_)
+ {
+ delete this->ptr_;
+ }
+
+ this->ptr_ = obj;
+ this->rel_ = release;
+}
+
+template <class T> ACE_INLINE ::CORBA::Boolean
+POA_CORBA::ExtLocalInterfaceDef_tie<T>::_is_owner (void)
+{
+ return this->rel_;
+}
+
+template <class T> ACE_INLINE void
+POA_CORBA::ExtLocalInterfaceDef_tie<T>::_is_owner ( ::CORBA::Boolean b)
+{
+ this->rel_ = b;
+}
+
+template <class T> ACE_INLINE PortableServer::POA_ptr
+POA_CORBA::ExtLocalInterfaceDef_tie<T>::_default_POA (ACE_ENV_SINGLE_ARG_DECL)
+{
+ if (! ::CORBA::is_nil (this->poa_.in ()))
+ {
+ return PortableServer::POA::_duplicate (this->poa_.in ());
+ }
+
+ return this->ExtLocalInterfaceDef::_default_POA (ACE_ENV_SINGLE_ARG_PARAMETER);
+}
+
+// TAO_IDL - Generated from
+// be\be_visitor_operation/tie_si.cpp:101
+
+template <class T> ACE_INLINE
+::CORBA::DefinitionKind POA_CORBA::ExtLocalInterfaceDef_tie<T>::def_kind (
+ ACE_ENV_SINGLE_ARG_DECL
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ))
+{
+ return this->ptr_->def_kind (
+ ACE_ENV_SINGLE_ARG_PARAMETER
+ );
+}
+
+// TAO_IDL - Generated from
+// be\be_visitor_operation/tie_si.cpp:101
+
+template <class T> ACE_INLINE
+void POA_CORBA::ExtLocalInterfaceDef_tie<T>::destroy (
+ ACE_ENV_SINGLE_ARG_DECL
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ))
+{
+ this->ptr_->destroy (
+ ACE_ENV_SINGLE_ARG_PARAMETER
+ );
+}
+
+// TAO_IDL - Generated from
+// be\be_visitor_operation/tie_si.cpp:101
+
+template <class T> ACE_INLINE
+::CORBA::Contained_ptr POA_CORBA::ExtLocalInterfaceDef_tie<T>::lookup (
+ const char * search_name
+ ACE_ENV_ARG_DECL
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ))
+{
+ return this->ptr_->lookup (
+ search_name
+ ACE_ENV_ARG_PARAMETER
+ );
+}
+
+// TAO_IDL - Generated from
+// be\be_visitor_operation/tie_si.cpp:101
+
+template <class T> ACE_INLINE
+::CORBA::ContainedSeq * POA_CORBA::ExtLocalInterfaceDef_tie<T>::contents (
+ ::CORBA::DefinitionKind limit_type,
+ ::CORBA::Boolean exclude_inherited
+ ACE_ENV_ARG_DECL
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ))
+{
+ return this->ptr_->contents (
+ limit_type,
+ exclude_inherited
+ ACE_ENV_ARG_PARAMETER
+ );
+}
+
+// TAO_IDL - Generated from
+// be\be_visitor_operation/tie_si.cpp:101
+
+template <class T> ACE_INLINE
+::CORBA::ContainedSeq * POA_CORBA::ExtLocalInterfaceDef_tie<T>::lookup_name (
+ const char * search_name,
+ ::CORBA::Long levels_to_search,
+ ::CORBA::DefinitionKind limit_type,
+ ::CORBA::Boolean exclude_inherited
+ ACE_ENV_ARG_DECL
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ))
+{
+ return this->ptr_->lookup_name (
+ search_name,
+ levels_to_search,
+ limit_type,
+ exclude_inherited
+ ACE_ENV_ARG_PARAMETER
+ );
+}
+
+// TAO_IDL - Generated from
+// be\be_visitor_operation/tie_si.cpp:101
+
+template <class T> ACE_INLINE
+::CORBA::Container::DescriptionSeq * POA_CORBA::ExtLocalInterfaceDef_tie<T>::describe_contents (
+ ::CORBA::DefinitionKind limit_type,
+ ::CORBA::Boolean exclude_inherited,
+ ::CORBA::Long max_returned_objs
+ ACE_ENV_ARG_DECL
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ))
+{
+ return this->ptr_->describe_contents (
+ limit_type,
+ exclude_inherited,
+ max_returned_objs
+ ACE_ENV_ARG_PARAMETER
+ );
+}
+
+// TAO_IDL - Generated from
+// be\be_visitor_operation/tie_si.cpp:101
+
+template <class T> ACE_INLINE
+::CORBA::ModuleDef_ptr POA_CORBA::ExtLocalInterfaceDef_tie<T>::create_module (
+ const char * id,
+ const char * name,
+ const char * version
+ ACE_ENV_ARG_DECL
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ))
+{
+ return this->ptr_->create_module (
+ id,
+ name,
+ version
+ ACE_ENV_ARG_PARAMETER
+ );
+}
+
+// TAO_IDL - Generated from
+// be\be_visitor_operation/tie_si.cpp:101
+
+template <class T> ACE_INLINE
+::CORBA::ConstantDef_ptr POA_CORBA::ExtLocalInterfaceDef_tie<T>::create_constant (
+ const char * id,
+ const char * name,
+ const char * version,
+ ::CORBA::IDLType_ptr type,
+ const ::CORBA::Any & value
+ ACE_ENV_ARG_DECL
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ))
+{
+ return this->ptr_->create_constant (
+ id,
+ name,
+ version,
+ type,
+ value
+ ACE_ENV_ARG_PARAMETER
+ );
+}
+
+// TAO_IDL - Generated from
+// be\be_visitor_operation/tie_si.cpp:101
+
+template <class T> ACE_INLINE
+::CORBA::StructDef_ptr POA_CORBA::ExtLocalInterfaceDef_tie<T>::create_struct (
+ const char * id,
+ const char * name,
+ const char * version,
+ const ::CORBA::StructMemberSeq & members
+ ACE_ENV_ARG_DECL
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ))
+{
+ return this->ptr_->create_struct (
+ id,
+ name,
+ version,
+ members
+ ACE_ENV_ARG_PARAMETER
+ );
+}
+
+// TAO_IDL - Generated from
+// be\be_visitor_operation/tie_si.cpp:101
+
+template <class T> ACE_INLINE
+::CORBA::UnionDef_ptr POA_CORBA::ExtLocalInterfaceDef_tie<T>::create_union (
+ const char * id,
+ const char * name,
+ const char * version,
+ ::CORBA::IDLType_ptr discriminator_type,
+ const ::CORBA::UnionMemberSeq & members
+ ACE_ENV_ARG_DECL
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ))
+{
+ return this->ptr_->create_union (
+ id,
+ name,
+ version,
+ discriminator_type,
+ members
+ ACE_ENV_ARG_PARAMETER
+ );
+}
+
+// TAO_IDL - Generated from
+// be\be_visitor_operation/tie_si.cpp:101
+
+template <class T> ACE_INLINE
+::CORBA::EnumDef_ptr POA_CORBA::ExtLocalInterfaceDef_tie<T>::create_enum (
+ const char * id,
+ const char * name,
+ const char * version,
+ const ::CORBA::EnumMemberSeq & members
+ ACE_ENV_ARG_DECL
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ))
+{
+ return this->ptr_->create_enum (
+ id,
+ name,
+ version,
+ members
+ ACE_ENV_ARG_PARAMETER
+ );
+}
+
+// TAO_IDL - Generated from
+// be\be_visitor_operation/tie_si.cpp:101
+
+template <class T> ACE_INLINE
+::CORBA::AliasDef_ptr POA_CORBA::ExtLocalInterfaceDef_tie<T>::create_alias (
+ const char * id,
+ const char * name,
+ const char * version,
+ ::CORBA::IDLType_ptr original_type
+ ACE_ENV_ARG_DECL
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ))
+{
+ return this->ptr_->create_alias (
+ id,
+ name,
+ version,
+ original_type
+ ACE_ENV_ARG_PARAMETER
+ );
+}
+
+// TAO_IDL - Generated from
+// be\be_visitor_operation/tie_si.cpp:101
+
+template <class T> ACE_INLINE
+::CORBA::InterfaceDef_ptr POA_CORBA::ExtLocalInterfaceDef_tie<T>::create_interface (
+ const char * id,
+ const char * name,
+ const char * version,
+ const ::CORBA::InterfaceDefSeq & base_interfaces
+ ACE_ENV_ARG_DECL
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ))
+{
+ return this->ptr_->create_interface (
+ id,
+ name,
+ version,
+ base_interfaces
+ ACE_ENV_ARG_PARAMETER
+ );
+}
+
+// TAO_IDL - Generated from
+// be\be_visitor_operation/tie_si.cpp:101
+
+template <class T> ACE_INLINE
+::CORBA::ValueDef_ptr POA_CORBA::ExtLocalInterfaceDef_tie<T>::create_value (
+ const char * id,
+ const char * name,
+ const char * version,
+ ::CORBA::Boolean is_custom,
+ ::CORBA::Boolean is_abstract,
+ ::CORBA::ValueDef_ptr base_value,
+ ::CORBA::Boolean is_truncatable,
+ const ::CORBA::ValueDefSeq & abstract_base_values,
+ const ::CORBA::InterfaceDefSeq & supported_interfaces,
+ const ::CORBA::InitializerSeq & initializers
+ ACE_ENV_ARG_DECL
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ))
+{
+ return this->ptr_->create_value (
+ id,
+ name,
+ version,
+ is_custom,
+ is_abstract,
+ base_value,
+ is_truncatable,
+ abstract_base_values,
+ supported_interfaces,
+ initializers
+ ACE_ENV_ARG_PARAMETER
+ );
+}
+
+// TAO_IDL - Generated from
+// be\be_visitor_operation/tie_si.cpp:101
+
+template <class T> ACE_INLINE
+::CORBA::ValueBoxDef_ptr POA_CORBA::ExtLocalInterfaceDef_tie<T>::create_value_box (
+ const char * id,
+ const char * name,
+ const char * version,
+ ::CORBA::IDLType_ptr original_type_def
+ ACE_ENV_ARG_DECL
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ))
+{
+ return this->ptr_->create_value_box (
+ id,
+ name,
+ version,
+ original_type_def
+ ACE_ENV_ARG_PARAMETER
+ );
+}
+
+// TAO_IDL - Generated from
+// be\be_visitor_operation/tie_si.cpp:101
+
+template <class T> ACE_INLINE
+::CORBA::ExceptionDef_ptr POA_CORBA::ExtLocalInterfaceDef_tie<T>::create_exception (
+ const char * id,
+ const char * name,
+ const char * version,
+ const ::CORBA::StructMemberSeq & members
+ ACE_ENV_ARG_DECL
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ))
+{
+ return this->ptr_->create_exception (
+ id,
+ name,
+ version,
+ members
+ ACE_ENV_ARG_PARAMETER
+ );
+}
+
+// TAO_IDL - Generated from
+// be\be_visitor_operation/tie_si.cpp:101
+
+template <class T> ACE_INLINE
+::CORBA::NativeDef_ptr POA_CORBA::ExtLocalInterfaceDef_tie<T>::create_native (
+ const char * id,
+ const char * name,
+ const char * version
+ ACE_ENV_ARG_DECL
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ))
+{
+ return this->ptr_->create_native (
+ id,
+ name,
+ version
+ ACE_ENV_ARG_PARAMETER
+ );
+}
+
+// TAO_IDL - Generated from
+// be\be_visitor_operation/tie_si.cpp:101
+
+template <class T> ACE_INLINE
+::CORBA::AbstractInterfaceDef_ptr POA_CORBA::ExtLocalInterfaceDef_tie<T>::create_abstract_interface (
+ const char * id,
+ const char * name,
+ const char * version,
+ const ::CORBA::AbstractInterfaceDefSeq & base_interfaces
+ ACE_ENV_ARG_DECL
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ))
+{
+ return this->ptr_->create_abstract_interface (
+ id,
+ name,
+ version,
+ base_interfaces
+ ACE_ENV_ARG_PARAMETER
+ );
+}
+
+// TAO_IDL - Generated from
+// be\be_visitor_operation/tie_si.cpp:101
+
+template <class T> ACE_INLINE
+::CORBA::LocalInterfaceDef_ptr POA_CORBA::ExtLocalInterfaceDef_tie<T>::create_local_interface (
+ const char * id,
+ const char * name,
+ const char * version,
+ const ::CORBA::InterfaceDefSeq & base_interfaces
+ ACE_ENV_ARG_DECL
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ))
+{
+ return this->ptr_->create_local_interface (
+ id,
+ name,
+ version,
+ base_interfaces
+ ACE_ENV_ARG_PARAMETER
+ );
+}
+
+// TAO_IDL - Generated from
+// be\be_visitor_operation/tie_si.cpp:101
+
+template <class T> ACE_INLINE
+::CORBA::ExtValueDef_ptr POA_CORBA::ExtLocalInterfaceDef_tie<T>::create_ext_value (
+ const char * id,
+ const char * name,
+ const char * version,
+ ::CORBA::Boolean is_custom,
+ ::CORBA::Boolean is_abstract,
+ ::CORBA::ValueDef_ptr base_value,
+ ::CORBA::Boolean is_truncatable,
+ const ::CORBA::ValueDefSeq & abstract_base_values,
+ const ::CORBA::InterfaceDefSeq & supported_interfaces,
+ const ::CORBA::ExtInitializerSeq & initializers
+ ACE_ENV_ARG_DECL
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ))
+{
+ return this->ptr_->create_ext_value (
+ id,
+ name,
+ version,
+ is_custom,
+ is_abstract,
+ base_value,
+ is_truncatable,
+ abstract_base_values,
+ supported_interfaces,
+ initializers
+ ACE_ENV_ARG_PARAMETER
+ );
+}
+
+// TAO_IDL - Generated from
+// be\be_visitor_operation/tie_si.cpp:101
+
+template <class T> ACE_INLINE
+char * POA_CORBA::ExtLocalInterfaceDef_tie<T>::id (
+ ACE_ENV_SINGLE_ARG_DECL
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ))
+{
+ return this->ptr_->id (
+ ACE_ENV_SINGLE_ARG_PARAMETER
+ );
+}
+
+// TAO_IDL - Generated from
+// be\be_visitor_operation/tie_si.cpp:101
+
+template <class T> ACE_INLINE
+void POA_CORBA::ExtLocalInterfaceDef_tie<T>::id (
+ const char * id
+ ACE_ENV_ARG_DECL
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ))
+{
+ this->ptr_->id (
+ id
+ ACE_ENV_ARG_PARAMETER
+ );
+}
+
+// TAO_IDL - Generated from
+// be\be_visitor_operation/tie_si.cpp:101
+
+template <class T> ACE_INLINE
+char * POA_CORBA::ExtLocalInterfaceDef_tie<T>::name (
+ ACE_ENV_SINGLE_ARG_DECL
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ))
+{
+ return this->ptr_->name (
+ ACE_ENV_SINGLE_ARG_PARAMETER
+ );
+}
+
+// TAO_IDL - Generated from
+// be\be_visitor_operation/tie_si.cpp:101
+
+template <class T> ACE_INLINE
+void POA_CORBA::ExtLocalInterfaceDef_tie<T>::name (
+ const char * name
+ ACE_ENV_ARG_DECL
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ))
+{
+ this->ptr_->name (
+ name
+ ACE_ENV_ARG_PARAMETER
+ );
+}
+
+// TAO_IDL - Generated from
+// be\be_visitor_operation/tie_si.cpp:101
+
+template <class T> ACE_INLINE
+char * POA_CORBA::ExtLocalInterfaceDef_tie<T>::version (
+ ACE_ENV_SINGLE_ARG_DECL
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ))
+{
+ return this->ptr_->version (
+ ACE_ENV_SINGLE_ARG_PARAMETER
+ );
+}
+
+// TAO_IDL - Generated from
+// be\be_visitor_operation/tie_si.cpp:101
+
+template <class T> ACE_INLINE
+void POA_CORBA::ExtLocalInterfaceDef_tie<T>::version (
+ const char * version
+ ACE_ENV_ARG_DECL
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ))
+{
+ this->ptr_->version (
+ version
+ ACE_ENV_ARG_PARAMETER
+ );
+}
+
+// TAO_IDL - Generated from
+// be\be_visitor_operation/tie_si.cpp:101
+
+template <class T> ACE_INLINE
+::CORBA::Container_ptr POA_CORBA::ExtLocalInterfaceDef_tie<T>::defined_in (
+ ACE_ENV_SINGLE_ARG_DECL
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ))
+{
+ return this->ptr_->defined_in (
+ ACE_ENV_SINGLE_ARG_PARAMETER
+ );
+}
+
+// TAO_IDL - Generated from
+// be\be_visitor_operation/tie_si.cpp:101
+
+template <class T> ACE_INLINE
+char * POA_CORBA::ExtLocalInterfaceDef_tie<T>::absolute_name (
+ ACE_ENV_SINGLE_ARG_DECL
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ))
+{
+ return this->ptr_->absolute_name (
+ ACE_ENV_SINGLE_ARG_PARAMETER
+ );
+}
+
+// TAO_IDL - Generated from
+// be\be_visitor_operation/tie_si.cpp:101
+
+template <class T> ACE_INLINE
+::CORBA::Repository_ptr POA_CORBA::ExtLocalInterfaceDef_tie<T>::containing_repository (
+ ACE_ENV_SINGLE_ARG_DECL
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ))
+{
+ return this->ptr_->containing_repository (
+ ACE_ENV_SINGLE_ARG_PARAMETER
+ );
+}
+
+// TAO_IDL - Generated from
+// be\be_visitor_operation/tie_si.cpp:101
+
+template <class T> ACE_INLINE
+::CORBA::Contained::Description * POA_CORBA::ExtLocalInterfaceDef_tie<T>::describe (
+ ACE_ENV_SINGLE_ARG_DECL
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ))
+{
+ return this->ptr_->describe (
+ ACE_ENV_SINGLE_ARG_PARAMETER
+ );
+}
+
+// TAO_IDL - Generated from
+// be\be_visitor_operation/tie_si.cpp:101
+
+template <class T> ACE_INLINE
+void POA_CORBA::ExtLocalInterfaceDef_tie<T>::move (
+ ::CORBA::Container_ptr new_container,
+ const char * new_name,
+ const char * new_version
+ ACE_ENV_ARG_DECL
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ))
+{
+ this->ptr_->move (
+ new_container,
+ new_name,
+ new_version
+ ACE_ENV_ARG_PARAMETER
+ );
+}
+
+// TAO_IDL - Generated from
+// be\be_visitor_operation/tie_si.cpp:101
+
+template <class T> ACE_INLINE
+::CORBA::TypeCode_ptr POA_CORBA::ExtLocalInterfaceDef_tie<T>::type (
+ ACE_ENV_SINGLE_ARG_DECL
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ))
+{
+ return this->ptr_->type (
+ ACE_ENV_SINGLE_ARG_PARAMETER
+ );
+}
+
+// TAO_IDL - Generated from
+// be\be_visitor_operation/tie_si.cpp:101
+
+template <class T> ACE_INLINE
+::CORBA::InterfaceDefSeq * POA_CORBA::ExtLocalInterfaceDef_tie<T>::base_interfaces (
+ ACE_ENV_SINGLE_ARG_DECL
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ))
+{
+ return this->ptr_->base_interfaces (
+ ACE_ENV_SINGLE_ARG_PARAMETER
+ );
+}
+
+// TAO_IDL - Generated from
+// be\be_visitor_operation/tie_si.cpp:101
+
+template <class T> ACE_INLINE
+void POA_CORBA::ExtLocalInterfaceDef_tie<T>::base_interfaces (
+ const ::CORBA::InterfaceDefSeq & base_interfaces
+ ACE_ENV_ARG_DECL
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ))
+{
+ this->ptr_->base_interfaces (
+ base_interfaces
+ ACE_ENV_ARG_PARAMETER
+ );
+}
+
+// TAO_IDL - Generated from
+// be\be_visitor_operation/tie_si.cpp:101
+
+template <class T> ACE_INLINE
+::CORBA::Boolean POA_CORBA::ExtLocalInterfaceDef_tie<T>::is_a (
+ const char * interface_id
+ ACE_ENV_ARG_DECL
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ))
+{
+ return this->ptr_->is_a (
+ interface_id
+ ACE_ENV_ARG_PARAMETER
+ );
+}
+
+// TAO_IDL - Generated from
+// be\be_visitor_operation/tie_si.cpp:101
+
+template <class T> ACE_INLINE
+::CORBA::InterfaceDef::FullInterfaceDescription * POA_CORBA::ExtLocalInterfaceDef_tie<T>::describe_interface (
+ ACE_ENV_SINGLE_ARG_DECL
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ))
+{
+ return this->ptr_->describe_interface (
+ ACE_ENV_SINGLE_ARG_PARAMETER
+ );
+}
+
+// TAO_IDL - Generated from
+// be\be_visitor_operation/tie_si.cpp:101
+
+template <class T> ACE_INLINE
+::CORBA::AttributeDef_ptr POA_CORBA::ExtLocalInterfaceDef_tie<T>::create_attribute (
+ const char * id,
+ const char * name,
+ const char * version,
+ ::CORBA::IDLType_ptr type,
+ ::CORBA::AttributeMode mode
+ ACE_ENV_ARG_DECL
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ))
+{
+ return this->ptr_->create_attribute (
+ id,
+ name,
+ version,
+ type,
+ mode
+ ACE_ENV_ARG_PARAMETER
+ );
+}
+
+// TAO_IDL - Generated from
+// be\be_visitor_operation/tie_si.cpp:101
+
+template <class T> ACE_INLINE
+::CORBA::OperationDef_ptr POA_CORBA::ExtLocalInterfaceDef_tie<T>::create_operation (
+ const char * id,
+ const char * name,
+ const char * version,
+ ::CORBA::IDLType_ptr result,
+ ::CORBA::OperationMode mode,
+ const ::CORBA::ParDescriptionSeq & params,
+ const ::CORBA::ExceptionDefSeq & exceptions,
+ const ::CORBA::ContextIdSeq & contexts
+ ACE_ENV_ARG_DECL
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ))
+{
+ return this->ptr_->create_operation (
+ id,
+ name,
+ version,
+ result,
+ mode,
+ params,
+ exceptions,
+ contexts
+ ACE_ENV_ARG_PARAMETER
+ );
+}
+
+// TAO_IDL - Generated from
+// be\be_visitor_operation/tie_si.cpp:101
+
+template <class T> ACE_INLINE
+::CORBA::InterfaceAttrExtension::ExtFullInterfaceDescription * POA_CORBA::ExtLocalInterfaceDef_tie<T>::describe_ext_interface (
+ ACE_ENV_SINGLE_ARG_DECL
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ))
+{
+ return this->ptr_->describe_ext_interface (
+ ACE_ENV_SINGLE_ARG_PARAMETER
+ );
+}
+
+// TAO_IDL - Generated from
+// be\be_visitor_operation/tie_si.cpp:101
+
+template <class T> ACE_INLINE
+::CORBA::ExtAttributeDef_ptr POA_CORBA::ExtLocalInterfaceDef_tie<T>::create_ext_attribute (
+ const char * id,
+ const char * name,
+ const char * version,
+ ::CORBA::IDLType_ptr type,
+ ::CORBA::AttributeMode mode,
+ const ::CORBA::ExceptionDefSeq & get_exceptions,
+ const ::CORBA::ExceptionDefSeq & set_exceptions
+ ACE_ENV_ARG_DECL
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ))
+{
+ return this->ptr_->create_ext_attribute (
+ id,
+ name,
+ version,
+ type,
+ mode,
+ get_exceptions,
+ set_exceptions
+ ACE_ENV_ARG_PARAMETER
+ );
+}
+
+
+TAO_END_VERSIONED_NAMESPACE_DECL
+
diff --git a/TAO/orbsvcs/orbsvcs/IFRService/IFR_ComponentsS.cpp b/TAO/orbsvcs/orbsvcs/IFRService/IFR_ComponentsS.cpp
new file mode 100644
index 00000000000..1e7fe4beb0c
--- /dev/null
+++ b/TAO/orbsvcs/orbsvcs/IFRService/IFR_ComponentsS.cpp
@@ -0,0 +1,14264 @@
+// -*- C++ -*-
+//
+// $Id$
+
+// **** Code generated by the The ACE ORB (TAO) IDL Compiler ****
+// TAO and the TAO IDL Compiler have been developed by:
+// Center for Distributed Object Computing
+// Washington University
+// St. Louis, MO
+// USA
+// http://www.cs.wustl.edu/~schmidt/doc-center.html
+// and
+// Distributed Object Computing Laboratory
+// University of California at Irvine
+// Irvine, CA
+// USA
+// http://doc.ece.uci.edu/
+// and
+// Institute for Software Integrated Systems
+// Vanderbilt University
+// Nashville, TN
+// USA
+// http://www.isis.vanderbilt.edu/
+//
+// Information about TAO is available at:
+// http://www.cs.wustl.edu/~schmidt/TAO.html
+
+
+// TAO_IDL - Generated from
+// be\be_codegen.cpp:603
+
+#ifndef _TAO_IDL____ORBSVCS_ORBSVCS_IFRSERVICE_IFR_COMPONENTSS_CPP_
+#define _TAO_IDL____ORBSVCS_ORBSVCS_IFRSERVICE_IFR_COMPONENTSS_CPP_
+
+
+#include "IFR_ComponentsS.h"
+#include "tao/PortableServer/Operation_Table_Perfect_Hash.h"
+#include "tao/PortableServer/Upcall_Command.h"
+#include "tao/PortableServer/Upcall_Wrapper.h"
+#include "tao/TAO_Server_Request.h"
+#include "tao/ORB_Core.h"
+#include "tao/Profile.h"
+#include "tao/Stub.h"
+#include "tao/IFR_Client_Adapter.h"
+#include "tao/Object_T.h"
+#include "tao/AnyTypeCode/TypeCode.h"
+#include "tao/AnyTypeCode/DynamicC.h"
+#include "tao/CDR.h"
+#include "tao/operation_details.h"
+#include "tao/PortableInterceptor.h"
+#include "tao/PortableServer/Basic_SArguments.h"
+#include "tao/PortableServer/Object_SArgument_T.h"
+#include "tao/PortableServer/Special_Basic_SArguments.h"
+#include "tao/PortableServer/UB_String_SArguments.h"
+#include "tao/PortableServer/Var_Size_SArgument_T.h"
+#include "tao/PortableServer/TypeCode_SArg_Traits.h"
+#include "tao/PortableServer/Object_SArg_Traits.h"
+#include "tao/PortableServer/get_arg.h"
+#include "tao/Special_Basic_Arguments.h"
+#include "tao/UB_String_Arguments.h"
+#include "tao/Basic_Arguments.h"
+#include "tao/Object_Argument_T.h"
+#include "tao/Special_Basic_Arguments.h"
+#include "tao/UB_String_Arguments.h"
+#include "tao/Var_Size_Argument_T.h"
+#include "ace/Dynamic_Service.h"
+#include "ace/Malloc_Allocator.h"
+
+#if !defined (__ACE_INLINE__)
+#include "IFR_ComponentsS.inl"
+#endif /* !defined INLINE */
+
+TAO_BEGIN_VERSIONED_NAMESPACE_DECL
+
+
+
+// TAO_IDL - Generated from
+// be\be_visitor_arg_traits.cpp:72
+
+
+TAO_END_VERSIONED_NAMESPACE_DECL
+
+
+TAO_BEGIN_VERSIONED_NAMESPACE_DECL
+
+
+// Arg traits specializations.
+namespace TAO
+{
+
+ // TAO_IDL - Generated from
+ // be\be_visitor_arg_traits.cpp:817
+
+#if !defined (_CORBA_DEFINITIONKIND__SARG_TRAITS_)
+#define _CORBA_DEFINITIONKIND__SARG_TRAITS_
+
+ template<>
+ class SArg_Traits<CORBA::DefinitionKind>
+ : public
+ Basic_SArg_Traits_T<
+ CORBA::DefinitionKind,
+ TAO::Any_Insert_Policy_Stream <CORBA::DefinitionKind>
+ >
+ {
+ };
+
+#endif /* end #if !defined */
+
+ // TAO_IDL - Generated from
+ // be\be_visitor_arg_traits.cpp:140
+
+#if !defined (_CORBA_REPOSITORY__SARG_TRAITS_)
+#define _CORBA_REPOSITORY__SARG_TRAITS_
+
+ template<>
+ class SArg_Traits<CORBA::Repository>
+ : public
+ Object_SArg_Traits_T<
+ CORBA::Repository_ptr,
+ CORBA::Repository_var,
+ CORBA::Repository_out,
+ TAO::Any_Insert_Policy_Stream <CORBA::Repository_ptr>
+ >
+ {
+ };
+
+#endif /* end #if !defined */
+
+ // TAO_IDL - Generated from
+ // be\be_visitor_arg_traits.cpp:140
+
+#if !defined (_CORBA_CONTAINER__SARG_TRAITS_)
+#define _CORBA_CONTAINER__SARG_TRAITS_
+
+ template<>
+ class SArg_Traits<CORBA::Container>
+ : public
+ Object_SArg_Traits_T<
+ CORBA::Container_ptr,
+ CORBA::Container_var,
+ CORBA::Container_out,
+ TAO::Any_Insert_Policy_Stream <CORBA::Container_ptr>
+ >
+ {
+ };
+
+#endif /* end #if !defined */
+
+ // TAO_IDL - Generated from
+ // be\be_visitor_arg_traits.cpp:140
+
+#if !defined (_CORBA_IDLTYPE__SARG_TRAITS_)
+#define _CORBA_IDLTYPE__SARG_TRAITS_
+
+ template<>
+ class SArg_Traits<CORBA::IDLType>
+ : public
+ Object_SArg_Traits_T<
+ CORBA::IDLType_ptr,
+ CORBA::IDLType_var,
+ CORBA::IDLType_out,
+ TAO::Any_Insert_Policy_Stream <CORBA::IDLType_ptr>
+ >
+ {
+ };
+
+#endif /* end #if !defined */
+
+ // TAO_IDL - Generated from
+ // be\be_visitor_arg_traits.cpp:611
+
+#if !defined (_CORBA_INTERFACEDEFSEQ__SARG_TRAITS_)
+#define _CORBA_INTERFACEDEFSEQ__SARG_TRAITS_
+
+ template<>
+ class SArg_Traits<CORBA::InterfaceDefSeq>
+ : public
+ Var_Size_SArg_Traits_T<
+ CORBA::InterfaceDefSeq,
+ TAO::Any_Insert_Policy_Stream <CORBA::InterfaceDefSeq>
+ >
+ {
+ };
+
+#endif /* end #if !defined */
+
+ // TAO_IDL - Generated from
+ // be\be_visitor_arg_traits.cpp:611
+
+#if !defined (_CORBA_VALUEDEFSEQ__SARG_TRAITS_)
+#define _CORBA_VALUEDEFSEQ__SARG_TRAITS_
+
+ template<>
+ class SArg_Traits<CORBA::ValueDefSeq>
+ : public
+ Var_Size_SArg_Traits_T<
+ CORBA::ValueDefSeq,
+ TAO::Any_Insert_Policy_Stream <CORBA::ValueDefSeq>
+ >
+ {
+ };
+
+#endif /* end #if !defined */
+
+ // TAO_IDL - Generated from
+ // be\be_visitor_arg_traits.cpp:611
+
+#if !defined (_CORBA_INITIALIZERSEQ__SARG_TRAITS_)
+#define _CORBA_INITIALIZERSEQ__SARG_TRAITS_
+
+ template<>
+ class SArg_Traits<CORBA::InitializerSeq>
+ : public
+ Var_Size_SArg_Traits_T<
+ CORBA::InitializerSeq,
+ TAO::Any_Insert_Policy_Stream <CORBA::InitializerSeq>
+ >
+ {
+ };
+
+#endif /* end #if !defined */
+
+ // TAO_IDL - Generated from
+ // be\be_visitor_arg_traits.cpp:611
+
+#if !defined (_CORBA_EXTINITIALIZERSEQ__SARG_TRAITS_)
+#define _CORBA_EXTINITIALIZERSEQ__SARG_TRAITS_
+
+ template<>
+ class SArg_Traits<CORBA::ExtInitializerSeq>
+ : public
+ Var_Size_SArg_Traits_T<
+ CORBA::ExtInitializerSeq,
+ TAO::Any_Insert_Policy_Stream <CORBA::ExtInitializerSeq>
+ >
+ {
+ };
+
+#endif /* end #if !defined */
+
+ // TAO_IDL - Generated from
+ // be\be_visitor_arg_traits.cpp:611
+
+#if !defined (_CORBA_EXCEPTIONDEFSEQ__SARG_TRAITS_)
+#define _CORBA_EXCEPTIONDEFSEQ__SARG_TRAITS_
+
+ template<>
+ class SArg_Traits<CORBA::ExceptionDefSeq>
+ : public
+ Var_Size_SArg_Traits_T<
+ CORBA::ExceptionDefSeq,
+ TAO::Any_Insert_Policy_Stream <CORBA::ExceptionDefSeq>
+ >
+ {
+ };
+
+#endif /* end #if !defined */
+
+ // TAO_IDL - Generated from
+ // be\be_visitor_arg_traits.cpp:817
+
+#if !defined (_CORBA_OPERATIONMODE__SARG_TRAITS_)
+#define _CORBA_OPERATIONMODE__SARG_TRAITS_
+
+ template<>
+ class SArg_Traits<CORBA::OperationMode>
+ : public
+ Basic_SArg_Traits_T<
+ CORBA::OperationMode,
+ TAO::Any_Insert_Policy_Stream <CORBA::OperationMode>
+ >
+ {
+ };
+
+#endif /* end #if !defined */
+
+ // TAO_IDL - Generated from
+ // be\be_visitor_arg_traits.cpp:611
+
+#if !defined (_CORBA_PARDESCRIPTIONSEQ__SARG_TRAITS_)
+#define _CORBA_PARDESCRIPTIONSEQ__SARG_TRAITS_
+
+ template<>
+ class SArg_Traits<CORBA::ParDescriptionSeq>
+ : public
+ Var_Size_SArg_Traits_T<
+ CORBA::ParDescriptionSeq,
+ TAO::Any_Insert_Policy_Stream <CORBA::ParDescriptionSeq>
+ >
+ {
+ };
+
+#endif /* end #if !defined */
+
+ // TAO_IDL - Generated from
+ // be\be_visitor_arg_traits.cpp:611
+
+#if !defined (_CORBA_CONTEXTIDSEQ__SARG_TRAITS_)
+#define _CORBA_CONTEXTIDSEQ__SARG_TRAITS_
+
+ template<>
+ class SArg_Traits<CORBA::ContextIdSeq>
+ : public
+ Var_Size_SArg_Traits_T<
+ CORBA::ContextIdSeq,
+ TAO::Any_Insert_Policy_Stream <CORBA::ContextIdSeq>
+ >
+ {
+ };
+
+#endif /* end #if !defined */
+
+ // TAO_IDL - Generated from
+ // be\be_visitor_arg_traits.cpp:140
+
+#if !defined (_CORBA_INTERFACEDEF__SARG_TRAITS_)
+#define _CORBA_INTERFACEDEF__SARG_TRAITS_
+
+ template<>
+ class SArg_Traits<CORBA::InterfaceDef>
+ : public
+ Object_SArg_Traits_T<
+ CORBA::InterfaceDef_ptr,
+ CORBA::InterfaceDef_var,
+ CORBA::InterfaceDef_out,
+ TAO::Any_Insert_Policy_Stream <CORBA::InterfaceDef_ptr>
+ >
+ {
+ };
+
+#endif /* end #if !defined */
+
+ // TAO_IDL - Generated from
+ // be\be_visitor_arg_traits.cpp:140
+
+#if !defined (_CORBA_VALUEDEF__SARG_TRAITS_)
+#define _CORBA_VALUEDEF__SARG_TRAITS_
+
+ template<>
+ class SArg_Traits<CORBA::ValueDef>
+ : public
+ Object_SArg_Traits_T<
+ CORBA::ValueDef_ptr,
+ CORBA::ValueDef_var,
+ CORBA::ValueDef_out,
+ TAO::Any_Insert_Policy_Stream <CORBA::ValueDef_ptr>
+ >
+ {
+ };
+
+#endif /* end #if !defined */
+
+ // TAO_IDL - Generated from
+ // be\be_visitor_arg_traits.cpp:140
+
+#if !defined (_CORBA_COMPONENTIR_COMPONENTDEF__SARG_TRAITS_)
+#define _CORBA_COMPONENTIR_COMPONENTDEF__SARG_TRAITS_
+
+ template<>
+ class SArg_Traits<CORBA::ComponentIR::ComponentDef>
+ : public
+ Object_SArg_Traits_T<
+ CORBA::ComponentIR::ComponentDef_ptr,
+ CORBA::ComponentIR::ComponentDef_var,
+ CORBA::ComponentIR::ComponentDef_out,
+ TAO::Any_Insert_Policy_Stream <CORBA::ComponentIR::ComponentDef_ptr>
+ >
+ {
+ };
+
+#endif /* end #if !defined */
+
+ // TAO_IDL - Generated from
+ // be\be_visitor_arg_traits.cpp:140
+
+#if !defined (_CORBA_COMPONENTIR_HOMEDEF__SARG_TRAITS_)
+#define _CORBA_COMPONENTIR_HOMEDEF__SARG_TRAITS_
+
+ template<>
+ class SArg_Traits<CORBA::ComponentIR::HomeDef>
+ : public
+ Object_SArg_Traits_T<
+ CORBA::ComponentIR::HomeDef_ptr,
+ CORBA::ComponentIR::HomeDef_var,
+ CORBA::ComponentIR::HomeDef_out,
+ TAO::Any_Insert_Policy_Stream <CORBA::ComponentIR::HomeDef_ptr>
+ >
+ {
+ };
+
+#endif /* end #if !defined */
+
+ // TAO_IDL - Generated from
+ // be\be_visitor_arg_traits.cpp:140
+
+#if !defined (_CORBA_COMPONENTIR_EVENTDEF__SARG_TRAITS_)
+#define _CORBA_COMPONENTIR_EVENTDEF__SARG_TRAITS_
+
+ template<>
+ class SArg_Traits<CORBA::ComponentIR::EventDef>
+ : public
+ Object_SArg_Traits_T<
+ CORBA::ComponentIR::EventDef_ptr,
+ CORBA::ComponentIR::EventDef_var,
+ CORBA::ComponentIR::EventDef_out,
+ TAO::Any_Insert_Policy_Stream <CORBA::ComponentIR::EventDef_ptr>
+ >
+ {
+ };
+
+#endif /* end #if !defined */
+
+ // TAO_IDL - Generated from
+ // be\be_visitor_arg_traits.cpp:140
+
+#if !defined (_CORBA_COMPONENTIR_PROVIDESDEF__SARG_TRAITS_)
+#define _CORBA_COMPONENTIR_PROVIDESDEF__SARG_TRAITS_
+
+ template<>
+ class SArg_Traits<CORBA::ComponentIR::ProvidesDef>
+ : public
+ Object_SArg_Traits_T<
+ CORBA::ComponentIR::ProvidesDef_ptr,
+ CORBA::ComponentIR::ProvidesDef_var,
+ CORBA::ComponentIR::ProvidesDef_out,
+ TAO::Any_Insert_Policy_Stream <CORBA::ComponentIR::ProvidesDef_ptr>
+ >
+ {
+ };
+
+#endif /* end #if !defined */
+
+ // TAO_IDL - Generated from
+ // be\be_visitor_arg_traits.cpp:140
+
+#if !defined (_CORBA_COMPONENTIR_USESDEF__SARG_TRAITS_)
+#define _CORBA_COMPONENTIR_USESDEF__SARG_TRAITS_
+
+ template<>
+ class SArg_Traits<CORBA::ComponentIR::UsesDef>
+ : public
+ Object_SArg_Traits_T<
+ CORBA::ComponentIR::UsesDef_ptr,
+ CORBA::ComponentIR::UsesDef_var,
+ CORBA::ComponentIR::UsesDef_out,
+ TAO::Any_Insert_Policy_Stream <CORBA::ComponentIR::UsesDef_ptr>
+ >
+ {
+ };
+
+#endif /* end #if !defined */
+
+ // TAO_IDL - Generated from
+ // be\be_visitor_arg_traits.cpp:140
+
+#if !defined (_CORBA_COMPONENTIR_EMITSDEF__SARG_TRAITS_)
+#define _CORBA_COMPONENTIR_EMITSDEF__SARG_TRAITS_
+
+ template<>
+ class SArg_Traits<CORBA::ComponentIR::EmitsDef>
+ : public
+ Object_SArg_Traits_T<
+ CORBA::ComponentIR::EmitsDef_ptr,
+ CORBA::ComponentIR::EmitsDef_var,
+ CORBA::ComponentIR::EmitsDef_out,
+ TAO::Any_Insert_Policy_Stream <CORBA::ComponentIR::EmitsDef_ptr>
+ >
+ {
+ };
+
+#endif /* end #if !defined */
+
+ // TAO_IDL - Generated from
+ // be\be_visitor_arg_traits.cpp:140
+
+#if !defined (_CORBA_COMPONENTIR_PUBLISHESDEF__SARG_TRAITS_)
+#define _CORBA_COMPONENTIR_PUBLISHESDEF__SARG_TRAITS_
+
+ template<>
+ class SArg_Traits<CORBA::ComponentIR::PublishesDef>
+ : public
+ Object_SArg_Traits_T<
+ CORBA::ComponentIR::PublishesDef_ptr,
+ CORBA::ComponentIR::PublishesDef_var,
+ CORBA::ComponentIR::PublishesDef_out,
+ TAO::Any_Insert_Policy_Stream <CORBA::ComponentIR::PublishesDef_ptr>
+ >
+ {
+ };
+
+#endif /* end #if !defined */
+
+ // TAO_IDL - Generated from
+ // be\be_visitor_arg_traits.cpp:140
+
+#if !defined (_CORBA_COMPONENTIR_CONSUMESDEF__SARG_TRAITS_)
+#define _CORBA_COMPONENTIR_CONSUMESDEF__SARG_TRAITS_
+
+ template<>
+ class SArg_Traits<CORBA::ComponentIR::ConsumesDef>
+ : public
+ Object_SArg_Traits_T<
+ CORBA::ComponentIR::ConsumesDef_ptr,
+ CORBA::ComponentIR::ConsumesDef_var,
+ CORBA::ComponentIR::ConsumesDef_out,
+ TAO::Any_Insert_Policy_Stream <CORBA::ComponentIR::ConsumesDef_ptr>
+ >
+ {
+ };
+
+#endif /* end #if !defined */
+
+ // TAO_IDL - Generated from
+ // be\be_visitor_arg_traits.cpp:140
+
+#if !defined (_CORBA_COMPONENTIR_FACTORYDEF__SARG_TRAITS_)
+#define _CORBA_COMPONENTIR_FACTORYDEF__SARG_TRAITS_
+
+ template<>
+ class SArg_Traits<CORBA::ComponentIR::FactoryDef>
+ : public
+ Object_SArg_Traits_T<
+ CORBA::ComponentIR::FactoryDef_ptr,
+ CORBA::ComponentIR::FactoryDef_var,
+ CORBA::ComponentIR::FactoryDef_out,
+ TAO::Any_Insert_Policy_Stream <CORBA::ComponentIR::FactoryDef_ptr>
+ >
+ {
+ };
+
+#endif /* end #if !defined */
+
+ // TAO_IDL - Generated from
+ // be\be_visitor_arg_traits.cpp:140
+
+#if !defined (_CORBA_COMPONENTIR_FINDERDEF__SARG_TRAITS_)
+#define _CORBA_COMPONENTIR_FINDERDEF__SARG_TRAITS_
+
+ template<>
+ class SArg_Traits<CORBA::ComponentIR::FinderDef>
+ : public
+ Object_SArg_Traits_T<
+ CORBA::ComponentIR::FinderDef_ptr,
+ CORBA::ComponentIR::FinderDef_var,
+ CORBA::ComponentIR::FinderDef_out,
+ TAO::Any_Insert_Policy_Stream <CORBA::ComponentIR::FinderDef_ptr>
+ >
+ {
+ };
+
+#endif /* end #if !defined */
+}
+
+TAO_END_VERSIONED_NAMESPACE_DECL
+
+
+TAO_BEGIN_VERSIONED_NAMESPACE_DECL
+
+
+
+
+// TAO_IDL - Generated from
+// be\be_visitor_arg_traits.cpp:72
+
+
+TAO_END_VERSIONED_NAMESPACE_DECL
+
+
+TAO_BEGIN_VERSIONED_NAMESPACE_DECL
+
+
+// Arg traits specializations.
+namespace TAO
+{
+
+ // TAO_IDL - Generated from
+ // be\be_visitor_arg_traits.cpp:817
+
+#if !defined (_CORBA_DEFINITIONKIND__ARG_TRAITS_)
+#define _CORBA_DEFINITIONKIND__ARG_TRAITS_
+
+ template<>
+ class Arg_Traits<CORBA::DefinitionKind>
+ : public
+ Basic_Arg_Traits_T<
+ CORBA::DefinitionKind,
+ TAO::Any_Insert_Policy_Stream <CORBA::DefinitionKind>
+ >
+ {
+ };
+
+#endif /* end #if !defined */
+
+ // TAO_IDL - Generated from
+ // be\be_visitor_arg_traits.cpp:140
+
+#if !defined (_CORBA_REPOSITORY__ARG_TRAITS_)
+#define _CORBA_REPOSITORY__ARG_TRAITS_
+
+ template<>
+ class Arg_Traits<CORBA::Repository>
+ : public
+ Object_Arg_Traits_T<
+ CORBA::Repository_ptr,
+ CORBA::Repository_var,
+ CORBA::Repository_out,
+ TAO::Objref_Traits<CORBA::Repository>,
+ TAO::Any_Insert_Policy_Stream <CORBA::Repository_ptr>
+ >
+ {
+ };
+
+#endif /* end #if !defined */
+
+ // TAO_IDL - Generated from
+ // be\be_visitor_arg_traits.cpp:140
+
+#if !defined (_CORBA_CONTAINER__ARG_TRAITS_)
+#define _CORBA_CONTAINER__ARG_TRAITS_
+
+ template<>
+ class Arg_Traits<CORBA::Container>
+ : public
+ Object_Arg_Traits_T<
+ CORBA::Container_ptr,
+ CORBA::Container_var,
+ CORBA::Container_out,
+ TAO::Objref_Traits<CORBA::Container>,
+ TAO::Any_Insert_Policy_Stream <CORBA::Container_ptr>
+ >
+ {
+ };
+
+#endif /* end #if !defined */
+
+ // TAO_IDL - Generated from
+ // be\be_visitor_arg_traits.cpp:140
+
+#if !defined (_CORBA_IDLTYPE__ARG_TRAITS_)
+#define _CORBA_IDLTYPE__ARG_TRAITS_
+
+ template<>
+ class Arg_Traits<CORBA::IDLType>
+ : public
+ Object_Arg_Traits_T<
+ CORBA::IDLType_ptr,
+ CORBA::IDLType_var,
+ CORBA::IDLType_out,
+ TAO::Objref_Traits<CORBA::IDLType>,
+ TAO::Any_Insert_Policy_Stream <CORBA::IDLType_ptr>
+ >
+ {
+ };
+
+#endif /* end #if !defined */
+
+ // TAO_IDL - Generated from
+ // be\be_visitor_arg_traits.cpp:611
+
+#if !defined (_CORBA_INTERFACEDEFSEQ__ARG_TRAITS_)
+#define _CORBA_INTERFACEDEFSEQ__ARG_TRAITS_
+
+ template<>
+ class Arg_Traits<CORBA::InterfaceDefSeq>
+ : public
+ Var_Size_Arg_Traits_T<
+ CORBA::InterfaceDefSeq,
+ TAO::Any_Insert_Policy_Stream <CORBA::InterfaceDefSeq>
+ >
+ {
+ };
+
+#endif /* end #if !defined */
+
+ // TAO_IDL - Generated from
+ // be\be_visitor_arg_traits.cpp:611
+
+#if !defined (_CORBA_VALUEDEFSEQ__ARG_TRAITS_)
+#define _CORBA_VALUEDEFSEQ__ARG_TRAITS_
+
+ template<>
+ class Arg_Traits<CORBA::ValueDefSeq>
+ : public
+ Var_Size_Arg_Traits_T<
+ CORBA::ValueDefSeq,
+ TAO::Any_Insert_Policy_Stream <CORBA::ValueDefSeq>
+ >
+ {
+ };
+
+#endif /* end #if !defined */
+
+ // TAO_IDL - Generated from
+ // be\be_visitor_arg_traits.cpp:611
+
+#if !defined (_CORBA_INITIALIZERSEQ__ARG_TRAITS_)
+#define _CORBA_INITIALIZERSEQ__ARG_TRAITS_
+
+ template<>
+ class Arg_Traits<CORBA::InitializerSeq>
+ : public
+ Var_Size_Arg_Traits_T<
+ CORBA::InitializerSeq,
+ TAO::Any_Insert_Policy_Stream <CORBA::InitializerSeq>
+ >
+ {
+ };
+
+#endif /* end #if !defined */
+
+ // TAO_IDL - Generated from
+ // be\be_visitor_arg_traits.cpp:611
+
+#if !defined (_CORBA_EXTINITIALIZERSEQ__ARG_TRAITS_)
+#define _CORBA_EXTINITIALIZERSEQ__ARG_TRAITS_
+
+ template<>
+ class Arg_Traits<CORBA::ExtInitializerSeq>
+ : public
+ Var_Size_Arg_Traits_T<
+ CORBA::ExtInitializerSeq,
+ TAO::Any_Insert_Policy_Stream <CORBA::ExtInitializerSeq>
+ >
+ {
+ };
+
+#endif /* end #if !defined */
+
+ // TAO_IDL - Generated from
+ // be\be_visitor_arg_traits.cpp:611
+
+#if !defined (_CORBA_EXCEPTIONDEFSEQ__ARG_TRAITS_)
+#define _CORBA_EXCEPTIONDEFSEQ__ARG_TRAITS_
+
+ template<>
+ class Arg_Traits<CORBA::ExceptionDefSeq>
+ : public
+ Var_Size_Arg_Traits_T<
+ CORBA::ExceptionDefSeq,
+ TAO::Any_Insert_Policy_Stream <CORBA::ExceptionDefSeq>
+ >
+ {
+ };
+
+#endif /* end #if !defined */
+
+ // TAO_IDL - Generated from
+ // be\be_visitor_arg_traits.cpp:817
+
+#if !defined (_CORBA_OPERATIONMODE__ARG_TRAITS_)
+#define _CORBA_OPERATIONMODE__ARG_TRAITS_
+
+ template<>
+ class Arg_Traits<CORBA::OperationMode>
+ : public
+ Basic_Arg_Traits_T<
+ CORBA::OperationMode,
+ TAO::Any_Insert_Policy_Stream <CORBA::OperationMode>
+ >
+ {
+ };
+
+#endif /* end #if !defined */
+
+ // TAO_IDL - Generated from
+ // be\be_visitor_arg_traits.cpp:611
+
+#if !defined (_CORBA_PARDESCRIPTIONSEQ__ARG_TRAITS_)
+#define _CORBA_PARDESCRIPTIONSEQ__ARG_TRAITS_
+
+ template<>
+ class Arg_Traits<CORBA::ParDescriptionSeq>
+ : public
+ Var_Size_Arg_Traits_T<
+ CORBA::ParDescriptionSeq,
+ TAO::Any_Insert_Policy_Stream <CORBA::ParDescriptionSeq>
+ >
+ {
+ };
+
+#endif /* end #if !defined */
+
+ // TAO_IDL - Generated from
+ // be\be_visitor_arg_traits.cpp:611
+
+#if !defined (_CORBA_CONTEXTIDSEQ__ARG_TRAITS_)
+#define _CORBA_CONTEXTIDSEQ__ARG_TRAITS_
+
+ template<>
+ class Arg_Traits<CORBA::ContextIdSeq>
+ : public
+ Var_Size_Arg_Traits_T<
+ CORBA::ContextIdSeq,
+ TAO::Any_Insert_Policy_Stream <CORBA::ContextIdSeq>
+ >
+ {
+ };
+
+#endif /* end #if !defined */
+
+ // TAO_IDL - Generated from
+ // be\be_visitor_arg_traits.cpp:140
+
+#if !defined (_CORBA_INTERFACEDEF__ARG_TRAITS_)
+#define _CORBA_INTERFACEDEF__ARG_TRAITS_
+
+ template<>
+ class Arg_Traits<CORBA::InterfaceDef>
+ : public
+ Object_Arg_Traits_T<
+ CORBA::InterfaceDef_ptr,
+ CORBA::InterfaceDef_var,
+ CORBA::InterfaceDef_out,
+ TAO::Objref_Traits<CORBA::InterfaceDef>,
+ TAO::Any_Insert_Policy_Stream <CORBA::InterfaceDef_ptr>
+ >
+ {
+ };
+
+#endif /* end #if !defined */
+
+ // TAO_IDL - Generated from
+ // be\be_visitor_arg_traits.cpp:140
+
+#if !defined (_CORBA_VALUEDEF__ARG_TRAITS_)
+#define _CORBA_VALUEDEF__ARG_TRAITS_
+
+ template<>
+ class Arg_Traits<CORBA::ValueDef>
+ : public
+ Object_Arg_Traits_T<
+ CORBA::ValueDef_ptr,
+ CORBA::ValueDef_var,
+ CORBA::ValueDef_out,
+ TAO::Objref_Traits<CORBA::ValueDef>,
+ TAO::Any_Insert_Policy_Stream <CORBA::ValueDef_ptr>
+ >
+ {
+ };
+
+#endif /* end #if !defined */
+
+ // TAO_IDL - Generated from
+ // be\be_visitor_arg_traits.cpp:140
+
+#if !defined (_CORBA_COMPONENTIR_COMPONENTDEF__ARG_TRAITS_)
+#define _CORBA_COMPONENTIR_COMPONENTDEF__ARG_TRAITS_
+
+ template<>
+ class Arg_Traits<CORBA::ComponentIR::ComponentDef>
+ : public
+ Object_Arg_Traits_T<
+ CORBA::ComponentIR::ComponentDef_ptr,
+ CORBA::ComponentIR::ComponentDef_var,
+ CORBA::ComponentIR::ComponentDef_out,
+ TAO::Objref_Traits<CORBA::ComponentIR::ComponentDef>,
+ TAO::Any_Insert_Policy_Stream <CORBA::ComponentIR::ComponentDef_ptr>
+ >
+ {
+ };
+
+#endif /* end #if !defined */
+
+ // TAO_IDL - Generated from
+ // be\be_visitor_arg_traits.cpp:140
+
+#if !defined (_CORBA_COMPONENTIR_HOMEDEF__ARG_TRAITS_)
+#define _CORBA_COMPONENTIR_HOMEDEF__ARG_TRAITS_
+
+ template<>
+ class Arg_Traits<CORBA::ComponentIR::HomeDef>
+ : public
+ Object_Arg_Traits_T<
+ CORBA::ComponentIR::HomeDef_ptr,
+ CORBA::ComponentIR::HomeDef_var,
+ CORBA::ComponentIR::HomeDef_out,
+ TAO::Objref_Traits<CORBA::ComponentIR::HomeDef>,
+ TAO::Any_Insert_Policy_Stream <CORBA::ComponentIR::HomeDef_ptr>
+ >
+ {
+ };
+
+#endif /* end #if !defined */
+
+ // TAO_IDL - Generated from
+ // be\be_visitor_arg_traits.cpp:140
+
+#if !defined (_CORBA_COMPONENTIR_EVENTDEF__ARG_TRAITS_)
+#define _CORBA_COMPONENTIR_EVENTDEF__ARG_TRAITS_
+
+ template<>
+ class Arg_Traits<CORBA::ComponentIR::EventDef>
+ : public
+ Object_Arg_Traits_T<
+ CORBA::ComponentIR::EventDef_ptr,
+ CORBA::ComponentIR::EventDef_var,
+ CORBA::ComponentIR::EventDef_out,
+ TAO::Objref_Traits<CORBA::ComponentIR::EventDef>,
+ TAO::Any_Insert_Policy_Stream <CORBA::ComponentIR::EventDef_ptr>
+ >
+ {
+ };
+
+#endif /* end #if !defined */
+
+ // TAO_IDL - Generated from
+ // be\be_visitor_arg_traits.cpp:140
+
+#if !defined (_CORBA_COMPONENTIR_PROVIDESDEF__ARG_TRAITS_)
+#define _CORBA_COMPONENTIR_PROVIDESDEF__ARG_TRAITS_
+
+ template<>
+ class Arg_Traits<CORBA::ComponentIR::ProvidesDef>
+ : public
+ Object_Arg_Traits_T<
+ CORBA::ComponentIR::ProvidesDef_ptr,
+ CORBA::ComponentIR::ProvidesDef_var,
+ CORBA::ComponentIR::ProvidesDef_out,
+ TAO::Objref_Traits<CORBA::ComponentIR::ProvidesDef>,
+ TAO::Any_Insert_Policy_Stream <CORBA::ComponentIR::ProvidesDef_ptr>
+ >
+ {
+ };
+
+#endif /* end #if !defined */
+
+ // TAO_IDL - Generated from
+ // be\be_visitor_arg_traits.cpp:140
+
+#if !defined (_CORBA_COMPONENTIR_USESDEF__ARG_TRAITS_)
+#define _CORBA_COMPONENTIR_USESDEF__ARG_TRAITS_
+
+ template<>
+ class Arg_Traits<CORBA::ComponentIR::UsesDef>
+ : public
+ Object_Arg_Traits_T<
+ CORBA::ComponentIR::UsesDef_ptr,
+ CORBA::ComponentIR::UsesDef_var,
+ CORBA::ComponentIR::UsesDef_out,
+ TAO::Objref_Traits<CORBA::ComponentIR::UsesDef>,
+ TAO::Any_Insert_Policy_Stream <CORBA::ComponentIR::UsesDef_ptr>
+ >
+ {
+ };
+
+#endif /* end #if !defined */
+
+ // TAO_IDL - Generated from
+ // be\be_visitor_arg_traits.cpp:140
+
+#if !defined (_CORBA_COMPONENTIR_EMITSDEF__ARG_TRAITS_)
+#define _CORBA_COMPONENTIR_EMITSDEF__ARG_TRAITS_
+
+ template<>
+ class Arg_Traits<CORBA::ComponentIR::EmitsDef>
+ : public
+ Object_Arg_Traits_T<
+ CORBA::ComponentIR::EmitsDef_ptr,
+ CORBA::ComponentIR::EmitsDef_var,
+ CORBA::ComponentIR::EmitsDef_out,
+ TAO::Objref_Traits<CORBA::ComponentIR::EmitsDef>,
+ TAO::Any_Insert_Policy_Stream <CORBA::ComponentIR::EmitsDef_ptr>
+ >
+ {
+ };
+
+#endif /* end #if !defined */
+
+ // TAO_IDL - Generated from
+ // be\be_visitor_arg_traits.cpp:140
+
+#if !defined (_CORBA_COMPONENTIR_PUBLISHESDEF__ARG_TRAITS_)
+#define _CORBA_COMPONENTIR_PUBLISHESDEF__ARG_TRAITS_
+
+ template<>
+ class Arg_Traits<CORBA::ComponentIR::PublishesDef>
+ : public
+ Object_Arg_Traits_T<
+ CORBA::ComponentIR::PublishesDef_ptr,
+ CORBA::ComponentIR::PublishesDef_var,
+ CORBA::ComponentIR::PublishesDef_out,
+ TAO::Objref_Traits<CORBA::ComponentIR::PublishesDef>,
+ TAO::Any_Insert_Policy_Stream <CORBA::ComponentIR::PublishesDef_ptr>
+ >
+ {
+ };
+
+#endif /* end #if !defined */
+
+ // TAO_IDL - Generated from
+ // be\be_visitor_arg_traits.cpp:140
+
+#if !defined (_CORBA_COMPONENTIR_CONSUMESDEF__ARG_TRAITS_)
+#define _CORBA_COMPONENTIR_CONSUMESDEF__ARG_TRAITS_
+
+ template<>
+ class Arg_Traits<CORBA::ComponentIR::ConsumesDef>
+ : public
+ Object_Arg_Traits_T<
+ CORBA::ComponentIR::ConsumesDef_ptr,
+ CORBA::ComponentIR::ConsumesDef_var,
+ CORBA::ComponentIR::ConsumesDef_out,
+ TAO::Objref_Traits<CORBA::ComponentIR::ConsumesDef>,
+ TAO::Any_Insert_Policy_Stream <CORBA::ComponentIR::ConsumesDef_ptr>
+ >
+ {
+ };
+
+#endif /* end #if !defined */
+
+ // TAO_IDL - Generated from
+ // be\be_visitor_arg_traits.cpp:140
+
+#if !defined (_CORBA_COMPONENTIR_FACTORYDEF__ARG_TRAITS_)
+#define _CORBA_COMPONENTIR_FACTORYDEF__ARG_TRAITS_
+
+ template<>
+ class Arg_Traits<CORBA::ComponentIR::FactoryDef>
+ : public
+ Object_Arg_Traits_T<
+ CORBA::ComponentIR::FactoryDef_ptr,
+ CORBA::ComponentIR::FactoryDef_var,
+ CORBA::ComponentIR::FactoryDef_out,
+ TAO::Objref_Traits<CORBA::ComponentIR::FactoryDef>,
+ TAO::Any_Insert_Policy_Stream <CORBA::ComponentIR::FactoryDef_ptr>
+ >
+ {
+ };
+
+#endif /* end #if !defined */
+
+ // TAO_IDL - Generated from
+ // be\be_visitor_arg_traits.cpp:140
+
+#if !defined (_CORBA_COMPONENTIR_FINDERDEF__ARG_TRAITS_)
+#define _CORBA_COMPONENTIR_FINDERDEF__ARG_TRAITS_
+
+ template<>
+ class Arg_Traits<CORBA::ComponentIR::FinderDef>
+ : public
+ Object_Arg_Traits_T<
+ CORBA::ComponentIR::FinderDef_ptr,
+ CORBA::ComponentIR::FinderDef_var,
+ CORBA::ComponentIR::FinderDef_out,
+ TAO::Objref_Traits<CORBA::ComponentIR::FinderDef>,
+ TAO::Any_Insert_Policy_Stream <CORBA::ComponentIR::FinderDef_ptr>
+ >
+ {
+ };
+
+#endif /* end #if !defined */
+}
+
+TAO_END_VERSIONED_NAMESPACE_DECL
+
+
+TAO_BEGIN_VERSIONED_NAMESPACE_DECL
+
+
+
+
+// TAO_IDL - Generated from
+// be\be_interface.cpp:1499
+
+class TAO_CORBA_ComponentIR_EventDef_Perfect_Hash_OpTable
+ : public TAO_Perfect_Hash_OpTable
+{
+private:
+ unsigned int hash (const char *str, unsigned int len);
+
+public:
+ const TAO_operation_db_entry * lookup (const char *str, unsigned int len);
+};
+
+/* C++ code produced by gperf version 2.8 (ACE version) */
+/* Command-line: C:\ACE\latest\ACE_wrappers\bin\gperf.exe -m -M -J -c -C -D -E -T -f 0 -F 0,0 -a -o -t -p -K opname -L C++ -Z TAO_CORBA_ComponentIR_EventDef_Perfect_Hash_OpTable -N lookup */
+unsigned int
+TAO_CORBA_ComponentIR_EventDef_Perfect_Hash_OpTable::hash (const char *str, unsigned int len)
+{
+ static const unsigned char asso_values[] =
+ {
+#if defined (ACE_MVS)
+ 109, 109, 109, 109, 109, 109, 109, 109, 109, 109,
+ 109, 109, 109, 109, 109, 109, 109, 109, 109, 109,
+ 109, 109, 109, 109, 109, 109, 109, 109, 109, 109,
+ 109, 109, 109, 109, 109, 109, 109, 109, 109, 109,
+ 109, 109, 109, 109, 109, 109, 109, 109, 109, 109,
+ 109, 109, 109, 109, 109, 109, 109, 109, 109, 109,
+ 109, 109, 109, 109, 109, 109, 109, 109, 109, 109,
+ 109, 109, 109, 109, 109, 109, 109, 109, 109, 109,
+ 109, 109, 109, 109, 109, 109, 109, 109, 109, 109,
+ 109, 109, 109, 109, 109, 109, 109, 109, 109, 109,
+ 109, 109, 109, 109, 109, 109, 109, 109, 109, 0,
+ 109, 109, 109, 109, 109, 109, 109, 109, 109, 109,
+ 109, 109, 109, 109, 109, 109, 109, 109, 109, 0,
+ 109, 15, 50, 40, 109, 109, 109, 0, 109, 109,
+ 109, 109, 109, 109, 109, 109, 109, 0, 0, 0,
+ 109, 0, 109, 0, 109, 109, 109, 109, 109, 109,
+ 109, 109, 15, 0, 109, 109, 109, 15, 15, 109,
+ 109, 109, 109, 109, 109, 109, 109, 109, 109, 109,
+ 109, 109, 109, 109, 109, 109, 109, 109, 109, 109,
+ 109, 109, 109, 109, 109, 109, 109, 109, 109, 109,
+ 109, 109, 109, 109, 109, 109, 109, 109, 109, 109,
+ 109, 109, 109, 109, 109, 109, 109, 109, 109, 109,
+ 109, 109, 109, 109, 109, 109, 109, 109, 109, 109,
+ 109, 109, 109, 109, 109, 109, 109, 109, 109, 109,
+ 109, 109, 109, 109, 109, 109, 109, 109, 109, 109,
+ 109, 109, 109, 109, 109, 109,
+#else
+ 109, 109, 109, 109, 109, 109, 109, 109, 109, 109,
+ 109, 109, 109, 109, 109, 109, 109, 109, 109, 109,
+ 109, 109, 109, 109, 109, 109, 109, 109, 109, 109,
+ 109, 109, 109, 109, 109, 109, 109, 109, 109, 109,
+ 109, 109, 109, 109, 109, 109, 109, 109, 109, 109,
+ 109, 109, 109, 109, 109, 109, 109, 109, 109, 109,
+ 109, 109, 109, 109, 109, 109, 109, 109, 109, 109,
+ 109, 109, 109, 109, 109, 109, 109, 109, 109, 109,
+ 109, 109, 109, 109, 109, 109, 109, 109, 109, 109,
+ 109, 109, 109, 109, 109, 0, 109, 0, 109, 15,
+ 50, 40, 109, 109, 109, 0, 109, 109, 0, 0,
+ 0, 109, 0, 109, 0, 15, 0, 109, 109, 109,
+ 15, 15, 109, 109, 109, 109, 109, 109,
+#endif /* ACE_MVS */
+ };
+ return len + asso_values[(int) str[len - 1]] + asso_values[(int) str[0]];
+}
+
+const TAO_operation_db_entry *
+TAO_CORBA_ComponentIR_EventDef_Perfect_Hash_OpTable::lookup (const char *str, unsigned int len)
+{
+ enum
+ {
+ TOTAL_KEYWORDS = 60,
+ MIN_WORD_LENGTH = 4,
+ MAX_WORD_LENGTH = 26,
+ MIN_HASH_VALUE = 4,
+ MAX_HASH_VALUE = 108,
+ HASH_VALUE_RANGE = 105,
+ DUPLICATES = 18,
+ WORDLIST_SIZE = 64
+ };
+
+ static const TAO_operation_db_entry wordlist[] =
+ {
+ {"",0,0},{"",0,0},{"",0,0},{"",0,0},
+ {"is_a", &POA_CORBA::ComponentIR::EventDef::is_a_skel, 0},
+ {"_is_a", &POA_CORBA::ComponentIR::EventDef::_is_a_skel, 0},
+ {"lookup", &POA_CORBA::ComponentIR::EventDef::lookup_skel, 0},
+ {"_component", &POA_CORBA::ComponentIR::EventDef::_component_skel, 0},
+ {"_get_version", &POA_CORBA::ComponentIR::EventDef::_get_version_skel, 0},
+ {"_set_version", &POA_CORBA::ComponentIR::EventDef::_set_version_skel, 0},
+ {"_non_existent", &POA_CORBA::ComponentIR::EventDef::_non_existent_skel, 0},
+ {"_get_is_custom", &POA_CORBA::ComponentIR::EventDef::_get_is_custom_skel, 0},
+ {"_set_is_custom", &POA_CORBA::ComponentIR::EventDef::_set_is_custom_skel, 0},
+ {"_get_defined_in", &POA_CORBA::ComponentIR::EventDef::_get_defined_in_skel, 0},
+ {"_get_is_abstract", &POA_CORBA::ComponentIR::EventDef::_get_is_abstract_skel, 0},
+ {"_set_is_abstract", &POA_CORBA::ComponentIR::EventDef::_set_is_abstract_skel, 0},
+ {"create_enum", &POA_CORBA::ComponentIR::EventDef::create_enum_skel, 0},
+ {"create_union", &POA_CORBA::ComponentIR::EventDef::create_union_skel, 0},
+ {"create_struct", &POA_CORBA::ComponentIR::EventDef::create_struct_skel, 0},
+ {"create_constant", &POA_CORBA::ComponentIR::EventDef::create_constant_skel, 0},
+ {"create_exception", &POA_CORBA::ComponentIR::EventDef::create_exception_skel, 0},
+ {"create_operation", &POA_CORBA::ComponentIR::EventDef::create_operation_skel, 0},
+ {"_get_initializers", &POA_CORBA::ComponentIR::EventDef::_get_initializers_skel, 0},
+ {"_set_initializers", &POA_CORBA::ComponentIR::EventDef::_set_initializers_skel, 0},
+ {"create_value_member", &POA_CORBA::ComponentIR::EventDef::create_value_member_skel, 0},
+ {"_get_ext_initializers", &POA_CORBA::ComponentIR::EventDef::_get_ext_initializers_skel, 0},
+ {"_set_ext_initializers", &POA_CORBA::ComponentIR::EventDef::_set_ext_initializers_skel, 0},
+ {"contents", &POA_CORBA::ComponentIR::EventDef::contents_skel, 0},
+ {"_get_supported_interfaces", &POA_CORBA::ComponentIR::EventDef::_get_supported_interfaces_skel, 0},
+ {"_set_abstract_base_values", &POA_CORBA::ComponentIR::EventDef::_set_abstract_base_values_skel, 0},
+ {"_get_abstract_base_values", &POA_CORBA::ComponentIR::EventDef::_get_abstract_base_values_skel, 0},
+ {"_set_supported_interfaces", &POA_CORBA::ComponentIR::EventDef::_set_supported_interfaces_skel, 0},
+ {"_get_containing_repository", &POA_CORBA::ComponentIR::EventDef::_get_containing_repository_skel, 0},
+ {"create_alias", &POA_CORBA::ComponentIR::EventDef::create_alias_skel, 0},
+ {"move", &POA_CORBA::ComponentIR::EventDef::move_skel, 0},
+ {"create_value_box", &POA_CORBA::ComponentIR::EventDef::create_value_box_skel, 0},
+ {"_get_name", &POA_CORBA::ComponentIR::EventDef::_get_name_skel, 0},
+ {"_get_type", &POA_CORBA::ComponentIR::EventDef::_get_type_skel, 0},
+ {"_set_name", &POA_CORBA::ComponentIR::EventDef::_set_name_skel, 0},
+ {"_interface", &POA_CORBA::ComponentIR::EventDef::_interface_skel, 0},
+ {"lookup_name", &POA_CORBA::ComponentIR::EventDef::lookup_name_skel, 0},
+ {"_get_base_value", &POA_CORBA::ComponentIR::EventDef::_get_base_value_skel, 0},
+ {"_set_base_value", &POA_CORBA::ComponentIR::EventDef::_set_base_value_skel, 0},
+ {"_get_id", &POA_CORBA::ComponentIR::EventDef::_get_id_skel, 0},
+ {"_set_id", &POA_CORBA::ComponentIR::EventDef::_set_id_skel, 0},
+ {"_get_absolute_name", &POA_CORBA::ComponentIR::EventDef::_get_absolute_name_skel, 0},
+ {"_get_is_truncatable", &POA_CORBA::ComponentIR::EventDef::_get_is_truncatable_skel, 0},
+ {"_set_is_truncatable", &POA_CORBA::ComponentIR::EventDef::_set_is_truncatable_skel, 0},
+ {"_get_def_kind", &POA_CORBA::ComponentIR::EventDef::_get_def_kind_skel, 0},
+ {"_repository_id", &POA_CORBA::ComponentIR::EventDef::_repository_id_skel, 0},
+ {"create_value", &POA_CORBA::ComponentIR::EventDef::create_value_skel, 0},
+ {"create_module", &POA_CORBA::ComponentIR::EventDef::create_module_skel, 0},
+ {"create_native", &POA_CORBA::ComponentIR::EventDef::create_native_skel, 0},
+ {"create_interface", &POA_CORBA::ComponentIR::EventDef::create_interface_skel, 0},
+ {"create_attribute", &POA_CORBA::ComponentIR::EventDef::create_attribute_skel, 0},
+ {"create_ext_value", &POA_CORBA::ComponentIR::EventDef::create_ext_value_skel, 0},
+ {"destroy", &POA_CORBA::ComponentIR::EventDef::destroy_skel, 0},
+ {"create_ext_attribute", &POA_CORBA::ComponentIR::EventDef::create_ext_attribute_skel, 0},
+ {"create_local_interface", &POA_CORBA::ComponentIR::EventDef::create_local_interface_skel, 0},
+ {"create_abstract_interface", &POA_CORBA::ComponentIR::EventDef::create_abstract_interface_skel, 0},
+ {"describe_contents", &POA_CORBA::ComponentIR::EventDef::describe_contents_skel, 0},
+ {"describe", &POA_CORBA::ComponentIR::EventDef::describe_skel, 0},
+ {"describe_value", &POA_CORBA::ComponentIR::EventDef::describe_value_skel, 0},
+ {"describe_ext_value", &POA_CORBA::ComponentIR::EventDef::describe_ext_value_skel, 0},
+ };
+
+ static const signed short lookup[] =
+ {
+ -14, -2, -20, -2, 4, 5, 6, -1, -22, -2, 7, -1, 169, 10,
+ 154, 13, -124, -1, -25, -2, -28, -4, -36, -3, -41, -2, 16, 17,
+ 18, -1, 19, -137, -132, -1, 24, -1, -126, -1, 27, -1, -128, 32,
+ 33, -1, 34, -1, 35, -43, -2, -135, 39, 40, -1, -46, -2, -139,
+ -1, -118, 45, -114, -11, -2, -1, 48, 49, -51, -2, 50, -111, -53,
+ -3, -110, 56, -8, -2, 57, -1, 58, -1, -1, 59, -1, 60, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
+ 61, -1, -1, -1, -1, -1, 62, -1, -1, -1, 63,
+ };
+
+ if (len <= MAX_WORD_LENGTH && len >= MIN_WORD_LENGTH)
+ {
+ unsigned int key = hash (str, len);
+
+ if (key <= MAX_HASH_VALUE && key >= MIN_HASH_VALUE)
+ {
+ int slot = lookup[key];
+
+ if (slot >= 0 && slot < WORDLIST_SIZE)
+ {
+ const char *s = wordlist[slot].opname;
+
+ if (*str == *s && !strncmp (str + 1, s + 1, len - 1))
+ return &wordlist[slot];
+ }
+ else if (slot < 0 && slot >= -MAX_HASH_VALUE)
+ return 0;
+ else
+ {
+ unsigned int offset = key + slot + (slot > 0 ? -MAX_HASH_VALUE : MAX_HASH_VALUE);
+ const TAO_operation_db_entry *base = &wordlist[-lookup[offset]];
+ const TAO_operation_db_entry *ptr = base + -lookup[offset + 1];
+
+ while (--ptr >= base)
+ if (*str == *ptr->opname && !strncmp (str + 1, ptr->opname + 1, len - 1))
+ return ptr;
+ }
+ }
+ }
+ return 0;
+}
+
+static TAO_CORBA_ComponentIR_EventDef_Perfect_Hash_OpTable tao_CORBA_ComponentIR_EventDef_optable;
+
+// TAO_IDL - Generated from
+// be\be_visitor_interface/interface_ss.cpp:966
+
+TAO::Collocation_Proxy_Broker *
+CORBA_ComponentIR__TAO_EventDef_Proxy_Broker_Factory_function ( ::CORBA::Object_ptr)
+{
+ return reinterpret_cast<TAO::Collocation_Proxy_Broker *> (0xdead); // Dummy
+}
+
+int
+CORBA_ComponentIR__TAO_EventDef_Proxy_Broker_Factory_Initializer (size_t)
+{
+ CORBA_ComponentIR__TAO_EventDef_Proxy_Broker_Factory_function_pointer =
+ CORBA_ComponentIR__TAO_EventDef_Proxy_Broker_Factory_function;
+
+ return 0;
+}
+
+static int
+CORBA_ComponentIR__TAO_EventDef_Proxy_Broker_Stub_Factory_Initializer_Scarecrow =
+ CORBA_ComponentIR__TAO_EventDef_Proxy_Broker_Factory_Initializer (
+ reinterpret_cast<size_t> (CORBA_ComponentIR__TAO_EventDef_Proxy_Broker_Factory_Initializer)
+ );
+
+// TAO_IDL - Generated from
+// be\be_visitor_interface/interface_ss.cpp:103
+
+POA_CORBA::ComponentIR::EventDef::EventDef (void)
+ : TAO_ServantBase ()
+{
+ this->optable_ = &tao_CORBA_ComponentIR_EventDef_optable;
+}
+
+POA_CORBA::ComponentIR::EventDef::EventDef (const EventDef& rhs)
+ : TAO_Abstract_ServantBase (rhs),
+ TAO_ServantBase (rhs),
+ POA_CORBA::IRObject (rhs),
+ POA_CORBA::Container (rhs),
+ POA_CORBA::Contained (rhs),
+ POA_CORBA::IDLType (rhs),
+ POA_CORBA::ValueDef (rhs),
+ POA_CORBA::ExtValueDef (rhs)
+{
+}
+
+POA_CORBA::ComponentIR::EventDef::~EventDef (void)
+{
+}
+
+// TAO_IDL - Generated from
+// be\be_visitor_interface/interface_ss.cpp:169
+
+namespace POA_CORBA
+{
+ namespace ComponentIR
+ {
+
+
+ // TAO_IDL - Generated from
+ // be\be_visitor_operation/upcall_command_ss.cpp:127
+
+ class _is_a_EventDef_Upcall_Command
+ : public TAO::Upcall_Command
+ {
+ public:
+ inline _is_a_EventDef_Upcall_Command (
+ POA_CORBA::ComponentIR::EventDef * servant,
+ TAO_Operation_Details const * operation_details,
+ TAO::Argument * const args[])
+ : servant_ (servant)
+ , operation_details_ (operation_details)
+ , args_ (args)
+ {
+ }
+
+ virtual void execute (ACE_ENV_SINGLE_ARG_DECL)
+ {
+ TAO::SArg_Traits< ::ACE_InputCDR::to_boolean>::ret_arg_type retval =
+ TAO::Portable_Server::get_ret_arg< ::ACE_InputCDR::to_boolean> (
+ this->operation_details_,
+ this->args_);
+
+ TAO::SArg_Traits< ::CORBA::Char *>::in_arg_type arg_1 =
+ TAO::Portable_Server::get_in_arg< ::CORBA::Char *> (
+ this->operation_details_,
+ this->args_,
+ 1);
+
+ retval =
+ this->servant_-> _is_a (
+ arg_1
+ ACE_ENV_ARG_PARAMETER);
+ ACE_CHECK;
+ }
+
+ private:
+ POA_CORBA::ComponentIR::EventDef * const servant_;
+ TAO_Operation_Details const * const operation_details_;
+ TAO::Argument * const * const args_;
+ };
+ }
+
+}
+
+
+void POA_CORBA::ComponentIR::EventDef::_is_a_skel (
+ TAO_ServerRequest & server_request,
+ void * TAO_INTERCEPTOR (servant_upcall),
+ void * servant
+ ACE_ENV_ARG_DECL
+ )
+{
+#if TAO_HAS_INTERCEPTORS == 1
+ static ::CORBA::TypeCode_ptr const * const exceptions = 0;
+ static ::CORBA::ULong const nexceptions = 0;
+#endif /* TAO_HAS_INTERCEPTORS */
+
+ TAO::SArg_Traits< ::ACE_InputCDR::to_boolean>::ret_val retval;
+ TAO::SArg_Traits< ::CORBA::Char *>::in_arg_val _tao_repository_id;
+
+ TAO::Argument * const args[] =
+ {
+ &retval,
+ &_tao_repository_id
+ };
+
+ static size_t const nargs = 2;
+
+ POA_CORBA::ComponentIR::EventDef * const impl =
+ static_cast<POA_CORBA::ComponentIR::EventDef *> (servant);
+
+ _is_a_EventDef_Upcall_Command command (
+ impl,
+ server_request.operation_details (),
+ args);
+
+ TAO::Upcall_Wrapper upcall_wrapper;
+ upcall_wrapper.upcall (server_request
+ , args
+ , nargs
+ , command
+#if TAO_HAS_INTERCEPTORS == 1
+ , servant_upcall
+ , exceptions
+ , nexceptions
+#endif /* TAO_HAS_INTERCEPTORS == 1 */
+ ACE_ENV_ARG_PARAMETER);
+ ACE_CHECK;
+}namespace POA_CORBA
+{
+ namespace ComponentIR
+ {
+
+
+ // TAO_IDL - Generated from
+ // be\be_visitor_operation/upcall_command_ss.cpp:127
+
+ class _non_existent_EventDef_Upcall_Command
+ : public TAO::Upcall_Command
+ {
+ public:
+ inline _non_existent_EventDef_Upcall_Command (
+ POA_CORBA::ComponentIR::EventDef * servant,
+ TAO_Operation_Details const * operation_details,
+ TAO::Argument * const args[])
+ : servant_ (servant)
+ , operation_details_ (operation_details)
+ , args_ (args)
+ {
+ }
+
+ virtual void execute (ACE_ENV_SINGLE_ARG_DECL)
+ {
+ TAO::SArg_Traits< ::ACE_InputCDR::to_boolean>::ret_arg_type retval =
+ TAO::Portable_Server::get_ret_arg< ::ACE_InputCDR::to_boolean> (
+ this->operation_details_,
+ this->args_);
+
+ retval =
+ this->servant_-> _non_existent (
+ ACE_ENV_SINGLE_ARG_PARAMETER);
+ ACE_CHECK;
+ }
+
+ private:
+ POA_CORBA::ComponentIR::EventDef * const servant_;
+ TAO_Operation_Details const * const operation_details_;
+ TAO::Argument * const * const args_;
+ };
+ }
+
+}
+
+
+void POA_CORBA::ComponentIR::EventDef::_non_existent_skel (
+ TAO_ServerRequest & server_request,
+ void * TAO_INTERCEPTOR (servant_upcall),
+ void * servant
+ ACE_ENV_ARG_DECL
+ )
+{
+#if TAO_HAS_INTERCEPTORS == 1
+ static ::CORBA::TypeCode_ptr const * const exceptions = 0;
+ static ::CORBA::ULong const nexceptions = 0;
+#endif /* TAO_HAS_INTERCEPTORS */
+
+ TAO::SArg_Traits< ::ACE_InputCDR::to_boolean>::ret_val retval;
+
+ TAO::Argument * const args[] =
+ {
+ &retval
+ };
+
+ static size_t const nargs = 1;
+
+ POA_CORBA::ComponentIR::EventDef * const impl =
+ static_cast<POA_CORBA::ComponentIR::EventDef *> (servant);
+
+ _non_existent_EventDef_Upcall_Command command (
+ impl,
+ server_request.operation_details (),
+ args);
+
+ TAO::Upcall_Wrapper upcall_wrapper;
+ upcall_wrapper.upcall (server_request
+ , args
+ , nargs
+ , command
+#if TAO_HAS_INTERCEPTORS == 1
+ , servant_upcall
+ , exceptions
+ , nexceptions
+#endif /* TAO_HAS_INTERCEPTORS == 1 */
+ ACE_ENV_ARG_PARAMETER);
+ ACE_CHECK;
+}namespace POA_CORBA
+{
+ namespace ComponentIR
+ {
+
+
+ // TAO_IDL - Generated from
+ // be\be_visitor_operation/upcall_command_ss.cpp:127
+
+ class _repository_id_EventDef_Upcall_Command
+ : public TAO::Upcall_Command
+ {
+ public:
+ inline _repository_id_EventDef_Upcall_Command (
+ POA_CORBA::ComponentIR::EventDef * servant,
+ TAO_Operation_Details const * operation_details,
+ TAO::Argument * const args[])
+ : servant_ (servant)
+ , operation_details_ (operation_details)
+ , args_ (args)
+ {
+ }
+
+ virtual void execute (ACE_ENV_SINGLE_ARG_DECL)
+ {
+ TAO::SArg_Traits< ::CORBA::Char *>::ret_arg_type retval =
+ TAO::Portable_Server::get_ret_arg< ::CORBA::Char *> (
+ this->operation_details_,
+ this->args_);
+
+ retval =
+ this->servant_-> _repository_id (
+ ACE_ENV_SINGLE_ARG_PARAMETER);
+ ACE_CHECK;
+ }
+
+ private:
+ POA_CORBA::ComponentIR::EventDef * const servant_;
+ TAO_Operation_Details const * const operation_details_;
+ TAO::Argument * const * const args_;
+ };
+ }
+
+}
+
+
+void POA_CORBA::ComponentIR::EventDef::_repository_id_skel (
+ TAO_ServerRequest & server_request,
+ void * TAO_INTERCEPTOR (servant_upcall),
+ void * servant
+ ACE_ENV_ARG_DECL
+ )
+{
+#if TAO_HAS_INTERCEPTORS == 1
+ static ::CORBA::TypeCode_ptr const * const exceptions = 0;
+ static ::CORBA::ULong const nexceptions = 0;
+#endif /* TAO_HAS_INTERCEPTORS */
+
+ TAO::SArg_Traits< ::CORBA::Char *>::ret_val retval;
+
+ TAO::Argument * const args[] =
+ {
+ &retval
+ };
+
+ static size_t const nargs = 1;
+
+ POA_CORBA::ComponentIR::EventDef * const impl =
+ static_cast<POA_CORBA::ComponentIR::EventDef *> (servant);
+
+ _repository_id_EventDef_Upcall_Command command (
+ impl,
+ server_request.operation_details (),
+ args);
+
+ TAO::Upcall_Wrapper upcall_wrapper;
+ upcall_wrapper.upcall (server_request
+ , args
+ , nargs
+ , command
+#if TAO_HAS_INTERCEPTORS == 1
+ , servant_upcall
+ , exceptions
+ , nexceptions
+#endif /* TAO_HAS_INTERCEPTORS == 1 */
+ ACE_ENV_ARG_PARAMETER);
+ ACE_CHECK;
+}
+
+// TAO_IDL - Generated from
+// be\be_visitor_interface/interface_ss.cpp:513
+
+void POA_CORBA::ComponentIR::EventDef::_interface_skel (
+ TAO_ServerRequest & server_request,
+ void * /* servant_upcall */,
+ void * servant
+ ACE_ENV_ARG_DECL
+ )
+{
+ TAO_IFR_Client_Adapter *_tao_adapter =
+ ACE_Dynamic_Service<TAO_IFR_Client_Adapter>::instance (
+ TAO_ORB_Core::ifr_client_adapter_name ()
+ );
+
+ if (_tao_adapter == 0)
+ {
+ ACE_THROW ( ::CORBA::INTF_REPOS ( ::CORBA::OMGVMCID | 1,
+ ::CORBA::COMPLETED_NO));
+ }
+
+ POA_CORBA::ComponentIR::EventDef * const impl =
+ static_cast<POA_CORBA::ComponentIR::EventDef *> (servant);
+ ::CORBA::InterfaceDef_ptr _tao_retval =
+ impl->_get_interface (ACE_ENV_SINGLE_ARG_PARAMETER);
+ ACE_CHECK;
+
+ server_request.init_reply ();
+ TAO_OutputCDR &_tao_out = *server_request.outgoing ();
+
+ ::CORBA::Boolean const _tao_result =
+ _tao_adapter->interfacedef_cdr_insert (
+ _tao_out,
+ _tao_retval
+ );
+
+ _tao_adapter->dispose (_tao_retval);
+
+ if (_tao_result == false)
+ {
+ ACE_THROW ( ::CORBA::MARSHAL ());
+ }
+}namespace POA_CORBA
+{
+ namespace ComponentIR
+ {
+
+
+ // TAO_IDL - Generated from
+ // be\be_visitor_operation/upcall_command_ss.cpp:127
+
+ class _get_component_EventDef_Upcall_Command
+ : public TAO::Upcall_Command
+ {
+ public:
+ inline _get_component_EventDef_Upcall_Command (
+ POA_CORBA::ComponentIR::EventDef * servant,
+ TAO_Operation_Details const * operation_details,
+ TAO::Argument * const args[])
+ : servant_ (servant)
+ , operation_details_ (operation_details)
+ , args_ (args)
+ {
+ }
+
+ virtual void execute (ACE_ENV_SINGLE_ARG_DECL)
+ {
+ TAO::SArg_Traits< ::CORBA::Object>::ret_arg_type retval =
+ TAO::Portable_Server::get_ret_arg< ::CORBA::Object> (
+ this->operation_details_,
+ this->args_);
+
+ retval =
+ this->servant_-> _get_component (
+ ACE_ENV_SINGLE_ARG_PARAMETER);
+ ACE_CHECK;
+ }
+
+ private:
+ POA_CORBA::ComponentIR::EventDef * const servant_;
+ TAO_Operation_Details const * const operation_details_;
+ TAO::Argument * const * const args_;
+ };
+ }
+
+}
+
+
+void POA_CORBA::ComponentIR::EventDef::_component_skel (
+ TAO_ServerRequest & server_request,
+ void * TAO_INTERCEPTOR (servant_upcall),
+ void * servant
+ ACE_ENV_ARG_DECL
+ )
+{
+#if TAO_HAS_INTERCEPTORS == 1
+ static ::CORBA::TypeCode_ptr const * const exceptions = 0;
+ static ::CORBA::ULong const nexceptions = 0;
+#endif /* TAO_HAS_INTERCEPTORS */
+
+ TAO::SArg_Traits< ::CORBA::Object>::ret_val retval;
+
+ TAO::Argument * const args[] =
+ {
+ &retval
+ };
+
+ static size_t const nargs = 1;
+
+ POA_CORBA::ComponentIR::EventDef * const impl =
+ static_cast<POA_CORBA::ComponentIR::EventDef *> (servant);
+
+ _get_component_EventDef_Upcall_Command command (
+ impl,
+ server_request.operation_details (),
+ args);
+
+ TAO::Upcall_Wrapper upcall_wrapper;
+ upcall_wrapper.upcall (server_request
+ , args
+ , nargs
+ , command
+#if TAO_HAS_INTERCEPTORS == 1
+ , servant_upcall
+ , exceptions
+ , nexceptions
+#endif /* TAO_HAS_INTERCEPTORS == 1 */
+ ACE_ENV_ARG_PARAMETER);
+ ACE_CHECK;
+}
+
+::CORBA::Boolean POA_CORBA::ComponentIR::EventDef::_is_a (
+ const char* value
+ ACE_ENV_ARG_DECL_NOT_USED
+ )
+{
+ return
+ (
+ !ACE_OS::strcmp (
+ value,
+ "IDL:omg.org/CORBA/IRObject:1.0"
+ ) ||
+ !ACE_OS::strcmp (
+ value,
+ "IDL:omg.org/CORBA/Container:1.0"
+ ) ||
+ !ACE_OS::strcmp (
+ value,
+ "IDL:omg.org/CORBA/Contained:1.0"
+ ) ||
+ !ACE_OS::strcmp (
+ value,
+ "IDL:omg.org/CORBA/IDLType:1.0"
+ ) ||
+ !ACE_OS::strcmp (
+ value,
+ "IDL:omg.org/CORBA/ValueDef:1.0"
+ ) ||
+ !ACE_OS::strcmp (
+ value,
+ "IDL:omg.org/CORBA/ExtValueDef:1.0"
+ ) ||
+ !ACE_OS::strcmp (
+ value,
+ "IDL:omg.org/CORBA/ComponentIR/EventDef:1.0"
+ ) ||
+ !ACE_OS::strcmp (
+ value,
+ "IDL:omg.org/CORBA/Object:1.0"
+ )
+ );
+}
+
+const char* POA_CORBA::ComponentIR::EventDef::_interface_repository_id (void) const
+{
+ return "IDL:omg.org/CORBA/ComponentIR/EventDef:1.0";
+}
+
+// TAO_IDL - Generated from
+// be\be_visitor_interface/interface_ss.cpp:903
+
+void POA_CORBA::ComponentIR::EventDef::_dispatch (
+ TAO_ServerRequest & req,
+ void * servant_upcall
+ ACE_ENV_ARG_DECL
+ )
+{
+ this->synchronous_upcall_dispatch (req,
+ servant_upcall,
+ this
+ ACE_ENV_ARG_PARAMETER);
+}
+
+// TAO_IDL - Generated from
+// be\be_visitor_interface/interface_ss.cpp:851
+
+CORBA::ComponentIR::EventDef *
+POA_CORBA::ComponentIR::EventDef::_this (ACE_ENV_SINGLE_ARG_DECL)
+{
+ TAO_Stub *stub = this->_create_stub (ACE_ENV_SINGLE_ARG_PARAMETER);
+ ACE_CHECK_RETURN (0);
+
+ TAO_Stub_Auto_Ptr safe_stub (stub);
+ ::CORBA::Object_ptr tmp = CORBA::Object::_nil ();
+
+ ::CORBA::Boolean const _tao_opt_colloc =
+ stub->servant_orb_var ()->orb_core ()->optimize_collocation_objects ();
+
+ ACE_NEW_RETURN (
+ tmp,
+ ::CORBA::Object (stub, _tao_opt_colloc, this),
+ 0
+ );
+
+ ::CORBA::Object_var obj = tmp;
+ (void) safe_stub.release ();
+
+ typedef ::CORBA::ComponentIR::EventDef STUB_SCOPED_NAME;
+ return
+ TAO::Narrow_Utils<STUB_SCOPED_NAME>::unchecked_narrow (
+ obj.in (),
+ CORBA_ComponentIR__TAO_EventDef_Proxy_Broker_Factory_function_pointer
+ );
+}
+
+// TAO_IDL - Generated from
+// be\be_interface.cpp:1499
+
+class TAO_CORBA_ComponentIR_Container_Perfect_Hash_OpTable
+ : public TAO_Perfect_Hash_OpTable
+{
+private:
+ unsigned int hash (const char *str, unsigned int len);
+
+public:
+ const TAO_operation_db_entry * lookup (const char *str, unsigned int len);
+};
+
+/* C++ code produced by gperf version 2.8 (ACE version) */
+/* Command-line: C:\ACE\latest\ACE_wrappers\bin\gperf.exe -m -M -J -c -C -D -E -T -f 0 -F 0,0 -a -o -t -p -K opname -L C++ -Z TAO_CORBA_ComponentIR_Container_Perfect_Hash_OpTable -N lookup */
+unsigned int
+TAO_CORBA_ComponentIR_Container_Perfect_Hash_OpTable::hash (const char *str, unsigned int len)
+{
+ static const unsigned char asso_values[] =
+ {
+#if defined (ACE_MVS)
+ 47, 47, 47, 47, 47, 47, 47, 47, 47, 47,
+ 47, 47, 47, 47, 47, 47, 47, 47, 47, 47,
+ 47, 47, 47, 47, 47, 47, 47, 47, 47, 47,
+ 47, 47, 47, 47, 47, 47, 47, 47, 47, 47,
+ 47, 47, 47, 47, 47, 47, 47, 47, 47, 47,
+ 47, 47, 47, 47, 47, 47, 47, 47, 47, 47,
+ 47, 47, 47, 47, 47, 47, 47, 47, 47, 47,
+ 47, 47, 47, 47, 47, 47, 47, 47, 47, 47,
+ 47, 47, 47, 47, 47, 47, 47, 47, 47, 47,
+ 47, 47, 47, 47, 47, 47, 47, 47, 47, 47,
+ 47, 47, 47, 47, 47, 47, 47, 47, 47, 20,
+ 47, 47, 47, 47, 47, 47, 47, 47, 47, 47,
+ 47, 47, 47, 47, 47, 47, 47, 47, 47, 15,
+ 47, 0, 0, 0, 47, 47, 47, 47, 47, 47,
+ 47, 47, 47, 47, 47, 47, 47, 30, 20, 30,
+ 47, 0, 47, 47, 47, 47, 47, 47, 47, 47,
+ 47, 47, 15, 5, 47, 47, 47, 10, 0, 47,
+ 47, 47, 47, 47, 47, 47, 47, 47, 47, 47,
+ 47, 47, 47, 47, 47, 47, 47, 47, 47, 47,
+ 47, 47, 47, 47, 47, 47, 47, 47, 47, 47,
+ 47, 47, 47, 47, 47, 47, 47, 47, 47, 47,
+ 47, 47, 47, 47, 47, 47, 47, 47, 47, 47,
+ 47, 47, 47, 47, 47, 47, 47, 47, 47, 47,
+ 47, 47, 47, 47, 47, 47, 47, 47, 47, 47,
+ 47, 47, 47, 47, 47, 47, 47, 47, 47, 47,
+ 47, 47, 47, 47, 47, 47,
+#else
+ 47, 47, 47, 47, 47, 47, 47, 47, 47, 47,
+ 47, 47, 47, 47, 47, 47, 47, 47, 47, 47,
+ 47, 47, 47, 47, 47, 47, 47, 47, 47, 47,
+ 47, 47, 47, 47, 47, 47, 47, 47, 47, 47,
+ 47, 47, 47, 47, 47, 47, 47, 47, 47, 47,
+ 47, 47, 47, 47, 47, 47, 47, 47, 47, 47,
+ 47, 47, 47, 47, 47, 47, 47, 47, 47, 47,
+ 47, 47, 47, 47, 47, 47, 47, 47, 47, 47,
+ 47, 47, 47, 47, 47, 47, 47, 47, 47, 47,
+ 47, 47, 47, 47, 47, 20, 47, 15, 47, 0,
+ 0, 0, 47, 47, 47, 47, 47, 47, 30, 20,
+ 30, 47, 0, 47, 47, 15, 5, 47, 47, 47,
+ 10, 0, 47, 47, 47, 47, 47, 47,
+#endif /* ACE_MVS */
+ };
+ return len + asso_values[(int) str[len - 1]] + asso_values[(int) str[0]];
+}
+
+const TAO_operation_db_entry *
+TAO_CORBA_ComponentIR_Container_Perfect_Hash_OpTable::lookup (const char *str, unsigned int len)
+{
+ enum
+ {
+ TOTAL_KEYWORDS = 28,
+ MIN_WORD_LENGTH = 5,
+ MAX_WORD_LENGTH = 25,
+ MIN_HASH_VALUE = 7,
+ MAX_HASH_VALUE = 46,
+ HASH_VALUE_RANGE = 40,
+ DUPLICATES = 3,
+ WORDLIST_SIZE = 35
+ };
+
+ static const TAO_operation_db_entry wordlist[] =
+ {
+ {"",0,0},{"",0,0},{"",0,0},{"",0,0},{"",0,0},{"",0,0},{"",0,0},
+ {"destroy", &POA_CORBA::ComponentIR::Container::destroy_skel, 0},
+ {"create_home", &POA_CORBA::ComponentIR::Container::create_home_skel, 0},
+ {"create_value", &POA_CORBA::ComponentIR::Container::create_value_skel, 0},
+ {"create_module", &POA_CORBA::ComponentIR::Container::create_module_skel, 0},
+ {"create_native", &POA_CORBA::ComponentIR::Container::create_native_skel, 0},
+ {"create_interface", &POA_CORBA::ComponentIR::Container::create_interface_skel, 0},
+ {"create_ext_value", &POA_CORBA::ComponentIR::Container::create_ext_value_skel, 0},
+ {"create_event", &POA_CORBA::ComponentIR::Container::create_event_skel, 0},
+ {"create_struct", &POA_CORBA::ComponentIR::Container::create_struct_skel, 0},
+ {"create_constant", &POA_CORBA::ComponentIR::Container::create_constant_skel, 0},
+ {"create_component", &POA_CORBA::ComponentIR::Container::create_component_skel, 0},
+ {"create_local_interface", &POA_CORBA::ComponentIR::Container::create_local_interface_skel, 0},
+ {"contents", &POA_CORBA::ComponentIR::Container::contents_skel, 0},
+ {"create_abstract_interface", &POA_CORBA::ComponentIR::Container::create_abstract_interface_skel, 0},
+ {"create_value_box", &POA_CORBA::ComponentIR::Container::create_value_box_skel, 0},
+ {"create_alias", &POA_CORBA::ComponentIR::Container::create_alias_skel, 0},
+ {"_interface", &POA_CORBA::ComponentIR::Container::_interface_skel, 0},
+ {"create_enum", &POA_CORBA::ComponentIR::Container::create_enum_skel, 0},
+ {"describe_contents", &POA_CORBA::ComponentIR::Container::describe_contents_skel, 0},
+ {"_get_def_kind", &POA_CORBA::ComponentIR::Container::_get_def_kind_skel, 0},
+ {"_repository_id", &POA_CORBA::ComponentIR::Container::_repository_id_skel, 0},
+ {"_component", &POA_CORBA::ComponentIR::Container::_component_skel, 0},
+ {"lookup", &POA_CORBA::ComponentIR::Container::lookup_skel, 0},
+ {"_non_existent", &POA_CORBA::ComponentIR::Container::_non_existent_skel, 0},
+ {"_is_a", &POA_CORBA::ComponentIR::Container::_is_a_skel, 0},
+ {"lookup_name", &POA_CORBA::ComponentIR::Container::lookup_name_skel, 0},
+ {"create_union", &POA_CORBA::ComponentIR::Container::create_union_skel, 0},
+ {"create_exception", &POA_CORBA::ComponentIR::Container::create_exception_skel, 0},
+ };
+
+ static const signed char lookup[] =
+ {
+ -1, -1, -1, -1, -1, -1, -1, 7, -1, -10, -2, 8, 9, -50,
+ -12, -2, -48, 14, 15, -1, 16, 17, 18, 19, -1, 20, 21, 22,
+ -1, -1, 23, 24, 25, 26, 27, 28, 29, -1, 30, -1, 31, 32,
+ 33, -1, -1, -1, 34,
+ };
+
+ if (len <= MAX_WORD_LENGTH && len >= MIN_WORD_LENGTH)
+ {
+ unsigned int key = hash (str, len);
+
+ if (key <= MAX_HASH_VALUE && key >= MIN_HASH_VALUE)
+ {
+ int slot = lookup[key];
+
+ if (slot >= 0 && slot < WORDLIST_SIZE)
+ {
+ const char *s = wordlist[slot].opname;
+
+ if (*str == *s && !strncmp (str + 1, s + 1, len - 1))
+ return &wordlist[slot];
+ }
+ else if (slot < 0 && slot >= -MAX_HASH_VALUE)
+ return 0;
+ else
+ {
+ unsigned int offset = key + slot + (slot > 0 ? -MAX_HASH_VALUE : MAX_HASH_VALUE);
+ const TAO_operation_db_entry *base = &wordlist[-lookup[offset]];
+ const TAO_operation_db_entry *ptr = base + -lookup[offset + 1];
+
+ while (--ptr >= base)
+ if (*str == *ptr->opname && !strncmp (str + 1, ptr->opname + 1, len - 1))
+ return ptr;
+ }
+ }
+ }
+ return 0;
+}
+
+static TAO_CORBA_ComponentIR_Container_Perfect_Hash_OpTable tao_CORBA_ComponentIR_Container_optable;
+
+// TAO_IDL - Generated from
+// be\be_visitor_interface/interface_ss.cpp:966
+
+TAO::Collocation_Proxy_Broker *
+CORBA_ComponentIR__TAO_Container_Proxy_Broker_Factory_function ( ::CORBA::Object_ptr)
+{
+ return reinterpret_cast<TAO::Collocation_Proxy_Broker *> (0xdead); // Dummy
+}
+
+int
+CORBA_ComponentIR__TAO_Container_Proxy_Broker_Factory_Initializer (size_t)
+{
+ CORBA_ComponentIR__TAO_Container_Proxy_Broker_Factory_function_pointer =
+ CORBA_ComponentIR__TAO_Container_Proxy_Broker_Factory_function;
+
+ return 0;
+}
+
+static int
+CORBA_ComponentIR__TAO_Container_Proxy_Broker_Stub_Factory_Initializer_Scarecrow =
+ CORBA_ComponentIR__TAO_Container_Proxy_Broker_Factory_Initializer (
+ reinterpret_cast<size_t> (CORBA_ComponentIR__TAO_Container_Proxy_Broker_Factory_Initializer)
+ );
+
+// TAO_IDL - Generated from
+// be\be_visitor_interface/interface_ss.cpp:103
+
+POA_CORBA::ComponentIR::Container::Container (void)
+ : TAO_ServantBase ()
+{
+ this->optable_ = &tao_CORBA_ComponentIR_Container_optable;
+}
+
+POA_CORBA::ComponentIR::Container::Container (const Container& rhs)
+ : TAO_Abstract_ServantBase (rhs),
+ TAO_ServantBase (rhs),
+ POA_CORBA::IRObject (rhs),
+ POA_CORBA::Container (rhs)
+{
+}
+
+POA_CORBA::ComponentIR::Container::~Container (void)
+{
+}namespace POA_CORBA
+{
+ namespace ComponentIR
+ {
+
+
+ // TAO_IDL - Generated from
+ // be\be_visitor_operation/upcall_command_ss.cpp:127
+
+ class create_component_Container
+ : public TAO::Upcall_Command
+ {
+ public:
+ inline create_component_Container (
+ POA_CORBA::ComponentIR::Container * servant,
+ TAO_Operation_Details const * operation_details,
+ TAO::Argument * const args[])
+ : servant_ (servant)
+ , operation_details_ (operation_details)
+ , args_ (args)
+ {
+ }
+
+ virtual void execute (ACE_ENV_SINGLE_ARG_DECL)
+ {
+ TAO::SArg_Traits< ::CORBA::ComponentIR::ComponentDef>::ret_arg_type retval =
+ TAO::Portable_Server::get_ret_arg< ::CORBA::ComponentIR::ComponentDef> (
+ this->operation_details_,
+ this->args_);
+
+ TAO::SArg_Traits< ::CORBA::RepositoryId>::in_arg_type arg_1 =
+ TAO::Portable_Server::get_in_arg< ::CORBA::RepositoryId> (
+ this->operation_details_,
+ this->args_,
+ 1);
+
+ TAO::SArg_Traits< ::CORBA::Identifier>::in_arg_type arg_2 =
+ TAO::Portable_Server::get_in_arg< ::CORBA::Identifier> (
+ this->operation_details_,
+ this->args_,
+ 2);
+
+ TAO::SArg_Traits< ::CORBA::VersionSpec>::in_arg_type arg_3 =
+ TAO::Portable_Server::get_in_arg< ::CORBA::VersionSpec> (
+ this->operation_details_,
+ this->args_,
+ 3);
+
+ TAO::SArg_Traits< ::CORBA::ComponentIR::ComponentDef>::in_arg_type arg_4 =
+ TAO::Portable_Server::get_in_arg< ::CORBA::ComponentIR::ComponentDef> (
+ this->operation_details_,
+ this->args_,
+ 4);
+
+ TAO::SArg_Traits< ::CORBA::InterfaceDefSeq>::in_arg_type arg_5 =
+ TAO::Portable_Server::get_in_arg< ::CORBA::InterfaceDefSeq> (
+ this->operation_details_,
+ this->args_,
+ 5);
+
+ retval =
+ this->servant_->create_component (
+ arg_1
+ , arg_2
+ , arg_3
+ , arg_4
+ , arg_5
+ ACE_ENV_ARG_PARAMETER);
+ ACE_CHECK;
+ }
+
+ private:
+ POA_CORBA::ComponentIR::Container * const servant_;
+ TAO_Operation_Details const * const operation_details_;
+ TAO::Argument * const * const args_;
+ };
+ }
+
+}
+
+
+// TAO_IDL - Generated from
+// be\be_visitor_operation/operation_ss.cpp:190
+
+void POA_CORBA::ComponentIR::Container::create_component_skel (
+ TAO_ServerRequest & server_request,
+ void * TAO_INTERCEPTOR (servant_upcall),
+ void * servant
+ ACE_ENV_ARG_DECL
+ )
+{
+#if TAO_HAS_INTERCEPTORS == 1
+ static ::CORBA::TypeCode_ptr const * const exceptions = 0;
+ static ::CORBA::ULong const nexceptions = 0;
+#endif /* TAO_HAS_INTERCEPTORS */
+
+ TAO::SArg_Traits< ::CORBA::ComponentIR::ComponentDef>::ret_val retval;
+ TAO::SArg_Traits< ::CORBA::RepositoryId>::in_arg_val _tao_id;
+ TAO::SArg_Traits< ::CORBA::Identifier>::in_arg_val _tao_name;
+ TAO::SArg_Traits< ::CORBA::VersionSpec>::in_arg_val _tao_version;
+ TAO::SArg_Traits< ::CORBA::ComponentIR::ComponentDef>::in_arg_val _tao_base_component;
+ TAO::SArg_Traits< ::CORBA::InterfaceDefSeq>::in_arg_val _tao_supports_interfaces;
+
+ TAO::Argument * const args[] =
+ {
+ &retval,
+ &_tao_id,
+ &_tao_name,
+ &_tao_version,
+ &_tao_base_component,
+ &_tao_supports_interfaces
+ };
+
+ static size_t const nargs = 6;
+
+ POA_CORBA::ComponentIR::Container * const impl =
+ static_cast<POA_CORBA::ComponentIR::Container *> (servant);
+
+ create_component_Container command (
+ impl,
+ server_request.operation_details (),
+ args);
+
+ TAO::Upcall_Wrapper upcall_wrapper;
+ upcall_wrapper.upcall (server_request
+ , args
+ , nargs
+ , command
+#if TAO_HAS_INTERCEPTORS == 1
+ , servant_upcall
+ , exceptions
+ , nexceptions
+#endif /* TAO_HAS_INTERCEPTORS == 1 */
+ ACE_ENV_ARG_PARAMETER);
+ ACE_CHECK;
+}namespace POA_CORBA
+{
+ namespace ComponentIR
+ {
+
+
+ // TAO_IDL - Generated from
+ // be\be_visitor_operation/upcall_command_ss.cpp:127
+
+ class create_home_Container
+ : public TAO::Upcall_Command
+ {
+ public:
+ inline create_home_Container (
+ POA_CORBA::ComponentIR::Container * servant,
+ TAO_Operation_Details const * operation_details,
+ TAO::Argument * const args[])
+ : servant_ (servant)
+ , operation_details_ (operation_details)
+ , args_ (args)
+ {
+ }
+
+ virtual void execute (ACE_ENV_SINGLE_ARG_DECL)
+ {
+ TAO::SArg_Traits< ::CORBA::ComponentIR::HomeDef>::ret_arg_type retval =
+ TAO::Portable_Server::get_ret_arg< ::CORBA::ComponentIR::HomeDef> (
+ this->operation_details_,
+ this->args_);
+
+ TAO::SArg_Traits< ::CORBA::RepositoryId>::in_arg_type arg_1 =
+ TAO::Portable_Server::get_in_arg< ::CORBA::RepositoryId> (
+ this->operation_details_,
+ this->args_,
+ 1);
+
+ TAO::SArg_Traits< ::CORBA::Identifier>::in_arg_type arg_2 =
+ TAO::Portable_Server::get_in_arg< ::CORBA::Identifier> (
+ this->operation_details_,
+ this->args_,
+ 2);
+
+ TAO::SArg_Traits< ::CORBA::VersionSpec>::in_arg_type arg_3 =
+ TAO::Portable_Server::get_in_arg< ::CORBA::VersionSpec> (
+ this->operation_details_,
+ this->args_,
+ 3);
+
+ TAO::SArg_Traits< ::CORBA::ComponentIR::HomeDef>::in_arg_type arg_4 =
+ TAO::Portable_Server::get_in_arg< ::CORBA::ComponentIR::HomeDef> (
+ this->operation_details_,
+ this->args_,
+ 4);
+
+ TAO::SArg_Traits< ::CORBA::ComponentIR::ComponentDef>::in_arg_type arg_5 =
+ TAO::Portable_Server::get_in_arg< ::CORBA::ComponentIR::ComponentDef> (
+ this->operation_details_,
+ this->args_,
+ 5);
+
+ TAO::SArg_Traits< ::CORBA::InterfaceDefSeq>::in_arg_type arg_6 =
+ TAO::Portable_Server::get_in_arg< ::CORBA::InterfaceDefSeq> (
+ this->operation_details_,
+ this->args_,
+ 6);
+
+ TAO::SArg_Traits< ::CORBA::ValueDef>::in_arg_type arg_7 =
+ TAO::Portable_Server::get_in_arg< ::CORBA::ValueDef> (
+ this->operation_details_,
+ this->args_,
+ 7);
+
+ retval =
+ this->servant_->create_home (
+ arg_1
+ , arg_2
+ , arg_3
+ , arg_4
+ , arg_5
+ , arg_6
+ , arg_7
+ ACE_ENV_ARG_PARAMETER);
+ ACE_CHECK;
+ }
+
+ private:
+ POA_CORBA::ComponentIR::Container * const servant_;
+ TAO_Operation_Details const * const operation_details_;
+ TAO::Argument * const * const args_;
+ };
+ }
+
+}
+
+
+// TAO_IDL - Generated from
+// be\be_visitor_operation/operation_ss.cpp:190
+
+void POA_CORBA::ComponentIR::Container::create_home_skel (
+ TAO_ServerRequest & server_request,
+ void * TAO_INTERCEPTOR (servant_upcall),
+ void * servant
+ ACE_ENV_ARG_DECL
+ )
+{
+#if TAO_HAS_INTERCEPTORS == 1
+ static ::CORBA::TypeCode_ptr const * const exceptions = 0;
+ static ::CORBA::ULong const nexceptions = 0;
+#endif /* TAO_HAS_INTERCEPTORS */
+
+ TAO::SArg_Traits< ::CORBA::ComponentIR::HomeDef>::ret_val retval;
+ TAO::SArg_Traits< ::CORBA::RepositoryId>::in_arg_val _tao_id;
+ TAO::SArg_Traits< ::CORBA::Identifier>::in_arg_val _tao_name;
+ TAO::SArg_Traits< ::CORBA::VersionSpec>::in_arg_val _tao_version;
+ TAO::SArg_Traits< ::CORBA::ComponentIR::HomeDef>::in_arg_val _tao_base_home;
+ TAO::SArg_Traits< ::CORBA::ComponentIR::ComponentDef>::in_arg_val _tao_managed_component;
+ TAO::SArg_Traits< ::CORBA::InterfaceDefSeq>::in_arg_val _tao_supports_interfaces;
+ TAO::SArg_Traits< ::CORBA::ValueDef>::in_arg_val _tao_primary_key;
+
+ TAO::Argument * const args[] =
+ {
+ &retval,
+ &_tao_id,
+ &_tao_name,
+ &_tao_version,
+ &_tao_base_home,
+ &_tao_managed_component,
+ &_tao_supports_interfaces,
+ &_tao_primary_key
+ };
+
+ static size_t const nargs = 8;
+
+ POA_CORBA::ComponentIR::Container * const impl =
+ static_cast<POA_CORBA::ComponentIR::Container *> (servant);
+
+ create_home_Container command (
+ impl,
+ server_request.operation_details (),
+ args);
+
+ TAO::Upcall_Wrapper upcall_wrapper;
+ upcall_wrapper.upcall (server_request
+ , args
+ , nargs
+ , command
+#if TAO_HAS_INTERCEPTORS == 1
+ , servant_upcall
+ , exceptions
+ , nexceptions
+#endif /* TAO_HAS_INTERCEPTORS == 1 */
+ ACE_ENV_ARG_PARAMETER);
+ ACE_CHECK;
+}namespace POA_CORBA
+{
+ namespace ComponentIR
+ {
+
+
+ // TAO_IDL - Generated from
+ // be\be_visitor_operation/upcall_command_ss.cpp:127
+
+ class create_event_Container
+ : public TAO::Upcall_Command
+ {
+ public:
+ inline create_event_Container (
+ POA_CORBA::ComponentIR::Container * servant,
+ TAO_Operation_Details const * operation_details,
+ TAO::Argument * const args[])
+ : servant_ (servant)
+ , operation_details_ (operation_details)
+ , args_ (args)
+ {
+ }
+
+ virtual void execute (ACE_ENV_SINGLE_ARG_DECL)
+ {
+ TAO::SArg_Traits< ::CORBA::ComponentIR::EventDef>::ret_arg_type retval =
+ TAO::Portable_Server::get_ret_arg< ::CORBA::ComponentIR::EventDef> (
+ this->operation_details_,
+ this->args_);
+
+ TAO::SArg_Traits< ::CORBA::RepositoryId>::in_arg_type arg_1 =
+ TAO::Portable_Server::get_in_arg< ::CORBA::RepositoryId> (
+ this->operation_details_,
+ this->args_,
+ 1);
+
+ TAO::SArg_Traits< ::CORBA::Identifier>::in_arg_type arg_2 =
+ TAO::Portable_Server::get_in_arg< ::CORBA::Identifier> (
+ this->operation_details_,
+ this->args_,
+ 2);
+
+ TAO::SArg_Traits< ::CORBA::VersionSpec>::in_arg_type arg_3 =
+ TAO::Portable_Server::get_in_arg< ::CORBA::VersionSpec> (
+ this->operation_details_,
+ this->args_,
+ 3);
+
+ TAO::SArg_Traits< ::ACE_InputCDR::to_boolean>::in_arg_type arg_4 =
+ TAO::Portable_Server::get_in_arg< ::ACE_InputCDR::to_boolean> (
+ this->operation_details_,
+ this->args_,
+ 4);
+
+ TAO::SArg_Traits< ::ACE_InputCDR::to_boolean>::in_arg_type arg_5 =
+ TAO::Portable_Server::get_in_arg< ::ACE_InputCDR::to_boolean> (
+ this->operation_details_,
+ this->args_,
+ 5);
+
+ TAO::SArg_Traits< ::CORBA::ValueDef>::in_arg_type arg_6 =
+ TAO::Portable_Server::get_in_arg< ::CORBA::ValueDef> (
+ this->operation_details_,
+ this->args_,
+ 6);
+
+ TAO::SArg_Traits< ::ACE_InputCDR::to_boolean>::in_arg_type arg_7 =
+ TAO::Portable_Server::get_in_arg< ::ACE_InputCDR::to_boolean> (
+ this->operation_details_,
+ this->args_,
+ 7);
+
+ TAO::SArg_Traits< ::CORBA::ValueDefSeq>::in_arg_type arg_8 =
+ TAO::Portable_Server::get_in_arg< ::CORBA::ValueDefSeq> (
+ this->operation_details_,
+ this->args_,
+ 8);
+
+ TAO::SArg_Traits< ::CORBA::InterfaceDefSeq>::in_arg_type arg_9 =
+ TAO::Portable_Server::get_in_arg< ::CORBA::InterfaceDefSeq> (
+ this->operation_details_,
+ this->args_,
+ 9);
+
+ TAO::SArg_Traits< ::CORBA::ExtInitializerSeq>::in_arg_type arg_10 =
+ TAO::Portable_Server::get_in_arg< ::CORBA::ExtInitializerSeq> (
+ this->operation_details_,
+ this->args_,
+ 10);
+
+ retval =
+ this->servant_->create_event (
+ arg_1
+ , arg_2
+ , arg_3
+ , arg_4
+ , arg_5
+ , arg_6
+ , arg_7
+ , arg_8
+ , arg_9
+ , arg_10
+ ACE_ENV_ARG_PARAMETER);
+ ACE_CHECK;
+ }
+
+ private:
+ POA_CORBA::ComponentIR::Container * const servant_;
+ TAO_Operation_Details const * const operation_details_;
+ TAO::Argument * const * const args_;
+ };
+ }
+
+}
+
+
+// TAO_IDL - Generated from
+// be\be_visitor_operation/operation_ss.cpp:190
+
+void POA_CORBA::ComponentIR::Container::create_event_skel (
+ TAO_ServerRequest & server_request,
+ void * TAO_INTERCEPTOR (servant_upcall),
+ void * servant
+ ACE_ENV_ARG_DECL
+ )
+{
+#if TAO_HAS_INTERCEPTORS == 1
+ static ::CORBA::TypeCode_ptr const * const exceptions = 0;
+ static ::CORBA::ULong const nexceptions = 0;
+#endif /* TAO_HAS_INTERCEPTORS */
+
+ TAO::SArg_Traits< ::CORBA::ComponentIR::EventDef>::ret_val retval;
+ TAO::SArg_Traits< ::CORBA::RepositoryId>::in_arg_val _tao_id;
+ TAO::SArg_Traits< ::CORBA::Identifier>::in_arg_val _tao_name;
+ TAO::SArg_Traits< ::CORBA::VersionSpec>::in_arg_val _tao_version;
+ TAO::SArg_Traits< ::ACE_InputCDR::to_boolean>::in_arg_val _tao_is_custom;
+ TAO::SArg_Traits< ::ACE_InputCDR::to_boolean>::in_arg_val _tao_is_abstract;
+ TAO::SArg_Traits< ::CORBA::ValueDef>::in_arg_val _tao_base_value;
+ TAO::SArg_Traits< ::ACE_InputCDR::to_boolean>::in_arg_val _tao_is_truncatable;
+ TAO::SArg_Traits< ::CORBA::ValueDefSeq>::in_arg_val _tao_abstract_base_values;
+ TAO::SArg_Traits< ::CORBA::InterfaceDefSeq>::in_arg_val _tao_supported_interfaces;
+ TAO::SArg_Traits< ::CORBA::ExtInitializerSeq>::in_arg_val _tao_initializers;
+
+ TAO::Argument * const args[] =
+ {
+ &retval,
+ &_tao_id,
+ &_tao_name,
+ &_tao_version,
+ &_tao_is_custom,
+ &_tao_is_abstract,
+ &_tao_base_value,
+ &_tao_is_truncatable,
+ &_tao_abstract_base_values,
+ &_tao_supported_interfaces,
+ &_tao_initializers
+ };
+
+ static size_t const nargs = 11;
+
+ POA_CORBA::ComponentIR::Container * const impl =
+ static_cast<POA_CORBA::ComponentIR::Container *> (servant);
+
+ create_event_Container command (
+ impl,
+ server_request.operation_details (),
+ args);
+
+ TAO::Upcall_Wrapper upcall_wrapper;
+ upcall_wrapper.upcall (server_request
+ , args
+ , nargs
+ , command
+#if TAO_HAS_INTERCEPTORS == 1
+ , servant_upcall
+ , exceptions
+ , nexceptions
+#endif /* TAO_HAS_INTERCEPTORS == 1 */
+ ACE_ENV_ARG_PARAMETER);
+ ACE_CHECK;
+}
+
+// TAO_IDL - Generated from
+// be\be_visitor_interface/interface_ss.cpp:169
+
+namespace POA_CORBA
+{
+ namespace ComponentIR
+ {
+
+
+ // TAO_IDL - Generated from
+ // be\be_visitor_operation/upcall_command_ss.cpp:127
+
+ class _is_a_Container_Upcall_Command
+ : public TAO::Upcall_Command
+ {
+ public:
+ inline _is_a_Container_Upcall_Command (
+ POA_CORBA::ComponentIR::Container * servant,
+ TAO_Operation_Details const * operation_details,
+ TAO::Argument * const args[])
+ : servant_ (servant)
+ , operation_details_ (operation_details)
+ , args_ (args)
+ {
+ }
+
+ virtual void execute (ACE_ENV_SINGLE_ARG_DECL)
+ {
+ TAO::SArg_Traits< ::ACE_InputCDR::to_boolean>::ret_arg_type retval =
+ TAO::Portable_Server::get_ret_arg< ::ACE_InputCDR::to_boolean> (
+ this->operation_details_,
+ this->args_);
+
+ TAO::SArg_Traits< ::CORBA::Char *>::in_arg_type arg_1 =
+ TAO::Portable_Server::get_in_arg< ::CORBA::Char *> (
+ this->operation_details_,
+ this->args_,
+ 1);
+
+ retval =
+ this->servant_-> _is_a (
+ arg_1
+ ACE_ENV_ARG_PARAMETER);
+ ACE_CHECK;
+ }
+
+ private:
+ POA_CORBA::ComponentIR::Container * const servant_;
+ TAO_Operation_Details const * const operation_details_;
+ TAO::Argument * const * const args_;
+ };
+ }
+
+}
+
+
+void POA_CORBA::ComponentIR::Container::_is_a_skel (
+ TAO_ServerRequest & server_request,
+ void * TAO_INTERCEPTOR (servant_upcall),
+ void * servant
+ ACE_ENV_ARG_DECL
+ )
+{
+#if TAO_HAS_INTERCEPTORS == 1
+ static ::CORBA::TypeCode_ptr const * const exceptions = 0;
+ static ::CORBA::ULong const nexceptions = 0;
+#endif /* TAO_HAS_INTERCEPTORS */
+
+ TAO::SArg_Traits< ::ACE_InputCDR::to_boolean>::ret_val retval;
+ TAO::SArg_Traits< ::CORBA::Char *>::in_arg_val _tao_repository_id;
+
+ TAO::Argument * const args[] =
+ {
+ &retval,
+ &_tao_repository_id
+ };
+
+ static size_t const nargs = 2;
+
+ POA_CORBA::ComponentIR::Container * const impl =
+ static_cast<POA_CORBA::ComponentIR::Container *> (servant);
+
+ _is_a_Container_Upcall_Command command (
+ impl,
+ server_request.operation_details (),
+ args);
+
+ TAO::Upcall_Wrapper upcall_wrapper;
+ upcall_wrapper.upcall (server_request
+ , args
+ , nargs
+ , command
+#if TAO_HAS_INTERCEPTORS == 1
+ , servant_upcall
+ , exceptions
+ , nexceptions
+#endif /* TAO_HAS_INTERCEPTORS == 1 */
+ ACE_ENV_ARG_PARAMETER);
+ ACE_CHECK;
+}namespace POA_CORBA
+{
+ namespace ComponentIR
+ {
+
+
+ // TAO_IDL - Generated from
+ // be\be_visitor_operation/upcall_command_ss.cpp:127
+
+ class _non_existent_Container_Upcall_Command
+ : public TAO::Upcall_Command
+ {
+ public:
+ inline _non_existent_Container_Upcall_Command (
+ POA_CORBA::ComponentIR::Container * servant,
+ TAO_Operation_Details const * operation_details,
+ TAO::Argument * const args[])
+ : servant_ (servant)
+ , operation_details_ (operation_details)
+ , args_ (args)
+ {
+ }
+
+ virtual void execute (ACE_ENV_SINGLE_ARG_DECL)
+ {
+ TAO::SArg_Traits< ::ACE_InputCDR::to_boolean>::ret_arg_type retval =
+ TAO::Portable_Server::get_ret_arg< ::ACE_InputCDR::to_boolean> (
+ this->operation_details_,
+ this->args_);
+
+ retval =
+ this->servant_-> _non_existent (
+ ACE_ENV_SINGLE_ARG_PARAMETER);
+ ACE_CHECK;
+ }
+
+ private:
+ POA_CORBA::ComponentIR::Container * const servant_;
+ TAO_Operation_Details const * const operation_details_;
+ TAO::Argument * const * const args_;
+ };
+ }
+
+}
+
+
+void POA_CORBA::ComponentIR::Container::_non_existent_skel (
+ TAO_ServerRequest & server_request,
+ void * TAO_INTERCEPTOR (servant_upcall),
+ void * servant
+ ACE_ENV_ARG_DECL
+ )
+{
+#if TAO_HAS_INTERCEPTORS == 1
+ static ::CORBA::TypeCode_ptr const * const exceptions = 0;
+ static ::CORBA::ULong const nexceptions = 0;
+#endif /* TAO_HAS_INTERCEPTORS */
+
+ TAO::SArg_Traits< ::ACE_InputCDR::to_boolean>::ret_val retval;
+
+ TAO::Argument * const args[] =
+ {
+ &retval
+ };
+
+ static size_t const nargs = 1;
+
+ POA_CORBA::ComponentIR::Container * const impl =
+ static_cast<POA_CORBA::ComponentIR::Container *> (servant);
+
+ _non_existent_Container_Upcall_Command command (
+ impl,
+ server_request.operation_details (),
+ args);
+
+ TAO::Upcall_Wrapper upcall_wrapper;
+ upcall_wrapper.upcall (server_request
+ , args
+ , nargs
+ , command
+#if TAO_HAS_INTERCEPTORS == 1
+ , servant_upcall
+ , exceptions
+ , nexceptions
+#endif /* TAO_HAS_INTERCEPTORS == 1 */
+ ACE_ENV_ARG_PARAMETER);
+ ACE_CHECK;
+}namespace POA_CORBA
+{
+ namespace ComponentIR
+ {
+
+
+ // TAO_IDL - Generated from
+ // be\be_visitor_operation/upcall_command_ss.cpp:127
+
+ class _repository_id_Container_Upcall_Command
+ : public TAO::Upcall_Command
+ {
+ public:
+ inline _repository_id_Container_Upcall_Command (
+ POA_CORBA::ComponentIR::Container * servant,
+ TAO_Operation_Details const * operation_details,
+ TAO::Argument * const args[])
+ : servant_ (servant)
+ , operation_details_ (operation_details)
+ , args_ (args)
+ {
+ }
+
+ virtual void execute (ACE_ENV_SINGLE_ARG_DECL)
+ {
+ TAO::SArg_Traits< ::CORBA::Char *>::ret_arg_type retval =
+ TAO::Portable_Server::get_ret_arg< ::CORBA::Char *> (
+ this->operation_details_,
+ this->args_);
+
+ retval =
+ this->servant_-> _repository_id (
+ ACE_ENV_SINGLE_ARG_PARAMETER);
+ ACE_CHECK;
+ }
+
+ private:
+ POA_CORBA::ComponentIR::Container * const servant_;
+ TAO_Operation_Details const * const operation_details_;
+ TAO::Argument * const * const args_;
+ };
+ }
+
+}
+
+
+void POA_CORBA::ComponentIR::Container::_repository_id_skel (
+ TAO_ServerRequest & server_request,
+ void * TAO_INTERCEPTOR (servant_upcall),
+ void * servant
+ ACE_ENV_ARG_DECL
+ )
+{
+#if TAO_HAS_INTERCEPTORS == 1
+ static ::CORBA::TypeCode_ptr const * const exceptions = 0;
+ static ::CORBA::ULong const nexceptions = 0;
+#endif /* TAO_HAS_INTERCEPTORS */
+
+ TAO::SArg_Traits< ::CORBA::Char *>::ret_val retval;
+
+ TAO::Argument * const args[] =
+ {
+ &retval
+ };
+
+ static size_t const nargs = 1;
+
+ POA_CORBA::ComponentIR::Container * const impl =
+ static_cast<POA_CORBA::ComponentIR::Container *> (servant);
+
+ _repository_id_Container_Upcall_Command command (
+ impl,
+ server_request.operation_details (),
+ args);
+
+ TAO::Upcall_Wrapper upcall_wrapper;
+ upcall_wrapper.upcall (server_request
+ , args
+ , nargs
+ , command
+#if TAO_HAS_INTERCEPTORS == 1
+ , servant_upcall
+ , exceptions
+ , nexceptions
+#endif /* TAO_HAS_INTERCEPTORS == 1 */
+ ACE_ENV_ARG_PARAMETER);
+ ACE_CHECK;
+}
+
+// TAO_IDL - Generated from
+// be\be_visitor_interface/interface_ss.cpp:513
+
+void POA_CORBA::ComponentIR::Container::_interface_skel (
+ TAO_ServerRequest & server_request,
+ void * /* servant_upcall */,
+ void * servant
+ ACE_ENV_ARG_DECL
+ )
+{
+ TAO_IFR_Client_Adapter *_tao_adapter =
+ ACE_Dynamic_Service<TAO_IFR_Client_Adapter>::instance (
+ TAO_ORB_Core::ifr_client_adapter_name ()
+ );
+
+ if (_tao_adapter == 0)
+ {
+ ACE_THROW ( ::CORBA::INTF_REPOS ( ::CORBA::OMGVMCID | 1,
+ ::CORBA::COMPLETED_NO));
+ }
+
+ POA_CORBA::ComponentIR::Container * const impl =
+ static_cast<POA_CORBA::ComponentIR::Container *> (servant);
+ ::CORBA::InterfaceDef_ptr _tao_retval =
+ impl->_get_interface (ACE_ENV_SINGLE_ARG_PARAMETER);
+ ACE_CHECK;
+
+ server_request.init_reply ();
+ TAO_OutputCDR &_tao_out = *server_request.outgoing ();
+
+ ::CORBA::Boolean const _tao_result =
+ _tao_adapter->interfacedef_cdr_insert (
+ _tao_out,
+ _tao_retval
+ );
+
+ _tao_adapter->dispose (_tao_retval);
+
+ if (_tao_result == false)
+ {
+ ACE_THROW ( ::CORBA::MARSHAL ());
+ }
+}namespace POA_CORBA
+{
+ namespace ComponentIR
+ {
+
+
+ // TAO_IDL - Generated from
+ // be\be_visitor_operation/upcall_command_ss.cpp:127
+
+ class _get_component_Container_Upcall_Command
+ : public TAO::Upcall_Command
+ {
+ public:
+ inline _get_component_Container_Upcall_Command (
+ POA_CORBA::ComponentIR::Container * servant,
+ TAO_Operation_Details const * operation_details,
+ TAO::Argument * const args[])
+ : servant_ (servant)
+ , operation_details_ (operation_details)
+ , args_ (args)
+ {
+ }
+
+ virtual void execute (ACE_ENV_SINGLE_ARG_DECL)
+ {
+ TAO::SArg_Traits< ::CORBA::Object>::ret_arg_type retval =
+ TAO::Portable_Server::get_ret_arg< ::CORBA::Object> (
+ this->operation_details_,
+ this->args_);
+
+ retval =
+ this->servant_-> _get_component (
+ ACE_ENV_SINGLE_ARG_PARAMETER);
+ ACE_CHECK;
+ }
+
+ private:
+ POA_CORBA::ComponentIR::Container * const servant_;
+ TAO_Operation_Details const * const operation_details_;
+ TAO::Argument * const * const args_;
+ };
+ }
+
+}
+
+
+void POA_CORBA::ComponentIR::Container::_component_skel (
+ TAO_ServerRequest & server_request,
+ void * TAO_INTERCEPTOR (servant_upcall),
+ void * servant
+ ACE_ENV_ARG_DECL
+ )
+{
+#if TAO_HAS_INTERCEPTORS == 1
+ static ::CORBA::TypeCode_ptr const * const exceptions = 0;
+ static ::CORBA::ULong const nexceptions = 0;
+#endif /* TAO_HAS_INTERCEPTORS */
+
+ TAO::SArg_Traits< ::CORBA::Object>::ret_val retval;
+
+ TAO::Argument * const args[] =
+ {
+ &retval
+ };
+
+ static size_t const nargs = 1;
+
+ POA_CORBA::ComponentIR::Container * const impl =
+ static_cast<POA_CORBA::ComponentIR::Container *> (servant);
+
+ _get_component_Container_Upcall_Command command (
+ impl,
+ server_request.operation_details (),
+ args);
+
+ TAO::Upcall_Wrapper upcall_wrapper;
+ upcall_wrapper.upcall (server_request
+ , args
+ , nargs
+ , command
+#if TAO_HAS_INTERCEPTORS == 1
+ , servant_upcall
+ , exceptions
+ , nexceptions
+#endif /* TAO_HAS_INTERCEPTORS == 1 */
+ ACE_ENV_ARG_PARAMETER);
+ ACE_CHECK;
+}
+
+::CORBA::Boolean POA_CORBA::ComponentIR::Container::_is_a (
+ const char* value
+ ACE_ENV_ARG_DECL_NOT_USED
+ )
+{
+ return
+ (
+ !ACE_OS::strcmp (
+ value,
+ "IDL:omg.org/CORBA/IRObject:1.0"
+ ) ||
+ !ACE_OS::strcmp (
+ value,
+ "IDL:omg.org/CORBA/Container:1.0"
+ ) ||
+ !ACE_OS::strcmp (
+ value,
+ "IDL:omg.org/CORBA/ComponentIR/Container:1.0"
+ ) ||
+ !ACE_OS::strcmp (
+ value,
+ "IDL:omg.org/CORBA/Object:1.0"
+ )
+ );
+}
+
+const char* POA_CORBA::ComponentIR::Container::_interface_repository_id (void) const
+{
+ return "IDL:omg.org/CORBA/ComponentIR/Container:1.0";
+}
+
+// TAO_IDL - Generated from
+// be\be_visitor_interface/interface_ss.cpp:903
+
+void POA_CORBA::ComponentIR::Container::_dispatch (
+ TAO_ServerRequest & req,
+ void * servant_upcall
+ ACE_ENV_ARG_DECL
+ )
+{
+ this->synchronous_upcall_dispatch (req,
+ servant_upcall,
+ this
+ ACE_ENV_ARG_PARAMETER);
+}
+
+// TAO_IDL - Generated from
+// be\be_visitor_interface/interface_ss.cpp:851
+
+CORBA::ComponentIR::Container *
+POA_CORBA::ComponentIR::Container::_this (ACE_ENV_SINGLE_ARG_DECL)
+{
+ TAO_Stub *stub = this->_create_stub (ACE_ENV_SINGLE_ARG_PARAMETER);
+ ACE_CHECK_RETURN (0);
+
+ TAO_Stub_Auto_Ptr safe_stub (stub);
+ ::CORBA::Object_ptr tmp = CORBA::Object::_nil ();
+
+ ::CORBA::Boolean const _tao_opt_colloc =
+ stub->servant_orb_var ()->orb_core ()->optimize_collocation_objects ();
+
+ ACE_NEW_RETURN (
+ tmp,
+ ::CORBA::Object (stub, _tao_opt_colloc, this),
+ 0
+ );
+
+ ::CORBA::Object_var obj = tmp;
+ (void) safe_stub.release ();
+
+ typedef ::CORBA::ComponentIR::Container STUB_SCOPED_NAME;
+ return
+ TAO::Narrow_Utils<STUB_SCOPED_NAME>::unchecked_narrow (
+ obj.in (),
+ CORBA_ComponentIR__TAO_Container_Proxy_Broker_Factory_function_pointer
+ );
+}
+
+// TAO_IDL - Generated from
+// be\be_interface.cpp:1499
+
+class TAO_CORBA_ComponentIR_ModuleDef_Perfect_Hash_OpTable
+ : public TAO_Perfect_Hash_OpTable
+{
+private:
+ unsigned int hash (const char *str, unsigned int len);
+
+public:
+ const TAO_operation_db_entry * lookup (const char *str, unsigned int len);
+};
+
+/* C++ code produced by gperf version 2.8 (ACE version) */
+/* Command-line: C:\ACE\latest\ACE_wrappers\bin\gperf.exe -m -M -J -c -C -D -E -T -f 0 -F 0,0 -a -o -t -p -K opname -L C++ -Z TAO_CORBA_ComponentIR_ModuleDef_Perfect_Hash_OpTable -N lookup */
+unsigned int
+TAO_CORBA_ComponentIR_ModuleDef_Perfect_Hash_OpTable::hash (const char *str, unsigned int len)
+{
+ static const unsigned char asso_values[] =
+ {
+#if defined (ACE_MVS)
+ 58, 58, 58, 58, 58, 58, 58, 58, 58, 58,
+ 58, 58, 58, 58, 58, 58, 58, 58, 58, 58,
+ 58, 58, 58, 58, 58, 58, 58, 58, 58, 58,
+ 58, 58, 58, 58, 58, 58, 58, 58, 58, 58,
+ 58, 58, 58, 58, 58, 58, 58, 58, 58, 58,
+ 58, 58, 58, 58, 58, 58, 58, 58, 58, 58,
+ 58, 58, 58, 58, 58, 58, 58, 58, 58, 58,
+ 58, 58, 58, 58, 58, 58, 58, 58, 58, 58,
+ 58, 58, 58, 58, 58, 58, 58, 58, 58, 58,
+ 58, 58, 58, 58, 58, 58, 58, 58, 58, 58,
+ 58, 58, 58, 58, 58, 58, 58, 58, 58, 25,
+ 58, 58, 58, 58, 58, 58, 58, 58, 58, 58,
+ 58, 58, 58, 58, 58, 58, 58, 58, 58, 10,
+ 58, 0, 0, 0, 58, 58, 58, 58, 58, 58,
+ 58, 58, 58, 58, 58, 58, 58, 30, 15, 5,
+ 58, 10, 58, 58, 58, 58, 58, 58, 58, 58,
+ 58, 58, 40, 15, 58, 58, 58, 20, 0, 58,
+ 58, 58, 58, 58, 58, 58, 58, 58, 58, 58,
+ 58, 58, 58, 58, 58, 58, 58, 58, 58, 58,
+ 58, 58, 58, 58, 58, 58, 58, 58, 58, 58,
+ 58, 58, 58, 58, 58, 58, 58, 58, 58, 58,
+ 58, 58, 58, 58, 58, 58, 58, 58, 58, 58,
+ 58, 58, 58, 58, 58, 58, 58, 58, 58, 58,
+ 58, 58, 58, 58, 58, 58, 58, 58, 58, 58,
+ 58, 58, 58, 58, 58, 58, 58, 58, 58, 58,
+ 58, 58, 58, 58, 58, 58,
+#else
+ 58, 58, 58, 58, 58, 58, 58, 58, 58, 58,
+ 58, 58, 58, 58, 58, 58, 58, 58, 58, 58,
+ 58, 58, 58, 58, 58, 58, 58, 58, 58, 58,
+ 58, 58, 58, 58, 58, 58, 58, 58, 58, 58,
+ 58, 58, 58, 58, 58, 58, 58, 58, 58, 58,
+ 58, 58, 58, 58, 58, 58, 58, 58, 58, 58,
+ 58, 58, 58, 58, 58, 58, 58, 58, 58, 58,
+ 58, 58, 58, 58, 58, 58, 58, 58, 58, 58,
+ 58, 58, 58, 58, 58, 58, 58, 58, 58, 58,
+ 58, 58, 58, 58, 58, 25, 58, 10, 58, 0,
+ 0, 0, 58, 58, 58, 58, 58, 58, 30, 15,
+ 5, 58, 10, 58, 58, 40, 15, 58, 58, 58,
+ 20, 0, 58, 58, 58, 58, 58, 58,
+#endif /* ACE_MVS */
+ };
+ return len + asso_values[(int) str[len - 1]] + asso_values[(int) str[0]];
+}
+
+const TAO_operation_db_entry *
+TAO_CORBA_ComponentIR_ModuleDef_Perfect_Hash_OpTable::lookup (const char *str, unsigned int len)
+{
+ enum
+ {
+ TOTAL_KEYWORDS = 39,
+ MIN_WORD_LENGTH = 4,
+ MAX_WORD_LENGTH = 26,
+ MIN_HASH_VALUE = 7,
+ MAX_HASH_VALUE = 57,
+ HASH_VALUE_RANGE = 51,
+ DUPLICATES = 6,
+ WORDLIST_SIZE = 46
+ };
+
+ static const TAO_operation_db_entry wordlist[] =
+ {
+ {"",0,0},{"",0,0},{"",0,0},{"",0,0},{"",0,0},{"",0,0},{"",0,0},
+ {"destroy", &POA_CORBA::ComponentIR::ModuleDef::destroy_skel, 0},
+ {"describe", &POA_CORBA::ComponentIR::ModuleDef::describe_skel, 0},
+ {"create_home", &POA_CORBA::ComponentIR::ModuleDef::create_home_skel, 0},
+ {"create_value", &POA_CORBA::ComponentIR::ModuleDef::create_value_skel, 0},
+ {"create_module", &POA_CORBA::ComponentIR::ModuleDef::create_module_skel, 0},
+ {"create_native", &POA_CORBA::ComponentIR::ModuleDef::create_native_skel, 0},
+ {"create_interface", &POA_CORBA::ComponentIR::ModuleDef::create_interface_skel, 0},
+ {"create_ext_value", &POA_CORBA::ComponentIR::ModuleDef::create_ext_value_skel, 0},
+ {"create_union", &POA_CORBA::ComponentIR::ModuleDef::create_union_skel, 0},
+ {"move", &POA_CORBA::ComponentIR::ModuleDef::move_skel, 0},
+ {"create_exception", &POA_CORBA::ComponentIR::ModuleDef::create_exception_skel, 0},
+ {"create_local_interface", &POA_CORBA::ComponentIR::ModuleDef::create_local_interface_skel, 0},
+ {"create_abstract_interface", &POA_CORBA::ComponentIR::ModuleDef::create_abstract_interface_skel, 0},
+ {"create_enum", &POA_CORBA::ComponentIR::ModuleDef::create_enum_skel, 0},
+ {"create_event", &POA_CORBA::ComponentIR::ModuleDef::create_event_skel, 0},
+ {"create_struct", &POA_CORBA::ComponentIR::ModuleDef::create_struct_skel, 0},
+ {"create_constant", &POA_CORBA::ComponentIR::ModuleDef::create_constant_skel, 0},
+ {"create_component", &POA_CORBA::ComponentIR::ModuleDef::create_component_skel, 0},
+ {"_get_id", &POA_CORBA::ComponentIR::ModuleDef::_get_id_skel, 0},
+ {"_set_id", &POA_CORBA::ComponentIR::ModuleDef::_set_id_skel, 0},
+ {"_get_name", &POA_CORBA::ComponentIR::ModuleDef::_get_name_skel, 0},
+ {"_set_name", &POA_CORBA::ComponentIR::ModuleDef::_set_name_skel, 0},
+ {"_interface", &POA_CORBA::ComponentIR::ModuleDef::_interface_skel, 0},
+ {"create_value_box", &POA_CORBA::ComponentIR::ModuleDef::create_value_box_skel, 0},
+ {"_get_def_kind", &POA_CORBA::ComponentIR::ModuleDef::_get_def_kind_skel, 0},
+ {"_repository_id", &POA_CORBA::ComponentIR::ModuleDef::_repository_id_skel, 0},
+ {"_is_a", &POA_CORBA::ComponentIR::ModuleDef::_is_a_skel, 0},
+ {"lookup_name", &POA_CORBA::ComponentIR::ModuleDef::lookup_name_skel, 0},
+ {"_get_version", &POA_CORBA::ComponentIR::ModuleDef::_get_version_skel, 0},
+ {"_set_version", &POA_CORBA::ComponentIR::ModuleDef::_set_version_skel, 0},
+ {"_get_absolute_name", &POA_CORBA::ComponentIR::ModuleDef::_get_absolute_name_skel, 0},
+ {"_get_defined_in", &POA_CORBA::ComponentIR::ModuleDef::_get_defined_in_skel, 0},
+ {"lookup", &POA_CORBA::ComponentIR::ModuleDef::lookup_skel, 0},
+ {"contents", &POA_CORBA::ComponentIR::ModuleDef::contents_skel, 0},
+ {"_component", &POA_CORBA::ComponentIR::ModuleDef::_component_skel, 0},
+ {"_get_containing_repository", &POA_CORBA::ComponentIR::ModuleDef::_get_containing_repository_skel, 0},
+ {"create_alias", &POA_CORBA::ComponentIR::ModuleDef::create_alias_skel, 0},
+ {"_non_existent", &POA_CORBA::ComponentIR::ModuleDef::_non_existent_skel, 0},
+ {"describe_contents", &POA_CORBA::ComponentIR::ModuleDef::describe_contents_skel, 0},
+ };
+
+ static const signed char lookup[] =
+ {
+ -1, -1, -1, -11, -2, -13, -2, 7, 8, -25, -2, 9, 10, -67,
+ -27, -2, -68, 15, -1, 16, -1, 17, 18, -35, -2, 19, 20, 21,
+ 22, -1, 23, 24, -80, -1, -77, 29, 30, -1, 31, 32, 33, 34,
+ -76, 37, -1, 38, 39, -1, 40, -1, 41, 42, 43, 44, -1, -1,
+ -1, 45,
+ };
+
+ if (len <= MAX_WORD_LENGTH && len >= MIN_WORD_LENGTH)
+ {
+ unsigned int key = hash (str, len);
+
+ if (key <= MAX_HASH_VALUE && key >= MIN_HASH_VALUE)
+ {
+ int slot = lookup[key];
+
+ if (slot >= 0 && slot < WORDLIST_SIZE)
+ {
+ const char *s = wordlist[slot].opname;
+
+ if (*str == *s && !strncmp (str + 1, s + 1, len - 1))
+ return &wordlist[slot];
+ }
+ else if (slot < 0 && slot >= -MAX_HASH_VALUE)
+ return 0;
+ else
+ {
+ unsigned int offset = key + slot + (slot > 0 ? -MAX_HASH_VALUE : MAX_HASH_VALUE);
+ const TAO_operation_db_entry *base = &wordlist[-lookup[offset]];
+ const TAO_operation_db_entry *ptr = base + -lookup[offset + 1];
+
+ while (--ptr >= base)
+ if (*str == *ptr->opname && !strncmp (str + 1, ptr->opname + 1, len - 1))
+ return ptr;
+ }
+ }
+ }
+ return 0;
+}
+
+static TAO_CORBA_ComponentIR_ModuleDef_Perfect_Hash_OpTable tao_CORBA_ComponentIR_ModuleDef_optable;
+
+// TAO_IDL - Generated from
+// be\be_visitor_interface/interface_ss.cpp:966
+
+TAO::Collocation_Proxy_Broker *
+CORBA_ComponentIR__TAO_ModuleDef_Proxy_Broker_Factory_function ( ::CORBA::Object_ptr)
+{
+ return reinterpret_cast<TAO::Collocation_Proxy_Broker *> (0xdead); // Dummy
+}
+
+int
+CORBA_ComponentIR__TAO_ModuleDef_Proxy_Broker_Factory_Initializer (size_t)
+{
+ CORBA_ComponentIR__TAO_ModuleDef_Proxy_Broker_Factory_function_pointer =
+ CORBA_ComponentIR__TAO_ModuleDef_Proxy_Broker_Factory_function;
+
+ return 0;
+}
+
+static int
+CORBA_ComponentIR__TAO_ModuleDef_Proxy_Broker_Stub_Factory_Initializer_Scarecrow =
+ CORBA_ComponentIR__TAO_ModuleDef_Proxy_Broker_Factory_Initializer (
+ reinterpret_cast<size_t> (CORBA_ComponentIR__TAO_ModuleDef_Proxy_Broker_Factory_Initializer)
+ );
+
+// TAO_IDL - Generated from
+// be\be_visitor_interface/interface_ss.cpp:103
+
+POA_CORBA::ComponentIR::ModuleDef::ModuleDef (void)
+ : TAO_ServantBase ()
+{
+ this->optable_ = &tao_CORBA_ComponentIR_ModuleDef_optable;
+}
+
+POA_CORBA::ComponentIR::ModuleDef::ModuleDef (const ModuleDef& rhs)
+ : TAO_Abstract_ServantBase (rhs),
+ TAO_ServantBase (rhs),
+ POA_CORBA::IRObject (rhs),
+ POA_CORBA::Container (rhs),
+ POA_CORBA::Contained (rhs),
+ POA_CORBA::ModuleDef (rhs),
+ POA_CORBA::ComponentIR::Container (rhs)
+{
+}
+
+POA_CORBA::ComponentIR::ModuleDef::~ModuleDef (void)
+{
+}
+
+// TAO_IDL - Generated from
+// be\be_visitor_interface/interface_ss.cpp:169
+
+namespace POA_CORBA
+{
+ namespace ComponentIR
+ {
+
+
+ // TAO_IDL - Generated from
+ // be\be_visitor_operation/upcall_command_ss.cpp:127
+
+ class _is_a_ModuleDef_Upcall_Command
+ : public TAO::Upcall_Command
+ {
+ public:
+ inline _is_a_ModuleDef_Upcall_Command (
+ POA_CORBA::ComponentIR::ModuleDef * servant,
+ TAO_Operation_Details const * operation_details,
+ TAO::Argument * const args[])
+ : servant_ (servant)
+ , operation_details_ (operation_details)
+ , args_ (args)
+ {
+ }
+
+ virtual void execute (ACE_ENV_SINGLE_ARG_DECL)
+ {
+ TAO::SArg_Traits< ::ACE_InputCDR::to_boolean>::ret_arg_type retval =
+ TAO::Portable_Server::get_ret_arg< ::ACE_InputCDR::to_boolean> (
+ this->operation_details_,
+ this->args_);
+
+ TAO::SArg_Traits< ::CORBA::Char *>::in_arg_type arg_1 =
+ TAO::Portable_Server::get_in_arg< ::CORBA::Char *> (
+ this->operation_details_,
+ this->args_,
+ 1);
+
+ retval =
+ this->servant_-> _is_a (
+ arg_1
+ ACE_ENV_ARG_PARAMETER);
+ ACE_CHECK;
+ }
+
+ private:
+ POA_CORBA::ComponentIR::ModuleDef * const servant_;
+ TAO_Operation_Details const * const operation_details_;
+ TAO::Argument * const * const args_;
+ };
+ }
+
+}
+
+
+void POA_CORBA::ComponentIR::ModuleDef::_is_a_skel (
+ TAO_ServerRequest & server_request,
+ void * TAO_INTERCEPTOR (servant_upcall),
+ void * servant
+ ACE_ENV_ARG_DECL
+ )
+{
+#if TAO_HAS_INTERCEPTORS == 1
+ static ::CORBA::TypeCode_ptr const * const exceptions = 0;
+ static ::CORBA::ULong const nexceptions = 0;
+#endif /* TAO_HAS_INTERCEPTORS */
+
+ TAO::SArg_Traits< ::ACE_InputCDR::to_boolean>::ret_val retval;
+ TAO::SArg_Traits< ::CORBA::Char *>::in_arg_val _tao_repository_id;
+
+ TAO::Argument * const args[] =
+ {
+ &retval,
+ &_tao_repository_id
+ };
+
+ static size_t const nargs = 2;
+
+ POA_CORBA::ComponentIR::ModuleDef * const impl =
+ static_cast<POA_CORBA::ComponentIR::ModuleDef *> (servant);
+
+ _is_a_ModuleDef_Upcall_Command command (
+ impl,
+ server_request.operation_details (),
+ args);
+
+ TAO::Upcall_Wrapper upcall_wrapper;
+ upcall_wrapper.upcall (server_request
+ , args
+ , nargs
+ , command
+#if TAO_HAS_INTERCEPTORS == 1
+ , servant_upcall
+ , exceptions
+ , nexceptions
+#endif /* TAO_HAS_INTERCEPTORS == 1 */
+ ACE_ENV_ARG_PARAMETER);
+ ACE_CHECK;
+}namespace POA_CORBA
+{
+ namespace ComponentIR
+ {
+
+
+ // TAO_IDL - Generated from
+ // be\be_visitor_operation/upcall_command_ss.cpp:127
+
+ class _non_existent_ModuleDef_Upcall_Command
+ : public TAO::Upcall_Command
+ {
+ public:
+ inline _non_existent_ModuleDef_Upcall_Command (
+ POA_CORBA::ComponentIR::ModuleDef * servant,
+ TAO_Operation_Details const * operation_details,
+ TAO::Argument * const args[])
+ : servant_ (servant)
+ , operation_details_ (operation_details)
+ , args_ (args)
+ {
+ }
+
+ virtual void execute (ACE_ENV_SINGLE_ARG_DECL)
+ {
+ TAO::SArg_Traits< ::ACE_InputCDR::to_boolean>::ret_arg_type retval =
+ TAO::Portable_Server::get_ret_arg< ::ACE_InputCDR::to_boolean> (
+ this->operation_details_,
+ this->args_);
+
+ retval =
+ this->servant_-> _non_existent (
+ ACE_ENV_SINGLE_ARG_PARAMETER);
+ ACE_CHECK;
+ }
+
+ private:
+ POA_CORBA::ComponentIR::ModuleDef * const servant_;
+ TAO_Operation_Details const * const operation_details_;
+ TAO::Argument * const * const args_;
+ };
+ }
+
+}
+
+
+void POA_CORBA::ComponentIR::ModuleDef::_non_existent_skel (
+ TAO_ServerRequest & server_request,
+ void * TAO_INTERCEPTOR (servant_upcall),
+ void * servant
+ ACE_ENV_ARG_DECL
+ )
+{
+#if TAO_HAS_INTERCEPTORS == 1
+ static ::CORBA::TypeCode_ptr const * const exceptions = 0;
+ static ::CORBA::ULong const nexceptions = 0;
+#endif /* TAO_HAS_INTERCEPTORS */
+
+ TAO::SArg_Traits< ::ACE_InputCDR::to_boolean>::ret_val retval;
+
+ TAO::Argument * const args[] =
+ {
+ &retval
+ };
+
+ static size_t const nargs = 1;
+
+ POA_CORBA::ComponentIR::ModuleDef * const impl =
+ static_cast<POA_CORBA::ComponentIR::ModuleDef *> (servant);
+
+ _non_existent_ModuleDef_Upcall_Command command (
+ impl,
+ server_request.operation_details (),
+ args);
+
+ TAO::Upcall_Wrapper upcall_wrapper;
+ upcall_wrapper.upcall (server_request
+ , args
+ , nargs
+ , command
+#if TAO_HAS_INTERCEPTORS == 1
+ , servant_upcall
+ , exceptions
+ , nexceptions
+#endif /* TAO_HAS_INTERCEPTORS == 1 */
+ ACE_ENV_ARG_PARAMETER);
+ ACE_CHECK;
+}namespace POA_CORBA
+{
+ namespace ComponentIR
+ {
+
+
+ // TAO_IDL - Generated from
+ // be\be_visitor_operation/upcall_command_ss.cpp:127
+
+ class _repository_id_ModuleDef_Upcall_Command
+ : public TAO::Upcall_Command
+ {
+ public:
+ inline _repository_id_ModuleDef_Upcall_Command (
+ POA_CORBA::ComponentIR::ModuleDef * servant,
+ TAO_Operation_Details const * operation_details,
+ TAO::Argument * const args[])
+ : servant_ (servant)
+ , operation_details_ (operation_details)
+ , args_ (args)
+ {
+ }
+
+ virtual void execute (ACE_ENV_SINGLE_ARG_DECL)
+ {
+ TAO::SArg_Traits< ::CORBA::Char *>::ret_arg_type retval =
+ TAO::Portable_Server::get_ret_arg< ::CORBA::Char *> (
+ this->operation_details_,
+ this->args_);
+
+ retval =
+ this->servant_-> _repository_id (
+ ACE_ENV_SINGLE_ARG_PARAMETER);
+ ACE_CHECK;
+ }
+
+ private:
+ POA_CORBA::ComponentIR::ModuleDef * const servant_;
+ TAO_Operation_Details const * const operation_details_;
+ TAO::Argument * const * const args_;
+ };
+ }
+
+}
+
+
+void POA_CORBA::ComponentIR::ModuleDef::_repository_id_skel (
+ TAO_ServerRequest & server_request,
+ void * TAO_INTERCEPTOR (servant_upcall),
+ void * servant
+ ACE_ENV_ARG_DECL
+ )
+{
+#if TAO_HAS_INTERCEPTORS == 1
+ static ::CORBA::TypeCode_ptr const * const exceptions = 0;
+ static ::CORBA::ULong const nexceptions = 0;
+#endif /* TAO_HAS_INTERCEPTORS */
+
+ TAO::SArg_Traits< ::CORBA::Char *>::ret_val retval;
+
+ TAO::Argument * const args[] =
+ {
+ &retval
+ };
+
+ static size_t const nargs = 1;
+
+ POA_CORBA::ComponentIR::ModuleDef * const impl =
+ static_cast<POA_CORBA::ComponentIR::ModuleDef *> (servant);
+
+ _repository_id_ModuleDef_Upcall_Command command (
+ impl,
+ server_request.operation_details (),
+ args);
+
+ TAO::Upcall_Wrapper upcall_wrapper;
+ upcall_wrapper.upcall (server_request
+ , args
+ , nargs
+ , command
+#if TAO_HAS_INTERCEPTORS == 1
+ , servant_upcall
+ , exceptions
+ , nexceptions
+#endif /* TAO_HAS_INTERCEPTORS == 1 */
+ ACE_ENV_ARG_PARAMETER);
+ ACE_CHECK;
+}
+
+// TAO_IDL - Generated from
+// be\be_visitor_interface/interface_ss.cpp:513
+
+void POA_CORBA::ComponentIR::ModuleDef::_interface_skel (
+ TAO_ServerRequest & server_request,
+ void * /* servant_upcall */,
+ void * servant
+ ACE_ENV_ARG_DECL
+ )
+{
+ TAO_IFR_Client_Adapter *_tao_adapter =
+ ACE_Dynamic_Service<TAO_IFR_Client_Adapter>::instance (
+ TAO_ORB_Core::ifr_client_adapter_name ()
+ );
+
+ if (_tao_adapter == 0)
+ {
+ ACE_THROW ( ::CORBA::INTF_REPOS ( ::CORBA::OMGVMCID | 1,
+ ::CORBA::COMPLETED_NO));
+ }
+
+ POA_CORBA::ComponentIR::ModuleDef * const impl =
+ static_cast<POA_CORBA::ComponentIR::ModuleDef *> (servant);
+ ::CORBA::InterfaceDef_ptr _tao_retval =
+ impl->_get_interface (ACE_ENV_SINGLE_ARG_PARAMETER);
+ ACE_CHECK;
+
+ server_request.init_reply ();
+ TAO_OutputCDR &_tao_out = *server_request.outgoing ();
+
+ ::CORBA::Boolean const _tao_result =
+ _tao_adapter->interfacedef_cdr_insert (
+ _tao_out,
+ _tao_retval
+ );
+
+ _tao_adapter->dispose (_tao_retval);
+
+ if (_tao_result == false)
+ {
+ ACE_THROW ( ::CORBA::MARSHAL ());
+ }
+}namespace POA_CORBA
+{
+ namespace ComponentIR
+ {
+
+
+ // TAO_IDL - Generated from
+ // be\be_visitor_operation/upcall_command_ss.cpp:127
+
+ class _get_component_ModuleDef_Upcall_Command
+ : public TAO::Upcall_Command
+ {
+ public:
+ inline _get_component_ModuleDef_Upcall_Command (
+ POA_CORBA::ComponentIR::ModuleDef * servant,
+ TAO_Operation_Details const * operation_details,
+ TAO::Argument * const args[])
+ : servant_ (servant)
+ , operation_details_ (operation_details)
+ , args_ (args)
+ {
+ }
+
+ virtual void execute (ACE_ENV_SINGLE_ARG_DECL)
+ {
+ TAO::SArg_Traits< ::CORBA::Object>::ret_arg_type retval =
+ TAO::Portable_Server::get_ret_arg< ::CORBA::Object> (
+ this->operation_details_,
+ this->args_);
+
+ retval =
+ this->servant_-> _get_component (
+ ACE_ENV_SINGLE_ARG_PARAMETER);
+ ACE_CHECK;
+ }
+
+ private:
+ POA_CORBA::ComponentIR::ModuleDef * const servant_;
+ TAO_Operation_Details const * const operation_details_;
+ TAO::Argument * const * const args_;
+ };
+ }
+
+}
+
+
+void POA_CORBA::ComponentIR::ModuleDef::_component_skel (
+ TAO_ServerRequest & server_request,
+ void * TAO_INTERCEPTOR (servant_upcall),
+ void * servant
+ ACE_ENV_ARG_DECL
+ )
+{
+#if TAO_HAS_INTERCEPTORS == 1
+ static ::CORBA::TypeCode_ptr const * const exceptions = 0;
+ static ::CORBA::ULong const nexceptions = 0;
+#endif /* TAO_HAS_INTERCEPTORS */
+
+ TAO::SArg_Traits< ::CORBA::Object>::ret_val retval;
+
+ TAO::Argument * const args[] =
+ {
+ &retval
+ };
+
+ static size_t const nargs = 1;
+
+ POA_CORBA::ComponentIR::ModuleDef * const impl =
+ static_cast<POA_CORBA::ComponentIR::ModuleDef *> (servant);
+
+ _get_component_ModuleDef_Upcall_Command command (
+ impl,
+ server_request.operation_details (),
+ args);
+
+ TAO::Upcall_Wrapper upcall_wrapper;
+ upcall_wrapper.upcall (server_request
+ , args
+ , nargs
+ , command
+#if TAO_HAS_INTERCEPTORS == 1
+ , servant_upcall
+ , exceptions
+ , nexceptions
+#endif /* TAO_HAS_INTERCEPTORS == 1 */
+ ACE_ENV_ARG_PARAMETER);
+ ACE_CHECK;
+}
+
+::CORBA::Boolean POA_CORBA::ComponentIR::ModuleDef::_is_a (
+ const char* value
+ ACE_ENV_ARG_DECL_NOT_USED
+ )
+{
+ return
+ (
+ !ACE_OS::strcmp (
+ value,
+ "IDL:omg.org/CORBA/IRObject:1.0"
+ ) ||
+ !ACE_OS::strcmp (
+ value,
+ "IDL:omg.org/CORBA/Container:1.0"
+ ) ||
+ !ACE_OS::strcmp (
+ value,
+ "IDL:omg.org/CORBA/Contained:1.0"
+ ) ||
+ !ACE_OS::strcmp (
+ value,
+ "IDL:omg.org/CORBA/ModuleDef:1.0"
+ ) ||
+ !ACE_OS::strcmp (
+ value,
+ "IDL:omg.org/CORBA/ComponentIR/Container:1.0"
+ ) ||
+ !ACE_OS::strcmp (
+ value,
+ "IDL:omg.org/CORBA/ComponentIR/ModuleDef:1.0"
+ ) ||
+ !ACE_OS::strcmp (
+ value,
+ "IDL:omg.org/CORBA/Object:1.0"
+ )
+ );
+}
+
+const char* POA_CORBA::ComponentIR::ModuleDef::_interface_repository_id (void) const
+{
+ return "IDL:omg.org/CORBA/ComponentIR/ModuleDef:1.0";
+}
+
+// TAO_IDL - Generated from
+// be\be_visitor_interface/interface_ss.cpp:903
+
+void POA_CORBA::ComponentIR::ModuleDef::_dispatch (
+ TAO_ServerRequest & req,
+ void * servant_upcall
+ ACE_ENV_ARG_DECL
+ )
+{
+ this->synchronous_upcall_dispatch (req,
+ servant_upcall,
+ this
+ ACE_ENV_ARG_PARAMETER);
+}
+
+// TAO_IDL - Generated from
+// be\be_visitor_interface/interface_ss.cpp:851
+
+CORBA::ComponentIR::ModuleDef *
+POA_CORBA::ComponentIR::ModuleDef::_this (ACE_ENV_SINGLE_ARG_DECL)
+{
+ TAO_Stub *stub = this->_create_stub (ACE_ENV_SINGLE_ARG_PARAMETER);
+ ACE_CHECK_RETURN (0);
+
+ TAO_Stub_Auto_Ptr safe_stub (stub);
+ ::CORBA::Object_ptr tmp = CORBA::Object::_nil ();
+
+ ::CORBA::Boolean const _tao_opt_colloc =
+ stub->servant_orb_var ()->orb_core ()->optimize_collocation_objects ();
+
+ ACE_NEW_RETURN (
+ tmp,
+ ::CORBA::Object (stub, _tao_opt_colloc, this),
+ 0
+ );
+
+ ::CORBA::Object_var obj = tmp;
+ (void) safe_stub.release ();
+
+ typedef ::CORBA::ComponentIR::ModuleDef STUB_SCOPED_NAME;
+ return
+ TAO::Narrow_Utils<STUB_SCOPED_NAME>::unchecked_narrow (
+ obj.in (),
+ CORBA_ComponentIR__TAO_ModuleDef_Proxy_Broker_Factory_function_pointer
+ );
+}
+
+// TAO_IDL - Generated from
+// be\be_interface.cpp:1499
+
+class TAO_CORBA_ComponentIR_Repository_Perfect_Hash_OpTable
+ : public TAO_Perfect_Hash_OpTable
+{
+private:
+ unsigned int hash (const char *str, unsigned int len);
+
+public:
+ const TAO_operation_db_entry * lookup (const char *str, unsigned int len);
+};
+
+/* C++ code produced by gperf version 2.8 (ACE version) */
+/* Command-line: C:\ACE\latest\ACE_wrappers\bin\gperf.exe -m -M -J -c -C -D -E -T -f 0 -F 0,0 -a -o -t -p -K opname -L C++ -Z TAO_CORBA_ComponentIR_Repository_Perfect_Hash_OpTable -N lookup */
+unsigned int
+TAO_CORBA_ComponentIR_Repository_Perfect_Hash_OpTable::hash (const char *str, unsigned int len)
+{
+ static const unsigned char asso_values[] =
+ {
+#if defined (ACE_MVS)
+ 78, 78, 78, 78, 78, 78, 78, 78, 78, 78,
+ 78, 78, 78, 78, 78, 78, 78, 78, 78, 78,
+ 78, 78, 78, 78, 78, 78, 78, 78, 78, 78,
+ 78, 78, 78, 78, 78, 78, 78, 78, 78, 78,
+ 78, 78, 78, 78, 78, 78, 78, 78, 78, 78,
+ 78, 78, 78, 78, 78, 78, 78, 78, 78, 78,
+ 78, 78, 78, 78, 78, 78, 78, 78, 78, 78,
+ 78, 78, 78, 78, 78, 78, 78, 78, 78, 78,
+ 78, 78, 78, 78, 78, 78, 78, 78, 78, 78,
+ 78, 78, 78, 78, 78, 78, 78, 78, 78, 78,
+ 78, 78, 78, 78, 78, 78, 78, 78, 78, 10,
+ 78, 78, 78, 78, 78, 78, 78, 78, 78, 78,
+ 78, 78, 78, 78, 78, 78, 78, 78, 78, 0,
+ 78, 0, 15, 20, 78, 10, 78, 78, 78, 78,
+ 78, 78, 78, 78, 78, 78, 78, 20, 0, 25,
+ 78, 0, 78, 78, 78, 78, 78, 78, 78, 78,
+ 78, 78, 45, 5, 78, 78, 78, 0, 0, 78,
+ 78, 78, 78, 78, 78, 78, 78, 78, 78, 78,
+ 78, 78, 78, 78, 78, 78, 78, 78, 78, 78,
+ 78, 78, 78, 78, 78, 78, 78, 78, 78, 78,
+ 78, 78, 78, 78, 78, 78, 78, 78, 78, 78,
+ 78, 78, 78, 78, 78, 78, 78, 78, 78, 78,
+ 78, 78, 78, 78, 78, 78, 78, 78, 78, 78,
+ 78, 78, 78, 78, 78, 78, 78, 78, 78, 78,
+ 78, 78, 78, 78, 78, 78, 78, 78, 78, 78,
+ 78, 78, 78, 78, 78, 78,
+#else
+ 78, 78, 78, 78, 78, 78, 78, 78, 78, 78,
+ 78, 78, 78, 78, 78, 78, 78, 78, 78, 78,
+ 78, 78, 78, 78, 78, 78, 78, 78, 78, 78,
+ 78, 78, 78, 78, 78, 78, 78, 78, 78, 78,
+ 78, 78, 78, 78, 78, 78, 78, 78, 78, 78,
+ 78, 78, 78, 78, 78, 78, 78, 78, 78, 78,
+ 78, 78, 78, 78, 78, 78, 78, 78, 78, 78,
+ 78, 78, 78, 78, 78, 78, 78, 78, 78, 78,
+ 78, 78, 78, 78, 78, 78, 78, 78, 78, 78,
+ 78, 78, 78, 78, 78, 10, 78, 0, 78, 0,
+ 15, 20, 78, 10, 78, 78, 78, 78, 20, 0,
+ 25, 78, 0, 78, 78, 45, 5, 78, 78, 78,
+ 0, 0, 78, 78, 78, 78, 78, 78,
+#endif /* ACE_MVS */
+ };
+ return len + asso_values[(int) str[len - 1]] + asso_values[(int) str[0]];
+}
+
+const TAO_operation_db_entry *
+TAO_CORBA_ComponentIR_Repository_Perfect_Hash_OpTable::lookup (const char *str, unsigned int len)
+{
+ enum
+ {
+ TOTAL_KEYWORDS = 36,
+ MIN_WORD_LENGTH = 5,
+ MAX_WORD_LENGTH = 25,
+ MIN_HASH_VALUE = 11,
+ MAX_HASH_VALUE = 77,
+ HASH_VALUE_RANGE = 67,
+ DUPLICATES = 3,
+ WORDLIST_SIZE = 47
+ };
+
+ static const TAO_operation_db_entry wordlist[] =
+ {
+ {"",0,0},{"",0,0},{"",0,0},{"",0,0},{"",0,0},{"",0,0},{"",0,0},{"",0,0},{"",0,0},
+ {"",0,0},{"",0,0},
+ {"create_enum", &POA_CORBA::ComponentIR::Repository::create_enum_skel, 0},
+ {"create_array", &POA_CORBA::ComponentIR::Repository::create_array_skel, 0},
+ {"_is_a", &POA_CORBA::ComponentIR::Repository::_is_a_skel, 0},
+ {"create_value_box", &POA_CORBA::ComponentIR::Repository::create_value_box_skel, 0},
+ {"create_event", &POA_CORBA::ComponentIR::Repository::create_event_skel, 0},
+ {"create_struct", &POA_CORBA::ComponentIR::Repository::create_struct_skel, 0},
+ {"create_constant", &POA_CORBA::ComponentIR::Repository::create_constant_skel, 0},
+ {"create_component", &POA_CORBA::ComponentIR::Repository::create_component_skel, 0},
+ {"destroy", &POA_CORBA::ComponentIR::Repository::destroy_skel, 0},
+ {"create_string", &POA_CORBA::ComponentIR::Repository::create_string_skel, 0},
+ {"create_wstring", &POA_CORBA::ComponentIR::Repository::create_wstring_skel, 0},
+ {"_component", &POA_CORBA::ComponentIR::Repository::_component_skel, 0},
+ {"lookup", &POA_CORBA::ComponentIR::Repository::lookup_skel, 0},
+ {"create_fixed", &POA_CORBA::ComponentIR::Repository::create_fixed_skel, 0},
+ {"_non_existent", &POA_CORBA::ComponentIR::Repository::_non_existent_skel, 0},
+ {"create_home", &POA_CORBA::ComponentIR::Repository::create_home_skel, 0},
+ {"create_value", &POA_CORBA::ComponentIR::Repository::create_value_skel, 0},
+ {"create_module", &POA_CORBA::ComponentIR::Repository::create_module_skel, 0},
+ {"create_native", &POA_CORBA::ComponentIR::Repository::create_native_skel, 0},
+ {"create_sequence", &POA_CORBA::ComponentIR::Repository::create_sequence_skel, 0},
+ {"create_interface", &POA_CORBA::ComponentIR::Repository::create_interface_skel, 0},
+ {"create_ext_value", &POA_CORBA::ComponentIR::Repository::create_ext_value_skel, 0},
+ {"create_union", &POA_CORBA::ComponentIR::Repository::create_union_skel, 0},
+ {"_get_def_kind", &POA_CORBA::ComponentIR::Repository::_get_def_kind_skel, 0},
+ {"_repository_id", &POA_CORBA::ComponentIR::Repository::_repository_id_skel, 0},
+ {"_interface", &POA_CORBA::ComponentIR::Repository::_interface_skel, 0},
+ {"create_exception", &POA_CORBA::ComponentIR::Repository::create_exception_skel, 0},
+ {"create_local_interface", &POA_CORBA::ComponentIR::Repository::create_local_interface_skel, 0},
+ {"get_primitive", &POA_CORBA::ComponentIR::Repository::get_primitive_skel, 0},
+ {"lookup_id", &POA_CORBA::ComponentIR::Repository::lookup_id_skel, 0},
+ {"create_abstract_interface", &POA_CORBA::ComponentIR::Repository::create_abstract_interface_skel, 0},
+ {"lookup_name", &POA_CORBA::ComponentIR::Repository::lookup_name_skel, 0},
+ {"get_canonical_typecode", &POA_CORBA::ComponentIR::Repository::get_canonical_typecode_skel, 0},
+ {"contents", &POA_CORBA::ComponentIR::Repository::contents_skel, 0},
+ {"create_alias", &POA_CORBA::ComponentIR::Repository::create_alias_skel, 0},
+ {"describe_contents", &POA_CORBA::ComponentIR::Repository::describe_contents_skel, 0},
+ };
+
+ static const signed char lookup[] =
+ {
+ -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 11, 12, -28,
+ -2, 13, 14, 15, 16, -1, 17, 18, 19, 20, 21, 22, 23, 24,
+ 25, -31, -2, 26, 27, -97, -1, 30, -84, 33, 34, 35, 36, 37,
+ 38, 39, 40, 41, -1, -1, -1, -1, -1, 42, 43, 44, -1, -1,
+ -1, 45, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, 46,
+ };
+
+ if (len <= MAX_WORD_LENGTH && len >= MIN_WORD_LENGTH)
+ {
+ unsigned int key = hash (str, len);
+
+ if (key <= MAX_HASH_VALUE && key >= MIN_HASH_VALUE)
+ {
+ int slot = lookup[key];
+
+ if (slot >= 0 && slot < WORDLIST_SIZE)
+ {
+ const char *s = wordlist[slot].opname;
+
+ if (*str == *s && !strncmp (str + 1, s + 1, len - 1))
+ return &wordlist[slot];
+ }
+ else if (slot < 0 && slot >= -MAX_HASH_VALUE)
+ return 0;
+ else
+ {
+ unsigned int offset = key + slot + (slot > 0 ? -MAX_HASH_VALUE : MAX_HASH_VALUE);
+ const TAO_operation_db_entry *base = &wordlist[-lookup[offset]];
+ const TAO_operation_db_entry *ptr = base + -lookup[offset + 1];
+
+ while (--ptr >= base)
+ if (*str == *ptr->opname && !strncmp (str + 1, ptr->opname + 1, len - 1))
+ return ptr;
+ }
+ }
+ }
+ return 0;
+}
+
+static TAO_CORBA_ComponentIR_Repository_Perfect_Hash_OpTable tao_CORBA_ComponentIR_Repository_optable;
+
+// TAO_IDL - Generated from
+// be\be_visitor_interface/interface_ss.cpp:966
+
+TAO::Collocation_Proxy_Broker *
+CORBA_ComponentIR__TAO_Repository_Proxy_Broker_Factory_function ( ::CORBA::Object_ptr)
+{
+ return reinterpret_cast<TAO::Collocation_Proxy_Broker *> (0xdead); // Dummy
+}
+
+int
+CORBA_ComponentIR__TAO_Repository_Proxy_Broker_Factory_Initializer (size_t)
+{
+ CORBA_ComponentIR__TAO_Repository_Proxy_Broker_Factory_function_pointer =
+ CORBA_ComponentIR__TAO_Repository_Proxy_Broker_Factory_function;
+
+ return 0;
+}
+
+static int
+CORBA_ComponentIR__TAO_Repository_Proxy_Broker_Stub_Factory_Initializer_Scarecrow =
+ CORBA_ComponentIR__TAO_Repository_Proxy_Broker_Factory_Initializer (
+ reinterpret_cast<size_t> (CORBA_ComponentIR__TAO_Repository_Proxy_Broker_Factory_Initializer)
+ );
+
+// TAO_IDL - Generated from
+// be\be_visitor_interface/interface_ss.cpp:103
+
+POA_CORBA::ComponentIR::Repository::Repository (void)
+ : TAO_ServantBase ()
+{
+ this->optable_ = &tao_CORBA_ComponentIR_Repository_optable;
+}
+
+POA_CORBA::ComponentIR::Repository::Repository (const Repository& rhs)
+ : TAO_Abstract_ServantBase (rhs),
+ TAO_ServantBase (rhs),
+ POA_CORBA::IRObject (rhs),
+ POA_CORBA::Container (rhs),
+ POA_CORBA::Repository (rhs),
+ POA_CORBA::ComponentIR::Container (rhs)
+{
+}
+
+POA_CORBA::ComponentIR::Repository::~Repository (void)
+{
+}
+
+// TAO_IDL - Generated from
+// be\be_visitor_interface/interface_ss.cpp:169
+
+namespace POA_CORBA
+{
+ namespace ComponentIR
+ {
+
+
+ // TAO_IDL - Generated from
+ // be\be_visitor_operation/upcall_command_ss.cpp:127
+
+ class _is_a_Repository_Upcall_Command
+ : public TAO::Upcall_Command
+ {
+ public:
+ inline _is_a_Repository_Upcall_Command (
+ POA_CORBA::ComponentIR::Repository * servant,
+ TAO_Operation_Details const * operation_details,
+ TAO::Argument * const args[])
+ : servant_ (servant)
+ , operation_details_ (operation_details)
+ , args_ (args)
+ {
+ }
+
+ virtual void execute (ACE_ENV_SINGLE_ARG_DECL)
+ {
+ TAO::SArg_Traits< ::ACE_InputCDR::to_boolean>::ret_arg_type retval =
+ TAO::Portable_Server::get_ret_arg< ::ACE_InputCDR::to_boolean> (
+ this->operation_details_,
+ this->args_);
+
+ TAO::SArg_Traits< ::CORBA::Char *>::in_arg_type arg_1 =
+ TAO::Portable_Server::get_in_arg< ::CORBA::Char *> (
+ this->operation_details_,
+ this->args_,
+ 1);
+
+ retval =
+ this->servant_-> _is_a (
+ arg_1
+ ACE_ENV_ARG_PARAMETER);
+ ACE_CHECK;
+ }
+
+ private:
+ POA_CORBA::ComponentIR::Repository * const servant_;
+ TAO_Operation_Details const * const operation_details_;
+ TAO::Argument * const * const args_;
+ };
+ }
+
+}
+
+
+void POA_CORBA::ComponentIR::Repository::_is_a_skel (
+ TAO_ServerRequest & server_request,
+ void * TAO_INTERCEPTOR (servant_upcall),
+ void * servant
+ ACE_ENV_ARG_DECL
+ )
+{
+#if TAO_HAS_INTERCEPTORS == 1
+ static ::CORBA::TypeCode_ptr const * const exceptions = 0;
+ static ::CORBA::ULong const nexceptions = 0;
+#endif /* TAO_HAS_INTERCEPTORS */
+
+ TAO::SArg_Traits< ::ACE_InputCDR::to_boolean>::ret_val retval;
+ TAO::SArg_Traits< ::CORBA::Char *>::in_arg_val _tao_repository_id;
+
+ TAO::Argument * const args[] =
+ {
+ &retval,
+ &_tao_repository_id
+ };
+
+ static size_t const nargs = 2;
+
+ POA_CORBA::ComponentIR::Repository * const impl =
+ static_cast<POA_CORBA::ComponentIR::Repository *> (servant);
+
+ _is_a_Repository_Upcall_Command command (
+ impl,
+ server_request.operation_details (),
+ args);
+
+ TAO::Upcall_Wrapper upcall_wrapper;
+ upcall_wrapper.upcall (server_request
+ , args
+ , nargs
+ , command
+#if TAO_HAS_INTERCEPTORS == 1
+ , servant_upcall
+ , exceptions
+ , nexceptions
+#endif /* TAO_HAS_INTERCEPTORS == 1 */
+ ACE_ENV_ARG_PARAMETER);
+ ACE_CHECK;
+}namespace POA_CORBA
+{
+ namespace ComponentIR
+ {
+
+
+ // TAO_IDL - Generated from
+ // be\be_visitor_operation/upcall_command_ss.cpp:127
+
+ class _non_existent_Repository_Upcall_Command
+ : public TAO::Upcall_Command
+ {
+ public:
+ inline _non_existent_Repository_Upcall_Command (
+ POA_CORBA::ComponentIR::Repository * servant,
+ TAO_Operation_Details const * operation_details,
+ TAO::Argument * const args[])
+ : servant_ (servant)
+ , operation_details_ (operation_details)
+ , args_ (args)
+ {
+ }
+
+ virtual void execute (ACE_ENV_SINGLE_ARG_DECL)
+ {
+ TAO::SArg_Traits< ::ACE_InputCDR::to_boolean>::ret_arg_type retval =
+ TAO::Portable_Server::get_ret_arg< ::ACE_InputCDR::to_boolean> (
+ this->operation_details_,
+ this->args_);
+
+ retval =
+ this->servant_-> _non_existent (
+ ACE_ENV_SINGLE_ARG_PARAMETER);
+ ACE_CHECK;
+ }
+
+ private:
+ POA_CORBA::ComponentIR::Repository * const servant_;
+ TAO_Operation_Details const * const operation_details_;
+ TAO::Argument * const * const args_;
+ };
+ }
+
+}
+
+
+void POA_CORBA::ComponentIR::Repository::_non_existent_skel (
+ TAO_ServerRequest & server_request,
+ void * TAO_INTERCEPTOR (servant_upcall),
+ void * servant
+ ACE_ENV_ARG_DECL
+ )
+{
+#if TAO_HAS_INTERCEPTORS == 1
+ static ::CORBA::TypeCode_ptr const * const exceptions = 0;
+ static ::CORBA::ULong const nexceptions = 0;
+#endif /* TAO_HAS_INTERCEPTORS */
+
+ TAO::SArg_Traits< ::ACE_InputCDR::to_boolean>::ret_val retval;
+
+ TAO::Argument * const args[] =
+ {
+ &retval
+ };
+
+ static size_t const nargs = 1;
+
+ POA_CORBA::ComponentIR::Repository * const impl =
+ static_cast<POA_CORBA::ComponentIR::Repository *> (servant);
+
+ _non_existent_Repository_Upcall_Command command (
+ impl,
+ server_request.operation_details (),
+ args);
+
+ TAO::Upcall_Wrapper upcall_wrapper;
+ upcall_wrapper.upcall (server_request
+ , args
+ , nargs
+ , command
+#if TAO_HAS_INTERCEPTORS == 1
+ , servant_upcall
+ , exceptions
+ , nexceptions
+#endif /* TAO_HAS_INTERCEPTORS == 1 */
+ ACE_ENV_ARG_PARAMETER);
+ ACE_CHECK;
+}namespace POA_CORBA
+{
+ namespace ComponentIR
+ {
+
+
+ // TAO_IDL - Generated from
+ // be\be_visitor_operation/upcall_command_ss.cpp:127
+
+ class _repository_id_Repository_Upcall_Command
+ : public TAO::Upcall_Command
+ {
+ public:
+ inline _repository_id_Repository_Upcall_Command (
+ POA_CORBA::ComponentIR::Repository * servant,
+ TAO_Operation_Details const * operation_details,
+ TAO::Argument * const args[])
+ : servant_ (servant)
+ , operation_details_ (operation_details)
+ , args_ (args)
+ {
+ }
+
+ virtual void execute (ACE_ENV_SINGLE_ARG_DECL)
+ {
+ TAO::SArg_Traits< ::CORBA::Char *>::ret_arg_type retval =
+ TAO::Portable_Server::get_ret_arg< ::CORBA::Char *> (
+ this->operation_details_,
+ this->args_);
+
+ retval =
+ this->servant_-> _repository_id (
+ ACE_ENV_SINGLE_ARG_PARAMETER);
+ ACE_CHECK;
+ }
+
+ private:
+ POA_CORBA::ComponentIR::Repository * const servant_;
+ TAO_Operation_Details const * const operation_details_;
+ TAO::Argument * const * const args_;
+ };
+ }
+
+}
+
+
+void POA_CORBA::ComponentIR::Repository::_repository_id_skel (
+ TAO_ServerRequest & server_request,
+ void * TAO_INTERCEPTOR (servant_upcall),
+ void * servant
+ ACE_ENV_ARG_DECL
+ )
+{
+#if TAO_HAS_INTERCEPTORS == 1
+ static ::CORBA::TypeCode_ptr const * const exceptions = 0;
+ static ::CORBA::ULong const nexceptions = 0;
+#endif /* TAO_HAS_INTERCEPTORS */
+
+ TAO::SArg_Traits< ::CORBA::Char *>::ret_val retval;
+
+ TAO::Argument * const args[] =
+ {
+ &retval
+ };
+
+ static size_t const nargs = 1;
+
+ POA_CORBA::ComponentIR::Repository * const impl =
+ static_cast<POA_CORBA::ComponentIR::Repository *> (servant);
+
+ _repository_id_Repository_Upcall_Command command (
+ impl,
+ server_request.operation_details (),
+ args);
+
+ TAO::Upcall_Wrapper upcall_wrapper;
+ upcall_wrapper.upcall (server_request
+ , args
+ , nargs
+ , command
+#if TAO_HAS_INTERCEPTORS == 1
+ , servant_upcall
+ , exceptions
+ , nexceptions
+#endif /* TAO_HAS_INTERCEPTORS == 1 */
+ ACE_ENV_ARG_PARAMETER);
+ ACE_CHECK;
+}
+
+// TAO_IDL - Generated from
+// be\be_visitor_interface/interface_ss.cpp:513
+
+void POA_CORBA::ComponentIR::Repository::_interface_skel (
+ TAO_ServerRequest & server_request,
+ void * /* servant_upcall */,
+ void * servant
+ ACE_ENV_ARG_DECL
+ )
+{
+ TAO_IFR_Client_Adapter *_tao_adapter =
+ ACE_Dynamic_Service<TAO_IFR_Client_Adapter>::instance (
+ TAO_ORB_Core::ifr_client_adapter_name ()
+ );
+
+ if (_tao_adapter == 0)
+ {
+ ACE_THROW ( ::CORBA::INTF_REPOS ( ::CORBA::OMGVMCID | 1,
+ ::CORBA::COMPLETED_NO));
+ }
+
+ POA_CORBA::ComponentIR::Repository * const impl =
+ static_cast<POA_CORBA::ComponentIR::Repository *> (servant);
+ ::CORBA::InterfaceDef_ptr _tao_retval =
+ impl->_get_interface (ACE_ENV_SINGLE_ARG_PARAMETER);
+ ACE_CHECK;
+
+ server_request.init_reply ();
+ TAO_OutputCDR &_tao_out = *server_request.outgoing ();
+
+ ::CORBA::Boolean const _tao_result =
+ _tao_adapter->interfacedef_cdr_insert (
+ _tao_out,
+ _tao_retval
+ );
+
+ _tao_adapter->dispose (_tao_retval);
+
+ if (_tao_result == false)
+ {
+ ACE_THROW ( ::CORBA::MARSHAL ());
+ }
+}namespace POA_CORBA
+{
+ namespace ComponentIR
+ {
+
+
+ // TAO_IDL - Generated from
+ // be\be_visitor_operation/upcall_command_ss.cpp:127
+
+ class _get_component_Repository_Upcall_Command
+ : public TAO::Upcall_Command
+ {
+ public:
+ inline _get_component_Repository_Upcall_Command (
+ POA_CORBA::ComponentIR::Repository * servant,
+ TAO_Operation_Details const * operation_details,
+ TAO::Argument * const args[])
+ : servant_ (servant)
+ , operation_details_ (operation_details)
+ , args_ (args)
+ {
+ }
+
+ virtual void execute (ACE_ENV_SINGLE_ARG_DECL)
+ {
+ TAO::SArg_Traits< ::CORBA::Object>::ret_arg_type retval =
+ TAO::Portable_Server::get_ret_arg< ::CORBA::Object> (
+ this->operation_details_,
+ this->args_);
+
+ retval =
+ this->servant_-> _get_component (
+ ACE_ENV_SINGLE_ARG_PARAMETER);
+ ACE_CHECK;
+ }
+
+ private:
+ POA_CORBA::ComponentIR::Repository * const servant_;
+ TAO_Operation_Details const * const operation_details_;
+ TAO::Argument * const * const args_;
+ };
+ }
+
+}
+
+
+void POA_CORBA::ComponentIR::Repository::_component_skel (
+ TAO_ServerRequest & server_request,
+ void * TAO_INTERCEPTOR (servant_upcall),
+ void * servant
+ ACE_ENV_ARG_DECL
+ )
+{
+#if TAO_HAS_INTERCEPTORS == 1
+ static ::CORBA::TypeCode_ptr const * const exceptions = 0;
+ static ::CORBA::ULong const nexceptions = 0;
+#endif /* TAO_HAS_INTERCEPTORS */
+
+ TAO::SArg_Traits< ::CORBA::Object>::ret_val retval;
+
+ TAO::Argument * const args[] =
+ {
+ &retval
+ };
+
+ static size_t const nargs = 1;
+
+ POA_CORBA::ComponentIR::Repository * const impl =
+ static_cast<POA_CORBA::ComponentIR::Repository *> (servant);
+
+ _get_component_Repository_Upcall_Command command (
+ impl,
+ server_request.operation_details (),
+ args);
+
+ TAO::Upcall_Wrapper upcall_wrapper;
+ upcall_wrapper.upcall (server_request
+ , args
+ , nargs
+ , command
+#if TAO_HAS_INTERCEPTORS == 1
+ , servant_upcall
+ , exceptions
+ , nexceptions
+#endif /* TAO_HAS_INTERCEPTORS == 1 */
+ ACE_ENV_ARG_PARAMETER);
+ ACE_CHECK;
+}
+
+::CORBA::Boolean POA_CORBA::ComponentIR::Repository::_is_a (
+ const char* value
+ ACE_ENV_ARG_DECL_NOT_USED
+ )
+{
+ return
+ (
+ !ACE_OS::strcmp (
+ value,
+ "IDL:omg.org/CORBA/IRObject:1.0"
+ ) ||
+ !ACE_OS::strcmp (
+ value,
+ "IDL:omg.org/CORBA/Container:1.0"
+ ) ||
+ !ACE_OS::strcmp (
+ value,
+ "IDL:omg.org/CORBA/Repository:1.0"
+ ) ||
+ !ACE_OS::strcmp (
+ value,
+ "IDL:omg.org/CORBA/ComponentIR/Container:1.0"
+ ) ||
+ !ACE_OS::strcmp (
+ value,
+ "IDL:omg.org/CORBA/ComponentIR/Repository:1.0"
+ ) ||
+ !ACE_OS::strcmp (
+ value,
+ "IDL:omg.org/CORBA/Object:1.0"
+ )
+ );
+}
+
+const char* POA_CORBA::ComponentIR::Repository::_interface_repository_id (void) const
+{
+ return "IDL:omg.org/CORBA/ComponentIR/Repository:1.0";
+}
+
+// TAO_IDL - Generated from
+// be\be_visitor_interface/interface_ss.cpp:903
+
+void POA_CORBA::ComponentIR::Repository::_dispatch (
+ TAO_ServerRequest & req,
+ void * servant_upcall
+ ACE_ENV_ARG_DECL
+ )
+{
+ this->synchronous_upcall_dispatch (req,
+ servant_upcall,
+ this
+ ACE_ENV_ARG_PARAMETER);
+}
+
+// TAO_IDL - Generated from
+// be\be_visitor_interface/interface_ss.cpp:851
+
+CORBA::ComponentIR::Repository *
+POA_CORBA::ComponentIR::Repository::_this (ACE_ENV_SINGLE_ARG_DECL)
+{
+ TAO_Stub *stub = this->_create_stub (ACE_ENV_SINGLE_ARG_PARAMETER);
+ ACE_CHECK_RETURN (0);
+
+ TAO_Stub_Auto_Ptr safe_stub (stub);
+ ::CORBA::Object_ptr tmp = CORBA::Object::_nil ();
+
+ ::CORBA::Boolean const _tao_opt_colloc =
+ stub->servant_orb_var ()->orb_core ()->optimize_collocation_objects ();
+
+ ACE_NEW_RETURN (
+ tmp,
+ ::CORBA::Object (stub, _tao_opt_colloc, this),
+ 0
+ );
+
+ ::CORBA::Object_var obj = tmp;
+ (void) safe_stub.release ();
+
+ typedef ::CORBA::ComponentIR::Repository STUB_SCOPED_NAME;
+ return
+ TAO::Narrow_Utils<STUB_SCOPED_NAME>::unchecked_narrow (
+ obj.in (),
+ CORBA_ComponentIR__TAO_Repository_Proxy_Broker_Factory_function_pointer
+ );
+}
+
+// TAO_IDL - Generated from
+// be\be_interface.cpp:1499
+
+class TAO_CORBA_ComponentIR_ProvidesDef_Perfect_Hash_OpTable
+ : public TAO_Perfect_Hash_OpTable
+{
+private:
+ unsigned int hash (const char *str, unsigned int len);
+
+public:
+ const TAO_operation_db_entry * lookup (const char *str, unsigned int len);
+};
+
+/* C++ code produced by gperf version 2.8 (ACE version) */
+/* Command-line: C:\ACE\latest\ACE_wrappers\bin\gperf.exe -m -M -J -c -C -D -E -T -f 0 -F 0,0 -a -o -t -p -K opname -L C++ -Z TAO_CORBA_ComponentIR_ProvidesDef_Perfect_Hash_OpTable -N lookup */
+unsigned int
+TAO_CORBA_ComponentIR_ProvidesDef_Perfect_Hash_OpTable::hash (const char *str, unsigned int len)
+{
+ static const unsigned char asso_values[] =
+ {
+#if defined (ACE_MVS)
+ 37, 37, 37, 37, 37, 37, 37, 37, 37, 37,
+ 37, 37, 37, 37, 37, 37, 37, 37, 37, 37,
+ 37, 37, 37, 37, 37, 37, 37, 37, 37, 37,
+ 37, 37, 37, 37, 37, 37, 37, 37, 37, 37,
+ 37, 37, 37, 37, 37, 37, 37, 37, 37, 37,
+ 37, 37, 37, 37, 37, 37, 37, 37, 37, 37,
+ 37, 37, 37, 37, 37, 37, 37, 37, 37, 37,
+ 37, 37, 37, 37, 37, 37, 37, 37, 37, 37,
+ 37, 37, 37, 37, 37, 37, 37, 37, 37, 37,
+ 37, 37, 37, 37, 37, 37, 37, 37, 37, 37,
+ 37, 37, 37, 37, 37, 37, 37, 37, 37, 0,
+ 37, 37, 37, 37, 37, 37, 37, 37, 37, 37,
+ 37, 37, 37, 37, 37, 37, 37, 37, 37, 0,
+ 37, 37, 0, 0, 37, 37, 37, 37, 37, 37,
+ 37, 37, 37, 37, 37, 37, 37, 37, 0, 0,
+ 37, 37, 37, 37, 37, 37, 37, 37, 37, 37,
+ 37, 37, 37, 10, 37, 37, 37, 37, 10, 37,
+ 37, 37, 37, 37, 37, 37, 37, 37, 37, 37,
+ 37, 37, 37, 37, 37, 37, 37, 37, 37, 37,
+ 37, 37, 37, 37, 37, 37, 37, 37, 37, 37,
+ 37, 37, 37, 37, 37, 37, 37, 37, 37, 37,
+ 37, 37, 37, 37, 37, 37, 37, 37, 37, 37,
+ 37, 37, 37, 37, 37, 37, 37, 37, 37, 37,
+ 37, 37, 37, 37, 37, 37, 37, 37, 37, 37,
+ 37, 37, 37, 37, 37, 37, 37, 37, 37, 37,
+ 37, 37, 37, 37, 37, 37,
+#else
+ 37, 37, 37, 37, 37, 37, 37, 37, 37, 37,
+ 37, 37, 37, 37, 37, 37, 37, 37, 37, 37,
+ 37, 37, 37, 37, 37, 37, 37, 37, 37, 37,
+ 37, 37, 37, 37, 37, 37, 37, 37, 37, 37,
+ 37, 37, 37, 37, 37, 37, 37, 37, 37, 37,
+ 37, 37, 37, 37, 37, 37, 37, 37, 37, 37,
+ 37, 37, 37, 37, 37, 37, 37, 37, 37, 37,
+ 37, 37, 37, 37, 37, 37, 37, 37, 37, 37,
+ 37, 37, 37, 37, 37, 37, 37, 37, 37, 37,
+ 37, 37, 37, 37, 37, 0, 37, 0, 37, 37,
+ 0, 0, 37, 37, 37, 37, 37, 37, 37, 0,
+ 0, 37, 37, 37, 37, 37, 10, 37, 37, 37,
+ 37, 10, 37, 37, 37, 37, 37, 37,
+#endif /* ACE_MVS */
+ };
+ return len + asso_values[(int) str[len - 1]] + asso_values[(int) str[0]];
+}
+
+const TAO_operation_db_entry *
+TAO_CORBA_ComponentIR_ProvidesDef_Perfect_Hash_OpTable::lookup (const char *str, unsigned int len)
+{
+ enum
+ {
+ TOTAL_KEYWORDS = 20,
+ MIN_WORD_LENGTH = 4,
+ MAX_WORD_LENGTH = 26,
+ MIN_HASH_VALUE = 4,
+ MAX_HASH_VALUE = 36,
+ HASH_VALUE_RANGE = 33,
+ DUPLICATES = 5,
+ WORDLIST_SIZE = 24
+ };
+
+ static const TAO_operation_db_entry wordlist[] =
+ {
+ {"",0,0},{"",0,0},{"",0,0},{"",0,0},
+ {"move", &POA_CORBA::ComponentIR::ProvidesDef::move_skel, 0},
+ {"_is_a", &POA_CORBA::ComponentIR::ProvidesDef::_is_a_skel, 0},
+ {"_get_id", &POA_CORBA::ComponentIR::ProvidesDef::_get_id_skel, 0},
+ {"_set_id", &POA_CORBA::ComponentIR::ProvidesDef::_set_id_skel, 0},
+ {"describe", &POA_CORBA::ComponentIR::ProvidesDef::describe_skel, 0},
+ {"_get_name", &POA_CORBA::ComponentIR::ProvidesDef::_get_name_skel, 0},
+ {"_set_name", &POA_CORBA::ComponentIR::ProvidesDef::_set_name_skel, 0},
+ {"_interface", &POA_CORBA::ComponentIR::ProvidesDef::_interface_skel, 0},
+ {"_get_version", &POA_CORBA::ComponentIR::ProvidesDef::_get_version_skel, 0},
+ {"_set_version", &POA_CORBA::ComponentIR::ProvidesDef::_set_version_skel, 0},
+ {"_get_def_kind", &POA_CORBA::ComponentIR::ProvidesDef::_get_def_kind_skel, 0},
+ {"_repository_id", &POA_CORBA::ComponentIR::ProvidesDef::_repository_id_skel, 0},
+ {"_get_defined_in", &POA_CORBA::ComponentIR::ProvidesDef::_get_defined_in_skel, 0},
+ {"destroy", &POA_CORBA::ComponentIR::ProvidesDef::destroy_skel, 0},
+ {"_get_absolute_name", &POA_CORBA::ComponentIR::ProvidesDef::_get_absolute_name_skel, 0},
+ {"_get_interface_type", &POA_CORBA::ComponentIR::ProvidesDef::_get_interface_type_skel, 0},
+ {"_set_interface_type", &POA_CORBA::ComponentIR::ProvidesDef::_set_interface_type_skel, 0},
+ {"_component", &POA_CORBA::ComponentIR::ProvidesDef::_component_skel, 0},
+ {"_non_existent", &POA_CORBA::ComponentIR::ProvidesDef::_non_existent_skel, 0},
+ {"_get_containing_repository", &POA_CORBA::ComponentIR::ProvidesDef::_get_containing_repository_skel, 0},
+ };
+
+ static const signed char lookup[] =
+ {
+ -12, -2, -19, -2, 4, 5, -1, 53, 8, 48, 11, -1, -48, 14,
+ 15, 16, -1, 17, 18, -53, 21, -9, -2, 22, -6, -2, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1, 23,
+ };
+
+ if (len <= MAX_WORD_LENGTH && len >= MIN_WORD_LENGTH)
+ {
+ unsigned int key = hash (str, len);
+
+ if (key <= MAX_HASH_VALUE && key >= MIN_HASH_VALUE)
+ {
+ int slot = lookup[key];
+
+ if (slot >= 0 && slot < WORDLIST_SIZE)
+ {
+ const char *s = wordlist[slot].opname;
+
+ if (*str == *s && !strncmp (str + 1, s + 1, len - 1))
+ return &wordlist[slot];
+ }
+ else if (slot < 0 && slot >= -MAX_HASH_VALUE)
+ return 0;
+ else
+ {
+ unsigned int offset = key + slot + (slot > 0 ? -MAX_HASH_VALUE : MAX_HASH_VALUE);
+ const TAO_operation_db_entry *base = &wordlist[-lookup[offset]];
+ const TAO_operation_db_entry *ptr = base + -lookup[offset + 1];
+
+ while (--ptr >= base)
+ if (*str == *ptr->opname && !strncmp (str + 1, ptr->opname + 1, len - 1))
+ return ptr;
+ }
+ }
+ }
+ return 0;
+}
+
+static TAO_CORBA_ComponentIR_ProvidesDef_Perfect_Hash_OpTable tao_CORBA_ComponentIR_ProvidesDef_optable;
+
+// TAO_IDL - Generated from
+// be\be_visitor_interface/interface_ss.cpp:966
+
+TAO::Collocation_Proxy_Broker *
+CORBA_ComponentIR__TAO_ProvidesDef_Proxy_Broker_Factory_function ( ::CORBA::Object_ptr)
+{
+ return reinterpret_cast<TAO::Collocation_Proxy_Broker *> (0xdead); // Dummy
+}
+
+int
+CORBA_ComponentIR__TAO_ProvidesDef_Proxy_Broker_Factory_Initializer (size_t)
+{
+ CORBA_ComponentIR__TAO_ProvidesDef_Proxy_Broker_Factory_function_pointer =
+ CORBA_ComponentIR__TAO_ProvidesDef_Proxy_Broker_Factory_function;
+
+ return 0;
+}
+
+static int
+CORBA_ComponentIR__TAO_ProvidesDef_Proxy_Broker_Stub_Factory_Initializer_Scarecrow =
+ CORBA_ComponentIR__TAO_ProvidesDef_Proxy_Broker_Factory_Initializer (
+ reinterpret_cast<size_t> (CORBA_ComponentIR__TAO_ProvidesDef_Proxy_Broker_Factory_Initializer)
+ );
+
+// TAO_IDL - Generated from
+// be\be_visitor_interface/interface_ss.cpp:103
+
+POA_CORBA::ComponentIR::ProvidesDef::ProvidesDef (void)
+ : TAO_ServantBase ()
+{
+ this->optable_ = &tao_CORBA_ComponentIR_ProvidesDef_optable;
+}
+
+POA_CORBA::ComponentIR::ProvidesDef::ProvidesDef (const ProvidesDef& rhs)
+ : TAO_Abstract_ServantBase (rhs),
+ TAO_ServantBase (rhs),
+ POA_CORBA::IRObject (rhs),
+ POA_CORBA::Contained (rhs)
+{
+}
+
+POA_CORBA::ComponentIR::ProvidesDef::~ProvidesDef (void)
+{
+}namespace POA_CORBA
+{
+ namespace ComponentIR
+ {
+
+
+ // TAO_IDL - Generated from
+ // be\be_visitor_operation/upcall_command_ss.cpp:127
+
+ class _get_interface_type_ProvidesDef
+ : public TAO::Upcall_Command
+ {
+ public:
+ inline _get_interface_type_ProvidesDef (
+ POA_CORBA::ComponentIR::ProvidesDef * servant,
+ TAO_Operation_Details const * operation_details,
+ TAO::Argument * const args[])
+ : servant_ (servant)
+ , operation_details_ (operation_details)
+ , args_ (args)
+ {
+ }
+
+ virtual void execute (ACE_ENV_SINGLE_ARG_DECL)
+ {
+ TAO::SArg_Traits< ::CORBA::InterfaceDef>::ret_arg_type retval =
+ TAO::Portable_Server::get_ret_arg< ::CORBA::InterfaceDef> (
+ this->operation_details_,
+ this->args_);
+
+ retval =
+ this->servant_->interface_type (
+ ACE_ENV_SINGLE_ARG_PARAMETER);
+ ACE_CHECK;
+ }
+
+ private:
+ POA_CORBA::ComponentIR::ProvidesDef * const servant_;
+ TAO_Operation_Details const * const operation_details_;
+ TAO::Argument * const * const args_;
+ };
+ }
+
+}
+
+
+// TAO_IDL - Generated from
+// be\be_visitor_operation/operation_ss.cpp:190
+
+void POA_CORBA::ComponentIR::ProvidesDef::_get_interface_type_skel (
+ TAO_ServerRequest & server_request,
+ void * TAO_INTERCEPTOR (servant_upcall),
+ void * servant
+ ACE_ENV_ARG_DECL
+ )
+{
+#if TAO_HAS_INTERCEPTORS == 1
+ static ::CORBA::TypeCode_ptr const * const exceptions = 0;
+ static ::CORBA::ULong const nexceptions = 0;
+#endif /* TAO_HAS_INTERCEPTORS */
+
+ TAO::SArg_Traits< ::CORBA::InterfaceDef>::ret_val retval;
+
+ TAO::Argument * const args[] =
+ {
+ &retval
+ };
+
+ static size_t const nargs = 1;
+
+ POA_CORBA::ComponentIR::ProvidesDef * const impl =
+ static_cast<POA_CORBA::ComponentIR::ProvidesDef *> (servant);
+
+ _get_interface_type_ProvidesDef command (
+ impl,
+ server_request.operation_details (),
+ args);
+
+ TAO::Upcall_Wrapper upcall_wrapper;
+ upcall_wrapper.upcall (server_request
+ , args
+ , nargs
+ , command
+#if TAO_HAS_INTERCEPTORS == 1
+ , servant_upcall
+ , exceptions
+ , nexceptions
+#endif /* TAO_HAS_INTERCEPTORS == 1 */
+ ACE_ENV_ARG_PARAMETER);
+ ACE_CHECK;
+}namespace POA_CORBA
+{
+ namespace ComponentIR
+ {
+
+
+ // TAO_IDL - Generated from
+ // be\be_visitor_operation/upcall_command_ss.cpp:127
+
+ class _set_interface_type_ProvidesDef
+ : public TAO::Upcall_Command
+ {
+ public:
+ inline _set_interface_type_ProvidesDef (
+ POA_CORBA::ComponentIR::ProvidesDef * servant,
+ TAO_Operation_Details const * operation_details,
+ TAO::Argument * const args[])
+ : servant_ (servant)
+ , operation_details_ (operation_details)
+ , args_ (args)
+ {
+ }
+
+ virtual void execute (ACE_ENV_SINGLE_ARG_DECL)
+ {
+ TAO::SArg_Traits< ::CORBA::InterfaceDef>::in_arg_type arg_1 =
+ TAO::Portable_Server::get_in_arg< ::CORBA::InterfaceDef> (
+ this->operation_details_,
+ this->args_,
+ 1);
+
+ this->servant_->interface_type (
+ arg_1
+ ACE_ENV_ARG_PARAMETER);
+ ACE_CHECK;
+ }
+
+ private:
+ POA_CORBA::ComponentIR::ProvidesDef * const servant_;
+ TAO_Operation_Details const * const operation_details_;
+ TAO::Argument * const * const args_;
+ };
+ }
+
+}
+
+
+// TAO_IDL - Generated from
+// be\be_visitor_operation/operation_ss.cpp:190
+
+void POA_CORBA::ComponentIR::ProvidesDef::_set_interface_type_skel (
+ TAO_ServerRequest & server_request,
+ void * TAO_INTERCEPTOR (servant_upcall),
+ void * servant
+ ACE_ENV_ARG_DECL
+ )
+{
+#if TAO_HAS_INTERCEPTORS == 1
+ static ::CORBA::TypeCode_ptr const * const exceptions = 0;
+ static ::CORBA::ULong const nexceptions = 0;
+#endif /* TAO_HAS_INTERCEPTORS */
+
+ TAO::SArg_Traits< void>::ret_val retval;
+ TAO::SArg_Traits< ::CORBA::InterfaceDef>::in_arg_val _tao_interface_type;
+
+ TAO::Argument * const args[] =
+ {
+ &retval,
+ &_tao_interface_type
+ };
+
+ static size_t const nargs = 2;
+
+ POA_CORBA::ComponentIR::ProvidesDef * const impl =
+ static_cast<POA_CORBA::ComponentIR::ProvidesDef *> (servant);
+
+ _set_interface_type_ProvidesDef command (
+ impl,
+ server_request.operation_details (),
+ args);
+
+ TAO::Upcall_Wrapper upcall_wrapper;
+ upcall_wrapper.upcall (server_request
+ , args
+ , nargs
+ , command
+#if TAO_HAS_INTERCEPTORS == 1
+ , servant_upcall
+ , exceptions
+ , nexceptions
+#endif /* TAO_HAS_INTERCEPTORS == 1 */
+ ACE_ENV_ARG_PARAMETER);
+ ACE_CHECK;
+}
+
+// TAO_IDL - Generated from
+// be\be_visitor_interface/interface_ss.cpp:169
+
+namespace POA_CORBA
+{
+ namespace ComponentIR
+ {
+
+
+ // TAO_IDL - Generated from
+ // be\be_visitor_operation/upcall_command_ss.cpp:127
+
+ class _is_a_ProvidesDef_Upcall_Command
+ : public TAO::Upcall_Command
+ {
+ public:
+ inline _is_a_ProvidesDef_Upcall_Command (
+ POA_CORBA::ComponentIR::ProvidesDef * servant,
+ TAO_Operation_Details const * operation_details,
+ TAO::Argument * const args[])
+ : servant_ (servant)
+ , operation_details_ (operation_details)
+ , args_ (args)
+ {
+ }
+
+ virtual void execute (ACE_ENV_SINGLE_ARG_DECL)
+ {
+ TAO::SArg_Traits< ::ACE_InputCDR::to_boolean>::ret_arg_type retval =
+ TAO::Portable_Server::get_ret_arg< ::ACE_InputCDR::to_boolean> (
+ this->operation_details_,
+ this->args_);
+
+ TAO::SArg_Traits< ::CORBA::Char *>::in_arg_type arg_1 =
+ TAO::Portable_Server::get_in_arg< ::CORBA::Char *> (
+ this->operation_details_,
+ this->args_,
+ 1);
+
+ retval =
+ this->servant_-> _is_a (
+ arg_1
+ ACE_ENV_ARG_PARAMETER);
+ ACE_CHECK;
+ }
+
+ private:
+ POA_CORBA::ComponentIR::ProvidesDef * const servant_;
+ TAO_Operation_Details const * const operation_details_;
+ TAO::Argument * const * const args_;
+ };
+ }
+
+}
+
+
+void POA_CORBA::ComponentIR::ProvidesDef::_is_a_skel (
+ TAO_ServerRequest & server_request,
+ void * TAO_INTERCEPTOR (servant_upcall),
+ void * servant
+ ACE_ENV_ARG_DECL
+ )
+{
+#if TAO_HAS_INTERCEPTORS == 1
+ static ::CORBA::TypeCode_ptr const * const exceptions = 0;
+ static ::CORBA::ULong const nexceptions = 0;
+#endif /* TAO_HAS_INTERCEPTORS */
+
+ TAO::SArg_Traits< ::ACE_InputCDR::to_boolean>::ret_val retval;
+ TAO::SArg_Traits< ::CORBA::Char *>::in_arg_val _tao_repository_id;
+
+ TAO::Argument * const args[] =
+ {
+ &retval,
+ &_tao_repository_id
+ };
+
+ static size_t const nargs = 2;
+
+ POA_CORBA::ComponentIR::ProvidesDef * const impl =
+ static_cast<POA_CORBA::ComponentIR::ProvidesDef *> (servant);
+
+ _is_a_ProvidesDef_Upcall_Command command (
+ impl,
+ server_request.operation_details (),
+ args);
+
+ TAO::Upcall_Wrapper upcall_wrapper;
+ upcall_wrapper.upcall (server_request
+ , args
+ , nargs
+ , command
+#if TAO_HAS_INTERCEPTORS == 1
+ , servant_upcall
+ , exceptions
+ , nexceptions
+#endif /* TAO_HAS_INTERCEPTORS == 1 */
+ ACE_ENV_ARG_PARAMETER);
+ ACE_CHECK;
+}namespace POA_CORBA
+{
+ namespace ComponentIR
+ {
+
+
+ // TAO_IDL - Generated from
+ // be\be_visitor_operation/upcall_command_ss.cpp:127
+
+ class _non_existent_ProvidesDef_Upcall_Command
+ : public TAO::Upcall_Command
+ {
+ public:
+ inline _non_existent_ProvidesDef_Upcall_Command (
+ POA_CORBA::ComponentIR::ProvidesDef * servant,
+ TAO_Operation_Details const * operation_details,
+ TAO::Argument * const args[])
+ : servant_ (servant)
+ , operation_details_ (operation_details)
+ , args_ (args)
+ {
+ }
+
+ virtual void execute (ACE_ENV_SINGLE_ARG_DECL)
+ {
+ TAO::SArg_Traits< ::ACE_InputCDR::to_boolean>::ret_arg_type retval =
+ TAO::Portable_Server::get_ret_arg< ::ACE_InputCDR::to_boolean> (
+ this->operation_details_,
+ this->args_);
+
+ retval =
+ this->servant_-> _non_existent (
+ ACE_ENV_SINGLE_ARG_PARAMETER);
+ ACE_CHECK;
+ }
+
+ private:
+ POA_CORBA::ComponentIR::ProvidesDef * const servant_;
+ TAO_Operation_Details const * const operation_details_;
+ TAO::Argument * const * const args_;
+ };
+ }
+
+}
+
+
+void POA_CORBA::ComponentIR::ProvidesDef::_non_existent_skel (
+ TAO_ServerRequest & server_request,
+ void * TAO_INTERCEPTOR (servant_upcall),
+ void * servant
+ ACE_ENV_ARG_DECL
+ )
+{
+#if TAO_HAS_INTERCEPTORS == 1
+ static ::CORBA::TypeCode_ptr const * const exceptions = 0;
+ static ::CORBA::ULong const nexceptions = 0;
+#endif /* TAO_HAS_INTERCEPTORS */
+
+ TAO::SArg_Traits< ::ACE_InputCDR::to_boolean>::ret_val retval;
+
+ TAO::Argument * const args[] =
+ {
+ &retval
+ };
+
+ static size_t const nargs = 1;
+
+ POA_CORBA::ComponentIR::ProvidesDef * const impl =
+ static_cast<POA_CORBA::ComponentIR::ProvidesDef *> (servant);
+
+ _non_existent_ProvidesDef_Upcall_Command command (
+ impl,
+ server_request.operation_details (),
+ args);
+
+ TAO::Upcall_Wrapper upcall_wrapper;
+ upcall_wrapper.upcall (server_request
+ , args
+ , nargs
+ , command
+#if TAO_HAS_INTERCEPTORS == 1
+ , servant_upcall
+ , exceptions
+ , nexceptions
+#endif /* TAO_HAS_INTERCEPTORS == 1 */
+ ACE_ENV_ARG_PARAMETER);
+ ACE_CHECK;
+}namespace POA_CORBA
+{
+ namespace ComponentIR
+ {
+
+
+ // TAO_IDL - Generated from
+ // be\be_visitor_operation/upcall_command_ss.cpp:127
+
+ class _repository_id_ProvidesDef_Upcall_Command
+ : public TAO::Upcall_Command
+ {
+ public:
+ inline _repository_id_ProvidesDef_Upcall_Command (
+ POA_CORBA::ComponentIR::ProvidesDef * servant,
+ TAO_Operation_Details const * operation_details,
+ TAO::Argument * const args[])
+ : servant_ (servant)
+ , operation_details_ (operation_details)
+ , args_ (args)
+ {
+ }
+
+ virtual void execute (ACE_ENV_SINGLE_ARG_DECL)
+ {
+ TAO::SArg_Traits< ::CORBA::Char *>::ret_arg_type retval =
+ TAO::Portable_Server::get_ret_arg< ::CORBA::Char *> (
+ this->operation_details_,
+ this->args_);
+
+ retval =
+ this->servant_-> _repository_id (
+ ACE_ENV_SINGLE_ARG_PARAMETER);
+ ACE_CHECK;
+ }
+
+ private:
+ POA_CORBA::ComponentIR::ProvidesDef * const servant_;
+ TAO_Operation_Details const * const operation_details_;
+ TAO::Argument * const * const args_;
+ };
+ }
+
+}
+
+
+void POA_CORBA::ComponentIR::ProvidesDef::_repository_id_skel (
+ TAO_ServerRequest & server_request,
+ void * TAO_INTERCEPTOR (servant_upcall),
+ void * servant
+ ACE_ENV_ARG_DECL
+ )
+{
+#if TAO_HAS_INTERCEPTORS == 1
+ static ::CORBA::TypeCode_ptr const * const exceptions = 0;
+ static ::CORBA::ULong const nexceptions = 0;
+#endif /* TAO_HAS_INTERCEPTORS */
+
+ TAO::SArg_Traits< ::CORBA::Char *>::ret_val retval;
+
+ TAO::Argument * const args[] =
+ {
+ &retval
+ };
+
+ static size_t const nargs = 1;
+
+ POA_CORBA::ComponentIR::ProvidesDef * const impl =
+ static_cast<POA_CORBA::ComponentIR::ProvidesDef *> (servant);
+
+ _repository_id_ProvidesDef_Upcall_Command command (
+ impl,
+ server_request.operation_details (),
+ args);
+
+ TAO::Upcall_Wrapper upcall_wrapper;
+ upcall_wrapper.upcall (server_request
+ , args
+ , nargs
+ , command
+#if TAO_HAS_INTERCEPTORS == 1
+ , servant_upcall
+ , exceptions
+ , nexceptions
+#endif /* TAO_HAS_INTERCEPTORS == 1 */
+ ACE_ENV_ARG_PARAMETER);
+ ACE_CHECK;
+}
+
+// TAO_IDL - Generated from
+// be\be_visitor_interface/interface_ss.cpp:513
+
+void POA_CORBA::ComponentIR::ProvidesDef::_interface_skel (
+ TAO_ServerRequest & server_request,
+ void * /* servant_upcall */,
+ void * servant
+ ACE_ENV_ARG_DECL
+ )
+{
+ TAO_IFR_Client_Adapter *_tao_adapter =
+ ACE_Dynamic_Service<TAO_IFR_Client_Adapter>::instance (
+ TAO_ORB_Core::ifr_client_adapter_name ()
+ );
+
+ if (_tao_adapter == 0)
+ {
+ ACE_THROW ( ::CORBA::INTF_REPOS ( ::CORBA::OMGVMCID | 1,
+ ::CORBA::COMPLETED_NO));
+ }
+
+ POA_CORBA::ComponentIR::ProvidesDef * const impl =
+ static_cast<POA_CORBA::ComponentIR::ProvidesDef *> (servant);
+ ::CORBA::InterfaceDef_ptr _tao_retval =
+ impl->_get_interface (ACE_ENV_SINGLE_ARG_PARAMETER);
+ ACE_CHECK;
+
+ server_request.init_reply ();
+ TAO_OutputCDR &_tao_out = *server_request.outgoing ();
+
+ ::CORBA::Boolean const _tao_result =
+ _tao_adapter->interfacedef_cdr_insert (
+ _tao_out,
+ _tao_retval
+ );
+
+ _tao_adapter->dispose (_tao_retval);
+
+ if (_tao_result == false)
+ {
+ ACE_THROW ( ::CORBA::MARSHAL ());
+ }
+}namespace POA_CORBA
+{
+ namespace ComponentIR
+ {
+
+
+ // TAO_IDL - Generated from
+ // be\be_visitor_operation/upcall_command_ss.cpp:127
+
+ class _get_component_ProvidesDef_Upcall_Command
+ : public TAO::Upcall_Command
+ {
+ public:
+ inline _get_component_ProvidesDef_Upcall_Command (
+ POA_CORBA::ComponentIR::ProvidesDef * servant,
+ TAO_Operation_Details const * operation_details,
+ TAO::Argument * const args[])
+ : servant_ (servant)
+ , operation_details_ (operation_details)
+ , args_ (args)
+ {
+ }
+
+ virtual void execute (ACE_ENV_SINGLE_ARG_DECL)
+ {
+ TAO::SArg_Traits< ::CORBA::Object>::ret_arg_type retval =
+ TAO::Portable_Server::get_ret_arg< ::CORBA::Object> (
+ this->operation_details_,
+ this->args_);
+
+ retval =
+ this->servant_-> _get_component (
+ ACE_ENV_SINGLE_ARG_PARAMETER);
+ ACE_CHECK;
+ }
+
+ private:
+ POA_CORBA::ComponentIR::ProvidesDef * const servant_;
+ TAO_Operation_Details const * const operation_details_;
+ TAO::Argument * const * const args_;
+ };
+ }
+
+}
+
+
+void POA_CORBA::ComponentIR::ProvidesDef::_component_skel (
+ TAO_ServerRequest & server_request,
+ void * TAO_INTERCEPTOR (servant_upcall),
+ void * servant
+ ACE_ENV_ARG_DECL
+ )
+{
+#if TAO_HAS_INTERCEPTORS == 1
+ static ::CORBA::TypeCode_ptr const * const exceptions = 0;
+ static ::CORBA::ULong const nexceptions = 0;
+#endif /* TAO_HAS_INTERCEPTORS */
+
+ TAO::SArg_Traits< ::CORBA::Object>::ret_val retval;
+
+ TAO::Argument * const args[] =
+ {
+ &retval
+ };
+
+ static size_t const nargs = 1;
+
+ POA_CORBA::ComponentIR::ProvidesDef * const impl =
+ static_cast<POA_CORBA::ComponentIR::ProvidesDef *> (servant);
+
+ _get_component_ProvidesDef_Upcall_Command command (
+ impl,
+ server_request.operation_details (),
+ args);
+
+ TAO::Upcall_Wrapper upcall_wrapper;
+ upcall_wrapper.upcall (server_request
+ , args
+ , nargs
+ , command
+#if TAO_HAS_INTERCEPTORS == 1
+ , servant_upcall
+ , exceptions
+ , nexceptions
+#endif /* TAO_HAS_INTERCEPTORS == 1 */
+ ACE_ENV_ARG_PARAMETER);
+ ACE_CHECK;
+}
+
+::CORBA::Boolean POA_CORBA::ComponentIR::ProvidesDef::_is_a (
+ const char* value
+ ACE_ENV_ARG_DECL_NOT_USED
+ )
+{
+ return
+ (
+ !ACE_OS::strcmp (
+ value,
+ "IDL:omg.org/CORBA/IRObject:1.0"
+ ) ||
+ !ACE_OS::strcmp (
+ value,
+ "IDL:omg.org/CORBA/Contained:1.0"
+ ) ||
+ !ACE_OS::strcmp (
+ value,
+ "IDL:omg.org/CORBA/ComponentIR/ProvidesDef:1.0"
+ ) ||
+ !ACE_OS::strcmp (
+ value,
+ "IDL:omg.org/CORBA/Object:1.0"
+ )
+ );
+}
+
+const char* POA_CORBA::ComponentIR::ProvidesDef::_interface_repository_id (void) const
+{
+ return "IDL:omg.org/CORBA/ComponentIR/ProvidesDef:1.0";
+}
+
+// TAO_IDL - Generated from
+// be\be_visitor_interface/interface_ss.cpp:903
+
+void POA_CORBA::ComponentIR::ProvidesDef::_dispatch (
+ TAO_ServerRequest & req,
+ void * servant_upcall
+ ACE_ENV_ARG_DECL
+ )
+{
+ this->synchronous_upcall_dispatch (req,
+ servant_upcall,
+ this
+ ACE_ENV_ARG_PARAMETER);
+}
+
+// TAO_IDL - Generated from
+// be\be_visitor_interface/interface_ss.cpp:851
+
+CORBA::ComponentIR::ProvidesDef *
+POA_CORBA::ComponentIR::ProvidesDef::_this (ACE_ENV_SINGLE_ARG_DECL)
+{
+ TAO_Stub *stub = this->_create_stub (ACE_ENV_SINGLE_ARG_PARAMETER);
+ ACE_CHECK_RETURN (0);
+
+ TAO_Stub_Auto_Ptr safe_stub (stub);
+ ::CORBA::Object_ptr tmp = CORBA::Object::_nil ();
+
+ ::CORBA::Boolean const _tao_opt_colloc =
+ stub->servant_orb_var ()->orb_core ()->optimize_collocation_objects ();
+
+ ACE_NEW_RETURN (
+ tmp,
+ ::CORBA::Object (stub, _tao_opt_colloc, this),
+ 0
+ );
+
+ ::CORBA::Object_var obj = tmp;
+ (void) safe_stub.release ();
+
+ typedef ::CORBA::ComponentIR::ProvidesDef STUB_SCOPED_NAME;
+ return
+ TAO::Narrow_Utils<STUB_SCOPED_NAME>::unchecked_narrow (
+ obj.in (),
+ CORBA_ComponentIR__TAO_ProvidesDef_Proxy_Broker_Factory_function_pointer
+ );
+}
+
+// TAO_IDL - Generated from
+// be\be_interface.cpp:1499
+
+class TAO_CORBA_ComponentIR_UsesDef_Perfect_Hash_OpTable
+ : public TAO_Perfect_Hash_OpTable
+{
+private:
+ unsigned int hash (const char *str, unsigned int len);
+
+public:
+ const TAO_operation_db_entry * lookup (const char *str, unsigned int len);
+};
+
+/* C++ code produced by gperf version 2.8 (ACE version) */
+/* Command-line: C:\ACE\latest\ACE_wrappers\bin\gperf.exe -m -M -J -c -C -D -E -T -f 0 -F 0,0 -a -o -t -p -K opname -L C++ -Z TAO_CORBA_ComponentIR_UsesDef_Perfect_Hash_OpTable -N lookup */
+unsigned int
+TAO_CORBA_ComponentIR_UsesDef_Perfect_Hash_OpTable::hash (const char *str, unsigned int len)
+{
+ static const unsigned char asso_values[] =
+ {
+#if defined (ACE_MVS)
+ 37, 37, 37, 37, 37, 37, 37, 37, 37, 37,
+ 37, 37, 37, 37, 37, 37, 37, 37, 37, 37,
+ 37, 37, 37, 37, 37, 37, 37, 37, 37, 37,
+ 37, 37, 37, 37, 37, 37, 37, 37, 37, 37,
+ 37, 37, 37, 37, 37, 37, 37, 37, 37, 37,
+ 37, 37, 37, 37, 37, 37, 37, 37, 37, 37,
+ 37, 37, 37, 37, 37, 37, 37, 37, 37, 37,
+ 37, 37, 37, 37, 37, 37, 37, 37, 37, 37,
+ 37, 37, 37, 37, 37, 37, 37, 37, 37, 37,
+ 37, 37, 37, 37, 37, 37, 37, 37, 37, 37,
+ 37, 37, 37, 37, 37, 37, 37, 37, 37, 0,
+ 37, 37, 37, 37, 37, 37, 37, 37, 37, 37,
+ 37, 37, 37, 37, 37, 37, 37, 37, 37, 0,
+ 37, 37, 0, 0, 37, 37, 37, 37, 37, 37,
+ 37, 37, 37, 37, 37, 37, 37, 37, 0, 0,
+ 37, 37, 37, 37, 37, 37, 37, 37, 37, 37,
+ 37, 37, 37, 10, 37, 37, 37, 37, 10, 37,
+ 37, 37, 37, 37, 37, 37, 37, 37, 37, 37,
+ 37, 37, 37, 37, 37, 37, 37, 37, 37, 37,
+ 37, 37, 37, 37, 37, 37, 37, 37, 37, 37,
+ 37, 37, 37, 37, 37, 37, 37, 37, 37, 37,
+ 37, 37, 37, 37, 37, 37, 37, 37, 37, 37,
+ 37, 37, 37, 37, 37, 37, 37, 37, 37, 37,
+ 37, 37, 37, 37, 37, 37, 37, 37, 37, 37,
+ 37, 37, 37, 37, 37, 37, 37, 37, 37, 37,
+ 37, 37, 37, 37, 37, 37,
+#else
+ 37, 37, 37, 37, 37, 37, 37, 37, 37, 37,
+ 37, 37, 37, 37, 37, 37, 37, 37, 37, 37,
+ 37, 37, 37, 37, 37, 37, 37, 37, 37, 37,
+ 37, 37, 37, 37, 37, 37, 37, 37, 37, 37,
+ 37, 37, 37, 37, 37, 37, 37, 37, 37, 37,
+ 37, 37, 37, 37, 37, 37, 37, 37, 37, 37,
+ 37, 37, 37, 37, 37, 37, 37, 37, 37, 37,
+ 37, 37, 37, 37, 37, 37, 37, 37, 37, 37,
+ 37, 37, 37, 37, 37, 37, 37, 37, 37, 37,
+ 37, 37, 37, 37, 37, 0, 37, 0, 37, 37,
+ 0, 0, 37, 37, 37, 37, 37, 37, 37, 0,
+ 0, 37, 37, 37, 37, 37, 10, 37, 37, 37,
+ 37, 10, 37, 37, 37, 37, 37, 37,
+#endif /* ACE_MVS */
+ };
+ return len + asso_values[(int) str[len - 1]] + asso_values[(int) str[0]];
+}
+
+const TAO_operation_db_entry *
+TAO_CORBA_ComponentIR_UsesDef_Perfect_Hash_OpTable::lookup (const char *str, unsigned int len)
+{
+ enum
+ {
+ TOTAL_KEYWORDS = 22,
+ MIN_WORD_LENGTH = 4,
+ MAX_WORD_LENGTH = 26,
+ MIN_HASH_VALUE = 4,
+ MAX_HASH_VALUE = 36,
+ HASH_VALUE_RANGE = 33,
+ DUPLICATES = 6,
+ WORDLIST_SIZE = 26
+ };
+
+ static const TAO_operation_db_entry wordlist[] =
+ {
+ {"",0,0},{"",0,0},{"",0,0},{"",0,0},
+ {"move", &POA_CORBA::ComponentIR::UsesDef::move_skel, 0},
+ {"_is_a", &POA_CORBA::ComponentIR::UsesDef::_is_a_skel, 0},
+ {"_get_id", &POA_CORBA::ComponentIR::UsesDef::_get_id_skel, 0},
+ {"_set_id", &POA_CORBA::ComponentIR::UsesDef::_set_id_skel, 0},
+ {"describe", &POA_CORBA::ComponentIR::UsesDef::describe_skel, 0},
+ {"_get_name", &POA_CORBA::ComponentIR::UsesDef::_get_name_skel, 0},
+ {"_set_name", &POA_CORBA::ComponentIR::UsesDef::_set_name_skel, 0},
+ {"_interface", &POA_CORBA::ComponentIR::UsesDef::_interface_skel, 0},
+ {"_get_version", &POA_CORBA::ComponentIR::UsesDef::_get_version_skel, 0},
+ {"_set_version", &POA_CORBA::ComponentIR::UsesDef::_set_version_skel, 0},
+ {"_get_def_kind", &POA_CORBA::ComponentIR::UsesDef::_get_def_kind_skel, 0},
+ {"_repository_id", &POA_CORBA::ComponentIR::UsesDef::_repository_id_skel, 0},
+ {"_get_defined_in", &POA_CORBA::ComponentIR::UsesDef::_get_defined_in_skel, 0},
+ {"_get_is_multiple", &POA_CORBA::ComponentIR::UsesDef::_get_is_multiple_skel, 0},
+ {"_set_is_multiple", &POA_CORBA::ComponentIR::UsesDef::_set_is_multiple_skel, 0},
+ {"destroy", &POA_CORBA::ComponentIR::UsesDef::destroy_skel, 0},
+ {"_get_absolute_name", &POA_CORBA::ComponentIR::UsesDef::_get_absolute_name_skel, 0},
+ {"_get_interface_type", &POA_CORBA::ComponentIR::UsesDef::_get_interface_type_skel, 0},
+ {"_set_interface_type", &POA_CORBA::ComponentIR::UsesDef::_set_interface_type_skel, 0},
+ {"_component", &POA_CORBA::ComponentIR::UsesDef::_component_skel, 0},
+ {"_non_existent", &POA_CORBA::ComponentIR::UsesDef::_non_existent_skel, 0},
+ {"_get_containing_repository", &POA_CORBA::ComponentIR::UsesDef::_get_containing_repository_skel, 0},
+ };
+
+ static const signed char lookup[] =
+ {
+ -17, -2, -21, -2, 4, 5, -1, 55, 8, 51, 11, -1, 45, 14,
+ 15, 16, -52, 19, 20, -53, 23, -12, -2, 24, -9, -2, -6, -2,
+ -1, -1, -1, -1, -1, -1, -1, -1, 25,
+ };
+
+ if (len <= MAX_WORD_LENGTH && len >= MIN_WORD_LENGTH)
+ {
+ unsigned int key = hash (str, len);
+
+ if (key <= MAX_HASH_VALUE && key >= MIN_HASH_VALUE)
+ {
+ int slot = lookup[key];
+
+ if (slot >= 0 && slot < WORDLIST_SIZE)
+ {
+ const char *s = wordlist[slot].opname;
+
+ if (*str == *s && !strncmp (str + 1, s + 1, len - 1))
+ return &wordlist[slot];
+ }
+ else if (slot < 0 && slot >= -MAX_HASH_VALUE)
+ return 0;
+ else
+ {
+ unsigned int offset = key + slot + (slot > 0 ? -MAX_HASH_VALUE : MAX_HASH_VALUE);
+ const TAO_operation_db_entry *base = &wordlist[-lookup[offset]];
+ const TAO_operation_db_entry *ptr = base + -lookup[offset + 1];
+
+ while (--ptr >= base)
+ if (*str == *ptr->opname && !strncmp (str + 1, ptr->opname + 1, len - 1))
+ return ptr;
+ }
+ }
+ }
+ return 0;
+}
+
+static TAO_CORBA_ComponentIR_UsesDef_Perfect_Hash_OpTable tao_CORBA_ComponentIR_UsesDef_optable;
+
+// TAO_IDL - Generated from
+// be\be_visitor_interface/interface_ss.cpp:966
+
+TAO::Collocation_Proxy_Broker *
+CORBA_ComponentIR__TAO_UsesDef_Proxy_Broker_Factory_function ( ::CORBA::Object_ptr)
+{
+ return reinterpret_cast<TAO::Collocation_Proxy_Broker *> (0xdead); // Dummy
+}
+
+int
+CORBA_ComponentIR__TAO_UsesDef_Proxy_Broker_Factory_Initializer (size_t)
+{
+ CORBA_ComponentIR__TAO_UsesDef_Proxy_Broker_Factory_function_pointer =
+ CORBA_ComponentIR__TAO_UsesDef_Proxy_Broker_Factory_function;
+
+ return 0;
+}
+
+static int
+CORBA_ComponentIR__TAO_UsesDef_Proxy_Broker_Stub_Factory_Initializer_Scarecrow =
+ CORBA_ComponentIR__TAO_UsesDef_Proxy_Broker_Factory_Initializer (
+ reinterpret_cast<size_t> (CORBA_ComponentIR__TAO_UsesDef_Proxy_Broker_Factory_Initializer)
+ );
+
+// TAO_IDL - Generated from
+// be\be_visitor_interface/interface_ss.cpp:103
+
+POA_CORBA::ComponentIR::UsesDef::UsesDef (void)
+ : TAO_ServantBase ()
+{
+ this->optable_ = &tao_CORBA_ComponentIR_UsesDef_optable;
+}
+
+POA_CORBA::ComponentIR::UsesDef::UsesDef (const UsesDef& rhs)
+ : TAO_Abstract_ServantBase (rhs),
+ TAO_ServantBase (rhs),
+ POA_CORBA::IRObject (rhs),
+ POA_CORBA::Contained (rhs)
+{
+}
+
+POA_CORBA::ComponentIR::UsesDef::~UsesDef (void)
+{
+}namespace POA_CORBA
+{
+ namespace ComponentIR
+ {
+
+
+ // TAO_IDL - Generated from
+ // be\be_visitor_operation/upcall_command_ss.cpp:127
+
+ class _get_interface_type_UsesDef
+ : public TAO::Upcall_Command
+ {
+ public:
+ inline _get_interface_type_UsesDef (
+ POA_CORBA::ComponentIR::UsesDef * servant,
+ TAO_Operation_Details const * operation_details,
+ TAO::Argument * const args[])
+ : servant_ (servant)
+ , operation_details_ (operation_details)
+ , args_ (args)
+ {
+ }
+
+ virtual void execute (ACE_ENV_SINGLE_ARG_DECL)
+ {
+ TAO::SArg_Traits< ::CORBA::InterfaceDef>::ret_arg_type retval =
+ TAO::Portable_Server::get_ret_arg< ::CORBA::InterfaceDef> (
+ this->operation_details_,
+ this->args_);
+
+ retval =
+ this->servant_->interface_type (
+ ACE_ENV_SINGLE_ARG_PARAMETER);
+ ACE_CHECK;
+ }
+
+ private:
+ POA_CORBA::ComponentIR::UsesDef * const servant_;
+ TAO_Operation_Details const * const operation_details_;
+ TAO::Argument * const * const args_;
+ };
+ }
+
+}
+
+
+// TAO_IDL - Generated from
+// be\be_visitor_operation/operation_ss.cpp:190
+
+void POA_CORBA::ComponentIR::UsesDef::_get_interface_type_skel (
+ TAO_ServerRequest & server_request,
+ void * TAO_INTERCEPTOR (servant_upcall),
+ void * servant
+ ACE_ENV_ARG_DECL
+ )
+{
+#if TAO_HAS_INTERCEPTORS == 1
+ static ::CORBA::TypeCode_ptr const * const exceptions = 0;
+ static ::CORBA::ULong const nexceptions = 0;
+#endif /* TAO_HAS_INTERCEPTORS */
+
+ TAO::SArg_Traits< ::CORBA::InterfaceDef>::ret_val retval;
+
+ TAO::Argument * const args[] =
+ {
+ &retval
+ };
+
+ static size_t const nargs = 1;
+
+ POA_CORBA::ComponentIR::UsesDef * const impl =
+ static_cast<POA_CORBA::ComponentIR::UsesDef *> (servant);
+
+ _get_interface_type_UsesDef command (
+ impl,
+ server_request.operation_details (),
+ args);
+
+ TAO::Upcall_Wrapper upcall_wrapper;
+ upcall_wrapper.upcall (server_request
+ , args
+ , nargs
+ , command
+#if TAO_HAS_INTERCEPTORS == 1
+ , servant_upcall
+ , exceptions
+ , nexceptions
+#endif /* TAO_HAS_INTERCEPTORS == 1 */
+ ACE_ENV_ARG_PARAMETER);
+ ACE_CHECK;
+}namespace POA_CORBA
+{
+ namespace ComponentIR
+ {
+
+
+ // TAO_IDL - Generated from
+ // be\be_visitor_operation/upcall_command_ss.cpp:127
+
+ class _set_interface_type_UsesDef
+ : public TAO::Upcall_Command
+ {
+ public:
+ inline _set_interface_type_UsesDef (
+ POA_CORBA::ComponentIR::UsesDef * servant,
+ TAO_Operation_Details const * operation_details,
+ TAO::Argument * const args[])
+ : servant_ (servant)
+ , operation_details_ (operation_details)
+ , args_ (args)
+ {
+ }
+
+ virtual void execute (ACE_ENV_SINGLE_ARG_DECL)
+ {
+ TAO::SArg_Traits< ::CORBA::InterfaceDef>::in_arg_type arg_1 =
+ TAO::Portable_Server::get_in_arg< ::CORBA::InterfaceDef> (
+ this->operation_details_,
+ this->args_,
+ 1);
+
+ this->servant_->interface_type (
+ arg_1
+ ACE_ENV_ARG_PARAMETER);
+ ACE_CHECK;
+ }
+
+ private:
+ POA_CORBA::ComponentIR::UsesDef * const servant_;
+ TAO_Operation_Details const * const operation_details_;
+ TAO::Argument * const * const args_;
+ };
+ }
+
+}
+
+
+// TAO_IDL - Generated from
+// be\be_visitor_operation/operation_ss.cpp:190
+
+void POA_CORBA::ComponentIR::UsesDef::_set_interface_type_skel (
+ TAO_ServerRequest & server_request,
+ void * TAO_INTERCEPTOR (servant_upcall),
+ void * servant
+ ACE_ENV_ARG_DECL
+ )
+{
+#if TAO_HAS_INTERCEPTORS == 1
+ static ::CORBA::TypeCode_ptr const * const exceptions = 0;
+ static ::CORBA::ULong const nexceptions = 0;
+#endif /* TAO_HAS_INTERCEPTORS */
+
+ TAO::SArg_Traits< void>::ret_val retval;
+ TAO::SArg_Traits< ::CORBA::InterfaceDef>::in_arg_val _tao_interface_type;
+
+ TAO::Argument * const args[] =
+ {
+ &retval,
+ &_tao_interface_type
+ };
+
+ static size_t const nargs = 2;
+
+ POA_CORBA::ComponentIR::UsesDef * const impl =
+ static_cast<POA_CORBA::ComponentIR::UsesDef *> (servant);
+
+ _set_interface_type_UsesDef command (
+ impl,
+ server_request.operation_details (),
+ args);
+
+ TAO::Upcall_Wrapper upcall_wrapper;
+ upcall_wrapper.upcall (server_request
+ , args
+ , nargs
+ , command
+#if TAO_HAS_INTERCEPTORS == 1
+ , servant_upcall
+ , exceptions
+ , nexceptions
+#endif /* TAO_HAS_INTERCEPTORS == 1 */
+ ACE_ENV_ARG_PARAMETER);
+ ACE_CHECK;
+}namespace POA_CORBA
+{
+ namespace ComponentIR
+ {
+
+
+ // TAO_IDL - Generated from
+ // be\be_visitor_operation/upcall_command_ss.cpp:127
+
+ class _get_is_multiple_UsesDef
+ : public TAO::Upcall_Command
+ {
+ public:
+ inline _get_is_multiple_UsesDef (
+ POA_CORBA::ComponentIR::UsesDef * servant,
+ TAO_Operation_Details const * operation_details,
+ TAO::Argument * const args[])
+ : servant_ (servant)
+ , operation_details_ (operation_details)
+ , args_ (args)
+ {
+ }
+
+ virtual void execute (ACE_ENV_SINGLE_ARG_DECL)
+ {
+ TAO::SArg_Traits< ::ACE_InputCDR::to_boolean>::ret_arg_type retval =
+ TAO::Portable_Server::get_ret_arg< ::ACE_InputCDR::to_boolean> (
+ this->operation_details_,
+ this->args_);
+
+ retval =
+ this->servant_->is_multiple (
+ ACE_ENV_SINGLE_ARG_PARAMETER);
+ ACE_CHECK;
+ }
+
+ private:
+ POA_CORBA::ComponentIR::UsesDef * const servant_;
+ TAO_Operation_Details const * const operation_details_;
+ TAO::Argument * const * const args_;
+ };
+ }
+
+}
+
+
+// TAO_IDL - Generated from
+// be\be_visitor_operation/operation_ss.cpp:190
+
+void POA_CORBA::ComponentIR::UsesDef::_get_is_multiple_skel (
+ TAO_ServerRequest & server_request,
+ void * TAO_INTERCEPTOR (servant_upcall),
+ void * servant
+ ACE_ENV_ARG_DECL
+ )
+{
+#if TAO_HAS_INTERCEPTORS == 1
+ static ::CORBA::TypeCode_ptr const * const exceptions = 0;
+ static ::CORBA::ULong const nexceptions = 0;
+#endif /* TAO_HAS_INTERCEPTORS */
+
+ TAO::SArg_Traits< ::ACE_InputCDR::to_boolean>::ret_val retval;
+
+ TAO::Argument * const args[] =
+ {
+ &retval
+ };
+
+ static size_t const nargs = 1;
+
+ POA_CORBA::ComponentIR::UsesDef * const impl =
+ static_cast<POA_CORBA::ComponentIR::UsesDef *> (servant);
+
+ _get_is_multiple_UsesDef command (
+ impl,
+ server_request.operation_details (),
+ args);
+
+ TAO::Upcall_Wrapper upcall_wrapper;
+ upcall_wrapper.upcall (server_request
+ , args
+ , nargs
+ , command
+#if TAO_HAS_INTERCEPTORS == 1
+ , servant_upcall
+ , exceptions
+ , nexceptions
+#endif /* TAO_HAS_INTERCEPTORS == 1 */
+ ACE_ENV_ARG_PARAMETER);
+ ACE_CHECK;
+}namespace POA_CORBA
+{
+ namespace ComponentIR
+ {
+
+
+ // TAO_IDL - Generated from
+ // be\be_visitor_operation/upcall_command_ss.cpp:127
+
+ class _set_is_multiple_UsesDef
+ : public TAO::Upcall_Command
+ {
+ public:
+ inline _set_is_multiple_UsesDef (
+ POA_CORBA::ComponentIR::UsesDef * servant,
+ TAO_Operation_Details const * operation_details,
+ TAO::Argument * const args[])
+ : servant_ (servant)
+ , operation_details_ (operation_details)
+ , args_ (args)
+ {
+ }
+
+ virtual void execute (ACE_ENV_SINGLE_ARG_DECL)
+ {
+ TAO::SArg_Traits< ::ACE_InputCDR::to_boolean>::in_arg_type arg_1 =
+ TAO::Portable_Server::get_in_arg< ::ACE_InputCDR::to_boolean> (
+ this->operation_details_,
+ this->args_,
+ 1);
+
+ this->servant_->is_multiple (
+ arg_1
+ ACE_ENV_ARG_PARAMETER);
+ ACE_CHECK;
+ }
+
+ private:
+ POA_CORBA::ComponentIR::UsesDef * const servant_;
+ TAO_Operation_Details const * const operation_details_;
+ TAO::Argument * const * const args_;
+ };
+ }
+
+}
+
+
+// TAO_IDL - Generated from
+// be\be_visitor_operation/operation_ss.cpp:190
+
+void POA_CORBA::ComponentIR::UsesDef::_set_is_multiple_skel (
+ TAO_ServerRequest & server_request,
+ void * TAO_INTERCEPTOR (servant_upcall),
+ void * servant
+ ACE_ENV_ARG_DECL
+ )
+{
+#if TAO_HAS_INTERCEPTORS == 1
+ static ::CORBA::TypeCode_ptr const * const exceptions = 0;
+ static ::CORBA::ULong const nexceptions = 0;
+#endif /* TAO_HAS_INTERCEPTORS */
+
+ TAO::SArg_Traits< void>::ret_val retval;
+ TAO::SArg_Traits< ::ACE_InputCDR::to_boolean>::in_arg_val _tao_is_multiple;
+
+ TAO::Argument * const args[] =
+ {
+ &retval,
+ &_tao_is_multiple
+ };
+
+ static size_t const nargs = 2;
+
+ POA_CORBA::ComponentIR::UsesDef * const impl =
+ static_cast<POA_CORBA::ComponentIR::UsesDef *> (servant);
+
+ _set_is_multiple_UsesDef command (
+ impl,
+ server_request.operation_details (),
+ args);
+
+ TAO::Upcall_Wrapper upcall_wrapper;
+ upcall_wrapper.upcall (server_request
+ , args
+ , nargs
+ , command
+#if TAO_HAS_INTERCEPTORS == 1
+ , servant_upcall
+ , exceptions
+ , nexceptions
+#endif /* TAO_HAS_INTERCEPTORS == 1 */
+ ACE_ENV_ARG_PARAMETER);
+ ACE_CHECK;
+}
+
+// TAO_IDL - Generated from
+// be\be_visitor_interface/interface_ss.cpp:169
+
+namespace POA_CORBA
+{
+ namespace ComponentIR
+ {
+
+
+ // TAO_IDL - Generated from
+ // be\be_visitor_operation/upcall_command_ss.cpp:127
+
+ class _is_a_UsesDef_Upcall_Command
+ : public TAO::Upcall_Command
+ {
+ public:
+ inline _is_a_UsesDef_Upcall_Command (
+ POA_CORBA::ComponentIR::UsesDef * servant,
+ TAO_Operation_Details const * operation_details,
+ TAO::Argument * const args[])
+ : servant_ (servant)
+ , operation_details_ (operation_details)
+ , args_ (args)
+ {
+ }
+
+ virtual void execute (ACE_ENV_SINGLE_ARG_DECL)
+ {
+ TAO::SArg_Traits< ::ACE_InputCDR::to_boolean>::ret_arg_type retval =
+ TAO::Portable_Server::get_ret_arg< ::ACE_InputCDR::to_boolean> (
+ this->operation_details_,
+ this->args_);
+
+ TAO::SArg_Traits< ::CORBA::Char *>::in_arg_type arg_1 =
+ TAO::Portable_Server::get_in_arg< ::CORBA::Char *> (
+ this->operation_details_,
+ this->args_,
+ 1);
+
+ retval =
+ this->servant_-> _is_a (
+ arg_1
+ ACE_ENV_ARG_PARAMETER);
+ ACE_CHECK;
+ }
+
+ private:
+ POA_CORBA::ComponentIR::UsesDef * const servant_;
+ TAO_Operation_Details const * const operation_details_;
+ TAO::Argument * const * const args_;
+ };
+ }
+
+}
+
+
+void POA_CORBA::ComponentIR::UsesDef::_is_a_skel (
+ TAO_ServerRequest & server_request,
+ void * TAO_INTERCEPTOR (servant_upcall),
+ void * servant
+ ACE_ENV_ARG_DECL
+ )
+{
+#if TAO_HAS_INTERCEPTORS == 1
+ static ::CORBA::TypeCode_ptr const * const exceptions = 0;
+ static ::CORBA::ULong const nexceptions = 0;
+#endif /* TAO_HAS_INTERCEPTORS */
+
+ TAO::SArg_Traits< ::ACE_InputCDR::to_boolean>::ret_val retval;
+ TAO::SArg_Traits< ::CORBA::Char *>::in_arg_val _tao_repository_id;
+
+ TAO::Argument * const args[] =
+ {
+ &retval,
+ &_tao_repository_id
+ };
+
+ static size_t const nargs = 2;
+
+ POA_CORBA::ComponentIR::UsesDef * const impl =
+ static_cast<POA_CORBA::ComponentIR::UsesDef *> (servant);
+
+ _is_a_UsesDef_Upcall_Command command (
+ impl,
+ server_request.operation_details (),
+ args);
+
+ TAO::Upcall_Wrapper upcall_wrapper;
+ upcall_wrapper.upcall (server_request
+ , args
+ , nargs
+ , command
+#if TAO_HAS_INTERCEPTORS == 1
+ , servant_upcall
+ , exceptions
+ , nexceptions
+#endif /* TAO_HAS_INTERCEPTORS == 1 */
+ ACE_ENV_ARG_PARAMETER);
+ ACE_CHECK;
+}namespace POA_CORBA
+{
+ namespace ComponentIR
+ {
+
+
+ // TAO_IDL - Generated from
+ // be\be_visitor_operation/upcall_command_ss.cpp:127
+
+ class _non_existent_UsesDef_Upcall_Command
+ : public TAO::Upcall_Command
+ {
+ public:
+ inline _non_existent_UsesDef_Upcall_Command (
+ POA_CORBA::ComponentIR::UsesDef * servant,
+ TAO_Operation_Details const * operation_details,
+ TAO::Argument * const args[])
+ : servant_ (servant)
+ , operation_details_ (operation_details)
+ , args_ (args)
+ {
+ }
+
+ virtual void execute (ACE_ENV_SINGLE_ARG_DECL)
+ {
+ TAO::SArg_Traits< ::ACE_InputCDR::to_boolean>::ret_arg_type retval =
+ TAO::Portable_Server::get_ret_arg< ::ACE_InputCDR::to_boolean> (
+ this->operation_details_,
+ this->args_);
+
+ retval =
+ this->servant_-> _non_existent (
+ ACE_ENV_SINGLE_ARG_PARAMETER);
+ ACE_CHECK;
+ }
+
+ private:
+ POA_CORBA::ComponentIR::UsesDef * const servant_;
+ TAO_Operation_Details const * const operation_details_;
+ TAO::Argument * const * const args_;
+ };
+ }
+
+}
+
+
+void POA_CORBA::ComponentIR::UsesDef::_non_existent_skel (
+ TAO_ServerRequest & server_request,
+ void * TAO_INTERCEPTOR (servant_upcall),
+ void * servant
+ ACE_ENV_ARG_DECL
+ )
+{
+#if TAO_HAS_INTERCEPTORS == 1
+ static ::CORBA::TypeCode_ptr const * const exceptions = 0;
+ static ::CORBA::ULong const nexceptions = 0;
+#endif /* TAO_HAS_INTERCEPTORS */
+
+ TAO::SArg_Traits< ::ACE_InputCDR::to_boolean>::ret_val retval;
+
+ TAO::Argument * const args[] =
+ {
+ &retval
+ };
+
+ static size_t const nargs = 1;
+
+ POA_CORBA::ComponentIR::UsesDef * const impl =
+ static_cast<POA_CORBA::ComponentIR::UsesDef *> (servant);
+
+ _non_existent_UsesDef_Upcall_Command command (
+ impl,
+ server_request.operation_details (),
+ args);
+
+ TAO::Upcall_Wrapper upcall_wrapper;
+ upcall_wrapper.upcall (server_request
+ , args
+ , nargs
+ , command
+#if TAO_HAS_INTERCEPTORS == 1
+ , servant_upcall
+ , exceptions
+ , nexceptions
+#endif /* TAO_HAS_INTERCEPTORS == 1 */
+ ACE_ENV_ARG_PARAMETER);
+ ACE_CHECK;
+}namespace POA_CORBA
+{
+ namespace ComponentIR
+ {
+
+
+ // TAO_IDL - Generated from
+ // be\be_visitor_operation/upcall_command_ss.cpp:127
+
+ class _repository_id_UsesDef_Upcall_Command
+ : public TAO::Upcall_Command
+ {
+ public:
+ inline _repository_id_UsesDef_Upcall_Command (
+ POA_CORBA::ComponentIR::UsesDef * servant,
+ TAO_Operation_Details const * operation_details,
+ TAO::Argument * const args[])
+ : servant_ (servant)
+ , operation_details_ (operation_details)
+ , args_ (args)
+ {
+ }
+
+ virtual void execute (ACE_ENV_SINGLE_ARG_DECL)
+ {
+ TAO::SArg_Traits< ::CORBA::Char *>::ret_arg_type retval =
+ TAO::Portable_Server::get_ret_arg< ::CORBA::Char *> (
+ this->operation_details_,
+ this->args_);
+
+ retval =
+ this->servant_-> _repository_id (
+ ACE_ENV_SINGLE_ARG_PARAMETER);
+ ACE_CHECK;
+ }
+
+ private:
+ POA_CORBA::ComponentIR::UsesDef * const servant_;
+ TAO_Operation_Details const * const operation_details_;
+ TAO::Argument * const * const args_;
+ };
+ }
+
+}
+
+
+void POA_CORBA::ComponentIR::UsesDef::_repository_id_skel (
+ TAO_ServerRequest & server_request,
+ void * TAO_INTERCEPTOR (servant_upcall),
+ void * servant
+ ACE_ENV_ARG_DECL
+ )
+{
+#if TAO_HAS_INTERCEPTORS == 1
+ static ::CORBA::TypeCode_ptr const * const exceptions = 0;
+ static ::CORBA::ULong const nexceptions = 0;
+#endif /* TAO_HAS_INTERCEPTORS */
+
+ TAO::SArg_Traits< ::CORBA::Char *>::ret_val retval;
+
+ TAO::Argument * const args[] =
+ {
+ &retval
+ };
+
+ static size_t const nargs = 1;
+
+ POA_CORBA::ComponentIR::UsesDef * const impl =
+ static_cast<POA_CORBA::ComponentIR::UsesDef *> (servant);
+
+ _repository_id_UsesDef_Upcall_Command command (
+ impl,
+ server_request.operation_details (),
+ args);
+
+ TAO::Upcall_Wrapper upcall_wrapper;
+ upcall_wrapper.upcall (server_request
+ , args
+ , nargs
+ , command
+#if TAO_HAS_INTERCEPTORS == 1
+ , servant_upcall
+ , exceptions
+ , nexceptions
+#endif /* TAO_HAS_INTERCEPTORS == 1 */
+ ACE_ENV_ARG_PARAMETER);
+ ACE_CHECK;
+}
+
+// TAO_IDL - Generated from
+// be\be_visitor_interface/interface_ss.cpp:513
+
+void POA_CORBA::ComponentIR::UsesDef::_interface_skel (
+ TAO_ServerRequest & server_request,
+ void * /* servant_upcall */,
+ void * servant
+ ACE_ENV_ARG_DECL
+ )
+{
+ TAO_IFR_Client_Adapter *_tao_adapter =
+ ACE_Dynamic_Service<TAO_IFR_Client_Adapter>::instance (
+ TAO_ORB_Core::ifr_client_adapter_name ()
+ );
+
+ if (_tao_adapter == 0)
+ {
+ ACE_THROW ( ::CORBA::INTF_REPOS ( ::CORBA::OMGVMCID | 1,
+ ::CORBA::COMPLETED_NO));
+ }
+
+ POA_CORBA::ComponentIR::UsesDef * const impl =
+ static_cast<POA_CORBA::ComponentIR::UsesDef *> (servant);
+ ::CORBA::InterfaceDef_ptr _tao_retval =
+ impl->_get_interface (ACE_ENV_SINGLE_ARG_PARAMETER);
+ ACE_CHECK;
+
+ server_request.init_reply ();
+ TAO_OutputCDR &_tao_out = *server_request.outgoing ();
+
+ ::CORBA::Boolean const _tao_result =
+ _tao_adapter->interfacedef_cdr_insert (
+ _tao_out,
+ _tao_retval
+ );
+
+ _tao_adapter->dispose (_tao_retval);
+
+ if (_tao_result == false)
+ {
+ ACE_THROW ( ::CORBA::MARSHAL ());
+ }
+}namespace POA_CORBA
+{
+ namespace ComponentIR
+ {
+
+
+ // TAO_IDL - Generated from
+ // be\be_visitor_operation/upcall_command_ss.cpp:127
+
+ class _get_component_UsesDef_Upcall_Command
+ : public TAO::Upcall_Command
+ {
+ public:
+ inline _get_component_UsesDef_Upcall_Command (
+ POA_CORBA::ComponentIR::UsesDef * servant,
+ TAO_Operation_Details const * operation_details,
+ TAO::Argument * const args[])
+ : servant_ (servant)
+ , operation_details_ (operation_details)
+ , args_ (args)
+ {
+ }
+
+ virtual void execute (ACE_ENV_SINGLE_ARG_DECL)
+ {
+ TAO::SArg_Traits< ::CORBA::Object>::ret_arg_type retval =
+ TAO::Portable_Server::get_ret_arg< ::CORBA::Object> (
+ this->operation_details_,
+ this->args_);
+
+ retval =
+ this->servant_-> _get_component (
+ ACE_ENV_SINGLE_ARG_PARAMETER);
+ ACE_CHECK;
+ }
+
+ private:
+ POA_CORBA::ComponentIR::UsesDef * const servant_;
+ TAO_Operation_Details const * const operation_details_;
+ TAO::Argument * const * const args_;
+ };
+ }
+
+}
+
+
+void POA_CORBA::ComponentIR::UsesDef::_component_skel (
+ TAO_ServerRequest & server_request,
+ void * TAO_INTERCEPTOR (servant_upcall),
+ void * servant
+ ACE_ENV_ARG_DECL
+ )
+{
+#if TAO_HAS_INTERCEPTORS == 1
+ static ::CORBA::TypeCode_ptr const * const exceptions = 0;
+ static ::CORBA::ULong const nexceptions = 0;
+#endif /* TAO_HAS_INTERCEPTORS */
+
+ TAO::SArg_Traits< ::CORBA::Object>::ret_val retval;
+
+ TAO::Argument * const args[] =
+ {
+ &retval
+ };
+
+ static size_t const nargs = 1;
+
+ POA_CORBA::ComponentIR::UsesDef * const impl =
+ static_cast<POA_CORBA::ComponentIR::UsesDef *> (servant);
+
+ _get_component_UsesDef_Upcall_Command command (
+ impl,
+ server_request.operation_details (),
+ args);
+
+ TAO::Upcall_Wrapper upcall_wrapper;
+ upcall_wrapper.upcall (server_request
+ , args
+ , nargs
+ , command
+#if TAO_HAS_INTERCEPTORS == 1
+ , servant_upcall
+ , exceptions
+ , nexceptions
+#endif /* TAO_HAS_INTERCEPTORS == 1 */
+ ACE_ENV_ARG_PARAMETER);
+ ACE_CHECK;
+}
+
+::CORBA::Boolean POA_CORBA::ComponentIR::UsesDef::_is_a (
+ const char* value
+ ACE_ENV_ARG_DECL_NOT_USED
+ )
+{
+ return
+ (
+ !ACE_OS::strcmp (
+ value,
+ "IDL:omg.org/CORBA/IRObject:1.0"
+ ) ||
+ !ACE_OS::strcmp (
+ value,
+ "IDL:omg.org/CORBA/Contained:1.0"
+ ) ||
+ !ACE_OS::strcmp (
+ value,
+ "IDL:omg.org/CORBA/ComponentIR/UsesDef:1.0"
+ ) ||
+ !ACE_OS::strcmp (
+ value,
+ "IDL:omg.org/CORBA/Object:1.0"
+ )
+ );
+}
+
+const char* POA_CORBA::ComponentIR::UsesDef::_interface_repository_id (void) const
+{
+ return "IDL:omg.org/CORBA/ComponentIR/UsesDef:1.0";
+}
+
+// TAO_IDL - Generated from
+// be\be_visitor_interface/interface_ss.cpp:903
+
+void POA_CORBA::ComponentIR::UsesDef::_dispatch (
+ TAO_ServerRequest & req,
+ void * servant_upcall
+ ACE_ENV_ARG_DECL
+ )
+{
+ this->synchronous_upcall_dispatch (req,
+ servant_upcall,
+ this
+ ACE_ENV_ARG_PARAMETER);
+}
+
+// TAO_IDL - Generated from
+// be\be_visitor_interface/interface_ss.cpp:851
+
+CORBA::ComponentIR::UsesDef *
+POA_CORBA::ComponentIR::UsesDef::_this (ACE_ENV_SINGLE_ARG_DECL)
+{
+ TAO_Stub *stub = this->_create_stub (ACE_ENV_SINGLE_ARG_PARAMETER);
+ ACE_CHECK_RETURN (0);
+
+ TAO_Stub_Auto_Ptr safe_stub (stub);
+ ::CORBA::Object_ptr tmp = CORBA::Object::_nil ();
+
+ ::CORBA::Boolean const _tao_opt_colloc =
+ stub->servant_orb_var ()->orb_core ()->optimize_collocation_objects ();
+
+ ACE_NEW_RETURN (
+ tmp,
+ ::CORBA::Object (stub, _tao_opt_colloc, this),
+ 0
+ );
+
+ ::CORBA::Object_var obj = tmp;
+ (void) safe_stub.release ();
+
+ typedef ::CORBA::ComponentIR::UsesDef STUB_SCOPED_NAME;
+ return
+ TAO::Narrow_Utils<STUB_SCOPED_NAME>::unchecked_narrow (
+ obj.in (),
+ CORBA_ComponentIR__TAO_UsesDef_Proxy_Broker_Factory_function_pointer
+ );
+}
+
+// TAO_IDL - Generated from
+// be\be_interface.cpp:1499
+
+class TAO_CORBA_ComponentIR_EventPortDef_Perfect_Hash_OpTable
+ : public TAO_Perfect_Hash_OpTable
+{
+private:
+ unsigned int hash (const char *str, unsigned int len);
+
+public:
+ const TAO_operation_db_entry * lookup (const char *str, unsigned int len);
+};
+
+/* C++ code produced by gperf version 2.8 (ACE version) */
+/* Command-line: C:\ACE\latest\ACE_wrappers\bin\gperf.exe -m -M -J -c -C -D -E -T -f 0 -F 0,0 -a -o -t -p -K opname -L C++ -Z TAO_CORBA_ComponentIR_EventPortDef_Perfect_Hash_OpTable -N lookup */
+unsigned int
+TAO_CORBA_ComponentIR_EventPortDef_Perfect_Hash_OpTable::hash (const char *str, unsigned int len)
+{
+ static const unsigned char asso_values[] =
+ {
+#if defined (ACE_MVS)
+ 37, 37, 37, 37, 37, 37, 37, 37, 37, 37,
+ 37, 37, 37, 37, 37, 37, 37, 37, 37, 37,
+ 37, 37, 37, 37, 37, 37, 37, 37, 37, 37,
+ 37, 37, 37, 37, 37, 37, 37, 37, 37, 37,
+ 37, 37, 37, 37, 37, 37, 37, 37, 37, 37,
+ 37, 37, 37, 37, 37, 37, 37, 37, 37, 37,
+ 37, 37, 37, 37, 37, 37, 37, 37, 37, 37,
+ 37, 37, 37, 37, 37, 37, 37, 37, 37, 37,
+ 37, 37, 37, 37, 37, 37, 37, 37, 37, 37,
+ 37, 37, 37, 37, 37, 37, 37, 37, 37, 37,
+ 37, 37, 37, 37, 37, 37, 37, 37, 37, 0,
+ 37, 37, 37, 37, 37, 37, 37, 37, 37, 37,
+ 37, 37, 37, 37, 37, 37, 37, 37, 37, 0,
+ 37, 37, 0, 0, 37, 37, 37, 15, 37, 37,
+ 37, 37, 37, 37, 37, 37, 37, 37, 0, 0,
+ 37, 37, 37, 37, 37, 37, 37, 37, 37, 37,
+ 37, 37, 37, 10, 37, 37, 37, 37, 10, 37,
+ 37, 37, 37, 37, 37, 37, 37, 37, 37, 37,
+ 37, 37, 37, 37, 37, 37, 37, 37, 37, 37,
+ 37, 37, 37, 37, 37, 37, 37, 37, 37, 37,
+ 37, 37, 37, 37, 37, 37, 37, 37, 37, 37,
+ 37, 37, 37, 37, 37, 37, 37, 37, 37, 37,
+ 37, 37, 37, 37, 37, 37, 37, 37, 37, 37,
+ 37, 37, 37, 37, 37, 37, 37, 37, 37, 37,
+ 37, 37, 37, 37, 37, 37, 37, 37, 37, 37,
+ 37, 37, 37, 37, 37, 37,
+#else
+ 37, 37, 37, 37, 37, 37, 37, 37, 37, 37,
+ 37, 37, 37, 37, 37, 37, 37, 37, 37, 37,
+ 37, 37, 37, 37, 37, 37, 37, 37, 37, 37,
+ 37, 37, 37, 37, 37, 37, 37, 37, 37, 37,
+ 37, 37, 37, 37, 37, 37, 37, 37, 37, 37,
+ 37, 37, 37, 37, 37, 37, 37, 37, 37, 37,
+ 37, 37, 37, 37, 37, 37, 37, 37, 37, 37,
+ 37, 37, 37, 37, 37, 37, 37, 37, 37, 37,
+ 37, 37, 37, 37, 37, 37, 37, 37, 37, 37,
+ 37, 37, 37, 37, 37, 0, 37, 0, 37, 37,
+ 0, 0, 37, 37, 37, 15, 37, 37, 37, 0,
+ 0, 37, 37, 37, 37, 37, 10, 37, 37, 37,
+ 37, 10, 37, 37, 37, 37, 37, 37,
+#endif /* ACE_MVS */
+ };
+ return len + asso_values[(int) str[len - 1]] + asso_values[(int) str[0]];
+}
+
+const TAO_operation_db_entry *
+TAO_CORBA_ComponentIR_EventPortDef_Perfect_Hash_OpTable::lookup (const char *str, unsigned int len)
+{
+ enum
+ {
+ TOTAL_KEYWORDS = 21,
+ MIN_WORD_LENGTH = 4,
+ MAX_WORD_LENGTH = 26,
+ MIN_HASH_VALUE = 4,
+ MAX_HASH_VALUE = 36,
+ HASH_VALUE_RANGE = 33,
+ DUPLICATES = 6,
+ WORDLIST_SIZE = 25
+ };
+
+ static const TAO_operation_db_entry wordlist[] =
+ {
+ {"",0,0},{"",0,0},{"",0,0},{"",0,0},
+ {"move", &POA_CORBA::ComponentIR::EventPortDef::move_skel, 0},
+ {"_is_a", &POA_CORBA::ComponentIR::EventPortDef::_is_a_skel, 0},
+ {"_get_id", &POA_CORBA::ComponentIR::EventPortDef::_get_id_skel, 0},
+ {"_set_id", &POA_CORBA::ComponentIR::EventPortDef::_set_id_skel, 0},
+ {"describe", &POA_CORBA::ComponentIR::EventPortDef::describe_skel, 0},
+ {"_get_name", &POA_CORBA::ComponentIR::EventPortDef::_get_name_skel, 0},
+ {"_set_name", &POA_CORBA::ComponentIR::EventPortDef::_set_name_skel, 0},
+ {"_interface", &POA_CORBA::ComponentIR::EventPortDef::_interface_skel, 0},
+ {"_get_version", &POA_CORBA::ComponentIR::EventPortDef::_get_version_skel, 0},
+ {"_set_version", &POA_CORBA::ComponentIR::EventPortDef::_set_version_skel, 0},
+ {"_get_def_kind", &POA_CORBA::ComponentIR::EventPortDef::_get_def_kind_skel, 0},
+ {"_repository_id", &POA_CORBA::ComponentIR::EventPortDef::_repository_id_skel, 0},
+ {"_get_defined_in", &POA_CORBA::ComponentIR::EventPortDef::_get_defined_in_skel, 0},
+ {"destroy", &POA_CORBA::ComponentIR::EventPortDef::destroy_skel, 0},
+ {"_get_absolute_name", &POA_CORBA::ComponentIR::EventPortDef::_get_absolute_name_skel, 0},
+ {"is_a", &POA_CORBA::ComponentIR::EventPortDef::is_a_skel, 0},
+ {"_get_event", &POA_CORBA::ComponentIR::EventPortDef::_get_event_skel, 0},
+ {"_component", &POA_CORBA::ComponentIR::EventPortDef::_component_skel, 0},
+ {"_set_event", &POA_CORBA::ComponentIR::EventPortDef::_set_event_skel, 0},
+ {"_non_existent", &POA_CORBA::ComponentIR::EventPortDef::_non_existent_skel, 0},
+ {"_get_containing_repository", &POA_CORBA::ComponentIR::EventPortDef::_get_containing_repository_skel, 0},
+ };
+
+ static const signed char lookup[] =
+ {
+ -12, -2, -20, -3, 4, 5, -1, 53, 8, 48, 11, -1, -48, 14,
+ 15, 16, -1, 17, 18, 19, -54, -9, -2, 23, -6, -2, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1, 24,
+ };
+
+ if (len <= MAX_WORD_LENGTH && len >= MIN_WORD_LENGTH)
+ {
+ unsigned int key = hash (str, len);
+
+ if (key <= MAX_HASH_VALUE && key >= MIN_HASH_VALUE)
+ {
+ int slot = lookup[key];
+
+ if (slot >= 0 && slot < WORDLIST_SIZE)
+ {
+ const char *s = wordlist[slot].opname;
+
+ if (*str == *s && !strncmp (str + 1, s + 1, len - 1))
+ return &wordlist[slot];
+ }
+ else if (slot < 0 && slot >= -MAX_HASH_VALUE)
+ return 0;
+ else
+ {
+ unsigned int offset = key + slot + (slot > 0 ? -MAX_HASH_VALUE : MAX_HASH_VALUE);
+ const TAO_operation_db_entry *base = &wordlist[-lookup[offset]];
+ const TAO_operation_db_entry *ptr = base + -lookup[offset + 1];
+
+ while (--ptr >= base)
+ if (*str == *ptr->opname && !strncmp (str + 1, ptr->opname + 1, len - 1))
+ return ptr;
+ }
+ }
+ }
+ return 0;
+}
+
+static TAO_CORBA_ComponentIR_EventPortDef_Perfect_Hash_OpTable tao_CORBA_ComponentIR_EventPortDef_optable;
+
+// TAO_IDL - Generated from
+// be\be_visitor_interface/interface_ss.cpp:966
+
+TAO::Collocation_Proxy_Broker *
+CORBA_ComponentIR__TAO_EventPortDef_Proxy_Broker_Factory_function ( ::CORBA::Object_ptr)
+{
+ return reinterpret_cast<TAO::Collocation_Proxy_Broker *> (0xdead); // Dummy
+}
+
+int
+CORBA_ComponentIR__TAO_EventPortDef_Proxy_Broker_Factory_Initializer (size_t)
+{
+ CORBA_ComponentIR__TAO_EventPortDef_Proxy_Broker_Factory_function_pointer =
+ CORBA_ComponentIR__TAO_EventPortDef_Proxy_Broker_Factory_function;
+
+ return 0;
+}
+
+static int
+CORBA_ComponentIR__TAO_EventPortDef_Proxy_Broker_Stub_Factory_Initializer_Scarecrow =
+ CORBA_ComponentIR__TAO_EventPortDef_Proxy_Broker_Factory_Initializer (
+ reinterpret_cast<size_t> (CORBA_ComponentIR__TAO_EventPortDef_Proxy_Broker_Factory_Initializer)
+ );
+
+// TAO_IDL - Generated from
+// be\be_visitor_interface/interface_ss.cpp:103
+
+POA_CORBA::ComponentIR::EventPortDef::EventPortDef (void)
+ : TAO_ServantBase ()
+{
+ this->optable_ = &tao_CORBA_ComponentIR_EventPortDef_optable;
+}
+
+POA_CORBA::ComponentIR::EventPortDef::EventPortDef (const EventPortDef& rhs)
+ : TAO_Abstract_ServantBase (rhs),
+ TAO_ServantBase (rhs),
+ POA_CORBA::IRObject (rhs),
+ POA_CORBA::Contained (rhs)
+{
+}
+
+POA_CORBA::ComponentIR::EventPortDef::~EventPortDef (void)
+{
+}namespace POA_CORBA
+{
+ namespace ComponentIR
+ {
+
+
+ // TAO_IDL - Generated from
+ // be\be_visitor_operation/upcall_command_ss.cpp:127
+
+ class _get_event_EventPortDef
+ : public TAO::Upcall_Command
+ {
+ public:
+ inline _get_event_EventPortDef (
+ POA_CORBA::ComponentIR::EventPortDef * servant,
+ TAO_Operation_Details const * operation_details,
+ TAO::Argument * const args[])
+ : servant_ (servant)
+ , operation_details_ (operation_details)
+ , args_ (args)
+ {
+ }
+
+ virtual void execute (ACE_ENV_SINGLE_ARG_DECL)
+ {
+ TAO::SArg_Traits< ::CORBA::ComponentIR::EventDef>::ret_arg_type retval =
+ TAO::Portable_Server::get_ret_arg< ::CORBA::ComponentIR::EventDef> (
+ this->operation_details_,
+ this->args_);
+
+ retval =
+ this->servant_->event (
+ ACE_ENV_SINGLE_ARG_PARAMETER);
+ ACE_CHECK;
+ }
+
+ private:
+ POA_CORBA::ComponentIR::EventPortDef * const servant_;
+ TAO_Operation_Details const * const operation_details_;
+ TAO::Argument * const * const args_;
+ };
+ }
+
+}
+
+
+// TAO_IDL - Generated from
+// be\be_visitor_operation/operation_ss.cpp:190
+
+void POA_CORBA::ComponentIR::EventPortDef::_get_event_skel (
+ TAO_ServerRequest & server_request,
+ void * TAO_INTERCEPTOR (servant_upcall),
+ void * servant
+ ACE_ENV_ARG_DECL
+ )
+{
+#if TAO_HAS_INTERCEPTORS == 1
+ static ::CORBA::TypeCode_ptr const * const exceptions = 0;
+ static ::CORBA::ULong const nexceptions = 0;
+#endif /* TAO_HAS_INTERCEPTORS */
+
+ TAO::SArg_Traits< ::CORBA::ComponentIR::EventDef>::ret_val retval;
+
+ TAO::Argument * const args[] =
+ {
+ &retval
+ };
+
+ static size_t const nargs = 1;
+
+ POA_CORBA::ComponentIR::EventPortDef * const impl =
+ static_cast<POA_CORBA::ComponentIR::EventPortDef *> (servant);
+
+ _get_event_EventPortDef command (
+ impl,
+ server_request.operation_details (),
+ args);
+
+ TAO::Upcall_Wrapper upcall_wrapper;
+ upcall_wrapper.upcall (server_request
+ , args
+ , nargs
+ , command
+#if TAO_HAS_INTERCEPTORS == 1
+ , servant_upcall
+ , exceptions
+ , nexceptions
+#endif /* TAO_HAS_INTERCEPTORS == 1 */
+ ACE_ENV_ARG_PARAMETER);
+ ACE_CHECK;
+}namespace POA_CORBA
+{
+ namespace ComponentIR
+ {
+
+
+ // TAO_IDL - Generated from
+ // be\be_visitor_operation/upcall_command_ss.cpp:127
+
+ class _set_event_EventPortDef
+ : public TAO::Upcall_Command
+ {
+ public:
+ inline _set_event_EventPortDef (
+ POA_CORBA::ComponentIR::EventPortDef * servant,
+ TAO_Operation_Details const * operation_details,
+ TAO::Argument * const args[])
+ : servant_ (servant)
+ , operation_details_ (operation_details)
+ , args_ (args)
+ {
+ }
+
+ virtual void execute (ACE_ENV_SINGLE_ARG_DECL)
+ {
+ TAO::SArg_Traits< ::CORBA::ComponentIR::EventDef>::in_arg_type arg_1 =
+ TAO::Portable_Server::get_in_arg< ::CORBA::ComponentIR::EventDef> (
+ this->operation_details_,
+ this->args_,
+ 1);
+
+ this->servant_->event (
+ arg_1
+ ACE_ENV_ARG_PARAMETER);
+ ACE_CHECK;
+ }
+
+ private:
+ POA_CORBA::ComponentIR::EventPortDef * const servant_;
+ TAO_Operation_Details const * const operation_details_;
+ TAO::Argument * const * const args_;
+ };
+ }
+
+}
+
+
+// TAO_IDL - Generated from
+// be\be_visitor_operation/operation_ss.cpp:190
+
+void POA_CORBA::ComponentIR::EventPortDef::_set_event_skel (
+ TAO_ServerRequest & server_request,
+ void * TAO_INTERCEPTOR (servant_upcall),
+ void * servant
+ ACE_ENV_ARG_DECL
+ )
+{
+#if TAO_HAS_INTERCEPTORS == 1
+ static ::CORBA::TypeCode_ptr const * const exceptions = 0;
+ static ::CORBA::ULong const nexceptions = 0;
+#endif /* TAO_HAS_INTERCEPTORS */
+
+ TAO::SArg_Traits< void>::ret_val retval;
+ TAO::SArg_Traits< ::CORBA::ComponentIR::EventDef>::in_arg_val _tao_event;
+
+ TAO::Argument * const args[] =
+ {
+ &retval,
+ &_tao_event
+ };
+
+ static size_t const nargs = 2;
+
+ POA_CORBA::ComponentIR::EventPortDef * const impl =
+ static_cast<POA_CORBA::ComponentIR::EventPortDef *> (servant);
+
+ _set_event_EventPortDef command (
+ impl,
+ server_request.operation_details (),
+ args);
+
+ TAO::Upcall_Wrapper upcall_wrapper;
+ upcall_wrapper.upcall (server_request
+ , args
+ , nargs
+ , command
+#if TAO_HAS_INTERCEPTORS == 1
+ , servant_upcall
+ , exceptions
+ , nexceptions
+#endif /* TAO_HAS_INTERCEPTORS == 1 */
+ ACE_ENV_ARG_PARAMETER);
+ ACE_CHECK;
+}namespace POA_CORBA
+{
+ namespace ComponentIR
+ {
+
+
+ // TAO_IDL - Generated from
+ // be\be_visitor_operation/upcall_command_ss.cpp:127
+
+ class is_a_EventPortDef
+ : public TAO::Upcall_Command
+ {
+ public:
+ inline is_a_EventPortDef (
+ POA_CORBA::ComponentIR::EventPortDef * servant,
+ TAO_Operation_Details const * operation_details,
+ TAO::Argument * const args[])
+ : servant_ (servant)
+ , operation_details_ (operation_details)
+ , args_ (args)
+ {
+ }
+
+ virtual void execute (ACE_ENV_SINGLE_ARG_DECL)
+ {
+ TAO::SArg_Traits< ::ACE_InputCDR::to_boolean>::ret_arg_type retval =
+ TAO::Portable_Server::get_ret_arg< ::ACE_InputCDR::to_boolean> (
+ this->operation_details_,
+ this->args_);
+
+ TAO::SArg_Traits< ::CORBA::RepositoryId>::in_arg_type arg_1 =
+ TAO::Portable_Server::get_in_arg< ::CORBA::RepositoryId> (
+ this->operation_details_,
+ this->args_,
+ 1);
+
+ retval =
+ this->servant_->is_a (
+ arg_1
+ ACE_ENV_ARG_PARAMETER);
+ ACE_CHECK;
+ }
+
+ private:
+ POA_CORBA::ComponentIR::EventPortDef * const servant_;
+ TAO_Operation_Details const * const operation_details_;
+ TAO::Argument * const * const args_;
+ };
+ }
+
+}
+
+
+// TAO_IDL - Generated from
+// be\be_visitor_operation/operation_ss.cpp:190
+
+void POA_CORBA::ComponentIR::EventPortDef::is_a_skel (
+ TAO_ServerRequest & server_request,
+ void * TAO_INTERCEPTOR (servant_upcall),
+ void * servant
+ ACE_ENV_ARG_DECL
+ )
+{
+#if TAO_HAS_INTERCEPTORS == 1
+ static ::CORBA::TypeCode_ptr const * const exceptions = 0;
+ static ::CORBA::ULong const nexceptions = 0;
+#endif /* TAO_HAS_INTERCEPTORS */
+
+ TAO::SArg_Traits< ::ACE_InputCDR::to_boolean>::ret_val retval;
+ TAO::SArg_Traits< ::CORBA::RepositoryId>::in_arg_val _tao_event_id;
+
+ TAO::Argument * const args[] =
+ {
+ &retval,
+ &_tao_event_id
+ };
+
+ static size_t const nargs = 2;
+
+ POA_CORBA::ComponentIR::EventPortDef * const impl =
+ static_cast<POA_CORBA::ComponentIR::EventPortDef *> (servant);
+
+ is_a_EventPortDef command (
+ impl,
+ server_request.operation_details (),
+ args);
+
+ TAO::Upcall_Wrapper upcall_wrapper;
+ upcall_wrapper.upcall (server_request
+ , args
+ , nargs
+ , command
+#if TAO_HAS_INTERCEPTORS == 1
+ , servant_upcall
+ , exceptions
+ , nexceptions
+#endif /* TAO_HAS_INTERCEPTORS == 1 */
+ ACE_ENV_ARG_PARAMETER);
+ ACE_CHECK;
+}
+
+// TAO_IDL - Generated from
+// be\be_visitor_interface/interface_ss.cpp:169
+
+namespace POA_CORBA
+{
+ namespace ComponentIR
+ {
+
+
+ // TAO_IDL - Generated from
+ // be\be_visitor_operation/upcall_command_ss.cpp:127
+
+ class _is_a_EventPortDef_Upcall_Command
+ : public TAO::Upcall_Command
+ {
+ public:
+ inline _is_a_EventPortDef_Upcall_Command (
+ POA_CORBA::ComponentIR::EventPortDef * servant,
+ TAO_Operation_Details const * operation_details,
+ TAO::Argument * const args[])
+ : servant_ (servant)
+ , operation_details_ (operation_details)
+ , args_ (args)
+ {
+ }
+
+ virtual void execute (ACE_ENV_SINGLE_ARG_DECL)
+ {
+ TAO::SArg_Traits< ::ACE_InputCDR::to_boolean>::ret_arg_type retval =
+ TAO::Portable_Server::get_ret_arg< ::ACE_InputCDR::to_boolean> (
+ this->operation_details_,
+ this->args_);
+
+ TAO::SArg_Traits< ::CORBA::Char *>::in_arg_type arg_1 =
+ TAO::Portable_Server::get_in_arg< ::CORBA::Char *> (
+ this->operation_details_,
+ this->args_,
+ 1);
+
+ retval =
+ this->servant_-> _is_a (
+ arg_1
+ ACE_ENV_ARG_PARAMETER);
+ ACE_CHECK;
+ }
+
+ private:
+ POA_CORBA::ComponentIR::EventPortDef * const servant_;
+ TAO_Operation_Details const * const operation_details_;
+ TAO::Argument * const * const args_;
+ };
+ }
+
+}
+
+
+void POA_CORBA::ComponentIR::EventPortDef::_is_a_skel (
+ TAO_ServerRequest & server_request,
+ void * TAO_INTERCEPTOR (servant_upcall),
+ void * servant
+ ACE_ENV_ARG_DECL
+ )
+{
+#if TAO_HAS_INTERCEPTORS == 1
+ static ::CORBA::TypeCode_ptr const * const exceptions = 0;
+ static ::CORBA::ULong const nexceptions = 0;
+#endif /* TAO_HAS_INTERCEPTORS */
+
+ TAO::SArg_Traits< ::ACE_InputCDR::to_boolean>::ret_val retval;
+ TAO::SArg_Traits< ::CORBA::Char *>::in_arg_val _tao_repository_id;
+
+ TAO::Argument * const args[] =
+ {
+ &retval,
+ &_tao_repository_id
+ };
+
+ static size_t const nargs = 2;
+
+ POA_CORBA::ComponentIR::EventPortDef * const impl =
+ static_cast<POA_CORBA::ComponentIR::EventPortDef *> (servant);
+
+ _is_a_EventPortDef_Upcall_Command command (
+ impl,
+ server_request.operation_details (),
+ args);
+
+ TAO::Upcall_Wrapper upcall_wrapper;
+ upcall_wrapper.upcall (server_request
+ , args
+ , nargs
+ , command
+#if TAO_HAS_INTERCEPTORS == 1
+ , servant_upcall
+ , exceptions
+ , nexceptions
+#endif /* TAO_HAS_INTERCEPTORS == 1 */
+ ACE_ENV_ARG_PARAMETER);
+ ACE_CHECK;
+}namespace POA_CORBA
+{
+ namespace ComponentIR
+ {
+
+
+ // TAO_IDL - Generated from
+ // be\be_visitor_operation/upcall_command_ss.cpp:127
+
+ class _non_existent_EventPortDef_Upcall_Command
+ : public TAO::Upcall_Command
+ {
+ public:
+ inline _non_existent_EventPortDef_Upcall_Command (
+ POA_CORBA::ComponentIR::EventPortDef * servant,
+ TAO_Operation_Details const * operation_details,
+ TAO::Argument * const args[])
+ : servant_ (servant)
+ , operation_details_ (operation_details)
+ , args_ (args)
+ {
+ }
+
+ virtual void execute (ACE_ENV_SINGLE_ARG_DECL)
+ {
+ TAO::SArg_Traits< ::ACE_InputCDR::to_boolean>::ret_arg_type retval =
+ TAO::Portable_Server::get_ret_arg< ::ACE_InputCDR::to_boolean> (
+ this->operation_details_,
+ this->args_);
+
+ retval =
+ this->servant_-> _non_existent (
+ ACE_ENV_SINGLE_ARG_PARAMETER);
+ ACE_CHECK;
+ }
+
+ private:
+ POA_CORBA::ComponentIR::EventPortDef * const servant_;
+ TAO_Operation_Details const * const operation_details_;
+ TAO::Argument * const * const args_;
+ };
+ }
+
+}
+
+
+void POA_CORBA::ComponentIR::EventPortDef::_non_existent_skel (
+ TAO_ServerRequest & server_request,
+ void * TAO_INTERCEPTOR (servant_upcall),
+ void * servant
+ ACE_ENV_ARG_DECL
+ )
+{
+#if TAO_HAS_INTERCEPTORS == 1
+ static ::CORBA::TypeCode_ptr const * const exceptions = 0;
+ static ::CORBA::ULong const nexceptions = 0;
+#endif /* TAO_HAS_INTERCEPTORS */
+
+ TAO::SArg_Traits< ::ACE_InputCDR::to_boolean>::ret_val retval;
+
+ TAO::Argument * const args[] =
+ {
+ &retval
+ };
+
+ static size_t const nargs = 1;
+
+ POA_CORBA::ComponentIR::EventPortDef * const impl =
+ static_cast<POA_CORBA::ComponentIR::EventPortDef *> (servant);
+
+ _non_existent_EventPortDef_Upcall_Command command (
+ impl,
+ server_request.operation_details (),
+ args);
+
+ TAO::Upcall_Wrapper upcall_wrapper;
+ upcall_wrapper.upcall (server_request
+ , args
+ , nargs
+ , command
+#if TAO_HAS_INTERCEPTORS == 1
+ , servant_upcall
+ , exceptions
+ , nexceptions
+#endif /* TAO_HAS_INTERCEPTORS == 1 */
+ ACE_ENV_ARG_PARAMETER);
+ ACE_CHECK;
+}namespace POA_CORBA
+{
+ namespace ComponentIR
+ {
+
+
+ // TAO_IDL - Generated from
+ // be\be_visitor_operation/upcall_command_ss.cpp:127
+
+ class _repository_id_EventPortDef_Upcall_Command
+ : public TAO::Upcall_Command
+ {
+ public:
+ inline _repository_id_EventPortDef_Upcall_Command (
+ POA_CORBA::ComponentIR::EventPortDef * servant,
+ TAO_Operation_Details const * operation_details,
+ TAO::Argument * const args[])
+ : servant_ (servant)
+ , operation_details_ (operation_details)
+ , args_ (args)
+ {
+ }
+
+ virtual void execute (ACE_ENV_SINGLE_ARG_DECL)
+ {
+ TAO::SArg_Traits< ::CORBA::Char *>::ret_arg_type retval =
+ TAO::Portable_Server::get_ret_arg< ::CORBA::Char *> (
+ this->operation_details_,
+ this->args_);
+
+ retval =
+ this->servant_-> _repository_id (
+ ACE_ENV_SINGLE_ARG_PARAMETER);
+ ACE_CHECK;
+ }
+
+ private:
+ POA_CORBA::ComponentIR::EventPortDef * const servant_;
+ TAO_Operation_Details const * const operation_details_;
+ TAO::Argument * const * const args_;
+ };
+ }
+
+}
+
+
+void POA_CORBA::ComponentIR::EventPortDef::_repository_id_skel (
+ TAO_ServerRequest & server_request,
+ void * TAO_INTERCEPTOR (servant_upcall),
+ void * servant
+ ACE_ENV_ARG_DECL
+ )
+{
+#if TAO_HAS_INTERCEPTORS == 1
+ static ::CORBA::TypeCode_ptr const * const exceptions = 0;
+ static ::CORBA::ULong const nexceptions = 0;
+#endif /* TAO_HAS_INTERCEPTORS */
+
+ TAO::SArg_Traits< ::CORBA::Char *>::ret_val retval;
+
+ TAO::Argument * const args[] =
+ {
+ &retval
+ };
+
+ static size_t const nargs = 1;
+
+ POA_CORBA::ComponentIR::EventPortDef * const impl =
+ static_cast<POA_CORBA::ComponentIR::EventPortDef *> (servant);
+
+ _repository_id_EventPortDef_Upcall_Command command (
+ impl,
+ server_request.operation_details (),
+ args);
+
+ TAO::Upcall_Wrapper upcall_wrapper;
+ upcall_wrapper.upcall (server_request
+ , args
+ , nargs
+ , command
+#if TAO_HAS_INTERCEPTORS == 1
+ , servant_upcall
+ , exceptions
+ , nexceptions
+#endif /* TAO_HAS_INTERCEPTORS == 1 */
+ ACE_ENV_ARG_PARAMETER);
+ ACE_CHECK;
+}
+
+// TAO_IDL - Generated from
+// be\be_visitor_interface/interface_ss.cpp:513
+
+void POA_CORBA::ComponentIR::EventPortDef::_interface_skel (
+ TAO_ServerRequest & server_request,
+ void * /* servant_upcall */,
+ void * servant
+ ACE_ENV_ARG_DECL
+ )
+{
+ TAO_IFR_Client_Adapter *_tao_adapter =
+ ACE_Dynamic_Service<TAO_IFR_Client_Adapter>::instance (
+ TAO_ORB_Core::ifr_client_adapter_name ()
+ );
+
+ if (_tao_adapter == 0)
+ {
+ ACE_THROW ( ::CORBA::INTF_REPOS ( ::CORBA::OMGVMCID | 1,
+ ::CORBA::COMPLETED_NO));
+ }
+
+ POA_CORBA::ComponentIR::EventPortDef * const impl =
+ static_cast<POA_CORBA::ComponentIR::EventPortDef *> (servant);
+ ::CORBA::InterfaceDef_ptr _tao_retval =
+ impl->_get_interface (ACE_ENV_SINGLE_ARG_PARAMETER);
+ ACE_CHECK;
+
+ server_request.init_reply ();
+ TAO_OutputCDR &_tao_out = *server_request.outgoing ();
+
+ ::CORBA::Boolean const _tao_result =
+ _tao_adapter->interfacedef_cdr_insert (
+ _tao_out,
+ _tao_retval
+ );
+
+ _tao_adapter->dispose (_tao_retval);
+
+ if (_tao_result == false)
+ {
+ ACE_THROW ( ::CORBA::MARSHAL ());
+ }
+}namespace POA_CORBA
+{
+ namespace ComponentIR
+ {
+
+
+ // TAO_IDL - Generated from
+ // be\be_visitor_operation/upcall_command_ss.cpp:127
+
+ class _get_component_EventPortDef_Upcall_Command
+ : public TAO::Upcall_Command
+ {
+ public:
+ inline _get_component_EventPortDef_Upcall_Command (
+ POA_CORBA::ComponentIR::EventPortDef * servant,
+ TAO_Operation_Details const * operation_details,
+ TAO::Argument * const args[])
+ : servant_ (servant)
+ , operation_details_ (operation_details)
+ , args_ (args)
+ {
+ }
+
+ virtual void execute (ACE_ENV_SINGLE_ARG_DECL)
+ {
+ TAO::SArg_Traits< ::CORBA::Object>::ret_arg_type retval =
+ TAO::Portable_Server::get_ret_arg< ::CORBA::Object> (
+ this->operation_details_,
+ this->args_);
+
+ retval =
+ this->servant_-> _get_component (
+ ACE_ENV_SINGLE_ARG_PARAMETER);
+ ACE_CHECK;
+ }
+
+ private:
+ POA_CORBA::ComponentIR::EventPortDef * const servant_;
+ TAO_Operation_Details const * const operation_details_;
+ TAO::Argument * const * const args_;
+ };
+ }
+
+}
+
+
+void POA_CORBA::ComponentIR::EventPortDef::_component_skel (
+ TAO_ServerRequest & server_request,
+ void * TAO_INTERCEPTOR (servant_upcall),
+ void * servant
+ ACE_ENV_ARG_DECL
+ )
+{
+#if TAO_HAS_INTERCEPTORS == 1
+ static ::CORBA::TypeCode_ptr const * const exceptions = 0;
+ static ::CORBA::ULong const nexceptions = 0;
+#endif /* TAO_HAS_INTERCEPTORS */
+
+ TAO::SArg_Traits< ::CORBA::Object>::ret_val retval;
+
+ TAO::Argument * const args[] =
+ {
+ &retval
+ };
+
+ static size_t const nargs = 1;
+
+ POA_CORBA::ComponentIR::EventPortDef * const impl =
+ static_cast<POA_CORBA::ComponentIR::EventPortDef *> (servant);
+
+ _get_component_EventPortDef_Upcall_Command command (
+ impl,
+ server_request.operation_details (),
+ args);
+
+ TAO::Upcall_Wrapper upcall_wrapper;
+ upcall_wrapper.upcall (server_request
+ , args
+ , nargs
+ , command
+#if TAO_HAS_INTERCEPTORS == 1
+ , servant_upcall
+ , exceptions
+ , nexceptions
+#endif /* TAO_HAS_INTERCEPTORS == 1 */
+ ACE_ENV_ARG_PARAMETER);
+ ACE_CHECK;
+}
+
+::CORBA::Boolean POA_CORBA::ComponentIR::EventPortDef::_is_a (
+ const char* value
+ ACE_ENV_ARG_DECL_NOT_USED
+ )
+{
+ return
+ (
+ !ACE_OS::strcmp (
+ value,
+ "IDL:omg.org/CORBA/IRObject:1.0"
+ ) ||
+ !ACE_OS::strcmp (
+ value,
+ "IDL:omg.org/CORBA/Contained:1.0"
+ ) ||
+ !ACE_OS::strcmp (
+ value,
+ "IDL:omg.org/CORBA/ComponentIR/EventPortDef:1.0"
+ ) ||
+ !ACE_OS::strcmp (
+ value,
+ "IDL:omg.org/CORBA/Object:1.0"
+ )
+ );
+}
+
+const char* POA_CORBA::ComponentIR::EventPortDef::_interface_repository_id (void) const
+{
+ return "IDL:omg.org/CORBA/ComponentIR/EventPortDef:1.0";
+}
+
+// TAO_IDL - Generated from
+// be\be_visitor_interface/interface_ss.cpp:903
+
+void POA_CORBA::ComponentIR::EventPortDef::_dispatch (
+ TAO_ServerRequest & req,
+ void * servant_upcall
+ ACE_ENV_ARG_DECL
+ )
+{
+ this->synchronous_upcall_dispatch (req,
+ servant_upcall,
+ this
+ ACE_ENV_ARG_PARAMETER);
+}
+
+// TAO_IDL - Generated from
+// be\be_visitor_interface/interface_ss.cpp:851
+
+CORBA::ComponentIR::EventPortDef *
+POA_CORBA::ComponentIR::EventPortDef::_this (ACE_ENV_SINGLE_ARG_DECL)
+{
+ TAO_Stub *stub = this->_create_stub (ACE_ENV_SINGLE_ARG_PARAMETER);
+ ACE_CHECK_RETURN (0);
+
+ TAO_Stub_Auto_Ptr safe_stub (stub);
+ ::CORBA::Object_ptr tmp = CORBA::Object::_nil ();
+
+ ::CORBA::Boolean const _tao_opt_colloc =
+ stub->servant_orb_var ()->orb_core ()->optimize_collocation_objects ();
+
+ ACE_NEW_RETURN (
+ tmp,
+ ::CORBA::Object (stub, _tao_opt_colloc, this),
+ 0
+ );
+
+ ::CORBA::Object_var obj = tmp;
+ (void) safe_stub.release ();
+
+ typedef ::CORBA::ComponentIR::EventPortDef STUB_SCOPED_NAME;
+ return
+ TAO::Narrow_Utils<STUB_SCOPED_NAME>::unchecked_narrow (
+ obj.in (),
+ CORBA_ComponentIR__TAO_EventPortDef_Proxy_Broker_Factory_function_pointer
+ );
+}
+
+// TAO_IDL - Generated from
+// be\be_interface.cpp:1499
+
+class TAO_CORBA_ComponentIR_EmitsDef_Perfect_Hash_OpTable
+ : public TAO_Perfect_Hash_OpTable
+{
+private:
+ unsigned int hash (const char *str, unsigned int len);
+
+public:
+ const TAO_operation_db_entry * lookup (const char *str, unsigned int len);
+};
+
+/* C++ code produced by gperf version 2.8 (ACE version) */
+/* Command-line: C:\ACE\latest\ACE_wrappers\bin\gperf.exe -m -M -J -c -C -D -E -T -f 0 -F 0,0 -a -o -t -p -K opname -L C++ -Z TAO_CORBA_ComponentIR_EmitsDef_Perfect_Hash_OpTable -N lookup */
+unsigned int
+TAO_CORBA_ComponentIR_EmitsDef_Perfect_Hash_OpTable::hash (const char *str, unsigned int len)
+{
+ static const unsigned char asso_values[] =
+ {
+#if defined (ACE_MVS)
+ 37, 37, 37, 37, 37, 37, 37, 37, 37, 37,
+ 37, 37, 37, 37, 37, 37, 37, 37, 37, 37,
+ 37, 37, 37, 37, 37, 37, 37, 37, 37, 37,
+ 37, 37, 37, 37, 37, 37, 37, 37, 37, 37,
+ 37, 37, 37, 37, 37, 37, 37, 37, 37, 37,
+ 37, 37, 37, 37, 37, 37, 37, 37, 37, 37,
+ 37, 37, 37, 37, 37, 37, 37, 37, 37, 37,
+ 37, 37, 37, 37, 37, 37, 37, 37, 37, 37,
+ 37, 37, 37, 37, 37, 37, 37, 37, 37, 37,
+ 37, 37, 37, 37, 37, 37, 37, 37, 37, 37,
+ 37, 37, 37, 37, 37, 37, 37, 37, 37, 0,
+ 37, 37, 37, 37, 37, 37, 37, 37, 37, 37,
+ 37, 37, 37, 37, 37, 37, 37, 37, 37, 0,
+ 37, 37, 0, 0, 37, 37, 37, 15, 37, 37,
+ 37, 37, 37, 37, 37, 37, 37, 37, 0, 0,
+ 37, 37, 37, 37, 37, 37, 37, 37, 37, 37,
+ 37, 37, 37, 10, 37, 37, 37, 37, 10, 37,
+ 37, 37, 37, 37, 37, 37, 37, 37, 37, 37,
+ 37, 37, 37, 37, 37, 37, 37, 37, 37, 37,
+ 37, 37, 37, 37, 37, 37, 37, 37, 37, 37,
+ 37, 37, 37, 37, 37, 37, 37, 37, 37, 37,
+ 37, 37, 37, 37, 37, 37, 37, 37, 37, 37,
+ 37, 37, 37, 37, 37, 37, 37, 37, 37, 37,
+ 37, 37, 37, 37, 37, 37, 37, 37, 37, 37,
+ 37, 37, 37, 37, 37, 37, 37, 37, 37, 37,
+ 37, 37, 37, 37, 37, 37,
+#else
+ 37, 37, 37, 37, 37, 37, 37, 37, 37, 37,
+ 37, 37, 37, 37, 37, 37, 37, 37, 37, 37,
+ 37, 37, 37, 37, 37, 37, 37, 37, 37, 37,
+ 37, 37, 37, 37, 37, 37, 37, 37, 37, 37,
+ 37, 37, 37, 37, 37, 37, 37, 37, 37, 37,
+ 37, 37, 37, 37, 37, 37, 37, 37, 37, 37,
+ 37, 37, 37, 37, 37, 37, 37, 37, 37, 37,
+ 37, 37, 37, 37, 37, 37, 37, 37, 37, 37,
+ 37, 37, 37, 37, 37, 37, 37, 37, 37, 37,
+ 37, 37, 37, 37, 37, 0, 37, 0, 37, 37,
+ 0, 0, 37, 37, 37, 15, 37, 37, 37, 0,
+ 0, 37, 37, 37, 37, 37, 10, 37, 37, 37,
+ 37, 10, 37, 37, 37, 37, 37, 37,
+#endif /* ACE_MVS */
+ };
+ return len + asso_values[(int) str[len - 1]] + asso_values[(int) str[0]];
+}
+
+const TAO_operation_db_entry *
+TAO_CORBA_ComponentIR_EmitsDef_Perfect_Hash_OpTable::lookup (const char *str, unsigned int len)
+{
+ enum
+ {
+ TOTAL_KEYWORDS = 21,
+ MIN_WORD_LENGTH = 4,
+ MAX_WORD_LENGTH = 26,
+ MIN_HASH_VALUE = 4,
+ MAX_HASH_VALUE = 36,
+ HASH_VALUE_RANGE = 33,
+ DUPLICATES = 6,
+ WORDLIST_SIZE = 25
+ };
+
+ static const TAO_operation_db_entry wordlist[] =
+ {
+ {"",0,0},{"",0,0},{"",0,0},{"",0,0},
+ {"move", &POA_CORBA::ComponentIR::EmitsDef::move_skel, 0},
+ {"_is_a", &POA_CORBA::ComponentIR::EmitsDef::_is_a_skel, 0},
+ {"_get_id", &POA_CORBA::ComponentIR::EmitsDef::_get_id_skel, 0},
+ {"_set_id", &POA_CORBA::ComponentIR::EmitsDef::_set_id_skel, 0},
+ {"describe", &POA_CORBA::ComponentIR::EmitsDef::describe_skel, 0},
+ {"_get_name", &POA_CORBA::ComponentIR::EmitsDef::_get_name_skel, 0},
+ {"_set_name", &POA_CORBA::ComponentIR::EmitsDef::_set_name_skel, 0},
+ {"_interface", &POA_CORBA::ComponentIR::EmitsDef::_interface_skel, 0},
+ {"_get_version", &POA_CORBA::ComponentIR::EmitsDef::_get_version_skel, 0},
+ {"_set_version", &POA_CORBA::ComponentIR::EmitsDef::_set_version_skel, 0},
+ {"_get_def_kind", &POA_CORBA::ComponentIR::EmitsDef::_get_def_kind_skel, 0},
+ {"_repository_id", &POA_CORBA::ComponentIR::EmitsDef::_repository_id_skel, 0},
+ {"_get_defined_in", &POA_CORBA::ComponentIR::EmitsDef::_get_defined_in_skel, 0},
+ {"destroy", &POA_CORBA::ComponentIR::EmitsDef::destroy_skel, 0},
+ {"_get_absolute_name", &POA_CORBA::ComponentIR::EmitsDef::_get_absolute_name_skel, 0},
+ {"is_a", &POA_CORBA::ComponentIR::EmitsDef::is_a_skel, 0},
+ {"_get_event", &POA_CORBA::ComponentIR::EmitsDef::_get_event_skel, 0},
+ {"_component", &POA_CORBA::ComponentIR::EmitsDef::_component_skel, 0},
+ {"_set_event", &POA_CORBA::ComponentIR::EmitsDef::_set_event_skel, 0},
+ {"_non_existent", &POA_CORBA::ComponentIR::EmitsDef::_non_existent_skel, 0},
+ {"_get_containing_repository", &POA_CORBA::ComponentIR::EmitsDef::_get_containing_repository_skel, 0},
+ };
+
+ static const signed char lookup[] =
+ {
+ -12, -2, -20, -3, 4, 5, -1, 53, 8, 48, 11, -1, -48, 14,
+ 15, 16, -1, 17, 18, 19, -54, -9, -2, 23, -6, -2, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1, 24,
+ };
+
+ if (len <= MAX_WORD_LENGTH && len >= MIN_WORD_LENGTH)
+ {
+ unsigned int key = hash (str, len);
+
+ if (key <= MAX_HASH_VALUE && key >= MIN_HASH_VALUE)
+ {
+ int slot = lookup[key];
+
+ if (slot >= 0 && slot < WORDLIST_SIZE)
+ {
+ const char *s = wordlist[slot].opname;
+
+ if (*str == *s && !strncmp (str + 1, s + 1, len - 1))
+ return &wordlist[slot];
+ }
+ else if (slot < 0 && slot >= -MAX_HASH_VALUE)
+ return 0;
+ else
+ {
+ unsigned int offset = key + slot + (slot > 0 ? -MAX_HASH_VALUE : MAX_HASH_VALUE);
+ const TAO_operation_db_entry *base = &wordlist[-lookup[offset]];
+ const TAO_operation_db_entry *ptr = base + -lookup[offset + 1];
+
+ while (--ptr >= base)
+ if (*str == *ptr->opname && !strncmp (str + 1, ptr->opname + 1, len - 1))
+ return ptr;
+ }
+ }
+ }
+ return 0;
+}
+
+static TAO_CORBA_ComponentIR_EmitsDef_Perfect_Hash_OpTable tao_CORBA_ComponentIR_EmitsDef_optable;
+
+// TAO_IDL - Generated from
+// be\be_visitor_interface/interface_ss.cpp:966
+
+TAO::Collocation_Proxy_Broker *
+CORBA_ComponentIR__TAO_EmitsDef_Proxy_Broker_Factory_function ( ::CORBA::Object_ptr)
+{
+ return reinterpret_cast<TAO::Collocation_Proxy_Broker *> (0xdead); // Dummy
+}
+
+int
+CORBA_ComponentIR__TAO_EmitsDef_Proxy_Broker_Factory_Initializer (size_t)
+{
+ CORBA_ComponentIR__TAO_EmitsDef_Proxy_Broker_Factory_function_pointer =
+ CORBA_ComponentIR__TAO_EmitsDef_Proxy_Broker_Factory_function;
+
+ return 0;
+}
+
+static int
+CORBA_ComponentIR__TAO_EmitsDef_Proxy_Broker_Stub_Factory_Initializer_Scarecrow =
+ CORBA_ComponentIR__TAO_EmitsDef_Proxy_Broker_Factory_Initializer (
+ reinterpret_cast<size_t> (CORBA_ComponentIR__TAO_EmitsDef_Proxy_Broker_Factory_Initializer)
+ );
+
+// TAO_IDL - Generated from
+// be\be_visitor_interface/interface_ss.cpp:103
+
+POA_CORBA::ComponentIR::EmitsDef::EmitsDef (void)
+ : TAO_ServantBase ()
+{
+ this->optable_ = &tao_CORBA_ComponentIR_EmitsDef_optable;
+}
+
+POA_CORBA::ComponentIR::EmitsDef::EmitsDef (const EmitsDef& rhs)
+ : TAO_Abstract_ServantBase (rhs),
+ TAO_ServantBase (rhs),
+ POA_CORBA::IRObject (rhs),
+ POA_CORBA::Contained (rhs),
+ POA_CORBA::ComponentIR::EventPortDef (rhs)
+{
+}
+
+POA_CORBA::ComponentIR::EmitsDef::~EmitsDef (void)
+{
+}
+
+// TAO_IDL - Generated from
+// be\be_visitor_interface/interface_ss.cpp:169
+
+namespace POA_CORBA
+{
+ namespace ComponentIR
+ {
+
+
+ // TAO_IDL - Generated from
+ // be\be_visitor_operation/upcall_command_ss.cpp:127
+
+ class _is_a_EmitsDef_Upcall_Command
+ : public TAO::Upcall_Command
+ {
+ public:
+ inline _is_a_EmitsDef_Upcall_Command (
+ POA_CORBA::ComponentIR::EmitsDef * servant,
+ TAO_Operation_Details const * operation_details,
+ TAO::Argument * const args[])
+ : servant_ (servant)
+ , operation_details_ (operation_details)
+ , args_ (args)
+ {
+ }
+
+ virtual void execute (ACE_ENV_SINGLE_ARG_DECL)
+ {
+ TAO::SArg_Traits< ::ACE_InputCDR::to_boolean>::ret_arg_type retval =
+ TAO::Portable_Server::get_ret_arg< ::ACE_InputCDR::to_boolean> (
+ this->operation_details_,
+ this->args_);
+
+ TAO::SArg_Traits< ::CORBA::Char *>::in_arg_type arg_1 =
+ TAO::Portable_Server::get_in_arg< ::CORBA::Char *> (
+ this->operation_details_,
+ this->args_,
+ 1);
+
+ retval =
+ this->servant_-> _is_a (
+ arg_1
+ ACE_ENV_ARG_PARAMETER);
+ ACE_CHECK;
+ }
+
+ private:
+ POA_CORBA::ComponentIR::EmitsDef * const servant_;
+ TAO_Operation_Details const * const operation_details_;
+ TAO::Argument * const * const args_;
+ };
+ }
+
+}
+
+
+void POA_CORBA::ComponentIR::EmitsDef::_is_a_skel (
+ TAO_ServerRequest & server_request,
+ void * TAO_INTERCEPTOR (servant_upcall),
+ void * servant
+ ACE_ENV_ARG_DECL
+ )
+{
+#if TAO_HAS_INTERCEPTORS == 1
+ static ::CORBA::TypeCode_ptr const * const exceptions = 0;
+ static ::CORBA::ULong const nexceptions = 0;
+#endif /* TAO_HAS_INTERCEPTORS */
+
+ TAO::SArg_Traits< ::ACE_InputCDR::to_boolean>::ret_val retval;
+ TAO::SArg_Traits< ::CORBA::Char *>::in_arg_val _tao_repository_id;
+
+ TAO::Argument * const args[] =
+ {
+ &retval,
+ &_tao_repository_id
+ };
+
+ static size_t const nargs = 2;
+
+ POA_CORBA::ComponentIR::EmitsDef * const impl =
+ static_cast<POA_CORBA::ComponentIR::EmitsDef *> (servant);
+
+ _is_a_EmitsDef_Upcall_Command command (
+ impl,
+ server_request.operation_details (),
+ args);
+
+ TAO::Upcall_Wrapper upcall_wrapper;
+ upcall_wrapper.upcall (server_request
+ , args
+ , nargs
+ , command
+#if TAO_HAS_INTERCEPTORS == 1
+ , servant_upcall
+ , exceptions
+ , nexceptions
+#endif /* TAO_HAS_INTERCEPTORS == 1 */
+ ACE_ENV_ARG_PARAMETER);
+ ACE_CHECK;
+}namespace POA_CORBA
+{
+ namespace ComponentIR
+ {
+
+
+ // TAO_IDL - Generated from
+ // be\be_visitor_operation/upcall_command_ss.cpp:127
+
+ class _non_existent_EmitsDef_Upcall_Command
+ : public TAO::Upcall_Command
+ {
+ public:
+ inline _non_existent_EmitsDef_Upcall_Command (
+ POA_CORBA::ComponentIR::EmitsDef * servant,
+ TAO_Operation_Details const * operation_details,
+ TAO::Argument * const args[])
+ : servant_ (servant)
+ , operation_details_ (operation_details)
+ , args_ (args)
+ {
+ }
+
+ virtual void execute (ACE_ENV_SINGLE_ARG_DECL)
+ {
+ TAO::SArg_Traits< ::ACE_InputCDR::to_boolean>::ret_arg_type retval =
+ TAO::Portable_Server::get_ret_arg< ::ACE_InputCDR::to_boolean> (
+ this->operation_details_,
+ this->args_);
+
+ retval =
+ this->servant_-> _non_existent (
+ ACE_ENV_SINGLE_ARG_PARAMETER);
+ ACE_CHECK;
+ }
+
+ private:
+ POA_CORBA::ComponentIR::EmitsDef * const servant_;
+ TAO_Operation_Details const * const operation_details_;
+ TAO::Argument * const * const args_;
+ };
+ }
+
+}
+
+
+void POA_CORBA::ComponentIR::EmitsDef::_non_existent_skel (
+ TAO_ServerRequest & server_request,
+ void * TAO_INTERCEPTOR (servant_upcall),
+ void * servant
+ ACE_ENV_ARG_DECL
+ )
+{
+#if TAO_HAS_INTERCEPTORS == 1
+ static ::CORBA::TypeCode_ptr const * const exceptions = 0;
+ static ::CORBA::ULong const nexceptions = 0;
+#endif /* TAO_HAS_INTERCEPTORS */
+
+ TAO::SArg_Traits< ::ACE_InputCDR::to_boolean>::ret_val retval;
+
+ TAO::Argument * const args[] =
+ {
+ &retval
+ };
+
+ static size_t const nargs = 1;
+
+ POA_CORBA::ComponentIR::EmitsDef * const impl =
+ static_cast<POA_CORBA::ComponentIR::EmitsDef *> (servant);
+
+ _non_existent_EmitsDef_Upcall_Command command (
+ impl,
+ server_request.operation_details (),
+ args);
+
+ TAO::Upcall_Wrapper upcall_wrapper;
+ upcall_wrapper.upcall (server_request
+ , args
+ , nargs
+ , command
+#if TAO_HAS_INTERCEPTORS == 1
+ , servant_upcall
+ , exceptions
+ , nexceptions
+#endif /* TAO_HAS_INTERCEPTORS == 1 */
+ ACE_ENV_ARG_PARAMETER);
+ ACE_CHECK;
+}namespace POA_CORBA
+{
+ namespace ComponentIR
+ {
+
+
+ // TAO_IDL - Generated from
+ // be\be_visitor_operation/upcall_command_ss.cpp:127
+
+ class _repository_id_EmitsDef_Upcall_Command
+ : public TAO::Upcall_Command
+ {
+ public:
+ inline _repository_id_EmitsDef_Upcall_Command (
+ POA_CORBA::ComponentIR::EmitsDef * servant,
+ TAO_Operation_Details const * operation_details,
+ TAO::Argument * const args[])
+ : servant_ (servant)
+ , operation_details_ (operation_details)
+ , args_ (args)
+ {
+ }
+
+ virtual void execute (ACE_ENV_SINGLE_ARG_DECL)
+ {
+ TAO::SArg_Traits< ::CORBA::Char *>::ret_arg_type retval =
+ TAO::Portable_Server::get_ret_arg< ::CORBA::Char *> (
+ this->operation_details_,
+ this->args_);
+
+ retval =
+ this->servant_-> _repository_id (
+ ACE_ENV_SINGLE_ARG_PARAMETER);
+ ACE_CHECK;
+ }
+
+ private:
+ POA_CORBA::ComponentIR::EmitsDef * const servant_;
+ TAO_Operation_Details const * const operation_details_;
+ TAO::Argument * const * const args_;
+ };
+ }
+
+}
+
+
+void POA_CORBA::ComponentIR::EmitsDef::_repository_id_skel (
+ TAO_ServerRequest & server_request,
+ void * TAO_INTERCEPTOR (servant_upcall),
+ void * servant
+ ACE_ENV_ARG_DECL
+ )
+{
+#if TAO_HAS_INTERCEPTORS == 1
+ static ::CORBA::TypeCode_ptr const * const exceptions = 0;
+ static ::CORBA::ULong const nexceptions = 0;
+#endif /* TAO_HAS_INTERCEPTORS */
+
+ TAO::SArg_Traits< ::CORBA::Char *>::ret_val retval;
+
+ TAO::Argument * const args[] =
+ {
+ &retval
+ };
+
+ static size_t const nargs = 1;
+
+ POA_CORBA::ComponentIR::EmitsDef * const impl =
+ static_cast<POA_CORBA::ComponentIR::EmitsDef *> (servant);
+
+ _repository_id_EmitsDef_Upcall_Command command (
+ impl,
+ server_request.operation_details (),
+ args);
+
+ TAO::Upcall_Wrapper upcall_wrapper;
+ upcall_wrapper.upcall (server_request
+ , args
+ , nargs
+ , command
+#if TAO_HAS_INTERCEPTORS == 1
+ , servant_upcall
+ , exceptions
+ , nexceptions
+#endif /* TAO_HAS_INTERCEPTORS == 1 */
+ ACE_ENV_ARG_PARAMETER);
+ ACE_CHECK;
+}
+
+// TAO_IDL - Generated from
+// be\be_visitor_interface/interface_ss.cpp:513
+
+void POA_CORBA::ComponentIR::EmitsDef::_interface_skel (
+ TAO_ServerRequest & server_request,
+ void * /* servant_upcall */,
+ void * servant
+ ACE_ENV_ARG_DECL
+ )
+{
+ TAO_IFR_Client_Adapter *_tao_adapter =
+ ACE_Dynamic_Service<TAO_IFR_Client_Adapter>::instance (
+ TAO_ORB_Core::ifr_client_adapter_name ()
+ );
+
+ if (_tao_adapter == 0)
+ {
+ ACE_THROW ( ::CORBA::INTF_REPOS ( ::CORBA::OMGVMCID | 1,
+ ::CORBA::COMPLETED_NO));
+ }
+
+ POA_CORBA::ComponentIR::EmitsDef * const impl =
+ static_cast<POA_CORBA::ComponentIR::EmitsDef *> (servant);
+ ::CORBA::InterfaceDef_ptr _tao_retval =
+ impl->_get_interface (ACE_ENV_SINGLE_ARG_PARAMETER);
+ ACE_CHECK;
+
+ server_request.init_reply ();
+ TAO_OutputCDR &_tao_out = *server_request.outgoing ();
+
+ ::CORBA::Boolean const _tao_result =
+ _tao_adapter->interfacedef_cdr_insert (
+ _tao_out,
+ _tao_retval
+ );
+
+ _tao_adapter->dispose (_tao_retval);
+
+ if (_tao_result == false)
+ {
+ ACE_THROW ( ::CORBA::MARSHAL ());
+ }
+}namespace POA_CORBA
+{
+ namespace ComponentIR
+ {
+
+
+ // TAO_IDL - Generated from
+ // be\be_visitor_operation/upcall_command_ss.cpp:127
+
+ class _get_component_EmitsDef_Upcall_Command
+ : public TAO::Upcall_Command
+ {
+ public:
+ inline _get_component_EmitsDef_Upcall_Command (
+ POA_CORBA::ComponentIR::EmitsDef * servant,
+ TAO_Operation_Details const * operation_details,
+ TAO::Argument * const args[])
+ : servant_ (servant)
+ , operation_details_ (operation_details)
+ , args_ (args)
+ {
+ }
+
+ virtual void execute (ACE_ENV_SINGLE_ARG_DECL)
+ {
+ TAO::SArg_Traits< ::CORBA::Object>::ret_arg_type retval =
+ TAO::Portable_Server::get_ret_arg< ::CORBA::Object> (
+ this->operation_details_,
+ this->args_);
+
+ retval =
+ this->servant_-> _get_component (
+ ACE_ENV_SINGLE_ARG_PARAMETER);
+ ACE_CHECK;
+ }
+
+ private:
+ POA_CORBA::ComponentIR::EmitsDef * const servant_;
+ TAO_Operation_Details const * const operation_details_;
+ TAO::Argument * const * const args_;
+ };
+ }
+
+}
+
+
+void POA_CORBA::ComponentIR::EmitsDef::_component_skel (
+ TAO_ServerRequest & server_request,
+ void * TAO_INTERCEPTOR (servant_upcall),
+ void * servant
+ ACE_ENV_ARG_DECL
+ )
+{
+#if TAO_HAS_INTERCEPTORS == 1
+ static ::CORBA::TypeCode_ptr const * const exceptions = 0;
+ static ::CORBA::ULong const nexceptions = 0;
+#endif /* TAO_HAS_INTERCEPTORS */
+
+ TAO::SArg_Traits< ::CORBA::Object>::ret_val retval;
+
+ TAO::Argument * const args[] =
+ {
+ &retval
+ };
+
+ static size_t const nargs = 1;
+
+ POA_CORBA::ComponentIR::EmitsDef * const impl =
+ static_cast<POA_CORBA::ComponentIR::EmitsDef *> (servant);
+
+ _get_component_EmitsDef_Upcall_Command command (
+ impl,
+ server_request.operation_details (),
+ args);
+
+ TAO::Upcall_Wrapper upcall_wrapper;
+ upcall_wrapper.upcall (server_request
+ , args
+ , nargs
+ , command
+#if TAO_HAS_INTERCEPTORS == 1
+ , servant_upcall
+ , exceptions
+ , nexceptions
+#endif /* TAO_HAS_INTERCEPTORS == 1 */
+ ACE_ENV_ARG_PARAMETER);
+ ACE_CHECK;
+}
+
+::CORBA::Boolean POA_CORBA::ComponentIR::EmitsDef::_is_a (
+ const char* value
+ ACE_ENV_ARG_DECL_NOT_USED
+ )
+{
+ return
+ (
+ !ACE_OS::strcmp (
+ value,
+ "IDL:omg.org/CORBA/IRObject:1.0"
+ ) ||
+ !ACE_OS::strcmp (
+ value,
+ "IDL:omg.org/CORBA/Contained:1.0"
+ ) ||
+ !ACE_OS::strcmp (
+ value,
+ "IDL:omg.org/CORBA/ComponentIR/EventPortDef:1.0"
+ ) ||
+ !ACE_OS::strcmp (
+ value,
+ "IDL:omg.org/CORBA/ComponentIR/EmitsDef:1.0"
+ ) ||
+ !ACE_OS::strcmp (
+ value,
+ "IDL:omg.org/CORBA/Object:1.0"
+ )
+ );
+}
+
+const char* POA_CORBA::ComponentIR::EmitsDef::_interface_repository_id (void) const
+{
+ return "IDL:omg.org/CORBA/ComponentIR/EmitsDef:1.0";
+}
+
+// TAO_IDL - Generated from
+// be\be_visitor_interface/interface_ss.cpp:903
+
+void POA_CORBA::ComponentIR::EmitsDef::_dispatch (
+ TAO_ServerRequest & req,
+ void * servant_upcall
+ ACE_ENV_ARG_DECL
+ )
+{
+ this->synchronous_upcall_dispatch (req,
+ servant_upcall,
+ this
+ ACE_ENV_ARG_PARAMETER);
+}
+
+// TAO_IDL - Generated from
+// be\be_visitor_interface/interface_ss.cpp:851
+
+CORBA::ComponentIR::EmitsDef *
+POA_CORBA::ComponentIR::EmitsDef::_this (ACE_ENV_SINGLE_ARG_DECL)
+{
+ TAO_Stub *stub = this->_create_stub (ACE_ENV_SINGLE_ARG_PARAMETER);
+ ACE_CHECK_RETURN (0);
+
+ TAO_Stub_Auto_Ptr safe_stub (stub);
+ ::CORBA::Object_ptr tmp = CORBA::Object::_nil ();
+
+ ::CORBA::Boolean const _tao_opt_colloc =
+ stub->servant_orb_var ()->orb_core ()->optimize_collocation_objects ();
+
+ ACE_NEW_RETURN (
+ tmp,
+ ::CORBA::Object (stub, _tao_opt_colloc, this),
+ 0
+ );
+
+ ::CORBA::Object_var obj = tmp;
+ (void) safe_stub.release ();
+
+ typedef ::CORBA::ComponentIR::EmitsDef STUB_SCOPED_NAME;
+ return
+ TAO::Narrow_Utils<STUB_SCOPED_NAME>::unchecked_narrow (
+ obj.in (),
+ CORBA_ComponentIR__TAO_EmitsDef_Proxy_Broker_Factory_function_pointer
+ );
+}
+
+// TAO_IDL - Generated from
+// be\be_interface.cpp:1499
+
+class TAO_CORBA_ComponentIR_PublishesDef_Perfect_Hash_OpTable
+ : public TAO_Perfect_Hash_OpTable
+{
+private:
+ unsigned int hash (const char *str, unsigned int len);
+
+public:
+ const TAO_operation_db_entry * lookup (const char *str, unsigned int len);
+};
+
+/* C++ code produced by gperf version 2.8 (ACE version) */
+/* Command-line: C:\ACE\latest\ACE_wrappers\bin\gperf.exe -m -M -J -c -C -D -E -T -f 0 -F 0,0 -a -o -t -p -K opname -L C++ -Z TAO_CORBA_ComponentIR_PublishesDef_Perfect_Hash_OpTable -N lookup */
+unsigned int
+TAO_CORBA_ComponentIR_PublishesDef_Perfect_Hash_OpTable::hash (const char *str, unsigned int len)
+{
+ static const unsigned char asso_values[] =
+ {
+#if defined (ACE_MVS)
+ 37, 37, 37, 37, 37, 37, 37, 37, 37, 37,
+ 37, 37, 37, 37, 37, 37, 37, 37, 37, 37,
+ 37, 37, 37, 37, 37, 37, 37, 37, 37, 37,
+ 37, 37, 37, 37, 37, 37, 37, 37, 37, 37,
+ 37, 37, 37, 37, 37, 37, 37, 37, 37, 37,
+ 37, 37, 37, 37, 37, 37, 37, 37, 37, 37,
+ 37, 37, 37, 37, 37, 37, 37, 37, 37, 37,
+ 37, 37, 37, 37, 37, 37, 37, 37, 37, 37,
+ 37, 37, 37, 37, 37, 37, 37, 37, 37, 37,
+ 37, 37, 37, 37, 37, 37, 37, 37, 37, 37,
+ 37, 37, 37, 37, 37, 37, 37, 37, 37, 0,
+ 37, 37, 37, 37, 37, 37, 37, 37, 37, 37,
+ 37, 37, 37, 37, 37, 37, 37, 37, 37, 0,
+ 37, 37, 0, 0, 37, 37, 37, 15, 37, 37,
+ 37, 37, 37, 37, 37, 37, 37, 37, 0, 0,
+ 37, 37, 37, 37, 37, 37, 37, 37, 37, 37,
+ 37, 37, 37, 10, 37, 37, 37, 37, 10, 37,
+ 37, 37, 37, 37, 37, 37, 37, 37, 37, 37,
+ 37, 37, 37, 37, 37, 37, 37, 37, 37, 37,
+ 37, 37, 37, 37, 37, 37, 37, 37, 37, 37,
+ 37, 37, 37, 37, 37, 37, 37, 37, 37, 37,
+ 37, 37, 37, 37, 37, 37, 37, 37, 37, 37,
+ 37, 37, 37, 37, 37, 37, 37, 37, 37, 37,
+ 37, 37, 37, 37, 37, 37, 37, 37, 37, 37,
+ 37, 37, 37, 37, 37, 37, 37, 37, 37, 37,
+ 37, 37, 37, 37, 37, 37,
+#else
+ 37, 37, 37, 37, 37, 37, 37, 37, 37, 37,
+ 37, 37, 37, 37, 37, 37, 37, 37, 37, 37,
+ 37, 37, 37, 37, 37, 37, 37, 37, 37, 37,
+ 37, 37, 37, 37, 37, 37, 37, 37, 37, 37,
+ 37, 37, 37, 37, 37, 37, 37, 37, 37, 37,
+ 37, 37, 37, 37, 37, 37, 37, 37, 37, 37,
+ 37, 37, 37, 37, 37, 37, 37, 37, 37, 37,
+ 37, 37, 37, 37, 37, 37, 37, 37, 37, 37,
+ 37, 37, 37, 37, 37, 37, 37, 37, 37, 37,
+ 37, 37, 37, 37, 37, 0, 37, 0, 37, 37,
+ 0, 0, 37, 37, 37, 15, 37, 37, 37, 0,
+ 0, 37, 37, 37, 37, 37, 10, 37, 37, 37,
+ 37, 10, 37, 37, 37, 37, 37, 37,
+#endif /* ACE_MVS */
+ };
+ return len + asso_values[(int) str[len - 1]] + asso_values[(int) str[0]];
+}
+
+const TAO_operation_db_entry *
+TAO_CORBA_ComponentIR_PublishesDef_Perfect_Hash_OpTable::lookup (const char *str, unsigned int len)
+{
+ enum
+ {
+ TOTAL_KEYWORDS = 21,
+ MIN_WORD_LENGTH = 4,
+ MAX_WORD_LENGTH = 26,
+ MIN_HASH_VALUE = 4,
+ MAX_HASH_VALUE = 36,
+ HASH_VALUE_RANGE = 33,
+ DUPLICATES = 6,
+ WORDLIST_SIZE = 25
+ };
+
+ static const TAO_operation_db_entry wordlist[] =
+ {
+ {"",0,0},{"",0,0},{"",0,0},{"",0,0},
+ {"move", &POA_CORBA::ComponentIR::PublishesDef::move_skel, 0},
+ {"_is_a", &POA_CORBA::ComponentIR::PublishesDef::_is_a_skel, 0},
+ {"_get_id", &POA_CORBA::ComponentIR::PublishesDef::_get_id_skel, 0},
+ {"_set_id", &POA_CORBA::ComponentIR::PublishesDef::_set_id_skel, 0},
+ {"describe", &POA_CORBA::ComponentIR::PublishesDef::describe_skel, 0},
+ {"_get_name", &POA_CORBA::ComponentIR::PublishesDef::_get_name_skel, 0},
+ {"_set_name", &POA_CORBA::ComponentIR::PublishesDef::_set_name_skel, 0},
+ {"_interface", &POA_CORBA::ComponentIR::PublishesDef::_interface_skel, 0},
+ {"_get_version", &POA_CORBA::ComponentIR::PublishesDef::_get_version_skel, 0},
+ {"_set_version", &POA_CORBA::ComponentIR::PublishesDef::_set_version_skel, 0},
+ {"_get_def_kind", &POA_CORBA::ComponentIR::PublishesDef::_get_def_kind_skel, 0},
+ {"_repository_id", &POA_CORBA::ComponentIR::PublishesDef::_repository_id_skel, 0},
+ {"_get_defined_in", &POA_CORBA::ComponentIR::PublishesDef::_get_defined_in_skel, 0},
+ {"destroy", &POA_CORBA::ComponentIR::PublishesDef::destroy_skel, 0},
+ {"_get_absolute_name", &POA_CORBA::ComponentIR::PublishesDef::_get_absolute_name_skel, 0},
+ {"is_a", &POA_CORBA::ComponentIR::PublishesDef::is_a_skel, 0},
+ {"_get_event", &POA_CORBA::ComponentIR::PublishesDef::_get_event_skel, 0},
+ {"_component", &POA_CORBA::ComponentIR::PublishesDef::_component_skel, 0},
+ {"_set_event", &POA_CORBA::ComponentIR::PublishesDef::_set_event_skel, 0},
+ {"_non_existent", &POA_CORBA::ComponentIR::PublishesDef::_non_existent_skel, 0},
+ {"_get_containing_repository", &POA_CORBA::ComponentIR::PublishesDef::_get_containing_repository_skel, 0},
+ };
+
+ static const signed char lookup[] =
+ {
+ -12, -2, -20, -3, 4, 5, -1, 53, 8, 48, 11, -1, -48, 14,
+ 15, 16, -1, 17, 18, 19, -54, -9, -2, 23, -6, -2, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1, 24,
+ };
+
+ if (len <= MAX_WORD_LENGTH && len >= MIN_WORD_LENGTH)
+ {
+ unsigned int key = hash (str, len);
+
+ if (key <= MAX_HASH_VALUE && key >= MIN_HASH_VALUE)
+ {
+ int slot = lookup[key];
+
+ if (slot >= 0 && slot < WORDLIST_SIZE)
+ {
+ const char *s = wordlist[slot].opname;
+
+ if (*str == *s && !strncmp (str + 1, s + 1, len - 1))
+ return &wordlist[slot];
+ }
+ else if (slot < 0 && slot >= -MAX_HASH_VALUE)
+ return 0;
+ else
+ {
+ unsigned int offset = key + slot + (slot > 0 ? -MAX_HASH_VALUE : MAX_HASH_VALUE);
+ const TAO_operation_db_entry *base = &wordlist[-lookup[offset]];
+ const TAO_operation_db_entry *ptr = base + -lookup[offset + 1];
+
+ while (--ptr >= base)
+ if (*str == *ptr->opname && !strncmp (str + 1, ptr->opname + 1, len - 1))
+ return ptr;
+ }
+ }
+ }
+ return 0;
+}
+
+static TAO_CORBA_ComponentIR_PublishesDef_Perfect_Hash_OpTable tao_CORBA_ComponentIR_PublishesDef_optable;
+
+// TAO_IDL - Generated from
+// be\be_visitor_interface/interface_ss.cpp:966
+
+TAO::Collocation_Proxy_Broker *
+CORBA_ComponentIR__TAO_PublishesDef_Proxy_Broker_Factory_function ( ::CORBA::Object_ptr)
+{
+ return reinterpret_cast<TAO::Collocation_Proxy_Broker *> (0xdead); // Dummy
+}
+
+int
+CORBA_ComponentIR__TAO_PublishesDef_Proxy_Broker_Factory_Initializer (size_t)
+{
+ CORBA_ComponentIR__TAO_PublishesDef_Proxy_Broker_Factory_function_pointer =
+ CORBA_ComponentIR__TAO_PublishesDef_Proxy_Broker_Factory_function;
+
+ return 0;
+}
+
+static int
+CORBA_ComponentIR__TAO_PublishesDef_Proxy_Broker_Stub_Factory_Initializer_Scarecrow =
+ CORBA_ComponentIR__TAO_PublishesDef_Proxy_Broker_Factory_Initializer (
+ reinterpret_cast<size_t> (CORBA_ComponentIR__TAO_PublishesDef_Proxy_Broker_Factory_Initializer)
+ );
+
+// TAO_IDL - Generated from
+// be\be_visitor_interface/interface_ss.cpp:103
+
+POA_CORBA::ComponentIR::PublishesDef::PublishesDef (void)
+ : TAO_ServantBase ()
+{
+ this->optable_ = &tao_CORBA_ComponentIR_PublishesDef_optable;
+}
+
+POA_CORBA::ComponentIR::PublishesDef::PublishesDef (const PublishesDef& rhs)
+ : TAO_Abstract_ServantBase (rhs),
+ TAO_ServantBase (rhs),
+ POA_CORBA::IRObject (rhs),
+ POA_CORBA::Contained (rhs),
+ POA_CORBA::ComponentIR::EventPortDef (rhs)
+{
+}
+
+POA_CORBA::ComponentIR::PublishesDef::~PublishesDef (void)
+{
+}
+
+// TAO_IDL - Generated from
+// be\be_visitor_interface/interface_ss.cpp:169
+
+namespace POA_CORBA
+{
+ namespace ComponentIR
+ {
+
+
+ // TAO_IDL - Generated from
+ // be\be_visitor_operation/upcall_command_ss.cpp:127
+
+ class _is_a_PublishesDef_Upcall_Command
+ : public TAO::Upcall_Command
+ {
+ public:
+ inline _is_a_PublishesDef_Upcall_Command (
+ POA_CORBA::ComponentIR::PublishesDef * servant,
+ TAO_Operation_Details const * operation_details,
+ TAO::Argument * const args[])
+ : servant_ (servant)
+ , operation_details_ (operation_details)
+ , args_ (args)
+ {
+ }
+
+ virtual void execute (ACE_ENV_SINGLE_ARG_DECL)
+ {
+ TAO::SArg_Traits< ::ACE_InputCDR::to_boolean>::ret_arg_type retval =
+ TAO::Portable_Server::get_ret_arg< ::ACE_InputCDR::to_boolean> (
+ this->operation_details_,
+ this->args_);
+
+ TAO::SArg_Traits< ::CORBA::Char *>::in_arg_type arg_1 =
+ TAO::Portable_Server::get_in_arg< ::CORBA::Char *> (
+ this->operation_details_,
+ this->args_,
+ 1);
+
+ retval =
+ this->servant_-> _is_a (
+ arg_1
+ ACE_ENV_ARG_PARAMETER);
+ ACE_CHECK;
+ }
+
+ private:
+ POA_CORBA::ComponentIR::PublishesDef * const servant_;
+ TAO_Operation_Details const * const operation_details_;
+ TAO::Argument * const * const args_;
+ };
+ }
+
+}
+
+
+void POA_CORBA::ComponentIR::PublishesDef::_is_a_skel (
+ TAO_ServerRequest & server_request,
+ void * TAO_INTERCEPTOR (servant_upcall),
+ void * servant
+ ACE_ENV_ARG_DECL
+ )
+{
+#if TAO_HAS_INTERCEPTORS == 1
+ static ::CORBA::TypeCode_ptr const * const exceptions = 0;
+ static ::CORBA::ULong const nexceptions = 0;
+#endif /* TAO_HAS_INTERCEPTORS */
+
+ TAO::SArg_Traits< ::ACE_InputCDR::to_boolean>::ret_val retval;
+ TAO::SArg_Traits< ::CORBA::Char *>::in_arg_val _tao_repository_id;
+
+ TAO::Argument * const args[] =
+ {
+ &retval,
+ &_tao_repository_id
+ };
+
+ static size_t const nargs = 2;
+
+ POA_CORBA::ComponentIR::PublishesDef * const impl =
+ static_cast<POA_CORBA::ComponentIR::PublishesDef *> (servant);
+
+ _is_a_PublishesDef_Upcall_Command command (
+ impl,
+ server_request.operation_details (),
+ args);
+
+ TAO::Upcall_Wrapper upcall_wrapper;
+ upcall_wrapper.upcall (server_request
+ , args
+ , nargs
+ , command
+#if TAO_HAS_INTERCEPTORS == 1
+ , servant_upcall
+ , exceptions
+ , nexceptions
+#endif /* TAO_HAS_INTERCEPTORS == 1 */
+ ACE_ENV_ARG_PARAMETER);
+ ACE_CHECK;
+}namespace POA_CORBA
+{
+ namespace ComponentIR
+ {
+
+
+ // TAO_IDL - Generated from
+ // be\be_visitor_operation/upcall_command_ss.cpp:127
+
+ class _non_existent_PublishesDef_Upcall_Command
+ : public TAO::Upcall_Command
+ {
+ public:
+ inline _non_existent_PublishesDef_Upcall_Command (
+ POA_CORBA::ComponentIR::PublishesDef * servant,
+ TAO_Operation_Details const * operation_details,
+ TAO::Argument * const args[])
+ : servant_ (servant)
+ , operation_details_ (operation_details)
+ , args_ (args)
+ {
+ }
+
+ virtual void execute (ACE_ENV_SINGLE_ARG_DECL)
+ {
+ TAO::SArg_Traits< ::ACE_InputCDR::to_boolean>::ret_arg_type retval =
+ TAO::Portable_Server::get_ret_arg< ::ACE_InputCDR::to_boolean> (
+ this->operation_details_,
+ this->args_);
+
+ retval =
+ this->servant_-> _non_existent (
+ ACE_ENV_SINGLE_ARG_PARAMETER);
+ ACE_CHECK;
+ }
+
+ private:
+ POA_CORBA::ComponentIR::PublishesDef * const servant_;
+ TAO_Operation_Details const * const operation_details_;
+ TAO::Argument * const * const args_;
+ };
+ }
+
+}
+
+
+void POA_CORBA::ComponentIR::PublishesDef::_non_existent_skel (
+ TAO_ServerRequest & server_request,
+ void * TAO_INTERCEPTOR (servant_upcall),
+ void * servant
+ ACE_ENV_ARG_DECL
+ )
+{
+#if TAO_HAS_INTERCEPTORS == 1
+ static ::CORBA::TypeCode_ptr const * const exceptions = 0;
+ static ::CORBA::ULong const nexceptions = 0;
+#endif /* TAO_HAS_INTERCEPTORS */
+
+ TAO::SArg_Traits< ::ACE_InputCDR::to_boolean>::ret_val retval;
+
+ TAO::Argument * const args[] =
+ {
+ &retval
+ };
+
+ static size_t const nargs = 1;
+
+ POA_CORBA::ComponentIR::PublishesDef * const impl =
+ static_cast<POA_CORBA::ComponentIR::PublishesDef *> (servant);
+
+ _non_existent_PublishesDef_Upcall_Command command (
+ impl,
+ server_request.operation_details (),
+ args);
+
+ TAO::Upcall_Wrapper upcall_wrapper;
+ upcall_wrapper.upcall (server_request
+ , args
+ , nargs
+ , command
+#if TAO_HAS_INTERCEPTORS == 1
+ , servant_upcall
+ , exceptions
+ , nexceptions
+#endif /* TAO_HAS_INTERCEPTORS == 1 */
+ ACE_ENV_ARG_PARAMETER);
+ ACE_CHECK;
+}namespace POA_CORBA
+{
+ namespace ComponentIR
+ {
+
+
+ // TAO_IDL - Generated from
+ // be\be_visitor_operation/upcall_command_ss.cpp:127
+
+ class _repository_id_PublishesDef_Upcall_Command
+ : public TAO::Upcall_Command
+ {
+ public:
+ inline _repository_id_PublishesDef_Upcall_Command (
+ POA_CORBA::ComponentIR::PublishesDef * servant,
+ TAO_Operation_Details const * operation_details,
+ TAO::Argument * const args[])
+ : servant_ (servant)
+ , operation_details_ (operation_details)
+ , args_ (args)
+ {
+ }
+
+ virtual void execute (ACE_ENV_SINGLE_ARG_DECL)
+ {
+ TAO::SArg_Traits< ::CORBA::Char *>::ret_arg_type retval =
+ TAO::Portable_Server::get_ret_arg< ::CORBA::Char *> (
+ this->operation_details_,
+ this->args_);
+
+ retval =
+ this->servant_-> _repository_id (
+ ACE_ENV_SINGLE_ARG_PARAMETER);
+ ACE_CHECK;
+ }
+
+ private:
+ POA_CORBA::ComponentIR::PublishesDef * const servant_;
+ TAO_Operation_Details const * const operation_details_;
+ TAO::Argument * const * const args_;
+ };
+ }
+
+}
+
+
+void POA_CORBA::ComponentIR::PublishesDef::_repository_id_skel (
+ TAO_ServerRequest & server_request,
+ void * TAO_INTERCEPTOR (servant_upcall),
+ void * servant
+ ACE_ENV_ARG_DECL
+ )
+{
+#if TAO_HAS_INTERCEPTORS == 1
+ static ::CORBA::TypeCode_ptr const * const exceptions = 0;
+ static ::CORBA::ULong const nexceptions = 0;
+#endif /* TAO_HAS_INTERCEPTORS */
+
+ TAO::SArg_Traits< ::CORBA::Char *>::ret_val retval;
+
+ TAO::Argument * const args[] =
+ {
+ &retval
+ };
+
+ static size_t const nargs = 1;
+
+ POA_CORBA::ComponentIR::PublishesDef * const impl =
+ static_cast<POA_CORBA::ComponentIR::PublishesDef *> (servant);
+
+ _repository_id_PublishesDef_Upcall_Command command (
+ impl,
+ server_request.operation_details (),
+ args);
+
+ TAO::Upcall_Wrapper upcall_wrapper;
+ upcall_wrapper.upcall (server_request
+ , args
+ , nargs
+ , command
+#if TAO_HAS_INTERCEPTORS == 1
+ , servant_upcall
+ , exceptions
+ , nexceptions
+#endif /* TAO_HAS_INTERCEPTORS == 1 */
+ ACE_ENV_ARG_PARAMETER);
+ ACE_CHECK;
+}
+
+// TAO_IDL - Generated from
+// be\be_visitor_interface/interface_ss.cpp:513
+
+void POA_CORBA::ComponentIR::PublishesDef::_interface_skel (
+ TAO_ServerRequest & server_request,
+ void * /* servant_upcall */,
+ void * servant
+ ACE_ENV_ARG_DECL
+ )
+{
+ TAO_IFR_Client_Adapter *_tao_adapter =
+ ACE_Dynamic_Service<TAO_IFR_Client_Adapter>::instance (
+ TAO_ORB_Core::ifr_client_adapter_name ()
+ );
+
+ if (_tao_adapter == 0)
+ {
+ ACE_THROW ( ::CORBA::INTF_REPOS ( ::CORBA::OMGVMCID | 1,
+ ::CORBA::COMPLETED_NO));
+ }
+
+ POA_CORBA::ComponentIR::PublishesDef * const impl =
+ static_cast<POA_CORBA::ComponentIR::PublishesDef *> (servant);
+ ::CORBA::InterfaceDef_ptr _tao_retval =
+ impl->_get_interface (ACE_ENV_SINGLE_ARG_PARAMETER);
+ ACE_CHECK;
+
+ server_request.init_reply ();
+ TAO_OutputCDR &_tao_out = *server_request.outgoing ();
+
+ ::CORBA::Boolean const _tao_result =
+ _tao_adapter->interfacedef_cdr_insert (
+ _tao_out,
+ _tao_retval
+ );
+
+ _tao_adapter->dispose (_tao_retval);
+
+ if (_tao_result == false)
+ {
+ ACE_THROW ( ::CORBA::MARSHAL ());
+ }
+}namespace POA_CORBA
+{
+ namespace ComponentIR
+ {
+
+
+ // TAO_IDL - Generated from
+ // be\be_visitor_operation/upcall_command_ss.cpp:127
+
+ class _get_component_PublishesDef_Upcall_Command
+ : public TAO::Upcall_Command
+ {
+ public:
+ inline _get_component_PublishesDef_Upcall_Command (
+ POA_CORBA::ComponentIR::PublishesDef * servant,
+ TAO_Operation_Details const * operation_details,
+ TAO::Argument * const args[])
+ : servant_ (servant)
+ , operation_details_ (operation_details)
+ , args_ (args)
+ {
+ }
+
+ virtual void execute (ACE_ENV_SINGLE_ARG_DECL)
+ {
+ TAO::SArg_Traits< ::CORBA::Object>::ret_arg_type retval =
+ TAO::Portable_Server::get_ret_arg< ::CORBA::Object> (
+ this->operation_details_,
+ this->args_);
+
+ retval =
+ this->servant_-> _get_component (
+ ACE_ENV_SINGLE_ARG_PARAMETER);
+ ACE_CHECK;
+ }
+
+ private:
+ POA_CORBA::ComponentIR::PublishesDef * const servant_;
+ TAO_Operation_Details const * const operation_details_;
+ TAO::Argument * const * const args_;
+ };
+ }
+
+}
+
+
+void POA_CORBA::ComponentIR::PublishesDef::_component_skel (
+ TAO_ServerRequest & server_request,
+ void * TAO_INTERCEPTOR (servant_upcall),
+ void * servant
+ ACE_ENV_ARG_DECL
+ )
+{
+#if TAO_HAS_INTERCEPTORS == 1
+ static ::CORBA::TypeCode_ptr const * const exceptions = 0;
+ static ::CORBA::ULong const nexceptions = 0;
+#endif /* TAO_HAS_INTERCEPTORS */
+
+ TAO::SArg_Traits< ::CORBA::Object>::ret_val retval;
+
+ TAO::Argument * const args[] =
+ {
+ &retval
+ };
+
+ static size_t const nargs = 1;
+
+ POA_CORBA::ComponentIR::PublishesDef * const impl =
+ static_cast<POA_CORBA::ComponentIR::PublishesDef *> (servant);
+
+ _get_component_PublishesDef_Upcall_Command command (
+ impl,
+ server_request.operation_details (),
+ args);
+
+ TAO::Upcall_Wrapper upcall_wrapper;
+ upcall_wrapper.upcall (server_request
+ , args
+ , nargs
+ , command
+#if TAO_HAS_INTERCEPTORS == 1
+ , servant_upcall
+ , exceptions
+ , nexceptions
+#endif /* TAO_HAS_INTERCEPTORS == 1 */
+ ACE_ENV_ARG_PARAMETER);
+ ACE_CHECK;
+}
+
+::CORBA::Boolean POA_CORBA::ComponentIR::PublishesDef::_is_a (
+ const char* value
+ ACE_ENV_ARG_DECL_NOT_USED
+ )
+{
+ return
+ (
+ !ACE_OS::strcmp (
+ value,
+ "IDL:omg.org/CORBA/IRObject:1.0"
+ ) ||
+ !ACE_OS::strcmp (
+ value,
+ "IDL:omg.org/CORBA/Contained:1.0"
+ ) ||
+ !ACE_OS::strcmp (
+ value,
+ "IDL:omg.org/CORBA/ComponentIR/EventPortDef:1.0"
+ ) ||
+ !ACE_OS::strcmp (
+ value,
+ "IDL:omg.org/CORBA/ComponentIR/PublishesDef:1.0"
+ ) ||
+ !ACE_OS::strcmp (
+ value,
+ "IDL:omg.org/CORBA/Object:1.0"
+ )
+ );
+}
+
+const char* POA_CORBA::ComponentIR::PublishesDef::_interface_repository_id (void) const
+{
+ return "IDL:omg.org/CORBA/ComponentIR/PublishesDef:1.0";
+}
+
+// TAO_IDL - Generated from
+// be\be_visitor_interface/interface_ss.cpp:903
+
+void POA_CORBA::ComponentIR::PublishesDef::_dispatch (
+ TAO_ServerRequest & req,
+ void * servant_upcall
+ ACE_ENV_ARG_DECL
+ )
+{
+ this->synchronous_upcall_dispatch (req,
+ servant_upcall,
+ this
+ ACE_ENV_ARG_PARAMETER);
+}
+
+// TAO_IDL - Generated from
+// be\be_visitor_interface/interface_ss.cpp:851
+
+CORBA::ComponentIR::PublishesDef *
+POA_CORBA::ComponentIR::PublishesDef::_this (ACE_ENV_SINGLE_ARG_DECL)
+{
+ TAO_Stub *stub = this->_create_stub (ACE_ENV_SINGLE_ARG_PARAMETER);
+ ACE_CHECK_RETURN (0);
+
+ TAO_Stub_Auto_Ptr safe_stub (stub);
+ ::CORBA::Object_ptr tmp = CORBA::Object::_nil ();
+
+ ::CORBA::Boolean const _tao_opt_colloc =
+ stub->servant_orb_var ()->orb_core ()->optimize_collocation_objects ();
+
+ ACE_NEW_RETURN (
+ tmp,
+ ::CORBA::Object (stub, _tao_opt_colloc, this),
+ 0
+ );
+
+ ::CORBA::Object_var obj = tmp;
+ (void) safe_stub.release ();
+
+ typedef ::CORBA::ComponentIR::PublishesDef STUB_SCOPED_NAME;
+ return
+ TAO::Narrow_Utils<STUB_SCOPED_NAME>::unchecked_narrow (
+ obj.in (),
+ CORBA_ComponentIR__TAO_PublishesDef_Proxy_Broker_Factory_function_pointer
+ );
+}
+
+// TAO_IDL - Generated from
+// be\be_interface.cpp:1499
+
+class TAO_CORBA_ComponentIR_ConsumesDef_Perfect_Hash_OpTable
+ : public TAO_Perfect_Hash_OpTable
+{
+private:
+ unsigned int hash (const char *str, unsigned int len);
+
+public:
+ const TAO_operation_db_entry * lookup (const char *str, unsigned int len);
+};
+
+/* C++ code produced by gperf version 2.8 (ACE version) */
+/* Command-line: C:\ACE\latest\ACE_wrappers\bin\gperf.exe -m -M -J -c -C -D -E -T -f 0 -F 0,0 -a -o -t -p -K opname -L C++ -Z TAO_CORBA_ComponentIR_ConsumesDef_Perfect_Hash_OpTable -N lookup */
+unsigned int
+TAO_CORBA_ComponentIR_ConsumesDef_Perfect_Hash_OpTable::hash (const char *str, unsigned int len)
+{
+ static const unsigned char asso_values[] =
+ {
+#if defined (ACE_MVS)
+ 37, 37, 37, 37, 37, 37, 37, 37, 37, 37,
+ 37, 37, 37, 37, 37, 37, 37, 37, 37, 37,
+ 37, 37, 37, 37, 37, 37, 37, 37, 37, 37,
+ 37, 37, 37, 37, 37, 37, 37, 37, 37, 37,
+ 37, 37, 37, 37, 37, 37, 37, 37, 37, 37,
+ 37, 37, 37, 37, 37, 37, 37, 37, 37, 37,
+ 37, 37, 37, 37, 37, 37, 37, 37, 37, 37,
+ 37, 37, 37, 37, 37, 37, 37, 37, 37, 37,
+ 37, 37, 37, 37, 37, 37, 37, 37, 37, 37,
+ 37, 37, 37, 37, 37, 37, 37, 37, 37, 37,
+ 37, 37, 37, 37, 37, 37, 37, 37, 37, 0,
+ 37, 37, 37, 37, 37, 37, 37, 37, 37, 37,
+ 37, 37, 37, 37, 37, 37, 37, 37, 37, 0,
+ 37, 37, 0, 0, 37, 37, 37, 15, 37, 37,
+ 37, 37, 37, 37, 37, 37, 37, 37, 0, 0,
+ 37, 37, 37, 37, 37, 37, 37, 37, 37, 37,
+ 37, 37, 37, 10, 37, 37, 37, 37, 10, 37,
+ 37, 37, 37, 37, 37, 37, 37, 37, 37, 37,
+ 37, 37, 37, 37, 37, 37, 37, 37, 37, 37,
+ 37, 37, 37, 37, 37, 37, 37, 37, 37, 37,
+ 37, 37, 37, 37, 37, 37, 37, 37, 37, 37,
+ 37, 37, 37, 37, 37, 37, 37, 37, 37, 37,
+ 37, 37, 37, 37, 37, 37, 37, 37, 37, 37,
+ 37, 37, 37, 37, 37, 37, 37, 37, 37, 37,
+ 37, 37, 37, 37, 37, 37, 37, 37, 37, 37,
+ 37, 37, 37, 37, 37, 37,
+#else
+ 37, 37, 37, 37, 37, 37, 37, 37, 37, 37,
+ 37, 37, 37, 37, 37, 37, 37, 37, 37, 37,
+ 37, 37, 37, 37, 37, 37, 37, 37, 37, 37,
+ 37, 37, 37, 37, 37, 37, 37, 37, 37, 37,
+ 37, 37, 37, 37, 37, 37, 37, 37, 37, 37,
+ 37, 37, 37, 37, 37, 37, 37, 37, 37, 37,
+ 37, 37, 37, 37, 37, 37, 37, 37, 37, 37,
+ 37, 37, 37, 37, 37, 37, 37, 37, 37, 37,
+ 37, 37, 37, 37, 37, 37, 37, 37, 37, 37,
+ 37, 37, 37, 37, 37, 0, 37, 0, 37, 37,
+ 0, 0, 37, 37, 37, 15, 37, 37, 37, 0,
+ 0, 37, 37, 37, 37, 37, 10, 37, 37, 37,
+ 37, 10, 37, 37, 37, 37, 37, 37,
+#endif /* ACE_MVS */
+ };
+ return len + asso_values[(int) str[len - 1]] + asso_values[(int) str[0]];
+}
+
+const TAO_operation_db_entry *
+TAO_CORBA_ComponentIR_ConsumesDef_Perfect_Hash_OpTable::lookup (const char *str, unsigned int len)
+{
+ enum
+ {
+ TOTAL_KEYWORDS = 21,
+ MIN_WORD_LENGTH = 4,
+ MAX_WORD_LENGTH = 26,
+ MIN_HASH_VALUE = 4,
+ MAX_HASH_VALUE = 36,
+ HASH_VALUE_RANGE = 33,
+ DUPLICATES = 6,
+ WORDLIST_SIZE = 25
+ };
+
+ static const TAO_operation_db_entry wordlist[] =
+ {
+ {"",0,0},{"",0,0},{"",0,0},{"",0,0},
+ {"move", &POA_CORBA::ComponentIR::ConsumesDef::move_skel, 0},
+ {"_is_a", &POA_CORBA::ComponentIR::ConsumesDef::_is_a_skel, 0},
+ {"_get_id", &POA_CORBA::ComponentIR::ConsumesDef::_get_id_skel, 0},
+ {"_set_id", &POA_CORBA::ComponentIR::ConsumesDef::_set_id_skel, 0},
+ {"describe", &POA_CORBA::ComponentIR::ConsumesDef::describe_skel, 0},
+ {"_get_name", &POA_CORBA::ComponentIR::ConsumesDef::_get_name_skel, 0},
+ {"_set_name", &POA_CORBA::ComponentIR::ConsumesDef::_set_name_skel, 0},
+ {"_interface", &POA_CORBA::ComponentIR::ConsumesDef::_interface_skel, 0},
+ {"_get_version", &POA_CORBA::ComponentIR::ConsumesDef::_get_version_skel, 0},
+ {"_set_version", &POA_CORBA::ComponentIR::ConsumesDef::_set_version_skel, 0},
+ {"_get_def_kind", &POA_CORBA::ComponentIR::ConsumesDef::_get_def_kind_skel, 0},
+ {"_repository_id", &POA_CORBA::ComponentIR::ConsumesDef::_repository_id_skel, 0},
+ {"_get_defined_in", &POA_CORBA::ComponentIR::ConsumesDef::_get_defined_in_skel, 0},
+ {"destroy", &POA_CORBA::ComponentIR::ConsumesDef::destroy_skel, 0},
+ {"_get_absolute_name", &POA_CORBA::ComponentIR::ConsumesDef::_get_absolute_name_skel, 0},
+ {"is_a", &POA_CORBA::ComponentIR::ConsumesDef::is_a_skel, 0},
+ {"_get_event", &POA_CORBA::ComponentIR::ConsumesDef::_get_event_skel, 0},
+ {"_component", &POA_CORBA::ComponentIR::ConsumesDef::_component_skel, 0},
+ {"_set_event", &POA_CORBA::ComponentIR::ConsumesDef::_set_event_skel, 0},
+ {"_non_existent", &POA_CORBA::ComponentIR::ConsumesDef::_non_existent_skel, 0},
+ {"_get_containing_repository", &POA_CORBA::ComponentIR::ConsumesDef::_get_containing_repository_skel, 0},
+ };
+
+ static const signed char lookup[] =
+ {
+ -12, -2, -20, -3, 4, 5, -1, 53, 8, 48, 11, -1, -48, 14,
+ 15, 16, -1, 17, 18, 19, -54, -9, -2, 23, -6, -2, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1, 24,
+ };
+
+ if (len <= MAX_WORD_LENGTH && len >= MIN_WORD_LENGTH)
+ {
+ unsigned int key = hash (str, len);
+
+ if (key <= MAX_HASH_VALUE && key >= MIN_HASH_VALUE)
+ {
+ int slot = lookup[key];
+
+ if (slot >= 0 && slot < WORDLIST_SIZE)
+ {
+ const char *s = wordlist[slot].opname;
+
+ if (*str == *s && !strncmp (str + 1, s + 1, len - 1))
+ return &wordlist[slot];
+ }
+ else if (slot < 0 && slot >= -MAX_HASH_VALUE)
+ return 0;
+ else
+ {
+ unsigned int offset = key + slot + (slot > 0 ? -MAX_HASH_VALUE : MAX_HASH_VALUE);
+ const TAO_operation_db_entry *base = &wordlist[-lookup[offset]];
+ const TAO_operation_db_entry *ptr = base + -lookup[offset + 1];
+
+ while (--ptr >= base)
+ if (*str == *ptr->opname && !strncmp (str + 1, ptr->opname + 1, len - 1))
+ return ptr;
+ }
+ }
+ }
+ return 0;
+}
+
+static TAO_CORBA_ComponentIR_ConsumesDef_Perfect_Hash_OpTable tao_CORBA_ComponentIR_ConsumesDef_optable;
+
+// TAO_IDL - Generated from
+// be\be_visitor_interface/interface_ss.cpp:966
+
+TAO::Collocation_Proxy_Broker *
+CORBA_ComponentIR__TAO_ConsumesDef_Proxy_Broker_Factory_function ( ::CORBA::Object_ptr)
+{
+ return reinterpret_cast<TAO::Collocation_Proxy_Broker *> (0xdead); // Dummy
+}
+
+int
+CORBA_ComponentIR__TAO_ConsumesDef_Proxy_Broker_Factory_Initializer (size_t)
+{
+ CORBA_ComponentIR__TAO_ConsumesDef_Proxy_Broker_Factory_function_pointer =
+ CORBA_ComponentIR__TAO_ConsumesDef_Proxy_Broker_Factory_function;
+
+ return 0;
+}
+
+static int
+CORBA_ComponentIR__TAO_ConsumesDef_Proxy_Broker_Stub_Factory_Initializer_Scarecrow =
+ CORBA_ComponentIR__TAO_ConsumesDef_Proxy_Broker_Factory_Initializer (
+ reinterpret_cast<size_t> (CORBA_ComponentIR__TAO_ConsumesDef_Proxy_Broker_Factory_Initializer)
+ );
+
+// TAO_IDL - Generated from
+// be\be_visitor_interface/interface_ss.cpp:103
+
+POA_CORBA::ComponentIR::ConsumesDef::ConsumesDef (void)
+ : TAO_ServantBase ()
+{
+ this->optable_ = &tao_CORBA_ComponentIR_ConsumesDef_optable;
+}
+
+POA_CORBA::ComponentIR::ConsumesDef::ConsumesDef (const ConsumesDef& rhs)
+ : TAO_Abstract_ServantBase (rhs),
+ TAO_ServantBase (rhs),
+ POA_CORBA::IRObject (rhs),
+ POA_CORBA::Contained (rhs),
+ POA_CORBA::ComponentIR::EventPortDef (rhs)
+{
+}
+
+POA_CORBA::ComponentIR::ConsumesDef::~ConsumesDef (void)
+{
+}
+
+// TAO_IDL - Generated from
+// be\be_visitor_interface/interface_ss.cpp:169
+
+namespace POA_CORBA
+{
+ namespace ComponentIR
+ {
+
+
+ // TAO_IDL - Generated from
+ // be\be_visitor_operation/upcall_command_ss.cpp:127
+
+ class _is_a_ConsumesDef_Upcall_Command
+ : public TAO::Upcall_Command
+ {
+ public:
+ inline _is_a_ConsumesDef_Upcall_Command (
+ POA_CORBA::ComponentIR::ConsumesDef * servant,
+ TAO_Operation_Details const * operation_details,
+ TAO::Argument * const args[])
+ : servant_ (servant)
+ , operation_details_ (operation_details)
+ , args_ (args)
+ {
+ }
+
+ virtual void execute (ACE_ENV_SINGLE_ARG_DECL)
+ {
+ TAO::SArg_Traits< ::ACE_InputCDR::to_boolean>::ret_arg_type retval =
+ TAO::Portable_Server::get_ret_arg< ::ACE_InputCDR::to_boolean> (
+ this->operation_details_,
+ this->args_);
+
+ TAO::SArg_Traits< ::CORBA::Char *>::in_arg_type arg_1 =
+ TAO::Portable_Server::get_in_arg< ::CORBA::Char *> (
+ this->operation_details_,
+ this->args_,
+ 1);
+
+ retval =
+ this->servant_-> _is_a (
+ arg_1
+ ACE_ENV_ARG_PARAMETER);
+ ACE_CHECK;
+ }
+
+ private:
+ POA_CORBA::ComponentIR::ConsumesDef * const servant_;
+ TAO_Operation_Details const * const operation_details_;
+ TAO::Argument * const * const args_;
+ };
+ }
+
+}
+
+
+void POA_CORBA::ComponentIR::ConsumesDef::_is_a_skel (
+ TAO_ServerRequest & server_request,
+ void * TAO_INTERCEPTOR (servant_upcall),
+ void * servant
+ ACE_ENV_ARG_DECL
+ )
+{
+#if TAO_HAS_INTERCEPTORS == 1
+ static ::CORBA::TypeCode_ptr const * const exceptions = 0;
+ static ::CORBA::ULong const nexceptions = 0;
+#endif /* TAO_HAS_INTERCEPTORS */
+
+ TAO::SArg_Traits< ::ACE_InputCDR::to_boolean>::ret_val retval;
+ TAO::SArg_Traits< ::CORBA::Char *>::in_arg_val _tao_repository_id;
+
+ TAO::Argument * const args[] =
+ {
+ &retval,
+ &_tao_repository_id
+ };
+
+ static size_t const nargs = 2;
+
+ POA_CORBA::ComponentIR::ConsumesDef * const impl =
+ static_cast<POA_CORBA::ComponentIR::ConsumesDef *> (servant);
+
+ _is_a_ConsumesDef_Upcall_Command command (
+ impl,
+ server_request.operation_details (),
+ args);
+
+ TAO::Upcall_Wrapper upcall_wrapper;
+ upcall_wrapper.upcall (server_request
+ , args
+ , nargs
+ , command
+#if TAO_HAS_INTERCEPTORS == 1
+ , servant_upcall
+ , exceptions
+ , nexceptions
+#endif /* TAO_HAS_INTERCEPTORS == 1 */
+ ACE_ENV_ARG_PARAMETER);
+ ACE_CHECK;
+}namespace POA_CORBA
+{
+ namespace ComponentIR
+ {
+
+
+ // TAO_IDL - Generated from
+ // be\be_visitor_operation/upcall_command_ss.cpp:127
+
+ class _non_existent_ConsumesDef_Upcall_Command
+ : public TAO::Upcall_Command
+ {
+ public:
+ inline _non_existent_ConsumesDef_Upcall_Command (
+ POA_CORBA::ComponentIR::ConsumesDef * servant,
+ TAO_Operation_Details const * operation_details,
+ TAO::Argument * const args[])
+ : servant_ (servant)
+ , operation_details_ (operation_details)
+ , args_ (args)
+ {
+ }
+
+ virtual void execute (ACE_ENV_SINGLE_ARG_DECL)
+ {
+ TAO::SArg_Traits< ::ACE_InputCDR::to_boolean>::ret_arg_type retval =
+ TAO::Portable_Server::get_ret_arg< ::ACE_InputCDR::to_boolean> (
+ this->operation_details_,
+ this->args_);
+
+ retval =
+ this->servant_-> _non_existent (
+ ACE_ENV_SINGLE_ARG_PARAMETER);
+ ACE_CHECK;
+ }
+
+ private:
+ POA_CORBA::ComponentIR::ConsumesDef * const servant_;
+ TAO_Operation_Details const * const operation_details_;
+ TAO::Argument * const * const args_;
+ };
+ }
+
+}
+
+
+void POA_CORBA::ComponentIR::ConsumesDef::_non_existent_skel (
+ TAO_ServerRequest & server_request,
+ void * TAO_INTERCEPTOR (servant_upcall),
+ void * servant
+ ACE_ENV_ARG_DECL
+ )
+{
+#if TAO_HAS_INTERCEPTORS == 1
+ static ::CORBA::TypeCode_ptr const * const exceptions = 0;
+ static ::CORBA::ULong const nexceptions = 0;
+#endif /* TAO_HAS_INTERCEPTORS */
+
+ TAO::SArg_Traits< ::ACE_InputCDR::to_boolean>::ret_val retval;
+
+ TAO::Argument * const args[] =
+ {
+ &retval
+ };
+
+ static size_t const nargs = 1;
+
+ POA_CORBA::ComponentIR::ConsumesDef * const impl =
+ static_cast<POA_CORBA::ComponentIR::ConsumesDef *> (servant);
+
+ _non_existent_ConsumesDef_Upcall_Command command (
+ impl,
+ server_request.operation_details (),
+ args);
+
+ TAO::Upcall_Wrapper upcall_wrapper;
+ upcall_wrapper.upcall (server_request
+ , args
+ , nargs
+ , command
+#if TAO_HAS_INTERCEPTORS == 1
+ , servant_upcall
+ , exceptions
+ , nexceptions
+#endif /* TAO_HAS_INTERCEPTORS == 1 */
+ ACE_ENV_ARG_PARAMETER);
+ ACE_CHECK;
+}namespace POA_CORBA
+{
+ namespace ComponentIR
+ {
+
+
+ // TAO_IDL - Generated from
+ // be\be_visitor_operation/upcall_command_ss.cpp:127
+
+ class _repository_id_ConsumesDef_Upcall_Command
+ : public TAO::Upcall_Command
+ {
+ public:
+ inline _repository_id_ConsumesDef_Upcall_Command (
+ POA_CORBA::ComponentIR::ConsumesDef * servant,
+ TAO_Operation_Details const * operation_details,
+ TAO::Argument * const args[])
+ : servant_ (servant)
+ , operation_details_ (operation_details)
+ , args_ (args)
+ {
+ }
+
+ virtual void execute (ACE_ENV_SINGLE_ARG_DECL)
+ {
+ TAO::SArg_Traits< ::CORBA::Char *>::ret_arg_type retval =
+ TAO::Portable_Server::get_ret_arg< ::CORBA::Char *> (
+ this->operation_details_,
+ this->args_);
+
+ retval =
+ this->servant_-> _repository_id (
+ ACE_ENV_SINGLE_ARG_PARAMETER);
+ ACE_CHECK;
+ }
+
+ private:
+ POA_CORBA::ComponentIR::ConsumesDef * const servant_;
+ TAO_Operation_Details const * const operation_details_;
+ TAO::Argument * const * const args_;
+ };
+ }
+
+}
+
+
+void POA_CORBA::ComponentIR::ConsumesDef::_repository_id_skel (
+ TAO_ServerRequest & server_request,
+ void * TAO_INTERCEPTOR (servant_upcall),
+ void * servant
+ ACE_ENV_ARG_DECL
+ )
+{
+#if TAO_HAS_INTERCEPTORS == 1
+ static ::CORBA::TypeCode_ptr const * const exceptions = 0;
+ static ::CORBA::ULong const nexceptions = 0;
+#endif /* TAO_HAS_INTERCEPTORS */
+
+ TAO::SArg_Traits< ::CORBA::Char *>::ret_val retval;
+
+ TAO::Argument * const args[] =
+ {
+ &retval
+ };
+
+ static size_t const nargs = 1;
+
+ POA_CORBA::ComponentIR::ConsumesDef * const impl =
+ static_cast<POA_CORBA::ComponentIR::ConsumesDef *> (servant);
+
+ _repository_id_ConsumesDef_Upcall_Command command (
+ impl,
+ server_request.operation_details (),
+ args);
+
+ TAO::Upcall_Wrapper upcall_wrapper;
+ upcall_wrapper.upcall (server_request
+ , args
+ , nargs
+ , command
+#if TAO_HAS_INTERCEPTORS == 1
+ , servant_upcall
+ , exceptions
+ , nexceptions
+#endif /* TAO_HAS_INTERCEPTORS == 1 */
+ ACE_ENV_ARG_PARAMETER);
+ ACE_CHECK;
+}
+
+// TAO_IDL - Generated from
+// be\be_visitor_interface/interface_ss.cpp:513
+
+void POA_CORBA::ComponentIR::ConsumesDef::_interface_skel (
+ TAO_ServerRequest & server_request,
+ void * /* servant_upcall */,
+ void * servant
+ ACE_ENV_ARG_DECL
+ )
+{
+ TAO_IFR_Client_Adapter *_tao_adapter =
+ ACE_Dynamic_Service<TAO_IFR_Client_Adapter>::instance (
+ TAO_ORB_Core::ifr_client_adapter_name ()
+ );
+
+ if (_tao_adapter == 0)
+ {
+ ACE_THROW ( ::CORBA::INTF_REPOS ( ::CORBA::OMGVMCID | 1,
+ ::CORBA::COMPLETED_NO));
+ }
+
+ POA_CORBA::ComponentIR::ConsumesDef * const impl =
+ static_cast<POA_CORBA::ComponentIR::ConsumesDef *> (servant);
+ ::CORBA::InterfaceDef_ptr _tao_retval =
+ impl->_get_interface (ACE_ENV_SINGLE_ARG_PARAMETER);
+ ACE_CHECK;
+
+ server_request.init_reply ();
+ TAO_OutputCDR &_tao_out = *server_request.outgoing ();
+
+ ::CORBA::Boolean const _tao_result =
+ _tao_adapter->interfacedef_cdr_insert (
+ _tao_out,
+ _tao_retval
+ );
+
+ _tao_adapter->dispose (_tao_retval);
+
+ if (_tao_result == false)
+ {
+ ACE_THROW ( ::CORBA::MARSHAL ());
+ }
+}namespace POA_CORBA
+{
+ namespace ComponentIR
+ {
+
+
+ // TAO_IDL - Generated from
+ // be\be_visitor_operation/upcall_command_ss.cpp:127
+
+ class _get_component_ConsumesDef_Upcall_Command
+ : public TAO::Upcall_Command
+ {
+ public:
+ inline _get_component_ConsumesDef_Upcall_Command (
+ POA_CORBA::ComponentIR::ConsumesDef * servant,
+ TAO_Operation_Details const * operation_details,
+ TAO::Argument * const args[])
+ : servant_ (servant)
+ , operation_details_ (operation_details)
+ , args_ (args)
+ {
+ }
+
+ virtual void execute (ACE_ENV_SINGLE_ARG_DECL)
+ {
+ TAO::SArg_Traits< ::CORBA::Object>::ret_arg_type retval =
+ TAO::Portable_Server::get_ret_arg< ::CORBA::Object> (
+ this->operation_details_,
+ this->args_);
+
+ retval =
+ this->servant_-> _get_component (
+ ACE_ENV_SINGLE_ARG_PARAMETER);
+ ACE_CHECK;
+ }
+
+ private:
+ POA_CORBA::ComponentIR::ConsumesDef * const servant_;
+ TAO_Operation_Details const * const operation_details_;
+ TAO::Argument * const * const args_;
+ };
+ }
+
+}
+
+
+void POA_CORBA::ComponentIR::ConsumesDef::_component_skel (
+ TAO_ServerRequest & server_request,
+ void * TAO_INTERCEPTOR (servant_upcall),
+ void * servant
+ ACE_ENV_ARG_DECL
+ )
+{
+#if TAO_HAS_INTERCEPTORS == 1
+ static ::CORBA::TypeCode_ptr const * const exceptions = 0;
+ static ::CORBA::ULong const nexceptions = 0;
+#endif /* TAO_HAS_INTERCEPTORS */
+
+ TAO::SArg_Traits< ::CORBA::Object>::ret_val retval;
+
+ TAO::Argument * const args[] =
+ {
+ &retval
+ };
+
+ static size_t const nargs = 1;
+
+ POA_CORBA::ComponentIR::ConsumesDef * const impl =
+ static_cast<POA_CORBA::ComponentIR::ConsumesDef *> (servant);
+
+ _get_component_ConsumesDef_Upcall_Command command (
+ impl,
+ server_request.operation_details (),
+ args);
+
+ TAO::Upcall_Wrapper upcall_wrapper;
+ upcall_wrapper.upcall (server_request
+ , args
+ , nargs
+ , command
+#if TAO_HAS_INTERCEPTORS == 1
+ , servant_upcall
+ , exceptions
+ , nexceptions
+#endif /* TAO_HAS_INTERCEPTORS == 1 */
+ ACE_ENV_ARG_PARAMETER);
+ ACE_CHECK;
+}
+
+::CORBA::Boolean POA_CORBA::ComponentIR::ConsumesDef::_is_a (
+ const char* value
+ ACE_ENV_ARG_DECL_NOT_USED
+ )
+{
+ return
+ (
+ !ACE_OS::strcmp (
+ value,
+ "IDL:omg.org/CORBA/IRObject:1.0"
+ ) ||
+ !ACE_OS::strcmp (
+ value,
+ "IDL:omg.org/CORBA/Contained:1.0"
+ ) ||
+ !ACE_OS::strcmp (
+ value,
+ "IDL:omg.org/CORBA/ComponentIR/EventPortDef:1.0"
+ ) ||
+ !ACE_OS::strcmp (
+ value,
+ "IDL:omg.org/CORBA/ComponentIR/ConsumesDef:1.0"
+ ) ||
+ !ACE_OS::strcmp (
+ value,
+ "IDL:omg.org/CORBA/Object:1.0"
+ )
+ );
+}
+
+const char* POA_CORBA::ComponentIR::ConsumesDef::_interface_repository_id (void) const
+{
+ return "IDL:omg.org/CORBA/ComponentIR/ConsumesDef:1.0";
+}
+
+// TAO_IDL - Generated from
+// be\be_visitor_interface/interface_ss.cpp:903
+
+void POA_CORBA::ComponentIR::ConsumesDef::_dispatch (
+ TAO_ServerRequest & req,
+ void * servant_upcall
+ ACE_ENV_ARG_DECL
+ )
+{
+ this->synchronous_upcall_dispatch (req,
+ servant_upcall,
+ this
+ ACE_ENV_ARG_PARAMETER);
+}
+
+// TAO_IDL - Generated from
+// be\be_visitor_interface/interface_ss.cpp:851
+
+CORBA::ComponentIR::ConsumesDef *
+POA_CORBA::ComponentIR::ConsumesDef::_this (ACE_ENV_SINGLE_ARG_DECL)
+{
+ TAO_Stub *stub = this->_create_stub (ACE_ENV_SINGLE_ARG_PARAMETER);
+ ACE_CHECK_RETURN (0);
+
+ TAO_Stub_Auto_Ptr safe_stub (stub);
+ ::CORBA::Object_ptr tmp = CORBA::Object::_nil ();
+
+ ::CORBA::Boolean const _tao_opt_colloc =
+ stub->servant_orb_var ()->orb_core ()->optimize_collocation_objects ();
+
+ ACE_NEW_RETURN (
+ tmp,
+ ::CORBA::Object (stub, _tao_opt_colloc, this),
+ 0
+ );
+
+ ::CORBA::Object_var obj = tmp;
+ (void) safe_stub.release ();
+
+ typedef ::CORBA::ComponentIR::ConsumesDef STUB_SCOPED_NAME;
+ return
+ TAO::Narrow_Utils<STUB_SCOPED_NAME>::unchecked_narrow (
+ obj.in (),
+ CORBA_ComponentIR__TAO_ConsumesDef_Proxy_Broker_Factory_function_pointer
+ );
+}
+
+// TAO_IDL - Generated from
+// be\be_interface.cpp:1499
+
+class TAO_CORBA_ComponentIR_ComponentDef_Perfect_Hash_OpTable
+ : public TAO_Perfect_Hash_OpTable
+{
+private:
+ unsigned int hash (const char *str, unsigned int len);
+
+public:
+ const TAO_operation_db_entry * lookup (const char *str, unsigned int len);
+};
+
+/* C++ code produced by gperf version 2.8 (ACE version) */
+/* Command-line: C:\ACE\latest\ACE_wrappers\bin\gperf.exe -m -M -J -c -C -D -E -T -f 0 -F 0,0 -a -o -t -p -K opname -L C++ -Z TAO_CORBA_ComponentIR_ComponentDef_Perfect_Hash_OpTable -N lookup */
+unsigned int
+TAO_CORBA_ComponentIR_ComponentDef_Perfect_Hash_OpTable::hash (const char *str, unsigned int len)
+{
+ static const unsigned char asso_values[] =
+ {
+#if defined (ACE_MVS)
+ 90, 90, 90, 90, 90, 90, 90, 90, 90, 90,
+ 90, 90, 90, 90, 90, 90, 90, 90, 90, 90,
+ 90, 90, 90, 90, 90, 90, 90, 90, 90, 90,
+ 90, 90, 90, 90, 90, 90, 90, 90, 90, 90,
+ 90, 90, 90, 90, 90, 90, 90, 90, 90, 90,
+ 90, 90, 90, 90, 90, 90, 90, 90, 90, 90,
+ 90, 90, 90, 90, 90, 90, 90, 90, 90, 90,
+ 90, 90, 90, 90, 90, 90, 90, 90, 90, 90,
+ 90, 90, 90, 90, 90, 90, 90, 90, 90, 90,
+ 90, 90, 90, 90, 90, 90, 90, 90, 90, 90,
+ 90, 90, 90, 90, 90, 90, 90, 90, 90, 35,
+ 90, 90, 90, 90, 90, 90, 90, 90, 90, 90,
+ 90, 90, 90, 90, 90, 90, 90, 90, 90, 0,
+ 90, 0, 25, 0, 90, 90, 90, 5, 90, 90,
+ 90, 90, 90, 90, 90, 90, 90, 30, 0, 5,
+ 90, 10, 90, 90, 90, 90, 90, 90, 90, 90,
+ 90, 90, 15, 35, 90, 90, 90, 20, 0, 90,
+ 90, 90, 90, 90, 90, 90, 90, 90, 90, 90,
+ 90, 90, 90, 90, 90, 90, 90, 90, 90, 90,
+ 90, 90, 90, 90, 90, 90, 90, 90, 90, 90,
+ 90, 90, 90, 90, 90, 90, 90, 90, 90, 90,
+ 90, 90, 90, 90, 90, 90, 90, 90, 90, 90,
+ 90, 90, 90, 90, 90, 90, 90, 90, 90, 90,
+ 90, 90, 90, 90, 90, 90, 90, 90, 90, 90,
+ 90, 90, 90, 90, 90, 90, 90, 90, 90, 90,
+ 90, 90, 90, 90, 90, 90,
+#else
+ 90, 90, 90, 90, 90, 90, 90, 90, 90, 90,
+ 90, 90, 90, 90, 90, 90, 90, 90, 90, 90,
+ 90, 90, 90, 90, 90, 90, 90, 90, 90, 90,
+ 90, 90, 90, 90, 90, 90, 90, 90, 90, 90,
+ 90, 90, 90, 90, 90, 90, 90, 90, 90, 90,
+ 90, 90, 90, 90, 90, 90, 90, 90, 90, 90,
+ 90, 90, 90, 90, 90, 90, 90, 90, 90, 90,
+ 90, 90, 90, 90, 90, 90, 90, 90, 90, 90,
+ 90, 90, 90, 90, 90, 90, 90, 90, 90, 90,
+ 90, 90, 90, 90, 90, 35, 90, 0, 90, 0,
+ 25, 0, 90, 90, 90, 5, 90, 90, 30, 0,
+ 5, 90, 10, 90, 90, 15, 35, 90, 90, 90,
+ 20, 0, 90, 90, 90, 90, 90, 90,
+#endif /* ACE_MVS */
+ };
+ return len + asso_values[(int) str[len - 1]] + asso_values[(int) str[0]];
+}
+
+const TAO_operation_db_entry *
+TAO_CORBA_ComponentIR_ComponentDef_Perfect_Hash_OpTable::lookup (const char *str, unsigned int len)
+{
+ enum
+ {
+ TOTAL_KEYWORDS = 54,
+ MIN_WORD_LENGTH = 4,
+ MAX_WORD_LENGTH = 26,
+ MIN_HASH_VALUE = 4,
+ MAX_HASH_VALUE = 89,
+ HASH_VALUE_RANGE = 86,
+ DUPLICATES = 14,
+ WORDLIST_SIZE = 58
+ };
+
+ static const TAO_operation_db_entry wordlist[] =
+ {
+ {"",0,0},{"",0,0},{"",0,0},{"",0,0},
+ {"move", &POA_CORBA::ComponentIR::ComponentDef::move_skel, 0},
+ {"is_a", &POA_CORBA::ComponentIR::ComponentDef::is_a_skel, 0},
+ {"create_enum", &POA_CORBA::ComponentIR::ComponentDef::create_enum_skel, 0},
+ {"create_value", &POA_CORBA::ComponentIR::ComponentDef::create_value_skel, 0},
+ {"create_module", &POA_CORBA::ComponentIR::ComponentDef::create_module_skel, 0},
+ {"create_native", &POA_CORBA::ComponentIR::ComponentDef::create_native_skel, 0},
+ {"create_interface", &POA_CORBA::ComponentIR::ComponentDef::create_interface_skel, 0},
+ {"create_attribute", &POA_CORBA::ComponentIR::ComponentDef::create_attribute_skel, 0},
+ {"create_ext_value", &POA_CORBA::ComponentIR::ComponentDef::create_ext_value_skel, 0},
+ {"create_union", &POA_CORBA::ComponentIR::ComponentDef::create_union_skel, 0},
+ {"create_ext_attribute", &POA_CORBA::ComponentIR::ComponentDef::create_ext_attribute_skel, 0},
+ {"create_exception", &POA_CORBA::ComponentIR::ComponentDef::create_exception_skel, 0},
+ {"create_operation", &POA_CORBA::ComponentIR::ComponentDef::create_operation_skel, 0},
+ {"create_local_interface", &POA_CORBA::ComponentIR::ComponentDef::create_local_interface_skel, 0},
+ {"contents", &POA_CORBA::ComponentIR::ComponentDef::contents_skel, 0},
+ {"create_abstract_interface", &POA_CORBA::ComponentIR::ComponentDef::create_abstract_interface_skel, 0},
+ {"create_uses", &POA_CORBA::ComponentIR::ComponentDef::create_uses_skel, 0},
+ {"create_alias", &POA_CORBA::ComponentIR::ComponentDef::create_alias_skel, 0},
+ {"create_emits", &POA_CORBA::ComponentIR::ComponentDef::create_emits_skel, 0},
+ {"create_provides", &POA_CORBA::ComponentIR::ComponentDef::create_provides_skel, 0},
+ {"create_consumes", &POA_CORBA::ComponentIR::ComponentDef::create_consumes_skel, 0},
+ {"create_publishes", &POA_CORBA::ComponentIR::ComponentDef::create_publishes_skel, 0},
+ {"destroy", &POA_CORBA::ComponentIR::ComponentDef::destroy_skel, 0},
+ {"describe", &POA_CORBA::ComponentIR::ComponentDef::describe_skel, 0},
+ {"create_value_box", &POA_CORBA::ComponentIR::ComponentDef::create_value_box_skel, 0},
+ {"_is_a", &POA_CORBA::ComponentIR::ComponentDef::_is_a_skel, 0},
+ {"lookup_name", &POA_CORBA::ComponentIR::ComponentDef::lookup_name_skel, 0},
+ {"describe_interface", &POA_CORBA::ComponentIR::ComponentDef::describe_interface_skel, 0},
+ {"_get_name", &POA_CORBA::ComponentIR::ComponentDef::_get_name_skel, 0},
+ {"_get_type", &POA_CORBA::ComponentIR::ComponentDef::_get_type_skel, 0},
+ {"_set_name", &POA_CORBA::ComponentIR::ComponentDef::_set_name_skel, 0},
+ {"_interface", &POA_CORBA::ComponentIR::ComponentDef::_interface_skel, 0},
+ {"lookup", &POA_CORBA::ComponentIR::ComponentDef::lookup_skel, 0},
+ {"describe_ext_interface", &POA_CORBA::ComponentIR::ComponentDef::describe_ext_interface_skel, 0},
+ {"create_struct", &POA_CORBA::ComponentIR::ComponentDef::create_struct_skel, 0},
+ {"create_constant", &POA_CORBA::ComponentIR::ComponentDef::create_constant_skel, 0},
+ {"_get_version", &POA_CORBA::ComponentIR::ComponentDef::_get_version_skel, 0},
+ {"_set_version", &POA_CORBA::ComponentIR::ComponentDef::_set_version_skel, 0},
+ {"_get_absolute_name", &POA_CORBA::ComponentIR::ComponentDef::_get_absolute_name_skel, 0},
+ {"_get_defined_in", &POA_CORBA::ComponentIR::ComponentDef::_get_defined_in_skel, 0},
+ {"describe_contents", &POA_CORBA::ComponentIR::ComponentDef::describe_contents_skel, 0},
+ {"_get_containing_repository", &POA_CORBA::ComponentIR::ComponentDef::_get_containing_repository_skel, 0},
+ {"_get_id", &POA_CORBA::ComponentIR::ComponentDef::_get_id_skel, 0},
+ {"_set_id", &POA_CORBA::ComponentIR::ComponentDef::_set_id_skel, 0},
+ {"_get_base_interfaces", &POA_CORBA::ComponentIR::ComponentDef::_get_base_interfaces_skel, 0},
+ {"_set_base_interfaces", &POA_CORBA::ComponentIR::ComponentDef::_set_base_interfaces_skel, 0},
+ {"_get_def_kind", &POA_CORBA::ComponentIR::ComponentDef::_get_def_kind_skel, 0},
+ {"_repository_id", &POA_CORBA::ComponentIR::ComponentDef::_repository_id_skel, 0},
+ {"_get_supported_interfaces", &POA_CORBA::ComponentIR::ComponentDef::_get_supported_interfaces_skel, 0},
+ {"_set_supported_interfaces", &POA_CORBA::ComponentIR::ComponentDef::_set_supported_interfaces_skel, 0},
+ {"_component", &POA_CORBA::ComponentIR::ComponentDef::_component_skel, 0},
+ {"_non_existent", &POA_CORBA::ComponentIR::ComponentDef::_non_existent_skel, 0},
+ {"_get_base_component", &POA_CORBA::ComponentIR::ComponentDef::_get_base_component_skel, 0},
+ {"_set_base_component", &POA_CORBA::ComponentIR::ComponentDef::_set_base_component_skel, 0},
+ };
+
+ static const signed char lookup[] =
+ {
+ -1, -1, -1, -1, 4, -8, -2, -10, -3, 5, -1, 6, 7, -97,
+ -15, -2, -98, 13, -21, -2, 14, -96, 17, 18, -1, 19, 20, -98,
+ -23, -2, -91, 25, 26, 27, -32, -3, 28, -1, -40, -2, 29, 30,
+ -1, 31, -99, 35, 36, 37, 38, -1, 39, -1, -103, 42, -1, 43,
+ -1, 44, -1, -1, -1, 45, -1, -1, -1, -46, -2, -91, -48, -2,
+ -91, -52, -2, 50, 51, -93, -1, -1, -1, -1, 54, -1, -1, 55,
+ -1, -1, -1, -56, -2, -91,
+ };
+
+ if (len <= MAX_WORD_LENGTH && len >= MIN_WORD_LENGTH)
+ {
+ unsigned int key = hash (str, len);
+
+ if (key <= MAX_HASH_VALUE && key >= MIN_HASH_VALUE)
+ {
+ int slot = lookup[key];
+
+ if (slot >= 0 && slot < WORDLIST_SIZE)
+ {
+ const char *s = wordlist[slot].opname;
+
+ if (*str == *s && !strncmp (str + 1, s + 1, len - 1))
+ return &wordlist[slot];
+ }
+ else if (slot < 0 && slot >= -MAX_HASH_VALUE)
+ return 0;
+ else
+ {
+ unsigned int offset = key + slot + (slot > 0 ? -MAX_HASH_VALUE : MAX_HASH_VALUE);
+ const TAO_operation_db_entry *base = &wordlist[-lookup[offset]];
+ const TAO_operation_db_entry *ptr = base + -lookup[offset + 1];
+
+ while (--ptr >= base)
+ if (*str == *ptr->opname && !strncmp (str + 1, ptr->opname + 1, len - 1))
+ return ptr;
+ }
+ }
+ }
+ return 0;
+}
+
+static TAO_CORBA_ComponentIR_ComponentDef_Perfect_Hash_OpTable tao_CORBA_ComponentIR_ComponentDef_optable;
+
+// TAO_IDL - Generated from
+// be\be_visitor_interface/interface_ss.cpp:966
+
+TAO::Collocation_Proxy_Broker *
+CORBA_ComponentIR__TAO_ComponentDef_Proxy_Broker_Factory_function ( ::CORBA::Object_ptr)
+{
+ return reinterpret_cast<TAO::Collocation_Proxy_Broker *> (0xdead); // Dummy
+}
+
+int
+CORBA_ComponentIR__TAO_ComponentDef_Proxy_Broker_Factory_Initializer (size_t)
+{
+ CORBA_ComponentIR__TAO_ComponentDef_Proxy_Broker_Factory_function_pointer =
+ CORBA_ComponentIR__TAO_ComponentDef_Proxy_Broker_Factory_function;
+
+ return 0;
+}
+
+static int
+CORBA_ComponentIR__TAO_ComponentDef_Proxy_Broker_Stub_Factory_Initializer_Scarecrow =
+ CORBA_ComponentIR__TAO_ComponentDef_Proxy_Broker_Factory_Initializer (
+ reinterpret_cast<size_t> (CORBA_ComponentIR__TAO_ComponentDef_Proxy_Broker_Factory_Initializer)
+ );
+
+// TAO_IDL - Generated from
+// be\be_visitor_interface/interface_ss.cpp:103
+
+POA_CORBA::ComponentIR::ComponentDef::ComponentDef (void)
+ : TAO_ServantBase ()
+{
+ this->optable_ = &tao_CORBA_ComponentIR_ComponentDef_optable;
+}
+
+POA_CORBA::ComponentIR::ComponentDef::ComponentDef (const ComponentDef& rhs)
+ : TAO_Abstract_ServantBase (rhs),
+ TAO_ServantBase (rhs),
+ POA_CORBA::IRObject (rhs),
+ POA_CORBA::Container (rhs),
+ POA_CORBA::Contained (rhs),
+ POA_CORBA::IDLType (rhs),
+ POA_CORBA::InterfaceDef (rhs),
+ POA_CORBA::InterfaceAttrExtension (rhs),
+ POA_CORBA::ExtInterfaceDef (rhs)
+{
+}
+
+POA_CORBA::ComponentIR::ComponentDef::~ComponentDef (void)
+{
+}namespace POA_CORBA
+{
+ namespace ComponentIR
+ {
+
+
+ // TAO_IDL - Generated from
+ // be\be_visitor_operation/upcall_command_ss.cpp:127
+
+ class _get_base_component_ComponentDef
+ : public TAO::Upcall_Command
+ {
+ public:
+ inline _get_base_component_ComponentDef (
+ POA_CORBA::ComponentIR::ComponentDef * servant,
+ TAO_Operation_Details const * operation_details,
+ TAO::Argument * const args[])
+ : servant_ (servant)
+ , operation_details_ (operation_details)
+ , args_ (args)
+ {
+ }
+
+ virtual void execute (ACE_ENV_SINGLE_ARG_DECL)
+ {
+ TAO::SArg_Traits< ::CORBA::ComponentIR::ComponentDef>::ret_arg_type retval =
+ TAO::Portable_Server::get_ret_arg< ::CORBA::ComponentIR::ComponentDef> (
+ this->operation_details_,
+ this->args_);
+
+ retval =
+ this->servant_->base_component (
+ ACE_ENV_SINGLE_ARG_PARAMETER);
+ ACE_CHECK;
+ }
+
+ private:
+ POA_CORBA::ComponentIR::ComponentDef * const servant_;
+ TAO_Operation_Details const * const operation_details_;
+ TAO::Argument * const * const args_;
+ };
+ }
+
+}
+
+
+// TAO_IDL - Generated from
+// be\be_visitor_operation/operation_ss.cpp:190
+
+void POA_CORBA::ComponentIR::ComponentDef::_get_base_component_skel (
+ TAO_ServerRequest & server_request,
+ void * TAO_INTERCEPTOR (servant_upcall),
+ void * servant
+ ACE_ENV_ARG_DECL
+ )
+{
+#if TAO_HAS_INTERCEPTORS == 1
+ static ::CORBA::TypeCode_ptr const * const exceptions = 0;
+ static ::CORBA::ULong const nexceptions = 0;
+#endif /* TAO_HAS_INTERCEPTORS */
+
+ TAO::SArg_Traits< ::CORBA::ComponentIR::ComponentDef>::ret_val retval;
+
+ TAO::Argument * const args[] =
+ {
+ &retval
+ };
+
+ static size_t const nargs = 1;
+
+ POA_CORBA::ComponentIR::ComponentDef * const impl =
+ static_cast<POA_CORBA::ComponentIR::ComponentDef *> (servant);
+
+ _get_base_component_ComponentDef command (
+ impl,
+ server_request.operation_details (),
+ args);
+
+ TAO::Upcall_Wrapper upcall_wrapper;
+ upcall_wrapper.upcall (server_request
+ , args
+ , nargs
+ , command
+#if TAO_HAS_INTERCEPTORS == 1
+ , servant_upcall
+ , exceptions
+ , nexceptions
+#endif /* TAO_HAS_INTERCEPTORS == 1 */
+ ACE_ENV_ARG_PARAMETER);
+ ACE_CHECK;
+}namespace POA_CORBA
+{
+ namespace ComponentIR
+ {
+
+
+ // TAO_IDL - Generated from
+ // be\be_visitor_operation/upcall_command_ss.cpp:127
+
+ class _set_base_component_ComponentDef
+ : public TAO::Upcall_Command
+ {
+ public:
+ inline _set_base_component_ComponentDef (
+ POA_CORBA::ComponentIR::ComponentDef * servant,
+ TAO_Operation_Details const * operation_details,
+ TAO::Argument * const args[])
+ : servant_ (servant)
+ , operation_details_ (operation_details)
+ , args_ (args)
+ {
+ }
+
+ virtual void execute (ACE_ENV_SINGLE_ARG_DECL)
+ {
+ TAO::SArg_Traits< ::CORBA::ComponentIR::ComponentDef>::in_arg_type arg_1 =
+ TAO::Portable_Server::get_in_arg< ::CORBA::ComponentIR::ComponentDef> (
+ this->operation_details_,
+ this->args_,
+ 1);
+
+ this->servant_->base_component (
+ arg_1
+ ACE_ENV_ARG_PARAMETER);
+ ACE_CHECK;
+ }
+
+ private:
+ POA_CORBA::ComponentIR::ComponentDef * const servant_;
+ TAO_Operation_Details const * const operation_details_;
+ TAO::Argument * const * const args_;
+ };
+ }
+
+}
+
+
+// TAO_IDL - Generated from
+// be\be_visitor_operation/operation_ss.cpp:190
+
+void POA_CORBA::ComponentIR::ComponentDef::_set_base_component_skel (
+ TAO_ServerRequest & server_request,
+ void * TAO_INTERCEPTOR (servant_upcall),
+ void * servant
+ ACE_ENV_ARG_DECL
+ )
+{
+#if TAO_HAS_INTERCEPTORS == 1
+ static ::CORBA::TypeCode_ptr const * const exceptions = 0;
+ static ::CORBA::ULong const nexceptions = 0;
+#endif /* TAO_HAS_INTERCEPTORS */
+
+ TAO::SArg_Traits< void>::ret_val retval;
+ TAO::SArg_Traits< ::CORBA::ComponentIR::ComponentDef>::in_arg_val _tao_base_component;
+
+ TAO::Argument * const args[] =
+ {
+ &retval,
+ &_tao_base_component
+ };
+
+ static size_t const nargs = 2;
+
+ POA_CORBA::ComponentIR::ComponentDef * const impl =
+ static_cast<POA_CORBA::ComponentIR::ComponentDef *> (servant);
+
+ _set_base_component_ComponentDef command (
+ impl,
+ server_request.operation_details (),
+ args);
+
+ TAO::Upcall_Wrapper upcall_wrapper;
+ upcall_wrapper.upcall (server_request
+ , args
+ , nargs
+ , command
+#if TAO_HAS_INTERCEPTORS == 1
+ , servant_upcall
+ , exceptions
+ , nexceptions
+#endif /* TAO_HAS_INTERCEPTORS == 1 */
+ ACE_ENV_ARG_PARAMETER);
+ ACE_CHECK;
+}namespace POA_CORBA
+{
+ namespace ComponentIR
+ {
+
+
+ // TAO_IDL - Generated from
+ // be\be_visitor_operation/upcall_command_ss.cpp:127
+
+ class _get_supported_interfaces_ComponentDef
+ : public TAO::Upcall_Command
+ {
+ public:
+ inline _get_supported_interfaces_ComponentDef (
+ POA_CORBA::ComponentIR::ComponentDef * servant,
+ TAO_Operation_Details const * operation_details,
+ TAO::Argument * const args[])
+ : servant_ (servant)
+ , operation_details_ (operation_details)
+ , args_ (args)
+ {
+ }
+
+ virtual void execute (ACE_ENV_SINGLE_ARG_DECL)
+ {
+ TAO::SArg_Traits< ::CORBA::InterfaceDefSeq>::ret_arg_type retval =
+ TAO::Portable_Server::get_ret_arg< ::CORBA::InterfaceDefSeq> (
+ this->operation_details_,
+ this->args_);
+
+ retval =
+ this->servant_->supported_interfaces (
+ ACE_ENV_SINGLE_ARG_PARAMETER);
+ ACE_CHECK;
+ }
+
+ private:
+ POA_CORBA::ComponentIR::ComponentDef * const servant_;
+ TAO_Operation_Details const * const operation_details_;
+ TAO::Argument * const * const args_;
+ };
+ }
+
+}
+
+
+// TAO_IDL - Generated from
+// be\be_visitor_operation/operation_ss.cpp:190
+
+void POA_CORBA::ComponentIR::ComponentDef::_get_supported_interfaces_skel (
+ TAO_ServerRequest & server_request,
+ void * TAO_INTERCEPTOR (servant_upcall),
+ void * servant
+ ACE_ENV_ARG_DECL
+ )
+{
+#if TAO_HAS_INTERCEPTORS == 1
+ static ::CORBA::TypeCode_ptr const * const exceptions = 0;
+ static ::CORBA::ULong const nexceptions = 0;
+#endif /* TAO_HAS_INTERCEPTORS */
+
+ TAO::SArg_Traits< ::CORBA::InterfaceDefSeq>::ret_val retval;
+
+ TAO::Argument * const args[] =
+ {
+ &retval
+ };
+
+ static size_t const nargs = 1;
+
+ POA_CORBA::ComponentIR::ComponentDef * const impl =
+ static_cast<POA_CORBA::ComponentIR::ComponentDef *> (servant);
+
+ _get_supported_interfaces_ComponentDef command (
+ impl,
+ server_request.operation_details (),
+ args);
+
+ TAO::Upcall_Wrapper upcall_wrapper;
+ upcall_wrapper.upcall (server_request
+ , args
+ , nargs
+ , command
+#if TAO_HAS_INTERCEPTORS == 1
+ , servant_upcall
+ , exceptions
+ , nexceptions
+#endif /* TAO_HAS_INTERCEPTORS == 1 */
+ ACE_ENV_ARG_PARAMETER);
+ ACE_CHECK;
+}namespace POA_CORBA
+{
+ namespace ComponentIR
+ {
+
+
+ // TAO_IDL - Generated from
+ // be\be_visitor_operation/upcall_command_ss.cpp:127
+
+ class _set_supported_interfaces_ComponentDef
+ : public TAO::Upcall_Command
+ {
+ public:
+ inline _set_supported_interfaces_ComponentDef (
+ POA_CORBA::ComponentIR::ComponentDef * servant,
+ TAO_Operation_Details const * operation_details,
+ TAO::Argument * const args[])
+ : servant_ (servant)
+ , operation_details_ (operation_details)
+ , args_ (args)
+ {
+ }
+
+ virtual void execute (ACE_ENV_SINGLE_ARG_DECL)
+ {
+ TAO::SArg_Traits< ::CORBA::InterfaceDefSeq>::in_arg_type arg_1 =
+ TAO::Portable_Server::get_in_arg< ::CORBA::InterfaceDefSeq> (
+ this->operation_details_,
+ this->args_,
+ 1);
+
+ this->servant_->supported_interfaces (
+ arg_1
+ ACE_ENV_ARG_PARAMETER);
+ ACE_CHECK;
+ }
+
+ private:
+ POA_CORBA::ComponentIR::ComponentDef * const servant_;
+ TAO_Operation_Details const * const operation_details_;
+ TAO::Argument * const * const args_;
+ };
+ }
+
+}
+
+
+// TAO_IDL - Generated from
+// be\be_visitor_operation/operation_ss.cpp:190
+
+void POA_CORBA::ComponentIR::ComponentDef::_set_supported_interfaces_skel (
+ TAO_ServerRequest & server_request,
+ void * TAO_INTERCEPTOR (servant_upcall),
+ void * servant
+ ACE_ENV_ARG_DECL
+ )
+{
+#if TAO_HAS_INTERCEPTORS == 1
+ static ::CORBA::TypeCode_ptr const * const exceptions = 0;
+ static ::CORBA::ULong const nexceptions = 0;
+#endif /* TAO_HAS_INTERCEPTORS */
+
+ TAO::SArg_Traits< void>::ret_val retval;
+ TAO::SArg_Traits< ::CORBA::InterfaceDefSeq>::in_arg_val _tao_supported_interfaces;
+
+ TAO::Argument * const args[] =
+ {
+ &retval,
+ &_tao_supported_interfaces
+ };
+
+ static size_t const nargs = 2;
+
+ POA_CORBA::ComponentIR::ComponentDef * const impl =
+ static_cast<POA_CORBA::ComponentIR::ComponentDef *> (servant);
+
+ _set_supported_interfaces_ComponentDef command (
+ impl,
+ server_request.operation_details (),
+ args);
+
+ TAO::Upcall_Wrapper upcall_wrapper;
+ upcall_wrapper.upcall (server_request
+ , args
+ , nargs
+ , command
+#if TAO_HAS_INTERCEPTORS == 1
+ , servant_upcall
+ , exceptions
+ , nexceptions
+#endif /* TAO_HAS_INTERCEPTORS == 1 */
+ ACE_ENV_ARG_PARAMETER);
+ ACE_CHECK;
+}namespace POA_CORBA
+{
+ namespace ComponentIR
+ {
+
+
+ // TAO_IDL - Generated from
+ // be\be_visitor_operation/upcall_command_ss.cpp:127
+
+ class create_provides_ComponentDef
+ : public TAO::Upcall_Command
+ {
+ public:
+ inline create_provides_ComponentDef (
+ POA_CORBA::ComponentIR::ComponentDef * servant,
+ TAO_Operation_Details const * operation_details,
+ TAO::Argument * const args[])
+ : servant_ (servant)
+ , operation_details_ (operation_details)
+ , args_ (args)
+ {
+ }
+
+ virtual void execute (ACE_ENV_SINGLE_ARG_DECL)
+ {
+ TAO::SArg_Traits< ::CORBA::ComponentIR::ProvidesDef>::ret_arg_type retval =
+ TAO::Portable_Server::get_ret_arg< ::CORBA::ComponentIR::ProvidesDef> (
+ this->operation_details_,
+ this->args_);
+
+ TAO::SArg_Traits< ::CORBA::RepositoryId>::in_arg_type arg_1 =
+ TAO::Portable_Server::get_in_arg< ::CORBA::RepositoryId> (
+ this->operation_details_,
+ this->args_,
+ 1);
+
+ TAO::SArg_Traits< ::CORBA::Identifier>::in_arg_type arg_2 =
+ TAO::Portable_Server::get_in_arg< ::CORBA::Identifier> (
+ this->operation_details_,
+ this->args_,
+ 2);
+
+ TAO::SArg_Traits< ::CORBA::VersionSpec>::in_arg_type arg_3 =
+ TAO::Portable_Server::get_in_arg< ::CORBA::VersionSpec> (
+ this->operation_details_,
+ this->args_,
+ 3);
+
+ TAO::SArg_Traits< ::CORBA::InterfaceDef>::in_arg_type arg_4 =
+ TAO::Portable_Server::get_in_arg< ::CORBA::InterfaceDef> (
+ this->operation_details_,
+ this->args_,
+ 4);
+
+ retval =
+ this->servant_->create_provides (
+ arg_1
+ , arg_2
+ , arg_3
+ , arg_4
+ ACE_ENV_ARG_PARAMETER);
+ ACE_CHECK;
+ }
+
+ private:
+ POA_CORBA::ComponentIR::ComponentDef * const servant_;
+ TAO_Operation_Details const * const operation_details_;
+ TAO::Argument * const * const args_;
+ };
+ }
+
+}
+
+
+// TAO_IDL - Generated from
+// be\be_visitor_operation/operation_ss.cpp:190
+
+void POA_CORBA::ComponentIR::ComponentDef::create_provides_skel (
+ TAO_ServerRequest & server_request,
+ void * TAO_INTERCEPTOR (servant_upcall),
+ void * servant
+ ACE_ENV_ARG_DECL
+ )
+{
+#if TAO_HAS_INTERCEPTORS == 1
+ static ::CORBA::TypeCode_ptr const * const exceptions = 0;
+ static ::CORBA::ULong const nexceptions = 0;
+#endif /* TAO_HAS_INTERCEPTORS */
+
+ TAO::SArg_Traits< ::CORBA::ComponentIR::ProvidesDef>::ret_val retval;
+ TAO::SArg_Traits< ::CORBA::RepositoryId>::in_arg_val _tao_id;
+ TAO::SArg_Traits< ::CORBA::Identifier>::in_arg_val _tao_name;
+ TAO::SArg_Traits< ::CORBA::VersionSpec>::in_arg_val _tao_version;
+ TAO::SArg_Traits< ::CORBA::InterfaceDef>::in_arg_val _tao_interface_type;
+
+ TAO::Argument * const args[] =
+ {
+ &retval,
+ &_tao_id,
+ &_tao_name,
+ &_tao_version,
+ &_tao_interface_type
+ };
+
+ static size_t const nargs = 5;
+
+ POA_CORBA::ComponentIR::ComponentDef * const impl =
+ static_cast<POA_CORBA::ComponentIR::ComponentDef *> (servant);
+
+ create_provides_ComponentDef command (
+ impl,
+ server_request.operation_details (),
+ args);
+
+ TAO::Upcall_Wrapper upcall_wrapper;
+ upcall_wrapper.upcall (server_request
+ , args
+ , nargs
+ , command
+#if TAO_HAS_INTERCEPTORS == 1
+ , servant_upcall
+ , exceptions
+ , nexceptions
+#endif /* TAO_HAS_INTERCEPTORS == 1 */
+ ACE_ENV_ARG_PARAMETER);
+ ACE_CHECK;
+}namespace POA_CORBA
+{
+ namespace ComponentIR
+ {
+
+
+ // TAO_IDL - Generated from
+ // be\be_visitor_operation/upcall_command_ss.cpp:127
+
+ class create_uses_ComponentDef
+ : public TAO::Upcall_Command
+ {
+ public:
+ inline create_uses_ComponentDef (
+ POA_CORBA::ComponentIR::ComponentDef * servant,
+ TAO_Operation_Details const * operation_details,
+ TAO::Argument * const args[])
+ : servant_ (servant)
+ , operation_details_ (operation_details)
+ , args_ (args)
+ {
+ }
+
+ virtual void execute (ACE_ENV_SINGLE_ARG_DECL)
+ {
+ TAO::SArg_Traits< ::CORBA::ComponentIR::UsesDef>::ret_arg_type retval =
+ TAO::Portable_Server::get_ret_arg< ::CORBA::ComponentIR::UsesDef> (
+ this->operation_details_,
+ this->args_);
+
+ TAO::SArg_Traits< ::CORBA::RepositoryId>::in_arg_type arg_1 =
+ TAO::Portable_Server::get_in_arg< ::CORBA::RepositoryId> (
+ this->operation_details_,
+ this->args_,
+ 1);
+
+ TAO::SArg_Traits< ::CORBA::Identifier>::in_arg_type arg_2 =
+ TAO::Portable_Server::get_in_arg< ::CORBA::Identifier> (
+ this->operation_details_,
+ this->args_,
+ 2);
+
+ TAO::SArg_Traits< ::CORBA::VersionSpec>::in_arg_type arg_3 =
+ TAO::Portable_Server::get_in_arg< ::CORBA::VersionSpec> (
+ this->operation_details_,
+ this->args_,
+ 3);
+
+ TAO::SArg_Traits< ::CORBA::InterfaceDef>::in_arg_type arg_4 =
+ TAO::Portable_Server::get_in_arg< ::CORBA::InterfaceDef> (
+ this->operation_details_,
+ this->args_,
+ 4);
+
+ TAO::SArg_Traits< ::ACE_InputCDR::to_boolean>::in_arg_type arg_5 =
+ TAO::Portable_Server::get_in_arg< ::ACE_InputCDR::to_boolean> (
+ this->operation_details_,
+ this->args_,
+ 5);
+
+ retval =
+ this->servant_->create_uses (
+ arg_1
+ , arg_2
+ , arg_3
+ , arg_4
+ , arg_5
+ ACE_ENV_ARG_PARAMETER);
+ ACE_CHECK;
+ }
+
+ private:
+ POA_CORBA::ComponentIR::ComponentDef * const servant_;
+ TAO_Operation_Details const * const operation_details_;
+ TAO::Argument * const * const args_;
+ };
+ }
+
+}
+
+
+// TAO_IDL - Generated from
+// be\be_visitor_operation/operation_ss.cpp:190
+
+void POA_CORBA::ComponentIR::ComponentDef::create_uses_skel (
+ TAO_ServerRequest & server_request,
+ void * TAO_INTERCEPTOR (servant_upcall),
+ void * servant
+ ACE_ENV_ARG_DECL
+ )
+{
+#if TAO_HAS_INTERCEPTORS == 1
+ static ::CORBA::TypeCode_ptr const * const exceptions = 0;
+ static ::CORBA::ULong const nexceptions = 0;
+#endif /* TAO_HAS_INTERCEPTORS */
+
+ TAO::SArg_Traits< ::CORBA::ComponentIR::UsesDef>::ret_val retval;
+ TAO::SArg_Traits< ::CORBA::RepositoryId>::in_arg_val _tao_id;
+ TAO::SArg_Traits< ::CORBA::Identifier>::in_arg_val _tao_name;
+ TAO::SArg_Traits< ::CORBA::VersionSpec>::in_arg_val _tao_version;
+ TAO::SArg_Traits< ::CORBA::InterfaceDef>::in_arg_val _tao_interface_type;
+ TAO::SArg_Traits< ::ACE_InputCDR::to_boolean>::in_arg_val _tao_is_multiple;
+
+ TAO::Argument * const args[] =
+ {
+ &retval,
+ &_tao_id,
+ &_tao_name,
+ &_tao_version,
+ &_tao_interface_type,
+ &_tao_is_multiple
+ };
+
+ static size_t const nargs = 6;
+
+ POA_CORBA::ComponentIR::ComponentDef * const impl =
+ static_cast<POA_CORBA::ComponentIR::ComponentDef *> (servant);
+
+ create_uses_ComponentDef command (
+ impl,
+ server_request.operation_details (),
+ args);
+
+ TAO::Upcall_Wrapper upcall_wrapper;
+ upcall_wrapper.upcall (server_request
+ , args
+ , nargs
+ , command
+#if TAO_HAS_INTERCEPTORS == 1
+ , servant_upcall
+ , exceptions
+ , nexceptions
+#endif /* TAO_HAS_INTERCEPTORS == 1 */
+ ACE_ENV_ARG_PARAMETER);
+ ACE_CHECK;
+}namespace POA_CORBA
+{
+ namespace ComponentIR
+ {
+
+
+ // TAO_IDL - Generated from
+ // be\be_visitor_operation/upcall_command_ss.cpp:127
+
+ class create_emits_ComponentDef
+ : public TAO::Upcall_Command
+ {
+ public:
+ inline create_emits_ComponentDef (
+ POA_CORBA::ComponentIR::ComponentDef * servant,
+ TAO_Operation_Details const * operation_details,
+ TAO::Argument * const args[])
+ : servant_ (servant)
+ , operation_details_ (operation_details)
+ , args_ (args)
+ {
+ }
+
+ virtual void execute (ACE_ENV_SINGLE_ARG_DECL)
+ {
+ TAO::SArg_Traits< ::CORBA::ComponentIR::EmitsDef>::ret_arg_type retval =
+ TAO::Portable_Server::get_ret_arg< ::CORBA::ComponentIR::EmitsDef> (
+ this->operation_details_,
+ this->args_);
+
+ TAO::SArg_Traits< ::CORBA::RepositoryId>::in_arg_type arg_1 =
+ TAO::Portable_Server::get_in_arg< ::CORBA::RepositoryId> (
+ this->operation_details_,
+ this->args_,
+ 1);
+
+ TAO::SArg_Traits< ::CORBA::Identifier>::in_arg_type arg_2 =
+ TAO::Portable_Server::get_in_arg< ::CORBA::Identifier> (
+ this->operation_details_,
+ this->args_,
+ 2);
+
+ TAO::SArg_Traits< ::CORBA::VersionSpec>::in_arg_type arg_3 =
+ TAO::Portable_Server::get_in_arg< ::CORBA::VersionSpec> (
+ this->operation_details_,
+ this->args_,
+ 3);
+
+ TAO::SArg_Traits< ::CORBA::ComponentIR::EventDef>::in_arg_type arg_4 =
+ TAO::Portable_Server::get_in_arg< ::CORBA::ComponentIR::EventDef> (
+ this->operation_details_,
+ this->args_,
+ 4);
+
+ retval =
+ this->servant_->create_emits (
+ arg_1
+ , arg_2
+ , arg_3
+ , arg_4
+ ACE_ENV_ARG_PARAMETER);
+ ACE_CHECK;
+ }
+
+ private:
+ POA_CORBA::ComponentIR::ComponentDef * const servant_;
+ TAO_Operation_Details const * const operation_details_;
+ TAO::Argument * const * const args_;
+ };
+ }
+
+}
+
+
+// TAO_IDL - Generated from
+// be\be_visitor_operation/operation_ss.cpp:190
+
+void POA_CORBA::ComponentIR::ComponentDef::create_emits_skel (
+ TAO_ServerRequest & server_request,
+ void * TAO_INTERCEPTOR (servant_upcall),
+ void * servant
+ ACE_ENV_ARG_DECL
+ )
+{
+#if TAO_HAS_INTERCEPTORS == 1
+ static ::CORBA::TypeCode_ptr const * const exceptions = 0;
+ static ::CORBA::ULong const nexceptions = 0;
+#endif /* TAO_HAS_INTERCEPTORS */
+
+ TAO::SArg_Traits< ::CORBA::ComponentIR::EmitsDef>::ret_val retval;
+ TAO::SArg_Traits< ::CORBA::RepositoryId>::in_arg_val _tao_id;
+ TAO::SArg_Traits< ::CORBA::Identifier>::in_arg_val _tao_name;
+ TAO::SArg_Traits< ::CORBA::VersionSpec>::in_arg_val _tao_version;
+ TAO::SArg_Traits< ::CORBA::ComponentIR::EventDef>::in_arg_val _tao_event;
+
+ TAO::Argument * const args[] =
+ {
+ &retval,
+ &_tao_id,
+ &_tao_name,
+ &_tao_version,
+ &_tao_event
+ };
+
+ static size_t const nargs = 5;
+
+ POA_CORBA::ComponentIR::ComponentDef * const impl =
+ static_cast<POA_CORBA::ComponentIR::ComponentDef *> (servant);
+
+ create_emits_ComponentDef command (
+ impl,
+ server_request.operation_details (),
+ args);
+
+ TAO::Upcall_Wrapper upcall_wrapper;
+ upcall_wrapper.upcall (server_request
+ , args
+ , nargs
+ , command
+#if TAO_HAS_INTERCEPTORS == 1
+ , servant_upcall
+ , exceptions
+ , nexceptions
+#endif /* TAO_HAS_INTERCEPTORS == 1 */
+ ACE_ENV_ARG_PARAMETER);
+ ACE_CHECK;
+}namespace POA_CORBA
+{
+ namespace ComponentIR
+ {
+
+
+ // TAO_IDL - Generated from
+ // be\be_visitor_operation/upcall_command_ss.cpp:127
+
+ class create_publishes_ComponentDef
+ : public TAO::Upcall_Command
+ {
+ public:
+ inline create_publishes_ComponentDef (
+ POA_CORBA::ComponentIR::ComponentDef * servant,
+ TAO_Operation_Details const * operation_details,
+ TAO::Argument * const args[])
+ : servant_ (servant)
+ , operation_details_ (operation_details)
+ , args_ (args)
+ {
+ }
+
+ virtual void execute (ACE_ENV_SINGLE_ARG_DECL)
+ {
+ TAO::SArg_Traits< ::CORBA::ComponentIR::PublishesDef>::ret_arg_type retval =
+ TAO::Portable_Server::get_ret_arg< ::CORBA::ComponentIR::PublishesDef> (
+ this->operation_details_,
+ this->args_);
+
+ TAO::SArg_Traits< ::CORBA::RepositoryId>::in_arg_type arg_1 =
+ TAO::Portable_Server::get_in_arg< ::CORBA::RepositoryId> (
+ this->operation_details_,
+ this->args_,
+ 1);
+
+ TAO::SArg_Traits< ::CORBA::Identifier>::in_arg_type arg_2 =
+ TAO::Portable_Server::get_in_arg< ::CORBA::Identifier> (
+ this->operation_details_,
+ this->args_,
+ 2);
+
+ TAO::SArg_Traits< ::CORBA::VersionSpec>::in_arg_type arg_3 =
+ TAO::Portable_Server::get_in_arg< ::CORBA::VersionSpec> (
+ this->operation_details_,
+ this->args_,
+ 3);
+
+ TAO::SArg_Traits< ::CORBA::ComponentIR::EventDef>::in_arg_type arg_4 =
+ TAO::Portable_Server::get_in_arg< ::CORBA::ComponentIR::EventDef> (
+ this->operation_details_,
+ this->args_,
+ 4);
+
+ retval =
+ this->servant_->create_publishes (
+ arg_1
+ , arg_2
+ , arg_3
+ , arg_4
+ ACE_ENV_ARG_PARAMETER);
+ ACE_CHECK;
+ }
+
+ private:
+ POA_CORBA::ComponentIR::ComponentDef * const servant_;
+ TAO_Operation_Details const * const operation_details_;
+ TAO::Argument * const * const args_;
+ };
+ }
+
+}
+
+
+// TAO_IDL - Generated from
+// be\be_visitor_operation/operation_ss.cpp:190
+
+void POA_CORBA::ComponentIR::ComponentDef::create_publishes_skel (
+ TAO_ServerRequest & server_request,
+ void * TAO_INTERCEPTOR (servant_upcall),
+ void * servant
+ ACE_ENV_ARG_DECL
+ )
+{
+#if TAO_HAS_INTERCEPTORS == 1
+ static ::CORBA::TypeCode_ptr const * const exceptions = 0;
+ static ::CORBA::ULong const nexceptions = 0;
+#endif /* TAO_HAS_INTERCEPTORS */
+
+ TAO::SArg_Traits< ::CORBA::ComponentIR::PublishesDef>::ret_val retval;
+ TAO::SArg_Traits< ::CORBA::RepositoryId>::in_arg_val _tao_id;
+ TAO::SArg_Traits< ::CORBA::Identifier>::in_arg_val _tao_name;
+ TAO::SArg_Traits< ::CORBA::VersionSpec>::in_arg_val _tao_version;
+ TAO::SArg_Traits< ::CORBA::ComponentIR::EventDef>::in_arg_val _tao_event;
+
+ TAO::Argument * const args[] =
+ {
+ &retval,
+ &_tao_id,
+ &_tao_name,
+ &_tao_version,
+ &_tao_event
+ };
+
+ static size_t const nargs = 5;
+
+ POA_CORBA::ComponentIR::ComponentDef * const impl =
+ static_cast<POA_CORBA::ComponentIR::ComponentDef *> (servant);
+
+ create_publishes_ComponentDef command (
+ impl,
+ server_request.operation_details (),
+ args);
+
+ TAO::Upcall_Wrapper upcall_wrapper;
+ upcall_wrapper.upcall (server_request
+ , args
+ , nargs
+ , command
+#if TAO_HAS_INTERCEPTORS == 1
+ , servant_upcall
+ , exceptions
+ , nexceptions
+#endif /* TAO_HAS_INTERCEPTORS == 1 */
+ ACE_ENV_ARG_PARAMETER);
+ ACE_CHECK;
+}namespace POA_CORBA
+{
+ namespace ComponentIR
+ {
+
+
+ // TAO_IDL - Generated from
+ // be\be_visitor_operation/upcall_command_ss.cpp:127
+
+ class create_consumes_ComponentDef
+ : public TAO::Upcall_Command
+ {
+ public:
+ inline create_consumes_ComponentDef (
+ POA_CORBA::ComponentIR::ComponentDef * servant,
+ TAO_Operation_Details const * operation_details,
+ TAO::Argument * const args[])
+ : servant_ (servant)
+ , operation_details_ (operation_details)
+ , args_ (args)
+ {
+ }
+
+ virtual void execute (ACE_ENV_SINGLE_ARG_DECL)
+ {
+ TAO::SArg_Traits< ::CORBA::ComponentIR::ConsumesDef>::ret_arg_type retval =
+ TAO::Portable_Server::get_ret_arg< ::CORBA::ComponentIR::ConsumesDef> (
+ this->operation_details_,
+ this->args_);
+
+ TAO::SArg_Traits< ::CORBA::RepositoryId>::in_arg_type arg_1 =
+ TAO::Portable_Server::get_in_arg< ::CORBA::RepositoryId> (
+ this->operation_details_,
+ this->args_,
+ 1);
+
+ TAO::SArg_Traits< ::CORBA::Identifier>::in_arg_type arg_2 =
+ TAO::Portable_Server::get_in_arg< ::CORBA::Identifier> (
+ this->operation_details_,
+ this->args_,
+ 2);
+
+ TAO::SArg_Traits< ::CORBA::VersionSpec>::in_arg_type arg_3 =
+ TAO::Portable_Server::get_in_arg< ::CORBA::VersionSpec> (
+ this->operation_details_,
+ this->args_,
+ 3);
+
+ TAO::SArg_Traits< ::CORBA::ComponentIR::EventDef>::in_arg_type arg_4 =
+ TAO::Portable_Server::get_in_arg< ::CORBA::ComponentIR::EventDef> (
+ this->operation_details_,
+ this->args_,
+ 4);
+
+ retval =
+ this->servant_->create_consumes (
+ arg_1
+ , arg_2
+ , arg_3
+ , arg_4
+ ACE_ENV_ARG_PARAMETER);
+ ACE_CHECK;
+ }
+
+ private:
+ POA_CORBA::ComponentIR::ComponentDef * const servant_;
+ TAO_Operation_Details const * const operation_details_;
+ TAO::Argument * const * const args_;
+ };
+ }
+
+}
+
+
+// TAO_IDL - Generated from
+// be\be_visitor_operation/operation_ss.cpp:190
+
+void POA_CORBA::ComponentIR::ComponentDef::create_consumes_skel (
+ TAO_ServerRequest & server_request,
+ void * TAO_INTERCEPTOR (servant_upcall),
+ void * servant
+ ACE_ENV_ARG_DECL
+ )
+{
+#if TAO_HAS_INTERCEPTORS == 1
+ static ::CORBA::TypeCode_ptr const * const exceptions = 0;
+ static ::CORBA::ULong const nexceptions = 0;
+#endif /* TAO_HAS_INTERCEPTORS */
+
+ TAO::SArg_Traits< ::CORBA::ComponentIR::ConsumesDef>::ret_val retval;
+ TAO::SArg_Traits< ::CORBA::RepositoryId>::in_arg_val _tao_id;
+ TAO::SArg_Traits< ::CORBA::Identifier>::in_arg_val _tao_name;
+ TAO::SArg_Traits< ::CORBA::VersionSpec>::in_arg_val _tao_version;
+ TAO::SArg_Traits< ::CORBA::ComponentIR::EventDef>::in_arg_val _tao_event;
+
+ TAO::Argument * const args[] =
+ {
+ &retval,
+ &_tao_id,
+ &_tao_name,
+ &_tao_version,
+ &_tao_event
+ };
+
+ static size_t const nargs = 5;
+
+ POA_CORBA::ComponentIR::ComponentDef * const impl =
+ static_cast<POA_CORBA::ComponentIR::ComponentDef *> (servant);
+
+ create_consumes_ComponentDef command (
+ impl,
+ server_request.operation_details (),
+ args);
+
+ TAO::Upcall_Wrapper upcall_wrapper;
+ upcall_wrapper.upcall (server_request
+ , args
+ , nargs
+ , command
+#if TAO_HAS_INTERCEPTORS == 1
+ , servant_upcall
+ , exceptions
+ , nexceptions
+#endif /* TAO_HAS_INTERCEPTORS == 1 */
+ ACE_ENV_ARG_PARAMETER);
+ ACE_CHECK;
+}
+
+// TAO_IDL - Generated from
+// be\be_visitor_interface/interface_ss.cpp:169
+
+namespace POA_CORBA
+{
+ namespace ComponentIR
+ {
+
+
+ // TAO_IDL - Generated from
+ // be\be_visitor_operation/upcall_command_ss.cpp:127
+
+ class _is_a_ComponentDef_Upcall_Command
+ : public TAO::Upcall_Command
+ {
+ public:
+ inline _is_a_ComponentDef_Upcall_Command (
+ POA_CORBA::ComponentIR::ComponentDef * servant,
+ TAO_Operation_Details const * operation_details,
+ TAO::Argument * const args[])
+ : servant_ (servant)
+ , operation_details_ (operation_details)
+ , args_ (args)
+ {
+ }
+
+ virtual void execute (ACE_ENV_SINGLE_ARG_DECL)
+ {
+ TAO::SArg_Traits< ::ACE_InputCDR::to_boolean>::ret_arg_type retval =
+ TAO::Portable_Server::get_ret_arg< ::ACE_InputCDR::to_boolean> (
+ this->operation_details_,
+ this->args_);
+
+ TAO::SArg_Traits< ::CORBA::Char *>::in_arg_type arg_1 =
+ TAO::Portable_Server::get_in_arg< ::CORBA::Char *> (
+ this->operation_details_,
+ this->args_,
+ 1);
+
+ retval =
+ this->servant_-> _is_a (
+ arg_1
+ ACE_ENV_ARG_PARAMETER);
+ ACE_CHECK;
+ }
+
+ private:
+ POA_CORBA::ComponentIR::ComponentDef * const servant_;
+ TAO_Operation_Details const * const operation_details_;
+ TAO::Argument * const * const args_;
+ };
+ }
+
+}
+
+
+void POA_CORBA::ComponentIR::ComponentDef::_is_a_skel (
+ TAO_ServerRequest & server_request,
+ void * TAO_INTERCEPTOR (servant_upcall),
+ void * servant
+ ACE_ENV_ARG_DECL
+ )
+{
+#if TAO_HAS_INTERCEPTORS == 1
+ static ::CORBA::TypeCode_ptr const * const exceptions = 0;
+ static ::CORBA::ULong const nexceptions = 0;
+#endif /* TAO_HAS_INTERCEPTORS */
+
+ TAO::SArg_Traits< ::ACE_InputCDR::to_boolean>::ret_val retval;
+ TAO::SArg_Traits< ::CORBA::Char *>::in_arg_val _tao_repository_id;
+
+ TAO::Argument * const args[] =
+ {
+ &retval,
+ &_tao_repository_id
+ };
+
+ static size_t const nargs = 2;
+
+ POA_CORBA::ComponentIR::ComponentDef * const impl =
+ static_cast<POA_CORBA::ComponentIR::ComponentDef *> (servant);
+
+ _is_a_ComponentDef_Upcall_Command command (
+ impl,
+ server_request.operation_details (),
+ args);
+
+ TAO::Upcall_Wrapper upcall_wrapper;
+ upcall_wrapper.upcall (server_request
+ , args
+ , nargs
+ , command
+#if TAO_HAS_INTERCEPTORS == 1
+ , servant_upcall
+ , exceptions
+ , nexceptions
+#endif /* TAO_HAS_INTERCEPTORS == 1 */
+ ACE_ENV_ARG_PARAMETER);
+ ACE_CHECK;
+}namespace POA_CORBA
+{
+ namespace ComponentIR
+ {
+
+
+ // TAO_IDL - Generated from
+ // be\be_visitor_operation/upcall_command_ss.cpp:127
+
+ class _non_existent_ComponentDef_Upcall_Command
+ : public TAO::Upcall_Command
+ {
+ public:
+ inline _non_existent_ComponentDef_Upcall_Command (
+ POA_CORBA::ComponentIR::ComponentDef * servant,
+ TAO_Operation_Details const * operation_details,
+ TAO::Argument * const args[])
+ : servant_ (servant)
+ , operation_details_ (operation_details)
+ , args_ (args)
+ {
+ }
+
+ virtual void execute (ACE_ENV_SINGLE_ARG_DECL)
+ {
+ TAO::SArg_Traits< ::ACE_InputCDR::to_boolean>::ret_arg_type retval =
+ TAO::Portable_Server::get_ret_arg< ::ACE_InputCDR::to_boolean> (
+ this->operation_details_,
+ this->args_);
+
+ retval =
+ this->servant_-> _non_existent (
+ ACE_ENV_SINGLE_ARG_PARAMETER);
+ ACE_CHECK;
+ }
+
+ private:
+ POA_CORBA::ComponentIR::ComponentDef * const servant_;
+ TAO_Operation_Details const * const operation_details_;
+ TAO::Argument * const * const args_;
+ };
+ }
+
+}
+
+
+void POA_CORBA::ComponentIR::ComponentDef::_non_existent_skel (
+ TAO_ServerRequest & server_request,
+ void * TAO_INTERCEPTOR (servant_upcall),
+ void * servant
+ ACE_ENV_ARG_DECL
+ )
+{
+#if TAO_HAS_INTERCEPTORS == 1
+ static ::CORBA::TypeCode_ptr const * const exceptions = 0;
+ static ::CORBA::ULong const nexceptions = 0;
+#endif /* TAO_HAS_INTERCEPTORS */
+
+ TAO::SArg_Traits< ::ACE_InputCDR::to_boolean>::ret_val retval;
+
+ TAO::Argument * const args[] =
+ {
+ &retval
+ };
+
+ static size_t const nargs = 1;
+
+ POA_CORBA::ComponentIR::ComponentDef * const impl =
+ static_cast<POA_CORBA::ComponentIR::ComponentDef *> (servant);
+
+ _non_existent_ComponentDef_Upcall_Command command (
+ impl,
+ server_request.operation_details (),
+ args);
+
+ TAO::Upcall_Wrapper upcall_wrapper;
+ upcall_wrapper.upcall (server_request
+ , args
+ , nargs
+ , command
+#if TAO_HAS_INTERCEPTORS == 1
+ , servant_upcall
+ , exceptions
+ , nexceptions
+#endif /* TAO_HAS_INTERCEPTORS == 1 */
+ ACE_ENV_ARG_PARAMETER);
+ ACE_CHECK;
+}namespace POA_CORBA
+{
+ namespace ComponentIR
+ {
+
+
+ // TAO_IDL - Generated from
+ // be\be_visitor_operation/upcall_command_ss.cpp:127
+
+ class _repository_id_ComponentDef_Upcall_Command
+ : public TAO::Upcall_Command
+ {
+ public:
+ inline _repository_id_ComponentDef_Upcall_Command (
+ POA_CORBA::ComponentIR::ComponentDef * servant,
+ TAO_Operation_Details const * operation_details,
+ TAO::Argument * const args[])
+ : servant_ (servant)
+ , operation_details_ (operation_details)
+ , args_ (args)
+ {
+ }
+
+ virtual void execute (ACE_ENV_SINGLE_ARG_DECL)
+ {
+ TAO::SArg_Traits< ::CORBA::Char *>::ret_arg_type retval =
+ TAO::Portable_Server::get_ret_arg< ::CORBA::Char *> (
+ this->operation_details_,
+ this->args_);
+
+ retval =
+ this->servant_-> _repository_id (
+ ACE_ENV_SINGLE_ARG_PARAMETER);
+ ACE_CHECK;
+ }
+
+ private:
+ POA_CORBA::ComponentIR::ComponentDef * const servant_;
+ TAO_Operation_Details const * const operation_details_;
+ TAO::Argument * const * const args_;
+ };
+ }
+
+}
+
+
+void POA_CORBA::ComponentIR::ComponentDef::_repository_id_skel (
+ TAO_ServerRequest & server_request,
+ void * TAO_INTERCEPTOR (servant_upcall),
+ void * servant
+ ACE_ENV_ARG_DECL
+ )
+{
+#if TAO_HAS_INTERCEPTORS == 1
+ static ::CORBA::TypeCode_ptr const * const exceptions = 0;
+ static ::CORBA::ULong const nexceptions = 0;
+#endif /* TAO_HAS_INTERCEPTORS */
+
+ TAO::SArg_Traits< ::CORBA::Char *>::ret_val retval;
+
+ TAO::Argument * const args[] =
+ {
+ &retval
+ };
+
+ static size_t const nargs = 1;
+
+ POA_CORBA::ComponentIR::ComponentDef * const impl =
+ static_cast<POA_CORBA::ComponentIR::ComponentDef *> (servant);
+
+ _repository_id_ComponentDef_Upcall_Command command (
+ impl,
+ server_request.operation_details (),
+ args);
+
+ TAO::Upcall_Wrapper upcall_wrapper;
+ upcall_wrapper.upcall (server_request
+ , args
+ , nargs
+ , command
+#if TAO_HAS_INTERCEPTORS == 1
+ , servant_upcall
+ , exceptions
+ , nexceptions
+#endif /* TAO_HAS_INTERCEPTORS == 1 */
+ ACE_ENV_ARG_PARAMETER);
+ ACE_CHECK;
+}
+
+// TAO_IDL - Generated from
+// be\be_visitor_interface/interface_ss.cpp:513
+
+void POA_CORBA::ComponentIR::ComponentDef::_interface_skel (
+ TAO_ServerRequest & server_request,
+ void * /* servant_upcall */,
+ void * servant
+ ACE_ENV_ARG_DECL
+ )
+{
+ TAO_IFR_Client_Adapter *_tao_adapter =
+ ACE_Dynamic_Service<TAO_IFR_Client_Adapter>::instance (
+ TAO_ORB_Core::ifr_client_adapter_name ()
+ );
+
+ if (_tao_adapter == 0)
+ {
+ ACE_THROW ( ::CORBA::INTF_REPOS ( ::CORBA::OMGVMCID | 1,
+ ::CORBA::COMPLETED_NO));
+ }
+
+ POA_CORBA::ComponentIR::ComponentDef * const impl =
+ static_cast<POA_CORBA::ComponentIR::ComponentDef *> (servant);
+ ::CORBA::InterfaceDef_ptr _tao_retval =
+ impl->_get_interface (ACE_ENV_SINGLE_ARG_PARAMETER);
+ ACE_CHECK;
+
+ server_request.init_reply ();
+ TAO_OutputCDR &_tao_out = *server_request.outgoing ();
+
+ ::CORBA::Boolean const _tao_result =
+ _tao_adapter->interfacedef_cdr_insert (
+ _tao_out,
+ _tao_retval
+ );
+
+ _tao_adapter->dispose (_tao_retval);
+
+ if (_tao_result == false)
+ {
+ ACE_THROW ( ::CORBA::MARSHAL ());
+ }
+}namespace POA_CORBA
+{
+ namespace ComponentIR
+ {
+
+
+ // TAO_IDL - Generated from
+ // be\be_visitor_operation/upcall_command_ss.cpp:127
+
+ class _get_component_ComponentDef_Upcall_Command
+ : public TAO::Upcall_Command
+ {
+ public:
+ inline _get_component_ComponentDef_Upcall_Command (
+ POA_CORBA::ComponentIR::ComponentDef * servant,
+ TAO_Operation_Details const * operation_details,
+ TAO::Argument * const args[])
+ : servant_ (servant)
+ , operation_details_ (operation_details)
+ , args_ (args)
+ {
+ }
+
+ virtual void execute (ACE_ENV_SINGLE_ARG_DECL)
+ {
+ TAO::SArg_Traits< ::CORBA::Object>::ret_arg_type retval =
+ TAO::Portable_Server::get_ret_arg< ::CORBA::Object> (
+ this->operation_details_,
+ this->args_);
+
+ retval =
+ this->servant_-> _get_component (
+ ACE_ENV_SINGLE_ARG_PARAMETER);
+ ACE_CHECK;
+ }
+
+ private:
+ POA_CORBA::ComponentIR::ComponentDef * const servant_;
+ TAO_Operation_Details const * const operation_details_;
+ TAO::Argument * const * const args_;
+ };
+ }
+
+}
+
+
+void POA_CORBA::ComponentIR::ComponentDef::_component_skel (
+ TAO_ServerRequest & server_request,
+ void * TAO_INTERCEPTOR (servant_upcall),
+ void * servant
+ ACE_ENV_ARG_DECL
+ )
+{
+#if TAO_HAS_INTERCEPTORS == 1
+ static ::CORBA::TypeCode_ptr const * const exceptions = 0;
+ static ::CORBA::ULong const nexceptions = 0;
+#endif /* TAO_HAS_INTERCEPTORS */
+
+ TAO::SArg_Traits< ::CORBA::Object>::ret_val retval;
+
+ TAO::Argument * const args[] =
+ {
+ &retval
+ };
+
+ static size_t const nargs = 1;
+
+ POA_CORBA::ComponentIR::ComponentDef * const impl =
+ static_cast<POA_CORBA::ComponentIR::ComponentDef *> (servant);
+
+ _get_component_ComponentDef_Upcall_Command command (
+ impl,
+ server_request.operation_details (),
+ args);
+
+ TAO::Upcall_Wrapper upcall_wrapper;
+ upcall_wrapper.upcall (server_request
+ , args
+ , nargs
+ , command
+#if TAO_HAS_INTERCEPTORS == 1
+ , servant_upcall
+ , exceptions
+ , nexceptions
+#endif /* TAO_HAS_INTERCEPTORS == 1 */
+ ACE_ENV_ARG_PARAMETER);
+ ACE_CHECK;
+}
+
+::CORBA::Boolean POA_CORBA::ComponentIR::ComponentDef::_is_a (
+ const char* value
+ ACE_ENV_ARG_DECL_NOT_USED
+ )
+{
+ return
+ (
+ !ACE_OS::strcmp (
+ value,
+ "IDL:omg.org/CORBA/IRObject:1.0"
+ ) ||
+ !ACE_OS::strcmp (
+ value,
+ "IDL:omg.org/CORBA/Container:1.0"
+ ) ||
+ !ACE_OS::strcmp (
+ value,
+ "IDL:omg.org/CORBA/Contained:1.0"
+ ) ||
+ !ACE_OS::strcmp (
+ value,
+ "IDL:omg.org/CORBA/IDLType:1.0"
+ ) ||
+ !ACE_OS::strcmp (
+ value,
+ "IDL:omg.org/CORBA/InterfaceDef:1.0"
+ ) ||
+ !ACE_OS::strcmp (
+ value,
+ "IDL:omg.org/CORBA/InterfaceAttrExtension:1.0"
+ ) ||
+ !ACE_OS::strcmp (
+ value,
+ "IDL:omg.org/CORBA/ExtInterfaceDef:1.0"
+ ) ||
+ !ACE_OS::strcmp (
+ value,
+ "IDL:omg.org/CORBA/ComponentIR/ComponentDef:1.0"
+ ) ||
+ !ACE_OS::strcmp (
+ value,
+ "IDL:omg.org/CORBA/Object:1.0"
+ )
+ );
+}
+
+const char* POA_CORBA::ComponentIR::ComponentDef::_interface_repository_id (void) const
+{
+ return "IDL:omg.org/CORBA/ComponentIR/ComponentDef:1.0";
+}
+
+// TAO_IDL - Generated from
+// be\be_visitor_interface/interface_ss.cpp:903
+
+void POA_CORBA::ComponentIR::ComponentDef::_dispatch (
+ TAO_ServerRequest & req,
+ void * servant_upcall
+ ACE_ENV_ARG_DECL
+ )
+{
+ this->synchronous_upcall_dispatch (req,
+ servant_upcall,
+ this
+ ACE_ENV_ARG_PARAMETER);
+}
+
+// TAO_IDL - Generated from
+// be\be_visitor_interface/interface_ss.cpp:851
+
+CORBA::ComponentIR::ComponentDef *
+POA_CORBA::ComponentIR::ComponentDef::_this (ACE_ENV_SINGLE_ARG_DECL)
+{
+ TAO_Stub *stub = this->_create_stub (ACE_ENV_SINGLE_ARG_PARAMETER);
+ ACE_CHECK_RETURN (0);
+
+ TAO_Stub_Auto_Ptr safe_stub (stub);
+ ::CORBA::Object_ptr tmp = CORBA::Object::_nil ();
+
+ ::CORBA::Boolean const _tao_opt_colloc =
+ stub->servant_orb_var ()->orb_core ()->optimize_collocation_objects ();
+
+ ACE_NEW_RETURN (
+ tmp,
+ ::CORBA::Object (stub, _tao_opt_colloc, this),
+ 0
+ );
+
+ ::CORBA::Object_var obj = tmp;
+ (void) safe_stub.release ();
+
+ typedef ::CORBA::ComponentIR::ComponentDef STUB_SCOPED_NAME;
+ return
+ TAO::Narrow_Utils<STUB_SCOPED_NAME>::unchecked_narrow (
+ obj.in (),
+ CORBA_ComponentIR__TAO_ComponentDef_Proxy_Broker_Factory_function_pointer
+ );
+}
+
+// TAO_IDL - Generated from
+// be\be_interface.cpp:1499
+
+class TAO_CORBA_ComponentIR_FactoryDef_Perfect_Hash_OpTable
+ : public TAO_Perfect_Hash_OpTable
+{
+private:
+ unsigned int hash (const char *str, unsigned int len);
+
+public:
+ const TAO_operation_db_entry * lookup (const char *str, unsigned int len);
+};
+
+/* C++ code produced by gperf version 2.8 (ACE version) */
+/* Command-line: C:\ACE\latest\ACE_wrappers\bin\gperf.exe -m -M -J -c -C -D -E -T -f 0 -F 0,0 -a -o -t -p -K opname -L C++ -Z TAO_CORBA_ComponentIR_FactoryDef_Perfect_Hash_OpTable -N lookup */
+unsigned int
+TAO_CORBA_ComponentIR_FactoryDef_Perfect_Hash_OpTable::hash (const char *str, unsigned int len)
+{
+ static const unsigned char asso_values[] =
+ {
+#if defined (ACE_MVS)
+ 37, 37, 37, 37, 37, 37, 37, 37, 37, 37,
+ 37, 37, 37, 37, 37, 37, 37, 37, 37, 37,
+ 37, 37, 37, 37, 37, 37, 37, 37, 37, 37,
+ 37, 37, 37, 37, 37, 37, 37, 37, 37, 37,
+ 37, 37, 37, 37, 37, 37, 37, 37, 37, 37,
+ 37, 37, 37, 37, 37, 37, 37, 37, 37, 37,
+ 37, 37, 37, 37, 37, 37, 37, 37, 37, 37,
+ 37, 37, 37, 37, 37, 37, 37, 37, 37, 37,
+ 37, 37, 37, 37, 37, 37, 37, 37, 37, 37,
+ 37, 37, 37, 37, 37, 37, 37, 37, 37, 37,
+ 37, 37, 37, 37, 37, 37, 37, 37, 37, 0,
+ 37, 37, 37, 37, 37, 37, 37, 37, 37, 37,
+ 37, 37, 37, 37, 37, 37, 37, 37, 37, 0,
+ 37, 37, 15, 0, 10, 37, 37, 37, 37, 37,
+ 37, 37, 37, 37, 37, 37, 37, 37, 0, 5,
+ 37, 37, 37, 37, 37, 37, 37, 37, 37, 37,
+ 37, 37, 0, 20, 37, 37, 37, 37, 10, 37,
+ 37, 37, 37, 37, 37, 37, 37, 37, 37, 37,
+ 37, 37, 37, 37, 37, 37, 37, 37, 37, 37,
+ 37, 37, 37, 37, 37, 37, 37, 37, 37, 37,
+ 37, 37, 37, 37, 37, 37, 37, 37, 37, 37,
+ 37, 37, 37, 37, 37, 37, 37, 37, 37, 37,
+ 37, 37, 37, 37, 37, 37, 37, 37, 37, 37,
+ 37, 37, 37, 37, 37, 37, 37, 37, 37, 37,
+ 37, 37, 37, 37, 37, 37, 37, 37, 37, 37,
+ 37, 37, 37, 37, 37, 37,
+#else
+ 37, 37, 37, 37, 37, 37, 37, 37, 37, 37,
+ 37, 37, 37, 37, 37, 37, 37, 37, 37, 37,
+ 37, 37, 37, 37, 37, 37, 37, 37, 37, 37,
+ 37, 37, 37, 37, 37, 37, 37, 37, 37, 37,
+ 37, 37, 37, 37, 37, 37, 37, 37, 37, 37,
+ 37, 37, 37, 37, 37, 37, 37, 37, 37, 37,
+ 37, 37, 37, 37, 37, 37, 37, 37, 37, 37,
+ 37, 37, 37, 37, 37, 37, 37, 37, 37, 37,
+ 37, 37, 37, 37, 37, 37, 37, 37, 37, 37,
+ 37, 37, 37, 37, 37, 0, 37, 0, 37, 37,
+ 15, 0, 10, 37, 37, 37, 37, 37, 37, 0,
+ 5, 37, 37, 37, 37, 0, 20, 37, 37, 37,
+ 37, 10, 37, 37, 37, 37, 37, 37,
+#endif /* ACE_MVS */
+ };
+ return len + asso_values[(int) str[len - 1]] + asso_values[(int) str[0]];
+}
+
+const TAO_operation_db_entry *
+TAO_CORBA_ComponentIR_FactoryDef_Perfect_Hash_OpTable::lookup (const char *str, unsigned int len)
+{
+ enum
+ {
+ TOTAL_KEYWORDS = 29,
+ MIN_WORD_LENGTH = 4,
+ MAX_WORD_LENGTH = 26,
+ MIN_HASH_VALUE = 4,
+ MAX_HASH_VALUE = 36,
+ HASH_VALUE_RANGE = 33,
+ DUPLICATES = 10,
+ WORDLIST_SIZE = 33
+ };
+
+ static const TAO_operation_db_entry wordlist[] =
+ {
+ {"",0,0},{"",0,0},{"",0,0},{"",0,0},
+ {"move", &POA_CORBA::ComponentIR::FactoryDef::move_skel, 0},
+ {"_is_a", &POA_CORBA::ComponentIR::FactoryDef::_is_a_skel, 0},
+ {"_get_name", &POA_CORBA::ComponentIR::FactoryDef::_get_name_skel, 0},
+ {"_set_mode", &POA_CORBA::ComponentIR::FactoryDef::_set_mode_skel, 0},
+ {"_get_mode", &POA_CORBA::ComponentIR::FactoryDef::_get_mode_skel, 0},
+ {"_set_name", &POA_CORBA::ComponentIR::FactoryDef::_set_name_skel, 0},
+ {"_interface", &POA_CORBA::ComponentIR::FactoryDef::_interface_skel, 0},
+ {"_get_params", &POA_CORBA::ComponentIR::FactoryDef::_get_params_skel, 0},
+ {"_set_params", &POA_CORBA::ComponentIR::FactoryDef::_set_params_skel, 0},
+ {"_get_contexts", &POA_CORBA::ComponentIR::FactoryDef::_get_contexts_skel, 0},
+ {"_set_contexts", &POA_CORBA::ComponentIR::FactoryDef::_set_contexts_skel, 0},
+ {"_get_exceptions", &POA_CORBA::ComponentIR::FactoryDef::_get_exceptions_skel, 0},
+ {"_set_exceptions", &POA_CORBA::ComponentIR::FactoryDef::_set_exceptions_skel, 0},
+ {"_get_version", &POA_CORBA::ComponentIR::FactoryDef::_get_version_skel, 0},
+ {"_set_version", &POA_CORBA::ComponentIR::FactoryDef::_set_version_skel, 0},
+ {"_get_absolute_name", &POA_CORBA::ComponentIR::FactoryDef::_get_absolute_name_skel, 0},
+ {"_get_defined_in", &POA_CORBA::ComponentIR::FactoryDef::_get_defined_in_skel, 0},
+ {"_get_id", &POA_CORBA::ComponentIR::FactoryDef::_get_id_skel, 0},
+ {"_set_id", &POA_CORBA::ComponentIR::FactoryDef::_set_id_skel, 0},
+ {"describe", &POA_CORBA::ComponentIR::FactoryDef::describe_skel, 0},
+ {"_get_result_def", &POA_CORBA::ComponentIR::FactoryDef::_get_result_def_skel, 0},
+ {"_set_result_def", &POA_CORBA::ComponentIR::FactoryDef::_set_result_def_skel, 0},
+ {"_get_def_kind", &POA_CORBA::ComponentIR::FactoryDef::_get_def_kind_skel, 0},
+ {"_repository_id", &POA_CORBA::ComponentIR::FactoryDef::_repository_id_skel, 0},
+ {"_component", &POA_CORBA::ComponentIR::FactoryDef::_component_skel, 0},
+ {"_get_result", &POA_CORBA::ComponentIR::FactoryDef::_get_result_skel, 0},
+ {"destroy", &POA_CORBA::ComponentIR::FactoryDef::destroy_skel, 0},
+ {"_non_existent", &POA_CORBA::ComponentIR::FactoryDef::_non_existent_skel, 0},
+ {"_get_containing_repository", &POA_CORBA::ComponentIR::FactoryDef::_get_containing_repository_skel, 0},
+ };
+
+ if (len <= MAX_WORD_LENGTH && len >= MIN_WORD_LENGTH)
+ {
+ unsigned int key = hash (str, len);
+
+ if (key <= MAX_HASH_VALUE && key >= MIN_HASH_VALUE)
+ {
+ {
+ const TAO_operation_db_entry *resword;
+
+ switch (key)
+ {
+ case 4:
+ resword = &wordlist[4]; break;
+ case 5:
+ resword = &wordlist[5]; break;
+ case 9:
+ resword = &wordlist[6];
+ if (*str == *resword->opname && !strncmp (str + 1, resword->opname + 1, len - 1)) return resword;
+ resword = &wordlist[7];
+ if (*str == *resword->opname && !strncmp (str + 1, resword->opname + 1, len - 1)) return resword;
+ resword = &wordlist[8];
+ if (*str == *resword->opname && !strncmp (str + 1, resword->opname + 1, len - 1)) return resword;
+ resword = &wordlist[9];
+ if (*str == *resword->opname && !strncmp (str + 1, resword->opname + 1, len - 1)) return resword;
+ return 0;
+ case 10:
+ resword = &wordlist[10]; break;
+ case 11:
+ resword = &wordlist[11];
+ if (*str == *resword->opname && !strncmp (str + 1, resword->opname + 1, len - 1)) return resword;
+ resword = &wordlist[12];
+ if (*str == *resword->opname && !strncmp (str + 1, resword->opname + 1, len - 1)) return resword;
+ return 0;
+ case 13:
+ resword = &wordlist[13];
+ if (*str == *resword->opname && !strncmp (str + 1, resword->opname + 1, len - 1)) return resword;
+ resword = &wordlist[14];
+ if (*str == *resword->opname && !strncmp (str + 1, resword->opname + 1, len - 1)) return resword;
+ return 0;
+ case 15:
+ resword = &wordlist[15];
+ if (*str == *resword->opname && !strncmp (str + 1, resword->opname + 1, len - 1)) return resword;
+ resword = &wordlist[16];
+ if (*str == *resword->opname && !strncmp (str + 1, resword->opname + 1, len - 1)) return resword;
+ return 0;
+ case 17:
+ resword = &wordlist[17];
+ if (*str == *resword->opname && !strncmp (str + 1, resword->opname + 1, len - 1)) return resword;
+ resword = &wordlist[18];
+ if (*str == *resword->opname && !strncmp (str + 1, resword->opname + 1, len - 1)) return resword;
+ return 0;
+ case 18:
+ resword = &wordlist[19]; break;
+ case 20:
+ resword = &wordlist[20]; break;
+ case 22:
+ resword = &wordlist[21];
+ if (*str == *resword->opname && !strncmp (str + 1, resword->opname + 1, len - 1)) return resword;
+ resword = &wordlist[22];
+ if (*str == *resword->opname && !strncmp (str + 1, resword->opname + 1, len - 1)) return resword;
+ return 0;
+ case 23:
+ resword = &wordlist[23]; break;
+ case 25:
+ resword = &wordlist[24];
+ if (*str == *resword->opname && !strncmp (str + 1, resword->opname + 1, len - 1)) return resword;
+ resword = &wordlist[25];
+ if (*str == *resword->opname && !strncmp (str + 1, resword->opname + 1, len - 1)) return resword;
+ return 0;
+ case 28:
+ resword = &wordlist[26]; break;
+ case 29:
+ resword = &wordlist[27]; break;
+ case 30:
+ resword = &wordlist[28]; break;
+ case 31:
+ resword = &wordlist[29]; break;
+ case 32:
+ resword = &wordlist[30]; break;
+ case 33:
+ resword = &wordlist[31]; break;
+ case 36:
+ resword = &wordlist[32]; break;
+ default: return 0;
+ }
+ if (*str == *resword->opname && !strncmp (str + 1, resword->opname + 1, len - 1))
+ return resword;
+ return 0;
+ }
+ }
+ }
+ return 0;
+}
+
+static TAO_CORBA_ComponentIR_FactoryDef_Perfect_Hash_OpTable tao_CORBA_ComponentIR_FactoryDef_optable;
+
+// TAO_IDL - Generated from
+// be\be_visitor_interface/interface_ss.cpp:966
+
+TAO::Collocation_Proxy_Broker *
+CORBA_ComponentIR__TAO_FactoryDef_Proxy_Broker_Factory_function ( ::CORBA::Object_ptr)
+{
+ return reinterpret_cast<TAO::Collocation_Proxy_Broker *> (0xdead); // Dummy
+}
+
+int
+CORBA_ComponentIR__TAO_FactoryDef_Proxy_Broker_Factory_Initializer (size_t)
+{
+ CORBA_ComponentIR__TAO_FactoryDef_Proxy_Broker_Factory_function_pointer =
+ CORBA_ComponentIR__TAO_FactoryDef_Proxy_Broker_Factory_function;
+
+ return 0;
+}
+
+static int
+CORBA_ComponentIR__TAO_FactoryDef_Proxy_Broker_Stub_Factory_Initializer_Scarecrow =
+ CORBA_ComponentIR__TAO_FactoryDef_Proxy_Broker_Factory_Initializer (
+ reinterpret_cast<size_t> (CORBA_ComponentIR__TAO_FactoryDef_Proxy_Broker_Factory_Initializer)
+ );
+
+// TAO_IDL - Generated from
+// be\be_visitor_interface/interface_ss.cpp:103
+
+POA_CORBA::ComponentIR::FactoryDef::FactoryDef (void)
+ : TAO_ServantBase ()
+{
+ this->optable_ = &tao_CORBA_ComponentIR_FactoryDef_optable;
+}
+
+POA_CORBA::ComponentIR::FactoryDef::FactoryDef (const FactoryDef& rhs)
+ : TAO_Abstract_ServantBase (rhs),
+ TAO_ServantBase (rhs),
+ POA_CORBA::IRObject (rhs),
+ POA_CORBA::Contained (rhs),
+ POA_CORBA::OperationDef (rhs)
+{
+}
+
+POA_CORBA::ComponentIR::FactoryDef::~FactoryDef (void)
+{
+}
+
+// TAO_IDL - Generated from
+// be\be_visitor_interface/interface_ss.cpp:169
+
+namespace POA_CORBA
+{
+ namespace ComponentIR
+ {
+
+
+ // TAO_IDL - Generated from
+ // be\be_visitor_operation/upcall_command_ss.cpp:127
+
+ class _is_a_FactoryDef_Upcall_Command
+ : public TAO::Upcall_Command
+ {
+ public:
+ inline _is_a_FactoryDef_Upcall_Command (
+ POA_CORBA::ComponentIR::FactoryDef * servant,
+ TAO_Operation_Details const * operation_details,
+ TAO::Argument * const args[])
+ : servant_ (servant)
+ , operation_details_ (operation_details)
+ , args_ (args)
+ {
+ }
+
+ virtual void execute (ACE_ENV_SINGLE_ARG_DECL)
+ {
+ TAO::SArg_Traits< ::ACE_InputCDR::to_boolean>::ret_arg_type retval =
+ TAO::Portable_Server::get_ret_arg< ::ACE_InputCDR::to_boolean> (
+ this->operation_details_,
+ this->args_);
+
+ TAO::SArg_Traits< ::CORBA::Char *>::in_arg_type arg_1 =
+ TAO::Portable_Server::get_in_arg< ::CORBA::Char *> (
+ this->operation_details_,
+ this->args_,
+ 1);
+
+ retval =
+ this->servant_-> _is_a (
+ arg_1
+ ACE_ENV_ARG_PARAMETER);
+ ACE_CHECK;
+ }
+
+ private:
+ POA_CORBA::ComponentIR::FactoryDef * const servant_;
+ TAO_Operation_Details const * const operation_details_;
+ TAO::Argument * const * const args_;
+ };
+ }
+
+}
+
+
+void POA_CORBA::ComponentIR::FactoryDef::_is_a_skel (
+ TAO_ServerRequest & server_request,
+ void * TAO_INTERCEPTOR (servant_upcall),
+ void * servant
+ ACE_ENV_ARG_DECL
+ )
+{
+#if TAO_HAS_INTERCEPTORS == 1
+ static ::CORBA::TypeCode_ptr const * const exceptions = 0;
+ static ::CORBA::ULong const nexceptions = 0;
+#endif /* TAO_HAS_INTERCEPTORS */
+
+ TAO::SArg_Traits< ::ACE_InputCDR::to_boolean>::ret_val retval;
+ TAO::SArg_Traits< ::CORBA::Char *>::in_arg_val _tao_repository_id;
+
+ TAO::Argument * const args[] =
+ {
+ &retval,
+ &_tao_repository_id
+ };
+
+ static size_t const nargs = 2;
+
+ POA_CORBA::ComponentIR::FactoryDef * const impl =
+ static_cast<POA_CORBA::ComponentIR::FactoryDef *> (servant);
+
+ _is_a_FactoryDef_Upcall_Command command (
+ impl,
+ server_request.operation_details (),
+ args);
+
+ TAO::Upcall_Wrapper upcall_wrapper;
+ upcall_wrapper.upcall (server_request
+ , args
+ , nargs
+ , command
+#if TAO_HAS_INTERCEPTORS == 1
+ , servant_upcall
+ , exceptions
+ , nexceptions
+#endif /* TAO_HAS_INTERCEPTORS == 1 */
+ ACE_ENV_ARG_PARAMETER);
+ ACE_CHECK;
+}namespace POA_CORBA
+{
+ namespace ComponentIR
+ {
+
+
+ // TAO_IDL - Generated from
+ // be\be_visitor_operation/upcall_command_ss.cpp:127
+
+ class _non_existent_FactoryDef_Upcall_Command
+ : public TAO::Upcall_Command
+ {
+ public:
+ inline _non_existent_FactoryDef_Upcall_Command (
+ POA_CORBA::ComponentIR::FactoryDef * servant,
+ TAO_Operation_Details const * operation_details,
+ TAO::Argument * const args[])
+ : servant_ (servant)
+ , operation_details_ (operation_details)
+ , args_ (args)
+ {
+ }
+
+ virtual void execute (ACE_ENV_SINGLE_ARG_DECL)
+ {
+ TAO::SArg_Traits< ::ACE_InputCDR::to_boolean>::ret_arg_type retval =
+ TAO::Portable_Server::get_ret_arg< ::ACE_InputCDR::to_boolean> (
+ this->operation_details_,
+ this->args_);
+
+ retval =
+ this->servant_-> _non_existent (
+ ACE_ENV_SINGLE_ARG_PARAMETER);
+ ACE_CHECK;
+ }
+
+ private:
+ POA_CORBA::ComponentIR::FactoryDef * const servant_;
+ TAO_Operation_Details const * const operation_details_;
+ TAO::Argument * const * const args_;
+ };
+ }
+
+}
+
+
+void POA_CORBA::ComponentIR::FactoryDef::_non_existent_skel (
+ TAO_ServerRequest & server_request,
+ void * TAO_INTERCEPTOR (servant_upcall),
+ void * servant
+ ACE_ENV_ARG_DECL
+ )
+{
+#if TAO_HAS_INTERCEPTORS == 1
+ static ::CORBA::TypeCode_ptr const * const exceptions = 0;
+ static ::CORBA::ULong const nexceptions = 0;
+#endif /* TAO_HAS_INTERCEPTORS */
+
+ TAO::SArg_Traits< ::ACE_InputCDR::to_boolean>::ret_val retval;
+
+ TAO::Argument * const args[] =
+ {
+ &retval
+ };
+
+ static size_t const nargs = 1;
+
+ POA_CORBA::ComponentIR::FactoryDef * const impl =
+ static_cast<POA_CORBA::ComponentIR::FactoryDef *> (servant);
+
+ _non_existent_FactoryDef_Upcall_Command command (
+ impl,
+ server_request.operation_details (),
+ args);
+
+ TAO::Upcall_Wrapper upcall_wrapper;
+ upcall_wrapper.upcall (server_request
+ , args
+ , nargs
+ , command
+#if TAO_HAS_INTERCEPTORS == 1
+ , servant_upcall
+ , exceptions
+ , nexceptions
+#endif /* TAO_HAS_INTERCEPTORS == 1 */
+ ACE_ENV_ARG_PARAMETER);
+ ACE_CHECK;
+}namespace POA_CORBA
+{
+ namespace ComponentIR
+ {
+
+
+ // TAO_IDL - Generated from
+ // be\be_visitor_operation/upcall_command_ss.cpp:127
+
+ class _repository_id_FactoryDef_Upcall_Command
+ : public TAO::Upcall_Command
+ {
+ public:
+ inline _repository_id_FactoryDef_Upcall_Command (
+ POA_CORBA::ComponentIR::FactoryDef * servant,
+ TAO_Operation_Details const * operation_details,
+ TAO::Argument * const args[])
+ : servant_ (servant)
+ , operation_details_ (operation_details)
+ , args_ (args)
+ {
+ }
+
+ virtual void execute (ACE_ENV_SINGLE_ARG_DECL)
+ {
+ TAO::SArg_Traits< ::CORBA::Char *>::ret_arg_type retval =
+ TAO::Portable_Server::get_ret_arg< ::CORBA::Char *> (
+ this->operation_details_,
+ this->args_);
+
+ retval =
+ this->servant_-> _repository_id (
+ ACE_ENV_SINGLE_ARG_PARAMETER);
+ ACE_CHECK;
+ }
+
+ private:
+ POA_CORBA::ComponentIR::FactoryDef * const servant_;
+ TAO_Operation_Details const * const operation_details_;
+ TAO::Argument * const * const args_;
+ };
+ }
+
+}
+
+
+void POA_CORBA::ComponentIR::FactoryDef::_repository_id_skel (
+ TAO_ServerRequest & server_request,
+ void * TAO_INTERCEPTOR (servant_upcall),
+ void * servant
+ ACE_ENV_ARG_DECL
+ )
+{
+#if TAO_HAS_INTERCEPTORS == 1
+ static ::CORBA::TypeCode_ptr const * const exceptions = 0;
+ static ::CORBA::ULong const nexceptions = 0;
+#endif /* TAO_HAS_INTERCEPTORS */
+
+ TAO::SArg_Traits< ::CORBA::Char *>::ret_val retval;
+
+ TAO::Argument * const args[] =
+ {
+ &retval
+ };
+
+ static size_t const nargs = 1;
+
+ POA_CORBA::ComponentIR::FactoryDef * const impl =
+ static_cast<POA_CORBA::ComponentIR::FactoryDef *> (servant);
+
+ _repository_id_FactoryDef_Upcall_Command command (
+ impl,
+ server_request.operation_details (),
+ args);
+
+ TAO::Upcall_Wrapper upcall_wrapper;
+ upcall_wrapper.upcall (server_request
+ , args
+ , nargs
+ , command
+#if TAO_HAS_INTERCEPTORS == 1
+ , servant_upcall
+ , exceptions
+ , nexceptions
+#endif /* TAO_HAS_INTERCEPTORS == 1 */
+ ACE_ENV_ARG_PARAMETER);
+ ACE_CHECK;
+}
+
+// TAO_IDL - Generated from
+// be\be_visitor_interface/interface_ss.cpp:513
+
+void POA_CORBA::ComponentIR::FactoryDef::_interface_skel (
+ TAO_ServerRequest & server_request,
+ void * /* servant_upcall */,
+ void * servant
+ ACE_ENV_ARG_DECL
+ )
+{
+ TAO_IFR_Client_Adapter *_tao_adapter =
+ ACE_Dynamic_Service<TAO_IFR_Client_Adapter>::instance (
+ TAO_ORB_Core::ifr_client_adapter_name ()
+ );
+
+ if (_tao_adapter == 0)
+ {
+ ACE_THROW ( ::CORBA::INTF_REPOS ( ::CORBA::OMGVMCID | 1,
+ ::CORBA::COMPLETED_NO));
+ }
+
+ POA_CORBA::ComponentIR::FactoryDef * const impl =
+ static_cast<POA_CORBA::ComponentIR::FactoryDef *> (servant);
+ ::CORBA::InterfaceDef_ptr _tao_retval =
+ impl->_get_interface (ACE_ENV_SINGLE_ARG_PARAMETER);
+ ACE_CHECK;
+
+ server_request.init_reply ();
+ TAO_OutputCDR &_tao_out = *server_request.outgoing ();
+
+ ::CORBA::Boolean const _tao_result =
+ _tao_adapter->interfacedef_cdr_insert (
+ _tao_out,
+ _tao_retval
+ );
+
+ _tao_adapter->dispose (_tao_retval);
+
+ if (_tao_result == false)
+ {
+ ACE_THROW ( ::CORBA::MARSHAL ());
+ }
+}namespace POA_CORBA
+{
+ namespace ComponentIR
+ {
+
+
+ // TAO_IDL - Generated from
+ // be\be_visitor_operation/upcall_command_ss.cpp:127
+
+ class _get_component_FactoryDef_Upcall_Command
+ : public TAO::Upcall_Command
+ {
+ public:
+ inline _get_component_FactoryDef_Upcall_Command (
+ POA_CORBA::ComponentIR::FactoryDef * servant,
+ TAO_Operation_Details const * operation_details,
+ TAO::Argument * const args[])
+ : servant_ (servant)
+ , operation_details_ (operation_details)
+ , args_ (args)
+ {
+ }
+
+ virtual void execute (ACE_ENV_SINGLE_ARG_DECL)
+ {
+ TAO::SArg_Traits< ::CORBA::Object>::ret_arg_type retval =
+ TAO::Portable_Server::get_ret_arg< ::CORBA::Object> (
+ this->operation_details_,
+ this->args_);
+
+ retval =
+ this->servant_-> _get_component (
+ ACE_ENV_SINGLE_ARG_PARAMETER);
+ ACE_CHECK;
+ }
+
+ private:
+ POA_CORBA::ComponentIR::FactoryDef * const servant_;
+ TAO_Operation_Details const * const operation_details_;
+ TAO::Argument * const * const args_;
+ };
+ }
+
+}
+
+
+void POA_CORBA::ComponentIR::FactoryDef::_component_skel (
+ TAO_ServerRequest & server_request,
+ void * TAO_INTERCEPTOR (servant_upcall),
+ void * servant
+ ACE_ENV_ARG_DECL
+ )
+{
+#if TAO_HAS_INTERCEPTORS == 1
+ static ::CORBA::TypeCode_ptr const * const exceptions = 0;
+ static ::CORBA::ULong const nexceptions = 0;
+#endif /* TAO_HAS_INTERCEPTORS */
+
+ TAO::SArg_Traits< ::CORBA::Object>::ret_val retval;
+
+ TAO::Argument * const args[] =
+ {
+ &retval
+ };
+
+ static size_t const nargs = 1;
+
+ POA_CORBA::ComponentIR::FactoryDef * const impl =
+ static_cast<POA_CORBA::ComponentIR::FactoryDef *> (servant);
+
+ _get_component_FactoryDef_Upcall_Command command (
+ impl,
+ server_request.operation_details (),
+ args);
+
+ TAO::Upcall_Wrapper upcall_wrapper;
+ upcall_wrapper.upcall (server_request
+ , args
+ , nargs
+ , command
+#if TAO_HAS_INTERCEPTORS == 1
+ , servant_upcall
+ , exceptions
+ , nexceptions
+#endif /* TAO_HAS_INTERCEPTORS == 1 */
+ ACE_ENV_ARG_PARAMETER);
+ ACE_CHECK;
+}
+
+::CORBA::Boolean POA_CORBA::ComponentIR::FactoryDef::_is_a (
+ const char* value
+ ACE_ENV_ARG_DECL_NOT_USED
+ )
+{
+ return
+ (
+ !ACE_OS::strcmp (
+ value,
+ "IDL:omg.org/CORBA/IRObject:1.0"
+ ) ||
+ !ACE_OS::strcmp (
+ value,
+ "IDL:omg.org/CORBA/Contained:1.0"
+ ) ||
+ !ACE_OS::strcmp (
+ value,
+ "IDL:omg.org/CORBA/OperationDef:1.0"
+ ) ||
+ !ACE_OS::strcmp (
+ value,
+ "IDL:omg.org/CORBA/ComponentIR/FactoryDef:1.0"
+ ) ||
+ !ACE_OS::strcmp (
+ value,
+ "IDL:omg.org/CORBA/Object:1.0"
+ )
+ );
+}
+
+const char* POA_CORBA::ComponentIR::FactoryDef::_interface_repository_id (void) const
+{
+ return "IDL:omg.org/CORBA/ComponentIR/FactoryDef:1.0";
+}
+
+// TAO_IDL - Generated from
+// be\be_visitor_interface/interface_ss.cpp:903
+
+void POA_CORBA::ComponentIR::FactoryDef::_dispatch (
+ TAO_ServerRequest & req,
+ void * servant_upcall
+ ACE_ENV_ARG_DECL
+ )
+{
+ this->synchronous_upcall_dispatch (req,
+ servant_upcall,
+ this
+ ACE_ENV_ARG_PARAMETER);
+}
+
+// TAO_IDL - Generated from
+// be\be_visitor_interface/interface_ss.cpp:851
+
+CORBA::ComponentIR::FactoryDef *
+POA_CORBA::ComponentIR::FactoryDef::_this (ACE_ENV_SINGLE_ARG_DECL)
+{
+ TAO_Stub *stub = this->_create_stub (ACE_ENV_SINGLE_ARG_PARAMETER);
+ ACE_CHECK_RETURN (0);
+
+ TAO_Stub_Auto_Ptr safe_stub (stub);
+ ::CORBA::Object_ptr tmp = CORBA::Object::_nil ();
+
+ ::CORBA::Boolean const _tao_opt_colloc =
+ stub->servant_orb_var ()->orb_core ()->optimize_collocation_objects ();
+
+ ACE_NEW_RETURN (
+ tmp,
+ ::CORBA::Object (stub, _tao_opt_colloc, this),
+ 0
+ );
+
+ ::CORBA::Object_var obj = tmp;
+ (void) safe_stub.release ();
+
+ typedef ::CORBA::ComponentIR::FactoryDef STUB_SCOPED_NAME;
+ return
+ TAO::Narrow_Utils<STUB_SCOPED_NAME>::unchecked_narrow (
+ obj.in (),
+ CORBA_ComponentIR__TAO_FactoryDef_Proxy_Broker_Factory_function_pointer
+ );
+}
+
+// TAO_IDL - Generated from
+// be\be_interface.cpp:1499
+
+class TAO_CORBA_ComponentIR_FinderDef_Perfect_Hash_OpTable
+ : public TAO_Perfect_Hash_OpTable
+{
+private:
+ unsigned int hash (const char *str, unsigned int len);
+
+public:
+ const TAO_operation_db_entry * lookup (const char *str, unsigned int len);
+};
+
+/* C++ code produced by gperf version 2.8 (ACE version) */
+/* Command-line: C:\ACE\latest\ACE_wrappers\bin\gperf.exe -m -M -J -c -C -D -E -T -f 0 -F 0,0 -a -o -t -p -K opname -L C++ -Z TAO_CORBA_ComponentIR_FinderDef_Perfect_Hash_OpTable -N lookup */
+unsigned int
+TAO_CORBA_ComponentIR_FinderDef_Perfect_Hash_OpTable::hash (const char *str, unsigned int len)
+{
+ static const unsigned char asso_values[] =
+ {
+#if defined (ACE_MVS)
+ 37, 37, 37, 37, 37, 37, 37, 37, 37, 37,
+ 37, 37, 37, 37, 37, 37, 37, 37, 37, 37,
+ 37, 37, 37, 37, 37, 37, 37, 37, 37, 37,
+ 37, 37, 37, 37, 37, 37, 37, 37, 37, 37,
+ 37, 37, 37, 37, 37, 37, 37, 37, 37, 37,
+ 37, 37, 37, 37, 37, 37, 37, 37, 37, 37,
+ 37, 37, 37, 37, 37, 37, 37, 37, 37, 37,
+ 37, 37, 37, 37, 37, 37, 37, 37, 37, 37,
+ 37, 37, 37, 37, 37, 37, 37, 37, 37, 37,
+ 37, 37, 37, 37, 37, 37, 37, 37, 37, 37,
+ 37, 37, 37, 37, 37, 37, 37, 37, 37, 0,
+ 37, 37, 37, 37, 37, 37, 37, 37, 37, 37,
+ 37, 37, 37, 37, 37, 37, 37, 37, 37, 0,
+ 37, 37, 15, 0, 10, 37, 37, 37, 37, 37,
+ 37, 37, 37, 37, 37, 37, 37, 37, 0, 5,
+ 37, 37, 37, 37, 37, 37, 37, 37, 37, 37,
+ 37, 37, 0, 20, 37, 37, 37, 37, 10, 37,
+ 37, 37, 37, 37, 37, 37, 37, 37, 37, 37,
+ 37, 37, 37, 37, 37, 37, 37, 37, 37, 37,
+ 37, 37, 37, 37, 37, 37, 37, 37, 37, 37,
+ 37, 37, 37, 37, 37, 37, 37, 37, 37, 37,
+ 37, 37, 37, 37, 37, 37, 37, 37, 37, 37,
+ 37, 37, 37, 37, 37, 37, 37, 37, 37, 37,
+ 37, 37, 37, 37, 37, 37, 37, 37, 37, 37,
+ 37, 37, 37, 37, 37, 37, 37, 37, 37, 37,
+ 37, 37, 37, 37, 37, 37,
+#else
+ 37, 37, 37, 37, 37, 37, 37, 37, 37, 37,
+ 37, 37, 37, 37, 37, 37, 37, 37, 37, 37,
+ 37, 37, 37, 37, 37, 37, 37, 37, 37, 37,
+ 37, 37, 37, 37, 37, 37, 37, 37, 37, 37,
+ 37, 37, 37, 37, 37, 37, 37, 37, 37, 37,
+ 37, 37, 37, 37, 37, 37, 37, 37, 37, 37,
+ 37, 37, 37, 37, 37, 37, 37, 37, 37, 37,
+ 37, 37, 37, 37, 37, 37, 37, 37, 37, 37,
+ 37, 37, 37, 37, 37, 37, 37, 37, 37, 37,
+ 37, 37, 37, 37, 37, 0, 37, 0, 37, 37,
+ 15, 0, 10, 37, 37, 37, 37, 37, 37, 0,
+ 5, 37, 37, 37, 37, 0, 20, 37, 37, 37,
+ 37, 10, 37, 37, 37, 37, 37, 37,
+#endif /* ACE_MVS */
+ };
+ return len + asso_values[(int) str[len - 1]] + asso_values[(int) str[0]];
+}
+
+const TAO_operation_db_entry *
+TAO_CORBA_ComponentIR_FinderDef_Perfect_Hash_OpTable::lookup (const char *str, unsigned int len)
+{
+ enum
+ {
+ TOTAL_KEYWORDS = 29,
+ MIN_WORD_LENGTH = 4,
+ MAX_WORD_LENGTH = 26,
+ MIN_HASH_VALUE = 4,
+ MAX_HASH_VALUE = 36,
+ HASH_VALUE_RANGE = 33,
+ DUPLICATES = 10,
+ WORDLIST_SIZE = 33
+ };
+
+ static const TAO_operation_db_entry wordlist[] =
+ {
+ {"",0,0},{"",0,0},{"",0,0},{"",0,0},
+ {"move", &POA_CORBA::ComponentIR::FinderDef::move_skel, 0},
+ {"_is_a", &POA_CORBA::ComponentIR::FinderDef::_is_a_skel, 0},
+ {"_get_name", &POA_CORBA::ComponentIR::FinderDef::_get_name_skel, 0},
+ {"_set_mode", &POA_CORBA::ComponentIR::FinderDef::_set_mode_skel, 0},
+ {"_get_mode", &POA_CORBA::ComponentIR::FinderDef::_get_mode_skel, 0},
+ {"_set_name", &POA_CORBA::ComponentIR::FinderDef::_set_name_skel, 0},
+ {"_interface", &POA_CORBA::ComponentIR::FinderDef::_interface_skel, 0},
+ {"_get_params", &POA_CORBA::ComponentIR::FinderDef::_get_params_skel, 0},
+ {"_set_params", &POA_CORBA::ComponentIR::FinderDef::_set_params_skel, 0},
+ {"_get_contexts", &POA_CORBA::ComponentIR::FinderDef::_get_contexts_skel, 0},
+ {"_set_contexts", &POA_CORBA::ComponentIR::FinderDef::_set_contexts_skel, 0},
+ {"_get_exceptions", &POA_CORBA::ComponentIR::FinderDef::_get_exceptions_skel, 0},
+ {"_set_exceptions", &POA_CORBA::ComponentIR::FinderDef::_set_exceptions_skel, 0},
+ {"_get_version", &POA_CORBA::ComponentIR::FinderDef::_get_version_skel, 0},
+ {"_set_version", &POA_CORBA::ComponentIR::FinderDef::_set_version_skel, 0},
+ {"_get_absolute_name", &POA_CORBA::ComponentIR::FinderDef::_get_absolute_name_skel, 0},
+ {"_get_defined_in", &POA_CORBA::ComponentIR::FinderDef::_get_defined_in_skel, 0},
+ {"_get_id", &POA_CORBA::ComponentIR::FinderDef::_get_id_skel, 0},
+ {"_set_id", &POA_CORBA::ComponentIR::FinderDef::_set_id_skel, 0},
+ {"describe", &POA_CORBA::ComponentIR::FinderDef::describe_skel, 0},
+ {"_get_result_def", &POA_CORBA::ComponentIR::FinderDef::_get_result_def_skel, 0},
+ {"_set_result_def", &POA_CORBA::ComponentIR::FinderDef::_set_result_def_skel, 0},
+ {"_get_def_kind", &POA_CORBA::ComponentIR::FinderDef::_get_def_kind_skel, 0},
+ {"_repository_id", &POA_CORBA::ComponentIR::FinderDef::_repository_id_skel, 0},
+ {"_component", &POA_CORBA::ComponentIR::FinderDef::_component_skel, 0},
+ {"_get_result", &POA_CORBA::ComponentIR::FinderDef::_get_result_skel, 0},
+ {"destroy", &POA_CORBA::ComponentIR::FinderDef::destroy_skel, 0},
+ {"_non_existent", &POA_CORBA::ComponentIR::FinderDef::_non_existent_skel, 0},
+ {"_get_containing_repository", &POA_CORBA::ComponentIR::FinderDef::_get_containing_repository_skel, 0},
+ };
+
+ if (len <= MAX_WORD_LENGTH && len >= MIN_WORD_LENGTH)
+ {
+ unsigned int key = hash (str, len);
+
+ if (key <= MAX_HASH_VALUE && key >= MIN_HASH_VALUE)
+ {
+ {
+ const TAO_operation_db_entry *resword;
+
+ switch (key)
+ {
+ case 4:
+ resword = &wordlist[4]; break;
+ case 5:
+ resword = &wordlist[5]; break;
+ case 9:
+ resword = &wordlist[6];
+ if (*str == *resword->opname && !strncmp (str + 1, resword->opname + 1, len - 1)) return resword;
+ resword = &wordlist[7];
+ if (*str == *resword->opname && !strncmp (str + 1, resword->opname + 1, len - 1)) return resword;
+ resword = &wordlist[8];
+ if (*str == *resword->opname && !strncmp (str + 1, resword->opname + 1, len - 1)) return resword;
+ resword = &wordlist[9];
+ if (*str == *resword->opname && !strncmp (str + 1, resword->opname + 1, len - 1)) return resword;
+ return 0;
+ case 10:
+ resword = &wordlist[10]; break;
+ case 11:
+ resword = &wordlist[11];
+ if (*str == *resword->opname && !strncmp (str + 1, resword->opname + 1, len - 1)) return resword;
+ resword = &wordlist[12];
+ if (*str == *resword->opname && !strncmp (str + 1, resword->opname + 1, len - 1)) return resword;
+ return 0;
+ case 13:
+ resword = &wordlist[13];
+ if (*str == *resword->opname && !strncmp (str + 1, resword->opname + 1, len - 1)) return resword;
+ resword = &wordlist[14];
+ if (*str == *resword->opname && !strncmp (str + 1, resword->opname + 1, len - 1)) return resword;
+ return 0;
+ case 15:
+ resword = &wordlist[15];
+ if (*str == *resword->opname && !strncmp (str + 1, resword->opname + 1, len - 1)) return resword;
+ resword = &wordlist[16];
+ if (*str == *resword->opname && !strncmp (str + 1, resword->opname + 1, len - 1)) return resword;
+ return 0;
+ case 17:
+ resword = &wordlist[17];
+ if (*str == *resword->opname && !strncmp (str + 1, resword->opname + 1, len - 1)) return resword;
+ resword = &wordlist[18];
+ if (*str == *resword->opname && !strncmp (str + 1, resword->opname + 1, len - 1)) return resword;
+ return 0;
+ case 18:
+ resword = &wordlist[19]; break;
+ case 20:
+ resword = &wordlist[20]; break;
+ case 22:
+ resword = &wordlist[21];
+ if (*str == *resword->opname && !strncmp (str + 1, resword->opname + 1, len - 1)) return resword;
+ resword = &wordlist[22];
+ if (*str == *resword->opname && !strncmp (str + 1, resword->opname + 1, len - 1)) return resword;
+ return 0;
+ case 23:
+ resword = &wordlist[23]; break;
+ case 25:
+ resword = &wordlist[24];
+ if (*str == *resword->opname && !strncmp (str + 1, resword->opname + 1, len - 1)) return resword;
+ resword = &wordlist[25];
+ if (*str == *resword->opname && !strncmp (str + 1, resword->opname + 1, len - 1)) return resword;
+ return 0;
+ case 28:
+ resword = &wordlist[26]; break;
+ case 29:
+ resword = &wordlist[27]; break;
+ case 30:
+ resword = &wordlist[28]; break;
+ case 31:
+ resword = &wordlist[29]; break;
+ case 32:
+ resword = &wordlist[30]; break;
+ case 33:
+ resword = &wordlist[31]; break;
+ case 36:
+ resword = &wordlist[32]; break;
+ default: return 0;
+ }
+ if (*str == *resword->opname && !strncmp (str + 1, resword->opname + 1, len - 1))
+ return resword;
+ return 0;
+ }
+ }
+ }
+ return 0;
+}
+
+static TAO_CORBA_ComponentIR_FinderDef_Perfect_Hash_OpTable tao_CORBA_ComponentIR_FinderDef_optable;
+
+// TAO_IDL - Generated from
+// be\be_visitor_interface/interface_ss.cpp:966
+
+TAO::Collocation_Proxy_Broker *
+CORBA_ComponentIR__TAO_FinderDef_Proxy_Broker_Factory_function ( ::CORBA::Object_ptr)
+{
+ return reinterpret_cast<TAO::Collocation_Proxy_Broker *> (0xdead); // Dummy
+}
+
+int
+CORBA_ComponentIR__TAO_FinderDef_Proxy_Broker_Factory_Initializer (size_t)
+{
+ CORBA_ComponentIR__TAO_FinderDef_Proxy_Broker_Factory_function_pointer =
+ CORBA_ComponentIR__TAO_FinderDef_Proxy_Broker_Factory_function;
+
+ return 0;
+}
+
+static int
+CORBA_ComponentIR__TAO_FinderDef_Proxy_Broker_Stub_Factory_Initializer_Scarecrow =
+ CORBA_ComponentIR__TAO_FinderDef_Proxy_Broker_Factory_Initializer (
+ reinterpret_cast<size_t> (CORBA_ComponentIR__TAO_FinderDef_Proxy_Broker_Factory_Initializer)
+ );
+
+// TAO_IDL - Generated from
+// be\be_visitor_interface/interface_ss.cpp:103
+
+POA_CORBA::ComponentIR::FinderDef::FinderDef (void)
+ : TAO_ServantBase ()
+{
+ this->optable_ = &tao_CORBA_ComponentIR_FinderDef_optable;
+}
+
+POA_CORBA::ComponentIR::FinderDef::FinderDef (const FinderDef& rhs)
+ : TAO_Abstract_ServantBase (rhs),
+ TAO_ServantBase (rhs),
+ POA_CORBA::IRObject (rhs),
+ POA_CORBA::Contained (rhs),
+ POA_CORBA::OperationDef (rhs)
+{
+}
+
+POA_CORBA::ComponentIR::FinderDef::~FinderDef (void)
+{
+}
+
+// TAO_IDL - Generated from
+// be\be_visitor_interface/interface_ss.cpp:169
+
+namespace POA_CORBA
+{
+ namespace ComponentIR
+ {
+
+
+ // TAO_IDL - Generated from
+ // be\be_visitor_operation/upcall_command_ss.cpp:127
+
+ class _is_a_FinderDef_Upcall_Command
+ : public TAO::Upcall_Command
+ {
+ public:
+ inline _is_a_FinderDef_Upcall_Command (
+ POA_CORBA::ComponentIR::FinderDef * servant,
+ TAO_Operation_Details const * operation_details,
+ TAO::Argument * const args[])
+ : servant_ (servant)
+ , operation_details_ (operation_details)
+ , args_ (args)
+ {
+ }
+
+ virtual void execute (ACE_ENV_SINGLE_ARG_DECL)
+ {
+ TAO::SArg_Traits< ::ACE_InputCDR::to_boolean>::ret_arg_type retval =
+ TAO::Portable_Server::get_ret_arg< ::ACE_InputCDR::to_boolean> (
+ this->operation_details_,
+ this->args_);
+
+ TAO::SArg_Traits< ::CORBA::Char *>::in_arg_type arg_1 =
+ TAO::Portable_Server::get_in_arg< ::CORBA::Char *> (
+ this->operation_details_,
+ this->args_,
+ 1);
+
+ retval =
+ this->servant_-> _is_a (
+ arg_1
+ ACE_ENV_ARG_PARAMETER);
+ ACE_CHECK;
+ }
+
+ private:
+ POA_CORBA::ComponentIR::FinderDef * const servant_;
+ TAO_Operation_Details const * const operation_details_;
+ TAO::Argument * const * const args_;
+ };
+ }
+
+}
+
+
+void POA_CORBA::ComponentIR::FinderDef::_is_a_skel (
+ TAO_ServerRequest & server_request,
+ void * TAO_INTERCEPTOR (servant_upcall),
+ void * servant
+ ACE_ENV_ARG_DECL
+ )
+{
+#if TAO_HAS_INTERCEPTORS == 1
+ static ::CORBA::TypeCode_ptr const * const exceptions = 0;
+ static ::CORBA::ULong const nexceptions = 0;
+#endif /* TAO_HAS_INTERCEPTORS */
+
+ TAO::SArg_Traits< ::ACE_InputCDR::to_boolean>::ret_val retval;
+ TAO::SArg_Traits< ::CORBA::Char *>::in_arg_val _tao_repository_id;
+
+ TAO::Argument * const args[] =
+ {
+ &retval,
+ &_tao_repository_id
+ };
+
+ static size_t const nargs = 2;
+
+ POA_CORBA::ComponentIR::FinderDef * const impl =
+ static_cast<POA_CORBA::ComponentIR::FinderDef *> (servant);
+
+ _is_a_FinderDef_Upcall_Command command (
+ impl,
+ server_request.operation_details (),
+ args);
+
+ TAO::Upcall_Wrapper upcall_wrapper;
+ upcall_wrapper.upcall (server_request
+ , args
+ , nargs
+ , command
+#if TAO_HAS_INTERCEPTORS == 1
+ , servant_upcall
+ , exceptions
+ , nexceptions
+#endif /* TAO_HAS_INTERCEPTORS == 1 */
+ ACE_ENV_ARG_PARAMETER);
+ ACE_CHECK;
+}namespace POA_CORBA
+{
+ namespace ComponentIR
+ {
+
+
+ // TAO_IDL - Generated from
+ // be\be_visitor_operation/upcall_command_ss.cpp:127
+
+ class _non_existent_FinderDef_Upcall_Command
+ : public TAO::Upcall_Command
+ {
+ public:
+ inline _non_existent_FinderDef_Upcall_Command (
+ POA_CORBA::ComponentIR::FinderDef * servant,
+ TAO_Operation_Details const * operation_details,
+ TAO::Argument * const args[])
+ : servant_ (servant)
+ , operation_details_ (operation_details)
+ , args_ (args)
+ {
+ }
+
+ virtual void execute (ACE_ENV_SINGLE_ARG_DECL)
+ {
+ TAO::SArg_Traits< ::ACE_InputCDR::to_boolean>::ret_arg_type retval =
+ TAO::Portable_Server::get_ret_arg< ::ACE_InputCDR::to_boolean> (
+ this->operation_details_,
+ this->args_);
+
+ retval =
+ this->servant_-> _non_existent (
+ ACE_ENV_SINGLE_ARG_PARAMETER);
+ ACE_CHECK;
+ }
+
+ private:
+ POA_CORBA::ComponentIR::FinderDef * const servant_;
+ TAO_Operation_Details const * const operation_details_;
+ TAO::Argument * const * const args_;
+ };
+ }
+
+}
+
+
+void POA_CORBA::ComponentIR::FinderDef::_non_existent_skel (
+ TAO_ServerRequest & server_request,
+ void * TAO_INTERCEPTOR (servant_upcall),
+ void * servant
+ ACE_ENV_ARG_DECL
+ )
+{
+#if TAO_HAS_INTERCEPTORS == 1
+ static ::CORBA::TypeCode_ptr const * const exceptions = 0;
+ static ::CORBA::ULong const nexceptions = 0;
+#endif /* TAO_HAS_INTERCEPTORS */
+
+ TAO::SArg_Traits< ::ACE_InputCDR::to_boolean>::ret_val retval;
+
+ TAO::Argument * const args[] =
+ {
+ &retval
+ };
+
+ static size_t const nargs = 1;
+
+ POA_CORBA::ComponentIR::FinderDef * const impl =
+ static_cast<POA_CORBA::ComponentIR::FinderDef *> (servant);
+
+ _non_existent_FinderDef_Upcall_Command command (
+ impl,
+ server_request.operation_details (),
+ args);
+
+ TAO::Upcall_Wrapper upcall_wrapper;
+ upcall_wrapper.upcall (server_request
+ , args
+ , nargs
+ , command
+#if TAO_HAS_INTERCEPTORS == 1
+ , servant_upcall
+ , exceptions
+ , nexceptions
+#endif /* TAO_HAS_INTERCEPTORS == 1 */
+ ACE_ENV_ARG_PARAMETER);
+ ACE_CHECK;
+}namespace POA_CORBA
+{
+ namespace ComponentIR
+ {
+
+
+ // TAO_IDL - Generated from
+ // be\be_visitor_operation/upcall_command_ss.cpp:127
+
+ class _repository_id_FinderDef_Upcall_Command
+ : public TAO::Upcall_Command
+ {
+ public:
+ inline _repository_id_FinderDef_Upcall_Command (
+ POA_CORBA::ComponentIR::FinderDef * servant,
+ TAO_Operation_Details const * operation_details,
+ TAO::Argument * const args[])
+ : servant_ (servant)
+ , operation_details_ (operation_details)
+ , args_ (args)
+ {
+ }
+
+ virtual void execute (ACE_ENV_SINGLE_ARG_DECL)
+ {
+ TAO::SArg_Traits< ::CORBA::Char *>::ret_arg_type retval =
+ TAO::Portable_Server::get_ret_arg< ::CORBA::Char *> (
+ this->operation_details_,
+ this->args_);
+
+ retval =
+ this->servant_-> _repository_id (
+ ACE_ENV_SINGLE_ARG_PARAMETER);
+ ACE_CHECK;
+ }
+
+ private:
+ POA_CORBA::ComponentIR::FinderDef * const servant_;
+ TAO_Operation_Details const * const operation_details_;
+ TAO::Argument * const * const args_;
+ };
+ }
+
+}
+
+
+void POA_CORBA::ComponentIR::FinderDef::_repository_id_skel (
+ TAO_ServerRequest & server_request,
+ void * TAO_INTERCEPTOR (servant_upcall),
+ void * servant
+ ACE_ENV_ARG_DECL
+ )
+{
+#if TAO_HAS_INTERCEPTORS == 1
+ static ::CORBA::TypeCode_ptr const * const exceptions = 0;
+ static ::CORBA::ULong const nexceptions = 0;
+#endif /* TAO_HAS_INTERCEPTORS */
+
+ TAO::SArg_Traits< ::CORBA::Char *>::ret_val retval;
+
+ TAO::Argument * const args[] =
+ {
+ &retval
+ };
+
+ static size_t const nargs = 1;
+
+ POA_CORBA::ComponentIR::FinderDef * const impl =
+ static_cast<POA_CORBA::ComponentIR::FinderDef *> (servant);
+
+ _repository_id_FinderDef_Upcall_Command command (
+ impl,
+ server_request.operation_details (),
+ args);
+
+ TAO::Upcall_Wrapper upcall_wrapper;
+ upcall_wrapper.upcall (server_request
+ , args
+ , nargs
+ , command
+#if TAO_HAS_INTERCEPTORS == 1
+ , servant_upcall
+ , exceptions
+ , nexceptions
+#endif /* TAO_HAS_INTERCEPTORS == 1 */
+ ACE_ENV_ARG_PARAMETER);
+ ACE_CHECK;
+}
+
+// TAO_IDL - Generated from
+// be\be_visitor_interface/interface_ss.cpp:513
+
+void POA_CORBA::ComponentIR::FinderDef::_interface_skel (
+ TAO_ServerRequest & server_request,
+ void * /* servant_upcall */,
+ void * servant
+ ACE_ENV_ARG_DECL
+ )
+{
+ TAO_IFR_Client_Adapter *_tao_adapter =
+ ACE_Dynamic_Service<TAO_IFR_Client_Adapter>::instance (
+ TAO_ORB_Core::ifr_client_adapter_name ()
+ );
+
+ if (_tao_adapter == 0)
+ {
+ ACE_THROW ( ::CORBA::INTF_REPOS ( ::CORBA::OMGVMCID | 1,
+ ::CORBA::COMPLETED_NO));
+ }
+
+ POA_CORBA::ComponentIR::FinderDef * const impl =
+ static_cast<POA_CORBA::ComponentIR::FinderDef *> (servant);
+ ::CORBA::InterfaceDef_ptr _tao_retval =
+ impl->_get_interface (ACE_ENV_SINGLE_ARG_PARAMETER);
+ ACE_CHECK;
+
+ server_request.init_reply ();
+ TAO_OutputCDR &_tao_out = *server_request.outgoing ();
+
+ ::CORBA::Boolean const _tao_result =
+ _tao_adapter->interfacedef_cdr_insert (
+ _tao_out,
+ _tao_retval
+ );
+
+ _tao_adapter->dispose (_tao_retval);
+
+ if (_tao_result == false)
+ {
+ ACE_THROW ( ::CORBA::MARSHAL ());
+ }
+}namespace POA_CORBA
+{
+ namespace ComponentIR
+ {
+
+
+ // TAO_IDL - Generated from
+ // be\be_visitor_operation/upcall_command_ss.cpp:127
+
+ class _get_component_FinderDef_Upcall_Command
+ : public TAO::Upcall_Command
+ {
+ public:
+ inline _get_component_FinderDef_Upcall_Command (
+ POA_CORBA::ComponentIR::FinderDef * servant,
+ TAO_Operation_Details const * operation_details,
+ TAO::Argument * const args[])
+ : servant_ (servant)
+ , operation_details_ (operation_details)
+ , args_ (args)
+ {
+ }
+
+ virtual void execute (ACE_ENV_SINGLE_ARG_DECL)
+ {
+ TAO::SArg_Traits< ::CORBA::Object>::ret_arg_type retval =
+ TAO::Portable_Server::get_ret_arg< ::CORBA::Object> (
+ this->operation_details_,
+ this->args_);
+
+ retval =
+ this->servant_-> _get_component (
+ ACE_ENV_SINGLE_ARG_PARAMETER);
+ ACE_CHECK;
+ }
+
+ private:
+ POA_CORBA::ComponentIR::FinderDef * const servant_;
+ TAO_Operation_Details const * const operation_details_;
+ TAO::Argument * const * const args_;
+ };
+ }
+
+}
+
+
+void POA_CORBA::ComponentIR::FinderDef::_component_skel (
+ TAO_ServerRequest & server_request,
+ void * TAO_INTERCEPTOR (servant_upcall),
+ void * servant
+ ACE_ENV_ARG_DECL
+ )
+{
+#if TAO_HAS_INTERCEPTORS == 1
+ static ::CORBA::TypeCode_ptr const * const exceptions = 0;
+ static ::CORBA::ULong const nexceptions = 0;
+#endif /* TAO_HAS_INTERCEPTORS */
+
+ TAO::SArg_Traits< ::CORBA::Object>::ret_val retval;
+
+ TAO::Argument * const args[] =
+ {
+ &retval
+ };
+
+ static size_t const nargs = 1;
+
+ POA_CORBA::ComponentIR::FinderDef * const impl =
+ static_cast<POA_CORBA::ComponentIR::FinderDef *> (servant);
+
+ _get_component_FinderDef_Upcall_Command command (
+ impl,
+ server_request.operation_details (),
+ args);
+
+ TAO::Upcall_Wrapper upcall_wrapper;
+ upcall_wrapper.upcall (server_request
+ , args
+ , nargs
+ , command
+#if TAO_HAS_INTERCEPTORS == 1
+ , servant_upcall
+ , exceptions
+ , nexceptions
+#endif /* TAO_HAS_INTERCEPTORS == 1 */
+ ACE_ENV_ARG_PARAMETER);
+ ACE_CHECK;
+}
+
+::CORBA::Boolean POA_CORBA::ComponentIR::FinderDef::_is_a (
+ const char* value
+ ACE_ENV_ARG_DECL_NOT_USED
+ )
+{
+ return
+ (
+ !ACE_OS::strcmp (
+ value,
+ "IDL:omg.org/CORBA/IRObject:1.0"
+ ) ||
+ !ACE_OS::strcmp (
+ value,
+ "IDL:omg.org/CORBA/Contained:1.0"
+ ) ||
+ !ACE_OS::strcmp (
+ value,
+ "IDL:omg.org/CORBA/OperationDef:1.0"
+ ) ||
+ !ACE_OS::strcmp (
+ value,
+ "IDL:omg.org/CORBA/ComponentIR/FinderDef:1.0"
+ ) ||
+ !ACE_OS::strcmp (
+ value,
+ "IDL:omg.org/CORBA/Object:1.0"
+ )
+ );
+}
+
+const char* POA_CORBA::ComponentIR::FinderDef::_interface_repository_id (void) const
+{
+ return "IDL:omg.org/CORBA/ComponentIR/FinderDef:1.0";
+}
+
+// TAO_IDL - Generated from
+// be\be_visitor_interface/interface_ss.cpp:903
+
+void POA_CORBA::ComponentIR::FinderDef::_dispatch (
+ TAO_ServerRequest & req,
+ void * servant_upcall
+ ACE_ENV_ARG_DECL
+ )
+{
+ this->synchronous_upcall_dispatch (req,
+ servant_upcall,
+ this
+ ACE_ENV_ARG_PARAMETER);
+}
+
+// TAO_IDL - Generated from
+// be\be_visitor_interface/interface_ss.cpp:851
+
+CORBA::ComponentIR::FinderDef *
+POA_CORBA::ComponentIR::FinderDef::_this (ACE_ENV_SINGLE_ARG_DECL)
+{
+ TAO_Stub *stub = this->_create_stub (ACE_ENV_SINGLE_ARG_PARAMETER);
+ ACE_CHECK_RETURN (0);
+
+ TAO_Stub_Auto_Ptr safe_stub (stub);
+ ::CORBA::Object_ptr tmp = CORBA::Object::_nil ();
+
+ ::CORBA::Boolean const _tao_opt_colloc =
+ stub->servant_orb_var ()->orb_core ()->optimize_collocation_objects ();
+
+ ACE_NEW_RETURN (
+ tmp,
+ ::CORBA::Object (stub, _tao_opt_colloc, this),
+ 0
+ );
+
+ ::CORBA::Object_var obj = tmp;
+ (void) safe_stub.release ();
+
+ typedef ::CORBA::ComponentIR::FinderDef STUB_SCOPED_NAME;
+ return
+ TAO::Narrow_Utils<STUB_SCOPED_NAME>::unchecked_narrow (
+ obj.in (),
+ CORBA_ComponentIR__TAO_FinderDef_Proxy_Broker_Factory_function_pointer
+ );
+}
+
+// TAO_IDL - Generated from
+// be\be_interface.cpp:1499
+
+class TAO_CORBA_ComponentIR_HomeDef_Perfect_Hash_OpTable
+ : public TAO_Perfect_Hash_OpTable
+{
+private:
+ unsigned int hash (const char *str, unsigned int len);
+
+public:
+ const TAO_operation_db_entry * lookup (const char *str, unsigned int len);
+};
+
+/* C++ code produced by gperf version 2.8 (ACE version) */
+/* Command-line: C:\ACE\latest\ACE_wrappers\bin\gperf.exe -m -M -J -c -C -D -E -T -f 0 -F 0,0 -a -o -t -p -K opname -L C++ -Z TAO_CORBA_ComponentIR_HomeDef_Perfect_Hash_OpTable -N lookup */
+unsigned int
+TAO_CORBA_ComponentIR_HomeDef_Perfect_Hash_OpTable::hash (const char *str, unsigned int len)
+{
+ static const unsigned char asso_values[] =
+ {
+#if defined (ACE_MVS)
+ 101, 101, 101, 101, 101, 101, 101, 101, 101, 101,
+ 101, 101, 101, 101, 101, 101, 101, 101, 101, 101,
+ 101, 101, 101, 101, 101, 101, 101, 101, 101, 101,
+ 101, 101, 101, 101, 101, 101, 101, 101, 101, 101,
+ 101, 101, 101, 101, 101, 101, 101, 101, 101, 101,
+ 101, 101, 101, 101, 101, 101, 101, 101, 101, 101,
+ 101, 101, 101, 101, 101, 101, 101, 101, 101, 101,
+ 101, 101, 101, 101, 101, 101, 101, 101, 101, 101,
+ 101, 101, 101, 101, 101, 101, 101, 101, 101, 101,
+ 101, 101, 101, 101, 101, 101, 101, 101, 101, 101,
+ 101, 101, 101, 101, 101, 101, 101, 101, 101, 0,
+ 101, 101, 101, 101, 101, 101, 101, 101, 101, 101,
+ 101, 101, 101, 101, 101, 101, 101, 101, 101, 0,
+ 101, 45, 20, 0, 101, 101, 101, 15, 101, 101,
+ 101, 101, 101, 101, 101, 101, 101, 0, 0, 20,
+ 101, 0, 101, 5, 101, 101, 101, 101, 101, 101,
+ 101, 101, 35, 40, 101, 101, 101, 5, 10, 101,
+ 101, 101, 101, 101, 101, 101, 101, 101, 101, 101,
+ 101, 101, 101, 101, 101, 101, 101, 101, 101, 101,
+ 101, 101, 101, 101, 101, 101, 101, 101, 101, 101,
+ 101, 101, 101, 101, 101, 101, 101, 101, 101, 101,
+ 101, 101, 101, 101, 101, 101, 101, 101, 101, 101,
+ 101, 101, 101, 101, 101, 101, 101, 101, 101, 101,
+ 101, 101, 101, 101, 101, 101, 101, 101, 101, 101,
+ 101, 101, 101, 101, 101, 101, 101, 101, 101, 101,
+ 101, 101, 101, 101, 101, 101,
+#else
+ 101, 101, 101, 101, 101, 101, 101, 101, 101, 101,
+ 101, 101, 101, 101, 101, 101, 101, 101, 101, 101,
+ 101, 101, 101, 101, 101, 101, 101, 101, 101, 101,
+ 101, 101, 101, 101, 101, 101, 101, 101, 101, 101,
+ 101, 101, 101, 101, 101, 101, 101, 101, 101, 101,
+ 101, 101, 101, 101, 101, 101, 101, 101, 101, 101,
+ 101, 101, 101, 101, 101, 101, 101, 101, 101, 101,
+ 101, 101, 101, 101, 101, 101, 101, 101, 101, 101,
+ 101, 101, 101, 101, 101, 101, 101, 101, 101, 101,
+ 101, 101, 101, 101, 101, 0, 101, 0, 101, 45,
+ 20, 0, 101, 101, 101, 15, 101, 101, 0, 0,
+ 20, 101, 0, 101, 5, 35, 40, 101, 101, 101,
+ 5, 10, 101, 101, 101, 101, 101, 101,
+#endif /* ACE_MVS */
+ };
+ return len + asso_values[(int) str[len - 1]] + asso_values[(int) str[0]];
+}
+
+const TAO_operation_db_entry *
+TAO_CORBA_ComponentIR_HomeDef_Perfect_Hash_OpTable::lookup (const char *str, unsigned int len)
+{
+ enum
+ {
+ TOTAL_KEYWORDS = 55,
+ MIN_WORD_LENGTH = 4,
+ MAX_WORD_LENGTH = 26,
+ MIN_HASH_VALUE = 4,
+ MAX_HASH_VALUE = 100,
+ HASH_VALUE_RANGE = 97,
+ DUPLICATES = 14,
+ WORDLIST_SIZE = 59
+ };
+
+ static const TAO_operation_db_entry wordlist[] =
+ {
+ {"",0,0},{"",0,0},{"",0,0},{"",0,0},
+ {"move", &POA_CORBA::ComponentIR::HomeDef::move_skel, 0},
+ {"_is_a", &POA_CORBA::ComponentIR::HomeDef::_is_a_skel, 0},
+ {"lookup", &POA_CORBA::ComponentIR::HomeDef::lookup_skel, 0},
+ {"_get_name", &POA_CORBA::ComponentIR::HomeDef::_get_name_skel, 0},
+ {"_get_type", &POA_CORBA::ComponentIR::HomeDef::_get_type_skel, 0},
+ {"_set_name", &POA_CORBA::ComponentIR::HomeDef::_set_name_skel, 0},
+ {"_interface", &POA_CORBA::ComponentIR::HomeDef::_interface_skel, 0},
+ {"lookup_name", &POA_CORBA::ComponentIR::HomeDef::lookup_name_skel, 0},
+ {"_get_base_home", &POA_CORBA::ComponentIR::HomeDef::_get_base_home_skel, 0},
+ {"_set_base_home", &POA_CORBA::ComponentIR::HomeDef::_set_base_home_skel, 0},
+ {"_get_absolute_name", &POA_CORBA::ComponentIR::HomeDef::_get_absolute_name_skel, 0},
+ {"is_a", &POA_CORBA::ComponentIR::HomeDef::is_a_skel, 0},
+ {"_get_primary_key", &POA_CORBA::ComponentIR::HomeDef::_get_primary_key_skel, 0},
+ {"_set_primary_key", &POA_CORBA::ComponentIR::HomeDef::_set_primary_key_skel, 0},
+ {"_get_id", &POA_CORBA::ComponentIR::HomeDef::_get_id_skel, 0},
+ {"_set_id", &POA_CORBA::ComponentIR::HomeDef::_set_id_skel, 0},
+ {"describe", &POA_CORBA::ComponentIR::HomeDef::describe_skel, 0},
+ {"_get_version", &POA_CORBA::ComponentIR::HomeDef::_get_version_skel, 0},
+ {"_set_version", &POA_CORBA::ComponentIR::HomeDef::_set_version_skel, 0},
+ {"_get_def_kind", &POA_CORBA::ComponentIR::HomeDef::_get_def_kind_skel, 0},
+ {"_repository_id", &POA_CORBA::ComponentIR::HomeDef::_repository_id_skel, 0},
+ {"_get_defined_in", &POA_CORBA::ComponentIR::HomeDef::_get_defined_in_skel, 0},
+ {"_get_containing_repository", &POA_CORBA::ComponentIR::HomeDef::_get_containing_repository_skel, 0},
+ {"destroy", &POA_CORBA::ComponentIR::HomeDef::destroy_skel, 0},
+ {"describe_interface", &POA_CORBA::ComponentIR::HomeDef::describe_interface_skel, 0},
+ {"describe_ext_interface", &POA_CORBA::ComponentIR::HomeDef::describe_ext_interface_skel, 0},
+ {"_component", &POA_CORBA::ComponentIR::HomeDef::_component_skel, 0},
+ {"_non_existent", &POA_CORBA::ComponentIR::HomeDef::_non_existent_skel, 0},
+ {"_get_base_interfaces", &POA_CORBA::ComponentIR::HomeDef::_get_base_interfaces_skel, 0},
+ {"_set_base_interfaces", &POA_CORBA::ComponentIR::HomeDef::_set_base_interfaces_skel, 0},
+ {"create_enum", &POA_CORBA::ComponentIR::HomeDef::create_enum_skel, 0},
+ {"create_value", &POA_CORBA::ComponentIR::HomeDef::create_value_skel, 0},
+ {"create_module", &POA_CORBA::ComponentIR::HomeDef::create_module_skel, 0},
+ {"create_native", &POA_CORBA::ComponentIR::HomeDef::create_native_skel, 0},
+ {"_get_supported_interfaces", &POA_CORBA::ComponentIR::HomeDef::_get_supported_interfaces_skel, 0},
+ {"_set_supported_interfaces", &POA_CORBA::ComponentIR::HomeDef::_set_supported_interfaces_skel, 0},
+ {"create_interface", &POA_CORBA::ComponentIR::HomeDef::create_interface_skel, 0},
+ {"create_attribute", &POA_CORBA::ComponentIR::HomeDef::create_attribute_skel, 0},
+ {"create_ext_value", &POA_CORBA::ComponentIR::HomeDef::create_ext_value_skel, 0},
+ {"_get_managed_component", &POA_CORBA::ComponentIR::HomeDef::_get_managed_component_skel, 0},
+ {"_set_managed_component", &POA_CORBA::ComponentIR::HomeDef::_set_managed_component_skel, 0},
+ {"create_finder", &POA_CORBA::ComponentIR::HomeDef::create_finder_skel, 0},
+ {"create_ext_attribute", &POA_CORBA::ComponentIR::HomeDef::create_ext_attribute_skel, 0},
+ {"create_value_box", &POA_CORBA::ComponentIR::HomeDef::create_value_box_skel, 0},
+ {"create_local_interface", &POA_CORBA::ComponentIR::HomeDef::create_local_interface_skel, 0},
+ {"create_factory", &POA_CORBA::ComponentIR::HomeDef::create_factory_skel, 0},
+ {"create_abstract_interface", &POA_CORBA::ComponentIR::HomeDef::create_abstract_interface_skel, 0},
+ {"describe_contents", &POA_CORBA::ComponentIR::HomeDef::describe_contents_skel, 0},
+ {"create_union", &POA_CORBA::ComponentIR::HomeDef::create_union_skel, 0},
+ {"create_exception", &POA_CORBA::ComponentIR::HomeDef::create_exception_skel, 0},
+ {"create_operation", &POA_CORBA::ComponentIR::HomeDef::create_operation_skel, 0},
+ {"contents", &POA_CORBA::ComponentIR::HomeDef::contents_skel, 0},
+ {"create_alias", &POA_CORBA::ComponentIR::HomeDef::create_alias_skel, 0},
+ {"create_struct", &POA_CORBA::ComponentIR::HomeDef::create_struct_skel, 0},
+ {"create_constant", &POA_CORBA::ComponentIR::HomeDef::create_constant_skel, 0},
+ };
+
+ static const signed char lookup[] =
+ {
+ -1, -1, -1, -1, 4, 5, 6, -7, -3, -102, 10, 11, -12, -2,
+ -102, -1, -1, -1, 14, 15, -1, -1, -16, -2, -18, -2, -104, -103,
+ 20, -1, -21, -2, -102, 23, 24, 25, 26, 27, 28, -1, -32, -2,
+ 29, -1, -36, -2, -38, -2, -40, -3, 30, -43, -2, 31, -1, -115,
+ 34, 35, -114, -1, -114, -113, -111, 45, -1, 46, 47, 48, -1, 49,
+ 50, -1, 51, -1, -1, -1, -1, 52, -1, -53, -2, -102, -1, -1,
+ -1, -1, -1, -1, 55, -1, -1, -1, 56, -1, -1, -1, -1, -1,
+ 57, -1, 58,
+ };
+
+ if (len <= MAX_WORD_LENGTH && len >= MIN_WORD_LENGTH)
+ {
+ unsigned int key = hash (str, len);
+
+ if (key <= MAX_HASH_VALUE && key >= MIN_HASH_VALUE)
+ {
+ int slot = lookup[key];
+
+ if (slot >= 0 && slot < WORDLIST_SIZE)
+ {
+ const char *s = wordlist[slot].opname;
+
+ if (*str == *s && !strncmp (str + 1, s + 1, len - 1))
+ return &wordlist[slot];
+ }
+ else if (slot < 0 && slot >= -MAX_HASH_VALUE)
+ return 0;
+ else
+ {
+ unsigned int offset = key + slot + (slot > 0 ? -MAX_HASH_VALUE : MAX_HASH_VALUE);
+ const TAO_operation_db_entry *base = &wordlist[-lookup[offset]];
+ const TAO_operation_db_entry *ptr = base + -lookup[offset + 1];
+
+ while (--ptr >= base)
+ if (*str == *ptr->opname && !strncmp (str + 1, ptr->opname + 1, len - 1))
+ return ptr;
+ }
+ }
+ }
+ return 0;
+}
+
+static TAO_CORBA_ComponentIR_HomeDef_Perfect_Hash_OpTable tao_CORBA_ComponentIR_HomeDef_optable;
+
+// TAO_IDL - Generated from
+// be\be_visitor_interface/interface_ss.cpp:966
+
+TAO::Collocation_Proxy_Broker *
+CORBA_ComponentIR__TAO_HomeDef_Proxy_Broker_Factory_function ( ::CORBA::Object_ptr)
+{
+ return reinterpret_cast<TAO::Collocation_Proxy_Broker *> (0xdead); // Dummy
+}
+
+int
+CORBA_ComponentIR__TAO_HomeDef_Proxy_Broker_Factory_Initializer (size_t)
+{
+ CORBA_ComponentIR__TAO_HomeDef_Proxy_Broker_Factory_function_pointer =
+ CORBA_ComponentIR__TAO_HomeDef_Proxy_Broker_Factory_function;
+
+ return 0;
+}
+
+static int
+CORBA_ComponentIR__TAO_HomeDef_Proxy_Broker_Stub_Factory_Initializer_Scarecrow =
+ CORBA_ComponentIR__TAO_HomeDef_Proxy_Broker_Factory_Initializer (
+ reinterpret_cast<size_t> (CORBA_ComponentIR__TAO_HomeDef_Proxy_Broker_Factory_Initializer)
+ );
+
+// TAO_IDL - Generated from
+// be\be_visitor_interface/interface_ss.cpp:103
+
+POA_CORBA::ComponentIR::HomeDef::HomeDef (void)
+ : TAO_ServantBase ()
+{
+ this->optable_ = &tao_CORBA_ComponentIR_HomeDef_optable;
+}
+
+POA_CORBA::ComponentIR::HomeDef::HomeDef (const HomeDef& rhs)
+ : TAO_Abstract_ServantBase (rhs),
+ TAO_ServantBase (rhs),
+ POA_CORBA::IRObject (rhs),
+ POA_CORBA::Container (rhs),
+ POA_CORBA::Contained (rhs),
+ POA_CORBA::IDLType (rhs),
+ POA_CORBA::InterfaceDef (rhs),
+ POA_CORBA::InterfaceAttrExtension (rhs),
+ POA_CORBA::ExtInterfaceDef (rhs)
+{
+}
+
+POA_CORBA::ComponentIR::HomeDef::~HomeDef (void)
+{
+}namespace POA_CORBA
+{
+ namespace ComponentIR
+ {
+
+
+ // TAO_IDL - Generated from
+ // be\be_visitor_operation/upcall_command_ss.cpp:127
+
+ class _get_base_home_HomeDef
+ : public TAO::Upcall_Command
+ {
+ public:
+ inline _get_base_home_HomeDef (
+ POA_CORBA::ComponentIR::HomeDef * servant,
+ TAO_Operation_Details const * operation_details,
+ TAO::Argument * const args[])
+ : servant_ (servant)
+ , operation_details_ (operation_details)
+ , args_ (args)
+ {
+ }
+
+ virtual void execute (ACE_ENV_SINGLE_ARG_DECL)
+ {
+ TAO::SArg_Traits< ::CORBA::ComponentIR::HomeDef>::ret_arg_type retval =
+ TAO::Portable_Server::get_ret_arg< ::CORBA::ComponentIR::HomeDef> (
+ this->operation_details_,
+ this->args_);
+
+ retval =
+ this->servant_->base_home (
+ ACE_ENV_SINGLE_ARG_PARAMETER);
+ ACE_CHECK;
+ }
+
+ private:
+ POA_CORBA::ComponentIR::HomeDef * const servant_;
+ TAO_Operation_Details const * const operation_details_;
+ TAO::Argument * const * const args_;
+ };
+ }
+
+}
+
+
+// TAO_IDL - Generated from
+// be\be_visitor_operation/operation_ss.cpp:190
+
+void POA_CORBA::ComponentIR::HomeDef::_get_base_home_skel (
+ TAO_ServerRequest & server_request,
+ void * TAO_INTERCEPTOR (servant_upcall),
+ void * servant
+ ACE_ENV_ARG_DECL
+ )
+{
+#if TAO_HAS_INTERCEPTORS == 1
+ static ::CORBA::TypeCode_ptr const * const exceptions = 0;
+ static ::CORBA::ULong const nexceptions = 0;
+#endif /* TAO_HAS_INTERCEPTORS */
+
+ TAO::SArg_Traits< ::CORBA::ComponentIR::HomeDef>::ret_val retval;
+
+ TAO::Argument * const args[] =
+ {
+ &retval
+ };
+
+ static size_t const nargs = 1;
+
+ POA_CORBA::ComponentIR::HomeDef * const impl =
+ static_cast<POA_CORBA::ComponentIR::HomeDef *> (servant);
+
+ _get_base_home_HomeDef command (
+ impl,
+ server_request.operation_details (),
+ args);
+
+ TAO::Upcall_Wrapper upcall_wrapper;
+ upcall_wrapper.upcall (server_request
+ , args
+ , nargs
+ , command
+#if TAO_HAS_INTERCEPTORS == 1
+ , servant_upcall
+ , exceptions
+ , nexceptions
+#endif /* TAO_HAS_INTERCEPTORS == 1 */
+ ACE_ENV_ARG_PARAMETER);
+ ACE_CHECK;
+}namespace POA_CORBA
+{
+ namespace ComponentIR
+ {
+
+
+ // TAO_IDL - Generated from
+ // be\be_visitor_operation/upcall_command_ss.cpp:127
+
+ class _set_base_home_HomeDef
+ : public TAO::Upcall_Command
+ {
+ public:
+ inline _set_base_home_HomeDef (
+ POA_CORBA::ComponentIR::HomeDef * servant,
+ TAO_Operation_Details const * operation_details,
+ TAO::Argument * const args[])
+ : servant_ (servant)
+ , operation_details_ (operation_details)
+ , args_ (args)
+ {
+ }
+
+ virtual void execute (ACE_ENV_SINGLE_ARG_DECL)
+ {
+ TAO::SArg_Traits< ::CORBA::ComponentIR::HomeDef>::in_arg_type arg_1 =
+ TAO::Portable_Server::get_in_arg< ::CORBA::ComponentIR::HomeDef> (
+ this->operation_details_,
+ this->args_,
+ 1);
+
+ this->servant_->base_home (
+ arg_1
+ ACE_ENV_ARG_PARAMETER);
+ ACE_CHECK;
+ }
+
+ private:
+ POA_CORBA::ComponentIR::HomeDef * const servant_;
+ TAO_Operation_Details const * const operation_details_;
+ TAO::Argument * const * const args_;
+ };
+ }
+
+}
+
+
+// TAO_IDL - Generated from
+// be\be_visitor_operation/operation_ss.cpp:190
+
+void POA_CORBA::ComponentIR::HomeDef::_set_base_home_skel (
+ TAO_ServerRequest & server_request,
+ void * TAO_INTERCEPTOR (servant_upcall),
+ void * servant
+ ACE_ENV_ARG_DECL
+ )
+{
+#if TAO_HAS_INTERCEPTORS == 1
+ static ::CORBA::TypeCode_ptr const * const exceptions = 0;
+ static ::CORBA::ULong const nexceptions = 0;
+#endif /* TAO_HAS_INTERCEPTORS */
+
+ TAO::SArg_Traits< void>::ret_val retval;
+ TAO::SArg_Traits< ::CORBA::ComponentIR::HomeDef>::in_arg_val _tao_base_home;
+
+ TAO::Argument * const args[] =
+ {
+ &retval,
+ &_tao_base_home
+ };
+
+ static size_t const nargs = 2;
+
+ POA_CORBA::ComponentIR::HomeDef * const impl =
+ static_cast<POA_CORBA::ComponentIR::HomeDef *> (servant);
+
+ _set_base_home_HomeDef command (
+ impl,
+ server_request.operation_details (),
+ args);
+
+ TAO::Upcall_Wrapper upcall_wrapper;
+ upcall_wrapper.upcall (server_request
+ , args
+ , nargs
+ , command
+#if TAO_HAS_INTERCEPTORS == 1
+ , servant_upcall
+ , exceptions
+ , nexceptions
+#endif /* TAO_HAS_INTERCEPTORS == 1 */
+ ACE_ENV_ARG_PARAMETER);
+ ACE_CHECK;
+}namespace POA_CORBA
+{
+ namespace ComponentIR
+ {
+
+
+ // TAO_IDL - Generated from
+ // be\be_visitor_operation/upcall_command_ss.cpp:127
+
+ class _get_supported_interfaces_HomeDef
+ : public TAO::Upcall_Command
+ {
+ public:
+ inline _get_supported_interfaces_HomeDef (
+ POA_CORBA::ComponentIR::HomeDef * servant,
+ TAO_Operation_Details const * operation_details,
+ TAO::Argument * const args[])
+ : servant_ (servant)
+ , operation_details_ (operation_details)
+ , args_ (args)
+ {
+ }
+
+ virtual void execute (ACE_ENV_SINGLE_ARG_DECL)
+ {
+ TAO::SArg_Traits< ::CORBA::InterfaceDefSeq>::ret_arg_type retval =
+ TAO::Portable_Server::get_ret_arg< ::CORBA::InterfaceDefSeq> (
+ this->operation_details_,
+ this->args_);
+
+ retval =
+ this->servant_->supported_interfaces (
+ ACE_ENV_SINGLE_ARG_PARAMETER);
+ ACE_CHECK;
+ }
+
+ private:
+ POA_CORBA::ComponentIR::HomeDef * const servant_;
+ TAO_Operation_Details const * const operation_details_;
+ TAO::Argument * const * const args_;
+ };
+ }
+
+}
+
+
+// TAO_IDL - Generated from
+// be\be_visitor_operation/operation_ss.cpp:190
+
+void POA_CORBA::ComponentIR::HomeDef::_get_supported_interfaces_skel (
+ TAO_ServerRequest & server_request,
+ void * TAO_INTERCEPTOR (servant_upcall),
+ void * servant
+ ACE_ENV_ARG_DECL
+ )
+{
+#if TAO_HAS_INTERCEPTORS == 1
+ static ::CORBA::TypeCode_ptr const * const exceptions = 0;
+ static ::CORBA::ULong const nexceptions = 0;
+#endif /* TAO_HAS_INTERCEPTORS */
+
+ TAO::SArg_Traits< ::CORBA::InterfaceDefSeq>::ret_val retval;
+
+ TAO::Argument * const args[] =
+ {
+ &retval
+ };
+
+ static size_t const nargs = 1;
+
+ POA_CORBA::ComponentIR::HomeDef * const impl =
+ static_cast<POA_CORBA::ComponentIR::HomeDef *> (servant);
+
+ _get_supported_interfaces_HomeDef command (
+ impl,
+ server_request.operation_details (),
+ args);
+
+ TAO::Upcall_Wrapper upcall_wrapper;
+ upcall_wrapper.upcall (server_request
+ , args
+ , nargs
+ , command
+#if TAO_HAS_INTERCEPTORS == 1
+ , servant_upcall
+ , exceptions
+ , nexceptions
+#endif /* TAO_HAS_INTERCEPTORS == 1 */
+ ACE_ENV_ARG_PARAMETER);
+ ACE_CHECK;
+}namespace POA_CORBA
+{
+ namespace ComponentIR
+ {
+
+
+ // TAO_IDL - Generated from
+ // be\be_visitor_operation/upcall_command_ss.cpp:127
+
+ class _set_supported_interfaces_HomeDef
+ : public TAO::Upcall_Command
+ {
+ public:
+ inline _set_supported_interfaces_HomeDef (
+ POA_CORBA::ComponentIR::HomeDef * servant,
+ TAO_Operation_Details const * operation_details,
+ TAO::Argument * const args[])
+ : servant_ (servant)
+ , operation_details_ (operation_details)
+ , args_ (args)
+ {
+ }
+
+ virtual void execute (ACE_ENV_SINGLE_ARG_DECL)
+ {
+ TAO::SArg_Traits< ::CORBA::InterfaceDefSeq>::in_arg_type arg_1 =
+ TAO::Portable_Server::get_in_arg< ::CORBA::InterfaceDefSeq> (
+ this->operation_details_,
+ this->args_,
+ 1);
+
+ this->servant_->supported_interfaces (
+ arg_1
+ ACE_ENV_ARG_PARAMETER);
+ ACE_CHECK;
+ }
+
+ private:
+ POA_CORBA::ComponentIR::HomeDef * const servant_;
+ TAO_Operation_Details const * const operation_details_;
+ TAO::Argument * const * const args_;
+ };
+ }
+
+}
+
+
+// TAO_IDL - Generated from
+// be\be_visitor_operation/operation_ss.cpp:190
+
+void POA_CORBA::ComponentIR::HomeDef::_set_supported_interfaces_skel (
+ TAO_ServerRequest & server_request,
+ void * TAO_INTERCEPTOR (servant_upcall),
+ void * servant
+ ACE_ENV_ARG_DECL
+ )
+{
+#if TAO_HAS_INTERCEPTORS == 1
+ static ::CORBA::TypeCode_ptr const * const exceptions = 0;
+ static ::CORBA::ULong const nexceptions = 0;
+#endif /* TAO_HAS_INTERCEPTORS */
+
+ TAO::SArg_Traits< void>::ret_val retval;
+ TAO::SArg_Traits< ::CORBA::InterfaceDefSeq>::in_arg_val _tao_supported_interfaces;
+
+ TAO::Argument * const args[] =
+ {
+ &retval,
+ &_tao_supported_interfaces
+ };
+
+ static size_t const nargs = 2;
+
+ POA_CORBA::ComponentIR::HomeDef * const impl =
+ static_cast<POA_CORBA::ComponentIR::HomeDef *> (servant);
+
+ _set_supported_interfaces_HomeDef command (
+ impl,
+ server_request.operation_details (),
+ args);
+
+ TAO::Upcall_Wrapper upcall_wrapper;
+ upcall_wrapper.upcall (server_request
+ , args
+ , nargs
+ , command
+#if TAO_HAS_INTERCEPTORS == 1
+ , servant_upcall
+ , exceptions
+ , nexceptions
+#endif /* TAO_HAS_INTERCEPTORS == 1 */
+ ACE_ENV_ARG_PARAMETER);
+ ACE_CHECK;
+}namespace POA_CORBA
+{
+ namespace ComponentIR
+ {
+
+
+ // TAO_IDL - Generated from
+ // be\be_visitor_operation/upcall_command_ss.cpp:127
+
+ class _get_managed_component_HomeDef
+ : public TAO::Upcall_Command
+ {
+ public:
+ inline _get_managed_component_HomeDef (
+ POA_CORBA::ComponentIR::HomeDef * servant,
+ TAO_Operation_Details const * operation_details,
+ TAO::Argument * const args[])
+ : servant_ (servant)
+ , operation_details_ (operation_details)
+ , args_ (args)
+ {
+ }
+
+ virtual void execute (ACE_ENV_SINGLE_ARG_DECL)
+ {
+ TAO::SArg_Traits< ::CORBA::ComponentIR::ComponentDef>::ret_arg_type retval =
+ TAO::Portable_Server::get_ret_arg< ::CORBA::ComponentIR::ComponentDef> (
+ this->operation_details_,
+ this->args_);
+
+ retval =
+ this->servant_->managed_component (
+ ACE_ENV_SINGLE_ARG_PARAMETER);
+ ACE_CHECK;
+ }
+
+ private:
+ POA_CORBA::ComponentIR::HomeDef * const servant_;
+ TAO_Operation_Details const * const operation_details_;
+ TAO::Argument * const * const args_;
+ };
+ }
+
+}
+
+
+// TAO_IDL - Generated from
+// be\be_visitor_operation/operation_ss.cpp:190
+
+void POA_CORBA::ComponentIR::HomeDef::_get_managed_component_skel (
+ TAO_ServerRequest & server_request,
+ void * TAO_INTERCEPTOR (servant_upcall),
+ void * servant
+ ACE_ENV_ARG_DECL
+ )
+{
+#if TAO_HAS_INTERCEPTORS == 1
+ static ::CORBA::TypeCode_ptr const * const exceptions = 0;
+ static ::CORBA::ULong const nexceptions = 0;
+#endif /* TAO_HAS_INTERCEPTORS */
+
+ TAO::SArg_Traits< ::CORBA::ComponentIR::ComponentDef>::ret_val retval;
+
+ TAO::Argument * const args[] =
+ {
+ &retval
+ };
+
+ static size_t const nargs = 1;
+
+ POA_CORBA::ComponentIR::HomeDef * const impl =
+ static_cast<POA_CORBA::ComponentIR::HomeDef *> (servant);
+
+ _get_managed_component_HomeDef command (
+ impl,
+ server_request.operation_details (),
+ args);
+
+ TAO::Upcall_Wrapper upcall_wrapper;
+ upcall_wrapper.upcall (server_request
+ , args
+ , nargs
+ , command
+#if TAO_HAS_INTERCEPTORS == 1
+ , servant_upcall
+ , exceptions
+ , nexceptions
+#endif /* TAO_HAS_INTERCEPTORS == 1 */
+ ACE_ENV_ARG_PARAMETER);
+ ACE_CHECK;
+}namespace POA_CORBA
+{
+ namespace ComponentIR
+ {
+
+
+ // TAO_IDL - Generated from
+ // be\be_visitor_operation/upcall_command_ss.cpp:127
+
+ class _set_managed_component_HomeDef
+ : public TAO::Upcall_Command
+ {
+ public:
+ inline _set_managed_component_HomeDef (
+ POA_CORBA::ComponentIR::HomeDef * servant,
+ TAO_Operation_Details const * operation_details,
+ TAO::Argument * const args[])
+ : servant_ (servant)
+ , operation_details_ (operation_details)
+ , args_ (args)
+ {
+ }
+
+ virtual void execute (ACE_ENV_SINGLE_ARG_DECL)
+ {
+ TAO::SArg_Traits< ::CORBA::ComponentIR::ComponentDef>::in_arg_type arg_1 =
+ TAO::Portable_Server::get_in_arg< ::CORBA::ComponentIR::ComponentDef> (
+ this->operation_details_,
+ this->args_,
+ 1);
+
+ this->servant_->managed_component (
+ arg_1
+ ACE_ENV_ARG_PARAMETER);
+ ACE_CHECK;
+ }
+
+ private:
+ POA_CORBA::ComponentIR::HomeDef * const servant_;
+ TAO_Operation_Details const * const operation_details_;
+ TAO::Argument * const * const args_;
+ };
+ }
+
+}
+
+
+// TAO_IDL - Generated from
+// be\be_visitor_operation/operation_ss.cpp:190
+
+void POA_CORBA::ComponentIR::HomeDef::_set_managed_component_skel (
+ TAO_ServerRequest & server_request,
+ void * TAO_INTERCEPTOR (servant_upcall),
+ void * servant
+ ACE_ENV_ARG_DECL
+ )
+{
+#if TAO_HAS_INTERCEPTORS == 1
+ static ::CORBA::TypeCode_ptr const * const exceptions = 0;
+ static ::CORBA::ULong const nexceptions = 0;
+#endif /* TAO_HAS_INTERCEPTORS */
+
+ TAO::SArg_Traits< void>::ret_val retval;
+ TAO::SArg_Traits< ::CORBA::ComponentIR::ComponentDef>::in_arg_val _tao_managed_component;
+
+ TAO::Argument * const args[] =
+ {
+ &retval,
+ &_tao_managed_component
+ };
+
+ static size_t const nargs = 2;
+
+ POA_CORBA::ComponentIR::HomeDef * const impl =
+ static_cast<POA_CORBA::ComponentIR::HomeDef *> (servant);
+
+ _set_managed_component_HomeDef command (
+ impl,
+ server_request.operation_details (),
+ args);
+
+ TAO::Upcall_Wrapper upcall_wrapper;
+ upcall_wrapper.upcall (server_request
+ , args
+ , nargs
+ , command
+#if TAO_HAS_INTERCEPTORS == 1
+ , servant_upcall
+ , exceptions
+ , nexceptions
+#endif /* TAO_HAS_INTERCEPTORS == 1 */
+ ACE_ENV_ARG_PARAMETER);
+ ACE_CHECK;
+}namespace POA_CORBA
+{
+ namespace ComponentIR
+ {
+
+
+ // TAO_IDL - Generated from
+ // be\be_visitor_operation/upcall_command_ss.cpp:127
+
+ class _get_primary_key_HomeDef
+ : public TAO::Upcall_Command
+ {
+ public:
+ inline _get_primary_key_HomeDef (
+ POA_CORBA::ComponentIR::HomeDef * servant,
+ TAO_Operation_Details const * operation_details,
+ TAO::Argument * const args[])
+ : servant_ (servant)
+ , operation_details_ (operation_details)
+ , args_ (args)
+ {
+ }
+
+ virtual void execute (ACE_ENV_SINGLE_ARG_DECL)
+ {
+ TAO::SArg_Traits< ::CORBA::ValueDef>::ret_arg_type retval =
+ TAO::Portable_Server::get_ret_arg< ::CORBA::ValueDef> (
+ this->operation_details_,
+ this->args_);
+
+ retval =
+ this->servant_->primary_key (
+ ACE_ENV_SINGLE_ARG_PARAMETER);
+ ACE_CHECK;
+ }
+
+ private:
+ POA_CORBA::ComponentIR::HomeDef * const servant_;
+ TAO_Operation_Details const * const operation_details_;
+ TAO::Argument * const * const args_;
+ };
+ }
+
+}
+
+
+// TAO_IDL - Generated from
+// be\be_visitor_operation/operation_ss.cpp:190
+
+void POA_CORBA::ComponentIR::HomeDef::_get_primary_key_skel (
+ TAO_ServerRequest & server_request,
+ void * TAO_INTERCEPTOR (servant_upcall),
+ void * servant
+ ACE_ENV_ARG_DECL
+ )
+{
+#if TAO_HAS_INTERCEPTORS == 1
+ static ::CORBA::TypeCode_ptr const * const exceptions = 0;
+ static ::CORBA::ULong const nexceptions = 0;
+#endif /* TAO_HAS_INTERCEPTORS */
+
+ TAO::SArg_Traits< ::CORBA::ValueDef>::ret_val retval;
+
+ TAO::Argument * const args[] =
+ {
+ &retval
+ };
+
+ static size_t const nargs = 1;
+
+ POA_CORBA::ComponentIR::HomeDef * const impl =
+ static_cast<POA_CORBA::ComponentIR::HomeDef *> (servant);
+
+ _get_primary_key_HomeDef command (
+ impl,
+ server_request.operation_details (),
+ args);
+
+ TAO::Upcall_Wrapper upcall_wrapper;
+ upcall_wrapper.upcall (server_request
+ , args
+ , nargs
+ , command
+#if TAO_HAS_INTERCEPTORS == 1
+ , servant_upcall
+ , exceptions
+ , nexceptions
+#endif /* TAO_HAS_INTERCEPTORS == 1 */
+ ACE_ENV_ARG_PARAMETER);
+ ACE_CHECK;
+}namespace POA_CORBA
+{
+ namespace ComponentIR
+ {
+
+
+ // TAO_IDL - Generated from
+ // be\be_visitor_operation/upcall_command_ss.cpp:127
+
+ class _set_primary_key_HomeDef
+ : public TAO::Upcall_Command
+ {
+ public:
+ inline _set_primary_key_HomeDef (
+ POA_CORBA::ComponentIR::HomeDef * servant,
+ TAO_Operation_Details const * operation_details,
+ TAO::Argument * const args[])
+ : servant_ (servant)
+ , operation_details_ (operation_details)
+ , args_ (args)
+ {
+ }
+
+ virtual void execute (ACE_ENV_SINGLE_ARG_DECL)
+ {
+ TAO::SArg_Traits< ::CORBA::ValueDef>::in_arg_type arg_1 =
+ TAO::Portable_Server::get_in_arg< ::CORBA::ValueDef> (
+ this->operation_details_,
+ this->args_,
+ 1);
+
+ this->servant_->primary_key (
+ arg_1
+ ACE_ENV_ARG_PARAMETER);
+ ACE_CHECK;
+ }
+
+ private:
+ POA_CORBA::ComponentIR::HomeDef * const servant_;
+ TAO_Operation_Details const * const operation_details_;
+ TAO::Argument * const * const args_;
+ };
+ }
+
+}
+
+
+// TAO_IDL - Generated from
+// be\be_visitor_operation/operation_ss.cpp:190
+
+void POA_CORBA::ComponentIR::HomeDef::_set_primary_key_skel (
+ TAO_ServerRequest & server_request,
+ void * TAO_INTERCEPTOR (servant_upcall),
+ void * servant
+ ACE_ENV_ARG_DECL
+ )
+{
+#if TAO_HAS_INTERCEPTORS == 1
+ static ::CORBA::TypeCode_ptr const * const exceptions = 0;
+ static ::CORBA::ULong const nexceptions = 0;
+#endif /* TAO_HAS_INTERCEPTORS */
+
+ TAO::SArg_Traits< void>::ret_val retval;
+ TAO::SArg_Traits< ::CORBA::ValueDef>::in_arg_val _tao_primary_key;
+
+ TAO::Argument * const args[] =
+ {
+ &retval,
+ &_tao_primary_key
+ };
+
+ static size_t const nargs = 2;
+
+ POA_CORBA::ComponentIR::HomeDef * const impl =
+ static_cast<POA_CORBA::ComponentIR::HomeDef *> (servant);
+
+ _set_primary_key_HomeDef command (
+ impl,
+ server_request.operation_details (),
+ args);
+
+ TAO::Upcall_Wrapper upcall_wrapper;
+ upcall_wrapper.upcall (server_request
+ , args
+ , nargs
+ , command
+#if TAO_HAS_INTERCEPTORS == 1
+ , servant_upcall
+ , exceptions
+ , nexceptions
+#endif /* TAO_HAS_INTERCEPTORS == 1 */
+ ACE_ENV_ARG_PARAMETER);
+ ACE_CHECK;
+}namespace POA_CORBA
+{
+ namespace ComponentIR
+ {
+
+
+ // TAO_IDL - Generated from
+ // be\be_visitor_operation/upcall_command_ss.cpp:127
+
+ class create_factory_HomeDef
+ : public TAO::Upcall_Command
+ {
+ public:
+ inline create_factory_HomeDef (
+ POA_CORBA::ComponentIR::HomeDef * servant,
+ TAO_Operation_Details const * operation_details,
+ TAO::Argument * const args[])
+ : servant_ (servant)
+ , operation_details_ (operation_details)
+ , args_ (args)
+ {
+ }
+
+ virtual void execute (ACE_ENV_SINGLE_ARG_DECL)
+ {
+ TAO::SArg_Traits< ::CORBA::ComponentIR::FactoryDef>::ret_arg_type retval =
+ TAO::Portable_Server::get_ret_arg< ::CORBA::ComponentIR::FactoryDef> (
+ this->operation_details_,
+ this->args_);
+
+ TAO::SArg_Traits< ::CORBA::RepositoryId>::in_arg_type arg_1 =
+ TAO::Portable_Server::get_in_arg< ::CORBA::RepositoryId> (
+ this->operation_details_,
+ this->args_,
+ 1);
+
+ TAO::SArg_Traits< ::CORBA::Identifier>::in_arg_type arg_2 =
+ TAO::Portable_Server::get_in_arg< ::CORBA::Identifier> (
+ this->operation_details_,
+ this->args_,
+ 2);
+
+ TAO::SArg_Traits< ::CORBA::VersionSpec>::in_arg_type arg_3 =
+ TAO::Portable_Server::get_in_arg< ::CORBA::VersionSpec> (
+ this->operation_details_,
+ this->args_,
+ 3);
+
+ TAO::SArg_Traits< ::CORBA::ParDescriptionSeq>::in_arg_type arg_4 =
+ TAO::Portable_Server::get_in_arg< ::CORBA::ParDescriptionSeq> (
+ this->operation_details_,
+ this->args_,
+ 4);
+
+ TAO::SArg_Traits< ::CORBA::ExceptionDefSeq>::in_arg_type arg_5 =
+ TAO::Portable_Server::get_in_arg< ::CORBA::ExceptionDefSeq> (
+ this->operation_details_,
+ this->args_,
+ 5);
+
+ retval =
+ this->servant_->create_factory (
+ arg_1
+ , arg_2
+ , arg_3
+ , arg_4
+ , arg_5
+ ACE_ENV_ARG_PARAMETER);
+ ACE_CHECK;
+ }
+
+ private:
+ POA_CORBA::ComponentIR::HomeDef * const servant_;
+ TAO_Operation_Details const * const operation_details_;
+ TAO::Argument * const * const args_;
+ };
+ }
+
+}
+
+
+// TAO_IDL - Generated from
+// be\be_visitor_operation/operation_ss.cpp:190
+
+void POA_CORBA::ComponentIR::HomeDef::create_factory_skel (
+ TAO_ServerRequest & server_request,
+ void * TAO_INTERCEPTOR (servant_upcall),
+ void * servant
+ ACE_ENV_ARG_DECL
+ )
+{
+#if TAO_HAS_INTERCEPTORS == 1
+ static ::CORBA::TypeCode_ptr const * const exceptions = 0;
+ static ::CORBA::ULong const nexceptions = 0;
+#endif /* TAO_HAS_INTERCEPTORS */
+
+ TAO::SArg_Traits< ::CORBA::ComponentIR::FactoryDef>::ret_val retval;
+ TAO::SArg_Traits< ::CORBA::RepositoryId>::in_arg_val _tao_id;
+ TAO::SArg_Traits< ::CORBA::Identifier>::in_arg_val _tao_name;
+ TAO::SArg_Traits< ::CORBA::VersionSpec>::in_arg_val _tao_version;
+ TAO::SArg_Traits< ::CORBA::ParDescriptionSeq>::in_arg_val _tao_params;
+ TAO::SArg_Traits< ::CORBA::ExceptionDefSeq>::in_arg_val _tao_exceptions;
+
+ TAO::Argument * const args[] =
+ {
+ &retval,
+ &_tao_id,
+ &_tao_name,
+ &_tao_version,
+ &_tao_params,
+ &_tao_exceptions
+ };
+
+ static size_t const nargs = 6;
+
+ POA_CORBA::ComponentIR::HomeDef * const impl =
+ static_cast<POA_CORBA::ComponentIR::HomeDef *> (servant);
+
+ create_factory_HomeDef command (
+ impl,
+ server_request.operation_details (),
+ args);
+
+ TAO::Upcall_Wrapper upcall_wrapper;
+ upcall_wrapper.upcall (server_request
+ , args
+ , nargs
+ , command
+#if TAO_HAS_INTERCEPTORS == 1
+ , servant_upcall
+ , exceptions
+ , nexceptions
+#endif /* TAO_HAS_INTERCEPTORS == 1 */
+ ACE_ENV_ARG_PARAMETER);
+ ACE_CHECK;
+}namespace POA_CORBA
+{
+ namespace ComponentIR
+ {
+
+
+ // TAO_IDL - Generated from
+ // be\be_visitor_operation/upcall_command_ss.cpp:127
+
+ class create_finder_HomeDef
+ : public TAO::Upcall_Command
+ {
+ public:
+ inline create_finder_HomeDef (
+ POA_CORBA::ComponentIR::HomeDef * servant,
+ TAO_Operation_Details const * operation_details,
+ TAO::Argument * const args[])
+ : servant_ (servant)
+ , operation_details_ (operation_details)
+ , args_ (args)
+ {
+ }
+
+ virtual void execute (ACE_ENV_SINGLE_ARG_DECL)
+ {
+ TAO::SArg_Traits< ::CORBA::ComponentIR::FinderDef>::ret_arg_type retval =
+ TAO::Portable_Server::get_ret_arg< ::CORBA::ComponentIR::FinderDef> (
+ this->operation_details_,
+ this->args_);
+
+ TAO::SArg_Traits< ::CORBA::RepositoryId>::in_arg_type arg_1 =
+ TAO::Portable_Server::get_in_arg< ::CORBA::RepositoryId> (
+ this->operation_details_,
+ this->args_,
+ 1);
+
+ TAO::SArg_Traits< ::CORBA::Identifier>::in_arg_type arg_2 =
+ TAO::Portable_Server::get_in_arg< ::CORBA::Identifier> (
+ this->operation_details_,
+ this->args_,
+ 2);
+
+ TAO::SArg_Traits< ::CORBA::VersionSpec>::in_arg_type arg_3 =
+ TAO::Portable_Server::get_in_arg< ::CORBA::VersionSpec> (
+ this->operation_details_,
+ this->args_,
+ 3);
+
+ TAO::SArg_Traits< ::CORBA::ParDescriptionSeq>::in_arg_type arg_4 =
+ TAO::Portable_Server::get_in_arg< ::CORBA::ParDescriptionSeq> (
+ this->operation_details_,
+ this->args_,
+ 4);
+
+ TAO::SArg_Traits< ::CORBA::ExceptionDefSeq>::in_arg_type arg_5 =
+ TAO::Portable_Server::get_in_arg< ::CORBA::ExceptionDefSeq> (
+ this->operation_details_,
+ this->args_,
+ 5);
+
+ retval =
+ this->servant_->create_finder (
+ arg_1
+ , arg_2
+ , arg_3
+ , arg_4
+ , arg_5
+ ACE_ENV_ARG_PARAMETER);
+ ACE_CHECK;
+ }
+
+ private:
+ POA_CORBA::ComponentIR::HomeDef * const servant_;
+ TAO_Operation_Details const * const operation_details_;
+ TAO::Argument * const * const args_;
+ };
+ }
+
+}
+
+
+// TAO_IDL - Generated from
+// be\be_visitor_operation/operation_ss.cpp:190
+
+void POA_CORBA::ComponentIR::HomeDef::create_finder_skel (
+ TAO_ServerRequest & server_request,
+ void * TAO_INTERCEPTOR (servant_upcall),
+ void * servant
+ ACE_ENV_ARG_DECL
+ )
+{
+#if TAO_HAS_INTERCEPTORS == 1
+ static ::CORBA::TypeCode_ptr const * const exceptions = 0;
+ static ::CORBA::ULong const nexceptions = 0;
+#endif /* TAO_HAS_INTERCEPTORS */
+
+ TAO::SArg_Traits< ::CORBA::ComponentIR::FinderDef>::ret_val retval;
+ TAO::SArg_Traits< ::CORBA::RepositoryId>::in_arg_val _tao_id;
+ TAO::SArg_Traits< ::CORBA::Identifier>::in_arg_val _tao_name;
+ TAO::SArg_Traits< ::CORBA::VersionSpec>::in_arg_val _tao_version;
+ TAO::SArg_Traits< ::CORBA::ParDescriptionSeq>::in_arg_val _tao_params;
+ TAO::SArg_Traits< ::CORBA::ExceptionDefSeq>::in_arg_val _tao_exceptions;
+
+ TAO::Argument * const args[] =
+ {
+ &retval,
+ &_tao_id,
+ &_tao_name,
+ &_tao_version,
+ &_tao_params,
+ &_tao_exceptions
+ };
+
+ static size_t const nargs = 6;
+
+ POA_CORBA::ComponentIR::HomeDef * const impl =
+ static_cast<POA_CORBA::ComponentIR::HomeDef *> (servant);
+
+ create_finder_HomeDef command (
+ impl,
+ server_request.operation_details (),
+ args);
+
+ TAO::Upcall_Wrapper upcall_wrapper;
+ upcall_wrapper.upcall (server_request
+ , args
+ , nargs
+ , command
+#if TAO_HAS_INTERCEPTORS == 1
+ , servant_upcall
+ , exceptions
+ , nexceptions
+#endif /* TAO_HAS_INTERCEPTORS == 1 */
+ ACE_ENV_ARG_PARAMETER);
+ ACE_CHECK;
+}
+
+// TAO_IDL - Generated from
+// be\be_visitor_interface/interface_ss.cpp:169
+
+namespace POA_CORBA
+{
+ namespace ComponentIR
+ {
+
+
+ // TAO_IDL - Generated from
+ // be\be_visitor_operation/upcall_command_ss.cpp:127
+
+ class _is_a_HomeDef_Upcall_Command
+ : public TAO::Upcall_Command
+ {
+ public:
+ inline _is_a_HomeDef_Upcall_Command (
+ POA_CORBA::ComponentIR::HomeDef * servant,
+ TAO_Operation_Details const * operation_details,
+ TAO::Argument * const args[])
+ : servant_ (servant)
+ , operation_details_ (operation_details)
+ , args_ (args)
+ {
+ }
+
+ virtual void execute (ACE_ENV_SINGLE_ARG_DECL)
+ {
+ TAO::SArg_Traits< ::ACE_InputCDR::to_boolean>::ret_arg_type retval =
+ TAO::Portable_Server::get_ret_arg< ::ACE_InputCDR::to_boolean> (
+ this->operation_details_,
+ this->args_);
+
+ TAO::SArg_Traits< ::CORBA::Char *>::in_arg_type arg_1 =
+ TAO::Portable_Server::get_in_arg< ::CORBA::Char *> (
+ this->operation_details_,
+ this->args_,
+ 1);
+
+ retval =
+ this->servant_-> _is_a (
+ arg_1
+ ACE_ENV_ARG_PARAMETER);
+ ACE_CHECK;
+ }
+
+ private:
+ POA_CORBA::ComponentIR::HomeDef * const servant_;
+ TAO_Operation_Details const * const operation_details_;
+ TAO::Argument * const * const args_;
+ };
+ }
+
+}
+
+
+void POA_CORBA::ComponentIR::HomeDef::_is_a_skel (
+ TAO_ServerRequest & server_request,
+ void * TAO_INTERCEPTOR (servant_upcall),
+ void * servant
+ ACE_ENV_ARG_DECL
+ )
+{
+#if TAO_HAS_INTERCEPTORS == 1
+ static ::CORBA::TypeCode_ptr const * const exceptions = 0;
+ static ::CORBA::ULong const nexceptions = 0;
+#endif /* TAO_HAS_INTERCEPTORS */
+
+ TAO::SArg_Traits< ::ACE_InputCDR::to_boolean>::ret_val retval;
+ TAO::SArg_Traits< ::CORBA::Char *>::in_arg_val _tao_repository_id;
+
+ TAO::Argument * const args[] =
+ {
+ &retval,
+ &_tao_repository_id
+ };
+
+ static size_t const nargs = 2;
+
+ POA_CORBA::ComponentIR::HomeDef * const impl =
+ static_cast<POA_CORBA::ComponentIR::HomeDef *> (servant);
+
+ _is_a_HomeDef_Upcall_Command command (
+ impl,
+ server_request.operation_details (),
+ args);
+
+ TAO::Upcall_Wrapper upcall_wrapper;
+ upcall_wrapper.upcall (server_request
+ , args
+ , nargs
+ , command
+#if TAO_HAS_INTERCEPTORS == 1
+ , servant_upcall
+ , exceptions
+ , nexceptions
+#endif /* TAO_HAS_INTERCEPTORS == 1 */
+ ACE_ENV_ARG_PARAMETER);
+ ACE_CHECK;
+}namespace POA_CORBA
+{
+ namespace ComponentIR
+ {
+
+
+ // TAO_IDL - Generated from
+ // be\be_visitor_operation/upcall_command_ss.cpp:127
+
+ class _non_existent_HomeDef_Upcall_Command
+ : public TAO::Upcall_Command
+ {
+ public:
+ inline _non_existent_HomeDef_Upcall_Command (
+ POA_CORBA::ComponentIR::HomeDef * servant,
+ TAO_Operation_Details const * operation_details,
+ TAO::Argument * const args[])
+ : servant_ (servant)
+ , operation_details_ (operation_details)
+ , args_ (args)
+ {
+ }
+
+ virtual void execute (ACE_ENV_SINGLE_ARG_DECL)
+ {
+ TAO::SArg_Traits< ::ACE_InputCDR::to_boolean>::ret_arg_type retval =
+ TAO::Portable_Server::get_ret_arg< ::ACE_InputCDR::to_boolean> (
+ this->operation_details_,
+ this->args_);
+
+ retval =
+ this->servant_-> _non_existent (
+ ACE_ENV_SINGLE_ARG_PARAMETER);
+ ACE_CHECK;
+ }
+
+ private:
+ POA_CORBA::ComponentIR::HomeDef * const servant_;
+ TAO_Operation_Details const * const operation_details_;
+ TAO::Argument * const * const args_;
+ };
+ }
+
+}
+
+
+void POA_CORBA::ComponentIR::HomeDef::_non_existent_skel (
+ TAO_ServerRequest & server_request,
+ void * TAO_INTERCEPTOR (servant_upcall),
+ void * servant
+ ACE_ENV_ARG_DECL
+ )
+{
+#if TAO_HAS_INTERCEPTORS == 1
+ static ::CORBA::TypeCode_ptr const * const exceptions = 0;
+ static ::CORBA::ULong const nexceptions = 0;
+#endif /* TAO_HAS_INTERCEPTORS */
+
+ TAO::SArg_Traits< ::ACE_InputCDR::to_boolean>::ret_val retval;
+
+ TAO::Argument * const args[] =
+ {
+ &retval
+ };
+
+ static size_t const nargs = 1;
+
+ POA_CORBA::ComponentIR::HomeDef * const impl =
+ static_cast<POA_CORBA::ComponentIR::HomeDef *> (servant);
+
+ _non_existent_HomeDef_Upcall_Command command (
+ impl,
+ server_request.operation_details (),
+ args);
+
+ TAO::Upcall_Wrapper upcall_wrapper;
+ upcall_wrapper.upcall (server_request
+ , args
+ , nargs
+ , command
+#if TAO_HAS_INTERCEPTORS == 1
+ , servant_upcall
+ , exceptions
+ , nexceptions
+#endif /* TAO_HAS_INTERCEPTORS == 1 */
+ ACE_ENV_ARG_PARAMETER);
+ ACE_CHECK;
+}namespace POA_CORBA
+{
+ namespace ComponentIR
+ {
+
+
+ // TAO_IDL - Generated from
+ // be\be_visitor_operation/upcall_command_ss.cpp:127
+
+ class _repository_id_HomeDef_Upcall_Command
+ : public TAO::Upcall_Command
+ {
+ public:
+ inline _repository_id_HomeDef_Upcall_Command (
+ POA_CORBA::ComponentIR::HomeDef * servant,
+ TAO_Operation_Details const * operation_details,
+ TAO::Argument * const args[])
+ : servant_ (servant)
+ , operation_details_ (operation_details)
+ , args_ (args)
+ {
+ }
+
+ virtual void execute (ACE_ENV_SINGLE_ARG_DECL)
+ {
+ TAO::SArg_Traits< ::CORBA::Char *>::ret_arg_type retval =
+ TAO::Portable_Server::get_ret_arg< ::CORBA::Char *> (
+ this->operation_details_,
+ this->args_);
+
+ retval =
+ this->servant_-> _repository_id (
+ ACE_ENV_SINGLE_ARG_PARAMETER);
+ ACE_CHECK;
+ }
+
+ private:
+ POA_CORBA::ComponentIR::HomeDef * const servant_;
+ TAO_Operation_Details const * const operation_details_;
+ TAO::Argument * const * const args_;
+ };
+ }
+
+}
+
+
+void POA_CORBA::ComponentIR::HomeDef::_repository_id_skel (
+ TAO_ServerRequest & server_request,
+ void * TAO_INTERCEPTOR (servant_upcall),
+ void * servant
+ ACE_ENV_ARG_DECL
+ )
+{
+#if TAO_HAS_INTERCEPTORS == 1
+ static ::CORBA::TypeCode_ptr const * const exceptions = 0;
+ static ::CORBA::ULong const nexceptions = 0;
+#endif /* TAO_HAS_INTERCEPTORS */
+
+ TAO::SArg_Traits< ::CORBA::Char *>::ret_val retval;
+
+ TAO::Argument * const args[] =
+ {
+ &retval
+ };
+
+ static size_t const nargs = 1;
+
+ POA_CORBA::ComponentIR::HomeDef * const impl =
+ static_cast<POA_CORBA::ComponentIR::HomeDef *> (servant);
+
+ _repository_id_HomeDef_Upcall_Command command (
+ impl,
+ server_request.operation_details (),
+ args);
+
+ TAO::Upcall_Wrapper upcall_wrapper;
+ upcall_wrapper.upcall (server_request
+ , args
+ , nargs
+ , command
+#if TAO_HAS_INTERCEPTORS == 1
+ , servant_upcall
+ , exceptions
+ , nexceptions
+#endif /* TAO_HAS_INTERCEPTORS == 1 */
+ ACE_ENV_ARG_PARAMETER);
+ ACE_CHECK;
+}
+
+// TAO_IDL - Generated from
+// be\be_visitor_interface/interface_ss.cpp:513
+
+void POA_CORBA::ComponentIR::HomeDef::_interface_skel (
+ TAO_ServerRequest & server_request,
+ void * /* servant_upcall */,
+ void * servant
+ ACE_ENV_ARG_DECL
+ )
+{
+ TAO_IFR_Client_Adapter *_tao_adapter =
+ ACE_Dynamic_Service<TAO_IFR_Client_Adapter>::instance (
+ TAO_ORB_Core::ifr_client_adapter_name ()
+ );
+
+ if (_tao_adapter == 0)
+ {
+ ACE_THROW ( ::CORBA::INTF_REPOS ( ::CORBA::OMGVMCID | 1,
+ ::CORBA::COMPLETED_NO));
+ }
+
+ POA_CORBA::ComponentIR::HomeDef * const impl =
+ static_cast<POA_CORBA::ComponentIR::HomeDef *> (servant);
+ ::CORBA::InterfaceDef_ptr _tao_retval =
+ impl->_get_interface (ACE_ENV_SINGLE_ARG_PARAMETER);
+ ACE_CHECK;
+
+ server_request.init_reply ();
+ TAO_OutputCDR &_tao_out = *server_request.outgoing ();
+
+ ::CORBA::Boolean const _tao_result =
+ _tao_adapter->interfacedef_cdr_insert (
+ _tao_out,
+ _tao_retval
+ );
+
+ _tao_adapter->dispose (_tao_retval);
+
+ if (_tao_result == false)
+ {
+ ACE_THROW ( ::CORBA::MARSHAL ());
+ }
+}namespace POA_CORBA
+{
+ namespace ComponentIR
+ {
+
+
+ // TAO_IDL - Generated from
+ // be\be_visitor_operation/upcall_command_ss.cpp:127
+
+ class _get_component_HomeDef_Upcall_Command
+ : public TAO::Upcall_Command
+ {
+ public:
+ inline _get_component_HomeDef_Upcall_Command (
+ POA_CORBA::ComponentIR::HomeDef * servant,
+ TAO_Operation_Details const * operation_details,
+ TAO::Argument * const args[])
+ : servant_ (servant)
+ , operation_details_ (operation_details)
+ , args_ (args)
+ {
+ }
+
+ virtual void execute (ACE_ENV_SINGLE_ARG_DECL)
+ {
+ TAO::SArg_Traits< ::CORBA::Object>::ret_arg_type retval =
+ TAO::Portable_Server::get_ret_arg< ::CORBA::Object> (
+ this->operation_details_,
+ this->args_);
+
+ retval =
+ this->servant_-> _get_component (
+ ACE_ENV_SINGLE_ARG_PARAMETER);
+ ACE_CHECK;
+ }
+
+ private:
+ POA_CORBA::ComponentIR::HomeDef * const servant_;
+ TAO_Operation_Details const * const operation_details_;
+ TAO::Argument * const * const args_;
+ };
+ }
+
+}
+
+
+void POA_CORBA::ComponentIR::HomeDef::_component_skel (
+ TAO_ServerRequest & server_request,
+ void * TAO_INTERCEPTOR (servant_upcall),
+ void * servant
+ ACE_ENV_ARG_DECL
+ )
+{
+#if TAO_HAS_INTERCEPTORS == 1
+ static ::CORBA::TypeCode_ptr const * const exceptions = 0;
+ static ::CORBA::ULong const nexceptions = 0;
+#endif /* TAO_HAS_INTERCEPTORS */
+
+ TAO::SArg_Traits< ::CORBA::Object>::ret_val retval;
+
+ TAO::Argument * const args[] =
+ {
+ &retval
+ };
+
+ static size_t const nargs = 1;
+
+ POA_CORBA::ComponentIR::HomeDef * const impl =
+ static_cast<POA_CORBA::ComponentIR::HomeDef *> (servant);
+
+ _get_component_HomeDef_Upcall_Command command (
+ impl,
+ server_request.operation_details (),
+ args);
+
+ TAO::Upcall_Wrapper upcall_wrapper;
+ upcall_wrapper.upcall (server_request
+ , args
+ , nargs
+ , command
+#if TAO_HAS_INTERCEPTORS == 1
+ , servant_upcall
+ , exceptions
+ , nexceptions
+#endif /* TAO_HAS_INTERCEPTORS == 1 */
+ ACE_ENV_ARG_PARAMETER);
+ ACE_CHECK;
+}
+
+::CORBA::Boolean POA_CORBA::ComponentIR::HomeDef::_is_a (
+ const char* value
+ ACE_ENV_ARG_DECL_NOT_USED
+ )
+{
+ return
+ (
+ !ACE_OS::strcmp (
+ value,
+ "IDL:omg.org/CORBA/IRObject:1.0"
+ ) ||
+ !ACE_OS::strcmp (
+ value,
+ "IDL:omg.org/CORBA/Container:1.0"
+ ) ||
+ !ACE_OS::strcmp (
+ value,
+ "IDL:omg.org/CORBA/Contained:1.0"
+ ) ||
+ !ACE_OS::strcmp (
+ value,
+ "IDL:omg.org/CORBA/IDLType:1.0"
+ ) ||
+ !ACE_OS::strcmp (
+ value,
+ "IDL:omg.org/CORBA/InterfaceDef:1.0"
+ ) ||
+ !ACE_OS::strcmp (
+ value,
+ "IDL:omg.org/CORBA/InterfaceAttrExtension:1.0"
+ ) ||
+ !ACE_OS::strcmp (
+ value,
+ "IDL:omg.org/CORBA/ExtInterfaceDef:1.0"
+ ) ||
+ !ACE_OS::strcmp (
+ value,
+ "IDL:omg.org/CORBA/ComponentIR/HomeDef:1.0"
+ ) ||
+ !ACE_OS::strcmp (
+ value,
+ "IDL:omg.org/CORBA/Object:1.0"
+ )
+ );
+}
+
+const char* POA_CORBA::ComponentIR::HomeDef::_interface_repository_id (void) const
+{
+ return "IDL:omg.org/CORBA/ComponentIR/HomeDef:1.0";
+}
+
+// TAO_IDL - Generated from
+// be\be_visitor_interface/interface_ss.cpp:903
+
+void POA_CORBA::ComponentIR::HomeDef::_dispatch (
+ TAO_ServerRequest & req,
+ void * servant_upcall
+ ACE_ENV_ARG_DECL
+ )
+{
+ this->synchronous_upcall_dispatch (req,
+ servant_upcall,
+ this
+ ACE_ENV_ARG_PARAMETER);
+}
+
+// TAO_IDL - Generated from
+// be\be_visitor_interface/interface_ss.cpp:851
+
+CORBA::ComponentIR::HomeDef *
+POA_CORBA::ComponentIR::HomeDef::_this (ACE_ENV_SINGLE_ARG_DECL)
+{
+ TAO_Stub *stub = this->_create_stub (ACE_ENV_SINGLE_ARG_PARAMETER);
+ ACE_CHECK_RETURN (0);
+
+ TAO_Stub_Auto_Ptr safe_stub (stub);
+ ::CORBA::Object_ptr tmp = CORBA::Object::_nil ();
+
+ ::CORBA::Boolean const _tao_opt_colloc =
+ stub->servant_orb_var ()->orb_core ()->optimize_collocation_objects ();
+
+ ACE_NEW_RETURN (
+ tmp,
+ ::CORBA::Object (stub, _tao_opt_colloc, this),
+ 0
+ );
+
+ ::CORBA::Object_var obj = tmp;
+ (void) safe_stub.release ();
+
+ typedef ::CORBA::ComponentIR::HomeDef STUB_SCOPED_NAME;
+ return
+ TAO::Narrow_Utils<STUB_SCOPED_NAME>::unchecked_narrow (
+ obj.in (),
+ CORBA_ComponentIR__TAO_HomeDef_Proxy_Broker_Factory_function_pointer
+ );
+}
+
+TAO_END_VERSIONED_NAMESPACE_DECL
+
+
+
+#endif /* ifndef */
+
diff --git a/TAO/orbsvcs/orbsvcs/IFRService/IFR_ComponentsS.h b/TAO/orbsvcs/orbsvcs/IFRService/IFR_ComponentsS.h
new file mode 100644
index 00000000000..096de121f5f
--- /dev/null
+++ b/TAO/orbsvcs/orbsvcs/IFRService/IFR_ComponentsS.h
@@ -0,0 +1,5119 @@
+// -*- C++ -*-
+//
+// $Id$
+
+// **** Code generated by the The ACE ORB (TAO) IDL Compiler ****
+// TAO and the TAO IDL Compiler have been developed by:
+// Center for Distributed Object Computing
+// Washington University
+// St. Louis, MO
+// USA
+// http://www.cs.wustl.edu/~schmidt/doc-center.html
+// and
+// Distributed Object Computing Laboratory
+// University of California at Irvine
+// Irvine, CA
+// USA
+// http://doc.ece.uci.edu/
+// and
+// Institute for Software Integrated Systems
+// Vanderbilt University
+// Nashville, TN
+// USA
+// http://www.isis.vanderbilt.edu/
+//
+// Information about TAO is available at:
+// http://www.cs.wustl.edu/~schmidt/TAO.html
+
+// TAO_IDL - Generated from
+// be\be_codegen.cpp:409
+
+#ifndef _TAO_IDL____ORBSVCS_ORBSVCS_IFRSERVICE_IFR_COMPONENTSS_H_
+#define _TAO_IDL____ORBSVCS_ORBSVCS_IFRSERVICE_IFR_COMPONENTSS_H_
+
+#include /**/ "ace/pre.h"
+
+#include "tao/IFR_Client/IFR_ComponentsC.h"
+#include "orbsvcs/IFRService/IFR_ExtendedS.h"
+
+#if !defined (ACE_LACKS_PRAGMA_ONCE)
+# pragma once
+#endif /* ACE_LACKS_PRAGMA_ONCE */
+
+#include "tao/Collocation_Proxy_Broker.h"
+#include "tao/PortableServer/PortableServer.h"
+#include "tao/PortableServer/Servant_Base.h"
+
+TAO_BEGIN_VERSIONED_NAMESPACE_DECL
+
+
+
+// TAO_IDL - Generated from
+// be\be_visitor_module/module_sh.cpp:49
+
+namespace POA_CORBA
+{
+
+
+ // TAO_IDL - Generated from
+ // be\be_visitor_module/module_sh.cpp:49
+
+ namespace ComponentIR
+ {
+
+
+ // TAO_IDL - Generated from
+ // be\be_visitor_interface/interface_sh.cpp:87
+
+ class EventDef;
+ typedef EventDef *EventDef_ptr;
+
+ class EventDef
+ : public virtual POA_CORBA::ExtValueDef
+ {
+ protected:
+ EventDef (void);
+
+ public:
+ // Useful for template programming.
+ typedef ::CORBA::ComponentIR::EventDef _stub_type;
+ typedef ::CORBA::ComponentIR::EventDef_ptr _stub_ptr_type;
+ typedef ::CORBA::ComponentIR::EventDef_var _stub_var_type;
+
+ EventDef (const EventDef& rhs);
+ virtual ~EventDef (void);
+
+ virtual ::CORBA::Boolean _is_a (
+ const char* logical_type_id
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS
+ );
+
+ static void _is_a_skel (
+ TAO_ServerRequest & req,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL
+ );
+
+ static void _non_existent_skel (
+ TAO_ServerRequest & req,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL
+ );
+
+ static void _interface_skel (
+ TAO_ServerRequest & req,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL
+ );
+
+ static void _component_skel (
+ TAO_ServerRequest & req,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL
+ );
+
+ static void _repository_id_skel (
+ TAO_ServerRequest & req,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL
+ );
+
+ virtual void _dispatch (
+ TAO_ServerRequest & req,
+ void * servant_upcall
+ ACE_ENV_ARG_DECL
+ );
+
+ ::CORBA::ComponentIR::EventDef *_this (
+
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS
+ );
+
+ virtual const char* _interface_repository_id (void) const;
+
+ static void
+ _get_def_kind_skel (
+ TAO_ServerRequest & server_request,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS
+ );
+
+ // TAO_IDL - Generated from
+ // be\be_interface.cpp:1955
+
+ static void
+ destroy_skel (
+ TAO_ServerRequest & server_request,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS
+ );
+
+ // TAO_IDL - Generated from
+ // be\be_interface.cpp:1955
+
+ static void
+ lookup_skel (
+ TAO_ServerRequest & server_request,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS
+ );
+
+ // TAO_IDL - Generated from
+ // be\be_interface.cpp:1955
+
+ static void
+ contents_skel (
+ TAO_ServerRequest & server_request,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS
+ );
+
+ // TAO_IDL - Generated from
+ // be\be_interface.cpp:1955
+
+ static void
+ lookup_name_skel (
+ TAO_ServerRequest & server_request,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS
+ );
+
+ // TAO_IDL - Generated from
+ // be\be_interface.cpp:1955
+
+ static void
+ describe_contents_skel (
+ TAO_ServerRequest & server_request,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS
+ );
+
+ // TAO_IDL - Generated from
+ // be\be_interface.cpp:1955
+
+ static void
+ create_module_skel (
+ TAO_ServerRequest & server_request,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS
+ );
+
+ // TAO_IDL - Generated from
+ // be\be_interface.cpp:1955
+
+ static void
+ create_constant_skel (
+ TAO_ServerRequest & server_request,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS
+ );
+
+ // TAO_IDL - Generated from
+ // be\be_interface.cpp:1955
+
+ static void
+ create_struct_skel (
+ TAO_ServerRequest & server_request,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS
+ );
+
+ // TAO_IDL - Generated from
+ // be\be_interface.cpp:1955
+
+ static void
+ create_union_skel (
+ TAO_ServerRequest & server_request,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS
+ );
+
+ // TAO_IDL - Generated from
+ // be\be_interface.cpp:1955
+
+ static void
+ create_enum_skel (
+ TAO_ServerRequest & server_request,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS
+ );
+
+ // TAO_IDL - Generated from
+ // be\be_interface.cpp:1955
+
+ static void
+ create_alias_skel (
+ TAO_ServerRequest & server_request,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS
+ );
+
+ // TAO_IDL - Generated from
+ // be\be_interface.cpp:1955
+
+ static void
+ create_interface_skel (
+ TAO_ServerRequest & server_request,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS
+ );
+
+ // TAO_IDL - Generated from
+ // be\be_interface.cpp:1955
+
+ static void
+ create_value_skel (
+ TAO_ServerRequest & server_request,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS
+ );
+
+ // TAO_IDL - Generated from
+ // be\be_interface.cpp:1955
+
+ static void
+ create_value_box_skel (
+ TAO_ServerRequest & server_request,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS
+ );
+
+ // TAO_IDL - Generated from
+ // be\be_interface.cpp:1955
+
+ static void
+ create_exception_skel (
+ TAO_ServerRequest & server_request,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS
+ );
+
+ // TAO_IDL - Generated from
+ // be\be_interface.cpp:1955
+
+ static void
+ create_native_skel (
+ TAO_ServerRequest & server_request,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS
+ );
+
+ // TAO_IDL - Generated from
+ // be\be_interface.cpp:1955
+
+ static void
+ create_abstract_interface_skel (
+ TAO_ServerRequest & server_request,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS
+ );
+
+ // TAO_IDL - Generated from
+ // be\be_interface.cpp:1955
+
+ static void
+ create_local_interface_skel (
+ TAO_ServerRequest & server_request,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS
+ );
+
+ // TAO_IDL - Generated from
+ // be\be_interface.cpp:1955
+
+ static void
+ create_ext_value_skel (
+ TAO_ServerRequest & server_request,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS
+ );
+
+ static void
+ _get_id_skel (
+ TAO_ServerRequest & server_request,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS
+ );
+
+ static void
+ _set_id_skel (
+ TAO_ServerRequest & server_request,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS
+ );
+
+ static void
+ _get_name_skel (
+ TAO_ServerRequest & server_request,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS
+ );
+
+ static void
+ _set_name_skel (
+ TAO_ServerRequest & server_request,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS
+ );
+
+ static void
+ _get_version_skel (
+ TAO_ServerRequest & server_request,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS
+ );
+
+ static void
+ _set_version_skel (
+ TAO_ServerRequest & server_request,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS
+ );
+
+ static void
+ _get_defined_in_skel (
+ TAO_ServerRequest & server_request,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS
+ );
+
+ static void
+ _get_absolute_name_skel (
+ TAO_ServerRequest & server_request,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS
+ );
+
+ static void
+ _get_containing_repository_skel (
+ TAO_ServerRequest & server_request,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS
+ );
+
+ // TAO_IDL - Generated from
+ // be\be_interface.cpp:1955
+
+ static void
+ describe_skel (
+ TAO_ServerRequest & server_request,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS
+ );
+
+ // TAO_IDL - Generated from
+ // be\be_interface.cpp:1955
+
+ static void
+ move_skel (
+ TAO_ServerRequest & server_request,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS
+ );
+
+ static void
+ _get_type_skel (
+ TAO_ServerRequest & server_request,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS
+ );
+
+ static void
+ _get_supported_interfaces_skel (
+ TAO_ServerRequest & server_request,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS
+ );
+
+ static void
+ _set_supported_interfaces_skel (
+ TAO_ServerRequest & server_request,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS
+ );
+
+ static void
+ _get_initializers_skel (
+ TAO_ServerRequest & server_request,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS
+ );
+
+ static void
+ _set_initializers_skel (
+ TAO_ServerRequest & server_request,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS
+ );
+
+ static void
+ _get_base_value_skel (
+ TAO_ServerRequest & server_request,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS
+ );
+
+ static void
+ _set_base_value_skel (
+ TAO_ServerRequest & server_request,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS
+ );
+
+ static void
+ _get_abstract_base_values_skel (
+ TAO_ServerRequest & server_request,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS
+ );
+
+ static void
+ _set_abstract_base_values_skel (
+ TAO_ServerRequest & server_request,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS
+ );
+
+ static void
+ _get_is_abstract_skel (
+ TAO_ServerRequest & server_request,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS
+ );
+
+ static void
+ _set_is_abstract_skel (
+ TAO_ServerRequest & server_request,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS
+ );
+
+ static void
+ _get_is_custom_skel (
+ TAO_ServerRequest & server_request,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS
+ );
+
+ static void
+ _set_is_custom_skel (
+ TAO_ServerRequest & server_request,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS
+ );
+
+ static void
+ _get_is_truncatable_skel (
+ TAO_ServerRequest & server_request,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS
+ );
+
+ static void
+ _set_is_truncatable_skel (
+ TAO_ServerRequest & server_request,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS
+ );
+
+ // TAO_IDL - Generated from
+ // be\be_interface.cpp:1955
+
+ static void
+ is_a_skel (
+ TAO_ServerRequest & server_request,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS
+ );
+
+ // TAO_IDL - Generated from
+ // be\be_interface.cpp:1955
+
+ static void
+ describe_value_skel (
+ TAO_ServerRequest & server_request,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS
+ );
+
+ // TAO_IDL - Generated from
+ // be\be_interface.cpp:1955
+
+ static void
+ create_value_member_skel (
+ TAO_ServerRequest & server_request,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS
+ );
+
+ // TAO_IDL - Generated from
+ // be\be_interface.cpp:1955
+
+ static void
+ create_attribute_skel (
+ TAO_ServerRequest & server_request,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS
+ );
+
+ // TAO_IDL - Generated from
+ // be\be_interface.cpp:1955
+
+ static void
+ create_operation_skel (
+ TAO_ServerRequest & server_request,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS
+ );
+
+ static void
+ _get_ext_initializers_skel (
+ TAO_ServerRequest & server_request,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS
+ );
+
+ static void
+ _set_ext_initializers_skel (
+ TAO_ServerRequest & server_request,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS
+ );
+
+ // TAO_IDL - Generated from
+ // be\be_interface.cpp:1955
+
+ static void
+ describe_ext_value_skel (
+ TAO_ServerRequest & server_request,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS
+ );
+
+ // TAO_IDL - Generated from
+ // be\be_interface.cpp:1955
+
+ static void
+ create_ext_attribute_skel (
+ TAO_ServerRequest & server_request,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS
+ );
+ };
+
+ // TAO_IDL - Generated from
+ // be\be_visitor_interface/interface_sh.cpp:87
+
+ class Container;
+ typedef Container *Container_ptr;
+
+ class Container
+ : public virtual POA_CORBA::Container
+ {
+ protected:
+ Container (void);
+
+ public:
+ // Useful for template programming.
+ typedef ::CORBA::ComponentIR::Container _stub_type;
+ typedef ::CORBA::ComponentIR::Container_ptr _stub_ptr_type;
+ typedef ::CORBA::ComponentIR::Container_var _stub_var_type;
+
+ Container (const Container& rhs);
+ virtual ~Container (void);
+
+ virtual ::CORBA::Boolean _is_a (
+ const char* logical_type_id
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS
+ );
+
+ static void _is_a_skel (
+ TAO_ServerRequest & req,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL
+ );
+
+ static void _non_existent_skel (
+ TAO_ServerRequest & req,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL
+ );
+
+ static void _interface_skel (
+ TAO_ServerRequest & req,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL
+ );
+
+ static void _component_skel (
+ TAO_ServerRequest & req,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL
+ );
+
+ static void _repository_id_skel (
+ TAO_ServerRequest & req,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL
+ );
+
+ virtual void _dispatch (
+ TAO_ServerRequest & req,
+ void * servant_upcall
+ ACE_ENV_ARG_DECL
+ );
+
+ ::CORBA::ComponentIR::Container *_this (
+
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS
+ );
+
+ virtual const char* _interface_repository_id (void) const;
+
+ // TAO_IDL - Generated from
+ // be\be_visitor_operation/operation_sh.cpp:45
+
+ virtual ::CORBA::ComponentIR::ComponentDef_ptr create_component (
+ const char * id,
+ const char * name,
+ const char * version,
+ ::CORBA::ComponentIR::ComponentDef_ptr base_component,
+ const ::CORBA::InterfaceDefSeq & supports_interfaces
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ )) = 0;
+
+ static void create_component_skel (
+ TAO_ServerRequest & server_request,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL
+ );
+
+ // TAO_IDL - Generated from
+ // be\be_visitor_operation/operation_sh.cpp:45
+
+ virtual ::CORBA::ComponentIR::HomeDef_ptr create_home (
+ const char * id,
+ const char * name,
+ const char * version,
+ ::CORBA::ComponentIR::HomeDef_ptr base_home,
+ ::CORBA::ComponentIR::ComponentDef_ptr managed_component,
+ const ::CORBA::InterfaceDefSeq & supports_interfaces,
+ ::CORBA::ValueDef_ptr primary_key
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ )) = 0;
+
+ static void create_home_skel (
+ TAO_ServerRequest & server_request,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL
+ );
+
+ // TAO_IDL - Generated from
+ // be\be_visitor_operation/operation_sh.cpp:45
+
+ virtual ::CORBA::ComponentIR::EventDef_ptr create_event (
+ const char * id,
+ const char * name,
+ const char * version,
+ ::CORBA::Boolean is_custom,
+ ::CORBA::Boolean is_abstract,
+ ::CORBA::ValueDef_ptr base_value,
+ ::CORBA::Boolean is_truncatable,
+ const ::CORBA::ValueDefSeq & abstract_base_values,
+ const ::CORBA::InterfaceDefSeq & supported_interfaces,
+ const ::CORBA::ExtInitializerSeq & initializers
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ )) = 0;
+
+ static void create_event_skel (
+ TAO_ServerRequest & server_request,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL
+ );
+
+ static void
+ _get_def_kind_skel (
+ TAO_ServerRequest & server_request,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS
+ );
+
+ // TAO_IDL - Generated from
+ // be\be_interface.cpp:1955
+
+ static void
+ destroy_skel (
+ TAO_ServerRequest & server_request,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS
+ );
+
+ // TAO_IDL - Generated from
+ // be\be_interface.cpp:1955
+
+ static void
+ lookup_skel (
+ TAO_ServerRequest & server_request,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS
+ );
+
+ // TAO_IDL - Generated from
+ // be\be_interface.cpp:1955
+
+ static void
+ contents_skel (
+ TAO_ServerRequest & server_request,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS
+ );
+
+ // TAO_IDL - Generated from
+ // be\be_interface.cpp:1955
+
+ static void
+ lookup_name_skel (
+ TAO_ServerRequest & server_request,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS
+ );
+
+ // TAO_IDL - Generated from
+ // be\be_interface.cpp:1955
+
+ static void
+ describe_contents_skel (
+ TAO_ServerRequest & server_request,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS
+ );
+
+ // TAO_IDL - Generated from
+ // be\be_interface.cpp:1955
+
+ static void
+ create_module_skel (
+ TAO_ServerRequest & server_request,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS
+ );
+
+ // TAO_IDL - Generated from
+ // be\be_interface.cpp:1955
+
+ static void
+ create_constant_skel (
+ TAO_ServerRequest & server_request,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS
+ );
+
+ // TAO_IDL - Generated from
+ // be\be_interface.cpp:1955
+
+ static void
+ create_struct_skel (
+ TAO_ServerRequest & server_request,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS
+ );
+
+ // TAO_IDL - Generated from
+ // be\be_interface.cpp:1955
+
+ static void
+ create_union_skel (
+ TAO_ServerRequest & server_request,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS
+ );
+
+ // TAO_IDL - Generated from
+ // be\be_interface.cpp:1955
+
+ static void
+ create_enum_skel (
+ TAO_ServerRequest & server_request,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS
+ );
+
+ // TAO_IDL - Generated from
+ // be\be_interface.cpp:1955
+
+ static void
+ create_alias_skel (
+ TAO_ServerRequest & server_request,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS
+ );
+
+ // TAO_IDL - Generated from
+ // be\be_interface.cpp:1955
+
+ static void
+ create_interface_skel (
+ TAO_ServerRequest & server_request,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS
+ );
+
+ // TAO_IDL - Generated from
+ // be\be_interface.cpp:1955
+
+ static void
+ create_value_skel (
+ TAO_ServerRequest & server_request,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS
+ );
+
+ // TAO_IDL - Generated from
+ // be\be_interface.cpp:1955
+
+ static void
+ create_value_box_skel (
+ TAO_ServerRequest & server_request,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS
+ );
+
+ // TAO_IDL - Generated from
+ // be\be_interface.cpp:1955
+
+ static void
+ create_exception_skel (
+ TAO_ServerRequest & server_request,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS
+ );
+
+ // TAO_IDL - Generated from
+ // be\be_interface.cpp:1955
+
+ static void
+ create_native_skel (
+ TAO_ServerRequest & server_request,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS
+ );
+
+ // TAO_IDL - Generated from
+ // be\be_interface.cpp:1955
+
+ static void
+ create_abstract_interface_skel (
+ TAO_ServerRequest & server_request,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS
+ );
+
+ // TAO_IDL - Generated from
+ // be\be_interface.cpp:1955
+
+ static void
+ create_local_interface_skel (
+ TAO_ServerRequest & server_request,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS
+ );
+
+ // TAO_IDL - Generated from
+ // be\be_interface.cpp:1955
+
+ static void
+ create_ext_value_skel (
+ TAO_ServerRequest & server_request,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS
+ );
+ };
+
+ // TAO_IDL - Generated from
+ // be\be_visitor_interface/interface_sh.cpp:87
+
+ class ModuleDef;
+ typedef ModuleDef *ModuleDef_ptr;
+
+ class ModuleDef
+ : public virtual POA_CORBA::ModuleDef,
+ public virtual POA_CORBA::ComponentIR::Container
+ {
+ protected:
+ ModuleDef (void);
+
+ public:
+ // Useful for template programming.
+ typedef ::CORBA::ComponentIR::ModuleDef _stub_type;
+ typedef ::CORBA::ComponentIR::ModuleDef_ptr _stub_ptr_type;
+ typedef ::CORBA::ComponentIR::ModuleDef_var _stub_var_type;
+
+ ModuleDef (const ModuleDef& rhs);
+ virtual ~ModuleDef (void);
+
+ virtual ::CORBA::Boolean _is_a (
+ const char* logical_type_id
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS
+ );
+
+ static void _is_a_skel (
+ TAO_ServerRequest & req,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL
+ );
+
+ static void _non_existent_skel (
+ TAO_ServerRequest & req,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL
+ );
+
+ static void _interface_skel (
+ TAO_ServerRequest & req,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL
+ );
+
+ static void _component_skel (
+ TAO_ServerRequest & req,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL
+ );
+
+ static void _repository_id_skel (
+ TAO_ServerRequest & req,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL
+ );
+
+ virtual void _dispatch (
+ TAO_ServerRequest & req,
+ void * servant_upcall
+ ACE_ENV_ARG_DECL
+ );
+
+ ::CORBA::ComponentIR::ModuleDef *_this (
+
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS
+ );
+
+ virtual const char* _interface_repository_id (void) const;
+
+ static void
+ _get_def_kind_skel (
+ TAO_ServerRequest & server_request,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS
+ );
+
+ // TAO_IDL - Generated from
+ // be\be_interface.cpp:1955
+
+ static void
+ destroy_skel (
+ TAO_ServerRequest & server_request,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS
+ );
+
+ // TAO_IDL - Generated from
+ // be\be_interface.cpp:1955
+
+ static void
+ lookup_skel (
+ TAO_ServerRequest & server_request,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS
+ );
+
+ // TAO_IDL - Generated from
+ // be\be_interface.cpp:1955
+
+ static void
+ contents_skel (
+ TAO_ServerRequest & server_request,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS
+ );
+
+ // TAO_IDL - Generated from
+ // be\be_interface.cpp:1955
+
+ static void
+ lookup_name_skel (
+ TAO_ServerRequest & server_request,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS
+ );
+
+ // TAO_IDL - Generated from
+ // be\be_interface.cpp:1955
+
+ static void
+ describe_contents_skel (
+ TAO_ServerRequest & server_request,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS
+ );
+
+ // TAO_IDL - Generated from
+ // be\be_interface.cpp:1955
+
+ static void
+ create_module_skel (
+ TAO_ServerRequest & server_request,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS
+ );
+
+ // TAO_IDL - Generated from
+ // be\be_interface.cpp:1955
+
+ static void
+ create_constant_skel (
+ TAO_ServerRequest & server_request,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS
+ );
+
+ // TAO_IDL - Generated from
+ // be\be_interface.cpp:1955
+
+ static void
+ create_struct_skel (
+ TAO_ServerRequest & server_request,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS
+ );
+
+ // TAO_IDL - Generated from
+ // be\be_interface.cpp:1955
+
+ static void
+ create_union_skel (
+ TAO_ServerRequest & server_request,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS
+ );
+
+ // TAO_IDL - Generated from
+ // be\be_interface.cpp:1955
+
+ static void
+ create_enum_skel (
+ TAO_ServerRequest & server_request,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS
+ );
+
+ // TAO_IDL - Generated from
+ // be\be_interface.cpp:1955
+
+ static void
+ create_alias_skel (
+ TAO_ServerRequest & server_request,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS
+ );
+
+ // TAO_IDL - Generated from
+ // be\be_interface.cpp:1955
+
+ static void
+ create_interface_skel (
+ TAO_ServerRequest & server_request,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS
+ );
+
+ // TAO_IDL - Generated from
+ // be\be_interface.cpp:1955
+
+ static void
+ create_value_skel (
+ TAO_ServerRequest & server_request,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS
+ );
+
+ // TAO_IDL - Generated from
+ // be\be_interface.cpp:1955
+
+ static void
+ create_value_box_skel (
+ TAO_ServerRequest & server_request,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS
+ );
+
+ // TAO_IDL - Generated from
+ // be\be_interface.cpp:1955
+
+ static void
+ create_exception_skel (
+ TAO_ServerRequest & server_request,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS
+ );
+
+ // TAO_IDL - Generated from
+ // be\be_interface.cpp:1955
+
+ static void
+ create_native_skel (
+ TAO_ServerRequest & server_request,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS
+ );
+
+ // TAO_IDL - Generated from
+ // be\be_interface.cpp:1955
+
+ static void
+ create_abstract_interface_skel (
+ TAO_ServerRequest & server_request,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS
+ );
+
+ // TAO_IDL - Generated from
+ // be\be_interface.cpp:1955
+
+ static void
+ create_local_interface_skel (
+ TAO_ServerRequest & server_request,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS
+ );
+
+ // TAO_IDL - Generated from
+ // be\be_interface.cpp:1955
+
+ static void
+ create_ext_value_skel (
+ TAO_ServerRequest & server_request,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS
+ );
+
+ static void
+ _get_id_skel (
+ TAO_ServerRequest & server_request,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS
+ );
+
+ static void
+ _set_id_skel (
+ TAO_ServerRequest & server_request,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS
+ );
+
+ static void
+ _get_name_skel (
+ TAO_ServerRequest & server_request,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS
+ );
+
+ static void
+ _set_name_skel (
+ TAO_ServerRequest & server_request,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS
+ );
+
+ static void
+ _get_version_skel (
+ TAO_ServerRequest & server_request,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS
+ );
+
+ static void
+ _set_version_skel (
+ TAO_ServerRequest & server_request,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS
+ );
+
+ static void
+ _get_defined_in_skel (
+ TAO_ServerRequest & server_request,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS
+ );
+
+ static void
+ _get_absolute_name_skel (
+ TAO_ServerRequest & server_request,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS
+ );
+
+ static void
+ _get_containing_repository_skel (
+ TAO_ServerRequest & server_request,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS
+ );
+
+ // TAO_IDL - Generated from
+ // be\be_interface.cpp:1955
+
+ static void
+ describe_skel (
+ TAO_ServerRequest & server_request,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS
+ );
+
+ // TAO_IDL - Generated from
+ // be\be_interface.cpp:1955
+
+ static void
+ move_skel (
+ TAO_ServerRequest & server_request,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS
+ );
+
+ // TAO_IDL - Generated from
+ // be\be_interface.cpp:1955
+
+ static void
+ create_component_skel (
+ TAO_ServerRequest & server_request,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS
+ );
+
+ // TAO_IDL - Generated from
+ // be\be_interface.cpp:1955
+
+ static void
+ create_home_skel (
+ TAO_ServerRequest & server_request,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS
+ );
+
+ // TAO_IDL - Generated from
+ // be\be_interface.cpp:1955
+
+ static void
+ create_event_skel (
+ TAO_ServerRequest & server_request,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS
+ );
+ };
+
+ // TAO_IDL - Generated from
+ // be\be_visitor_interface/interface_sh.cpp:87
+
+ class Repository;
+ typedef Repository *Repository_ptr;
+
+ class Repository
+ : public virtual POA_CORBA::Repository,
+ public virtual POA_CORBA::ComponentIR::Container
+ {
+ protected:
+ Repository (void);
+
+ public:
+ // Useful for template programming.
+ typedef ::CORBA::ComponentIR::Repository _stub_type;
+ typedef ::CORBA::ComponentIR::Repository_ptr _stub_ptr_type;
+ typedef ::CORBA::ComponentIR::Repository_var _stub_var_type;
+
+ Repository (const Repository& rhs);
+ virtual ~Repository (void);
+
+ virtual ::CORBA::Boolean _is_a (
+ const char* logical_type_id
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS
+ );
+
+ static void _is_a_skel (
+ TAO_ServerRequest & req,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL
+ );
+
+ static void _non_existent_skel (
+ TAO_ServerRequest & req,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL
+ );
+
+ static void _interface_skel (
+ TAO_ServerRequest & req,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL
+ );
+
+ static void _component_skel (
+ TAO_ServerRequest & req,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL
+ );
+
+ static void _repository_id_skel (
+ TAO_ServerRequest & req,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL
+ );
+
+ virtual void _dispatch (
+ TAO_ServerRequest & req,
+ void * servant_upcall
+ ACE_ENV_ARG_DECL
+ );
+
+ ::CORBA::ComponentIR::Repository *_this (
+
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS
+ );
+
+ virtual const char* _interface_repository_id (void) const;
+
+ static void
+ _get_def_kind_skel (
+ TAO_ServerRequest & server_request,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS
+ );
+
+ // TAO_IDL - Generated from
+ // be\be_interface.cpp:1955
+
+ static void
+ destroy_skel (
+ TAO_ServerRequest & server_request,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS
+ );
+
+ // TAO_IDL - Generated from
+ // be\be_interface.cpp:1955
+
+ static void
+ lookup_skel (
+ TAO_ServerRequest & server_request,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS
+ );
+
+ // TAO_IDL - Generated from
+ // be\be_interface.cpp:1955
+
+ static void
+ contents_skel (
+ TAO_ServerRequest & server_request,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS
+ );
+
+ // TAO_IDL - Generated from
+ // be\be_interface.cpp:1955
+
+ static void
+ lookup_name_skel (
+ TAO_ServerRequest & server_request,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS
+ );
+
+ // TAO_IDL - Generated from
+ // be\be_interface.cpp:1955
+
+ static void
+ describe_contents_skel (
+ TAO_ServerRequest & server_request,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS
+ );
+
+ // TAO_IDL - Generated from
+ // be\be_interface.cpp:1955
+
+ static void
+ create_module_skel (
+ TAO_ServerRequest & server_request,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS
+ );
+
+ // TAO_IDL - Generated from
+ // be\be_interface.cpp:1955
+
+ static void
+ create_constant_skel (
+ TAO_ServerRequest & server_request,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS
+ );
+
+ // TAO_IDL - Generated from
+ // be\be_interface.cpp:1955
+
+ static void
+ create_struct_skel (
+ TAO_ServerRequest & server_request,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS
+ );
+
+ // TAO_IDL - Generated from
+ // be\be_interface.cpp:1955
+
+ static void
+ create_union_skel (
+ TAO_ServerRequest & server_request,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS
+ );
+
+ // TAO_IDL - Generated from
+ // be\be_interface.cpp:1955
+
+ static void
+ create_enum_skel (
+ TAO_ServerRequest & server_request,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS
+ );
+
+ // TAO_IDL - Generated from
+ // be\be_interface.cpp:1955
+
+ static void
+ create_alias_skel (
+ TAO_ServerRequest & server_request,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS
+ );
+
+ // TAO_IDL - Generated from
+ // be\be_interface.cpp:1955
+
+ static void
+ create_interface_skel (
+ TAO_ServerRequest & server_request,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS
+ );
+
+ // TAO_IDL - Generated from
+ // be\be_interface.cpp:1955
+
+ static void
+ create_value_skel (
+ TAO_ServerRequest & server_request,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS
+ );
+
+ // TAO_IDL - Generated from
+ // be\be_interface.cpp:1955
+
+ static void
+ create_value_box_skel (
+ TAO_ServerRequest & server_request,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS
+ );
+
+ // TAO_IDL - Generated from
+ // be\be_interface.cpp:1955
+
+ static void
+ create_exception_skel (
+ TAO_ServerRequest & server_request,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS
+ );
+
+ // TAO_IDL - Generated from
+ // be\be_interface.cpp:1955
+
+ static void
+ create_native_skel (
+ TAO_ServerRequest & server_request,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS
+ );
+
+ // TAO_IDL - Generated from
+ // be\be_interface.cpp:1955
+
+ static void
+ create_abstract_interface_skel (
+ TAO_ServerRequest & server_request,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS
+ );
+
+ // TAO_IDL - Generated from
+ // be\be_interface.cpp:1955
+
+ static void
+ create_local_interface_skel (
+ TAO_ServerRequest & server_request,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS
+ );
+
+ // TAO_IDL - Generated from
+ // be\be_interface.cpp:1955
+
+ static void
+ create_ext_value_skel (
+ TAO_ServerRequest & server_request,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS
+ );
+
+ // TAO_IDL - Generated from
+ // be\be_interface.cpp:1955
+
+ static void
+ lookup_id_skel (
+ TAO_ServerRequest & server_request,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS
+ );
+
+ // TAO_IDL - Generated from
+ // be\be_interface.cpp:1955
+
+ static void
+ get_canonical_typecode_skel (
+ TAO_ServerRequest & server_request,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS
+ );
+
+ // TAO_IDL - Generated from
+ // be\be_interface.cpp:1955
+
+ static void
+ get_primitive_skel (
+ TAO_ServerRequest & server_request,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS
+ );
+
+ // TAO_IDL - Generated from
+ // be\be_interface.cpp:1955
+
+ static void
+ create_string_skel (
+ TAO_ServerRequest & server_request,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS
+ );
+
+ // TAO_IDL - Generated from
+ // be\be_interface.cpp:1955
+
+ static void
+ create_wstring_skel (
+ TAO_ServerRequest & server_request,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS
+ );
+
+ // TAO_IDL - Generated from
+ // be\be_interface.cpp:1955
+
+ static void
+ create_sequence_skel (
+ TAO_ServerRequest & server_request,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS
+ );
+
+ // TAO_IDL - Generated from
+ // be\be_interface.cpp:1955
+
+ static void
+ create_array_skel (
+ TAO_ServerRequest & server_request,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS
+ );
+
+ // TAO_IDL - Generated from
+ // be\be_interface.cpp:1955
+
+ static void
+ create_fixed_skel (
+ TAO_ServerRequest & server_request,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS
+ );
+
+ // TAO_IDL - Generated from
+ // be\be_interface.cpp:1955
+
+ static void
+ create_component_skel (
+ TAO_ServerRequest & server_request,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS
+ );
+
+ // TAO_IDL - Generated from
+ // be\be_interface.cpp:1955
+
+ static void
+ create_home_skel (
+ TAO_ServerRequest & server_request,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS
+ );
+
+ // TAO_IDL - Generated from
+ // be\be_interface.cpp:1955
+
+ static void
+ create_event_skel (
+ TAO_ServerRequest & server_request,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS
+ );
+ };
+
+ // TAO_IDL - Generated from
+ // be\be_visitor_interface/interface_sh.cpp:87
+
+ class ProvidesDef;
+ typedef ProvidesDef *ProvidesDef_ptr;
+
+ class ProvidesDef
+ : public virtual POA_CORBA::Contained
+ {
+ protected:
+ ProvidesDef (void);
+
+ public:
+ // Useful for template programming.
+ typedef ::CORBA::ComponentIR::ProvidesDef _stub_type;
+ typedef ::CORBA::ComponentIR::ProvidesDef_ptr _stub_ptr_type;
+ typedef ::CORBA::ComponentIR::ProvidesDef_var _stub_var_type;
+
+ ProvidesDef (const ProvidesDef& rhs);
+ virtual ~ProvidesDef (void);
+
+ virtual ::CORBA::Boolean _is_a (
+ const char* logical_type_id
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS
+ );
+
+ static void _is_a_skel (
+ TAO_ServerRequest & req,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL
+ );
+
+ static void _non_existent_skel (
+ TAO_ServerRequest & req,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL
+ );
+
+ static void _interface_skel (
+ TAO_ServerRequest & req,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL
+ );
+
+ static void _component_skel (
+ TAO_ServerRequest & req,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL
+ );
+
+ static void _repository_id_skel (
+ TAO_ServerRequest & req,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL
+ );
+
+ virtual void _dispatch (
+ TAO_ServerRequest & req,
+ void * servant_upcall
+ ACE_ENV_ARG_DECL
+ );
+
+ ::CORBA::ComponentIR::ProvidesDef *_this (
+
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS
+ );
+
+ virtual const char* _interface_repository_id (void) const;
+
+ // TAO_IDL - Generated from
+ // be\be_visitor_operation/operation_sh.cpp:45
+
+ virtual ::CORBA::InterfaceDef_ptr interface_type (
+ ACE_ENV_SINGLE_ARG_DECL_WITH_DEFAULTS
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ )) = 0;
+
+ static void _get_interface_type_skel (
+ TAO_ServerRequest & server_request,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL
+ );
+
+ // TAO_IDL - Generated from
+ // be\be_visitor_operation/operation_sh.cpp:45
+
+ virtual void interface_type (
+ ::CORBA::InterfaceDef_ptr interface_type
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ )) = 0;
+
+ static void _set_interface_type_skel (
+ TAO_ServerRequest & server_request,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL
+ );
+
+ static void
+ _get_def_kind_skel (
+ TAO_ServerRequest & server_request,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS
+ );
+
+ // TAO_IDL - Generated from
+ // be\be_interface.cpp:1955
+
+ static void
+ destroy_skel (
+ TAO_ServerRequest & server_request,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS
+ );
+
+ static void
+ _get_id_skel (
+ TAO_ServerRequest & server_request,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS
+ );
+
+ static void
+ _set_id_skel (
+ TAO_ServerRequest & server_request,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS
+ );
+
+ static void
+ _get_name_skel (
+ TAO_ServerRequest & server_request,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS
+ );
+
+ static void
+ _set_name_skel (
+ TAO_ServerRequest & server_request,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS
+ );
+
+ static void
+ _get_version_skel (
+ TAO_ServerRequest & server_request,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS
+ );
+
+ static void
+ _set_version_skel (
+ TAO_ServerRequest & server_request,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS
+ );
+
+ static void
+ _get_defined_in_skel (
+ TAO_ServerRequest & server_request,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS
+ );
+
+ static void
+ _get_absolute_name_skel (
+ TAO_ServerRequest & server_request,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS
+ );
+
+ static void
+ _get_containing_repository_skel (
+ TAO_ServerRequest & server_request,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS
+ );
+
+ // TAO_IDL - Generated from
+ // be\be_interface.cpp:1955
+
+ static void
+ describe_skel (
+ TAO_ServerRequest & server_request,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS
+ );
+
+ // TAO_IDL - Generated from
+ // be\be_interface.cpp:1955
+
+ static void
+ move_skel (
+ TAO_ServerRequest & server_request,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS
+ );
+ };
+
+ // TAO_IDL - Generated from
+ // be\be_visitor_interface/interface_sh.cpp:87
+
+ class UsesDef;
+ typedef UsesDef *UsesDef_ptr;
+
+ class UsesDef
+ : public virtual POA_CORBA::Contained
+ {
+ protected:
+ UsesDef (void);
+
+ public:
+ // Useful for template programming.
+ typedef ::CORBA::ComponentIR::UsesDef _stub_type;
+ typedef ::CORBA::ComponentIR::UsesDef_ptr _stub_ptr_type;
+ typedef ::CORBA::ComponentIR::UsesDef_var _stub_var_type;
+
+ UsesDef (const UsesDef& rhs);
+ virtual ~UsesDef (void);
+
+ virtual ::CORBA::Boolean _is_a (
+ const char* logical_type_id
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS
+ );
+
+ static void _is_a_skel (
+ TAO_ServerRequest & req,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL
+ );
+
+ static void _non_existent_skel (
+ TAO_ServerRequest & req,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL
+ );
+
+ static void _interface_skel (
+ TAO_ServerRequest & req,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL
+ );
+
+ static void _component_skel (
+ TAO_ServerRequest & req,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL
+ );
+
+ static void _repository_id_skel (
+ TAO_ServerRequest & req,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL
+ );
+
+ virtual void _dispatch (
+ TAO_ServerRequest & req,
+ void * servant_upcall
+ ACE_ENV_ARG_DECL
+ );
+
+ ::CORBA::ComponentIR::UsesDef *_this (
+
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS
+ );
+
+ virtual const char* _interface_repository_id (void) const;
+
+ // TAO_IDL - Generated from
+ // be\be_visitor_operation/operation_sh.cpp:45
+
+ virtual ::CORBA::InterfaceDef_ptr interface_type (
+ ACE_ENV_SINGLE_ARG_DECL_WITH_DEFAULTS
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ )) = 0;
+
+ static void _get_interface_type_skel (
+ TAO_ServerRequest & server_request,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL
+ );
+
+ // TAO_IDL - Generated from
+ // be\be_visitor_operation/operation_sh.cpp:45
+
+ virtual void interface_type (
+ ::CORBA::InterfaceDef_ptr interface_type
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ )) = 0;
+
+ static void _set_interface_type_skel (
+ TAO_ServerRequest & server_request,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL
+ );
+
+ // TAO_IDL - Generated from
+ // be\be_visitor_operation/operation_sh.cpp:45
+
+ virtual ::CORBA::Boolean is_multiple (
+ ACE_ENV_SINGLE_ARG_DECL_WITH_DEFAULTS
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ )) = 0;
+
+ static void _get_is_multiple_skel (
+ TAO_ServerRequest & server_request,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL
+ );
+
+ // TAO_IDL - Generated from
+ // be\be_visitor_operation/operation_sh.cpp:45
+
+ virtual void is_multiple (
+ ::CORBA::Boolean is_multiple
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ )) = 0;
+
+ static void _set_is_multiple_skel (
+ TAO_ServerRequest & server_request,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL
+ );
+
+ static void
+ _get_def_kind_skel (
+ TAO_ServerRequest & server_request,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS
+ );
+
+ // TAO_IDL - Generated from
+ // be\be_interface.cpp:1955
+
+ static void
+ destroy_skel (
+ TAO_ServerRequest & server_request,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS
+ );
+
+ static void
+ _get_id_skel (
+ TAO_ServerRequest & server_request,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS
+ );
+
+ static void
+ _set_id_skel (
+ TAO_ServerRequest & server_request,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS
+ );
+
+ static void
+ _get_name_skel (
+ TAO_ServerRequest & server_request,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS
+ );
+
+ static void
+ _set_name_skel (
+ TAO_ServerRequest & server_request,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS
+ );
+
+ static void
+ _get_version_skel (
+ TAO_ServerRequest & server_request,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS
+ );
+
+ static void
+ _set_version_skel (
+ TAO_ServerRequest & server_request,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS
+ );
+
+ static void
+ _get_defined_in_skel (
+ TAO_ServerRequest & server_request,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS
+ );
+
+ static void
+ _get_absolute_name_skel (
+ TAO_ServerRequest & server_request,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS
+ );
+
+ static void
+ _get_containing_repository_skel (
+ TAO_ServerRequest & server_request,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS
+ );
+
+ // TAO_IDL - Generated from
+ // be\be_interface.cpp:1955
+
+ static void
+ describe_skel (
+ TAO_ServerRequest & server_request,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS
+ );
+
+ // TAO_IDL - Generated from
+ // be\be_interface.cpp:1955
+
+ static void
+ move_skel (
+ TAO_ServerRequest & server_request,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS
+ );
+ };
+
+ // TAO_IDL - Generated from
+ // be\be_visitor_interface/interface_sh.cpp:87
+
+ class EventPortDef;
+ typedef EventPortDef *EventPortDef_ptr;
+
+ class EventPortDef
+ : public virtual POA_CORBA::Contained
+ {
+ protected:
+ EventPortDef (void);
+
+ public:
+ // Useful for template programming.
+ typedef ::CORBA::ComponentIR::EventPortDef _stub_type;
+ typedef ::CORBA::ComponentIR::EventPortDef_ptr _stub_ptr_type;
+ typedef ::CORBA::ComponentIR::EventPortDef_var _stub_var_type;
+
+ EventPortDef (const EventPortDef& rhs);
+ virtual ~EventPortDef (void);
+
+ virtual ::CORBA::Boolean _is_a (
+ const char* logical_type_id
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS
+ );
+
+ static void _is_a_skel (
+ TAO_ServerRequest & req,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL
+ );
+
+ static void _non_existent_skel (
+ TAO_ServerRequest & req,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL
+ );
+
+ static void _interface_skel (
+ TAO_ServerRequest & req,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL
+ );
+
+ static void _component_skel (
+ TAO_ServerRequest & req,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL
+ );
+
+ static void _repository_id_skel (
+ TAO_ServerRequest & req,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL
+ );
+
+ virtual void _dispatch (
+ TAO_ServerRequest & req,
+ void * servant_upcall
+ ACE_ENV_ARG_DECL
+ );
+
+ ::CORBA::ComponentIR::EventPortDef *_this (
+
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS
+ );
+
+ virtual const char* _interface_repository_id (void) const;
+
+ // TAO_IDL - Generated from
+ // be\be_visitor_operation/operation_sh.cpp:45
+
+ virtual ::CORBA::ComponentIR::EventDef_ptr event (
+ ACE_ENV_SINGLE_ARG_DECL_WITH_DEFAULTS
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ )) = 0;
+
+ static void _get_event_skel (
+ TAO_ServerRequest & server_request,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL
+ );
+
+ // TAO_IDL - Generated from
+ // be\be_visitor_operation/operation_sh.cpp:45
+
+ virtual void event (
+ ::CORBA::ComponentIR::EventDef_ptr event
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ )) = 0;
+
+ static void _set_event_skel (
+ TAO_ServerRequest & server_request,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL
+ );
+
+ // TAO_IDL - Generated from
+ // be\be_visitor_operation/operation_sh.cpp:45
+
+ virtual ::CORBA::Boolean is_a (
+ const char * event_id
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ )) = 0;
+
+ static void is_a_skel (
+ TAO_ServerRequest & server_request,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL
+ );
+
+ static void
+ _get_def_kind_skel (
+ TAO_ServerRequest & server_request,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS
+ );
+
+ // TAO_IDL - Generated from
+ // be\be_interface.cpp:1955
+
+ static void
+ destroy_skel (
+ TAO_ServerRequest & server_request,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS
+ );
+
+ static void
+ _get_id_skel (
+ TAO_ServerRequest & server_request,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS
+ );
+
+ static void
+ _set_id_skel (
+ TAO_ServerRequest & server_request,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS
+ );
+
+ static void
+ _get_name_skel (
+ TAO_ServerRequest & server_request,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS
+ );
+
+ static void
+ _set_name_skel (
+ TAO_ServerRequest & server_request,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS
+ );
+
+ static void
+ _get_version_skel (
+ TAO_ServerRequest & server_request,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS
+ );
+
+ static void
+ _set_version_skel (
+ TAO_ServerRequest & server_request,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS
+ );
+
+ static void
+ _get_defined_in_skel (
+ TAO_ServerRequest & server_request,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS
+ );
+
+ static void
+ _get_absolute_name_skel (
+ TAO_ServerRequest & server_request,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS
+ );
+
+ static void
+ _get_containing_repository_skel (
+ TAO_ServerRequest & server_request,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS
+ );
+
+ // TAO_IDL - Generated from
+ // be\be_interface.cpp:1955
+
+ static void
+ describe_skel (
+ TAO_ServerRequest & server_request,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS
+ );
+
+ // TAO_IDL - Generated from
+ // be\be_interface.cpp:1955
+
+ static void
+ move_skel (
+ TAO_ServerRequest & server_request,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS
+ );
+ };
+
+ // TAO_IDL - Generated from
+ // be\be_visitor_interface/interface_sh.cpp:87
+
+ class EmitsDef;
+ typedef EmitsDef *EmitsDef_ptr;
+
+ class EmitsDef
+ : public virtual POA_CORBA::ComponentIR::EventPortDef
+ {
+ protected:
+ EmitsDef (void);
+
+ public:
+ // Useful for template programming.
+ typedef ::CORBA::ComponentIR::EmitsDef _stub_type;
+ typedef ::CORBA::ComponentIR::EmitsDef_ptr _stub_ptr_type;
+ typedef ::CORBA::ComponentIR::EmitsDef_var _stub_var_type;
+
+ EmitsDef (const EmitsDef& rhs);
+ virtual ~EmitsDef (void);
+
+ virtual ::CORBA::Boolean _is_a (
+ const char* logical_type_id
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS
+ );
+
+ static void _is_a_skel (
+ TAO_ServerRequest & req,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL
+ );
+
+ static void _non_existent_skel (
+ TAO_ServerRequest & req,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL
+ );
+
+ static void _interface_skel (
+ TAO_ServerRequest & req,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL
+ );
+
+ static void _component_skel (
+ TAO_ServerRequest & req,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL
+ );
+
+ static void _repository_id_skel (
+ TAO_ServerRequest & req,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL
+ );
+
+ virtual void _dispatch (
+ TAO_ServerRequest & req,
+ void * servant_upcall
+ ACE_ENV_ARG_DECL
+ );
+
+ ::CORBA::ComponentIR::EmitsDef *_this (
+
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS
+ );
+
+ virtual const char* _interface_repository_id (void) const;
+
+ static void
+ _get_def_kind_skel (
+ TAO_ServerRequest & server_request,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS
+ );
+
+ // TAO_IDL - Generated from
+ // be\be_interface.cpp:1955
+
+ static void
+ destroy_skel (
+ TAO_ServerRequest & server_request,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS
+ );
+
+ static void
+ _get_id_skel (
+ TAO_ServerRequest & server_request,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS
+ );
+
+ static void
+ _set_id_skel (
+ TAO_ServerRequest & server_request,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS
+ );
+
+ static void
+ _get_name_skel (
+ TAO_ServerRequest & server_request,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS
+ );
+
+ static void
+ _set_name_skel (
+ TAO_ServerRequest & server_request,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS
+ );
+
+ static void
+ _get_version_skel (
+ TAO_ServerRequest & server_request,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS
+ );
+
+ static void
+ _set_version_skel (
+ TAO_ServerRequest & server_request,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS
+ );
+
+ static void
+ _get_defined_in_skel (
+ TAO_ServerRequest & server_request,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS
+ );
+
+ static void
+ _get_absolute_name_skel (
+ TAO_ServerRequest & server_request,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS
+ );
+
+ static void
+ _get_containing_repository_skel (
+ TAO_ServerRequest & server_request,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS
+ );
+
+ // TAO_IDL - Generated from
+ // be\be_interface.cpp:1955
+
+ static void
+ describe_skel (
+ TAO_ServerRequest & server_request,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS
+ );
+
+ // TAO_IDL - Generated from
+ // be\be_interface.cpp:1955
+
+ static void
+ move_skel (
+ TAO_ServerRequest & server_request,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS
+ );
+
+ static void
+ _get_event_skel (
+ TAO_ServerRequest & server_request,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS
+ );
+
+ static void
+ _set_event_skel (
+ TAO_ServerRequest & server_request,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS
+ );
+
+ // TAO_IDL - Generated from
+ // be\be_interface.cpp:1955
+
+ static void
+ is_a_skel (
+ TAO_ServerRequest & server_request,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS
+ );
+ };
+
+ // TAO_IDL - Generated from
+ // be\be_visitor_interface/interface_sh.cpp:87
+
+ class PublishesDef;
+ typedef PublishesDef *PublishesDef_ptr;
+
+ class PublishesDef
+ : public virtual POA_CORBA::ComponentIR::EventPortDef
+ {
+ protected:
+ PublishesDef (void);
+
+ public:
+ // Useful for template programming.
+ typedef ::CORBA::ComponentIR::PublishesDef _stub_type;
+ typedef ::CORBA::ComponentIR::PublishesDef_ptr _stub_ptr_type;
+ typedef ::CORBA::ComponentIR::PublishesDef_var _stub_var_type;
+
+ PublishesDef (const PublishesDef& rhs);
+ virtual ~PublishesDef (void);
+
+ virtual ::CORBA::Boolean _is_a (
+ const char* logical_type_id
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS
+ );
+
+ static void _is_a_skel (
+ TAO_ServerRequest & req,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL
+ );
+
+ static void _non_existent_skel (
+ TAO_ServerRequest & req,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL
+ );
+
+ static void _interface_skel (
+ TAO_ServerRequest & req,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL
+ );
+
+ static void _component_skel (
+ TAO_ServerRequest & req,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL
+ );
+
+ static void _repository_id_skel (
+ TAO_ServerRequest & req,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL
+ );
+
+ virtual void _dispatch (
+ TAO_ServerRequest & req,
+ void * servant_upcall
+ ACE_ENV_ARG_DECL
+ );
+
+ ::CORBA::ComponentIR::PublishesDef *_this (
+
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS
+ );
+
+ virtual const char* _interface_repository_id (void) const;
+
+ static void
+ _get_def_kind_skel (
+ TAO_ServerRequest & server_request,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS
+ );
+
+ // TAO_IDL - Generated from
+ // be\be_interface.cpp:1955
+
+ static void
+ destroy_skel (
+ TAO_ServerRequest & server_request,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS
+ );
+
+ static void
+ _get_id_skel (
+ TAO_ServerRequest & server_request,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS
+ );
+
+ static void
+ _set_id_skel (
+ TAO_ServerRequest & server_request,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS
+ );
+
+ static void
+ _get_name_skel (
+ TAO_ServerRequest & server_request,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS
+ );
+
+ static void
+ _set_name_skel (
+ TAO_ServerRequest & server_request,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS
+ );
+
+ static void
+ _get_version_skel (
+ TAO_ServerRequest & server_request,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS
+ );
+
+ static void
+ _set_version_skel (
+ TAO_ServerRequest & server_request,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS
+ );
+
+ static void
+ _get_defined_in_skel (
+ TAO_ServerRequest & server_request,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS
+ );
+
+ static void
+ _get_absolute_name_skel (
+ TAO_ServerRequest & server_request,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS
+ );
+
+ static void
+ _get_containing_repository_skel (
+ TAO_ServerRequest & server_request,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS
+ );
+
+ // TAO_IDL - Generated from
+ // be\be_interface.cpp:1955
+
+ static void
+ describe_skel (
+ TAO_ServerRequest & server_request,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS
+ );
+
+ // TAO_IDL - Generated from
+ // be\be_interface.cpp:1955
+
+ static void
+ move_skel (
+ TAO_ServerRequest & server_request,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS
+ );
+
+ static void
+ _get_event_skel (
+ TAO_ServerRequest & server_request,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS
+ );
+
+ static void
+ _set_event_skel (
+ TAO_ServerRequest & server_request,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS
+ );
+
+ // TAO_IDL - Generated from
+ // be\be_interface.cpp:1955
+
+ static void
+ is_a_skel (
+ TAO_ServerRequest & server_request,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS
+ );
+ };
+
+ // TAO_IDL - Generated from
+ // be\be_visitor_interface/interface_sh.cpp:87
+
+ class ConsumesDef;
+ typedef ConsumesDef *ConsumesDef_ptr;
+
+ class ConsumesDef
+ : public virtual POA_CORBA::ComponentIR::EventPortDef
+ {
+ protected:
+ ConsumesDef (void);
+
+ public:
+ // Useful for template programming.
+ typedef ::CORBA::ComponentIR::ConsumesDef _stub_type;
+ typedef ::CORBA::ComponentIR::ConsumesDef_ptr _stub_ptr_type;
+ typedef ::CORBA::ComponentIR::ConsumesDef_var _stub_var_type;
+
+ ConsumesDef (const ConsumesDef& rhs);
+ virtual ~ConsumesDef (void);
+
+ virtual ::CORBA::Boolean _is_a (
+ const char* logical_type_id
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS
+ );
+
+ static void _is_a_skel (
+ TAO_ServerRequest & req,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL
+ );
+
+ static void _non_existent_skel (
+ TAO_ServerRequest & req,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL
+ );
+
+ static void _interface_skel (
+ TAO_ServerRequest & req,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL
+ );
+
+ static void _component_skel (
+ TAO_ServerRequest & req,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL
+ );
+
+ static void _repository_id_skel (
+ TAO_ServerRequest & req,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL
+ );
+
+ virtual void _dispatch (
+ TAO_ServerRequest & req,
+ void * servant_upcall
+ ACE_ENV_ARG_DECL
+ );
+
+ ::CORBA::ComponentIR::ConsumesDef *_this (
+
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS
+ );
+
+ virtual const char* _interface_repository_id (void) const;
+
+ static void
+ _get_def_kind_skel (
+ TAO_ServerRequest & server_request,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS
+ );
+
+ // TAO_IDL - Generated from
+ // be\be_interface.cpp:1955
+
+ static void
+ destroy_skel (
+ TAO_ServerRequest & server_request,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS
+ );
+
+ static void
+ _get_id_skel (
+ TAO_ServerRequest & server_request,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS
+ );
+
+ static void
+ _set_id_skel (
+ TAO_ServerRequest & server_request,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS
+ );
+
+ static void
+ _get_name_skel (
+ TAO_ServerRequest & server_request,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS
+ );
+
+ static void
+ _set_name_skel (
+ TAO_ServerRequest & server_request,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS
+ );
+
+ static void
+ _get_version_skel (
+ TAO_ServerRequest & server_request,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS
+ );
+
+ static void
+ _set_version_skel (
+ TAO_ServerRequest & server_request,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS
+ );
+
+ static void
+ _get_defined_in_skel (
+ TAO_ServerRequest & server_request,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS
+ );
+
+ static void
+ _get_absolute_name_skel (
+ TAO_ServerRequest & server_request,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS
+ );
+
+ static void
+ _get_containing_repository_skel (
+ TAO_ServerRequest & server_request,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS
+ );
+
+ // TAO_IDL - Generated from
+ // be\be_interface.cpp:1955
+
+ static void
+ describe_skel (
+ TAO_ServerRequest & server_request,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS
+ );
+
+ // TAO_IDL - Generated from
+ // be\be_interface.cpp:1955
+
+ static void
+ move_skel (
+ TAO_ServerRequest & server_request,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS
+ );
+
+ static void
+ _get_event_skel (
+ TAO_ServerRequest & server_request,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS
+ );
+
+ static void
+ _set_event_skel (
+ TAO_ServerRequest & server_request,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS
+ );
+
+ // TAO_IDL - Generated from
+ // be\be_interface.cpp:1955
+
+ static void
+ is_a_skel (
+ TAO_ServerRequest & server_request,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS
+ );
+ };
+
+ // TAO_IDL - Generated from
+ // be\be_visitor_interface/interface_sh.cpp:87
+
+ class ComponentDef;
+ typedef ComponentDef *ComponentDef_ptr;
+
+ class ComponentDef
+ : public virtual POA_CORBA::ExtInterfaceDef
+ {
+ protected:
+ ComponentDef (void);
+
+ public:
+ // Useful for template programming.
+ typedef ::CORBA::ComponentIR::ComponentDef _stub_type;
+ typedef ::CORBA::ComponentIR::ComponentDef_ptr _stub_ptr_type;
+ typedef ::CORBA::ComponentIR::ComponentDef_var _stub_var_type;
+
+ ComponentDef (const ComponentDef& rhs);
+ virtual ~ComponentDef (void);
+
+ virtual ::CORBA::Boolean _is_a (
+ const char* logical_type_id
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS
+ );
+
+ static void _is_a_skel (
+ TAO_ServerRequest & req,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL
+ );
+
+ static void _non_existent_skel (
+ TAO_ServerRequest & req,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL
+ );
+
+ static void _interface_skel (
+ TAO_ServerRequest & req,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL
+ );
+
+ static void _component_skel (
+ TAO_ServerRequest & req,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL
+ );
+
+ static void _repository_id_skel (
+ TAO_ServerRequest & req,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL
+ );
+
+ virtual void _dispatch (
+ TAO_ServerRequest & req,
+ void * servant_upcall
+ ACE_ENV_ARG_DECL
+ );
+
+ ::CORBA::ComponentIR::ComponentDef *_this (
+
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS
+ );
+
+ virtual const char* _interface_repository_id (void) const;
+
+ // TAO_IDL - Generated from
+ // be\be_visitor_operation/operation_sh.cpp:45
+
+ virtual ::CORBA::ComponentIR::ComponentDef_ptr base_component (
+ ACE_ENV_SINGLE_ARG_DECL_WITH_DEFAULTS
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ )) = 0;
+
+ static void _get_base_component_skel (
+ TAO_ServerRequest & server_request,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL
+ );
+
+ // TAO_IDL - Generated from
+ // be\be_visitor_operation/operation_sh.cpp:45
+
+ virtual void base_component (
+ ::CORBA::ComponentIR::ComponentDef_ptr base_component
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ )) = 0;
+
+ static void _set_base_component_skel (
+ TAO_ServerRequest & server_request,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL
+ );
+
+ // TAO_IDL - Generated from
+ // be\be_visitor_operation/operation_sh.cpp:45
+
+ virtual ::CORBA::InterfaceDefSeq * supported_interfaces (
+ ACE_ENV_SINGLE_ARG_DECL_WITH_DEFAULTS
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ )) = 0;
+
+ static void _get_supported_interfaces_skel (
+ TAO_ServerRequest & server_request,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL
+ );
+
+ // TAO_IDL - Generated from
+ // be\be_visitor_operation/operation_sh.cpp:45
+
+ virtual void supported_interfaces (
+ const ::CORBA::InterfaceDefSeq & supported_interfaces
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ )) = 0;
+
+ static void _set_supported_interfaces_skel (
+ TAO_ServerRequest & server_request,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL
+ );
+
+ // TAO_IDL - Generated from
+ // be\be_visitor_operation/operation_sh.cpp:45
+
+ virtual ::CORBA::ComponentIR::ProvidesDef_ptr create_provides (
+ const char * id,
+ const char * name,
+ const char * version,
+ ::CORBA::InterfaceDef_ptr interface_type
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ )) = 0;
+
+ static void create_provides_skel (
+ TAO_ServerRequest & server_request,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL
+ );
+
+ // TAO_IDL - Generated from
+ // be\be_visitor_operation/operation_sh.cpp:45
+
+ virtual ::CORBA::ComponentIR::UsesDef_ptr create_uses (
+ const char * id,
+ const char * name,
+ const char * version,
+ ::CORBA::InterfaceDef_ptr interface_type,
+ ::CORBA::Boolean is_multiple
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ )) = 0;
+
+ static void create_uses_skel (
+ TAO_ServerRequest & server_request,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL
+ );
+
+ // TAO_IDL - Generated from
+ // be\be_visitor_operation/operation_sh.cpp:45
+
+ virtual ::CORBA::ComponentIR::EmitsDef_ptr create_emits (
+ const char * id,
+ const char * name,
+ const char * version,
+ ::CORBA::ComponentIR::EventDef_ptr event
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ )) = 0;
+
+ static void create_emits_skel (
+ TAO_ServerRequest & server_request,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL
+ );
+
+ // TAO_IDL - Generated from
+ // be\be_visitor_operation/operation_sh.cpp:45
+
+ virtual ::CORBA::ComponentIR::PublishesDef_ptr create_publishes (
+ const char * id,
+ const char * name,
+ const char * version,
+ ::CORBA::ComponentIR::EventDef_ptr event
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ )) = 0;
+
+ static void create_publishes_skel (
+ TAO_ServerRequest & server_request,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL
+ );
+
+ // TAO_IDL - Generated from
+ // be\be_visitor_operation/operation_sh.cpp:45
+
+ virtual ::CORBA::ComponentIR::ConsumesDef_ptr create_consumes (
+ const char * id,
+ const char * name,
+ const char * version,
+ ::CORBA::ComponentIR::EventDef_ptr event
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ )) = 0;
+
+ static void create_consumes_skel (
+ TAO_ServerRequest & server_request,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL
+ );
+
+ static void
+ _get_def_kind_skel (
+ TAO_ServerRequest & server_request,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS
+ );
+
+ // TAO_IDL - Generated from
+ // be\be_interface.cpp:1955
+
+ static void
+ destroy_skel (
+ TAO_ServerRequest & server_request,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS
+ );
+
+ // TAO_IDL - Generated from
+ // be\be_interface.cpp:1955
+
+ static void
+ lookup_skel (
+ TAO_ServerRequest & server_request,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS
+ );
+
+ // TAO_IDL - Generated from
+ // be\be_interface.cpp:1955
+
+ static void
+ contents_skel (
+ TAO_ServerRequest & server_request,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS
+ );
+
+ // TAO_IDL - Generated from
+ // be\be_interface.cpp:1955
+
+ static void
+ lookup_name_skel (
+ TAO_ServerRequest & server_request,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS
+ );
+
+ // TAO_IDL - Generated from
+ // be\be_interface.cpp:1955
+
+ static void
+ describe_contents_skel (
+ TAO_ServerRequest & server_request,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS
+ );
+
+ // TAO_IDL - Generated from
+ // be\be_interface.cpp:1955
+
+ static void
+ create_module_skel (
+ TAO_ServerRequest & server_request,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS
+ );
+
+ // TAO_IDL - Generated from
+ // be\be_interface.cpp:1955
+
+ static void
+ create_constant_skel (
+ TAO_ServerRequest & server_request,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS
+ );
+
+ // TAO_IDL - Generated from
+ // be\be_interface.cpp:1955
+
+ static void
+ create_struct_skel (
+ TAO_ServerRequest & server_request,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS
+ );
+
+ // TAO_IDL - Generated from
+ // be\be_interface.cpp:1955
+
+ static void
+ create_union_skel (
+ TAO_ServerRequest & server_request,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS
+ );
+
+ // TAO_IDL - Generated from
+ // be\be_interface.cpp:1955
+
+ static void
+ create_enum_skel (
+ TAO_ServerRequest & server_request,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS
+ );
+
+ // TAO_IDL - Generated from
+ // be\be_interface.cpp:1955
+
+ static void
+ create_alias_skel (
+ TAO_ServerRequest & server_request,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS
+ );
+
+ // TAO_IDL - Generated from
+ // be\be_interface.cpp:1955
+
+ static void
+ create_interface_skel (
+ TAO_ServerRequest & server_request,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS
+ );
+
+ // TAO_IDL - Generated from
+ // be\be_interface.cpp:1955
+
+ static void
+ create_value_skel (
+ TAO_ServerRequest & server_request,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS
+ );
+
+ // TAO_IDL - Generated from
+ // be\be_interface.cpp:1955
+
+ static void
+ create_value_box_skel (
+ TAO_ServerRequest & server_request,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS
+ );
+
+ // TAO_IDL - Generated from
+ // be\be_interface.cpp:1955
+
+ static void
+ create_exception_skel (
+ TAO_ServerRequest & server_request,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS
+ );
+
+ // TAO_IDL - Generated from
+ // be\be_interface.cpp:1955
+
+ static void
+ create_native_skel (
+ TAO_ServerRequest & server_request,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS
+ );
+
+ // TAO_IDL - Generated from
+ // be\be_interface.cpp:1955
+
+ static void
+ create_abstract_interface_skel (
+ TAO_ServerRequest & server_request,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS
+ );
+
+ // TAO_IDL - Generated from
+ // be\be_interface.cpp:1955
+
+ static void
+ create_local_interface_skel (
+ TAO_ServerRequest & server_request,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS
+ );
+
+ // TAO_IDL - Generated from
+ // be\be_interface.cpp:1955
+
+ static void
+ create_ext_value_skel (
+ TAO_ServerRequest & server_request,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS
+ );
+
+ static void
+ _get_id_skel (
+ TAO_ServerRequest & server_request,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS
+ );
+
+ static void
+ _set_id_skel (
+ TAO_ServerRequest & server_request,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS
+ );
+
+ static void
+ _get_name_skel (
+ TAO_ServerRequest & server_request,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS
+ );
+
+ static void
+ _set_name_skel (
+ TAO_ServerRequest & server_request,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS
+ );
+
+ static void
+ _get_version_skel (
+ TAO_ServerRequest & server_request,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS
+ );
+
+ static void
+ _set_version_skel (
+ TAO_ServerRequest & server_request,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS
+ );
+
+ static void
+ _get_defined_in_skel (
+ TAO_ServerRequest & server_request,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS
+ );
+
+ static void
+ _get_absolute_name_skel (
+ TAO_ServerRequest & server_request,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS
+ );
+
+ static void
+ _get_containing_repository_skel (
+ TAO_ServerRequest & server_request,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS
+ );
+
+ // TAO_IDL - Generated from
+ // be\be_interface.cpp:1955
+
+ static void
+ describe_skel (
+ TAO_ServerRequest & server_request,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS
+ );
+
+ // TAO_IDL - Generated from
+ // be\be_interface.cpp:1955
+
+ static void
+ move_skel (
+ TAO_ServerRequest & server_request,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS
+ );
+
+ static void
+ _get_type_skel (
+ TAO_ServerRequest & server_request,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS
+ );
+
+ static void
+ _get_base_interfaces_skel (
+ TAO_ServerRequest & server_request,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS
+ );
+
+ static void
+ _set_base_interfaces_skel (
+ TAO_ServerRequest & server_request,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS
+ );
+
+ // TAO_IDL - Generated from
+ // be\be_interface.cpp:1955
+
+ static void
+ is_a_skel (
+ TAO_ServerRequest & server_request,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS
+ );
+
+ // TAO_IDL - Generated from
+ // be\be_interface.cpp:1955
+
+ static void
+ describe_interface_skel (
+ TAO_ServerRequest & server_request,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS
+ );
+
+ // TAO_IDL - Generated from
+ // be\be_interface.cpp:1955
+
+ static void
+ create_attribute_skel (
+ TAO_ServerRequest & server_request,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS
+ );
+
+ // TAO_IDL - Generated from
+ // be\be_interface.cpp:1955
+
+ static void
+ create_operation_skel (
+ TAO_ServerRequest & server_request,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS
+ );
+
+ // TAO_IDL - Generated from
+ // be\be_interface.cpp:1955
+
+ static void
+ describe_ext_interface_skel (
+ TAO_ServerRequest & server_request,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS
+ );
+
+ // TAO_IDL - Generated from
+ // be\be_interface.cpp:1955
+
+ static void
+ create_ext_attribute_skel (
+ TAO_ServerRequest & server_request,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS
+ );
+ };
+
+ // TAO_IDL - Generated from
+ // be\be_visitor_interface/interface_sh.cpp:87
+
+ class FactoryDef;
+ typedef FactoryDef *FactoryDef_ptr;
+
+ class FactoryDef
+ : public virtual POA_CORBA::OperationDef
+ {
+ protected:
+ FactoryDef (void);
+
+ public:
+ // Useful for template programming.
+ typedef ::CORBA::ComponentIR::FactoryDef _stub_type;
+ typedef ::CORBA::ComponentIR::FactoryDef_ptr _stub_ptr_type;
+ typedef ::CORBA::ComponentIR::FactoryDef_var _stub_var_type;
+
+ FactoryDef (const FactoryDef& rhs);
+ virtual ~FactoryDef (void);
+
+ virtual ::CORBA::Boolean _is_a (
+ const char* logical_type_id
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS
+ );
+
+ static void _is_a_skel (
+ TAO_ServerRequest & req,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL
+ );
+
+ static void _non_existent_skel (
+ TAO_ServerRequest & req,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL
+ );
+
+ static void _interface_skel (
+ TAO_ServerRequest & req,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL
+ );
+
+ static void _component_skel (
+ TAO_ServerRequest & req,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL
+ );
+
+ static void _repository_id_skel (
+ TAO_ServerRequest & req,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL
+ );
+
+ virtual void _dispatch (
+ TAO_ServerRequest & req,
+ void * servant_upcall
+ ACE_ENV_ARG_DECL
+ );
+
+ ::CORBA::ComponentIR::FactoryDef *_this (
+
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS
+ );
+
+ virtual const char* _interface_repository_id (void) const;
+
+ static void
+ _get_def_kind_skel (
+ TAO_ServerRequest & server_request,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS
+ );
+
+ // TAO_IDL - Generated from
+ // be\be_interface.cpp:1955
+
+ static void
+ destroy_skel (
+ TAO_ServerRequest & server_request,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS
+ );
+
+ static void
+ _get_id_skel (
+ TAO_ServerRequest & server_request,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS
+ );
+
+ static void
+ _set_id_skel (
+ TAO_ServerRequest & server_request,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS
+ );
+
+ static void
+ _get_name_skel (
+ TAO_ServerRequest & server_request,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS
+ );
+
+ static void
+ _set_name_skel (
+ TAO_ServerRequest & server_request,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS
+ );
+
+ static void
+ _get_version_skel (
+ TAO_ServerRequest & server_request,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS
+ );
+
+ static void
+ _set_version_skel (
+ TAO_ServerRequest & server_request,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS
+ );
+
+ static void
+ _get_defined_in_skel (
+ TAO_ServerRequest & server_request,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS
+ );
+
+ static void
+ _get_absolute_name_skel (
+ TAO_ServerRequest & server_request,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS
+ );
+
+ static void
+ _get_containing_repository_skel (
+ TAO_ServerRequest & server_request,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS
+ );
+
+ // TAO_IDL - Generated from
+ // be\be_interface.cpp:1955
+
+ static void
+ describe_skel (
+ TAO_ServerRequest & server_request,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS
+ );
+
+ // TAO_IDL - Generated from
+ // be\be_interface.cpp:1955
+
+ static void
+ move_skel (
+ TAO_ServerRequest & server_request,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS
+ );
+
+ static void
+ _get_result_skel (
+ TAO_ServerRequest & server_request,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS
+ );
+
+ static void
+ _get_result_def_skel (
+ TAO_ServerRequest & server_request,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS
+ );
+
+ static void
+ _set_result_def_skel (
+ TAO_ServerRequest & server_request,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS
+ );
+
+ static void
+ _get_params_skel (
+ TAO_ServerRequest & server_request,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS
+ );
+
+ static void
+ _set_params_skel (
+ TAO_ServerRequest & server_request,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS
+ );
+
+ static void
+ _get_mode_skel (
+ TAO_ServerRequest & server_request,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS
+ );
+
+ static void
+ _set_mode_skel (
+ TAO_ServerRequest & server_request,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS
+ );
+
+ static void
+ _get_contexts_skel (
+ TAO_ServerRequest & server_request,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS
+ );
+
+ static void
+ _set_contexts_skel (
+ TAO_ServerRequest & server_request,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS
+ );
+
+ static void
+ _get_exceptions_skel (
+ TAO_ServerRequest & server_request,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS
+ );
+
+ static void
+ _set_exceptions_skel (
+ TAO_ServerRequest & server_request,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS
+ );
+ };
+
+ // TAO_IDL - Generated from
+ // be\be_visitor_interface/interface_sh.cpp:87
+
+ class FinderDef;
+ typedef FinderDef *FinderDef_ptr;
+
+ class FinderDef
+ : public virtual POA_CORBA::OperationDef
+ {
+ protected:
+ FinderDef (void);
+
+ public:
+ // Useful for template programming.
+ typedef ::CORBA::ComponentIR::FinderDef _stub_type;
+ typedef ::CORBA::ComponentIR::FinderDef_ptr _stub_ptr_type;
+ typedef ::CORBA::ComponentIR::FinderDef_var _stub_var_type;
+
+ FinderDef (const FinderDef& rhs);
+ virtual ~FinderDef (void);
+
+ virtual ::CORBA::Boolean _is_a (
+ const char* logical_type_id
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS
+ );
+
+ static void _is_a_skel (
+ TAO_ServerRequest & req,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL
+ );
+
+ static void _non_existent_skel (
+ TAO_ServerRequest & req,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL
+ );
+
+ static void _interface_skel (
+ TAO_ServerRequest & req,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL
+ );
+
+ static void _component_skel (
+ TAO_ServerRequest & req,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL
+ );
+
+ static void _repository_id_skel (
+ TAO_ServerRequest & req,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL
+ );
+
+ virtual void _dispatch (
+ TAO_ServerRequest & req,
+ void * servant_upcall
+ ACE_ENV_ARG_DECL
+ );
+
+ ::CORBA::ComponentIR::FinderDef *_this (
+
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS
+ );
+
+ virtual const char* _interface_repository_id (void) const;
+
+ static void
+ _get_def_kind_skel (
+ TAO_ServerRequest & server_request,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS
+ );
+
+ // TAO_IDL - Generated from
+ // be\be_interface.cpp:1955
+
+ static void
+ destroy_skel (
+ TAO_ServerRequest & server_request,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS
+ );
+
+ static void
+ _get_id_skel (
+ TAO_ServerRequest & server_request,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS
+ );
+
+ static void
+ _set_id_skel (
+ TAO_ServerRequest & server_request,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS
+ );
+
+ static void
+ _get_name_skel (
+ TAO_ServerRequest & server_request,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS
+ );
+
+ static void
+ _set_name_skel (
+ TAO_ServerRequest & server_request,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS
+ );
+
+ static void
+ _get_version_skel (
+ TAO_ServerRequest & server_request,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS
+ );
+
+ static void
+ _set_version_skel (
+ TAO_ServerRequest & server_request,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS
+ );
+
+ static void
+ _get_defined_in_skel (
+ TAO_ServerRequest & server_request,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS
+ );
+
+ static void
+ _get_absolute_name_skel (
+ TAO_ServerRequest & server_request,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS
+ );
+
+ static void
+ _get_containing_repository_skel (
+ TAO_ServerRequest & server_request,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS
+ );
+
+ // TAO_IDL - Generated from
+ // be\be_interface.cpp:1955
+
+ static void
+ describe_skel (
+ TAO_ServerRequest & server_request,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS
+ );
+
+ // TAO_IDL - Generated from
+ // be\be_interface.cpp:1955
+
+ static void
+ move_skel (
+ TAO_ServerRequest & server_request,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS
+ );
+
+ static void
+ _get_result_skel (
+ TAO_ServerRequest & server_request,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS
+ );
+
+ static void
+ _get_result_def_skel (
+ TAO_ServerRequest & server_request,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS
+ );
+
+ static void
+ _set_result_def_skel (
+ TAO_ServerRequest & server_request,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS
+ );
+
+ static void
+ _get_params_skel (
+ TAO_ServerRequest & server_request,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS
+ );
+
+ static void
+ _set_params_skel (
+ TAO_ServerRequest & server_request,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS
+ );
+
+ static void
+ _get_mode_skel (
+ TAO_ServerRequest & server_request,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS
+ );
+
+ static void
+ _set_mode_skel (
+ TAO_ServerRequest & server_request,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS
+ );
+
+ static void
+ _get_contexts_skel (
+ TAO_ServerRequest & server_request,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS
+ );
+
+ static void
+ _set_contexts_skel (
+ TAO_ServerRequest & server_request,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS
+ );
+
+ static void
+ _get_exceptions_skel (
+ TAO_ServerRequest & server_request,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS
+ );
+
+ static void
+ _set_exceptions_skel (
+ TAO_ServerRequest & server_request,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS
+ );
+ };
+
+ // TAO_IDL - Generated from
+ // be\be_visitor_interface/interface_sh.cpp:87
+
+ class HomeDef;
+ typedef HomeDef *HomeDef_ptr;
+
+ class HomeDef
+ : public virtual POA_CORBA::ExtInterfaceDef
+ {
+ protected:
+ HomeDef (void);
+
+ public:
+ // Useful for template programming.
+ typedef ::CORBA::ComponentIR::HomeDef _stub_type;
+ typedef ::CORBA::ComponentIR::HomeDef_ptr _stub_ptr_type;
+ typedef ::CORBA::ComponentIR::HomeDef_var _stub_var_type;
+
+ HomeDef (const HomeDef& rhs);
+ virtual ~HomeDef (void);
+
+ virtual ::CORBA::Boolean _is_a (
+ const char* logical_type_id
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS
+ );
+
+ static void _is_a_skel (
+ TAO_ServerRequest & req,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL
+ );
+
+ static void _non_existent_skel (
+ TAO_ServerRequest & req,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL
+ );
+
+ static void _interface_skel (
+ TAO_ServerRequest & req,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL
+ );
+
+ static void _component_skel (
+ TAO_ServerRequest & req,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL
+ );
+
+ static void _repository_id_skel (
+ TAO_ServerRequest & req,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL
+ );
+
+ virtual void _dispatch (
+ TAO_ServerRequest & req,
+ void * servant_upcall
+ ACE_ENV_ARG_DECL
+ );
+
+ ::CORBA::ComponentIR::HomeDef *_this (
+
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS
+ );
+
+ virtual const char* _interface_repository_id (void) const;
+
+ // TAO_IDL - Generated from
+ // be\be_visitor_operation/operation_sh.cpp:45
+
+ virtual ::CORBA::ComponentIR::HomeDef_ptr base_home (
+ ACE_ENV_SINGLE_ARG_DECL_WITH_DEFAULTS
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ )) = 0;
+
+ static void _get_base_home_skel (
+ TAO_ServerRequest & server_request,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL
+ );
+
+ // TAO_IDL - Generated from
+ // be\be_visitor_operation/operation_sh.cpp:45
+
+ virtual void base_home (
+ ::CORBA::ComponentIR::HomeDef_ptr base_home
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ )) = 0;
+
+ static void _set_base_home_skel (
+ TAO_ServerRequest & server_request,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL
+ );
+
+ // TAO_IDL - Generated from
+ // be\be_visitor_operation/operation_sh.cpp:45
+
+ virtual ::CORBA::InterfaceDefSeq * supported_interfaces (
+ ACE_ENV_SINGLE_ARG_DECL_WITH_DEFAULTS
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ )) = 0;
+
+ static void _get_supported_interfaces_skel (
+ TAO_ServerRequest & server_request,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL
+ );
+
+ // TAO_IDL - Generated from
+ // be\be_visitor_operation/operation_sh.cpp:45
+
+ virtual void supported_interfaces (
+ const ::CORBA::InterfaceDefSeq & supported_interfaces
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ )) = 0;
+
+ static void _set_supported_interfaces_skel (
+ TAO_ServerRequest & server_request,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL
+ );
+
+ // TAO_IDL - Generated from
+ // be\be_visitor_operation/operation_sh.cpp:45
+
+ virtual ::CORBA::ComponentIR::ComponentDef_ptr managed_component (
+ ACE_ENV_SINGLE_ARG_DECL_WITH_DEFAULTS
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ )) = 0;
+
+ static void _get_managed_component_skel (
+ TAO_ServerRequest & server_request,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL
+ );
+
+ // TAO_IDL - Generated from
+ // be\be_visitor_operation/operation_sh.cpp:45
+
+ virtual void managed_component (
+ ::CORBA::ComponentIR::ComponentDef_ptr managed_component
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ )) = 0;
+
+ static void _set_managed_component_skel (
+ TAO_ServerRequest & server_request,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL
+ );
+
+ // TAO_IDL - Generated from
+ // be\be_visitor_operation/operation_sh.cpp:45
+
+ virtual ::CORBA::ValueDef_ptr primary_key (
+ ACE_ENV_SINGLE_ARG_DECL_WITH_DEFAULTS
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ )) = 0;
+
+ static void _get_primary_key_skel (
+ TAO_ServerRequest & server_request,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL
+ );
+
+ // TAO_IDL - Generated from
+ // be\be_visitor_operation/operation_sh.cpp:45
+
+ virtual void primary_key (
+ ::CORBA::ValueDef_ptr primary_key
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ )) = 0;
+
+ static void _set_primary_key_skel (
+ TAO_ServerRequest & server_request,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL
+ );
+
+ // TAO_IDL - Generated from
+ // be\be_visitor_operation/operation_sh.cpp:45
+
+ virtual ::CORBA::ComponentIR::FactoryDef_ptr create_factory (
+ const char * id,
+ const char * name,
+ const char * version,
+ const ::CORBA::ParDescriptionSeq & params,
+ const ::CORBA::ExceptionDefSeq & exceptions
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ )) = 0;
+
+ static void create_factory_skel (
+ TAO_ServerRequest & server_request,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL
+ );
+
+ // TAO_IDL - Generated from
+ // be\be_visitor_operation/operation_sh.cpp:45
+
+ virtual ::CORBA::ComponentIR::FinderDef_ptr create_finder (
+ const char * id,
+ const char * name,
+ const char * version,
+ const ::CORBA::ParDescriptionSeq & params,
+ const ::CORBA::ExceptionDefSeq & exceptions
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ )) = 0;
+
+ static void create_finder_skel (
+ TAO_ServerRequest & server_request,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL
+ );
+
+ static void
+ _get_def_kind_skel (
+ TAO_ServerRequest & server_request,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS
+ );
+
+ // TAO_IDL - Generated from
+ // be\be_interface.cpp:1955
+
+ static void
+ destroy_skel (
+ TAO_ServerRequest & server_request,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS
+ );
+
+ // TAO_IDL - Generated from
+ // be\be_interface.cpp:1955
+
+ static void
+ lookup_skel (
+ TAO_ServerRequest & server_request,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS
+ );
+
+ // TAO_IDL - Generated from
+ // be\be_interface.cpp:1955
+
+ static void
+ contents_skel (
+ TAO_ServerRequest & server_request,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS
+ );
+
+ // TAO_IDL - Generated from
+ // be\be_interface.cpp:1955
+
+ static void
+ lookup_name_skel (
+ TAO_ServerRequest & server_request,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS
+ );
+
+ // TAO_IDL - Generated from
+ // be\be_interface.cpp:1955
+
+ static void
+ describe_contents_skel (
+ TAO_ServerRequest & server_request,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS
+ );
+
+ // TAO_IDL - Generated from
+ // be\be_interface.cpp:1955
+
+ static void
+ create_module_skel (
+ TAO_ServerRequest & server_request,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS
+ );
+
+ // TAO_IDL - Generated from
+ // be\be_interface.cpp:1955
+
+ static void
+ create_constant_skel (
+ TAO_ServerRequest & server_request,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS
+ );
+
+ // TAO_IDL - Generated from
+ // be\be_interface.cpp:1955
+
+ static void
+ create_struct_skel (
+ TAO_ServerRequest & server_request,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS
+ );
+
+ // TAO_IDL - Generated from
+ // be\be_interface.cpp:1955
+
+ static void
+ create_union_skel (
+ TAO_ServerRequest & server_request,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS
+ );
+
+ // TAO_IDL - Generated from
+ // be\be_interface.cpp:1955
+
+ static void
+ create_enum_skel (
+ TAO_ServerRequest & server_request,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS
+ );
+
+ // TAO_IDL - Generated from
+ // be\be_interface.cpp:1955
+
+ static void
+ create_alias_skel (
+ TAO_ServerRequest & server_request,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS
+ );
+
+ // TAO_IDL - Generated from
+ // be\be_interface.cpp:1955
+
+ static void
+ create_interface_skel (
+ TAO_ServerRequest & server_request,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS
+ );
+
+ // TAO_IDL - Generated from
+ // be\be_interface.cpp:1955
+
+ static void
+ create_value_skel (
+ TAO_ServerRequest & server_request,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS
+ );
+
+ // TAO_IDL - Generated from
+ // be\be_interface.cpp:1955
+
+ static void
+ create_value_box_skel (
+ TAO_ServerRequest & server_request,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS
+ );
+
+ // TAO_IDL - Generated from
+ // be\be_interface.cpp:1955
+
+ static void
+ create_exception_skel (
+ TAO_ServerRequest & server_request,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS
+ );
+
+ // TAO_IDL - Generated from
+ // be\be_interface.cpp:1955
+
+ static void
+ create_native_skel (
+ TAO_ServerRequest & server_request,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS
+ );
+
+ // TAO_IDL - Generated from
+ // be\be_interface.cpp:1955
+
+ static void
+ create_abstract_interface_skel (
+ TAO_ServerRequest & server_request,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS
+ );
+
+ // TAO_IDL - Generated from
+ // be\be_interface.cpp:1955
+
+ static void
+ create_local_interface_skel (
+ TAO_ServerRequest & server_request,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS
+ );
+
+ // TAO_IDL - Generated from
+ // be\be_interface.cpp:1955
+
+ static void
+ create_ext_value_skel (
+ TAO_ServerRequest & server_request,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS
+ );
+
+ static void
+ _get_id_skel (
+ TAO_ServerRequest & server_request,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS
+ );
+
+ static void
+ _set_id_skel (
+ TAO_ServerRequest & server_request,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS
+ );
+
+ static void
+ _get_name_skel (
+ TAO_ServerRequest & server_request,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS
+ );
+
+ static void
+ _set_name_skel (
+ TAO_ServerRequest & server_request,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS
+ );
+
+ static void
+ _get_version_skel (
+ TAO_ServerRequest & server_request,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS
+ );
+
+ static void
+ _set_version_skel (
+ TAO_ServerRequest & server_request,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS
+ );
+
+ static void
+ _get_defined_in_skel (
+ TAO_ServerRequest & server_request,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS
+ );
+
+ static void
+ _get_absolute_name_skel (
+ TAO_ServerRequest & server_request,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS
+ );
+
+ static void
+ _get_containing_repository_skel (
+ TAO_ServerRequest & server_request,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS
+ );
+
+ // TAO_IDL - Generated from
+ // be\be_interface.cpp:1955
+
+ static void
+ describe_skel (
+ TAO_ServerRequest & server_request,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS
+ );
+
+ // TAO_IDL - Generated from
+ // be\be_interface.cpp:1955
+
+ static void
+ move_skel (
+ TAO_ServerRequest & server_request,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS
+ );
+
+ static void
+ _get_type_skel (
+ TAO_ServerRequest & server_request,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS
+ );
+
+ static void
+ _get_base_interfaces_skel (
+ TAO_ServerRequest & server_request,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS
+ );
+
+ static void
+ _set_base_interfaces_skel (
+ TAO_ServerRequest & server_request,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS
+ );
+
+ // TAO_IDL - Generated from
+ // be\be_interface.cpp:1955
+
+ static void
+ is_a_skel (
+ TAO_ServerRequest & server_request,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS
+ );
+
+ // TAO_IDL - Generated from
+ // be\be_interface.cpp:1955
+
+ static void
+ describe_interface_skel (
+ TAO_ServerRequest & server_request,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS
+ );
+
+ // TAO_IDL - Generated from
+ // be\be_interface.cpp:1955
+
+ static void
+ create_attribute_skel (
+ TAO_ServerRequest & server_request,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS
+ );
+
+ // TAO_IDL - Generated from
+ // be\be_interface.cpp:1955
+
+ static void
+ create_operation_skel (
+ TAO_ServerRequest & server_request,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS
+ );
+
+ // TAO_IDL - Generated from
+ // be\be_interface.cpp:1955
+
+ static void
+ describe_ext_interface_skel (
+ TAO_ServerRequest & server_request,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS
+ );
+
+ // TAO_IDL - Generated from
+ // be\be_interface.cpp:1955
+
+ static void
+ create_ext_attribute_skel (
+ TAO_ServerRequest & server_request,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS
+ );
+ };
+
+ // TAO_IDL - Generated from
+ // be\be_visitor_module/module_sh.cpp:80
+
+ } // module CORBA::ComponentIR
+
+// TAO_IDL - Generated from
+// be\be_visitor_module/module_sh.cpp:80
+
+} // module CORBA
+
+// TAO_IDL - Generated from
+// be\be_codegen.cpp:1219
+
+
+
+TAO_END_VERSIONED_NAMESPACE_DECL
+
+#include "IFR_ComponentsS_T.h"
+
+#if defined (__ACE_INLINE__)
+#include "IFR_ComponentsS.inl"
+#endif /* defined INLINE */
+
+#include /**/ "ace/post.h"
+#endif /* ifndef */
+
diff --git a/TAO/orbsvcs/orbsvcs/IFRService/IFR_ComponentsS.inl b/TAO/orbsvcs/orbsvcs/IFRService/IFR_ComponentsS.inl
new file mode 100644
index 00000000000..86e5fd82676
--- /dev/null
+++ b/TAO/orbsvcs/orbsvcs/IFRService/IFR_ComponentsS.inl
@@ -0,0 +1,6972 @@
+// -*- C++ -*-
+//
+// $Id$
+
+// **** Code generated by the The ACE ORB (TAO) IDL Compiler ****
+// TAO and the TAO IDL Compiler have been developed by:
+// Center for Distributed Object Computing
+// Washington University
+// St. Louis, MO
+// USA
+// http://www.cs.wustl.edu/~schmidt/doc-center.html
+// and
+// Distributed Object Computing Laboratory
+// University of California at Irvine
+// Irvine, CA
+// USA
+// http://doc.ece.uci.edu/
+// and
+// Institute for Software Integrated Systems
+// Vanderbilt University
+// Nashville, TN
+// USA
+// http://www.isis.vanderbilt.edu/
+//
+// Information about TAO is available at:
+// http://www.cs.wustl.edu/~schmidt/TAO.html
+
+
+TAO_BEGIN_VERSIONED_NAMESPACE_DECL
+
+
+
+ACE_INLINE
+void
+POA_CORBA::ComponentIR::EventDef::_get_def_kind_skel (
+ TAO_ServerRequest & server_request,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL
+ )
+{
+ POA_CORBA::IRObject * const impl = static_cast<POA_CORBA::ComponentIR::EventDef *> (servant);
+ POA_CORBA::IRObject::_get_def_kind_skel (
+ server_request,
+ servant_upcall,
+ impl
+ ACE_ENV_ARG_PARAMETER
+ );
+}
+
+// TAO_IDL - Generated from
+// be\be_interface.cpp:1955
+
+ACE_INLINE
+void
+POA_CORBA::ComponentIR::EventDef::destroy_skel (
+ TAO_ServerRequest & server_request,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL
+ )
+{
+ POA_CORBA::IRObject * const impl = static_cast<POA_CORBA::ComponentIR::EventDef *> (servant);
+ POA_CORBA::IRObject::destroy_skel (
+ server_request,
+ servant_upcall,
+ impl
+ ACE_ENV_ARG_PARAMETER
+ );
+}
+
+// TAO_IDL - Generated from
+// be\be_interface.cpp:1955
+
+ACE_INLINE
+void
+POA_CORBA::ComponentIR::EventDef::lookup_skel (
+ TAO_ServerRequest & server_request,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL
+ )
+{
+ POA_CORBA::Container * const impl = static_cast<POA_CORBA::ComponentIR::EventDef *> (servant);
+ POA_CORBA::Container::lookup_skel (
+ server_request,
+ servant_upcall,
+ impl
+ ACE_ENV_ARG_PARAMETER
+ );
+}
+
+// TAO_IDL - Generated from
+// be\be_interface.cpp:1955
+
+ACE_INLINE
+void
+POA_CORBA::ComponentIR::EventDef::contents_skel (
+ TAO_ServerRequest & server_request,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL
+ )
+{
+ POA_CORBA::Container * const impl = static_cast<POA_CORBA::ComponentIR::EventDef *> (servant);
+ POA_CORBA::Container::contents_skel (
+ server_request,
+ servant_upcall,
+ impl
+ ACE_ENV_ARG_PARAMETER
+ );
+}
+
+// TAO_IDL - Generated from
+// be\be_interface.cpp:1955
+
+ACE_INLINE
+void
+POA_CORBA::ComponentIR::EventDef::lookup_name_skel (
+ TAO_ServerRequest & server_request,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL
+ )
+{
+ POA_CORBA::Container * const impl = static_cast<POA_CORBA::ComponentIR::EventDef *> (servant);
+ POA_CORBA::Container::lookup_name_skel (
+ server_request,
+ servant_upcall,
+ impl
+ ACE_ENV_ARG_PARAMETER
+ );
+}
+
+// TAO_IDL - Generated from
+// be\be_interface.cpp:1955
+
+ACE_INLINE
+void
+POA_CORBA::ComponentIR::EventDef::describe_contents_skel (
+ TAO_ServerRequest & server_request,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL
+ )
+{
+ POA_CORBA::Container * const impl = static_cast<POA_CORBA::ComponentIR::EventDef *> (servant);
+ POA_CORBA::Container::describe_contents_skel (
+ server_request,
+ servant_upcall,
+ impl
+ ACE_ENV_ARG_PARAMETER
+ );
+}
+
+// TAO_IDL - Generated from
+// be\be_interface.cpp:1955
+
+ACE_INLINE
+void
+POA_CORBA::ComponentIR::EventDef::create_module_skel (
+ TAO_ServerRequest & server_request,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL
+ )
+{
+ POA_CORBA::Container * const impl = static_cast<POA_CORBA::ComponentIR::EventDef *> (servant);
+ POA_CORBA::Container::create_module_skel (
+ server_request,
+ servant_upcall,
+ impl
+ ACE_ENV_ARG_PARAMETER
+ );
+}
+
+// TAO_IDL - Generated from
+// be\be_interface.cpp:1955
+
+ACE_INLINE
+void
+POA_CORBA::ComponentIR::EventDef::create_constant_skel (
+ TAO_ServerRequest & server_request,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL
+ )
+{
+ POA_CORBA::Container * const impl = static_cast<POA_CORBA::ComponentIR::EventDef *> (servant);
+ POA_CORBA::Container::create_constant_skel (
+ server_request,
+ servant_upcall,
+ impl
+ ACE_ENV_ARG_PARAMETER
+ );
+}
+
+// TAO_IDL - Generated from
+// be\be_interface.cpp:1955
+
+ACE_INLINE
+void
+POA_CORBA::ComponentIR::EventDef::create_struct_skel (
+ TAO_ServerRequest & server_request,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL
+ )
+{
+ POA_CORBA::Container * const impl = static_cast<POA_CORBA::ComponentIR::EventDef *> (servant);
+ POA_CORBA::Container::create_struct_skel (
+ server_request,
+ servant_upcall,
+ impl
+ ACE_ENV_ARG_PARAMETER
+ );
+}
+
+// TAO_IDL - Generated from
+// be\be_interface.cpp:1955
+
+ACE_INLINE
+void
+POA_CORBA::ComponentIR::EventDef::create_union_skel (
+ TAO_ServerRequest & server_request,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL
+ )
+{
+ POA_CORBA::Container * const impl = static_cast<POA_CORBA::ComponentIR::EventDef *> (servant);
+ POA_CORBA::Container::create_union_skel (
+ server_request,
+ servant_upcall,
+ impl
+ ACE_ENV_ARG_PARAMETER
+ );
+}
+
+// TAO_IDL - Generated from
+// be\be_interface.cpp:1955
+
+ACE_INLINE
+void
+POA_CORBA::ComponentIR::EventDef::create_enum_skel (
+ TAO_ServerRequest & server_request,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL
+ )
+{
+ POA_CORBA::Container * const impl = static_cast<POA_CORBA::ComponentIR::EventDef *> (servant);
+ POA_CORBA::Container::create_enum_skel (
+ server_request,
+ servant_upcall,
+ impl
+ ACE_ENV_ARG_PARAMETER
+ );
+}
+
+// TAO_IDL - Generated from
+// be\be_interface.cpp:1955
+
+ACE_INLINE
+void
+POA_CORBA::ComponentIR::EventDef::create_alias_skel (
+ TAO_ServerRequest & server_request,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL
+ )
+{
+ POA_CORBA::Container * const impl = static_cast<POA_CORBA::ComponentIR::EventDef *> (servant);
+ POA_CORBA::Container::create_alias_skel (
+ server_request,
+ servant_upcall,
+ impl
+ ACE_ENV_ARG_PARAMETER
+ );
+}
+
+// TAO_IDL - Generated from
+// be\be_interface.cpp:1955
+
+ACE_INLINE
+void
+POA_CORBA::ComponentIR::EventDef::create_interface_skel (
+ TAO_ServerRequest & server_request,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL
+ )
+{
+ POA_CORBA::Container * const impl = static_cast<POA_CORBA::ComponentIR::EventDef *> (servant);
+ POA_CORBA::Container::create_interface_skel (
+ server_request,
+ servant_upcall,
+ impl
+ ACE_ENV_ARG_PARAMETER
+ );
+}
+
+// TAO_IDL - Generated from
+// be\be_interface.cpp:1955
+
+ACE_INLINE
+void
+POA_CORBA::ComponentIR::EventDef::create_value_skel (
+ TAO_ServerRequest & server_request,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL
+ )
+{
+ POA_CORBA::Container * const impl = static_cast<POA_CORBA::ComponentIR::EventDef *> (servant);
+ POA_CORBA::Container::create_value_skel (
+ server_request,
+ servant_upcall,
+ impl
+ ACE_ENV_ARG_PARAMETER
+ );
+}
+
+// TAO_IDL - Generated from
+// be\be_interface.cpp:1955
+
+ACE_INLINE
+void
+POA_CORBA::ComponentIR::EventDef::create_value_box_skel (
+ TAO_ServerRequest & server_request,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL
+ )
+{
+ POA_CORBA::Container * const impl = static_cast<POA_CORBA::ComponentIR::EventDef *> (servant);
+ POA_CORBA::Container::create_value_box_skel (
+ server_request,
+ servant_upcall,
+ impl
+ ACE_ENV_ARG_PARAMETER
+ );
+}
+
+// TAO_IDL - Generated from
+// be\be_interface.cpp:1955
+
+ACE_INLINE
+void
+POA_CORBA::ComponentIR::EventDef::create_exception_skel (
+ TAO_ServerRequest & server_request,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL
+ )
+{
+ POA_CORBA::Container * const impl = static_cast<POA_CORBA::ComponentIR::EventDef *> (servant);
+ POA_CORBA::Container::create_exception_skel (
+ server_request,
+ servant_upcall,
+ impl
+ ACE_ENV_ARG_PARAMETER
+ );
+}
+
+// TAO_IDL - Generated from
+// be\be_interface.cpp:1955
+
+ACE_INLINE
+void
+POA_CORBA::ComponentIR::EventDef::create_native_skel (
+ TAO_ServerRequest & server_request,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL
+ )
+{
+ POA_CORBA::Container * const impl = static_cast<POA_CORBA::ComponentIR::EventDef *> (servant);
+ POA_CORBA::Container::create_native_skel (
+ server_request,
+ servant_upcall,
+ impl
+ ACE_ENV_ARG_PARAMETER
+ );
+}
+
+// TAO_IDL - Generated from
+// be\be_interface.cpp:1955
+
+ACE_INLINE
+void
+POA_CORBA::ComponentIR::EventDef::create_abstract_interface_skel (
+ TAO_ServerRequest & server_request,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL
+ )
+{
+ POA_CORBA::Container * const impl = static_cast<POA_CORBA::ComponentIR::EventDef *> (servant);
+ POA_CORBA::Container::create_abstract_interface_skel (
+ server_request,
+ servant_upcall,
+ impl
+ ACE_ENV_ARG_PARAMETER
+ );
+}
+
+// TAO_IDL - Generated from
+// be\be_interface.cpp:1955
+
+ACE_INLINE
+void
+POA_CORBA::ComponentIR::EventDef::create_local_interface_skel (
+ TAO_ServerRequest & server_request,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL
+ )
+{
+ POA_CORBA::Container * const impl = static_cast<POA_CORBA::ComponentIR::EventDef *> (servant);
+ POA_CORBA::Container::create_local_interface_skel (
+ server_request,
+ servant_upcall,
+ impl
+ ACE_ENV_ARG_PARAMETER
+ );
+}
+
+// TAO_IDL - Generated from
+// be\be_interface.cpp:1955
+
+ACE_INLINE
+void
+POA_CORBA::ComponentIR::EventDef::create_ext_value_skel (
+ TAO_ServerRequest & server_request,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL
+ )
+{
+ POA_CORBA::Container * const impl = static_cast<POA_CORBA::ComponentIR::EventDef *> (servant);
+ POA_CORBA::Container::create_ext_value_skel (
+ server_request,
+ servant_upcall,
+ impl
+ ACE_ENV_ARG_PARAMETER
+ );
+}
+
+ACE_INLINE
+void
+POA_CORBA::ComponentIR::EventDef::_get_id_skel (
+ TAO_ServerRequest & server_request,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL
+ )
+{
+ POA_CORBA::Contained * const impl = static_cast<POA_CORBA::ComponentIR::EventDef *> (servant);
+ POA_CORBA::Contained::_get_id_skel (
+ server_request,
+ servant_upcall,
+ impl
+ ACE_ENV_ARG_PARAMETER
+ );
+}
+
+ACE_INLINE
+void
+POA_CORBA::ComponentIR::EventDef::_set_id_skel (
+ TAO_ServerRequest & server_request,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL
+ )
+{
+ POA_CORBA::Contained * const impl = static_cast<POA_CORBA::ComponentIR::EventDef *> (servant);
+ POA_CORBA::Contained::_set_id_skel (
+ server_request,
+ servant_upcall,
+ impl
+ ACE_ENV_ARG_PARAMETER
+ );
+}
+
+ACE_INLINE
+void
+POA_CORBA::ComponentIR::EventDef::_get_name_skel (
+ TAO_ServerRequest & server_request,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL
+ )
+{
+ POA_CORBA::Contained * const impl = static_cast<POA_CORBA::ComponentIR::EventDef *> (servant);
+ POA_CORBA::Contained::_get_name_skel (
+ server_request,
+ servant_upcall,
+ impl
+ ACE_ENV_ARG_PARAMETER
+ );
+}
+
+ACE_INLINE
+void
+POA_CORBA::ComponentIR::EventDef::_set_name_skel (
+ TAO_ServerRequest & server_request,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL
+ )
+{
+ POA_CORBA::Contained * const impl = static_cast<POA_CORBA::ComponentIR::EventDef *> (servant);
+ POA_CORBA::Contained::_set_name_skel (
+ server_request,
+ servant_upcall,
+ impl
+ ACE_ENV_ARG_PARAMETER
+ );
+}
+
+ACE_INLINE
+void
+POA_CORBA::ComponentIR::EventDef::_get_version_skel (
+ TAO_ServerRequest & server_request,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL
+ )
+{
+ POA_CORBA::Contained * const impl = static_cast<POA_CORBA::ComponentIR::EventDef *> (servant);
+ POA_CORBA::Contained::_get_version_skel (
+ server_request,
+ servant_upcall,
+ impl
+ ACE_ENV_ARG_PARAMETER
+ );
+}
+
+ACE_INLINE
+void
+POA_CORBA::ComponentIR::EventDef::_set_version_skel (
+ TAO_ServerRequest & server_request,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL
+ )
+{
+ POA_CORBA::Contained * const impl = static_cast<POA_CORBA::ComponentIR::EventDef *> (servant);
+ POA_CORBA::Contained::_set_version_skel (
+ server_request,
+ servant_upcall,
+ impl
+ ACE_ENV_ARG_PARAMETER
+ );
+}
+
+ACE_INLINE
+void
+POA_CORBA::ComponentIR::EventDef::_get_defined_in_skel (
+ TAO_ServerRequest & server_request,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL
+ )
+{
+ POA_CORBA::Contained * const impl = static_cast<POA_CORBA::ComponentIR::EventDef *> (servant);
+ POA_CORBA::Contained::_get_defined_in_skel (
+ server_request,
+ servant_upcall,
+ impl
+ ACE_ENV_ARG_PARAMETER
+ );
+}
+
+ACE_INLINE
+void
+POA_CORBA::ComponentIR::EventDef::_get_absolute_name_skel (
+ TAO_ServerRequest & server_request,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL
+ )
+{
+ POA_CORBA::Contained * const impl = static_cast<POA_CORBA::ComponentIR::EventDef *> (servant);
+ POA_CORBA::Contained::_get_absolute_name_skel (
+ server_request,
+ servant_upcall,
+ impl
+ ACE_ENV_ARG_PARAMETER
+ );
+}
+
+ACE_INLINE
+void
+POA_CORBA::ComponentIR::EventDef::_get_containing_repository_skel (
+ TAO_ServerRequest & server_request,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL
+ )
+{
+ POA_CORBA::Contained * const impl = static_cast<POA_CORBA::ComponentIR::EventDef *> (servant);
+ POA_CORBA::Contained::_get_containing_repository_skel (
+ server_request,
+ servant_upcall,
+ impl
+ ACE_ENV_ARG_PARAMETER
+ );
+}
+
+// TAO_IDL - Generated from
+// be\be_interface.cpp:1955
+
+ACE_INLINE
+void
+POA_CORBA::ComponentIR::EventDef::describe_skel (
+ TAO_ServerRequest & server_request,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL
+ )
+{
+ POA_CORBA::Contained * const impl = static_cast<POA_CORBA::ComponentIR::EventDef *> (servant);
+ POA_CORBA::Contained::describe_skel (
+ server_request,
+ servant_upcall,
+ impl
+ ACE_ENV_ARG_PARAMETER
+ );
+}
+
+// TAO_IDL - Generated from
+// be\be_interface.cpp:1955
+
+ACE_INLINE
+void
+POA_CORBA::ComponentIR::EventDef::move_skel (
+ TAO_ServerRequest & server_request,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL
+ )
+{
+ POA_CORBA::Contained * const impl = static_cast<POA_CORBA::ComponentIR::EventDef *> (servant);
+ POA_CORBA::Contained::move_skel (
+ server_request,
+ servant_upcall,
+ impl
+ ACE_ENV_ARG_PARAMETER
+ );
+}
+
+ACE_INLINE
+void
+POA_CORBA::ComponentIR::EventDef::_get_type_skel (
+ TAO_ServerRequest & server_request,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL
+ )
+{
+ POA_CORBA::IDLType * const impl = static_cast<POA_CORBA::ComponentIR::EventDef *> (servant);
+ POA_CORBA::IDLType::_get_type_skel (
+ server_request,
+ servant_upcall,
+ impl
+ ACE_ENV_ARG_PARAMETER
+ );
+}
+
+ACE_INLINE
+void
+POA_CORBA::ComponentIR::EventDef::_get_supported_interfaces_skel (
+ TAO_ServerRequest & server_request,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL
+ )
+{
+ POA_CORBA::ValueDef * const impl = static_cast<POA_CORBA::ComponentIR::EventDef *> (servant);
+ POA_CORBA::ValueDef::_get_supported_interfaces_skel (
+ server_request,
+ servant_upcall,
+ impl
+ ACE_ENV_ARG_PARAMETER
+ );
+}
+
+ACE_INLINE
+void
+POA_CORBA::ComponentIR::EventDef::_set_supported_interfaces_skel (
+ TAO_ServerRequest & server_request,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL
+ )
+{
+ POA_CORBA::ValueDef * const impl = static_cast<POA_CORBA::ComponentIR::EventDef *> (servant);
+ POA_CORBA::ValueDef::_set_supported_interfaces_skel (
+ server_request,
+ servant_upcall,
+ impl
+ ACE_ENV_ARG_PARAMETER
+ );
+}
+
+ACE_INLINE
+void
+POA_CORBA::ComponentIR::EventDef::_get_initializers_skel (
+ TAO_ServerRequest & server_request,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL
+ )
+{
+ POA_CORBA::ValueDef * const impl = static_cast<POA_CORBA::ComponentIR::EventDef *> (servant);
+ POA_CORBA::ValueDef::_get_initializers_skel (
+ server_request,
+ servant_upcall,
+ impl
+ ACE_ENV_ARG_PARAMETER
+ );
+}
+
+ACE_INLINE
+void
+POA_CORBA::ComponentIR::EventDef::_set_initializers_skel (
+ TAO_ServerRequest & server_request,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL
+ )
+{
+ POA_CORBA::ValueDef * const impl = static_cast<POA_CORBA::ComponentIR::EventDef *> (servant);
+ POA_CORBA::ValueDef::_set_initializers_skel (
+ server_request,
+ servant_upcall,
+ impl
+ ACE_ENV_ARG_PARAMETER
+ );
+}
+
+ACE_INLINE
+void
+POA_CORBA::ComponentIR::EventDef::_get_base_value_skel (
+ TAO_ServerRequest & server_request,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL
+ )
+{
+ POA_CORBA::ValueDef * const impl = static_cast<POA_CORBA::ComponentIR::EventDef *> (servant);
+ POA_CORBA::ValueDef::_get_base_value_skel (
+ server_request,
+ servant_upcall,
+ impl
+ ACE_ENV_ARG_PARAMETER
+ );
+}
+
+ACE_INLINE
+void
+POA_CORBA::ComponentIR::EventDef::_set_base_value_skel (
+ TAO_ServerRequest & server_request,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL
+ )
+{
+ POA_CORBA::ValueDef * const impl = static_cast<POA_CORBA::ComponentIR::EventDef *> (servant);
+ POA_CORBA::ValueDef::_set_base_value_skel (
+ server_request,
+ servant_upcall,
+ impl
+ ACE_ENV_ARG_PARAMETER
+ );
+}
+
+ACE_INLINE
+void
+POA_CORBA::ComponentIR::EventDef::_get_abstract_base_values_skel (
+ TAO_ServerRequest & server_request,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL
+ )
+{
+ POA_CORBA::ValueDef * const impl = static_cast<POA_CORBA::ComponentIR::EventDef *> (servant);
+ POA_CORBA::ValueDef::_get_abstract_base_values_skel (
+ server_request,
+ servant_upcall,
+ impl
+ ACE_ENV_ARG_PARAMETER
+ );
+}
+
+ACE_INLINE
+void
+POA_CORBA::ComponentIR::EventDef::_set_abstract_base_values_skel (
+ TAO_ServerRequest & server_request,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL
+ )
+{
+ POA_CORBA::ValueDef * const impl = static_cast<POA_CORBA::ComponentIR::EventDef *> (servant);
+ POA_CORBA::ValueDef::_set_abstract_base_values_skel (
+ server_request,
+ servant_upcall,
+ impl
+ ACE_ENV_ARG_PARAMETER
+ );
+}
+
+ACE_INLINE
+void
+POA_CORBA::ComponentIR::EventDef::_get_is_abstract_skel (
+ TAO_ServerRequest & server_request,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL
+ )
+{
+ POA_CORBA::ValueDef * const impl = static_cast<POA_CORBA::ComponentIR::EventDef *> (servant);
+ POA_CORBA::ValueDef::_get_is_abstract_skel (
+ server_request,
+ servant_upcall,
+ impl
+ ACE_ENV_ARG_PARAMETER
+ );
+}
+
+ACE_INLINE
+void
+POA_CORBA::ComponentIR::EventDef::_set_is_abstract_skel (
+ TAO_ServerRequest & server_request,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL
+ )
+{
+ POA_CORBA::ValueDef * const impl = static_cast<POA_CORBA::ComponentIR::EventDef *> (servant);
+ POA_CORBA::ValueDef::_set_is_abstract_skel (
+ server_request,
+ servant_upcall,
+ impl
+ ACE_ENV_ARG_PARAMETER
+ );
+}
+
+ACE_INLINE
+void
+POA_CORBA::ComponentIR::EventDef::_get_is_custom_skel (
+ TAO_ServerRequest & server_request,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL
+ )
+{
+ POA_CORBA::ValueDef * const impl = static_cast<POA_CORBA::ComponentIR::EventDef *> (servant);
+ POA_CORBA::ValueDef::_get_is_custom_skel (
+ server_request,
+ servant_upcall,
+ impl
+ ACE_ENV_ARG_PARAMETER
+ );
+}
+
+ACE_INLINE
+void
+POA_CORBA::ComponentIR::EventDef::_set_is_custom_skel (
+ TAO_ServerRequest & server_request,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL
+ )
+{
+ POA_CORBA::ValueDef * const impl = static_cast<POA_CORBA::ComponentIR::EventDef *> (servant);
+ POA_CORBA::ValueDef::_set_is_custom_skel (
+ server_request,
+ servant_upcall,
+ impl
+ ACE_ENV_ARG_PARAMETER
+ );
+}
+
+ACE_INLINE
+void
+POA_CORBA::ComponentIR::EventDef::_get_is_truncatable_skel (
+ TAO_ServerRequest & server_request,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL
+ )
+{
+ POA_CORBA::ValueDef * const impl = static_cast<POA_CORBA::ComponentIR::EventDef *> (servant);
+ POA_CORBA::ValueDef::_get_is_truncatable_skel (
+ server_request,
+ servant_upcall,
+ impl
+ ACE_ENV_ARG_PARAMETER
+ );
+}
+
+ACE_INLINE
+void
+POA_CORBA::ComponentIR::EventDef::_set_is_truncatable_skel (
+ TAO_ServerRequest & server_request,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL
+ )
+{
+ POA_CORBA::ValueDef * const impl = static_cast<POA_CORBA::ComponentIR::EventDef *> (servant);
+ POA_CORBA::ValueDef::_set_is_truncatable_skel (
+ server_request,
+ servant_upcall,
+ impl
+ ACE_ENV_ARG_PARAMETER
+ );
+}
+
+// TAO_IDL - Generated from
+// be\be_interface.cpp:1955
+
+ACE_INLINE
+void
+POA_CORBA::ComponentIR::EventDef::is_a_skel (
+ TAO_ServerRequest & server_request,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL
+ )
+{
+ POA_CORBA::ValueDef * const impl = static_cast<POA_CORBA::ComponentIR::EventDef *> (servant);
+ POA_CORBA::ValueDef::is_a_skel (
+ server_request,
+ servant_upcall,
+ impl
+ ACE_ENV_ARG_PARAMETER
+ );
+}
+
+// TAO_IDL - Generated from
+// be\be_interface.cpp:1955
+
+ACE_INLINE
+void
+POA_CORBA::ComponentIR::EventDef::describe_value_skel (
+ TAO_ServerRequest & server_request,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL
+ )
+{
+ POA_CORBA::ValueDef * const impl = static_cast<POA_CORBA::ComponentIR::EventDef *> (servant);
+ POA_CORBA::ValueDef::describe_value_skel (
+ server_request,
+ servant_upcall,
+ impl
+ ACE_ENV_ARG_PARAMETER
+ );
+}
+
+// TAO_IDL - Generated from
+// be\be_interface.cpp:1955
+
+ACE_INLINE
+void
+POA_CORBA::ComponentIR::EventDef::create_value_member_skel (
+ TAO_ServerRequest & server_request,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL
+ )
+{
+ POA_CORBA::ValueDef * const impl = static_cast<POA_CORBA::ComponentIR::EventDef *> (servant);
+ POA_CORBA::ValueDef::create_value_member_skel (
+ server_request,
+ servant_upcall,
+ impl
+ ACE_ENV_ARG_PARAMETER
+ );
+}
+
+// TAO_IDL - Generated from
+// be\be_interface.cpp:1955
+
+ACE_INLINE
+void
+POA_CORBA::ComponentIR::EventDef::create_attribute_skel (
+ TAO_ServerRequest & server_request,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL
+ )
+{
+ POA_CORBA::ValueDef * const impl = static_cast<POA_CORBA::ComponentIR::EventDef *> (servant);
+ POA_CORBA::ValueDef::create_attribute_skel (
+ server_request,
+ servant_upcall,
+ impl
+ ACE_ENV_ARG_PARAMETER
+ );
+}
+
+// TAO_IDL - Generated from
+// be\be_interface.cpp:1955
+
+ACE_INLINE
+void
+POA_CORBA::ComponentIR::EventDef::create_operation_skel (
+ TAO_ServerRequest & server_request,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL
+ )
+{
+ POA_CORBA::ValueDef * const impl = static_cast<POA_CORBA::ComponentIR::EventDef *> (servant);
+ POA_CORBA::ValueDef::create_operation_skel (
+ server_request,
+ servant_upcall,
+ impl
+ ACE_ENV_ARG_PARAMETER
+ );
+}
+
+ACE_INLINE
+void
+POA_CORBA::ComponentIR::EventDef::_get_ext_initializers_skel (
+ TAO_ServerRequest & server_request,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL
+ )
+{
+ POA_CORBA::ExtValueDef * const impl = static_cast<POA_CORBA::ComponentIR::EventDef *> (servant);
+ POA_CORBA::ExtValueDef::_get_ext_initializers_skel (
+ server_request,
+ servant_upcall,
+ impl
+ ACE_ENV_ARG_PARAMETER
+ );
+}
+
+ACE_INLINE
+void
+POA_CORBA::ComponentIR::EventDef::_set_ext_initializers_skel (
+ TAO_ServerRequest & server_request,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL
+ )
+{
+ POA_CORBA::ExtValueDef * const impl = static_cast<POA_CORBA::ComponentIR::EventDef *> (servant);
+ POA_CORBA::ExtValueDef::_set_ext_initializers_skel (
+ server_request,
+ servant_upcall,
+ impl
+ ACE_ENV_ARG_PARAMETER
+ );
+}
+
+// TAO_IDL - Generated from
+// be\be_interface.cpp:1955
+
+ACE_INLINE
+void
+POA_CORBA::ComponentIR::EventDef::describe_ext_value_skel (
+ TAO_ServerRequest & server_request,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL
+ )
+{
+ POA_CORBA::ExtValueDef * const impl = static_cast<POA_CORBA::ComponentIR::EventDef *> (servant);
+ POA_CORBA::ExtValueDef::describe_ext_value_skel (
+ server_request,
+ servant_upcall,
+ impl
+ ACE_ENV_ARG_PARAMETER
+ );
+}
+
+// TAO_IDL - Generated from
+// be\be_interface.cpp:1955
+
+ACE_INLINE
+void
+POA_CORBA::ComponentIR::EventDef::create_ext_attribute_skel (
+ TAO_ServerRequest & server_request,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL
+ )
+{
+ POA_CORBA::ExtValueDef * const impl = static_cast<POA_CORBA::ComponentIR::EventDef *> (servant);
+ POA_CORBA::ExtValueDef::create_ext_attribute_skel (
+ server_request,
+ servant_upcall,
+ impl
+ ACE_ENV_ARG_PARAMETER
+ );
+}
+
+ACE_INLINE
+void
+POA_CORBA::ComponentIR::Container::_get_def_kind_skel (
+ TAO_ServerRequest & server_request,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL
+ )
+{
+ POA_CORBA::IRObject * const impl = static_cast<POA_CORBA::ComponentIR::Container *> (servant);
+ POA_CORBA::IRObject::_get_def_kind_skel (
+ server_request,
+ servant_upcall,
+ impl
+ ACE_ENV_ARG_PARAMETER
+ );
+}
+
+// TAO_IDL - Generated from
+// be\be_interface.cpp:1955
+
+ACE_INLINE
+void
+POA_CORBA::ComponentIR::Container::destroy_skel (
+ TAO_ServerRequest & server_request,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL
+ )
+{
+ POA_CORBA::IRObject * const impl = static_cast<POA_CORBA::ComponentIR::Container *> (servant);
+ POA_CORBA::IRObject::destroy_skel (
+ server_request,
+ servant_upcall,
+ impl
+ ACE_ENV_ARG_PARAMETER
+ );
+}
+
+// TAO_IDL - Generated from
+// be\be_interface.cpp:1955
+
+ACE_INLINE
+void
+POA_CORBA::ComponentIR::Container::lookup_skel (
+ TAO_ServerRequest & server_request,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL
+ )
+{
+ POA_CORBA::Container * const impl = static_cast<POA_CORBA::ComponentIR::Container *> (servant);
+ POA_CORBA::Container::lookup_skel (
+ server_request,
+ servant_upcall,
+ impl
+ ACE_ENV_ARG_PARAMETER
+ );
+}
+
+// TAO_IDL - Generated from
+// be\be_interface.cpp:1955
+
+ACE_INLINE
+void
+POA_CORBA::ComponentIR::Container::contents_skel (
+ TAO_ServerRequest & server_request,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL
+ )
+{
+ POA_CORBA::Container * const impl = static_cast<POA_CORBA::ComponentIR::Container *> (servant);
+ POA_CORBA::Container::contents_skel (
+ server_request,
+ servant_upcall,
+ impl
+ ACE_ENV_ARG_PARAMETER
+ );
+}
+
+// TAO_IDL - Generated from
+// be\be_interface.cpp:1955
+
+ACE_INLINE
+void
+POA_CORBA::ComponentIR::Container::lookup_name_skel (
+ TAO_ServerRequest & server_request,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL
+ )
+{
+ POA_CORBA::Container * const impl = static_cast<POA_CORBA::ComponentIR::Container *> (servant);
+ POA_CORBA::Container::lookup_name_skel (
+ server_request,
+ servant_upcall,
+ impl
+ ACE_ENV_ARG_PARAMETER
+ );
+}
+
+// TAO_IDL - Generated from
+// be\be_interface.cpp:1955
+
+ACE_INLINE
+void
+POA_CORBA::ComponentIR::Container::describe_contents_skel (
+ TAO_ServerRequest & server_request,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL
+ )
+{
+ POA_CORBA::Container * const impl = static_cast<POA_CORBA::ComponentIR::Container *> (servant);
+ POA_CORBA::Container::describe_contents_skel (
+ server_request,
+ servant_upcall,
+ impl
+ ACE_ENV_ARG_PARAMETER
+ );
+}
+
+// TAO_IDL - Generated from
+// be\be_interface.cpp:1955
+
+ACE_INLINE
+void
+POA_CORBA::ComponentIR::Container::create_module_skel (
+ TAO_ServerRequest & server_request,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL
+ )
+{
+ POA_CORBA::Container * const impl = static_cast<POA_CORBA::ComponentIR::Container *> (servant);
+ POA_CORBA::Container::create_module_skel (
+ server_request,
+ servant_upcall,
+ impl
+ ACE_ENV_ARG_PARAMETER
+ );
+}
+
+// TAO_IDL - Generated from
+// be\be_interface.cpp:1955
+
+ACE_INLINE
+void
+POA_CORBA::ComponentIR::Container::create_constant_skel (
+ TAO_ServerRequest & server_request,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL
+ )
+{
+ POA_CORBA::Container * const impl = static_cast<POA_CORBA::ComponentIR::Container *> (servant);
+ POA_CORBA::Container::create_constant_skel (
+ server_request,
+ servant_upcall,
+ impl
+ ACE_ENV_ARG_PARAMETER
+ );
+}
+
+// TAO_IDL - Generated from
+// be\be_interface.cpp:1955
+
+ACE_INLINE
+void
+POA_CORBA::ComponentIR::Container::create_struct_skel (
+ TAO_ServerRequest & server_request,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL
+ )
+{
+ POA_CORBA::Container * const impl = static_cast<POA_CORBA::ComponentIR::Container *> (servant);
+ POA_CORBA::Container::create_struct_skel (
+ server_request,
+ servant_upcall,
+ impl
+ ACE_ENV_ARG_PARAMETER
+ );
+}
+
+// TAO_IDL - Generated from
+// be\be_interface.cpp:1955
+
+ACE_INLINE
+void
+POA_CORBA::ComponentIR::Container::create_union_skel (
+ TAO_ServerRequest & server_request,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL
+ )
+{
+ POA_CORBA::Container * const impl = static_cast<POA_CORBA::ComponentIR::Container *> (servant);
+ POA_CORBA::Container::create_union_skel (
+ server_request,
+ servant_upcall,
+ impl
+ ACE_ENV_ARG_PARAMETER
+ );
+}
+
+// TAO_IDL - Generated from
+// be\be_interface.cpp:1955
+
+ACE_INLINE
+void
+POA_CORBA::ComponentIR::Container::create_enum_skel (
+ TAO_ServerRequest & server_request,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL
+ )
+{
+ POA_CORBA::Container * const impl = static_cast<POA_CORBA::ComponentIR::Container *> (servant);
+ POA_CORBA::Container::create_enum_skel (
+ server_request,
+ servant_upcall,
+ impl
+ ACE_ENV_ARG_PARAMETER
+ );
+}
+
+// TAO_IDL - Generated from
+// be\be_interface.cpp:1955
+
+ACE_INLINE
+void
+POA_CORBA::ComponentIR::Container::create_alias_skel (
+ TAO_ServerRequest & server_request,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL
+ )
+{
+ POA_CORBA::Container * const impl = static_cast<POA_CORBA::ComponentIR::Container *> (servant);
+ POA_CORBA::Container::create_alias_skel (
+ server_request,
+ servant_upcall,
+ impl
+ ACE_ENV_ARG_PARAMETER
+ );
+}
+
+// TAO_IDL - Generated from
+// be\be_interface.cpp:1955
+
+ACE_INLINE
+void
+POA_CORBA::ComponentIR::Container::create_interface_skel (
+ TAO_ServerRequest & server_request,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL
+ )
+{
+ POA_CORBA::Container * const impl = static_cast<POA_CORBA::ComponentIR::Container *> (servant);
+ POA_CORBA::Container::create_interface_skel (
+ server_request,
+ servant_upcall,
+ impl
+ ACE_ENV_ARG_PARAMETER
+ );
+}
+
+// TAO_IDL - Generated from
+// be\be_interface.cpp:1955
+
+ACE_INLINE
+void
+POA_CORBA::ComponentIR::Container::create_value_skel (
+ TAO_ServerRequest & server_request,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL
+ )
+{
+ POA_CORBA::Container * const impl = static_cast<POA_CORBA::ComponentIR::Container *> (servant);
+ POA_CORBA::Container::create_value_skel (
+ server_request,
+ servant_upcall,
+ impl
+ ACE_ENV_ARG_PARAMETER
+ );
+}
+
+// TAO_IDL - Generated from
+// be\be_interface.cpp:1955
+
+ACE_INLINE
+void
+POA_CORBA::ComponentIR::Container::create_value_box_skel (
+ TAO_ServerRequest & server_request,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL
+ )
+{
+ POA_CORBA::Container * const impl = static_cast<POA_CORBA::ComponentIR::Container *> (servant);
+ POA_CORBA::Container::create_value_box_skel (
+ server_request,
+ servant_upcall,
+ impl
+ ACE_ENV_ARG_PARAMETER
+ );
+}
+
+// TAO_IDL - Generated from
+// be\be_interface.cpp:1955
+
+ACE_INLINE
+void
+POA_CORBA::ComponentIR::Container::create_exception_skel (
+ TAO_ServerRequest & server_request,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL
+ )
+{
+ POA_CORBA::Container * const impl = static_cast<POA_CORBA::ComponentIR::Container *> (servant);
+ POA_CORBA::Container::create_exception_skel (
+ server_request,
+ servant_upcall,
+ impl
+ ACE_ENV_ARG_PARAMETER
+ );
+}
+
+// TAO_IDL - Generated from
+// be\be_interface.cpp:1955
+
+ACE_INLINE
+void
+POA_CORBA::ComponentIR::Container::create_native_skel (
+ TAO_ServerRequest & server_request,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL
+ )
+{
+ POA_CORBA::Container * const impl = static_cast<POA_CORBA::ComponentIR::Container *> (servant);
+ POA_CORBA::Container::create_native_skel (
+ server_request,
+ servant_upcall,
+ impl
+ ACE_ENV_ARG_PARAMETER
+ );
+}
+
+// TAO_IDL - Generated from
+// be\be_interface.cpp:1955
+
+ACE_INLINE
+void
+POA_CORBA::ComponentIR::Container::create_abstract_interface_skel (
+ TAO_ServerRequest & server_request,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL
+ )
+{
+ POA_CORBA::Container * const impl = static_cast<POA_CORBA::ComponentIR::Container *> (servant);
+ POA_CORBA::Container::create_abstract_interface_skel (
+ server_request,
+ servant_upcall,
+ impl
+ ACE_ENV_ARG_PARAMETER
+ );
+}
+
+// TAO_IDL - Generated from
+// be\be_interface.cpp:1955
+
+ACE_INLINE
+void
+POA_CORBA::ComponentIR::Container::create_local_interface_skel (
+ TAO_ServerRequest & server_request,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL
+ )
+{
+ POA_CORBA::Container * const impl = static_cast<POA_CORBA::ComponentIR::Container *> (servant);
+ POA_CORBA::Container::create_local_interface_skel (
+ server_request,
+ servant_upcall,
+ impl
+ ACE_ENV_ARG_PARAMETER
+ );
+}
+
+// TAO_IDL - Generated from
+// be\be_interface.cpp:1955
+
+ACE_INLINE
+void
+POA_CORBA::ComponentIR::Container::create_ext_value_skel (
+ TAO_ServerRequest & server_request,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL
+ )
+{
+ POA_CORBA::Container * const impl = static_cast<POA_CORBA::ComponentIR::Container *> (servant);
+ POA_CORBA::Container::create_ext_value_skel (
+ server_request,
+ servant_upcall,
+ impl
+ ACE_ENV_ARG_PARAMETER
+ );
+}
+
+ACE_INLINE
+void
+POA_CORBA::ComponentIR::ModuleDef::_get_def_kind_skel (
+ TAO_ServerRequest & server_request,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL
+ )
+{
+ POA_CORBA::IRObject * const impl = static_cast<POA_CORBA::ComponentIR::ModuleDef *> (servant);
+ POA_CORBA::IRObject::_get_def_kind_skel (
+ server_request,
+ servant_upcall,
+ impl
+ ACE_ENV_ARG_PARAMETER
+ );
+}
+
+// TAO_IDL - Generated from
+// be\be_interface.cpp:1955
+
+ACE_INLINE
+void
+POA_CORBA::ComponentIR::ModuleDef::destroy_skel (
+ TAO_ServerRequest & server_request,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL
+ )
+{
+ POA_CORBA::IRObject * const impl = static_cast<POA_CORBA::ComponentIR::ModuleDef *> (servant);
+ POA_CORBA::IRObject::destroy_skel (
+ server_request,
+ servant_upcall,
+ impl
+ ACE_ENV_ARG_PARAMETER
+ );
+}
+
+// TAO_IDL - Generated from
+// be\be_interface.cpp:1955
+
+ACE_INLINE
+void
+POA_CORBA::ComponentIR::ModuleDef::lookup_skel (
+ TAO_ServerRequest & server_request,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL
+ )
+{
+ POA_CORBA::Container * const impl = static_cast<POA_CORBA::ComponentIR::ModuleDef *> (servant);
+ POA_CORBA::Container::lookup_skel (
+ server_request,
+ servant_upcall,
+ impl
+ ACE_ENV_ARG_PARAMETER
+ );
+}
+
+// TAO_IDL - Generated from
+// be\be_interface.cpp:1955
+
+ACE_INLINE
+void
+POA_CORBA::ComponentIR::ModuleDef::contents_skel (
+ TAO_ServerRequest & server_request,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL
+ )
+{
+ POA_CORBA::Container * const impl = static_cast<POA_CORBA::ComponentIR::ModuleDef *> (servant);
+ POA_CORBA::Container::contents_skel (
+ server_request,
+ servant_upcall,
+ impl
+ ACE_ENV_ARG_PARAMETER
+ );
+}
+
+// TAO_IDL - Generated from
+// be\be_interface.cpp:1955
+
+ACE_INLINE
+void
+POA_CORBA::ComponentIR::ModuleDef::lookup_name_skel (
+ TAO_ServerRequest & server_request,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL
+ )
+{
+ POA_CORBA::Container * const impl = static_cast<POA_CORBA::ComponentIR::ModuleDef *> (servant);
+ POA_CORBA::Container::lookup_name_skel (
+ server_request,
+ servant_upcall,
+ impl
+ ACE_ENV_ARG_PARAMETER
+ );
+}
+
+// TAO_IDL - Generated from
+// be\be_interface.cpp:1955
+
+ACE_INLINE
+void
+POA_CORBA::ComponentIR::ModuleDef::describe_contents_skel (
+ TAO_ServerRequest & server_request,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL
+ )
+{
+ POA_CORBA::Container * const impl = static_cast<POA_CORBA::ComponentIR::ModuleDef *> (servant);
+ POA_CORBA::Container::describe_contents_skel (
+ server_request,
+ servant_upcall,
+ impl
+ ACE_ENV_ARG_PARAMETER
+ );
+}
+
+// TAO_IDL - Generated from
+// be\be_interface.cpp:1955
+
+ACE_INLINE
+void
+POA_CORBA::ComponentIR::ModuleDef::create_module_skel (
+ TAO_ServerRequest & server_request,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL
+ )
+{
+ POA_CORBA::Container * const impl = static_cast<POA_CORBA::ComponentIR::ModuleDef *> (servant);
+ POA_CORBA::Container::create_module_skel (
+ server_request,
+ servant_upcall,
+ impl
+ ACE_ENV_ARG_PARAMETER
+ );
+}
+
+// TAO_IDL - Generated from
+// be\be_interface.cpp:1955
+
+ACE_INLINE
+void
+POA_CORBA::ComponentIR::ModuleDef::create_constant_skel (
+ TAO_ServerRequest & server_request,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL
+ )
+{
+ POA_CORBA::Container * const impl = static_cast<POA_CORBA::ComponentIR::ModuleDef *> (servant);
+ POA_CORBA::Container::create_constant_skel (
+ server_request,
+ servant_upcall,
+ impl
+ ACE_ENV_ARG_PARAMETER
+ );
+}
+
+// TAO_IDL - Generated from
+// be\be_interface.cpp:1955
+
+ACE_INLINE
+void
+POA_CORBA::ComponentIR::ModuleDef::create_struct_skel (
+ TAO_ServerRequest & server_request,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL
+ )
+{
+ POA_CORBA::Container * const impl = static_cast<POA_CORBA::ComponentIR::ModuleDef *> (servant);
+ POA_CORBA::Container::create_struct_skel (
+ server_request,
+ servant_upcall,
+ impl
+ ACE_ENV_ARG_PARAMETER
+ );
+}
+
+// TAO_IDL - Generated from
+// be\be_interface.cpp:1955
+
+ACE_INLINE
+void
+POA_CORBA::ComponentIR::ModuleDef::create_union_skel (
+ TAO_ServerRequest & server_request,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL
+ )
+{
+ POA_CORBA::Container * const impl = static_cast<POA_CORBA::ComponentIR::ModuleDef *> (servant);
+ POA_CORBA::Container::create_union_skel (
+ server_request,
+ servant_upcall,
+ impl
+ ACE_ENV_ARG_PARAMETER
+ );
+}
+
+// TAO_IDL - Generated from
+// be\be_interface.cpp:1955
+
+ACE_INLINE
+void
+POA_CORBA::ComponentIR::ModuleDef::create_enum_skel (
+ TAO_ServerRequest & server_request,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL
+ )
+{
+ POA_CORBA::Container * const impl = static_cast<POA_CORBA::ComponentIR::ModuleDef *> (servant);
+ POA_CORBA::Container::create_enum_skel (
+ server_request,
+ servant_upcall,
+ impl
+ ACE_ENV_ARG_PARAMETER
+ );
+}
+
+// TAO_IDL - Generated from
+// be\be_interface.cpp:1955
+
+ACE_INLINE
+void
+POA_CORBA::ComponentIR::ModuleDef::create_alias_skel (
+ TAO_ServerRequest & server_request,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL
+ )
+{
+ POA_CORBA::Container * const impl = static_cast<POA_CORBA::ComponentIR::ModuleDef *> (servant);
+ POA_CORBA::Container::create_alias_skel (
+ server_request,
+ servant_upcall,
+ impl
+ ACE_ENV_ARG_PARAMETER
+ );
+}
+
+// TAO_IDL - Generated from
+// be\be_interface.cpp:1955
+
+ACE_INLINE
+void
+POA_CORBA::ComponentIR::ModuleDef::create_interface_skel (
+ TAO_ServerRequest & server_request,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL
+ )
+{
+ POA_CORBA::Container * const impl = static_cast<POA_CORBA::ComponentIR::ModuleDef *> (servant);
+ POA_CORBA::Container::create_interface_skel (
+ server_request,
+ servant_upcall,
+ impl
+ ACE_ENV_ARG_PARAMETER
+ );
+}
+
+// TAO_IDL - Generated from
+// be\be_interface.cpp:1955
+
+ACE_INLINE
+void
+POA_CORBA::ComponentIR::ModuleDef::create_value_skel (
+ TAO_ServerRequest & server_request,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL
+ )
+{
+ POA_CORBA::Container * const impl = static_cast<POA_CORBA::ComponentIR::ModuleDef *> (servant);
+ POA_CORBA::Container::create_value_skel (
+ server_request,
+ servant_upcall,
+ impl
+ ACE_ENV_ARG_PARAMETER
+ );
+}
+
+// TAO_IDL - Generated from
+// be\be_interface.cpp:1955
+
+ACE_INLINE
+void
+POA_CORBA::ComponentIR::ModuleDef::create_value_box_skel (
+ TAO_ServerRequest & server_request,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL
+ )
+{
+ POA_CORBA::Container * const impl = static_cast<POA_CORBA::ComponentIR::ModuleDef *> (servant);
+ POA_CORBA::Container::create_value_box_skel (
+ server_request,
+ servant_upcall,
+ impl
+ ACE_ENV_ARG_PARAMETER
+ );
+}
+
+// TAO_IDL - Generated from
+// be\be_interface.cpp:1955
+
+ACE_INLINE
+void
+POA_CORBA::ComponentIR::ModuleDef::create_exception_skel (
+ TAO_ServerRequest & server_request,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL
+ )
+{
+ POA_CORBA::Container * const impl = static_cast<POA_CORBA::ComponentIR::ModuleDef *> (servant);
+ POA_CORBA::Container::create_exception_skel (
+ server_request,
+ servant_upcall,
+ impl
+ ACE_ENV_ARG_PARAMETER
+ );
+}
+
+// TAO_IDL - Generated from
+// be\be_interface.cpp:1955
+
+ACE_INLINE
+void
+POA_CORBA::ComponentIR::ModuleDef::create_native_skel (
+ TAO_ServerRequest & server_request,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL
+ )
+{
+ POA_CORBA::Container * const impl = static_cast<POA_CORBA::ComponentIR::ModuleDef *> (servant);
+ POA_CORBA::Container::create_native_skel (
+ server_request,
+ servant_upcall,
+ impl
+ ACE_ENV_ARG_PARAMETER
+ );
+}
+
+// TAO_IDL - Generated from
+// be\be_interface.cpp:1955
+
+ACE_INLINE
+void
+POA_CORBA::ComponentIR::ModuleDef::create_abstract_interface_skel (
+ TAO_ServerRequest & server_request,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL
+ )
+{
+ POA_CORBA::Container * const impl = static_cast<POA_CORBA::ComponentIR::ModuleDef *> (servant);
+ POA_CORBA::Container::create_abstract_interface_skel (
+ server_request,
+ servant_upcall,
+ impl
+ ACE_ENV_ARG_PARAMETER
+ );
+}
+
+// TAO_IDL - Generated from
+// be\be_interface.cpp:1955
+
+ACE_INLINE
+void
+POA_CORBA::ComponentIR::ModuleDef::create_local_interface_skel (
+ TAO_ServerRequest & server_request,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL
+ )
+{
+ POA_CORBA::Container * const impl = static_cast<POA_CORBA::ComponentIR::ModuleDef *> (servant);
+ POA_CORBA::Container::create_local_interface_skel (
+ server_request,
+ servant_upcall,
+ impl
+ ACE_ENV_ARG_PARAMETER
+ );
+}
+
+// TAO_IDL - Generated from
+// be\be_interface.cpp:1955
+
+ACE_INLINE
+void
+POA_CORBA::ComponentIR::ModuleDef::create_ext_value_skel (
+ TAO_ServerRequest & server_request,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL
+ )
+{
+ POA_CORBA::Container * const impl = static_cast<POA_CORBA::ComponentIR::ModuleDef *> (servant);
+ POA_CORBA::Container::create_ext_value_skel (
+ server_request,
+ servant_upcall,
+ impl
+ ACE_ENV_ARG_PARAMETER
+ );
+}
+
+ACE_INLINE
+void
+POA_CORBA::ComponentIR::ModuleDef::_get_id_skel (
+ TAO_ServerRequest & server_request,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL
+ )
+{
+ POA_CORBA::Contained * const impl = static_cast<POA_CORBA::ComponentIR::ModuleDef *> (servant);
+ POA_CORBA::Contained::_get_id_skel (
+ server_request,
+ servant_upcall,
+ impl
+ ACE_ENV_ARG_PARAMETER
+ );
+}
+
+ACE_INLINE
+void
+POA_CORBA::ComponentIR::ModuleDef::_set_id_skel (
+ TAO_ServerRequest & server_request,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL
+ )
+{
+ POA_CORBA::Contained * const impl = static_cast<POA_CORBA::ComponentIR::ModuleDef *> (servant);
+ POA_CORBA::Contained::_set_id_skel (
+ server_request,
+ servant_upcall,
+ impl
+ ACE_ENV_ARG_PARAMETER
+ );
+}
+
+ACE_INLINE
+void
+POA_CORBA::ComponentIR::ModuleDef::_get_name_skel (
+ TAO_ServerRequest & server_request,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL
+ )
+{
+ POA_CORBA::Contained * const impl = static_cast<POA_CORBA::ComponentIR::ModuleDef *> (servant);
+ POA_CORBA::Contained::_get_name_skel (
+ server_request,
+ servant_upcall,
+ impl
+ ACE_ENV_ARG_PARAMETER
+ );
+}
+
+ACE_INLINE
+void
+POA_CORBA::ComponentIR::ModuleDef::_set_name_skel (
+ TAO_ServerRequest & server_request,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL
+ )
+{
+ POA_CORBA::Contained * const impl = static_cast<POA_CORBA::ComponentIR::ModuleDef *> (servant);
+ POA_CORBA::Contained::_set_name_skel (
+ server_request,
+ servant_upcall,
+ impl
+ ACE_ENV_ARG_PARAMETER
+ );
+}
+
+ACE_INLINE
+void
+POA_CORBA::ComponentIR::ModuleDef::_get_version_skel (
+ TAO_ServerRequest & server_request,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL
+ )
+{
+ POA_CORBA::Contained * const impl = static_cast<POA_CORBA::ComponentIR::ModuleDef *> (servant);
+ POA_CORBA::Contained::_get_version_skel (
+ server_request,
+ servant_upcall,
+ impl
+ ACE_ENV_ARG_PARAMETER
+ );
+}
+
+ACE_INLINE
+void
+POA_CORBA::ComponentIR::ModuleDef::_set_version_skel (
+ TAO_ServerRequest & server_request,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL
+ )
+{
+ POA_CORBA::Contained * const impl = static_cast<POA_CORBA::ComponentIR::ModuleDef *> (servant);
+ POA_CORBA::Contained::_set_version_skel (
+ server_request,
+ servant_upcall,
+ impl
+ ACE_ENV_ARG_PARAMETER
+ );
+}
+
+ACE_INLINE
+void
+POA_CORBA::ComponentIR::ModuleDef::_get_defined_in_skel (
+ TAO_ServerRequest & server_request,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL
+ )
+{
+ POA_CORBA::Contained * const impl = static_cast<POA_CORBA::ComponentIR::ModuleDef *> (servant);
+ POA_CORBA::Contained::_get_defined_in_skel (
+ server_request,
+ servant_upcall,
+ impl
+ ACE_ENV_ARG_PARAMETER
+ );
+}
+
+ACE_INLINE
+void
+POA_CORBA::ComponentIR::ModuleDef::_get_absolute_name_skel (
+ TAO_ServerRequest & server_request,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL
+ )
+{
+ POA_CORBA::Contained * const impl = static_cast<POA_CORBA::ComponentIR::ModuleDef *> (servant);
+ POA_CORBA::Contained::_get_absolute_name_skel (
+ server_request,
+ servant_upcall,
+ impl
+ ACE_ENV_ARG_PARAMETER
+ );
+}
+
+ACE_INLINE
+void
+POA_CORBA::ComponentIR::ModuleDef::_get_containing_repository_skel (
+ TAO_ServerRequest & server_request,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL
+ )
+{
+ POA_CORBA::Contained * const impl = static_cast<POA_CORBA::ComponentIR::ModuleDef *> (servant);
+ POA_CORBA::Contained::_get_containing_repository_skel (
+ server_request,
+ servant_upcall,
+ impl
+ ACE_ENV_ARG_PARAMETER
+ );
+}
+
+// TAO_IDL - Generated from
+// be\be_interface.cpp:1955
+
+ACE_INLINE
+void
+POA_CORBA::ComponentIR::ModuleDef::describe_skel (
+ TAO_ServerRequest & server_request,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL
+ )
+{
+ POA_CORBA::Contained * const impl = static_cast<POA_CORBA::ComponentIR::ModuleDef *> (servant);
+ POA_CORBA::Contained::describe_skel (
+ server_request,
+ servant_upcall,
+ impl
+ ACE_ENV_ARG_PARAMETER
+ );
+}
+
+// TAO_IDL - Generated from
+// be\be_interface.cpp:1955
+
+ACE_INLINE
+void
+POA_CORBA::ComponentIR::ModuleDef::move_skel (
+ TAO_ServerRequest & server_request,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL
+ )
+{
+ POA_CORBA::Contained * const impl = static_cast<POA_CORBA::ComponentIR::ModuleDef *> (servant);
+ POA_CORBA::Contained::move_skel (
+ server_request,
+ servant_upcall,
+ impl
+ ACE_ENV_ARG_PARAMETER
+ );
+}
+
+// TAO_IDL - Generated from
+// be\be_interface.cpp:1955
+
+ACE_INLINE
+void
+POA_CORBA::ComponentIR::ModuleDef::create_component_skel (
+ TAO_ServerRequest & server_request,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL
+ )
+{
+ POA_CORBA::ComponentIR::Container * const impl = static_cast<POA_CORBA::ComponentIR::ModuleDef *> (servant);
+ POA_CORBA::ComponentIR::Container::create_component_skel (
+ server_request,
+ servant_upcall,
+ impl
+ ACE_ENV_ARG_PARAMETER
+ );
+}
+
+// TAO_IDL - Generated from
+// be\be_interface.cpp:1955
+
+ACE_INLINE
+void
+POA_CORBA::ComponentIR::ModuleDef::create_home_skel (
+ TAO_ServerRequest & server_request,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL
+ )
+{
+ POA_CORBA::ComponentIR::Container * const impl = static_cast<POA_CORBA::ComponentIR::ModuleDef *> (servant);
+ POA_CORBA::ComponentIR::Container::create_home_skel (
+ server_request,
+ servant_upcall,
+ impl
+ ACE_ENV_ARG_PARAMETER
+ );
+}
+
+// TAO_IDL - Generated from
+// be\be_interface.cpp:1955
+
+ACE_INLINE
+void
+POA_CORBA::ComponentIR::ModuleDef::create_event_skel (
+ TAO_ServerRequest & server_request,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL
+ )
+{
+ POA_CORBA::ComponentIR::Container * const impl = static_cast<POA_CORBA::ComponentIR::ModuleDef *> (servant);
+ POA_CORBA::ComponentIR::Container::create_event_skel (
+ server_request,
+ servant_upcall,
+ impl
+ ACE_ENV_ARG_PARAMETER
+ );
+}
+
+ACE_INLINE
+void
+POA_CORBA::ComponentIR::Repository::_get_def_kind_skel (
+ TAO_ServerRequest & server_request,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL
+ )
+{
+ POA_CORBA::IRObject * const impl = static_cast<POA_CORBA::ComponentIR::Repository *> (servant);
+ POA_CORBA::IRObject::_get_def_kind_skel (
+ server_request,
+ servant_upcall,
+ impl
+ ACE_ENV_ARG_PARAMETER
+ );
+}
+
+// TAO_IDL - Generated from
+// be\be_interface.cpp:1955
+
+ACE_INLINE
+void
+POA_CORBA::ComponentIR::Repository::destroy_skel (
+ TAO_ServerRequest & server_request,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL
+ )
+{
+ POA_CORBA::IRObject * const impl = static_cast<POA_CORBA::ComponentIR::Repository *> (servant);
+ POA_CORBA::IRObject::destroy_skel (
+ server_request,
+ servant_upcall,
+ impl
+ ACE_ENV_ARG_PARAMETER
+ );
+}
+
+// TAO_IDL - Generated from
+// be\be_interface.cpp:1955
+
+ACE_INLINE
+void
+POA_CORBA::ComponentIR::Repository::lookup_skel (
+ TAO_ServerRequest & server_request,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL
+ )
+{
+ POA_CORBA::Container * const impl = static_cast<POA_CORBA::ComponentIR::Repository *> (servant);
+ POA_CORBA::Container::lookup_skel (
+ server_request,
+ servant_upcall,
+ impl
+ ACE_ENV_ARG_PARAMETER
+ );
+}
+
+// TAO_IDL - Generated from
+// be\be_interface.cpp:1955
+
+ACE_INLINE
+void
+POA_CORBA::ComponentIR::Repository::contents_skel (
+ TAO_ServerRequest & server_request,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL
+ )
+{
+ POA_CORBA::Container * const impl = static_cast<POA_CORBA::ComponentIR::Repository *> (servant);
+ POA_CORBA::Container::contents_skel (
+ server_request,
+ servant_upcall,
+ impl
+ ACE_ENV_ARG_PARAMETER
+ );
+}
+
+// TAO_IDL - Generated from
+// be\be_interface.cpp:1955
+
+ACE_INLINE
+void
+POA_CORBA::ComponentIR::Repository::lookup_name_skel (
+ TAO_ServerRequest & server_request,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL
+ )
+{
+ POA_CORBA::Container * const impl = static_cast<POA_CORBA::ComponentIR::Repository *> (servant);
+ POA_CORBA::Container::lookup_name_skel (
+ server_request,
+ servant_upcall,
+ impl
+ ACE_ENV_ARG_PARAMETER
+ );
+}
+
+// TAO_IDL - Generated from
+// be\be_interface.cpp:1955
+
+ACE_INLINE
+void
+POA_CORBA::ComponentIR::Repository::describe_contents_skel (
+ TAO_ServerRequest & server_request,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL
+ )
+{
+ POA_CORBA::Container * const impl = static_cast<POA_CORBA::ComponentIR::Repository *> (servant);
+ POA_CORBA::Container::describe_contents_skel (
+ server_request,
+ servant_upcall,
+ impl
+ ACE_ENV_ARG_PARAMETER
+ );
+}
+
+// TAO_IDL - Generated from
+// be\be_interface.cpp:1955
+
+ACE_INLINE
+void
+POA_CORBA::ComponentIR::Repository::create_module_skel (
+ TAO_ServerRequest & server_request,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL
+ )
+{
+ POA_CORBA::Container * const impl = static_cast<POA_CORBA::ComponentIR::Repository *> (servant);
+ POA_CORBA::Container::create_module_skel (
+ server_request,
+ servant_upcall,
+ impl
+ ACE_ENV_ARG_PARAMETER
+ );
+}
+
+// TAO_IDL - Generated from
+// be\be_interface.cpp:1955
+
+ACE_INLINE
+void
+POA_CORBA::ComponentIR::Repository::create_constant_skel (
+ TAO_ServerRequest & server_request,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL
+ )
+{
+ POA_CORBA::Container * const impl = static_cast<POA_CORBA::ComponentIR::Repository *> (servant);
+ POA_CORBA::Container::create_constant_skel (
+ server_request,
+ servant_upcall,
+ impl
+ ACE_ENV_ARG_PARAMETER
+ );
+}
+
+// TAO_IDL - Generated from
+// be\be_interface.cpp:1955
+
+ACE_INLINE
+void
+POA_CORBA::ComponentIR::Repository::create_struct_skel (
+ TAO_ServerRequest & server_request,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL
+ )
+{
+ POA_CORBA::Container * const impl = static_cast<POA_CORBA::ComponentIR::Repository *> (servant);
+ POA_CORBA::Container::create_struct_skel (
+ server_request,
+ servant_upcall,
+ impl
+ ACE_ENV_ARG_PARAMETER
+ );
+}
+
+// TAO_IDL - Generated from
+// be\be_interface.cpp:1955
+
+ACE_INLINE
+void
+POA_CORBA::ComponentIR::Repository::create_union_skel (
+ TAO_ServerRequest & server_request,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL
+ )
+{
+ POA_CORBA::Container * const impl = static_cast<POA_CORBA::ComponentIR::Repository *> (servant);
+ POA_CORBA::Container::create_union_skel (
+ server_request,
+ servant_upcall,
+ impl
+ ACE_ENV_ARG_PARAMETER
+ );
+}
+
+// TAO_IDL - Generated from
+// be\be_interface.cpp:1955
+
+ACE_INLINE
+void
+POA_CORBA::ComponentIR::Repository::create_enum_skel (
+ TAO_ServerRequest & server_request,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL
+ )
+{
+ POA_CORBA::Container * const impl = static_cast<POA_CORBA::ComponentIR::Repository *> (servant);
+ POA_CORBA::Container::create_enum_skel (
+ server_request,
+ servant_upcall,
+ impl
+ ACE_ENV_ARG_PARAMETER
+ );
+}
+
+// TAO_IDL - Generated from
+// be\be_interface.cpp:1955
+
+ACE_INLINE
+void
+POA_CORBA::ComponentIR::Repository::create_alias_skel (
+ TAO_ServerRequest & server_request,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL
+ )
+{
+ POA_CORBA::Container * const impl = static_cast<POA_CORBA::ComponentIR::Repository *> (servant);
+ POA_CORBA::Container::create_alias_skel (
+ server_request,
+ servant_upcall,
+ impl
+ ACE_ENV_ARG_PARAMETER
+ );
+}
+
+// TAO_IDL - Generated from
+// be\be_interface.cpp:1955
+
+ACE_INLINE
+void
+POA_CORBA::ComponentIR::Repository::create_interface_skel (
+ TAO_ServerRequest & server_request,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL
+ )
+{
+ POA_CORBA::Container * const impl = static_cast<POA_CORBA::ComponentIR::Repository *> (servant);
+ POA_CORBA::Container::create_interface_skel (
+ server_request,
+ servant_upcall,
+ impl
+ ACE_ENV_ARG_PARAMETER
+ );
+}
+
+// TAO_IDL - Generated from
+// be\be_interface.cpp:1955
+
+ACE_INLINE
+void
+POA_CORBA::ComponentIR::Repository::create_value_skel (
+ TAO_ServerRequest & server_request,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL
+ )
+{
+ POA_CORBA::Container * const impl = static_cast<POA_CORBA::ComponentIR::Repository *> (servant);
+ POA_CORBA::Container::create_value_skel (
+ server_request,
+ servant_upcall,
+ impl
+ ACE_ENV_ARG_PARAMETER
+ );
+}
+
+// TAO_IDL - Generated from
+// be\be_interface.cpp:1955
+
+ACE_INLINE
+void
+POA_CORBA::ComponentIR::Repository::create_value_box_skel (
+ TAO_ServerRequest & server_request,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL
+ )
+{
+ POA_CORBA::Container * const impl = static_cast<POA_CORBA::ComponentIR::Repository *> (servant);
+ POA_CORBA::Container::create_value_box_skel (
+ server_request,
+ servant_upcall,
+ impl
+ ACE_ENV_ARG_PARAMETER
+ );
+}
+
+// TAO_IDL - Generated from
+// be\be_interface.cpp:1955
+
+ACE_INLINE
+void
+POA_CORBA::ComponentIR::Repository::create_exception_skel (
+ TAO_ServerRequest & server_request,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL
+ )
+{
+ POA_CORBA::Container * const impl = static_cast<POA_CORBA::ComponentIR::Repository *> (servant);
+ POA_CORBA::Container::create_exception_skel (
+ server_request,
+ servant_upcall,
+ impl
+ ACE_ENV_ARG_PARAMETER
+ );
+}
+
+// TAO_IDL - Generated from
+// be\be_interface.cpp:1955
+
+ACE_INLINE
+void
+POA_CORBA::ComponentIR::Repository::create_native_skel (
+ TAO_ServerRequest & server_request,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL
+ )
+{
+ POA_CORBA::Container * const impl = static_cast<POA_CORBA::ComponentIR::Repository *> (servant);
+ POA_CORBA::Container::create_native_skel (
+ server_request,
+ servant_upcall,
+ impl
+ ACE_ENV_ARG_PARAMETER
+ );
+}
+
+// TAO_IDL - Generated from
+// be\be_interface.cpp:1955
+
+ACE_INLINE
+void
+POA_CORBA::ComponentIR::Repository::create_abstract_interface_skel (
+ TAO_ServerRequest & server_request,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL
+ )
+{
+ POA_CORBA::Container * const impl = static_cast<POA_CORBA::ComponentIR::Repository *> (servant);
+ POA_CORBA::Container::create_abstract_interface_skel (
+ server_request,
+ servant_upcall,
+ impl
+ ACE_ENV_ARG_PARAMETER
+ );
+}
+
+// TAO_IDL - Generated from
+// be\be_interface.cpp:1955
+
+ACE_INLINE
+void
+POA_CORBA::ComponentIR::Repository::create_local_interface_skel (
+ TAO_ServerRequest & server_request,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL
+ )
+{
+ POA_CORBA::Container * const impl = static_cast<POA_CORBA::ComponentIR::Repository *> (servant);
+ POA_CORBA::Container::create_local_interface_skel (
+ server_request,
+ servant_upcall,
+ impl
+ ACE_ENV_ARG_PARAMETER
+ );
+}
+
+// TAO_IDL - Generated from
+// be\be_interface.cpp:1955
+
+ACE_INLINE
+void
+POA_CORBA::ComponentIR::Repository::create_ext_value_skel (
+ TAO_ServerRequest & server_request,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL
+ )
+{
+ POA_CORBA::Container * const impl = static_cast<POA_CORBA::ComponentIR::Repository *> (servant);
+ POA_CORBA::Container::create_ext_value_skel (
+ server_request,
+ servant_upcall,
+ impl
+ ACE_ENV_ARG_PARAMETER
+ );
+}
+
+// TAO_IDL - Generated from
+// be\be_interface.cpp:1955
+
+ACE_INLINE
+void
+POA_CORBA::ComponentIR::Repository::lookup_id_skel (
+ TAO_ServerRequest & server_request,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL
+ )
+{
+ POA_CORBA::Repository * const impl = static_cast<POA_CORBA::ComponentIR::Repository *> (servant);
+ POA_CORBA::Repository::lookup_id_skel (
+ server_request,
+ servant_upcall,
+ impl
+ ACE_ENV_ARG_PARAMETER
+ );
+}
+
+// TAO_IDL - Generated from
+// be\be_interface.cpp:1955
+
+ACE_INLINE
+void
+POA_CORBA::ComponentIR::Repository::get_canonical_typecode_skel (
+ TAO_ServerRequest & server_request,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL
+ )
+{
+ POA_CORBA::Repository * const impl = static_cast<POA_CORBA::ComponentIR::Repository *> (servant);
+ POA_CORBA::Repository::get_canonical_typecode_skel (
+ server_request,
+ servant_upcall,
+ impl
+ ACE_ENV_ARG_PARAMETER
+ );
+}
+
+// TAO_IDL - Generated from
+// be\be_interface.cpp:1955
+
+ACE_INLINE
+void
+POA_CORBA::ComponentIR::Repository::get_primitive_skel (
+ TAO_ServerRequest & server_request,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL
+ )
+{
+ POA_CORBA::Repository * const impl = static_cast<POA_CORBA::ComponentIR::Repository *> (servant);
+ POA_CORBA::Repository::get_primitive_skel (
+ server_request,
+ servant_upcall,
+ impl
+ ACE_ENV_ARG_PARAMETER
+ );
+}
+
+// TAO_IDL - Generated from
+// be\be_interface.cpp:1955
+
+ACE_INLINE
+void
+POA_CORBA::ComponentIR::Repository::create_string_skel (
+ TAO_ServerRequest & server_request,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL
+ )
+{
+ POA_CORBA::Repository * const impl = static_cast<POA_CORBA::ComponentIR::Repository *> (servant);
+ POA_CORBA::Repository::create_string_skel (
+ server_request,
+ servant_upcall,
+ impl
+ ACE_ENV_ARG_PARAMETER
+ );
+}
+
+// TAO_IDL - Generated from
+// be\be_interface.cpp:1955
+
+ACE_INLINE
+void
+POA_CORBA::ComponentIR::Repository::create_wstring_skel (
+ TAO_ServerRequest & server_request,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL
+ )
+{
+ POA_CORBA::Repository * const impl = static_cast<POA_CORBA::ComponentIR::Repository *> (servant);
+ POA_CORBA::Repository::create_wstring_skel (
+ server_request,
+ servant_upcall,
+ impl
+ ACE_ENV_ARG_PARAMETER
+ );
+}
+
+// TAO_IDL - Generated from
+// be\be_interface.cpp:1955
+
+ACE_INLINE
+void
+POA_CORBA::ComponentIR::Repository::create_sequence_skel (
+ TAO_ServerRequest & server_request,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL
+ )
+{
+ POA_CORBA::Repository * const impl = static_cast<POA_CORBA::ComponentIR::Repository *> (servant);
+ POA_CORBA::Repository::create_sequence_skel (
+ server_request,
+ servant_upcall,
+ impl
+ ACE_ENV_ARG_PARAMETER
+ );
+}
+
+// TAO_IDL - Generated from
+// be\be_interface.cpp:1955
+
+ACE_INLINE
+void
+POA_CORBA::ComponentIR::Repository::create_array_skel (
+ TAO_ServerRequest & server_request,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL
+ )
+{
+ POA_CORBA::Repository * const impl = static_cast<POA_CORBA::ComponentIR::Repository *> (servant);
+ POA_CORBA::Repository::create_array_skel (
+ server_request,
+ servant_upcall,
+ impl
+ ACE_ENV_ARG_PARAMETER
+ );
+}
+
+// TAO_IDL - Generated from
+// be\be_interface.cpp:1955
+
+ACE_INLINE
+void
+POA_CORBA::ComponentIR::Repository::create_fixed_skel (
+ TAO_ServerRequest & server_request,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL
+ )
+{
+ POA_CORBA::Repository * const impl = static_cast<POA_CORBA::ComponentIR::Repository *> (servant);
+ POA_CORBA::Repository::create_fixed_skel (
+ server_request,
+ servant_upcall,
+ impl
+ ACE_ENV_ARG_PARAMETER
+ );
+}
+
+// TAO_IDL - Generated from
+// be\be_interface.cpp:1955
+
+ACE_INLINE
+void
+POA_CORBA::ComponentIR::Repository::create_component_skel (
+ TAO_ServerRequest & server_request,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL
+ )
+{
+ POA_CORBA::ComponentIR::Container * const impl = static_cast<POA_CORBA::ComponentIR::Repository *> (servant);
+ POA_CORBA::ComponentIR::Container::create_component_skel (
+ server_request,
+ servant_upcall,
+ impl
+ ACE_ENV_ARG_PARAMETER
+ );
+}
+
+// TAO_IDL - Generated from
+// be\be_interface.cpp:1955
+
+ACE_INLINE
+void
+POA_CORBA::ComponentIR::Repository::create_home_skel (
+ TAO_ServerRequest & server_request,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL
+ )
+{
+ POA_CORBA::ComponentIR::Container * const impl = static_cast<POA_CORBA::ComponentIR::Repository *> (servant);
+ POA_CORBA::ComponentIR::Container::create_home_skel (
+ server_request,
+ servant_upcall,
+ impl
+ ACE_ENV_ARG_PARAMETER
+ );
+}
+
+// TAO_IDL - Generated from
+// be\be_interface.cpp:1955
+
+ACE_INLINE
+void
+POA_CORBA::ComponentIR::Repository::create_event_skel (
+ TAO_ServerRequest & server_request,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL
+ )
+{
+ POA_CORBA::ComponentIR::Container * const impl = static_cast<POA_CORBA::ComponentIR::Repository *> (servant);
+ POA_CORBA::ComponentIR::Container::create_event_skel (
+ server_request,
+ servant_upcall,
+ impl
+ ACE_ENV_ARG_PARAMETER
+ );
+}
+
+ACE_INLINE
+void
+POA_CORBA::ComponentIR::ProvidesDef::_get_def_kind_skel (
+ TAO_ServerRequest & server_request,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL
+ )
+{
+ POA_CORBA::IRObject * const impl = static_cast<POA_CORBA::ComponentIR::ProvidesDef *> (servant);
+ POA_CORBA::IRObject::_get_def_kind_skel (
+ server_request,
+ servant_upcall,
+ impl
+ ACE_ENV_ARG_PARAMETER
+ );
+}
+
+// TAO_IDL - Generated from
+// be\be_interface.cpp:1955
+
+ACE_INLINE
+void
+POA_CORBA::ComponentIR::ProvidesDef::destroy_skel (
+ TAO_ServerRequest & server_request,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL
+ )
+{
+ POA_CORBA::IRObject * const impl = static_cast<POA_CORBA::ComponentIR::ProvidesDef *> (servant);
+ POA_CORBA::IRObject::destroy_skel (
+ server_request,
+ servant_upcall,
+ impl
+ ACE_ENV_ARG_PARAMETER
+ );
+}
+
+ACE_INLINE
+void
+POA_CORBA::ComponentIR::ProvidesDef::_get_id_skel (
+ TAO_ServerRequest & server_request,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL
+ )
+{
+ POA_CORBA::Contained * const impl = static_cast<POA_CORBA::ComponentIR::ProvidesDef *> (servant);
+ POA_CORBA::Contained::_get_id_skel (
+ server_request,
+ servant_upcall,
+ impl
+ ACE_ENV_ARG_PARAMETER
+ );
+}
+
+ACE_INLINE
+void
+POA_CORBA::ComponentIR::ProvidesDef::_set_id_skel (
+ TAO_ServerRequest & server_request,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL
+ )
+{
+ POA_CORBA::Contained * const impl = static_cast<POA_CORBA::ComponentIR::ProvidesDef *> (servant);
+ POA_CORBA::Contained::_set_id_skel (
+ server_request,
+ servant_upcall,
+ impl
+ ACE_ENV_ARG_PARAMETER
+ );
+}
+
+ACE_INLINE
+void
+POA_CORBA::ComponentIR::ProvidesDef::_get_name_skel (
+ TAO_ServerRequest & server_request,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL
+ )
+{
+ POA_CORBA::Contained * const impl = static_cast<POA_CORBA::ComponentIR::ProvidesDef *> (servant);
+ POA_CORBA::Contained::_get_name_skel (
+ server_request,
+ servant_upcall,
+ impl
+ ACE_ENV_ARG_PARAMETER
+ );
+}
+
+ACE_INLINE
+void
+POA_CORBA::ComponentIR::ProvidesDef::_set_name_skel (
+ TAO_ServerRequest & server_request,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL
+ )
+{
+ POA_CORBA::Contained * const impl = static_cast<POA_CORBA::ComponentIR::ProvidesDef *> (servant);
+ POA_CORBA::Contained::_set_name_skel (
+ server_request,
+ servant_upcall,
+ impl
+ ACE_ENV_ARG_PARAMETER
+ );
+}
+
+ACE_INLINE
+void
+POA_CORBA::ComponentIR::ProvidesDef::_get_version_skel (
+ TAO_ServerRequest & server_request,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL
+ )
+{
+ POA_CORBA::Contained * const impl = static_cast<POA_CORBA::ComponentIR::ProvidesDef *> (servant);
+ POA_CORBA::Contained::_get_version_skel (
+ server_request,
+ servant_upcall,
+ impl
+ ACE_ENV_ARG_PARAMETER
+ );
+}
+
+ACE_INLINE
+void
+POA_CORBA::ComponentIR::ProvidesDef::_set_version_skel (
+ TAO_ServerRequest & server_request,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL
+ )
+{
+ POA_CORBA::Contained * const impl = static_cast<POA_CORBA::ComponentIR::ProvidesDef *> (servant);
+ POA_CORBA::Contained::_set_version_skel (
+ server_request,
+ servant_upcall,
+ impl
+ ACE_ENV_ARG_PARAMETER
+ );
+}
+
+ACE_INLINE
+void
+POA_CORBA::ComponentIR::ProvidesDef::_get_defined_in_skel (
+ TAO_ServerRequest & server_request,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL
+ )
+{
+ POA_CORBA::Contained * const impl = static_cast<POA_CORBA::ComponentIR::ProvidesDef *> (servant);
+ POA_CORBA::Contained::_get_defined_in_skel (
+ server_request,
+ servant_upcall,
+ impl
+ ACE_ENV_ARG_PARAMETER
+ );
+}
+
+ACE_INLINE
+void
+POA_CORBA::ComponentIR::ProvidesDef::_get_absolute_name_skel (
+ TAO_ServerRequest & server_request,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL
+ )
+{
+ POA_CORBA::Contained * const impl = static_cast<POA_CORBA::ComponentIR::ProvidesDef *> (servant);
+ POA_CORBA::Contained::_get_absolute_name_skel (
+ server_request,
+ servant_upcall,
+ impl
+ ACE_ENV_ARG_PARAMETER
+ );
+}
+
+ACE_INLINE
+void
+POA_CORBA::ComponentIR::ProvidesDef::_get_containing_repository_skel (
+ TAO_ServerRequest & server_request,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL
+ )
+{
+ POA_CORBA::Contained * const impl = static_cast<POA_CORBA::ComponentIR::ProvidesDef *> (servant);
+ POA_CORBA::Contained::_get_containing_repository_skel (
+ server_request,
+ servant_upcall,
+ impl
+ ACE_ENV_ARG_PARAMETER
+ );
+}
+
+// TAO_IDL - Generated from
+// be\be_interface.cpp:1955
+
+ACE_INLINE
+void
+POA_CORBA::ComponentIR::ProvidesDef::describe_skel (
+ TAO_ServerRequest & server_request,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL
+ )
+{
+ POA_CORBA::Contained * const impl = static_cast<POA_CORBA::ComponentIR::ProvidesDef *> (servant);
+ POA_CORBA::Contained::describe_skel (
+ server_request,
+ servant_upcall,
+ impl
+ ACE_ENV_ARG_PARAMETER
+ );
+}
+
+// TAO_IDL - Generated from
+// be\be_interface.cpp:1955
+
+ACE_INLINE
+void
+POA_CORBA::ComponentIR::ProvidesDef::move_skel (
+ TAO_ServerRequest & server_request,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL
+ )
+{
+ POA_CORBA::Contained * const impl = static_cast<POA_CORBA::ComponentIR::ProvidesDef *> (servant);
+ POA_CORBA::Contained::move_skel (
+ server_request,
+ servant_upcall,
+ impl
+ ACE_ENV_ARG_PARAMETER
+ );
+}
+
+ACE_INLINE
+void
+POA_CORBA::ComponentIR::UsesDef::_get_def_kind_skel (
+ TAO_ServerRequest & server_request,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL
+ )
+{
+ POA_CORBA::IRObject * const impl = static_cast<POA_CORBA::ComponentIR::UsesDef *> (servant);
+ POA_CORBA::IRObject::_get_def_kind_skel (
+ server_request,
+ servant_upcall,
+ impl
+ ACE_ENV_ARG_PARAMETER
+ );
+}
+
+// TAO_IDL - Generated from
+// be\be_interface.cpp:1955
+
+ACE_INLINE
+void
+POA_CORBA::ComponentIR::UsesDef::destroy_skel (
+ TAO_ServerRequest & server_request,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL
+ )
+{
+ POA_CORBA::IRObject * const impl = static_cast<POA_CORBA::ComponentIR::UsesDef *> (servant);
+ POA_CORBA::IRObject::destroy_skel (
+ server_request,
+ servant_upcall,
+ impl
+ ACE_ENV_ARG_PARAMETER
+ );
+}
+
+ACE_INLINE
+void
+POA_CORBA::ComponentIR::UsesDef::_get_id_skel (
+ TAO_ServerRequest & server_request,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL
+ )
+{
+ POA_CORBA::Contained * const impl = static_cast<POA_CORBA::ComponentIR::UsesDef *> (servant);
+ POA_CORBA::Contained::_get_id_skel (
+ server_request,
+ servant_upcall,
+ impl
+ ACE_ENV_ARG_PARAMETER
+ );
+}
+
+ACE_INLINE
+void
+POA_CORBA::ComponentIR::UsesDef::_set_id_skel (
+ TAO_ServerRequest & server_request,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL
+ )
+{
+ POA_CORBA::Contained * const impl = static_cast<POA_CORBA::ComponentIR::UsesDef *> (servant);
+ POA_CORBA::Contained::_set_id_skel (
+ server_request,
+ servant_upcall,
+ impl
+ ACE_ENV_ARG_PARAMETER
+ );
+}
+
+ACE_INLINE
+void
+POA_CORBA::ComponentIR::UsesDef::_get_name_skel (
+ TAO_ServerRequest & server_request,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL
+ )
+{
+ POA_CORBA::Contained * const impl = static_cast<POA_CORBA::ComponentIR::UsesDef *> (servant);
+ POA_CORBA::Contained::_get_name_skel (
+ server_request,
+ servant_upcall,
+ impl
+ ACE_ENV_ARG_PARAMETER
+ );
+}
+
+ACE_INLINE
+void
+POA_CORBA::ComponentIR::UsesDef::_set_name_skel (
+ TAO_ServerRequest & server_request,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL
+ )
+{
+ POA_CORBA::Contained * const impl = static_cast<POA_CORBA::ComponentIR::UsesDef *> (servant);
+ POA_CORBA::Contained::_set_name_skel (
+ server_request,
+ servant_upcall,
+ impl
+ ACE_ENV_ARG_PARAMETER
+ );
+}
+
+ACE_INLINE
+void
+POA_CORBA::ComponentIR::UsesDef::_get_version_skel (
+ TAO_ServerRequest & server_request,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL
+ )
+{
+ POA_CORBA::Contained * const impl = static_cast<POA_CORBA::ComponentIR::UsesDef *> (servant);
+ POA_CORBA::Contained::_get_version_skel (
+ server_request,
+ servant_upcall,
+ impl
+ ACE_ENV_ARG_PARAMETER
+ );
+}
+
+ACE_INLINE
+void
+POA_CORBA::ComponentIR::UsesDef::_set_version_skel (
+ TAO_ServerRequest & server_request,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL
+ )
+{
+ POA_CORBA::Contained * const impl = static_cast<POA_CORBA::ComponentIR::UsesDef *> (servant);
+ POA_CORBA::Contained::_set_version_skel (
+ server_request,
+ servant_upcall,
+ impl
+ ACE_ENV_ARG_PARAMETER
+ );
+}
+
+ACE_INLINE
+void
+POA_CORBA::ComponentIR::UsesDef::_get_defined_in_skel (
+ TAO_ServerRequest & server_request,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL
+ )
+{
+ POA_CORBA::Contained * const impl = static_cast<POA_CORBA::ComponentIR::UsesDef *> (servant);
+ POA_CORBA::Contained::_get_defined_in_skel (
+ server_request,
+ servant_upcall,
+ impl
+ ACE_ENV_ARG_PARAMETER
+ );
+}
+
+ACE_INLINE
+void
+POA_CORBA::ComponentIR::UsesDef::_get_absolute_name_skel (
+ TAO_ServerRequest & server_request,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL
+ )
+{
+ POA_CORBA::Contained * const impl = static_cast<POA_CORBA::ComponentIR::UsesDef *> (servant);
+ POA_CORBA::Contained::_get_absolute_name_skel (
+ server_request,
+ servant_upcall,
+ impl
+ ACE_ENV_ARG_PARAMETER
+ );
+}
+
+ACE_INLINE
+void
+POA_CORBA::ComponentIR::UsesDef::_get_containing_repository_skel (
+ TAO_ServerRequest & server_request,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL
+ )
+{
+ POA_CORBA::Contained * const impl = static_cast<POA_CORBA::ComponentIR::UsesDef *> (servant);
+ POA_CORBA::Contained::_get_containing_repository_skel (
+ server_request,
+ servant_upcall,
+ impl
+ ACE_ENV_ARG_PARAMETER
+ );
+}
+
+// TAO_IDL - Generated from
+// be\be_interface.cpp:1955
+
+ACE_INLINE
+void
+POA_CORBA::ComponentIR::UsesDef::describe_skel (
+ TAO_ServerRequest & server_request,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL
+ )
+{
+ POA_CORBA::Contained * const impl = static_cast<POA_CORBA::ComponentIR::UsesDef *> (servant);
+ POA_CORBA::Contained::describe_skel (
+ server_request,
+ servant_upcall,
+ impl
+ ACE_ENV_ARG_PARAMETER
+ );
+}
+
+// TAO_IDL - Generated from
+// be\be_interface.cpp:1955
+
+ACE_INLINE
+void
+POA_CORBA::ComponentIR::UsesDef::move_skel (
+ TAO_ServerRequest & server_request,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL
+ )
+{
+ POA_CORBA::Contained * const impl = static_cast<POA_CORBA::ComponentIR::UsesDef *> (servant);
+ POA_CORBA::Contained::move_skel (
+ server_request,
+ servant_upcall,
+ impl
+ ACE_ENV_ARG_PARAMETER
+ );
+}
+
+ACE_INLINE
+void
+POA_CORBA::ComponentIR::EventPortDef::_get_def_kind_skel (
+ TAO_ServerRequest & server_request,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL
+ )
+{
+ POA_CORBA::IRObject * const impl = static_cast<POA_CORBA::ComponentIR::EventPortDef *> (servant);
+ POA_CORBA::IRObject::_get_def_kind_skel (
+ server_request,
+ servant_upcall,
+ impl
+ ACE_ENV_ARG_PARAMETER
+ );
+}
+
+// TAO_IDL - Generated from
+// be\be_interface.cpp:1955
+
+ACE_INLINE
+void
+POA_CORBA::ComponentIR::EventPortDef::destroy_skel (
+ TAO_ServerRequest & server_request,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL
+ )
+{
+ POA_CORBA::IRObject * const impl = static_cast<POA_CORBA::ComponentIR::EventPortDef *> (servant);
+ POA_CORBA::IRObject::destroy_skel (
+ server_request,
+ servant_upcall,
+ impl
+ ACE_ENV_ARG_PARAMETER
+ );
+}
+
+ACE_INLINE
+void
+POA_CORBA::ComponentIR::EventPortDef::_get_id_skel (
+ TAO_ServerRequest & server_request,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL
+ )
+{
+ POA_CORBA::Contained * const impl = static_cast<POA_CORBA::ComponentIR::EventPortDef *> (servant);
+ POA_CORBA::Contained::_get_id_skel (
+ server_request,
+ servant_upcall,
+ impl
+ ACE_ENV_ARG_PARAMETER
+ );
+}
+
+ACE_INLINE
+void
+POA_CORBA::ComponentIR::EventPortDef::_set_id_skel (
+ TAO_ServerRequest & server_request,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL
+ )
+{
+ POA_CORBA::Contained * const impl = static_cast<POA_CORBA::ComponentIR::EventPortDef *> (servant);
+ POA_CORBA::Contained::_set_id_skel (
+ server_request,
+ servant_upcall,
+ impl
+ ACE_ENV_ARG_PARAMETER
+ );
+}
+
+ACE_INLINE
+void
+POA_CORBA::ComponentIR::EventPortDef::_get_name_skel (
+ TAO_ServerRequest & server_request,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL
+ )
+{
+ POA_CORBA::Contained * const impl = static_cast<POA_CORBA::ComponentIR::EventPortDef *> (servant);
+ POA_CORBA::Contained::_get_name_skel (
+ server_request,
+ servant_upcall,
+ impl
+ ACE_ENV_ARG_PARAMETER
+ );
+}
+
+ACE_INLINE
+void
+POA_CORBA::ComponentIR::EventPortDef::_set_name_skel (
+ TAO_ServerRequest & server_request,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL
+ )
+{
+ POA_CORBA::Contained * const impl = static_cast<POA_CORBA::ComponentIR::EventPortDef *> (servant);
+ POA_CORBA::Contained::_set_name_skel (
+ server_request,
+ servant_upcall,
+ impl
+ ACE_ENV_ARG_PARAMETER
+ );
+}
+
+ACE_INLINE
+void
+POA_CORBA::ComponentIR::EventPortDef::_get_version_skel (
+ TAO_ServerRequest & server_request,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL
+ )
+{
+ POA_CORBA::Contained * const impl = static_cast<POA_CORBA::ComponentIR::EventPortDef *> (servant);
+ POA_CORBA::Contained::_get_version_skel (
+ server_request,
+ servant_upcall,
+ impl
+ ACE_ENV_ARG_PARAMETER
+ );
+}
+
+ACE_INLINE
+void
+POA_CORBA::ComponentIR::EventPortDef::_set_version_skel (
+ TAO_ServerRequest & server_request,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL
+ )
+{
+ POA_CORBA::Contained * const impl = static_cast<POA_CORBA::ComponentIR::EventPortDef *> (servant);
+ POA_CORBA::Contained::_set_version_skel (
+ server_request,
+ servant_upcall,
+ impl
+ ACE_ENV_ARG_PARAMETER
+ );
+}
+
+ACE_INLINE
+void
+POA_CORBA::ComponentIR::EventPortDef::_get_defined_in_skel (
+ TAO_ServerRequest & server_request,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL
+ )
+{
+ POA_CORBA::Contained * const impl = static_cast<POA_CORBA::ComponentIR::EventPortDef *> (servant);
+ POA_CORBA::Contained::_get_defined_in_skel (
+ server_request,
+ servant_upcall,
+ impl
+ ACE_ENV_ARG_PARAMETER
+ );
+}
+
+ACE_INLINE
+void
+POA_CORBA::ComponentIR::EventPortDef::_get_absolute_name_skel (
+ TAO_ServerRequest & server_request,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL
+ )
+{
+ POA_CORBA::Contained * const impl = static_cast<POA_CORBA::ComponentIR::EventPortDef *> (servant);
+ POA_CORBA::Contained::_get_absolute_name_skel (
+ server_request,
+ servant_upcall,
+ impl
+ ACE_ENV_ARG_PARAMETER
+ );
+}
+
+ACE_INLINE
+void
+POA_CORBA::ComponentIR::EventPortDef::_get_containing_repository_skel (
+ TAO_ServerRequest & server_request,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL
+ )
+{
+ POA_CORBA::Contained * const impl = static_cast<POA_CORBA::ComponentIR::EventPortDef *> (servant);
+ POA_CORBA::Contained::_get_containing_repository_skel (
+ server_request,
+ servant_upcall,
+ impl
+ ACE_ENV_ARG_PARAMETER
+ );
+}
+
+// TAO_IDL - Generated from
+// be\be_interface.cpp:1955
+
+ACE_INLINE
+void
+POA_CORBA::ComponentIR::EventPortDef::describe_skel (
+ TAO_ServerRequest & server_request,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL
+ )
+{
+ POA_CORBA::Contained * const impl = static_cast<POA_CORBA::ComponentIR::EventPortDef *> (servant);
+ POA_CORBA::Contained::describe_skel (
+ server_request,
+ servant_upcall,
+ impl
+ ACE_ENV_ARG_PARAMETER
+ );
+}
+
+// TAO_IDL - Generated from
+// be\be_interface.cpp:1955
+
+ACE_INLINE
+void
+POA_CORBA::ComponentIR::EventPortDef::move_skel (
+ TAO_ServerRequest & server_request,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL
+ )
+{
+ POA_CORBA::Contained * const impl = static_cast<POA_CORBA::ComponentIR::EventPortDef *> (servant);
+ POA_CORBA::Contained::move_skel (
+ server_request,
+ servant_upcall,
+ impl
+ ACE_ENV_ARG_PARAMETER
+ );
+}
+
+ACE_INLINE
+void
+POA_CORBA::ComponentIR::EmitsDef::_get_def_kind_skel (
+ TAO_ServerRequest & server_request,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL
+ )
+{
+ POA_CORBA::IRObject * const impl = static_cast<POA_CORBA::ComponentIR::EmitsDef *> (servant);
+ POA_CORBA::IRObject::_get_def_kind_skel (
+ server_request,
+ servant_upcall,
+ impl
+ ACE_ENV_ARG_PARAMETER
+ );
+}
+
+// TAO_IDL - Generated from
+// be\be_interface.cpp:1955
+
+ACE_INLINE
+void
+POA_CORBA::ComponentIR::EmitsDef::destroy_skel (
+ TAO_ServerRequest & server_request,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL
+ )
+{
+ POA_CORBA::IRObject * const impl = static_cast<POA_CORBA::ComponentIR::EmitsDef *> (servant);
+ POA_CORBA::IRObject::destroy_skel (
+ server_request,
+ servant_upcall,
+ impl
+ ACE_ENV_ARG_PARAMETER
+ );
+}
+
+ACE_INLINE
+void
+POA_CORBA::ComponentIR::EmitsDef::_get_id_skel (
+ TAO_ServerRequest & server_request,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL
+ )
+{
+ POA_CORBA::Contained * const impl = static_cast<POA_CORBA::ComponentIR::EmitsDef *> (servant);
+ POA_CORBA::Contained::_get_id_skel (
+ server_request,
+ servant_upcall,
+ impl
+ ACE_ENV_ARG_PARAMETER
+ );
+}
+
+ACE_INLINE
+void
+POA_CORBA::ComponentIR::EmitsDef::_set_id_skel (
+ TAO_ServerRequest & server_request,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL
+ )
+{
+ POA_CORBA::Contained * const impl = static_cast<POA_CORBA::ComponentIR::EmitsDef *> (servant);
+ POA_CORBA::Contained::_set_id_skel (
+ server_request,
+ servant_upcall,
+ impl
+ ACE_ENV_ARG_PARAMETER
+ );
+}
+
+ACE_INLINE
+void
+POA_CORBA::ComponentIR::EmitsDef::_get_name_skel (
+ TAO_ServerRequest & server_request,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL
+ )
+{
+ POA_CORBA::Contained * const impl = static_cast<POA_CORBA::ComponentIR::EmitsDef *> (servant);
+ POA_CORBA::Contained::_get_name_skel (
+ server_request,
+ servant_upcall,
+ impl
+ ACE_ENV_ARG_PARAMETER
+ );
+}
+
+ACE_INLINE
+void
+POA_CORBA::ComponentIR::EmitsDef::_set_name_skel (
+ TAO_ServerRequest & server_request,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL
+ )
+{
+ POA_CORBA::Contained * const impl = static_cast<POA_CORBA::ComponentIR::EmitsDef *> (servant);
+ POA_CORBA::Contained::_set_name_skel (
+ server_request,
+ servant_upcall,
+ impl
+ ACE_ENV_ARG_PARAMETER
+ );
+}
+
+ACE_INLINE
+void
+POA_CORBA::ComponentIR::EmitsDef::_get_version_skel (
+ TAO_ServerRequest & server_request,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL
+ )
+{
+ POA_CORBA::Contained * const impl = static_cast<POA_CORBA::ComponentIR::EmitsDef *> (servant);
+ POA_CORBA::Contained::_get_version_skel (
+ server_request,
+ servant_upcall,
+ impl
+ ACE_ENV_ARG_PARAMETER
+ );
+}
+
+ACE_INLINE
+void
+POA_CORBA::ComponentIR::EmitsDef::_set_version_skel (
+ TAO_ServerRequest & server_request,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL
+ )
+{
+ POA_CORBA::Contained * const impl = static_cast<POA_CORBA::ComponentIR::EmitsDef *> (servant);
+ POA_CORBA::Contained::_set_version_skel (
+ server_request,
+ servant_upcall,
+ impl
+ ACE_ENV_ARG_PARAMETER
+ );
+}
+
+ACE_INLINE
+void
+POA_CORBA::ComponentIR::EmitsDef::_get_defined_in_skel (
+ TAO_ServerRequest & server_request,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL
+ )
+{
+ POA_CORBA::Contained * const impl = static_cast<POA_CORBA::ComponentIR::EmitsDef *> (servant);
+ POA_CORBA::Contained::_get_defined_in_skel (
+ server_request,
+ servant_upcall,
+ impl
+ ACE_ENV_ARG_PARAMETER
+ );
+}
+
+ACE_INLINE
+void
+POA_CORBA::ComponentIR::EmitsDef::_get_absolute_name_skel (
+ TAO_ServerRequest & server_request,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL
+ )
+{
+ POA_CORBA::Contained * const impl = static_cast<POA_CORBA::ComponentIR::EmitsDef *> (servant);
+ POA_CORBA::Contained::_get_absolute_name_skel (
+ server_request,
+ servant_upcall,
+ impl
+ ACE_ENV_ARG_PARAMETER
+ );
+}
+
+ACE_INLINE
+void
+POA_CORBA::ComponentIR::EmitsDef::_get_containing_repository_skel (
+ TAO_ServerRequest & server_request,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL
+ )
+{
+ POA_CORBA::Contained * const impl = static_cast<POA_CORBA::ComponentIR::EmitsDef *> (servant);
+ POA_CORBA::Contained::_get_containing_repository_skel (
+ server_request,
+ servant_upcall,
+ impl
+ ACE_ENV_ARG_PARAMETER
+ );
+}
+
+// TAO_IDL - Generated from
+// be\be_interface.cpp:1955
+
+ACE_INLINE
+void
+POA_CORBA::ComponentIR::EmitsDef::describe_skel (
+ TAO_ServerRequest & server_request,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL
+ )
+{
+ POA_CORBA::Contained * const impl = static_cast<POA_CORBA::ComponentIR::EmitsDef *> (servant);
+ POA_CORBA::Contained::describe_skel (
+ server_request,
+ servant_upcall,
+ impl
+ ACE_ENV_ARG_PARAMETER
+ );
+}
+
+// TAO_IDL - Generated from
+// be\be_interface.cpp:1955
+
+ACE_INLINE
+void
+POA_CORBA::ComponentIR::EmitsDef::move_skel (
+ TAO_ServerRequest & server_request,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL
+ )
+{
+ POA_CORBA::Contained * const impl = static_cast<POA_CORBA::ComponentIR::EmitsDef *> (servant);
+ POA_CORBA::Contained::move_skel (
+ server_request,
+ servant_upcall,
+ impl
+ ACE_ENV_ARG_PARAMETER
+ );
+}
+
+ACE_INLINE
+void
+POA_CORBA::ComponentIR::EmitsDef::_get_event_skel (
+ TAO_ServerRequest & server_request,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL
+ )
+{
+ POA_CORBA::ComponentIR::EventPortDef * const impl = static_cast<POA_CORBA::ComponentIR::EmitsDef *> (servant);
+ POA_CORBA::ComponentIR::EventPortDef::_get_event_skel (
+ server_request,
+ servant_upcall,
+ impl
+ ACE_ENV_ARG_PARAMETER
+ );
+}
+
+ACE_INLINE
+void
+POA_CORBA::ComponentIR::EmitsDef::_set_event_skel (
+ TAO_ServerRequest & server_request,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL
+ )
+{
+ POA_CORBA::ComponentIR::EventPortDef * const impl = static_cast<POA_CORBA::ComponentIR::EmitsDef *> (servant);
+ POA_CORBA::ComponentIR::EventPortDef::_set_event_skel (
+ server_request,
+ servant_upcall,
+ impl
+ ACE_ENV_ARG_PARAMETER
+ );
+}
+
+// TAO_IDL - Generated from
+// be\be_interface.cpp:1955
+
+ACE_INLINE
+void
+POA_CORBA::ComponentIR::EmitsDef::is_a_skel (
+ TAO_ServerRequest & server_request,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL
+ )
+{
+ POA_CORBA::ComponentIR::EventPortDef * const impl = static_cast<POA_CORBA::ComponentIR::EmitsDef *> (servant);
+ POA_CORBA::ComponentIR::EventPortDef::is_a_skel (
+ server_request,
+ servant_upcall,
+ impl
+ ACE_ENV_ARG_PARAMETER
+ );
+}
+
+ACE_INLINE
+void
+POA_CORBA::ComponentIR::PublishesDef::_get_def_kind_skel (
+ TAO_ServerRequest & server_request,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL
+ )
+{
+ POA_CORBA::IRObject * const impl = static_cast<POA_CORBA::ComponentIR::PublishesDef *> (servant);
+ POA_CORBA::IRObject::_get_def_kind_skel (
+ server_request,
+ servant_upcall,
+ impl
+ ACE_ENV_ARG_PARAMETER
+ );
+}
+
+// TAO_IDL - Generated from
+// be\be_interface.cpp:1955
+
+ACE_INLINE
+void
+POA_CORBA::ComponentIR::PublishesDef::destroy_skel (
+ TAO_ServerRequest & server_request,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL
+ )
+{
+ POA_CORBA::IRObject * const impl = static_cast<POA_CORBA::ComponentIR::PublishesDef *> (servant);
+ POA_CORBA::IRObject::destroy_skel (
+ server_request,
+ servant_upcall,
+ impl
+ ACE_ENV_ARG_PARAMETER
+ );
+}
+
+ACE_INLINE
+void
+POA_CORBA::ComponentIR::PublishesDef::_get_id_skel (
+ TAO_ServerRequest & server_request,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL
+ )
+{
+ POA_CORBA::Contained * const impl = static_cast<POA_CORBA::ComponentIR::PublishesDef *> (servant);
+ POA_CORBA::Contained::_get_id_skel (
+ server_request,
+ servant_upcall,
+ impl
+ ACE_ENV_ARG_PARAMETER
+ );
+}
+
+ACE_INLINE
+void
+POA_CORBA::ComponentIR::PublishesDef::_set_id_skel (
+ TAO_ServerRequest & server_request,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL
+ )
+{
+ POA_CORBA::Contained * const impl = static_cast<POA_CORBA::ComponentIR::PublishesDef *> (servant);
+ POA_CORBA::Contained::_set_id_skel (
+ server_request,
+ servant_upcall,
+ impl
+ ACE_ENV_ARG_PARAMETER
+ );
+}
+
+ACE_INLINE
+void
+POA_CORBA::ComponentIR::PublishesDef::_get_name_skel (
+ TAO_ServerRequest & server_request,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL
+ )
+{
+ POA_CORBA::Contained * const impl = static_cast<POA_CORBA::ComponentIR::PublishesDef *> (servant);
+ POA_CORBA::Contained::_get_name_skel (
+ server_request,
+ servant_upcall,
+ impl
+ ACE_ENV_ARG_PARAMETER
+ );
+}
+
+ACE_INLINE
+void
+POA_CORBA::ComponentIR::PublishesDef::_set_name_skel (
+ TAO_ServerRequest & server_request,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL
+ )
+{
+ POA_CORBA::Contained * const impl = static_cast<POA_CORBA::ComponentIR::PublishesDef *> (servant);
+ POA_CORBA::Contained::_set_name_skel (
+ server_request,
+ servant_upcall,
+ impl
+ ACE_ENV_ARG_PARAMETER
+ );
+}
+
+ACE_INLINE
+void
+POA_CORBA::ComponentIR::PublishesDef::_get_version_skel (
+ TAO_ServerRequest & server_request,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL
+ )
+{
+ POA_CORBA::Contained * const impl = static_cast<POA_CORBA::ComponentIR::PublishesDef *> (servant);
+ POA_CORBA::Contained::_get_version_skel (
+ server_request,
+ servant_upcall,
+ impl
+ ACE_ENV_ARG_PARAMETER
+ );
+}
+
+ACE_INLINE
+void
+POA_CORBA::ComponentIR::PublishesDef::_set_version_skel (
+ TAO_ServerRequest & server_request,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL
+ )
+{
+ POA_CORBA::Contained * const impl = static_cast<POA_CORBA::ComponentIR::PublishesDef *> (servant);
+ POA_CORBA::Contained::_set_version_skel (
+ server_request,
+ servant_upcall,
+ impl
+ ACE_ENV_ARG_PARAMETER
+ );
+}
+
+ACE_INLINE
+void
+POA_CORBA::ComponentIR::PublishesDef::_get_defined_in_skel (
+ TAO_ServerRequest & server_request,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL
+ )
+{
+ POA_CORBA::Contained * const impl = static_cast<POA_CORBA::ComponentIR::PublishesDef *> (servant);
+ POA_CORBA::Contained::_get_defined_in_skel (
+ server_request,
+ servant_upcall,
+ impl
+ ACE_ENV_ARG_PARAMETER
+ );
+}
+
+ACE_INLINE
+void
+POA_CORBA::ComponentIR::PublishesDef::_get_absolute_name_skel (
+ TAO_ServerRequest & server_request,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL
+ )
+{
+ POA_CORBA::Contained * const impl = static_cast<POA_CORBA::ComponentIR::PublishesDef *> (servant);
+ POA_CORBA::Contained::_get_absolute_name_skel (
+ server_request,
+ servant_upcall,
+ impl
+ ACE_ENV_ARG_PARAMETER
+ );
+}
+
+ACE_INLINE
+void
+POA_CORBA::ComponentIR::PublishesDef::_get_containing_repository_skel (
+ TAO_ServerRequest & server_request,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL
+ )
+{
+ POA_CORBA::Contained * const impl = static_cast<POA_CORBA::ComponentIR::PublishesDef *> (servant);
+ POA_CORBA::Contained::_get_containing_repository_skel (
+ server_request,
+ servant_upcall,
+ impl
+ ACE_ENV_ARG_PARAMETER
+ );
+}
+
+// TAO_IDL - Generated from
+// be\be_interface.cpp:1955
+
+ACE_INLINE
+void
+POA_CORBA::ComponentIR::PublishesDef::describe_skel (
+ TAO_ServerRequest & server_request,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL
+ )
+{
+ POA_CORBA::Contained * const impl = static_cast<POA_CORBA::ComponentIR::PublishesDef *> (servant);
+ POA_CORBA::Contained::describe_skel (
+ server_request,
+ servant_upcall,
+ impl
+ ACE_ENV_ARG_PARAMETER
+ );
+}
+
+// TAO_IDL - Generated from
+// be\be_interface.cpp:1955
+
+ACE_INLINE
+void
+POA_CORBA::ComponentIR::PublishesDef::move_skel (
+ TAO_ServerRequest & server_request,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL
+ )
+{
+ POA_CORBA::Contained * const impl = static_cast<POA_CORBA::ComponentIR::PublishesDef *> (servant);
+ POA_CORBA::Contained::move_skel (
+ server_request,
+ servant_upcall,
+ impl
+ ACE_ENV_ARG_PARAMETER
+ );
+}
+
+ACE_INLINE
+void
+POA_CORBA::ComponentIR::PublishesDef::_get_event_skel (
+ TAO_ServerRequest & server_request,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL
+ )
+{
+ POA_CORBA::ComponentIR::EventPortDef * const impl = static_cast<POA_CORBA::ComponentIR::PublishesDef *> (servant);
+ POA_CORBA::ComponentIR::EventPortDef::_get_event_skel (
+ server_request,
+ servant_upcall,
+ impl
+ ACE_ENV_ARG_PARAMETER
+ );
+}
+
+ACE_INLINE
+void
+POA_CORBA::ComponentIR::PublishesDef::_set_event_skel (
+ TAO_ServerRequest & server_request,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL
+ )
+{
+ POA_CORBA::ComponentIR::EventPortDef * const impl = static_cast<POA_CORBA::ComponentIR::PublishesDef *> (servant);
+ POA_CORBA::ComponentIR::EventPortDef::_set_event_skel (
+ server_request,
+ servant_upcall,
+ impl
+ ACE_ENV_ARG_PARAMETER
+ );
+}
+
+// TAO_IDL - Generated from
+// be\be_interface.cpp:1955
+
+ACE_INLINE
+void
+POA_CORBA::ComponentIR::PublishesDef::is_a_skel (
+ TAO_ServerRequest & server_request,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL
+ )
+{
+ POA_CORBA::ComponentIR::EventPortDef * const impl = static_cast<POA_CORBA::ComponentIR::PublishesDef *> (servant);
+ POA_CORBA::ComponentIR::EventPortDef::is_a_skel (
+ server_request,
+ servant_upcall,
+ impl
+ ACE_ENV_ARG_PARAMETER
+ );
+}
+
+ACE_INLINE
+void
+POA_CORBA::ComponentIR::ConsumesDef::_get_def_kind_skel (
+ TAO_ServerRequest & server_request,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL
+ )
+{
+ POA_CORBA::IRObject * const impl = static_cast<POA_CORBA::ComponentIR::ConsumesDef *> (servant);
+ POA_CORBA::IRObject::_get_def_kind_skel (
+ server_request,
+ servant_upcall,
+ impl
+ ACE_ENV_ARG_PARAMETER
+ );
+}
+
+// TAO_IDL - Generated from
+// be\be_interface.cpp:1955
+
+ACE_INLINE
+void
+POA_CORBA::ComponentIR::ConsumesDef::destroy_skel (
+ TAO_ServerRequest & server_request,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL
+ )
+{
+ POA_CORBA::IRObject * const impl = static_cast<POA_CORBA::ComponentIR::ConsumesDef *> (servant);
+ POA_CORBA::IRObject::destroy_skel (
+ server_request,
+ servant_upcall,
+ impl
+ ACE_ENV_ARG_PARAMETER
+ );
+}
+
+ACE_INLINE
+void
+POA_CORBA::ComponentIR::ConsumesDef::_get_id_skel (
+ TAO_ServerRequest & server_request,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL
+ )
+{
+ POA_CORBA::Contained * const impl = static_cast<POA_CORBA::ComponentIR::ConsumesDef *> (servant);
+ POA_CORBA::Contained::_get_id_skel (
+ server_request,
+ servant_upcall,
+ impl
+ ACE_ENV_ARG_PARAMETER
+ );
+}
+
+ACE_INLINE
+void
+POA_CORBA::ComponentIR::ConsumesDef::_set_id_skel (
+ TAO_ServerRequest & server_request,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL
+ )
+{
+ POA_CORBA::Contained * const impl = static_cast<POA_CORBA::ComponentIR::ConsumesDef *> (servant);
+ POA_CORBA::Contained::_set_id_skel (
+ server_request,
+ servant_upcall,
+ impl
+ ACE_ENV_ARG_PARAMETER
+ );
+}
+
+ACE_INLINE
+void
+POA_CORBA::ComponentIR::ConsumesDef::_get_name_skel (
+ TAO_ServerRequest & server_request,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL
+ )
+{
+ POA_CORBA::Contained * const impl = static_cast<POA_CORBA::ComponentIR::ConsumesDef *> (servant);
+ POA_CORBA::Contained::_get_name_skel (
+ server_request,
+ servant_upcall,
+ impl
+ ACE_ENV_ARG_PARAMETER
+ );
+}
+
+ACE_INLINE
+void
+POA_CORBA::ComponentIR::ConsumesDef::_set_name_skel (
+ TAO_ServerRequest & server_request,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL
+ )
+{
+ POA_CORBA::Contained * const impl = static_cast<POA_CORBA::ComponentIR::ConsumesDef *> (servant);
+ POA_CORBA::Contained::_set_name_skel (
+ server_request,
+ servant_upcall,
+ impl
+ ACE_ENV_ARG_PARAMETER
+ );
+}
+
+ACE_INLINE
+void
+POA_CORBA::ComponentIR::ConsumesDef::_get_version_skel (
+ TAO_ServerRequest & server_request,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL
+ )
+{
+ POA_CORBA::Contained * const impl = static_cast<POA_CORBA::ComponentIR::ConsumesDef *> (servant);
+ POA_CORBA::Contained::_get_version_skel (
+ server_request,
+ servant_upcall,
+ impl
+ ACE_ENV_ARG_PARAMETER
+ );
+}
+
+ACE_INLINE
+void
+POA_CORBA::ComponentIR::ConsumesDef::_set_version_skel (
+ TAO_ServerRequest & server_request,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL
+ )
+{
+ POA_CORBA::Contained * const impl = static_cast<POA_CORBA::ComponentIR::ConsumesDef *> (servant);
+ POA_CORBA::Contained::_set_version_skel (
+ server_request,
+ servant_upcall,
+ impl
+ ACE_ENV_ARG_PARAMETER
+ );
+}
+
+ACE_INLINE
+void
+POA_CORBA::ComponentIR::ConsumesDef::_get_defined_in_skel (
+ TAO_ServerRequest & server_request,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL
+ )
+{
+ POA_CORBA::Contained * const impl = static_cast<POA_CORBA::ComponentIR::ConsumesDef *> (servant);
+ POA_CORBA::Contained::_get_defined_in_skel (
+ server_request,
+ servant_upcall,
+ impl
+ ACE_ENV_ARG_PARAMETER
+ );
+}
+
+ACE_INLINE
+void
+POA_CORBA::ComponentIR::ConsumesDef::_get_absolute_name_skel (
+ TAO_ServerRequest & server_request,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL
+ )
+{
+ POA_CORBA::Contained * const impl = static_cast<POA_CORBA::ComponentIR::ConsumesDef *> (servant);
+ POA_CORBA::Contained::_get_absolute_name_skel (
+ server_request,
+ servant_upcall,
+ impl
+ ACE_ENV_ARG_PARAMETER
+ );
+}
+
+ACE_INLINE
+void
+POA_CORBA::ComponentIR::ConsumesDef::_get_containing_repository_skel (
+ TAO_ServerRequest & server_request,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL
+ )
+{
+ POA_CORBA::Contained * const impl = static_cast<POA_CORBA::ComponentIR::ConsumesDef *> (servant);
+ POA_CORBA::Contained::_get_containing_repository_skel (
+ server_request,
+ servant_upcall,
+ impl
+ ACE_ENV_ARG_PARAMETER
+ );
+}
+
+// TAO_IDL - Generated from
+// be\be_interface.cpp:1955
+
+ACE_INLINE
+void
+POA_CORBA::ComponentIR::ConsumesDef::describe_skel (
+ TAO_ServerRequest & server_request,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL
+ )
+{
+ POA_CORBA::Contained * const impl = static_cast<POA_CORBA::ComponentIR::ConsumesDef *> (servant);
+ POA_CORBA::Contained::describe_skel (
+ server_request,
+ servant_upcall,
+ impl
+ ACE_ENV_ARG_PARAMETER
+ );
+}
+
+// TAO_IDL - Generated from
+// be\be_interface.cpp:1955
+
+ACE_INLINE
+void
+POA_CORBA::ComponentIR::ConsumesDef::move_skel (
+ TAO_ServerRequest & server_request,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL
+ )
+{
+ POA_CORBA::Contained * const impl = static_cast<POA_CORBA::ComponentIR::ConsumesDef *> (servant);
+ POA_CORBA::Contained::move_skel (
+ server_request,
+ servant_upcall,
+ impl
+ ACE_ENV_ARG_PARAMETER
+ );
+}
+
+ACE_INLINE
+void
+POA_CORBA::ComponentIR::ConsumesDef::_get_event_skel (
+ TAO_ServerRequest & server_request,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL
+ )
+{
+ POA_CORBA::ComponentIR::EventPortDef * const impl = static_cast<POA_CORBA::ComponentIR::ConsumesDef *> (servant);
+ POA_CORBA::ComponentIR::EventPortDef::_get_event_skel (
+ server_request,
+ servant_upcall,
+ impl
+ ACE_ENV_ARG_PARAMETER
+ );
+}
+
+ACE_INLINE
+void
+POA_CORBA::ComponentIR::ConsumesDef::_set_event_skel (
+ TAO_ServerRequest & server_request,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL
+ )
+{
+ POA_CORBA::ComponentIR::EventPortDef * const impl = static_cast<POA_CORBA::ComponentIR::ConsumesDef *> (servant);
+ POA_CORBA::ComponentIR::EventPortDef::_set_event_skel (
+ server_request,
+ servant_upcall,
+ impl
+ ACE_ENV_ARG_PARAMETER
+ );
+}
+
+// TAO_IDL - Generated from
+// be\be_interface.cpp:1955
+
+ACE_INLINE
+void
+POA_CORBA::ComponentIR::ConsumesDef::is_a_skel (
+ TAO_ServerRequest & server_request,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL
+ )
+{
+ POA_CORBA::ComponentIR::EventPortDef * const impl = static_cast<POA_CORBA::ComponentIR::ConsumesDef *> (servant);
+ POA_CORBA::ComponentIR::EventPortDef::is_a_skel (
+ server_request,
+ servant_upcall,
+ impl
+ ACE_ENV_ARG_PARAMETER
+ );
+}
+
+ACE_INLINE
+void
+POA_CORBA::ComponentIR::ComponentDef::_get_def_kind_skel (
+ TAO_ServerRequest & server_request,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL
+ )
+{
+ POA_CORBA::IRObject * const impl = static_cast<POA_CORBA::ComponentIR::ComponentDef *> (servant);
+ POA_CORBA::IRObject::_get_def_kind_skel (
+ server_request,
+ servant_upcall,
+ impl
+ ACE_ENV_ARG_PARAMETER
+ );
+}
+
+// TAO_IDL - Generated from
+// be\be_interface.cpp:1955
+
+ACE_INLINE
+void
+POA_CORBA::ComponentIR::ComponentDef::destroy_skel (
+ TAO_ServerRequest & server_request,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL
+ )
+{
+ POA_CORBA::IRObject * const impl = static_cast<POA_CORBA::ComponentIR::ComponentDef *> (servant);
+ POA_CORBA::IRObject::destroy_skel (
+ server_request,
+ servant_upcall,
+ impl
+ ACE_ENV_ARG_PARAMETER
+ );
+}
+
+// TAO_IDL - Generated from
+// be\be_interface.cpp:1955
+
+ACE_INLINE
+void
+POA_CORBA::ComponentIR::ComponentDef::lookup_skel (
+ TAO_ServerRequest & server_request,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL
+ )
+{
+ POA_CORBA::Container * const impl = static_cast<POA_CORBA::ComponentIR::ComponentDef *> (servant);
+ POA_CORBA::Container::lookup_skel (
+ server_request,
+ servant_upcall,
+ impl
+ ACE_ENV_ARG_PARAMETER
+ );
+}
+
+// TAO_IDL - Generated from
+// be\be_interface.cpp:1955
+
+ACE_INLINE
+void
+POA_CORBA::ComponentIR::ComponentDef::contents_skel (
+ TAO_ServerRequest & server_request,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL
+ )
+{
+ POA_CORBA::Container * const impl = static_cast<POA_CORBA::ComponentIR::ComponentDef *> (servant);
+ POA_CORBA::Container::contents_skel (
+ server_request,
+ servant_upcall,
+ impl
+ ACE_ENV_ARG_PARAMETER
+ );
+}
+
+// TAO_IDL - Generated from
+// be\be_interface.cpp:1955
+
+ACE_INLINE
+void
+POA_CORBA::ComponentIR::ComponentDef::lookup_name_skel (
+ TAO_ServerRequest & server_request,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL
+ )
+{
+ POA_CORBA::Container * const impl = static_cast<POA_CORBA::ComponentIR::ComponentDef *> (servant);
+ POA_CORBA::Container::lookup_name_skel (
+ server_request,
+ servant_upcall,
+ impl
+ ACE_ENV_ARG_PARAMETER
+ );
+}
+
+// TAO_IDL - Generated from
+// be\be_interface.cpp:1955
+
+ACE_INLINE
+void
+POA_CORBA::ComponentIR::ComponentDef::describe_contents_skel (
+ TAO_ServerRequest & server_request,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL
+ )
+{
+ POA_CORBA::Container * const impl = static_cast<POA_CORBA::ComponentIR::ComponentDef *> (servant);
+ POA_CORBA::Container::describe_contents_skel (
+ server_request,
+ servant_upcall,
+ impl
+ ACE_ENV_ARG_PARAMETER
+ );
+}
+
+// TAO_IDL - Generated from
+// be\be_interface.cpp:1955
+
+ACE_INLINE
+void
+POA_CORBA::ComponentIR::ComponentDef::create_module_skel (
+ TAO_ServerRequest & server_request,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL
+ )
+{
+ POA_CORBA::Container * const impl = static_cast<POA_CORBA::ComponentIR::ComponentDef *> (servant);
+ POA_CORBA::Container::create_module_skel (
+ server_request,
+ servant_upcall,
+ impl
+ ACE_ENV_ARG_PARAMETER
+ );
+}
+
+// TAO_IDL - Generated from
+// be\be_interface.cpp:1955
+
+ACE_INLINE
+void
+POA_CORBA::ComponentIR::ComponentDef::create_constant_skel (
+ TAO_ServerRequest & server_request,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL
+ )
+{
+ POA_CORBA::Container * const impl = static_cast<POA_CORBA::ComponentIR::ComponentDef *> (servant);
+ POA_CORBA::Container::create_constant_skel (
+ server_request,
+ servant_upcall,
+ impl
+ ACE_ENV_ARG_PARAMETER
+ );
+}
+
+// TAO_IDL - Generated from
+// be\be_interface.cpp:1955
+
+ACE_INLINE
+void
+POA_CORBA::ComponentIR::ComponentDef::create_struct_skel (
+ TAO_ServerRequest & server_request,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL
+ )
+{
+ POA_CORBA::Container * const impl = static_cast<POA_CORBA::ComponentIR::ComponentDef *> (servant);
+ POA_CORBA::Container::create_struct_skel (
+ server_request,
+ servant_upcall,
+ impl
+ ACE_ENV_ARG_PARAMETER
+ );
+}
+
+// TAO_IDL - Generated from
+// be\be_interface.cpp:1955
+
+ACE_INLINE
+void
+POA_CORBA::ComponentIR::ComponentDef::create_union_skel (
+ TAO_ServerRequest & server_request,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL
+ )
+{
+ POA_CORBA::Container * const impl = static_cast<POA_CORBA::ComponentIR::ComponentDef *> (servant);
+ POA_CORBA::Container::create_union_skel (
+ server_request,
+ servant_upcall,
+ impl
+ ACE_ENV_ARG_PARAMETER
+ );
+}
+
+// TAO_IDL - Generated from
+// be\be_interface.cpp:1955
+
+ACE_INLINE
+void
+POA_CORBA::ComponentIR::ComponentDef::create_enum_skel (
+ TAO_ServerRequest & server_request,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL
+ )
+{
+ POA_CORBA::Container * const impl = static_cast<POA_CORBA::ComponentIR::ComponentDef *> (servant);
+ POA_CORBA::Container::create_enum_skel (
+ server_request,
+ servant_upcall,
+ impl
+ ACE_ENV_ARG_PARAMETER
+ );
+}
+
+// TAO_IDL - Generated from
+// be\be_interface.cpp:1955
+
+ACE_INLINE
+void
+POA_CORBA::ComponentIR::ComponentDef::create_alias_skel (
+ TAO_ServerRequest & server_request,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL
+ )
+{
+ POA_CORBA::Container * const impl = static_cast<POA_CORBA::ComponentIR::ComponentDef *> (servant);
+ POA_CORBA::Container::create_alias_skel (
+ server_request,
+ servant_upcall,
+ impl
+ ACE_ENV_ARG_PARAMETER
+ );
+}
+
+// TAO_IDL - Generated from
+// be\be_interface.cpp:1955
+
+ACE_INLINE
+void
+POA_CORBA::ComponentIR::ComponentDef::create_interface_skel (
+ TAO_ServerRequest & server_request,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL
+ )
+{
+ POA_CORBA::Container * const impl = static_cast<POA_CORBA::ComponentIR::ComponentDef *> (servant);
+ POA_CORBA::Container::create_interface_skel (
+ server_request,
+ servant_upcall,
+ impl
+ ACE_ENV_ARG_PARAMETER
+ );
+}
+
+// TAO_IDL - Generated from
+// be\be_interface.cpp:1955
+
+ACE_INLINE
+void
+POA_CORBA::ComponentIR::ComponentDef::create_value_skel (
+ TAO_ServerRequest & server_request,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL
+ )
+{
+ POA_CORBA::Container * const impl = static_cast<POA_CORBA::ComponentIR::ComponentDef *> (servant);
+ POA_CORBA::Container::create_value_skel (
+ server_request,
+ servant_upcall,
+ impl
+ ACE_ENV_ARG_PARAMETER
+ );
+}
+
+// TAO_IDL - Generated from
+// be\be_interface.cpp:1955
+
+ACE_INLINE
+void
+POA_CORBA::ComponentIR::ComponentDef::create_value_box_skel (
+ TAO_ServerRequest & server_request,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL
+ )
+{
+ POA_CORBA::Container * const impl = static_cast<POA_CORBA::ComponentIR::ComponentDef *> (servant);
+ POA_CORBA::Container::create_value_box_skel (
+ server_request,
+ servant_upcall,
+ impl
+ ACE_ENV_ARG_PARAMETER
+ );
+}
+
+// TAO_IDL - Generated from
+// be\be_interface.cpp:1955
+
+ACE_INLINE
+void
+POA_CORBA::ComponentIR::ComponentDef::create_exception_skel (
+ TAO_ServerRequest & server_request,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL
+ )
+{
+ POA_CORBA::Container * const impl = static_cast<POA_CORBA::ComponentIR::ComponentDef *> (servant);
+ POA_CORBA::Container::create_exception_skel (
+ server_request,
+ servant_upcall,
+ impl
+ ACE_ENV_ARG_PARAMETER
+ );
+}
+
+// TAO_IDL - Generated from
+// be\be_interface.cpp:1955
+
+ACE_INLINE
+void
+POA_CORBA::ComponentIR::ComponentDef::create_native_skel (
+ TAO_ServerRequest & server_request,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL
+ )
+{
+ POA_CORBA::Container * const impl = static_cast<POA_CORBA::ComponentIR::ComponentDef *> (servant);
+ POA_CORBA::Container::create_native_skel (
+ server_request,
+ servant_upcall,
+ impl
+ ACE_ENV_ARG_PARAMETER
+ );
+}
+
+// TAO_IDL - Generated from
+// be\be_interface.cpp:1955
+
+ACE_INLINE
+void
+POA_CORBA::ComponentIR::ComponentDef::create_abstract_interface_skel (
+ TAO_ServerRequest & server_request,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL
+ )
+{
+ POA_CORBA::Container * const impl = static_cast<POA_CORBA::ComponentIR::ComponentDef *> (servant);
+ POA_CORBA::Container::create_abstract_interface_skel (
+ server_request,
+ servant_upcall,
+ impl
+ ACE_ENV_ARG_PARAMETER
+ );
+}
+
+// TAO_IDL - Generated from
+// be\be_interface.cpp:1955
+
+ACE_INLINE
+void
+POA_CORBA::ComponentIR::ComponentDef::create_local_interface_skel (
+ TAO_ServerRequest & server_request,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL
+ )
+{
+ POA_CORBA::Container * const impl = static_cast<POA_CORBA::ComponentIR::ComponentDef *> (servant);
+ POA_CORBA::Container::create_local_interface_skel (
+ server_request,
+ servant_upcall,
+ impl
+ ACE_ENV_ARG_PARAMETER
+ );
+}
+
+// TAO_IDL - Generated from
+// be\be_interface.cpp:1955
+
+ACE_INLINE
+void
+POA_CORBA::ComponentIR::ComponentDef::create_ext_value_skel (
+ TAO_ServerRequest & server_request,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL
+ )
+{
+ POA_CORBA::Container * const impl = static_cast<POA_CORBA::ComponentIR::ComponentDef *> (servant);
+ POA_CORBA::Container::create_ext_value_skel (
+ server_request,
+ servant_upcall,
+ impl
+ ACE_ENV_ARG_PARAMETER
+ );
+}
+
+ACE_INLINE
+void
+POA_CORBA::ComponentIR::ComponentDef::_get_id_skel (
+ TAO_ServerRequest & server_request,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL
+ )
+{
+ POA_CORBA::Contained * const impl = static_cast<POA_CORBA::ComponentIR::ComponentDef *> (servant);
+ POA_CORBA::Contained::_get_id_skel (
+ server_request,
+ servant_upcall,
+ impl
+ ACE_ENV_ARG_PARAMETER
+ );
+}
+
+ACE_INLINE
+void
+POA_CORBA::ComponentIR::ComponentDef::_set_id_skel (
+ TAO_ServerRequest & server_request,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL
+ )
+{
+ POA_CORBA::Contained * const impl = static_cast<POA_CORBA::ComponentIR::ComponentDef *> (servant);
+ POA_CORBA::Contained::_set_id_skel (
+ server_request,
+ servant_upcall,
+ impl
+ ACE_ENV_ARG_PARAMETER
+ );
+}
+
+ACE_INLINE
+void
+POA_CORBA::ComponentIR::ComponentDef::_get_name_skel (
+ TAO_ServerRequest & server_request,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL
+ )
+{
+ POA_CORBA::Contained * const impl = static_cast<POA_CORBA::ComponentIR::ComponentDef *> (servant);
+ POA_CORBA::Contained::_get_name_skel (
+ server_request,
+ servant_upcall,
+ impl
+ ACE_ENV_ARG_PARAMETER
+ );
+}
+
+ACE_INLINE
+void
+POA_CORBA::ComponentIR::ComponentDef::_set_name_skel (
+ TAO_ServerRequest & server_request,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL
+ )
+{
+ POA_CORBA::Contained * const impl = static_cast<POA_CORBA::ComponentIR::ComponentDef *> (servant);
+ POA_CORBA::Contained::_set_name_skel (
+ server_request,
+ servant_upcall,
+ impl
+ ACE_ENV_ARG_PARAMETER
+ );
+}
+
+ACE_INLINE
+void
+POA_CORBA::ComponentIR::ComponentDef::_get_version_skel (
+ TAO_ServerRequest & server_request,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL
+ )
+{
+ POA_CORBA::Contained * const impl = static_cast<POA_CORBA::ComponentIR::ComponentDef *> (servant);
+ POA_CORBA::Contained::_get_version_skel (
+ server_request,
+ servant_upcall,
+ impl
+ ACE_ENV_ARG_PARAMETER
+ );
+}
+
+ACE_INLINE
+void
+POA_CORBA::ComponentIR::ComponentDef::_set_version_skel (
+ TAO_ServerRequest & server_request,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL
+ )
+{
+ POA_CORBA::Contained * const impl = static_cast<POA_CORBA::ComponentIR::ComponentDef *> (servant);
+ POA_CORBA::Contained::_set_version_skel (
+ server_request,
+ servant_upcall,
+ impl
+ ACE_ENV_ARG_PARAMETER
+ );
+}
+
+ACE_INLINE
+void
+POA_CORBA::ComponentIR::ComponentDef::_get_defined_in_skel (
+ TAO_ServerRequest & server_request,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL
+ )
+{
+ POA_CORBA::Contained * const impl = static_cast<POA_CORBA::ComponentIR::ComponentDef *> (servant);
+ POA_CORBA::Contained::_get_defined_in_skel (
+ server_request,
+ servant_upcall,
+ impl
+ ACE_ENV_ARG_PARAMETER
+ );
+}
+
+ACE_INLINE
+void
+POA_CORBA::ComponentIR::ComponentDef::_get_absolute_name_skel (
+ TAO_ServerRequest & server_request,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL
+ )
+{
+ POA_CORBA::Contained * const impl = static_cast<POA_CORBA::ComponentIR::ComponentDef *> (servant);
+ POA_CORBA::Contained::_get_absolute_name_skel (
+ server_request,
+ servant_upcall,
+ impl
+ ACE_ENV_ARG_PARAMETER
+ );
+}
+
+ACE_INLINE
+void
+POA_CORBA::ComponentIR::ComponentDef::_get_containing_repository_skel (
+ TAO_ServerRequest & server_request,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL
+ )
+{
+ POA_CORBA::Contained * const impl = static_cast<POA_CORBA::ComponentIR::ComponentDef *> (servant);
+ POA_CORBA::Contained::_get_containing_repository_skel (
+ server_request,
+ servant_upcall,
+ impl
+ ACE_ENV_ARG_PARAMETER
+ );
+}
+
+// TAO_IDL - Generated from
+// be\be_interface.cpp:1955
+
+ACE_INLINE
+void
+POA_CORBA::ComponentIR::ComponentDef::describe_skel (
+ TAO_ServerRequest & server_request,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL
+ )
+{
+ POA_CORBA::Contained * const impl = static_cast<POA_CORBA::ComponentIR::ComponentDef *> (servant);
+ POA_CORBA::Contained::describe_skel (
+ server_request,
+ servant_upcall,
+ impl
+ ACE_ENV_ARG_PARAMETER
+ );
+}
+
+// TAO_IDL - Generated from
+// be\be_interface.cpp:1955
+
+ACE_INLINE
+void
+POA_CORBA::ComponentIR::ComponentDef::move_skel (
+ TAO_ServerRequest & server_request,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL
+ )
+{
+ POA_CORBA::Contained * const impl = static_cast<POA_CORBA::ComponentIR::ComponentDef *> (servant);
+ POA_CORBA::Contained::move_skel (
+ server_request,
+ servant_upcall,
+ impl
+ ACE_ENV_ARG_PARAMETER
+ );
+}
+
+ACE_INLINE
+void
+POA_CORBA::ComponentIR::ComponentDef::_get_type_skel (
+ TAO_ServerRequest & server_request,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL
+ )
+{
+ POA_CORBA::IDLType * const impl = static_cast<POA_CORBA::ComponentIR::ComponentDef *> (servant);
+ POA_CORBA::IDLType::_get_type_skel (
+ server_request,
+ servant_upcall,
+ impl
+ ACE_ENV_ARG_PARAMETER
+ );
+}
+
+ACE_INLINE
+void
+POA_CORBA::ComponentIR::ComponentDef::_get_base_interfaces_skel (
+ TAO_ServerRequest & server_request,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL
+ )
+{
+ POA_CORBA::InterfaceDef * const impl = static_cast<POA_CORBA::ComponentIR::ComponentDef *> (servant);
+ POA_CORBA::InterfaceDef::_get_base_interfaces_skel (
+ server_request,
+ servant_upcall,
+ impl
+ ACE_ENV_ARG_PARAMETER
+ );
+}
+
+ACE_INLINE
+void
+POA_CORBA::ComponentIR::ComponentDef::_set_base_interfaces_skel (
+ TAO_ServerRequest & server_request,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL
+ )
+{
+ POA_CORBA::InterfaceDef * const impl = static_cast<POA_CORBA::ComponentIR::ComponentDef *> (servant);
+ POA_CORBA::InterfaceDef::_set_base_interfaces_skel (
+ server_request,
+ servant_upcall,
+ impl
+ ACE_ENV_ARG_PARAMETER
+ );
+}
+
+// TAO_IDL - Generated from
+// be\be_interface.cpp:1955
+
+ACE_INLINE
+void
+POA_CORBA::ComponentIR::ComponentDef::is_a_skel (
+ TAO_ServerRequest & server_request,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL
+ )
+{
+ POA_CORBA::InterfaceDef * const impl = static_cast<POA_CORBA::ComponentIR::ComponentDef *> (servant);
+ POA_CORBA::InterfaceDef::is_a_skel (
+ server_request,
+ servant_upcall,
+ impl
+ ACE_ENV_ARG_PARAMETER
+ );
+}
+
+// TAO_IDL - Generated from
+// be\be_interface.cpp:1955
+
+ACE_INLINE
+void
+POA_CORBA::ComponentIR::ComponentDef::describe_interface_skel (
+ TAO_ServerRequest & server_request,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL
+ )
+{
+ POA_CORBA::InterfaceDef * const impl = static_cast<POA_CORBA::ComponentIR::ComponentDef *> (servant);
+ POA_CORBA::InterfaceDef::describe_interface_skel (
+ server_request,
+ servant_upcall,
+ impl
+ ACE_ENV_ARG_PARAMETER
+ );
+}
+
+// TAO_IDL - Generated from
+// be\be_interface.cpp:1955
+
+ACE_INLINE
+void
+POA_CORBA::ComponentIR::ComponentDef::create_attribute_skel (
+ TAO_ServerRequest & server_request,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL
+ )
+{
+ POA_CORBA::InterfaceDef * const impl = static_cast<POA_CORBA::ComponentIR::ComponentDef *> (servant);
+ POA_CORBA::InterfaceDef::create_attribute_skel (
+ server_request,
+ servant_upcall,
+ impl
+ ACE_ENV_ARG_PARAMETER
+ );
+}
+
+// TAO_IDL - Generated from
+// be\be_interface.cpp:1955
+
+ACE_INLINE
+void
+POA_CORBA::ComponentIR::ComponentDef::create_operation_skel (
+ TAO_ServerRequest & server_request,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL
+ )
+{
+ POA_CORBA::InterfaceDef * const impl = static_cast<POA_CORBA::ComponentIR::ComponentDef *> (servant);
+ POA_CORBA::InterfaceDef::create_operation_skel (
+ server_request,
+ servant_upcall,
+ impl
+ ACE_ENV_ARG_PARAMETER
+ );
+}
+
+// TAO_IDL - Generated from
+// be\be_interface.cpp:1955
+
+ACE_INLINE
+void
+POA_CORBA::ComponentIR::ComponentDef::describe_ext_interface_skel (
+ TAO_ServerRequest & server_request,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL
+ )
+{
+ POA_CORBA::InterfaceAttrExtension * const impl = static_cast<POA_CORBA::ComponentIR::ComponentDef *> (servant);
+ POA_CORBA::InterfaceAttrExtension::describe_ext_interface_skel (
+ server_request,
+ servant_upcall,
+ impl
+ ACE_ENV_ARG_PARAMETER
+ );
+}
+
+// TAO_IDL - Generated from
+// be\be_interface.cpp:1955
+
+ACE_INLINE
+void
+POA_CORBA::ComponentIR::ComponentDef::create_ext_attribute_skel (
+ TAO_ServerRequest & server_request,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL
+ )
+{
+ POA_CORBA::InterfaceAttrExtension * const impl = static_cast<POA_CORBA::ComponentIR::ComponentDef *> (servant);
+ POA_CORBA::InterfaceAttrExtension::create_ext_attribute_skel (
+ server_request,
+ servant_upcall,
+ impl
+ ACE_ENV_ARG_PARAMETER
+ );
+}
+
+ACE_INLINE
+void
+POA_CORBA::ComponentIR::FactoryDef::_get_def_kind_skel (
+ TAO_ServerRequest & server_request,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL
+ )
+{
+ POA_CORBA::IRObject * const impl = static_cast<POA_CORBA::ComponentIR::FactoryDef *> (servant);
+ POA_CORBA::IRObject::_get_def_kind_skel (
+ server_request,
+ servant_upcall,
+ impl
+ ACE_ENV_ARG_PARAMETER
+ );
+}
+
+// TAO_IDL - Generated from
+// be\be_interface.cpp:1955
+
+ACE_INLINE
+void
+POA_CORBA::ComponentIR::FactoryDef::destroy_skel (
+ TAO_ServerRequest & server_request,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL
+ )
+{
+ POA_CORBA::IRObject * const impl = static_cast<POA_CORBA::ComponentIR::FactoryDef *> (servant);
+ POA_CORBA::IRObject::destroy_skel (
+ server_request,
+ servant_upcall,
+ impl
+ ACE_ENV_ARG_PARAMETER
+ );
+}
+
+ACE_INLINE
+void
+POA_CORBA::ComponentIR::FactoryDef::_get_id_skel (
+ TAO_ServerRequest & server_request,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL
+ )
+{
+ POA_CORBA::Contained * const impl = static_cast<POA_CORBA::ComponentIR::FactoryDef *> (servant);
+ POA_CORBA::Contained::_get_id_skel (
+ server_request,
+ servant_upcall,
+ impl
+ ACE_ENV_ARG_PARAMETER
+ );
+}
+
+ACE_INLINE
+void
+POA_CORBA::ComponentIR::FactoryDef::_set_id_skel (
+ TAO_ServerRequest & server_request,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL
+ )
+{
+ POA_CORBA::Contained * const impl = static_cast<POA_CORBA::ComponentIR::FactoryDef *> (servant);
+ POA_CORBA::Contained::_set_id_skel (
+ server_request,
+ servant_upcall,
+ impl
+ ACE_ENV_ARG_PARAMETER
+ );
+}
+
+ACE_INLINE
+void
+POA_CORBA::ComponentIR::FactoryDef::_get_name_skel (
+ TAO_ServerRequest & server_request,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL
+ )
+{
+ POA_CORBA::Contained * const impl = static_cast<POA_CORBA::ComponentIR::FactoryDef *> (servant);
+ POA_CORBA::Contained::_get_name_skel (
+ server_request,
+ servant_upcall,
+ impl
+ ACE_ENV_ARG_PARAMETER
+ );
+}
+
+ACE_INLINE
+void
+POA_CORBA::ComponentIR::FactoryDef::_set_name_skel (
+ TAO_ServerRequest & server_request,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL
+ )
+{
+ POA_CORBA::Contained * const impl = static_cast<POA_CORBA::ComponentIR::FactoryDef *> (servant);
+ POA_CORBA::Contained::_set_name_skel (
+ server_request,
+ servant_upcall,
+ impl
+ ACE_ENV_ARG_PARAMETER
+ );
+}
+
+ACE_INLINE
+void
+POA_CORBA::ComponentIR::FactoryDef::_get_version_skel (
+ TAO_ServerRequest & server_request,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL
+ )
+{
+ POA_CORBA::Contained * const impl = static_cast<POA_CORBA::ComponentIR::FactoryDef *> (servant);
+ POA_CORBA::Contained::_get_version_skel (
+ server_request,
+ servant_upcall,
+ impl
+ ACE_ENV_ARG_PARAMETER
+ );
+}
+
+ACE_INLINE
+void
+POA_CORBA::ComponentIR::FactoryDef::_set_version_skel (
+ TAO_ServerRequest & server_request,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL
+ )
+{
+ POA_CORBA::Contained * const impl = static_cast<POA_CORBA::ComponentIR::FactoryDef *> (servant);
+ POA_CORBA::Contained::_set_version_skel (
+ server_request,
+ servant_upcall,
+ impl
+ ACE_ENV_ARG_PARAMETER
+ );
+}
+
+ACE_INLINE
+void
+POA_CORBA::ComponentIR::FactoryDef::_get_defined_in_skel (
+ TAO_ServerRequest & server_request,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL
+ )
+{
+ POA_CORBA::Contained * const impl = static_cast<POA_CORBA::ComponentIR::FactoryDef *> (servant);
+ POA_CORBA::Contained::_get_defined_in_skel (
+ server_request,
+ servant_upcall,
+ impl
+ ACE_ENV_ARG_PARAMETER
+ );
+}
+
+ACE_INLINE
+void
+POA_CORBA::ComponentIR::FactoryDef::_get_absolute_name_skel (
+ TAO_ServerRequest & server_request,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL
+ )
+{
+ POA_CORBA::Contained * const impl = static_cast<POA_CORBA::ComponentIR::FactoryDef *> (servant);
+ POA_CORBA::Contained::_get_absolute_name_skel (
+ server_request,
+ servant_upcall,
+ impl
+ ACE_ENV_ARG_PARAMETER
+ );
+}
+
+ACE_INLINE
+void
+POA_CORBA::ComponentIR::FactoryDef::_get_containing_repository_skel (
+ TAO_ServerRequest & server_request,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL
+ )
+{
+ POA_CORBA::Contained * const impl = static_cast<POA_CORBA::ComponentIR::FactoryDef *> (servant);
+ POA_CORBA::Contained::_get_containing_repository_skel (
+ server_request,
+ servant_upcall,
+ impl
+ ACE_ENV_ARG_PARAMETER
+ );
+}
+
+// TAO_IDL - Generated from
+// be\be_interface.cpp:1955
+
+ACE_INLINE
+void
+POA_CORBA::ComponentIR::FactoryDef::describe_skel (
+ TAO_ServerRequest & server_request,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL
+ )
+{
+ POA_CORBA::Contained * const impl = static_cast<POA_CORBA::ComponentIR::FactoryDef *> (servant);
+ POA_CORBA::Contained::describe_skel (
+ server_request,
+ servant_upcall,
+ impl
+ ACE_ENV_ARG_PARAMETER
+ );
+}
+
+// TAO_IDL - Generated from
+// be\be_interface.cpp:1955
+
+ACE_INLINE
+void
+POA_CORBA::ComponentIR::FactoryDef::move_skel (
+ TAO_ServerRequest & server_request,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL
+ )
+{
+ POA_CORBA::Contained * const impl = static_cast<POA_CORBA::ComponentIR::FactoryDef *> (servant);
+ POA_CORBA::Contained::move_skel (
+ server_request,
+ servant_upcall,
+ impl
+ ACE_ENV_ARG_PARAMETER
+ );
+}
+
+ACE_INLINE
+void
+POA_CORBA::ComponentIR::FactoryDef::_get_result_skel (
+ TAO_ServerRequest & server_request,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL
+ )
+{
+ POA_CORBA::OperationDef * const impl = static_cast<POA_CORBA::ComponentIR::FactoryDef *> (servant);
+ POA_CORBA::OperationDef::_get_result_skel (
+ server_request,
+ servant_upcall,
+ impl
+ ACE_ENV_ARG_PARAMETER
+ );
+}
+
+ACE_INLINE
+void
+POA_CORBA::ComponentIR::FactoryDef::_get_result_def_skel (
+ TAO_ServerRequest & server_request,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL
+ )
+{
+ POA_CORBA::OperationDef * const impl = static_cast<POA_CORBA::ComponentIR::FactoryDef *> (servant);
+ POA_CORBA::OperationDef::_get_result_def_skel (
+ server_request,
+ servant_upcall,
+ impl
+ ACE_ENV_ARG_PARAMETER
+ );
+}
+
+ACE_INLINE
+void
+POA_CORBA::ComponentIR::FactoryDef::_set_result_def_skel (
+ TAO_ServerRequest & server_request,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL
+ )
+{
+ POA_CORBA::OperationDef * const impl = static_cast<POA_CORBA::ComponentIR::FactoryDef *> (servant);
+ POA_CORBA::OperationDef::_set_result_def_skel (
+ server_request,
+ servant_upcall,
+ impl
+ ACE_ENV_ARG_PARAMETER
+ );
+}
+
+ACE_INLINE
+void
+POA_CORBA::ComponentIR::FactoryDef::_get_params_skel (
+ TAO_ServerRequest & server_request,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL
+ )
+{
+ POA_CORBA::OperationDef * const impl = static_cast<POA_CORBA::ComponentIR::FactoryDef *> (servant);
+ POA_CORBA::OperationDef::_get_params_skel (
+ server_request,
+ servant_upcall,
+ impl
+ ACE_ENV_ARG_PARAMETER
+ );
+}
+
+ACE_INLINE
+void
+POA_CORBA::ComponentIR::FactoryDef::_set_params_skel (
+ TAO_ServerRequest & server_request,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL
+ )
+{
+ POA_CORBA::OperationDef * const impl = static_cast<POA_CORBA::ComponentIR::FactoryDef *> (servant);
+ POA_CORBA::OperationDef::_set_params_skel (
+ server_request,
+ servant_upcall,
+ impl
+ ACE_ENV_ARG_PARAMETER
+ );
+}
+
+ACE_INLINE
+void
+POA_CORBA::ComponentIR::FactoryDef::_get_mode_skel (
+ TAO_ServerRequest & server_request,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL
+ )
+{
+ POA_CORBA::OperationDef * const impl = static_cast<POA_CORBA::ComponentIR::FactoryDef *> (servant);
+ POA_CORBA::OperationDef::_get_mode_skel (
+ server_request,
+ servant_upcall,
+ impl
+ ACE_ENV_ARG_PARAMETER
+ );
+}
+
+ACE_INLINE
+void
+POA_CORBA::ComponentIR::FactoryDef::_set_mode_skel (
+ TAO_ServerRequest & server_request,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL
+ )
+{
+ POA_CORBA::OperationDef * const impl = static_cast<POA_CORBA::ComponentIR::FactoryDef *> (servant);
+ POA_CORBA::OperationDef::_set_mode_skel (
+ server_request,
+ servant_upcall,
+ impl
+ ACE_ENV_ARG_PARAMETER
+ );
+}
+
+ACE_INLINE
+void
+POA_CORBA::ComponentIR::FactoryDef::_get_contexts_skel (
+ TAO_ServerRequest & server_request,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL
+ )
+{
+ POA_CORBA::OperationDef * const impl = static_cast<POA_CORBA::ComponentIR::FactoryDef *> (servant);
+ POA_CORBA::OperationDef::_get_contexts_skel (
+ server_request,
+ servant_upcall,
+ impl
+ ACE_ENV_ARG_PARAMETER
+ );
+}
+
+ACE_INLINE
+void
+POA_CORBA::ComponentIR::FactoryDef::_set_contexts_skel (
+ TAO_ServerRequest & server_request,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL
+ )
+{
+ POA_CORBA::OperationDef * const impl = static_cast<POA_CORBA::ComponentIR::FactoryDef *> (servant);
+ POA_CORBA::OperationDef::_set_contexts_skel (
+ server_request,
+ servant_upcall,
+ impl
+ ACE_ENV_ARG_PARAMETER
+ );
+}
+
+ACE_INLINE
+void
+POA_CORBA::ComponentIR::FactoryDef::_get_exceptions_skel (
+ TAO_ServerRequest & server_request,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL
+ )
+{
+ POA_CORBA::OperationDef * const impl = static_cast<POA_CORBA::ComponentIR::FactoryDef *> (servant);
+ POA_CORBA::OperationDef::_get_exceptions_skel (
+ server_request,
+ servant_upcall,
+ impl
+ ACE_ENV_ARG_PARAMETER
+ );
+}
+
+ACE_INLINE
+void
+POA_CORBA::ComponentIR::FactoryDef::_set_exceptions_skel (
+ TAO_ServerRequest & server_request,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL
+ )
+{
+ POA_CORBA::OperationDef * const impl = static_cast<POA_CORBA::ComponentIR::FactoryDef *> (servant);
+ POA_CORBA::OperationDef::_set_exceptions_skel (
+ server_request,
+ servant_upcall,
+ impl
+ ACE_ENV_ARG_PARAMETER
+ );
+}
+
+ACE_INLINE
+void
+POA_CORBA::ComponentIR::FinderDef::_get_def_kind_skel (
+ TAO_ServerRequest & server_request,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL
+ )
+{
+ POA_CORBA::IRObject * const impl = static_cast<POA_CORBA::ComponentIR::FinderDef *> (servant);
+ POA_CORBA::IRObject::_get_def_kind_skel (
+ server_request,
+ servant_upcall,
+ impl
+ ACE_ENV_ARG_PARAMETER
+ );
+}
+
+// TAO_IDL - Generated from
+// be\be_interface.cpp:1955
+
+ACE_INLINE
+void
+POA_CORBA::ComponentIR::FinderDef::destroy_skel (
+ TAO_ServerRequest & server_request,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL
+ )
+{
+ POA_CORBA::IRObject * const impl = static_cast<POA_CORBA::ComponentIR::FinderDef *> (servant);
+ POA_CORBA::IRObject::destroy_skel (
+ server_request,
+ servant_upcall,
+ impl
+ ACE_ENV_ARG_PARAMETER
+ );
+}
+
+ACE_INLINE
+void
+POA_CORBA::ComponentIR::FinderDef::_get_id_skel (
+ TAO_ServerRequest & server_request,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL
+ )
+{
+ POA_CORBA::Contained * const impl = static_cast<POA_CORBA::ComponentIR::FinderDef *> (servant);
+ POA_CORBA::Contained::_get_id_skel (
+ server_request,
+ servant_upcall,
+ impl
+ ACE_ENV_ARG_PARAMETER
+ );
+}
+
+ACE_INLINE
+void
+POA_CORBA::ComponentIR::FinderDef::_set_id_skel (
+ TAO_ServerRequest & server_request,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL
+ )
+{
+ POA_CORBA::Contained * const impl = static_cast<POA_CORBA::ComponentIR::FinderDef *> (servant);
+ POA_CORBA::Contained::_set_id_skel (
+ server_request,
+ servant_upcall,
+ impl
+ ACE_ENV_ARG_PARAMETER
+ );
+}
+
+ACE_INLINE
+void
+POA_CORBA::ComponentIR::FinderDef::_get_name_skel (
+ TAO_ServerRequest & server_request,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL
+ )
+{
+ POA_CORBA::Contained * const impl = static_cast<POA_CORBA::ComponentIR::FinderDef *> (servant);
+ POA_CORBA::Contained::_get_name_skel (
+ server_request,
+ servant_upcall,
+ impl
+ ACE_ENV_ARG_PARAMETER
+ );
+}
+
+ACE_INLINE
+void
+POA_CORBA::ComponentIR::FinderDef::_set_name_skel (
+ TAO_ServerRequest & server_request,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL
+ )
+{
+ POA_CORBA::Contained * const impl = static_cast<POA_CORBA::ComponentIR::FinderDef *> (servant);
+ POA_CORBA::Contained::_set_name_skel (
+ server_request,
+ servant_upcall,
+ impl
+ ACE_ENV_ARG_PARAMETER
+ );
+}
+
+ACE_INLINE
+void
+POA_CORBA::ComponentIR::FinderDef::_get_version_skel (
+ TAO_ServerRequest & server_request,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL
+ )
+{
+ POA_CORBA::Contained * const impl = static_cast<POA_CORBA::ComponentIR::FinderDef *> (servant);
+ POA_CORBA::Contained::_get_version_skel (
+ server_request,
+ servant_upcall,
+ impl
+ ACE_ENV_ARG_PARAMETER
+ );
+}
+
+ACE_INLINE
+void
+POA_CORBA::ComponentIR::FinderDef::_set_version_skel (
+ TAO_ServerRequest & server_request,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL
+ )
+{
+ POA_CORBA::Contained * const impl = static_cast<POA_CORBA::ComponentIR::FinderDef *> (servant);
+ POA_CORBA::Contained::_set_version_skel (
+ server_request,
+ servant_upcall,
+ impl
+ ACE_ENV_ARG_PARAMETER
+ );
+}
+
+ACE_INLINE
+void
+POA_CORBA::ComponentIR::FinderDef::_get_defined_in_skel (
+ TAO_ServerRequest & server_request,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL
+ )
+{
+ POA_CORBA::Contained * const impl = static_cast<POA_CORBA::ComponentIR::FinderDef *> (servant);
+ POA_CORBA::Contained::_get_defined_in_skel (
+ server_request,
+ servant_upcall,
+ impl
+ ACE_ENV_ARG_PARAMETER
+ );
+}
+
+ACE_INLINE
+void
+POA_CORBA::ComponentIR::FinderDef::_get_absolute_name_skel (
+ TAO_ServerRequest & server_request,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL
+ )
+{
+ POA_CORBA::Contained * const impl = static_cast<POA_CORBA::ComponentIR::FinderDef *> (servant);
+ POA_CORBA::Contained::_get_absolute_name_skel (
+ server_request,
+ servant_upcall,
+ impl
+ ACE_ENV_ARG_PARAMETER
+ );
+}
+
+ACE_INLINE
+void
+POA_CORBA::ComponentIR::FinderDef::_get_containing_repository_skel (
+ TAO_ServerRequest & server_request,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL
+ )
+{
+ POA_CORBA::Contained * const impl = static_cast<POA_CORBA::ComponentIR::FinderDef *> (servant);
+ POA_CORBA::Contained::_get_containing_repository_skel (
+ server_request,
+ servant_upcall,
+ impl
+ ACE_ENV_ARG_PARAMETER
+ );
+}
+
+// TAO_IDL - Generated from
+// be\be_interface.cpp:1955
+
+ACE_INLINE
+void
+POA_CORBA::ComponentIR::FinderDef::describe_skel (
+ TAO_ServerRequest & server_request,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL
+ )
+{
+ POA_CORBA::Contained * const impl = static_cast<POA_CORBA::ComponentIR::FinderDef *> (servant);
+ POA_CORBA::Contained::describe_skel (
+ server_request,
+ servant_upcall,
+ impl
+ ACE_ENV_ARG_PARAMETER
+ );
+}
+
+// TAO_IDL - Generated from
+// be\be_interface.cpp:1955
+
+ACE_INLINE
+void
+POA_CORBA::ComponentIR::FinderDef::move_skel (
+ TAO_ServerRequest & server_request,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL
+ )
+{
+ POA_CORBA::Contained * const impl = static_cast<POA_CORBA::ComponentIR::FinderDef *> (servant);
+ POA_CORBA::Contained::move_skel (
+ server_request,
+ servant_upcall,
+ impl
+ ACE_ENV_ARG_PARAMETER
+ );
+}
+
+ACE_INLINE
+void
+POA_CORBA::ComponentIR::FinderDef::_get_result_skel (
+ TAO_ServerRequest & server_request,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL
+ )
+{
+ POA_CORBA::OperationDef * const impl = static_cast<POA_CORBA::ComponentIR::FinderDef *> (servant);
+ POA_CORBA::OperationDef::_get_result_skel (
+ server_request,
+ servant_upcall,
+ impl
+ ACE_ENV_ARG_PARAMETER
+ );
+}
+
+ACE_INLINE
+void
+POA_CORBA::ComponentIR::FinderDef::_get_result_def_skel (
+ TAO_ServerRequest & server_request,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL
+ )
+{
+ POA_CORBA::OperationDef * const impl = static_cast<POA_CORBA::ComponentIR::FinderDef *> (servant);
+ POA_CORBA::OperationDef::_get_result_def_skel (
+ server_request,
+ servant_upcall,
+ impl
+ ACE_ENV_ARG_PARAMETER
+ );
+}
+
+ACE_INLINE
+void
+POA_CORBA::ComponentIR::FinderDef::_set_result_def_skel (
+ TAO_ServerRequest & server_request,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL
+ )
+{
+ POA_CORBA::OperationDef * const impl = static_cast<POA_CORBA::ComponentIR::FinderDef *> (servant);
+ POA_CORBA::OperationDef::_set_result_def_skel (
+ server_request,
+ servant_upcall,
+ impl
+ ACE_ENV_ARG_PARAMETER
+ );
+}
+
+ACE_INLINE
+void
+POA_CORBA::ComponentIR::FinderDef::_get_params_skel (
+ TAO_ServerRequest & server_request,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL
+ )
+{
+ POA_CORBA::OperationDef * const impl = static_cast<POA_CORBA::ComponentIR::FinderDef *> (servant);
+ POA_CORBA::OperationDef::_get_params_skel (
+ server_request,
+ servant_upcall,
+ impl
+ ACE_ENV_ARG_PARAMETER
+ );
+}
+
+ACE_INLINE
+void
+POA_CORBA::ComponentIR::FinderDef::_set_params_skel (
+ TAO_ServerRequest & server_request,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL
+ )
+{
+ POA_CORBA::OperationDef * const impl = static_cast<POA_CORBA::ComponentIR::FinderDef *> (servant);
+ POA_CORBA::OperationDef::_set_params_skel (
+ server_request,
+ servant_upcall,
+ impl
+ ACE_ENV_ARG_PARAMETER
+ );
+}
+
+ACE_INLINE
+void
+POA_CORBA::ComponentIR::FinderDef::_get_mode_skel (
+ TAO_ServerRequest & server_request,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL
+ )
+{
+ POA_CORBA::OperationDef * const impl = static_cast<POA_CORBA::ComponentIR::FinderDef *> (servant);
+ POA_CORBA::OperationDef::_get_mode_skel (
+ server_request,
+ servant_upcall,
+ impl
+ ACE_ENV_ARG_PARAMETER
+ );
+}
+
+ACE_INLINE
+void
+POA_CORBA::ComponentIR::FinderDef::_set_mode_skel (
+ TAO_ServerRequest & server_request,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL
+ )
+{
+ POA_CORBA::OperationDef * const impl = static_cast<POA_CORBA::ComponentIR::FinderDef *> (servant);
+ POA_CORBA::OperationDef::_set_mode_skel (
+ server_request,
+ servant_upcall,
+ impl
+ ACE_ENV_ARG_PARAMETER
+ );
+}
+
+ACE_INLINE
+void
+POA_CORBA::ComponentIR::FinderDef::_get_contexts_skel (
+ TAO_ServerRequest & server_request,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL
+ )
+{
+ POA_CORBA::OperationDef * const impl = static_cast<POA_CORBA::ComponentIR::FinderDef *> (servant);
+ POA_CORBA::OperationDef::_get_contexts_skel (
+ server_request,
+ servant_upcall,
+ impl
+ ACE_ENV_ARG_PARAMETER
+ );
+}
+
+ACE_INLINE
+void
+POA_CORBA::ComponentIR::FinderDef::_set_contexts_skel (
+ TAO_ServerRequest & server_request,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL
+ )
+{
+ POA_CORBA::OperationDef * const impl = static_cast<POA_CORBA::ComponentIR::FinderDef *> (servant);
+ POA_CORBA::OperationDef::_set_contexts_skel (
+ server_request,
+ servant_upcall,
+ impl
+ ACE_ENV_ARG_PARAMETER
+ );
+}
+
+ACE_INLINE
+void
+POA_CORBA::ComponentIR::FinderDef::_get_exceptions_skel (
+ TAO_ServerRequest & server_request,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL
+ )
+{
+ POA_CORBA::OperationDef * const impl = static_cast<POA_CORBA::ComponentIR::FinderDef *> (servant);
+ POA_CORBA::OperationDef::_get_exceptions_skel (
+ server_request,
+ servant_upcall,
+ impl
+ ACE_ENV_ARG_PARAMETER
+ );
+}
+
+ACE_INLINE
+void
+POA_CORBA::ComponentIR::FinderDef::_set_exceptions_skel (
+ TAO_ServerRequest & server_request,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL
+ )
+{
+ POA_CORBA::OperationDef * const impl = static_cast<POA_CORBA::ComponentIR::FinderDef *> (servant);
+ POA_CORBA::OperationDef::_set_exceptions_skel (
+ server_request,
+ servant_upcall,
+ impl
+ ACE_ENV_ARG_PARAMETER
+ );
+}
+
+ACE_INLINE
+void
+POA_CORBA::ComponentIR::HomeDef::_get_def_kind_skel (
+ TAO_ServerRequest & server_request,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL
+ )
+{
+ POA_CORBA::IRObject * const impl = static_cast<POA_CORBA::ComponentIR::HomeDef *> (servant);
+ POA_CORBA::IRObject::_get_def_kind_skel (
+ server_request,
+ servant_upcall,
+ impl
+ ACE_ENV_ARG_PARAMETER
+ );
+}
+
+// TAO_IDL - Generated from
+// be\be_interface.cpp:1955
+
+ACE_INLINE
+void
+POA_CORBA::ComponentIR::HomeDef::destroy_skel (
+ TAO_ServerRequest & server_request,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL
+ )
+{
+ POA_CORBA::IRObject * const impl = static_cast<POA_CORBA::ComponentIR::HomeDef *> (servant);
+ POA_CORBA::IRObject::destroy_skel (
+ server_request,
+ servant_upcall,
+ impl
+ ACE_ENV_ARG_PARAMETER
+ );
+}
+
+// TAO_IDL - Generated from
+// be\be_interface.cpp:1955
+
+ACE_INLINE
+void
+POA_CORBA::ComponentIR::HomeDef::lookup_skel (
+ TAO_ServerRequest & server_request,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL
+ )
+{
+ POA_CORBA::Container * const impl = static_cast<POA_CORBA::ComponentIR::HomeDef *> (servant);
+ POA_CORBA::Container::lookup_skel (
+ server_request,
+ servant_upcall,
+ impl
+ ACE_ENV_ARG_PARAMETER
+ );
+}
+
+// TAO_IDL - Generated from
+// be\be_interface.cpp:1955
+
+ACE_INLINE
+void
+POA_CORBA::ComponentIR::HomeDef::contents_skel (
+ TAO_ServerRequest & server_request,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL
+ )
+{
+ POA_CORBA::Container * const impl = static_cast<POA_CORBA::ComponentIR::HomeDef *> (servant);
+ POA_CORBA::Container::contents_skel (
+ server_request,
+ servant_upcall,
+ impl
+ ACE_ENV_ARG_PARAMETER
+ );
+}
+
+// TAO_IDL - Generated from
+// be\be_interface.cpp:1955
+
+ACE_INLINE
+void
+POA_CORBA::ComponentIR::HomeDef::lookup_name_skel (
+ TAO_ServerRequest & server_request,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL
+ )
+{
+ POA_CORBA::Container * const impl = static_cast<POA_CORBA::ComponentIR::HomeDef *> (servant);
+ POA_CORBA::Container::lookup_name_skel (
+ server_request,
+ servant_upcall,
+ impl
+ ACE_ENV_ARG_PARAMETER
+ );
+}
+
+// TAO_IDL - Generated from
+// be\be_interface.cpp:1955
+
+ACE_INLINE
+void
+POA_CORBA::ComponentIR::HomeDef::describe_contents_skel (
+ TAO_ServerRequest & server_request,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL
+ )
+{
+ POA_CORBA::Container * const impl = static_cast<POA_CORBA::ComponentIR::HomeDef *> (servant);
+ POA_CORBA::Container::describe_contents_skel (
+ server_request,
+ servant_upcall,
+ impl
+ ACE_ENV_ARG_PARAMETER
+ );
+}
+
+// TAO_IDL - Generated from
+// be\be_interface.cpp:1955
+
+ACE_INLINE
+void
+POA_CORBA::ComponentIR::HomeDef::create_module_skel (
+ TAO_ServerRequest & server_request,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL
+ )
+{
+ POA_CORBA::Container * const impl = static_cast<POA_CORBA::ComponentIR::HomeDef *> (servant);
+ POA_CORBA::Container::create_module_skel (
+ server_request,
+ servant_upcall,
+ impl
+ ACE_ENV_ARG_PARAMETER
+ );
+}
+
+// TAO_IDL - Generated from
+// be\be_interface.cpp:1955
+
+ACE_INLINE
+void
+POA_CORBA::ComponentIR::HomeDef::create_constant_skel (
+ TAO_ServerRequest & server_request,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL
+ )
+{
+ POA_CORBA::Container * const impl = static_cast<POA_CORBA::ComponentIR::HomeDef *> (servant);
+ POA_CORBA::Container::create_constant_skel (
+ server_request,
+ servant_upcall,
+ impl
+ ACE_ENV_ARG_PARAMETER
+ );
+}
+
+// TAO_IDL - Generated from
+// be\be_interface.cpp:1955
+
+ACE_INLINE
+void
+POA_CORBA::ComponentIR::HomeDef::create_struct_skel (
+ TAO_ServerRequest & server_request,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL
+ )
+{
+ POA_CORBA::Container * const impl = static_cast<POA_CORBA::ComponentIR::HomeDef *> (servant);
+ POA_CORBA::Container::create_struct_skel (
+ server_request,
+ servant_upcall,
+ impl
+ ACE_ENV_ARG_PARAMETER
+ );
+}
+
+// TAO_IDL - Generated from
+// be\be_interface.cpp:1955
+
+ACE_INLINE
+void
+POA_CORBA::ComponentIR::HomeDef::create_union_skel (
+ TAO_ServerRequest & server_request,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL
+ )
+{
+ POA_CORBA::Container * const impl = static_cast<POA_CORBA::ComponentIR::HomeDef *> (servant);
+ POA_CORBA::Container::create_union_skel (
+ server_request,
+ servant_upcall,
+ impl
+ ACE_ENV_ARG_PARAMETER
+ );
+}
+
+// TAO_IDL - Generated from
+// be\be_interface.cpp:1955
+
+ACE_INLINE
+void
+POA_CORBA::ComponentIR::HomeDef::create_enum_skel (
+ TAO_ServerRequest & server_request,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL
+ )
+{
+ POA_CORBA::Container * const impl = static_cast<POA_CORBA::ComponentIR::HomeDef *> (servant);
+ POA_CORBA::Container::create_enum_skel (
+ server_request,
+ servant_upcall,
+ impl
+ ACE_ENV_ARG_PARAMETER
+ );
+}
+
+// TAO_IDL - Generated from
+// be\be_interface.cpp:1955
+
+ACE_INLINE
+void
+POA_CORBA::ComponentIR::HomeDef::create_alias_skel (
+ TAO_ServerRequest & server_request,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL
+ )
+{
+ POA_CORBA::Container * const impl = static_cast<POA_CORBA::ComponentIR::HomeDef *> (servant);
+ POA_CORBA::Container::create_alias_skel (
+ server_request,
+ servant_upcall,
+ impl
+ ACE_ENV_ARG_PARAMETER
+ );
+}
+
+// TAO_IDL - Generated from
+// be\be_interface.cpp:1955
+
+ACE_INLINE
+void
+POA_CORBA::ComponentIR::HomeDef::create_interface_skel (
+ TAO_ServerRequest & server_request,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL
+ )
+{
+ POA_CORBA::Container * const impl = static_cast<POA_CORBA::ComponentIR::HomeDef *> (servant);
+ POA_CORBA::Container::create_interface_skel (
+ server_request,
+ servant_upcall,
+ impl
+ ACE_ENV_ARG_PARAMETER
+ );
+}
+
+// TAO_IDL - Generated from
+// be\be_interface.cpp:1955
+
+ACE_INLINE
+void
+POA_CORBA::ComponentIR::HomeDef::create_value_skel (
+ TAO_ServerRequest & server_request,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL
+ )
+{
+ POA_CORBA::Container * const impl = static_cast<POA_CORBA::ComponentIR::HomeDef *> (servant);
+ POA_CORBA::Container::create_value_skel (
+ server_request,
+ servant_upcall,
+ impl
+ ACE_ENV_ARG_PARAMETER
+ );
+}
+
+// TAO_IDL - Generated from
+// be\be_interface.cpp:1955
+
+ACE_INLINE
+void
+POA_CORBA::ComponentIR::HomeDef::create_value_box_skel (
+ TAO_ServerRequest & server_request,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL
+ )
+{
+ POA_CORBA::Container * const impl = static_cast<POA_CORBA::ComponentIR::HomeDef *> (servant);
+ POA_CORBA::Container::create_value_box_skel (
+ server_request,
+ servant_upcall,
+ impl
+ ACE_ENV_ARG_PARAMETER
+ );
+}
+
+// TAO_IDL - Generated from
+// be\be_interface.cpp:1955
+
+ACE_INLINE
+void
+POA_CORBA::ComponentIR::HomeDef::create_exception_skel (
+ TAO_ServerRequest & server_request,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL
+ )
+{
+ POA_CORBA::Container * const impl = static_cast<POA_CORBA::ComponentIR::HomeDef *> (servant);
+ POA_CORBA::Container::create_exception_skel (
+ server_request,
+ servant_upcall,
+ impl
+ ACE_ENV_ARG_PARAMETER
+ );
+}
+
+// TAO_IDL - Generated from
+// be\be_interface.cpp:1955
+
+ACE_INLINE
+void
+POA_CORBA::ComponentIR::HomeDef::create_native_skel (
+ TAO_ServerRequest & server_request,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL
+ )
+{
+ POA_CORBA::Container * const impl = static_cast<POA_CORBA::ComponentIR::HomeDef *> (servant);
+ POA_CORBA::Container::create_native_skel (
+ server_request,
+ servant_upcall,
+ impl
+ ACE_ENV_ARG_PARAMETER
+ );
+}
+
+// TAO_IDL - Generated from
+// be\be_interface.cpp:1955
+
+ACE_INLINE
+void
+POA_CORBA::ComponentIR::HomeDef::create_abstract_interface_skel (
+ TAO_ServerRequest & server_request,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL
+ )
+{
+ POA_CORBA::Container * const impl = static_cast<POA_CORBA::ComponentIR::HomeDef *> (servant);
+ POA_CORBA::Container::create_abstract_interface_skel (
+ server_request,
+ servant_upcall,
+ impl
+ ACE_ENV_ARG_PARAMETER
+ );
+}
+
+// TAO_IDL - Generated from
+// be\be_interface.cpp:1955
+
+ACE_INLINE
+void
+POA_CORBA::ComponentIR::HomeDef::create_local_interface_skel (
+ TAO_ServerRequest & server_request,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL
+ )
+{
+ POA_CORBA::Container * const impl = static_cast<POA_CORBA::ComponentIR::HomeDef *> (servant);
+ POA_CORBA::Container::create_local_interface_skel (
+ server_request,
+ servant_upcall,
+ impl
+ ACE_ENV_ARG_PARAMETER
+ );
+}
+
+// TAO_IDL - Generated from
+// be\be_interface.cpp:1955
+
+ACE_INLINE
+void
+POA_CORBA::ComponentIR::HomeDef::create_ext_value_skel (
+ TAO_ServerRequest & server_request,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL
+ )
+{
+ POA_CORBA::Container * const impl = static_cast<POA_CORBA::ComponentIR::HomeDef *> (servant);
+ POA_CORBA::Container::create_ext_value_skel (
+ server_request,
+ servant_upcall,
+ impl
+ ACE_ENV_ARG_PARAMETER
+ );
+}
+
+ACE_INLINE
+void
+POA_CORBA::ComponentIR::HomeDef::_get_id_skel (
+ TAO_ServerRequest & server_request,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL
+ )
+{
+ POA_CORBA::Contained * const impl = static_cast<POA_CORBA::ComponentIR::HomeDef *> (servant);
+ POA_CORBA::Contained::_get_id_skel (
+ server_request,
+ servant_upcall,
+ impl
+ ACE_ENV_ARG_PARAMETER
+ );
+}
+
+ACE_INLINE
+void
+POA_CORBA::ComponentIR::HomeDef::_set_id_skel (
+ TAO_ServerRequest & server_request,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL
+ )
+{
+ POA_CORBA::Contained * const impl = static_cast<POA_CORBA::ComponentIR::HomeDef *> (servant);
+ POA_CORBA::Contained::_set_id_skel (
+ server_request,
+ servant_upcall,
+ impl
+ ACE_ENV_ARG_PARAMETER
+ );
+}
+
+ACE_INLINE
+void
+POA_CORBA::ComponentIR::HomeDef::_get_name_skel (
+ TAO_ServerRequest & server_request,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL
+ )
+{
+ POA_CORBA::Contained * const impl = static_cast<POA_CORBA::ComponentIR::HomeDef *> (servant);
+ POA_CORBA::Contained::_get_name_skel (
+ server_request,
+ servant_upcall,
+ impl
+ ACE_ENV_ARG_PARAMETER
+ );
+}
+
+ACE_INLINE
+void
+POA_CORBA::ComponentIR::HomeDef::_set_name_skel (
+ TAO_ServerRequest & server_request,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL
+ )
+{
+ POA_CORBA::Contained * const impl = static_cast<POA_CORBA::ComponentIR::HomeDef *> (servant);
+ POA_CORBA::Contained::_set_name_skel (
+ server_request,
+ servant_upcall,
+ impl
+ ACE_ENV_ARG_PARAMETER
+ );
+}
+
+ACE_INLINE
+void
+POA_CORBA::ComponentIR::HomeDef::_get_version_skel (
+ TAO_ServerRequest & server_request,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL
+ )
+{
+ POA_CORBA::Contained * const impl = static_cast<POA_CORBA::ComponentIR::HomeDef *> (servant);
+ POA_CORBA::Contained::_get_version_skel (
+ server_request,
+ servant_upcall,
+ impl
+ ACE_ENV_ARG_PARAMETER
+ );
+}
+
+ACE_INLINE
+void
+POA_CORBA::ComponentIR::HomeDef::_set_version_skel (
+ TAO_ServerRequest & server_request,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL
+ )
+{
+ POA_CORBA::Contained * const impl = static_cast<POA_CORBA::ComponentIR::HomeDef *> (servant);
+ POA_CORBA::Contained::_set_version_skel (
+ server_request,
+ servant_upcall,
+ impl
+ ACE_ENV_ARG_PARAMETER
+ );
+}
+
+ACE_INLINE
+void
+POA_CORBA::ComponentIR::HomeDef::_get_defined_in_skel (
+ TAO_ServerRequest & server_request,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL
+ )
+{
+ POA_CORBA::Contained * const impl = static_cast<POA_CORBA::ComponentIR::HomeDef *> (servant);
+ POA_CORBA::Contained::_get_defined_in_skel (
+ server_request,
+ servant_upcall,
+ impl
+ ACE_ENV_ARG_PARAMETER
+ );
+}
+
+ACE_INLINE
+void
+POA_CORBA::ComponentIR::HomeDef::_get_absolute_name_skel (
+ TAO_ServerRequest & server_request,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL
+ )
+{
+ POA_CORBA::Contained * const impl = static_cast<POA_CORBA::ComponentIR::HomeDef *> (servant);
+ POA_CORBA::Contained::_get_absolute_name_skel (
+ server_request,
+ servant_upcall,
+ impl
+ ACE_ENV_ARG_PARAMETER
+ );
+}
+
+ACE_INLINE
+void
+POA_CORBA::ComponentIR::HomeDef::_get_containing_repository_skel (
+ TAO_ServerRequest & server_request,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL
+ )
+{
+ POA_CORBA::Contained * const impl = static_cast<POA_CORBA::ComponentIR::HomeDef *> (servant);
+ POA_CORBA::Contained::_get_containing_repository_skel (
+ server_request,
+ servant_upcall,
+ impl
+ ACE_ENV_ARG_PARAMETER
+ );
+}
+
+// TAO_IDL - Generated from
+// be\be_interface.cpp:1955
+
+ACE_INLINE
+void
+POA_CORBA::ComponentIR::HomeDef::describe_skel (
+ TAO_ServerRequest & server_request,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL
+ )
+{
+ POA_CORBA::Contained * const impl = static_cast<POA_CORBA::ComponentIR::HomeDef *> (servant);
+ POA_CORBA::Contained::describe_skel (
+ server_request,
+ servant_upcall,
+ impl
+ ACE_ENV_ARG_PARAMETER
+ );
+}
+
+// TAO_IDL - Generated from
+// be\be_interface.cpp:1955
+
+ACE_INLINE
+void
+POA_CORBA::ComponentIR::HomeDef::move_skel (
+ TAO_ServerRequest & server_request,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL
+ )
+{
+ POA_CORBA::Contained * const impl = static_cast<POA_CORBA::ComponentIR::HomeDef *> (servant);
+ POA_CORBA::Contained::move_skel (
+ server_request,
+ servant_upcall,
+ impl
+ ACE_ENV_ARG_PARAMETER
+ );
+}
+
+ACE_INLINE
+void
+POA_CORBA::ComponentIR::HomeDef::_get_type_skel (
+ TAO_ServerRequest & server_request,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL
+ )
+{
+ POA_CORBA::IDLType * const impl = static_cast<POA_CORBA::ComponentIR::HomeDef *> (servant);
+ POA_CORBA::IDLType::_get_type_skel (
+ server_request,
+ servant_upcall,
+ impl
+ ACE_ENV_ARG_PARAMETER
+ );
+}
+
+ACE_INLINE
+void
+POA_CORBA::ComponentIR::HomeDef::_get_base_interfaces_skel (
+ TAO_ServerRequest & server_request,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL
+ )
+{
+ POA_CORBA::InterfaceDef * const impl = static_cast<POA_CORBA::ComponentIR::HomeDef *> (servant);
+ POA_CORBA::InterfaceDef::_get_base_interfaces_skel (
+ server_request,
+ servant_upcall,
+ impl
+ ACE_ENV_ARG_PARAMETER
+ );
+}
+
+ACE_INLINE
+void
+POA_CORBA::ComponentIR::HomeDef::_set_base_interfaces_skel (
+ TAO_ServerRequest & server_request,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL
+ )
+{
+ POA_CORBA::InterfaceDef * const impl = static_cast<POA_CORBA::ComponentIR::HomeDef *> (servant);
+ POA_CORBA::InterfaceDef::_set_base_interfaces_skel (
+ server_request,
+ servant_upcall,
+ impl
+ ACE_ENV_ARG_PARAMETER
+ );
+}
+
+// TAO_IDL - Generated from
+// be\be_interface.cpp:1955
+
+ACE_INLINE
+void
+POA_CORBA::ComponentIR::HomeDef::is_a_skel (
+ TAO_ServerRequest & server_request,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL
+ )
+{
+ POA_CORBA::InterfaceDef * const impl = static_cast<POA_CORBA::ComponentIR::HomeDef *> (servant);
+ POA_CORBA::InterfaceDef::is_a_skel (
+ server_request,
+ servant_upcall,
+ impl
+ ACE_ENV_ARG_PARAMETER
+ );
+}
+
+// TAO_IDL - Generated from
+// be\be_interface.cpp:1955
+
+ACE_INLINE
+void
+POA_CORBA::ComponentIR::HomeDef::describe_interface_skel (
+ TAO_ServerRequest & server_request,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL
+ )
+{
+ POA_CORBA::InterfaceDef * const impl = static_cast<POA_CORBA::ComponentIR::HomeDef *> (servant);
+ POA_CORBA::InterfaceDef::describe_interface_skel (
+ server_request,
+ servant_upcall,
+ impl
+ ACE_ENV_ARG_PARAMETER
+ );
+}
+
+// TAO_IDL - Generated from
+// be\be_interface.cpp:1955
+
+ACE_INLINE
+void
+POA_CORBA::ComponentIR::HomeDef::create_attribute_skel (
+ TAO_ServerRequest & server_request,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL
+ )
+{
+ POA_CORBA::InterfaceDef * const impl = static_cast<POA_CORBA::ComponentIR::HomeDef *> (servant);
+ POA_CORBA::InterfaceDef::create_attribute_skel (
+ server_request,
+ servant_upcall,
+ impl
+ ACE_ENV_ARG_PARAMETER
+ );
+}
+
+// TAO_IDL - Generated from
+// be\be_interface.cpp:1955
+
+ACE_INLINE
+void
+POA_CORBA::ComponentIR::HomeDef::create_operation_skel (
+ TAO_ServerRequest & server_request,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL
+ )
+{
+ POA_CORBA::InterfaceDef * const impl = static_cast<POA_CORBA::ComponentIR::HomeDef *> (servant);
+ POA_CORBA::InterfaceDef::create_operation_skel (
+ server_request,
+ servant_upcall,
+ impl
+ ACE_ENV_ARG_PARAMETER
+ );
+}
+
+// TAO_IDL - Generated from
+// be\be_interface.cpp:1955
+
+ACE_INLINE
+void
+POA_CORBA::ComponentIR::HomeDef::describe_ext_interface_skel (
+ TAO_ServerRequest & server_request,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL
+ )
+{
+ POA_CORBA::InterfaceAttrExtension * const impl = static_cast<POA_CORBA::ComponentIR::HomeDef *> (servant);
+ POA_CORBA::InterfaceAttrExtension::describe_ext_interface_skel (
+ server_request,
+ servant_upcall,
+ impl
+ ACE_ENV_ARG_PARAMETER
+ );
+}
+
+// TAO_IDL - Generated from
+// be\be_interface.cpp:1955
+
+ACE_INLINE
+void
+POA_CORBA::ComponentIR::HomeDef::create_ext_attribute_skel (
+ TAO_ServerRequest & server_request,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL
+ )
+{
+ POA_CORBA::InterfaceAttrExtension * const impl = static_cast<POA_CORBA::ComponentIR::HomeDef *> (servant);
+ POA_CORBA::InterfaceAttrExtension::create_ext_attribute_skel (
+ server_request,
+ servant_upcall,
+ impl
+ ACE_ENV_ARG_PARAMETER
+ );
+}
+
+
+TAO_END_VERSIONED_NAMESPACE_DECL
+
+
diff --git a/TAO/orbsvcs/orbsvcs/IFRService/IFR_ComponentsS_T.cpp b/TAO/orbsvcs/orbsvcs/IFRService/IFR_ComponentsS_T.cpp
new file mode 100644
index 00000000000..1944c42347d
--- /dev/null
+++ b/TAO/orbsvcs/orbsvcs/IFRService/IFR_ComponentsS_T.cpp
@@ -0,0 +1,49 @@
+// -*- C++ -*-
+//
+// $Id$
+
+// **** Code generated by the The ACE ORB (TAO) IDL Compiler ****
+// TAO and the TAO IDL Compiler have been developed by:
+// Center for Distributed Object Computing
+// Washington University
+// St. Louis, MO
+// USA
+// http://www.cs.wustl.edu/~schmidt/doc-center.html
+// and
+// Distributed Object Computing Laboratory
+// University of California at Irvine
+// Irvine, CA
+// USA
+// http://doc.ece.uci.edu/
+// and
+// Institute for Software Integrated Systems
+// Vanderbilt University
+// Nashville, TN
+// USA
+// http://www.isis.vanderbilt.edu/
+//
+// Information about TAO is available at:
+// http://www.cs.wustl.edu/~schmidt/TAO.html
+
+// TAO_IDL - Generated from
+// be\be_codegen.cpp:683
+
+#ifndef _TAO_IDL____ORBSVCS_ORBSVCS_IFRSERVICE_IFR_COMPONENTSS_T_CPP_
+#define _TAO_IDL____ORBSVCS_ORBSVCS_IFRSERVICE_IFR_COMPONENTSS_T_CPP_
+
+#include "IFR_ComponentsS_T.h"
+
+#if !defined (__ACE_INLINE__)
+#include "IFR_ComponentsS_T.inl"
+#endif /* !defined INLINE */
+
+
+
+TAO_BEGIN_VERSIONED_NAMESPACE_DECL
+
+
+
+TAO_END_VERSIONED_NAMESPACE_DECL
+
+
+#endif /* ifndef */
diff --git a/TAO/orbsvcs/orbsvcs/IFRService/IFR_ComponentsS_T.h b/TAO/orbsvcs/orbsvcs/IFRService/IFR_ComponentsS_T.h
new file mode 100644
index 00000000000..0ab0e5470dc
--- /dev/null
+++ b/TAO/orbsvcs/orbsvcs/IFRService/IFR_ComponentsS_T.h
@@ -0,0 +1,5387 @@
+// -*- C++ -*-
+//
+// $Id$
+
+// **** Code generated by the The ACE ORB (TAO) IDL Compiler ****
+// TAO and the TAO IDL Compiler have been developed by:
+// Center for Distributed Object Computing
+// Washington University
+// St. Louis, MO
+// USA
+// http://www.cs.wustl.edu/~schmidt/doc-center.html
+// and
+// Distributed Object Computing Laboratory
+// University of California at Irvine
+// Irvine, CA
+// USA
+// http://doc.ece.uci.edu/
+// and
+// Institute for Software Integrated Systems
+// Vanderbilt University
+// Nashville, TN
+// USA
+// http://www.isis.vanderbilt.edu/
+//
+// Information about TAO is available at:
+// http://www.cs.wustl.edu/~schmidt/TAO.html
+
+// TAO_IDL - Generated from
+// be\be_codegen.cpp:545
+
+#ifndef _TAO_IDL____ORBSVCS_ORBSVCS_IFRSERVICE_IFR_COMPONENTSS_T_H_
+#define _TAO_IDL____ORBSVCS_ORBSVCS_IFRSERVICE_IFR_COMPONENTSS_T_H_
+
+#include /**/ "ace/pre.h"
+
+TAO_BEGIN_VERSIONED_NAMESPACE_DECL
+
+
+
+// TAO_IDL - Generated from
+// be\be_visitor_root/root_sth.cpp:116
+
+namespace POA_CORBA
+{
+
+ // TAO_IDL - Generated from
+ // be\be_visitor_root/root_sth.cpp:116
+
+ namespace ComponentIR
+ {
+
+ // TAO_IDL - Generated from
+ // be\be_visitor_interface/tie_sh.cpp:87
+
+ // TIE class: Refer to CORBA v2.2, Section 20.34.4
+ template <class T>
+ class EventDef_tie : public EventDef
+ {
+ public:
+ /// the T& ctor
+ EventDef_tie (T &t);
+ /// ctor taking a POA
+ EventDef_tie (T &t, PortableServer::POA_ptr poa);
+ /// ctor taking pointer and an ownership flag
+ EventDef_tie (T *tp, ::CORBA::Boolean release = true);
+ /// ctor with T*, ownership flag and a POA
+ EventDef_tie (
+ T *tp,
+ PortableServer::POA_ptr poa,
+ ::CORBA::Boolean release = true
+ );
+ /// dtor
+
+ ~EventDef_tie (void);
+ // TIE specific functions
+ /// return the underlying object
+ T *_tied_object (void);
+ /// set the underlying object
+ void _tied_object (T &obj);
+ /// set the underlying object and the ownership flag
+ void _tied_object (T *obj, ::CORBA::Boolean release = true);
+ /// do we own it
+ ::CORBA::Boolean _is_owner (void);
+ /// set the ownership
+
+ void _is_owner ( ::CORBA::Boolean b);
+ // overridden ServantBase operations
+ PortableServer::POA_ptr _default_POA (
+ ACE_ENV_SINGLE_ARG_DECL_WITH_DEFAULTS
+ );
+
+ // TAO_IDL - Generated from
+ // be\be_visitor_operation/tie_sh.cpp:60
+
+ ::CORBA::DefinitionKind def_kind (
+ ACE_ENV_SINGLE_ARG_DECL_WITH_DEFAULTS
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ));
+
+ // TAO_IDL - Generated from
+ // be\be_visitor_operation/tie_sh.cpp:60
+
+ void destroy (
+ ACE_ENV_SINGLE_ARG_DECL_WITH_DEFAULTS
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ));
+
+ // TAO_IDL - Generated from
+ // be\be_visitor_operation/tie_sh.cpp:60
+
+ ::CORBA::Contained_ptr lookup (
+ const char * search_name
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ));
+
+ // TAO_IDL - Generated from
+ // be\be_visitor_operation/tie_sh.cpp:60
+
+ ::CORBA::ContainedSeq * contents (
+ ::CORBA::DefinitionKind limit_type,
+ ::CORBA::Boolean exclude_inherited
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ));
+
+ // TAO_IDL - Generated from
+ // be\be_visitor_operation/tie_sh.cpp:60
+
+ ::CORBA::ContainedSeq * lookup_name (
+ const char * search_name,
+ ::CORBA::Long levels_to_search,
+ ::CORBA::DefinitionKind limit_type,
+ ::CORBA::Boolean exclude_inherited
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ));
+
+ // TAO_IDL - Generated from
+ // be\be_visitor_operation/tie_sh.cpp:60
+
+ ::CORBA::Container::DescriptionSeq * describe_contents (
+ ::CORBA::DefinitionKind limit_type,
+ ::CORBA::Boolean exclude_inherited,
+ ::CORBA::Long max_returned_objs
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ));
+
+ // TAO_IDL - Generated from
+ // be\be_visitor_operation/tie_sh.cpp:60
+
+ ::CORBA::ModuleDef_ptr create_module (
+ const char * id,
+ const char * name,
+ const char * version
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ));
+
+ // TAO_IDL - Generated from
+ // be\be_visitor_operation/tie_sh.cpp:60
+
+ ::CORBA::ConstantDef_ptr create_constant (
+ const char * id,
+ const char * name,
+ const char * version,
+ ::CORBA::IDLType_ptr type,
+ const ::CORBA::Any & value
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ));
+
+ // TAO_IDL - Generated from
+ // be\be_visitor_operation/tie_sh.cpp:60
+
+ ::CORBA::StructDef_ptr create_struct (
+ const char * id,
+ const char * name,
+ const char * version,
+ const ::CORBA::StructMemberSeq & members
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ));
+
+ // TAO_IDL - Generated from
+ // be\be_visitor_operation/tie_sh.cpp:60
+
+ ::CORBA::UnionDef_ptr create_union (
+ const char * id,
+ const char * name,
+ const char * version,
+ ::CORBA::IDLType_ptr discriminator_type,
+ const ::CORBA::UnionMemberSeq & members
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ));
+
+ // TAO_IDL - Generated from
+ // be\be_visitor_operation/tie_sh.cpp:60
+
+ ::CORBA::EnumDef_ptr create_enum (
+ const char * id,
+ const char * name,
+ const char * version,
+ const ::CORBA::EnumMemberSeq & members
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ));
+
+ // TAO_IDL - Generated from
+ // be\be_visitor_operation/tie_sh.cpp:60
+
+ ::CORBA::AliasDef_ptr create_alias (
+ const char * id,
+ const char * name,
+ const char * version,
+ ::CORBA::IDLType_ptr original_type
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ));
+
+ // TAO_IDL - Generated from
+ // be\be_visitor_operation/tie_sh.cpp:60
+
+ ::CORBA::InterfaceDef_ptr create_interface (
+ const char * id,
+ const char * name,
+ const char * version,
+ const ::CORBA::InterfaceDefSeq & base_interfaces
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ));
+
+ // TAO_IDL - Generated from
+ // be\be_visitor_operation/tie_sh.cpp:60
+
+ ::CORBA::ValueDef_ptr create_value (
+ const char * id,
+ const char * name,
+ const char * version,
+ ::CORBA::Boolean is_custom,
+ ::CORBA::Boolean is_abstract,
+ ::CORBA::ValueDef_ptr base_value,
+ ::CORBA::Boolean is_truncatable,
+ const ::CORBA::ValueDefSeq & abstract_base_values,
+ const ::CORBA::InterfaceDefSeq & supported_interfaces,
+ const ::CORBA::InitializerSeq & initializers
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ));
+
+ // TAO_IDL - Generated from
+ // be\be_visitor_operation/tie_sh.cpp:60
+
+ ::CORBA::ValueBoxDef_ptr create_value_box (
+ const char * id,
+ const char * name,
+ const char * version,
+ ::CORBA::IDLType_ptr original_type_def
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ));
+
+ // TAO_IDL - Generated from
+ // be\be_visitor_operation/tie_sh.cpp:60
+
+ ::CORBA::ExceptionDef_ptr create_exception (
+ const char * id,
+ const char * name,
+ const char * version,
+ const ::CORBA::StructMemberSeq & members
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ));
+
+ // TAO_IDL - Generated from
+ // be\be_visitor_operation/tie_sh.cpp:60
+
+ ::CORBA::NativeDef_ptr create_native (
+ const char * id,
+ const char * name,
+ const char * version
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ));
+
+ // TAO_IDL - Generated from
+ // be\be_visitor_operation/tie_sh.cpp:60
+
+ ::CORBA::AbstractInterfaceDef_ptr create_abstract_interface (
+ const char * id,
+ const char * name,
+ const char * version,
+ const ::CORBA::AbstractInterfaceDefSeq & base_interfaces
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ));
+
+ // TAO_IDL - Generated from
+ // be\be_visitor_operation/tie_sh.cpp:60
+
+ ::CORBA::LocalInterfaceDef_ptr create_local_interface (
+ const char * id,
+ const char * name,
+ const char * version,
+ const ::CORBA::InterfaceDefSeq & base_interfaces
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ));
+
+ // TAO_IDL - Generated from
+ // be\be_visitor_operation/tie_sh.cpp:60
+
+ ::CORBA::ExtValueDef_ptr create_ext_value (
+ const char * id,
+ const char * name,
+ const char * version,
+ ::CORBA::Boolean is_custom,
+ ::CORBA::Boolean is_abstract,
+ ::CORBA::ValueDef_ptr base_value,
+ ::CORBA::Boolean is_truncatable,
+ const ::CORBA::ValueDefSeq & abstract_base_values,
+ const ::CORBA::InterfaceDefSeq & supported_interfaces,
+ const ::CORBA::ExtInitializerSeq & initializers
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ));
+
+ // TAO_IDL - Generated from
+ // be\be_visitor_operation/tie_sh.cpp:60
+
+ char * id (
+ ACE_ENV_SINGLE_ARG_DECL_WITH_DEFAULTS
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ));
+
+ // TAO_IDL - Generated from
+ // be\be_visitor_operation/tie_sh.cpp:60
+
+ void id (
+ const char * id
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ));
+
+ // TAO_IDL - Generated from
+ // be\be_visitor_operation/tie_sh.cpp:60
+
+ char * name (
+ ACE_ENV_SINGLE_ARG_DECL_WITH_DEFAULTS
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ));
+
+ // TAO_IDL - Generated from
+ // be\be_visitor_operation/tie_sh.cpp:60
+
+ void name (
+ const char * name
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ));
+
+ // TAO_IDL - Generated from
+ // be\be_visitor_operation/tie_sh.cpp:60
+
+ char * version (
+ ACE_ENV_SINGLE_ARG_DECL_WITH_DEFAULTS
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ));
+
+ // TAO_IDL - Generated from
+ // be\be_visitor_operation/tie_sh.cpp:60
+
+ void version (
+ const char * version
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ));
+
+ // TAO_IDL - Generated from
+ // be\be_visitor_operation/tie_sh.cpp:60
+
+ ::CORBA::Container_ptr defined_in (
+ ACE_ENV_SINGLE_ARG_DECL_WITH_DEFAULTS
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ));
+
+ // TAO_IDL - Generated from
+ // be\be_visitor_operation/tie_sh.cpp:60
+
+ char * absolute_name (
+ ACE_ENV_SINGLE_ARG_DECL_WITH_DEFAULTS
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ));
+
+ // TAO_IDL - Generated from
+ // be\be_visitor_operation/tie_sh.cpp:60
+
+ ::CORBA::Repository_ptr containing_repository (
+ ACE_ENV_SINGLE_ARG_DECL_WITH_DEFAULTS
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ));
+
+ // TAO_IDL - Generated from
+ // be\be_visitor_operation/tie_sh.cpp:60
+
+ ::CORBA::Contained::Description * describe (
+ ACE_ENV_SINGLE_ARG_DECL_WITH_DEFAULTS
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ));
+
+ // TAO_IDL - Generated from
+ // be\be_visitor_operation/tie_sh.cpp:60
+
+ void move (
+ ::CORBA::Container_ptr new_container,
+ const char * new_name,
+ const char * new_version
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ));
+
+ // TAO_IDL - Generated from
+ // be\be_visitor_operation/tie_sh.cpp:60
+
+ ::CORBA::TypeCode_ptr type (
+ ACE_ENV_SINGLE_ARG_DECL_WITH_DEFAULTS
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ));
+
+ // TAO_IDL - Generated from
+ // be\be_visitor_operation/tie_sh.cpp:60
+
+ ::CORBA::InterfaceDefSeq * supported_interfaces (
+ ACE_ENV_SINGLE_ARG_DECL_WITH_DEFAULTS
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ));
+
+ // TAO_IDL - Generated from
+ // be\be_visitor_operation/tie_sh.cpp:60
+
+ void supported_interfaces (
+ const ::CORBA::InterfaceDefSeq & supported_interfaces
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ));
+
+ // TAO_IDL - Generated from
+ // be\be_visitor_operation/tie_sh.cpp:60
+
+ ::CORBA::InitializerSeq * initializers (
+ ACE_ENV_SINGLE_ARG_DECL_WITH_DEFAULTS
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ));
+
+ // TAO_IDL - Generated from
+ // be\be_visitor_operation/tie_sh.cpp:60
+
+ void initializers (
+ const ::CORBA::InitializerSeq & initializers
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ));
+
+ // TAO_IDL - Generated from
+ // be\be_visitor_operation/tie_sh.cpp:60
+
+ ::CORBA::ValueDef_ptr base_value (
+ ACE_ENV_SINGLE_ARG_DECL_WITH_DEFAULTS
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ));
+
+ // TAO_IDL - Generated from
+ // be\be_visitor_operation/tie_sh.cpp:60
+
+ void base_value (
+ ::CORBA::ValueDef_ptr base_value
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ));
+
+ // TAO_IDL - Generated from
+ // be\be_visitor_operation/tie_sh.cpp:60
+
+ ::CORBA::ValueDefSeq * abstract_base_values (
+ ACE_ENV_SINGLE_ARG_DECL_WITH_DEFAULTS
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ));
+
+ // TAO_IDL - Generated from
+ // be\be_visitor_operation/tie_sh.cpp:60
+
+ void abstract_base_values (
+ const ::CORBA::ValueDefSeq & abstract_base_values
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ));
+
+ // TAO_IDL - Generated from
+ // be\be_visitor_operation/tie_sh.cpp:60
+
+ ::CORBA::Boolean is_abstract (
+ ACE_ENV_SINGLE_ARG_DECL_WITH_DEFAULTS
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ));
+
+ // TAO_IDL - Generated from
+ // be\be_visitor_operation/tie_sh.cpp:60
+
+ void is_abstract (
+ ::CORBA::Boolean is_abstract
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ));
+
+ // TAO_IDL - Generated from
+ // be\be_visitor_operation/tie_sh.cpp:60
+
+ ::CORBA::Boolean is_custom (
+ ACE_ENV_SINGLE_ARG_DECL_WITH_DEFAULTS
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ));
+
+ // TAO_IDL - Generated from
+ // be\be_visitor_operation/tie_sh.cpp:60
+
+ void is_custom (
+ ::CORBA::Boolean is_custom
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ));
+
+ // TAO_IDL - Generated from
+ // be\be_visitor_operation/tie_sh.cpp:60
+
+ ::CORBA::Boolean is_truncatable (
+ ACE_ENV_SINGLE_ARG_DECL_WITH_DEFAULTS
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ));
+
+ // TAO_IDL - Generated from
+ // be\be_visitor_operation/tie_sh.cpp:60
+
+ void is_truncatable (
+ ::CORBA::Boolean is_truncatable
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ));
+
+ // TAO_IDL - Generated from
+ // be\be_visitor_operation/tie_sh.cpp:60
+
+ ::CORBA::Boolean is_a (
+ const char * id
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ));
+
+ // TAO_IDL - Generated from
+ // be\be_visitor_operation/tie_sh.cpp:60
+
+ ::CORBA::ValueDef::FullValueDescription * describe_value (
+ ACE_ENV_SINGLE_ARG_DECL_WITH_DEFAULTS
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ));
+
+ // TAO_IDL - Generated from
+ // be\be_visitor_operation/tie_sh.cpp:60
+
+ ::CORBA::ValueMemberDef_ptr create_value_member (
+ const char * id,
+ const char * name,
+ const char * version,
+ ::CORBA::IDLType_ptr type,
+ ::CORBA::Visibility access
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ));
+
+ // TAO_IDL - Generated from
+ // be\be_visitor_operation/tie_sh.cpp:60
+
+ ::CORBA::AttributeDef_ptr create_attribute (
+ const char * id,
+ const char * name,
+ const char * version,
+ ::CORBA::IDLType_ptr type,
+ ::CORBA::AttributeMode mode
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ));
+
+ // TAO_IDL - Generated from
+ // be\be_visitor_operation/tie_sh.cpp:60
+
+ ::CORBA::OperationDef_ptr create_operation (
+ const char * id,
+ const char * name,
+ const char * version,
+ ::CORBA::IDLType_ptr result,
+ ::CORBA::OperationMode mode,
+ const ::CORBA::ParDescriptionSeq & params,
+ const ::CORBA::ExceptionDefSeq & exceptions,
+ const ::CORBA::ContextIdSeq & contexts
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ));
+
+ // TAO_IDL - Generated from
+ // be\be_visitor_operation/tie_sh.cpp:60
+
+ ::CORBA::ExtInitializerSeq * ext_initializers (
+ ACE_ENV_SINGLE_ARG_DECL_WITH_DEFAULTS
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ));
+
+ // TAO_IDL - Generated from
+ // be\be_visitor_operation/tie_sh.cpp:60
+
+ void ext_initializers (
+ const ::CORBA::ExtInitializerSeq & ext_initializers
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ));
+
+ // TAO_IDL - Generated from
+ // be\be_visitor_operation/tie_sh.cpp:60
+
+ ::CORBA::ExtValueDef::ExtFullValueDescription * describe_ext_value (
+ ACE_ENV_SINGLE_ARG_DECL_WITH_DEFAULTS
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ));
+
+ // TAO_IDL - Generated from
+ // be\be_visitor_operation/tie_sh.cpp:60
+
+ ::CORBA::ExtAttributeDef_ptr create_ext_attribute (
+ const char * id,
+ const char * name,
+ const char * version,
+ ::CORBA::IDLType_ptr type,
+ ::CORBA::AttributeMode mode,
+ const ::CORBA::ExceptionDefSeq & get_exceptions,
+ const ::CORBA::ExceptionDefSeq & set_exceptions
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ));
+
+ private:
+ T *ptr_;
+ PortableServer::POA_var poa_;
+ ::CORBA::Boolean rel_;
+
+ // copy and assignment are not allowed
+ EventDef_tie (const EventDef_tie &);
+ void operator= (const EventDef_tie &);
+ };
+
+ // TAO_IDL - Generated from
+ // be\be_visitor_interface/tie_sh.cpp:87
+
+ // TIE class: Refer to CORBA v2.2, Section 20.34.4
+ template <class T>
+ class Container_tie : public Container
+ {
+ public:
+ /// the T& ctor
+ Container_tie (T &t);
+ /// ctor taking a POA
+ Container_tie (T &t, PortableServer::POA_ptr poa);
+ /// ctor taking pointer and an ownership flag
+ Container_tie (T *tp, ::CORBA::Boolean release = true);
+ /// ctor with T*, ownership flag and a POA
+ Container_tie (
+ T *tp,
+ PortableServer::POA_ptr poa,
+ ::CORBA::Boolean release = true
+ );
+ /// dtor
+
+ ~Container_tie (void);
+ // TIE specific functions
+ /// return the underlying object
+ T *_tied_object (void);
+ /// set the underlying object
+ void _tied_object (T &obj);
+ /// set the underlying object and the ownership flag
+ void _tied_object (T *obj, ::CORBA::Boolean release = true);
+ /// do we own it
+ ::CORBA::Boolean _is_owner (void);
+ /// set the ownership
+
+ void _is_owner ( ::CORBA::Boolean b);
+ // overridden ServantBase operations
+ PortableServer::POA_ptr _default_POA (
+ ACE_ENV_SINGLE_ARG_DECL_WITH_DEFAULTS
+ );
+
+ // TAO_IDL - Generated from
+ // be\be_visitor_operation/tie_sh.cpp:60
+
+ ::CORBA::DefinitionKind def_kind (
+ ACE_ENV_SINGLE_ARG_DECL_WITH_DEFAULTS
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ));
+
+ // TAO_IDL - Generated from
+ // be\be_visitor_operation/tie_sh.cpp:60
+
+ void destroy (
+ ACE_ENV_SINGLE_ARG_DECL_WITH_DEFAULTS
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ));
+
+ // TAO_IDL - Generated from
+ // be\be_visitor_operation/tie_sh.cpp:60
+
+ ::CORBA::Contained_ptr lookup (
+ const char * search_name
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ));
+
+ // TAO_IDL - Generated from
+ // be\be_visitor_operation/tie_sh.cpp:60
+
+ ::CORBA::ContainedSeq * contents (
+ ::CORBA::DefinitionKind limit_type,
+ ::CORBA::Boolean exclude_inherited
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ));
+
+ // TAO_IDL - Generated from
+ // be\be_visitor_operation/tie_sh.cpp:60
+
+ ::CORBA::ContainedSeq * lookup_name (
+ const char * search_name,
+ ::CORBA::Long levels_to_search,
+ ::CORBA::DefinitionKind limit_type,
+ ::CORBA::Boolean exclude_inherited
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ));
+
+ // TAO_IDL - Generated from
+ // be\be_visitor_operation/tie_sh.cpp:60
+
+ ::CORBA::Container::DescriptionSeq * describe_contents (
+ ::CORBA::DefinitionKind limit_type,
+ ::CORBA::Boolean exclude_inherited,
+ ::CORBA::Long max_returned_objs
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ));
+
+ // TAO_IDL - Generated from
+ // be\be_visitor_operation/tie_sh.cpp:60
+
+ ::CORBA::ModuleDef_ptr create_module (
+ const char * id,
+ const char * name,
+ const char * version
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ));
+
+ // TAO_IDL - Generated from
+ // be\be_visitor_operation/tie_sh.cpp:60
+
+ ::CORBA::ConstantDef_ptr create_constant (
+ const char * id,
+ const char * name,
+ const char * version,
+ ::CORBA::IDLType_ptr type,
+ const ::CORBA::Any & value
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ));
+
+ // TAO_IDL - Generated from
+ // be\be_visitor_operation/tie_sh.cpp:60
+
+ ::CORBA::StructDef_ptr create_struct (
+ const char * id,
+ const char * name,
+ const char * version,
+ const ::CORBA::StructMemberSeq & members
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ));
+
+ // TAO_IDL - Generated from
+ // be\be_visitor_operation/tie_sh.cpp:60
+
+ ::CORBA::UnionDef_ptr create_union (
+ const char * id,
+ const char * name,
+ const char * version,
+ ::CORBA::IDLType_ptr discriminator_type,
+ const ::CORBA::UnionMemberSeq & members
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ));
+
+ // TAO_IDL - Generated from
+ // be\be_visitor_operation/tie_sh.cpp:60
+
+ ::CORBA::EnumDef_ptr create_enum (
+ const char * id,
+ const char * name,
+ const char * version,
+ const ::CORBA::EnumMemberSeq & members
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ));
+
+ // TAO_IDL - Generated from
+ // be\be_visitor_operation/tie_sh.cpp:60
+
+ ::CORBA::AliasDef_ptr create_alias (
+ const char * id,
+ const char * name,
+ const char * version,
+ ::CORBA::IDLType_ptr original_type
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ));
+
+ // TAO_IDL - Generated from
+ // be\be_visitor_operation/tie_sh.cpp:60
+
+ ::CORBA::InterfaceDef_ptr create_interface (
+ const char * id,
+ const char * name,
+ const char * version,
+ const ::CORBA::InterfaceDefSeq & base_interfaces
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ));
+
+ // TAO_IDL - Generated from
+ // be\be_visitor_operation/tie_sh.cpp:60
+
+ ::CORBA::ValueDef_ptr create_value (
+ const char * id,
+ const char * name,
+ const char * version,
+ ::CORBA::Boolean is_custom,
+ ::CORBA::Boolean is_abstract,
+ ::CORBA::ValueDef_ptr base_value,
+ ::CORBA::Boolean is_truncatable,
+ const ::CORBA::ValueDefSeq & abstract_base_values,
+ const ::CORBA::InterfaceDefSeq & supported_interfaces,
+ const ::CORBA::InitializerSeq & initializers
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ));
+
+ // TAO_IDL - Generated from
+ // be\be_visitor_operation/tie_sh.cpp:60
+
+ ::CORBA::ValueBoxDef_ptr create_value_box (
+ const char * id,
+ const char * name,
+ const char * version,
+ ::CORBA::IDLType_ptr original_type_def
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ));
+
+ // TAO_IDL - Generated from
+ // be\be_visitor_operation/tie_sh.cpp:60
+
+ ::CORBA::ExceptionDef_ptr create_exception (
+ const char * id,
+ const char * name,
+ const char * version,
+ const ::CORBA::StructMemberSeq & members
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ));
+
+ // TAO_IDL - Generated from
+ // be\be_visitor_operation/tie_sh.cpp:60
+
+ ::CORBA::NativeDef_ptr create_native (
+ const char * id,
+ const char * name,
+ const char * version
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ));
+
+ // TAO_IDL - Generated from
+ // be\be_visitor_operation/tie_sh.cpp:60
+
+ ::CORBA::AbstractInterfaceDef_ptr create_abstract_interface (
+ const char * id,
+ const char * name,
+ const char * version,
+ const ::CORBA::AbstractInterfaceDefSeq & base_interfaces
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ));
+
+ // TAO_IDL - Generated from
+ // be\be_visitor_operation/tie_sh.cpp:60
+
+ ::CORBA::LocalInterfaceDef_ptr create_local_interface (
+ const char * id,
+ const char * name,
+ const char * version,
+ const ::CORBA::InterfaceDefSeq & base_interfaces
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ));
+
+ // TAO_IDL - Generated from
+ // be\be_visitor_operation/tie_sh.cpp:60
+
+ ::CORBA::ExtValueDef_ptr create_ext_value (
+ const char * id,
+ const char * name,
+ const char * version,
+ ::CORBA::Boolean is_custom,
+ ::CORBA::Boolean is_abstract,
+ ::CORBA::ValueDef_ptr base_value,
+ ::CORBA::Boolean is_truncatable,
+ const ::CORBA::ValueDefSeq & abstract_base_values,
+ const ::CORBA::InterfaceDefSeq & supported_interfaces,
+ const ::CORBA::ExtInitializerSeq & initializers
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ));
+
+ // TAO_IDL - Generated from
+ // be\be_visitor_operation/tie_sh.cpp:60
+
+ ::CORBA::ComponentIR::ComponentDef_ptr create_component (
+ const char * id,
+ const char * name,
+ const char * version,
+ ::CORBA::ComponentIR::ComponentDef_ptr base_component,
+ const ::CORBA::InterfaceDefSeq & supports_interfaces
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ));
+
+ // TAO_IDL - Generated from
+ // be\be_visitor_operation/tie_sh.cpp:60
+
+ ::CORBA::ComponentIR::HomeDef_ptr create_home (
+ const char * id,
+ const char * name,
+ const char * version,
+ ::CORBA::ComponentIR::HomeDef_ptr base_home,
+ ::CORBA::ComponentIR::ComponentDef_ptr managed_component,
+ const ::CORBA::InterfaceDefSeq & supports_interfaces,
+ ::CORBA::ValueDef_ptr primary_key
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ));
+
+ // TAO_IDL - Generated from
+ // be\be_visitor_operation/tie_sh.cpp:60
+
+ ::CORBA::ComponentIR::EventDef_ptr create_event (
+ const char * id,
+ const char * name,
+ const char * version,
+ ::CORBA::Boolean is_custom,
+ ::CORBA::Boolean is_abstract,
+ ::CORBA::ValueDef_ptr base_value,
+ ::CORBA::Boolean is_truncatable,
+ const ::CORBA::ValueDefSeq & abstract_base_values,
+ const ::CORBA::InterfaceDefSeq & supported_interfaces,
+ const ::CORBA::ExtInitializerSeq & initializers
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ));
+
+ private:
+ T *ptr_;
+ PortableServer::POA_var poa_;
+ ::CORBA::Boolean rel_;
+
+ // copy and assignment are not allowed
+ Container_tie (const Container_tie &);
+ void operator= (const Container_tie &);
+ };
+
+ // TAO_IDL - Generated from
+ // be\be_visitor_interface/tie_sh.cpp:87
+
+ // TIE class: Refer to CORBA v2.2, Section 20.34.4
+ template <class T>
+ class ModuleDef_tie : public ModuleDef
+ {
+ public:
+ /// the T& ctor
+ ModuleDef_tie (T &t);
+ /// ctor taking a POA
+ ModuleDef_tie (T &t, PortableServer::POA_ptr poa);
+ /// ctor taking pointer and an ownership flag
+ ModuleDef_tie (T *tp, ::CORBA::Boolean release = true);
+ /// ctor with T*, ownership flag and a POA
+ ModuleDef_tie (
+ T *tp,
+ PortableServer::POA_ptr poa,
+ ::CORBA::Boolean release = true
+ );
+ /// dtor
+
+ ~ModuleDef_tie (void);
+ // TIE specific functions
+ /// return the underlying object
+ T *_tied_object (void);
+ /// set the underlying object
+ void _tied_object (T &obj);
+ /// set the underlying object and the ownership flag
+ void _tied_object (T *obj, ::CORBA::Boolean release = true);
+ /// do we own it
+ ::CORBA::Boolean _is_owner (void);
+ /// set the ownership
+
+ void _is_owner ( ::CORBA::Boolean b);
+ // overridden ServantBase operations
+ PortableServer::POA_ptr _default_POA (
+ ACE_ENV_SINGLE_ARG_DECL_WITH_DEFAULTS
+ );
+
+ // TAO_IDL - Generated from
+ // be\be_visitor_operation/tie_sh.cpp:60
+
+ ::CORBA::DefinitionKind def_kind (
+ ACE_ENV_SINGLE_ARG_DECL_WITH_DEFAULTS
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ));
+
+ // TAO_IDL - Generated from
+ // be\be_visitor_operation/tie_sh.cpp:60
+
+ void destroy (
+ ACE_ENV_SINGLE_ARG_DECL_WITH_DEFAULTS
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ));
+
+ // TAO_IDL - Generated from
+ // be\be_visitor_operation/tie_sh.cpp:60
+
+ ::CORBA::Contained_ptr lookup (
+ const char * search_name
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ));
+
+ // TAO_IDL - Generated from
+ // be\be_visitor_operation/tie_sh.cpp:60
+
+ ::CORBA::ContainedSeq * contents (
+ ::CORBA::DefinitionKind limit_type,
+ ::CORBA::Boolean exclude_inherited
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ));
+
+ // TAO_IDL - Generated from
+ // be\be_visitor_operation/tie_sh.cpp:60
+
+ ::CORBA::ContainedSeq * lookup_name (
+ const char * search_name,
+ ::CORBA::Long levels_to_search,
+ ::CORBA::DefinitionKind limit_type,
+ ::CORBA::Boolean exclude_inherited
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ));
+
+ // TAO_IDL - Generated from
+ // be\be_visitor_operation/tie_sh.cpp:60
+
+ ::CORBA::Container::DescriptionSeq * describe_contents (
+ ::CORBA::DefinitionKind limit_type,
+ ::CORBA::Boolean exclude_inherited,
+ ::CORBA::Long max_returned_objs
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ));
+
+ // TAO_IDL - Generated from
+ // be\be_visitor_operation/tie_sh.cpp:60
+
+ ::CORBA::ModuleDef_ptr create_module (
+ const char * id,
+ const char * name,
+ const char * version
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ));
+
+ // TAO_IDL - Generated from
+ // be\be_visitor_operation/tie_sh.cpp:60
+
+ ::CORBA::ConstantDef_ptr create_constant (
+ const char * id,
+ const char * name,
+ const char * version,
+ ::CORBA::IDLType_ptr type,
+ const ::CORBA::Any & value
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ));
+
+ // TAO_IDL - Generated from
+ // be\be_visitor_operation/tie_sh.cpp:60
+
+ ::CORBA::StructDef_ptr create_struct (
+ const char * id,
+ const char * name,
+ const char * version,
+ const ::CORBA::StructMemberSeq & members
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ));
+
+ // TAO_IDL - Generated from
+ // be\be_visitor_operation/tie_sh.cpp:60
+
+ ::CORBA::UnionDef_ptr create_union (
+ const char * id,
+ const char * name,
+ const char * version,
+ ::CORBA::IDLType_ptr discriminator_type,
+ const ::CORBA::UnionMemberSeq & members
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ));
+
+ // TAO_IDL - Generated from
+ // be\be_visitor_operation/tie_sh.cpp:60
+
+ ::CORBA::EnumDef_ptr create_enum (
+ const char * id,
+ const char * name,
+ const char * version,
+ const ::CORBA::EnumMemberSeq & members
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ));
+
+ // TAO_IDL - Generated from
+ // be\be_visitor_operation/tie_sh.cpp:60
+
+ ::CORBA::AliasDef_ptr create_alias (
+ const char * id,
+ const char * name,
+ const char * version,
+ ::CORBA::IDLType_ptr original_type
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ));
+
+ // TAO_IDL - Generated from
+ // be\be_visitor_operation/tie_sh.cpp:60
+
+ ::CORBA::InterfaceDef_ptr create_interface (
+ const char * id,
+ const char * name,
+ const char * version,
+ const ::CORBA::InterfaceDefSeq & base_interfaces
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ));
+
+ // TAO_IDL - Generated from
+ // be\be_visitor_operation/tie_sh.cpp:60
+
+ ::CORBA::ValueDef_ptr create_value (
+ const char * id,
+ const char * name,
+ const char * version,
+ ::CORBA::Boolean is_custom,
+ ::CORBA::Boolean is_abstract,
+ ::CORBA::ValueDef_ptr base_value,
+ ::CORBA::Boolean is_truncatable,
+ const ::CORBA::ValueDefSeq & abstract_base_values,
+ const ::CORBA::InterfaceDefSeq & supported_interfaces,
+ const ::CORBA::InitializerSeq & initializers
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ));
+
+ // TAO_IDL - Generated from
+ // be\be_visitor_operation/tie_sh.cpp:60
+
+ ::CORBA::ValueBoxDef_ptr create_value_box (
+ const char * id,
+ const char * name,
+ const char * version,
+ ::CORBA::IDLType_ptr original_type_def
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ));
+
+ // TAO_IDL - Generated from
+ // be\be_visitor_operation/tie_sh.cpp:60
+
+ ::CORBA::ExceptionDef_ptr create_exception (
+ const char * id,
+ const char * name,
+ const char * version,
+ const ::CORBA::StructMemberSeq & members
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ));
+
+ // TAO_IDL - Generated from
+ // be\be_visitor_operation/tie_sh.cpp:60
+
+ ::CORBA::NativeDef_ptr create_native (
+ const char * id,
+ const char * name,
+ const char * version
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ));
+
+ // TAO_IDL - Generated from
+ // be\be_visitor_operation/tie_sh.cpp:60
+
+ ::CORBA::AbstractInterfaceDef_ptr create_abstract_interface (
+ const char * id,
+ const char * name,
+ const char * version,
+ const ::CORBA::AbstractInterfaceDefSeq & base_interfaces
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ));
+
+ // TAO_IDL - Generated from
+ // be\be_visitor_operation/tie_sh.cpp:60
+
+ ::CORBA::LocalInterfaceDef_ptr create_local_interface (
+ const char * id,
+ const char * name,
+ const char * version,
+ const ::CORBA::InterfaceDefSeq & base_interfaces
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ));
+
+ // TAO_IDL - Generated from
+ // be\be_visitor_operation/tie_sh.cpp:60
+
+ ::CORBA::ExtValueDef_ptr create_ext_value (
+ const char * id,
+ const char * name,
+ const char * version,
+ ::CORBA::Boolean is_custom,
+ ::CORBA::Boolean is_abstract,
+ ::CORBA::ValueDef_ptr base_value,
+ ::CORBA::Boolean is_truncatable,
+ const ::CORBA::ValueDefSeq & abstract_base_values,
+ const ::CORBA::InterfaceDefSeq & supported_interfaces,
+ const ::CORBA::ExtInitializerSeq & initializers
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ));
+
+ // TAO_IDL - Generated from
+ // be\be_visitor_operation/tie_sh.cpp:60
+
+ char * id (
+ ACE_ENV_SINGLE_ARG_DECL_WITH_DEFAULTS
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ));
+
+ // TAO_IDL - Generated from
+ // be\be_visitor_operation/tie_sh.cpp:60
+
+ void id (
+ const char * id
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ));
+
+ // TAO_IDL - Generated from
+ // be\be_visitor_operation/tie_sh.cpp:60
+
+ char * name (
+ ACE_ENV_SINGLE_ARG_DECL_WITH_DEFAULTS
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ));
+
+ // TAO_IDL - Generated from
+ // be\be_visitor_operation/tie_sh.cpp:60
+
+ void name (
+ const char * name
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ));
+
+ // TAO_IDL - Generated from
+ // be\be_visitor_operation/tie_sh.cpp:60
+
+ char * version (
+ ACE_ENV_SINGLE_ARG_DECL_WITH_DEFAULTS
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ));
+
+ // TAO_IDL - Generated from
+ // be\be_visitor_operation/tie_sh.cpp:60
+
+ void version (
+ const char * version
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ));
+
+ // TAO_IDL - Generated from
+ // be\be_visitor_operation/tie_sh.cpp:60
+
+ ::CORBA::Container_ptr defined_in (
+ ACE_ENV_SINGLE_ARG_DECL_WITH_DEFAULTS
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ));
+
+ // TAO_IDL - Generated from
+ // be\be_visitor_operation/tie_sh.cpp:60
+
+ char * absolute_name (
+ ACE_ENV_SINGLE_ARG_DECL_WITH_DEFAULTS
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ));
+
+ // TAO_IDL - Generated from
+ // be\be_visitor_operation/tie_sh.cpp:60
+
+ ::CORBA::Repository_ptr containing_repository (
+ ACE_ENV_SINGLE_ARG_DECL_WITH_DEFAULTS
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ));
+
+ // TAO_IDL - Generated from
+ // be\be_visitor_operation/tie_sh.cpp:60
+
+ ::CORBA::Contained::Description * describe (
+ ACE_ENV_SINGLE_ARG_DECL_WITH_DEFAULTS
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ));
+
+ // TAO_IDL - Generated from
+ // be\be_visitor_operation/tie_sh.cpp:60
+
+ void move (
+ ::CORBA::Container_ptr new_container,
+ const char * new_name,
+ const char * new_version
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ));
+
+ // TAO_IDL - Generated from
+ // be\be_visitor_operation/tie_sh.cpp:60
+
+ ::CORBA::ComponentIR::ComponentDef_ptr create_component (
+ const char * id,
+ const char * name,
+ const char * version,
+ ::CORBA::ComponentIR::ComponentDef_ptr base_component,
+ const ::CORBA::InterfaceDefSeq & supports_interfaces
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ));
+
+ // TAO_IDL - Generated from
+ // be\be_visitor_operation/tie_sh.cpp:60
+
+ ::CORBA::ComponentIR::HomeDef_ptr create_home (
+ const char * id,
+ const char * name,
+ const char * version,
+ ::CORBA::ComponentIR::HomeDef_ptr base_home,
+ ::CORBA::ComponentIR::ComponentDef_ptr managed_component,
+ const ::CORBA::InterfaceDefSeq & supports_interfaces,
+ ::CORBA::ValueDef_ptr primary_key
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ));
+
+ // TAO_IDL - Generated from
+ // be\be_visitor_operation/tie_sh.cpp:60
+
+ ::CORBA::ComponentIR::EventDef_ptr create_event (
+ const char * id,
+ const char * name,
+ const char * version,
+ ::CORBA::Boolean is_custom,
+ ::CORBA::Boolean is_abstract,
+ ::CORBA::ValueDef_ptr base_value,
+ ::CORBA::Boolean is_truncatable,
+ const ::CORBA::ValueDefSeq & abstract_base_values,
+ const ::CORBA::InterfaceDefSeq & supported_interfaces,
+ const ::CORBA::ExtInitializerSeq & initializers
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ));
+
+ private:
+ T *ptr_;
+ PortableServer::POA_var poa_;
+ ::CORBA::Boolean rel_;
+
+ // copy and assignment are not allowed
+ ModuleDef_tie (const ModuleDef_tie &);
+ void operator= (const ModuleDef_tie &);
+ };
+
+ // TAO_IDL - Generated from
+ // be\be_visitor_interface/tie_sh.cpp:87
+
+ // TIE class: Refer to CORBA v2.2, Section 20.34.4
+ template <class T>
+ class Repository_tie : public Repository
+ {
+ public:
+ /// the T& ctor
+ Repository_tie (T &t);
+ /// ctor taking a POA
+ Repository_tie (T &t, PortableServer::POA_ptr poa);
+ /// ctor taking pointer and an ownership flag
+ Repository_tie (T *tp, ::CORBA::Boolean release = true);
+ /// ctor with T*, ownership flag and a POA
+ Repository_tie (
+ T *tp,
+ PortableServer::POA_ptr poa,
+ ::CORBA::Boolean release = true
+ );
+ /// dtor
+
+ ~Repository_tie (void);
+ // TIE specific functions
+ /// return the underlying object
+ T *_tied_object (void);
+ /// set the underlying object
+ void _tied_object (T &obj);
+ /// set the underlying object and the ownership flag
+ void _tied_object (T *obj, ::CORBA::Boolean release = true);
+ /// do we own it
+ ::CORBA::Boolean _is_owner (void);
+ /// set the ownership
+
+ void _is_owner ( ::CORBA::Boolean b);
+ // overridden ServantBase operations
+ PortableServer::POA_ptr _default_POA (
+ ACE_ENV_SINGLE_ARG_DECL_WITH_DEFAULTS
+ );
+
+ // TAO_IDL - Generated from
+ // be\be_visitor_operation/tie_sh.cpp:60
+
+ ::CORBA::DefinitionKind def_kind (
+ ACE_ENV_SINGLE_ARG_DECL_WITH_DEFAULTS
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ));
+
+ // TAO_IDL - Generated from
+ // be\be_visitor_operation/tie_sh.cpp:60
+
+ void destroy (
+ ACE_ENV_SINGLE_ARG_DECL_WITH_DEFAULTS
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ));
+
+ // TAO_IDL - Generated from
+ // be\be_visitor_operation/tie_sh.cpp:60
+
+ ::CORBA::Contained_ptr lookup (
+ const char * search_name
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ));
+
+ // TAO_IDL - Generated from
+ // be\be_visitor_operation/tie_sh.cpp:60
+
+ ::CORBA::ContainedSeq * contents (
+ ::CORBA::DefinitionKind limit_type,
+ ::CORBA::Boolean exclude_inherited
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ));
+
+ // TAO_IDL - Generated from
+ // be\be_visitor_operation/tie_sh.cpp:60
+
+ ::CORBA::ContainedSeq * lookup_name (
+ const char * search_name,
+ ::CORBA::Long levels_to_search,
+ ::CORBA::DefinitionKind limit_type,
+ ::CORBA::Boolean exclude_inherited
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ));
+
+ // TAO_IDL - Generated from
+ // be\be_visitor_operation/tie_sh.cpp:60
+
+ ::CORBA::Container::DescriptionSeq * describe_contents (
+ ::CORBA::DefinitionKind limit_type,
+ ::CORBA::Boolean exclude_inherited,
+ ::CORBA::Long max_returned_objs
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ));
+
+ // TAO_IDL - Generated from
+ // be\be_visitor_operation/tie_sh.cpp:60
+
+ ::CORBA::ModuleDef_ptr create_module (
+ const char * id,
+ const char * name,
+ const char * version
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ));
+
+ // TAO_IDL - Generated from
+ // be\be_visitor_operation/tie_sh.cpp:60
+
+ ::CORBA::ConstantDef_ptr create_constant (
+ const char * id,
+ const char * name,
+ const char * version,
+ ::CORBA::IDLType_ptr type,
+ const ::CORBA::Any & value
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ));
+
+ // TAO_IDL - Generated from
+ // be\be_visitor_operation/tie_sh.cpp:60
+
+ ::CORBA::StructDef_ptr create_struct (
+ const char * id,
+ const char * name,
+ const char * version,
+ const ::CORBA::StructMemberSeq & members
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ));
+
+ // TAO_IDL - Generated from
+ // be\be_visitor_operation/tie_sh.cpp:60
+
+ ::CORBA::UnionDef_ptr create_union (
+ const char * id,
+ const char * name,
+ const char * version,
+ ::CORBA::IDLType_ptr discriminator_type,
+ const ::CORBA::UnionMemberSeq & members
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ));
+
+ // TAO_IDL - Generated from
+ // be\be_visitor_operation/tie_sh.cpp:60
+
+ ::CORBA::EnumDef_ptr create_enum (
+ const char * id,
+ const char * name,
+ const char * version,
+ const ::CORBA::EnumMemberSeq & members
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ));
+
+ // TAO_IDL - Generated from
+ // be\be_visitor_operation/tie_sh.cpp:60
+
+ ::CORBA::AliasDef_ptr create_alias (
+ const char * id,
+ const char * name,
+ const char * version,
+ ::CORBA::IDLType_ptr original_type
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ));
+
+ // TAO_IDL - Generated from
+ // be\be_visitor_operation/tie_sh.cpp:60
+
+ ::CORBA::InterfaceDef_ptr create_interface (
+ const char * id,
+ const char * name,
+ const char * version,
+ const ::CORBA::InterfaceDefSeq & base_interfaces
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ));
+
+ // TAO_IDL - Generated from
+ // be\be_visitor_operation/tie_sh.cpp:60
+
+ ::CORBA::ValueDef_ptr create_value (
+ const char * id,
+ const char * name,
+ const char * version,
+ ::CORBA::Boolean is_custom,
+ ::CORBA::Boolean is_abstract,
+ ::CORBA::ValueDef_ptr base_value,
+ ::CORBA::Boolean is_truncatable,
+ const ::CORBA::ValueDefSeq & abstract_base_values,
+ const ::CORBA::InterfaceDefSeq & supported_interfaces,
+ const ::CORBA::InitializerSeq & initializers
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ));
+
+ // TAO_IDL - Generated from
+ // be\be_visitor_operation/tie_sh.cpp:60
+
+ ::CORBA::ValueBoxDef_ptr create_value_box (
+ const char * id,
+ const char * name,
+ const char * version,
+ ::CORBA::IDLType_ptr original_type_def
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ));
+
+ // TAO_IDL - Generated from
+ // be\be_visitor_operation/tie_sh.cpp:60
+
+ ::CORBA::ExceptionDef_ptr create_exception (
+ const char * id,
+ const char * name,
+ const char * version,
+ const ::CORBA::StructMemberSeq & members
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ));
+
+ // TAO_IDL - Generated from
+ // be\be_visitor_operation/tie_sh.cpp:60
+
+ ::CORBA::NativeDef_ptr create_native (
+ const char * id,
+ const char * name,
+ const char * version
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ));
+
+ // TAO_IDL - Generated from
+ // be\be_visitor_operation/tie_sh.cpp:60
+
+ ::CORBA::AbstractInterfaceDef_ptr create_abstract_interface (
+ const char * id,
+ const char * name,
+ const char * version,
+ const ::CORBA::AbstractInterfaceDefSeq & base_interfaces
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ));
+
+ // TAO_IDL - Generated from
+ // be\be_visitor_operation/tie_sh.cpp:60
+
+ ::CORBA::LocalInterfaceDef_ptr create_local_interface (
+ const char * id,
+ const char * name,
+ const char * version,
+ const ::CORBA::InterfaceDefSeq & base_interfaces
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ));
+
+ // TAO_IDL - Generated from
+ // be\be_visitor_operation/tie_sh.cpp:60
+
+ ::CORBA::ExtValueDef_ptr create_ext_value (
+ const char * id,
+ const char * name,
+ const char * version,
+ ::CORBA::Boolean is_custom,
+ ::CORBA::Boolean is_abstract,
+ ::CORBA::ValueDef_ptr base_value,
+ ::CORBA::Boolean is_truncatable,
+ const ::CORBA::ValueDefSeq & abstract_base_values,
+ const ::CORBA::InterfaceDefSeq & supported_interfaces,
+ const ::CORBA::ExtInitializerSeq & initializers
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ));
+
+ // TAO_IDL - Generated from
+ // be\be_visitor_operation/tie_sh.cpp:60
+
+ ::CORBA::Contained_ptr lookup_id (
+ const char * search_id
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ));
+
+ // TAO_IDL - Generated from
+ // be\be_visitor_operation/tie_sh.cpp:60
+
+ ::CORBA::TypeCode_ptr get_canonical_typecode (
+ ::CORBA::TypeCode_ptr tc
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ));
+
+ // TAO_IDL - Generated from
+ // be\be_visitor_operation/tie_sh.cpp:60
+
+ ::CORBA::PrimitiveDef_ptr get_primitive (
+ ::CORBA::PrimitiveKind kind
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ));
+
+ // TAO_IDL - Generated from
+ // be\be_visitor_operation/tie_sh.cpp:60
+
+ ::CORBA::StringDef_ptr create_string (
+ ::CORBA::ULong bound
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ));
+
+ // TAO_IDL - Generated from
+ // be\be_visitor_operation/tie_sh.cpp:60
+
+ ::CORBA::WstringDef_ptr create_wstring (
+ ::CORBA::ULong bound
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ));
+
+ // TAO_IDL - Generated from
+ // be\be_visitor_operation/tie_sh.cpp:60
+
+ ::CORBA::SequenceDef_ptr create_sequence (
+ ::CORBA::ULong bound,
+ ::CORBA::IDLType_ptr element_type
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ));
+
+ // TAO_IDL - Generated from
+ // be\be_visitor_operation/tie_sh.cpp:60
+
+ ::CORBA::ArrayDef_ptr create_array (
+ ::CORBA::ULong length,
+ ::CORBA::IDLType_ptr element_type
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ));
+
+ // TAO_IDL - Generated from
+ // be\be_visitor_operation/tie_sh.cpp:60
+
+ ::CORBA::FixedDef_ptr create_fixed (
+ ::CORBA::UShort digits,
+ ::CORBA::Short scale
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ));
+
+ // TAO_IDL - Generated from
+ // be\be_visitor_operation/tie_sh.cpp:60
+
+ ::CORBA::ComponentIR::ComponentDef_ptr create_component (
+ const char * id,
+ const char * name,
+ const char * version,
+ ::CORBA::ComponentIR::ComponentDef_ptr base_component,
+ const ::CORBA::InterfaceDefSeq & supports_interfaces
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ));
+
+ // TAO_IDL - Generated from
+ // be\be_visitor_operation/tie_sh.cpp:60
+
+ ::CORBA::ComponentIR::HomeDef_ptr create_home (
+ const char * id,
+ const char * name,
+ const char * version,
+ ::CORBA::ComponentIR::HomeDef_ptr base_home,
+ ::CORBA::ComponentIR::ComponentDef_ptr managed_component,
+ const ::CORBA::InterfaceDefSeq & supports_interfaces,
+ ::CORBA::ValueDef_ptr primary_key
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ));
+
+ // TAO_IDL - Generated from
+ // be\be_visitor_operation/tie_sh.cpp:60
+
+ ::CORBA::ComponentIR::EventDef_ptr create_event (
+ const char * id,
+ const char * name,
+ const char * version,
+ ::CORBA::Boolean is_custom,
+ ::CORBA::Boolean is_abstract,
+ ::CORBA::ValueDef_ptr base_value,
+ ::CORBA::Boolean is_truncatable,
+ const ::CORBA::ValueDefSeq & abstract_base_values,
+ const ::CORBA::InterfaceDefSeq & supported_interfaces,
+ const ::CORBA::ExtInitializerSeq & initializers
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ));
+
+ private:
+ T *ptr_;
+ PortableServer::POA_var poa_;
+ ::CORBA::Boolean rel_;
+
+ // copy and assignment are not allowed
+ Repository_tie (const Repository_tie &);
+ void operator= (const Repository_tie &);
+ };
+
+ // TAO_IDL - Generated from
+ // be\be_visitor_interface/tie_sh.cpp:87
+
+ // TIE class: Refer to CORBA v2.2, Section 20.34.4
+ template <class T>
+ class ProvidesDef_tie : public ProvidesDef
+ {
+ public:
+ /// the T& ctor
+ ProvidesDef_tie (T &t);
+ /// ctor taking a POA
+ ProvidesDef_tie (T &t, PortableServer::POA_ptr poa);
+ /// ctor taking pointer and an ownership flag
+ ProvidesDef_tie (T *tp, ::CORBA::Boolean release = true);
+ /// ctor with T*, ownership flag and a POA
+ ProvidesDef_tie (
+ T *tp,
+ PortableServer::POA_ptr poa,
+ ::CORBA::Boolean release = true
+ );
+ /// dtor
+
+ ~ProvidesDef_tie (void);
+ // TIE specific functions
+ /// return the underlying object
+ T *_tied_object (void);
+ /// set the underlying object
+ void _tied_object (T &obj);
+ /// set the underlying object and the ownership flag
+ void _tied_object (T *obj, ::CORBA::Boolean release = true);
+ /// do we own it
+ ::CORBA::Boolean _is_owner (void);
+ /// set the ownership
+
+ void _is_owner ( ::CORBA::Boolean b);
+ // overridden ServantBase operations
+ PortableServer::POA_ptr _default_POA (
+ ACE_ENV_SINGLE_ARG_DECL_WITH_DEFAULTS
+ );
+
+ // TAO_IDL - Generated from
+ // be\be_visitor_operation/tie_sh.cpp:60
+
+ ::CORBA::DefinitionKind def_kind (
+ ACE_ENV_SINGLE_ARG_DECL_WITH_DEFAULTS
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ));
+
+ // TAO_IDL - Generated from
+ // be\be_visitor_operation/tie_sh.cpp:60
+
+ void destroy (
+ ACE_ENV_SINGLE_ARG_DECL_WITH_DEFAULTS
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ));
+
+ // TAO_IDL - Generated from
+ // be\be_visitor_operation/tie_sh.cpp:60
+
+ char * id (
+ ACE_ENV_SINGLE_ARG_DECL_WITH_DEFAULTS
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ));
+
+ // TAO_IDL - Generated from
+ // be\be_visitor_operation/tie_sh.cpp:60
+
+ void id (
+ const char * id
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ));
+
+ // TAO_IDL - Generated from
+ // be\be_visitor_operation/tie_sh.cpp:60
+
+ char * name (
+ ACE_ENV_SINGLE_ARG_DECL_WITH_DEFAULTS
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ));
+
+ // TAO_IDL - Generated from
+ // be\be_visitor_operation/tie_sh.cpp:60
+
+ void name (
+ const char * name
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ));
+
+ // TAO_IDL - Generated from
+ // be\be_visitor_operation/tie_sh.cpp:60
+
+ char * version (
+ ACE_ENV_SINGLE_ARG_DECL_WITH_DEFAULTS
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ));
+
+ // TAO_IDL - Generated from
+ // be\be_visitor_operation/tie_sh.cpp:60
+
+ void version (
+ const char * version
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ));
+
+ // TAO_IDL - Generated from
+ // be\be_visitor_operation/tie_sh.cpp:60
+
+ ::CORBA::Container_ptr defined_in (
+ ACE_ENV_SINGLE_ARG_DECL_WITH_DEFAULTS
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ));
+
+ // TAO_IDL - Generated from
+ // be\be_visitor_operation/tie_sh.cpp:60
+
+ char * absolute_name (
+ ACE_ENV_SINGLE_ARG_DECL_WITH_DEFAULTS
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ));
+
+ // TAO_IDL - Generated from
+ // be\be_visitor_operation/tie_sh.cpp:60
+
+ ::CORBA::Repository_ptr containing_repository (
+ ACE_ENV_SINGLE_ARG_DECL_WITH_DEFAULTS
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ));
+
+ // TAO_IDL - Generated from
+ // be\be_visitor_operation/tie_sh.cpp:60
+
+ ::CORBA::Contained::Description * describe (
+ ACE_ENV_SINGLE_ARG_DECL_WITH_DEFAULTS
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ));
+
+ // TAO_IDL - Generated from
+ // be\be_visitor_operation/tie_sh.cpp:60
+
+ void move (
+ ::CORBA::Container_ptr new_container,
+ const char * new_name,
+ const char * new_version
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ));
+
+ // TAO_IDL - Generated from
+ // be\be_visitor_operation/tie_sh.cpp:60
+
+ ::CORBA::InterfaceDef_ptr interface_type (
+ ACE_ENV_SINGLE_ARG_DECL_WITH_DEFAULTS
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ));
+
+ // TAO_IDL - Generated from
+ // be\be_visitor_operation/tie_sh.cpp:60
+
+ void interface_type (
+ ::CORBA::InterfaceDef_ptr interface_type
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ));
+
+ private:
+ T *ptr_;
+ PortableServer::POA_var poa_;
+ ::CORBA::Boolean rel_;
+
+ // copy and assignment are not allowed
+ ProvidesDef_tie (const ProvidesDef_tie &);
+ void operator= (const ProvidesDef_tie &);
+ };
+
+ // TAO_IDL - Generated from
+ // be\be_visitor_interface/tie_sh.cpp:87
+
+ // TIE class: Refer to CORBA v2.2, Section 20.34.4
+ template <class T>
+ class UsesDef_tie : public UsesDef
+ {
+ public:
+ /// the T& ctor
+ UsesDef_tie (T &t);
+ /// ctor taking a POA
+ UsesDef_tie (T &t, PortableServer::POA_ptr poa);
+ /// ctor taking pointer and an ownership flag
+ UsesDef_tie (T *tp, ::CORBA::Boolean release = true);
+ /// ctor with T*, ownership flag and a POA
+ UsesDef_tie (
+ T *tp,
+ PortableServer::POA_ptr poa,
+ ::CORBA::Boolean release = true
+ );
+ /// dtor
+
+ ~UsesDef_tie (void);
+ // TIE specific functions
+ /// return the underlying object
+ T *_tied_object (void);
+ /// set the underlying object
+ void _tied_object (T &obj);
+ /// set the underlying object and the ownership flag
+ void _tied_object (T *obj, ::CORBA::Boolean release = true);
+ /// do we own it
+ ::CORBA::Boolean _is_owner (void);
+ /// set the ownership
+
+ void _is_owner ( ::CORBA::Boolean b);
+ // overridden ServantBase operations
+ PortableServer::POA_ptr _default_POA (
+ ACE_ENV_SINGLE_ARG_DECL_WITH_DEFAULTS
+ );
+
+ // TAO_IDL - Generated from
+ // be\be_visitor_operation/tie_sh.cpp:60
+
+ ::CORBA::DefinitionKind def_kind (
+ ACE_ENV_SINGLE_ARG_DECL_WITH_DEFAULTS
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ));
+
+ // TAO_IDL - Generated from
+ // be\be_visitor_operation/tie_sh.cpp:60
+
+ void destroy (
+ ACE_ENV_SINGLE_ARG_DECL_WITH_DEFAULTS
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ));
+
+ // TAO_IDL - Generated from
+ // be\be_visitor_operation/tie_sh.cpp:60
+
+ char * id (
+ ACE_ENV_SINGLE_ARG_DECL_WITH_DEFAULTS
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ));
+
+ // TAO_IDL - Generated from
+ // be\be_visitor_operation/tie_sh.cpp:60
+
+ void id (
+ const char * id
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ));
+
+ // TAO_IDL - Generated from
+ // be\be_visitor_operation/tie_sh.cpp:60
+
+ char * name (
+ ACE_ENV_SINGLE_ARG_DECL_WITH_DEFAULTS
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ));
+
+ // TAO_IDL - Generated from
+ // be\be_visitor_operation/tie_sh.cpp:60
+
+ void name (
+ const char * name
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ));
+
+ // TAO_IDL - Generated from
+ // be\be_visitor_operation/tie_sh.cpp:60
+
+ char * version (
+ ACE_ENV_SINGLE_ARG_DECL_WITH_DEFAULTS
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ));
+
+ // TAO_IDL - Generated from
+ // be\be_visitor_operation/tie_sh.cpp:60
+
+ void version (
+ const char * version
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ));
+
+ // TAO_IDL - Generated from
+ // be\be_visitor_operation/tie_sh.cpp:60
+
+ ::CORBA::Container_ptr defined_in (
+ ACE_ENV_SINGLE_ARG_DECL_WITH_DEFAULTS
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ));
+
+ // TAO_IDL - Generated from
+ // be\be_visitor_operation/tie_sh.cpp:60
+
+ char * absolute_name (
+ ACE_ENV_SINGLE_ARG_DECL_WITH_DEFAULTS
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ));
+
+ // TAO_IDL - Generated from
+ // be\be_visitor_operation/tie_sh.cpp:60
+
+ ::CORBA::Repository_ptr containing_repository (
+ ACE_ENV_SINGLE_ARG_DECL_WITH_DEFAULTS
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ));
+
+ // TAO_IDL - Generated from
+ // be\be_visitor_operation/tie_sh.cpp:60
+
+ ::CORBA::Contained::Description * describe (
+ ACE_ENV_SINGLE_ARG_DECL_WITH_DEFAULTS
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ));
+
+ // TAO_IDL - Generated from
+ // be\be_visitor_operation/tie_sh.cpp:60
+
+ void move (
+ ::CORBA::Container_ptr new_container,
+ const char * new_name,
+ const char * new_version
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ));
+
+ // TAO_IDL - Generated from
+ // be\be_visitor_operation/tie_sh.cpp:60
+
+ ::CORBA::InterfaceDef_ptr interface_type (
+ ACE_ENV_SINGLE_ARG_DECL_WITH_DEFAULTS
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ));
+
+ // TAO_IDL - Generated from
+ // be\be_visitor_operation/tie_sh.cpp:60
+
+ void interface_type (
+ ::CORBA::InterfaceDef_ptr interface_type
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ));
+
+ // TAO_IDL - Generated from
+ // be\be_visitor_operation/tie_sh.cpp:60
+
+ ::CORBA::Boolean is_multiple (
+ ACE_ENV_SINGLE_ARG_DECL_WITH_DEFAULTS
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ));
+
+ // TAO_IDL - Generated from
+ // be\be_visitor_operation/tie_sh.cpp:60
+
+ void is_multiple (
+ ::CORBA::Boolean is_multiple
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ));
+
+ private:
+ T *ptr_;
+ PortableServer::POA_var poa_;
+ ::CORBA::Boolean rel_;
+
+ // copy and assignment are not allowed
+ UsesDef_tie (const UsesDef_tie &);
+ void operator= (const UsesDef_tie &);
+ };
+
+ // TAO_IDL - Generated from
+ // be\be_visitor_interface/tie_sh.cpp:87
+
+ // TIE class: Refer to CORBA v2.2, Section 20.34.4
+ template <class T>
+ class EventPortDef_tie : public EventPortDef
+ {
+ public:
+ /// the T& ctor
+ EventPortDef_tie (T &t);
+ /// ctor taking a POA
+ EventPortDef_tie (T &t, PortableServer::POA_ptr poa);
+ /// ctor taking pointer and an ownership flag
+ EventPortDef_tie (T *tp, ::CORBA::Boolean release = true);
+ /// ctor with T*, ownership flag and a POA
+ EventPortDef_tie (
+ T *tp,
+ PortableServer::POA_ptr poa,
+ ::CORBA::Boolean release = true
+ );
+ /// dtor
+
+ ~EventPortDef_tie (void);
+ // TIE specific functions
+ /// return the underlying object
+ T *_tied_object (void);
+ /// set the underlying object
+ void _tied_object (T &obj);
+ /// set the underlying object and the ownership flag
+ void _tied_object (T *obj, ::CORBA::Boolean release = true);
+ /// do we own it
+ ::CORBA::Boolean _is_owner (void);
+ /// set the ownership
+
+ void _is_owner ( ::CORBA::Boolean b);
+ // overridden ServantBase operations
+ PortableServer::POA_ptr _default_POA (
+ ACE_ENV_SINGLE_ARG_DECL_WITH_DEFAULTS
+ );
+
+ // TAO_IDL - Generated from
+ // be\be_visitor_operation/tie_sh.cpp:60
+
+ ::CORBA::DefinitionKind def_kind (
+ ACE_ENV_SINGLE_ARG_DECL_WITH_DEFAULTS
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ));
+
+ // TAO_IDL - Generated from
+ // be\be_visitor_operation/tie_sh.cpp:60
+
+ void destroy (
+ ACE_ENV_SINGLE_ARG_DECL_WITH_DEFAULTS
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ));
+
+ // TAO_IDL - Generated from
+ // be\be_visitor_operation/tie_sh.cpp:60
+
+ char * id (
+ ACE_ENV_SINGLE_ARG_DECL_WITH_DEFAULTS
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ));
+
+ // TAO_IDL - Generated from
+ // be\be_visitor_operation/tie_sh.cpp:60
+
+ void id (
+ const char * id
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ));
+
+ // TAO_IDL - Generated from
+ // be\be_visitor_operation/tie_sh.cpp:60
+
+ char * name (
+ ACE_ENV_SINGLE_ARG_DECL_WITH_DEFAULTS
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ));
+
+ // TAO_IDL - Generated from
+ // be\be_visitor_operation/tie_sh.cpp:60
+
+ void name (
+ const char * name
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ));
+
+ // TAO_IDL - Generated from
+ // be\be_visitor_operation/tie_sh.cpp:60
+
+ char * version (
+ ACE_ENV_SINGLE_ARG_DECL_WITH_DEFAULTS
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ));
+
+ // TAO_IDL - Generated from
+ // be\be_visitor_operation/tie_sh.cpp:60
+
+ void version (
+ const char * version
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ));
+
+ // TAO_IDL - Generated from
+ // be\be_visitor_operation/tie_sh.cpp:60
+
+ ::CORBA::Container_ptr defined_in (
+ ACE_ENV_SINGLE_ARG_DECL_WITH_DEFAULTS
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ));
+
+ // TAO_IDL - Generated from
+ // be\be_visitor_operation/tie_sh.cpp:60
+
+ char * absolute_name (
+ ACE_ENV_SINGLE_ARG_DECL_WITH_DEFAULTS
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ));
+
+ // TAO_IDL - Generated from
+ // be\be_visitor_operation/tie_sh.cpp:60
+
+ ::CORBA::Repository_ptr containing_repository (
+ ACE_ENV_SINGLE_ARG_DECL_WITH_DEFAULTS
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ));
+
+ // TAO_IDL - Generated from
+ // be\be_visitor_operation/tie_sh.cpp:60
+
+ ::CORBA::Contained::Description * describe (
+ ACE_ENV_SINGLE_ARG_DECL_WITH_DEFAULTS
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ));
+
+ // TAO_IDL - Generated from
+ // be\be_visitor_operation/tie_sh.cpp:60
+
+ void move (
+ ::CORBA::Container_ptr new_container,
+ const char * new_name,
+ const char * new_version
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ));
+
+ // TAO_IDL - Generated from
+ // be\be_visitor_operation/tie_sh.cpp:60
+
+ ::CORBA::ComponentIR::EventDef_ptr event (
+ ACE_ENV_SINGLE_ARG_DECL_WITH_DEFAULTS
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ));
+
+ // TAO_IDL - Generated from
+ // be\be_visitor_operation/tie_sh.cpp:60
+
+ void event (
+ ::CORBA::ComponentIR::EventDef_ptr event
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ));
+
+ // TAO_IDL - Generated from
+ // be\be_visitor_operation/tie_sh.cpp:60
+
+ ::CORBA::Boolean is_a (
+ const char * event_id
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ));
+
+ private:
+ T *ptr_;
+ PortableServer::POA_var poa_;
+ ::CORBA::Boolean rel_;
+
+ // copy and assignment are not allowed
+ EventPortDef_tie (const EventPortDef_tie &);
+ void operator= (const EventPortDef_tie &);
+ };
+
+ // TAO_IDL - Generated from
+ // be\be_visitor_interface/tie_sh.cpp:87
+
+ // TIE class: Refer to CORBA v2.2, Section 20.34.4
+ template <class T>
+ class EmitsDef_tie : public EmitsDef
+ {
+ public:
+ /// the T& ctor
+ EmitsDef_tie (T &t);
+ /// ctor taking a POA
+ EmitsDef_tie (T &t, PortableServer::POA_ptr poa);
+ /// ctor taking pointer and an ownership flag
+ EmitsDef_tie (T *tp, ::CORBA::Boolean release = true);
+ /// ctor with T*, ownership flag and a POA
+ EmitsDef_tie (
+ T *tp,
+ PortableServer::POA_ptr poa,
+ ::CORBA::Boolean release = true
+ );
+ /// dtor
+
+ ~EmitsDef_tie (void);
+ // TIE specific functions
+ /// return the underlying object
+ T *_tied_object (void);
+ /// set the underlying object
+ void _tied_object (T &obj);
+ /// set the underlying object and the ownership flag
+ void _tied_object (T *obj, ::CORBA::Boolean release = true);
+ /// do we own it
+ ::CORBA::Boolean _is_owner (void);
+ /// set the ownership
+
+ void _is_owner ( ::CORBA::Boolean b);
+ // overridden ServantBase operations
+ PortableServer::POA_ptr _default_POA (
+ ACE_ENV_SINGLE_ARG_DECL_WITH_DEFAULTS
+ );
+
+ // TAO_IDL - Generated from
+ // be\be_visitor_operation/tie_sh.cpp:60
+
+ ::CORBA::DefinitionKind def_kind (
+ ACE_ENV_SINGLE_ARG_DECL_WITH_DEFAULTS
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ));
+
+ // TAO_IDL - Generated from
+ // be\be_visitor_operation/tie_sh.cpp:60
+
+ void destroy (
+ ACE_ENV_SINGLE_ARG_DECL_WITH_DEFAULTS
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ));
+
+ // TAO_IDL - Generated from
+ // be\be_visitor_operation/tie_sh.cpp:60
+
+ char * id (
+ ACE_ENV_SINGLE_ARG_DECL_WITH_DEFAULTS
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ));
+
+ // TAO_IDL - Generated from
+ // be\be_visitor_operation/tie_sh.cpp:60
+
+ void id (
+ const char * id
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ));
+
+ // TAO_IDL - Generated from
+ // be\be_visitor_operation/tie_sh.cpp:60
+
+ char * name (
+ ACE_ENV_SINGLE_ARG_DECL_WITH_DEFAULTS
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ));
+
+ // TAO_IDL - Generated from
+ // be\be_visitor_operation/tie_sh.cpp:60
+
+ void name (
+ const char * name
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ));
+
+ // TAO_IDL - Generated from
+ // be\be_visitor_operation/tie_sh.cpp:60
+
+ char * version (
+ ACE_ENV_SINGLE_ARG_DECL_WITH_DEFAULTS
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ));
+
+ // TAO_IDL - Generated from
+ // be\be_visitor_operation/tie_sh.cpp:60
+
+ void version (
+ const char * version
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ));
+
+ // TAO_IDL - Generated from
+ // be\be_visitor_operation/tie_sh.cpp:60
+
+ ::CORBA::Container_ptr defined_in (
+ ACE_ENV_SINGLE_ARG_DECL_WITH_DEFAULTS
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ));
+
+ // TAO_IDL - Generated from
+ // be\be_visitor_operation/tie_sh.cpp:60
+
+ char * absolute_name (
+ ACE_ENV_SINGLE_ARG_DECL_WITH_DEFAULTS
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ));
+
+ // TAO_IDL - Generated from
+ // be\be_visitor_operation/tie_sh.cpp:60
+
+ ::CORBA::Repository_ptr containing_repository (
+ ACE_ENV_SINGLE_ARG_DECL_WITH_DEFAULTS
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ));
+
+ // TAO_IDL - Generated from
+ // be\be_visitor_operation/tie_sh.cpp:60
+
+ ::CORBA::Contained::Description * describe (
+ ACE_ENV_SINGLE_ARG_DECL_WITH_DEFAULTS
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ));
+
+ // TAO_IDL - Generated from
+ // be\be_visitor_operation/tie_sh.cpp:60
+
+ void move (
+ ::CORBA::Container_ptr new_container,
+ const char * new_name,
+ const char * new_version
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ));
+
+ // TAO_IDL - Generated from
+ // be\be_visitor_operation/tie_sh.cpp:60
+
+ ::CORBA::ComponentIR::EventDef_ptr event (
+ ACE_ENV_SINGLE_ARG_DECL_WITH_DEFAULTS
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ));
+
+ // TAO_IDL - Generated from
+ // be\be_visitor_operation/tie_sh.cpp:60
+
+ void event (
+ ::CORBA::ComponentIR::EventDef_ptr event
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ));
+
+ // TAO_IDL - Generated from
+ // be\be_visitor_operation/tie_sh.cpp:60
+
+ ::CORBA::Boolean is_a (
+ const char * event_id
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ));
+
+ private:
+ T *ptr_;
+ PortableServer::POA_var poa_;
+ ::CORBA::Boolean rel_;
+
+ // copy and assignment are not allowed
+ EmitsDef_tie (const EmitsDef_tie &);
+ void operator= (const EmitsDef_tie &);
+ };
+
+ // TAO_IDL - Generated from
+ // be\be_visitor_interface/tie_sh.cpp:87
+
+ // TIE class: Refer to CORBA v2.2, Section 20.34.4
+ template <class T>
+ class PublishesDef_tie : public PublishesDef
+ {
+ public:
+ /// the T& ctor
+ PublishesDef_tie (T &t);
+ /// ctor taking a POA
+ PublishesDef_tie (T &t, PortableServer::POA_ptr poa);
+ /// ctor taking pointer and an ownership flag
+ PublishesDef_tie (T *tp, ::CORBA::Boolean release = true);
+ /// ctor with T*, ownership flag and a POA
+ PublishesDef_tie (
+ T *tp,
+ PortableServer::POA_ptr poa,
+ ::CORBA::Boolean release = true
+ );
+ /// dtor
+
+ ~PublishesDef_tie (void);
+ // TIE specific functions
+ /// return the underlying object
+ T *_tied_object (void);
+ /// set the underlying object
+ void _tied_object (T &obj);
+ /// set the underlying object and the ownership flag
+ void _tied_object (T *obj, ::CORBA::Boolean release = true);
+ /// do we own it
+ ::CORBA::Boolean _is_owner (void);
+ /// set the ownership
+
+ void _is_owner ( ::CORBA::Boolean b);
+ // overridden ServantBase operations
+ PortableServer::POA_ptr _default_POA (
+ ACE_ENV_SINGLE_ARG_DECL_WITH_DEFAULTS
+ );
+
+ // TAO_IDL - Generated from
+ // be\be_visitor_operation/tie_sh.cpp:60
+
+ ::CORBA::DefinitionKind def_kind (
+ ACE_ENV_SINGLE_ARG_DECL_WITH_DEFAULTS
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ));
+
+ // TAO_IDL - Generated from
+ // be\be_visitor_operation/tie_sh.cpp:60
+
+ void destroy (
+ ACE_ENV_SINGLE_ARG_DECL_WITH_DEFAULTS
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ));
+
+ // TAO_IDL - Generated from
+ // be\be_visitor_operation/tie_sh.cpp:60
+
+ char * id (
+ ACE_ENV_SINGLE_ARG_DECL_WITH_DEFAULTS
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ));
+
+ // TAO_IDL - Generated from
+ // be\be_visitor_operation/tie_sh.cpp:60
+
+ void id (
+ const char * id
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ));
+
+ // TAO_IDL - Generated from
+ // be\be_visitor_operation/tie_sh.cpp:60
+
+ char * name (
+ ACE_ENV_SINGLE_ARG_DECL_WITH_DEFAULTS
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ));
+
+ // TAO_IDL - Generated from
+ // be\be_visitor_operation/tie_sh.cpp:60
+
+ void name (
+ const char * name
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ));
+
+ // TAO_IDL - Generated from
+ // be\be_visitor_operation/tie_sh.cpp:60
+
+ char * version (
+ ACE_ENV_SINGLE_ARG_DECL_WITH_DEFAULTS
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ));
+
+ // TAO_IDL - Generated from
+ // be\be_visitor_operation/tie_sh.cpp:60
+
+ void version (
+ const char * version
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ));
+
+ // TAO_IDL - Generated from
+ // be\be_visitor_operation/tie_sh.cpp:60
+
+ ::CORBA::Container_ptr defined_in (
+ ACE_ENV_SINGLE_ARG_DECL_WITH_DEFAULTS
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ));
+
+ // TAO_IDL - Generated from
+ // be\be_visitor_operation/tie_sh.cpp:60
+
+ char * absolute_name (
+ ACE_ENV_SINGLE_ARG_DECL_WITH_DEFAULTS
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ));
+
+ // TAO_IDL - Generated from
+ // be\be_visitor_operation/tie_sh.cpp:60
+
+ ::CORBA::Repository_ptr containing_repository (
+ ACE_ENV_SINGLE_ARG_DECL_WITH_DEFAULTS
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ));
+
+ // TAO_IDL - Generated from
+ // be\be_visitor_operation/tie_sh.cpp:60
+
+ ::CORBA::Contained::Description * describe (
+ ACE_ENV_SINGLE_ARG_DECL_WITH_DEFAULTS
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ));
+
+ // TAO_IDL - Generated from
+ // be\be_visitor_operation/tie_sh.cpp:60
+
+ void move (
+ ::CORBA::Container_ptr new_container,
+ const char * new_name,
+ const char * new_version
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ));
+
+ // TAO_IDL - Generated from
+ // be\be_visitor_operation/tie_sh.cpp:60
+
+ ::CORBA::ComponentIR::EventDef_ptr event (
+ ACE_ENV_SINGLE_ARG_DECL_WITH_DEFAULTS
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ));
+
+ // TAO_IDL - Generated from
+ // be\be_visitor_operation/tie_sh.cpp:60
+
+ void event (
+ ::CORBA::ComponentIR::EventDef_ptr event
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ));
+
+ // TAO_IDL - Generated from
+ // be\be_visitor_operation/tie_sh.cpp:60
+
+ ::CORBA::Boolean is_a (
+ const char * event_id
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ));
+
+ private:
+ T *ptr_;
+ PortableServer::POA_var poa_;
+ ::CORBA::Boolean rel_;
+
+ // copy and assignment are not allowed
+ PublishesDef_tie (const PublishesDef_tie &);
+ void operator= (const PublishesDef_tie &);
+ };
+
+ // TAO_IDL - Generated from
+ // be\be_visitor_interface/tie_sh.cpp:87
+
+ // TIE class: Refer to CORBA v2.2, Section 20.34.4
+ template <class T>
+ class ConsumesDef_tie : public ConsumesDef
+ {
+ public:
+ /// the T& ctor
+ ConsumesDef_tie (T &t);
+ /// ctor taking a POA
+ ConsumesDef_tie (T &t, PortableServer::POA_ptr poa);
+ /// ctor taking pointer and an ownership flag
+ ConsumesDef_tie (T *tp, ::CORBA::Boolean release = true);
+ /// ctor with T*, ownership flag and a POA
+ ConsumesDef_tie (
+ T *tp,
+ PortableServer::POA_ptr poa,
+ ::CORBA::Boolean release = true
+ );
+ /// dtor
+
+ ~ConsumesDef_tie (void);
+ // TIE specific functions
+ /// return the underlying object
+ T *_tied_object (void);
+ /// set the underlying object
+ void _tied_object (T &obj);
+ /// set the underlying object and the ownership flag
+ void _tied_object (T *obj, ::CORBA::Boolean release = true);
+ /// do we own it
+ ::CORBA::Boolean _is_owner (void);
+ /// set the ownership
+
+ void _is_owner ( ::CORBA::Boolean b);
+ // overridden ServantBase operations
+ PortableServer::POA_ptr _default_POA (
+ ACE_ENV_SINGLE_ARG_DECL_WITH_DEFAULTS
+ );
+
+ // TAO_IDL - Generated from
+ // be\be_visitor_operation/tie_sh.cpp:60
+
+ ::CORBA::DefinitionKind def_kind (
+ ACE_ENV_SINGLE_ARG_DECL_WITH_DEFAULTS
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ));
+
+ // TAO_IDL - Generated from
+ // be\be_visitor_operation/tie_sh.cpp:60
+
+ void destroy (
+ ACE_ENV_SINGLE_ARG_DECL_WITH_DEFAULTS
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ));
+
+ // TAO_IDL - Generated from
+ // be\be_visitor_operation/tie_sh.cpp:60
+
+ char * id (
+ ACE_ENV_SINGLE_ARG_DECL_WITH_DEFAULTS
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ));
+
+ // TAO_IDL - Generated from
+ // be\be_visitor_operation/tie_sh.cpp:60
+
+ void id (
+ const char * id
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ));
+
+ // TAO_IDL - Generated from
+ // be\be_visitor_operation/tie_sh.cpp:60
+
+ char * name (
+ ACE_ENV_SINGLE_ARG_DECL_WITH_DEFAULTS
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ));
+
+ // TAO_IDL - Generated from
+ // be\be_visitor_operation/tie_sh.cpp:60
+
+ void name (
+ const char * name
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ));
+
+ // TAO_IDL - Generated from
+ // be\be_visitor_operation/tie_sh.cpp:60
+
+ char * version (
+ ACE_ENV_SINGLE_ARG_DECL_WITH_DEFAULTS
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ));
+
+ // TAO_IDL - Generated from
+ // be\be_visitor_operation/tie_sh.cpp:60
+
+ void version (
+ const char * version
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ));
+
+ // TAO_IDL - Generated from
+ // be\be_visitor_operation/tie_sh.cpp:60
+
+ ::CORBA::Container_ptr defined_in (
+ ACE_ENV_SINGLE_ARG_DECL_WITH_DEFAULTS
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ));
+
+ // TAO_IDL - Generated from
+ // be\be_visitor_operation/tie_sh.cpp:60
+
+ char * absolute_name (
+ ACE_ENV_SINGLE_ARG_DECL_WITH_DEFAULTS
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ));
+
+ // TAO_IDL - Generated from
+ // be\be_visitor_operation/tie_sh.cpp:60
+
+ ::CORBA::Repository_ptr containing_repository (
+ ACE_ENV_SINGLE_ARG_DECL_WITH_DEFAULTS
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ));
+
+ // TAO_IDL - Generated from
+ // be\be_visitor_operation/tie_sh.cpp:60
+
+ ::CORBA::Contained::Description * describe (
+ ACE_ENV_SINGLE_ARG_DECL_WITH_DEFAULTS
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ));
+
+ // TAO_IDL - Generated from
+ // be\be_visitor_operation/tie_sh.cpp:60
+
+ void move (
+ ::CORBA::Container_ptr new_container,
+ const char * new_name,
+ const char * new_version
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ));
+
+ // TAO_IDL - Generated from
+ // be\be_visitor_operation/tie_sh.cpp:60
+
+ ::CORBA::ComponentIR::EventDef_ptr event (
+ ACE_ENV_SINGLE_ARG_DECL_WITH_DEFAULTS
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ));
+
+ // TAO_IDL - Generated from
+ // be\be_visitor_operation/tie_sh.cpp:60
+
+ void event (
+ ::CORBA::ComponentIR::EventDef_ptr event
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ));
+
+ // TAO_IDL - Generated from
+ // be\be_visitor_operation/tie_sh.cpp:60
+
+ ::CORBA::Boolean is_a (
+ const char * event_id
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ));
+
+ private:
+ T *ptr_;
+ PortableServer::POA_var poa_;
+ ::CORBA::Boolean rel_;
+
+ // copy and assignment are not allowed
+ ConsumesDef_tie (const ConsumesDef_tie &);
+ void operator= (const ConsumesDef_tie &);
+ };
+
+ // TAO_IDL - Generated from
+ // be\be_visitor_interface/tie_sh.cpp:87
+
+ // TIE class: Refer to CORBA v2.2, Section 20.34.4
+ template <class T>
+ class ComponentDef_tie : public ComponentDef
+ {
+ public:
+ /// the T& ctor
+ ComponentDef_tie (T &t);
+ /// ctor taking a POA
+ ComponentDef_tie (T &t, PortableServer::POA_ptr poa);
+ /// ctor taking pointer and an ownership flag
+ ComponentDef_tie (T *tp, ::CORBA::Boolean release = true);
+ /// ctor with T*, ownership flag and a POA
+ ComponentDef_tie (
+ T *tp,
+ PortableServer::POA_ptr poa,
+ ::CORBA::Boolean release = true
+ );
+ /// dtor
+
+ ~ComponentDef_tie (void);
+ // TIE specific functions
+ /// return the underlying object
+ T *_tied_object (void);
+ /// set the underlying object
+ void _tied_object (T &obj);
+ /// set the underlying object and the ownership flag
+ void _tied_object (T *obj, ::CORBA::Boolean release = true);
+ /// do we own it
+ ::CORBA::Boolean _is_owner (void);
+ /// set the ownership
+
+ void _is_owner ( ::CORBA::Boolean b);
+ // overridden ServantBase operations
+ PortableServer::POA_ptr _default_POA (
+ ACE_ENV_SINGLE_ARG_DECL_WITH_DEFAULTS
+ );
+
+ // TAO_IDL - Generated from
+ // be\be_visitor_operation/tie_sh.cpp:60
+
+ ::CORBA::DefinitionKind def_kind (
+ ACE_ENV_SINGLE_ARG_DECL_WITH_DEFAULTS
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ));
+
+ // TAO_IDL - Generated from
+ // be\be_visitor_operation/tie_sh.cpp:60
+
+ void destroy (
+ ACE_ENV_SINGLE_ARG_DECL_WITH_DEFAULTS
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ));
+
+ // TAO_IDL - Generated from
+ // be\be_visitor_operation/tie_sh.cpp:60
+
+ ::CORBA::Contained_ptr lookup (
+ const char * search_name
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ));
+
+ // TAO_IDL - Generated from
+ // be\be_visitor_operation/tie_sh.cpp:60
+
+ ::CORBA::ContainedSeq * contents (
+ ::CORBA::DefinitionKind limit_type,
+ ::CORBA::Boolean exclude_inherited
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ));
+
+ // TAO_IDL - Generated from
+ // be\be_visitor_operation/tie_sh.cpp:60
+
+ ::CORBA::ContainedSeq * lookup_name (
+ const char * search_name,
+ ::CORBA::Long levels_to_search,
+ ::CORBA::DefinitionKind limit_type,
+ ::CORBA::Boolean exclude_inherited
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ));
+
+ // TAO_IDL - Generated from
+ // be\be_visitor_operation/tie_sh.cpp:60
+
+ ::CORBA::Container::DescriptionSeq * describe_contents (
+ ::CORBA::DefinitionKind limit_type,
+ ::CORBA::Boolean exclude_inherited,
+ ::CORBA::Long max_returned_objs
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ));
+
+ // TAO_IDL - Generated from
+ // be\be_visitor_operation/tie_sh.cpp:60
+
+ ::CORBA::ModuleDef_ptr create_module (
+ const char * id,
+ const char * name,
+ const char * version
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ));
+
+ // TAO_IDL - Generated from
+ // be\be_visitor_operation/tie_sh.cpp:60
+
+ ::CORBA::ConstantDef_ptr create_constant (
+ const char * id,
+ const char * name,
+ const char * version,
+ ::CORBA::IDLType_ptr type,
+ const ::CORBA::Any & value
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ));
+
+ // TAO_IDL - Generated from
+ // be\be_visitor_operation/tie_sh.cpp:60
+
+ ::CORBA::StructDef_ptr create_struct (
+ const char * id,
+ const char * name,
+ const char * version,
+ const ::CORBA::StructMemberSeq & members
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ));
+
+ // TAO_IDL - Generated from
+ // be\be_visitor_operation/tie_sh.cpp:60
+
+ ::CORBA::UnionDef_ptr create_union (
+ const char * id,
+ const char * name,
+ const char * version,
+ ::CORBA::IDLType_ptr discriminator_type,
+ const ::CORBA::UnionMemberSeq & members
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ));
+
+ // TAO_IDL - Generated from
+ // be\be_visitor_operation/tie_sh.cpp:60
+
+ ::CORBA::EnumDef_ptr create_enum (
+ const char * id,
+ const char * name,
+ const char * version,
+ const ::CORBA::EnumMemberSeq & members
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ));
+
+ // TAO_IDL - Generated from
+ // be\be_visitor_operation/tie_sh.cpp:60
+
+ ::CORBA::AliasDef_ptr create_alias (
+ const char * id,
+ const char * name,
+ const char * version,
+ ::CORBA::IDLType_ptr original_type
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ));
+
+ // TAO_IDL - Generated from
+ // be\be_visitor_operation/tie_sh.cpp:60
+
+ ::CORBA::InterfaceDef_ptr create_interface (
+ const char * id,
+ const char * name,
+ const char * version,
+ const ::CORBA::InterfaceDefSeq & base_interfaces
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ));
+
+ // TAO_IDL - Generated from
+ // be\be_visitor_operation/tie_sh.cpp:60
+
+ ::CORBA::ValueDef_ptr create_value (
+ const char * id,
+ const char * name,
+ const char * version,
+ ::CORBA::Boolean is_custom,
+ ::CORBA::Boolean is_abstract,
+ ::CORBA::ValueDef_ptr base_value,
+ ::CORBA::Boolean is_truncatable,
+ const ::CORBA::ValueDefSeq & abstract_base_values,
+ const ::CORBA::InterfaceDefSeq & supported_interfaces,
+ const ::CORBA::InitializerSeq & initializers
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ));
+
+ // TAO_IDL - Generated from
+ // be\be_visitor_operation/tie_sh.cpp:60
+
+ ::CORBA::ValueBoxDef_ptr create_value_box (
+ const char * id,
+ const char * name,
+ const char * version,
+ ::CORBA::IDLType_ptr original_type_def
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ));
+
+ // TAO_IDL - Generated from
+ // be\be_visitor_operation/tie_sh.cpp:60
+
+ ::CORBA::ExceptionDef_ptr create_exception (
+ const char * id,
+ const char * name,
+ const char * version,
+ const ::CORBA::StructMemberSeq & members
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ));
+
+ // TAO_IDL - Generated from
+ // be\be_visitor_operation/tie_sh.cpp:60
+
+ ::CORBA::NativeDef_ptr create_native (
+ const char * id,
+ const char * name,
+ const char * version
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ));
+
+ // TAO_IDL - Generated from
+ // be\be_visitor_operation/tie_sh.cpp:60
+
+ ::CORBA::AbstractInterfaceDef_ptr create_abstract_interface (
+ const char * id,
+ const char * name,
+ const char * version,
+ const ::CORBA::AbstractInterfaceDefSeq & base_interfaces
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ));
+
+ // TAO_IDL - Generated from
+ // be\be_visitor_operation/tie_sh.cpp:60
+
+ ::CORBA::LocalInterfaceDef_ptr create_local_interface (
+ const char * id,
+ const char * name,
+ const char * version,
+ const ::CORBA::InterfaceDefSeq & base_interfaces
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ));
+
+ // TAO_IDL - Generated from
+ // be\be_visitor_operation/tie_sh.cpp:60
+
+ ::CORBA::ExtValueDef_ptr create_ext_value (
+ const char * id,
+ const char * name,
+ const char * version,
+ ::CORBA::Boolean is_custom,
+ ::CORBA::Boolean is_abstract,
+ ::CORBA::ValueDef_ptr base_value,
+ ::CORBA::Boolean is_truncatable,
+ const ::CORBA::ValueDefSeq & abstract_base_values,
+ const ::CORBA::InterfaceDefSeq & supported_interfaces,
+ const ::CORBA::ExtInitializerSeq & initializers
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ));
+
+ // TAO_IDL - Generated from
+ // be\be_visitor_operation/tie_sh.cpp:60
+
+ char * id (
+ ACE_ENV_SINGLE_ARG_DECL_WITH_DEFAULTS
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ));
+
+ // TAO_IDL - Generated from
+ // be\be_visitor_operation/tie_sh.cpp:60
+
+ void id (
+ const char * id
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ));
+
+ // TAO_IDL - Generated from
+ // be\be_visitor_operation/tie_sh.cpp:60
+
+ char * name (
+ ACE_ENV_SINGLE_ARG_DECL_WITH_DEFAULTS
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ));
+
+ // TAO_IDL - Generated from
+ // be\be_visitor_operation/tie_sh.cpp:60
+
+ void name (
+ const char * name
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ));
+
+ // TAO_IDL - Generated from
+ // be\be_visitor_operation/tie_sh.cpp:60
+
+ char * version (
+ ACE_ENV_SINGLE_ARG_DECL_WITH_DEFAULTS
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ));
+
+ // TAO_IDL - Generated from
+ // be\be_visitor_operation/tie_sh.cpp:60
+
+ void version (
+ const char * version
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ));
+
+ // TAO_IDL - Generated from
+ // be\be_visitor_operation/tie_sh.cpp:60
+
+ ::CORBA::Container_ptr defined_in (
+ ACE_ENV_SINGLE_ARG_DECL_WITH_DEFAULTS
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ));
+
+ // TAO_IDL - Generated from
+ // be\be_visitor_operation/tie_sh.cpp:60
+
+ char * absolute_name (
+ ACE_ENV_SINGLE_ARG_DECL_WITH_DEFAULTS
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ));
+
+ // TAO_IDL - Generated from
+ // be\be_visitor_operation/tie_sh.cpp:60
+
+ ::CORBA::Repository_ptr containing_repository (
+ ACE_ENV_SINGLE_ARG_DECL_WITH_DEFAULTS
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ));
+
+ // TAO_IDL - Generated from
+ // be\be_visitor_operation/tie_sh.cpp:60
+
+ ::CORBA::Contained::Description * describe (
+ ACE_ENV_SINGLE_ARG_DECL_WITH_DEFAULTS
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ));
+
+ // TAO_IDL - Generated from
+ // be\be_visitor_operation/tie_sh.cpp:60
+
+ void move (
+ ::CORBA::Container_ptr new_container,
+ const char * new_name,
+ const char * new_version
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ));
+
+ // TAO_IDL - Generated from
+ // be\be_visitor_operation/tie_sh.cpp:60
+
+ ::CORBA::TypeCode_ptr type (
+ ACE_ENV_SINGLE_ARG_DECL_WITH_DEFAULTS
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ));
+
+ // TAO_IDL - Generated from
+ // be\be_visitor_operation/tie_sh.cpp:60
+
+ ::CORBA::InterfaceDefSeq * base_interfaces (
+ ACE_ENV_SINGLE_ARG_DECL_WITH_DEFAULTS
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ));
+
+ // TAO_IDL - Generated from
+ // be\be_visitor_operation/tie_sh.cpp:60
+
+ void base_interfaces (
+ const ::CORBA::InterfaceDefSeq & base_interfaces
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ));
+
+ // TAO_IDL - Generated from
+ // be\be_visitor_operation/tie_sh.cpp:60
+
+ ::CORBA::Boolean is_a (
+ const char * interface_id
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ));
+
+ // TAO_IDL - Generated from
+ // be\be_visitor_operation/tie_sh.cpp:60
+
+ ::CORBA::InterfaceDef::FullInterfaceDescription * describe_interface (
+ ACE_ENV_SINGLE_ARG_DECL_WITH_DEFAULTS
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ));
+
+ // TAO_IDL - Generated from
+ // be\be_visitor_operation/tie_sh.cpp:60
+
+ ::CORBA::AttributeDef_ptr create_attribute (
+ const char * id,
+ const char * name,
+ const char * version,
+ ::CORBA::IDLType_ptr type,
+ ::CORBA::AttributeMode mode
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ));
+
+ // TAO_IDL - Generated from
+ // be\be_visitor_operation/tie_sh.cpp:60
+
+ ::CORBA::OperationDef_ptr create_operation (
+ const char * id,
+ const char * name,
+ const char * version,
+ ::CORBA::IDLType_ptr result,
+ ::CORBA::OperationMode mode,
+ const ::CORBA::ParDescriptionSeq & params,
+ const ::CORBA::ExceptionDefSeq & exceptions,
+ const ::CORBA::ContextIdSeq & contexts
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ));
+
+ // TAO_IDL - Generated from
+ // be\be_visitor_operation/tie_sh.cpp:60
+
+ ::CORBA::InterfaceAttrExtension::ExtFullInterfaceDescription * describe_ext_interface (
+ ACE_ENV_SINGLE_ARG_DECL_WITH_DEFAULTS
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ));
+
+ // TAO_IDL - Generated from
+ // be\be_visitor_operation/tie_sh.cpp:60
+
+ ::CORBA::ExtAttributeDef_ptr create_ext_attribute (
+ const char * id,
+ const char * name,
+ const char * version,
+ ::CORBA::IDLType_ptr type,
+ ::CORBA::AttributeMode mode,
+ const ::CORBA::ExceptionDefSeq & get_exceptions,
+ const ::CORBA::ExceptionDefSeq & set_exceptions
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ));
+
+ // TAO_IDL - Generated from
+ // be\be_visitor_operation/tie_sh.cpp:60
+
+ ::CORBA::ComponentIR::ComponentDef_ptr base_component (
+ ACE_ENV_SINGLE_ARG_DECL_WITH_DEFAULTS
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ));
+
+ // TAO_IDL - Generated from
+ // be\be_visitor_operation/tie_sh.cpp:60
+
+ void base_component (
+ ::CORBA::ComponentIR::ComponentDef_ptr base_component
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ));
+
+ // TAO_IDL - Generated from
+ // be\be_visitor_operation/tie_sh.cpp:60
+
+ ::CORBA::InterfaceDefSeq * supported_interfaces (
+ ACE_ENV_SINGLE_ARG_DECL_WITH_DEFAULTS
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ));
+
+ // TAO_IDL - Generated from
+ // be\be_visitor_operation/tie_sh.cpp:60
+
+ void supported_interfaces (
+ const ::CORBA::InterfaceDefSeq & supported_interfaces
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ));
+
+ // TAO_IDL - Generated from
+ // be\be_visitor_operation/tie_sh.cpp:60
+
+ ::CORBA::ComponentIR::ProvidesDef_ptr create_provides (
+ const char * id,
+ const char * name,
+ const char * version,
+ ::CORBA::InterfaceDef_ptr interface_type
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ));
+
+ // TAO_IDL - Generated from
+ // be\be_visitor_operation/tie_sh.cpp:60
+
+ ::CORBA::ComponentIR::UsesDef_ptr create_uses (
+ const char * id,
+ const char * name,
+ const char * version,
+ ::CORBA::InterfaceDef_ptr interface_type,
+ ::CORBA::Boolean is_multiple
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ));
+
+ // TAO_IDL - Generated from
+ // be\be_visitor_operation/tie_sh.cpp:60
+
+ ::CORBA::ComponentIR::EmitsDef_ptr create_emits (
+ const char * id,
+ const char * name,
+ const char * version,
+ ::CORBA::ComponentIR::EventDef_ptr event
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ));
+
+ // TAO_IDL - Generated from
+ // be\be_visitor_operation/tie_sh.cpp:60
+
+ ::CORBA::ComponentIR::PublishesDef_ptr create_publishes (
+ const char * id,
+ const char * name,
+ const char * version,
+ ::CORBA::ComponentIR::EventDef_ptr event
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ));
+
+ // TAO_IDL - Generated from
+ // be\be_visitor_operation/tie_sh.cpp:60
+
+ ::CORBA::ComponentIR::ConsumesDef_ptr create_consumes (
+ const char * id,
+ const char * name,
+ const char * version,
+ ::CORBA::ComponentIR::EventDef_ptr event
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ));
+
+ private:
+ T *ptr_;
+ PortableServer::POA_var poa_;
+ ::CORBA::Boolean rel_;
+
+ // copy and assignment are not allowed
+ ComponentDef_tie (const ComponentDef_tie &);
+ void operator= (const ComponentDef_tie &);
+ };
+
+ // TAO_IDL - Generated from
+ // be\be_visitor_interface/tie_sh.cpp:87
+
+ // TIE class: Refer to CORBA v2.2, Section 20.34.4
+ template <class T>
+ class FactoryDef_tie : public FactoryDef
+ {
+ public:
+ /// the T& ctor
+ FactoryDef_tie (T &t);
+ /// ctor taking a POA
+ FactoryDef_tie (T &t, PortableServer::POA_ptr poa);
+ /// ctor taking pointer and an ownership flag
+ FactoryDef_tie (T *tp, ::CORBA::Boolean release = true);
+ /// ctor with T*, ownership flag and a POA
+ FactoryDef_tie (
+ T *tp,
+ PortableServer::POA_ptr poa,
+ ::CORBA::Boolean release = true
+ );
+ /// dtor
+
+ ~FactoryDef_tie (void);
+ // TIE specific functions
+ /// return the underlying object
+ T *_tied_object (void);
+ /// set the underlying object
+ void _tied_object (T &obj);
+ /// set the underlying object and the ownership flag
+ void _tied_object (T *obj, ::CORBA::Boolean release = true);
+ /// do we own it
+ ::CORBA::Boolean _is_owner (void);
+ /// set the ownership
+
+ void _is_owner ( ::CORBA::Boolean b);
+ // overridden ServantBase operations
+ PortableServer::POA_ptr _default_POA (
+ ACE_ENV_SINGLE_ARG_DECL_WITH_DEFAULTS
+ );
+
+ // TAO_IDL - Generated from
+ // be\be_visitor_operation/tie_sh.cpp:60
+
+ ::CORBA::DefinitionKind def_kind (
+ ACE_ENV_SINGLE_ARG_DECL_WITH_DEFAULTS
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ));
+
+ // TAO_IDL - Generated from
+ // be\be_visitor_operation/tie_sh.cpp:60
+
+ void destroy (
+ ACE_ENV_SINGLE_ARG_DECL_WITH_DEFAULTS
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ));
+
+ // TAO_IDL - Generated from
+ // be\be_visitor_operation/tie_sh.cpp:60
+
+ char * id (
+ ACE_ENV_SINGLE_ARG_DECL_WITH_DEFAULTS
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ));
+
+ // TAO_IDL - Generated from
+ // be\be_visitor_operation/tie_sh.cpp:60
+
+ void id (
+ const char * id
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ));
+
+ // TAO_IDL - Generated from
+ // be\be_visitor_operation/tie_sh.cpp:60
+
+ char * name (
+ ACE_ENV_SINGLE_ARG_DECL_WITH_DEFAULTS
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ));
+
+ // TAO_IDL - Generated from
+ // be\be_visitor_operation/tie_sh.cpp:60
+
+ void name (
+ const char * name
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ));
+
+ // TAO_IDL - Generated from
+ // be\be_visitor_operation/tie_sh.cpp:60
+
+ char * version (
+ ACE_ENV_SINGLE_ARG_DECL_WITH_DEFAULTS
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ));
+
+ // TAO_IDL - Generated from
+ // be\be_visitor_operation/tie_sh.cpp:60
+
+ void version (
+ const char * version
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ));
+
+ // TAO_IDL - Generated from
+ // be\be_visitor_operation/tie_sh.cpp:60
+
+ ::CORBA::Container_ptr defined_in (
+ ACE_ENV_SINGLE_ARG_DECL_WITH_DEFAULTS
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ));
+
+ // TAO_IDL - Generated from
+ // be\be_visitor_operation/tie_sh.cpp:60
+
+ char * absolute_name (
+ ACE_ENV_SINGLE_ARG_DECL_WITH_DEFAULTS
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ));
+
+ // TAO_IDL - Generated from
+ // be\be_visitor_operation/tie_sh.cpp:60
+
+ ::CORBA::Repository_ptr containing_repository (
+ ACE_ENV_SINGLE_ARG_DECL_WITH_DEFAULTS
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ));
+
+ // TAO_IDL - Generated from
+ // be\be_visitor_operation/tie_sh.cpp:60
+
+ ::CORBA::Contained::Description * describe (
+ ACE_ENV_SINGLE_ARG_DECL_WITH_DEFAULTS
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ));
+
+ // TAO_IDL - Generated from
+ // be\be_visitor_operation/tie_sh.cpp:60
+
+ void move (
+ ::CORBA::Container_ptr new_container,
+ const char * new_name,
+ const char * new_version
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ));
+
+ // TAO_IDL - Generated from
+ // be\be_visitor_operation/tie_sh.cpp:60
+
+ ::CORBA::TypeCode_ptr result (
+ ACE_ENV_SINGLE_ARG_DECL_WITH_DEFAULTS
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ));
+
+ // TAO_IDL - Generated from
+ // be\be_visitor_operation/tie_sh.cpp:60
+
+ ::CORBA::IDLType_ptr result_def (
+ ACE_ENV_SINGLE_ARG_DECL_WITH_DEFAULTS
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ));
+
+ // TAO_IDL - Generated from
+ // be\be_visitor_operation/tie_sh.cpp:60
+
+ void result_def (
+ ::CORBA::IDLType_ptr result_def
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ));
+
+ // TAO_IDL - Generated from
+ // be\be_visitor_operation/tie_sh.cpp:60
+
+ ::CORBA::ParDescriptionSeq * params (
+ ACE_ENV_SINGLE_ARG_DECL_WITH_DEFAULTS
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ));
+
+ // TAO_IDL - Generated from
+ // be\be_visitor_operation/tie_sh.cpp:60
+
+ void params (
+ const ::CORBA::ParDescriptionSeq & params
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ));
+
+ // TAO_IDL - Generated from
+ // be\be_visitor_operation/tie_sh.cpp:60
+
+ ::CORBA::OperationMode mode (
+ ACE_ENV_SINGLE_ARG_DECL_WITH_DEFAULTS
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ));
+
+ // TAO_IDL - Generated from
+ // be\be_visitor_operation/tie_sh.cpp:60
+
+ void mode (
+ ::CORBA::OperationMode mode
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ));
+
+ // TAO_IDL - Generated from
+ // be\be_visitor_operation/tie_sh.cpp:60
+
+ ::CORBA::ContextIdSeq * contexts (
+ ACE_ENV_SINGLE_ARG_DECL_WITH_DEFAULTS
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ));
+
+ // TAO_IDL - Generated from
+ // be\be_visitor_operation/tie_sh.cpp:60
+
+ void contexts (
+ const ::CORBA::ContextIdSeq & contexts
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ));
+
+ // TAO_IDL - Generated from
+ // be\be_visitor_operation/tie_sh.cpp:60
+
+ ::CORBA::ExceptionDefSeq * exceptions (
+ ACE_ENV_SINGLE_ARG_DECL_WITH_DEFAULTS
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ));
+
+ // TAO_IDL - Generated from
+ // be\be_visitor_operation/tie_sh.cpp:60
+
+ void exceptions (
+ const ::CORBA::ExceptionDefSeq & exceptions
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ));
+
+ private:
+ T *ptr_;
+ PortableServer::POA_var poa_;
+ ::CORBA::Boolean rel_;
+
+ // copy and assignment are not allowed
+ FactoryDef_tie (const FactoryDef_tie &);
+ void operator= (const FactoryDef_tie &);
+ };
+
+ // TAO_IDL - Generated from
+ // be\be_visitor_interface/tie_sh.cpp:87
+
+ // TIE class: Refer to CORBA v2.2, Section 20.34.4
+ template <class T>
+ class FinderDef_tie : public FinderDef
+ {
+ public:
+ /// the T& ctor
+ FinderDef_tie (T &t);
+ /// ctor taking a POA
+ FinderDef_tie (T &t, PortableServer::POA_ptr poa);
+ /// ctor taking pointer and an ownership flag
+ FinderDef_tie (T *tp, ::CORBA::Boolean release = true);
+ /// ctor with T*, ownership flag and a POA
+ FinderDef_tie (
+ T *tp,
+ PortableServer::POA_ptr poa,
+ ::CORBA::Boolean release = true
+ );
+ /// dtor
+
+ ~FinderDef_tie (void);
+ // TIE specific functions
+ /// return the underlying object
+ T *_tied_object (void);
+ /// set the underlying object
+ void _tied_object (T &obj);
+ /// set the underlying object and the ownership flag
+ void _tied_object (T *obj, ::CORBA::Boolean release = true);
+ /// do we own it
+ ::CORBA::Boolean _is_owner (void);
+ /// set the ownership
+
+ void _is_owner ( ::CORBA::Boolean b);
+ // overridden ServantBase operations
+ PortableServer::POA_ptr _default_POA (
+ ACE_ENV_SINGLE_ARG_DECL_WITH_DEFAULTS
+ );
+
+ // TAO_IDL - Generated from
+ // be\be_visitor_operation/tie_sh.cpp:60
+
+ ::CORBA::DefinitionKind def_kind (
+ ACE_ENV_SINGLE_ARG_DECL_WITH_DEFAULTS
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ));
+
+ // TAO_IDL - Generated from
+ // be\be_visitor_operation/tie_sh.cpp:60
+
+ void destroy (
+ ACE_ENV_SINGLE_ARG_DECL_WITH_DEFAULTS
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ));
+
+ // TAO_IDL - Generated from
+ // be\be_visitor_operation/tie_sh.cpp:60
+
+ char * id (
+ ACE_ENV_SINGLE_ARG_DECL_WITH_DEFAULTS
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ));
+
+ // TAO_IDL - Generated from
+ // be\be_visitor_operation/tie_sh.cpp:60
+
+ void id (
+ const char * id
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ));
+
+ // TAO_IDL - Generated from
+ // be\be_visitor_operation/tie_sh.cpp:60
+
+ char * name (
+ ACE_ENV_SINGLE_ARG_DECL_WITH_DEFAULTS
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ));
+
+ // TAO_IDL - Generated from
+ // be\be_visitor_operation/tie_sh.cpp:60
+
+ void name (
+ const char * name
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ));
+
+ // TAO_IDL - Generated from
+ // be\be_visitor_operation/tie_sh.cpp:60
+
+ char * version (
+ ACE_ENV_SINGLE_ARG_DECL_WITH_DEFAULTS
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ));
+
+ // TAO_IDL - Generated from
+ // be\be_visitor_operation/tie_sh.cpp:60
+
+ void version (
+ const char * version
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ));
+
+ // TAO_IDL - Generated from
+ // be\be_visitor_operation/tie_sh.cpp:60
+
+ ::CORBA::Container_ptr defined_in (
+ ACE_ENV_SINGLE_ARG_DECL_WITH_DEFAULTS
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ));
+
+ // TAO_IDL - Generated from
+ // be\be_visitor_operation/tie_sh.cpp:60
+
+ char * absolute_name (
+ ACE_ENV_SINGLE_ARG_DECL_WITH_DEFAULTS
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ));
+
+ // TAO_IDL - Generated from
+ // be\be_visitor_operation/tie_sh.cpp:60
+
+ ::CORBA::Repository_ptr containing_repository (
+ ACE_ENV_SINGLE_ARG_DECL_WITH_DEFAULTS
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ));
+
+ // TAO_IDL - Generated from
+ // be\be_visitor_operation/tie_sh.cpp:60
+
+ ::CORBA::Contained::Description * describe (
+ ACE_ENV_SINGLE_ARG_DECL_WITH_DEFAULTS
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ));
+
+ // TAO_IDL - Generated from
+ // be\be_visitor_operation/tie_sh.cpp:60
+
+ void move (
+ ::CORBA::Container_ptr new_container,
+ const char * new_name,
+ const char * new_version
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ));
+
+ // TAO_IDL - Generated from
+ // be\be_visitor_operation/tie_sh.cpp:60
+
+ ::CORBA::TypeCode_ptr result (
+ ACE_ENV_SINGLE_ARG_DECL_WITH_DEFAULTS
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ));
+
+ // TAO_IDL - Generated from
+ // be\be_visitor_operation/tie_sh.cpp:60
+
+ ::CORBA::IDLType_ptr result_def (
+ ACE_ENV_SINGLE_ARG_DECL_WITH_DEFAULTS
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ));
+
+ // TAO_IDL - Generated from
+ // be\be_visitor_operation/tie_sh.cpp:60
+
+ void result_def (
+ ::CORBA::IDLType_ptr result_def
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ));
+
+ // TAO_IDL - Generated from
+ // be\be_visitor_operation/tie_sh.cpp:60
+
+ ::CORBA::ParDescriptionSeq * params (
+ ACE_ENV_SINGLE_ARG_DECL_WITH_DEFAULTS
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ));
+
+ // TAO_IDL - Generated from
+ // be\be_visitor_operation/tie_sh.cpp:60
+
+ void params (
+ const ::CORBA::ParDescriptionSeq & params
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ));
+
+ // TAO_IDL - Generated from
+ // be\be_visitor_operation/tie_sh.cpp:60
+
+ ::CORBA::OperationMode mode (
+ ACE_ENV_SINGLE_ARG_DECL_WITH_DEFAULTS
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ));
+
+ // TAO_IDL - Generated from
+ // be\be_visitor_operation/tie_sh.cpp:60
+
+ void mode (
+ ::CORBA::OperationMode mode
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ));
+
+ // TAO_IDL - Generated from
+ // be\be_visitor_operation/tie_sh.cpp:60
+
+ ::CORBA::ContextIdSeq * contexts (
+ ACE_ENV_SINGLE_ARG_DECL_WITH_DEFAULTS
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ));
+
+ // TAO_IDL - Generated from
+ // be\be_visitor_operation/tie_sh.cpp:60
+
+ void contexts (
+ const ::CORBA::ContextIdSeq & contexts
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ));
+
+ // TAO_IDL - Generated from
+ // be\be_visitor_operation/tie_sh.cpp:60
+
+ ::CORBA::ExceptionDefSeq * exceptions (
+ ACE_ENV_SINGLE_ARG_DECL_WITH_DEFAULTS
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ));
+
+ // TAO_IDL - Generated from
+ // be\be_visitor_operation/tie_sh.cpp:60
+
+ void exceptions (
+ const ::CORBA::ExceptionDefSeq & exceptions
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ));
+
+ private:
+ T *ptr_;
+ PortableServer::POA_var poa_;
+ ::CORBA::Boolean rel_;
+
+ // copy and assignment are not allowed
+ FinderDef_tie (const FinderDef_tie &);
+ void operator= (const FinderDef_tie &);
+ };
+
+ // TAO_IDL - Generated from
+ // be\be_visitor_interface/tie_sh.cpp:87
+
+ // TIE class: Refer to CORBA v2.2, Section 20.34.4
+ template <class T>
+ class HomeDef_tie : public HomeDef
+ {
+ public:
+ /// the T& ctor
+ HomeDef_tie (T &t);
+ /// ctor taking a POA
+ HomeDef_tie (T &t, PortableServer::POA_ptr poa);
+ /// ctor taking pointer and an ownership flag
+ HomeDef_tie (T *tp, ::CORBA::Boolean release = true);
+ /// ctor with T*, ownership flag and a POA
+ HomeDef_tie (
+ T *tp,
+ PortableServer::POA_ptr poa,
+ ::CORBA::Boolean release = true
+ );
+ /// dtor
+
+ ~HomeDef_tie (void);
+ // TIE specific functions
+ /// return the underlying object
+ T *_tied_object (void);
+ /// set the underlying object
+ void _tied_object (T &obj);
+ /// set the underlying object and the ownership flag
+ void _tied_object (T *obj, ::CORBA::Boolean release = true);
+ /// do we own it
+ ::CORBA::Boolean _is_owner (void);
+ /// set the ownership
+
+ void _is_owner ( ::CORBA::Boolean b);
+ // overridden ServantBase operations
+ PortableServer::POA_ptr _default_POA (
+ ACE_ENV_SINGLE_ARG_DECL_WITH_DEFAULTS
+ );
+
+ // TAO_IDL - Generated from
+ // be\be_visitor_operation/tie_sh.cpp:60
+
+ ::CORBA::DefinitionKind def_kind (
+ ACE_ENV_SINGLE_ARG_DECL_WITH_DEFAULTS
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ));
+
+ // TAO_IDL - Generated from
+ // be\be_visitor_operation/tie_sh.cpp:60
+
+ void destroy (
+ ACE_ENV_SINGLE_ARG_DECL_WITH_DEFAULTS
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ));
+
+ // TAO_IDL - Generated from
+ // be\be_visitor_operation/tie_sh.cpp:60
+
+ ::CORBA::Contained_ptr lookup (
+ const char * search_name
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ));
+
+ // TAO_IDL - Generated from
+ // be\be_visitor_operation/tie_sh.cpp:60
+
+ ::CORBA::ContainedSeq * contents (
+ ::CORBA::DefinitionKind limit_type,
+ ::CORBA::Boolean exclude_inherited
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ));
+
+ // TAO_IDL - Generated from
+ // be\be_visitor_operation/tie_sh.cpp:60
+
+ ::CORBA::ContainedSeq * lookup_name (
+ const char * search_name,
+ ::CORBA::Long levels_to_search,
+ ::CORBA::DefinitionKind limit_type,
+ ::CORBA::Boolean exclude_inherited
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ));
+
+ // TAO_IDL - Generated from
+ // be\be_visitor_operation/tie_sh.cpp:60
+
+ ::CORBA::Container::DescriptionSeq * describe_contents (
+ ::CORBA::DefinitionKind limit_type,
+ ::CORBA::Boolean exclude_inherited,
+ ::CORBA::Long max_returned_objs
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ));
+
+ // TAO_IDL - Generated from
+ // be\be_visitor_operation/tie_sh.cpp:60
+
+ ::CORBA::ModuleDef_ptr create_module (
+ const char * id,
+ const char * name,
+ const char * version
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ));
+
+ // TAO_IDL - Generated from
+ // be\be_visitor_operation/tie_sh.cpp:60
+
+ ::CORBA::ConstantDef_ptr create_constant (
+ const char * id,
+ const char * name,
+ const char * version,
+ ::CORBA::IDLType_ptr type,
+ const ::CORBA::Any & value
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ));
+
+ // TAO_IDL - Generated from
+ // be\be_visitor_operation/tie_sh.cpp:60
+
+ ::CORBA::StructDef_ptr create_struct (
+ const char * id,
+ const char * name,
+ const char * version,
+ const ::CORBA::StructMemberSeq & members
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ));
+
+ // TAO_IDL - Generated from
+ // be\be_visitor_operation/tie_sh.cpp:60
+
+ ::CORBA::UnionDef_ptr create_union (
+ const char * id,
+ const char * name,
+ const char * version,
+ ::CORBA::IDLType_ptr discriminator_type,
+ const ::CORBA::UnionMemberSeq & members
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ));
+
+ // TAO_IDL - Generated from
+ // be\be_visitor_operation/tie_sh.cpp:60
+
+ ::CORBA::EnumDef_ptr create_enum (
+ const char * id,
+ const char * name,
+ const char * version,
+ const ::CORBA::EnumMemberSeq & members
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ));
+
+ // TAO_IDL - Generated from
+ // be\be_visitor_operation/tie_sh.cpp:60
+
+ ::CORBA::AliasDef_ptr create_alias (
+ const char * id,
+ const char * name,
+ const char * version,
+ ::CORBA::IDLType_ptr original_type
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ));
+
+ // TAO_IDL - Generated from
+ // be\be_visitor_operation/tie_sh.cpp:60
+
+ ::CORBA::InterfaceDef_ptr create_interface (
+ const char * id,
+ const char * name,
+ const char * version,
+ const ::CORBA::InterfaceDefSeq & base_interfaces
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ));
+
+ // TAO_IDL - Generated from
+ // be\be_visitor_operation/tie_sh.cpp:60
+
+ ::CORBA::ValueDef_ptr create_value (
+ const char * id,
+ const char * name,
+ const char * version,
+ ::CORBA::Boolean is_custom,
+ ::CORBA::Boolean is_abstract,
+ ::CORBA::ValueDef_ptr base_value,
+ ::CORBA::Boolean is_truncatable,
+ const ::CORBA::ValueDefSeq & abstract_base_values,
+ const ::CORBA::InterfaceDefSeq & supported_interfaces,
+ const ::CORBA::InitializerSeq & initializers
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ));
+
+ // TAO_IDL - Generated from
+ // be\be_visitor_operation/tie_sh.cpp:60
+
+ ::CORBA::ValueBoxDef_ptr create_value_box (
+ const char * id,
+ const char * name,
+ const char * version,
+ ::CORBA::IDLType_ptr original_type_def
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ));
+
+ // TAO_IDL - Generated from
+ // be\be_visitor_operation/tie_sh.cpp:60
+
+ ::CORBA::ExceptionDef_ptr create_exception (
+ const char * id,
+ const char * name,
+ const char * version,
+ const ::CORBA::StructMemberSeq & members
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ));
+
+ // TAO_IDL - Generated from
+ // be\be_visitor_operation/tie_sh.cpp:60
+
+ ::CORBA::NativeDef_ptr create_native (
+ const char * id,
+ const char * name,
+ const char * version
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ));
+
+ // TAO_IDL - Generated from
+ // be\be_visitor_operation/tie_sh.cpp:60
+
+ ::CORBA::AbstractInterfaceDef_ptr create_abstract_interface (
+ const char * id,
+ const char * name,
+ const char * version,
+ const ::CORBA::AbstractInterfaceDefSeq & base_interfaces
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ));
+
+ // TAO_IDL - Generated from
+ // be\be_visitor_operation/tie_sh.cpp:60
+
+ ::CORBA::LocalInterfaceDef_ptr create_local_interface (
+ const char * id,
+ const char * name,
+ const char * version,
+ const ::CORBA::InterfaceDefSeq & base_interfaces
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ));
+
+ // TAO_IDL - Generated from
+ // be\be_visitor_operation/tie_sh.cpp:60
+
+ ::CORBA::ExtValueDef_ptr create_ext_value (
+ const char * id,
+ const char * name,
+ const char * version,
+ ::CORBA::Boolean is_custom,
+ ::CORBA::Boolean is_abstract,
+ ::CORBA::ValueDef_ptr base_value,
+ ::CORBA::Boolean is_truncatable,
+ const ::CORBA::ValueDefSeq & abstract_base_values,
+ const ::CORBA::InterfaceDefSeq & supported_interfaces,
+ const ::CORBA::ExtInitializerSeq & initializers
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ));
+
+ // TAO_IDL - Generated from
+ // be\be_visitor_operation/tie_sh.cpp:60
+
+ char * id (
+ ACE_ENV_SINGLE_ARG_DECL_WITH_DEFAULTS
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ));
+
+ // TAO_IDL - Generated from
+ // be\be_visitor_operation/tie_sh.cpp:60
+
+ void id (
+ const char * id
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ));
+
+ // TAO_IDL - Generated from
+ // be\be_visitor_operation/tie_sh.cpp:60
+
+ char * name (
+ ACE_ENV_SINGLE_ARG_DECL_WITH_DEFAULTS
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ));
+
+ // TAO_IDL - Generated from
+ // be\be_visitor_operation/tie_sh.cpp:60
+
+ void name (
+ const char * name
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ));
+
+ // TAO_IDL - Generated from
+ // be\be_visitor_operation/tie_sh.cpp:60
+
+ char * version (
+ ACE_ENV_SINGLE_ARG_DECL_WITH_DEFAULTS
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ));
+
+ // TAO_IDL - Generated from
+ // be\be_visitor_operation/tie_sh.cpp:60
+
+ void version (
+ const char * version
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ));
+
+ // TAO_IDL - Generated from
+ // be\be_visitor_operation/tie_sh.cpp:60
+
+ ::CORBA::Container_ptr defined_in (
+ ACE_ENV_SINGLE_ARG_DECL_WITH_DEFAULTS
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ));
+
+ // TAO_IDL - Generated from
+ // be\be_visitor_operation/tie_sh.cpp:60
+
+ char * absolute_name (
+ ACE_ENV_SINGLE_ARG_DECL_WITH_DEFAULTS
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ));
+
+ // TAO_IDL - Generated from
+ // be\be_visitor_operation/tie_sh.cpp:60
+
+ ::CORBA::Repository_ptr containing_repository (
+ ACE_ENV_SINGLE_ARG_DECL_WITH_DEFAULTS
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ));
+
+ // TAO_IDL - Generated from
+ // be\be_visitor_operation/tie_sh.cpp:60
+
+ ::CORBA::Contained::Description * describe (
+ ACE_ENV_SINGLE_ARG_DECL_WITH_DEFAULTS
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ));
+
+ // TAO_IDL - Generated from
+ // be\be_visitor_operation/tie_sh.cpp:60
+
+ void move (
+ ::CORBA::Container_ptr new_container,
+ const char * new_name,
+ const char * new_version
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ));
+
+ // TAO_IDL - Generated from
+ // be\be_visitor_operation/tie_sh.cpp:60
+
+ ::CORBA::TypeCode_ptr type (
+ ACE_ENV_SINGLE_ARG_DECL_WITH_DEFAULTS
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ));
+
+ // TAO_IDL - Generated from
+ // be\be_visitor_operation/tie_sh.cpp:60
+
+ ::CORBA::InterfaceDefSeq * base_interfaces (
+ ACE_ENV_SINGLE_ARG_DECL_WITH_DEFAULTS
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ));
+
+ // TAO_IDL - Generated from
+ // be\be_visitor_operation/tie_sh.cpp:60
+
+ void base_interfaces (
+ const ::CORBA::InterfaceDefSeq & base_interfaces
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ));
+
+ // TAO_IDL - Generated from
+ // be\be_visitor_operation/tie_sh.cpp:60
+
+ ::CORBA::Boolean is_a (
+ const char * interface_id
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ));
+
+ // TAO_IDL - Generated from
+ // be\be_visitor_operation/tie_sh.cpp:60
+
+ ::CORBA::InterfaceDef::FullInterfaceDescription * describe_interface (
+ ACE_ENV_SINGLE_ARG_DECL_WITH_DEFAULTS
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ));
+
+ // TAO_IDL - Generated from
+ // be\be_visitor_operation/tie_sh.cpp:60
+
+ ::CORBA::AttributeDef_ptr create_attribute (
+ const char * id,
+ const char * name,
+ const char * version,
+ ::CORBA::IDLType_ptr type,
+ ::CORBA::AttributeMode mode
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ));
+
+ // TAO_IDL - Generated from
+ // be\be_visitor_operation/tie_sh.cpp:60
+
+ ::CORBA::OperationDef_ptr create_operation (
+ const char * id,
+ const char * name,
+ const char * version,
+ ::CORBA::IDLType_ptr result,
+ ::CORBA::OperationMode mode,
+ const ::CORBA::ParDescriptionSeq & params,
+ const ::CORBA::ExceptionDefSeq & exceptions,
+ const ::CORBA::ContextIdSeq & contexts
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ));
+
+ // TAO_IDL - Generated from
+ // be\be_visitor_operation/tie_sh.cpp:60
+
+ ::CORBA::InterfaceAttrExtension::ExtFullInterfaceDescription * describe_ext_interface (
+ ACE_ENV_SINGLE_ARG_DECL_WITH_DEFAULTS
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ));
+
+ // TAO_IDL - Generated from
+ // be\be_visitor_operation/tie_sh.cpp:60
+
+ ::CORBA::ExtAttributeDef_ptr create_ext_attribute (
+ const char * id,
+ const char * name,
+ const char * version,
+ ::CORBA::IDLType_ptr type,
+ ::CORBA::AttributeMode mode,
+ const ::CORBA::ExceptionDefSeq & get_exceptions,
+ const ::CORBA::ExceptionDefSeq & set_exceptions
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ));
+
+ // TAO_IDL - Generated from
+ // be\be_visitor_operation/tie_sh.cpp:60
+
+ ::CORBA::ComponentIR::HomeDef_ptr base_home (
+ ACE_ENV_SINGLE_ARG_DECL_WITH_DEFAULTS
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ));
+
+ // TAO_IDL - Generated from
+ // be\be_visitor_operation/tie_sh.cpp:60
+
+ void base_home (
+ ::CORBA::ComponentIR::HomeDef_ptr base_home
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ));
+
+ // TAO_IDL - Generated from
+ // be\be_visitor_operation/tie_sh.cpp:60
+
+ ::CORBA::InterfaceDefSeq * supported_interfaces (
+ ACE_ENV_SINGLE_ARG_DECL_WITH_DEFAULTS
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ));
+
+ // TAO_IDL - Generated from
+ // be\be_visitor_operation/tie_sh.cpp:60
+
+ void supported_interfaces (
+ const ::CORBA::InterfaceDefSeq & supported_interfaces
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ));
+
+ // TAO_IDL - Generated from
+ // be\be_visitor_operation/tie_sh.cpp:60
+
+ ::CORBA::ComponentIR::ComponentDef_ptr managed_component (
+ ACE_ENV_SINGLE_ARG_DECL_WITH_DEFAULTS
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ));
+
+ // TAO_IDL - Generated from
+ // be\be_visitor_operation/tie_sh.cpp:60
+
+ void managed_component (
+ ::CORBA::ComponentIR::ComponentDef_ptr managed_component
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ));
+
+ // TAO_IDL - Generated from
+ // be\be_visitor_operation/tie_sh.cpp:60
+
+ ::CORBA::ValueDef_ptr primary_key (
+ ACE_ENV_SINGLE_ARG_DECL_WITH_DEFAULTS
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ));
+
+ // TAO_IDL - Generated from
+ // be\be_visitor_operation/tie_sh.cpp:60
+
+ void primary_key (
+ ::CORBA::ValueDef_ptr primary_key
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ));
+
+ // TAO_IDL - Generated from
+ // be\be_visitor_operation/tie_sh.cpp:60
+
+ ::CORBA::ComponentIR::FactoryDef_ptr create_factory (
+ const char * id,
+ const char * name,
+ const char * version,
+ const ::CORBA::ParDescriptionSeq & params,
+ const ::CORBA::ExceptionDefSeq & exceptions
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ));
+
+ // TAO_IDL - Generated from
+ // be\be_visitor_operation/tie_sh.cpp:60
+
+ ::CORBA::ComponentIR::FinderDef_ptr create_finder (
+ const char * id,
+ const char * name,
+ const char * version,
+ const ::CORBA::ParDescriptionSeq & params,
+ const ::CORBA::ExceptionDefSeq & exceptions
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ));
+
+ private:
+ T *ptr_;
+ PortableServer::POA_var poa_;
+ ::CORBA::Boolean rel_;
+
+ // copy and assignment are not allowed
+ HomeDef_tie (const HomeDef_tie &);
+ void operator= (const HomeDef_tie &);
+ };
+ } // module CORBA::ComponentIR
+} // module CORBA
+
+// TAO_IDL - Generated from
+// be\be_codegen.cpp:1322
+
+
+TAO_END_VERSIONED_NAMESPACE_DECL
+
+#if defined (__ACE_INLINE__)
+#include "IFR_ComponentsS_T.inl"
+#endif /* defined INLINE */
+
+#if defined (ACE_TEMPLATES_REQUIRE_SOURCE)
+#include "IFR_ComponentsS_T.cpp"
+#endif /* defined REQUIRED SOURCE */
+
+#if defined (ACE_TEMPLATES_REQUIRE_PRAGMA)
+#pragma implementation ("IFR_ComponentsS_T.cpp")
+#endif /* defined REQUIRED PRAGMA */
+
+#include /**/ "ace/post.h"
+#endif /* ifndef */
+
diff --git a/TAO/orbsvcs/orbsvcs/IFRService/IFR_ComponentsS_T.inl b/TAO/orbsvcs/orbsvcs/IFRService/IFR_ComponentsS_T.inl
new file mode 100644
index 00000000000..eae67ae179d
--- /dev/null
+++ b/TAO/orbsvcs/orbsvcs/IFRService/IFR_ComponentsS_T.inl
@@ -0,0 +1,9019 @@
+// -*- C++ -*-
+//
+// $Id$
+
+// **** Code generated by the The ACE ORB (TAO) IDL Compiler ****
+// TAO and the TAO IDL Compiler have been developed by:
+// Center for Distributed Object Computing
+// Washington University
+// St. Louis, MO
+// USA
+// http://www.cs.wustl.edu/~schmidt/doc-center.html
+// and
+// Distributed Object Computing Laboratory
+// University of California at Irvine
+// Irvine, CA
+// USA
+// http://doc.ece.uci.edu/
+// and
+// Institute for Software Integrated Systems
+// Vanderbilt University
+// Nashville, TN
+// USA
+// http://www.isis.vanderbilt.edu/
+//
+// Information about TAO is available at:
+// http://www.cs.wustl.edu/~schmidt/TAO.html
+
+
+TAO_BEGIN_VERSIONED_NAMESPACE_DECL
+
+
+
+// TAO_IDL - Generated from
+// be\be_visitor_interface/tie_si.cpp:96
+
+template <class T> ACE_INLINE
+POA_CORBA::ComponentIR::EventDef_tie<T>::EventDef_tie (T &t)
+ : ptr_ (&t),
+ poa_ (PortableServer::POA::_nil ()),
+ rel_ (0)
+{}
+
+template <class T> ACE_INLINE
+POA_CORBA::ComponentIR::EventDef_tie<T>::EventDef_tie (T &t, PortableServer::POA_ptr poa)
+ : ptr_ (&t),
+ poa_ (PortableServer::POA::_duplicate (poa)),
+ rel_ (0)
+{}
+
+template <class T> ACE_INLINE
+POA_CORBA::ComponentIR::EventDef_tie<T>::EventDef_tie (T *tp, ::CORBA::Boolean release)
+ : ptr_ (tp),
+ poa_ (PortableServer::POA::_nil ()),
+ rel_ (release)
+{}
+
+template <class T> ACE_INLINE
+POA_CORBA::ComponentIR::EventDef_tie<T>::EventDef_tie (T *tp, PortableServer::POA_ptr poa, ::CORBA::Boolean release)
+ : ptr_ (tp),
+ poa_ (PortableServer::POA::_duplicate (poa)),
+ rel_ (release)
+{}
+
+template <class T> ACE_INLINE
+POA_CORBA::ComponentIR::EventDef_tie<T>::~EventDef_tie (void)
+{
+ if (this->rel_)
+ {
+ delete this->ptr_;
+ }
+}
+
+template <class T> ACE_INLINE T *
+POA_CORBA::ComponentIR::EventDef_tie<T>::_tied_object (void)
+{
+ return this->ptr_;
+}
+
+template <class T> ACE_INLINE void
+POA_CORBA::ComponentIR::EventDef_tie<T>::_tied_object (T &obj)
+{
+ if (this->rel_)
+ {
+ delete this->ptr_;
+ }
+
+ this->ptr_ = &obj;
+ this->rel_ = 0;
+}
+
+template <class T> ACE_INLINE void
+POA_CORBA::ComponentIR::EventDef_tie<T>::_tied_object (T *obj, ::CORBA::Boolean release)
+{
+ if (this->rel_)
+ {
+ delete this->ptr_;
+ }
+
+ this->ptr_ = obj;
+ this->rel_ = release;
+}
+
+template <class T> ACE_INLINE ::CORBA::Boolean
+POA_CORBA::ComponentIR::EventDef_tie<T>::_is_owner (void)
+{
+ return this->rel_;
+}
+
+template <class T> ACE_INLINE void
+POA_CORBA::ComponentIR::EventDef_tie<T>::_is_owner ( ::CORBA::Boolean b)
+{
+ this->rel_ = b;
+}
+
+template <class T> ACE_INLINE PortableServer::POA_ptr
+POA_CORBA::ComponentIR::EventDef_tie<T>::_default_POA (ACE_ENV_SINGLE_ARG_DECL)
+{
+ if (! ::CORBA::is_nil (this->poa_.in ()))
+ {
+ return PortableServer::POA::_duplicate (this->poa_.in ());
+ }
+
+ return this->EventDef::_default_POA (ACE_ENV_SINGLE_ARG_PARAMETER);
+}
+
+// TAO_IDL - Generated from
+// be\be_visitor_operation/tie_si.cpp:101
+
+template <class T> ACE_INLINE
+::CORBA::DefinitionKind POA_CORBA::ComponentIR::EventDef_tie<T>::def_kind (
+ ACE_ENV_SINGLE_ARG_DECL
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ))
+{
+ return this->ptr_->def_kind (
+ ACE_ENV_SINGLE_ARG_PARAMETER
+ );
+}
+
+// TAO_IDL - Generated from
+// be\be_visitor_operation/tie_si.cpp:101
+
+template <class T> ACE_INLINE
+void POA_CORBA::ComponentIR::EventDef_tie<T>::destroy (
+ ACE_ENV_SINGLE_ARG_DECL
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ))
+{
+ this->ptr_->destroy (
+ ACE_ENV_SINGLE_ARG_PARAMETER
+ );
+}
+
+// TAO_IDL - Generated from
+// be\be_visitor_operation/tie_si.cpp:101
+
+template <class T> ACE_INLINE
+::CORBA::Contained_ptr POA_CORBA::ComponentIR::EventDef_tie<T>::lookup (
+ const char * search_name
+ ACE_ENV_ARG_DECL
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ))
+{
+ return this->ptr_->lookup (
+ search_name
+ ACE_ENV_ARG_PARAMETER
+ );
+}
+
+// TAO_IDL - Generated from
+// be\be_visitor_operation/tie_si.cpp:101
+
+template <class T> ACE_INLINE
+::CORBA::ContainedSeq * POA_CORBA::ComponentIR::EventDef_tie<T>::contents (
+ ::CORBA::DefinitionKind limit_type,
+ ::CORBA::Boolean exclude_inherited
+ ACE_ENV_ARG_DECL
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ))
+{
+ return this->ptr_->contents (
+ limit_type,
+ exclude_inherited
+ ACE_ENV_ARG_PARAMETER
+ );
+}
+
+// TAO_IDL - Generated from
+// be\be_visitor_operation/tie_si.cpp:101
+
+template <class T> ACE_INLINE
+::CORBA::ContainedSeq * POA_CORBA::ComponentIR::EventDef_tie<T>::lookup_name (
+ const char * search_name,
+ ::CORBA::Long levels_to_search,
+ ::CORBA::DefinitionKind limit_type,
+ ::CORBA::Boolean exclude_inherited
+ ACE_ENV_ARG_DECL
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ))
+{
+ return this->ptr_->lookup_name (
+ search_name,
+ levels_to_search,
+ limit_type,
+ exclude_inherited
+ ACE_ENV_ARG_PARAMETER
+ );
+}
+
+// TAO_IDL - Generated from
+// be\be_visitor_operation/tie_si.cpp:101
+
+template <class T> ACE_INLINE
+::CORBA::Container::DescriptionSeq * POA_CORBA::ComponentIR::EventDef_tie<T>::describe_contents (
+ ::CORBA::DefinitionKind limit_type,
+ ::CORBA::Boolean exclude_inherited,
+ ::CORBA::Long max_returned_objs
+ ACE_ENV_ARG_DECL
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ))
+{
+ return this->ptr_->describe_contents (
+ limit_type,
+ exclude_inherited,
+ max_returned_objs
+ ACE_ENV_ARG_PARAMETER
+ );
+}
+
+// TAO_IDL - Generated from
+// be\be_visitor_operation/tie_si.cpp:101
+
+template <class T> ACE_INLINE
+::CORBA::ModuleDef_ptr POA_CORBA::ComponentIR::EventDef_tie<T>::create_module (
+ const char * id,
+ const char * name,
+ const char * version
+ ACE_ENV_ARG_DECL
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ))
+{
+ return this->ptr_->create_module (
+ id,
+ name,
+ version
+ ACE_ENV_ARG_PARAMETER
+ );
+}
+
+// TAO_IDL - Generated from
+// be\be_visitor_operation/tie_si.cpp:101
+
+template <class T> ACE_INLINE
+::CORBA::ConstantDef_ptr POA_CORBA::ComponentIR::EventDef_tie<T>::create_constant (
+ const char * id,
+ const char * name,
+ const char * version,
+ ::CORBA::IDLType_ptr type,
+ const ::CORBA::Any & value
+ ACE_ENV_ARG_DECL
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ))
+{
+ return this->ptr_->create_constant (
+ id,
+ name,
+ version,
+ type,
+ value
+ ACE_ENV_ARG_PARAMETER
+ );
+}
+
+// TAO_IDL - Generated from
+// be\be_visitor_operation/tie_si.cpp:101
+
+template <class T> ACE_INLINE
+::CORBA::StructDef_ptr POA_CORBA::ComponentIR::EventDef_tie<T>::create_struct (
+ const char * id,
+ const char * name,
+ const char * version,
+ const ::CORBA::StructMemberSeq & members
+ ACE_ENV_ARG_DECL
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ))
+{
+ return this->ptr_->create_struct (
+ id,
+ name,
+ version,
+ members
+ ACE_ENV_ARG_PARAMETER
+ );
+}
+
+// TAO_IDL - Generated from
+// be\be_visitor_operation/tie_si.cpp:101
+
+template <class T> ACE_INLINE
+::CORBA::UnionDef_ptr POA_CORBA::ComponentIR::EventDef_tie<T>::create_union (
+ const char * id,
+ const char * name,
+ const char * version,
+ ::CORBA::IDLType_ptr discriminator_type,
+ const ::CORBA::UnionMemberSeq & members
+ ACE_ENV_ARG_DECL
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ))
+{
+ return this->ptr_->create_union (
+ id,
+ name,
+ version,
+ discriminator_type,
+ members
+ ACE_ENV_ARG_PARAMETER
+ );
+}
+
+// TAO_IDL - Generated from
+// be\be_visitor_operation/tie_si.cpp:101
+
+template <class T> ACE_INLINE
+::CORBA::EnumDef_ptr POA_CORBA::ComponentIR::EventDef_tie<T>::create_enum (
+ const char * id,
+ const char * name,
+ const char * version,
+ const ::CORBA::EnumMemberSeq & members
+ ACE_ENV_ARG_DECL
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ))
+{
+ return this->ptr_->create_enum (
+ id,
+ name,
+ version,
+ members
+ ACE_ENV_ARG_PARAMETER
+ );
+}
+
+// TAO_IDL - Generated from
+// be\be_visitor_operation/tie_si.cpp:101
+
+template <class T> ACE_INLINE
+::CORBA::AliasDef_ptr POA_CORBA::ComponentIR::EventDef_tie<T>::create_alias (
+ const char * id,
+ const char * name,
+ const char * version,
+ ::CORBA::IDLType_ptr original_type
+ ACE_ENV_ARG_DECL
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ))
+{
+ return this->ptr_->create_alias (
+ id,
+ name,
+ version,
+ original_type
+ ACE_ENV_ARG_PARAMETER
+ );
+}
+
+// TAO_IDL - Generated from
+// be\be_visitor_operation/tie_si.cpp:101
+
+template <class T> ACE_INLINE
+::CORBA::InterfaceDef_ptr POA_CORBA::ComponentIR::EventDef_tie<T>::create_interface (
+ const char * id,
+ const char * name,
+ const char * version,
+ const ::CORBA::InterfaceDefSeq & base_interfaces
+ ACE_ENV_ARG_DECL
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ))
+{
+ return this->ptr_->create_interface (
+ id,
+ name,
+ version,
+ base_interfaces
+ ACE_ENV_ARG_PARAMETER
+ );
+}
+
+// TAO_IDL - Generated from
+// be\be_visitor_operation/tie_si.cpp:101
+
+template <class T> ACE_INLINE
+::CORBA::ValueDef_ptr POA_CORBA::ComponentIR::EventDef_tie<T>::create_value (
+ const char * id,
+ const char * name,
+ const char * version,
+ ::CORBA::Boolean is_custom,
+ ::CORBA::Boolean is_abstract,
+ ::CORBA::ValueDef_ptr base_value,
+ ::CORBA::Boolean is_truncatable,
+ const ::CORBA::ValueDefSeq & abstract_base_values,
+ const ::CORBA::InterfaceDefSeq & supported_interfaces,
+ const ::CORBA::InitializerSeq & initializers
+ ACE_ENV_ARG_DECL
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ))
+{
+ return this->ptr_->create_value (
+ id,
+ name,
+ version,
+ is_custom,
+ is_abstract,
+ base_value,
+ is_truncatable,
+ abstract_base_values,
+ supported_interfaces,
+ initializers
+ ACE_ENV_ARG_PARAMETER
+ );
+}
+
+// TAO_IDL - Generated from
+// be\be_visitor_operation/tie_si.cpp:101
+
+template <class T> ACE_INLINE
+::CORBA::ValueBoxDef_ptr POA_CORBA::ComponentIR::EventDef_tie<T>::create_value_box (
+ const char * id,
+ const char * name,
+ const char * version,
+ ::CORBA::IDLType_ptr original_type_def
+ ACE_ENV_ARG_DECL
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ))
+{
+ return this->ptr_->create_value_box (
+ id,
+ name,
+ version,
+ original_type_def
+ ACE_ENV_ARG_PARAMETER
+ );
+}
+
+// TAO_IDL - Generated from
+// be\be_visitor_operation/tie_si.cpp:101
+
+template <class T> ACE_INLINE
+::CORBA::ExceptionDef_ptr POA_CORBA::ComponentIR::EventDef_tie<T>::create_exception (
+ const char * id,
+ const char * name,
+ const char * version,
+ const ::CORBA::StructMemberSeq & members
+ ACE_ENV_ARG_DECL
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ))
+{
+ return this->ptr_->create_exception (
+ id,
+ name,
+ version,
+ members
+ ACE_ENV_ARG_PARAMETER
+ );
+}
+
+// TAO_IDL - Generated from
+// be\be_visitor_operation/tie_si.cpp:101
+
+template <class T> ACE_INLINE
+::CORBA::NativeDef_ptr POA_CORBA::ComponentIR::EventDef_tie<T>::create_native (
+ const char * id,
+ const char * name,
+ const char * version
+ ACE_ENV_ARG_DECL
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ))
+{
+ return this->ptr_->create_native (
+ id,
+ name,
+ version
+ ACE_ENV_ARG_PARAMETER
+ );
+}
+
+// TAO_IDL - Generated from
+// be\be_visitor_operation/tie_si.cpp:101
+
+template <class T> ACE_INLINE
+::CORBA::AbstractInterfaceDef_ptr POA_CORBA::ComponentIR::EventDef_tie<T>::create_abstract_interface (
+ const char * id,
+ const char * name,
+ const char * version,
+ const ::CORBA::AbstractInterfaceDefSeq & base_interfaces
+ ACE_ENV_ARG_DECL
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ))
+{
+ return this->ptr_->create_abstract_interface (
+ id,
+ name,
+ version,
+ base_interfaces
+ ACE_ENV_ARG_PARAMETER
+ );
+}
+
+// TAO_IDL - Generated from
+// be\be_visitor_operation/tie_si.cpp:101
+
+template <class T> ACE_INLINE
+::CORBA::LocalInterfaceDef_ptr POA_CORBA::ComponentIR::EventDef_tie<T>::create_local_interface (
+ const char * id,
+ const char * name,
+ const char * version,
+ const ::CORBA::InterfaceDefSeq & base_interfaces
+ ACE_ENV_ARG_DECL
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ))
+{
+ return this->ptr_->create_local_interface (
+ id,
+ name,
+ version,
+ base_interfaces
+ ACE_ENV_ARG_PARAMETER
+ );
+}
+
+// TAO_IDL - Generated from
+// be\be_visitor_operation/tie_si.cpp:101
+
+template <class T> ACE_INLINE
+::CORBA::ExtValueDef_ptr POA_CORBA::ComponentIR::EventDef_tie<T>::create_ext_value (
+ const char * id,
+ const char * name,
+ const char * version,
+ ::CORBA::Boolean is_custom,
+ ::CORBA::Boolean is_abstract,
+ ::CORBA::ValueDef_ptr base_value,
+ ::CORBA::Boolean is_truncatable,
+ const ::CORBA::ValueDefSeq & abstract_base_values,
+ const ::CORBA::InterfaceDefSeq & supported_interfaces,
+ const ::CORBA::ExtInitializerSeq & initializers
+ ACE_ENV_ARG_DECL
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ))
+{
+ return this->ptr_->create_ext_value (
+ id,
+ name,
+ version,
+ is_custom,
+ is_abstract,
+ base_value,
+ is_truncatable,
+ abstract_base_values,
+ supported_interfaces,
+ initializers
+ ACE_ENV_ARG_PARAMETER
+ );
+}
+
+// TAO_IDL - Generated from
+// be\be_visitor_operation/tie_si.cpp:101
+
+template <class T> ACE_INLINE
+char * POA_CORBA::ComponentIR::EventDef_tie<T>::id (
+ ACE_ENV_SINGLE_ARG_DECL
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ))
+{
+ return this->ptr_->id (
+ ACE_ENV_SINGLE_ARG_PARAMETER
+ );
+}
+
+// TAO_IDL - Generated from
+// be\be_visitor_operation/tie_si.cpp:101
+
+template <class T> ACE_INLINE
+void POA_CORBA::ComponentIR::EventDef_tie<T>::id (
+ const char * id
+ ACE_ENV_ARG_DECL
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ))
+{
+ this->ptr_->id (
+ id
+ ACE_ENV_ARG_PARAMETER
+ );
+}
+
+// TAO_IDL - Generated from
+// be\be_visitor_operation/tie_si.cpp:101
+
+template <class T> ACE_INLINE
+char * POA_CORBA::ComponentIR::EventDef_tie<T>::name (
+ ACE_ENV_SINGLE_ARG_DECL
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ))
+{
+ return this->ptr_->name (
+ ACE_ENV_SINGLE_ARG_PARAMETER
+ );
+}
+
+// TAO_IDL - Generated from
+// be\be_visitor_operation/tie_si.cpp:101
+
+template <class T> ACE_INLINE
+void POA_CORBA::ComponentIR::EventDef_tie<T>::name (
+ const char * name
+ ACE_ENV_ARG_DECL
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ))
+{
+ this->ptr_->name (
+ name
+ ACE_ENV_ARG_PARAMETER
+ );
+}
+
+// TAO_IDL - Generated from
+// be\be_visitor_operation/tie_si.cpp:101
+
+template <class T> ACE_INLINE
+char * POA_CORBA::ComponentIR::EventDef_tie<T>::version (
+ ACE_ENV_SINGLE_ARG_DECL
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ))
+{
+ return this->ptr_->version (
+ ACE_ENV_SINGLE_ARG_PARAMETER
+ );
+}
+
+// TAO_IDL - Generated from
+// be\be_visitor_operation/tie_si.cpp:101
+
+template <class T> ACE_INLINE
+void POA_CORBA::ComponentIR::EventDef_tie<T>::version (
+ const char * version
+ ACE_ENV_ARG_DECL
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ))
+{
+ this->ptr_->version (
+ version
+ ACE_ENV_ARG_PARAMETER
+ );
+}
+
+// TAO_IDL - Generated from
+// be\be_visitor_operation/tie_si.cpp:101
+
+template <class T> ACE_INLINE
+::CORBA::Container_ptr POA_CORBA::ComponentIR::EventDef_tie<T>::defined_in (
+ ACE_ENV_SINGLE_ARG_DECL
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ))
+{
+ return this->ptr_->defined_in (
+ ACE_ENV_SINGLE_ARG_PARAMETER
+ );
+}
+
+// TAO_IDL - Generated from
+// be\be_visitor_operation/tie_si.cpp:101
+
+template <class T> ACE_INLINE
+char * POA_CORBA::ComponentIR::EventDef_tie<T>::absolute_name (
+ ACE_ENV_SINGLE_ARG_DECL
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ))
+{
+ return this->ptr_->absolute_name (
+ ACE_ENV_SINGLE_ARG_PARAMETER
+ );
+}
+
+// TAO_IDL - Generated from
+// be\be_visitor_operation/tie_si.cpp:101
+
+template <class T> ACE_INLINE
+::CORBA::Repository_ptr POA_CORBA::ComponentIR::EventDef_tie<T>::containing_repository (
+ ACE_ENV_SINGLE_ARG_DECL
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ))
+{
+ return this->ptr_->containing_repository (
+ ACE_ENV_SINGLE_ARG_PARAMETER
+ );
+}
+
+// TAO_IDL - Generated from
+// be\be_visitor_operation/tie_si.cpp:101
+
+template <class T> ACE_INLINE
+::CORBA::Contained::Description * POA_CORBA::ComponentIR::EventDef_tie<T>::describe (
+ ACE_ENV_SINGLE_ARG_DECL
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ))
+{
+ return this->ptr_->describe (
+ ACE_ENV_SINGLE_ARG_PARAMETER
+ );
+}
+
+// TAO_IDL - Generated from
+// be\be_visitor_operation/tie_si.cpp:101
+
+template <class T> ACE_INLINE
+void POA_CORBA::ComponentIR::EventDef_tie<T>::move (
+ ::CORBA::Container_ptr new_container,
+ const char * new_name,
+ const char * new_version
+ ACE_ENV_ARG_DECL
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ))
+{
+ this->ptr_->move (
+ new_container,
+ new_name,
+ new_version
+ ACE_ENV_ARG_PARAMETER
+ );
+}
+
+// TAO_IDL - Generated from
+// be\be_visitor_operation/tie_si.cpp:101
+
+template <class T> ACE_INLINE
+::CORBA::TypeCode_ptr POA_CORBA::ComponentIR::EventDef_tie<T>::type (
+ ACE_ENV_SINGLE_ARG_DECL
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ))
+{
+ return this->ptr_->type (
+ ACE_ENV_SINGLE_ARG_PARAMETER
+ );
+}
+
+// TAO_IDL - Generated from
+// be\be_visitor_operation/tie_si.cpp:101
+
+template <class T> ACE_INLINE
+::CORBA::InterfaceDefSeq * POA_CORBA::ComponentIR::EventDef_tie<T>::supported_interfaces (
+ ACE_ENV_SINGLE_ARG_DECL
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ))
+{
+ return this->ptr_->supported_interfaces (
+ ACE_ENV_SINGLE_ARG_PARAMETER
+ );
+}
+
+// TAO_IDL - Generated from
+// be\be_visitor_operation/tie_si.cpp:101
+
+template <class T> ACE_INLINE
+void POA_CORBA::ComponentIR::EventDef_tie<T>::supported_interfaces (
+ const ::CORBA::InterfaceDefSeq & supported_interfaces
+ ACE_ENV_ARG_DECL
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ))
+{
+ this->ptr_->supported_interfaces (
+ supported_interfaces
+ ACE_ENV_ARG_PARAMETER
+ );
+}
+
+// TAO_IDL - Generated from
+// be\be_visitor_operation/tie_si.cpp:101
+
+template <class T> ACE_INLINE
+::CORBA::InitializerSeq * POA_CORBA::ComponentIR::EventDef_tie<T>::initializers (
+ ACE_ENV_SINGLE_ARG_DECL
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ))
+{
+ return this->ptr_->initializers (
+ ACE_ENV_SINGLE_ARG_PARAMETER
+ );
+}
+
+// TAO_IDL - Generated from
+// be\be_visitor_operation/tie_si.cpp:101
+
+template <class T> ACE_INLINE
+void POA_CORBA::ComponentIR::EventDef_tie<T>::initializers (
+ const ::CORBA::InitializerSeq & initializers
+ ACE_ENV_ARG_DECL
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ))
+{
+ this->ptr_->initializers (
+ initializers
+ ACE_ENV_ARG_PARAMETER
+ );
+}
+
+// TAO_IDL - Generated from
+// be\be_visitor_operation/tie_si.cpp:101
+
+template <class T> ACE_INLINE
+::CORBA::ValueDef_ptr POA_CORBA::ComponentIR::EventDef_tie<T>::base_value (
+ ACE_ENV_SINGLE_ARG_DECL
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ))
+{
+ return this->ptr_->base_value (
+ ACE_ENV_SINGLE_ARG_PARAMETER
+ );
+}
+
+// TAO_IDL - Generated from
+// be\be_visitor_operation/tie_si.cpp:101
+
+template <class T> ACE_INLINE
+void POA_CORBA::ComponentIR::EventDef_tie<T>::base_value (
+ ::CORBA::ValueDef_ptr base_value
+ ACE_ENV_ARG_DECL
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ))
+{
+ this->ptr_->base_value (
+ base_value
+ ACE_ENV_ARG_PARAMETER
+ );
+}
+
+// TAO_IDL - Generated from
+// be\be_visitor_operation/tie_si.cpp:101
+
+template <class T> ACE_INLINE
+::CORBA::ValueDefSeq * POA_CORBA::ComponentIR::EventDef_tie<T>::abstract_base_values (
+ ACE_ENV_SINGLE_ARG_DECL
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ))
+{
+ return this->ptr_->abstract_base_values (
+ ACE_ENV_SINGLE_ARG_PARAMETER
+ );
+}
+
+// TAO_IDL - Generated from
+// be\be_visitor_operation/tie_si.cpp:101
+
+template <class T> ACE_INLINE
+void POA_CORBA::ComponentIR::EventDef_tie<T>::abstract_base_values (
+ const ::CORBA::ValueDefSeq & abstract_base_values
+ ACE_ENV_ARG_DECL
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ))
+{
+ this->ptr_->abstract_base_values (
+ abstract_base_values
+ ACE_ENV_ARG_PARAMETER
+ );
+}
+
+// TAO_IDL - Generated from
+// be\be_visitor_operation/tie_si.cpp:101
+
+template <class T> ACE_INLINE
+::CORBA::Boolean POA_CORBA::ComponentIR::EventDef_tie<T>::is_abstract (
+ ACE_ENV_SINGLE_ARG_DECL
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ))
+{
+ return this->ptr_->is_abstract (
+ ACE_ENV_SINGLE_ARG_PARAMETER
+ );
+}
+
+// TAO_IDL - Generated from
+// be\be_visitor_operation/tie_si.cpp:101
+
+template <class T> ACE_INLINE
+void POA_CORBA::ComponentIR::EventDef_tie<T>::is_abstract (
+ ::CORBA::Boolean is_abstract
+ ACE_ENV_ARG_DECL
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ))
+{
+ this->ptr_->is_abstract (
+ is_abstract
+ ACE_ENV_ARG_PARAMETER
+ );
+}
+
+// TAO_IDL - Generated from
+// be\be_visitor_operation/tie_si.cpp:101
+
+template <class T> ACE_INLINE
+::CORBA::Boolean POA_CORBA::ComponentIR::EventDef_tie<T>::is_custom (
+ ACE_ENV_SINGLE_ARG_DECL
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ))
+{
+ return this->ptr_->is_custom (
+ ACE_ENV_SINGLE_ARG_PARAMETER
+ );
+}
+
+// TAO_IDL - Generated from
+// be\be_visitor_operation/tie_si.cpp:101
+
+template <class T> ACE_INLINE
+void POA_CORBA::ComponentIR::EventDef_tie<T>::is_custom (
+ ::CORBA::Boolean is_custom
+ ACE_ENV_ARG_DECL
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ))
+{
+ this->ptr_->is_custom (
+ is_custom
+ ACE_ENV_ARG_PARAMETER
+ );
+}
+
+// TAO_IDL - Generated from
+// be\be_visitor_operation/tie_si.cpp:101
+
+template <class T> ACE_INLINE
+::CORBA::Boolean POA_CORBA::ComponentIR::EventDef_tie<T>::is_truncatable (
+ ACE_ENV_SINGLE_ARG_DECL
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ))
+{
+ return this->ptr_->is_truncatable (
+ ACE_ENV_SINGLE_ARG_PARAMETER
+ );
+}
+
+// TAO_IDL - Generated from
+// be\be_visitor_operation/tie_si.cpp:101
+
+template <class T> ACE_INLINE
+void POA_CORBA::ComponentIR::EventDef_tie<T>::is_truncatable (
+ ::CORBA::Boolean is_truncatable
+ ACE_ENV_ARG_DECL
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ))
+{
+ this->ptr_->is_truncatable (
+ is_truncatable
+ ACE_ENV_ARG_PARAMETER
+ );
+}
+
+// TAO_IDL - Generated from
+// be\be_visitor_operation/tie_si.cpp:101
+
+template <class T> ACE_INLINE
+::CORBA::Boolean POA_CORBA::ComponentIR::EventDef_tie<T>::is_a (
+ const char * id
+ ACE_ENV_ARG_DECL
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ))
+{
+ return this->ptr_->is_a (
+ id
+ ACE_ENV_ARG_PARAMETER
+ );
+}
+
+// TAO_IDL - Generated from
+// be\be_visitor_operation/tie_si.cpp:101
+
+template <class T> ACE_INLINE
+::CORBA::ValueDef::FullValueDescription * POA_CORBA::ComponentIR::EventDef_tie<T>::describe_value (
+ ACE_ENV_SINGLE_ARG_DECL
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ))
+{
+ return this->ptr_->describe_value (
+ ACE_ENV_SINGLE_ARG_PARAMETER
+ );
+}
+
+// TAO_IDL - Generated from
+// be\be_visitor_operation/tie_si.cpp:101
+
+template <class T> ACE_INLINE
+::CORBA::ValueMemberDef_ptr POA_CORBA::ComponentIR::EventDef_tie<T>::create_value_member (
+ const char * id,
+ const char * name,
+ const char * version,
+ ::CORBA::IDLType_ptr type,
+ ::CORBA::Visibility access
+ ACE_ENV_ARG_DECL
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ))
+{
+ return this->ptr_->create_value_member (
+ id,
+ name,
+ version,
+ type,
+ access
+ ACE_ENV_ARG_PARAMETER
+ );
+}
+
+// TAO_IDL - Generated from
+// be\be_visitor_operation/tie_si.cpp:101
+
+template <class T> ACE_INLINE
+::CORBA::AttributeDef_ptr POA_CORBA::ComponentIR::EventDef_tie<T>::create_attribute (
+ const char * id,
+ const char * name,
+ const char * version,
+ ::CORBA::IDLType_ptr type,
+ ::CORBA::AttributeMode mode
+ ACE_ENV_ARG_DECL
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ))
+{
+ return this->ptr_->create_attribute (
+ id,
+ name,
+ version,
+ type,
+ mode
+ ACE_ENV_ARG_PARAMETER
+ );
+}
+
+// TAO_IDL - Generated from
+// be\be_visitor_operation/tie_si.cpp:101
+
+template <class T> ACE_INLINE
+::CORBA::OperationDef_ptr POA_CORBA::ComponentIR::EventDef_tie<T>::create_operation (
+ const char * id,
+ const char * name,
+ const char * version,
+ ::CORBA::IDLType_ptr result,
+ ::CORBA::OperationMode mode,
+ const ::CORBA::ParDescriptionSeq & params,
+ const ::CORBA::ExceptionDefSeq & exceptions,
+ const ::CORBA::ContextIdSeq & contexts
+ ACE_ENV_ARG_DECL
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ))
+{
+ return this->ptr_->create_operation (
+ id,
+ name,
+ version,
+ result,
+ mode,
+ params,
+ exceptions,
+ contexts
+ ACE_ENV_ARG_PARAMETER
+ );
+}
+
+// TAO_IDL - Generated from
+// be\be_visitor_operation/tie_si.cpp:101
+
+template <class T> ACE_INLINE
+::CORBA::ExtInitializerSeq * POA_CORBA::ComponentIR::EventDef_tie<T>::ext_initializers (
+ ACE_ENV_SINGLE_ARG_DECL
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ))
+{
+ return this->ptr_->ext_initializers (
+ ACE_ENV_SINGLE_ARG_PARAMETER
+ );
+}
+
+// TAO_IDL - Generated from
+// be\be_visitor_operation/tie_si.cpp:101
+
+template <class T> ACE_INLINE
+void POA_CORBA::ComponentIR::EventDef_tie<T>::ext_initializers (
+ const ::CORBA::ExtInitializerSeq & ext_initializers
+ ACE_ENV_ARG_DECL
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ))
+{
+ this->ptr_->ext_initializers (
+ ext_initializers
+ ACE_ENV_ARG_PARAMETER
+ );
+}
+
+// TAO_IDL - Generated from
+// be\be_visitor_operation/tie_si.cpp:101
+
+template <class T> ACE_INLINE
+::CORBA::ExtValueDef::ExtFullValueDescription * POA_CORBA::ComponentIR::EventDef_tie<T>::describe_ext_value (
+ ACE_ENV_SINGLE_ARG_DECL
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ))
+{
+ return this->ptr_->describe_ext_value (
+ ACE_ENV_SINGLE_ARG_PARAMETER
+ );
+}
+
+// TAO_IDL - Generated from
+// be\be_visitor_operation/tie_si.cpp:101
+
+template <class T> ACE_INLINE
+::CORBA::ExtAttributeDef_ptr POA_CORBA::ComponentIR::EventDef_tie<T>::create_ext_attribute (
+ const char * id,
+ const char * name,
+ const char * version,
+ ::CORBA::IDLType_ptr type,
+ ::CORBA::AttributeMode mode,
+ const ::CORBA::ExceptionDefSeq & get_exceptions,
+ const ::CORBA::ExceptionDefSeq & set_exceptions
+ ACE_ENV_ARG_DECL
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ))
+{
+ return this->ptr_->create_ext_attribute (
+ id,
+ name,
+ version,
+ type,
+ mode,
+ get_exceptions,
+ set_exceptions
+ ACE_ENV_ARG_PARAMETER
+ );
+}
+
+// TAO_IDL - Generated from
+// be\be_visitor_interface/tie_si.cpp:96
+
+template <class T> ACE_INLINE
+POA_CORBA::ComponentIR::Container_tie<T>::Container_tie (T &t)
+ : ptr_ (&t),
+ poa_ (PortableServer::POA::_nil ()),
+ rel_ (0)
+{}
+
+template <class T> ACE_INLINE
+POA_CORBA::ComponentIR::Container_tie<T>::Container_tie (T &t, PortableServer::POA_ptr poa)
+ : ptr_ (&t),
+ poa_ (PortableServer::POA::_duplicate (poa)),
+ rel_ (0)
+{}
+
+template <class T> ACE_INLINE
+POA_CORBA::ComponentIR::Container_tie<T>::Container_tie (T *tp, ::CORBA::Boolean release)
+ : ptr_ (tp),
+ poa_ (PortableServer::POA::_nil ()),
+ rel_ (release)
+{}
+
+template <class T> ACE_INLINE
+POA_CORBA::ComponentIR::Container_tie<T>::Container_tie (T *tp, PortableServer::POA_ptr poa, ::CORBA::Boolean release)
+ : ptr_ (tp),
+ poa_ (PortableServer::POA::_duplicate (poa)),
+ rel_ (release)
+{}
+
+template <class T> ACE_INLINE
+POA_CORBA::ComponentIR::Container_tie<T>::~Container_tie (void)
+{
+ if (this->rel_)
+ {
+ delete this->ptr_;
+ }
+}
+
+template <class T> ACE_INLINE T *
+POA_CORBA::ComponentIR::Container_tie<T>::_tied_object (void)
+{
+ return this->ptr_;
+}
+
+template <class T> ACE_INLINE void
+POA_CORBA::ComponentIR::Container_tie<T>::_tied_object (T &obj)
+{
+ if (this->rel_)
+ {
+ delete this->ptr_;
+ }
+
+ this->ptr_ = &obj;
+ this->rel_ = 0;
+}
+
+template <class T> ACE_INLINE void
+POA_CORBA::ComponentIR::Container_tie<T>::_tied_object (T *obj, ::CORBA::Boolean release)
+{
+ if (this->rel_)
+ {
+ delete this->ptr_;
+ }
+
+ this->ptr_ = obj;
+ this->rel_ = release;
+}
+
+template <class T> ACE_INLINE ::CORBA::Boolean
+POA_CORBA::ComponentIR::Container_tie<T>::_is_owner (void)
+{
+ return this->rel_;
+}
+
+template <class T> ACE_INLINE void
+POA_CORBA::ComponentIR::Container_tie<T>::_is_owner ( ::CORBA::Boolean b)
+{
+ this->rel_ = b;
+}
+
+template <class T> ACE_INLINE PortableServer::POA_ptr
+POA_CORBA::ComponentIR::Container_tie<T>::_default_POA (ACE_ENV_SINGLE_ARG_DECL)
+{
+ if (! ::CORBA::is_nil (this->poa_.in ()))
+ {
+ return PortableServer::POA::_duplicate (this->poa_.in ());
+ }
+
+ return this->Container::_default_POA (ACE_ENV_SINGLE_ARG_PARAMETER);
+}
+
+// TAO_IDL - Generated from
+// be\be_visitor_operation/tie_si.cpp:101
+
+template <class T> ACE_INLINE
+::CORBA::DefinitionKind POA_CORBA::ComponentIR::Container_tie<T>::def_kind (
+ ACE_ENV_SINGLE_ARG_DECL
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ))
+{
+ return this->ptr_->def_kind (
+ ACE_ENV_SINGLE_ARG_PARAMETER
+ );
+}
+
+// TAO_IDL - Generated from
+// be\be_visitor_operation/tie_si.cpp:101
+
+template <class T> ACE_INLINE
+void POA_CORBA::ComponentIR::Container_tie<T>::destroy (
+ ACE_ENV_SINGLE_ARG_DECL
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ))
+{
+ this->ptr_->destroy (
+ ACE_ENV_SINGLE_ARG_PARAMETER
+ );
+}
+
+// TAO_IDL - Generated from
+// be\be_visitor_operation/tie_si.cpp:101
+
+template <class T> ACE_INLINE
+::CORBA::Contained_ptr POA_CORBA::ComponentIR::Container_tie<T>::lookup (
+ const char * search_name
+ ACE_ENV_ARG_DECL
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ))
+{
+ return this->ptr_->lookup (
+ search_name
+ ACE_ENV_ARG_PARAMETER
+ );
+}
+
+// TAO_IDL - Generated from
+// be\be_visitor_operation/tie_si.cpp:101
+
+template <class T> ACE_INLINE
+::CORBA::ContainedSeq * POA_CORBA::ComponentIR::Container_tie<T>::contents (
+ ::CORBA::DefinitionKind limit_type,
+ ::CORBA::Boolean exclude_inherited
+ ACE_ENV_ARG_DECL
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ))
+{
+ return this->ptr_->contents (
+ limit_type,
+ exclude_inherited
+ ACE_ENV_ARG_PARAMETER
+ );
+}
+
+// TAO_IDL - Generated from
+// be\be_visitor_operation/tie_si.cpp:101
+
+template <class T> ACE_INLINE
+::CORBA::ContainedSeq * POA_CORBA::ComponentIR::Container_tie<T>::lookup_name (
+ const char * search_name,
+ ::CORBA::Long levels_to_search,
+ ::CORBA::DefinitionKind limit_type,
+ ::CORBA::Boolean exclude_inherited
+ ACE_ENV_ARG_DECL
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ))
+{
+ return this->ptr_->lookup_name (
+ search_name,
+ levels_to_search,
+ limit_type,
+ exclude_inherited
+ ACE_ENV_ARG_PARAMETER
+ );
+}
+
+// TAO_IDL - Generated from
+// be\be_visitor_operation/tie_si.cpp:101
+
+template <class T> ACE_INLINE
+::CORBA::Container::DescriptionSeq * POA_CORBA::ComponentIR::Container_tie<T>::describe_contents (
+ ::CORBA::DefinitionKind limit_type,
+ ::CORBA::Boolean exclude_inherited,
+ ::CORBA::Long max_returned_objs
+ ACE_ENV_ARG_DECL
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ))
+{
+ return this->ptr_->describe_contents (
+ limit_type,
+ exclude_inherited,
+ max_returned_objs
+ ACE_ENV_ARG_PARAMETER
+ );
+}
+
+// TAO_IDL - Generated from
+// be\be_visitor_operation/tie_si.cpp:101
+
+template <class T> ACE_INLINE
+::CORBA::ModuleDef_ptr POA_CORBA::ComponentIR::Container_tie<T>::create_module (
+ const char * id,
+ const char * name,
+ const char * version
+ ACE_ENV_ARG_DECL
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ))
+{
+ return this->ptr_->create_module (
+ id,
+ name,
+ version
+ ACE_ENV_ARG_PARAMETER
+ );
+}
+
+// TAO_IDL - Generated from
+// be\be_visitor_operation/tie_si.cpp:101
+
+template <class T> ACE_INLINE
+::CORBA::ConstantDef_ptr POA_CORBA::ComponentIR::Container_tie<T>::create_constant (
+ const char * id,
+ const char * name,
+ const char * version,
+ ::CORBA::IDLType_ptr type,
+ const ::CORBA::Any & value
+ ACE_ENV_ARG_DECL
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ))
+{
+ return this->ptr_->create_constant (
+ id,
+ name,
+ version,
+ type,
+ value
+ ACE_ENV_ARG_PARAMETER
+ );
+}
+
+// TAO_IDL - Generated from
+// be\be_visitor_operation/tie_si.cpp:101
+
+template <class T> ACE_INLINE
+::CORBA::StructDef_ptr POA_CORBA::ComponentIR::Container_tie<T>::create_struct (
+ const char * id,
+ const char * name,
+ const char * version,
+ const ::CORBA::StructMemberSeq & members
+ ACE_ENV_ARG_DECL
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ))
+{
+ return this->ptr_->create_struct (
+ id,
+ name,
+ version,
+ members
+ ACE_ENV_ARG_PARAMETER
+ );
+}
+
+// TAO_IDL - Generated from
+// be\be_visitor_operation/tie_si.cpp:101
+
+template <class T> ACE_INLINE
+::CORBA::UnionDef_ptr POA_CORBA::ComponentIR::Container_tie<T>::create_union (
+ const char * id,
+ const char * name,
+ const char * version,
+ ::CORBA::IDLType_ptr discriminator_type,
+ const ::CORBA::UnionMemberSeq & members
+ ACE_ENV_ARG_DECL
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ))
+{
+ return this->ptr_->create_union (
+ id,
+ name,
+ version,
+ discriminator_type,
+ members
+ ACE_ENV_ARG_PARAMETER
+ );
+}
+
+// TAO_IDL - Generated from
+// be\be_visitor_operation/tie_si.cpp:101
+
+template <class T> ACE_INLINE
+::CORBA::EnumDef_ptr POA_CORBA::ComponentIR::Container_tie<T>::create_enum (
+ const char * id,
+ const char * name,
+ const char * version,
+ const ::CORBA::EnumMemberSeq & members
+ ACE_ENV_ARG_DECL
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ))
+{
+ return this->ptr_->create_enum (
+ id,
+ name,
+ version,
+ members
+ ACE_ENV_ARG_PARAMETER
+ );
+}
+
+// TAO_IDL - Generated from
+// be\be_visitor_operation/tie_si.cpp:101
+
+template <class T> ACE_INLINE
+::CORBA::AliasDef_ptr POA_CORBA::ComponentIR::Container_tie<T>::create_alias (
+ const char * id,
+ const char * name,
+ const char * version,
+ ::CORBA::IDLType_ptr original_type
+ ACE_ENV_ARG_DECL
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ))
+{
+ return this->ptr_->create_alias (
+ id,
+ name,
+ version,
+ original_type
+ ACE_ENV_ARG_PARAMETER
+ );
+}
+
+// TAO_IDL - Generated from
+// be\be_visitor_operation/tie_si.cpp:101
+
+template <class T> ACE_INLINE
+::CORBA::InterfaceDef_ptr POA_CORBA::ComponentIR::Container_tie<T>::create_interface (
+ const char * id,
+ const char * name,
+ const char * version,
+ const ::CORBA::InterfaceDefSeq & base_interfaces
+ ACE_ENV_ARG_DECL
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ))
+{
+ return this->ptr_->create_interface (
+ id,
+ name,
+ version,
+ base_interfaces
+ ACE_ENV_ARG_PARAMETER
+ );
+}
+
+// TAO_IDL - Generated from
+// be\be_visitor_operation/tie_si.cpp:101
+
+template <class T> ACE_INLINE
+::CORBA::ValueDef_ptr POA_CORBA::ComponentIR::Container_tie<T>::create_value (
+ const char * id,
+ const char * name,
+ const char * version,
+ ::CORBA::Boolean is_custom,
+ ::CORBA::Boolean is_abstract,
+ ::CORBA::ValueDef_ptr base_value,
+ ::CORBA::Boolean is_truncatable,
+ const ::CORBA::ValueDefSeq & abstract_base_values,
+ const ::CORBA::InterfaceDefSeq & supported_interfaces,
+ const ::CORBA::InitializerSeq & initializers
+ ACE_ENV_ARG_DECL
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ))
+{
+ return this->ptr_->create_value (
+ id,
+ name,
+ version,
+ is_custom,
+ is_abstract,
+ base_value,
+ is_truncatable,
+ abstract_base_values,
+ supported_interfaces,
+ initializers
+ ACE_ENV_ARG_PARAMETER
+ );
+}
+
+// TAO_IDL - Generated from
+// be\be_visitor_operation/tie_si.cpp:101
+
+template <class T> ACE_INLINE
+::CORBA::ValueBoxDef_ptr POA_CORBA::ComponentIR::Container_tie<T>::create_value_box (
+ const char * id,
+ const char * name,
+ const char * version,
+ ::CORBA::IDLType_ptr original_type_def
+ ACE_ENV_ARG_DECL
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ))
+{
+ return this->ptr_->create_value_box (
+ id,
+ name,
+ version,
+ original_type_def
+ ACE_ENV_ARG_PARAMETER
+ );
+}
+
+// TAO_IDL - Generated from
+// be\be_visitor_operation/tie_si.cpp:101
+
+template <class T> ACE_INLINE
+::CORBA::ExceptionDef_ptr POA_CORBA::ComponentIR::Container_tie<T>::create_exception (
+ const char * id,
+ const char * name,
+ const char * version,
+ const ::CORBA::StructMemberSeq & members
+ ACE_ENV_ARG_DECL
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ))
+{
+ return this->ptr_->create_exception (
+ id,
+ name,
+ version,
+ members
+ ACE_ENV_ARG_PARAMETER
+ );
+}
+
+// TAO_IDL - Generated from
+// be\be_visitor_operation/tie_si.cpp:101
+
+template <class T> ACE_INLINE
+::CORBA::NativeDef_ptr POA_CORBA::ComponentIR::Container_tie<T>::create_native (
+ const char * id,
+ const char * name,
+ const char * version
+ ACE_ENV_ARG_DECL
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ))
+{
+ return this->ptr_->create_native (
+ id,
+ name,
+ version
+ ACE_ENV_ARG_PARAMETER
+ );
+}
+
+// TAO_IDL - Generated from
+// be\be_visitor_operation/tie_si.cpp:101
+
+template <class T> ACE_INLINE
+::CORBA::AbstractInterfaceDef_ptr POA_CORBA::ComponentIR::Container_tie<T>::create_abstract_interface (
+ const char * id,
+ const char * name,
+ const char * version,
+ const ::CORBA::AbstractInterfaceDefSeq & base_interfaces
+ ACE_ENV_ARG_DECL
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ))
+{
+ return this->ptr_->create_abstract_interface (
+ id,
+ name,
+ version,
+ base_interfaces
+ ACE_ENV_ARG_PARAMETER
+ );
+}
+
+// TAO_IDL - Generated from
+// be\be_visitor_operation/tie_si.cpp:101
+
+template <class T> ACE_INLINE
+::CORBA::LocalInterfaceDef_ptr POA_CORBA::ComponentIR::Container_tie<T>::create_local_interface (
+ const char * id,
+ const char * name,
+ const char * version,
+ const ::CORBA::InterfaceDefSeq & base_interfaces
+ ACE_ENV_ARG_DECL
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ))
+{
+ return this->ptr_->create_local_interface (
+ id,
+ name,
+ version,
+ base_interfaces
+ ACE_ENV_ARG_PARAMETER
+ );
+}
+
+// TAO_IDL - Generated from
+// be\be_visitor_operation/tie_si.cpp:101
+
+template <class T> ACE_INLINE
+::CORBA::ExtValueDef_ptr POA_CORBA::ComponentIR::Container_tie<T>::create_ext_value (
+ const char * id,
+ const char * name,
+ const char * version,
+ ::CORBA::Boolean is_custom,
+ ::CORBA::Boolean is_abstract,
+ ::CORBA::ValueDef_ptr base_value,
+ ::CORBA::Boolean is_truncatable,
+ const ::CORBA::ValueDefSeq & abstract_base_values,
+ const ::CORBA::InterfaceDefSeq & supported_interfaces,
+ const ::CORBA::ExtInitializerSeq & initializers
+ ACE_ENV_ARG_DECL
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ))
+{
+ return this->ptr_->create_ext_value (
+ id,
+ name,
+ version,
+ is_custom,
+ is_abstract,
+ base_value,
+ is_truncatable,
+ abstract_base_values,
+ supported_interfaces,
+ initializers
+ ACE_ENV_ARG_PARAMETER
+ );
+}
+
+// TAO_IDL - Generated from
+// be\be_visitor_operation/tie_si.cpp:101
+
+template <class T> ACE_INLINE
+::CORBA::ComponentIR::ComponentDef_ptr POA_CORBA::ComponentIR::Container_tie<T>::create_component (
+ const char * id,
+ const char * name,
+ const char * version,
+ ::CORBA::ComponentIR::ComponentDef_ptr base_component,
+ const ::CORBA::InterfaceDefSeq & supports_interfaces
+ ACE_ENV_ARG_DECL
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ))
+{
+ return this->ptr_->create_component (
+ id,
+ name,
+ version,
+ base_component,
+ supports_interfaces
+ ACE_ENV_ARG_PARAMETER
+ );
+}
+
+// TAO_IDL - Generated from
+// be\be_visitor_operation/tie_si.cpp:101
+
+template <class T> ACE_INLINE
+::CORBA::ComponentIR::HomeDef_ptr POA_CORBA::ComponentIR::Container_tie<T>::create_home (
+ const char * id,
+ const char * name,
+ const char * version,
+ ::CORBA::ComponentIR::HomeDef_ptr base_home,
+ ::CORBA::ComponentIR::ComponentDef_ptr managed_component,
+ const ::CORBA::InterfaceDefSeq & supports_interfaces,
+ ::CORBA::ValueDef_ptr primary_key
+ ACE_ENV_ARG_DECL
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ))
+{
+ return this->ptr_->create_home (
+ id,
+ name,
+ version,
+ base_home,
+ managed_component,
+ supports_interfaces,
+ primary_key
+ ACE_ENV_ARG_PARAMETER
+ );
+}
+
+// TAO_IDL - Generated from
+// be\be_visitor_operation/tie_si.cpp:101
+
+template <class T> ACE_INLINE
+::CORBA::ComponentIR::EventDef_ptr POA_CORBA::ComponentIR::Container_tie<T>::create_event (
+ const char * id,
+ const char * name,
+ const char * version,
+ ::CORBA::Boolean is_custom,
+ ::CORBA::Boolean is_abstract,
+ ::CORBA::ValueDef_ptr base_value,
+ ::CORBA::Boolean is_truncatable,
+ const ::CORBA::ValueDefSeq & abstract_base_values,
+ const ::CORBA::InterfaceDefSeq & supported_interfaces,
+ const ::CORBA::ExtInitializerSeq & initializers
+ ACE_ENV_ARG_DECL
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ))
+{
+ return this->ptr_->create_event (
+ id,
+ name,
+ version,
+ is_custom,
+ is_abstract,
+ base_value,
+ is_truncatable,
+ abstract_base_values,
+ supported_interfaces,
+ initializers
+ ACE_ENV_ARG_PARAMETER
+ );
+}
+
+// TAO_IDL - Generated from
+// be\be_visitor_interface/tie_si.cpp:96
+
+template <class T> ACE_INLINE
+POA_CORBA::ComponentIR::ModuleDef_tie<T>::ModuleDef_tie (T &t)
+ : ptr_ (&t),
+ poa_ (PortableServer::POA::_nil ()),
+ rel_ (0)
+{}
+
+template <class T> ACE_INLINE
+POA_CORBA::ComponentIR::ModuleDef_tie<T>::ModuleDef_tie (T &t, PortableServer::POA_ptr poa)
+ : ptr_ (&t),
+ poa_ (PortableServer::POA::_duplicate (poa)),
+ rel_ (0)
+{}
+
+template <class T> ACE_INLINE
+POA_CORBA::ComponentIR::ModuleDef_tie<T>::ModuleDef_tie (T *tp, ::CORBA::Boolean release)
+ : ptr_ (tp),
+ poa_ (PortableServer::POA::_nil ()),
+ rel_ (release)
+{}
+
+template <class T> ACE_INLINE
+POA_CORBA::ComponentIR::ModuleDef_tie<T>::ModuleDef_tie (T *tp, PortableServer::POA_ptr poa, ::CORBA::Boolean release)
+ : ptr_ (tp),
+ poa_ (PortableServer::POA::_duplicate (poa)),
+ rel_ (release)
+{}
+
+template <class T> ACE_INLINE
+POA_CORBA::ComponentIR::ModuleDef_tie<T>::~ModuleDef_tie (void)
+{
+ if (this->rel_)
+ {
+ delete this->ptr_;
+ }
+}
+
+template <class T> ACE_INLINE T *
+POA_CORBA::ComponentIR::ModuleDef_tie<T>::_tied_object (void)
+{
+ return this->ptr_;
+}
+
+template <class T> ACE_INLINE void
+POA_CORBA::ComponentIR::ModuleDef_tie<T>::_tied_object (T &obj)
+{
+ if (this->rel_)
+ {
+ delete this->ptr_;
+ }
+
+ this->ptr_ = &obj;
+ this->rel_ = 0;
+}
+
+template <class T> ACE_INLINE void
+POA_CORBA::ComponentIR::ModuleDef_tie<T>::_tied_object (T *obj, ::CORBA::Boolean release)
+{
+ if (this->rel_)
+ {
+ delete this->ptr_;
+ }
+
+ this->ptr_ = obj;
+ this->rel_ = release;
+}
+
+template <class T> ACE_INLINE ::CORBA::Boolean
+POA_CORBA::ComponentIR::ModuleDef_tie<T>::_is_owner (void)
+{
+ return this->rel_;
+}
+
+template <class T> ACE_INLINE void
+POA_CORBA::ComponentIR::ModuleDef_tie<T>::_is_owner ( ::CORBA::Boolean b)
+{
+ this->rel_ = b;
+}
+
+template <class T> ACE_INLINE PortableServer::POA_ptr
+POA_CORBA::ComponentIR::ModuleDef_tie<T>::_default_POA (ACE_ENV_SINGLE_ARG_DECL)
+{
+ if (! ::CORBA::is_nil (this->poa_.in ()))
+ {
+ return PortableServer::POA::_duplicate (this->poa_.in ());
+ }
+
+ return this->ModuleDef::_default_POA (ACE_ENV_SINGLE_ARG_PARAMETER);
+}
+
+// TAO_IDL - Generated from
+// be\be_visitor_operation/tie_si.cpp:101
+
+template <class T> ACE_INLINE
+::CORBA::DefinitionKind POA_CORBA::ComponentIR::ModuleDef_tie<T>::def_kind (
+ ACE_ENV_SINGLE_ARG_DECL
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ))
+{
+ return this->ptr_->def_kind (
+ ACE_ENV_SINGLE_ARG_PARAMETER
+ );
+}
+
+// TAO_IDL - Generated from
+// be\be_visitor_operation/tie_si.cpp:101
+
+template <class T> ACE_INLINE
+void POA_CORBA::ComponentIR::ModuleDef_tie<T>::destroy (
+ ACE_ENV_SINGLE_ARG_DECL
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ))
+{
+ this->ptr_->destroy (
+ ACE_ENV_SINGLE_ARG_PARAMETER
+ );
+}
+
+// TAO_IDL - Generated from
+// be\be_visitor_operation/tie_si.cpp:101
+
+template <class T> ACE_INLINE
+::CORBA::Contained_ptr POA_CORBA::ComponentIR::ModuleDef_tie<T>::lookup (
+ const char * search_name
+ ACE_ENV_ARG_DECL
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ))
+{
+ return this->ptr_->lookup (
+ search_name
+ ACE_ENV_ARG_PARAMETER
+ );
+}
+
+// TAO_IDL - Generated from
+// be\be_visitor_operation/tie_si.cpp:101
+
+template <class T> ACE_INLINE
+::CORBA::ContainedSeq * POA_CORBA::ComponentIR::ModuleDef_tie<T>::contents (
+ ::CORBA::DefinitionKind limit_type,
+ ::CORBA::Boolean exclude_inherited
+ ACE_ENV_ARG_DECL
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ))
+{
+ return this->ptr_->contents (
+ limit_type,
+ exclude_inherited
+ ACE_ENV_ARG_PARAMETER
+ );
+}
+
+// TAO_IDL - Generated from
+// be\be_visitor_operation/tie_si.cpp:101
+
+template <class T> ACE_INLINE
+::CORBA::ContainedSeq * POA_CORBA::ComponentIR::ModuleDef_tie<T>::lookup_name (
+ const char * search_name,
+ ::CORBA::Long levels_to_search,
+ ::CORBA::DefinitionKind limit_type,
+ ::CORBA::Boolean exclude_inherited
+ ACE_ENV_ARG_DECL
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ))
+{
+ return this->ptr_->lookup_name (
+ search_name,
+ levels_to_search,
+ limit_type,
+ exclude_inherited
+ ACE_ENV_ARG_PARAMETER
+ );
+}
+
+// TAO_IDL - Generated from
+// be\be_visitor_operation/tie_si.cpp:101
+
+template <class T> ACE_INLINE
+::CORBA::Container::DescriptionSeq * POA_CORBA::ComponentIR::ModuleDef_tie<T>::describe_contents (
+ ::CORBA::DefinitionKind limit_type,
+ ::CORBA::Boolean exclude_inherited,
+ ::CORBA::Long max_returned_objs
+ ACE_ENV_ARG_DECL
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ))
+{
+ return this->ptr_->describe_contents (
+ limit_type,
+ exclude_inherited,
+ max_returned_objs
+ ACE_ENV_ARG_PARAMETER
+ );
+}
+
+// TAO_IDL - Generated from
+// be\be_visitor_operation/tie_si.cpp:101
+
+template <class T> ACE_INLINE
+::CORBA::ModuleDef_ptr POA_CORBA::ComponentIR::ModuleDef_tie<T>::create_module (
+ const char * id,
+ const char * name,
+ const char * version
+ ACE_ENV_ARG_DECL
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ))
+{
+ return this->ptr_->create_module (
+ id,
+ name,
+ version
+ ACE_ENV_ARG_PARAMETER
+ );
+}
+
+// TAO_IDL - Generated from
+// be\be_visitor_operation/tie_si.cpp:101
+
+template <class T> ACE_INLINE
+::CORBA::ConstantDef_ptr POA_CORBA::ComponentIR::ModuleDef_tie<T>::create_constant (
+ const char * id,
+ const char * name,
+ const char * version,
+ ::CORBA::IDLType_ptr type,
+ const ::CORBA::Any & value
+ ACE_ENV_ARG_DECL
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ))
+{
+ return this->ptr_->create_constant (
+ id,
+ name,
+ version,
+ type,
+ value
+ ACE_ENV_ARG_PARAMETER
+ );
+}
+
+// TAO_IDL - Generated from
+// be\be_visitor_operation/tie_si.cpp:101
+
+template <class T> ACE_INLINE
+::CORBA::StructDef_ptr POA_CORBA::ComponentIR::ModuleDef_tie<T>::create_struct (
+ const char * id,
+ const char * name,
+ const char * version,
+ const ::CORBA::StructMemberSeq & members
+ ACE_ENV_ARG_DECL
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ))
+{
+ return this->ptr_->create_struct (
+ id,
+ name,
+ version,
+ members
+ ACE_ENV_ARG_PARAMETER
+ );
+}
+
+// TAO_IDL - Generated from
+// be\be_visitor_operation/tie_si.cpp:101
+
+template <class T> ACE_INLINE
+::CORBA::UnionDef_ptr POA_CORBA::ComponentIR::ModuleDef_tie<T>::create_union (
+ const char * id,
+ const char * name,
+ const char * version,
+ ::CORBA::IDLType_ptr discriminator_type,
+ const ::CORBA::UnionMemberSeq & members
+ ACE_ENV_ARG_DECL
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ))
+{
+ return this->ptr_->create_union (
+ id,
+ name,
+ version,
+ discriminator_type,
+ members
+ ACE_ENV_ARG_PARAMETER
+ );
+}
+
+// TAO_IDL - Generated from
+// be\be_visitor_operation/tie_si.cpp:101
+
+template <class T> ACE_INLINE
+::CORBA::EnumDef_ptr POA_CORBA::ComponentIR::ModuleDef_tie<T>::create_enum (
+ const char * id,
+ const char * name,
+ const char * version,
+ const ::CORBA::EnumMemberSeq & members
+ ACE_ENV_ARG_DECL
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ))
+{
+ return this->ptr_->create_enum (
+ id,
+ name,
+ version,
+ members
+ ACE_ENV_ARG_PARAMETER
+ );
+}
+
+// TAO_IDL - Generated from
+// be\be_visitor_operation/tie_si.cpp:101
+
+template <class T> ACE_INLINE
+::CORBA::AliasDef_ptr POA_CORBA::ComponentIR::ModuleDef_tie<T>::create_alias (
+ const char * id,
+ const char * name,
+ const char * version,
+ ::CORBA::IDLType_ptr original_type
+ ACE_ENV_ARG_DECL
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ))
+{
+ return this->ptr_->create_alias (
+ id,
+ name,
+ version,
+ original_type
+ ACE_ENV_ARG_PARAMETER
+ );
+}
+
+// TAO_IDL - Generated from
+// be\be_visitor_operation/tie_si.cpp:101
+
+template <class T> ACE_INLINE
+::CORBA::InterfaceDef_ptr POA_CORBA::ComponentIR::ModuleDef_tie<T>::create_interface (
+ const char * id,
+ const char * name,
+ const char * version,
+ const ::CORBA::InterfaceDefSeq & base_interfaces
+ ACE_ENV_ARG_DECL
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ))
+{
+ return this->ptr_->create_interface (
+ id,
+ name,
+ version,
+ base_interfaces
+ ACE_ENV_ARG_PARAMETER
+ );
+}
+
+// TAO_IDL - Generated from
+// be\be_visitor_operation/tie_si.cpp:101
+
+template <class T> ACE_INLINE
+::CORBA::ValueDef_ptr POA_CORBA::ComponentIR::ModuleDef_tie<T>::create_value (
+ const char * id,
+ const char * name,
+ const char * version,
+ ::CORBA::Boolean is_custom,
+ ::CORBA::Boolean is_abstract,
+ ::CORBA::ValueDef_ptr base_value,
+ ::CORBA::Boolean is_truncatable,
+ const ::CORBA::ValueDefSeq & abstract_base_values,
+ const ::CORBA::InterfaceDefSeq & supported_interfaces,
+ const ::CORBA::InitializerSeq & initializers
+ ACE_ENV_ARG_DECL
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ))
+{
+ return this->ptr_->create_value (
+ id,
+ name,
+ version,
+ is_custom,
+ is_abstract,
+ base_value,
+ is_truncatable,
+ abstract_base_values,
+ supported_interfaces,
+ initializers
+ ACE_ENV_ARG_PARAMETER
+ );
+}
+
+// TAO_IDL - Generated from
+// be\be_visitor_operation/tie_si.cpp:101
+
+template <class T> ACE_INLINE
+::CORBA::ValueBoxDef_ptr POA_CORBA::ComponentIR::ModuleDef_tie<T>::create_value_box (
+ const char * id,
+ const char * name,
+ const char * version,
+ ::CORBA::IDLType_ptr original_type_def
+ ACE_ENV_ARG_DECL
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ))
+{
+ return this->ptr_->create_value_box (
+ id,
+ name,
+ version,
+ original_type_def
+ ACE_ENV_ARG_PARAMETER
+ );
+}
+
+// TAO_IDL - Generated from
+// be\be_visitor_operation/tie_si.cpp:101
+
+template <class T> ACE_INLINE
+::CORBA::ExceptionDef_ptr POA_CORBA::ComponentIR::ModuleDef_tie<T>::create_exception (
+ const char * id,
+ const char * name,
+ const char * version,
+ const ::CORBA::StructMemberSeq & members
+ ACE_ENV_ARG_DECL
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ))
+{
+ return this->ptr_->create_exception (
+ id,
+ name,
+ version,
+ members
+ ACE_ENV_ARG_PARAMETER
+ );
+}
+
+// TAO_IDL - Generated from
+// be\be_visitor_operation/tie_si.cpp:101
+
+template <class T> ACE_INLINE
+::CORBA::NativeDef_ptr POA_CORBA::ComponentIR::ModuleDef_tie<T>::create_native (
+ const char * id,
+ const char * name,
+ const char * version
+ ACE_ENV_ARG_DECL
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ))
+{
+ return this->ptr_->create_native (
+ id,
+ name,
+ version
+ ACE_ENV_ARG_PARAMETER
+ );
+}
+
+// TAO_IDL - Generated from
+// be\be_visitor_operation/tie_si.cpp:101
+
+template <class T> ACE_INLINE
+::CORBA::AbstractInterfaceDef_ptr POA_CORBA::ComponentIR::ModuleDef_tie<T>::create_abstract_interface (
+ const char * id,
+ const char * name,
+ const char * version,
+ const ::CORBA::AbstractInterfaceDefSeq & base_interfaces
+ ACE_ENV_ARG_DECL
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ))
+{
+ return this->ptr_->create_abstract_interface (
+ id,
+ name,
+ version,
+ base_interfaces
+ ACE_ENV_ARG_PARAMETER
+ );
+}
+
+// TAO_IDL - Generated from
+// be\be_visitor_operation/tie_si.cpp:101
+
+template <class T> ACE_INLINE
+::CORBA::LocalInterfaceDef_ptr POA_CORBA::ComponentIR::ModuleDef_tie<T>::create_local_interface (
+ const char * id,
+ const char * name,
+ const char * version,
+ const ::CORBA::InterfaceDefSeq & base_interfaces
+ ACE_ENV_ARG_DECL
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ))
+{
+ return this->ptr_->create_local_interface (
+ id,
+ name,
+ version,
+ base_interfaces
+ ACE_ENV_ARG_PARAMETER
+ );
+}
+
+// TAO_IDL - Generated from
+// be\be_visitor_operation/tie_si.cpp:101
+
+template <class T> ACE_INLINE
+::CORBA::ExtValueDef_ptr POA_CORBA::ComponentIR::ModuleDef_tie<T>::create_ext_value (
+ const char * id,
+ const char * name,
+ const char * version,
+ ::CORBA::Boolean is_custom,
+ ::CORBA::Boolean is_abstract,
+ ::CORBA::ValueDef_ptr base_value,
+ ::CORBA::Boolean is_truncatable,
+ const ::CORBA::ValueDefSeq & abstract_base_values,
+ const ::CORBA::InterfaceDefSeq & supported_interfaces,
+ const ::CORBA::ExtInitializerSeq & initializers
+ ACE_ENV_ARG_DECL
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ))
+{
+ return this->ptr_->create_ext_value (
+ id,
+ name,
+ version,
+ is_custom,
+ is_abstract,
+ base_value,
+ is_truncatable,
+ abstract_base_values,
+ supported_interfaces,
+ initializers
+ ACE_ENV_ARG_PARAMETER
+ );
+}
+
+// TAO_IDL - Generated from
+// be\be_visitor_operation/tie_si.cpp:101
+
+template <class T> ACE_INLINE
+char * POA_CORBA::ComponentIR::ModuleDef_tie<T>::id (
+ ACE_ENV_SINGLE_ARG_DECL
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ))
+{
+ return this->ptr_->id (
+ ACE_ENV_SINGLE_ARG_PARAMETER
+ );
+}
+
+// TAO_IDL - Generated from
+// be\be_visitor_operation/tie_si.cpp:101
+
+template <class T> ACE_INLINE
+void POA_CORBA::ComponentIR::ModuleDef_tie<T>::id (
+ const char * id
+ ACE_ENV_ARG_DECL
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ))
+{
+ this->ptr_->id (
+ id
+ ACE_ENV_ARG_PARAMETER
+ );
+}
+
+// TAO_IDL - Generated from
+// be\be_visitor_operation/tie_si.cpp:101
+
+template <class T> ACE_INLINE
+char * POA_CORBA::ComponentIR::ModuleDef_tie<T>::name (
+ ACE_ENV_SINGLE_ARG_DECL
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ))
+{
+ return this->ptr_->name (
+ ACE_ENV_SINGLE_ARG_PARAMETER
+ );
+}
+
+// TAO_IDL - Generated from
+// be\be_visitor_operation/tie_si.cpp:101
+
+template <class T> ACE_INLINE
+void POA_CORBA::ComponentIR::ModuleDef_tie<T>::name (
+ const char * name
+ ACE_ENV_ARG_DECL
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ))
+{
+ this->ptr_->name (
+ name
+ ACE_ENV_ARG_PARAMETER
+ );
+}
+
+// TAO_IDL - Generated from
+// be\be_visitor_operation/tie_si.cpp:101
+
+template <class T> ACE_INLINE
+char * POA_CORBA::ComponentIR::ModuleDef_tie<T>::version (
+ ACE_ENV_SINGLE_ARG_DECL
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ))
+{
+ return this->ptr_->version (
+ ACE_ENV_SINGLE_ARG_PARAMETER
+ );
+}
+
+// TAO_IDL - Generated from
+// be\be_visitor_operation/tie_si.cpp:101
+
+template <class T> ACE_INLINE
+void POA_CORBA::ComponentIR::ModuleDef_tie<T>::version (
+ const char * version
+ ACE_ENV_ARG_DECL
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ))
+{
+ this->ptr_->version (
+ version
+ ACE_ENV_ARG_PARAMETER
+ );
+}
+
+// TAO_IDL - Generated from
+// be\be_visitor_operation/tie_si.cpp:101
+
+template <class T> ACE_INLINE
+::CORBA::Container_ptr POA_CORBA::ComponentIR::ModuleDef_tie<T>::defined_in (
+ ACE_ENV_SINGLE_ARG_DECL
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ))
+{
+ return this->ptr_->defined_in (
+ ACE_ENV_SINGLE_ARG_PARAMETER
+ );
+}
+
+// TAO_IDL - Generated from
+// be\be_visitor_operation/tie_si.cpp:101
+
+template <class T> ACE_INLINE
+char * POA_CORBA::ComponentIR::ModuleDef_tie<T>::absolute_name (
+ ACE_ENV_SINGLE_ARG_DECL
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ))
+{
+ return this->ptr_->absolute_name (
+ ACE_ENV_SINGLE_ARG_PARAMETER
+ );
+}
+
+// TAO_IDL - Generated from
+// be\be_visitor_operation/tie_si.cpp:101
+
+template <class T> ACE_INLINE
+::CORBA::Repository_ptr POA_CORBA::ComponentIR::ModuleDef_tie<T>::containing_repository (
+ ACE_ENV_SINGLE_ARG_DECL
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ))
+{
+ return this->ptr_->containing_repository (
+ ACE_ENV_SINGLE_ARG_PARAMETER
+ );
+}
+
+// TAO_IDL - Generated from
+// be\be_visitor_operation/tie_si.cpp:101
+
+template <class T> ACE_INLINE
+::CORBA::Contained::Description * POA_CORBA::ComponentIR::ModuleDef_tie<T>::describe (
+ ACE_ENV_SINGLE_ARG_DECL
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ))
+{
+ return this->ptr_->describe (
+ ACE_ENV_SINGLE_ARG_PARAMETER
+ );
+}
+
+// TAO_IDL - Generated from
+// be\be_visitor_operation/tie_si.cpp:101
+
+template <class T> ACE_INLINE
+void POA_CORBA::ComponentIR::ModuleDef_tie<T>::move (
+ ::CORBA::Container_ptr new_container,
+ const char * new_name,
+ const char * new_version
+ ACE_ENV_ARG_DECL
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ))
+{
+ this->ptr_->move (
+ new_container,
+ new_name,
+ new_version
+ ACE_ENV_ARG_PARAMETER
+ );
+}
+
+// TAO_IDL - Generated from
+// be\be_visitor_operation/tie_si.cpp:101
+
+template <class T> ACE_INLINE
+::CORBA::ComponentIR::ComponentDef_ptr POA_CORBA::ComponentIR::ModuleDef_tie<T>::create_component (
+ const char * id,
+ const char * name,
+ const char * version,
+ ::CORBA::ComponentIR::ComponentDef_ptr base_component,
+ const ::CORBA::InterfaceDefSeq & supports_interfaces
+ ACE_ENV_ARG_DECL
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ))
+{
+ return this->ptr_->create_component (
+ id,
+ name,
+ version,
+ base_component,
+ supports_interfaces
+ ACE_ENV_ARG_PARAMETER
+ );
+}
+
+// TAO_IDL - Generated from
+// be\be_visitor_operation/tie_si.cpp:101
+
+template <class T> ACE_INLINE
+::CORBA::ComponentIR::HomeDef_ptr POA_CORBA::ComponentIR::ModuleDef_tie<T>::create_home (
+ const char * id,
+ const char * name,
+ const char * version,
+ ::CORBA::ComponentIR::HomeDef_ptr base_home,
+ ::CORBA::ComponentIR::ComponentDef_ptr managed_component,
+ const ::CORBA::InterfaceDefSeq & supports_interfaces,
+ ::CORBA::ValueDef_ptr primary_key
+ ACE_ENV_ARG_DECL
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ))
+{
+ return this->ptr_->create_home (
+ id,
+ name,
+ version,
+ base_home,
+ managed_component,
+ supports_interfaces,
+ primary_key
+ ACE_ENV_ARG_PARAMETER
+ );
+}
+
+// TAO_IDL - Generated from
+// be\be_visitor_operation/tie_si.cpp:101
+
+template <class T> ACE_INLINE
+::CORBA::ComponentIR::EventDef_ptr POA_CORBA::ComponentIR::ModuleDef_tie<T>::create_event (
+ const char * id,
+ const char * name,
+ const char * version,
+ ::CORBA::Boolean is_custom,
+ ::CORBA::Boolean is_abstract,
+ ::CORBA::ValueDef_ptr base_value,
+ ::CORBA::Boolean is_truncatable,
+ const ::CORBA::ValueDefSeq & abstract_base_values,
+ const ::CORBA::InterfaceDefSeq & supported_interfaces,
+ const ::CORBA::ExtInitializerSeq & initializers
+ ACE_ENV_ARG_DECL
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ))
+{
+ return this->ptr_->create_event (
+ id,
+ name,
+ version,
+ is_custom,
+ is_abstract,
+ base_value,
+ is_truncatable,
+ abstract_base_values,
+ supported_interfaces,
+ initializers
+ ACE_ENV_ARG_PARAMETER
+ );
+}
+
+// TAO_IDL - Generated from
+// be\be_visitor_interface/tie_si.cpp:96
+
+template <class T> ACE_INLINE
+POA_CORBA::ComponentIR::Repository_tie<T>::Repository_tie (T &t)
+ : ptr_ (&t),
+ poa_ (PortableServer::POA::_nil ()),
+ rel_ (0)
+{}
+
+template <class T> ACE_INLINE
+POA_CORBA::ComponentIR::Repository_tie<T>::Repository_tie (T &t, PortableServer::POA_ptr poa)
+ : ptr_ (&t),
+ poa_ (PortableServer::POA::_duplicate (poa)),
+ rel_ (0)
+{}
+
+template <class T> ACE_INLINE
+POA_CORBA::ComponentIR::Repository_tie<T>::Repository_tie (T *tp, ::CORBA::Boolean release)
+ : ptr_ (tp),
+ poa_ (PortableServer::POA::_nil ()),
+ rel_ (release)
+{}
+
+template <class T> ACE_INLINE
+POA_CORBA::ComponentIR::Repository_tie<T>::Repository_tie (T *tp, PortableServer::POA_ptr poa, ::CORBA::Boolean release)
+ : ptr_ (tp),
+ poa_ (PortableServer::POA::_duplicate (poa)),
+ rel_ (release)
+{}
+
+template <class T> ACE_INLINE
+POA_CORBA::ComponentIR::Repository_tie<T>::~Repository_tie (void)
+{
+ if (this->rel_)
+ {
+ delete this->ptr_;
+ }
+}
+
+template <class T> ACE_INLINE T *
+POA_CORBA::ComponentIR::Repository_tie<T>::_tied_object (void)
+{
+ return this->ptr_;
+}
+
+template <class T> ACE_INLINE void
+POA_CORBA::ComponentIR::Repository_tie<T>::_tied_object (T &obj)
+{
+ if (this->rel_)
+ {
+ delete this->ptr_;
+ }
+
+ this->ptr_ = &obj;
+ this->rel_ = 0;
+}
+
+template <class T> ACE_INLINE void
+POA_CORBA::ComponentIR::Repository_tie<T>::_tied_object (T *obj, ::CORBA::Boolean release)
+{
+ if (this->rel_)
+ {
+ delete this->ptr_;
+ }
+
+ this->ptr_ = obj;
+ this->rel_ = release;
+}
+
+template <class T> ACE_INLINE ::CORBA::Boolean
+POA_CORBA::ComponentIR::Repository_tie<T>::_is_owner (void)
+{
+ return this->rel_;
+}
+
+template <class T> ACE_INLINE void
+POA_CORBA::ComponentIR::Repository_tie<T>::_is_owner ( ::CORBA::Boolean b)
+{
+ this->rel_ = b;
+}
+
+template <class T> ACE_INLINE PortableServer::POA_ptr
+POA_CORBA::ComponentIR::Repository_tie<T>::_default_POA (ACE_ENV_SINGLE_ARG_DECL)
+{
+ if (! ::CORBA::is_nil (this->poa_.in ()))
+ {
+ return PortableServer::POA::_duplicate (this->poa_.in ());
+ }
+
+ return this->Repository::_default_POA (ACE_ENV_SINGLE_ARG_PARAMETER);
+}
+
+// TAO_IDL - Generated from
+// be\be_visitor_operation/tie_si.cpp:101
+
+template <class T> ACE_INLINE
+::CORBA::DefinitionKind POA_CORBA::ComponentIR::Repository_tie<T>::def_kind (
+ ACE_ENV_SINGLE_ARG_DECL
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ))
+{
+ return this->ptr_->def_kind (
+ ACE_ENV_SINGLE_ARG_PARAMETER
+ );
+}
+
+// TAO_IDL - Generated from
+// be\be_visitor_operation/tie_si.cpp:101
+
+template <class T> ACE_INLINE
+void POA_CORBA::ComponentIR::Repository_tie<T>::destroy (
+ ACE_ENV_SINGLE_ARG_DECL
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ))
+{
+ this->ptr_->destroy (
+ ACE_ENV_SINGLE_ARG_PARAMETER
+ );
+}
+
+// TAO_IDL - Generated from
+// be\be_visitor_operation/tie_si.cpp:101
+
+template <class T> ACE_INLINE
+::CORBA::Contained_ptr POA_CORBA::ComponentIR::Repository_tie<T>::lookup (
+ const char * search_name
+ ACE_ENV_ARG_DECL
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ))
+{
+ return this->ptr_->lookup (
+ search_name
+ ACE_ENV_ARG_PARAMETER
+ );
+}
+
+// TAO_IDL - Generated from
+// be\be_visitor_operation/tie_si.cpp:101
+
+template <class T> ACE_INLINE
+::CORBA::ContainedSeq * POA_CORBA::ComponentIR::Repository_tie<T>::contents (
+ ::CORBA::DefinitionKind limit_type,
+ ::CORBA::Boolean exclude_inherited
+ ACE_ENV_ARG_DECL
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ))
+{
+ return this->ptr_->contents (
+ limit_type,
+ exclude_inherited
+ ACE_ENV_ARG_PARAMETER
+ );
+}
+
+// TAO_IDL - Generated from
+// be\be_visitor_operation/tie_si.cpp:101
+
+template <class T> ACE_INLINE
+::CORBA::ContainedSeq * POA_CORBA::ComponentIR::Repository_tie<T>::lookup_name (
+ const char * search_name,
+ ::CORBA::Long levels_to_search,
+ ::CORBA::DefinitionKind limit_type,
+ ::CORBA::Boolean exclude_inherited
+ ACE_ENV_ARG_DECL
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ))
+{
+ return this->ptr_->lookup_name (
+ search_name,
+ levels_to_search,
+ limit_type,
+ exclude_inherited
+ ACE_ENV_ARG_PARAMETER
+ );
+}
+
+// TAO_IDL - Generated from
+// be\be_visitor_operation/tie_si.cpp:101
+
+template <class T> ACE_INLINE
+::CORBA::Container::DescriptionSeq * POA_CORBA::ComponentIR::Repository_tie<T>::describe_contents (
+ ::CORBA::DefinitionKind limit_type,
+ ::CORBA::Boolean exclude_inherited,
+ ::CORBA::Long max_returned_objs
+ ACE_ENV_ARG_DECL
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ))
+{
+ return this->ptr_->describe_contents (
+ limit_type,
+ exclude_inherited,
+ max_returned_objs
+ ACE_ENV_ARG_PARAMETER
+ );
+}
+
+// TAO_IDL - Generated from
+// be\be_visitor_operation/tie_si.cpp:101
+
+template <class T> ACE_INLINE
+::CORBA::ModuleDef_ptr POA_CORBA::ComponentIR::Repository_tie<T>::create_module (
+ const char * id,
+ const char * name,
+ const char * version
+ ACE_ENV_ARG_DECL
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ))
+{
+ return this->ptr_->create_module (
+ id,
+ name,
+ version
+ ACE_ENV_ARG_PARAMETER
+ );
+}
+
+// TAO_IDL - Generated from
+// be\be_visitor_operation/tie_si.cpp:101
+
+template <class T> ACE_INLINE
+::CORBA::ConstantDef_ptr POA_CORBA::ComponentIR::Repository_tie<T>::create_constant (
+ const char * id,
+ const char * name,
+ const char * version,
+ ::CORBA::IDLType_ptr type,
+ const ::CORBA::Any & value
+ ACE_ENV_ARG_DECL
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ))
+{
+ return this->ptr_->create_constant (
+ id,
+ name,
+ version,
+ type,
+ value
+ ACE_ENV_ARG_PARAMETER
+ );
+}
+
+// TAO_IDL - Generated from
+// be\be_visitor_operation/tie_si.cpp:101
+
+template <class T> ACE_INLINE
+::CORBA::StructDef_ptr POA_CORBA::ComponentIR::Repository_tie<T>::create_struct (
+ const char * id,
+ const char * name,
+ const char * version,
+ const ::CORBA::StructMemberSeq & members
+ ACE_ENV_ARG_DECL
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ))
+{
+ return this->ptr_->create_struct (
+ id,
+ name,
+ version,
+ members
+ ACE_ENV_ARG_PARAMETER
+ );
+}
+
+// TAO_IDL - Generated from
+// be\be_visitor_operation/tie_si.cpp:101
+
+template <class T> ACE_INLINE
+::CORBA::UnionDef_ptr POA_CORBA::ComponentIR::Repository_tie<T>::create_union (
+ const char * id,
+ const char * name,
+ const char * version,
+ ::CORBA::IDLType_ptr discriminator_type,
+ const ::CORBA::UnionMemberSeq & members
+ ACE_ENV_ARG_DECL
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ))
+{
+ return this->ptr_->create_union (
+ id,
+ name,
+ version,
+ discriminator_type,
+ members
+ ACE_ENV_ARG_PARAMETER
+ );
+}
+
+// TAO_IDL - Generated from
+// be\be_visitor_operation/tie_si.cpp:101
+
+template <class T> ACE_INLINE
+::CORBA::EnumDef_ptr POA_CORBA::ComponentIR::Repository_tie<T>::create_enum (
+ const char * id,
+ const char * name,
+ const char * version,
+ const ::CORBA::EnumMemberSeq & members
+ ACE_ENV_ARG_DECL
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ))
+{
+ return this->ptr_->create_enum (
+ id,
+ name,
+ version,
+ members
+ ACE_ENV_ARG_PARAMETER
+ );
+}
+
+// TAO_IDL - Generated from
+// be\be_visitor_operation/tie_si.cpp:101
+
+template <class T> ACE_INLINE
+::CORBA::AliasDef_ptr POA_CORBA::ComponentIR::Repository_tie<T>::create_alias (
+ const char * id,
+ const char * name,
+ const char * version,
+ ::CORBA::IDLType_ptr original_type
+ ACE_ENV_ARG_DECL
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ))
+{
+ return this->ptr_->create_alias (
+ id,
+ name,
+ version,
+ original_type
+ ACE_ENV_ARG_PARAMETER
+ );
+}
+
+// TAO_IDL - Generated from
+// be\be_visitor_operation/tie_si.cpp:101
+
+template <class T> ACE_INLINE
+::CORBA::InterfaceDef_ptr POA_CORBA::ComponentIR::Repository_tie<T>::create_interface (
+ const char * id,
+ const char * name,
+ const char * version,
+ const ::CORBA::InterfaceDefSeq & base_interfaces
+ ACE_ENV_ARG_DECL
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ))
+{
+ return this->ptr_->create_interface (
+ id,
+ name,
+ version,
+ base_interfaces
+ ACE_ENV_ARG_PARAMETER
+ );
+}
+
+// TAO_IDL - Generated from
+// be\be_visitor_operation/tie_si.cpp:101
+
+template <class T> ACE_INLINE
+::CORBA::ValueDef_ptr POA_CORBA::ComponentIR::Repository_tie<T>::create_value (
+ const char * id,
+ const char * name,
+ const char * version,
+ ::CORBA::Boolean is_custom,
+ ::CORBA::Boolean is_abstract,
+ ::CORBA::ValueDef_ptr base_value,
+ ::CORBA::Boolean is_truncatable,
+ const ::CORBA::ValueDefSeq & abstract_base_values,
+ const ::CORBA::InterfaceDefSeq & supported_interfaces,
+ const ::CORBA::InitializerSeq & initializers
+ ACE_ENV_ARG_DECL
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ))
+{
+ return this->ptr_->create_value (
+ id,
+ name,
+ version,
+ is_custom,
+ is_abstract,
+ base_value,
+ is_truncatable,
+ abstract_base_values,
+ supported_interfaces,
+ initializers
+ ACE_ENV_ARG_PARAMETER
+ );
+}
+
+// TAO_IDL - Generated from
+// be\be_visitor_operation/tie_si.cpp:101
+
+template <class T> ACE_INLINE
+::CORBA::ValueBoxDef_ptr POA_CORBA::ComponentIR::Repository_tie<T>::create_value_box (
+ const char * id,
+ const char * name,
+ const char * version,
+ ::CORBA::IDLType_ptr original_type_def
+ ACE_ENV_ARG_DECL
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ))
+{
+ return this->ptr_->create_value_box (
+ id,
+ name,
+ version,
+ original_type_def
+ ACE_ENV_ARG_PARAMETER
+ );
+}
+
+// TAO_IDL - Generated from
+// be\be_visitor_operation/tie_si.cpp:101
+
+template <class T> ACE_INLINE
+::CORBA::ExceptionDef_ptr POA_CORBA::ComponentIR::Repository_tie<T>::create_exception (
+ const char * id,
+ const char * name,
+ const char * version,
+ const ::CORBA::StructMemberSeq & members
+ ACE_ENV_ARG_DECL
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ))
+{
+ return this->ptr_->create_exception (
+ id,
+ name,
+ version,
+ members
+ ACE_ENV_ARG_PARAMETER
+ );
+}
+
+// TAO_IDL - Generated from
+// be\be_visitor_operation/tie_si.cpp:101
+
+template <class T> ACE_INLINE
+::CORBA::NativeDef_ptr POA_CORBA::ComponentIR::Repository_tie<T>::create_native (
+ const char * id,
+ const char * name,
+ const char * version
+ ACE_ENV_ARG_DECL
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ))
+{
+ return this->ptr_->create_native (
+ id,
+ name,
+ version
+ ACE_ENV_ARG_PARAMETER
+ );
+}
+
+// TAO_IDL - Generated from
+// be\be_visitor_operation/tie_si.cpp:101
+
+template <class T> ACE_INLINE
+::CORBA::AbstractInterfaceDef_ptr POA_CORBA::ComponentIR::Repository_tie<T>::create_abstract_interface (
+ const char * id,
+ const char * name,
+ const char * version,
+ const ::CORBA::AbstractInterfaceDefSeq & base_interfaces
+ ACE_ENV_ARG_DECL
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ))
+{
+ return this->ptr_->create_abstract_interface (
+ id,
+ name,
+ version,
+ base_interfaces
+ ACE_ENV_ARG_PARAMETER
+ );
+}
+
+// TAO_IDL - Generated from
+// be\be_visitor_operation/tie_si.cpp:101
+
+template <class T> ACE_INLINE
+::CORBA::LocalInterfaceDef_ptr POA_CORBA::ComponentIR::Repository_tie<T>::create_local_interface (
+ const char * id,
+ const char * name,
+ const char * version,
+ const ::CORBA::InterfaceDefSeq & base_interfaces
+ ACE_ENV_ARG_DECL
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ))
+{
+ return this->ptr_->create_local_interface (
+ id,
+ name,
+ version,
+ base_interfaces
+ ACE_ENV_ARG_PARAMETER
+ );
+}
+
+// TAO_IDL - Generated from
+// be\be_visitor_operation/tie_si.cpp:101
+
+template <class T> ACE_INLINE
+::CORBA::ExtValueDef_ptr POA_CORBA::ComponentIR::Repository_tie<T>::create_ext_value (
+ const char * id,
+ const char * name,
+ const char * version,
+ ::CORBA::Boolean is_custom,
+ ::CORBA::Boolean is_abstract,
+ ::CORBA::ValueDef_ptr base_value,
+ ::CORBA::Boolean is_truncatable,
+ const ::CORBA::ValueDefSeq & abstract_base_values,
+ const ::CORBA::InterfaceDefSeq & supported_interfaces,
+ const ::CORBA::ExtInitializerSeq & initializers
+ ACE_ENV_ARG_DECL
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ))
+{
+ return this->ptr_->create_ext_value (
+ id,
+ name,
+ version,
+ is_custom,
+ is_abstract,
+ base_value,
+ is_truncatable,
+ abstract_base_values,
+ supported_interfaces,
+ initializers
+ ACE_ENV_ARG_PARAMETER
+ );
+}
+
+// TAO_IDL - Generated from
+// be\be_visitor_operation/tie_si.cpp:101
+
+template <class T> ACE_INLINE
+::CORBA::Contained_ptr POA_CORBA::ComponentIR::Repository_tie<T>::lookup_id (
+ const char * search_id
+ ACE_ENV_ARG_DECL
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ))
+{
+ return this->ptr_->lookup_id (
+ search_id
+ ACE_ENV_ARG_PARAMETER
+ );
+}
+
+// TAO_IDL - Generated from
+// be\be_visitor_operation/tie_si.cpp:101
+
+template <class T> ACE_INLINE
+::CORBA::TypeCode_ptr POA_CORBA::ComponentIR::Repository_tie<T>::get_canonical_typecode (
+ ::CORBA::TypeCode_ptr tc
+ ACE_ENV_ARG_DECL
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ))
+{
+ return this->ptr_->get_canonical_typecode (
+ tc
+ ACE_ENV_ARG_PARAMETER
+ );
+}
+
+// TAO_IDL - Generated from
+// be\be_visitor_operation/tie_si.cpp:101
+
+template <class T> ACE_INLINE
+::CORBA::PrimitiveDef_ptr POA_CORBA::ComponentIR::Repository_tie<T>::get_primitive (
+ ::CORBA::PrimitiveKind kind
+ ACE_ENV_ARG_DECL
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ))
+{
+ return this->ptr_->get_primitive (
+ kind
+ ACE_ENV_ARG_PARAMETER
+ );
+}
+
+// TAO_IDL - Generated from
+// be\be_visitor_operation/tie_si.cpp:101
+
+template <class T> ACE_INLINE
+::CORBA::StringDef_ptr POA_CORBA::ComponentIR::Repository_tie<T>::create_string (
+ ::CORBA::ULong bound
+ ACE_ENV_ARG_DECL
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ))
+{
+ return this->ptr_->create_string (
+ bound
+ ACE_ENV_ARG_PARAMETER
+ );
+}
+
+// TAO_IDL - Generated from
+// be\be_visitor_operation/tie_si.cpp:101
+
+template <class T> ACE_INLINE
+::CORBA::WstringDef_ptr POA_CORBA::ComponentIR::Repository_tie<T>::create_wstring (
+ ::CORBA::ULong bound
+ ACE_ENV_ARG_DECL
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ))
+{
+ return this->ptr_->create_wstring (
+ bound
+ ACE_ENV_ARG_PARAMETER
+ );
+}
+
+// TAO_IDL - Generated from
+// be\be_visitor_operation/tie_si.cpp:101
+
+template <class T> ACE_INLINE
+::CORBA::SequenceDef_ptr POA_CORBA::ComponentIR::Repository_tie<T>::create_sequence (
+ ::CORBA::ULong bound,
+ ::CORBA::IDLType_ptr element_type
+ ACE_ENV_ARG_DECL
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ))
+{
+ return this->ptr_->create_sequence (
+ bound,
+ element_type
+ ACE_ENV_ARG_PARAMETER
+ );
+}
+
+// TAO_IDL - Generated from
+// be\be_visitor_operation/tie_si.cpp:101
+
+template <class T> ACE_INLINE
+::CORBA::ArrayDef_ptr POA_CORBA::ComponentIR::Repository_tie<T>::create_array (
+ ::CORBA::ULong length,
+ ::CORBA::IDLType_ptr element_type
+ ACE_ENV_ARG_DECL
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ))
+{
+ return this->ptr_->create_array (
+ length,
+ element_type
+ ACE_ENV_ARG_PARAMETER
+ );
+}
+
+// TAO_IDL - Generated from
+// be\be_visitor_operation/tie_si.cpp:101
+
+template <class T> ACE_INLINE
+::CORBA::FixedDef_ptr POA_CORBA::ComponentIR::Repository_tie<T>::create_fixed (
+ ::CORBA::UShort digits,
+ ::CORBA::Short scale
+ ACE_ENV_ARG_DECL
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ))
+{
+ return this->ptr_->create_fixed (
+ digits,
+ scale
+ ACE_ENV_ARG_PARAMETER
+ );
+}
+
+// TAO_IDL - Generated from
+// be\be_visitor_operation/tie_si.cpp:101
+
+template <class T> ACE_INLINE
+::CORBA::ComponentIR::ComponentDef_ptr POA_CORBA::ComponentIR::Repository_tie<T>::create_component (
+ const char * id,
+ const char * name,
+ const char * version,
+ ::CORBA::ComponentIR::ComponentDef_ptr base_component,
+ const ::CORBA::InterfaceDefSeq & supports_interfaces
+ ACE_ENV_ARG_DECL
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ))
+{
+ return this->ptr_->create_component (
+ id,
+ name,
+ version,
+ base_component,
+ supports_interfaces
+ ACE_ENV_ARG_PARAMETER
+ );
+}
+
+// TAO_IDL - Generated from
+// be\be_visitor_operation/tie_si.cpp:101
+
+template <class T> ACE_INLINE
+::CORBA::ComponentIR::HomeDef_ptr POA_CORBA::ComponentIR::Repository_tie<T>::create_home (
+ const char * id,
+ const char * name,
+ const char * version,
+ ::CORBA::ComponentIR::HomeDef_ptr base_home,
+ ::CORBA::ComponentIR::ComponentDef_ptr managed_component,
+ const ::CORBA::InterfaceDefSeq & supports_interfaces,
+ ::CORBA::ValueDef_ptr primary_key
+ ACE_ENV_ARG_DECL
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ))
+{
+ return this->ptr_->create_home (
+ id,
+ name,
+ version,
+ base_home,
+ managed_component,
+ supports_interfaces,
+ primary_key
+ ACE_ENV_ARG_PARAMETER
+ );
+}
+
+// TAO_IDL - Generated from
+// be\be_visitor_operation/tie_si.cpp:101
+
+template <class T> ACE_INLINE
+::CORBA::ComponentIR::EventDef_ptr POA_CORBA::ComponentIR::Repository_tie<T>::create_event (
+ const char * id,
+ const char * name,
+ const char * version,
+ ::CORBA::Boolean is_custom,
+ ::CORBA::Boolean is_abstract,
+ ::CORBA::ValueDef_ptr base_value,
+ ::CORBA::Boolean is_truncatable,
+ const ::CORBA::ValueDefSeq & abstract_base_values,
+ const ::CORBA::InterfaceDefSeq & supported_interfaces,
+ const ::CORBA::ExtInitializerSeq & initializers
+ ACE_ENV_ARG_DECL
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ))
+{
+ return this->ptr_->create_event (
+ id,
+ name,
+ version,
+ is_custom,
+ is_abstract,
+ base_value,
+ is_truncatable,
+ abstract_base_values,
+ supported_interfaces,
+ initializers
+ ACE_ENV_ARG_PARAMETER
+ );
+}
+
+// TAO_IDL - Generated from
+// be\be_visitor_interface/tie_si.cpp:96
+
+template <class T> ACE_INLINE
+POA_CORBA::ComponentIR::ProvidesDef_tie<T>::ProvidesDef_tie (T &t)
+ : ptr_ (&t),
+ poa_ (PortableServer::POA::_nil ()),
+ rel_ (0)
+{}
+
+template <class T> ACE_INLINE
+POA_CORBA::ComponentIR::ProvidesDef_tie<T>::ProvidesDef_tie (T &t, PortableServer::POA_ptr poa)
+ : ptr_ (&t),
+ poa_ (PortableServer::POA::_duplicate (poa)),
+ rel_ (0)
+{}
+
+template <class T> ACE_INLINE
+POA_CORBA::ComponentIR::ProvidesDef_tie<T>::ProvidesDef_tie (T *tp, ::CORBA::Boolean release)
+ : ptr_ (tp),
+ poa_ (PortableServer::POA::_nil ()),
+ rel_ (release)
+{}
+
+template <class T> ACE_INLINE
+POA_CORBA::ComponentIR::ProvidesDef_tie<T>::ProvidesDef_tie (T *tp, PortableServer::POA_ptr poa, ::CORBA::Boolean release)
+ : ptr_ (tp),
+ poa_ (PortableServer::POA::_duplicate (poa)),
+ rel_ (release)
+{}
+
+template <class T> ACE_INLINE
+POA_CORBA::ComponentIR::ProvidesDef_tie<T>::~ProvidesDef_tie (void)
+{
+ if (this->rel_)
+ {
+ delete this->ptr_;
+ }
+}
+
+template <class T> ACE_INLINE T *
+POA_CORBA::ComponentIR::ProvidesDef_tie<T>::_tied_object (void)
+{
+ return this->ptr_;
+}
+
+template <class T> ACE_INLINE void
+POA_CORBA::ComponentIR::ProvidesDef_tie<T>::_tied_object (T &obj)
+{
+ if (this->rel_)
+ {
+ delete this->ptr_;
+ }
+
+ this->ptr_ = &obj;
+ this->rel_ = 0;
+}
+
+template <class T> ACE_INLINE void
+POA_CORBA::ComponentIR::ProvidesDef_tie<T>::_tied_object (T *obj, ::CORBA::Boolean release)
+{
+ if (this->rel_)
+ {
+ delete this->ptr_;
+ }
+
+ this->ptr_ = obj;
+ this->rel_ = release;
+}
+
+template <class T> ACE_INLINE ::CORBA::Boolean
+POA_CORBA::ComponentIR::ProvidesDef_tie<T>::_is_owner (void)
+{
+ return this->rel_;
+}
+
+template <class T> ACE_INLINE void
+POA_CORBA::ComponentIR::ProvidesDef_tie<T>::_is_owner ( ::CORBA::Boolean b)
+{
+ this->rel_ = b;
+}
+
+template <class T> ACE_INLINE PortableServer::POA_ptr
+POA_CORBA::ComponentIR::ProvidesDef_tie<T>::_default_POA (ACE_ENV_SINGLE_ARG_DECL)
+{
+ if (! ::CORBA::is_nil (this->poa_.in ()))
+ {
+ return PortableServer::POA::_duplicate (this->poa_.in ());
+ }
+
+ return this->ProvidesDef::_default_POA (ACE_ENV_SINGLE_ARG_PARAMETER);
+}
+
+// TAO_IDL - Generated from
+// be\be_visitor_operation/tie_si.cpp:101
+
+template <class T> ACE_INLINE
+::CORBA::DefinitionKind POA_CORBA::ComponentIR::ProvidesDef_tie<T>::def_kind (
+ ACE_ENV_SINGLE_ARG_DECL
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ))
+{
+ return this->ptr_->def_kind (
+ ACE_ENV_SINGLE_ARG_PARAMETER
+ );
+}
+
+// TAO_IDL - Generated from
+// be\be_visitor_operation/tie_si.cpp:101
+
+template <class T> ACE_INLINE
+void POA_CORBA::ComponentIR::ProvidesDef_tie<T>::destroy (
+ ACE_ENV_SINGLE_ARG_DECL
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ))
+{
+ this->ptr_->destroy (
+ ACE_ENV_SINGLE_ARG_PARAMETER
+ );
+}
+
+// TAO_IDL - Generated from
+// be\be_visitor_operation/tie_si.cpp:101
+
+template <class T> ACE_INLINE
+char * POA_CORBA::ComponentIR::ProvidesDef_tie<T>::id (
+ ACE_ENV_SINGLE_ARG_DECL
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ))
+{
+ return this->ptr_->id (
+ ACE_ENV_SINGLE_ARG_PARAMETER
+ );
+}
+
+// TAO_IDL - Generated from
+// be\be_visitor_operation/tie_si.cpp:101
+
+template <class T> ACE_INLINE
+void POA_CORBA::ComponentIR::ProvidesDef_tie<T>::id (
+ const char * id
+ ACE_ENV_ARG_DECL
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ))
+{
+ this->ptr_->id (
+ id
+ ACE_ENV_ARG_PARAMETER
+ );
+}
+
+// TAO_IDL - Generated from
+// be\be_visitor_operation/tie_si.cpp:101
+
+template <class T> ACE_INLINE
+char * POA_CORBA::ComponentIR::ProvidesDef_tie<T>::name (
+ ACE_ENV_SINGLE_ARG_DECL
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ))
+{
+ return this->ptr_->name (
+ ACE_ENV_SINGLE_ARG_PARAMETER
+ );
+}
+
+// TAO_IDL - Generated from
+// be\be_visitor_operation/tie_si.cpp:101
+
+template <class T> ACE_INLINE
+void POA_CORBA::ComponentIR::ProvidesDef_tie<T>::name (
+ const char * name
+ ACE_ENV_ARG_DECL
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ))
+{
+ this->ptr_->name (
+ name
+ ACE_ENV_ARG_PARAMETER
+ );
+}
+
+// TAO_IDL - Generated from
+// be\be_visitor_operation/tie_si.cpp:101
+
+template <class T> ACE_INLINE
+char * POA_CORBA::ComponentIR::ProvidesDef_tie<T>::version (
+ ACE_ENV_SINGLE_ARG_DECL
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ))
+{
+ return this->ptr_->version (
+ ACE_ENV_SINGLE_ARG_PARAMETER
+ );
+}
+
+// TAO_IDL - Generated from
+// be\be_visitor_operation/tie_si.cpp:101
+
+template <class T> ACE_INLINE
+void POA_CORBA::ComponentIR::ProvidesDef_tie<T>::version (
+ const char * version
+ ACE_ENV_ARG_DECL
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ))
+{
+ this->ptr_->version (
+ version
+ ACE_ENV_ARG_PARAMETER
+ );
+}
+
+// TAO_IDL - Generated from
+// be\be_visitor_operation/tie_si.cpp:101
+
+template <class T> ACE_INLINE
+::CORBA::Container_ptr POA_CORBA::ComponentIR::ProvidesDef_tie<T>::defined_in (
+ ACE_ENV_SINGLE_ARG_DECL
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ))
+{
+ return this->ptr_->defined_in (
+ ACE_ENV_SINGLE_ARG_PARAMETER
+ );
+}
+
+// TAO_IDL - Generated from
+// be\be_visitor_operation/tie_si.cpp:101
+
+template <class T> ACE_INLINE
+char * POA_CORBA::ComponentIR::ProvidesDef_tie<T>::absolute_name (
+ ACE_ENV_SINGLE_ARG_DECL
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ))
+{
+ return this->ptr_->absolute_name (
+ ACE_ENV_SINGLE_ARG_PARAMETER
+ );
+}
+
+// TAO_IDL - Generated from
+// be\be_visitor_operation/tie_si.cpp:101
+
+template <class T> ACE_INLINE
+::CORBA::Repository_ptr POA_CORBA::ComponentIR::ProvidesDef_tie<T>::containing_repository (
+ ACE_ENV_SINGLE_ARG_DECL
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ))
+{
+ return this->ptr_->containing_repository (
+ ACE_ENV_SINGLE_ARG_PARAMETER
+ );
+}
+
+// TAO_IDL - Generated from
+// be\be_visitor_operation/tie_si.cpp:101
+
+template <class T> ACE_INLINE
+::CORBA::Contained::Description * POA_CORBA::ComponentIR::ProvidesDef_tie<T>::describe (
+ ACE_ENV_SINGLE_ARG_DECL
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ))
+{
+ return this->ptr_->describe (
+ ACE_ENV_SINGLE_ARG_PARAMETER
+ );
+}
+
+// TAO_IDL - Generated from
+// be\be_visitor_operation/tie_si.cpp:101
+
+template <class T> ACE_INLINE
+void POA_CORBA::ComponentIR::ProvidesDef_tie<T>::move (
+ ::CORBA::Container_ptr new_container,
+ const char * new_name,
+ const char * new_version
+ ACE_ENV_ARG_DECL
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ))
+{
+ this->ptr_->move (
+ new_container,
+ new_name,
+ new_version
+ ACE_ENV_ARG_PARAMETER
+ );
+}
+
+// TAO_IDL - Generated from
+// be\be_visitor_operation/tie_si.cpp:101
+
+template <class T> ACE_INLINE
+::CORBA::InterfaceDef_ptr POA_CORBA::ComponentIR::ProvidesDef_tie<T>::interface_type (
+ ACE_ENV_SINGLE_ARG_DECL
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ))
+{
+ return this->ptr_->interface_type (
+ ACE_ENV_SINGLE_ARG_PARAMETER
+ );
+}
+
+// TAO_IDL - Generated from
+// be\be_visitor_operation/tie_si.cpp:101
+
+template <class T> ACE_INLINE
+void POA_CORBA::ComponentIR::ProvidesDef_tie<T>::interface_type (
+ ::CORBA::InterfaceDef_ptr interface_type
+ ACE_ENV_ARG_DECL
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ))
+{
+ this->ptr_->interface_type (
+ interface_type
+ ACE_ENV_ARG_PARAMETER
+ );
+}
+
+// TAO_IDL - Generated from
+// be\be_visitor_interface/tie_si.cpp:96
+
+template <class T> ACE_INLINE
+POA_CORBA::ComponentIR::UsesDef_tie<T>::UsesDef_tie (T &t)
+ : ptr_ (&t),
+ poa_ (PortableServer::POA::_nil ()),
+ rel_ (0)
+{}
+
+template <class T> ACE_INLINE
+POA_CORBA::ComponentIR::UsesDef_tie<T>::UsesDef_tie (T &t, PortableServer::POA_ptr poa)
+ : ptr_ (&t),
+ poa_ (PortableServer::POA::_duplicate (poa)),
+ rel_ (0)
+{}
+
+template <class T> ACE_INLINE
+POA_CORBA::ComponentIR::UsesDef_tie<T>::UsesDef_tie (T *tp, ::CORBA::Boolean release)
+ : ptr_ (tp),
+ poa_ (PortableServer::POA::_nil ()),
+ rel_ (release)
+{}
+
+template <class T> ACE_INLINE
+POA_CORBA::ComponentIR::UsesDef_tie<T>::UsesDef_tie (T *tp, PortableServer::POA_ptr poa, ::CORBA::Boolean release)
+ : ptr_ (tp),
+ poa_ (PortableServer::POA::_duplicate (poa)),
+ rel_ (release)
+{}
+
+template <class T> ACE_INLINE
+POA_CORBA::ComponentIR::UsesDef_tie<T>::~UsesDef_tie (void)
+{
+ if (this->rel_)
+ {
+ delete this->ptr_;
+ }
+}
+
+template <class T> ACE_INLINE T *
+POA_CORBA::ComponentIR::UsesDef_tie<T>::_tied_object (void)
+{
+ return this->ptr_;
+}
+
+template <class T> ACE_INLINE void
+POA_CORBA::ComponentIR::UsesDef_tie<T>::_tied_object (T &obj)
+{
+ if (this->rel_)
+ {
+ delete this->ptr_;
+ }
+
+ this->ptr_ = &obj;
+ this->rel_ = 0;
+}
+
+template <class T> ACE_INLINE void
+POA_CORBA::ComponentIR::UsesDef_tie<T>::_tied_object (T *obj, ::CORBA::Boolean release)
+{
+ if (this->rel_)
+ {
+ delete this->ptr_;
+ }
+
+ this->ptr_ = obj;
+ this->rel_ = release;
+}
+
+template <class T> ACE_INLINE ::CORBA::Boolean
+POA_CORBA::ComponentIR::UsesDef_tie<T>::_is_owner (void)
+{
+ return this->rel_;
+}
+
+template <class T> ACE_INLINE void
+POA_CORBA::ComponentIR::UsesDef_tie<T>::_is_owner ( ::CORBA::Boolean b)
+{
+ this->rel_ = b;
+}
+
+template <class T> ACE_INLINE PortableServer::POA_ptr
+POA_CORBA::ComponentIR::UsesDef_tie<T>::_default_POA (ACE_ENV_SINGLE_ARG_DECL)
+{
+ if (! ::CORBA::is_nil (this->poa_.in ()))
+ {
+ return PortableServer::POA::_duplicate (this->poa_.in ());
+ }
+
+ return this->UsesDef::_default_POA (ACE_ENV_SINGLE_ARG_PARAMETER);
+}
+
+// TAO_IDL - Generated from
+// be\be_visitor_operation/tie_si.cpp:101
+
+template <class T> ACE_INLINE
+::CORBA::DefinitionKind POA_CORBA::ComponentIR::UsesDef_tie<T>::def_kind (
+ ACE_ENV_SINGLE_ARG_DECL
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ))
+{
+ return this->ptr_->def_kind (
+ ACE_ENV_SINGLE_ARG_PARAMETER
+ );
+}
+
+// TAO_IDL - Generated from
+// be\be_visitor_operation/tie_si.cpp:101
+
+template <class T> ACE_INLINE
+void POA_CORBA::ComponentIR::UsesDef_tie<T>::destroy (
+ ACE_ENV_SINGLE_ARG_DECL
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ))
+{
+ this->ptr_->destroy (
+ ACE_ENV_SINGLE_ARG_PARAMETER
+ );
+}
+
+// TAO_IDL - Generated from
+// be\be_visitor_operation/tie_si.cpp:101
+
+template <class T> ACE_INLINE
+char * POA_CORBA::ComponentIR::UsesDef_tie<T>::id (
+ ACE_ENV_SINGLE_ARG_DECL
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ))
+{
+ return this->ptr_->id (
+ ACE_ENV_SINGLE_ARG_PARAMETER
+ );
+}
+
+// TAO_IDL - Generated from
+// be\be_visitor_operation/tie_si.cpp:101
+
+template <class T> ACE_INLINE
+void POA_CORBA::ComponentIR::UsesDef_tie<T>::id (
+ const char * id
+ ACE_ENV_ARG_DECL
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ))
+{
+ this->ptr_->id (
+ id
+ ACE_ENV_ARG_PARAMETER
+ );
+}
+
+// TAO_IDL - Generated from
+// be\be_visitor_operation/tie_si.cpp:101
+
+template <class T> ACE_INLINE
+char * POA_CORBA::ComponentIR::UsesDef_tie<T>::name (
+ ACE_ENV_SINGLE_ARG_DECL
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ))
+{
+ return this->ptr_->name (
+ ACE_ENV_SINGLE_ARG_PARAMETER
+ );
+}
+
+// TAO_IDL - Generated from
+// be\be_visitor_operation/tie_si.cpp:101
+
+template <class T> ACE_INLINE
+void POA_CORBA::ComponentIR::UsesDef_tie<T>::name (
+ const char * name
+ ACE_ENV_ARG_DECL
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ))
+{
+ this->ptr_->name (
+ name
+ ACE_ENV_ARG_PARAMETER
+ );
+}
+
+// TAO_IDL - Generated from
+// be\be_visitor_operation/tie_si.cpp:101
+
+template <class T> ACE_INLINE
+char * POA_CORBA::ComponentIR::UsesDef_tie<T>::version (
+ ACE_ENV_SINGLE_ARG_DECL
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ))
+{
+ return this->ptr_->version (
+ ACE_ENV_SINGLE_ARG_PARAMETER
+ );
+}
+
+// TAO_IDL - Generated from
+// be\be_visitor_operation/tie_si.cpp:101
+
+template <class T> ACE_INLINE
+void POA_CORBA::ComponentIR::UsesDef_tie<T>::version (
+ const char * version
+ ACE_ENV_ARG_DECL
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ))
+{
+ this->ptr_->version (
+ version
+ ACE_ENV_ARG_PARAMETER
+ );
+}
+
+// TAO_IDL - Generated from
+// be\be_visitor_operation/tie_si.cpp:101
+
+template <class T> ACE_INLINE
+::CORBA::Container_ptr POA_CORBA::ComponentIR::UsesDef_tie<T>::defined_in (
+ ACE_ENV_SINGLE_ARG_DECL
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ))
+{
+ return this->ptr_->defined_in (
+ ACE_ENV_SINGLE_ARG_PARAMETER
+ );
+}
+
+// TAO_IDL - Generated from
+// be\be_visitor_operation/tie_si.cpp:101
+
+template <class T> ACE_INLINE
+char * POA_CORBA::ComponentIR::UsesDef_tie<T>::absolute_name (
+ ACE_ENV_SINGLE_ARG_DECL
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ))
+{
+ return this->ptr_->absolute_name (
+ ACE_ENV_SINGLE_ARG_PARAMETER
+ );
+}
+
+// TAO_IDL - Generated from
+// be\be_visitor_operation/tie_si.cpp:101
+
+template <class T> ACE_INLINE
+::CORBA::Repository_ptr POA_CORBA::ComponentIR::UsesDef_tie<T>::containing_repository (
+ ACE_ENV_SINGLE_ARG_DECL
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ))
+{
+ return this->ptr_->containing_repository (
+ ACE_ENV_SINGLE_ARG_PARAMETER
+ );
+}
+
+// TAO_IDL - Generated from
+// be\be_visitor_operation/tie_si.cpp:101
+
+template <class T> ACE_INLINE
+::CORBA::Contained::Description * POA_CORBA::ComponentIR::UsesDef_tie<T>::describe (
+ ACE_ENV_SINGLE_ARG_DECL
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ))
+{
+ return this->ptr_->describe (
+ ACE_ENV_SINGLE_ARG_PARAMETER
+ );
+}
+
+// TAO_IDL - Generated from
+// be\be_visitor_operation/tie_si.cpp:101
+
+template <class T> ACE_INLINE
+void POA_CORBA::ComponentIR::UsesDef_tie<T>::move (
+ ::CORBA::Container_ptr new_container,
+ const char * new_name,
+ const char * new_version
+ ACE_ENV_ARG_DECL
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ))
+{
+ this->ptr_->move (
+ new_container,
+ new_name,
+ new_version
+ ACE_ENV_ARG_PARAMETER
+ );
+}
+
+// TAO_IDL - Generated from
+// be\be_visitor_operation/tie_si.cpp:101
+
+template <class T> ACE_INLINE
+::CORBA::InterfaceDef_ptr POA_CORBA::ComponentIR::UsesDef_tie<T>::interface_type (
+ ACE_ENV_SINGLE_ARG_DECL
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ))
+{
+ return this->ptr_->interface_type (
+ ACE_ENV_SINGLE_ARG_PARAMETER
+ );
+}
+
+// TAO_IDL - Generated from
+// be\be_visitor_operation/tie_si.cpp:101
+
+template <class T> ACE_INLINE
+void POA_CORBA::ComponentIR::UsesDef_tie<T>::interface_type (
+ ::CORBA::InterfaceDef_ptr interface_type
+ ACE_ENV_ARG_DECL
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ))
+{
+ this->ptr_->interface_type (
+ interface_type
+ ACE_ENV_ARG_PARAMETER
+ );
+}
+
+// TAO_IDL - Generated from
+// be\be_visitor_operation/tie_si.cpp:101
+
+template <class T> ACE_INLINE
+::CORBA::Boolean POA_CORBA::ComponentIR::UsesDef_tie<T>::is_multiple (
+ ACE_ENV_SINGLE_ARG_DECL
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ))
+{
+ return this->ptr_->is_multiple (
+ ACE_ENV_SINGLE_ARG_PARAMETER
+ );
+}
+
+// TAO_IDL - Generated from
+// be\be_visitor_operation/tie_si.cpp:101
+
+template <class T> ACE_INLINE
+void POA_CORBA::ComponentIR::UsesDef_tie<T>::is_multiple (
+ ::CORBA::Boolean is_multiple
+ ACE_ENV_ARG_DECL
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ))
+{
+ this->ptr_->is_multiple (
+ is_multiple
+ ACE_ENV_ARG_PARAMETER
+ );
+}
+
+// TAO_IDL - Generated from
+// be\be_visitor_interface/tie_si.cpp:96
+
+template <class T> ACE_INLINE
+POA_CORBA::ComponentIR::EventPortDef_tie<T>::EventPortDef_tie (T &t)
+ : ptr_ (&t),
+ poa_ (PortableServer::POA::_nil ()),
+ rel_ (0)
+{}
+
+template <class T> ACE_INLINE
+POA_CORBA::ComponentIR::EventPortDef_tie<T>::EventPortDef_tie (T &t, PortableServer::POA_ptr poa)
+ : ptr_ (&t),
+ poa_ (PortableServer::POA::_duplicate (poa)),
+ rel_ (0)
+{}
+
+template <class T> ACE_INLINE
+POA_CORBA::ComponentIR::EventPortDef_tie<T>::EventPortDef_tie (T *tp, ::CORBA::Boolean release)
+ : ptr_ (tp),
+ poa_ (PortableServer::POA::_nil ()),
+ rel_ (release)
+{}
+
+template <class T> ACE_INLINE
+POA_CORBA::ComponentIR::EventPortDef_tie<T>::EventPortDef_tie (T *tp, PortableServer::POA_ptr poa, ::CORBA::Boolean release)
+ : ptr_ (tp),
+ poa_ (PortableServer::POA::_duplicate (poa)),
+ rel_ (release)
+{}
+
+template <class T> ACE_INLINE
+POA_CORBA::ComponentIR::EventPortDef_tie<T>::~EventPortDef_tie (void)
+{
+ if (this->rel_)
+ {
+ delete this->ptr_;
+ }
+}
+
+template <class T> ACE_INLINE T *
+POA_CORBA::ComponentIR::EventPortDef_tie<T>::_tied_object (void)
+{
+ return this->ptr_;
+}
+
+template <class T> ACE_INLINE void
+POA_CORBA::ComponentIR::EventPortDef_tie<T>::_tied_object (T &obj)
+{
+ if (this->rel_)
+ {
+ delete this->ptr_;
+ }
+
+ this->ptr_ = &obj;
+ this->rel_ = 0;
+}
+
+template <class T> ACE_INLINE void
+POA_CORBA::ComponentIR::EventPortDef_tie<T>::_tied_object (T *obj, ::CORBA::Boolean release)
+{
+ if (this->rel_)
+ {
+ delete this->ptr_;
+ }
+
+ this->ptr_ = obj;
+ this->rel_ = release;
+}
+
+template <class T> ACE_INLINE ::CORBA::Boolean
+POA_CORBA::ComponentIR::EventPortDef_tie<T>::_is_owner (void)
+{
+ return this->rel_;
+}
+
+template <class T> ACE_INLINE void
+POA_CORBA::ComponentIR::EventPortDef_tie<T>::_is_owner ( ::CORBA::Boolean b)
+{
+ this->rel_ = b;
+}
+
+template <class T> ACE_INLINE PortableServer::POA_ptr
+POA_CORBA::ComponentIR::EventPortDef_tie<T>::_default_POA (ACE_ENV_SINGLE_ARG_DECL)
+{
+ if (! ::CORBA::is_nil (this->poa_.in ()))
+ {
+ return PortableServer::POA::_duplicate (this->poa_.in ());
+ }
+
+ return this->EventPortDef::_default_POA (ACE_ENV_SINGLE_ARG_PARAMETER);
+}
+
+// TAO_IDL - Generated from
+// be\be_visitor_operation/tie_si.cpp:101
+
+template <class T> ACE_INLINE
+::CORBA::DefinitionKind POA_CORBA::ComponentIR::EventPortDef_tie<T>::def_kind (
+ ACE_ENV_SINGLE_ARG_DECL
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ))
+{
+ return this->ptr_->def_kind (
+ ACE_ENV_SINGLE_ARG_PARAMETER
+ );
+}
+
+// TAO_IDL - Generated from
+// be\be_visitor_operation/tie_si.cpp:101
+
+template <class T> ACE_INLINE
+void POA_CORBA::ComponentIR::EventPortDef_tie<T>::destroy (
+ ACE_ENV_SINGLE_ARG_DECL
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ))
+{
+ this->ptr_->destroy (
+ ACE_ENV_SINGLE_ARG_PARAMETER
+ );
+}
+
+// TAO_IDL - Generated from
+// be\be_visitor_operation/tie_si.cpp:101
+
+template <class T> ACE_INLINE
+char * POA_CORBA::ComponentIR::EventPortDef_tie<T>::id (
+ ACE_ENV_SINGLE_ARG_DECL
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ))
+{
+ return this->ptr_->id (
+ ACE_ENV_SINGLE_ARG_PARAMETER
+ );
+}
+
+// TAO_IDL - Generated from
+// be\be_visitor_operation/tie_si.cpp:101
+
+template <class T> ACE_INLINE
+void POA_CORBA::ComponentIR::EventPortDef_tie<T>::id (
+ const char * id
+ ACE_ENV_ARG_DECL
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ))
+{
+ this->ptr_->id (
+ id
+ ACE_ENV_ARG_PARAMETER
+ );
+}
+
+// TAO_IDL - Generated from
+// be\be_visitor_operation/tie_si.cpp:101
+
+template <class T> ACE_INLINE
+char * POA_CORBA::ComponentIR::EventPortDef_tie<T>::name (
+ ACE_ENV_SINGLE_ARG_DECL
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ))
+{
+ return this->ptr_->name (
+ ACE_ENV_SINGLE_ARG_PARAMETER
+ );
+}
+
+// TAO_IDL - Generated from
+// be\be_visitor_operation/tie_si.cpp:101
+
+template <class T> ACE_INLINE
+void POA_CORBA::ComponentIR::EventPortDef_tie<T>::name (
+ const char * name
+ ACE_ENV_ARG_DECL
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ))
+{
+ this->ptr_->name (
+ name
+ ACE_ENV_ARG_PARAMETER
+ );
+}
+
+// TAO_IDL - Generated from
+// be\be_visitor_operation/tie_si.cpp:101
+
+template <class T> ACE_INLINE
+char * POA_CORBA::ComponentIR::EventPortDef_tie<T>::version (
+ ACE_ENV_SINGLE_ARG_DECL
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ))
+{
+ return this->ptr_->version (
+ ACE_ENV_SINGLE_ARG_PARAMETER
+ );
+}
+
+// TAO_IDL - Generated from
+// be\be_visitor_operation/tie_si.cpp:101
+
+template <class T> ACE_INLINE
+void POA_CORBA::ComponentIR::EventPortDef_tie<T>::version (
+ const char * version
+ ACE_ENV_ARG_DECL
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ))
+{
+ this->ptr_->version (
+ version
+ ACE_ENV_ARG_PARAMETER
+ );
+}
+
+// TAO_IDL - Generated from
+// be\be_visitor_operation/tie_si.cpp:101
+
+template <class T> ACE_INLINE
+::CORBA::Container_ptr POA_CORBA::ComponentIR::EventPortDef_tie<T>::defined_in (
+ ACE_ENV_SINGLE_ARG_DECL
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ))
+{
+ return this->ptr_->defined_in (
+ ACE_ENV_SINGLE_ARG_PARAMETER
+ );
+}
+
+// TAO_IDL - Generated from
+// be\be_visitor_operation/tie_si.cpp:101
+
+template <class T> ACE_INLINE
+char * POA_CORBA::ComponentIR::EventPortDef_tie<T>::absolute_name (
+ ACE_ENV_SINGLE_ARG_DECL
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ))
+{
+ return this->ptr_->absolute_name (
+ ACE_ENV_SINGLE_ARG_PARAMETER
+ );
+}
+
+// TAO_IDL - Generated from
+// be\be_visitor_operation/tie_si.cpp:101
+
+template <class T> ACE_INLINE
+::CORBA::Repository_ptr POA_CORBA::ComponentIR::EventPortDef_tie<T>::containing_repository (
+ ACE_ENV_SINGLE_ARG_DECL
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ))
+{
+ return this->ptr_->containing_repository (
+ ACE_ENV_SINGLE_ARG_PARAMETER
+ );
+}
+
+// TAO_IDL - Generated from
+// be\be_visitor_operation/tie_si.cpp:101
+
+template <class T> ACE_INLINE
+::CORBA::Contained::Description * POA_CORBA::ComponentIR::EventPortDef_tie<T>::describe (
+ ACE_ENV_SINGLE_ARG_DECL
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ))
+{
+ return this->ptr_->describe (
+ ACE_ENV_SINGLE_ARG_PARAMETER
+ );
+}
+
+// TAO_IDL - Generated from
+// be\be_visitor_operation/tie_si.cpp:101
+
+template <class T> ACE_INLINE
+void POA_CORBA::ComponentIR::EventPortDef_tie<T>::move (
+ ::CORBA::Container_ptr new_container,
+ const char * new_name,
+ const char * new_version
+ ACE_ENV_ARG_DECL
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ))
+{
+ this->ptr_->move (
+ new_container,
+ new_name,
+ new_version
+ ACE_ENV_ARG_PARAMETER
+ );
+}
+
+// TAO_IDL - Generated from
+// be\be_visitor_operation/tie_si.cpp:101
+
+template <class T> ACE_INLINE
+::CORBA::ComponentIR::EventDef_ptr POA_CORBA::ComponentIR::EventPortDef_tie<T>::event (
+ ACE_ENV_SINGLE_ARG_DECL
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ))
+{
+ return this->ptr_->event (
+ ACE_ENV_SINGLE_ARG_PARAMETER
+ );
+}
+
+// TAO_IDL - Generated from
+// be\be_visitor_operation/tie_si.cpp:101
+
+template <class T> ACE_INLINE
+void POA_CORBA::ComponentIR::EventPortDef_tie<T>::event (
+ ::CORBA::ComponentIR::EventDef_ptr event
+ ACE_ENV_ARG_DECL
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ))
+{
+ this->ptr_->event (
+ event
+ ACE_ENV_ARG_PARAMETER
+ );
+}
+
+// TAO_IDL - Generated from
+// be\be_visitor_operation/tie_si.cpp:101
+
+template <class T> ACE_INLINE
+::CORBA::Boolean POA_CORBA::ComponentIR::EventPortDef_tie<T>::is_a (
+ const char * event_id
+ ACE_ENV_ARG_DECL
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ))
+{
+ return this->ptr_->is_a (
+ event_id
+ ACE_ENV_ARG_PARAMETER
+ );
+}
+
+// TAO_IDL - Generated from
+// be\be_visitor_interface/tie_si.cpp:96
+
+template <class T> ACE_INLINE
+POA_CORBA::ComponentIR::EmitsDef_tie<T>::EmitsDef_tie (T &t)
+ : ptr_ (&t),
+ poa_ (PortableServer::POA::_nil ()),
+ rel_ (0)
+{}
+
+template <class T> ACE_INLINE
+POA_CORBA::ComponentIR::EmitsDef_tie<T>::EmitsDef_tie (T &t, PortableServer::POA_ptr poa)
+ : ptr_ (&t),
+ poa_ (PortableServer::POA::_duplicate (poa)),
+ rel_ (0)
+{}
+
+template <class T> ACE_INLINE
+POA_CORBA::ComponentIR::EmitsDef_tie<T>::EmitsDef_tie (T *tp, ::CORBA::Boolean release)
+ : ptr_ (tp),
+ poa_ (PortableServer::POA::_nil ()),
+ rel_ (release)
+{}
+
+template <class T> ACE_INLINE
+POA_CORBA::ComponentIR::EmitsDef_tie<T>::EmitsDef_tie (T *tp, PortableServer::POA_ptr poa, ::CORBA::Boolean release)
+ : ptr_ (tp),
+ poa_ (PortableServer::POA::_duplicate (poa)),
+ rel_ (release)
+{}
+
+template <class T> ACE_INLINE
+POA_CORBA::ComponentIR::EmitsDef_tie<T>::~EmitsDef_tie (void)
+{
+ if (this->rel_)
+ {
+ delete this->ptr_;
+ }
+}
+
+template <class T> ACE_INLINE T *
+POA_CORBA::ComponentIR::EmitsDef_tie<T>::_tied_object (void)
+{
+ return this->ptr_;
+}
+
+template <class T> ACE_INLINE void
+POA_CORBA::ComponentIR::EmitsDef_tie<T>::_tied_object (T &obj)
+{
+ if (this->rel_)
+ {
+ delete this->ptr_;
+ }
+
+ this->ptr_ = &obj;
+ this->rel_ = 0;
+}
+
+template <class T> ACE_INLINE void
+POA_CORBA::ComponentIR::EmitsDef_tie<T>::_tied_object (T *obj, ::CORBA::Boolean release)
+{
+ if (this->rel_)
+ {
+ delete this->ptr_;
+ }
+
+ this->ptr_ = obj;
+ this->rel_ = release;
+}
+
+template <class T> ACE_INLINE ::CORBA::Boolean
+POA_CORBA::ComponentIR::EmitsDef_tie<T>::_is_owner (void)
+{
+ return this->rel_;
+}
+
+template <class T> ACE_INLINE void
+POA_CORBA::ComponentIR::EmitsDef_tie<T>::_is_owner ( ::CORBA::Boolean b)
+{
+ this->rel_ = b;
+}
+
+template <class T> ACE_INLINE PortableServer::POA_ptr
+POA_CORBA::ComponentIR::EmitsDef_tie<T>::_default_POA (ACE_ENV_SINGLE_ARG_DECL)
+{
+ if (! ::CORBA::is_nil (this->poa_.in ()))
+ {
+ return PortableServer::POA::_duplicate (this->poa_.in ());
+ }
+
+ return this->EmitsDef::_default_POA (ACE_ENV_SINGLE_ARG_PARAMETER);
+}
+
+// TAO_IDL - Generated from
+// be\be_visitor_operation/tie_si.cpp:101
+
+template <class T> ACE_INLINE
+::CORBA::DefinitionKind POA_CORBA::ComponentIR::EmitsDef_tie<T>::def_kind (
+ ACE_ENV_SINGLE_ARG_DECL
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ))
+{
+ return this->ptr_->def_kind (
+ ACE_ENV_SINGLE_ARG_PARAMETER
+ );
+}
+
+// TAO_IDL - Generated from
+// be\be_visitor_operation/tie_si.cpp:101
+
+template <class T> ACE_INLINE
+void POA_CORBA::ComponentIR::EmitsDef_tie<T>::destroy (
+ ACE_ENV_SINGLE_ARG_DECL
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ))
+{
+ this->ptr_->destroy (
+ ACE_ENV_SINGLE_ARG_PARAMETER
+ );
+}
+
+// TAO_IDL - Generated from
+// be\be_visitor_operation/tie_si.cpp:101
+
+template <class T> ACE_INLINE
+char * POA_CORBA::ComponentIR::EmitsDef_tie<T>::id (
+ ACE_ENV_SINGLE_ARG_DECL
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ))
+{
+ return this->ptr_->id (
+ ACE_ENV_SINGLE_ARG_PARAMETER
+ );
+}
+
+// TAO_IDL - Generated from
+// be\be_visitor_operation/tie_si.cpp:101
+
+template <class T> ACE_INLINE
+void POA_CORBA::ComponentIR::EmitsDef_tie<T>::id (
+ const char * id
+ ACE_ENV_ARG_DECL
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ))
+{
+ this->ptr_->id (
+ id
+ ACE_ENV_ARG_PARAMETER
+ );
+}
+
+// TAO_IDL - Generated from
+// be\be_visitor_operation/tie_si.cpp:101
+
+template <class T> ACE_INLINE
+char * POA_CORBA::ComponentIR::EmitsDef_tie<T>::name (
+ ACE_ENV_SINGLE_ARG_DECL
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ))
+{
+ return this->ptr_->name (
+ ACE_ENV_SINGLE_ARG_PARAMETER
+ );
+}
+
+// TAO_IDL - Generated from
+// be\be_visitor_operation/tie_si.cpp:101
+
+template <class T> ACE_INLINE
+void POA_CORBA::ComponentIR::EmitsDef_tie<T>::name (
+ const char * name
+ ACE_ENV_ARG_DECL
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ))
+{
+ this->ptr_->name (
+ name
+ ACE_ENV_ARG_PARAMETER
+ );
+}
+
+// TAO_IDL - Generated from
+// be\be_visitor_operation/tie_si.cpp:101
+
+template <class T> ACE_INLINE
+char * POA_CORBA::ComponentIR::EmitsDef_tie<T>::version (
+ ACE_ENV_SINGLE_ARG_DECL
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ))
+{
+ return this->ptr_->version (
+ ACE_ENV_SINGLE_ARG_PARAMETER
+ );
+}
+
+// TAO_IDL - Generated from
+// be\be_visitor_operation/tie_si.cpp:101
+
+template <class T> ACE_INLINE
+void POA_CORBA::ComponentIR::EmitsDef_tie<T>::version (
+ const char * version
+ ACE_ENV_ARG_DECL
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ))
+{
+ this->ptr_->version (
+ version
+ ACE_ENV_ARG_PARAMETER
+ );
+}
+
+// TAO_IDL - Generated from
+// be\be_visitor_operation/tie_si.cpp:101
+
+template <class T> ACE_INLINE
+::CORBA::Container_ptr POA_CORBA::ComponentIR::EmitsDef_tie<T>::defined_in (
+ ACE_ENV_SINGLE_ARG_DECL
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ))
+{
+ return this->ptr_->defined_in (
+ ACE_ENV_SINGLE_ARG_PARAMETER
+ );
+}
+
+// TAO_IDL - Generated from
+// be\be_visitor_operation/tie_si.cpp:101
+
+template <class T> ACE_INLINE
+char * POA_CORBA::ComponentIR::EmitsDef_tie<T>::absolute_name (
+ ACE_ENV_SINGLE_ARG_DECL
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ))
+{
+ return this->ptr_->absolute_name (
+ ACE_ENV_SINGLE_ARG_PARAMETER
+ );
+}
+
+// TAO_IDL - Generated from
+// be\be_visitor_operation/tie_si.cpp:101
+
+template <class T> ACE_INLINE
+::CORBA::Repository_ptr POA_CORBA::ComponentIR::EmitsDef_tie<T>::containing_repository (
+ ACE_ENV_SINGLE_ARG_DECL
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ))
+{
+ return this->ptr_->containing_repository (
+ ACE_ENV_SINGLE_ARG_PARAMETER
+ );
+}
+
+// TAO_IDL - Generated from
+// be\be_visitor_operation/tie_si.cpp:101
+
+template <class T> ACE_INLINE
+::CORBA::Contained::Description * POA_CORBA::ComponentIR::EmitsDef_tie<T>::describe (
+ ACE_ENV_SINGLE_ARG_DECL
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ))
+{
+ return this->ptr_->describe (
+ ACE_ENV_SINGLE_ARG_PARAMETER
+ );
+}
+
+// TAO_IDL - Generated from
+// be\be_visitor_operation/tie_si.cpp:101
+
+template <class T> ACE_INLINE
+void POA_CORBA::ComponentIR::EmitsDef_tie<T>::move (
+ ::CORBA::Container_ptr new_container,
+ const char * new_name,
+ const char * new_version
+ ACE_ENV_ARG_DECL
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ))
+{
+ this->ptr_->move (
+ new_container,
+ new_name,
+ new_version
+ ACE_ENV_ARG_PARAMETER
+ );
+}
+
+// TAO_IDL - Generated from
+// be\be_visitor_operation/tie_si.cpp:101
+
+template <class T> ACE_INLINE
+::CORBA::ComponentIR::EventDef_ptr POA_CORBA::ComponentIR::EmitsDef_tie<T>::event (
+ ACE_ENV_SINGLE_ARG_DECL
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ))
+{
+ return this->ptr_->event (
+ ACE_ENV_SINGLE_ARG_PARAMETER
+ );
+}
+
+// TAO_IDL - Generated from
+// be\be_visitor_operation/tie_si.cpp:101
+
+template <class T> ACE_INLINE
+void POA_CORBA::ComponentIR::EmitsDef_tie<T>::event (
+ ::CORBA::ComponentIR::EventDef_ptr event
+ ACE_ENV_ARG_DECL
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ))
+{
+ this->ptr_->event (
+ event
+ ACE_ENV_ARG_PARAMETER
+ );
+}
+
+// TAO_IDL - Generated from
+// be\be_visitor_operation/tie_si.cpp:101
+
+template <class T> ACE_INLINE
+::CORBA::Boolean POA_CORBA::ComponentIR::EmitsDef_tie<T>::is_a (
+ const char * event_id
+ ACE_ENV_ARG_DECL
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ))
+{
+ return this->ptr_->is_a (
+ event_id
+ ACE_ENV_ARG_PARAMETER
+ );
+}
+
+// TAO_IDL - Generated from
+// be\be_visitor_interface/tie_si.cpp:96
+
+template <class T> ACE_INLINE
+POA_CORBA::ComponentIR::PublishesDef_tie<T>::PublishesDef_tie (T &t)
+ : ptr_ (&t),
+ poa_ (PortableServer::POA::_nil ()),
+ rel_ (0)
+{}
+
+template <class T> ACE_INLINE
+POA_CORBA::ComponentIR::PublishesDef_tie<T>::PublishesDef_tie (T &t, PortableServer::POA_ptr poa)
+ : ptr_ (&t),
+ poa_ (PortableServer::POA::_duplicate (poa)),
+ rel_ (0)
+{}
+
+template <class T> ACE_INLINE
+POA_CORBA::ComponentIR::PublishesDef_tie<T>::PublishesDef_tie (T *tp, ::CORBA::Boolean release)
+ : ptr_ (tp),
+ poa_ (PortableServer::POA::_nil ()),
+ rel_ (release)
+{}
+
+template <class T> ACE_INLINE
+POA_CORBA::ComponentIR::PublishesDef_tie<T>::PublishesDef_tie (T *tp, PortableServer::POA_ptr poa, ::CORBA::Boolean release)
+ : ptr_ (tp),
+ poa_ (PortableServer::POA::_duplicate (poa)),
+ rel_ (release)
+{}
+
+template <class T> ACE_INLINE
+POA_CORBA::ComponentIR::PublishesDef_tie<T>::~PublishesDef_tie (void)
+{
+ if (this->rel_)
+ {
+ delete this->ptr_;
+ }
+}
+
+template <class T> ACE_INLINE T *
+POA_CORBA::ComponentIR::PublishesDef_tie<T>::_tied_object (void)
+{
+ return this->ptr_;
+}
+
+template <class T> ACE_INLINE void
+POA_CORBA::ComponentIR::PublishesDef_tie<T>::_tied_object (T &obj)
+{
+ if (this->rel_)
+ {
+ delete this->ptr_;
+ }
+
+ this->ptr_ = &obj;
+ this->rel_ = 0;
+}
+
+template <class T> ACE_INLINE void
+POA_CORBA::ComponentIR::PublishesDef_tie<T>::_tied_object (T *obj, ::CORBA::Boolean release)
+{
+ if (this->rel_)
+ {
+ delete this->ptr_;
+ }
+
+ this->ptr_ = obj;
+ this->rel_ = release;
+}
+
+template <class T> ACE_INLINE ::CORBA::Boolean
+POA_CORBA::ComponentIR::PublishesDef_tie<T>::_is_owner (void)
+{
+ return this->rel_;
+}
+
+template <class T> ACE_INLINE void
+POA_CORBA::ComponentIR::PublishesDef_tie<T>::_is_owner ( ::CORBA::Boolean b)
+{
+ this->rel_ = b;
+}
+
+template <class T> ACE_INLINE PortableServer::POA_ptr
+POA_CORBA::ComponentIR::PublishesDef_tie<T>::_default_POA (ACE_ENV_SINGLE_ARG_DECL)
+{
+ if (! ::CORBA::is_nil (this->poa_.in ()))
+ {
+ return PortableServer::POA::_duplicate (this->poa_.in ());
+ }
+
+ return this->PublishesDef::_default_POA (ACE_ENV_SINGLE_ARG_PARAMETER);
+}
+
+// TAO_IDL - Generated from
+// be\be_visitor_operation/tie_si.cpp:101
+
+template <class T> ACE_INLINE
+::CORBA::DefinitionKind POA_CORBA::ComponentIR::PublishesDef_tie<T>::def_kind (
+ ACE_ENV_SINGLE_ARG_DECL
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ))
+{
+ return this->ptr_->def_kind (
+ ACE_ENV_SINGLE_ARG_PARAMETER
+ );
+}
+
+// TAO_IDL - Generated from
+// be\be_visitor_operation/tie_si.cpp:101
+
+template <class T> ACE_INLINE
+void POA_CORBA::ComponentIR::PublishesDef_tie<T>::destroy (
+ ACE_ENV_SINGLE_ARG_DECL
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ))
+{
+ this->ptr_->destroy (
+ ACE_ENV_SINGLE_ARG_PARAMETER
+ );
+}
+
+// TAO_IDL - Generated from
+// be\be_visitor_operation/tie_si.cpp:101
+
+template <class T> ACE_INLINE
+char * POA_CORBA::ComponentIR::PublishesDef_tie<T>::id (
+ ACE_ENV_SINGLE_ARG_DECL
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ))
+{
+ return this->ptr_->id (
+ ACE_ENV_SINGLE_ARG_PARAMETER
+ );
+}
+
+// TAO_IDL - Generated from
+// be\be_visitor_operation/tie_si.cpp:101
+
+template <class T> ACE_INLINE
+void POA_CORBA::ComponentIR::PublishesDef_tie<T>::id (
+ const char * id
+ ACE_ENV_ARG_DECL
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ))
+{
+ this->ptr_->id (
+ id
+ ACE_ENV_ARG_PARAMETER
+ );
+}
+
+// TAO_IDL - Generated from
+// be\be_visitor_operation/tie_si.cpp:101
+
+template <class T> ACE_INLINE
+char * POA_CORBA::ComponentIR::PublishesDef_tie<T>::name (
+ ACE_ENV_SINGLE_ARG_DECL
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ))
+{
+ return this->ptr_->name (
+ ACE_ENV_SINGLE_ARG_PARAMETER
+ );
+}
+
+// TAO_IDL - Generated from
+// be\be_visitor_operation/tie_si.cpp:101
+
+template <class T> ACE_INLINE
+void POA_CORBA::ComponentIR::PublishesDef_tie<T>::name (
+ const char * name
+ ACE_ENV_ARG_DECL
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ))
+{
+ this->ptr_->name (
+ name
+ ACE_ENV_ARG_PARAMETER
+ );
+}
+
+// TAO_IDL - Generated from
+// be\be_visitor_operation/tie_si.cpp:101
+
+template <class T> ACE_INLINE
+char * POA_CORBA::ComponentIR::PublishesDef_tie<T>::version (
+ ACE_ENV_SINGLE_ARG_DECL
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ))
+{
+ return this->ptr_->version (
+ ACE_ENV_SINGLE_ARG_PARAMETER
+ );
+}
+
+// TAO_IDL - Generated from
+// be\be_visitor_operation/tie_si.cpp:101
+
+template <class T> ACE_INLINE
+void POA_CORBA::ComponentIR::PublishesDef_tie<T>::version (
+ const char * version
+ ACE_ENV_ARG_DECL
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ))
+{
+ this->ptr_->version (
+ version
+ ACE_ENV_ARG_PARAMETER
+ );
+}
+
+// TAO_IDL - Generated from
+// be\be_visitor_operation/tie_si.cpp:101
+
+template <class T> ACE_INLINE
+::CORBA::Container_ptr POA_CORBA::ComponentIR::PublishesDef_tie<T>::defined_in (
+ ACE_ENV_SINGLE_ARG_DECL
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ))
+{
+ return this->ptr_->defined_in (
+ ACE_ENV_SINGLE_ARG_PARAMETER
+ );
+}
+
+// TAO_IDL - Generated from
+// be\be_visitor_operation/tie_si.cpp:101
+
+template <class T> ACE_INLINE
+char * POA_CORBA::ComponentIR::PublishesDef_tie<T>::absolute_name (
+ ACE_ENV_SINGLE_ARG_DECL
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ))
+{
+ return this->ptr_->absolute_name (
+ ACE_ENV_SINGLE_ARG_PARAMETER
+ );
+}
+
+// TAO_IDL - Generated from
+// be\be_visitor_operation/tie_si.cpp:101
+
+template <class T> ACE_INLINE
+::CORBA::Repository_ptr POA_CORBA::ComponentIR::PublishesDef_tie<T>::containing_repository (
+ ACE_ENV_SINGLE_ARG_DECL
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ))
+{
+ return this->ptr_->containing_repository (
+ ACE_ENV_SINGLE_ARG_PARAMETER
+ );
+}
+
+// TAO_IDL - Generated from
+// be\be_visitor_operation/tie_si.cpp:101
+
+template <class T> ACE_INLINE
+::CORBA::Contained::Description * POA_CORBA::ComponentIR::PublishesDef_tie<T>::describe (
+ ACE_ENV_SINGLE_ARG_DECL
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ))
+{
+ return this->ptr_->describe (
+ ACE_ENV_SINGLE_ARG_PARAMETER
+ );
+}
+
+// TAO_IDL - Generated from
+// be\be_visitor_operation/tie_si.cpp:101
+
+template <class T> ACE_INLINE
+void POA_CORBA::ComponentIR::PublishesDef_tie<T>::move (
+ ::CORBA::Container_ptr new_container,
+ const char * new_name,
+ const char * new_version
+ ACE_ENV_ARG_DECL
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ))
+{
+ this->ptr_->move (
+ new_container,
+ new_name,
+ new_version
+ ACE_ENV_ARG_PARAMETER
+ );
+}
+
+// TAO_IDL - Generated from
+// be\be_visitor_operation/tie_si.cpp:101
+
+template <class T> ACE_INLINE
+::CORBA::ComponentIR::EventDef_ptr POA_CORBA::ComponentIR::PublishesDef_tie<T>::event (
+ ACE_ENV_SINGLE_ARG_DECL
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ))
+{
+ return this->ptr_->event (
+ ACE_ENV_SINGLE_ARG_PARAMETER
+ );
+}
+
+// TAO_IDL - Generated from
+// be\be_visitor_operation/tie_si.cpp:101
+
+template <class T> ACE_INLINE
+void POA_CORBA::ComponentIR::PublishesDef_tie<T>::event (
+ ::CORBA::ComponentIR::EventDef_ptr event
+ ACE_ENV_ARG_DECL
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ))
+{
+ this->ptr_->event (
+ event
+ ACE_ENV_ARG_PARAMETER
+ );
+}
+
+// TAO_IDL - Generated from
+// be\be_visitor_operation/tie_si.cpp:101
+
+template <class T> ACE_INLINE
+::CORBA::Boolean POA_CORBA::ComponentIR::PublishesDef_tie<T>::is_a (
+ const char * event_id
+ ACE_ENV_ARG_DECL
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ))
+{
+ return this->ptr_->is_a (
+ event_id
+ ACE_ENV_ARG_PARAMETER
+ );
+}
+
+// TAO_IDL - Generated from
+// be\be_visitor_interface/tie_si.cpp:96
+
+template <class T> ACE_INLINE
+POA_CORBA::ComponentIR::ConsumesDef_tie<T>::ConsumesDef_tie (T &t)
+ : ptr_ (&t),
+ poa_ (PortableServer::POA::_nil ()),
+ rel_ (0)
+{}
+
+template <class T> ACE_INLINE
+POA_CORBA::ComponentIR::ConsumesDef_tie<T>::ConsumesDef_tie (T &t, PortableServer::POA_ptr poa)
+ : ptr_ (&t),
+ poa_ (PortableServer::POA::_duplicate (poa)),
+ rel_ (0)
+{}
+
+template <class T> ACE_INLINE
+POA_CORBA::ComponentIR::ConsumesDef_tie<T>::ConsumesDef_tie (T *tp, ::CORBA::Boolean release)
+ : ptr_ (tp),
+ poa_ (PortableServer::POA::_nil ()),
+ rel_ (release)
+{}
+
+template <class T> ACE_INLINE
+POA_CORBA::ComponentIR::ConsumesDef_tie<T>::ConsumesDef_tie (T *tp, PortableServer::POA_ptr poa, ::CORBA::Boolean release)
+ : ptr_ (tp),
+ poa_ (PortableServer::POA::_duplicate (poa)),
+ rel_ (release)
+{}
+
+template <class T> ACE_INLINE
+POA_CORBA::ComponentIR::ConsumesDef_tie<T>::~ConsumesDef_tie (void)
+{
+ if (this->rel_)
+ {
+ delete this->ptr_;
+ }
+}
+
+template <class T> ACE_INLINE T *
+POA_CORBA::ComponentIR::ConsumesDef_tie<T>::_tied_object (void)
+{
+ return this->ptr_;
+}
+
+template <class T> ACE_INLINE void
+POA_CORBA::ComponentIR::ConsumesDef_tie<T>::_tied_object (T &obj)
+{
+ if (this->rel_)
+ {
+ delete this->ptr_;
+ }
+
+ this->ptr_ = &obj;
+ this->rel_ = 0;
+}
+
+template <class T> ACE_INLINE void
+POA_CORBA::ComponentIR::ConsumesDef_tie<T>::_tied_object (T *obj, ::CORBA::Boolean release)
+{
+ if (this->rel_)
+ {
+ delete this->ptr_;
+ }
+
+ this->ptr_ = obj;
+ this->rel_ = release;
+}
+
+template <class T> ACE_INLINE ::CORBA::Boolean
+POA_CORBA::ComponentIR::ConsumesDef_tie<T>::_is_owner (void)
+{
+ return this->rel_;
+}
+
+template <class T> ACE_INLINE void
+POA_CORBA::ComponentIR::ConsumesDef_tie<T>::_is_owner ( ::CORBA::Boolean b)
+{
+ this->rel_ = b;
+}
+
+template <class T> ACE_INLINE PortableServer::POA_ptr
+POA_CORBA::ComponentIR::ConsumesDef_tie<T>::_default_POA (ACE_ENV_SINGLE_ARG_DECL)
+{
+ if (! ::CORBA::is_nil (this->poa_.in ()))
+ {
+ return PortableServer::POA::_duplicate (this->poa_.in ());
+ }
+
+ return this->ConsumesDef::_default_POA (ACE_ENV_SINGLE_ARG_PARAMETER);
+}
+
+// TAO_IDL - Generated from
+// be\be_visitor_operation/tie_si.cpp:101
+
+template <class T> ACE_INLINE
+::CORBA::DefinitionKind POA_CORBA::ComponentIR::ConsumesDef_tie<T>::def_kind (
+ ACE_ENV_SINGLE_ARG_DECL
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ))
+{
+ return this->ptr_->def_kind (
+ ACE_ENV_SINGLE_ARG_PARAMETER
+ );
+}
+
+// TAO_IDL - Generated from
+// be\be_visitor_operation/tie_si.cpp:101
+
+template <class T> ACE_INLINE
+void POA_CORBA::ComponentIR::ConsumesDef_tie<T>::destroy (
+ ACE_ENV_SINGLE_ARG_DECL
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ))
+{
+ this->ptr_->destroy (
+ ACE_ENV_SINGLE_ARG_PARAMETER
+ );
+}
+
+// TAO_IDL - Generated from
+// be\be_visitor_operation/tie_si.cpp:101
+
+template <class T> ACE_INLINE
+char * POA_CORBA::ComponentIR::ConsumesDef_tie<T>::id (
+ ACE_ENV_SINGLE_ARG_DECL
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ))
+{
+ return this->ptr_->id (
+ ACE_ENV_SINGLE_ARG_PARAMETER
+ );
+}
+
+// TAO_IDL - Generated from
+// be\be_visitor_operation/tie_si.cpp:101
+
+template <class T> ACE_INLINE
+void POA_CORBA::ComponentIR::ConsumesDef_tie<T>::id (
+ const char * id
+ ACE_ENV_ARG_DECL
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ))
+{
+ this->ptr_->id (
+ id
+ ACE_ENV_ARG_PARAMETER
+ );
+}
+
+// TAO_IDL - Generated from
+// be\be_visitor_operation/tie_si.cpp:101
+
+template <class T> ACE_INLINE
+char * POA_CORBA::ComponentIR::ConsumesDef_tie<T>::name (
+ ACE_ENV_SINGLE_ARG_DECL
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ))
+{
+ return this->ptr_->name (
+ ACE_ENV_SINGLE_ARG_PARAMETER
+ );
+}
+
+// TAO_IDL - Generated from
+// be\be_visitor_operation/tie_si.cpp:101
+
+template <class T> ACE_INLINE
+void POA_CORBA::ComponentIR::ConsumesDef_tie<T>::name (
+ const char * name
+ ACE_ENV_ARG_DECL
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ))
+{
+ this->ptr_->name (
+ name
+ ACE_ENV_ARG_PARAMETER
+ );
+}
+
+// TAO_IDL - Generated from
+// be\be_visitor_operation/tie_si.cpp:101
+
+template <class T> ACE_INLINE
+char * POA_CORBA::ComponentIR::ConsumesDef_tie<T>::version (
+ ACE_ENV_SINGLE_ARG_DECL
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ))
+{
+ return this->ptr_->version (
+ ACE_ENV_SINGLE_ARG_PARAMETER
+ );
+}
+
+// TAO_IDL - Generated from
+// be\be_visitor_operation/tie_si.cpp:101
+
+template <class T> ACE_INLINE
+void POA_CORBA::ComponentIR::ConsumesDef_tie<T>::version (
+ const char * version
+ ACE_ENV_ARG_DECL
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ))
+{
+ this->ptr_->version (
+ version
+ ACE_ENV_ARG_PARAMETER
+ );
+}
+
+// TAO_IDL - Generated from
+// be\be_visitor_operation/tie_si.cpp:101
+
+template <class T> ACE_INLINE
+::CORBA::Container_ptr POA_CORBA::ComponentIR::ConsumesDef_tie<T>::defined_in (
+ ACE_ENV_SINGLE_ARG_DECL
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ))
+{
+ return this->ptr_->defined_in (
+ ACE_ENV_SINGLE_ARG_PARAMETER
+ );
+}
+
+// TAO_IDL - Generated from
+// be\be_visitor_operation/tie_si.cpp:101
+
+template <class T> ACE_INLINE
+char * POA_CORBA::ComponentIR::ConsumesDef_tie<T>::absolute_name (
+ ACE_ENV_SINGLE_ARG_DECL
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ))
+{
+ return this->ptr_->absolute_name (
+ ACE_ENV_SINGLE_ARG_PARAMETER
+ );
+}
+
+// TAO_IDL - Generated from
+// be\be_visitor_operation/tie_si.cpp:101
+
+template <class T> ACE_INLINE
+::CORBA::Repository_ptr POA_CORBA::ComponentIR::ConsumesDef_tie<T>::containing_repository (
+ ACE_ENV_SINGLE_ARG_DECL
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ))
+{
+ return this->ptr_->containing_repository (
+ ACE_ENV_SINGLE_ARG_PARAMETER
+ );
+}
+
+// TAO_IDL - Generated from
+// be\be_visitor_operation/tie_si.cpp:101
+
+template <class T> ACE_INLINE
+::CORBA::Contained::Description * POA_CORBA::ComponentIR::ConsumesDef_tie<T>::describe (
+ ACE_ENV_SINGLE_ARG_DECL
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ))
+{
+ return this->ptr_->describe (
+ ACE_ENV_SINGLE_ARG_PARAMETER
+ );
+}
+
+// TAO_IDL - Generated from
+// be\be_visitor_operation/tie_si.cpp:101
+
+template <class T> ACE_INLINE
+void POA_CORBA::ComponentIR::ConsumesDef_tie<T>::move (
+ ::CORBA::Container_ptr new_container,
+ const char * new_name,
+ const char * new_version
+ ACE_ENV_ARG_DECL
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ))
+{
+ this->ptr_->move (
+ new_container,
+ new_name,
+ new_version
+ ACE_ENV_ARG_PARAMETER
+ );
+}
+
+// TAO_IDL - Generated from
+// be\be_visitor_operation/tie_si.cpp:101
+
+template <class T> ACE_INLINE
+::CORBA::ComponentIR::EventDef_ptr POA_CORBA::ComponentIR::ConsumesDef_tie<T>::event (
+ ACE_ENV_SINGLE_ARG_DECL
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ))
+{
+ return this->ptr_->event (
+ ACE_ENV_SINGLE_ARG_PARAMETER
+ );
+}
+
+// TAO_IDL - Generated from
+// be\be_visitor_operation/tie_si.cpp:101
+
+template <class T> ACE_INLINE
+void POA_CORBA::ComponentIR::ConsumesDef_tie<T>::event (
+ ::CORBA::ComponentIR::EventDef_ptr event
+ ACE_ENV_ARG_DECL
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ))
+{
+ this->ptr_->event (
+ event
+ ACE_ENV_ARG_PARAMETER
+ );
+}
+
+// TAO_IDL - Generated from
+// be\be_visitor_operation/tie_si.cpp:101
+
+template <class T> ACE_INLINE
+::CORBA::Boolean POA_CORBA::ComponentIR::ConsumesDef_tie<T>::is_a (
+ const char * event_id
+ ACE_ENV_ARG_DECL
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ))
+{
+ return this->ptr_->is_a (
+ event_id
+ ACE_ENV_ARG_PARAMETER
+ );
+}
+
+// TAO_IDL - Generated from
+// be\be_visitor_interface/tie_si.cpp:96
+
+template <class T> ACE_INLINE
+POA_CORBA::ComponentIR::ComponentDef_tie<T>::ComponentDef_tie (T &t)
+ : ptr_ (&t),
+ poa_ (PortableServer::POA::_nil ()),
+ rel_ (0)
+{}
+
+template <class T> ACE_INLINE
+POA_CORBA::ComponentIR::ComponentDef_tie<T>::ComponentDef_tie (T &t, PortableServer::POA_ptr poa)
+ : ptr_ (&t),
+ poa_ (PortableServer::POA::_duplicate (poa)),
+ rel_ (0)
+{}
+
+template <class T> ACE_INLINE
+POA_CORBA::ComponentIR::ComponentDef_tie<T>::ComponentDef_tie (T *tp, ::CORBA::Boolean release)
+ : ptr_ (tp),
+ poa_ (PortableServer::POA::_nil ()),
+ rel_ (release)
+{}
+
+template <class T> ACE_INLINE
+POA_CORBA::ComponentIR::ComponentDef_tie<T>::ComponentDef_tie (T *tp, PortableServer::POA_ptr poa, ::CORBA::Boolean release)
+ : ptr_ (tp),
+ poa_ (PortableServer::POA::_duplicate (poa)),
+ rel_ (release)
+{}
+
+template <class T> ACE_INLINE
+POA_CORBA::ComponentIR::ComponentDef_tie<T>::~ComponentDef_tie (void)
+{
+ if (this->rel_)
+ {
+ delete this->ptr_;
+ }
+}
+
+template <class T> ACE_INLINE T *
+POA_CORBA::ComponentIR::ComponentDef_tie<T>::_tied_object (void)
+{
+ return this->ptr_;
+}
+
+template <class T> ACE_INLINE void
+POA_CORBA::ComponentIR::ComponentDef_tie<T>::_tied_object (T &obj)
+{
+ if (this->rel_)
+ {
+ delete this->ptr_;
+ }
+
+ this->ptr_ = &obj;
+ this->rel_ = 0;
+}
+
+template <class T> ACE_INLINE void
+POA_CORBA::ComponentIR::ComponentDef_tie<T>::_tied_object (T *obj, ::CORBA::Boolean release)
+{
+ if (this->rel_)
+ {
+ delete this->ptr_;
+ }
+
+ this->ptr_ = obj;
+ this->rel_ = release;
+}
+
+template <class T> ACE_INLINE ::CORBA::Boolean
+POA_CORBA::ComponentIR::ComponentDef_tie<T>::_is_owner (void)
+{
+ return this->rel_;
+}
+
+template <class T> ACE_INLINE void
+POA_CORBA::ComponentIR::ComponentDef_tie<T>::_is_owner ( ::CORBA::Boolean b)
+{
+ this->rel_ = b;
+}
+
+template <class T> ACE_INLINE PortableServer::POA_ptr
+POA_CORBA::ComponentIR::ComponentDef_tie<T>::_default_POA (ACE_ENV_SINGLE_ARG_DECL)
+{
+ if (! ::CORBA::is_nil (this->poa_.in ()))
+ {
+ return PortableServer::POA::_duplicate (this->poa_.in ());
+ }
+
+ return this->ComponentDef::_default_POA (ACE_ENV_SINGLE_ARG_PARAMETER);
+}
+
+// TAO_IDL - Generated from
+// be\be_visitor_operation/tie_si.cpp:101
+
+template <class T> ACE_INLINE
+::CORBA::DefinitionKind POA_CORBA::ComponentIR::ComponentDef_tie<T>::def_kind (
+ ACE_ENV_SINGLE_ARG_DECL
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ))
+{
+ return this->ptr_->def_kind (
+ ACE_ENV_SINGLE_ARG_PARAMETER
+ );
+}
+
+// TAO_IDL - Generated from
+// be\be_visitor_operation/tie_si.cpp:101
+
+template <class T> ACE_INLINE
+void POA_CORBA::ComponentIR::ComponentDef_tie<T>::destroy (
+ ACE_ENV_SINGLE_ARG_DECL
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ))
+{
+ this->ptr_->destroy (
+ ACE_ENV_SINGLE_ARG_PARAMETER
+ );
+}
+
+// TAO_IDL - Generated from
+// be\be_visitor_operation/tie_si.cpp:101
+
+template <class T> ACE_INLINE
+::CORBA::Contained_ptr POA_CORBA::ComponentIR::ComponentDef_tie<T>::lookup (
+ const char * search_name
+ ACE_ENV_ARG_DECL
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ))
+{
+ return this->ptr_->lookup (
+ search_name
+ ACE_ENV_ARG_PARAMETER
+ );
+}
+
+// TAO_IDL - Generated from
+// be\be_visitor_operation/tie_si.cpp:101
+
+template <class T> ACE_INLINE
+::CORBA::ContainedSeq * POA_CORBA::ComponentIR::ComponentDef_tie<T>::contents (
+ ::CORBA::DefinitionKind limit_type,
+ ::CORBA::Boolean exclude_inherited
+ ACE_ENV_ARG_DECL
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ))
+{
+ return this->ptr_->contents (
+ limit_type,
+ exclude_inherited
+ ACE_ENV_ARG_PARAMETER
+ );
+}
+
+// TAO_IDL - Generated from
+// be\be_visitor_operation/tie_si.cpp:101
+
+template <class T> ACE_INLINE
+::CORBA::ContainedSeq * POA_CORBA::ComponentIR::ComponentDef_tie<T>::lookup_name (
+ const char * search_name,
+ ::CORBA::Long levels_to_search,
+ ::CORBA::DefinitionKind limit_type,
+ ::CORBA::Boolean exclude_inherited
+ ACE_ENV_ARG_DECL
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ))
+{
+ return this->ptr_->lookup_name (
+ search_name,
+ levels_to_search,
+ limit_type,
+ exclude_inherited
+ ACE_ENV_ARG_PARAMETER
+ );
+}
+
+// TAO_IDL - Generated from
+// be\be_visitor_operation/tie_si.cpp:101
+
+template <class T> ACE_INLINE
+::CORBA::Container::DescriptionSeq * POA_CORBA::ComponentIR::ComponentDef_tie<T>::describe_contents (
+ ::CORBA::DefinitionKind limit_type,
+ ::CORBA::Boolean exclude_inherited,
+ ::CORBA::Long max_returned_objs
+ ACE_ENV_ARG_DECL
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ))
+{
+ return this->ptr_->describe_contents (
+ limit_type,
+ exclude_inherited,
+ max_returned_objs
+ ACE_ENV_ARG_PARAMETER
+ );
+}
+
+// TAO_IDL - Generated from
+// be\be_visitor_operation/tie_si.cpp:101
+
+template <class T> ACE_INLINE
+::CORBA::ModuleDef_ptr POA_CORBA::ComponentIR::ComponentDef_tie<T>::create_module (
+ const char * id,
+ const char * name,
+ const char * version
+ ACE_ENV_ARG_DECL
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ))
+{
+ return this->ptr_->create_module (
+ id,
+ name,
+ version
+ ACE_ENV_ARG_PARAMETER
+ );
+}
+
+// TAO_IDL - Generated from
+// be\be_visitor_operation/tie_si.cpp:101
+
+template <class T> ACE_INLINE
+::CORBA::ConstantDef_ptr POA_CORBA::ComponentIR::ComponentDef_tie<T>::create_constant (
+ const char * id,
+ const char * name,
+ const char * version,
+ ::CORBA::IDLType_ptr type,
+ const ::CORBA::Any & value
+ ACE_ENV_ARG_DECL
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ))
+{
+ return this->ptr_->create_constant (
+ id,
+ name,
+ version,
+ type,
+ value
+ ACE_ENV_ARG_PARAMETER
+ );
+}
+
+// TAO_IDL - Generated from
+// be\be_visitor_operation/tie_si.cpp:101
+
+template <class T> ACE_INLINE
+::CORBA::StructDef_ptr POA_CORBA::ComponentIR::ComponentDef_tie<T>::create_struct (
+ const char * id,
+ const char * name,
+ const char * version,
+ const ::CORBA::StructMemberSeq & members
+ ACE_ENV_ARG_DECL
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ))
+{
+ return this->ptr_->create_struct (
+ id,
+ name,
+ version,
+ members
+ ACE_ENV_ARG_PARAMETER
+ );
+}
+
+// TAO_IDL - Generated from
+// be\be_visitor_operation/tie_si.cpp:101
+
+template <class T> ACE_INLINE
+::CORBA::UnionDef_ptr POA_CORBA::ComponentIR::ComponentDef_tie<T>::create_union (
+ const char * id,
+ const char * name,
+ const char * version,
+ ::CORBA::IDLType_ptr discriminator_type,
+ const ::CORBA::UnionMemberSeq & members
+ ACE_ENV_ARG_DECL
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ))
+{
+ return this->ptr_->create_union (
+ id,
+ name,
+ version,
+ discriminator_type,
+ members
+ ACE_ENV_ARG_PARAMETER
+ );
+}
+
+// TAO_IDL - Generated from
+// be\be_visitor_operation/tie_si.cpp:101
+
+template <class T> ACE_INLINE
+::CORBA::EnumDef_ptr POA_CORBA::ComponentIR::ComponentDef_tie<T>::create_enum (
+ const char * id,
+ const char * name,
+ const char * version,
+ const ::CORBA::EnumMemberSeq & members
+ ACE_ENV_ARG_DECL
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ))
+{
+ return this->ptr_->create_enum (
+ id,
+ name,
+ version,
+ members
+ ACE_ENV_ARG_PARAMETER
+ );
+}
+
+// TAO_IDL - Generated from
+// be\be_visitor_operation/tie_si.cpp:101
+
+template <class T> ACE_INLINE
+::CORBA::AliasDef_ptr POA_CORBA::ComponentIR::ComponentDef_tie<T>::create_alias (
+ const char * id,
+ const char * name,
+ const char * version,
+ ::CORBA::IDLType_ptr original_type
+ ACE_ENV_ARG_DECL
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ))
+{
+ return this->ptr_->create_alias (
+ id,
+ name,
+ version,
+ original_type
+ ACE_ENV_ARG_PARAMETER
+ );
+}
+
+// TAO_IDL - Generated from
+// be\be_visitor_operation/tie_si.cpp:101
+
+template <class T> ACE_INLINE
+::CORBA::InterfaceDef_ptr POA_CORBA::ComponentIR::ComponentDef_tie<T>::create_interface (
+ const char * id,
+ const char * name,
+ const char * version,
+ const ::CORBA::InterfaceDefSeq & base_interfaces
+ ACE_ENV_ARG_DECL
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ))
+{
+ return this->ptr_->create_interface (
+ id,
+ name,
+ version,
+ base_interfaces
+ ACE_ENV_ARG_PARAMETER
+ );
+}
+
+// TAO_IDL - Generated from
+// be\be_visitor_operation/tie_si.cpp:101
+
+template <class T> ACE_INLINE
+::CORBA::ValueDef_ptr POA_CORBA::ComponentIR::ComponentDef_tie<T>::create_value (
+ const char * id,
+ const char * name,
+ const char * version,
+ ::CORBA::Boolean is_custom,
+ ::CORBA::Boolean is_abstract,
+ ::CORBA::ValueDef_ptr base_value,
+ ::CORBA::Boolean is_truncatable,
+ const ::CORBA::ValueDefSeq & abstract_base_values,
+ const ::CORBA::InterfaceDefSeq & supported_interfaces,
+ const ::CORBA::InitializerSeq & initializers
+ ACE_ENV_ARG_DECL
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ))
+{
+ return this->ptr_->create_value (
+ id,
+ name,
+ version,
+ is_custom,
+ is_abstract,
+ base_value,
+ is_truncatable,
+ abstract_base_values,
+ supported_interfaces,
+ initializers
+ ACE_ENV_ARG_PARAMETER
+ );
+}
+
+// TAO_IDL - Generated from
+// be\be_visitor_operation/tie_si.cpp:101
+
+template <class T> ACE_INLINE
+::CORBA::ValueBoxDef_ptr POA_CORBA::ComponentIR::ComponentDef_tie<T>::create_value_box (
+ const char * id,
+ const char * name,
+ const char * version,
+ ::CORBA::IDLType_ptr original_type_def
+ ACE_ENV_ARG_DECL
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ))
+{
+ return this->ptr_->create_value_box (
+ id,
+ name,
+ version,
+ original_type_def
+ ACE_ENV_ARG_PARAMETER
+ );
+}
+
+// TAO_IDL - Generated from
+// be\be_visitor_operation/tie_si.cpp:101
+
+template <class T> ACE_INLINE
+::CORBA::ExceptionDef_ptr POA_CORBA::ComponentIR::ComponentDef_tie<T>::create_exception (
+ const char * id,
+ const char * name,
+ const char * version,
+ const ::CORBA::StructMemberSeq & members
+ ACE_ENV_ARG_DECL
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ))
+{
+ return this->ptr_->create_exception (
+ id,
+ name,
+ version,
+ members
+ ACE_ENV_ARG_PARAMETER
+ );
+}
+
+// TAO_IDL - Generated from
+// be\be_visitor_operation/tie_si.cpp:101
+
+template <class T> ACE_INLINE
+::CORBA::NativeDef_ptr POA_CORBA::ComponentIR::ComponentDef_tie<T>::create_native (
+ const char * id,
+ const char * name,
+ const char * version
+ ACE_ENV_ARG_DECL
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ))
+{
+ return this->ptr_->create_native (
+ id,
+ name,
+ version
+ ACE_ENV_ARG_PARAMETER
+ );
+}
+
+// TAO_IDL - Generated from
+// be\be_visitor_operation/tie_si.cpp:101
+
+template <class T> ACE_INLINE
+::CORBA::AbstractInterfaceDef_ptr POA_CORBA::ComponentIR::ComponentDef_tie<T>::create_abstract_interface (
+ const char * id,
+ const char * name,
+ const char * version,
+ const ::CORBA::AbstractInterfaceDefSeq & base_interfaces
+ ACE_ENV_ARG_DECL
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ))
+{
+ return this->ptr_->create_abstract_interface (
+ id,
+ name,
+ version,
+ base_interfaces
+ ACE_ENV_ARG_PARAMETER
+ );
+}
+
+// TAO_IDL - Generated from
+// be\be_visitor_operation/tie_si.cpp:101
+
+template <class T> ACE_INLINE
+::CORBA::LocalInterfaceDef_ptr POA_CORBA::ComponentIR::ComponentDef_tie<T>::create_local_interface (
+ const char * id,
+ const char * name,
+ const char * version,
+ const ::CORBA::InterfaceDefSeq & base_interfaces
+ ACE_ENV_ARG_DECL
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ))
+{
+ return this->ptr_->create_local_interface (
+ id,
+ name,
+ version,
+ base_interfaces
+ ACE_ENV_ARG_PARAMETER
+ );
+}
+
+// TAO_IDL - Generated from
+// be\be_visitor_operation/tie_si.cpp:101
+
+template <class T> ACE_INLINE
+::CORBA::ExtValueDef_ptr POA_CORBA::ComponentIR::ComponentDef_tie<T>::create_ext_value (
+ const char * id,
+ const char * name,
+ const char * version,
+ ::CORBA::Boolean is_custom,
+ ::CORBA::Boolean is_abstract,
+ ::CORBA::ValueDef_ptr base_value,
+ ::CORBA::Boolean is_truncatable,
+ const ::CORBA::ValueDefSeq & abstract_base_values,
+ const ::CORBA::InterfaceDefSeq & supported_interfaces,
+ const ::CORBA::ExtInitializerSeq & initializers
+ ACE_ENV_ARG_DECL
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ))
+{
+ return this->ptr_->create_ext_value (
+ id,
+ name,
+ version,
+ is_custom,
+ is_abstract,
+ base_value,
+ is_truncatable,
+ abstract_base_values,
+ supported_interfaces,
+ initializers
+ ACE_ENV_ARG_PARAMETER
+ );
+}
+
+// TAO_IDL - Generated from
+// be\be_visitor_operation/tie_si.cpp:101
+
+template <class T> ACE_INLINE
+char * POA_CORBA::ComponentIR::ComponentDef_tie<T>::id (
+ ACE_ENV_SINGLE_ARG_DECL
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ))
+{
+ return this->ptr_->id (
+ ACE_ENV_SINGLE_ARG_PARAMETER
+ );
+}
+
+// TAO_IDL - Generated from
+// be\be_visitor_operation/tie_si.cpp:101
+
+template <class T> ACE_INLINE
+void POA_CORBA::ComponentIR::ComponentDef_tie<T>::id (
+ const char * id
+ ACE_ENV_ARG_DECL
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ))
+{
+ this->ptr_->id (
+ id
+ ACE_ENV_ARG_PARAMETER
+ );
+}
+
+// TAO_IDL - Generated from
+// be\be_visitor_operation/tie_si.cpp:101
+
+template <class T> ACE_INLINE
+char * POA_CORBA::ComponentIR::ComponentDef_tie<T>::name (
+ ACE_ENV_SINGLE_ARG_DECL
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ))
+{
+ return this->ptr_->name (
+ ACE_ENV_SINGLE_ARG_PARAMETER
+ );
+}
+
+// TAO_IDL - Generated from
+// be\be_visitor_operation/tie_si.cpp:101
+
+template <class T> ACE_INLINE
+void POA_CORBA::ComponentIR::ComponentDef_tie<T>::name (
+ const char * name
+ ACE_ENV_ARG_DECL
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ))
+{
+ this->ptr_->name (
+ name
+ ACE_ENV_ARG_PARAMETER
+ );
+}
+
+// TAO_IDL - Generated from
+// be\be_visitor_operation/tie_si.cpp:101
+
+template <class T> ACE_INLINE
+char * POA_CORBA::ComponentIR::ComponentDef_tie<T>::version (
+ ACE_ENV_SINGLE_ARG_DECL
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ))
+{
+ return this->ptr_->version (
+ ACE_ENV_SINGLE_ARG_PARAMETER
+ );
+}
+
+// TAO_IDL - Generated from
+// be\be_visitor_operation/tie_si.cpp:101
+
+template <class T> ACE_INLINE
+void POA_CORBA::ComponentIR::ComponentDef_tie<T>::version (
+ const char * version
+ ACE_ENV_ARG_DECL
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ))
+{
+ this->ptr_->version (
+ version
+ ACE_ENV_ARG_PARAMETER
+ );
+}
+
+// TAO_IDL - Generated from
+// be\be_visitor_operation/tie_si.cpp:101
+
+template <class T> ACE_INLINE
+::CORBA::Container_ptr POA_CORBA::ComponentIR::ComponentDef_tie<T>::defined_in (
+ ACE_ENV_SINGLE_ARG_DECL
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ))
+{
+ return this->ptr_->defined_in (
+ ACE_ENV_SINGLE_ARG_PARAMETER
+ );
+}
+
+// TAO_IDL - Generated from
+// be\be_visitor_operation/tie_si.cpp:101
+
+template <class T> ACE_INLINE
+char * POA_CORBA::ComponentIR::ComponentDef_tie<T>::absolute_name (
+ ACE_ENV_SINGLE_ARG_DECL
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ))
+{
+ return this->ptr_->absolute_name (
+ ACE_ENV_SINGLE_ARG_PARAMETER
+ );
+}
+
+// TAO_IDL - Generated from
+// be\be_visitor_operation/tie_si.cpp:101
+
+template <class T> ACE_INLINE
+::CORBA::Repository_ptr POA_CORBA::ComponentIR::ComponentDef_tie<T>::containing_repository (
+ ACE_ENV_SINGLE_ARG_DECL
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ))
+{
+ return this->ptr_->containing_repository (
+ ACE_ENV_SINGLE_ARG_PARAMETER
+ );
+}
+
+// TAO_IDL - Generated from
+// be\be_visitor_operation/tie_si.cpp:101
+
+template <class T> ACE_INLINE
+::CORBA::Contained::Description * POA_CORBA::ComponentIR::ComponentDef_tie<T>::describe (
+ ACE_ENV_SINGLE_ARG_DECL
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ))
+{
+ return this->ptr_->describe (
+ ACE_ENV_SINGLE_ARG_PARAMETER
+ );
+}
+
+// TAO_IDL - Generated from
+// be\be_visitor_operation/tie_si.cpp:101
+
+template <class T> ACE_INLINE
+void POA_CORBA::ComponentIR::ComponentDef_tie<T>::move (
+ ::CORBA::Container_ptr new_container,
+ const char * new_name,
+ const char * new_version
+ ACE_ENV_ARG_DECL
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ))
+{
+ this->ptr_->move (
+ new_container,
+ new_name,
+ new_version
+ ACE_ENV_ARG_PARAMETER
+ );
+}
+
+// TAO_IDL - Generated from
+// be\be_visitor_operation/tie_si.cpp:101
+
+template <class T> ACE_INLINE
+::CORBA::TypeCode_ptr POA_CORBA::ComponentIR::ComponentDef_tie<T>::type (
+ ACE_ENV_SINGLE_ARG_DECL
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ))
+{
+ return this->ptr_->type (
+ ACE_ENV_SINGLE_ARG_PARAMETER
+ );
+}
+
+// TAO_IDL - Generated from
+// be\be_visitor_operation/tie_si.cpp:101
+
+template <class T> ACE_INLINE
+::CORBA::InterfaceDefSeq * POA_CORBA::ComponentIR::ComponentDef_tie<T>::base_interfaces (
+ ACE_ENV_SINGLE_ARG_DECL
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ))
+{
+ return this->ptr_->base_interfaces (
+ ACE_ENV_SINGLE_ARG_PARAMETER
+ );
+}
+
+// TAO_IDL - Generated from
+// be\be_visitor_operation/tie_si.cpp:101
+
+template <class T> ACE_INLINE
+void POA_CORBA::ComponentIR::ComponentDef_tie<T>::base_interfaces (
+ const ::CORBA::InterfaceDefSeq & base_interfaces
+ ACE_ENV_ARG_DECL
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ))
+{
+ this->ptr_->base_interfaces (
+ base_interfaces
+ ACE_ENV_ARG_PARAMETER
+ );
+}
+
+// TAO_IDL - Generated from
+// be\be_visitor_operation/tie_si.cpp:101
+
+template <class T> ACE_INLINE
+::CORBA::Boolean POA_CORBA::ComponentIR::ComponentDef_tie<T>::is_a (
+ const char * interface_id
+ ACE_ENV_ARG_DECL
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ))
+{
+ return this->ptr_->is_a (
+ interface_id
+ ACE_ENV_ARG_PARAMETER
+ );
+}
+
+// TAO_IDL - Generated from
+// be\be_visitor_operation/tie_si.cpp:101
+
+template <class T> ACE_INLINE
+::CORBA::InterfaceDef::FullInterfaceDescription * POA_CORBA::ComponentIR::ComponentDef_tie<T>::describe_interface (
+ ACE_ENV_SINGLE_ARG_DECL
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ))
+{
+ return this->ptr_->describe_interface (
+ ACE_ENV_SINGLE_ARG_PARAMETER
+ );
+}
+
+// TAO_IDL - Generated from
+// be\be_visitor_operation/tie_si.cpp:101
+
+template <class T> ACE_INLINE
+::CORBA::AttributeDef_ptr POA_CORBA::ComponentIR::ComponentDef_tie<T>::create_attribute (
+ const char * id,
+ const char * name,
+ const char * version,
+ ::CORBA::IDLType_ptr type,
+ ::CORBA::AttributeMode mode
+ ACE_ENV_ARG_DECL
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ))
+{
+ return this->ptr_->create_attribute (
+ id,
+ name,
+ version,
+ type,
+ mode
+ ACE_ENV_ARG_PARAMETER
+ );
+}
+
+// TAO_IDL - Generated from
+// be\be_visitor_operation/tie_si.cpp:101
+
+template <class T> ACE_INLINE
+::CORBA::OperationDef_ptr POA_CORBA::ComponentIR::ComponentDef_tie<T>::create_operation (
+ const char * id,
+ const char * name,
+ const char * version,
+ ::CORBA::IDLType_ptr result,
+ ::CORBA::OperationMode mode,
+ const ::CORBA::ParDescriptionSeq & params,
+ const ::CORBA::ExceptionDefSeq & exceptions,
+ const ::CORBA::ContextIdSeq & contexts
+ ACE_ENV_ARG_DECL
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ))
+{
+ return this->ptr_->create_operation (
+ id,
+ name,
+ version,
+ result,
+ mode,
+ params,
+ exceptions,
+ contexts
+ ACE_ENV_ARG_PARAMETER
+ );
+}
+
+// TAO_IDL - Generated from
+// be\be_visitor_operation/tie_si.cpp:101
+
+template <class T> ACE_INLINE
+::CORBA::InterfaceAttrExtension::ExtFullInterfaceDescription * POA_CORBA::ComponentIR::ComponentDef_tie<T>::describe_ext_interface (
+ ACE_ENV_SINGLE_ARG_DECL
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ))
+{
+ return this->ptr_->describe_ext_interface (
+ ACE_ENV_SINGLE_ARG_PARAMETER
+ );
+}
+
+// TAO_IDL - Generated from
+// be\be_visitor_operation/tie_si.cpp:101
+
+template <class T> ACE_INLINE
+::CORBA::ExtAttributeDef_ptr POA_CORBA::ComponentIR::ComponentDef_tie<T>::create_ext_attribute (
+ const char * id,
+ const char * name,
+ const char * version,
+ ::CORBA::IDLType_ptr type,
+ ::CORBA::AttributeMode mode,
+ const ::CORBA::ExceptionDefSeq & get_exceptions,
+ const ::CORBA::ExceptionDefSeq & set_exceptions
+ ACE_ENV_ARG_DECL
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ))
+{
+ return this->ptr_->create_ext_attribute (
+ id,
+ name,
+ version,
+ type,
+ mode,
+ get_exceptions,
+ set_exceptions
+ ACE_ENV_ARG_PARAMETER
+ );
+}
+
+// TAO_IDL - Generated from
+// be\be_visitor_operation/tie_si.cpp:101
+
+template <class T> ACE_INLINE
+::CORBA::ComponentIR::ComponentDef_ptr POA_CORBA::ComponentIR::ComponentDef_tie<T>::base_component (
+ ACE_ENV_SINGLE_ARG_DECL
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ))
+{
+ return this->ptr_->base_component (
+ ACE_ENV_SINGLE_ARG_PARAMETER
+ );
+}
+
+// TAO_IDL - Generated from
+// be\be_visitor_operation/tie_si.cpp:101
+
+template <class T> ACE_INLINE
+void POA_CORBA::ComponentIR::ComponentDef_tie<T>::base_component (
+ ::CORBA::ComponentIR::ComponentDef_ptr base_component
+ ACE_ENV_ARG_DECL
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ))
+{
+ this->ptr_->base_component (
+ base_component
+ ACE_ENV_ARG_PARAMETER
+ );
+}
+
+// TAO_IDL - Generated from
+// be\be_visitor_operation/tie_si.cpp:101
+
+template <class T> ACE_INLINE
+::CORBA::InterfaceDefSeq * POA_CORBA::ComponentIR::ComponentDef_tie<T>::supported_interfaces (
+ ACE_ENV_SINGLE_ARG_DECL
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ))
+{
+ return this->ptr_->supported_interfaces (
+ ACE_ENV_SINGLE_ARG_PARAMETER
+ );
+}
+
+// TAO_IDL - Generated from
+// be\be_visitor_operation/tie_si.cpp:101
+
+template <class T> ACE_INLINE
+void POA_CORBA::ComponentIR::ComponentDef_tie<T>::supported_interfaces (
+ const ::CORBA::InterfaceDefSeq & supported_interfaces
+ ACE_ENV_ARG_DECL
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ))
+{
+ this->ptr_->supported_interfaces (
+ supported_interfaces
+ ACE_ENV_ARG_PARAMETER
+ );
+}
+
+// TAO_IDL - Generated from
+// be\be_visitor_operation/tie_si.cpp:101
+
+template <class T> ACE_INLINE
+::CORBA::ComponentIR::ProvidesDef_ptr POA_CORBA::ComponentIR::ComponentDef_tie<T>::create_provides (
+ const char * id,
+ const char * name,
+ const char * version,
+ ::CORBA::InterfaceDef_ptr interface_type
+ ACE_ENV_ARG_DECL
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ))
+{
+ return this->ptr_->create_provides (
+ id,
+ name,
+ version,
+ interface_type
+ ACE_ENV_ARG_PARAMETER
+ );
+}
+
+// TAO_IDL - Generated from
+// be\be_visitor_operation/tie_si.cpp:101
+
+template <class T> ACE_INLINE
+::CORBA::ComponentIR::UsesDef_ptr POA_CORBA::ComponentIR::ComponentDef_tie<T>::create_uses (
+ const char * id,
+ const char * name,
+ const char * version,
+ ::CORBA::InterfaceDef_ptr interface_type,
+ ::CORBA::Boolean is_multiple
+ ACE_ENV_ARG_DECL
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ))
+{
+ return this->ptr_->create_uses (
+ id,
+ name,
+ version,
+ interface_type,
+ is_multiple
+ ACE_ENV_ARG_PARAMETER
+ );
+}
+
+// TAO_IDL - Generated from
+// be\be_visitor_operation/tie_si.cpp:101
+
+template <class T> ACE_INLINE
+::CORBA::ComponentIR::EmitsDef_ptr POA_CORBA::ComponentIR::ComponentDef_tie<T>::create_emits (
+ const char * id,
+ const char * name,
+ const char * version,
+ ::CORBA::ComponentIR::EventDef_ptr event
+ ACE_ENV_ARG_DECL
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ))
+{
+ return this->ptr_->create_emits (
+ id,
+ name,
+ version,
+ event
+ ACE_ENV_ARG_PARAMETER
+ );
+}
+
+// TAO_IDL - Generated from
+// be\be_visitor_operation/tie_si.cpp:101
+
+template <class T> ACE_INLINE
+::CORBA::ComponentIR::PublishesDef_ptr POA_CORBA::ComponentIR::ComponentDef_tie<T>::create_publishes (
+ const char * id,
+ const char * name,
+ const char * version,
+ ::CORBA::ComponentIR::EventDef_ptr event
+ ACE_ENV_ARG_DECL
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ))
+{
+ return this->ptr_->create_publishes (
+ id,
+ name,
+ version,
+ event
+ ACE_ENV_ARG_PARAMETER
+ );
+}
+
+// TAO_IDL - Generated from
+// be\be_visitor_operation/tie_si.cpp:101
+
+template <class T> ACE_INLINE
+::CORBA::ComponentIR::ConsumesDef_ptr POA_CORBA::ComponentIR::ComponentDef_tie<T>::create_consumes (
+ const char * id,
+ const char * name,
+ const char * version,
+ ::CORBA::ComponentIR::EventDef_ptr event
+ ACE_ENV_ARG_DECL
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ))
+{
+ return this->ptr_->create_consumes (
+ id,
+ name,
+ version,
+ event
+ ACE_ENV_ARG_PARAMETER
+ );
+}
+
+// TAO_IDL - Generated from
+// be\be_visitor_interface/tie_si.cpp:96
+
+template <class T> ACE_INLINE
+POA_CORBA::ComponentIR::FactoryDef_tie<T>::FactoryDef_tie (T &t)
+ : ptr_ (&t),
+ poa_ (PortableServer::POA::_nil ()),
+ rel_ (0)
+{}
+
+template <class T> ACE_INLINE
+POA_CORBA::ComponentIR::FactoryDef_tie<T>::FactoryDef_tie (T &t, PortableServer::POA_ptr poa)
+ : ptr_ (&t),
+ poa_ (PortableServer::POA::_duplicate (poa)),
+ rel_ (0)
+{}
+
+template <class T> ACE_INLINE
+POA_CORBA::ComponentIR::FactoryDef_tie<T>::FactoryDef_tie (T *tp, ::CORBA::Boolean release)
+ : ptr_ (tp),
+ poa_ (PortableServer::POA::_nil ()),
+ rel_ (release)
+{}
+
+template <class T> ACE_INLINE
+POA_CORBA::ComponentIR::FactoryDef_tie<T>::FactoryDef_tie (T *tp, PortableServer::POA_ptr poa, ::CORBA::Boolean release)
+ : ptr_ (tp),
+ poa_ (PortableServer::POA::_duplicate (poa)),
+ rel_ (release)
+{}
+
+template <class T> ACE_INLINE
+POA_CORBA::ComponentIR::FactoryDef_tie<T>::~FactoryDef_tie (void)
+{
+ if (this->rel_)
+ {
+ delete this->ptr_;
+ }
+}
+
+template <class T> ACE_INLINE T *
+POA_CORBA::ComponentIR::FactoryDef_tie<T>::_tied_object (void)
+{
+ return this->ptr_;
+}
+
+template <class T> ACE_INLINE void
+POA_CORBA::ComponentIR::FactoryDef_tie<T>::_tied_object (T &obj)
+{
+ if (this->rel_)
+ {
+ delete this->ptr_;
+ }
+
+ this->ptr_ = &obj;
+ this->rel_ = 0;
+}
+
+template <class T> ACE_INLINE void
+POA_CORBA::ComponentIR::FactoryDef_tie<T>::_tied_object (T *obj, ::CORBA::Boolean release)
+{
+ if (this->rel_)
+ {
+ delete this->ptr_;
+ }
+
+ this->ptr_ = obj;
+ this->rel_ = release;
+}
+
+template <class T> ACE_INLINE ::CORBA::Boolean
+POA_CORBA::ComponentIR::FactoryDef_tie<T>::_is_owner (void)
+{
+ return this->rel_;
+}
+
+template <class T> ACE_INLINE void
+POA_CORBA::ComponentIR::FactoryDef_tie<T>::_is_owner ( ::CORBA::Boolean b)
+{
+ this->rel_ = b;
+}
+
+template <class T> ACE_INLINE PortableServer::POA_ptr
+POA_CORBA::ComponentIR::FactoryDef_tie<T>::_default_POA (ACE_ENV_SINGLE_ARG_DECL)
+{
+ if (! ::CORBA::is_nil (this->poa_.in ()))
+ {
+ return PortableServer::POA::_duplicate (this->poa_.in ());
+ }
+
+ return this->FactoryDef::_default_POA (ACE_ENV_SINGLE_ARG_PARAMETER);
+}
+
+// TAO_IDL - Generated from
+// be\be_visitor_operation/tie_si.cpp:101
+
+template <class T> ACE_INLINE
+::CORBA::DefinitionKind POA_CORBA::ComponentIR::FactoryDef_tie<T>::def_kind (
+ ACE_ENV_SINGLE_ARG_DECL
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ))
+{
+ return this->ptr_->def_kind (
+ ACE_ENV_SINGLE_ARG_PARAMETER
+ );
+}
+
+// TAO_IDL - Generated from
+// be\be_visitor_operation/tie_si.cpp:101
+
+template <class T> ACE_INLINE
+void POA_CORBA::ComponentIR::FactoryDef_tie<T>::destroy (
+ ACE_ENV_SINGLE_ARG_DECL
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ))
+{
+ this->ptr_->destroy (
+ ACE_ENV_SINGLE_ARG_PARAMETER
+ );
+}
+
+// TAO_IDL - Generated from
+// be\be_visitor_operation/tie_si.cpp:101
+
+template <class T> ACE_INLINE
+char * POA_CORBA::ComponentIR::FactoryDef_tie<T>::id (
+ ACE_ENV_SINGLE_ARG_DECL
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ))
+{
+ return this->ptr_->id (
+ ACE_ENV_SINGLE_ARG_PARAMETER
+ );
+}
+
+// TAO_IDL - Generated from
+// be\be_visitor_operation/tie_si.cpp:101
+
+template <class T> ACE_INLINE
+void POA_CORBA::ComponentIR::FactoryDef_tie<T>::id (
+ const char * id
+ ACE_ENV_ARG_DECL
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ))
+{
+ this->ptr_->id (
+ id
+ ACE_ENV_ARG_PARAMETER
+ );
+}
+
+// TAO_IDL - Generated from
+// be\be_visitor_operation/tie_si.cpp:101
+
+template <class T> ACE_INLINE
+char * POA_CORBA::ComponentIR::FactoryDef_tie<T>::name (
+ ACE_ENV_SINGLE_ARG_DECL
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ))
+{
+ return this->ptr_->name (
+ ACE_ENV_SINGLE_ARG_PARAMETER
+ );
+}
+
+// TAO_IDL - Generated from
+// be\be_visitor_operation/tie_si.cpp:101
+
+template <class T> ACE_INLINE
+void POA_CORBA::ComponentIR::FactoryDef_tie<T>::name (
+ const char * name
+ ACE_ENV_ARG_DECL
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ))
+{
+ this->ptr_->name (
+ name
+ ACE_ENV_ARG_PARAMETER
+ );
+}
+
+// TAO_IDL - Generated from
+// be\be_visitor_operation/tie_si.cpp:101
+
+template <class T> ACE_INLINE
+char * POA_CORBA::ComponentIR::FactoryDef_tie<T>::version (
+ ACE_ENV_SINGLE_ARG_DECL
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ))
+{
+ return this->ptr_->version (
+ ACE_ENV_SINGLE_ARG_PARAMETER
+ );
+}
+
+// TAO_IDL - Generated from
+// be\be_visitor_operation/tie_si.cpp:101
+
+template <class T> ACE_INLINE
+void POA_CORBA::ComponentIR::FactoryDef_tie<T>::version (
+ const char * version
+ ACE_ENV_ARG_DECL
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ))
+{
+ this->ptr_->version (
+ version
+ ACE_ENV_ARG_PARAMETER
+ );
+}
+
+// TAO_IDL - Generated from
+// be\be_visitor_operation/tie_si.cpp:101
+
+template <class T> ACE_INLINE
+::CORBA::Container_ptr POA_CORBA::ComponentIR::FactoryDef_tie<T>::defined_in (
+ ACE_ENV_SINGLE_ARG_DECL
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ))
+{
+ return this->ptr_->defined_in (
+ ACE_ENV_SINGLE_ARG_PARAMETER
+ );
+}
+
+// TAO_IDL - Generated from
+// be\be_visitor_operation/tie_si.cpp:101
+
+template <class T> ACE_INLINE
+char * POA_CORBA::ComponentIR::FactoryDef_tie<T>::absolute_name (
+ ACE_ENV_SINGLE_ARG_DECL
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ))
+{
+ return this->ptr_->absolute_name (
+ ACE_ENV_SINGLE_ARG_PARAMETER
+ );
+}
+
+// TAO_IDL - Generated from
+// be\be_visitor_operation/tie_si.cpp:101
+
+template <class T> ACE_INLINE
+::CORBA::Repository_ptr POA_CORBA::ComponentIR::FactoryDef_tie<T>::containing_repository (
+ ACE_ENV_SINGLE_ARG_DECL
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ))
+{
+ return this->ptr_->containing_repository (
+ ACE_ENV_SINGLE_ARG_PARAMETER
+ );
+}
+
+// TAO_IDL - Generated from
+// be\be_visitor_operation/tie_si.cpp:101
+
+template <class T> ACE_INLINE
+::CORBA::Contained::Description * POA_CORBA::ComponentIR::FactoryDef_tie<T>::describe (
+ ACE_ENV_SINGLE_ARG_DECL
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ))
+{
+ return this->ptr_->describe (
+ ACE_ENV_SINGLE_ARG_PARAMETER
+ );
+}
+
+// TAO_IDL - Generated from
+// be\be_visitor_operation/tie_si.cpp:101
+
+template <class T> ACE_INLINE
+void POA_CORBA::ComponentIR::FactoryDef_tie<T>::move (
+ ::CORBA::Container_ptr new_container,
+ const char * new_name,
+ const char * new_version
+ ACE_ENV_ARG_DECL
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ))
+{
+ this->ptr_->move (
+ new_container,
+ new_name,
+ new_version
+ ACE_ENV_ARG_PARAMETER
+ );
+}
+
+// TAO_IDL - Generated from
+// be\be_visitor_operation/tie_si.cpp:101
+
+template <class T> ACE_INLINE
+::CORBA::TypeCode_ptr POA_CORBA::ComponentIR::FactoryDef_tie<T>::result (
+ ACE_ENV_SINGLE_ARG_DECL
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ))
+{
+ return this->ptr_->result (
+ ACE_ENV_SINGLE_ARG_PARAMETER
+ );
+}
+
+// TAO_IDL - Generated from
+// be\be_visitor_operation/tie_si.cpp:101
+
+template <class T> ACE_INLINE
+::CORBA::IDLType_ptr POA_CORBA::ComponentIR::FactoryDef_tie<T>::result_def (
+ ACE_ENV_SINGLE_ARG_DECL
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ))
+{
+ return this->ptr_->result_def (
+ ACE_ENV_SINGLE_ARG_PARAMETER
+ );
+}
+
+// TAO_IDL - Generated from
+// be\be_visitor_operation/tie_si.cpp:101
+
+template <class T> ACE_INLINE
+void POA_CORBA::ComponentIR::FactoryDef_tie<T>::result_def (
+ ::CORBA::IDLType_ptr result_def
+ ACE_ENV_ARG_DECL
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ))
+{
+ this->ptr_->result_def (
+ result_def
+ ACE_ENV_ARG_PARAMETER
+ );
+}
+
+// TAO_IDL - Generated from
+// be\be_visitor_operation/tie_si.cpp:101
+
+template <class T> ACE_INLINE
+::CORBA::ParDescriptionSeq * POA_CORBA::ComponentIR::FactoryDef_tie<T>::params (
+ ACE_ENV_SINGLE_ARG_DECL
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ))
+{
+ return this->ptr_->params (
+ ACE_ENV_SINGLE_ARG_PARAMETER
+ );
+}
+
+// TAO_IDL - Generated from
+// be\be_visitor_operation/tie_si.cpp:101
+
+template <class T> ACE_INLINE
+void POA_CORBA::ComponentIR::FactoryDef_tie<T>::params (
+ const ::CORBA::ParDescriptionSeq & params
+ ACE_ENV_ARG_DECL
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ))
+{
+ this->ptr_->params (
+ params
+ ACE_ENV_ARG_PARAMETER
+ );
+}
+
+// TAO_IDL - Generated from
+// be\be_visitor_operation/tie_si.cpp:101
+
+template <class T> ACE_INLINE
+::CORBA::OperationMode POA_CORBA::ComponentIR::FactoryDef_tie<T>::mode (
+ ACE_ENV_SINGLE_ARG_DECL
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ))
+{
+ return this->ptr_->mode (
+ ACE_ENV_SINGLE_ARG_PARAMETER
+ );
+}
+
+// TAO_IDL - Generated from
+// be\be_visitor_operation/tie_si.cpp:101
+
+template <class T> ACE_INLINE
+void POA_CORBA::ComponentIR::FactoryDef_tie<T>::mode (
+ ::CORBA::OperationMode mode
+ ACE_ENV_ARG_DECL
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ))
+{
+ this->ptr_->mode (
+ mode
+ ACE_ENV_ARG_PARAMETER
+ );
+}
+
+// TAO_IDL - Generated from
+// be\be_visitor_operation/tie_si.cpp:101
+
+template <class T> ACE_INLINE
+::CORBA::ContextIdSeq * POA_CORBA::ComponentIR::FactoryDef_tie<T>::contexts (
+ ACE_ENV_SINGLE_ARG_DECL
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ))
+{
+ return this->ptr_->contexts (
+ ACE_ENV_SINGLE_ARG_PARAMETER
+ );
+}
+
+// TAO_IDL - Generated from
+// be\be_visitor_operation/tie_si.cpp:101
+
+template <class T> ACE_INLINE
+void POA_CORBA::ComponentIR::FactoryDef_tie<T>::contexts (
+ const ::CORBA::ContextIdSeq & contexts
+ ACE_ENV_ARG_DECL
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ))
+{
+ this->ptr_->contexts (
+ contexts
+ ACE_ENV_ARG_PARAMETER
+ );
+}
+
+// TAO_IDL - Generated from
+// be\be_visitor_operation/tie_si.cpp:101
+
+template <class T> ACE_INLINE
+::CORBA::ExceptionDefSeq * POA_CORBA::ComponentIR::FactoryDef_tie<T>::exceptions (
+ ACE_ENV_SINGLE_ARG_DECL
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ))
+{
+ return this->ptr_->exceptions (
+ ACE_ENV_SINGLE_ARG_PARAMETER
+ );
+}
+
+// TAO_IDL - Generated from
+// be\be_visitor_operation/tie_si.cpp:101
+
+template <class T> ACE_INLINE
+void POA_CORBA::ComponentIR::FactoryDef_tie<T>::exceptions (
+ const ::CORBA::ExceptionDefSeq & exceptions
+ ACE_ENV_ARG_DECL
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ))
+{
+ this->ptr_->exceptions (
+ exceptions
+ ACE_ENV_ARG_PARAMETER
+ );
+}
+
+// TAO_IDL - Generated from
+// be\be_visitor_interface/tie_si.cpp:96
+
+template <class T> ACE_INLINE
+POA_CORBA::ComponentIR::FinderDef_tie<T>::FinderDef_tie (T &t)
+ : ptr_ (&t),
+ poa_ (PortableServer::POA::_nil ()),
+ rel_ (0)
+{}
+
+template <class T> ACE_INLINE
+POA_CORBA::ComponentIR::FinderDef_tie<T>::FinderDef_tie (T &t, PortableServer::POA_ptr poa)
+ : ptr_ (&t),
+ poa_ (PortableServer::POA::_duplicate (poa)),
+ rel_ (0)
+{}
+
+template <class T> ACE_INLINE
+POA_CORBA::ComponentIR::FinderDef_tie<T>::FinderDef_tie (T *tp, ::CORBA::Boolean release)
+ : ptr_ (tp),
+ poa_ (PortableServer::POA::_nil ()),
+ rel_ (release)
+{}
+
+template <class T> ACE_INLINE
+POA_CORBA::ComponentIR::FinderDef_tie<T>::FinderDef_tie (T *tp, PortableServer::POA_ptr poa, ::CORBA::Boolean release)
+ : ptr_ (tp),
+ poa_ (PortableServer::POA::_duplicate (poa)),
+ rel_ (release)
+{}
+
+template <class T> ACE_INLINE
+POA_CORBA::ComponentIR::FinderDef_tie<T>::~FinderDef_tie (void)
+{
+ if (this->rel_)
+ {
+ delete this->ptr_;
+ }
+}
+
+template <class T> ACE_INLINE T *
+POA_CORBA::ComponentIR::FinderDef_tie<T>::_tied_object (void)
+{
+ return this->ptr_;
+}
+
+template <class T> ACE_INLINE void
+POA_CORBA::ComponentIR::FinderDef_tie<T>::_tied_object (T &obj)
+{
+ if (this->rel_)
+ {
+ delete this->ptr_;
+ }
+
+ this->ptr_ = &obj;
+ this->rel_ = 0;
+}
+
+template <class T> ACE_INLINE void
+POA_CORBA::ComponentIR::FinderDef_tie<T>::_tied_object (T *obj, ::CORBA::Boolean release)
+{
+ if (this->rel_)
+ {
+ delete this->ptr_;
+ }
+
+ this->ptr_ = obj;
+ this->rel_ = release;
+}
+
+template <class T> ACE_INLINE ::CORBA::Boolean
+POA_CORBA::ComponentIR::FinderDef_tie<T>::_is_owner (void)
+{
+ return this->rel_;
+}
+
+template <class T> ACE_INLINE void
+POA_CORBA::ComponentIR::FinderDef_tie<T>::_is_owner ( ::CORBA::Boolean b)
+{
+ this->rel_ = b;
+}
+
+template <class T> ACE_INLINE PortableServer::POA_ptr
+POA_CORBA::ComponentIR::FinderDef_tie<T>::_default_POA (ACE_ENV_SINGLE_ARG_DECL)
+{
+ if (! ::CORBA::is_nil (this->poa_.in ()))
+ {
+ return PortableServer::POA::_duplicate (this->poa_.in ());
+ }
+
+ return this->FinderDef::_default_POA (ACE_ENV_SINGLE_ARG_PARAMETER);
+}
+
+// TAO_IDL - Generated from
+// be\be_visitor_operation/tie_si.cpp:101
+
+template <class T> ACE_INLINE
+::CORBA::DefinitionKind POA_CORBA::ComponentIR::FinderDef_tie<T>::def_kind (
+ ACE_ENV_SINGLE_ARG_DECL
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ))
+{
+ return this->ptr_->def_kind (
+ ACE_ENV_SINGLE_ARG_PARAMETER
+ );
+}
+
+// TAO_IDL - Generated from
+// be\be_visitor_operation/tie_si.cpp:101
+
+template <class T> ACE_INLINE
+void POA_CORBA::ComponentIR::FinderDef_tie<T>::destroy (
+ ACE_ENV_SINGLE_ARG_DECL
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ))
+{
+ this->ptr_->destroy (
+ ACE_ENV_SINGLE_ARG_PARAMETER
+ );
+}
+
+// TAO_IDL - Generated from
+// be\be_visitor_operation/tie_si.cpp:101
+
+template <class T> ACE_INLINE
+char * POA_CORBA::ComponentIR::FinderDef_tie<T>::id (
+ ACE_ENV_SINGLE_ARG_DECL
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ))
+{
+ return this->ptr_->id (
+ ACE_ENV_SINGLE_ARG_PARAMETER
+ );
+}
+
+// TAO_IDL - Generated from
+// be\be_visitor_operation/tie_si.cpp:101
+
+template <class T> ACE_INLINE
+void POA_CORBA::ComponentIR::FinderDef_tie<T>::id (
+ const char * id
+ ACE_ENV_ARG_DECL
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ))
+{
+ this->ptr_->id (
+ id
+ ACE_ENV_ARG_PARAMETER
+ );
+}
+
+// TAO_IDL - Generated from
+// be\be_visitor_operation/tie_si.cpp:101
+
+template <class T> ACE_INLINE
+char * POA_CORBA::ComponentIR::FinderDef_tie<T>::name (
+ ACE_ENV_SINGLE_ARG_DECL
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ))
+{
+ return this->ptr_->name (
+ ACE_ENV_SINGLE_ARG_PARAMETER
+ );
+}
+
+// TAO_IDL - Generated from
+// be\be_visitor_operation/tie_si.cpp:101
+
+template <class T> ACE_INLINE
+void POA_CORBA::ComponentIR::FinderDef_tie<T>::name (
+ const char * name
+ ACE_ENV_ARG_DECL
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ))
+{
+ this->ptr_->name (
+ name
+ ACE_ENV_ARG_PARAMETER
+ );
+}
+
+// TAO_IDL - Generated from
+// be\be_visitor_operation/tie_si.cpp:101
+
+template <class T> ACE_INLINE
+char * POA_CORBA::ComponentIR::FinderDef_tie<T>::version (
+ ACE_ENV_SINGLE_ARG_DECL
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ))
+{
+ return this->ptr_->version (
+ ACE_ENV_SINGLE_ARG_PARAMETER
+ );
+}
+
+// TAO_IDL - Generated from
+// be\be_visitor_operation/tie_si.cpp:101
+
+template <class T> ACE_INLINE
+void POA_CORBA::ComponentIR::FinderDef_tie<T>::version (
+ const char * version
+ ACE_ENV_ARG_DECL
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ))
+{
+ this->ptr_->version (
+ version
+ ACE_ENV_ARG_PARAMETER
+ );
+}
+
+// TAO_IDL - Generated from
+// be\be_visitor_operation/tie_si.cpp:101
+
+template <class T> ACE_INLINE
+::CORBA::Container_ptr POA_CORBA::ComponentIR::FinderDef_tie<T>::defined_in (
+ ACE_ENV_SINGLE_ARG_DECL
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ))
+{
+ return this->ptr_->defined_in (
+ ACE_ENV_SINGLE_ARG_PARAMETER
+ );
+}
+
+// TAO_IDL - Generated from
+// be\be_visitor_operation/tie_si.cpp:101
+
+template <class T> ACE_INLINE
+char * POA_CORBA::ComponentIR::FinderDef_tie<T>::absolute_name (
+ ACE_ENV_SINGLE_ARG_DECL
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ))
+{
+ return this->ptr_->absolute_name (
+ ACE_ENV_SINGLE_ARG_PARAMETER
+ );
+}
+
+// TAO_IDL - Generated from
+// be\be_visitor_operation/tie_si.cpp:101
+
+template <class T> ACE_INLINE
+::CORBA::Repository_ptr POA_CORBA::ComponentIR::FinderDef_tie<T>::containing_repository (
+ ACE_ENV_SINGLE_ARG_DECL
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ))
+{
+ return this->ptr_->containing_repository (
+ ACE_ENV_SINGLE_ARG_PARAMETER
+ );
+}
+
+// TAO_IDL - Generated from
+// be\be_visitor_operation/tie_si.cpp:101
+
+template <class T> ACE_INLINE
+::CORBA::Contained::Description * POA_CORBA::ComponentIR::FinderDef_tie<T>::describe (
+ ACE_ENV_SINGLE_ARG_DECL
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ))
+{
+ return this->ptr_->describe (
+ ACE_ENV_SINGLE_ARG_PARAMETER
+ );
+}
+
+// TAO_IDL - Generated from
+// be\be_visitor_operation/tie_si.cpp:101
+
+template <class T> ACE_INLINE
+void POA_CORBA::ComponentIR::FinderDef_tie<T>::move (
+ ::CORBA::Container_ptr new_container,
+ const char * new_name,
+ const char * new_version
+ ACE_ENV_ARG_DECL
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ))
+{
+ this->ptr_->move (
+ new_container,
+ new_name,
+ new_version
+ ACE_ENV_ARG_PARAMETER
+ );
+}
+
+// TAO_IDL - Generated from
+// be\be_visitor_operation/tie_si.cpp:101
+
+template <class T> ACE_INLINE
+::CORBA::TypeCode_ptr POA_CORBA::ComponentIR::FinderDef_tie<T>::result (
+ ACE_ENV_SINGLE_ARG_DECL
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ))
+{
+ return this->ptr_->result (
+ ACE_ENV_SINGLE_ARG_PARAMETER
+ );
+}
+
+// TAO_IDL - Generated from
+// be\be_visitor_operation/tie_si.cpp:101
+
+template <class T> ACE_INLINE
+::CORBA::IDLType_ptr POA_CORBA::ComponentIR::FinderDef_tie<T>::result_def (
+ ACE_ENV_SINGLE_ARG_DECL
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ))
+{
+ return this->ptr_->result_def (
+ ACE_ENV_SINGLE_ARG_PARAMETER
+ );
+}
+
+// TAO_IDL - Generated from
+// be\be_visitor_operation/tie_si.cpp:101
+
+template <class T> ACE_INLINE
+void POA_CORBA::ComponentIR::FinderDef_tie<T>::result_def (
+ ::CORBA::IDLType_ptr result_def
+ ACE_ENV_ARG_DECL
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ))
+{
+ this->ptr_->result_def (
+ result_def
+ ACE_ENV_ARG_PARAMETER
+ );
+}
+
+// TAO_IDL - Generated from
+// be\be_visitor_operation/tie_si.cpp:101
+
+template <class T> ACE_INLINE
+::CORBA::ParDescriptionSeq * POA_CORBA::ComponentIR::FinderDef_tie<T>::params (
+ ACE_ENV_SINGLE_ARG_DECL
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ))
+{
+ return this->ptr_->params (
+ ACE_ENV_SINGLE_ARG_PARAMETER
+ );
+}
+
+// TAO_IDL - Generated from
+// be\be_visitor_operation/tie_si.cpp:101
+
+template <class T> ACE_INLINE
+void POA_CORBA::ComponentIR::FinderDef_tie<T>::params (
+ const ::CORBA::ParDescriptionSeq & params
+ ACE_ENV_ARG_DECL
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ))
+{
+ this->ptr_->params (
+ params
+ ACE_ENV_ARG_PARAMETER
+ );
+}
+
+// TAO_IDL - Generated from
+// be\be_visitor_operation/tie_si.cpp:101
+
+template <class T> ACE_INLINE
+::CORBA::OperationMode POA_CORBA::ComponentIR::FinderDef_tie<T>::mode (
+ ACE_ENV_SINGLE_ARG_DECL
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ))
+{
+ return this->ptr_->mode (
+ ACE_ENV_SINGLE_ARG_PARAMETER
+ );
+}
+
+// TAO_IDL - Generated from
+// be\be_visitor_operation/tie_si.cpp:101
+
+template <class T> ACE_INLINE
+void POA_CORBA::ComponentIR::FinderDef_tie<T>::mode (
+ ::CORBA::OperationMode mode
+ ACE_ENV_ARG_DECL
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ))
+{
+ this->ptr_->mode (
+ mode
+ ACE_ENV_ARG_PARAMETER
+ );
+}
+
+// TAO_IDL - Generated from
+// be\be_visitor_operation/tie_si.cpp:101
+
+template <class T> ACE_INLINE
+::CORBA::ContextIdSeq * POA_CORBA::ComponentIR::FinderDef_tie<T>::contexts (
+ ACE_ENV_SINGLE_ARG_DECL
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ))
+{
+ return this->ptr_->contexts (
+ ACE_ENV_SINGLE_ARG_PARAMETER
+ );
+}
+
+// TAO_IDL - Generated from
+// be\be_visitor_operation/tie_si.cpp:101
+
+template <class T> ACE_INLINE
+void POA_CORBA::ComponentIR::FinderDef_tie<T>::contexts (
+ const ::CORBA::ContextIdSeq & contexts
+ ACE_ENV_ARG_DECL
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ))
+{
+ this->ptr_->contexts (
+ contexts
+ ACE_ENV_ARG_PARAMETER
+ );
+}
+
+// TAO_IDL - Generated from
+// be\be_visitor_operation/tie_si.cpp:101
+
+template <class T> ACE_INLINE
+::CORBA::ExceptionDefSeq * POA_CORBA::ComponentIR::FinderDef_tie<T>::exceptions (
+ ACE_ENV_SINGLE_ARG_DECL
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ))
+{
+ return this->ptr_->exceptions (
+ ACE_ENV_SINGLE_ARG_PARAMETER
+ );
+}
+
+// TAO_IDL - Generated from
+// be\be_visitor_operation/tie_si.cpp:101
+
+template <class T> ACE_INLINE
+void POA_CORBA::ComponentIR::FinderDef_tie<T>::exceptions (
+ const ::CORBA::ExceptionDefSeq & exceptions
+ ACE_ENV_ARG_DECL
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ))
+{
+ this->ptr_->exceptions (
+ exceptions
+ ACE_ENV_ARG_PARAMETER
+ );
+}
+
+// TAO_IDL - Generated from
+// be\be_visitor_interface/tie_si.cpp:96
+
+template <class T> ACE_INLINE
+POA_CORBA::ComponentIR::HomeDef_tie<T>::HomeDef_tie (T &t)
+ : ptr_ (&t),
+ poa_ (PortableServer::POA::_nil ()),
+ rel_ (0)
+{}
+
+template <class T> ACE_INLINE
+POA_CORBA::ComponentIR::HomeDef_tie<T>::HomeDef_tie (T &t, PortableServer::POA_ptr poa)
+ : ptr_ (&t),
+ poa_ (PortableServer::POA::_duplicate (poa)),
+ rel_ (0)
+{}
+
+template <class T> ACE_INLINE
+POA_CORBA::ComponentIR::HomeDef_tie<T>::HomeDef_tie (T *tp, ::CORBA::Boolean release)
+ : ptr_ (tp),
+ poa_ (PortableServer::POA::_nil ()),
+ rel_ (release)
+{}
+
+template <class T> ACE_INLINE
+POA_CORBA::ComponentIR::HomeDef_tie<T>::HomeDef_tie (T *tp, PortableServer::POA_ptr poa, ::CORBA::Boolean release)
+ : ptr_ (tp),
+ poa_ (PortableServer::POA::_duplicate (poa)),
+ rel_ (release)
+{}
+
+template <class T> ACE_INLINE
+POA_CORBA::ComponentIR::HomeDef_tie<T>::~HomeDef_tie (void)
+{
+ if (this->rel_)
+ {
+ delete this->ptr_;
+ }
+}
+
+template <class T> ACE_INLINE T *
+POA_CORBA::ComponentIR::HomeDef_tie<T>::_tied_object (void)
+{
+ return this->ptr_;
+}
+
+template <class T> ACE_INLINE void
+POA_CORBA::ComponentIR::HomeDef_tie<T>::_tied_object (T &obj)
+{
+ if (this->rel_)
+ {
+ delete this->ptr_;
+ }
+
+ this->ptr_ = &obj;
+ this->rel_ = 0;
+}
+
+template <class T> ACE_INLINE void
+POA_CORBA::ComponentIR::HomeDef_tie<T>::_tied_object (T *obj, ::CORBA::Boolean release)
+{
+ if (this->rel_)
+ {
+ delete this->ptr_;
+ }
+
+ this->ptr_ = obj;
+ this->rel_ = release;
+}
+
+template <class T> ACE_INLINE ::CORBA::Boolean
+POA_CORBA::ComponentIR::HomeDef_tie<T>::_is_owner (void)
+{
+ return this->rel_;
+}
+
+template <class T> ACE_INLINE void
+POA_CORBA::ComponentIR::HomeDef_tie<T>::_is_owner ( ::CORBA::Boolean b)
+{
+ this->rel_ = b;
+}
+
+template <class T> ACE_INLINE PortableServer::POA_ptr
+POA_CORBA::ComponentIR::HomeDef_tie<T>::_default_POA (ACE_ENV_SINGLE_ARG_DECL)
+{
+ if (! ::CORBA::is_nil (this->poa_.in ()))
+ {
+ return PortableServer::POA::_duplicate (this->poa_.in ());
+ }
+
+ return this->HomeDef::_default_POA (ACE_ENV_SINGLE_ARG_PARAMETER);
+}
+
+// TAO_IDL - Generated from
+// be\be_visitor_operation/tie_si.cpp:101
+
+template <class T> ACE_INLINE
+::CORBA::DefinitionKind POA_CORBA::ComponentIR::HomeDef_tie<T>::def_kind (
+ ACE_ENV_SINGLE_ARG_DECL
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ))
+{
+ return this->ptr_->def_kind (
+ ACE_ENV_SINGLE_ARG_PARAMETER
+ );
+}
+
+// TAO_IDL - Generated from
+// be\be_visitor_operation/tie_si.cpp:101
+
+template <class T> ACE_INLINE
+void POA_CORBA::ComponentIR::HomeDef_tie<T>::destroy (
+ ACE_ENV_SINGLE_ARG_DECL
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ))
+{
+ this->ptr_->destroy (
+ ACE_ENV_SINGLE_ARG_PARAMETER
+ );
+}
+
+// TAO_IDL - Generated from
+// be\be_visitor_operation/tie_si.cpp:101
+
+template <class T> ACE_INLINE
+::CORBA::Contained_ptr POA_CORBA::ComponentIR::HomeDef_tie<T>::lookup (
+ const char * search_name
+ ACE_ENV_ARG_DECL
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ))
+{
+ return this->ptr_->lookup (
+ search_name
+ ACE_ENV_ARG_PARAMETER
+ );
+}
+
+// TAO_IDL - Generated from
+// be\be_visitor_operation/tie_si.cpp:101
+
+template <class T> ACE_INLINE
+::CORBA::ContainedSeq * POA_CORBA::ComponentIR::HomeDef_tie<T>::contents (
+ ::CORBA::DefinitionKind limit_type,
+ ::CORBA::Boolean exclude_inherited
+ ACE_ENV_ARG_DECL
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ))
+{
+ return this->ptr_->contents (
+ limit_type,
+ exclude_inherited
+ ACE_ENV_ARG_PARAMETER
+ );
+}
+
+// TAO_IDL - Generated from
+// be\be_visitor_operation/tie_si.cpp:101
+
+template <class T> ACE_INLINE
+::CORBA::ContainedSeq * POA_CORBA::ComponentIR::HomeDef_tie<T>::lookup_name (
+ const char * search_name,
+ ::CORBA::Long levels_to_search,
+ ::CORBA::DefinitionKind limit_type,
+ ::CORBA::Boolean exclude_inherited
+ ACE_ENV_ARG_DECL
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ))
+{
+ return this->ptr_->lookup_name (
+ search_name,
+ levels_to_search,
+ limit_type,
+ exclude_inherited
+ ACE_ENV_ARG_PARAMETER
+ );
+}
+
+// TAO_IDL - Generated from
+// be\be_visitor_operation/tie_si.cpp:101
+
+template <class T> ACE_INLINE
+::CORBA::Container::DescriptionSeq * POA_CORBA::ComponentIR::HomeDef_tie<T>::describe_contents (
+ ::CORBA::DefinitionKind limit_type,
+ ::CORBA::Boolean exclude_inherited,
+ ::CORBA::Long max_returned_objs
+ ACE_ENV_ARG_DECL
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ))
+{
+ return this->ptr_->describe_contents (
+ limit_type,
+ exclude_inherited,
+ max_returned_objs
+ ACE_ENV_ARG_PARAMETER
+ );
+}
+
+// TAO_IDL - Generated from
+// be\be_visitor_operation/tie_si.cpp:101
+
+template <class T> ACE_INLINE
+::CORBA::ModuleDef_ptr POA_CORBA::ComponentIR::HomeDef_tie<T>::create_module (
+ const char * id,
+ const char * name,
+ const char * version
+ ACE_ENV_ARG_DECL
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ))
+{
+ return this->ptr_->create_module (
+ id,
+ name,
+ version
+ ACE_ENV_ARG_PARAMETER
+ );
+}
+
+// TAO_IDL - Generated from
+// be\be_visitor_operation/tie_si.cpp:101
+
+template <class T> ACE_INLINE
+::CORBA::ConstantDef_ptr POA_CORBA::ComponentIR::HomeDef_tie<T>::create_constant (
+ const char * id,
+ const char * name,
+ const char * version,
+ ::CORBA::IDLType_ptr type,
+ const ::CORBA::Any & value
+ ACE_ENV_ARG_DECL
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ))
+{
+ return this->ptr_->create_constant (
+ id,
+ name,
+ version,
+ type,
+ value
+ ACE_ENV_ARG_PARAMETER
+ );
+}
+
+// TAO_IDL - Generated from
+// be\be_visitor_operation/tie_si.cpp:101
+
+template <class T> ACE_INLINE
+::CORBA::StructDef_ptr POA_CORBA::ComponentIR::HomeDef_tie<T>::create_struct (
+ const char * id,
+ const char * name,
+ const char * version,
+ const ::CORBA::StructMemberSeq & members
+ ACE_ENV_ARG_DECL
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ))
+{
+ return this->ptr_->create_struct (
+ id,
+ name,
+ version,
+ members
+ ACE_ENV_ARG_PARAMETER
+ );
+}
+
+// TAO_IDL - Generated from
+// be\be_visitor_operation/tie_si.cpp:101
+
+template <class T> ACE_INLINE
+::CORBA::UnionDef_ptr POA_CORBA::ComponentIR::HomeDef_tie<T>::create_union (
+ const char * id,
+ const char * name,
+ const char * version,
+ ::CORBA::IDLType_ptr discriminator_type,
+ const ::CORBA::UnionMemberSeq & members
+ ACE_ENV_ARG_DECL
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ))
+{
+ return this->ptr_->create_union (
+ id,
+ name,
+ version,
+ discriminator_type,
+ members
+ ACE_ENV_ARG_PARAMETER
+ );
+}
+
+// TAO_IDL - Generated from
+// be\be_visitor_operation/tie_si.cpp:101
+
+template <class T> ACE_INLINE
+::CORBA::EnumDef_ptr POA_CORBA::ComponentIR::HomeDef_tie<T>::create_enum (
+ const char * id,
+ const char * name,
+ const char * version,
+ const ::CORBA::EnumMemberSeq & members
+ ACE_ENV_ARG_DECL
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ))
+{
+ return this->ptr_->create_enum (
+ id,
+ name,
+ version,
+ members
+ ACE_ENV_ARG_PARAMETER
+ );
+}
+
+// TAO_IDL - Generated from
+// be\be_visitor_operation/tie_si.cpp:101
+
+template <class T> ACE_INLINE
+::CORBA::AliasDef_ptr POA_CORBA::ComponentIR::HomeDef_tie<T>::create_alias (
+ const char * id,
+ const char * name,
+ const char * version,
+ ::CORBA::IDLType_ptr original_type
+ ACE_ENV_ARG_DECL
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ))
+{
+ return this->ptr_->create_alias (
+ id,
+ name,
+ version,
+ original_type
+ ACE_ENV_ARG_PARAMETER
+ );
+}
+
+// TAO_IDL - Generated from
+// be\be_visitor_operation/tie_si.cpp:101
+
+template <class T> ACE_INLINE
+::CORBA::InterfaceDef_ptr POA_CORBA::ComponentIR::HomeDef_tie<T>::create_interface (
+ const char * id,
+ const char * name,
+ const char * version,
+ const ::CORBA::InterfaceDefSeq & base_interfaces
+ ACE_ENV_ARG_DECL
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ))
+{
+ return this->ptr_->create_interface (
+ id,
+ name,
+ version,
+ base_interfaces
+ ACE_ENV_ARG_PARAMETER
+ );
+}
+
+// TAO_IDL - Generated from
+// be\be_visitor_operation/tie_si.cpp:101
+
+template <class T> ACE_INLINE
+::CORBA::ValueDef_ptr POA_CORBA::ComponentIR::HomeDef_tie<T>::create_value (
+ const char * id,
+ const char * name,
+ const char * version,
+ ::CORBA::Boolean is_custom,
+ ::CORBA::Boolean is_abstract,
+ ::CORBA::ValueDef_ptr base_value,
+ ::CORBA::Boolean is_truncatable,
+ const ::CORBA::ValueDefSeq & abstract_base_values,
+ const ::CORBA::InterfaceDefSeq & supported_interfaces,
+ const ::CORBA::InitializerSeq & initializers
+ ACE_ENV_ARG_DECL
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ))
+{
+ return this->ptr_->create_value (
+ id,
+ name,
+ version,
+ is_custom,
+ is_abstract,
+ base_value,
+ is_truncatable,
+ abstract_base_values,
+ supported_interfaces,
+ initializers
+ ACE_ENV_ARG_PARAMETER
+ );
+}
+
+// TAO_IDL - Generated from
+// be\be_visitor_operation/tie_si.cpp:101
+
+template <class T> ACE_INLINE
+::CORBA::ValueBoxDef_ptr POA_CORBA::ComponentIR::HomeDef_tie<T>::create_value_box (
+ const char * id,
+ const char * name,
+ const char * version,
+ ::CORBA::IDLType_ptr original_type_def
+ ACE_ENV_ARG_DECL
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ))
+{
+ return this->ptr_->create_value_box (
+ id,
+ name,
+ version,
+ original_type_def
+ ACE_ENV_ARG_PARAMETER
+ );
+}
+
+// TAO_IDL - Generated from
+// be\be_visitor_operation/tie_si.cpp:101
+
+template <class T> ACE_INLINE
+::CORBA::ExceptionDef_ptr POA_CORBA::ComponentIR::HomeDef_tie<T>::create_exception (
+ const char * id,
+ const char * name,
+ const char * version,
+ const ::CORBA::StructMemberSeq & members
+ ACE_ENV_ARG_DECL
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ))
+{
+ return this->ptr_->create_exception (
+ id,
+ name,
+ version,
+ members
+ ACE_ENV_ARG_PARAMETER
+ );
+}
+
+// TAO_IDL - Generated from
+// be\be_visitor_operation/tie_si.cpp:101
+
+template <class T> ACE_INLINE
+::CORBA::NativeDef_ptr POA_CORBA::ComponentIR::HomeDef_tie<T>::create_native (
+ const char * id,
+ const char * name,
+ const char * version
+ ACE_ENV_ARG_DECL
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ))
+{
+ return this->ptr_->create_native (
+ id,
+ name,
+ version
+ ACE_ENV_ARG_PARAMETER
+ );
+}
+
+// TAO_IDL - Generated from
+// be\be_visitor_operation/tie_si.cpp:101
+
+template <class T> ACE_INLINE
+::CORBA::AbstractInterfaceDef_ptr POA_CORBA::ComponentIR::HomeDef_tie<T>::create_abstract_interface (
+ const char * id,
+ const char * name,
+ const char * version,
+ const ::CORBA::AbstractInterfaceDefSeq & base_interfaces
+ ACE_ENV_ARG_DECL
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ))
+{
+ return this->ptr_->create_abstract_interface (
+ id,
+ name,
+ version,
+ base_interfaces
+ ACE_ENV_ARG_PARAMETER
+ );
+}
+
+// TAO_IDL - Generated from
+// be\be_visitor_operation/tie_si.cpp:101
+
+template <class T> ACE_INLINE
+::CORBA::LocalInterfaceDef_ptr POA_CORBA::ComponentIR::HomeDef_tie<T>::create_local_interface (
+ const char * id,
+ const char * name,
+ const char * version,
+ const ::CORBA::InterfaceDefSeq & base_interfaces
+ ACE_ENV_ARG_DECL
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ))
+{
+ return this->ptr_->create_local_interface (
+ id,
+ name,
+ version,
+ base_interfaces
+ ACE_ENV_ARG_PARAMETER
+ );
+}
+
+// TAO_IDL - Generated from
+// be\be_visitor_operation/tie_si.cpp:101
+
+template <class T> ACE_INLINE
+::CORBA::ExtValueDef_ptr POA_CORBA::ComponentIR::HomeDef_tie<T>::create_ext_value (
+ const char * id,
+ const char * name,
+ const char * version,
+ ::CORBA::Boolean is_custom,
+ ::CORBA::Boolean is_abstract,
+ ::CORBA::ValueDef_ptr base_value,
+ ::CORBA::Boolean is_truncatable,
+ const ::CORBA::ValueDefSeq & abstract_base_values,
+ const ::CORBA::InterfaceDefSeq & supported_interfaces,
+ const ::CORBA::ExtInitializerSeq & initializers
+ ACE_ENV_ARG_DECL
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ))
+{
+ return this->ptr_->create_ext_value (
+ id,
+ name,
+ version,
+ is_custom,
+ is_abstract,
+ base_value,
+ is_truncatable,
+ abstract_base_values,
+ supported_interfaces,
+ initializers
+ ACE_ENV_ARG_PARAMETER
+ );
+}
+
+// TAO_IDL - Generated from
+// be\be_visitor_operation/tie_si.cpp:101
+
+template <class T> ACE_INLINE
+char * POA_CORBA::ComponentIR::HomeDef_tie<T>::id (
+ ACE_ENV_SINGLE_ARG_DECL
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ))
+{
+ return this->ptr_->id (
+ ACE_ENV_SINGLE_ARG_PARAMETER
+ );
+}
+
+// TAO_IDL - Generated from
+// be\be_visitor_operation/tie_si.cpp:101
+
+template <class T> ACE_INLINE
+void POA_CORBA::ComponentIR::HomeDef_tie<T>::id (
+ const char * id
+ ACE_ENV_ARG_DECL
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ))
+{
+ this->ptr_->id (
+ id
+ ACE_ENV_ARG_PARAMETER
+ );
+}
+
+// TAO_IDL - Generated from
+// be\be_visitor_operation/tie_si.cpp:101
+
+template <class T> ACE_INLINE
+char * POA_CORBA::ComponentIR::HomeDef_tie<T>::name (
+ ACE_ENV_SINGLE_ARG_DECL
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ))
+{
+ return this->ptr_->name (
+ ACE_ENV_SINGLE_ARG_PARAMETER
+ );
+}
+
+// TAO_IDL - Generated from
+// be\be_visitor_operation/tie_si.cpp:101
+
+template <class T> ACE_INLINE
+void POA_CORBA::ComponentIR::HomeDef_tie<T>::name (
+ const char * name
+ ACE_ENV_ARG_DECL
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ))
+{
+ this->ptr_->name (
+ name
+ ACE_ENV_ARG_PARAMETER
+ );
+}
+
+// TAO_IDL - Generated from
+// be\be_visitor_operation/tie_si.cpp:101
+
+template <class T> ACE_INLINE
+char * POA_CORBA::ComponentIR::HomeDef_tie<T>::version (
+ ACE_ENV_SINGLE_ARG_DECL
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ))
+{
+ return this->ptr_->version (
+ ACE_ENV_SINGLE_ARG_PARAMETER
+ );
+}
+
+// TAO_IDL - Generated from
+// be\be_visitor_operation/tie_si.cpp:101
+
+template <class T> ACE_INLINE
+void POA_CORBA::ComponentIR::HomeDef_tie<T>::version (
+ const char * version
+ ACE_ENV_ARG_DECL
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ))
+{
+ this->ptr_->version (
+ version
+ ACE_ENV_ARG_PARAMETER
+ );
+}
+
+// TAO_IDL - Generated from
+// be\be_visitor_operation/tie_si.cpp:101
+
+template <class T> ACE_INLINE
+::CORBA::Container_ptr POA_CORBA::ComponentIR::HomeDef_tie<T>::defined_in (
+ ACE_ENV_SINGLE_ARG_DECL
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ))
+{
+ return this->ptr_->defined_in (
+ ACE_ENV_SINGLE_ARG_PARAMETER
+ );
+}
+
+// TAO_IDL - Generated from
+// be\be_visitor_operation/tie_si.cpp:101
+
+template <class T> ACE_INLINE
+char * POA_CORBA::ComponentIR::HomeDef_tie<T>::absolute_name (
+ ACE_ENV_SINGLE_ARG_DECL
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ))
+{
+ return this->ptr_->absolute_name (
+ ACE_ENV_SINGLE_ARG_PARAMETER
+ );
+}
+
+// TAO_IDL - Generated from
+// be\be_visitor_operation/tie_si.cpp:101
+
+template <class T> ACE_INLINE
+::CORBA::Repository_ptr POA_CORBA::ComponentIR::HomeDef_tie<T>::containing_repository (
+ ACE_ENV_SINGLE_ARG_DECL
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ))
+{
+ return this->ptr_->containing_repository (
+ ACE_ENV_SINGLE_ARG_PARAMETER
+ );
+}
+
+// TAO_IDL - Generated from
+// be\be_visitor_operation/tie_si.cpp:101
+
+template <class T> ACE_INLINE
+::CORBA::Contained::Description * POA_CORBA::ComponentIR::HomeDef_tie<T>::describe (
+ ACE_ENV_SINGLE_ARG_DECL
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ))
+{
+ return this->ptr_->describe (
+ ACE_ENV_SINGLE_ARG_PARAMETER
+ );
+}
+
+// TAO_IDL - Generated from
+// be\be_visitor_operation/tie_si.cpp:101
+
+template <class T> ACE_INLINE
+void POA_CORBA::ComponentIR::HomeDef_tie<T>::move (
+ ::CORBA::Container_ptr new_container,
+ const char * new_name,
+ const char * new_version
+ ACE_ENV_ARG_DECL
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ))
+{
+ this->ptr_->move (
+ new_container,
+ new_name,
+ new_version
+ ACE_ENV_ARG_PARAMETER
+ );
+}
+
+// TAO_IDL - Generated from
+// be\be_visitor_operation/tie_si.cpp:101
+
+template <class T> ACE_INLINE
+::CORBA::TypeCode_ptr POA_CORBA::ComponentIR::HomeDef_tie<T>::type (
+ ACE_ENV_SINGLE_ARG_DECL
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ))
+{
+ return this->ptr_->type (
+ ACE_ENV_SINGLE_ARG_PARAMETER
+ );
+}
+
+// TAO_IDL - Generated from
+// be\be_visitor_operation/tie_si.cpp:101
+
+template <class T> ACE_INLINE
+::CORBA::InterfaceDefSeq * POA_CORBA::ComponentIR::HomeDef_tie<T>::base_interfaces (
+ ACE_ENV_SINGLE_ARG_DECL
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ))
+{
+ return this->ptr_->base_interfaces (
+ ACE_ENV_SINGLE_ARG_PARAMETER
+ );
+}
+
+// TAO_IDL - Generated from
+// be\be_visitor_operation/tie_si.cpp:101
+
+template <class T> ACE_INLINE
+void POA_CORBA::ComponentIR::HomeDef_tie<T>::base_interfaces (
+ const ::CORBA::InterfaceDefSeq & base_interfaces
+ ACE_ENV_ARG_DECL
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ))
+{
+ this->ptr_->base_interfaces (
+ base_interfaces
+ ACE_ENV_ARG_PARAMETER
+ );
+}
+
+// TAO_IDL - Generated from
+// be\be_visitor_operation/tie_si.cpp:101
+
+template <class T> ACE_INLINE
+::CORBA::Boolean POA_CORBA::ComponentIR::HomeDef_tie<T>::is_a (
+ const char * interface_id
+ ACE_ENV_ARG_DECL
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ))
+{
+ return this->ptr_->is_a (
+ interface_id
+ ACE_ENV_ARG_PARAMETER
+ );
+}
+
+// TAO_IDL - Generated from
+// be\be_visitor_operation/tie_si.cpp:101
+
+template <class T> ACE_INLINE
+::CORBA::InterfaceDef::FullInterfaceDescription * POA_CORBA::ComponentIR::HomeDef_tie<T>::describe_interface (
+ ACE_ENV_SINGLE_ARG_DECL
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ))
+{
+ return this->ptr_->describe_interface (
+ ACE_ENV_SINGLE_ARG_PARAMETER
+ );
+}
+
+// TAO_IDL - Generated from
+// be\be_visitor_operation/tie_si.cpp:101
+
+template <class T> ACE_INLINE
+::CORBA::AttributeDef_ptr POA_CORBA::ComponentIR::HomeDef_tie<T>::create_attribute (
+ const char * id,
+ const char * name,
+ const char * version,
+ ::CORBA::IDLType_ptr type,
+ ::CORBA::AttributeMode mode
+ ACE_ENV_ARG_DECL
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ))
+{
+ return this->ptr_->create_attribute (
+ id,
+ name,
+ version,
+ type,
+ mode
+ ACE_ENV_ARG_PARAMETER
+ );
+}
+
+// TAO_IDL - Generated from
+// be\be_visitor_operation/tie_si.cpp:101
+
+template <class T> ACE_INLINE
+::CORBA::OperationDef_ptr POA_CORBA::ComponentIR::HomeDef_tie<T>::create_operation (
+ const char * id,
+ const char * name,
+ const char * version,
+ ::CORBA::IDLType_ptr result,
+ ::CORBA::OperationMode mode,
+ const ::CORBA::ParDescriptionSeq & params,
+ const ::CORBA::ExceptionDefSeq & exceptions,
+ const ::CORBA::ContextIdSeq & contexts
+ ACE_ENV_ARG_DECL
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ))
+{
+ return this->ptr_->create_operation (
+ id,
+ name,
+ version,
+ result,
+ mode,
+ params,
+ exceptions,
+ contexts
+ ACE_ENV_ARG_PARAMETER
+ );
+}
+
+// TAO_IDL - Generated from
+// be\be_visitor_operation/tie_si.cpp:101
+
+template <class T> ACE_INLINE
+::CORBA::InterfaceAttrExtension::ExtFullInterfaceDescription * POA_CORBA::ComponentIR::HomeDef_tie<T>::describe_ext_interface (
+ ACE_ENV_SINGLE_ARG_DECL
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ))
+{
+ return this->ptr_->describe_ext_interface (
+ ACE_ENV_SINGLE_ARG_PARAMETER
+ );
+}
+
+// TAO_IDL - Generated from
+// be\be_visitor_operation/tie_si.cpp:101
+
+template <class T> ACE_INLINE
+::CORBA::ExtAttributeDef_ptr POA_CORBA::ComponentIR::HomeDef_tie<T>::create_ext_attribute (
+ const char * id,
+ const char * name,
+ const char * version,
+ ::CORBA::IDLType_ptr type,
+ ::CORBA::AttributeMode mode,
+ const ::CORBA::ExceptionDefSeq & get_exceptions,
+ const ::CORBA::ExceptionDefSeq & set_exceptions
+ ACE_ENV_ARG_DECL
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ))
+{
+ return this->ptr_->create_ext_attribute (
+ id,
+ name,
+ version,
+ type,
+ mode,
+ get_exceptions,
+ set_exceptions
+ ACE_ENV_ARG_PARAMETER
+ );
+}
+
+// TAO_IDL - Generated from
+// be\be_visitor_operation/tie_si.cpp:101
+
+template <class T> ACE_INLINE
+::CORBA::ComponentIR::HomeDef_ptr POA_CORBA::ComponentIR::HomeDef_tie<T>::base_home (
+ ACE_ENV_SINGLE_ARG_DECL
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ))
+{
+ return this->ptr_->base_home (
+ ACE_ENV_SINGLE_ARG_PARAMETER
+ );
+}
+
+// TAO_IDL - Generated from
+// be\be_visitor_operation/tie_si.cpp:101
+
+template <class T> ACE_INLINE
+void POA_CORBA::ComponentIR::HomeDef_tie<T>::base_home (
+ ::CORBA::ComponentIR::HomeDef_ptr base_home
+ ACE_ENV_ARG_DECL
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ))
+{
+ this->ptr_->base_home (
+ base_home
+ ACE_ENV_ARG_PARAMETER
+ );
+}
+
+// TAO_IDL - Generated from
+// be\be_visitor_operation/tie_si.cpp:101
+
+template <class T> ACE_INLINE
+::CORBA::InterfaceDefSeq * POA_CORBA::ComponentIR::HomeDef_tie<T>::supported_interfaces (
+ ACE_ENV_SINGLE_ARG_DECL
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ))
+{
+ return this->ptr_->supported_interfaces (
+ ACE_ENV_SINGLE_ARG_PARAMETER
+ );
+}
+
+// TAO_IDL - Generated from
+// be\be_visitor_operation/tie_si.cpp:101
+
+template <class T> ACE_INLINE
+void POA_CORBA::ComponentIR::HomeDef_tie<T>::supported_interfaces (
+ const ::CORBA::InterfaceDefSeq & supported_interfaces
+ ACE_ENV_ARG_DECL
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ))
+{
+ this->ptr_->supported_interfaces (
+ supported_interfaces
+ ACE_ENV_ARG_PARAMETER
+ );
+}
+
+// TAO_IDL - Generated from
+// be\be_visitor_operation/tie_si.cpp:101
+
+template <class T> ACE_INLINE
+::CORBA::ComponentIR::ComponentDef_ptr POA_CORBA::ComponentIR::HomeDef_tie<T>::managed_component (
+ ACE_ENV_SINGLE_ARG_DECL
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ))
+{
+ return this->ptr_->managed_component (
+ ACE_ENV_SINGLE_ARG_PARAMETER
+ );
+}
+
+// TAO_IDL - Generated from
+// be\be_visitor_operation/tie_si.cpp:101
+
+template <class T> ACE_INLINE
+void POA_CORBA::ComponentIR::HomeDef_tie<T>::managed_component (
+ ::CORBA::ComponentIR::ComponentDef_ptr managed_component
+ ACE_ENV_ARG_DECL
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ))
+{
+ this->ptr_->managed_component (
+ managed_component
+ ACE_ENV_ARG_PARAMETER
+ );
+}
+
+// TAO_IDL - Generated from
+// be\be_visitor_operation/tie_si.cpp:101
+
+template <class T> ACE_INLINE
+::CORBA::ValueDef_ptr POA_CORBA::ComponentIR::HomeDef_tie<T>::primary_key (
+ ACE_ENV_SINGLE_ARG_DECL
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ))
+{
+ return this->ptr_->primary_key (
+ ACE_ENV_SINGLE_ARG_PARAMETER
+ );
+}
+
+// TAO_IDL - Generated from
+// be\be_visitor_operation/tie_si.cpp:101
+
+template <class T> ACE_INLINE
+void POA_CORBA::ComponentIR::HomeDef_tie<T>::primary_key (
+ ::CORBA::ValueDef_ptr primary_key
+ ACE_ENV_ARG_DECL
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ))
+{
+ this->ptr_->primary_key (
+ primary_key
+ ACE_ENV_ARG_PARAMETER
+ );
+}
+
+// TAO_IDL - Generated from
+// be\be_visitor_operation/tie_si.cpp:101
+
+template <class T> ACE_INLINE
+::CORBA::ComponentIR::FactoryDef_ptr POA_CORBA::ComponentIR::HomeDef_tie<T>::create_factory (
+ const char * id,
+ const char * name,
+ const char * version,
+ const ::CORBA::ParDescriptionSeq & params,
+ const ::CORBA::ExceptionDefSeq & exceptions
+ ACE_ENV_ARG_DECL
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ))
+{
+ return this->ptr_->create_factory (
+ id,
+ name,
+ version,
+ params,
+ exceptions
+ ACE_ENV_ARG_PARAMETER
+ );
+}
+
+// TAO_IDL - Generated from
+// be\be_visitor_operation/tie_si.cpp:101
+
+template <class T> ACE_INLINE
+::CORBA::ComponentIR::FinderDef_ptr POA_CORBA::ComponentIR::HomeDef_tie<T>::create_finder (
+ const char * id,
+ const char * name,
+ const char * version,
+ const ::CORBA::ParDescriptionSeq & params,
+ const ::CORBA::ExceptionDefSeq & exceptions
+ ACE_ENV_ARG_DECL
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ))
+{
+ return this->ptr_->create_finder (
+ id,
+ name,
+ version,
+ params,
+ exceptions
+ ACE_ENV_ARG_PARAMETER
+ );
+}
+
+
+TAO_END_VERSIONED_NAMESPACE_DECL
+
diff --git a/TAO/orbsvcs/orbsvcs/IFRService/IFR_ExtendedS.cpp b/TAO/orbsvcs/orbsvcs/IFRService/IFR_ExtendedS.cpp
new file mode 100644
index 00000000000..f41363829d3
--- /dev/null
+++ b/TAO/orbsvcs/orbsvcs/IFRService/IFR_ExtendedS.cpp
@@ -0,0 +1,7501 @@
+// -*- C++ -*-
+//
+// $Id$
+
+// **** Code generated by the The ACE ORB (TAO) IDL Compiler ****
+// TAO and the TAO IDL Compiler have been developed by:
+// Center for Distributed Object Computing
+// Washington University
+// St. Louis, MO
+// USA
+// http://www.cs.wustl.edu/~schmidt/doc-center.html
+// and
+// Distributed Object Computing Laboratory
+// University of California at Irvine
+// Irvine, CA
+// USA
+// http://doc.ece.uci.edu/
+// and
+// Institute for Software Integrated Systems
+// Vanderbilt University
+// Nashville, TN
+// USA
+// http://www.isis.vanderbilt.edu/
+//
+// Information about TAO is available at:
+// http://www.cs.wustl.edu/~schmidt/TAO.html
+
+
+// TAO_IDL - Generated from
+// be\be_codegen.cpp:603
+
+#ifndef _TAO_IDL____ORBSVCS_ORBSVCS_IFRSERVICE_IFR_EXTENDEDS_CPP_
+#define _TAO_IDL____ORBSVCS_ORBSVCS_IFRSERVICE_IFR_EXTENDEDS_CPP_
+
+
+#include "IFR_ExtendedS.h"
+#include "tao/PortableServer/Operation_Table_Perfect_Hash.h"
+#include "tao/PortableServer/Upcall_Command.h"
+#include "tao/PortableServer/Upcall_Wrapper.h"
+#include "tao/TAO_Server_Request.h"
+#include "tao/ORB_Core.h"
+#include "tao/Profile.h"
+#include "tao/Stub.h"
+#include "tao/IFR_Client_Adapter.h"
+#include "tao/Object_T.h"
+#include "tao/AnyTypeCode/TypeCode.h"
+#include "tao/AnyTypeCode/DynamicC.h"
+#include "tao/CDR.h"
+#include "tao/operation_details.h"
+#include "tao/PortableInterceptor.h"
+#include "tao/PortableServer/Basic_SArguments.h"
+#include "tao/PortableServer/Object_SArgument_T.h"
+#include "tao/PortableServer/Special_Basic_SArguments.h"
+#include "tao/PortableServer/UB_String_SArguments.h"
+#include "tao/PortableServer/Var_Size_SArgument_T.h"
+#include "tao/PortableServer/TypeCode_SArg_Traits.h"
+#include "tao/PortableServer/Object_SArg_Traits.h"
+#include "tao/PortableServer/get_arg.h"
+#include "tao/Special_Basic_Arguments.h"
+#include "tao/UB_String_Arguments.h"
+#include "tao/Basic_Arguments.h"
+#include "tao/Object_Argument_T.h"
+#include "tao/Special_Basic_Arguments.h"
+#include "tao/UB_String_Arguments.h"
+#include "tao/Var_Size_Argument_T.h"
+#include "ace/Dynamic_Service.h"
+#include "ace/Malloc_Allocator.h"
+
+#if !defined (__ACE_INLINE__)
+#include "IFR_ExtendedS.inl"
+#endif /* !defined INLINE */
+
+TAO_BEGIN_VERSIONED_NAMESPACE_DECL
+
+
+
+// TAO_IDL - Generated from
+// be\be_visitor_arg_traits.cpp:72
+
+
+TAO_END_VERSIONED_NAMESPACE_DECL
+
+
+TAO_BEGIN_VERSIONED_NAMESPACE_DECL
+
+
+// Arg traits specializations.
+namespace TAO
+{
+
+ // TAO_IDL - Generated from
+ // be\be_visitor_arg_traits.cpp:817
+
+#if !defined (_CORBA_DEFINITIONKIND__SARG_TRAITS_)
+#define _CORBA_DEFINITIONKIND__SARG_TRAITS_
+
+ template<>
+ class SArg_Traits<CORBA::DefinitionKind>
+ : public
+ Basic_SArg_Traits_T<
+ CORBA::DefinitionKind,
+ TAO::Any_Insert_Policy_Stream <CORBA::DefinitionKind>
+ >
+ {
+ };
+
+#endif /* end #if !defined */
+
+ // TAO_IDL - Generated from
+ // be\be_visitor_arg_traits.cpp:140
+
+#if !defined (_CORBA_REPOSITORY__SARG_TRAITS_)
+#define _CORBA_REPOSITORY__SARG_TRAITS_
+
+ template<>
+ class SArg_Traits<CORBA::Repository>
+ : public
+ Object_SArg_Traits_T<
+ CORBA::Repository_ptr,
+ CORBA::Repository_var,
+ CORBA::Repository_out,
+ TAO::Any_Insert_Policy_Stream <CORBA::Repository_ptr>
+ >
+ {
+ };
+
+#endif /* end #if !defined */
+
+ // TAO_IDL - Generated from
+ // be\be_visitor_arg_traits.cpp:140
+
+#if !defined (_CORBA_CONTAINER__SARG_TRAITS_)
+#define _CORBA_CONTAINER__SARG_TRAITS_
+
+ template<>
+ class SArg_Traits<CORBA::Container>
+ : public
+ Object_SArg_Traits_T<
+ CORBA::Container_ptr,
+ CORBA::Container_var,
+ CORBA::Container_out,
+ TAO::Any_Insert_Policy_Stream <CORBA::Container_ptr>
+ >
+ {
+ };
+
+#endif /* end #if !defined */
+
+ // TAO_IDL - Generated from
+ // be\be_visitor_arg_traits.cpp:140
+
+#if !defined (_CORBA_IDLTYPE__SARG_TRAITS_)
+#define _CORBA_IDLTYPE__SARG_TRAITS_
+
+ template<>
+ class SArg_Traits<CORBA::IDLType>
+ : public
+ Object_SArg_Traits_T<
+ CORBA::IDLType_ptr,
+ CORBA::IDLType_var,
+ CORBA::IDLType_out,
+ TAO::Any_Insert_Policy_Stream <CORBA::IDLType_ptr>
+ >
+ {
+ };
+
+#endif /* end #if !defined */
+
+ // TAO_IDL - Generated from
+ // be\be_visitor_arg_traits.cpp:611
+
+#if !defined (_CORBA_INTERFACEDEFSEQ__SARG_TRAITS_)
+#define _CORBA_INTERFACEDEFSEQ__SARG_TRAITS_
+
+ template<>
+ class SArg_Traits<CORBA::InterfaceDefSeq>
+ : public
+ Var_Size_SArg_Traits_T<
+ CORBA::InterfaceDefSeq,
+ TAO::Any_Insert_Policy_Stream <CORBA::InterfaceDefSeq>
+ >
+ {
+ };
+
+#endif /* end #if !defined */
+
+ // TAO_IDL - Generated from
+ // be\be_visitor_arg_traits.cpp:611
+
+#if !defined (_CORBA_VALUEDEFSEQ__SARG_TRAITS_)
+#define _CORBA_VALUEDEFSEQ__SARG_TRAITS_
+
+ template<>
+ class SArg_Traits<CORBA::ValueDefSeq>
+ : public
+ Var_Size_SArg_Traits_T<
+ CORBA::ValueDefSeq,
+ TAO::Any_Insert_Policy_Stream <CORBA::ValueDefSeq>
+ >
+ {
+ };
+
+#endif /* end #if !defined */
+
+ // TAO_IDL - Generated from
+ // be\be_visitor_arg_traits.cpp:611
+
+#if !defined (_CORBA_INITIALIZERSEQ__SARG_TRAITS_)
+#define _CORBA_INITIALIZERSEQ__SARG_TRAITS_
+
+ template<>
+ class SArg_Traits<CORBA::InitializerSeq>
+ : public
+ Var_Size_SArg_Traits_T<
+ CORBA::InitializerSeq,
+ TAO::Any_Insert_Policy_Stream <CORBA::InitializerSeq>
+ >
+ {
+ };
+
+#endif /* end #if !defined */
+
+ // TAO_IDL - Generated from
+ // be\be_visitor_arg_traits.cpp:611
+
+#if !defined (_CORBA_EXTINITIALIZERSEQ__SARG_TRAITS_)
+#define _CORBA_EXTINITIALIZERSEQ__SARG_TRAITS_
+
+ template<>
+ class SArg_Traits<CORBA::ExtInitializerSeq>
+ : public
+ Var_Size_SArg_Traits_T<
+ CORBA::ExtInitializerSeq,
+ TAO::Any_Insert_Policy_Stream <CORBA::ExtInitializerSeq>
+ >
+ {
+ };
+
+#endif /* end #if !defined */
+
+ // TAO_IDL - Generated from
+ // be\be_visitor_arg_traits.cpp:611
+
+#if !defined (_CORBA_EXCEPTIONDEFSEQ__SARG_TRAITS_)
+#define _CORBA_EXCEPTIONDEFSEQ__SARG_TRAITS_
+
+ template<>
+ class SArg_Traits<CORBA::ExceptionDefSeq>
+ : public
+ Var_Size_SArg_Traits_T<
+ CORBA::ExceptionDefSeq,
+ TAO::Any_Insert_Policy_Stream <CORBA::ExceptionDefSeq>
+ >
+ {
+ };
+
+#endif /* end #if !defined */
+
+ // TAO_IDL - Generated from
+ // be\be_visitor_arg_traits.cpp:817
+
+#if !defined (_CORBA_ATTRIBUTEMODE__SARG_TRAITS_)
+#define _CORBA_ATTRIBUTEMODE__SARG_TRAITS_
+
+ template<>
+ class SArg_Traits<CORBA::AttributeMode>
+ : public
+ Basic_SArg_Traits_T<
+ CORBA::AttributeMode,
+ TAO::Any_Insert_Policy_Stream <CORBA::AttributeMode>
+ >
+ {
+ };
+
+#endif /* end #if !defined */
+
+ // TAO_IDL - Generated from
+ // be\be_visitor_arg_traits.cpp:140
+
+#if !defined (_CORBA_ATTRIBUTEDEF__SARG_TRAITS_)
+#define _CORBA_ATTRIBUTEDEF__SARG_TRAITS_
+
+ template<>
+ class SArg_Traits<CORBA::AttributeDef>
+ : public
+ Object_SArg_Traits_T<
+ CORBA::AttributeDef_ptr,
+ CORBA::AttributeDef_var,
+ CORBA::AttributeDef_out,
+ TAO::Any_Insert_Policy_Stream <CORBA::AttributeDef_ptr>
+ >
+ {
+ };
+
+#endif /* end #if !defined */
+
+ // TAO_IDL - Generated from
+ // be\be_visitor_arg_traits.cpp:140
+
+#if !defined (_CORBA_EXTATTRIBUTEDEF__SARG_TRAITS_)
+#define _CORBA_EXTATTRIBUTEDEF__SARG_TRAITS_
+
+ template<>
+ class SArg_Traits<CORBA::ExtAttributeDef>
+ : public
+ Object_SArg_Traits_T<
+ CORBA::ExtAttributeDef_ptr,
+ CORBA::ExtAttributeDef_var,
+ CORBA::ExtAttributeDef_out,
+ TAO::Any_Insert_Policy_Stream <CORBA::ExtAttributeDef_ptr>
+ >
+ {
+ };
+
+#endif /* end #if !defined */
+
+ // TAO_IDL - Generated from
+ // be\be_visitor_arg_traits.cpp:817
+
+#if !defined (_CORBA_OPERATIONMODE__SARG_TRAITS_)
+#define _CORBA_OPERATIONMODE__SARG_TRAITS_
+
+ template<>
+ class SArg_Traits<CORBA::OperationMode>
+ : public
+ Basic_SArg_Traits_T<
+ CORBA::OperationMode,
+ TAO::Any_Insert_Policy_Stream <CORBA::OperationMode>
+ >
+ {
+ };
+
+#endif /* end #if !defined */
+
+ // TAO_IDL - Generated from
+ // be\be_visitor_arg_traits.cpp:611
+
+#if !defined (_CORBA_PARDESCRIPTIONSEQ__SARG_TRAITS_)
+#define _CORBA_PARDESCRIPTIONSEQ__SARG_TRAITS_
+
+ template<>
+ class SArg_Traits<CORBA::ParDescriptionSeq>
+ : public
+ Var_Size_SArg_Traits_T<
+ CORBA::ParDescriptionSeq,
+ TAO::Any_Insert_Policy_Stream <CORBA::ParDescriptionSeq>
+ >
+ {
+ };
+
+#endif /* end #if !defined */
+
+ // TAO_IDL - Generated from
+ // be\be_visitor_arg_traits.cpp:611
+
+#if !defined (_CORBA_CONTEXTIDSEQ__SARG_TRAITS_)
+#define _CORBA_CONTEXTIDSEQ__SARG_TRAITS_
+
+ template<>
+ class SArg_Traits<CORBA::ContextIdSeq>
+ : public
+ Var_Size_SArg_Traits_T<
+ CORBA::ContextIdSeq,
+ TAO::Any_Insert_Policy_Stream <CORBA::ContextIdSeq>
+ >
+ {
+ };
+
+#endif /* end #if !defined */
+
+ // TAO_IDL - Generated from
+ // be\be_visitor_arg_traits.cpp:140
+
+#if !defined (_CORBA_OPERATIONDEF__SARG_TRAITS_)
+#define _CORBA_OPERATIONDEF__SARG_TRAITS_
+
+ template<>
+ class SArg_Traits<CORBA::OperationDef>
+ : public
+ Object_SArg_Traits_T<
+ CORBA::OperationDef_ptr,
+ CORBA::OperationDef_var,
+ CORBA::OperationDef_out,
+ TAO::Any_Insert_Policy_Stream <CORBA::OperationDef_ptr>
+ >
+ {
+ };
+
+#endif /* end #if !defined */
+
+ // TAO_IDL - Generated from
+ // be\be_visitor_arg_traits.cpp:140
+
+#if !defined (_CORBA_VALUEMEMBERDEF__SARG_TRAITS_)
+#define _CORBA_VALUEMEMBERDEF__SARG_TRAITS_
+
+ template<>
+ class SArg_Traits<CORBA::ValueMemberDef>
+ : public
+ Object_SArg_Traits_T<
+ CORBA::ValueMemberDef_ptr,
+ CORBA::ValueMemberDef_var,
+ CORBA::ValueMemberDef_out,
+ TAO::Any_Insert_Policy_Stream <CORBA::ValueMemberDef_ptr>
+ >
+ {
+ };
+
+#endif /* end #if !defined */
+
+ // TAO_IDL - Generated from
+ // be\be_visitor_arg_traits.cpp:140
+
+#if !defined (_CORBA_VALUEDEF__SARG_TRAITS_)
+#define _CORBA_VALUEDEF__SARG_TRAITS_
+
+ template<>
+ class SArg_Traits<CORBA::ValueDef>
+ : public
+ Object_SArg_Traits_T<
+ CORBA::ValueDef_ptr,
+ CORBA::ValueDef_var,
+ CORBA::ValueDef_out,
+ TAO::Any_Insert_Policy_Stream <CORBA::ValueDef_ptr>
+ >
+ {
+ };
+
+#endif /* end #if !defined */
+
+ // TAO_IDL - Generated from
+ // be\be_visitor_arg_traits.cpp:859
+
+#if !defined (_CORBA_VALUEDEF_FULLVALUEDESCRIPTION__SARG_TRAITS_)
+#define _CORBA_VALUEDEF_FULLVALUEDESCRIPTION__SARG_TRAITS_
+
+ template<>
+ class SArg_Traits<CORBA::ValueDef::FullValueDescription>
+ : public
+ Var_Size_SArg_Traits_T<
+ CORBA::ValueDef::FullValueDescription,
+ TAO::Any_Insert_Policy_Stream <CORBA::ValueDef::FullValueDescription>
+ >
+ {
+ };
+
+#endif /* end #if !defined */
+
+ // TAO_IDL - Generated from
+ // be\be_visitor_arg_traits.cpp:859
+
+#if !defined (_CORBA_EXTVALUEDEF_EXTFULLVALUEDESCRIPTION__SARG_TRAITS_)
+#define _CORBA_EXTVALUEDEF_EXTFULLVALUEDESCRIPTION__SARG_TRAITS_
+
+ template<>
+ class SArg_Traits<CORBA::ExtValueDef::ExtFullValueDescription>
+ : public
+ Var_Size_SArg_Traits_T<
+ CORBA::ExtValueDef::ExtFullValueDescription,
+ TAO::Any_Insert_Policy_Stream <CORBA::ExtValueDef::ExtFullValueDescription>
+ >
+ {
+ };
+
+#endif /* end #if !defined */
+}
+
+TAO_END_VERSIONED_NAMESPACE_DECL
+
+
+TAO_BEGIN_VERSIONED_NAMESPACE_DECL
+
+
+
+
+// TAO_IDL - Generated from
+// be\be_visitor_arg_traits.cpp:72
+
+
+TAO_END_VERSIONED_NAMESPACE_DECL
+
+
+TAO_BEGIN_VERSIONED_NAMESPACE_DECL
+
+
+// Arg traits specializations.
+namespace TAO
+{
+
+ // TAO_IDL - Generated from
+ // be\be_visitor_arg_traits.cpp:817
+
+#if !defined (_CORBA_DEFINITIONKIND__ARG_TRAITS_)
+#define _CORBA_DEFINITIONKIND__ARG_TRAITS_
+
+ template<>
+ class Arg_Traits<CORBA::DefinitionKind>
+ : public
+ Basic_Arg_Traits_T<
+ CORBA::DefinitionKind,
+ TAO::Any_Insert_Policy_Stream <CORBA::DefinitionKind>
+ >
+ {
+ };
+
+#endif /* end #if !defined */
+
+ // TAO_IDL - Generated from
+ // be\be_visitor_arg_traits.cpp:140
+
+#if !defined (_CORBA_REPOSITORY__ARG_TRAITS_)
+#define _CORBA_REPOSITORY__ARG_TRAITS_
+
+ template<>
+ class Arg_Traits<CORBA::Repository>
+ : public
+ Object_Arg_Traits_T<
+ CORBA::Repository_ptr,
+ CORBA::Repository_var,
+ CORBA::Repository_out,
+ TAO::Objref_Traits<CORBA::Repository>,
+ TAO::Any_Insert_Policy_Stream <CORBA::Repository_ptr>
+ >
+ {
+ };
+
+#endif /* end #if !defined */
+
+ // TAO_IDL - Generated from
+ // be\be_visitor_arg_traits.cpp:140
+
+#if !defined (_CORBA_CONTAINER__ARG_TRAITS_)
+#define _CORBA_CONTAINER__ARG_TRAITS_
+
+ template<>
+ class Arg_Traits<CORBA::Container>
+ : public
+ Object_Arg_Traits_T<
+ CORBA::Container_ptr,
+ CORBA::Container_var,
+ CORBA::Container_out,
+ TAO::Objref_Traits<CORBA::Container>,
+ TAO::Any_Insert_Policy_Stream <CORBA::Container_ptr>
+ >
+ {
+ };
+
+#endif /* end #if !defined */
+
+ // TAO_IDL - Generated from
+ // be\be_visitor_arg_traits.cpp:140
+
+#if !defined (_CORBA_IDLTYPE__ARG_TRAITS_)
+#define _CORBA_IDLTYPE__ARG_TRAITS_
+
+ template<>
+ class Arg_Traits<CORBA::IDLType>
+ : public
+ Object_Arg_Traits_T<
+ CORBA::IDLType_ptr,
+ CORBA::IDLType_var,
+ CORBA::IDLType_out,
+ TAO::Objref_Traits<CORBA::IDLType>,
+ TAO::Any_Insert_Policy_Stream <CORBA::IDLType_ptr>
+ >
+ {
+ };
+
+#endif /* end #if !defined */
+
+ // TAO_IDL - Generated from
+ // be\be_visitor_arg_traits.cpp:611
+
+#if !defined (_CORBA_INTERFACEDEFSEQ__ARG_TRAITS_)
+#define _CORBA_INTERFACEDEFSEQ__ARG_TRAITS_
+
+ template<>
+ class Arg_Traits<CORBA::InterfaceDefSeq>
+ : public
+ Var_Size_Arg_Traits_T<
+ CORBA::InterfaceDefSeq,
+ TAO::Any_Insert_Policy_Stream <CORBA::InterfaceDefSeq>
+ >
+ {
+ };
+
+#endif /* end #if !defined */
+
+ // TAO_IDL - Generated from
+ // be\be_visitor_arg_traits.cpp:611
+
+#if !defined (_CORBA_VALUEDEFSEQ__ARG_TRAITS_)
+#define _CORBA_VALUEDEFSEQ__ARG_TRAITS_
+
+ template<>
+ class Arg_Traits<CORBA::ValueDefSeq>
+ : public
+ Var_Size_Arg_Traits_T<
+ CORBA::ValueDefSeq,
+ TAO::Any_Insert_Policy_Stream <CORBA::ValueDefSeq>
+ >
+ {
+ };
+
+#endif /* end #if !defined */
+
+ // TAO_IDL - Generated from
+ // be\be_visitor_arg_traits.cpp:611
+
+#if !defined (_CORBA_INITIALIZERSEQ__ARG_TRAITS_)
+#define _CORBA_INITIALIZERSEQ__ARG_TRAITS_
+
+ template<>
+ class Arg_Traits<CORBA::InitializerSeq>
+ : public
+ Var_Size_Arg_Traits_T<
+ CORBA::InitializerSeq,
+ TAO::Any_Insert_Policy_Stream <CORBA::InitializerSeq>
+ >
+ {
+ };
+
+#endif /* end #if !defined */
+
+ // TAO_IDL - Generated from
+ // be\be_visitor_arg_traits.cpp:611
+
+#if !defined (_CORBA_EXTINITIALIZERSEQ__ARG_TRAITS_)
+#define _CORBA_EXTINITIALIZERSEQ__ARG_TRAITS_
+
+ template<>
+ class Arg_Traits<CORBA::ExtInitializerSeq>
+ : public
+ Var_Size_Arg_Traits_T<
+ CORBA::ExtInitializerSeq,
+ TAO::Any_Insert_Policy_Stream <CORBA::ExtInitializerSeq>
+ >
+ {
+ };
+
+#endif /* end #if !defined */
+
+ // TAO_IDL - Generated from
+ // be\be_visitor_arg_traits.cpp:611
+
+#if !defined (_CORBA_EXCEPTIONDEFSEQ__ARG_TRAITS_)
+#define _CORBA_EXCEPTIONDEFSEQ__ARG_TRAITS_
+
+ template<>
+ class Arg_Traits<CORBA::ExceptionDefSeq>
+ : public
+ Var_Size_Arg_Traits_T<
+ CORBA::ExceptionDefSeq,
+ TAO::Any_Insert_Policy_Stream <CORBA::ExceptionDefSeq>
+ >
+ {
+ };
+
+#endif /* end #if !defined */
+
+ // TAO_IDL - Generated from
+ // be\be_visitor_arg_traits.cpp:817
+
+#if !defined (_CORBA_ATTRIBUTEMODE__ARG_TRAITS_)
+#define _CORBA_ATTRIBUTEMODE__ARG_TRAITS_
+
+ template<>
+ class Arg_Traits<CORBA::AttributeMode>
+ : public
+ Basic_Arg_Traits_T<
+ CORBA::AttributeMode,
+ TAO::Any_Insert_Policy_Stream <CORBA::AttributeMode>
+ >
+ {
+ };
+
+#endif /* end #if !defined */
+
+ // TAO_IDL - Generated from
+ // be\be_visitor_arg_traits.cpp:140
+
+#if !defined (_CORBA_ATTRIBUTEDEF__ARG_TRAITS_)
+#define _CORBA_ATTRIBUTEDEF__ARG_TRAITS_
+
+ template<>
+ class Arg_Traits<CORBA::AttributeDef>
+ : public
+ Object_Arg_Traits_T<
+ CORBA::AttributeDef_ptr,
+ CORBA::AttributeDef_var,
+ CORBA::AttributeDef_out,
+ TAO::Objref_Traits<CORBA::AttributeDef>,
+ TAO::Any_Insert_Policy_Stream <CORBA::AttributeDef_ptr>
+ >
+ {
+ };
+
+#endif /* end #if !defined */
+
+ // TAO_IDL - Generated from
+ // be\be_visitor_arg_traits.cpp:140
+
+#if !defined (_CORBA_EXTATTRIBUTEDEF__ARG_TRAITS_)
+#define _CORBA_EXTATTRIBUTEDEF__ARG_TRAITS_
+
+ template<>
+ class Arg_Traits<CORBA::ExtAttributeDef>
+ : public
+ Object_Arg_Traits_T<
+ CORBA::ExtAttributeDef_ptr,
+ CORBA::ExtAttributeDef_var,
+ CORBA::ExtAttributeDef_out,
+ TAO::Objref_Traits<CORBA::ExtAttributeDef>,
+ TAO::Any_Insert_Policy_Stream <CORBA::ExtAttributeDef_ptr>
+ >
+ {
+ };
+
+#endif /* end #if !defined */
+
+ // TAO_IDL - Generated from
+ // be\be_visitor_arg_traits.cpp:817
+
+#if !defined (_CORBA_OPERATIONMODE__ARG_TRAITS_)
+#define _CORBA_OPERATIONMODE__ARG_TRAITS_
+
+ template<>
+ class Arg_Traits<CORBA::OperationMode>
+ : public
+ Basic_Arg_Traits_T<
+ CORBA::OperationMode,
+ TAO::Any_Insert_Policy_Stream <CORBA::OperationMode>
+ >
+ {
+ };
+
+#endif /* end #if !defined */
+
+ // TAO_IDL - Generated from
+ // be\be_visitor_arg_traits.cpp:611
+
+#if !defined (_CORBA_PARDESCRIPTIONSEQ__ARG_TRAITS_)
+#define _CORBA_PARDESCRIPTIONSEQ__ARG_TRAITS_
+
+ template<>
+ class Arg_Traits<CORBA::ParDescriptionSeq>
+ : public
+ Var_Size_Arg_Traits_T<
+ CORBA::ParDescriptionSeq,
+ TAO::Any_Insert_Policy_Stream <CORBA::ParDescriptionSeq>
+ >
+ {
+ };
+
+#endif /* end #if !defined */
+
+ // TAO_IDL - Generated from
+ // be\be_visitor_arg_traits.cpp:611
+
+#if !defined (_CORBA_CONTEXTIDSEQ__ARG_TRAITS_)
+#define _CORBA_CONTEXTIDSEQ__ARG_TRAITS_
+
+ template<>
+ class Arg_Traits<CORBA::ContextIdSeq>
+ : public
+ Var_Size_Arg_Traits_T<
+ CORBA::ContextIdSeq,
+ TAO::Any_Insert_Policy_Stream <CORBA::ContextIdSeq>
+ >
+ {
+ };
+
+#endif /* end #if !defined */
+
+ // TAO_IDL - Generated from
+ // be\be_visitor_arg_traits.cpp:140
+
+#if !defined (_CORBA_OPERATIONDEF__ARG_TRAITS_)
+#define _CORBA_OPERATIONDEF__ARG_TRAITS_
+
+ template<>
+ class Arg_Traits<CORBA::OperationDef>
+ : public
+ Object_Arg_Traits_T<
+ CORBA::OperationDef_ptr,
+ CORBA::OperationDef_var,
+ CORBA::OperationDef_out,
+ TAO::Objref_Traits<CORBA::OperationDef>,
+ TAO::Any_Insert_Policy_Stream <CORBA::OperationDef_ptr>
+ >
+ {
+ };
+
+#endif /* end #if !defined */
+
+ // TAO_IDL - Generated from
+ // be\be_visitor_arg_traits.cpp:140
+
+#if !defined (_CORBA_VALUEMEMBERDEF__ARG_TRAITS_)
+#define _CORBA_VALUEMEMBERDEF__ARG_TRAITS_
+
+ template<>
+ class Arg_Traits<CORBA::ValueMemberDef>
+ : public
+ Object_Arg_Traits_T<
+ CORBA::ValueMemberDef_ptr,
+ CORBA::ValueMemberDef_var,
+ CORBA::ValueMemberDef_out,
+ TAO::Objref_Traits<CORBA::ValueMemberDef>,
+ TAO::Any_Insert_Policy_Stream <CORBA::ValueMemberDef_ptr>
+ >
+ {
+ };
+
+#endif /* end #if !defined */
+
+ // TAO_IDL - Generated from
+ // be\be_visitor_arg_traits.cpp:140
+
+#if !defined (_CORBA_VALUEDEF__ARG_TRAITS_)
+#define _CORBA_VALUEDEF__ARG_TRAITS_
+
+ template<>
+ class Arg_Traits<CORBA::ValueDef>
+ : public
+ Object_Arg_Traits_T<
+ CORBA::ValueDef_ptr,
+ CORBA::ValueDef_var,
+ CORBA::ValueDef_out,
+ TAO::Objref_Traits<CORBA::ValueDef>,
+ TAO::Any_Insert_Policy_Stream <CORBA::ValueDef_ptr>
+ >
+ {
+ };
+
+#endif /* end #if !defined */
+
+ // TAO_IDL - Generated from
+ // be\be_visitor_arg_traits.cpp:859
+
+#if !defined (_CORBA_VALUEDEF_FULLVALUEDESCRIPTION__ARG_TRAITS_)
+#define _CORBA_VALUEDEF_FULLVALUEDESCRIPTION__ARG_TRAITS_
+
+ template<>
+ class Arg_Traits<CORBA::ValueDef::FullValueDescription>
+ : public
+ Var_Size_Arg_Traits_T<
+ CORBA::ValueDef::FullValueDescription,
+ TAO::Any_Insert_Policy_Stream <CORBA::ValueDef::FullValueDescription>
+ >
+ {
+ };
+
+#endif /* end #if !defined */
+
+ // TAO_IDL - Generated from
+ // be\be_visitor_arg_traits.cpp:859
+
+#if !defined (_CORBA_EXTVALUEDEF_EXTFULLVALUEDESCRIPTION__ARG_TRAITS_)
+#define _CORBA_EXTVALUEDEF_EXTFULLVALUEDESCRIPTION__ARG_TRAITS_
+
+ template<>
+ class Arg_Traits<CORBA::ExtValueDef::ExtFullValueDescription>
+ : public
+ Var_Size_Arg_Traits_T<
+ CORBA::ExtValueDef::ExtFullValueDescription,
+ TAO::Any_Insert_Policy_Stream <CORBA::ExtValueDef::ExtFullValueDescription>
+ >
+ {
+ };
+
+#endif /* end #if !defined */
+}
+
+TAO_END_VERSIONED_NAMESPACE_DECL
+
+
+TAO_BEGIN_VERSIONED_NAMESPACE_DECL
+
+
+
+
+// TAO_IDL - Generated from
+// be\be_interface.cpp:1499
+
+class TAO_CORBA_FixedDef_Perfect_Hash_OpTable
+ : public TAO_Perfect_Hash_OpTable
+{
+private:
+ unsigned int hash (const char *str, unsigned int len);
+
+public:
+ const TAO_operation_db_entry * lookup (const char *str, unsigned int len);
+};
+
+/* C++ code produced by gperf version 2.8 (ACE version) */
+/* Command-line: C:\ACE\latest\ACE_wrappers\bin\gperf.exe -m -M -J -c -C -D -E -T -f 0 -F 0,0 -a -o -t -p -K opname -L C++ -Z TAO_CORBA_FixedDef_Perfect_Hash_OpTable -N lookup */
+unsigned int
+TAO_CORBA_FixedDef_Perfect_Hash_OpTable::hash (const char *str, unsigned int len)
+{
+ static const unsigned char asso_values[] =
+ {
+#if defined (ACE_MVS)
+ 19, 19, 19, 19, 19, 19, 19, 19, 19, 19,
+ 19, 19, 19, 19, 19, 19, 19, 19, 19, 19,
+ 19, 19, 19, 19, 19, 19, 19, 19, 19, 19,
+ 19, 19, 19, 19, 19, 19, 19, 19, 19, 19,
+ 19, 19, 19, 19, 19, 19, 19, 19, 19, 19,
+ 19, 19, 19, 19, 19, 19, 19, 19, 19, 19,
+ 19, 19, 19, 19, 19, 19, 19, 19, 19, 19,
+ 19, 19, 19, 19, 19, 19, 19, 19, 19, 19,
+ 19, 19, 19, 19, 19, 19, 19, 19, 19, 19,
+ 19, 19, 19, 19, 19, 19, 19, 19, 19, 19,
+ 19, 19, 19, 19, 19, 19, 19, 19, 19, 0,
+ 19, 19, 19, 19, 19, 19, 19, 19, 19, 19,
+ 19, 19, 19, 19, 19, 19, 19, 19, 19, 0,
+ 19, 19, 0, 0, 19, 19, 19, 19, 19, 19,
+ 19, 19, 19, 19, 19, 19, 19, 19, 19, 19,
+ 19, 19, 19, 19, 19, 19, 19, 19, 19, 19,
+ 19, 19, 0, 5, 19, 19, 19, 19, 0, 19,
+ 19, 19, 19, 19, 19, 19, 19, 19, 19, 19,
+ 19, 19, 19, 19, 19, 19, 19, 19, 19, 19,
+ 19, 19, 19, 19, 19, 19, 19, 19, 19, 19,
+ 19, 19, 19, 19, 19, 19, 19, 19, 19, 19,
+ 19, 19, 19, 19, 19, 19, 19, 19, 19, 19,
+ 19, 19, 19, 19, 19, 19, 19, 19, 19, 19,
+ 19, 19, 19, 19, 19, 19, 19, 19, 19, 19,
+ 19, 19, 19, 19, 19, 19, 19, 19, 19, 19,
+ 19, 19, 19, 19, 19, 19,
+#else
+ 19, 19, 19, 19, 19, 19, 19, 19, 19, 19,
+ 19, 19, 19, 19, 19, 19, 19, 19, 19, 19,
+ 19, 19, 19, 19, 19, 19, 19, 19, 19, 19,
+ 19, 19, 19, 19, 19, 19, 19, 19, 19, 19,
+ 19, 19, 19, 19, 19, 19, 19, 19, 19, 19,
+ 19, 19, 19, 19, 19, 19, 19, 19, 19, 19,
+ 19, 19, 19, 19, 19, 19, 19, 19, 19, 19,
+ 19, 19, 19, 19, 19, 19, 19, 19, 19, 19,
+ 19, 19, 19, 19, 19, 19, 19, 19, 19, 19,
+ 19, 19, 19, 19, 19, 0, 19, 0, 19, 19,
+ 0, 0, 19, 19, 19, 19, 19, 19, 19, 19,
+ 19, 19, 19, 19, 19, 0, 5, 19, 19, 19,
+ 19, 0, 19, 19, 19, 19, 19, 19,
+#endif /* ACE_MVS */
+ };
+ return len + asso_values[(int) str[len - 1]] + asso_values[(int) str[0]];
+}
+
+const TAO_operation_db_entry *
+TAO_CORBA_FixedDef_Perfect_Hash_OpTable::lookup (const char *str, unsigned int len)
+{
+ enum
+ {
+ TOTAL_KEYWORDS = 12,
+ MIN_WORD_LENGTH = 5,
+ MAX_WORD_LENGTH = 14,
+ MIN_HASH_VALUE = 5,
+ MAX_HASH_VALUE = 18,
+ HASH_VALUE_RANGE = 14,
+ DUPLICATES = 4,
+ WORDLIST_SIZE = 17
+ };
+
+ static const TAO_operation_db_entry wordlist[] =
+ {
+ {"",0,0},{"",0,0},{"",0,0},{"",0,0},{"",0,0},
+ {"_is_a", &POA_CORBA::FixedDef::_is_a_skel, 0},
+ {"destroy", &POA_CORBA::FixedDef::destroy_skel, 0},
+ {"_get_type", &POA_CORBA::FixedDef::_get_type_skel, 0},
+ {"_get_scale", &POA_CORBA::FixedDef::_get_scale_skel, 0},
+ {"_interface", &POA_CORBA::FixedDef::_interface_skel, 0},
+ {"_set_scale", &POA_CORBA::FixedDef::_set_scale_skel, 0},
+ {"_get_digits", &POA_CORBA::FixedDef::_get_digits_skel, 0},
+ {"_set_digits", &POA_CORBA::FixedDef::_set_digits_skel, 0},
+ {"_get_def_kind", &POA_CORBA::FixedDef::_get_def_kind_skel, 0},
+ {"_repository_id", &POA_CORBA::FixedDef::_repository_id_skel, 0},
+ {"_component", &POA_CORBA::FixedDef::_component_skel, 0},
+ {"_non_existent", &POA_CORBA::FixedDef::_non_existent_skel, 0},
+ };
+
+ static const signed char lookup[] =
+ {
+ -1, -8, -3, -11, -2, 5, -1, 6, -1, 7, -27, -26, -1, 13,
+ 14, 15, -1, -1, 16,
+ };
+
+ if (len <= MAX_WORD_LENGTH && len >= MIN_WORD_LENGTH)
+ {
+ unsigned int key = hash (str, len);
+
+ if (key <= MAX_HASH_VALUE && key >= MIN_HASH_VALUE)
+ {
+ int slot = lookup[key];
+
+ if (slot >= 0 && slot < WORDLIST_SIZE)
+ {
+ const char *s = wordlist[slot].opname;
+
+ if (*str == *s && !strncmp (str + 1, s + 1, len - 1))
+ return &wordlist[slot];
+ }
+ else if (slot < 0 && slot >= -MAX_HASH_VALUE)
+ return 0;
+ else
+ {
+ unsigned int offset = key + slot + (slot > 0 ? -MAX_HASH_VALUE : MAX_HASH_VALUE);
+ const TAO_operation_db_entry *base = &wordlist[-lookup[offset]];
+ const TAO_operation_db_entry *ptr = base + -lookup[offset + 1];
+
+ while (--ptr >= base)
+ if (*str == *ptr->opname && !strncmp (str + 1, ptr->opname + 1, len - 1))
+ return ptr;
+ }
+ }
+ }
+ return 0;
+}
+
+static TAO_CORBA_FixedDef_Perfect_Hash_OpTable tao_CORBA_FixedDef_optable;
+
+// TAO_IDL - Generated from
+// be\be_visitor_interface/interface_ss.cpp:966
+
+TAO::Collocation_Proxy_Broker *
+CORBA__TAO_FixedDef_Proxy_Broker_Factory_function ( ::CORBA::Object_ptr)
+{
+ return reinterpret_cast<TAO::Collocation_Proxy_Broker *> (0xdead); // Dummy
+}
+
+int
+CORBA__TAO_FixedDef_Proxy_Broker_Factory_Initializer (size_t)
+{
+ CORBA__TAO_FixedDef_Proxy_Broker_Factory_function_pointer =
+ CORBA__TAO_FixedDef_Proxy_Broker_Factory_function;
+
+ return 0;
+}
+
+static int
+CORBA__TAO_FixedDef_Proxy_Broker_Stub_Factory_Initializer_Scarecrow =
+ CORBA__TAO_FixedDef_Proxy_Broker_Factory_Initializer (
+ reinterpret_cast<size_t> (CORBA__TAO_FixedDef_Proxy_Broker_Factory_Initializer)
+ );
+
+// TAO_IDL - Generated from
+// be\be_visitor_interface/interface_ss.cpp:103
+
+POA_CORBA::FixedDef::FixedDef (void)
+ : TAO_ServantBase ()
+{
+ this->optable_ = &tao_CORBA_FixedDef_optable;
+}
+
+POA_CORBA::FixedDef::FixedDef (const FixedDef& rhs)
+ : TAO_Abstract_ServantBase (rhs),
+ TAO_ServantBase (rhs),
+ POA_CORBA::IRObject (rhs),
+ POA_CORBA::IDLType (rhs)
+{
+}
+
+POA_CORBA::FixedDef::~FixedDef (void)
+{
+}namespace POA_CORBA
+{
+
+
+ // TAO_IDL - Generated from
+ // be\be_visitor_operation/upcall_command_ss.cpp:127
+
+ class _get_digits_FixedDef
+ : public TAO::Upcall_Command
+ {
+ public:
+ inline _get_digits_FixedDef (
+ POA_CORBA::FixedDef * servant,
+ TAO_Operation_Details const * operation_details,
+ TAO::Argument * const args[])
+ : servant_ (servant)
+ , operation_details_ (operation_details)
+ , args_ (args)
+ {
+ }
+
+ virtual void execute (ACE_ENV_SINGLE_ARG_DECL)
+ {
+ TAO::SArg_Traits< ::CORBA::UShort>::ret_arg_type retval =
+ TAO::Portable_Server::get_ret_arg< ::CORBA::UShort> (
+ this->operation_details_,
+ this->args_);
+
+ retval =
+ this->servant_->digits (
+ ACE_ENV_SINGLE_ARG_PARAMETER);
+ ACE_CHECK;
+ }
+
+ private:
+ POA_CORBA::FixedDef * const servant_;
+ TAO_Operation_Details const * const operation_details_;
+ TAO::Argument * const * const args_;
+ };
+}
+
+
+// TAO_IDL - Generated from
+// be\be_visitor_operation/operation_ss.cpp:190
+
+void POA_CORBA::FixedDef::_get_digits_skel (
+ TAO_ServerRequest & server_request,
+ void * TAO_INTERCEPTOR (servant_upcall),
+ void * servant
+ ACE_ENV_ARG_DECL
+ )
+{
+#if TAO_HAS_INTERCEPTORS == 1
+ static ::CORBA::TypeCode_ptr const * const exceptions = 0;
+ static ::CORBA::ULong const nexceptions = 0;
+#endif /* TAO_HAS_INTERCEPTORS */
+
+ TAO::SArg_Traits< ::CORBA::UShort>::ret_val retval;
+
+ TAO::Argument * const args[] =
+ {
+ &retval
+ };
+
+ static size_t const nargs = 1;
+
+ POA_CORBA::FixedDef * const impl =
+ static_cast<POA_CORBA::FixedDef *> (servant);
+
+ _get_digits_FixedDef command (
+ impl,
+ server_request.operation_details (),
+ args);
+
+ TAO::Upcall_Wrapper upcall_wrapper;
+ upcall_wrapper.upcall (server_request
+ , args
+ , nargs
+ , command
+#if TAO_HAS_INTERCEPTORS == 1
+ , servant_upcall
+ , exceptions
+ , nexceptions
+#endif /* TAO_HAS_INTERCEPTORS == 1 */
+ ACE_ENV_ARG_PARAMETER);
+ ACE_CHECK;
+}namespace POA_CORBA
+{
+
+
+ // TAO_IDL - Generated from
+ // be\be_visitor_operation/upcall_command_ss.cpp:127
+
+ class _set_digits_FixedDef
+ : public TAO::Upcall_Command
+ {
+ public:
+ inline _set_digits_FixedDef (
+ POA_CORBA::FixedDef * servant,
+ TAO_Operation_Details const * operation_details,
+ TAO::Argument * const args[])
+ : servant_ (servant)
+ , operation_details_ (operation_details)
+ , args_ (args)
+ {
+ }
+
+ virtual void execute (ACE_ENV_SINGLE_ARG_DECL)
+ {
+ TAO::SArg_Traits< ::CORBA::UShort>::in_arg_type arg_1 =
+ TAO::Portable_Server::get_in_arg< ::CORBA::UShort> (
+ this->operation_details_,
+ this->args_,
+ 1);
+
+ this->servant_->digits (
+ arg_1
+ ACE_ENV_ARG_PARAMETER);
+ ACE_CHECK;
+ }
+
+ private:
+ POA_CORBA::FixedDef * const servant_;
+ TAO_Operation_Details const * const operation_details_;
+ TAO::Argument * const * const args_;
+ };
+}
+
+
+// TAO_IDL - Generated from
+// be\be_visitor_operation/operation_ss.cpp:190
+
+void POA_CORBA::FixedDef::_set_digits_skel (
+ TAO_ServerRequest & server_request,
+ void * TAO_INTERCEPTOR (servant_upcall),
+ void * servant
+ ACE_ENV_ARG_DECL
+ )
+{
+#if TAO_HAS_INTERCEPTORS == 1
+ static ::CORBA::TypeCode_ptr const * const exceptions = 0;
+ static ::CORBA::ULong const nexceptions = 0;
+#endif /* TAO_HAS_INTERCEPTORS */
+
+ TAO::SArg_Traits< void>::ret_val retval;
+ TAO::SArg_Traits< ::CORBA::UShort>::in_arg_val _tao_digits;
+
+ TAO::Argument * const args[] =
+ {
+ &retval,
+ &_tao_digits
+ };
+
+ static size_t const nargs = 2;
+
+ POA_CORBA::FixedDef * const impl =
+ static_cast<POA_CORBA::FixedDef *> (servant);
+
+ _set_digits_FixedDef command (
+ impl,
+ server_request.operation_details (),
+ args);
+
+ TAO::Upcall_Wrapper upcall_wrapper;
+ upcall_wrapper.upcall (server_request
+ , args
+ , nargs
+ , command
+#if TAO_HAS_INTERCEPTORS == 1
+ , servant_upcall
+ , exceptions
+ , nexceptions
+#endif /* TAO_HAS_INTERCEPTORS == 1 */
+ ACE_ENV_ARG_PARAMETER);
+ ACE_CHECK;
+}namespace POA_CORBA
+{
+
+
+ // TAO_IDL - Generated from
+ // be\be_visitor_operation/upcall_command_ss.cpp:127
+
+ class _get_scale_FixedDef
+ : public TAO::Upcall_Command
+ {
+ public:
+ inline _get_scale_FixedDef (
+ POA_CORBA::FixedDef * servant,
+ TAO_Operation_Details const * operation_details,
+ TAO::Argument * const args[])
+ : servant_ (servant)
+ , operation_details_ (operation_details)
+ , args_ (args)
+ {
+ }
+
+ virtual void execute (ACE_ENV_SINGLE_ARG_DECL)
+ {
+ TAO::SArg_Traits< ::CORBA::Short>::ret_arg_type retval =
+ TAO::Portable_Server::get_ret_arg< ::CORBA::Short> (
+ this->operation_details_,
+ this->args_);
+
+ retval =
+ this->servant_->scale (
+ ACE_ENV_SINGLE_ARG_PARAMETER);
+ ACE_CHECK;
+ }
+
+ private:
+ POA_CORBA::FixedDef * const servant_;
+ TAO_Operation_Details const * const operation_details_;
+ TAO::Argument * const * const args_;
+ };
+}
+
+
+// TAO_IDL - Generated from
+// be\be_visitor_operation/operation_ss.cpp:190
+
+void POA_CORBA::FixedDef::_get_scale_skel (
+ TAO_ServerRequest & server_request,
+ void * TAO_INTERCEPTOR (servant_upcall),
+ void * servant
+ ACE_ENV_ARG_DECL
+ )
+{
+#if TAO_HAS_INTERCEPTORS == 1
+ static ::CORBA::TypeCode_ptr const * const exceptions = 0;
+ static ::CORBA::ULong const nexceptions = 0;
+#endif /* TAO_HAS_INTERCEPTORS */
+
+ TAO::SArg_Traits< ::CORBA::Short>::ret_val retval;
+
+ TAO::Argument * const args[] =
+ {
+ &retval
+ };
+
+ static size_t const nargs = 1;
+
+ POA_CORBA::FixedDef * const impl =
+ static_cast<POA_CORBA::FixedDef *> (servant);
+
+ _get_scale_FixedDef command (
+ impl,
+ server_request.operation_details (),
+ args);
+
+ TAO::Upcall_Wrapper upcall_wrapper;
+ upcall_wrapper.upcall (server_request
+ , args
+ , nargs
+ , command
+#if TAO_HAS_INTERCEPTORS == 1
+ , servant_upcall
+ , exceptions
+ , nexceptions
+#endif /* TAO_HAS_INTERCEPTORS == 1 */
+ ACE_ENV_ARG_PARAMETER);
+ ACE_CHECK;
+}namespace POA_CORBA
+{
+
+
+ // TAO_IDL - Generated from
+ // be\be_visitor_operation/upcall_command_ss.cpp:127
+
+ class _set_scale_FixedDef
+ : public TAO::Upcall_Command
+ {
+ public:
+ inline _set_scale_FixedDef (
+ POA_CORBA::FixedDef * servant,
+ TAO_Operation_Details const * operation_details,
+ TAO::Argument * const args[])
+ : servant_ (servant)
+ , operation_details_ (operation_details)
+ , args_ (args)
+ {
+ }
+
+ virtual void execute (ACE_ENV_SINGLE_ARG_DECL)
+ {
+ TAO::SArg_Traits< ::CORBA::Short>::in_arg_type arg_1 =
+ TAO::Portable_Server::get_in_arg< ::CORBA::Short> (
+ this->operation_details_,
+ this->args_,
+ 1);
+
+ this->servant_->scale (
+ arg_1
+ ACE_ENV_ARG_PARAMETER);
+ ACE_CHECK;
+ }
+
+ private:
+ POA_CORBA::FixedDef * const servant_;
+ TAO_Operation_Details const * const operation_details_;
+ TAO::Argument * const * const args_;
+ };
+}
+
+
+// TAO_IDL - Generated from
+// be\be_visitor_operation/operation_ss.cpp:190
+
+void POA_CORBA::FixedDef::_set_scale_skel (
+ TAO_ServerRequest & server_request,
+ void * TAO_INTERCEPTOR (servant_upcall),
+ void * servant
+ ACE_ENV_ARG_DECL
+ )
+{
+#if TAO_HAS_INTERCEPTORS == 1
+ static ::CORBA::TypeCode_ptr const * const exceptions = 0;
+ static ::CORBA::ULong const nexceptions = 0;
+#endif /* TAO_HAS_INTERCEPTORS */
+
+ TAO::SArg_Traits< void>::ret_val retval;
+ TAO::SArg_Traits< ::CORBA::Short>::in_arg_val _tao_scale;
+
+ TAO::Argument * const args[] =
+ {
+ &retval,
+ &_tao_scale
+ };
+
+ static size_t const nargs = 2;
+
+ POA_CORBA::FixedDef * const impl =
+ static_cast<POA_CORBA::FixedDef *> (servant);
+
+ _set_scale_FixedDef command (
+ impl,
+ server_request.operation_details (),
+ args);
+
+ TAO::Upcall_Wrapper upcall_wrapper;
+ upcall_wrapper.upcall (server_request
+ , args
+ , nargs
+ , command
+#if TAO_HAS_INTERCEPTORS == 1
+ , servant_upcall
+ , exceptions
+ , nexceptions
+#endif /* TAO_HAS_INTERCEPTORS == 1 */
+ ACE_ENV_ARG_PARAMETER);
+ ACE_CHECK;
+}
+
+// TAO_IDL - Generated from
+// be\be_visitor_interface/interface_ss.cpp:169
+
+namespace POA_CORBA
+{
+
+
+ // TAO_IDL - Generated from
+ // be\be_visitor_operation/upcall_command_ss.cpp:127
+
+ class _is_a_FixedDef_Upcall_Command
+ : public TAO::Upcall_Command
+ {
+ public:
+ inline _is_a_FixedDef_Upcall_Command (
+ POA_CORBA::FixedDef * servant,
+ TAO_Operation_Details const * operation_details,
+ TAO::Argument * const args[])
+ : servant_ (servant)
+ , operation_details_ (operation_details)
+ , args_ (args)
+ {
+ }
+
+ virtual void execute (ACE_ENV_SINGLE_ARG_DECL)
+ {
+ TAO::SArg_Traits< ::ACE_InputCDR::to_boolean>::ret_arg_type retval =
+ TAO::Portable_Server::get_ret_arg< ::ACE_InputCDR::to_boolean> (
+ this->operation_details_,
+ this->args_);
+
+ TAO::SArg_Traits< ::CORBA::Char *>::in_arg_type arg_1 =
+ TAO::Portable_Server::get_in_arg< ::CORBA::Char *> (
+ this->operation_details_,
+ this->args_,
+ 1);
+
+ retval =
+ this->servant_-> _is_a (
+ arg_1
+ ACE_ENV_ARG_PARAMETER);
+ ACE_CHECK;
+ }
+
+ private:
+ POA_CORBA::FixedDef * const servant_;
+ TAO_Operation_Details const * const operation_details_;
+ TAO::Argument * const * const args_;
+ };
+}
+
+
+void POA_CORBA::FixedDef::_is_a_skel (
+ TAO_ServerRequest & server_request,
+ void * TAO_INTERCEPTOR (servant_upcall),
+ void * servant
+ ACE_ENV_ARG_DECL
+ )
+{
+#if TAO_HAS_INTERCEPTORS == 1
+ static ::CORBA::TypeCode_ptr const * const exceptions = 0;
+ static ::CORBA::ULong const nexceptions = 0;
+#endif /* TAO_HAS_INTERCEPTORS */
+
+ TAO::SArg_Traits< ::ACE_InputCDR::to_boolean>::ret_val retval;
+ TAO::SArg_Traits< ::CORBA::Char *>::in_arg_val _tao_repository_id;
+
+ TAO::Argument * const args[] =
+ {
+ &retval,
+ &_tao_repository_id
+ };
+
+ static size_t const nargs = 2;
+
+ POA_CORBA::FixedDef * const impl =
+ static_cast<POA_CORBA::FixedDef *> (servant);
+
+ _is_a_FixedDef_Upcall_Command command (
+ impl,
+ server_request.operation_details (),
+ args);
+
+ TAO::Upcall_Wrapper upcall_wrapper;
+ upcall_wrapper.upcall (server_request
+ , args
+ , nargs
+ , command
+#if TAO_HAS_INTERCEPTORS == 1
+ , servant_upcall
+ , exceptions
+ , nexceptions
+#endif /* TAO_HAS_INTERCEPTORS == 1 */
+ ACE_ENV_ARG_PARAMETER);
+ ACE_CHECK;
+}namespace POA_CORBA
+{
+
+
+ // TAO_IDL - Generated from
+ // be\be_visitor_operation/upcall_command_ss.cpp:127
+
+ class _non_existent_FixedDef_Upcall_Command
+ : public TAO::Upcall_Command
+ {
+ public:
+ inline _non_existent_FixedDef_Upcall_Command (
+ POA_CORBA::FixedDef * servant,
+ TAO_Operation_Details const * operation_details,
+ TAO::Argument * const args[])
+ : servant_ (servant)
+ , operation_details_ (operation_details)
+ , args_ (args)
+ {
+ }
+
+ virtual void execute (ACE_ENV_SINGLE_ARG_DECL)
+ {
+ TAO::SArg_Traits< ::ACE_InputCDR::to_boolean>::ret_arg_type retval =
+ TAO::Portable_Server::get_ret_arg< ::ACE_InputCDR::to_boolean> (
+ this->operation_details_,
+ this->args_);
+
+ retval =
+ this->servant_-> _non_existent (
+ ACE_ENV_SINGLE_ARG_PARAMETER);
+ ACE_CHECK;
+ }
+
+ private:
+ POA_CORBA::FixedDef * const servant_;
+ TAO_Operation_Details const * const operation_details_;
+ TAO::Argument * const * const args_;
+ };
+}
+
+
+void POA_CORBA::FixedDef::_non_existent_skel (
+ TAO_ServerRequest & server_request,
+ void * TAO_INTERCEPTOR (servant_upcall),
+ void * servant
+ ACE_ENV_ARG_DECL
+ )
+{
+#if TAO_HAS_INTERCEPTORS == 1
+ static ::CORBA::TypeCode_ptr const * const exceptions = 0;
+ static ::CORBA::ULong const nexceptions = 0;
+#endif /* TAO_HAS_INTERCEPTORS */
+
+ TAO::SArg_Traits< ::ACE_InputCDR::to_boolean>::ret_val retval;
+
+ TAO::Argument * const args[] =
+ {
+ &retval
+ };
+
+ static size_t const nargs = 1;
+
+ POA_CORBA::FixedDef * const impl =
+ static_cast<POA_CORBA::FixedDef *> (servant);
+
+ _non_existent_FixedDef_Upcall_Command command (
+ impl,
+ server_request.operation_details (),
+ args);
+
+ TAO::Upcall_Wrapper upcall_wrapper;
+ upcall_wrapper.upcall (server_request
+ , args
+ , nargs
+ , command
+#if TAO_HAS_INTERCEPTORS == 1
+ , servant_upcall
+ , exceptions
+ , nexceptions
+#endif /* TAO_HAS_INTERCEPTORS == 1 */
+ ACE_ENV_ARG_PARAMETER);
+ ACE_CHECK;
+}namespace POA_CORBA
+{
+
+
+ // TAO_IDL - Generated from
+ // be\be_visitor_operation/upcall_command_ss.cpp:127
+
+ class _repository_id_FixedDef_Upcall_Command
+ : public TAO::Upcall_Command
+ {
+ public:
+ inline _repository_id_FixedDef_Upcall_Command (
+ POA_CORBA::FixedDef * servant,
+ TAO_Operation_Details const * operation_details,
+ TAO::Argument * const args[])
+ : servant_ (servant)
+ , operation_details_ (operation_details)
+ , args_ (args)
+ {
+ }
+
+ virtual void execute (ACE_ENV_SINGLE_ARG_DECL)
+ {
+ TAO::SArg_Traits< ::CORBA::Char *>::ret_arg_type retval =
+ TAO::Portable_Server::get_ret_arg< ::CORBA::Char *> (
+ this->operation_details_,
+ this->args_);
+
+ retval =
+ this->servant_-> _repository_id (
+ ACE_ENV_SINGLE_ARG_PARAMETER);
+ ACE_CHECK;
+ }
+
+ private:
+ POA_CORBA::FixedDef * const servant_;
+ TAO_Operation_Details const * const operation_details_;
+ TAO::Argument * const * const args_;
+ };
+}
+
+
+void POA_CORBA::FixedDef::_repository_id_skel (
+ TAO_ServerRequest & server_request,
+ void * TAO_INTERCEPTOR (servant_upcall),
+ void * servant
+ ACE_ENV_ARG_DECL
+ )
+{
+#if TAO_HAS_INTERCEPTORS == 1
+ static ::CORBA::TypeCode_ptr const * const exceptions = 0;
+ static ::CORBA::ULong const nexceptions = 0;
+#endif /* TAO_HAS_INTERCEPTORS */
+
+ TAO::SArg_Traits< ::CORBA::Char *>::ret_val retval;
+
+ TAO::Argument * const args[] =
+ {
+ &retval
+ };
+
+ static size_t const nargs = 1;
+
+ POA_CORBA::FixedDef * const impl =
+ static_cast<POA_CORBA::FixedDef *> (servant);
+
+ _repository_id_FixedDef_Upcall_Command command (
+ impl,
+ server_request.operation_details (),
+ args);
+
+ TAO::Upcall_Wrapper upcall_wrapper;
+ upcall_wrapper.upcall (server_request
+ , args
+ , nargs
+ , command
+#if TAO_HAS_INTERCEPTORS == 1
+ , servant_upcall
+ , exceptions
+ , nexceptions
+#endif /* TAO_HAS_INTERCEPTORS == 1 */
+ ACE_ENV_ARG_PARAMETER);
+ ACE_CHECK;
+}
+
+// TAO_IDL - Generated from
+// be\be_visitor_interface/interface_ss.cpp:513
+
+void POA_CORBA::FixedDef::_interface_skel (
+ TAO_ServerRequest & server_request,
+ void * /* servant_upcall */,
+ void * servant
+ ACE_ENV_ARG_DECL
+ )
+{
+ TAO_IFR_Client_Adapter *_tao_adapter =
+ ACE_Dynamic_Service<TAO_IFR_Client_Adapter>::instance (
+ TAO_ORB_Core::ifr_client_adapter_name ()
+ );
+
+ if (_tao_adapter == 0)
+ {
+ ACE_THROW ( ::CORBA::INTF_REPOS ( ::CORBA::OMGVMCID | 1,
+ ::CORBA::COMPLETED_NO));
+ }
+
+ POA_CORBA::FixedDef * const impl =
+ static_cast<POA_CORBA::FixedDef *> (servant);
+ ::CORBA::InterfaceDef_ptr _tao_retval =
+ impl->_get_interface (ACE_ENV_SINGLE_ARG_PARAMETER);
+ ACE_CHECK;
+
+ server_request.init_reply ();
+ TAO_OutputCDR &_tao_out = *server_request.outgoing ();
+
+ ::CORBA::Boolean const _tao_result =
+ _tao_adapter->interfacedef_cdr_insert (
+ _tao_out,
+ _tao_retval
+ );
+
+ _tao_adapter->dispose (_tao_retval);
+
+ if (_tao_result == false)
+ {
+ ACE_THROW ( ::CORBA::MARSHAL ());
+ }
+}namespace POA_CORBA
+{
+
+
+ // TAO_IDL - Generated from
+ // be\be_visitor_operation/upcall_command_ss.cpp:127
+
+ class _get_component_FixedDef_Upcall_Command
+ : public TAO::Upcall_Command
+ {
+ public:
+ inline _get_component_FixedDef_Upcall_Command (
+ POA_CORBA::FixedDef * servant,
+ TAO_Operation_Details const * operation_details,
+ TAO::Argument * const args[])
+ : servant_ (servant)
+ , operation_details_ (operation_details)
+ , args_ (args)
+ {
+ }
+
+ virtual void execute (ACE_ENV_SINGLE_ARG_DECL)
+ {
+ TAO::SArg_Traits< ::CORBA::Object>::ret_arg_type retval =
+ TAO::Portable_Server::get_ret_arg< ::CORBA::Object> (
+ this->operation_details_,
+ this->args_);
+
+ retval =
+ this->servant_-> _get_component (
+ ACE_ENV_SINGLE_ARG_PARAMETER);
+ ACE_CHECK;
+ }
+
+ private:
+ POA_CORBA::FixedDef * const servant_;
+ TAO_Operation_Details const * const operation_details_;
+ TAO::Argument * const * const args_;
+ };
+}
+
+
+void POA_CORBA::FixedDef::_component_skel (
+ TAO_ServerRequest & server_request,
+ void * TAO_INTERCEPTOR (servant_upcall),
+ void * servant
+ ACE_ENV_ARG_DECL
+ )
+{
+#if TAO_HAS_INTERCEPTORS == 1
+ static ::CORBA::TypeCode_ptr const * const exceptions = 0;
+ static ::CORBA::ULong const nexceptions = 0;
+#endif /* TAO_HAS_INTERCEPTORS */
+
+ TAO::SArg_Traits< ::CORBA::Object>::ret_val retval;
+
+ TAO::Argument * const args[] =
+ {
+ &retval
+ };
+
+ static size_t const nargs = 1;
+
+ POA_CORBA::FixedDef * const impl =
+ static_cast<POA_CORBA::FixedDef *> (servant);
+
+ _get_component_FixedDef_Upcall_Command command (
+ impl,
+ server_request.operation_details (),
+ args);
+
+ TAO::Upcall_Wrapper upcall_wrapper;
+ upcall_wrapper.upcall (server_request
+ , args
+ , nargs
+ , command
+#if TAO_HAS_INTERCEPTORS == 1
+ , servant_upcall
+ , exceptions
+ , nexceptions
+#endif /* TAO_HAS_INTERCEPTORS == 1 */
+ ACE_ENV_ARG_PARAMETER);
+ ACE_CHECK;
+}
+
+::CORBA::Boolean POA_CORBA::FixedDef::_is_a (
+ const char* value
+ ACE_ENV_ARG_DECL_NOT_USED
+ )
+{
+ return
+ (
+ !ACE_OS::strcmp (
+ value,
+ "IDL:omg.org/CORBA/IRObject:1.0"
+ ) ||
+ !ACE_OS::strcmp (
+ value,
+ "IDL:omg.org/CORBA/IDLType:1.0"
+ ) ||
+ !ACE_OS::strcmp (
+ value,
+ "IDL:omg.org/CORBA/FixedDef:1.0"
+ ) ||
+ !ACE_OS::strcmp (
+ value,
+ "IDL:omg.org/CORBA/Object:1.0"
+ )
+ );
+}
+
+const char* POA_CORBA::FixedDef::_interface_repository_id (void) const
+{
+ return "IDL:omg.org/CORBA/FixedDef:1.0";
+}
+
+// TAO_IDL - Generated from
+// be\be_visitor_interface/interface_ss.cpp:903
+
+void POA_CORBA::FixedDef::_dispatch (
+ TAO_ServerRequest & req,
+ void * servant_upcall
+ ACE_ENV_ARG_DECL
+ )
+{
+ this->synchronous_upcall_dispatch (req,
+ servant_upcall,
+ this
+ ACE_ENV_ARG_PARAMETER);
+}
+
+// TAO_IDL - Generated from
+// be\be_visitor_interface/interface_ss.cpp:851
+
+CORBA::FixedDef *
+POA_CORBA::FixedDef::_this (ACE_ENV_SINGLE_ARG_DECL)
+{
+ TAO_Stub *stub = this->_create_stub (ACE_ENV_SINGLE_ARG_PARAMETER);
+ ACE_CHECK_RETURN (0);
+
+ TAO_Stub_Auto_Ptr safe_stub (stub);
+ ::CORBA::Object_ptr tmp = CORBA::Object::_nil ();
+
+ ::CORBA::Boolean const _tao_opt_colloc =
+ stub->servant_orb_var ()->orb_core ()->optimize_collocation_objects ();
+
+ ACE_NEW_RETURN (
+ tmp,
+ ::CORBA::Object (stub, _tao_opt_colloc, this),
+ 0
+ );
+
+ ::CORBA::Object_var obj = tmp;
+ (void) safe_stub.release ();
+
+ typedef ::CORBA::FixedDef STUB_SCOPED_NAME;
+ return
+ TAO::Narrow_Utils<STUB_SCOPED_NAME>::unchecked_narrow (
+ obj.in (),
+ CORBA__TAO_FixedDef_Proxy_Broker_Factory_function_pointer
+ );
+}
+
+// TAO_IDL - Generated from
+// be\be_interface.cpp:1499
+
+class TAO_CORBA_ValueMemberDef_Perfect_Hash_OpTable
+ : public TAO_Perfect_Hash_OpTable
+{
+private:
+ unsigned int hash (const char *str, unsigned int len);
+
+public:
+ const TAO_operation_db_entry * lookup (const char *str, unsigned int len);
+};
+
+/* C++ code produced by gperf version 2.8 (ACE version) */
+/* Command-line: C:\ACE\latest\ACE_wrappers\bin\gperf.exe -m -M -J -c -C -D -E -T -f 0 -F 0,0 -a -o -t -p -K opname -L C++ -Z TAO_CORBA_ValueMemberDef_Perfect_Hash_OpTable -N lookup */
+unsigned int
+TAO_CORBA_ValueMemberDef_Perfect_Hash_OpTable::hash (const char *str, unsigned int len)
+{
+ static const unsigned char asso_values[] =
+ {
+#if defined (ACE_MVS)
+ 37, 37, 37, 37, 37, 37, 37, 37, 37, 37,
+ 37, 37, 37, 37, 37, 37, 37, 37, 37, 37,
+ 37, 37, 37, 37, 37, 37, 37, 37, 37, 37,
+ 37, 37, 37, 37, 37, 37, 37, 37, 37, 37,
+ 37, 37, 37, 37, 37, 37, 37, 37, 37, 37,
+ 37, 37, 37, 37, 37, 37, 37, 37, 37, 37,
+ 37, 37, 37, 37, 37, 37, 37, 37, 37, 37,
+ 37, 37, 37, 37, 37, 37, 37, 37, 37, 37,
+ 37, 37, 37, 37, 37, 37, 37, 37, 37, 37,
+ 37, 37, 37, 37, 37, 37, 37, 37, 37, 37,
+ 37, 37, 37, 37, 37, 37, 37, 37, 37, 0,
+ 37, 37, 37, 37, 37, 37, 37, 37, 37, 37,
+ 37, 37, 37, 37, 37, 37, 37, 37, 37, 0,
+ 37, 37, 0, 0, 15, 37, 37, 37, 37, 37,
+ 37, 37, 37, 37, 37, 37, 37, 37, 0, 0,
+ 37, 37, 37, 37, 37, 37, 37, 37, 37, 37,
+ 37, 37, 0, 10, 37, 37, 37, 37, 10, 37,
+ 37, 37, 37, 37, 37, 37, 37, 37, 37, 37,
+ 37, 37, 37, 37, 37, 37, 37, 37, 37, 37,
+ 37, 37, 37, 37, 37, 37, 37, 37, 37, 37,
+ 37, 37, 37, 37, 37, 37, 37, 37, 37, 37,
+ 37, 37, 37, 37, 37, 37, 37, 37, 37, 37,
+ 37, 37, 37, 37, 37, 37, 37, 37, 37, 37,
+ 37, 37, 37, 37, 37, 37, 37, 37, 37, 37,
+ 37, 37, 37, 37, 37, 37, 37, 37, 37, 37,
+ 37, 37, 37, 37, 37, 37,
+#else
+ 37, 37, 37, 37, 37, 37, 37, 37, 37, 37,
+ 37, 37, 37, 37, 37, 37, 37, 37, 37, 37,
+ 37, 37, 37, 37, 37, 37, 37, 37, 37, 37,
+ 37, 37, 37, 37, 37, 37, 37, 37, 37, 37,
+ 37, 37, 37, 37, 37, 37, 37, 37, 37, 37,
+ 37, 37, 37, 37, 37, 37, 37, 37, 37, 37,
+ 37, 37, 37, 37, 37, 37, 37, 37, 37, 37,
+ 37, 37, 37, 37, 37, 37, 37, 37, 37, 37,
+ 37, 37, 37, 37, 37, 37, 37, 37, 37, 37,
+ 37, 37, 37, 37, 37, 0, 37, 0, 37, 37,
+ 0, 0, 15, 37, 37, 37, 37, 37, 37, 0,
+ 0, 37, 37, 37, 37, 0, 10, 37, 37, 37,
+ 37, 10, 37, 37, 37, 37, 37, 37,
+#endif /* ACE_MVS */
+ };
+ return len + asso_values[(int) str[len - 1]] + asso_values[(int) str[0]];
+}
+
+const TAO_operation_db_entry *
+TAO_CORBA_ValueMemberDef_Perfect_Hash_OpTable::lookup (const char *str, unsigned int len)
+{
+ enum
+ {
+ TOTAL_KEYWORDS = 23,
+ MIN_WORD_LENGTH = 4,
+ MAX_WORD_LENGTH = 26,
+ MIN_HASH_VALUE = 4,
+ MAX_HASH_VALUE = 36,
+ HASH_VALUE_RANGE = 33,
+ DUPLICATES = 7,
+ WORDLIST_SIZE = 27
+ };
+
+ static const TAO_operation_db_entry wordlist[] =
+ {
+ {"",0,0},{"",0,0},{"",0,0},{"",0,0},
+ {"move", &POA_CORBA::ValueMemberDef::move_skel, 0},
+ {"_is_a", &POA_CORBA::ValueMemberDef::_is_a_skel, 0},
+ {"_get_id", &POA_CORBA::ValueMemberDef::_get_id_skel, 0},
+ {"_set_id", &POA_CORBA::ValueMemberDef::_set_id_skel, 0},
+ {"describe", &POA_CORBA::ValueMemberDef::describe_skel, 0},
+ {"_get_name", &POA_CORBA::ValueMemberDef::_get_name_skel, 0},
+ {"_get_type", &POA_CORBA::ValueMemberDef::_get_type_skel, 0},
+ {"_set_name", &POA_CORBA::ValueMemberDef::_set_name_skel, 0},
+ {"_interface", &POA_CORBA::ValueMemberDef::_interface_skel, 0},
+ {"_get_access", &POA_CORBA::ValueMemberDef::_get_access_skel, 0},
+ {"_set_access", &POA_CORBA::ValueMemberDef::_set_access_skel, 0},
+ {"_get_version", &POA_CORBA::ValueMemberDef::_get_version_skel, 0},
+ {"_set_version", &POA_CORBA::ValueMemberDef::_set_version_skel, 0},
+ {"_get_def_kind", &POA_CORBA::ValueMemberDef::_get_def_kind_skel, 0},
+ {"_repository_id", &POA_CORBA::ValueMemberDef::_repository_id_skel, 0},
+ {"_get_defined_in", &POA_CORBA::ValueMemberDef::_get_defined_in_skel, 0},
+ {"destroy", &POA_CORBA::ValueMemberDef::destroy_skel, 0},
+ {"_get_absolute_name", &POA_CORBA::ValueMemberDef::_get_absolute_name_skel, 0},
+ {"_component", &POA_CORBA::ValueMemberDef::_component_skel, 0},
+ {"_non_existent", &POA_CORBA::ValueMemberDef::_non_existent_skel, 0},
+ {"_get_type_def", &POA_CORBA::ValueMemberDef::_get_type_def_skel, 0},
+ {"_set_type_def", &POA_CORBA::ValueMemberDef::_set_type_def_skel, 0},
+ {"_get_containing_repository", &POA_CORBA::ValueMemberDef::_get_containing_repository_skel, 0},
+ };
+
+ static const signed char lookup[] =
+ {
+ -13, -2, -15, -2, 4, 5, -1, 53, 8, 48, 12, -47, -46, 17,
+ 18, 19, -1, 20, 21, -1, 22, -9, -3, 23, -6, -2, -24, -2,
+ -38, -1, -1, -1, -1, -1, -1, -1, 26,
+ };
+
+ if (len <= MAX_WORD_LENGTH && len >= MIN_WORD_LENGTH)
+ {
+ unsigned int key = hash (str, len);
+
+ if (key <= MAX_HASH_VALUE && key >= MIN_HASH_VALUE)
+ {
+ int slot = lookup[key];
+
+ if (slot >= 0 && slot < WORDLIST_SIZE)
+ {
+ const char *s = wordlist[slot].opname;
+
+ if (*str == *s && !strncmp (str + 1, s + 1, len - 1))
+ return &wordlist[slot];
+ }
+ else if (slot < 0 && slot >= -MAX_HASH_VALUE)
+ return 0;
+ else
+ {
+ unsigned int offset = key + slot + (slot > 0 ? -MAX_HASH_VALUE : MAX_HASH_VALUE);
+ const TAO_operation_db_entry *base = &wordlist[-lookup[offset]];
+ const TAO_operation_db_entry *ptr = base + -lookup[offset + 1];
+
+ while (--ptr >= base)
+ if (*str == *ptr->opname && !strncmp (str + 1, ptr->opname + 1, len - 1))
+ return ptr;
+ }
+ }
+ }
+ return 0;
+}
+
+static TAO_CORBA_ValueMemberDef_Perfect_Hash_OpTable tao_CORBA_ValueMemberDef_optable;
+
+// TAO_IDL - Generated from
+// be\be_visitor_interface/interface_ss.cpp:966
+
+TAO::Collocation_Proxy_Broker *
+CORBA__TAO_ValueMemberDef_Proxy_Broker_Factory_function ( ::CORBA::Object_ptr)
+{
+ return reinterpret_cast<TAO::Collocation_Proxy_Broker *> (0xdead); // Dummy
+}
+
+int
+CORBA__TAO_ValueMemberDef_Proxy_Broker_Factory_Initializer (size_t)
+{
+ CORBA__TAO_ValueMemberDef_Proxy_Broker_Factory_function_pointer =
+ CORBA__TAO_ValueMemberDef_Proxy_Broker_Factory_function;
+
+ return 0;
+}
+
+static int
+CORBA__TAO_ValueMemberDef_Proxy_Broker_Stub_Factory_Initializer_Scarecrow =
+ CORBA__TAO_ValueMemberDef_Proxy_Broker_Factory_Initializer (
+ reinterpret_cast<size_t> (CORBA__TAO_ValueMemberDef_Proxy_Broker_Factory_Initializer)
+ );
+
+// TAO_IDL - Generated from
+// be\be_visitor_interface/interface_ss.cpp:103
+
+POA_CORBA::ValueMemberDef::ValueMemberDef (void)
+ : TAO_ServantBase ()
+{
+ this->optable_ = &tao_CORBA_ValueMemberDef_optable;
+}
+
+POA_CORBA::ValueMemberDef::ValueMemberDef (const ValueMemberDef& rhs)
+ : TAO_Abstract_ServantBase (rhs),
+ TAO_ServantBase (rhs),
+ POA_CORBA::IRObject (rhs),
+ POA_CORBA::Contained (rhs)
+{
+}
+
+POA_CORBA::ValueMemberDef::~ValueMemberDef (void)
+{
+}namespace POA_CORBA
+{
+
+
+ // TAO_IDL - Generated from
+ // be\be_visitor_operation/upcall_command_ss.cpp:127
+
+ class _get_type_ValueMemberDef
+ : public TAO::Upcall_Command
+ {
+ public:
+ inline _get_type_ValueMemberDef (
+ POA_CORBA::ValueMemberDef * servant,
+ TAO_Operation_Details const * operation_details,
+ TAO::Argument * const args[])
+ : servant_ (servant)
+ , operation_details_ (operation_details)
+ , args_ (args)
+ {
+ }
+
+ virtual void execute (ACE_ENV_SINGLE_ARG_DECL)
+ {
+ TAO::SArg_Traits< ::CORBA::TypeCode>::ret_arg_type retval =
+ TAO::Portable_Server::get_ret_arg< ::CORBA::TypeCode> (
+ this->operation_details_,
+ this->args_);
+
+ retval =
+ this->servant_->type (
+ ACE_ENV_SINGLE_ARG_PARAMETER);
+ ACE_CHECK;
+ }
+
+ private:
+ POA_CORBA::ValueMemberDef * const servant_;
+ TAO_Operation_Details const * const operation_details_;
+ TAO::Argument * const * const args_;
+ };
+}
+
+
+// TAO_IDL - Generated from
+// be\be_visitor_operation/operation_ss.cpp:190
+
+void POA_CORBA::ValueMemberDef::_get_type_skel (
+ TAO_ServerRequest & server_request,
+ void * TAO_INTERCEPTOR (servant_upcall),
+ void * servant
+ ACE_ENV_ARG_DECL
+ )
+{
+#if TAO_HAS_INTERCEPTORS == 1
+ static ::CORBA::TypeCode_ptr const * const exceptions = 0;
+ static ::CORBA::ULong const nexceptions = 0;
+#endif /* TAO_HAS_INTERCEPTORS */
+
+ TAO::SArg_Traits< ::CORBA::TypeCode>::ret_val retval;
+
+ TAO::Argument * const args[] =
+ {
+ &retval
+ };
+
+ static size_t const nargs = 1;
+
+ POA_CORBA::ValueMemberDef * const impl =
+ static_cast<POA_CORBA::ValueMemberDef *> (servant);
+
+ _get_type_ValueMemberDef command (
+ impl,
+ server_request.operation_details (),
+ args);
+
+ TAO::Upcall_Wrapper upcall_wrapper;
+ upcall_wrapper.upcall (server_request
+ , args
+ , nargs
+ , command
+#if TAO_HAS_INTERCEPTORS == 1
+ , servant_upcall
+ , exceptions
+ , nexceptions
+#endif /* TAO_HAS_INTERCEPTORS == 1 */
+ ACE_ENV_ARG_PARAMETER);
+ ACE_CHECK;
+}namespace POA_CORBA
+{
+
+
+ // TAO_IDL - Generated from
+ // be\be_visitor_operation/upcall_command_ss.cpp:127
+
+ class _get_type_def_ValueMemberDef
+ : public TAO::Upcall_Command
+ {
+ public:
+ inline _get_type_def_ValueMemberDef (
+ POA_CORBA::ValueMemberDef * servant,
+ TAO_Operation_Details const * operation_details,
+ TAO::Argument * const args[])
+ : servant_ (servant)
+ , operation_details_ (operation_details)
+ , args_ (args)
+ {
+ }
+
+ virtual void execute (ACE_ENV_SINGLE_ARG_DECL)
+ {
+ TAO::SArg_Traits< ::CORBA::IDLType>::ret_arg_type retval =
+ TAO::Portable_Server::get_ret_arg< ::CORBA::IDLType> (
+ this->operation_details_,
+ this->args_);
+
+ retval =
+ this->servant_->type_def (
+ ACE_ENV_SINGLE_ARG_PARAMETER);
+ ACE_CHECK;
+ }
+
+ private:
+ POA_CORBA::ValueMemberDef * const servant_;
+ TAO_Operation_Details const * const operation_details_;
+ TAO::Argument * const * const args_;
+ };
+}
+
+
+// TAO_IDL - Generated from
+// be\be_visitor_operation/operation_ss.cpp:190
+
+void POA_CORBA::ValueMemberDef::_get_type_def_skel (
+ TAO_ServerRequest & server_request,
+ void * TAO_INTERCEPTOR (servant_upcall),
+ void * servant
+ ACE_ENV_ARG_DECL
+ )
+{
+#if TAO_HAS_INTERCEPTORS == 1
+ static ::CORBA::TypeCode_ptr const * const exceptions = 0;
+ static ::CORBA::ULong const nexceptions = 0;
+#endif /* TAO_HAS_INTERCEPTORS */
+
+ TAO::SArg_Traits< ::CORBA::IDLType>::ret_val retval;
+
+ TAO::Argument * const args[] =
+ {
+ &retval
+ };
+
+ static size_t const nargs = 1;
+
+ POA_CORBA::ValueMemberDef * const impl =
+ static_cast<POA_CORBA::ValueMemberDef *> (servant);
+
+ _get_type_def_ValueMemberDef command (
+ impl,
+ server_request.operation_details (),
+ args);
+
+ TAO::Upcall_Wrapper upcall_wrapper;
+ upcall_wrapper.upcall (server_request
+ , args
+ , nargs
+ , command
+#if TAO_HAS_INTERCEPTORS == 1
+ , servant_upcall
+ , exceptions
+ , nexceptions
+#endif /* TAO_HAS_INTERCEPTORS == 1 */
+ ACE_ENV_ARG_PARAMETER);
+ ACE_CHECK;
+}namespace POA_CORBA
+{
+
+
+ // TAO_IDL - Generated from
+ // be\be_visitor_operation/upcall_command_ss.cpp:127
+
+ class _set_type_def_ValueMemberDef
+ : public TAO::Upcall_Command
+ {
+ public:
+ inline _set_type_def_ValueMemberDef (
+ POA_CORBA::ValueMemberDef * servant,
+ TAO_Operation_Details const * operation_details,
+ TAO::Argument * const args[])
+ : servant_ (servant)
+ , operation_details_ (operation_details)
+ , args_ (args)
+ {
+ }
+
+ virtual void execute (ACE_ENV_SINGLE_ARG_DECL)
+ {
+ TAO::SArg_Traits< ::CORBA::IDLType>::in_arg_type arg_1 =
+ TAO::Portable_Server::get_in_arg< ::CORBA::IDLType> (
+ this->operation_details_,
+ this->args_,
+ 1);
+
+ this->servant_->type_def (
+ arg_1
+ ACE_ENV_ARG_PARAMETER);
+ ACE_CHECK;
+ }
+
+ private:
+ POA_CORBA::ValueMemberDef * const servant_;
+ TAO_Operation_Details const * const operation_details_;
+ TAO::Argument * const * const args_;
+ };
+}
+
+
+// TAO_IDL - Generated from
+// be\be_visitor_operation/operation_ss.cpp:190
+
+void POA_CORBA::ValueMemberDef::_set_type_def_skel (
+ TAO_ServerRequest & server_request,
+ void * TAO_INTERCEPTOR (servant_upcall),
+ void * servant
+ ACE_ENV_ARG_DECL
+ )
+{
+#if TAO_HAS_INTERCEPTORS == 1
+ static ::CORBA::TypeCode_ptr const * const exceptions = 0;
+ static ::CORBA::ULong const nexceptions = 0;
+#endif /* TAO_HAS_INTERCEPTORS */
+
+ TAO::SArg_Traits< void>::ret_val retval;
+ TAO::SArg_Traits< ::CORBA::IDLType>::in_arg_val _tao_type_def;
+
+ TAO::Argument * const args[] =
+ {
+ &retval,
+ &_tao_type_def
+ };
+
+ static size_t const nargs = 2;
+
+ POA_CORBA::ValueMemberDef * const impl =
+ static_cast<POA_CORBA::ValueMemberDef *> (servant);
+
+ _set_type_def_ValueMemberDef command (
+ impl,
+ server_request.operation_details (),
+ args);
+
+ TAO::Upcall_Wrapper upcall_wrapper;
+ upcall_wrapper.upcall (server_request
+ , args
+ , nargs
+ , command
+#if TAO_HAS_INTERCEPTORS == 1
+ , servant_upcall
+ , exceptions
+ , nexceptions
+#endif /* TAO_HAS_INTERCEPTORS == 1 */
+ ACE_ENV_ARG_PARAMETER);
+ ACE_CHECK;
+}namespace POA_CORBA
+{
+
+
+ // TAO_IDL - Generated from
+ // be\be_visitor_operation/upcall_command_ss.cpp:127
+
+ class _get_access_ValueMemberDef
+ : public TAO::Upcall_Command
+ {
+ public:
+ inline _get_access_ValueMemberDef (
+ POA_CORBA::ValueMemberDef * servant,
+ TAO_Operation_Details const * operation_details,
+ TAO::Argument * const args[])
+ : servant_ (servant)
+ , operation_details_ (operation_details)
+ , args_ (args)
+ {
+ }
+
+ virtual void execute (ACE_ENV_SINGLE_ARG_DECL)
+ {
+ TAO::SArg_Traits< ::CORBA::Visibility>::ret_arg_type retval =
+ TAO::Portable_Server::get_ret_arg< ::CORBA::Visibility> (
+ this->operation_details_,
+ this->args_);
+
+ retval =
+ this->servant_->access (
+ ACE_ENV_SINGLE_ARG_PARAMETER);
+ ACE_CHECK;
+ }
+
+ private:
+ POA_CORBA::ValueMemberDef * const servant_;
+ TAO_Operation_Details const * const operation_details_;
+ TAO::Argument * const * const args_;
+ };
+}
+
+
+// TAO_IDL - Generated from
+// be\be_visitor_operation/operation_ss.cpp:190
+
+void POA_CORBA::ValueMemberDef::_get_access_skel (
+ TAO_ServerRequest & server_request,
+ void * TAO_INTERCEPTOR (servant_upcall),
+ void * servant
+ ACE_ENV_ARG_DECL
+ )
+{
+#if TAO_HAS_INTERCEPTORS == 1
+ static ::CORBA::TypeCode_ptr const * const exceptions = 0;
+ static ::CORBA::ULong const nexceptions = 0;
+#endif /* TAO_HAS_INTERCEPTORS */
+
+ TAO::SArg_Traits< ::CORBA::Visibility>::ret_val retval;
+
+ TAO::Argument * const args[] =
+ {
+ &retval
+ };
+
+ static size_t const nargs = 1;
+
+ POA_CORBA::ValueMemberDef * const impl =
+ static_cast<POA_CORBA::ValueMemberDef *> (servant);
+
+ _get_access_ValueMemberDef command (
+ impl,
+ server_request.operation_details (),
+ args);
+
+ TAO::Upcall_Wrapper upcall_wrapper;
+ upcall_wrapper.upcall (server_request
+ , args
+ , nargs
+ , command
+#if TAO_HAS_INTERCEPTORS == 1
+ , servant_upcall
+ , exceptions
+ , nexceptions
+#endif /* TAO_HAS_INTERCEPTORS == 1 */
+ ACE_ENV_ARG_PARAMETER);
+ ACE_CHECK;
+}namespace POA_CORBA
+{
+
+
+ // TAO_IDL - Generated from
+ // be\be_visitor_operation/upcall_command_ss.cpp:127
+
+ class _set_access_ValueMemberDef
+ : public TAO::Upcall_Command
+ {
+ public:
+ inline _set_access_ValueMemberDef (
+ POA_CORBA::ValueMemberDef * servant,
+ TAO_Operation_Details const * operation_details,
+ TAO::Argument * const args[])
+ : servant_ (servant)
+ , operation_details_ (operation_details)
+ , args_ (args)
+ {
+ }
+
+ virtual void execute (ACE_ENV_SINGLE_ARG_DECL)
+ {
+ TAO::SArg_Traits< ::CORBA::Visibility>::in_arg_type arg_1 =
+ TAO::Portable_Server::get_in_arg< ::CORBA::Visibility> (
+ this->operation_details_,
+ this->args_,
+ 1);
+
+ this->servant_->access (
+ arg_1
+ ACE_ENV_ARG_PARAMETER);
+ ACE_CHECK;
+ }
+
+ private:
+ POA_CORBA::ValueMemberDef * const servant_;
+ TAO_Operation_Details const * const operation_details_;
+ TAO::Argument * const * const args_;
+ };
+}
+
+
+// TAO_IDL - Generated from
+// be\be_visitor_operation/operation_ss.cpp:190
+
+void POA_CORBA::ValueMemberDef::_set_access_skel (
+ TAO_ServerRequest & server_request,
+ void * TAO_INTERCEPTOR (servant_upcall),
+ void * servant
+ ACE_ENV_ARG_DECL
+ )
+{
+#if TAO_HAS_INTERCEPTORS == 1
+ static ::CORBA::TypeCode_ptr const * const exceptions = 0;
+ static ::CORBA::ULong const nexceptions = 0;
+#endif /* TAO_HAS_INTERCEPTORS */
+
+ TAO::SArg_Traits< void>::ret_val retval;
+ TAO::SArg_Traits< ::CORBA::Visibility>::in_arg_val _tao_access;
+
+ TAO::Argument * const args[] =
+ {
+ &retval,
+ &_tao_access
+ };
+
+ static size_t const nargs = 2;
+
+ POA_CORBA::ValueMemberDef * const impl =
+ static_cast<POA_CORBA::ValueMemberDef *> (servant);
+
+ _set_access_ValueMemberDef command (
+ impl,
+ server_request.operation_details (),
+ args);
+
+ TAO::Upcall_Wrapper upcall_wrapper;
+ upcall_wrapper.upcall (server_request
+ , args
+ , nargs
+ , command
+#if TAO_HAS_INTERCEPTORS == 1
+ , servant_upcall
+ , exceptions
+ , nexceptions
+#endif /* TAO_HAS_INTERCEPTORS == 1 */
+ ACE_ENV_ARG_PARAMETER);
+ ACE_CHECK;
+}
+
+// TAO_IDL - Generated from
+// be\be_visitor_interface/interface_ss.cpp:169
+
+namespace POA_CORBA
+{
+
+
+ // TAO_IDL - Generated from
+ // be\be_visitor_operation/upcall_command_ss.cpp:127
+
+ class _is_a_ValueMemberDef_Upcall_Command
+ : public TAO::Upcall_Command
+ {
+ public:
+ inline _is_a_ValueMemberDef_Upcall_Command (
+ POA_CORBA::ValueMemberDef * servant,
+ TAO_Operation_Details const * operation_details,
+ TAO::Argument * const args[])
+ : servant_ (servant)
+ , operation_details_ (operation_details)
+ , args_ (args)
+ {
+ }
+
+ virtual void execute (ACE_ENV_SINGLE_ARG_DECL)
+ {
+ TAO::SArg_Traits< ::ACE_InputCDR::to_boolean>::ret_arg_type retval =
+ TAO::Portable_Server::get_ret_arg< ::ACE_InputCDR::to_boolean> (
+ this->operation_details_,
+ this->args_);
+
+ TAO::SArg_Traits< ::CORBA::Char *>::in_arg_type arg_1 =
+ TAO::Portable_Server::get_in_arg< ::CORBA::Char *> (
+ this->operation_details_,
+ this->args_,
+ 1);
+
+ retval =
+ this->servant_-> _is_a (
+ arg_1
+ ACE_ENV_ARG_PARAMETER);
+ ACE_CHECK;
+ }
+
+ private:
+ POA_CORBA::ValueMemberDef * const servant_;
+ TAO_Operation_Details const * const operation_details_;
+ TAO::Argument * const * const args_;
+ };
+}
+
+
+void POA_CORBA::ValueMemberDef::_is_a_skel (
+ TAO_ServerRequest & server_request,
+ void * TAO_INTERCEPTOR (servant_upcall),
+ void * servant
+ ACE_ENV_ARG_DECL
+ )
+{
+#if TAO_HAS_INTERCEPTORS == 1
+ static ::CORBA::TypeCode_ptr const * const exceptions = 0;
+ static ::CORBA::ULong const nexceptions = 0;
+#endif /* TAO_HAS_INTERCEPTORS */
+
+ TAO::SArg_Traits< ::ACE_InputCDR::to_boolean>::ret_val retval;
+ TAO::SArg_Traits< ::CORBA::Char *>::in_arg_val _tao_repository_id;
+
+ TAO::Argument * const args[] =
+ {
+ &retval,
+ &_tao_repository_id
+ };
+
+ static size_t const nargs = 2;
+
+ POA_CORBA::ValueMemberDef * const impl =
+ static_cast<POA_CORBA::ValueMemberDef *> (servant);
+
+ _is_a_ValueMemberDef_Upcall_Command command (
+ impl,
+ server_request.operation_details (),
+ args);
+
+ TAO::Upcall_Wrapper upcall_wrapper;
+ upcall_wrapper.upcall (server_request
+ , args
+ , nargs
+ , command
+#if TAO_HAS_INTERCEPTORS == 1
+ , servant_upcall
+ , exceptions
+ , nexceptions
+#endif /* TAO_HAS_INTERCEPTORS == 1 */
+ ACE_ENV_ARG_PARAMETER);
+ ACE_CHECK;
+}namespace POA_CORBA
+{
+
+
+ // TAO_IDL - Generated from
+ // be\be_visitor_operation/upcall_command_ss.cpp:127
+
+ class _non_existent_ValueMemberDef_Upcall_Command
+ : public TAO::Upcall_Command
+ {
+ public:
+ inline _non_existent_ValueMemberDef_Upcall_Command (
+ POA_CORBA::ValueMemberDef * servant,
+ TAO_Operation_Details const * operation_details,
+ TAO::Argument * const args[])
+ : servant_ (servant)
+ , operation_details_ (operation_details)
+ , args_ (args)
+ {
+ }
+
+ virtual void execute (ACE_ENV_SINGLE_ARG_DECL)
+ {
+ TAO::SArg_Traits< ::ACE_InputCDR::to_boolean>::ret_arg_type retval =
+ TAO::Portable_Server::get_ret_arg< ::ACE_InputCDR::to_boolean> (
+ this->operation_details_,
+ this->args_);
+
+ retval =
+ this->servant_-> _non_existent (
+ ACE_ENV_SINGLE_ARG_PARAMETER);
+ ACE_CHECK;
+ }
+
+ private:
+ POA_CORBA::ValueMemberDef * const servant_;
+ TAO_Operation_Details const * const operation_details_;
+ TAO::Argument * const * const args_;
+ };
+}
+
+
+void POA_CORBA::ValueMemberDef::_non_existent_skel (
+ TAO_ServerRequest & server_request,
+ void * TAO_INTERCEPTOR (servant_upcall),
+ void * servant
+ ACE_ENV_ARG_DECL
+ )
+{
+#if TAO_HAS_INTERCEPTORS == 1
+ static ::CORBA::TypeCode_ptr const * const exceptions = 0;
+ static ::CORBA::ULong const nexceptions = 0;
+#endif /* TAO_HAS_INTERCEPTORS */
+
+ TAO::SArg_Traits< ::ACE_InputCDR::to_boolean>::ret_val retval;
+
+ TAO::Argument * const args[] =
+ {
+ &retval
+ };
+
+ static size_t const nargs = 1;
+
+ POA_CORBA::ValueMemberDef * const impl =
+ static_cast<POA_CORBA::ValueMemberDef *> (servant);
+
+ _non_existent_ValueMemberDef_Upcall_Command command (
+ impl,
+ server_request.operation_details (),
+ args);
+
+ TAO::Upcall_Wrapper upcall_wrapper;
+ upcall_wrapper.upcall (server_request
+ , args
+ , nargs
+ , command
+#if TAO_HAS_INTERCEPTORS == 1
+ , servant_upcall
+ , exceptions
+ , nexceptions
+#endif /* TAO_HAS_INTERCEPTORS == 1 */
+ ACE_ENV_ARG_PARAMETER);
+ ACE_CHECK;
+}namespace POA_CORBA
+{
+
+
+ // TAO_IDL - Generated from
+ // be\be_visitor_operation/upcall_command_ss.cpp:127
+
+ class _repository_id_ValueMemberDef_Upcall_Command
+ : public TAO::Upcall_Command
+ {
+ public:
+ inline _repository_id_ValueMemberDef_Upcall_Command (
+ POA_CORBA::ValueMemberDef * servant,
+ TAO_Operation_Details const * operation_details,
+ TAO::Argument * const args[])
+ : servant_ (servant)
+ , operation_details_ (operation_details)
+ , args_ (args)
+ {
+ }
+
+ virtual void execute (ACE_ENV_SINGLE_ARG_DECL)
+ {
+ TAO::SArg_Traits< ::CORBA::Char *>::ret_arg_type retval =
+ TAO::Portable_Server::get_ret_arg< ::CORBA::Char *> (
+ this->operation_details_,
+ this->args_);
+
+ retval =
+ this->servant_-> _repository_id (
+ ACE_ENV_SINGLE_ARG_PARAMETER);
+ ACE_CHECK;
+ }
+
+ private:
+ POA_CORBA::ValueMemberDef * const servant_;
+ TAO_Operation_Details const * const operation_details_;
+ TAO::Argument * const * const args_;
+ };
+}
+
+
+void POA_CORBA::ValueMemberDef::_repository_id_skel (
+ TAO_ServerRequest & server_request,
+ void * TAO_INTERCEPTOR (servant_upcall),
+ void * servant
+ ACE_ENV_ARG_DECL
+ )
+{
+#if TAO_HAS_INTERCEPTORS == 1
+ static ::CORBA::TypeCode_ptr const * const exceptions = 0;
+ static ::CORBA::ULong const nexceptions = 0;
+#endif /* TAO_HAS_INTERCEPTORS */
+
+ TAO::SArg_Traits< ::CORBA::Char *>::ret_val retval;
+
+ TAO::Argument * const args[] =
+ {
+ &retval
+ };
+
+ static size_t const nargs = 1;
+
+ POA_CORBA::ValueMemberDef * const impl =
+ static_cast<POA_CORBA::ValueMemberDef *> (servant);
+
+ _repository_id_ValueMemberDef_Upcall_Command command (
+ impl,
+ server_request.operation_details (),
+ args);
+
+ TAO::Upcall_Wrapper upcall_wrapper;
+ upcall_wrapper.upcall (server_request
+ , args
+ , nargs
+ , command
+#if TAO_HAS_INTERCEPTORS == 1
+ , servant_upcall
+ , exceptions
+ , nexceptions
+#endif /* TAO_HAS_INTERCEPTORS == 1 */
+ ACE_ENV_ARG_PARAMETER);
+ ACE_CHECK;
+}
+
+// TAO_IDL - Generated from
+// be\be_visitor_interface/interface_ss.cpp:513
+
+void POA_CORBA::ValueMemberDef::_interface_skel (
+ TAO_ServerRequest & server_request,
+ void * /* servant_upcall */,
+ void * servant
+ ACE_ENV_ARG_DECL
+ )
+{
+ TAO_IFR_Client_Adapter *_tao_adapter =
+ ACE_Dynamic_Service<TAO_IFR_Client_Adapter>::instance (
+ TAO_ORB_Core::ifr_client_adapter_name ()
+ );
+
+ if (_tao_adapter == 0)
+ {
+ ACE_THROW ( ::CORBA::INTF_REPOS ( ::CORBA::OMGVMCID | 1,
+ ::CORBA::COMPLETED_NO));
+ }
+
+ POA_CORBA::ValueMemberDef * const impl =
+ static_cast<POA_CORBA::ValueMemberDef *> (servant);
+ ::CORBA::InterfaceDef_ptr _tao_retval =
+ impl->_get_interface (ACE_ENV_SINGLE_ARG_PARAMETER);
+ ACE_CHECK;
+
+ server_request.init_reply ();
+ TAO_OutputCDR &_tao_out = *server_request.outgoing ();
+
+ ::CORBA::Boolean const _tao_result =
+ _tao_adapter->interfacedef_cdr_insert (
+ _tao_out,
+ _tao_retval
+ );
+
+ _tao_adapter->dispose (_tao_retval);
+
+ if (_tao_result == false)
+ {
+ ACE_THROW ( ::CORBA::MARSHAL ());
+ }
+}namespace POA_CORBA
+{
+
+
+ // TAO_IDL - Generated from
+ // be\be_visitor_operation/upcall_command_ss.cpp:127
+
+ class _get_component_ValueMemberDef_Upcall_Command
+ : public TAO::Upcall_Command
+ {
+ public:
+ inline _get_component_ValueMemberDef_Upcall_Command (
+ POA_CORBA::ValueMemberDef * servant,
+ TAO_Operation_Details const * operation_details,
+ TAO::Argument * const args[])
+ : servant_ (servant)
+ , operation_details_ (operation_details)
+ , args_ (args)
+ {
+ }
+
+ virtual void execute (ACE_ENV_SINGLE_ARG_DECL)
+ {
+ TAO::SArg_Traits< ::CORBA::Object>::ret_arg_type retval =
+ TAO::Portable_Server::get_ret_arg< ::CORBA::Object> (
+ this->operation_details_,
+ this->args_);
+
+ retval =
+ this->servant_-> _get_component (
+ ACE_ENV_SINGLE_ARG_PARAMETER);
+ ACE_CHECK;
+ }
+
+ private:
+ POA_CORBA::ValueMemberDef * const servant_;
+ TAO_Operation_Details const * const operation_details_;
+ TAO::Argument * const * const args_;
+ };
+}
+
+
+void POA_CORBA::ValueMemberDef::_component_skel (
+ TAO_ServerRequest & server_request,
+ void * TAO_INTERCEPTOR (servant_upcall),
+ void * servant
+ ACE_ENV_ARG_DECL
+ )
+{
+#if TAO_HAS_INTERCEPTORS == 1
+ static ::CORBA::TypeCode_ptr const * const exceptions = 0;
+ static ::CORBA::ULong const nexceptions = 0;
+#endif /* TAO_HAS_INTERCEPTORS */
+
+ TAO::SArg_Traits< ::CORBA::Object>::ret_val retval;
+
+ TAO::Argument * const args[] =
+ {
+ &retval
+ };
+
+ static size_t const nargs = 1;
+
+ POA_CORBA::ValueMemberDef * const impl =
+ static_cast<POA_CORBA::ValueMemberDef *> (servant);
+
+ _get_component_ValueMemberDef_Upcall_Command command (
+ impl,
+ server_request.operation_details (),
+ args);
+
+ TAO::Upcall_Wrapper upcall_wrapper;
+ upcall_wrapper.upcall (server_request
+ , args
+ , nargs
+ , command
+#if TAO_HAS_INTERCEPTORS == 1
+ , servant_upcall
+ , exceptions
+ , nexceptions
+#endif /* TAO_HAS_INTERCEPTORS == 1 */
+ ACE_ENV_ARG_PARAMETER);
+ ACE_CHECK;
+}
+
+::CORBA::Boolean POA_CORBA::ValueMemberDef::_is_a (
+ const char* value
+ ACE_ENV_ARG_DECL_NOT_USED
+ )
+{
+ return
+ (
+ !ACE_OS::strcmp (
+ value,
+ "IDL:omg.org/CORBA/IRObject:1.0"
+ ) ||
+ !ACE_OS::strcmp (
+ value,
+ "IDL:omg.org/CORBA/Contained:1.0"
+ ) ||
+ !ACE_OS::strcmp (
+ value,
+ "IDL:omg.org/CORBA/ValueMemberDef:1.0"
+ ) ||
+ !ACE_OS::strcmp (
+ value,
+ "IDL:omg.org/CORBA/Object:1.0"
+ )
+ );
+}
+
+const char* POA_CORBA::ValueMemberDef::_interface_repository_id (void) const
+{
+ return "IDL:omg.org/CORBA/ValueMemberDef:1.0";
+}
+
+// TAO_IDL - Generated from
+// be\be_visitor_interface/interface_ss.cpp:903
+
+void POA_CORBA::ValueMemberDef::_dispatch (
+ TAO_ServerRequest & req,
+ void * servant_upcall
+ ACE_ENV_ARG_DECL
+ )
+{
+ this->synchronous_upcall_dispatch (req,
+ servant_upcall,
+ this
+ ACE_ENV_ARG_PARAMETER);
+}
+
+// TAO_IDL - Generated from
+// be\be_visitor_interface/interface_ss.cpp:851
+
+CORBA::ValueMemberDef *
+POA_CORBA::ValueMemberDef::_this (ACE_ENV_SINGLE_ARG_DECL)
+{
+ TAO_Stub *stub = this->_create_stub (ACE_ENV_SINGLE_ARG_PARAMETER);
+ ACE_CHECK_RETURN (0);
+
+ TAO_Stub_Auto_Ptr safe_stub (stub);
+ ::CORBA::Object_ptr tmp = CORBA::Object::_nil ();
+
+ ::CORBA::Boolean const _tao_opt_colloc =
+ stub->servant_orb_var ()->orb_core ()->optimize_collocation_objects ();
+
+ ACE_NEW_RETURN (
+ tmp,
+ ::CORBA::Object (stub, _tao_opt_colloc, this),
+ 0
+ );
+
+ ::CORBA::Object_var obj = tmp;
+ (void) safe_stub.release ();
+
+ typedef ::CORBA::ValueMemberDef STUB_SCOPED_NAME;
+ return
+ TAO::Narrow_Utils<STUB_SCOPED_NAME>::unchecked_narrow (
+ obj.in (),
+ CORBA__TAO_ValueMemberDef_Proxy_Broker_Factory_function_pointer
+ );
+}
+
+// TAO_IDL - Generated from
+// be\be_interface.cpp:1499
+
+class TAO_CORBA_ValueDef_Perfect_Hash_OpTable
+ : public TAO_Perfect_Hash_OpTable
+{
+private:
+ unsigned int hash (const char *str, unsigned int len);
+
+public:
+ const TAO_operation_db_entry * lookup (const char *str, unsigned int len);
+};
+
+/* C++ code produced by gperf version 2.8 (ACE version) */
+/* Command-line: C:\ACE\latest\ACE_wrappers\bin\gperf.exe -m -M -J -c -C -D -E -T -f 0 -F 0,0 -a -o -t -p -K opname -L C++ -Z TAO_CORBA_ValueDef_Perfect_Hash_OpTable -N lookup */
+unsigned int
+TAO_CORBA_ValueDef_Perfect_Hash_OpTable::hash (const char *str, unsigned int len)
+{
+ static const unsigned char asso_values[] =
+ {
+#if defined (ACE_MVS)
+ 105, 105, 105, 105, 105, 105, 105, 105, 105, 105,
+ 105, 105, 105, 105, 105, 105, 105, 105, 105, 105,
+ 105, 105, 105, 105, 105, 105, 105, 105, 105, 105,
+ 105, 105, 105, 105, 105, 105, 105, 105, 105, 105,
+ 105, 105, 105, 105, 105, 105, 105, 105, 105, 105,
+ 105, 105, 105, 105, 105, 105, 105, 105, 105, 105,
+ 105, 105, 105, 105, 105, 105, 105, 105, 105, 105,
+ 105, 105, 105, 105, 105, 105, 105, 105, 105, 105,
+ 105, 105, 105, 105, 105, 105, 105, 105, 105, 105,
+ 105, 105, 105, 105, 105, 105, 105, 105, 105, 105,
+ 105, 105, 105, 105, 105, 105, 105, 105, 105, 0,
+ 105, 105, 105, 105, 105, 105, 105, 105, 105, 105,
+ 105, 105, 105, 105, 105, 105, 105, 105, 105, 0,
+ 105, 15, 50, 40, 105, 105, 105, 0, 105, 105,
+ 105, 105, 105, 105, 105, 105, 105, 0, 0, 0,
+ 105, 0, 105, 0, 105, 105, 105, 105, 105, 105,
+ 105, 105, 15, 0, 105, 105, 105, 5, 15, 105,
+ 105, 105, 105, 105, 105, 105, 105, 105, 105, 105,
+ 105, 105, 105, 105, 105, 105, 105, 105, 105, 105,
+ 105, 105, 105, 105, 105, 105, 105, 105, 105, 105,
+ 105, 105, 105, 105, 105, 105, 105, 105, 105, 105,
+ 105, 105, 105, 105, 105, 105, 105, 105, 105, 105,
+ 105, 105, 105, 105, 105, 105, 105, 105, 105, 105,
+ 105, 105, 105, 105, 105, 105, 105, 105, 105, 105,
+ 105, 105, 105, 105, 105, 105, 105, 105, 105, 105,
+ 105, 105, 105, 105, 105, 105,
+#else
+ 105, 105, 105, 105, 105, 105, 105, 105, 105, 105,
+ 105, 105, 105, 105, 105, 105, 105, 105, 105, 105,
+ 105, 105, 105, 105, 105, 105, 105, 105, 105, 105,
+ 105, 105, 105, 105, 105, 105, 105, 105, 105, 105,
+ 105, 105, 105, 105, 105, 105, 105, 105, 105, 105,
+ 105, 105, 105, 105, 105, 105, 105, 105, 105, 105,
+ 105, 105, 105, 105, 105, 105, 105, 105, 105, 105,
+ 105, 105, 105, 105, 105, 105, 105, 105, 105, 105,
+ 105, 105, 105, 105, 105, 105, 105, 105, 105, 105,
+ 105, 105, 105, 105, 105, 0, 105, 0, 105, 15,
+ 50, 40, 105, 105, 105, 0, 105, 105, 0, 0,
+ 0, 105, 0, 105, 0, 15, 0, 105, 105, 105,
+ 5, 15, 105, 105, 105, 105, 105, 105,
+#endif /* ACE_MVS */
+ };
+ return len + asso_values[(int) str[len - 1]] + asso_values[(int) str[0]];
+}
+
+const TAO_operation_db_entry *
+TAO_CORBA_ValueDef_Perfect_Hash_OpTable::lookup (const char *str, unsigned int len)
+{
+ enum
+ {
+ TOTAL_KEYWORDS = 56,
+ MIN_WORD_LENGTH = 4,
+ MAX_WORD_LENGTH = 26,
+ MIN_HASH_VALUE = 4,
+ MAX_HASH_VALUE = 104,
+ HASH_VALUE_RANGE = 101,
+ DUPLICATES = 17,
+ WORDLIST_SIZE = 60
+ };
+
+ static const TAO_operation_db_entry wordlist[] =
+ {
+ {"",0,0},{"",0,0},{"",0,0},{"",0,0},
+ {"is_a", &POA_CORBA::ValueDef::is_a_skel, 0},
+ {"_is_a", &POA_CORBA::ValueDef::_is_a_skel, 0},
+ {"lookup", &POA_CORBA::ValueDef::lookup_skel, 0},
+ {"_component", &POA_CORBA::ValueDef::_component_skel, 0},
+ {"_get_version", &POA_CORBA::ValueDef::_get_version_skel, 0},
+ {"_set_version", &POA_CORBA::ValueDef::_set_version_skel, 0},
+ {"_non_existent", &POA_CORBA::ValueDef::_non_existent_skel, 0},
+ {"_get_is_custom", &POA_CORBA::ValueDef::_get_is_custom_skel, 0},
+ {"_set_is_custom", &POA_CORBA::ValueDef::_set_is_custom_skel, 0},
+ {"_get_defined_in", &POA_CORBA::ValueDef::_get_defined_in_skel, 0},
+ {"_get_is_abstract", &POA_CORBA::ValueDef::_get_is_abstract_skel, 0},
+ {"_set_is_abstract", &POA_CORBA::ValueDef::_set_is_abstract_skel, 0},
+ {"create_enum", &POA_CORBA::ValueDef::create_enum_skel, 0},
+ {"create_union", &POA_CORBA::ValueDef::create_union_skel, 0},
+ {"create_struct", &POA_CORBA::ValueDef::create_struct_skel, 0},
+ {"create_constant", &POA_CORBA::ValueDef::create_constant_skel, 0},
+ {"create_exception", &POA_CORBA::ValueDef::create_exception_skel, 0},
+ {"create_operation", &POA_CORBA::ValueDef::create_operation_skel, 0},
+ {"_get_initializers", &POA_CORBA::ValueDef::_get_initializers_skel, 0},
+ {"_set_initializers", &POA_CORBA::ValueDef::_set_initializers_skel, 0},
+ {"create_value_member", &POA_CORBA::ValueDef::create_value_member_skel, 0},
+ {"create_value_box", &POA_CORBA::ValueDef::create_value_box_skel, 0},
+ {"contents", &POA_CORBA::ValueDef::contents_skel, 0},
+ {"_get_supported_interfaces", &POA_CORBA::ValueDef::_get_supported_interfaces_skel, 0},
+ {"_set_abstract_base_values", &POA_CORBA::ValueDef::_set_abstract_base_values_skel, 0},
+ {"_get_abstract_base_values", &POA_CORBA::ValueDef::_get_abstract_base_values_skel, 0},
+ {"_set_supported_interfaces", &POA_CORBA::ValueDef::_set_supported_interfaces_skel, 0},
+ {"_get_containing_repository", &POA_CORBA::ValueDef::_get_containing_repository_skel, 0},
+ {"create_alias", &POA_CORBA::ValueDef::create_alias_skel, 0},
+ {"move", &POA_CORBA::ValueDef::move_skel, 0},
+ {"_get_name", &POA_CORBA::ValueDef::_get_name_skel, 0},
+ {"_get_type", &POA_CORBA::ValueDef::_get_type_skel, 0},
+ {"_set_name", &POA_CORBA::ValueDef::_set_name_skel, 0},
+ {"_interface", &POA_CORBA::ValueDef::_interface_skel, 0},
+ {"lookup_name", &POA_CORBA::ValueDef::lookup_name_skel, 0},
+ {"_get_base_value", &POA_CORBA::ValueDef::_get_base_value_skel, 0},
+ {"_set_base_value", &POA_CORBA::ValueDef::_set_base_value_skel, 0},
+ {"_get_id", &POA_CORBA::ValueDef::_get_id_skel, 0},
+ {"_set_id", &POA_CORBA::ValueDef::_set_id_skel, 0},
+ {"_get_absolute_name", &POA_CORBA::ValueDef::_get_absolute_name_skel, 0},
+ {"_get_is_truncatable", &POA_CORBA::ValueDef::_get_is_truncatable_skel, 0},
+ {"_set_is_truncatable", &POA_CORBA::ValueDef::_set_is_truncatable_skel, 0},
+ {"_get_def_kind", &POA_CORBA::ValueDef::_get_def_kind_skel, 0},
+ {"_repository_id", &POA_CORBA::ValueDef::_repository_id_skel, 0},
+ {"create_value", &POA_CORBA::ValueDef::create_value_skel, 0},
+ {"create_module", &POA_CORBA::ValueDef::create_module_skel, 0},
+ {"create_native", &POA_CORBA::ValueDef::create_native_skel, 0},
+ {"create_interface", &POA_CORBA::ValueDef::create_interface_skel, 0},
+ {"create_attribute", &POA_CORBA::ValueDef::create_attribute_skel, 0},
+ {"create_ext_value", &POA_CORBA::ValueDef::create_ext_value_skel, 0},
+ {"destroy", &POA_CORBA::ValueDef::destroy_skel, 0},
+ {"create_local_interface", &POA_CORBA::ValueDef::create_local_interface_skel, 0},
+ {"create_abstract_interface", &POA_CORBA::ValueDef::create_abstract_interface_skel, 0},
+ {"describe_contents", &POA_CORBA::ValueDef::describe_contents_skel, 0},
+ {"describe", &POA_CORBA::ValueDef::describe_skel, 0},
+ {"describe_value", &POA_CORBA::ValueDef::describe_value_skel, 0},
+ };
+
+ static const signed short lookup[] =
+ {
+ -8, -2, -11, -2, 4, 5, 6, -1, -14, -2, 7, -1, -116, 10,
+ -116, 13, -112, -1, -20, -2, -22, -2, -27, -4, -34, -3, 16, 17,
+ 18, -1, 19, -117, -116, -1, 24, -1, 25, -1, 26, -1, -122, 31,
+ 32, -1, 33, -39, -2, -41, -2, -129, 37, 38, -1, -44, -2, -114,
+ -1, -114, 43, -110, -1, -1, -1, 46, 47, -49, -2, 48, -107, -51,
+ -3, -106, 54, -1, -1, -1, -1, 55, -1, -1, 56, -1, 57, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
+ 58, -1, -1, -1, -1, -1, 59,
+ };
+
+ if (len <= MAX_WORD_LENGTH && len >= MIN_WORD_LENGTH)
+ {
+ unsigned int key = hash (str, len);
+
+ if (key <= MAX_HASH_VALUE && key >= MIN_HASH_VALUE)
+ {
+ int slot = lookup[key];
+
+ if (slot >= 0 && slot < WORDLIST_SIZE)
+ {
+ const char *s = wordlist[slot].opname;
+
+ if (*str == *s && !strncmp (str + 1, s + 1, len - 1))
+ return &wordlist[slot];
+ }
+ else if (slot < 0 && slot >= -MAX_HASH_VALUE)
+ return 0;
+ else
+ {
+ unsigned int offset = key + slot + (slot > 0 ? -MAX_HASH_VALUE : MAX_HASH_VALUE);
+ const TAO_operation_db_entry *base = &wordlist[-lookup[offset]];
+ const TAO_operation_db_entry *ptr = base + -lookup[offset + 1];
+
+ while (--ptr >= base)
+ if (*str == *ptr->opname && !strncmp (str + 1, ptr->opname + 1, len - 1))
+ return ptr;
+ }
+ }
+ }
+ return 0;
+}
+
+static TAO_CORBA_ValueDef_Perfect_Hash_OpTable tao_CORBA_ValueDef_optable;
+
+// TAO_IDL - Generated from
+// be\be_visitor_interface/interface_ss.cpp:966
+
+TAO::Collocation_Proxy_Broker *
+CORBA__TAO_ValueDef_Proxy_Broker_Factory_function ( ::CORBA::Object_ptr)
+{
+ return reinterpret_cast<TAO::Collocation_Proxy_Broker *> (0xdead); // Dummy
+}
+
+int
+CORBA__TAO_ValueDef_Proxy_Broker_Factory_Initializer (size_t)
+{
+ CORBA__TAO_ValueDef_Proxy_Broker_Factory_function_pointer =
+ CORBA__TAO_ValueDef_Proxy_Broker_Factory_function;
+
+ return 0;
+}
+
+static int
+CORBA__TAO_ValueDef_Proxy_Broker_Stub_Factory_Initializer_Scarecrow =
+ CORBA__TAO_ValueDef_Proxy_Broker_Factory_Initializer (
+ reinterpret_cast<size_t> (CORBA__TAO_ValueDef_Proxy_Broker_Factory_Initializer)
+ );
+
+// TAO_IDL - Generated from
+// be\be_visitor_interface/interface_ss.cpp:103
+
+POA_CORBA::ValueDef::ValueDef (void)
+ : TAO_ServantBase ()
+{
+ this->optable_ = &tao_CORBA_ValueDef_optable;
+}
+
+POA_CORBA::ValueDef::ValueDef (const ValueDef& rhs)
+ : TAO_Abstract_ServantBase (rhs),
+ TAO_ServantBase (rhs),
+ POA_CORBA::IRObject (rhs),
+ POA_CORBA::Container (rhs),
+ POA_CORBA::Contained (rhs),
+ POA_CORBA::IDLType (rhs)
+{
+}
+
+POA_CORBA::ValueDef::~ValueDef (void)
+{
+}namespace POA_CORBA
+{
+
+
+ // TAO_IDL - Generated from
+ // be\be_visitor_operation/upcall_command_ss.cpp:127
+
+ class _get_supported_interfaces_ValueDef
+ : public TAO::Upcall_Command
+ {
+ public:
+ inline _get_supported_interfaces_ValueDef (
+ POA_CORBA::ValueDef * servant,
+ TAO_Operation_Details const * operation_details,
+ TAO::Argument * const args[])
+ : servant_ (servant)
+ , operation_details_ (operation_details)
+ , args_ (args)
+ {
+ }
+
+ virtual void execute (ACE_ENV_SINGLE_ARG_DECL)
+ {
+ TAO::SArg_Traits< ::CORBA::InterfaceDefSeq>::ret_arg_type retval =
+ TAO::Portable_Server::get_ret_arg< ::CORBA::InterfaceDefSeq> (
+ this->operation_details_,
+ this->args_);
+
+ retval =
+ this->servant_->supported_interfaces (
+ ACE_ENV_SINGLE_ARG_PARAMETER);
+ ACE_CHECK;
+ }
+
+ private:
+ POA_CORBA::ValueDef * const servant_;
+ TAO_Operation_Details const * const operation_details_;
+ TAO::Argument * const * const args_;
+ };
+}
+
+
+// TAO_IDL - Generated from
+// be\be_visitor_operation/operation_ss.cpp:190
+
+void POA_CORBA::ValueDef::_get_supported_interfaces_skel (
+ TAO_ServerRequest & server_request,
+ void * TAO_INTERCEPTOR (servant_upcall),
+ void * servant
+ ACE_ENV_ARG_DECL
+ )
+{
+#if TAO_HAS_INTERCEPTORS == 1
+ static ::CORBA::TypeCode_ptr const * const exceptions = 0;
+ static ::CORBA::ULong const nexceptions = 0;
+#endif /* TAO_HAS_INTERCEPTORS */
+
+ TAO::SArg_Traits< ::CORBA::InterfaceDefSeq>::ret_val retval;
+
+ TAO::Argument * const args[] =
+ {
+ &retval
+ };
+
+ static size_t const nargs = 1;
+
+ POA_CORBA::ValueDef * const impl =
+ static_cast<POA_CORBA::ValueDef *> (servant);
+
+ _get_supported_interfaces_ValueDef command (
+ impl,
+ server_request.operation_details (),
+ args);
+
+ TAO::Upcall_Wrapper upcall_wrapper;
+ upcall_wrapper.upcall (server_request
+ , args
+ , nargs
+ , command
+#if TAO_HAS_INTERCEPTORS == 1
+ , servant_upcall
+ , exceptions
+ , nexceptions
+#endif /* TAO_HAS_INTERCEPTORS == 1 */
+ ACE_ENV_ARG_PARAMETER);
+ ACE_CHECK;
+}namespace POA_CORBA
+{
+
+
+ // TAO_IDL - Generated from
+ // be\be_visitor_operation/upcall_command_ss.cpp:127
+
+ class _set_supported_interfaces_ValueDef
+ : public TAO::Upcall_Command
+ {
+ public:
+ inline _set_supported_interfaces_ValueDef (
+ POA_CORBA::ValueDef * servant,
+ TAO_Operation_Details const * operation_details,
+ TAO::Argument * const args[])
+ : servant_ (servant)
+ , operation_details_ (operation_details)
+ , args_ (args)
+ {
+ }
+
+ virtual void execute (ACE_ENV_SINGLE_ARG_DECL)
+ {
+ TAO::SArg_Traits< ::CORBA::InterfaceDefSeq>::in_arg_type arg_1 =
+ TAO::Portable_Server::get_in_arg< ::CORBA::InterfaceDefSeq> (
+ this->operation_details_,
+ this->args_,
+ 1);
+
+ this->servant_->supported_interfaces (
+ arg_1
+ ACE_ENV_ARG_PARAMETER);
+ ACE_CHECK;
+ }
+
+ private:
+ POA_CORBA::ValueDef * const servant_;
+ TAO_Operation_Details const * const operation_details_;
+ TAO::Argument * const * const args_;
+ };
+}
+
+
+// TAO_IDL - Generated from
+// be\be_visitor_operation/operation_ss.cpp:190
+
+void POA_CORBA::ValueDef::_set_supported_interfaces_skel (
+ TAO_ServerRequest & server_request,
+ void * TAO_INTERCEPTOR (servant_upcall),
+ void * servant
+ ACE_ENV_ARG_DECL
+ )
+{
+#if TAO_HAS_INTERCEPTORS == 1
+ static ::CORBA::TypeCode_ptr const * const exceptions = 0;
+ static ::CORBA::ULong const nexceptions = 0;
+#endif /* TAO_HAS_INTERCEPTORS */
+
+ TAO::SArg_Traits< void>::ret_val retval;
+ TAO::SArg_Traits< ::CORBA::InterfaceDefSeq>::in_arg_val _tao_supported_interfaces;
+
+ TAO::Argument * const args[] =
+ {
+ &retval,
+ &_tao_supported_interfaces
+ };
+
+ static size_t const nargs = 2;
+
+ POA_CORBA::ValueDef * const impl =
+ static_cast<POA_CORBA::ValueDef *> (servant);
+
+ _set_supported_interfaces_ValueDef command (
+ impl,
+ server_request.operation_details (),
+ args);
+
+ TAO::Upcall_Wrapper upcall_wrapper;
+ upcall_wrapper.upcall (server_request
+ , args
+ , nargs
+ , command
+#if TAO_HAS_INTERCEPTORS == 1
+ , servant_upcall
+ , exceptions
+ , nexceptions
+#endif /* TAO_HAS_INTERCEPTORS == 1 */
+ ACE_ENV_ARG_PARAMETER);
+ ACE_CHECK;
+}namespace POA_CORBA
+{
+
+
+ // TAO_IDL - Generated from
+ // be\be_visitor_operation/upcall_command_ss.cpp:127
+
+ class _get_initializers_ValueDef
+ : public TAO::Upcall_Command
+ {
+ public:
+ inline _get_initializers_ValueDef (
+ POA_CORBA::ValueDef * servant,
+ TAO_Operation_Details const * operation_details,
+ TAO::Argument * const args[])
+ : servant_ (servant)
+ , operation_details_ (operation_details)
+ , args_ (args)
+ {
+ }
+
+ virtual void execute (ACE_ENV_SINGLE_ARG_DECL)
+ {
+ TAO::SArg_Traits< ::CORBA::InitializerSeq>::ret_arg_type retval =
+ TAO::Portable_Server::get_ret_arg< ::CORBA::InitializerSeq> (
+ this->operation_details_,
+ this->args_);
+
+ retval =
+ this->servant_->initializers (
+ ACE_ENV_SINGLE_ARG_PARAMETER);
+ ACE_CHECK;
+ }
+
+ private:
+ POA_CORBA::ValueDef * const servant_;
+ TAO_Operation_Details const * const operation_details_;
+ TAO::Argument * const * const args_;
+ };
+}
+
+
+// TAO_IDL - Generated from
+// be\be_visitor_operation/operation_ss.cpp:190
+
+void POA_CORBA::ValueDef::_get_initializers_skel (
+ TAO_ServerRequest & server_request,
+ void * TAO_INTERCEPTOR (servant_upcall),
+ void * servant
+ ACE_ENV_ARG_DECL
+ )
+{
+#if TAO_HAS_INTERCEPTORS == 1
+ static ::CORBA::TypeCode_ptr const * const exceptions = 0;
+ static ::CORBA::ULong const nexceptions = 0;
+#endif /* TAO_HAS_INTERCEPTORS */
+
+ TAO::SArg_Traits< ::CORBA::InitializerSeq>::ret_val retval;
+
+ TAO::Argument * const args[] =
+ {
+ &retval
+ };
+
+ static size_t const nargs = 1;
+
+ POA_CORBA::ValueDef * const impl =
+ static_cast<POA_CORBA::ValueDef *> (servant);
+
+ _get_initializers_ValueDef command (
+ impl,
+ server_request.operation_details (),
+ args);
+
+ TAO::Upcall_Wrapper upcall_wrapper;
+ upcall_wrapper.upcall (server_request
+ , args
+ , nargs
+ , command
+#if TAO_HAS_INTERCEPTORS == 1
+ , servant_upcall
+ , exceptions
+ , nexceptions
+#endif /* TAO_HAS_INTERCEPTORS == 1 */
+ ACE_ENV_ARG_PARAMETER);
+ ACE_CHECK;
+}namespace POA_CORBA
+{
+
+
+ // TAO_IDL - Generated from
+ // be\be_visitor_operation/upcall_command_ss.cpp:127
+
+ class _set_initializers_ValueDef
+ : public TAO::Upcall_Command
+ {
+ public:
+ inline _set_initializers_ValueDef (
+ POA_CORBA::ValueDef * servant,
+ TAO_Operation_Details const * operation_details,
+ TAO::Argument * const args[])
+ : servant_ (servant)
+ , operation_details_ (operation_details)
+ , args_ (args)
+ {
+ }
+
+ virtual void execute (ACE_ENV_SINGLE_ARG_DECL)
+ {
+ TAO::SArg_Traits< ::CORBA::InitializerSeq>::in_arg_type arg_1 =
+ TAO::Portable_Server::get_in_arg< ::CORBA::InitializerSeq> (
+ this->operation_details_,
+ this->args_,
+ 1);
+
+ this->servant_->initializers (
+ arg_1
+ ACE_ENV_ARG_PARAMETER);
+ ACE_CHECK;
+ }
+
+ private:
+ POA_CORBA::ValueDef * const servant_;
+ TAO_Operation_Details const * const operation_details_;
+ TAO::Argument * const * const args_;
+ };
+}
+
+
+// TAO_IDL - Generated from
+// be\be_visitor_operation/operation_ss.cpp:190
+
+void POA_CORBA::ValueDef::_set_initializers_skel (
+ TAO_ServerRequest & server_request,
+ void * TAO_INTERCEPTOR (servant_upcall),
+ void * servant
+ ACE_ENV_ARG_DECL
+ )
+{
+#if TAO_HAS_INTERCEPTORS == 1
+ static ::CORBA::TypeCode_ptr const * const exceptions = 0;
+ static ::CORBA::ULong const nexceptions = 0;
+#endif /* TAO_HAS_INTERCEPTORS */
+
+ TAO::SArg_Traits< void>::ret_val retval;
+ TAO::SArg_Traits< ::CORBA::InitializerSeq>::in_arg_val _tao_initializers;
+
+ TAO::Argument * const args[] =
+ {
+ &retval,
+ &_tao_initializers
+ };
+
+ static size_t const nargs = 2;
+
+ POA_CORBA::ValueDef * const impl =
+ static_cast<POA_CORBA::ValueDef *> (servant);
+
+ _set_initializers_ValueDef command (
+ impl,
+ server_request.operation_details (),
+ args);
+
+ TAO::Upcall_Wrapper upcall_wrapper;
+ upcall_wrapper.upcall (server_request
+ , args
+ , nargs
+ , command
+#if TAO_HAS_INTERCEPTORS == 1
+ , servant_upcall
+ , exceptions
+ , nexceptions
+#endif /* TAO_HAS_INTERCEPTORS == 1 */
+ ACE_ENV_ARG_PARAMETER);
+ ACE_CHECK;
+}namespace POA_CORBA
+{
+
+
+ // TAO_IDL - Generated from
+ // be\be_visitor_operation/upcall_command_ss.cpp:127
+
+ class _get_base_value_ValueDef
+ : public TAO::Upcall_Command
+ {
+ public:
+ inline _get_base_value_ValueDef (
+ POA_CORBA::ValueDef * servant,
+ TAO_Operation_Details const * operation_details,
+ TAO::Argument * const args[])
+ : servant_ (servant)
+ , operation_details_ (operation_details)
+ , args_ (args)
+ {
+ }
+
+ virtual void execute (ACE_ENV_SINGLE_ARG_DECL)
+ {
+ TAO::SArg_Traits< ::CORBA::ValueDef>::ret_arg_type retval =
+ TAO::Portable_Server::get_ret_arg< ::CORBA::ValueDef> (
+ this->operation_details_,
+ this->args_);
+
+ retval =
+ this->servant_->base_value (
+ ACE_ENV_SINGLE_ARG_PARAMETER);
+ ACE_CHECK;
+ }
+
+ private:
+ POA_CORBA::ValueDef * const servant_;
+ TAO_Operation_Details const * const operation_details_;
+ TAO::Argument * const * const args_;
+ };
+}
+
+
+// TAO_IDL - Generated from
+// be\be_visitor_operation/operation_ss.cpp:190
+
+void POA_CORBA::ValueDef::_get_base_value_skel (
+ TAO_ServerRequest & server_request,
+ void * TAO_INTERCEPTOR (servant_upcall),
+ void * servant
+ ACE_ENV_ARG_DECL
+ )
+{
+#if TAO_HAS_INTERCEPTORS == 1
+ static ::CORBA::TypeCode_ptr const * const exceptions = 0;
+ static ::CORBA::ULong const nexceptions = 0;
+#endif /* TAO_HAS_INTERCEPTORS */
+
+ TAO::SArg_Traits< ::CORBA::ValueDef>::ret_val retval;
+
+ TAO::Argument * const args[] =
+ {
+ &retval
+ };
+
+ static size_t const nargs = 1;
+
+ POA_CORBA::ValueDef * const impl =
+ static_cast<POA_CORBA::ValueDef *> (servant);
+
+ _get_base_value_ValueDef command (
+ impl,
+ server_request.operation_details (),
+ args);
+
+ TAO::Upcall_Wrapper upcall_wrapper;
+ upcall_wrapper.upcall (server_request
+ , args
+ , nargs
+ , command
+#if TAO_HAS_INTERCEPTORS == 1
+ , servant_upcall
+ , exceptions
+ , nexceptions
+#endif /* TAO_HAS_INTERCEPTORS == 1 */
+ ACE_ENV_ARG_PARAMETER);
+ ACE_CHECK;
+}namespace POA_CORBA
+{
+
+
+ // TAO_IDL - Generated from
+ // be\be_visitor_operation/upcall_command_ss.cpp:127
+
+ class _set_base_value_ValueDef
+ : public TAO::Upcall_Command
+ {
+ public:
+ inline _set_base_value_ValueDef (
+ POA_CORBA::ValueDef * servant,
+ TAO_Operation_Details const * operation_details,
+ TAO::Argument * const args[])
+ : servant_ (servant)
+ , operation_details_ (operation_details)
+ , args_ (args)
+ {
+ }
+
+ virtual void execute (ACE_ENV_SINGLE_ARG_DECL)
+ {
+ TAO::SArg_Traits< ::CORBA::ValueDef>::in_arg_type arg_1 =
+ TAO::Portable_Server::get_in_arg< ::CORBA::ValueDef> (
+ this->operation_details_,
+ this->args_,
+ 1);
+
+ this->servant_->base_value (
+ arg_1
+ ACE_ENV_ARG_PARAMETER);
+ ACE_CHECK;
+ }
+
+ private:
+ POA_CORBA::ValueDef * const servant_;
+ TAO_Operation_Details const * const operation_details_;
+ TAO::Argument * const * const args_;
+ };
+}
+
+
+// TAO_IDL - Generated from
+// be\be_visitor_operation/operation_ss.cpp:190
+
+void POA_CORBA::ValueDef::_set_base_value_skel (
+ TAO_ServerRequest & server_request,
+ void * TAO_INTERCEPTOR (servant_upcall),
+ void * servant
+ ACE_ENV_ARG_DECL
+ )
+{
+#if TAO_HAS_INTERCEPTORS == 1
+ static ::CORBA::TypeCode_ptr const * const exceptions = 0;
+ static ::CORBA::ULong const nexceptions = 0;
+#endif /* TAO_HAS_INTERCEPTORS */
+
+ TAO::SArg_Traits< void>::ret_val retval;
+ TAO::SArg_Traits< ::CORBA::ValueDef>::in_arg_val _tao_base_value;
+
+ TAO::Argument * const args[] =
+ {
+ &retval,
+ &_tao_base_value
+ };
+
+ static size_t const nargs = 2;
+
+ POA_CORBA::ValueDef * const impl =
+ static_cast<POA_CORBA::ValueDef *> (servant);
+
+ _set_base_value_ValueDef command (
+ impl,
+ server_request.operation_details (),
+ args);
+
+ TAO::Upcall_Wrapper upcall_wrapper;
+ upcall_wrapper.upcall (server_request
+ , args
+ , nargs
+ , command
+#if TAO_HAS_INTERCEPTORS == 1
+ , servant_upcall
+ , exceptions
+ , nexceptions
+#endif /* TAO_HAS_INTERCEPTORS == 1 */
+ ACE_ENV_ARG_PARAMETER);
+ ACE_CHECK;
+}namespace POA_CORBA
+{
+
+
+ // TAO_IDL - Generated from
+ // be\be_visitor_operation/upcall_command_ss.cpp:127
+
+ class _get_abstract_base_values_ValueDef
+ : public TAO::Upcall_Command
+ {
+ public:
+ inline _get_abstract_base_values_ValueDef (
+ POA_CORBA::ValueDef * servant,
+ TAO_Operation_Details const * operation_details,
+ TAO::Argument * const args[])
+ : servant_ (servant)
+ , operation_details_ (operation_details)
+ , args_ (args)
+ {
+ }
+
+ virtual void execute (ACE_ENV_SINGLE_ARG_DECL)
+ {
+ TAO::SArg_Traits< ::CORBA::ValueDefSeq>::ret_arg_type retval =
+ TAO::Portable_Server::get_ret_arg< ::CORBA::ValueDefSeq> (
+ this->operation_details_,
+ this->args_);
+
+ retval =
+ this->servant_->abstract_base_values (
+ ACE_ENV_SINGLE_ARG_PARAMETER);
+ ACE_CHECK;
+ }
+
+ private:
+ POA_CORBA::ValueDef * const servant_;
+ TAO_Operation_Details const * const operation_details_;
+ TAO::Argument * const * const args_;
+ };
+}
+
+
+// TAO_IDL - Generated from
+// be\be_visitor_operation/operation_ss.cpp:190
+
+void POA_CORBA::ValueDef::_get_abstract_base_values_skel (
+ TAO_ServerRequest & server_request,
+ void * TAO_INTERCEPTOR (servant_upcall),
+ void * servant
+ ACE_ENV_ARG_DECL
+ )
+{
+#if TAO_HAS_INTERCEPTORS == 1
+ static ::CORBA::TypeCode_ptr const * const exceptions = 0;
+ static ::CORBA::ULong const nexceptions = 0;
+#endif /* TAO_HAS_INTERCEPTORS */
+
+ TAO::SArg_Traits< ::CORBA::ValueDefSeq>::ret_val retval;
+
+ TAO::Argument * const args[] =
+ {
+ &retval
+ };
+
+ static size_t const nargs = 1;
+
+ POA_CORBA::ValueDef * const impl =
+ static_cast<POA_CORBA::ValueDef *> (servant);
+
+ _get_abstract_base_values_ValueDef command (
+ impl,
+ server_request.operation_details (),
+ args);
+
+ TAO::Upcall_Wrapper upcall_wrapper;
+ upcall_wrapper.upcall (server_request
+ , args
+ , nargs
+ , command
+#if TAO_HAS_INTERCEPTORS == 1
+ , servant_upcall
+ , exceptions
+ , nexceptions
+#endif /* TAO_HAS_INTERCEPTORS == 1 */
+ ACE_ENV_ARG_PARAMETER);
+ ACE_CHECK;
+}namespace POA_CORBA
+{
+
+
+ // TAO_IDL - Generated from
+ // be\be_visitor_operation/upcall_command_ss.cpp:127
+
+ class _set_abstract_base_values_ValueDef
+ : public TAO::Upcall_Command
+ {
+ public:
+ inline _set_abstract_base_values_ValueDef (
+ POA_CORBA::ValueDef * servant,
+ TAO_Operation_Details const * operation_details,
+ TAO::Argument * const args[])
+ : servant_ (servant)
+ , operation_details_ (operation_details)
+ , args_ (args)
+ {
+ }
+
+ virtual void execute (ACE_ENV_SINGLE_ARG_DECL)
+ {
+ TAO::SArg_Traits< ::CORBA::ValueDefSeq>::in_arg_type arg_1 =
+ TAO::Portable_Server::get_in_arg< ::CORBA::ValueDefSeq> (
+ this->operation_details_,
+ this->args_,
+ 1);
+
+ this->servant_->abstract_base_values (
+ arg_1
+ ACE_ENV_ARG_PARAMETER);
+ ACE_CHECK;
+ }
+
+ private:
+ POA_CORBA::ValueDef * const servant_;
+ TAO_Operation_Details const * const operation_details_;
+ TAO::Argument * const * const args_;
+ };
+}
+
+
+// TAO_IDL - Generated from
+// be\be_visitor_operation/operation_ss.cpp:190
+
+void POA_CORBA::ValueDef::_set_abstract_base_values_skel (
+ TAO_ServerRequest & server_request,
+ void * TAO_INTERCEPTOR (servant_upcall),
+ void * servant
+ ACE_ENV_ARG_DECL
+ )
+{
+#if TAO_HAS_INTERCEPTORS == 1
+ static ::CORBA::TypeCode_ptr const * const exceptions = 0;
+ static ::CORBA::ULong const nexceptions = 0;
+#endif /* TAO_HAS_INTERCEPTORS */
+
+ TAO::SArg_Traits< void>::ret_val retval;
+ TAO::SArg_Traits< ::CORBA::ValueDefSeq>::in_arg_val _tao_abstract_base_values;
+
+ TAO::Argument * const args[] =
+ {
+ &retval,
+ &_tao_abstract_base_values
+ };
+
+ static size_t const nargs = 2;
+
+ POA_CORBA::ValueDef * const impl =
+ static_cast<POA_CORBA::ValueDef *> (servant);
+
+ _set_abstract_base_values_ValueDef command (
+ impl,
+ server_request.operation_details (),
+ args);
+
+ TAO::Upcall_Wrapper upcall_wrapper;
+ upcall_wrapper.upcall (server_request
+ , args
+ , nargs
+ , command
+#if TAO_HAS_INTERCEPTORS == 1
+ , servant_upcall
+ , exceptions
+ , nexceptions
+#endif /* TAO_HAS_INTERCEPTORS == 1 */
+ ACE_ENV_ARG_PARAMETER);
+ ACE_CHECK;
+}namespace POA_CORBA
+{
+
+
+ // TAO_IDL - Generated from
+ // be\be_visitor_operation/upcall_command_ss.cpp:127
+
+ class _get_is_abstract_ValueDef
+ : public TAO::Upcall_Command
+ {
+ public:
+ inline _get_is_abstract_ValueDef (
+ POA_CORBA::ValueDef * servant,
+ TAO_Operation_Details const * operation_details,
+ TAO::Argument * const args[])
+ : servant_ (servant)
+ , operation_details_ (operation_details)
+ , args_ (args)
+ {
+ }
+
+ virtual void execute (ACE_ENV_SINGLE_ARG_DECL)
+ {
+ TAO::SArg_Traits< ::ACE_InputCDR::to_boolean>::ret_arg_type retval =
+ TAO::Portable_Server::get_ret_arg< ::ACE_InputCDR::to_boolean> (
+ this->operation_details_,
+ this->args_);
+
+ retval =
+ this->servant_->is_abstract (
+ ACE_ENV_SINGLE_ARG_PARAMETER);
+ ACE_CHECK;
+ }
+
+ private:
+ POA_CORBA::ValueDef * const servant_;
+ TAO_Operation_Details const * const operation_details_;
+ TAO::Argument * const * const args_;
+ };
+}
+
+
+// TAO_IDL - Generated from
+// be\be_visitor_operation/operation_ss.cpp:190
+
+void POA_CORBA::ValueDef::_get_is_abstract_skel (
+ TAO_ServerRequest & server_request,
+ void * TAO_INTERCEPTOR (servant_upcall),
+ void * servant
+ ACE_ENV_ARG_DECL
+ )
+{
+#if TAO_HAS_INTERCEPTORS == 1
+ static ::CORBA::TypeCode_ptr const * const exceptions = 0;
+ static ::CORBA::ULong const nexceptions = 0;
+#endif /* TAO_HAS_INTERCEPTORS */
+
+ TAO::SArg_Traits< ::ACE_InputCDR::to_boolean>::ret_val retval;
+
+ TAO::Argument * const args[] =
+ {
+ &retval
+ };
+
+ static size_t const nargs = 1;
+
+ POA_CORBA::ValueDef * const impl =
+ static_cast<POA_CORBA::ValueDef *> (servant);
+
+ _get_is_abstract_ValueDef command (
+ impl,
+ server_request.operation_details (),
+ args);
+
+ TAO::Upcall_Wrapper upcall_wrapper;
+ upcall_wrapper.upcall (server_request
+ , args
+ , nargs
+ , command
+#if TAO_HAS_INTERCEPTORS == 1
+ , servant_upcall
+ , exceptions
+ , nexceptions
+#endif /* TAO_HAS_INTERCEPTORS == 1 */
+ ACE_ENV_ARG_PARAMETER);
+ ACE_CHECK;
+}namespace POA_CORBA
+{
+
+
+ // TAO_IDL - Generated from
+ // be\be_visitor_operation/upcall_command_ss.cpp:127
+
+ class _set_is_abstract_ValueDef
+ : public TAO::Upcall_Command
+ {
+ public:
+ inline _set_is_abstract_ValueDef (
+ POA_CORBA::ValueDef * servant,
+ TAO_Operation_Details const * operation_details,
+ TAO::Argument * const args[])
+ : servant_ (servant)
+ , operation_details_ (operation_details)
+ , args_ (args)
+ {
+ }
+
+ virtual void execute (ACE_ENV_SINGLE_ARG_DECL)
+ {
+ TAO::SArg_Traits< ::ACE_InputCDR::to_boolean>::in_arg_type arg_1 =
+ TAO::Portable_Server::get_in_arg< ::ACE_InputCDR::to_boolean> (
+ this->operation_details_,
+ this->args_,
+ 1);
+
+ this->servant_->is_abstract (
+ arg_1
+ ACE_ENV_ARG_PARAMETER);
+ ACE_CHECK;
+ }
+
+ private:
+ POA_CORBA::ValueDef * const servant_;
+ TAO_Operation_Details const * const operation_details_;
+ TAO::Argument * const * const args_;
+ };
+}
+
+
+// TAO_IDL - Generated from
+// be\be_visitor_operation/operation_ss.cpp:190
+
+void POA_CORBA::ValueDef::_set_is_abstract_skel (
+ TAO_ServerRequest & server_request,
+ void * TAO_INTERCEPTOR (servant_upcall),
+ void * servant
+ ACE_ENV_ARG_DECL
+ )
+{
+#if TAO_HAS_INTERCEPTORS == 1
+ static ::CORBA::TypeCode_ptr const * const exceptions = 0;
+ static ::CORBA::ULong const nexceptions = 0;
+#endif /* TAO_HAS_INTERCEPTORS */
+
+ TAO::SArg_Traits< void>::ret_val retval;
+ TAO::SArg_Traits< ::ACE_InputCDR::to_boolean>::in_arg_val _tao_is_abstract;
+
+ TAO::Argument * const args[] =
+ {
+ &retval,
+ &_tao_is_abstract
+ };
+
+ static size_t const nargs = 2;
+
+ POA_CORBA::ValueDef * const impl =
+ static_cast<POA_CORBA::ValueDef *> (servant);
+
+ _set_is_abstract_ValueDef command (
+ impl,
+ server_request.operation_details (),
+ args);
+
+ TAO::Upcall_Wrapper upcall_wrapper;
+ upcall_wrapper.upcall (server_request
+ , args
+ , nargs
+ , command
+#if TAO_HAS_INTERCEPTORS == 1
+ , servant_upcall
+ , exceptions
+ , nexceptions
+#endif /* TAO_HAS_INTERCEPTORS == 1 */
+ ACE_ENV_ARG_PARAMETER);
+ ACE_CHECK;
+}namespace POA_CORBA
+{
+
+
+ // TAO_IDL - Generated from
+ // be\be_visitor_operation/upcall_command_ss.cpp:127
+
+ class _get_is_custom_ValueDef
+ : public TAO::Upcall_Command
+ {
+ public:
+ inline _get_is_custom_ValueDef (
+ POA_CORBA::ValueDef * servant,
+ TAO_Operation_Details const * operation_details,
+ TAO::Argument * const args[])
+ : servant_ (servant)
+ , operation_details_ (operation_details)
+ , args_ (args)
+ {
+ }
+
+ virtual void execute (ACE_ENV_SINGLE_ARG_DECL)
+ {
+ TAO::SArg_Traits< ::ACE_InputCDR::to_boolean>::ret_arg_type retval =
+ TAO::Portable_Server::get_ret_arg< ::ACE_InputCDR::to_boolean> (
+ this->operation_details_,
+ this->args_);
+
+ retval =
+ this->servant_->is_custom (
+ ACE_ENV_SINGLE_ARG_PARAMETER);
+ ACE_CHECK;
+ }
+
+ private:
+ POA_CORBA::ValueDef * const servant_;
+ TAO_Operation_Details const * const operation_details_;
+ TAO::Argument * const * const args_;
+ };
+}
+
+
+// TAO_IDL - Generated from
+// be\be_visitor_operation/operation_ss.cpp:190
+
+void POA_CORBA::ValueDef::_get_is_custom_skel (
+ TAO_ServerRequest & server_request,
+ void * TAO_INTERCEPTOR (servant_upcall),
+ void * servant
+ ACE_ENV_ARG_DECL
+ )
+{
+#if TAO_HAS_INTERCEPTORS == 1
+ static ::CORBA::TypeCode_ptr const * const exceptions = 0;
+ static ::CORBA::ULong const nexceptions = 0;
+#endif /* TAO_HAS_INTERCEPTORS */
+
+ TAO::SArg_Traits< ::ACE_InputCDR::to_boolean>::ret_val retval;
+
+ TAO::Argument * const args[] =
+ {
+ &retval
+ };
+
+ static size_t const nargs = 1;
+
+ POA_CORBA::ValueDef * const impl =
+ static_cast<POA_CORBA::ValueDef *> (servant);
+
+ _get_is_custom_ValueDef command (
+ impl,
+ server_request.operation_details (),
+ args);
+
+ TAO::Upcall_Wrapper upcall_wrapper;
+ upcall_wrapper.upcall (server_request
+ , args
+ , nargs
+ , command
+#if TAO_HAS_INTERCEPTORS == 1
+ , servant_upcall
+ , exceptions
+ , nexceptions
+#endif /* TAO_HAS_INTERCEPTORS == 1 */
+ ACE_ENV_ARG_PARAMETER);
+ ACE_CHECK;
+}namespace POA_CORBA
+{
+
+
+ // TAO_IDL - Generated from
+ // be\be_visitor_operation/upcall_command_ss.cpp:127
+
+ class _set_is_custom_ValueDef
+ : public TAO::Upcall_Command
+ {
+ public:
+ inline _set_is_custom_ValueDef (
+ POA_CORBA::ValueDef * servant,
+ TAO_Operation_Details const * operation_details,
+ TAO::Argument * const args[])
+ : servant_ (servant)
+ , operation_details_ (operation_details)
+ , args_ (args)
+ {
+ }
+
+ virtual void execute (ACE_ENV_SINGLE_ARG_DECL)
+ {
+ TAO::SArg_Traits< ::ACE_InputCDR::to_boolean>::in_arg_type arg_1 =
+ TAO::Portable_Server::get_in_arg< ::ACE_InputCDR::to_boolean> (
+ this->operation_details_,
+ this->args_,
+ 1);
+
+ this->servant_->is_custom (
+ arg_1
+ ACE_ENV_ARG_PARAMETER);
+ ACE_CHECK;
+ }
+
+ private:
+ POA_CORBA::ValueDef * const servant_;
+ TAO_Operation_Details const * const operation_details_;
+ TAO::Argument * const * const args_;
+ };
+}
+
+
+// TAO_IDL - Generated from
+// be\be_visitor_operation/operation_ss.cpp:190
+
+void POA_CORBA::ValueDef::_set_is_custom_skel (
+ TAO_ServerRequest & server_request,
+ void * TAO_INTERCEPTOR (servant_upcall),
+ void * servant
+ ACE_ENV_ARG_DECL
+ )
+{
+#if TAO_HAS_INTERCEPTORS == 1
+ static ::CORBA::TypeCode_ptr const * const exceptions = 0;
+ static ::CORBA::ULong const nexceptions = 0;
+#endif /* TAO_HAS_INTERCEPTORS */
+
+ TAO::SArg_Traits< void>::ret_val retval;
+ TAO::SArg_Traits< ::ACE_InputCDR::to_boolean>::in_arg_val _tao_is_custom;
+
+ TAO::Argument * const args[] =
+ {
+ &retval,
+ &_tao_is_custom
+ };
+
+ static size_t const nargs = 2;
+
+ POA_CORBA::ValueDef * const impl =
+ static_cast<POA_CORBA::ValueDef *> (servant);
+
+ _set_is_custom_ValueDef command (
+ impl,
+ server_request.operation_details (),
+ args);
+
+ TAO::Upcall_Wrapper upcall_wrapper;
+ upcall_wrapper.upcall (server_request
+ , args
+ , nargs
+ , command
+#if TAO_HAS_INTERCEPTORS == 1
+ , servant_upcall
+ , exceptions
+ , nexceptions
+#endif /* TAO_HAS_INTERCEPTORS == 1 */
+ ACE_ENV_ARG_PARAMETER);
+ ACE_CHECK;
+}namespace POA_CORBA
+{
+
+
+ // TAO_IDL - Generated from
+ // be\be_visitor_operation/upcall_command_ss.cpp:127
+
+ class _get_is_truncatable_ValueDef
+ : public TAO::Upcall_Command
+ {
+ public:
+ inline _get_is_truncatable_ValueDef (
+ POA_CORBA::ValueDef * servant,
+ TAO_Operation_Details const * operation_details,
+ TAO::Argument * const args[])
+ : servant_ (servant)
+ , operation_details_ (operation_details)
+ , args_ (args)
+ {
+ }
+
+ virtual void execute (ACE_ENV_SINGLE_ARG_DECL)
+ {
+ TAO::SArg_Traits< ::ACE_InputCDR::to_boolean>::ret_arg_type retval =
+ TAO::Portable_Server::get_ret_arg< ::ACE_InputCDR::to_boolean> (
+ this->operation_details_,
+ this->args_);
+
+ retval =
+ this->servant_->is_truncatable (
+ ACE_ENV_SINGLE_ARG_PARAMETER);
+ ACE_CHECK;
+ }
+
+ private:
+ POA_CORBA::ValueDef * const servant_;
+ TAO_Operation_Details const * const operation_details_;
+ TAO::Argument * const * const args_;
+ };
+}
+
+
+// TAO_IDL - Generated from
+// be\be_visitor_operation/operation_ss.cpp:190
+
+void POA_CORBA::ValueDef::_get_is_truncatable_skel (
+ TAO_ServerRequest & server_request,
+ void * TAO_INTERCEPTOR (servant_upcall),
+ void * servant
+ ACE_ENV_ARG_DECL
+ )
+{
+#if TAO_HAS_INTERCEPTORS == 1
+ static ::CORBA::TypeCode_ptr const * const exceptions = 0;
+ static ::CORBA::ULong const nexceptions = 0;
+#endif /* TAO_HAS_INTERCEPTORS */
+
+ TAO::SArg_Traits< ::ACE_InputCDR::to_boolean>::ret_val retval;
+
+ TAO::Argument * const args[] =
+ {
+ &retval
+ };
+
+ static size_t const nargs = 1;
+
+ POA_CORBA::ValueDef * const impl =
+ static_cast<POA_CORBA::ValueDef *> (servant);
+
+ _get_is_truncatable_ValueDef command (
+ impl,
+ server_request.operation_details (),
+ args);
+
+ TAO::Upcall_Wrapper upcall_wrapper;
+ upcall_wrapper.upcall (server_request
+ , args
+ , nargs
+ , command
+#if TAO_HAS_INTERCEPTORS == 1
+ , servant_upcall
+ , exceptions
+ , nexceptions
+#endif /* TAO_HAS_INTERCEPTORS == 1 */
+ ACE_ENV_ARG_PARAMETER);
+ ACE_CHECK;
+}namespace POA_CORBA
+{
+
+
+ // TAO_IDL - Generated from
+ // be\be_visitor_operation/upcall_command_ss.cpp:127
+
+ class _set_is_truncatable_ValueDef
+ : public TAO::Upcall_Command
+ {
+ public:
+ inline _set_is_truncatable_ValueDef (
+ POA_CORBA::ValueDef * servant,
+ TAO_Operation_Details const * operation_details,
+ TAO::Argument * const args[])
+ : servant_ (servant)
+ , operation_details_ (operation_details)
+ , args_ (args)
+ {
+ }
+
+ virtual void execute (ACE_ENV_SINGLE_ARG_DECL)
+ {
+ TAO::SArg_Traits< ::ACE_InputCDR::to_boolean>::in_arg_type arg_1 =
+ TAO::Portable_Server::get_in_arg< ::ACE_InputCDR::to_boolean> (
+ this->operation_details_,
+ this->args_,
+ 1);
+
+ this->servant_->is_truncatable (
+ arg_1
+ ACE_ENV_ARG_PARAMETER);
+ ACE_CHECK;
+ }
+
+ private:
+ POA_CORBA::ValueDef * const servant_;
+ TAO_Operation_Details const * const operation_details_;
+ TAO::Argument * const * const args_;
+ };
+}
+
+
+// TAO_IDL - Generated from
+// be\be_visitor_operation/operation_ss.cpp:190
+
+void POA_CORBA::ValueDef::_set_is_truncatable_skel (
+ TAO_ServerRequest & server_request,
+ void * TAO_INTERCEPTOR (servant_upcall),
+ void * servant
+ ACE_ENV_ARG_DECL
+ )
+{
+#if TAO_HAS_INTERCEPTORS == 1
+ static ::CORBA::TypeCode_ptr const * const exceptions = 0;
+ static ::CORBA::ULong const nexceptions = 0;
+#endif /* TAO_HAS_INTERCEPTORS */
+
+ TAO::SArg_Traits< void>::ret_val retval;
+ TAO::SArg_Traits< ::ACE_InputCDR::to_boolean>::in_arg_val _tao_is_truncatable;
+
+ TAO::Argument * const args[] =
+ {
+ &retval,
+ &_tao_is_truncatable
+ };
+
+ static size_t const nargs = 2;
+
+ POA_CORBA::ValueDef * const impl =
+ static_cast<POA_CORBA::ValueDef *> (servant);
+
+ _set_is_truncatable_ValueDef command (
+ impl,
+ server_request.operation_details (),
+ args);
+
+ TAO::Upcall_Wrapper upcall_wrapper;
+ upcall_wrapper.upcall (server_request
+ , args
+ , nargs
+ , command
+#if TAO_HAS_INTERCEPTORS == 1
+ , servant_upcall
+ , exceptions
+ , nexceptions
+#endif /* TAO_HAS_INTERCEPTORS == 1 */
+ ACE_ENV_ARG_PARAMETER);
+ ACE_CHECK;
+}namespace POA_CORBA
+{
+
+
+ // TAO_IDL - Generated from
+ // be\be_visitor_operation/upcall_command_ss.cpp:127
+
+ class is_a_ValueDef
+ : public TAO::Upcall_Command
+ {
+ public:
+ inline is_a_ValueDef (
+ POA_CORBA::ValueDef * servant,
+ TAO_Operation_Details const * operation_details,
+ TAO::Argument * const args[])
+ : servant_ (servant)
+ , operation_details_ (operation_details)
+ , args_ (args)
+ {
+ }
+
+ virtual void execute (ACE_ENV_SINGLE_ARG_DECL)
+ {
+ TAO::SArg_Traits< ::ACE_InputCDR::to_boolean>::ret_arg_type retval =
+ TAO::Portable_Server::get_ret_arg< ::ACE_InputCDR::to_boolean> (
+ this->operation_details_,
+ this->args_);
+
+ TAO::SArg_Traits< ::CORBA::RepositoryId>::in_arg_type arg_1 =
+ TAO::Portable_Server::get_in_arg< ::CORBA::RepositoryId> (
+ this->operation_details_,
+ this->args_,
+ 1);
+
+ retval =
+ this->servant_->is_a (
+ arg_1
+ ACE_ENV_ARG_PARAMETER);
+ ACE_CHECK;
+ }
+
+ private:
+ POA_CORBA::ValueDef * const servant_;
+ TAO_Operation_Details const * const operation_details_;
+ TAO::Argument * const * const args_;
+ };
+}
+
+
+// TAO_IDL - Generated from
+// be\be_visitor_operation/operation_ss.cpp:190
+
+void POA_CORBA::ValueDef::is_a_skel (
+ TAO_ServerRequest & server_request,
+ void * TAO_INTERCEPTOR (servant_upcall),
+ void * servant
+ ACE_ENV_ARG_DECL
+ )
+{
+#if TAO_HAS_INTERCEPTORS == 1
+ static ::CORBA::TypeCode_ptr const * const exceptions = 0;
+ static ::CORBA::ULong const nexceptions = 0;
+#endif /* TAO_HAS_INTERCEPTORS */
+
+ TAO::SArg_Traits< ::ACE_InputCDR::to_boolean>::ret_val retval;
+ TAO::SArg_Traits< ::CORBA::RepositoryId>::in_arg_val _tao_id;
+
+ TAO::Argument * const args[] =
+ {
+ &retval,
+ &_tao_id
+ };
+
+ static size_t const nargs = 2;
+
+ POA_CORBA::ValueDef * const impl =
+ static_cast<POA_CORBA::ValueDef *> (servant);
+
+ is_a_ValueDef command (
+ impl,
+ server_request.operation_details (),
+ args);
+
+ TAO::Upcall_Wrapper upcall_wrapper;
+ upcall_wrapper.upcall (server_request
+ , args
+ , nargs
+ , command
+#if TAO_HAS_INTERCEPTORS == 1
+ , servant_upcall
+ , exceptions
+ , nexceptions
+#endif /* TAO_HAS_INTERCEPTORS == 1 */
+ ACE_ENV_ARG_PARAMETER);
+ ACE_CHECK;
+}namespace POA_CORBA
+{
+
+
+ // TAO_IDL - Generated from
+ // be\be_visitor_operation/upcall_command_ss.cpp:127
+
+ class describe_value_ValueDef
+ : public TAO::Upcall_Command
+ {
+ public:
+ inline describe_value_ValueDef (
+ POA_CORBA::ValueDef * servant,
+ TAO_Operation_Details const * operation_details,
+ TAO::Argument * const args[])
+ : servant_ (servant)
+ , operation_details_ (operation_details)
+ , args_ (args)
+ {
+ }
+
+ virtual void execute (ACE_ENV_SINGLE_ARG_DECL)
+ {
+ TAO::SArg_Traits< ::CORBA::ValueDef::FullValueDescription>::ret_arg_type retval =
+ TAO::Portable_Server::get_ret_arg< ::CORBA::ValueDef::FullValueDescription> (
+ this->operation_details_,
+ this->args_);
+
+ retval =
+ this->servant_->describe_value (
+ ACE_ENV_SINGLE_ARG_PARAMETER);
+ ACE_CHECK;
+ }
+
+ private:
+ POA_CORBA::ValueDef * const servant_;
+ TAO_Operation_Details const * const operation_details_;
+ TAO::Argument * const * const args_;
+ };
+}
+
+
+// TAO_IDL - Generated from
+// be\be_visitor_operation/operation_ss.cpp:190
+
+void POA_CORBA::ValueDef::describe_value_skel (
+ TAO_ServerRequest & server_request,
+ void * TAO_INTERCEPTOR (servant_upcall),
+ void * servant
+ ACE_ENV_ARG_DECL
+ )
+{
+#if TAO_HAS_INTERCEPTORS == 1
+ static ::CORBA::TypeCode_ptr const * const exceptions = 0;
+ static ::CORBA::ULong const nexceptions = 0;
+#endif /* TAO_HAS_INTERCEPTORS */
+
+ TAO::SArg_Traits< ::CORBA::ValueDef::FullValueDescription>::ret_val retval;
+
+ TAO::Argument * const args[] =
+ {
+ &retval
+ };
+
+ static size_t const nargs = 1;
+
+ POA_CORBA::ValueDef * const impl =
+ static_cast<POA_CORBA::ValueDef *> (servant);
+
+ describe_value_ValueDef command (
+ impl,
+ server_request.operation_details (),
+ args);
+
+ TAO::Upcall_Wrapper upcall_wrapper;
+ upcall_wrapper.upcall (server_request
+ , args
+ , nargs
+ , command
+#if TAO_HAS_INTERCEPTORS == 1
+ , servant_upcall
+ , exceptions
+ , nexceptions
+#endif /* TAO_HAS_INTERCEPTORS == 1 */
+ ACE_ENV_ARG_PARAMETER);
+ ACE_CHECK;
+}namespace POA_CORBA
+{
+
+
+ // TAO_IDL - Generated from
+ // be\be_visitor_operation/upcall_command_ss.cpp:127
+
+ class create_value_member_ValueDef
+ : public TAO::Upcall_Command
+ {
+ public:
+ inline create_value_member_ValueDef (
+ POA_CORBA::ValueDef * servant,
+ TAO_Operation_Details const * operation_details,
+ TAO::Argument * const args[])
+ : servant_ (servant)
+ , operation_details_ (operation_details)
+ , args_ (args)
+ {
+ }
+
+ virtual void execute (ACE_ENV_SINGLE_ARG_DECL)
+ {
+ TAO::SArg_Traits< ::CORBA::ValueMemberDef>::ret_arg_type retval =
+ TAO::Portable_Server::get_ret_arg< ::CORBA::ValueMemberDef> (
+ this->operation_details_,
+ this->args_);
+
+ TAO::SArg_Traits< ::CORBA::RepositoryId>::in_arg_type arg_1 =
+ TAO::Portable_Server::get_in_arg< ::CORBA::RepositoryId> (
+ this->operation_details_,
+ this->args_,
+ 1);
+
+ TAO::SArg_Traits< ::CORBA::Identifier>::in_arg_type arg_2 =
+ TAO::Portable_Server::get_in_arg< ::CORBA::Identifier> (
+ this->operation_details_,
+ this->args_,
+ 2);
+
+ TAO::SArg_Traits< ::CORBA::VersionSpec>::in_arg_type arg_3 =
+ TAO::Portable_Server::get_in_arg< ::CORBA::VersionSpec> (
+ this->operation_details_,
+ this->args_,
+ 3);
+
+ TAO::SArg_Traits< ::CORBA::IDLType>::in_arg_type arg_4 =
+ TAO::Portable_Server::get_in_arg< ::CORBA::IDLType> (
+ this->operation_details_,
+ this->args_,
+ 4);
+
+ TAO::SArg_Traits< ::CORBA::Visibility>::in_arg_type arg_5 =
+ TAO::Portable_Server::get_in_arg< ::CORBA::Visibility> (
+ this->operation_details_,
+ this->args_,
+ 5);
+
+ retval =
+ this->servant_->create_value_member (
+ arg_1
+ , arg_2
+ , arg_3
+ , arg_4
+ , arg_5
+ ACE_ENV_ARG_PARAMETER);
+ ACE_CHECK;
+ }
+
+ private:
+ POA_CORBA::ValueDef * const servant_;
+ TAO_Operation_Details const * const operation_details_;
+ TAO::Argument * const * const args_;
+ };
+}
+
+
+// TAO_IDL - Generated from
+// be\be_visitor_operation/operation_ss.cpp:190
+
+void POA_CORBA::ValueDef::create_value_member_skel (
+ TAO_ServerRequest & server_request,
+ void * TAO_INTERCEPTOR (servant_upcall),
+ void * servant
+ ACE_ENV_ARG_DECL
+ )
+{
+#if TAO_HAS_INTERCEPTORS == 1
+ static ::CORBA::TypeCode_ptr const * const exceptions = 0;
+ static ::CORBA::ULong const nexceptions = 0;
+#endif /* TAO_HAS_INTERCEPTORS */
+
+ TAO::SArg_Traits< ::CORBA::ValueMemberDef>::ret_val retval;
+ TAO::SArg_Traits< ::CORBA::RepositoryId>::in_arg_val _tao_id;
+ TAO::SArg_Traits< ::CORBA::Identifier>::in_arg_val _tao_name;
+ TAO::SArg_Traits< ::CORBA::VersionSpec>::in_arg_val _tao_version;
+ TAO::SArg_Traits< ::CORBA::IDLType>::in_arg_val _tao_type;
+ TAO::SArg_Traits< ::CORBA::Visibility>::in_arg_val _tao_access;
+
+ TAO::Argument * const args[] =
+ {
+ &retval,
+ &_tao_id,
+ &_tao_name,
+ &_tao_version,
+ &_tao_type,
+ &_tao_access
+ };
+
+ static size_t const nargs = 6;
+
+ POA_CORBA::ValueDef * const impl =
+ static_cast<POA_CORBA::ValueDef *> (servant);
+
+ create_value_member_ValueDef command (
+ impl,
+ server_request.operation_details (),
+ args);
+
+ TAO::Upcall_Wrapper upcall_wrapper;
+ upcall_wrapper.upcall (server_request
+ , args
+ , nargs
+ , command
+#if TAO_HAS_INTERCEPTORS == 1
+ , servant_upcall
+ , exceptions
+ , nexceptions
+#endif /* TAO_HAS_INTERCEPTORS == 1 */
+ ACE_ENV_ARG_PARAMETER);
+ ACE_CHECK;
+}namespace POA_CORBA
+{
+
+
+ // TAO_IDL - Generated from
+ // be\be_visitor_operation/upcall_command_ss.cpp:127
+
+ class create_attribute_ValueDef
+ : public TAO::Upcall_Command
+ {
+ public:
+ inline create_attribute_ValueDef (
+ POA_CORBA::ValueDef * servant,
+ TAO_Operation_Details const * operation_details,
+ TAO::Argument * const args[])
+ : servant_ (servant)
+ , operation_details_ (operation_details)
+ , args_ (args)
+ {
+ }
+
+ virtual void execute (ACE_ENV_SINGLE_ARG_DECL)
+ {
+ TAO::SArg_Traits< ::CORBA::AttributeDef>::ret_arg_type retval =
+ TAO::Portable_Server::get_ret_arg< ::CORBA::AttributeDef> (
+ this->operation_details_,
+ this->args_);
+
+ TAO::SArg_Traits< ::CORBA::RepositoryId>::in_arg_type arg_1 =
+ TAO::Portable_Server::get_in_arg< ::CORBA::RepositoryId> (
+ this->operation_details_,
+ this->args_,
+ 1);
+
+ TAO::SArg_Traits< ::CORBA::Identifier>::in_arg_type arg_2 =
+ TAO::Portable_Server::get_in_arg< ::CORBA::Identifier> (
+ this->operation_details_,
+ this->args_,
+ 2);
+
+ TAO::SArg_Traits< ::CORBA::VersionSpec>::in_arg_type arg_3 =
+ TAO::Portable_Server::get_in_arg< ::CORBA::VersionSpec> (
+ this->operation_details_,
+ this->args_,
+ 3);
+
+ TAO::SArg_Traits< ::CORBA::IDLType>::in_arg_type arg_4 =
+ TAO::Portable_Server::get_in_arg< ::CORBA::IDLType> (
+ this->operation_details_,
+ this->args_,
+ 4);
+
+ TAO::SArg_Traits< ::CORBA::AttributeMode>::in_arg_type arg_5 =
+ TAO::Portable_Server::get_in_arg< ::CORBA::AttributeMode> (
+ this->operation_details_,
+ this->args_,
+ 5);
+
+ retval =
+ this->servant_->create_attribute (
+ arg_1
+ , arg_2
+ , arg_3
+ , arg_4
+ , arg_5
+ ACE_ENV_ARG_PARAMETER);
+ ACE_CHECK;
+ }
+
+ private:
+ POA_CORBA::ValueDef * const servant_;
+ TAO_Operation_Details const * const operation_details_;
+ TAO::Argument * const * const args_;
+ };
+}
+
+
+// TAO_IDL - Generated from
+// be\be_visitor_operation/operation_ss.cpp:190
+
+void POA_CORBA::ValueDef::create_attribute_skel (
+ TAO_ServerRequest & server_request,
+ void * TAO_INTERCEPTOR (servant_upcall),
+ void * servant
+ ACE_ENV_ARG_DECL
+ )
+{
+#if TAO_HAS_INTERCEPTORS == 1
+ static ::CORBA::TypeCode_ptr const * const exceptions = 0;
+ static ::CORBA::ULong const nexceptions = 0;
+#endif /* TAO_HAS_INTERCEPTORS */
+
+ TAO::SArg_Traits< ::CORBA::AttributeDef>::ret_val retval;
+ TAO::SArg_Traits< ::CORBA::RepositoryId>::in_arg_val _tao_id;
+ TAO::SArg_Traits< ::CORBA::Identifier>::in_arg_val _tao_name;
+ TAO::SArg_Traits< ::CORBA::VersionSpec>::in_arg_val _tao_version;
+ TAO::SArg_Traits< ::CORBA::IDLType>::in_arg_val _tao_type;
+ TAO::SArg_Traits< ::CORBA::AttributeMode>::in_arg_val _tao_mode;
+
+ TAO::Argument * const args[] =
+ {
+ &retval,
+ &_tao_id,
+ &_tao_name,
+ &_tao_version,
+ &_tao_type,
+ &_tao_mode
+ };
+
+ static size_t const nargs = 6;
+
+ POA_CORBA::ValueDef * const impl =
+ static_cast<POA_CORBA::ValueDef *> (servant);
+
+ create_attribute_ValueDef command (
+ impl,
+ server_request.operation_details (),
+ args);
+
+ TAO::Upcall_Wrapper upcall_wrapper;
+ upcall_wrapper.upcall (server_request
+ , args
+ , nargs
+ , command
+#if TAO_HAS_INTERCEPTORS == 1
+ , servant_upcall
+ , exceptions
+ , nexceptions
+#endif /* TAO_HAS_INTERCEPTORS == 1 */
+ ACE_ENV_ARG_PARAMETER);
+ ACE_CHECK;
+}namespace POA_CORBA
+{
+
+
+ // TAO_IDL - Generated from
+ // be\be_visitor_operation/upcall_command_ss.cpp:127
+
+ class create_operation_ValueDef
+ : public TAO::Upcall_Command
+ {
+ public:
+ inline create_operation_ValueDef (
+ POA_CORBA::ValueDef * servant,
+ TAO_Operation_Details const * operation_details,
+ TAO::Argument * const args[])
+ : servant_ (servant)
+ , operation_details_ (operation_details)
+ , args_ (args)
+ {
+ }
+
+ virtual void execute (ACE_ENV_SINGLE_ARG_DECL)
+ {
+ TAO::SArg_Traits< ::CORBA::OperationDef>::ret_arg_type retval =
+ TAO::Portable_Server::get_ret_arg< ::CORBA::OperationDef> (
+ this->operation_details_,
+ this->args_);
+
+ TAO::SArg_Traits< ::CORBA::RepositoryId>::in_arg_type arg_1 =
+ TAO::Portable_Server::get_in_arg< ::CORBA::RepositoryId> (
+ this->operation_details_,
+ this->args_,
+ 1);
+
+ TAO::SArg_Traits< ::CORBA::Identifier>::in_arg_type arg_2 =
+ TAO::Portable_Server::get_in_arg< ::CORBA::Identifier> (
+ this->operation_details_,
+ this->args_,
+ 2);
+
+ TAO::SArg_Traits< ::CORBA::VersionSpec>::in_arg_type arg_3 =
+ TAO::Portable_Server::get_in_arg< ::CORBA::VersionSpec> (
+ this->operation_details_,
+ this->args_,
+ 3);
+
+ TAO::SArg_Traits< ::CORBA::IDLType>::in_arg_type arg_4 =
+ TAO::Portable_Server::get_in_arg< ::CORBA::IDLType> (
+ this->operation_details_,
+ this->args_,
+ 4);
+
+ TAO::SArg_Traits< ::CORBA::OperationMode>::in_arg_type arg_5 =
+ TAO::Portable_Server::get_in_arg< ::CORBA::OperationMode> (
+ this->operation_details_,
+ this->args_,
+ 5);
+
+ TAO::SArg_Traits< ::CORBA::ParDescriptionSeq>::in_arg_type arg_6 =
+ TAO::Portable_Server::get_in_arg< ::CORBA::ParDescriptionSeq> (
+ this->operation_details_,
+ this->args_,
+ 6);
+
+ TAO::SArg_Traits< ::CORBA::ExceptionDefSeq>::in_arg_type arg_7 =
+ TAO::Portable_Server::get_in_arg< ::CORBA::ExceptionDefSeq> (
+ this->operation_details_,
+ this->args_,
+ 7);
+
+ TAO::SArg_Traits< ::CORBA::ContextIdSeq>::in_arg_type arg_8 =
+ TAO::Portable_Server::get_in_arg< ::CORBA::ContextIdSeq> (
+ this->operation_details_,
+ this->args_,
+ 8);
+
+ retval =
+ this->servant_->create_operation (
+ arg_1
+ , arg_2
+ , arg_3
+ , arg_4
+ , arg_5
+ , arg_6
+ , arg_7
+ , arg_8
+ ACE_ENV_ARG_PARAMETER);
+ ACE_CHECK;
+ }
+
+ private:
+ POA_CORBA::ValueDef * const servant_;
+ TAO_Operation_Details const * const operation_details_;
+ TAO::Argument * const * const args_;
+ };
+}
+
+
+// TAO_IDL - Generated from
+// be\be_visitor_operation/operation_ss.cpp:190
+
+void POA_CORBA::ValueDef::create_operation_skel (
+ TAO_ServerRequest & server_request,
+ void * TAO_INTERCEPTOR (servant_upcall),
+ void * servant
+ ACE_ENV_ARG_DECL
+ )
+{
+#if TAO_HAS_INTERCEPTORS == 1
+ static ::CORBA::TypeCode_ptr const * const exceptions = 0;
+ static ::CORBA::ULong const nexceptions = 0;
+#endif /* TAO_HAS_INTERCEPTORS */
+
+ TAO::SArg_Traits< ::CORBA::OperationDef>::ret_val retval;
+ TAO::SArg_Traits< ::CORBA::RepositoryId>::in_arg_val _tao_id;
+ TAO::SArg_Traits< ::CORBA::Identifier>::in_arg_val _tao_name;
+ TAO::SArg_Traits< ::CORBA::VersionSpec>::in_arg_val _tao_version;
+ TAO::SArg_Traits< ::CORBA::IDLType>::in_arg_val _tao_result;
+ TAO::SArg_Traits< ::CORBA::OperationMode>::in_arg_val _tao_mode;
+ TAO::SArg_Traits< ::CORBA::ParDescriptionSeq>::in_arg_val _tao_params;
+ TAO::SArg_Traits< ::CORBA::ExceptionDefSeq>::in_arg_val _tao_exceptions;
+ TAO::SArg_Traits< ::CORBA::ContextIdSeq>::in_arg_val _tao_contexts;
+
+ TAO::Argument * const args[] =
+ {
+ &retval,
+ &_tao_id,
+ &_tao_name,
+ &_tao_version,
+ &_tao_result,
+ &_tao_mode,
+ &_tao_params,
+ &_tao_exceptions,
+ &_tao_contexts
+ };
+
+ static size_t const nargs = 9;
+
+ POA_CORBA::ValueDef * const impl =
+ static_cast<POA_CORBA::ValueDef *> (servant);
+
+ create_operation_ValueDef command (
+ impl,
+ server_request.operation_details (),
+ args);
+
+ TAO::Upcall_Wrapper upcall_wrapper;
+ upcall_wrapper.upcall (server_request
+ , args
+ , nargs
+ , command
+#if TAO_HAS_INTERCEPTORS == 1
+ , servant_upcall
+ , exceptions
+ , nexceptions
+#endif /* TAO_HAS_INTERCEPTORS == 1 */
+ ACE_ENV_ARG_PARAMETER);
+ ACE_CHECK;
+}
+
+// TAO_IDL - Generated from
+// be\be_visitor_interface/interface_ss.cpp:169
+
+namespace POA_CORBA
+{
+
+
+ // TAO_IDL - Generated from
+ // be\be_visitor_operation/upcall_command_ss.cpp:127
+
+ class _is_a_ValueDef_Upcall_Command
+ : public TAO::Upcall_Command
+ {
+ public:
+ inline _is_a_ValueDef_Upcall_Command (
+ POA_CORBA::ValueDef * servant,
+ TAO_Operation_Details const * operation_details,
+ TAO::Argument * const args[])
+ : servant_ (servant)
+ , operation_details_ (operation_details)
+ , args_ (args)
+ {
+ }
+
+ virtual void execute (ACE_ENV_SINGLE_ARG_DECL)
+ {
+ TAO::SArg_Traits< ::ACE_InputCDR::to_boolean>::ret_arg_type retval =
+ TAO::Portable_Server::get_ret_arg< ::ACE_InputCDR::to_boolean> (
+ this->operation_details_,
+ this->args_);
+
+ TAO::SArg_Traits< ::CORBA::Char *>::in_arg_type arg_1 =
+ TAO::Portable_Server::get_in_arg< ::CORBA::Char *> (
+ this->operation_details_,
+ this->args_,
+ 1);
+
+ retval =
+ this->servant_-> _is_a (
+ arg_1
+ ACE_ENV_ARG_PARAMETER);
+ ACE_CHECK;
+ }
+
+ private:
+ POA_CORBA::ValueDef * const servant_;
+ TAO_Operation_Details const * const operation_details_;
+ TAO::Argument * const * const args_;
+ };
+}
+
+
+void POA_CORBA::ValueDef::_is_a_skel (
+ TAO_ServerRequest & server_request,
+ void * TAO_INTERCEPTOR (servant_upcall),
+ void * servant
+ ACE_ENV_ARG_DECL
+ )
+{
+#if TAO_HAS_INTERCEPTORS == 1
+ static ::CORBA::TypeCode_ptr const * const exceptions = 0;
+ static ::CORBA::ULong const nexceptions = 0;
+#endif /* TAO_HAS_INTERCEPTORS */
+
+ TAO::SArg_Traits< ::ACE_InputCDR::to_boolean>::ret_val retval;
+ TAO::SArg_Traits< ::CORBA::Char *>::in_arg_val _tao_repository_id;
+
+ TAO::Argument * const args[] =
+ {
+ &retval,
+ &_tao_repository_id
+ };
+
+ static size_t const nargs = 2;
+
+ POA_CORBA::ValueDef * const impl =
+ static_cast<POA_CORBA::ValueDef *> (servant);
+
+ _is_a_ValueDef_Upcall_Command command (
+ impl,
+ server_request.operation_details (),
+ args);
+
+ TAO::Upcall_Wrapper upcall_wrapper;
+ upcall_wrapper.upcall (server_request
+ , args
+ , nargs
+ , command
+#if TAO_HAS_INTERCEPTORS == 1
+ , servant_upcall
+ , exceptions
+ , nexceptions
+#endif /* TAO_HAS_INTERCEPTORS == 1 */
+ ACE_ENV_ARG_PARAMETER);
+ ACE_CHECK;
+}namespace POA_CORBA
+{
+
+
+ // TAO_IDL - Generated from
+ // be\be_visitor_operation/upcall_command_ss.cpp:127
+
+ class _non_existent_ValueDef_Upcall_Command
+ : public TAO::Upcall_Command
+ {
+ public:
+ inline _non_existent_ValueDef_Upcall_Command (
+ POA_CORBA::ValueDef * servant,
+ TAO_Operation_Details const * operation_details,
+ TAO::Argument * const args[])
+ : servant_ (servant)
+ , operation_details_ (operation_details)
+ , args_ (args)
+ {
+ }
+
+ virtual void execute (ACE_ENV_SINGLE_ARG_DECL)
+ {
+ TAO::SArg_Traits< ::ACE_InputCDR::to_boolean>::ret_arg_type retval =
+ TAO::Portable_Server::get_ret_arg< ::ACE_InputCDR::to_boolean> (
+ this->operation_details_,
+ this->args_);
+
+ retval =
+ this->servant_-> _non_existent (
+ ACE_ENV_SINGLE_ARG_PARAMETER);
+ ACE_CHECK;
+ }
+
+ private:
+ POA_CORBA::ValueDef * const servant_;
+ TAO_Operation_Details const * const operation_details_;
+ TAO::Argument * const * const args_;
+ };
+}
+
+
+void POA_CORBA::ValueDef::_non_existent_skel (
+ TAO_ServerRequest & server_request,
+ void * TAO_INTERCEPTOR (servant_upcall),
+ void * servant
+ ACE_ENV_ARG_DECL
+ )
+{
+#if TAO_HAS_INTERCEPTORS == 1
+ static ::CORBA::TypeCode_ptr const * const exceptions = 0;
+ static ::CORBA::ULong const nexceptions = 0;
+#endif /* TAO_HAS_INTERCEPTORS */
+
+ TAO::SArg_Traits< ::ACE_InputCDR::to_boolean>::ret_val retval;
+
+ TAO::Argument * const args[] =
+ {
+ &retval
+ };
+
+ static size_t const nargs = 1;
+
+ POA_CORBA::ValueDef * const impl =
+ static_cast<POA_CORBA::ValueDef *> (servant);
+
+ _non_existent_ValueDef_Upcall_Command command (
+ impl,
+ server_request.operation_details (),
+ args);
+
+ TAO::Upcall_Wrapper upcall_wrapper;
+ upcall_wrapper.upcall (server_request
+ , args
+ , nargs
+ , command
+#if TAO_HAS_INTERCEPTORS == 1
+ , servant_upcall
+ , exceptions
+ , nexceptions
+#endif /* TAO_HAS_INTERCEPTORS == 1 */
+ ACE_ENV_ARG_PARAMETER);
+ ACE_CHECK;
+}namespace POA_CORBA
+{
+
+
+ // TAO_IDL - Generated from
+ // be\be_visitor_operation/upcall_command_ss.cpp:127
+
+ class _repository_id_ValueDef_Upcall_Command
+ : public TAO::Upcall_Command
+ {
+ public:
+ inline _repository_id_ValueDef_Upcall_Command (
+ POA_CORBA::ValueDef * servant,
+ TAO_Operation_Details const * operation_details,
+ TAO::Argument * const args[])
+ : servant_ (servant)
+ , operation_details_ (operation_details)
+ , args_ (args)
+ {
+ }
+
+ virtual void execute (ACE_ENV_SINGLE_ARG_DECL)
+ {
+ TAO::SArg_Traits< ::CORBA::Char *>::ret_arg_type retval =
+ TAO::Portable_Server::get_ret_arg< ::CORBA::Char *> (
+ this->operation_details_,
+ this->args_);
+
+ retval =
+ this->servant_-> _repository_id (
+ ACE_ENV_SINGLE_ARG_PARAMETER);
+ ACE_CHECK;
+ }
+
+ private:
+ POA_CORBA::ValueDef * const servant_;
+ TAO_Operation_Details const * const operation_details_;
+ TAO::Argument * const * const args_;
+ };
+}
+
+
+void POA_CORBA::ValueDef::_repository_id_skel (
+ TAO_ServerRequest & server_request,
+ void * TAO_INTERCEPTOR (servant_upcall),
+ void * servant
+ ACE_ENV_ARG_DECL
+ )
+{
+#if TAO_HAS_INTERCEPTORS == 1
+ static ::CORBA::TypeCode_ptr const * const exceptions = 0;
+ static ::CORBA::ULong const nexceptions = 0;
+#endif /* TAO_HAS_INTERCEPTORS */
+
+ TAO::SArg_Traits< ::CORBA::Char *>::ret_val retval;
+
+ TAO::Argument * const args[] =
+ {
+ &retval
+ };
+
+ static size_t const nargs = 1;
+
+ POA_CORBA::ValueDef * const impl =
+ static_cast<POA_CORBA::ValueDef *> (servant);
+
+ _repository_id_ValueDef_Upcall_Command command (
+ impl,
+ server_request.operation_details (),
+ args);
+
+ TAO::Upcall_Wrapper upcall_wrapper;
+ upcall_wrapper.upcall (server_request
+ , args
+ , nargs
+ , command
+#if TAO_HAS_INTERCEPTORS == 1
+ , servant_upcall
+ , exceptions
+ , nexceptions
+#endif /* TAO_HAS_INTERCEPTORS == 1 */
+ ACE_ENV_ARG_PARAMETER);
+ ACE_CHECK;
+}
+
+// TAO_IDL - Generated from
+// be\be_visitor_interface/interface_ss.cpp:513
+
+void POA_CORBA::ValueDef::_interface_skel (
+ TAO_ServerRequest & server_request,
+ void * /* servant_upcall */,
+ void * servant
+ ACE_ENV_ARG_DECL
+ )
+{
+ TAO_IFR_Client_Adapter *_tao_adapter =
+ ACE_Dynamic_Service<TAO_IFR_Client_Adapter>::instance (
+ TAO_ORB_Core::ifr_client_adapter_name ()
+ );
+
+ if (_tao_adapter == 0)
+ {
+ ACE_THROW ( ::CORBA::INTF_REPOS ( ::CORBA::OMGVMCID | 1,
+ ::CORBA::COMPLETED_NO));
+ }
+
+ POA_CORBA::ValueDef * const impl =
+ static_cast<POA_CORBA::ValueDef *> (servant);
+ ::CORBA::InterfaceDef_ptr _tao_retval =
+ impl->_get_interface (ACE_ENV_SINGLE_ARG_PARAMETER);
+ ACE_CHECK;
+
+ server_request.init_reply ();
+ TAO_OutputCDR &_tao_out = *server_request.outgoing ();
+
+ ::CORBA::Boolean const _tao_result =
+ _tao_adapter->interfacedef_cdr_insert (
+ _tao_out,
+ _tao_retval
+ );
+
+ _tao_adapter->dispose (_tao_retval);
+
+ if (_tao_result == false)
+ {
+ ACE_THROW ( ::CORBA::MARSHAL ());
+ }
+}namespace POA_CORBA
+{
+
+
+ // TAO_IDL - Generated from
+ // be\be_visitor_operation/upcall_command_ss.cpp:127
+
+ class _get_component_ValueDef_Upcall_Command
+ : public TAO::Upcall_Command
+ {
+ public:
+ inline _get_component_ValueDef_Upcall_Command (
+ POA_CORBA::ValueDef * servant,
+ TAO_Operation_Details const * operation_details,
+ TAO::Argument * const args[])
+ : servant_ (servant)
+ , operation_details_ (operation_details)
+ , args_ (args)
+ {
+ }
+
+ virtual void execute (ACE_ENV_SINGLE_ARG_DECL)
+ {
+ TAO::SArg_Traits< ::CORBA::Object>::ret_arg_type retval =
+ TAO::Portable_Server::get_ret_arg< ::CORBA::Object> (
+ this->operation_details_,
+ this->args_);
+
+ retval =
+ this->servant_-> _get_component (
+ ACE_ENV_SINGLE_ARG_PARAMETER);
+ ACE_CHECK;
+ }
+
+ private:
+ POA_CORBA::ValueDef * const servant_;
+ TAO_Operation_Details const * const operation_details_;
+ TAO::Argument * const * const args_;
+ };
+}
+
+
+void POA_CORBA::ValueDef::_component_skel (
+ TAO_ServerRequest & server_request,
+ void * TAO_INTERCEPTOR (servant_upcall),
+ void * servant
+ ACE_ENV_ARG_DECL
+ )
+{
+#if TAO_HAS_INTERCEPTORS == 1
+ static ::CORBA::TypeCode_ptr const * const exceptions = 0;
+ static ::CORBA::ULong const nexceptions = 0;
+#endif /* TAO_HAS_INTERCEPTORS */
+
+ TAO::SArg_Traits< ::CORBA::Object>::ret_val retval;
+
+ TAO::Argument * const args[] =
+ {
+ &retval
+ };
+
+ static size_t const nargs = 1;
+
+ POA_CORBA::ValueDef * const impl =
+ static_cast<POA_CORBA::ValueDef *> (servant);
+
+ _get_component_ValueDef_Upcall_Command command (
+ impl,
+ server_request.operation_details (),
+ args);
+
+ TAO::Upcall_Wrapper upcall_wrapper;
+ upcall_wrapper.upcall (server_request
+ , args
+ , nargs
+ , command
+#if TAO_HAS_INTERCEPTORS == 1
+ , servant_upcall
+ , exceptions
+ , nexceptions
+#endif /* TAO_HAS_INTERCEPTORS == 1 */
+ ACE_ENV_ARG_PARAMETER);
+ ACE_CHECK;
+}
+
+::CORBA::Boolean POA_CORBA::ValueDef::_is_a (
+ const char* value
+ ACE_ENV_ARG_DECL_NOT_USED
+ )
+{
+ return
+ (
+ !ACE_OS::strcmp (
+ value,
+ "IDL:omg.org/CORBA/IRObject:1.0"
+ ) ||
+ !ACE_OS::strcmp (
+ value,
+ "IDL:omg.org/CORBA/Container:1.0"
+ ) ||
+ !ACE_OS::strcmp (
+ value,
+ "IDL:omg.org/CORBA/Contained:1.0"
+ ) ||
+ !ACE_OS::strcmp (
+ value,
+ "IDL:omg.org/CORBA/IDLType:1.0"
+ ) ||
+ !ACE_OS::strcmp (
+ value,
+ "IDL:omg.org/CORBA/ValueDef:1.0"
+ ) ||
+ !ACE_OS::strcmp (
+ value,
+ "IDL:omg.org/CORBA/Object:1.0"
+ )
+ );
+}
+
+const char* POA_CORBA::ValueDef::_interface_repository_id (void) const
+{
+ return "IDL:omg.org/CORBA/ValueDef:1.0";
+}
+
+// TAO_IDL - Generated from
+// be\be_visitor_interface/interface_ss.cpp:903
+
+void POA_CORBA::ValueDef::_dispatch (
+ TAO_ServerRequest & req,
+ void * servant_upcall
+ ACE_ENV_ARG_DECL
+ )
+{
+ this->synchronous_upcall_dispatch (req,
+ servant_upcall,
+ this
+ ACE_ENV_ARG_PARAMETER);
+}
+
+// TAO_IDL - Generated from
+// be\be_visitor_interface/interface_ss.cpp:851
+
+CORBA::ValueDef *
+POA_CORBA::ValueDef::_this (ACE_ENV_SINGLE_ARG_DECL)
+{
+ TAO_Stub *stub = this->_create_stub (ACE_ENV_SINGLE_ARG_PARAMETER);
+ ACE_CHECK_RETURN (0);
+
+ TAO_Stub_Auto_Ptr safe_stub (stub);
+ ::CORBA::Object_ptr tmp = CORBA::Object::_nil ();
+
+ ::CORBA::Boolean const _tao_opt_colloc =
+ stub->servant_orb_var ()->orb_core ()->optimize_collocation_objects ();
+
+ ACE_NEW_RETURN (
+ tmp,
+ ::CORBA::Object (stub, _tao_opt_colloc, this),
+ 0
+ );
+
+ ::CORBA::Object_var obj = tmp;
+ (void) safe_stub.release ();
+
+ typedef ::CORBA::ValueDef STUB_SCOPED_NAME;
+ return
+ TAO::Narrow_Utils<STUB_SCOPED_NAME>::unchecked_narrow (
+ obj.in (),
+ CORBA__TAO_ValueDef_Proxy_Broker_Factory_function_pointer
+ );
+}
+
+// TAO_IDL - Generated from
+// be\be_interface.cpp:1499
+
+class TAO_CORBA_ExtValueDef_Perfect_Hash_OpTable
+ : public TAO_Perfect_Hash_OpTable
+{
+private:
+ unsigned int hash (const char *str, unsigned int len);
+
+public:
+ const TAO_operation_db_entry * lookup (const char *str, unsigned int len);
+};
+
+/* C++ code produced by gperf version 2.8 (ACE version) */
+/* Command-line: C:\ACE\latest\ACE_wrappers\bin\gperf.exe -m -M -J -c -C -D -E -T -f 0 -F 0,0 -a -o -t -p -K opname -L C++ -Z TAO_CORBA_ExtValueDef_Perfect_Hash_OpTable -N lookup */
+unsigned int
+TAO_CORBA_ExtValueDef_Perfect_Hash_OpTable::hash (const char *str, unsigned int len)
+{
+ static const unsigned char asso_values[] =
+ {
+#if defined (ACE_MVS)
+ 109, 109, 109, 109, 109, 109, 109, 109, 109, 109,
+ 109, 109, 109, 109, 109, 109, 109, 109, 109, 109,
+ 109, 109, 109, 109, 109, 109, 109, 109, 109, 109,
+ 109, 109, 109, 109, 109, 109, 109, 109, 109, 109,
+ 109, 109, 109, 109, 109, 109, 109, 109, 109, 109,
+ 109, 109, 109, 109, 109, 109, 109, 109, 109, 109,
+ 109, 109, 109, 109, 109, 109, 109, 109, 109, 109,
+ 109, 109, 109, 109, 109, 109, 109, 109, 109, 109,
+ 109, 109, 109, 109, 109, 109, 109, 109, 109, 109,
+ 109, 109, 109, 109, 109, 109, 109, 109, 109, 109,
+ 109, 109, 109, 109, 109, 109, 109, 109, 109, 0,
+ 109, 109, 109, 109, 109, 109, 109, 109, 109, 109,
+ 109, 109, 109, 109, 109, 109, 109, 109, 109, 0,
+ 109, 15, 50, 40, 109, 109, 109, 0, 109, 109,
+ 109, 109, 109, 109, 109, 109, 109, 0, 0, 0,
+ 109, 0, 109, 0, 109, 109, 109, 109, 109, 109,
+ 109, 109, 15, 0, 109, 109, 109, 15, 15, 109,
+ 109, 109, 109, 109, 109, 109, 109, 109, 109, 109,
+ 109, 109, 109, 109, 109, 109, 109, 109, 109, 109,
+ 109, 109, 109, 109, 109, 109, 109, 109, 109, 109,
+ 109, 109, 109, 109, 109, 109, 109, 109, 109, 109,
+ 109, 109, 109, 109, 109, 109, 109, 109, 109, 109,
+ 109, 109, 109, 109, 109, 109, 109, 109, 109, 109,
+ 109, 109, 109, 109, 109, 109, 109, 109, 109, 109,
+ 109, 109, 109, 109, 109, 109, 109, 109, 109, 109,
+ 109, 109, 109, 109, 109, 109,
+#else
+ 109, 109, 109, 109, 109, 109, 109, 109, 109, 109,
+ 109, 109, 109, 109, 109, 109, 109, 109, 109, 109,
+ 109, 109, 109, 109, 109, 109, 109, 109, 109, 109,
+ 109, 109, 109, 109, 109, 109, 109, 109, 109, 109,
+ 109, 109, 109, 109, 109, 109, 109, 109, 109, 109,
+ 109, 109, 109, 109, 109, 109, 109, 109, 109, 109,
+ 109, 109, 109, 109, 109, 109, 109, 109, 109, 109,
+ 109, 109, 109, 109, 109, 109, 109, 109, 109, 109,
+ 109, 109, 109, 109, 109, 109, 109, 109, 109, 109,
+ 109, 109, 109, 109, 109, 0, 109, 0, 109, 15,
+ 50, 40, 109, 109, 109, 0, 109, 109, 0, 0,
+ 0, 109, 0, 109, 0, 15, 0, 109, 109, 109,
+ 15, 15, 109, 109, 109, 109, 109, 109,
+#endif /* ACE_MVS */
+ };
+ return len + asso_values[(int) str[len - 1]] + asso_values[(int) str[0]];
+}
+
+const TAO_operation_db_entry *
+TAO_CORBA_ExtValueDef_Perfect_Hash_OpTable::lookup (const char *str, unsigned int len)
+{
+ enum
+ {
+ TOTAL_KEYWORDS = 60,
+ MIN_WORD_LENGTH = 4,
+ MAX_WORD_LENGTH = 26,
+ MIN_HASH_VALUE = 4,
+ MAX_HASH_VALUE = 108,
+ HASH_VALUE_RANGE = 105,
+ DUPLICATES = 18,
+ WORDLIST_SIZE = 64
+ };
+
+ static const TAO_operation_db_entry wordlist[] =
+ {
+ {"",0,0},{"",0,0},{"",0,0},{"",0,0},
+ {"is_a", &POA_CORBA::ExtValueDef::is_a_skel, 0},
+ {"_is_a", &POA_CORBA::ExtValueDef::_is_a_skel, 0},
+ {"lookup", &POA_CORBA::ExtValueDef::lookup_skel, 0},
+ {"_component", &POA_CORBA::ExtValueDef::_component_skel, 0},
+ {"_get_version", &POA_CORBA::ExtValueDef::_get_version_skel, 0},
+ {"_set_version", &POA_CORBA::ExtValueDef::_set_version_skel, 0},
+ {"_non_existent", &POA_CORBA::ExtValueDef::_non_existent_skel, 0},
+ {"_get_is_custom", &POA_CORBA::ExtValueDef::_get_is_custom_skel, 0},
+ {"_set_is_custom", &POA_CORBA::ExtValueDef::_set_is_custom_skel, 0},
+ {"_get_defined_in", &POA_CORBA::ExtValueDef::_get_defined_in_skel, 0},
+ {"_get_is_abstract", &POA_CORBA::ExtValueDef::_get_is_abstract_skel, 0},
+ {"_set_is_abstract", &POA_CORBA::ExtValueDef::_set_is_abstract_skel, 0},
+ {"create_enum", &POA_CORBA::ExtValueDef::create_enum_skel, 0},
+ {"create_union", &POA_CORBA::ExtValueDef::create_union_skel, 0},
+ {"create_struct", &POA_CORBA::ExtValueDef::create_struct_skel, 0},
+ {"create_constant", &POA_CORBA::ExtValueDef::create_constant_skel, 0},
+ {"create_exception", &POA_CORBA::ExtValueDef::create_exception_skel, 0},
+ {"create_operation", &POA_CORBA::ExtValueDef::create_operation_skel, 0},
+ {"_get_initializers", &POA_CORBA::ExtValueDef::_get_initializers_skel, 0},
+ {"_set_initializers", &POA_CORBA::ExtValueDef::_set_initializers_skel, 0},
+ {"create_value_member", &POA_CORBA::ExtValueDef::create_value_member_skel, 0},
+ {"_get_ext_initializers", &POA_CORBA::ExtValueDef::_get_ext_initializers_skel, 0},
+ {"_set_ext_initializers", &POA_CORBA::ExtValueDef::_set_ext_initializers_skel, 0},
+ {"contents", &POA_CORBA::ExtValueDef::contents_skel, 0},
+ {"_get_supported_interfaces", &POA_CORBA::ExtValueDef::_get_supported_interfaces_skel, 0},
+ {"_set_abstract_base_values", &POA_CORBA::ExtValueDef::_set_abstract_base_values_skel, 0},
+ {"_get_abstract_base_values", &POA_CORBA::ExtValueDef::_get_abstract_base_values_skel, 0},
+ {"_set_supported_interfaces", &POA_CORBA::ExtValueDef::_set_supported_interfaces_skel, 0},
+ {"_get_containing_repository", &POA_CORBA::ExtValueDef::_get_containing_repository_skel, 0},
+ {"create_alias", &POA_CORBA::ExtValueDef::create_alias_skel, 0},
+ {"move", &POA_CORBA::ExtValueDef::move_skel, 0},
+ {"create_value_box", &POA_CORBA::ExtValueDef::create_value_box_skel, 0},
+ {"_get_name", &POA_CORBA::ExtValueDef::_get_name_skel, 0},
+ {"_get_type", &POA_CORBA::ExtValueDef::_get_type_skel, 0},
+ {"_set_name", &POA_CORBA::ExtValueDef::_set_name_skel, 0},
+ {"_interface", &POA_CORBA::ExtValueDef::_interface_skel, 0},
+ {"lookup_name", &POA_CORBA::ExtValueDef::lookup_name_skel, 0},
+ {"_get_base_value", &POA_CORBA::ExtValueDef::_get_base_value_skel, 0},
+ {"_set_base_value", &POA_CORBA::ExtValueDef::_set_base_value_skel, 0},
+ {"_get_id", &POA_CORBA::ExtValueDef::_get_id_skel, 0},
+ {"_set_id", &POA_CORBA::ExtValueDef::_set_id_skel, 0},
+ {"_get_absolute_name", &POA_CORBA::ExtValueDef::_get_absolute_name_skel, 0},
+ {"_get_is_truncatable", &POA_CORBA::ExtValueDef::_get_is_truncatable_skel, 0},
+ {"_set_is_truncatable", &POA_CORBA::ExtValueDef::_set_is_truncatable_skel, 0},
+ {"_get_def_kind", &POA_CORBA::ExtValueDef::_get_def_kind_skel, 0},
+ {"_repository_id", &POA_CORBA::ExtValueDef::_repository_id_skel, 0},
+ {"create_value", &POA_CORBA::ExtValueDef::create_value_skel, 0},
+ {"create_module", &POA_CORBA::ExtValueDef::create_module_skel, 0},
+ {"create_native", &POA_CORBA::ExtValueDef::create_native_skel, 0},
+ {"create_interface", &POA_CORBA::ExtValueDef::create_interface_skel, 0},
+ {"create_attribute", &POA_CORBA::ExtValueDef::create_attribute_skel, 0},
+ {"create_ext_value", &POA_CORBA::ExtValueDef::create_ext_value_skel, 0},
+ {"destroy", &POA_CORBA::ExtValueDef::destroy_skel, 0},
+ {"create_ext_attribute", &POA_CORBA::ExtValueDef::create_ext_attribute_skel, 0},
+ {"create_local_interface", &POA_CORBA::ExtValueDef::create_local_interface_skel, 0},
+ {"create_abstract_interface", &POA_CORBA::ExtValueDef::create_abstract_interface_skel, 0},
+ {"describe_contents", &POA_CORBA::ExtValueDef::describe_contents_skel, 0},
+ {"describe", &POA_CORBA::ExtValueDef::describe_skel, 0},
+ {"describe_value", &POA_CORBA::ExtValueDef::describe_value_skel, 0},
+ {"describe_ext_value", &POA_CORBA::ExtValueDef::describe_ext_value_skel, 0},
+ };
+
+ static const signed short lookup[] =
+ {
+ -14, -2, -20, -2, 4, 5, 6, -1, -22, -2, 7, -1, 169, 10,
+ 154, 13, -124, -1, -25, -2, -28, -4, -36, -3, -41, -2, 16, 17,
+ 18, -1, 19, -137, -132, -1, 24, -1, -126, -1, 27, -1, -128, 32,
+ 33, -1, 34, -1, 35, -43, -2, -135, 39, 40, -1, -46, -2, -139,
+ -1, -118, 45, -114, -11, -2, -1, 48, 49, -51, -2, 50, -111, -53,
+ -3, -110, 56, -8, -2, 57, -1, 58, -1, -1, 59, -1, 60, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
+ 61, -1, -1, -1, -1, -1, 62, -1, -1, -1, 63,
+ };
+
+ if (len <= MAX_WORD_LENGTH && len >= MIN_WORD_LENGTH)
+ {
+ unsigned int key = hash (str, len);
+
+ if (key <= MAX_HASH_VALUE && key >= MIN_HASH_VALUE)
+ {
+ int slot = lookup[key];
+
+ if (slot >= 0 && slot < WORDLIST_SIZE)
+ {
+ const char *s = wordlist[slot].opname;
+
+ if (*str == *s && !strncmp (str + 1, s + 1, len - 1))
+ return &wordlist[slot];
+ }
+ else if (slot < 0 && slot >= -MAX_HASH_VALUE)
+ return 0;
+ else
+ {
+ unsigned int offset = key + slot + (slot > 0 ? -MAX_HASH_VALUE : MAX_HASH_VALUE);
+ const TAO_operation_db_entry *base = &wordlist[-lookup[offset]];
+ const TAO_operation_db_entry *ptr = base + -lookup[offset + 1];
+
+ while (--ptr >= base)
+ if (*str == *ptr->opname && !strncmp (str + 1, ptr->opname + 1, len - 1))
+ return ptr;
+ }
+ }
+ }
+ return 0;
+}
+
+static TAO_CORBA_ExtValueDef_Perfect_Hash_OpTable tao_CORBA_ExtValueDef_optable;
+
+// TAO_IDL - Generated from
+// be\be_visitor_interface/interface_ss.cpp:966
+
+TAO::Collocation_Proxy_Broker *
+CORBA__TAO_ExtValueDef_Proxy_Broker_Factory_function ( ::CORBA::Object_ptr)
+{
+ return reinterpret_cast<TAO::Collocation_Proxy_Broker *> (0xdead); // Dummy
+}
+
+int
+CORBA__TAO_ExtValueDef_Proxy_Broker_Factory_Initializer (size_t)
+{
+ CORBA__TAO_ExtValueDef_Proxy_Broker_Factory_function_pointer =
+ CORBA__TAO_ExtValueDef_Proxy_Broker_Factory_function;
+
+ return 0;
+}
+
+static int
+CORBA__TAO_ExtValueDef_Proxy_Broker_Stub_Factory_Initializer_Scarecrow =
+ CORBA__TAO_ExtValueDef_Proxy_Broker_Factory_Initializer (
+ reinterpret_cast<size_t> (CORBA__TAO_ExtValueDef_Proxy_Broker_Factory_Initializer)
+ );
+
+// TAO_IDL - Generated from
+// be\be_visitor_interface/interface_ss.cpp:103
+
+POA_CORBA::ExtValueDef::ExtValueDef (void)
+ : TAO_ServantBase ()
+{
+ this->optable_ = &tao_CORBA_ExtValueDef_optable;
+}
+
+POA_CORBA::ExtValueDef::ExtValueDef (const ExtValueDef& rhs)
+ : TAO_Abstract_ServantBase (rhs),
+ TAO_ServantBase (rhs),
+ POA_CORBA::IRObject (rhs),
+ POA_CORBA::Container (rhs),
+ POA_CORBA::Contained (rhs),
+ POA_CORBA::IDLType (rhs),
+ POA_CORBA::ValueDef (rhs)
+{
+}
+
+POA_CORBA::ExtValueDef::~ExtValueDef (void)
+{
+}namespace POA_CORBA
+{
+
+
+ // TAO_IDL - Generated from
+ // be\be_visitor_operation/upcall_command_ss.cpp:127
+
+ class _get_ext_initializers_ExtValueDef
+ : public TAO::Upcall_Command
+ {
+ public:
+ inline _get_ext_initializers_ExtValueDef (
+ POA_CORBA::ExtValueDef * servant,
+ TAO_Operation_Details const * operation_details,
+ TAO::Argument * const args[])
+ : servant_ (servant)
+ , operation_details_ (operation_details)
+ , args_ (args)
+ {
+ }
+
+ virtual void execute (ACE_ENV_SINGLE_ARG_DECL)
+ {
+ TAO::SArg_Traits< ::CORBA::ExtInitializerSeq>::ret_arg_type retval =
+ TAO::Portable_Server::get_ret_arg< ::CORBA::ExtInitializerSeq> (
+ this->operation_details_,
+ this->args_);
+
+ retval =
+ this->servant_->ext_initializers (
+ ACE_ENV_SINGLE_ARG_PARAMETER);
+ ACE_CHECK;
+ }
+
+ private:
+ POA_CORBA::ExtValueDef * const servant_;
+ TAO_Operation_Details const * const operation_details_;
+ TAO::Argument * const * const args_;
+ };
+}
+
+
+// TAO_IDL - Generated from
+// be\be_visitor_operation/operation_ss.cpp:190
+
+void POA_CORBA::ExtValueDef::_get_ext_initializers_skel (
+ TAO_ServerRequest & server_request,
+ void * TAO_INTERCEPTOR (servant_upcall),
+ void * servant
+ ACE_ENV_ARG_DECL
+ )
+{
+#if TAO_HAS_INTERCEPTORS == 1
+ static ::CORBA::TypeCode_ptr const * const exceptions = 0;
+ static ::CORBA::ULong const nexceptions = 0;
+#endif /* TAO_HAS_INTERCEPTORS */
+
+ TAO::SArg_Traits< ::CORBA::ExtInitializerSeq>::ret_val retval;
+
+ TAO::Argument * const args[] =
+ {
+ &retval
+ };
+
+ static size_t const nargs = 1;
+
+ POA_CORBA::ExtValueDef * const impl =
+ static_cast<POA_CORBA::ExtValueDef *> (servant);
+
+ _get_ext_initializers_ExtValueDef command (
+ impl,
+ server_request.operation_details (),
+ args);
+
+ TAO::Upcall_Wrapper upcall_wrapper;
+ upcall_wrapper.upcall (server_request
+ , args
+ , nargs
+ , command
+#if TAO_HAS_INTERCEPTORS == 1
+ , servant_upcall
+ , exceptions
+ , nexceptions
+#endif /* TAO_HAS_INTERCEPTORS == 1 */
+ ACE_ENV_ARG_PARAMETER);
+ ACE_CHECK;
+}namespace POA_CORBA
+{
+
+
+ // TAO_IDL - Generated from
+ // be\be_visitor_operation/upcall_command_ss.cpp:127
+
+ class _set_ext_initializers_ExtValueDef
+ : public TAO::Upcall_Command
+ {
+ public:
+ inline _set_ext_initializers_ExtValueDef (
+ POA_CORBA::ExtValueDef * servant,
+ TAO_Operation_Details const * operation_details,
+ TAO::Argument * const args[])
+ : servant_ (servant)
+ , operation_details_ (operation_details)
+ , args_ (args)
+ {
+ }
+
+ virtual void execute (ACE_ENV_SINGLE_ARG_DECL)
+ {
+ TAO::SArg_Traits< ::CORBA::ExtInitializerSeq>::in_arg_type arg_1 =
+ TAO::Portable_Server::get_in_arg< ::CORBA::ExtInitializerSeq> (
+ this->operation_details_,
+ this->args_,
+ 1);
+
+ this->servant_->ext_initializers (
+ arg_1
+ ACE_ENV_ARG_PARAMETER);
+ ACE_CHECK;
+ }
+
+ private:
+ POA_CORBA::ExtValueDef * const servant_;
+ TAO_Operation_Details const * const operation_details_;
+ TAO::Argument * const * const args_;
+ };
+}
+
+
+// TAO_IDL - Generated from
+// be\be_visitor_operation/operation_ss.cpp:190
+
+void POA_CORBA::ExtValueDef::_set_ext_initializers_skel (
+ TAO_ServerRequest & server_request,
+ void * TAO_INTERCEPTOR (servant_upcall),
+ void * servant
+ ACE_ENV_ARG_DECL
+ )
+{
+#if TAO_HAS_INTERCEPTORS == 1
+ static ::CORBA::TypeCode_ptr const * const exceptions = 0;
+ static ::CORBA::ULong const nexceptions = 0;
+#endif /* TAO_HAS_INTERCEPTORS */
+
+ TAO::SArg_Traits< void>::ret_val retval;
+ TAO::SArg_Traits< ::CORBA::ExtInitializerSeq>::in_arg_val _tao_ext_initializers;
+
+ TAO::Argument * const args[] =
+ {
+ &retval,
+ &_tao_ext_initializers
+ };
+
+ static size_t const nargs = 2;
+
+ POA_CORBA::ExtValueDef * const impl =
+ static_cast<POA_CORBA::ExtValueDef *> (servant);
+
+ _set_ext_initializers_ExtValueDef command (
+ impl,
+ server_request.operation_details (),
+ args);
+
+ TAO::Upcall_Wrapper upcall_wrapper;
+ upcall_wrapper.upcall (server_request
+ , args
+ , nargs
+ , command
+#if TAO_HAS_INTERCEPTORS == 1
+ , servant_upcall
+ , exceptions
+ , nexceptions
+#endif /* TAO_HAS_INTERCEPTORS == 1 */
+ ACE_ENV_ARG_PARAMETER);
+ ACE_CHECK;
+}namespace POA_CORBA
+{
+
+
+ // TAO_IDL - Generated from
+ // be\be_visitor_operation/upcall_command_ss.cpp:127
+
+ class describe_ext_value_ExtValueDef
+ : public TAO::Upcall_Command
+ {
+ public:
+ inline describe_ext_value_ExtValueDef (
+ POA_CORBA::ExtValueDef * servant,
+ TAO_Operation_Details const * operation_details,
+ TAO::Argument * const args[])
+ : servant_ (servant)
+ , operation_details_ (operation_details)
+ , args_ (args)
+ {
+ }
+
+ virtual void execute (ACE_ENV_SINGLE_ARG_DECL)
+ {
+ TAO::SArg_Traits< ::CORBA::ExtValueDef::ExtFullValueDescription>::ret_arg_type retval =
+ TAO::Portable_Server::get_ret_arg< ::CORBA::ExtValueDef::ExtFullValueDescription> (
+ this->operation_details_,
+ this->args_);
+
+ retval =
+ this->servant_->describe_ext_value (
+ ACE_ENV_SINGLE_ARG_PARAMETER);
+ ACE_CHECK;
+ }
+
+ private:
+ POA_CORBA::ExtValueDef * const servant_;
+ TAO_Operation_Details const * const operation_details_;
+ TAO::Argument * const * const args_;
+ };
+}
+
+
+// TAO_IDL - Generated from
+// be\be_visitor_operation/operation_ss.cpp:190
+
+void POA_CORBA::ExtValueDef::describe_ext_value_skel (
+ TAO_ServerRequest & server_request,
+ void * TAO_INTERCEPTOR (servant_upcall),
+ void * servant
+ ACE_ENV_ARG_DECL
+ )
+{
+#if TAO_HAS_INTERCEPTORS == 1
+ static ::CORBA::TypeCode_ptr const * const exceptions = 0;
+ static ::CORBA::ULong const nexceptions = 0;
+#endif /* TAO_HAS_INTERCEPTORS */
+
+ TAO::SArg_Traits< ::CORBA::ExtValueDef::ExtFullValueDescription>::ret_val retval;
+
+ TAO::Argument * const args[] =
+ {
+ &retval
+ };
+
+ static size_t const nargs = 1;
+
+ POA_CORBA::ExtValueDef * const impl =
+ static_cast<POA_CORBA::ExtValueDef *> (servant);
+
+ describe_ext_value_ExtValueDef command (
+ impl,
+ server_request.operation_details (),
+ args);
+
+ TAO::Upcall_Wrapper upcall_wrapper;
+ upcall_wrapper.upcall (server_request
+ , args
+ , nargs
+ , command
+#if TAO_HAS_INTERCEPTORS == 1
+ , servant_upcall
+ , exceptions
+ , nexceptions
+#endif /* TAO_HAS_INTERCEPTORS == 1 */
+ ACE_ENV_ARG_PARAMETER);
+ ACE_CHECK;
+}namespace POA_CORBA
+{
+
+
+ // TAO_IDL - Generated from
+ // be\be_visitor_operation/upcall_command_ss.cpp:127
+
+ class create_ext_attribute_ExtValueDef
+ : public TAO::Upcall_Command
+ {
+ public:
+ inline create_ext_attribute_ExtValueDef (
+ POA_CORBA::ExtValueDef * servant,
+ TAO_Operation_Details const * operation_details,
+ TAO::Argument * const args[])
+ : servant_ (servant)
+ , operation_details_ (operation_details)
+ , args_ (args)
+ {
+ }
+
+ virtual void execute (ACE_ENV_SINGLE_ARG_DECL)
+ {
+ TAO::SArg_Traits< ::CORBA::ExtAttributeDef>::ret_arg_type retval =
+ TAO::Portable_Server::get_ret_arg< ::CORBA::ExtAttributeDef> (
+ this->operation_details_,
+ this->args_);
+
+ TAO::SArg_Traits< ::CORBA::RepositoryId>::in_arg_type arg_1 =
+ TAO::Portable_Server::get_in_arg< ::CORBA::RepositoryId> (
+ this->operation_details_,
+ this->args_,
+ 1);
+
+ TAO::SArg_Traits< ::CORBA::Identifier>::in_arg_type arg_2 =
+ TAO::Portable_Server::get_in_arg< ::CORBA::Identifier> (
+ this->operation_details_,
+ this->args_,
+ 2);
+
+ TAO::SArg_Traits< ::CORBA::VersionSpec>::in_arg_type arg_3 =
+ TAO::Portable_Server::get_in_arg< ::CORBA::VersionSpec> (
+ this->operation_details_,
+ this->args_,
+ 3);
+
+ TAO::SArg_Traits< ::CORBA::IDLType>::in_arg_type arg_4 =
+ TAO::Portable_Server::get_in_arg< ::CORBA::IDLType> (
+ this->operation_details_,
+ this->args_,
+ 4);
+
+ TAO::SArg_Traits< ::CORBA::AttributeMode>::in_arg_type arg_5 =
+ TAO::Portable_Server::get_in_arg< ::CORBA::AttributeMode> (
+ this->operation_details_,
+ this->args_,
+ 5);
+
+ TAO::SArg_Traits< ::CORBA::ExceptionDefSeq>::in_arg_type arg_6 =
+ TAO::Portable_Server::get_in_arg< ::CORBA::ExceptionDefSeq> (
+ this->operation_details_,
+ this->args_,
+ 6);
+
+ TAO::SArg_Traits< ::CORBA::ExceptionDefSeq>::in_arg_type arg_7 =
+ TAO::Portable_Server::get_in_arg< ::CORBA::ExceptionDefSeq> (
+ this->operation_details_,
+ this->args_,
+ 7);
+
+ retval =
+ this->servant_->create_ext_attribute (
+ arg_1
+ , arg_2
+ , arg_3
+ , arg_4
+ , arg_5
+ , arg_6
+ , arg_7
+ ACE_ENV_ARG_PARAMETER);
+ ACE_CHECK;
+ }
+
+ private:
+ POA_CORBA::ExtValueDef * const servant_;
+ TAO_Operation_Details const * const operation_details_;
+ TAO::Argument * const * const args_;
+ };
+}
+
+
+// TAO_IDL - Generated from
+// be\be_visitor_operation/operation_ss.cpp:190
+
+void POA_CORBA::ExtValueDef::create_ext_attribute_skel (
+ TAO_ServerRequest & server_request,
+ void * TAO_INTERCEPTOR (servant_upcall),
+ void * servant
+ ACE_ENV_ARG_DECL
+ )
+{
+#if TAO_HAS_INTERCEPTORS == 1
+ static ::CORBA::TypeCode_ptr const * const exceptions = 0;
+ static ::CORBA::ULong const nexceptions = 0;
+#endif /* TAO_HAS_INTERCEPTORS */
+
+ TAO::SArg_Traits< ::CORBA::ExtAttributeDef>::ret_val retval;
+ TAO::SArg_Traits< ::CORBA::RepositoryId>::in_arg_val _tao_id;
+ TAO::SArg_Traits< ::CORBA::Identifier>::in_arg_val _tao_name;
+ TAO::SArg_Traits< ::CORBA::VersionSpec>::in_arg_val _tao_version;
+ TAO::SArg_Traits< ::CORBA::IDLType>::in_arg_val _tao_type;
+ TAO::SArg_Traits< ::CORBA::AttributeMode>::in_arg_val _tao_mode;
+ TAO::SArg_Traits< ::CORBA::ExceptionDefSeq>::in_arg_val _tao_get_exceptions;
+ TAO::SArg_Traits< ::CORBA::ExceptionDefSeq>::in_arg_val _tao_set_exceptions;
+
+ TAO::Argument * const args[] =
+ {
+ &retval,
+ &_tao_id,
+ &_tao_name,
+ &_tao_version,
+ &_tao_type,
+ &_tao_mode,
+ &_tao_get_exceptions,
+ &_tao_set_exceptions
+ };
+
+ static size_t const nargs = 8;
+
+ POA_CORBA::ExtValueDef * const impl =
+ static_cast<POA_CORBA::ExtValueDef *> (servant);
+
+ create_ext_attribute_ExtValueDef command (
+ impl,
+ server_request.operation_details (),
+ args);
+
+ TAO::Upcall_Wrapper upcall_wrapper;
+ upcall_wrapper.upcall (server_request
+ , args
+ , nargs
+ , command
+#if TAO_HAS_INTERCEPTORS == 1
+ , servant_upcall
+ , exceptions
+ , nexceptions
+#endif /* TAO_HAS_INTERCEPTORS == 1 */
+ ACE_ENV_ARG_PARAMETER);
+ ACE_CHECK;
+}
+
+// TAO_IDL - Generated from
+// be\be_visitor_interface/interface_ss.cpp:169
+
+namespace POA_CORBA
+{
+
+
+ // TAO_IDL - Generated from
+ // be\be_visitor_operation/upcall_command_ss.cpp:127
+
+ class _is_a_ExtValueDef_Upcall_Command
+ : public TAO::Upcall_Command
+ {
+ public:
+ inline _is_a_ExtValueDef_Upcall_Command (
+ POA_CORBA::ExtValueDef * servant,
+ TAO_Operation_Details const * operation_details,
+ TAO::Argument * const args[])
+ : servant_ (servant)
+ , operation_details_ (operation_details)
+ , args_ (args)
+ {
+ }
+
+ virtual void execute (ACE_ENV_SINGLE_ARG_DECL)
+ {
+ TAO::SArg_Traits< ::ACE_InputCDR::to_boolean>::ret_arg_type retval =
+ TAO::Portable_Server::get_ret_arg< ::ACE_InputCDR::to_boolean> (
+ this->operation_details_,
+ this->args_);
+
+ TAO::SArg_Traits< ::CORBA::Char *>::in_arg_type arg_1 =
+ TAO::Portable_Server::get_in_arg< ::CORBA::Char *> (
+ this->operation_details_,
+ this->args_,
+ 1);
+
+ retval =
+ this->servant_-> _is_a (
+ arg_1
+ ACE_ENV_ARG_PARAMETER);
+ ACE_CHECK;
+ }
+
+ private:
+ POA_CORBA::ExtValueDef * const servant_;
+ TAO_Operation_Details const * const operation_details_;
+ TAO::Argument * const * const args_;
+ };
+}
+
+
+void POA_CORBA::ExtValueDef::_is_a_skel (
+ TAO_ServerRequest & server_request,
+ void * TAO_INTERCEPTOR (servant_upcall),
+ void * servant
+ ACE_ENV_ARG_DECL
+ )
+{
+#if TAO_HAS_INTERCEPTORS == 1
+ static ::CORBA::TypeCode_ptr const * const exceptions = 0;
+ static ::CORBA::ULong const nexceptions = 0;
+#endif /* TAO_HAS_INTERCEPTORS */
+
+ TAO::SArg_Traits< ::ACE_InputCDR::to_boolean>::ret_val retval;
+ TAO::SArg_Traits< ::CORBA::Char *>::in_arg_val _tao_repository_id;
+
+ TAO::Argument * const args[] =
+ {
+ &retval,
+ &_tao_repository_id
+ };
+
+ static size_t const nargs = 2;
+
+ POA_CORBA::ExtValueDef * const impl =
+ static_cast<POA_CORBA::ExtValueDef *> (servant);
+
+ _is_a_ExtValueDef_Upcall_Command command (
+ impl,
+ server_request.operation_details (),
+ args);
+
+ TAO::Upcall_Wrapper upcall_wrapper;
+ upcall_wrapper.upcall (server_request
+ , args
+ , nargs
+ , command
+#if TAO_HAS_INTERCEPTORS == 1
+ , servant_upcall
+ , exceptions
+ , nexceptions
+#endif /* TAO_HAS_INTERCEPTORS == 1 */
+ ACE_ENV_ARG_PARAMETER);
+ ACE_CHECK;
+}namespace POA_CORBA
+{
+
+
+ // TAO_IDL - Generated from
+ // be\be_visitor_operation/upcall_command_ss.cpp:127
+
+ class _non_existent_ExtValueDef_Upcall_Command
+ : public TAO::Upcall_Command
+ {
+ public:
+ inline _non_existent_ExtValueDef_Upcall_Command (
+ POA_CORBA::ExtValueDef * servant,
+ TAO_Operation_Details const * operation_details,
+ TAO::Argument * const args[])
+ : servant_ (servant)
+ , operation_details_ (operation_details)
+ , args_ (args)
+ {
+ }
+
+ virtual void execute (ACE_ENV_SINGLE_ARG_DECL)
+ {
+ TAO::SArg_Traits< ::ACE_InputCDR::to_boolean>::ret_arg_type retval =
+ TAO::Portable_Server::get_ret_arg< ::ACE_InputCDR::to_boolean> (
+ this->operation_details_,
+ this->args_);
+
+ retval =
+ this->servant_-> _non_existent (
+ ACE_ENV_SINGLE_ARG_PARAMETER);
+ ACE_CHECK;
+ }
+
+ private:
+ POA_CORBA::ExtValueDef * const servant_;
+ TAO_Operation_Details const * const operation_details_;
+ TAO::Argument * const * const args_;
+ };
+}
+
+
+void POA_CORBA::ExtValueDef::_non_existent_skel (
+ TAO_ServerRequest & server_request,
+ void * TAO_INTERCEPTOR (servant_upcall),
+ void * servant
+ ACE_ENV_ARG_DECL
+ )
+{
+#if TAO_HAS_INTERCEPTORS == 1
+ static ::CORBA::TypeCode_ptr const * const exceptions = 0;
+ static ::CORBA::ULong const nexceptions = 0;
+#endif /* TAO_HAS_INTERCEPTORS */
+
+ TAO::SArg_Traits< ::ACE_InputCDR::to_boolean>::ret_val retval;
+
+ TAO::Argument * const args[] =
+ {
+ &retval
+ };
+
+ static size_t const nargs = 1;
+
+ POA_CORBA::ExtValueDef * const impl =
+ static_cast<POA_CORBA::ExtValueDef *> (servant);
+
+ _non_existent_ExtValueDef_Upcall_Command command (
+ impl,
+ server_request.operation_details (),
+ args);
+
+ TAO::Upcall_Wrapper upcall_wrapper;
+ upcall_wrapper.upcall (server_request
+ , args
+ , nargs
+ , command
+#if TAO_HAS_INTERCEPTORS == 1
+ , servant_upcall
+ , exceptions
+ , nexceptions
+#endif /* TAO_HAS_INTERCEPTORS == 1 */
+ ACE_ENV_ARG_PARAMETER);
+ ACE_CHECK;
+}namespace POA_CORBA
+{
+
+
+ // TAO_IDL - Generated from
+ // be\be_visitor_operation/upcall_command_ss.cpp:127
+
+ class _repository_id_ExtValueDef_Upcall_Command
+ : public TAO::Upcall_Command
+ {
+ public:
+ inline _repository_id_ExtValueDef_Upcall_Command (
+ POA_CORBA::ExtValueDef * servant,
+ TAO_Operation_Details const * operation_details,
+ TAO::Argument * const args[])
+ : servant_ (servant)
+ , operation_details_ (operation_details)
+ , args_ (args)
+ {
+ }
+
+ virtual void execute (ACE_ENV_SINGLE_ARG_DECL)
+ {
+ TAO::SArg_Traits< ::CORBA::Char *>::ret_arg_type retval =
+ TAO::Portable_Server::get_ret_arg< ::CORBA::Char *> (
+ this->operation_details_,
+ this->args_);
+
+ retval =
+ this->servant_-> _repository_id (
+ ACE_ENV_SINGLE_ARG_PARAMETER);
+ ACE_CHECK;
+ }
+
+ private:
+ POA_CORBA::ExtValueDef * const servant_;
+ TAO_Operation_Details const * const operation_details_;
+ TAO::Argument * const * const args_;
+ };
+}
+
+
+void POA_CORBA::ExtValueDef::_repository_id_skel (
+ TAO_ServerRequest & server_request,
+ void * TAO_INTERCEPTOR (servant_upcall),
+ void * servant
+ ACE_ENV_ARG_DECL
+ )
+{
+#if TAO_HAS_INTERCEPTORS == 1
+ static ::CORBA::TypeCode_ptr const * const exceptions = 0;
+ static ::CORBA::ULong const nexceptions = 0;
+#endif /* TAO_HAS_INTERCEPTORS */
+
+ TAO::SArg_Traits< ::CORBA::Char *>::ret_val retval;
+
+ TAO::Argument * const args[] =
+ {
+ &retval
+ };
+
+ static size_t const nargs = 1;
+
+ POA_CORBA::ExtValueDef * const impl =
+ static_cast<POA_CORBA::ExtValueDef *> (servant);
+
+ _repository_id_ExtValueDef_Upcall_Command command (
+ impl,
+ server_request.operation_details (),
+ args);
+
+ TAO::Upcall_Wrapper upcall_wrapper;
+ upcall_wrapper.upcall (server_request
+ , args
+ , nargs
+ , command
+#if TAO_HAS_INTERCEPTORS == 1
+ , servant_upcall
+ , exceptions
+ , nexceptions
+#endif /* TAO_HAS_INTERCEPTORS == 1 */
+ ACE_ENV_ARG_PARAMETER);
+ ACE_CHECK;
+}
+
+// TAO_IDL - Generated from
+// be\be_visitor_interface/interface_ss.cpp:513
+
+void POA_CORBA::ExtValueDef::_interface_skel (
+ TAO_ServerRequest & server_request,
+ void * /* servant_upcall */,
+ void * servant
+ ACE_ENV_ARG_DECL
+ )
+{
+ TAO_IFR_Client_Adapter *_tao_adapter =
+ ACE_Dynamic_Service<TAO_IFR_Client_Adapter>::instance (
+ TAO_ORB_Core::ifr_client_adapter_name ()
+ );
+
+ if (_tao_adapter == 0)
+ {
+ ACE_THROW ( ::CORBA::INTF_REPOS ( ::CORBA::OMGVMCID | 1,
+ ::CORBA::COMPLETED_NO));
+ }
+
+ POA_CORBA::ExtValueDef * const impl =
+ static_cast<POA_CORBA::ExtValueDef *> (servant);
+ ::CORBA::InterfaceDef_ptr _tao_retval =
+ impl->_get_interface (ACE_ENV_SINGLE_ARG_PARAMETER);
+ ACE_CHECK;
+
+ server_request.init_reply ();
+ TAO_OutputCDR &_tao_out = *server_request.outgoing ();
+
+ ::CORBA::Boolean const _tao_result =
+ _tao_adapter->interfacedef_cdr_insert (
+ _tao_out,
+ _tao_retval
+ );
+
+ _tao_adapter->dispose (_tao_retval);
+
+ if (_tao_result == false)
+ {
+ ACE_THROW ( ::CORBA::MARSHAL ());
+ }
+}namespace POA_CORBA
+{
+
+
+ // TAO_IDL - Generated from
+ // be\be_visitor_operation/upcall_command_ss.cpp:127
+
+ class _get_component_ExtValueDef_Upcall_Command
+ : public TAO::Upcall_Command
+ {
+ public:
+ inline _get_component_ExtValueDef_Upcall_Command (
+ POA_CORBA::ExtValueDef * servant,
+ TAO_Operation_Details const * operation_details,
+ TAO::Argument * const args[])
+ : servant_ (servant)
+ , operation_details_ (operation_details)
+ , args_ (args)
+ {
+ }
+
+ virtual void execute (ACE_ENV_SINGLE_ARG_DECL)
+ {
+ TAO::SArg_Traits< ::CORBA::Object>::ret_arg_type retval =
+ TAO::Portable_Server::get_ret_arg< ::CORBA::Object> (
+ this->operation_details_,
+ this->args_);
+
+ retval =
+ this->servant_-> _get_component (
+ ACE_ENV_SINGLE_ARG_PARAMETER);
+ ACE_CHECK;
+ }
+
+ private:
+ POA_CORBA::ExtValueDef * const servant_;
+ TAO_Operation_Details const * const operation_details_;
+ TAO::Argument * const * const args_;
+ };
+}
+
+
+void POA_CORBA::ExtValueDef::_component_skel (
+ TAO_ServerRequest & server_request,
+ void * TAO_INTERCEPTOR (servant_upcall),
+ void * servant
+ ACE_ENV_ARG_DECL
+ )
+{
+#if TAO_HAS_INTERCEPTORS == 1
+ static ::CORBA::TypeCode_ptr const * const exceptions = 0;
+ static ::CORBA::ULong const nexceptions = 0;
+#endif /* TAO_HAS_INTERCEPTORS */
+
+ TAO::SArg_Traits< ::CORBA::Object>::ret_val retval;
+
+ TAO::Argument * const args[] =
+ {
+ &retval
+ };
+
+ static size_t const nargs = 1;
+
+ POA_CORBA::ExtValueDef * const impl =
+ static_cast<POA_CORBA::ExtValueDef *> (servant);
+
+ _get_component_ExtValueDef_Upcall_Command command (
+ impl,
+ server_request.operation_details (),
+ args);
+
+ TAO::Upcall_Wrapper upcall_wrapper;
+ upcall_wrapper.upcall (server_request
+ , args
+ , nargs
+ , command
+#if TAO_HAS_INTERCEPTORS == 1
+ , servant_upcall
+ , exceptions
+ , nexceptions
+#endif /* TAO_HAS_INTERCEPTORS == 1 */
+ ACE_ENV_ARG_PARAMETER);
+ ACE_CHECK;
+}
+
+::CORBA::Boolean POA_CORBA::ExtValueDef::_is_a (
+ const char* value
+ ACE_ENV_ARG_DECL_NOT_USED
+ )
+{
+ return
+ (
+ !ACE_OS::strcmp (
+ value,
+ "IDL:omg.org/CORBA/IRObject:1.0"
+ ) ||
+ !ACE_OS::strcmp (
+ value,
+ "IDL:omg.org/CORBA/Container:1.0"
+ ) ||
+ !ACE_OS::strcmp (
+ value,
+ "IDL:omg.org/CORBA/Contained:1.0"
+ ) ||
+ !ACE_OS::strcmp (
+ value,
+ "IDL:omg.org/CORBA/IDLType:1.0"
+ ) ||
+ !ACE_OS::strcmp (
+ value,
+ "IDL:omg.org/CORBA/ValueDef:1.0"
+ ) ||
+ !ACE_OS::strcmp (
+ value,
+ "IDL:omg.org/CORBA/ExtValueDef:1.0"
+ ) ||
+ !ACE_OS::strcmp (
+ value,
+ "IDL:omg.org/CORBA/Object:1.0"
+ )
+ );
+}
+
+const char* POA_CORBA::ExtValueDef::_interface_repository_id (void) const
+{
+ return "IDL:omg.org/CORBA/ExtValueDef:1.0";
+}
+
+// TAO_IDL - Generated from
+// be\be_visitor_interface/interface_ss.cpp:903
+
+void POA_CORBA::ExtValueDef::_dispatch (
+ TAO_ServerRequest & req,
+ void * servant_upcall
+ ACE_ENV_ARG_DECL
+ )
+{
+ this->synchronous_upcall_dispatch (req,
+ servant_upcall,
+ this
+ ACE_ENV_ARG_PARAMETER);
+}
+
+// TAO_IDL - Generated from
+// be\be_visitor_interface/interface_ss.cpp:851
+
+CORBA::ExtValueDef *
+POA_CORBA::ExtValueDef::_this (ACE_ENV_SINGLE_ARG_DECL)
+{
+ TAO_Stub *stub = this->_create_stub (ACE_ENV_SINGLE_ARG_PARAMETER);
+ ACE_CHECK_RETURN (0);
+
+ TAO_Stub_Auto_Ptr safe_stub (stub);
+ ::CORBA::Object_ptr tmp = CORBA::Object::_nil ();
+
+ ::CORBA::Boolean const _tao_opt_colloc =
+ stub->servant_orb_var ()->orb_core ()->optimize_collocation_objects ();
+
+ ACE_NEW_RETURN (
+ tmp,
+ ::CORBA::Object (stub, _tao_opt_colloc, this),
+ 0
+ );
+
+ ::CORBA::Object_var obj = tmp;
+ (void) safe_stub.release ();
+
+ typedef ::CORBA::ExtValueDef STUB_SCOPED_NAME;
+ return
+ TAO::Narrow_Utils<STUB_SCOPED_NAME>::unchecked_narrow (
+ obj.in (),
+ CORBA__TAO_ExtValueDef_Proxy_Broker_Factory_function_pointer
+ );
+}
+
+// TAO_IDL - Generated from
+// be\be_interface.cpp:1499
+
+class TAO_CORBA_ValueBoxDef_Perfect_Hash_OpTable
+ : public TAO_Perfect_Hash_OpTable
+{
+private:
+ unsigned int hash (const char *str, unsigned int len);
+
+public:
+ const TAO_operation_db_entry * lookup (const char *str, unsigned int len);
+};
+
+/* C++ code produced by gperf version 2.8 (ACE version) */
+/* Command-line: C:\ACE\latest\ACE_wrappers\bin\gperf.exe -m -M -J -c -C -D -E -T -f 0 -F 0,0 -a -o -t -p -K opname -L C++ -Z TAO_CORBA_ValueBoxDef_Perfect_Hash_OpTable -N lookup */
+unsigned int
+TAO_CORBA_ValueBoxDef_Perfect_Hash_OpTable::hash (const char *str, unsigned int len)
+{
+ static const unsigned char asso_values[] =
+ {
+#if defined (ACE_MVS)
+ 37, 37, 37, 37, 37, 37, 37, 37, 37, 37,
+ 37, 37, 37, 37, 37, 37, 37, 37, 37, 37,
+ 37, 37, 37, 37, 37, 37, 37, 37, 37, 37,
+ 37, 37, 37, 37, 37, 37, 37, 37, 37, 37,
+ 37, 37, 37, 37, 37, 37, 37, 37, 37, 37,
+ 37, 37, 37, 37, 37, 37, 37, 37, 37, 37,
+ 37, 37, 37, 37, 37, 37, 37, 37, 37, 37,
+ 37, 37, 37, 37, 37, 37, 37, 37, 37, 37,
+ 37, 37, 37, 37, 37, 37, 37, 37, 37, 37,
+ 37, 37, 37, 37, 37, 37, 37, 37, 37, 37,
+ 37, 37, 37, 37, 37, 37, 37, 37, 37, 0,
+ 37, 37, 37, 37, 37, 37, 37, 37, 37, 37,
+ 37, 37, 37, 37, 37, 37, 37, 37, 37, 0,
+ 37, 37, 0, 0, 0, 37, 37, 37, 37, 37,
+ 37, 37, 37, 37, 37, 37, 37, 37, 0, 0,
+ 37, 37, 37, 37, 37, 37, 37, 37, 37, 37,
+ 37, 37, 37, 10, 37, 37, 37, 37, 10, 37,
+ 37, 37, 37, 37, 37, 37, 37, 37, 37, 37,
+ 37, 37, 37, 37, 37, 37, 37, 37, 37, 37,
+ 37, 37, 37, 37, 37, 37, 37, 37, 37, 37,
+ 37, 37, 37, 37, 37, 37, 37, 37, 37, 37,
+ 37, 37, 37, 37, 37, 37, 37, 37, 37, 37,
+ 37, 37, 37, 37, 37, 37, 37, 37, 37, 37,
+ 37, 37, 37, 37, 37, 37, 37, 37, 37, 37,
+ 37, 37, 37, 37, 37, 37, 37, 37, 37, 37,
+ 37, 37, 37, 37, 37, 37,
+#else
+ 37, 37, 37, 37, 37, 37, 37, 37, 37, 37,
+ 37, 37, 37, 37, 37, 37, 37, 37, 37, 37,
+ 37, 37, 37, 37, 37, 37, 37, 37, 37, 37,
+ 37, 37, 37, 37, 37, 37, 37, 37, 37, 37,
+ 37, 37, 37, 37, 37, 37, 37, 37, 37, 37,
+ 37, 37, 37, 37, 37, 37, 37, 37, 37, 37,
+ 37, 37, 37, 37, 37, 37, 37, 37, 37, 37,
+ 37, 37, 37, 37, 37, 37, 37, 37, 37, 37,
+ 37, 37, 37, 37, 37, 37, 37, 37, 37, 37,
+ 37, 37, 37, 37, 37, 0, 37, 0, 37, 37,
+ 0, 0, 0, 37, 37, 37, 37, 37, 37, 0,
+ 0, 37, 37, 37, 37, 37, 10, 37, 37, 37,
+ 37, 10, 37, 37, 37, 37, 37, 37,
+#endif /* ACE_MVS */
+ };
+ return len + asso_values[(int) str[len - 1]] + asso_values[(int) str[0]];
+}
+
+const TAO_operation_db_entry *
+TAO_CORBA_ValueBoxDef_Perfect_Hash_OpTable::lookup (const char *str, unsigned int len)
+{
+ enum
+ {
+ TOTAL_KEYWORDS = 21,
+ MIN_WORD_LENGTH = 4,
+ MAX_WORD_LENGTH = 26,
+ MIN_HASH_VALUE = 4,
+ MAX_HASH_VALUE = 36,
+ HASH_VALUE_RANGE = 33,
+ DUPLICATES = 6,
+ WORDLIST_SIZE = 25
+ };
+
+ static const TAO_operation_db_entry wordlist[] =
+ {
+ {"",0,0},{"",0,0},{"",0,0},{"",0,0},
+ {"move", &POA_CORBA::ValueBoxDef::move_skel, 0},
+ {"_is_a", &POA_CORBA::ValueBoxDef::_is_a_skel, 0},
+ {"_get_id", &POA_CORBA::ValueBoxDef::_get_id_skel, 0},
+ {"_set_id", &POA_CORBA::ValueBoxDef::_set_id_skel, 0},
+ {"describe", &POA_CORBA::ValueBoxDef::describe_skel, 0},
+ {"_get_name", &POA_CORBA::ValueBoxDef::_get_name_skel, 0},
+ {"_get_type", &POA_CORBA::ValueBoxDef::_get_type_skel, 0},
+ {"_set_name", &POA_CORBA::ValueBoxDef::_set_name_skel, 0},
+ {"_interface", &POA_CORBA::ValueBoxDef::_interface_skel, 0},
+ {"_get_version", &POA_CORBA::ValueBoxDef::_get_version_skel, 0},
+ {"_set_version", &POA_CORBA::ValueBoxDef::_set_version_skel, 0},
+ {"_get_def_kind", &POA_CORBA::ValueBoxDef::_get_def_kind_skel, 0},
+ {"_repository_id", &POA_CORBA::ValueBoxDef::_repository_id_skel, 0},
+ {"_get_defined_in", &POA_CORBA::ValueBoxDef::_get_defined_in_skel, 0},
+ {"destroy", &POA_CORBA::ValueBoxDef::destroy_skel, 0},
+ {"_get_absolute_name", &POA_CORBA::ValueBoxDef::_get_absolute_name_skel, 0},
+ {"_component", &POA_CORBA::ValueBoxDef::_component_skel, 0},
+ {"_get_original_type_def", &POA_CORBA::ValueBoxDef::_get_original_type_def_skel, 0},
+ {"_set_original_type_def", &POA_CORBA::ValueBoxDef::_set_original_type_def_skel, 0},
+ {"_non_existent", &POA_CORBA::ValueBoxDef::_non_existent_skel, 0},
+ {"_get_containing_repository", &POA_CORBA::ValueBoxDef::_get_containing_repository_skel, 0},
+ };
+
+ static const signed char lookup[] =
+ {
+ -13, -2, -21, -2, 4, 5, -1, 55, 8, 51, 12, -1, -48, 15,
+ 16, 17, -1, 18, 19, -1, 20, -1, -56, 23, -9, -3, -6, -2,
+ -1, -1, -1, -1, -1, -1, -1, -1, 24,
+ };
+
+ if (len <= MAX_WORD_LENGTH && len >= MIN_WORD_LENGTH)
+ {
+ unsigned int key = hash (str, len);
+
+ if (key <= MAX_HASH_VALUE && key >= MIN_HASH_VALUE)
+ {
+ int slot = lookup[key];
+
+ if (slot >= 0 && slot < WORDLIST_SIZE)
+ {
+ const char *s = wordlist[slot].opname;
+
+ if (*str == *s && !strncmp (str + 1, s + 1, len - 1))
+ return &wordlist[slot];
+ }
+ else if (slot < 0 && slot >= -MAX_HASH_VALUE)
+ return 0;
+ else
+ {
+ unsigned int offset = key + slot + (slot > 0 ? -MAX_HASH_VALUE : MAX_HASH_VALUE);
+ const TAO_operation_db_entry *base = &wordlist[-lookup[offset]];
+ const TAO_operation_db_entry *ptr = base + -lookup[offset + 1];
+
+ while (--ptr >= base)
+ if (*str == *ptr->opname && !strncmp (str + 1, ptr->opname + 1, len - 1))
+ return ptr;
+ }
+ }
+ }
+ return 0;
+}
+
+static TAO_CORBA_ValueBoxDef_Perfect_Hash_OpTable tao_CORBA_ValueBoxDef_optable;
+
+// TAO_IDL - Generated from
+// be\be_visitor_interface/interface_ss.cpp:966
+
+TAO::Collocation_Proxy_Broker *
+CORBA__TAO_ValueBoxDef_Proxy_Broker_Factory_function ( ::CORBA::Object_ptr)
+{
+ return reinterpret_cast<TAO::Collocation_Proxy_Broker *> (0xdead); // Dummy
+}
+
+int
+CORBA__TAO_ValueBoxDef_Proxy_Broker_Factory_Initializer (size_t)
+{
+ CORBA__TAO_ValueBoxDef_Proxy_Broker_Factory_function_pointer =
+ CORBA__TAO_ValueBoxDef_Proxy_Broker_Factory_function;
+
+ return 0;
+}
+
+static int
+CORBA__TAO_ValueBoxDef_Proxy_Broker_Stub_Factory_Initializer_Scarecrow =
+ CORBA__TAO_ValueBoxDef_Proxy_Broker_Factory_Initializer (
+ reinterpret_cast<size_t> (CORBA__TAO_ValueBoxDef_Proxy_Broker_Factory_Initializer)
+ );
+
+// TAO_IDL - Generated from
+// be\be_visitor_interface/interface_ss.cpp:103
+
+POA_CORBA::ValueBoxDef::ValueBoxDef (void)
+ : TAO_ServantBase ()
+{
+ this->optable_ = &tao_CORBA_ValueBoxDef_optable;
+}
+
+POA_CORBA::ValueBoxDef::ValueBoxDef (const ValueBoxDef& rhs)
+ : TAO_Abstract_ServantBase (rhs),
+ TAO_ServantBase (rhs),
+ POA_CORBA::IRObject (rhs),
+ POA_CORBA::Contained (rhs),
+ POA_CORBA::IDLType (rhs),
+ POA_CORBA::TypedefDef (rhs)
+{
+}
+
+POA_CORBA::ValueBoxDef::~ValueBoxDef (void)
+{
+}namespace POA_CORBA
+{
+
+
+ // TAO_IDL - Generated from
+ // be\be_visitor_operation/upcall_command_ss.cpp:127
+
+ class _get_original_type_def_ValueBoxDef
+ : public TAO::Upcall_Command
+ {
+ public:
+ inline _get_original_type_def_ValueBoxDef (
+ POA_CORBA::ValueBoxDef * servant,
+ TAO_Operation_Details const * operation_details,
+ TAO::Argument * const args[])
+ : servant_ (servant)
+ , operation_details_ (operation_details)
+ , args_ (args)
+ {
+ }
+
+ virtual void execute (ACE_ENV_SINGLE_ARG_DECL)
+ {
+ TAO::SArg_Traits< ::CORBA::IDLType>::ret_arg_type retval =
+ TAO::Portable_Server::get_ret_arg< ::CORBA::IDLType> (
+ this->operation_details_,
+ this->args_);
+
+ retval =
+ this->servant_->original_type_def (
+ ACE_ENV_SINGLE_ARG_PARAMETER);
+ ACE_CHECK;
+ }
+
+ private:
+ POA_CORBA::ValueBoxDef * const servant_;
+ TAO_Operation_Details const * const operation_details_;
+ TAO::Argument * const * const args_;
+ };
+}
+
+
+// TAO_IDL - Generated from
+// be\be_visitor_operation/operation_ss.cpp:190
+
+void POA_CORBA::ValueBoxDef::_get_original_type_def_skel (
+ TAO_ServerRequest & server_request,
+ void * TAO_INTERCEPTOR (servant_upcall),
+ void * servant
+ ACE_ENV_ARG_DECL
+ )
+{
+#if TAO_HAS_INTERCEPTORS == 1
+ static ::CORBA::TypeCode_ptr const * const exceptions = 0;
+ static ::CORBA::ULong const nexceptions = 0;
+#endif /* TAO_HAS_INTERCEPTORS */
+
+ TAO::SArg_Traits< ::CORBA::IDLType>::ret_val retval;
+
+ TAO::Argument * const args[] =
+ {
+ &retval
+ };
+
+ static size_t const nargs = 1;
+
+ POA_CORBA::ValueBoxDef * const impl =
+ static_cast<POA_CORBA::ValueBoxDef *> (servant);
+
+ _get_original_type_def_ValueBoxDef command (
+ impl,
+ server_request.operation_details (),
+ args);
+
+ TAO::Upcall_Wrapper upcall_wrapper;
+ upcall_wrapper.upcall (server_request
+ , args
+ , nargs
+ , command
+#if TAO_HAS_INTERCEPTORS == 1
+ , servant_upcall
+ , exceptions
+ , nexceptions
+#endif /* TAO_HAS_INTERCEPTORS == 1 */
+ ACE_ENV_ARG_PARAMETER);
+ ACE_CHECK;
+}namespace POA_CORBA
+{
+
+
+ // TAO_IDL - Generated from
+ // be\be_visitor_operation/upcall_command_ss.cpp:127
+
+ class _set_original_type_def_ValueBoxDef
+ : public TAO::Upcall_Command
+ {
+ public:
+ inline _set_original_type_def_ValueBoxDef (
+ POA_CORBA::ValueBoxDef * servant,
+ TAO_Operation_Details const * operation_details,
+ TAO::Argument * const args[])
+ : servant_ (servant)
+ , operation_details_ (operation_details)
+ , args_ (args)
+ {
+ }
+
+ virtual void execute (ACE_ENV_SINGLE_ARG_DECL)
+ {
+ TAO::SArg_Traits< ::CORBA::IDLType>::in_arg_type arg_1 =
+ TAO::Portable_Server::get_in_arg< ::CORBA::IDLType> (
+ this->operation_details_,
+ this->args_,
+ 1);
+
+ this->servant_->original_type_def (
+ arg_1
+ ACE_ENV_ARG_PARAMETER);
+ ACE_CHECK;
+ }
+
+ private:
+ POA_CORBA::ValueBoxDef * const servant_;
+ TAO_Operation_Details const * const operation_details_;
+ TAO::Argument * const * const args_;
+ };
+}
+
+
+// TAO_IDL - Generated from
+// be\be_visitor_operation/operation_ss.cpp:190
+
+void POA_CORBA::ValueBoxDef::_set_original_type_def_skel (
+ TAO_ServerRequest & server_request,
+ void * TAO_INTERCEPTOR (servant_upcall),
+ void * servant
+ ACE_ENV_ARG_DECL
+ )
+{
+#if TAO_HAS_INTERCEPTORS == 1
+ static ::CORBA::TypeCode_ptr const * const exceptions = 0;
+ static ::CORBA::ULong const nexceptions = 0;
+#endif /* TAO_HAS_INTERCEPTORS */
+
+ TAO::SArg_Traits< void>::ret_val retval;
+ TAO::SArg_Traits< ::CORBA::IDLType>::in_arg_val _tao_original_type_def;
+
+ TAO::Argument * const args[] =
+ {
+ &retval,
+ &_tao_original_type_def
+ };
+
+ static size_t const nargs = 2;
+
+ POA_CORBA::ValueBoxDef * const impl =
+ static_cast<POA_CORBA::ValueBoxDef *> (servant);
+
+ _set_original_type_def_ValueBoxDef command (
+ impl,
+ server_request.operation_details (),
+ args);
+
+ TAO::Upcall_Wrapper upcall_wrapper;
+ upcall_wrapper.upcall (server_request
+ , args
+ , nargs
+ , command
+#if TAO_HAS_INTERCEPTORS == 1
+ , servant_upcall
+ , exceptions
+ , nexceptions
+#endif /* TAO_HAS_INTERCEPTORS == 1 */
+ ACE_ENV_ARG_PARAMETER);
+ ACE_CHECK;
+}
+
+// TAO_IDL - Generated from
+// be\be_visitor_interface/interface_ss.cpp:169
+
+namespace POA_CORBA
+{
+
+
+ // TAO_IDL - Generated from
+ // be\be_visitor_operation/upcall_command_ss.cpp:127
+
+ class _is_a_ValueBoxDef_Upcall_Command
+ : public TAO::Upcall_Command
+ {
+ public:
+ inline _is_a_ValueBoxDef_Upcall_Command (
+ POA_CORBA::ValueBoxDef * servant,
+ TAO_Operation_Details const * operation_details,
+ TAO::Argument * const args[])
+ : servant_ (servant)
+ , operation_details_ (operation_details)
+ , args_ (args)
+ {
+ }
+
+ virtual void execute (ACE_ENV_SINGLE_ARG_DECL)
+ {
+ TAO::SArg_Traits< ::ACE_InputCDR::to_boolean>::ret_arg_type retval =
+ TAO::Portable_Server::get_ret_arg< ::ACE_InputCDR::to_boolean> (
+ this->operation_details_,
+ this->args_);
+
+ TAO::SArg_Traits< ::CORBA::Char *>::in_arg_type arg_1 =
+ TAO::Portable_Server::get_in_arg< ::CORBA::Char *> (
+ this->operation_details_,
+ this->args_,
+ 1);
+
+ retval =
+ this->servant_-> _is_a (
+ arg_1
+ ACE_ENV_ARG_PARAMETER);
+ ACE_CHECK;
+ }
+
+ private:
+ POA_CORBA::ValueBoxDef * const servant_;
+ TAO_Operation_Details const * const operation_details_;
+ TAO::Argument * const * const args_;
+ };
+}
+
+
+void POA_CORBA::ValueBoxDef::_is_a_skel (
+ TAO_ServerRequest & server_request,
+ void * TAO_INTERCEPTOR (servant_upcall),
+ void * servant
+ ACE_ENV_ARG_DECL
+ )
+{
+#if TAO_HAS_INTERCEPTORS == 1
+ static ::CORBA::TypeCode_ptr const * const exceptions = 0;
+ static ::CORBA::ULong const nexceptions = 0;
+#endif /* TAO_HAS_INTERCEPTORS */
+
+ TAO::SArg_Traits< ::ACE_InputCDR::to_boolean>::ret_val retval;
+ TAO::SArg_Traits< ::CORBA::Char *>::in_arg_val _tao_repository_id;
+
+ TAO::Argument * const args[] =
+ {
+ &retval,
+ &_tao_repository_id
+ };
+
+ static size_t const nargs = 2;
+
+ POA_CORBA::ValueBoxDef * const impl =
+ static_cast<POA_CORBA::ValueBoxDef *> (servant);
+
+ _is_a_ValueBoxDef_Upcall_Command command (
+ impl,
+ server_request.operation_details (),
+ args);
+
+ TAO::Upcall_Wrapper upcall_wrapper;
+ upcall_wrapper.upcall (server_request
+ , args
+ , nargs
+ , command
+#if TAO_HAS_INTERCEPTORS == 1
+ , servant_upcall
+ , exceptions
+ , nexceptions
+#endif /* TAO_HAS_INTERCEPTORS == 1 */
+ ACE_ENV_ARG_PARAMETER);
+ ACE_CHECK;
+}namespace POA_CORBA
+{
+
+
+ // TAO_IDL - Generated from
+ // be\be_visitor_operation/upcall_command_ss.cpp:127
+
+ class _non_existent_ValueBoxDef_Upcall_Command
+ : public TAO::Upcall_Command
+ {
+ public:
+ inline _non_existent_ValueBoxDef_Upcall_Command (
+ POA_CORBA::ValueBoxDef * servant,
+ TAO_Operation_Details const * operation_details,
+ TAO::Argument * const args[])
+ : servant_ (servant)
+ , operation_details_ (operation_details)
+ , args_ (args)
+ {
+ }
+
+ virtual void execute (ACE_ENV_SINGLE_ARG_DECL)
+ {
+ TAO::SArg_Traits< ::ACE_InputCDR::to_boolean>::ret_arg_type retval =
+ TAO::Portable_Server::get_ret_arg< ::ACE_InputCDR::to_boolean> (
+ this->operation_details_,
+ this->args_);
+
+ retval =
+ this->servant_-> _non_existent (
+ ACE_ENV_SINGLE_ARG_PARAMETER);
+ ACE_CHECK;
+ }
+
+ private:
+ POA_CORBA::ValueBoxDef * const servant_;
+ TAO_Operation_Details const * const operation_details_;
+ TAO::Argument * const * const args_;
+ };
+}
+
+
+void POA_CORBA::ValueBoxDef::_non_existent_skel (
+ TAO_ServerRequest & server_request,
+ void * TAO_INTERCEPTOR (servant_upcall),
+ void * servant
+ ACE_ENV_ARG_DECL
+ )
+{
+#if TAO_HAS_INTERCEPTORS == 1
+ static ::CORBA::TypeCode_ptr const * const exceptions = 0;
+ static ::CORBA::ULong const nexceptions = 0;
+#endif /* TAO_HAS_INTERCEPTORS */
+
+ TAO::SArg_Traits< ::ACE_InputCDR::to_boolean>::ret_val retval;
+
+ TAO::Argument * const args[] =
+ {
+ &retval
+ };
+
+ static size_t const nargs = 1;
+
+ POA_CORBA::ValueBoxDef * const impl =
+ static_cast<POA_CORBA::ValueBoxDef *> (servant);
+
+ _non_existent_ValueBoxDef_Upcall_Command command (
+ impl,
+ server_request.operation_details (),
+ args);
+
+ TAO::Upcall_Wrapper upcall_wrapper;
+ upcall_wrapper.upcall (server_request
+ , args
+ , nargs
+ , command
+#if TAO_HAS_INTERCEPTORS == 1
+ , servant_upcall
+ , exceptions
+ , nexceptions
+#endif /* TAO_HAS_INTERCEPTORS == 1 */
+ ACE_ENV_ARG_PARAMETER);
+ ACE_CHECK;
+}namespace POA_CORBA
+{
+
+
+ // TAO_IDL - Generated from
+ // be\be_visitor_operation/upcall_command_ss.cpp:127
+
+ class _repository_id_ValueBoxDef_Upcall_Command
+ : public TAO::Upcall_Command
+ {
+ public:
+ inline _repository_id_ValueBoxDef_Upcall_Command (
+ POA_CORBA::ValueBoxDef * servant,
+ TAO_Operation_Details const * operation_details,
+ TAO::Argument * const args[])
+ : servant_ (servant)
+ , operation_details_ (operation_details)
+ , args_ (args)
+ {
+ }
+
+ virtual void execute (ACE_ENV_SINGLE_ARG_DECL)
+ {
+ TAO::SArg_Traits< ::CORBA::Char *>::ret_arg_type retval =
+ TAO::Portable_Server::get_ret_arg< ::CORBA::Char *> (
+ this->operation_details_,
+ this->args_);
+
+ retval =
+ this->servant_-> _repository_id (
+ ACE_ENV_SINGLE_ARG_PARAMETER);
+ ACE_CHECK;
+ }
+
+ private:
+ POA_CORBA::ValueBoxDef * const servant_;
+ TAO_Operation_Details const * const operation_details_;
+ TAO::Argument * const * const args_;
+ };
+}
+
+
+void POA_CORBA::ValueBoxDef::_repository_id_skel (
+ TAO_ServerRequest & server_request,
+ void * TAO_INTERCEPTOR (servant_upcall),
+ void * servant
+ ACE_ENV_ARG_DECL
+ )
+{
+#if TAO_HAS_INTERCEPTORS == 1
+ static ::CORBA::TypeCode_ptr const * const exceptions = 0;
+ static ::CORBA::ULong const nexceptions = 0;
+#endif /* TAO_HAS_INTERCEPTORS */
+
+ TAO::SArg_Traits< ::CORBA::Char *>::ret_val retval;
+
+ TAO::Argument * const args[] =
+ {
+ &retval
+ };
+
+ static size_t const nargs = 1;
+
+ POA_CORBA::ValueBoxDef * const impl =
+ static_cast<POA_CORBA::ValueBoxDef *> (servant);
+
+ _repository_id_ValueBoxDef_Upcall_Command command (
+ impl,
+ server_request.operation_details (),
+ args);
+
+ TAO::Upcall_Wrapper upcall_wrapper;
+ upcall_wrapper.upcall (server_request
+ , args
+ , nargs
+ , command
+#if TAO_HAS_INTERCEPTORS == 1
+ , servant_upcall
+ , exceptions
+ , nexceptions
+#endif /* TAO_HAS_INTERCEPTORS == 1 */
+ ACE_ENV_ARG_PARAMETER);
+ ACE_CHECK;
+}
+
+// TAO_IDL - Generated from
+// be\be_visitor_interface/interface_ss.cpp:513
+
+void POA_CORBA::ValueBoxDef::_interface_skel (
+ TAO_ServerRequest & server_request,
+ void * /* servant_upcall */,
+ void * servant
+ ACE_ENV_ARG_DECL
+ )
+{
+ TAO_IFR_Client_Adapter *_tao_adapter =
+ ACE_Dynamic_Service<TAO_IFR_Client_Adapter>::instance (
+ TAO_ORB_Core::ifr_client_adapter_name ()
+ );
+
+ if (_tao_adapter == 0)
+ {
+ ACE_THROW ( ::CORBA::INTF_REPOS ( ::CORBA::OMGVMCID | 1,
+ ::CORBA::COMPLETED_NO));
+ }
+
+ POA_CORBA::ValueBoxDef * const impl =
+ static_cast<POA_CORBA::ValueBoxDef *> (servant);
+ ::CORBA::InterfaceDef_ptr _tao_retval =
+ impl->_get_interface (ACE_ENV_SINGLE_ARG_PARAMETER);
+ ACE_CHECK;
+
+ server_request.init_reply ();
+ TAO_OutputCDR &_tao_out = *server_request.outgoing ();
+
+ ::CORBA::Boolean const _tao_result =
+ _tao_adapter->interfacedef_cdr_insert (
+ _tao_out,
+ _tao_retval
+ );
+
+ _tao_adapter->dispose (_tao_retval);
+
+ if (_tao_result == false)
+ {
+ ACE_THROW ( ::CORBA::MARSHAL ());
+ }
+}namespace POA_CORBA
+{
+
+
+ // TAO_IDL - Generated from
+ // be\be_visitor_operation/upcall_command_ss.cpp:127
+
+ class _get_component_ValueBoxDef_Upcall_Command
+ : public TAO::Upcall_Command
+ {
+ public:
+ inline _get_component_ValueBoxDef_Upcall_Command (
+ POA_CORBA::ValueBoxDef * servant,
+ TAO_Operation_Details const * operation_details,
+ TAO::Argument * const args[])
+ : servant_ (servant)
+ , operation_details_ (operation_details)
+ , args_ (args)
+ {
+ }
+
+ virtual void execute (ACE_ENV_SINGLE_ARG_DECL)
+ {
+ TAO::SArg_Traits< ::CORBA::Object>::ret_arg_type retval =
+ TAO::Portable_Server::get_ret_arg< ::CORBA::Object> (
+ this->operation_details_,
+ this->args_);
+
+ retval =
+ this->servant_-> _get_component (
+ ACE_ENV_SINGLE_ARG_PARAMETER);
+ ACE_CHECK;
+ }
+
+ private:
+ POA_CORBA::ValueBoxDef * const servant_;
+ TAO_Operation_Details const * const operation_details_;
+ TAO::Argument * const * const args_;
+ };
+}
+
+
+void POA_CORBA::ValueBoxDef::_component_skel (
+ TAO_ServerRequest & server_request,
+ void * TAO_INTERCEPTOR (servant_upcall),
+ void * servant
+ ACE_ENV_ARG_DECL
+ )
+{
+#if TAO_HAS_INTERCEPTORS == 1
+ static ::CORBA::TypeCode_ptr const * const exceptions = 0;
+ static ::CORBA::ULong const nexceptions = 0;
+#endif /* TAO_HAS_INTERCEPTORS */
+
+ TAO::SArg_Traits< ::CORBA::Object>::ret_val retval;
+
+ TAO::Argument * const args[] =
+ {
+ &retval
+ };
+
+ static size_t const nargs = 1;
+
+ POA_CORBA::ValueBoxDef * const impl =
+ static_cast<POA_CORBA::ValueBoxDef *> (servant);
+
+ _get_component_ValueBoxDef_Upcall_Command command (
+ impl,
+ server_request.operation_details (),
+ args);
+
+ TAO::Upcall_Wrapper upcall_wrapper;
+ upcall_wrapper.upcall (server_request
+ , args
+ , nargs
+ , command
+#if TAO_HAS_INTERCEPTORS == 1
+ , servant_upcall
+ , exceptions
+ , nexceptions
+#endif /* TAO_HAS_INTERCEPTORS == 1 */
+ ACE_ENV_ARG_PARAMETER);
+ ACE_CHECK;
+}
+
+::CORBA::Boolean POA_CORBA::ValueBoxDef::_is_a (
+ const char* value
+ ACE_ENV_ARG_DECL_NOT_USED
+ )
+{
+ return
+ (
+ !ACE_OS::strcmp (
+ value,
+ "IDL:omg.org/CORBA/IRObject:1.0"
+ ) ||
+ !ACE_OS::strcmp (
+ value,
+ "IDL:omg.org/CORBA/Contained:1.0"
+ ) ||
+ !ACE_OS::strcmp (
+ value,
+ "IDL:omg.org/CORBA/IDLType:1.0"
+ ) ||
+ !ACE_OS::strcmp (
+ value,
+ "IDL:omg.org/CORBA/TypedefDef:1.0"
+ ) ||
+ !ACE_OS::strcmp (
+ value,
+ "IDL:omg.org/CORBA/ValueBoxDef:1.0"
+ ) ||
+ !ACE_OS::strcmp (
+ value,
+ "IDL:omg.org/CORBA/Object:1.0"
+ )
+ );
+}
+
+const char* POA_CORBA::ValueBoxDef::_interface_repository_id (void) const
+{
+ return "IDL:omg.org/CORBA/ValueBoxDef:1.0";
+}
+
+// TAO_IDL - Generated from
+// be\be_visitor_interface/interface_ss.cpp:903
+
+void POA_CORBA::ValueBoxDef::_dispatch (
+ TAO_ServerRequest & req,
+ void * servant_upcall
+ ACE_ENV_ARG_DECL
+ )
+{
+ this->synchronous_upcall_dispatch (req,
+ servant_upcall,
+ this
+ ACE_ENV_ARG_PARAMETER);
+}
+
+// TAO_IDL - Generated from
+// be\be_visitor_interface/interface_ss.cpp:851
+
+CORBA::ValueBoxDef *
+POA_CORBA::ValueBoxDef::_this (ACE_ENV_SINGLE_ARG_DECL)
+{
+ TAO_Stub *stub = this->_create_stub (ACE_ENV_SINGLE_ARG_PARAMETER);
+ ACE_CHECK_RETURN (0);
+
+ TAO_Stub_Auto_Ptr safe_stub (stub);
+ ::CORBA::Object_ptr tmp = CORBA::Object::_nil ();
+
+ ::CORBA::Boolean const _tao_opt_colloc =
+ stub->servant_orb_var ()->orb_core ()->optimize_collocation_objects ();
+
+ ACE_NEW_RETURN (
+ tmp,
+ ::CORBA::Object (stub, _tao_opt_colloc, this),
+ 0
+ );
+
+ ::CORBA::Object_var obj = tmp;
+ (void) safe_stub.release ();
+
+ typedef ::CORBA::ValueBoxDef STUB_SCOPED_NAME;
+ return
+ TAO::Narrow_Utils<STUB_SCOPED_NAME>::unchecked_narrow (
+ obj.in (),
+ CORBA__TAO_ValueBoxDef_Proxy_Broker_Factory_function_pointer
+ );
+}
+
+TAO_END_VERSIONED_NAMESPACE_DECL
+
+
+
+#endif /* ifndef */
+
diff --git a/TAO/orbsvcs/orbsvcs/IFRService/IFR_ExtendedS.h b/TAO/orbsvcs/orbsvcs/IFRService/IFR_ExtendedS.h
new file mode 100644
index 00000000000..3cb3af272e8
--- /dev/null
+++ b/TAO/orbsvcs/orbsvcs/IFRService/IFR_ExtendedS.h
@@ -0,0 +1,2140 @@
+// -*- C++ -*-
+//
+// $Id$
+
+// **** Code generated by the The ACE ORB (TAO) IDL Compiler ****
+// TAO and the TAO IDL Compiler have been developed by:
+// Center for Distributed Object Computing
+// Washington University
+// St. Louis, MO
+// USA
+// http://www.cs.wustl.edu/~schmidt/doc-center.html
+// and
+// Distributed Object Computing Laboratory
+// University of California at Irvine
+// Irvine, CA
+// USA
+// http://doc.ece.uci.edu/
+// and
+// Institute for Software Integrated Systems
+// Vanderbilt University
+// Nashville, TN
+// USA
+// http://www.isis.vanderbilt.edu/
+//
+// Information about TAO is available at:
+// http://www.cs.wustl.edu/~schmidt/TAO.html
+
+// TAO_IDL - Generated from
+// be\be_codegen.cpp:409
+
+#ifndef _TAO_IDL____ORBSVCS_ORBSVCS_IFRSERVICE_IFR_EXTENDEDS_H_
+#define _TAO_IDL____ORBSVCS_ORBSVCS_IFRSERVICE_IFR_EXTENDEDS_H_
+
+#include /**/ "ace/pre.h"
+
+#include "tao/IFR_Client/IFR_ExtendedC.h"
+#include "orbsvcs/IFRService/IFR_BasicS.h"
+#include "tao/AnyTypeCode/VisibilityS.h"
+#include "tao/AnyTypeCode/ValueModifierS.h"
+
+#if !defined (ACE_LACKS_PRAGMA_ONCE)
+# pragma once
+#endif /* ACE_LACKS_PRAGMA_ONCE */
+
+#include "tao/Collocation_Proxy_Broker.h"
+#include "tao/PortableServer/PortableServer.h"
+#include "tao/PortableServer/Servant_Base.h"
+
+TAO_BEGIN_VERSIONED_NAMESPACE_DECL
+
+
+
+// TAO_IDL - Generated from
+// be\be_visitor_module/module_sh.cpp:49
+
+namespace POA_CORBA
+{
+
+
+ // TAO_IDL - Generated from
+ // be\be_visitor_interface/interface_sh.cpp:87
+
+ class FixedDef;
+ typedef FixedDef *FixedDef_ptr;
+
+ class FixedDef
+ : public virtual POA_CORBA::IDLType
+ {
+ protected:
+ FixedDef (void);
+
+ public:
+ // Useful for template programming.
+ typedef ::CORBA::FixedDef _stub_type;
+ typedef ::CORBA::FixedDef_ptr _stub_ptr_type;
+ typedef ::CORBA::FixedDef_var _stub_var_type;
+
+ FixedDef (const FixedDef& rhs);
+ virtual ~FixedDef (void);
+
+ virtual ::CORBA::Boolean _is_a (
+ const char* logical_type_id
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS
+ );
+
+ static void _is_a_skel (
+ TAO_ServerRequest & req,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL
+ );
+
+ static void _non_existent_skel (
+ TAO_ServerRequest & req,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL
+ );
+
+ static void _interface_skel (
+ TAO_ServerRequest & req,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL
+ );
+
+ static void _component_skel (
+ TAO_ServerRequest & req,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL
+ );
+
+ static void _repository_id_skel (
+ TAO_ServerRequest & req,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL
+ );
+
+ virtual void _dispatch (
+ TAO_ServerRequest & req,
+ void * servant_upcall
+ ACE_ENV_ARG_DECL
+ );
+
+ ::CORBA::FixedDef *_this (
+
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS
+ );
+
+ virtual const char* _interface_repository_id (void) const;
+
+ // TAO_IDL - Generated from
+ // be\be_visitor_operation/operation_sh.cpp:45
+
+ virtual ::CORBA::UShort digits (
+ ACE_ENV_SINGLE_ARG_DECL_WITH_DEFAULTS
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ )) = 0;
+
+ static void _get_digits_skel (
+ TAO_ServerRequest & server_request,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL
+ );
+
+ // TAO_IDL - Generated from
+ // be\be_visitor_operation/operation_sh.cpp:45
+
+ virtual void digits (
+ ::CORBA::UShort digits
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ )) = 0;
+
+ static void _set_digits_skel (
+ TAO_ServerRequest & server_request,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL
+ );
+
+ // TAO_IDL - Generated from
+ // be\be_visitor_operation/operation_sh.cpp:45
+
+ virtual ::CORBA::Short scale (
+ ACE_ENV_SINGLE_ARG_DECL_WITH_DEFAULTS
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ )) = 0;
+
+ static void _get_scale_skel (
+ TAO_ServerRequest & server_request,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL
+ );
+
+ // TAO_IDL - Generated from
+ // be\be_visitor_operation/operation_sh.cpp:45
+
+ virtual void scale (
+ ::CORBA::Short scale
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ )) = 0;
+
+ static void _set_scale_skel (
+ TAO_ServerRequest & server_request,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL
+ );
+
+ static void
+ _get_def_kind_skel (
+ TAO_ServerRequest & server_request,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS
+ );
+
+ // TAO_IDL - Generated from
+ // be\be_interface.cpp:1955
+
+ static void
+ destroy_skel (
+ TAO_ServerRequest & server_request,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS
+ );
+
+ static void
+ _get_type_skel (
+ TAO_ServerRequest & server_request,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS
+ );
+ };
+
+ // TAO_IDL - Generated from
+ // be\be_visitor_interface/interface_sh.cpp:87
+
+ class ValueMemberDef;
+ typedef ValueMemberDef *ValueMemberDef_ptr;
+
+ class ValueMemberDef
+ : public virtual POA_CORBA::Contained
+ {
+ protected:
+ ValueMemberDef (void);
+
+ public:
+ // Useful for template programming.
+ typedef ::CORBA::ValueMemberDef _stub_type;
+ typedef ::CORBA::ValueMemberDef_ptr _stub_ptr_type;
+ typedef ::CORBA::ValueMemberDef_var _stub_var_type;
+
+ ValueMemberDef (const ValueMemberDef& rhs);
+ virtual ~ValueMemberDef (void);
+
+ virtual ::CORBA::Boolean _is_a (
+ const char* logical_type_id
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS
+ );
+
+ static void _is_a_skel (
+ TAO_ServerRequest & req,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL
+ );
+
+ static void _non_existent_skel (
+ TAO_ServerRequest & req,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL
+ );
+
+ static void _interface_skel (
+ TAO_ServerRequest & req,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL
+ );
+
+ static void _component_skel (
+ TAO_ServerRequest & req,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL
+ );
+
+ static void _repository_id_skel (
+ TAO_ServerRequest & req,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL
+ );
+
+ virtual void _dispatch (
+ TAO_ServerRequest & req,
+ void * servant_upcall
+ ACE_ENV_ARG_DECL
+ );
+
+ ::CORBA::ValueMemberDef *_this (
+
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS
+ );
+
+ virtual const char* _interface_repository_id (void) const;
+
+ // TAO_IDL - Generated from
+ // be\be_visitor_operation/operation_sh.cpp:45
+
+ virtual ::CORBA::TypeCode_ptr type (
+ ACE_ENV_SINGLE_ARG_DECL_WITH_DEFAULTS
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ )) = 0;
+
+ static void _get_type_skel (
+ TAO_ServerRequest & server_request,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL
+ );
+
+ // TAO_IDL - Generated from
+ // be\be_visitor_operation/operation_sh.cpp:45
+
+ virtual ::CORBA::IDLType_ptr type_def (
+ ACE_ENV_SINGLE_ARG_DECL_WITH_DEFAULTS
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ )) = 0;
+
+ static void _get_type_def_skel (
+ TAO_ServerRequest & server_request,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL
+ );
+
+ // TAO_IDL - Generated from
+ // be\be_visitor_operation/operation_sh.cpp:45
+
+ virtual void type_def (
+ ::CORBA::IDLType_ptr type_def
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ )) = 0;
+
+ static void _set_type_def_skel (
+ TAO_ServerRequest & server_request,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL
+ );
+
+ // TAO_IDL - Generated from
+ // be\be_visitor_operation/operation_sh.cpp:45
+
+ virtual ::CORBA::Visibility access (
+ ACE_ENV_SINGLE_ARG_DECL_WITH_DEFAULTS
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ )) = 0;
+
+ static void _get_access_skel (
+ TAO_ServerRequest & server_request,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL
+ );
+
+ // TAO_IDL - Generated from
+ // be\be_visitor_operation/operation_sh.cpp:45
+
+ virtual void access (
+ ::CORBA::Visibility access
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ )) = 0;
+
+ static void _set_access_skel (
+ TAO_ServerRequest & server_request,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL
+ );
+
+ static void
+ _get_def_kind_skel (
+ TAO_ServerRequest & server_request,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS
+ );
+
+ // TAO_IDL - Generated from
+ // be\be_interface.cpp:1955
+
+ static void
+ destroy_skel (
+ TAO_ServerRequest & server_request,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS
+ );
+
+ static void
+ _get_id_skel (
+ TAO_ServerRequest & server_request,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS
+ );
+
+ static void
+ _set_id_skel (
+ TAO_ServerRequest & server_request,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS
+ );
+
+ static void
+ _get_name_skel (
+ TAO_ServerRequest & server_request,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS
+ );
+
+ static void
+ _set_name_skel (
+ TAO_ServerRequest & server_request,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS
+ );
+
+ static void
+ _get_version_skel (
+ TAO_ServerRequest & server_request,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS
+ );
+
+ static void
+ _set_version_skel (
+ TAO_ServerRequest & server_request,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS
+ );
+
+ static void
+ _get_defined_in_skel (
+ TAO_ServerRequest & server_request,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS
+ );
+
+ static void
+ _get_absolute_name_skel (
+ TAO_ServerRequest & server_request,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS
+ );
+
+ static void
+ _get_containing_repository_skel (
+ TAO_ServerRequest & server_request,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS
+ );
+
+ // TAO_IDL - Generated from
+ // be\be_interface.cpp:1955
+
+ static void
+ describe_skel (
+ TAO_ServerRequest & server_request,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS
+ );
+
+ // TAO_IDL - Generated from
+ // be\be_interface.cpp:1955
+
+ static void
+ move_skel (
+ TAO_ServerRequest & server_request,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS
+ );
+ };
+
+ // TAO_IDL - Generated from
+ // be\be_visitor_interface/interface_sh.cpp:87
+
+ class ValueDef;
+ typedef ValueDef *ValueDef_ptr;
+
+ class ValueDef
+ : public virtual POA_CORBA::Container,
+ public virtual POA_CORBA::Contained,
+ public virtual POA_CORBA::IDLType
+ {
+ protected:
+ ValueDef (void);
+
+ public:
+ // Useful for template programming.
+ typedef ::CORBA::ValueDef _stub_type;
+ typedef ::CORBA::ValueDef_ptr _stub_ptr_type;
+ typedef ::CORBA::ValueDef_var _stub_var_type;
+
+ ValueDef (const ValueDef& rhs);
+ virtual ~ValueDef (void);
+
+ virtual ::CORBA::Boolean _is_a (
+ const char* logical_type_id
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS
+ );
+
+ static void _is_a_skel (
+ TAO_ServerRequest & req,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL
+ );
+
+ static void _non_existent_skel (
+ TAO_ServerRequest & req,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL
+ );
+
+ static void _interface_skel (
+ TAO_ServerRequest & req,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL
+ );
+
+ static void _component_skel (
+ TAO_ServerRequest & req,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL
+ );
+
+ static void _repository_id_skel (
+ TAO_ServerRequest & req,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL
+ );
+
+ virtual void _dispatch (
+ TAO_ServerRequest & req,
+ void * servant_upcall
+ ACE_ENV_ARG_DECL
+ );
+
+ ::CORBA::ValueDef *_this (
+
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS
+ );
+
+ virtual const char* _interface_repository_id (void) const;
+
+ // TAO_IDL - Generated from
+ // be\be_visitor_operation/operation_sh.cpp:45
+
+ virtual ::CORBA::InterfaceDefSeq * supported_interfaces (
+ ACE_ENV_SINGLE_ARG_DECL_WITH_DEFAULTS
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ )) = 0;
+
+ static void _get_supported_interfaces_skel (
+ TAO_ServerRequest & server_request,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL
+ );
+
+ // TAO_IDL - Generated from
+ // be\be_visitor_operation/operation_sh.cpp:45
+
+ virtual void supported_interfaces (
+ const ::CORBA::InterfaceDefSeq & supported_interfaces
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ )) = 0;
+
+ static void _set_supported_interfaces_skel (
+ TAO_ServerRequest & server_request,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL
+ );
+
+ // TAO_IDL - Generated from
+ // be\be_visitor_operation/operation_sh.cpp:45
+
+ virtual ::CORBA::InitializerSeq * initializers (
+ ACE_ENV_SINGLE_ARG_DECL_WITH_DEFAULTS
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ )) = 0;
+
+ static void _get_initializers_skel (
+ TAO_ServerRequest & server_request,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL
+ );
+
+ // TAO_IDL - Generated from
+ // be\be_visitor_operation/operation_sh.cpp:45
+
+ virtual void initializers (
+ const ::CORBA::InitializerSeq & initializers
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ )) = 0;
+
+ static void _set_initializers_skel (
+ TAO_ServerRequest & server_request,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL
+ );
+
+ // TAO_IDL - Generated from
+ // be\be_visitor_operation/operation_sh.cpp:45
+
+ virtual ::CORBA::ValueDef_ptr base_value (
+ ACE_ENV_SINGLE_ARG_DECL_WITH_DEFAULTS
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ )) = 0;
+
+ static void _get_base_value_skel (
+ TAO_ServerRequest & server_request,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL
+ );
+
+ // TAO_IDL - Generated from
+ // be\be_visitor_operation/operation_sh.cpp:45
+
+ virtual void base_value (
+ ::CORBA::ValueDef_ptr base_value
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ )) = 0;
+
+ static void _set_base_value_skel (
+ TAO_ServerRequest & server_request,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL
+ );
+
+ // TAO_IDL - Generated from
+ // be\be_visitor_operation/operation_sh.cpp:45
+
+ virtual ::CORBA::ValueDefSeq * abstract_base_values (
+ ACE_ENV_SINGLE_ARG_DECL_WITH_DEFAULTS
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ )) = 0;
+
+ static void _get_abstract_base_values_skel (
+ TAO_ServerRequest & server_request,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL
+ );
+
+ // TAO_IDL - Generated from
+ // be\be_visitor_operation/operation_sh.cpp:45
+
+ virtual void abstract_base_values (
+ const ::CORBA::ValueDefSeq & abstract_base_values
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ )) = 0;
+
+ static void _set_abstract_base_values_skel (
+ TAO_ServerRequest & server_request,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL
+ );
+
+ // TAO_IDL - Generated from
+ // be\be_visitor_operation/operation_sh.cpp:45
+
+ virtual ::CORBA::Boolean is_abstract (
+ ACE_ENV_SINGLE_ARG_DECL_WITH_DEFAULTS
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ )) = 0;
+
+ static void _get_is_abstract_skel (
+ TAO_ServerRequest & server_request,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL
+ );
+
+ // TAO_IDL - Generated from
+ // be\be_visitor_operation/operation_sh.cpp:45
+
+ virtual void is_abstract (
+ ::CORBA::Boolean is_abstract
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ )) = 0;
+
+ static void _set_is_abstract_skel (
+ TAO_ServerRequest & server_request,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL
+ );
+
+ // TAO_IDL - Generated from
+ // be\be_visitor_operation/operation_sh.cpp:45
+
+ virtual ::CORBA::Boolean is_custom (
+ ACE_ENV_SINGLE_ARG_DECL_WITH_DEFAULTS
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ )) = 0;
+
+ static void _get_is_custom_skel (
+ TAO_ServerRequest & server_request,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL
+ );
+
+ // TAO_IDL - Generated from
+ // be\be_visitor_operation/operation_sh.cpp:45
+
+ virtual void is_custom (
+ ::CORBA::Boolean is_custom
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ )) = 0;
+
+ static void _set_is_custom_skel (
+ TAO_ServerRequest & server_request,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL
+ );
+
+ // TAO_IDL - Generated from
+ // be\be_visitor_operation/operation_sh.cpp:45
+
+ virtual ::CORBA::Boolean is_truncatable (
+ ACE_ENV_SINGLE_ARG_DECL_WITH_DEFAULTS
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ )) = 0;
+
+ static void _get_is_truncatable_skel (
+ TAO_ServerRequest & server_request,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL
+ );
+
+ // TAO_IDL - Generated from
+ // be\be_visitor_operation/operation_sh.cpp:45
+
+ virtual void is_truncatable (
+ ::CORBA::Boolean is_truncatable
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ )) = 0;
+
+ static void _set_is_truncatable_skel (
+ TAO_ServerRequest & server_request,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL
+ );
+
+ // TAO_IDL - Generated from
+ // be\be_visitor_operation/operation_sh.cpp:45
+
+ virtual ::CORBA::Boolean is_a (
+ const char * id
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ )) = 0;
+
+ static void is_a_skel (
+ TAO_ServerRequest & server_request,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL
+ );
+
+ // TAO_IDL - Generated from
+ // be\be_visitor_operation/operation_sh.cpp:45
+
+ virtual ::CORBA::ValueDef::FullValueDescription * describe_value (
+ ACE_ENV_SINGLE_ARG_DECL_WITH_DEFAULTS
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ )) = 0;
+
+ static void describe_value_skel (
+ TAO_ServerRequest & server_request,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL
+ );
+
+ // TAO_IDL - Generated from
+ // be\be_visitor_operation/operation_sh.cpp:45
+
+ virtual ::CORBA::ValueMemberDef_ptr create_value_member (
+ const char * id,
+ const char * name,
+ const char * version,
+ ::CORBA::IDLType_ptr type,
+ ::CORBA::Visibility access
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ )) = 0;
+
+ static void create_value_member_skel (
+ TAO_ServerRequest & server_request,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL
+ );
+
+ // TAO_IDL - Generated from
+ // be\be_visitor_operation/operation_sh.cpp:45
+
+ virtual ::CORBA::AttributeDef_ptr create_attribute (
+ const char * id,
+ const char * name,
+ const char * version,
+ ::CORBA::IDLType_ptr type,
+ ::CORBA::AttributeMode mode
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ )) = 0;
+
+ static void create_attribute_skel (
+ TAO_ServerRequest & server_request,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL
+ );
+
+ // TAO_IDL - Generated from
+ // be\be_visitor_operation/operation_sh.cpp:45
+
+ virtual ::CORBA::OperationDef_ptr create_operation (
+ const char * id,
+ const char * name,
+ const char * version,
+ ::CORBA::IDLType_ptr result,
+ ::CORBA::OperationMode mode,
+ const ::CORBA::ParDescriptionSeq & params,
+ const ::CORBA::ExceptionDefSeq & exceptions,
+ const ::CORBA::ContextIdSeq & contexts
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ )) = 0;
+
+ static void create_operation_skel (
+ TAO_ServerRequest & server_request,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL
+ );
+
+ static void
+ _get_def_kind_skel (
+ TAO_ServerRequest & server_request,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS
+ );
+
+ // TAO_IDL - Generated from
+ // be\be_interface.cpp:1955
+
+ static void
+ destroy_skel (
+ TAO_ServerRequest & server_request,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS
+ );
+
+ // TAO_IDL - Generated from
+ // be\be_interface.cpp:1955
+
+ static void
+ lookup_skel (
+ TAO_ServerRequest & server_request,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS
+ );
+
+ // TAO_IDL - Generated from
+ // be\be_interface.cpp:1955
+
+ static void
+ contents_skel (
+ TAO_ServerRequest & server_request,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS
+ );
+
+ // TAO_IDL - Generated from
+ // be\be_interface.cpp:1955
+
+ static void
+ lookup_name_skel (
+ TAO_ServerRequest & server_request,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS
+ );
+
+ // TAO_IDL - Generated from
+ // be\be_interface.cpp:1955
+
+ static void
+ describe_contents_skel (
+ TAO_ServerRequest & server_request,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS
+ );
+
+ // TAO_IDL - Generated from
+ // be\be_interface.cpp:1955
+
+ static void
+ create_module_skel (
+ TAO_ServerRequest & server_request,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS
+ );
+
+ // TAO_IDL - Generated from
+ // be\be_interface.cpp:1955
+
+ static void
+ create_constant_skel (
+ TAO_ServerRequest & server_request,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS
+ );
+
+ // TAO_IDL - Generated from
+ // be\be_interface.cpp:1955
+
+ static void
+ create_struct_skel (
+ TAO_ServerRequest & server_request,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS
+ );
+
+ // TAO_IDL - Generated from
+ // be\be_interface.cpp:1955
+
+ static void
+ create_union_skel (
+ TAO_ServerRequest & server_request,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS
+ );
+
+ // TAO_IDL - Generated from
+ // be\be_interface.cpp:1955
+
+ static void
+ create_enum_skel (
+ TAO_ServerRequest & server_request,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS
+ );
+
+ // TAO_IDL - Generated from
+ // be\be_interface.cpp:1955
+
+ static void
+ create_alias_skel (
+ TAO_ServerRequest & server_request,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS
+ );
+
+ // TAO_IDL - Generated from
+ // be\be_interface.cpp:1955
+
+ static void
+ create_interface_skel (
+ TAO_ServerRequest & server_request,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS
+ );
+
+ // TAO_IDL - Generated from
+ // be\be_interface.cpp:1955
+
+ static void
+ create_value_skel (
+ TAO_ServerRequest & server_request,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS
+ );
+
+ // TAO_IDL - Generated from
+ // be\be_interface.cpp:1955
+
+ static void
+ create_value_box_skel (
+ TAO_ServerRequest & server_request,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS
+ );
+
+ // TAO_IDL - Generated from
+ // be\be_interface.cpp:1955
+
+ static void
+ create_exception_skel (
+ TAO_ServerRequest & server_request,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS
+ );
+
+ // TAO_IDL - Generated from
+ // be\be_interface.cpp:1955
+
+ static void
+ create_native_skel (
+ TAO_ServerRequest & server_request,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS
+ );
+
+ // TAO_IDL - Generated from
+ // be\be_interface.cpp:1955
+
+ static void
+ create_abstract_interface_skel (
+ TAO_ServerRequest & server_request,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS
+ );
+
+ // TAO_IDL - Generated from
+ // be\be_interface.cpp:1955
+
+ static void
+ create_local_interface_skel (
+ TAO_ServerRequest & server_request,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS
+ );
+
+ // TAO_IDL - Generated from
+ // be\be_interface.cpp:1955
+
+ static void
+ create_ext_value_skel (
+ TAO_ServerRequest & server_request,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS
+ );
+
+ static void
+ _get_id_skel (
+ TAO_ServerRequest & server_request,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS
+ );
+
+ static void
+ _set_id_skel (
+ TAO_ServerRequest & server_request,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS
+ );
+
+ static void
+ _get_name_skel (
+ TAO_ServerRequest & server_request,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS
+ );
+
+ static void
+ _set_name_skel (
+ TAO_ServerRequest & server_request,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS
+ );
+
+ static void
+ _get_version_skel (
+ TAO_ServerRequest & server_request,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS
+ );
+
+ static void
+ _set_version_skel (
+ TAO_ServerRequest & server_request,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS
+ );
+
+ static void
+ _get_defined_in_skel (
+ TAO_ServerRequest & server_request,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS
+ );
+
+ static void
+ _get_absolute_name_skel (
+ TAO_ServerRequest & server_request,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS
+ );
+
+ static void
+ _get_containing_repository_skel (
+ TAO_ServerRequest & server_request,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS
+ );
+
+ // TAO_IDL - Generated from
+ // be\be_interface.cpp:1955
+
+ static void
+ describe_skel (
+ TAO_ServerRequest & server_request,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS
+ );
+
+ // TAO_IDL - Generated from
+ // be\be_interface.cpp:1955
+
+ static void
+ move_skel (
+ TAO_ServerRequest & server_request,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS
+ );
+
+ static void
+ _get_type_skel (
+ TAO_ServerRequest & server_request,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS
+ );
+ };
+
+ // TAO_IDL - Generated from
+ // be\be_visitor_interface/interface_sh.cpp:87
+
+ class ExtValueDef;
+ typedef ExtValueDef *ExtValueDef_ptr;
+
+ class ExtValueDef
+ : public virtual POA_CORBA::ValueDef
+ {
+ protected:
+ ExtValueDef (void);
+
+ public:
+ // Useful for template programming.
+ typedef ::CORBA::ExtValueDef _stub_type;
+ typedef ::CORBA::ExtValueDef_ptr _stub_ptr_type;
+ typedef ::CORBA::ExtValueDef_var _stub_var_type;
+
+ ExtValueDef (const ExtValueDef& rhs);
+ virtual ~ExtValueDef (void);
+
+ virtual ::CORBA::Boolean _is_a (
+ const char* logical_type_id
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS
+ );
+
+ static void _is_a_skel (
+ TAO_ServerRequest & req,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL
+ );
+
+ static void _non_existent_skel (
+ TAO_ServerRequest & req,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL
+ );
+
+ static void _interface_skel (
+ TAO_ServerRequest & req,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL
+ );
+
+ static void _component_skel (
+ TAO_ServerRequest & req,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL
+ );
+
+ static void _repository_id_skel (
+ TAO_ServerRequest & req,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL
+ );
+
+ virtual void _dispatch (
+ TAO_ServerRequest & req,
+ void * servant_upcall
+ ACE_ENV_ARG_DECL
+ );
+
+ ::CORBA::ExtValueDef *_this (
+
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS
+ );
+
+ virtual const char* _interface_repository_id (void) const;
+
+ // TAO_IDL - Generated from
+ // be\be_visitor_operation/operation_sh.cpp:45
+
+ virtual ::CORBA::ExtInitializerSeq * ext_initializers (
+ ACE_ENV_SINGLE_ARG_DECL_WITH_DEFAULTS
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ )) = 0;
+
+ static void _get_ext_initializers_skel (
+ TAO_ServerRequest & server_request,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL
+ );
+
+ // TAO_IDL - Generated from
+ // be\be_visitor_operation/operation_sh.cpp:45
+
+ virtual void ext_initializers (
+ const ::CORBA::ExtInitializerSeq & ext_initializers
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ )) = 0;
+
+ static void _set_ext_initializers_skel (
+ TAO_ServerRequest & server_request,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL
+ );
+
+ // TAO_IDL - Generated from
+ // be\be_visitor_operation/operation_sh.cpp:45
+
+ virtual ::CORBA::ExtValueDef::ExtFullValueDescription * describe_ext_value (
+ ACE_ENV_SINGLE_ARG_DECL_WITH_DEFAULTS
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ )) = 0;
+
+ static void describe_ext_value_skel (
+ TAO_ServerRequest & server_request,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL
+ );
+
+ // TAO_IDL - Generated from
+ // be\be_visitor_operation/operation_sh.cpp:45
+
+ virtual ::CORBA::ExtAttributeDef_ptr create_ext_attribute (
+ const char * id,
+ const char * name,
+ const char * version,
+ ::CORBA::IDLType_ptr type,
+ ::CORBA::AttributeMode mode,
+ const ::CORBA::ExceptionDefSeq & get_exceptions,
+ const ::CORBA::ExceptionDefSeq & set_exceptions
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ )) = 0;
+
+ static void create_ext_attribute_skel (
+ TAO_ServerRequest & server_request,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL
+ );
+
+ static void
+ _get_def_kind_skel (
+ TAO_ServerRequest & server_request,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS
+ );
+
+ // TAO_IDL - Generated from
+ // be\be_interface.cpp:1955
+
+ static void
+ destroy_skel (
+ TAO_ServerRequest & server_request,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS
+ );
+
+ // TAO_IDL - Generated from
+ // be\be_interface.cpp:1955
+
+ static void
+ lookup_skel (
+ TAO_ServerRequest & server_request,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS
+ );
+
+ // TAO_IDL - Generated from
+ // be\be_interface.cpp:1955
+
+ static void
+ contents_skel (
+ TAO_ServerRequest & server_request,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS
+ );
+
+ // TAO_IDL - Generated from
+ // be\be_interface.cpp:1955
+
+ static void
+ lookup_name_skel (
+ TAO_ServerRequest & server_request,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS
+ );
+
+ // TAO_IDL - Generated from
+ // be\be_interface.cpp:1955
+
+ static void
+ describe_contents_skel (
+ TAO_ServerRequest & server_request,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS
+ );
+
+ // TAO_IDL - Generated from
+ // be\be_interface.cpp:1955
+
+ static void
+ create_module_skel (
+ TAO_ServerRequest & server_request,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS
+ );
+
+ // TAO_IDL - Generated from
+ // be\be_interface.cpp:1955
+
+ static void
+ create_constant_skel (
+ TAO_ServerRequest & server_request,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS
+ );
+
+ // TAO_IDL - Generated from
+ // be\be_interface.cpp:1955
+
+ static void
+ create_struct_skel (
+ TAO_ServerRequest & server_request,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS
+ );
+
+ // TAO_IDL - Generated from
+ // be\be_interface.cpp:1955
+
+ static void
+ create_union_skel (
+ TAO_ServerRequest & server_request,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS
+ );
+
+ // TAO_IDL - Generated from
+ // be\be_interface.cpp:1955
+
+ static void
+ create_enum_skel (
+ TAO_ServerRequest & server_request,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS
+ );
+
+ // TAO_IDL - Generated from
+ // be\be_interface.cpp:1955
+
+ static void
+ create_alias_skel (
+ TAO_ServerRequest & server_request,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS
+ );
+
+ // TAO_IDL - Generated from
+ // be\be_interface.cpp:1955
+
+ static void
+ create_interface_skel (
+ TAO_ServerRequest & server_request,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS
+ );
+
+ // TAO_IDL - Generated from
+ // be\be_interface.cpp:1955
+
+ static void
+ create_value_skel (
+ TAO_ServerRequest & server_request,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS
+ );
+
+ // TAO_IDL - Generated from
+ // be\be_interface.cpp:1955
+
+ static void
+ create_value_box_skel (
+ TAO_ServerRequest & server_request,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS
+ );
+
+ // TAO_IDL - Generated from
+ // be\be_interface.cpp:1955
+
+ static void
+ create_exception_skel (
+ TAO_ServerRequest & server_request,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS
+ );
+
+ // TAO_IDL - Generated from
+ // be\be_interface.cpp:1955
+
+ static void
+ create_native_skel (
+ TAO_ServerRequest & server_request,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS
+ );
+
+ // TAO_IDL - Generated from
+ // be\be_interface.cpp:1955
+
+ static void
+ create_abstract_interface_skel (
+ TAO_ServerRequest & server_request,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS
+ );
+
+ // TAO_IDL - Generated from
+ // be\be_interface.cpp:1955
+
+ static void
+ create_local_interface_skel (
+ TAO_ServerRequest & server_request,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS
+ );
+
+ // TAO_IDL - Generated from
+ // be\be_interface.cpp:1955
+
+ static void
+ create_ext_value_skel (
+ TAO_ServerRequest & server_request,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS
+ );
+
+ static void
+ _get_id_skel (
+ TAO_ServerRequest & server_request,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS
+ );
+
+ static void
+ _set_id_skel (
+ TAO_ServerRequest & server_request,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS
+ );
+
+ static void
+ _get_name_skel (
+ TAO_ServerRequest & server_request,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS
+ );
+
+ static void
+ _set_name_skel (
+ TAO_ServerRequest & server_request,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS
+ );
+
+ static void
+ _get_version_skel (
+ TAO_ServerRequest & server_request,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS
+ );
+
+ static void
+ _set_version_skel (
+ TAO_ServerRequest & server_request,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS
+ );
+
+ static void
+ _get_defined_in_skel (
+ TAO_ServerRequest & server_request,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS
+ );
+
+ static void
+ _get_absolute_name_skel (
+ TAO_ServerRequest & server_request,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS
+ );
+
+ static void
+ _get_containing_repository_skel (
+ TAO_ServerRequest & server_request,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS
+ );
+
+ // TAO_IDL - Generated from
+ // be\be_interface.cpp:1955
+
+ static void
+ describe_skel (
+ TAO_ServerRequest & server_request,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS
+ );
+
+ // TAO_IDL - Generated from
+ // be\be_interface.cpp:1955
+
+ static void
+ move_skel (
+ TAO_ServerRequest & server_request,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS
+ );
+
+ static void
+ _get_type_skel (
+ TAO_ServerRequest & server_request,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS
+ );
+
+ static void
+ _get_supported_interfaces_skel (
+ TAO_ServerRequest & server_request,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS
+ );
+
+ static void
+ _set_supported_interfaces_skel (
+ TAO_ServerRequest & server_request,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS
+ );
+
+ static void
+ _get_initializers_skel (
+ TAO_ServerRequest & server_request,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS
+ );
+
+ static void
+ _set_initializers_skel (
+ TAO_ServerRequest & server_request,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS
+ );
+
+ static void
+ _get_base_value_skel (
+ TAO_ServerRequest & server_request,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS
+ );
+
+ static void
+ _set_base_value_skel (
+ TAO_ServerRequest & server_request,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS
+ );
+
+ static void
+ _get_abstract_base_values_skel (
+ TAO_ServerRequest & server_request,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS
+ );
+
+ static void
+ _set_abstract_base_values_skel (
+ TAO_ServerRequest & server_request,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS
+ );
+
+ static void
+ _get_is_abstract_skel (
+ TAO_ServerRequest & server_request,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS
+ );
+
+ static void
+ _set_is_abstract_skel (
+ TAO_ServerRequest & server_request,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS
+ );
+
+ static void
+ _get_is_custom_skel (
+ TAO_ServerRequest & server_request,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS
+ );
+
+ static void
+ _set_is_custom_skel (
+ TAO_ServerRequest & server_request,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS
+ );
+
+ static void
+ _get_is_truncatable_skel (
+ TAO_ServerRequest & server_request,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS
+ );
+
+ static void
+ _set_is_truncatable_skel (
+ TAO_ServerRequest & server_request,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS
+ );
+
+ // TAO_IDL - Generated from
+ // be\be_interface.cpp:1955
+
+ static void
+ is_a_skel (
+ TAO_ServerRequest & server_request,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS
+ );
+
+ // TAO_IDL - Generated from
+ // be\be_interface.cpp:1955
+
+ static void
+ describe_value_skel (
+ TAO_ServerRequest & server_request,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS
+ );
+
+ // TAO_IDL - Generated from
+ // be\be_interface.cpp:1955
+
+ static void
+ create_value_member_skel (
+ TAO_ServerRequest & server_request,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS
+ );
+
+ // TAO_IDL - Generated from
+ // be\be_interface.cpp:1955
+
+ static void
+ create_attribute_skel (
+ TAO_ServerRequest & server_request,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS
+ );
+
+ // TAO_IDL - Generated from
+ // be\be_interface.cpp:1955
+
+ static void
+ create_operation_skel (
+ TAO_ServerRequest & server_request,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS
+ );
+ };
+
+ // TAO_IDL - Generated from
+ // be\be_visitor_interface/interface_sh.cpp:87
+
+ class ValueBoxDef;
+ typedef ValueBoxDef *ValueBoxDef_ptr;
+
+ class ValueBoxDef
+ : public virtual POA_CORBA::TypedefDef
+ {
+ protected:
+ ValueBoxDef (void);
+
+ public:
+ // Useful for template programming.
+ typedef ::CORBA::ValueBoxDef _stub_type;
+ typedef ::CORBA::ValueBoxDef_ptr _stub_ptr_type;
+ typedef ::CORBA::ValueBoxDef_var _stub_var_type;
+
+ ValueBoxDef (const ValueBoxDef& rhs);
+ virtual ~ValueBoxDef (void);
+
+ virtual ::CORBA::Boolean _is_a (
+ const char* logical_type_id
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS
+ );
+
+ static void _is_a_skel (
+ TAO_ServerRequest & req,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL
+ );
+
+ static void _non_existent_skel (
+ TAO_ServerRequest & req,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL
+ );
+
+ static void _interface_skel (
+ TAO_ServerRequest & req,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL
+ );
+
+ static void _component_skel (
+ TAO_ServerRequest & req,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL
+ );
+
+ static void _repository_id_skel (
+ TAO_ServerRequest & req,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL
+ );
+
+ virtual void _dispatch (
+ TAO_ServerRequest & req,
+ void * servant_upcall
+ ACE_ENV_ARG_DECL
+ );
+
+ ::CORBA::ValueBoxDef *_this (
+
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS
+ );
+
+ virtual const char* _interface_repository_id (void) const;
+
+ // TAO_IDL - Generated from
+ // be\be_visitor_operation/operation_sh.cpp:45
+
+ virtual ::CORBA::IDLType_ptr original_type_def (
+ ACE_ENV_SINGLE_ARG_DECL_WITH_DEFAULTS
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ )) = 0;
+
+ static void _get_original_type_def_skel (
+ TAO_ServerRequest & server_request,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL
+ );
+
+ // TAO_IDL - Generated from
+ // be\be_visitor_operation/operation_sh.cpp:45
+
+ virtual void original_type_def (
+ ::CORBA::IDLType_ptr original_type_def
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ )) = 0;
+
+ static void _set_original_type_def_skel (
+ TAO_ServerRequest & server_request,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL
+ );
+
+ static void
+ _get_def_kind_skel (
+ TAO_ServerRequest & server_request,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS
+ );
+
+ // TAO_IDL - Generated from
+ // be\be_interface.cpp:1955
+
+ static void
+ destroy_skel (
+ TAO_ServerRequest & server_request,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS
+ );
+
+ static void
+ _get_id_skel (
+ TAO_ServerRequest & server_request,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS
+ );
+
+ static void
+ _set_id_skel (
+ TAO_ServerRequest & server_request,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS
+ );
+
+ static void
+ _get_name_skel (
+ TAO_ServerRequest & server_request,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS
+ );
+
+ static void
+ _set_name_skel (
+ TAO_ServerRequest & server_request,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS
+ );
+
+ static void
+ _get_version_skel (
+ TAO_ServerRequest & server_request,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS
+ );
+
+ static void
+ _set_version_skel (
+ TAO_ServerRequest & server_request,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS
+ );
+
+ static void
+ _get_defined_in_skel (
+ TAO_ServerRequest & server_request,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS
+ );
+
+ static void
+ _get_absolute_name_skel (
+ TAO_ServerRequest & server_request,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS
+ );
+
+ static void
+ _get_containing_repository_skel (
+ TAO_ServerRequest & server_request,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS
+ );
+
+ // TAO_IDL - Generated from
+ // be\be_interface.cpp:1955
+
+ static void
+ describe_skel (
+ TAO_ServerRequest & server_request,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS
+ );
+
+ // TAO_IDL - Generated from
+ // be\be_interface.cpp:1955
+
+ static void
+ move_skel (
+ TAO_ServerRequest & server_request,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS
+ );
+
+ static void
+ _get_type_skel (
+ TAO_ServerRequest & server_request,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS
+ );
+ };
+
+// TAO_IDL - Generated from
+// be\be_visitor_module/module_sh.cpp:80
+
+} // module CORBA
+
+// TAO_IDL - Generated from
+// be\be_codegen.cpp:1219
+
+
+
+TAO_END_VERSIONED_NAMESPACE_DECL
+
+#include "IFR_ExtendedS_T.h"
+
+#if defined (__ACE_INLINE__)
+#include "IFR_ExtendedS.inl"
+#endif /* defined INLINE */
+
+#include /**/ "ace/post.h"
+#endif /* ifndef */
+
diff --git a/TAO/orbsvcs/orbsvcs/IFRService/IFR_ExtendedS.inl b/TAO/orbsvcs/orbsvcs/IFRService/IFR_ExtendedS.inl
new file mode 100644
index 00000000000..78a4a8dcb9d
--- /dev/null
+++ b/TAO/orbsvcs/orbsvcs/IFRService/IFR_ExtendedS.inl
@@ -0,0 +1,2232 @@
+// -*- C++ -*-
+//
+// $Id$
+
+// **** Code generated by the The ACE ORB (TAO) IDL Compiler ****
+// TAO and the TAO IDL Compiler have been developed by:
+// Center for Distributed Object Computing
+// Washington University
+// St. Louis, MO
+// USA
+// http://www.cs.wustl.edu/~schmidt/doc-center.html
+// and
+// Distributed Object Computing Laboratory
+// University of California at Irvine
+// Irvine, CA
+// USA
+// http://doc.ece.uci.edu/
+// and
+// Institute for Software Integrated Systems
+// Vanderbilt University
+// Nashville, TN
+// USA
+// http://www.isis.vanderbilt.edu/
+//
+// Information about TAO is available at:
+// http://www.cs.wustl.edu/~schmidt/TAO.html
+
+
+TAO_BEGIN_VERSIONED_NAMESPACE_DECL
+
+
+
+ACE_INLINE
+void
+POA_CORBA::FixedDef::_get_def_kind_skel (
+ TAO_ServerRequest & server_request,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL
+ )
+{
+ POA_CORBA::IRObject * const impl = static_cast<POA_CORBA::FixedDef *> (servant);
+ POA_CORBA::IRObject::_get_def_kind_skel (
+ server_request,
+ servant_upcall,
+ impl
+ ACE_ENV_ARG_PARAMETER
+ );
+}
+
+// TAO_IDL - Generated from
+// be\be_interface.cpp:1955
+
+ACE_INLINE
+void
+POA_CORBA::FixedDef::destroy_skel (
+ TAO_ServerRequest & server_request,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL
+ )
+{
+ POA_CORBA::IRObject * const impl = static_cast<POA_CORBA::FixedDef *> (servant);
+ POA_CORBA::IRObject::destroy_skel (
+ server_request,
+ servant_upcall,
+ impl
+ ACE_ENV_ARG_PARAMETER
+ );
+}
+
+ACE_INLINE
+void
+POA_CORBA::FixedDef::_get_type_skel (
+ TAO_ServerRequest & server_request,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL
+ )
+{
+ POA_CORBA::IDLType * const impl = static_cast<POA_CORBA::FixedDef *> (servant);
+ POA_CORBA::IDLType::_get_type_skel (
+ server_request,
+ servant_upcall,
+ impl
+ ACE_ENV_ARG_PARAMETER
+ );
+}
+
+ACE_INLINE
+void
+POA_CORBA::ValueMemberDef::_get_def_kind_skel (
+ TAO_ServerRequest & server_request,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL
+ )
+{
+ POA_CORBA::IRObject * const impl = static_cast<POA_CORBA::ValueMemberDef *> (servant);
+ POA_CORBA::IRObject::_get_def_kind_skel (
+ server_request,
+ servant_upcall,
+ impl
+ ACE_ENV_ARG_PARAMETER
+ );
+}
+
+// TAO_IDL - Generated from
+// be\be_interface.cpp:1955
+
+ACE_INLINE
+void
+POA_CORBA::ValueMemberDef::destroy_skel (
+ TAO_ServerRequest & server_request,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL
+ )
+{
+ POA_CORBA::IRObject * const impl = static_cast<POA_CORBA::ValueMemberDef *> (servant);
+ POA_CORBA::IRObject::destroy_skel (
+ server_request,
+ servant_upcall,
+ impl
+ ACE_ENV_ARG_PARAMETER
+ );
+}
+
+ACE_INLINE
+void
+POA_CORBA::ValueMemberDef::_get_id_skel (
+ TAO_ServerRequest & server_request,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL
+ )
+{
+ POA_CORBA::Contained * const impl = static_cast<POA_CORBA::ValueMemberDef *> (servant);
+ POA_CORBA::Contained::_get_id_skel (
+ server_request,
+ servant_upcall,
+ impl
+ ACE_ENV_ARG_PARAMETER
+ );
+}
+
+ACE_INLINE
+void
+POA_CORBA::ValueMemberDef::_set_id_skel (
+ TAO_ServerRequest & server_request,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL
+ )
+{
+ POA_CORBA::Contained * const impl = static_cast<POA_CORBA::ValueMemberDef *> (servant);
+ POA_CORBA::Contained::_set_id_skel (
+ server_request,
+ servant_upcall,
+ impl
+ ACE_ENV_ARG_PARAMETER
+ );
+}
+
+ACE_INLINE
+void
+POA_CORBA::ValueMemberDef::_get_name_skel (
+ TAO_ServerRequest & server_request,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL
+ )
+{
+ POA_CORBA::Contained * const impl = static_cast<POA_CORBA::ValueMemberDef *> (servant);
+ POA_CORBA::Contained::_get_name_skel (
+ server_request,
+ servant_upcall,
+ impl
+ ACE_ENV_ARG_PARAMETER
+ );
+}
+
+ACE_INLINE
+void
+POA_CORBA::ValueMemberDef::_set_name_skel (
+ TAO_ServerRequest & server_request,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL
+ )
+{
+ POA_CORBA::Contained * const impl = static_cast<POA_CORBA::ValueMemberDef *> (servant);
+ POA_CORBA::Contained::_set_name_skel (
+ server_request,
+ servant_upcall,
+ impl
+ ACE_ENV_ARG_PARAMETER
+ );
+}
+
+ACE_INLINE
+void
+POA_CORBA::ValueMemberDef::_get_version_skel (
+ TAO_ServerRequest & server_request,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL
+ )
+{
+ POA_CORBA::Contained * const impl = static_cast<POA_CORBA::ValueMemberDef *> (servant);
+ POA_CORBA::Contained::_get_version_skel (
+ server_request,
+ servant_upcall,
+ impl
+ ACE_ENV_ARG_PARAMETER
+ );
+}
+
+ACE_INLINE
+void
+POA_CORBA::ValueMemberDef::_set_version_skel (
+ TAO_ServerRequest & server_request,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL
+ )
+{
+ POA_CORBA::Contained * const impl = static_cast<POA_CORBA::ValueMemberDef *> (servant);
+ POA_CORBA::Contained::_set_version_skel (
+ server_request,
+ servant_upcall,
+ impl
+ ACE_ENV_ARG_PARAMETER
+ );
+}
+
+ACE_INLINE
+void
+POA_CORBA::ValueMemberDef::_get_defined_in_skel (
+ TAO_ServerRequest & server_request,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL
+ )
+{
+ POA_CORBA::Contained * const impl = static_cast<POA_CORBA::ValueMemberDef *> (servant);
+ POA_CORBA::Contained::_get_defined_in_skel (
+ server_request,
+ servant_upcall,
+ impl
+ ACE_ENV_ARG_PARAMETER
+ );
+}
+
+ACE_INLINE
+void
+POA_CORBA::ValueMemberDef::_get_absolute_name_skel (
+ TAO_ServerRequest & server_request,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL
+ )
+{
+ POA_CORBA::Contained * const impl = static_cast<POA_CORBA::ValueMemberDef *> (servant);
+ POA_CORBA::Contained::_get_absolute_name_skel (
+ server_request,
+ servant_upcall,
+ impl
+ ACE_ENV_ARG_PARAMETER
+ );
+}
+
+ACE_INLINE
+void
+POA_CORBA::ValueMemberDef::_get_containing_repository_skel (
+ TAO_ServerRequest & server_request,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL
+ )
+{
+ POA_CORBA::Contained * const impl = static_cast<POA_CORBA::ValueMemberDef *> (servant);
+ POA_CORBA::Contained::_get_containing_repository_skel (
+ server_request,
+ servant_upcall,
+ impl
+ ACE_ENV_ARG_PARAMETER
+ );
+}
+
+// TAO_IDL - Generated from
+// be\be_interface.cpp:1955
+
+ACE_INLINE
+void
+POA_CORBA::ValueMemberDef::describe_skel (
+ TAO_ServerRequest & server_request,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL
+ )
+{
+ POA_CORBA::Contained * const impl = static_cast<POA_CORBA::ValueMemberDef *> (servant);
+ POA_CORBA::Contained::describe_skel (
+ server_request,
+ servant_upcall,
+ impl
+ ACE_ENV_ARG_PARAMETER
+ );
+}
+
+// TAO_IDL - Generated from
+// be\be_interface.cpp:1955
+
+ACE_INLINE
+void
+POA_CORBA::ValueMemberDef::move_skel (
+ TAO_ServerRequest & server_request,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL
+ )
+{
+ POA_CORBA::Contained * const impl = static_cast<POA_CORBA::ValueMemberDef *> (servant);
+ POA_CORBA::Contained::move_skel (
+ server_request,
+ servant_upcall,
+ impl
+ ACE_ENV_ARG_PARAMETER
+ );
+}
+
+ACE_INLINE
+void
+POA_CORBA::ValueDef::_get_def_kind_skel (
+ TAO_ServerRequest & server_request,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL
+ )
+{
+ POA_CORBA::IRObject * const impl = static_cast<POA_CORBA::ValueDef *> (servant);
+ POA_CORBA::IRObject::_get_def_kind_skel (
+ server_request,
+ servant_upcall,
+ impl
+ ACE_ENV_ARG_PARAMETER
+ );
+}
+
+// TAO_IDL - Generated from
+// be\be_interface.cpp:1955
+
+ACE_INLINE
+void
+POA_CORBA::ValueDef::destroy_skel (
+ TAO_ServerRequest & server_request,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL
+ )
+{
+ POA_CORBA::IRObject * const impl = static_cast<POA_CORBA::ValueDef *> (servant);
+ POA_CORBA::IRObject::destroy_skel (
+ server_request,
+ servant_upcall,
+ impl
+ ACE_ENV_ARG_PARAMETER
+ );
+}
+
+// TAO_IDL - Generated from
+// be\be_interface.cpp:1955
+
+ACE_INLINE
+void
+POA_CORBA::ValueDef::lookup_skel (
+ TAO_ServerRequest & server_request,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL
+ )
+{
+ POA_CORBA::Container * const impl = static_cast<POA_CORBA::ValueDef *> (servant);
+ POA_CORBA::Container::lookup_skel (
+ server_request,
+ servant_upcall,
+ impl
+ ACE_ENV_ARG_PARAMETER
+ );
+}
+
+// TAO_IDL - Generated from
+// be\be_interface.cpp:1955
+
+ACE_INLINE
+void
+POA_CORBA::ValueDef::contents_skel (
+ TAO_ServerRequest & server_request,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL
+ )
+{
+ POA_CORBA::Container * const impl = static_cast<POA_CORBA::ValueDef *> (servant);
+ POA_CORBA::Container::contents_skel (
+ server_request,
+ servant_upcall,
+ impl
+ ACE_ENV_ARG_PARAMETER
+ );
+}
+
+// TAO_IDL - Generated from
+// be\be_interface.cpp:1955
+
+ACE_INLINE
+void
+POA_CORBA::ValueDef::lookup_name_skel (
+ TAO_ServerRequest & server_request,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL
+ )
+{
+ POA_CORBA::Container * const impl = static_cast<POA_CORBA::ValueDef *> (servant);
+ POA_CORBA::Container::lookup_name_skel (
+ server_request,
+ servant_upcall,
+ impl
+ ACE_ENV_ARG_PARAMETER
+ );
+}
+
+// TAO_IDL - Generated from
+// be\be_interface.cpp:1955
+
+ACE_INLINE
+void
+POA_CORBA::ValueDef::describe_contents_skel (
+ TAO_ServerRequest & server_request,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL
+ )
+{
+ POA_CORBA::Container * const impl = static_cast<POA_CORBA::ValueDef *> (servant);
+ POA_CORBA::Container::describe_contents_skel (
+ server_request,
+ servant_upcall,
+ impl
+ ACE_ENV_ARG_PARAMETER
+ );
+}
+
+// TAO_IDL - Generated from
+// be\be_interface.cpp:1955
+
+ACE_INLINE
+void
+POA_CORBA::ValueDef::create_module_skel (
+ TAO_ServerRequest & server_request,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL
+ )
+{
+ POA_CORBA::Container * const impl = static_cast<POA_CORBA::ValueDef *> (servant);
+ POA_CORBA::Container::create_module_skel (
+ server_request,
+ servant_upcall,
+ impl
+ ACE_ENV_ARG_PARAMETER
+ );
+}
+
+// TAO_IDL - Generated from
+// be\be_interface.cpp:1955
+
+ACE_INLINE
+void
+POA_CORBA::ValueDef::create_constant_skel (
+ TAO_ServerRequest & server_request,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL
+ )
+{
+ POA_CORBA::Container * const impl = static_cast<POA_CORBA::ValueDef *> (servant);
+ POA_CORBA::Container::create_constant_skel (
+ server_request,
+ servant_upcall,
+ impl
+ ACE_ENV_ARG_PARAMETER
+ );
+}
+
+// TAO_IDL - Generated from
+// be\be_interface.cpp:1955
+
+ACE_INLINE
+void
+POA_CORBA::ValueDef::create_struct_skel (
+ TAO_ServerRequest & server_request,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL
+ )
+{
+ POA_CORBA::Container * const impl = static_cast<POA_CORBA::ValueDef *> (servant);
+ POA_CORBA::Container::create_struct_skel (
+ server_request,
+ servant_upcall,
+ impl
+ ACE_ENV_ARG_PARAMETER
+ );
+}
+
+// TAO_IDL - Generated from
+// be\be_interface.cpp:1955
+
+ACE_INLINE
+void
+POA_CORBA::ValueDef::create_union_skel (
+ TAO_ServerRequest & server_request,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL
+ )
+{
+ POA_CORBA::Container * const impl = static_cast<POA_CORBA::ValueDef *> (servant);
+ POA_CORBA::Container::create_union_skel (
+ server_request,
+ servant_upcall,
+ impl
+ ACE_ENV_ARG_PARAMETER
+ );
+}
+
+// TAO_IDL - Generated from
+// be\be_interface.cpp:1955
+
+ACE_INLINE
+void
+POA_CORBA::ValueDef::create_enum_skel (
+ TAO_ServerRequest & server_request,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL
+ )
+{
+ POA_CORBA::Container * const impl = static_cast<POA_CORBA::ValueDef *> (servant);
+ POA_CORBA::Container::create_enum_skel (
+ server_request,
+ servant_upcall,
+ impl
+ ACE_ENV_ARG_PARAMETER
+ );
+}
+
+// TAO_IDL - Generated from
+// be\be_interface.cpp:1955
+
+ACE_INLINE
+void
+POA_CORBA::ValueDef::create_alias_skel (
+ TAO_ServerRequest & server_request,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL
+ )
+{
+ POA_CORBA::Container * const impl = static_cast<POA_CORBA::ValueDef *> (servant);
+ POA_CORBA::Container::create_alias_skel (
+ server_request,
+ servant_upcall,
+ impl
+ ACE_ENV_ARG_PARAMETER
+ );
+}
+
+// TAO_IDL - Generated from
+// be\be_interface.cpp:1955
+
+ACE_INLINE
+void
+POA_CORBA::ValueDef::create_interface_skel (
+ TAO_ServerRequest & server_request,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL
+ )
+{
+ POA_CORBA::Container * const impl = static_cast<POA_CORBA::ValueDef *> (servant);
+ POA_CORBA::Container::create_interface_skel (
+ server_request,
+ servant_upcall,
+ impl
+ ACE_ENV_ARG_PARAMETER
+ );
+}
+
+// TAO_IDL - Generated from
+// be\be_interface.cpp:1955
+
+ACE_INLINE
+void
+POA_CORBA::ValueDef::create_value_skel (
+ TAO_ServerRequest & server_request,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL
+ )
+{
+ POA_CORBA::Container * const impl = static_cast<POA_CORBA::ValueDef *> (servant);
+ POA_CORBA::Container::create_value_skel (
+ server_request,
+ servant_upcall,
+ impl
+ ACE_ENV_ARG_PARAMETER
+ );
+}
+
+// TAO_IDL - Generated from
+// be\be_interface.cpp:1955
+
+ACE_INLINE
+void
+POA_CORBA::ValueDef::create_value_box_skel (
+ TAO_ServerRequest & server_request,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL
+ )
+{
+ POA_CORBA::Container * const impl = static_cast<POA_CORBA::ValueDef *> (servant);
+ POA_CORBA::Container::create_value_box_skel (
+ server_request,
+ servant_upcall,
+ impl
+ ACE_ENV_ARG_PARAMETER
+ );
+}
+
+// TAO_IDL - Generated from
+// be\be_interface.cpp:1955
+
+ACE_INLINE
+void
+POA_CORBA::ValueDef::create_exception_skel (
+ TAO_ServerRequest & server_request,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL
+ )
+{
+ POA_CORBA::Container * const impl = static_cast<POA_CORBA::ValueDef *> (servant);
+ POA_CORBA::Container::create_exception_skel (
+ server_request,
+ servant_upcall,
+ impl
+ ACE_ENV_ARG_PARAMETER
+ );
+}
+
+// TAO_IDL - Generated from
+// be\be_interface.cpp:1955
+
+ACE_INLINE
+void
+POA_CORBA::ValueDef::create_native_skel (
+ TAO_ServerRequest & server_request,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL
+ )
+{
+ POA_CORBA::Container * const impl = static_cast<POA_CORBA::ValueDef *> (servant);
+ POA_CORBA::Container::create_native_skel (
+ server_request,
+ servant_upcall,
+ impl
+ ACE_ENV_ARG_PARAMETER
+ );
+}
+
+// TAO_IDL - Generated from
+// be\be_interface.cpp:1955
+
+ACE_INLINE
+void
+POA_CORBA::ValueDef::create_abstract_interface_skel (
+ TAO_ServerRequest & server_request,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL
+ )
+{
+ POA_CORBA::Container * const impl = static_cast<POA_CORBA::ValueDef *> (servant);
+ POA_CORBA::Container::create_abstract_interface_skel (
+ server_request,
+ servant_upcall,
+ impl
+ ACE_ENV_ARG_PARAMETER
+ );
+}
+
+// TAO_IDL - Generated from
+// be\be_interface.cpp:1955
+
+ACE_INLINE
+void
+POA_CORBA::ValueDef::create_local_interface_skel (
+ TAO_ServerRequest & server_request,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL
+ )
+{
+ POA_CORBA::Container * const impl = static_cast<POA_CORBA::ValueDef *> (servant);
+ POA_CORBA::Container::create_local_interface_skel (
+ server_request,
+ servant_upcall,
+ impl
+ ACE_ENV_ARG_PARAMETER
+ );
+}
+
+// TAO_IDL - Generated from
+// be\be_interface.cpp:1955
+
+ACE_INLINE
+void
+POA_CORBA::ValueDef::create_ext_value_skel (
+ TAO_ServerRequest & server_request,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL
+ )
+{
+ POA_CORBA::Container * const impl = static_cast<POA_CORBA::ValueDef *> (servant);
+ POA_CORBA::Container::create_ext_value_skel (
+ server_request,
+ servant_upcall,
+ impl
+ ACE_ENV_ARG_PARAMETER
+ );
+}
+
+ACE_INLINE
+void
+POA_CORBA::ValueDef::_get_id_skel (
+ TAO_ServerRequest & server_request,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL
+ )
+{
+ POA_CORBA::Contained * const impl = static_cast<POA_CORBA::ValueDef *> (servant);
+ POA_CORBA::Contained::_get_id_skel (
+ server_request,
+ servant_upcall,
+ impl
+ ACE_ENV_ARG_PARAMETER
+ );
+}
+
+ACE_INLINE
+void
+POA_CORBA::ValueDef::_set_id_skel (
+ TAO_ServerRequest & server_request,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL
+ )
+{
+ POA_CORBA::Contained * const impl = static_cast<POA_CORBA::ValueDef *> (servant);
+ POA_CORBA::Contained::_set_id_skel (
+ server_request,
+ servant_upcall,
+ impl
+ ACE_ENV_ARG_PARAMETER
+ );
+}
+
+ACE_INLINE
+void
+POA_CORBA::ValueDef::_get_name_skel (
+ TAO_ServerRequest & server_request,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL
+ )
+{
+ POA_CORBA::Contained * const impl = static_cast<POA_CORBA::ValueDef *> (servant);
+ POA_CORBA::Contained::_get_name_skel (
+ server_request,
+ servant_upcall,
+ impl
+ ACE_ENV_ARG_PARAMETER
+ );
+}
+
+ACE_INLINE
+void
+POA_CORBA::ValueDef::_set_name_skel (
+ TAO_ServerRequest & server_request,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL
+ )
+{
+ POA_CORBA::Contained * const impl = static_cast<POA_CORBA::ValueDef *> (servant);
+ POA_CORBA::Contained::_set_name_skel (
+ server_request,
+ servant_upcall,
+ impl
+ ACE_ENV_ARG_PARAMETER
+ );
+}
+
+ACE_INLINE
+void
+POA_CORBA::ValueDef::_get_version_skel (
+ TAO_ServerRequest & server_request,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL
+ )
+{
+ POA_CORBA::Contained * const impl = static_cast<POA_CORBA::ValueDef *> (servant);
+ POA_CORBA::Contained::_get_version_skel (
+ server_request,
+ servant_upcall,
+ impl
+ ACE_ENV_ARG_PARAMETER
+ );
+}
+
+ACE_INLINE
+void
+POA_CORBA::ValueDef::_set_version_skel (
+ TAO_ServerRequest & server_request,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL
+ )
+{
+ POA_CORBA::Contained * const impl = static_cast<POA_CORBA::ValueDef *> (servant);
+ POA_CORBA::Contained::_set_version_skel (
+ server_request,
+ servant_upcall,
+ impl
+ ACE_ENV_ARG_PARAMETER
+ );
+}
+
+ACE_INLINE
+void
+POA_CORBA::ValueDef::_get_defined_in_skel (
+ TAO_ServerRequest & server_request,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL
+ )
+{
+ POA_CORBA::Contained * const impl = static_cast<POA_CORBA::ValueDef *> (servant);
+ POA_CORBA::Contained::_get_defined_in_skel (
+ server_request,
+ servant_upcall,
+ impl
+ ACE_ENV_ARG_PARAMETER
+ );
+}
+
+ACE_INLINE
+void
+POA_CORBA::ValueDef::_get_absolute_name_skel (
+ TAO_ServerRequest & server_request,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL
+ )
+{
+ POA_CORBA::Contained * const impl = static_cast<POA_CORBA::ValueDef *> (servant);
+ POA_CORBA::Contained::_get_absolute_name_skel (
+ server_request,
+ servant_upcall,
+ impl
+ ACE_ENV_ARG_PARAMETER
+ );
+}
+
+ACE_INLINE
+void
+POA_CORBA::ValueDef::_get_containing_repository_skel (
+ TAO_ServerRequest & server_request,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL
+ )
+{
+ POA_CORBA::Contained * const impl = static_cast<POA_CORBA::ValueDef *> (servant);
+ POA_CORBA::Contained::_get_containing_repository_skel (
+ server_request,
+ servant_upcall,
+ impl
+ ACE_ENV_ARG_PARAMETER
+ );
+}
+
+// TAO_IDL - Generated from
+// be\be_interface.cpp:1955
+
+ACE_INLINE
+void
+POA_CORBA::ValueDef::describe_skel (
+ TAO_ServerRequest & server_request,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL
+ )
+{
+ POA_CORBA::Contained * const impl = static_cast<POA_CORBA::ValueDef *> (servant);
+ POA_CORBA::Contained::describe_skel (
+ server_request,
+ servant_upcall,
+ impl
+ ACE_ENV_ARG_PARAMETER
+ );
+}
+
+// TAO_IDL - Generated from
+// be\be_interface.cpp:1955
+
+ACE_INLINE
+void
+POA_CORBA::ValueDef::move_skel (
+ TAO_ServerRequest & server_request,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL
+ )
+{
+ POA_CORBA::Contained * const impl = static_cast<POA_CORBA::ValueDef *> (servant);
+ POA_CORBA::Contained::move_skel (
+ server_request,
+ servant_upcall,
+ impl
+ ACE_ENV_ARG_PARAMETER
+ );
+}
+
+ACE_INLINE
+void
+POA_CORBA::ValueDef::_get_type_skel (
+ TAO_ServerRequest & server_request,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL
+ )
+{
+ POA_CORBA::IDLType * const impl = static_cast<POA_CORBA::ValueDef *> (servant);
+ POA_CORBA::IDLType::_get_type_skel (
+ server_request,
+ servant_upcall,
+ impl
+ ACE_ENV_ARG_PARAMETER
+ );
+}
+
+ACE_INLINE
+void
+POA_CORBA::ExtValueDef::_get_def_kind_skel (
+ TAO_ServerRequest & server_request,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL
+ )
+{
+ POA_CORBA::IRObject * const impl = static_cast<POA_CORBA::ExtValueDef *> (servant);
+ POA_CORBA::IRObject::_get_def_kind_skel (
+ server_request,
+ servant_upcall,
+ impl
+ ACE_ENV_ARG_PARAMETER
+ );
+}
+
+// TAO_IDL - Generated from
+// be\be_interface.cpp:1955
+
+ACE_INLINE
+void
+POA_CORBA::ExtValueDef::destroy_skel (
+ TAO_ServerRequest & server_request,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL
+ )
+{
+ POA_CORBA::IRObject * const impl = static_cast<POA_CORBA::ExtValueDef *> (servant);
+ POA_CORBA::IRObject::destroy_skel (
+ server_request,
+ servant_upcall,
+ impl
+ ACE_ENV_ARG_PARAMETER
+ );
+}
+
+// TAO_IDL - Generated from
+// be\be_interface.cpp:1955
+
+ACE_INLINE
+void
+POA_CORBA::ExtValueDef::lookup_skel (
+ TAO_ServerRequest & server_request,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL
+ )
+{
+ POA_CORBA::Container * const impl = static_cast<POA_CORBA::ExtValueDef *> (servant);
+ POA_CORBA::Container::lookup_skel (
+ server_request,
+ servant_upcall,
+ impl
+ ACE_ENV_ARG_PARAMETER
+ );
+}
+
+// TAO_IDL - Generated from
+// be\be_interface.cpp:1955
+
+ACE_INLINE
+void
+POA_CORBA::ExtValueDef::contents_skel (
+ TAO_ServerRequest & server_request,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL
+ )
+{
+ POA_CORBA::Container * const impl = static_cast<POA_CORBA::ExtValueDef *> (servant);
+ POA_CORBA::Container::contents_skel (
+ server_request,
+ servant_upcall,
+ impl
+ ACE_ENV_ARG_PARAMETER
+ );
+}
+
+// TAO_IDL - Generated from
+// be\be_interface.cpp:1955
+
+ACE_INLINE
+void
+POA_CORBA::ExtValueDef::lookup_name_skel (
+ TAO_ServerRequest & server_request,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL
+ )
+{
+ POA_CORBA::Container * const impl = static_cast<POA_CORBA::ExtValueDef *> (servant);
+ POA_CORBA::Container::lookup_name_skel (
+ server_request,
+ servant_upcall,
+ impl
+ ACE_ENV_ARG_PARAMETER
+ );
+}
+
+// TAO_IDL - Generated from
+// be\be_interface.cpp:1955
+
+ACE_INLINE
+void
+POA_CORBA::ExtValueDef::describe_contents_skel (
+ TAO_ServerRequest & server_request,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL
+ )
+{
+ POA_CORBA::Container * const impl = static_cast<POA_CORBA::ExtValueDef *> (servant);
+ POA_CORBA::Container::describe_contents_skel (
+ server_request,
+ servant_upcall,
+ impl
+ ACE_ENV_ARG_PARAMETER
+ );
+}
+
+// TAO_IDL - Generated from
+// be\be_interface.cpp:1955
+
+ACE_INLINE
+void
+POA_CORBA::ExtValueDef::create_module_skel (
+ TAO_ServerRequest & server_request,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL
+ )
+{
+ POA_CORBA::Container * const impl = static_cast<POA_CORBA::ExtValueDef *> (servant);
+ POA_CORBA::Container::create_module_skel (
+ server_request,
+ servant_upcall,
+ impl
+ ACE_ENV_ARG_PARAMETER
+ );
+}
+
+// TAO_IDL - Generated from
+// be\be_interface.cpp:1955
+
+ACE_INLINE
+void
+POA_CORBA::ExtValueDef::create_constant_skel (
+ TAO_ServerRequest & server_request,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL
+ )
+{
+ POA_CORBA::Container * const impl = static_cast<POA_CORBA::ExtValueDef *> (servant);
+ POA_CORBA::Container::create_constant_skel (
+ server_request,
+ servant_upcall,
+ impl
+ ACE_ENV_ARG_PARAMETER
+ );
+}
+
+// TAO_IDL - Generated from
+// be\be_interface.cpp:1955
+
+ACE_INLINE
+void
+POA_CORBA::ExtValueDef::create_struct_skel (
+ TAO_ServerRequest & server_request,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL
+ )
+{
+ POA_CORBA::Container * const impl = static_cast<POA_CORBA::ExtValueDef *> (servant);
+ POA_CORBA::Container::create_struct_skel (
+ server_request,
+ servant_upcall,
+ impl
+ ACE_ENV_ARG_PARAMETER
+ );
+}
+
+// TAO_IDL - Generated from
+// be\be_interface.cpp:1955
+
+ACE_INLINE
+void
+POA_CORBA::ExtValueDef::create_union_skel (
+ TAO_ServerRequest & server_request,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL
+ )
+{
+ POA_CORBA::Container * const impl = static_cast<POA_CORBA::ExtValueDef *> (servant);
+ POA_CORBA::Container::create_union_skel (
+ server_request,
+ servant_upcall,
+ impl
+ ACE_ENV_ARG_PARAMETER
+ );
+}
+
+// TAO_IDL - Generated from
+// be\be_interface.cpp:1955
+
+ACE_INLINE
+void
+POA_CORBA::ExtValueDef::create_enum_skel (
+ TAO_ServerRequest & server_request,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL
+ )
+{
+ POA_CORBA::Container * const impl = static_cast<POA_CORBA::ExtValueDef *> (servant);
+ POA_CORBA::Container::create_enum_skel (
+ server_request,
+ servant_upcall,
+ impl
+ ACE_ENV_ARG_PARAMETER
+ );
+}
+
+// TAO_IDL - Generated from
+// be\be_interface.cpp:1955
+
+ACE_INLINE
+void
+POA_CORBA::ExtValueDef::create_alias_skel (
+ TAO_ServerRequest & server_request,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL
+ )
+{
+ POA_CORBA::Container * const impl = static_cast<POA_CORBA::ExtValueDef *> (servant);
+ POA_CORBA::Container::create_alias_skel (
+ server_request,
+ servant_upcall,
+ impl
+ ACE_ENV_ARG_PARAMETER
+ );
+}
+
+// TAO_IDL - Generated from
+// be\be_interface.cpp:1955
+
+ACE_INLINE
+void
+POA_CORBA::ExtValueDef::create_interface_skel (
+ TAO_ServerRequest & server_request,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL
+ )
+{
+ POA_CORBA::Container * const impl = static_cast<POA_CORBA::ExtValueDef *> (servant);
+ POA_CORBA::Container::create_interface_skel (
+ server_request,
+ servant_upcall,
+ impl
+ ACE_ENV_ARG_PARAMETER
+ );
+}
+
+// TAO_IDL - Generated from
+// be\be_interface.cpp:1955
+
+ACE_INLINE
+void
+POA_CORBA::ExtValueDef::create_value_skel (
+ TAO_ServerRequest & server_request,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL
+ )
+{
+ POA_CORBA::Container * const impl = static_cast<POA_CORBA::ExtValueDef *> (servant);
+ POA_CORBA::Container::create_value_skel (
+ server_request,
+ servant_upcall,
+ impl
+ ACE_ENV_ARG_PARAMETER
+ );
+}
+
+// TAO_IDL - Generated from
+// be\be_interface.cpp:1955
+
+ACE_INLINE
+void
+POA_CORBA::ExtValueDef::create_value_box_skel (
+ TAO_ServerRequest & server_request,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL
+ )
+{
+ POA_CORBA::Container * const impl = static_cast<POA_CORBA::ExtValueDef *> (servant);
+ POA_CORBA::Container::create_value_box_skel (
+ server_request,
+ servant_upcall,
+ impl
+ ACE_ENV_ARG_PARAMETER
+ );
+}
+
+// TAO_IDL - Generated from
+// be\be_interface.cpp:1955
+
+ACE_INLINE
+void
+POA_CORBA::ExtValueDef::create_exception_skel (
+ TAO_ServerRequest & server_request,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL
+ )
+{
+ POA_CORBA::Container * const impl = static_cast<POA_CORBA::ExtValueDef *> (servant);
+ POA_CORBA::Container::create_exception_skel (
+ server_request,
+ servant_upcall,
+ impl
+ ACE_ENV_ARG_PARAMETER
+ );
+}
+
+// TAO_IDL - Generated from
+// be\be_interface.cpp:1955
+
+ACE_INLINE
+void
+POA_CORBA::ExtValueDef::create_native_skel (
+ TAO_ServerRequest & server_request,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL
+ )
+{
+ POA_CORBA::Container * const impl = static_cast<POA_CORBA::ExtValueDef *> (servant);
+ POA_CORBA::Container::create_native_skel (
+ server_request,
+ servant_upcall,
+ impl
+ ACE_ENV_ARG_PARAMETER
+ );
+}
+
+// TAO_IDL - Generated from
+// be\be_interface.cpp:1955
+
+ACE_INLINE
+void
+POA_CORBA::ExtValueDef::create_abstract_interface_skel (
+ TAO_ServerRequest & server_request,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL
+ )
+{
+ POA_CORBA::Container * const impl = static_cast<POA_CORBA::ExtValueDef *> (servant);
+ POA_CORBA::Container::create_abstract_interface_skel (
+ server_request,
+ servant_upcall,
+ impl
+ ACE_ENV_ARG_PARAMETER
+ );
+}
+
+// TAO_IDL - Generated from
+// be\be_interface.cpp:1955
+
+ACE_INLINE
+void
+POA_CORBA::ExtValueDef::create_local_interface_skel (
+ TAO_ServerRequest & server_request,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL
+ )
+{
+ POA_CORBA::Container * const impl = static_cast<POA_CORBA::ExtValueDef *> (servant);
+ POA_CORBA::Container::create_local_interface_skel (
+ server_request,
+ servant_upcall,
+ impl
+ ACE_ENV_ARG_PARAMETER
+ );
+}
+
+// TAO_IDL - Generated from
+// be\be_interface.cpp:1955
+
+ACE_INLINE
+void
+POA_CORBA::ExtValueDef::create_ext_value_skel (
+ TAO_ServerRequest & server_request,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL
+ )
+{
+ POA_CORBA::Container * const impl = static_cast<POA_CORBA::ExtValueDef *> (servant);
+ POA_CORBA::Container::create_ext_value_skel (
+ server_request,
+ servant_upcall,
+ impl
+ ACE_ENV_ARG_PARAMETER
+ );
+}
+
+ACE_INLINE
+void
+POA_CORBA::ExtValueDef::_get_id_skel (
+ TAO_ServerRequest & server_request,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL
+ )
+{
+ POA_CORBA::Contained * const impl = static_cast<POA_CORBA::ExtValueDef *> (servant);
+ POA_CORBA::Contained::_get_id_skel (
+ server_request,
+ servant_upcall,
+ impl
+ ACE_ENV_ARG_PARAMETER
+ );
+}
+
+ACE_INLINE
+void
+POA_CORBA::ExtValueDef::_set_id_skel (
+ TAO_ServerRequest & server_request,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL
+ )
+{
+ POA_CORBA::Contained * const impl = static_cast<POA_CORBA::ExtValueDef *> (servant);
+ POA_CORBA::Contained::_set_id_skel (
+ server_request,
+ servant_upcall,
+ impl
+ ACE_ENV_ARG_PARAMETER
+ );
+}
+
+ACE_INLINE
+void
+POA_CORBA::ExtValueDef::_get_name_skel (
+ TAO_ServerRequest & server_request,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL
+ )
+{
+ POA_CORBA::Contained * const impl = static_cast<POA_CORBA::ExtValueDef *> (servant);
+ POA_CORBA::Contained::_get_name_skel (
+ server_request,
+ servant_upcall,
+ impl
+ ACE_ENV_ARG_PARAMETER
+ );
+}
+
+ACE_INLINE
+void
+POA_CORBA::ExtValueDef::_set_name_skel (
+ TAO_ServerRequest & server_request,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL
+ )
+{
+ POA_CORBA::Contained * const impl = static_cast<POA_CORBA::ExtValueDef *> (servant);
+ POA_CORBA::Contained::_set_name_skel (
+ server_request,
+ servant_upcall,
+ impl
+ ACE_ENV_ARG_PARAMETER
+ );
+}
+
+ACE_INLINE
+void
+POA_CORBA::ExtValueDef::_get_version_skel (
+ TAO_ServerRequest & server_request,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL
+ )
+{
+ POA_CORBA::Contained * const impl = static_cast<POA_CORBA::ExtValueDef *> (servant);
+ POA_CORBA::Contained::_get_version_skel (
+ server_request,
+ servant_upcall,
+ impl
+ ACE_ENV_ARG_PARAMETER
+ );
+}
+
+ACE_INLINE
+void
+POA_CORBA::ExtValueDef::_set_version_skel (
+ TAO_ServerRequest & server_request,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL
+ )
+{
+ POA_CORBA::Contained * const impl = static_cast<POA_CORBA::ExtValueDef *> (servant);
+ POA_CORBA::Contained::_set_version_skel (
+ server_request,
+ servant_upcall,
+ impl
+ ACE_ENV_ARG_PARAMETER
+ );
+}
+
+ACE_INLINE
+void
+POA_CORBA::ExtValueDef::_get_defined_in_skel (
+ TAO_ServerRequest & server_request,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL
+ )
+{
+ POA_CORBA::Contained * const impl = static_cast<POA_CORBA::ExtValueDef *> (servant);
+ POA_CORBA::Contained::_get_defined_in_skel (
+ server_request,
+ servant_upcall,
+ impl
+ ACE_ENV_ARG_PARAMETER
+ );
+}
+
+ACE_INLINE
+void
+POA_CORBA::ExtValueDef::_get_absolute_name_skel (
+ TAO_ServerRequest & server_request,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL
+ )
+{
+ POA_CORBA::Contained * const impl = static_cast<POA_CORBA::ExtValueDef *> (servant);
+ POA_CORBA::Contained::_get_absolute_name_skel (
+ server_request,
+ servant_upcall,
+ impl
+ ACE_ENV_ARG_PARAMETER
+ );
+}
+
+ACE_INLINE
+void
+POA_CORBA::ExtValueDef::_get_containing_repository_skel (
+ TAO_ServerRequest & server_request,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL
+ )
+{
+ POA_CORBA::Contained * const impl = static_cast<POA_CORBA::ExtValueDef *> (servant);
+ POA_CORBA::Contained::_get_containing_repository_skel (
+ server_request,
+ servant_upcall,
+ impl
+ ACE_ENV_ARG_PARAMETER
+ );
+}
+
+// TAO_IDL - Generated from
+// be\be_interface.cpp:1955
+
+ACE_INLINE
+void
+POA_CORBA::ExtValueDef::describe_skel (
+ TAO_ServerRequest & server_request,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL
+ )
+{
+ POA_CORBA::Contained * const impl = static_cast<POA_CORBA::ExtValueDef *> (servant);
+ POA_CORBA::Contained::describe_skel (
+ server_request,
+ servant_upcall,
+ impl
+ ACE_ENV_ARG_PARAMETER
+ );
+}
+
+// TAO_IDL - Generated from
+// be\be_interface.cpp:1955
+
+ACE_INLINE
+void
+POA_CORBA::ExtValueDef::move_skel (
+ TAO_ServerRequest & server_request,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL
+ )
+{
+ POA_CORBA::Contained * const impl = static_cast<POA_CORBA::ExtValueDef *> (servant);
+ POA_CORBA::Contained::move_skel (
+ server_request,
+ servant_upcall,
+ impl
+ ACE_ENV_ARG_PARAMETER
+ );
+}
+
+ACE_INLINE
+void
+POA_CORBA::ExtValueDef::_get_type_skel (
+ TAO_ServerRequest & server_request,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL
+ )
+{
+ POA_CORBA::IDLType * const impl = static_cast<POA_CORBA::ExtValueDef *> (servant);
+ POA_CORBA::IDLType::_get_type_skel (
+ server_request,
+ servant_upcall,
+ impl
+ ACE_ENV_ARG_PARAMETER
+ );
+}
+
+ACE_INLINE
+void
+POA_CORBA::ExtValueDef::_get_supported_interfaces_skel (
+ TAO_ServerRequest & server_request,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL
+ )
+{
+ POA_CORBA::ValueDef * const impl = static_cast<POA_CORBA::ExtValueDef *> (servant);
+ POA_CORBA::ValueDef::_get_supported_interfaces_skel (
+ server_request,
+ servant_upcall,
+ impl
+ ACE_ENV_ARG_PARAMETER
+ );
+}
+
+ACE_INLINE
+void
+POA_CORBA::ExtValueDef::_set_supported_interfaces_skel (
+ TAO_ServerRequest & server_request,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL
+ )
+{
+ POA_CORBA::ValueDef * const impl = static_cast<POA_CORBA::ExtValueDef *> (servant);
+ POA_CORBA::ValueDef::_set_supported_interfaces_skel (
+ server_request,
+ servant_upcall,
+ impl
+ ACE_ENV_ARG_PARAMETER
+ );
+}
+
+ACE_INLINE
+void
+POA_CORBA::ExtValueDef::_get_initializers_skel (
+ TAO_ServerRequest & server_request,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL
+ )
+{
+ POA_CORBA::ValueDef * const impl = static_cast<POA_CORBA::ExtValueDef *> (servant);
+ POA_CORBA::ValueDef::_get_initializers_skel (
+ server_request,
+ servant_upcall,
+ impl
+ ACE_ENV_ARG_PARAMETER
+ );
+}
+
+ACE_INLINE
+void
+POA_CORBA::ExtValueDef::_set_initializers_skel (
+ TAO_ServerRequest & server_request,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL
+ )
+{
+ POA_CORBA::ValueDef * const impl = static_cast<POA_CORBA::ExtValueDef *> (servant);
+ POA_CORBA::ValueDef::_set_initializers_skel (
+ server_request,
+ servant_upcall,
+ impl
+ ACE_ENV_ARG_PARAMETER
+ );
+}
+
+ACE_INLINE
+void
+POA_CORBA::ExtValueDef::_get_base_value_skel (
+ TAO_ServerRequest & server_request,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL
+ )
+{
+ POA_CORBA::ValueDef * const impl = static_cast<POA_CORBA::ExtValueDef *> (servant);
+ POA_CORBA::ValueDef::_get_base_value_skel (
+ server_request,
+ servant_upcall,
+ impl
+ ACE_ENV_ARG_PARAMETER
+ );
+}
+
+ACE_INLINE
+void
+POA_CORBA::ExtValueDef::_set_base_value_skel (
+ TAO_ServerRequest & server_request,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL
+ )
+{
+ POA_CORBA::ValueDef * const impl = static_cast<POA_CORBA::ExtValueDef *> (servant);
+ POA_CORBA::ValueDef::_set_base_value_skel (
+ server_request,
+ servant_upcall,
+ impl
+ ACE_ENV_ARG_PARAMETER
+ );
+}
+
+ACE_INLINE
+void
+POA_CORBA::ExtValueDef::_get_abstract_base_values_skel (
+ TAO_ServerRequest & server_request,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL
+ )
+{
+ POA_CORBA::ValueDef * const impl = static_cast<POA_CORBA::ExtValueDef *> (servant);
+ POA_CORBA::ValueDef::_get_abstract_base_values_skel (
+ server_request,
+ servant_upcall,
+ impl
+ ACE_ENV_ARG_PARAMETER
+ );
+}
+
+ACE_INLINE
+void
+POA_CORBA::ExtValueDef::_set_abstract_base_values_skel (
+ TAO_ServerRequest & server_request,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL
+ )
+{
+ POA_CORBA::ValueDef * const impl = static_cast<POA_CORBA::ExtValueDef *> (servant);
+ POA_CORBA::ValueDef::_set_abstract_base_values_skel (
+ server_request,
+ servant_upcall,
+ impl
+ ACE_ENV_ARG_PARAMETER
+ );
+}
+
+ACE_INLINE
+void
+POA_CORBA::ExtValueDef::_get_is_abstract_skel (
+ TAO_ServerRequest & server_request,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL
+ )
+{
+ POA_CORBA::ValueDef * const impl = static_cast<POA_CORBA::ExtValueDef *> (servant);
+ POA_CORBA::ValueDef::_get_is_abstract_skel (
+ server_request,
+ servant_upcall,
+ impl
+ ACE_ENV_ARG_PARAMETER
+ );
+}
+
+ACE_INLINE
+void
+POA_CORBA::ExtValueDef::_set_is_abstract_skel (
+ TAO_ServerRequest & server_request,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL
+ )
+{
+ POA_CORBA::ValueDef * const impl = static_cast<POA_CORBA::ExtValueDef *> (servant);
+ POA_CORBA::ValueDef::_set_is_abstract_skel (
+ server_request,
+ servant_upcall,
+ impl
+ ACE_ENV_ARG_PARAMETER
+ );
+}
+
+ACE_INLINE
+void
+POA_CORBA::ExtValueDef::_get_is_custom_skel (
+ TAO_ServerRequest & server_request,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL
+ )
+{
+ POA_CORBA::ValueDef * const impl = static_cast<POA_CORBA::ExtValueDef *> (servant);
+ POA_CORBA::ValueDef::_get_is_custom_skel (
+ server_request,
+ servant_upcall,
+ impl
+ ACE_ENV_ARG_PARAMETER
+ );
+}
+
+ACE_INLINE
+void
+POA_CORBA::ExtValueDef::_set_is_custom_skel (
+ TAO_ServerRequest & server_request,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL
+ )
+{
+ POA_CORBA::ValueDef * const impl = static_cast<POA_CORBA::ExtValueDef *> (servant);
+ POA_CORBA::ValueDef::_set_is_custom_skel (
+ server_request,
+ servant_upcall,
+ impl
+ ACE_ENV_ARG_PARAMETER
+ );
+}
+
+ACE_INLINE
+void
+POA_CORBA::ExtValueDef::_get_is_truncatable_skel (
+ TAO_ServerRequest & server_request,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL
+ )
+{
+ POA_CORBA::ValueDef * const impl = static_cast<POA_CORBA::ExtValueDef *> (servant);
+ POA_CORBA::ValueDef::_get_is_truncatable_skel (
+ server_request,
+ servant_upcall,
+ impl
+ ACE_ENV_ARG_PARAMETER
+ );
+}
+
+ACE_INLINE
+void
+POA_CORBA::ExtValueDef::_set_is_truncatable_skel (
+ TAO_ServerRequest & server_request,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL
+ )
+{
+ POA_CORBA::ValueDef * const impl = static_cast<POA_CORBA::ExtValueDef *> (servant);
+ POA_CORBA::ValueDef::_set_is_truncatable_skel (
+ server_request,
+ servant_upcall,
+ impl
+ ACE_ENV_ARG_PARAMETER
+ );
+}
+
+// TAO_IDL - Generated from
+// be\be_interface.cpp:1955
+
+ACE_INLINE
+void
+POA_CORBA::ExtValueDef::is_a_skel (
+ TAO_ServerRequest & server_request,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL
+ )
+{
+ POA_CORBA::ValueDef * const impl = static_cast<POA_CORBA::ExtValueDef *> (servant);
+ POA_CORBA::ValueDef::is_a_skel (
+ server_request,
+ servant_upcall,
+ impl
+ ACE_ENV_ARG_PARAMETER
+ );
+}
+
+// TAO_IDL - Generated from
+// be\be_interface.cpp:1955
+
+ACE_INLINE
+void
+POA_CORBA::ExtValueDef::describe_value_skel (
+ TAO_ServerRequest & server_request,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL
+ )
+{
+ POA_CORBA::ValueDef * const impl = static_cast<POA_CORBA::ExtValueDef *> (servant);
+ POA_CORBA::ValueDef::describe_value_skel (
+ server_request,
+ servant_upcall,
+ impl
+ ACE_ENV_ARG_PARAMETER
+ );
+}
+
+// TAO_IDL - Generated from
+// be\be_interface.cpp:1955
+
+ACE_INLINE
+void
+POA_CORBA::ExtValueDef::create_value_member_skel (
+ TAO_ServerRequest & server_request,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL
+ )
+{
+ POA_CORBA::ValueDef * const impl = static_cast<POA_CORBA::ExtValueDef *> (servant);
+ POA_CORBA::ValueDef::create_value_member_skel (
+ server_request,
+ servant_upcall,
+ impl
+ ACE_ENV_ARG_PARAMETER
+ );
+}
+
+// TAO_IDL - Generated from
+// be\be_interface.cpp:1955
+
+ACE_INLINE
+void
+POA_CORBA::ExtValueDef::create_attribute_skel (
+ TAO_ServerRequest & server_request,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL
+ )
+{
+ POA_CORBA::ValueDef * const impl = static_cast<POA_CORBA::ExtValueDef *> (servant);
+ POA_CORBA::ValueDef::create_attribute_skel (
+ server_request,
+ servant_upcall,
+ impl
+ ACE_ENV_ARG_PARAMETER
+ );
+}
+
+// TAO_IDL - Generated from
+// be\be_interface.cpp:1955
+
+ACE_INLINE
+void
+POA_CORBA::ExtValueDef::create_operation_skel (
+ TAO_ServerRequest & server_request,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL
+ )
+{
+ POA_CORBA::ValueDef * const impl = static_cast<POA_CORBA::ExtValueDef *> (servant);
+ POA_CORBA::ValueDef::create_operation_skel (
+ server_request,
+ servant_upcall,
+ impl
+ ACE_ENV_ARG_PARAMETER
+ );
+}
+
+ACE_INLINE
+void
+POA_CORBA::ValueBoxDef::_get_def_kind_skel (
+ TAO_ServerRequest & server_request,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL
+ )
+{
+ POA_CORBA::IRObject * const impl = static_cast<POA_CORBA::ValueBoxDef *> (servant);
+ POA_CORBA::IRObject::_get_def_kind_skel (
+ server_request,
+ servant_upcall,
+ impl
+ ACE_ENV_ARG_PARAMETER
+ );
+}
+
+// TAO_IDL - Generated from
+// be\be_interface.cpp:1955
+
+ACE_INLINE
+void
+POA_CORBA::ValueBoxDef::destroy_skel (
+ TAO_ServerRequest & server_request,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL
+ )
+{
+ POA_CORBA::IRObject * const impl = static_cast<POA_CORBA::ValueBoxDef *> (servant);
+ POA_CORBA::IRObject::destroy_skel (
+ server_request,
+ servant_upcall,
+ impl
+ ACE_ENV_ARG_PARAMETER
+ );
+}
+
+ACE_INLINE
+void
+POA_CORBA::ValueBoxDef::_get_id_skel (
+ TAO_ServerRequest & server_request,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL
+ )
+{
+ POA_CORBA::Contained * const impl = static_cast<POA_CORBA::ValueBoxDef *> (servant);
+ POA_CORBA::Contained::_get_id_skel (
+ server_request,
+ servant_upcall,
+ impl
+ ACE_ENV_ARG_PARAMETER
+ );
+}
+
+ACE_INLINE
+void
+POA_CORBA::ValueBoxDef::_set_id_skel (
+ TAO_ServerRequest & server_request,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL
+ )
+{
+ POA_CORBA::Contained * const impl = static_cast<POA_CORBA::ValueBoxDef *> (servant);
+ POA_CORBA::Contained::_set_id_skel (
+ server_request,
+ servant_upcall,
+ impl
+ ACE_ENV_ARG_PARAMETER
+ );
+}
+
+ACE_INLINE
+void
+POA_CORBA::ValueBoxDef::_get_name_skel (
+ TAO_ServerRequest & server_request,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL
+ )
+{
+ POA_CORBA::Contained * const impl = static_cast<POA_CORBA::ValueBoxDef *> (servant);
+ POA_CORBA::Contained::_get_name_skel (
+ server_request,
+ servant_upcall,
+ impl
+ ACE_ENV_ARG_PARAMETER
+ );
+}
+
+ACE_INLINE
+void
+POA_CORBA::ValueBoxDef::_set_name_skel (
+ TAO_ServerRequest & server_request,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL
+ )
+{
+ POA_CORBA::Contained * const impl = static_cast<POA_CORBA::ValueBoxDef *> (servant);
+ POA_CORBA::Contained::_set_name_skel (
+ server_request,
+ servant_upcall,
+ impl
+ ACE_ENV_ARG_PARAMETER
+ );
+}
+
+ACE_INLINE
+void
+POA_CORBA::ValueBoxDef::_get_version_skel (
+ TAO_ServerRequest & server_request,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL
+ )
+{
+ POA_CORBA::Contained * const impl = static_cast<POA_CORBA::ValueBoxDef *> (servant);
+ POA_CORBA::Contained::_get_version_skel (
+ server_request,
+ servant_upcall,
+ impl
+ ACE_ENV_ARG_PARAMETER
+ );
+}
+
+ACE_INLINE
+void
+POA_CORBA::ValueBoxDef::_set_version_skel (
+ TAO_ServerRequest & server_request,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL
+ )
+{
+ POA_CORBA::Contained * const impl = static_cast<POA_CORBA::ValueBoxDef *> (servant);
+ POA_CORBA::Contained::_set_version_skel (
+ server_request,
+ servant_upcall,
+ impl
+ ACE_ENV_ARG_PARAMETER
+ );
+}
+
+ACE_INLINE
+void
+POA_CORBA::ValueBoxDef::_get_defined_in_skel (
+ TAO_ServerRequest & server_request,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL
+ )
+{
+ POA_CORBA::Contained * const impl = static_cast<POA_CORBA::ValueBoxDef *> (servant);
+ POA_CORBA::Contained::_get_defined_in_skel (
+ server_request,
+ servant_upcall,
+ impl
+ ACE_ENV_ARG_PARAMETER
+ );
+}
+
+ACE_INLINE
+void
+POA_CORBA::ValueBoxDef::_get_absolute_name_skel (
+ TAO_ServerRequest & server_request,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL
+ )
+{
+ POA_CORBA::Contained * const impl = static_cast<POA_CORBA::ValueBoxDef *> (servant);
+ POA_CORBA::Contained::_get_absolute_name_skel (
+ server_request,
+ servant_upcall,
+ impl
+ ACE_ENV_ARG_PARAMETER
+ );
+}
+
+ACE_INLINE
+void
+POA_CORBA::ValueBoxDef::_get_containing_repository_skel (
+ TAO_ServerRequest & server_request,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL
+ )
+{
+ POA_CORBA::Contained * const impl = static_cast<POA_CORBA::ValueBoxDef *> (servant);
+ POA_CORBA::Contained::_get_containing_repository_skel (
+ server_request,
+ servant_upcall,
+ impl
+ ACE_ENV_ARG_PARAMETER
+ );
+}
+
+// TAO_IDL - Generated from
+// be\be_interface.cpp:1955
+
+ACE_INLINE
+void
+POA_CORBA::ValueBoxDef::describe_skel (
+ TAO_ServerRequest & server_request,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL
+ )
+{
+ POA_CORBA::Contained * const impl = static_cast<POA_CORBA::ValueBoxDef *> (servant);
+ POA_CORBA::Contained::describe_skel (
+ server_request,
+ servant_upcall,
+ impl
+ ACE_ENV_ARG_PARAMETER
+ );
+}
+
+// TAO_IDL - Generated from
+// be\be_interface.cpp:1955
+
+ACE_INLINE
+void
+POA_CORBA::ValueBoxDef::move_skel (
+ TAO_ServerRequest & server_request,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL
+ )
+{
+ POA_CORBA::Contained * const impl = static_cast<POA_CORBA::ValueBoxDef *> (servant);
+ POA_CORBA::Contained::move_skel (
+ server_request,
+ servant_upcall,
+ impl
+ ACE_ENV_ARG_PARAMETER
+ );
+}
+
+ACE_INLINE
+void
+POA_CORBA::ValueBoxDef::_get_type_skel (
+ TAO_ServerRequest & server_request,
+ void * servant_upcall,
+ void * servant
+ ACE_ENV_ARG_DECL
+ )
+{
+ POA_CORBA::IDLType * const impl = static_cast<POA_CORBA::ValueBoxDef *> (servant);
+ POA_CORBA::IDLType::_get_type_skel (
+ server_request,
+ servant_upcall,
+ impl
+ ACE_ENV_ARG_PARAMETER
+ );
+}
+
+
+TAO_END_VERSIONED_NAMESPACE_DECL
+
+
diff --git a/TAO/orbsvcs/orbsvcs/IFRService/IFR_ExtendedS_T.cpp b/TAO/orbsvcs/orbsvcs/IFRService/IFR_ExtendedS_T.cpp
new file mode 100644
index 00000000000..9bd6f99cb35
--- /dev/null
+++ b/TAO/orbsvcs/orbsvcs/IFRService/IFR_ExtendedS_T.cpp
@@ -0,0 +1,49 @@
+// -*- C++ -*-
+//
+// $Id$
+
+// **** Code generated by the The ACE ORB (TAO) IDL Compiler ****
+// TAO and the TAO IDL Compiler have been developed by:
+// Center for Distributed Object Computing
+// Washington University
+// St. Louis, MO
+// USA
+// http://www.cs.wustl.edu/~schmidt/doc-center.html
+// and
+// Distributed Object Computing Laboratory
+// University of California at Irvine
+// Irvine, CA
+// USA
+// http://doc.ece.uci.edu/
+// and
+// Institute for Software Integrated Systems
+// Vanderbilt University
+// Nashville, TN
+// USA
+// http://www.isis.vanderbilt.edu/
+//
+// Information about TAO is available at:
+// http://www.cs.wustl.edu/~schmidt/TAO.html
+
+// TAO_IDL - Generated from
+// be\be_codegen.cpp:683
+
+#ifndef _TAO_IDL____ORBSVCS_ORBSVCS_IFRSERVICE_IFR_EXTENDEDS_T_CPP_
+#define _TAO_IDL____ORBSVCS_ORBSVCS_IFRSERVICE_IFR_EXTENDEDS_T_CPP_
+
+#include "IFR_ExtendedS_T.h"
+
+#if !defined (__ACE_INLINE__)
+#include "IFR_ExtendedS_T.inl"
+#endif /* !defined INLINE */
+
+
+
+TAO_BEGIN_VERSIONED_NAMESPACE_DECL
+
+
+
+TAO_END_VERSIONED_NAMESPACE_DECL
+
+
+#endif /* ifndef */
diff --git a/TAO/orbsvcs/orbsvcs/IFRService/IFR_ExtendedS_T.h b/TAO/orbsvcs/orbsvcs/IFRService/IFR_ExtendedS_T.h
new file mode 100644
index 00000000000..a66c2726183
--- /dev/null
+++ b/TAO/orbsvcs/orbsvcs/IFRService/IFR_ExtendedS_T.h
@@ -0,0 +1,2032 @@
+// -*- C++ -*-
+//
+// $Id$
+
+// **** Code generated by the The ACE ORB (TAO) IDL Compiler ****
+// TAO and the TAO IDL Compiler have been developed by:
+// Center for Distributed Object Computing
+// Washington University
+// St. Louis, MO
+// USA
+// http://www.cs.wustl.edu/~schmidt/doc-center.html
+// and
+// Distributed Object Computing Laboratory
+// University of California at Irvine
+// Irvine, CA
+// USA
+// http://doc.ece.uci.edu/
+// and
+// Institute for Software Integrated Systems
+// Vanderbilt University
+// Nashville, TN
+// USA
+// http://www.isis.vanderbilt.edu/
+//
+// Information about TAO is available at:
+// http://www.cs.wustl.edu/~schmidt/TAO.html
+
+// TAO_IDL - Generated from
+// be\be_codegen.cpp:545
+
+#ifndef _TAO_IDL____ORBSVCS_ORBSVCS_IFRSERVICE_IFR_EXTENDEDS_T_H_
+#define _TAO_IDL____ORBSVCS_ORBSVCS_IFRSERVICE_IFR_EXTENDEDS_T_H_
+
+#include /**/ "ace/pre.h"
+
+TAO_BEGIN_VERSIONED_NAMESPACE_DECL
+
+
+
+// TAO_IDL - Generated from
+// be\be_visitor_root/root_sth.cpp:116
+
+namespace POA_CORBA
+{
+
+ // TAO_IDL - Generated from
+ // be\be_visitor_interface/tie_sh.cpp:87
+
+ // TIE class: Refer to CORBA v2.2, Section 20.34.4
+ template <class T>
+ class FixedDef_tie : public FixedDef
+ {
+ public:
+ /// the T& ctor
+ FixedDef_tie (T &t);
+ /// ctor taking a POA
+ FixedDef_tie (T &t, PortableServer::POA_ptr poa);
+ /// ctor taking pointer and an ownership flag
+ FixedDef_tie (T *tp, ::CORBA::Boolean release = true);
+ /// ctor with T*, ownership flag and a POA
+ FixedDef_tie (
+ T *tp,
+ PortableServer::POA_ptr poa,
+ ::CORBA::Boolean release = true
+ );
+ /// dtor
+
+ ~FixedDef_tie (void);
+ // TIE specific functions
+ /// return the underlying object
+ T *_tied_object (void);
+ /// set the underlying object
+ void _tied_object (T &obj);
+ /// set the underlying object and the ownership flag
+ void _tied_object (T *obj, ::CORBA::Boolean release = true);
+ /// do we own it
+ ::CORBA::Boolean _is_owner (void);
+ /// set the ownership
+
+ void _is_owner ( ::CORBA::Boolean b);
+ // overridden ServantBase operations
+ PortableServer::POA_ptr _default_POA (
+ ACE_ENV_SINGLE_ARG_DECL_WITH_DEFAULTS
+ );
+
+ // TAO_IDL - Generated from
+ // be\be_visitor_operation/tie_sh.cpp:60
+
+ ::CORBA::DefinitionKind def_kind (
+ ACE_ENV_SINGLE_ARG_DECL_WITH_DEFAULTS
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ));
+
+ // TAO_IDL - Generated from
+ // be\be_visitor_operation/tie_sh.cpp:60
+
+ void destroy (
+ ACE_ENV_SINGLE_ARG_DECL_WITH_DEFAULTS
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ));
+
+ // TAO_IDL - Generated from
+ // be\be_visitor_operation/tie_sh.cpp:60
+
+ ::CORBA::TypeCode_ptr type (
+ ACE_ENV_SINGLE_ARG_DECL_WITH_DEFAULTS
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ));
+
+ // TAO_IDL - Generated from
+ // be\be_visitor_operation/tie_sh.cpp:60
+
+ ::CORBA::UShort digits (
+ ACE_ENV_SINGLE_ARG_DECL_WITH_DEFAULTS
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ));
+
+ // TAO_IDL - Generated from
+ // be\be_visitor_operation/tie_sh.cpp:60
+
+ void digits (
+ ::CORBA::UShort digits
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ));
+
+ // TAO_IDL - Generated from
+ // be\be_visitor_operation/tie_sh.cpp:60
+
+ ::CORBA::Short scale (
+ ACE_ENV_SINGLE_ARG_DECL_WITH_DEFAULTS
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ));
+
+ // TAO_IDL - Generated from
+ // be\be_visitor_operation/tie_sh.cpp:60
+
+ void scale (
+ ::CORBA::Short scale
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ));
+
+ private:
+ T *ptr_;
+ PortableServer::POA_var poa_;
+ ::CORBA::Boolean rel_;
+
+ // copy and assignment are not allowed
+ FixedDef_tie (const FixedDef_tie &);
+ void operator= (const FixedDef_tie &);
+ };
+
+ // TAO_IDL - Generated from
+ // be\be_visitor_interface/tie_sh.cpp:87
+
+ // TIE class: Refer to CORBA v2.2, Section 20.34.4
+ template <class T>
+ class ValueMemberDef_tie : public ValueMemberDef
+ {
+ public:
+ /// the T& ctor
+ ValueMemberDef_tie (T &t);
+ /// ctor taking a POA
+ ValueMemberDef_tie (T &t, PortableServer::POA_ptr poa);
+ /// ctor taking pointer and an ownership flag
+ ValueMemberDef_tie (T *tp, ::CORBA::Boolean release = true);
+ /// ctor with T*, ownership flag and a POA
+ ValueMemberDef_tie (
+ T *tp,
+ PortableServer::POA_ptr poa,
+ ::CORBA::Boolean release = true
+ );
+ /// dtor
+
+ ~ValueMemberDef_tie (void);
+ // TIE specific functions
+ /// return the underlying object
+ T *_tied_object (void);
+ /// set the underlying object
+ void _tied_object (T &obj);
+ /// set the underlying object and the ownership flag
+ void _tied_object (T *obj, ::CORBA::Boolean release = true);
+ /// do we own it
+ ::CORBA::Boolean _is_owner (void);
+ /// set the ownership
+
+ void _is_owner ( ::CORBA::Boolean b);
+ // overridden ServantBase operations
+ PortableServer::POA_ptr _default_POA (
+ ACE_ENV_SINGLE_ARG_DECL_WITH_DEFAULTS
+ );
+
+ // TAO_IDL - Generated from
+ // be\be_visitor_operation/tie_sh.cpp:60
+
+ ::CORBA::DefinitionKind def_kind (
+ ACE_ENV_SINGLE_ARG_DECL_WITH_DEFAULTS
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ));
+
+ // TAO_IDL - Generated from
+ // be\be_visitor_operation/tie_sh.cpp:60
+
+ void destroy (
+ ACE_ENV_SINGLE_ARG_DECL_WITH_DEFAULTS
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ));
+
+ // TAO_IDL - Generated from
+ // be\be_visitor_operation/tie_sh.cpp:60
+
+ char * id (
+ ACE_ENV_SINGLE_ARG_DECL_WITH_DEFAULTS
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ));
+
+ // TAO_IDL - Generated from
+ // be\be_visitor_operation/tie_sh.cpp:60
+
+ void id (
+ const char * id
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ));
+
+ // TAO_IDL - Generated from
+ // be\be_visitor_operation/tie_sh.cpp:60
+
+ char * name (
+ ACE_ENV_SINGLE_ARG_DECL_WITH_DEFAULTS
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ));
+
+ // TAO_IDL - Generated from
+ // be\be_visitor_operation/tie_sh.cpp:60
+
+ void name (
+ const char * name
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ));
+
+ // TAO_IDL - Generated from
+ // be\be_visitor_operation/tie_sh.cpp:60
+
+ char * version (
+ ACE_ENV_SINGLE_ARG_DECL_WITH_DEFAULTS
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ));
+
+ // TAO_IDL - Generated from
+ // be\be_visitor_operation/tie_sh.cpp:60
+
+ void version (
+ const char * version
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ));
+
+ // TAO_IDL - Generated from
+ // be\be_visitor_operation/tie_sh.cpp:60
+
+ ::CORBA::Container_ptr defined_in (
+ ACE_ENV_SINGLE_ARG_DECL_WITH_DEFAULTS
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ));
+
+ // TAO_IDL - Generated from
+ // be\be_visitor_operation/tie_sh.cpp:60
+
+ char * absolute_name (
+ ACE_ENV_SINGLE_ARG_DECL_WITH_DEFAULTS
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ));
+
+ // TAO_IDL - Generated from
+ // be\be_visitor_operation/tie_sh.cpp:60
+
+ ::CORBA::Repository_ptr containing_repository (
+ ACE_ENV_SINGLE_ARG_DECL_WITH_DEFAULTS
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ));
+
+ // TAO_IDL - Generated from
+ // be\be_visitor_operation/tie_sh.cpp:60
+
+ ::CORBA::Contained::Description * describe (
+ ACE_ENV_SINGLE_ARG_DECL_WITH_DEFAULTS
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ));
+
+ // TAO_IDL - Generated from
+ // be\be_visitor_operation/tie_sh.cpp:60
+
+ void move (
+ ::CORBA::Container_ptr new_container,
+ const char * new_name,
+ const char * new_version
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ));
+
+ // TAO_IDL - Generated from
+ // be\be_visitor_operation/tie_sh.cpp:60
+
+ ::CORBA::TypeCode_ptr type (
+ ACE_ENV_SINGLE_ARG_DECL_WITH_DEFAULTS
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ));
+
+ // TAO_IDL - Generated from
+ // be\be_visitor_operation/tie_sh.cpp:60
+
+ ::CORBA::IDLType_ptr type_def (
+ ACE_ENV_SINGLE_ARG_DECL_WITH_DEFAULTS
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ));
+
+ // TAO_IDL - Generated from
+ // be\be_visitor_operation/tie_sh.cpp:60
+
+ void type_def (
+ ::CORBA::IDLType_ptr type_def
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ));
+
+ // TAO_IDL - Generated from
+ // be\be_visitor_operation/tie_sh.cpp:60
+
+ ::CORBA::Visibility access (
+ ACE_ENV_SINGLE_ARG_DECL_WITH_DEFAULTS
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ));
+
+ // TAO_IDL - Generated from
+ // be\be_visitor_operation/tie_sh.cpp:60
+
+ void access (
+ ::CORBA::Visibility access
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ));
+
+ private:
+ T *ptr_;
+ PortableServer::POA_var poa_;
+ ::CORBA::Boolean rel_;
+
+ // copy and assignment are not allowed
+ ValueMemberDef_tie (const ValueMemberDef_tie &);
+ void operator= (const ValueMemberDef_tie &);
+ };
+
+ // TAO_IDL - Generated from
+ // be\be_visitor_interface/tie_sh.cpp:87
+
+ // TIE class: Refer to CORBA v2.2, Section 20.34.4
+ template <class T>
+ class ValueDef_tie : public ValueDef
+ {
+ public:
+ /// the T& ctor
+ ValueDef_tie (T &t);
+ /// ctor taking a POA
+ ValueDef_tie (T &t, PortableServer::POA_ptr poa);
+ /// ctor taking pointer and an ownership flag
+ ValueDef_tie (T *tp, ::CORBA::Boolean release = true);
+ /// ctor with T*, ownership flag and a POA
+ ValueDef_tie (
+ T *tp,
+ PortableServer::POA_ptr poa,
+ ::CORBA::Boolean release = true
+ );
+ /// dtor
+
+ ~ValueDef_tie (void);
+ // TIE specific functions
+ /// return the underlying object
+ T *_tied_object (void);
+ /// set the underlying object
+ void _tied_object (T &obj);
+ /// set the underlying object and the ownership flag
+ void _tied_object (T *obj, ::CORBA::Boolean release = true);
+ /// do we own it
+ ::CORBA::Boolean _is_owner (void);
+ /// set the ownership
+
+ void _is_owner ( ::CORBA::Boolean b);
+ // overridden ServantBase operations
+ PortableServer::POA_ptr _default_POA (
+ ACE_ENV_SINGLE_ARG_DECL_WITH_DEFAULTS
+ );
+
+ // TAO_IDL - Generated from
+ // be\be_visitor_operation/tie_sh.cpp:60
+
+ ::CORBA::DefinitionKind def_kind (
+ ACE_ENV_SINGLE_ARG_DECL_WITH_DEFAULTS
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ));
+
+ // TAO_IDL - Generated from
+ // be\be_visitor_operation/tie_sh.cpp:60
+
+ void destroy (
+ ACE_ENV_SINGLE_ARG_DECL_WITH_DEFAULTS
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ));
+
+ // TAO_IDL - Generated from
+ // be\be_visitor_operation/tie_sh.cpp:60
+
+ ::CORBA::Contained_ptr lookup (
+ const char * search_name
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ));
+
+ // TAO_IDL - Generated from
+ // be\be_visitor_operation/tie_sh.cpp:60
+
+ ::CORBA::ContainedSeq * contents (
+ ::CORBA::DefinitionKind limit_type,
+ ::CORBA::Boolean exclude_inherited
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ));
+
+ // TAO_IDL - Generated from
+ // be\be_visitor_operation/tie_sh.cpp:60
+
+ ::CORBA::ContainedSeq * lookup_name (
+ const char * search_name,
+ ::CORBA::Long levels_to_search,
+ ::CORBA::DefinitionKind limit_type,
+ ::CORBA::Boolean exclude_inherited
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ));
+
+ // TAO_IDL - Generated from
+ // be\be_visitor_operation/tie_sh.cpp:60
+
+ ::CORBA::Container::DescriptionSeq * describe_contents (
+ ::CORBA::DefinitionKind limit_type,
+ ::CORBA::Boolean exclude_inherited,
+ ::CORBA::Long max_returned_objs
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ));
+
+ // TAO_IDL - Generated from
+ // be\be_visitor_operation/tie_sh.cpp:60
+
+ ::CORBA::ModuleDef_ptr create_module (
+ const char * id,
+ const char * name,
+ const char * version
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ));
+
+ // TAO_IDL - Generated from
+ // be\be_visitor_operation/tie_sh.cpp:60
+
+ ::CORBA::ConstantDef_ptr create_constant (
+ const char * id,
+ const char * name,
+ const char * version,
+ ::CORBA::IDLType_ptr type,
+ const ::CORBA::Any & value
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ));
+
+ // TAO_IDL - Generated from
+ // be\be_visitor_operation/tie_sh.cpp:60
+
+ ::CORBA::StructDef_ptr create_struct (
+ const char * id,
+ const char * name,
+ const char * version,
+ const ::CORBA::StructMemberSeq & members
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ));
+
+ // TAO_IDL - Generated from
+ // be\be_visitor_operation/tie_sh.cpp:60
+
+ ::CORBA::UnionDef_ptr create_union (
+ const char * id,
+ const char * name,
+ const char * version,
+ ::CORBA::IDLType_ptr discriminator_type,
+ const ::CORBA::UnionMemberSeq & members
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ));
+
+ // TAO_IDL - Generated from
+ // be\be_visitor_operation/tie_sh.cpp:60
+
+ ::CORBA::EnumDef_ptr create_enum (
+ const char * id,
+ const char * name,
+ const char * version,
+ const ::CORBA::EnumMemberSeq & members
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ));
+
+ // TAO_IDL - Generated from
+ // be\be_visitor_operation/tie_sh.cpp:60
+
+ ::CORBA::AliasDef_ptr create_alias (
+ const char * id,
+ const char * name,
+ const char * version,
+ ::CORBA::IDLType_ptr original_type
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ));
+
+ // TAO_IDL - Generated from
+ // be\be_visitor_operation/tie_sh.cpp:60
+
+ ::CORBA::InterfaceDef_ptr create_interface (
+ const char * id,
+ const char * name,
+ const char * version,
+ const ::CORBA::InterfaceDefSeq & base_interfaces
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ));
+
+ // TAO_IDL - Generated from
+ // be\be_visitor_operation/tie_sh.cpp:60
+
+ ::CORBA::ValueDef_ptr create_value (
+ const char * id,
+ const char * name,
+ const char * version,
+ ::CORBA::Boolean is_custom,
+ ::CORBA::Boolean is_abstract,
+ ::CORBA::ValueDef_ptr base_value,
+ ::CORBA::Boolean is_truncatable,
+ const ::CORBA::ValueDefSeq & abstract_base_values,
+ const ::CORBA::InterfaceDefSeq & supported_interfaces,
+ const ::CORBA::InitializerSeq & initializers
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ));
+
+ // TAO_IDL - Generated from
+ // be\be_visitor_operation/tie_sh.cpp:60
+
+ ::CORBA::ValueBoxDef_ptr create_value_box (
+ const char * id,
+ const char * name,
+ const char * version,
+ ::CORBA::IDLType_ptr original_type_def
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ));
+
+ // TAO_IDL - Generated from
+ // be\be_visitor_operation/tie_sh.cpp:60
+
+ ::CORBA::ExceptionDef_ptr create_exception (
+ const char * id,
+ const char * name,
+ const char * version,
+ const ::CORBA::StructMemberSeq & members
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ));
+
+ // TAO_IDL - Generated from
+ // be\be_visitor_operation/tie_sh.cpp:60
+
+ ::CORBA::NativeDef_ptr create_native (
+ const char * id,
+ const char * name,
+ const char * version
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ));
+
+ // TAO_IDL - Generated from
+ // be\be_visitor_operation/tie_sh.cpp:60
+
+ ::CORBA::AbstractInterfaceDef_ptr create_abstract_interface (
+ const char * id,
+ const char * name,
+ const char * version,
+ const ::CORBA::AbstractInterfaceDefSeq & base_interfaces
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ));
+
+ // TAO_IDL - Generated from
+ // be\be_visitor_operation/tie_sh.cpp:60
+
+ ::CORBA::LocalInterfaceDef_ptr create_local_interface (
+ const char * id,
+ const char * name,
+ const char * version,
+ const ::CORBA::InterfaceDefSeq & base_interfaces
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ));
+
+ // TAO_IDL - Generated from
+ // be\be_visitor_operation/tie_sh.cpp:60
+
+ ::CORBA::ExtValueDef_ptr create_ext_value (
+ const char * id,
+ const char * name,
+ const char * version,
+ ::CORBA::Boolean is_custom,
+ ::CORBA::Boolean is_abstract,
+ ::CORBA::ValueDef_ptr base_value,
+ ::CORBA::Boolean is_truncatable,
+ const ::CORBA::ValueDefSeq & abstract_base_values,
+ const ::CORBA::InterfaceDefSeq & supported_interfaces,
+ const ::CORBA::ExtInitializerSeq & initializers
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ));
+
+ // TAO_IDL - Generated from
+ // be\be_visitor_operation/tie_sh.cpp:60
+
+ char * id (
+ ACE_ENV_SINGLE_ARG_DECL_WITH_DEFAULTS
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ));
+
+ // TAO_IDL - Generated from
+ // be\be_visitor_operation/tie_sh.cpp:60
+
+ void id (
+ const char * id
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ));
+
+ // TAO_IDL - Generated from
+ // be\be_visitor_operation/tie_sh.cpp:60
+
+ char * name (
+ ACE_ENV_SINGLE_ARG_DECL_WITH_DEFAULTS
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ));
+
+ // TAO_IDL - Generated from
+ // be\be_visitor_operation/tie_sh.cpp:60
+
+ void name (
+ const char * name
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ));
+
+ // TAO_IDL - Generated from
+ // be\be_visitor_operation/tie_sh.cpp:60
+
+ char * version (
+ ACE_ENV_SINGLE_ARG_DECL_WITH_DEFAULTS
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ));
+
+ // TAO_IDL - Generated from
+ // be\be_visitor_operation/tie_sh.cpp:60
+
+ void version (
+ const char * version
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ));
+
+ // TAO_IDL - Generated from
+ // be\be_visitor_operation/tie_sh.cpp:60
+
+ ::CORBA::Container_ptr defined_in (
+ ACE_ENV_SINGLE_ARG_DECL_WITH_DEFAULTS
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ));
+
+ // TAO_IDL - Generated from
+ // be\be_visitor_operation/tie_sh.cpp:60
+
+ char * absolute_name (
+ ACE_ENV_SINGLE_ARG_DECL_WITH_DEFAULTS
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ));
+
+ // TAO_IDL - Generated from
+ // be\be_visitor_operation/tie_sh.cpp:60
+
+ ::CORBA::Repository_ptr containing_repository (
+ ACE_ENV_SINGLE_ARG_DECL_WITH_DEFAULTS
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ));
+
+ // TAO_IDL - Generated from
+ // be\be_visitor_operation/tie_sh.cpp:60
+
+ ::CORBA::Contained::Description * describe (
+ ACE_ENV_SINGLE_ARG_DECL_WITH_DEFAULTS
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ));
+
+ // TAO_IDL - Generated from
+ // be\be_visitor_operation/tie_sh.cpp:60
+
+ void move (
+ ::CORBA::Container_ptr new_container,
+ const char * new_name,
+ const char * new_version
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ));
+
+ // TAO_IDL - Generated from
+ // be\be_visitor_operation/tie_sh.cpp:60
+
+ ::CORBA::TypeCode_ptr type (
+ ACE_ENV_SINGLE_ARG_DECL_WITH_DEFAULTS
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ));
+
+ // TAO_IDL - Generated from
+ // be\be_visitor_operation/tie_sh.cpp:60
+
+ ::CORBA::InterfaceDefSeq * supported_interfaces (
+ ACE_ENV_SINGLE_ARG_DECL_WITH_DEFAULTS
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ));
+
+ // TAO_IDL - Generated from
+ // be\be_visitor_operation/tie_sh.cpp:60
+
+ void supported_interfaces (
+ const ::CORBA::InterfaceDefSeq & supported_interfaces
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ));
+
+ // TAO_IDL - Generated from
+ // be\be_visitor_operation/tie_sh.cpp:60
+
+ ::CORBA::InitializerSeq * initializers (
+ ACE_ENV_SINGLE_ARG_DECL_WITH_DEFAULTS
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ));
+
+ // TAO_IDL - Generated from
+ // be\be_visitor_operation/tie_sh.cpp:60
+
+ void initializers (
+ const ::CORBA::InitializerSeq & initializers
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ));
+
+ // TAO_IDL - Generated from
+ // be\be_visitor_operation/tie_sh.cpp:60
+
+ ::CORBA::ValueDef_ptr base_value (
+ ACE_ENV_SINGLE_ARG_DECL_WITH_DEFAULTS
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ));
+
+ // TAO_IDL - Generated from
+ // be\be_visitor_operation/tie_sh.cpp:60
+
+ void base_value (
+ ::CORBA::ValueDef_ptr base_value
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ));
+
+ // TAO_IDL - Generated from
+ // be\be_visitor_operation/tie_sh.cpp:60
+
+ ::CORBA::ValueDefSeq * abstract_base_values (
+ ACE_ENV_SINGLE_ARG_DECL_WITH_DEFAULTS
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ));
+
+ // TAO_IDL - Generated from
+ // be\be_visitor_operation/tie_sh.cpp:60
+
+ void abstract_base_values (
+ const ::CORBA::ValueDefSeq & abstract_base_values
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ));
+
+ // TAO_IDL - Generated from
+ // be\be_visitor_operation/tie_sh.cpp:60
+
+ ::CORBA::Boolean is_abstract (
+ ACE_ENV_SINGLE_ARG_DECL_WITH_DEFAULTS
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ));
+
+ // TAO_IDL - Generated from
+ // be\be_visitor_operation/tie_sh.cpp:60
+
+ void is_abstract (
+ ::CORBA::Boolean is_abstract
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ));
+
+ // TAO_IDL - Generated from
+ // be\be_visitor_operation/tie_sh.cpp:60
+
+ ::CORBA::Boolean is_custom (
+ ACE_ENV_SINGLE_ARG_DECL_WITH_DEFAULTS
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ));
+
+ // TAO_IDL - Generated from
+ // be\be_visitor_operation/tie_sh.cpp:60
+
+ void is_custom (
+ ::CORBA::Boolean is_custom
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ));
+
+ // TAO_IDL - Generated from
+ // be\be_visitor_operation/tie_sh.cpp:60
+
+ ::CORBA::Boolean is_truncatable (
+ ACE_ENV_SINGLE_ARG_DECL_WITH_DEFAULTS
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ));
+
+ // TAO_IDL - Generated from
+ // be\be_visitor_operation/tie_sh.cpp:60
+
+ void is_truncatable (
+ ::CORBA::Boolean is_truncatable
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ));
+
+ // TAO_IDL - Generated from
+ // be\be_visitor_operation/tie_sh.cpp:60
+
+ ::CORBA::Boolean is_a (
+ const char * id
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ));
+
+ // TAO_IDL - Generated from
+ // be\be_visitor_operation/tie_sh.cpp:60
+
+ ::CORBA::ValueDef::FullValueDescription * describe_value (
+ ACE_ENV_SINGLE_ARG_DECL_WITH_DEFAULTS
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ));
+
+ // TAO_IDL - Generated from
+ // be\be_visitor_operation/tie_sh.cpp:60
+
+ ::CORBA::ValueMemberDef_ptr create_value_member (
+ const char * id,
+ const char * name,
+ const char * version,
+ ::CORBA::IDLType_ptr type,
+ ::CORBA::Visibility access
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ));
+
+ // TAO_IDL - Generated from
+ // be\be_visitor_operation/tie_sh.cpp:60
+
+ ::CORBA::AttributeDef_ptr create_attribute (
+ const char * id,
+ const char * name,
+ const char * version,
+ ::CORBA::IDLType_ptr type,
+ ::CORBA::AttributeMode mode
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ));
+
+ // TAO_IDL - Generated from
+ // be\be_visitor_operation/tie_sh.cpp:60
+
+ ::CORBA::OperationDef_ptr create_operation (
+ const char * id,
+ const char * name,
+ const char * version,
+ ::CORBA::IDLType_ptr result,
+ ::CORBA::OperationMode mode,
+ const ::CORBA::ParDescriptionSeq & params,
+ const ::CORBA::ExceptionDefSeq & exceptions,
+ const ::CORBA::ContextIdSeq & contexts
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ));
+
+ private:
+ T *ptr_;
+ PortableServer::POA_var poa_;
+ ::CORBA::Boolean rel_;
+
+ // copy and assignment are not allowed
+ ValueDef_tie (const ValueDef_tie &);
+ void operator= (const ValueDef_tie &);
+ };
+
+ // TAO_IDL - Generated from
+ // be\be_visitor_interface/tie_sh.cpp:87
+
+ // TIE class: Refer to CORBA v2.2, Section 20.34.4
+ template <class T>
+ class ExtValueDef_tie : public ExtValueDef
+ {
+ public:
+ /// the T& ctor
+ ExtValueDef_tie (T &t);
+ /// ctor taking a POA
+ ExtValueDef_tie (T &t, PortableServer::POA_ptr poa);
+ /// ctor taking pointer and an ownership flag
+ ExtValueDef_tie (T *tp, ::CORBA::Boolean release = true);
+ /// ctor with T*, ownership flag and a POA
+ ExtValueDef_tie (
+ T *tp,
+ PortableServer::POA_ptr poa,
+ ::CORBA::Boolean release = true
+ );
+ /// dtor
+
+ ~ExtValueDef_tie (void);
+ // TIE specific functions
+ /// return the underlying object
+ T *_tied_object (void);
+ /// set the underlying object
+ void _tied_object (T &obj);
+ /// set the underlying object and the ownership flag
+ void _tied_object (T *obj, ::CORBA::Boolean release = true);
+ /// do we own it
+ ::CORBA::Boolean _is_owner (void);
+ /// set the ownership
+
+ void _is_owner ( ::CORBA::Boolean b);
+ // overridden ServantBase operations
+ PortableServer::POA_ptr _default_POA (
+ ACE_ENV_SINGLE_ARG_DECL_WITH_DEFAULTS
+ );
+
+ // TAO_IDL - Generated from
+ // be\be_visitor_operation/tie_sh.cpp:60
+
+ ::CORBA::DefinitionKind def_kind (
+ ACE_ENV_SINGLE_ARG_DECL_WITH_DEFAULTS
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ));
+
+ // TAO_IDL - Generated from
+ // be\be_visitor_operation/tie_sh.cpp:60
+
+ void destroy (
+ ACE_ENV_SINGLE_ARG_DECL_WITH_DEFAULTS
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ));
+
+ // TAO_IDL - Generated from
+ // be\be_visitor_operation/tie_sh.cpp:60
+
+ ::CORBA::Contained_ptr lookup (
+ const char * search_name
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ));
+
+ // TAO_IDL - Generated from
+ // be\be_visitor_operation/tie_sh.cpp:60
+
+ ::CORBA::ContainedSeq * contents (
+ ::CORBA::DefinitionKind limit_type,
+ ::CORBA::Boolean exclude_inherited
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ));
+
+ // TAO_IDL - Generated from
+ // be\be_visitor_operation/tie_sh.cpp:60
+
+ ::CORBA::ContainedSeq * lookup_name (
+ const char * search_name,
+ ::CORBA::Long levels_to_search,
+ ::CORBA::DefinitionKind limit_type,
+ ::CORBA::Boolean exclude_inherited
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ));
+
+ // TAO_IDL - Generated from
+ // be\be_visitor_operation/tie_sh.cpp:60
+
+ ::CORBA::Container::DescriptionSeq * describe_contents (
+ ::CORBA::DefinitionKind limit_type,
+ ::CORBA::Boolean exclude_inherited,
+ ::CORBA::Long max_returned_objs
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ));
+
+ // TAO_IDL - Generated from
+ // be\be_visitor_operation/tie_sh.cpp:60
+
+ ::CORBA::ModuleDef_ptr create_module (
+ const char * id,
+ const char * name,
+ const char * version
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ));
+
+ // TAO_IDL - Generated from
+ // be\be_visitor_operation/tie_sh.cpp:60
+
+ ::CORBA::ConstantDef_ptr create_constant (
+ const char * id,
+ const char * name,
+ const char * version,
+ ::CORBA::IDLType_ptr type,
+ const ::CORBA::Any & value
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ));
+
+ // TAO_IDL - Generated from
+ // be\be_visitor_operation/tie_sh.cpp:60
+
+ ::CORBA::StructDef_ptr create_struct (
+ const char * id,
+ const char * name,
+ const char * version,
+ const ::CORBA::StructMemberSeq & members
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ));
+
+ // TAO_IDL - Generated from
+ // be\be_visitor_operation/tie_sh.cpp:60
+
+ ::CORBA::UnionDef_ptr create_union (
+ const char * id,
+ const char * name,
+ const char * version,
+ ::CORBA::IDLType_ptr discriminator_type,
+ const ::CORBA::UnionMemberSeq & members
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ));
+
+ // TAO_IDL - Generated from
+ // be\be_visitor_operation/tie_sh.cpp:60
+
+ ::CORBA::EnumDef_ptr create_enum (
+ const char * id,
+ const char * name,
+ const char * version,
+ const ::CORBA::EnumMemberSeq & members
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ));
+
+ // TAO_IDL - Generated from
+ // be\be_visitor_operation/tie_sh.cpp:60
+
+ ::CORBA::AliasDef_ptr create_alias (
+ const char * id,
+ const char * name,
+ const char * version,
+ ::CORBA::IDLType_ptr original_type
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ));
+
+ // TAO_IDL - Generated from
+ // be\be_visitor_operation/tie_sh.cpp:60
+
+ ::CORBA::InterfaceDef_ptr create_interface (
+ const char * id,
+ const char * name,
+ const char * version,
+ const ::CORBA::InterfaceDefSeq & base_interfaces
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ));
+
+ // TAO_IDL - Generated from
+ // be\be_visitor_operation/tie_sh.cpp:60
+
+ ::CORBA::ValueDef_ptr create_value (
+ const char * id,
+ const char * name,
+ const char * version,
+ ::CORBA::Boolean is_custom,
+ ::CORBA::Boolean is_abstract,
+ ::CORBA::ValueDef_ptr base_value,
+ ::CORBA::Boolean is_truncatable,
+ const ::CORBA::ValueDefSeq & abstract_base_values,
+ const ::CORBA::InterfaceDefSeq & supported_interfaces,
+ const ::CORBA::InitializerSeq & initializers
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ));
+
+ // TAO_IDL - Generated from
+ // be\be_visitor_operation/tie_sh.cpp:60
+
+ ::CORBA::ValueBoxDef_ptr create_value_box (
+ const char * id,
+ const char * name,
+ const char * version,
+ ::CORBA::IDLType_ptr original_type_def
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ));
+
+ // TAO_IDL - Generated from
+ // be\be_visitor_operation/tie_sh.cpp:60
+
+ ::CORBA::ExceptionDef_ptr create_exception (
+ const char * id,
+ const char * name,
+ const char * version,
+ const ::CORBA::StructMemberSeq & members
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ));
+
+ // TAO_IDL - Generated from
+ // be\be_visitor_operation/tie_sh.cpp:60
+
+ ::CORBA::NativeDef_ptr create_native (
+ const char * id,
+ const char * name,
+ const char * version
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ));
+
+ // TAO_IDL - Generated from
+ // be\be_visitor_operation/tie_sh.cpp:60
+
+ ::CORBA::AbstractInterfaceDef_ptr create_abstract_interface (
+ const char * id,
+ const char * name,
+ const char * version,
+ const ::CORBA::AbstractInterfaceDefSeq & base_interfaces
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ));
+
+ // TAO_IDL - Generated from
+ // be\be_visitor_operation/tie_sh.cpp:60
+
+ ::CORBA::LocalInterfaceDef_ptr create_local_interface (
+ const char * id,
+ const char * name,
+ const char * version,
+ const ::CORBA::InterfaceDefSeq & base_interfaces
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ));
+
+ // TAO_IDL - Generated from
+ // be\be_visitor_operation/tie_sh.cpp:60
+
+ ::CORBA::ExtValueDef_ptr create_ext_value (
+ const char * id,
+ const char * name,
+ const char * version,
+ ::CORBA::Boolean is_custom,
+ ::CORBA::Boolean is_abstract,
+ ::CORBA::ValueDef_ptr base_value,
+ ::CORBA::Boolean is_truncatable,
+ const ::CORBA::ValueDefSeq & abstract_base_values,
+ const ::CORBA::InterfaceDefSeq & supported_interfaces,
+ const ::CORBA::ExtInitializerSeq & initializers
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ));
+
+ // TAO_IDL - Generated from
+ // be\be_visitor_operation/tie_sh.cpp:60
+
+ char * id (
+ ACE_ENV_SINGLE_ARG_DECL_WITH_DEFAULTS
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ));
+
+ // TAO_IDL - Generated from
+ // be\be_visitor_operation/tie_sh.cpp:60
+
+ void id (
+ const char * id
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ));
+
+ // TAO_IDL - Generated from
+ // be\be_visitor_operation/tie_sh.cpp:60
+
+ char * name (
+ ACE_ENV_SINGLE_ARG_DECL_WITH_DEFAULTS
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ));
+
+ // TAO_IDL - Generated from
+ // be\be_visitor_operation/tie_sh.cpp:60
+
+ void name (
+ const char * name
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ));
+
+ // TAO_IDL - Generated from
+ // be\be_visitor_operation/tie_sh.cpp:60
+
+ char * version (
+ ACE_ENV_SINGLE_ARG_DECL_WITH_DEFAULTS
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ));
+
+ // TAO_IDL - Generated from
+ // be\be_visitor_operation/tie_sh.cpp:60
+
+ void version (
+ const char * version
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ));
+
+ // TAO_IDL - Generated from
+ // be\be_visitor_operation/tie_sh.cpp:60
+
+ ::CORBA::Container_ptr defined_in (
+ ACE_ENV_SINGLE_ARG_DECL_WITH_DEFAULTS
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ));
+
+ // TAO_IDL - Generated from
+ // be\be_visitor_operation/tie_sh.cpp:60
+
+ char * absolute_name (
+ ACE_ENV_SINGLE_ARG_DECL_WITH_DEFAULTS
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ));
+
+ // TAO_IDL - Generated from
+ // be\be_visitor_operation/tie_sh.cpp:60
+
+ ::CORBA::Repository_ptr containing_repository (
+ ACE_ENV_SINGLE_ARG_DECL_WITH_DEFAULTS
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ));
+
+ // TAO_IDL - Generated from
+ // be\be_visitor_operation/tie_sh.cpp:60
+
+ ::CORBA::Contained::Description * describe (
+ ACE_ENV_SINGLE_ARG_DECL_WITH_DEFAULTS
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ));
+
+ // TAO_IDL - Generated from
+ // be\be_visitor_operation/tie_sh.cpp:60
+
+ void move (
+ ::CORBA::Container_ptr new_container,
+ const char * new_name,
+ const char * new_version
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ));
+
+ // TAO_IDL - Generated from
+ // be\be_visitor_operation/tie_sh.cpp:60
+
+ ::CORBA::TypeCode_ptr type (
+ ACE_ENV_SINGLE_ARG_DECL_WITH_DEFAULTS
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ));
+
+ // TAO_IDL - Generated from
+ // be\be_visitor_operation/tie_sh.cpp:60
+
+ ::CORBA::InterfaceDefSeq * supported_interfaces (
+ ACE_ENV_SINGLE_ARG_DECL_WITH_DEFAULTS
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ));
+
+ // TAO_IDL - Generated from
+ // be\be_visitor_operation/tie_sh.cpp:60
+
+ void supported_interfaces (
+ const ::CORBA::InterfaceDefSeq & supported_interfaces
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ));
+
+ // TAO_IDL - Generated from
+ // be\be_visitor_operation/tie_sh.cpp:60
+
+ ::CORBA::InitializerSeq * initializers (
+ ACE_ENV_SINGLE_ARG_DECL_WITH_DEFAULTS
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ));
+
+ // TAO_IDL - Generated from
+ // be\be_visitor_operation/tie_sh.cpp:60
+
+ void initializers (
+ const ::CORBA::InitializerSeq & initializers
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ));
+
+ // TAO_IDL - Generated from
+ // be\be_visitor_operation/tie_sh.cpp:60
+
+ ::CORBA::ValueDef_ptr base_value (
+ ACE_ENV_SINGLE_ARG_DECL_WITH_DEFAULTS
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ));
+
+ // TAO_IDL - Generated from
+ // be\be_visitor_operation/tie_sh.cpp:60
+
+ void base_value (
+ ::CORBA::ValueDef_ptr base_value
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ));
+
+ // TAO_IDL - Generated from
+ // be\be_visitor_operation/tie_sh.cpp:60
+
+ ::CORBA::ValueDefSeq * abstract_base_values (
+ ACE_ENV_SINGLE_ARG_DECL_WITH_DEFAULTS
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ));
+
+ // TAO_IDL - Generated from
+ // be\be_visitor_operation/tie_sh.cpp:60
+
+ void abstract_base_values (
+ const ::CORBA::ValueDefSeq & abstract_base_values
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ));
+
+ // TAO_IDL - Generated from
+ // be\be_visitor_operation/tie_sh.cpp:60
+
+ ::CORBA::Boolean is_abstract (
+ ACE_ENV_SINGLE_ARG_DECL_WITH_DEFAULTS
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ));
+
+ // TAO_IDL - Generated from
+ // be\be_visitor_operation/tie_sh.cpp:60
+
+ void is_abstract (
+ ::CORBA::Boolean is_abstract
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ));
+
+ // TAO_IDL - Generated from
+ // be\be_visitor_operation/tie_sh.cpp:60
+
+ ::CORBA::Boolean is_custom (
+ ACE_ENV_SINGLE_ARG_DECL_WITH_DEFAULTS
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ));
+
+ // TAO_IDL - Generated from
+ // be\be_visitor_operation/tie_sh.cpp:60
+
+ void is_custom (
+ ::CORBA::Boolean is_custom
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ));
+
+ // TAO_IDL - Generated from
+ // be\be_visitor_operation/tie_sh.cpp:60
+
+ ::CORBA::Boolean is_truncatable (
+ ACE_ENV_SINGLE_ARG_DECL_WITH_DEFAULTS
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ));
+
+ // TAO_IDL - Generated from
+ // be\be_visitor_operation/tie_sh.cpp:60
+
+ void is_truncatable (
+ ::CORBA::Boolean is_truncatable
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ));
+
+ // TAO_IDL - Generated from
+ // be\be_visitor_operation/tie_sh.cpp:60
+
+ ::CORBA::Boolean is_a (
+ const char * id
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ));
+
+ // TAO_IDL - Generated from
+ // be\be_visitor_operation/tie_sh.cpp:60
+
+ ::CORBA::ValueDef::FullValueDescription * describe_value (
+ ACE_ENV_SINGLE_ARG_DECL_WITH_DEFAULTS
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ));
+
+ // TAO_IDL - Generated from
+ // be\be_visitor_operation/tie_sh.cpp:60
+
+ ::CORBA::ValueMemberDef_ptr create_value_member (
+ const char * id,
+ const char * name,
+ const char * version,
+ ::CORBA::IDLType_ptr type,
+ ::CORBA::Visibility access
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ));
+
+ // TAO_IDL - Generated from
+ // be\be_visitor_operation/tie_sh.cpp:60
+
+ ::CORBA::AttributeDef_ptr create_attribute (
+ const char * id,
+ const char * name,
+ const char * version,
+ ::CORBA::IDLType_ptr type,
+ ::CORBA::AttributeMode mode
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ));
+
+ // TAO_IDL - Generated from
+ // be\be_visitor_operation/tie_sh.cpp:60
+
+ ::CORBA::OperationDef_ptr create_operation (
+ const char * id,
+ const char * name,
+ const char * version,
+ ::CORBA::IDLType_ptr result,
+ ::CORBA::OperationMode mode,
+ const ::CORBA::ParDescriptionSeq & params,
+ const ::CORBA::ExceptionDefSeq & exceptions,
+ const ::CORBA::ContextIdSeq & contexts
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ));
+
+ // TAO_IDL - Generated from
+ // be\be_visitor_operation/tie_sh.cpp:60
+
+ ::CORBA::ExtInitializerSeq * ext_initializers (
+ ACE_ENV_SINGLE_ARG_DECL_WITH_DEFAULTS
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ));
+
+ // TAO_IDL - Generated from
+ // be\be_visitor_operation/tie_sh.cpp:60
+
+ void ext_initializers (
+ const ::CORBA::ExtInitializerSeq & ext_initializers
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ));
+
+ // TAO_IDL - Generated from
+ // be\be_visitor_operation/tie_sh.cpp:60
+
+ ::CORBA::ExtValueDef::ExtFullValueDescription * describe_ext_value (
+ ACE_ENV_SINGLE_ARG_DECL_WITH_DEFAULTS
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ));
+
+ // TAO_IDL - Generated from
+ // be\be_visitor_operation/tie_sh.cpp:60
+
+ ::CORBA::ExtAttributeDef_ptr create_ext_attribute (
+ const char * id,
+ const char * name,
+ const char * version,
+ ::CORBA::IDLType_ptr type,
+ ::CORBA::AttributeMode mode,
+ const ::CORBA::ExceptionDefSeq & get_exceptions,
+ const ::CORBA::ExceptionDefSeq & set_exceptions
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ));
+
+ private:
+ T *ptr_;
+ PortableServer::POA_var poa_;
+ ::CORBA::Boolean rel_;
+
+ // copy and assignment are not allowed
+ ExtValueDef_tie (const ExtValueDef_tie &);
+ void operator= (const ExtValueDef_tie &);
+ };
+
+ // TAO_IDL - Generated from
+ // be\be_visitor_interface/tie_sh.cpp:87
+
+ // TIE class: Refer to CORBA v2.2, Section 20.34.4
+ template <class T>
+ class ValueBoxDef_tie : public ValueBoxDef
+ {
+ public:
+ /// the T& ctor
+ ValueBoxDef_tie (T &t);
+ /// ctor taking a POA
+ ValueBoxDef_tie (T &t, PortableServer::POA_ptr poa);
+ /// ctor taking pointer and an ownership flag
+ ValueBoxDef_tie (T *tp, ::CORBA::Boolean release = true);
+ /// ctor with T*, ownership flag and a POA
+ ValueBoxDef_tie (
+ T *tp,
+ PortableServer::POA_ptr poa,
+ ::CORBA::Boolean release = true
+ );
+ /// dtor
+
+ ~ValueBoxDef_tie (void);
+ // TIE specific functions
+ /// return the underlying object
+ T *_tied_object (void);
+ /// set the underlying object
+ void _tied_object (T &obj);
+ /// set the underlying object and the ownership flag
+ void _tied_object (T *obj, ::CORBA::Boolean release = true);
+ /// do we own it
+ ::CORBA::Boolean _is_owner (void);
+ /// set the ownership
+
+ void _is_owner ( ::CORBA::Boolean b);
+ // overridden ServantBase operations
+ PortableServer::POA_ptr _default_POA (
+ ACE_ENV_SINGLE_ARG_DECL_WITH_DEFAULTS
+ );
+
+ // TAO_IDL - Generated from
+ // be\be_visitor_operation/tie_sh.cpp:60
+
+ ::CORBA::DefinitionKind def_kind (
+ ACE_ENV_SINGLE_ARG_DECL_WITH_DEFAULTS
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ));
+
+ // TAO_IDL - Generated from
+ // be\be_visitor_operation/tie_sh.cpp:60
+
+ void destroy (
+ ACE_ENV_SINGLE_ARG_DECL_WITH_DEFAULTS
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ));
+
+ // TAO_IDL - Generated from
+ // be\be_visitor_operation/tie_sh.cpp:60
+
+ char * id (
+ ACE_ENV_SINGLE_ARG_DECL_WITH_DEFAULTS
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ));
+
+ // TAO_IDL - Generated from
+ // be\be_visitor_operation/tie_sh.cpp:60
+
+ void id (
+ const char * id
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ));
+
+ // TAO_IDL - Generated from
+ // be\be_visitor_operation/tie_sh.cpp:60
+
+ char * name (
+ ACE_ENV_SINGLE_ARG_DECL_WITH_DEFAULTS
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ));
+
+ // TAO_IDL - Generated from
+ // be\be_visitor_operation/tie_sh.cpp:60
+
+ void name (
+ const char * name
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ));
+
+ // TAO_IDL - Generated from
+ // be\be_visitor_operation/tie_sh.cpp:60
+
+ char * version (
+ ACE_ENV_SINGLE_ARG_DECL_WITH_DEFAULTS
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ));
+
+ // TAO_IDL - Generated from
+ // be\be_visitor_operation/tie_sh.cpp:60
+
+ void version (
+ const char * version
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ));
+
+ // TAO_IDL - Generated from
+ // be\be_visitor_operation/tie_sh.cpp:60
+
+ ::CORBA::Container_ptr defined_in (
+ ACE_ENV_SINGLE_ARG_DECL_WITH_DEFAULTS
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ));
+
+ // TAO_IDL - Generated from
+ // be\be_visitor_operation/tie_sh.cpp:60
+
+ char * absolute_name (
+ ACE_ENV_SINGLE_ARG_DECL_WITH_DEFAULTS
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ));
+
+ // TAO_IDL - Generated from
+ // be\be_visitor_operation/tie_sh.cpp:60
+
+ ::CORBA::Repository_ptr containing_repository (
+ ACE_ENV_SINGLE_ARG_DECL_WITH_DEFAULTS
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ));
+
+ // TAO_IDL - Generated from
+ // be\be_visitor_operation/tie_sh.cpp:60
+
+ ::CORBA::Contained::Description * describe (
+ ACE_ENV_SINGLE_ARG_DECL_WITH_DEFAULTS
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ));
+
+ // TAO_IDL - Generated from
+ // be\be_visitor_operation/tie_sh.cpp:60
+
+ void move (
+ ::CORBA::Container_ptr new_container,
+ const char * new_name,
+ const char * new_version
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ));
+
+ // TAO_IDL - Generated from
+ // be\be_visitor_operation/tie_sh.cpp:60
+
+ ::CORBA::TypeCode_ptr type (
+ ACE_ENV_SINGLE_ARG_DECL_WITH_DEFAULTS
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ));
+
+ // TAO_IDL - Generated from
+ // be\be_visitor_operation/tie_sh.cpp:60
+
+ ::CORBA::IDLType_ptr original_type_def (
+ ACE_ENV_SINGLE_ARG_DECL_WITH_DEFAULTS
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ));
+
+ // TAO_IDL - Generated from
+ // be\be_visitor_operation/tie_sh.cpp:60
+
+ void original_type_def (
+ ::CORBA::IDLType_ptr original_type_def
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ));
+
+ private:
+ T *ptr_;
+ PortableServer::POA_var poa_;
+ ::CORBA::Boolean rel_;
+
+ // copy and assignment are not allowed
+ ValueBoxDef_tie (const ValueBoxDef_tie &);
+ void operator= (const ValueBoxDef_tie &);
+ };
+} // module CORBA
+
+// TAO_IDL - Generated from
+// be\be_codegen.cpp:1322
+
+
+TAO_END_VERSIONED_NAMESPACE_DECL
+
+#if defined (__ACE_INLINE__)
+#include "IFR_ExtendedS_T.inl"
+#endif /* defined INLINE */
+
+#if defined (ACE_TEMPLATES_REQUIRE_SOURCE)
+#include "IFR_ExtendedS_T.cpp"
+#endif /* defined REQUIRED SOURCE */
+
+#if defined (ACE_TEMPLATES_REQUIRE_PRAGMA)
+#pragma implementation ("IFR_ExtendedS_T.cpp")
+#endif /* defined REQUIRED PRAGMA */
+
+#include /**/ "ace/post.h"
+#endif /* ifndef */
+
diff --git a/TAO/orbsvcs/orbsvcs/IFRService/IFR_ExtendedS_T.inl b/TAO/orbsvcs/orbsvcs/IFRService/IFR_ExtendedS_T.inl
new file mode 100644
index 00000000000..d50df786b6b
--- /dev/null
+++ b/TAO/orbsvcs/orbsvcs/IFRService/IFR_ExtendedS_T.inl
@@ -0,0 +1,3342 @@
+// -*- C++ -*-
+//
+// $Id$
+
+// **** Code generated by the The ACE ORB (TAO) IDL Compiler ****
+// TAO and the TAO IDL Compiler have been developed by:
+// Center for Distributed Object Computing
+// Washington University
+// St. Louis, MO
+// USA
+// http://www.cs.wustl.edu/~schmidt/doc-center.html
+// and
+// Distributed Object Computing Laboratory
+// University of California at Irvine
+// Irvine, CA
+// USA
+// http://doc.ece.uci.edu/
+// and
+// Institute for Software Integrated Systems
+// Vanderbilt University
+// Nashville, TN
+// USA
+// http://www.isis.vanderbilt.edu/
+//
+// Information about TAO is available at:
+// http://www.cs.wustl.edu/~schmidt/TAO.html
+
+
+TAO_BEGIN_VERSIONED_NAMESPACE_DECL
+
+
+
+// TAO_IDL - Generated from
+// be\be_visitor_interface/tie_si.cpp:96
+
+template <class T> ACE_INLINE
+POA_CORBA::FixedDef_tie<T>::FixedDef_tie (T &t)
+ : ptr_ (&t),
+ poa_ (PortableServer::POA::_nil ()),
+ rel_ (0)
+{}
+
+template <class T> ACE_INLINE
+POA_CORBA::FixedDef_tie<T>::FixedDef_tie (T &t, PortableServer::POA_ptr poa)
+ : ptr_ (&t),
+ poa_ (PortableServer::POA::_duplicate (poa)),
+ rel_ (0)
+{}
+
+template <class T> ACE_INLINE
+POA_CORBA::FixedDef_tie<T>::FixedDef_tie (T *tp, ::CORBA::Boolean release)
+ : ptr_ (tp),
+ poa_ (PortableServer::POA::_nil ()),
+ rel_ (release)
+{}
+
+template <class T> ACE_INLINE
+POA_CORBA::FixedDef_tie<T>::FixedDef_tie (T *tp, PortableServer::POA_ptr poa, ::CORBA::Boolean release)
+ : ptr_ (tp),
+ poa_ (PortableServer::POA::_duplicate (poa)),
+ rel_ (release)
+{}
+
+template <class T> ACE_INLINE
+POA_CORBA::FixedDef_tie<T>::~FixedDef_tie (void)
+{
+ if (this->rel_)
+ {
+ delete this->ptr_;
+ }
+}
+
+template <class T> ACE_INLINE T *
+POA_CORBA::FixedDef_tie<T>::_tied_object (void)
+{
+ return this->ptr_;
+}
+
+template <class T> ACE_INLINE void
+POA_CORBA::FixedDef_tie<T>::_tied_object (T &obj)
+{
+ if (this->rel_)
+ {
+ delete this->ptr_;
+ }
+
+ this->ptr_ = &obj;
+ this->rel_ = 0;
+}
+
+template <class T> ACE_INLINE void
+POA_CORBA::FixedDef_tie<T>::_tied_object (T *obj, ::CORBA::Boolean release)
+{
+ if (this->rel_)
+ {
+ delete this->ptr_;
+ }
+
+ this->ptr_ = obj;
+ this->rel_ = release;
+}
+
+template <class T> ACE_INLINE ::CORBA::Boolean
+POA_CORBA::FixedDef_tie<T>::_is_owner (void)
+{
+ return this->rel_;
+}
+
+template <class T> ACE_INLINE void
+POA_CORBA::FixedDef_tie<T>::_is_owner ( ::CORBA::Boolean b)
+{
+ this->rel_ = b;
+}
+
+template <class T> ACE_INLINE PortableServer::POA_ptr
+POA_CORBA::FixedDef_tie<T>::_default_POA (ACE_ENV_SINGLE_ARG_DECL)
+{
+ if (! ::CORBA::is_nil (this->poa_.in ()))
+ {
+ return PortableServer::POA::_duplicate (this->poa_.in ());
+ }
+
+ return this->FixedDef::_default_POA (ACE_ENV_SINGLE_ARG_PARAMETER);
+}
+
+// TAO_IDL - Generated from
+// be\be_visitor_operation/tie_si.cpp:101
+
+template <class T> ACE_INLINE
+::CORBA::DefinitionKind POA_CORBA::FixedDef_tie<T>::def_kind (
+ ACE_ENV_SINGLE_ARG_DECL
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ))
+{
+ return this->ptr_->def_kind (
+ ACE_ENV_SINGLE_ARG_PARAMETER
+ );
+}
+
+// TAO_IDL - Generated from
+// be\be_visitor_operation/tie_si.cpp:101
+
+template <class T> ACE_INLINE
+void POA_CORBA::FixedDef_tie<T>::destroy (
+ ACE_ENV_SINGLE_ARG_DECL
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ))
+{
+ this->ptr_->destroy (
+ ACE_ENV_SINGLE_ARG_PARAMETER
+ );
+}
+
+// TAO_IDL - Generated from
+// be\be_visitor_operation/tie_si.cpp:101
+
+template <class T> ACE_INLINE
+::CORBA::TypeCode_ptr POA_CORBA::FixedDef_tie<T>::type (
+ ACE_ENV_SINGLE_ARG_DECL
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ))
+{
+ return this->ptr_->type (
+ ACE_ENV_SINGLE_ARG_PARAMETER
+ );
+}
+
+// TAO_IDL - Generated from
+// be\be_visitor_operation/tie_si.cpp:101
+
+template <class T> ACE_INLINE
+::CORBA::UShort POA_CORBA::FixedDef_tie<T>::digits (
+ ACE_ENV_SINGLE_ARG_DECL
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ))
+{
+ return this->ptr_->digits (
+ ACE_ENV_SINGLE_ARG_PARAMETER
+ );
+}
+
+// TAO_IDL - Generated from
+// be\be_visitor_operation/tie_si.cpp:101
+
+template <class T> ACE_INLINE
+void POA_CORBA::FixedDef_tie<T>::digits (
+ ::CORBA::UShort digits
+ ACE_ENV_ARG_DECL
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ))
+{
+ this->ptr_->digits (
+ digits
+ ACE_ENV_ARG_PARAMETER
+ );
+}
+
+// TAO_IDL - Generated from
+// be\be_visitor_operation/tie_si.cpp:101
+
+template <class T> ACE_INLINE
+::CORBA::Short POA_CORBA::FixedDef_tie<T>::scale (
+ ACE_ENV_SINGLE_ARG_DECL
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ))
+{
+ return this->ptr_->scale (
+ ACE_ENV_SINGLE_ARG_PARAMETER
+ );
+}
+
+// TAO_IDL - Generated from
+// be\be_visitor_operation/tie_si.cpp:101
+
+template <class T> ACE_INLINE
+void POA_CORBA::FixedDef_tie<T>::scale (
+ ::CORBA::Short scale
+ ACE_ENV_ARG_DECL
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ))
+{
+ this->ptr_->scale (
+ scale
+ ACE_ENV_ARG_PARAMETER
+ );
+}
+
+// TAO_IDL - Generated from
+// be\be_visitor_interface/tie_si.cpp:96
+
+template <class T> ACE_INLINE
+POA_CORBA::ValueMemberDef_tie<T>::ValueMemberDef_tie (T &t)
+ : ptr_ (&t),
+ poa_ (PortableServer::POA::_nil ()),
+ rel_ (0)
+{}
+
+template <class T> ACE_INLINE
+POA_CORBA::ValueMemberDef_tie<T>::ValueMemberDef_tie (T &t, PortableServer::POA_ptr poa)
+ : ptr_ (&t),
+ poa_ (PortableServer::POA::_duplicate (poa)),
+ rel_ (0)
+{}
+
+template <class T> ACE_INLINE
+POA_CORBA::ValueMemberDef_tie<T>::ValueMemberDef_tie (T *tp, ::CORBA::Boolean release)
+ : ptr_ (tp),
+ poa_ (PortableServer::POA::_nil ()),
+ rel_ (release)
+{}
+
+template <class T> ACE_INLINE
+POA_CORBA::ValueMemberDef_tie<T>::ValueMemberDef_tie (T *tp, PortableServer::POA_ptr poa, ::CORBA::Boolean release)
+ : ptr_ (tp),
+ poa_ (PortableServer::POA::_duplicate (poa)),
+ rel_ (release)
+{}
+
+template <class T> ACE_INLINE
+POA_CORBA::ValueMemberDef_tie<T>::~ValueMemberDef_tie (void)
+{
+ if (this->rel_)
+ {
+ delete this->ptr_;
+ }
+}
+
+template <class T> ACE_INLINE T *
+POA_CORBA::ValueMemberDef_tie<T>::_tied_object (void)
+{
+ return this->ptr_;
+}
+
+template <class T> ACE_INLINE void
+POA_CORBA::ValueMemberDef_tie<T>::_tied_object (T &obj)
+{
+ if (this->rel_)
+ {
+ delete this->ptr_;
+ }
+
+ this->ptr_ = &obj;
+ this->rel_ = 0;
+}
+
+template <class T> ACE_INLINE void
+POA_CORBA::ValueMemberDef_tie<T>::_tied_object (T *obj, ::CORBA::Boolean release)
+{
+ if (this->rel_)
+ {
+ delete this->ptr_;
+ }
+
+ this->ptr_ = obj;
+ this->rel_ = release;
+}
+
+template <class T> ACE_INLINE ::CORBA::Boolean
+POA_CORBA::ValueMemberDef_tie<T>::_is_owner (void)
+{
+ return this->rel_;
+}
+
+template <class T> ACE_INLINE void
+POA_CORBA::ValueMemberDef_tie<T>::_is_owner ( ::CORBA::Boolean b)
+{
+ this->rel_ = b;
+}
+
+template <class T> ACE_INLINE PortableServer::POA_ptr
+POA_CORBA::ValueMemberDef_tie<T>::_default_POA (ACE_ENV_SINGLE_ARG_DECL)
+{
+ if (! ::CORBA::is_nil (this->poa_.in ()))
+ {
+ return PortableServer::POA::_duplicate (this->poa_.in ());
+ }
+
+ return this->ValueMemberDef::_default_POA (ACE_ENV_SINGLE_ARG_PARAMETER);
+}
+
+// TAO_IDL - Generated from
+// be\be_visitor_operation/tie_si.cpp:101
+
+template <class T> ACE_INLINE
+::CORBA::DefinitionKind POA_CORBA::ValueMemberDef_tie<T>::def_kind (
+ ACE_ENV_SINGLE_ARG_DECL
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ))
+{
+ return this->ptr_->def_kind (
+ ACE_ENV_SINGLE_ARG_PARAMETER
+ );
+}
+
+// TAO_IDL - Generated from
+// be\be_visitor_operation/tie_si.cpp:101
+
+template <class T> ACE_INLINE
+void POA_CORBA::ValueMemberDef_tie<T>::destroy (
+ ACE_ENV_SINGLE_ARG_DECL
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ))
+{
+ this->ptr_->destroy (
+ ACE_ENV_SINGLE_ARG_PARAMETER
+ );
+}
+
+// TAO_IDL - Generated from
+// be\be_visitor_operation/tie_si.cpp:101
+
+template <class T> ACE_INLINE
+char * POA_CORBA::ValueMemberDef_tie<T>::id (
+ ACE_ENV_SINGLE_ARG_DECL
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ))
+{
+ return this->ptr_->id (
+ ACE_ENV_SINGLE_ARG_PARAMETER
+ );
+}
+
+// TAO_IDL - Generated from
+// be\be_visitor_operation/tie_si.cpp:101
+
+template <class T> ACE_INLINE
+void POA_CORBA::ValueMemberDef_tie<T>::id (
+ const char * id
+ ACE_ENV_ARG_DECL
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ))
+{
+ this->ptr_->id (
+ id
+ ACE_ENV_ARG_PARAMETER
+ );
+}
+
+// TAO_IDL - Generated from
+// be\be_visitor_operation/tie_si.cpp:101
+
+template <class T> ACE_INLINE
+char * POA_CORBA::ValueMemberDef_tie<T>::name (
+ ACE_ENV_SINGLE_ARG_DECL
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ))
+{
+ return this->ptr_->name (
+ ACE_ENV_SINGLE_ARG_PARAMETER
+ );
+}
+
+// TAO_IDL - Generated from
+// be\be_visitor_operation/tie_si.cpp:101
+
+template <class T> ACE_INLINE
+void POA_CORBA::ValueMemberDef_tie<T>::name (
+ const char * name
+ ACE_ENV_ARG_DECL
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ))
+{
+ this->ptr_->name (
+ name
+ ACE_ENV_ARG_PARAMETER
+ );
+}
+
+// TAO_IDL - Generated from
+// be\be_visitor_operation/tie_si.cpp:101
+
+template <class T> ACE_INLINE
+char * POA_CORBA::ValueMemberDef_tie<T>::version (
+ ACE_ENV_SINGLE_ARG_DECL
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ))
+{
+ return this->ptr_->version (
+ ACE_ENV_SINGLE_ARG_PARAMETER
+ );
+}
+
+// TAO_IDL - Generated from
+// be\be_visitor_operation/tie_si.cpp:101
+
+template <class T> ACE_INLINE
+void POA_CORBA::ValueMemberDef_tie<T>::version (
+ const char * version
+ ACE_ENV_ARG_DECL
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ))
+{
+ this->ptr_->version (
+ version
+ ACE_ENV_ARG_PARAMETER
+ );
+}
+
+// TAO_IDL - Generated from
+// be\be_visitor_operation/tie_si.cpp:101
+
+template <class T> ACE_INLINE
+::CORBA::Container_ptr POA_CORBA::ValueMemberDef_tie<T>::defined_in (
+ ACE_ENV_SINGLE_ARG_DECL
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ))
+{
+ return this->ptr_->defined_in (
+ ACE_ENV_SINGLE_ARG_PARAMETER
+ );
+}
+
+// TAO_IDL - Generated from
+// be\be_visitor_operation/tie_si.cpp:101
+
+template <class T> ACE_INLINE
+char * POA_CORBA::ValueMemberDef_tie<T>::absolute_name (
+ ACE_ENV_SINGLE_ARG_DECL
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ))
+{
+ return this->ptr_->absolute_name (
+ ACE_ENV_SINGLE_ARG_PARAMETER
+ );
+}
+
+// TAO_IDL - Generated from
+// be\be_visitor_operation/tie_si.cpp:101
+
+template <class T> ACE_INLINE
+::CORBA::Repository_ptr POA_CORBA::ValueMemberDef_tie<T>::containing_repository (
+ ACE_ENV_SINGLE_ARG_DECL
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ))
+{
+ return this->ptr_->containing_repository (
+ ACE_ENV_SINGLE_ARG_PARAMETER
+ );
+}
+
+// TAO_IDL - Generated from
+// be\be_visitor_operation/tie_si.cpp:101
+
+template <class T> ACE_INLINE
+::CORBA::Contained::Description * POA_CORBA::ValueMemberDef_tie<T>::describe (
+ ACE_ENV_SINGLE_ARG_DECL
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ))
+{
+ return this->ptr_->describe (
+ ACE_ENV_SINGLE_ARG_PARAMETER
+ );
+}
+
+// TAO_IDL - Generated from
+// be\be_visitor_operation/tie_si.cpp:101
+
+template <class T> ACE_INLINE
+void POA_CORBA::ValueMemberDef_tie<T>::move (
+ ::CORBA::Container_ptr new_container,
+ const char * new_name,
+ const char * new_version
+ ACE_ENV_ARG_DECL
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ))
+{
+ this->ptr_->move (
+ new_container,
+ new_name,
+ new_version
+ ACE_ENV_ARG_PARAMETER
+ );
+}
+
+// TAO_IDL - Generated from
+// be\be_visitor_operation/tie_si.cpp:101
+
+template <class T> ACE_INLINE
+::CORBA::TypeCode_ptr POA_CORBA::ValueMemberDef_tie<T>::type (
+ ACE_ENV_SINGLE_ARG_DECL
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ))
+{
+ return this->ptr_->type (
+ ACE_ENV_SINGLE_ARG_PARAMETER
+ );
+}
+
+// TAO_IDL - Generated from
+// be\be_visitor_operation/tie_si.cpp:101
+
+template <class T> ACE_INLINE
+::CORBA::IDLType_ptr POA_CORBA::ValueMemberDef_tie<T>::type_def (
+ ACE_ENV_SINGLE_ARG_DECL
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ))
+{
+ return this->ptr_->type_def (
+ ACE_ENV_SINGLE_ARG_PARAMETER
+ );
+}
+
+// TAO_IDL - Generated from
+// be\be_visitor_operation/tie_si.cpp:101
+
+template <class T> ACE_INLINE
+void POA_CORBA::ValueMemberDef_tie<T>::type_def (
+ ::CORBA::IDLType_ptr type_def
+ ACE_ENV_ARG_DECL
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ))
+{
+ this->ptr_->type_def (
+ type_def
+ ACE_ENV_ARG_PARAMETER
+ );
+}
+
+// TAO_IDL - Generated from
+// be\be_visitor_operation/tie_si.cpp:101
+
+template <class T> ACE_INLINE
+::CORBA::Visibility POA_CORBA::ValueMemberDef_tie<T>::access (
+ ACE_ENV_SINGLE_ARG_DECL
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ))
+{
+ return this->ptr_->access (
+ ACE_ENV_SINGLE_ARG_PARAMETER
+ );
+}
+
+// TAO_IDL - Generated from
+// be\be_visitor_operation/tie_si.cpp:101
+
+template <class T> ACE_INLINE
+void POA_CORBA::ValueMemberDef_tie<T>::access (
+ ::CORBA::Visibility access
+ ACE_ENV_ARG_DECL
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ))
+{
+ this->ptr_->access (
+ access
+ ACE_ENV_ARG_PARAMETER
+ );
+}
+
+// TAO_IDL - Generated from
+// be\be_visitor_interface/tie_si.cpp:96
+
+template <class T> ACE_INLINE
+POA_CORBA::ValueDef_tie<T>::ValueDef_tie (T &t)
+ : ptr_ (&t),
+ poa_ (PortableServer::POA::_nil ()),
+ rel_ (0)
+{}
+
+template <class T> ACE_INLINE
+POA_CORBA::ValueDef_tie<T>::ValueDef_tie (T &t, PortableServer::POA_ptr poa)
+ : ptr_ (&t),
+ poa_ (PortableServer::POA::_duplicate (poa)),
+ rel_ (0)
+{}
+
+template <class T> ACE_INLINE
+POA_CORBA::ValueDef_tie<T>::ValueDef_tie (T *tp, ::CORBA::Boolean release)
+ : ptr_ (tp),
+ poa_ (PortableServer::POA::_nil ()),
+ rel_ (release)
+{}
+
+template <class T> ACE_INLINE
+POA_CORBA::ValueDef_tie<T>::ValueDef_tie (T *tp, PortableServer::POA_ptr poa, ::CORBA::Boolean release)
+ : ptr_ (tp),
+ poa_ (PortableServer::POA::_duplicate (poa)),
+ rel_ (release)
+{}
+
+template <class T> ACE_INLINE
+POA_CORBA::ValueDef_tie<T>::~ValueDef_tie (void)
+{
+ if (this->rel_)
+ {
+ delete this->ptr_;
+ }
+}
+
+template <class T> ACE_INLINE T *
+POA_CORBA::ValueDef_tie<T>::_tied_object (void)
+{
+ return this->ptr_;
+}
+
+template <class T> ACE_INLINE void
+POA_CORBA::ValueDef_tie<T>::_tied_object (T &obj)
+{
+ if (this->rel_)
+ {
+ delete this->ptr_;
+ }
+
+ this->ptr_ = &obj;
+ this->rel_ = 0;
+}
+
+template <class T> ACE_INLINE void
+POA_CORBA::ValueDef_tie<T>::_tied_object (T *obj, ::CORBA::Boolean release)
+{
+ if (this->rel_)
+ {
+ delete this->ptr_;
+ }
+
+ this->ptr_ = obj;
+ this->rel_ = release;
+}
+
+template <class T> ACE_INLINE ::CORBA::Boolean
+POA_CORBA::ValueDef_tie<T>::_is_owner (void)
+{
+ return this->rel_;
+}
+
+template <class T> ACE_INLINE void
+POA_CORBA::ValueDef_tie<T>::_is_owner ( ::CORBA::Boolean b)
+{
+ this->rel_ = b;
+}
+
+template <class T> ACE_INLINE PortableServer::POA_ptr
+POA_CORBA::ValueDef_tie<T>::_default_POA (ACE_ENV_SINGLE_ARG_DECL)
+{
+ if (! ::CORBA::is_nil (this->poa_.in ()))
+ {
+ return PortableServer::POA::_duplicate (this->poa_.in ());
+ }
+
+ return this->ValueDef::_default_POA (ACE_ENV_SINGLE_ARG_PARAMETER);
+}
+
+// TAO_IDL - Generated from
+// be\be_visitor_operation/tie_si.cpp:101
+
+template <class T> ACE_INLINE
+::CORBA::DefinitionKind POA_CORBA::ValueDef_tie<T>::def_kind (
+ ACE_ENV_SINGLE_ARG_DECL
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ))
+{
+ return this->ptr_->def_kind (
+ ACE_ENV_SINGLE_ARG_PARAMETER
+ );
+}
+
+// TAO_IDL - Generated from
+// be\be_visitor_operation/tie_si.cpp:101
+
+template <class T> ACE_INLINE
+void POA_CORBA::ValueDef_tie<T>::destroy (
+ ACE_ENV_SINGLE_ARG_DECL
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ))
+{
+ this->ptr_->destroy (
+ ACE_ENV_SINGLE_ARG_PARAMETER
+ );
+}
+
+// TAO_IDL - Generated from
+// be\be_visitor_operation/tie_si.cpp:101
+
+template <class T> ACE_INLINE
+::CORBA::Contained_ptr POA_CORBA::ValueDef_tie<T>::lookup (
+ const char * search_name
+ ACE_ENV_ARG_DECL
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ))
+{
+ return this->ptr_->lookup (
+ search_name
+ ACE_ENV_ARG_PARAMETER
+ );
+}
+
+// TAO_IDL - Generated from
+// be\be_visitor_operation/tie_si.cpp:101
+
+template <class T> ACE_INLINE
+::CORBA::ContainedSeq * POA_CORBA::ValueDef_tie<T>::contents (
+ ::CORBA::DefinitionKind limit_type,
+ ::CORBA::Boolean exclude_inherited
+ ACE_ENV_ARG_DECL
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ))
+{
+ return this->ptr_->contents (
+ limit_type,
+ exclude_inherited
+ ACE_ENV_ARG_PARAMETER
+ );
+}
+
+// TAO_IDL - Generated from
+// be\be_visitor_operation/tie_si.cpp:101
+
+template <class T> ACE_INLINE
+::CORBA::ContainedSeq * POA_CORBA::ValueDef_tie<T>::lookup_name (
+ const char * search_name,
+ ::CORBA::Long levels_to_search,
+ ::CORBA::DefinitionKind limit_type,
+ ::CORBA::Boolean exclude_inherited
+ ACE_ENV_ARG_DECL
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ))
+{
+ return this->ptr_->lookup_name (
+ search_name,
+ levels_to_search,
+ limit_type,
+ exclude_inherited
+ ACE_ENV_ARG_PARAMETER
+ );
+}
+
+// TAO_IDL - Generated from
+// be\be_visitor_operation/tie_si.cpp:101
+
+template <class T> ACE_INLINE
+::CORBA::Container::DescriptionSeq * POA_CORBA::ValueDef_tie<T>::describe_contents (
+ ::CORBA::DefinitionKind limit_type,
+ ::CORBA::Boolean exclude_inherited,
+ ::CORBA::Long max_returned_objs
+ ACE_ENV_ARG_DECL
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ))
+{
+ return this->ptr_->describe_contents (
+ limit_type,
+ exclude_inherited,
+ max_returned_objs
+ ACE_ENV_ARG_PARAMETER
+ );
+}
+
+// TAO_IDL - Generated from
+// be\be_visitor_operation/tie_si.cpp:101
+
+template <class T> ACE_INLINE
+::CORBA::ModuleDef_ptr POA_CORBA::ValueDef_tie<T>::create_module (
+ const char * id,
+ const char * name,
+ const char * version
+ ACE_ENV_ARG_DECL
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ))
+{
+ return this->ptr_->create_module (
+ id,
+ name,
+ version
+ ACE_ENV_ARG_PARAMETER
+ );
+}
+
+// TAO_IDL - Generated from
+// be\be_visitor_operation/tie_si.cpp:101
+
+template <class T> ACE_INLINE
+::CORBA::ConstantDef_ptr POA_CORBA::ValueDef_tie<T>::create_constant (
+ const char * id,
+ const char * name,
+ const char * version,
+ ::CORBA::IDLType_ptr type,
+ const ::CORBA::Any & value
+ ACE_ENV_ARG_DECL
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ))
+{
+ return this->ptr_->create_constant (
+ id,
+ name,
+ version,
+ type,
+ value
+ ACE_ENV_ARG_PARAMETER
+ );
+}
+
+// TAO_IDL - Generated from
+// be\be_visitor_operation/tie_si.cpp:101
+
+template <class T> ACE_INLINE
+::CORBA::StructDef_ptr POA_CORBA::ValueDef_tie<T>::create_struct (
+ const char * id,
+ const char * name,
+ const char * version,
+ const ::CORBA::StructMemberSeq & members
+ ACE_ENV_ARG_DECL
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ))
+{
+ return this->ptr_->create_struct (
+ id,
+ name,
+ version,
+ members
+ ACE_ENV_ARG_PARAMETER
+ );
+}
+
+// TAO_IDL - Generated from
+// be\be_visitor_operation/tie_si.cpp:101
+
+template <class T> ACE_INLINE
+::CORBA::UnionDef_ptr POA_CORBA::ValueDef_tie<T>::create_union (
+ const char * id,
+ const char * name,
+ const char * version,
+ ::CORBA::IDLType_ptr discriminator_type,
+ const ::CORBA::UnionMemberSeq & members
+ ACE_ENV_ARG_DECL
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ))
+{
+ return this->ptr_->create_union (
+ id,
+ name,
+ version,
+ discriminator_type,
+ members
+ ACE_ENV_ARG_PARAMETER
+ );
+}
+
+// TAO_IDL - Generated from
+// be\be_visitor_operation/tie_si.cpp:101
+
+template <class T> ACE_INLINE
+::CORBA::EnumDef_ptr POA_CORBA::ValueDef_tie<T>::create_enum (
+ const char * id,
+ const char * name,
+ const char * version,
+ const ::CORBA::EnumMemberSeq & members
+ ACE_ENV_ARG_DECL
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ))
+{
+ return this->ptr_->create_enum (
+ id,
+ name,
+ version,
+ members
+ ACE_ENV_ARG_PARAMETER
+ );
+}
+
+// TAO_IDL - Generated from
+// be\be_visitor_operation/tie_si.cpp:101
+
+template <class T> ACE_INLINE
+::CORBA::AliasDef_ptr POA_CORBA::ValueDef_tie<T>::create_alias (
+ const char * id,
+ const char * name,
+ const char * version,
+ ::CORBA::IDLType_ptr original_type
+ ACE_ENV_ARG_DECL
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ))
+{
+ return this->ptr_->create_alias (
+ id,
+ name,
+ version,
+ original_type
+ ACE_ENV_ARG_PARAMETER
+ );
+}
+
+// TAO_IDL - Generated from
+// be\be_visitor_operation/tie_si.cpp:101
+
+template <class T> ACE_INLINE
+::CORBA::InterfaceDef_ptr POA_CORBA::ValueDef_tie<T>::create_interface (
+ const char * id,
+ const char * name,
+ const char * version,
+ const ::CORBA::InterfaceDefSeq & base_interfaces
+ ACE_ENV_ARG_DECL
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ))
+{
+ return this->ptr_->create_interface (
+ id,
+ name,
+ version,
+ base_interfaces
+ ACE_ENV_ARG_PARAMETER
+ );
+}
+
+// TAO_IDL - Generated from
+// be\be_visitor_operation/tie_si.cpp:101
+
+template <class T> ACE_INLINE
+::CORBA::ValueDef_ptr POA_CORBA::ValueDef_tie<T>::create_value (
+ const char * id,
+ const char * name,
+ const char * version,
+ ::CORBA::Boolean is_custom,
+ ::CORBA::Boolean is_abstract,
+ ::CORBA::ValueDef_ptr base_value,
+ ::CORBA::Boolean is_truncatable,
+ const ::CORBA::ValueDefSeq & abstract_base_values,
+ const ::CORBA::InterfaceDefSeq & supported_interfaces,
+ const ::CORBA::InitializerSeq & initializers
+ ACE_ENV_ARG_DECL
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ))
+{
+ return this->ptr_->create_value (
+ id,
+ name,
+ version,
+ is_custom,
+ is_abstract,
+ base_value,
+ is_truncatable,
+ abstract_base_values,
+ supported_interfaces,
+ initializers
+ ACE_ENV_ARG_PARAMETER
+ );
+}
+
+// TAO_IDL - Generated from
+// be\be_visitor_operation/tie_si.cpp:101
+
+template <class T> ACE_INLINE
+::CORBA::ValueBoxDef_ptr POA_CORBA::ValueDef_tie<T>::create_value_box (
+ const char * id,
+ const char * name,
+ const char * version,
+ ::CORBA::IDLType_ptr original_type_def
+ ACE_ENV_ARG_DECL
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ))
+{
+ return this->ptr_->create_value_box (
+ id,
+ name,
+ version,
+ original_type_def
+ ACE_ENV_ARG_PARAMETER
+ );
+}
+
+// TAO_IDL - Generated from
+// be\be_visitor_operation/tie_si.cpp:101
+
+template <class T> ACE_INLINE
+::CORBA::ExceptionDef_ptr POA_CORBA::ValueDef_tie<T>::create_exception (
+ const char * id,
+ const char * name,
+ const char * version,
+ const ::CORBA::StructMemberSeq & members
+ ACE_ENV_ARG_DECL
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ))
+{
+ return this->ptr_->create_exception (
+ id,
+ name,
+ version,
+ members
+ ACE_ENV_ARG_PARAMETER
+ );
+}
+
+// TAO_IDL - Generated from
+// be\be_visitor_operation/tie_si.cpp:101
+
+template <class T> ACE_INLINE
+::CORBA::NativeDef_ptr POA_CORBA::ValueDef_tie<T>::create_native (
+ const char * id,
+ const char * name,
+ const char * version
+ ACE_ENV_ARG_DECL
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ))
+{
+ return this->ptr_->create_native (
+ id,
+ name,
+ version
+ ACE_ENV_ARG_PARAMETER
+ );
+}
+
+// TAO_IDL - Generated from
+// be\be_visitor_operation/tie_si.cpp:101
+
+template <class T> ACE_INLINE
+::CORBA::AbstractInterfaceDef_ptr POA_CORBA::ValueDef_tie<T>::create_abstract_interface (
+ const char * id,
+ const char * name,
+ const char * version,
+ const ::CORBA::AbstractInterfaceDefSeq & base_interfaces
+ ACE_ENV_ARG_DECL
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ))
+{
+ return this->ptr_->create_abstract_interface (
+ id,
+ name,
+ version,
+ base_interfaces
+ ACE_ENV_ARG_PARAMETER
+ );
+}
+
+// TAO_IDL - Generated from
+// be\be_visitor_operation/tie_si.cpp:101
+
+template <class T> ACE_INLINE
+::CORBA::LocalInterfaceDef_ptr POA_CORBA::ValueDef_tie<T>::create_local_interface (
+ const char * id,
+ const char * name,
+ const char * version,
+ const ::CORBA::InterfaceDefSeq & base_interfaces
+ ACE_ENV_ARG_DECL
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ))
+{
+ return this->ptr_->create_local_interface (
+ id,
+ name,
+ version,
+ base_interfaces
+ ACE_ENV_ARG_PARAMETER
+ );
+}
+
+// TAO_IDL - Generated from
+// be\be_visitor_operation/tie_si.cpp:101
+
+template <class T> ACE_INLINE
+::CORBA::ExtValueDef_ptr POA_CORBA::ValueDef_tie<T>::create_ext_value (
+ const char * id,
+ const char * name,
+ const char * version,
+ ::CORBA::Boolean is_custom,
+ ::CORBA::Boolean is_abstract,
+ ::CORBA::ValueDef_ptr base_value,
+ ::CORBA::Boolean is_truncatable,
+ const ::CORBA::ValueDefSeq & abstract_base_values,
+ const ::CORBA::InterfaceDefSeq & supported_interfaces,
+ const ::CORBA::ExtInitializerSeq & initializers
+ ACE_ENV_ARG_DECL
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ))
+{
+ return this->ptr_->create_ext_value (
+ id,
+ name,
+ version,
+ is_custom,
+ is_abstract,
+ base_value,
+ is_truncatable,
+ abstract_base_values,
+ supported_interfaces,
+ initializers
+ ACE_ENV_ARG_PARAMETER
+ );
+}
+
+// TAO_IDL - Generated from
+// be\be_visitor_operation/tie_si.cpp:101
+
+template <class T> ACE_INLINE
+char * POA_CORBA::ValueDef_tie<T>::id (
+ ACE_ENV_SINGLE_ARG_DECL
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ))
+{
+ return this->ptr_->id (
+ ACE_ENV_SINGLE_ARG_PARAMETER
+ );
+}
+
+// TAO_IDL - Generated from
+// be\be_visitor_operation/tie_si.cpp:101
+
+template <class T> ACE_INLINE
+void POA_CORBA::ValueDef_tie<T>::id (
+ const char * id
+ ACE_ENV_ARG_DECL
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ))
+{
+ this->ptr_->id (
+ id
+ ACE_ENV_ARG_PARAMETER
+ );
+}
+
+// TAO_IDL - Generated from
+// be\be_visitor_operation/tie_si.cpp:101
+
+template <class T> ACE_INLINE
+char * POA_CORBA::ValueDef_tie<T>::name (
+ ACE_ENV_SINGLE_ARG_DECL
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ))
+{
+ return this->ptr_->name (
+ ACE_ENV_SINGLE_ARG_PARAMETER
+ );
+}
+
+// TAO_IDL - Generated from
+// be\be_visitor_operation/tie_si.cpp:101
+
+template <class T> ACE_INLINE
+void POA_CORBA::ValueDef_tie<T>::name (
+ const char * name
+ ACE_ENV_ARG_DECL
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ))
+{
+ this->ptr_->name (
+ name
+ ACE_ENV_ARG_PARAMETER
+ );
+}
+
+// TAO_IDL - Generated from
+// be\be_visitor_operation/tie_si.cpp:101
+
+template <class T> ACE_INLINE
+char * POA_CORBA::ValueDef_tie<T>::version (
+ ACE_ENV_SINGLE_ARG_DECL
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ))
+{
+ return this->ptr_->version (
+ ACE_ENV_SINGLE_ARG_PARAMETER
+ );
+}
+
+// TAO_IDL - Generated from
+// be\be_visitor_operation/tie_si.cpp:101
+
+template <class T> ACE_INLINE
+void POA_CORBA::ValueDef_tie<T>::version (
+ const char * version
+ ACE_ENV_ARG_DECL
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ))
+{
+ this->ptr_->version (
+ version
+ ACE_ENV_ARG_PARAMETER
+ );
+}
+
+// TAO_IDL - Generated from
+// be\be_visitor_operation/tie_si.cpp:101
+
+template <class T> ACE_INLINE
+::CORBA::Container_ptr POA_CORBA::ValueDef_tie<T>::defined_in (
+ ACE_ENV_SINGLE_ARG_DECL
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ))
+{
+ return this->ptr_->defined_in (
+ ACE_ENV_SINGLE_ARG_PARAMETER
+ );
+}
+
+// TAO_IDL - Generated from
+// be\be_visitor_operation/tie_si.cpp:101
+
+template <class T> ACE_INLINE
+char * POA_CORBA::ValueDef_tie<T>::absolute_name (
+ ACE_ENV_SINGLE_ARG_DECL
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ))
+{
+ return this->ptr_->absolute_name (
+ ACE_ENV_SINGLE_ARG_PARAMETER
+ );
+}
+
+// TAO_IDL - Generated from
+// be\be_visitor_operation/tie_si.cpp:101
+
+template <class T> ACE_INLINE
+::CORBA::Repository_ptr POA_CORBA::ValueDef_tie<T>::containing_repository (
+ ACE_ENV_SINGLE_ARG_DECL
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ))
+{
+ return this->ptr_->containing_repository (
+ ACE_ENV_SINGLE_ARG_PARAMETER
+ );
+}
+
+// TAO_IDL - Generated from
+// be\be_visitor_operation/tie_si.cpp:101
+
+template <class T> ACE_INLINE
+::CORBA::Contained::Description * POA_CORBA::ValueDef_tie<T>::describe (
+ ACE_ENV_SINGLE_ARG_DECL
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ))
+{
+ return this->ptr_->describe (
+ ACE_ENV_SINGLE_ARG_PARAMETER
+ );
+}
+
+// TAO_IDL - Generated from
+// be\be_visitor_operation/tie_si.cpp:101
+
+template <class T> ACE_INLINE
+void POA_CORBA::ValueDef_tie<T>::move (
+ ::CORBA::Container_ptr new_container,
+ const char * new_name,
+ const char * new_version
+ ACE_ENV_ARG_DECL
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ))
+{
+ this->ptr_->move (
+ new_container,
+ new_name,
+ new_version
+ ACE_ENV_ARG_PARAMETER
+ );
+}
+
+// TAO_IDL - Generated from
+// be\be_visitor_operation/tie_si.cpp:101
+
+template <class T> ACE_INLINE
+::CORBA::TypeCode_ptr POA_CORBA::ValueDef_tie<T>::type (
+ ACE_ENV_SINGLE_ARG_DECL
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ))
+{
+ return this->ptr_->type (
+ ACE_ENV_SINGLE_ARG_PARAMETER
+ );
+}
+
+// TAO_IDL - Generated from
+// be\be_visitor_operation/tie_si.cpp:101
+
+template <class T> ACE_INLINE
+::CORBA::InterfaceDefSeq * POA_CORBA::ValueDef_tie<T>::supported_interfaces (
+ ACE_ENV_SINGLE_ARG_DECL
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ))
+{
+ return this->ptr_->supported_interfaces (
+ ACE_ENV_SINGLE_ARG_PARAMETER
+ );
+}
+
+// TAO_IDL - Generated from
+// be\be_visitor_operation/tie_si.cpp:101
+
+template <class T> ACE_INLINE
+void POA_CORBA::ValueDef_tie<T>::supported_interfaces (
+ const ::CORBA::InterfaceDefSeq & supported_interfaces
+ ACE_ENV_ARG_DECL
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ))
+{
+ this->ptr_->supported_interfaces (
+ supported_interfaces
+ ACE_ENV_ARG_PARAMETER
+ );
+}
+
+// TAO_IDL - Generated from
+// be\be_visitor_operation/tie_si.cpp:101
+
+template <class T> ACE_INLINE
+::CORBA::InitializerSeq * POA_CORBA::ValueDef_tie<T>::initializers (
+ ACE_ENV_SINGLE_ARG_DECL
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ))
+{
+ return this->ptr_->initializers (
+ ACE_ENV_SINGLE_ARG_PARAMETER
+ );
+}
+
+// TAO_IDL - Generated from
+// be\be_visitor_operation/tie_si.cpp:101
+
+template <class T> ACE_INLINE
+void POA_CORBA::ValueDef_tie<T>::initializers (
+ const ::CORBA::InitializerSeq & initializers
+ ACE_ENV_ARG_DECL
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ))
+{
+ this->ptr_->initializers (
+ initializers
+ ACE_ENV_ARG_PARAMETER
+ );
+}
+
+// TAO_IDL - Generated from
+// be\be_visitor_operation/tie_si.cpp:101
+
+template <class T> ACE_INLINE
+::CORBA::ValueDef_ptr POA_CORBA::ValueDef_tie<T>::base_value (
+ ACE_ENV_SINGLE_ARG_DECL
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ))
+{
+ return this->ptr_->base_value (
+ ACE_ENV_SINGLE_ARG_PARAMETER
+ );
+}
+
+// TAO_IDL - Generated from
+// be\be_visitor_operation/tie_si.cpp:101
+
+template <class T> ACE_INLINE
+void POA_CORBA::ValueDef_tie<T>::base_value (
+ ::CORBA::ValueDef_ptr base_value
+ ACE_ENV_ARG_DECL
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ))
+{
+ this->ptr_->base_value (
+ base_value
+ ACE_ENV_ARG_PARAMETER
+ );
+}
+
+// TAO_IDL - Generated from
+// be\be_visitor_operation/tie_si.cpp:101
+
+template <class T> ACE_INLINE
+::CORBA::ValueDefSeq * POA_CORBA::ValueDef_tie<T>::abstract_base_values (
+ ACE_ENV_SINGLE_ARG_DECL
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ))
+{
+ return this->ptr_->abstract_base_values (
+ ACE_ENV_SINGLE_ARG_PARAMETER
+ );
+}
+
+// TAO_IDL - Generated from
+// be\be_visitor_operation/tie_si.cpp:101
+
+template <class T> ACE_INLINE
+void POA_CORBA::ValueDef_tie<T>::abstract_base_values (
+ const ::CORBA::ValueDefSeq & abstract_base_values
+ ACE_ENV_ARG_DECL
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ))
+{
+ this->ptr_->abstract_base_values (
+ abstract_base_values
+ ACE_ENV_ARG_PARAMETER
+ );
+}
+
+// TAO_IDL - Generated from
+// be\be_visitor_operation/tie_si.cpp:101
+
+template <class T> ACE_INLINE
+::CORBA::Boolean POA_CORBA::ValueDef_tie<T>::is_abstract (
+ ACE_ENV_SINGLE_ARG_DECL
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ))
+{
+ return this->ptr_->is_abstract (
+ ACE_ENV_SINGLE_ARG_PARAMETER
+ );
+}
+
+// TAO_IDL - Generated from
+// be\be_visitor_operation/tie_si.cpp:101
+
+template <class T> ACE_INLINE
+void POA_CORBA::ValueDef_tie<T>::is_abstract (
+ ::CORBA::Boolean is_abstract
+ ACE_ENV_ARG_DECL
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ))
+{
+ this->ptr_->is_abstract (
+ is_abstract
+ ACE_ENV_ARG_PARAMETER
+ );
+}
+
+// TAO_IDL - Generated from
+// be\be_visitor_operation/tie_si.cpp:101
+
+template <class T> ACE_INLINE
+::CORBA::Boolean POA_CORBA::ValueDef_tie<T>::is_custom (
+ ACE_ENV_SINGLE_ARG_DECL
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ))
+{
+ return this->ptr_->is_custom (
+ ACE_ENV_SINGLE_ARG_PARAMETER
+ );
+}
+
+// TAO_IDL - Generated from
+// be\be_visitor_operation/tie_si.cpp:101
+
+template <class T> ACE_INLINE
+void POA_CORBA::ValueDef_tie<T>::is_custom (
+ ::CORBA::Boolean is_custom
+ ACE_ENV_ARG_DECL
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ))
+{
+ this->ptr_->is_custom (
+ is_custom
+ ACE_ENV_ARG_PARAMETER
+ );
+}
+
+// TAO_IDL - Generated from
+// be\be_visitor_operation/tie_si.cpp:101
+
+template <class T> ACE_INLINE
+::CORBA::Boolean POA_CORBA::ValueDef_tie<T>::is_truncatable (
+ ACE_ENV_SINGLE_ARG_DECL
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ))
+{
+ return this->ptr_->is_truncatable (
+ ACE_ENV_SINGLE_ARG_PARAMETER
+ );
+}
+
+// TAO_IDL - Generated from
+// be\be_visitor_operation/tie_si.cpp:101
+
+template <class T> ACE_INLINE
+void POA_CORBA::ValueDef_tie<T>::is_truncatable (
+ ::CORBA::Boolean is_truncatable
+ ACE_ENV_ARG_DECL
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ))
+{
+ this->ptr_->is_truncatable (
+ is_truncatable
+ ACE_ENV_ARG_PARAMETER
+ );
+}
+
+// TAO_IDL - Generated from
+// be\be_visitor_operation/tie_si.cpp:101
+
+template <class T> ACE_INLINE
+::CORBA::Boolean POA_CORBA::ValueDef_tie<T>::is_a (
+ const char * id
+ ACE_ENV_ARG_DECL
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ))
+{
+ return this->ptr_->is_a (
+ id
+ ACE_ENV_ARG_PARAMETER
+ );
+}
+
+// TAO_IDL - Generated from
+// be\be_visitor_operation/tie_si.cpp:101
+
+template <class T> ACE_INLINE
+::CORBA::ValueDef::FullValueDescription * POA_CORBA::ValueDef_tie<T>::describe_value (
+ ACE_ENV_SINGLE_ARG_DECL
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ))
+{
+ return this->ptr_->describe_value (
+ ACE_ENV_SINGLE_ARG_PARAMETER
+ );
+}
+
+// TAO_IDL - Generated from
+// be\be_visitor_operation/tie_si.cpp:101
+
+template <class T> ACE_INLINE
+::CORBA::ValueMemberDef_ptr POA_CORBA::ValueDef_tie<T>::create_value_member (
+ const char * id,
+ const char * name,
+ const char * version,
+ ::CORBA::IDLType_ptr type,
+ ::CORBA::Visibility access
+ ACE_ENV_ARG_DECL
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ))
+{
+ return this->ptr_->create_value_member (
+ id,
+ name,
+ version,
+ type,
+ access
+ ACE_ENV_ARG_PARAMETER
+ );
+}
+
+// TAO_IDL - Generated from
+// be\be_visitor_operation/tie_si.cpp:101
+
+template <class T> ACE_INLINE
+::CORBA::AttributeDef_ptr POA_CORBA::ValueDef_tie<T>::create_attribute (
+ const char * id,
+ const char * name,
+ const char * version,
+ ::CORBA::IDLType_ptr type,
+ ::CORBA::AttributeMode mode
+ ACE_ENV_ARG_DECL
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ))
+{
+ return this->ptr_->create_attribute (
+ id,
+ name,
+ version,
+ type,
+ mode
+ ACE_ENV_ARG_PARAMETER
+ );
+}
+
+// TAO_IDL - Generated from
+// be\be_visitor_operation/tie_si.cpp:101
+
+template <class T> ACE_INLINE
+::CORBA::OperationDef_ptr POA_CORBA::ValueDef_tie<T>::create_operation (
+ const char * id,
+ const char * name,
+ const char * version,
+ ::CORBA::IDLType_ptr result,
+ ::CORBA::OperationMode mode,
+ const ::CORBA::ParDescriptionSeq & params,
+ const ::CORBA::ExceptionDefSeq & exceptions,
+ const ::CORBA::ContextIdSeq & contexts
+ ACE_ENV_ARG_DECL
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ))
+{
+ return this->ptr_->create_operation (
+ id,
+ name,
+ version,
+ result,
+ mode,
+ params,
+ exceptions,
+ contexts
+ ACE_ENV_ARG_PARAMETER
+ );
+}
+
+// TAO_IDL - Generated from
+// be\be_visitor_interface/tie_si.cpp:96
+
+template <class T> ACE_INLINE
+POA_CORBA::ExtValueDef_tie<T>::ExtValueDef_tie (T &t)
+ : ptr_ (&t),
+ poa_ (PortableServer::POA::_nil ()),
+ rel_ (0)
+{}
+
+template <class T> ACE_INLINE
+POA_CORBA::ExtValueDef_tie<T>::ExtValueDef_tie (T &t, PortableServer::POA_ptr poa)
+ : ptr_ (&t),
+ poa_ (PortableServer::POA::_duplicate (poa)),
+ rel_ (0)
+{}
+
+template <class T> ACE_INLINE
+POA_CORBA::ExtValueDef_tie<T>::ExtValueDef_tie (T *tp, ::CORBA::Boolean release)
+ : ptr_ (tp),
+ poa_ (PortableServer::POA::_nil ()),
+ rel_ (release)
+{}
+
+template <class T> ACE_INLINE
+POA_CORBA::ExtValueDef_tie<T>::ExtValueDef_tie (T *tp, PortableServer::POA_ptr poa, ::CORBA::Boolean release)
+ : ptr_ (tp),
+ poa_ (PortableServer::POA::_duplicate (poa)),
+ rel_ (release)
+{}
+
+template <class T> ACE_INLINE
+POA_CORBA::ExtValueDef_tie<T>::~ExtValueDef_tie (void)
+{
+ if (this->rel_)
+ {
+ delete this->ptr_;
+ }
+}
+
+template <class T> ACE_INLINE T *
+POA_CORBA::ExtValueDef_tie<T>::_tied_object (void)
+{
+ return this->ptr_;
+}
+
+template <class T> ACE_INLINE void
+POA_CORBA::ExtValueDef_tie<T>::_tied_object (T &obj)
+{
+ if (this->rel_)
+ {
+ delete this->ptr_;
+ }
+
+ this->ptr_ = &obj;
+ this->rel_ = 0;
+}
+
+template <class T> ACE_INLINE void
+POA_CORBA::ExtValueDef_tie<T>::_tied_object (T *obj, ::CORBA::Boolean release)
+{
+ if (this->rel_)
+ {
+ delete this->ptr_;
+ }
+
+ this->ptr_ = obj;
+ this->rel_ = release;
+}
+
+template <class T> ACE_INLINE ::CORBA::Boolean
+POA_CORBA::ExtValueDef_tie<T>::_is_owner (void)
+{
+ return this->rel_;
+}
+
+template <class T> ACE_INLINE void
+POA_CORBA::ExtValueDef_tie<T>::_is_owner ( ::CORBA::Boolean b)
+{
+ this->rel_ = b;
+}
+
+template <class T> ACE_INLINE PortableServer::POA_ptr
+POA_CORBA::ExtValueDef_tie<T>::_default_POA (ACE_ENV_SINGLE_ARG_DECL)
+{
+ if (! ::CORBA::is_nil (this->poa_.in ()))
+ {
+ return PortableServer::POA::_duplicate (this->poa_.in ());
+ }
+
+ return this->ExtValueDef::_default_POA (ACE_ENV_SINGLE_ARG_PARAMETER);
+}
+
+// TAO_IDL - Generated from
+// be\be_visitor_operation/tie_si.cpp:101
+
+template <class T> ACE_INLINE
+::CORBA::DefinitionKind POA_CORBA::ExtValueDef_tie<T>::def_kind (
+ ACE_ENV_SINGLE_ARG_DECL
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ))
+{
+ return this->ptr_->def_kind (
+ ACE_ENV_SINGLE_ARG_PARAMETER
+ );
+}
+
+// TAO_IDL - Generated from
+// be\be_visitor_operation/tie_si.cpp:101
+
+template <class T> ACE_INLINE
+void POA_CORBA::ExtValueDef_tie<T>::destroy (
+ ACE_ENV_SINGLE_ARG_DECL
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ))
+{
+ this->ptr_->destroy (
+ ACE_ENV_SINGLE_ARG_PARAMETER
+ );
+}
+
+// TAO_IDL - Generated from
+// be\be_visitor_operation/tie_si.cpp:101
+
+template <class T> ACE_INLINE
+::CORBA::Contained_ptr POA_CORBA::ExtValueDef_tie<T>::lookup (
+ const char * search_name
+ ACE_ENV_ARG_DECL
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ))
+{
+ return this->ptr_->lookup (
+ search_name
+ ACE_ENV_ARG_PARAMETER
+ );
+}
+
+// TAO_IDL - Generated from
+// be\be_visitor_operation/tie_si.cpp:101
+
+template <class T> ACE_INLINE
+::CORBA::ContainedSeq * POA_CORBA::ExtValueDef_tie<T>::contents (
+ ::CORBA::DefinitionKind limit_type,
+ ::CORBA::Boolean exclude_inherited
+ ACE_ENV_ARG_DECL
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ))
+{
+ return this->ptr_->contents (
+ limit_type,
+ exclude_inherited
+ ACE_ENV_ARG_PARAMETER
+ );
+}
+
+// TAO_IDL - Generated from
+// be\be_visitor_operation/tie_si.cpp:101
+
+template <class T> ACE_INLINE
+::CORBA::ContainedSeq * POA_CORBA::ExtValueDef_tie<T>::lookup_name (
+ const char * search_name,
+ ::CORBA::Long levels_to_search,
+ ::CORBA::DefinitionKind limit_type,
+ ::CORBA::Boolean exclude_inherited
+ ACE_ENV_ARG_DECL
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ))
+{
+ return this->ptr_->lookup_name (
+ search_name,
+ levels_to_search,
+ limit_type,
+ exclude_inherited
+ ACE_ENV_ARG_PARAMETER
+ );
+}
+
+// TAO_IDL - Generated from
+// be\be_visitor_operation/tie_si.cpp:101
+
+template <class T> ACE_INLINE
+::CORBA::Container::DescriptionSeq * POA_CORBA::ExtValueDef_tie<T>::describe_contents (
+ ::CORBA::DefinitionKind limit_type,
+ ::CORBA::Boolean exclude_inherited,
+ ::CORBA::Long max_returned_objs
+ ACE_ENV_ARG_DECL
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ))
+{
+ return this->ptr_->describe_contents (
+ limit_type,
+ exclude_inherited,
+ max_returned_objs
+ ACE_ENV_ARG_PARAMETER
+ );
+}
+
+// TAO_IDL - Generated from
+// be\be_visitor_operation/tie_si.cpp:101
+
+template <class T> ACE_INLINE
+::CORBA::ModuleDef_ptr POA_CORBA::ExtValueDef_tie<T>::create_module (
+ const char * id,
+ const char * name,
+ const char * version
+ ACE_ENV_ARG_DECL
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ))
+{
+ return this->ptr_->create_module (
+ id,
+ name,
+ version
+ ACE_ENV_ARG_PARAMETER
+ );
+}
+
+// TAO_IDL - Generated from
+// be\be_visitor_operation/tie_si.cpp:101
+
+template <class T> ACE_INLINE
+::CORBA::ConstantDef_ptr POA_CORBA::ExtValueDef_tie<T>::create_constant (
+ const char * id,
+ const char * name,
+ const char * version,
+ ::CORBA::IDLType_ptr type,
+ const ::CORBA::Any & value
+ ACE_ENV_ARG_DECL
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ))
+{
+ return this->ptr_->create_constant (
+ id,
+ name,
+ version,
+ type,
+ value
+ ACE_ENV_ARG_PARAMETER
+ );
+}
+
+// TAO_IDL - Generated from
+// be\be_visitor_operation/tie_si.cpp:101
+
+template <class T> ACE_INLINE
+::CORBA::StructDef_ptr POA_CORBA::ExtValueDef_tie<T>::create_struct (
+ const char * id,
+ const char * name,
+ const char * version,
+ const ::CORBA::StructMemberSeq & members
+ ACE_ENV_ARG_DECL
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ))
+{
+ return this->ptr_->create_struct (
+ id,
+ name,
+ version,
+ members
+ ACE_ENV_ARG_PARAMETER
+ );
+}
+
+// TAO_IDL - Generated from
+// be\be_visitor_operation/tie_si.cpp:101
+
+template <class T> ACE_INLINE
+::CORBA::UnionDef_ptr POA_CORBA::ExtValueDef_tie<T>::create_union (
+ const char * id,
+ const char * name,
+ const char * version,
+ ::CORBA::IDLType_ptr discriminator_type,
+ const ::CORBA::UnionMemberSeq & members
+ ACE_ENV_ARG_DECL
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ))
+{
+ return this->ptr_->create_union (
+ id,
+ name,
+ version,
+ discriminator_type,
+ members
+ ACE_ENV_ARG_PARAMETER
+ );
+}
+
+// TAO_IDL - Generated from
+// be\be_visitor_operation/tie_si.cpp:101
+
+template <class T> ACE_INLINE
+::CORBA::EnumDef_ptr POA_CORBA::ExtValueDef_tie<T>::create_enum (
+ const char * id,
+ const char * name,
+ const char * version,
+ const ::CORBA::EnumMemberSeq & members
+ ACE_ENV_ARG_DECL
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ))
+{
+ return this->ptr_->create_enum (
+ id,
+ name,
+ version,
+ members
+ ACE_ENV_ARG_PARAMETER
+ );
+}
+
+// TAO_IDL - Generated from
+// be\be_visitor_operation/tie_si.cpp:101
+
+template <class T> ACE_INLINE
+::CORBA::AliasDef_ptr POA_CORBA::ExtValueDef_tie<T>::create_alias (
+ const char * id,
+ const char * name,
+ const char * version,
+ ::CORBA::IDLType_ptr original_type
+ ACE_ENV_ARG_DECL
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ))
+{
+ return this->ptr_->create_alias (
+ id,
+ name,
+ version,
+ original_type
+ ACE_ENV_ARG_PARAMETER
+ );
+}
+
+// TAO_IDL - Generated from
+// be\be_visitor_operation/tie_si.cpp:101
+
+template <class T> ACE_INLINE
+::CORBA::InterfaceDef_ptr POA_CORBA::ExtValueDef_tie<T>::create_interface (
+ const char * id,
+ const char * name,
+ const char * version,
+ const ::CORBA::InterfaceDefSeq & base_interfaces
+ ACE_ENV_ARG_DECL
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ))
+{
+ return this->ptr_->create_interface (
+ id,
+ name,
+ version,
+ base_interfaces
+ ACE_ENV_ARG_PARAMETER
+ );
+}
+
+// TAO_IDL - Generated from
+// be\be_visitor_operation/tie_si.cpp:101
+
+template <class T> ACE_INLINE
+::CORBA::ValueDef_ptr POA_CORBA::ExtValueDef_tie<T>::create_value (
+ const char * id,
+ const char * name,
+ const char * version,
+ ::CORBA::Boolean is_custom,
+ ::CORBA::Boolean is_abstract,
+ ::CORBA::ValueDef_ptr base_value,
+ ::CORBA::Boolean is_truncatable,
+ const ::CORBA::ValueDefSeq & abstract_base_values,
+ const ::CORBA::InterfaceDefSeq & supported_interfaces,
+ const ::CORBA::InitializerSeq & initializers
+ ACE_ENV_ARG_DECL
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ))
+{
+ return this->ptr_->create_value (
+ id,
+ name,
+ version,
+ is_custom,
+ is_abstract,
+ base_value,
+ is_truncatable,
+ abstract_base_values,
+ supported_interfaces,
+ initializers
+ ACE_ENV_ARG_PARAMETER
+ );
+}
+
+// TAO_IDL - Generated from
+// be\be_visitor_operation/tie_si.cpp:101
+
+template <class T> ACE_INLINE
+::CORBA::ValueBoxDef_ptr POA_CORBA::ExtValueDef_tie<T>::create_value_box (
+ const char * id,
+ const char * name,
+ const char * version,
+ ::CORBA::IDLType_ptr original_type_def
+ ACE_ENV_ARG_DECL
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ))
+{
+ return this->ptr_->create_value_box (
+ id,
+ name,
+ version,
+ original_type_def
+ ACE_ENV_ARG_PARAMETER
+ );
+}
+
+// TAO_IDL - Generated from
+// be\be_visitor_operation/tie_si.cpp:101
+
+template <class T> ACE_INLINE
+::CORBA::ExceptionDef_ptr POA_CORBA::ExtValueDef_tie<T>::create_exception (
+ const char * id,
+ const char * name,
+ const char * version,
+ const ::CORBA::StructMemberSeq & members
+ ACE_ENV_ARG_DECL
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ))
+{
+ return this->ptr_->create_exception (
+ id,
+ name,
+ version,
+ members
+ ACE_ENV_ARG_PARAMETER
+ );
+}
+
+// TAO_IDL - Generated from
+// be\be_visitor_operation/tie_si.cpp:101
+
+template <class T> ACE_INLINE
+::CORBA::NativeDef_ptr POA_CORBA::ExtValueDef_tie<T>::create_native (
+ const char * id,
+ const char * name,
+ const char * version
+ ACE_ENV_ARG_DECL
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ))
+{
+ return this->ptr_->create_native (
+ id,
+ name,
+ version
+ ACE_ENV_ARG_PARAMETER
+ );
+}
+
+// TAO_IDL - Generated from
+// be\be_visitor_operation/tie_si.cpp:101
+
+template <class T> ACE_INLINE
+::CORBA::AbstractInterfaceDef_ptr POA_CORBA::ExtValueDef_tie<T>::create_abstract_interface (
+ const char * id,
+ const char * name,
+ const char * version,
+ const ::CORBA::AbstractInterfaceDefSeq & base_interfaces
+ ACE_ENV_ARG_DECL
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ))
+{
+ return this->ptr_->create_abstract_interface (
+ id,
+ name,
+ version,
+ base_interfaces
+ ACE_ENV_ARG_PARAMETER
+ );
+}
+
+// TAO_IDL - Generated from
+// be\be_visitor_operation/tie_si.cpp:101
+
+template <class T> ACE_INLINE
+::CORBA::LocalInterfaceDef_ptr POA_CORBA::ExtValueDef_tie<T>::create_local_interface (
+ const char * id,
+ const char * name,
+ const char * version,
+ const ::CORBA::InterfaceDefSeq & base_interfaces
+ ACE_ENV_ARG_DECL
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ))
+{
+ return this->ptr_->create_local_interface (
+ id,
+ name,
+ version,
+ base_interfaces
+ ACE_ENV_ARG_PARAMETER
+ );
+}
+
+// TAO_IDL - Generated from
+// be\be_visitor_operation/tie_si.cpp:101
+
+template <class T> ACE_INLINE
+::CORBA::ExtValueDef_ptr POA_CORBA::ExtValueDef_tie<T>::create_ext_value (
+ const char * id,
+ const char * name,
+ const char * version,
+ ::CORBA::Boolean is_custom,
+ ::CORBA::Boolean is_abstract,
+ ::CORBA::ValueDef_ptr base_value,
+ ::CORBA::Boolean is_truncatable,
+ const ::CORBA::ValueDefSeq & abstract_base_values,
+ const ::CORBA::InterfaceDefSeq & supported_interfaces,
+ const ::CORBA::ExtInitializerSeq & initializers
+ ACE_ENV_ARG_DECL
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ))
+{
+ return this->ptr_->create_ext_value (
+ id,
+ name,
+ version,
+ is_custom,
+ is_abstract,
+ base_value,
+ is_truncatable,
+ abstract_base_values,
+ supported_interfaces,
+ initializers
+ ACE_ENV_ARG_PARAMETER
+ );
+}
+
+// TAO_IDL - Generated from
+// be\be_visitor_operation/tie_si.cpp:101
+
+template <class T> ACE_INLINE
+char * POA_CORBA::ExtValueDef_tie<T>::id (
+ ACE_ENV_SINGLE_ARG_DECL
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ))
+{
+ return this->ptr_->id (
+ ACE_ENV_SINGLE_ARG_PARAMETER
+ );
+}
+
+// TAO_IDL - Generated from
+// be\be_visitor_operation/tie_si.cpp:101
+
+template <class T> ACE_INLINE
+void POA_CORBA::ExtValueDef_tie<T>::id (
+ const char * id
+ ACE_ENV_ARG_DECL
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ))
+{
+ this->ptr_->id (
+ id
+ ACE_ENV_ARG_PARAMETER
+ );
+}
+
+// TAO_IDL - Generated from
+// be\be_visitor_operation/tie_si.cpp:101
+
+template <class T> ACE_INLINE
+char * POA_CORBA::ExtValueDef_tie<T>::name (
+ ACE_ENV_SINGLE_ARG_DECL
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ))
+{
+ return this->ptr_->name (
+ ACE_ENV_SINGLE_ARG_PARAMETER
+ );
+}
+
+// TAO_IDL - Generated from
+// be\be_visitor_operation/tie_si.cpp:101
+
+template <class T> ACE_INLINE
+void POA_CORBA::ExtValueDef_tie<T>::name (
+ const char * name
+ ACE_ENV_ARG_DECL
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ))
+{
+ this->ptr_->name (
+ name
+ ACE_ENV_ARG_PARAMETER
+ );
+}
+
+// TAO_IDL - Generated from
+// be\be_visitor_operation/tie_si.cpp:101
+
+template <class T> ACE_INLINE
+char * POA_CORBA::ExtValueDef_tie<T>::version (
+ ACE_ENV_SINGLE_ARG_DECL
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ))
+{
+ return this->ptr_->version (
+ ACE_ENV_SINGLE_ARG_PARAMETER
+ );
+}
+
+// TAO_IDL - Generated from
+// be\be_visitor_operation/tie_si.cpp:101
+
+template <class T> ACE_INLINE
+void POA_CORBA::ExtValueDef_tie<T>::version (
+ const char * version
+ ACE_ENV_ARG_DECL
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ))
+{
+ this->ptr_->version (
+ version
+ ACE_ENV_ARG_PARAMETER
+ );
+}
+
+// TAO_IDL - Generated from
+// be\be_visitor_operation/tie_si.cpp:101
+
+template <class T> ACE_INLINE
+::CORBA::Container_ptr POA_CORBA::ExtValueDef_tie<T>::defined_in (
+ ACE_ENV_SINGLE_ARG_DECL
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ))
+{
+ return this->ptr_->defined_in (
+ ACE_ENV_SINGLE_ARG_PARAMETER
+ );
+}
+
+// TAO_IDL - Generated from
+// be\be_visitor_operation/tie_si.cpp:101
+
+template <class T> ACE_INLINE
+char * POA_CORBA::ExtValueDef_tie<T>::absolute_name (
+ ACE_ENV_SINGLE_ARG_DECL
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ))
+{
+ return this->ptr_->absolute_name (
+ ACE_ENV_SINGLE_ARG_PARAMETER
+ );
+}
+
+// TAO_IDL - Generated from
+// be\be_visitor_operation/tie_si.cpp:101
+
+template <class T> ACE_INLINE
+::CORBA::Repository_ptr POA_CORBA::ExtValueDef_tie<T>::containing_repository (
+ ACE_ENV_SINGLE_ARG_DECL
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ))
+{
+ return this->ptr_->containing_repository (
+ ACE_ENV_SINGLE_ARG_PARAMETER
+ );
+}
+
+// TAO_IDL - Generated from
+// be\be_visitor_operation/tie_si.cpp:101
+
+template <class T> ACE_INLINE
+::CORBA::Contained::Description * POA_CORBA::ExtValueDef_tie<T>::describe (
+ ACE_ENV_SINGLE_ARG_DECL
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ))
+{
+ return this->ptr_->describe (
+ ACE_ENV_SINGLE_ARG_PARAMETER
+ );
+}
+
+// TAO_IDL - Generated from
+// be\be_visitor_operation/tie_si.cpp:101
+
+template <class T> ACE_INLINE
+void POA_CORBA::ExtValueDef_tie<T>::move (
+ ::CORBA::Container_ptr new_container,
+ const char * new_name,
+ const char * new_version
+ ACE_ENV_ARG_DECL
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ))
+{
+ this->ptr_->move (
+ new_container,
+ new_name,
+ new_version
+ ACE_ENV_ARG_PARAMETER
+ );
+}
+
+// TAO_IDL - Generated from
+// be\be_visitor_operation/tie_si.cpp:101
+
+template <class T> ACE_INLINE
+::CORBA::TypeCode_ptr POA_CORBA::ExtValueDef_tie<T>::type (
+ ACE_ENV_SINGLE_ARG_DECL
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ))
+{
+ return this->ptr_->type (
+ ACE_ENV_SINGLE_ARG_PARAMETER
+ );
+}
+
+// TAO_IDL - Generated from
+// be\be_visitor_operation/tie_si.cpp:101
+
+template <class T> ACE_INLINE
+::CORBA::InterfaceDefSeq * POA_CORBA::ExtValueDef_tie<T>::supported_interfaces (
+ ACE_ENV_SINGLE_ARG_DECL
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ))
+{
+ return this->ptr_->supported_interfaces (
+ ACE_ENV_SINGLE_ARG_PARAMETER
+ );
+}
+
+// TAO_IDL - Generated from
+// be\be_visitor_operation/tie_si.cpp:101
+
+template <class T> ACE_INLINE
+void POA_CORBA::ExtValueDef_tie<T>::supported_interfaces (
+ const ::CORBA::InterfaceDefSeq & supported_interfaces
+ ACE_ENV_ARG_DECL
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ))
+{
+ this->ptr_->supported_interfaces (
+ supported_interfaces
+ ACE_ENV_ARG_PARAMETER
+ );
+}
+
+// TAO_IDL - Generated from
+// be\be_visitor_operation/tie_si.cpp:101
+
+template <class T> ACE_INLINE
+::CORBA::InitializerSeq * POA_CORBA::ExtValueDef_tie<T>::initializers (
+ ACE_ENV_SINGLE_ARG_DECL
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ))
+{
+ return this->ptr_->initializers (
+ ACE_ENV_SINGLE_ARG_PARAMETER
+ );
+}
+
+// TAO_IDL - Generated from
+// be\be_visitor_operation/tie_si.cpp:101
+
+template <class T> ACE_INLINE
+void POA_CORBA::ExtValueDef_tie<T>::initializers (
+ const ::CORBA::InitializerSeq & initializers
+ ACE_ENV_ARG_DECL
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ))
+{
+ this->ptr_->initializers (
+ initializers
+ ACE_ENV_ARG_PARAMETER
+ );
+}
+
+// TAO_IDL - Generated from
+// be\be_visitor_operation/tie_si.cpp:101
+
+template <class T> ACE_INLINE
+::CORBA::ValueDef_ptr POA_CORBA::ExtValueDef_tie<T>::base_value (
+ ACE_ENV_SINGLE_ARG_DECL
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ))
+{
+ return this->ptr_->base_value (
+ ACE_ENV_SINGLE_ARG_PARAMETER
+ );
+}
+
+// TAO_IDL - Generated from
+// be\be_visitor_operation/tie_si.cpp:101
+
+template <class T> ACE_INLINE
+void POA_CORBA::ExtValueDef_tie<T>::base_value (
+ ::CORBA::ValueDef_ptr base_value
+ ACE_ENV_ARG_DECL
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ))
+{
+ this->ptr_->base_value (
+ base_value
+ ACE_ENV_ARG_PARAMETER
+ );
+}
+
+// TAO_IDL - Generated from
+// be\be_visitor_operation/tie_si.cpp:101
+
+template <class T> ACE_INLINE
+::CORBA::ValueDefSeq * POA_CORBA::ExtValueDef_tie<T>::abstract_base_values (
+ ACE_ENV_SINGLE_ARG_DECL
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ))
+{
+ return this->ptr_->abstract_base_values (
+ ACE_ENV_SINGLE_ARG_PARAMETER
+ );
+}
+
+// TAO_IDL - Generated from
+// be\be_visitor_operation/tie_si.cpp:101
+
+template <class T> ACE_INLINE
+void POA_CORBA::ExtValueDef_tie<T>::abstract_base_values (
+ const ::CORBA::ValueDefSeq & abstract_base_values
+ ACE_ENV_ARG_DECL
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ))
+{
+ this->ptr_->abstract_base_values (
+ abstract_base_values
+ ACE_ENV_ARG_PARAMETER
+ );
+}
+
+// TAO_IDL - Generated from
+// be\be_visitor_operation/tie_si.cpp:101
+
+template <class T> ACE_INLINE
+::CORBA::Boolean POA_CORBA::ExtValueDef_tie<T>::is_abstract (
+ ACE_ENV_SINGLE_ARG_DECL
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ))
+{
+ return this->ptr_->is_abstract (
+ ACE_ENV_SINGLE_ARG_PARAMETER
+ );
+}
+
+// TAO_IDL - Generated from
+// be\be_visitor_operation/tie_si.cpp:101
+
+template <class T> ACE_INLINE
+void POA_CORBA::ExtValueDef_tie<T>::is_abstract (
+ ::CORBA::Boolean is_abstract
+ ACE_ENV_ARG_DECL
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ))
+{
+ this->ptr_->is_abstract (
+ is_abstract
+ ACE_ENV_ARG_PARAMETER
+ );
+}
+
+// TAO_IDL - Generated from
+// be\be_visitor_operation/tie_si.cpp:101
+
+template <class T> ACE_INLINE
+::CORBA::Boolean POA_CORBA::ExtValueDef_tie<T>::is_custom (
+ ACE_ENV_SINGLE_ARG_DECL
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ))
+{
+ return this->ptr_->is_custom (
+ ACE_ENV_SINGLE_ARG_PARAMETER
+ );
+}
+
+// TAO_IDL - Generated from
+// be\be_visitor_operation/tie_si.cpp:101
+
+template <class T> ACE_INLINE
+void POA_CORBA::ExtValueDef_tie<T>::is_custom (
+ ::CORBA::Boolean is_custom
+ ACE_ENV_ARG_DECL
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ))
+{
+ this->ptr_->is_custom (
+ is_custom
+ ACE_ENV_ARG_PARAMETER
+ );
+}
+
+// TAO_IDL - Generated from
+// be\be_visitor_operation/tie_si.cpp:101
+
+template <class T> ACE_INLINE
+::CORBA::Boolean POA_CORBA::ExtValueDef_tie<T>::is_truncatable (
+ ACE_ENV_SINGLE_ARG_DECL
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ))
+{
+ return this->ptr_->is_truncatable (
+ ACE_ENV_SINGLE_ARG_PARAMETER
+ );
+}
+
+// TAO_IDL - Generated from
+// be\be_visitor_operation/tie_si.cpp:101
+
+template <class T> ACE_INLINE
+void POA_CORBA::ExtValueDef_tie<T>::is_truncatable (
+ ::CORBA::Boolean is_truncatable
+ ACE_ENV_ARG_DECL
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ))
+{
+ this->ptr_->is_truncatable (
+ is_truncatable
+ ACE_ENV_ARG_PARAMETER
+ );
+}
+
+// TAO_IDL - Generated from
+// be\be_visitor_operation/tie_si.cpp:101
+
+template <class T> ACE_INLINE
+::CORBA::Boolean POA_CORBA::ExtValueDef_tie<T>::is_a (
+ const char * id
+ ACE_ENV_ARG_DECL
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ))
+{
+ return this->ptr_->is_a (
+ id
+ ACE_ENV_ARG_PARAMETER
+ );
+}
+
+// TAO_IDL - Generated from
+// be\be_visitor_operation/tie_si.cpp:101
+
+template <class T> ACE_INLINE
+::CORBA::ValueDef::FullValueDescription * POA_CORBA::ExtValueDef_tie<T>::describe_value (
+ ACE_ENV_SINGLE_ARG_DECL
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ))
+{
+ return this->ptr_->describe_value (
+ ACE_ENV_SINGLE_ARG_PARAMETER
+ );
+}
+
+// TAO_IDL - Generated from
+// be\be_visitor_operation/tie_si.cpp:101
+
+template <class T> ACE_INLINE
+::CORBA::ValueMemberDef_ptr POA_CORBA::ExtValueDef_tie<T>::create_value_member (
+ const char * id,
+ const char * name,
+ const char * version,
+ ::CORBA::IDLType_ptr type,
+ ::CORBA::Visibility access
+ ACE_ENV_ARG_DECL
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ))
+{
+ return this->ptr_->create_value_member (
+ id,
+ name,
+ version,
+ type,
+ access
+ ACE_ENV_ARG_PARAMETER
+ );
+}
+
+// TAO_IDL - Generated from
+// be\be_visitor_operation/tie_si.cpp:101
+
+template <class T> ACE_INLINE
+::CORBA::AttributeDef_ptr POA_CORBA::ExtValueDef_tie<T>::create_attribute (
+ const char * id,
+ const char * name,
+ const char * version,
+ ::CORBA::IDLType_ptr type,
+ ::CORBA::AttributeMode mode
+ ACE_ENV_ARG_DECL
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ))
+{
+ return this->ptr_->create_attribute (
+ id,
+ name,
+ version,
+ type,
+ mode
+ ACE_ENV_ARG_PARAMETER
+ );
+}
+
+// TAO_IDL - Generated from
+// be\be_visitor_operation/tie_si.cpp:101
+
+template <class T> ACE_INLINE
+::CORBA::OperationDef_ptr POA_CORBA::ExtValueDef_tie<T>::create_operation (
+ const char * id,
+ const char * name,
+ const char * version,
+ ::CORBA::IDLType_ptr result,
+ ::CORBA::OperationMode mode,
+ const ::CORBA::ParDescriptionSeq & params,
+ const ::CORBA::ExceptionDefSeq & exceptions,
+ const ::CORBA::ContextIdSeq & contexts
+ ACE_ENV_ARG_DECL
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ))
+{
+ return this->ptr_->create_operation (
+ id,
+ name,
+ version,
+ result,
+ mode,
+ params,
+ exceptions,
+ contexts
+ ACE_ENV_ARG_PARAMETER
+ );
+}
+
+// TAO_IDL - Generated from
+// be\be_visitor_operation/tie_si.cpp:101
+
+template <class T> ACE_INLINE
+::CORBA::ExtInitializerSeq * POA_CORBA::ExtValueDef_tie<T>::ext_initializers (
+ ACE_ENV_SINGLE_ARG_DECL
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ))
+{
+ return this->ptr_->ext_initializers (
+ ACE_ENV_SINGLE_ARG_PARAMETER
+ );
+}
+
+// TAO_IDL - Generated from
+// be\be_visitor_operation/tie_si.cpp:101
+
+template <class T> ACE_INLINE
+void POA_CORBA::ExtValueDef_tie<T>::ext_initializers (
+ const ::CORBA::ExtInitializerSeq & ext_initializers
+ ACE_ENV_ARG_DECL
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ))
+{
+ this->ptr_->ext_initializers (
+ ext_initializers
+ ACE_ENV_ARG_PARAMETER
+ );
+}
+
+// TAO_IDL - Generated from
+// be\be_visitor_operation/tie_si.cpp:101
+
+template <class T> ACE_INLINE
+::CORBA::ExtValueDef::ExtFullValueDescription * POA_CORBA::ExtValueDef_tie<T>::describe_ext_value (
+ ACE_ENV_SINGLE_ARG_DECL
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ))
+{
+ return this->ptr_->describe_ext_value (
+ ACE_ENV_SINGLE_ARG_PARAMETER
+ );
+}
+
+// TAO_IDL - Generated from
+// be\be_visitor_operation/tie_si.cpp:101
+
+template <class T> ACE_INLINE
+::CORBA::ExtAttributeDef_ptr POA_CORBA::ExtValueDef_tie<T>::create_ext_attribute (
+ const char * id,
+ const char * name,
+ const char * version,
+ ::CORBA::IDLType_ptr type,
+ ::CORBA::AttributeMode mode,
+ const ::CORBA::ExceptionDefSeq & get_exceptions,
+ const ::CORBA::ExceptionDefSeq & set_exceptions
+ ACE_ENV_ARG_DECL
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ))
+{
+ return this->ptr_->create_ext_attribute (
+ id,
+ name,
+ version,
+ type,
+ mode,
+ get_exceptions,
+ set_exceptions
+ ACE_ENV_ARG_PARAMETER
+ );
+}
+
+// TAO_IDL - Generated from
+// be\be_visitor_interface/tie_si.cpp:96
+
+template <class T> ACE_INLINE
+POA_CORBA::ValueBoxDef_tie<T>::ValueBoxDef_tie (T &t)
+ : ptr_ (&t),
+ poa_ (PortableServer::POA::_nil ()),
+ rel_ (0)
+{}
+
+template <class T> ACE_INLINE
+POA_CORBA::ValueBoxDef_tie<T>::ValueBoxDef_tie (T &t, PortableServer::POA_ptr poa)
+ : ptr_ (&t),
+ poa_ (PortableServer::POA::_duplicate (poa)),
+ rel_ (0)
+{}
+
+template <class T> ACE_INLINE
+POA_CORBA::ValueBoxDef_tie<T>::ValueBoxDef_tie (T *tp, ::CORBA::Boolean release)
+ : ptr_ (tp),
+ poa_ (PortableServer::POA::_nil ()),
+ rel_ (release)
+{}
+
+template <class T> ACE_INLINE
+POA_CORBA::ValueBoxDef_tie<T>::ValueBoxDef_tie (T *tp, PortableServer::POA_ptr poa, ::CORBA::Boolean release)
+ : ptr_ (tp),
+ poa_ (PortableServer::POA::_duplicate (poa)),
+ rel_ (release)
+{}
+
+template <class T> ACE_INLINE
+POA_CORBA::ValueBoxDef_tie<T>::~ValueBoxDef_tie (void)
+{
+ if (this->rel_)
+ {
+ delete this->ptr_;
+ }
+}
+
+template <class T> ACE_INLINE T *
+POA_CORBA::ValueBoxDef_tie<T>::_tied_object (void)
+{
+ return this->ptr_;
+}
+
+template <class T> ACE_INLINE void
+POA_CORBA::ValueBoxDef_tie<T>::_tied_object (T &obj)
+{
+ if (this->rel_)
+ {
+ delete this->ptr_;
+ }
+
+ this->ptr_ = &obj;
+ this->rel_ = 0;
+}
+
+template <class T> ACE_INLINE void
+POA_CORBA::ValueBoxDef_tie<T>::_tied_object (T *obj, ::CORBA::Boolean release)
+{
+ if (this->rel_)
+ {
+ delete this->ptr_;
+ }
+
+ this->ptr_ = obj;
+ this->rel_ = release;
+}
+
+template <class T> ACE_INLINE ::CORBA::Boolean
+POA_CORBA::ValueBoxDef_tie<T>::_is_owner (void)
+{
+ return this->rel_;
+}
+
+template <class T> ACE_INLINE void
+POA_CORBA::ValueBoxDef_tie<T>::_is_owner ( ::CORBA::Boolean b)
+{
+ this->rel_ = b;
+}
+
+template <class T> ACE_INLINE PortableServer::POA_ptr
+POA_CORBA::ValueBoxDef_tie<T>::_default_POA (ACE_ENV_SINGLE_ARG_DECL)
+{
+ if (! ::CORBA::is_nil (this->poa_.in ()))
+ {
+ return PortableServer::POA::_duplicate (this->poa_.in ());
+ }
+
+ return this->ValueBoxDef::_default_POA (ACE_ENV_SINGLE_ARG_PARAMETER);
+}
+
+// TAO_IDL - Generated from
+// be\be_visitor_operation/tie_si.cpp:101
+
+template <class T> ACE_INLINE
+::CORBA::DefinitionKind POA_CORBA::ValueBoxDef_tie<T>::def_kind (
+ ACE_ENV_SINGLE_ARG_DECL
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ))
+{
+ return this->ptr_->def_kind (
+ ACE_ENV_SINGLE_ARG_PARAMETER
+ );
+}
+
+// TAO_IDL - Generated from
+// be\be_visitor_operation/tie_si.cpp:101
+
+template <class T> ACE_INLINE
+void POA_CORBA::ValueBoxDef_tie<T>::destroy (
+ ACE_ENV_SINGLE_ARG_DECL
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ))
+{
+ this->ptr_->destroy (
+ ACE_ENV_SINGLE_ARG_PARAMETER
+ );
+}
+
+// TAO_IDL - Generated from
+// be\be_visitor_operation/tie_si.cpp:101
+
+template <class T> ACE_INLINE
+char * POA_CORBA::ValueBoxDef_tie<T>::id (
+ ACE_ENV_SINGLE_ARG_DECL
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ))
+{
+ return this->ptr_->id (
+ ACE_ENV_SINGLE_ARG_PARAMETER
+ );
+}
+
+// TAO_IDL - Generated from
+// be\be_visitor_operation/tie_si.cpp:101
+
+template <class T> ACE_INLINE
+void POA_CORBA::ValueBoxDef_tie<T>::id (
+ const char * id
+ ACE_ENV_ARG_DECL
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ))
+{
+ this->ptr_->id (
+ id
+ ACE_ENV_ARG_PARAMETER
+ );
+}
+
+// TAO_IDL - Generated from
+// be\be_visitor_operation/tie_si.cpp:101
+
+template <class T> ACE_INLINE
+char * POA_CORBA::ValueBoxDef_tie<T>::name (
+ ACE_ENV_SINGLE_ARG_DECL
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ))
+{
+ return this->ptr_->name (
+ ACE_ENV_SINGLE_ARG_PARAMETER
+ );
+}
+
+// TAO_IDL - Generated from
+// be\be_visitor_operation/tie_si.cpp:101
+
+template <class T> ACE_INLINE
+void POA_CORBA::ValueBoxDef_tie<T>::name (
+ const char * name
+ ACE_ENV_ARG_DECL
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ))
+{
+ this->ptr_->name (
+ name
+ ACE_ENV_ARG_PARAMETER
+ );
+}
+
+// TAO_IDL - Generated from
+// be\be_visitor_operation/tie_si.cpp:101
+
+template <class T> ACE_INLINE
+char * POA_CORBA::ValueBoxDef_tie<T>::version (
+ ACE_ENV_SINGLE_ARG_DECL
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ))
+{
+ return this->ptr_->version (
+ ACE_ENV_SINGLE_ARG_PARAMETER
+ );
+}
+
+// TAO_IDL - Generated from
+// be\be_visitor_operation/tie_si.cpp:101
+
+template <class T> ACE_INLINE
+void POA_CORBA::ValueBoxDef_tie<T>::version (
+ const char * version
+ ACE_ENV_ARG_DECL
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ))
+{
+ this->ptr_->version (
+ version
+ ACE_ENV_ARG_PARAMETER
+ );
+}
+
+// TAO_IDL - Generated from
+// be\be_visitor_operation/tie_si.cpp:101
+
+template <class T> ACE_INLINE
+::CORBA::Container_ptr POA_CORBA::ValueBoxDef_tie<T>::defined_in (
+ ACE_ENV_SINGLE_ARG_DECL
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ))
+{
+ return this->ptr_->defined_in (
+ ACE_ENV_SINGLE_ARG_PARAMETER
+ );
+}
+
+// TAO_IDL - Generated from
+// be\be_visitor_operation/tie_si.cpp:101
+
+template <class T> ACE_INLINE
+char * POA_CORBA::ValueBoxDef_tie<T>::absolute_name (
+ ACE_ENV_SINGLE_ARG_DECL
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ))
+{
+ return this->ptr_->absolute_name (
+ ACE_ENV_SINGLE_ARG_PARAMETER
+ );
+}
+
+// TAO_IDL - Generated from
+// be\be_visitor_operation/tie_si.cpp:101
+
+template <class T> ACE_INLINE
+::CORBA::Repository_ptr POA_CORBA::ValueBoxDef_tie<T>::containing_repository (
+ ACE_ENV_SINGLE_ARG_DECL
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ))
+{
+ return this->ptr_->containing_repository (
+ ACE_ENV_SINGLE_ARG_PARAMETER
+ );
+}
+
+// TAO_IDL - Generated from
+// be\be_visitor_operation/tie_si.cpp:101
+
+template <class T> ACE_INLINE
+::CORBA::Contained::Description * POA_CORBA::ValueBoxDef_tie<T>::describe (
+ ACE_ENV_SINGLE_ARG_DECL
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ))
+{
+ return this->ptr_->describe (
+ ACE_ENV_SINGLE_ARG_PARAMETER
+ );
+}
+
+// TAO_IDL - Generated from
+// be\be_visitor_operation/tie_si.cpp:101
+
+template <class T> ACE_INLINE
+void POA_CORBA::ValueBoxDef_tie<T>::move (
+ ::CORBA::Container_ptr new_container,
+ const char * new_name,
+ const char * new_version
+ ACE_ENV_ARG_DECL
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ))
+{
+ this->ptr_->move (
+ new_container,
+ new_name,
+ new_version
+ ACE_ENV_ARG_PARAMETER
+ );
+}
+
+// TAO_IDL - Generated from
+// be\be_visitor_operation/tie_si.cpp:101
+
+template <class T> ACE_INLINE
+::CORBA::TypeCode_ptr POA_CORBA::ValueBoxDef_tie<T>::type (
+ ACE_ENV_SINGLE_ARG_DECL
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ))
+{
+ return this->ptr_->type (
+ ACE_ENV_SINGLE_ARG_PARAMETER
+ );
+}
+
+// TAO_IDL - Generated from
+// be\be_visitor_operation/tie_si.cpp:101
+
+template <class T> ACE_INLINE
+::CORBA::IDLType_ptr POA_CORBA::ValueBoxDef_tie<T>::original_type_def (
+ ACE_ENV_SINGLE_ARG_DECL
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ))
+{
+ return this->ptr_->original_type_def (
+ ACE_ENV_SINGLE_ARG_PARAMETER
+ );
+}
+
+// TAO_IDL - Generated from
+// be\be_visitor_operation/tie_si.cpp:101
+
+template <class T> ACE_INLINE
+void POA_CORBA::ValueBoxDef_tie<T>::original_type_def (
+ ::CORBA::IDLType_ptr original_type_def
+ ACE_ENV_ARG_DECL
+ )
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException
+ ))
+{
+ this->ptr_->original_type_def (
+ original_type_def
+ ACE_ENV_ARG_PARAMETER
+ );
+}
+
+
+TAO_END_VERSIONED_NAMESPACE_DECL
+
diff --git a/TAO/orbsvcs/orbsvcs/IFRService/IFR_Service_Loader.cpp b/TAO/orbsvcs/orbsvcs/IFRService/IFR_Service_Loader.cpp
new file mode 100644
index 00000000000..a5e914dcf87
--- /dev/null
+++ b/TAO/orbsvcs/orbsvcs/IFRService/IFR_Service_Loader.cpp
@@ -0,0 +1,100 @@
+// $Id$
+
+// ================================================================
+// DESCRIPTION
+// This class allows for dynamically loading
+// the IFR Service.
+//
+// AUTHORS
+// Jaiganesh Balasubramanian <jai@doc.ece.uci.edu>
+// Priyanka Gontla <pgontla@ece.uci.edu>
+// ================================================================
+
+#include "orbsvcs/IFRService/IFR_Service_Loader.h"
+#include "ace/Dynamic_Service.h"
+#include "ace/Argv_Type_Converter.h"
+
+ACE_RCSID (IFR_Service,
+ IFR_Service_Loader,
+ "$Id$")
+
+TAO_BEGIN_VERSIONED_NAMESPACE_DECL
+
+TAO_IFR_Service_Loader::TAO_IFR_Service_Loader (void)
+{
+ // Constructor
+}
+
+TAO_IFR_Service_Loader::~TAO_IFR_Service_Loader (void)
+{
+ // Destructor
+}
+
+int
+TAO_IFR_Service_Loader::init (int argc,
+ ACE_TCHAR *argv[])
+{
+ ACE_DECLARE_NEW_CORBA_ENV;
+ ACE_TRY
+ {
+ // Copy command line parameter.
+ ACE_Argv_Type_Converter command_line (argc,
+ argv);
+
+ // Initialize the ORB
+ CORBA::ORB_var orb =
+ CORBA::ORB_init (command_line.get_argc (),
+ command_line.get_ASCII_argv (),
+ 0
+ ACE_ENV_ARG_PARAMETER);
+ ACE_TRY_CHECK;
+
+ // This function call initializes the IFR_Service Service
+ CORBA::Object_var object =
+ this->create_object (orb.in (),
+ command_line.get_argc (),
+ command_line.get_TCHAR_argv ()
+ ACE_ENV_ARG_PARAMETER);
+ ACE_TRY_CHECK;
+ }
+ ACE_CATCHANY
+ {
+ // @@ Should we log this???
+ return -1;
+ }
+ ACE_ENDTRY;
+ return 0;
+}
+
+int
+TAO_IFR_Service_Loader::fini (void)
+{
+ // Remove the IFR_Service Service.
+ return this->ifr_server_.fini ();
+}
+
+CORBA::Object_ptr
+TAO_IFR_Service_Loader::create_object (CORBA::ORB_ptr orb,
+ int argc,
+ ACE_TCHAR *argv[]
+ ACE_ENV_ARG_DECL_NOT_USED)
+ ACE_THROW_SPEC ((CORBA::SystemException))
+{
+ int result;
+
+ // Initializes the IFR_Service Service. Returns -1
+ // on an error.
+ result = this->ifr_server_.init_with_orb (argc,
+ argv,
+ orb);
+ if (result == -1)
+ {
+ return CORBA::Object::_nil ();
+ }
+
+ return 0;
+}
+
+TAO_END_VERSIONED_NAMESPACE_DECL
+
+ACE_FACTORY_DEFINE (TAO_IFRService, TAO_IFR_Service_Loader)
diff --git a/TAO/orbsvcs/orbsvcs/IFRService/IFR_Service_Loader.h b/TAO/orbsvcs/orbsvcs/IFRService/IFR_Service_Loader.h
new file mode 100644
index 00000000000..4ed289fb58b
--- /dev/null
+++ b/TAO/orbsvcs/orbsvcs/IFRService/IFR_Service_Loader.h
@@ -0,0 +1,76 @@
+// -*- C++ -*-
+
+// $Id$
+
+// ===========================================================================
+// FILENAME
+// IFR_Service_Loader.h
+//
+// DESCRIPTION
+// This class loads the IFR Service dynamically
+// either from svc.conf file or <string_to_object> call.
+//
+// AUTHORS
+// Jaiganesh Balasubramanian <jai@doc.ece.uci.edu>
+// Priyanka Gontla <pgontla@ece.uci.edu>
+//
+// ===========================================================================
+
+#ifndef TAO_IFR_SERVICE_LOADER_H
+#define TAO_IFR_SERVICE_LOADER_H
+
+#include "tao/Object_Loader.h"
+
+#if !defined (ACE_LACKS_PRAGMA_ONCE)
+# pragma once
+#endif /* ACE_LACKS_PRAGMA_ONCE */
+
+#include "orbsvcs/IFRService/IFR_Service_Utils.h"
+
+TAO_BEGIN_VERSIONED_NAMESPACE_DECL
+
+class TAO_IFRService_Export TAO_IFR_Service_Loader : public TAO_Object_Loader
+{
+public:
+
+ // Constructor
+ TAO_IFR_Service_Loader (void);
+
+ // Destructor
+ ~TAO_IFR_Service_Loader (void);
+
+ // Called by the Service Configurator framework to initialize the
+ // Event Service. Defined in <ace/Service_Config.h>
+ virtual int init (int argc, ACE_TCHAR *argv[]);
+
+ // Called by the Service Configurator framework to remove the
+ // Event Service. Defined in <ace/Service_Config.h>
+ virtual int fini (void);
+
+ // This function call initializes the IFR Service given a reference to the
+ // ORB and the command line parameters.
+ virtual CORBA::Object_ptr create_object (CORBA::ORB_ptr orb,
+ int argc,
+ ACE_TCHAR *argv[]
+ ACE_ENV_ARG_DECL)
+ ACE_THROW_SPEC ((CORBA::SystemException));
+
+
+protected:
+ TAO_IFR_Server ifr_server_;
+ // Instance of the TAO_IFR_Server
+
+private:
+
+ // Disallowing copying/assignment.
+ TAO_IFR_Service_Loader (const TAO_IFR_Service_Loader &);
+ TAO_IFR_Service_Loader & operator= (const TAO_IFR_Service_Loader &);
+
+};
+
+
+TAO_END_VERSIONED_NAMESPACE_DECL
+
+ACE_FACTORY_DECLARE (TAO_IFRService, TAO_IFR_Service_Loader)
+
+#endif /* TAO_IFR_SERVICE_LOADER_H */
diff --git a/TAO/orbsvcs/orbsvcs/IFRService/IFR_Service_Utils.cpp b/TAO/orbsvcs/orbsvcs/IFRService/IFR_Service_Utils.cpp
new file mode 100644
index 00000000000..492f0aaad44
--- /dev/null
+++ b/TAO/orbsvcs/orbsvcs/IFRService/IFR_Service_Utils.cpp
@@ -0,0 +1,1445 @@
+// $Id$
+
+#include "orbsvcs/IFRService/IFR_Service_Utils.h"
+#include "orbsvcs/IFRService/IDLType_i.h"
+#include "orbsvcs/IFRService/Container_i.h"
+#include "orbsvcs/IFRService/Contained_i.h"
+#include "orbsvcs/IFRService/ComponentRepository_i.h"
+#include "orbsvcs/IFRService/Options.h"
+#include "orbsvcs/IFRService/IFR_ComponentsS.h"
+#include "orbsvcs/IOR_Multicast.h"
+#include "tao/IORTable/IORTable.h"
+#include "tao/ORB_Core.h"
+#include "tao/default_ports.h"
+#include "tao/PortableServer/Root_POA.h"
+#include "tao/Stub.h"
+#include "tao/Profile.h"
+#include "tao/AnyTypeCode/ValueModifierC.h"
+#include "ace/Auto_Ptr.h"
+
+ACE_RCSID (IFR_Service,
+ IFR_Service,
+ "$Id$")
+
+TAO_BEGIN_VERSIONED_NAMESPACE_DECL
+
+TAO_Repository_i *TAO_IFR_Service_Utils::repo_ = 0;
+
+TAO_IFR_Server::TAO_IFR_Server (void)
+ : //servant_locator_impl_ (0),
+ ior_multicast_ (0),
+ config_ (0)
+{
+}
+
+TAO_IFR_Server::~TAO_IFR_Server (void)
+{
+ // Get reactor instance from TAO.
+ ACE_Reactor *reactor = this->orb_->orb_core ()->reactor ();
+
+ if ( this->ior_multicast_ )
+ {
+ // Remove event handler for the ior multicast.
+ if (reactor->remove_handler (this->ior_multicast_,
+ ACE_Event_Handler::READ_MASK)
+ == -1)
+ {
+ ACE_DEBUG ((
+ LM_DEBUG,
+ ACE_TEXT ("Interface Repository: cannot remove handler\n")
+ ));
+ }
+ }
+
+ delete this->config_;
+ delete this->ior_multicast_;
+}
+
+int
+TAO_IFR_Server::init_with_orb (int argc,
+ ACE_TCHAR *argv [],
+ CORBA::ORB_ptr orb,
+ int use_multicast_server)
+{
+ ACE_DECLARE_NEW_CORBA_ENV;
+ ACE_TRY
+ {
+ // Duplicate the ORB.
+ this->orb_ = CORBA::ORB::_duplicate (orb);
+
+ // Get the POA from the ORB.
+ CORBA::Object_var poa_object =
+ orb->resolve_initial_references ("RootPOA"
+ ACE_ENV_ARG_PARAMETER);
+ ACE_TRY_CHECK;
+
+ if (CORBA::is_nil (poa_object.in ()))
+ {
+ ACE_ERROR_RETURN ((
+ LM_ERROR,
+ ACE_TEXT ("(%P|%t) Unable to initialize the POA.\n")
+ ),
+ -1
+ );
+ }
+ this->root_poa_ =
+ PortableServer::POA::_narrow (poa_object.in ()
+ ACE_ENV_ARG_PARAMETER);
+ ACE_TRY_CHECK;
+
+ int retval = OPTIONS::instance ()->parse_args (argc,
+ argv);
+
+ if (retval != 0)
+ {
+ return retval;
+ }
+
+ retval = this->create_poa (ACE_ENV_SINGLE_ARG_PARAMETER);
+ ACE_TRY_CHECK;
+
+ if (retval != 0)
+ {
+ return retval;
+ }
+
+ retval = this->open_config (ACE_ENV_SINGLE_ARG_PARAMETER);
+ ACE_TRY_CHECK;
+
+ if (retval != 0)
+ {
+ return retval;
+ }
+
+ retval = this->create_repository (ACE_ENV_SINGLE_ARG_PARAMETER);
+ ACE_TRY_CHECK;
+
+ if (retval != 0)
+ {
+ return retval;
+ }
+
+ if (use_multicast_server
+ || OPTIONS::instance()->support_multicast_discovery ())
+ {
+ retval =
+ this->init_multicast_server (ACE_ENV_SINGLE_ARG_PARAMETER);
+ ACE_TRY_CHECK;
+
+ if (retval != 0)
+ {
+ return retval;
+ }
+ }
+ }
+ ACE_CATCHANY
+ {
+ ACE_PRINT_EXCEPTION (ACE_ANY_EXCEPTION,
+ "IFR_Service::init");
+
+ ACE_RE_THROW;
+ }
+ ACE_ENDTRY;
+ ACE_CHECK_RETURN (-1);
+ return 0;
+}
+
+int
+TAO_IFR_Server::fini (void)
+{
+ ACE_TRY_NEW_ENV
+ {
+ this->root_poa_->destroy (1,
+ 1
+ ACE_ENV_ARG_PARAMETER);
+ ACE_TRY_CHECK;
+ }
+ ACE_CATCHANY
+ {
+ ACE_PRINT_EXCEPTION (ACE_ANY_EXCEPTION,
+ "TAO_IFR_Server::fini");
+ ACE_RE_THROW;
+ }
+ ACE_ENDTRY;
+ return 0;
+}
+
+int
+TAO_IFR_Server::create_poa (ACE_ENV_SINGLE_ARG_DECL)
+{
+ PortableServer::POAManager_var poa_manager =
+ this->root_poa_->the_POAManager (ACE_ENV_SINGLE_ARG_PARAMETER);
+ ACE_CHECK_RETURN (-1);
+
+ poa_manager->activate (ACE_ENV_SINGLE_ARG_PARAMETER);
+ ACE_CHECK_RETURN (-1);
+
+ CORBA::PolicyList policies (5);
+ policies.length (5);
+
+ // ID Assignment Policy.
+ policies[0] =
+ this->root_poa_->create_id_assignment_policy (PortableServer::USER_ID
+ ACE_ENV_ARG_PARAMETER);
+ ACE_CHECK_RETURN (-1);
+
+ // Lifespan Policy.
+ policies[1] =
+ this->root_poa_->create_lifespan_policy (PortableServer::PERSISTENT
+ ACE_ENV_ARG_PARAMETER);
+ ACE_CHECK_RETURN (-1);
+
+ // Request Processing Policy.
+ policies[2] =
+ this->root_poa_->create_request_processing_policy (
+ PortableServer::USE_DEFAULT_SERVANT
+ ACE_ENV_ARG_PARAMETER
+ );
+ ACE_CHECK_RETURN (-1);
+
+ // Servant Retention Policy.
+ policies[3] =
+ this->root_poa_->create_servant_retention_policy (
+ PortableServer::NON_RETAIN
+ ACE_ENV_ARG_PARAMETER
+ );
+ ACE_CHECK_RETURN (-1);
+
+ // Id Uniqueness Policy.
+ policies[4] =
+ this->root_poa_->create_id_uniqueness_policy (
+ PortableServer::MULTIPLE_ID
+ ACE_ENV_ARG_PARAMETER
+ );
+ ACE_CHECK_RETURN (-1);
+
+ this->repo_poa_ =
+ this->root_poa_->create_POA ("repoPOA",
+ poa_manager.in (),
+ policies
+ ACE_ENV_ARG_PARAMETER);
+ ACE_CHECK_RETURN (-1);
+
+ policies[0]->destroy (ACE_ENV_SINGLE_ARG_PARAMETER);
+ ACE_CHECK_RETURN (-1);
+
+ return 0;
+}
+
+int
+TAO_IFR_Server::open_config (ACE_ENV_SINGLE_ARG_DECL)
+{
+ if (OPTIONS::instance ()->using_registry ())
+ {
+#if defined (ACE_WIN32)
+ HKEY root =
+ ACE_Configuration_Win32Registry::resolve_key (
+ HKEY_LOCAL_MACHINE,
+ "Software\\TAO\\IFR"
+ );
+
+ ACE_NEW_THROW_EX (this->config_,
+ ACE_Configuration_Win32Registry (root),
+ CORBA::NO_MEMORY ());
+ ACE_CHECK_RETURN (-1);
+#endif /* ACE_WIN32 */
+
+ return 0;
+ }
+ else
+ {
+ ACE_Configuration_Heap *heap = 0;
+ ACE_NEW_THROW_EX (heap,
+ ACE_Configuration_Heap,
+ CORBA::NO_MEMORY ());
+ ACE_CHECK_RETURN (-1);
+
+ if (OPTIONS::instance ()->persistent ())
+ {
+ const char *filename = OPTIONS::instance ()->persistent_file ();
+
+ if (heap->open (filename))
+ {
+ delete heap;
+ heap = 0;
+
+ ACE_ERROR_RETURN ((
+ LM_ERROR,
+ ACE_TEXT ("Error:: Opening persistent heap file '%s'\n"),
+ filename
+ ),
+ -1
+ );
+ }
+ }
+ else
+ {
+ heap->open ();
+ }
+
+ this->config_ = heap;
+
+ return 0;
+ }
+}
+
+int
+TAO_IFR_Server::create_repository (ACE_ENV_SINGLE_ARG_DECL)
+{
+ TAO_ComponentRepository_i *impl = 0;
+ ACE_NEW_THROW_EX (
+ impl,
+ TAO_ComponentRepository_i (
+ this->orb_.in (),
+ this->root_poa_,
+ this->config_
+ ),
+ CORBA::NO_MEMORY ()
+ );
+ ACE_CHECK_RETURN (-1);
+
+ auto_ptr<TAO_ComponentRepository_i> safety (impl);
+ TAO_IFR_Service_Utils::repo_ = impl;
+
+ POA_CORBA::ComponentIR::Repository_tie<TAO_ComponentRepository_i> *impl_tie
+ = 0;
+
+ ACE_NEW_THROW_EX (
+ impl_tie,
+ POA_CORBA::ComponentIR::Repository_tie<TAO_ComponentRepository_i> (
+ impl,
+ this->repo_poa_,
+ 1
+ ),
+ CORBA::NO_MEMORY ()
+ );
+ ACE_CHECK_RETURN (-1);
+
+ PortableServer::ServantBase_var tie_safety (impl_tie);
+ safety.release ();
+
+ this->repo_poa_->set_servant (impl_tie
+ ACE_ENV_ARG_PARAMETER);
+ ACE_CHECK_RETURN (-1);
+
+ PortableServer::ObjectId_var oid =
+ PortableServer::string_to_ObjectId ("");
+
+ CORBA::Object_var obj =
+ this->repo_poa_->create_reference_with_id (
+ oid.in (),
+ "IDL:omg.org/CORBA/ComponentIR/ComponentRepository:1.0"
+ ACE_ENV_ARG_PARAMETER
+ );
+ ACE_CHECK_RETURN (-1);
+
+ CORBA::Repository_ptr repo_ref =
+ CORBA::Repository::_narrow (obj.in ()
+ ACE_ENV_ARG_PARAMETER);
+ ACE_CHECK_RETURN (-1);
+
+ // Initialize the repository.
+ int status = impl->repo_init (repo_ref,
+ this->repo_poa_
+ ACE_ENV_ARG_PARAMETER);
+ ACE_CHECK_RETURN (-1);
+
+ if (status != 0)
+ {
+ return -1;
+ }
+
+ // Save and output the IOR string.
+ this->ifr_ior_ =
+ this->orb_->object_to_string (repo_ref
+ ACE_ENV_ARG_PARAMETER);
+
+ ACE_CHECK_RETURN (-1);
+
+ CORBA::Object_var table_object =
+ this->orb_->resolve_initial_references ("IORTable"
+ ACE_ENV_ARG_PARAMETER);
+ ACE_CHECK_RETURN (-1);
+
+ IORTable::Table_var adapter =
+ IORTable::Table::_narrow (table_object.in ()
+ ACE_ENV_ARG_PARAMETER);
+ ACE_CHECK_RETURN (-1);
+
+ if (CORBA::is_nil (adapter.in ()))
+ {
+ ACE_ERROR_RETURN ((LM_ERROR, "Nil IORTable\n"), -1);
+ }
+ else
+ {
+ adapter->bind ("InterfaceRepository",
+ this->ifr_ior_.in ()
+ ACE_ENV_ARG_PARAMETER);
+ ACE_CHECK_RETURN (-1);
+ }
+
+ // Add the repository to the ORB's table of initialized object references.
+ this->orb_->register_initial_reference ("InterfaceRepository",
+ repo_ref
+ ACE_ENV_ARG_PARAMETER);
+ ACE_CHECK_RETURN(-1);
+
+ FILE *output_file_ =
+ ACE_OS::fopen (OPTIONS::instance()->ior_output_file (),
+ "w");
+
+ ACE_OS::fprintf (output_file_,
+ "%s",
+ this->ifr_ior_.in ());
+
+ ACE_OS::fclose (output_file_);
+
+ return 0;
+}
+
+// Install ior multicast handler.
+int
+TAO_IFR_Server::init_multicast_server (ACE_ENV_SINGLE_ARG_DECL)
+{
+ // Get reactor instance from TAO.
+ ACE_Reactor *reactor = this->orb_->orb_core ()->reactor ();
+
+#if defined (ACE_HAS_IP_MULTICAST)
+
+ // See if the -ORBMulticastDiscoveryEndpoint option was specified.
+ ACE_CString mde (
+ TAO_ORB_Core_instance ()->orb_params ()->mcast_discovery_endpoint ()
+ );
+
+ // First, see if the user has given us a multicast port number
+ // on the command-line;
+ u_short port =
+ TAO_ORB_Core_instance ()->orb_params ()->service_port (
+ TAO::MCAST_INTERFACEREPOSERVICE
+ );
+
+ if (port == 0)
+ {
+ // Check environment var. for multicast port.
+ const char *port_number =
+ ACE_OS::getenv ("InterfaceRepoServicePort");
+
+ if (port_number != 0)
+ port = static_cast<u_short> (ACE_OS::atoi (port_number));
+ }
+
+ // Port wasn't specified on the command-line or in environment -
+ // use the default.
+ if (port == 0)
+ port = TAO_DEFAULT_INTERFACEREPO_SERVER_REQUEST_PORT;
+
+ // Instantiate a handler which will handle client requests for
+ // the IFR ior, received on the multicast port.
+ ACE_NEW_THROW_EX (this->ior_multicast_,
+ TAO_IOR_Multicast (),
+ CORBA::NO_MEMORY ());
+ ACE_CHECK_RETURN (-1);
+
+ if (mde.length () != 0)
+ {
+ if (this->ior_multicast_->init (this->ifr_ior_.in (),
+ mde.c_str (),
+ TAO_SERVICEID_INTERFACEREPOSERVICE)
+ == -1)
+ {
+ ACE_ERROR_RETURN ((
+ LM_ERROR,
+ ACE_TEXT ("Interface Repository: cannot initialize ")
+ ACE_TEXT ("multicast event handler\n")
+ ),
+ -1
+ );
+ }
+ }
+ else
+ {
+ if (this->ior_multicast_->init (this->ifr_ior_.in (),
+ port,
+ ACE_DEFAULT_MULTICAST_ADDR,
+ TAO_SERVICEID_INTERFACEREPOSERVICE)
+ == -1)
+ {
+ ACE_ERROR_RETURN ((
+ LM_ERROR,
+ ACE_TEXT ("Interface Repository: cannot initialize ")
+ ACE_TEXT ("multicast event handler\n")
+ ),
+ -1
+ );
+ }
+ }
+
+ // Register event handler for the ior multicast.
+ if (reactor->register_handler (this->ior_multicast_,
+ ACE_Event_Handler::READ_MASK)
+ == -1)
+ {
+ ACE_ERROR_RETURN ((
+ LM_ERROR,
+ ACE_TEXT ("Interface Repository: cannot register ")
+ ACE_TEXT ("multicast event handler\n")
+ ),
+ -1
+ );
+ }
+
+#endif /* ACE_HAS_IP_MULTICAST */
+
+ return 0;
+}
+
+TAO_IFR_Service_Utils::TAO_IFR_Service_Utils (void)
+{
+}
+
+TAO_IFR_Service_Utils::~TAO_IFR_Service_Utils (void)
+{
+}
+
+ACE_Configuration_Section_Key
+TAO_IFR_Service_Utils::tmp_key_;
+
+char *
+TAO_IFR_Service_Utils::int_to_string (CORBA::ULong number)
+{
+ static char hex_string[9];
+ ACE_OS::sprintf (hex_string,
+ "%8.8X",
+ number);
+ hex_string[8] = '\0';
+ return hex_string;
+}
+
+void
+TAO_IFR_Service_Utils::valid_container (
+ CORBA::DefinitionKind container_kind,
+ CORBA::DefinitionKind contained_kind
+ ACE_ENV_ARG_DECL
+ )
+ ACE_THROW_SPEC ((CORBA::SystemException))
+{
+ int error_flag = 0;
+
+ switch (container_kind)
+ {
+ case CORBA::dk_Repository:
+ case CORBA::dk_Module:
+ break;
+ case CORBA::dk_Exception:
+ case CORBA::dk_Struct:
+ case CORBA::dk_Union:
+ switch (contained_kind)
+ {
+ case CORBA::dk_Struct:
+ case CORBA::dk_Union:
+ case CORBA::dk_Enum:
+ break;
+ default:
+ error_flag = 1;
+ break;
+ }
+ break;
+ case CORBA::dk_Value:
+ case CORBA::dk_Interface:
+ case CORBA::dk_AbstractInterface:
+ case CORBA::dk_LocalInterface:
+ case CORBA::dk_Home:
+ switch (contained_kind)
+ {
+ case CORBA::dk_Module:
+ case CORBA::dk_Interface:
+ case CORBA::dk_Value:
+ error_flag = 1;
+ break;
+ default:
+ break;
+ }
+ break;
+ case CORBA::dk_Component:
+ switch (contained_kind)
+ {
+ case CORBA::dk_Provides:
+ case CORBA::dk_Uses:
+ case CORBA::dk_Emits:
+ case CORBA::dk_Publishes:
+ case CORBA::dk_Consumes:
+ case CORBA::dk_Attribute:
+ break;
+ default:
+ error_flag = 1;
+ break;
+ }
+ break;
+ default:
+ break;
+ }
+
+ if (error_flag == 1)
+ {
+ ACE_THROW (CORBA::BAD_PARAM (CORBA::OMGVMCID | 4,
+ CORBA::COMPLETED_NO));
+ }
+}
+
+void
+TAO_IFR_Service_Utils::pre_exist (
+ const char *id,
+ name_clash_checker checker,
+ ACE_Configuration_Section_Key &key,
+ TAO_Repository_i *repo,
+ CORBA::DefinitionKind kind
+ ACE_ENV_ARG_DECL
+ )
+{
+ TAO_IFR_Service_Utils::id_exists (id,
+ repo
+ ACE_ENV_ARG_PARAMETER);
+ ACE_CHECK;
+
+ TAO_IFR_Service_Utils::name_exists (checker,
+ key,
+ repo,
+ kind
+ ACE_ENV_ARG_PARAMETER);
+}
+
+void
+TAO_IFR_Service_Utils::id_exists (const char *id,
+ TAO_Repository_i *repo
+ ACE_ENV_ARG_DECL)
+ ACE_THROW_SPEC ((CORBA::SystemException))
+{
+ // The repo id must not already exist.
+ ACE_TString holder;
+ if (repo->config ()->get_string_value (repo->repo_ids_key (),
+ id,
+ holder)
+ == 0)
+ {
+ ACE_THROW (CORBA::BAD_PARAM (CORBA::OMGVMCID | 2,
+ CORBA::COMPLETED_NO));
+ }
+}
+
+void
+TAO_IFR_Service_Utils::name_exists (
+ name_clash_checker checker,
+ ACE_Configuration_Section_Key &key,
+ TAO_Repository_i *repo,
+ CORBA::DefinitionKind kind
+ ACE_ENV_ARG_DECL
+ )
+ ACE_THROW_SPEC ((CORBA::SystemException))
+{
+ int status = 0;
+ ACE_TString section_name;
+ u_int count = 0;
+ char *stringified = 0;
+
+ // Check the members defined elsewhere, if any.
+ ACE_Configuration_Section_Key refs_key;
+ status =
+ repo->config ()->open_section (key,
+ "refs",
+ 0,
+ refs_key);
+
+ if (status == 0)
+ {
+ repo->config ()->get_integer_value (refs_key,
+ "count",
+ count);
+
+ for (CORBA::ULong i = 0; i < count; ++i)
+ {
+ ACE_Configuration_Section_Key member_key;
+ stringified = TAO_IFR_Service_Utils::int_to_string (i);
+
+ repo->config ()->open_section (refs_key,
+ stringified,
+ 0,
+ member_key);
+
+ ACE_TString member_name;
+ repo->config ()->get_string_value (member_key,
+ "name",
+ member_name);
+
+ if ((*checker) (member_name.fast_rep ()) != 0)
+ {
+ ACE_THROW (CORBA::BAD_PARAM (CORBA::OMGVMCID | 3,
+ CORBA::COMPLETED_NO));
+ }
+ }
+ }
+
+ // Check the members defined in this scope, if any.
+ ACE_Configuration_Section_Key defns_key;
+ status =
+ repo->config ()->open_section (key,
+ "defns",
+ 0,
+ defns_key);
+ if (status == 0)
+ {
+ repo->config ()->get_integer_value (defns_key,
+ "count",
+ count);
+
+ for (CORBA::ULong i = 0; i < count; ++i)
+ {
+ ACE_Configuration_Section_Key defn_key;
+ stringified = TAO_IFR_Service_Utils::int_to_string (i);
+
+ repo->config ()->open_section (defns_key,
+ stringified,
+ 0,
+ defn_key);
+
+ ACE_TString defn_name;
+ repo->config ()->get_string_value (defn_key,
+ "name",
+ defn_name);
+
+ if ((*checker) (defn_name.fast_rep ()) != 0)
+ {
+ ACE_THROW (CORBA::BAD_PARAM (CORBA::OMGVMCID | 3,
+ CORBA::COMPLETED_NO));
+ }
+ }
+ }
+
+ if (kind == CORBA::dk_Interface
+ || kind == CORBA::dk_Component)
+ {
+ TAO_IFR_Service_Utils::check_subsection (checker,
+ "attrs",
+ repo->config (),
+ key
+ ACE_ENV_ARG_PARAMETER);
+ ACE_CHECK;
+ }
+
+ if (kind == CORBA::dk_Interface)
+ {
+ TAO_IFR_Service_Utils::check_subsection (checker,
+ "ops",
+ repo->config (),
+ key
+ ACE_ENV_ARG_PARAMETER);
+ ACE_CHECK;
+ }
+
+ if (kind == CORBA::dk_Component)
+ {
+ TAO_IFR_Service_Utils::check_subsection (checker,
+ "provides",
+ repo->config (),
+ key
+ ACE_ENV_ARG_PARAMETER);
+ ACE_CHECK;
+
+ TAO_IFR_Service_Utils::check_subsection (checker,
+ "uses",
+ repo->config (),
+ key
+ ACE_ENV_ARG_PARAMETER);
+ ACE_CHECK;
+
+ TAO_IFR_Service_Utils::check_subsection (checker,
+ "emits",
+ repo->config (),
+ key
+ ACE_ENV_ARG_PARAMETER);
+ ACE_CHECK;
+
+ TAO_IFR_Service_Utils::check_subsection (checker,
+ "publishes",
+ repo->config (),
+ key
+ ACE_ENV_ARG_PARAMETER);
+ ACE_CHECK;
+
+ TAO_IFR_Service_Utils::check_subsection (checker,
+ "consumes",
+ repo->config (),
+ key
+ ACE_ENV_ARG_PARAMETER);
+ ACE_CHECK;
+ }
+}
+
+void
+TAO_IFR_Service_Utils::check_subsection (
+ TAO_IFR_Service_Utils::name_clash_checker checker,
+ const char *sub_section,
+ ACE_Configuration *config,
+ ACE_Configuration_Section_Key &key
+ ACE_ENV_ARG_DECL
+ )
+ ACE_THROW_SPEC ((CORBA::SystemException))
+{
+ ACE_Configuration_Section_Key sub_key;
+ int status =
+ config->open_section (key,
+ sub_section,
+ 0,
+ sub_key);
+
+ if (status != 0)
+ {
+ return;
+ }
+
+ CORBA::ULong count = 0;
+ config->get_integer_value (sub_key,
+ "count",
+ count);
+
+ ACE_Configuration_Section_Key entry_key;
+ ACE_TString entry_name;
+ char *stringified = 0;
+
+ for (CORBA::ULong i = 0; i < count; ++i)
+ {
+ stringified = TAO_IFR_Service_Utils::int_to_string (i);
+ config->open_section (sub_key,
+ stringified,
+ 0,
+ entry_key);
+ config->get_string_value (entry_key,
+ "name",
+ entry_name);
+
+ if ((*checker) (entry_name.fast_rep ()) != 0)
+ {
+ ACE_THROW (CORBA::BAD_PARAM (3,
+ CORBA::COMPLETED_NO));
+ return;
+ }
+ }
+}
+
+void
+TAO_IFR_Service_Utils::valid_creation (
+ CORBA::DefinitionKind container_kind,
+ CORBA::DefinitionKind contained_kind,
+ const char *id,
+ name_clash_checker checker,
+ ACE_Configuration_Section_Key &key,
+ TAO_Repository_i *repo
+ ACE_ENV_ARG_DECL
+ )
+{
+ TAO_IFR_Service_Utils::valid_container (container_kind,
+ contained_kind
+ ACE_ENV_ARG_PARAMETER);
+
+ TAO_IFR_Service_Utils::pre_exist (id,
+ checker,
+ key,
+ repo,
+ container_kind
+ ACE_ENV_ARG_PARAMETER);
+}
+
+ACE_TString
+TAO_IFR_Service_Utils::create_common (
+ CORBA::DefinitionKind container_kind,
+ CORBA::DefinitionKind contained_kind,
+ ACE_Configuration_Section_Key container_key,
+ ACE_Configuration_Section_Key &new_key,
+ TAO_Repository_i *repo,
+ const char *id,
+ const char *name,
+ TAO_IFR_Service_Utils::name_clash_checker checker,
+ const char *version,
+ const char *sub_section_name
+ ACE_ENV_ARG_DECL
+ )
+{
+ ACE_TString path;
+
+ // No need for a return value, every error we check for will throw
+ // one of the BAD_PARAM versions if it is discovered.
+ TAO_IFR_Service_Utils::valid_creation (container_kind,
+ contained_kind,
+ id,
+ checker,
+ container_key,
+ repo
+ ACE_ENV_ARG_PARAMETER);
+ ACE_CHECK_RETURN (path);
+
+ ACE_Configuration *config = repo->config ();
+
+ // Create new section, or open if it already exists.
+ ACE_Configuration_Section_Key sub_key;
+ config->open_section (container_key,
+ sub_section_name,
+ 1,
+ sub_key);
+
+ u_int defn_count = 0;
+
+ // If we have a count, it gets set, if not, it stays 0.
+ config->get_integer_value (sub_key,
+ "count",
+ defn_count);
+
+ char *section_name =
+ TAO_IFR_Service_Utils::int_to_string (defn_count);
+ config->open_section (sub_key,
+ section_name,
+ 1,
+ new_key);
+
+ // Increment the count.
+ config->set_integer_value (sub_key,
+ "count",
+ defn_count + 1);
+
+ config->get_integer_value (sub_key,
+ "count",
+ defn_count);
+
+ // Set the name attribute.
+ config->set_string_value (new_key,
+ "name",
+ name);
+
+ // Set the id attribute.
+ config->set_string_value (new_key,
+ "id",
+ id);
+
+ // Set the version attribute.
+ config->set_string_value (new_key,
+ "version",
+ version);
+
+ // Set the definition kind.
+ config->set_integer_value (new_key,
+ "def_kind",
+ contained_kind);
+
+ // Get the container's absolute name, append the new name,
+ // and set it in the new section.
+ ACE_TString absolute_name;
+ config->get_string_value (container_key,
+ "absolute_name",
+ absolute_name);
+
+ absolute_name += "::";
+ absolute_name += name;
+
+ config->set_string_value (new_key,
+ "absolute_name",
+ absolute_name);
+
+ // Get the container's path.
+ ACE_TString container_id;
+ config->get_string_value (container_key,
+ "id",
+ container_id);
+
+ config->set_string_value (new_key,
+ "container_id",
+ container_id);
+
+ if (container_id == "") // This Container is the Repository.
+ {
+ path = "";
+ }
+ else
+ {
+ config->get_string_value (repo->repo_ids_key (),
+ container_id.c_str (),
+ path);
+
+ path += '\\';
+ }
+
+ path += sub_section_name;
+ path += '\\';
+ path += section_name;
+
+ // Store our path under our global repo id for fast lookup.
+ config->set_string_value (repo->repo_ids_key (),
+ id,
+ path);
+
+ return path;
+}
+
+void
+TAO_IFR_Service_Utils::set_exceptions (
+ ACE_Configuration *config,
+ ACE_Configuration_Section_Key &key,
+ const char *sub_section,
+ const CORBA::ExceptionDefSeq &exceptions
+ )
+{
+ CORBA::ULong length = exceptions.length ();
+
+ if (length == 0)
+ {
+ return;
+ }
+
+ // Create new subsection because we are either creating a new entry
+ // or are calling from a mutator which has already removed the old one.
+ ACE_Configuration_Section_Key excepts_key;
+ config->open_section (key,
+ sub_section,
+ 1,
+ excepts_key);
+
+ config->set_integer_value (excepts_key,
+ "count",
+ length);
+
+ char *type_path = 0;
+
+ for (CORBA::ULong i = 0; i < length; ++i)
+ {
+ type_path =
+ TAO_IFR_Service_Utils::reference_to_path (exceptions[i]);
+
+ char *stringified = TAO_IFR_Service_Utils::int_to_string (i);
+ config->set_string_value (excepts_key,
+ stringified,
+ type_path);
+ }
+}
+
+CORBA::TypeCode_ptr
+TAO_IFR_Service_Utils::gen_valuetype_tc_r (
+ ACE_Configuration_Section_Key &key,
+ TAO_Repository_i *repo
+ ACE_ENV_ARG_DECL
+ )
+{
+ ACE_TString name;
+ repo->config ()->get_string_value (key,
+ "name",
+ name);
+ ACE_TString id;
+ repo->config ()->get_string_value (key,
+ "id",
+ id);
+ CORBA::ValueModifier tm = CORBA::VM_NONE;
+ CORBA::ULong is_it = 0;
+
+ repo->config ()->get_integer_value (key,
+ "is_abstract",
+ is_it);
+
+ if (is_it)
+ {
+ tm = CORBA::VM_ABSTRACT;
+ }
+ else
+ {
+ repo->config ()->get_integer_value (key,
+ "is_custom",
+ is_it);
+
+ if (is_it)
+ {
+ tm = CORBA::VM_CUSTOM;
+ }
+ else
+ {
+ repo->config ()->get_integer_value (key,
+ "is_truncatable",
+ is_it);
+
+ if (is_it)
+ {
+ tm = CORBA::VM_TRUNCATABLE;
+ }
+ }
+ }
+
+ ACE_TString base_id;
+ int status =
+ repo->config ()->get_string_value (key,
+ "base_value",
+ base_id);
+ CORBA::TypeCode_var base_tc = CORBA::TypeCode::_nil ();
+
+ if (status == 0)
+ {
+ ACE_TString base_path;
+ repo->config ()->get_string_value (repo->repo_ids_key (),
+ base_id.fast_rep (),
+ base_path);
+ ACE_Configuration_Section_Key base_key;
+ repo->config ()->expand_path (repo->root_key (),
+ base_path,
+ base_key,
+ 0);
+ base_tc =
+ TAO_IFR_Service_Utils::gen_valuetype_tc_r (base_key,
+ repo
+ ACE_ENV_ARG_PARAMETER);
+ ACE_CHECK_RETURN (CORBA::TypeCode::_nil ());
+ }
+
+ CORBA::ValueMemberSeq vm_seq;
+ vm_seq.length (0);
+ TAO_IFR_Service_Utils::fill_valuemember_seq (vm_seq,
+ key,
+ repo
+ ACE_ENV_ARG_PARAMETER);
+ ACE_CHECK_RETURN (CORBA::TypeCode::_nil ());
+
+ return
+ repo->tc_factory ()->create_value_tc (id.c_str (),
+ name.c_str (),
+ tm,
+ base_tc.in (),
+ vm_seq
+ ACE_ENV_ARG_PARAMETER);
+}
+
+void
+TAO_IFR_Service_Utils::fill_valuemember_seq (
+ CORBA::ValueMemberSeq &vm_seq,
+ ACE_Configuration_Section_Key &key,
+ TAO_Repository_i *repo
+ ACE_ENV_ARG_DECL
+ )
+{
+ ACE_Configuration_Section_Key members_key;
+ int status =
+ repo->config ()->open_section (key,
+ "members",
+ 0,
+ members_key);
+
+ if (status != 0)
+ {
+ vm_seq.length (0);
+ return;
+ }
+
+ CORBA::ULong count = 0;
+ repo->config ()->get_integer_value (members_key,
+ "count",
+ count);
+ vm_seq.length (count);
+ char *stringified = 0;
+ ACE_Configuration_Section_Key member_key, type_key;
+ ACE_TString holder;
+ CORBA::ULong access = 0;
+
+ for (CORBA::ULong i = 0; i < count; ++i)
+ {
+ stringified = TAO_IFR_Service_Utils::int_to_string (i);
+ repo->config ()->open_section (members_key,
+ stringified,
+ 0,
+ member_key);
+ repo->config ()->get_string_value (member_key,
+ "name",
+ holder);
+ vm_seq[i].name = holder.fast_rep ();
+ repo->config ()->get_string_value (member_key,
+ "id",
+ holder);
+ vm_seq[i].id = holder.fast_rep ();
+ repo->config ()->get_string_value (key,
+ "id",
+ holder);
+ vm_seq[i].defined_in = holder.fast_rep ();
+ repo->config ()->get_string_value (member_key,
+ "version",
+ holder);
+ vm_seq[i].version = holder.fast_rep ();
+ repo->config ()->get_string_value (member_key,
+ "type_path",
+ holder);
+ TAO_IDLType_i *impl =
+ TAO_IFR_Service_Utils::path_to_idltype (holder,
+ repo);
+ vm_seq[i].type = impl->type_i (ACE_ENV_SINGLE_ARG_PARAMETER);
+ ACE_CHECK;
+
+ repo->config ()->get_integer_value (member_key,
+ "access",
+ access);
+ vm_seq[i].access = static_cast<CORBA::Visibility> (access);
+ }
+}
+
+char *
+TAO_IFR_Service_Utils::reference_to_path (CORBA::IRObject_ptr obj)
+{
+ PortableServer::ObjectId object_id;
+ TAO::ObjectKey object_key =
+ obj->_stubobj ()->profile_in_use ()->object_key ();
+ int status = TAO_Root_POA::parse_ir_object_key (object_key,
+ object_id);
+ if (status != 0)
+ {
+ ACE_DEBUG ((LM_DEBUG,
+ "reference_to_path - parse_ir_object_key failed\n"));
+ return 0;
+ }
+
+ return TAO_IFR_Service_Utils::oid_to_string (object_id);
+}
+
+CORBA::DefinitionKind
+TAO_IFR_Service_Utils::path_to_def_kind (ACE_TString &path,
+ TAO_Repository_i *repo)
+{
+ int status =
+ repo->config ()->expand_path (repo->root_key (),
+ path,
+ TAO_IFR_Service_Utils::tmp_key_,
+ 0);
+
+ if (status != 0)
+ {
+ ACE_DEBUG ((LM_DEBUG,
+ "path_to_def_kind - bad path: '%s'\n",
+ path.c_str ()));
+ return CORBA::dk_none;
+ }
+
+ u_int kind = 0;
+ repo->config ()->get_integer_value (TAO_IFR_Service_Utils::tmp_key_,
+ "def_kind",
+ kind);
+ return static_cast<CORBA::DefinitionKind> (kind);
+}
+
+CORBA::DefinitionKind
+TAO_IFR_Service_Utils::reference_to_def_kind (CORBA::IRObject_ptr obj,
+ TAO_Repository_i *repo)
+{
+ ACE_TString path (TAO_IFR_Service_Utils::reference_to_path (obj));
+ return TAO_IFR_Service_Utils::path_to_def_kind (path, repo);
+}
+
+TAO_IDLType_i *
+TAO_IFR_Service_Utils::path_to_idltype (ACE_TString &path,
+ TAO_Repository_i *repo)
+{
+ CORBA::DefinitionKind def_kind =
+ TAO_IFR_Service_Utils::path_to_def_kind (path, repo);
+ TAO_IDLType_i *retval = repo->select_idltype (def_kind);
+
+ if (retval == 0)
+ {
+ ACE_DEBUG ((LM_DEBUG,
+ "path_to_idltype - not an IDLType: '%s'\n",
+ path.c_str ()));
+ return 0;
+ }
+
+ retval->section_key (TAO_IFR_Service_Utils::tmp_key_);
+ return retval;
+}
+
+TAO_Contained_i *
+TAO_IFR_Service_Utils::path_to_contained (ACE_TString &path,
+ TAO_Repository_i *repo)
+{
+ CORBA::DefinitionKind def_kind =
+ TAO_IFR_Service_Utils::path_to_def_kind (path, repo);
+ TAO_Contained_i *retval = repo->select_contained (def_kind);
+
+ if (retval == 0)
+ {
+ ACE_DEBUG ((LM_DEBUG,
+ "path_to_contained - not a contained type: '%s'\n",
+ path.c_str ()));
+ return 0;
+ }
+
+ retval->section_key (TAO_IFR_Service_Utils::tmp_key_);
+ return retval;
+}
+
+TAO_Container_i *
+TAO_IFR_Service_Utils::path_to_container (ACE_TString &path,
+ TAO_Repository_i *repo)
+{
+ CORBA::DefinitionKind def_kind =
+ TAO_IFR_Service_Utils::path_to_def_kind (path, repo);
+ TAO_Container_i *retval = repo->select_container (def_kind);
+
+ if (retval != 0)
+ {
+ retval->section_key (TAO_IFR_Service_Utils::tmp_key_);
+ }
+
+ return retval;
+}
+
+CORBA::Object_ptr
+TAO_IFR_Service_Utils::path_to_ir_object (ACE_TString &path,
+ TAO_Repository_i *repo
+ ACE_ENV_ARG_DECL)
+{
+ CORBA::DefinitionKind def_kind =
+ TAO_IFR_Service_Utils::path_to_def_kind (path, repo);
+
+ return TAO_IFR_Service_Utils::create_objref (def_kind,
+ path.c_str (),
+ repo
+ ACE_ENV_ARG_PARAMETER);
+}
+
+CORBA::Object_ptr
+TAO_IFR_Service_Utils::create_objref (CORBA::DefinitionKind def_kind,
+ const char *obj_id,
+ TAO_Repository_i *repo
+ ACE_ENV_ARG_DECL)
+{
+ ACE_TString repo_id ("IDL:omg.org/");
+
+ switch (def_kind)
+ {
+ case CORBA::dk_Attribute:
+ repo_id += "CORBA/ExtAttributeDef:";
+ break;
+ case CORBA::dk_Constant:
+ repo_id += "CORBA/ConstantDef:";
+ break;
+ case CORBA::dk_Exception:
+ repo_id += "CORBA/ExceptionDef:";
+ break;
+ case CORBA::dk_Interface:
+ repo_id += "CORBA/ExtInterfaceDef:";
+ break;
+ case CORBA::dk_AbstractInterface:
+ repo_id += "CORBA/ExtAbstractInterfaceDef:";
+ break;
+ case CORBA::dk_LocalInterface:
+ repo_id += "CORBA/ExtLocalInterfaceDef:";
+ break;
+ case CORBA::dk_Module:
+ repo_id += "CORBA/ComponentIR/ModuleDef:";
+ break;
+ case CORBA::dk_Operation:
+ repo_id += "CORBA/OperationDef:";
+ break;
+ case CORBA::dk_Typedef:
+ repo_id += "CORBA/TypedefDef:";
+ break;
+ case CORBA::dk_Alias:
+ repo_id += "CORBA/AliasDef:";
+ break;
+ case CORBA::dk_Struct:
+ repo_id += "CORBA/StructDef:";
+ break;
+ case CORBA::dk_Union:
+ repo_id += "CORBA/UnionDef:";
+ break;
+ case CORBA::dk_Enum:
+ repo_id += "CORBA/EnumDef:";
+ break;
+ case CORBA::dk_Primitive:
+ repo_id += "CORBA/PrimitiveDef:";
+ break;
+ case CORBA::dk_String:
+ repo_id += "CORBA/StringDef:";
+ break;
+ case CORBA::dk_Sequence:
+ repo_id += "CORBA/SequenceDef:";
+ break;
+ case CORBA::dk_Array:
+ repo_id += "CORBA/ArrayDef:";
+ break;
+ case CORBA::dk_Wstring:
+ repo_id += "CORBA/WstringDef:";
+ break;
+ case CORBA::dk_Fixed:
+ repo_id += "CORBA/FixedDef:";
+ break;
+ case CORBA::dk_Value:
+ repo_id += "CORBA/ExtValueDef:";
+ break;
+ case CORBA::dk_ValueBox:
+ repo_id += "CORBA/ValueBoxDef:";
+ break;
+ case CORBA::dk_ValueMember:
+ repo_id += "CORBA/ValueMemberDef:";
+ break;
+ case CORBA::dk_Native:
+ repo_id += "CORBA/NativeDef:";
+ break;
+ case CORBA::dk_Component:
+ repo_id += "CORBA/ComponentIR/ComponentDef:";
+ break;
+ case CORBA::dk_Home:
+ repo_id += "CORBA/ComponentIR/HomeDef:";
+ break;
+ case CORBA::dk_Factory:
+ repo_id += "CORBA/ComponentIR/FactoryDef:";
+ break;
+ case CORBA::dk_Finder:
+ repo_id += "CORBA/ComponentIR/FinderDef:";
+ break;
+ case CORBA::dk_Event:
+ repo_id += "CORBA/ComponentIR/EventDef:";
+ break;
+ case CORBA::dk_Emits:
+ repo_id += "CORBA/ComponentIR/EmitsDef:";
+ break;
+ case CORBA::dk_Publishes:
+ repo_id += "CORBA/ComponentIR/PublishesDef:";
+ break;
+ case CORBA::dk_Consumes:
+ repo_id += "CORBA/ComponentIR/ConsumesDef:";
+ break;
+ case CORBA::dk_Provides:
+ repo_id += "CORBA/ComponentIR/ProvidesDef:";
+ break;
+ case CORBA::dk_Uses:
+ repo_id += "CORBA/ComponentIR/UsesDef:";
+ break;
+ default:
+ ACE_THROW_RETURN (CORBA::OBJECT_NOT_EXIST (),
+ CORBA::Object::_nil ());
+ }
+
+ repo_id += "1.0";
+
+ PortableServer::ObjectId_var oid =
+ PortableServer::string_to_ObjectId (obj_id);
+
+ PortableServer::POA_ptr poa = repo->select_poa (def_kind);
+
+ return poa->create_reference_with_id (oid.in (),
+ repo_id.c_str ()
+ ACE_ENV_ARG_PARAMETER);
+}
+
+char *
+TAO_IFR_Service_Utils::oid_to_string (PortableServer::ObjectId &oid)
+{
+ static char oid_string[2 * 1024];
+ CORBA::ULong length = oid.length ();
+
+ // Copy the data.
+ ACE_OS::memcpy (oid_string,
+ oid.get_buffer (),
+ length);
+
+ // Null terminate the string.
+ oid_string[length] = '\0';
+ return oid_string;
+}
+
+TAO_END_VERSIONED_NAMESPACE_DECL
diff --git a/TAO/orbsvcs/orbsvcs/IFRService/IFR_Service_Utils.h b/TAO/orbsvcs/orbsvcs/IFRService/IFR_Service_Utils.h
new file mode 100644
index 00000000000..2b91098a1ee
--- /dev/null
+++ b/TAO/orbsvcs/orbsvcs/IFRService/IFR_Service_Utils.h
@@ -0,0 +1,258 @@
+// -*- C++ -*-
+
+// $Id$
+
+// ============================================================================
+//
+// = LIBRARY
+// TAO/orbsvcs/orbsvcs/IFRService
+//
+// = FILENAME
+// IFR_Service_Utils.h
+//
+// = DESCRIPTION
+// Implement wrappers useful to IFR Service clients and servers.
+//
+// = AUTHORS
+// Jeff Parsons <j.parsons@vanderbilt.edu>
+// Jaiganesh Balasubramanian <jai@doc.ece.uci.edu>
+// Priyanka Gontla <pgontla@doc.ece.uci.edu>
+//
+// ============================================================================
+
+#ifndef TAO_IFR_SERVICE_UTILS_H
+#define TAO_IFR_SERVICE_UTILS_H
+
+#include /**/ "ace/pre.h"
+
+#include "orbsvcs/IFRService/ifr_service_export.h"
+#include "tao/IFR_Client/IFR_BasicC.h"
+#include "tao/PortableServer/PortableServer.h"
+#include "tao/ORB.h"
+
+#include "ace/Configuration.h"
+
+ACE_BEGIN_VERSIONED_NAMESPACE_DECL
+class ACE_Configuration;
+ACE_END_VERSIONED_NAMESPACE_DECL
+
+TAO_BEGIN_VERSIONED_NAMESPACE_DECL
+
+class TAO_IOR_Multicast;
+class TAO_Repository_i;
+class TAO_IDLType_i;
+class TAO_Container_i;
+class TAO_Contained_i;
+
+class TAO_IFRService_Export TAO_IFR_Server
+{
+public:
+ TAO_IFR_Server (void);
+
+ int init_with_orb (int argc,
+ ACE_TCHAR *argv [],
+ CORBA::ORB_ptr orb,
+ int use_multicast_server = 0);
+ /// Initialize the IFR Service with the command line arguments and
+ /// the ORB.
+
+ int fini (void);
+ /// Destroy the child POA created in <init_with_orb>.
+
+ ~TAO_IFR_Server (void);
+ /// Destructor.
+
+protected:
+
+ /// Two persistent POAs, one using a servant locator.
+ int create_poa (ACE_ENV_SINGLE_ARG_DECL_WITH_DEFAULTS);
+
+ /// Open an ACE_Configuration of the appropriate type.
+ int open_config (ACE_ENV_SINGLE_ARG_DECL_WITH_DEFAULTS);
+
+ /// Create and initialize the repository.
+ int create_repository (ACE_ENV_SINGLE_ARG_DECL_WITH_DEFAULTS);
+
+ /// Enable the Interface Repository to answer multicast requests
+ /// for its IOR.
+ int init_multicast_server (ACE_ENV_SINGLE_ARG_DECL_WITH_DEFAULTS);
+
+ /// Reference to our ORB.
+ CORBA::ORB_var orb_;
+
+ /// Root POA reference.
+ PortableServer::POA_ptr root_poa_;
+
+ /// The Repository's POA reference.
+ PortableServer::POA_ptr repo_poa_;
+
+ /// Event handler that responds to multicast requests.
+ TAO_IOR_Multicast *ior_multicast_;
+
+ /// Database for the IFR.
+ ACE_Configuration *config_;
+
+ /// Interface Repository's IOR.
+ CORBA::String_var ifr_ior_;
+};
+
+class TAO_IFR_Service_Utils
+{
+public:
+ TAO_IFR_Service_Utils (void);
+
+ ~TAO_IFR_Service_Utils (void);
+
+ typedef int (*name_clash_checker)(const char *);
+
+ /// Convert the hex form of an 4-byte unsigned int to a string.
+ static char *int_to_string (CORBA::ULong number);
+
+ /// The error-checking methods below all return void because
+ /// they throw a spec-defined exception for every error case
+ /// (specifically one of the BAD_PARAM minor versions).
+
+ /// Checks for illegal member type in given container type.
+ static void valid_container (CORBA::DefinitionKind container_kind,
+ CORBA::DefinitionKind contained_kind
+ ACE_ENV_ARG_DECL)
+ ACE_THROW_SPEC ((CORBA::SystemException));
+
+ /// Wrapper for id_exists() and name_exists().
+ static void pre_exist (const char *id,
+ name_clash_checker checker,
+ ACE_Configuration_Section_Key &key,
+ TAO_Repository_i *repo,
+ CORBA::DefinitionKind kind
+ ACE_ENV_ARG_DECL);
+
+ /// Checks for a global repository id clash.
+ static void id_exists (const char *id,
+ TAO_Repository_i *repo
+ ACE_ENV_ARG_DECL)
+ ACE_THROW_SPEC ((CORBA::SystemException));
+
+ /// Checks for a local name clash.
+ static void name_exists (name_clash_checker checker,
+ ACE_Configuration_Section_Key &key,
+ TAO_Repository_i *repo,
+ CORBA::DefinitionKind kind
+ ACE_ENV_ARG_DECL)
+ ACE_THROW_SPEC ((CORBA::SystemException));
+
+ /// Used by interfaces and components to check for name clashes
+ /// in the attributes, operations, or component ports subsections.
+ static void check_subsection (name_clash_checker checker,
+ const char *sub_section,
+ ACE_Configuration *config,
+ ACE_Configuration_Section_Key &key
+ ACE_ENV_ARG_DECL)
+ ACE_THROW_SPEC ((CORBA::SystemException));
+
+ /// Top-level method which calls all the above error-checking methods.
+ static void valid_creation (CORBA::DefinitionKind container_kind,
+ CORBA::DefinitionKind contained_kind,
+ const char *id,
+ name_clash_checker checker,
+ ACE_Configuration_Section_Key &key,
+ TAO_Repository_i *repo
+ ACE_ENV_ARG_DECL);
+
+ /// Code common to the creation of an entry for any non-anonymous type.
+ static ACE_TString create_common (
+ CORBA::DefinitionKind container_kind,
+ CORBA::DefinitionKind contained_kind,
+ ACE_Configuration_Section_Key container_key,
+ ACE_Configuration_Section_Key &new_key,
+ TAO_Repository_i *repo,
+ const char *id,
+ const char *name,
+ name_clash_checker checker,
+ const char *version,
+ const char *sub_section_name
+ ACE_ENV_ARG_DECL
+ );
+
+ /// Common to Container::create_value() and ValueDef::supported_interfaces(),
+ /// Container::create_component() and Component::supported_interfaces().
+ static void set_supported_interfaces (
+ const CORBA::InterfaceDefSeq &supported_interfaces,
+ ACE_Configuration *config,
+ ACE_Configuration_Section_Key &key
+ );
+
+ /// Common code for operations, attributes, and valuetype initializers.
+ static void set_exceptions (ACE_Configuration *config,
+ ACE_Configuration_Section_Key &key,
+ const char *sub_section,
+ const CORBA::ExceptionDefSeq &exceptions);
+
+ /// Implemented here to avoid recursion in the servant classes.
+ static CORBA::TypeCode_ptr gen_valuetype_tc_r (
+ ACE_Configuration_Section_Key &,
+ TAO_Repository_i *
+ ACE_ENV_ARG_DECL
+ );
+
+ /// Called from the above function.
+ static void fill_valuemember_seq (CORBA::ValueMemberSeq &,
+ ACE_Configuration_Section_Key &,
+ TAO_Repository_i *
+ ACE_ENV_ARG_DECL);
+
+ /// Converison from IR Object reference to key location path.
+ static char *reference_to_path (CORBA::IRObject_ptr obj);
+
+ /// Conversion from key location path to CORBA::DefinitionKind.
+ static CORBA::DefinitionKind path_to_def_kind (ACE_TString &path,
+ TAO_Repository_i *repo);
+
+ /// Conversion from IR Object reference to CORBA::DefinitionKind.
+ static CORBA::DefinitionKind reference_to_def_kind (
+ CORBA::IRObject_ptr obj,
+ TAO_Repository_i *repo
+ );
+
+ /// Converion from key location path to IDLType.
+ static TAO_IDLType_i *path_to_idltype (ACE_TString &path,
+ TAO_Repository_i *repo);
+
+ /// Converion from key location path to IDLType.
+ static TAO_Contained_i *path_to_contained (ACE_TString &path,
+ TAO_Repository_i *repo);
+
+ /// Converion from key location path to IDLType.
+ static TAO_Container_i *path_to_container (ACE_TString &path,
+ TAO_Repository_i *repo);
+
+ /// Conversion from key location path to IR Object reference.
+ static CORBA::Object_ptr path_to_ir_object (ACE_TString &path,
+ TAO_Repository_i *repo
+ ACE_ENV_ARG_DECL);
+
+ /// Can be called from the above method or directly from a derived class.
+ static CORBA::Object_ptr create_objref (CORBA::DefinitionKind def_kind,
+ const char *obj_id,
+ TAO_Repository_i *repo
+ ACE_ENV_ARG_DECL);
+
+ /// Copy and octet sequence to a string..
+ static char *oid_to_string (PortableServer::ObjectId &oid);
+
+public:
+ /// To hold a key created by one method for another method to use.
+ /// Calls to this class will be made after an IFR lock (if any)
+ /// has been acquired, so thread safety is not an issue with this
+ /// static variable.
+ static ACE_Configuration_Section_Key tmp_key_;
+
+ /// Needed by TAO_InterfaceDef_i::name_clash, probably can be used
+ /// all over the place now that it's here.
+ static TAO_Repository_i *repo_;
+};
+
+TAO_END_VERSIONED_NAMESPACE_DECL
+
+#include /**/ "ace/post.h"
+
+#endif /* TAO_IFR_SERVICE_UTILS_H */
diff --git a/TAO/orbsvcs/orbsvcs/IFRService/IFR_Service_Utils_T.cpp b/TAO/orbsvcs/orbsvcs/IFRService/IFR_Service_Utils_T.cpp
new file mode 100644
index 00000000000..848677edd13
--- /dev/null
+++ b/TAO/orbsvcs/orbsvcs/IFRService/IFR_Service_Utils_T.cpp
@@ -0,0 +1,389 @@
+// $Id$
+
+#ifndef TAO_IFR_SERVICE_UTILS_T_CPP
+#define TAO_IFR_SERVICE_UTILS_T_CPP
+
+#include "orbsvcs/IFRService/IFR_Service_Utils_T.h"
+#include "orbsvcs/IFRService/IFR_Service_Utils.h"
+#include "orbsvcs/IFRService/Repository_i.h"
+
+#include "ace/SString.h"
+
+TAO_BEGIN_VERSIONED_NAMESPACE_DECL
+
+template<typename T>
+void
+TAO_IFR_Generic_Utils<T>::destroy_special (const char *section_name,
+ TAO_Repository_i *repo,
+ ACE_Configuration_Section_Key &key
+ ACE_ENV_ARG_DECL)
+{
+ ACE_Configuration_Section_Key sub_key;
+ int status =
+ repo->config ()->open_section (key,
+ section_name,
+ 0,
+ sub_key);
+
+ if (status != 0)
+ {
+ /// Nothing to destroy.
+ return;
+ }
+
+ CORBA::ULong count = 0;
+ repo->config ()->get_integer_value (sub_key,
+ "count",
+ count);
+
+ char *stringified = 0;
+ ACE_Configuration_Section_Key special_key;
+ ACE_TString holder;
+
+ for (CORBA::ULong i = 0; i < count; ++i)
+ {
+ stringified = TAO_IFR_Service_Utils::int_to_string (i);
+ repo->config ()->open_section (sub_key,
+ stringified,
+ 0,
+ special_key);
+ T impl (repo);
+ impl.section_key (special_key);
+ impl.destroy_i (ACE_ENV_SINGLE_ARG_PARAMETER);
+ ACE_CHECK;
+ }
+}
+
+template<typename T>
+void
+TAO_IFR_Generic_Utils<T>::set_initializers (
+ const T &initializers,
+ ACE_Configuration *config,
+ ACE_Configuration_Section_Key &key
+ )
+{
+ CORBA::ULong length = initializers.length ();
+
+ if (length == 0)
+ {
+ return;
+ }
+
+ ACE_Configuration_Section_Key initializers_key;
+ config->open_section (key,
+ "initializers",
+ 1,
+ initializers_key);
+ config->set_integer_value (initializers_key,
+ "count",
+ length);
+
+ CORBA::ULong arg_count = 0;
+ char *arg_path = 0;
+ ACE_Configuration_Section_Key initializer_key;
+ ACE_Configuration_Section_Key params_key;
+ ACE_Configuration_Section_Key arg_key;
+
+ for (CORBA::ULong i = 0; i < length; ++i)
+ {
+ char *stringified = TAO_IFR_Service_Utils::int_to_string (i);
+ config->open_section (initializers_key,
+ stringified,
+ 1,
+ initializer_key);
+ config->set_string_value (initializer_key,
+ "name",
+ initializers[i].name.in ());
+
+ arg_count = initializers[i].members.length ();
+
+ if (arg_count > 0)
+ {
+ config->open_section (initializer_key,
+ "params",
+ 1,
+ params_key);
+ config->set_integer_value (params_key,
+ "count",
+ arg_count);
+
+ for (CORBA::ULong j = 0; j < arg_count; ++j)
+ {
+ char *stringified =
+ TAO_IFR_Service_Utils::int_to_string (j);
+ config->open_section (params_key,
+ stringified,
+ 1,
+ arg_key);
+ config->set_string_value (
+ arg_key,
+ "arg_name",
+ initializers[i].members[j].name.in ()
+ );
+ arg_path =
+ TAO_IFR_Service_Utils::reference_to_path (
+ initializers[i].members[j].type_def.in ()
+ );
+ config->set_string_value (arg_key,
+ "arg_path",
+ arg_path);
+ }
+ }
+ }
+}
+
+template<typename T_desc, typename T_impl>
+void
+TAO_IFR_Desc_Utils<T_desc,T_impl>::fill_desc_begin (
+ T_desc &desc,
+ TAO_Repository_i *repo,
+ ACE_Configuration_Section_Key &key
+ ACE_ENV_ARG_DECL
+ )
+{
+ T_impl impl (repo);
+ impl.section_key (key);
+
+ desc.name = impl.name_i (ACE_ENV_SINGLE_ARG_PARAMETER);
+ ACE_CHECK;
+
+ desc.id = impl.id_i (ACE_ENV_SINGLE_ARG_PARAMETER);
+ ACE_CHECK;
+
+ ACE_TString holder;
+ repo->config ()->get_string_value (key,
+ "container_id",
+ holder);
+ desc.defined_in = holder.fast_rep ();
+
+ desc.version = impl.version_i (ACE_ENV_SINGLE_ARG_PARAMETER);
+ ACE_CHECK;
+}
+
+template<typename T_strseq>
+void
+TAO_IFR_Strseq_Utils<T_strseq> ::fill_string_seq (
+ const char *section_name,
+ ACE_Configuration *config,
+ ACE_Configuration_Section_Key &key,
+ T_strseq &seq
+ )
+{
+ ACE_Configuration_Section_Key section_key;
+ int status = config->open_section (key,
+ section_name,
+ 0,
+ section_key);
+
+ if (status != 0)
+ {
+ seq.length (0);
+ return;
+ }
+
+ CORBA::ULong count = 0;
+ config->get_integer_value (section_key,
+ "count",
+ count);
+ seq.length (count);
+ char *stringified = 0;
+ ACE_TString holder;
+
+ for (CORBA::ULong i = 0; i < count; ++i)
+ {
+ stringified = TAO_IFR_Service_Utils::int_to_string (i);
+ config->get_string_value (section_key,
+ stringified,
+ holder);
+ seq[i] = holder.fast_rep ();
+ }
+}
+
+template<typename T_desc_seq>
+void
+TAO_Port_Desc_Seq_Utils<T_desc_seq>::port_descriptions (
+ T_desc_seq &desc_seq,
+ ACE_Configuration *config,
+ ACE_Configuration_Section_Key &key,
+ const char *sub_section
+ )
+{
+ ACE_Configuration_Section_Key sub_key;
+ int status = config->open_section (key,
+ sub_section,
+ 0,
+ sub_key);
+
+ if (status != 0)
+ {
+ desc_seq.length (0);
+ return;
+ }
+
+ CORBA::ULong count = 0;
+ config->get_integer_value (sub_key,
+ "count",
+ count);
+ desc_seq.length (count);
+ ACE_Configuration_Section_Key desc_key;
+ char *stringified = 0;
+ ACE_TString holder;
+
+ for (CORBA::ULong i = 0; i < count; ++i)
+ {
+ stringified = TAO_IFR_Service_Utils::int_to_string (i);
+ config->open_section (sub_key,
+ stringified,
+ 0,
+ desc_key);
+
+ config->get_string_value (desc_key,
+ "name",
+ holder);
+ desc_seq[i].name = holder.c_str ();
+
+ config->get_string_value (desc_key,
+ "id",
+ holder);
+ desc_seq[i].id = holder.c_str ();
+
+ /// Seems to me that this field should refer to the component
+ /// where the port is defined - NOT where the base type is defined.
+ config->get_string_value (key,
+ "id",
+ holder);
+ desc_seq[i].defined_in = holder.c_str ();
+
+ config->get_string_value (desc_key,
+ "version",
+ holder);
+ desc_seq[i].version = holder.c_str ();
+
+ config->get_string_value (desc_key,
+ "base_type",
+ holder);
+ TAO_Port_Desc_Seq_Utils<T_desc_seq>::port_base_type (desc_seq,
+ holder,
+ i);
+
+ TAO_Port_Desc_Seq_Utils<T_desc_seq>::get_is_multiple (desc_seq,
+ config,
+ desc_key,
+ i);
+ }
+}
+
+template<typename T_desc_seq>
+void
+TAO_Port_Desc_Seq_Utils<T_desc_seq>::get_is_multiple (
+ T_desc_seq & /* desc_seq */,
+ ACE_Configuration * /* config */,
+ ACE_Configuration_Section_Key & /* key */,
+ CORBA::ULong /* index */
+ )
+{
+ // All types except UsesDescription have no is_multiple member.
+}
+
+template<typename T_desc_seq>
+void
+TAO_Port_Desc_Seq_Utils<T_desc_seq>::port_base_type (T_desc_seq &desc_seq,
+ ACE_TString &holder,
+ CORBA::ULong index)
+{
+ desc_seq[index].interface_type = holder.fast_rep ();
+}
+
+template<typename T>
+T *
+TAO_Port_Utils<T>::create_entry (const char *id,
+ const char *name,
+ const char *version,
+ const char *sub_section,
+ CORBA::Container_ptr port_base_type,
+ CORBA::Boolean is_multiple,
+ TAO_Repository_i *repo,
+ CORBA::DefinitionKind port_kind,
+ ACE_Configuration_Section_Key &key
+ ACE_ENV_ARG_DECL)
+{
+ TAO_Container_i::tmp_name_holder (name);
+ ACE_Configuration_Section_Key new_key;
+ ACE_TString path =
+ TAO_IFR_Service_Utils::create_common (CORBA::dk_Component,
+ port_kind,
+ key,
+ new_key,
+ repo,
+ id,
+ name,
+ &TAO_Container_i::same_as_tmp_name,
+ version,
+ sub_section
+ ACE_ENV_ARG_PARAMETER);
+ ACE_CHECK_RETURN (T::_nil ());
+
+ const char *tmp =
+ TAO_IFR_Service_Utils::reference_to_path (port_base_type);
+
+ ACE_Configuration_Section_Key base_type_key;
+ repo->config ()->expand_path (repo->root_key (),
+ tmp,
+ base_type_key,
+ 0);
+
+ ACE_TString holder;
+ repo->config ()->get_string_value (base_type_key,
+ "id",
+ holder);
+
+ repo->config ()->set_string_value (
+ new_key,
+ "base_type",
+ holder
+ );
+
+ TAO_Port_Utils<T>::set_is_multiple (is_multiple,
+ repo->config (),
+ new_key);
+
+ CORBA::Object_var obj =
+ TAO_IFR_Service_Utils::path_to_ir_object (path,
+ repo
+ ACE_ENV_ARG_PARAMETER);
+ ACE_CHECK_RETURN (T::_nil ());
+
+ return T::_narrow (obj.in ()
+ ACE_ENV_ARG_PARAMETER);
+}
+
+#if defined (__BORLANDC__) && (__BORLANDC__ <= 0x582)
+// Borland gives warnings about argument not used on the construct as used
+// for the other compilers. This has been reported to Borland, adding
+// a workaround to suppress these warnings so that the real important ones
+// are not missed.
+template<typename T>
+void
+TAO_Port_Utils<T>::set_is_multiple (CORBA::Boolean is_multiple,
+ ACE_Configuration * config,
+ ACE_Configuration_Section_Key &key)
+{
+ ACE_UNUSED_ARG (is_multiple);
+ ACE_UNUSED_ARG (config);
+ ACE_UNUSED_ARG (key);
+ // Do nothing for everything except UsesDef.
+}
+#else
+template<typename T>
+void
+TAO_Port_Utils<T>::set_is_multiple (CORBA::Boolean /* is_multiple */,
+ ACE_Configuration * /* config */,
+ ACE_Configuration_Section_Key & /* key */)
+{
+ // Do nothing for everything except UsesDef.
+}
+#endif
+
+TAO_END_VERSIONED_NAMESPACE_DECL
+
+#endif /* TAO_IFR_SERVICE_UTILS_T_CPP */
diff --git a/TAO/orbsvcs/orbsvcs/IFRService/IFR_Service_Utils_T.h b/TAO/orbsvcs/orbsvcs/IFRService/IFR_Service_Utils_T.h
new file mode 100644
index 00000000000..056582e494a
--- /dev/null
+++ b/TAO/orbsvcs/orbsvcs/IFRService/IFR_Service_Utils_T.h
@@ -0,0 +1,125 @@
+// -*- C++ -*-
+
+//=============================================================================
+/**
+ * @file IFR_Service_Utils_T.h
+ *
+ * $Id$
+ *
+ * Template methods useful to IFR Service.
+ *
+ * @author Jeff Parsons <j.parsons@vanderbilt.edu>
+ */
+//=============================================================================
+
+
+#ifndef TAO_IFR_SERVICE_UTILS_T_H
+#define TAO_IFR_SERVICE_UTILS_T_H
+
+#include /**/ "ace/pre.h"
+
+#include "ace/Configuration.h"
+
+#if !defined (ACE_LACKS_PRAGMA_ONCE)
+# pragma once
+#endif /* ACE_LACKS_PRAGMA_ONCE */
+
+#include "tao/IFR_Client/IFR_ComponentsC.h"
+
+#if defined(_MSC_VER)
+#pragma warning(push)
+#pragma warning(disable:4250)
+#endif /* _MSC_VER */
+
+TAO_BEGIN_VERSIONED_NAMESPACE_DECL
+
+class TAO_Repository_i;
+
+template<typename T>
+class TAO_IFR_Generic_Utils
+{
+public:
+ static void destroy_special (const char *section_name,
+ TAO_Repository_i *repo,
+ ACE_Configuration_Section_Key &key
+ ACE_ENV_ARG_DECL);
+
+ static void set_initializers (const T &initializers,
+ ACE_Configuration *config,
+ ACE_Configuration_Section_Key &key);
+ /// Common to Container::create_value(), create_ext_value
+ /// and ValueDef::initializers().
+};
+
+template<typename T_desc, typename T_impl>
+class TAO_IFR_Desc_Utils
+{
+public:
+ static void fill_desc_begin (T_desc &desc,
+ TAO_Repository_i *repo,
+ ACE_Configuration_Section_Key &key
+ ACE_ENV_ARG_DECL);
+};
+
+template<typename T_strseq>
+class TAO_IFR_Strseq_Utils
+{
+public:
+ static void fill_string_seq (const char *section_name,
+ ACE_Configuration *config,
+ ACE_Configuration_Section_Key &key,
+ T_strseq &seq);
+};
+
+template <typename T_desc_seq>
+class TAO_Port_Desc_Seq_Utils
+{
+public:
+ static void port_descriptions (T_desc_seq &desc_seq,
+ ACE_Configuration *config,
+ ACE_Configuration_Section_Key &key,
+ const char *sub_section);
+
+ static void get_is_multiple (T_desc_seq &desc_seq,
+ ACE_Configuration *config,
+ ACE_Configuration_Section_Key &key,
+ CORBA::ULong index);
+
+ static void port_base_type (T_desc_seq &desc_seq,
+ ACE_TString &holder,
+ CORBA::ULong index);
+};
+
+template<typename T>
+class TAO_Port_Utils
+{
+public:
+ static T *create_entry (const char *id,
+ const char *name,
+ const char *version,
+ const char *sub_section,
+ CORBA::Container_ptr port_base_type,
+ CORBA::Boolean is_multiple,
+ TAO_Repository_i *repo,
+ CORBA::DefinitionKind port_kind,
+ ACE_Configuration_Section_Key &key
+ ACE_ENV_ARG_DECL);
+
+ static void set_is_multiple (CORBA::Boolean is_multiple,
+ ACE_Configuration *config,
+ ACE_Configuration_Section_Key &key);
+};
+
+TAO_END_VERSIONED_NAMESPACE_DECL
+
+#if defined (ACE_TEMPLATES_REQUIRE_SOURCE)
+#include "orbsvcs/IFRService/IFR_Service_Utils_T.cpp"
+#endif /* defined REQUIRED SOURCE */
+
+#if defined(_MSC_VER)
+#pragma warning(pop)
+#endif /* _MSC_VER */
+
+#include /**/ "ace/post.h"
+
+#endif /* TAO_IFR_SERVICE_UTILS_T_H */
diff --git a/TAO/orbsvcs/orbsvcs/IFRService/IFR_macro.h b/TAO/orbsvcs/orbsvcs/IFRService/IFR_macro.h
new file mode 100644
index 00000000000..e48f4668015
--- /dev/null
+++ b/TAO/orbsvcs/orbsvcs/IFRService/IFR_macro.h
@@ -0,0 +1,51 @@
+/* -*- C++ -*- */
+// $Id$
+
+#ifndef TAO_IFR_MACROS_H
+#define TAO_IFR_MACROS_H
+
+#include /**/ "ace/pre.h"
+#include "ace/CORBA_macros.h"
+
+#if !defined (ACE_LACKS_PRAGMA_ONCE)
+# pragma once
+#endif /* ACE_LACKS_PRAGMA_ONCE */
+
+#include "tao/ORB_Constants.h"
+
+#define TAO_IFR_WRITE_GUARD \
+ ACE_WRITE_GUARD_THROW_EX (ACE_Lock, \
+ monitor, \
+ this->repo_->lock (), \
+ CORBA::INTERNAL ( \
+ CORBA::SystemException::_tao_minor_code ( \
+ TAO_GUARD_FAILURE, \
+ 0), \
+ CORBA::COMPLETED_NO)); \
+ ACE_CHECK
+
+#define TAO_IFR_WRITE_GUARD_RETURN(RETURN) \
+ ACE_WRITE_GUARD_THROW_EX (ACE_Lock, \
+ monitor, \
+ this->repo_->lock (), \
+ CORBA::INTERNAL ( \
+ CORBA::SystemException::_tao_minor_code ( \
+ TAO_GUARD_FAILURE, \
+ 0), \
+ CORBA::COMPLETED_NO)); \
+ ACE_CHECK_RETURN (RETURN)
+
+#define TAO_IFR_READ_GUARD_RETURN(RETURN) \
+ ACE_READ_GUARD_THROW_EX (ACE_Lock, \
+ monitor, \
+ this->repo_->lock (), \
+ CORBA::INTERNAL ( \
+ CORBA::SystemException::_tao_minor_code ( \
+ TAO_GUARD_FAILURE, \
+ 0), \
+ CORBA::COMPLETED_NO)); \
+ ACE_CHECK_RETURN (RETURN)
+
+#include /**/ "ace/post.h"
+
+#endif /* TAO_IFR_MACROS_H */
diff --git a/TAO/orbsvcs/orbsvcs/IFRService/IRObject_i.cpp b/TAO/orbsvcs/orbsvcs/IFRService/IRObject_i.cpp
new file mode 100644
index 00000000000..9846d186808
--- /dev/null
+++ b/TAO/orbsvcs/orbsvcs/IFRService/IRObject_i.cpp
@@ -0,0 +1,89 @@
+// $Id$
+
+#include "orbsvcs/IFRService/IRObject_i.h"
+#include "orbsvcs/IFRService/Repository_i.h"
+#include "orbsvcs/IFRService/IDLType_i.h"
+#include "orbsvcs/IFRService/Contained_i.h"
+#include "orbsvcs/IFRService/IFR_Service_Utils.h"
+
+#include "tao/PortableServer/Root_POA.h"
+#include "tao/PortableServer/POA_Current_Impl.h"
+#include "tao/TSS_Resources.h"
+
+
+ACE_RCSID (IFR_Service,
+ IRObject_i,
+ "$Id$")
+
+
+TAO_BEGIN_VERSIONED_NAMESPACE_DECL
+
+TAO_IRObject_i::TAO_IRObject_i (TAO_Repository_i *repo)
+ : repo_ (repo)
+{
+}
+
+TAO_IRObject_i::~TAO_IRObject_i (void)
+{
+}
+
+CORBA::DefinitionKind
+TAO_IRObject_i::def_kind (
+ ACE_ENV_SINGLE_ARG_DECL_NOT_USED
+ )
+ ACE_THROW_SPEC ((CORBA::SystemException))
+{
+ // Will always be overridden by concrete classes.
+ return CORBA::dk_none;
+}
+
+void
+TAO_IRObject_i::section_key (ACE_Configuration_Section_Key &key)
+{
+ this->section_key_ = key;
+}
+
+void
+TAO_IRObject_i::update_key (ACE_ENV_SINGLE_ARG_DECL)
+ ACE_THROW_SPEC ((CORBA::SystemException))
+{
+ TAO::Portable_Server::POA_Current_Impl *pc_impl =
+ static_cast <TAO::Portable_Server::POA_Current_Impl *>
+ (TAO_TSS_Resources::instance ()->poa_current_impl_);
+
+ PortableServer::ObjectId object_id;
+ int status = TAO_Root_POA::parse_ir_object_key (pc_impl->object_key (),
+ object_id);
+ if (status != 0)
+ {
+ ACE_DEBUG ((LM_DEBUG,
+ "update_key - parse_ir_object_key failed\n"));
+ return;
+ }
+
+ char *oid_string = TAO_IFR_Service_Utils::oid_to_string (object_id);
+
+ if (oid_string[0U] == '\0')
+ {
+ this->section_key_ = this->repo_->root_key ();
+ return;
+ }
+
+ ACE_TString path (oid_string,
+ 0,
+ 0);
+
+ status =
+ this->repo_->config ()->expand_path (this->repo_->root_key (),
+ path,
+ this->section_key_,
+ 0);
+
+ if (status != 0)
+ {
+ // If we're here, destroy() has been called on us.
+ ACE_THROW (CORBA::OBJECT_NOT_EXIST ());
+ }
+}
+
+TAO_END_VERSIONED_NAMESPACE_DECL
diff --git a/TAO/orbsvcs/orbsvcs/IFRService/IRObject_i.h b/TAO/orbsvcs/orbsvcs/IFRService/IRObject_i.h
new file mode 100644
index 00000000000..a6bbdc4adfa
--- /dev/null
+++ b/TAO/orbsvcs/orbsvcs/IFRService/IRObject_i.h
@@ -0,0 +1,99 @@
+// -*- C++ -*-
+
+// $Id$
+
+// ============================================================================
+//
+// = LIBRARY
+// TAO/orbsvcs/orbsvcs/IFRService
+//
+// = FILENAME
+// IRObject_i.h
+//
+// = DESCRIPTION
+// IRObject servant class.
+//
+// = AUTHOR
+// Jeff Parsons <parsons@cs.wustl.edu>
+//
+// ============================================================================
+
+#ifndef TAO_IROBJECT_I_H
+#define TAO_IROBJECT_I_H
+
+#include "ace/Configuration.h"
+#include "orbsvcs/IFRService/ifr_service_export.h"
+
+#if !defined (ACE_LACKS_PRAGMA_ONCE)
+# pragma once
+#endif /* ACE_LACKS_PRAGMA_ONCE */
+
+#include "orbsvcs/IFRService/IFR_ExtendedS.h"
+
+#if defined(_MSC_VER)
+#pragma warning(push)
+#pragma warning(disable:4250)
+#endif /* _MSC_VER */
+
+TAO_BEGIN_VERSIONED_NAMESPACE_DECL
+
+class TAO_Repository_i;
+class TAO_IDLType_i;
+class TAO_Contained_i;
+class TAO_Container_i;
+
+class TAO_IFRService_Export TAO_IRObject_i : public POA_CORBA::IRObject
+{
+ // = TITLE
+ // TAO_IRObject_i
+ //
+ // = DESCRIPTION
+ // Abstract base class for all IR object types.
+ //
+public:
+ TAO_IRObject_i (TAO_Repository_i *repo);
+ // Constructor.
+
+ virtual ~TAO_IRObject_i (void);
+ // Destructor.
+
+ virtual CORBA::DefinitionKind def_kind (
+ ACE_ENV_SINGLE_ARG_DECL_WITH_DEFAULTS
+ )
+ ACE_THROW_SPEC ((CORBA::SystemException));
+
+ virtual void destroy (
+ ACE_ENV_SINGLE_ARG_DECL_WITH_DEFAULTS
+ )
+ ACE_THROW_SPEC ((CORBA::SystemException)) = 0;
+ // Pure virtual.
+
+ virtual void destroy_i (
+ ACE_ENV_SINGLE_ARG_DECL_WITH_DEFAULTS
+ )
+ ACE_THROW_SPEC ((CORBA::SystemException)) = 0;
+ // Pure virtual - the unlocked version called by the destroy() wrapper.
+
+ void section_key (ACE_Configuration_Section_Key &key);
+ // Plug in the section key.
+
+protected:
+ void update_key (ACE_ENV_SINGLE_ARG_DECL)
+ ACE_THROW_SPEC ((CORBA::SystemException));
+ // Set our key from the object ID via POACurrent.
+
+protected:
+ TAO_Repository_i *repo_;
+ // Pointer to the repository we were constructed from.
+
+ ACE_Configuration_Section_Key section_key_;
+ // Our ACE_Configuration section key.
+};
+
+TAO_END_VERSIONED_NAMESPACE_DECL
+
+#if defined(_MSC_VER)
+#pragma warning(pop)
+#endif /* _MSC_VER */
+
+#endif /* TAO_IROBJECT_I_H */
diff --git a/TAO/orbsvcs/orbsvcs/IFRService/InterfaceAttrExtension_i.cpp b/TAO/orbsvcs/orbsvcs/IFRService/InterfaceAttrExtension_i.cpp
new file mode 100644
index 00000000000..943a6082e1f
--- /dev/null
+++ b/TAO/orbsvcs/orbsvcs/IFRService/InterfaceAttrExtension_i.cpp
@@ -0,0 +1,343 @@
+// $Id$
+
+#include "orbsvcs/IFRService/InterfaceAttrExtension_i.h"
+#include "orbsvcs/IFRService/Repository_i.h"
+#include "orbsvcs/IFRService/InterfaceDef_i.h"
+#include "orbsvcs/IFRService/OperationDef_i.h"
+#include "orbsvcs/IFRService/AttributeDef_i.h"
+#include "orbsvcs/IFRService/ExtAttributeDef_i.h"
+#include "orbsvcs/IFRService/IFR_Service_Utils.h"
+
+#include "ace/SString.h"
+
+
+ACE_RCSID (IFRService,
+ InterfaceAttrExtension_i,
+ "$Id$")
+
+// =====================================================================
+
+TAO_BEGIN_VERSIONED_NAMESPACE_DECL
+
+TAO_InterfaceAttrExtension_i::TAO_InterfaceAttrExtension_i (
+ TAO_Repository_i *repo
+ )
+ : TAO_IRObject_i (repo)
+{
+}
+
+TAO_InterfaceAttrExtension_i::~TAO_InterfaceAttrExtension_i (void)
+{
+}
+
+
+CORBA::InterfaceAttrExtension::ExtFullInterfaceDescription *
+TAO_InterfaceAttrExtension_i::describe_ext_interface (
+ ACE_ENV_SINGLE_ARG_DECL
+ )
+ ACE_THROW_SPEC ((CORBA::SystemException))
+{
+ TAO_IFR_READ_GUARD_RETURN (0);
+
+ this->update_key (ACE_ENV_SINGLE_ARG_PARAMETER);
+ ACE_CHECK_RETURN (0);
+
+ return this->describe_ext_interface_i (ACE_ENV_SINGLE_ARG_PARAMETER);
+}
+
+CORBA::InterfaceAttrExtension::ExtFullInterfaceDescription *
+TAO_InterfaceAttrExtension_i::describe_ext_interface_i (
+ ACE_ENV_SINGLE_ARG_DECL
+ )
+ ACE_THROW_SPEC ((CORBA::SystemException))
+{
+ CORBA::InterfaceAttrExtension::ExtFullInterfaceDescription *fifd = 0;
+ ACE_NEW_RETURN (fifd,
+ CORBA::InterfaceAttrExtension::ExtFullInterfaceDescription,
+ 0);
+
+ CORBA::InterfaceAttrExtension::ExtFullInterfaceDescription_var retval =
+ fifd;
+
+ ACE_TString holder;
+
+ this->repo_->config ()->get_string_value (this->section_key_,
+ "name",
+ holder);
+ fifd->name = holder.fast_rep ();
+ this->repo_->config ()->get_string_value (this->section_key_,
+ "id",
+ holder);
+ fifd->id = holder.fast_rep ();
+
+ this->repo_->config ()->get_string_value (this->section_key_,
+ "container_id",
+ holder);
+
+ fifd->defined_in = holder.fast_rep ();
+ this->repo_->config ()->get_string_value (this->section_key_,
+ "version",
+ holder);
+ fifd->version = holder.fast_rep ();
+
+ CORBA::ULong i = 0;
+ CORBA::ULong j = 0;
+ ACE_Unbounded_Queue<ACE_Configuration_Section_Key> key_queue;
+
+ // Store our section key for later restoration after we have
+ // traversed entries for inherited interfaces.
+ ACE_Configuration_Section_Key key_holder = this->section_key_;
+
+ // Operations
+ TAO_InterfaceDef_i iface (this->repo_);
+ iface.section_key (this->section_key_);
+ iface.inherited_operations (key_queue);
+
+ // Restore our original section key.
+ // I am not sure this is needed but it will not hurt.
+ this->section_key (key_holder);
+
+ ACE_Configuration_Section_Key ops_key, op_key;
+ int status =
+ this->repo_->config ()->open_section (this->section_key_,
+ "ops",
+ 0,
+ ops_key);
+
+ CORBA::ULong count = 0;
+
+ if (status == 0)
+ {
+ this->repo_->config ()->get_integer_value (ops_key,
+ "count",
+ count);
+
+ for (j = 0; j < count; ++j)
+ {
+ char *stringified = TAO_IFR_Service_Utils::int_to_string (j);
+ status =
+ this->repo_->config ()->open_section (ops_key,
+ stringified,
+ 0,
+ op_key);
+
+ if (status == 0)
+ {
+ key_queue.enqueue_tail (op_key);
+ }
+ }
+ }
+
+ CORBA::ULong size = static_cast<CORBA::ULong> (key_queue.size ());
+ fifd->operations.length (size);
+
+ for (i = 0; i < size; ++i)
+ {
+ ACE_Configuration_Section_Key key;
+ key_queue.dequeue_head (key);
+
+ TAO_OperationDef_i op (this->repo_);
+ op.section_key (key);
+
+ op.make_description (fifd->operations[i]
+ ACE_ENV_ARG_PARAMETER);
+ ACE_CHECK_RETURN (0);
+ }
+
+ // Restore our original section key.
+ // It may have been overwritten by a superclass key as part of the
+ // make_description() call.
+ this->section_key (key_holder);
+
+ // Attributes.
+ iface.inherited_attributes (key_queue);
+
+ // Restore our original section key.
+ // I am not sure this is needed but it will not hurt.
+ this->section_key (key_holder);
+
+ ACE_Configuration_Section_Key attrs_key;
+ status =
+ this->repo_->config ()->open_section (this->section_key_,
+ "attrs",
+ 0,
+ attrs_key);
+
+ count = 0;
+
+ if (status == 0)
+ {
+ this->repo_->config ()->get_integer_value (attrs_key,
+ "count",
+ count);
+
+ for (j = 0; j < count; ++j)
+ {
+ ACE_Configuration_Section_Key attr_key;
+ char *stringified = TAO_IFR_Service_Utils::int_to_string (j);
+ status =
+ this->repo_->config ()->open_section (attrs_key,
+ stringified,
+ 0,
+ attr_key);
+
+ if (status == 0)
+ {
+ key_queue.enqueue_tail (attr_key);
+ }
+ }
+ }
+
+ size = static_cast<CORBA::ULong> (key_queue.size ());
+ fifd->attributes.length (size);
+
+ for (i = 0; i < size; ++i)
+ {
+ ACE_Configuration_Section_Key key;
+ key_queue.dequeue_head (key);
+
+ TAO_ExtAttributeDef_i attr (this->repo_);
+ attr.section_key (key);
+
+ attr.fill_description (fifd->attributes[i]
+ ACE_ENV_ARG_PARAMETER);
+ ACE_CHECK_RETURN (0);
+ }
+
+ // Restore our original section key.
+ // It may have been overwritten by a superclass key as part of the
+ // fill_description() call.
+ this->section_key (key_holder);
+
+ CORBA::InterfaceDefSeq_var bases =
+ iface.base_interfaces_i (ACE_ENV_SINGLE_ARG_PARAMETER);
+ ACE_CHECK_RETURN (0);
+
+ CORBA::ULong length = bases->length ();
+ CORBA::RepositoryIdSeq repo_ids (length);
+ repo_ids.length (length);
+
+ PortableServer::ObjectId_var oid;
+ char *base_path = 0;
+ ACE_Configuration_Section_Key base_key;
+
+ for (i = 0; i < length; ++i)
+ {
+ base_path = TAO_IFR_Service_Utils::reference_to_path (bases[i]);
+
+ this->repo_->config ()->expand_path (this->repo_->root_key (),
+ base_path,
+ base_key,
+ 0);
+ this->repo_->config ()->get_string_value (base_key,
+ "id",
+ holder);
+ repo_ids[i] = holder.fast_rep ();
+ }
+
+ fifd->base_interfaces = repo_ids;
+
+ fifd->type = iface.type_i (ACE_ENV_SINGLE_ARG_PARAMETER);
+ ACE_CHECK_RETURN (0);
+
+ return retval._retn ();
+}
+
+CORBA::ExtAttributeDef_ptr
+TAO_InterfaceAttrExtension_i::create_ext_attribute (
+ const char *id,
+ const char *name,
+ const char *version,
+ CORBA::IDLType_ptr type,
+ CORBA::AttributeMode mode,
+ const CORBA::ExceptionDefSeq &get_exceptions,
+ const CORBA::ExceptionDefSeq &set_exceptions
+ ACE_ENV_ARG_DECL
+ )
+ ACE_THROW_SPEC ((CORBA::SystemException))
+{
+ TAO_IFR_WRITE_GUARD_RETURN (CORBA::ExtAttributeDef::_nil ());
+
+ this->update_key (ACE_ENV_SINGLE_ARG_PARAMETER);
+ ACE_CHECK_RETURN (CORBA::ExtAttributeDef::_nil ());
+
+ return this->create_ext_attribute_i (id,
+ name,
+ version,
+ type,
+ mode,
+ get_exceptions,
+ set_exceptions
+ ACE_ENV_ARG_PARAMETER);
+}
+
+CORBA::ExtAttributeDef_ptr
+TAO_InterfaceAttrExtension_i::create_ext_attribute_i (
+ const char *id,
+ const char *name,
+ const char *version,
+ CORBA::IDLType_ptr type,
+ CORBA::AttributeMode mode,
+ const CORBA::ExceptionDefSeq &get_exceptions,
+ const CORBA::ExceptionDefSeq &set_exceptions
+ ACE_ENV_ARG_DECL
+ )
+ ACE_THROW_SPEC ((CORBA::SystemException))
+{
+ TAO_Container_i::tmp_name_holder (name);
+ ACE_Configuration_Section_Key new_key;
+
+ // Common to all IR objects created in CORBA::Container.
+ ACE_TString path =
+ TAO_IFR_Service_Utils::create_common (CORBA::dk_Interface,
+ CORBA::dk_Attribute,
+ this->section_key_,
+ new_key,
+ this->repo_,
+ id,
+ name,
+ &TAO_Container_i::same_as_tmp_name,
+ version,
+ "attrs"
+ ACE_ENV_ARG_PARAMETER);
+ ACE_CHECK_RETURN (CORBA::ExtAttributeDef::_nil ());
+
+ // Store the path to the attribute's type definition.
+ char *type_path = TAO_IFR_Service_Utils::reference_to_path (type);
+
+ this->repo_->config ()->set_string_value (new_key,
+ "type_path",
+ type_path);
+
+ // Store the attribute's mode.
+ this->repo_->config ()->set_integer_value (new_key,
+ "mode",
+ mode);
+
+ TAO_IFR_Service_Utils::set_exceptions (this->repo_->config (),
+ new_key,
+ "get_excepts",
+ get_exceptions);
+
+ TAO_IFR_Service_Utils::set_exceptions (this->repo_->config (),
+ new_key,
+ "put_excepts",
+ set_exceptions);
+
+ // Create the object reference.
+ CORBA::Object_var obj =
+ TAO_IFR_Service_Utils::create_objref (CORBA::dk_Attribute,
+ path.c_str (),
+ this->repo_
+ ACE_ENV_ARG_PARAMETER);
+ ACE_CHECK_RETURN (CORBA::ExtAttributeDef::_nil ());
+
+ CORBA::ExtAttributeDef_var retval =
+ CORBA::ExtAttributeDef::_narrow (obj.in ()
+ ACE_ENV_ARG_PARAMETER);
+ ACE_CHECK_RETURN (CORBA::ExtAttributeDef::_nil ());
+
+ return retval._retn ();
+}
+
+TAO_END_VERSIONED_NAMESPACE_DECL
diff --git a/TAO/orbsvcs/orbsvcs/IFRService/InterfaceAttrExtension_i.h b/TAO/orbsvcs/orbsvcs/IFRService/InterfaceAttrExtension_i.h
new file mode 100644
index 00000000000..f330fe3dec6
--- /dev/null
+++ b/TAO/orbsvcs/orbsvcs/IFRService/InterfaceAttrExtension_i.h
@@ -0,0 +1,97 @@
+// -*- C++ -*-
+// $Id$
+
+// ============================================================================
+//
+// = LIBRARY
+// TAO/orbsvcs/orbsvcs/IFRService
+//
+// = FILENAME
+// InterfaceAttrExtension_i.h
+//
+// = DESCRIPTION
+// InterfaceAttrExtension_i servant class.
+//
+// = AUTHOR
+// Jeff Parsons <j.parsons@vanderbilt.edu>
+//
+// ============================================================================
+
+#ifndef TAO_INTERFACEATTREXTENSION_I_H
+#define TAO_INTERFACEATTREXTENSION_I_H
+
+#include "orbsvcs/IFRService/IRObject_i.h"
+#include "orbsvcs/IFRService/ifr_service_export.h"
+
+#if !defined (ACE_LACKS_PRAGMA_ONCE)
+# pragma once
+#endif /* ACE_LACKS_PRAGMA_ONCE */
+
+#if defined(_MSC_VER)
+#pragma warning(push)
+#pragma warning(disable:4250)
+#endif /* _MSC_VER */
+
+TAO_BEGIN_VERSIONED_NAMESPACE_DECL
+
+class TAO_IFRService_Export TAO_InterfaceAttrExtension_i
+ : public virtual TAO_IRObject_i
+{
+ // = TITLE
+ // TAO_InterfaceAttrExtension_i
+ //
+ // = DESCRIPTION
+ // IDL3 attribute extension mixin class.
+ //
+public:
+ TAO_InterfaceAttrExtension_i (TAO_Repository_i *repo);
+ // Constructor
+
+ virtual ~TAO_InterfaceAttrExtension_i (void);
+ // Destructor
+
+ virtual
+ CORBA::InterfaceAttrExtension::ExtFullInterfaceDescription *
+ describe_ext_interface (
+ ACE_ENV_SINGLE_ARG_DECL_WITH_DEFAULTS
+ )
+ ACE_THROW_SPEC ((CORBA::SystemException));
+
+ CORBA::InterfaceAttrExtension::ExtFullInterfaceDescription *
+ describe_ext_interface_i (
+ ACE_ENV_SINGLE_ARG_DECL_WITH_DEFAULTS
+ )
+ ACE_THROW_SPEC ((CORBA::SystemException));
+
+ virtual CORBA::ExtAttributeDef_ptr create_ext_attribute (
+ const char *id,
+ const char *name,
+ const char *version,
+ CORBA::IDLType_ptr type,
+ CORBA::AttributeMode mode,
+ const CORBA::ExceptionDefSeq &get_exceptions,
+ const CORBA::ExceptionDefSeq &set_exceptions
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS
+ )
+ ACE_THROW_SPEC ((CORBA::SystemException));
+
+ CORBA::ExtAttributeDef_ptr create_ext_attribute_i (
+ const char *id,
+ const char *name,
+ const char *version,
+ CORBA::IDLType_ptr type,
+ CORBA::AttributeMode mode,
+ const CORBA::ExceptionDefSeq &get_exceptions,
+ const CORBA::ExceptionDefSeq &set_exceptions
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS
+ )
+ ACE_THROW_SPEC ((CORBA::SystemException));
+};
+
+TAO_END_VERSIONED_NAMESPACE_DECL
+
+#if defined(_MSC_VER)
+#pragma warning(pop)
+#endif /* _MSC_VER */
+
+#endif /* TAO_INTERFACEATTREXTENSION_I_H */
diff --git a/TAO/orbsvcs/orbsvcs/IFRService/InterfaceDef_i.cpp b/TAO/orbsvcs/orbsvcs/IFRService/InterfaceDef_i.cpp
new file mode 100644
index 00000000000..9fd69d6cb63
--- /dev/null
+++ b/TAO/orbsvcs/orbsvcs/IFRService/InterfaceDef_i.cpp
@@ -0,0 +1,1285 @@
+// $Id$
+
+#include "orbsvcs/IFRService/InterfaceDef_i.h"
+#include "orbsvcs/IFRService/Repository_i.h"
+#include "orbsvcs/IFRService/AttributeDef_i.h"
+#include "orbsvcs/IFRService/OperationDef_i.h"
+#include "orbsvcs/IFRService/IFR_Service_Utils.h"
+#include "orbsvcs/IFRService/IFR_Service_Utils_T.h"
+
+#include "ace/SString.h"
+
+
+ACE_RCSID (IFRService,
+ InterfaceDef_i,
+ "$Id$")
+
+TAO_BEGIN_VERSIONED_NAMESPACE_DECL
+
+TAO_InterfaceDef_i::TAO_InterfaceDef_i (
+ TAO_Repository_i *repo
+ )
+ : TAO_IRObject_i (repo),
+ TAO_Container_i (repo),
+ TAO_Contained_i (repo),
+ TAO_IDLType_i (repo)
+{
+}
+
+TAO_InterfaceDef_i::~TAO_InterfaceDef_i (void)
+{
+}
+
+CORBA::DefinitionKind
+TAO_InterfaceDef_i::def_kind (ACE_ENV_SINGLE_ARG_DECL_NOT_USED)
+ ACE_THROW_SPEC ((CORBA::SystemException))
+{
+ return CORBA::dk_Interface;
+}
+
+void
+TAO_InterfaceDef_i::destroy (ACE_ENV_SINGLE_ARG_DECL)
+ ACE_THROW_SPEC ((CORBA::SystemException))
+{
+ TAO_IFR_WRITE_GUARD;
+
+ this->update_key (ACE_ENV_SINGLE_ARG_PARAMETER);
+ ACE_CHECK;
+
+ this->destroy_i (ACE_ENV_SINGLE_ARG_PARAMETER);
+}
+
+void
+TAO_InterfaceDef_i::destroy_i (ACE_ENV_SINGLE_ARG_DECL)
+ ACE_THROW_SPEC ((CORBA::SystemException))
+{
+ // Destroy our members.
+ this->TAO_Container_i::destroy_i (ACE_ENV_SINGLE_ARG_PARAMETER);
+ ACE_CHECK;
+
+ // These will get rid of the repo ids, which Contained_i::destroy()'s
+ // call to remove_section (recursive = 1) will not get, and also
+ // destroy the attribute's anonymous type, if any.
+
+ TAO_IFR_Generic_Utils<TAO_AttributeDef_i>::destroy_special (
+ "attrs",
+ this->repo_,
+ this->section_key_
+ ACE_ENV_ARG_PARAMETER
+ );
+ ACE_CHECK;
+
+ TAO_IFR_Generic_Utils<TAO_OperationDef_i>::destroy_special (
+ "ops",
+ this->repo_,
+ this->section_key_
+ ACE_ENV_ARG_PARAMETER
+ );
+ ACE_CHECK;
+
+ // Destroy ourself.
+ this->TAO_Contained_i::destroy_i (ACE_ENV_SINGLE_ARG_PARAMETER);
+ ACE_CHECK;
+}
+
+CORBA::Contained::Description *
+TAO_InterfaceDef_i::describe (ACE_ENV_SINGLE_ARG_DECL)
+ ACE_THROW_SPEC ((CORBA::SystemException))
+{
+ TAO_IFR_READ_GUARD_RETURN (0);
+
+ this->update_key (ACE_ENV_SINGLE_ARG_PARAMETER);
+ ACE_CHECK_RETURN (0);
+
+ return this->describe_i (ACE_ENV_SINGLE_ARG_PARAMETER);
+}
+
+CORBA::Contained::Description *
+TAO_InterfaceDef_i::describe_i (ACE_ENV_SINGLE_ARG_DECL)
+ ACE_THROW_SPEC ((CORBA::SystemException))
+{
+ CORBA::Contained::Description *desc_ptr = 0;
+ ACE_NEW_THROW_EX (desc_ptr,
+ CORBA::Contained::Description,
+ CORBA::NO_MEMORY ());
+ ACE_CHECK_RETURN (0);
+
+ CORBA::Contained::Description_var retval = desc_ptr;
+
+ retval->kind = this->def_kind (ACE_ENV_SINGLE_ARG_PARAMETER);
+ ACE_CHECK_RETURN (0);
+
+ CORBA::InterfaceDescription ifd;
+ ACE_TString holder;
+
+ this->repo_->config ()->get_string_value (this->section_key_,
+ "name",
+ holder);
+ ifd.name = holder.fast_rep ();
+ this->repo_->config ()->get_string_value (this->section_key_,
+ "id",
+ holder);
+ ifd.id = holder.fast_rep ();
+ this->repo_->config ()->get_string_value (this->section_key_,
+ "container_id",
+ holder);
+ ifd.defined_in = holder.fast_rep ();
+ this->repo_->config ()->get_string_value (this->section_key_,
+ "version",
+ holder);
+ ifd.version = holder.fast_rep ();
+
+ CORBA::ULong i = 0;
+ CORBA::InterfaceDefSeq_var bases =
+ this->base_interfaces_i (ACE_ENV_SINGLE_ARG_PARAMETER);
+ ACE_CHECK_RETURN (0);
+
+ CORBA::ULong length = bases->length ();
+ CORBA::RepositoryIdSeq repo_ids (length);
+ repo_ids.length (length);
+
+ char *base_path = 0;
+ ACE_Configuration_Section_Key base_key;
+
+ for (i = 0; i < length; ++i)
+ {
+ base_path = TAO_IFR_Service_Utils::reference_to_path (bases[i]);
+
+ this->repo_->config ()->expand_path (this->repo_->root_key (),
+ base_path,
+ base_key,
+ 0);
+
+ TAO_InterfaceDef_i impl (this->repo_);
+ impl.section_key (base_key);
+
+ repo_ids[i] = impl.id_i (ACE_ENV_SINGLE_ARG_PARAMETER);
+ ACE_CHECK_RETURN (0);
+ }
+
+ ifd.base_interfaces = repo_ids;
+ retval->value <<= ifd;
+ return retval._retn ();
+}
+
+CORBA::TypeCode_ptr
+TAO_InterfaceDef_i::type (ACE_ENV_SINGLE_ARG_DECL)
+ ACE_THROW_SPEC ((CORBA::SystemException))
+{
+ TAO_IFR_READ_GUARD_RETURN (CORBA::TypeCode::_nil ());
+
+ this->update_key (ACE_ENV_SINGLE_ARG_PARAMETER);
+ ACE_CHECK_RETURN (CORBA::TypeCode::_nil ());
+
+ return this->type_i (ACE_ENV_SINGLE_ARG_PARAMETER);
+}
+
+CORBA::TypeCode_ptr
+TAO_InterfaceDef_i::type_i (ACE_ENV_SINGLE_ARG_DECL)
+ ACE_THROW_SPEC ((CORBA::SystemException))
+{
+ ACE_TString id;
+ this->repo_->config ()->get_string_value (this->section_key_,
+ "id",
+ id);
+
+ ACE_TString name;
+ this->repo_->config ()->get_string_value (this->section_key_,
+ "name",
+ name);
+
+ return this->repo_->tc_factory ()->create_interface_tc (
+ id.c_str (),
+ name.c_str ()
+ ACE_ENV_ARG_PARAMETER
+ );
+}
+
+CORBA::InterfaceDefSeq *
+TAO_InterfaceDef_i::base_interfaces (ACE_ENV_SINGLE_ARG_DECL)
+ ACE_THROW_SPEC ((CORBA::SystemException))
+{
+ TAO_IFR_READ_GUARD_RETURN (0);
+
+ this->update_key (ACE_ENV_SINGLE_ARG_PARAMETER);
+ ACE_CHECK_RETURN (0);
+
+ return this->base_interfaces_i (ACE_ENV_SINGLE_ARG_PARAMETER);
+}
+
+CORBA::InterfaceDefSeq *
+TAO_InterfaceDef_i::base_interfaces_i (ACE_ENV_SINGLE_ARG_DECL)
+ ACE_THROW_SPEC ((CORBA::SystemException))
+{
+ ACE_Unbounded_Queue<CORBA::DefinitionKind> kind_queue;
+ ACE_Unbounded_Queue<ACE_TString> path_queue;
+
+ this->base_interfaces_recursive (kind_queue,
+ path_queue);
+
+ CORBA::ULong size = static_cast<CORBA::ULong> (kind_queue.size ());
+
+ CORBA::InterfaceDefSeq *seq = 0;
+ ACE_NEW_THROW_EX (seq,
+ CORBA::InterfaceDefSeq (size),
+ CORBA::NO_MEMORY ());
+ ACE_CHECK_RETURN (0);
+
+ seq->length (size);
+ CORBA::InterfaceDefSeq_var retval = seq;
+
+ for (CORBA::ULong i = 0; i < size; ++i)
+ {
+ CORBA::DefinitionKind def_kind;
+ kind_queue.dequeue_head (def_kind);
+
+ ACE_TString path;
+ path_queue.dequeue_head (path);
+
+ CORBA::Object_var obj =
+ TAO_IFR_Service_Utils::path_to_ir_object (path,
+ this->repo_
+ ACE_ENV_ARG_PARAMETER);
+ ACE_CHECK_RETURN (0);
+
+ retval[i] = CORBA::InterfaceDef::_narrow (obj.in ()
+ ACE_ENV_ARG_PARAMETER);
+ ACE_CHECK_RETURN (0);
+ }
+
+ return retval._retn ();
+}
+
+void
+TAO_InterfaceDef_i::base_interfaces (const CORBA::InterfaceDefSeq &base_interfaces
+ ACE_ENV_ARG_DECL)
+ ACE_THROW_SPEC ((CORBA::SystemException))
+{
+ TAO_IFR_WRITE_GUARD;
+
+ this->update_key (ACE_ENV_SINGLE_ARG_PARAMETER);
+ ACE_CHECK;
+
+ this->base_interfaces_i (base_interfaces
+ ACE_ENV_ARG_PARAMETER);
+}
+
+void
+TAO_InterfaceDef_i::base_interfaces_i (const CORBA::InterfaceDefSeq &base_interfaces
+ ACE_ENV_ARG_DECL)
+ ACE_THROW_SPEC ((CORBA::SystemException))
+{
+ // If we are an abstract interface, all our base interfaces must be
+ // abstract as well.
+ CORBA::DefinitionKind def_kind = this->def_kind (ACE_ENV_SINGLE_ARG_PARAMETER);
+ ACE_CHECK;
+
+ if (def_kind == CORBA::dk_AbstractInterface)
+ {
+ CORBA::ULong length = base_interfaces.length ();
+
+ for (CORBA::ULong i = 0; i < length; ++i)
+ {
+ def_kind = base_interfaces[i]->def_kind (ACE_ENV_SINGLE_ARG_PARAMETER);
+ ACE_CHECK;
+
+ if (def_kind != CORBA::dk_AbstractInterface)
+ {
+ ACE_THROW (CORBA::BAD_PARAM (CORBA::OMGVMCID | 11,
+ CORBA::COMPLETED_NO));
+ }
+ }
+ }
+
+ // Remove the old base interfaces.
+ this->repo_->config ()->remove_section (this->section_key_,
+ "inherited",
+ 0);
+
+ CORBA::ULong length = base_interfaces.length ();
+ ACE_Configuration_Section_Key inherited_key;
+ this->repo_->config ()->open_section (this->section_key_,
+ "inherited",
+ 1,
+ inherited_key);
+
+ CORBA::String_var name;
+ char *inherited_path = 0;
+ PortableServer::ObjectId_var oid;
+ ACE_Configuration_Section_Key base_key;
+
+ for (CORBA::ULong i = 0; i < length; ++i)
+ {
+ inherited_path =
+ TAO_IFR_Service_Utils::reference_to_path (base_interfaces[i]);
+
+ this->repo_->config ()->expand_path (this->repo_->root_key (),
+ inherited_path,
+ base_key,
+ 0);
+
+ TAO_InterfaceDef_i impl (this->repo_);
+ impl.section_key (base_key);
+
+ name = impl.name_i (ACE_ENV_SINGLE_ARG_PARAMETER);
+ ACE_CHECK;
+
+ // None of these names can clash with any we may already have.
+ TAO_Container_i::tmp_name_holder_ = name.in ();
+ TAO_IFR_Service_Utils::name_exists (&TAO_Container_i::same_as_tmp_name,
+ this->section_key_,
+ this->repo_,
+ this->def_kind ()
+ ACE_ENV_ARG_PARAMETER);
+ ACE_CHECK;
+
+ char *stringified = TAO_IFR_Service_Utils::int_to_string (i);
+ this->repo_->config ()->set_string_value (inherited_key,
+ stringified,
+ inherited_path);
+ }
+}
+
+CORBA::Boolean
+TAO_InterfaceDef_i::is_a (const char *interface_id
+ ACE_ENV_ARG_DECL)
+ ACE_THROW_SPEC ((CORBA::SystemException))
+{
+ TAO_IFR_READ_GUARD_RETURN (0);
+
+ this->update_key (ACE_ENV_SINGLE_ARG_PARAMETER);
+ ACE_CHECK_RETURN (0);
+
+ return this->is_a_i (interface_id
+ ACE_ENV_ARG_PARAMETER);
+}
+
+CORBA::Boolean
+TAO_InterfaceDef_i::is_a_i (const char *interface_id
+ ACE_ENV_ARG_DECL)
+ ACE_THROW_SPEC ((CORBA::SystemException))
+{
+ if (ACE_OS::strcmp (interface_id, "IDL:omg.org/CORBA/Object:1.0") == 0)
+ {
+ return 1;
+ }
+
+ ACE_TString id;
+ this->repo_->config ()->get_string_value (this->section_key_,
+ "id",
+ id);
+
+ // Is it our type?
+ if (ACE_OS::strcmp (id.fast_rep (), interface_id) == 0)
+ {
+ return 1;
+ }
+
+ // Is it one of our ancestors' types?
+ CORBA::InterfaceDefSeq_var bases =
+ this->base_interfaces_i (ACE_ENV_SINGLE_ARG_PARAMETER);
+ ACE_CHECK_RETURN (0);
+
+ CORBA::ULong length = bases->length ();
+
+ PortableServer::ObjectId_var oid;
+ char *base_path = 0;
+ ACE_Configuration_Section_Key base_key;
+
+ for (CORBA::ULong i = 0; i < length; ++i)
+ {
+ base_path = TAO_IFR_Service_Utils::reference_to_path (bases[i]);
+
+ this->repo_->config ()->expand_path (this->repo_->root_key (),
+ base_path,
+ base_key,
+ 0);
+
+ TAO_InterfaceDef_i impl (this->repo_);
+ impl.section_key (base_key);
+
+ CORBA::Boolean success = impl.is_a_i (interface_id
+ ACE_ENV_ARG_PARAMETER);
+ ACE_CHECK_RETURN (0);
+
+ if (success == 1)
+ {
+ return 1;
+ }
+ }
+
+ return 0;
+}
+
+CORBA::InterfaceDef::FullInterfaceDescription *
+TAO_InterfaceDef_i::describe_interface (ACE_ENV_SINGLE_ARG_DECL)
+ ACE_THROW_SPEC ((CORBA::SystemException))
+{
+ TAO_IFR_READ_GUARD_RETURN (0);
+
+ this->update_key (ACE_ENV_SINGLE_ARG_PARAMETER);
+ ACE_CHECK_RETURN (0);
+
+ return this->describe_interface_i (ACE_ENV_SINGLE_ARG_PARAMETER);
+}
+
+CORBA::InterfaceDef::FullInterfaceDescription *
+TAO_InterfaceDef_i::describe_interface_i (ACE_ENV_SINGLE_ARG_DECL)
+ ACE_THROW_SPEC ((CORBA::SystemException))
+{
+ CORBA::InterfaceDef::FullInterfaceDescription *fifd = 0;
+ ACE_NEW_RETURN (fifd,
+ CORBA::InterfaceDef::FullInterfaceDescription,
+ 0);
+
+ CORBA::InterfaceDef::FullInterfaceDescription_var retval = fifd;
+
+ ACE_TString holder;
+
+ this->repo_->config ()->get_string_value (this->section_key_,
+ "name",
+ holder);
+ fifd->name = holder.fast_rep ();
+ this->repo_->config ()->get_string_value (this->section_key_,
+ "id",
+ holder);
+ fifd->id = holder.fast_rep ();
+
+ this->repo_->config ()->get_string_value (this->section_key_,
+ "container_id",
+ holder);
+
+ fifd->defined_in = holder.fast_rep ();
+ this->repo_->config ()->get_string_value (this->section_key_,
+ "version",
+ holder);
+ fifd->version = holder.fast_rep ();
+
+ CORBA::ULong i = 0;
+ CORBA::ULong j = 0;
+ ACE_Unbounded_Queue<ACE_Configuration_Section_Key> key_queue;
+
+ // Store our section key for later restoration after we have
+ // traversed entries for inherited interfaces.
+ ACE_Configuration_Section_Key key_holder = this->section_key_;
+
+ // Operations
+ this->inherited_operations (key_queue);
+
+ // Restore our original section key.
+ // I am not sure this is needed but it will not hurt.
+ this->section_key (key_holder);
+
+ ACE_Configuration_Section_Key ops_key, op_key;
+ int status =
+ this->repo_->config ()->open_section (this->section_key_,
+ "ops",
+ 0,
+ ops_key);
+
+ CORBA::ULong count = 0;
+
+ if (status == 0)
+ {
+ this->repo_->config ()->get_integer_value (ops_key,
+ "count",
+ count);
+
+ for (j = 0; j < count; ++j)
+ {
+ char *stringified = TAO_IFR_Service_Utils::int_to_string (j);
+ status =
+ this->repo_->config ()->open_section (ops_key,
+ stringified,
+ 0,
+ op_key);
+
+ if (status == 0)
+ {
+ key_queue.enqueue_tail (op_key);
+ }
+ }
+ }
+
+ CORBA::ULong size = static_cast<CORBA::ULong> (key_queue.size ());
+ fifd->operations.length (size);
+
+ for (i = 0; i < size; ++i)
+ {
+ ACE_Configuration_Section_Key key;
+ key_queue.dequeue_head (key);
+
+ TAO_OperationDef_i op (this->repo_);
+ op.section_key (key);
+
+ op.make_description (fifd->operations[i]
+ ACE_ENV_ARG_PARAMETER);
+ ACE_CHECK_RETURN (0);
+ }
+
+ // Restore our original section key.
+ // It may have been overwritten by a superclass key as part of the
+ // make_description() call.
+ this->section_key (key_holder);
+
+ // Attributes
+ this->inherited_attributes (key_queue);
+
+ // Restore our original section key.
+ // I am not sure this is needed but it will not hurt.
+ this->section_key (key_holder);
+
+ ACE_Configuration_Section_Key attrs_key;
+ status =
+ this->repo_->config ()->open_section (this->section_key_,
+ "attrs",
+ 0,
+ attrs_key);
+
+ count = 0;
+
+ if (status == 0)
+ {
+ this->repo_->config ()->get_integer_value (attrs_key,
+ "count",
+ count);
+
+ for (j = 0; j < count; ++j)
+ {
+ ACE_Configuration_Section_Key attr_key;
+ char *stringified = TAO_IFR_Service_Utils::int_to_string (j);
+ status =
+ this->repo_->config ()->open_section (attrs_key,
+ stringified,
+ 0,
+ attr_key);
+
+ if (status == 0)
+ {
+ key_queue.enqueue_tail (attr_key);
+ }
+ }
+ }
+
+ size = static_cast<CORBA::ULong> (key_queue.size ());
+ fifd->attributes.length (size);
+
+ for (i = 0; i < size; ++i)
+ {
+ ACE_Configuration_Section_Key key;
+ key_queue.dequeue_head (key);
+
+ TAO_AttributeDef_i attr (this->repo_);
+ attr.section_key (key);
+
+ attr.make_description (fifd->attributes[i]
+ ACE_ENV_ARG_PARAMETER);
+ ACE_CHECK_RETURN (0);
+ }
+
+ // Restore our original section key.
+ // It may have been overwritten by a superclass key as part of the
+ // make_description() call.
+ this->section_key (key_holder);
+
+ CORBA::InterfaceDefSeq_var bases =
+ this->base_interfaces_i (ACE_ENV_SINGLE_ARG_PARAMETER);
+ ACE_CHECK_RETURN (0);
+
+ CORBA::ULong length = bases->length ();
+
+ CORBA::RepositoryIdSeq repo_ids (length);
+
+ repo_ids.length (length);
+
+ PortableServer::ObjectId_var oid;
+ char *base_path = 0;
+ ACE_Configuration_Section_Key base_key;
+
+ for (i = 0; i < length; ++i)
+ {
+ base_path = TAO_IFR_Service_Utils::reference_to_path (bases[i]);
+
+ this->repo_->config ()->expand_path (this->repo_->root_key (),
+ base_path,
+ base_key,
+ 0);
+
+ TAO_InterfaceDef_i impl (this->repo_);
+ impl.section_key (base_key);
+
+ repo_ids[i] = impl.id_i (ACE_ENV_SINGLE_ARG_PARAMETER);
+ ACE_CHECK_RETURN (0);
+ }
+
+ fifd->base_interfaces = repo_ids;
+
+ fifd->type = this->type_i (ACE_ENV_SINGLE_ARG_PARAMETER);
+ ACE_CHECK_RETURN (0);
+
+ return retval._retn ();
+}
+
+CORBA::AttributeDef_ptr
+TAO_InterfaceDef_i::create_attribute (
+ const char *id,
+ const char *name,
+ const char *version,
+ CORBA::IDLType_ptr type,
+ CORBA::AttributeMode mode
+ ACE_ENV_ARG_DECL
+ )
+ ACE_THROW_SPEC ((CORBA::SystemException))
+{
+ TAO_IFR_WRITE_GUARD_RETURN (CORBA::AttributeDef::_nil ());
+
+ this->update_key (ACE_ENV_SINGLE_ARG_PARAMETER);
+ ACE_CHECK_RETURN (CORBA::AttributeDef::_nil ());
+
+ return this->create_attribute_i (id,
+ name,
+ version,
+ type,
+ mode
+ ACE_ENV_ARG_PARAMETER);
+}
+
+CORBA::AttributeDef_ptr
+TAO_InterfaceDef_i::create_attribute_i (
+ const char *id,
+ const char *name,
+ const char *version,
+ CORBA::IDLType_ptr type,
+ CORBA::AttributeMode mode
+ ACE_ENV_ARG_DECL
+ )
+ ACE_THROW_SPEC ((CORBA::SystemException))
+{
+ // This will throw an exception if a name clash is found.
+ // create_common() will check for all other errors.
+ this->check_inherited (name,
+ CORBA::dk_Attribute
+ ACE_ENV_ARG_PARAMETER);
+ ACE_CHECK_RETURN (CORBA::AttributeDef::_nil ());
+
+ TAO_Container_i::tmp_name_holder_ = name;
+ ACE_Configuration_Section_Key new_key;
+
+ // Common to all IR objects created in CORBA::Container.
+ ACE_TString path =
+ TAO_IFR_Service_Utils::create_common (CORBA::dk_Interface,
+ CORBA::dk_Attribute,
+ this->section_key_,
+ new_key,
+ this->repo_,
+ id,
+ name,
+ &TAO_Container_i::same_as_tmp_name,
+ version,
+ "attrs"
+ ACE_ENV_ARG_PARAMETER);
+ ACE_CHECK_RETURN (CORBA::AttributeDef::_nil ());
+
+ // Store the path to the attribute's type definition.
+ char *type_path = TAO_IFR_Service_Utils::reference_to_path (type);
+
+ this->repo_->config ()->set_string_value (new_key,
+ "type_path",
+ type_path);
+
+ // Store the attribute's mode.
+ this->repo_->config ()->set_integer_value (new_key,
+ "mode",
+ mode);
+
+ // Create the object reference.
+ CORBA::Object_var obj =
+ TAO_IFR_Service_Utils::create_objref (CORBA::dk_Attribute,
+ path.c_str (),
+ this->repo_
+ ACE_ENV_ARG_PARAMETER);
+ ACE_CHECK_RETURN (CORBA::AttributeDef::_nil ());
+
+ CORBA::AttributeDef_var retval =
+ CORBA::AttributeDef::_narrow (obj.in ()
+ ACE_ENV_ARG_PARAMETER);
+ ACE_CHECK_RETURN (CORBA::AttributeDef::_nil ());
+
+ return retval._retn ();
+}
+
+CORBA::OperationDef_ptr
+TAO_InterfaceDef_i::create_operation (const char *id,
+ const char *name,
+ const char *version,
+ CORBA::IDLType_ptr result,
+ CORBA::OperationMode mode,
+ const CORBA::ParDescriptionSeq &params,
+ const CORBA::ExceptionDefSeq &exceptions,
+ const CORBA::ContextIdSeq &contexts
+ ACE_ENV_ARG_DECL)
+ ACE_THROW_SPEC ((CORBA::SystemException))
+{
+ TAO_IFR_WRITE_GUARD_RETURN (CORBA::OperationDef::_nil ());
+
+ this->update_key (ACE_ENV_SINGLE_ARG_PARAMETER);
+ ACE_CHECK_RETURN (CORBA::OperationDef::_nil ());
+
+ return this->create_operation_i (id,
+ name,
+ version,
+ result,
+ mode,
+ params,
+ exceptions,
+ contexts
+ ACE_ENV_ARG_PARAMETER);
+}
+
+CORBA::OperationDef_ptr
+TAO_InterfaceDef_i::create_operation_i (const char *id,
+ const char *name,
+ const char *version,
+ CORBA::IDLType_ptr result,
+ CORBA::OperationMode mode,
+ const CORBA::ParDescriptionSeq &params,
+ const CORBA::ExceptionDefSeq &exceptions,
+ const CORBA::ContextIdSeq &contexts
+ ACE_ENV_ARG_DECL)
+ ACE_THROW_SPEC ((CORBA::SystemException))
+{
+ // This will throw an exception if a name clash is found.
+ // create_common() will check for all other errors.
+ this->check_inherited (name,
+ CORBA::dk_Operation
+ ACE_ENV_ARG_PARAMETER);
+ ACE_CHECK_RETURN (CORBA::OperationDef::_nil ());
+
+ TAO_Container_i::tmp_name_holder_ = name;
+ ACE_Configuration_Section_Key new_key;
+
+ // Common to all IR objects created in CORBA::Container.
+ ACE_TString path =
+ TAO_IFR_Service_Utils::create_common (CORBA::dk_Interface,
+ CORBA::dk_Operation,
+ this->section_key_,
+ new_key,
+ this->repo_,
+ id,
+ name,
+ &TAO_Container_i::same_as_tmp_name,
+ version,
+ "ops"
+ ACE_ENV_ARG_PARAMETER);
+ ACE_CHECK_RETURN (CORBA::OperationDef::_nil ());
+
+ // Get the TypeCode for the return type.
+ ACE_TString result_path (TAO_IFR_Service_Utils::reference_to_path (result));
+ TAO_IDLType_i *result_impl =
+ TAO_IFR_Service_Utils::path_to_idltype (result_path,
+ this->repo_);
+
+ CORBA::TypeCode_var rettype =
+ result_impl->type_i (ACE_ENV_SINGLE_ARG_PARAMETER);
+ ACE_CHECK_RETURN (CORBA::OperationDef::_nil ());
+
+ CORBA::TCKind kind = rettype->kind (ACE_ENV_SINGLE_ARG_PARAMETER);
+ ACE_CHECK_RETURN (CORBA::OperationDef::_nil ());
+
+ // Oneway operations cannot have a non-void return type.
+ if (mode == CORBA::OP_ONEWAY && kind != CORBA::tk_void)
+ {
+ ACE_THROW_RETURN (CORBA::BAD_PARAM (CORBA::OMGVMCID | 31,
+ CORBA::COMPLETED_NO),
+ CORBA::OperationDef::_nil ());
+ }
+
+ this->repo_->config ()->set_string_value (new_key,
+ "result",
+ result_path);
+
+ // Store the operation mode.
+ this->repo_->config ()->set_integer_value (new_key,
+ "mode",
+ mode);
+
+ CORBA::ULong i = 0;
+
+ // Store the operation's parameter info.
+ CORBA::ULong length = params.length ();
+
+ if (length > 0)
+ {
+ ACE_Configuration_Section_Key params_key;
+ this->repo_->config ()->open_section (new_key,
+ "params",
+ 1,
+ params_key);
+
+ this->repo_->config ()->set_integer_value (params_key,
+ "count",
+ length);
+ char *type_path = 0;
+
+ for (i = 0; i < length; ++i)
+ {
+ // Oneway operations cannot have INOUT or OUT parameters.
+ if (mode == CORBA::OP_ONEWAY && params[i].mode != CORBA::PARAM_IN)
+ {
+ ACE_THROW_RETURN (CORBA::BAD_PARAM (31,
+ CORBA::COMPLETED_NO),
+ CORBA::OperationDef::_nil ());
+ }
+
+ ACE_Configuration_Section_Key param_key;
+ char *stringified = TAO_IFR_Service_Utils::int_to_string (i);
+ this->repo_->config ()->open_section (params_key,
+ stringified,
+ 1,
+ param_key);
+
+ this->repo_->config ()->set_string_value (param_key,
+ "name",
+ params[i].name.in ());
+ type_path =
+ TAO_IFR_Service_Utils::reference_to_path (
+ params[i].type_def.in ()
+ );
+
+ this->repo_->config ()->set_string_value (param_key,
+ "type_path",
+ type_path);
+
+ this->repo_->config ()->set_integer_value (param_key,
+ "mode",
+ params[i].mode);
+ }
+ }
+
+ // Store the operation's exception info.
+ length = exceptions.length ();
+
+ if (length > 0)
+ {
+ // Oneway operations cannot throw any user exceptions.
+ if (mode == CORBA::OP_ONEWAY)
+ {
+ ACE_THROW_RETURN (CORBA::BAD_PARAM (CORBA::OMGVMCID | 31,
+ CORBA::COMPLETED_NO),
+ CORBA::OperationDef::_nil ());
+ }
+
+ ACE_Configuration_Section_Key excepts_key;
+ this->repo_->config ()->open_section (new_key,
+ "excepts",
+ 1,
+ excepts_key);
+ char *type_path = 0;
+
+ for (i = 0; i < length; ++i)
+ {
+ type_path =
+ TAO_IFR_Service_Utils::reference_to_path (exceptions[i]);
+
+ char *stringified = TAO_IFR_Service_Utils::int_to_string (i);
+ this->repo_->config ()->set_string_value (excepts_key,
+ stringified,
+ type_path);
+ }
+ }
+
+ // Store the operation's context info.
+ length = contexts.length ();
+
+ if (length > 0)
+ {
+ ACE_Configuration_Section_Key contexts_key;
+
+ this->repo_->config ()->open_section (new_key,
+ "contexts",
+ 1,
+ contexts_key);
+
+ for (i = 0; i < length; ++i)
+ {
+ char *stringified = TAO_IFR_Service_Utils::int_to_string (i);
+ this->repo_->config ()->set_string_value (contexts_key,
+ stringified,
+ contexts[i]);
+ }
+ }
+
+ // Create the object reference.
+ CORBA::Object_var obj =
+ TAO_IFR_Service_Utils::create_objref (CORBA::dk_Operation,
+ path.c_str (),
+ this->repo_
+ ACE_ENV_ARG_PARAMETER);
+ ACE_CHECK_RETURN (CORBA::OperationDef::_nil ());
+
+ CORBA::OperationDef_var retval =
+ CORBA::OperationDef::_narrow (obj.in ()
+ ACE_ENV_ARG_PARAMETER);
+ ACE_CHECK_RETURN (CORBA::OperationDef::_nil ());
+
+ return retval._retn ();
+}
+
+void
+TAO_InterfaceDef_i::interface_contents (
+ ACE_Unbounded_Queue<CORBA::DefinitionKind> &kind_queue,
+ ACE_Unbounded_Queue<ACE_TString> &path_queue,
+ CORBA::DefinitionKind limit_type,
+ CORBA::Boolean exclude_inherited
+ ACE_ENV_ARG_DECL
+ )
+ ACE_THROW_SPEC ((CORBA::SystemException))
+{
+ ACE_TString id;
+ this->repo_->config ()->get_string_value (this->section_key_,
+ "id",
+ id);
+
+ ACE_TString path;
+ this->repo_->config ()->get_string_value (this->repo_->repo_ids_key (),
+ id.c_str (),
+ path);
+
+ ACE_TString section_name;
+ int index = 0;
+ int status = 0;
+
+ // Attributes
+ if (limit_type == CORBA::dk_Attribute
+ || limit_type == CORBA::dk_all)
+ {
+ ACE_Configuration_Section_Key attrs_key;
+ status =
+ this->repo_->config ()->open_section (this->section_key_,
+ "attrs",
+ 0,
+ attrs_key);
+
+ // Only if we have any.
+ if (status == 0)
+ {
+ while (this->repo_->config ()->enumerate_sections (attrs_key,
+ index++,
+ section_name)
+ == 0)
+ {
+ kind_queue.enqueue_tail (CORBA::dk_Attribute);
+
+ path_queue.enqueue_tail (
+ path + "\\attrs\\" + section_name.c_str ()
+ );
+ }
+ }
+ }
+
+ // Operations
+ if (limit_type == CORBA::dk_Operation
+ || limit_type == CORBA::dk_all)
+ {
+ index = 0;
+
+ ACE_Configuration_Section_Key ops_key;
+ status =
+ this->repo_->config ()->open_section (this->section_key_,
+ "ops",
+ 0,
+ ops_key);
+
+ // Only if we have any.
+ if (status == 0)
+ {
+ while (this->repo_->config ()->enumerate_sections (ops_key,
+ index++,
+ section_name)
+ == 0)
+ {
+ kind_queue.enqueue_tail (CORBA::dk_Operation);
+
+ path_queue.enqueue_tail (
+ path + "\\ops\\" + section_name.c_str ()
+ );
+ }
+ }
+ }
+
+ if (exclude_inherited == 0)
+ {
+ // Must recurse through the base interfaces.
+ ACE_Configuration_Section_Key inherited_key;
+ status =
+ this->repo_->config ()->open_section (this->section_key_,
+ "inherited",
+ 0,
+ inherited_key);
+
+ if (status == 0)
+ {
+ ACE_TString base_path;
+ ACE_Configuration_Section_Key base_key;
+ ACE_Configuration::VALUETYPE type;
+ index = 0;
+
+ while (this->repo_->config ()->enumerate_values (inherited_key,
+ index++,
+ section_name,
+ type)
+ == 0)
+ {
+ this->repo_->config ()->get_string_value (inherited_key,
+ section_name.c_str (),
+ base_path);
+
+ this->repo_->config ()->expand_path (this->repo_->root_key (),
+ base_path,
+ base_key,
+ 0);
+
+ TAO_InterfaceDef_i base_iface (this->repo_);
+ base_iface.section_key (base_key);
+
+ base_iface.interface_contents (kind_queue,
+ path_queue,
+ limit_type,
+ exclude_inherited
+ ACE_ENV_ARG_PARAMETER);
+ ACE_CHECK;
+ }
+ }
+ }
+}
+
+int
+TAO_InterfaceDef_i::name_clash (const char *name)
+{
+ ACE_TRY_NEW_ENV
+ {
+ TAO_Container_i::tmp_name_holder_ = name;
+ TAO_IFR_Service_Utils::name_exists (&TAO_Container_i::same_as_tmp_name,
+ TAO_IFR_Service_Utils::tmp_key_,
+ TAO_IFR_Service_Utils::repo_,
+ CORBA::dk_Interface
+ ACE_ENV_ARG_PARAMETER);
+ ACE_TRY_CHECK;
+ }
+ ACE_CATCHANY
+ {
+ return 1;
+ }
+ ACE_ENDTRY;
+
+ return 0;
+}
+
+void
+TAO_InterfaceDef_i::base_interfaces_recursive (
+ ACE_Unbounded_Queue<CORBA::DefinitionKind> &kind_queue,
+ ACE_Unbounded_Queue<ACE_TString> &path_queue
+ )
+{
+ ACE_Configuration_Section_Key inherited_key;
+ int status =
+ this->repo_->config ()->open_section (this->section_key_,
+ "inherited",
+ 0,
+ inherited_key);
+
+ // No base interfaces.
+ if (status != 0)
+ {
+ return;
+ }
+
+ int index = 0;
+ u_int kind = 0;
+ ACE_Configuration::VALUETYPE type;
+ ACE_TString section_name, inherited_path;
+ CORBA::DefinitionKind def_kind = CORBA::dk_none;
+ ACE_Configuration_Section_Key base_key;
+
+ while (this->repo_->config ()->enumerate_values (inherited_key,
+ index++,
+ section_name,
+ type)
+ == 0)
+ {
+ this->repo_->config ()->get_string_value (inherited_key,
+ section_name.c_str (),
+ inherited_path);
+
+ status =
+ this->repo_->config ()->expand_path (this->repo_->root_key (),
+ inherited_path,
+ base_key,
+ 0);
+
+ if (status == 0)
+ {
+ TAO_InterfaceDef_i tmp (this->repo_);
+ tmp.section_key (base_key);
+
+ tmp.base_interfaces_recursive (kind_queue,
+ path_queue);
+
+ path_queue.enqueue_tail (inherited_path);
+
+ this->repo_->config ()->get_integer_value (base_key,
+ "def_kind",
+ kind);
+
+ def_kind = static_cast<CORBA::DefinitionKind> (kind);
+
+ kind_queue.enqueue_tail (def_kind);
+ }
+ }
+}
+
+void
+TAO_InterfaceDef_i::inherited_attributes (
+ ACE_Unbounded_Queue<ACE_Configuration_Section_Key> &key_queue
+ )
+{
+ ACE_Unbounded_Queue<CORBA::DefinitionKind> kind_queue;
+ ACE_Unbounded_Queue<ACE_TString> path_queue;
+
+ this->base_interfaces_recursive (kind_queue,
+ path_queue);
+
+ size_t size = path_queue.size ();
+ ACE_Configuration_Section_Key base_key, attrs_key, attr_key;
+ int status = 0;
+ ACE_TString path_name;
+ u_int count = 0;
+
+ for (size_t i = 0; i < size; ++i)
+ {
+ path_queue.dequeue_head (path_name);
+
+ status =
+ this->repo_->config ()->expand_path (this->repo_->root_key (),
+ path_name,
+ base_key,
+ 0);
+
+ if (status == 0)
+ {
+ this->repo_->config ()->open_section (base_key,
+ "attrs",
+ 0,
+ attrs_key);
+
+ this->repo_->config ()->get_integer_value (attrs_key,
+ "count",
+ count);
+
+ for (u_int j = 0; j < count; ++j)
+ {
+ char *stringified = TAO_IFR_Service_Utils::int_to_string (j);
+ this->repo_->config ()->open_section (attrs_key,
+ stringified,
+ 0,
+ attr_key);
+
+ key_queue.enqueue_tail (attr_key);
+ }
+ }
+ }
+}
+
+void
+TAO_InterfaceDef_i::inherited_operations (
+ ACE_Unbounded_Queue<ACE_Configuration_Section_Key> &key_queue
+ )
+{
+ ACE_Unbounded_Queue<CORBA::DefinitionKind> kind_queue;
+ ACE_Unbounded_Queue<ACE_TString> path_queue;
+
+ this->base_interfaces_recursive (kind_queue,
+ path_queue);
+
+ size_t size = path_queue.size ();
+ ACE_Configuration_Section_Key base_key, ops_key, op_key;
+ int status = 0;
+ ACE_TString path_name;
+ u_int count = 0;
+
+ for (size_t i = 0; i < size; ++i)
+ {
+ path_queue.dequeue_head (path_name);
+
+ status =
+ this->repo_->config ()->expand_path (this->repo_->root_key (),
+ path_name,
+ base_key,
+ 0);
+
+ if (status == 0)
+ {
+ this->repo_->config ()->open_section (base_key,
+ "ops",
+ 0,
+ ops_key);
+
+ this->repo_->config ()->get_integer_value (ops_key,
+ "count",
+ count);
+
+ for (u_int j = 0; j < count; ++j)
+ {
+ char *stringified = TAO_IFR_Service_Utils::int_to_string (j);
+ this->repo_->config ()->open_section (ops_key,
+ stringified,
+ 0,
+ op_key);
+
+ key_queue.enqueue_tail (op_key);
+ }
+ }
+ }
+}
+
+void
+TAO_InterfaceDef_i::check_inherited (const char *name,
+ CORBA::DefinitionKind kind
+ ACE_ENV_ARG_DECL)
+ ACE_THROW_SPEC ((CORBA::SystemException))
+{
+ ACE_Unbounded_Queue<ACE_Configuration_Section_Key> key_queue;
+
+ switch (kind)
+ {
+ case CORBA::dk_Attribute:
+ this->inherited_attributes (key_queue);
+ break;
+ case CORBA::dk_Operation:
+ this->inherited_operations (key_queue);
+ break;
+ default:
+ break;
+ }
+
+ size_t size = key_queue.size ();
+ ACE_Configuration_Section_Key inherited_key;
+ ACE_TString inherited_name;
+
+ for (u_int i = 0; i < size; ++i)
+ {
+ key_queue.dequeue_head (inherited_key);
+
+ this->repo_->config ()->get_string_value (inherited_key,
+ "name",
+ inherited_name);
+
+ if (inherited_name == name)
+ {
+ ACE_THROW (CORBA::BAD_PARAM (CORBA::OMGVMCID | 5,
+ CORBA::COMPLETED_NO));
+ }
+ }
+}
+
+TAO_END_VERSIONED_NAMESPACE_DECL
diff --git a/TAO/orbsvcs/orbsvcs/IFRService/InterfaceDef_i.h b/TAO/orbsvcs/orbsvcs/IFRService/InterfaceDef_i.h
new file mode 100644
index 00000000000..4d010fa0d48
--- /dev/null
+++ b/TAO/orbsvcs/orbsvcs/IFRService/InterfaceDef_i.h
@@ -0,0 +1,236 @@
+// -*- C++ -*-
+
+// $Id$
+
+// ============================================================================
+//
+// = LIBRARY
+// TAO/orbsvcs/orbsvcs/IFRService
+//
+// = FILENAME
+// InterfaceDef_i.h
+//
+// = DESCRIPTION
+// InterfaceDef servant class.
+//
+// = AUTHOR
+// Jeff Parsons <parsons@cs.wustl.edu>
+//
+// ============================================================================
+
+#ifndef TAO_INTERFACEDEF_I_H
+#define TAO_INTERFACEDEF_I_H
+
+#include "orbsvcs/IFRService/Container_i.h"
+#include "orbsvcs/IFRService/Contained_i.h"
+#include "orbsvcs/IFRService/IDLType_i.h"
+#include "orbsvcs/IFRService/ifr_service_export.h"
+
+#if !defined (ACE_LACKS_PRAGMA_ONCE)
+# pragma once
+#endif /* ACE_LACKS_PRAGMA_ONCE */
+
+#if defined(_MSC_VER)
+#pragma warning(push)
+#pragma warning(disable:4250)
+#endif /* _MSC_VER */
+
+TAO_BEGIN_VERSIONED_NAMESPACE_DECL
+
+class TAO_IFRService_Export TAO_InterfaceDef_i
+ : public virtual TAO_Container_i,
+ public virtual TAO_Contained_i,
+ public virtual TAO_IDLType_i
+{
+ // = TITLE
+ // TAO_InterfaceDef_i
+ //
+ // = DESCRIPTION
+ // Represents an interface definition.
+ //
+public:
+ TAO_InterfaceDef_i (TAO_Repository_i *repo);
+ // Constructor
+
+ virtual ~TAO_InterfaceDef_i (void);
+ // Destructor
+
+ virtual CORBA::DefinitionKind def_kind (
+ ACE_ENV_SINGLE_ARG_DECL_WITH_DEFAULTS
+ )
+ ACE_THROW_SPEC ((CORBA::SystemException));
+ // Return our definition kind.
+
+ virtual void destroy (
+ ACE_ENV_SINGLE_ARG_DECL_WITH_DEFAULTS
+ )
+ ACE_THROW_SPEC ((CORBA::SystemException));
+
+ virtual void destroy_i (
+ ACE_ENV_SINGLE_ARG_DECL_WITH_DEFAULTS
+ )
+ ACE_THROW_SPEC ((CORBA::SystemException));
+
+ virtual CORBA::Contained::Description *describe (
+ ACE_ENV_SINGLE_ARG_DECL_WITH_DEFAULTS
+ )
+ ACE_THROW_SPEC ((CORBA::SystemException));
+ // From Contained_i's pure virtual function.
+
+ virtual CORBA::Contained::Description *describe_i (
+ ACE_ENV_SINGLE_ARG_DECL_WITH_DEFAULTS
+ )
+ ACE_THROW_SPEC ((CORBA::SystemException));
+ // From Contained_i's pure virtual function.
+
+ virtual CORBA::TypeCode_ptr type (
+ ACE_ENV_SINGLE_ARG_DECL_WITH_DEFAULTS
+ )
+ ACE_THROW_SPEC ((CORBA::SystemException));
+ // From IDLType_i's pure virtual function.
+
+ virtual CORBA::TypeCode_ptr type_i (
+ ACE_ENV_SINGLE_ARG_DECL_WITH_DEFAULTS
+ )
+ ACE_THROW_SPEC ((CORBA::SystemException));
+ // From IDLType_i's pure virtual function.
+
+ virtual CORBA::InterfaceDefSeq *base_interfaces (
+ ACE_ENV_SINGLE_ARG_DECL_WITH_DEFAULTS
+ )
+ ACE_THROW_SPEC ((CORBA::SystemException));
+
+ CORBA::InterfaceDefSeq *base_interfaces_i (
+ ACE_ENV_SINGLE_ARG_DECL_WITH_DEFAULTS
+ )
+ ACE_THROW_SPEC ((CORBA::SystemException));
+
+ virtual void base_interfaces (
+ const CORBA::InterfaceDefSeq &base_interfaces
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS
+ )
+ ACE_THROW_SPEC ((CORBA::SystemException));
+
+ void base_interfaces_i (
+ const CORBA::InterfaceDefSeq &base_interfaces
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS
+ )
+ ACE_THROW_SPEC ((CORBA::SystemException));
+
+ virtual CORBA::Boolean is_a (
+ const char *interface_id
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS
+ )
+ ACE_THROW_SPEC ((CORBA::SystemException));
+
+ CORBA::Boolean is_a_i (
+ const char *interface_id
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS
+ )
+ ACE_THROW_SPEC ((CORBA::SystemException));
+
+ virtual CORBA::InterfaceDef::FullInterfaceDescription *describe_interface (
+ ACE_ENV_SINGLE_ARG_DECL_WITH_DEFAULTS
+ )
+ ACE_THROW_SPEC ((CORBA::SystemException));
+
+ CORBA::InterfaceDef::FullInterfaceDescription *describe_interface_i (
+ ACE_ENV_SINGLE_ARG_DECL_WITH_DEFAULTS
+ )
+ ACE_THROW_SPEC ((CORBA::SystemException));
+
+ virtual CORBA::AttributeDef_ptr create_attribute (
+ const char *id,
+ const char *name,
+ const char *version,
+ CORBA::IDLType_ptr type,
+ CORBA::AttributeMode mode
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS
+ )
+ ACE_THROW_SPEC ((CORBA::SystemException));
+
+ CORBA::AttributeDef_ptr create_attribute_i (
+ const char *id,
+ const char *name,
+ const char *version,
+ CORBA::IDLType_ptr type,
+ CORBA::AttributeMode mode
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS
+ )
+ ACE_THROW_SPEC ((CORBA::SystemException));
+
+ virtual CORBA::OperationDef_ptr create_operation (
+ const char *id,
+ const char *name,
+ const char *version,
+ CORBA::IDLType_ptr result,
+ CORBA::OperationMode mode,
+ const CORBA::ParDescriptionSeq &params,
+ const CORBA::ExceptionDefSeq &exceptions,
+ const CORBA::ContextIdSeq &contexts
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS
+ )
+ ACE_THROW_SPEC ((CORBA::SystemException));
+
+ CORBA::OperationDef_ptr create_operation_i (
+ const char *id,
+ const char *name,
+ const char *version,
+ CORBA::IDLType_ptr result,
+ CORBA::OperationMode mode,
+ const CORBA::ParDescriptionSeq &params,
+ const CORBA::ExceptionDefSeq &exceptions,
+ const CORBA::ContextIdSeq &contexts
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS
+ )
+ ACE_THROW_SPEC ((CORBA::SystemException));
+
+ void interface_contents (
+ ACE_Unbounded_Queue<CORBA::DefinitionKind> &kind_queue,
+ ACE_Unbounded_Queue<ACE_TString> &path_queue,
+ CORBA::DefinitionKind limit_type,
+ CORBA::Boolean exclude_inherited
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS
+ )
+ ACE_THROW_SPEC ((CORBA::SystemException));
+ // Gathers the attributes and operations of all the ancestors.
+
+ static int name_clash (const char *name);
+ // Called from TAO_IFR_Service_Utils::name_exists() when we
+ // are in a list of supported interfaces.
+
+ void inherited_attributes (
+ ACE_Unbounded_Queue<ACE_Configuration_Section_Key> &key_queue
+ );
+ // Depth-first traversal of the inheritance tree to get all the
+ // attributes.
+
+ void inherited_operations (
+ ACE_Unbounded_Queue<ACE_Configuration_Section_Key> &key_queue
+ );
+ // Depth-first traversal of the inheritance tree to get all the
+ // operations.
+
+private:
+ void base_interfaces_recursive (
+ ACE_Unbounded_Queue<CORBA::DefinitionKind> &kind_queue,
+ ACE_Unbounded_Queue<ACE_TString> &path_queue
+ );
+ // Depth-first traversal of the inheritance tree to get all
+ // the base interfaces.
+
+ void check_inherited (const char *name,
+ CORBA::DefinitionKind kind
+ ACE_ENV_ARG_DECL)
+ ACE_THROW_SPEC ((CORBA::SystemException));
+ // When creating a new attribute, check for a clash with an inherited
+ // attribute name.
+};
+
+TAO_END_VERSIONED_NAMESPACE_DECL
+
+#if defined(_MSC_VER)
+#pragma warning(pop)
+#endif /* _MSC_VER */
+
+#endif /* TAO_INTERFACEDEF_I_H */
diff --git a/TAO/orbsvcs/orbsvcs/IFRService/LocalInterfaceDef_i.cpp b/TAO/orbsvcs/orbsvcs/IFRService/LocalInterfaceDef_i.cpp
new file mode 100644
index 00000000000..dab11360086
--- /dev/null
+++ b/TAO/orbsvcs/orbsvcs/IFRService/LocalInterfaceDef_i.cpp
@@ -0,0 +1,62 @@
+// $Id$
+
+#include "orbsvcs/IFRService/LocalInterfaceDef_i.h"
+#include "orbsvcs/IFRService/Repository_i.h"
+
+ACE_RCSID (IFRService,
+ LocalInterfaceDef_i,
+ "$Id$")
+
+TAO_BEGIN_VERSIONED_NAMESPACE_DECL
+
+TAO_LocalInterfaceDef_i::TAO_LocalInterfaceDef_i (
+ TAO_Repository_i *repo
+ )
+ : TAO_IRObject_i (repo),
+ TAO_Container_i (repo),
+ TAO_Contained_i (repo),
+ TAO_IDLType_i (repo),
+ TAO_InterfaceDef_i (repo)
+{
+}
+
+TAO_LocalInterfaceDef_i::~TAO_LocalInterfaceDef_i (void)
+{
+}
+
+CORBA::DefinitionKind
+TAO_LocalInterfaceDef_i::def_kind (ACE_ENV_SINGLE_ARG_DECL_NOT_USED)
+ ACE_THROW_SPEC ((CORBA::SystemException))
+{
+ return CORBA::dk_LocalInterface;
+}
+
+CORBA::Boolean
+TAO_LocalInterfaceDef_i::is_a (const char *interface_id
+ ACE_ENV_ARG_DECL)
+ ACE_THROW_SPEC ((CORBA::SystemException))
+{
+ TAO_IFR_READ_GUARD_RETURN (0);
+
+ this->update_key (ACE_ENV_SINGLE_ARG_PARAMETER);
+ ACE_CHECK_RETURN (0);
+
+ return this->is_a_i (interface_id
+ ACE_ENV_ARG_PARAMETER);
+}
+
+CORBA::Boolean
+TAO_LocalInterfaceDef_i::is_a_i (const char *interface_id
+ ACE_ENV_ARG_DECL)
+ ACE_THROW_SPEC ((CORBA::SystemException))
+{
+ if (ACE_OS::strcmp (interface_id, "IDL:omg.org/CORBA/LocalBase:1.0") == 0)
+ {
+ return 1;
+ }
+
+ return this->TAO_InterfaceDef_i::is_a_i (interface_id
+ ACE_ENV_ARG_PARAMETER);
+}
+
+TAO_END_VERSIONED_NAMESPACE_DECL
diff --git a/TAO/orbsvcs/orbsvcs/IFRService/LocalInterfaceDef_i.h b/TAO/orbsvcs/orbsvcs/IFRService/LocalInterfaceDef_i.h
new file mode 100644
index 00000000000..92bfd1be945
--- /dev/null
+++ b/TAO/orbsvcs/orbsvcs/IFRService/LocalInterfaceDef_i.h
@@ -0,0 +1,78 @@
+// -*- C++ -*-
+
+// $Id$
+
+// ============================================================================
+//
+// = LIBRARY
+// TAO/orbsvcs/orbsvcs/IFRService
+//
+// = FILENAME
+// LocalInterfaceDef_i.h
+//
+// = DESCRIPTION
+// LocalInterfaceDef servant class.
+//
+// = AUTHOR
+// Jeff Parsons <parsons@cs.wustl.edu>
+//
+// ============================================================================
+
+#ifndef TAO_LOCALINTERFACEDEF_I_H
+#define TAO_LOCALINTERFACEDEF_I_H
+
+#include "orbsvcs/IFRService/InterfaceDef_i.h"
+#include "orbsvcs/IFRService/ifr_service_export.h"
+
+#if !defined (ACE_LACKS_PRAGMA_ONCE)
+# pragma once
+#endif /* ACE_LACKS_PRAGMA_ONCE */
+
+#if defined(_MSC_VER)
+#pragma warning(push)
+#pragma warning(disable:4250)
+#endif /* _MSC_VER */
+
+TAO_BEGIN_VERSIONED_NAMESPACE_DECL
+
+class TAO_IFRService_Export TAO_LocalInterfaceDef_i : public virtual TAO_InterfaceDef_i
+{
+ // = TITLE
+ // TAO_LocalInterfaceDef_i
+ //
+ // = DESCRIPTION
+ // Represents an local interface definition.
+ //
+public:
+ TAO_LocalInterfaceDef_i (TAO_Repository_i *repo);
+ // Constructor
+
+ virtual ~TAO_LocalInterfaceDef_i (void);
+ // Destructor
+
+ virtual CORBA::DefinitionKind def_kind (
+ ACE_ENV_SINGLE_ARG_DECL_WITH_DEFAULTS
+ )
+ ACE_THROW_SPEC ((CORBA::SystemException));
+ // Return our definition kind.
+
+ virtual CORBA::Boolean is_a (
+ const char *interface_id
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS
+ )
+ ACE_THROW_SPEC ((CORBA::SystemException));
+
+ CORBA::Boolean is_a_i (
+ const char *interface_id
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS
+ )
+ ACE_THROW_SPEC ((CORBA::SystemException));
+};
+
+TAO_END_VERSIONED_NAMESPACE_DECL
+
+#if defined(_MSC_VER)
+#pragma warning(pop)
+#endif /* _MSC_VER */
+
+#endif /* TAO_LOCALINTERFACEDEF_I_H */
diff --git a/TAO/orbsvcs/orbsvcs/IFRService/ModuleDef_i.cpp b/TAO/orbsvcs/orbsvcs/IFRService/ModuleDef_i.cpp
new file mode 100644
index 00000000000..731d9aaf511
--- /dev/null
+++ b/TAO/orbsvcs/orbsvcs/IFRService/ModuleDef_i.cpp
@@ -0,0 +1,111 @@
+// $Id$
+
+#include "orbsvcs/IFRService/ModuleDef_i.h"
+#include "orbsvcs/IFRService/Repository_i.h"
+
+#include "ace/SString.h"
+
+
+ACE_RCSID (IFRService,
+ ModuleDef_i,
+ "$Id$")
+
+
+TAO_BEGIN_VERSIONED_NAMESPACE_DECL
+
+TAO_ModuleDef_i::TAO_ModuleDef_i (TAO_Repository_i *repo)
+ : TAO_IRObject_i (repo),
+ TAO_Contained_i (repo),
+ TAO_Container_i (repo),
+ TAO_ComponentContainer_i (repo),
+ TAO_ComponentModuleDef_i (repo)
+{
+}
+
+TAO_ModuleDef_i::~TAO_ModuleDef_i (void)
+{
+}
+
+CORBA::DefinitionKind
+TAO_ModuleDef_i::def_kind (ACE_ENV_SINGLE_ARG_DECL_NOT_USED)
+ ACE_THROW_SPEC ((CORBA::SystemException))
+{
+ return CORBA::dk_Module;
+}
+
+void
+TAO_ModuleDef_i::destroy (ACE_ENV_SINGLE_ARG_DECL)
+ ACE_THROW_SPEC ((CORBA::SystemException))
+{
+ TAO_IFR_WRITE_GUARD;
+
+ this->update_key (ACE_ENV_SINGLE_ARG_PARAMETER);
+ ACE_CHECK;
+
+ this->destroy_i (ACE_ENV_SINGLE_ARG_PARAMETER);
+}
+
+void
+TAO_ModuleDef_i::destroy_i (ACE_ENV_SINGLE_ARG_DECL)
+ ACE_THROW_SPEC ((CORBA::SystemException))
+{
+ // Destroy our members.
+ TAO_Container_i::destroy_i (ACE_ENV_SINGLE_ARG_PARAMETER);
+ ACE_CHECK;
+
+ // Destroy ourself.
+ TAO_Contained_i::destroy_i (ACE_ENV_SINGLE_ARG_PARAMETER);
+ ACE_CHECK;
+}
+
+CORBA::Contained::Description *
+TAO_ModuleDef_i::describe (ACE_ENV_SINGLE_ARG_DECL)
+ ACE_THROW_SPEC ((CORBA::SystemException))
+{
+ TAO_IFR_READ_GUARD_RETURN (0);
+
+ this->update_key (ACE_ENV_SINGLE_ARG_PARAMETER);
+ ACE_CHECK_RETURN (0);
+
+ return this->describe_i (ACE_ENV_SINGLE_ARG_PARAMETER);
+}
+
+CORBA::Contained::Description *
+TAO_ModuleDef_i::describe_i (ACE_ENV_SINGLE_ARG_DECL)
+ ACE_THROW_SPEC ((CORBA::SystemException))
+{
+ CORBA::Contained::Description *desc_ptr = 0;
+ ACE_NEW_THROW_EX (desc_ptr,
+ CORBA::Contained::Description,
+ CORBA::NO_MEMORY ());
+ ACE_CHECK_RETURN (0);
+
+ CORBA::Contained::Description_var retval = desc_ptr;
+
+ retval->kind = this->def_kind (ACE_ENV_SINGLE_ARG_PARAMETER);
+ ACE_CHECK_RETURN (0);
+
+ CORBA::ModuleDescription md;
+
+ md.name = this->name_i (ACE_ENV_SINGLE_ARG_PARAMETER);
+ ACE_CHECK_RETURN (0);
+
+ md.id = this->id_i (ACE_ENV_SINGLE_ARG_PARAMETER);
+ ACE_CHECK_RETURN (0);
+
+ ACE_TString container_id;
+ this->repo_->config ()->get_string_value (this->section_key_,
+ "container_id",
+ container_id);
+
+ md.defined_in = container_id.c_str ();
+
+ md.version = this->version_i (ACE_ENV_SINGLE_ARG_PARAMETER);
+ ACE_CHECK_RETURN (0);
+
+ retval->value <<= md;
+
+ return retval._retn ();
+}
+
+TAO_END_VERSIONED_NAMESPACE_DECL
diff --git a/TAO/orbsvcs/orbsvcs/IFRService/ModuleDef_i.h b/TAO/orbsvcs/orbsvcs/IFRService/ModuleDef_i.h
new file mode 100644
index 00000000000..8c178c7cf50
--- /dev/null
+++ b/TAO/orbsvcs/orbsvcs/IFRService/ModuleDef_i.h
@@ -0,0 +1,94 @@
+// -*- C++ -*-
+
+// $Id$
+
+// ============================================================================
+//
+// = LIBRARY
+// TAO/orbsvcs/orbsvcs/IFRService
+//
+// = FILENAME
+// ModuleDef_i.h
+//
+// = DESCRIPTION
+// ModuleDef servant class.
+//
+// = AUTHOR
+// Jeff Parsons <parsons@cs.wustl.edu>
+//
+// ============================================================================
+
+#ifndef TAO_MODULEDEF_I_H
+#define TAO_MODULEDEF_I_H
+
+//#include "Container_i.h"
+#include "orbsvcs/IFRService/Contained_i.h"
+#include "orbsvcs/IFRService/ComponentModuleDef_i.h"
+#include "orbsvcs/IFRService/ifr_service_export.h"
+
+#if !defined (ACE_LACKS_PRAGMA_ONCE)
+# pragma once
+#endif /* ACE_LACKS_PRAGMA_ONCE */
+
+#if defined(_MSC_VER)
+#pragma warning(push)
+#pragma warning(disable:4250)
+#endif /* _MSC_VER */
+
+TAO_BEGIN_VERSIONED_NAMESPACE_DECL
+
+class TAO_IFRService_Export TAO_ModuleDef_i
+ : public virtual TAO_Contained_i,
+ public virtual TAO_ComponentModuleDef_i
+{
+ // = TITLE
+ // TAO_ModuleDef_i
+ //
+ // = DESCRIPTION
+ // Represents a module definition.
+ //
+public:
+ TAO_ModuleDef_i (TAO_Repository_i *repo);
+ // Constructor
+
+ virtual ~TAO_ModuleDef_i (void);
+ // Destructor
+
+ virtual CORBA::DefinitionKind def_kind (
+ ACE_ENV_SINGLE_ARG_DECL_WITH_DEFAULTS)
+
+ ACE_THROW_SPEC ((CORBA::SystemException));
+ // Return our definition kind.
+
+ virtual void destroy (
+ ACE_ENV_SINGLE_ARG_DECL_WITH_DEFAULTS)
+
+ ACE_THROW_SPEC ((CORBA::SystemException));
+ // Remove the repository entry.
+
+ virtual void destroy_i (
+ ACE_ENV_SINGLE_ARG_DECL_WITH_DEFAULTS)
+
+ ACE_THROW_SPEC ((CORBA::SystemException));
+ // Remove the repository entry.
+
+ virtual CORBA::Contained::Description *describe (
+ ACE_ENV_SINGLE_ARG_DECL_WITH_DEFAULTS)
+
+ ACE_THROW_SPEC ((CORBA::SystemException));
+ // From Contained_i's pure virtual function.
+
+ virtual CORBA::Contained::Description *describe_i (
+ ACE_ENV_SINGLE_ARG_DECL_WITH_DEFAULTS)
+
+ ACE_THROW_SPEC ((CORBA::SystemException));
+ // From Contained_i's pure virtual function.
+};
+
+TAO_END_VERSIONED_NAMESPACE_DECL
+
+#if defined(_MSC_VER)
+#pragma warning(pop)
+#endif /* _MSC_VER */
+
+#endif /* TAO_MODULEDEF_I_H */
diff --git a/TAO/orbsvcs/orbsvcs/IFRService/NativeDef_i.cpp b/TAO/orbsvcs/orbsvcs/IFRService/NativeDef_i.cpp
new file mode 100644
index 00000000000..e207ffe8823
--- /dev/null
+++ b/TAO/orbsvcs/orbsvcs/IFRService/NativeDef_i.cpp
@@ -0,0 +1,66 @@
+// $Id$
+
+#include "orbsvcs/IFRService/NativeDef_i.h"
+#include "orbsvcs/IFRService/Repository_i.h"
+
+#include "ace/SString.h"
+
+
+ACE_RCSID (IFRService,
+ NativeDef_i,
+ "$Id$")
+
+
+TAO_BEGIN_VERSIONED_NAMESPACE_DECL
+
+TAO_NativeDef_i::TAO_NativeDef_i (TAO_Repository_i *repo)
+ : TAO_IRObject_i (repo),
+ TAO_Contained_i (repo),
+ TAO_IDLType_i (repo),
+ TAO_TypedefDef_i (repo)
+{
+}
+
+TAO_NativeDef_i::~TAO_NativeDef_i (void)
+{
+}
+
+CORBA::DefinitionKind
+TAO_NativeDef_i::def_kind (ACE_ENV_SINGLE_ARG_DECL_NOT_USED)
+ ACE_THROW_SPEC ((CORBA::SystemException))
+{
+ return CORBA::dk_Native;
+}
+
+CORBA::TypeCode_ptr
+TAO_NativeDef_i::type (ACE_ENV_SINGLE_ARG_DECL)
+ ACE_THROW_SPEC ((CORBA::SystemException))
+{
+ TAO_IFR_READ_GUARD_RETURN (CORBA::TypeCode::_nil ());
+
+ this->update_key (ACE_ENV_SINGLE_ARG_PARAMETER);
+ ACE_CHECK_RETURN (CORBA::TypeCode::_nil ());
+
+ return this->type_i (ACE_ENV_SINGLE_ARG_PARAMETER);
+}
+
+CORBA::TypeCode_ptr
+TAO_NativeDef_i::type_i (ACE_ENV_SINGLE_ARG_DECL)
+ ACE_THROW_SPEC ((CORBA::SystemException))
+{
+ ACE_TString id;
+ this->repo_->config ()->get_string_value (this->section_key_,
+ "id",
+ id);
+
+ ACE_TString name;
+ this->repo_->config ()->get_string_value (this->section_key_,
+ "name",
+ name);
+
+ return this->repo_->tc_factory ()->create_native_tc (id.c_str (),
+ name.c_str ()
+ ACE_ENV_ARG_PARAMETER);
+}
+
+TAO_END_VERSIONED_NAMESPACE_DECL
diff --git a/TAO/orbsvcs/orbsvcs/IFRService/NativeDef_i.h b/TAO/orbsvcs/orbsvcs/IFRService/NativeDef_i.h
new file mode 100644
index 00000000000..d6960a185e9
--- /dev/null
+++ b/TAO/orbsvcs/orbsvcs/IFRService/NativeDef_i.h
@@ -0,0 +1,79 @@
+// -*- C++ -*-
+
+// $Id$
+
+// ============================================================================
+//
+// = LIBRARY
+// TAO/orbsvcs/orbsvcs/IFRService
+//
+// = FILENAME
+// NativeDef_i.h
+//
+// = DESCRIPTION
+// NativeDef servant class.
+//
+// = AUTHOR
+// Jeff Parsons <parsons@cs.wustl.edu>
+//
+// ============================================================================
+
+#ifndef TAO_NATIVEDEF_I_H
+#define TAO_NATIVEDEF_I_H
+
+#include "orbsvcs/IFRService/TypedefDef_i.h"
+#include "orbsvcs/IFRService/ifr_service_export.h"
+
+#if !defined (ACE_LACKS_PRAGMA_ONCE)
+# pragma once
+#endif /* ACE_LACKS_PRAGMA_ONCE */
+
+#if defined(_MSC_VER)
+#pragma warning(push)
+#pragma warning(disable:4250)
+#endif /* _MSC_VER */
+
+TAO_BEGIN_VERSIONED_NAMESPACE_DECL
+
+class TAO_IFRService_Export TAO_NativeDef_i : public virtual TAO_TypedefDef_i
+{
+public:
+ // = TITLE
+ // TAO_NativeDef_i
+ //
+ // = DESCRIPTION
+ // Represents an OMG IDL native definition.
+ //
+public:
+ TAO_NativeDef_i (TAO_Repository_i *repo);
+ // Constructor
+
+ virtual ~TAO_NativeDef_i (void);
+ // Destructor
+
+ virtual CORBA::DefinitionKind def_kind (
+ ACE_ENV_SINGLE_ARG_DECL_WITH_DEFAULTS)
+
+ ACE_THROW_SPEC ((CORBA::SystemException));
+ // Return our definition kind.
+
+ virtual CORBA::TypeCode_ptr type (
+ ACE_ENV_SINGLE_ARG_DECL_WITH_DEFAULTS)
+
+ ACE_THROW_SPEC ((CORBA::SystemException));
+ // From IDLType_i's pure virtual function.
+
+ virtual CORBA::TypeCode_ptr type_i (
+ ACE_ENV_SINGLE_ARG_DECL_WITH_DEFAULTS)
+
+ ACE_THROW_SPEC ((CORBA::SystemException));
+ // From IDLType_i's pure virtual function.
+};
+
+TAO_END_VERSIONED_NAMESPACE_DECL
+
+#if defined(_MSC_VER)
+#pragma warning(pop)
+#endif /* _MSC_VER */
+
+#endif /* TAO_NATIVEDEF_I_H */
diff --git a/TAO/orbsvcs/orbsvcs/IFRService/OperationDef_i.cpp b/TAO/orbsvcs/orbsvcs/IFRService/OperationDef_i.cpp
new file mode 100644
index 00000000000..ee94729fa59
--- /dev/null
+++ b/TAO/orbsvcs/orbsvcs/IFRService/OperationDef_i.cpp
@@ -0,0 +1,750 @@
+// $Id$
+
+#include "orbsvcs/IFRService/OperationDef_i.h"
+#include "orbsvcs/IFRService/Repository_i.h"
+#include "orbsvcs/IFRService/IDLType_i.h"
+#include "orbsvcs/IFRService/ExceptionDef_i.h"
+#include "orbsvcs/IFRService/IFR_Service_Utils.h"
+
+#include "ace/Auto_Ptr.h"
+#include "ace/SString.h"
+
+
+ACE_RCSID (IFRService,
+ OperationDef_i,
+ "$Id$")
+
+TAO_BEGIN_VERSIONED_NAMESPACE_DECL
+
+TAO_OperationDef_i::TAO_OperationDef_i (
+ TAO_Repository_i *repo
+ )
+ : TAO_IRObject_i (repo),
+ TAO_Contained_i (repo)
+{
+}
+
+TAO_OperationDef_i::~TAO_OperationDef_i (void)
+{
+}
+
+CORBA::DefinitionKind
+TAO_OperationDef_i::def_kind (ACE_ENV_SINGLE_ARG_DECL_NOT_USED)
+ ACE_THROW_SPEC ((CORBA::SystemException))
+{
+ return CORBA::dk_Operation;
+}
+
+CORBA::Contained::Description *
+TAO_OperationDef_i::describe (ACE_ENV_SINGLE_ARG_DECL )
+ ACE_THROW_SPEC ((CORBA::SystemException))
+{
+ TAO_IFR_READ_GUARD_RETURN (0);
+
+ this->update_key (ACE_ENV_SINGLE_ARG_PARAMETER);
+ ACE_CHECK_RETURN (0);
+
+ return this->describe_i (ACE_ENV_SINGLE_ARG_PARAMETER);
+}
+
+CORBA::Contained::Description *
+TAO_OperationDef_i::describe_i (ACE_ENV_SINGLE_ARG_DECL )
+ ACE_THROW_SPEC ((CORBA::SystemException))
+{
+ CORBA::Contained::Description *desc_ptr = 0;
+ ACE_NEW_THROW_EX (desc_ptr,
+ CORBA::Contained::Description,
+ CORBA::NO_MEMORY ());
+ ACE_CHECK_RETURN (0);
+
+ CORBA::Contained::Description_var retval = desc_ptr;
+
+ retval->kind = this->def_kind (ACE_ENV_SINGLE_ARG_PARAMETER);
+ ACE_CHECK_RETURN (0);
+
+ CORBA::OperationDescription od;
+ this->make_description (od
+ ACE_ENV_ARG_PARAMETER);
+ ACE_CHECK_RETURN (0);
+
+ retval->value <<= od;
+ ACE_CHECK_RETURN (0);
+
+ return retval._retn ();
+}
+
+CORBA::TypeCode_ptr
+TAO_OperationDef_i::result (ACE_ENV_SINGLE_ARG_DECL)
+ ACE_THROW_SPEC ((CORBA::SystemException))
+{
+ TAO_IFR_READ_GUARD_RETURN (CORBA::TypeCode::_nil ());
+
+ this->update_key (ACE_ENV_SINGLE_ARG_PARAMETER);
+ ACE_CHECK_RETURN (CORBA::TypeCode::_nil ());
+
+ return this->result_i (ACE_ENV_SINGLE_ARG_PARAMETER);
+}
+
+CORBA::TypeCode_ptr
+TAO_OperationDef_i::result_i (ACE_ENV_SINGLE_ARG_DECL)
+ ACE_THROW_SPEC ((CORBA::SystemException))
+{
+ ACE_TString result_path;
+ this->repo_->config ()->get_string_value (this->section_key_,
+ "result",
+ result_path);
+
+
+ TAO_IDLType_i *impl =
+ TAO_IFR_Service_Utils::path_to_idltype (result_path,
+ this->repo_);
+
+ return impl->type_i (ACE_ENV_SINGLE_ARG_PARAMETER);
+}
+
+CORBA::IDLType_ptr
+TAO_OperationDef_i::result_def (ACE_ENV_SINGLE_ARG_DECL)
+ ACE_THROW_SPEC ((CORBA::SystemException))
+{
+ TAO_IFR_READ_GUARD_RETURN (CORBA::IDLType::_nil ());
+
+ this->update_key (ACE_ENV_SINGLE_ARG_PARAMETER);
+ ACE_CHECK_RETURN (CORBA::IDLType::_nil ());
+
+ return this->result_def_i (ACE_ENV_SINGLE_ARG_PARAMETER);
+}
+
+CORBA::IDLType_ptr
+TAO_OperationDef_i::result_def_i (ACE_ENV_SINGLE_ARG_DECL)
+ ACE_THROW_SPEC ((CORBA::SystemException))
+{
+ ACE_TString result_path;
+ this->repo_->config ()->get_string_value (this->section_key_,
+ "result",
+ result_path);
+
+ CORBA::Object_var obj =
+ TAO_IFR_Service_Utils::path_to_ir_object (result_path,
+ this->repo_
+ ACE_ENV_ARG_PARAMETER);
+ ACE_CHECK_RETURN (CORBA::IDLType::_nil ());
+
+ return CORBA::IDLType::_narrow (obj.in ()
+ ACE_ENV_ARG_PARAMETER);
+}
+
+void
+TAO_OperationDef_i::result_def (CORBA::IDLType_ptr result_def
+ ACE_ENV_ARG_DECL)
+ ACE_THROW_SPEC ((CORBA::SystemException))
+{
+ TAO_IFR_WRITE_GUARD;
+
+ this->update_key (ACE_ENV_SINGLE_ARG_PARAMETER);
+ ACE_CHECK;
+
+ this->result_def_i (result_def
+ ACE_ENV_ARG_PARAMETER);
+}
+
+void
+TAO_OperationDef_i::result_def_i (CORBA::IDLType_ptr result_def
+ ACE_ENV_ARG_DECL_NOT_USED)
+ ACE_THROW_SPEC ((CORBA::SystemException))
+{
+ char *result_path =
+ TAO_IFR_Service_Utils::reference_to_path (result_def);
+
+ this->repo_->config ()->set_string_value (this->section_key_,
+ "result",
+ result_path);
+}
+
+CORBA::ParDescriptionSeq *
+TAO_OperationDef_i::params (ACE_ENV_SINGLE_ARG_DECL)
+ ACE_THROW_SPEC ((CORBA::SystemException))
+{
+ TAO_IFR_READ_GUARD_RETURN (0);
+
+ this->update_key (ACE_ENV_SINGLE_ARG_PARAMETER);
+ ACE_CHECK_RETURN (0);
+
+ return this->params_i (ACE_ENV_SINGLE_ARG_PARAMETER);
+}
+
+CORBA::ParDescriptionSeq *
+TAO_OperationDef_i::params_i (ACE_ENV_SINGLE_ARG_DECL)
+ ACE_THROW_SPEC ((CORBA::SystemException))
+{
+ CORBA::ULong i = 0;
+ ACE_Configuration_Section_Key params_key;
+ int status =
+ this->repo_->config ()->open_section (this->section_key_,
+ "params",
+ 0,
+ params_key);
+
+ ACE_Unbounded_Queue<ACE_Configuration_Section_Key> key_queue;
+
+ // This section may not have been created.
+ if (status == 0)
+ {
+ u_int count = 0;
+ this->repo_->config ()->get_integer_value (params_key,
+ "count",
+ count);
+
+ for (i = 0; i < count; ++i)
+ {
+ ACE_Configuration_Section_Key param_key;
+ char *stringified = TAO_IFR_Service_Utils::int_to_string (i);
+ status =
+ this->repo_->config ()->open_section (params_key,
+ stringified,
+ 0,
+ param_key);
+
+ if (status == 0)
+ {
+ key_queue.enqueue_tail (param_key);
+ }
+ }
+ }
+
+ CORBA::ULong size = static_cast<CORBA::ULong> (key_queue.size ());
+
+ CORBA::ParDescriptionSeq *pd_seq = 0;
+ ACE_NEW_THROW_EX (pd_seq,
+ CORBA::ParDescriptionSeq (size),
+ CORBA::NO_MEMORY ());
+ ACE_CHECK_RETURN (0);
+
+ pd_seq->length (size);
+
+ if (size == 0)
+ {
+ return pd_seq;
+ }
+
+ CORBA::ParDescriptionSeq_var retval = pd_seq;
+
+ for (i = 0; i < size; ++i)
+ {
+ ACE_Configuration_Section_Key key;
+ key_queue.dequeue_head (key);
+
+ ACE_TString name;
+ this->repo_->config ()->get_string_value (key,
+ "name",
+ name);
+
+ retval[i].name = name.c_str ();
+
+ u_int mode = 0;
+ this->repo_->config ()->get_integer_value (key,
+ "mode",
+ mode);
+
+ retval[i].mode = static_cast<CORBA::ParameterMode> (mode);
+
+ ACE_TString type_path;
+ this->repo_->config ()->get_string_value (key,
+ "type_path",
+ type_path);
+
+ TAO_IDLType_i *impl =
+ TAO_IFR_Service_Utils::path_to_idltype (type_path,
+ this->repo_);
+
+ retval[i].type = impl->type_i (ACE_ENV_SINGLE_ARG_PARAMETER);
+ ACE_CHECK_RETURN (0);
+
+ CORBA::Object_var obj =
+ TAO_IFR_Service_Utils::path_to_ir_object (type_path,
+ this->repo_
+ ACE_ENV_ARG_PARAMETER);
+ ACE_CHECK_RETURN (0);
+
+ retval[i].type_def = CORBA::IDLType::_narrow (obj.in ()
+ ACE_ENV_ARG_PARAMETER);
+ ACE_CHECK_RETURN (0);
+ }
+
+ return retval._retn ();
+}
+
+void
+TAO_OperationDef_i::params (const CORBA::ParDescriptionSeq &params
+ ACE_ENV_ARG_DECL)
+ ACE_THROW_SPEC ((CORBA::SystemException))
+{
+ TAO_IFR_WRITE_GUARD;
+
+ this->update_key (ACE_ENV_SINGLE_ARG_PARAMETER);
+ ACE_CHECK;
+
+ this->params_i (params
+ ACE_ENV_ARG_PARAMETER);
+}
+
+void
+TAO_OperationDef_i::params_i (const CORBA::ParDescriptionSeq &params
+ ACE_ENV_ARG_DECL_NOT_USED)
+ ACE_THROW_SPEC ((CORBA::SystemException))
+{
+ this->repo_->config ()->remove_section (this->section_key_,
+ "params",
+ 1);
+
+ CORBA::ULong length = params.length ();
+
+ if (length == 0)
+ {
+ return;
+ }
+
+ ACE_Configuration_Section_Key params_key;
+ this->repo_->config ()->open_section (this->section_key_,
+ "params",
+ 1,
+ params_key);
+
+ this->repo_->config ()->set_integer_value (params_key,
+ "count",
+ length);
+ char *type_path = 0;
+
+ for (CORBA::ULong i = 0; i < length; ++i)
+ {
+ ACE_Configuration_Section_Key param_key;
+ char *stringified = TAO_IFR_Service_Utils::int_to_string (i);
+ this->repo_->config ()->open_section (params_key,
+ stringified,
+ 1,
+ param_key);
+
+ this->repo_->config ()->set_string_value (param_key,
+ "name",
+ params[i].name.in ());
+ type_path =
+ TAO_IFR_Service_Utils::reference_to_path (params[i].type_def.in ());
+
+ this->repo_->config ()->set_string_value (param_key,
+ "type_path",
+ type_path);
+
+ this->repo_->config ()->set_integer_value (param_key,
+ "mode",
+ params[i].mode);
+ }
+}
+
+CORBA::OperationMode
+TAO_OperationDef_i::mode (ACE_ENV_SINGLE_ARG_DECL)
+ ACE_THROW_SPEC ((CORBA::SystemException))
+{
+ TAO_IFR_READ_GUARD_RETURN (CORBA::OP_NORMAL);
+
+ this->update_key (ACE_ENV_SINGLE_ARG_PARAMETER);
+ ACE_CHECK_RETURN (CORBA::OP_NORMAL);
+
+ return this->mode_i (ACE_ENV_SINGLE_ARG_PARAMETER);
+}
+
+CORBA::OperationMode
+TAO_OperationDef_i::mode_i (ACE_ENV_SINGLE_ARG_DECL_NOT_USED)
+ ACE_THROW_SPEC ((CORBA::SystemException))
+{
+ u_int mode;
+ this->repo_->config ()->get_integer_value (this->section_key_,
+ "mode",
+ mode);
+
+ return static_cast<CORBA::OperationMode> (mode);
+}
+
+void
+TAO_OperationDef_i::mode (CORBA::OperationMode mode
+ ACE_ENV_ARG_DECL)
+ ACE_THROW_SPEC ((CORBA::SystemException))
+{
+ TAO_IFR_WRITE_GUARD;
+
+ this->update_key (ACE_ENV_SINGLE_ARG_PARAMETER);
+ ACE_CHECK;
+
+ this->mode_i (mode
+ ACE_ENV_ARG_PARAMETER);
+}
+
+void
+TAO_OperationDef_i::mode_i (CORBA::OperationMode mode
+ ACE_ENV_ARG_DECL_NOT_USED)
+ ACE_THROW_SPEC ((CORBA::SystemException))
+{
+ this->repo_->config ()->set_integer_value (this->section_key_,
+ "mode",
+ mode);
+}
+
+CORBA::ContextIdSeq *
+TAO_OperationDef_i::contexts (ACE_ENV_SINGLE_ARG_DECL)
+ ACE_THROW_SPEC ((CORBA::SystemException))
+{
+ TAO_IFR_READ_GUARD_RETURN (0);
+
+ this->update_key (ACE_ENV_SINGLE_ARG_PARAMETER);
+ ACE_CHECK_RETURN (0);
+
+ return this->contexts_i (ACE_ENV_SINGLE_ARG_PARAMETER);
+}
+
+CORBA::ContextIdSeq *
+TAO_OperationDef_i::contexts_i (ACE_ENV_SINGLE_ARG_DECL)
+ ACE_THROW_SPEC ((CORBA::SystemException))
+{
+ ACE_Configuration_Section_Key contexts_key;
+ int status =
+ this->repo_->config ()->open_section (this->section_key_,
+ "contexts",
+ 0,
+ contexts_key);
+
+ ACE_Unbounded_Queue<ACE_TString> context_queue;
+
+ // This section may not have been created.
+ if (status == 0)
+ {
+ int index = 0;
+ ACE_TString context;
+
+ // Don't have to worry about gaps here - contexts are not
+ // IR objects so they can't be destroyed one at a time. To
+ // make a change one has to call the mutator version of this
+ // function and make a completely new list.
+ char *stringified = TAO_IFR_Service_Utils::int_to_string (index);
+ while (this->repo_->config ()->get_string_value (contexts_key,
+ stringified,
+ context)
+ == 0)
+ {
+ context_queue.enqueue_tail (context);
+ ++index;
+ stringified =
+ TAO_IFR_Service_Utils::int_to_string (index);
+ }
+ }
+
+ CORBA::ULong size = static_cast<CORBA::ULong> (context_queue.size ());
+
+ CORBA::ContextIdSeq *ci_seq = 0;
+ ACE_NEW_THROW_EX (ci_seq,
+ CORBA::ContextIdSeq (size),
+ CORBA::NO_MEMORY ());
+ ACE_CHECK_RETURN (0);
+
+ ci_seq->length (size);
+
+ for (CORBA::ULong i = 0; i < size; ++i)
+ {
+ ACE_TString context_string;
+ context_queue.dequeue_head (context_string);
+
+ (*ci_seq)[i] = context_string.c_str ();
+ }
+
+ return ci_seq;
+}
+
+void
+TAO_OperationDef_i::contexts (const CORBA::ContextIdSeq &contexts
+ ACE_ENV_ARG_DECL)
+ ACE_THROW_SPEC ((CORBA::SystemException))
+{
+ TAO_IFR_WRITE_GUARD;
+
+ this->update_key (ACE_ENV_SINGLE_ARG_PARAMETER);
+ ACE_CHECK;
+
+ this->contexts_i (contexts
+ ACE_ENV_ARG_PARAMETER);
+}
+
+void
+TAO_OperationDef_i::contexts_i (const CORBA::ContextIdSeq &contexts
+ ACE_ENV_ARG_DECL_NOT_USED)
+ ACE_THROW_SPEC ((CORBA::SystemException))
+{
+ this->repo_->config ()->remove_section (this->section_key_,
+ "contexts",
+ 0);
+
+ CORBA::ULong length = contexts.length ();
+
+ if (length == 0)
+ return;
+
+ ACE_Configuration_Section_Key contexts_key;
+ this->repo_->config ()->open_section (this->section_key_,
+ "contexts",
+ 1,
+ contexts_key);
+
+ for (CORBA::ULong i = 0; i < length; ++i)
+ {
+ char *stringified = TAO_IFR_Service_Utils::int_to_string (i);
+ this->repo_->config ()->set_string_value (contexts_key,
+ stringified,
+ contexts[i]);
+ }
+}
+
+CORBA::ExceptionDefSeq *
+TAO_OperationDef_i::exceptions (ACE_ENV_SINGLE_ARG_DECL )
+ ACE_THROW_SPEC ((CORBA::SystemException))
+{
+ TAO_IFR_READ_GUARD_RETURN (0);
+
+ this->update_key (ACE_ENV_SINGLE_ARG_PARAMETER);
+ ACE_CHECK_RETURN (0);
+
+ return this->exceptions_i (ACE_ENV_SINGLE_ARG_PARAMETER);
+}
+
+CORBA::ExceptionDefSeq *
+TAO_OperationDef_i::exceptions_i (ACE_ENV_SINGLE_ARG_DECL )
+ ACE_THROW_SPEC ((CORBA::SystemException))
+{
+ ACE_Configuration_Section_Key excepts_key;
+ int status =
+ this->repo_->config ()->open_section (this->section_key_,
+ "excepts",
+ 0,
+ excepts_key);
+
+ int index = 0;
+ ACE_Unbounded_Queue<ACE_TString> path_queue;
+
+ // This section may not have been created.
+ if (status == 0)
+ {
+ ACE_TString field_name, type_path;
+ ACE_Configuration::VALUETYPE type;
+
+ while (this->repo_->config ()->enumerate_values (excepts_key,
+ index++,
+ field_name,
+ type)
+ == 0)
+ {
+ this->repo_->config ()->get_string_value (excepts_key,
+ field_name.c_str (),
+ type_path);
+
+ path_queue.enqueue_tail (type_path);
+ }
+ }
+
+ CORBA::ULong size = static_cast<CORBA::ULong> (path_queue.size ());
+
+ CORBA::ExceptionDefSeq *ed_seq = 0;
+ ACE_NEW_THROW_EX (ed_seq,
+ CORBA::ExceptionDefSeq (size),
+ CORBA::NO_MEMORY ());
+ ACE_CHECK_RETURN (0);
+
+ ed_seq->length (size);
+
+ if (index == 0)
+ {
+ return ed_seq;
+ }
+
+ CORBA::ExceptionDefSeq_var retval = ed_seq;
+
+ for (CORBA::ULong i = 0; i < size; ++i)
+ {
+ ACE_TString path;
+ path_queue.dequeue_head (path);
+
+ CORBA::Object_var obj =
+ TAO_IFR_Service_Utils::create_objref (CORBA::dk_Exception,
+ path.c_str (),
+ this->repo_
+ ACE_ENV_ARG_PARAMETER);
+ ACE_CHECK_RETURN (0);
+
+ retval[i] = CORBA::ExceptionDef::_narrow (obj.in ()
+ ACE_ENV_ARG_PARAMETER);
+ ACE_CHECK_RETURN (0);
+ }
+
+ return retval._retn ();
+}
+
+void
+TAO_OperationDef_i::exceptions (const CORBA::ExceptionDefSeq &exceptions
+ ACE_ENV_ARG_DECL)
+ ACE_THROW_SPEC ((CORBA::SystemException))
+{
+ TAO_IFR_WRITE_GUARD;
+
+ this->update_key (ACE_ENV_SINGLE_ARG_PARAMETER);
+ ACE_CHECK;
+
+ this->exceptions_i (exceptions
+ ACE_ENV_ARG_PARAMETER);
+}
+
+void
+TAO_OperationDef_i::exceptions_i (const CORBA::ExceptionDefSeq &exceptions
+ ACE_ENV_ARG_DECL_NOT_USED)
+ ACE_THROW_SPEC ((CORBA::SystemException))
+{
+ this->repo_->config ()->remove_section (this->section_key_,
+ "excepts",
+ 0);
+
+ TAO_IFR_Service_Utils::set_exceptions (this->repo_->config (),
+ this->section_key_,
+ "excepts",
+ exceptions);
+}
+
+void
+TAO_OperationDef_i::make_description (
+ CORBA::OperationDescription &od
+ ACE_ENV_ARG_DECL)
+ ACE_THROW_SPEC ((CORBA::SystemException))
+{
+ od.name = this->name_i (ACE_ENV_SINGLE_ARG_PARAMETER);
+ ACE_CHECK;
+
+ od.id = this->id_i (ACE_ENV_SINGLE_ARG_PARAMETER);
+ ACE_CHECK;
+
+ ACE_TString container_id;
+ this->repo_->config ()->get_string_value (this->section_key_,
+ "container_id",
+ container_id);
+
+ od.defined_in = container_id.c_str ();
+
+ od.version = this->version_i (ACE_ENV_SINGLE_ARG_PARAMETER);
+ ACE_CHECK;
+
+ od.result = this->result_i (ACE_ENV_SINGLE_ARG_PARAMETER);
+ ACE_CHECK;
+
+ od.mode = this->mode_i (ACE_ENV_SINGLE_ARG_PARAMETER);
+ ACE_CHECK;
+
+ CORBA::ContextIdSeq_var cid_seq =
+ this->contexts_i (ACE_ENV_SINGLE_ARG_PARAMETER);
+ ACE_CHECK;
+
+ od.contexts = cid_seq.in ();
+
+ CORBA::ParDescriptionSeq_var pd_seq =
+ this->params_i (ACE_ENV_SINGLE_ARG_PARAMETER);
+ ACE_CHECK;
+
+ od.parameters = pd_seq.in ();
+
+ ACE_Configuration_Section_Key excepts_key;
+ int status =
+ this->repo_->config ()->open_section (this->section_key_,
+ "excepts",
+ 0,
+ excepts_key);
+
+ // This section may not have been created.
+ if (status == 0)
+ {
+ int index = 0;
+ int status = 0;
+ ACE_TString field_name, type_path;
+ ACE_Configuration::VALUETYPE type;
+ ACE_Unbounded_Queue<ACE_TString> path_queue;
+
+ while (this->repo_->config ()->enumerate_values (excepts_key,
+ index++,
+ field_name,
+ type)
+ == 0)
+ {
+ status =
+ this->repo_->config ()->get_string_value (excepts_key,
+ field_name.c_str (),
+ type_path);
+
+ if (status == 0)
+ {
+ path_queue.enqueue_tail (type_path);
+ }
+ }
+
+ CORBA::ULong size = static_cast<CORBA::ULong> (path_queue.size ());
+
+ od.exceptions.length (size);
+
+ for (CORBA::ULong i = 0; i < size; ++i)
+ {
+ ACE_TString type_path;
+ path_queue.dequeue_head (type_path);
+
+ ACE_Configuration_Section_Key type_key;
+ this->repo_->config ()->expand_path (this->repo_->root_key (),
+ type_path,
+ type_key,
+ 0);
+
+ ACE_TString name;
+ this->repo_->config ()->get_string_value (type_key,
+ "name",
+ name);
+
+ od.exceptions[i].name = name.c_str ();
+
+ ACE_TString id;
+ this->repo_->config ()->get_string_value (type_key,
+ "id",
+ id);
+
+ od.exceptions[i].id = id.c_str ();
+
+ ACE_TString container_id;
+ this->repo_->config ()->get_string_value (type_key,
+ "container_id",
+ container_id);
+
+ od.exceptions[i].defined_in = container_id.c_str ();
+
+ ACE_TString version;
+ this->repo_->config ()->get_string_value (type_key,
+ "version",
+ version);
+
+ od.exceptions[i].version = version.c_str ();
+
+ TAO_ExceptionDef_i impl (this->repo_);
+ impl.section_key (type_key);
+
+ od.exceptions[i].type = impl.type_i (ACE_ENV_SINGLE_ARG_PARAMETER);
+ ACE_CHECK;
+ }
+ }
+ else
+ {
+ od.exceptions.length (0);
+ }
+}
+
+CORBA::TypeCode_ptr
+TAO_OperationDef_i::type_i (ACE_ENV_SINGLE_ARG_DECL)
+ ACE_THROW_SPEC ((CORBA::SystemException))
+{
+ return this->result_i (ACE_ENV_SINGLE_ARG_PARAMETER);
+}
+
+TAO_END_VERSIONED_NAMESPACE_DECL
diff --git a/TAO/orbsvcs/orbsvcs/IFRService/OperationDef_i.h b/TAO/orbsvcs/orbsvcs/IFRService/OperationDef_i.h
new file mode 100644
index 00000000000..f11a2850319
--- /dev/null
+++ b/TAO/orbsvcs/orbsvcs/IFRService/OperationDef_i.h
@@ -0,0 +1,184 @@
+// -*- C++ -*-
+
+// $Id$
+
+// ============================================================================
+//
+// = LIBRARY
+// TAO/orbsvcs/orbsvcs/IFRService
+//
+// = FILENAME
+// OperationDef_i.h
+//
+// = DESCRIPTION
+// OperationDef servant class.
+//
+// = AUTHOR
+// Jeff Parsons <parsons@cs.wustl.edu>
+//
+// ============================================================================
+
+#ifndef TAO_OPERATIONDEF_I_H
+#define TAO_OPERATIONDEF_I_H
+
+#include "orbsvcs/IFRService/Contained_i.h"
+#include "orbsvcs/IFRService/ifr_service_export.h"
+
+#if !defined (ACE_LACKS_PRAGMA_ONCE)
+# pragma once
+#endif /* ACE_LACKS_PRAGMA_ONCE */
+
+#if defined(_MSC_VER)
+#pragma warning(push)
+#pragma warning(disable:4250)
+#endif /* _MSC_VER */
+
+TAO_BEGIN_VERSIONED_NAMESPACE_DECL
+
+class TAO_IFRService_Export TAO_OperationDef_i : public virtual TAO_Contained_i
+{
+ // = TITLE
+ // TAO_OperationDef_i
+ //
+ // = DESCRIPTION
+ // Represents the information needed to describe an operation
+ // of an interface.
+ //
+public:
+ TAO_OperationDef_i (TAO_Repository_i *repo);
+ // Constructor
+
+ virtual ~TAO_OperationDef_i (void);
+ // Destructor
+
+ virtual CORBA::DefinitionKind def_kind (
+ ACE_ENV_SINGLE_ARG_DECL_WITH_DEFAULTS)
+ ACE_THROW_SPEC ((CORBA::SystemException));
+ // Return our definition kind.
+
+ virtual CORBA::Contained::Description *describe (
+ ACE_ENV_SINGLE_ARG_DECL_WITH_DEFAULTS)
+ ACE_THROW_SPEC ((CORBA::SystemException));
+ // From Contained_i's pure virtual function.
+
+ virtual CORBA::Contained::Description *describe_i (
+ ACE_ENV_SINGLE_ARG_DECL_WITH_DEFAULTS)
+ ACE_THROW_SPEC ((CORBA::SystemException));
+ // From Contained_i's pure virtual function.
+
+ virtual CORBA::TypeCode_ptr result (
+ ACE_ENV_SINGLE_ARG_DECL_WITH_DEFAULTS)
+ ACE_THROW_SPEC ((CORBA::SystemException));
+
+ CORBA::TypeCode_ptr result_i (
+ ACE_ENV_SINGLE_ARG_DECL_WITH_DEFAULTS)
+ ACE_THROW_SPEC ((CORBA::SystemException));
+
+ virtual CORBA::IDLType_ptr result_def (
+ ACE_ENV_SINGLE_ARG_DECL_WITH_DEFAULTS)
+ ACE_THROW_SPEC ((CORBA::SystemException));
+
+ CORBA::IDLType_ptr result_def_i (
+ ACE_ENV_SINGLE_ARG_DECL_WITH_DEFAULTS)
+ ACE_THROW_SPEC ((CORBA::SystemException));
+
+ virtual void result_def (
+ CORBA::IDLType_ptr result_def
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS)
+ ACE_THROW_SPEC ((CORBA::SystemException));
+
+ void result_def_i (
+ CORBA::IDLType_ptr result_def
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS)
+ ACE_THROW_SPEC ((CORBA::SystemException));
+
+ virtual CORBA::ParDescriptionSeq *params (
+ ACE_ENV_SINGLE_ARG_DECL_WITH_DEFAULTS)
+ ACE_THROW_SPEC ((CORBA::SystemException));
+
+ CORBA::ParDescriptionSeq *params_i (
+ ACE_ENV_SINGLE_ARG_DECL_WITH_DEFAULTS)
+ ACE_THROW_SPEC ((CORBA::SystemException));
+
+ virtual void params (
+ const CORBA::ParDescriptionSeq &params
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS)
+ ACE_THROW_SPEC ((CORBA::SystemException));
+
+ void params_i (
+ const CORBA::ParDescriptionSeq &params
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS)
+ ACE_THROW_SPEC ((CORBA::SystemException));
+
+ virtual CORBA::OperationMode mode (
+ ACE_ENV_SINGLE_ARG_DECL_WITH_DEFAULTS)
+ ACE_THROW_SPEC ((CORBA::SystemException));
+
+ CORBA::OperationMode mode_i (
+ ACE_ENV_SINGLE_ARG_DECL_WITH_DEFAULTS)
+ ACE_THROW_SPEC ((CORBA::SystemException));
+
+ virtual void mode (
+ CORBA::OperationMode mode
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS)
+ ACE_THROW_SPEC ((CORBA::SystemException));
+
+ void mode_i (
+ CORBA::OperationMode mode
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS)
+ ACE_THROW_SPEC ((CORBA::SystemException));
+
+ virtual CORBA::ContextIdSeq *contexts (
+ ACE_ENV_SINGLE_ARG_DECL_WITH_DEFAULTS)
+ ACE_THROW_SPEC ((CORBA::SystemException));
+
+ CORBA::ContextIdSeq *contexts_i (
+ ACE_ENV_SINGLE_ARG_DECL_WITH_DEFAULTS)
+ ACE_THROW_SPEC ((CORBA::SystemException));
+
+ virtual void contexts (
+ const CORBA::ContextIdSeq &contexts
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS)
+ ACE_THROW_SPEC ((CORBA::SystemException));
+
+ void contexts_i (
+ const CORBA::ContextIdSeq &contexts
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS)
+ ACE_THROW_SPEC ((CORBA::SystemException));
+
+ virtual CORBA::ExceptionDefSeq *exceptions (
+ ACE_ENV_SINGLE_ARG_DECL_WITH_DEFAULTS)
+ ACE_THROW_SPEC ((CORBA::SystemException));
+
+ CORBA::ExceptionDefSeq *exceptions_i (
+ ACE_ENV_SINGLE_ARG_DECL_WITH_DEFAULTS)
+ ACE_THROW_SPEC ((CORBA::SystemException));
+
+ virtual void exceptions (
+ const CORBA::ExceptionDefSeq &exceptions
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS)
+ ACE_THROW_SPEC ((CORBA::SystemException));
+
+ void exceptions_i (
+ const CORBA::ExceptionDefSeq &exceptions
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS)
+ ACE_THROW_SPEC ((CORBA::SystemException));
+
+ // Common code for containers to call in
+ // making descriptions.
+
+ void make_description (CORBA::OperationDescription &desc
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS)
+ ACE_THROW_SPEC ((CORBA::SystemException));
+
+ CORBA::TypeCode_ptr type_i (ACE_ENV_SINGLE_ARG_DECL_WITH_DEFAULTS)
+ ACE_THROW_SPEC ((CORBA::SystemException));
+};
+
+TAO_END_VERSIONED_NAMESPACE_DECL
+
+#if defined(_MSC_VER)
+#pragma warning(pop)
+#endif /* _MSC_VER */
+
+#endif /* TAO_OPERATIONDEF_I_H */
diff --git a/TAO/orbsvcs/orbsvcs/IFRService/Options.cpp b/TAO/orbsvcs/orbsvcs/IFRService/Options.cpp
new file mode 100644
index 00000000000..26f71866bfd
--- /dev/null
+++ b/TAO/orbsvcs/orbsvcs/IFRService/Options.cpp
@@ -0,0 +1,122 @@
+// $Id$
+
+#include "orbsvcs/IFRService/Options.h"
+#include "ace/Get_Opt.h"
+#include "ace/Log_Msg.h"
+#include "ace/Null_Mutex.h"
+#include "ace/OS_NS_string.h"
+
+TAO_BEGIN_VERSIONED_NAMESPACE_DECL
+
+Options::Options ()
+ : ior_output_file_ (ACE_OS::strdup ("if_repo.ior")),
+ persistent_ (0),
+ persistent_file_ (ACE_OS::strdup ("ifr_default_backing_store")),
+ using_registry_ (0),
+ enable_locking_ (0),
+ support_multicast_(0)
+{
+}
+
+Options::~Options ()
+{
+ ACE_OS::free (this->ior_output_file_);
+ ACE_OS::free (this->persistent_file_);
+}
+
+int
+Options::parse_args (int argc, ACE_TCHAR *argv[])
+{
+ ACE_Get_Opt get_opts (argc, argv, "o:pb:lm:r");
+ int c;
+
+ while ((c = get_opts ()) != -1)
+ switch (c)
+ {
+ case 'o': // Set the IOR output filename.
+ this->ior_output_file_ = get_opts.opt_arg ();
+ break;
+ case 'p': // Make the IFR persistent
+ this->persistent_ = 1;
+ this->using_registry_ = 0;
+ break;
+ case 'b':
+ this->persistent_file_ = get_opts.opt_arg ();
+ break;
+ case 'l':
+#if defined (ACE_HAS_THREADS)
+ this->enable_locking_ = 1;
+#endif /* ACE_HAS_THREADS */
+ break;
+ case 'r': // win32 registry implementation
+#if defined (ACE_WIN32)
+ if (this->persistent_ == 0)
+ this->using_registry_ = 1;
+ break;
+#else /* ACE_WIN32 */
+ ACE_ERROR_RETURN ((
+ LM_ERROR,
+ ACE_TEXT ("parse_args: not a win32 platform\n")
+ ),
+ 1
+ );
+#endif /* ACE_WIN32 */
+ case 'm':
+ this->support_multicast_ = ACE_OS::atoi(get_opts.opt_arg ());
+ break;
+ case '?': // display help for use of the server.
+ default:
+ ACE_ERROR_RETURN ((LM_ERROR,
+ "Usage: %s"
+ " [-o] <ior_output_file>"
+ " [-r]"
+ " [-l]"
+ " [-m] <0|1>"
+ " [-p]"
+ " [-b] <persistence_file>"
+ "\n",
+ argv [0]),
+ 1);
+ }
+
+ // Indicates successful parsing of command line.
+ return 0;
+}
+
+const char *
+Options::ior_output_file (void) const
+{
+ return this->ior_output_file_;
+}
+
+int
+Options::persistent (void) const
+{
+ return this->persistent_;
+}
+
+const char *
+Options::persistent_file (void) const
+{
+ return this->persistent_file_;
+}
+
+int
+Options::using_registry (void) const
+{
+ return this->using_registry_;
+}
+
+int
+Options::enable_locking (void) const
+{
+ return this->enable_locking_;
+}
+
+int
+Options::support_multicast_discovery (void) const
+{
+ return this->support_multicast_;
+}
+
+TAO_END_VERSIONED_NAMESPACE_DECL
diff --git a/TAO/orbsvcs/orbsvcs/IFRService/Options.h b/TAO/orbsvcs/orbsvcs/IFRService/Options.h
new file mode 100644
index 00000000000..f1453559b03
--- /dev/null
+++ b/TAO/orbsvcs/orbsvcs/IFRService/Options.h
@@ -0,0 +1,95 @@
+// -*- C++ -*-
+
+// $Id$
+
+// ============================================================================
+//
+// = LIBRARY
+// TAO/orbsvcs/orbsvcs/IFRService
+//
+// = FILENAME
+// Options.h
+//
+// = DESCRIPTION
+// This class implements the Options container for the Interface
+// Repository.
+//
+// = AUTHOR
+// Jeff Parsons
+//
+// ============================================================================
+
+#ifndef OPTIONS_H
+#define OPTIONS_H
+
+#include "ace/Singleton.h"
+#include "ace/Null_Mutex.h"
+#include "orbsvcs/IFRService/ifr_service_export.h"
+#include "tao/Versioned_Namespace.h"
+
+TAO_BEGIN_VERSIONED_NAMESPACE_DECL
+
+class TAO_IFRService_Export Options
+{
+ // = TITLE
+ // Maintains the global options.
+ //
+ // = DESCRIPTION
+ // This class is converted into a Singleton by the
+ // <ACE_Singleton> template.
+public:
+ Options ();
+ // Default Constructor
+
+ ~Options();
+ // dtor
+
+ int parse_args (int argc,
+ ACE_TCHAR *argv[]);
+ // Parse the command-line arguments and initialize the options.
+
+ const char *ior_output_file (void) const;
+ // Return the file where the IOR of the server object is stored.
+
+ int persistent (void) const;
+ // Is the Interface Repository persistent?
+
+ const char *persistent_file (void) const;
+ // Return the default filename for persistent IFR.
+
+ int using_registry (void) const;
+ // Are we using a WIN32 registry as the backing store?
+
+ int enable_locking (void) const;
+ // Should the repository have a real mutex or a null mutex?
+
+ int support_multicast_discovery (void) const;
+ // should the service support discovery via multicast?
+
+private:
+ char *ior_output_file_;
+ // File where the IOR of the server object is stored.
+
+ int persistent_;
+ // Is the Interface Repository persistent?
+
+ char *persistent_file_;
+ // Default filename for persistent IFR.
+
+ int using_registry_;
+ // Are we using a WIN32 registry as the backing store?
+
+ int enable_locking_;
+ // Should the repository have a real mutex or a null mutex?
+
+ int support_multicast_;
+ // If not zero multicast is enabled.
+};
+
+// Typedef an Options Singleton.
+typedef ACE_Singleton <Options, ACE_Null_Mutex> OPTIONS;
+
+TAO_END_VERSIONED_NAMESPACE_DECL
+
+#endif /* OPTIONS_H */
+
diff --git a/TAO/orbsvcs/orbsvcs/IFRService/PrimitiveDef_i.cpp b/TAO/orbsvcs/orbsvcs/IFRService/PrimitiveDef_i.cpp
new file mode 100644
index 00000000000..f9789c4282b
--- /dev/null
+++ b/TAO/orbsvcs/orbsvcs/IFRService/PrimitiveDef_i.cpp
@@ -0,0 +1,142 @@
+// $Id$
+
+#include "orbsvcs/IFRService/Repository_i.h"
+#include "orbsvcs/IFRService/PrimitiveDef_i.h"
+
+ACE_RCSID (IFRService,
+ PrimitiveDef_i,
+ "$Id$")
+
+TAO_BEGIN_VERSIONED_NAMESPACE_DECL
+
+TAO_PrimitiveDef_i::TAO_PrimitiveDef_i (
+ TAO_Repository_i *repo
+ )
+ : TAO_IRObject_i (repo),
+ TAO_IDLType_i (repo)
+{
+}
+
+TAO_PrimitiveDef_i::~TAO_PrimitiveDef_i (void)
+{
+}
+
+CORBA::DefinitionKind
+TAO_PrimitiveDef_i::def_kind (ACE_ENV_SINGLE_ARG_DECL_NOT_USED)
+ ACE_THROW_SPEC ((CORBA::SystemException))
+{
+ return CORBA::dk_Primitive;
+}
+
+void
+TAO_PrimitiveDef_i::destroy (ACE_ENV_SINGLE_ARG_DECL)
+ ACE_THROW_SPEC ((CORBA::SystemException))
+{
+ this->destroy_i (ACE_ENV_SINGLE_ARG_PARAMETER);
+}
+
+void
+TAO_PrimitiveDef_i::destroy_i (ACE_ENV_SINGLE_ARG_DECL)
+ ACE_THROW_SPEC ((CORBA::SystemException))
+{
+ ACE_THROW (CORBA::BAD_INV_ORDER (CORBA::OMGVMCID | 2,
+ CORBA::COMPLETED_NO));
+}
+
+CORBA::TypeCode_ptr
+TAO_PrimitiveDef_i::type (ACE_ENV_SINGLE_ARG_DECL)
+ ACE_THROW_SPEC ((CORBA::SystemException))
+{
+ TAO_IFR_READ_GUARD_RETURN (CORBA::TypeCode::_nil ());
+
+ this->update_key (ACE_ENV_SINGLE_ARG_PARAMETER);
+ ACE_CHECK_RETURN (CORBA::TypeCode::_nil ());
+
+ return this->type_i (ACE_ENV_SINGLE_ARG_PARAMETER);
+}
+
+CORBA::TypeCode_ptr
+TAO_PrimitiveDef_i::type_i (ACE_ENV_SINGLE_ARG_DECL_NOT_USED)
+ ACE_THROW_SPEC ((CORBA::SystemException))
+{
+ u_int pkind = 0;
+ this->repo_->config ()->get_integer_value (this->section_key_,
+ "pkind",
+ pkind);
+
+ switch (static_cast<CORBA::PrimitiveKind> (pkind))
+ {
+ case CORBA::pk_null:
+ return CORBA::TypeCode::_duplicate (CORBA::_tc_null);
+ case CORBA::pk_void:
+ return CORBA::TypeCode::_duplicate (CORBA::_tc_void);
+ case CORBA::pk_short:
+ return CORBA::TypeCode::_duplicate (CORBA::_tc_short);
+ case CORBA::pk_long:
+ return CORBA::TypeCode::_duplicate (CORBA::_tc_long);
+ case CORBA::pk_ushort:
+ return CORBA::TypeCode::_duplicate (CORBA::_tc_ushort);
+ case CORBA::pk_ulong:
+ return CORBA::TypeCode::_duplicate (CORBA::_tc_ulong);
+ case CORBA::pk_float:
+ return CORBA::TypeCode::_duplicate (CORBA::_tc_float);
+ case CORBA::pk_double:
+ return CORBA::TypeCode::_duplicate (CORBA::_tc_double);
+ case CORBA::pk_boolean:
+ return CORBA::TypeCode::_duplicate (CORBA::_tc_boolean);
+ case CORBA::pk_char:
+ return CORBA::TypeCode::_duplicate (CORBA::_tc_char);
+ case CORBA::pk_octet:
+ return CORBA::TypeCode::_duplicate (CORBA::_tc_octet);
+ case CORBA::pk_any:
+ return CORBA::TypeCode::_duplicate (CORBA::_tc_any);
+ case CORBA::pk_TypeCode:
+ return CORBA::TypeCode::_duplicate (CORBA::_tc_TypeCode);
+ case CORBA::pk_Principal:
+ return CORBA::TypeCode::_duplicate (CORBA::_tc_Principal);
+ case CORBA::pk_string:
+ return CORBA::TypeCode::_duplicate (CORBA::_tc_string);
+ case CORBA::pk_objref:
+ return CORBA::TypeCode::_duplicate (CORBA::_tc_Object);
+ case CORBA::pk_longlong:
+ return CORBA::TypeCode::_duplicate (CORBA::_tc_longlong);
+ case CORBA::pk_ulonglong:
+ return CORBA::TypeCode::_duplicate (CORBA::_tc_ulonglong);
+ case CORBA::pk_longdouble:
+ return CORBA::TypeCode::_duplicate (CORBA::_tc_longdouble);
+ case CORBA::pk_wchar:
+ return CORBA::TypeCode::_duplicate (CORBA::_tc_wchar);
+ case CORBA::pk_wstring:
+ return CORBA::TypeCode::_duplicate (CORBA::_tc_wstring);
+ case CORBA::pk_value_base:
+ // TODO - we haven't added this typecode constant yet.
+ default:
+ return CORBA::TypeCode::_duplicate (CORBA::_tc_null);
+ }
+}
+
+CORBA::PrimitiveKind
+TAO_PrimitiveDef_i::kind (ACE_ENV_SINGLE_ARG_DECL)
+ ACE_THROW_SPEC ((CORBA::SystemException))
+{
+ TAO_IFR_READ_GUARD_RETURN (CORBA::pk_null);
+
+ this->update_key (ACE_ENV_SINGLE_ARG_PARAMETER);
+ ACE_CHECK_RETURN (CORBA::pk_null);
+
+ return this->kind_i (ACE_ENV_SINGLE_ARG_PARAMETER);
+}
+
+CORBA::PrimitiveKind
+TAO_PrimitiveDef_i::kind_i (ACE_ENV_SINGLE_ARG_DECL_NOT_USED)
+ ACE_THROW_SPEC ((CORBA::SystemException))
+{
+ u_int pkind = 0;
+ this->repo_->config ()->get_integer_value (this->section_key_,
+ "pkind",
+ pkind);
+
+ return static_cast<CORBA::PrimitiveKind> (pkind);
+}
+
+TAO_END_VERSIONED_NAMESPACE_DECL
diff --git a/TAO/orbsvcs/orbsvcs/IFRService/PrimitiveDef_i.h b/TAO/orbsvcs/orbsvcs/IFRService/PrimitiveDef_i.h
new file mode 100644
index 00000000000..05103c5c7ed
--- /dev/null
+++ b/TAO/orbsvcs/orbsvcs/IFRService/PrimitiveDef_i.h
@@ -0,0 +1,100 @@
+// -*- C++ -*-
+
+// $Id$
+
+// ============================================================================
+//
+// = LIBRARY
+// TAO/orbsvcs/orbsvcs/IFRService
+//
+// = FILENAME
+// PrimitiveDef_i.h
+//
+// = DESCRIPTION
+// PrimitiveDef servant class.
+//
+// = AUTHOR
+// Jeff Parsons <parsons@cs.wustl.edu>
+//
+// ============================================================================
+
+#ifndef TAO_PRIMITIVEDEF_I_H
+#define TAO_PRIMITIVEDEF_I_H
+
+#include "orbsvcs/IFRService/IDLType_i.h"
+#include "orbsvcs/IFRService/ifr_service_export.h"
+
+#if !defined (ACE_LACKS_PRAGMA_ONCE)
+# pragma once
+#endif /* ACE_LACKS_PRAGMA_ONCE */
+
+#if defined(_MSC_VER)
+#pragma warning(push)
+#pragma warning(disable:4250)
+#endif /* _MSC_VER */
+
+TAO_BEGIN_VERSIONED_NAMESPACE_DECL
+
+class TAO_IFRService_Export TAO_PrimitiveDef_i : public virtual TAO_IDLType_i
+{
+ // = TITLE
+ // TAO_PrimitiveDef_i
+ //
+ // = DESCRIPTION
+ // Represents any of the OMG IDL primitive types
+ //
+public:
+ TAO_PrimitiveDef_i (TAO_Repository_i *repo);
+ // Constructor.
+
+ virtual ~TAO_PrimitiveDef_i (void);
+ // Destructor.
+
+ virtual CORBA::DefinitionKind def_kind (
+ ACE_ENV_SINGLE_ARG_DECL_WITH_DEFAULTS)
+
+ ACE_THROW_SPEC ((CORBA::SystemException));
+ // Return our definition kind.
+
+ virtual void destroy (
+ ACE_ENV_SINGLE_ARG_DECL_WITH_DEFAULTS)
+
+ ACE_THROW_SPEC ((CORBA::SystemException));
+ // May not be called on a primitive kind - raises BAD_INV_ORDER.
+
+ virtual void destroy_i (
+ ACE_ENV_SINGLE_ARG_DECL_WITH_DEFAULTS)
+
+ ACE_THROW_SPEC ((CORBA::SystemException));
+ // Must implement this here because it's pure virtual in the
+ // base class.
+
+ virtual CORBA::TypeCode_ptr type (
+ ACE_ENV_SINGLE_ARG_DECL_WITH_DEFAULTS)
+
+ ACE_THROW_SPEC ((CORBA::SystemException));
+ // From IDLType_i's pure virtual function.
+
+ virtual CORBA::TypeCode_ptr type_i (
+ ACE_ENV_SINGLE_ARG_DECL_WITH_DEFAULTS)
+
+ ACE_THROW_SPEC ((CORBA::SystemException));
+
+ virtual CORBA::PrimitiveKind kind (
+ ACE_ENV_SINGLE_ARG_DECL_WITH_DEFAULTS)
+
+ ACE_THROW_SPEC ((CORBA::SystemException));
+
+ CORBA::PrimitiveKind kind_i (
+ ACE_ENV_SINGLE_ARG_DECL_WITH_DEFAULTS)
+
+ ACE_THROW_SPEC ((CORBA::SystemException));
+};
+
+TAO_END_VERSIONED_NAMESPACE_DECL
+
+#if defined(_MSC_VER)
+#pragma warning(pop)
+#endif /* _MSC_VER */
+
+#endif /* TAO_PRIMITIVEDEF_I_H */
diff --git a/TAO/orbsvcs/orbsvcs/IFRService/ProvidesDef_i.cpp b/TAO/orbsvcs/orbsvcs/IFRService/ProvidesDef_i.cpp
new file mode 100644
index 00000000000..f9bf6490763
--- /dev/null
+++ b/TAO/orbsvcs/orbsvcs/IFRService/ProvidesDef_i.cpp
@@ -0,0 +1,161 @@
+// $Id$
+
+#include "orbsvcs/IFRService/Repository_i.h"
+#include "orbsvcs/IFRService/ProvidesDef_i.h"
+#include "orbsvcs/IFRService/IFR_ComponentsS.h"
+#include "orbsvcs/IFRService/IFR_Service_Utils_T.h"
+#include "orbsvcs/IFRService/IFR_Service_Utils.h"
+
+#include "ace/SString.h"
+
+
+ACE_RCSID (IFRService,
+ ProvidesDef_i,
+ "$Id$")
+
+
+TAO_ProvidesDef_i::TAO_ProvidesDef_i (
+ TAO_Repository_i *repo
+ )
+ : TAO_IRObject_i (repo),
+ TAO_Contained_i (repo)
+{
+}
+
+TAO_ProvidesDef_i::~TAO_ProvidesDef_i (void)
+{
+}
+
+CORBA::DefinitionKind
+TAO_ProvidesDef_i::def_kind (ACE_ENV_SINGLE_ARG_DECL_NOT_USED)
+ ACE_THROW_SPEC ((CORBA::SystemException))
+{
+ return CORBA::dk_Provides;
+}
+
+CORBA::Contained::Description *
+TAO_ProvidesDef_i::describe (ACE_ENV_SINGLE_ARG_DECL)
+ ACE_THROW_SPEC ((CORBA::SystemException))
+{
+ TAO_IFR_READ_GUARD_RETURN (0);
+
+ this->update_key (ACE_ENV_SINGLE_ARG_PARAMETER);
+ ACE_CHECK_RETURN (0);
+
+ return this->describe_i (ACE_ENV_SINGLE_ARG_PARAMETER);
+}
+
+CORBA::Contained::Description *
+TAO_ProvidesDef_i::describe_i (ACE_ENV_SINGLE_ARG_DECL)
+ ACE_THROW_SPEC ((CORBA::SystemException))
+{
+ CORBA::ComponentIR::ProvidesDescription pd;
+ TAO_IFR_Desc_Utils<CORBA::ComponentIR::ProvidesDescription,
+ TAO_ProvidesDef_i>::fill_desc_begin (
+ pd,
+ this->repo_,
+ this->section_key_
+ ACE_ENV_ARG_PARAMETER
+ );
+ ACE_CHECK_RETURN (0);
+
+ ACE_TString base_type_id;
+ this->repo_->config ()->get_string_value (this->section_key_,
+ "base_type",
+ base_type_id);
+ pd.interface_type = base_type_id.fast_rep ();
+
+ CORBA::Contained::Description *retval = 0;
+ ACE_NEW_RETURN (retval,
+ CORBA::Contained::Description,
+ 0);
+
+ retval->kind = CORBA::dk_Provides;
+ retval->value <<= pd;
+ return retval;
+}
+
+CORBA::InterfaceDef_ptr
+TAO_ProvidesDef_i::interface_type (ACE_ENV_SINGLE_ARG_DECL)
+ ACE_THROW_SPEC ((CORBA::SystemException))
+{
+ TAO_IFR_READ_GUARD_RETURN (CORBA::InterfaceDef::_nil ());
+
+ this->update_key (ACE_ENV_SINGLE_ARG_PARAMETER);
+ ACE_CHECK_RETURN (CORBA::InterfaceDef::_nil ());
+
+ return this->interface_type_i (ACE_ENV_SINGLE_ARG_PARAMETER);
+}
+
+CORBA::InterfaceDef_ptr
+TAO_ProvidesDef_i::interface_type_i (ACE_ENV_SINGLE_ARG_DECL)
+ ACE_THROW_SPEC ((CORBA::SystemException))
+{
+ ACE_TString holder;
+ this->repo_->config ()->get_string_value (this->section_key_,
+ "base_type",
+ holder);
+ this->repo_->config ()->get_string_value (this->repo_->repo_ids_key (),
+ holder.fast_rep (),
+ holder);
+ CORBA::Object_var obj =
+ TAO_IFR_Service_Utils::path_to_ir_object (holder,
+ this->repo_
+ ACE_ENV_ARG_PARAMETER);
+ ACE_CHECK_RETURN (CORBA::InterfaceDef::_nil ());
+
+ return CORBA::InterfaceDef::_narrow (obj.in ()
+ ACE_ENV_ARG_PARAMETER);
+}
+
+void
+TAO_ProvidesDef_i::interface_type (
+ CORBA::InterfaceDef_ptr interface_type
+ ACE_ENV_ARG_DECL
+ )
+ ACE_THROW_SPEC ((CORBA::SystemException))
+{
+ TAO_IFR_WRITE_GUARD;
+
+ this->update_key (ACE_ENV_SINGLE_ARG_PARAMETER);
+ ACE_CHECK;
+
+ this->interface_type_i (interface_type
+ ACE_ENV_ARG_PARAMETER);
+}
+
+void
+TAO_ProvidesDef_i::interface_type_i (
+ CORBA::InterfaceDef_ptr interface_type
+ ACE_ENV_ARG_DECL_NOT_USED
+ )
+ ACE_THROW_SPEC ((CORBA::SystemException))
+{
+ this->repo_->config ()->remove_value (this->section_key_,
+ "base_type");
+
+ if (CORBA::is_nil (interface_type))
+ {
+ return;
+ }
+
+ const char *tmp =
+ TAO_IFR_Service_Utils::reference_to_path (interface_type);
+
+ ACE_Configuration_Section_Key new_key;
+ this->repo_->config ()->expand_path (this->repo_->root_key (),
+ tmp,
+ new_key,
+ 0);
+
+ ACE_TString holder;
+ this->repo_->config ()->get_string_value (new_key,
+ "id",
+ holder);
+
+ this->repo_->config ()->set_string_value (
+ this->section_key_,
+ "base_type",
+ holder
+ );
+}
diff --git a/TAO/orbsvcs/orbsvcs/IFRService/ProvidesDef_i.h b/TAO/orbsvcs/orbsvcs/IFRService/ProvidesDef_i.h
new file mode 100644
index 00000000000..e07923a3fee
--- /dev/null
+++ b/TAO/orbsvcs/orbsvcs/IFRService/ProvidesDef_i.h
@@ -0,0 +1,101 @@
+/* -*- C++ -*- */
+// $Id$
+
+// ============================================================================
+//
+// = LIBRARY
+// TAO/orbsvcs/orbsvcs/IFRService
+//
+// = FILENAME
+// ProvidesDef_i.h
+//
+// = DESCRIPTION
+// ProvidesDef servant class.
+//
+// = AUTHOR
+// Jeff Parsons <parsons@cs.wustl.edu>
+//
+// ============================================================================
+
+#ifndef TAO_PROVIDESDEF_I_H
+#define TAO_PROVIDESDEF_I_H
+
+#include "orbsvcs/IFRService/Contained_i.h"
+#include "orbsvcs/IFRService/ifr_service_export.h"
+
+#if !defined (ACE_LACKS_PRAGMA_ONCE)
+# pragma once
+#endif /* ACE_LACKS_PRAGMA_ONCE */
+
+#if defined(_MSC_VER)
+#pragma warning(push)
+#pragma warning(disable:4250)
+#endif /* _MSC_VER */
+
+TAO_BEGIN_VERSIONED_NAMESPACE_DECL
+
+class TAO_IFRService_Export TAO_ProvidesDef_i : public virtual TAO_Contained_i
+{
+ // = TITLE
+ // TAO_ProvidesDef_i
+ //
+ // = DESCRIPTION
+ // Represents an interface that is provided by a component.
+ //
+public:
+ TAO_ProvidesDef_i (TAO_Repository_i *repoy);
+ // Constructor
+
+ virtual ~TAO_ProvidesDef_i (void);
+ // Destructor
+
+ virtual CORBA::DefinitionKind def_kind (
+ ACE_ENV_SINGLE_ARG_DECL_WITH_DEFAULTS
+ )
+ ACE_THROW_SPEC ((CORBA::SystemException));
+ // Return our definition kind.
+
+ virtual CORBA::Contained::Description *describe (
+ ACE_ENV_SINGLE_ARG_DECL_WITH_DEFAULTS
+ )
+ ACE_THROW_SPEC ((CORBA::SystemException));
+ // From Contained_i's pure virtual function.
+
+ virtual CORBA::Contained::Description *describe_i (
+ ACE_ENV_SINGLE_ARG_DECL_WITH_DEFAULTS
+ )
+ ACE_THROW_SPEC ((CORBA::SystemException));
+ // From Contained_i's pure virtual function.
+
+ virtual CORBA::InterfaceDef_ptr interface_type (
+ ACE_ENV_SINGLE_ARG_DECL_WITH_DEFAULTS
+ )
+ ACE_THROW_SPEC ((CORBA::SystemException));
+
+ CORBA::InterfaceDef_ptr interface_type_i (
+ ACE_ENV_SINGLE_ARG_DECL_WITH_DEFAULTS
+ )
+ ACE_THROW_SPEC ((CORBA::SystemException));
+
+ virtual void interface_type (
+ CORBA::InterfaceDef_ptr interface_type
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS
+ )
+ ACE_THROW_SPEC ((CORBA::SystemException));
+
+ void interface_type_i (
+ CORBA::InterfaceDef_ptr interface_type
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS
+ )
+ ACE_THROW_SPEC ((CORBA::SystemException));
+};
+
+TAO_END_VERSIONED_NAMESPACE_DECL
+
+#if defined(_MSC_VER)
+#pragma warning(pop)
+#endif /* _MSC_VER */
+
+#endif /* TAO_PROVIDESDEF_I_H */
+
+
diff --git a/TAO/orbsvcs/orbsvcs/IFRService/PublishesDef_i.cpp b/TAO/orbsvcs/orbsvcs/IFRService/PublishesDef_i.cpp
new file mode 100644
index 00000000000..1a06feb5687
--- /dev/null
+++ b/TAO/orbsvcs/orbsvcs/IFRService/PublishesDef_i.cpp
@@ -0,0 +1,30 @@
+/* -*- C++ -*- */
+// $Id$
+
+#include "orbsvcs/IFRService/PublishesDef_i.h"
+#include "orbsvcs/IFRService/Repository_i.h"
+
+ACE_RCSID (IFRService,
+ PublishesDef_i,
+ "$Id$")
+
+TAO_PublishesDef_i::TAO_PublishesDef_i (
+ TAO_Repository_i *repo
+ )
+ : TAO_IRObject_i (repo),
+ TAO_Contained_i (repo),
+ TAO_EventPortDef_i (repo)
+{
+}
+
+TAO_PublishesDef_i::~TAO_PublishesDef_i (void)
+{
+}
+
+CORBA::DefinitionKind
+TAO_PublishesDef_i::def_kind (ACE_ENV_SINGLE_ARG_DECL_NOT_USED)
+ ACE_THROW_SPEC ((CORBA::SystemException))
+{
+ return CORBA::dk_Publishes;
+}
+
diff --git a/TAO/orbsvcs/orbsvcs/IFRService/PublishesDef_i.h b/TAO/orbsvcs/orbsvcs/IFRService/PublishesDef_i.h
new file mode 100644
index 00000000000..613bc9010e1
--- /dev/null
+++ b/TAO/orbsvcs/orbsvcs/IFRService/PublishesDef_i.h
@@ -0,0 +1,67 @@
+/* -*- C++ -*- */
+// $Id$
+
+// ============================================================================
+//
+// = LIBRARY
+// TAO/orbsvcs/orbsvcs/IFRService
+//
+// = FILENAME
+// PublishesDef_i.h
+//
+// = DESCRIPTION
+// PublishesDef servant class.
+//
+// = AUTHOR
+// Jeff Parsons <parsons@cs.wustl.edu>
+//
+// ============================================================================
+
+#ifndef TAO_PUBLISHESDEF_I_H
+#define TAO_PUBLISHESDEF_I_H
+
+#include "orbsvcs/IFRService/EventPortDef_i.h"
+#include "orbsvcs/IFRService/ifr_service_export.h"
+
+#if !defined (ACE_LACKS_PRAGMA_ONCE)
+# pragma once
+#endif /* ACE_LACKS_PRAGMA_ONCE */
+
+#if defined(_MSC_VER)
+#pragma warning(push)
+#pragma warning(disable:4250)
+#endif /* _MSC_VER */
+
+TAO_BEGIN_VERSIONED_NAMESPACE_DECL
+
+class TAO_IFRService_Export TAO_PublishesDef_i
+ : public virtual TAO_EventPortDef_i
+{
+ // = TITLE
+ // TAO_PublishesDef_i
+ //
+ // = DESCRIPTION
+ // Represents the definition of an event that is published
+ // by a component.
+ //
+public:
+ TAO_PublishesDef_i (TAO_Repository_i *repo);
+ // Constructor
+
+ virtual ~TAO_PublishesDef_i (void);
+ // Destructor
+
+ virtual CORBA::DefinitionKind def_kind (
+ ACE_ENV_SINGLE_ARG_DECL_WITH_DEFAULTS
+ )
+ ACE_THROW_SPEC ((CORBA::SystemException));
+ // Return our definition kind.
+};
+
+TAO_END_VERSIONED_NAMESPACE_DECL
+
+#if defined(_MSC_VER)
+#pragma warning(pop)
+#endif /* _MSC_VER */
+
+#endif /* TAO_PUBLISHESDEF_I_H */
diff --git a/TAO/orbsvcs/orbsvcs/IFRService/RecursDef_i.cpp b/TAO/orbsvcs/orbsvcs/IFRService/RecursDef_i.cpp
new file mode 100644
index 00000000000..a6e4c6a6051
--- /dev/null
+++ b/TAO/orbsvcs/orbsvcs/IFRService/RecursDef_i.cpp
@@ -0,0 +1,47 @@
+// $Id$
+
+#include "orbsvcs/IFRService/RecursDef_i.h"
+
+
+ACE_RCSID (IFRService,
+ RecursDef_i,
+ "RecursDef_i.cpp,v 1.1 2004/10/18 09:00:00 SMA Exp")
+
+
+TAO_BEGIN_VERSIONED_NAMESPACE_DECL
+
+//-----------------------------------------------------------------------------
+// Class TAO_RecursiveDef_OuterScopes is a support class for StructDef_i.h and
+// UnionDef_i.h files. It creates a stack of outer structure definitions, used
+// by TAO_StructDef_i::type_i(), and TAO_UnionDef_i::type_i() during nested
+// structure processing.
+//-----------------------------------------------------------------------------
+
+TAO_RecursiveDef_OuterScopes::TAO_RecursiveDef_OuterScopes( const ACE_TString &id )
+ : id_( id ), pNextOuterID_( pIDsSeenAlready )
+{
+ pIDsSeenAlready= this; // "Push" this scope
+}
+
+TAO_RecursiveDef_OuterScopes::~TAO_RecursiveDef_OuterScopes()
+{
+ pIDsSeenAlready= pNextOuterID_; // "Pop" this scope
+}
+
+bool TAO_RecursiveDef_OuterScopes::SeenBefore( const ACE_TString &id )
+{
+ for ( const TAO_RecursiveDef_OuterScopes *pOuterScope= pIDsSeenAlready;
+ pOuterScope;
+ pOuterScope= pOuterScope->pNextOuterID_ )
+ {
+ if (pOuterScope->id_ == id)
+ return true;
+ }
+
+ return false;
+}
+
+const TAO_RecursiveDef_OuterScopes
+ *TAO_RecursiveDef_OuterScopes::pIDsSeenAlready= 0;
+
+TAO_END_VERSIONED_NAMESPACE_DECL
diff --git a/TAO/orbsvcs/orbsvcs/IFRService/RecursDef_i.h b/TAO/orbsvcs/orbsvcs/IFRService/RecursDef_i.h
new file mode 100644
index 00000000000..5fdf5b7e7a0
--- /dev/null
+++ b/TAO/orbsvcs/orbsvcs/IFRService/RecursDef_i.h
@@ -0,0 +1,68 @@
+// -*- C++ -*-
+
+// $Id$
+
+// ============================================================================
+//
+// = LIBRARY
+// TAO/orbsvcs/orbsvcs/IFRService
+//
+// = FILENAME
+// RecursDef_i.h
+//
+// = DESCRIPTION
+// StructDef & UnionDef support class.
+//
+// = AUTHOR
+// Simon Massey <sma@prismtech.com>
+//
+// ============================================================================
+
+#ifndef TAO_RECURSDEF_I_H
+#define TAO_RECURSDEF_I_H
+
+#include "orbsvcs/IFRService/TypedefDef_i.h"
+#include "ace/SString.h"
+#include "ace/OS_NS_stdlib.h"
+
+#if !defined (ACE_LACKS_PRAGMA_ONCE)
+# pragma once
+#endif /* ACE_LACKS_PRAGMA_ONCE */
+
+#if defined(_MSC_VER)
+#pragma warning(push)
+#pragma warning(disable:4250)
+#endif /* _MSC_VER */
+
+
+TAO_BEGIN_VERSIONED_NAMESPACE_DECL
+
+//-----------------------------------------------------------------------------
+// Class TAO_RecursiveDef_OuterScopes is a support class for StructDef_i.h and
+// UnionDef_i.h files. It creates a stack of outer structure definitions, used
+// by TAO_StructDef_i::type_i(), and TAO_UnionDef_i::type_i() during nested
+// structure processing.
+//-----------------------------------------------------------------------------
+
+class TAO_RecursiveDef_OuterScopes
+{
+public:
+ TAO_RecursiveDef_OuterScopes( const ACE_TString &id ); // "Push" scope's ID
+ ~TAO_RecursiveDef_OuterScopes(); // "Pop" this scope
+
+ static bool SeenBefore( const ACE_TString &id ); // Check for outer ID
+
+private: // Data
+ const ACE_TString id_;
+ const TAO_RecursiveDef_OuterScopes *const pNextOuterID_;
+
+ static const TAO_RecursiveDef_OuterScopes *pIDsSeenAlready;
+};
+
+TAO_END_VERSIONED_NAMESPACE_DECL
+
+#if defined(_MSC_VER)
+#pragma warning(pop)
+#endif /* _MSC_VER */
+
+#endif /* TAO_RECURSDEF_I_H */
diff --git a/TAO/orbsvcs/orbsvcs/IFRService/Repository_i.cpp b/TAO/orbsvcs/orbsvcs/IFRService/Repository_i.cpp
new file mode 100644
index 00000000000..028f07f18cc
--- /dev/null
+++ b/TAO/orbsvcs/orbsvcs/IFRService/Repository_i.cpp
@@ -0,0 +1,1150 @@
+// $Id$
+
+#include "orbsvcs/IFRService/concrete_classes.h"
+#include "orbsvcs/IFRService/Repository_i.h"
+#include "orbsvcs/IFRService/IDLType_i.h"
+#include "orbsvcs/IFRService/Options.h"
+#include "orbsvcs/IFRService/IFR_Service_Utils.h"
+
+#include "tao/ORB.h"
+#include "tao/Object_KeyC.h"
+
+#include "ace/Auto_Ptr.h"
+#include "ace/Lock_Adapter_T.h"
+#include "ace/SString.h"
+
+ACE_RCSID (IFR_Service,
+ Repository_i,
+ "$Id$")
+
+
+TAO_BEGIN_VERSIONED_NAMESPACE_DECL
+
+TAO_Repository_i::TAO_Repository_i (CORBA::ORB_ptr orb,
+ PortableServer::POA_ptr poa,
+ ACE_Configuration *config)
+ : TAO_IRObject_i (0),
+ TAO_Container_i (0),
+ orb_ (orb),
+ root_poa_ (poa),
+ config_ (config),
+ extension_ (CORBA::string_dup ("TAO_IFR_name_extension")),
+ lock_ (0)
+{
+}
+
+TAO_Repository_i::~TAO_Repository_i (void)
+{
+ delete this->lock_;
+}
+
+CORBA::DefinitionKind
+TAO_Repository_i::def_kind (ACE_ENV_SINGLE_ARG_DECL_NOT_USED)
+ ACE_THROW_SPEC ((CORBA::SystemException))
+{
+ return CORBA::dk_Repository;
+}
+
+void
+TAO_Repository_i::destroy (ACE_ENV_SINGLE_ARG_DECL)
+ ACE_THROW_SPEC ((CORBA::SystemException))
+{
+ ACE_THROW (CORBA::BAD_INV_ORDER (CORBA::OMGVMCID | 2,
+ CORBA::COMPLETED_NO));
+}
+
+CORBA::Contained_ptr
+TAO_Repository_i::lookup_id (const char *search_id
+ ACE_ENV_ARG_DECL)
+ ACE_THROW_SPEC ((CORBA::SystemException))
+{
+ TAO_IFR_READ_GUARD_RETURN (CORBA::Contained::_nil ());
+
+ return this->lookup_id_i (search_id
+ ACE_ENV_ARG_PARAMETER);
+}
+
+CORBA::Contained_ptr
+TAO_Repository_i::lookup_id_i (const char *search_id
+ ACE_ENV_ARG_DECL)
+ ACE_THROW_SPEC ((CORBA::SystemException))
+{
+ if (ACE_OS::strcmp (search_id, "IDL:omg.org/CORBA/Object:1.0") == 0
+ || ACE_OS::strcmp (search_id, "IDL:omg.org/CORBA/ValueBase:1.0") == 0)
+ {
+ return CORBA::Contained::_nil ();
+ }
+
+ ACE_TString path;
+ if (this->config_->get_string_value (this->repo_ids_key_,
+ search_id,
+ path)
+ != 0)
+ {
+ return CORBA::Contained::_nil ();
+ }
+
+ ACE_Configuration_Section_Key key;
+ this->config_->expand_path (this->root_key_,
+ path,
+ key);
+
+ u_int kind = 0;
+ this->config_->get_integer_value (key,
+ "def_kind",
+ kind);
+
+ CORBA::DefinitionKind def_kind =
+ static_cast<CORBA::DefinitionKind> (kind);
+
+ CORBA::Object_var obj =
+ TAO_IFR_Service_Utils::create_objref (def_kind,
+ path.c_str (),
+ this->repo_
+ ACE_ENV_ARG_PARAMETER);
+ ACE_CHECK_RETURN (CORBA::Contained::_nil ());
+
+ return CORBA::Contained::_narrow (obj.in ()
+ ACE_ENV_ARG_PARAMETER);
+}
+
+CORBA::TypeCode_ptr
+TAO_Repository_i::get_canonical_typecode (CORBA::TypeCode_ptr tc
+ ACE_ENV_ARG_DECL)
+ ACE_THROW_SPEC ((CORBA::SystemException))
+{
+ TAO_IFR_READ_GUARD_RETURN (CORBA::TypeCode::_nil ());
+
+ return this->get_canonical_typecode_i (tc
+ ACE_ENV_ARG_PARAMETER);
+}
+
+CORBA::TypeCode_ptr
+TAO_Repository_i::get_canonical_typecode_i (CORBA::TypeCode_ptr tc
+ ACE_ENV_ARG_DECL)
+ ACE_THROW_SPEC ((CORBA::SystemException))
+{
+ CORBA::TCKind kind = tc->kind (ACE_ENV_SINGLE_ARG_PARAMETER);
+ ACE_CHECK_RETURN (CORBA::TypeCode::_nil ());
+
+ switch (kind)
+ {
+ // For all the TCKinds not covered below, no change is needed.
+ default:
+ return CORBA::TypeCode::_duplicate (tc);
+ case CORBA::tk_fixed:
+ ACE_THROW_RETURN (CORBA::NO_IMPLEMENT (), CORBA::TypeCode::_nil ());
+ case CORBA::tk_array:
+ {
+ CORBA::ULong length = tc->length (ACE_ENV_SINGLE_ARG_PARAMETER);
+ ACE_CHECK_RETURN (CORBA::TypeCode::_nil ());
+
+ CORBA::TypeCode_var ctype = tc->content_type (ACE_ENV_SINGLE_ARG_PARAMETER);
+ ACE_CHECK_RETURN (CORBA::TypeCode::_nil ());
+
+ CORBA::TypeCode_var canon_ctype =
+ this->get_canonical_typecode_i (ctype.in ()
+ ACE_ENV_ARG_PARAMETER);
+ ACE_CHECK_RETURN (CORBA::TypeCode::_nil ());
+
+ return this->tc_factory ()->create_array_tc (length,
+ canon_ctype.in ()
+ ACE_ENV_ARG_PARAMETER);
+ }
+ case CORBA::tk_sequence:
+ {
+ CORBA::ULong length = tc->length (ACE_ENV_SINGLE_ARG_PARAMETER);
+ ACE_CHECK_RETURN (CORBA::TypeCode::_nil ());
+
+ CORBA::TypeCode_var ctype = tc->content_type (ACE_ENV_SINGLE_ARG_PARAMETER);
+ ACE_CHECK_RETURN (CORBA::TypeCode::_nil ());
+
+ CORBA::TypeCode_var canon_ctype =
+ this->get_canonical_typecode_i (ctype.in ()
+ ACE_ENV_ARG_PARAMETER);
+ ACE_CHECK_RETURN (CORBA::TypeCode::_nil ());
+
+ return this->tc_factory ()->create_sequence_tc (length,
+ canon_ctype.in ()
+ ACE_ENV_ARG_PARAMETER);
+ }
+ case CORBA::tk_alias:
+ case CORBA::tk_objref:
+ case CORBA::tk_struct:
+ case CORBA::tk_union:
+ case CORBA::tk_enum:
+ case CORBA::tk_except:
+ case CORBA::tk_value:
+ case CORBA::tk_value_box:
+ case CORBA::tk_native:
+ case CORBA::tk_abstract_interface:
+ case CORBA::tk_component:
+ case CORBA::tk_home:
+ {
+ CORBA::String_var id = tc->id (ACE_ENV_SINGLE_ARG_PARAMETER);
+ ACE_CHECK_RETURN (CORBA::TypeCode::_nil ());
+
+ ACE_TString path;
+ int status =
+ this->config ()->get_string_value (this->repo_ids_key (),
+ id.in (),
+ path);
+
+ // TODO - something in case the repo id is an empty string,
+ // or if it is not found in this repository
+ if (status != 0)
+ {
+ return CORBA::TypeCode::_nil ();
+ }
+
+ ACE_Configuration_Section_Key key;
+ this->config ()->expand_path (this->root_key (),
+ path,
+ key,
+ 0);
+
+ // An ExceptionDef is not an IDLType.
+ if (kind == CORBA::tk_except)
+ {
+ TAO_ExceptionDef_i impl (this->repo_);
+ impl.section_key (key);
+ return impl.type_i (ACE_ENV_SINGLE_ARG_PARAMETER);
+ }
+ else
+ {
+ TAO_IDLType_i *impl =
+ TAO_IFR_Service_Utils::path_to_idltype (path,
+ this);
+ impl->section_key (key);
+ return impl->type_i (ACE_ENV_SINGLE_ARG_PARAMETER);
+ }
+ }
+ }
+}
+
+CORBA::PrimitiveDef_ptr
+TAO_Repository_i::get_primitive (CORBA::PrimitiveKind kind
+ ACE_ENV_ARG_DECL)
+ ACE_THROW_SPEC ((CORBA::SystemException))
+{
+ ACE_TString obj_id ("pkinds\\");
+
+ obj_id += this->pkind_to_string (kind);
+
+ CORBA::Object_var obj =
+ TAO_IFR_Service_Utils::create_objref (CORBA::dk_Primitive,
+ obj_id.c_str (),
+ this->repo_
+ ACE_ENV_ARG_PARAMETER);
+ ACE_CHECK_RETURN (CORBA::PrimitiveDef::_nil ());
+
+ return CORBA::PrimitiveDef::_narrow (obj.in ()
+ ACE_ENV_ARG_PARAMETER);
+}
+
+CORBA::StringDef_ptr
+TAO_Repository_i::create_string (CORBA::ULong bound
+ ACE_ENV_ARG_DECL)
+ ACE_THROW_SPEC ((CORBA::SystemException))
+{
+ TAO_IFR_WRITE_GUARD_RETURN (CORBA::StringDef::_nil ());
+
+ return this->create_string_i (bound
+ ACE_ENV_ARG_PARAMETER);
+}
+
+CORBA::StringDef_ptr
+TAO_Repository_i::create_string_i (CORBA::ULong bound
+ ACE_ENV_ARG_DECL)
+ ACE_THROW_SPEC ((CORBA::SystemException))
+{
+ u_int count = 0;
+ this->config_->get_integer_value (this->strings_key_,
+ "count",
+ count);
+
+ char *name = TAO_IFR_Service_Utils::int_to_string (count++);
+ this->config_->set_integer_value (this->strings_key_,
+ "count",
+ count);
+
+ // Make new database entry.
+ ACE_Configuration_Section_Key new_key;
+ this->config_->open_section (this->strings_key_,
+ name,
+ 1,
+ new_key);
+
+ this->config_->set_integer_value (new_key,
+ "bound",
+ bound);
+
+ this->config_->set_integer_value (new_key,
+ "def_kind",
+ CORBA::dk_String);
+
+ this->config_->set_string_value (new_key,
+ "name",
+ name);
+
+ // Create the object reference.
+ ACE_TString obj_id ("strings\\");
+ obj_id += name;
+
+ CORBA::Object_var obj =
+ TAO_IFR_Service_Utils::create_objref (CORBA::dk_String,
+ obj_id.c_str (),
+ this->repo_
+ ACE_ENV_ARG_PARAMETER);
+ ACE_CHECK_RETURN (CORBA::StringDef::_nil ());
+
+ return CORBA::StringDef::_narrow (obj.in ()
+ ACE_ENV_ARG_PARAMETER);
+}
+
+CORBA::WstringDef_ptr
+TAO_Repository_i::create_wstring (CORBA::ULong bound
+ ACE_ENV_ARG_DECL)
+ ACE_THROW_SPEC ((CORBA::SystemException))
+{
+ TAO_IFR_WRITE_GUARD_RETURN (CORBA::WstringDef::_nil ());
+
+ return this->create_wstring_i (bound
+ ACE_ENV_ARG_PARAMETER);
+}
+
+CORBA::WstringDef_ptr
+TAO_Repository_i::create_wstring_i (CORBA::ULong bound
+ ACE_ENV_ARG_DECL)
+ ACE_THROW_SPEC ((CORBA::SystemException))
+{
+ u_int count = 0;
+ this->config_->get_integer_value (this->wstrings_key_,
+ "count",
+ count);
+
+ char *name = TAO_IFR_Service_Utils::int_to_string (count++);
+ this->config_->set_integer_value (this->wstrings_key_,
+ "count",
+ count);
+
+ // Make new database entry.
+ ACE_Configuration_Section_Key new_key;
+ this->config_->open_section (this->wstrings_key_,
+ name,
+ 1,
+ new_key);
+
+ this->config_->set_integer_value (new_key,
+ "bound",
+ bound);
+
+ this->config_->set_integer_value (new_key,
+ "def_kind",
+ CORBA::dk_Wstring);
+
+ this->config_->set_string_value (new_key,
+ "name",
+ name);
+
+ // Create the object reference.
+ ACE_TString obj_id ("wstrings\\");
+ obj_id += name;
+
+ CORBA::Object_var obj =
+ TAO_IFR_Service_Utils::create_objref (CORBA::dk_Wstring,
+ obj_id.c_str (),
+ this->repo_
+ ACE_ENV_ARG_PARAMETER);
+ ACE_CHECK_RETURN (CORBA::WstringDef::_nil ());
+
+ return CORBA::WstringDef::_narrow (obj.in ()
+ ACE_ENV_ARG_PARAMETER);
+}
+
+CORBA::SequenceDef_ptr
+TAO_Repository_i::create_sequence (CORBA::ULong bound,
+ CORBA::IDLType_ptr element_type
+ ACE_ENV_ARG_DECL)
+ ACE_THROW_SPEC ((CORBA::SystemException))
+{
+ TAO_IFR_WRITE_GUARD_RETURN (CORBA::SequenceDef::_nil ());
+
+ return this->create_sequence_i (bound,
+ element_type
+ ACE_ENV_ARG_PARAMETER);
+}
+
+CORBA::SequenceDef_ptr
+TAO_Repository_i::create_sequence_i (CORBA::ULong bound,
+ CORBA::IDLType_ptr element_type
+ ACE_ENV_ARG_DECL)
+ ACE_THROW_SPEC ((CORBA::SystemException))
+{
+ u_int count = 0;
+ this->config_->get_integer_value (this->sequences_key_,
+ "count",
+ count);
+
+ char *name = TAO_IFR_Service_Utils::int_to_string (count++);
+ this->config_->set_integer_value (this->sequences_key_,
+ "count",
+ count);
+
+ // Make new database entry.
+ ACE_Configuration_Section_Key new_key;
+ this->config_->open_section (this->sequences_key_,
+ name,
+ 1,
+ new_key);
+
+ // Set the bound attribute.
+ this->config_->set_integer_value (new_key,
+ "bound",
+ bound);
+
+ // Set the def_kind attribute.
+ this->config_->set_integer_value (new_key,
+ "def_kind",
+ CORBA::dk_Sequence);
+
+ // Set the "name" for destroy to use.
+ this->config_->set_string_value (new_key,
+ "name",
+ name);
+
+ char *element_path =
+ TAO_IFR_Service_Utils::reference_to_path (element_type);
+
+ // To get key to element type.
+ this->config_->set_string_value (new_key,
+ "element_path",
+ element_path);
+
+ // Create the object reference.
+ ACE_TString obj_id ("sequences\\");
+ obj_id += name;
+
+ CORBA::Object_var obj =
+ TAO_IFR_Service_Utils::create_objref (CORBA::dk_Sequence,
+ obj_id.c_str (),
+ this->repo_
+ ACE_ENV_ARG_PARAMETER);
+ ACE_CHECK_RETURN (CORBA::SequenceDef::_nil ());
+
+ return CORBA::SequenceDef::_narrow (obj.in ()
+ ACE_ENV_ARG_PARAMETER);
+}
+
+CORBA::ArrayDef_ptr
+TAO_Repository_i::create_array (CORBA::ULong length,
+ CORBA::IDLType_ptr element_type
+ ACE_ENV_ARG_DECL)
+ ACE_THROW_SPEC ((CORBA::SystemException))
+{
+ TAO_IFR_WRITE_GUARD_RETURN (CORBA::ArrayDef::_nil ());
+
+ return this->create_array_i (length,
+ element_type
+ ACE_ENV_ARG_PARAMETER);
+}
+
+CORBA::ArrayDef_ptr
+TAO_Repository_i::create_array_i (CORBA::ULong length,
+ CORBA::IDLType_ptr element_type
+ ACE_ENV_ARG_DECL)
+ ACE_THROW_SPEC ((CORBA::SystemException))
+{
+ u_int count = 0;
+ this->config_->get_integer_value (this->arrays_key_,
+ "count",
+ count);
+
+ char *name = TAO_IFR_Service_Utils::int_to_string (count++);
+ this->config_->set_integer_value (this->arrays_key_,
+ "count",
+ count);
+
+ // Make new database entry.
+ ACE_Configuration_Section_Key new_key;
+ this->config_->open_section (this->arrays_key_,
+ name,
+ 1,
+ new_key);
+
+ // Set the length attribute.
+ this->config_->set_integer_value (new_key,
+ "length",
+ length);
+
+ // Set the def_kind attribute.
+ this->config_->set_integer_value (new_key,
+ "def_kind",
+ CORBA::dk_Array);
+
+ // Set the "name" for destroy to use.
+ this->config_->set_string_value (new_key,
+ "name",
+ name);
+
+ char *element_path =
+ TAO_IFR_Service_Utils::reference_to_path (element_type);
+
+ // To get key to element type.
+ this->config_->set_string_value (new_key,
+ "element_path",
+ element_path);
+
+ // Create the object reference.
+ ACE_TString obj_id ("arrays\\");
+ obj_id += name;
+
+ CORBA::Object_var obj =
+ TAO_IFR_Service_Utils::create_objref (CORBA::dk_Array,
+ obj_id.c_str (),
+ this->repo_
+ ACE_ENV_ARG_PARAMETER);
+ ACE_CHECK_RETURN (CORBA::ArrayDef::_nil ());
+
+ return CORBA::ArrayDef::_narrow (obj.in ()
+ ACE_ENV_ARG_PARAMETER);
+}
+
+CORBA::FixedDef_ptr
+TAO_Repository_i::create_fixed (CORBA::UShort digits,
+ CORBA::Short scale
+ ACE_ENV_ARG_DECL)
+ ACE_THROW_SPEC ((CORBA::SystemException))
+{
+ TAO_IFR_WRITE_GUARD_RETURN (CORBA::FixedDef::_nil ());
+
+ return this->create_fixed_i (digits,
+ scale
+ ACE_ENV_ARG_PARAMETER);
+}
+
+CORBA::FixedDef_ptr
+TAO_Repository_i::create_fixed_i (CORBA::UShort /* digits */,
+ CORBA::Short /* scale */
+ ACE_ENV_ARG_DECL)
+ ACE_THROW_SPEC ((CORBA::SystemException))
+{
+ ACE_THROW_RETURN (CORBA::NO_IMPLEMENT (), CORBA::FixedDef::_nil ());
+}
+
+int
+TAO_Repository_i::repo_init (CORBA::Repository_ptr repo_ref,
+ PortableServer::POA_ptr repo_poa
+ ACE_ENV_ARG_DECL)
+{
+ this->repo_objref_ = repo_ref;
+ this->repo_poa_ = repo_poa;
+
+ // Create the appropriate lock.
+ if (OPTIONS::instance ()->enable_locking ())
+ {
+ ACE_NEW_THROW_EX (this->lock_,
+ ACE_Lock_Adapter<TAO_SYNCH_MUTEX> (),
+ CORBA::NO_MEMORY ());
+ }
+ else
+ {
+ ACE_NEW_THROW_EX (this->lock_,
+ ACE_Lock_Adapter<ACE_SYNCH_NULL_MUTEX> (),
+ CORBA::NO_MEMORY ());
+ }
+ ACE_CHECK_RETURN (-1);
+
+ // Resolve and narrow the TypeCodeFactory.
+ CORBA::Object_var object =
+ this->orb_->resolve_initial_references ("TypeCodeFactory"
+ ACE_ENV_ARG_PARAMETER);
+ ACE_CHECK_RETURN (-1);
+
+ if (!CORBA::is_nil (object.in ()))
+ {
+ this->tc_factory_ =
+ CORBA::TypeCodeFactory::_narrow (object.in ()
+ ACE_ENV_ARG_PARAMETER);
+ ACE_CHECK_RETURN (-1);
+
+ if (CORBA::is_nil (this->tc_factory_.in ()))
+ ACE_ERROR_RETURN ((
+ LM_ERROR,
+ ACE_TEXT ("Repository: TypeCodeFactory narrow failed\n")
+ ),
+ -1
+ );
+ }
+ else
+ {
+ ACE_ERROR_RETURN ((
+ LM_ERROR,
+ ACE_TEXT ("Repository: TypeCodeFactory resolve failed\n")
+ ),
+ -1
+ );
+ }
+
+ // Resolve and narrow the POACurrent object.
+ object =
+ this->orb_->resolve_initial_references ("POACurrent"
+ ACE_ENV_ARG_PARAMETER);
+ ACE_CHECK_RETURN (-1);
+
+ if (!CORBA::is_nil (object.in ()))
+ {
+ this->poa_current_ =
+ PortableServer::Current::_narrow (object.in ()
+ ACE_ENV_ARG_PARAMETER);
+ ACE_CHECK_RETURN (-1);
+
+ if (CORBA::is_nil (this->poa_current_.in ()))
+ ACE_ERROR_RETURN ((
+ LM_ERROR,
+ ACE_TEXT ("Repository: POACurrent narrow failed\n")
+ ),
+ -1
+ );
+ }
+ else
+ {
+ ACE_ERROR_RETURN ((
+ LM_ERROR,
+ ACE_TEXT ("Repository: POACurrent resolve failed\n")
+ ),
+ -1
+ );
+ }
+
+ if (this->create_sections () != 0)
+ {
+ return -1;
+ }
+
+ int status = this->create_servants_and_poas (ACE_ENV_SINGLE_ARG_PARAMETER);
+ ACE_CHECK_RETURN (-1);
+
+ if (status != 0)
+ {
+ return -1;
+ }
+
+ return 0;
+}
+
+int
+TAO_Repository_i::create_sections (void)
+{
+ this->config_->open_section (config_->root_section (),
+ "root",
+ 1, // Will create if IFR is not persistent.
+ this->root_key_);
+
+ this->config_->open_section (this->root_key_,
+ "repo_ids",
+ 1, // Will create if IFR is not persistent.
+ this->repo_ids_key_);
+
+ int status =
+ this->config_->open_section (this->root_key_,
+ "pkinds",
+ 0, // Don't create
+ this->pkinds_key_);
+
+ if (status != 0)
+ // IFR is non-persistent or is being run for the first time.
+ // Must add entries for primitive kinds.
+ {
+ this->config_->open_section (this->root_key_,
+ "pkinds",
+ 1, // It doesn't exist so create it.
+ this->pkinds_key_);
+
+ u_int num_pkinds = this->num_pkinds ();
+
+ for (u_int i = 0; i < num_pkinds; ++i)
+ {
+ ACE_Configuration_Section_Key key;
+ CORBA::PrimitiveKind pkind = static_cast<CORBA::PrimitiveKind> (i);
+
+ this->config_->open_section (this->pkinds_key_,
+ this->pkind_to_string (pkind),
+ 1,
+ key);
+
+ this->config_->set_integer_value (key,
+ "def_kind",
+ CORBA::dk_Primitive);
+
+ this->config_->set_integer_value (key,
+ "pkind",
+ i);
+
+ }
+ }
+
+ this->config_->open_section (this->root_key_,
+ "strings",
+ 1,
+ this->strings_key_);
+
+ this->config_->open_section (this->root_key_,
+ "wstrings",
+ 1,
+ this->wstrings_key_);
+
+ this->config_->open_section (this->root_key_,
+ "fixeds",
+ 1,
+ this->fixeds_key_);
+
+ this->config_->open_section (this->root_key_,
+ "arrays",
+ 1,
+ this->arrays_key_);
+
+ this->config_->open_section (this->root_key_,
+ "sequences",
+ 1,
+ this->sequences_key_);
+
+ u_int count = 0;
+
+ // If repository is not persistent, we need to set all
+ // the "count" fields to 0. We test just one for existence.
+ status =
+ this->config_->get_integer_value (this->strings_key_,
+ "count",
+ count);
+
+ if (status == -1) // Field "count" does not exist.
+ {
+ this->config_->set_integer_value (this->strings_key_,
+ "count",
+ 0);
+
+ this->config_->set_integer_value (this->wstrings_key_,
+ "count",
+ 0);
+
+ this->config_->set_integer_value (this->fixeds_key_,
+ "count",
+ 0);
+
+ this->config_->set_integer_value (this->arrays_key_,
+ "count",
+ 0);
+
+ this->config_->set_integer_value (this->sequences_key_,
+ "count",
+ 0);
+ }
+
+ // The following are done because we are also a Container.
+ this->repo_ = this;
+ this->section_key_ = this->root_key_;
+
+ this->config_->set_string_value (this->section_key_,
+ "absolute_name",
+ "");
+
+ this->config_->set_string_value (this->section_key_,
+ "id",
+ ""); // required by spec
+
+ this->config_->set_string_value (this->section_key_,
+ "name",
+ "");
+
+ this->config_->set_integer_value (this->section_key_,
+ "def_kind",
+ CORBA::dk_Repository);
+
+ return 0;
+}
+
+int
+TAO_Repository_i::create_servants_and_poas (ACE_ENV_SINGLE_ARG_DECL)
+{
+ CORBA::PolicyList policies (5);
+ policies.length (5);
+
+ // ID Assignment Policy.
+ policies[0] =
+ this->root_poa_->create_id_assignment_policy (PortableServer::USER_ID
+ ACE_ENV_ARG_PARAMETER);
+ ACE_CHECK_RETURN (-1);
+
+ // Lifespan Policy.
+ policies[1] =
+ this->root_poa_->create_lifespan_policy (PortableServer::PERSISTENT
+ ACE_ENV_ARG_PARAMETER);
+ ACE_CHECK_RETURN (-1);
+
+ // Request Processing Policy.
+ policies[2] =
+ this->root_poa_->create_request_processing_policy (
+ PortableServer::USE_DEFAULT_SERVANT
+ ACE_ENV_ARG_PARAMETER
+ );
+ ACE_CHECK_RETURN (-1);
+
+ // Servant Retention Policy.
+ policies[3] =
+ this->root_poa_->create_servant_retention_policy (
+ PortableServer::NON_RETAIN
+ ACE_ENV_ARG_PARAMETER
+ );
+ ACE_CHECK_RETURN (-1);
+
+ // Id Uniqueness Policy.
+ policies[4] =
+ this->root_poa_->create_id_uniqueness_policy (
+ PortableServer::MULTIPLE_ID
+ ACE_ENV_ARG_PARAMETER
+ );
+ ACE_CHECK_RETURN (-1);
+
+ PortableServer::POAManager_var poa_manager =
+ this->root_poa_->the_POAManager (ACE_ENV_SINGLE_ARG_PARAMETER);
+ ACE_CHECK_RETURN (-1);
+
+#define GEN_IR_OBJECT(name) \
+ this-> name ## _poa_ = \
+ this->root_poa_->create_POA (#name "_poa", \
+ poa_manager.in (), \
+ policies \
+ ACE_ENV_ARG_PARAMETER); \
+ ACE_CHECK_RETURN (-1); \
+ TAO_ ## name ## _i * name ## _impl = 0; \
+ ACE_NEW_RETURN (name ## _impl, \
+ TAO_ ## name ## _i (this), \
+ -1); \
+ ACE_NEW_RETURN (this-> name ## _servant_, \
+ POA_CORBA:: name ## _tie<TAO_ ## name ## _i> ( \
+ name ## _impl, \
+ this-> name ## _poa_.in (), \
+ 1 \
+ ), \
+ -1); \
+ PortableServer::ServantBase_var name ## _safety ( \
+ this-> name ## _servant_ \
+ ); \
+ this-> name ## _poa_->set_servant (this-> name ## _servant_ \
+ ACE_ENV_ARG_PARAMETER); \
+ ACE_CHECK_RETURN (-1);
+
+ CONCRETE_IR_OBJECT_TYPES
+
+#undef GEN_IR_OBJECT
+#undef CONCRETE_IR_OBJECT_TYPES
+
+ CORBA::ULong length = policies.length ();
+
+ for (CORBA::ULong i = 0; i < length; ++i)
+ {
+ CORBA::Policy_ptr policy = policies[i];
+ policy->destroy (ACE_ENV_SINGLE_ARG_PARAMETER);
+ ACE_CHECK_RETURN (-1);
+ }
+
+ return 0;
+}
+
+TAO_IDLType_i *
+TAO_Repository_i::select_idltype (CORBA::DefinitionKind def_kind) const
+{
+ switch (def_kind)
+ {
+ case CORBA::dk_AbstractInterface:
+ return this->ExtAbstractInterfaceDef_servant_->_tied_object ();
+ case CORBA::dk_Alias:
+ return this->AliasDef_servant_->_tied_object ();
+ case CORBA::dk_Array:
+ return this->ArrayDef_servant_->_tied_object ();
+ case CORBA::dk_Enum:
+ return this->EnumDef_servant_->_tied_object ();
+ case CORBA::dk_Fixed:
+ return this->FixedDef_servant_->_tied_object ();
+ case CORBA::dk_Interface:
+ return this->ExtInterfaceDef_servant_->_tied_object ();
+ case CORBA::dk_LocalInterface:
+ return this->ExtLocalInterfaceDef_servant_->_tied_object ();
+ case CORBA::dk_Native:
+ return this->NativeDef_servant_->_tied_object ();
+ case CORBA::dk_Primitive:
+ return this->PrimitiveDef_servant_->_tied_object ();
+ case CORBA::dk_Sequence:
+ return this->SequenceDef_servant_->_tied_object ();
+ case CORBA::dk_String:
+ return this->StringDef_servant_->_tied_object ();
+ case CORBA::dk_Struct:
+ return this->StructDef_servant_->_tied_object ();
+ case CORBA::dk_Union:
+ return this->UnionDef_servant_->_tied_object ();
+ case CORBA::dk_ValueBox:
+ return this->ValueBoxDef_servant_->_tied_object ();
+ case CORBA::dk_Value:
+ return this->ExtValueDef_servant_->_tied_object ();
+ case CORBA::dk_Wstring:
+ return this->WstringDef_servant_->_tied_object ();
+ default:
+ return 0;
+ }
+}
+
+TAO_Container_i *
+TAO_Repository_i::select_container (CORBA::DefinitionKind def_kind) const
+{
+ switch (def_kind)
+ {
+ case CORBA::dk_AbstractInterface:
+ return this->ExtAbstractInterfaceDef_servant_->_tied_object ();
+ case CORBA::dk_Exception:
+ return this->ExceptionDef_servant_->_tied_object ();
+ case CORBA::dk_Interface:
+ return this->ExtInterfaceDef_servant_->_tied_object ();
+ case CORBA::dk_LocalInterface:
+ return this->ExtLocalInterfaceDef_servant_->_tied_object ();
+ case CORBA::dk_Repository:
+ return const_cast<TAO_Repository_i *> (this);
+ case CORBA::dk_Struct:
+ return this->StructDef_servant_->_tied_object ();
+ case CORBA::dk_Union:
+ return this->UnionDef_servant_->_tied_object ();
+ case CORBA::dk_Value:
+ return this->ExtValueDef_servant_->_tied_object ();
+ default:
+ return 0;
+ }
+}
+
+TAO_Contained_i *
+TAO_Repository_i::select_contained (CORBA::DefinitionKind def_kind) const
+{
+ switch (def_kind)
+ {
+ case CORBA::dk_AbstractInterface:
+ return this->ExtAbstractInterfaceDef_servant_->_tied_object ();
+ case CORBA::dk_Alias:
+ return this->AliasDef_servant_->_tied_object ();
+ case CORBA::dk_Attribute:
+ return this->AttributeDef_servant_->_tied_object ();
+ case CORBA::dk_Constant:
+ return this->ConstantDef_servant_->_tied_object ();
+ case CORBA::dk_Enum:
+ return this->EnumDef_servant_->_tied_object ();
+ case CORBA::dk_Exception:
+ return this->ExceptionDef_servant_->_tied_object ();
+ case CORBA::dk_Interface:
+ return this->ExtInterfaceDef_servant_->_tied_object ();
+ case CORBA::dk_LocalInterface:
+ return this->ExtLocalInterfaceDef_servant_->_tied_object ();
+ case CORBA::dk_Native:
+ return this->NativeDef_servant_->_tied_object ();
+ case CORBA::dk_Operation:
+ return this->OperationDef_servant_->_tied_object ();
+ case CORBA::dk_Struct:
+ return this->StructDef_servant_->_tied_object ();
+ case CORBA::dk_Union:
+ return this->UnionDef_servant_->_tied_object ();
+ case CORBA::dk_ValueBox:
+ return this->ValueBoxDef_servant_->_tied_object ();
+ case CORBA::dk_Value:
+ return this->ExtValueDef_servant_->_tied_object ();
+ case CORBA::dk_ValueMember:
+ return this->ValueMemberDef_servant_->_tied_object ();
+ default:
+ return 0;
+ }
+}
+
+PortableServer::POA_ptr
+TAO_Repository_i::select_poa (CORBA::DefinitionKind def_kind) const
+{
+ switch (def_kind)
+ {
+ case CORBA::dk_AbstractInterface:
+ return this->ExtAbstractInterfaceDef_poa_.in ();
+ case CORBA::dk_Alias:
+ return this->AliasDef_poa_.in ();
+ case CORBA::dk_Array:
+ return this->ArrayDef_poa_.in ();
+ case CORBA::dk_Attribute:
+ return this->AttributeDef_poa_.in ();
+ case CORBA::dk_Constant:
+ return this->ConstantDef_poa_.in ();
+ case CORBA::dk_Enum:
+ return this->EnumDef_poa_.in ();
+ case CORBA::dk_Exception:
+ return this->ExceptionDef_poa_.in ();
+ case CORBA::dk_Fixed:
+ return this->FixedDef_poa_.in ();
+ case CORBA::dk_Interface:
+ return this->ExtInterfaceDef_poa_.in ();
+ case CORBA::dk_LocalInterface:
+ return this->ExtLocalInterfaceDef_poa_.in ();
+ case CORBA::dk_Native:
+ return this->NativeDef_poa_.in ();
+ case CORBA::dk_Operation:
+ return this->OperationDef_poa_.in ();
+ case CORBA::dk_Primitive:
+ return this->PrimitiveDef_poa_.in ();
+ case CORBA::dk_Sequence:
+ return this->SequenceDef_poa_.in ();
+ case CORBA::dk_String:
+ return this->StringDef_poa_.in ();
+ case CORBA::dk_Struct:
+ return this->StructDef_poa_.in ();
+ case CORBA::dk_Union:
+ return this->UnionDef_poa_.in ();
+ case CORBA::dk_ValueBox:
+ return this->ValueBoxDef_poa_.in ();
+ case CORBA::dk_Value:
+ return this->ExtValueDef_poa_.in ();
+ case CORBA::dk_ValueMember:
+ return this->ValueMemberDef_poa_.in ();
+ case CORBA::dk_Wstring:
+ return this->WstringDef_poa_.in ();
+ default:
+ return PortableServer::POA::_nil ();
+ }
+}
+
+PortableServer::Current_ptr
+TAO_Repository_i::poa_current (void) const
+{
+ return this->poa_current_.in ();
+}
+
+ACE_Configuration *
+TAO_Repository_i::config (void) const
+{
+ return this->config_;
+}
+
+CORBA::TypeCodeFactory_ptr
+TAO_Repository_i::tc_factory (void) const
+{
+ return this->tc_factory_.in ();
+}
+
+CORBA::Repository_ptr
+TAO_Repository_i::repo_objref (void) const
+{
+ return CORBA::Repository::_duplicate (this->repo_objref_.in ());
+}
+
+void
+TAO_Repository_i::repo_objref (CORBA::Repository_ptr objref)
+{
+ this->repo_objref_ = objref;
+}
+
+ACE_Configuration_Section_Key
+TAO_Repository_i::root_key (void) const
+{
+ return this->root_key_;
+}
+
+ACE_Configuration_Section_Key
+TAO_Repository_i::repo_ids_key (void) const
+{
+ return this->repo_ids_key_;
+}
+
+ACE_Configuration_Section_Key
+TAO_Repository_i::pkinds_key (void) const
+{
+ return this->pkinds_key_;
+}
+
+ACE_Configuration_Section_Key
+TAO_Repository_i::strings_key (void) const
+{
+ return this->strings_key_;
+}
+
+ACE_Configuration_Section_Key
+TAO_Repository_i::wstrings_key (void) const
+{
+ return this->wstrings_key_;
+}
+
+ACE_Configuration_Section_Key
+TAO_Repository_i::fixeds_key (void) const
+{
+ return this->fixeds_key_;
+}
+
+ACE_Configuration_Section_Key
+TAO_Repository_i::arrays_key (void) const
+{
+ return this->arrays_key_;
+}
+
+ACE_Configuration_Section_Key
+TAO_Repository_i::sequences_key (void) const
+{
+ return this->sequences_key_;
+}
+
+const char *
+TAO_Repository_i::extension (void) const
+{
+ return this->extension_.in ();
+}
+
+ACE_Lock &
+TAO_Repository_i::lock (void) const
+{
+ return *this->lock_;
+}
+
+const char * TAO_Repository_i::TAO_IFR_primitive_kinds[] =
+ {
+ "pk_null",
+ "pk_void",
+ "pk_short",
+ "pk_long",
+ "pk_ushort",
+ "pk_ulong",
+ "pk_float",
+ "pk_double",
+ "pk_boolean",
+ "pk_char",
+ "pk_octet",
+ "pk_any",
+ "pk_TypeCode",
+ "pk_Principal",
+ "pk_string",
+ "pk_objref",
+ "pk_longlong",
+ "pk_ulonglong",
+ "pk_longdouble",
+ "pk_wchar",
+ "pk_wstring",
+ "pk_value_base"
+ };
+
+const char *
+TAO_Repository_i::pkind_to_string (CORBA::PrimitiveKind pkind) const
+{
+ return TAO_Repository_i::TAO_IFR_primitive_kinds[pkind];
+}
+
+u_int
+TAO_Repository_i::num_pkinds (void) const
+{
+ return sizeof (TAO_Repository_i::TAO_IFR_primitive_kinds) / sizeof (char*);
+}
+
+// For debugging use only.
+void
+TAO_Repository_i::shutdown (void)
+{
+ this->orb_->shutdown (0);
+}
+
+TAO_END_VERSIONED_NAMESPACE_DECL
diff --git a/TAO/orbsvcs/orbsvcs/IFRService/Repository_i.h b/TAO/orbsvcs/orbsvcs/IFRService/Repository_i.h
new file mode 100644
index 00000000000..06cbfdc2360
--- /dev/null
+++ b/TAO/orbsvcs/orbsvcs/IFRService/Repository_i.h
@@ -0,0 +1,386 @@
+// -*- C++ -*-
+
+// $Id$
+
+// ============================================================================
+//
+// = LIBRARY
+// TAO/orbsvcs/orbsvcs/IFRService
+//
+// = FILENAME
+// Repository_i.h
+//
+// = DESCRIPTION
+// Repository servant class.
+//
+// = AUTHOR
+// Jeff Parsons <parsons@cs.wustl.edu>
+//
+// ============================================================================
+
+#ifndef REPOSITORY_I_H
+#define REPOSITORY_I_H
+
+#include "orbsvcs/IFRService/Container_i.h"
+#include "orbsvcs/IFRService/ifr_service_export.h"
+
+#if !defined (ACE_LACKS_PRAGMA_ONCE)
+# pragma once
+#endif /* ACE_LACKS_PRAGMA_ONCE */
+
+#if defined(_MSC_VER)
+#pragma warning(push)
+#pragma warning(disable:4250)
+#endif /* _MSC_VER */
+
+#include "orbsvcs/IFRService/IFR_macro.h"
+#include "tao/TypeCodeFactory/TypeCodeFactory_Loader.h"
+#include "tao/CORBA_String.h"
+
+TAO_BEGIN_VERSIONED_NAMESPACE_DECL
+
+class IFR_Servant_Factory;
+
+class TAO_IDLType_i;
+class TAO_Container_i;
+class TAO_Contained_i;
+class TAO_ExtAbstractInterfaceDef_i;
+class TAO_AliasDef_i;
+class TAO_ArrayDef_i;
+class TAO_AttributeDef_i;
+class TAO_ConstantDef_i;
+class TAO_EnumDef_i;
+class TAO_ExceptionDef_i;
+class TAO_FixedDef_i;
+class TAO_ExtInterfaceDef_i;
+class TAO_ExtLocalInterfaceDef_i;
+class TAO_NativeDef_i;
+class TAO_OperationDef_i;
+class TAO_PrimitiveDef_i;
+class TAO_SequenceDef_i;
+class TAO_StringDef_i;
+class TAO_StructDef_i;
+class TAO_UnionDef_i;
+class TAO_ValueBoxDef_i;
+class TAO_ExtValueDef_i;
+class TAO_ValueMemberDef_i;
+class TAO_WstringDef_i;
+
+class TAO_IFRService_Export TAO_Repository_i : public virtual TAO_Container_i
+{
+ // = TITLE
+ // TAO_Repository_i
+ //
+ // = DESCRIPTION
+ // Provides global access to the Interface Repository, but
+ // does not support access to information related to
+ // CORBA Components.
+ //
+public:
+ TAO_Repository_i (CORBA::ORB_ptr orb,
+ PortableServer::POA_ptr poa,
+ ACE_Configuration *config);
+
+ virtual ~TAO_Repository_i (void);
+
+ virtual CORBA::DefinitionKind def_kind (
+ ACE_ENV_SINGLE_ARG_DECL_WITH_DEFAULTS
+ )
+ ACE_THROW_SPEC ((CORBA::SystemException));
+ // Accessor for the readonly attribute.
+
+ virtual void destroy (
+ ACE_ENV_SINGLE_ARG_DECL_WITH_DEFAULTS
+ )
+ ACE_THROW_SPEC ((CORBA::SystemException));
+ // May not be called on a repository - raises BAD_INV_ORDER.
+
+ virtual CORBA::Contained_ptr lookup_id (
+ const char *search_id
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS
+ )
+ ACE_THROW_SPEC ((CORBA::SystemException));
+
+ CORBA::Contained_ptr lookup_id_i (
+ const char *search_id
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS
+ )
+ ACE_THROW_SPEC ((CORBA::SystemException));
+
+ virtual CORBA::TypeCode_ptr get_canonical_typecode (
+ CORBA::TypeCode_ptr tc
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS
+ )
+ ACE_THROW_SPEC ((CORBA::SystemException));
+
+ CORBA::TypeCode_ptr get_canonical_typecode_i (
+ CORBA::TypeCode_ptr tc
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS
+ )
+ ACE_THROW_SPEC ((CORBA::SystemException));
+
+ virtual CORBA::PrimitiveDef_ptr get_primitive (
+ CORBA::PrimitiveKind kind
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS
+ )
+ ACE_THROW_SPEC ((CORBA::SystemException));
+ // No locking necessary because the database is not
+ // accessed.
+
+ virtual CORBA::StringDef_ptr create_string (
+ CORBA::ULong bound
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS
+ )
+ ACE_THROW_SPEC ((CORBA::SystemException));
+
+ CORBA::StringDef_ptr create_string_i (
+ CORBA::ULong bound
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS)
+
+ ACE_THROW_SPEC ((CORBA::SystemException));
+
+ virtual CORBA::WstringDef_ptr create_wstring (
+ CORBA::ULong bound
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS
+ )
+ ACE_THROW_SPEC ((CORBA::SystemException));
+
+ CORBA::WstringDef_ptr create_wstring_i (
+ CORBA::ULong bound
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS
+ )
+ ACE_THROW_SPEC ((CORBA::SystemException));
+
+ virtual CORBA::SequenceDef_ptr create_sequence (
+ CORBA::ULong bound,
+ CORBA::IDLType_ptr element_type
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS
+ )
+ ACE_THROW_SPEC (( CORBA::SystemException));
+
+ CORBA::SequenceDef_ptr create_sequence_i (
+ CORBA::ULong bound,
+ CORBA::IDLType_ptr element_type
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS
+ )
+ ACE_THROW_SPEC (( CORBA::SystemException));
+
+ virtual CORBA::ArrayDef_ptr create_array (
+ CORBA::ULong length,
+ CORBA::IDLType_ptr element_type
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS
+ )
+ ACE_THROW_SPEC ((CORBA::SystemException));
+
+ CORBA::ArrayDef_ptr create_array_i (
+ CORBA::ULong length,
+ CORBA::IDLType_ptr element_type
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS
+ )
+ ACE_THROW_SPEC ((CORBA::SystemException));
+
+ virtual CORBA::FixedDef_ptr create_fixed (
+ CORBA::UShort digits,
+ CORBA::Short scale
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS
+ )
+ ACE_THROW_SPEC ((CORBA::SystemException));
+
+ CORBA::FixedDef_ptr create_fixed_i (
+ CORBA::UShort digits,
+ CORBA::Short scale
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS
+ )
+ ACE_THROW_SPEC ((CORBA::SystemException));
+
+ int repo_init (CORBA::Repository_ptr repo_ref,
+ PortableServer::POA_ptr repo_poa
+ ACE_ENV_ARG_DECL);
+ // Called at startup to get everything initialized.
+
+ virtual int create_servants_and_poas (ACE_ENV_SINGLE_ARG_DECL);
+ // We create a default servant servant for each IR Object
+ // type and its corresponding POA.
+
+ int create_sections (void);
+ // Create the top-level ACE_Configuration sections.
+
+ virtual TAO_IDLType_i *select_idltype (
+ CORBA::DefinitionKind def_kind
+ ) const;
+ virtual TAO_Container_i *select_container (
+ CORBA::DefinitionKind def_kind
+ ) const;
+ virtual TAO_Contained_i *select_contained (
+ CORBA::DefinitionKind def_kind
+ ) const;
+ // Return one of our servants for internal use.
+
+ virtual PortableServer::POA_ptr select_poa (
+ CORBA::DefinitionKind def_kind
+ ) const;
+ // Select the right POA for object creation.
+
+ PortableServer::Current_ptr poa_current (void) const;
+ // Accessor for the POA that is dispatching the current call.
+
+ ACE_Configuration *config (void) const;
+ // Accessor for the ACE_Configuration database.
+
+ CORBA::TypeCodeFactory_ptr tc_factory (void) const;
+ // Accessor for the Typecode factory.
+
+ CORBA::Repository_ptr repo_objref (void) const;
+ void repo_objref (CORBA::Repository_ptr objref);
+ // Accessor/mutator for our object reference.
+
+ ACE_Configuration_Section_Key root_key (void) const;
+ // Accessor for the root key for all IR objects.
+
+ ACE_Configuration_Section_Key repo_ids_key (void) const;
+ // Accessor for the repository ids root key.
+
+ ACE_Configuration_Section_Key pkinds_key (void) const;
+ // Accessor for the primitive kinds section.
+
+ ACE_Configuration_Section_Key strings_key (void) const;
+ // Accessor for the bounded strings section.
+
+ ACE_Configuration_Section_Key wstrings_key (void) const;
+ // Accessor for the bounded wstrings section.
+
+ ACE_Configuration_Section_Key fixeds_key (void) const;
+ // Accessor for the fixed types section.
+
+ ACE_Configuration_Section_Key arrays_key (void) const;
+ // Accessor for the anonymous arrays section.
+
+ ACE_Configuration_Section_Key sequences_key (void) const;
+ // Accessor for the anonymous sequences section.
+
+ const char *extension (void) const;
+ // Accessor for the name extension string.
+
+ ACE_Lock &lock (void) const;
+ // Repo lock.
+
+ void shutdown (void);
+ // Used ONLY with Purify, for memory leak checking.
+ // A call to this can be temporariily appended to the
+ // destroy() method of the last thing to be destroyed
+ // by the test code.
+
+protected:
+ CORBA::ORB_ptr orb_;
+ // Reference to our ORB.
+
+ PortableServer::POA_var root_poa_;
+ // Reference to the root POA.
+
+ PortableServer::POA_var repo_poa_;
+ // Reference to the POA handling calls to this servant.
+
+ PortableServer::Current_var poa_current_;
+ // Reference to the PortableServer::Current object
+
+ ACE_Configuration *config_;
+ // Our ACE_Configuration database.
+
+ CORBA::TypeCodeFactory_var tc_factory_;
+ // Our Typecode factory.
+
+ CORBA::Repository_var repo_objref_;
+ // The object reference of this servant.
+
+ ACE_Configuration_Section_Key root_key_;
+ // Root of all IR objects.
+
+ ACE_Configuration_Section_Key repo_ids_key_;
+ // Flat section of Interface Repository ids.
+
+ ACE_Configuration_Section_Key pkinds_key_;
+ // Section holding the primitive kinds.
+
+ ACE_Configuration_Section_Key strings_key_;
+ // Section holding the bounded strings.
+
+ ACE_Configuration_Section_Key wstrings_key_;
+ // Section holding the bounded wstrings.
+
+ ACE_Configuration_Section_Key fixeds_key_;
+ // Section holding the fixed types.
+
+ ACE_Configuration_Section_Key arrays_key_;
+ // Section holding the anonymous arrays.
+
+ ACE_Configuration_Section_Key sequences_key_;
+ // Section holding the anonymous sequences.
+
+ CORBA::String_var extension_;
+ // Added to names temporarily to avoid name clashes.
+
+ ACE_Lock *lock_;
+ // Lock.
+
+ // Define a POA for each IR Object type, and a corresponding
+ // default servant.
+
+#ifdef CONCRETE_IR_OBJECT_TYPES
+#undef CONCRETE_IR_OBJECT_TYPES
+#endif
+
+#ifdef GEN_IR_OBJECT
+#undef GEN_IR_OBJECT
+#endif
+
+#define CONCRETE_IR_OBJECT_TYPES \
+ GEN_IR_OBJECT (ExtAbstractInterfaceDef) \
+ GEN_IR_OBJECT (AliasDef) \
+ GEN_IR_OBJECT (ArrayDef) \
+ GEN_IR_OBJECT (AttributeDef) \
+ GEN_IR_OBJECT (ConstantDef) \
+ GEN_IR_OBJECT (EnumDef) \
+ GEN_IR_OBJECT (ExceptionDef) \
+ GEN_IR_OBJECT (FixedDef) \
+ GEN_IR_OBJECT (ExtInterfaceDef) \
+ GEN_IR_OBJECT (ExtLocalInterfaceDef) \
+ GEN_IR_OBJECT (NativeDef) \
+ GEN_IR_OBJECT (OperationDef) \
+ GEN_IR_OBJECT (PrimitiveDef) \
+ GEN_IR_OBJECT (SequenceDef) \
+ GEN_IR_OBJECT (StringDef) \
+ GEN_IR_OBJECT (StructDef) \
+ GEN_IR_OBJECT (UnionDef) \
+ GEN_IR_OBJECT (ValueBoxDef) \
+ GEN_IR_OBJECT (ExtValueDef) \
+ GEN_IR_OBJECT (ValueMemberDef) \
+ GEN_IR_OBJECT (WstringDef)
+
+#define GEN_IR_OBJECT(name) \
+ POA_CORBA:: name ## _tie<TAO_ ## name ## _i> * name ## _servant_; \
+ PortableServer::POA_var name ## _poa_;
+
+ CONCRETE_IR_OBJECT_TYPES
+
+#undef GEN_IR_OBJECT
+
+private:
+ static const char * TAO_IFR_primitive_kinds[];
+ // Set of strings corresponding to the CORBA::PrimitiveKind
+ // enum values.
+
+ const char *pkind_to_string (CORBA::PrimitiveKind pkind) const;
+ // Convert the enum value to the equivalent string.
+
+ u_int num_pkinds (void) const;
+ // Return the number of entries in the CORBA::PrimitiveKind enum.
+
+};
+
+TAO_END_VERSIONED_NAMESPACE_DECL
+
+#if defined(_MSC_VER)
+#pragma warning(pop)
+#endif /* _MSC_VER */
+
+#endif /* TAO_REPOSITORY_I_H */
diff --git a/TAO/orbsvcs/orbsvcs/IFRService/SequenceDef_i.cpp b/TAO/orbsvcs/orbsvcs/IFRService/SequenceDef_i.cpp
new file mode 100644
index 00000000000..5f7465b47fe
--- /dev/null
+++ b/TAO/orbsvcs/orbsvcs/IFRService/SequenceDef_i.cpp
@@ -0,0 +1,269 @@
+// $Id$
+
+#include "orbsvcs/IFRService/SequenceDef_i.h"
+#include "orbsvcs/IFRService/Repository_i.h"
+#include "orbsvcs/IFRService/IFR_Service_Utils.h"
+
+#include "ace/Auto_Ptr.h"
+#include "ace/SString.h"
+
+
+ACE_RCSID (IFRService,
+ SequenceDef_i,
+ "$Id$")
+
+TAO_BEGIN_VERSIONED_NAMESPACE_DECL
+
+TAO_SequenceDef_i::TAO_SequenceDef_i (
+ TAO_Repository_i *repo
+ )
+ : TAO_IRObject_i (repo),
+ TAO_IDLType_i (repo)
+{
+}
+
+TAO_SequenceDef_i::~TAO_SequenceDef_i (void)
+{
+}
+
+CORBA::DefinitionKind
+TAO_SequenceDef_i::def_kind (ACE_ENV_SINGLE_ARG_DECL_NOT_USED)
+ ACE_THROW_SPEC ((CORBA::SystemException))
+{
+ return CORBA::dk_Sequence;
+}
+
+void
+TAO_SequenceDef_i::destroy (ACE_ENV_SINGLE_ARG_DECL)
+ ACE_THROW_SPEC ((CORBA::SystemException))
+{
+ TAO_IFR_WRITE_GUARD;
+
+ this->update_key (ACE_ENV_SINGLE_ARG_PARAMETER);
+ ACE_CHECK;
+
+ this->destroy_i (ACE_ENV_SINGLE_ARG_PARAMETER);
+}
+
+void
+TAO_SequenceDef_i::destroy_i (ACE_ENV_SINGLE_ARG_DECL)
+ ACE_THROW_SPEC ((CORBA::SystemException))
+{
+ // Only if it is (w)string, fixed, array or sequence.
+ this->destroy_element_type (ACE_ENV_SINGLE_ARG_PARAMETER);
+ ACE_CHECK;
+
+ ACE_TString name;
+ this->repo_->config ()->get_string_value (this->section_key_,
+ "name",
+ name);
+
+ this->repo_->config ()->remove_section (this->repo_->sequences_key (),
+ name.c_str (),
+ 0);
+}
+
+CORBA::TypeCode_ptr
+TAO_SequenceDef_i::type (ACE_ENV_SINGLE_ARG_DECL)
+ ACE_THROW_SPEC ((CORBA::SystemException))
+{
+ TAO_IFR_READ_GUARD_RETURN (CORBA::TypeCode::_nil ());
+
+ this->update_key (ACE_ENV_SINGLE_ARG_PARAMETER);
+ ACE_CHECK_RETURN (CORBA::TypeCode::_nil ());
+
+ return this->type_i (ACE_ENV_SINGLE_ARG_PARAMETER);
+}
+
+CORBA::TypeCode_ptr
+TAO_SequenceDef_i::type_i (ACE_ENV_SINGLE_ARG_DECL)
+ ACE_THROW_SPEC ((CORBA::SystemException))
+{
+ CORBA::TypeCode_var element_typecode =
+ this->element_type_i (ACE_ENV_SINGLE_ARG_PARAMETER);
+ ACE_CHECK_RETURN (CORBA::TypeCode::_nil ());
+
+ CORBA::ULong bound = this->bound_i (ACE_ENV_SINGLE_ARG_PARAMETER);
+ ACE_CHECK_RETURN (CORBA::TypeCode::_nil ());
+
+ return this->repo_->tc_factory ()->create_sequence_tc (
+ bound,
+ element_typecode.in ()
+ ACE_ENV_ARG_PARAMETER
+ );
+}
+
+CORBA::ULong
+TAO_SequenceDef_i::bound (ACE_ENV_SINGLE_ARG_DECL)
+ ACE_THROW_SPEC ((CORBA::SystemException))
+{
+ TAO_IFR_READ_GUARD_RETURN (0);
+
+ this->update_key (ACE_ENV_SINGLE_ARG_PARAMETER);
+ ACE_CHECK_RETURN (0);
+
+ return this->bound_i (ACE_ENV_SINGLE_ARG_PARAMETER);
+}
+
+CORBA::ULong
+TAO_SequenceDef_i::bound_i (ACE_ENV_SINGLE_ARG_DECL_NOT_USED)
+ ACE_THROW_SPEC ((CORBA::SystemException))
+{
+ u_int bound = 0;
+ this->repo_->config ()->get_integer_value (this->section_key_,
+ "bound",
+ bound);
+
+ return static_cast<CORBA::ULong> (bound);
+}
+
+void
+TAO_SequenceDef_i::bound (CORBA::ULong bound
+ ACE_ENV_ARG_DECL)
+ ACE_THROW_SPEC ((CORBA::SystemException))
+{
+ TAO_IFR_WRITE_GUARD;
+
+ this->bound_i (bound
+ ACE_ENV_ARG_PARAMETER);
+}
+
+void
+TAO_SequenceDef_i::bound_i (CORBA::ULong bound
+ ACE_ENV_ARG_DECL_NOT_USED)
+ ACE_THROW_SPEC ((CORBA::SystemException))
+{
+ this->repo_->config ()->set_integer_value (this->section_key_,
+ "bound",
+ bound);
+}
+
+CORBA::TypeCode_ptr
+TAO_SequenceDef_i::element_type (ACE_ENV_SINGLE_ARG_DECL)
+ ACE_THROW_SPEC ((CORBA::SystemException))
+{
+ TAO_IFR_READ_GUARD_RETURN (CORBA::TypeCode::_nil ());
+
+ this->update_key (ACE_ENV_SINGLE_ARG_PARAMETER);
+ ACE_CHECK_RETURN (CORBA::TypeCode::_nil ());
+
+ return this->element_type_i (ACE_ENV_SINGLE_ARG_PARAMETER);
+}
+
+CORBA::TypeCode_ptr
+TAO_SequenceDef_i::element_type_i (ACE_ENV_SINGLE_ARG_DECL)
+ ACE_THROW_SPEC ((CORBA::SystemException))
+{
+ ACE_TString element_path;
+ this->repo_->config ()->get_string_value (this->section_key_,
+ "element_path",
+ element_path);
+
+ TAO_IDLType_i *impl =
+ TAO_IFR_Service_Utils::path_to_idltype (element_path,
+ this->repo_);
+
+ return impl->type_i (ACE_ENV_SINGLE_ARG_PARAMETER);
+}
+
+CORBA::IDLType_ptr
+TAO_SequenceDef_i::element_type_def (ACE_ENV_SINGLE_ARG_DECL)
+ ACE_THROW_SPEC ((CORBA::SystemException))
+{
+ TAO_IFR_READ_GUARD_RETURN (CORBA::IDLType::_nil ());
+
+ this->update_key (ACE_ENV_SINGLE_ARG_PARAMETER);
+ ACE_CHECK_RETURN (CORBA::IDLType::_nil ());
+
+ return this->element_type_def_i (ACE_ENV_SINGLE_ARG_PARAMETER);
+}
+
+CORBA::IDLType_ptr
+TAO_SequenceDef_i::element_type_def_i (ACE_ENV_SINGLE_ARG_DECL)
+ ACE_THROW_SPEC ((CORBA::SystemException))
+{
+ ACE_TString element_path;
+ this->repo_->config ()->get_string_value (this->section_key_,
+ "element_path",
+ element_path);
+
+ CORBA::Object_var obj =
+ TAO_IFR_Service_Utils::path_to_ir_object (element_path,
+ this->repo_
+ ACE_ENV_ARG_PARAMETER);
+ ACE_CHECK_RETURN (CORBA::IDLType::_nil ());
+
+ return CORBA::IDLType::_narrow (obj.in ()
+ ACE_ENV_ARG_PARAMETER);
+}
+
+void
+TAO_SequenceDef_i::element_type_def (CORBA::IDLType_ptr element_type_def
+ ACE_ENV_ARG_DECL)
+ ACE_THROW_SPEC ((CORBA::SystemException))
+{
+ TAO_IFR_WRITE_GUARD;
+
+ this->update_key (ACE_ENV_SINGLE_ARG_PARAMETER);
+ ACE_CHECK;
+
+ this->element_type_def_i (element_type_def
+ ACE_ENV_ARG_PARAMETER);
+}
+
+void
+TAO_SequenceDef_i::element_type_def_i (CORBA::IDLType_ptr element_type_def
+ ACE_ENV_ARG_DECL)
+ ACE_THROW_SPEC ((CORBA::SystemException))
+{
+ this->destroy_element_type (ACE_ENV_SINGLE_ARG_PARAMETER);
+ ACE_CHECK;
+
+ char *element_path =
+ TAO_IFR_Service_Utils::reference_to_path (element_type_def);
+
+ this->repo_->config ()->set_string_value (this->section_key_,
+ "element_path",
+ element_path);
+}
+
+void
+TAO_SequenceDef_i::destroy_element_type (
+ ACE_ENV_SINGLE_ARG_DECL)
+ ACE_THROW_SPEC ((CORBA::SystemException))
+{
+ ACE_TString element_path;
+ this->repo_->config ()->get_string_value (this->section_key_,
+ "element_path",
+ element_path);
+
+ CORBA::DefinitionKind def_kind =
+ TAO_IFR_Service_Utils::path_to_def_kind (element_path,
+ this->repo_);
+
+ switch (def_kind)
+ {
+ // These exist only as our elements, so the type should
+ // be destroyed when we are destroyed or our element type
+ // is mutated.
+ case CORBA::dk_String:
+ case CORBA::dk_Wstring:
+ case CORBA::dk_Fixed:
+ case CORBA::dk_Array:
+ case CORBA::dk_Sequence:
+ {
+ TAO_IDLType_i *impl =
+ TAO_IFR_Service_Utils::path_to_idltype (element_path,
+ this->repo_);
+
+ impl->destroy_i (ACE_ENV_SINGLE_ARG_PARAMETER);
+ ACE_CHECK;
+
+ break;
+ }
+ default:
+ break;
+ }
+}
+
+TAO_END_VERSIONED_NAMESPACE_DECL
diff --git a/TAO/orbsvcs/orbsvcs/IFRService/SequenceDef_i.h b/TAO/orbsvcs/orbsvcs/IFRService/SequenceDef_i.h
new file mode 100644
index 00000000000..cbed0039d88
--- /dev/null
+++ b/TAO/orbsvcs/orbsvcs/IFRService/SequenceDef_i.h
@@ -0,0 +1,150 @@
+// -*- C++ -*-
+
+// $Id$
+
+// ============================================================================
+//
+// = LIBRARY
+// TAO/orbsvcs/orbsvcs/IFRService
+//
+// = FILENAME
+// SequenceDef_i.h
+//
+// = DESCRIPTION
+// SequenceDef servant class.
+//
+// = AUTHOR
+// Jeff Parsons <parsons@cs.wustl.edu>
+//
+// ============================================================================
+
+#ifndef SEQUENCEDEF_I_H
+#define SEQUENCEDEF_I_H
+
+#include "orbsvcs/IFRService/IDLType_i.h"
+#include "orbsvcs/IFRService/ifr_service_export.h"
+
+#if !defined (ACE_LACKS_PRAGMA_ONCE)
+# pragma once
+#endif /* ACE_LACKS_PRAGMA_ONCE */
+
+#if defined(_MSC_VER)
+#pragma warning(push)
+#pragma warning(disable:4250)
+#endif /* _MSC_VER */
+
+TAO_BEGIN_VERSIONED_NAMESPACE_DECL
+
+class TAO_IFRService_Export TAO_SequenceDef_i : public virtual TAO_IDLType_i
+{
+ // = TITLE
+ // TAO_SequenceDef_i
+ //
+ // = DESCRIPTION
+ // Represents an IDL sequence type.
+ //
+public:
+ TAO_SequenceDef_i (TAO_Repository_i *repo);
+ // Constructor
+
+ virtual ~TAO_SequenceDef_i (void);
+ // Destructor
+
+ virtual CORBA::DefinitionKind def_kind (
+ ACE_ENV_SINGLE_ARG_DECL_WITH_DEFAULTS)
+
+ ACE_THROW_SPEC ((CORBA::SystemException));
+ // Return our definition kind.
+
+ virtual void destroy (
+ ACE_ENV_SINGLE_ARG_DECL_WITH_DEFAULTS)
+
+ ACE_THROW_SPEC ((CORBA::SystemException));
+ // Remove the repository entry.
+
+ virtual void destroy_i (
+ ACE_ENV_SINGLE_ARG_DECL_WITH_DEFAULTS)
+
+ ACE_THROW_SPEC ((CORBA::SystemException));
+
+ virtual CORBA::TypeCode_ptr type (
+ ACE_ENV_SINGLE_ARG_DECL_WITH_DEFAULTS)
+
+ ACE_THROW_SPEC ((CORBA::SystemException));
+ // From IDLType_i's pure virtual function.
+
+ virtual CORBA::TypeCode_ptr type_i (
+ ACE_ENV_SINGLE_ARG_DECL_WITH_DEFAULTS)
+
+ ACE_THROW_SPEC ((CORBA::SystemException));
+ // From IDLType_i's pure virtual function.
+
+ virtual CORBA::ULong bound (
+ ACE_ENV_SINGLE_ARG_DECL_WITH_DEFAULTS)
+
+ ACE_THROW_SPEC ((CORBA::SystemException));
+
+ CORBA::ULong bound_i (
+ ACE_ENV_SINGLE_ARG_DECL_WITH_DEFAULTS)
+
+ ACE_THROW_SPEC ((CORBA::SystemException));
+
+ virtual void bound (
+ CORBA::ULong bound
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS)
+
+ ACE_THROW_SPEC ((CORBA::SystemException));
+
+ void bound_i (
+ CORBA::ULong bound
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS)
+
+ ACE_THROW_SPEC ((CORBA::SystemException));
+
+ virtual CORBA::TypeCode_ptr element_type (
+ ACE_ENV_SINGLE_ARG_DECL_WITH_DEFAULTS)
+
+ ACE_THROW_SPEC ((CORBA::SystemException));
+
+ CORBA::TypeCode_ptr element_type_i (
+ ACE_ENV_SINGLE_ARG_DECL_WITH_DEFAULTS)
+
+ ACE_THROW_SPEC ((CORBA::SystemException));
+
+ virtual CORBA::IDLType_ptr element_type_def (
+ ACE_ENV_SINGLE_ARG_DECL_WITH_DEFAULTS)
+
+ ACE_THROW_SPEC ((CORBA::SystemException));
+
+ CORBA::IDLType_ptr element_type_def_i (
+ ACE_ENV_SINGLE_ARG_DECL_WITH_DEFAULTS)
+
+ ACE_THROW_SPEC ((CORBA::SystemException));
+
+ virtual void element_type_def (
+ CORBA::IDLType_ptr element_type_def
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS)
+
+ ACE_THROW_SPEC ((CORBA::SystemException));
+
+ void element_type_def_i (
+ CORBA::IDLType_ptr element_type_def
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS)
+
+ ACE_THROW_SPEC ((CORBA::SystemException));
+
+private:
+ void destroy_element_type (
+ ACE_ENV_SINGLE_ARG_DECL_WITH_DEFAULTS)
+
+ ACE_THROW_SPEC ((CORBA::SystemException));
+ // Destroys an anonymous non-primitive element type.
+};
+
+TAO_END_VERSIONED_NAMESPACE_DECL
+
+#if defined(_MSC_VER)
+#pragma warning(pop)
+#endif /* _MSC_VER */
+
+#endif /* TAO_SEQUENCEDEF_I_H */
diff --git a/TAO/orbsvcs/orbsvcs/IFRService/StringDef_i.cpp b/TAO/orbsvcs/orbsvcs/IFRService/StringDef_i.cpp
new file mode 100644
index 00000000000..b8068cdb642
--- /dev/null
+++ b/TAO/orbsvcs/orbsvcs/IFRService/StringDef_i.cpp
@@ -0,0 +1,131 @@
+// $Id$
+
+#include "orbsvcs/IFRService/Repository_i.h"
+#include "orbsvcs/IFRService/StringDef_i.h"
+
+#include "ace/SString.h"
+
+
+ACE_RCSID (IFRService,
+ StringDef_i,
+ "$Id$")
+
+TAO_BEGIN_VERSIONED_NAMESPACE_DECL
+
+TAO_StringDef_i::TAO_StringDef_i (TAO_Repository_i *repo)
+ : TAO_IRObject_i (repo),
+ TAO_IDLType_i (repo)
+{
+}
+
+TAO_StringDef_i::~TAO_StringDef_i (void)
+{
+}
+
+CORBA::DefinitionKind
+TAO_StringDef_i::def_kind (ACE_ENV_SINGLE_ARG_DECL_NOT_USED)
+ ACE_THROW_SPEC ((CORBA::SystemException))
+{
+ return CORBA::dk_String;
+}
+
+void
+TAO_StringDef_i::destroy (ACE_ENV_SINGLE_ARG_DECL)
+ ACE_THROW_SPEC ((CORBA::SystemException))
+{
+ TAO_IFR_WRITE_GUARD;
+
+ this->update_key (ACE_ENV_SINGLE_ARG_PARAMETER);
+ ACE_CHECK;
+
+ this->destroy_i (ACE_ENV_SINGLE_ARG_PARAMETER);
+}
+
+void
+TAO_StringDef_i::destroy_i (ACE_ENV_SINGLE_ARG_DECL_NOT_USED)
+ ACE_THROW_SPEC ((CORBA::SystemException))
+{
+ ACE_TString name;
+ this->repo_->config ()->get_string_value (this->section_key_,
+ "name",
+ name);
+
+ this->repo_->config ()->remove_section (this->repo_->strings_key (),
+ name.c_str (),
+ 0);
+}
+
+CORBA::TypeCode_ptr
+TAO_StringDef_i::type (ACE_ENV_SINGLE_ARG_DECL)
+ ACE_THROW_SPEC ((CORBA::SystemException))
+{
+ TAO_IFR_READ_GUARD_RETURN (CORBA::TypeCode::_nil ());
+
+ this->update_key (ACE_ENV_SINGLE_ARG_PARAMETER);
+ ACE_CHECK_RETURN (CORBA::TypeCode::_nil ());
+
+ return this->type_i (ACE_ENV_SINGLE_ARG_PARAMETER);
+}
+
+CORBA::TypeCode_ptr
+TAO_StringDef_i::type_i (ACE_ENV_SINGLE_ARG_DECL)
+ ACE_THROW_SPEC ((CORBA::SystemException))
+{
+ CORBA::ULong bound = this->bound_i (ACE_ENV_SINGLE_ARG_PARAMETER);
+ ACE_CHECK_RETURN (CORBA::TypeCode::_nil ());
+
+ return this->repo_->tc_factory ()->create_string_tc (
+ bound
+ ACE_ENV_ARG_PARAMETER
+ );
+}
+
+CORBA::ULong
+TAO_StringDef_i::bound (ACE_ENV_SINGLE_ARG_DECL)
+ ACE_THROW_SPEC ((CORBA::SystemException))
+{
+ TAO_IFR_READ_GUARD_RETURN (0);
+
+ this->update_key (ACE_ENV_SINGLE_ARG_PARAMETER);
+ ACE_CHECK_RETURN (0);
+
+ return this->bound_i (ACE_ENV_SINGLE_ARG_PARAMETER);
+}
+
+CORBA::ULong
+TAO_StringDef_i::bound_i (ACE_ENV_SINGLE_ARG_DECL_NOT_USED)
+ ACE_THROW_SPEC ((CORBA::SystemException))
+{
+ u_int retval = 0;
+ this->repo_->config ()->get_integer_value (this->section_key_,
+ "bound",
+ retval);
+
+ return static_cast<CORBA::ULong> (retval);
+}
+
+void
+TAO_StringDef_i::bound (CORBA::ULong bound
+ ACE_ENV_ARG_DECL)
+ ACE_THROW_SPEC ((CORBA::SystemException))
+{
+ TAO_IFR_WRITE_GUARD;
+
+ this->update_key (ACE_ENV_SINGLE_ARG_PARAMETER);
+ ACE_CHECK;
+
+ this->bound_i (bound
+ ACE_ENV_ARG_PARAMETER);
+}
+
+void
+TAO_StringDef_i::bound_i (CORBA::ULong bound
+ ACE_ENV_ARG_DECL_NOT_USED)
+ ACE_THROW_SPEC ((CORBA::SystemException))
+{
+ this->repo_->config ()->set_integer_value (this->section_key_,
+ "bound",
+ bound);
+}
+
+TAO_END_VERSIONED_NAMESPACE_DECL
diff --git a/TAO/orbsvcs/orbsvcs/IFRService/StringDef_i.h b/TAO/orbsvcs/orbsvcs/IFRService/StringDef_i.h
new file mode 100644
index 00000000000..5f1e402b8ce
--- /dev/null
+++ b/TAO/orbsvcs/orbsvcs/IFRService/StringDef_i.h
@@ -0,0 +1,112 @@
+// -*- C++ -*-
+
+// $Id$
+
+// ============================================================================
+//
+// = LIBRARY
+// TAO/orbsvcs/orbsvcs/IFRService
+//
+// = FILENAME
+// StringDef_i.h
+//
+// = DESCRIPTION
+// StringDef servant class.
+//
+// = AUTHOR
+// Jeff Parsons <parsons@cs.wustl.edu>
+//
+// ============================================================================
+
+#ifndef TAO_STRINGDEF_I_H
+#define TAO_STRINGDEF_I_H
+
+#include "orbsvcs/IFRService/IDLType_i.h"
+#include "orbsvcs/IFRService/ifr_service_export.h"
+
+#if !defined (ACE_LACKS_PRAGMA_ONCE)
+# pragma once
+#endif /* ACE_LACKS_PRAGMA_ONCE */
+
+#if defined(_MSC_VER)
+#pragma warning(push)
+#pragma warning(disable:4250)
+#endif /* _MSC_VER */
+
+TAO_BEGIN_VERSIONED_NAMESPACE_DECL
+
+class TAO_IFRService_Export TAO_StringDef_i : public virtual TAO_IDLType_i
+{
+ // = TITLE
+ // TAO_StringDef_i
+ //
+ // = DESCRIPTION
+ // Represents a bounded string (unbounded strings
+ // are included in PrimitiveDef).
+ //
+public:
+ TAO_StringDef_i (TAO_Repository_i *repoy);
+ // Constructor.
+
+ virtual ~TAO_StringDef_i (void);
+ // Destructor.
+
+ virtual CORBA::DefinitionKind def_kind (
+ ACE_ENV_SINGLE_ARG_DECL_WITH_DEFAULTS)
+
+ ACE_THROW_SPEC ((CORBA::SystemException));
+ // Return our definition kind.
+
+ virtual void destroy (
+ ACE_ENV_SINGLE_ARG_DECL_WITH_DEFAULTS)
+
+ ACE_THROW_SPEC ((CORBA::SystemException));
+ // Remove the repository entry.
+
+ virtual void destroy_i (
+ ACE_ENV_SINGLE_ARG_DECL_WITH_DEFAULTS)
+
+ ACE_THROW_SPEC ((CORBA::SystemException));
+
+ virtual CORBA::TypeCode_ptr type (
+ ACE_ENV_SINGLE_ARG_DECL_WITH_DEFAULTS)
+
+ ACE_THROW_SPEC ((CORBA::SystemException));
+ // From IDLType_i's pure virtual function.
+
+ virtual CORBA::TypeCode_ptr type_i (
+ ACE_ENV_SINGLE_ARG_DECL_WITH_DEFAULTS)
+
+ ACE_THROW_SPEC ((CORBA::SystemException));
+ // From IDLType_i's pure virtual function.
+
+ virtual CORBA::ULong bound (
+ ACE_ENV_SINGLE_ARG_DECL_WITH_DEFAULTS)
+
+ ACE_THROW_SPEC ((CORBA::SystemException));
+
+ CORBA::ULong bound_i (
+ ACE_ENV_SINGLE_ARG_DECL_WITH_DEFAULTS)
+
+ ACE_THROW_SPEC ((CORBA::SystemException));
+
+ virtual void bound (
+ CORBA::ULong bound
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS)
+
+ ACE_THROW_SPEC ((CORBA::SystemException));
+
+ void bound_i (
+ CORBA::ULong bound
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS)
+
+ ACE_THROW_SPEC ((CORBA::SystemException));
+};
+
+TAO_END_VERSIONED_NAMESPACE_DECL
+
+#if defined(_MSC_VER)
+#pragma warning(pop)
+#endif /* _MSC_VER */
+
+#endif /* TAO_STRINGDEF_I_H */
diff --git a/TAO/orbsvcs/orbsvcs/IFRService/StructDef_i.cpp b/TAO/orbsvcs/orbsvcs/IFRService/StructDef_i.cpp
new file mode 100644
index 00000000000..e4cef6229e6
--- /dev/null
+++ b/TAO/orbsvcs/orbsvcs/IFRService/StructDef_i.cpp
@@ -0,0 +1,317 @@
+// $Id$
+
+#include "orbsvcs/IFRService/StructDef_i.h"
+#include "orbsvcs/IFRService/RecursDef_i.h"
+#include "orbsvcs/IFRService/Repository_i.h"
+#include "orbsvcs/IFRService/IFR_Service_Utils.h"
+
+#include "ace/Auto_Ptr.h"
+#include "ace/SString.h"
+
+
+ACE_RCSID (IFRService,
+ StructDef_i,
+ "$Id$")
+
+TAO_BEGIN_VERSIONED_NAMESPACE_DECL
+
+TAO_StructDef_i::TAO_StructDef_i (TAO_Repository_i *repo)
+ : TAO_IRObject_i (repo),
+ TAO_Contained_i (repo),
+ TAO_IDLType_i (repo),
+ TAO_TypedefDef_i (repo),
+ TAO_Container_i (repo)
+{
+}
+
+TAO_StructDef_i::~TAO_StructDef_i (void)
+{
+}
+
+CORBA::DefinitionKind
+TAO_StructDef_i::def_kind (ACE_ENV_SINGLE_ARG_DECL_NOT_USED)
+ ACE_THROW_SPEC ((CORBA::SystemException))
+{
+ return CORBA::dk_Struct;
+}
+
+void
+TAO_StructDef_i::destroy (ACE_ENV_SINGLE_ARG_DECL)
+ ACE_THROW_SPEC ((CORBA::SystemException))
+{
+ TAO_IFR_WRITE_GUARD;
+
+ this->update_key (ACE_ENV_SINGLE_ARG_PARAMETER);
+ ACE_CHECK;
+
+ this->destroy_i (ACE_ENV_SINGLE_ARG_PARAMETER);
+}
+
+void
+TAO_StructDef_i::destroy_i (ACE_ENV_SINGLE_ARG_DECL)
+ ACE_THROW_SPEC ((CORBA::SystemException))
+{
+ // Destroy our members.
+ TAO_Container_i::destroy_i (ACE_ENV_SINGLE_ARG_PARAMETER);
+ ACE_CHECK;
+
+ // Destroy ourself.
+ TAO_Contained_i::destroy_i (ACE_ENV_SINGLE_ARG_PARAMETER);
+ ACE_CHECK;
+}
+
+CORBA::TypeCode_ptr
+TAO_StructDef_i::type (ACE_ENV_SINGLE_ARG_DECL)
+ ACE_THROW_SPEC ((CORBA::SystemException))
+{
+ TAO_IFR_READ_GUARD_RETURN (CORBA::TypeCode::_nil ());
+
+ this->update_key (ACE_ENV_SINGLE_ARG_PARAMETER);
+ ACE_CHECK_RETURN (CORBA::TypeCode::_nil ());
+
+ return this->type_i (ACE_ENV_SINGLE_ARG_PARAMETER);
+}
+
+CORBA::TypeCode_ptr
+TAO_StructDef_i::type_i (ACE_ENV_SINGLE_ARG_DECL)
+ ACE_THROW_SPEC ((CORBA::SystemException))
+{
+ ACE_TString id;
+ this->repo_->config ()->get_string_value (this->section_key_,
+ "id",
+ id);
+
+ //---------------------------------------------------------------------------
+ // Have we already seen this structure definition at an outer scope?
+ // If yes, return a recursive type code to signal the nesting.
+ // If not, record this new structure id in our stack (it will automatically
+ // be removed when NowSeenThis goes out of scope).
+ //---------------------------------------------------------------------------
+
+ if (TAO_RecursiveDef_OuterScopes::SeenBefore( id ))
+ return this->repo_->tc_factory ()->
+ create_recursive_tc ( id.c_str () ACE_ENV_ARG_PARAMETER);
+
+ TAO_RecursiveDef_OuterScopes NowSeenThis( id );
+
+ //---------------------------------------------------------------------------
+ // Create a new type code for this structure; the create_struct_tc() call
+ // that follows may recursivly call this method again if one of its children
+ // refers to a structure (which is the point of the above NowSeenThis stack).
+ //---------------------------------------------------------------------------
+
+ ACE_TString name;
+ this->repo_->config ()->get_string_value (this->section_key_,
+ "name",
+ name);
+
+ CORBA::StructMemberSeq_var members = this->members_i (ACE_ENV_SINGLE_ARG_PARAMETER);
+ ACE_CHECK_RETURN (CORBA::TypeCode::_nil ());
+
+ return this->repo_->tc_factory ()->create_struct_tc (id.c_str (),
+ name.c_str (),
+ members.in ()
+ ACE_ENV_ARG_PARAMETER);
+}
+
+CORBA::StructMemberSeq *
+TAO_StructDef_i::members (ACE_ENV_SINGLE_ARG_DECL)
+ ACE_THROW_SPEC ((CORBA::SystemException))
+{
+ TAO_IFR_READ_GUARD_RETURN (0);
+
+ this->update_key (ACE_ENV_SINGLE_ARG_PARAMETER);
+ ACE_CHECK_RETURN (0);
+
+ return this->members_i (ACE_ENV_SINGLE_ARG_PARAMETER);
+}
+
+CORBA::StructMemberSeq *
+TAO_StructDef_i::members_i (ACE_ENV_SINGLE_ARG_DECL)
+ ACE_THROW_SPEC ((CORBA::SystemException))
+{
+ ACE_Unbounded_Queue<CORBA::DefinitionKind> kind_queue;
+ ACE_Unbounded_Queue<ACE_TString> path_queue;
+ ACE_Unbounded_Queue<ACE_TString> name_queue;
+
+ ACE_Configuration_Section_Key refs_key;
+ this->repo_->config ()->open_section (this->section_key_,
+ "refs",
+ 0,
+ refs_key);
+
+ u_int count = 0;
+ this->repo_->config ()->get_integer_value (refs_key,
+ "count",
+ count);
+
+ for (u_int i = 0; i < count; ++i)
+ {
+ ACE_Configuration_Section_Key member_key;
+ char *stringified = TAO_IFR_Service_Utils::int_to_string (i);
+ this->repo_->config ()->open_section (refs_key,
+ stringified,
+ 0,
+ member_key);
+
+ ACE_TString path;
+ this->repo_->config ()->get_string_value (member_key,
+ "path",
+ path);
+
+ ACE_Configuration_Section_Key entry_key;
+ int status =
+ this->repo_->config ()->expand_path (this->repo_->root_key (),
+ path,
+ entry_key,
+ 0);
+
+ // This entry may have been removed.
+ if (status == 0)
+ {
+ path_queue.enqueue_tail (path);
+
+ ACE_TString name;
+ this->repo_->config ()->get_string_value (member_key,
+ "name",
+ name);
+
+ name_queue.enqueue_tail (name);
+
+ u_int kind = 0;
+ this->repo_->config ()->get_integer_value (entry_key,
+ "def_kind",
+ kind);
+
+ CORBA::DefinitionKind def_kind =
+ static_cast<CORBA::DefinitionKind> (kind);
+
+ kind_queue.enqueue_tail (def_kind);
+ }
+ }
+
+ CORBA::ULong size = static_cast<CORBA::ULong> (kind_queue.size ());
+
+ CORBA::StructMemberSeq *members = 0;
+ ACE_NEW_THROW_EX (members,
+ CORBA::StructMemberSeq (size),
+ CORBA::NO_MEMORY ());
+ ACE_CHECK_RETURN (0);
+
+ members->length (size);
+
+ CORBA::StructMemberSeq_var retval = members;
+
+ ACE_TString name, path;
+ CORBA::DefinitionKind kind = CORBA::dk_none;
+ CORBA::Object_var obj;
+ ACE_Configuration_Section_Key member_key;
+ TAO_IDLType_i *impl = 0;
+
+ // Store to replace below.
+ ACE_Configuration_Section_Key key_holder = this->section_key_;
+
+ for (CORBA::ULong k = 0; k < size; ++k)
+ {
+ name_queue.dequeue_head (name);
+ retval[k].name = name.c_str ();
+ kind_queue.dequeue_head (kind);
+ path_queue.dequeue_head (path);
+
+ obj = TAO_IFR_Service_Utils::create_objref (kind,
+ path.c_str (),
+ this->repo_
+ ACE_ENV_ARG_PARAMETER);
+ ACE_CHECK_RETURN (0);
+
+ retval[k].type_def = CORBA::IDLType::_narrow (obj.in ()
+ ACE_ENV_ARG_PARAMETER);
+ ACE_CHECK_RETURN (0);
+
+ this->repo_->config ()->expand_path (this->repo_->root_key (),
+ path,
+ member_key,
+ 0);
+
+ impl = TAO_IFR_Service_Utils::path_to_idltype (path,
+ this->repo_);
+ if (0 == impl)
+ {
+ ACE_THROW_RETURN ( CORBA::OBJECT_NOT_EXIST(), 0);
+ }
+
+ retval[k].type = impl->type_i (ACE_ENV_SINGLE_ARG_PARAMETER);
+ ACE_CHECK_RETURN (0);
+
+ // If this struct contains a nested struct (of another type) at
+ // some level, the above code will have changed the section key
+ // so we have to replace it with the value we stored above.
+ this->section_key (key_holder);
+ }
+
+ return retval._retn ();
+}
+
+void
+TAO_StructDef_i::members (const CORBA::StructMemberSeq &members
+ ACE_ENV_ARG_DECL)
+ ACE_THROW_SPEC ((CORBA::SystemException))
+{
+ TAO_IFR_WRITE_GUARD;
+
+ this->update_key (ACE_ENV_SINGLE_ARG_PARAMETER);
+ ACE_CHECK;
+
+ this->members_i (members
+ ACE_ENV_ARG_PARAMETER);
+}
+
+void
+TAO_StructDef_i::members_i (const CORBA::StructMemberSeq &members
+ ACE_ENV_ARG_DECL)
+ ACE_THROW_SPEC ((CORBA::SystemException))
+{
+ // Destroy our old members, both refs and defns.
+ TAO_Container_i::destroy_i (ACE_ENV_SINGLE_ARG_PARAMETER);
+ ACE_CHECK;
+
+ CORBA::ULong count = members.length ();
+
+ ACE_TString section_name;
+ ACE_Configuration_Section_Key refs_key;
+
+ this->repo_->config ()->open_section (this->section_key_,
+ "refs",
+ 1,
+ refs_key);
+ char *path = 0;
+
+ // Create a section for each new member. We just store the
+ // member name and the path to its database entry.
+ for (CORBA::ULong i = 0; i < count; ++i)
+ {
+ ACE_Configuration_Section_Key member_key;
+ char *stringified = TAO_IFR_Service_Utils::int_to_string (i);
+ this->repo_->config ()->open_section (refs_key,
+ stringified,
+ 1,
+ member_key);
+
+ this->repo_->config ()->set_string_value (member_key,
+ "name",
+ members[i].name.in ());
+
+ path =
+ TAO_IFR_Service_Utils::reference_to_path (members[i].type_def.in ());
+
+ this->repo_->config ()->set_string_value (member_key,
+ "path",
+ path);
+ }
+
+ this->repo_->config ()->set_integer_value (refs_key,
+ "count",
+ count);
+}
+
+TAO_END_VERSIONED_NAMESPACE_DECL
diff --git a/TAO/orbsvcs/orbsvcs/IFRService/StructDef_i.h b/TAO/orbsvcs/orbsvcs/IFRService/StructDef_i.h
new file mode 100644
index 00000000000..a679e5ff3dd
--- /dev/null
+++ b/TAO/orbsvcs/orbsvcs/IFRService/StructDef_i.h
@@ -0,0 +1,113 @@
+// -*- C++ -*-
+
+// $Id$
+
+// ============================================================================
+//
+// = LIBRARY
+// TAO/orbsvcs/orbsvcs/IFRService
+//
+// = FILENAME
+// StructDef_i.h
+//
+// = DESCRIPTION
+// StructDef servant class.
+//
+// = AUTHOR
+// Jeff Parsons <parsons@cs.wustl.edu>
+//
+// ============================================================================
+
+#ifndef TAO_STRUCTDEF_I_H
+#define TAO_STRUCTDEF_I_H
+
+#include "orbsvcs/IFRService/TypedefDef_i.h"
+#include "orbsvcs/IFRService/Container_i.h"
+#include "orbsvcs/IFRService/ifr_service_export.h"
+
+#if !defined (ACE_LACKS_PRAGMA_ONCE)
+# pragma once
+#endif /* ACE_LACKS_PRAGMA_ONCE */
+
+#if defined(_MSC_VER)
+#pragma warning(push)
+#pragma warning(disable:4250)
+#endif /* _MSC_VER */
+
+TAO_BEGIN_VERSIONED_NAMESPACE_DECL
+
+class TAO_IFRService_Export TAO_StructDef_i : public virtual TAO_TypedefDef_i,
+ public virtual TAO_Container_i
+{
+ // = TITLE
+ // TAO_StructDef_i
+ //
+ // = DESCRIPTION
+ // Represents an OMG IDL structure definition.
+ //
+public:
+ TAO_StructDef_i (TAO_Repository_i *repo);
+ // Constructor
+
+ virtual ~TAO_StructDef_i (void);
+ // Destructor
+
+ virtual CORBA::DefinitionKind def_kind (
+ ACE_ENV_SINGLE_ARG_DECL_WITH_DEFAULTS)
+
+ ACE_THROW_SPEC ((CORBA::SystemException));
+ // Return our definition kind.
+
+ virtual void destroy (
+ ACE_ENV_SINGLE_ARG_DECL_WITH_DEFAULTS)
+
+ ACE_THROW_SPEC ((CORBA::SystemException));
+ // Remove the repository entry and its contents.
+
+ virtual void destroy_i (
+ ACE_ENV_SINGLE_ARG_DECL_WITH_DEFAULTS)
+
+ ACE_THROW_SPEC ((CORBA::SystemException));
+
+ virtual CORBA::TypeCode_ptr type (
+ ACE_ENV_SINGLE_ARG_DECL_WITH_DEFAULTS)
+
+ ACE_THROW_SPEC ((CORBA::SystemException));
+ // From IDLType_i's pure virtual function.
+
+ virtual CORBA::TypeCode_ptr type_i (
+ ACE_ENV_SINGLE_ARG_DECL_WITH_DEFAULTS)
+
+ ACE_THROW_SPEC ((CORBA::SystemException));
+ // From IDLType_i's pure virtual function.
+
+ virtual CORBA::StructMemberSeq *members (
+ ACE_ENV_SINGLE_ARG_DECL_WITH_DEFAULTS)
+
+ ACE_THROW_SPEC ((CORBA::SystemException));
+
+ CORBA::StructMemberSeq *members_i (
+ ACE_ENV_SINGLE_ARG_DECL_WITH_DEFAULTS)
+
+ ACE_THROW_SPEC ((CORBA::SystemException));
+
+ virtual void members (
+ const CORBA::StructMemberSeq &members
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS)
+
+ ACE_THROW_SPEC ((CORBA::SystemException));
+
+ void members_i (
+ const CORBA::StructMemberSeq &members
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS)
+
+ ACE_THROW_SPEC ((CORBA::SystemException));
+};
+
+TAO_END_VERSIONED_NAMESPACE_DECL
+
+#if defined(_MSC_VER)
+#pragma warning(pop)
+#endif /* _MSC_VER */
+
+#endif /* TAO_STRUCTDEF_I_H */
diff --git a/TAO/orbsvcs/orbsvcs/IFRService/TypedefDef_i.cpp b/TAO/orbsvcs/orbsvcs/IFRService/TypedefDef_i.cpp
new file mode 100644
index 00000000000..3261a380750
--- /dev/null
+++ b/TAO/orbsvcs/orbsvcs/IFRService/TypedefDef_i.cpp
@@ -0,0 +1,82 @@
+// $Id$
+
+#include "orbsvcs/IFRService/Repository_i.h"
+#include "orbsvcs/IFRService/TypedefDef_i.h"
+
+#include "ace/SString.h"
+
+
+ACE_RCSID (IFRService,
+ TypedefDef_i,
+ "$Id$")
+
+TAO_BEGIN_VERSIONED_NAMESPACE_DECL
+
+TAO_TypedefDef_i::TAO_TypedefDef_i (
+ TAO_Repository_i *repo
+ )
+ : TAO_IRObject_i (repo),
+ TAO_Contained_i (repo),
+ TAO_IDLType_i (repo)
+{
+}
+
+TAO_TypedefDef_i::~TAO_TypedefDef_i (void)
+{
+}
+
+CORBA::Contained::Description *
+TAO_TypedefDef_i::describe (ACE_ENV_SINGLE_ARG_DECL)
+ ACE_THROW_SPEC ((CORBA::SystemException))
+{
+ TAO_IFR_READ_GUARD_RETURN (0);
+
+ this->update_key (ACE_ENV_SINGLE_ARG_PARAMETER);
+ ACE_CHECK_RETURN (0);
+
+ return this->describe_i (ACE_ENV_SINGLE_ARG_PARAMETER);
+}
+
+CORBA::Contained::Description *
+TAO_TypedefDef_i::describe_i (ACE_ENV_SINGLE_ARG_DECL)
+ ACE_THROW_SPEC ((CORBA::SystemException))
+{
+ CORBA::Contained::Description *desc_ptr = 0;
+ ACE_NEW_THROW_EX (desc_ptr,
+ CORBA::Contained::Description,
+ CORBA::NO_MEMORY ());
+ ACE_CHECK_RETURN (0);
+
+ CORBA::Contained::Description_var retval = desc_ptr;
+
+ retval->kind = this->def_kind (ACE_ENV_SINGLE_ARG_PARAMETER);
+ ACE_CHECK_RETURN (0);
+
+ CORBA::TypeDescription td;
+
+ ACE_CHECK_RETURN (0);
+ td.name = this->name_i (ACE_ENV_SINGLE_ARG_PARAMETER);
+
+ td.id = this->id_i (ACE_ENV_SINGLE_ARG_PARAMETER);
+ ACE_CHECK_RETURN (0);
+
+ ACE_TString container_id;
+
+ this->repo_->config ()->get_string_value (this->section_key_,
+ "container_id",
+ container_id);
+
+ td.defined_in = container_id.c_str ();
+
+ td.version = this->version_i (ACE_ENV_SINGLE_ARG_PARAMETER);
+ ACE_CHECK_RETURN (0);
+
+ td.type = this->type_i (ACE_ENV_SINGLE_ARG_PARAMETER);
+ ACE_CHECK_RETURN (0);
+
+ retval->value <<= td;
+
+ return retval._retn ();
+}
+
+TAO_END_VERSIONED_NAMESPACE_DECL
diff --git a/TAO/orbsvcs/orbsvcs/IFRService/TypedefDef_i.h b/TAO/orbsvcs/orbsvcs/IFRService/TypedefDef_i.h
new file mode 100644
index 00000000000..1d836a105d2
--- /dev/null
+++ b/TAO/orbsvcs/orbsvcs/IFRService/TypedefDef_i.h
@@ -0,0 +1,75 @@
+// -*- C++ -*-
+
+// $Id$
+
+// ============================================================================
+//
+// = LIBRARY
+// TAO/orbsvcs/orbsvcs/IFRService
+//
+// = FILENAME
+// TypedefDef_i.h
+//
+// = DESCRIPTION
+// TypedefDef servant class.
+//
+// = AUTHOR
+// Jeff Parsons <parsons@cs.wustl.edu>
+//
+// ============================================================================
+
+#ifndef TAO_TYPEDEFDEF_I_H
+#define TAO_TYPEDEFDEF_I_H
+
+#include "orbsvcs/IFRService/Contained_i.h"
+#include "orbsvcs/IFRService/IDLType_i.h"
+#include "orbsvcs/IFRService/ifr_service_export.h"
+
+#if !defined (ACE_LACKS_PRAGMA_ONCE)
+# pragma once
+#endif /* ACE_LACKS_PRAGMA_ONCE */
+
+#if defined(_MSC_VER)
+#pragma warning(push)
+#pragma warning(disable:4250)
+#endif /* _MSC_VER */
+
+TAO_BEGIN_VERSIONED_NAMESPACE_DECL
+
+class TAO_IFRService_Export TAO_TypedefDef_i : public virtual TAO_Contained_i,
+ public virtual TAO_IDLType_i
+{
+ // = TITLE
+ // TAO_TypedefDef_i
+ //
+ // = DESCRIPTION
+ // Base interface inherited by all named non-object types:
+ // struct, union, enum, alias, native, and valuebox.
+ //
+public:
+ TAO_TypedefDef_i (TAO_Repository_i *repo);
+ // Constructor
+
+ virtual ~TAO_TypedefDef_i (void);
+ // Destructor
+
+ virtual CORBA::Contained::Description *describe (
+ ACE_ENV_SINGLE_ARG_DECL_WITH_DEFAULTS)
+
+ ACE_THROW_SPEC ((CORBA::SystemException));
+ // From Contained_i's pure virtual function.
+
+ virtual CORBA::Contained::Description *describe_i (
+ ACE_ENV_SINGLE_ARG_DECL_WITH_DEFAULTS)
+
+ ACE_THROW_SPEC ((CORBA::SystemException));
+ // From Contained_i's pure virtual function.
+};
+
+TAO_END_VERSIONED_NAMESPACE_DECL
+
+#if defined(_MSC_VER)
+#pragma warning(pop)
+#endif /* _MSC_VER */
+
+#endif /* TAO_TYPEDEFDEF_I_H */
diff --git a/TAO/orbsvcs/orbsvcs/IFRService/UnionDef_i.cpp b/TAO/orbsvcs/orbsvcs/IFRService/UnionDef_i.cpp
new file mode 100644
index 00000000000..efc0446c718
--- /dev/null
+++ b/TAO/orbsvcs/orbsvcs/IFRService/UnionDef_i.cpp
@@ -0,0 +1,486 @@
+// $Id$
+
+#include "orbsvcs/IFRService/UnionDef_i.h"
+#include "orbsvcs/IFRService/RecursDef_i.h"
+#include "orbsvcs/IFRService/Repository_i.h"
+#include "orbsvcs/IFRService/IFR_Service_Utils.h"
+
+#include "tao/AnyTypeCode/Any_Unknown_IDL_Type.h"
+#include "tao/CDR.h"
+
+#include "ace/Auto_Ptr.h"
+#include "ace/SString.h"
+
+
+ACE_RCSID (IFRService,
+ UnionDef_i,
+ "$Id$")
+
+TAO_BEGIN_VERSIONED_NAMESPACE_DECL
+
+TAO_UnionDef_i::TAO_UnionDef_i (TAO_Repository_i *repo)
+ : TAO_IRObject_i (repo),
+ TAO_Contained_i (repo),
+ TAO_IDLType_i (repo),
+ TAO_TypedefDef_i (repo),
+ TAO_Container_i (repo)
+{
+}
+
+TAO_UnionDef_i::~TAO_UnionDef_i (void)
+{
+}
+
+CORBA::DefinitionKind
+TAO_UnionDef_i::def_kind (ACE_ENV_SINGLE_ARG_DECL_NOT_USED)
+ ACE_THROW_SPEC ((CORBA::SystemException))
+{
+ return CORBA::dk_Union;
+}
+
+void
+TAO_UnionDef_i::destroy (ACE_ENV_SINGLE_ARG_DECL)
+ ACE_THROW_SPEC ((CORBA::SystemException))
+{
+ TAO_IFR_WRITE_GUARD;
+
+ this->update_key (ACE_ENV_SINGLE_ARG_PARAMETER);
+ ACE_CHECK;
+
+ this->destroy_i (ACE_ENV_SINGLE_ARG_PARAMETER);
+}
+
+void
+TAO_UnionDef_i::destroy_i (ACE_ENV_SINGLE_ARG_DECL)
+ ACE_THROW_SPEC ((CORBA::SystemException))
+{
+ // Destroy our members.
+ TAO_Container_i::destroy_i (ACE_ENV_SINGLE_ARG_PARAMETER);
+ ACE_CHECK;
+
+ // Destroy ourself.
+ TAO_Contained_i::destroy_i (ACE_ENV_SINGLE_ARG_PARAMETER);
+ ACE_CHECK;
+}
+
+CORBA::TypeCode_ptr
+TAO_UnionDef_i::type (ACE_ENV_SINGLE_ARG_DECL)
+ ACE_THROW_SPEC ((CORBA::SystemException))
+{
+ TAO_IFR_READ_GUARD_RETURN (CORBA::TypeCode::_nil ());
+
+ this->update_key (ACE_ENV_SINGLE_ARG_PARAMETER);
+ ACE_CHECK_RETURN (CORBA::TypeCode::_nil ());
+
+ return this->type_i (ACE_ENV_SINGLE_ARG_PARAMETER);
+}
+
+CORBA::TypeCode_ptr
+TAO_UnionDef_i::type_i (ACE_ENV_SINGLE_ARG_DECL)
+ ACE_THROW_SPEC ((CORBA::SystemException))
+{
+ ACE_TString id;
+ this->repo_->config ()->get_string_value (this->section_key_,
+ "id",
+ id);
+
+ //---------------------------------------------------------------------------
+ // Have we already seen this union definition at an outer scope?
+ // If yes, return a recursive type code to signal the nesting.
+ // If not, record this new union id in our stack (it will automatically be
+ // removed when NowSeenThis goes out of scope).
+ //---------------------------------------------------------------------------
+
+ if (TAO_RecursiveDef_OuterScopes::SeenBefore( id ))
+ return this->repo_->tc_factory ()->
+ create_recursive_tc ( id.c_str () ACE_ENV_ARG_PARAMETER);
+
+ TAO_RecursiveDef_OuterScopes NowSeenThis( id );
+
+ //---------------------------------------------------------------------------
+ // Create a new type code for this structure; the create_union_tc() call
+ // that follows may recursivly call this method again if one of its children
+ // refers to a union (which is the point of the above NowSeenThis stack).
+ //---------------------------------------------------------------------------
+
+ ACE_TString name;
+ this->repo_->config ()->get_string_value (this->section_key_,
+ "name",
+ name);
+
+ CORBA::TypeCode_var tc = this->discriminator_type_i (ACE_ENV_SINGLE_ARG_PARAMETER);
+ ACE_CHECK_RETURN (CORBA::TypeCode::_nil ());
+
+ CORBA::UnionMemberSeq_var members = this->members_i (ACE_ENV_SINGLE_ARG_PARAMETER);
+ ACE_CHECK_RETURN (CORBA::TypeCode::_nil ());
+
+ return this->repo_->tc_factory ()->create_union_tc (id.c_str (),
+ name.c_str (),
+ tc.in (),
+ members.in ()
+ ACE_ENV_ARG_PARAMETER);
+}
+
+CORBA::TypeCode_ptr
+TAO_UnionDef_i::discriminator_type (ACE_ENV_SINGLE_ARG_DECL)
+ ACE_THROW_SPEC ((CORBA::SystemException))
+{
+ TAO_IFR_READ_GUARD_RETURN (CORBA::TypeCode::_nil ());
+
+ this->update_key (ACE_ENV_SINGLE_ARG_PARAMETER);
+ ACE_CHECK_RETURN (CORBA::TypeCode::_nil ());
+
+ return this->discriminator_type_i (ACE_ENV_SINGLE_ARG_PARAMETER);
+}
+
+CORBA::TypeCode_ptr
+TAO_UnionDef_i::discriminator_type_i (ACE_ENV_SINGLE_ARG_DECL)
+ ACE_THROW_SPEC ((CORBA::SystemException))
+{
+ ACE_TString disc_path;
+ this->repo_->config ()->get_string_value (this->section_key_,
+ "disc_path",
+ disc_path);
+
+ TAO_IDLType_i *impl =
+ TAO_IFR_Service_Utils::path_to_idltype (disc_path,
+ this->repo_);
+ if (0 == impl)
+ {
+ ACE_THROW_RETURN (CORBA::OBJECT_NOT_EXIST(), CORBA::TypeCode::_nil () );
+ }
+
+ return impl->type_i (ACE_ENV_SINGLE_ARG_PARAMETER);
+}
+
+CORBA::IDLType_ptr
+TAO_UnionDef_i::discriminator_type_def (ACE_ENV_SINGLE_ARG_DECL)
+ ACE_THROW_SPEC ((CORBA::SystemException))
+{
+ TAO_IFR_READ_GUARD_RETURN (CORBA::IDLType::_nil ());
+
+ this->update_key (ACE_ENV_SINGLE_ARG_PARAMETER);
+ ACE_CHECK_RETURN (CORBA::IDLType::_nil ());
+
+ return this->discriminator_type_def_i (ACE_ENV_SINGLE_ARG_PARAMETER);
+}
+
+CORBA::IDLType_ptr
+TAO_UnionDef_i::discriminator_type_def_i (ACE_ENV_SINGLE_ARG_DECL)
+ ACE_THROW_SPEC ((CORBA::SystemException))
+{
+ ACE_TString disc_path;
+ this->repo_->config ()->get_string_value (this->section_key_,
+ "disc_path",
+ disc_path);
+
+ CORBA::Object_var obj =
+ TAO_IFR_Service_Utils::path_to_ir_object (disc_path,
+ this->repo_
+ ACE_ENV_ARG_PARAMETER);
+ ACE_CHECK_RETURN (CORBA::IDLType::_nil ());
+
+ return CORBA::IDLType::_narrow (obj.in ()
+ ACE_ENV_ARG_PARAMETER);
+}
+
+void
+TAO_UnionDef_i::discriminator_type_def (
+ CORBA::IDLType_ptr discriminator_type_def
+ ACE_ENV_ARG_DECL
+ )
+ ACE_THROW_SPEC ((CORBA::SystemException))
+{
+ TAO_IFR_WRITE_GUARD;
+
+ this->update_key (ACE_ENV_SINGLE_ARG_PARAMETER);
+ ACE_CHECK;
+
+ this->discriminator_type_def_i (discriminator_type_def
+ ACE_ENV_ARG_PARAMETER);
+}
+
+void
+TAO_UnionDef_i::discriminator_type_def_i (
+ CORBA::IDLType_ptr discriminator_type_def
+ ACE_ENV_ARG_DECL_NOT_USED
+ )
+ ACE_THROW_SPEC ((CORBA::SystemException))
+{
+ char *disc_path =
+ TAO_IFR_Service_Utils::reference_to_path (discriminator_type_def);
+
+ this->repo_->config ()->set_string_value (this->section_key_,
+ "disc_path",
+ disc_path);
+}
+
+CORBA::UnionMemberSeq *
+TAO_UnionDef_i::members (ACE_ENV_SINGLE_ARG_DECL)
+ ACE_THROW_SPEC ((CORBA::SystemException))
+{
+ TAO_IFR_READ_GUARD_RETURN (0);
+
+ this->update_key (ACE_ENV_SINGLE_ARG_PARAMETER);
+ ACE_CHECK_RETURN (0);
+
+ return this->members_i (ACE_ENV_SINGLE_ARG_PARAMETER);
+}
+
+CORBA::UnionMemberSeq *
+TAO_UnionDef_i::members_i (ACE_ENV_SINGLE_ARG_DECL)
+ ACE_THROW_SPEC ((CORBA::SystemException))
+{
+ ACE_Unbounded_Queue<ACE_Configuration_Section_Key> key_queue;
+
+ ACE_Configuration_Section_Key refs_key;
+ this->repo_->config ()->open_section (this->section_key_,
+ "refs",
+ 0,
+ refs_key);
+
+ u_int count;
+ this->repo_->config ()->get_integer_value (refs_key,
+ "count",
+ count);
+
+ for (u_int i = 0; i < count; ++i)
+ {
+ ACE_Configuration_Section_Key member_key;
+ char *stringified = TAO_IFR_Service_Utils::int_to_string (i);
+ if (this->repo_->config ()->open_section (refs_key,
+ stringified,
+ 0,
+ member_key)
+ == 0)
+ {
+ ACE_TString path;
+ this->repo_->config ()->get_string_value (member_key,
+ "path",
+ path);
+
+ ACE_Configuration_Section_Key entry_key;
+
+ // This entry may have been removed.
+ if (this->repo_->config ()->expand_path (this->repo_->root_key (),
+ path,
+ entry_key,
+ 0)
+ == 0)
+ {
+ key_queue.enqueue_tail (member_key);
+ }
+ }
+ }
+
+ CORBA::ULong size = static_cast<CORBA::ULong> (key_queue.size ());
+
+ CORBA::UnionMemberSeq *members = 0;
+ ACE_NEW_THROW_EX (members,
+ CORBA::UnionMemberSeq (size),
+ CORBA::NO_MEMORY ());
+ ACE_CHECK_RETURN (0);
+
+ members->length (size);
+ CORBA::UnionMemberSeq_var retval = members;
+
+ ACE_TString name, path;
+ ACE_Configuration_Section_Key next_key, entry_key;
+ CORBA::Object_var obj;
+ TAO_IDLType_i *impl = 0;
+
+ // Store to replace below.
+ ACE_Configuration_Section_Key key_holder = this->section_key_;
+
+ for (CORBA::ULong k = 0; k < size; ++k)
+ {
+ key_queue.dequeue_head (next_key);
+
+ this->repo_->config ()->get_string_value (next_key,
+ "name",
+ name);
+
+ retval[k].name = name.c_str ();
+
+ this->fetch_label (next_key,
+ retval[k]
+ ACE_ENV_ARG_PARAMETER);
+ ACE_CHECK_RETURN (0);
+
+ this->repo_->config ()->get_string_value (next_key,
+ "path",
+ path);
+
+ obj = TAO_IFR_Service_Utils::path_to_ir_object (path,
+ this->repo_
+ ACE_ENV_ARG_PARAMETER);
+ ACE_CHECK_RETURN (0);
+
+ retval[k].type_def = CORBA::IDLType::_narrow (obj.in ()
+ ACE_ENV_ARG_PARAMETER);
+ ACE_CHECK_RETURN (0);
+
+ impl = TAO_IFR_Service_Utils::path_to_idltype (path,
+ this->repo_);
+ if (0 == impl)
+ {
+ ACE_THROW_RETURN (CORBA::OBJECT_NOT_EXIST(), 0 );
+ }
+
+ retval[k].type = impl->type_i (ACE_ENV_SINGLE_ARG_PARAMETER);
+ ACE_CHECK_RETURN (0);
+
+ // If this union contains a nested union (of another type) at
+ // some level, the above code will have changed the section key
+ // so we have to replace it with the value we stored above.
+ this->section_key (key_holder);
+ }
+
+ return retval._retn ();
+}
+
+void
+TAO_UnionDef_i::members (const CORBA::UnionMemberSeq &members
+ ACE_ENV_ARG_DECL)
+ ACE_THROW_SPEC ((CORBA::SystemException))
+{
+ TAO_IFR_WRITE_GUARD;
+
+ this->update_key (ACE_ENV_SINGLE_ARG_PARAMETER);
+ ACE_CHECK;
+
+ this->members_i (members
+ ACE_ENV_ARG_PARAMETER);
+}
+
+void
+TAO_UnionDef_i::members_i (const CORBA::UnionMemberSeq &members
+ ACE_ENV_ARG_DECL)
+ ACE_THROW_SPEC ((CORBA::SystemException))
+{
+ // Destroy our old members, both refs and defns.
+ TAO_Container_i::destroy_i (ACE_ENV_SINGLE_ARG_PARAMETER);
+ ACE_CHECK;
+
+ ACE_TString section_name;
+ ACE_Configuration_Section_Key refs_key;
+
+ this->repo_->config ()->open_section (this->section_key_,
+ "refs",
+ 1,
+ refs_key);
+
+ // Store the new member count of the union.
+ CORBA::ULong count = members.length ();
+ this->repo_->config ()->set_integer_value (refs_key,
+ "count",
+ count);
+ char *member_path = 0;
+
+ // Create a section for each member. We store the member
+ // name, its label value, and the path to its database entry.
+ for (CORBA::ULong i = 0; i < count; i++)
+ {
+ ACE_Configuration_Section_Key member_key;
+ char *stringified = TAO_IFR_Service_Utils::int_to_string (i);
+ this->repo_->config ()->open_section (refs_key,
+ stringified,
+ 1,
+ member_key);
+
+ this->repo_->config ()->set_string_value (member_key,
+ "name",
+ members[i].name.in ());
+
+ member_path =
+ TAO_IFR_Service_Utils::reference_to_path (members[i].type_def.in ());
+
+ this->repo_->config ()->set_string_value (member_key,
+ "path",
+ member_path);
+
+ this->store_label (member_key,
+ members[i].label
+ ACE_ENV_ARG_PARAMETER);
+ }
+}
+
+void
+TAO_UnionDef_i::fetch_label (const ACE_Configuration_Section_Key member_key,
+ CORBA::UnionMember &member
+ ACE_ENV_ARG_DECL)
+ ACE_THROW_SPEC ((CORBA::SystemException))
+{
+ ACE_Configuration::VALUETYPE vt;
+ this->repo_->config ()->find_value (member_key,
+ "label",
+ vt);
+
+ if (vt == ACE_Configuration::STRING)
+ {
+ member.label <<= CORBA::Any::from_octet (0);
+
+ return;
+ }
+
+ u_int value = 0;
+ this->repo_->config ()->get_integer_value (member_key,
+ "label",
+ value);
+
+ CORBA::TypeCode_var tc =
+ this->discriminator_type_i (ACE_ENV_SINGLE_ARG_PARAMETER);
+ ACE_CHECK;
+
+ CORBA::TCKind kind = tc->kind (ACE_ENV_SINGLE_ARG_PARAMETER);
+ ACE_CHECK;
+
+ switch (kind)
+ {
+ case CORBA::tk_char:
+ member.label <<= CORBA::Any::from_char (static_cast<CORBA::Char> (value));
+ break;
+ case CORBA::tk_wchar:
+ member.label <<= CORBA::Any::from_wchar (static_cast<CORBA::WChar> (value));
+ break;
+ case CORBA::tk_boolean:
+ member.label <<= CORBA::Any::from_boolean (static_cast<CORBA::Boolean> (value));
+ break;
+ case CORBA::tk_short:
+ member.label <<= static_cast<CORBA::Short> (value);
+ break;
+ case CORBA::tk_ushort:
+ member.label <<= static_cast<CORBA::UShort> (value);
+ break;
+ case CORBA::tk_long:
+ member.label <<= static_cast<CORBA::Long> (value);
+ break;
+ case CORBA::tk_ulong:
+ member.label <<= static_cast<CORBA::ULong> (value);
+ break;
+#if !defined (ACE_LACKS_LONGLONG_T)
+ case CORBA::tk_longlong:
+ member.label <<= static_cast<CORBA::LongLong> (value);
+ break;
+#endif /* ACE_LACKS_LONGLONG_T */
+ case CORBA::tk_ulonglong:
+ member.label <<= static_cast<CORBA::ULongLong> (value);
+ break;
+ case CORBA::tk_enum:
+ {
+ TAO_OutputCDR cdr;
+ cdr.write_ulong (static_cast<CORBA::ULong> (value));
+ TAO_InputCDR in_cdr (cdr);
+ TAO::Unknown_IDL_Type *impl = 0;
+ ACE_NEW (impl,
+ TAO::Unknown_IDL_Type (tc.in (),
+ in_cdr));
+ member.label.replace (impl);
+ break;
+ }
+ default:
+ break;
+ }
+}
+
+TAO_END_VERSIONED_NAMESPACE_DECL
diff --git a/TAO/orbsvcs/orbsvcs/IFRService/UnionDef_i.h b/TAO/orbsvcs/orbsvcs/IFRService/UnionDef_i.h
new file mode 100644
index 00000000000..feace1c2ec5
--- /dev/null
+++ b/TAO/orbsvcs/orbsvcs/IFRService/UnionDef_i.h
@@ -0,0 +1,153 @@
+// -*- C++ -*-
+
+// $Id$
+
+// ============================================================================
+//
+// = LIBRARY
+// TAO/orbsvcs/orbsvcs/IFRService
+//
+// = FILENAME
+// UnionDef_i.h
+//
+// = DESCRIPTION
+// UnionDef servant class.
+//
+// = AUTHOR
+// Jeff Parsons <parsons@cs.wustl.edu>
+//
+// ============================================================================
+
+#ifndef TAO_UNIONDEF_I_H
+#define TAO_UNIONDEF_I_H
+
+#include "orbsvcs/IFRService/TypedefDef_i.h"
+#include "orbsvcs/IFRService/Container_i.h"
+#include "orbsvcs/IFRService/ifr_service_export.h"
+
+#if !defined (ACE_LACKS_PRAGMA_ONCE)
+# pragma once
+#endif /* ACE_LACKS_PRAGMA_ONCE */
+
+#if defined(_MSC_VER)
+#pragma warning(push)
+#pragma warning(disable:4250)
+#endif /* _MSC_VER */
+
+TAO_BEGIN_VERSIONED_NAMESPACE_DECL
+
+class TAO_IFRService_Export TAO_UnionDef_i : public virtual TAO_TypedefDef_i,
+ public virtual TAO_Container_i
+{
+ // = TITLE
+ // TAO_UnionDef_i
+ //
+ // = DESCRIPTION
+ // Represents an OMG IDL union definition.
+ //
+public:
+ TAO_UnionDef_i (TAO_Repository_i *repo);
+ // Constructor
+
+ virtual ~TAO_UnionDef_i (void);
+ // Destructor
+
+ virtual CORBA::DefinitionKind def_kind (
+ ACE_ENV_SINGLE_ARG_DECL_WITH_DEFAULTS)
+
+ ACE_THROW_SPEC ((CORBA::SystemException));
+ // Return our definition kind.
+
+ virtual void destroy (
+ ACE_ENV_SINGLE_ARG_DECL_WITH_DEFAULTS)
+
+ ACE_THROW_SPEC ((CORBA::SystemException));
+ // Remove the repository entry and its contents.
+
+ virtual void destroy_i (
+ ACE_ENV_SINGLE_ARG_DECL_WITH_DEFAULTS)
+
+ ACE_THROW_SPEC ((CORBA::SystemException));
+
+ virtual CORBA::TypeCode_ptr type (
+ ACE_ENV_SINGLE_ARG_DECL_WITH_DEFAULTS)
+
+ ACE_THROW_SPEC ((CORBA::SystemException));
+ // From IDLType_i's pure virtual function.
+
+ virtual CORBA::TypeCode_ptr type_i (
+ ACE_ENV_SINGLE_ARG_DECL_WITH_DEFAULTS)
+
+ ACE_THROW_SPEC ((CORBA::SystemException));
+ // From IDLType_i's pure virtual function.
+
+ virtual CORBA::TypeCode_ptr discriminator_type (
+ ACE_ENV_SINGLE_ARG_DECL_WITH_DEFAULTS)
+
+ ACE_THROW_SPEC ((CORBA::SystemException));
+
+ CORBA::TypeCode_ptr discriminator_type_i (
+ ACE_ENV_SINGLE_ARG_DECL_WITH_DEFAULTS)
+
+ ACE_THROW_SPEC ((CORBA::SystemException));
+
+ virtual CORBA::IDLType_ptr discriminator_type_def (
+ ACE_ENV_SINGLE_ARG_DECL_WITH_DEFAULTS)
+
+ ACE_THROW_SPEC ((CORBA::SystemException));
+
+ CORBA::IDLType_ptr discriminator_type_def_i (
+ ACE_ENV_SINGLE_ARG_DECL_WITH_DEFAULTS)
+
+ ACE_THROW_SPEC ((CORBA::SystemException));
+
+ virtual void discriminator_type_def (
+ CORBA::IDLType_ptr discriminator_type_def
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS)
+
+ ACE_THROW_SPEC ((CORBA::SystemException));
+
+ void discriminator_type_def_i (
+ CORBA::IDLType_ptr discriminator_type_def
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS)
+
+ ACE_THROW_SPEC ((CORBA::SystemException));
+
+ virtual CORBA::UnionMemberSeq *members (
+ ACE_ENV_SINGLE_ARG_DECL_WITH_DEFAULTS)
+
+ ACE_THROW_SPEC ((CORBA::SystemException));
+
+ CORBA::UnionMemberSeq *members_i (
+ ACE_ENV_SINGLE_ARG_DECL_WITH_DEFAULTS)
+
+ ACE_THROW_SPEC ((CORBA::SystemException));
+
+ virtual void members (
+ const CORBA::UnionMemberSeq &members
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS)
+
+ ACE_THROW_SPEC ((CORBA::SystemException));
+
+ void members_i (
+ const CORBA::UnionMemberSeq &members
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS)
+
+ ACE_THROW_SPEC ((CORBA::SystemException));
+
+private:
+ void fetch_label (
+ const ACE_Configuration_Section_Key member_key,
+ CORBA::UnionMember &member
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS)
+ ACE_THROW_SPEC ((CORBA::SystemException));
+ // Used by members() to get each member's label value.
+};
+
+TAO_END_VERSIONED_NAMESPACE_DECL
+
+#if defined(_MSC_VER)
+#pragma warning(pop)
+#endif /* _MSC_VER */
+
+#endif /* TAO_UNIONDEF_I_H */
diff --git a/TAO/orbsvcs/orbsvcs/IFRService/UsesDef_i.cpp b/TAO/orbsvcs/orbsvcs/IFRService/UsesDef_i.cpp
new file mode 100644
index 00000000000..833a7fd0c6a
--- /dev/null
+++ b/TAO/orbsvcs/orbsvcs/IFRService/UsesDef_i.cpp
@@ -0,0 +1,214 @@
+// $Id$
+
+#include "orbsvcs/IFRService/Repository_i.h"
+#include "orbsvcs/IFRService/UsesDef_i.h"
+#include "orbsvcs/IFRService/IFR_Service_Utils_T.h"
+#include "orbsvcs/IFRService/IFR_Service_Utils.h"
+
+#include "ace/SString.h"
+
+
+ACE_RCSID (IFRService,
+ UsesDef_i,
+ "$Id$")
+
+TAO_BEGIN_VERSIONED_NAMESPACE_DECL
+
+TAO_UsesDef_i::TAO_UsesDef_i (TAO_Repository_i *repo)
+ : TAO_IRObject_i (repo),
+ TAO_Contained_i (repo)
+{
+}
+
+TAO_UsesDef_i::~TAO_UsesDef_i (void)
+{
+}
+
+CORBA::DefinitionKind
+TAO_UsesDef_i::def_kind (ACE_ENV_SINGLE_ARG_DECL_NOT_USED)
+ ACE_THROW_SPEC ((CORBA::SystemException))
+{
+ return CORBA::dk_Uses;
+}
+
+CORBA::Contained::Description *
+TAO_UsesDef_i::describe (ACE_ENV_SINGLE_ARG_DECL)
+ ACE_THROW_SPEC ((CORBA::SystemException))
+{
+ TAO_IFR_READ_GUARD_RETURN (0);
+
+ this->update_key (ACE_ENV_SINGLE_ARG_PARAMETER);
+ ACE_CHECK_RETURN (0);
+
+ return this->describe_i (ACE_ENV_SINGLE_ARG_PARAMETER);
+}
+
+CORBA::Contained::Description *
+TAO_UsesDef_i::describe_i (ACE_ENV_SINGLE_ARG_DECL)
+ ACE_THROW_SPEC ((CORBA::SystemException))
+{
+ CORBA::ComponentIR::UsesDescription ud;
+ TAO_IFR_Desc_Utils<CORBA::ComponentIR::UsesDescription,
+ TAO_UsesDef_i>::fill_desc_begin (
+ ud,
+ this->repo_,
+ this->section_key_
+ ACE_ENV_ARG_PARAMETER
+ );
+ ACE_CHECK_RETURN (0);
+
+ ACE_TString base_type_id;
+ this->repo_->config ()->get_string_value (this->section_key_,
+ "base_type",
+ base_type_id);
+ ud.interface_type = base_type_id.fast_rep ();
+ ud.is_multiple = this->is_multiple_i (ACE_ENV_SINGLE_ARG_PARAMETER);
+ ACE_CHECK_RETURN (0);
+
+ CORBA::Contained::Description *retval = 0;
+ ACE_NEW_RETURN (retval,
+ CORBA::Contained::Description,
+ 0);
+
+ retval->kind = CORBA::dk_Uses;
+ retval->value <<= ud;
+ return retval;
+}
+
+CORBA::InterfaceDef_ptr
+TAO_UsesDef_i::interface_type (ACE_ENV_SINGLE_ARG_DECL)
+ ACE_THROW_SPEC ((CORBA::SystemException))
+{
+ TAO_IFR_READ_GUARD_RETURN (CORBA::InterfaceDef::_nil ());
+
+ this->update_key (ACE_ENV_SINGLE_ARG_PARAMETER);
+ ACE_CHECK_RETURN (CORBA::InterfaceDef::_nil ());
+
+ return this->interface_type_i (ACE_ENV_SINGLE_ARG_PARAMETER);
+}
+
+CORBA::InterfaceDef_ptr
+TAO_UsesDef_i::interface_type_i (ACE_ENV_SINGLE_ARG_DECL)
+ ACE_THROW_SPEC ((CORBA::SystemException))
+{
+ ACE_TString holder;
+ this->repo_->config ()->get_string_value (this->section_key_,
+ "base_type",
+ holder);
+ this->repo_->config ()->get_string_value (this->repo_->repo_ids_key (),
+ holder.fast_rep (),
+ holder);
+ CORBA::Object_var obj =
+ TAO_IFR_Service_Utils::path_to_ir_object (holder,
+ this->repo_
+ ACE_ENV_ARG_PARAMETER);
+ ACE_CHECK_RETURN (CORBA::InterfaceDef::_nil ());
+
+ return CORBA::InterfaceDef::_narrow (obj.in ()
+ ACE_ENV_ARG_PARAMETER);
+}
+
+void
+TAO_UsesDef_i::interface_type (
+ CORBA::InterfaceDef_ptr interface_type
+ ACE_ENV_ARG_DECL
+ )
+ ACE_THROW_SPEC ((CORBA::SystemException))
+{
+ TAO_IFR_WRITE_GUARD;
+
+ this->update_key (ACE_ENV_SINGLE_ARG_PARAMETER);
+ ACE_CHECK;
+
+ this->interface_type_i (interface_type
+ ACE_ENV_ARG_PARAMETER);
+}
+
+void
+TAO_UsesDef_i::interface_type_i (
+ CORBA::InterfaceDef_ptr interface_type
+ ACE_ENV_ARG_DECL_NOT_USED
+ )
+ ACE_THROW_SPEC ((CORBA::SystemException))
+{
+ this->repo_->config ()->remove_value (this->section_key_,
+ "base_type");
+
+ if (CORBA::is_nil (interface_type))
+ {
+ return;
+ }
+
+ const char *tmp =
+ TAO_IFR_Service_Utils::reference_to_path (interface_type);
+
+ ACE_Configuration_Section_Key new_key;
+ this->repo_->config ()->expand_path (this->repo_->root_key (),
+ tmp,
+ new_key,
+ 0);
+
+ ACE_TString holder;
+ this->repo_->config ()->get_string_value (new_key,
+ "id",
+ holder);
+
+ this->repo_->config ()->set_string_value (
+ this->section_key_,
+ "base_type",
+ holder
+ );
+}
+
+CORBA::Boolean
+TAO_UsesDef_i::is_multiple (ACE_ENV_SINGLE_ARG_DECL)
+ ACE_THROW_SPEC ((CORBA::SystemException))
+{
+ TAO_IFR_READ_GUARD_RETURN (0);
+
+ this->update_key (ACE_ENV_SINGLE_ARG_PARAMETER);
+ ACE_CHECK_RETURN (0);
+
+ return this->is_multiple_i (ACE_ENV_SINGLE_ARG_PARAMETER);
+}
+
+CORBA::Boolean
+TAO_UsesDef_i::is_multiple_i (ACE_ENV_SINGLE_ARG_DECL_NOT_USED)
+ ACE_THROW_SPEC ((CORBA::SystemException))
+{
+ CORBA::ULong val = 0;
+ this->repo_->config ()->get_integer_value (this->section_key_,
+ "is_multiple",
+ val);
+ return static_cast<CORBA::Boolean> (val);
+}
+
+void
+TAO_UsesDef_i::is_multiple (
+ CORBA::Boolean is_multiple
+ ACE_ENV_ARG_DECL
+ )
+ ACE_THROW_SPEC ((CORBA::SystemException))
+{
+ TAO_IFR_WRITE_GUARD;
+
+ this->update_key (ACE_ENV_SINGLE_ARG_PARAMETER);
+ ACE_CHECK;
+
+ this->is_multiple_i (is_multiple
+ ACE_ENV_ARG_PARAMETER);
+}
+
+void
+TAO_UsesDef_i::is_multiple_i (
+ CORBA::Boolean is_multiple
+ ACE_ENV_ARG_DECL_NOT_USED
+ )
+ ACE_THROW_SPEC ((CORBA::SystemException))
+{
+ this->repo_->config ()->set_integer_value (this->section_key_,
+ "is_multiple",
+ is_multiple);
+}
+
+TAO_END_VERSIONED_NAMESPACE_DECL
diff --git a/TAO/orbsvcs/orbsvcs/IFRService/UsesDef_i.h b/TAO/orbsvcs/orbsvcs/IFRService/UsesDef_i.h
new file mode 100644
index 00000000000..c0daa00be10
--- /dev/null
+++ b/TAO/orbsvcs/orbsvcs/IFRService/UsesDef_i.h
@@ -0,0 +1,122 @@
+// -*- C++ -*-
+
+// $Id$
+
+// ============================================================================
+//
+// = LIBRARY
+// TAO/orbsvcs/orbsvcs/IFRService
+//
+// = FILENAME
+// UsesDef_i.h
+//
+// = DESCRIPTION
+// UsesDef servant class.
+//
+// = AUTHOR
+// Jeff Parsons <parsons@cs.wustl.edu>
+//
+// ============================================================================
+
+#ifndef TAO_USESDEF_I_H
+#define TAO_USESDEF_I_H
+
+#include "orbsvcs/IFRService/Contained_i.h"
+#include "orbsvcs/IFRService/ifr_service_export.h"
+
+#if !defined (ACE_LACKS_PRAGMA_ONCE)
+# pragma once
+#endif /* ACE_LACKS_PRAGMA_ONCE */
+
+#if defined(_MSC_VER)
+#pragma warning(push)
+#pragma warning(disable:4250)
+#endif /* _MSC_VER */
+
+TAO_BEGIN_VERSIONED_NAMESPACE_DECL
+
+class TAO_IFRService_Export TAO_UsesDef_i : public virtual TAO_Contained_i
+{
+ // = TITLE
+ // TAO_UsesDef_i
+ //
+ // = DESCRIPTION
+ // Represents an interface that is used by a component.
+ //
+public:
+ TAO_UsesDef_i (TAO_Repository_i *repo);
+ // Constructor
+
+ virtual ~TAO_UsesDef_i (void);
+ // Destructor
+
+ virtual CORBA::DefinitionKind def_kind (
+ ACE_ENV_SINGLE_ARG_DECL_WITH_DEFAULTS
+ )
+ ACE_THROW_SPEC ((CORBA::SystemException));
+ // Return our definition kind.
+
+ virtual CORBA::Contained::Description *describe (
+ ACE_ENV_SINGLE_ARG_DECL_WITH_DEFAULTS
+ )
+ ACE_THROW_SPEC ((CORBA::SystemException));
+ // From Contained_i's pure virtual function.
+
+ virtual CORBA::Contained::Description *describe_i (
+ ACE_ENV_SINGLE_ARG_DECL_WITH_DEFAULTS
+ )
+ ACE_THROW_SPEC ((CORBA::SystemException));
+ // From Contained_i's pure virtual function.
+
+ virtual CORBA::InterfaceDef_ptr interface_type (
+ ACE_ENV_SINGLE_ARG_DECL_WITH_DEFAULTS
+ )
+ ACE_THROW_SPEC ((CORBA::SystemException));
+
+ virtual void interface_type (
+ CORBA::InterfaceDef_ptr interface_type
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS
+ )
+ ACE_THROW_SPEC ((CORBA::SystemException));
+
+ void interface_type_i (
+ CORBA::InterfaceDef_ptr interface_type
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS
+ )
+ ACE_THROW_SPEC ((CORBA::SystemException));
+
+ CORBA::InterfaceDef_ptr interface_type_i (
+ ACE_ENV_SINGLE_ARG_DECL_WITH_DEFAULTS
+ )
+ ACE_THROW_SPEC ((CORBA::SystemException));
+
+ virtual CORBA::Boolean is_multiple (
+ ACE_ENV_SINGLE_ARG_DECL_WITH_DEFAULTS
+ )
+ ACE_THROW_SPEC ((CORBA::SystemException));
+
+ CORBA::Boolean is_multiple_i (
+ ACE_ENV_SINGLE_ARG_DECL_WITH_DEFAULTS
+ )
+ ACE_THROW_SPEC ((CORBA::SystemException));
+
+ virtual void is_multiple (
+ CORBA::Boolean is_multiple
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS
+ )
+ ACE_THROW_SPEC ((CORBA::SystemException));
+
+ void is_multiple_i (
+ CORBA::Boolean is_multiple
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS
+ )
+ ACE_THROW_SPEC ((CORBA::SystemException));
+};
+
+TAO_END_VERSIONED_NAMESPACE_DECL
+
+#if defined(_MSC_VER)
+#pragma warning(pop)
+#endif /* _MSC_VER */
+
+#endif /* TAO_USESDEF_I_H */
diff --git a/TAO/orbsvcs/orbsvcs/IFRService/ValueBoxDef_i.cpp b/TAO/orbsvcs/orbsvcs/IFRService/ValueBoxDef_i.cpp
new file mode 100644
index 00000000000..c8a710dcc23
--- /dev/null
+++ b/TAO/orbsvcs/orbsvcs/IFRService/ValueBoxDef_i.cpp
@@ -0,0 +1,140 @@
+// $Id$
+
+#include "orbsvcs/IFRService/ValueBoxDef_i.h"
+#include "orbsvcs/IFRService/Repository_i.h"
+#include "orbsvcs/IFRService/IFR_Service_Utils.h"
+
+#include "ace/Auto_Ptr.h"
+#include "ace/SString.h"
+
+
+ACE_RCSID (IFRService,
+ ValueBoxDef_i,
+ "$Id$")
+
+TAO_BEGIN_VERSIONED_NAMESPACE_DECL
+
+TAO_ValueBoxDef_i::TAO_ValueBoxDef_i (
+ TAO_Repository_i *repo
+ )
+ : TAO_IRObject_i (repo),
+ TAO_Contained_i (repo),
+ TAO_IDLType_i (repo),
+ TAO_TypedefDef_i (repo)
+{
+}
+
+TAO_ValueBoxDef_i::~TAO_ValueBoxDef_i (void)
+{
+}
+
+CORBA::DefinitionKind
+TAO_ValueBoxDef_i::def_kind (ACE_ENV_SINGLE_ARG_DECL_NOT_USED)
+ ACE_THROW_SPEC ((CORBA::SystemException))
+{
+ return CORBA::dk_ValueBox;
+}
+
+CORBA::TypeCode_ptr
+TAO_ValueBoxDef_i::type (ACE_ENV_SINGLE_ARG_DECL)
+ ACE_THROW_SPEC ((CORBA::SystemException))
+{
+ TAO_IFR_READ_GUARD_RETURN (CORBA::TypeCode::_nil ());
+
+ this->update_key (ACE_ENV_SINGLE_ARG_PARAMETER);
+ ACE_CHECK_RETURN (CORBA::TypeCode::_nil ());
+
+ return this->type_i (ACE_ENV_SINGLE_ARG_PARAMETER);
+}
+
+CORBA::TypeCode_ptr
+TAO_ValueBoxDef_i::type_i (ACE_ENV_SINGLE_ARG_DECL)
+ ACE_THROW_SPEC ((CORBA::SystemException))
+{
+ ACE_TString id;
+ this->repo_->config ()->get_string_value (this->section_key_,
+ "id",
+ id);
+
+ ACE_TString name;
+ this->repo_->config ()->get_string_value (this->section_key_,
+ "name",
+ name);
+
+ ACE_TString boxed_type_path;
+ this->repo_->config ()->get_string_value (this->section_key_,
+ "boxed_type",
+ boxed_type_path);
+
+ TAO_IDLType_i *impl =
+ TAO_IFR_Service_Utils::path_to_idltype (boxed_type_path,
+ this->repo_);
+
+ CORBA::TypeCode_var tc = impl->type_i (ACE_ENV_SINGLE_ARG_PARAMETER);
+ ACE_CHECK_RETURN (CORBA::TypeCode::_nil ());
+
+ return this->repo_->tc_factory ()->create_value_box_tc (id.c_str (),
+ name.c_str (),
+ tc.in ()
+ ACE_ENV_ARG_PARAMETER);
+}
+
+CORBA::IDLType_ptr
+TAO_ValueBoxDef_i::original_type_def (ACE_ENV_SINGLE_ARG_DECL)
+ ACE_THROW_SPEC ((CORBA::SystemException))
+{
+ TAO_IFR_READ_GUARD_RETURN (CORBA::IDLType::_nil ());
+
+ this->update_key (ACE_ENV_SINGLE_ARG_PARAMETER);
+ ACE_CHECK_RETURN (CORBA::IDLType::_nil ());
+
+ return this->original_type_def_i (ACE_ENV_SINGLE_ARG_PARAMETER);
+}
+
+CORBA::IDLType_ptr
+TAO_ValueBoxDef_i::original_type_def_i (ACE_ENV_SINGLE_ARG_DECL)
+ ACE_THROW_SPEC ((CORBA::SystemException))
+{
+ ACE_TString boxed_type_path;
+ this->repo_->config ()->get_string_value (this->section_key_,
+ "boxed_type",
+ boxed_type_path);
+
+ CORBA::Object_var obj =
+ TAO_IFR_Service_Utils::path_to_ir_object (boxed_type_path,
+ this->repo_
+ ACE_ENV_ARG_PARAMETER);
+ ACE_CHECK_RETURN (CORBA::IDLType::_nil ());
+
+ return CORBA::IDLType::_narrow (obj.in ()
+ ACE_ENV_ARG_PARAMETER);
+}
+
+void
+TAO_ValueBoxDef_i::original_type_def (CORBA::IDLType_ptr original_type_def
+ ACE_ENV_ARG_DECL)
+ ACE_THROW_SPEC ((CORBA::SystemException))
+{
+ TAO_IFR_WRITE_GUARD;
+
+ this->update_key (ACE_ENV_SINGLE_ARG_PARAMETER);
+ ACE_CHECK;
+
+ this->original_type_def_i (original_type_def
+ ACE_ENV_ARG_PARAMETER);
+}
+
+void
+TAO_ValueBoxDef_i::original_type_def_i (CORBA::IDLType_ptr original_type_def
+ ACE_ENV_ARG_DECL_NOT_USED)
+ ACE_THROW_SPEC ((CORBA::SystemException))
+{
+ char *boxed_type =
+ TAO_IFR_Service_Utils::reference_to_path (original_type_def);
+
+ this->repo_->config ()->set_string_value (this->section_key_,
+ "boxed_type",
+ boxed_type);
+}
+
+TAO_END_VERSIONED_NAMESPACE_DECL
diff --git a/TAO/orbsvcs/orbsvcs/IFRService/ValueBoxDef_i.h b/TAO/orbsvcs/orbsvcs/IFRService/ValueBoxDef_i.h
new file mode 100644
index 00000000000..9fd68ca1cc8
--- /dev/null
+++ b/TAO/orbsvcs/orbsvcs/IFRService/ValueBoxDef_i.h
@@ -0,0 +1,101 @@
+// -*- C++ -*-
+
+// $Id$
+
+// ============================================================================
+//
+// = LIBRARY
+// TAO/orbsvcs/orbsvcs/IFRService
+//
+// = FILENAME
+// ValueBoxDef_i.h
+//
+// = DESCRIPTION
+// ValueBoxDef servant class.
+//
+// = AUTHOR
+// Jeff Parsons <parsons@cs.wustl.edu>
+//
+// ============================================================================
+
+#ifndef TAO_VALUEBOXDEF_I_H
+#define TAO_VALUEBOXDEF_I_H
+
+#include "orbsvcs/IFRService/TypedefDef_i.h"
+#include "orbsvcs/IFRService/ifr_service_export.h"
+
+#if !defined (ACE_LACKS_PRAGMA_ONCE)
+# pragma once
+#endif /* ACE_LACKS_PRAGMA_ONCE */
+
+#if defined(_MSC_VER)
+#pragma warning(push)
+#pragma warning(disable:4250)
+#endif /* _MSC_VER */
+
+TAO_BEGIN_VERSIONED_NAMESPACE_DECL
+
+class TAO_IFRService_Export TAO_ValueBoxDef_i : public virtual TAO_TypedefDef_i
+{
+public:
+ // = TITLE
+ // TAO_ValueBoxDef_i
+ //
+ // = DESCRIPTION
+ // Represents an value box definition.
+ //
+public:
+ TAO_ValueBoxDef_i (TAO_Repository_i *repo);
+ // Constructor
+
+ virtual ~TAO_ValueBoxDef_i (void);
+ // Destructor
+
+ virtual CORBA::DefinitionKind def_kind (
+ ACE_ENV_SINGLE_ARG_DECL_WITH_DEFAULTS)
+
+ ACE_THROW_SPEC ((CORBA::SystemException));
+ // Return our definition kind.
+
+ virtual CORBA::TypeCode_ptr type (
+ ACE_ENV_SINGLE_ARG_DECL_WITH_DEFAULTS)
+
+ ACE_THROW_SPEC ((CORBA::SystemException));
+ // From IDLType_i's pure virtual function.
+
+ virtual CORBA::TypeCode_ptr type_i (
+ ACE_ENV_SINGLE_ARG_DECL_WITH_DEFAULTS)
+
+ ACE_THROW_SPEC ((CORBA::SystemException));
+ // From IDLType_i's pure virtual function.
+
+ virtual CORBA::IDLType_ptr original_type_def (
+ ACE_ENV_SINGLE_ARG_DECL_WITH_DEFAULTS)
+
+ ACE_THROW_SPEC ((CORBA::SystemException));
+
+ CORBA::IDLType_ptr original_type_def_i (
+ ACE_ENV_SINGLE_ARG_DECL_WITH_DEFAULTS)
+
+ ACE_THROW_SPEC ((CORBA::SystemException));
+
+ virtual void original_type_def (
+ CORBA::IDLType_ptr original_type_def
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS)
+
+ ACE_THROW_SPEC ((CORBA::SystemException));
+
+ void original_type_def_i (
+ CORBA::IDLType_ptr original_type_def
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS)
+
+ ACE_THROW_SPEC ((CORBA::SystemException));
+};
+
+TAO_END_VERSIONED_NAMESPACE_DECL
+
+#if defined(_MSC_VER)
+#pragma warning(pop)
+#endif /* _MSC_VER */
+
+#endif /* TAO_VALUEBOXDEF_I_H */
diff --git a/TAO/orbsvcs/orbsvcs/IFRService/ValueDef_i.cpp b/TAO/orbsvcs/orbsvcs/IFRService/ValueDef_i.cpp
new file mode 100644
index 00000000000..d4ff826a40b
--- /dev/null
+++ b/TAO/orbsvcs/orbsvcs/IFRService/ValueDef_i.cpp
@@ -0,0 +1,1857 @@
+// $Id$
+
+#include "orbsvcs/IFRService/Repository_i.h"
+#include "orbsvcs/IFRService/ValueDef_i.h"
+#include "orbsvcs/IFRService/AttributeDef_i.h"
+#include "orbsvcs/IFRService/OperationDef_i.h"
+#include "orbsvcs/IFRService/IFR_Service_Utils.h"
+#include "orbsvcs/IFRService/IFR_Service_Utils_T.h"
+
+#include "ace/SString.h"
+
+
+ACE_RCSID (IFRService,
+ ValueDef_i,
+ "$Id$")
+
+TAO_BEGIN_VERSIONED_NAMESPACE_DECL
+
+TAO_ValueDef_i::TAO_ValueDef_i (TAO_Repository_i *repo)
+ : TAO_IRObject_i (repo),
+ TAO_Container_i (repo),
+ TAO_Contained_i (repo),
+ TAO_IDLType_i (repo)
+{
+}
+
+TAO_ValueDef_i::~TAO_ValueDef_i (void)
+{
+}
+
+CORBA::DefinitionKind
+TAO_ValueDef_i::def_kind (ACE_ENV_SINGLE_ARG_DECL_NOT_USED)
+ ACE_THROW_SPEC ((CORBA::SystemException))
+{
+ return CORBA::dk_Value;
+}
+
+void
+TAO_ValueDef_i::destroy (ACE_ENV_SINGLE_ARG_DECL)
+ ACE_THROW_SPEC ((CORBA::SystemException))
+{
+ TAO_IFR_WRITE_GUARD;
+
+ this->update_key (ACE_ENV_SINGLE_ARG_PARAMETER);
+ ACE_CHECK;
+
+ this->destroy_i (ACE_ENV_SINGLE_ARG_PARAMETER);
+}
+
+void
+TAO_ValueDef_i::destroy_i (ACE_ENV_SINGLE_ARG_DECL)
+ ACE_THROW_SPEC ((CORBA::SystemException))
+{
+ this->TAO_Container_i::destroy_i (ACE_ENV_SINGLE_ARG_PARAMETER);
+ ACE_CHECK;
+
+ // These will get rid of the repo ids, which Contained_i::destroy()'s
+ // call to remove_section (recursive = 1) will not get, and also
+ // destroy the attribute's anonymous type, if any.
+
+ TAO_IFR_Generic_Utils<TAO_AttributeDef_i>::destroy_special (
+ "attrs",
+ this->repo_,
+ this->section_key_
+ ACE_ENV_ARG_PARAMETER
+ );
+ ACE_CHECK;
+
+ TAO_IFR_Generic_Utils<TAO_OperationDef_i>::destroy_special (
+ "ops",
+ this->repo_,
+ this->section_key_
+ ACE_ENV_ARG_PARAMETER
+ );
+ ACE_CHECK;
+}
+
+CORBA::Contained::Description *
+TAO_ValueDef_i::describe (ACE_ENV_SINGLE_ARG_DECL)
+ ACE_THROW_SPEC ((CORBA::SystemException))
+{
+ TAO_IFR_READ_GUARD_RETURN (0);
+
+ this->update_key (ACE_ENV_SINGLE_ARG_PARAMETER);
+ ACE_CHECK_RETURN (0);
+
+ return this->describe_i (ACE_ENV_SINGLE_ARG_PARAMETER);
+}
+
+CORBA::Contained::Description *
+TAO_ValueDef_i::describe_i (ACE_ENV_SINGLE_ARG_DECL)
+ ACE_THROW_SPEC ((CORBA::SystemException))
+{
+ CORBA::ValueDescription *vd = 0;
+ ACE_NEW_RETURN (vd,
+ CORBA::ValueDescription,
+ 0);
+ CORBA::ValueDescription_var safe_vd = vd;
+
+ this->fill_value_description (safe_vd.inout ()
+ ACE_ENV_ARG_PARAMETER);
+ ACE_CHECK_RETURN (0);
+
+ CORBA::Contained::Description *cd = 0;
+ ACE_NEW_RETURN (cd,
+ CORBA::Contained::Description,
+ 0);
+
+ cd->kind = CORBA::dk_Value;
+ cd->value <<= safe_vd._retn ();
+ return cd;
+}
+
+CORBA::TypeCode_ptr
+TAO_ValueDef_i::type (ACE_ENV_SINGLE_ARG_DECL)
+ ACE_THROW_SPEC ((CORBA::SystemException))
+{
+ TAO_IFR_READ_GUARD_RETURN (CORBA::TypeCode::_nil ());
+
+ this->update_key (ACE_ENV_SINGLE_ARG_PARAMETER);
+ ACE_CHECK_RETURN (CORBA::TypeCode::_nil ());
+
+ return this->type_i (ACE_ENV_SINGLE_ARG_PARAMETER);
+}
+
+CORBA::TypeCode_ptr
+TAO_ValueDef_i::type_i (ACE_ENV_SINGLE_ARG_DECL)
+ ACE_THROW_SPEC ((CORBA::SystemException))
+{
+ /// Since valuetype type codes may encapsultate the type code of a
+ /// base class, this call could be recursive, with the
+ /// ACE_Configuration_Section_Key replaced for each recursion. To
+ /// avoid this problem, the recursion is moved to a static utility
+ /// function.
+ return TAO_IFR_Service_Utils::gen_valuetype_tc_r (this->section_key_,
+ this->repo_
+ ACE_ENV_ARG_PARAMETER);
+}
+
+CORBA::InterfaceDefSeq *
+TAO_ValueDef_i::supported_interfaces (ACE_ENV_SINGLE_ARG_DECL)
+ ACE_THROW_SPEC ((CORBA::SystemException))
+{
+ TAO_IFR_READ_GUARD_RETURN (0);
+
+ this->update_key (ACE_ENV_SINGLE_ARG_PARAMETER);
+ ACE_CHECK_RETURN (0);
+
+ return this->supported_interfaces_i (ACE_ENV_SINGLE_ARG_PARAMETER);
+}
+
+CORBA::InterfaceDefSeq *
+TAO_ValueDef_i::supported_interfaces_i (ACE_ENV_SINGLE_ARG_DECL)
+ ACE_THROW_SPEC ((CORBA::SystemException))
+{
+ CORBA::InterfaceDefSeq *seq = 0;
+ ACE_NEW_RETURN (seq,
+ CORBA::InterfaceDefSeq,
+ 0);
+ CORBA::InterfaceDefSeq_var retval = seq;
+
+ ACE_Configuration_Section_Key supported_key;
+ int status =
+ this->repo_->config ()->open_section (this->section_key_,
+ "supported",
+ 0,
+ supported_key);
+
+ if (status != 0)
+ {
+ seq->length (0);
+ return retval._retn ();
+ }
+
+ CORBA::ULong count = 0;
+ this->repo_->config ()->get_integer_value (supported_key,
+ "count",
+ count);
+ seq->length (count);
+ char *stringified = 0;
+ ACE_TString holder;
+ CORBA::Object_var obj;
+
+ for (CORBA::ULong i = 0; i < count; ++i)
+ {
+ stringified = TAO_IFR_Service_Utils::int_to_string (i);
+ this->repo_->config ()->get_string_value (supported_key,
+ stringified,
+ holder);
+ this->repo_->config ()->get_string_value (this->repo_->repo_ids_key (),
+ holder.fast_rep (),
+ holder);
+ obj = TAO_IFR_Service_Utils::path_to_ir_object (holder,
+ this->repo_
+ ACE_ENV_ARG_PARAMETER);
+ ACE_CHECK_RETURN (0);
+
+ retval[i] = CORBA::InterfaceDef::_narrow (obj.in ()
+ ACE_ENV_ARG_PARAMETER);
+ ACE_CHECK_RETURN (0);
+ }
+
+ return retval._retn ();
+}
+
+void
+TAO_ValueDef_i::supported_interfaces (
+ const CORBA::InterfaceDefSeq &supported_interfaces
+ ACE_ENV_ARG_DECL
+ )
+ ACE_THROW_SPEC ((CORBA::SystemException))
+{
+ TAO_IFR_WRITE_GUARD;
+
+ this->update_key (ACE_ENV_SINGLE_ARG_PARAMETER);
+ ACE_CHECK;
+
+ this->supported_interfaces_i (supported_interfaces
+ ACE_ENV_ARG_PARAMETER);
+}
+
+void
+TAO_ValueDef_i::supported_interfaces_i (
+ const CORBA::InterfaceDefSeq &supported_interfaces
+ ACE_ENV_ARG_DECL
+ )
+ ACE_THROW_SPEC ((CORBA::SystemException))
+{
+ this->repo_->config ()->remove_section (this->section_key_,
+ "supported",
+ 0);
+ ACE_Configuration_Section_Key supported_key;
+ this->repo_->config ()->open_section (this->section_key_,
+ "supported",
+ 1,
+ supported_key);
+ CORBA::ULong count = supported_interfaces.length ();
+ this->repo_->config ()->set_integer_value (supported_key,
+ "count",
+ count);
+ char *stringified = 0;
+ const char *supported_id = 0;
+ const char *supported_path = 0;
+ CORBA::ULong kind = 0;
+ CORBA::Boolean concrete_seen = 0;
+ CORBA::DefinitionKind def_kind;
+
+ for (CORBA::ULong i = 0; i < count; ++i)
+ {
+ supported_path =
+ TAO_IFR_Service_Utils::reference_to_path (
+ supported_interfaces[i]
+ );
+
+ // Get the servant's key into the temporary key holder, because
+ // the name clash checker for base interfaces is static, and has
+ // no other way to know about a specific key.
+ this->repo_->config ()->expand_path (this->repo_->root_key (),
+ supported_path,
+ TAO_IFR_Service_Utils::tmp_key_,
+ 0);
+ this->repo_->config ()->get_integer_value (
+ TAO_IFR_Service_Utils::tmp_key_,
+ "def_kind",
+ kind
+ );
+ def_kind = static_cast<CORBA::DefinitionKind> (kind);
+
+ if (def_kind == CORBA::dk_Interface)
+ {
+ if (concrete_seen == 0)
+ {
+ concrete_seen = 1;
+ }
+ else
+ {
+ ACE_THROW (CORBA::BAD_PARAM (CORBA::OMGVMCID | 12,
+ CORBA::COMPLETED_NO));
+ return;
+ }
+ }
+
+ TAO_IFR_Service_Utils::name_exists (&TAO_ValueDef_i::name_clash,
+ this->section_key_,
+ this->repo_,
+ CORBA::dk_Value
+ ACE_ENV_ARG_PARAMETER);
+ ACE_CHECK;
+
+ stringified = TAO_IFR_Service_Utils::int_to_string (i);
+ supported_id = supported_interfaces[i]->_interface_repository_id ();
+ this->repo_->config ()->set_string_value (supported_key,
+ stringified,
+ supported_id);
+ }
+}
+
+CORBA::InitializerSeq *
+TAO_ValueDef_i::initializers (ACE_ENV_SINGLE_ARG_DECL)
+ ACE_THROW_SPEC ((CORBA::SystemException))
+{
+ TAO_IFR_READ_GUARD_RETURN (0);
+
+ this->update_key (ACE_ENV_SINGLE_ARG_PARAMETER);
+ ACE_CHECK_RETURN (0);
+
+ return this->initializers_i (ACE_ENV_SINGLE_ARG_PARAMETER);
+}
+
+CORBA::InitializerSeq *
+TAO_ValueDef_i::initializers_i (ACE_ENV_SINGLE_ARG_DECL)
+ ACE_THROW_SPEC ((CORBA::SystemException))
+{
+ CORBA::InitializerSeq *iseq = 0;
+ ACE_NEW_RETURN (iseq,
+ CORBA::InitializerSeq,
+ 0);
+ CORBA::InitializerSeq_var retval = iseq;
+
+ ACE_Configuration_Section_Key initializers_key;
+ int status =
+ this->repo_->config ()->open_section (this->section_key_,
+ "initializers",
+ 0,
+ initializers_key);
+
+ if (status != 0)
+ {
+ iseq->length (0);
+ return retval._retn ();
+ }
+
+ CORBA::ULong count = 0;
+ this->repo_->config ()->get_integer_value (initializers_key,
+ "count",
+ count);
+ iseq->length (count);
+ char *stringified = 0;
+ ACE_Configuration_Section_Key initializer_key, params_key, arg_key;
+ ACE_TString holder;
+ CORBA::ULong arg_count = 0;
+
+ for (CORBA::ULong i = 0; i < count; ++i)
+ {
+ stringified = TAO_IFR_Service_Utils::int_to_string (i);
+ this->repo_->config ()->open_section (initializers_key,
+ stringified,
+ 0,
+ initializer_key);
+ this->repo_->config ()->get_string_value (initializer_key,
+ "name",
+ holder);
+ retval[i].name = holder.fast_rep ();
+ status =
+ this->repo_->config ()->open_section (initializer_key,
+ "params",
+ 0,
+ params_key);
+
+ if (status != 0)
+ {
+ retval[i].members.length (0);
+ continue;
+ }
+
+ this->repo_->config ()->get_integer_value (params_key,
+ "count",
+ arg_count);
+ retval[i].members.length (arg_count);
+ CORBA::Object_var obj;
+
+ for (CORBA::ULong j = 0; j < arg_count; ++j)
+ {
+ stringified = TAO_IFR_Service_Utils::int_to_string (j);
+ this->repo_->config ()->open_section (params_key,
+ stringified,
+ 0,
+ arg_key);
+ this->repo_->config ()->get_string_value (arg_key,
+ "arg_name",
+ holder);
+ retval[i].members[j].name = holder.fast_rep ();
+ this->repo_->config ()->get_string_value (arg_key,
+ "arg_path",
+ holder);
+ TAO_IDLType_i *impl =
+ TAO_IFR_Service_Utils::path_to_idltype (holder,
+ this->repo_);
+ retval[i].members[j].type =
+ impl->type_i (ACE_ENV_SINGLE_ARG_PARAMETER);
+ ACE_CHECK_RETURN (0);
+
+ obj =
+ TAO_IFR_Service_Utils::path_to_ir_object (holder,
+ this->repo_
+ ACE_ENV_ARG_PARAMETER);
+ ACE_CHECK_RETURN (0);
+
+ retval[i].members[j].type_def =
+ CORBA::IDLType::_narrow (obj.in ()
+ ACE_ENV_ARG_PARAMETER);
+ ACE_CHECK_RETURN (0);
+ }
+ }
+
+ return retval._retn ();
+}
+
+void
+TAO_ValueDef_i::initializers (const CORBA::InitializerSeq &initializers
+ ACE_ENV_ARG_DECL)
+ ACE_THROW_SPEC ((CORBA::SystemException))
+{
+ TAO_IFR_WRITE_GUARD;
+
+ this->update_key (ACE_ENV_SINGLE_ARG_PARAMETER);
+ ACE_CHECK;
+
+ this->initializers_i (initializers
+ ACE_ENV_ARG_PARAMETER);
+}
+
+void
+TAO_ValueDef_i::initializers_i (const CORBA::InitializerSeq &initializers
+ ACE_ENV_ARG_DECL_NOT_USED)
+ ACE_THROW_SPEC ((CORBA::SystemException))
+{
+ this->repo_->config ()->remove_section (this->section_key_,
+ "initializers",
+ 1);
+ TAO_IFR_Generic_Utils<CORBA::InitializerSeq>::set_initializers (
+ initializers,
+ this->repo_->config (),
+ this->section_key_
+ );
+}
+
+CORBA::ValueDef_ptr
+TAO_ValueDef_i::base_value (ACE_ENV_SINGLE_ARG_DECL)
+ ACE_THROW_SPEC ((CORBA::SystemException))
+{
+ TAO_IFR_READ_GUARD_RETURN (CORBA::ValueDef::_nil ());
+
+ this->update_key (ACE_ENV_SINGLE_ARG_PARAMETER);
+ ACE_CHECK_RETURN (CORBA::ValueDef::_nil ());
+
+ return this->base_value_i (ACE_ENV_SINGLE_ARG_PARAMETER);
+}
+
+CORBA::ValueDef_ptr
+TAO_ValueDef_i::base_value_i (ACE_ENV_SINGLE_ARG_DECL)
+ ACE_THROW_SPEC ((CORBA::SystemException))
+{
+ ACE_TString holder;
+ int status =
+ this->repo_->config ()->get_string_value (this->section_key_,
+ "base_value",
+ holder);
+
+ if (status != 0)
+ {
+ return CORBA::ValueDef::_nil ();
+ }
+
+ this->repo_->config ()->get_string_value (this->repo_->repo_ids_key (),
+ holder.fast_rep (),
+ holder);
+ CORBA::Object_var obj =
+ TAO_IFR_Service_Utils::path_to_ir_object (holder,
+ this->repo_
+ ACE_ENV_ARG_PARAMETER);
+ ACE_CHECK_RETURN (CORBA::ValueDef::_nil ());
+
+ return CORBA::ValueDef::_narrow (obj.in ()
+ ACE_ENV_ARG_PARAMETER);
+}
+
+void
+TAO_ValueDef_i::base_value (CORBA::ValueDef_ptr base_value
+ ACE_ENV_ARG_DECL)
+ ACE_THROW_SPEC ((CORBA::SystemException))
+{
+ TAO_IFR_WRITE_GUARD;
+
+ this->update_key (ACE_ENV_SINGLE_ARG_PARAMETER);
+ ACE_CHECK;
+
+ this->base_value_i (base_value
+ ACE_ENV_ARG_PARAMETER);
+}
+
+void
+TAO_ValueDef_i::base_value_i (CORBA::ValueDef_ptr base_value
+ ACE_ENV_ARG_DECL)
+ ACE_THROW_SPEC ((CORBA::SystemException))
+{
+ if (CORBA::is_nil (base_value))
+ {
+ this->repo_->config ()->remove_value (this->section_key_,
+ "base_value");
+ return;
+ }
+
+ const char *base_path =
+ TAO_IFR_Service_Utils::reference_to_path (base_value);
+
+ // Get the servant's key into the temporary key holder, because
+ // the name clash checker for base valuetypes is static, and has
+ // no other way to know about a specific key.
+ this->repo_->config ()->expand_path (
+ this->repo_->root_key (),
+ base_path,
+ TAO_IFR_Service_Utils::tmp_key_,
+ 0
+ );
+ TAO_IFR_Service_Utils::name_exists (&TAO_ValueDef_i::name_clash,
+ this->section_key_,
+ this->repo_,
+ CORBA::dk_Value
+ ACE_ENV_ARG_PARAMETER);
+ ACE_CHECK;
+
+ this->repo_->config ()->set_string_value (
+ this->section_key_,
+ "base_value",
+ base_value->_interface_repository_id ()
+ );
+}
+
+CORBA::ValueDefSeq *
+TAO_ValueDef_i::abstract_base_values (ACE_ENV_SINGLE_ARG_DECL)
+ ACE_THROW_SPEC ((CORBA::SystemException))
+{
+ TAO_IFR_READ_GUARD_RETURN (0);
+
+ this->update_key (ACE_ENV_SINGLE_ARG_PARAMETER);
+ ACE_CHECK_RETURN (0);
+
+ return this->abstract_base_values_i (ACE_ENV_SINGLE_ARG_PARAMETER);
+}
+
+CORBA::ValueDefSeq *
+TAO_ValueDef_i::abstract_base_values_i (ACE_ENV_SINGLE_ARG_DECL)
+ ACE_THROW_SPEC ((CORBA::SystemException))
+{
+ CORBA::ValueDefSeq *vd_seq = 0;
+ ACE_NEW_RETURN (vd_seq,
+ CORBA::ValueDefSeq,
+ 0);
+ CORBA::ValueDefSeq_var retval = vd_seq;
+
+ ACE_Configuration_Section_Key bases_key;
+ int status =
+ this->repo_->config ()->open_section (this->section_key_,
+ "abstract_bases",
+ 0,
+ bases_key);
+
+ if (status != 0)
+ {
+ vd_seq->length (0);
+ return retval._retn ();
+ }
+
+ CORBA::ULong count = 0;
+ this->repo_->config ()->get_integer_value (bases_key,
+ "count",
+ count);
+ vd_seq->length (count);
+ char *stringified = 0;
+ ACE_TString holder;
+ CORBA::Object_var obj;
+
+ for (CORBA::ULong i = 0; i < count; ++i)
+ {
+ stringified = TAO_IFR_Service_Utils::int_to_string (i);
+ this->repo_->config ()->get_string_value (bases_key,
+ stringified,
+ holder);
+ this->repo_->config ()->get_string_value (this->repo_->repo_ids_key (),
+ holder.fast_rep (),
+ holder);
+ obj = TAO_IFR_Service_Utils::path_to_ir_object (holder,
+ this->repo_
+ ACE_ENV_ARG_PARAMETER);
+ ACE_CHECK_RETURN (0);
+
+ retval[i] = CORBA::ValueDef::_narrow (obj.in ()
+ ACE_ENV_ARG_PARAMETER);
+ ACE_CHECK_RETURN (0);
+ }
+
+ return retval._retn ();
+}
+
+void
+TAO_ValueDef_i::abstract_base_values (
+ const CORBA::ValueDefSeq &abstract_base_values
+ ACE_ENV_ARG_DECL
+ )
+ ACE_THROW_SPEC ((CORBA::SystemException))
+{
+ TAO_IFR_WRITE_GUARD;
+
+ this->update_key (ACE_ENV_SINGLE_ARG_PARAMETER);
+ ACE_CHECK;
+
+ this->abstract_base_values_i (abstract_base_values
+ ACE_ENV_ARG_PARAMETER);
+}
+
+void
+TAO_ValueDef_i::abstract_base_values_i (
+ const CORBA::ValueDefSeq &abstract_base_values
+ ACE_ENV_ARG_DECL
+ )
+ ACE_THROW_SPEC ((CORBA::SystemException))
+{
+ this->repo_->config ()->remove_section (this->section_key_,
+ "abstract_bases",
+ 0);
+ CORBA::ULong count = abstract_base_values.length ();
+
+ if (count == 0)
+ {
+ return;
+ }
+
+ ACE_Configuration_Section_Key bases_key;
+ this->repo_->config ()->open_section (this->section_key_,
+ "abstract_bases",
+ 0,
+ bases_key);
+ this->repo_->config ()->set_integer_value (bases_key,
+ "count",
+ count);
+ const char *base_id = 0;
+ const char *base_path = 0;
+ char *stringified = 0;
+
+ for (CORBA::ULong i = 0; i < count; ++i)
+ {
+ base_path =
+ TAO_IFR_Service_Utils::reference_to_path (
+ abstract_base_values[i]
+ );
+
+ // Get the servant's key into the temporary key holder, because
+ // the name clash checker for base interfaces is static, and has
+ // no other way to know about a specific key.
+ this->repo_->config ()->expand_path (
+ this->repo_->root_key (),
+ base_path,
+ TAO_IFR_Service_Utils::tmp_key_,
+ 0
+ );
+ TAO_IFR_Service_Utils::name_exists (&TAO_ValueDef_i::name_clash,
+ this->section_key_,
+ this->repo_,
+ CORBA::dk_Value
+ ACE_ENV_ARG_PARAMETER);
+ ACE_CHECK;
+
+ base_id = abstract_base_values[i]->_interface_repository_id ();
+ stringified = TAO_IFR_Service_Utils::int_to_string (i);
+ this->repo_->config ()->set_string_value (bases_key,
+ stringified,
+ base_id);
+ }
+}
+
+CORBA::Boolean
+TAO_ValueDef_i::is_abstract (ACE_ENV_SINGLE_ARG_DECL)
+ ACE_THROW_SPEC ((CORBA::SystemException))
+{
+ TAO_IFR_READ_GUARD_RETURN (0);
+
+ this->update_key (ACE_ENV_SINGLE_ARG_PARAMETER);
+ ACE_CHECK_RETURN (0);
+
+ return this->is_abstract_i (ACE_ENV_SINGLE_ARG_PARAMETER);
+}
+
+CORBA::Boolean
+TAO_ValueDef_i::is_abstract_i (ACE_ENV_SINGLE_ARG_DECL_NOT_USED)
+ ACE_THROW_SPEC ((CORBA::SystemException))
+{
+ CORBA::ULong is_it = 0;
+ this->repo_->config ()->get_integer_value (this->section_key_,
+ "is_abstract",
+ is_it);
+ return static_cast<CORBA::Boolean> (is_it);
+}
+
+void
+TAO_ValueDef_i::is_abstract (CORBA::Boolean is_abstract
+ ACE_ENV_ARG_DECL)
+ ACE_THROW_SPEC ((CORBA::SystemException))
+{
+ TAO_IFR_WRITE_GUARD;
+
+ this->update_key (ACE_ENV_SINGLE_ARG_PARAMETER);
+ ACE_CHECK;
+
+ this->is_abstract (is_abstract
+ ACE_ENV_ARG_PARAMETER);
+}
+
+void
+TAO_ValueDef_i::is_abstract_i (CORBA::Boolean is_abstract
+ ACE_ENV_ARG_DECL_NOT_USED)
+ ACE_THROW_SPEC ((CORBA::SystemException))
+{
+ this->repo_->config ()->set_integer_value (
+ this->section_key_,
+ "is_abstract",
+ static_cast<CORBA::ULong> (is_abstract));
+}
+
+CORBA::Boolean
+TAO_ValueDef_i::is_custom (ACE_ENV_SINGLE_ARG_DECL)
+ ACE_THROW_SPEC ((CORBA::SystemException))
+{
+ TAO_IFR_READ_GUARD_RETURN (0);
+
+ this->update_key (ACE_ENV_SINGLE_ARG_PARAMETER);
+ ACE_CHECK_RETURN (0);
+
+ return this->is_custom_i (ACE_ENV_SINGLE_ARG_PARAMETER);
+}
+
+CORBA::Boolean
+TAO_ValueDef_i::is_custom_i (ACE_ENV_SINGLE_ARG_DECL_NOT_USED)
+ ACE_THROW_SPEC ((CORBA::SystemException))
+{
+ CORBA::ULong is_it = 0;
+ this->repo_->config ()->get_integer_value (this->section_key_,
+ "is_custom",
+ is_it);
+ return static_cast<CORBA::Boolean> (is_it);
+}
+
+void
+TAO_ValueDef_i::is_custom (CORBA::Boolean is_custom
+ ACE_ENV_ARG_DECL)
+ ACE_THROW_SPEC ((CORBA::SystemException))
+{
+ TAO_IFR_WRITE_GUARD;
+
+ this->update_key (ACE_ENV_SINGLE_ARG_PARAMETER);
+ ACE_CHECK;
+
+ this->is_custom_i (is_custom
+ ACE_ENV_ARG_PARAMETER);
+}
+
+void
+TAO_ValueDef_i::is_custom_i (CORBA::Boolean is_custom
+ ACE_ENV_ARG_DECL_NOT_USED)
+ ACE_THROW_SPEC ((CORBA::SystemException))
+{
+ this->repo_->config ()->set_integer_value (
+ this->section_key_,
+ "is_custom",
+ static_cast<CORBA::ULong> (is_custom));
+}
+
+CORBA::Boolean
+TAO_ValueDef_i::is_truncatable (ACE_ENV_SINGLE_ARG_DECL)
+ ACE_THROW_SPEC ((CORBA::SystemException))
+{
+ TAO_IFR_READ_GUARD_RETURN (0);
+
+ this->update_key (ACE_ENV_SINGLE_ARG_PARAMETER);
+ ACE_CHECK_RETURN (0);
+
+ return this->is_truncatable_i (ACE_ENV_SINGLE_ARG_PARAMETER);
+}
+
+CORBA::Boolean
+TAO_ValueDef_i::is_truncatable_i (ACE_ENV_SINGLE_ARG_DECL_NOT_USED)
+ ACE_THROW_SPEC ((CORBA::SystemException))
+{
+ CORBA::ULong is_it = 0;
+ this->repo_->config ()->get_integer_value (this->section_key_,
+ "is_truncatable",
+ is_it);
+ return static_cast<CORBA::Boolean> (is_it);
+}
+
+void
+TAO_ValueDef_i::is_truncatable (CORBA::Boolean is_truncatable
+ ACE_ENV_ARG_DECL)
+ ACE_THROW_SPEC ((CORBA::SystemException))
+{
+ TAO_IFR_WRITE_GUARD;
+
+ this->update_key (ACE_ENV_SINGLE_ARG_PARAMETER);
+ ACE_CHECK;
+
+ this->is_truncatable_i (is_truncatable
+ ACE_ENV_ARG_PARAMETER);
+}
+
+void
+TAO_ValueDef_i::is_truncatable_i (CORBA::Boolean is_truncatable
+ ACE_ENV_ARG_DECL_NOT_USED)
+ ACE_THROW_SPEC ((CORBA::SystemException))
+{
+ this->repo_->config ()->set_integer_value (
+ this->section_key_,
+ "is_truncatable",
+ static_cast<CORBA::ULong> (is_truncatable));
+}
+
+CORBA::Boolean
+TAO_ValueDef_i::is_a (const char *id
+ ACE_ENV_ARG_DECL)
+ ACE_THROW_SPEC ((CORBA::SystemException))
+{
+ TAO_IFR_READ_GUARD_RETURN (0);
+
+ this->update_key (ACE_ENV_SINGLE_ARG_PARAMETER);
+ ACE_CHECK_RETURN (0);
+
+ return this->is_a_i (id
+ ACE_ENV_ARG_PARAMETER);
+}
+
+CORBA::Boolean
+TAO_ValueDef_i::is_a_i (const char *id
+ ACE_ENV_ARG_DECL)
+ ACE_THROW_SPEC ((CORBA::SystemException))
+{
+ if (ACE_OS::strcmp (id, "IDL:omg.org/CORBA/ValueBase:1.0") == 0)
+ {
+ return 1;
+ }
+
+ ACE_TString holder;
+ this->repo_->config ()->get_string_value (this->section_key_,
+ "id",
+ holder);
+
+ // Is it our type?
+ if (ACE_OS::strcmp (holder.fast_rep (), id) == 0)
+ {
+ return 1;
+ }
+
+ this->repo_->config ()->get_string_value (this->section_key_,
+ "base_value",
+ holder);
+
+ // Is it our concrete base type?
+ if (ACE_OS::strcmp (holder.fast_rep (), id) == 0)
+ {
+ return 1;
+ }
+
+ ACE_Configuration_Section_Key bases_key;
+ int status =
+ this->repo_->config ()->open_section (this->section_key_,
+ "abstract_bases",
+ 0,
+ bases_key);
+
+ if (status != 0)
+ {
+ return 0;
+ }
+
+ CORBA::ULong count = 0;
+ this->repo_->config ()->get_integer_value (bases_key,
+ "count",
+ count);
+ char *stringified = 0;
+ ACE_Configuration_Section_Key base_key;
+ CORBA::Boolean success = 0;
+
+ for (CORBA::ULong i = 0; i < count; ++i)
+ {
+ stringified = TAO_IFR_Service_Utils::int_to_string (i);
+ this->repo_->config ()->get_string_value (bases_key,
+ stringified,
+ holder);
+ this->repo_->config ()->get_string_value (this->repo_->repo_ids_key (),
+ holder.fast_rep (),
+ holder);
+ this->repo_->config ()->expand_path (this->repo_->root_key (),
+ holder,
+ base_key,
+ 0);
+ TAO_ValueDef_i impl (this->repo_);
+ impl.section_key (base_key);
+ success = impl.is_a_i (id
+ ACE_ENV_ARG_PARAMETER);
+ ACE_CHECK_RETURN (0);
+
+ if (success)
+ {
+ return 1;
+ }
+ }
+
+ return 0;
+}
+
+CORBA::ValueDef::FullValueDescription *
+TAO_ValueDef_i::describe_value (ACE_ENV_SINGLE_ARG_DECL)
+ ACE_THROW_SPEC ((CORBA::SystemException))
+{
+ TAO_IFR_READ_GUARD_RETURN (0);
+
+ this->update_key (ACE_ENV_SINGLE_ARG_PARAMETER);
+ ACE_CHECK_RETURN (0);
+
+ return this->describe_value_i (ACE_ENV_SINGLE_ARG_PARAMETER);
+}
+
+CORBA::ValueDef::FullValueDescription *
+TAO_ValueDef_i::describe_value_i (ACE_ENV_SINGLE_ARG_DECL)
+ ACE_THROW_SPEC ((CORBA::SystemException))
+{
+ CORBA::ValueDef::FullValueDescription *fv_desc = 0;
+ ACE_NEW_RETURN (fv_desc,
+ CORBA::ValueDef::FullValueDescription,
+ 0);
+ CORBA::ValueDef::FullValueDescription_var retval = fv_desc;
+
+ ACE_TString holder;
+ this->repo_->config ()->get_string_value (this->section_key_,
+ "name",
+ holder);
+ fv_desc->name = holder.fast_rep ();
+ this->repo_->config ()->get_string_value (this->section_key_,
+ "id",
+ holder);
+ fv_desc->id = holder.fast_rep ();
+
+ CORBA::ULong val = 0;
+
+ this->repo_->config ()->get_integer_value (this->section_key_,
+ "is_abstract",
+ val);
+ fv_desc->is_abstract = static_cast<CORBA::Boolean> (val);
+ this->repo_->config ()->get_integer_value (this->section_key_,
+ "is_custom",
+ val);
+ fv_desc->is_custom = static_cast<CORBA::Boolean> (val);
+ this->repo_->config ()->get_string_value (this->section_key_,
+ "container_id",
+ holder);
+ fv_desc->defined_in = holder.fast_rep ();
+ this->repo_->config ()->get_string_value (this->section_key_,
+ "version",
+ holder);
+ fv_desc->version = holder.fast_rep ();
+
+ // Operations.
+
+ fv_desc->operations.length (0);
+
+ ACE_Configuration_Section_Key ops_key;
+ int status =
+ this->repo_->config ()->open_section (this->section_key_,
+ "ops",
+ 0,
+ ops_key);
+ CORBA::ULong count = 0;
+ CORBA::ULong param_count = 0;
+ char *stringified = 0;
+ CORBA::ULong i = 0;
+ CORBA::ULong j = 0;
+ TAO_IDLType_i *idl_type = 0;
+ CORBA::Object_var obj;
+
+ if (status == 0)
+ {
+ this->repo_->config ()->get_integer_value (ops_key,
+ "count",
+ count);
+ fv_desc->operations.length (count);
+ ACE_Configuration_Section_Key op_key, result_key, contexts_key;
+ ACE_Configuration_Section_Key params_key, excepts_key;
+
+ for (i = 0; i < count; ++i)
+ {
+ stringified = TAO_IFR_Service_Utils::int_to_string (i);
+ this->repo_->config ()->open_section (ops_key,
+ stringified,
+ 0,
+ op_key);
+ this->repo_->config ()->get_string_value (op_key,
+ "name",
+ holder);
+ fv_desc->operations[i].name = holder.fast_rep ();
+ this->repo_->config ()->get_string_value (op_key,
+ "id",
+ holder);
+ fv_desc->operations[i].id = holder.fast_rep ();
+ this->repo_->config ()->get_string_value (this->section_key_,
+ "id",
+ holder);
+ fv_desc->operations[i].defined_in = holder.fast_rep ();
+ this->repo_->config ()->get_string_value (op_key,
+ "result",
+ holder);
+ idl_type =
+ TAO_IFR_Service_Utils::path_to_idltype (holder,
+ this->repo_);
+ fv_desc->operations[i].result =
+ idl_type->type_i (ACE_ENV_SINGLE_ARG_PARAMETER);
+ ACE_CHECK_RETURN (0);
+
+ this->repo_->config ()->get_integer_value (op_key,
+ "mode",
+ val);
+ fv_desc->operations[i].mode = static_cast<CORBA::OperationMode> (val);
+ CORBA::TCKind kind =
+ fv_desc->operations[i].result->kind (ACE_ENV_SINGLE_ARG_PARAMETER);
+ ACE_CHECK_RETURN (0);
+
+ if (fv_desc->operations[i].mode == CORBA::OP_ONEWAY
+ && kind != CORBA::tk_void)
+ {
+ ACE_THROW_RETURN (CORBA::BAD_PARAM (CORBA::OMGVMCID | 31,
+ CORBA::COMPLETED_NO),
+ 0);
+ }
+
+ // Operation contexts.
+
+ TAO_IFR_Strseq_Utils<CORBA::ContextIdSeq>::fill_string_seq (
+ "contexts",
+ this->repo_->config (),
+ op_key,
+ fv_desc->operations[i].contexts
+ );
+
+ // Operation parameters.
+
+ fv_desc->operations[i].parameters.length (0);
+ status =
+ this->repo_->config ()->open_section (op_key,
+ "params",
+ 0,
+ params_key);
+ if (status == 0)
+ {
+ ACE_Configuration_Section_Key param_key;
+ this->repo_->config ()->get_integer_value (params_key,
+ "count",
+ param_count);
+ fv_desc->operations[i].parameters.length (param_count);
+
+ for (j = 0; j < param_count; ++j)
+ {
+ stringified = TAO_IFR_Service_Utils::int_to_string (j);
+ this->repo_->config ()->open_section (params_key,
+ stringified,
+ 0,
+ param_key);
+ this->repo_->config ()->get_string_value (param_key,
+ "name",
+ holder);
+ fv_desc->operations[i].parameters[j].name =
+ holder.fast_rep ();
+ this->repo_->config ()->get_string_value (param_key,
+ "type_path",
+ holder);
+ idl_type =
+ TAO_IFR_Service_Utils::path_to_idltype (holder,
+ this->repo_);
+ fv_desc->operations[i].parameters[j].type =
+ idl_type->type_i (ACE_ENV_SINGLE_ARG_PARAMETER);
+ ACE_CHECK_RETURN (0);
+
+ obj =
+ TAO_IFR_Service_Utils::path_to_ir_object (
+ holder,
+ this->repo_
+ ACE_ENV_ARG_PARAMETER
+ );
+ ACE_CHECK_RETURN (0);
+
+ fv_desc->operations[i].parameters[j].type_def =
+ CORBA::IDLType::_narrow (obj.in ()
+ ACE_ENV_ARG_PARAMETER);
+ ACE_CHECK_RETURN (0);
+
+ this->repo_->config ()->get_integer_value (param_key,
+ "mode",
+ val);
+ fv_desc->operations[i].parameters[j].mode =
+ static_cast<CORBA::ParameterMode> (val);
+ }
+ }
+
+ // Operation exceptions.
+
+ status =
+ this->repo_->config ()->open_section (op_key,
+ "excepts",
+ 0,
+ excepts_key);
+ fv_desc->operations[i].exceptions.length (0);
+
+ if (status == 0)
+ {
+ this->repo_->config ()->get_integer_value (excepts_key,
+ "count",
+ count);
+ fv_desc->operations[i].exceptions.length (count);
+ ACE_Configuration_Section_Key except_def_key;
+
+ for (j = 0; j < count; ++j)
+ {
+ stringified = TAO_IFR_Service_Utils::int_to_string (j);
+ this->repo_->config ()->get_string_value (excepts_key,
+ stringified,
+ holder);
+
+ // Get the TAO_IDLType_i before 'holder' is clobbered.
+ idl_type =
+ TAO_IFR_Service_Utils::path_to_idltype (holder,
+ this->repo_);
+ this->repo_->config ()->expand_path (
+ this->repo_->root_key (),
+ holder,
+ except_def_key,
+ 0
+ );
+ this->repo_->config ()->get_string_value (except_def_key,
+ "name",
+ holder);
+ fv_desc->operations[i].exceptions[j].name =
+ holder.fast_rep ();
+ this->repo_->config ()->get_string_value (except_def_key,
+ "id",
+ holder);
+ fv_desc->operations[i].exceptions[j].id =
+ holder.fast_rep ();
+ this->repo_->config ()->get_string_value (except_def_key,
+ "container_id",
+ holder);
+ fv_desc->operations[i].exceptions[j].defined_in =
+ holder.fast_rep ();
+ this->repo_->config ()->get_string_value (except_def_key,
+ "version",
+ holder);
+ fv_desc->operations[i].exceptions[j].version =
+ holder.fast_rep ();
+
+ // Use the TAO_IDLType_i fetched above.
+ fv_desc->operations[i].exceptions[j].type =
+ idl_type->type_i (ACE_ENV_SINGLE_ARG_PARAMETER);
+ ACE_CHECK_RETURN (0);
+ }
+ }
+ }
+ }
+
+ // Attributes..
+
+ fv_desc->attributes.length (0);
+
+ ACE_Configuration_Section_Key attrs_key;
+ status =
+ this->repo_->config ()->open_section (this->section_key_,
+ "attrs",
+ 0,
+ attrs_key);
+ if (status == 0)
+ {
+ this->repo_->config ()->get_integer_value (attrs_key,
+ "count",
+ count);
+ fv_desc->attributes.length (count);
+ ACE_Configuration_Section_Key attr_key, attr_def_key;
+
+ for (i = 0; i < count; ++i)
+ {
+ stringified = TAO_IFR_Service_Utils::int_to_string (i);
+ this->repo_->config ()->open_section (attrs_key,
+ stringified,
+ 0,
+ attr_key);
+ this->repo_->config ()->get_string_value (attr_key,
+ "name",
+ holder);
+ fv_desc->attributes[i].name = holder.fast_rep ();
+ this->repo_->config ()->get_string_value (attr_key,
+ "id",
+ holder);
+ fv_desc->attributes[i].id = holder.fast_rep ();
+ this->repo_->config ()->get_string_value (attr_key,
+ "version",
+ holder);
+ fv_desc->attributes[i].version = holder.fast_rep ();
+ this->repo_->config ()->get_integer_value (attr_key,
+ "mode",
+ val);
+ fv_desc->attributes[i].mode =
+ static_cast<CORBA::AttributeMode> (val);
+ this->repo_->config ()->get_string_value (attr_key,
+ "type_path",
+ holder);
+
+ // Use the type path for 'defined_in' and 'type'.
+
+ idl_type =
+ TAO_IFR_Service_Utils::path_to_idltype (holder,
+ this->repo_);
+ fv_desc->attributes[i].type =
+ idl_type->type_i (ACE_ENV_SINGLE_ARG_PARAMETER);
+ ACE_CHECK_RETURN (0);
+
+ this->repo_->config ()->expand_path (this->repo_->root_key (),
+ holder,
+ attr_def_key,
+ 0);
+ this->repo_->config ()->get_string_value (attr_def_key,
+ "container_id",
+ holder);
+ fv_desc->attributes[i].defined_in = holder.fast_rep ();
+ }
+ }
+
+ // Members..
+
+ fv_desc->members.length (0);
+
+ ACE_Configuration_Section_Key members_key;
+ status =
+ this->repo_->config ()->open_section (this->section_key_,
+ "members",
+ 0,
+ members_key);
+ if (status == 0)
+ {
+ this->repo_->config ()->get_integer_value (members_key,
+ "count",
+ count);
+ fv_desc->members.length (count);
+ ACE_Configuration_Section_Key member_key, member_def_key;
+
+ for (i = 0; i < count; ++i)
+ {
+ stringified = TAO_IFR_Service_Utils::int_to_string (i);
+ this->repo_->config ()->open_section (members_key,
+ stringified,
+ 0,
+ member_key);
+ this->repo_->config ()->get_string_value (member_key,
+ "name",
+ holder);
+ fv_desc->members[i].name = holder.fast_rep ();
+ this->repo_->config ()->get_string_value (member_key,
+ "id",
+ holder);
+ fv_desc->members[i].id = holder.fast_rep ();
+ this->repo_->config ()->get_string_value (member_key,
+ "container_id",
+ holder);
+ fv_desc->members[i].defined_in = holder.fast_rep ();
+ this->repo_->config ()->get_string_value (member_key,
+ "version",
+ holder);
+ fv_desc->members[i].version = holder.fast_rep ();
+
+ this->repo_->config ()->get_integer_value (member_key,
+ "access",
+ val);
+ fv_desc->members[i].access =
+ static_cast<CORBA::Visibility> (val);
+
+ // Use type path for 'type' and 'type_def',
+
+ this->repo_->config ()->get_string_value (member_key,
+ "type_path",
+ holder);
+ idl_type =
+ TAO_IFR_Service_Utils::path_to_idltype (holder,
+ this->repo_);
+ fv_desc->members[i].type =
+ idl_type->type_i (ACE_ENV_SINGLE_ARG_PARAMETER);
+ ACE_CHECK_RETURN (0);
+
+ obj =
+ TAO_IFR_Service_Utils::path_to_ir_object (holder,
+ this->repo_
+ ACE_ENV_ARG_PARAMETER);
+ ACE_CHECK_RETURN (0);
+
+ fv_desc->members[i].type_def =
+ CORBA::IDLType::_narrow (obj.in ()
+ ACE_ENV_ARG_PARAMETER);
+ ACE_CHECK_RETURN (0);
+ }
+ }
+
+ // Initializers
+
+ fv_desc->initializers.length (0);
+
+ ACE_Configuration_Section_Key initializers_key;
+ status =
+ this->repo_->config ()->open_section (this->section_key_,
+ "initializers",
+ 0,
+ initializers_key);
+
+ if (status == 0)
+ {
+ this->repo_->config ()->get_integer_value (initializers_key,
+ "count",
+ count);
+ fv_desc->initializers.length (count);
+ ACE_Configuration_Section_Key initializer_key, params_key, arg_key;
+
+ for (i = 0; i < count; ++i)
+ {
+ stringified = TAO_IFR_Service_Utils::int_to_string (i);
+ this->repo_->config ()->open_section (initializers_key,
+ stringified,
+ 0,
+ initializer_key);
+ this->repo_->config ()->get_string_value (initializer_key,
+ "name",
+ holder);
+ fv_desc->initializers[i].name = holder.fast_rep ();
+
+ fv_desc->initializers[i].members.length (0);
+ status =
+ this->repo_->config ()->open_section (initializer_key,
+ stringified,
+ 0,
+ params_key);
+
+ if (status == 0)
+ {
+ this->repo_->config ()->get_integer_value (params_key,
+ "count",
+ param_count);
+ fv_desc->initializers[i].members.length (param_count);
+
+ for (j = 0; j < param_count; ++j)
+ {
+ stringified = TAO_IFR_Service_Utils::int_to_string (j);
+ this->repo_->config ()->open_section (params_key,
+ stringified,
+ 0,
+ arg_key);
+ this->repo_->config ()->get_string_value (arg_key,
+ "arg_name",
+ holder);
+ fv_desc->initializers[i].members[j].name =
+ holder.fast_rep ();
+ this->repo_->config ()->get_string_value (arg_key,
+ "arg_path",
+ holder);
+ obj =
+ TAO_IFR_Service_Utils::path_to_ir_object (
+ holder,
+ this->repo_
+ ACE_ENV_ARG_PARAMETER);
+ ACE_CHECK_RETURN (0);
+
+ fv_desc->initializers[i].members[j].type_def =
+ CORBA::IDLType::_narrow (obj.in ()
+ ACE_ENV_ARG_PARAMETER);
+ ACE_CHECK_RETURN (0);
+ }
+ }
+ }
+ }
+
+ TAO_IFR_Strseq_Utils<CORBA::RepositoryIdSeq>::fill_string_seq (
+ "supported",
+ this->repo_->config (),
+ this->section_key_,
+ fv_desc->supported_interfaces
+ );
+
+ TAO_IFR_Strseq_Utils<CORBA::RepositoryIdSeq>::fill_string_seq (
+ "abstract_bases",
+ this->repo_->config (),
+ this->section_key_,
+ fv_desc->abstract_base_values
+ );
+
+ this->repo_->config ()->get_integer_value (this->section_key_,
+ "is_truncatable",
+ val);
+ fv_desc->is_truncatable = static_cast<CORBA::Boolean> (val);
+ this->repo_->config ()->get_string_value (this->section_key_,
+ "base_value",
+ holder);
+ fv_desc->base_value = holder.fast_rep ();
+ fv_desc->type = this->type_i (ACE_ENV_SINGLE_ARG_PARAMETER);
+ ACE_CHECK_RETURN (0);
+
+ return retval._retn ();
+}
+
+CORBA::ValueMemberDef_ptr
+TAO_ValueDef_i::create_value_member (const char *id,
+ const char *name,
+ const char *version,
+ CORBA::IDLType_ptr type,
+ CORBA::Visibility access
+ ACE_ENV_ARG_DECL)
+ ACE_THROW_SPEC ((CORBA::SystemException))
+{
+ TAO_IFR_WRITE_GUARD_RETURN (CORBA::ValueMemberDef::_nil ());
+
+ this->update_key (ACE_ENV_SINGLE_ARG_PARAMETER);
+ ACE_CHECK_RETURN (CORBA::ValueMemberDef::_nil ());
+
+ return this->create_value_member_i (id,
+ name,
+ version,
+ type,
+ access
+ ACE_ENV_ARG_PARAMETER);
+}
+
+CORBA::ValueMemberDef_ptr
+TAO_ValueDef_i::create_value_member_i (const char *id,
+ const char *name,
+ const char *version,
+ CORBA::IDLType_ptr type,
+ CORBA::Visibility access
+ ACE_ENV_ARG_DECL)
+ ACE_THROW_SPEC ((CORBA::SystemException))
+{
+ TAO_Container_i::tmp_name_holder_ = name;
+ ACE_Configuration_Section_Key new_key;
+
+ // Common to all IR objects created in CORBA::Container.
+ ACE_TString path =
+ TAO_IFR_Service_Utils::create_common (CORBA::dk_Value,
+ CORBA::dk_ValueMember,
+ this->section_key_,
+ new_key,
+ this->repo_,
+ id,
+ name,
+ &TAO_Container_i::same_as_tmp_name,
+ version,
+ "members"
+ ACE_ENV_ARG_PARAMETER);
+ ACE_CHECK_RETURN (CORBA::ValueMemberDef::_nil ());
+
+ // Store the path to the attribute's type definition.
+ char *type_path = TAO_IFR_Service_Utils::reference_to_path (type);
+
+ this->repo_->config ()->set_string_value (new_key,
+ "type_path",
+ type_path);
+
+ // Store the attribute's mode.
+ this->repo_->config ()->set_integer_value (new_key,
+ "access",
+ access);
+
+ // Create the object reference.
+ CORBA::Object_var obj =
+ TAO_IFR_Service_Utils::create_objref (CORBA::dk_ValueMember,
+ path.c_str (),
+ this->repo_
+ ACE_ENV_ARG_PARAMETER);
+ ACE_CHECK_RETURN (CORBA::ValueMemberDef::_nil ());
+
+ CORBA::ValueMemberDef_var retval =
+ CORBA::ValueMemberDef::_narrow (obj.in ()
+ ACE_ENV_ARG_PARAMETER);
+ ACE_CHECK_RETURN (CORBA::ValueMemberDef::_nil ());
+
+ return retval._retn ();
+}
+
+CORBA::AttributeDef_ptr
+TAO_ValueDef_i::create_attribute (
+ const char *id,
+ const char *name,
+ const char *version,
+ CORBA::IDLType_ptr type,
+ CORBA::AttributeMode mode
+ ACE_ENV_ARG_DECL
+ )
+ ACE_THROW_SPEC ((CORBA::SystemException))
+{
+ TAO_IFR_WRITE_GUARD_RETURN (CORBA::AttributeDef::_nil ());
+
+ this->update_key (ACE_ENV_SINGLE_ARG_PARAMETER);
+ ACE_CHECK_RETURN (CORBA::AttributeDef::_nil ());
+
+ return this->create_attribute_i (id,
+ name,
+ version,
+ type,
+ mode
+ ACE_ENV_ARG_PARAMETER);
+}
+
+CORBA::AttributeDef_ptr
+TAO_ValueDef_i::create_attribute_i (
+ const char *id,
+ const char *name,
+ const char *version,
+ CORBA::IDLType_ptr type,
+ CORBA::AttributeMode mode
+ ACE_ENV_ARG_DECL
+ )
+ ACE_THROW_SPEC ((CORBA::SystemException))
+{
+ TAO_Container_i::tmp_name_holder_ = name;
+ ACE_Configuration_Section_Key new_key;
+
+ // Common to all IR objects created in CORBA::Container.
+ ACE_TString path =
+ TAO_IFR_Service_Utils::create_common (CORBA::dk_Value,
+ CORBA::dk_Attribute,
+ this->section_key_,
+ new_key,
+ this->repo_,
+ id,
+ name,
+ &TAO_Container_i::same_as_tmp_name,
+ version,
+ "attrs"
+ ACE_ENV_ARG_PARAMETER);
+ ACE_CHECK_RETURN (CORBA::AttributeDef::_nil ());
+
+ // Store the path to the attribute's type definition.
+ char *type_path = TAO_IFR_Service_Utils::reference_to_path (type);
+
+ this->repo_->config ()->set_string_value (new_key,
+ "type_path",
+ type_path);
+
+ // Store the attribute's mode.
+ this->repo_->config ()->set_integer_value (new_key,
+ "mode",
+ mode);
+
+ // Create the object reference.
+ CORBA::Object_var obj =
+ TAO_IFR_Service_Utils::create_objref (CORBA::dk_Attribute,
+ path.c_str (),
+ this->repo_
+ ACE_ENV_ARG_PARAMETER);
+ ACE_CHECK_RETURN (CORBA::AttributeDef::_nil ());
+
+ CORBA::AttributeDef_var retval =
+ CORBA::AttributeDef::_narrow (obj.in ()
+ ACE_ENV_ARG_PARAMETER);
+ ACE_CHECK_RETURN (CORBA::AttributeDef::_nil ());
+
+ return retval._retn ();
+}
+
+CORBA::OperationDef_ptr
+TAO_ValueDef_i::create_operation (
+ const char *id,
+ const char *name,
+ const char *version,
+ CORBA::IDLType_ptr result,
+ CORBA::OperationMode mode,
+ const CORBA::ParDescriptionSeq &params,
+ const CORBA::ExceptionDefSeq &exceptions,
+ const CORBA::ContextIdSeq &contexts
+ ACE_ENV_ARG_DECL
+ )
+ ACE_THROW_SPEC ((CORBA::SystemException))
+{
+ TAO_IFR_WRITE_GUARD_RETURN (CORBA::OperationDef::_nil ());
+
+ this->update_key (ACE_ENV_SINGLE_ARG_PARAMETER);
+ ACE_CHECK_RETURN (CORBA::OperationDef::_nil ());
+
+ return this->create_operation_i (id,
+ name,
+ version,
+ result,
+ mode,
+ params,
+ exceptions,
+ contexts
+ ACE_ENV_ARG_PARAMETER);
+}
+
+CORBA::OperationDef_ptr
+TAO_ValueDef_i::create_operation_i (
+ const char *id,
+ const char *name,
+ const char *version,
+ CORBA::IDLType_ptr result,
+ CORBA::OperationMode mode,
+ const CORBA::ParDescriptionSeq &params,
+ const CORBA::ExceptionDefSeq &exceptions,
+ const CORBA::ContextIdSeq &contexts
+ ACE_ENV_ARG_DECL
+ )
+ ACE_THROW_SPEC ((CORBA::SystemException))
+{
+ TAO_Container_i::tmp_name_holder_ = name;
+ ACE_Configuration_Section_Key new_key;
+
+ // Common to all IR objects created in CORBA::Container.
+ ACE_TString path =
+ TAO_IFR_Service_Utils::create_common (CORBA::dk_Value,
+ CORBA::dk_Operation,
+ this->section_key_,
+ new_key,
+ this->repo_,
+ id,
+ name,
+ &TAO_Container_i::same_as_tmp_name,
+ version,
+ "ops"
+ ACE_ENV_ARG_PARAMETER);
+ ACE_CHECK_RETURN (CORBA::OperationDef::_nil ());
+
+ // Get the TypeCode for the return type.
+ ACE_TString result_path (TAO_IFR_Service_Utils::reference_to_path (result));
+ TAO_IDLType_i *result_impl =
+ TAO_IFR_Service_Utils::path_to_idltype (result_path,
+ this->repo_);
+
+ CORBA::TypeCode_var rettype =
+ result_impl->type_i (ACE_ENV_SINGLE_ARG_PARAMETER);
+ ACE_CHECK_RETURN (CORBA::OperationDef::_nil ());
+
+ CORBA::TCKind kind = rettype->kind (ACE_ENV_SINGLE_ARG_PARAMETER);
+ ACE_CHECK_RETURN (CORBA::OperationDef::_nil ());
+
+ // Oneway operations cannot have a non-void return type.
+ if (mode == CORBA::OP_ONEWAY && kind != CORBA::tk_void)
+ {
+ ACE_THROW_RETURN (CORBA::BAD_PARAM (CORBA::OMGVMCID | 31,
+ CORBA::COMPLETED_NO),
+ CORBA::OperationDef::_nil ());
+ }
+
+ this->repo_->config ()->set_string_value (new_key,
+ "result",
+ result_path);
+
+ // Store the operation mode.
+ this->repo_->config ()->set_integer_value (new_key,
+ "mode",
+ mode);
+
+ CORBA::ULong i = 0;
+
+ // Store the operation's parameter info.
+ CORBA::ULong length = params.length ();
+
+ if (length > 0)
+ {
+ ACE_Configuration_Section_Key params_key;
+ this->repo_->config ()->open_section (new_key,
+ "params",
+ 1,
+ params_key);
+
+ this->repo_->config ()->set_integer_value (params_key,
+ "count",
+ length);
+ char *type_path = 0;
+
+ for (i = 0; i < length; ++i)
+ {
+ // Oneway operations cannot have INOUT or OUT parameters.
+ if (mode == CORBA::OP_ONEWAY && params[i].mode != CORBA::PARAM_IN)
+ {
+ ACE_THROW_RETURN (CORBA::BAD_PARAM (CORBA::OMGVMCID | 31,
+ CORBA::COMPLETED_NO),
+ CORBA::OperationDef::_nil ());
+ }
+
+ ACE_Configuration_Section_Key param_key;
+ char *stringified = TAO_IFR_Service_Utils::int_to_string (i);
+ this->repo_->config ()->open_section (params_key,
+ stringified,
+ 1,
+ param_key);
+
+ this->repo_->config ()->set_string_value (param_key,
+ "name",
+ params[i].name.in ());
+ type_path =
+ TAO_IFR_Service_Utils::reference_to_path (
+ params[i].type_def.in ()
+ );
+
+ this->repo_->config ()->set_string_value (param_key,
+ "type_path",
+ type_path);
+
+ this->repo_->config ()->set_integer_value (param_key,
+ "mode",
+ params[i].mode);
+ }
+ }
+
+ // Store the operation's exception info.
+ length = exceptions.length ();
+
+ if (length > 0)
+ {
+ // Oneway operations cannot throw any user exceptions.
+ if (mode == CORBA::OP_ONEWAY)
+ {
+ ACE_THROW_RETURN (CORBA::BAD_PARAM (CORBA::OMGVMCID | 31,
+ CORBA::COMPLETED_NO),
+ CORBA::OperationDef::_nil ());
+ }
+
+ ACE_Configuration_Section_Key excepts_key;
+
+ this->repo_->config ()->open_section (new_key,
+ "excepts",
+ 1,
+ excepts_key);
+
+ this->repo_->config ()->set_integer_value (excepts_key,
+ "count",
+ length);
+ char *type_path = 0;
+
+ for (i = 0; i < length; ++i)
+ {
+ type_path =
+ TAO_IFR_Service_Utils::reference_to_path (exceptions[i]);
+
+ char *stringified = TAO_IFR_Service_Utils::int_to_string (i);
+ this->repo_->config ()->set_string_value (excepts_key,
+ stringified,
+ type_path);
+ }
+ }
+
+ // Store the operation's context info.
+ length = contexts.length ();
+
+ if (length > 0)
+ {
+ ACE_Configuration_Section_Key contexts_key;
+
+ this->repo_->config ()->open_section (new_key,
+ "contexts",
+ 1,
+ contexts_key);
+
+ for (i = 0; i < length; ++i)
+ {
+ char *stringified = TAO_IFR_Service_Utils::int_to_string (i);
+ this->repo_->config ()->set_string_value (contexts_key,
+ stringified,
+ contexts[i]);
+ }
+ }
+
+ // Create the object reference.
+ CORBA::Object_var obj =
+ TAO_IFR_Service_Utils::create_objref (CORBA::dk_Operation,
+ path.c_str (),
+ this->repo_
+ ACE_ENV_ARG_PARAMETER);
+ ACE_CHECK_RETURN (CORBA::OperationDef::_nil ());
+
+ CORBA::OperationDef_var retval =
+ CORBA::OperationDef::_narrow (obj.in ()
+ ACE_ENV_ARG_PARAMETER);
+ ACE_CHECK_RETURN (CORBA::OperationDef::_nil ());
+
+ return retval._retn ();
+}
+
+int
+TAO_ValueDef_i::name_clash (const char *name)
+{
+ ACE_TRY_NEW_ENV
+ {
+ TAO_Container_i::tmp_name_holder_ = name;
+ TAO_IFR_Service_Utils::name_exists (&TAO_Container_i::same_as_tmp_name,
+ TAO_IFR_Service_Utils::tmp_key_,
+ TAO_IFR_Service_Utils::repo_,
+ CORBA::dk_Value
+ ACE_ENV_ARG_PARAMETER);
+ ACE_TRY_CHECK;
+ }
+ ACE_CATCHANY
+ {
+ return 1;
+ }
+ ACE_ENDTRY;
+
+ return 0;
+}
+
+void
+TAO_ValueDef_i::fill_value_description (CORBA::ValueDescription &desc
+ ACE_ENV_ARG_DECL)
+{
+ desc.name = this->name_i (ACE_ENV_SINGLE_ARG_PARAMETER);
+ ACE_CHECK;
+
+ desc.id = this->id_i (ACE_ENV_SINGLE_ARG_PARAMETER);
+ ACE_CHECK;
+
+ CORBA::ULong tmp = this->is_abstract_i (ACE_ENV_SINGLE_ARG_PARAMETER);
+ ACE_CHECK;
+ desc.is_abstract = static_cast<CORBA::Boolean> (tmp);
+
+ tmp = this->is_custom_i (ACE_ENV_SINGLE_ARG_PARAMETER);
+ ACE_CHECK;
+ desc.is_custom = static_cast<CORBA::Boolean> (tmp);
+
+ ACE_TString holder;
+ this->repo_->config ()->get_string_value (this->section_key_,
+ "container_id",
+ holder);
+ desc.defined_in = holder.fast_rep ();
+
+ desc.version = this->version_i (ACE_ENV_SINGLE_ARG_PARAMETER);
+ ACE_CHECK;
+
+ TAO_IFR_Strseq_Utils<CORBA::RepositoryIdSeq>::fill_string_seq (
+ "supported",
+ this->repo_->config (),
+ this->section_key_,
+ desc.supported_interfaces
+ );
+
+ TAO_IFR_Strseq_Utils<CORBA::RepositoryIdSeq>::fill_string_seq (
+ "abstract_bases",
+ this->repo_->config (),
+ this->section_key_,
+ desc.abstract_base_values
+ );
+
+ tmp = this->is_truncatable_i (ACE_ENV_SINGLE_ARG_PARAMETER);
+ ACE_CHECK;
+ desc.is_truncatable = static_cast<CORBA::Boolean> (tmp);
+
+ this->repo_->config ()->get_string_value (this->section_key_,
+ "base_value",
+ holder);
+ desc.base_value = holder.fast_rep ();
+}
+
+TAO_END_VERSIONED_NAMESPACE_DECL
diff --git a/TAO/orbsvcs/orbsvcs/IFRService/ValueDef_i.h b/TAO/orbsvcs/orbsvcs/IFRService/ValueDef_i.h
new file mode 100644
index 00000000000..0d5dd9d7f9f
--- /dev/null
+++ b/TAO/orbsvcs/orbsvcs/IFRService/ValueDef_i.h
@@ -0,0 +1,353 @@
+// -*- C++ -*-
+
+// $Id$
+
+// ============================================================================
+//
+// = LIBRARY
+// TAO/orbsvcs/orbsvcs/IFRService
+//
+// = FILENAME
+// ValueDef_i.h
+//
+// = DESCRIPTION
+// ValueDef servant class.
+//
+// = AUTHOR
+// Jeff Parsons <parsons@cs.wustl.edu>
+//
+// ============================================================================
+
+#ifndef TAO_VALUEDEF_I_H
+#define TAO_VALUEDEF_I_H
+
+#include "orbsvcs/IFRService/Contained_i.h"
+#include "orbsvcs/IFRService/IDLType_i.h"
+#include "orbsvcs/IFRService/ifr_service_export.h"
+
+#if !defined (ACE_LACKS_PRAGMA_ONCE)
+# pragma once
+#endif /* ACE_LACKS_PRAGMA_ONCE */
+
+#if defined(_MSC_VER)
+#pragma warning(push)
+#pragma warning(disable:4250)
+#endif /* _MSC_VER */
+
+TAO_BEGIN_VERSIONED_NAMESPACE_DECL
+
+class TAO_IFRService_Export TAO_ValueDef_i : public virtual TAO_Container_i,
+ public virtual TAO_Contained_i,
+ public virtual TAO_IDLType_i
+{
+ // = TITLE
+ // TAO_ValueDef_i
+ //
+ // = DESCRIPTION
+ // Represents a valuetype definition.
+ //
+public:
+ TAO_ValueDef_i (TAO_Repository_i *repo);
+ // Constructor
+
+ virtual ~TAO_ValueDef_i (void);
+ // Destructor
+
+ virtual CORBA::DefinitionKind def_kind (
+ ACE_ENV_SINGLE_ARG_DECL_WITH_DEFAULTS
+ )
+ ACE_THROW_SPEC ((CORBA::SystemException));
+ // Return our definition kind.
+
+ virtual void destroy (
+ ACE_ENV_SINGLE_ARG_DECL_WITH_DEFAULTS
+ )
+ ACE_THROW_SPEC ((CORBA::SystemException));
+ // Remove the repository entry.
+
+ virtual void destroy_i (
+ ACE_ENV_SINGLE_ARG_DECL_WITH_DEFAULTS
+ )
+ ACE_THROW_SPEC ((CORBA::SystemException));
+
+ virtual CORBA::Contained::Description *describe (
+ ACE_ENV_SINGLE_ARG_DECL_WITH_DEFAULTS
+ )
+ ACE_THROW_SPEC ((CORBA::SystemException));
+ // From Contained_i's pure virtual function.
+
+ virtual CORBA::Contained::Description *describe_i (
+ ACE_ENV_SINGLE_ARG_DECL_WITH_DEFAULTS
+ )
+ ACE_THROW_SPEC ((CORBA::SystemException));
+ // From Contained_i's pure virtual function.
+
+ virtual CORBA::TypeCode_ptr type (
+ ACE_ENV_SINGLE_ARG_DECL_WITH_DEFAULTS
+ )
+ ACE_THROW_SPEC ((CORBA::SystemException));
+ // From IDLType_i's pure virtual function.
+
+ virtual CORBA::TypeCode_ptr type_i (
+ ACE_ENV_SINGLE_ARG_DECL_WITH_DEFAULTS
+ )
+ ACE_THROW_SPEC ((CORBA::SystemException));
+ // From IDLType_i's pure virtual function.
+
+ virtual CORBA::InterfaceDefSeq *supported_interfaces (
+ ACE_ENV_SINGLE_ARG_DECL_WITH_DEFAULTS
+ )
+ ACE_THROW_SPEC ((CORBA::SystemException));
+
+ CORBA::InterfaceDefSeq *supported_interfaces_i (
+ ACE_ENV_SINGLE_ARG_DECL_WITH_DEFAULTS
+ )
+ ACE_THROW_SPEC ((CORBA::SystemException));
+
+ virtual void supported_interfaces (
+ const CORBA::InterfaceDefSeq & supported_interfaces
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS
+ )
+ ACE_THROW_SPEC ((CORBA::SystemException));
+
+ void supported_interfaces_i (
+ const CORBA::InterfaceDefSeq & supported_interfaces
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS
+ )
+ ACE_THROW_SPEC ((CORBA::SystemException));
+
+ virtual CORBA::InitializerSeq *initializers (
+ ACE_ENV_SINGLE_ARG_DECL_WITH_DEFAULTS
+ )
+ ACE_THROW_SPEC ((CORBA::SystemException));
+
+ CORBA::InitializerSeq *initializers_i (
+ ACE_ENV_SINGLE_ARG_DECL_WITH_DEFAULTS
+ )
+ ACE_THROW_SPEC ((CORBA::SystemException));
+
+ virtual void initializers (
+ const CORBA::InitializerSeq & initializers
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS
+ )
+ ACE_THROW_SPEC ((CORBA::SystemException));
+
+ void initializers_i (
+ const CORBA::InitializerSeq & initializers
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS
+ )
+ ACE_THROW_SPEC ((CORBA::SystemException));
+
+ virtual CORBA::ValueDef_ptr base_value (
+ ACE_ENV_SINGLE_ARG_DECL_WITH_DEFAULTS
+ )
+ ACE_THROW_SPEC ((CORBA::SystemException));
+
+ CORBA::ValueDef_ptr base_value_i (
+ ACE_ENV_SINGLE_ARG_DECL_WITH_DEFAULTS
+ )
+ ACE_THROW_SPEC ((CORBA::SystemException));
+
+ virtual void base_value (
+ CORBA::ValueDef_ptr base_value
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS
+ )
+ ACE_THROW_SPEC ((CORBA::SystemException));
+
+ void base_value_i (
+ CORBA::ValueDef_ptr base_value
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS
+ )
+ ACE_THROW_SPEC ((CORBA::SystemException));
+
+ virtual CORBA::ValueDefSeq *abstract_base_values (
+ ACE_ENV_SINGLE_ARG_DECL_WITH_DEFAULTS
+ )
+ ACE_THROW_SPEC ((CORBA::SystemException));
+
+ CORBA::ValueDefSeq *abstract_base_values_i (
+ ACE_ENV_SINGLE_ARG_DECL_WITH_DEFAULTS
+ )
+ ACE_THROW_SPEC ((CORBA::SystemException));
+
+ virtual void abstract_base_values (
+ const CORBA::ValueDefSeq & abstract_base_values
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS
+ )
+ ACE_THROW_SPEC ((CORBA::SystemException));
+
+ void abstract_base_values_i (
+ const CORBA::ValueDefSeq & abstract_base_values
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS
+ )
+ ACE_THROW_SPEC ((CORBA::SystemException));
+
+ virtual CORBA::Boolean is_abstract (
+ ACE_ENV_SINGLE_ARG_DECL_WITH_DEFAULTS
+ )
+ ACE_THROW_SPEC ((CORBA::SystemException));
+
+ CORBA::Boolean is_abstract_i (
+ ACE_ENV_SINGLE_ARG_DECL_WITH_DEFAULTS
+ )
+ ACE_THROW_SPEC ((CORBA::SystemException));
+
+ virtual void is_abstract (
+ CORBA::Boolean is_abstract
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS
+ )
+ ACE_THROW_SPEC ((CORBA::SystemException));
+
+ void is_abstract_i (
+ CORBA::Boolean is_abstract
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS
+ )
+ ACE_THROW_SPEC ((CORBA::SystemException));
+
+ virtual CORBA::Boolean is_custom (
+ ACE_ENV_SINGLE_ARG_DECL_WITH_DEFAULTS
+ )
+ ACE_THROW_SPEC ((CORBA::SystemException));
+
+ CORBA::Boolean is_custom_i (
+ ACE_ENV_SINGLE_ARG_DECL_WITH_DEFAULTS
+ )
+ ACE_THROW_SPEC ((CORBA::SystemException));
+
+ virtual void is_custom (
+ CORBA::Boolean is_custom
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS
+ )
+ ACE_THROW_SPEC ((CORBA::SystemException));
+
+ void is_custom_i (
+ CORBA::Boolean is_custom
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS
+ )
+ ACE_THROW_SPEC ((CORBA::SystemException));
+
+ virtual CORBA::Boolean is_truncatable (
+ ACE_ENV_SINGLE_ARG_DECL_WITH_DEFAULTS
+ )
+ ACE_THROW_SPEC ((CORBA::SystemException));
+
+ CORBA::Boolean is_truncatable_i (
+ ACE_ENV_SINGLE_ARG_DECL_WITH_DEFAULTS
+ )
+ ACE_THROW_SPEC ((CORBA::SystemException));
+
+ virtual void is_truncatable (
+ CORBA::Boolean is_truncatable
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS
+ )
+ ACE_THROW_SPEC ((CORBA::SystemException));
+
+ void is_truncatable_i (
+ CORBA::Boolean is_truncatable
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS
+ )
+ ACE_THROW_SPEC ((CORBA::SystemException));
+
+ virtual CORBA::Boolean is_a (
+ const char *id
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS
+ )
+ ACE_THROW_SPEC ((CORBA::SystemException));
+
+ CORBA::Boolean is_a_i (
+ const char *id
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS
+ )
+ ACE_THROW_SPEC ((CORBA::SystemException));
+
+ virtual CORBA::ValueDef::FullValueDescription *describe_value (
+ ACE_ENV_SINGLE_ARG_DECL_WITH_DEFAULTS
+ )
+ ACE_THROW_SPEC ((CORBA::SystemException));
+
+ CORBA::ValueDef::FullValueDescription *describe_value_i (
+ ACE_ENV_SINGLE_ARG_DECL_WITH_DEFAULTS
+ )
+ ACE_THROW_SPEC ((CORBA::SystemException));
+
+ virtual CORBA::ValueMemberDef_ptr create_value_member (
+ const char *id,
+ const char *name,
+ const char *version,
+ CORBA::IDLType_ptr type,
+ CORBA::Visibility access
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS
+ )
+ ACE_THROW_SPEC ((CORBA::SystemException));
+
+ CORBA::ValueMemberDef_ptr create_value_member_i (
+ const char *id,
+ const char *name,
+ const char *version,
+ CORBA::IDLType_ptr type,
+ CORBA::Visibility access
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS
+ )
+ ACE_THROW_SPEC ((CORBA::SystemException));
+
+ virtual CORBA::AttributeDef_ptr create_attribute (
+ const char *id,
+ const char *name,
+ const char *version,
+ CORBA::IDLType_ptr type,
+ CORBA::AttributeMode mode
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS
+ )
+ ACE_THROW_SPEC ((CORBA::SystemException));
+
+ CORBA::AttributeDef_ptr create_attribute_i (
+ const char *id,
+ const char *name,
+ const char *version,
+ CORBA::IDLType_ptr type,
+ CORBA::AttributeMode mode
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS
+ )
+ ACE_THROW_SPEC ((CORBA::SystemException));
+
+ virtual CORBA::OperationDef_ptr create_operation (
+ const char *id,
+ const char *name,
+ const char *version,
+ CORBA::IDLType_ptr result,
+ CORBA::OperationMode mode,
+ const CORBA::ParDescriptionSeq &params,
+ const CORBA::ExceptionDefSeq &exceptions,
+ const CORBA::ContextIdSeq &contexts
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS
+ )
+ ACE_THROW_SPEC ((CORBA::SystemException));
+
+ CORBA::OperationDef_ptr create_operation_i (
+ const char *id,
+ const char *name,
+ const char *version,
+ CORBA::IDLType_ptr result,
+ CORBA::OperationMode mode,
+ const CORBA::ParDescriptionSeq &params,
+ const CORBA::ExceptionDefSeq &exceptions,
+ const CORBA::ContextIdSeq &contexts
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS
+ )
+ ACE_THROW_SPEC ((CORBA::SystemException));
+
+ static int name_clash (const char *name);
+ // Called from TAO_IFR_Service_Utils::name_exists() when we
+ // are a base valuetype.
+
+ void fill_value_description (CORBA::ValueDescription &desc
+ ACE_ENV_ARG_DECL);
+};
+
+TAO_END_VERSIONED_NAMESPACE_DECL
+
+#if defined(_MSC_VER)
+#pragma warning(pop)
+#endif /* _MSC_VER */
+
+#endif /* TAO_VALUEDEF_I_H */
diff --git a/TAO/orbsvcs/orbsvcs/IFRService/ValueMemberDef_i.cpp b/TAO/orbsvcs/orbsvcs/IFRService/ValueMemberDef_i.cpp
new file mode 100644
index 00000000000..bb6b101ddd0
--- /dev/null
+++ b/TAO/orbsvcs/orbsvcs/IFRService/ValueMemberDef_i.cpp
@@ -0,0 +1,224 @@
+// $Id$
+
+#include "orbsvcs/IFRService/Repository_i.h"
+#include "orbsvcs/IFRService/ValueMemberDef_i.h"
+#include "orbsvcs/IFRService/IDLType_i.h"
+#include "orbsvcs/IFRService/IFR_Service_Utils_T.h"
+#include "orbsvcs/IFRService/IFR_Service_Utils.h"
+
+#include "ace/SString.h"
+
+
+ACE_RCSID (IFRService,
+ ValueMemberDef_i,
+ "$Id$")
+
+TAO_BEGIN_VERSIONED_NAMESPACE_DECL
+
+TAO_ValueMemberDef_i::TAO_ValueMemberDef_i (
+ TAO_Repository_i *repo
+ )
+ : TAO_IRObject_i (repo),
+ TAO_Contained_i (repo)
+{
+}
+
+TAO_ValueMemberDef_i::~TAO_ValueMemberDef_i (void)
+{
+}
+
+CORBA::DefinitionKind
+TAO_ValueMemberDef_i::def_kind (ACE_ENV_SINGLE_ARG_DECL_NOT_USED)
+ ACE_THROW_SPEC ((CORBA::SystemException))
+{
+ return CORBA::dk_ValueMember;
+}
+
+CORBA::Contained::Description *
+TAO_ValueMemberDef_i::describe (ACE_ENV_SINGLE_ARG_DECL)
+ ACE_THROW_SPEC ((CORBA::SystemException))
+{
+ TAO_IFR_READ_GUARD_RETURN (0);
+
+ this->update_key (ACE_ENV_SINGLE_ARG_PARAMETER);
+ ACE_CHECK_RETURN (0);
+
+ return this->describe_i (ACE_ENV_SINGLE_ARG_PARAMETER);
+}
+
+CORBA::Contained::Description *
+TAO_ValueMemberDef_i::describe_i (ACE_ENV_SINGLE_ARG_DECL)
+ ACE_THROW_SPEC ((CORBA::SystemException))
+{
+ CORBA::ValueMember vm;
+ TAO_IFR_Desc_Utils<CORBA::ValueMember,
+ TAO_ValueMemberDef_i>::fill_desc_begin (
+ vm,
+ this->repo_,
+ this->section_key_
+ ACE_ENV_ARG_PARAMETER
+ );
+ ACE_CHECK_RETURN (0);
+
+ vm.type = this->type_i (ACE_ENV_SINGLE_ARG_PARAMETER);
+ ACE_CHECK_RETURN (0);
+
+ ACE_TString holder;
+ this->repo_->config ()->get_string_value (this->section_key_,
+ "type_path",
+ holder);
+ CORBA::Object_var obj =
+ TAO_IFR_Service_Utils::path_to_ir_object (holder,
+ this->repo_
+ ACE_ENV_ARG_PARAMETER);
+ ACE_CHECK_RETURN (0);
+
+ vm.type_def = CORBA::IDLType::_narrow (obj.in ()
+ ACE_ENV_ARG_PARAMETER);
+ ACE_CHECK_RETURN (0);
+
+ CORBA::ULong val = 0;
+ this->repo_->config ()->get_integer_value (this->section_key_,
+ "access",
+ val);
+ vm.access = static_cast<CORBA::Visibility> (val);
+
+ CORBA::Contained::Description *retval = 0;
+ ACE_NEW_RETURN (retval,
+ CORBA::Contained::Description,
+ 0);
+
+ retval->kind = CORBA::dk_ValueMember;
+ retval->value <<= vm;
+ return retval;
+}
+
+CORBA::TypeCode_ptr
+TAO_ValueMemberDef_i::type (ACE_ENV_SINGLE_ARG_DECL)
+ ACE_THROW_SPEC ((CORBA::SystemException))
+{
+ TAO_IFR_READ_GUARD_RETURN (CORBA::TypeCode::_nil ());
+
+ this->update_key (ACE_ENV_SINGLE_ARG_PARAMETER);
+ ACE_CHECK_RETURN (CORBA::TypeCode::_nil ());
+
+ return this->type_i (ACE_ENV_SINGLE_ARG_PARAMETER);
+}
+
+CORBA::TypeCode_ptr
+TAO_ValueMemberDef_i::type_i (ACE_ENV_SINGLE_ARG_DECL)
+ ACE_THROW_SPEC ((CORBA::SystemException))
+{
+ ACE_TString holder;
+ this->repo_->config ()->get_string_value (this->section_key_,
+ "type_path",
+ holder);
+ TAO_IDLType_i *impl =
+ TAO_IFR_Service_Utils::path_to_idltype (holder,
+ this->repo_);
+ return impl->type_i (ACE_ENV_SINGLE_ARG_PARAMETER);
+}
+
+CORBA::IDLType_ptr
+TAO_ValueMemberDef_i::type_def (ACE_ENV_SINGLE_ARG_DECL)
+ ACE_THROW_SPEC ((CORBA::SystemException))
+{
+ TAO_IFR_READ_GUARD_RETURN (CORBA::IDLType::_nil ());
+
+ this->update_key (ACE_ENV_SINGLE_ARG_PARAMETER);
+ ACE_CHECK_RETURN (CORBA::IDLType::_nil ());
+
+ return this->type_def_i (ACE_ENV_SINGLE_ARG_PARAMETER);
+}
+
+CORBA::IDLType_ptr
+TAO_ValueMemberDef_i::type_def_i (ACE_ENV_SINGLE_ARG_DECL)
+ ACE_THROW_SPEC ((CORBA::SystemException))
+{
+ ACE_TString holder;
+ this->repo_->config ()->get_string_value (this->section_key_,
+ "type_path",
+ holder);
+ CORBA::Object_var obj =
+ TAO_IFR_Service_Utils::path_to_ir_object (holder,
+ this->repo_
+ ACE_ENV_ARG_PARAMETER);
+ ACE_CHECK_RETURN (CORBA::IDLType::_nil ());
+
+ return CORBA::IDLType::_narrow (obj.in ()
+ ACE_ENV_ARG_PARAMETER);
+}
+
+void
+TAO_ValueMemberDef_i::type_def (CORBA::IDLType_ptr type_def
+ ACE_ENV_ARG_DECL)
+ ACE_THROW_SPEC ((CORBA::SystemException))
+{
+ TAO_IFR_WRITE_GUARD;
+
+ this->update_key (ACE_ENV_SINGLE_ARG_PARAMETER);
+ ACE_CHECK;
+
+ this->type_def_i (type_def
+ ACE_ENV_ARG_PARAMETER);
+}
+
+void
+TAO_ValueMemberDef_i::type_def_i (CORBA::IDLType_ptr type_def
+ ACE_ENV_ARG_DECL_NOT_USED)
+ ACE_THROW_SPEC ((CORBA::SystemException))
+{
+ const char *path = TAO_IFR_Service_Utils::reference_to_path (type_def);
+ this->repo_->config ()->set_string_value (this->section_key_,
+ "type_path",
+ path);
+}
+
+CORBA::Visibility
+TAO_ValueMemberDef_i::access (ACE_ENV_SINGLE_ARG_DECL)
+ ACE_THROW_SPEC ((CORBA::SystemException))
+{
+ TAO_IFR_READ_GUARD_RETURN (0);
+
+ this->update_key (ACE_ENV_SINGLE_ARG_PARAMETER);
+ ACE_CHECK_RETURN (0);
+
+ return this->access_i (ACE_ENV_SINGLE_ARG_PARAMETER);
+}
+
+CORBA::Visibility
+TAO_ValueMemberDef_i::access_i (ACE_ENV_SINGLE_ARG_DECL_NOT_USED)
+ ACE_THROW_SPEC ((CORBA::SystemException))
+{
+ CORBA::ULong val = 0;
+ this->repo_->config ()->get_integer_value (this->section_key_,
+ "access",
+ val);
+ return static_cast<CORBA::Visibility> (val);
+}
+
+void
+TAO_ValueMemberDef_i::access (CORBA::Visibility access
+ ACE_ENV_ARG_DECL)
+ ACE_THROW_SPEC ((CORBA::SystemException))
+{
+ TAO_IFR_WRITE_GUARD;
+
+ this->update_key (ACE_ENV_SINGLE_ARG_PARAMETER);
+ ACE_CHECK;
+
+ this->access_i (access
+ ACE_ENV_ARG_PARAMETER);
+}
+
+void
+TAO_ValueMemberDef_i::access_i (CORBA::Visibility access
+ ACE_ENV_ARG_DECL_NOT_USED)
+ ACE_THROW_SPEC ((CORBA::SystemException))
+{
+ this->repo_->config ()->set_integer_value (this->section_key_,
+ "access",
+ access);
+}
+
+TAO_END_VERSIONED_NAMESPACE_DECL
diff --git a/TAO/orbsvcs/orbsvcs/IFRService/ValueMemberDef_i.h b/TAO/orbsvcs/orbsvcs/IFRService/ValueMemberDef_i.h
new file mode 100644
index 00000000000..1da19410d15
--- /dev/null
+++ b/TAO/orbsvcs/orbsvcs/IFRService/ValueMemberDef_i.h
@@ -0,0 +1,132 @@
+// -*- C++ -*-
+
+// $Id$
+
+// ============================================================================
+//
+// = LIBRARY
+// TAO/orbsvcs/orbsvcs/IFRService
+//
+// = FILENAME
+// ValueMemberDef_i.h
+//
+// = DESCRIPTION
+// ValueMemberDef servant class.
+//
+// = AUTHOR
+// Jeff Parsons <parsons@cs.wustl.edu>
+//
+// ============================================================================
+
+#ifndef TAO_VALUEMEMBERDEF_I_H
+#define TAO_VALUEMEMBERDEF_I_H
+
+#include "orbsvcs/IFRService/Contained_i.h"
+#include "orbsvcs/IFRService/ifr_service_export.h"
+
+#if !defined (ACE_LACKS_PRAGMA_ONCE)
+# pragma once
+#endif /* ACE_LACKS_PRAGMA_ONCE */
+
+#if defined(_MSC_VER)
+#pragma warning(push)
+#pragma warning(disable:4250)
+#endif /* _MSC_VER */
+
+TAO_BEGIN_VERSIONED_NAMESPACE_DECL
+
+class TAO_IFRService_Export TAO_ValueMemberDef_i : public virtual TAO_Contained_i
+{
+ // = TITLE
+ // TAO_ValeMemberDef_i
+ //
+ // = DESCRIPTION
+ // Represents the definition of a valuemember structure.
+ //
+public:
+ TAO_ValueMemberDef_i (TAO_Repository_i *repoy);
+ // Constructor
+
+ virtual ~TAO_ValueMemberDef_i (void);
+ // Destructor
+
+ virtual CORBA::DefinitionKind def_kind (
+ ACE_ENV_SINGLE_ARG_DECL_WITH_DEFAULTS)
+
+ ACE_THROW_SPEC ((CORBA::SystemException));
+ // Return our definition kind.
+
+ virtual CORBA::Contained::Description *describe (
+ ACE_ENV_SINGLE_ARG_DECL_WITH_DEFAULTS)
+
+ ACE_THROW_SPEC ((CORBA::SystemException));
+ // From Contained_i's pure virtual function.
+
+ virtual CORBA::Contained::Description *describe_i (
+ ACE_ENV_SINGLE_ARG_DECL_WITH_DEFAULTS)
+
+ ACE_THROW_SPEC ((CORBA::SystemException));
+ // From Contained_i's pure virtual function.
+
+ virtual CORBA::TypeCode_ptr type (
+ ACE_ENV_SINGLE_ARG_DECL_WITH_DEFAULTS)
+
+ ACE_THROW_SPEC ((CORBA::SystemException));
+
+ CORBA::TypeCode_ptr type_i (
+ ACE_ENV_SINGLE_ARG_DECL_WITH_DEFAULTS)
+
+ ACE_THROW_SPEC ((CORBA::SystemException));
+
+ virtual CORBA::IDLType_ptr type_def (
+ ACE_ENV_SINGLE_ARG_DECL_WITH_DEFAULTS)
+
+ ACE_THROW_SPEC ((CORBA::SystemException));
+
+ CORBA::IDLType_ptr type_def_i (
+ ACE_ENV_SINGLE_ARG_DECL_WITH_DEFAULTS)
+
+ ACE_THROW_SPEC ((CORBA::SystemException));
+
+ virtual void type_def (
+ CORBA::IDLType_ptr type_def
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS)
+
+ ACE_THROW_SPEC ((CORBA::SystemException));
+
+ void type_def_i (
+ CORBA::IDLType_ptr type_def
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS)
+
+ ACE_THROW_SPEC ((CORBA::SystemException));
+
+ virtual CORBA::Visibility access (
+ ACE_ENV_SINGLE_ARG_DECL_WITH_DEFAULTS)
+
+ ACE_THROW_SPEC ((CORBA::SystemException));
+
+ CORBA::Visibility access_i (
+ ACE_ENV_SINGLE_ARG_DECL_WITH_DEFAULTS)
+
+ ACE_THROW_SPEC ((CORBA::SystemException));
+
+ virtual void access (
+ CORBA::Visibility access
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS)
+
+ ACE_THROW_SPEC ((CORBA::SystemException));
+
+ void access_i (
+ CORBA::Visibility access
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS)
+
+ ACE_THROW_SPEC ((CORBA::SystemException));
+};
+
+TAO_END_VERSIONED_NAMESPACE_DECL
+
+#if defined(_MSC_VER)
+#pragma warning(pop)
+#endif /* _MSC_VER */
+
+#endif /* TAO_VALUEMEMBERDEF_I_H */
diff --git a/TAO/orbsvcs/orbsvcs/IFRService/WstringDef_i.cpp b/TAO/orbsvcs/orbsvcs/IFRService/WstringDef_i.cpp
new file mode 100644
index 00000000000..252050a2855
--- /dev/null
+++ b/TAO/orbsvcs/orbsvcs/IFRService/WstringDef_i.cpp
@@ -0,0 +1,131 @@
+// $Id$
+
+#include "orbsvcs/IFRService/Repository_i.h"
+#include "orbsvcs/IFRService/WstringDef_i.h"
+
+#include "ace/SString.h"
+
+
+ACE_RCSID (IFRService,
+ WstringDef_i,
+ "$Id$")
+
+TAO_BEGIN_VERSIONED_NAMESPACE_DECL
+
+TAO_WstringDef_i::TAO_WstringDef_i (
+ TAO_Repository_i *repo
+ )
+ : TAO_IRObject_i (repo),
+ TAO_IDLType_i (repo)
+{
+}
+
+TAO_WstringDef_i::~TAO_WstringDef_i (void)
+{
+}
+
+CORBA::DefinitionKind
+TAO_WstringDef_i::def_kind (ACE_ENV_SINGLE_ARG_DECL_NOT_USED)
+ ACE_THROW_SPEC ((CORBA::SystemException))
+{
+ return CORBA::dk_Wstring;
+}
+
+void
+TAO_WstringDef_i::destroy (ACE_ENV_SINGLE_ARG_DECL)
+ ACE_THROW_SPEC ((CORBA::SystemException))
+{
+ TAO_IFR_WRITE_GUARD;
+
+ this->update_key (ACE_ENV_SINGLE_ARG_PARAMETER);
+ ACE_CHECK;
+
+ this->destroy_i (ACE_ENV_SINGLE_ARG_PARAMETER);
+}
+
+void
+TAO_WstringDef_i::destroy_i (ACE_ENV_SINGLE_ARG_DECL_NOT_USED)
+ ACE_THROW_SPEC ((CORBA::SystemException))
+{
+ ACE_TString name;
+ this->repo_->config ()->get_string_value (this->section_key_,
+ "name",
+ name);
+
+ this->repo_->config ()->remove_section (this->repo_->wstrings_key (),
+ name.c_str (),
+ 0);
+}
+
+CORBA::TypeCode_ptr
+TAO_WstringDef_i::type (ACE_ENV_SINGLE_ARG_DECL)
+ ACE_THROW_SPEC ((CORBA::SystemException))
+{
+ TAO_IFR_READ_GUARD_RETURN (CORBA::TypeCode::_nil ());
+
+ this->update_key (ACE_ENV_SINGLE_ARG_PARAMETER);
+ ACE_CHECK_RETURN (CORBA::TypeCode::_nil ());
+
+ return this->type_i (ACE_ENV_SINGLE_ARG_PARAMETER);
+}
+
+CORBA::TypeCode_ptr
+TAO_WstringDef_i::type_i (ACE_ENV_SINGLE_ARG_DECL)
+ ACE_THROW_SPEC ((CORBA::SystemException))
+{
+ CORBA::ULong bound = this->bound_i (ACE_ENV_SINGLE_ARG_PARAMETER);
+ ACE_CHECK_RETURN (CORBA::TypeCode::_nil ());
+
+ return this->repo_->tc_factory ()->create_wstring_tc (bound
+ ACE_ENV_ARG_PARAMETER);
+}
+CORBA::ULong
+TAO_WstringDef_i::bound (ACE_ENV_SINGLE_ARG_DECL)
+ ACE_THROW_SPEC ((CORBA::SystemException))
+{
+ TAO_IFR_READ_GUARD_RETURN (0);
+
+ this->update_key (ACE_ENV_SINGLE_ARG_PARAMETER);
+ ACE_CHECK_RETURN (0);
+
+ return this->bound_i (ACE_ENV_SINGLE_ARG_PARAMETER);
+}
+
+
+CORBA::ULong
+TAO_WstringDef_i::bound_i (ACE_ENV_SINGLE_ARG_DECL_NOT_USED)
+ ACE_THROW_SPEC ((CORBA::SystemException))
+{
+ u_int retval = 0;
+ this->repo_->config ()->get_integer_value (this->section_key_,
+ "bound",
+ retval);
+
+ return static_cast<CORBA::ULong> (retval);
+}
+
+void
+TAO_WstringDef_i::bound (CORBA::ULong bound
+ ACE_ENV_ARG_DECL)
+ ACE_THROW_SPEC ((CORBA::SystemException))
+{
+ TAO_IFR_WRITE_GUARD;
+
+ this->update_key (ACE_ENV_SINGLE_ARG_PARAMETER);
+ ACE_CHECK;
+
+ this->bound_i (bound
+ ACE_ENV_ARG_PARAMETER);
+}
+
+void
+TAO_WstringDef_i::bound_i (CORBA::ULong bound
+ ACE_ENV_ARG_DECL_NOT_USED)
+ ACE_THROW_SPEC ((CORBA::SystemException))
+{
+ this->repo_->config ()->set_integer_value (this->section_key_,
+ "bound",
+ bound);
+}
+
+TAO_END_VERSIONED_NAMESPACE_DECL
diff --git a/TAO/orbsvcs/orbsvcs/IFRService/WstringDef_i.h b/TAO/orbsvcs/orbsvcs/IFRService/WstringDef_i.h
new file mode 100644
index 00000000000..c1317c0a888
--- /dev/null
+++ b/TAO/orbsvcs/orbsvcs/IFRService/WstringDef_i.h
@@ -0,0 +1,113 @@
+// -*- C++ -*-
+
+// $Id$
+
+// ============================================================================
+//
+// = LIBRARY
+// TAO/orbsvcs/orbsvcs/IFRService
+//
+// = FILENAME
+// WstringDef_i.h
+//
+// = DESCRIPTION
+// WstringDef servant class.
+//
+// = AUTHOR
+// Jeff Parsons <parsons@cs.wustl.edu>
+//
+// ============================================================================
+
+#ifndef TAO_WSTRINGDEF_I_H
+#define TAO_WSTRINGDEF_I_H
+
+#include "orbsvcs/IFRService/IDLType_i.h"
+#include "orbsvcs/IFRService/ifr_service_export.h"
+
+#if !defined (ACE_LACKS_PRAGMA_ONCE)
+# pragma once
+#endif /* ACE_LACKS_PRAGMA_ONCE */
+
+#if defined(_MSC_VER)
+#pragma warning(push)
+#pragma warning(disable:4250)
+#endif /* _MSC_VER */
+
+TAO_BEGIN_VERSIONED_NAMESPACE_DECL
+
+class TAO_IFRService_Export TAO_WstringDef_i : public virtual TAO_IDLType_i
+{
+ // = TITLE
+ // TAO_WstringDef_i
+ //
+ // = DESCRIPTION
+ // Represents a bounded wstring (unbounded wstrings
+ // are included in PrimitiveDef).
+ //
+public:
+ TAO_WstringDef_i (TAO_Repository_i *repo);
+ // Constructor.
+
+ virtual ~TAO_WstringDef_i (void);
+ // Destructor.
+
+ virtual CORBA::DefinitionKind def_kind (
+ ACE_ENV_SINGLE_ARG_DECL_WITH_DEFAULTS)
+
+ ACE_THROW_SPEC ((CORBA::SystemException));
+ // Return our definition kind.
+
+ virtual void destroy (
+ ACE_ENV_SINGLE_ARG_DECL_WITH_DEFAULTS)
+
+ ACE_THROW_SPEC ((CORBA::SystemException));
+ // Remove the repository entry.
+
+ virtual void destroy_i (
+ ACE_ENV_SINGLE_ARG_DECL_WITH_DEFAULTS)
+
+ ACE_THROW_SPEC ((CORBA::SystemException));
+
+ virtual CORBA::TypeCode_ptr type (
+ ACE_ENV_SINGLE_ARG_DECL_WITH_DEFAULTS)
+
+ ACE_THROW_SPEC ((CORBA::SystemException));
+ // From IDLType_i's virtual function.
+
+ virtual CORBA::TypeCode_ptr type_i (
+ ACE_ENV_SINGLE_ARG_DECL_WITH_DEFAULTS)
+
+ ACE_THROW_SPEC ((CORBA::SystemException));
+ // From IDLType_i's virtual function.
+
+ virtual CORBA::ULong bound (
+ ACE_ENV_SINGLE_ARG_DECL_WITH_DEFAULTS)
+
+ ACE_THROW_SPEC ((CORBA::SystemException));
+
+ CORBA::ULong bound_i (
+ ACE_ENV_SINGLE_ARG_DECL_WITH_DEFAULTS)
+
+ ACE_THROW_SPEC ((CORBA::SystemException));
+
+ virtual void bound (
+ CORBA::ULong bound
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS)
+
+ ACE_THROW_SPEC ((CORBA::SystemException));
+
+ void bound_i (
+ CORBA::ULong bound
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS)
+
+ ACE_THROW_SPEC ((CORBA::SystemException));
+};
+
+TAO_END_VERSIONED_NAMESPACE_DECL
+
+#if defined(_MSC_VER)
+#pragma warning(pop)
+#endif /* _MSC_VER */
+
+#endif /* TAO_WSTRINGDEF_I_H */
+
diff --git a/TAO/orbsvcs/orbsvcs/IFRService/concrete_classes.h b/TAO/orbsvcs/orbsvcs/IFRService/concrete_classes.h
new file mode 100644
index 00000000000..27407fa581c
--- /dev/null
+++ b/TAO/orbsvcs/orbsvcs/IFRService/concrete_classes.h
@@ -0,0 +1,54 @@
+// $Id$
+
+// ============================================================================
+//
+// = LIBRARY
+// TAO/tests/Param_Test
+//
+// = FILENAME
+// concrete_classes.h
+//
+// = DESCRIPTION
+// All the concrete class header files needed by the servant locator.
+//
+// = AUTHORS
+// Jeff Parsons
+//
+// ============================================================================
+
+#ifndef CONCRETE_CLASSES_H
+#define CONCRETE_CLASSES_H
+
+#include "orbsvcs/IFRService/PrimitiveDef_i.h"
+#include "orbsvcs/IFRService/StringDef_i.h"
+#include "orbsvcs/IFRService/WstringDef_i.h"
+#include "orbsvcs/IFRService/SequenceDef_i.h"
+#include "orbsvcs/IFRService/ArrayDef_i.h"
+#include "orbsvcs/IFRService/FixedDef_i.h"
+#include "orbsvcs/IFRService/EnumDef_i.h"
+#include "orbsvcs/IFRService/AliasDef_i.h"
+#include "orbsvcs/IFRService/NativeDef_i.h"
+#include "orbsvcs/IFRService/ValueBoxDef_i.h"
+#include "orbsvcs/IFRService/UnionDef_i.h"
+#include "orbsvcs/IFRService/StructDef_i.h"
+#include "orbsvcs/IFRService/ValueMemberDef_i.h"
+#include "orbsvcs/IFRService/FactoryDef_i.h"
+#include "orbsvcs/IFRService/AttributeDef_i.h"
+#include "orbsvcs/IFRService/ConstantDef_i.h"
+#include "orbsvcs/IFRService/ValueDef_i.h"
+#include "orbsvcs/IFRService/ExceptionDef_i.h"
+#include "orbsvcs/IFRService/ModuleDef_i.h"
+#include "orbsvcs/IFRService/ExtAbstractInterfaceDef_i.h"
+#include "orbsvcs/IFRService/ExtLocalInterfaceDef_i.h"
+
+#include "orbsvcs/IFRService/ComponentDef_i.h"
+#include "orbsvcs/IFRService/HomeDef_i.h"
+#include "orbsvcs/IFRService/FinderDef_i.h"
+#include "orbsvcs/IFRService/ConsumesDef_i.h"
+#include "orbsvcs/IFRService/PublishesDef_i.h"
+#include "orbsvcs/IFRService/EmitsDef_i.h"
+#include "orbsvcs/IFRService/EventDef_i.h"
+#include "orbsvcs/IFRService/ProvidesDef_i.h"
+#include "orbsvcs/IFRService/UsesDef_i.h"
+
+#endif /* CONCRETE_CLASSES_H */
diff --git a/TAO/orbsvcs/orbsvcs/IFRService/ifr_service_export.h b/TAO/orbsvcs/orbsvcs/IFRService/ifr_service_export.h
new file mode 100644
index 00000000000..4e1aed48095
--- /dev/null
+++ b/TAO/orbsvcs/orbsvcs/IFRService/ifr_service_export.h
@@ -0,0 +1,40 @@
+
+// -*- C++ -*-
+// $Id$
+// Definition for Win32 Export directives.
+// This file is generated automatically by generate_export_file.pl
+// ------------------------------
+#ifndef TAO_IFRSERVICE_EXPORT_H
+#define TAO_IFRSERVICE_EXPORT_H
+
+#include "ace/config-all.h"
+
+#if defined (TAO_AS_STATIC_LIBS)
+# if !defined (TAO_IFRSERVICE_HAS_DLL)
+# define TAO_IFRSERVICE_HAS_DLL 0
+# endif /* ! TAO_IFRSERVICE_HAS_DLL */
+#else
+# if !defined (TAO_IFRSERVICE_HAS_DLL)
+# define TAO_IFRSERVICE_HAS_DLL 1
+# endif /* ! TAO_IFRSERVICE_HAS_DLL */
+#endif
+
+#if defined (TAO_IFRSERVICE_HAS_DLL) && (TAO_IFRSERVICE_HAS_DLL == 1)
+# if defined (TAO_IFRSERVICE_BUILD_DLL)
+# define TAO_IFRService_Export ACE_Proper_Export_Flag
+# define TAO_IFRSERVICE_SINGLETON_DECLARATION(T) ACE_EXPORT_SINGLETON_DECLARATION (T)
+# define TAO_IFRSERVICE_SINGLETON_DECLARE(SINGLETON_TYPE, CLASS, LOCK) ACE_EXPORT_SINGLETON_DECLARE(SINGLETON_TYPE, CLASS, LOCK)
+# else /* TAO_IFRSERVICE_BUILD_DLL */
+# define TAO_IFRService_Export ACE_Proper_Import_Flag
+# define TAO_IFRSERVICE_SINGLETON_DECLARATION(T) ACE_IMPORT_SINGLETON_DECLARATION (T)
+# define TAO_IFRSERVICE_SINGLETON_DECLARE(SINGLETON_TYPE, CLASS, LOCK) ACE_IMPORT_SINGLETON_DECLARE(SINGLETON_TYPE, CLASS, LOCK)
+# endif /* TAO_IFRSERVICE_BUILD_DLL */
+#else /* TAO_IFRSERVICE_HAS_DLL == 1 */
+# define TAO_IFRService_Export
+# define TAO_IFRSERVICE_SINGLETON_DECLARATION(T)
+# define TAO_IFRSERVICE_SINGLETON_DECLARE(SINGLETON_TYPE, CLASS, LOCK)
+#endif /* TAO_IFRSERVICE_HAS_DLL == 1 */
+
+#endif /* TAO_IFRSERVICE_EXPORT_H */
+
+// End of auto generated file.
diff --git a/TAO/orbsvcs/orbsvcs/IOR_Multicast.cpp b/TAO/orbsvcs/orbsvcs/IOR_Multicast.cpp
new file mode 100644
index 00000000000..73a947638cf
--- /dev/null
+++ b/TAO/orbsvcs/orbsvcs/IOR_Multicast.cpp
@@ -0,0 +1,321 @@
+// $Id$
+
+#include "orbsvcs/IOR_Multicast.h"
+
+#include "tao/debug.h"
+
+#include "ace/SOCK_Connector.h"
+#include "ace/Log_Msg.h"
+
+ACE_RCSID (orbsvcs,
+ IOR_Multicast,
+ "$Id$")
+
+TAO_BEGIN_VERSIONED_NAMESPACE_DECL
+
+ACE_HANDLE
+TAO_IOR_Multicast::get_handle (void) const
+{
+ return this->mcast_dgram_.get_handle ();
+}
+
+TAO_IOR_Multicast::TAO_IOR_Multicast (void)
+ : service_id_ ((TAO_Service_ID) 0)
+{
+}
+
+TAO_IOR_Multicast::TAO_IOR_Multicast (const char *ior,
+ u_short port,
+ const char *mcast_addr,
+ TAO_Service_ID service_id)
+{
+ if (this->init (ior,
+ port,
+ mcast_addr,
+ service_id) == -1)
+ ACE_ERROR ((LM_ERROR,
+ ACE_TEXT ("%p\n"),
+ ACE_TEXT ("TAO_IOR_Multicast")));
+}
+
+TAO_IOR_Multicast::~TAO_IOR_Multicast (void)
+{
+ if (ior_.length() > 0 && this->mcast_dgram_.leave (this->mcast_addr_) == -1)
+ {
+ ACE_ERROR ((LM_ERROR, "%p\n", "~TAO_IOR_Multicast()"));
+ }
+}
+
+int
+TAO_IOR_Multicast::init (const char *ior,
+ u_short port,
+ const char *mcast_addr,
+ TAO_Service_ID service_id)
+{
+ if (this->mcast_addr_.set (port, mcast_addr) == -1)
+ ACE_ERROR_RETURN ((LM_ERROR, "TAO_IOR_Multicast::init() %p\n", "set"), -1);
+ return common_init (ior, service_id);
+}
+
+int
+TAO_IOR_Multicast::init (const char *ior,
+ const char *mcast_addr,
+ TAO_Service_ID service_id)
+{
+ // Look for a '@' incase a nic is specified.
+ const char* tmpnic = ACE_OS::strchr (mcast_addr, '@');
+
+ CORBA::String_var actual_mcast_addr;
+ CORBA::ULong length_addr;
+
+ if (tmpnic != 0)
+ {
+ // i.e. a nic name has been specified
+ length_addr = tmpnic - mcast_addr + 1;
+ actual_mcast_addr = CORBA::string_alloc (length_addr);
+
+ ACE_OS::strncpy (actual_mcast_addr.inout (),
+ mcast_addr,
+ length_addr - 1);
+
+ actual_mcast_addr[length_addr - 1] = '\0';
+
+ /// Save for use later.
+ this->mcast_nic_ = tmpnic + 1;
+ }
+ else
+ {
+ actual_mcast_addr =
+ CORBA::string_alloc (static_cast<CORBA::ULong> (ACE_OS::strlen (mcast_addr)));
+
+ actual_mcast_addr = mcast_addr;
+ }
+
+ if (this->mcast_addr_.set (actual_mcast_addr.in ()) == -1)
+ ACE_ERROR_RETURN ((LM_ERROR,
+ "%p\n",
+ "set"),
+ -1);
+
+ return common_init (ior, service_id);
+}
+
+int
+TAO_IOR_Multicast::common_init (const char *ior,
+ TAO_Service_ID service_id)
+{
+ this->service_id_ = service_id;
+ this->ior_ = ior;
+
+ if (this->response_addr_.set ((u_short) 0) == -1)
+ ACE_ERROR_RETURN ((LM_ERROR,
+ "TAO_IOR_Multicast::common_init() %p\n",
+ "set"),
+ -1);
+ else if (this->response_.open (this->response_addr_) == -1)
+ {
+ ACE_ERROR_RETURN ((LM_ERROR,
+ "%p\n",
+ "set"),
+ -1);
+ }
+
+ // Use ACE_SOCK_Dgram_Mcast factory to subscribe to multicast group.
+ if (this->mcast_nic_.length() != 0)
+ {
+ if (this->mcast_dgram_.subscribe (this->mcast_addr_,
+ 1,
+ ACE_TEXT_CHAR_TO_TCHAR(this->mcast_nic_.c_str())) == -1)
+ ACE_ERROR_RETURN ((LM_ERROR, "TAO_IOR_Multicast::common_init() %p\n", "subscribe"),-1);
+ }
+ else
+ {
+ if (this->mcast_dgram_.subscribe (this->mcast_addr_) == -1)
+ ACE_ERROR_RETURN ((LM_ERROR,
+ "TAO_IOR_Multicast::common_init() %p\n",
+ "subscribe"),
+ -1);
+ }
+ return 0;
+}
+
+int
+TAO_IOR_Multicast::handle_timeout (const ACE_Time_Value &,
+ const void *)
+{
+ return 0;
+}
+
+int
+TAO_IOR_Multicast::handle_input (ACE_HANDLE)
+{
+ if (TAO_debug_level > 0)
+ ACE_DEBUG ((LM_DEBUG, "Entered TAO_IOR_Multicast::handle_input\n"));
+
+ // The length of the service name string that follows.
+ CORBA::Short header;
+ // Port to which to reply.
+ ACE_UINT16 remote_port;
+ // Name of the service for which the client is looking.
+ char service_name[BUFSIZ];
+
+ ACE_INET_Addr remote_addr;
+
+ // Take a peek at the header to find out how long is the service
+ // name string we should receive.
+ ssize_t n = this->mcast_dgram_.recv (&header,
+ sizeof (header),
+ remote_addr,
+ MSG_PEEK);
+ if (n <= 0)
+ ACE_ERROR_RETURN ((LM_ERROR,
+ "TAO_IOR_Multicast::handle_input - peek %d\n",
+ n),
+ 0);
+ else if (ACE_NTOHS (header) <= 0)
+ ACE_ERROR_RETURN ((LM_ERROR,
+ "TAO_IOR_Multicast::handle_input() Header value < 1\n"),
+ 0);
+
+ // Receive full client multicast request.
+ const int iovcnt = 3;
+ iovec iov[iovcnt];
+
+ iov[0].iov_base = (char *) &header;
+ iov[0].iov_len = sizeof (header);
+ iov[1].iov_base = (char *) &remote_port;
+ iov[1].iov_len = sizeof (ACE_UINT16);
+ iov[2].iov_base = (char *) service_name;
+ iov[2].iov_len = ACE_NTOHS (header);
+
+ // Read the iovec.
+ n = this->mcast_dgram_.recv (iov,
+ iovcnt,
+ remote_addr);
+ if (n <= 0)
+ ACE_ERROR_RETURN ((LM_ERROR,
+ "TAO_IOR_Multicast::handle_input recv = %d\n",
+ n),
+ 0);
+
+ if (TAO_debug_level > 0)
+ {
+ ACE_TCHAR addr[64];
+ remote_addr.addr_to_string (addr, sizeof(addr));
+ ACE_DEBUG ((LM_DEBUG,
+ "(%P|%t) Received multicast from %s.\n"
+ "Service Name received : %s\n"
+ "Port received : %u\n",
+ addr,
+ service_name,
+ ACE_NTOHS (remote_port)));
+ }
+
+ if (ACE_OS::strcmp (service_name,
+ "NameService") != 0
+ && ACE_OS::strcmp (service_name,
+ "TradingService") != 0
+ && ACE_OS::strcmp (service_name,
+ "ImplRepoService") != 0
+ && ACE_OS::strcmp (service_name,
+ "InterfaceRepository") != 0
+ && ACE_OS::strcmp (service_name,
+ "MCASTServer") != 0)
+ {
+ ACE_ERROR_RETURN ((LM_ERROR,
+ "IOR_Multicast::connect() Unknown service requested.\n"),0);
+ }
+
+ // Reply to the multicast message.
+ ACE_SOCK_Connector connector;
+ ACE_INET_Addr peer_addr;
+ ACE_SOCK_Stream stream;
+
+ peer_addr.set (remote_addr);
+ peer_addr.set_port_number (ACE_NTOHS (remote_port));
+
+#if defined (ACE_HAS_IPV6)
+ if (peer_addr.is_linklocal ())
+ {
+ // If this is one of our local linklocal interfaces this is not going
+ // to work.
+ // Creating a connection using such interface to the client listening
+ // at the IPv6 ANY address is not going to work (I'm not quite sure why
+ // but it probably has to do with the rather restrictive routing rules
+ // for linklocal interfaces).
+ // So we see if this is one of our local interfaces and if so create the
+ // connection using the IPv6 loopback address instead.
+ ACE_INET_Addr peer_tmp(peer_addr);
+ peer_tmp.set_port_number (static_cast<u_short> (0));
+ ACE_INET_Addr* tmp = 0;
+ size_t cnt = 0;
+ int err = ACE::get_ip_interfaces (cnt, tmp);
+ if (err == 0)
+ {
+ for (size_t i = 0; i < cnt; ++i)
+ {
+ if (peer_tmp == tmp[i])
+ {
+ peer_addr.set (ACE_NTOHS (remote_port),
+ ACE_IPV6_LOCALHOST);
+ break;
+ }
+ }
+
+ delete[] tmp;
+ }
+ }
+#endif /* ACE_HAS_IPV6 */
+
+ if (TAO_debug_level > 0)
+ {
+ ACE_TCHAR addr[64];
+ peer_addr.addr_to_string (addr, sizeof(addr));
+ ACE_DEBUG ((LM_DEBUG,
+ "(%P|%t) Replying to peer %s.\n",
+ addr));
+ }
+
+ // Connect.
+ if (connector.connect (stream, peer_addr) == -1)
+ ACE_ERROR_RETURN ((LM_ERROR, "IOR_Multicast::connect failed\n"), 0);
+ // Send the IOR back to the client. (Send iovec, which contains ior
+ // length as the first element, and ior itself as the second.)
+
+ // Length of ior to be sent.
+ CORBA::Short data_len =
+ static_cast<CORBA::Short> (ACE_HTONS (this->ior_.length () + 1));
+
+ // Vector to be sent.
+ const int cnt = 2;
+ iovec iovp[cnt];
+
+ // The length of ior to be sent.
+ iovp[0].iov_base = (char *) &data_len;
+ iovp[0].iov_len = sizeof (CORBA::Short);
+
+ // The ior.
+ iovp[1].iov_base = const_cast<char*> (this->ior_.c_str ());
+ iovp[1].iov_len = static_cast<u_long> (this->ior_.length () + 1);
+
+ ssize_t result = stream.sendv_n (iovp, cnt);
+ // Close the stream.
+ stream.close ();
+
+ // Check for error.
+ if (result == -1)
+ ACE_ERROR_RETURN ((LM_ERROR, "IOR_Multicast::send failed\n"), 0);
+
+ if (TAO_debug_level > 0)
+ ACE_DEBUG ((LM_DEBUG,
+ "(%P|%t) TAO_IOR_Multicast::handle_input() ior_: <%s>\n"
+ "sent to %s:%u.\n"
+ "result from send = %d\n",
+ this->ior_.c_str (),
+ peer_addr.get_host_name (),
+ peer_addr.get_port_number (),
+ result));
+ return 0;
+}
+
+TAO_END_VERSIONED_NAMESPACE_DECL
diff --git a/TAO/orbsvcs/orbsvcs/IOR_Multicast.h b/TAO/orbsvcs/orbsvcs/IOR_Multicast.h
new file mode 100644
index 00000000000..9963e2fa222
--- /dev/null
+++ b/TAO/orbsvcs/orbsvcs/IOR_Multicast.h
@@ -0,0 +1,114 @@
+// -*- C++ -*-
+
+// $Id$
+
+// ============================================================================
+//
+// = LIBRARY
+// TAO/orbsvcs/orbsvcs
+//
+// = FILENAME
+// IOR_Multicast.h
+//
+// = DESCRIPTION
+// Defines a class that listens to a multicast address for client requests
+// for ior of a bootstrappable service.
+//
+// = AUTHORS
+// Sergio Flores-Gaitan
+//
+// ============================================================================
+
+#ifndef TAO_IOR_MULTICAST_H
+#define TAO_IOR_MULTICAST_H
+#include /**/ "ace/pre.h"
+
+#include "orbsvcs/svc_utils_export.h"
+#include "tao/ORB.h"
+
+#if !defined (ACE_LACKS_PRAGMA_ONCE)
+# pragma once
+#endif /* ACE_LACKS_PRAGMA_ONCE */
+
+#include "ace/INET_Addr.h"
+#include "ace/SOCK_Dgram_Mcast.h"
+#include "ace/Reactor.h"
+#include "ace/SString.h"
+
+TAO_BEGIN_VERSIONED_NAMESPACE_DECL
+
+class TAO_Svc_Utils_Export TAO_IOR_Multicast : public ACE_Event_Handler
+{
+ // = TITLE
+ // Event Handler that services multicast requests for IOR of a
+ // bootstrappable service.
+ //
+ // = DESCRIPTION
+ // This class uses the ACE_SOCK_Dgram_Mcast class and should be
+ // registered with a reactor and should be initialized with the
+ // ior of the service to be multicasted.
+public:
+ TAO_IOR_Multicast (void);
+ // Constructor.
+
+ TAO_IOR_Multicast (const char *ior,
+ u_short port,
+ const char *mcast_addr,
+ TAO_Service_ID service_id);
+ // Constructor taking the ior of the service.
+
+ int init (const char *ior,
+ u_short port,
+ const char *mcast_addr,
+ TAO_Service_ID service_id);
+ // Initialization method.
+
+ int init (const char *ior,
+ const char *mcast_addr,
+ TAO_Service_ID service_id);
+ // Initialization method. Takes in "address:port" string as a
+ // parameter.
+
+ virtual ~TAO_IOR_Multicast (void);
+ // Destructor.
+
+ virtual int handle_input (ACE_HANDLE n);
+ // Callback when input is received on the handle.
+
+ virtual int handle_timeout (const ACE_Time_Value &tv,
+ const void *arg);
+ // Callback when a timeout has occurred.
+
+ virtual ACE_HANDLE get_handle (void) const;
+ // Returns the internal handle used to receive multicast.
+
+private:
+ int common_init (const char *ior,
+ TAO_Service_ID service_id);
+ // Factor common functionality from the two init functions.
+
+ TAO_Service_ID service_id_;
+ // Service id that we're waiting for.
+
+ ACE_SOCK_Dgram_Mcast mcast_dgram_;
+ // multicast endpoint of communication
+
+ ACE_INET_Addr mcast_addr_;
+ // multicast address
+
+ ACE_CString ior_;
+ // object reference to send in response to the multicast
+
+ ACE_INET_Addr response_addr_;
+ // address of response.
+
+ ACE_SOCK_Dgram response_;
+ // socket for response to the multicast
+
+ ACE_CString mcast_nic_;
+};
+
+TAO_END_VERSIONED_NAMESPACE_DECL
+
+#include /**/ "ace/post.h"
+#endif /* TAO_IOR_MULTICAST_H */
diff --git a/TAO/orbsvcs/orbsvcs/LB_ORT.idl b/TAO/orbsvcs/orbsvcs/LB_ORT.idl
new file mode 100644
index 00000000000..0134ff0cc96
--- /dev/null
+++ b/TAO/orbsvcs/orbsvcs/LB_ORT.idl
@@ -0,0 +1,28 @@
+// -*- IDL -*-
+
+//=============================================================================
+/**
+ * @file LB_ORT.idl
+ *
+ * $Id$
+ */
+//=============================================================================
+
+
+#ifndef TAO_LB_ORT_IDL
+#define TAO_LB_ORT_IDL
+
+#include "tao/ObjRefTemplate/ObjectReferenceTemplate_include.pidl"
+
+
+module TAO_LB
+{
+ typeprefix TAO_LB "tao.lb";
+
+ valuetype ObjectReferenceFactory
+ : PortableInterceptor::ObjectReferenceFactory {};
+
+};
+
+
+#endif /* TAO_LB_ORT_IDL */
diff --git a/TAO/orbsvcs/orbsvcs/LifeCycle/lifecycle_export.h b/TAO/orbsvcs/orbsvcs/LifeCycle/lifecycle_export.h
new file mode 100644
index 00000000000..3ceb2c30777
--- /dev/null
+++ b/TAO/orbsvcs/orbsvcs/LifeCycle/lifecycle_export.h
@@ -0,0 +1,40 @@
+
+// -*- C++ -*-
+// $Id$
+// Definition for Win32 Export directives.
+// This file is generated automatically by generate_export_file.pl
+// ------------------------------
+#ifndef TAO_LIFECYCLE_EXPORT_H
+#define TAO_LIFECYCLE_EXPORT_H
+
+#include "ace/config-all.h"
+
+#if defined (TAO_AS_STATIC_LIBS)
+# if !defined (TAO_LIFECYCLE_HAS_DLL)
+# define TAO_LIFECYCLE_HAS_DLL 0
+# endif /* ! TAO_LIFECYCLE_HAS_DLL */
+#else
+# if !defined (TAO_LIFECYCLE_HAS_DLL)
+# define TAO_LIFECYCLE_HAS_DLL 1
+# endif /* ! TAO_LIFECYCLE_HAS_DLL */
+#endif
+
+#if defined (TAO_LIFECYCLE_HAS_DLL) && (TAO_LIFECYCLE_HAS_DLL == 1)
+# if defined (TAO_LIFECYCLE_BUILD_DLL)
+# define TAO_LifeCycle_Export ACE_Proper_Export_Flag
+# define TAO_LIFECYCLE_SINGLETON_DECLARATION(T) ACE_EXPORT_SINGLETON_DECLARATION (T)
+# define TAO_LIFECYCLE_SINGLETON_DECLARE(SINGLETON_TYPE, CLASS, LOCK) ACE_EXPORT_SINGLETON_DECLARE(SINGLETON_TYPE, CLASS, LOCK)
+# else /* TAO_LIFECYCLE_BUILD_DLL */
+# define TAO_LifeCycle_Export ACE_Proper_Import_Flag
+# define TAO_LIFECYCLE_SINGLETON_DECLARATION(T) ACE_IMPORT_SINGLETON_DECLARATION (T)
+# define TAO_LIFECYCLE_SINGLETON_DECLARE(SINGLETON_TYPE, CLASS, LOCK) ACE_IMPORT_SINGLETON_DECLARE(SINGLETON_TYPE, CLASS, LOCK)
+# endif /* TAO_LIFECYCLE_BUILD_DLL */
+#else /* TAO_LIFECYCLE_HAS_DLL == 1 */
+# define TAO_LifeCycle_Export
+# define TAO_LIFECYCLE_SINGLETON_DECLARATION(T)
+# define TAO_LIFECYCLE_SINGLETON_DECLARE(SINGLETON_TYPE, CLASS, LOCK)
+#endif /* TAO_LIFECYCLE_HAS_DLL == 1 */
+
+#endif /* TAO_LIFECYCLE_EXPORT_H */
+
+// End of auto generated file.
diff --git a/TAO/orbsvcs/orbsvcs/LifeCycleService.idl b/TAO/orbsvcs/orbsvcs/LifeCycleService.idl
new file mode 100644
index 00000000000..8322d49137e
--- /dev/null
+++ b/TAO/orbsvcs/orbsvcs/LifeCycleService.idl
@@ -0,0 +1,83 @@
+// $Id$
+
+// ============================================================================
+//
+// = FILENAME
+// LifeCycleService.idl
+//
+// = DESCRIPTION
+// A generic creation service named lifecycle service using
+// the GenericFactory interface of the LifeCycle Service specification.
+//
+// = AUTHOR
+// Michael Kircher (mk1@cs.wustl.edu)
+//
+// ============================================================================
+
+#ifndef TAO_LIFECYCLESERVICE_IDL
+#define TAO_LIFECYCLESERVICE_IDL
+
+#include "CosLifeCycle.idl"
+
+module LifeCycleService
+{
+ interface Life_Cycle_Service : CosLifeCycle::GenericFactory
+ {
+ // = TITLE
+ // Wrapper for the CosLifeCycle GenericFactory
+ //
+ // = inherits:
+ // boolean supports(in Key k);
+ // Object create_object(in Key k, in Criteria the_criteria)
+ // raises (NoFactory, InvalidCriteria, CannotMeetCriteria);
+
+ void register_factory (in string name,
+ in string location,
+ in string description,
+ in Object _object);
+ // provide an method for registering factories with their properties
+ };
+
+ interface Criteria_Evaluator
+ {
+ // = TITLE
+ // Criteria Evaluator
+ //
+ // = DESCRIPTION
+ // Interface description for an evaluator of CosLifeCycle
+ // Criterias. It is mainly a wrapper, which should make
+ // access easier.
+ //
+ // @@ NOTE: The definition should be this. But see note below!
+ // typedef sequence <CosLifeCycle::NameValuePair> SeqNamedValuePair;
+
+ // @@ NOTE: This is just a workaround for a problem seen with
+ // explicit template builds. This file and CosLifeCycle.idl
+ // define a sequence of the same data structure which creates
+ // multiply defined symbols in the above configuration. We need
+ // to fix the IDL compile at some point of time. Till then this
+ // should be okay...
+ typedef CosLifeCycle::Criteria SeqNamedValuePair;
+ typedef CosLifeCycle::Criteria Criteria;
+
+ exception NotAvailable { string reason; };
+ // raised if the questioned configuration is not available
+
+ SeqNamedValuePair getInitialization ();
+ // get the initialization
+
+ string getFilter ();
+ // get a filter string
+
+ SeqNamedValuePair getLogicalLocation ();
+ // get the logical location
+
+ string getPreferences ();
+ // get the preferences, not implemented
+
+ void setCriteria (in Criteria criteria_);
+ // set the Criteria which is searched for keywords
+ };
+};
+
+#endif /* TAO_LIFECYCLESERVICE_IDL */
diff --git a/TAO/orbsvcs/orbsvcs/LoadBalancing/LB_CPU_Load_Average_Monitor.cpp b/TAO/orbsvcs/orbsvcs/LoadBalancing/LB_CPU_Load_Average_Monitor.cpp
new file mode 100644
index 00000000000..5ea2a76ec77
--- /dev/null
+++ b/TAO/orbsvcs/orbsvcs/LoadBalancing/LB_CPU_Load_Average_Monitor.cpp
@@ -0,0 +1,244 @@
+#include "orbsvcs/LoadBalancing/LB_CPU_Load_Average_Monitor.h"
+#include "tao/ORB_Constants.h"
+#include "ace/OS_NS_time.h"
+#include "ace/OS_NS_stdio.h"
+#include "ace/OS_NS_unistd.h"
+#include "ace/os_include/os_netdb.h"
+#include "ace/os_include/sys/os_pstat.h"
+#include "ace/os_include/sys/os_loadavg.h"
+#if defined(__NetBSD__) || defined (__APPLE__)
+#include <sys/sysctl.h>
+#endif
+
+ACE_RCSID (LoadBalancing,
+ LB_CPU_Load_Average_Monitor,
+ "$Id$")
+
+TAO_BEGIN_VERSIONED_NAMESPACE_DECL
+
+TAO_LB_CPU_Load_Average_Monitor::TAO_LB_CPU_Load_Average_Monitor (
+ const char * location_id,
+ const char * location_kind)
+ : location_ (1)
+{
+ this->location_.length (1);
+
+ if (location_id == 0)
+ {
+ char host[MAXHOSTNAMELEN + 1];
+ if (ACE_OS::hostname (host, sizeof (host)) != 0)
+ {
+ // Couldn't determine hostname. Use the current time
+ // instead.
+ CORBA::ULong t = static_cast<CORBA::ULong> (ACE_OS::time ());
+
+ // A 64 byte buffer is more than enough to contain the
+ // string representation of a 32 bit unsigned integer.
+ char buf[64] = { '\0' };
+ ACE_OS::sprintf (buf, "%u", t);
+
+ this->location_[0].id = CORBA::string_dup (buf);
+ this->location_[0].kind = CORBA::string_dup ("Creation Time");
+ }
+ else
+ {
+ this->location_[0].id = CORBA::string_dup (host);
+ this->location_[0].kind = CORBA::string_dup ("Hostname");
+ }
+ }
+ else
+ {
+ this->location_[0].id = CORBA::string_dup (location_id);
+
+ if (location_kind != 0)
+ this->location_[0].kind = CORBA::string_dup (location_kind);
+ }
+}
+
+TAO_LB_CPU_Load_Average_Monitor::~TAO_LB_CPU_Load_Average_Monitor (void)
+{
+}
+
+CosLoadBalancing::Location *
+TAO_LB_CPU_Load_Average_Monitor::the_location (ACE_ENV_SINGLE_ARG_DECL)
+ ACE_THROW_SPEC ((CORBA::SystemException))
+{
+ CosLoadBalancing::Location * location;
+ ACE_NEW_THROW_EX (location,
+ CosLoadBalancing::Location (this->location_),
+ CORBA::NO_MEMORY (
+ CORBA::SystemException::_tao_minor_code (
+ TAO::VMCID,
+ ENOMEM),
+ CORBA::COMPLETED_NO));
+ ACE_CHECK_RETURN (0);
+
+ return location;
+}
+
+CosLoadBalancing::LoadList *
+TAO_LB_CPU_Load_Average_Monitor::loads (ACE_ENV_SINGLE_ARG_DECL)
+ ACE_THROW_SPEC ((CORBA::SystemException))
+{
+ CORBA::Float load = 0;
+
+ // Obtain the number of processors each time a load is computed.
+ // The idea is to take into account the processor failures that can
+ // occur on platforms that continue running with the remaining
+ // processors.
+ //
+ // @@ Is this a realistic scenario? Perhaps we should just cache
+ // the number of processors and assume that any processor failure
+ // is a catastrophic one.
+
+#if 0
+
+ SYSTEM_INFO sys_info;
+ ::GetSystemInfo (&sys_info);
+
+ ACE_ASSERT (sys_info.dwNumberOfProcessors > 0);
+
+ load = ::GetLoadAvg () / sys_info.dwNumberOfProcessors;
+
+#elif defined (linux) || defined (sun)
+
+ // Only bother getting the load average over the last minute.
+ //
+ // @todo Make this configurable so that the load average over the
+ // last 5 and 15 minutes can be used instead.
+ double loadavg[1];
+
+# if defined (linux) \
+ && ((defined (__GLIBC__) && defined (__GLIBC_MINOR__) \
+ && __GLIBC__ == 2 && __GLIBC_MINOR__ < 2) \
+ || (!defined (_BSD_SOURCE) && !defined (_GNU_SOURCE)))
+
+ // GLibc < 2.2 does not implement getloadavg(). Furthermore,
+ // getloadavg() is only "visible" if _BSD_SOURCE or _GNU_SOURCE is
+ // defined.
+
+ // Obtain the load average directly from the `/proc' filesystem.
+ FILE * s = ::fopen ("/proc/loadavg", "r");
+
+ if (s == 0)
+ ACE_THROW_RETURN (CORBA::NO_IMPLEMENT (
+ CORBA::SystemException::_tao_minor_code (
+ TAO::VMCID,
+ errno),
+ CORBA::COMPLETED_NO),
+ 0);
+
+ fscanf (s, "%f", &loadavg[0]);
+
+ (void) fclose (s);
+
+ const int samples = 1;
+
+# else
+
+# if defined (ACE_LACKS_GETLOADAVG)
+
+ const int samples = 0;
+
+# else
+
+ const int samples = ::getloadavg (loadavg, 1);
+
+# endif /* ACE_LACKS_GETLOADAVG */
+
+# endif /* linux
+ && ((__GLIBC__ == 2 && __GLIBC_MINOR__ < 2)
+ || (!_BSD_SOURCE && !_GNU_SOURCE)) */
+
+ if (samples == 1)
+ {
+ const long num_processors = ::sysconf (_SC_NPROCESSORS_ONLN);
+
+ ACE_ASSERT (num_processors > 0);
+
+ if (num_processors > 0)
+ load = loadavg[0] / num_processors;
+ else
+ ACE_THROW_RETURN (CORBA::TRANSIENT (), 0); // Correct exception?
+ }
+ else
+ ACE_THROW_RETURN (CORBA::TRANSIENT (), 0); // Correct exception?
+
+#elif defined (__NetBSD__) || defined (__APPLE__)
+
+ double loadavg[1];
+
+ const int samples = ::getloadavg (loadavg, 1);
+
+ if (samples == 1)
+ {
+ int mib[2], num_processors;
+ size_t len;
+
+ mib[0] = CTL_HW;
+ mib[1] = HW_NCPU;
+ len = sizeof(num_processors);
+
+ sysctl(mib, 2, &num_processors, &len, NULL, 0);
+
+ ACE_ASSERT (num_processors > 0);
+
+ if (num_processors > 0)
+ load = loadavg[0] / num_processors;
+ else
+ ACE_THROW_RETURN (CORBA::TRANSIENT (), 0); // Correct exception?
+ }
+ else
+ ACE_THROW_RETURN (CORBA::TRANSIENT (), 0); // Correct exception?
+
+#elif defined (__hpux)
+
+ struct pst_dynamic psd;
+
+ if (::pstat_getdynamic (&psd, sizeof (psd), (size_t) 1, 0) != -1)
+ {
+ const long & num_processors = psd.psd_proc_cnt;
+
+ ACE_ASSERT (num_processors > 0);
+
+ if (num_processors > 0)
+ load = psd.psd_avg_1_min / num_processors;
+ else
+ ACE_THROW_RETURN (CORBA::TRANSIENT (), 0); // Correct exception?
+ }
+ else
+ ACE_THROW_RETURN (CORBA::TRANSIENT (), 0); // Correct exception?
+
+#endif
+
+#if defined (linux) || defined (sun) || defined (__hpux) || defined(__NetBSD__) || defined (__APPLE__)
+
+ CosLoadBalancing::LoadList * tmp;
+ ACE_NEW_THROW_EX (tmp,
+ CosLoadBalancing::LoadList (1),
+ CORBA::NO_MEMORY (
+ CORBA::SystemException::_tao_minor_code (
+ TAO::VMCID,
+ ENOMEM),
+ CORBA::COMPLETED_NO));
+ ACE_CHECK_RETURN (0);
+
+ CosLoadBalancing::LoadList_var load_list = tmp;
+
+ load_list->length (1);
+
+ load_list[0].id = CosLoadBalancing::LoadAverage;
+ load_list[0].value = load;
+
+ return load_list._retn ();
+
+#else
+
+ ACE_UNUSED_ARG (load);
+ ACE_THROW_RETURN (CORBA::NO_IMPLEMENT (), 0);
+
+#endif /* linux || sun || __hpux || __NetBSD__ || __APPLE__ */
+
+}
+
+TAO_END_VERSIONED_NAMESPACE_DECL
diff --git a/TAO/orbsvcs/orbsvcs/LoadBalancing/LB_CPU_Load_Average_Monitor.h b/TAO/orbsvcs/orbsvcs/LoadBalancing/LB_CPU_Load_Average_Monitor.h
new file mode 100644
index 00000000000..12bb7c1df80
--- /dev/null
+++ b/TAO/orbsvcs/orbsvcs/LoadBalancing/LB_CPU_Load_Average_Monitor.h
@@ -0,0 +1,103 @@
+// -*- C++ -*-
+
+//=============================================================================
+/**
+ * @file LB_CPU_Load_Average_Monitor.h
+ *
+ * $Id$
+ *
+ * @author Ossama Othman <ossama@uci.edu>
+ */
+//=============================================================================
+
+
+#ifndef TAO_LB_CPU_LOAD_AVERAGE_MONITOR_H
+#define TAO_LB_CPU_LOAD_AVERAGE_MONITOR_H
+
+#include /**/ "ace/pre.h"
+
+#include "orbsvcs/LoadBalancing/LoadBalancing_export.h"
+
+# if !defined (ACE_LACKS_PRAGMA_ONCE)
+# pragma once
+# endif /* ACE_LACKS_PRAGMA_ONCE */
+
+#include "orbsvcs/CosLoadBalancingS.h"
+
+TAO_BEGIN_VERSIONED_NAMESPACE_DECL
+
+/**
+ * @class TAO_LB_CPU_Load_Average_Monitor
+ *
+ * @brief LoadMonitor implementation that monitors the overall CPU
+ * load on a given host.
+ *
+ * Loads returned from this load monitor are the average number of
+ * processes in the "run" queue over a ***FIXME*** seconds averaged
+ * over the number of processors. For example, a load of 2 on a dual
+ * CPU host is returned as an average load of 1 by this CPU load
+ * monitor, a load of 5 on a quad CPU host will be reported as a load
+ * of 1.25 (i.e. 5/4), and so on and so forth.
+ */
+class TAO_LoadBalancing_Export TAO_LB_CPU_Load_Average_Monitor
+ : public virtual POA_CosLoadBalancing::LoadMonitor
+{
+public:
+
+ /// Constructor
+ /**
+ * If no location is supplied the hostname or IP address is used by
+ * default.
+ */
+ TAO_LB_CPU_Load_Average_Monitor (const char * location_id = 0,
+ const char * location_kind = 0);
+
+ /**
+ * @name CosLoadBalancing::LoadMonitor Methods
+ *
+ * Methods required by the CosLoadBalancing::LoadMonitor interface.
+ */
+ //@{
+
+ /// Return the location at which the LoadMonitor resides.
+ /**
+ * The returned "Location" is a sequence of length 1.
+ */
+ virtual CosLoadBalancing::Location * the_location (
+ ACE_ENV_SINGLE_ARG_DECL_WITH_DEFAULTS)
+ ACE_THROW_SPEC ((CORBA::SystemException));
+
+ /// Return the average CPU load at the location which this
+ /// LoadMonitor resides.
+ /**
+ * @return A "Load" sequence of length 1 that contains a LoadId
+ * equal to CosLoadBalancing::LoadAverage, and the average CPU
+ * load.
+ */
+ virtual CosLoadBalancing::LoadList * loads (
+ ACE_ENV_SINGLE_ARG_DECL_WITH_DEFAULTS)
+ ACE_THROW_SPEC ((CORBA::SystemException));
+
+ //@}
+
+protected:
+
+ /// Destructor
+ /**
+ * Protected destructor to enforce proper memory management through
+ * reference counting.
+ */
+ ~TAO_LB_CPU_Load_Average_Monitor (void);
+
+private:
+
+ /// The name of the location at which this LoadMonitor resides.
+ CosLoadBalancing::Location location_;
+
+};
+
+TAO_END_VERSIONED_NAMESPACE_DECL
+
+#include /**/ "ace/post.h"
+
+#endif /* TAO_LB_CPU_LOAD_AVERAGE_MONITOR_H */
diff --git a/TAO/orbsvcs/orbsvcs/LoadBalancing/LB_CPU_Utilization_Monitor.cpp b/TAO/orbsvcs/orbsvcs/LoadBalancing/LB_CPU_Utilization_Monitor.cpp
new file mode 100644
index 00000000000..48a8267e189
--- /dev/null
+++ b/TAO/orbsvcs/orbsvcs/LoadBalancing/LB_CPU_Utilization_Monitor.cpp
@@ -0,0 +1,170 @@
+#include "orbsvcs/LoadBalancing/LB_CPU_Utilization_Monitor.h"
+#include "tao/ORB_Constants.h"
+#include "ace/OS_NS_time.h"
+#include "ace/OS_NS_stdio.h"
+#include "ace/OS_NS_string.h"
+#include "ace/OS_NS_unistd.h"
+#include "ace/os_include/os_netdb.h"
+#include "ace/os_include/sys/os_loadavg.h"
+
+ACE_RCSID (LoadBalancing,
+ LB_CPU_Utilization_Monitor,
+ "$Id$")
+
+TAO_BEGIN_VERSIONED_NAMESPACE_DECL
+
+double calc_cpu_loading (void)
+{
+ static char buf[1024];
+ static unsigned long prev_idle = 0;
+ static double prev_total = 0.0;
+
+ FILE *file_ptr = 0;
+ char *item = 0;
+ char *arg = 0;
+ unsigned long delta_idle = 0;
+ unsigned long user = 0;
+ unsigned long nice = 0;
+ unsigned long idle = 0;
+ unsigned long sys = 0;
+
+ double percent_cpu_load = 0.0;
+
+ if ((file_ptr = fopen("/proc/stat", "r")) == 0)
+ return percent_cpu_load;
+
+ while ((fgets (buf, sizeof (buf), file_ptr)) != 0)
+ {
+ item = ACE_OS::strtok (buf, " \t\n");
+ arg = ACE_OS::strtok (0, "\n");
+
+ if (item == 0 || arg == 0)
+ continue;
+ if (item[0] == 'c' && strlen (item) == 3)
+ {
+ sscanf (arg, "%lu %lu %lu %lu", &user, &nice, &sys, &idle);
+ break;
+ }
+
+
+ }
+
+ fclose (file_ptr);
+
+ delta_idle = idle - prev_idle;
+ double total;
+ double time_passed;
+ total = (double) (user + nice + sys + idle);
+ time_passed = total - prev_total;
+
+ percent_cpu_load = 100.0 - (delta_idle / time_passed * 100.0);
+
+ prev_idle = idle;
+ prev_total = total;
+
+ return percent_cpu_load;
+
+}
+
+
+TAO_LB_CPU_Utilization_Monitor::TAO_LB_CPU_Utilization_Monitor (const char * location_id,
+ const char * location_kind)
+ : location_ (1)
+{
+ this->location_.length (1);
+
+ if (location_id == 0)
+ {
+ char host[MAXHOSTNAMELEN + 1];
+ if (ACE_OS::hostname (host, sizeof (host)) != 0)
+ {
+ // Couldn't determine hostname. Use the current time
+ // instead.
+ CORBA::ULong t = static_cast<CORBA::ULong> (ACE_OS::time ());
+
+ // A 64 byte buffer is more than enough to contain the
+ // string representation of a 32 bit unsigned integer.
+ char buf[64] = { '\0' };
+ ACE_OS::sprintf (buf, "%u", t);
+
+ this->location_[0].id = CORBA::string_dup (buf);
+ this->location_[0].kind = CORBA::string_dup ("Creation Time");
+ }
+ else
+ {
+ this->location_[0].id = CORBA::string_dup (host);
+ this->location_[0].kind = CORBA::string_dup ("Hostname");
+ }
+ }
+ else
+ {
+ this->location_[0].id = CORBA::string_dup (location_id);
+
+ if (location_kind != 0)
+ this->location_[0].kind = CORBA::string_dup (location_kind);
+ }
+}
+
+TAO_LB_CPU_Utilization_Monitor::~TAO_LB_CPU_Utilization_Monitor (void)
+{
+}
+
+CosLoadBalancing::Location *
+TAO_LB_CPU_Utilization_Monitor::the_location (ACE_ENV_SINGLE_ARG_DECL)
+ ACE_THROW_SPEC ((CORBA::SystemException))
+{
+ CosLoadBalancing::Location * location;
+ ACE_NEW_THROW_EX (location,
+ CosLoadBalancing::Location (this->location_),
+ CORBA::NO_MEMORY (
+ CORBA::SystemException::_tao_minor_code (
+ TAO::VMCID,
+ ENOMEM),
+ CORBA::COMPLETED_NO));
+ ACE_CHECK_RETURN (0);
+
+ return location;
+}
+
+CosLoadBalancing::LoadList *
+TAO_LB_CPU_Utilization_Monitor::loads (ACE_ENV_SINGLE_ARG_DECL)
+ ACE_THROW_SPEC ((CORBA::SystemException))
+{
+ CORBA::Float load = 0;
+
+#if defined (linux) || defined (sun)
+
+ double load_double = calc_cpu_loading ();
+ load = load_double;
+
+ CosLoadBalancing::LoadList * tmp;
+ ACE_NEW_THROW_EX (tmp,
+ CosLoadBalancing::LoadList (1),
+ CORBA::NO_MEMORY (
+ CORBA::SystemException::_tao_minor_code (
+ TAO::VMCID,
+ ENOMEM),
+ CORBA::COMPLETED_NO));
+ ACE_CHECK_RETURN (0);
+
+ CosLoadBalancing::LoadList_var load_list = tmp;
+
+ load_list->length (1);
+
+ load_list[0].id = CosLoadBalancing::LoadAverage;
+ load_list[0].value = load;
+
+ ACE_DEBUG ((LM_DEBUG, "%2f\n", load_list[0].value));
+
+ return load_list._retn ();
+
+#else
+
+ ACE_UNUSED_ARG (load);
+ ACE_THROW_RETURN (CORBA::NO_IMPLEMENT (), 0);
+
+#endif /* linux || sun */
+
+}
+
+TAO_END_VERSIONED_NAMESPACE_DECL
diff --git a/TAO/orbsvcs/orbsvcs/LoadBalancing/LB_CPU_Utilization_Monitor.h b/TAO/orbsvcs/orbsvcs/LoadBalancing/LB_CPU_Utilization_Monitor.h
new file mode 100644
index 00000000000..c369ce8e2c0
--- /dev/null
+++ b/TAO/orbsvcs/orbsvcs/LoadBalancing/LB_CPU_Utilization_Monitor.h
@@ -0,0 +1,100 @@
+// -*- C++ -*-
+
+//=============================================================================
+/**
+ * @file LB_CPU_Utilization_Monitor.h
+ *
+ * $Id$
+ *
+ * @author Jaiganesh Balasubramanian <jai@dre.vanderbilt.edu>
+ * @author Ossama Othman <ossama@uci.edu>
+ */
+//=============================================================================
+
+
+#ifndef TAO_LB_CPU_UTILIZATION_MONITOR_H
+#define TAO_LB_CPU_UTILIZATION_MONITOR_H
+
+#include /**/ "ace/pre.h"
+
+#include "orbsvcs/LoadBalancing/LoadBalancing_export.h"
+
+# if !defined (ACE_LACKS_PRAGMA_ONCE)
+# pragma once
+# endif /* ACE_LACKS_PRAGMA_ONCE */
+
+#include "orbsvcs/CosLoadBalancingS.h"
+
+TAO_BEGIN_VERSIONED_NAMESPACE_DECL
+
+/**
+ * @class TAO_LB_CPU_Utilization_Monitor
+ *
+ * @brief LoadMonitor implementation that monitors the overall CPU
+ * load on a given host.
+ *
+ * Loads returned from this load monitor is the utilization of
+ * CPU in the "form" of percentage.
+ */
+class TAO_LoadBalancing_Export TAO_LB_CPU_Utilization_Monitor
+ : public virtual POA_CosLoadBalancing::LoadMonitor
+{
+public:
+
+ /// Constructor
+ /**
+ * If no location is supplied the hostname or IP address is used by
+ * default.
+ */
+ TAO_LB_CPU_Utilization_Monitor (const char * location_id = 0,
+ const char * location_kind = 0);
+
+ /**
+ * @name CosLoadBalancing::LoadMonitor Methods
+ *
+ * Methods required by the CosLoadBalancing::LoadMonitor interface.
+ */
+ //@{
+
+ /// Return the location at which the LoadMonitor resides.
+ /**
+ * The returned "Location" is a sequence of length 1.
+ */
+ virtual CosLoadBalancing::Location * the_location (
+ ACE_ENV_SINGLE_ARG_DECL_WITH_DEFAULTS)
+ ACE_THROW_SPEC ((CORBA::SystemException));
+
+ /// Return the average CPU load at the location which this
+ /// LoadMonitor resides.
+ /**
+ * @return A "Load" sequence of length 1 that contains a LoadId
+ * equal to CosLoadBalancing::LoadAverage, and the average CPU
+ * load.
+ */
+ virtual CosLoadBalancing::LoadList * loads (
+ ACE_ENV_SINGLE_ARG_DECL_WITH_DEFAULTS)
+ ACE_THROW_SPEC ((CORBA::SystemException));
+
+ //@}
+
+protected:
+
+ /// Destructor
+ /**
+ * Protected destructor to enforce proper memory management through
+ * reference counting.
+ */
+ ~TAO_LB_CPU_Utilization_Monitor (void);
+
+private:
+
+ /// The name of the location at which this LoadMonitor resides.
+ CosLoadBalancing::Location location_;
+
+};
+
+TAO_END_VERSIONED_NAMESPACE_DECL
+
+#include /**/ "ace/post.h"
+
+#endif /* TAO_LB_CPU_UTILIZATION_MONITOR_H */
diff --git a/TAO/orbsvcs/orbsvcs/LoadBalancing/LB_ClientComponent.cpp b/TAO/orbsvcs/orbsvcs/LoadBalancing/LB_ClientComponent.cpp
new file mode 100644
index 00000000000..abfe60c3f23
--- /dev/null
+++ b/TAO/orbsvcs/orbsvcs/LoadBalancing/LB_ClientComponent.cpp
@@ -0,0 +1,70 @@
+#include "orbsvcs/LoadBalancing/LB_ClientComponent.h"
+#include "orbsvcs/LoadBalancing/LB_ClientORBInitializer.h"
+
+#include "tao/ORB_Constants.h"
+#include "tao/ORBInitializer_Registry.h"
+
+ACE_RCSID (LoadBalancing,
+ LB_ClientComponent,
+ "$Id$")
+
+TAO_BEGIN_VERSIONED_NAMESPACE_DECL
+
+int
+TAO_LB_ClientComponent::init (int /* argc */, ACE_TCHAR * /* argv */[])
+{
+ return this->register_orb_initializer ();
+}
+
+int
+TAO_LB_ClientComponent::fini (void)
+{
+ return 0;
+}
+
+int
+TAO_LB_ClientComponent::register_orb_initializer (void)
+{
+ ACE_DECLARE_NEW_CORBA_ENV;
+ ACE_TRY
+ {
+ // Register the LB_ClientComponent ORB initializer.
+ PortableInterceptor::ORBInitializer_ptr tmp;
+ ACE_NEW_THROW_EX (tmp,
+ TAO_LB_ClientORBInitializer,
+ CORBA::NO_MEMORY (
+ CORBA::SystemException::_tao_minor_code (
+ TAO::VMCID,
+ ENOMEM),
+ CORBA::COMPLETED_NO));
+ ACE_TRY_CHECK;
+
+ PortableInterceptor::ORBInitializer_var initializer = tmp;
+
+ PortableInterceptor::register_orb_initializer (initializer.in ()
+ ACE_ENV_ARG_PARAMETER);
+ ACE_TRY_CHECK;
+ }
+ ACE_CATCHANY
+ {
+ ACE_PRINT_EXCEPTION (ACE_ANY_EXCEPTION,
+ "Unable to register LB_ClientComponent ORB "
+ "initializer.");
+ return -1;
+ }
+ ACE_ENDTRY;
+
+ return 0;
+}
+
+TAO_END_VERSIONED_NAMESPACE_DECL
+
+ACE_STATIC_SVC_DEFINE (TAO_LB_ClientComponent,
+ ACE_TEXT ("LB_ClientComponent"),
+ ACE_SVC_OBJ_T,
+ &ACE_SVC_NAME (TAO_LB_ClientComponent),
+ ACE_Service_Type::DELETE_THIS |
+ ACE_Service_Type::DELETE_OBJ,
+ 0)
+
+ACE_FACTORY_DEFINE (TAO_LoadBalancing, TAO_LB_ClientComponent)
diff --git a/TAO/orbsvcs/orbsvcs/LoadBalancing/LB_ClientComponent.h b/TAO/orbsvcs/orbsvcs/LoadBalancing/LB_ClientComponent.h
new file mode 100644
index 00000000000..8431950aff4
--- /dev/null
+++ b/TAO/orbsvcs/orbsvcs/LoadBalancing/LB_ClientComponent.h
@@ -0,0 +1,68 @@
+// -*- C++ -*-
+
+//=============================================================================
+/**
+ * @file LB_ClientComponent.h
+ *
+ * $Id$
+
+ * @author Ossama Othman <ossama@uci.edu>
+ */
+//=============================================================================
+
+#ifndef TAO_LB_CLIENTCOMPONENT_H
+#define TAO_LB_CLIENTCOMPONENT_H
+
+#include /**/ "ace/pre.h"
+
+#include "orbsvcs/LoadBalancing/LoadBalancing_export.h"
+
+#if !defined (ACE_LACKS_PRAGMA_ONCE)
+# pragma once
+#endif /* ACE_LACKS_PRAGMA_ONCE */
+
+#include "orbsvcs/LB_ORTC.h"
+
+#include "ace/Service_Object.h"
+#include "ace/Service_Config.h"
+
+TAO_BEGIN_VERSIONED_NAMESPACE_DECL
+
+/**
+ * @class TAO_LB_ClientComponent
+ *
+ * @brief Service_Object that can be used to add load balancer support
+ * to a CORBA-based client.
+ *
+ * CORBA applications wishing to transparently add load shedding support
+ * can load this object via the ACE_Service_Configurator (e.g. by
+ * listing it in a `svc.conf' file).
+ */
+class TAO_LoadBalancing_Export TAO_LB_ClientComponent
+ : public ACE_Service_Object
+{
+public:
+
+ /// Initializes object when dynamic linking occurs.
+ virtual int init (int argc, ACE_TCHAR *argv[]);
+
+ /// Terminates object when dynamic unlinking occurs.
+ virtual int fini (void);
+
+protected:
+
+ /// Register the LB_ClientComponent's ORBInitializer.
+ int register_orb_initializer (void);
+
+};
+
+TAO_END_VERSIONED_NAMESPACE_DECL
+
+ACE_STATIC_SVC_DECLARE_EXPORT (TAO_LoadBalancing, TAO_LB_ClientComponent)
+ACE_STATIC_SVC_REQUIRE (TAO_LB_ClientComponent)
+ACE_FACTORY_DECLARE (TAO_LoadBalancing, TAO_LB_ClientComponent)
+
+
+#include /**/ "ace/post.h"
+
+#endif /* TAO_LB_CLIENTCOMPONENT_H */
diff --git a/TAO/orbsvcs/orbsvcs/LoadBalancing/LB_ClientORBInitializer.cpp b/TAO/orbsvcs/orbsvcs/LoadBalancing/LB_ClientORBInitializer.cpp
new file mode 100644
index 00000000000..10ef40d2a54
--- /dev/null
+++ b/TAO/orbsvcs/orbsvcs/LoadBalancing/LB_ClientORBInitializer.cpp
@@ -0,0 +1,43 @@
+#include "orbsvcs/LoadBalancing/LB_ClientORBInitializer.h"
+#include "orbsvcs/LoadBalancing/LB_ClientRequestInterceptor.h"
+
+#include "tao/ORB_Constants.h"
+
+ACE_RCSID (LoadBalancing,
+ LB_ClientORBInitializer,
+ "$Id$")
+
+TAO_BEGIN_VERSIONED_NAMESPACE_DECL
+
+void
+TAO_LB_ClientORBInitializer::pre_init (
+ PortableInterceptor::ORBInitInfo_ptr
+ ACE_ENV_ARG_DECL_NOT_USED)
+ ACE_THROW_SPEC ((CORBA::SystemException))
+{
+}
+
+void
+TAO_LB_ClientORBInitializer::post_init (
+ PortableInterceptor::ORBInitInfo_ptr info
+ ACE_ENV_ARG_DECL)
+ ACE_THROW_SPEC ((CORBA::SystemException))
+{
+ PortableInterceptor::ClientRequestInterceptor_ptr tmp;
+ ACE_NEW_THROW_EX (tmp,
+ TAO_LB_ClientRequestInterceptor,
+ CORBA::NO_MEMORY (
+ CORBA::SystemException::_tao_minor_code (
+ TAO::VMCID,
+ ENOMEM),
+ CORBA::COMPLETED_NO));
+ ACE_CHECK;
+
+ PortableInterceptor::ClientRequestInterceptor_var client_interceptor = tmp;
+
+ info->add_client_request_interceptor (client_interceptor.in ()
+ ACE_ENV_ARG_PARAMETER);
+ ACE_CHECK;
+}
+
+TAO_END_VERSIONED_NAMESPACE_DECL
diff --git a/TAO/orbsvcs/orbsvcs/LoadBalancing/LB_ClientORBInitializer.h b/TAO/orbsvcs/orbsvcs/LoadBalancing/LB_ClientORBInitializer.h
new file mode 100644
index 00000000000..595c7198ea0
--- /dev/null
+++ b/TAO/orbsvcs/orbsvcs/LoadBalancing/LB_ClientORBInitializer.h
@@ -0,0 +1,78 @@
+// -*- C++ -*-
+
+//=============================================================================
+/**
+ * @file LB_ClientORBInitializer.h
+ *
+ * $Id$
+ *
+ * @author Ossama Othman <ossama@uci.edu>
+ */
+//=============================================================================
+
+
+#ifndef TAO_LB_CLIENT_ORB_INITIALIZER_H
+#define TAO_LB_CLIENT_ORB_INITIALIZER_H
+
+#include /**/ "ace/pre.h"
+
+#include "tao/PI/PI.h"
+
+#if !defined (ACE_LACKS_PRAGMA_ONCE)
+# pragma once
+#endif /* ACE_LACKS_PRAGMA_ONCE */
+
+#include "tao/LocalObject.h"
+
+// This is to remove "inherits via dominance" warnings from MSVC.
+// MSVC is being a little too paranoid.
+#if defined(_MSC_VER)
+#pragma warning(push)
+#pragma warning(disable:4250)
+#endif /* _MSC_VER */
+
+TAO_BEGIN_VERSIONED_NAMESPACE_DECL
+
+/**
+ * @class TAO_LB_ORBInitializer
+ *
+ * @brief ORBInitializer for the LB_ClientComponent Service_Object.
+ *
+ * This ORBInitializer simply creates and registers with the ORB the
+ * ClientRequestInterceptor that handles injection of the
+ * CosLoadBalancing::LOAD_MANAGED ServiceContext into each request's
+ * ServiceContextList.
+ */
+class TAO_LB_ClientORBInitializer
+ : public virtual PortableInterceptor::ORBInitializer,
+ public virtual TAO_Local_RefCounted_Object
+{
+public:
+
+ /**
+ * @name PortableInterceptor::ORBInitializer Methods
+ *
+ * Methods required by the PortableInterceptor::ORBInitializer
+ * interface.
+ */
+ //@{
+ virtual void pre_init (PortableInterceptor::ORBInitInfo_ptr info
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS)
+ ACE_THROW_SPEC ((CORBA::SystemException));
+
+ virtual void post_init (PortableInterceptor::ORBInitInfo_ptr info
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS)
+ ACE_THROW_SPEC ((CORBA::SystemException));
+ //@}
+
+};
+
+TAO_END_VERSIONED_NAMESPACE_DECL
+
+#if defined(_MSC_VER)
+#pragma warning(pop)
+#endif /* _MSC_VER */
+
+#include /**/ "ace/post.h"
+
+#endif /* TAO_LB_CLIENT_ORB_INITIALIZER_H */
diff --git a/TAO/orbsvcs/orbsvcs/LoadBalancing/LB_ClientRequestInterceptor.cpp b/TAO/orbsvcs/orbsvcs/LoadBalancing/LB_ClientRequestInterceptor.cpp
new file mode 100644
index 00000000000..870a88577d2
--- /dev/null
+++ b/TAO/orbsvcs/orbsvcs/LoadBalancing/LB_ClientRequestInterceptor.cpp
@@ -0,0 +1,114 @@
+#include "orbsvcs/LoadBalancing/LB_ClientRequestInterceptor.h"
+
+#include "orbsvcs/CosLoadBalancingC.h"
+
+
+ACE_RCSID (LoadBalancing,
+ TAO_LB_ClientRequestInterceptor,
+ "$Id$")
+
+TAO_BEGIN_VERSIONED_NAMESPACE_DECL
+
+char *
+TAO_LB_ClientRequestInterceptor::name (
+ ACE_ENV_SINGLE_ARG_DECL_NOT_USED)
+ ACE_THROW_SPEC ((CORBA::SystemException))
+{
+ return CORBA::string_dup ("TAO_LB_ClientRequestInterceptor");
+}
+
+void
+TAO_LB_ClientRequestInterceptor::destroy (ACE_ENV_SINGLE_ARG_DECL_NOT_USED)
+ ACE_THROW_SPEC ((CORBA::SystemException))
+{
+}
+
+void
+TAO_LB_ClientRequestInterceptor::send_request (
+ PortableInterceptor::ClientRequestInfo_ptr ri
+ ACE_ENV_ARG_DECL)
+ ACE_THROW_SPEC ((CORBA::SystemException,
+ PortableInterceptor::ForwardRequest))
+{
+ /*
+ CORBA::Object_var t = ri->target (ACE_ENV_SINGLE_ARG_PARAMETER);
+ ACE_CHECK;
+ */
+
+ // A ServiceContext with an empty payload (i.e. zero length
+ // context_data) will be embedded into the request.
+ IOP::ServiceContext service_context;
+ service_context.context_id = CosLoadBalancing::LOAD_MANAGED;
+
+
+ /*
+ // A CDR encapsulation IOP::Codec could be used here, but it uses
+ // interpreted marshaling, which is slower than the compiled
+ // marshaling used below.
+
+ TAO_OutputCDR cdr;
+ cdr << TAO_OutputCDR::from_boolean (TAO_ENCAP_BYTE_ORDER);
+
+ // Marshal the target object, i.e. the object reference that points
+ // back to the object group into the ServiceContextList.
+ cdr << t.in ();
+
+ // TAO extension, replace the contents of the octet sequence with
+ // the CDR stream.
+ const CORBA::ULong tl = cdr.total_length ();
+ service_context.context_data.length (tl);
+ CORBA::Octet * buf = service_context.context_data.get_buffer ();
+ for (const ACE_Message_Block * i = cdr.begin ();
+ i != 0;
+ i = i->cont ())
+ {
+ const size_t len = i->length ();
+
+ // @todo It would be nice to avoid this copy.
+ ACE_OS::memcpy (buf, i->rd_ptr (), len);
+ buf += len;
+ }
+ */
+
+ const CORBA::Boolean replace = 0;
+ ri->add_request_service_context (service_context,
+ replace
+ ACE_ENV_ARG_PARAMETER);
+ ACE_CHECK;
+}
+
+void
+TAO_LB_ClientRequestInterceptor::send_poll (
+ PortableInterceptor::ClientRequestInfo_ptr
+ ACE_ENV_ARG_DECL_NOT_USED)
+ ACE_THROW_SPEC ((CORBA::SystemException))
+{
+}
+
+void
+TAO_LB_ClientRequestInterceptor::receive_reply (
+ PortableInterceptor::ClientRequestInfo_ptr
+ ACE_ENV_ARG_DECL_NOT_USED)
+ ACE_THROW_SPEC ((CORBA::SystemException))
+{
+}
+
+void
+TAO_LB_ClientRequestInterceptor::receive_exception (
+ PortableInterceptor::ClientRequestInfo_ptr
+ ACE_ENV_ARG_DECL_NOT_USED)
+ ACE_THROW_SPEC ((CORBA::SystemException,
+ PortableInterceptor::ForwardRequest))
+{
+}
+
+void
+TAO_LB_ClientRequestInterceptor::receive_other (
+ PortableInterceptor::ClientRequestInfo_ptr
+ ACE_ENV_ARG_DECL_NOT_USED)
+ ACE_THROW_SPEC ((CORBA::SystemException,
+ PortableInterceptor::ForwardRequest))
+{
+}
+
+TAO_END_VERSIONED_NAMESPACE_DECL
diff --git a/TAO/orbsvcs/orbsvcs/LoadBalancing/LB_ClientRequestInterceptor.h b/TAO/orbsvcs/orbsvcs/LoadBalancing/LB_ClientRequestInterceptor.h
new file mode 100644
index 00000000000..124a845a989
--- /dev/null
+++ b/TAO/orbsvcs/orbsvcs/LoadBalancing/LB_ClientRequestInterceptor.h
@@ -0,0 +1,114 @@
+// -*- C++ -*-
+
+//=============================================================================
+/**
+ * @file LB_ClientRequestInterceptor.h
+ *
+ * $Id$
+ *
+ * @author Ossama Othman <ossama@uci.edu>
+ */
+//=============================================================================
+
+
+#ifndef TAO_LB_CLIENT_REQUEST_INTERCEPTOR_H
+#define TAO_LB_CLIENT_REQUEST_INTERCEPTOR_H
+
+#include "ace/config-all.h"
+
+#if !defined (ACE_LACKS_PRAGMA_ONCE)
+# pragma once
+#endif /* ACE_LACKS_PRAGMA_ONCE */
+
+#include "tao/PI/PI.h"
+#include "tao/PortableInterceptorC.h"
+#include "tao/LocalObject.h"
+
+#if defined(_MSC_VER)
+#pragma warning(push)
+#pragma warning(disable:4250)
+#endif /* _MSC_VER */
+
+
+TAO_BEGIN_VERSIONED_NAMESPACE_DECL
+
+/**
+ * @class TAO_LB_ClientRequestInterceptor
+ *
+ * @brief Load balancer client request interceptor that injects an
+ * IOP::ServiceContext into a request's
+ * IOP::ServiceContextList.
+ *
+ * Load shedding requires that a specific ServiceContext exists
+ * in the request's ServiceContextList. The server side will attempt
+ * to detect if that ServiceContext exists, and shed load if it does.
+ *
+ * @note This model introduces a Denial-of-Service vulnerability.
+ * Malicious or incorrectly configured clients can spoof the
+ * server into thinking that it is invoking requests on a
+ * non-load balanced object. At that point, the server will let
+ * the request through, completely bypassing the load shedding
+ * mechanism! A server side-only mechanism can correct this
+ * vulnerability, but at the potential cost of additional
+ * resource overhead.
+ */
+class TAO_LB_ClientRequestInterceptor
+ : public virtual PortableInterceptor::ClientRequestInterceptor,
+ public virtual TAO_Local_RefCounted_Object
+{
+public:
+
+ /**
+ * @name Methods Required by the Client Request Interceptor
+ * Interface
+ *
+ * These are methods that must be implemented since they are pure
+ * virtual in the abstract base class. They are the canonical
+ * methods required for all client request interceptors.
+ */
+ //@{
+ /// Return the name of this ClientRequestInterceptor.
+ virtual char * name (ACE_ENV_SINGLE_ARG_DECL_WITH_DEFAULTS)
+ ACE_THROW_SPEC ((CORBA::SystemException));
+
+ virtual void destroy (ACE_ENV_SINGLE_ARG_DECL_WITH_DEFAULTS)
+ ACE_THROW_SPEC ((CORBA::SystemException));
+
+ virtual void send_request (
+ PortableInterceptor::ClientRequestInfo_ptr ri
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS)
+ ACE_THROW_SPEC ((CORBA::SystemException,
+ PortableInterceptor::ForwardRequest));
+
+ virtual void send_poll (
+ PortableInterceptor::ClientRequestInfo_ptr ri
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS)
+ ACE_THROW_SPEC ((CORBA::SystemException));
+
+ virtual void receive_reply (
+ PortableInterceptor::ClientRequestInfo_ptr ri
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS)
+ ACE_THROW_SPEC ((CORBA::SystemException));
+
+ virtual void receive_exception (
+ PortableInterceptor::ClientRequestInfo_ptr ri
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS)
+ ACE_THROW_SPEC ((CORBA::SystemException,
+ PortableInterceptor::ForwardRequest));
+
+ virtual void receive_other (
+ PortableInterceptor::ClientRequestInfo_ptr ri
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS)
+ ACE_THROW_SPEC ((CORBA::SystemException,
+ PortableInterceptor::ForwardRequest));
+ //@}
+
+};
+
+TAO_END_VERSIONED_NAMESPACE_DECL
+
+#if defined(_MSC_VER)
+#pragma warning(pop)
+#endif /* _MSC_VER */
+
+#endif /* TAO_LB_CLIENT_REQUEST_INTERCEPTOR_H */
diff --git a/TAO/orbsvcs/orbsvcs/LoadBalancing/LB_Component.cpp b/TAO/orbsvcs/orbsvcs/LoadBalancing/LB_Component.cpp
new file mode 100644
index 00000000000..3e6d76a10aa
--- /dev/null
+++ b/TAO/orbsvcs/orbsvcs/LoadBalancing/LB_Component.cpp
@@ -0,0 +1,146 @@
+#include "orbsvcs/LoadBalancing/LB_Component.h"
+#include "orbsvcs/LoadBalancing/LB_ORBInitializer.h"
+
+#include "tao/ORB_Constants.h"
+#include "tao/ORBInitializer_Registry.h"
+#include "ace/OS_NS_strings.h"
+
+ACE_RCSID (LoadBalancing,
+ LB_Component,
+ "$Id$")
+
+TAO_BEGIN_VERSIONED_NAMESPACE_DECL
+
+int
+TAO_LB_Component::init (int argc, ACE_TCHAR * argv[])
+{
+ // There must be at least six arguments.
+ if (argc < 6)
+ return -1;
+
+ // Try to optimize sequence growth by growing it once.
+ const CORBA::ULong initial_len = argc / 6; // -LBGroup group
+ // -LBTypeId type_id
+ // -LBLocation location
+
+ CORBA::StringSeq object_groups (initial_len);
+ object_groups.length (initial_len);
+
+ CORBA::StringSeq repository_ids (initial_len);
+ repository_ids.length (initial_len);
+
+ CORBA::String_var location;
+
+ CORBA::ULong len = 0;
+
+ for (int i = 0; i < argc; ++i)
+ {
+ if (ACE_OS::strcasecmp (argv[i], "-LBGroup") == 0)
+ {
+ const CORBA::ULong j = len;
+ ++len;
+
+ ++i; // 1
+
+ object_groups.length (len);
+ object_groups[j] = CORBA::string_dup (argv[i]);
+
+ ++i; // 2
+
+ if (ACE_OS::strcasecmp (argv[i], "-LBTypeId") != 0)
+ return -1;
+
+ ++i; // 3
+
+ repository_ids.length (len);
+ repository_ids[j] = CORBA::string_dup (argv[i]);
+ }
+ else if (ACE_OS::strcasecmp (argv[i], "-LBTypeId") == 0)
+ {
+ const CORBA::ULong j = len;
+ ++len;
+
+ ++i; // 1
+
+ repository_ids.length (len);
+ repository_ids[j] = CORBA::string_dup (argv[i]);
+
+ ++i; // 2
+
+ if (ACE_OS::strcasecmp (argv[i], "-LBGroup") != 0)
+ return -1;
+
+ ++i; // 3
+
+ object_groups.length (len);
+ object_groups[j] = CORBA::string_dup (argv[i]);
+ }
+ else if (ACE_OS::strcasecmp (argv[i], "-LBLocation") == 0)
+ {
+ ++i;
+ location = CORBA::string_dup (argv[i]);
+ }
+ }
+
+ return this->register_orb_initializer (object_groups,
+ repository_ids,
+ location.in ());
+}
+
+int
+TAO_LB_Component::fini (void)
+{
+ return 0;
+}
+
+int
+TAO_LB_Component::register_orb_initializer (
+ const CORBA::StringSeq & object_groups,
+ const CORBA::StringSeq & repository_ids,
+ const char * location)
+{
+ ACE_DECLARE_NEW_CORBA_ENV;
+ ACE_TRY
+ {
+ // Register the LB_Component ORB initializer.
+ PortableInterceptor::ORBInitializer_ptr tmp;
+ ACE_NEW_THROW_EX (tmp,
+ TAO_LB_ORBInitializer (object_groups,
+ repository_ids,
+ location),
+ CORBA::NO_MEMORY (
+ CORBA::SystemException::_tao_minor_code (
+ TAO::VMCID,
+ ENOMEM),
+ CORBA::COMPLETED_NO));
+ ACE_TRY_CHECK;
+
+ PortableInterceptor::ORBInitializer_var initializer = tmp;
+
+ PortableInterceptor::register_orb_initializer (initializer.in ()
+ ACE_ENV_ARG_PARAMETER);
+ ACE_TRY_CHECK;
+ }
+ ACE_CATCHANY
+ {
+ ACE_PRINT_EXCEPTION (ACE_ANY_EXCEPTION,
+ "Unable to register LB_Component ORB "
+ "initializer.");
+ return -1;
+ }
+ ACE_ENDTRY;
+
+ return 0;
+}
+
+TAO_END_VERSIONED_NAMESPACE_DECL
+
+ACE_STATIC_SVC_DEFINE (TAO_LB_Component,
+ ACE_TEXT ("LB_Component"),
+ ACE_SVC_OBJ_T,
+ &ACE_SVC_NAME (TAO_LB_Component),
+ ACE_Service_Type::DELETE_THIS
+ | ACE_Service_Type::DELETE_OBJ,
+ 0)
+
+ACE_FACTORY_DEFINE (TAO_LoadBalancing, TAO_LB_Component)
diff --git a/TAO/orbsvcs/orbsvcs/LoadBalancing/LB_Component.h b/TAO/orbsvcs/orbsvcs/LoadBalancing/LB_Component.h
new file mode 100644
index 00000000000..26273daab93
--- /dev/null
+++ b/TAO/orbsvcs/orbsvcs/LoadBalancing/LB_Component.h
@@ -0,0 +1,70 @@
+// -*- C++ -*-
+
+//=============================================================================
+/**
+ * @file LB_Component.h
+ *
+ * $Id$
+
+ * @author Ossama Othman <ossama@uci.edu>
+ */
+//=============================================================================
+
+#ifndef TAO_LB_COMPONENT_H
+#define TAO_LB_COMPONENT_H
+
+#include /**/ "ace/pre.h"
+
+#include "orbsvcs/LoadBalancing/LoadBalancing_export.h"
+
+#if !defined (ACE_LACKS_PRAGMA_ONCE)
+# pragma once
+#endif /* ACE_LACKS_PRAGMA_ONCE */
+
+#include "orbsvcs/LB_ORTC.h"
+
+#include "ace/Service_Object.h"
+#include "ace/Service_Config.h"
+
+TAO_BEGIN_VERSIONED_NAMESPACE_DECL
+
+/**
+ * @class TAO_LB_Component
+ *
+ * @brief Service_Object that can be used to add load balancer support
+ * to a CORBA-based server.
+ *
+ * Servers wishing to transparently add load balancing/management
+ * support load this object via the ACE_Service_Configurator (e.g. by
+ * listing it in a `svc.conf' file).
+ */
+class TAO_LoadBalancing_Export TAO_LB_Component
+ : public ACE_Service_Object
+{
+public:
+
+ /// Initializes object when dynamic linking occurs.
+ virtual int init (int argc, ACE_TCHAR *argv[]);
+
+ /// Terminates object when dynamic unlinking occurs.
+ virtual int fini (void);
+
+protected:
+
+ /// Register the LB_Component's ORBInitializer.
+ int register_orb_initializer (const CORBA::StringSeq & object_groups,
+ const CORBA::StringSeq & repository_ids,
+ const char * location);
+
+};
+
+TAO_END_VERSIONED_NAMESPACE_DECL
+
+ACE_STATIC_SVC_DECLARE_EXPORT (TAO_LoadBalancing, TAO_LB_Component)
+ACE_STATIC_SVC_REQUIRE (TAO_LB_Component)
+ACE_FACTORY_DECLARE (TAO_LoadBalancing, TAO_LB_Component)
+
+
+#include /**/ "ace/post.h"
+
+#endif /* TAO_LB_COMPONENT_H */
diff --git a/TAO/orbsvcs/orbsvcs/LoadBalancing/LB_IORInterceptor.cpp b/TAO/orbsvcs/orbsvcs/LoadBalancing/LB_IORInterceptor.cpp
new file mode 100644
index 00000000000..3f555d17a5c
--- /dev/null
+++ b/TAO/orbsvcs/orbsvcs/LoadBalancing/LB_IORInterceptor.cpp
@@ -0,0 +1,189 @@
+#include "orbsvcs/LoadBalancing/LB_IORInterceptor.h"
+#include "orbsvcs/LoadBalancing/LB_ObjectReferenceFactory.h"
+#include "orbsvcs/LoadBalancing/LB_LoadAlert.h"
+
+#include "tao/debug.h"
+#include "tao/ORB_Constants.h"
+
+ACE_RCSID (LoadBalancing,
+ LB_IORInterceptor,
+ "$Id$")
+
+TAO_BEGIN_VERSIONED_NAMESPACE_DECL
+
+TAO_LB_IORInterceptor::TAO_LB_IORInterceptor (
+ const CORBA::StringSeq & object_groups,
+ const CORBA::StringSeq & repository_ids,
+ const char * location,
+ CosLoadBalancing::LoadManager_ptr lm,
+ const char * orb_id,
+ TAO_LB_LoadAlert & load_alert)
+ : object_groups_ (object_groups),
+ repository_ids_ (repository_ids),
+ location_ (location),
+ lm_ (CosLoadBalancing::LoadManager::_duplicate (lm)),
+ orb_id_ (CORBA::string_dup (orb_id)),
+ load_alert_ (load_alert),
+ la_ref_ (),
+ lock_ ()
+{
+}
+
+char *
+TAO_LB_IORInterceptor::name (ACE_ENV_SINGLE_ARG_DECL_NOT_USED)
+ ACE_THROW_SPEC ((CORBA::SystemException))
+{
+ return CORBA::string_dup ("TAO_LB_IORInterceptor");
+}
+
+void
+TAO_LB_IORInterceptor::destroy (ACE_ENV_SINGLE_ARG_DECL_NOT_USED)
+ ACE_THROW_SPEC ((CORBA::SystemException))
+{
+ // Force the LoadManager reference to be released since the ORB's
+ // lifetime is tied to object reference lifetimes.
+ (void) this->lm_.out ();
+}
+
+void
+TAO_LB_IORInterceptor::establish_components (
+ PortableInterceptor::IORInfo_ptr
+ ACE_ENV_ARG_DECL_NOT_USED)
+ ACE_THROW_SPEC ((CORBA::SystemException))
+{
+}
+
+void
+TAO_LB_IORInterceptor::components_established (
+ PortableInterceptor::IORInfo_ptr info
+ ACE_ENV_ARG_DECL)
+ ACE_THROW_SPEC ((CORBA::SystemException))
+{
+ int argc = 0;
+ CORBA::ORB_var orb = CORBA::ORB_init (argc,
+ 0,
+ this->orb_id_.in ()
+ ACE_ENV_ARG_PARAMETER);
+ ACE_CHECK;
+
+ // Save a copy of the current ObjectReferenceFactory.
+ PortableInterceptor::ObjectReferenceFactory_var old_orf =
+ info->current_factory (ACE_ENV_SINGLE_ARG_PARAMETER);
+ ACE_CHECK;
+
+ PortableInterceptor::ObjectReferenceFactory * tmp;
+ ACE_NEW_THROW_EX (tmp,
+ TAO_LB_ObjectReferenceFactory (old_orf.in (),
+ this->object_groups_,
+ this->repository_ids_,
+ this->location_.in (),
+ orb.in (),
+ this->lm_.in ()),
+ CORBA::NO_MEMORY (
+ CORBA::SystemException::_tao_minor_code (
+ TAO::VMCID,
+ ENOMEM),
+ CORBA::COMPLETED_NO));
+ ACE_CHECK;
+
+ PortableInterceptor::ObjectReferenceFactory_var orf = tmp;
+
+ info->current_factory (orf.in ()
+ ACE_ENV_ARG_PARAMETER);
+ ACE_CHECK;
+}
+
+void
+TAO_LB_IORInterceptor::adapter_manager_state_changed (
+ const char *,
+ PortableInterceptor::AdapterState state
+ ACE_ENV_ARG_DECL)
+ ACE_THROW_SPEC ((CORBA::SystemException))
+{
+ if (state == PortableInterceptor::ACTIVE)
+ {
+ this->register_load_alert (ACE_ENV_SINGLE_ARG_PARAMETER);
+ ACE_CHECK;
+ }
+}
+
+void
+TAO_LB_IORInterceptor::adapter_state_changed (
+ const PortableInterceptor::ObjectReferenceTemplateSeq &,
+ PortableInterceptor::AdapterState state
+ ACE_ENV_ARG_DECL)
+ ACE_THROW_SPEC ((CORBA::SystemException))
+{
+ if (state == PortableInterceptor::ACTIVE)
+ {
+ this->register_load_alert (ACE_ENV_SINGLE_ARG_PARAMETER);
+ ACE_CHECK;
+ }
+}
+
+void
+TAO_LB_IORInterceptor::register_load_alert (ACE_ENV_SINGLE_ARG_DECL)
+{
+ {
+ ACE_GUARD (TAO_SYNCH_MUTEX, guard, this->lock_);
+
+ if (!CORBA::is_nil (this->la_ref_.in ()))
+ return;
+ }
+
+ ACE_TRY_EX (foo)
+ {
+ // By now, the RootPOA has been fully initialized, so it is safe
+ // to activate the LoadAlert object.
+ CosLoadBalancing::LoadAlert_var la =
+ this->load_alert_._this (ACE_ENV_SINGLE_ARG_PARAMETER);
+ ACE_TRY_CHECK_EX (foo);
+
+ {
+ ACE_GUARD (TAO_SYNCH_MUTEX, guard, this->lock_);
+
+ this->la_ref_ = la;
+ }
+
+ }
+ ACE_CATCHANY
+ {
+ if (TAO_debug_level > 0)
+ ACE_PRINT_EXCEPTION (ACE_ANY_EXCEPTION,
+ "LoadAlert::_this()");
+ }
+ ACE_ENDTRY;
+ ACE_CHECK;
+
+ ACE_TRY
+ {
+ PortableGroup::Location location (1);
+ location.length (1);
+ location[0].id = CORBA::string_dup (this->location_.in ());
+
+ this->lm_->register_load_alert (location,
+ this->la_ref_.in ()
+ ACE_ENV_ARG_PARAMETER);
+ ACE_TRY_CHECK;
+ }
+ ACE_CATCH (CosLoadBalancing::LoadAlertAlreadyPresent, ex)
+ {
+ if (TAO_debug_level > 0)
+ ACE_PRINT_EXCEPTION (ex,
+ "LoadManager::register_load_alert");
+
+ ACE_TRY_THROW (CORBA::BAD_INV_ORDER ());
+ }
+ ACE_CATCH (CosLoadBalancing::LoadAlertNotAdded, ex)
+ {
+ if (TAO_debug_level > 0)
+ ACE_PRINT_EXCEPTION (ex,
+ "LoadManager::register_load_alert");
+
+ ACE_TRY_THROW (CORBA::INTERNAL ());
+ }
+ ACE_ENDTRY;
+ ACE_CHECK;
+}
+
+TAO_END_VERSIONED_NAMESPACE_DECL
diff --git a/TAO/orbsvcs/orbsvcs/LoadBalancing/LB_IORInterceptor.h b/TAO/orbsvcs/orbsvcs/LoadBalancing/LB_IORInterceptor.h
new file mode 100644
index 00000000000..6b93c951912
--- /dev/null
+++ b/TAO/orbsvcs/orbsvcs/LoadBalancing/LB_IORInterceptor.h
@@ -0,0 +1,152 @@
+// -*- C++ -*-
+
+//=============================================================================
+/**
+ * @file LB_IORInterceptor.h
+ *
+ * $Id$
+
+ * @author Ossama Othman <ossama@uci.edu>
+ */
+//=============================================================================
+
+#ifndef TAO_LB_IOR_INTERCEPTOR_H
+#define TAO_LB_IOR_INTERCEPTOR_H
+
+#include "ace/config-all.h"
+
+#if !defined (ACE_LACKS_PRAGMA_ONCE)
+# pragma once
+#endif /* ACE_LACKS_PRAGMA_ONCE */
+
+#include "orbsvcs/CosLoadBalancingC.h"
+#include "tao/LocalObject.h"
+#include "tao/IORInterceptor/IORInterceptor.h"
+
+#if defined(_MSC_VER)
+#pragma warning(push)
+#pragma warning(disable:4250)
+#endif /* _MSC_VER */
+
+
+TAO_BEGIN_VERSIONED_NAMESPACE_DECL
+
+/// Forward declarations.
+class TAO_LB_LoadAlert;
+
+
+/**
+ * @class TAO_LB_IORInterceptor
+ *
+ * @brief TAO Load Balancer IOR interceptor.
+ *
+ * This IORInterceptor is registered in object group member ORBs.
+ * During creation of the object group member reference, this
+ * IORInterceptor will change the "current_factory" attribute of the
+ * PortableInterceptor::IORInfo object to the Load Balancer's
+ * ObjectReferenceFactory.
+ *
+ * @see LB_ObjectReferenceFactory.h for details.
+ */
+class TAO_LB_IORInterceptor
+ : public virtual PortableInterceptor::IORInterceptor_3_0,
+ public virtual TAO_Local_RefCounted_Object
+{
+public:
+
+ /// Constructor.
+ TAO_LB_IORInterceptor (const CORBA::StringSeq & object_groups,
+ const CORBA::StringSeq & repository_ids,
+ const char * location,
+ CosLoadBalancing::LoadManager_ptr lm,
+ const char * orb_id,
+ TAO_LB_LoadAlert & load_alert);
+
+ /**
+ * @name Methods Required by the IOR Interceptor Interface
+ *
+ * These are methods that must be implemented since they are pure
+ * virtual in the abstract base class. They are the canonical
+ * methods required for all IOR interceptors.
+ */
+ //@{
+ /// Return the name of this IORInterceptor.
+ virtual char * name (ACE_ENV_SINGLE_ARG_DECL_WITH_DEFAULTS)
+ ACE_THROW_SPEC ((CORBA::SystemException));
+
+ /// Cleanup resources acquired by this IORInterceptor.
+ virtual void destroy (ACE_ENV_SINGLE_ARG_DECL_WITH_DEFAULTS)
+ ACE_THROW_SPEC ((CORBA::SystemException));
+
+ /// Add the tagged components to the IOR.
+ virtual void establish_components (
+ PortableInterceptor::IORInfo_ptr info
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS)
+ ACE_THROW_SPEC ((
+ CORBA::SystemException
+ ));
+
+ virtual void components_established (
+ PortableInterceptor::IORInfo_ptr info
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS)
+ ACE_THROW_SPEC ((CORBA::SystemException));
+
+ virtual void adapter_manager_state_changed (
+ const char * id,
+ PortableInterceptor::AdapterState state
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS)
+ ACE_THROW_SPEC ((
+ CORBA::SystemException
+ ));
+
+ virtual void adapter_state_changed (
+ const PortableInterceptor::ObjectReferenceTemplateSeq & templates,
+ PortableInterceptor::AdapterState state
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS)
+ ACE_THROW_SPEC ((
+ CORBA::SystemException
+ ));
+
+ //@}
+
+private:
+
+ /// Create and register the LoadAlert object with the LoadManager.
+ void register_load_alert (ACE_ENV_SINGLE_ARG_DECL);
+
+private:
+
+ /// List of stringified object group references.
+ const CORBA::StringSeq object_groups_;
+
+ /// List of RepositoryIds for object that will be load
+ /// managed/balanced.
+ const CORBA::StringSeq repository_ids_;
+
+ /// Location at which the LoadBalancing component resides.
+ CORBA::String_var location_;
+
+ /// Reference to the LoadManager.
+ CosLoadBalancing::LoadManager_var lm_;
+
+ /// ORBid of the ORB this IORInterceptor is registered with.
+ CORBA::String_var orb_id_;
+
+ /// Reference to the LoadAlert servant.
+ TAO_LB_LoadAlert & load_alert_;
+
+ /// Reference to the LoadAlert object.
+ CosLoadBalancing::LoadAlert_var la_ref_;
+
+ /// Synchronize access to the class state.
+ TAO_SYNCH_MUTEX lock_;
+
+};
+
+TAO_END_VERSIONED_NAMESPACE_DECL
+
+#if defined(_MSC_VER)
+#pragma warning(pop)
+#endif /* _MSC_VER */
+
+#endif /* TAO_LB_IOR_INTERCEPTOR_H */
diff --git a/TAO/orbsvcs/orbsvcs/LoadBalancing/LB_LeastLoaded.cpp b/TAO/orbsvcs/orbsvcs/LoadBalancing/LB_LeastLoaded.cpp
new file mode 100644
index 00000000000..00c4fa6203d
--- /dev/null
+++ b/TAO/orbsvcs/orbsvcs/LoadBalancing/LB_LeastLoaded.cpp
@@ -0,0 +1,641 @@
+#include "orbsvcs/LoadBalancing/LB_LeastLoaded.h"
+#include "orbsvcs/LoadBalancing/LB_LoadMap.h"
+#include "orbsvcs/LoadBalancing/LB_Random.h"
+
+#include "orbsvcs/PortableGroup/PG_conf.h"
+
+#include "tao/debug.h"
+#include "tao/ORB_Constants.h"
+
+#include "ace/Null_Mutex.h"
+#include "ace/OS_NS_string.h"
+
+
+ACE_RCSID (LoadBalancing,
+ LB_LeastLoaded,
+ "$Id$")
+
+
+#if !defined (__ACE_INLINE__)
+#include "orbsvcs/LoadBalancing/LB_LeastLoaded.inl"
+#endif /* defined INLINE */
+
+TAO_BEGIN_VERSIONED_NAMESPACE_DECL
+
+TAO_LB_LeastLoaded::TAO_LB_LeastLoaded (PortableServer::POA_ptr poa)
+ : poa_ (PortableServer::POA::_duplicate (poa)),
+ load_map_ (0),
+ lock_ (0),
+ properties_ (),
+ critical_threshold_ (TAO_LB::LL_DEFAULT_CRITICAL_THRESHOLD),
+ reject_threshold_ (TAO_LB::LL_DEFAULT_REJECT_THRESHOLD),
+ tolerance_ (TAO_LB::LL_DEFAULT_TOLERANCE),
+ dampening_ (TAO_LB::LL_DEFAULT_DAMPENING),
+ per_balance_load_ (TAO_LB::LL_DEFAULT_DAMPENING)
+{
+ // A load map that retains previous load values at a given location
+ // and lock are only needed if dampening is enabled, i.e. non-zero.
+ if (this->dampening_ != 0)
+ {
+ ACE_NEW (this->load_map_, TAO_LB_LoadMap (TAO_PG_MAX_LOCATIONS));
+
+ ACE_NEW (this->lock_, TAO_SYNCH_MUTEX);
+ }
+
+ // Initialize the random load balancing strategy.
+ TAO_LB_Random::init ();
+}
+
+TAO_LB_LeastLoaded::~TAO_LB_LeastLoaded (void)
+{
+ delete this->load_map_;
+ delete this->lock_;
+}
+
+char *
+TAO_LB_LeastLoaded::name (ACE_ENV_SINGLE_ARG_DECL_NOT_USED)
+ ACE_THROW_SPEC ((CORBA::SystemException))
+{
+ return CORBA::string_dup ("LeastLoaded");
+}
+
+CosLoadBalancing::Properties *
+TAO_LB_LeastLoaded::get_properties (ACE_ENV_SINGLE_ARG_DECL)
+ ACE_THROW_SPEC ((CORBA::SystemException))
+{
+ CosLoadBalancing::Properties * props = 0;
+ ACE_NEW_THROW_EX (props,
+ CosLoadBalancing::Properties (this->properties_),
+ CORBA::NO_MEMORY (
+ CORBA::SystemException::_tao_minor_code (
+ TAO::VMCID,
+ ENOMEM),
+ CORBA::COMPLETED_NO));
+ ACE_CHECK_RETURN (0);
+
+ return props;
+}
+
+void
+TAO_LB_LeastLoaded::push_loads (
+ const PortableGroup::Location & the_location,
+ const CosLoadBalancing::LoadList & loads
+ ACE_ENV_ARG_DECL)
+ ACE_THROW_SPEC ((CORBA::SystemException))
+{
+ // Only the first load is used by this load balancing strategy.
+ if (loads.length () == 0)
+ ACE_THROW (CORBA::BAD_PARAM ());
+
+ CosLoadBalancing::Load load; // Unused
+
+ this->push_loads (the_location,
+ loads,
+ load
+ ACE_ENV_ARG_PARAMETER);
+}
+
+void
+TAO_LB_LeastLoaded::push_loads (
+ const PortableGroup::Location & the_location,
+ const CosLoadBalancing::LoadList & loads,
+ CosLoadBalancing::Load & load
+ ACE_ENV_ARG_DECL)
+{
+ if (loads.length () == 0)
+ ACE_THROW (CORBA::BAD_PARAM ());
+
+ // Only the first load is used by this load balancing strategy.
+ const CosLoadBalancing::Load & new_load = loads[0];
+
+ if (this->load_map_ != 0)
+ {
+ ACE_GUARD (TAO_SYNCH_MUTEX, guard, *this->lock_);
+
+ TAO_LB_LoadMap::ENTRY * entry;
+ if (this->load_map_->find (the_location, entry) == 0)
+ {
+ CosLoadBalancing::Load & previous_load = entry->int_id_;
+
+ if (previous_load.id != new_load.id)
+ ACE_THROW (CORBA::BAD_PARAM ()); // Somebody switched
+ // LoadIds on us!
+
+ previous_load.value =
+ this->effective_load (previous_load.value, new_load.value);
+
+ load = previous_load;
+ }
+ else
+ {
+ const CosLoadBalancing::Load eff_load =
+ {
+ new_load.id,
+ this->effective_load (0, new_load.value)
+ };
+
+ if (this->load_map_->bind (the_location, eff_load) != 0)
+ {
+ if (TAO_debug_level > 0)
+ ACE_ERROR ((LM_ERROR,
+ "ERROR: TAO_LB_LeastLoaded - "
+ "Unable to push loads\n"));
+
+ ACE_THROW (CORBA::INTERNAL ());
+ }
+
+ load = eff_load;
+ }
+ }
+ else
+ {
+ load.id = new_load.id;
+ load.value = this->effective_load (0, new_load.value);
+ }
+}
+
+CosLoadBalancing::LoadList *
+TAO_LB_LeastLoaded::get_loads (CosLoadBalancing::LoadManager_ptr load_manager,
+ const PortableGroup::Location & the_location
+ ACE_ENV_ARG_DECL)
+ ACE_THROW_SPEC ((CORBA::SystemException,
+ CosLoadBalancing::LocationNotFound))
+{
+ if (CORBA::is_nil (load_manager))
+ ACE_THROW_RETURN (CORBA::BAD_PARAM (), 0);
+
+ CosLoadBalancing::LoadList_var loads =
+ load_manager->get_loads (the_location
+ ACE_ENV_ARG_PARAMETER);
+ ACE_CHECK_RETURN (0);
+
+ this->push_loads (the_location,
+ loads.in (),
+ loads[0]
+ ACE_ENV_ARG_PARAMETER);
+ ACE_CHECK_RETURN (0);
+
+ return loads._retn ();
+}
+
+
+CORBA::Object_ptr
+TAO_LB_LeastLoaded::next_member (
+ PortableGroup::ObjectGroup_ptr object_group,
+ CosLoadBalancing::LoadManager_ptr load_manager
+ ACE_ENV_ARG_DECL)
+ ACE_THROW_SPEC ((CORBA::SystemException,
+ PortableGroup::ObjectGroupNotFound,
+ PortableGroup::MemberNotFound))
+{
+ if (CORBA::is_nil (load_manager))
+ ACE_THROW_RETURN (CORBA::BAD_PARAM (),
+ CORBA::Object::_nil ());
+
+ PortableGroup::Locations_var locations =
+ load_manager->locations_of_members (object_group
+ ACE_ENV_ARG_PARAMETER);
+ ACE_CHECK_RETURN (CORBA::Object::_nil ());
+
+ if (locations->length () == 0)
+ ACE_THROW_RETURN (CORBA::TRANSIENT (),
+ CORBA::Object::_nil ());
+
+ // @@ RACE CONDITION. OBJECT GROUP MEMBERSHIP MAY CHANGE AFTER
+ // RETRIEVING LOCATIONS! HOW DO WE HANDLE THAT?
+
+ PortableGroup::Location location;
+ CORBA::Boolean found_location =
+ this->get_location (load_manager,
+ locations.in (),
+ location
+ ACE_ENV_ARG_PARAMETER);
+ ACE_CHECK_RETURN (CORBA::Object::_nil ());
+
+ if (found_location)
+ {
+// ACE_DEBUG ((LM_DEBUG,
+// "RETURNING REFERENCE FOR LOCATION \"%s\"\n",
+// location[0].id.in ()));
+
+ return load_manager->get_member_ref (object_group,
+ location
+ ACE_ENV_ARG_PARAMETER);
+ }
+ else
+ {
+ // No loads have been reported for any of the locations the
+ // object group members reside at. If no loads have been
+ // reported to the LoadManager, adaptive load balancing
+ // decisions cannot be made. Fall back on a non-adaptive
+ // strategy, such as the Random load balancing strategy,
+ // instead.
+ //
+ // @note The Random load balancing strategy is used since it is
+ // very lightweight and stateless.
+
+ return TAO_LB_Random::_tao_next_member (object_group,
+ load_manager,
+ locations.in ()
+ ACE_ENV_ARG_PARAMETER);
+ }
+}
+
+void
+TAO_LB_LeastLoaded::analyze_loads (
+ PortableGroup::ObjectGroup_ptr object_group,
+ CosLoadBalancing::LoadManager_ptr load_manager
+ ACE_ENV_ARG_DECL)
+ ACE_THROW_SPEC ((CORBA::SystemException))
+{
+ if (CORBA::is_nil (load_manager))
+ ACE_THROW (CORBA::BAD_PARAM ());
+
+ PortableGroup::Locations_var locations =
+ load_manager->locations_of_members (object_group
+ ACE_ENV_ARG_PARAMETER);
+ ACE_CHECK;
+
+ if (locations->length () == 0)
+ ACE_THROW (CORBA::TRANSIENT ());
+
+ const CORBA::ULong len = locations->length ();
+
+ // Iterate through the entire location list to determine which
+ // locations require load to be shed.
+ for (CORBA::ULong i = 0; i < len; ++i)
+ {
+ ACE_TRY
+ {
+ const PortableGroup::Location & loc = locations[i];
+
+ // Retrieve the load list for the location from the
+ // LoadManager and push it to this Strategy's load
+ // processor.
+ CosLoadBalancing::LoadList_var current_loads =
+ load_manager->get_loads (loc
+ ACE_ENV_ARG_PARAMETER);
+ ACE_TRY_CHECK;
+
+ CosLoadBalancing::Load load;
+ this->push_loads (loc,
+ current_loads.in (),
+ load
+ ACE_ENV_ARG_PARAMETER);
+ ACE_TRY_CHECK;
+/*
+ ACE_DEBUG ((LM_DEBUG,
+ "EFFECTIVE_LOAD == %f\n"
+ "CRITICAL == %f\n"
+ "REJECT == %f\n"
+ "DAMPENING == %f\n",
+ load.value,
+ this->critical_threshold_,
+ this->reject_threshold_,
+ this->dampening_));
+*/
+ // Perform load rebalancing only if the critical threshold
+ // was set.
+ if (this->critical_threshold_ != 0)
+ {
+ if (load.value > this->critical_threshold_)
+ {
+/*
+ ACE_DEBUG ((LM_DEBUG,
+ "%P --- ALERTING LOCATION %u\n",
+ i));
+*/
+
+ // The location is overloaded. Perform load
+ // shedding by informing the LoadAlert object
+ // associated with the member at that location it
+ // should redirect client requests back to the
+ // LoadManager.
+ load_manager->enable_alert (loc
+ ACE_ENV_ARG_PARAMETER);
+ ACE_TRY_CHECK;
+ }
+ else
+ {
+ // The location is not overloaded. Disable load
+ // shedding at given location.
+ load_manager->disable_alert (loc
+ ACE_ENV_ARG_PARAMETER);
+ ACE_TRY_CHECK;
+ }
+ }
+ }
+ ACE_CATCH (CosLoadBalancing::LocationNotFound, ex)
+ {
+ // No load available for the requested location. Try the
+ // next location.
+ }
+ ACE_ENDTRY;
+ ACE_CHECK;
+ }
+}
+
+PortableServer::POA_ptr
+TAO_LB_LeastLoaded::_default_POA (ACE_ENV_SINGLE_ARG_DECL_NOT_USED)
+{
+ return PortableServer::POA::_duplicate (this->poa_.in ());
+}
+
+CORBA::Boolean
+TAO_LB_LeastLoaded::get_location (
+ CosLoadBalancing::LoadManager_ptr load_manager,
+ const PortableGroup::Locations & locations,
+ PortableGroup::Location & location
+ ACE_ENV_ARG_DECL)
+{
+ CORBA::Float min_load = FLT_MAX; // Start out with the largest
+ // positive value.
+
+ CORBA::ULong location_index = 0;
+ CORBA::Boolean found_location = 0;
+ CORBA::Boolean found_load = 0;
+
+ const CORBA::ULong len = locations.length ();
+
+ // Iterate through the entire location list to find the least loaded
+ // of them.
+ for (CORBA::ULong i = 0; i < len; ++i)
+ {
+ ACE_TRY
+ {
+ const PortableGroup::Location & loc = locations[i];
+
+ // Retrieve the load list for the location from the LoadManager
+ // and push it to this Strategy's load processor.
+ CosLoadBalancing::LoadList_var current_loads =
+ load_manager->get_loads (loc
+ ACE_ENV_ARG_PARAMETER);
+ ACE_TRY_CHECK;
+
+ found_load = 1;
+
+ CosLoadBalancing::Load load;
+ this->push_loads (loc,
+ current_loads.in (),
+ load
+ ACE_ENV_ARG_PARAMETER);
+ ACE_TRY_CHECK;
+/*
+ ACE_DEBUG ((LM_DEBUG,
+ "LOC = %u"
+ "\tC = %d"
+ "\treject = %f"
+ "\tload = %f\n"
+ "\tmin_load = %f\n",
+ i,
+ (this->reject_threshold_ == 0
+ || load.value < this->reject_threshold_),
+ this->reject_threshold_,
+ load.value,
+ min_load));
+*/
+ if ((this->reject_threshold_ == 0
+ || load.value < this->reject_threshold_)
+ && load.value < min_load)
+ {
+// ACE_DEBUG ((LM_DEBUG,
+// "**** LOAD == %f\n",
+// load.value));
+
+ if (i > 0 && load.value != 0)
+ {
+ /*
+ percent difference =
+ (min_load - load.value) / load.value
+ == (min_load / load.value) - 1
+
+ The latter form is used to avoid a potential
+ arithmetic overflow problem, such as when
+ (min_load - load.value) > FLT_MAX, assuming that
+ either load.value is negative and min_load is
+ positive, or vice versa.
+ */
+ const CORBA::Float percent_diff =
+ (min_load / load.value) - 1;
+
+ /*
+ A "thundering herd" phenomenon may occur when
+ location loads are basically the same (e.g. only
+ differ by a very small amount), where one object
+ group member ends up receiving the majority of
+ requests from different clients. In order to
+ prevent a single object group member from
+ receiving such request bursts, one of two equally
+ loaded locations is chosen at random. Thanks to
+ Carlos, Marina and Jody at ATD for coming up with
+ this solution to this form of the thundering herd
+ problem.
+
+ See the documentation for
+ TAO_LB::LL_DEFAULT_LOAD_PERCENT_DIFF_CUTOFF in
+ LB_LeastLoaded.h for additional information.
+ */
+ if (percent_diff <= TAO_LB::LL_DEFAULT_LOAD_PERCENT_DIFF_CUTOFF)
+ {
+ // Prevent integer arithmetic overflow.
+ const CORBA::Float NUM_MEMBERS = 2;
+
+ // n == 0: Use previously selected location.
+ // n == 1: Use current location.
+ const CORBA::ULong n =
+ static_cast<CORBA::ULong> (NUM_MEMBERS * ACE_OS::rand ()
+ / (RAND_MAX + 1.0));
+
+ ACE_ASSERT (n == 0 || n == 1);
+
+ if (n == 1)
+ {
+ min_load = load.value;
+ location_index = i;
+ found_location = 1;
+
+// ACE_DEBUG ((LM_DEBUG,
+// "** NEW MIN_LOAD == %f\n",
+// min_load));
+ }
+
+// if (n == 0)
+// ACE_DEBUG ((LM_DEBUG, "^^^^^ PREVIOUS LOCATION\n"));
+// else
+// ACE_DEBUG ((LM_DEBUG, "^^^^^ CURRENT LOCATION\n"));
+
+ }
+ else
+ {
+ min_load = load.value;
+ location_index = i;
+ found_location = 1;
+
+// ACE_DEBUG ((LM_DEBUG,
+// "***** NEW MIN_LOAD == %f\n",
+// min_load));
+ }
+ }
+ else
+ {
+ min_load = load.value;
+ location_index = i;
+ found_location = 1;
+
+// ACE_DEBUG ((LM_DEBUG,
+// "NEW MIN_LOAD == %f\n",
+// min_load));
+ }
+ }
+
+ // ACE_DEBUG ((LM_DEBUG, "NEW MIN_LOAD == %f\n", min_load));
+ }
+ ACE_CATCH (CosLoadBalancing::LocationNotFound, ex)
+ {
+ // No load available for the requested location. Try the
+ // next location.
+ }
+ ACE_ENDTRY;
+ ACE_CHECK_RETURN (0);
+ }
+
+// ACE_DEBUG ((LM_DEBUG,
+// "FOUND_LOAD == %u\n"
+// "FOUND_LOCATION == %u\n",
+// found_load,
+// found_location));
+
+ // If no loads were found, return without an exception to allow this
+ // strategy to select a member using an alternative method
+ // (e.g. random selection).
+ if (found_load)
+ {
+ if (found_location)
+ {
+ //ACE_DEBUG ((LM_DEBUG, "LOCATED = %u\n", location_index));
+ location = locations[location_index];
+ }
+ else if (this->reject_threshold_ != 0)
+ ACE_THROW_RETURN (CORBA::TRANSIENT (), 0);
+
+// ACE_DEBUG ((LM_DEBUG, "LOCATION ID == %s\n", location[0].id.in ()));
+ }
+
+ return found_location;
+}
+
+void
+TAO_LB_LeastLoaded::init (const PortableGroup::Properties & props
+ ACE_ENV_ARG_DECL)
+{
+ CORBA::Float critical_threshold =
+ TAO_LB::LL_DEFAULT_CRITICAL_THRESHOLD;
+ CORBA::Float reject_threshold = TAO_LB::LL_DEFAULT_REJECT_THRESHOLD;
+ CORBA::Float tolerance = TAO_LB::LL_DEFAULT_TOLERANCE;
+ CORBA::Float dampening = TAO_LB::LL_DEFAULT_DAMPENING;
+ CORBA::Float per_balance_load = TAO_LB::LL_DEFAULT_PER_BALANCE_LOAD;
+
+ const PortableGroup::Property * ct = 0; // critical threshold property
+
+ const CORBA::ULong len = props.length ();
+ for (CORBA::ULong i = 0; i < len; ++i)
+ {
+ const PortableGroup::Property & property = props[i];
+ if (ACE_OS::strcmp (property.nam[0].id.in (),
+ "org.omg.CosLoadBalancing.Strategy.LeastLoaded.CriticalThreshold") == 0)
+ {
+ this->extract_float_property (property,
+ critical_threshold
+ ACE_ENV_ARG_PARAMETER);
+ ACE_CHECK;
+
+ ct = &property;
+ }
+
+ else if (ACE_OS::strcmp (property.nam[0].id.in (),
+ "org.omg.CosLoadBalancing.Strategy.LeastLoaded.RejectThreshold") == 0)
+ {
+ this->extract_float_property (property,
+ reject_threshold
+ ACE_ENV_ARG_PARAMETER);
+ ACE_CHECK;
+ }
+
+ else if (ACE_OS::strcmp (property.nam[0].id.in (),
+ "org.omg.CosLoadBalancing.Strategy.LeastLoaded.Tolerance") == 0)
+ {
+ this->extract_float_property (property,
+ tolerance
+ ACE_ENV_ARG_PARAMETER);
+ ACE_CHECK;
+
+ // Valid tolerance values are greater than or equal to one.
+ if (tolerance < 1)
+ ACE_THROW (PortableGroup::InvalidProperty (property.nam,
+ property.val));
+ }
+
+ else if (ACE_OS::strcmp (property.nam[0].id.in (),
+ "org.omg.CosLoadBalancing.Strategy.LeastLoaded.Dampening") == 0)
+ {
+ this->extract_float_property (property,
+ dampening
+ ACE_ENV_ARG_PARAMETER);
+ ACE_CHECK;
+
+ // Dampening range is [0,1).
+ if (dampening < 0 || dampening >= 1)
+ ACE_THROW (PortableGroup::InvalidProperty (property.nam,
+ property.val));
+ }
+
+ else if (ACE_OS::strcmp (property.nam[0].id.in (),
+ "org.omg.CosLoadBalancing.Strategy.LeastLoaded.PerBalanceLoad") == 0)
+ {
+ this->extract_float_property (property,
+ per_balance_load
+ ACE_ENV_ARG_PARAMETER);
+ ACE_CHECK;
+ }
+ }
+
+ if (critical_threshold != 0 && reject_threshold != 0
+ && critical_threshold <= reject_threshold)
+ ACE_THROW (PortableGroup::InvalidProperty (ct->nam, ct->val));
+
+ this->properties_ = props;
+
+ this->critical_threshold_ = critical_threshold;
+ this->reject_threshold_ = reject_threshold;
+ this->tolerance_ = tolerance;
+ this->dampening_ = dampening;
+ this->per_balance_load_ = per_balance_load;
+/*
+ ACE_DEBUG ((LM_DEBUG,
+ "--------------------------------\n"
+ "critical_threshold = %f\n"
+ "reject_threshold = %f\n"
+ "tolerance = %f\n"
+ "dampening = %f\n"
+ "per_balance_load = %f\n"
+ "--------------------------------\n",
+ critical_threshold,
+ reject_threshold,
+ tolerance,
+ dampening,
+ per_balance_load));
+*/
+}
+
+void
+TAO_LB_LeastLoaded::extract_float_property (
+ const PortableGroup::Property & property,
+ CORBA::Float & value
+ ACE_ENV_ARG_DECL)
+{
+ if (!(property.val >>= value))
+ ACE_THROW (PortableGroup::InvalidProperty (property.nam,
+ property.val));
+}
+
+TAO_END_VERSIONED_NAMESPACE_DECL
diff --git a/TAO/orbsvcs/orbsvcs/LoadBalancing/LB_LeastLoaded.h b/TAO/orbsvcs/orbsvcs/LoadBalancing/LB_LeastLoaded.h
new file mode 100644
index 00000000000..a7843028c66
--- /dev/null
+++ b/TAO/orbsvcs/orbsvcs/LoadBalancing/LB_LeastLoaded.h
@@ -0,0 +1,229 @@
+// -*- C++ -*-
+
+//=============================================================================
+/**
+ * @file LB_LeastLoaded.h
+ *
+ * $Id$
+ *
+ * @author Ossama Othman <ossama@uci.edu>
+ */
+//=============================================================================
+
+
+#ifndef LB_LEAST_LOADED_H
+#define LB_LEAST_LOADED_H
+
+#include /**/ "ace/pre.h"
+
+#include "orbsvcs/LoadBalancing/LB_LoadMap.h"
+
+# if !defined (ACE_LACKS_PRAGMA_ONCE)
+# pragma once
+# endif /* ACE_LACKS_PRAGMA_ONCE */
+
+#include "orbsvcs/CosLoadBalancingS.h"
+
+#include "ace/Synch_Traits.h"
+#include "ace/Thread_Mutex.h"
+
+TAO_BEGIN_VERSIONED_NAMESPACE_DECL
+
+namespace TAO_LB
+{
+ /**
+ * @name Default LeastLoaded strategy parameters.
+ *
+ * Defaults defined by the Load Balancing specification.
+ */
+ //@{
+ const CORBA::Float LL_DEFAULT_CRITICAL_THRESHOLD = 0;
+ const CORBA::Float LL_DEFAULT_REJECT_THRESHOLD = 0;
+ const CORBA::Float LL_DEFAULT_TOLERANCE = 1;
+ const CORBA::Float LL_DEFAULT_DAMPENING = 0;
+ const CORBA::Float LL_DEFAULT_PER_BALANCE_LOAD = 0;
+ //@}
+
+ /**
+ * @name TAO-specific LeastLoaded strategy parameters.
+ *
+ * Parameters internal to TAO's LeastLoaded strategy
+ * implementation.
+ */
+ //@{
+ /// Percentage difference between two load values that determines
+ /// whether the loads are considered equivalent.
+ /**
+ * If the percent difference between two loads, i.e.:
+ * (Old Load - New Load) / New Load
+ * is less than or equal to this value, the two loads will be
+ * considered equivalent. In such a case, an object group member
+ * residing at the location corresponding to one of the two loads
+ * will be selected at random.
+ */
+ const CORBA::Float LL_DEFAULT_LOAD_PERCENT_DIFF_CUTOFF = 0.01f; // 1%
+ //@}
+}
+
+/**
+ * @class TAO_LB_LeastLoaded
+ *
+ * @brief "Least loaded" load balancing strategy
+ *
+ * This load balancing strategy is designed to select an object group
+ * member residing at a location with the smallest load.
+ */
+class TAO_LB_LeastLoaded
+ : public virtual POA_CosLoadBalancing::Strategy
+{
+public:
+
+ /// Constructor.
+ TAO_LB_LeastLoaded (PortableServer::POA_ptr poa);
+
+ /**
+ * @name CosLoadBalancing::Strategy methods
+ *
+ * Methods required by the CosLoadBalancing::Strategy interface.
+ */
+ //@{
+ virtual char * name (ACE_ENV_SINGLE_ARG_DECL_WITH_DEFAULTS)
+ ACE_THROW_SPEC ((CORBA::SystemException));
+
+ virtual CosLoadBalancing::Properties * get_properties (
+ ACE_ENV_SINGLE_ARG_DECL_WITH_DEFAULTS)
+ ACE_THROW_SPEC ((CORBA::SystemException));
+
+ virtual void push_loads (
+ const PortableGroup::Location & the_location,
+ const CosLoadBalancing::LoadList & loads
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS)
+ ACE_THROW_SPEC ((CORBA::SystemException));
+
+ virtual CosLoadBalancing::LoadList * get_loads (
+ CosLoadBalancing::LoadManager_ptr load_manager,
+ const PortableGroup::Location & the_location
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS)
+ ACE_THROW_SPEC ((CORBA::SystemException,
+ CosLoadBalancing::LocationNotFound));
+
+ virtual CORBA::Object_ptr next_member (
+ PortableGroup::ObjectGroup_ptr object_group,
+ CosLoadBalancing::LoadManager_ptr load_manager
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS)
+ ACE_THROW_SPEC ((CORBA::SystemException,
+ PortableGroup::ObjectGroupNotFound,
+ PortableGroup::MemberNotFound));
+
+ virtual void analyze_loads (
+ PortableGroup::ObjectGroup_ptr object_group,
+ CosLoadBalancing::LoadManager_ptr load_manager
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS)
+ ACE_THROW_SPEC ((CORBA::SystemException));
+ //@}
+
+ /// Returns the default POA for this servant.
+ virtual PortableServer::POA_ptr _default_POA (
+ ACE_ENV_SINGLE_ARG_DECL_WITH_DEFAULTS
+ );
+
+ /// Initialize the LeastLoaded instance with the given properties.
+ void init (const PortableGroup::Properties & props
+ ACE_ENV_ARG_DECL);
+
+protected:
+
+ /// Destructor.
+ ~TAO_LB_LeastLoaded (void);
+
+ /// Retrieve the least loaded location from the given list of
+ /// locations.
+ CORBA::Boolean get_location (CosLoadBalancing::LoadManager_ptr load_manager,
+ const PortableGroup::Locations & locations,
+ PortableGroup::Location & location
+ ACE_ENV_ARG_DECL);
+
+ /// Return the effective load.
+ CORBA::Float effective_load (CORBA::Float previous_load,
+ CORBA::Float new_load);
+
+ /// Push the new load into this Strategy's load processor, and
+ /// return the corresponding effective load.
+ void push_loads (
+ const PortableGroup::Location & the_location,
+ const CosLoadBalancing::LoadList & loads,
+ CosLoadBalancing::Load & effective_load
+ ACE_ENV_ARG_DECL);
+
+ /// Utility method to extract a CORBA::Float value from the given
+ /// property.
+ void extract_float_property (const PortableGroup::Property & property,
+ CORBA::Float & value
+ ACE_ENV_ARG_DECL);
+
+private:
+
+ /// This servant's default POA.
+ PortableServer::POA_var poa_;
+
+ /// Table that maps location to load list.
+ TAO_LB_LoadMap * load_map_;
+
+ /// Lock used to ensure atomic access to state retained by this
+ /// class.
+ TAO_SYNCH_MUTEX * lock_;
+
+ /// Cached set of properties used when initializing this strategy.
+ CosLoadBalancing::Properties properties_;
+
+ /**
+ * @name LeastLoaded Property Values
+ *
+ * Cached LeastLoaded load balancing strategy property values.
+ */
+ //@{
+
+ /// The critical load threshold.
+ /**
+ * Load rebalancing/shedding will occur if loads at a given location
+ * are greater than this value. The default value is zero, which
+ * indicates that no load rebalancing/shedding will occur.
+ */
+ CORBA::Float critical_threshold_;
+
+ /// The request rejection threshold.
+ /**
+ * If the load at a given location is greater than this value, the
+ * member at that location will not be considered when choosing a
+ * member to the request will be forwarded. If all locations have
+ * loads greater than this value, a @c CORBA::TRANSIENT exception
+ * will be thrown unless the reject threshold is zero, which is the
+ * default. If the request rejection threshold is zero, a @c
+ * CORBA::TRANSIENT will not be thrown by this load balancing
+ * strategy, unless no object group members have been added yet.
+ */
+ CORBA::Float reject_threshold_;
+
+ ///
+ CORBA::Float tolerance_;
+
+ ///
+ CORBA::Float dampening_;
+
+ ///
+ CORBA::Float per_balance_load_;
+
+ //@}
+
+};
+
+TAO_END_VERSIONED_NAMESPACE_DECL
+
+
+#if defined (__ACE_INLINE__)
+#include "orbsvcs/LoadBalancing/LB_LeastLoaded.inl"
+#endif /* defined INLINE */
+
+#include /**/ "ace/post.h"
+
+#endif /* LB_LEAST_LOADED_H */
diff --git a/TAO/orbsvcs/orbsvcs/LoadBalancing/LB_LeastLoaded.inl b/TAO/orbsvcs/orbsvcs/LoadBalancing/LB_LeastLoaded.inl
new file mode 100644
index 00000000000..e59193f3c6f
--- /dev/null
+++ b/TAO/orbsvcs/orbsvcs/LoadBalancing/LB_LeastLoaded.inl
@@ -0,0 +1,27 @@
+// -*- C++ -*-
+//
+// $Id$
+
+
+TAO_BEGIN_VERSIONED_NAMESPACE_DECL
+
+ACE_INLINE CORBA::Float
+TAO_LB_LeastLoaded::effective_load (CORBA::Float previous_load,
+ CORBA::Float new_load)
+{
+ // Apply per-balance load. (Recompute raw load)
+ previous_load += this->per_balance_load_;
+
+ // Apply dampening. (Recompute new raw load)
+ CORBA::Float result =
+ this->dampening_ * previous_load + (1 - this->dampening_) * new_load;
+
+ ACE_ASSERT (this->tolerance_ != 0);
+
+ // Compute the effective load.
+ result /= this->tolerance_;
+
+ return result;
+}
+
+TAO_END_VERSIONED_NAMESPACE_DECL
diff --git a/TAO/orbsvcs/orbsvcs/LoadBalancing/LB_LoadAlert.cpp b/TAO/orbsvcs/orbsvcs/LoadBalancing/LB_LoadAlert.cpp
new file mode 100644
index 00000000000..a57212dbce6
--- /dev/null
+++ b/TAO/orbsvcs/orbsvcs/LoadBalancing/LB_LoadAlert.cpp
@@ -0,0 +1,42 @@
+#include "orbsvcs/LoadBalancing/LB_LoadAlert.h"
+
+
+ACE_RCSID (LoadBalancer,
+ LB_LoadAlert,
+ "$Id$")
+
+#if !defined (__ACE_INLINE__)
+# include "orbsvcs/LoadBalancing/LB_LoadAlert.inl"
+#endif /* __ACE_INLINE__ */
+
+TAO_BEGIN_VERSIONED_NAMESPACE_DECL
+
+TAO_LB_LoadAlert::TAO_LB_LoadAlert (void)
+ : alerted_ (0),
+ lock_ ()
+{
+}
+
+TAO_LB_LoadAlert::~TAO_LB_LoadAlert (void)
+{
+}
+
+void
+TAO_LB_LoadAlert::enable_alert (ACE_ENV_SINGLE_ARG_DECL_NOT_USED)
+ ACE_THROW_SPEC ((CORBA::SystemException))
+{
+ ACE_GUARD (TAO_SYNCH_MUTEX, monitor, this->lock_);
+
+ this->alerted_ = 1;
+}
+
+void
+TAO_LB_LoadAlert::disable_alert (ACE_ENV_SINGLE_ARG_DECL_NOT_USED)
+ ACE_THROW_SPEC ((CORBA::SystemException))
+{
+ ACE_GUARD (TAO_SYNCH_MUTEX, monitor, this->lock_);
+
+ this->alerted_ = 0;
+}
+
+TAO_END_VERSIONED_NAMESPACE_DECL
diff --git a/TAO/orbsvcs/orbsvcs/LoadBalancing/LB_LoadAlert.h b/TAO/orbsvcs/orbsvcs/LoadBalancing/LB_LoadAlert.h
new file mode 100644
index 00000000000..f5345ef7f07
--- /dev/null
+++ b/TAO/orbsvcs/orbsvcs/LoadBalancing/LB_LoadAlert.h
@@ -0,0 +1,87 @@
+// -*- C++ -*-
+
+//=============================================================================
+/**
+ * @file LB_LoadAlert.h
+ *
+ * $Id$
+ *
+ * @author Ossama Othman <ossama@uci.edu>
+ */
+//=============================================================================
+
+
+#ifndef TAO_LB_LOAD_ALERT_H
+#define TAO_LB_LOAD_ALERT_H
+
+#include /**/ "ace/pre.h"
+
+#include "orbsvcs/CosLoadBalancingS.h"
+
+#if !defined (ACE_LACKS_PRAGMA_ONCE)
+#pragma once
+#endif /* ACE_LACKS_PRAGMA_ONCE */
+
+#include "orbsvcs/PortableGroupC.h"
+
+TAO_BEGIN_VERSIONED_NAMESPACE_DECL
+
+class TAO_LoadBalancing_Export TAO_LB_LoadAlert
+ : public virtual POA_CosLoadBalancing::LoadAlert
+{
+public:
+
+ /// Constructor.
+ TAO_LB_LoadAlert (void);
+
+ /**
+ * @name CosLoadBalancing::LoadAlert Methods
+ *
+ * Methods required by the CosLoadBalancing::LoadAlert interface.
+ */
+ //@{
+
+ /// Forward requests back to the load manager via the object group
+ /// reference.
+ virtual void enable_alert (ACE_ENV_SINGLE_ARG_DECL_WITH_DEFAULTS)
+ ACE_THROW_SPEC ((CORBA::SystemException));
+
+ /// Stop forwarding requests, and begin accepting them again.
+ virtual void disable_alert (ACE_ENV_SINGLE_ARG_DECL_WITH_DEFAULTS)
+ ACE_THROW_SPEC ((CORBA::SystemException));
+
+ //@}
+
+ /// Has this LoadAlert servant been alerted of a high load condition
+ /// by the LoadManager.
+ CORBA::Boolean alerted (void) const;
+
+// protected:
+
+ /// Destructor.
+ /**
+ * Protected destructor to enforce correct memory management via
+ * reference counting.
+ */
+ virtual ~TAO_LB_LoadAlert (void);
+
+private:
+
+ /// Has this LoadAlert servant been alerted of a high load condition
+ /// by the LoadManager?
+ CORBA::Boolean alerted_;
+
+ /// Lock used to synchronized access to the LoadAlert state.
+ mutable TAO_SYNCH_MUTEX lock_;
+
+};
+
+TAO_END_VERSIONED_NAMESPACE_DECL
+
+#if defined (__ACE_INLINE__)
+# include "orbsvcs/LoadBalancing/LB_LoadAlert.inl"
+#endif /* __ACE_INLINE__ */
+
+#include /**/ "ace/post.h"
+
+#endif /* TAO_LB_LOAD_ALERT_H */
diff --git a/TAO/orbsvcs/orbsvcs/LoadBalancing/LB_LoadAlert.inl b/TAO/orbsvcs/orbsvcs/LoadBalancing/LB_LoadAlert.inl
new file mode 100644
index 00000000000..abff1d3087e
--- /dev/null
+++ b/TAO/orbsvcs/orbsvcs/LoadBalancing/LB_LoadAlert.inl
@@ -0,0 +1,16 @@
+// -*- C++ -*-
+//
+// $Id$
+
+
+TAO_BEGIN_VERSIONED_NAMESPACE_DECL
+
+ACE_INLINE CORBA::Boolean
+TAO_LB_LoadAlert::alerted (void) const
+{
+ ACE_GUARD_RETURN (TAO_SYNCH_MUTEX, monitor, this->lock_, 0);
+
+ return this->alerted_;
+}
+
+TAO_END_VERSIONED_NAMESPACE_DECL
diff --git a/TAO/orbsvcs/orbsvcs/LoadBalancing/LB_LoadAlertInfo.cpp b/TAO/orbsvcs/orbsvcs/LoadBalancing/LB_LoadAlertInfo.cpp
new file mode 100644
index 00000000000..0378e9f584e
--- /dev/null
+++ b/TAO/orbsvcs/orbsvcs/LoadBalancing/LB_LoadAlertInfo.cpp
@@ -0,0 +1,16 @@
+#include "orbsvcs/LoadBalancing/LB_LoadAlertInfo.h"
+#include "orbsvcs/PortableGroup/PG_Operators.h"
+
+ACE_RCSID (LoadBalancing,
+ LB_LoadAlertInfo,
+ "$Id$")
+
+TAO_BEGIN_VERSIONED_NAMESPACE_DECL
+
+TAO_LB_LoadAlertInfo::TAO_LB_LoadAlertInfo (void)
+ : load_alert (),
+ alerted (0)
+{
+}
+
+TAO_END_VERSIONED_NAMESPACE_DECL
diff --git a/TAO/orbsvcs/orbsvcs/LoadBalancing/LB_LoadAlertInfo.h b/TAO/orbsvcs/orbsvcs/LoadBalancing/LB_LoadAlertInfo.h
new file mode 100644
index 00000000000..47c3f7b384c
--- /dev/null
+++ b/TAO/orbsvcs/orbsvcs/LoadBalancing/LB_LoadAlertInfo.h
@@ -0,0 +1,54 @@
+// -*- C++ -*-
+
+//=======================================================================
+/**
+ * @file LB_LoadAlertInfo.h
+ *
+ * $Id$
+ *
+ * @author Ossama Othman <ossama@uci.edu>
+ */
+//=======================================================================
+
+
+#ifndef TAO_LB_LOAD_ALERT_INFO_H
+#define TAO_LB_LOAD_ALERT_INFO_H
+
+#include /**/ "ace/pre.h"
+
+#include "ace/config-all.h"
+
+#if !defined (ACE_LACKS_PRAGMA_ONCE)
+# pragma once
+#endif /* ACE_LACKS_PRAGMA_ONCE */
+
+#include "orbsvcs/CosLoadBalancingC.h"
+
+TAO_BEGIN_VERSIONED_NAMESPACE_DECL
+
+/**
+ * @class TAO_LB_LoadAlertInfo
+ *
+ * @brief Structure that contains all LoadAlert-specific information.
+ *
+ * Structure that contains all LoadAlert-specific information.
+ */
+struct TAO_LB_LoadAlertInfo
+{
+ /// Constructor.
+ TAO_LB_LoadAlertInfo (void);
+
+ /// Reference to the LoadAlert object.
+ CosLoadBalancing::LoadAlert_var load_alert;
+
+ /// True if the LoadAlert object has been alerted about a given load
+ /// condition. False otherwise.
+ CORBA::Boolean alerted;
+
+};
+
+TAO_END_VERSIONED_NAMESPACE_DECL
+
+#include /**/ "ace/post.h"
+
+#endif /* TAO_LB_LOAD_ALERT_INFO_H */
diff --git a/TAO/orbsvcs/orbsvcs/LoadBalancing/LB_LoadAlertMap.h b/TAO/orbsvcs/orbsvcs/LoadBalancing/LB_LoadAlertMap.h
new file mode 100644
index 00000000000..5451acafddb
--- /dev/null
+++ b/TAO/orbsvcs/orbsvcs/LoadBalancing/LB_LoadAlertMap.h
@@ -0,0 +1,46 @@
+// -*- C++ -*-
+
+//=======================================================================
+/**
+ * @file LB_LoadAlertMap.h
+ *
+ * $Id$
+ *
+ * @author Ossama Othman <ossama@uci.edu>
+ */
+//=======================================================================
+
+
+#ifndef TAO_LB_LOAD_ALERT_MAP_H
+#define TAO_LB_LOAD_ALERT_MAP_H
+
+#include /**/ "ace/pre.h"
+
+#include "ace/config-all.h"
+
+#if !defined (ACE_LACKS_PRAGMA_ONCE)
+# pragma once
+#endif /* ACE_LACKS_PRAGMA_ONCE */
+
+#include "orbsvcs/LoadBalancing/LB_LoadAlertInfo.h"
+
+#include "orbsvcs/PortableGroup/PG_Location_Hash.h"
+#include "orbsvcs/PortableGroup/PG_Location_Equal_To.h"
+
+#include "ace/Hash_Map_Manager_T.h"
+
+TAO_BEGIN_VERSIONED_NAMESPACE_DECL
+
+/// LoadAlertInfo hash map typedef.
+typedef ACE_Hash_Map_Manager_Ex<
+ PortableGroup::Location,
+ TAO_LB_LoadAlertInfo,
+ TAO_PG_Location_Hash,
+ TAO_PG_Location_Equal_To,
+ ACE_Null_Mutex> TAO_LB_LoadAlertMap;
+
+TAO_END_VERSIONED_NAMESPACE_DECL
+
+#include /**/ "ace/post.h"
+
+#endif /* TAO_LB_LOAD_ALERT_MAP_H */
diff --git a/TAO/orbsvcs/orbsvcs/LoadBalancing/LB_LoadAlert_Handler.cpp b/TAO/orbsvcs/orbsvcs/LoadBalancing/LB_LoadAlert_Handler.cpp
new file mode 100644
index 00000000000..ca2bf1b5116
--- /dev/null
+++ b/TAO/orbsvcs/orbsvcs/LoadBalancing/LB_LoadAlert_Handler.cpp
@@ -0,0 +1,52 @@
+#include "orbsvcs/LoadBalancing/LB_LoadAlert_Handler.h"
+
+#include "tao/debug.h"
+
+
+ACE_RCSID (LoadBalancing,
+ LB_LoadAlert_Handler,
+ "$Id$")
+
+TAO_BEGIN_VERSIONED_NAMESPACE_DECL
+
+TAO_LB_LoadAlert_Handler::~TAO_LB_LoadAlert_Handler (void)
+{
+}
+
+void
+TAO_LB_LoadAlert_Handler::enable_alert (ACE_ENV_SINGLE_ARG_DECL_NOT_USED)
+ ACE_THROW_SPEC ((CORBA::SystemException))
+{
+}
+
+void
+TAO_LB_LoadAlert_Handler::enable_alert_excep (
+ ::Messaging::ExceptionHolder *
+ ACE_ENV_ARG_DECL_NOT_USED)
+ ACE_THROW_SPEC ((CORBA::SystemException))
+{
+ if (TAO_debug_level > 0)
+ ACE_ERROR ((LM_ERROR,
+ ACE_TEXT ("Exception caught when invoking ")
+ ACE_TEXT ("LoadAlert::enable_alert()\n")));
+}
+
+void
+TAO_LB_LoadAlert_Handler::disable_alert (ACE_ENV_SINGLE_ARG_DECL_NOT_USED)
+ ACE_THROW_SPEC ((CORBA::SystemException))
+{
+}
+
+void
+TAO_LB_LoadAlert_Handler::disable_alert_excep (
+ ::Messaging::ExceptionHolder *
+ ACE_ENV_ARG_DECL_NOT_USED)
+ ACE_THROW_SPEC ((CORBA::SystemException))
+{
+ if (TAO_debug_level > 0)
+ ACE_ERROR ((LM_ERROR,
+ ACE_TEXT ("Exception caught when invoking ")
+ ACE_TEXT ("LoadAlert::disable_alert()\n")));
+}
+
+TAO_END_VERSIONED_NAMESPACE_DECL
diff --git a/TAO/orbsvcs/orbsvcs/LoadBalancing/LB_LoadAlert_Handler.h b/TAO/orbsvcs/orbsvcs/LoadBalancing/LB_LoadAlert_Handler.h
new file mode 100644
index 00000000000..d19518ce96d
--- /dev/null
+++ b/TAO/orbsvcs/orbsvcs/LoadBalancing/LB_LoadAlert_Handler.h
@@ -0,0 +1,76 @@
+// -*- C++ -*-
+
+// ============================================================================
+/**
+ * @file LB_LoadAlert_Handler.h
+ *
+ * $Id$
+ *
+ * @author Ossama Othman <ossama@uci.edu>
+ */
+// ============================================================================
+
+#ifndef TAO_LB_LOAD_ALERT_REPLY_HANDLER_H
+#define TAO_LB_LOAD_ALERT_REPLY_HANDLER_H
+
+#include "orbsvcs/CosLoadBalancingS.h"
+
+#if !defined (ACE_LACKS_PRAGMA_ONCE)
+# pragma once
+#endif /* ACE_LACKS_PRAGMA_ONCE */
+
+// This is to remove "inherits via dominance" warnings from MSVC.
+// MSVC is being a little too paranoid.
+#if defined(_MSC_VER)
+#pragma warning(push)
+#pragma warning(disable:4250)
+#endif /* _MSC_VER */
+
+TAO_BEGIN_VERSIONED_NAMESPACE_DECL
+
+/**
+ * @class TAO_LB_LoadAlert_Handler
+ *
+ * @brief The AMI reply handler for replies from all LoadAlert
+ * objects.
+ *
+ * This class handles all asynchronously received replies from all
+ * registered LoadAlert objects. It only exists to receive
+ * asynchronously sent exceptions.
+ */
+class TAO_LB_LoadAlert_Handler
+ : public virtual POA_CosLoadBalancing::AMI_LoadAlertHandler
+{
+public:
+
+ virtual void enable_alert (ACE_ENV_SINGLE_ARG_DECL_WITH_DEFAULTS)
+ ACE_THROW_SPEC ((CORBA::SystemException));
+
+ virtual void enable_alert_excep (
+ ::Messaging::ExceptionHolder *
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS)
+ ACE_THROW_SPEC ((CORBA::SystemException));
+
+ virtual void disable_alert (ACE_ENV_SINGLE_ARG_DECL_WITH_DEFAULTS)
+ ACE_THROW_SPEC ((CORBA::SystemException));
+
+ virtual void disable_alert_excep (
+ ::Messaging::ExceptionHolder *
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS)
+ ACE_THROW_SPEC ((CORBA::SystemException));
+
+protected:
+
+ /// Protected destructor to enforce propery memory management
+ /// through reference counting.
+ ~TAO_LB_LoadAlert_Handler (void);
+
+};
+
+TAO_END_VERSIONED_NAMESPACE_DECL
+
+#if defined(_MSC_VER)
+#pragma warning(pop)
+#endif /* _MSC_VER */
+
+#endif /* TAO_LB_LOAD_ALERT_REPLY_HANDLER_H */
diff --git a/TAO/orbsvcs/orbsvcs/LoadBalancing/LB_LoadAverage.cpp b/TAO/orbsvcs/orbsvcs/LoadBalancing/LB_LoadAverage.cpp
new file mode 100644
index 00000000000..c6a0d0c3fa3
--- /dev/null
+++ b/TAO/orbsvcs/orbsvcs/LoadBalancing/LB_LoadAverage.cpp
@@ -0,0 +1,454 @@
+#include "orbsvcs/LoadBalancing/LB_LoadAverage.h"
+#include "orbsvcs/LoadBalancing/LB_LoadMap.h"
+#include "orbsvcs/LoadBalancing/LB_Random.h"
+
+#include "orbsvcs/PortableGroup/PG_conf.h"
+
+#include "tao/debug.h"
+#include "tao/ORB_Constants.h"
+
+#include "ace/Null_Mutex.h"
+#include "ace/OS_NS_string.h"
+
+
+ACE_RCSID (LoadBalancing,
+ LB_LoadAverage,
+ "$Id$")
+
+
+#if !defined (__ACE_INLINE__)
+#include "orbsvcs/LoadBalancing/LB_LoadAverage.inl"
+#endif /* defined INLINE */
+
+TAO_BEGIN_VERSIONED_NAMESPACE_DECL
+
+TAO_LB_LoadAverage::TAO_LB_LoadAverage (PortableServer::POA_ptr poa)
+ : poa_ (PortableServer::POA::_duplicate (poa)),
+ load_map_ (0),
+ lock_ (0),
+ properties_ (),
+ tolerance_ (TAO_LB::LA_DEFAULT_TOLERANCE),
+ dampening_ (TAO_LB::LA_DEFAULT_DAMPENING),
+ per_balance_load_ (TAO_LB::LA_DEFAULT_DAMPENING)
+{
+ // A load map that retains previous load values at a given location
+ // and lock are only needed if dampening is enabled, i.e. non-zero.
+ if (this->dampening_ != 0)
+ {
+ ACE_NEW (this->load_map_, TAO_LB_LoadMap (TAO_PG_MAX_LOCATIONS));
+
+ ACE_NEW (this->lock_, TAO_SYNCH_MUTEX);
+ }
+
+ // Initialize the random load balancing strategy.
+ TAO_LB_Random::init ();
+}
+
+TAO_LB_LoadAverage::~TAO_LB_LoadAverage (void)
+{
+ delete this->load_map_;
+ delete this->lock_;
+}
+
+char *
+TAO_LB_LoadAverage::name (ACE_ENV_SINGLE_ARG_DECL_NOT_USED)
+ ACE_THROW_SPEC ((CORBA::SystemException))
+{
+ return CORBA::string_dup ("LoadAverage");
+}
+
+CosLoadBalancing::Properties *
+TAO_LB_LoadAverage::get_properties (ACE_ENV_SINGLE_ARG_DECL)
+ ACE_THROW_SPEC ((CORBA::SystemException))
+{
+ CosLoadBalancing::Properties * props = 0;
+ ACE_NEW_THROW_EX (props,
+ CosLoadBalancing::Properties (this->properties_),
+ CORBA::NO_MEMORY (
+ CORBA::SystemException::_tao_minor_code (
+ TAO::VMCID,
+ ENOMEM),
+ CORBA::COMPLETED_NO));
+ ACE_CHECK_RETURN (0);
+
+ return props;
+}
+
+void
+TAO_LB_LoadAverage::push_loads (
+ const PortableGroup::Location & the_location,
+ const CosLoadBalancing::LoadList & loads
+ ACE_ENV_ARG_DECL)
+ ACE_THROW_SPEC ((CORBA::SystemException))
+{
+ // Only the first load is used by this load balancing strategy.
+ if (loads.length () == 0)
+ ACE_THROW (CORBA::BAD_PARAM ());
+
+ CosLoadBalancing::Load load; // Unused
+
+ this->push_loads (the_location,
+ loads,
+ load
+ ACE_ENV_ARG_PARAMETER);
+}
+
+void
+TAO_LB_LoadAverage::push_loads (
+ const PortableGroup::Location & the_location,
+ const CosLoadBalancing::LoadList & loads,
+ CosLoadBalancing::Load & load
+ ACE_ENV_ARG_DECL)
+{
+ if (loads.length () == 0)
+ ACE_THROW (CORBA::BAD_PARAM ());
+
+ // Only the first load is used by this load balancing strategy.
+ const CosLoadBalancing::Load & new_load = loads[0];
+
+ if (this->load_map_ != 0)
+ {
+ ACE_GUARD (TAO_SYNCH_MUTEX, guard, *this->lock_);
+
+ TAO_LB_LoadMap::ENTRY * entry;
+ if (this->load_map_->find (the_location, entry) == 0)
+ {
+ CosLoadBalancing::Load & previous_load = entry->int_id_;
+
+ if (previous_load.id != new_load.id)
+ ACE_THROW (CORBA::BAD_PARAM ()); // Somebody switched
+ // LoadIds on us!
+
+ previous_load.value =
+ this->effective_load (previous_load.value, new_load.value);
+
+ load = previous_load;
+ }
+ else
+ {
+ const CosLoadBalancing::Load eff_load =
+ {
+ new_load.id,
+ this->effective_load (0, new_load.value)
+ };
+
+ if (this->load_map_->bind (the_location, eff_load) != 0)
+ {
+ if (TAO_debug_level > 0)
+ ACE_ERROR ((LM_ERROR,
+ "ERROR: TAO_LB_LoadAverage - "
+ "Unable to push loads\n"));
+
+ ACE_THROW (CORBA::INTERNAL ());
+ }
+
+ load = eff_load;
+ }
+ }
+ else
+ {
+ load.id = new_load.id;
+ load.value = this->effective_load (0, new_load.value);
+ }
+}
+
+CosLoadBalancing::LoadList *
+TAO_LB_LoadAverage::get_loads (CosLoadBalancing::LoadManager_ptr load_manager,
+ const PortableGroup::Location & the_location
+ ACE_ENV_ARG_DECL)
+ ACE_THROW_SPEC ((CORBA::SystemException,
+ CosLoadBalancing::LocationNotFound))
+{
+ if (CORBA::is_nil (load_manager))
+ ACE_THROW_RETURN (CORBA::BAD_PARAM (), 0);
+
+ CosLoadBalancing::LoadList_var loads =
+ load_manager->get_loads (the_location
+ ACE_ENV_ARG_PARAMETER);
+ ACE_CHECK_RETURN (0);
+
+ this->push_loads (the_location,
+ loads.in (),
+ loads[0]
+ ACE_ENV_ARG_PARAMETER);
+ ACE_CHECK_RETURN (0);
+
+ return loads._retn ();
+}
+
+
+CORBA::Object_ptr
+TAO_LB_LoadAverage::next_member (
+ PortableGroup::ObjectGroup_ptr object_group,
+ CosLoadBalancing::LoadManager_ptr load_manager
+ ACE_ENV_ARG_DECL)
+ ACE_THROW_SPEC ((CORBA::SystemException,
+ PortableGroup::ObjectGroupNotFound,
+ PortableGroup::MemberNotFound))
+{
+ if (CORBA::is_nil (load_manager))
+ ACE_THROW_RETURN (CORBA::BAD_PARAM (),
+ CORBA::Object::_nil ());
+
+ PortableGroup::Locations_var locations =
+ load_manager->locations_of_members (object_group
+ ACE_ENV_ARG_PARAMETER);
+ ACE_CHECK_RETURN (CORBA::Object::_nil ());
+
+ if (locations->length () == 0)
+ ACE_THROW_RETURN (CORBA::TRANSIENT (),
+ CORBA::Object::_nil ());
+
+ // @note The Random load balancing strategy is used since it is
+ // very lightweight and stateless.
+
+ return TAO_LB_Random::_tao_next_member (object_group,
+ load_manager,
+ locations.in ()
+ ACE_ENV_ARG_PARAMETER);
+}
+
+void
+TAO_LB_LoadAverage::analyze_loads (
+ PortableGroup::ObjectGroup_ptr object_group,
+ CosLoadBalancing::LoadManager_ptr load_manager
+ ACE_ENV_ARG_DECL)
+ ACE_THROW_SPEC ((CORBA::SystemException))
+{
+ if (CORBA::is_nil (load_manager))
+ ACE_THROW (CORBA::BAD_PARAM ());
+
+ PortableGroup::Locations_var locations =
+ load_manager->locations_of_members (object_group
+ ACE_ENV_ARG_PARAMETER);
+ ACE_CHECK;
+
+ if (locations->length () == 0)
+ ACE_THROW (CORBA::TRANSIENT ());
+
+ const CORBA::ULong len = locations->length ();
+
+ CosLoadBalancing::Load total_load = { 0, 0 };
+ CosLoadBalancing::Load avg_load = { 0, 0 };
+
+ CosLoadBalancing::LoadList tmp (len);
+ tmp.length (1);
+
+ // Iterate through the entire location list to determine
+ // the average load of all the locations
+ for (CORBA::ULong i = 0; i < len; ++i)
+ {
+ ACE_TRY
+ {
+ const PortableGroup::Location & loc = locations[i];
+
+ // Retrieve the load list for the location from the
+ // LoadManager and push it to this Strategy's load
+ // processor.
+ CosLoadBalancing::LoadList_var current_loads =
+ load_manager->get_loads (loc
+ ACE_ENV_ARG_PARAMETER);
+ ACE_TRY_CHECK;
+
+ CosLoadBalancing::Load load;
+ this->push_loads (loc,
+ current_loads.in (),
+ load
+ ACE_ENV_ARG_PARAMETER);
+ ACE_TRY_CHECK;
+
+ // @@ Jai, please use the compound "+=" operator here. It
+ // is more efficient in this case.
+ total_load.value = total_load.value + load.value;
+
+ tmp[i] = load;
+
+ /*
+ ACE_DEBUG ((LM_DEBUG,
+ "TOTAL == %f\n",
+ total_load.value));
+ */
+ }
+ ACE_CATCH (CosLoadBalancing::LocationNotFound, ex)
+ {
+ // no location found
+ //
+ }
+ ACE_ENDTRY;
+ ACE_CHECK;
+ }
+
+ avg_load.value = total_load.value / len;
+/*
+ ACE_DEBUG ((LM_DEBUG,
+ "AVERAGE LOAD == %f\n",
+ avg_load.value));
+*/
+
+ // Iterate through the entire location list to determine
+ // the location where the load has to be shed.
+ for (CORBA::ULong j = 0; j < len; ++j)
+ {
+ ACE_TRY_EX (SECOND)
+ {
+ const PortableGroup::Location & loc = locations[j];
+
+ /*
+ ACE_DEBUG ((LM_DEBUG,
+ "EFFECTIVE_LOAD == %f\n"
+ "AVERAGE == %f\n",
+ tmp[i].value,
+ avg_load.value));
+ */
+
+ if (tmp[j].value <= avg_load.value)
+ {
+ load_manager->disable_alert (loc
+ ACE_ENV_ARG_PARAMETER);
+ ACE_TRY_CHECK_EX (SECOND);
+ }
+ else
+ {
+ CORBA::Float percent_diff =
+ (tmp[j].value / avg_load.value) - 1;
+
+ if (tmp[j].value == avg_load.value)
+ {
+ percent_diff = 0;
+ }
+/*
+ ACE_DEBUG ((LM_DEBUG,
+ "ALERT LOC == %u"
+ "\tAVG LOAD == %f\n"
+ "\tLOAD == %f\n"
+ "\tPERCENT == %f\n",
+ i,
+ avg_load.value,
+ tmp[i].value,
+ percent_diff));
+*/
+
+ // @@ Jai, please correct the indentation on the below
+ // conditional blocks so that they conform to the ACE
+ // coding style.
+ if (percent_diff <= TAO_LB::LA_DEFAULT_DIFF_AVERAGE_CUTOFF)
+ {
+ load_manager->disable_alert (loc
+ ACE_ENV_ARG_PARAMETER);
+ ACE_TRY_CHECK_EX (SECOND);
+ }
+ else if ((percent_diff > TAO_LB::LA_DEFAULT_DIFF_AVERAGE_CUTOFF)
+ && (percent_diff < 1))
+ {
+/*
+ ACE_DEBUG ((LM_DEBUG,
+ "%P --- ALERTING LOCATION %u\n",
+ i));
+*/
+
+ load_manager->enable_alert (loc
+ ACE_ENV_ARG_PARAMETER);
+
+ ACE_TRY_CHECK_EX (SECOND);
+ }
+
+ }
+ }
+ ACE_CATCH (CosLoadBalancing::LocationNotFound, ex)
+ {
+ // no location found
+ //
+ }
+ ACE_ENDTRY;
+ ACE_CHECK;
+ }
+
+}
+
+PortableServer::POA_ptr
+TAO_LB_LoadAverage::_default_POA (ACE_ENV_SINGLE_ARG_DECL_NOT_USED)
+{
+ return PortableServer::POA::_duplicate (this->poa_.in ());
+}
+
+void
+TAO_LB_LoadAverage::init (const PortableGroup::Properties & props
+ ACE_ENV_ARG_DECL)
+{
+ CORBA::Float tolerance = TAO_LB::LA_DEFAULT_TOLERANCE;
+ CORBA::Float dampening = TAO_LB::LA_DEFAULT_DAMPENING;
+ CORBA::Float per_balance_load = TAO_LB::LA_DEFAULT_PER_BALANCE_LOAD;
+
+ const CORBA::ULong len = props.length ();
+ for (CORBA::ULong i = 0; i < len; ++i)
+ {
+ const PortableGroup::Property & property = props[i];
+ if (ACE_OS::strcmp (property.nam[0].id.in (),
+ "org.omg.CosLoadBalancing.Strategy.LoadAverage.Tolerance") == 0)
+ {
+ this->extract_float_property (property,
+ tolerance
+ ACE_ENV_ARG_PARAMETER);
+ ACE_CHECK;
+
+ // Valid tolerance values are greater than or equal to one.
+ if (tolerance < 1)
+ ACE_THROW (PortableGroup::InvalidProperty (property.nam,
+ property.val));
+ }
+
+ else if (ACE_OS::strcmp (property.nam[0].id.in (),
+ "org.omg.CosLoadBalancing.Strategy.LoadAverage.Dampening") == 0)
+ {
+ this->extract_float_property (property,
+ dampening
+ ACE_ENV_ARG_PARAMETER);
+ ACE_CHECK;
+
+ // Dampening range is [0,1).
+ if (dampening < 0 || dampening >= 1)
+ ACE_THROW (PortableGroup::InvalidProperty (property.nam,
+ property.val));
+ }
+
+ else if (ACE_OS::strcmp (property.nam[0].id.in (),
+ "org.omg.CosLoadBalancing.Strategy.LoadAverage.PerBalanceLoad") == 0)
+ {
+ this->extract_float_property (property,
+ per_balance_load
+ ACE_ENV_ARG_PARAMETER);
+ ACE_CHECK;
+ }
+ }
+
+ this->properties_ = props;
+
+ this->tolerance_ = tolerance;
+ this->dampening_ = dampening;
+ this->per_balance_load_ = per_balance_load;
+
+ /*
+ ACE_DEBUG ((LM_DEBUG,
+ "--------------------------------\n"
+ "tolerance = %f\n"
+ "dampening = %f\n"
+ "per_balance_load = %f\n"
+ "--------------------------------\n",
+ tolerance,
+ dampening,
+ per_balance_load));
+ */
+}
+
+void
+TAO_LB_LoadAverage::extract_float_property (
+ const PortableGroup::Property & property,
+ CORBA::Float & value
+ ACE_ENV_ARG_DECL)
+{
+ if (!(property.val >>= value))
+ ACE_THROW (PortableGroup::InvalidProperty (property.nam,
+ property.val));
+}
+
+TAO_END_VERSIONED_NAMESPACE_DECL
diff --git a/TAO/orbsvcs/orbsvcs/LoadBalancing/LB_LoadAverage.h b/TAO/orbsvcs/orbsvcs/LoadBalancing/LB_LoadAverage.h
new file mode 100644
index 00000000000..4af286ee527
--- /dev/null
+++ b/TAO/orbsvcs/orbsvcs/LoadBalancing/LB_LoadAverage.h
@@ -0,0 +1,184 @@
+// -*- C++ -*-
+
+//=============================================================================
+/**
+ * @file LB_LoadAverage.h
+ *
+ * $Id$
+ *
+ * @author Jaiganesh Balasubramanian <jai@dre.vanderbilt.edu>
+ * @author Ossama Othman <ossama@dre.vanderbilt.edu>
+ */
+//=============================================================================
+
+
+#ifndef LB_LOAD_AVERAGE_H
+#define LB_LOAD_AVERAGE_H
+
+#include /**/ "ace/pre.h"
+
+#include "orbsvcs/LoadBalancing/LB_LoadMap.h"
+
+# if !defined (ACE_LACKS_PRAGMA_ONCE)
+# pragma once
+# endif /* ACE_LACKS_PRAGMA_ONCE */
+
+#include "orbsvcs/CosLoadBalancingS.h"
+
+#include "ace/Synch_Traits.h"
+#include "ace/Thread_Mutex.h"
+
+TAO_BEGIN_VERSIONED_NAMESPACE_DECL
+
+namespace TAO_LB
+{
+ /**
+ * @name Default LoadAverage strategy parameters.
+ *
+ * Defaults defined by the Load Balancing specification.
+ */
+ //@{
+ const CORBA::Float LA_DEFAULT_TOLERANCE = 1;
+ const CORBA::Float LA_DEFAULT_DAMPENING = 0;
+ const CORBA::Float LA_DEFAULT_PER_BALANCE_LOAD = 0;
+
+ const CORBA::Float LA_DEFAULT_DIFF_AVERAGE_CUTOFF = 0.8f;
+ //@}
+
+}
+
+/**
+ * @class TAO_LB_LoadAverage
+ *
+ * @brief "Least loaded" load balancing strategy
+ *
+ * This load balancing strategy is designed to select an object group
+ * member residing at a location with the smallest load.
+ */
+class TAO_LB_LoadAverage
+ : public virtual POA_CosLoadBalancing::Strategy
+{
+public:
+
+ /// Constructor.
+ TAO_LB_LoadAverage (PortableServer::POA_ptr poa);
+
+ /**
+ * @name CosLoadBalancing::Strategy methods
+ *
+ * Methods required by the CosLoadBalancing::Strategy interface.
+ */
+ //@{
+ virtual char * name (ACE_ENV_SINGLE_ARG_DECL_WITH_DEFAULTS)
+ ACE_THROW_SPEC ((CORBA::SystemException));
+
+ virtual CosLoadBalancing::Properties * get_properties (
+ ACE_ENV_SINGLE_ARG_DECL_WITH_DEFAULTS)
+ ACE_THROW_SPEC ((CORBA::SystemException));
+
+ virtual void push_loads (
+ const PortableGroup::Location & the_location,
+ const CosLoadBalancing::LoadList & loads
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS)
+ ACE_THROW_SPEC ((CORBA::SystemException));
+
+ virtual CosLoadBalancing::LoadList * get_loads (
+ CosLoadBalancing::LoadManager_ptr load_manager,
+ const PortableGroup::Location & the_location
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS)
+ ACE_THROW_SPEC ((CORBA::SystemException,
+ CosLoadBalancing::LocationNotFound));
+
+ virtual CORBA::Object_ptr next_member (
+ PortableGroup::ObjectGroup_ptr object_group,
+ CosLoadBalancing::LoadManager_ptr load_manager
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS)
+ ACE_THROW_SPEC ((CORBA::SystemException,
+ PortableGroup::ObjectGroupNotFound,
+ PortableGroup::MemberNotFound));
+
+ virtual void analyze_loads (
+ PortableGroup::ObjectGroup_ptr object_group,
+ CosLoadBalancing::LoadManager_ptr load_manager
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS)
+ ACE_THROW_SPEC ((CORBA::SystemException));
+ //@}
+
+ /// Returns the default POA for this servant.
+ virtual PortableServer::POA_ptr _default_POA (
+ ACE_ENV_SINGLE_ARG_DECL_WITH_DEFAULTS
+ );
+
+ /// Initialize the LoadAverage instance with the given properties.
+ void init (const PortableGroup::Properties & props
+ ACE_ENV_ARG_DECL);
+
+protected:
+
+ /// Destructor.
+ ~TAO_LB_LoadAverage (void);
+
+ /// Return the effective load.
+ CORBA::Float effective_load (CORBA::Float previous_load,
+ CORBA::Float new_load);
+
+ /// Push the new load into this Strategy's load processor, and
+ /// return the corresponding effective load.
+ void push_loads (
+ const PortableGroup::Location & the_location,
+ const CosLoadBalancing::LoadList & loads,
+ CosLoadBalancing::Load & effective_load
+ ACE_ENV_ARG_DECL);
+
+ /// Utility method to extract a CORBA::Float value from the given
+ /// property.
+ void extract_float_property (const PortableGroup::Property & property,
+ CORBA::Float & value
+ ACE_ENV_ARG_DECL);
+
+private:
+
+ /// This servant's default POA.
+ PortableServer::POA_var poa_;
+
+ /// Table that maps location to load list.
+ TAO_LB_LoadMap * load_map_;
+
+ /// Lock used to ensure atomic access to state retained by this
+ /// class.
+ TAO_SYNCH_MUTEX * lock_;
+
+ /// Cached set of properties used when initializing this strategy.
+ CosLoadBalancing::Properties properties_;
+
+ /**
+ * @name LoadAverage Property Values
+ *
+ * Cached LoadAverage load balancing strategy property values.
+ */
+ //@{
+
+ ///
+ CORBA::Float tolerance_;
+
+ ///
+ CORBA::Float dampening_;
+
+ ///
+ CORBA::Float per_balance_load_;
+
+ //@}
+
+ CosLoadBalancing::LoadList current_loads_;
+
+};
+
+TAO_END_VERSIONED_NAMESPACE_DECL
+
+#if defined (__ACE_INLINE__)
+#include "orbsvcs/LoadBalancing/LB_LoadAverage.inl"
+#endif /* defined INLINE */
+
+#include /**/ "ace/post.h"
+
+#endif /* LB_LOAD_AVERAGE_H */
diff --git a/TAO/orbsvcs/orbsvcs/LoadBalancing/LB_LoadAverage.inl b/TAO/orbsvcs/orbsvcs/LoadBalancing/LB_LoadAverage.inl
new file mode 100644
index 00000000000..347374c1a7c
--- /dev/null
+++ b/TAO/orbsvcs/orbsvcs/LoadBalancing/LB_LoadAverage.inl
@@ -0,0 +1,26 @@
+// -*- C++ -*-
+//
+// $Id$
+
+TAO_BEGIN_VERSIONED_NAMESPACE_DECL
+
+ACE_INLINE CORBA::Float
+TAO_LB_LoadAverage::effective_load (CORBA::Float previous_load,
+ CORBA::Float new_load)
+{
+ // Apply per-balance load. (Recompute raw load)
+ previous_load += this->per_balance_load_;
+
+ // Apply dampening. (Recompute new raw load)
+ CORBA::Float result =
+ this->dampening_ * previous_load + (1 - this->dampening_) * new_load;
+
+ ACE_ASSERT (this->tolerance_ != 0);
+
+ // Compute the effective load.
+ result /= this->tolerance_;
+
+ return result;
+}
+
+TAO_END_VERSIONED_NAMESPACE_DECL
diff --git a/TAO/orbsvcs/orbsvcs/LoadBalancing/LB_LoadListMap.h b/TAO/orbsvcs/orbsvcs/LoadBalancing/LB_LoadListMap.h
new file mode 100644
index 00000000000..4dd83f2e2b9
--- /dev/null
+++ b/TAO/orbsvcs/orbsvcs/LoadBalancing/LB_LoadListMap.h
@@ -0,0 +1,46 @@
+// -*- C++ -*-
+
+//=======================================================================
+/**
+ * @file LB_LoadListMap.h
+ *
+ * $Id$
+ *
+ * @author Ossama Othman <ossama@uci.edu>
+ */
+//=======================================================================
+
+
+#ifndef TAO_LB_LOAD_LIST_MAP_H
+#define TAO_LB_LOAD_LIST_MAP_H
+
+#include /**/ "ace/pre.h"
+
+#include "orbsvcs/CosLoadBalancingC.h"
+
+#if !defined (ACE_LACKS_PRAGMA_ONCE)
+# pragma once
+#endif /* ACE_LACKS_PRAGMA_ONCE */
+
+#include "orbsvcs/PortableGroupC.h"
+
+#include "orbsvcs/PortableGroup/PG_Location_Hash.h"
+#include "orbsvcs/PortableGroup/PG_Location_Equal_To.h"
+
+#include "ace/Hash_Map_Manager_T.h"
+
+TAO_BEGIN_VERSIONED_NAMESPACE_DECL
+
+/// LoadList hash map.
+typedef ACE_Hash_Map_Manager_Ex<
+ PortableGroup::Location,
+ CosLoadBalancing::LoadList,
+ TAO_PG_Location_Hash,
+ TAO_PG_Location_Equal_To,
+ ACE_Null_Mutex> TAO_LB_LoadListMap;
+
+TAO_END_VERSIONED_NAMESPACE_DECL
+
+#include /**/ "ace/post.h"
+
+#endif /* TAO_LB_LOAD_LIST_MAP_H */
diff --git a/TAO/orbsvcs/orbsvcs/LoadBalancing/LB_LoadManager.cpp b/TAO/orbsvcs/orbsvcs/LoadBalancing/LB_LoadManager.cpp
new file mode 100644
index 00000000000..10b42090791
--- /dev/null
+++ b/TAO/orbsvcs/orbsvcs/LoadBalancing/LB_LoadManager.cpp
@@ -0,0 +1,1295 @@
+#include "orbsvcs/LoadBalancing/LB_LoadManager.h"
+#include "orbsvcs/LoadBalancing/LB_MemberLocator.h"
+#include "orbsvcs/LoadBalancing/LB_LoadAlert_Handler.h"
+#include "orbsvcs/LoadBalancing/LB_RoundRobin.h"
+#include "orbsvcs/LoadBalancing/LB_Random.h"
+#include "orbsvcs/LoadBalancing/LB_LoadMinimum.h"
+#include "orbsvcs/LoadBalancing/LB_LoadAverage.h"
+#include "orbsvcs/LoadBalancing/LB_LeastLoaded.h"
+#include "orbsvcs/LoadBalancing/LB_conf.h"
+
+#include "orbsvcs/PortableGroup/PG_Property_Utils.h"
+#include "orbsvcs/PortableGroup/PG_conf.h"
+
+#include "tao/Messaging/Messaging.h"
+#include "tao/debug.h"
+#include "tao/ORB_Constants.h"
+
+#include "ace/Reactor.h"
+#include "ace/Reverse_Lock_T.h"
+#include "ace/SString.h"
+#include "ace/OS_NS_sys_time.h"
+#include "ace/OS_NS_stdio.h"
+#include "ace/OS_NS_string.h"
+
+
+ACE_RCSID (LoadBalancing,
+ LB_LoadManager,
+ "$Id$")
+
+TAO_BEGIN_VERSIONED_NAMESPACE_DECL
+
+TAO_LB_LoadManager::TAO_LB_LoadManager (void)
+ : reactor_ (0),
+ poa_ (),
+ root_poa_ (),
+ monitor_lock_ (),
+ load_lock_ (),
+ load_alert_lock_ (),
+ lock_ (),
+ monitor_map_ (TAO_PG_MAX_LOCATIONS),
+ load_map_ (TAO_PG_MAX_LOCATIONS),
+ load_alert_map_ (TAO_PG_MAX_LOCATIONS),
+ object_group_manager_ (),
+ property_manager_ (object_group_manager_),
+ generic_factory_ (object_group_manager_, property_manager_),
+ pull_handler_ (),
+ timer_id_ (-1),
+ lm_ref_ (),
+ round_robin_ (),
+ random_ (),
+ least_loaded_ (),
+ load_minimum_ (),
+ load_average_ (),
+ built_in_balancing_strategy_info_name_ (1),
+ built_in_balancing_strategy_name_ (1),
+ custom_balancing_strategy_name_ (1)
+{
+ this->pull_handler_.initialize (&this->monitor_map_, this);
+
+ // @note "this->init()" is not called here (in the constructor)
+ // since it may thrown an exception. Throwing an exception in
+ // a constructor in an emulated exception environment is
+ // problematic since native exception semantics cannot be
+ // reproduced in such a case. As such, init() must be called
+ // by whatever code instantiates this LoadManager.
+}
+
+TAO_LB_LoadManager::~TAO_LB_LoadManager (void)
+{
+}
+
+void
+TAO_LB_LoadManager::push_loads (
+ const PortableGroup::Location & the_location,
+ const CosLoadBalancing::LoadList & loads
+ ACE_ENV_ARG_DECL)
+ ACE_THROW_SPEC ((CORBA::SystemException))
+{
+ if (loads.length () == 0)
+ ACE_THROW (CORBA::BAD_PARAM ());
+
+ {
+ ACE_GUARD (TAO_SYNCH_MUTEX,
+ guard,
+ this->load_lock_);
+
+ if (this->load_map_.rebind (the_location, loads) == -1)
+ ACE_THROW (CORBA::INTERNAL ());
+ }
+
+ // Analyze loads for object groups that have members residing at the
+ // given location.
+ PortableGroup::ObjectGroups_var groups =
+ this->object_group_manager_.groups_at_location (the_location
+ ACE_ENV_ARG_PARAMETER);
+ ACE_CHECK;
+
+ const CORBA::ULong len = groups->length ();
+
+ for (CORBA::ULong i = 0; i < len; ++i)
+ {
+ PortableGroup::ObjectGroup_ptr object_group =
+ groups[i];
+
+ ACE_TRY
+ {
+ PortableGroup::Properties_var properties =
+ this->get_properties (object_group
+ ACE_ENV_ARG_PARAMETER);
+ ACE_TRY_CHECK;
+
+ PortableGroup::Value value;
+ CosLoadBalancing::Strategy_ptr strategy;
+
+ if ((TAO_PG::get_property_value (
+ this->built_in_balancing_strategy_name_,
+ properties.in (),
+ value)
+ || TAO_PG::get_property_value (
+ this->custom_balancing_strategy_name_,
+ properties.in (),
+ value))
+ && (value >>= strategy)
+ && !CORBA::is_nil (strategy))
+ {
+ strategy->analyze_loads (object_group,
+ this->lm_ref_.in ()
+ ACE_ENV_ARG_PARAMETER);
+ ACE_TRY_CHECK;
+ }
+ }
+ ACE_CATCHANY
+ {
+ // Ignore all exceptions.
+ }
+ ACE_ENDTRY;
+ ACE_CHECK;
+ }
+}
+
+CosLoadBalancing::LoadList *
+TAO_LB_LoadManager::get_loads (const PortableGroup::Location & the_location
+ ACE_ENV_ARG_DECL)
+ ACE_THROW_SPEC ((CORBA::SystemException,
+ CosLoadBalancing::LocationNotFound))
+{
+ CosLoadBalancing::LoadList * tmp;
+ ACE_NEW_THROW_EX (tmp,
+ CosLoadBalancing::LoadList,
+ CORBA::NO_MEMORY (
+ CORBA::SystemException::_tao_minor_code (
+ TAO::VMCID,
+ ENOMEM),
+ CORBA::COMPLETED_NO));
+ ACE_CHECK_RETURN (0);
+
+ CosLoadBalancing::LoadList_var loads = tmp;
+
+ ACE_GUARD_RETURN (TAO_SYNCH_MUTEX,
+ guard,
+ this->load_lock_,
+ 0);
+
+ if (this->load_map_.find (the_location, *tmp) == 0)
+ return loads._retn ();
+ else
+ ACE_THROW_RETURN (CosLoadBalancing::LocationNotFound (), 0);
+}
+
+void
+TAO_LB_LoadManager::enable_alert (const PortableGroup::Location & the_location
+ ACE_ENV_ARG_DECL)
+ ACE_THROW_SPEC ((CosLoadBalancing::LoadAlertNotFound))
+{
+ ACE_GUARD (TAO_SYNCH_MUTEX, guard, this->load_alert_lock_);
+
+ TAO_LB_LoadAlertMap::ENTRY * entry;
+ if (this->load_alert_map_.find (the_location, entry) == 0)
+ {
+ TAO_LB_LoadAlertInfo & info = entry->int_id_;
+
+ // @note This could be problematic if the LoadAlert object is
+ // registered with more than LoadManager.
+
+ if (info.alerted == 1)
+ return; // No need to set the alert status. It has already
+ // been set.
+
+ // Duplicate before releasing the LoadAlertMap lock to prevent a
+ // race condition from occuring. The LoadAlertInfo map may be
+ // altered prior to invoking an operation on the LoadAlert
+ // object.
+ CosLoadBalancing::LoadAlert_var load_alert =
+ CosLoadBalancing::LoadAlert::_duplicate (info.load_alert.in ());
+
+ // The alert condition will be enabled.
+ // @@ What happens if the below call fails? This variable
+ // should be reset to zero!
+ info.alerted = 1;
+
+ {
+ // Release the lock prior to making the below remote
+ // invocation.
+ ACE_Reverse_Lock<TAO_SYNCH_MUTEX> reverse_lock (
+ this->load_alert_lock_);
+ ACE_GUARD (ACE_Reverse_Lock<TAO_SYNCH_MUTEX>,
+ reverse_guard,
+ reverse_lock);
+
+ // Use AMI to make the following operation "non-blocking,"
+ // allowing the caller to continue without being forced to
+ // wait for a response.
+ //
+ // AMI is used to improve member selection times and overall
+ // throughput since the LoadAlert object need not be alerted
+ // synchronously. In particular, the load alert can and
+ // should be performed in parallel to other tasks, such as
+ // member selection.
+ load_alert->sendc_enable_alert (this->load_alert_handler_.in ()
+ ACE_ENV_ARG_PARAMETER);
+ ACE_CHECK;
+ }
+ }
+ else
+ ACE_THROW (CosLoadBalancing::LoadAlertNotFound ());
+}
+
+void
+TAO_LB_LoadManager::disable_alert (const PortableGroup::Location & the_location
+ ACE_ENV_ARG_DECL)
+ ACE_THROW_SPEC ((CosLoadBalancing::LoadAlertNotFound))
+{
+ ACE_GUARD (TAO_SYNCH_MUTEX, guard, this->load_alert_lock_);
+
+ TAO_LB_LoadAlertMap::ENTRY * entry;
+ if (this->load_alert_map_.find (the_location, entry) == 0)
+ {
+ TAO_LB_LoadAlertInfo & info = entry->int_id_;
+
+ // @note This could be problematic if the LoadAlert object is
+ // registered with more than LoadManager.
+ if (info.alerted == 0)
+ return; // No need to set the alert status. It has already
+ // been set.
+
+ // Duplicate before releasing the LoadAlertMap lock to prevent a
+ // race condition from occuring. The LoadAlertInfo map may be
+ // altered prior to invoking an operation on the LoadAlert
+ // object.
+ CosLoadBalancing::LoadAlert_var load_alert =
+ CosLoadBalancing::LoadAlert::_duplicate (info.load_alert.in ());
+
+ // The alert condition will be disabled.
+ // @@ What happens if the below call fails? This variable
+ // should be reset to one!
+ info.alerted = 0;
+
+ {
+ // Release the lock prior to making the below remote
+ // invocation.
+ ACE_Reverse_Lock<TAO_SYNCH_MUTEX> reverse_lock (
+ this->load_alert_lock_);
+ ACE_GUARD (ACE_Reverse_Lock<TAO_SYNCH_MUTEX>,
+ reverse_guard,
+ reverse_lock);
+
+ // Use AMI to make the following operation "non-blocking,"
+ // allowing the caller to continue without being forced to
+ // wait for a response.
+ //
+ // AMI is used to improve member selection times and overall
+ // throughput since the LoadAlert object need not be alerted
+ // synchronously. In particular, the load alert can and
+ // should be performed in parallel to other tasks, such as
+ // member selection.
+ load_alert->sendc_disable_alert (this->load_alert_handler_.in ()
+ ACE_ENV_ARG_PARAMETER);
+ ACE_CHECK;
+ }
+ }
+ else
+ ACE_THROW (CosLoadBalancing::LoadAlertNotFound ());
+}
+
+void
+TAO_LB_LoadManager::register_load_alert (
+ const PortableGroup::Location & the_location,
+ CosLoadBalancing::LoadAlert_ptr load_alert
+ ACE_ENV_ARG_DECL)
+ ACE_THROW_SPEC ((CORBA::SystemException,
+ CosLoadBalancing::LoadAlertAlreadyPresent,
+ CosLoadBalancing::LoadAlertNotAdded))
+{
+ if (CORBA::is_nil (load_alert))
+ ACE_THROW (CORBA::BAD_PARAM ());
+
+ ACE_GUARD (TAO_SYNCH_MUTEX, guard, this->load_alert_lock_);
+
+ TAO_LB_LoadAlertInfo info;
+ info.load_alert = CosLoadBalancing::LoadAlert::_duplicate (load_alert);
+
+ int result = this->load_alert_map_.bind (the_location, info);
+
+ if (result == 1)
+ {
+ ACE_THROW (CosLoadBalancing::LoadAlertAlreadyPresent ());
+ }
+ else if (result == -1)
+ {
+ // Problems dude!
+ ACE_THROW (CosLoadBalancing::LoadAlertNotAdded ());
+ }
+}
+
+CosLoadBalancing::LoadAlert_ptr
+TAO_LB_LoadManager::get_load_alert (
+ const PortableGroup::Location & the_location
+ ACE_ENV_ARG_DECL)
+ ACE_THROW_SPEC ((CORBA::SystemException,
+ CosLoadBalancing::LoadAlertNotFound))
+{
+ ACE_GUARD_RETURN (TAO_SYNCH_MUTEX,
+ guard,
+ this->load_alert_lock_,
+ CosLoadBalancing::LoadAlert::_nil ());
+
+ TAO_LB_LoadAlertMap::ENTRY * entry;
+ if (this->load_alert_map_.find (the_location, entry) == 0)
+ {
+ TAO_LB_LoadAlertInfo & info = entry->int_id_;
+
+ return
+ CosLoadBalancing::LoadAlert::_duplicate (info.load_alert.in ());
+ }
+ else
+ {
+ ACE_THROW_RETURN (CosLoadBalancing::LoadAlertNotFound (),
+ CosLoadBalancing::LoadAlert::_nil ());
+ }
+}
+
+void
+TAO_LB_LoadManager::remove_load_alert (
+ const PortableGroup::Location & the_location
+ ACE_ENV_ARG_DECL)
+ ACE_THROW_SPEC ((CORBA::SystemException,
+ CosLoadBalancing::LoadAlertNotFound))
+{
+ // Disable the "alert" status on the LoadAlert object since it will
+ // no longer be associated with the LoadManager. In particular,
+ // requests should be allowed through once again since there will be
+ // no way to control the load shedding mechanism once the LoadAlert
+ // object is no longer under the control of the LoadManager.
+ this->disable_alert (the_location
+ ACE_ENV_ARG_PARAMETER);
+ ACE_CHECK;
+
+ ACE_GUARD (TAO_SYNCH_MUTEX, guard, this->load_alert_lock_);
+
+ if (this->load_alert_map_.unbind (the_location) != 0)
+ {
+ ACE_THROW (CosLoadBalancing::LoadAlertNotFound ());
+ }
+}
+
+void
+TAO_LB_LoadManager::register_load_monitor (
+ const PortableGroup::Location & the_location,
+ CosLoadBalancing::LoadMonitor_ptr load_monitor
+ ACE_ENV_ARG_DECL)
+ ACE_THROW_SPEC ((CORBA::SystemException,
+ CosLoadBalancing::MonitorAlreadyPresent))
+{
+ if (CORBA::is_nil (load_monitor))
+ ACE_THROW (CORBA::BAD_PARAM ());
+
+ const CosLoadBalancing::LoadMonitor_var the_monitor =
+ CosLoadBalancing::LoadMonitor::_duplicate (load_monitor);
+
+ ACE_GUARD (TAO_SYNCH_MUTEX,
+ guard,
+ this->monitor_lock_);
+
+ int result = this->monitor_map_.bind (the_location, the_monitor);
+
+ if (result == 0
+ && this->monitor_map_.current_size () == 1)
+ {
+ // Register the "pull monitoring" event handler only after the
+ // first load monitor is registered. This is an optimization to
+ // prevent unnecessary invocation of the "pull monitoring" event
+ // handler.
+ ACE_Time_Value interval (TAO_LB_PULL_HANDLER_INTERVAL, 0);
+ ACE_Time_Value restart (TAO_LB_PULL_HANDLER_RESTART, 0);
+ this->timer_id_ = this->reactor_->schedule_timer (&this->pull_handler_,
+ 0,
+ interval,
+ restart);
+
+ if (this->timer_id_ == -1)
+ {
+ if (TAO_debug_level > 0)
+ ACE_ERROR ((LM_ERROR,
+ "TAO_LB_LoadManager::register_load_monitor: "
+ "Unable to schedule timer.\n"));
+
+ (void) this->monitor_map_.unbind (the_location);
+
+ ACE_THROW (CORBA::INTERNAL ());
+ }
+ }
+ else if (result == 1)
+ {
+ ACE_THROW (CosLoadBalancing::MonitorAlreadyPresent ());
+ }
+ else if (result != 0)
+ {
+ if (TAO_debug_level > 0)
+ ACE_ERROR ((LM_ERROR,
+ "TAO_LB_LoadManager::register_load_monitor: "
+ "Unable to register load monitor.\n"));
+
+ ACE_THROW (CORBA::INTERNAL ());
+ }
+}
+
+CosLoadBalancing::LoadMonitor_ptr
+TAO_LB_LoadManager::get_load_monitor (
+ const PortableGroup::Location & the_location
+ ACE_ENV_ARG_DECL)
+ ACE_THROW_SPEC ((CORBA::SystemException,
+ CosLoadBalancing::LocationNotFound))
+{
+ ACE_GUARD_RETURN (TAO_SYNCH_MUTEX,
+ guard,
+ this->monitor_lock_,
+ CosLoadBalancing::LoadMonitor::_nil ());
+
+ TAO_LB_MonitorMap::ENTRY * entry;
+ if (this->monitor_map_.find (the_location, entry) == 0)
+ {
+ return
+ CosLoadBalancing::LoadMonitor::_duplicate (entry->int_id_.in ());
+ }
+
+ ACE_THROW_RETURN (CosLoadBalancing::LocationNotFound (),
+ CosLoadBalancing::LoadMonitor::_nil ());
+}
+
+void
+TAO_LB_LoadManager::remove_load_monitor (
+ const PortableGroup::Location & the_location
+ ACE_ENV_ARG_DECL)
+ ACE_THROW_SPEC ((CORBA::SystemException,
+ CosLoadBalancing::LocationNotFound))
+{
+ ACE_GUARD (TAO_SYNCH_MUTEX,
+ guard,
+ this->monitor_lock_);
+
+ if (this->monitor_map_.unbind (the_location) != 0)
+ ACE_THROW (CosLoadBalancing::LocationNotFound ());
+
+ // If no load monitors are registered with the load balancer than
+ // shutdown the "pull monitoring."
+ if (this->timer_id_ != -1
+ && this->monitor_map_.current_size () == 0)
+ {
+ if (this->reactor_->cancel_timer (this->timer_id_) == 0)
+ {
+ if (TAO_debug_level > 0)
+ ACE_ERROR ((LM_ERROR,
+ "TAO_LB_LoadManager::remove_load_monitor: "
+ "Unable to cancel timer.\n"));
+
+ ACE_THROW (CORBA::INTERNAL ());
+ }
+
+ this->timer_id_ = -1;
+ }
+}
+
+void
+TAO_LB_LoadManager::set_default_properties (
+ const PortableGroup::Properties & props
+ ACE_ENV_ARG_DECL)
+ ACE_THROW_SPEC ((CORBA::SystemException,
+ PortableGroup::InvalidProperty,
+ PortableGroup::UnsupportedProperty))
+{
+ PortableGroup::Properties new_props (props);
+ this->preprocess_properties (new_props
+ ACE_ENV_ARG_PARAMETER);
+ ACE_CHECK;
+
+ this->property_manager_.set_default_properties (new_props
+ ACE_ENV_ARG_PARAMETER);
+}
+
+PortableGroup::Properties *
+TAO_LB_LoadManager::get_default_properties (
+ ACE_ENV_SINGLE_ARG_DECL)
+ ACE_THROW_SPEC ((CORBA::SystemException))
+{
+ return
+ this->property_manager_.get_default_properties (
+ ACE_ENV_SINGLE_ARG_PARAMETER);
+}
+
+void
+TAO_LB_LoadManager::remove_default_properties (
+ const PortableGroup::Properties & props
+ ACE_ENV_ARG_DECL)
+ ACE_THROW_SPEC ((CORBA::SystemException,
+ PortableGroup::InvalidProperty,
+ PortableGroup::UnsupportedProperty))
+{
+ this->property_manager_.remove_default_properties (props
+ ACE_ENV_ARG_PARAMETER);
+}
+
+void
+TAO_LB_LoadManager::set_type_properties (
+ const char *type_id,
+ const PortableGroup::Properties & overrides
+ ACE_ENV_ARG_DECL)
+ ACE_THROW_SPEC ((CORBA::SystemException,
+ PortableGroup::InvalidProperty,
+ PortableGroup::UnsupportedProperty))
+{
+ PortableGroup::Properties new_overrides (overrides);
+ this->preprocess_properties (new_overrides
+ ACE_ENV_ARG_PARAMETER);
+ ACE_CHECK;
+
+ this->property_manager_.set_type_properties (type_id,
+ new_overrides
+ ACE_ENV_ARG_PARAMETER);
+}
+
+PortableGroup::Properties *
+TAO_LB_LoadManager::get_type_properties (
+ const char *type_id
+ ACE_ENV_ARG_DECL)
+ ACE_THROW_SPEC ((CORBA::SystemException))
+{
+ return
+ this->property_manager_.get_type_properties (type_id
+ ACE_ENV_ARG_PARAMETER);
+}
+
+void
+TAO_LB_LoadManager::remove_type_properties (
+ const char *type_id,
+ const PortableGroup::Properties & props
+ ACE_ENV_ARG_DECL)
+ ACE_THROW_SPEC ((CORBA::SystemException,
+ PortableGroup::InvalidProperty,
+ PortableGroup::UnsupportedProperty))
+{
+ this->property_manager_.remove_type_properties (type_id,
+ props
+ ACE_ENV_ARG_PARAMETER);
+}
+
+void
+TAO_LB_LoadManager::set_properties_dynamically (
+ PortableGroup::ObjectGroup_ptr object_group,
+ const PortableGroup::Properties & overrides
+ ACE_ENV_ARG_DECL)
+ ACE_THROW_SPEC ((CORBA::SystemException,
+ PortableGroup::ObjectGroupNotFound,
+ PortableGroup::InvalidProperty,
+ PortableGroup::UnsupportedProperty))
+{
+ PortableGroup::Properties new_overrides (overrides);
+ this->preprocess_properties (new_overrides
+ ACE_ENV_ARG_PARAMETER);
+ ACE_CHECK;
+
+ this->property_manager_.set_properties_dynamically (object_group,
+ new_overrides
+ ACE_ENV_ARG_PARAMETER);
+}
+
+PortableGroup::Properties *
+TAO_LB_LoadManager::get_properties (
+ PortableGroup::ObjectGroup_ptr object_group
+ ACE_ENV_ARG_DECL)
+ ACE_THROW_SPEC ((CORBA::SystemException,
+ PortableGroup::ObjectGroupNotFound))
+{
+ return
+ this->property_manager_.get_properties (object_group
+ ACE_ENV_ARG_PARAMETER);
+}
+
+PortableGroup::ObjectGroup_ptr
+TAO_LB_LoadManager::create_member (
+ PortableGroup::ObjectGroup_ptr object_group,
+ const PortableGroup::Location & the_location,
+ const char * type_id,
+ const PortableGroup::Criteria & the_criteria
+ ACE_ENV_ARG_DECL)
+ ACE_THROW_SPEC ((CORBA::SystemException,
+ PortableGroup::ObjectGroupNotFound,
+ PortableGroup::MemberAlreadyPresent,
+ PortableGroup::NoFactory,
+ PortableGroup::ObjectNotCreated,
+ PortableGroup::InvalidCriteria,
+ PortableGroup::CannotMeetCriteria))
+{
+ return
+ this->object_group_manager_.create_member (object_group,
+ the_location,
+ type_id,
+ the_criteria
+ ACE_ENV_ARG_PARAMETER);
+}
+
+PortableGroup::ObjectGroup_ptr
+TAO_LB_LoadManager::add_member (
+ PortableGroup::ObjectGroup_ptr object_group,
+ const PortableGroup::Location & the_location,
+ CORBA::Object_ptr member
+ ACE_ENV_ARG_DECL)
+ ACE_THROW_SPEC ((CORBA::SystemException,
+ PortableGroup::ObjectGroupNotFound,
+ PortableGroup::MemberAlreadyPresent,
+ PortableGroup::ObjectNotAdded))
+{
+ return
+ this->object_group_manager_.add_member (object_group,
+ the_location,
+ member
+ ACE_ENV_ARG_PARAMETER);
+}
+
+PortableGroup::ObjectGroup_ptr
+TAO_LB_LoadManager::remove_member (
+ PortableGroup::ObjectGroup_ptr object_group,
+ const PortableGroup::Location & the_location
+ ACE_ENV_ARG_DECL)
+ ACE_THROW_SPEC ((CORBA::SystemException,
+ PortableGroup::ObjectGroupNotFound,
+ PortableGroup::MemberNotFound))
+{
+ return
+ this->object_group_manager_.remove_member (object_group,
+ the_location
+ ACE_ENV_ARG_PARAMETER);
+}
+
+PortableGroup::Locations *
+TAO_LB_LoadManager::locations_of_members (
+ PortableGroup::ObjectGroup_ptr object_group
+ ACE_ENV_ARG_DECL)
+ ACE_THROW_SPEC ((CORBA::SystemException,
+ PortableGroup::ObjectGroupNotFound))
+{
+ return
+ this->object_group_manager_.locations_of_members (object_group
+ ACE_ENV_ARG_PARAMETER);
+}
+
+PortableGroup::ObjectGroups *
+TAO_LB_LoadManager::groups_at_location (
+ const PortableGroup::Location & the_location
+ ACE_ENV_ARG_DECL)
+ ACE_THROW_SPEC ((CORBA::SystemException))
+{
+ return
+ this->object_group_manager_.groups_at_location (the_location
+ ACE_ENV_ARG_PARAMETER);
+}
+
+PortableGroup::ObjectGroupId
+TAO_LB_LoadManager::get_object_group_id (
+ PortableGroup::ObjectGroup_ptr object_group
+ ACE_ENV_ARG_DECL)
+ ACE_THROW_SPEC ((CORBA::SystemException,
+ PortableGroup::ObjectGroupNotFound))
+{
+ return
+ this->object_group_manager_.get_object_group_id (object_group
+ ACE_ENV_ARG_PARAMETER);
+}
+
+PortableGroup::ObjectGroup_ptr
+TAO_LB_LoadManager::get_object_group_ref (
+ PortableGroup::ObjectGroup_ptr object_group
+ ACE_ENV_ARG_DECL)
+ ACE_THROW_SPEC ((CORBA::SystemException,
+ PortableGroup::ObjectGroupNotFound))
+{
+ return
+ this->object_group_manager_.get_object_group_ref (object_group
+ ACE_ENV_ARG_PARAMETER);
+}
+
+PortableGroup::ObjectGroup_ptr TAO_LB_LoadManager::get_object_group_ref_from_id (
+ PortableGroup::ObjectGroupId group_id
+ ACE_ENV_ARG_DECL)
+ ACE_THROW_SPEC((
+ CORBA::SystemException,
+ PortableGroup::ObjectGroupNotFound))
+{
+ return this->object_group_manager_.get_object_group_ref_from_id (
+ group_id
+ ACE_ENV_ARG_PARAMETER);
+}
+
+CORBA::Object_ptr
+TAO_LB_LoadManager::get_member_ref (
+ PortableGroup::ObjectGroup_ptr object_group,
+ const PortableGroup::Location & the_location
+ ACE_ENV_ARG_DECL)
+ ACE_THROW_SPEC ((CORBA::SystemException,
+ PortableGroup::ObjectGroupNotFound,
+ PortableGroup::MemberNotFound))
+{
+ return
+ this->object_group_manager_.get_member_ref (object_group,
+ the_location
+ ACE_ENV_ARG_PARAMETER);
+}
+
+CORBA::Object_ptr
+TAO_LB_LoadManager::create_object (
+ const char * type_id,
+ const PortableGroup::Criteria & the_criteria,
+ PortableGroup::GenericFactory::FactoryCreationId_out
+ factory_creation_id
+ ACE_ENV_ARG_DECL)
+ ACE_THROW_SPEC ((CORBA::SystemException,
+ PortableGroup::NoFactory,
+ PortableGroup::ObjectNotCreated,
+ PortableGroup::InvalidCriteria,
+ PortableGroup::InvalidProperty,
+ PortableGroup::CannotMeetCriteria))
+{
+// this->init (ACE_ENV_SINGLE_ARG_PARAMETER);
+// ACE_CHECK_RETURN (CORBA::Object::_nil ());
+
+
+ PortableGroup::Criteria new_criteria (the_criteria);
+ this->preprocess_properties (new_criteria
+ ACE_ENV_ARG_PARAMETER);
+ ACE_CHECK_RETURN (CORBA::Object::_nil ());
+
+ CORBA::Object_ptr obj =
+ this->generic_factory_.create_object (type_id,
+ new_criteria,
+ factory_creation_id
+ ACE_ENV_ARG_PARAMETER);
+ ACE_CHECK_RETURN (CORBA::Object::_nil ());
+
+
+ return obj;
+}
+
+#if 0
+void
+TAO_LB_LoadManager::process_criteria (
+ const PortableGroup::Criteria & the_criteria
+ ACE_ENV_ARG_DECL)
+{
+ // List of invalid criteria. If this list has a length greater than
+ // zero, then the PortableGroup::InvalidCriteria exception will
+ // be thrown.
+ PortableGroup::Criteria invalid_criteria;
+
+ int found_factory = 0; // If factory was found in the_criteria, then
+ // set to 1.
+
+ // Parse the criteria.
+ CORBA::ULong criteria_count = the_criteria.length ();
+ for (CORBA::ULong i = 0; i < criteria_size; ++i)
+ {
+ CORBA::UShort initial_number_replicas = 0;
+ PortableGroup::FactoryInfos factory_infos;
+
+ // Obtain the InitialNumberMembers from the_criteria.
+ if (this->get_initial_number_replicas (type_id,
+ the_criteria[i],
+ initial_number_replicas) != 0)
+ {
+ CORBA::ULong len = invalid_criteria.length ();
+ invalid_criteria.length (len + 1);
+ invalid_criteria[len] = the_criteria[i];
+ }
+
+ // Obtain the FactoryInfos from the_criteria. This method also
+ // ensures that GenericFactories at different locations are used.
+ else if (this->get_factory_infos (type_id,
+ the_criteria[i],
+ factory_infos) == 0)
+ found_factory = 1;
+
+ // Unknown property
+ else
+ ACE_THROW (PortableGroup::InvalidProperty (the_criteria[i].nam,
+ the_criteria[i].val));
+ }
+
+ if (invalid_criteria.length () != 0)
+ ACE_THROW (PortableGroup::InvalidCriteria (invalid_criteria));
+
+ if (found_factory == 0)
+ ACE_THROW (PortableGroup::NoFactory ());
+}
+#endif /* 0 */
+
+void
+TAO_LB_LoadManager::delete_object (
+ const PortableGroup::GenericFactory::FactoryCreationId &
+ factory_creation_id
+ ACE_ENV_ARG_DECL)
+ ACE_THROW_SPEC ((CORBA::SystemException,
+ PortableGroup::ObjectNotFound))
+{
+ this->generic_factory_.delete_object (factory_creation_id
+ ACE_ENV_ARG_PARAMETER);
+}
+
+CORBA::Object_ptr
+TAO_LB_LoadManager::next_member (const PortableServer::ObjectId & oid
+ ACE_ENV_ARG_DECL)
+{
+ PortableGroup::ObjectGroup_var object_group =
+ this->object_group_manager_.object_group (oid);
+
+ if (CORBA::is_nil (object_group.in ()))
+ ACE_THROW_RETURN (CORBA::OBJECT_NOT_EXIST (),
+ CORBA::Object::_nil ());
+
+ PortableGroup::Properties_var properties =
+ this->get_properties (object_group.in ()
+ ACE_ENV_ARG_PARAMETER);
+ ACE_CHECK_RETURN (CORBA::Object::_nil ());
+
+ // Prefer custom load balancing strategies over built-in ones.
+ PortableGroup::Value value;
+ CosLoadBalancing::Strategy_ptr strategy;
+
+ if ((TAO_PG::get_property_value (this->built_in_balancing_strategy_name_,
+ properties.in (),
+ value)
+ || TAO_PG::get_property_value (this->custom_balancing_strategy_name_,
+ properties.in (),
+ value))
+ && (value >>= strategy)
+ && !CORBA::is_nil (strategy))
+ {
+ return strategy->next_member (object_group.in (),
+ this->lm_ref_.in ()
+ ACE_ENV_ARG_PARAMETER);
+ }
+
+ ACE_THROW_RETURN (CORBA::OBJECT_NOT_EXIST (),
+ CORBA::Object::_nil ());
+}
+
+void
+TAO_LB_LoadManager::init (ACE_Reactor * reactor,
+ CORBA::ORB_ptr orb,
+ PortableServer::POA_ptr root_poa
+ ACE_ENV_ARG_DECL)
+{
+ ACE_ASSERT (!CORBA::is_nil (orb));
+ ACE_ASSERT (!CORBA::is_nil (root_poa));
+
+ ACE_GUARD (TAO_SYNCH_MUTEX,
+ guard,
+ this->lock_);
+
+ if (CORBA::is_nil (this->poa_.in ()))
+ {
+ // Create a new transient servant manager object in the child
+ // POA.
+ PortableServer::ServantManager_ptr tmp;
+ ACE_NEW_THROW_EX (tmp,
+ TAO_LB_MemberLocator (this),
+ CORBA::NO_MEMORY (
+ CORBA::SystemException::_tao_minor_code (
+ TAO::VMCID,
+ ENOMEM),
+ CORBA::COMPLETED_NO));
+ ACE_CHECK;
+
+ PortableServer::ServantManager_var member_locator = tmp;
+
+ // Create the appropriate RequestProcessingPolicy
+ // (USE_SERVANT_MANAGER) and ServantRetentionPolicy (NON_RETAIN)
+ // for a ServantLocator.
+ PortableServer::RequestProcessingPolicy_var request =
+ root_poa->create_request_processing_policy (
+ PortableServer::USE_SERVANT_MANAGER
+ ACE_ENV_ARG_PARAMETER);
+ ACE_CHECK;
+
+ PortableServer::ServantRetentionPolicy_var retention =
+ root_poa->create_servant_retention_policy (
+ PortableServer::NON_RETAIN
+ ACE_ENV_ARG_PARAMETER);
+ ACE_CHECK;
+
+ // Create the PolicyList containing the policies necessary for
+ // the POA to support ServantLocators.
+ CORBA::PolicyList policy_list;
+ policy_list.length (2);
+ policy_list[0] =
+ PortableServer::RequestProcessingPolicy::_duplicate (
+ request.in ());
+ policy_list[1] =
+ PortableServer::ServantRetentionPolicy::_duplicate (
+ retention.in ());
+
+ // Create the child POA with the above ServantManager policies.
+ // The ServantManager will be the MemberLocator.
+ PortableServer::POAManager_var poa_manager =
+ root_poa->the_POAManager (ACE_ENV_SINGLE_ARG_PARAMETER);
+ ACE_CHECK;
+
+ // The child POA's name will consist of a string that includes
+ // the current time in milliseconds in hexidecimal format (only
+ // four bytes will be used). This is an attempt to prevent
+ // different load manager servants within the same ORB from
+ // using the same POA.
+ const ACE_Time_Value tv = ACE_OS::gettimeofday ();
+ const CORBA::Long time =
+ static_cast<CORBA::Long> (tv.msec ()); // Time in milliseconds.
+
+ char poa_name[] = "TAO_LB_LoadManager_POA - 0xZZZZZZZZ";
+ char * astr =
+ poa_name
+ + sizeof (poa_name)
+ - 9 /* 8 + 1 */;
+
+ // Overwrite the last 8 characters in the POA name with the
+ // hexadecimal representation of the time in milliseconds.
+ ACE_OS::sprintf (astr, "%x", time);
+
+ this->poa_ = root_poa->create_POA (poa_name,
+ poa_manager.in (),
+ policy_list
+ ACE_ENV_ARG_PARAMETER);
+ ACE_CHECK;
+
+ request->destroy (ACE_ENV_SINGLE_ARG_PARAMETER);
+ ACE_CHECK;
+
+ retention->destroy (ACE_ENV_SINGLE_ARG_PARAMETER);
+ ACE_CHECK;
+
+ // Now set the MemberLocator as the child POA's Servant
+ // Manager.
+ this->poa_->set_servant_manager (member_locator.in ()
+ ACE_ENV_ARG_PARAMETER);
+ ACE_CHECK;
+
+ this->object_group_manager_.poa (this->poa_.in ());
+ this->generic_factory_.poa (this->poa_.in ());
+
+ // Activate the child POA.
+ poa_manager->activate (ACE_ENV_SINGLE_ARG_PARAMETER);
+ ACE_CHECK;
+
+ this->reactor_ = reactor;
+ this->root_poa_ = PortableServer::POA::_duplicate (root_poa);
+ }
+
+ if (CORBA::is_nil (this->lm_ref_.in ()))
+ {
+ this->lm_ref_ = this->_this (ACE_ENV_SINGLE_ARG_PARAMETER);
+ ACE_CHECK;
+
+ orb->register_initial_reference ("LoadManager",
+ this->lm_ref_.in ()
+ ACE_ENV_ARG_PARAMETER);
+ ACE_CHECK;
+ }
+
+ if (CORBA::is_nil (this->load_alert_handler_.in ()))
+ {
+ TAO_LB_LoadAlert_Handler * handler;
+ ACE_NEW_THROW_EX (handler,
+ TAO_LB_LoadAlert_Handler,
+ CORBA::NO_MEMORY (
+ CORBA::SystemException::_tao_minor_code (
+ TAO::VMCID,
+ ENOMEM),
+ CORBA::COMPLETED_NO));
+ ACE_CHECK;
+
+ PortableServer::ServantBase_var safe_handler = handler;
+
+ this->load_alert_handler_ =
+ handler->_this (ACE_ENV_SINGLE_ARG_PARAMETER);
+ ACE_CHECK;
+ }
+
+ this->built_in_balancing_strategy_info_name_.length (1);
+ this->built_in_balancing_strategy_info_name_[0].id =
+ CORBA::string_dup ("org.omg.CosLoadBalancing.StrategyInfo");
+
+ this->built_in_balancing_strategy_name_.length (1);
+ this->built_in_balancing_strategy_name_[0].id =
+ CORBA::string_dup ("org.omg.CosLoadBalancing.Strategy");
+
+ this->custom_balancing_strategy_name_.length (1);
+ this->custom_balancing_strategy_name_[0].id =
+ CORBA::string_dup ("org.omg.CosLoadBalancing.CustomStrategy");
+}
+
+void
+TAO_LB_LoadManager::preprocess_properties (PortableGroup::Properties & props
+ ACE_ENV_ARG_DECL)
+{
+ // @@ This is slow. Optimize this code.
+
+ const CORBA::ULong len = props.length ();
+ for (CORBA::ULong i = 0; i < len; ++i)
+ {
+ PortableGroup::Property & property = props[i];
+ if (property.nam == this->custom_balancing_strategy_name_)
+ {
+ CosLoadBalancing::CustomStrategy_ptr strategy;
+ if (!(property.val >>= strategy)
+ || CORBA::is_nil (strategy))
+ ACE_THROW (PortableGroup::InvalidProperty (property.nam,
+ property.val));
+ }
+
+ else if (property.nam == this->built_in_balancing_strategy_info_name_)
+ {
+ CosLoadBalancing::StrategyInfo * info;
+
+ if (property.val >>= info)
+ {
+ // Convert the property from a "StrategyInfo" property
+ // to a "Strategy" property.
+
+ CosLoadBalancing::Strategy_var strategy =
+ this->make_strategy (info
+ ACE_ENV_ARG_PARAMETER);
+ ACE_CHECK;
+
+ if (!CORBA::is_nil (strategy.in ()))
+ {
+ property.nam = this->built_in_balancing_strategy_name_;
+
+ property.val <<= strategy.in ();
+ }
+ else
+ ACE_THROW (PortableGroup::InvalidProperty (property.nam,
+ property.val));
+ }
+ else
+ ACE_THROW (PortableGroup::InvalidProperty (property.nam,
+ property.val));
+ }
+ else if (property.nam == this->built_in_balancing_strategy_name_)
+ {
+ // It is illegal to set the Strategy property externally.
+ ACE_THROW (PortableGroup::InvalidProperty (property.nam,
+ property.val));
+ }
+ }
+}
+
+CosLoadBalancing::Strategy_ptr
+TAO_LB_LoadManager::make_strategy (CosLoadBalancing::StrategyInfo * info
+ ACE_ENV_ARG_DECL)
+{
+ /**
+ * @todo We need a strategy factory. This is just too messy.
+ */
+
+ if (ACE_OS::strcmp (info->name.in (), "RoundRobin") == 0)
+ {
+ {
+ ACE_GUARD_RETURN (TAO_SYNCH_MUTEX,
+ monitor,
+ this->lock_,
+ CosLoadBalancing::Strategy::_nil ());
+
+ if (CORBA::is_nil (this->round_robin_.in ()))
+ {
+ TAO_LB_RoundRobin * rr_servant;
+ ACE_NEW_THROW_EX (rr_servant,
+ TAO_LB_RoundRobin (this->root_poa_.in ()),
+ CORBA::NO_MEMORY ());
+ ACE_CHECK_RETURN (CosLoadBalancing::Strategy::_nil ());
+
+ PortableServer::ServantBase_var s = rr_servant;
+
+ this->round_robin_ =
+ rr_servant->_this (ACE_ENV_SINGLE_ARG_PARAMETER);
+ ACE_CHECK_RETURN (CosLoadBalancing::Strategy::_nil ());
+ }
+ }
+
+ return CosLoadBalancing::Strategy::_duplicate (this->round_robin_.in ());
+ }
+
+ else if (ACE_OS::strcmp (info->name.in (), "Random") == 0)
+ {
+ {
+ ACE_GUARD_RETURN (TAO_SYNCH_MUTEX,
+ monitor,
+ this->lock_,
+ CosLoadBalancing::Strategy::_nil ());
+
+ if (CORBA::is_nil (this->random_.in ()))
+ {
+ TAO_LB_Random * rnd_servant;
+ ACE_NEW_THROW_EX (rnd_servant,
+ TAO_LB_Random (this->root_poa_.in ()),
+ CORBA::NO_MEMORY ());
+ ACE_CHECK_RETURN (CosLoadBalancing::Strategy::_nil ());
+
+ PortableServer::ServantBase_var s = rnd_servant;
+
+ this->random_ =
+ rnd_servant->_this (ACE_ENV_SINGLE_ARG_PARAMETER);
+ ACE_CHECK_RETURN (CosLoadBalancing::Strategy::_nil ());
+ }
+ }
+
+ return CosLoadBalancing::Strategy::_duplicate (this->random_.in ());
+ }
+
+ else if (ACE_OS::strcmp (info->name.in (), "LeastLoaded") == 0)
+ {
+ // If no LeastLoaded properties have been set, just use the
+ // default/cached LeastLoaded instance. Otherwise create and
+ // return a new LeastLoaded instance with the appropriate
+ // properties.
+
+ if (info->props.length () == 0)
+ {
+ {
+ ACE_GUARD_RETURN (TAO_SYNCH_MUTEX,
+ monitor,
+ this->lock_,
+ CosLoadBalancing::Strategy::_nil ());
+
+ if (CORBA::is_nil (this->least_loaded_.in ()))
+ {
+ TAO_LB_LeastLoaded * ll_servant;
+ ACE_NEW_THROW_EX (ll_servant,
+ TAO_LB_LeastLoaded (this->root_poa_.in ()),
+ CORBA::NO_MEMORY ());
+ ACE_CHECK_RETURN (CosLoadBalancing::Strategy::_nil ());
+
+ PortableServer::ServantBase_var s = ll_servant;
+
+ this->least_loaded_ =
+ ll_servant->_this (ACE_ENV_SINGLE_ARG_PARAMETER);
+ ACE_CHECK_RETURN (CosLoadBalancing::Strategy::_nil ());
+ }
+ }
+
+ return
+ CosLoadBalancing::Strategy::_duplicate (this->least_loaded_.in ());
+ }
+ else
+ {
+ TAO_LB_LeastLoaded * ll_servant;
+ ACE_NEW_THROW_EX (ll_servant,
+ TAO_LB_LeastLoaded (this->root_poa_.in ()),
+ CORBA::NO_MEMORY ());
+ ACE_CHECK_RETURN (CosLoadBalancing::Strategy::_nil ());
+
+ PortableServer::ServantBase_var s = ll_servant;
+
+ ll_servant->init (info->props
+ ACE_ENV_ARG_PARAMETER);
+ ACE_CHECK_RETURN (CosLoadBalancing::Strategy::_nil ());
+
+ return ll_servant->_this (ACE_ENV_SINGLE_ARG_PARAMETER);
+ }
+ }
+ else if (ACE_OS::strcmp (info->name.in (), "LoadMinimum") == 0)
+ {
+
+ if (info->props.length () == 0)
+ {
+ {
+ ACE_GUARD_RETURN (TAO_SYNCH_MUTEX,
+ monitor,
+ this->lock_,
+ CosLoadBalancing::Strategy::_nil ());
+
+ if (CORBA::is_nil (this->load_minimum_.in ()))
+ {
+ TAO_LB_LoadMinimum * lm_servant;
+ ACE_NEW_THROW_EX (lm_servant,
+ TAO_LB_LoadMinimum (this->root_poa_.in ()),
+ CORBA::NO_MEMORY ());
+ ACE_CHECK_RETURN (CosLoadBalancing::Strategy::_nil ());
+
+ PortableServer::ServantBase_var s = lm_servant;
+
+ this->load_minimum_ =
+ lm_servant->_this (ACE_ENV_SINGLE_ARG_PARAMETER);
+ ACE_CHECK_RETURN (CosLoadBalancing::Strategy::_nil ());
+ }
+ }
+
+ return
+ CosLoadBalancing::Strategy::_duplicate (this->load_minimum_.in ());
+ }
+ else
+ {
+ TAO_LB_LoadMinimum * lm_servant;
+ ACE_NEW_THROW_EX (lm_servant,
+ TAO_LB_LoadMinimum (this->root_poa_.in ()),
+ CORBA::NO_MEMORY ());
+ ACE_CHECK_RETURN (CosLoadBalancing::Strategy::_nil ());
+
+ PortableServer::ServantBase_var s = lm_servant;
+
+ lm_servant->init (info->props
+ ACE_ENV_ARG_PARAMETER);
+ ACE_CHECK_RETURN (CosLoadBalancing::Strategy::_nil ());
+
+ return lm_servant->_this (ACE_ENV_SINGLE_ARG_PARAMETER);
+ }
+ }
+ else if (ACE_OS::strcmp (info->name.in (), "LoadAverage") == 0)
+ {
+
+ if (info->props.length () == 0)
+ {
+ {
+ ACE_GUARD_RETURN (TAO_SYNCH_MUTEX,
+ monitor,
+ this->lock_,
+ CosLoadBalancing::Strategy::_nil ());
+
+ if (CORBA::is_nil (this->load_average_.in ()))
+ {
+ TAO_LB_LoadAverage * la_servant;
+ ACE_NEW_THROW_EX (la_servant,
+ TAO_LB_LoadAverage (this->root_poa_.in ()),
+ CORBA::NO_MEMORY ());
+ ACE_CHECK_RETURN (CosLoadBalancing::Strategy::_nil ());
+
+ PortableServer::ServantBase_var s = la_servant;
+
+ this->load_average_ =
+ la_servant->_this (ACE_ENV_SINGLE_ARG_PARAMETER);
+ ACE_CHECK_RETURN (CosLoadBalancing::Strategy::_nil ());
+ }
+ }
+
+ return
+ CosLoadBalancing::Strategy::_duplicate (this->load_average_.in ());
+ }
+ else
+ {
+ TAO_LB_LoadAverage * la_servant;
+ ACE_NEW_THROW_EX (la_servant,
+ TAO_LB_LoadAverage (this->root_poa_.in ()),
+ CORBA::NO_MEMORY ());
+ ACE_CHECK_RETURN (CosLoadBalancing::Strategy::_nil ());
+
+ PortableServer::ServantBase_var s = la_servant;
+
+ la_servant->init (info->props
+ ACE_ENV_ARG_PARAMETER);
+ ACE_CHECK_RETURN (CosLoadBalancing::Strategy::_nil ());
+
+ return la_servant->_this (ACE_ENV_SINGLE_ARG_PARAMETER);
+ }
+ }
+ return CosLoadBalancing::Strategy::_nil ();
+}
+
+// void
+// TAO_LB_LoadManager::update_strategy ()
+// {
+// }
+
+// void
+// TAO_LB_LoadManager::deactivate_strategy (ACE_ENV_ARG_DECL)
+// {
+// PortableServer::ObjectId_var oid =
+// this->poa_->reference_to_id (
+// this->poa_->deactivate_object ();
+// }
+
+TAO_END_VERSIONED_NAMESPACE_DECL
diff --git a/TAO/orbsvcs/orbsvcs/LoadBalancing/LB_LoadManager.h b/TAO/orbsvcs/orbsvcs/LoadBalancing/LB_LoadManager.h
new file mode 100644
index 00000000000..42ce6c006c4
--- /dev/null
+++ b/TAO/orbsvcs/orbsvcs/LoadBalancing/LB_LoadManager.h
@@ -0,0 +1,519 @@
+// -*- C++ -*-
+
+//=============================================================================
+/**
+ * @file LB_LoadManager.h
+ *
+ * $Id$
+ *
+ * @author Ossama Othman <ossama@uci.edu>
+ */
+//=============================================================================
+
+
+#ifndef TAO_LB_LOAD_MANAGER_H
+#define TAO_LB_LOAD_MANAGER_H
+
+#include /**/ "ace/pre.h"
+
+#include "orbsvcs/CosLoadBalancingS.h"
+
+#if !defined (ACE_LACKS_PRAGMA_ONCE)
+#pragma once
+#endif /* ACE_LACKS_PRAGMA_ONCE */
+
+
+#include "orbsvcs/LoadBalancing/LB_LoadAlertMap.h"
+#include "orbsvcs/LoadBalancing/LB_MonitorMap.h"
+#include "orbsvcs/LoadBalancing/LB_LoadListMap.h"
+#include "orbsvcs/LoadBalancing/LB_Pull_Handler.h"
+
+#include "orbsvcs/PortableGroupC.h"
+
+#include "orbsvcs/PortableGroup/PG_PropertyManager.h"
+#include "orbsvcs/PortableGroup/PG_GenericFactory.h"
+#include "orbsvcs/PortableGroup/PG_ObjectGroupManager.h"
+
+TAO_BEGIN_VERSIONED_NAMESPACE_DECL
+
+class TAO_LoadBalancing_Export TAO_LB_LoadManager
+ : public virtual POA_CosLoadBalancing::LoadManager
+{
+public:
+
+ /// Constructor.
+ TAO_LB_LoadManager (void);
+
+ /**
+ * @name CosLoadBalancing::LoadManager Methods
+ *
+ * Methods required by the CosLoadBalancing::LoadManager interface.
+ */
+ //@{
+
+ /// For the PUSH load monitoring style.
+ virtual void push_loads (const PortableGroup::Location & the_location,
+ const CosLoadBalancing::LoadList & loads
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS)
+ ACE_THROW_SPEC ((CORBA::SystemException));
+
+ /// Return the raw loads at the given location.
+ virtual CosLoadBalancing::LoadList * get_loads (
+ const PortableGroup::Location & the_location
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS)
+ ACE_THROW_SPEC ((CORBA::SystemException,
+ CosLoadBalancing::LocationNotFound));
+
+ /// Inform member at given location of load alert condition.
+ virtual void enable_alert (const PortableGroup::Location & the_location
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS)
+ ACE_THROW_SPEC ((CosLoadBalancing::LoadAlertNotFound));
+
+ /// Inform member at given location that load alert condition has
+ /// passed.
+ virtual void disable_alert (const PortableGroup::Location & the_location
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS)
+ ACE_THROW_SPEC ((CosLoadBalancing::LoadAlertNotFound));
+
+ /// Register a LoadAlert object for the member at the given
+ /// location.
+ virtual void register_load_alert (
+ const PortableGroup::Location & the_location,
+ CosLoadBalancing::LoadAlert_ptr load_alert
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS)
+ ACE_THROW_SPEC ((CORBA::SystemException,
+ CosLoadBalancing::LoadAlertAlreadyPresent,
+ CosLoadBalancing::LoadAlertNotAdded));
+
+ /// Retrieve the LoadAlert object for the member at the given
+ /// location.
+ virtual CosLoadBalancing::LoadAlert_ptr get_load_alert (
+ const PortableGroup::Location & the_location
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS)
+ ACE_THROW_SPEC ((CORBA::SystemException,
+ CosLoadBalancing::LoadAlertNotFound));
+
+ /// Remove (de-register) the LoadAlert object for the member at the
+ /// given location.
+ virtual void remove_load_alert (const PortableGroup::Location & the_location
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS)
+ ACE_THROW_SPEC ((CORBA::SystemException,
+ CosLoadBalancing::LoadAlertNotFound));
+
+ /// Register a load monitor with the load balancer.
+ virtual void register_load_monitor (
+ const PortableGroup::Location & the_location,
+ CosLoadBalancing::LoadMonitor_ptr load_monitor
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS)
+ ACE_THROW_SPEC ((CORBA::SystemException,
+ CosLoadBalancing::MonitorAlreadyPresent));
+
+ /// Return a reference to the load monitor at the given location.
+ virtual CosLoadBalancing::LoadMonitor_ptr get_load_monitor (
+ const PortableGroup::Location & the_location
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS)
+ ACE_THROW_SPEC ((CORBA::SystemException,
+ CosLoadBalancing::LocationNotFound));
+
+ /// Remove a load monitor at the given location from the load
+ /// balancer.
+ virtual void remove_load_monitor (
+ const PortableGroup::Location & the_location
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS)
+ ACE_THROW_SPEC ((CORBA::SystemException,
+ CosLoadBalancing::LocationNotFound));
+
+ //@}
+
+ /**
+ * @name PortableGroup::PropertyManager Methods
+ *
+ * Methods required by the PortableGroup::PropertyManager interface.
+ */
+ //@{
+
+ /// Set the default properties to be used by all object groups.
+ virtual void set_default_properties (
+ const PortableGroup::Properties & props
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS)
+ ACE_THROW_SPEC ((CORBA::SystemException,
+ PortableGroup::InvalidProperty,
+ PortableGroup::UnsupportedProperty));
+
+ /// Get the default properties used by all object groups.
+ virtual PortableGroup::Properties * get_default_properties (
+ ACE_ENV_SINGLE_ARG_DECL_WITH_DEFAULTS)
+ ACE_THROW_SPEC ((CORBA::SystemException));
+
+ /// Remove default properties.
+ virtual void remove_default_properties (
+ const PortableGroup::Properties & props
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS)
+ ACE_THROW_SPEC ((CORBA::SystemException,
+ PortableGroup::InvalidProperty,
+ PortableGroup::UnsupportedProperty));
+
+ /// Set properties associated with a given Replica type. These
+ /// properties override the default properties.
+ virtual void set_type_properties (
+ const char * type_id,
+ const PortableGroup::Properties & overrides
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS)
+ ACE_THROW_SPEC ((CORBA::SystemException,
+ PortableGroup::InvalidProperty,
+ PortableGroup::UnsupportedProperty));
+
+ /**
+ * Return the properties associated with a give Replica type. These
+ * properties include the type-specific properties in use, in
+ * addition to the default properties that were not overridden.
+ */
+ virtual PortableGroup::Properties * get_type_properties (
+ const char * type_id
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS)
+ ACE_THROW_SPEC ((CORBA::SystemException));
+
+ /// Remove the given properties associated with the Replica type ID.
+ virtual void remove_type_properties (
+ const char * type_id,
+ const PortableGroup::Properties & props
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS)
+ ACE_THROW_SPEC ((CORBA::SystemException,
+ PortableGroup::InvalidProperty,
+ PortableGroup::UnsupportedProperty));
+
+ /**
+ * Dynamically set the properties associated with a given object
+ * group as the load balancer and replicas are being executed.
+ * These properties override the type-specific and default
+ * properties.
+ */
+ virtual void set_properties_dynamically (
+ PortableGroup::ObjectGroup_ptr object_group,
+ const PortableGroup::Properties & overrides
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS)
+ ACE_THROW_SPEC ((CORBA::SystemException,
+ PortableGroup::ObjectGroupNotFound,
+ PortableGroup::InvalidProperty,
+ PortableGroup::UnsupportedProperty));
+
+ /**
+ * Return the properties currently in use by the given object
+ * group. These properties include those that were set dynamically,
+ * type-specific properties that weren't overridden, properties that
+ * were used when the Replica was created, and default properties
+ * that weren't overridden.
+ */
+ virtual PortableGroup::Properties * get_properties (
+ PortableGroup::ObjectGroup_ptr object_group
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS)
+ ACE_THROW_SPEC ((CORBA::SystemException,
+ PortableGroup::ObjectGroupNotFound));
+
+ //@}
+
+ /**
+ * @name PortableGroup::ObjectGroupManager methods
+ *
+ * Methods required by the PortableGroup::ObjectGroupManager
+ * interface.
+ */
+ //@{
+
+ /// Create a member using the load balancer ObjectGroupManager, and
+ /// add the created object to the ObjectGroup.
+ virtual PortableGroup::ObjectGroup_ptr create_member (
+ PortableGroup::ObjectGroup_ptr object_group,
+ const PortableGroup::Location & the_location,
+ const char * type_id,
+ const PortableGroup::Criteria & the_criteria
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS)
+ ACE_THROW_SPEC ((CORBA::SystemException,
+ PortableGroup::ObjectGroupNotFound,
+ PortableGroup::MemberAlreadyPresent,
+ PortableGroup::NoFactory,
+ PortableGroup::ObjectNotCreated,
+ PortableGroup::InvalidCriteria,
+ PortableGroup::CannotMeetCriteria));
+
+ /// Add an existing object to the ObjectGroup.
+ virtual PortableGroup::ObjectGroup_ptr add_member (
+ PortableGroup::ObjectGroup_ptr object_group,
+ const PortableGroup::Location & the_location,
+ CORBA::Object_ptr member
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS)
+ ACE_THROW_SPEC ((CORBA::SystemException,
+ PortableGroup::ObjectGroupNotFound,
+ PortableGroup::MemberAlreadyPresent,
+ PortableGroup::ObjectNotAdded));
+
+ /**
+ * Remove an object at a specific location from the given
+ * ObjectGroup. Deletion of application created objects must be
+ * deleted by the application. Objects created by the
+ * infrastructure (load balancer) will be deleted by the
+ * infrastructure.
+ */
+ virtual PortableGroup::ObjectGroup_ptr remove_member (
+ PortableGroup::ObjectGroup_ptr object_group,
+ const PortableGroup::Location & the_location
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS)
+ ACE_THROW_SPEC ((CORBA::SystemException,
+ PortableGroup::ObjectGroupNotFound,
+ PortableGroup::MemberNotFound));
+
+ /// Return the locations of the members in the given ObjectGroup.
+ virtual PortableGroup::Locations * locations_of_members (
+ PortableGroup::ObjectGroup_ptr object_group
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS)
+ ACE_THROW_SPEC ((CORBA::SystemException,
+ PortableGroup::ObjectGroupNotFound));
+
+ /// Return the locations of the members in the given ObjectGroup.
+ virtual PortableGroup::ObjectGroups * groups_at_location (
+ const PortableGroup::Location & the_location
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS)
+ ACE_THROW_SPEC ((CORBA::SystemException));
+
+ /// Return the ObjectGroupId for the given ObjectGroup.
+ virtual PortableGroup::ObjectGroupId get_object_group_id (
+ PortableGroup::ObjectGroup_ptr object_group
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS)
+ ACE_THROW_SPEC ((CORBA::SystemException,
+ PortableGroup::ObjectGroupNotFound));
+
+ /// @note Does this method make sense for load balanced objects?
+ virtual PortableGroup::ObjectGroup_ptr get_object_group_ref (
+ PortableGroup::ObjectGroup_ptr object_group
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS)
+ ACE_THROW_SPEC ((CORBA::SystemException,
+ PortableGroup::ObjectGroupNotFound));
+
+ /// TAO specific method
+ virtual PortableGroup::ObjectGroup_ptr get_object_group_ref_from_id (
+ PortableGroup::ObjectGroupId group_id
+ ACE_ENV_ARG_DECL)
+ ACE_THROW_SPEC((
+ CORBA::SystemException,
+ PortableGroup::ObjectGroupNotFound));
+
+ /// Return the reference corresponding to the Replica of a given
+ /// ObjectGroup at the given location.
+ virtual CORBA::Object_ptr get_member_ref (
+ PortableGroup::ObjectGroup_ptr object_group,
+ const PortableGroup::Location & loc
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS)
+ ACE_THROW_SPEC ((CORBA::SystemException,
+ PortableGroup::ObjectGroupNotFound,
+ PortableGroup::MemberNotFound));
+
+ //@}
+
+ /**
+ * @name PortableGroup::GenericFactory methods
+ *
+ * Methods required by the PortableGroup::GenericFactory interface.
+ */
+ //@{
+
+ /**
+ * Create an object of the specified type that adheres to the
+ * restrictions defined by the provided Criteria. The out
+ * FactoryCreationId parameter may be passed to the delete_object()
+ * method to delete the object.
+ */
+ virtual CORBA::Object_ptr create_object (
+ const char * type_id,
+ const PortableGroup::Criteria & the_criteria,
+ PortableGroup::GenericFactory::FactoryCreationId_out
+ factory_creation_id
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS)
+ ACE_THROW_SPEC ((CORBA::SystemException,
+ PortableGroup::NoFactory,
+ PortableGroup::ObjectNotCreated,
+ PortableGroup::InvalidCriteria,
+ PortableGroup::InvalidProperty,
+ PortableGroup::CannotMeetCriteria));
+
+ /**
+ * Delete the object corresponding to the provided
+ * FactoryCreationId. If the object is actually an ObjectGroup,
+ * then all members within the ObjectGroup will be deleted.
+ * Afterward, the ObjectGroup itself will be deleted.
+ */
+ virtual void delete_object (
+ const PortableGroup::GenericFactory::FactoryCreationId &
+ factory_creation_id
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS)
+ ACE_THROW_SPEC ((CORBA::SystemException,
+ PortableGroup::ObjectNotFound));
+
+ //@}
+
+ /// Return the next member to which client requests will be
+ /// forwarded.
+ /**
+ * Select the next member of the object group corresponding to the
+ * given ObjectId. The object group's load balancing strategy
+ * will be queried for that member.
+ */
+ CORBA::Object_ptr next_member (const PortableServer::ObjectId & oid
+ ACE_ENV_ARG_DECL);
+
+public:
+
+ /// Initialize the load balancer. This will cause a child POA to be
+ /// created with the appropriate policies to support ServantLocators
+ /// (i.e. for the MemberLocator).
+ void init (ACE_Reactor * reactor,
+ CORBA::ORB_ptr orb,
+ PortableServer::POA_ptr root_poa
+ ACE_ENV_ARG_DECL);
+
+protected:
+
+ /// Destructor.
+ /**
+ * Destructor is protected to enforce correct memory management
+ * through reference counting.
+ */
+ ~TAO_LB_LoadManager (void);
+
+private:
+
+ /// Extract the value of the InitialNumberReplicas property from
+ /// the_criteria.
+ int get_initial_number_replicas (
+ const char * type_id,
+ const PortableGroup::Criteria & the_criteria,
+ CORBA::UShort & initial_number_replicas) const;
+
+ /// Extract the value of the Factories property from the_criteria.
+ /**
+ * This method ensures that the locations in the returned
+ * FactoryInfos are unique. This is necessary to ensure that only
+ * one replica of a given type is created by the load balancer at a
+ * given location.
+ */
+ int get_factory_infos (
+ const char * type_id,
+ const PortableGroup::Criteria & the_criteria,
+ PortableGroup::FactoryInfos & factory_infos) const;
+
+ /// Preprocess Strategy or CustomStrategy properties.
+ /**
+ * This method takes care of converting StrategyInfo properties to
+ * Strategy properties, and verifying that CustomStrategy references
+ * are not nil.
+ */
+ void preprocess_properties (PortableGroup::Properties & props
+ ACE_ENV_ARG_DECL);
+
+ /// Create a built-in load balancing strategy and return a reference
+ /// to it.
+ CosLoadBalancing::Strategy_ptr make_strategy (
+ CosLoadBalancing::StrategyInfo * info
+ ACE_ENV_ARG_DECL);
+
+private:
+
+ /// Reactor used when pulling loads from registered load monitors.
+ ACE_Reactor * reactor_;
+
+ /// The POA that dispatches requests to the MemberLocator.
+ PortableServer::POA_var poa_;
+
+ /// The Root POA.
+ PortableServer::POA_var root_poa_;
+
+ /// Mutex that provides synchronization for the LoadMonitor map.
+ TAO_SYNCH_MUTEX monitor_lock_;
+
+ /// Mutex that provides synchronization for the LoadMap table.
+ TAO_SYNCH_MUTEX load_lock_;
+
+ /// Mutex that provides synchronization for the LoadAlert table.
+ TAO_SYNCH_MUTEX load_alert_lock_;
+
+ /// Mutex that provides synchronization for the LoadManager's
+ /// state.
+ TAO_SYNCH_MUTEX lock_;
+
+ /// Table that maps PortableGroup::Location to load monitor at that
+ /// location.
+ TAO_LB_MonitorMap monitor_map_;
+
+ /// Table that maps location to load list.
+ TAO_LB_LoadListMap load_map_;
+
+ /// Table that maps object group and location to LoadAlert object.
+ TAO_LB_LoadAlertMap load_alert_map_;
+
+ /// The ObjectGroupManager that implements the functionality
+ /// necessary for application-controlled object group membership.
+ TAO_PG_ObjectGroupManager object_group_manager_;
+
+ /// The PropertyManager that is reponsible for parsing all criteria,
+ /// and keeping track of property-type_id associations.
+ TAO_PG_PropertyManager property_manager_;
+
+ /// The GenericFactory responsible for creating all object groups.
+ TAO_PG_GenericFactory generic_factory_;
+
+ /// The event handler that performs "pull monitoring" on all
+ /// registered load monitors.
+ TAO_LB_Pull_Handler pull_handler_;
+
+ /// Timer ID corresponding to the timer that fires off the "pull
+ /// monitoring" event handler.
+ long timer_id_;
+
+ /// Cached object reference that points to this servant.
+ CosLoadBalancing::LoadManager_var lm_ref_;
+
+ /// Cached object reference that points to the AMI handler for all
+ /// LoadAlert objects.
+ CosLoadBalancing::AMI_LoadAlertHandler_var load_alert_handler_;
+
+ /**
+ * @name Built-in load balancing strategy implementations
+ *
+ * "Built-in" load balancing strategies defined by the load
+ * balancing specification.
+ */
+ //@{
+ /// The "RoundRobin" load balancing strategy.
+ CosLoadBalancing::Strategy_var round_robin_;
+
+ /// The "Random" load balancing strategy.
+ CosLoadBalancing::Strategy_var random_;
+
+ /// The "LeastLoaded" load balancing strategy.
+ CosLoadBalancing::Strategy_var least_loaded_;
+
+ /// The "LoadMinimum" load balancing strategy.
+ CosLoadBalancing::Strategy_var load_minimum_;
+
+ /// The "LoadAverage" load balancing strategy.
+ CosLoadBalancing::Strategy_var load_average_;
+ //@}
+
+ /// Cached instance of the Property name
+ /// "org.omg.CosLoadBalancing.StrategyInfo".
+ PortableGroup::Name built_in_balancing_strategy_info_name_;
+
+ /// Cached instance of the Property name
+ /// "org.omg.CosLoadBalancing.Strategy".
+ PortableGroup::Name built_in_balancing_strategy_name_;
+
+ /// Cached instance of the Property name
+ /// "org.omg.CosLoadBalancing.CustomStrategy".
+ PortableGroup::Name custom_balancing_strategy_name_;
+
+};
+
+TAO_END_VERSIONED_NAMESPACE_DECL
+
+#include /**/ "ace/post.h"
+
+#endif /* TAO_LB_LOAD_MANAGER_H */
diff --git a/TAO/orbsvcs/orbsvcs/LoadBalancing/LB_LoadMap.h b/TAO/orbsvcs/orbsvcs/LoadBalancing/LB_LoadMap.h
new file mode 100644
index 00000000000..2e75bbba1f3
--- /dev/null
+++ b/TAO/orbsvcs/orbsvcs/LoadBalancing/LB_LoadMap.h
@@ -0,0 +1,46 @@
+// -*- C++ -*-
+
+//=======================================================================
+/**
+ * @file LB_LoadMap.h
+ *
+ * $Id$
+ *
+ * @author Ossama Othman <ossama@uci.edu>
+ */
+//=======================================================================
+
+
+#ifndef TAO_LB_LOAD_MAP_H
+#define TAO_LB_LOAD_MAP_H
+
+#include /**/ "ace/pre.h"
+
+#include "orbsvcs/CosLoadBalancingC.h"
+
+#if !defined (ACE_LACKS_PRAGMA_ONCE)
+# pragma once
+#endif /* ACE_LACKS_PRAGMA_ONCE */
+
+#include "orbsvcs/PortableGroupC.h"
+
+#include "orbsvcs/PortableGroup/PG_Location_Hash.h"
+#include "orbsvcs/PortableGroup/PG_Location_Equal_To.h"
+
+#include "ace/Hash_Map_Manager_T.h"
+
+TAO_BEGIN_VERSIONED_NAMESPACE_DECL
+
+/// Load hash map.
+typedef ACE_Hash_Map_Manager_Ex<
+ PortableGroup::Location,
+ CosLoadBalancing::Load,
+ TAO_PG_Location_Hash,
+ TAO_PG_Location_Equal_To,
+ ACE_Null_Mutex> TAO_LB_LoadMap;
+
+TAO_END_VERSIONED_NAMESPACE_DECL
+
+#include /**/ "ace/post.h"
+
+#endif /* TAO_LB_LOAD_MAP_H */
diff --git a/TAO/orbsvcs/orbsvcs/LoadBalancing/LB_LoadMinimum.cpp b/TAO/orbsvcs/orbsvcs/LoadBalancing/LB_LoadMinimum.cpp
new file mode 100644
index 00000000000..b271606a0fb
--- /dev/null
+++ b/TAO/orbsvcs/orbsvcs/LoadBalancing/LB_LoadMinimum.cpp
@@ -0,0 +1,664 @@
+#include "orbsvcs/LoadBalancing/LB_LoadMinimum.h"
+#include "ace/OS_NS_sys_time.h"
+#include "orbsvcs/LoadBalancing/LB_LoadMap.h"
+#include "orbsvcs/LoadBalancing/LB_Random.h"
+
+#include "orbsvcs/PortableGroup/PG_conf.h"
+
+#include "tao/debug.h"
+#include "tao/ORB_Constants.h"
+
+#include "ace/Null_Mutex.h"
+#include "ace/OS_NS_string.h"
+
+
+ACE_RCSID (LoadBalancing,
+ LB_LoadMinimum,
+ "$Id$")
+
+
+#if !defined (__ACE_INLINE__)
+#include "orbsvcs/LoadBalancing/LB_LoadMinimum.inl"
+#endif /* defined INLINE */
+
+TAO_BEGIN_VERSIONED_NAMESPACE_DECL
+
+TAO_LB_LoadMinimum::TAO_LB_LoadMinimum (PortableServer::POA_ptr poa)
+ : poa_ (PortableServer::POA::_duplicate (poa)),
+ load_map_ (0),
+ lock_ (0),
+ properties_ (),
+ tolerance_ (TAO_LB::LM_DEFAULT_TOLERANCE),
+ dampening_ (TAO_LB::LM_DEFAULT_DAMPENING),
+ per_balance_load_ (TAO_LB::LM_DEFAULT_DAMPENING)
+{
+ // A load map that retains previous load values at a given location
+ // and lock are only needed if dampening is enabled, i.e. non-zero.
+ if (this->dampening_ != 0)
+ {
+ ACE_NEW (this->load_map_, TAO_LB_LoadMap (TAO_PG_MAX_LOCATIONS));
+
+ ACE_NEW (this->lock_, TAO_SYNCH_MUTEX);
+ }
+
+ // Initialize the random load balancing strategy.
+ TAO_LB_Random::init ();
+}
+
+TAO_LB_LoadMinimum::~TAO_LB_LoadMinimum (void)
+{
+ delete this->load_map_;
+ delete this->lock_;
+}
+
+char *
+TAO_LB_LoadMinimum::name (ACE_ENV_SINGLE_ARG_DECL_NOT_USED)
+ ACE_THROW_SPEC ((CORBA::SystemException))
+{
+ return CORBA::string_dup ("LoadMinimum");
+}
+
+CosLoadBalancing::Properties *
+TAO_LB_LoadMinimum::get_properties (ACE_ENV_SINGLE_ARG_DECL)
+ ACE_THROW_SPEC ((CORBA::SystemException))
+{
+ CosLoadBalancing::Properties * props = 0;
+ ACE_NEW_THROW_EX (props,
+ CosLoadBalancing::Properties (this->properties_),
+ CORBA::NO_MEMORY (
+ CORBA::SystemException::_tao_minor_code (
+ TAO::VMCID,
+ ENOMEM),
+ CORBA::COMPLETED_NO));
+ ACE_CHECK_RETURN (0);
+
+ return props;
+}
+
+void
+TAO_LB_LoadMinimum::push_loads (
+ const PortableGroup::Location & the_location,
+ const CosLoadBalancing::LoadList & loads
+ ACE_ENV_ARG_DECL)
+ ACE_THROW_SPEC ((CORBA::SystemException))
+{
+ // Only the first load is used by this load balancing strategy.
+ if (loads.length () == 0)
+ ACE_THROW (CORBA::BAD_PARAM ());
+
+ CosLoadBalancing::Load load; // Unused
+
+ this->push_loads (the_location,
+ loads,
+ load
+ ACE_ENV_ARG_PARAMETER);
+}
+
+void
+TAO_LB_LoadMinimum::push_loads (
+ const PortableGroup::Location & the_location,
+ const CosLoadBalancing::LoadList & loads,
+ CosLoadBalancing::Load & load
+ ACE_ENV_ARG_DECL)
+{
+ if (loads.length () == 0)
+ ACE_THROW (CORBA::BAD_PARAM ());
+
+ // Only the first load is used by this load balancing strategy.
+ const CosLoadBalancing::Load & new_load = loads[0];
+
+ if (this->load_map_ != 0)
+ {
+ ACE_GUARD (TAO_SYNCH_MUTEX, guard, *this->lock_);
+
+ TAO_LB_LoadMap::ENTRY * entry;
+ if (this->load_map_->find (the_location, entry) == 0)
+ {
+ CosLoadBalancing::Load & previous_load = entry->int_id_;
+
+ if (previous_load.id != new_load.id)
+ ACE_THROW (CORBA::BAD_PARAM ()); // Somebody switched
+ // LoadIds on us!
+
+ previous_load.value =
+ this->effective_load (previous_load.value, new_load.value);
+
+ load = previous_load;
+ }
+ else
+ {
+ const CosLoadBalancing::Load eff_load =
+ {
+ new_load.id,
+ this->effective_load (0, new_load.value)
+ };
+
+ if (this->load_map_->bind (the_location, eff_load) != 0)
+ {
+ if (TAO_debug_level > 0)
+ ACE_ERROR ((LM_ERROR,
+ "ERROR: TAO_LB_LoadMinimum - "
+ "Unable to push loads\n"));
+
+ ACE_THROW (CORBA::INTERNAL ());
+ }
+
+ load = eff_load;
+ }
+ }
+ else
+ {
+ load.id = new_load.id;
+ load.value = this->effective_load (0, new_load.value);
+ }
+}
+
+CosLoadBalancing::LoadList *
+TAO_LB_LoadMinimum::get_loads (CosLoadBalancing::LoadManager_ptr load_manager,
+ const PortableGroup::Location & the_location
+ ACE_ENV_ARG_DECL)
+ ACE_THROW_SPEC ((CORBA::SystemException,
+ CosLoadBalancing::LocationNotFound))
+{
+ if (CORBA::is_nil (load_manager))
+ ACE_THROW_RETURN (CORBA::BAD_PARAM (), 0);
+
+ CosLoadBalancing::LoadList_var loads =
+ load_manager->get_loads (the_location
+ ACE_ENV_ARG_PARAMETER);
+ ACE_CHECK_RETURN (0);
+
+ this->push_loads (the_location,
+ loads.in (),
+ loads[0]
+ ACE_ENV_ARG_PARAMETER);
+ ACE_CHECK_RETURN (0);
+
+ return loads._retn ();
+}
+
+
+CORBA::Object_ptr
+TAO_LB_LoadMinimum::next_member (
+ PortableGroup::ObjectGroup_ptr object_group,
+ CosLoadBalancing::LoadManager_ptr load_manager
+ ACE_ENV_ARG_DECL)
+ ACE_THROW_SPEC ((CORBA::SystemException,
+ PortableGroup::ObjectGroupNotFound,
+ PortableGroup::MemberNotFound))
+{
+ if (CORBA::is_nil (load_manager))
+ ACE_THROW_RETURN (CORBA::BAD_PARAM (),
+ CORBA::Object::_nil ());
+
+ PortableGroup::Locations_var locations =
+ load_manager->locations_of_members (object_group
+ ACE_ENV_ARG_PARAMETER);
+ ACE_CHECK_RETURN (CORBA::Object::_nil ());
+
+ if (locations->length () == 0)
+ ACE_THROW_RETURN (CORBA::TRANSIENT (),
+ CORBA::Object::_nil ());
+
+ // @@ RACE CONDITION. OBJECT GROUP MEMBERSHIP MAY CHANGE AFTER
+ // RETRIEVING LOCATIONS! HOW DO WE HANDLE THAT?
+
+ PortableGroup::Location location;
+ CORBA::Boolean found_location =
+ this->get_location (load_manager,
+ locations.in (),
+ location
+ ACE_ENV_ARG_PARAMETER);
+ ACE_CHECK_RETURN (CORBA::Object::_nil ());
+
+ if (found_location)
+ {
+/*
+ ACE_DEBUG ((LM_DEBUG,
+ "RETURNING REFERENCE FOR LOCATION \"%s\"\n",
+ location[0].id.in ()));
+*/
+
+ return load_manager->get_member_ref (object_group,
+ location
+ ACE_ENV_ARG_PARAMETER);
+ }
+ else
+ {
+ // No loads have been reported for any of the locations the
+ // object group members reside at. If no loads have been
+ // reported to the LoadManager, adaptive load balancing
+ // decisions cannot be made. Fall back on a non-adaptive
+ // strategy, such as the Random load balancing strategy,
+ // instead.
+ //
+ // @note The Random load balancing strategy is used since it is
+ // very lightweight and stateless.
+/*
+ ACE_DEBUG ((LM_DEBUG,
+ "CALLING RANDOM REFERENCE FOR LOCATION \n"));
+*/
+
+ return TAO_LB_Random::_tao_next_member (object_group,
+ load_manager,
+ locations.in ()
+ ACE_ENV_ARG_PARAMETER);
+ }
+}
+
+void
+TAO_LB_LoadMinimum::analyze_loads (
+ PortableGroup::ObjectGroup_ptr object_group,
+ CosLoadBalancing::LoadManager_ptr load_manager
+ ACE_ENV_ARG_DECL)
+ ACE_THROW_SPEC ((CORBA::SystemException))
+{
+ if (CORBA::is_nil (load_manager))
+ ACE_THROW (CORBA::BAD_PARAM ());
+
+ PortableGroup::Locations_var locations =
+ load_manager->locations_of_members (object_group
+ ACE_ENV_ARG_PARAMETER);
+ ACE_CHECK;
+
+ if (locations->length () == 0)
+ ACE_THROW (CORBA::TRANSIENT ());
+
+ const CORBA::ULong len = locations->length ();
+
+ CosLoadBalancing::Load total_load = { 0, 0 };
+ CosLoadBalancing::Load avg_load = { 0, 0 };
+
+ CORBA::Float min_load = FLT_MAX;
+
+ CosLoadBalancing::LoadList tmp (len);
+ tmp.length (1);
+
+ // Iterate through the entire location list to determine
+ // the average load of all the locations
+ for (CORBA::ULong i = 0; i < len; ++i)
+ {
+ ACE_TRY
+ {
+ const PortableGroup::Location & loc = locations[i];
+
+ // Retrieve the load list for the location from the
+ // LoadManager and push it to this Strategy's load
+ // processor.
+ CosLoadBalancing::LoadList_var current_loads =
+ load_manager->get_loads (loc
+ ACE_ENV_ARG_PARAMETER);
+ ACE_TRY_CHECK;
+
+ CosLoadBalancing::Load load;
+ this->push_loads (loc,
+ current_loads.in (),
+ load
+ ACE_ENV_ARG_PARAMETER);
+ ACE_TRY_CHECK;
+
+ total_load.value = total_load.value + load.value;
+ tmp[i] = load;
+
+ if ((load.value < min_load) && (load.value != 0))
+ {
+ min_load = load.value;
+ }
+
+ /*
+ ACE_DEBUG ((LM_DEBUG,
+ "TOTAL == %f\n",
+ total_load.value));
+ */
+
+ }
+ ACE_CATCH (CosLoadBalancing::LocationNotFound, ex)
+ {
+ // no location found
+ //
+ }
+ ACE_ENDTRY;
+ ACE_CHECK;
+ }
+
+ avg_load.value = total_load.value / len;
+/*
+ ACE_DEBUG ((LM_DEBUG,
+ "AVERAGE LOAD == %f"
+ "\tMIN LOAD == %f\n",
+ avg_load.value,
+ min_load));
+*/
+
+ // Iterate through the entire location list to determine
+ // the location where the load has to be shed.
+ for (CORBA::ULong j = 0; j < len; ++j)
+ {
+ ACE_TRY_EX (SECOND)
+ {
+ const PortableGroup::Location & loc = locations[j];
+
+ /*
+ ACE_DEBUG ((LM_DEBUG,
+ "EFFECTIVE_LOAD == %f\n"
+ "AVERAGE == %f\n",
+ tmp[i].value,
+ avg_load.value));
+ */
+
+ if (tmp[j].value <= avg_load.value)
+ {
+ load_manager->disable_alert (loc
+ ACE_ENV_ARG_PARAMETER);
+ ACE_TRY_CHECK_EX (SECOND);
+ }
+ else
+ {
+
+ CORBA::Float percent_diff =
+ (tmp[j].value / min_load) - 1;
+
+ if (tmp[j].value == min_load)
+ {
+ percent_diff = 0;
+ }
+/*
+ ACE_DEBUG ((LM_DEBUG,
+ "ALERT LOC == %u"
+ "\tMIN LOAD == %f\n"
+ "\tLOAD == %f\n"
+ "\tPERCENT == %f\n",
+ i,
+ min_load,
+ tmp[i].value,
+ percent_diff));
+*/
+
+ if (percent_diff <= TAO_LB::LM_DEFAULT_DIFF_AVERAGE_CUTOFF)
+ {
+ load_manager->disable_alert (loc
+ ACE_ENV_ARG_PARAMETER);
+ ACE_TRY_CHECK_EX (SECOND);
+ }
+ else if ((percent_diff > TAO_LB::LM_DEFAULT_DIFF_AVERAGE_CUTOFF)
+ && (percent_diff < 1))
+ {
+/*
+ ACE_DEBUG ((LM_DEBUG,
+ "%P --- ALERTING LOCATION %u\n",
+ i));
+*/
+ load_manager->enable_alert (loc
+ ACE_ENV_ARG_PARAMETER);
+ ACE_TRY_CHECK_EX (SECOND);
+ }
+ }
+ }
+ ACE_CATCH (CosLoadBalancing::LocationNotFound, ex)
+ {
+ // no location found
+ //
+ }
+ ACE_ENDTRY;
+ ACE_CHECK;
+ }
+
+}
+
+PortableServer::POA_ptr
+TAO_LB_LoadMinimum::_default_POA (ACE_ENV_SINGLE_ARG_DECL_NOT_USED)
+{
+ return PortableServer::POA::_duplicate (this->poa_.in ());
+}
+
+CORBA::Boolean
+TAO_LB_LoadMinimum::get_location (
+ CosLoadBalancing::LoadManager_ptr load_manager,
+ const PortableGroup::Locations & locations,
+ PortableGroup::Location & location
+ ACE_ENV_ARG_DECL)
+{
+ CORBA::Float min_load = FLT_MAX; // Start out with the largest
+ // positive value.
+
+ CORBA::ULong location_index = 0;
+ CORBA::Boolean found_location = 0;
+ CORBA::Boolean found_load = 0;
+
+ const CORBA::ULong len = locations.length ();
+
+ // Iterate through the entire location list to find the least loaded
+ // of them.
+ for (CORBA::ULong i = 0; i < len; ++i)
+ {
+ ACE_TRY
+ {
+ const PortableGroup::Location & loc = locations[i];
+
+ // Retrieve the load list for the location from the LoadManager
+ // and push it to this Strategy's load processor.
+ CosLoadBalancing::LoadList_var current_loads =
+ load_manager->get_loads (loc
+ ACE_ENV_ARG_PARAMETER);
+ ACE_TRY_CHECK;
+
+ found_load = 1;
+
+ CosLoadBalancing::Load load;
+ this->push_loads (loc,
+ current_loads.in (),
+ load
+ ACE_ENV_ARG_PARAMETER);
+ ACE_TRY_CHECK;
+/*
+ ACE_DEBUG ((LM_DEBUG,
+ "LOC == %u"
+ "\tMIN LOAD == %f\n"
+ "\tLOAD == %f\n",
+ i,
+ min_load,
+ load.value));
+*/
+ if (load.value < min_load)
+ {
+
+ if (i > 0 && load.value != 0)
+ {
+ /*
+ percent difference =
+ (min_load - load.value) / load.value
+ == (min_load / load.value) - 1
+
+ The latter form is used to avoid a potential
+ arithmetic overflow problem, such as when
+ (min_load - load.value) > FLT_MAX, assuming that
+ either load.value is negative and min_load is
+ positive, or vice versa.
+ */
+ const CORBA::Float percent_diff =
+ (min_load / load.value) - 1;
+ /*
+ A "thundering herd" phenomenon may occur when
+ location loads are basically the same (e.g. only
+ differ by a very small amount), where one object
+ group member ends up receiving the majority of
+ requests from different clients. In order to
+ prevent a single object group member from
+ receiving such request bursts, one of two equally
+ loaded locations is chosen at random. Thanks to
+ Carlos, Marina and Jody at ATD for coming up with
+ this solution to this form of the thundering herd
+ problem.
+
+ See the documentation for
+ TAO_LB::LL_DEFAULT_LOAD_PERCENT_DIFF_CUTOFF in
+ LB_LoadMinimum.h for additional information.
+ */
+ if (percent_diff <= TAO_LB::LM_DEFAULT_LOAD_PERCENT_DIFF_CUTOFF)
+ {
+ // Prevent integer arithmetic overflow.
+ const CORBA::Float NUM_MEMBERS = 2;
+
+ // n == 0: Use previously selected location.
+ // n == 1: Use current location.
+ const CORBA::ULong n =
+ static_cast<CORBA::ULong> (NUM_MEMBERS * ACE_OS::rand ()
+ / (RAND_MAX + 1.0));
+
+ ACE_ASSERT (n == 0 || n == 1);
+
+ if (n == 1)
+ {
+ min_load = load.value;
+ location_index = i;
+ found_location = 1;
+
+// ACE_DEBUG ((LM_DEBUG,
+// "** NEW MIN_LOAD == %f\n",
+// min_load));
+ }
+
+// if (n == 0)
+// ACE_DEBUG ((LM_DEBUG, "^^^^^ PREVIOUS LOCATION\n"));
+// else
+// ACE_DEBUG ((LM_DEBUG, "^^^^^ CURRENT LOCATION\n"));
+
+ }
+ else
+ {
+ min_load = load.value;
+ location_index = i;
+ found_location = 1;
+
+// ACE_DEBUG ((LM_DEBUG,
+// "***** NEW MIN_LOAD == %f\n",
+// min_load));
+ }
+ }
+ else
+ {
+ min_load = load.value;
+ location_index = i;
+ found_location = 1;
+
+// ACE_DEBUG ((LM_DEBUG,
+// "NEW MIN_LOAD == %f\n",
+// min_load));
+ }
+ }
+
+ // ACE_DEBUG ((LM_DEBUG, "NEW MIN_LOAD == %f\n", min_load));
+ }
+ ACE_CATCH (CosLoadBalancing::LocationNotFound, ex)
+ {
+ // No load available for the requested location. Try the
+ // next location.
+ }
+ ACE_ENDTRY;
+ ACE_CHECK_RETURN (0);
+ }
+
+// ACE_DEBUG ((LM_DEBUG,
+// "FOUND_LOAD == %u\n"
+// "FOUND_LOCATION == %u\n",
+// found_load,
+// found_location));
+
+ // If no loads were found, return without an exception to allow this
+ // strategy to select a member using an alternative method
+ // (e.g. random selection).
+ if (found_load)
+ {
+ if (found_location)
+ {
+ location = locations[location_index];
+ //ACE_DEBUG ((LM_DEBUG, "LOCATED = %u\n", location_index));
+ }
+ }
+
+ //ACE_DEBUG ((LM_DEBUG, "LOCATED = %u\n", location_index));
+
+ return found_location;
+}
+
+void
+TAO_LB_LoadMinimum::init (const PortableGroup::Properties & props
+ ACE_ENV_ARG_DECL)
+{
+ CORBA::Float tolerance = TAO_LB::LM_DEFAULT_TOLERANCE;
+ CORBA::Float dampening = TAO_LB::LM_DEFAULT_DAMPENING;
+ CORBA::Float per_balance_load = TAO_LB::LM_DEFAULT_PER_BALANCE_LOAD;
+
+ const CORBA::ULong len = props.length ();
+ for (CORBA::ULong i = 0; i < len; ++i)
+ {
+ const PortableGroup::Property & property = props[i];
+ if (ACE_OS::strcmp (property.nam[0].id.in (),
+ "org.omg.CosLoadBalancing.Strategy.LoadMinimum.Tolerance") == 0)
+ {
+ this->extract_float_property (property,
+ tolerance
+ ACE_ENV_ARG_PARAMETER);
+ ACE_CHECK;
+
+ // Valid tolerance values are greater than or equal to one.
+ if (tolerance < 1)
+ ACE_THROW (PortableGroup::InvalidProperty (property.nam,
+ property.val));
+ }
+
+ else if (ACE_OS::strcmp (property.nam[0].id.in (),
+ "org.omg.CosLoadBalancing.Strategy.LoadMinimum.Dampening") == 0)
+ {
+ this->extract_float_property (property,
+ dampening
+ ACE_ENV_ARG_PARAMETER);
+ ACE_CHECK;
+
+ // Dampening range is [0,1).
+ if (dampening < 0 || dampening >= 1)
+ ACE_THROW (PortableGroup::InvalidProperty (property.nam,
+ property.val));
+ }
+
+ else if (ACE_OS::strcmp (property.nam[0].id.in (),
+ "org.omg.CosLoadBalancing.Strategy.LoadMinimum.PerBalanceLoad") == 0)
+ {
+ this->extract_float_property (property,
+ per_balance_load
+ ACE_ENV_ARG_PARAMETER);
+ ACE_CHECK;
+ }
+ }
+
+ this->properties_ = props;
+
+ this->tolerance_ = tolerance;
+ this->dampening_ = dampening;
+ this->per_balance_load_ = per_balance_load;
+
+ /*
+ ACE_DEBUG ((LM_DEBUG,
+ "--------------------------------\n"
+ "tolerance = %f\n"
+ "dampening = %f\n"
+ "per_balance_load = %f\n"
+ "--------------------------------\n",
+ tolerance,
+ dampening,
+ per_balance_load));
+ */
+}
+
+void
+TAO_LB_LoadMinimum::extract_float_property (
+ const PortableGroup::Property & property,
+ CORBA::Float & value
+ ACE_ENV_ARG_DECL)
+{
+ if (!(property.val >>= value))
+ ACE_THROW (PortableGroup::InvalidProperty (property.nam,
+ property.val));
+}
+
+TAO_END_VERSIONED_NAMESPACE_DECL
diff --git a/TAO/orbsvcs/orbsvcs/LoadBalancing/LB_LoadMinimum.h b/TAO/orbsvcs/orbsvcs/LoadBalancing/LB_LoadMinimum.h
new file mode 100644
index 00000000000..c979845aa0c
--- /dev/null
+++ b/TAO/orbsvcs/orbsvcs/LoadBalancing/LB_LoadMinimum.h
@@ -0,0 +1,208 @@
+// -*- C++ -*-
+
+//=============================================================================
+/**
+ * @file LB_LoadMinimum.h
+ *
+ * $Id$
+ *
+ * @author Jaiganesh Balasubramanian <jai@dre.vanderbilt.edu>
+ * Ossama Othman <ossama@uci.edu>
+ */
+//=============================================================================
+
+
+#ifndef LB_LOAD_MINIMUM_H
+#define LB_LOAD_MINIMUM_H
+
+#include /**/ "ace/pre.h"
+
+#include "orbsvcs/LoadBalancing/LB_LoadMap.h"
+
+# if !defined (ACE_LACKS_PRAGMA_ONCE)
+# pragma once
+# endif /* ACE_LACKS_PRAGMA_ONCE */
+
+#include "orbsvcs/CosLoadBalancingS.h"
+
+#include "ace/Synch_Traits.h"
+#include "ace/Thread_Mutex.h"
+
+
+TAO_BEGIN_VERSIONED_NAMESPACE_DECL
+
+namespace TAO_LB
+{
+ /**
+ * @name Default LoadMinimum strategy parameters.
+ *
+ * Defaults defined by the Load Balancing specification.
+ */
+ //@{
+ const CORBA::Float LM_DEFAULT_TOLERANCE = 1;
+ const CORBA::Float LM_DEFAULT_DAMPENING = 0;
+ const CORBA::Float LM_DEFAULT_PER_BALANCE_LOAD = 0;
+ //@}
+
+ /**
+ * @name TAO-specific LoadMinimum strategy parameters.
+ *
+ * Parameters internal to TAO's LoadMinimum strategy
+ * implementation.
+ */
+ //@{
+ /// Percentage difference between two load values that determines
+ /// whether the loads are considered equivalent.
+ /**
+ * If the percent difference between two loads, i.e.:
+ * (Old Load - New Load) / New Load
+ * is less than or equal to this value, the two loads will be
+ * considered equivalent. In such a case, an object group member
+ * residing at the location corresponding to one of the two loads
+ * will be selected at random.
+ */
+ const CORBA::Float LM_DEFAULT_LOAD_PERCENT_DIFF_CUTOFF = 0.05f; // 1%
+ const CORBA::Float LM_DEFAULT_DIFF_AVERAGE_CUTOFF = 0.4f; // 80%
+ //@}
+}
+
+/**
+ * @class TAO_LB_LoadMinimum
+ *
+ * @brief "Least loaded" load balancing strategy
+ *
+ * This load balancing strategy is designed to select an object group
+ * member residing at a location with the smallest load.
+ */
+class TAO_LB_LoadMinimum
+ : public virtual POA_CosLoadBalancing::Strategy
+{
+public:
+
+ /// Constructor.
+ TAO_LB_LoadMinimum (PortableServer::POA_ptr poa);
+
+ /**
+ * @name CosLoadBalancing::Strategy methods
+ *
+ * Methods required by the CosLoadBalancing::Strategy interface.
+ */
+ //@{
+ virtual char * name (ACE_ENV_SINGLE_ARG_DECL_WITH_DEFAULTS)
+ ACE_THROW_SPEC ((CORBA::SystemException));
+
+ virtual CosLoadBalancing::Properties * get_properties (
+ ACE_ENV_SINGLE_ARG_DECL_WITH_DEFAULTS)
+ ACE_THROW_SPEC ((CORBA::SystemException));
+
+ virtual void push_loads (
+ const PortableGroup::Location & the_location,
+ const CosLoadBalancing::LoadList & loads
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS)
+ ACE_THROW_SPEC ((CORBA::SystemException));
+
+ virtual CosLoadBalancing::LoadList * get_loads (
+ CosLoadBalancing::LoadManager_ptr load_manager,
+ const PortableGroup::Location & the_location
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS)
+ ACE_THROW_SPEC ((CORBA::SystemException,
+ CosLoadBalancing::LocationNotFound));
+
+ virtual CORBA::Object_ptr next_member (
+ PortableGroup::ObjectGroup_ptr object_group,
+ CosLoadBalancing::LoadManager_ptr load_manager
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS)
+ ACE_THROW_SPEC ((CORBA::SystemException,
+ PortableGroup::ObjectGroupNotFound,
+ PortableGroup::MemberNotFound));
+
+ virtual void analyze_loads (
+ PortableGroup::ObjectGroup_ptr object_group,
+ CosLoadBalancing::LoadManager_ptr load_manager
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS)
+ ACE_THROW_SPEC ((CORBA::SystemException));
+ //@}
+
+ /// Returns the default POA for this servant.
+ virtual PortableServer::POA_ptr _default_POA (
+ ACE_ENV_SINGLE_ARG_DECL_WITH_DEFAULTS
+ );
+
+ /// Initialize the LoadMinimum instance with the given properties.
+ void init (const PortableGroup::Properties & props
+ ACE_ENV_ARG_DECL);
+
+protected:
+
+ /// Destructor.
+ ~TAO_LB_LoadMinimum (void);
+
+ /// Retrieve the least loaded location from the given list of
+ /// locations.
+ CORBA::Boolean get_location (CosLoadBalancing::LoadManager_ptr load_manager,
+ const PortableGroup::Locations & locations,
+ PortableGroup::Location & location
+ ACE_ENV_ARG_DECL);
+
+ /// Return the effective load.
+ CORBA::Float effective_load (CORBA::Float previous_load,
+ CORBA::Float new_load);
+
+ /// Push the new load into this Strategy's load processor, and
+ /// return the corresponding effective load.
+ void push_loads (
+ const PortableGroup::Location & the_location,
+ const CosLoadBalancing::LoadList & loads,
+ CosLoadBalancing::Load & effective_load
+ ACE_ENV_ARG_DECL);
+
+ /// Utility method to extract a CORBA::Float value from the given
+ /// property.
+ void extract_float_property (const PortableGroup::Property & property,
+ CORBA::Float & value
+ ACE_ENV_ARG_DECL);
+
+private:
+
+ /// This servant's default POA.
+ PortableServer::POA_var poa_;
+
+ /// Table that maps location to load list.
+ TAO_LB_LoadMap * load_map_;
+
+ /// Lock used to ensure atomic access to state retained by this
+ /// class.
+ TAO_SYNCH_MUTEX * lock_;
+
+ /// Cached set of properties used when initializing this strategy.
+ CosLoadBalancing::Properties properties_;
+
+ /**
+ * @name LoadMinimum Property Values
+ *
+ * Cached LoadMinimum load balancing strategy property values.
+ */
+ //@{
+
+ ///
+ CORBA::Float tolerance_;
+
+ ///
+ CORBA::Float dampening_;
+
+ ///
+ CORBA::Float per_balance_load_;
+
+ //@}
+
+};
+
+TAO_END_VERSIONED_NAMESPACE_DECL
+
+#if defined (__ACE_INLINE__)
+#include "orbsvcs/LoadBalancing/LB_LoadMinimum.inl"
+#endif /* defined INLINE */
+
+#include /**/ "ace/post.h"
+
+#endif /* LB_LOAD_MINIMUM_H */
diff --git a/TAO/orbsvcs/orbsvcs/LoadBalancing/LB_LoadMinimum.inl b/TAO/orbsvcs/orbsvcs/LoadBalancing/LB_LoadMinimum.inl
new file mode 100644
index 00000000000..dc120b38783
--- /dev/null
+++ b/TAO/orbsvcs/orbsvcs/LoadBalancing/LB_LoadMinimum.inl
@@ -0,0 +1,26 @@
+// -*- C++ -*-
+//
+// $Id$
+
+TAO_BEGIN_VERSIONED_NAMESPACE_DECL
+
+ACE_INLINE CORBA::Float
+TAO_LB_LoadMinimum::effective_load (CORBA::Float previous_load,
+ CORBA::Float new_load)
+{
+ // Apply per-balance load. (Recompute raw load)
+ previous_load += this->per_balance_load_;
+
+ // Apply dampening. (Recompute new raw load)
+ CORBA::Float result =
+ this->dampening_ * previous_load + (1 - this->dampening_) * new_load;
+
+ ACE_ASSERT (this->tolerance_ != 0);
+
+ // Compute the effective load.
+ result /= this->tolerance_;
+
+ return result;
+}
+
+TAO_END_VERSIONED_NAMESPACE_DECL
diff --git a/TAO/orbsvcs/orbsvcs/LoadBalancing/LB_Location_Index_Map.h b/TAO/orbsvcs/orbsvcs/LoadBalancing/LB_Location_Index_Map.h
new file mode 100644
index 00000000000..a08694dd2d0
--- /dev/null
+++ b/TAO/orbsvcs/orbsvcs/LoadBalancing/LB_Location_Index_Map.h
@@ -0,0 +1,44 @@
+// -*- C++ -*-
+
+//=======================================================================
+/**
+ * @file LB_Location_Index_Map.h
+ *
+ * $Id$
+ *
+ * @author Ossama Othman <ossama@uci.edu>
+ */
+//=======================================================================
+
+
+#ifndef TAO_LB_LOCATION_INDEX_MAP_H
+#define TAO_LB_LOCATION_INDEX_MAP_H
+
+#include /**/ "ace/pre.h"
+
+#include "orbsvcs/CosLoadBalancingC.h"
+
+#if !defined (ACE_LACKS_PRAGMA_ONCE)
+# pragma once
+#endif /* ACE_LACKS_PRAGMA_ONCE */
+
+#include "orbsvcs/PortableGroupC.h"
+
+#include "ace/Functor.h"
+#include "ace/Hash_Map_Manager_T.h"
+
+TAO_BEGIN_VERSIONED_NAMESPACE_DECL
+
+/// Location index map.
+typedef ACE_Hash_Map_Manager_Ex<
+ PortableGroup::ObjectGroupId,
+ CORBA::ULong,
+ ACE_Hash<ACE_UINT64>,
+ ACE_Equal_To<ACE_UINT64>,
+ ACE_Null_Mutex> TAO_LB_Location_Index_Map;
+
+TAO_END_VERSIONED_NAMESPACE_DECL
+
+#include /**/ "ace/post.h"
+
+#endif /* TAO_LB_LOCATION_INDEX_MAP_H */
diff --git a/TAO/orbsvcs/orbsvcs/LoadBalancing/LB_MemberLocator.cpp b/TAO/orbsvcs/orbsvcs/LoadBalancing/LB_MemberLocator.cpp
new file mode 100644
index 00000000000..31c4e10977e
--- /dev/null
+++ b/TAO/orbsvcs/orbsvcs/LoadBalancing/LB_MemberLocator.cpp
@@ -0,0 +1,76 @@
+#include "orbsvcs/LoadBalancing/LB_LoadManager.h"
+#include "orbsvcs/LoadBalancing/LB_MemberLocator.h"
+
+#include "tao/debug.h"
+
+
+ACE_RCSID (LoadBalancing,
+ LB_MemberLocator,
+ "$Id$")
+
+TAO_BEGIN_VERSIONED_NAMESPACE_DECL
+
+TAO_LB_MemberLocator::TAO_LB_MemberLocator (
+ TAO_LB_LoadManager * lm)
+ : load_manager_ (lm)
+{
+ ACE_ASSERT (lm != 0);
+}
+
+PortableServer::Servant
+TAO_LB_MemberLocator::preinvoke (
+ const PortableServer::ObjectId & oid,
+ PortableServer::POA_ptr /* adapter */,
+ const char * /* operation */,
+ PortableServer::ServantLocator::Cookie & /* the_cookie */
+ ACE_ENV_ARG_DECL)
+ ACE_THROW_SPEC ((CORBA::SystemException,
+ PortableServer::ForwardRequest))
+{
+ ACE_TRY
+ {
+ CORBA::Object_var member =
+ this->load_manager_->next_member (oid
+ ACE_ENV_ARG_PARAMETER);
+ ACE_TRY_CHECK;
+
+// ACE_DEBUG ((LM_DEBUG, "%N:%l\n"));
+// ACE_DEBUG ((LM_DEBUG,
+// "FORWARDED\n"));
+
+ ACE_ASSERT (!CORBA::is_nil (member.in ()));
+ // Throw a forward exception to force the client to redirect its
+ // requests to the member chosen by the LoadBalancer.
+ ACE_TRY_THROW (PortableServer::ForwardRequest (member.in ()));
+ }
+ ACE_CATCH (PortableGroup::ObjectGroupNotFound, ex)
+ {
+ if (TAO_debug_level > 0)
+ ACE_PRINT_EXCEPTION (ex,
+ "LoadManager::next_member()");
+ }
+ ACE_CATCH (PortableGroup::MemberNotFound, ex)
+ {
+ if (TAO_debug_level > 0)
+ ACE_PRINT_EXCEPTION (ex,
+ "LoadManager::next_member()");
+ }
+ ACE_ENDTRY;
+ ACE_CHECK_RETURN (0);
+
+ ACE_THROW_RETURN (CORBA::OBJECT_NOT_EXIST (), 0);
+}
+
+void
+TAO_LB_MemberLocator::postinvoke (
+ const PortableServer::ObjectId & /* oid */,
+ PortableServer::POA_ptr /* adapter */,
+ const char * /* operation */,
+ PortableServer::ServantLocator::Cookie /* the_cookie */,
+ PortableServer::Servant /* the_servant */
+ ACE_ENV_ARG_DECL_NOT_USED)
+ ACE_THROW_SPEC ((CORBA::SystemException))
+{
+}
+
+TAO_END_VERSIONED_NAMESPACE_DECL
diff --git a/TAO/orbsvcs/orbsvcs/LoadBalancing/LB_MemberLocator.h b/TAO/orbsvcs/orbsvcs/LoadBalancing/LB_MemberLocator.h
new file mode 100644
index 00000000000..e376937f0a5
--- /dev/null
+++ b/TAO/orbsvcs/orbsvcs/LoadBalancing/LB_MemberLocator.h
@@ -0,0 +1,92 @@
+// -*- C++ -*-
+
+//=============================================================================
+/**
+ * @file LB_MemberLocator.h
+ *
+ * $Id$
+ *
+ * @author Ossama Othman <ossama@uci.edu>
+ */
+//=============================================================================
+
+
+#ifndef TAO_LB_MEMBER_LOCATOR_H
+#define TAO_LB_MEMBER_LOCATOR_H
+
+#include /**/ "ace/pre.h"
+
+#include "ace/config-all.h"
+
+# if !defined (ACE_LACKS_PRAGMA_ONCE)
+# pragma once
+# endif /* ACE_LACKS_PRAGMA_ONCE */
+
+#include "tao/PortableServer/ServantLocatorC.h"
+#include "tao/LocalObject.h"
+
+TAO_BEGIN_VERSIONED_NAMESPACE_DECL
+
+// Forward declarations.
+class TAO_LB_LoadManager;
+
+/**
+ * @class TAO_LB_MemberLocator
+ *
+ * @brief ServantLocator implementation for the Load Balancer.
+ *
+ * This is a Servant Locator implementation that forwards requests to
+ * a member returned by the Load Balancer.
+ */
+class TAO_LB_MemberLocator
+ : public virtual PortableServer::ServantLocator,
+ public virtual TAO_Local_RefCounted_Object
+{
+public:
+
+ /// Constructor
+ TAO_LB_MemberLocator (TAO_LB_LoadManager * load_balancer);
+
+ /**
+ * @name The PortableServer::ServantLocator methods.
+ *
+ * Methods required by the PortableServer::ServantLocator
+ * interface.
+ */
+ //@{
+
+ /// Clients requests are forwarded via the
+ /// PortableServer::ForwardRequest exception thrown in this method.
+ virtual PortableServer::Servant preinvoke (
+ const PortableServer::ObjectId & oid,
+ PortableServer::POA_ptr adapter,
+ const char * operation,
+ PortableServer::ServantLocator::Cookie & the_cookie
+ ACE_ENV_ARG_DECL)
+ ACE_THROW_SPEC ((CORBA::SystemException,
+ PortableServer::ForwardRequest));
+
+ /// This method is no-op in this ServantLocator implementation.
+ virtual void postinvoke (
+ const PortableServer::ObjectId &oid,
+ PortableServer::POA_ptr adapter,
+ const char * operation,
+ PortableServer::ServantLocator::Cookie the_cookie,
+ PortableServer::Servant the_servant
+ ACE_ENV_ARG_DECL)
+ ACE_THROW_SPEC ((CORBA::SystemException));
+
+ //@}
+
+private:
+
+ /// The load balancer/manager implementation.
+ TAO_LB_LoadManager * load_manager_;
+
+};
+
+TAO_END_VERSIONED_NAMESPACE_DECL
+
+#include /**/ "ace/post.h"
+
+#endif /* TAO_LB_MEMBER_LOCATOR_H */
diff --git a/TAO/orbsvcs/orbsvcs/LoadBalancing/LB_MonitorMap.h b/TAO/orbsvcs/orbsvcs/LoadBalancing/LB_MonitorMap.h
new file mode 100644
index 00000000000..02b8f12adeb
--- /dev/null
+++ b/TAO/orbsvcs/orbsvcs/LoadBalancing/LB_MonitorMap.h
@@ -0,0 +1,42 @@
+// -*- C++ -*-
+
+//=============================================================================
+/**
+ * @file LB_MonitorMap.h
+ *
+ * $Id$
+ *
+ * @author Ossama Othman <ossama@uci.edu>
+ */
+//=============================================================================
+
+
+#ifndef TAO_LB_MONITOR_MAP_H
+#define TAO_LB_MONITOR_MAP_H
+
+#include /**/ "ace/pre.h"
+
+#include "orbsvcs/CosLoadBalancingC.h"
+
+#if !defined (ACE_LACKS_PRAGMA_ONCE)
+#pragma once
+#endif /* ACE_LACKS_PRAGMA_ONCE */
+
+#include "orbsvcs/PortableGroup/PG_Location_Hash.h"
+#include "orbsvcs/PortableGroup/PG_Location_Equal_To.h"
+
+#include "ace/Hash_Map_Manager_T.h"
+
+
+/// Load monitor hash map.
+typedef ACE_Hash_Map_Manager_Ex<
+ PortableGroup::Location,
+ CosLoadBalancing::LoadMonitor_var,
+ TAO_PG_Location_Hash,
+ TAO_PG_Location_Equal_To,
+ ACE_Null_Mutex> TAO_LB_MonitorMap;
+
+
+#include /**/ "ace/post.h"
+
+#endif /* TAO_LB_MONITOR_MAP_H */
diff --git a/TAO/orbsvcs/orbsvcs/LoadBalancing/LB_ORBInitializer.cpp b/TAO/orbsvcs/orbsvcs/LoadBalancing/LB_ORBInitializer.cpp
new file mode 100644
index 00000000000..e7e7eeb4443
--- /dev/null
+++ b/TAO/orbsvcs/orbsvcs/LoadBalancing/LB_ORBInitializer.cpp
@@ -0,0 +1,94 @@
+#include "orbsvcs/LoadBalancing/LB_ORBInitializer.h"
+#include "orbsvcs/LoadBalancing/LB_IORInterceptor.h"
+#include "orbsvcs/LoadBalancing/LB_ServerRequestInterceptor.h"
+
+#include "orbsvcs/CosLoadBalancingC.h"
+
+#include "tao/ORB_Constants.h"
+
+ACE_RCSID (LoadBalancing,
+ LB_ORBInitializer,
+ "$Id$")
+
+
+TAO_BEGIN_VERSIONED_NAMESPACE_DECL
+
+TAO_LB_ORBInitializer::TAO_LB_ORBInitializer (
+ const CORBA::StringSeq & object_groups,
+ const CORBA::StringSeq & repository_ids,
+ const char * location)
+ : object_groups_ (object_groups),
+ repository_ids_ (repository_ids),
+ location_ (location),
+ load_alert_ ()
+{
+}
+
+void
+TAO_LB_ORBInitializer::pre_init (
+ PortableInterceptor::ORBInitInfo_ptr
+ ACE_ENV_ARG_DECL_NOT_USED)
+ ACE_THROW_SPEC ((CORBA::SystemException))
+{
+}
+
+void
+TAO_LB_ORBInitializer::post_init (
+ PortableInterceptor::ORBInitInfo_ptr info
+ ACE_ENV_ARG_DECL)
+ ACE_THROW_SPEC ((CORBA::SystemException))
+{
+ CORBA::Object_var obj =
+ info->resolve_initial_references ("LoadManager"
+ ACE_ENV_ARG_PARAMETER);
+ ACE_CHECK;
+
+ CosLoadBalancing::LoadManager_var lm =
+ CosLoadBalancing::LoadManager::_narrow (obj.in ()
+ ACE_ENV_ARG_PARAMETER);
+ ACE_CHECK;
+
+ CORBA::String_var orbid = info->orb_id (ACE_ENV_SINGLE_ARG_PARAMETER);
+ ACE_CHECK;
+
+ PortableInterceptor::IORInterceptor_ptr tmp;
+ ACE_NEW_THROW_EX (tmp,
+ TAO_LB_IORInterceptor (this->object_groups_,
+ this->repository_ids_,
+ this->location_.in (),
+ lm.in (),
+ orbid.in (),
+ this->load_alert_),
+ CORBA::NO_MEMORY (
+ CORBA::SystemException::_tao_minor_code (
+ TAO::VMCID,
+ ENOMEM),
+ CORBA::COMPLETED_NO));
+ ACE_CHECK;
+
+ PortableInterceptor::IORInterceptor_var ior_interceptor = tmp;
+
+ info->add_ior_interceptor (ior_interceptor.in ()
+ ACE_ENV_ARG_PARAMETER);
+ ACE_CHECK;
+
+ // ----------------
+
+ PortableInterceptor::ServerRequestInterceptor_ptr sri;
+ ACE_NEW_THROW_EX (sri,
+ TAO_LB_ServerRequestInterceptor (this->load_alert_),
+ CORBA::NO_MEMORY (
+ CORBA::SystemException::_tao_minor_code (
+ TAO::VMCID,
+ ENOMEM),
+ CORBA::COMPLETED_NO));
+ ACE_CHECK;
+
+ PortableInterceptor::ServerRequestInterceptor_var sr_interceptor = sri;
+
+ info->add_server_request_interceptor (sr_interceptor.in ()
+ ACE_ENV_ARG_PARAMETER);
+ ACE_CHECK;
+}
+
+TAO_END_VERSIONED_NAMESPACE_DECL
diff --git a/TAO/orbsvcs/orbsvcs/LoadBalancing/LB_ORBInitializer.h b/TAO/orbsvcs/orbsvcs/LoadBalancing/LB_ORBInitializer.h
new file mode 100644
index 00000000000..292e36558ab
--- /dev/null
+++ b/TAO/orbsvcs/orbsvcs/LoadBalancing/LB_ORBInitializer.h
@@ -0,0 +1,110 @@
+// -*- C++ -*-
+
+//=============================================================================
+/**
+ * @file LB_ORBInitializer.h
+ *
+ * $Id$
+ *
+ * @author Ossama Othman <ossama@uci.edu>
+ */
+//=============================================================================
+
+
+#ifndef TAO_LB_ORB_INITIALIZER_H
+#define TAO_LB_ORB_INITIALIZER_H
+
+#include /**/ "ace/pre.h"
+
+#include "orbsvcs/LoadBalancing/LB_LoadAlert.h"
+
+#if !defined (ACE_LACKS_PRAGMA_ONCE)
+# pragma once
+#endif /* ACE_LACKS_PRAGMA_ONCE */
+
+#include "tao/PI/PI.h"
+#include "tao/LocalObject.h"
+#include "tao/Versioned_Namespace.h"
+
+// This is to remove "inherits via dominance" warnings from MSVC.
+// MSVC is being a little too paranoid.
+#if defined(_MSC_VER)
+#pragma warning(push)
+#pragma warning(disable:4250)
+#endif /* _MSC_VER */
+
+TAO_BEGIN_VERSIONED_NAMESPACE_DECL
+
+/**
+ * @class TAO_LB_ORBInitializer
+ *
+ * @brief ORBInitializer for the LB_Component Service_Object.
+ *
+ * This ORBInitializer simply creates and registers with the ORB the
+ * IORInterceptor that handles transparent object group member
+ * registration with the LoadManager, and registration of the
+ * LoadAlert object necessary for load shedding.
+ *
+ * @par
+ *
+ * It also creates and registers the ServerRequestInterceptor that
+ * facilitates load shedding.
+ */
+class TAO_LB_ORBInitializer
+ : public virtual PortableInterceptor::ORBInitializer,
+ public virtual TAO_Local_RefCounted_Object
+{
+public:
+
+ /// Constructor.
+ TAO_LB_ORBInitializer (const CORBA::StringSeq & object_groups,
+ const CORBA::StringSeq & repository_ids,
+ const char * location);
+
+ /**
+ * @name PortableInterceptor::ORBInitializer Methods
+ *
+ * Methods required by the PortableInterceptor::ORBInitializer
+ * interface.
+ */
+ //@{
+ virtual void pre_init (PortableInterceptor::ORBInitInfo_ptr info
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS)
+ ACE_THROW_SPEC ((CORBA::SystemException));
+
+ virtual void post_init (PortableInterceptor::ORBInitInfo_ptr info
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS)
+ ACE_THROW_SPEC ((CORBA::SystemException));
+ //@}
+
+private:
+
+ /// List of stringified object group references.
+ const CORBA::StringSeq object_groups_;
+
+ /// List of RepositoryIds for object that will be load
+ /// managed/balanced.
+ const CORBA::StringSeq repository_ids_;
+
+ /// Location at which the LoadBalancing component resides.
+ CORBA::String_var location_;
+
+ /// The CosLoadBalancing::LoadAlert servant to be used at this
+ /// location.
+ /**
+ * This is the servant supplied by TAO's Load Balancer. It is
+ * used out of convencience.
+ */
+ TAO_LB_LoadAlert load_alert_;
+
+};
+
+TAO_END_VERSIONED_NAMESPACE_DECL
+
+#if defined(_MSC_VER)
+#pragma warning(pop)
+#endif /* _MSC_VER */
+
+#include /**/ "ace/post.h"
+
+#endif /* TAO_LB_ORB_INITIALIZER_H */
diff --git a/TAO/orbsvcs/orbsvcs/LoadBalancing/LB_ObjectReferenceFactory.cpp b/TAO/orbsvcs/orbsvcs/LoadBalancing/LB_ObjectReferenceFactory.cpp
new file mode 100644
index 00000000000..d70b23fa4f1
--- /dev/null
+++ b/TAO/orbsvcs/orbsvcs/LoadBalancing/LB_ObjectReferenceFactory.cpp
@@ -0,0 +1,258 @@
+#include "orbsvcs/LoadBalancing/LB_ObjectReferenceFactory.h"
+
+ACE_RCSID (LoadBalancing,
+ LB_ObjectReferenceFactory,
+ "$Id$")
+
+#include "tao/debug.h"
+
+#include "ace/SString.h"
+#include "ace/OS_NS_strings.h"
+#include "ace/OS_NS_string.h"
+
+
+TAO_BEGIN_VERSIONED_NAMESPACE_DECL
+
+// The number of different object groups to support.
+#ifndef TAO_LB_ORF_GROUP_TABLE_SIZE
+const size_t TAO_LB_ORF_GROUP_TABLE_SIZE = 16;
+#endif /* TAO_LB_ORF_GROUP_TABLE_SIZE */
+
+TAO_LB_ObjectReferenceFactory::TAO_LB_ObjectReferenceFactory (
+ PortableInterceptor::ObjectReferenceFactory * old_orf,
+ const CORBA::StringSeq & object_groups,
+ const CORBA::StringSeq & repository_ids,
+ const char * location,
+ CORBA::ORB_ptr orb,
+ CosLoadBalancing::LoadManager_ptr lm)
+ : old_orf_ (old_orf),
+ object_groups_ (object_groups),
+ repository_ids_ (repository_ids),
+ location_ (1),
+ table_ (TAO_LB_ORF_GROUP_TABLE_SIZE),
+ fcids_ (),
+ orb_ (CORBA::ORB::_duplicate (orb)),
+ lm_ (CosLoadBalancing::LoadManager::_duplicate (lm)),
+ registered_members_ (0)
+{
+ // Claim ownership of the old ObjectReferenceFactory.
+ CORBA::add_ref (old_orf);
+
+ this->location_.length (1);
+ this->location_[0].id = CORBA::string_dup (location);
+
+ const CORBA::ULong len = repository_ids.length ();
+ ACE_NEW (this->registered_members_,
+ CORBA::Boolean[len]);
+
+ ACE_ASSERT (this->registered_members_ != 0);
+ ACE_OS::memset (this->registered_members_,
+ 0,
+ len * sizeof (CORBA::Boolean));
+}
+
+TAO_LB_ObjectReferenceFactory::~TAO_LB_ObjectReferenceFactory (void)
+{
+ // No need to call CORBA::remove_ref() on this->old_orf_. It is a
+ // "_var" object, meaning that will be done automatically.
+
+ ACE_DECLARE_NEW_CORBA_ENV;
+
+ if (!CORBA::is_nil (this->lm_.in ()))
+ {
+ const CORBA::ULong len = this->fcids_.size ();
+ for (CORBA::ULong i = 0; i < len; ++i)
+ {
+ ACE_TRY
+ {
+ // Clean up all object groups we created.
+ this->lm_->delete_object (this->fcids_[i].in ()
+ ACE_ENV_ARG_PARAMETER);
+ ACE_TRY_CHECK;
+ }
+ ACE_CATCHANY
+ {
+ // Ignore all exceptions.
+ }
+ ACE_ENDTRY;
+ }
+ }
+
+ // @todo De-register LoadAlert objects.
+ // @todo De-register object group members.
+
+ delete [] this->registered_members_;
+}
+
+CORBA::Object_ptr
+TAO_LB_ObjectReferenceFactory::make_object (
+ const char * repository_id,
+ const PortableInterceptor::ObjectId & id
+ ACE_ENV_ARG_DECL)
+ ACE_THROW_SPEC ((CORBA::SystemException))
+{
+ if (repository_id == 0)
+ ACE_THROW_RETURN (CORBA::BAD_PARAM (), CORBA::Object::_nil ());
+
+ CORBA::Object_var obj =
+ this->old_orf_->make_object (repository_id,
+ id
+ ACE_ENV_ARG_PARAMETER);
+ ACE_CHECK_RETURN (CORBA::Object::_nil ());
+
+ PortableGroup::ObjectGroup_var object_group;
+
+ CORBA::ULong index = 0;
+
+ const CORBA::Boolean found_group =
+ this->find_object_group (repository_id,
+ index,
+ object_group.out ()
+ ACE_ENV_ARG_PARAMETER);
+ ACE_CHECK_RETURN (CORBA::Object::_nil ());
+
+ if (found_group)
+ {
+ // Be careful not to attempt duplicate registrations on
+ // subsequent object reference creation calls.
+ if (!this->registered_members_[index])
+ {
+ ACE_TRY
+ {
+ object_group =
+ this->lm_->add_member (object_group.in (),
+ this->location_,
+ obj.in ()
+ ACE_ENV_ARG_PARAMETER);
+ ACE_TRY_CHECK;
+ }
+ ACE_CATCH (PortableGroup::ObjectGroupNotFound, ex)
+ {
+ if (TAO_debug_level > 0)
+ ACE_PRINT_EXCEPTION (ex,
+ "TAO_LB_ObjectReferenceFactory::"
+ "make_object");
+
+ ACE_THROW_RETURN (CORBA::BAD_PARAM (),
+ CORBA::Object::_nil ());
+ }
+ ACE_CATCH (PortableGroup::MemberAlreadyPresent, ex)
+ {
+ if (TAO_debug_level > 0)
+ ACE_PRINT_EXCEPTION (ex,
+ "TAO_LB_ObjectReferenceFactory::"
+ "make_object");
+
+ ACE_THROW_RETURN (CORBA::BAD_INV_ORDER (),
+ CORBA::Object::_nil ());
+
+ }
+ ACE_CATCH (PortableGroup::ObjectNotAdded, ex)
+ {
+ if (TAO_debug_level > 0)
+ ACE_PRINT_EXCEPTION (ex,
+ "TAO_LB_ObjectReferenceFactory::"
+ "make_object");
+
+ ACE_THROW_RETURN (CORBA::UNKNOWN (),
+ CORBA::Object::_nil ());
+ }
+ ACE_ENDTRY;
+ ACE_CHECK_RETURN (CORBA::Object::_nil ());
+
+ this->registered_members_[index] = 1;
+ }
+
+ // Return the object group reference instead.
+ return object_group._retn ();
+ }
+
+ // Not a load managed object. Simply return the object's actual
+ // object reference.
+ return obj._retn ();
+}
+
+CORBA::Boolean
+TAO_LB_ObjectReferenceFactory::find_object_group (
+ const char * repository_id,
+ CORBA::ULong & index,
+ PortableGroup::ObjectGroup_out object_group
+ ACE_ENV_ARG_DECL)
+{
+ if (!this->load_managed_object (repository_id, index))
+ return 0;
+
+ PortableGroup::ObjectGroup_var group;
+ if (this->table_.find (repository_id, group) != 0)
+ {
+ if (ACE_OS::strcasecmp (this->object_groups_[index],
+ "CREATE") == 0)
+ {
+ PortableGroup::Criteria criteria (1);
+ criteria.length (1);
+
+ PortableGroup::Property & property = criteria[0];
+ property.nam.length (1);
+
+ property.nam[0].id =
+ CORBA::string_dup ("org.omg.PortableGroup.MembershipStyle");
+
+ // Configure for application-controlled membership.
+ PortableGroup::MembershipStyleValue msv =
+ PortableGroup::MEMB_APP_CTRL;
+ property.val <<= msv;
+
+ PortableGroup::GenericFactory::FactoryCreationId_var fcid;
+
+ group =
+ this->lm_->create_object (repository_id,
+ criteria,
+ fcid.out ()
+ ACE_ENV_ARG_PARAMETER);
+ ACE_CHECK_RETURN (0);
+
+ const CORBA::ULong len = this->fcids_.size ();
+ this->fcids_.size (len + 1); // Incremental growth. Yuck!
+ this->fcids_[len] = fcid;
+ }
+ else
+ {
+ group =
+ this->orb_->string_to_object (this->object_groups_[index]
+ ACE_ENV_ARG_PARAMETER);
+ ACE_CHECK_RETURN (0);
+ }
+
+ if (this->table_.bind (repository_id, group) != 0)
+ {
+ if (TAO_debug_level > 0)
+ ACE_ERROR ((LM_ERROR,
+ "TAO_LB_ObjectReferenceFactory::"
+ "find_object_group - "
+ "Couldn't bind object group reference.\n"));
+
+ ACE_THROW_RETURN (CORBA::INTERNAL (), 0);
+ }
+
+ object_group = group._retn ();
+ }
+
+ return 1;
+}
+
+CORBA::Boolean
+TAO_LB_ObjectReferenceFactory::load_managed_object (const char * repository_id,
+ CORBA::ULong & i)
+{
+ // @todo Make this more efficient.
+
+ const CORBA::ULong len = this->repository_ids_.length ();
+ for (i = 0; i < len; ++i)
+ if (ACE_OS::strcmp (this->repository_ids_[i], repository_id) == 0)
+ return 1;
+
+ return 0;
+}
+
+
+TAO_END_VERSIONED_NAMESPACE_DECL
diff --git a/TAO/orbsvcs/orbsvcs/LoadBalancing/LB_ObjectReferenceFactory.h b/TAO/orbsvcs/orbsvcs/LoadBalancing/LB_ObjectReferenceFactory.h
new file mode 100644
index 00000000000..81fddbe05bf
--- /dev/null
+++ b/TAO/orbsvcs/orbsvcs/LoadBalancing/LB_ObjectReferenceFactory.h
@@ -0,0 +1,179 @@
+// -*- C++ -*-
+
+//=============================================================================
+/**
+ * @file LB_ObjectReferenceFactory.h
+ *
+ * $Id$
+
+ * @author Ossama Othman <ossama@uci.edu>
+ */
+//=============================================================================
+
+#ifndef TAO_LB_OBJECT_REFERENCE_FACTORY_H
+#define TAO_LB_OBJECT_REFERENCE_FACTORY_H
+
+#include /**/ "ace/pre.h"
+
+#include "orbsvcs/LB_ORTC.h"
+
+#if !defined (ACE_LACKS_PRAGMA_ONCE)
+# pragma once
+#endif /* ACE_LACKS_PRAGMA_ONCE */
+
+#if defined(_MSC_VER)
+#pragma warning(push)
+#pragma warning(disable:4250)
+#endif /* _MSC_VER */
+
+#include "orbsvcs/CosLoadBalancingC.h"
+
+#include "ace/Array_Base.h"
+#include "ace/Hash_Map_Manager_T.h"
+#include "ace/Null_Mutex.h"
+#include "ace/SString.h"
+
+TAO_BEGIN_VERSIONED_NAMESPACE_DECL
+
+/**
+ * @class TAO_LB_ObjectReferenceFactory
+ *
+ * @brief Implementation of the PortableInterceptor::ObjectReferenceFactory
+ * interface.
+ *
+ * This ObjectReferenceFactory creates an object group for a member of
+ * the given repository ID (if instructed to do so), creates an
+ * "unpublished" reference for that member, and adds it to the object
+ * group via the LoadManager.
+ */
+class TAO_LB_ObjectReferenceFactory
+ : public virtual CORBA::DefaultValueRefCountBase
+ , public virtual OBV_TAO_LB::ObjectReferenceFactory
+{
+ public:
+
+ /// Constructor
+ TAO_LB_ObjectReferenceFactory (
+ PortableInterceptor::ObjectReferenceFactory * old_orf,
+ const CORBA::StringSeq & object_groups,
+ const CORBA::StringSeq & repository_ids,
+ const char * location,
+ CORBA::ORB_ptr orb,
+ CosLoadBalancing::LoadManager_ptr lm);
+
+ /**
+ * @name PortableInterceptor::ObjectReferenceFactory Methods
+ *
+ * Methods required by the
+ * PortableInterceptor::ObjectReferenceFactory interface.
+ */
+ //@{
+ virtual CORBA::Object_ptr make_object (
+ const char * repository_id,
+ const PortableInterceptor::ObjectId & id
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS)
+ ACE_THROW_SPEC ((CORBA::SystemException));
+ //@}
+
+
+ typedef ACE_Hash_Map_Manager_Ex<
+ ACE_CString,
+ PortableGroup::ObjectGroup_var,
+ ACE_Hash<ACE_CString>,
+ ACE_Equal_To<ACE_CString>,
+ ACE_Null_Mutex> Table;
+
+ typedef ACE_Array_Base<
+ PortableGroup::GenericFactory::FactoryCreationId_var> fcid_list;
+
+protected:
+
+ /// Destructor
+ /**
+ * Protected destructor to enforce proper memory management via
+ * reference counting.
+ */
+ ~TAO_LB_ObjectReferenceFactory (void);
+
+ /// Retrieve the object group reference for objects with the given
+ /// RepositoryId.
+ CORBA::Boolean find_object_group (const char * repository_id,
+ CORBA::ULong & index,
+ PortableGroup::ObjectGroup_out object_group
+ ACE_ENV_ARG_DECL);
+
+ /// Determine if object with given RepositoryId is load managed.
+ CORBA::Boolean load_managed_object (const char * repository_id,
+ CORBA::ULong & i);
+
+private:
+
+ /// The old ObjectReferenceFactory used to create object references.
+ /**
+ * This ObjectReferenceFactory will be used when creating object
+ * references for non-load balanced objects.
+ */
+ PortableInterceptor::ObjectReferenceFactory_var old_orf_;
+
+
+ /// List of stringified object group references.
+ /**
+ * All stringified object groups in this sequence have a one-to-one
+ * correspondence to the repository IDs found in the repository_ids_
+ * member below.
+ *
+ * @par
+ *
+ * The special string "CREATE" denotes that creation of a new object
+ * group should be performed.
+ */
+ const CORBA::StringSeq object_groups_;
+
+ /// List of RepositoryIds for object that will be load
+ /// managed/balanced.
+ /**
+ * All RepositoryIds in this sequence have a one-to-one
+ * correspondence to the stringified object references found in the
+ * object_groups_ member above.
+ */
+ const CORBA::StringSeq repository_ids_;
+
+ /// The configured location for the server within which this
+ /// ObjectReferenceFactory resides.
+ PortableGroup::Location location_;
+
+ /// Table that maps repository ID to (non-stringified) object group
+ /// reference.
+ Table table_;
+
+ /// List of FactoryCreationIds that will later be used to destroy
+ /// object groups.
+ fcid_list fcids_;
+
+ /// Pseudo-reference to the ORB.
+ CORBA::ORB_var orb_;
+
+ /// Reference to the LoadManager object.
+ CosLoadBalancing::LoadManager_var lm_;
+
+ /// Array of flags that denotes whether or not an object group
+ /// member of a given RepositoryId has been registered with the
+ /// LoadManager.
+ /**
+ * The values are cached here to avoid querying the LoadManager,
+ * which can be costly.
+ */
+ CORBA::Boolean * registered_members_;
+
+};
+
+TAO_END_VERSIONED_NAMESPACE_DECL
+
+
+#if defined (_MSC_VER)
+#pragma warning(pop)
+#endif /* _MSC_VER */
+
+#include /**/ "ace/post.h"
+
+#endif /* TAO_LB_OBJECT_REFERENCE_FACTORY_H */
diff --git a/TAO/orbsvcs/orbsvcs/LoadBalancing/LB_Pull_Handler.cpp b/TAO/orbsvcs/orbsvcs/LoadBalancing/LB_Pull_Handler.cpp
new file mode 100644
index 00000000000..5e8cdf226ec
--- /dev/null
+++ b/TAO/orbsvcs/orbsvcs/LoadBalancing/LB_Pull_Handler.cpp
@@ -0,0 +1,84 @@
+#include "orbsvcs/LoadBalancing/LB_Pull_Handler.h"
+#include "orbsvcs/LoadBalancing/LB_LoadManager.h"
+
+#include "tao/debug.h"
+
+
+ACE_RCSID (LoadBalancing,
+ LB_Pull_Handler,
+ "$Id$")
+
+
+TAO_BEGIN_VERSIONED_NAMESPACE_DECL
+
+TAO_LB_Pull_Handler::TAO_LB_Pull_Handler (void)
+ : monitor_map_ (0),
+ load_manager_ (0)
+{
+}
+
+void
+TAO_LB_Pull_Handler::initialize (TAO_LB_MonitorMap * monitor_map,
+ TAO_LB_LoadManager * load_manager)
+{
+ this->monitor_map_ = monitor_map;
+ this->load_manager_ = load_manager;
+}
+
+int
+TAO_LB_Pull_Handler::handle_timeout (
+ const ACE_Time_Value & /* current_time */,
+ const void * /* arg */)
+{
+ // @todo Fix the race condtions in this method.
+
+ TAO_LB_MonitorMap::iterator begin = this->monitor_map_->begin ();
+ TAO_LB_MonitorMap::iterator end = this->monitor_map_->end ();
+
+ if (begin == end)
+ return 0; // No work to be done.
+
+ ACE_DECLARE_NEW_CORBA_ENV;
+ ACE_TRY
+ {
+ // Iterate over all registered load monitors.
+ //
+ // @todo This could be potentially very slow. Improve concurrent
+ // operation at some point in the near future.
+ for (TAO_LB_MonitorMap::iterator i = begin; i != end; ++i)
+ {
+ const PortableGroup::Location & location = (*i).ext_id_;
+ CosLoadBalancing::LoadMonitor_var & monitor = (*i).int_id_;
+
+ // The load monitor reference should never be nil since the
+ // LoadManager prevents nil load monitor references from
+ // being registered.
+ CosLoadBalancing::LoadList_var load_list =
+ monitor->loads (ACE_ENV_SINGLE_ARG_PARAMETER);
+ ACE_TRY_CHECK;
+
+ this->load_manager_->push_loads (location,
+ load_list.in ()
+ ACE_ENV_ARG_PARAMETER);
+ ACE_TRY_CHECK;
+
+// ACE_DEBUG ((LM_DEBUG,
+// "LOCATION = %s\tLOAD = %f\n",
+// location[0].id.in (),
+// load_list[0].value));
+ }
+ }
+ ACE_CATCHANY
+ {
+ // Catch the exception and ignore it.
+
+ if (TAO_debug_level > 0)
+ ACE_PRINT_EXCEPTION (ACE_ANY_EXCEPTION,
+ "(%P|%t) PullHandler::handle_timeout()\n");
+ }
+ ACE_ENDTRY;
+
+ return 0;
+}
+
+TAO_END_VERSIONED_NAMESPACE_DECL
diff --git a/TAO/orbsvcs/orbsvcs/LoadBalancing/LB_Pull_Handler.h b/TAO/orbsvcs/orbsvcs/LoadBalancing/LB_Pull_Handler.h
new file mode 100644
index 00000000000..a18efd9d961
--- /dev/null
+++ b/TAO/orbsvcs/orbsvcs/LoadBalancing/LB_Pull_Handler.h
@@ -0,0 +1,73 @@
+// -*- C++ -*-
+
+//=======================================================================
+/**
+ * @file LB_Pull_Handler.h
+ *
+ * $Id$
+ *
+ * @author Ossama Othman <ossama@uci.edu>
+ */
+//=======================================================================
+
+
+#ifndef TAO_LB_PULL_HANDLER_H
+#define TAO_LB_PULL_HANDLER_H
+
+#include /**/ "ace/pre.h"
+
+#include "ace/config-all.h"
+
+#if !defined (ACE_LACKS_PRAGMA_ONCE)
+# pragma once
+#endif /* ACE_LACKS_PRAGMA_ONCE */
+
+#include "orbsvcs/LoadBalancing/LB_MonitorMap.h"
+
+#include "ace/Event_Handler.h"
+
+TAO_BEGIN_VERSIONED_NAMESPACE_DECL
+
+/// Forward declarations.
+class TAO_LB_LoadManager;
+
+/**
+ * @class TAO_LB_Pull_Handler
+ *
+ * @brief Event handler used when the "pull" monitoring style is
+ * configured.
+ *
+ * An event handler designed to pull loads from all load monitors
+ * registered with the load balancer.
+ */
+class TAO_LB_Pull_Handler : public ACE_Event_Handler
+{
+public:
+
+ /// Constructor
+ TAO_LB_Pull_Handler (void);
+
+ /// Receive the timeout event.
+ virtual int handle_timeout (const ACE_Time_Value &current_time,
+ const void *arg);
+
+ /// Initialize this event handler.
+ void initialize (TAO_LB_MonitorMap * monitor_map,
+ TAO_LB_LoadManager * load_manager);
+
+private:
+
+ /// The table that contains all load monitors registered with the
+ /// load balancer.
+ TAO_LB_MonitorMap * monitor_map_;
+
+ /// Pointer to the LoadManager servant.
+ TAO_LB_LoadManager * load_manager_;
+
+};
+
+TAO_END_VERSIONED_NAMESPACE_DECL
+
+#include /**/ "ace/post.h"
+
+#endif /* TAO_LB_PULL_HANDLER_H */
diff --git a/TAO/orbsvcs/orbsvcs/LoadBalancing/LB_Random.cpp b/TAO/orbsvcs/orbsvcs/LoadBalancing/LB_Random.cpp
new file mode 100644
index 00000000000..56c39655f2d
--- /dev/null
+++ b/TAO/orbsvcs/orbsvcs/LoadBalancing/LB_Random.cpp
@@ -0,0 +1,180 @@
+// -*- C++ -*-
+
+#include "orbsvcs/LoadBalancing/LB_Random.h"
+
+#include "tao/ORB_Constants.h"
+#include "ace/OS_NS_time.h"
+#include "ace/os_include/os_netdb.h"
+
+ACE_RCSID (LoadBalancing,
+ LB_Random,
+ "$Id$")
+
+#ifdef ACE_HAS_PTHREADS_STD
+static pthread_once_t tao_lb_once_control = PTHREAD_ONCE_INIT;
+#endif /* ACE_HAS_PTHREADS_STD */
+
+TAO_BEGIN_VERSIONED_NAMESPACE_DECL
+
+extern "C" void tao_lb_random_init_routine (void)
+{
+ ACE_OS::srand (static_cast<unsigned int> (ACE_OS::time ()));
+}
+
+TAO_LB_Random::TAO_LB_Random (PortableServer::POA_ptr poa)
+ : poa_ (PortableServer::POA::_duplicate (poa))
+{
+ TAO_LB_Random::init ();
+}
+
+char *
+TAO_LB_Random::name (ACE_ENV_SINGLE_ARG_DECL_NOT_USED)
+ ACE_THROW_SPEC ((CORBA::SystemException))
+{
+ return CORBA::string_dup ("Random");
+}
+
+CosLoadBalancing::Properties *
+TAO_LB_Random::get_properties (ACE_ENV_SINGLE_ARG_DECL)
+ ACE_THROW_SPEC ((CORBA::SystemException))
+{
+ CosLoadBalancing::Properties * props = 0;
+ ACE_NEW_THROW_EX (props,
+ CosLoadBalancing::Properties,
+ CORBA::NO_MEMORY (
+ CORBA::SystemException::_tao_minor_code (
+ TAO::VMCID,
+ ENOMEM),
+ CORBA::COMPLETED_NO));
+ ACE_CHECK_RETURN (props);
+
+ return props;
+}
+
+void
+TAO_LB_Random::push_loads (
+ const PortableGroup::Location & /* the_location */,
+ const CosLoadBalancing::LoadList & /* loads */
+ ACE_ENV_ARG_DECL)
+ ACE_THROW_SPEC ((CORBA::SystemException,
+ CosLoadBalancing::StrategyNotAdaptive))
+{
+ ACE_THROW (CosLoadBalancing::StrategyNotAdaptive ());
+}
+
+CosLoadBalancing::LoadList *
+TAO_LB_Random::get_loads (CosLoadBalancing::LoadManager_ptr load_manager,
+ const PortableGroup::Location & the_location
+ ACE_ENV_ARG_DECL)
+ ACE_THROW_SPEC ((CORBA::SystemException,
+ CosLoadBalancing::LocationNotFound))
+{
+ if (CORBA::is_nil (load_manager))
+ ACE_THROW_RETURN (CORBA::BAD_PARAM (), 0);
+
+ return load_manager->get_loads (the_location
+ ACE_ENV_ARG_PARAMETER);
+}
+
+CORBA::Object_ptr
+TAO_LB_Random::next_member (
+ PortableGroup::ObjectGroup_ptr object_group,
+ CosLoadBalancing::LoadManager_ptr load_manager
+ ACE_ENV_ARG_DECL)
+ ACE_THROW_SPEC ((CORBA::SystemException,
+ PortableGroup::ObjectGroupNotFound,
+ PortableGroup::MemberNotFound))
+{
+ if (CORBA::is_nil (load_manager))
+ ACE_THROW_RETURN (CORBA::BAD_PARAM (), CORBA::Object::_nil ());
+
+ PortableGroup::Locations_var locations =
+ load_manager->locations_of_members (object_group
+ ACE_ENV_ARG_PARAMETER);
+ ACE_CHECK_RETURN (CORBA::Object::_nil ());
+
+ return TAO_LB_Random::_tao_next_member (object_group,
+ load_manager,
+ locations.in ()
+ ACE_ENV_ARG_PARAMETER);
+}
+
+void
+TAO_LB_Random::analyze_loads (
+ PortableGroup::ObjectGroup_ptr /* object_group */,
+ CosLoadBalancing::LoadManager_ptr /* load_manager */
+ ACE_ENV_ARG_DECL_NOT_USED)
+ ACE_THROW_SPEC ((CORBA::SystemException))
+{
+}
+
+PortableServer::POA_ptr
+TAO_LB_Random::_default_POA (ACE_ENV_SINGLE_ARG_DECL_NOT_USED)
+{
+ return PortableServer::POA::_duplicate (this->poa_.in ());
+}
+
+CORBA::Object_ptr
+TAO_LB_Random::_tao_next_member (
+ PortableGroup::ObjectGroup_ptr object_group,
+ CosLoadBalancing::LoadManager_ptr load_manager,
+ const PortableGroup::Locations & locations
+ ACE_ENV_ARG_DECL)
+ ACE_THROW_SPEC ((CORBA::SystemException,
+ PortableGroup::ObjectGroupNotFound,
+ PortableGroup::MemberNotFound))
+{
+ const CORBA::ULong len = locations.length ();
+ if (len == 0)
+ ACE_THROW_RETURN (CORBA::TRANSIENT (),
+ CORBA::Object::_nil ());
+
+ // Pick a random location in the sequence using the higher order
+ // bits (zero based indexing).
+ //
+ // See Numerical Recipes in C: The Art of Scientific Computing
+ // (William H. Press, Brian P. Flannery, Saul A. Teukolsky,
+ // William T. Vetterling; New York: Cambridge University Press,
+ // 1992 (2nd ed., p. 277)) for details on why using the lower order
+ // bits, as in (rand() % 10), is bad. In particular, the lower
+ // order bits in older rand() implementations may not be as random
+ // as the higher order bits.
+ //
+ // @todo It would be better to use the random() function since it
+ // is supposed to have a larger period than rand(), in
+ // addition to the fact that the lower order bits should be as
+ // random as the higher order bits.
+
+ // Prevent integer arithmetic overflow.
+ const CORBA::Float flen = static_cast<CORBA::Float> (len);
+
+ const CORBA::ULong i =
+ static_cast<CORBA::ULong> (flen * ACE_OS::rand () / (RAND_MAX + 1.0));
+
+ ACE_ASSERT (i < len);
+
+// ACE_DEBUG ((LM_DEBUG,
+// "** Len = %u\t"
+// "Location # %u\t"
+// "Loc Name = \"%s\"\n",
+// len,
+// i,
+// locations[i][0].id.in ()));
+
+ return load_manager->get_member_ref (object_group,
+ locations[i]
+ ACE_ENV_ARG_PARAMETER);
+}
+
+void
+TAO_LB_Random::init (void)
+{
+#ifdef ACE_HAS_PTHREADS_STD
+ (void) ::pthread_once (&::tao_lb_once_control,
+ ::tao_lb_random_init_routine);
+#else
+ ::tao_lb_random_init_routine ();
+#endif /* ACE_HAS_PTHREADS_STD */
+}
+
+TAO_END_VERSIONED_NAMESPACE_DECL
diff --git a/TAO/orbsvcs/orbsvcs/LoadBalancing/LB_Random.h b/TAO/orbsvcs/orbsvcs/LoadBalancing/LB_Random.h
new file mode 100644
index 00000000000..af5bea2b038
--- /dev/null
+++ b/TAO/orbsvcs/orbsvcs/LoadBalancing/LB_Random.h
@@ -0,0 +1,124 @@
+// -*- C++ -*-
+
+//=============================================================================
+/**
+ * @file LB_Random.h
+ *
+ * $Id$
+ *
+ * @author Ossama Othman <ossama@uci.edu>
+ */
+//=============================================================================
+
+
+#ifndef LB_RANDOM_H
+#define LB_RANDOM_H
+
+#include /**/ "ace/pre.h"
+
+#include "orbsvcs/CosLoadBalancingS.h"
+
+# if !defined (ACE_LACKS_PRAGMA_ONCE)
+# pragma once
+# endif /* ACE_LACKS_PRAGMA_ONCE */
+
+
+TAO_BEGIN_VERSIONED_NAMESPACE_DECL
+
+/**
+ * @class TAO_LB_Random
+ *
+ * @brief "Random" load balancing strategy
+ *
+ * This load balancing strategy is designed to select an object group
+ * member residing at a random location.
+ */
+class TAO_LB_Random
+ : public virtual POA_CosLoadBalancing::Strategy
+{
+public:
+
+ /// Constructor.
+ /**
+ * Seeds the OS' random number generator.
+ */
+ TAO_LB_Random (PortableServer::POA_ptr poa);
+
+ /**
+ * @name CosLoadBalancing::Strategy methods
+ *
+ * Methods required by the CosLoadBalancing::Strategy interface.
+ */
+ //@{
+ virtual char * name (ACE_ENV_SINGLE_ARG_DECL_WITH_DEFAULTS)
+ ACE_THROW_SPEC ((CORBA::SystemException));
+
+ virtual CosLoadBalancing::Properties * get_properties (
+ ACE_ENV_SINGLE_ARG_DECL_WITH_DEFAULTS)
+ ACE_THROW_SPEC ((CORBA::SystemException));
+
+ virtual void push_loads (
+ const PortableGroup::Location & the_location,
+ const CosLoadBalancing::LoadList & loads
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS)
+ ACE_THROW_SPEC ((CORBA::SystemException,
+ CosLoadBalancing::StrategyNotAdaptive));
+
+ virtual CosLoadBalancing::LoadList * get_loads (
+ CosLoadBalancing::LoadManager_ptr load_manager,
+ const PortableGroup::Location & the_location
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS)
+ ACE_THROW_SPEC ((CORBA::SystemException,
+ CosLoadBalancing::LocationNotFound));
+
+ virtual CORBA::Object_ptr next_member (
+ PortableGroup::ObjectGroup_ptr object_group,
+ CosLoadBalancing::LoadManager_ptr load_manager
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS)
+ ACE_THROW_SPEC ((CORBA::SystemException,
+ PortableGroup::ObjectGroupNotFound,
+ PortableGroup::MemberNotFound));
+
+ virtual void analyze_loads (
+ PortableGroup::ObjectGroup_ptr object_group,
+ CosLoadBalancing::LoadManager_ptr load_manager
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS)
+ ACE_THROW_SPEC ((CORBA::SystemException));
+ //@}
+
+ /// Returns the default POA for this servant.
+ virtual PortableServer::POA_ptr _default_POA (
+ ACE_ENV_SINGLE_ARG_DECL_WITH_DEFAULTS
+ );
+
+ /// TAO-specific underlying implementation of this Random load
+ /// balancing strategy's next_member() method.
+ static CORBA::Object_ptr _tao_next_member (
+ PortableGroup::ObjectGroup_ptr object_group,
+ CosLoadBalancing::LoadManager_ptr load_manager,
+ const PortableGroup::Locations & locations
+ ACE_ENV_ARG_DECL)
+ ACE_THROW_SPEC ((CORBA::SystemException,
+ PortableGroup::ObjectGroupNotFound,
+ PortableGroup::MemberNotFound));
+
+ /// Initialize the random load balancing strategy.
+ /**
+ * If supported by the platform, initialization code will only run
+ * once for a given process.
+ */
+ static void init (void);
+
+private:
+
+ /// This servant's default POA.
+ PortableServer::POA_var poa_;
+
+};
+
+TAO_END_VERSIONED_NAMESPACE_DECL
+
+
+#include /**/ "ace/post.h"
+
+#endif /* LB_RANDOM_H */
diff --git a/TAO/orbsvcs/orbsvcs/LoadBalancing/LB_RoundRobin.cpp b/TAO/orbsvcs/orbsvcs/LoadBalancing/LB_RoundRobin.cpp
new file mode 100644
index 00000000000..ab865f8020e
--- /dev/null
+++ b/TAO/orbsvcs/orbsvcs/LoadBalancing/LB_RoundRobin.cpp
@@ -0,0 +1,171 @@
+// -*- C++ -*-
+
+#include "orbsvcs/LoadBalancing/LB_RoundRobin.h"
+
+#include "orbsvcs/PortableGroup/PG_conf.h"
+
+#include "tao/debug.h"
+#include "tao/ORB_Constants.h"
+
+ACE_RCSID (LoadBalancing,
+ LB_RoundRobin,
+ "$Id$")
+
+TAO_BEGIN_VERSIONED_NAMESPACE_DECL
+
+TAO_LB_RoundRobin::TAO_LB_RoundRobin (PortableServer::POA_ptr poa)
+ : poa_ (PortableServer::POA::_duplicate (poa)),
+ lock_ (),
+ location_index_map_ (TAO_PG_MAX_OBJECT_GROUPS)
+{
+}
+
+TAO_LB_RoundRobin::~TAO_LB_RoundRobin (void)
+{
+}
+
+char *
+TAO_LB_RoundRobin::name (ACE_ENV_SINGLE_ARG_DECL_NOT_USED)
+ ACE_THROW_SPEC ((CORBA::SystemException))
+{
+ return CORBA::string_dup ("RoundRobin");
+}
+
+CosLoadBalancing::Properties *
+TAO_LB_RoundRobin::get_properties (ACE_ENV_SINGLE_ARG_DECL)
+ ACE_THROW_SPEC ((CORBA::SystemException))
+{
+ // There are no RoundRobin properties. Return an empty property
+ // list.
+
+ CosLoadBalancing::Properties * props = 0;
+ ACE_NEW_THROW_EX (props,
+ CosLoadBalancing::Properties,
+ CORBA::NO_MEMORY (
+ CORBA::SystemException::_tao_minor_code (
+ TAO::VMCID,
+ ENOMEM),
+ CORBA::COMPLETED_NO));
+ ACE_CHECK_RETURN (props);
+
+ return props;
+}
+
+void
+TAO_LB_RoundRobin::push_loads (
+ const PortableGroup::Location & /* the_location */,
+ const CosLoadBalancing::LoadList & /* loads */
+ ACE_ENV_ARG_DECL)
+ ACE_THROW_SPEC ((CORBA::SystemException,
+ CosLoadBalancing::StrategyNotAdaptive))
+{
+ ACE_THROW (CosLoadBalancing::StrategyNotAdaptive ());
+}
+
+CosLoadBalancing::LoadList *
+TAO_LB_RoundRobin::get_loads (CosLoadBalancing::LoadManager_ptr load_manager,
+ const PortableGroup::Location & the_location
+ ACE_ENV_ARG_DECL)
+ ACE_THROW_SPEC ((CORBA::SystemException,
+ CosLoadBalancing::LocationNotFound))
+{
+ if (CORBA::is_nil (load_manager))
+ ACE_THROW_RETURN (CORBA::BAD_PARAM (), 0);
+
+ return load_manager->get_loads (the_location
+ ACE_ENV_ARG_PARAMETER);
+}
+
+CORBA::Object_ptr
+TAO_LB_RoundRobin::next_member (
+ PortableGroup::ObjectGroup_ptr object_group,
+ CosLoadBalancing::LoadManager_ptr load_manager
+ ACE_ENV_ARG_DECL)
+ ACE_THROW_SPEC ((CORBA::SystemException,
+ PortableGroup::ObjectGroupNotFound,
+ PortableGroup::MemberNotFound))
+{
+ if (CORBA::is_nil (load_manager))
+ ACE_THROW_RETURN (CORBA::BAD_PARAM (), CORBA::Object::_nil ());
+
+ const PortableGroup::ObjectGroupId id =
+ load_manager->get_object_group_id (object_group
+ ACE_ENV_ARG_PARAMETER);
+ ACE_CHECK_RETURN (CORBA::Object::_nil ());
+
+ ACE_GUARD_RETURN (TAO_SYNCH_MUTEX,
+ monitor,
+ this->lock_,
+ CORBA::Object::_nil ());
+
+ // Since this is "built-in" strategy, the LoadManager is collocated.
+ // There is no need to release the lock during the following
+ // invocation.
+ //
+ // There is a race condition here. The
+ PortableGroup::Locations_var locations =
+ load_manager->locations_of_members (object_group
+ ACE_ENV_ARG_PARAMETER);
+ ACE_CHECK_RETURN (CORBA::Object::_nil ());
+
+ const CORBA::ULong len = locations->length ();
+
+ if (len == 0)
+ ACE_THROW_RETURN (CORBA::TRANSIENT (),
+ CORBA::Object::_nil ());
+
+ TAO_LB_Location_Index_Map::ENTRY * entry;
+ if (this->location_index_map_.find (id, entry) == 0)
+ {
+ CORBA::ULong & i = entry->int_id_;
+
+ if (len <= i)
+ i = 0; // Reset, i.e. wrap around
+
+ // No need to release the lock since the LoadManager is
+ // collocated.
+ CORBA::Object_var member =
+ load_manager->get_member_ref (object_group,
+ locations[i]
+ ACE_ENV_ARG_PARAMETER);
+ ACE_CHECK_RETURN (CORBA::Object::_nil ());
+
+ // Increment index to point to next location.
+ i++;
+
+ return member._retn ();
+ }
+
+ // The first time through this method. Set up for the next time
+ // around, and return the object reference residing at the first
+ // location in the "locations of members" sequence.
+
+ // Note that it is safe to set the next_index below to 1 even if the
+ // length of the sequence is 1 since the above code handles the
+ // boundary case correctly by wrapping around.
+
+ const CORBA::ULong index = 0;
+ if (this->location_index_map_.bind (id, index + 1) != 0)
+ ACE_THROW_RETURN (CORBA::INTERNAL (), CORBA::Object::_nil ());
+
+ return load_manager->get_member_ref (object_group,
+ locations[index]
+ ACE_ENV_ARG_PARAMETER);
+}
+
+void
+TAO_LB_RoundRobin::analyze_loads (
+ PortableGroup::ObjectGroup_ptr /* object_group */,
+ CosLoadBalancing::LoadManager_ptr /* load_manager */
+ ACE_ENV_ARG_DECL_NOT_USED)
+ ACE_THROW_SPEC ((CORBA::SystemException))
+{
+}
+
+PortableServer::POA_ptr
+TAO_LB_RoundRobin::_default_POA (ACE_ENV_SINGLE_ARG_DECL_NOT_USED)
+{
+ return PortableServer::POA::_duplicate (this->poa_.in ());
+}
+
+TAO_END_VERSIONED_NAMESPACE_DECL
diff --git a/TAO/orbsvcs/orbsvcs/LoadBalancing/LB_RoundRobin.h b/TAO/orbsvcs/orbsvcs/LoadBalancing/LB_RoundRobin.h
new file mode 100644
index 00000000000..a96a1120223
--- /dev/null
+++ b/TAO/orbsvcs/orbsvcs/LoadBalancing/LB_RoundRobin.h
@@ -0,0 +1,127 @@
+// -*- C++ -*-
+
+//=============================================================================
+/**
+ * @file LB_RoundRobin.h
+ *
+ * $Id$
+ *
+ * @author Ossama Othman <ossama@uci.edu>
+ */
+//=============================================================================
+
+
+#ifndef LB_ROUND_ROBIN_H
+#define LB_ROUND_ROBIN_H
+
+#include /**/ "ace/pre.h"
+
+#include "ace/Null_Mutex.h"
+
+# if !defined (ACE_LACKS_PRAGMA_ONCE)
+# pragma once
+# endif /* ACE_LACKS_PRAGMA_ONCE */
+
+#include "orbsvcs/LoadBalancing/LB_Location_Index_Map.h"
+
+#include "orbsvcs/CosLoadBalancingS.h"
+
+
+TAO_BEGIN_VERSIONED_NAMESPACE_DECL
+
+/**
+ * @class TAO_LB_RoundRobin_Strategy
+ *
+ * @brief "Round Robin" load balancing strategy
+ *
+ * This load balancing strategy is designed to select an object group
+ * member residing at the next location.
+ */
+class TAO_LB_RoundRobin
+ : public virtual POA_CosLoadBalancing::Strategy
+{
+public:
+
+ /// Constructor.
+ TAO_LB_RoundRobin (PortableServer::POA_ptr poa);
+
+ /**
+ * @name CosLoadBalancing::Strategy methods
+ *
+ * Methods required by the CosLoadBalancing::Strategy interface.
+ */
+ //@{
+ virtual char * name (ACE_ENV_SINGLE_ARG_DECL_WITH_DEFAULTS)
+ ACE_THROW_SPEC ((CORBA::SystemException));
+
+ virtual CosLoadBalancing::Properties * get_properties (
+ ACE_ENV_SINGLE_ARG_DECL_WITH_DEFAULTS)
+ ACE_THROW_SPEC ((CORBA::SystemException));
+
+ virtual void push_loads (
+ const PortableGroup::Location & the_location,
+ const CosLoadBalancing::LoadList & loads
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS)
+ ACE_THROW_SPEC ((CORBA::SystemException,
+ CosLoadBalancing::StrategyNotAdaptive));
+
+ virtual CosLoadBalancing::LoadList * get_loads (
+ CosLoadBalancing::LoadManager_ptr load_manager,
+ const PortableGroup::Location & the_location
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS)
+ ACE_THROW_SPEC ((CORBA::SystemException,
+ CosLoadBalancing::LocationNotFound));
+
+ virtual CORBA::Object_ptr next_member (
+ PortableGroup::ObjectGroup_ptr object_group,
+ CosLoadBalancing::LoadManager_ptr load_manager
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS)
+ ACE_THROW_SPEC ((CORBA::SystemException,
+ PortableGroup::ObjectGroupNotFound,
+ PortableGroup::MemberNotFound));
+
+ virtual void analyze_loads (
+ PortableGroup::ObjectGroup_ptr object_group,
+ CosLoadBalancing::LoadManager_ptr load_manager
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS)
+ ACE_THROW_SPEC ((CORBA::SystemException));
+ //@}
+
+ /// Returns the default POA for this servant.
+ virtual PortableServer::POA_ptr _default_POA (
+ ACE_ENV_SINGLE_ARG_DECL_WITH_DEFAULTS
+ );
+
+protected:
+
+ /// Destructor
+ ~TAO_LB_RoundRobin (void);
+
+private:
+
+ /// This servant's default POA.
+ PortableServer::POA_var poa_;
+
+ /// Lock used to ensure atomic access to state retained by this
+ /// class.
+ TAO_SYNCH_MUTEX lock_;
+
+ /// Table that maps PortableGroup::ObjectGroupId to location
+ /// sequence index specific to a given object group.
+ /**
+ * The location sequence corresponds to the sequence containing the
+ * locations of the members of a given object group. The value
+ * stored in this map corresponds to the index of the next element
+ * in that sequence. For example, if the index stored in the map is
+ * 2, location[2] will be used when retrieving the object reference
+ * to be returned from the Strategy::next_member() method.
+ */
+ TAO_LB_Location_Index_Map location_index_map_;
+
+};
+
+TAO_END_VERSIONED_NAMESPACE_DECL
+
+#include /**/ "ace/post.h"
+
+#endif /* LB_ROUND_ROBIN_H */
diff --git a/TAO/orbsvcs/orbsvcs/LoadBalancing/LB_ServerRequestInterceptor.cpp b/TAO/orbsvcs/orbsvcs/LoadBalancing/LB_ServerRequestInterceptor.cpp
new file mode 100644
index 00000000000..10bb3303a39
--- /dev/null
+++ b/TAO/orbsvcs/orbsvcs/LoadBalancing/LB_ServerRequestInterceptor.cpp
@@ -0,0 +1,182 @@
+#include "orbsvcs/LoadBalancing/LB_ServerRequestInterceptor.h"
+#include "orbsvcs/LoadBalancing/LB_LoadAlert.h"
+
+#include "tao/debug.h"
+
+#include "ace/OS_NS_string.h"
+
+
+ACE_RCSID (LoadBalancing,
+ LB_ServerRequestInterceptor,
+ "$Id$")
+
+TAO_BEGIN_VERSIONED_NAMESPACE_DECL
+
+TAO_LB_ServerRequestInterceptor::TAO_LB_ServerRequestInterceptor (
+ TAO_LB_LoadAlert & load_alert)
+ : load_alert_ (load_alert)
+{
+}
+
+TAO_LB_ServerRequestInterceptor::~TAO_LB_ServerRequestInterceptor (void)
+{
+}
+
+char *
+TAO_LB_ServerRequestInterceptor::name (ACE_ENV_SINGLE_ARG_DECL_NOT_USED)
+ ACE_THROW_SPEC ((CORBA::SystemException))
+{
+ return CORBA::string_dup ("TAO_LB_ServerRequestInterceptor");
+}
+
+void
+TAO_LB_ServerRequestInterceptor::destroy (ACE_ENV_SINGLE_ARG_DECL_NOT_USED)
+ ACE_THROW_SPEC ((CORBA::SystemException))
+{
+}
+
+void
+TAO_LB_ServerRequestInterceptor::receive_request_service_contexts (
+ PortableInterceptor::ServerRequestInfo_ptr ri
+ ACE_ENV_ARG_DECL)
+ ACE_THROW_SPEC ((CORBA::SystemException,
+ PortableInterceptor::ForwardRequest))
+{
+ if (this->load_alert_.alerted ())
+ {
+ CORBA::String_var op = ri->operation (ACE_ENV_SINGLE_ARG_PARAMETER);
+ ACE_CHECK;
+
+ if (ACE_OS::strcmp (op.in (), "_get_loads") == 0 // LoadMonitor
+ || ACE_OS::strcmp (op.in (), "disable_alert") == 0 // LoadAlert
+ || ACE_OS::strcmp (op.in (), "enable_alert") == 0) // LoadAlert
+ return; // Do not redirect.
+
+#if 0
+ ACE_TRY
+ {
+ IOP::ServiceContext_var service_context =
+ ri->get_request_service_context (CosLoadBalancing::LOAD_MANAGED
+ ACE_ENV_ARG_PARAMETER);
+ ACE_TRY_CHECK;
+
+ /*
+ // Use TAO-specific "compiled marshaling" instead of
+ // standard interpretive marshaling via a CDR encapsulation
+ // Codec for efficiency reasons.
+ const char * buf =
+ reinterpret_cast<const char *> (service_context->context_data.get_buffer ());
+ TAO_InputCDR cdr (buf,
+ service_context->context_data.length ());
+
+ CORBA::Boolean byte_order;
+ if ((cdr >> ACE_InputCDR::to_boolean (byte_order)) == 0)
+ ACE_TRY_THROW (CORBA::BAD_PARAM ());
+
+ cdr.reset_byte_order (static_cast<int> (byte_order));
+
+ CORBA::Object_var object_group;
+ if (cdr >> object_group.out ())
+ ACE_TRY_THROW (PortableInterceptor::ForwardRequest (object_group.in (),
+ 0));
+ else
+ ACE_TRY_THROW (CORBA::BAD_PARAM ());
+ */
+
+ // A ServiceContext of the given ServiceId exists. This
+ // means that the target is load balanced. Force the client
+ // to try another profile since this location is currently
+ // overloaded.
+ ACE_TRY_THROW (CORBA::TRANSIENT ());
+ }
+ ACE_CATCH (CORBA::BAD_PARAM, ex)
+ {
+ // No CosLoadBalancing::LB_GROUP_REF ServiceContext. This
+ // probably means that the target object is not
+ // LoadBalanced.
+
+ // There is a huge DoS attack vulnerability with this load
+ // shedding model. The model relies on the client behaving
+ // correctly. In particular, it relies on the client to
+ // send the forward object group reference in the
+ // ServiceContextList. Any "misbehaving" client can avoid
+ // that, in which case no load will ever be shed!
+
+
+ // Make sure we get a CORBA::BAD_PARAM for the right
+ // reason.
+ if (ex.minor () != (CORBA::OMGVMCID | 26))
+ ACE_RE_THROW;
+ }
+ ACE_ENDTRY;
+ ACE_CHECK;
+#else
+ // Force the client to try another profile since this location
+ // is currently overloaded.
+ //
+ // NOTE: This applies to both load balanced and non-load
+ // balanced targets.
+ ACE_THROW (CORBA::TRANSIENT ());
+#endif /* 0 */
+ }
+}
+
+void
+TAO_LB_ServerRequestInterceptor::receive_request (
+ PortableInterceptor::ServerRequestInfo_ptr
+ ACE_ENV_ARG_DECL_NOT_USED)
+ ACE_THROW_SPEC ((CORBA::SystemException,
+ PortableInterceptor::ForwardRequest))
+{
+}
+
+void
+TAO_LB_ServerRequestInterceptor::send_reply (
+ PortableInterceptor::ServerRequestInfo_ptr /* ri */
+ ACE_ENV_ARG_DECL_NOT_USED)
+ ACE_THROW_SPEC ((CORBA::SystemException))
+{
+}
+
+void
+TAO_LB_ServerRequestInterceptor::send_exception (
+ PortableInterceptor::ServerRequestInfo_ptr
+ ACE_ENV_ARG_DECL_NOT_USED)
+ ACE_THROW_SPEC ((CORBA::SystemException,
+ PortableInterceptor::ForwardRequest))
+{
+ if (TAO_debug_level > 0)
+ {
+ // A CORBA::TRANSIENT is thrown when the LoadManager informs the
+ // LoadAlert object that its member is overloaded, for example.
+
+ ACE_DEBUG ((LM_INFO,
+ ACE_TEXT ("TAO_LB_ServerRequestInterceptor -- ")
+ ACE_TEXT ("Exception thrown.\n")));
+ }
+}
+
+void
+TAO_LB_ServerRequestInterceptor::send_other (
+ PortableInterceptor::ServerRequestInfo_ptr ri
+ ACE_ENV_ARG_DECL)
+ ACE_THROW_SPEC ((CORBA::SystemException,
+ PortableInterceptor::ForwardRequest))
+{
+ if (TAO_debug_level > 0)
+ {
+ // A location forward occurs when the LoadManager informs the
+ // LoadAlert object that its member is overloaded, for example.
+
+ const PortableInterceptor::ReplyStatus status =
+ ri->reply_status (ACE_ENV_SINGLE_ARG_PARAMETER);
+ ACE_CHECK;
+
+ if (status == PortableInterceptor::LOCATION_FORWARD)
+ ACE_DEBUG ((LM_INFO,
+ ACE_TEXT ("TAO_LB_ServerRequestInterceptor -- ")
+ ACE_TEXT ("LOCATION FORWARDED\n")));
+ }
+}
+
+TAO_END_VERSIONED_NAMESPACE_DECL
diff --git a/TAO/orbsvcs/orbsvcs/LoadBalancing/LB_ServerRequestInterceptor.h b/TAO/orbsvcs/orbsvcs/LoadBalancing/LB_ServerRequestInterceptor.h
new file mode 100644
index 00000000000..a3a94008a27
--- /dev/null
+++ b/TAO/orbsvcs/orbsvcs/LoadBalancing/LB_ServerRequestInterceptor.h
@@ -0,0 +1,125 @@
+// -*- C++ -*-
+
+//=============================================================================
+/**
+ * @file LB_ServerRequestInterceptor.h
+ *
+ * $Id$
+ *
+ * @author Ossama Othman <ossama@uci.edu>
+ */
+//=============================================================================
+
+
+#ifndef TAO_LB_SERVER_REQUEST_INTERCEPTOR_H
+#define TAO_LB_SERVER_REQUEST_INTERCEPTOR_H
+
+#include /**/ "ace/pre.h"
+
+#include "ace/config-all.h"
+
+#include "orbsvcs/LoadBalancing/LoadBalancing_export.h"
+
+#if !defined (ACE_LACKS_PRAGMA_ONCE)
+# pragma once
+#endif /* ACE_LACKS_PRAGMA_ONCE */
+
+#include "tao/PI_Server/PI_Server.h"
+#include "tao/PortableInterceptorC.h"
+#include "tao/LocalObject.h"
+
+#if defined(_MSC_VER)
+#pragma warning(push)
+#pragma warning(disable:4250)
+#endif /* _MSC_VER */
+
+TAO_BEGIN_VERSIONED_NAMESPACE_DECL
+
+class TAO_LB_LoadAlert;
+
+/**
+ * @class TAO_LB_ServerRequestInterceptor
+ *
+ * @brief ServerRequestInterceptor that interacts with the TAO-shipped
+ * LoadAlert implementation.
+ *
+ * This ServerRequestInterceptor is responsible for redirecting
+ * requests back to the LoadManager.
+ */
+class TAO_LoadBalancing_Export TAO_LB_ServerRequestInterceptor
+ : public virtual PortableInterceptor::ServerRequestInterceptor,
+ public virtual TAO_Local_RefCounted_Object
+{
+public:
+
+ /// Constructor.
+ TAO_LB_ServerRequestInterceptor (TAO_LB_LoadAlert & load_alert);
+
+ /**
+ * @name Methods Required by the ServerRequestInterceptor
+ * Interface
+ *
+ * These are the canonical methods required for all
+ * ServerRequestInterceptors.
+ */
+ //@{
+ virtual char * name (ACE_ENV_SINGLE_ARG_DECL_WITH_DEFAULTS)
+ ACE_THROW_SPEC ((CORBA::SystemException));
+
+ virtual void destroy (ACE_ENV_SINGLE_ARG_DECL_WITH_DEFAULTS)
+ ACE_THROW_SPEC ((CORBA::SystemException));
+
+ virtual void receive_request_service_contexts (
+ PortableInterceptor::ServerRequestInfo_ptr ri
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS)
+ ACE_THROW_SPEC ((CORBA::SystemException,
+ PortableInterceptor::ForwardRequest));
+
+ virtual void receive_request (
+ PortableInterceptor::ServerRequestInfo_ptr ri
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS)
+ ACE_THROW_SPEC ((CORBA::SystemException,
+ PortableInterceptor::ForwardRequest));
+
+ virtual void send_reply (
+ PortableInterceptor::ServerRequestInfo_ptr ri
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS)
+ ACE_THROW_SPEC ((CORBA::SystemException));
+
+ virtual void send_exception (
+ PortableInterceptor::ServerRequestInfo_ptr ri
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS)
+ ACE_THROW_SPEC ((CORBA::SystemException,
+ PortableInterceptor::ForwardRequest));
+
+ virtual void send_other (
+ PortableInterceptor::ServerRequestInfo_ptr ri
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS)
+ ACE_THROW_SPEC ((CORBA::SystemException,
+ PortableInterceptor::ForwardRequest));
+ //@}
+
+protected:
+
+ /// Destructor.
+ /**
+ * Protected destructor to enforce correct memory management via
+ * reference counting.
+ */
+ ~TAO_LB_ServerRequestInterceptor (void);
+
+private:
+
+ TAO_LB_LoadAlert & load_alert_;
+
+};
+
+TAO_END_VERSIONED_NAMESPACE_DECL
+
+#if defined(_MSC_VER)
+#pragma warning(pop)
+#endif /* _MSC_VER */
+
+#include /**/ "ace/post.h"
+
+#endif /* TAO_LB_SERVER_REQUEST_INTERCEPTOR_H */
diff --git a/TAO/orbsvcs/orbsvcs/LoadBalancing/LB_conf.h b/TAO/orbsvcs/orbsvcs/LoadBalancing/LB_conf.h
new file mode 100644
index 00000000000..9c65aba972c
--- /dev/null
+++ b/TAO/orbsvcs/orbsvcs/LoadBalancing/LB_conf.h
@@ -0,0 +1,45 @@
+// -*- C++ -*-
+
+//=============================================================================
+/**
+ * @file LB_conf.h
+ *
+ * $Id$
+ *
+ * @author Ossama Othman <ossama@uci.edu>
+ */
+//=============================================================================
+
+
+#ifndef TAO_LB_CONF_H
+#define TAO_LB_CONF_H
+
+#include /**/ "ace/pre.h"
+
+#include "ace/config-all.h"
+
+#if !defined (ACE_LACKS_PRAGMA_ONCE)
+#pragma once
+#endif /* ACE_LACKS_PRAGMA_ONCE */
+
+#include "tao/Versioned_Namespace.h"
+
+TAO_BEGIN_VERSIONED_NAMESPACE_DECL
+
+#ifndef TAO_LB_PULL_HANDLER_INTERVAL
+/// The interval in seconds the load balancer queries registered load
+/// monitors for loads.
+const long TAO_LB_PULL_HANDLER_INTERVAL = 5;
+#endif /* TAO_LB_PULL_HANDLER_INTERVAL */
+
+#ifndef TAO_LB_PULL_HANDLER_RESTART
+/// The time in seconds the load balancer's "pull handler" is
+/// restarted after being fired.
+const long TAO_LB_PULL_HANDLER_RESTART = 5;
+#endif /* TAO_LB_PULL_HANDLER_RESTART */
+
+TAO_END_VERSIONED_NAMESPACE_DECL
+
+#include /**/ "ace/post.h"
+
+#endif /* TAO_LB_CONF_H */
diff --git a/TAO/orbsvcs/orbsvcs/LoadBalancing/LoadBalancing_export.h b/TAO/orbsvcs/orbsvcs/LoadBalancing/LoadBalancing_export.h
new file mode 100644
index 00000000000..10ec8a56fe1
--- /dev/null
+++ b/TAO/orbsvcs/orbsvcs/LoadBalancing/LoadBalancing_export.h
@@ -0,0 +1,40 @@
+
+// -*- C++ -*-
+// $Id$
+// Definition for Win32 Export directives.
+// This file is generated automatically by generate_export_file.pl
+// ------------------------------
+#ifndef TAO_LOADBALANCING_EXPORT_H
+#define TAO_LOADBALANCING_EXPORT_H
+
+#include "ace/config-all.h"
+
+#if defined (TAO_AS_STATIC_LIBS)
+# if !defined (TAO_LOADBALANCING_HAS_DLL)
+# define TAO_LOADBALANCING_HAS_DLL 0
+# endif /* ! TAO_LOADBALANCING_HAS_DLL */
+#else
+# if !defined (TAO_LOADBALANCING_HAS_DLL)
+# define TAO_LOADBALANCING_HAS_DLL 1
+# endif /* ! TAO_LOADBALANCING_HAS_DLL */
+#endif
+
+#if defined (TAO_LOADBALANCING_HAS_DLL) && (TAO_LOADBALANCING_HAS_DLL == 1)
+# if defined (TAO_LOADBALANCING_BUILD_DLL)
+# define TAO_LoadBalancing_Export ACE_Proper_Export_Flag
+# define TAO_LOADBALANCING_SINGLETON_DECLARATION(T) ACE_EXPORT_SINGLETON_DECLARATION (T)
+# define TAO_LOADBALANCING_SINGLETON_DECLARE(SINGLETON_TYPE, CLASS, LOCK) ACE_EXPORT_SINGLETON_DECLARE(SINGLETON_TYPE, CLASS, LOCK)
+# else /* TAO_LOADBALANCING_BUILD_DLL */
+# define TAO_LoadBalancing_Export ACE_Proper_Import_Flag
+# define TAO_LOADBALANCING_SINGLETON_DECLARATION(T) ACE_IMPORT_SINGLETON_DECLARATION (T)
+# define TAO_LOADBALANCING_SINGLETON_DECLARE(SINGLETON_TYPE, CLASS, LOCK) ACE_IMPORT_SINGLETON_DECLARE(SINGLETON_TYPE, CLASS, LOCK)
+# endif /* TAO_LOADBALANCING_BUILD_DLL */
+#else /* TAO_LOADBALANCING_HAS_DLL == 1 */
+# define TAO_LoadBalancing_Export
+# define TAO_LOADBALANCING_SINGLETON_DECLARATION(T)
+# define TAO_LOADBALANCING_SINGLETON_DECLARE(SINGLETON_TYPE, CLASS, LOCK)
+#endif /* TAO_LOADBALANCING_HAS_DLL == 1 */
+
+#endif /* TAO_LOADBALANCING_EXPORT_H */
+
+// End of auto generated file.
diff --git a/TAO/orbsvcs/orbsvcs/LoadBalancing/README b/TAO/orbsvcs/orbsvcs/LoadBalancing/README
new file mode 100644
index 00000000000..175e8e074fd
--- /dev/null
+++ b/TAO/orbsvcs/orbsvcs/LoadBalancing/README
@@ -0,0 +1,35 @@
+This directory contains the implementations of the TAO Load Balancing
+service, which is called as Cygnus.
+
+Cygnus currently implements the latest revision of the OMG Load Balancing
+and Monitoring proposed specification. The features and advantages of
+Cygnus include:
+1. Multiple object group support.
+2. Extensible load balancing strategies through IDL interface.
+3. Extensible load monitoring.
+4. Support for push and pull style monitoring.
+5. Support for infrastructure and application controlled memberships.
+6. Efficient server side transparency.
+7. Default implementations of well known load balancing strategies.
+
+Future Work targeted:
+1. Implement a distributed load balancing service.
+2. Implement stateful load balancing service.
+3. Implement self adaptive load balancing strategies using control
+theoretical techniques.
+
+Papers about Cygnus:
+1. Ossama Othman, Carlos O'Ryan, and Douglas C. Schmidt, The Design of an
+Adaptive CORBA Load Balancing Service, IEEE Distributed Systems Online, Volume
+2, Number 4, April, 2001.
+2. Ossama Othman, Carlos O'Ryan, and Douglas C. Schmidt, An Efficient
+Adaptive Load Balancing Service for CORBA, IEEE Distributed Systems Online,
+Volume 2, Number 3, March, 2001.
+3. Jaiganesh Balasubramanian, Douglas C. Schmidt, Lawrence Dowdy, and Ossama
+Othman, Evaluating the Performance of Middleware Load Balancing Strategies,
+Proceedings of the 8th International IEEE Enterprise Distributed Object
+Computing Conference, Monterey, CA, September 2004
+4. Ossama Othman, Jaigaesh Balasubramanian, and Douglas C. Schmidt, The
+Design of an Adaptive Middleware Load Balancing and Monitoring Service, Third
+International Workshop on Self-Adaptive Software, Arlington, VA, USA, June
+9-11, 2003
diff --git a/TAO/orbsvcs/orbsvcs/Log/BasicLogFactory_i.cpp b/TAO/orbsvcs/orbsvcs/Log/BasicLogFactory_i.cpp
new file mode 100644
index 00000000000..b8704fe0988
--- /dev/null
+++ b/TAO/orbsvcs/orbsvcs/Log/BasicLogFactory_i.cpp
@@ -0,0 +1,147 @@
+#include "orbsvcs/Log/BasicLogFactory_i.h"
+#include "ace/OS_NS_stdio.h"
+
+ACE_RCSID (Log,
+ BasicLogFactory_i,
+ "$Id$")
+
+TAO_BEGIN_VERSIONED_NAMESPACE_DECL
+
+TAO_BasicLogFactory_i::TAO_BasicLogFactory_i (void)
+{
+}
+
+TAO_BasicLogFactory_i::~TAO_BasicLogFactory_i (void)
+{
+}
+
+DsLogAdmin::BasicLogFactory_ptr
+TAO_BasicLogFactory_i::activate (CORBA::ORB_ptr orb,
+ PortableServer::POA_ptr poa
+ ACE_ENV_ARG_DECL)
+{
+ TAO_LogMgr_i::init (orb, poa ACE_ENV_ARG_PARAMETER);
+ ACE_CHECK_RETURN (DsLogAdmin::BasicLogFactory::_nil ());
+
+
+ PortableServer::ObjectId_var oid =
+ this->factory_poa_->activate_object (this
+ ACE_ENV_ARG_PARAMETER);
+ ACE_CHECK_RETURN (DsLogAdmin::BasicLogFactory::_nil ());
+
+ CORBA::Object_var obj =
+ this->factory_poa_->id_to_reference (oid.in ()
+ ACE_ENV_ARG_PARAMETER);
+ ACE_CHECK_RETURN (DsLogAdmin::BasicLogFactory::_nil ());
+
+ // narrow and store the result..
+ this->log_mgr_ =
+ DsLogAdmin::LogMgr::_narrow (obj.in ()
+ ACE_ENV_ARG_PARAMETER);
+ ACE_CHECK_RETURN (DsLogAdmin::BasicLogFactory::_nil ());
+
+ DsLogAdmin::BasicLogFactory_var v_return =
+ DsLogAdmin::BasicLogFactory::_narrow (obj.in ()
+ ACE_ENV_ARG_PARAMETER);
+ ACE_CHECK_RETURN (DsLogAdmin::BasicLogFactory::_nil ());
+
+ return v_return._retn ();
+}
+
+DsLogAdmin::BasicLog_ptr
+TAO_BasicLogFactory_i::create (DsLogAdmin::LogFullActionType full_action,
+ CORBA::ULongLong max_size,
+ DsLogAdmin::LogId_out id_out
+ ACE_ENV_ARG_DECL)
+ ACE_THROW_SPEC ((CORBA::SystemException,
+ DsLogAdmin::InvalidLogFullAction
+ ))
+{
+ this->create_i (full_action,
+ max_size,
+ 0,
+ id_out
+ ACE_ENV_ARG_PARAMETER);
+ ACE_CHECK_RETURN (DsLogAdmin::BasicLog::_nil ());
+ DsLogAdmin::LogId id = id_out;
+
+#if (TAO_HAS_MINIMUM_POA == 0)
+ DsLogAdmin::Log_var log =
+ this->create_log_reference (id ACE_ENV_ARG_PARAMETER);
+ ACE_CHECK_RETURN (DsLogAdmin::BasicLog::_nil ());
+#else
+ DsLogAdmin::Log_var log =
+ this->create_log_object (id ACE_ENV_ARG_PARAMETER);
+ ACE_CHECK_RETURN (DsLogAdmin::BasicLog::_nil ());
+#endif
+
+ // narrow to BasicLog
+ DsLogAdmin::BasicLog_var basic_log =
+ DsLogAdmin::BasicLog::_narrow (log.in ());
+
+ return basic_log._retn ();
+}
+
+DsLogAdmin::BasicLog_ptr
+TAO_BasicLogFactory_i::create_with_id (DsLogAdmin::LogId id,
+ DsLogAdmin::LogFullActionType full_action,
+ CORBA::ULongLong max_size
+ ACE_ENV_ARG_DECL)
+ ACE_THROW_SPEC ((
+ CORBA::SystemException,
+ DsLogAdmin::LogIdAlreadyExists,
+ DsLogAdmin::InvalidLogFullAction
+ ))
+{
+ this->create_with_id_i (id,
+ full_action,
+ max_size,
+ 0
+ ACE_ENV_ARG_PARAMETER);
+ ACE_CHECK_RETURN (DsLogAdmin::BasicLog::_nil ());
+
+#if (TAO_HAS_MINIMUM_POA == 0)
+ DsLogAdmin::Log_var log =
+ this->create_log_reference (id ACE_ENV_ARG_PARAMETER);
+ ACE_CHECK_RETURN (DsLogAdmin::BasicLog::_nil ());
+#else
+ DsLogAdmin::Log_var log =
+ this->create_log_object (id ACE_ENV_ARG_PARAMETER);
+ ACE_CHECK_RETURN (DsLogAdmin::BasicLog::_nil ());
+#endif
+
+ // narrow to BasicLog
+ DsLogAdmin::BasicLog_var basic_log =
+ DsLogAdmin::BasicLog::_narrow (log.in ());
+
+ return basic_log._retn ();
+}
+
+CORBA::RepositoryId
+TAO_BasicLogFactory_i::create_repositoryid ()
+{
+ return CORBA::string_dup ("IDL:omg.org/DsLogAdmin:BasicLog:1.0");
+}
+
+PortableServer::ServantBase*
+TAO_BasicLogFactory_i::create_log_servant (DsLogAdmin::LogId id
+ ACE_ENV_ARG_DECL)
+{
+ TAO_BasicLog_i* basic_log_i;
+
+ ACE_NEW_THROW_EX (basic_log_i,
+ TAO_BasicLog_i (this->orb_.in (),
+ this->log_poa_.in (),
+ *this,
+ this->log_mgr_.in (),
+ id),
+ CORBA::NO_MEMORY ());
+ ACE_CHECK_RETURN (0);
+
+ basic_log_i->init (ACE_ENV_SINGLE_ARG_PARAMETER);
+ ACE_CHECK_RETURN (0);
+
+ return basic_log_i;
+}
+
+TAO_END_VERSIONED_NAMESPACE_DECL
diff --git a/TAO/orbsvcs/orbsvcs/Log/BasicLogFactory_i.h b/TAO/orbsvcs/orbsvcs/Log/BasicLogFactory_i.h
new file mode 100644
index 00000000000..f6cc8f4113a
--- /dev/null
+++ b/TAO/orbsvcs/orbsvcs/Log/BasicLogFactory_i.h
@@ -0,0 +1,109 @@
+// -*- C++ -*-
+
+//=============================================================================
+/**
+ * @file BasicLogFactory_i.h
+ *
+ * $Id$
+ *
+ * Implementation of the DsLogAdmin::BasicLogFactory interface.
+ *
+ *
+ * @author Matthew Braun <mjb2@cs.wustl.edu>
+ * @author Pradeep Gore <pradeep@cs.wustl.edu>
+ * @author David A. Hanvey <d.hanvey@qub.ac.uk>
+ */
+//=============================================================================
+
+#ifndef TAO_TLS_BASICLOGFACTORY_I_H
+#define TAO_TLS_BASICLOGFACTORY_I_H
+#include /**/ "ace/pre.h"
+
+#include "orbsvcs/DsLogAdminS.h"
+
+#if !defined (ACE_LACKS_PRAGMA_ONCE)
+# pragma once
+#endif /* ACE_LACKS_PRAGMA_ONCE */
+
+#include "orbsvcs/Log/LogMgr_i.h"
+#include "orbsvcs/Log/BasicLog_i.h"
+
+// This is to remove "inherits via dominance" warnings from MSVC.
+// MSVC is being a little too paranoid.
+#if defined(_MSC_VER)
+#pragma warning(push)
+#pragma warning(disable:4250)
+#endif /* _MSC_VER */
+
+TAO_BEGIN_VERSIONED_NAMESPACE_DECL
+
+class TAO_BasicLogActivator;
+
+/**
+ * @class TAO_BasicLogFactory_i
+ *
+ * @brief The BasicLogFactory is a factory that is used to create event-unaware Logs.
+ */
+class TAO_Log_Serv_Export TAO_BasicLogFactory_i :
+ public POA_DsLogAdmin::BasicLogFactory,
+ public TAO_LogMgr_i
+{
+public:
+
+ //= Initialization and termination code.
+
+ /// Constructor.
+ TAO_BasicLogFactory_i ();
+
+ /// Destructor.
+ ~TAO_BasicLogFactory_i ();
+
+ /// Activate this servant with the ORB and POA passed in.
+ DsLogAdmin::BasicLogFactory_ptr
+ activate (CORBA::ORB_ptr orb,
+ PortableServer::POA_ptr poa
+ ACE_ENV_ARG_DECL);
+
+ /// Allows clients to create new BasicLog objects.
+ /// Raises DsLogAdmin::InvalidThreshold.
+ DsLogAdmin::BasicLog_ptr
+ create (DsLogAdmin::LogFullActionType full_action,
+ CORBA::ULongLong max_size,
+ DsLogAdmin::LogId_out id
+ ACE_ENV_ARG_DECL)
+ ACE_THROW_SPEC ((CORBA::SystemException,
+ DsLogAdmin::InvalidLogFullAction
+ ));
+
+ /// Same as create (), but allows clients to specify the id.
+ DsLogAdmin::BasicLog_ptr
+ create_with_id (DsLogAdmin::LogId id,
+ DsLogAdmin::LogFullActionType full_action,
+ CORBA::ULongLong max_size
+ ACE_ENV_ARG_DECL)
+ ACE_THROW_SPEC ((
+ CORBA::SystemException,
+ DsLogAdmin::LogIdAlreadyExists,
+ DsLogAdmin::InvalidLogFullAction
+ ));
+
+protected:
+ virtual CORBA::RepositoryId
+ create_repositoryid ();
+
+ virtual PortableServer::ServantBase*
+ create_log_servant (DsLogAdmin::LogId id
+ ACE_ENV_ARG_DECL);
+
+ /// Our object ref. after <active>ation.
+ DsLogAdmin::LogMgr_var log_mgr_;
+};
+
+TAO_END_VERSIONED_NAMESPACE_DECL
+
+#if defined(_MSC_VER)
+#pragma warning(pop)
+#endif /* _MSC_VER */
+
+#include /**/ "ace/post.h"
+#endif /* TAO_TLS_BASICLOGFACTORY_I_H */
diff --git a/TAO/orbsvcs/orbsvcs/Log/BasicLog_i.cpp b/TAO/orbsvcs/orbsvcs/Log/BasicLog_i.cpp
new file mode 100644
index 00000000000..fa4c1f0af22
--- /dev/null
+++ b/TAO/orbsvcs/orbsvcs/Log/BasicLog_i.cpp
@@ -0,0 +1,93 @@
+#include "orbsvcs/Log/BasicLog_i.h"
+
+#include "orbsvcs/Log/LogMgr_i.h"
+
+ACE_RCSID (Log,
+ BasicLog_i,
+ "$Id$")
+
+TAO_BEGIN_VERSIONED_NAMESPACE_DECL
+
+TAO_BasicLog_i::TAO_BasicLog_i (CORBA::ORB_ptr orb,
+ PortableServer::POA_ptr poa,
+ TAO_LogMgr_i &logmgr_i,
+ DsLogAdmin::LogMgr_ptr factory,
+ DsLogAdmin::LogId id)
+ : TAO_Log_i (orb, logmgr_i, factory, id, 0),
+ poa_(PortableServer::POA::_duplicate(poa))
+{
+ // No-Op.
+}
+
+TAO_BasicLog_i::~TAO_BasicLog_i (void)
+{
+ // No-Op.
+}
+
+DsLogAdmin::Log_ptr
+TAO_BasicLog_i::copy (DsLogAdmin::LogId &id
+ ACE_ENV_ARG_DECL)
+ ACE_THROW_SPEC ((CORBA::SystemException))
+{
+ DsLogAdmin::BasicLogFactory_var basicLogFactory =
+ DsLogAdmin::BasicLogFactory::_narrow (factory_.in ()
+ ACE_ENV_ARG_PARAMETER);
+ ACE_CHECK_RETURN (DsLogAdmin::Log::_nil ());
+
+ DsLogAdmin::BasicLog_var log =
+ basicLogFactory->create (DsLogAdmin::halt, 0, id
+ ACE_ENV_ARG_PARAMETER);
+ ACE_CHECK_RETURN (DsLogAdmin::Log::_nil ());
+
+
+ // Copy the attributes from the log.
+ this->copy_attributes (log.in () ACE_ENV_ARG_PARAMETER);
+ ACE_CHECK_RETURN (DsLogAdmin::Log::_nil ());
+
+ return log._retn ();
+
+}
+
+DsLogAdmin::Log_ptr
+TAO_BasicLog_i::copy_with_id (DsLogAdmin::LogId id ACE_ENV_ARG_DECL)
+ ACE_THROW_SPEC ((CORBA::SystemException))
+{
+ DsLogAdmin::BasicLogFactory_var basicLogFactory =
+ DsLogAdmin::BasicLogFactory::_narrow (factory_.in ()
+ ACE_ENV_ARG_PARAMETER);
+ ACE_CHECK_RETURN (DsLogAdmin::Log::_nil ());
+
+ DsLogAdmin::BasicLog_var log =
+ basicLogFactory->create_with_id (id, DsLogAdmin::halt, 0
+ ACE_ENV_ARG_PARAMETER);
+ ACE_CHECK_RETURN (DsLogAdmin::Log::_nil ());
+
+ // Copy the attributes from the log.
+ this->copy_attributes (log.in () ACE_ENV_ARG_PARAMETER);
+ ACE_CHECK_RETURN (DsLogAdmin::Log::_nil ());
+
+ return log._retn ();
+
+}
+
+void
+TAO_BasicLog_i::destroy (ACE_ENV_SINGLE_ARG_DECL)
+ ACE_THROW_SPEC ((CORBA::SystemException))
+{
+ // Remove ourselves from the list of logs.
+ this->logmgr_i_.remove (this->logid_
+ ACE_ENV_ARG_PARAMETER);
+ ACE_CHECK;
+
+ // Deregister with POA.
+ PortableServer::ObjectId_var id =
+ this->poa_->servant_to_id (this
+ ACE_ENV_ARG_PARAMETER);
+ ACE_CHECK;
+
+ this->poa_->deactivate_object (id.in ()
+ ACE_ENV_ARG_PARAMETER);
+ ACE_CHECK;
+}
+
+TAO_END_VERSIONED_NAMESPACE_DECL
diff --git a/TAO/orbsvcs/orbsvcs/Log/BasicLog_i.h b/TAO/orbsvcs/orbsvcs/Log/BasicLog_i.h
new file mode 100644
index 00000000000..e1a51484192
--- /dev/null
+++ b/TAO/orbsvcs/orbsvcs/Log/BasicLog_i.h
@@ -0,0 +1,101 @@
+/* -*- C++ -*- */
+
+//=============================================================================
+/**
+ * @file BasicLog_i.h
+ *
+ * $Id$
+ *
+ * Implementation of the DsLogAdmin::BasicLog interface.
+ *
+ *
+ * @author Matthew Braun <mjb2@cs.wustl.edu>
+ * @author Pradeep Gore <pradeep@cs.wustl.edu>
+ * @David A. Hanvey <d.hanvey@qub.ac.uk>
+ */
+//=============================================================================
+
+
+#ifndef TAO_TLS_BASICLOG_I_H
+#define TAO_TLS_BASICLOG_I_H
+
+#include /**/ "ace/pre.h"
+
+#include "orbsvcs/DsLogAdminS.h"
+
+#if !defined (ACE_LACKS_PRAGMA_ONCE)
+# pragma once
+#endif /* ACE_LACKS_PRAGMA_ONCE */
+
+#include "orbsvcs/Log/Log_i.h"
+#include "orbsvcs/Log/log_serv_export.h"
+
+// This is to remove "inherits via dominance" warnings from MSVC.
+// MSVC is being a little too paranoid.
+#if defined(_MSC_VER)
+#pragma warning(push)
+#pragma warning(disable:4250)
+#endif /* _MSC_VER */
+
+TAO_BEGIN_VERSIONED_NAMESPACE_DECL
+
+class TAO_LogMgr_i;
+
+/**
+ * @class TAO_BasicLog_i
+ *
+ * @brief It allows clients to write, query and delete records from the log.
+ *
+ * The class supports the @c destroy> method to destroy the Log.
+ */
+class TAO_Log_Serv_Export TAO_BasicLog_i :
+ public TAO_Log_i,
+ public POA_DsLogAdmin::BasicLog
+{
+public:
+
+ /// Constructor.
+ TAO_BasicLog_i (CORBA::ORB_ptr orb,
+ PortableServer::POA_ptr poa,
+ TAO_LogMgr_i &logmgr_i,
+ DsLogAdmin::LogMgr_ptr factory,
+ DsLogAdmin::LogId id);
+
+ /// Duplicate the log.
+ virtual DsLogAdmin::Log_ptr copy (DsLogAdmin::LogId &id
+ ACE_ENV_ARG_DECL)
+ ACE_THROW_SPEC ((CORBA::SystemException));
+
+ /// Duplicate the log specifying an id.
+ virtual DsLogAdmin::Log_ptr copy_with_id (DsLogAdmin::LogId id
+ ACE_ENV_ARG_DECL)
+ ACE_THROW_SPEC ((CORBA::SystemException));
+
+ /// Destroy the log object and all contained records.
+ void destroy (ACE_ENV_SINGLE_ARG_DECL)
+ ACE_THROW_SPEC ((CORBA::SystemException));
+
+protected:
+
+ /// Destructor.
+ /**
+ * Protected destructor to enforce proper memory management through
+ * reference counting.
+ */
+ ~TAO_BasicLog_i (void);
+
+private:
+
+ /// POA.
+ PortableServer::POA_var poa_;
+};
+
+TAO_END_VERSIONED_NAMESPACE_DECL
+
+#if defined(_MSC_VER)
+#pragma warning(pop)
+#endif /* _MSC_VER */
+
+#include /**/ "ace/post.h"
+
+#endif /* TAO_TLS_BASICLOG_I_H */
diff --git a/TAO/orbsvcs/orbsvcs/Log/EventLogConsumer.cpp b/TAO/orbsvcs/orbsvcs/Log/EventLogConsumer.cpp
new file mode 100644
index 00000000000..5e005ee70c6
--- /dev/null
+++ b/TAO/orbsvcs/orbsvcs/Log/EventLogConsumer.cpp
@@ -0,0 +1,100 @@
+#include "orbsvcs/Log/EventLog_i.h"
+#include "orbsvcs/Log/LogMgr_i.h"
+#include "orbsvcs/Log/LogNotification.h"
+
+ACE_RCSID (Log,
+ EventLogConsumer,
+ "$Id$")
+
+TAO_BEGIN_VERSIONED_NAMESPACE_DECL
+
+TAO_Event_LogConsumer::TAO_Event_LogConsumer (TAO_EventLog_i *log)
+: log_ (log)
+{
+}
+
+TAO_Event_LogConsumer::~TAO_Event_LogConsumer (void)
+{
+}
+
+void
+TAO_Event_LogConsumer::connect (CosEventChannelAdmin::ConsumerAdmin_ptr consumer_admin)
+{
+ // Connect to the event channel.
+ CosEventComm::PushConsumer_var myself = this->_this ();
+ this->supplier_proxy_ = consumer_admin->obtain_push_supplier ();
+ this->supplier_proxy_->connect_push_consumer (myself.in());
+}
+
+void
+TAO_Event_LogConsumer::push (const CORBA::Any& data ACE_ENV_ARG_DECL)
+ACE_THROW_SPEC ((
+ CORBA::SystemException,
+ CosEventComm::Disconnected
+ ))
+{
+ // create a record list...
+ DsLogAdmin::RecordList recList (1);
+ recList.length (1);
+
+ recList [0].info = data;
+
+ // @@ The current revision of the specification (formal/03-07-01)
+ // states:
+ //
+ // * When a push operation is invoked and a log is full, then a
+ // NO_RESOURCE (sic) SystemException is raised with a LOGFULL
+ // minor code.
+ //
+ // * When a push operation is invoked on a log that is off-duty,
+ // then a NO_RESOURCE (sic) SystemException is raised with a
+ // LOGOFFDUTY minor code.
+ //
+ // * When a push operation is invoked on a log that is locked, then
+ // a NO_PERMISSIONS (sic) SystemException is raised with a LOGLOCKED
+ // minor code.
+ //
+ // * When a push operation is invoked on a log that is disabled,
+ // then a TRANSIENT SystemException is raised with a LOGDISABLED
+ // minor code.
+ //
+ // But neither the Telecom Logging or the CORBA specification define
+ // the values for these minor codes.
+ //
+ // I have submitted a defect report to the OMG for clarification.
+ // --jtc
+ ACE_TRY
+ {
+ // log the RecordList.
+ this->log_->write_recordlist (recList ACE_ENV_ARG_PARAMETER);
+ ACE_TRY_CHECK;
+ }
+ ACE_CATCH (DsLogAdmin::LogFull, ex)
+ {
+ ACE_THROW (CORBA::NO_RESOURCES ());
+ }
+ ACE_CATCH (DsLogAdmin::LogOffDuty, ex)
+ {
+ ACE_THROW (CORBA::NO_RESOURCES ());
+ }
+ ACE_CATCH (DsLogAdmin::LogLocked, ex)
+ {
+ ACE_THROW (CORBA::NO_PERMISSION ());
+ }
+ ACE_CATCH (DsLogAdmin::LogDisabled, ex)
+ {
+ ACE_THROW (CORBA::TRANSIENT ());
+ }
+ ACE_ENDTRY;
+}
+
+void
+TAO_Event_LogConsumer::disconnect_push_consumer (ACE_ENV_SINGLE_ARG_DECL)
+ ACE_THROW_SPEC ((
+ CORBA::SystemException
+ ))
+{
+ this->supplier_proxy_->disconnect_push_supplier (ACE_ENV_SINGLE_ARG_PARAMETER);
+}
+
+TAO_END_VERSIONED_NAMESPACE_DECL
diff --git a/TAO/orbsvcs/orbsvcs/Log/EventLogConsumer.h b/TAO/orbsvcs/orbsvcs/Log/EventLogConsumer.h
new file mode 100644
index 00000000000..fac7eb9bbb9
--- /dev/null
+++ b/TAO/orbsvcs/orbsvcs/Log/EventLogConsumer.h
@@ -0,0 +1,102 @@
+/* -*- C++ -*- */
+
+// ============================================================================
+/**
+ * @file EventLogConsumer.h
+ *
+ * $Id$
+ *
+ * The EventLogConsumer connects to the EventLog and logs the events
+ * that are pushed to the EventLog.
+ *
+ * @author Rob Ruff <rruff@scires.com>
+ * @D A Hanvey <d.hanvey@qub.ac.uk>
+ */
+// ============================================================================
+
+#ifndef TAO_TLS_EVENTLOGCONSUMER_H
+#define TAO_TLS_EVENTLOGCONSUMER_H
+
+#include /**/ "ace/pre.h"
+
+#include "orbsvcs/DsLogAdminS.h"
+
+#if !defined (ACE_LACKS_PRAGMA_ONCE)
+# pragma once
+#endif /* ACE_LACKS_PRAGMA_ONCE */
+
+
+#include "orbsvcs/DsEventLogAdminS.h"
+#include "orbsvcs/Log/Log_i.h"
+#include "orbsvcs/CosEvent/CEC_EventChannel.h"
+
+#include "orbsvcs/Log/eventlog_serv_export.h"
+
+#if defined(_MSC_VER)
+#pragma warning(push)
+#pragma warning(disable:4250)
+#endif /* _MSC_VER */
+
+TAO_BEGIN_VERSIONED_NAMESPACE_DECL
+
+class TAO_LogMgr_i;
+class TAO_EventLog_i;
+class TAO_EventLogFactory_i;
+
+/**
+ * @class TAO_Event_LogConsumer
+ *
+ * @brief An implementation of the PushConsumer interface.
+ *
+ * Connects to the EventLog and writes LogRecords to the
+ * Log when events are 'pushed' to the EventLog which is an
+ * EventChannel.
+ */
+class TAO_Event_LogConsumer : public virtual POA_CosEventComm::PushConsumer
+{
+public:
+
+ // = Initialization and Termination methods.
+
+ /// Constructor.
+ TAO_Event_LogConsumer (TAO_EventLog_i *log);
+
+ /// Destructor.
+ ~TAO_Event_LogConsumer (void);
+
+ /// Connect to EventLog.
+ void
+ connect (CosEventChannelAdmin::ConsumerAdmin_ptr consumer_admin);
+
+private:
+
+ /// Disconnect from EventLog.
+ void disconnect_push_consumer (ACE_ENV_SINGLE_ARG_DECL)
+ ACE_THROW_SPEC ((
+ CORBA::SystemException
+ ));
+
+ /// This method will call TAO_Log_i::log() to write
+ /// the event to the Log.
+ void push (const CORBA::Any& data ACE_ENV_ARG_DECL)
+ ACE_THROW_SPEC ((
+ CORBA::SystemException,
+ CosEventComm::Disconnected
+ ));
+
+ /// ProxyPushSupplier used to connect to EventLog.
+ CosEventChannelAdmin::ProxyPushSupplier_var supplier_proxy_;
+
+ /// The EventLog that this consumer connects to
+ /// and whose events are to be logged.
+ TAO_EventLog_i *log_;
+};
+
+TAO_END_VERSIONED_NAMESPACE_DECL
+
+#if defined(_MSC_VER)
+#pragma warning(pop)
+#endif /* _MSC_VER */
+
+#include /**/ "ace/post.h"
+#endif /* TAO_TLS_EVENTLOGCONSUMER_H */
diff --git a/TAO/orbsvcs/orbsvcs/Log/EventLogFactory_i.cpp b/TAO/orbsvcs/orbsvcs/Log/EventLogFactory_i.cpp
new file mode 100644
index 00000000000..901af607cc1
--- /dev/null
+++ b/TAO/orbsvcs/orbsvcs/Log/EventLogFactory_i.cpp
@@ -0,0 +1,253 @@
+#include "orbsvcs/Log/EventLogFactory_i.h"
+#include "orbsvcs/Log/LogNotification.h"
+#include "orbsvcs/Log/EventLogNotification.h"
+#include "ace/Auto_Ptr.h"
+#include "ace/OS_NS_stdio.h"
+
+ACE_RCSID (Log,
+ EventLogFactory_i,
+ "$Id$")
+
+TAO_BEGIN_VERSIONED_NAMESPACE_DECL
+
+TAO_EventLogFactory_i::TAO_EventLogFactory_i (void)
+{
+ TAO_CEC_Default_Factory::init_svcs ();
+
+ ACE_DECLARE_NEW_CORBA_ENV;
+ ACE_TRY
+ {
+ PortableServer::POA_var defPOA =
+ this->_default_POA (ACE_ENV_SINGLE_ARG_PARAMETER);
+ ACE_TRY_CHECK;
+
+ TAO_CEC_EventChannel_Attributes attr (defPOA.in (), defPOA.in ());
+
+ ACE_NEW_THROW_EX (impl,
+ TAO_CEC_EventChannel (attr),
+ CORBA::NO_MEMORY ());
+ ACE_TRY_CHECK;
+
+ impl->activate (ACE_ENV_SINGLE_ARG_PARAMETER);
+ ACE_TRY_CHECK;
+ }
+ ACE_CATCHANY
+ {
+ ACE_PRINT_EXCEPTION (ACE_ANY_EXCEPTION,
+ "Caught exception in "
+ "EventLogFactory_i constructor.");
+ }
+ ACE_ENDTRY;
+ ACE_CHECK;
+}
+
+TAO_EventLogFactory_i::~TAO_EventLogFactory_i (void)
+{
+ // No-Op.
+}
+
+CosEventChannelAdmin::EventChannel_ptr
+TAO_EventLogFactory_i::init (PortableServer::POA_ptr /* poa */
+ ACE_ENV_ARG_DECL)
+{
+ ACE_ASSERT (!CORBA::is_nil (this->poa_.in ()));
+
+ CosEventChannelAdmin::EventChannel_var ec_return;
+
+ auto_ptr <TAO_CEC_EventChannel> ec (impl);
+
+ PortableServer::ObjectId_var oid =
+ this->poa_->activate_object (ec.get ()
+ ACE_ENV_ARG_PARAMETER);
+ ACE_CHECK_RETURN (CosEventChannelAdmin::EventChannel::_nil ());
+
+ ec.release ();
+
+ CORBA::Object_var obj =
+ this->poa_->id_to_reference (oid.in () ACE_ENV_ARG_PARAMETER);
+ ACE_CHECK_RETURN (CosEventChannelAdmin::EventChannel::_nil ());
+
+ ec_return =
+ CosEventChannelAdmin::EventChannel::_narrow (obj.in ()
+ ACE_ENV_ARG_PARAMETER);
+ ACE_CHECK_RETURN (CosEventChannelAdmin::EventChannel::_nil ());
+
+ return ec_return._retn ();
+}
+
+DsEventLogAdmin::EventLogFactory_ptr
+TAO_EventLogFactory_i::activate (CORBA::ORB_ptr orb,
+ PortableServer::POA_ptr poa
+ ACE_ENV_ARG_DECL)
+{
+ TAO_LogMgr_i::init (orb, poa ACE_ENV_ARG_PARAMETER);
+ ACE_CHECK_RETURN (DsEventLogAdmin::EventLogFactory::_nil ());
+
+
+ this->event_channel_ = init (this->poa_.in () ACE_ENV_ARG_PARAMETER);
+ ACE_CHECK_RETURN (DsEventLogAdmin::EventLogFactory::_nil ());
+
+ this->consumer_admin_ =
+ this->event_channel_->for_consumers (ACE_ENV_SINGLE_ARG_PARAMETER);
+ ACE_CHECK_RETURN (DsEventLogAdmin::EventLogFactory::_nil ());
+
+ ACE_NEW_THROW_EX (this->notifier_,
+ TAO_EventLogNotification(this->event_channel_.in ()),
+ CORBA::NO_MEMORY ());
+ ACE_CHECK_RETURN (DsEventLogAdmin::EventLogFactory::_nil ());
+
+ PortableServer::ObjectId_var oid =
+ this->factory_poa_->activate_object (this
+ ACE_ENV_ARG_PARAMETER);
+ ACE_CHECK_RETURN (DsEventLogAdmin::EventLogFactory::_nil ());
+
+ CORBA::Object_var obj =
+ this->factory_poa_->id_to_reference (oid.in ()
+ ACE_ENV_ARG_PARAMETER);
+ ACE_CHECK_RETURN (DsEventLogAdmin::EventLogFactory::_nil ());
+
+ // narrow and store the result..
+ this->log_mgr_ =
+ DsLogAdmin::LogMgr::_narrow (obj.in ()
+ ACE_ENV_ARG_PARAMETER);
+ ACE_CHECK_RETURN (DsEventLogAdmin::EventLogFactory::_nil ());
+
+ DsEventLogAdmin::EventLogFactory_var v_return =
+ DsEventLogAdmin::EventLogFactory::_narrow (obj.in ()
+ ACE_ENV_ARG_PARAMETER);
+ ACE_CHECK_RETURN (DsEventLogAdmin::EventLogFactory::_nil ());
+
+ return v_return._retn ();
+}
+
+DsEventLogAdmin::EventLog_ptr
+TAO_EventLogFactory_i::create (
+ DsLogAdmin::LogFullActionType full_action,
+ CORBA::ULongLong max_size,
+ const DsLogAdmin::CapacityAlarmThresholdList & thresholds,
+ DsLogAdmin::LogId_out id_out
+ ACE_ENV_ARG_DECL)
+ ACE_THROW_SPEC ((CORBA::SystemException,
+ DsLogAdmin::InvalidLogFullAction,
+ DsLogAdmin::InvalidThreshold))
+{
+ this->create_i (full_action,
+ max_size,
+ & thresholds,
+ id_out
+ ACE_ENV_ARG_PARAMETER);
+ ACE_CHECK_RETURN (DsEventLogAdmin::EventLog::_nil ());
+ DsLogAdmin::LogId id = id_out;
+
+#if (TAO_HAS_MINIMUM_POA == 0)
+ DsLogAdmin::Log_var log =
+ this->create_log_reference (id ACE_ENV_ARG_PARAMETER);
+ ACE_CHECK_RETURN (DsEventLogAdmin::EventLog::_nil ());
+#else
+ DsLogAdmin::Log_var log =
+ this->create_log_object (id ACE_ENV_ARG_PARAMETER);
+ ACE_CHECK_RETURN (DsEventLogAdmin::EventLog::_nil ());
+#endif
+
+ // narrow to EventLog
+ DsEventLogAdmin::EventLog_var event_log =
+ DsEventLogAdmin::EventLog::_narrow (log.in ());
+
+ // @@ JTC - squelch exception?
+ notifier_->object_creation (id ACE_ENV_ARG_PARAMETER);
+ ACE_CHECK_RETURN (DsEventLogAdmin::EventLog::_nil ());
+
+ return event_log._retn();
+}
+
+DsEventLogAdmin::EventLog_ptr
+TAO_EventLogFactory_i::create_with_id (
+ DsLogAdmin::LogId id,
+ DsLogAdmin::LogFullActionType full_action,
+ CORBA::ULongLong max_size,
+ const DsLogAdmin::CapacityAlarmThresholdList & thresholds
+ ACE_ENV_ARG_DECL)
+ ACE_THROW_SPEC ((CORBA::SystemException,
+ DsLogAdmin::LogIdAlreadyExists,
+ DsLogAdmin::InvalidLogFullAction,
+ DsLogAdmin::InvalidThreshold))
+{
+ this->create_with_id_i (id,
+ full_action,
+ max_size,
+ & thresholds
+ ACE_ENV_ARG_PARAMETER);
+ ACE_CHECK_RETURN (DsEventLogAdmin::EventLog::_nil ());
+
+#if (TAO_HAS_MINIMUM_POA == 0)
+ DsLogAdmin::Log_var log =
+ this->create_log_reference (id ACE_ENV_ARG_PARAMETER);
+ ACE_CHECK_RETURN (DsEventLogAdmin::EventLog::_nil ());
+#else
+ DsLogAdmin::Log_var log =
+ this->create_log_object (id ACE_ENV_ARG_PARAMETER);
+ ACE_CHECK_RETURN (DsEventLogAdmin::EventLog::_nil ());
+#endif
+
+ // narrow to EventLog
+ DsEventLogAdmin::EventLog_var event_log =
+ DsEventLogAdmin::EventLog::_narrow (log.in ());
+
+ // @@ JTC - squelch exception?
+ notifier_->object_creation (id ACE_ENV_ARG_PARAMETER);
+ ACE_CHECK_RETURN (DsEventLogAdmin::EventLog::_nil ());
+
+ return event_log._retn ();
+}
+
+CORBA::RepositoryId
+TAO_EventLogFactory_i::create_repositoryid ()
+{
+ return CORBA::string_dup("IDL:omg.org/DsEventLogAdmin:EventLog:1.0");
+}
+
+PortableServer::ServantBase*
+TAO_EventLogFactory_i::create_log_servant (DsLogAdmin::LogId id
+ ACE_ENV_ARG_DECL)
+{
+ TAO_EventLog_i* event_log_i;
+
+ ACE_NEW_THROW_EX (event_log_i,
+ TAO_EventLog_i (this->orb_.in (),
+ this->poa_.in (),
+ this->log_poa_.in (),
+ *this,
+ this->log_mgr_.in (),
+ this->notifier_,
+ id
+ ),
+ CORBA::NO_MEMORY ());
+ ACE_CHECK_RETURN (0);
+
+ event_log_i->init (ACE_ENV_SINGLE_ARG_PARAMETER);
+ ACE_CHECK_RETURN (0);
+
+ //dhanvey
+ //initialise the LogConsumer object
+ event_log_i->activate (ACE_ENV_SINGLE_ARG_PARAMETER);
+ ACE_CHECK_RETURN (0);
+
+ return event_log_i;
+}
+
+CosEventChannelAdmin::ProxyPushSupplier_ptr
+TAO_EventLogFactory_i::obtain_push_supplier (ACE_ENV_SINGLE_ARG_DECL)
+ ACE_THROW_SPEC ((CORBA::SystemException))
+{
+ return consumer_admin_->obtain_push_supplier (ACE_ENV_SINGLE_ARG_PARAMETER);
+}
+
+CosEventChannelAdmin::ProxyPullSupplier_ptr
+TAO_EventLogFactory_i::obtain_pull_supplier (ACE_ENV_SINGLE_ARG_DECL)
+ ACE_THROW_SPEC ((CORBA::SystemException))
+
+{
+ return consumer_admin_->obtain_pull_supplier (ACE_ENV_SINGLE_ARG_PARAMETER);
+}
+
+TAO_END_VERSIONED_NAMESPACE_DECL
diff --git a/TAO/orbsvcs/orbsvcs/Log/EventLogFactory_i.h b/TAO/orbsvcs/orbsvcs/Log/EventLogFactory_i.h
new file mode 100644
index 00000000000..ea8e6e5c63f
--- /dev/null
+++ b/TAO/orbsvcs/orbsvcs/Log/EventLogFactory_i.h
@@ -0,0 +1,152 @@
+// -*- C++ -*-
+
+//=============================================================================
+/**
+ * @file EventLogFactory_i.h
+ *
+ * $Id$
+ *
+ * Implementation of the DsEventLogAdmin::EventLogFactory interface.
+ *
+ *
+ * @author Rob Ruff <rruff@scires.com>
+ * @author David A. Hanvey <d.hanvey@qub.ac.uk>
+ */
+//=============================================================================
+
+#ifndef TAO_TLS_EVENTLOGFACTORY_I_H
+#define TAO_TLS_EVENTLOGFACTORY_I_H
+
+#include /**/ "ace/pre.h"
+
+#include "orbsvcs/DsEventLogAdminS.h"
+
+#if !defined (ACE_LACKS_PRAGMA_ONCE)
+# pragma once
+#endif /* ACE_LACKS_PRAGMA_ONCE */
+
+#include "orbsvcs/DsLogAdminS.h"
+#include "orbsvcs/Log/LogMgr_i.h"
+#include "orbsvcs/CosEvent/CEC_ConsumerAdmin.h"
+#include "orbsvcs/CosEvent/CEC_EventChannel.h"
+#include "orbsvcs/CosEvent/CEC_Default_Factory.h"
+#include "orbsvcs/Log/EventLog_i.h"
+
+#if defined(_MSC_VER)
+#pragma warning(push)
+#pragma warning(disable:4250)
+#endif /* _MSC_VER */
+
+TAO_BEGIN_VERSIONED_NAMESPACE_DECL
+
+class TAO_EventLog_i;
+class TAO_EventLogNotification;
+
+/**
+ * @class TAO_EventLogFactory_i
+ *
+ * @brief The EventLogFactory is a factory that is used to create EventLogs which are event-aware.
+ */
+class TAO_EventLog_Serv_Export TAO_EventLogFactory_i :
+ public POA_DsEventLogAdmin::EventLogFactory,
+ public TAO_LogMgr_i
+
+{
+public:
+
+ //= Initialization and termination code.
+
+ /// Constructor.
+ TAO_EventLogFactory_i (void);
+
+ /// Destructor.
+ ~TAO_EventLogFactory_i ();
+
+ /// Initialise the EventChannel and obtain a
+ /// pointer to it.
+ CosEventChannelAdmin::EventChannel_ptr
+ init (PortableServer::POA_ptr poa
+ ACE_ENV_ARG_DECL);
+
+ /// Activate this servant with the ORB and POA passed in.
+ DsEventLogAdmin::EventLogFactory_ptr
+ activate (CORBA::ORB_ptr orb,
+ PortableServer::POA_ptr poa
+ ACE_ENV_ARG_DECL);
+
+ /// Used to create an EventLog.
+ DsEventLogAdmin::EventLog_ptr create (
+ DsLogAdmin::LogFullActionType full_action,
+ CORBA::ULongLong max_size,
+ const DsLogAdmin::CapacityAlarmThresholdList & thresholds,
+ DsLogAdmin::LogId_out id
+ ACE_ENV_ARG_DECL
+ )
+ ACE_THROW_SPEC ((
+ CORBA::SystemException,
+ DsLogAdmin::InvalidLogFullAction,
+ DsLogAdmin::InvalidThreshold
+ ));
+
+ /// Same as create (), but allows clients to specify the id.
+ DsEventLogAdmin::EventLog_ptr create_with_id (
+ DsLogAdmin::LogId id,
+ DsLogAdmin::LogFullActionType full_action,
+ CORBA::ULongLong max_size,
+ const DsLogAdmin::CapacityAlarmThresholdList & thresholds
+ ACE_ENV_ARG_DECL
+ )
+ ACE_THROW_SPEC ((
+ CORBA::SystemException,
+ DsLogAdmin::LogIdAlreadyExists,
+ DsLogAdmin::InvalidLogFullAction,
+ DsLogAdmin::InvalidThreshold
+ ));
+
+ // = Implementation of the CosEventChannelAdmin::ConsumerAdmin methods.
+ CosEventChannelAdmin::ProxyPushSupplier_ptr obtain_push_supplier (
+ ACE_ENV_SINGLE_ARG_DECL
+ )
+ ACE_THROW_SPEC ((
+ CORBA::SystemException
+ ));
+
+ CosEventChannelAdmin::ProxyPullSupplier_ptr obtain_pull_supplier (
+ ACE_ENV_SINGLE_ARG_DECL
+ )
+ ACE_THROW_SPEC ((
+ CORBA::SystemException
+ ));
+
+protected:
+ virtual CORBA::RepositoryId
+ create_repositoryid ();
+
+ virtual PortableServer::ServantBase*
+ create_log_servant (DsLogAdmin::LogId id
+ ACE_ENV_ARG_DECL);
+
+ /// Our object ref. after <active>ation.
+ DsLogAdmin::LogMgr_var log_mgr_;
+
+ /// The event channel used for log generated events.
+ TAO_CEC_EventChannel *impl;
+
+ /// The object used for log generated events.
+ TAO_EventLogNotification* notifier_;
+
+ /// EventChannel used to obtain the ConsumerAdmin.
+ CosEventChannelAdmin::EventChannel_var event_channel_;
+
+ /// The ConsumerAdmin that the EventLogFactory supports.
+ CosEventChannelAdmin::ConsumerAdmin_var consumer_admin_;
+};
+
+TAO_END_VERSIONED_NAMESPACE_DECL
+
+#if defined(_MSC_VER)
+#pragma warning(pop)
+#endif /* _MSC_VER */
+
+#include /**/ "ace/post.h"
+#endif /* TLS_EVENTLOGFACTORY_I_H */
diff --git a/TAO/orbsvcs/orbsvcs/Log/EventLogNotification.cpp b/TAO/orbsvcs/orbsvcs/Log/EventLogNotification.cpp
new file mode 100644
index 00000000000..130274497d7
--- /dev/null
+++ b/TAO/orbsvcs/orbsvcs/Log/EventLogNotification.cpp
@@ -0,0 +1,52 @@
+#include "orbsvcs/Log/LogNotification.h"
+#include "orbsvcs/Log/EventLogNotification.h"
+#include "orbsvcs/Time_Utilities.h"
+#include "tao/debug.h"
+
+ACE_RCSID (Log,
+ EventLogNotification,
+ "$Id$")
+
+TAO_BEGIN_VERSIONED_NAMESPACE_DECL
+
+TAO_EventLogNotification::TAO_EventLogNotification (CosEventChannelAdmin::EventChannel_ptr ec)
+: TAO_LogNotification (), event_channel_ (CosEventChannelAdmin::EventChannel::_duplicate (ec))
+{
+ obtain_proxy_consumer ();
+}
+
+TAO_EventLogNotification::~TAO_EventLogNotification (void)
+{
+ // No-Op.
+}
+
+void
+TAO_EventLogNotification::disconnect_push_supplier (ACE_ENV_SINGLE_ARG_DECL)
+ ACE_THROW_SPEC ((CORBA::SystemException))
+{
+ this->consumer_->disconnect_push_consumer (ACE_ENV_SINGLE_ARG_PARAMETER);
+}
+
+void
+TAO_EventLogNotification::obtain_proxy_consumer()
+{
+ CosEventChannelAdmin::SupplierAdmin_var supplier_admin =
+ event_channel_->for_suppliers ();
+
+ consumer_ = supplier_admin->obtain_push_consumer ();
+
+ CosEventComm::PushSupplier_var supplier =
+ this->_this ();
+
+ consumer_->connect_push_supplier (supplier.in());
+}
+
+void
+TAO_EventLogNotification::send_notification (const CORBA::Any& any
+ ACE_ENV_ARG_DECL)
+ ACE_THROW_SPEC ((CORBA::SystemException))
+{
+ consumer_->push (any ACE_ENV_ARG_PARAMETER);
+}
+
+TAO_END_VERSIONED_NAMESPACE_DECL
diff --git a/TAO/orbsvcs/orbsvcs/Log/EventLogNotification.h b/TAO/orbsvcs/orbsvcs/Log/EventLogNotification.h
new file mode 100644
index 00000000000..88306c2eac7
--- /dev/null
+++ b/TAO/orbsvcs/orbsvcs/Log/EventLogNotification.h
@@ -0,0 +1,92 @@
+// -*- C++ -*-
+
+//=============================================================================
+/**
+ * @file EventLogNotification.h
+ *
+ * $Id$
+ *
+ * Methods to enable log-generated events.
+ *
+ * @author D A Hanvey <d.hanvey@qub.ac.uk>
+ */
+//=============================================================================
+
+#ifndef TAO_TLS_EVENT_LOG_NOTIFICATION_H
+#define TAO_TLS_EVENT_LOG_NOTIFICATION_H
+
+#include /**/ "ace/pre.h"
+
+#include "orbsvcs/CosEvent/CEC_ConsumerAdmin.h"
+
+#if !defined (ACE_LACKS_PRAGMA_ONCE)
+# pragma once
+#endif /* ACE_LACKS_PRAGMA_ONCE */
+
+#include "orbsvcs/CosEvent/CEC_EventChannel.h"
+#include "orbsvcs/DsEventLogAdminS.h"
+#include "orbsvcs/CosEvent/CEC_Default_Factory.h"
+#include "orbsvcs/CosEventCommS.h"
+#include "orbsvcs/Log/eventlog_serv_export.h"
+
+#if defined(_MSC_VER)
+#pragma warning(push)
+#pragma warning(disable:4250)
+#endif /* _MSC_VER */
+
+TAO_BEGIN_VERSIONED_NAMESPACE_DECL
+
+/**
+ * @class TAO_EventLogNotification
+ *
+ * @brief Used to forward log generated events to a logging server.
+ */
+class TAO_EventLog_Serv_Export TAO_EventLogNotification :
+ public TAO_LogNotification,
+ public POA_CosEventComm::PushSupplier
+{
+public:
+
+ // = Initialization and Termination methods.
+
+ /// Constructor.
+ TAO_EventLogNotification (CosEventChannelAdmin::EventChannel_ptr);
+
+ /// Destructor.
+ ~TAO_EventLogNotification (void);
+
+ /// The skeleton methods.
+ virtual void disconnect_push_supplier (ACE_ENV_SINGLE_ARG_DECL)
+ ACE_THROW_SPEC ((CORBA::SystemException));
+
+protected:
+ // = Helper methods
+
+ /// Used to connect this PushSupplier to the EventChannel
+ /// that will log these events.
+ void obtain_proxy_consumer ();
+
+ /// Send the event on the event channel.
+ virtual void send_notification (const CORBA::Any& any ACE_ENV_ARG_DECL)
+ ACE_THROW_SPEC ((CORBA::SystemException));
+
+
+private:
+ /// The ORB reference.
+ CORBA::ORB_var orb_;
+
+ /// The event channel we connect to.
+ CosEventChannelAdmin::EventChannel_var event_channel_;
+
+ /// The ProxyPushConsumer used to connect to the event channel.
+ CosEventChannelAdmin::ProxyPushConsumer_var consumer_;
+};
+
+TAO_END_VERSIONED_NAMESPACE_DECL
+
+#if defined(_MSC_VER)
+#pragma warning(pop)
+#endif /* _MSC_VER */
+
+#include /**/ "ace/post.h"
+#endif /* TLS_EVENT_LOG_NOTIFICATION_H */
diff --git a/TAO/orbsvcs/orbsvcs/Log/EventLog_i.cpp b/TAO/orbsvcs/orbsvcs/Log/EventLog_i.cpp
new file mode 100644
index 00000000000..6c6853cf891
--- /dev/null
+++ b/TAO/orbsvcs/orbsvcs/Log/EventLog_i.cpp
@@ -0,0 +1,139 @@
+#include "orbsvcs/Log/EventLog_i.h"
+#include "orbsvcs/Log/LogMgr_i.h"
+#include "orbsvcs/Log/LogNotification.h"
+
+ACE_RCSID (Log,
+ EventLog_i,
+ "$Id$")
+
+
+TAO_BEGIN_VERSIONED_NAMESPACE_DECL
+
+TAO_EventLog_i::TAO_EventLog_i (CORBA::ORB_ptr orb,
+ PortableServer::POA_ptr poa,
+ PortableServer::POA_ptr log_poa,
+ TAO_LogMgr_i &logmgr_i,
+ DsLogAdmin::LogMgr_ptr factory,
+ TAO_LogNotification *log_notifier,
+ DsLogAdmin::LogId id)
+ : TAO_Log_i (orb, logmgr_i, factory, id, log_notifier),
+ poa_(PortableServer::POA::_duplicate(poa)),
+ log_poa_(PortableServer::POA::_duplicate(log_poa))
+{
+ ACE_DECLARE_NEW_CORBA_ENV;
+
+ // Create an instance of the event channel.
+ TAO_CEC_EventChannel_Attributes attr (this->poa_.in(),
+ this->poa_.in());
+
+ ACE_NEW_THROW_EX (this->event_channel_,
+ TAO_CEC_EventChannel(attr),
+ CORBA::NO_MEMORY ());
+}
+
+TAO_EventLog_i::~TAO_EventLog_i ()
+{
+ this->event_channel_->destroy ();
+
+ delete this->event_channel_;
+}
+
+
+DsLogAdmin::Log_ptr
+TAO_EventLog_i::copy (DsLogAdmin::LogId &id ACE_ENV_ARG_DECL)
+ACE_THROW_SPEC ((CORBA::SystemException))
+{
+ // Duplicate the log.
+ DsEventLogAdmin::EventLogFactory_var eventLogFactory =
+ DsEventLogAdmin::EventLogFactory::_narrow (factory_.in ()
+ ACE_ENV_ARG_PARAMETER);
+ ACE_CHECK_RETURN (DsLogAdmin::Log::_nil ());
+
+ DsEventLogAdmin::EventLog_var log =
+ eventLogFactory->create (DsLogAdmin::halt, 0, thresholds_, id
+ ACE_ENV_ARG_PARAMETER);
+ ACE_CHECK_RETURN (DsLogAdmin::Log::_nil ());
+
+ this->copy_attributes (log.in () ACE_ENV_ARG_PARAMETER);
+ ACE_CHECK_RETURN (DsLogAdmin::Log::_nil ());
+
+ return log._retn ();
+
+}
+
+DsLogAdmin::Log_ptr
+TAO_EventLog_i::copy_with_id (DsLogAdmin::LogId id ACE_ENV_ARG_DECL)
+ACE_THROW_SPEC ((CORBA::SystemException))
+{
+ // Duplicate the log supplying the log id.
+ DsEventLogAdmin::EventLogFactory_var eventLogFactory =
+ DsEventLogAdmin::EventLogFactory::_narrow (factory_.in ()
+ ACE_ENV_ARG_PARAMETER);
+ ACE_CHECK_RETURN (DsLogAdmin::Log::_nil ());
+
+ DsEventLogAdmin::EventLog_var log =
+ eventLogFactory->create_with_id (id, DsLogAdmin::halt, 0, thresholds_
+ ACE_ENV_ARG_PARAMETER);
+ ACE_CHECK_RETURN (DsLogAdmin::Log::_nil ());
+
+ this->copy_attributes (log.in () ACE_ENV_ARG_PARAMETER);
+ ACE_CHECK_RETURN (DsLogAdmin::Log::_nil ());
+
+ return log._retn ();
+
+}
+
+
+void
+TAO_EventLog_i::destroy (ACE_ENV_SINGLE_ARG_DECL)
+ ACE_THROW_SPEC ((CORBA::SystemException))
+{
+ // Send event to indicate the log has been deleted.
+ notifier_->object_deletion (logid_ ACE_ENV_ARG_PARAMETER);
+ ACE_CHECK;
+
+ // Remove ourselves from the list of logs.
+ this->logmgr_i_.remove (this->logid_
+ ACE_ENV_ARG_PARAMETER);
+ ACE_CHECK;
+
+ // Deregister with POA.
+ PortableServer::ObjectId_var id =
+ this->log_poa_->servant_to_id (this
+ ACE_ENV_ARG_PARAMETER);
+ ACE_CHECK;
+
+ this->log_poa_->deactivate_object (id.in ()
+ ACE_ENV_ARG_PARAMETER);
+ ACE_CHECK;
+}
+
+void
+TAO_EventLog_i::activate (ACE_ENV_SINGLE_ARG_DECL)
+{
+ CosEventChannelAdmin::ConsumerAdmin_var consumer_admin =
+ this->event_channel_->for_consumers (ACE_ENV_SINGLE_ARG_PARAMETER);
+ ACE_CHECK;
+
+ // Create the PushConsumer that will log the events.
+ this->my_log_consumer_ = new TAO_Event_LogConsumer (this);
+ ACE_CHECK;
+ this->my_log_consumer_->connect (consumer_admin.in ());
+}
+
+
+CosEventChannelAdmin::ConsumerAdmin_ptr
+TAO_EventLog_i::for_consumers (ACE_ENV_SINGLE_ARG_DECL)
+ ACE_THROW_SPEC ((CORBA::SystemException))
+{
+ return this->event_channel_->for_consumers (ACE_ENV_SINGLE_ARG_PARAMETER);
+}
+
+CosEventChannelAdmin::SupplierAdmin_ptr
+TAO_EventLog_i::for_suppliers (ACE_ENV_SINGLE_ARG_DECL)
+ ACE_THROW_SPEC ((CORBA::SystemException))
+{
+ return this->event_channel_->for_suppliers (ACE_ENV_SINGLE_ARG_PARAMETER);
+}
+
+TAO_END_VERSIONED_NAMESPACE_DECL
diff --git a/TAO/orbsvcs/orbsvcs/Log/EventLog_i.h b/TAO/orbsvcs/orbsvcs/Log/EventLog_i.h
new file mode 100644
index 00000000000..545591ad31a
--- /dev/null
+++ b/TAO/orbsvcs/orbsvcs/Log/EventLog_i.h
@@ -0,0 +1,135 @@
+// -*- C++ -*-
+
+// ============================================================================
+/**
+ * @file EventLog_i.h
+ *
+ * $Id$
+ *
+ * Implementation of the DsLogAdmin::EventLog interface.
+ * File also conatins TAO_Event_LogConsumer which is used
+ * to write events to the Log.
+ *
+ * @author Rob Ruff <rruff@scires.com>
+ * @author D A Hanvey <d.hanvey@qub.ac.uk>
+ */
+// ============================================================================
+
+#ifndef TAO_TLS_EVENTLOG_I_H
+#define TAO_TLS_EVENTLOG_I_H
+
+#include /**/ "ace/pre.h"
+
+#include "orbsvcs/DsLogAdminS.h"
+
+#if !defined (ACE_LACKS_PRAGMA_ONCE)
+# pragma once
+#endif /* ACE_LACKS_PRAGMA_ONCE */
+
+
+#include "orbsvcs/DsEventLogAdminS.h"
+#include "orbsvcs/Log/Log_i.h"
+#include "orbsvcs/CosEvent/CEC_EventChannel.h"
+#include "orbsvcs/Log/EventLogConsumer.h"
+
+#include "orbsvcs/Log/eventlog_serv_export.h"
+
+#if defined(_MSC_VER)
+#pragma warning(push)
+#pragma warning(disable:4250)
+#endif /* _MSC_VER */
+
+TAO_BEGIN_VERSIONED_NAMESPACE_DECL
+
+class TAO_LogMgr_i;
+class TAO_EventLog_i;
+class TAO_EventLogFactory_i;
+
+/**
+ * @class TAO_EventLog_i
+ *
+ * @brief The EventLog is an EventChannel and a Log.
+ *
+ * It is used to log events that pass through the EventChannel.
+ * The class supports the @c destroy> method to destroy the Log.
+ */
+class TAO_EventLog_i :
+ public TAO_Log_i,
+ public POA_DsEventLogAdmin::EventLog
+{
+public:
+
+ // = Initialization and Termination.
+
+ /// Constructor.
+ TAO_EventLog_i (CORBA::ORB_ptr orb,
+ PortableServer::POA_ptr poa,
+ PortableServer::POA_ptr log_poa,
+ TAO_LogMgr_i &logmgr_i,
+ DsLogAdmin::LogMgr_ptr factory,
+ TAO_LogNotification *log_notifier,
+ DsLogAdmin::LogId id);
+
+ /// Duplicate the log.
+ virtual DsLogAdmin::Log_ptr copy (DsLogAdmin::LogId &id
+ ACE_ENV_ARG_DECL)
+ ACE_THROW_SPEC ((CORBA::SystemException));
+
+ /// Duplicate the log specifying an id.
+ virtual DsLogAdmin::Log_ptr copy_with_id (DsLogAdmin::LogId id
+ ACE_ENV_ARG_DECL)
+ ACE_THROW_SPEC ((CORBA::SystemException));
+
+ /// Destroy the log object and all contained records.
+ void
+ destroy (ACE_ENV_SINGLE_ARG_DECL)
+ ACE_THROW_SPEC ((CORBA::SystemException));
+
+ /// Activate the EventLog.
+ void
+ activate (ACE_ENV_SINGLE_ARG_DECL);
+
+ // = The CosEventChannelAdmin::EventChannel interface methods.
+ CosEventChannelAdmin::ConsumerAdmin_ptr
+ for_consumers (ACE_ENV_SINGLE_ARG_DECL)
+ ACE_THROW_SPEC ((
+ CORBA::SystemException
+ ));
+
+ CosEventChannelAdmin::SupplierAdmin_ptr
+ for_suppliers (ACE_ENV_SINGLE_ARG_DECL)
+ ACE_THROW_SPEC ((
+ CORBA::SystemException
+ ));
+
+protected:
+
+ /// Destructor
+ /**
+ * Protected destructor to enforce proper memory management through
+ * reference counting.
+ */
+ ~TAO_EventLog_i ();
+
+private:
+
+ /// The Event Channel that the log uses.
+ TAO_CEC_EventChannel *event_channel_;
+
+ /// The PushConsumer that consumes the events and stores them
+ /// in the log.
+ TAO_Event_LogConsumer *my_log_consumer_;
+
+ PortableServer::POA_var poa_;
+
+ PortableServer::POA_var log_poa_;
+};
+
+TAO_END_VERSIONED_NAMESPACE_DECL
+
+#if defined(_MSC_VER)
+#pragma warning(pop)
+#endif /* _MSC_VER */
+
+#include /**/ "ace/post.h"
+#endif /* TAO_TLS_EVENTLOG_I_H */
diff --git a/TAO/orbsvcs/orbsvcs/Log/Hash_Iterator_i.cpp b/TAO/orbsvcs/orbsvcs/Log/Hash_Iterator_i.cpp
new file mode 100644
index 00000000000..233143bb12f
--- /dev/null
+++ b/TAO/orbsvcs/orbsvcs/Log/Hash_Iterator_i.cpp
@@ -0,0 +1,110 @@
+#include "orbsvcs/Log/Hash_Iterator_i.h"
+#include "orbsvcs/Log/Log_Constraint_Interpreter.h"
+#include "orbsvcs/Log/Log_Constraint_Visitors.h"
+#include "orbsvcs/DsLogAdminC.h"
+
+ACE_RCSID (Log,
+ Hash_Iterator_i,
+ "$Id$")
+
+TAO_BEGIN_VERSIONED_NAMESPACE_DECL
+
+TAO_Hash_Iterator_i::TAO_Hash_Iterator_i (
+ ACE_Reactor* reactor,
+ TAO_Hash_LogRecordStore* recordstore,
+ TAO_Hash_LogRecordStore::LOG_RECORD_STORE_ITER iter,
+ TAO_Hash_LogRecordStore::LOG_RECORD_STORE_ITER iter_end,
+ CORBA::ULong start,
+ const char *constraint,
+ CORBA::ULong max_rec_list_len)
+ : TAO_Iterator_i(reactor),
+ recordstore_ (recordstore),
+ iter_ (iter),
+ iter_end_ (iter_end),
+ current_position_(start),
+ constraint_ (constraint),
+ max_rec_list_len_ (max_rec_list_len)
+{
+}
+
+
+TAO_Hash_Iterator_i::~TAO_Hash_Iterator_i (void)
+{
+}
+
+
+DsLogAdmin::RecordList*
+TAO_Hash_Iterator_i::get (CORBA::ULong position,
+ CORBA::ULong how_many
+ ACE_ENV_ARG_DECL)
+ ACE_THROW_SPEC ((CORBA::SystemException,
+ DsLogAdmin::InvalidParam))
+{
+ ACE_READ_GUARD_THROW_EX (ACE_SYNCH_RW_MUTEX,
+ guard,
+ this->recordstore_->lock (),
+ CORBA::INTERNAL ());
+ ACE_CHECK_RETURN (0);
+
+ if (position < current_position_)
+ {
+ ACE_THROW_RETURN (DsLogAdmin::InvalidParam (), 0);
+ }
+
+ if (how_many == 0)
+ {
+ how_many = this->max_rec_list_len_;
+ }
+
+ // Use an Interpreter to build an expression tree.
+ TAO_Log_Constraint_Interpreter interpreter (constraint_.in ()
+ ACE_ENV_ARG_PARAMETER);
+ ACE_CHECK_RETURN (0);
+
+ // Sequentially iterate over all the records and pick the ones that
+ // meet the constraints.
+
+ // Allocate the list of <how_many> length.
+ DsLogAdmin::RecordList* rec_list;
+ ACE_NEW_THROW_EX (rec_list,
+ DsLogAdmin::RecordList (how_many),
+ CORBA::NO_MEMORY ());
+ ACE_CHECK_RETURN (0);
+ rec_list->length (how_many);
+
+ CORBA::ULong count = 0;
+ CORBA::ULong current_position = this->current_position_;
+
+ for ( ;
+ ((this->iter_ != this->iter_end_) && (count < how_many));
+ ++this->iter_)
+ {
+ // Use an evaluator.
+ TAO_Log_Constraint_Visitor visitor (this->iter_->item ());
+
+ // Does it match the constraint?
+ if (interpreter.evaluate (visitor) == 1)
+ {
+ if (++current_position >= position)
+ {
+ (*rec_list)[count] = this->iter_->item ();
+ // copy the log record.
+ count++;
+ }
+ }
+ }
+
+ rec_list->length (count);
+ this->current_position_ = current_position;
+
+ if (count == 0 && this->iter_ == this->iter_end_)
+ {
+ // destroy this object..
+ this->destroy (ACE_ENV_SINGLE_ARG_PARAMETER);
+ ACE_CHECK_RETURN (rec_list);
+ }
+
+ return rec_list;
+}
+
+TAO_END_VERSIONED_NAMESPACE_DECL
diff --git a/TAO/orbsvcs/orbsvcs/Log/Hash_Iterator_i.h b/TAO/orbsvcs/orbsvcs/Log/Hash_Iterator_i.h
new file mode 100644
index 00000000000..375735a43ce
--- /dev/null
+++ b/TAO/orbsvcs/orbsvcs/Log/Hash_Iterator_i.h
@@ -0,0 +1,95 @@
+// -*- C++ -*-
+
+//=============================================================================
+/**
+ * @file Hash_Iterator_i.h
+ *
+ * $Id$
+ *
+ * Implementation of the DsLogAdmin::Iterator interface.
+ *
+ * @author Matthew Braun <mjb2@cs.wustl.edu>
+ * @author Pradeep Gore <pradeep@cs.wustl.edu>
+ */
+//=============================================================================
+
+#ifndef TAO_TLS_HASH_ITERATOR_H
+#define TAO_TLS_HASH_ITERATOR_H
+#include /**/ "ace/pre.h"
+#include /**/ "ace/config-all.h"
+
+#if !defined (ACE_LACKS_PRAGMA_ONCE)
+# pragma once
+#endif /* ACE_LACKS_PRAGMA_ONCE */
+
+#include "orbsvcs/Log/Iterator_i.h"
+#include "orbsvcs/Log/Hash_LogRecordStore.h"
+
+// This is to remove "inherits via dominance" warnings from MSVC.
+// MSVC is being a little too paranoid.
+#if defined(_MSC_VER)
+#pragma warning(push)
+#pragma warning(disable:4250)
+#endif /* _MSC_VER */
+
+TAO_BEGIN_VERSIONED_NAMESPACE_DECL
+
+/**
+ * @class TAO_Hash_Iterator_i
+ *
+ * @brief Iterator to get LogRecords for the log via a query.
+ */
+class TAO_Log_Serv_Export TAO_Hash_Iterator_i
+ : public TAO_Iterator_i
+{
+public:
+
+ // = Initialization and Termination methods.
+
+ /// Constructor.
+ TAO_Hash_Iterator_i (ACE_Reactor* reactor,
+ TAO_Hash_LogRecordStore* recordstore,
+ TAO_Hash_LogRecordStore::LOG_RECORD_STORE_ITER iter,
+ TAO_Hash_LogRecordStore::LOG_RECORD_STORE_ITER iter_end,
+ CORBA::ULong start,
+ const char *constraint,
+ CORBA::ULong max_rec_list_len);
+
+ /// Destructor.
+ virtual ~TAO_Hash_Iterator_i (void);
+
+ /// Gets a list of LogRecords.
+ virtual DsLogAdmin::RecordList* get (CORBA::ULong position,
+ CORBA::ULong how_many
+ ACE_ENV_ARG_DECL)
+ ACE_THROW_SPEC ((CORBA::SystemException,
+ DsLogAdmin::InvalidParam));
+
+private:
+ /// Pointer to record store
+ TAO_Hash_LogRecordStore* recordstore_;
+
+ /// Current Iterator.
+ TAO_Hash_LogRecordStore::LOG_RECORD_STORE_ITER iter_;
+
+ /// End Iterator.
+ TAO_Hash_LogRecordStore::LOG_RECORD_STORE_ITER iter_end_;
+
+ /// Position.
+ CORBA::ULong current_position_;
+
+ /// Constraint.
+ CORBA::String_var constraint_;
+
+ /// Max rec list length.
+ CORBA::ULong max_rec_list_len_;
+};
+
+TAO_END_VERSIONED_NAMESPACE_DECL
+
+#if defined(_MSC_VER)
+#pragma warning(pop)
+#endif /* _MSC_VER */
+
+#include /**/ "ace/post.h"
+#endif /* TAO_TLS_HASH_ITERATOR_H */
diff --git a/TAO/orbsvcs/orbsvcs/Log/Hash_LogRecordStore.cpp b/TAO/orbsvcs/orbsvcs/Log/Hash_LogRecordStore.cpp
new file mode 100644
index 00000000000..3ae2885472f
--- /dev/null
+++ b/TAO/orbsvcs/orbsvcs/Log/Hash_LogRecordStore.cpp
@@ -0,0 +1,832 @@
+#include "orbsvcs/Log/LogMgr_i.h"
+#include "orbsvcs/Log/Hash_LogRecordStore.h"
+#include "orbsvcs/Log/Hash_Iterator_i.h"
+#include "orbsvcs/Log/Log_Constraint_Interpreter.h"
+#include "orbsvcs/Log/Log_Constraint_Visitors.h"
+#include "orbsvcs/Time_Utilities.h"
+#include "tao/Utils/PolicyList_Destroyer.h"
+#include "tao/AnyTypeCode/Any_Unknown_IDL_Type.h"
+#include "tao/ORB_Core.h"
+#include "tao/debug.h"
+#include "ace/OS_NS_sys_time.h"
+
+ACE_RCSID (Log,
+ Hash_LogRecordStore,
+ "$Id$")
+
+TAO_BEGIN_VERSIONED_NAMESPACE_DECL
+
+TAO_Hash_LogRecordStore::TAO_Hash_LogRecordStore (
+ TAO_LogMgr_i* logmgr_i,
+ DsLogAdmin::LogId logid,
+ DsLogAdmin::LogFullActionType log_full_action,
+ CORBA::ULongLong max_size,
+ const DsLogAdmin::CapacityAlarmThresholdList* thresholds)
+ : logmgr_i_ (logmgr_i),
+ maxid_ (0),
+ max_size_ (max_size),
+ id_ (logid),
+ current_size_ (0),
+ num_records_ (0),
+ gauge_ (0),
+ max_rec_list_len_ (LOG_DEFAULT_MAX_REC_LIST_LEN),
+ admin_state_ (DsLogAdmin::unlocked),
+ forward_state_ (DsLogAdmin::on),
+ log_full_action_ (log_full_action),
+ max_record_life_ (0),
+ reactor_ (logmgr_i_->orb()->orb_core ()->reactor ())
+{
+ interval_.start = 0;
+ interval_.stop = 0;
+
+ if (thresholds)
+ {
+ this->thresholds_ = *thresholds;
+ }
+ else
+ {
+ this->thresholds_.length(1);
+ this->thresholds_[0] = 100;
+ }
+
+ this->log_qos_.length(1);
+ this->log_qos_[0] = DsLogAdmin::QoSNone;
+
+ PortableServer::POA_ptr log_poa =
+ logmgr_i_->log_poa();
+
+ // Create POA for iterators
+ TAO::Utils::PolicyList_Destroyer policies (2);
+ policies.length (2);
+
+ policies[0] =
+ log_poa->create_lifespan_policy (PortableServer::TRANSIENT);
+ policies[1] =
+ log_poa->create_id_assignment_policy (PortableServer::SYSTEM_ID);
+
+ char buf[32];
+ ACE_OS::snprintf (buf, sizeof (buf), "Log%d", (int) id_);
+
+ PortableServer::POAManager_var poa_manager =
+ log_poa->the_POAManager ();
+
+ this->iterator_poa_ =
+ log_poa->create_POA(buf, PortableServer::POAManager::_nil(), policies);
+}
+
+TAO_Hash_LogRecordStore::~TAO_Hash_LogRecordStore (void)
+{
+ ACE_DEBUG((LM_DEBUG, "TAO_Hash_LogRecordStore::~TAO_Hash_LogRecordStore ()\n"));
+ this->iterator_poa_->destroy (1, 0);
+ ACE_DEBUG((LM_DEBUG, "TAO_Hash_LogRecordStore::~TAO_Hash_LogRecordStore ()\n"));
+}
+
+int
+TAO_Hash_LogRecordStore::open (void)
+{
+ return rec_map_.open ();
+}
+
+int
+TAO_Hash_LogRecordStore::close (void)
+{
+ // Close the hash
+ return rec_map_.close ();
+}
+
+CORBA::ULongLong
+TAO_Hash_LogRecordStore::get_current_size (ACE_ENV_SINGLE_ARG_DECL)
+{
+ return this->current_size_;
+}
+
+CORBA::ULongLong
+TAO_Hash_LogRecordStore::get_n_records (ACE_ENV_SINGLE_ARG_DECL)
+{
+ return this->num_records_;
+}
+
+CORBA::ULongLong
+TAO_Hash_LogRecordStore::get_gauge (ACE_ENV_SINGLE_ARG_DECL)
+{
+ return this->gauge_;
+}
+
+void
+TAO_Hash_LogRecordStore::reset_gauge (ACE_ENV_SINGLE_ARG_DECL)
+{
+ this->gauge_ = 0;
+}
+
+int
+TAO_Hash_LogRecordStore::log (const DsLogAdmin::LogRecord &const_rec
+ ACE_ENV_ARG_DECL)
+{
+ // Get log record size...
+ size_t record_size = log_record_size (const_rec);
+
+ // Check if we are allowed to write...
+ if (max_size_ !=0 && ((current_size_ + record_size) >= max_size_))
+ return 1; // return code for log rec. full
+
+ // Copy record...
+ DsLogAdmin::LogRecord rec = const_rec;
+
+ // Initialize a couple of fields first...
+ // ACE emulation of U Long Long (for platforms that don't have one)
+ // does not define postfix operators
+ rec.id = ++maxid_;
+
+ ORBSVCS_Time::Time_Value_to_TimeT(rec.time,ACE_OS::gettimeofday());
+
+ // First, bind the id to the LogRecord in the hash_map
+ if (this->rec_map_.bind (rec.id, rec) != 0)
+ {
+#if defined (ACE_LACKS_LONGLONG_T)
+ ACE_ERROR_RETURN ((LM_ERROR,
+ "LogRecordStore (%P|%t):Failed to bind %d in the hash map\n",
+ ACE_U64_TO_U32(rec.id)),
+ -1);
+#else
+ ACE_ERROR_RETURN ((LM_ERROR,
+ "LogRecordStore (%P|%t):Failed to bind %Q in the hash map\n",
+ rec.id),
+ -1);
+#endif
+ }
+
+ // Increment the number of records in the log
+ ++this->num_records_;
+ this->current_size_ += record_size;
+ this->gauge_ += record_size;
+
+ return 0;
+}
+
+int
+TAO_Hash_LogRecordStore::retrieve_i (DsLogAdmin::RecordId id,
+ DsLogAdmin::LogRecord &rec
+ ACE_ENV_ARG_DECL)
+{
+ int retval = rec_map_.find (id, rec);
+ return retval;
+}
+
+int
+TAO_Hash_LogRecordStore::update_i (DsLogAdmin::LogRecord &rec
+ ACE_ENV_ARG_DECL)
+{
+ DsLogAdmin::LogRecord oldrec;
+
+ if (rec_map_.unbind (rec.id, oldrec) != 0)
+ {
+ return -1;
+ }
+
+ --this->num_records_;
+ this->current_size_ -= log_record_size(oldrec);
+
+ if (rec_map_.bind (rec.id, rec) != 0)
+ {
+ return -1;
+ }
+
+ ++this->num_records_;
+ this->current_size_ += log_record_size(rec);
+
+ return 0;
+}
+
+int
+TAO_Hash_LogRecordStore::remove_i (DsLogAdmin::RecordId id
+ ACE_ENV_ARG_DECL)
+{
+ DsLogAdmin::LogRecord rec;
+ if (rec_map_.unbind (id, rec) != 0)
+ {
+ return -1;
+ }
+
+ --this->num_records_;
+ this->current_size_ -= log_record_size(rec);
+
+ return 0;
+}
+
+void
+TAO_Hash_LogRecordStore::remove_i (LOG_RECORD_STORE_ITER iter
+ ACE_ENV_ARG_DECL)
+{
+ size_t size = log_record_size(iter->item ());
+
+ rec_map_.unbind(&*iter);
+
+ --this->num_records_;
+ this->current_size_ -= size;
+}
+
+int
+TAO_Hash_LogRecordStore::purge_old_records (ACE_ENV_SINGLE_ARG_DECL)
+{
+ CORBA::ULongLong num_records_to_purge = this->num_records_ * 5U / 100U;
+
+ if (num_records_to_purge < 1)
+ num_records_to_purge = 1;
+
+ CORBA::ULong count = 0; // count of matches found.
+
+ if (num_records_to_purge > 0 )
+ {
+ // Create iterators
+ LOG_RECORD_STORE_ITER iter (rec_map_.begin ());
+ LOG_RECORD_STORE_ITER iter_end (rec_map_.end ());
+
+ for (CORBA::ULongLong i = 0;
+ iter != iter_end && i < num_records_to_purge;
+ ++i)
+ {
+ this->remove_i (iter++);
+ count++;
+ }
+ }
+
+ return count;
+}
+
+void
+TAO_Hash_LogRecordStore::set_record_attribute (DsLogAdmin::RecordId id,
+ const DsLogAdmin::NVList
+ &attr_list
+ ACE_ENV_ARG_DECL)
+ ACE_THROW_SPEC ((CORBA::SystemException,
+ DsLogAdmin::InvalidRecordId,
+ DsLogAdmin::InvalidAttribute))
+{
+ // TODO: validate attributes here.
+
+ DsLogAdmin::LogRecord rec;
+ if (this->retrieve_i (id, rec ACE_ENV_ARG_PARAMETER) == -1)
+ {
+ ACE_THROW (DsLogAdmin::InvalidRecordId ());
+ }
+
+ rec.attr_list = attr_list;
+
+ if (this->update_i (rec ACE_ENV_ARG_PARAMETER) == -1)
+ {
+ ACE_THROW (CORBA::PERSIST_STORE ());
+ }
+}
+
+CORBA::ULong
+TAO_Hash_LogRecordStore::set_records_attribute (
+ const char *grammar,
+ const char *constraint,
+ const DsLogAdmin::NVList
+ &attr_list ACE_ENV_ARG_DECL)
+ ACE_THROW_SPEC ((CORBA::SystemException,
+ DsLogAdmin::InvalidGrammar,
+ DsLogAdmin::InvalidConstraint,
+ DsLogAdmin::InvalidAttribute))
+{
+ this->check_grammar (grammar ACE_ENV_ARG_PARAMETER);
+ ACE_CHECK_RETURN (0);
+
+ // TODO: validate attributes here.
+
+ // Use an Interpreter to build an expression tree.
+ TAO_Log_Constraint_Interpreter interpreter (constraint
+ ACE_ENV_ARG_PARAMETER);
+ ACE_CHECK_RETURN (0);
+
+ // Create iterators
+ LOG_RECORD_STORE_ITER iter (rec_map_.begin ());
+ LOG_RECORD_STORE_ITER iter_end (rec_map_.end ());
+
+ CORBA::ULong count = 0; // count of matches found.
+
+ for ( ; iter != iter_end; ++iter)
+ {
+ // Use an evaluator.
+ TAO_Log_Constraint_Visitor evaluator (iter->item ());
+
+ // Does it match the constraint?
+ if (interpreter.evaluate (evaluator) == 1)
+ {
+ set_record_attribute (iter->item ().id, attr_list);
+ ++count;
+ }
+ }
+
+ return count;
+}
+
+DsLogAdmin::NVList*
+TAO_Hash_LogRecordStore::get_record_attribute (DsLogAdmin::RecordId id
+ ACE_ENV_ARG_DECL)
+ ACE_THROW_SPEC ((CORBA::SystemException,
+ DsLogAdmin::InvalidRecordId))
+{
+ DsLogAdmin::LogRecord rec;
+
+ int retval = this->retrieve_i (id, rec ACE_ENV_ARG_PARAMETER);
+ ACE_CHECK_RETURN (0);
+
+ if (retval == -1)
+ {
+ ACE_THROW_RETURN (DsLogAdmin::InvalidRecordId (),
+ 0);
+ }
+
+ DsLogAdmin::NVList* nvlist = 0;
+ ACE_NEW_THROW_EX (nvlist,
+ DsLogAdmin::NVList (rec.attr_list),
+ CORBA::NO_MEMORY ());
+ ACE_CHECK_RETURN (0);
+
+ return nvlist;
+}
+
+
+int
+TAO_Hash_LogRecordStore::flush (ACE_ENV_SINGLE_ARG_DECL_NOT_USED)
+{
+ return 0;
+}
+
+size_t
+TAO_Hash_LogRecordStore::log_record_size (const DsLogAdmin::LogRecord &rec)
+{
+ size_t mb_size = 0;
+ TAO::Any_Impl *impl = rec.info.impl ();
+
+ if (impl->encoded ())
+ {
+ TAO::Unknown_IDL_Type *unk =
+ dynamic_cast<TAO::Unknown_IDL_Type *> (impl);
+
+ mb_size = unk->_tao_get_cdr ().start ()->length ();
+ }
+ else
+ {
+ // If the Any is not encoded, it just has a stored value
+ // instead of a CDR stream, not sure what info would be
+ // useful here.
+ }
+
+ return sizeof (rec) + mb_size;
+}
+
+DsLogAdmin::RecordList*
+TAO_Hash_LogRecordStore::query_i (const char *constraint,
+ DsLogAdmin::Iterator_out &iter_out,
+ CORBA::ULong how_many
+ ACE_ENV_ARG_DECL)
+ ACE_THROW_SPEC ((CORBA::SystemException,
+ DsLogAdmin::InvalidConstraint))
+{
+ // Use an Interpreter to build an expression tree.
+ TAO_Log_Constraint_Interpreter interpreter (constraint
+ ACE_ENV_ARG_PARAMETER);
+ ACE_CHECK_RETURN (0);
+
+ // Sequentially iterate over all the records and pick the ones that
+ // meet the constraints.
+
+ // Allocate the list of <how_many> length.
+ DsLogAdmin::RecordList* rec_list;
+ ACE_NEW_THROW_EX (rec_list,
+ DsLogAdmin::RecordList (how_many),
+ CORBA::NO_MEMORY ());
+ ACE_CHECK_RETURN (0);
+ rec_list->length(how_many);
+
+ // Create iterators
+ LOG_RECORD_STORE_ITER iter (rec_map_.begin ());
+ LOG_RECORD_STORE_ITER iter_end (rec_map_.end ());
+
+ CORBA::ULong count = 0; // count of matches found.
+
+ for ( ; ((iter != iter_end) && (count < how_many)); ++iter)
+ {
+ // Use an evaluator.
+ TAO_Log_Constraint_Visitor evaluator (iter->item ());
+
+ // Does it match the constraint?
+ if (interpreter.evaluate (evaluator) == 1)
+ {
+ if (TAO_debug_level > 0)
+ {
+#if defined (ACE_LACKS_LONGLONG_T)
+ ACE_DEBUG ((LM_DEBUG,"Matched constraint! d = %d, Time = %d\n",
+ ACE_U64_TO_U32 (iter->item ().id),
+ ACE_U64_TO_U32 (iter->item ().time)));
+
+#else
+ ACE_DEBUG ((LM_DEBUG,"Matched constraint! d = %Q, Time = %Q\n",
+ iter->item ().id,
+ iter->item ().time));
+#endif
+ }
+
+ (*rec_list)[count] = iter->item ();
+ // copy the log record.
+ count++;
+ }
+ }
+
+ rec_list->length (count);
+
+ if (iter != iter_end) // There are more records to process.
+ {
+ // Create an iterator to pass out.
+ TAO_Hash_Iterator_i *iter_query = 0;
+ ACE_NEW_THROW_EX (iter_query,
+ TAO_Hash_Iterator_i (this->reactor_,
+ this,
+ iter,
+ iter_end,
+ count,
+ constraint,
+ this->max_rec_list_len_),
+ CORBA::NO_MEMORY ());
+ ACE_CHECK_RETURN (rec_list);
+
+ // Transfer ownership to the POA.
+ PortableServer::ServantBase_var safe_iter_query = iter_query;
+
+ // Activate it.
+ PortableServer::ObjectId_var oid =
+ this->iterator_poa_->activate_object (iter_query);
+ CORBA::Object_var obj =
+ this->iterator_poa_->id_to_reference (oid);
+
+ // Narrow it
+ iter_out = DsLogAdmin::Iterator::_narrow (obj.in ());
+ }
+
+ return rec_list;
+}
+
+DsLogAdmin::RecordList*
+TAO_Hash_LogRecordStore::query (const char *grammar,
+ const char *constraint,
+ DsLogAdmin::Iterator_out iter_out
+ ACE_ENV_ARG_DECL)
+ ACE_THROW_SPEC ((CORBA::SystemException,
+ DsLogAdmin::InvalidGrammar,
+ DsLogAdmin::InvalidConstraint))
+{
+ this->check_grammar (grammar ACE_ENV_ARG_PARAMETER);
+ ACE_CHECK_RETURN (0);
+
+ return this->query_i (constraint,
+ iter_out,
+ this->max_rec_list_len_
+ ACE_ENV_ARG_PARAMETER);
+}
+
+DsLogAdmin::RecordList*
+TAO_Hash_LogRecordStore::retrieve (DsLogAdmin::TimeT from_time,
+ CORBA::Long how_many,
+ DsLogAdmin::Iterator_out iter_out
+ ACE_ENV_ARG_DECL)
+ ACE_THROW_SPEC ((CORBA::SystemException))
+{
+ // Decide between forward vs backward retrieval.
+ char constraint[32];
+ char uint64_formating[32];
+
+#if defined (ACE_LACKS_LONGLONG_T)
+ ACE_OS::sprintf (uint64_formating,
+ "%u",
+ ACE_U64_TO_U32 (from_time));
+#else
+ ACE_OS::sprintf (uint64_formating,
+ ACE_UINT64_FORMAT_SPECIFIER,
+ from_time);
+#endif
+
+ if (how_many >= 0)
+ ACE_OS::sprintf (constraint, "time >= %s", uint64_formating);
+ else
+ {
+ ACE_OS::sprintf (constraint, "time < %s", uint64_formating);
+ how_many = -(how_many);
+ }
+
+ return this->query_i (constraint,
+ iter_out,
+ how_many
+ ACE_ENV_ARG_PARAMETER);
+}
+
+CORBA::ULong
+TAO_Hash_LogRecordStore::match (const char* grammar,
+ const char *constraint
+ ACE_ENV_ARG_DECL)
+ ACE_THROW_SPEC ((CORBA::SystemException,
+ DsLogAdmin::InvalidGrammar,
+ DsLogAdmin::InvalidConstraint))
+{
+ this->check_grammar (grammar ACE_ENV_ARG_PARAMETER);
+ ACE_CHECK_RETURN (0);
+
+ // Use an Interpreter to build an expression tree.
+ TAO_Log_Constraint_Interpreter interpreter (constraint
+ ACE_ENV_ARG_PARAMETER);
+ ACE_CHECK_RETURN (0);
+
+ // Create iterators
+ LOG_RECORD_STORE_ITER iter (rec_map_.begin ());
+ LOG_RECORD_STORE_ITER iter_end (rec_map_.end ());
+
+ CORBA::ULong count = 0; // count of matches found.
+
+ for ( ; iter != iter_end; ++iter)
+ {
+ // Use an evaluator.
+ TAO_Log_Constraint_Visitor evaluator (iter->item ());
+
+ // Does it match the constraint?
+ if (interpreter.evaluate (evaluator) == 1)
+ {
+ count++;
+ }
+ }
+
+ return count;
+}
+
+CORBA::ULong
+TAO_Hash_LogRecordStore::delete_records (const char *grammar,
+ const char *constraint
+ ACE_ENV_ARG_DECL)
+ ACE_THROW_SPEC ((CORBA::SystemException,
+ DsLogAdmin::InvalidGrammar,
+ DsLogAdmin::InvalidConstraint))
+{
+ this->check_grammar (grammar ACE_ENV_ARG_PARAMETER);
+ ACE_CHECK_RETURN (0);
+
+ // Use an Interpreter to build an expression tree.
+ TAO_Log_Constraint_Interpreter interpreter (constraint
+ ACE_ENV_ARG_PARAMETER);
+ ACE_CHECK_RETURN (0);
+
+ // Create iterators
+ LOG_RECORD_STORE_ITER iter (rec_map_.begin ());
+ LOG_RECORD_STORE_ITER iter_end (rec_map_.end ());
+
+ CORBA::ULong count = 0; // count of matches found.
+
+ while (iter != iter_end)
+ {
+ // Use an evaluator.
+ TAO_Log_Constraint_Visitor evaluator (iter->item ());
+
+ // Does it match the constraint?
+ if (interpreter.evaluate (evaluator) == 1)
+ {
+ this->remove_i (iter++);
+ count++;
+ }
+ else
+ {
+ ++iter;
+ }
+ }
+
+ return count;
+}
+
+CORBA::ULong
+TAO_Hash_LogRecordStore::delete_records_by_id (const DsLogAdmin::RecordIdList &ids
+ ACE_ENV_ARG_DECL)
+ ACE_THROW_SPEC ((CORBA::SystemException))
+{
+ CORBA::ULong count (0);
+
+ for (CORBA::ULong i = 0; i < ids.length (); i++)
+ {
+ if (this->remove_i (ids [i]) == 0)
+ {
+ count++;
+ }
+ }
+
+ return count;
+}
+
+CORBA::ULong
+TAO_Hash_LogRecordStore::remove_old_records (ACE_ENV_SINGLE_ARG_DECL)
+{
+ if (this->max_record_life_ == 0) {
+ return 0;
+ }
+
+ TimeBase::TimeT purge_time;
+ ORBSVCS_Time::Time_Value_to_TimeT (purge_time,
+ (ACE_OS::gettimeofday() - ACE_Time_Value(this->max_record_life_)));
+
+ CORBA::ULongLong p_time = (CORBA::ULongLong) purge_time;
+
+ static char out[256] = "";
+
+ double temp1 =
+ static_cast<double> (ACE_UINT64_DBLCAST_ADAPTER (p_time));
+
+ ACE_OS::sprintf (out, "time < %.0f", temp1);
+
+ // Use an Interpreter to build an expression tree.
+ TAO_Log_Constraint_Interpreter interpreter (out
+ ACE_ENV_ARG_PARAMETER);
+ ACE_CHECK_RETURN (0);
+
+ // Create iterators
+ LOG_RECORD_STORE_ITER iter (rec_map_.begin ());
+ LOG_RECORD_STORE_ITER iter_end (rec_map_.end ());
+
+ CORBA::ULong count = 0; // count of matches found.
+
+ while (iter != iter_end)
+ {
+ // Use an evaluator.
+ TAO_Log_Constraint_Visitor evaluator (iter->item ());
+
+ // Does it match the constraint?
+ if (interpreter.evaluate (evaluator) == 1)
+ {
+ this->remove_i (iter++);
+ count++;
+ }
+ else
+ {
+ ++iter;
+ }
+ }
+
+ return count;
+}
+
+ACE_SYNCH_RW_MUTEX&
+TAO_Hash_LogRecordStore::lock()
+{
+ return lock_;
+}
+
+
+void
+TAO_Hash_LogRecordStore::check_grammar (const char* grammar
+ ACE_ENV_ARG_DECL)
+ ACE_THROW_SPEC ((CORBA::SystemException,
+ DsLogAdmin::InvalidGrammar))
+{
+ // Verify grammar
+ if (ACE_OS::strcmp (grammar, "TCL") != 0 &&
+ ACE_OS::strcmp (grammar, "ETCL") != 0 &&
+ ACE_OS::strcmp (grammar, "EXTENDED_TCL") != 0)
+ ACE_THROW (DsLogAdmin::InvalidGrammar ());
+}
+
+
+DsLogAdmin::AdministrativeState
+TAO_Hash_LogRecordStore::get_administrative_state (ACE_ENV_SINGLE_ARG_DECL) const
+{
+ return this->admin_state_;
+}
+
+void
+TAO_Hash_LogRecordStore::set_administrative_state (DsLogAdmin::AdministrativeState state
+ ACE_ENV_ARG_DECL)
+{
+ this->admin_state_ = state;
+}
+
+
+DsLogAdmin::CapacityAlarmThresholdList*
+TAO_Hash_LogRecordStore::get_capacity_alarm_thresholds (ACE_ENV_SINGLE_ARG_DECL) const
+{
+ DsLogAdmin::CapacityAlarmThresholdList* ret_val;
+ ACE_NEW_THROW_EX (ret_val,
+ DsLogAdmin::CapacityAlarmThresholdList (this->thresholds_),
+ CORBA::NO_MEMORY ());
+ ACE_CHECK_RETURN (0);
+
+ return ret_val;
+}
+
+void
+TAO_Hash_LogRecordStore::set_capacity_alarm_thresholds (const DsLogAdmin::CapacityAlarmThresholdList& thresholds
+ ACE_ENV_ARG_DECL)
+{
+ this->thresholds_ = thresholds;
+}
+
+
+
+DsLogAdmin::ForwardingState
+TAO_Hash_LogRecordStore::get_forwarding_state (ACE_ENV_SINGLE_ARG_DECL) const
+{
+ return this->forward_state_;
+}
+
+void
+TAO_Hash_LogRecordStore::set_forwarding_state (DsLogAdmin::ForwardingState state
+ ACE_ENV_ARG_DECL)
+{
+ this->forward_state_ = state;
+}
+
+DsLogAdmin::TimeInterval
+TAO_Hash_LogRecordStore::get_interval (ACE_ENV_SINGLE_ARG_DECL) const
+{
+ return this->interval_;
+}
+
+void
+TAO_Hash_LogRecordStore::set_interval (const DsLogAdmin::TimeInterval &interval
+ ACE_ENV_ARG_DECL)
+{
+ this->interval_ = interval;
+}
+
+
+DsLogAdmin::LogFullActionType
+TAO_Hash_LogRecordStore::get_log_full_action (ACE_ENV_SINGLE_ARG_DECL) const
+{
+ return this->log_full_action_;
+}
+
+void
+TAO_Hash_LogRecordStore::set_log_full_action (DsLogAdmin::LogFullActionType action
+ ACE_ENV_ARG_DECL)
+{
+ this->log_full_action_ = action;
+}
+
+DsLogAdmin::QoSList *
+TAO_Hash_LogRecordStore::get_log_qos (ACE_ENV_SINGLE_ARG_DECL) const
+{
+ DsLogAdmin::QoSList* ret_val;
+ ACE_NEW_THROW_EX (ret_val,
+ DsLogAdmin::QoSList (this->log_qos_),
+ CORBA::NO_MEMORY ());
+ ACE_CHECK_RETURN (0);
+
+ return ret_val;
+}
+
+void
+TAO_Hash_LogRecordStore::set_log_qos (const DsLogAdmin::QoSList& qos
+ ACE_ENV_ARG_DECL)
+{
+ this->log_qos_ = qos;
+}
+
+CORBA::ULong
+TAO_Hash_LogRecordStore::get_max_record_life (ACE_ENV_SINGLE_ARG_DECL) const
+{
+ return this->max_record_life_;
+}
+
+void
+TAO_Hash_LogRecordStore::set_max_record_life (CORBA::ULong max_record_life
+ ACE_ENV_ARG_DECL)
+{
+ this->max_record_life_ = max_record_life;
+}
+
+CORBA::ULongLong
+TAO_Hash_LogRecordStore::get_max_size (ACE_ENV_SINGLE_ARG_DECL) const
+{
+ return this->max_size_;
+}
+
+void
+TAO_Hash_LogRecordStore::set_max_size (CORBA::ULongLong size
+ ACE_ENV_ARG_DECL)
+{
+ this->max_size_ = size;
+}
+
+DsLogAdmin::WeekMask*
+TAO_Hash_LogRecordStore::get_week_mask (ACE_ENV_SINGLE_ARG_DECL)
+{
+ DsLogAdmin::WeekMask* ret_val;
+ ACE_NEW_THROW_EX (ret_val,
+ DsLogAdmin::WeekMask (this->weekmask_),
+ CORBA::NO_MEMORY ());
+ ACE_CHECK_RETURN (0);
+
+ return ret_val;
+}
+
+void
+TAO_Hash_LogRecordStore::set_week_mask (const DsLogAdmin::WeekMask &masks
+ ACE_ENV_ARG_DECL)
+{
+ this->weekmask_ = masks;
+}
+
+TAO_END_VERSIONED_NAMESPACE_DECL
diff --git a/TAO/orbsvcs/orbsvcs/Log/Hash_LogRecordStore.h b/TAO/orbsvcs/orbsvcs/Log/Hash_LogRecordStore.h
new file mode 100644
index 00000000000..d4518fd3825
--- /dev/null
+++ b/TAO/orbsvcs/orbsvcs/Log/Hash_LogRecordStore.h
@@ -0,0 +1,399 @@
+// -*- C++ -*-
+
+//=============================================================================
+/**
+ * @file Hash_LogRecordStore.h
+ *
+ * $Id$
+ *
+ * @author Matthew Braun <mjb2@cs.wustl.edu>
+ * @author Pradeep Gore <pradeep@cs.wustl.edu>
+ * @author David A. Hanvey <d.hanvey@qub.ac.uk>
+ */
+//=============================================================================
+
+#ifndef TAO_HASH_LOG_RECORD_STORE_H
+#define TAO_HASH_LOG_RECORD_STORE_H
+
+#include /**/ "ace/pre.h"
+#include /**/ "ace/config-all.h"
+
+#if !defined (ACE_LACKS_PRAGMA_ONCE)
+# pragma once
+#endif /* ACE_LACKS_PRAGMA_ONCE */
+
+#include "orbsvcs/Log/LogRecordStore.h"
+#include "ace/Containers.h"
+#include "ace/RB_Tree.h"
+#include "ace/Synch_Traits.h"
+#include "ace/Null_Mutex.h"
+#include "ace/RW_Thread_Mutex.h"
+#include "ace/Reactor.h"
+#include "tao/PortableServer/PortableServer.h"
+#include "orbsvcs/Log/log_serv_export.h"
+
+#define LOG_DEFAULT_MAX_REC_LIST_LEN 100
+
+TAO_BEGIN_VERSIONED_NAMESPACE_DECL
+
+class TAO_LogMgr_i;
+
+/**
+ * @class TAO_Hash_LogRecordStore
+ *
+ * @brief A concrete container class for storing DsLogAdmin::LogRecords
+ *
+ * This implementation uses an ACE_RB_Tree to store LogRecords.
+ * Permits fast searches by id and iteration, while allowing for
+ * ring-buffer like wrapping of entries.
+ *
+ * @note The name of this class is somewhat misleading, as it no
+ * longer uses a ACE_Hash_Map.
+ *
+ * @note LogRecords should be indexed by both id and timestamp.
+ * However, timestamps are not unique keys and there are no ACE
+ * multimap containers.
+ *
+ * @todo If ACE_RB_Tree supported an insertion "hint" like std::map,
+ * log insertion would be O(1) instead of O(lgN). This could be an
+ * issue for large log channels.
+ */
+class TAO_Log_Serv_Export TAO_Hash_LogRecordStore
+ : public TAO_LogRecordStore
+{
+ public:
+
+ // = Initialization and termination methods
+
+ /// Constructor.
+ TAO_Hash_LogRecordStore (TAO_LogMgr_i* logmgr,
+ DsLogAdmin::LogId id,
+ DsLogAdmin::LogFullActionType log_full_action,
+ CORBA::ULongLong max_size,
+ const DsLogAdmin::CapacityAlarmThresholdList* thresholds
+ );
+
+ /// Destructor.
+ virtual ~TAO_Hash_LogRecordStore (void);
+
+ /// Initialization.
+ virtual int open (void);
+
+ /// Close the record store.
+ virtual int close (void);
+
+
+ // = Log Parameters
+
+ /// Gets the administrative state of the log
+ virtual DsLogAdmin::AdministrativeState
+ get_administrative_state (ACE_ENV_SINGLE_ARG_DECL) const;
+
+ /// Sets the administrative state of the log
+ virtual void
+ set_administrative_state (DsLogAdmin::AdministrativeState
+ ACE_ENV_ARG_DECL);
+
+ /// Get the capacity alarm thresholds
+ virtual DsLogAdmin::CapacityAlarmThresholdList*
+ get_capacity_alarm_thresholds (ACE_ENV_SINGLE_ARG_DECL) const;
+
+ /// Set the capacity alarm thresholds
+ virtual void
+ set_capacity_alarm_thresholds (const DsLogAdmin::CapacityAlarmThresholdList& thresholds
+ ACE_ENV_ARG_DECL);
+
+ /// Gets the forwarding state
+ virtual DsLogAdmin::ForwardingState
+ get_forwarding_state (ACE_ENV_SINGLE_ARG_DECL) const;
+
+ /// Sets the forwarding state
+ virtual void
+ set_forwarding_state (DsLogAdmin::ForwardingState state
+ ACE_ENV_ARG_DECL);
+
+ /// Get the log duration
+ virtual DsLogAdmin::TimeInterval
+ get_interval (ACE_ENV_SINGLE_ARG_DECL) const;
+
+ /// Set the log duration.
+ virtual void
+ set_interval (const DsLogAdmin::TimeInterval & interval
+ ACE_ENV_ARG_DECL);
+
+ /// Gets the log full action
+ virtual DsLogAdmin::LogFullActionType
+ get_log_full_action (ACE_ENV_SINGLE_ARG_DECL) const;
+
+ /// Sets the log full action
+ virtual void
+ set_log_full_action(DsLogAdmin::LogFullActionType action
+ ACE_ENV_ARG_DECL);
+
+ /// Get the list of the QoS properties supported by the log.
+ virtual DsLogAdmin::QoSList*
+ get_log_qos (ACE_ENV_SINGLE_ARG_DECL) const;
+
+ /// Set the list of the QoS properties supported by the log.
+ virtual void
+ set_log_qos (const DsLogAdmin::QoSList& qos
+ ACE_ENV_ARG_DECL);
+
+ /// Gets the max record life
+ virtual CORBA::ULong
+ get_max_record_life (ACE_ENV_SINGLE_ARG_DECL) const;
+
+ /// Sets the max record life
+ virtual void
+ set_max_record_life (CORBA::ULong life
+ ACE_ENV_ARG_DECL);
+
+ /// Get the current set value of the max size of the log data.
+ virtual CORBA::ULongLong
+ get_max_size (ACE_ENV_SINGLE_ARG_DECL) const;
+
+ /// Set the max size of log data. size == 0, => infinite.
+ virtual void
+ set_max_size (CORBA::ULongLong size
+ ACE_ENV_ARG_DECL);
+
+ /// Get the weekly scheduling parameters
+ virtual DsLogAdmin::WeekMask*
+ get_week_mask (ACE_ENV_SINGLE_ARG_DECL);
+
+ /// Set the weekly scheduling parameters.
+ virtual void
+ set_week_mask (const DsLogAdmin::WeekMask & masks
+ ACE_ENV_ARG_DECL);
+
+
+ // = LogRecordStore status methods
+
+ /// Gets the current size of the log data.
+ virtual CORBA::ULongLong
+ get_current_size (ACE_ENV_SINGLE_ARG_DECL);
+
+ /// Get the number of records in the log right now.
+ virtual CORBA::ULongLong
+ get_n_records (ACE_ENV_SINGLE_ARG_DECL);
+
+
+ // = LogRecordStore gauge
+
+ /// Gets the current value of the "gauge" that measures the total
+ /// size of the records written to the log.
+ virtual CORBA::ULongLong
+ get_gauge(ACE_ENV_SINGLE_ARG_DECL);
+
+ /// Resets the "gauge" to 0
+ virtual void
+ reset_gauge(ACE_ENV_SINGLE_ARG_DECL);
+
+
+ // = Record logging, retrieval, update and removal methods.
+
+ /// Insert rec into storage. Returns 0 on success -1 on failure and 1
+ /// if the log is full.
+ virtual int
+ log (const DsLogAdmin::LogRecord &rec ACE_ENV_ARG_DECL);
+
+ /// Deletes "old" records from the store.
+ virtual int
+ purge_old_records (ACE_ENV_SINGLE_ARG_DECL);
+
+ /// Set single record attributes.
+ virtual void
+ set_record_attribute (DsLogAdmin::RecordId id,
+ const DsLogAdmin::NVList & attr_list
+ ACE_ENV_ARG_DECL)
+ ACE_THROW_SPEC ((CORBA::SystemException,
+ DsLogAdmin::InvalidRecordId,
+ DsLogAdmin::InvalidAttribute));
+
+ /// Set the attributes of all records that matches the
+ /// constraints with same attr_list.
+ virtual CORBA::ULong
+ set_records_attribute (const char * grammar,
+ const char * c,
+ const DsLogAdmin::NVList & attr_list
+ ACE_ENV_ARG_DECL)
+ ACE_THROW_SPEC ((CORBA::SystemException,
+ DsLogAdmin::InvalidGrammar,
+ DsLogAdmin::InvalidConstraint,
+ DsLogAdmin::InvalidAttribute));
+
+ /// Get the attributes of the record with id <id>. Raises
+ /// DsLogAdmin::InvalidRecordId
+ virtual DsLogAdmin::NVList*
+ get_record_attribute (DsLogAdmin::RecordId id
+ ACE_ENV_ARG_DECL)
+ ACE_THROW_SPEC ((CORBA::SystemException,
+ DsLogAdmin::InvalidRecordId));
+
+ /// Ensure changes have been flushed to persistent media
+ /// Returns 0 on success, -1 on failure.
+ virtual int
+ flush (ACE_ENV_SINGLE_ARG_DECL);
+
+ /// Returns all records in the log that match the given constraint
+ /// <c>.
+ virtual DsLogAdmin::RecordList*
+ query (const char * grammar,
+ const char * c,
+ DsLogAdmin::Iterator_out i
+ ACE_ENV_ARG_DECL)
+ ACE_THROW_SPEC ((CORBA::SystemException,
+ DsLogAdmin::InvalidGrammar,
+ DsLogAdmin::InvalidConstraint));
+
+ /// Retrieve <how_many> records from time <from_time> using iterator
+ /// <i>.
+ virtual DsLogAdmin::RecordList*
+ retrieve (DsLogAdmin::TimeT from_time,
+ CORBA::Long how_many,
+ DsLogAdmin::Iterator_out i
+ ACE_ENV_ARG_DECL)
+ ACE_THROW_SPEC ((CORBA::SystemException));
+
+ /// Returns the number of records matching constraint <c>.
+ virtual CORBA::ULong
+ match (const char * grammar,
+ const char * c
+ ACE_ENV_ARG_DECL)
+ ACE_THROW_SPEC ((CORBA::SystemException,
+ DsLogAdmin::InvalidGrammar,
+ DsLogAdmin::InvalidConstraint));
+
+ /// Delete records matching constraint <c>.
+ virtual CORBA::ULong
+ delete_records (const char * grammar,
+ const char * c
+ ACE_ENV_ARG_DECL)
+ ACE_THROW_SPEC ((CORBA::SystemException,
+ DsLogAdmin::InvalidGrammar,
+ DsLogAdmin::InvalidConstraint));
+
+ /// Delete records matching ids in <ids>
+ virtual CORBA::ULong
+ delete_records_by_id (const DsLogAdmin::RecordIdList & ids
+ ACE_ENV_ARG_DECL)
+ ACE_THROW_SPEC ((CORBA::SystemException));
+
+ virtual CORBA::ULong
+ remove_old_records (ACE_ENV_SINGLE_ARG_DECL);
+
+ /// Read-Write Lock
+ virtual ACE_SYNCH_RW_MUTEX& lock();
+
+/* protected: */
+ /// Defines types to represent the container that maps RecordIds to
+ /// LogRecords.
+ typedef ACE_RB_Tree <DsLogAdmin::RecordId,
+ DsLogAdmin::LogRecord,
+ ACE_Less_Than<DsLogAdmin::RecordId>,
+ ACE_Null_Mutex> LOG_RECORD_STORE;
+ typedef LOG_RECORD_STORE::ITERATOR LOG_RECORD_STORE_ITER;
+ typedef LOG_RECORD_STORE::ENTRY LOG_RECORD_STORE_ENTRY;
+
+protected:
+ /// Set rec to the pointer to the LogRecord with the given
+ /// id. Returns 0 on success, -1 on failure.
+ int retrieve_i (DsLogAdmin::RecordId id,
+ DsLogAdmin::LogRecord &rec
+ ACE_ENV_ARG_DECL);
+
+ /// Update into storage. Returns 0 on success -1 on failure.
+ int update_i (DsLogAdmin::LogRecord &rec
+ ACE_ENV_ARG_DECL);
+
+ /// Remove the record with id <id> from the LogRecordStore.
+ /// Returns 0 on success, -1 on failure.
+ int remove_i (DsLogAdmin::RecordId id
+ ACE_ENV_ARG_DECL);
+
+ /// Remove the record from the LogRecordStore.
+ void remove_i (LOG_RECORD_STORE_ITER iter
+ ACE_ENV_ARG_DECL);
+
+ DsLogAdmin::RecordList* query_i (const char *constraint,
+ DsLogAdmin::Iterator_out &iter_out,
+ CORBA::ULong how_many
+ ACE_ENV_ARG_DECL)
+ ACE_THROW_SPEC ((CORBA::SystemException,
+ DsLogAdmin::InvalidConstraint));
+
+ /// Throws DsLogAdmin::InvalidGrammar if we don't support this grammar.
+ void check_grammar (const char* grammar ACE_ENV_ARG_DECL)
+ ACE_THROW_SPEC ((CORBA::SystemException,
+ DsLogAdmin::InvalidGrammar));
+
+
+ /// The size of a LogRecord
+ size_t log_record_size(const DsLogAdmin::LogRecord &rec);
+
+ TAO_LogMgr_i* logmgr_i_;
+
+ /// Assigned to a new RecordId and then incremented
+ /// @@ Should I have a list of reclaimed id's for when records are
+ /// deleted?
+ DsLogAdmin::RecordId maxid_;
+
+ /// The maximum size of the log.
+ CORBA::ULongLong max_size_;
+
+ /// The log id to which this LogRecordStore relates.
+ DsLogAdmin::LogId id_;
+
+ /// The current size (in bytes) of the log.
+ CORBA::ULongLong current_size_;
+
+ /// The current number of records in the log.
+ CORBA::ULongLong num_records_;
+
+ /// The current value of the "gauge" that measures the total size of
+ /// the records written to the log.
+ CORBA::ULongLong gauge_;
+
+ /// The max size of the record list returned in a query.
+ CORBA::ULong max_rec_list_len_;
+
+ /// The map of RecordId's to LogRecord's
+ LOG_RECORD_STORE rec_map_;
+
+
+ /// The administrative state of the log
+ DsLogAdmin::AdministrativeState admin_state_;
+
+ DsLogAdmin::CapacityAlarmThresholdList
+ thresholds_;
+
+ /// The forwarding state of the log
+ DsLogAdmin::ForwardingState forward_state_;
+
+ /// The interval during which the log should be in operation
+ DsLogAdmin::TimeInterval interval_;
+
+ /// The action to take if the log reaches max capacity
+ DsLogAdmin::LogFullActionType log_full_action_;
+
+ /// The list of the QoS properties supported by the log.
+ DsLogAdmin::QoSList log_qos_;
+
+ /// The maximum record lifetime
+ CORBA::ULong max_record_life_;
+
+ /// The days of the week that the log should be operational
+ DsLogAdmin::WeekMask weekmask_;
+
+
+ ACE_Reactor* reactor_;
+
+ PortableServer::POA_var iterator_poa_;
+
+ mutable ACE_SYNCH_RW_MUTEX lock_;
+};
+
+TAO_END_VERSIONED_NAMESPACE_DECL
+
+#include /**/ "ace/post.h"
+#endif /*TAO_HASH_LOG_RECORD_STORE_H*/
diff --git a/TAO/orbsvcs/orbsvcs/Log/Hash_LogStore.cpp b/TAO/orbsvcs/orbsvcs/Log/Hash_LogStore.cpp
new file mode 100644
index 00000000000..458cfca4155
--- /dev/null
+++ b/TAO/orbsvcs/orbsvcs/Log/Hash_LogStore.cpp
@@ -0,0 +1,269 @@
+#include "orbsvcs/Log/Hash_LogStore.h"
+#include "orbsvcs/Log/Hash_LogRecordStore.h"
+#include "orbsvcs/Log/LogMgr_i.h"
+#include "ace/Auto_Ptr.h"
+
+ACE_RCSID (Log,
+ Hash_LogStore,
+ "$Id$")
+
+TAO_BEGIN_VERSIONED_NAMESPACE_DECL
+
+TAO_Hash_LogStore::TAO_Hash_LogStore(TAO_LogMgr_i* logmgr_i)
+ : next_id_ (0),
+ logmgr_i_ (logmgr_i)
+{
+}
+
+
+TAO_Hash_LogStore::~TAO_Hash_LogStore()
+{
+}
+
+
+DsLogAdmin::LogList*
+TAO_Hash_LogStore::list_logs (ACE_ENV_SINGLE_ARG_DECL)
+ ACE_THROW_SPEC ((
+ CORBA::SystemException
+ ))
+{
+ ACE_READ_GUARD_THROW_EX (ACE_SYNCH_RW_MUTEX,
+ guard,
+ lock_,
+ CORBA::INTERNAL ());
+ ACE_CHECK_RETURN (0);
+
+ DsLogAdmin::LogList* list;
+
+ // Figure out the length of the list.
+ CORBA::ULong len = static_cast<CORBA::ULong> (hash_map_.current_size ());
+
+ // Allocate the list of <len> length.
+ ACE_NEW_THROW_EX (list,
+ DsLogAdmin::LogList (len),
+ CORBA::NO_MEMORY ());
+ ACE_CHECK_RETURN (0);
+
+ list->length (len);
+
+ // Create an iterator
+ HASHMAP::ITERATOR iter (hash_map_);
+
+ // Iterate over and populate the list.
+ HASHMAP::ENTRY *hash_entry = 0;
+
+ for (CORBA::ULong i = 0; i < len; i++)
+ {
+ iter.next (hash_entry);
+ iter.advance ();
+ (*list)[i] = logmgr_i_->create_log_reference (static_cast<DsLogAdmin::LogId> (hash_entry->ext_id_)
+ ACE_ENV_ARG_PARAMETER);
+ }
+
+ return list;
+}
+
+DsLogAdmin::LogIdList*
+TAO_Hash_LogStore::list_logs_by_id (ACE_ENV_SINGLE_ARG_DECL)
+ ACE_THROW_SPEC ((
+ CORBA::SystemException
+ ))
+{
+ ACE_READ_GUARD_THROW_EX (ACE_SYNCH_RW_MUTEX,
+ guard,
+ lock_,
+ CORBA::INTERNAL ());
+ ACE_CHECK_RETURN (0);
+
+ DsLogAdmin::LogIdList* list;
+
+ // Figure out the length of the list.
+ CORBA::ULong len = static_cast<CORBA::ULong> (hash_map_.current_size ());
+
+ // Allocate the list of <len> length.
+ ACE_NEW_THROW_EX (list,
+ DsLogAdmin::LogIdList (len),
+ CORBA::NO_MEMORY ());
+ ACE_CHECK_RETURN (0);
+
+ list->length (len);
+
+ // Create an iterator
+ HASHMAP::ITERATOR iter (hash_map_);
+
+ // Iterate over and populate the list.
+ HASHMAP::ENTRY *hash_entry = 0;
+
+ for (CORBA::ULong i = 0; i < len; i++)
+ {
+ iter.next (hash_entry);
+ iter.advance ();
+ (*list)[i] = hash_entry->ext_id_;
+ }
+
+ return list;
+}
+
+
+DsLogAdmin::Log_ptr
+TAO_Hash_LogStore::find_log (DsLogAdmin::LogId id
+ ACE_ENV_ARG_DECL)
+ ACE_THROW_SPEC ((
+ CORBA::SystemException
+ ))
+{
+ ACE_READ_GUARD_THROW_EX (ACE_SYNCH_RW_MUTEX,
+ guard,
+ lock_,
+ CORBA::INTERNAL ());
+ ACE_CHECK (DsLogAdmin::Log::_nil ());
+
+ if (hash_map_.find (id) != 0)
+ {
+ return DsLogAdmin::Log::_nil ();
+ }
+ else
+ {
+ return logmgr_i_->create_log_reference (id ACE_ENV_ARG_PARAMETER);
+ }
+}
+
+
+bool
+TAO_Hash_LogStore::exists (DsLogAdmin::LogId id
+ ACE_ENV_ARG_DECL)
+{
+ ACE_READ_GUARD_THROW_EX (ACE_SYNCH_RW_MUTEX,
+ guard,
+ lock_,
+ CORBA::INTERNAL ());
+ ACE_CHECK_RETURN (false);
+
+ return (this->hash_map_.find (id) == 0);
+}
+
+
+int
+TAO_Hash_LogStore::remove (DsLogAdmin::LogId id
+ ACE_ENV_ARG_DECL)
+{
+ ACE_WRITE_GUARD_THROW_EX (ACE_SYNCH_RW_MUTEX,
+ guard,
+ lock_,
+ CORBA::INTERNAL ());
+ ACE_CHECK_RETURN (-1);
+
+ TAO_Hash_LogRecordStore* recordstore;
+
+ int retval = this->hash_map_.unbind (id, recordstore);
+ if (retval == 0)
+ {
+ delete recordstore;
+ }
+
+ return retval;
+}
+
+
+void
+TAO_Hash_LogStore::create(DsLogAdmin::LogFullActionType full_action,
+ CORBA::ULongLong max_size,
+ const DsLogAdmin::CapacityAlarmThresholdList* thresholds,
+ DsLogAdmin::LogId_out id_out
+ ACE_ENV_ARG_DECL)
+{
+ ACE_WRITE_GUARD_THROW_EX (ACE_SYNCH_RW_MUTEX,
+ guard,
+ lock_,
+ CORBA::INTERNAL ());
+ ACE_CHECK;
+
+ DsLogAdmin::LogId id;
+
+ while (this->hash_map_.find((id = this->next_id_++)) == 0)
+ ;
+ id_out = id;
+
+ TAO_Hash_LogRecordStore* impl = 0;
+ ACE_NEW_THROW_EX (impl,
+ TAO_Hash_LogRecordStore (this->logmgr_i_,
+ id,
+ full_action,
+ max_size,
+ thresholds
+ ),
+ CORBA::NO_MEMORY ());
+ ACE_CHECK;
+
+ auto_ptr<TAO_Hash_LogRecordStore> recordstore (impl);
+
+ if (this->hash_map_.bind (id, recordstore.get ()) != 0)
+ {
+ ACE_THROW (CORBA::INTERNAL ());
+ }
+
+ recordstore.release ();
+}
+
+
+void
+TAO_Hash_LogStore::create_with_id (DsLogAdmin::LogId id,
+ DsLogAdmin::LogFullActionType full_action,
+ CORBA::ULongLong max_size,
+ const DsLogAdmin::CapacityAlarmThresholdList* thresholds
+ ACE_ENV_ARG_DECL)
+{
+ ACE_WRITE_GUARD_THROW_EX (ACE_SYNCH_RW_MUTEX,
+ guard,
+ lock_,
+ CORBA::INTERNAL ());
+ ACE_CHECK;
+
+ if (this->hash_map_.find (id) == 0)
+ {
+ ACE_THROW (DsLogAdmin::LogIdAlreadyExists ());
+ }
+
+ TAO_Hash_LogRecordStore* impl = 0;
+ ACE_NEW_THROW_EX (impl,
+ TAO_Hash_LogRecordStore (this->logmgr_i_,
+ id,
+ full_action,
+ max_size,
+ thresholds
+ ),
+ CORBA::NO_MEMORY ());
+ ACE_CHECK;
+
+ auto_ptr<TAO_Hash_LogRecordStore> recordstore (impl);
+
+ if (this->hash_map_.bind (id, recordstore.get ()) != 0)
+ {
+ ACE_THROW (CORBA::INTERNAL ());
+ }
+
+ recordstore.release ();
+}
+
+
+TAO_LogRecordStore*
+TAO_Hash_LogStore::get_log_record_store (DsLogAdmin::LogId id
+ ACE_ENV_ARG_DECL)
+{
+ ACE_READ_GUARD_THROW_EX (ACE_SYNCH_RW_MUTEX,
+ guard,
+ lock_,
+ CORBA::INTERNAL ());
+ ACE_CHECK_RETURN (0);
+
+ TAO_Hash_LogRecordStore* recordstore = 0;
+
+ if (hash_map_.find (id, recordstore) != 0)
+ {
+ return 0;
+ }
+
+ return recordstore;
+}
+
+TAO_END_VERSIONED_NAMESPACE_DECL
diff --git a/TAO/orbsvcs/orbsvcs/Log/Hash_LogStore.h b/TAO/orbsvcs/orbsvcs/Log/Hash_LogStore.h
new file mode 100644
index 00000000000..7c43c34a8a7
--- /dev/null
+++ b/TAO/orbsvcs/orbsvcs/Log/Hash_LogStore.h
@@ -0,0 +1,130 @@
+// -*- C++ -*-
+
+//=============================================================================
+/**
+ * @file Hash_LogStore.h
+ *
+ * $Id$
+ *
+ * @author Matthew Braun <mjb2@cs.wustl.edu>
+ * @author Pradeep Gore <pradeep@cs.wustl.edu>
+ * @author David A. Hanvey <d.hanvey@qub.ac.uk>
+ */
+//=============================================================================
+
+#ifndef TAO_TLS_HASH_LOGSTORE_H
+#define TAO_TLS_HASH_LOGSTORE_H
+
+#include /**/ "ace/pre.h"
+#include /**/ "ace/config-all.h"
+
+#if !defined (ACE_LACKS_PRAGMA_ONCE)
+#pragma once
+#endif /* ACE_LACKS_PRAGMA_ONCE */
+
+#include "orbsvcs/Log/LogStore.h"
+#include "ace/Hash_Map_Manager.h"
+#include "ace/Synch_Traits.h"
+#include "ace/Null_Mutex.h"
+#include "ace/RW_Thread_Mutex.h"
+#include "orbsvcs/Log/log_serv_export.h"
+
+ACE_BEGIN_VERSIONED_NAMESPACE_DECL
+class ACE_Reactor;
+ACE_END_VERSIONED_NAMESPACE_DECL
+
+TAO_BEGIN_VERSIONED_NAMESPACE_DECL
+
+class TAO_LogMgr_i;
+class TAO_Hash_LogRecordStore;
+
+class TAO_Log_Serv_Export TAO_Hash_LogStore
+ : public TAO_LogStore
+{
+public:
+ // = Initialization and Termination Methods
+
+ /// Constructor.
+ TAO_Hash_LogStore (TAO_LogMgr_i* mgr);
+
+ /// Destructor.
+ virtual ~TAO_Hash_LogStore ();
+
+
+ /// Lists all logs created by the log factory.
+ virtual DsLogAdmin::LogList *
+ list_logs (ACE_ENV_SINGLE_ARG_DECL)
+ ACE_THROW_SPEC ((
+ CORBA::SystemException
+ ));
+
+ /// Lists all log ids.
+ virtual DsLogAdmin::LogIdList *
+ list_logs_by_id (ACE_ENV_SINGLE_ARG_DECL)
+ ACE_THROW_SPEC ((
+ CORBA::SystemException
+ ));
+
+ /// Returns a reference to the log with the supplied id.
+ virtual DsLogAdmin::Log_ptr
+ find_log (DsLogAdmin::LogId id
+ ACE_ENV_ARG_DECL)
+ ACE_THROW_SPEC ((
+ CORBA::SystemException
+ ));
+
+ /// Returns true if log exists, otherwise false
+ virtual bool exists (DsLogAdmin::LogId id ACE_ENV_ARG_DECL);
+
+ /// Remove the given entry from the hash table.
+ virtual int remove (DsLogAdmin::LogId id ACE_ENV_ARG_DECL);
+
+ /// @brief Create log
+ virtual void
+ create (DsLogAdmin::LogFullActionType full_action,
+ CORBA::ULongLong max_size,
+ const DsLogAdmin::CapacityAlarmThresholdList* thresholds,
+ DsLogAdmin::LogId_out id_out
+ ACE_ENV_ARG_DECL);
+
+ /// @brief Create log
+ virtual void
+ create_with_id (DsLogAdmin::LogId id,
+ DsLogAdmin::LogFullActionType full_action,
+ CORBA::ULongLong max_size,
+ const DsLogAdmin::CapacityAlarmThresholdList* thresholds
+ ACE_ENV_ARG_DECL);
+
+ /// @brief Get log record store
+ ///
+ /// Get/Create a log record store for log channel @a id.
+ ///
+ /// @param id log id
+ ///
+ virtual TAO_LogRecordStore*
+ get_log_record_store (DsLogAdmin::LogId id
+ ACE_ENV_ARG_DECL);
+
+private:
+ ACE_SYNCH_RW_MUTEX lock_;
+
+ /// Define the HASHMAP.
+ typedef ACE_Hash_Map_Manager <DsLogAdmin::LogId,
+ TAO_Hash_LogRecordStore*,
+ ACE_Null_Mutex> HASHMAP;
+
+ /// The map of Logs created.
+ HASHMAP hash_map_;
+
+ /// The next log id to be assigned (if it hasn't already been
+ /// taken by create_with_id().
+ DsLogAdmin::LogId next_id_;
+
+ TAO_LogMgr_i* logmgr_i_;
+};
+
+TAO_END_VERSIONED_NAMESPACE_DECL
+
+#include /**/ "ace/post.h"
+
+#endif /* TAO_TLS_HASH_LOGSTORE_H */
diff --git a/TAO/orbsvcs/orbsvcs/Log/Hash_Persistence_Strategy.cpp b/TAO/orbsvcs/orbsvcs/Log/Hash_Persistence_Strategy.cpp
new file mode 100644
index 00000000000..3d8882352c6
--- /dev/null
+++ b/TAO/orbsvcs/orbsvcs/Log/Hash_Persistence_Strategy.cpp
@@ -0,0 +1,25 @@
+#include "orbsvcs/Log/Hash_Persistence_Strategy.h"
+#include "orbsvcs/Log/Hash_LogStore.h"
+
+ACE_RCSID (Log,
+ Hash_Persistence_Strategy,
+ "$Id$")
+
+TAO_BEGIN_VERSIONED_NAMESPACE_DECL
+
+TAO_Hash_Persistence_Strategy::TAO_Hash_Persistence_Strategy()
+{
+}
+
+
+TAO_Hash_Persistence_Strategy::~TAO_Hash_Persistence_Strategy()
+{
+}
+
+TAO_LogStore *
+TAO_Hash_Persistence_Strategy::create_log_store(TAO_LogMgr_i *logmgr_i)
+{
+ return new TAO_Hash_LogStore (logmgr_i);
+}
+
+TAO_END_VERSIONED_NAMESPACE_DECL
diff --git a/TAO/orbsvcs/orbsvcs/Log/Hash_Persistence_Strategy.h b/TAO/orbsvcs/orbsvcs/Log/Hash_Persistence_Strategy.h
new file mode 100644
index 00000000000..43f5e4a6ae5
--- /dev/null
+++ b/TAO/orbsvcs/orbsvcs/Log/Hash_Persistence_Strategy.h
@@ -0,0 +1,59 @@
+// -*- C++ -*-
+
+//=============================================================================
+/**
+ * @file Hash_Persistence_Strategy.h
+ *
+ * $Id$
+ *
+ * @author Matthew Braun <mjb2@cs.wustl.edu>
+ * @author Pradeep Gore <pradeep@cs.wustl.edu>
+ * @author David A. Hanvey <d.hanvey@qub.ac.uk>
+ */
+//=============================================================================
+
+#ifndef TAO_TLS_HASH_PERSISTENCE_STRATEGY_H
+#define TAO_TLS_HASH_PERSISTENCE_STRATEGY_H
+
+#include /**/ "ace/pre.h"
+#include /**/ "ace/config-all.h"
+
+#if !defined (ACE_LACKS_PRAGMA_ONCE)
+#pragma once
+#endif /* ACE_LACKS_PRAGMA_ONCE */
+
+#include "orbsvcs/Log/Log_Persistence_Strategy.h"
+
+TAO_BEGIN_VERSIONED_NAMESPACE_DECL
+
+/**
+ * @class TAO_Hash_Persistence_Strategy
+ *
+ * @brief Concrete Strategy for Log / Log Record Storage
+ *
+ * Stores log parameters and log records in hash maps
+ */
+class TAO_Log_Serv_Export TAO_Hash_Persistence_Strategy
+ : public TAO_Log_Persistence_Strategy
+{
+public:
+ // = Initialization and Termination Methods
+
+ /// Constructor.
+ TAO_Hash_Persistence_Strategy ();
+
+ /// Destructor.
+ virtual ~TAO_Hash_Persistence_Strategy ();
+
+ /// @brief Log Store Factory
+ virtual TAO_LogStore*
+ create_log_store (TAO_LogMgr_i* mgr);
+
+private:
+};
+
+TAO_END_VERSIONED_NAMESPACE_DECL
+
+#include /**/ "ace/post.h"
+
+#endif /* TAO_TLS_HASH_PERSISTENCE_STRATEGY_H */
diff --git a/TAO/orbsvcs/orbsvcs/Log/Iterator_i.cpp b/TAO/orbsvcs/orbsvcs/Log/Iterator_i.cpp
new file mode 100644
index 00000000000..d26dc48d882
--- /dev/null
+++ b/TAO/orbsvcs/orbsvcs/Log/Iterator_i.cpp
@@ -0,0 +1,73 @@
+#include "orbsvcs/Log/Iterator_i.h"
+
+ACE_RCSID (Log,
+ Iterator_i,
+ "$Id$")
+
+
+TAO_BEGIN_VERSIONED_NAMESPACE_DECL
+
+// iterator inactivity timeout
+ACE_Time_Value
+TAO_Iterator_i::timeout_(60 * 60);
+
+TAO_Iterator_i::TAO_Iterator_i (ACE_Reactor* reactor)
+ : reactor_ (reactor)
+{
+ if (this->timeout_ != ACE_Time_Value::zero)
+ {
+ this->timer_id_ =
+ this->reactor_->schedule_timer (this, 0, this->timeout_);
+ }
+}
+
+
+TAO_Iterator_i::~TAO_Iterator_i (void)
+{
+ // cancel timer
+ if (this->timer_id_ != -1)
+ {
+ this->reactor_->cancel_timer (this->timer_id_);
+ }
+}
+
+
+void
+TAO_Iterator_i::destroy (ACE_ENV_SINGLE_ARG_DECL)
+ ACE_THROW_SPEC ((CORBA::SystemException))
+{
+ PortableServer::POA_ptr poa =
+ this->_default_POA (ACE_ENV_SINGLE_ARG_PARAMETER);
+ ACE_CHECK;
+
+ PortableServer::ObjectId_var oid =
+ poa->servant_to_id (this
+ ACE_ENV_ARG_PARAMETER);
+ ACE_CHECK;
+
+ // Goodbye cruel world...
+ // deactivate from the poa.
+ poa->deactivate_object (oid.in ()
+ ACE_ENV_ARG_PARAMETER);
+ ACE_CHECK;
+ return;
+}
+
+
+int
+TAO_Iterator_i::handle_timeout(const ACE_Time_Value&, const void*)
+{
+ ACE_TRY_NEW_ENV
+ {
+ this->destroy (ACE_ENV_SINGLE_ARG_PARAMETER);
+ ACE_TRY_CHECK;
+ }
+ ACE_CATCHANY
+ {
+ }
+ ACE_ENDTRY;
+
+ return 0;
+}
+
+TAO_END_VERSIONED_NAMESPACE_DECL
diff --git a/TAO/orbsvcs/orbsvcs/Log/Iterator_i.h b/TAO/orbsvcs/orbsvcs/Log/Iterator_i.h
new file mode 100644
index 00000000000..acfa7b89f63
--- /dev/null
+++ b/TAO/orbsvcs/orbsvcs/Log/Iterator_i.h
@@ -0,0 +1,91 @@
+// -*- C++ -*-
+
+//=============================================================================
+/**
+ * @file Iterator_i.h
+ *
+ * $Id$
+ *
+ * Implementation of the DsLogAdmin::Iterator interface.
+ *
+ *
+ * @author Matthew Braun <mjb2@cs.wustl.edu>
+ * @author Pradeep Gore <pradeep@cs.wustl.edu>
+ *
+ */
+//=============================================================================
+
+#ifndef TAO_TLS_ITERATOR_H
+#define TAO_TLS_ITERATOR_H
+#include /**/ "ace/pre.h"
+#include /**/ "ace/config-all.h"
+
+#if !defined (ACE_LACKS_PRAGMA_ONCE)
+# pragma once
+#endif /* ACE_LACKS_PRAGMA_ONCE */
+
+#include "orbsvcs/DsLogAdminS.h"
+#include "ace/Event_Handler.h"
+#include "ace/Reactor.h"
+#include "orbsvcs/Log/log_serv_export.h"
+
+// This is to remove "inherits via dominance" warnings from MSVC.
+// MSVC is being a little too paranoid.
+#if defined(_MSC_VER)
+#pragma warning(push)
+#pragma warning(disable:4250)
+#endif /* _MSC_VER */
+
+TAO_BEGIN_VERSIONED_NAMESPACE_DECL
+
+/**
+ * @class TAO_Iterator_i
+ *
+ * @brief Iterator to get LogRecords for the log via a query.
+ */
+class TAO_Log_Serv_Export TAO_Iterator_i
+ : public virtual POA_DsLogAdmin::Iterator,
+ public ACE_Event_Handler
+{
+public:
+
+ // = Initialization and Termination methods.
+
+ /// Constructor.
+ TAO_Iterator_i (ACE_Reactor* reactor);
+
+ /// Destructor.
+ virtual ~TAO_Iterator_i (void);
+
+ /// Gets a list of LogRecords.
+ virtual DsLogAdmin::RecordList* get (CORBA::ULong position,
+ CORBA::ULong how_many
+ ACE_ENV_ARG_DECL)
+ ACE_THROW_SPEC ((CORBA::SystemException,
+ DsLogAdmin::InvalidParam)) = 0;
+
+ /// This destroys the iterator.
+ virtual void destroy (ACE_ENV_SINGLE_ARG_DECL)
+ ACE_THROW_SPEC ((CORBA::SystemException));
+
+protected:
+ /// Reactor
+ ACE_Reactor* reactor_;
+
+ /// Timeout
+ static ACE_Time_Value timeout_;
+
+ /// Timer ID
+ long timer_id_;
+
+ virtual int handle_timeout (const ACE_Time_Value&, const void *);
+};
+
+TAO_END_VERSIONED_NAMESPACE_DECL
+
+#if defined(_MSC_VER)
+#pragma warning(pop)
+#endif /* _MSC_VER */
+
+#include /**/ "ace/post.h"
+#endif /* TAO_TLS_ITERATOR_H */
diff --git a/TAO/orbsvcs/orbsvcs/Log/LogActivator.cpp b/TAO/orbsvcs/orbsvcs/Log/LogActivator.cpp
new file mode 100644
index 00000000000..5f7c64cd724
--- /dev/null
+++ b/TAO/orbsvcs/orbsvcs/Log/LogActivator.cpp
@@ -0,0 +1,58 @@
+#include "orbsvcs/Log/LogActivator.h"
+
+ACE_RCSID (Log,
+ LogActivator,
+ "$Id$")
+
+#if (TAO_HAS_MINIMUM_POA == 0)
+#include "orbsvcs/Log/LogMgr_i.h"
+
+TAO_BEGIN_VERSIONED_NAMESPACE_DECL
+
+TAO_LogActivator::TAO_LogActivator (TAO_LogMgr_i &logmgr_i)
+ : logmgr_i_ (logmgr_i)
+{
+}
+
+TAO_LogActivator::~TAO_LogActivator ()
+{
+}
+
+PortableServer::Servant
+TAO_LogActivator::incarnate (const PortableServer::ObjectId& oid,
+ PortableServer::POA_ptr
+ ACE_ENV_ARG_DECL)
+ ACE_THROW_SPEC ((CORBA::SystemException,
+ PortableServer::ForwardRequest
+ ))
+{
+ CORBA::String_var poa_id = PortableServer::ObjectId_to_string (oid);
+
+ DsLogAdmin::LogId id = ACE_OS::strtoul(poa_id.in (), 0, 0);
+
+ if (!logmgr_i_.exists(id ACE_ENV_ARG_PARAMETER))
+ ACE_THROW_RETURN (CORBA::OBJECT_NOT_EXIST (), 0);
+ ACE_CHECK_RETURN(0);
+
+ return logmgr_i_.create_log_servant (id ACE_ENV_ARG_PARAMETER);
+}
+
+
+void
+TAO_LogActivator::etherealize (const PortableServer::ObjectId&,
+ PortableServer::POA_ptr,
+ PortableServer::Servant servant,
+ CORBA::Boolean,
+ CORBA::Boolean remaining_activations
+ ACE_ENV_ARG_DECL_NOT_USED)
+ ACE_THROW_SPEC ((CORBA::SystemException))
+{
+ if (!remaining_activations)
+ {
+ delete servant;
+ }
+}
+
+TAO_END_VERSIONED_NAMESPACE_DECL
+
+#endif
diff --git a/TAO/orbsvcs/orbsvcs/Log/LogActivator.h b/TAO/orbsvcs/orbsvcs/Log/LogActivator.h
new file mode 100644
index 00000000000..c25f466b0ed
--- /dev/null
+++ b/TAO/orbsvcs/orbsvcs/Log/LogActivator.h
@@ -0,0 +1,78 @@
+// -*- C++ -*-
+
+//=============================================================================
+/**
+ * @file LogActivator.h
+ *
+ * $Id$
+ *
+ */
+//=============================================================================
+
+#ifndef TAO_TLS_LOGACTIVATOR_H
+#define TAO_TLS_LOGACTIVATOR_H
+
+#include /**/ "ace/pre.h"
+
+#include "orbsvcs/DsLogAdminC.h"
+
+#if (TAO_HAS_MINIMUM_POA == 0)
+
+#include "orbsvcs/Log/log_serv_export.h"
+
+#include "tao/PortableServer/PortableServer.h"
+#include "tao/PortableServer/ServantActivatorC.h"
+
+TAO_BEGIN_VERSIONED_NAMESPACE_DECL
+
+// forward declarations
+class TAO_LogMgr_i;
+
+/// @class TAO_LogActivator
+/// @brief Log Servant Activator
+///
+/// A servant activator to create Log servants. Permits servants to
+/// be "lazily" created on demand. This allows persistent logging
+/// strategies to avoid creating servants for each log when the
+/// service is started.
+///
+class TAO_Log_Serv_Export TAO_LogActivator
+ : public virtual PortableServer::ServantActivator
+{
+public:
+ /// @brief Constructor
+ ///
+ TAO_LogActivator(TAO_LogMgr_i& logmgr_i);
+
+ /// @brief Destructor
+ ///
+ virtual ~TAO_LogActivator();
+
+ virtual PortableServer::Servant incarnate (const PortableServer::ObjectId& oid,
+ PortableServer::POA_ptr poa
+ ACE_ENV_ARG_DECL)
+ ACE_THROW_SPEC ((
+ CORBA::SystemException,
+ PortableServer::ForwardRequest
+ ));
+
+ virtual void etherealize (const PortableServer::ObjectId& oid,
+ PortableServer::POA_ptr poa,
+ PortableServer::Servant servant,
+ CORBA::Boolean cleanup_in_progress,
+ CORBA::Boolean remaining_activations
+ ACE_ENV_ARG_DECL)
+ ACE_THROW_SPEC ((
+ CORBA::SystemException
+ ));
+
+private:
+ TAO_LogMgr_i& logmgr_i_;
+};
+
+TAO_END_VERSIONED_NAMESPACE_DECL
+
+#endif /* TAO_HAS_MINIMUM_POA */
+
+#include /**/ "ace/post.h"
+#endif
diff --git a/TAO/orbsvcs/orbsvcs/Log/LogMgr_i.cpp b/TAO/orbsvcs/orbsvcs/Log/LogMgr_i.cpp
new file mode 100644
index 00000000000..23bb04d2ea1
--- /dev/null
+++ b/TAO/orbsvcs/orbsvcs/Log/LogMgr_i.cpp
@@ -0,0 +1,296 @@
+#include "orbsvcs/Log/LogMgr_i.h"
+#include "orbsvcs/Log/LogActivator.h"
+#include "ace/Dynamic_Service.h"
+#include "tao/Utils/PolicyList_Destroyer.h"
+#include "orbsvcs/Log/Hash_Persistence_Strategy.h"
+#include "orbsvcs/Log/LogStore.h"
+#include "ace/OS_NS_stdio.h"
+
+ACE_RCSID (Log,
+ LogMgr_i,
+ "$Id$")
+
+
+TAO_BEGIN_VERSIONED_NAMESPACE_DECL
+
+TAO_LogMgr_i::TAO_LogMgr_i ()
+ : logstore_ (0)
+{
+}
+
+
+TAO_LogMgr_i::~TAO_LogMgr_i ()
+{
+ delete logstore_;
+}
+
+
+void
+TAO_LogMgr_i::init (CORBA::ORB_ptr orb,
+ PortableServer::POA_ptr poa
+ ACE_ENV_ARG_DECL)
+{
+ this->orb_ = CORBA::ORB::_duplicate (orb);
+ this->poa_ = PortableServer::POA::_duplicate (poa);
+
+ PortableServer::POAManager_var poa_manager =
+ this->poa_->the_POAManager (ACE_ENV_SINGLE_ARG_PARAMETER);
+ ACE_CHECK;
+
+ {
+ TAO::Utils::PolicyList_Destroyer policies(1);
+
+ // Create Factory POA
+ policies.length (1);
+ policies[0] =
+ this->poa_->create_lifespan_policy (PortableServer::PERSISTENT
+ ACE_ENV_ARG_PARAMETER);
+ ACE_CHECK;
+
+ this->factory_poa_ = this->poa_->create_POA ("factory_POA",
+ poa_manager.in (),
+ policies
+ ACE_ENV_ARG_PARAMETER);
+ ACE_CHECK;
+ }
+
+
+ {
+ TAO::Utils::PolicyList_Destroyer policies(2);
+
+ // Create Log POA
+ policies.length (2);
+ policies[0] =
+ this->poa_->create_lifespan_policy (PortableServer::PERSISTENT
+ ACE_ENV_ARG_PARAMETER);
+ ACE_CHECK;
+
+ policies[1] =
+ this->poa_->create_id_assignment_policy (PortableServer::USER_ID
+ ACE_ENV_ARG_PARAMETER);
+ ACE_CHECK;
+
+#if (TAO_HAS_MINIMUM_POA == 0)
+ policies.length(4);
+ policies[2] =
+ this->poa_->create_servant_retention_policy (PortableServer::RETAIN
+ ACE_ENV_ARG_PARAMETER);
+ ACE_CHECK;
+
+ policies[3] =
+ this->poa_->create_request_processing_policy (PortableServer::USE_SERVANT_MANAGER
+ ACE_ENV_ARG_PARAMETER);
+ ACE_CHECK;
+#endif
+
+ this->log_poa_ = this->factory_poa_->create_POA ("log_POA",
+ poa_manager.in (),
+ policies
+ ACE_ENV_ARG_PARAMETER);
+ ACE_CHECK;
+ }
+
+#if (TAO_HAS_MINIMUM_POA == 0)
+ PortableServer::ServantActivator* servant_activator = 0;
+
+ ACE_NEW_THROW_EX (servant_activator,
+ TAO_LogActivator (*this),
+ CORBA::NO_MEMORY ());
+
+ this->log_poa_->set_servant_manager(servant_activator
+ ACE_ENV_ARG_PARAMETER);
+ ACE_CHECK;
+#endif
+
+ // Load Log Strategy
+ TAO_Log_Persistence_Strategy* strategy_ = 0;
+
+ strategy_ =
+ ACE_Dynamic_Service<TAO_Log_Persistence_Strategy>::instance ("Log_Persistence");
+ if (strategy_ == 0)
+ {
+ strategy_ = new TAO_Hash_Persistence_Strategy;
+ }
+
+ logstore_ = strategy_->create_log_store (this);
+}
+
+PortableServer::ObjectId*
+TAO_LogMgr_i::create_objectid (DsLogAdmin::LogId id)
+{
+ char buf[32];
+ ACE_OS::sprintf(buf, "%lu", static_cast<unsigned long>(id));
+
+ PortableServer::ObjectId_var oid =
+ PortableServer::string_to_ObjectId(buf);
+
+ return oid._retn ();
+}
+
+DsLogAdmin::Log_ptr
+TAO_LogMgr_i::create_log_reference (DsLogAdmin::LogId id
+ ACE_ENV_ARG_DECL)
+{
+ PortableServer::ObjectId_var oid =
+ this->create_objectid (id);
+ CORBA::RepositoryId_var intf =
+ this->create_repositoryid ();
+
+ CORBA::Object_var obj =
+ this->log_poa_->create_reference_with_id (oid.in (),
+ intf.in ()
+ ACE_ENV_ARG_PARAMETER);
+ ACE_CHECK_RETURN (DsLogAdmin::Log::_nil ());
+
+ DsLogAdmin::Log_var log =
+ DsLogAdmin::Log::_narrow (obj.in () ACE_ENV_ARG_PARAMETER);
+ ACE_CHECK_RETURN (DsLogAdmin::Log::_nil ());
+
+ return log._retn();
+}
+
+DsLogAdmin::Log_ptr
+TAO_LogMgr_i::create_log_object (DsLogAdmin::LogId id
+ ACE_ENV_ARG_DECL)
+{
+ PortableServer::ServantBase* servant = 0;
+
+ servant = create_log_servant (id ACE_ENV_ARG_PARAMETER);
+ ACE_CHECK_RETURN (DsLogAdmin::Log::_nil ());
+
+ PortableServer::ServantBase_var safe_servant = servant;
+ // Transfer ownership to the POA.
+
+ // Obtain ObjectId
+ PortableServer::ObjectId_var oid = this->create_objectid (id);
+
+ // Register with the poa
+ this->log_poa_->activate_object_with_id (oid.in (),
+ servant
+ ACE_ENV_ARG_PARAMETER);
+ ACE_CHECK_RETURN (DsLogAdmin::Log::_nil ());
+
+ return create_log_reference (id ACE_ENV_ARG_PARAMETER);
+}
+
+DsLogAdmin::LogList*
+TAO_LogMgr_i::list_logs (ACE_ENV_SINGLE_ARG_DECL)
+ ACE_THROW_SPEC ((
+ CORBA::SystemException
+ ))
+{
+ return this->logstore_->list_logs (ACE_ENV_SINGLE_ARG_PARAMETER);
+}
+
+
+DsLogAdmin::LogIdList*
+TAO_LogMgr_i::list_logs_by_id (ACE_ENV_SINGLE_ARG_DECL)
+ ACE_THROW_SPEC ((
+ CORBA::SystemException
+ ))
+{
+ return this->logstore_->list_logs_by_id (ACE_ENV_SINGLE_ARG_PARAMETER);
+}
+
+
+DsLogAdmin::Log_ptr
+TAO_LogMgr_i::find_log (DsLogAdmin::LogId id
+ ACE_ENV_ARG_DECL)
+ ACE_THROW_SPEC ((
+ CORBA::SystemException
+ ))
+{
+ return this->logstore_->find_log (id ACE_ENV_ARG_PARAMETER);
+}
+
+
+TAO_LogRecordStore*
+TAO_LogMgr_i::get_log_record_store (DsLogAdmin::LogId id
+ ACE_ENV_ARG_DECL)
+{
+ return this->logstore_->get_log_record_store (id ACE_ENV_ARG_PARAMETER);
+}
+
+
+bool
+TAO_LogMgr_i::exists (DsLogAdmin::LogId id
+ ACE_ENV_ARG_DECL)
+{
+ return this->logstore_->exists (id ACE_ENV_ARG_PARAMETER);
+}
+
+
+int
+TAO_LogMgr_i::remove (DsLogAdmin::LogId id
+ ACE_ENV_ARG_DECL)
+{
+ return this->logstore_->remove (id ACE_ENV_ARG_PARAMETER);
+}
+
+void
+TAO_LogMgr_i::create_i (DsLogAdmin::LogFullActionType full_action,
+ CORBA::ULongLong max_size,
+ const DsLogAdmin::CapacityAlarmThresholdList* thresholds,
+ DsLogAdmin::LogId_out id_out
+ ACE_ENV_ARG_DECL)
+{
+ // Validate log_full_action before creating log
+ if (full_action != DsLogAdmin::wrap && full_action != DsLogAdmin::halt)
+ ACE_THROW (DsLogAdmin::InvalidLogFullAction ());
+
+ if (thresholds)
+ {
+ // @@ JTC - validate thresholds here
+ }
+
+ this->logstore_->create (full_action,
+ max_size,
+ thresholds,
+ id_out
+ ACE_ENV_ARG_PARAMETER);
+ ACE_CHECK;
+}
+
+void
+TAO_LogMgr_i::create_with_id_i (DsLogAdmin::LogId id,
+ DsLogAdmin::LogFullActionType full_action,
+ CORBA::ULongLong max_size,
+ const DsLogAdmin::CapacityAlarmThresholdList* thresholds
+ ACE_ENV_ARG_DECL)
+{
+ // Validate log_full_action before creating log
+ if (full_action != DsLogAdmin::wrap && full_action != DsLogAdmin::halt)
+ ACE_THROW (DsLogAdmin::InvalidLogFullAction ());
+
+ if (thresholds)
+ {
+ // @@ JTC - validate thresholds here
+ }
+
+ this->logstore_->create_with_id (id,
+ full_action,
+ max_size,
+ thresholds
+ ACE_ENV_ARG_PARAMETER);
+ ACE_CHECK;
+}
+
+CORBA::ORB_ptr
+TAO_LogMgr_i::orb ()
+{
+ return this->orb_.in ();
+}
+
+PortableServer::POA_ptr
+TAO_LogMgr_i::factory_poa ()
+{
+ return this->factory_poa_.in ();
+}
+
+PortableServer::POA_ptr
+TAO_LogMgr_i::log_poa ()
+{
+ return this->log_poa_.in ();
+}
+
+TAO_END_VERSIONED_NAMESPACE_DECL
diff --git a/TAO/orbsvcs/orbsvcs/Log/LogMgr_i.h b/TAO/orbsvcs/orbsvcs/Log/LogMgr_i.h
new file mode 100644
index 00000000000..a75417898c8
--- /dev/null
+++ b/TAO/orbsvcs/orbsvcs/Log/LogMgr_i.h
@@ -0,0 +1,202 @@
+// -*- C++ -*-
+
+//=============================================================================
+/**
+ * @file LogMgr_i.h
+ *
+ * $Id$
+ *
+ * Implementation of the DsLogAdmin::LogMgr interface.
+ *
+ * @author Matthew Braun <mjb2@cs.wustl.edu>
+ * @author Pradeep Gore <pradeep@cs.wustl.edu>
+ * @author David A. Hanvey <d.hanvey@qub.ac.uk>
+ */
+//=============================================================================
+
+#ifndef TAO_TLS_LOGMGR_I_H
+#define TAO_TLS_LOGMGR_I_H
+#include /**/ "ace/pre.h"
+
+#include "orbsvcs/DsLogAdminS.h"
+
+#if !defined (ACE_LACKS_PRAGMA_ONCE)
+# pragma once
+#endif /* ACE_LACKS_PRAGMA_ONCE */
+
+#include "orbsvcs/Log/Log_i.h"
+#include "orbsvcs/Log/Log_Persistence_Strategy.h"
+#include "orbsvcs/Log/log_serv_export.h"
+
+TAO_BEGIN_VERSIONED_NAMESPACE_DECL
+
+/**
+ * @class TAO_LogMgr_i
+ * @brief Log Factory
+ *
+ * The implementation delegates operations to a dynamically loaded
+ * Strategy class.
+ */
+class TAO_Log_Serv_Export TAO_LogMgr_i
+ : public virtual POA_DsLogAdmin::LogMgr
+{
+public:
+
+ // = Initialization and Termination Methods
+
+ /// Constructor.
+ TAO_LogMgr_i ();
+
+ /// Destructor.
+ virtual ~TAO_LogMgr_i ();
+
+ /// Lists all log object references.
+ DsLogAdmin::LogList *
+ list_logs (ACE_ENV_SINGLE_ARG_DECL)
+ ACE_THROW_SPEC ((
+ CORBA::SystemException
+ ));
+
+ /// Lists all log ids.
+ DsLogAdmin::LogIdList *
+ list_logs_by_id (ACE_ENV_SINGLE_ARG_DECL)
+ ACE_THROW_SPEC ((
+ CORBA::SystemException
+ ));
+
+ /// Returns a reference to the log with the supplied id.
+ DsLogAdmin::Log_ptr
+ find_log (DsLogAdmin::LogId id
+ ACE_ENV_ARG_DECL)
+ ACE_THROW_SPEC ((
+ CORBA::SystemException
+ ));
+
+ /// Returns true if log exists, otherwise false
+ bool exists (DsLogAdmin::LogId id
+ ACE_ENV_ARG_DECL);
+
+ /// Remove the given entry from the container.
+ int remove (DsLogAdmin::LogId id
+ ACE_ENV_ARG_DECL);
+
+ /// @brief Create ObjectId
+ ///
+ /// Create object id for log channel @ id.
+ ///
+ /// @param id log id
+ ///
+ /// @return object id
+ ///
+ virtual PortableServer::ObjectId*
+ create_objectid (DsLogAdmin::LogId id);
+
+ /// @brief Create log reference
+ ///
+ /// Create object reference for log channel @a id.
+ ///
+ /// @param id log id
+ ///
+ /// @return object reference
+ ///
+ virtual DsLogAdmin::Log_ptr
+ create_log_reference (DsLogAdmin::LogId id
+ ACE_ENV_ARG_DECL);
+
+ /// @brief Create log object
+ ///
+ /// Create Log object for log channel @a id.
+ ///
+ /// @param id log id
+ ///
+ /// @return object reference
+ ///
+ virtual DsLogAdmin::Log_ptr
+ create_log_object (DsLogAdmin::LogId id
+ ACE_ENV_ARG_DECL);
+
+ /// @brief Create log repository id
+ ///
+ /// Return repository id for log
+ ///
+ /// @return repository id
+ ///
+ virtual CORBA::RepositoryId
+ create_repositoryid () = 0;
+
+ /// @brief Create log servant
+ ///
+ /// Create Log servant for log channel @a id.
+ ///
+ /// @param id log id
+ ///
+ /// @return pointer to servant
+ virtual PortableServer::ServantBase*
+ create_log_servant (DsLogAdmin::LogId id
+ ACE_ENV_ARG_DECL) = 0;
+
+ /// @brief Get log record store
+ ///
+ /// Get/Create a log record store for log channel @a id.
+ ///
+ /// @param id log id
+ ///
+ TAO_LogRecordStore*
+ get_log_record_store (DsLogAdmin::LogId id
+ ACE_ENV_ARG_DECL);
+
+ CORBA::ORB_ptr orb();
+
+ PortableServer::POA_ptr factory_poa();
+
+ PortableServer::POA_ptr log_poa();
+
+protected:
+ /// @brief Initialize
+ ///
+ /// Creates factory and log channel POAs, and obtains the LogStore
+ /// from a dynamically loaded Log_Persistence_Strategy (if one was
+ /// specified in the service config file, otherwise the default
+ /// Hash_Persistence_Strategy is used.)
+ ///
+ /// @param orb ORB
+ /// @param poa Parent POA
+ ///
+ void init (CORBA::ORB_ptr orb,
+ PortableServer::POA_ptr poa
+ ACE_ENV_ARG_DECL);
+
+ /// @brief Create log
+ void create_i (DsLogAdmin::LogFullActionType full_action,
+ CORBA::ULongLong max_size,
+ const DsLogAdmin::CapacityAlarmThresholdList* thresholds,
+ DsLogAdmin::LogId_out id_out
+ ACE_ENV_ARG_DECL);
+
+ /// @brief Create log
+ void create_with_id_i (DsLogAdmin::LogId id,
+ DsLogAdmin::LogFullActionType full_action,
+ CORBA::ULongLong max_size,
+ const DsLogAdmin::CapacityAlarmThresholdList* thresholds
+ ACE_ENV_ARG_DECL);
+
+ /// ORB.
+ CORBA::ORB_var orb_;
+
+ /// POA.
+ PortableServer::POA_var poa_;
+
+ /// Factory POA.
+ PortableServer::POA_var factory_poa_;
+
+ /// Log POA.
+ PortableServer::POA_var log_poa_;
+
+private:
+ TAO_LogStore* logstore_;
+};
+
+TAO_END_VERSIONED_NAMESPACE_DECL
+
+#include /**/ "ace/post.h"
+#endif /* TAO_TLS_LOGMGR_I_H */
diff --git a/TAO/orbsvcs/orbsvcs/Log/LogNotification.cpp b/TAO/orbsvcs/orbsvcs/Log/LogNotification.cpp
new file mode 100644
index 00000000000..e7f422dd36b
--- /dev/null
+++ b/TAO/orbsvcs/orbsvcs/Log/LogNotification.cpp
@@ -0,0 +1,418 @@
+#include "orbsvcs/Log/LogNotification.h"
+
+#include "orbsvcs/Time_Utilities.h"
+#include "tao/debug.h"
+#include "ace/OS_NS_sys_time.h"
+
+ACE_RCSID (Log,
+ LogNotification,
+ "$Id$")
+
+TAO_BEGIN_VERSIONED_NAMESPACE_DECL
+
+TAO_LogNotification::TAO_LogNotification (void)
+{
+}
+
+TAO_LogNotification::~TAO_LogNotification (void)
+{
+}
+
+void
+TAO_LogNotification::object_creation (DsLogAdmin::LogId id
+ ACE_ENV_ARG_DECL)
+ ACE_THROW_SPEC ((CORBA::SystemException))
+{
+
+ CORBA::Any any;
+ DsLogNotification::ObjectCreation event;
+
+ // The log id.
+ event.id = id;
+
+ TimeBase::TimeT current_time;
+ ACE_Time_Value now = ACE_OS::gettimeofday ();
+ ORBSVCS_Time::Time_Value_to_TimeT(current_time, now);
+
+ event.time = current_time;
+
+ any <<= event;
+
+ this->send_notification (any
+ ACE_ENV_ARG_PARAMETER);
+ ACE_CHECK;
+}
+
+void
+TAO_LogNotification::object_deletion (DsLogAdmin::LogId id
+ ACE_ENV_ARG_DECL)
+ ACE_THROW_SPEC ((CORBA::SystemException))
+{
+ CORBA::Any any;
+ DsLogNotification::ObjectDeletion event;
+
+ event.id = id;
+
+ TimeBase::TimeT current_time;
+ ACE_Time_Value now = ACE_OS::gettimeofday ();
+ ORBSVCS_Time::Time_Value_to_TimeT(current_time, now);
+
+ // Time object deleted.
+ event.time = current_time;
+
+ any <<= event;
+
+ this->send_notification (any
+ ACE_ENV_ARG_PARAMETER);
+ ACE_CHECK;
+}
+
+void
+TAO_LogNotification::processing_error_alarm (CORBA::ULong error_num,
+ const char* error_string
+ ACE_ENV_ARG_DECL)
+ ACE_THROW_SPEC ((CORBA::SystemException))
+{
+ CORBA::Any any;
+ DsLogNotification::ProcessingErrorAlarm event;
+
+ event.error_num = error_num;
+ event.error_string = CORBA::string_dup (error_string);
+
+ any <<= event;
+
+ this->send_notification (any
+ ACE_ENV_ARG_PARAMETER);
+ ACE_CHECK;
+}
+
+void
+TAO_LogNotification::attribute_value_change (DsLogAdmin::Log_ptr log,
+ DsLogAdmin::LogId id,
+ DsLogNotification::AttributeType type,
+ CORBA::Any oldValue,
+ CORBA::Any newValue
+ ACE_ENV_ARG_DECL)
+ ACE_THROW_SPEC ((CORBA::SystemException))
+{
+ CORBA::Any any;
+ DsLogNotification::AttributeValueChange event;
+
+ event.logref = DsLogAdmin::Log::_duplicate (log);
+ event.id = id;
+
+ TimeBase::TimeT current_time;
+ ACE_Time_Value now = ACE_OS::gettimeofday ();
+ ORBSVCS_Time::Time_Value_to_TimeT (current_time, now);
+
+ event.time = current_time;
+
+ // The attribute type e.g. logFullAction, maxLogSize etc.
+ event.type = type;
+ event.old_value = oldValue;
+ event.new_value = newValue;
+
+ any <<= event;
+
+ this->send_notification (any
+ ACE_ENV_ARG_PARAMETER);
+ ACE_CHECK;
+}
+
+void
+TAO_LogNotification::capacity_alarm_threshold_value_change (
+ DsLogAdmin::Log_ptr log,
+ DsLogAdmin::LogId id,
+ const DsLogAdmin::CapacityAlarmThresholdList& oldValue,
+ const DsLogAdmin::CapacityAlarmThresholdList& newValue
+ ACE_ENV_ARG_DECL)
+ ACE_THROW_SPEC ((CORBA::SystemException))
+{
+ CORBA::Any oldV, newV;
+ oldV <<= oldValue;
+ newV <<= newValue;
+
+ this->attribute_value_change (log,
+ id,
+ DsLogNotification::capacityAlarmThreshold,
+ oldV,
+ newV
+ ACE_ENV_ARG_PARAMETER);
+ ACE_CHECK;
+}
+
+void
+TAO_LogNotification::log_full_action_value_change (DsLogAdmin::Log_ptr log,
+ DsLogAdmin::LogId id,
+ CORBA::ULong oldValue,
+ CORBA::ULong newValue
+ ACE_ENV_ARG_DECL)
+ ACE_THROW_SPEC ((CORBA::SystemException))
+{
+ CORBA::Any oldV, newV;
+ oldV <<= oldValue;
+ newV <<= newValue;
+
+ this->attribute_value_change (log,
+ id,
+ DsLogNotification::logFullAction,
+ oldV,
+ newV
+ ACE_ENV_ARG_PARAMETER);
+ ACE_CHECK;
+}
+
+void
+TAO_LogNotification::max_log_size_value_change (DsLogAdmin::Log_ptr log,
+ DsLogAdmin::LogId id,
+ CORBA::ULongLong oldValue,
+ CORBA::ULongLong newValue
+ ACE_ENV_ARG_DECL)
+ ACE_THROW_SPEC ((CORBA::SystemException))
+{
+ CORBA::Any oldV, newV;
+ oldV <<= oldValue;
+ newV <<= newValue;
+
+ this->attribute_value_change (log,
+ id,
+ DsLogNotification::maxLogSize,
+ oldV,
+ newV
+ ACE_ENV_ARG_PARAMETER);
+ ACE_CHECK;
+}
+
+void
+TAO_LogNotification::start_time_value_change (DsLogAdmin::Log_ptr log,
+ DsLogAdmin::LogId id,
+ DsLogAdmin::TimeT oldValue,
+ DsLogAdmin::TimeT newValue
+ ACE_ENV_ARG_DECL)
+ ACE_THROW_SPEC ((CORBA::SystemException))
+{
+ CORBA::Any oldV, newV;
+ oldV <<= oldValue;
+ newV <<= newValue;
+
+ this->attribute_value_change (log,
+ id,
+ DsLogNotification::startTime,
+ oldV,
+ newV
+ ACE_ENV_ARG_PARAMETER);
+ ACE_CHECK;
+}
+
+void
+TAO_LogNotification::stop_time_value_change (DsLogAdmin::Log_ptr log,
+ DsLogAdmin::LogId id,
+ DsLogAdmin::TimeT oldValue,
+ DsLogAdmin::TimeT newValue
+ ACE_ENV_ARG_DECL)
+ ACE_THROW_SPEC ((CORBA::SystemException))
+{
+ CORBA::Any oldV, newV;
+ oldV <<= oldValue;
+ newV <<= newValue;
+
+ this->attribute_value_change (log,
+ id,
+ DsLogNotification::stopTime,
+ oldV,
+ newV
+ ACE_ENV_ARG_PARAMETER);
+ ACE_CHECK;
+}
+
+void
+TAO_LogNotification::week_mask_value_change (DsLogAdmin::Log_ptr log,
+ DsLogAdmin::LogId id,
+ const DsLogAdmin::WeekMask& oldValue,
+ const DsLogAdmin::WeekMask& newValue
+ ACE_ENV_ARG_DECL)
+ ACE_THROW_SPEC ((CORBA::SystemException))
+{
+ CORBA::Any oldV, newV;
+ oldV <<= oldValue;
+ newV <<= newValue;
+
+ this->attribute_value_change (log,
+ id,
+ DsLogNotification::weekMask,
+ oldV,
+ newV
+ ACE_ENV_ARG_PARAMETER);
+ ACE_CHECK;
+}
+
+void
+TAO_LogNotification::max_record_life_value_change (DsLogAdmin::Log_ptr log,
+ DsLogAdmin::LogId id,
+ CORBA::ULong oldValue,
+ CORBA::ULong newValue
+ ACE_ENV_ARG_DECL)
+ ACE_THROW_SPEC ((CORBA::SystemException))
+{
+ CORBA::Any oldV, newV;
+ oldV <<= oldValue;
+ newV <<= newValue;
+
+ this->attribute_value_change (log,
+ id,
+ DsLogNotification::maxRecordLife,
+ oldV,
+ newV
+ ACE_ENV_ARG_PARAMETER);
+ ACE_CHECK;
+}
+
+void
+TAO_LogNotification::quality_of_service_value_change (
+ DsLogAdmin::Log_ptr log,
+ DsLogAdmin::LogId id,
+ const DsLogAdmin::QoSList& oldValue,
+ const DsLogAdmin::QoSList& newValue
+ ACE_ENV_ARG_DECL)
+ ACE_THROW_SPEC ((CORBA::SystemException))
+{
+ CORBA::Any oldV, newV;
+ oldV <<= oldValue;
+ newV <<= newValue;
+
+ this->attribute_value_change (log,
+ id,
+ DsLogNotification::qualityOfService,
+ oldV,
+ newV
+ ACE_ENV_ARG_PARAMETER);
+ ACE_CHECK;
+}
+
+void
+TAO_LogNotification::state_change (DsLogAdmin::Log_ptr log,
+ DsLogAdmin::LogId id,
+ DsLogNotification::StateType type,
+ CORBA::Any newValue
+ ACE_ENV_ARG_DECL)
+ ACE_THROW_SPEC ((CORBA::SystemException))
+{
+ CORBA::Any any;
+ DsLogNotification::StateChange event;
+
+ event.logref = DsLogAdmin::Log::_duplicate (log);
+ event.id = id;
+
+ TimeBase::TimeT current_time;
+ ACE_Time_Value now = ACE_OS::gettimeofday ();
+ ORBSVCS_Time::Time_Value_to_TimeT (current_time, now);
+ event.time = current_time;
+
+ // Administrative, Operational or Forwarding state.
+ event.type = type;
+
+ event.new_value = newValue;
+
+ any <<= event;
+
+ this->send_notification (any
+ ACE_ENV_ARG_PARAMETER);
+ ACE_CHECK;
+}
+
+void
+TAO_LogNotification::administrative_state_change (
+ DsLogAdmin::Log_ptr log,
+ DsLogAdmin::LogId id,
+ DsLogAdmin::AdministrativeState newValue
+ ACE_ENV_ARG_DECL)
+ ACE_THROW_SPEC ((CORBA::SystemException))
+{
+ CORBA::Any newV;
+ newV <<= newValue;
+
+ this->state_change (log,
+ id,
+ DsLogNotification::administrativeState,
+ newV
+ ACE_ENV_ARG_PARAMETER);
+ ACE_CHECK;
+}
+
+void
+TAO_LogNotification::operational_state_change (
+ DsLogAdmin::Log_ptr log,
+ DsLogAdmin::LogId id,
+ DsLogAdmin::OperationalState newValue
+ ACE_ENV_ARG_DECL)
+ ACE_THROW_SPEC ((CORBA::SystemException))
+{
+ CORBA::Any newV;
+ newV <<= newValue;
+
+ this->state_change (log,
+ id,
+ DsLogNotification::operationalState,
+ newV
+ ACE_ENV_ARG_PARAMETER);
+ ACE_CHECK;
+}
+
+void
+TAO_LogNotification::forwarding_state_change (DsLogAdmin::Log_ptr log,
+ DsLogAdmin::LogId id,
+ DsLogAdmin::ForwardingState newValue
+ ACE_ENV_ARG_DECL)
+ ACE_THROW_SPEC ((CORBA::SystemException))
+{
+ CORBA::Any newV;
+ newV <<= newValue;
+
+ this->state_change (log,
+ id,
+ DsLogNotification::forwardingState,
+ newV
+ ACE_ENV_ARG_PARAMETER);
+ ACE_CHECK;
+}
+
+void
+TAO_LogNotification::threshold_alarm (
+ DsLogAdmin::Log_ptr log,
+ DsLogAdmin::LogId id,
+ DsLogAdmin::Threshold crossedValue,
+ DsLogAdmin::Threshold observedValue,
+ DsLogNotification::PerceivedSeverityType severity
+ ACE_ENV_ARG_DECL)
+ ACE_THROW_SPEC ((CORBA::SystemException))
+{
+ CORBA::Any any;
+ DsLogNotification::ThresholdAlarm event;
+
+ event.logref = DsLogAdmin::Log::_duplicate (log);
+ event.id = id;
+
+ TimeBase::TimeT current_time;
+ ACE_Time_Value now = ACE_OS::gettimeofday ();
+ ORBSVCS_Time::Time_Value_to_TimeT(current_time, now);
+ event.time = current_time;
+
+ event.crossed_value = crossedValue;
+ event.observed_value = observedValue;
+ event.perceived_severity = severity;
+
+ any <<= event;
+
+ this->send_notification (any
+ ACE_ENV_ARG_PARAMETER);
+ ACE_CHECK;
+}
+
+void
+TAO_LogNotification::send_notification (const CORBA::Any & /* any */
+ ACE_ENV_ARG_DECL_NOT_USED)
+ ACE_THROW_SPEC ((CORBA::SystemException))
+{
+}
+
+TAO_END_VERSIONED_NAMESPACE_DECL
diff --git a/TAO/orbsvcs/orbsvcs/Log/LogNotification.h b/TAO/orbsvcs/orbsvcs/Log/LogNotification.h
new file mode 100644
index 00000000000..32b68ecae1f
--- /dev/null
+++ b/TAO/orbsvcs/orbsvcs/Log/LogNotification.h
@@ -0,0 +1,185 @@
+// -*- C++ -*-
+
+//=============================================================================
+/**
+ * @file LogNotification.h
+ *
+ * $Id$
+ *
+ * Implementation of the DsLogAdmin::LogNotification interface.
+ *
+ * @author D A Hanvey <d.hanvey@qub.ac.uk>
+ */
+//=============================================================================
+
+
+#ifndef TAO_TLS_LOG_NOTIFICATION_H
+#define TAO_TLS_LOG_NOTIFICATION_H
+
+#include /**/ "ace/pre.h"
+
+#include "orbsvcs/DsLogAdminS.h"
+
+#if !defined (ACE_LACKS_PRAGMA_ONCE)
+# pragma once
+#endif /* ACE_LACKS_PRAGMA_ONCE */
+
+#include "orbsvcs/DsLogNotificationS.h"
+#include "orbsvcs/Log/log_serv_export.h"
+
+TAO_BEGIN_VERSIONED_NAMESPACE_DECL
+
+/**
+ * @class TAO_LogNotification
+ *
+ * @brief Used to forward log generated events to a logging server
+ *
+ * This implementation attempts to conform to the telecom
+ * logging specification.
+ */
+class TAO_Log_Serv_Export TAO_LogNotification
+{
+
+public:
+
+ /// Constructor.
+ TAO_LogNotification (void);
+
+ /// Destructor.
+ virtual ~TAO_LogNotification (void);
+
+ /// Event generated when a new log is created.
+ void object_creation (DsLogAdmin::LogId id ACE_ENV_ARG_DECL)
+ ACE_THROW_SPEC ((CORBA::SystemException));
+
+ /// Event generated when a new log is deleted.
+ void object_deletion (DsLogAdmin::LogId id ACE_ENV_ARG_DECL)
+ ACE_THROW_SPEC ((CORBA::SystemException));
+
+ /// Event generated.
+ void processing_error_alarm (CORBA::ULong error_num, const char* error_string
+ ACE_ENV_ARG_DECL)
+ ACE_THROW_SPEC ((CORBA::SystemException));
+
+ /// AttributeValueChange event generation method.
+ void attribute_value_change (DsLogAdmin::Log_ptr log,
+ DsLogAdmin::LogId id,
+ DsLogNotification::AttributeType type,
+ CORBA::Any oldValue,
+ CORBA::Any newValue ACE_ENV_ARG_DECL)
+ ACE_THROW_SPEC ((CORBA::SystemException));
+
+ /// AttributeValueChange event generation method.
+ void capacity_alarm_threshold_value_change (DsLogAdmin::Log_ptr log,
+ DsLogAdmin::LogId id,
+ const DsLogAdmin::CapacityAlarmThresholdList& oldValue,
+ const DsLogAdmin::CapacityAlarmThresholdList& newValue
+ ACE_ENV_ARG_DECL)
+ ACE_THROW_SPEC ((CORBA::SystemException));
+
+ /// AttributeValueChange event generation method.
+ void log_full_action_value_change (DsLogAdmin::Log_ptr log,
+ DsLogAdmin::LogId id,
+ CORBA::ULong oldValue,
+ CORBA::ULong newValue
+ ACE_ENV_ARG_DECL)
+ ACE_THROW_SPEC ((CORBA::SystemException));
+
+ /// AttributeValueChange event generation method.
+ void max_log_size_value_change (DsLogAdmin::Log_ptr log,
+ DsLogAdmin::LogId id,
+ CORBA::ULongLong oldValue,
+ CORBA::ULongLong newValue
+ ACE_ENV_ARG_DECL)
+ ACE_THROW_SPEC ((CORBA::SystemException));
+
+ /// AttributeValueChange event generation method.
+ void start_time_value_change (DsLogAdmin::Log_ptr log,
+ DsLogAdmin::LogId id,
+ DsLogAdmin::TimeT oldValue,
+ DsLogAdmin::TimeT newValue
+ ACE_ENV_ARG_DECL)
+ ACE_THROW_SPEC ((CORBA::SystemException));
+
+ /// AttributeValueChange event generation method.
+ void stop_time_value_change (DsLogAdmin::Log_ptr log,
+ DsLogAdmin::LogId id,
+ DsLogAdmin::TimeT oldValue,
+ DsLogAdmin::TimeT newValue
+ ACE_ENV_ARG_DECL)
+ ACE_THROW_SPEC ((CORBA::SystemException));
+
+ /// AttributeValueChange event generation method.
+ void week_mask_value_change (DsLogAdmin::Log_ptr log,
+ DsLogAdmin::LogId id,
+ const DsLogAdmin::WeekMask& oldValue,
+ const DsLogAdmin::WeekMask& newValue
+ ACE_ENV_ARG_DECL)
+ ACE_THROW_SPEC ((CORBA::SystemException));
+
+ /// AttributeValueChange event generation method.
+ void max_record_life_value_change (DsLogAdmin::Log_ptr log,
+ DsLogAdmin::LogId id,
+ CORBA::ULong oldValue,
+ CORBA::ULong newValue
+ ACE_ENV_ARG_DECL)
+ ACE_THROW_SPEC ((CORBA::SystemException));
+
+ /// AttributeValueChange event generation method.
+ void quality_of_service_value_change (DsLogAdmin::Log_ptr log,
+ DsLogAdmin::LogId id,
+ const DsLogAdmin::QoSList& oldValue,
+ const DsLogAdmin::QoSList& newValue
+ ACE_ENV_ARG_DECL)
+ ACE_THROW_SPEC ((CORBA::SystemException));
+
+ /// StateChange event generation method.
+ void state_change (DsLogAdmin::Log_ptr log,
+ DsLogAdmin::LogId id,
+ DsLogNotification::StateType type,
+ CORBA::Any newValue
+ ACE_ENV_ARG_DECL)
+ ACE_THROW_SPEC ((CORBA::SystemException));
+
+ /// StateChange event generation method.
+ void administrative_state_change (DsLogAdmin::Log_ptr log,
+ DsLogAdmin::LogId id,
+ DsLogAdmin::AdministrativeState newValue
+ ACE_ENV_ARG_DECL)
+ ACE_THROW_SPEC ((CORBA::SystemException));
+
+ /// StateChange event generation method.
+ void operational_state_change (DsLogAdmin::Log_ptr log,
+ DsLogAdmin::LogId id,
+ DsLogAdmin::OperationalState newValue
+ ACE_ENV_ARG_DECL)
+ ACE_THROW_SPEC ((CORBA::SystemException));
+
+ /// StateChange event generation method.
+ void forwarding_state_change (DsLogAdmin::Log_ptr log,
+ DsLogAdmin::LogId id,
+ DsLogAdmin::ForwardingState newValue
+ ACE_ENV_ARG_DECL)
+ ACE_THROW_SPEC ((CORBA::SystemException));
+
+ /// StateChange event generation method.
+ void threshold_alarm (DsLogAdmin::Log_ptr log,
+ DsLogAdmin::LogId id,
+ DsLogAdmin::Threshold crossedValue,
+ DsLogAdmin::Threshold observedValue,
+ DsLogNotification::PerceivedSeverityType severity
+ ACE_ENV_ARG_DECL)
+ ACE_THROW_SPEC ((CORBA::SystemException));
+
+ /// Method overriden by by event-aware logging services to cause
+ /// a notification event to be sent.
+ virtual void send_notification (const CORBA::Any &
+ ACE_ENV_ARG_DECL)
+ ACE_THROW_SPEC ((CORBA::SystemException));
+};
+
+TAO_END_VERSIONED_NAMESPACE_DECL
+
+#include /**/ "ace/post.h"
+
+#endif /* TAO_TLS_LOG_NOTIFICATION_H */
diff --git a/TAO/orbsvcs/orbsvcs/Log/LogRecordStore.cpp b/TAO/orbsvcs/orbsvcs/Log/LogRecordStore.cpp
new file mode 100644
index 00000000000..278039ac40e
--- /dev/null
+++ b/TAO/orbsvcs/orbsvcs/Log/LogRecordStore.cpp
@@ -0,0 +1,17 @@
+#include "orbsvcs/Log/LogRecordStore.h"
+
+ACE_RCSID (Log,
+ LogRecordStore,
+ "$Id$")
+
+TAO_BEGIN_VERSIONED_NAMESPACE_DECL
+
+TAO_LogRecordStore::TAO_LogRecordStore (void)
+{
+}
+
+TAO_LogRecordStore::~TAO_LogRecordStore (void)
+{
+}
+
+TAO_END_VERSIONED_NAMESPACE_DECL
diff --git a/TAO/orbsvcs/orbsvcs/Log/LogRecordStore.h b/TAO/orbsvcs/orbsvcs/Log/LogRecordStore.h
new file mode 100644
index 00000000000..4e630b0ea46
--- /dev/null
+++ b/TAO/orbsvcs/orbsvcs/Log/LogRecordStore.h
@@ -0,0 +1,269 @@
+// -*- C++ -*-
+
+//=============================================================================
+/**
+ * @file LogRecordStore.h
+ *
+ * $Id$
+ *
+ * @author Matthew Braun <mjb2@cs.wustl.edu>
+ * @author Pradeep Gore <pradeep@cs.wustl.edu>
+ * @author David A. Hanvey <d.hanvey@qub.ac.uk>
+ */
+//=============================================================================
+
+#ifndef TAO_LOG_RECORD_STORE_H
+#define TAO_LOG_RECORD_STORE_H
+
+#include /**/ "ace/pre.h"
+#include /**/ "ace/config-all.h"
+
+#if !defined (ACE_LACKS_PRAGMA_ONCE)
+# pragma once
+#endif /* ACE_LACKS_PRAGMA_ONCE */
+
+#include "orbsvcs/DsLogAdminC.h"
+#include "orbsvcs/Log/log_serv_export.h"
+
+TAO_BEGIN_VERSIONED_NAMESPACE_DECL
+
+/**
+ * @class TAO_LogRecordStore
+ *
+ * @brief Abstract base class for storing DsLogAdmin::LogRecord's
+ *
+ * Implements a Table Data Gateway(144) for log records, and a Row
+ * Data Gateway(152) for log channel parameters.
+ */
+class TAO_Log_Serv_Export TAO_LogRecordStore
+{
+ public:
+
+ // = Initialization and termination methods
+
+ /// Destructor.
+ virtual ~TAO_LogRecordStore (void);
+
+ /// Initialization.
+ virtual int open (void) = 0;
+
+ /// Close the record store.
+ virtual int close (void) = 0;
+
+
+ // = Log Parameters
+
+ /// Gets the administrative state of the log
+ virtual DsLogAdmin::AdministrativeState
+ get_administrative_state (ACE_ENV_SINGLE_ARG_DECL) const = 0;
+
+ /// Sets the administrative state of the log
+ virtual void
+ set_administrative_state (DsLogAdmin::AdministrativeState state
+ ACE_ENV_ARG_DECL) = 0;
+
+ /// Get the capacity alarm thresholds
+ virtual DsLogAdmin::CapacityAlarmThresholdList*
+ get_capacity_alarm_thresholds (ACE_ENV_SINGLE_ARG_DECL) const = 0;
+
+ /// Set the capacity alarm thresholds
+ virtual void
+ set_capacity_alarm_thresholds (const DsLogAdmin::CapacityAlarmThresholdList& thresholds
+ ACE_ENV_ARG_DECL) = 0;
+
+ /// Gets the forwarding state
+ virtual DsLogAdmin::ForwardingState
+ get_forwarding_state (ACE_ENV_SINGLE_ARG_DECL) const = 0;
+
+ /// Sets the forwarding state
+ virtual void
+ set_forwarding_state (DsLogAdmin::ForwardingState state
+ ACE_ENV_ARG_DECL) = 0;
+
+ /// Get the log duration
+ virtual DsLogAdmin::TimeInterval
+ get_interval (ACE_ENV_SINGLE_ARG_DECL) const = 0;
+
+ /// Set the log duration.
+ virtual void
+ set_interval (const DsLogAdmin::TimeInterval& interval
+ ACE_ENV_ARG_DECL) = 0;
+
+ /// Get the log full action
+ virtual DsLogAdmin::LogFullActionType
+ get_log_full_action (ACE_ENV_SINGLE_ARG_DECL) const = 0;
+
+ /// Set the log full action
+ virtual void
+ set_log_full_action(DsLogAdmin::LogFullActionType action
+ ACE_ENV_ARG_DECL) = 0;
+
+ /// Get the list of the QoS properties supported by the log.
+ virtual DsLogAdmin::QoSList*
+ get_log_qos (ACE_ENV_SINGLE_ARG_DECL) const = 0;
+
+ /// Set the list of the QoS properties supported by the log.
+ virtual void
+ set_log_qos (const DsLogAdmin::QoSList& qos
+ ACE_ENV_ARG_DECL) = 0;
+
+ /// Gets the max record life
+ virtual CORBA::ULong
+ get_max_record_life (ACE_ENV_SINGLE_ARG_DECL) const = 0;
+
+ /// Sets the max record life
+ virtual void
+ set_max_record_life (CORBA::ULong life
+ ACE_ENV_ARG_DECL) = 0;
+
+ /// Get the current set value of the max size of the log data.
+ virtual CORBA::ULongLong
+ get_max_size (ACE_ENV_SINGLE_ARG_DECL) const = 0;
+
+ /// Set the max size of log data. size == 0, => infinite.
+ virtual void
+ set_max_size (CORBA::ULongLong size
+ ACE_ENV_ARG_DECL) = 0;
+
+ /// Get the weekly scheduling parameters
+ virtual DsLogAdmin::WeekMask*
+ get_week_mask (ACE_ENV_SINGLE_ARG_DECL) = 0;
+
+ /// Set the weekly scheduling parameters.
+ virtual void
+ set_week_mask (const DsLogAdmin::WeekMask& masks
+ ACE_ENV_ARG_DECL) = 0;
+
+
+ // = LogRecordStore status methods
+
+ /// Gets the current size of the log data.
+ virtual CORBA::ULongLong
+ get_current_size (ACE_ENV_SINGLE_ARG_DECL) = 0;
+
+ /// Get the number of records in the log right now.
+ virtual CORBA::ULongLong
+ get_n_records (ACE_ENV_SINGLE_ARG_DECL) = 0;
+
+
+ // = LogRecordStore gauge
+
+ /// Gets the current value of the "gauge" that measures the total
+ /// size of the records written to the log.
+ virtual CORBA::ULongLong
+ get_gauge(ACE_ENV_SINGLE_ARG_DECL) = 0;
+
+ /// Resets the "gauge" to 0
+ virtual void
+ reset_gauge(ACE_ENV_SINGLE_ARG_DECL) = 0;
+
+
+ // = Record logging, retrieval, update and removal methods.
+
+ /// Insert rec into storage.
+ /// Returns 0 on success -1 on failure and 1 if the log is full.
+ virtual int
+ log (const DsLogAdmin::LogRecord &rec ACE_ENV_ARG_DECL) = 0;
+
+ /// Deletes "old" records from the store.
+ virtual int
+ purge_old_records (ACE_ENV_SINGLE_ARG_DECL) = 0;
+
+ /// Set single record attributes.
+ virtual void
+ set_record_attribute (DsLogAdmin::RecordId id,
+ const DsLogAdmin::NVList & attr_list
+ ACE_ENV_ARG_DECL)
+ ACE_THROW_SPEC ((CORBA::SystemException,
+ DsLogAdmin::InvalidRecordId,
+ DsLogAdmin::InvalidAttribute)) = 0;
+
+ /// Set the attributes of all records that matches the
+ /// constraints with same attr_list.
+ virtual CORBA::ULong
+ set_records_attribute (const char * grammar,
+ const char * c,
+ const DsLogAdmin::NVList & attr_list
+ ACE_ENV_ARG_DECL)
+ ACE_THROW_SPEC ((CORBA::SystemException,
+ DsLogAdmin::InvalidGrammar,
+ DsLogAdmin::InvalidConstraint,
+ DsLogAdmin::InvalidAttribute)) = 0;
+
+ /// Get the attributes of the record with id <id>. Raises
+ /// DsLogAdmin::InvalidRecordId
+ virtual DsLogAdmin::NVList*
+ get_record_attribute (DsLogAdmin::RecordId id
+ ACE_ENV_ARG_DECL)
+ ACE_THROW_SPEC ((CORBA::SystemException,
+ DsLogAdmin::InvalidRecordId)) = 0;
+
+ /// Ensure changes have been flushed to persistent media
+ /// Returns 0 on success, -1 on failure
+ virtual int
+ flush (ACE_ENV_SINGLE_ARG_DECL) = 0;
+
+
+ /// Returns all records in the log that match the given constraint
+ /// <c>.
+ virtual DsLogAdmin::RecordList*
+ query (const char * grammar,
+ const char * c,
+ DsLogAdmin::Iterator_out i
+ ACE_ENV_ARG_DECL)
+ ACE_THROW_SPEC ((CORBA::SystemException,
+ DsLogAdmin::InvalidGrammar,
+ DsLogAdmin::InvalidConstraint)) = 0;
+
+ /// Retrieve <how_many> records from time <from_time> using iterator
+ /// <i>.
+ virtual DsLogAdmin::RecordList*
+ retrieve (DsLogAdmin::TimeT from_time,
+ CORBA::Long how_many,
+ DsLogAdmin::Iterator_out i
+ ACE_ENV_ARG_DECL)
+ ACE_THROW_SPEC ((CORBA::SystemException)) = 0;
+
+ /// Returns the number of records matching constraint <c>.
+ virtual CORBA::ULong
+ match (const char * grammar,
+ const char * c
+ ACE_ENV_ARG_DECL)
+ ACE_THROW_SPEC ((CORBA::SystemException,
+ DsLogAdmin::InvalidGrammar,
+ DsLogAdmin::InvalidConstraint)) = 0;
+
+ /// Delete records matching constraint <c>.
+ virtual CORBA::ULong
+ delete_records (const char * grammar,
+ const char * c
+ ACE_ENV_ARG_DECL)
+ ACE_THROW_SPEC ((CORBA::SystemException,
+ DsLogAdmin::InvalidGrammar,
+ DsLogAdmin::InvalidConstraint)) = 0;
+
+ /// Delete records matching ids in <ids>
+ virtual CORBA::ULong
+ delete_records_by_id (const DsLogAdmin::RecordIdList & ids
+ ACE_ENV_ARG_DECL)
+ ACE_THROW_SPEC ((CORBA::SystemException)) = 0;
+
+
+ virtual CORBA::ULong
+ remove_old_records (ACE_ENV_SINGLE_ARG_DECL) = 0;
+
+ /// Read-Write Lock
+ virtual ACE_SYNCH_RW_MUTEX& lock() = 0;
+
+protected:
+ /// Constructor.
+ TAO_LogRecordStore (void);
+
+
+private:
+};
+
+TAO_END_VERSIONED_NAMESPACE_DECL
+
+#include /**/ "ace/post.h"
+#endif /*TAO_LOG_RECORD_STORE_H*/
diff --git a/TAO/orbsvcs/orbsvcs/Log/LogStore.h b/TAO/orbsvcs/orbsvcs/Log/LogStore.h
new file mode 100644
index 00000000000..78773abffb9
--- /dev/null
+++ b/TAO/orbsvcs/orbsvcs/Log/LogStore.h
@@ -0,0 +1,108 @@
+// -*- C++ -*-
+
+//=============================================================================
+/**
+ * @file LogStore.h
+ *
+ * $Id$
+ *
+ * @author Matthew Braun <mjb2@cs.wustl.edu>
+ * @author Pradeep Gore <pradeep@cs.wustl.edu>
+ * @author David A. Hanvey <d.hanvey@qub.ac.uk>
+ */
+//=============================================================================
+
+#ifndef TAO_TLS_LOGSTORE_H
+#define TAO_TLS_LOGSTORE_H
+
+#include /**/ "ace/pre.h"
+#include /**/ "ace/config-all.h"
+
+#if !defined (ACE_LACKS_PRAGMA_ONCE)
+#pragma once
+#endif /* ACE_LACKS_PRAGMA_ONCE */
+
+#include "orbsvcs/DsLogAdminC.h"
+#include "orbsvcs/Log/log_serv_export.h"
+
+TAO_BEGIN_VERSIONED_NAMESPACE_DECL
+
+class TAO_LogRecordStore;
+
+class TAO_Log_Serv_Export TAO_LogStore
+{
+public:
+ // Destructor
+ virtual ~TAO_LogStore() {}
+
+ /// Lists all logs created by the log factory.
+ virtual DsLogAdmin::LogList *
+ list_logs (ACE_ENV_SINGLE_ARG_DECL)
+ ACE_THROW_SPEC ((
+ CORBA::SystemException
+ )) = 0;
+
+ /// Lists all log ids.
+ virtual DsLogAdmin::LogIdList *
+ list_logs_by_id (ACE_ENV_SINGLE_ARG_DECL)
+ ACE_THROW_SPEC ((
+ CORBA::SystemException
+ )) = 0;
+
+ /// Returns a reference to the log with the supplied id.
+ virtual DsLogAdmin::Log_ptr
+ find_log (DsLogAdmin::LogId id
+ ACE_ENV_ARG_DECL)
+ ACE_THROW_SPEC ((
+ CORBA::SystemException
+ )) = 0;
+
+ /// Returns true if log exists, otherwise false
+ virtual bool
+ exists (DsLogAdmin::LogId id
+ ACE_ENV_ARG_DECL) = 0;
+
+ /// Remove the given entry from the hash table.
+ virtual int
+ remove (DsLogAdmin::LogId id
+ ACE_ENV_ARG_DECL) = 0;
+
+ /// @brief Create log
+ virtual void
+ create (DsLogAdmin::LogFullActionType full_action,
+ CORBA::ULongLong max_size,
+ const DsLogAdmin::CapacityAlarmThresholdList* thresholds,
+ DsLogAdmin::LogId_out id_out
+ ACE_ENV_ARG_DECL) = 0;
+
+ /// @brief Create log
+ virtual void
+ create_with_id (DsLogAdmin::LogId id,
+ DsLogAdmin::LogFullActionType full_action,
+ CORBA::ULongLong max_size,
+ const DsLogAdmin::CapacityAlarmThresholdList* thresholds
+ ACE_ENV_ARG_DECL) = 0;
+
+ /// @brief Get log record store
+ ///
+ /// Get/Create a log record store for log channel @a id.
+ ///
+ /// @param id log id
+ ///
+ virtual TAO_LogRecordStore*
+ get_log_record_store (DsLogAdmin::LogId id
+ ACE_ENV_ARG_DECL) = 0;
+
+protected:
+ // Constructor
+ TAO_LogStore() {}
+
+
+private:
+};
+
+TAO_END_VERSIONED_NAMESPACE_DECL
+
+#include /**/ "ace/post.h"
+
+#endif /* TAO_TLS_LOGSTORE_H */
diff --git a/TAO/orbsvcs/orbsvcs/Log/Log_Compaction_Handler.cpp b/TAO/orbsvcs/orbsvcs/Log/Log_Compaction_Handler.cpp
new file mode 100644
index 00000000000..d153bbe2714
--- /dev/null
+++ b/TAO/orbsvcs/orbsvcs/Log/Log_Compaction_Handler.cpp
@@ -0,0 +1,66 @@
+#include "orbsvcs/Log/Log_Compaction_Handler.h"
+#include "orbsvcs/Log/Log_i.h"
+#include "ace/Reactor.h"
+
+ACE_RCSID (Log,
+ Log_Compaction_Handler,
+ "$Id$")
+
+
+TAO_BEGIN_VERSIONED_NAMESPACE_DECL
+
+TAO_Log_Compaction_Handler::TAO_Log_Compaction_Handler (ACE_Reactor* reactor,
+ TAO_Log_i* log,
+ const ACE_Time_Value& interval)
+ : timer_id_(-1),
+ reactor_(reactor),
+ log_(log),
+ interval_(interval)
+{
+}
+
+
+TAO_Log_Compaction_Handler::~TAO_Log_Compaction_Handler ()
+{
+ this->cancel ();
+}
+
+
+void
+TAO_Log_Compaction_Handler::schedule ()
+{
+ this->cancel ();
+ this->timer_id_ =
+ this->reactor_->schedule_timer (this, 0, this->interval_, this->interval_);
+}
+
+
+void
+TAO_Log_Compaction_Handler::cancel ()
+{
+ if (this->timer_id_ != -1)
+ {
+ this->reactor_->cancel_timer (timer_id_);
+ this->timer_id_ = -1;
+ }
+}
+
+
+int
+TAO_Log_Compaction_Handler::handle_timeout (const ACE_Time_Value&,
+ const void *)
+{
+ ACE_TRY_NEW_ENV
+ {
+ this->log_->remove_old_records(ACE_ENV_SINGLE_ARG_PARAMETER);
+ ACE_TRY_CHECK;
+ }
+ ACE_CATCHANY
+ {
+ }
+ ACE_ENDTRY;
+
+ return 0;
+}
+
+TAO_END_VERSIONED_NAMESPACE_DECL
diff --git a/TAO/orbsvcs/orbsvcs/Log/Log_Compaction_Handler.h b/TAO/orbsvcs/orbsvcs/Log/Log_Compaction_Handler.h
new file mode 100644
index 00000000000..3e51de61602
--- /dev/null
+++ b/TAO/orbsvcs/orbsvcs/Log/Log_Compaction_Handler.h
@@ -0,0 +1,66 @@
+// -*- C++ -*-
+
+//=============================================================================
+/**
+ * @file Log_Compaction_Handler.h
+ *
+ * $Id$
+ *
+ */
+//=============================================================================
+
+#ifndef TAO_TLS_COMPACTION_HANDLER_H
+#define TAO_TLS_COMPACTION_HANDLER_H
+
+#include "orbsvcs/Log/log_serv_export.h"
+
+#if !defined (ACE_LACKS_PRAGMA_ONCE)
+# pragma once
+#endif /* ACE_LACKS_PRAGMA_ONCE */
+
+#include "tao/Versioned_Namespace.h"
+
+#include "ace/Event_Handler.h"
+#include "ace/Time_Value.h"
+
+ACE_BEGIN_VERSIONED_NAMESPACE_DECL
+class ACE_Reactor;
+ACE_END_VERSIONED_NAMESPACE_DECL
+
+TAO_BEGIN_VERSIONED_NAMESPACE_DECL
+
+class TAO_Log_i;
+
+/// @class TAO_Log_Compaction_Handler
+/// @brief Periodically invoke remove_old_records() on Log
+///
+class TAO_Log_Serv_Export TAO_Log_Compaction_Handler
+ : public ACE_Event_Handler
+{
+public:
+ /// Constructor.
+ TAO_Log_Compaction_Handler (ACE_Reactor* reactor,
+ TAO_Log_i* log,
+ const ACE_Time_Value& interval);
+
+ /// Destructor.
+ ~TAO_Log_Compaction_Handler ();
+
+ /// Schedule Timer.
+ void schedule ();
+
+ /// Cancel Timer.
+ void cancel ();
+
+ virtual int handle_timeout (const ACE_Time_Value &tv, const void *arg);
+
+private:
+ long timer_id_;
+ ACE_Reactor* reactor_;
+ TAO_Log_i* log_;
+ const ACE_Time_Value interval_;
+};
+
+TAO_END_VERSIONED_NAMESPACE_DECL
+
+#endif /* TAO_LOG_COMPACTION_HANDLER_H */
diff --git a/TAO/orbsvcs/orbsvcs/Log/Log_Constraint_Interpreter.cpp b/TAO/orbsvcs/orbsvcs/Log/Log_Constraint_Interpreter.cpp
new file mode 100644
index 00000000000..e741de09004
--- /dev/null
+++ b/TAO/orbsvcs/orbsvcs/Log/Log_Constraint_Interpreter.cpp
@@ -0,0 +1,49 @@
+#include "orbsvcs/Log/Log_Constraint_Interpreter.h"
+
+#include "orbsvcs/Log/Log_Constraint_Visitors.h"
+
+ACE_RCSID (Log,
+ Log_Constraint_Interpreter,
+ "$Id$")
+
+TAO_BEGIN_VERSIONED_NAMESPACE_DECL
+
+TAO_Log_Constraint_Interpreter::TAO_Log_Constraint_Interpreter (
+ const char *constraints
+ ACE_ENV_ARG_DECL
+ )
+ ACE_THROW_SPEC ((DsLogAdmin::InvalidConstraint,
+ CORBA::NO_MEMORY))
+{
+ if (TAO_ETCL_Interpreter::is_empty_string (constraints))
+ {
+ // Root is deleted in the TAO_Interpreter's destructor.
+ ACE_NEW_THROW_EX (this->root_,
+ TAO_ETCL_Literal_Constraint ((CORBA::Boolean) 1),
+ CORBA::NO_MEMORY ());
+ ACE_CHECK;
+ }
+ else
+ {
+ // root_ is set in this base class call.
+ if (TAO_ETCL_Interpreter::build_tree (constraints) != 0)
+ ACE_THROW (DsLogAdmin::InvalidConstraint ());
+ }
+}
+
+TAO_Log_Constraint_Interpreter::~TAO_Log_Constraint_Interpreter (void)
+{
+}
+
+CORBA::Boolean
+TAO_Log_Constraint_Interpreter::evaluate (
+ TAO_Log_Constraint_Visitor &evaluator
+ )
+{
+ CORBA::Boolean retval =
+ evaluator.evaluate_constraint (this->root_);
+
+ return retval;
+}
+
+TAO_END_VERSIONED_NAMESPACE_DECL
diff --git a/TAO/orbsvcs/orbsvcs/Log/Log_Constraint_Interpreter.h b/TAO/orbsvcs/orbsvcs/Log/Log_Constraint_Interpreter.h
new file mode 100644
index 00000000000..18f754d8c79
--- /dev/null
+++ b/TAO/orbsvcs/orbsvcs/Log/Log_Constraint_Interpreter.h
@@ -0,0 +1,70 @@
+// -*- C++ -*-
+
+//=============================================================================
+/**
+ * @file Log_Constraint_Interpreter.h
+ *
+ * $Id$
+ *
+ *
+ *
+ *
+ * @author Pradeep Gore <pradeep@cs.wustl.edu>
+ * @author D A Hanvey <d.hanvey@qub.ac.uk>
+ *
+ */
+//=============================================================================
+
+#ifndef TAO_LOG_CONSTRAINT_INTERPRETER_H
+#define TAO_LOG_CONSTRAINT_INTERPRETER_H
+
+#include /**/ "ace/pre.h"
+#include "orbsvcs/ETCL/ETCL_Interpreter.h"
+
+#if !defined (ACE_LACKS_PRAGMA_ONCE)
+# pragma once
+#endif /* ACE_LACKS_PRAGMA_ONCE */
+
+#include "orbsvcs/ETCL/ETCL_Constraint.h"
+#include "orbsvcs/DsLogAdminC.h"
+#include "orbsvcs/Log/log_serv_export.h"
+
+TAO_BEGIN_VERSIONED_NAMESPACE_DECL
+
+class TAO_Log_Constraint_Visitor;
+
+/**
+ * @class TAO_Log_Constraint_Interpreter
+ *
+ * @brief "ETCL" Interpreter for the Log queries.
+ */
+class TAO_Log_Serv_Export TAO_Log_Constraint_Interpreter :
+ public TAO_ETCL_Interpreter
+{
+public:
+
+ // = Initialization and termination methods.
+
+ /**
+ * This constructor builds an expression tree representing the
+ * constraint specified in <constraints>, and throws an Illegal
+ * Constraint exception if the constraint given has syntax errors or
+ * semantic errors, such as mismatched types.
+ */
+ TAO_Log_Constraint_Interpreter (const char* constraints
+ ACE_ENV_ARG_DECL)
+ ACE_THROW_SPEC ((DsLogAdmin::InvalidConstraint,
+ CORBA::NO_MEMORY));
+
+ /// Destructor.
+ ~TAO_Log_Constraint_Interpreter (void);
+
+ /// Returns true if the constraint is evaluated successfully by
+ /// the evaluator.
+ CORBA::Boolean evaluate (TAO_Log_Constraint_Visitor &evaluator);
+};
+
+TAO_END_VERSIONED_NAMESPACE_DECL
+
+#include /**/ "ace/post.h"
+#endif /* TAO_LOG_CONSTRAINT_INTERPRETER_H */
diff --git a/TAO/orbsvcs/orbsvcs/Log/Log_Constraint_Visitors.cpp b/TAO/orbsvcs/orbsvcs/Log/Log_Constraint_Visitors.cpp
new file mode 100644
index 00000000000..9d8fe567d40
--- /dev/null
+++ b/TAO/orbsvcs/orbsvcs/Log/Log_Constraint_Visitors.cpp
@@ -0,0 +1,1347 @@
+#include "orbsvcs/Log/Log_Constraint_Visitors.h"
+
+#include "orbsvcs/ETCL/ETCL_Constraint.h"
+#include "orbsvcs/ETCL/ETCL_y.h"
+
+#include "tao/DynamicAny/DynArray_i.h"
+#include "tao/DynamicAny/DynSequence_i.h"
+#include "tao/DynamicAny/DynStruct_i.h"
+#include "tao/DynamicAny/DynUnion_i.h"
+#include "tao/DynamicAny/DynEnum_i.h"
+#include "tao/DynamicAny/DynAnyFactory.h"
+
+#include "tao/AnyTypeCode/Any_Unknown_IDL_Type.h"
+#include "tao/CDR.h"
+
+ACE_RCSID (Log,
+ Log_Constraint_Visitors,
+ "$Id$")
+
+TAO_BEGIN_VERSIONED_NAMESPACE_DECL
+
+TAO_Log_Constraint_Visitor::TAO_Log_Constraint_Visitor (const DsLogAdmin::LogRecord &rec)
+ : property_lookup_ (property_lookup_size_)
+{
+ CORBA::Any val_id;
+#if defined (ACE_LACKS_LONGLONG_T) || defined (ACE_LACKS_UNSIGNEDLONGLONG_T)
+ val_id <<= ACE_U64_TO_U32 (rec.id);
+#else
+ val_id <<= static_cast<ACE_UINT32> (rec.id);
+#endif
+ this->property_lookup_.bind (ACE_CString("id", 0, 0), val_id);
+
+
+ CORBA::Any val_time;
+#if defined (ACE_LACKS_LONGLONG_T) || defined (ACE_LACKS_UNSIGNEDLONGLONG_T)
+ val_time <<= ACE_U64_TO_U32 (rec.time);
+#else
+ val_time <<= static_cast<ACE_UINT32> (rec.time);
+#endif
+ this->property_lookup_.bind (ACE_CString("time", 0, 0), val_time);
+
+ this->property_lookup_.bind (ACE_CString("info", 0, 0), rec.info);
+
+ // Bind an entry for each item in the record's attribute list.
+ CORBA::Long len = rec.attr_list.length();
+ for (CORBA::Long i = 0; i < len; ++i)
+ {
+ this->property_lookup_.bind (ACE_CString(rec.attr_list[i].name,
+ 0,
+ 0),
+ rec.attr_list[i].value);
+ }
+}
+
+CORBA::Boolean
+TAO_Log_Constraint_Visitor::evaluate_constraint (TAO_ETCL_Constraint* root)
+{
+ CORBA::Boolean result = 0;
+ this->queue_.reset ();
+
+ // Evaluate the constraint in root_;
+ if (root != 0)
+ {
+ if ((root->accept (this) == 0) &&
+ (! this->queue_.is_empty ()))
+ {
+ TAO_ETCL_Literal_Constraint top;
+ this->queue_.dequeue_head (top);
+ result = (CORBA::Boolean) top;
+ }
+ }
+
+ // If a property couldn't be evaluated we must return 0.
+ return result;
+}
+
+int
+TAO_Log_Constraint_Visitor::visit_literal (
+ TAO_ETCL_Literal_Constraint *literal
+ )
+{
+ this->queue_.enqueue_head (*literal);
+ return 0;
+}
+
+int
+TAO_Log_Constraint_Visitor::visit_identifier (TAO_ETCL_Identifier *ident)
+{
+ int return_value = -1;
+ const char *name = ident->value ();
+ ACE_CString key (name, 0, 0);
+
+ CORBA::Any any;
+
+ if (this->property_lookup_.find (key, any) == 0)
+ {
+ if (any.impl() != 0)
+ {
+ this->queue_.enqueue_head (TAO_ETCL_Literal_Constraint (&any));
+ return_value = 0;
+ }
+ }
+
+ return return_value;
+}
+
+int
+TAO_Log_Constraint_Visitor::visit_union_value (
+ TAO_ETCL_Union_Value *union_value
+ )
+{
+ switch (union_value->sign ())
+ {
+ case 0:
+ this->queue_.enqueue_head (*union_value->string ());
+ break;
+ case -1:
+ this->queue_.enqueue_head (-(*union_value->integer ()));
+ break;
+ case 1:
+ this->queue_.enqueue_head (*union_value->integer ());
+ break;
+ default:
+ return -1;
+ }
+
+ return 0;
+}
+
+int
+TAO_Log_Constraint_Visitor::visit_union_pos (
+ TAO_ETCL_Union_Pos *union_pos
+ )
+{
+ ACE_DECLARE_NEW_CORBA_ENV;
+ ACE_TRY
+ {
+ if (union_pos->union_value ()->accept (this) == 0)
+ {
+ TAO_ETCL_Literal_Constraint disc_val;
+ this->queue_.dequeue_head (disc_val);
+
+ TAO_DynUnion_i dyn_union;
+ dyn_union.init (this->current_member_.in ()
+ ACE_ENV_ARG_PARAMETER);
+ ACE_TRY_CHECK;
+
+ CORBA::TypeCode_var tc = this->current_member_->type ();
+
+ switch (disc_val.expr_type ())
+ {
+ case TAO_ETCL_INTEGER:
+ case TAO_ETCL_SIGNED:
+ case TAO_ETCL_UNSIGNED:
+ {
+ CORBA::Any disc_any;
+ CORBA::TypeCode_var disc_tc =
+ tc->discriminator_type (ACE_ENV_SINGLE_ARG_PARAMETER);
+ ACE_TRY_CHECK;
+ CORBA::TCKind disc_kind =
+ TAO_DynAnyFactory::unalias (disc_tc.in ()
+ ACE_ENV_ARG_PARAMETER);
+ ACE_TRY_CHECK;
+
+ switch (disc_kind)
+ {
+ case CORBA::tk_boolean:
+ disc_any <<= CORBA::Any::from_boolean ((CORBA::Boolean) disc_val);
+ break;
+ case CORBA::tk_short:
+ disc_any <<= (CORBA::Short) ((CORBA::Long) disc_val);
+ break;
+ case CORBA::tk_ushort:
+ disc_any <<= (CORBA::UShort) ((CORBA::ULong) disc_val);
+ break;
+ case CORBA::tk_long:
+ disc_any <<= (CORBA::Long) disc_val;
+ break;
+ case CORBA::tk_ulong:
+ disc_any <<= (CORBA::ULong) disc_val;
+ break;
+ case CORBA::tk_enum:
+ {
+ TAO_OutputCDR cdr;
+ cdr.write_ulong ((CORBA::ULong) disc_val);
+ TAO_InputCDR in_cdr (cdr);
+ TAO::Unknown_IDL_Type *unk = 0;
+ ACE_NEW_RETURN (unk,
+ TAO::Unknown_IDL_Type (
+ disc_tc.in (),
+ in_cdr
+ ),
+ -1);
+
+ disc_any.replace (unk);
+ break;
+ }
+ // @@@ (JP) I don't think ETCL handles 64-bit
+ // integers at this point, and I also think that
+ // chars and/or wchars will just come out in the
+ // constraint as (w)strings of length 1.
+ case CORBA::tk_longlong:
+ case CORBA::tk_ulonglong:
+ case CORBA::tk_char:
+ case CORBA::tk_wchar:
+ default:
+ return -1;
+ }
+
+ DynamicAny::DynAny_var dyn_any =
+ TAO_DynAnyFactory::make_dyn_any (disc_any
+ ACE_ENV_ARG_PARAMETER);
+ ACE_TRY_CHECK;
+ dyn_union.set_discriminator (dyn_any.in ()
+ ACE_ENV_ARG_PARAMETER);
+ ACE_TRY_CHECK;
+ DynamicAny::DynAny_var u_member =
+ dyn_union.member (ACE_ENV_SINGLE_ARG_PARAMETER);
+ ACE_TRY_CHECK;
+ this->current_member_ =
+ u_member->to_any (ACE_ENV_SINGLE_ARG_PARAMETER);
+ ACE_TRY_CHECK;
+
+ break;
+ }
+ case TAO_ETCL_STRING:
+ {
+ const char *name = (const char *) disc_val;
+ CORBA::ULong count =
+ tc->member_count (ACE_ENV_SINGLE_ARG_PARAMETER);
+ ACE_TRY_CHECK;
+
+ const char *member_name = 0;
+ CORBA::ULong i = 0;
+
+ for (i = 0; i < count; ++i)
+ {
+ member_name = tc->member_name (i
+ ACE_ENV_ARG_PARAMETER);
+ ACE_TRY_CHECK;
+
+ if (ACE_OS::strcmp (name, member_name) == 0)
+ {
+ break;
+ }
+ }
+
+ // If there's no match, member_label will throw
+ // CORBA::TypeCode::Bounds and the catch block will
+ // return -1;
+ this->current_member_ = tc->member_label (i
+ ACE_ENV_ARG_PARAMETER);
+ ACE_TRY_CHECK;
+
+ break;
+ }
+ // The TAO_ETCL_Union_Value that was put on the queue
+ // shouldn't have any other type.
+ default:
+ return -1;
+ }
+
+ TAO_ETCL_Constraint *nested = union_pos->component ();
+
+ // If there's no nested component, then we just want the
+ // union member value on the queue. Otherwise, we want
+ // the member value in current_member_ while we visit
+ // the nested component.
+ if (nested == 0)
+ {
+ TAO_ETCL_Literal_Constraint lit (this->current_member_.ptr ());
+ this->queue_.enqueue_head (lit);
+ return 0;
+ }
+ else
+ {
+ return nested->accept (this);
+ }
+ }
+ else
+ {
+ return -1;
+ }
+ }
+ ACE_CATCHANY
+ {
+ return -1;
+ }
+ ACE_ENDTRY;
+ ACE_CHECK_RETURN (-1);
+}
+
+int
+TAO_Log_Constraint_Visitor::visit_component_pos (TAO_ETCL_Component_Pos *pos)
+{
+ ACE_DECLARE_NEW_CORBA_ENV;
+ ACE_TRY
+ {
+ // If we are here (from visit_component) the Any containing the
+ // component as found in property_lookup_ will be in current_member_.
+ CORBA::TypeCode_var tc = this->current_member_->type ();
+ CORBA::TCKind kind = TAO_DynAnyFactory::unalias (tc.in ()
+ ACE_ENV_ARG_PARAMETER);
+ ACE_TRY_CHECK;
+
+ DynamicAny::DynAny_var member;
+ CORBA::Boolean success = 0;
+ CORBA::ULong slot = (CORBA::ULong) *pos->integer ();
+
+ switch (kind)
+ {
+ case CORBA::tk_enum:
+ {
+ TAO_DynEnum_i dyn_enum;
+ dyn_enum.init (this->current_member_.in ()
+ ACE_ENV_ARG_PARAMETER);
+ ACE_TRY_CHECK;
+
+ success = dyn_enum.seek (slot
+ ACE_ENV_ARG_PARAMETER);
+ ACE_TRY_CHECK;
+
+ if (success == 0)
+ {
+ return -1;
+ }
+
+ member =
+ dyn_enum.current_component (ACE_ENV_SINGLE_ARG_PARAMETER);
+ ACE_TRY_CHECK;
+
+ break;
+ }
+ case CORBA::tk_struct:
+ {
+ TAO_DynStruct_i dyn_struct;
+ dyn_struct.init (this->current_member_.in ()
+ ACE_ENV_ARG_PARAMETER);
+ ACE_TRY_CHECK;
+
+ success = dyn_struct.seek (slot
+ ACE_ENV_ARG_PARAMETER);
+ ACE_TRY_CHECK;
+
+ if (success == 0)
+ {
+ return -1;
+ }
+
+ member = dyn_struct.current_component (ACE_ENV_SINGLE_ARG_PARAMETER);
+ ACE_TRY_CHECK;
+
+ break;
+ }
+ // @@@ (JP) I think enums and structs are the only two cases handled
+ // by Component_Pos, since arrays and sequences are handled by
+ // Component_Array, and unions are handled by Union_Pos.
+ default:
+ return -1;
+ }
+
+ CORBA::Any_var value = member->to_any (ACE_ENV_SINGLE_ARG_PARAMETER);
+ ACE_TRY_CHECK;
+
+ TAO_ETCL_Constraint *comp = pos->component ();
+
+ if (comp == 0)
+ {
+ TAO_ETCL_Literal_Constraint result (value.ptr ());
+ this->queue_.enqueue_head (result);
+ return 0;
+ }
+ else
+ {
+ this->current_member_ = value._retn ();
+ return comp->accept (this);
+ }
+ }
+ ACE_CATCHANY
+ {
+ return -1;
+ }
+ ACE_ENDTRY;
+ ACE_CHECK_RETURN (-1);
+}
+
+int
+TAO_Log_Constraint_Visitor::visit_component_assoc (
+ TAO_ETCL_Component_Assoc *assoc)
+{
+ // @@@ (JP) The spec reserves this type of constraint for NVLists.
+ // Since NVLists don't have type codes or Any operators, there's
+ // no way that TAO can put one into the event's filterable data.
+ // However, from the looks of the ETCL grammar, I believe that a
+ // contruct like 'exist $(foo)' is legal, and is in effect using
+ // the event's filterable data as one big NVList. It is
+ // equivalent to '$.foo'. I've implemented this method on that
+ // basis, while keeping in mind that a clearer interpretation of
+ // the spec may come along someday.
+
+ CORBA::Any any;
+ ACE_CString key (assoc->identifier ()->value (),
+ 0,
+ 0);
+
+ if (this->property_lookup_.find (key, any) != 0
+ || any.impl () == 0)
+ {
+ return -1;
+ }
+
+ TAO_ETCL_Constraint *comp = assoc->component ();
+ CORBA::Any *any_ptr = 0;
+
+ if (comp == 0)
+ {
+ TAO_ETCL_Literal_Constraint result (&any);
+ this->queue_.enqueue_head (result);
+ return 0;
+ }
+
+ ACE_NEW_RETURN (any_ptr,
+ CORBA::Any (any),
+ -1);
+ this->current_member_ = any_ptr;
+ return comp->accept (this);
+}
+
+int
+TAO_Log_Constraint_Visitor::visit_component_array (
+ TAO_ETCL_Component_Array *array
+ )
+{
+ ACE_DECLARE_NEW_CORBA_ENV;
+ ACE_TRY
+ {
+ // If we are here (from visit_component) the Any containing the
+ // component as found in property_lookup_ will be in current_member_.
+ CORBA::TypeCode_var tc = this->current_member_->type ();
+ CORBA::TCKind kind = TAO_DynAnyFactory::unalias (tc.in ()
+ ACE_ENV_ARG_PARAMETER);
+ ACE_TRY_CHECK;
+
+ DynamicAny::DynAny_var member;
+ CORBA::Boolean success = 0;
+ CORBA::ULong slot = (CORBA::ULong) *array->integer ();
+
+ switch (kind)
+ {
+ case CORBA::tk_array:
+ {
+ TAO_DynEnum_i dyn_array;
+ dyn_array.init (this->current_member_.in ()
+ ACE_ENV_ARG_PARAMETER);
+ ACE_TRY_CHECK;
+
+ success = dyn_array.seek (slot
+ ACE_ENV_ARG_PARAMETER);
+ ACE_TRY_CHECK;
+
+ if (success == 0)
+ {
+ return -1;
+ }
+
+ member = dyn_array.current_component (ACE_ENV_SINGLE_ARG_PARAMETER);
+ ACE_TRY_CHECK;
+
+ break;
+ }
+ case CORBA::tk_sequence:
+ {
+ TAO_DynStruct_i dyn_sequence;
+ dyn_sequence.init (this->current_member_.in ()
+ ACE_ENV_ARG_PARAMETER);
+ ACE_TRY_CHECK;
+
+ success = dyn_sequence.seek (slot
+ ACE_ENV_ARG_PARAMETER);
+ ACE_TRY_CHECK;
+
+ if (success == 0)
+ {
+ return -1;
+ }
+
+ member =
+ dyn_sequence.current_component (ACE_ENV_SINGLE_ARG_PARAMETER);
+ ACE_TRY_CHECK;
+
+ break;
+ }
+ // Enums and sequences are the only two cases handled
+ // by Component_Array.
+ default:
+ return -1;
+ }
+
+ CORBA::Any_var value = member->to_any (ACE_ENV_SINGLE_ARG_PARAMETER);
+ ACE_TRY_CHECK;
+
+ TAO_ETCL_Constraint *comp = array->component ();
+
+ if (comp == 0)
+ {
+ TAO_ETCL_Literal_Constraint result (value.ptr ());
+ this->queue_.enqueue_head (result);
+ return 0;
+ }
+ else
+ {
+ this->current_member_ = value._retn ();
+ return comp->accept (this);
+ }
+ }
+ ACE_CATCHANY
+ {
+ return -1;
+ }
+ ACE_ENDTRY;
+ ACE_CHECK_RETURN (-1);
+}
+
+int
+TAO_Log_Constraint_Visitor::visit_special (TAO_ETCL_Special *special)
+{
+ ACE_DECLARE_NEW_CORBA_ENV;
+ ACE_TRY
+ {
+ CORBA::TypeCode_var tc = this->current_member_->type ();
+
+ switch (special->type ())
+ {
+ case TAO_ETCL_LENGTH:
+ {
+ // If the TCKind is not a sequence or an array, the
+ // call to length() will raise an exception, and the
+ // catch block will return -1;
+ CORBA::ULong length = tc->length (ACE_ENV_SINGLE_ARG_PARAMETER);
+ ACE_TRY_CHECK;
+
+ TAO_ETCL_Literal_Constraint lit (length);
+ this->queue_.enqueue_head (lit);
+ return 0;
+ }
+ case TAO_ETCL_DISCRIMINANT:
+ {
+ // If the TCKind is not a union, the
+ // call to init() will raise an exception, and the
+ // catch block will return -1;
+ TAO_DynUnion_i dyn_union;
+ dyn_union.init (this->current_member_.in ()
+ ACE_ENV_ARG_PARAMETER);
+ ACE_TRY_CHECK;
+
+ DynamicAny::DynAny_var disc =
+ dyn_union.get_discriminator (ACE_ENV_SINGLE_ARG_PARAMETER);
+ ACE_TRY_CHECK;
+
+ CORBA::Any_var disc_any = disc->to_any (ACE_ENV_SINGLE_ARG_PARAMETER);
+ ACE_TRY_CHECK;
+
+ TAO_ETCL_Literal_Constraint lit (disc_any.ptr ());
+ this->queue_.enqueue_head (lit);
+ return 0;
+ }
+ case TAO_ETCL_TYPE_ID:
+ {
+ const char *name = tc->name (ACE_ENV_SINGLE_ARG_PARAMETER);
+ ACE_TRY_CHECK;
+
+ TAO_ETCL_Literal_Constraint lit (name);
+ this->queue_.enqueue_head (lit);
+ return 0;
+ }
+ case TAO_ETCL_REPOS_ID:
+ {
+ const char *id = tc->id (ACE_ENV_SINGLE_ARG_PARAMETER);
+ ACE_TRY_CHECK;
+
+ TAO_ETCL_Literal_Constraint lit (id);
+ this->queue_.enqueue_head (lit);
+ return 0;
+ }
+ default:
+ return -1;
+ }
+ }
+ ACE_CATCHANY
+ {
+ return -1;
+ }
+ ACE_ENDTRY;
+ ACE_CHECK_RETURN (-1);
+}
+
+int
+TAO_Log_Constraint_Visitor::visit_component (
+ TAO_ETCL_Component *component
+ )
+{
+ // If this component has no sub-component, only an identifier,
+ // then we just visit the identifier, which puts a literal on
+ // the queue to be handled upon returning from this method call.
+ // If there is a sub-component, we store the literal's value
+ // in our member _var for possible examination at a more
+ // nested level, and visit the sub-component.
+
+ TAO_ETCL_Constraint *nested = component->component ();
+ int result = component->identifier ()->accept (this);
+
+ if (nested == 0 || result != 0)
+ {
+ return result;
+ }
+ else
+ {
+ TAO_ETCL_Literal_Constraint id;
+ this->queue_.dequeue_head (id);
+ CORBA::Any *any_ptr = 0;
+ ACE_NEW_RETURN (any_ptr,
+ CORBA::Any (*(const CORBA::Any *) id),
+ -1);
+ this->current_member_ = any_ptr;
+ return nested->accept (this);
+ }
+}
+
+int
+TAO_Log_Constraint_Visitor::visit_dot (TAO_ETCL_Dot *dot)
+{
+ // If we are here, we know we're headed for a more nested
+ // level, so we just visit it, there's nothing else in this
+ // constraint.
+ return dot->component ()->accept (this);
+}
+
+int
+TAO_Log_Constraint_Visitor::visit_eval (TAO_ETCL_Eval *eval)
+{
+ // Nothing to do but visit the contained component.
+ return eval->component ()->accept (this);
+}
+
+int
+TAO_Log_Constraint_Visitor::visit_default (TAO_ETCL_Default *def)
+{
+ TAO_ETCL_Constraint *comp = def->component ();
+
+ if (comp == 0)
+ {
+ return -1;
+ }
+
+ if (comp->accept (this) != 0)
+ {
+ return -1;
+ }
+
+ ACE_DECLARE_NEW_CORBA_ENV;
+ ACE_TRY
+ {
+ CORBA::TypeCode_var tc = this->current_member_->type ();
+
+ // If the current member is not a union, this call will
+ // throw BadKind and the catch block will return -1.
+ CORBA::Long default_index = tc->default_index (ACE_ENV_SINGLE_ARG_PARAMETER);
+ ACE_TRY_CHECK;
+
+ // No default index.
+ if (default_index == -1)
+ {
+ TAO_ETCL_Literal_Constraint result ((CORBA::Boolean) 0);
+ this->queue_.enqueue_head (result);
+ return 0;
+ }
+
+ // Okay, there's a default index, but is it active?
+
+ TAO_ETCL_Literal_Constraint disc;
+ this->queue_.dequeue_head (disc);
+ TAO_ETCL_Literal_Constraint default_index_value (default_index);
+ return (disc == default_index_value);
+ }
+ ACE_CATCHANY
+ {
+ return -1;
+ }
+ ACE_ENDTRY;
+ ACE_CHECK_RETURN (-1);
+}
+
+int
+TAO_Log_Constraint_Visitor::visit_exist (TAO_ETCL_Exist *exist)
+{
+ TAO_ETCL_Constraint *component = exist->component ();
+
+ if (component->accept (this) == 0)
+ {
+ TAO_ETCL_Literal_Constraint top;
+
+ this->queue_.dequeue_head (top);
+
+ const char *value = (const char *) top;
+ ACE_CString key (value, 0, 0);
+
+ CORBA::Boolean result = (this->property_lookup_.find (key) == 0);
+
+ this->queue_.enqueue_head (TAO_ETCL_Literal_Constraint (result));
+
+ return 0;
+ }
+
+ return -1;
+}
+
+int
+TAO_Log_Constraint_Visitor::visit_unary_expr (
+ TAO_ETCL_Unary_Expr *unary_expr
+ )
+{
+ TAO_ETCL_Constraint *subexpr = unary_expr->subexpr ();
+
+ if (subexpr->accept (this) == 0)
+ {
+ TAO_ETCL_Literal_Constraint subexpr_result;
+ CORBA::Boolean result = 0;
+ int op_type = unary_expr->type ();
+
+ switch (op_type)
+ {
+ case TAO_ETCL_NOT:
+ this->queue_.dequeue_head (subexpr_result);
+ result = ! (CORBA::Boolean) subexpr_result;
+ this->queue_.enqueue_head (TAO_ETCL_Literal_Constraint (result));
+ return 0;
+ case TAO_ETCL_MINUS:
+ // The leading '-' was parsed separately, so we have to pull
+ // the literal constraint off the queue, apply the class' own
+ // unary minus operator, and put it back.
+ this->queue_.dequeue_head (subexpr_result);
+ this->queue_.enqueue_head (-subexpr_result);
+ return 0;
+ case TAO_ETCL_PLUS:
+ // Leave the literal constraint on the queue. The leading
+ // '+' was just syntactic sugar - no action is necessary.
+ return 0;
+ default:
+ // The parser should never construct a TAO_ETCL_Unary_Constraint
+ // behind any operators except the above three.
+ return -1;
+ }
+ }
+
+ return -1;
+}
+
+int
+TAO_Log_Constraint_Visitor::visit_binary_expr (
+ TAO_ETCL_Binary_Expr *binary_expr
+ )
+{
+
+ // Evaluate the constraint
+ int bin_op_type = binary_expr->type ();
+
+ switch (bin_op_type)
+ {
+ case TAO_ETCL_OR:
+ return this->visit_or (binary_expr);
+ case TAO_ETCL_AND:
+ return this->visit_and (binary_expr);
+ case TAO_ETCL_LT:
+ case TAO_ETCL_LE:
+ case TAO_ETCL_GT:
+ case TAO_ETCL_GE:
+ case TAO_ETCL_EQ:
+ case TAO_ETCL_NE:
+ case TAO_ETCL_PLUS:
+ case TAO_ETCL_MINUS:
+ case TAO_ETCL_MULT:
+ case TAO_ETCL_DIV:
+ return this->visit_binary_op (binary_expr,
+ bin_op_type);
+ case TAO_ETCL_TWIDDLE:
+ return this->visit_twiddle (binary_expr);
+ case TAO_ETCL_IN:
+ return this->visit_in (binary_expr);
+ default:
+ return -1;
+ }
+}
+
+int
+TAO_Log_Constraint_Visitor::visit_or (
+ TAO_ETCL_Binary_Expr *binary
+ )
+{
+ int return_value = -1;
+ CORBA::Boolean result = 0;
+ TAO_ETCL_Constraint *lhs = binary->lhs ();
+
+ if (lhs->accept (this) == 0)
+ {
+ TAO_ETCL_Literal_Constraint lhs_result;
+ this->queue_.dequeue_head (lhs_result);
+ result = (CORBA::Boolean) lhs_result;
+
+ // Short-circuiting OR.
+ if (result == 0)
+ {
+ TAO_ETCL_Constraint *rhs = binary->rhs ();
+
+ if (rhs->accept (this) == 0)
+ {
+ TAO_ETCL_Literal_Constraint rhs_result;
+ this->queue_.dequeue_head (rhs_result);
+ result = (CORBA::Boolean) rhs_result;
+ return_value = 0;
+ }
+ }
+ else
+ {
+ return_value = 0;
+ }
+ }
+
+ if (return_value == 0)
+ {
+ this->queue_.enqueue_head (TAO_ETCL_Literal_Constraint (result));
+ }
+
+ return return_value;
+}
+
+int
+TAO_Log_Constraint_Visitor::visit_and (
+ TAO_ETCL_Binary_Expr *binary
+ )
+{
+ int return_value = -1;
+ CORBA::Boolean result = 0;
+ TAO_ETCL_Constraint *lhs = binary->lhs ();
+
+ if (lhs->accept (this) == 0)
+ {
+ TAO_ETCL_Literal_Constraint lhs_result;
+ this->queue_.dequeue_head (lhs_result);
+ result = (CORBA::Boolean) lhs_result;
+
+ // Short-circuiting AND.
+ if (result == 1)
+ {
+ TAO_ETCL_Constraint *rhs = binary->rhs ();
+
+ if (rhs->accept (this) == 0)
+ {
+ TAO_ETCL_Literal_Constraint rhs_result;
+ this->queue_.dequeue_head (rhs_result);
+ result = (CORBA::Boolean) rhs_result;
+ return_value = 0;
+ }
+ }
+ else
+ {
+ return_value = 0;
+ }
+ }
+
+ if (return_value == 0)
+ {
+ this->queue_.enqueue_head (TAO_ETCL_Literal_Constraint (result));
+ }
+
+ return return_value;
+}
+
+int
+TAO_Log_Constraint_Visitor::visit_binary_op (
+ TAO_ETCL_Binary_Expr *binary,
+ int op_type
+ )
+{
+ int return_value = -1;
+ TAO_ETCL_Constraint *lhs = binary->lhs ();
+ CORBA::Boolean result = 0;
+
+ // Evaluate the constraint
+ // Perform an operation on the results of evaluating the left and
+ // right branches of this subtree.
+ if (lhs->accept (this) == 0)
+ {
+
+ // Evaluate the constraint
+ TAO_ETCL_Literal_Constraint left_operand;
+ this->queue_.dequeue_head (left_operand);
+ TAO_ETCL_Constraint *rhs = binary->rhs ();
+
+ if (rhs->accept (this) == 0)
+ {
+ TAO_ETCL_Literal_Constraint right_operand;
+ this->queue_.dequeue_head (right_operand);
+ return_value = 0;
+
+ switch (op_type)
+ {
+ case TAO_ETCL_LT:
+ result = left_operand < right_operand;
+ this->queue_.enqueue_head (TAO_ETCL_Literal_Constraint (result));
+ break;
+ case TAO_ETCL_LE:
+ result = left_operand <= right_operand;
+ this->queue_.enqueue_head (TAO_ETCL_Literal_Constraint (result));
+ break;
+ case TAO_ETCL_GT:
+ result = left_operand > right_operand;
+ this->queue_.enqueue_head (TAO_ETCL_Literal_Constraint (result));
+ break;
+ case TAO_ETCL_GE:
+ result = left_operand >= right_operand;
+ this->queue_.enqueue_head (TAO_ETCL_Literal_Constraint (result));
+ break;
+ case TAO_ETCL_EQ:
+ result = left_operand == right_operand;
+ this->queue_.enqueue_head (TAO_ETCL_Literal_Constraint (result));
+ break;
+ case TAO_ETCL_NE:
+ result = left_operand != right_operand;
+ this->queue_.enqueue_head (TAO_ETCL_Literal_Constraint (result));
+ break;
+ case TAO_ETCL_PLUS:
+ this->queue_.enqueue_head (left_operand + right_operand);
+ break;
+ case TAO_ETCL_MINUS:
+ this->queue_.enqueue_head (left_operand - right_operand);
+ break;
+ case TAO_ETCL_MULT:
+ this->queue_.enqueue_head (left_operand * right_operand);
+ break;
+ case TAO_ETCL_DIV:
+ this->queue_.enqueue_head (left_operand / right_operand);
+ break;
+ default:
+ return_value = -1;
+ }
+ }
+ }
+
+ return return_value;
+}
+
+int
+TAO_Log_Constraint_Visitor::visit_twiddle (
+ TAO_ETCL_Binary_Expr *binary
+ )
+{
+ int return_value = -1;
+ TAO_ETCL_Constraint *lhs = binary->lhs ();
+
+ // Determine if the left operand is a substring of the right.
+ if (lhs->accept (this) == 0)
+ {
+ TAO_ETCL_Literal_Constraint left;
+ this->queue_.dequeue_head (left);
+ TAO_ETCL_Constraint *rhs = binary->rhs ();
+
+ if (rhs->accept (this) == 0)
+ {
+ TAO_ETCL_Literal_Constraint right;
+ this->queue_.dequeue_head (right);
+ CORBA::Boolean result =
+ (ACE_OS::strstr ((const char *) left,
+ (const char *) right) != 0);
+ this->queue_.enqueue_head (TAO_ETCL_Literal_Constraint (result));
+ return_value = 0;
+ }
+ }
+
+ return return_value;
+}
+
+int
+TAO_Log_Constraint_Visitor::visit_in (
+ TAO_ETCL_Binary_Expr *binary
+ )
+{
+ int return_value = -1;
+ TAO_ETCL_Constraint *lhs = binary->lhs ();
+
+ // Determine if the left operand is contained in the right.
+
+ if (lhs->accept (this) == 0)
+ {
+ TAO_ETCL_Literal_Constraint left;
+ this->queue_.dequeue_head (left);
+
+ TAO_ETCL_Constraint *rhs = binary->rhs ();
+
+ if (rhs->accept (this) == 0)
+ {
+ TAO_ETCL_Literal_Constraint bag;
+ this->queue_.dequeue_head (bag);
+
+ if (bag.expr_type () == TAO_ETCL_COMPONENT)
+ {
+ const CORBA::Any *component = (const CORBA::Any *) bag;
+ CORBA::TCKind kind = CORBA::tk_null;
+
+ ACE_DECLARE_NEW_CORBA_ENV;
+ ACE_TRY
+ {
+ CORBA::TypeCode_var tc = component->type ();
+ kind = TAO_DynAnyFactory::unalias (tc.in ()
+ ACE_ENV_ARG_PARAMETER);
+ ACE_TRY_CHECK;
+ }
+ ACE_CATCHANY
+ {
+ return return_value;
+ }
+ ACE_ENDTRY;
+ ACE_CHECK_RETURN (return_value);
+
+ CORBA::Boolean result = 0;
+
+ switch (kind)
+ {
+ case CORBA::tk_sequence:
+ result = this->sequence_does_contain (component,
+ left);
+ break;
+ case CORBA::tk_array:
+ result = this->array_does_contain (component,
+ left);
+ break;
+ case CORBA::tk_struct:
+ result = this->struct_does_contain (component,
+ left);
+ break;
+ case CORBA::tk_union:
+ result = this->union_does_contain (component,
+ left);
+ break;
+ case CORBA::tk_any:
+ result = this->any_does_contain (component,
+ left);
+ break;
+ default:
+ return return_value;
+ }
+
+ this->queue_.enqueue_head (TAO_ETCL_Literal_Constraint (result));
+ return_value = 0;
+ }
+ }
+ }
+
+ return return_value;
+}
+
+int
+TAO_Log_Constraint_Visitor::visit_preference (
+ TAO_ETCL_Preference *
+ )
+{
+ // According to OMG 00-06-20 section 2.4.1, the Notification Service
+ // does not use the preference operators. The method must be here
+ // because it is called by the ETCL node, which may be used by other
+ // CORBA services that do use the preference operators.
+ return -1;
+}
+
+CORBA::Boolean
+TAO_Log_Constraint_Visitor::sequence_does_contain (
+ const CORBA::Any *any,
+ TAO_ETCL_Literal_Constraint &item
+ )
+{
+ ACE_DECLARE_NEW_CORBA_ENV;
+ ACE_TRY
+ {
+ CORBA::TypeCode_var type = any->type ();
+ CORBA::TCKind kind = TAO_DynAnyFactory::unalias (type.in ()
+ ACE_ENV_ARG_PARAMETER);
+ ACE_TRY_CHECK;
+
+ // The literal and the array elements must be
+ // of the same simple type.
+ CORBA::Boolean match = this->simple_type_match (item.expr_type (),
+ kind);
+
+ if (match == 0)
+ {
+ return 0;
+ }
+
+ TAO_DynSequence_i dyn_seq;
+ dyn_seq.init (*any
+ ACE_ENV_ARG_PARAMETER);
+ ACE_TRY_CHECK;
+
+ DynamicAny::AnySeq_var any_seq =
+ dyn_seq.get_elements (ACE_ENV_SINGLE_ARG_PARAMETER);
+ ACE_TRY_CHECK;
+
+ CORBA::ULong length = any_seq->length ();
+
+ for (CORBA::ULong i = 0; i < length; ++i)
+ {
+ TAO_ETCL_Literal_Constraint element (&any_seq[i]);
+
+ if (item == element)
+ {
+ return 1;
+ }
+ }
+ }
+ ACE_CATCHANY
+ {
+ return 0;
+ }
+ ACE_ENDTRY;
+ ACE_CHECK_RETURN (0);
+
+ return 0;
+}
+
+CORBA::Boolean
+TAO_Log_Constraint_Visitor::array_does_contain (
+ const CORBA::Any *any,
+ TAO_ETCL_Literal_Constraint &item
+ )
+{
+ ACE_DECLARE_NEW_CORBA_ENV;
+ ACE_TRY
+ {
+ CORBA::TypeCode_var type = any->type ();
+ CORBA::TCKind kind = TAO_DynAnyFactory::unalias (type.in ()
+ ACE_ENV_ARG_PARAMETER);
+ ACE_TRY_CHECK;
+
+ // The literal and the array elements must be
+ // of the same simple type.
+ CORBA::Boolean match = this->simple_type_match (item.expr_type (),
+ kind);
+
+ if (match == 0)
+ {
+ return 0;
+ }
+
+ TAO_DynArray_i dyn_array;
+ dyn_array.init (*any
+ ACE_ENV_ARG_PARAMETER);
+ ACE_TRY_CHECK;
+
+ DynamicAny::AnySeq_var any_seq =
+ dyn_array.get_elements (ACE_ENV_SINGLE_ARG_PARAMETER);
+ ACE_TRY_CHECK;
+
+ CORBA::ULong length = any_seq->length ();
+
+ for (CORBA::ULong i = 0; i < length; ++i)
+ {
+ TAO_ETCL_Literal_Constraint element (&any_seq[i]);
+
+ if (item == element)
+ {
+ return 1;
+ }
+ }
+ }
+ ACE_CATCHANY
+ {
+ return 0;
+ }
+ ACE_ENDTRY;
+ ACE_CHECK_RETURN (0);
+
+ return 0;
+}
+
+CORBA::Boolean
+TAO_Log_Constraint_Visitor::struct_does_contain (
+ const CORBA::Any *any,
+ TAO_ETCL_Literal_Constraint &item
+ )
+{
+ ACE_DECLARE_NEW_CORBA_ENV;
+ ACE_TRY
+ {
+ TAO_DynStruct_i dyn_struct;
+ dyn_struct.init (*any
+ ACE_ENV_ARG_PARAMETER);
+ ACE_TRY_CHECK;
+
+ DynamicAny::NameValuePairSeq_var members =
+ dyn_struct.get_members (ACE_ENV_SINGLE_ARG_PARAMETER);
+ ACE_TRY_CHECK;
+
+ CORBA::ULong length = members->length ();
+ CORBA::TypeCode_var tc;
+ CORBA::TCKind kind;
+
+ for (CORBA::ULong i = 0; i < length; ++i)
+ {
+ tc = members[i].value.type ();
+ kind = TAO_DynAnyFactory::unalias (tc.in ()
+ ACE_ENV_ARG_PARAMETER);
+ ACE_TRY_CHECK;
+
+ // The literal and the struct member must be
+ // of the same simple type.
+ CORBA::Boolean match = this->simple_type_match (item.expr_type (),
+ kind);
+
+ if (match == 0)
+ {
+ continue;
+ }
+
+ TAO_ETCL_Literal_Constraint element (&members[i].value);
+
+ if (item == element)
+ {
+ return 1;
+ }
+ }
+ }
+ ACE_CATCHANY
+ {
+ return 0;
+ }
+ ACE_ENDTRY;
+ ACE_CHECK_RETURN (0);
+
+ return 0;
+}
+
+CORBA::Boolean
+TAO_Log_Constraint_Visitor::union_does_contain (
+ const CORBA::Any *any,
+ TAO_ETCL_Literal_Constraint &item
+ )
+{
+ ACE_DECLARE_NEW_CORBA_ENV;
+ ACE_TRY
+ {
+ TAO_DynUnion_i dyn_union;
+ dyn_union.init (*any
+ ACE_ENV_ARG_PARAMETER);
+ ACE_TRY_CHECK;
+
+ DynamicAny::DynAny_var cc =
+ dyn_union.current_component (ACE_ENV_SINGLE_ARG_PARAMETER);
+ ACE_TRY_CHECK;
+
+ CORBA::Any_var member = cc->to_any (ACE_ENV_SINGLE_ARG_PARAMETER);
+ ACE_TRY_CHECK;
+
+ CORBA::TypeCode_var tc = member->type ();
+ CORBA::TCKind kind = TAO_DynAnyFactory::unalias (tc.in ()
+ ACE_ENV_ARG_PARAMETER);
+ ACE_TRY_CHECK;
+
+ // The literal and the union member must be
+ // of the same simple type.
+ CORBA::Boolean match = this->simple_type_match (item.expr_type (),
+ kind);
+
+ if (match == 0)
+ {
+ return 0;
+ }
+
+ TAO_ETCL_Literal_Constraint element (&member.inout ());
+
+ return (item == element);
+ }
+ ACE_CATCHANY
+ {
+ return 0;
+ }
+ ACE_ENDTRY;
+ ACE_CHECK_RETURN (0);
+}
+
+CORBA::Boolean
+TAO_Log_Constraint_Visitor::any_does_contain (
+ const CORBA::Any *any,
+ TAO_ETCL_Literal_Constraint &item
+ )
+{
+ const CORBA::Any *result = 0;
+
+ *any >>= result;
+
+ TAO_ETCL_Literal_Constraint element (const_cast<CORBA::Any *> (result));
+
+ return (item == element);
+}
+
+CORBA::Boolean
+TAO_Log_Constraint_Visitor::simple_type_match (int expr_type,
+ CORBA::TCKind tc_kind)
+{
+ switch (expr_type)
+ {
+ case TAO_ETCL_STRING:
+ if (tc_kind != CORBA::tk_string)
+ {
+ return 0;
+ }
+ case TAO_ETCL_DOUBLE:
+ if (tc_kind != CORBA::tk_double
+ && tc_kind != CORBA::tk_float)
+ {
+ return 0;
+ }
+ case TAO_ETCL_INTEGER:
+ case TAO_ETCL_SIGNED:
+ if (tc_kind != CORBA::tk_short
+ && tc_kind != CORBA::tk_long
+ && tc_kind != CORBA::tk_longlong)
+ {
+ return 0;
+ }
+ case TAO_ETCL_UNSIGNED:
+ if (tc_kind != CORBA::tk_ushort
+ && tc_kind != CORBA::tk_ulong
+ && tc_kind != CORBA::tk_ulonglong)
+ {
+ return 0;
+ }
+ case TAO_ETCL_BOOLEAN:
+ if (tc_kind != CORBA::tk_boolean)
+ {
+ return 0;
+ }
+ default:
+ return 0;
+ }
+}
+
+const size_t TAO_Log_Constraint_Visitor::property_lookup_size_ = 31;
+
+TAO_END_VERSIONED_NAMESPACE_DECL
diff --git a/TAO/orbsvcs/orbsvcs/Log/Log_Constraint_Visitors.h b/TAO/orbsvcs/orbsvcs/Log/Log_Constraint_Visitors.h
new file mode 100644
index 00000000000..f9067132c3b
--- /dev/null
+++ b/TAO/orbsvcs/orbsvcs/Log/Log_Constraint_Visitors.h
@@ -0,0 +1,130 @@
+// -*- C++ -*-
+
+//=============================================================================
+/**
+ * @file Log_Constraint_Visitors.h
+ *
+ * $Id$
+ *
+ * @author Pradeep Gore <pradeep@cs.wustl.edu>
+ * @author Jeff Parsons <parsons@cs.wustl.edu>
+ * @author D A Hanvey <d.hanvey@qub.ac.uk>
+ */
+//=============================================================================
+
+
+#ifndef TAO_LOG_CONSTRAINT_VISITORS_H
+#define TAO_LOG_CONSTRAINT_VISITORS_H
+
+#include /**/ "ace/pre.h"
+
+#include "ace/Hash_Map_Manager.h"
+#include "ace/Unbounded_Queue.h"
+
+#if !defined (ACE_LACKS_PRAGMA_ONCE)
+# pragma once
+#endif /* ACE_LACKS_PRAGMA_ONCE */
+
+#include "orbsvcs/ETCL/ETCL_Constraint_Visitor.h"
+#include "orbsvcs/DsLogAdminC.h"
+#include "ace/Null_Mutex.h"
+
+#include "orbsvcs/Log/log_serv_export.h"
+
+TAO_BEGIN_VERSIONED_NAMESPACE_DECL
+
+class TAO_ETCL_Constraint;
+class TAO_ETCL_Literal_Constraint;
+class TAO_Log_Property_Constraint;
+
+/**
+ * @class TAO_Log_Constraint_Visitor
+ *
+ * @brief "ETCL" Visitor for the Log queries.
+ */
+class TAO_Log_Serv_Export TAO_Log_Constraint_Visitor :
+ public TAO_ETCL_Constraint_Visitor
+{
+public:
+
+ /// Constructor.
+ TAO_Log_Constraint_Visitor (const DsLogAdmin::LogRecord &rec);
+
+ /**
+ * Returns 1 if the offer satisfies the constraint
+ * represented by the the expression tree rooted at <root>, 0 if it
+ * doesn't. If an error occurs during process, the traversal
+ * automatically fails.
+ */
+ CORBA::Boolean evaluate_constraint (TAO_ETCL_Constraint *root);
+
+ // = The overridden methods.
+ 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 *);
+
+private:
+ // = Sub-methods for visit_binary_expr().
+ 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);
+
+ // = These use dynamic anys look inside the ETCL component.
+ 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);
+
+ /// Utility function to compare a TAO_ETCL_Literal_Constraint type
+ /// and a type code.
+ CORBA::Boolean simple_type_match (int expr_type,
+ CORBA::TCKind tc_kind);
+
+private:
+ /// Size of property_lookup_ hash map.
+ /// TODO: define inline once VC6 support is deprecated.
+ static const size_t property_lookup_size_;
+
+ typedef ACE_Hash_Map_Manager <ACE_CString,
+ CORBA::Any,
+ ACE_Null_Mutex> HASH_MAP;
+
+ typedef HASH_MAP::ENTRY HASH_ENTRY;
+
+ /// Used to lookup property name and values.
+ HASH_MAP property_lookup_;
+
+ /// The result of a non_boolean operation.
+ ACE_Unbounded_Queue<TAO_ETCL_Literal_Constraint> queue_;
+
+ /// Holder for a value found in property_lookup_ or for a
+ /// nested type within that value.
+ CORBA::Any_var current_member_;
+};
+
+TAO_END_VERSIONED_NAMESPACE_DECL
+
+#include /**/ "ace/post.h"
+#endif /* TAO_LOG_CONSTRAINT_VISITORS_H */
diff --git a/TAO/orbsvcs/orbsvcs/Log/Log_Flush_Handler.cpp b/TAO/orbsvcs/orbsvcs/Log/Log_Flush_Handler.cpp
new file mode 100644
index 00000000000..122d35c486c
--- /dev/null
+++ b/TAO/orbsvcs/orbsvcs/Log/Log_Flush_Handler.cpp
@@ -0,0 +1,59 @@
+#include "orbsvcs/Log/Log_Flush_Handler.h"
+#include "orbsvcs/Log/Log_i.h"
+
+ACE_RCSID (Log,
+ Log_Flush_Handler,
+ "$Id$")
+
+TAO_BEGIN_VERSIONED_NAMESPACE_DECL
+
+TAO_Log_Flush_Handler::TAO_Log_Flush_Handler (ACE_Reactor* reactor,
+ TAO_Log_i* log,
+ const ACE_Time_Value& interval)
+ : timer_id_(-1),
+ reactor_(reactor),
+ log_(log),
+ interval_(interval)
+{
+}
+
+TAO_Log_Flush_Handler::~TAO_Log_Flush_Handler ()
+{
+ this->cancel ();
+}
+
+void
+TAO_Log_Flush_Handler::schedule ()
+{
+ this->cancel ();
+ this->timer_id_ =
+ this->reactor_->schedule_timer (this, 0, this->interval_, this->interval_);
+}
+
+void
+TAO_Log_Flush_Handler::cancel ()
+{
+ if (this->timer_id_ != -1)
+ {
+ this->reactor_->cancel_timer (timer_id_);
+ this->timer_id_ = -1;
+ }
+}
+
+int
+TAO_Log_Flush_Handler::handle_timeout (const ACE_Time_Value&, const void *)
+{
+ ACE_TRY_NEW_ENV
+ {
+ log_->flush (ACE_ENV_SINGLE_ARG_PARAMETER);
+ ACE_TRY_CHECK;
+ }
+ ACE_CATCHANY
+ {
+ }
+ ACE_ENDTRY;
+
+ return 0;
+}
+
+TAO_END_VERSIONED_NAMESPACE_DECL
diff --git a/TAO/orbsvcs/orbsvcs/Log/Log_Flush_Handler.h b/TAO/orbsvcs/orbsvcs/Log/Log_Flush_Handler.h
new file mode 100644
index 00000000000..f61d40ad999
--- /dev/null
+++ b/TAO/orbsvcs/orbsvcs/Log/Log_Flush_Handler.h
@@ -0,0 +1,66 @@
+// -*- C++ -*-
+
+//=============================================================================
+/**
+ * @file Log_Flush_Handler.h
+ *
+ * $Id$
+ *
+ */
+//=============================================================================
+
+#ifndef TAO_TLS_FLUSH_HANDLER_H
+#define TAO_TLS_FLUSH_HANDLER_H
+
+#include "orbsvcs/Log/log_serv_export.h"
+
+#if !defined (ACE_LACKS_PRAGMA_ONCE)
+# pragma once
+#endif /* ACE_LACKS_PRAGMA_ONCE */
+
+#include "tao/Versioned_Namespace.h"
+
+#include "ace/Event_Handler.h"
+#include "ace/Time_Value.h"
+
+ACE_BEGIN_VERSIONED_NAMESPACE_DECL
+class ACE_Reactor;
+ACE_END_VERSIONED_NAMESPACE_DECL
+
+TAO_BEGIN_VERSIONED_NAMESPACE_DECL
+
+class TAO_Log_i;
+
+/// @class TAO_Log_Flush_Handler
+/// @brief Periodically flush log records to persistent store
+///
+class TAO_Log_Serv_Export TAO_Log_Flush_Handler
+ : public ACE_Event_Handler
+{
+public:
+ /// Constructor.
+ TAO_Log_Flush_Handler (ACE_Reactor* reactor,
+ TAO_Log_i* log,
+ const ACE_Time_Value& interval);
+
+ /// Destructor.
+ ~TAO_Log_Flush_Handler ();
+
+ /// Schedule Timer.
+ void schedule ();
+
+ /// Cancel Timer.
+ void cancel ();
+
+ virtual int handle_timeout (const ACE_Time_Value &tv, const void *arg);
+
+private:
+ long timer_id_;
+ ACE_Reactor* reactor_;
+ TAO_Log_i* log_;
+ ACE_Time_Value interval_;
+};
+
+TAO_END_VERSIONED_NAMESPACE_DECL
+
+#endif /* TAO_LOG_FLUSH_HANDLER_H */
diff --git a/TAO/orbsvcs/orbsvcs/Log/Log_Persistence_Strategy.h b/TAO/orbsvcs/orbsvcs/Log/Log_Persistence_Strategy.h
new file mode 100644
index 00000000000..5e8832c5dee
--- /dev/null
+++ b/TAO/orbsvcs/orbsvcs/Log/Log_Persistence_Strategy.h
@@ -0,0 +1,61 @@
+// -*- C++ -*-
+
+//=============================================================================
+/**
+ * @file Log_Persistence_Strategy.h
+ *
+ * $Id$
+ *
+ * @author Matthew Braun <mjb2@cs.wustl.edu>
+ * @author Pradeep Gore <pradeep@cs.wustl.edu>
+ * @author David A. Hanvey <d.hanvey@qub.ac.uk>
+ */
+//=============================================================================
+
+#ifndef TAO_TLS_PERSISTENCE_STRATEGY_H
+#define TAO_TLS_PERSISTENCE_STRATEGY_H
+
+#include /**/ "ace/pre.h"
+
+#include "orbsvcs/Log/log_serv_export.h"
+
+#if !defined (ACE_LACKS_PRAGMA_ONCE)
+#pragma once
+#endif /* ACE_LACKS_PRAGMA_ONCE */
+
+#include "tao/Versioned_Namespace.h"
+#include "ace/Service_Object.h"
+
+TAO_BEGIN_VERSIONED_NAMESPACE_DECL
+
+class TAO_LogStore;
+class TAO_LogMgr_i;
+
+namespace CORBA
+{
+ class ORB;
+ typedef ORB* ORB_ptr;
+}
+
+/**
+ * @class TAO_Log_Persistence_Strategy
+ *
+ * @brief Base Strategy for Log / Log Record Storage
+ *
+ */
+class TAO_Log_Serv_Export TAO_Log_Persistence_Strategy
+ : public ACE_Service_Object
+{
+public:
+ /// @brief Log Store Factory
+ virtual TAO_LogStore*
+ create_log_store (TAO_LogMgr_i* logmgr_i) = 0;
+
+private:
+};
+
+TAO_END_VERSIONED_NAMESPACE_DECL
+
+#include /**/ "ace/post.h"
+
+#endif /* TAO_TLS_PERSISTENCE_STRATEGY_H */
diff --git a/TAO/orbsvcs/orbsvcs/Log/Log_i.cpp b/TAO/orbsvcs/orbsvcs/Log/Log_i.cpp
new file mode 100644
index 00000000000..263ef5d7ebc
--- /dev/null
+++ b/TAO/orbsvcs/orbsvcs/Log/Log_i.cpp
@@ -0,0 +1,1859 @@
+#include "orbsvcs/Log/Log_i.h"
+#include "orbsvcs/Log/LogMgr_i.h"
+#include "orbsvcs/Time_Utilities.h"
+
+#include "tao/debug.h"
+#include "tao/ORB_Core.h"
+#include "ace/OS_NS_stdio.h"
+#include "ace/OS_NS_sys_time.h"
+
+ACE_RCSID (Log,
+ Log_i,
+ "$Id$")
+
+
+TAO_BEGIN_VERSIONED_NAMESPACE_DECL
+
+// Log Compaction Interval
+const ACE_Time_Value
+TAO_Log_i::log_compaction_interval_ = ACE_Time_Value(60);
+
+// Log Flush Interval
+const ACE_Time_Value
+TAO_Log_i::log_flush_interval_ = ACE_Time_Value(5 * 60);
+
+
+TAO_Log_i::TAO_Log_i (CORBA::ORB_ptr orb,
+ TAO_LogMgr_i &logmgr_i,
+ DsLogAdmin::LogMgr_ptr factory,
+ DsLogAdmin::LogId logid,
+ TAO_LogNotification *log_notifier)
+ : logmgr_i_(logmgr_i),
+ factory_ (DsLogAdmin::LogMgr::_duplicate (factory)),
+ logid_ (logid),
+ op_state_ (DsLogAdmin::disabled),
+ reactor_ (orb->orb_core()->reactor()),
+ notifier_ (log_notifier),
+ log_compaction_handler_ (reactor_, this, log_compaction_interval_),
+ log_flush_handler_ (reactor_, this, log_flush_interval_)
+{
+ // TODO: get log parameters from (persistent?) store.
+ avail_status_.off_duty = 0;
+ avail_status_.log_full = 0;
+}
+
+void
+TAO_Log_i::init (ACE_ENV_SINGLE_ARG_DECL)
+{
+#if 0
+ // @@ Calling create_log_reference () here leads to an infinate loop.
+ // When this is fixed, this can be enabled.
+ this->log_ =
+ logmgr_i_.create_log_reference (this->logid_ ACE_ENV_ARG_PARAMETER);
+ ACE_CHECK;
+#endif
+
+ this->recordstore_ =
+ logmgr_i_.get_log_record_store (this->logid_ ACE_ENV_ARG_PARAMETER);
+ ACE_CHECK;
+
+ if (this->recordstore_->open () ==-1)
+ ACE_THROW (CORBA::UNKNOWN ());
+
+ // fetch the capacity alarm thresholds from the log record store
+ DsLogAdmin::CapacityAlarmThresholdList_var thresholds =
+ this->recordstore_->get_capacity_alarm_thresholds (ACE_ENV_SINGLE_ARG_PARAMETER);
+ ACE_CHECK;
+
+ // initialize the internal representation
+ this->thresholds_ = thresholds.in ();
+ this->reset_capacity_alarm_threshold (ACE_ENV_SINGLE_ARG_PARAMETER);
+ ACE_CHECK;
+
+
+ // fetch the log QoS from the log record store
+ DsLogAdmin::QoSList_var qos =
+ this->recordstore_->get_log_qos (ACE_ENV_SINGLE_ARG_PARAMETER);
+ ACE_CHECK;
+
+ // initialize the internal representation.
+ this->reset_log_qos (qos.in ());
+
+
+ // fetch the week mask from the log record store
+ DsLogAdmin::WeekMask_var week_mask =
+ this->recordstore_->get_week_mask (ACE_ENV_SINGLE_ARG_PARAMETER);
+ ACE_CHECK;
+
+ // initialize the internal representation
+ this->reset_week_mask (week_mask.in () ACE_ENV_ARG_PARAMETER);
+ ACE_CHECK;
+
+
+ // fetch the maximum record life from the log record store
+ CORBA::ULong max_record_life =
+ this->recordstore_->get_max_record_life (ACE_ENV_SINGLE_ARG_PARAMETER);
+ ACE_CHECK;
+
+ // if set, activate the compaction handler
+ if (max_record_life != 0)
+ {
+ this->log_compaction_handler_.schedule ();
+ }
+
+ this->op_state_ = DsLogAdmin::enabled;
+}
+
+TAO_Log_i::~TAO_Log_i (void)
+{
+}
+
+DsLogAdmin::LogMgr_ptr
+TAO_Log_i::my_factory (ACE_ENV_SINGLE_ARG_DECL_NOT_USED)
+ ACE_THROW_SPEC ((CORBA::SystemException))
+{
+ return DsLogAdmin::LogMgr::_duplicate (this->factory_.in ());
+}
+
+DsLogAdmin::LogId
+TAO_Log_i::id (ACE_ENV_SINGLE_ARG_DECL_NOT_USED)
+ ACE_THROW_SPEC ((CORBA::SystemException))
+{
+ return logid_;
+}
+
+DsLogAdmin::QoSList*
+TAO_Log_i::get_log_qos (ACE_ENV_SINGLE_ARG_DECL)
+ ACE_THROW_SPEC ((CORBA::SystemException))
+{
+ ACE_READ_GUARD_THROW_EX (ACE_SYNCH_RW_MUTEX,
+ guard,
+ this->recordstore_->lock (),
+ CORBA::INTERNAL ());
+ ACE_CHECK_RETURN (0);
+
+ // @@ The current revision of the specification (formal/03-07-01)
+ // states that get_log_qos() returns a list of the QoS properties
+ // supported by the log, not the current value. However, because
+ // that is inconsistent with both the Log Service's other get
+ // methods and the Notification Service's QoS get_qos methods, I
+ // have submitted a defect report to the OMG for clarification.
+ // --jtc
+
+ return this->recordstore_->get_log_qos (ACE_ENV_SINGLE_ARG_PARAMETER);
+}
+
+void
+TAO_Log_i::set_log_qos (const DsLogAdmin::QoSList &qos
+ ACE_ENV_ARG_DECL)
+ ACE_THROW_SPEC ((CORBA::SystemException,
+ DsLogAdmin::UnsupportedQoS))
+{
+ ACE_WRITE_GUARD_THROW_EX (ACE_SYNCH_RW_MUTEX,
+ guard,
+ this->recordstore_->lock (),
+ CORBA::INTERNAL ());
+ ACE_CHECK;
+
+ // @@ The current revision of the specification (formal/03-07-01)
+ // does not clearly define the semantics to follow when the QoSList
+ // contains mutually exclusive, unsupported, or unknown properties.
+ // I have submitted a defect report to the OMG for clarification.
+ //
+ // In the mean time, the last known/supported property found in the
+ // QoSList takes presidence. If any unknown/unsupported properties
+ // were found, an UnsupportedQoS exception is thrown.
+ // --jtc
+
+ validate_log_qos (qos);
+
+ DsLogAdmin::QoSList_var old_qos =
+ this->recordstore_->get_log_qos (ACE_ENV_SINGLE_ARG_PARAMETER);
+ ACE_CHECK;
+
+ // @@ The current revision of the specification (formal/03-07-01) is
+ // unclear whether an AttributeValueChange event should be sent if a
+ // log attribute was changed (to a new value), or whether the events
+ // should be sent unconditionally. I have submitted a defect report
+ // to the OMG for clarification.
+ //
+ // In the mean time, we're interepreting it to mean that events are
+ // only sent when the value has changed.
+ if (qos == old_qos.in ())
+ return;
+
+ this->recordstore_->set_log_qos (qos ACE_ENV_ARG_PARAMETER);
+ ACE_CHECK;
+
+ reset_log_qos (qos);
+
+ if (notifier_)
+ {
+ // @@ Calling create_log_reference () in the ctor or in ::init()
+ // leads to an infinate loop. This should be removed when that
+ // is fixed.
+ if (CORBA::is_nil (this->log_.in ()))
+ {
+ this->log_ = logmgr_i_.create_log_reference (this->logid_
+ ACE_ENV_ARG_PARAMETER);
+ ACE_CHECK;
+ }
+
+ notifier_->quality_of_service_value_change (this->log_.in (),
+ this->logid_,
+ old_qos.in (),
+ qos
+ ACE_ENV_ARG_PARAMETER);
+ ACE_CHECK;
+ }
+}
+
+CORBA::ULong
+TAO_Log_i::get_max_record_life (ACE_ENV_SINGLE_ARG_DECL)
+ ACE_THROW_SPEC ((CORBA::SystemException))
+{
+ ACE_READ_GUARD_THROW_EX (ACE_SYNCH_RW_MUTEX,
+ guard,
+ this->recordstore_->lock (),
+ CORBA::INTERNAL ());
+ ACE_CHECK_RETURN (0);
+
+ return
+ this->recordstore_->get_max_record_life(ACE_ENV_SINGLE_ARG_PARAMETER);
+}
+
+void
+TAO_Log_i::set_max_record_life (CORBA::ULong life
+ ACE_ENV_ARG_DECL)
+ ACE_THROW_SPEC ((CORBA::SystemException))
+{
+ ACE_WRITE_GUARD_THROW_EX (ACE_SYNCH_RW_MUTEX,
+ guard,
+ this->recordstore_->lock (),
+ CORBA::INTERNAL ());
+ ACE_CHECK;
+
+ CORBA::ULong old_life =
+ this->recordstore_->get_max_record_life (ACE_ENV_SINGLE_ARG_PARAMETER);
+ ACE_CHECK;
+
+ // @@ The current revision of the specification (formal/03-07-01) is
+ // unclear whether an AttributeValueChange event should be sent if a
+ // log attribute was changed (to a new value), or whether the events
+ // should be sent unconditionally. I have submitted a defect report
+ // to the OMG for clarification.
+ //
+ // In the mean time, we're interepreting it to mean that events are
+ // only sent when the value has changed.
+ if (life == old_life)
+ return;
+
+ this->recordstore_->set_max_record_life (life ACE_ENV_ARG_PARAMETER);
+ ACE_CHECK;
+
+ if (life != 0)
+ this->log_compaction_handler_.schedule();
+ else
+ this->log_compaction_handler_.cancel();
+
+ if (notifier_)
+ {
+ // @@ Calling create_log_reference () in the ctor or in ::init()
+ // leads to an infinate loop. This should be removed when that
+ // is fixed.
+ if (CORBA::is_nil (this->log_.in ()))
+ {
+ this->log_ = logmgr_i_.create_log_reference (this->logid_
+ ACE_ENV_ARG_PARAMETER);
+ ACE_CHECK;
+ }
+
+ notifier_->max_record_life_value_change (this->log_.in (),
+ this->logid_,
+ old_life,
+ life
+ ACE_ENV_ARG_PARAMETER);
+ ACE_CHECK;
+ }
+}
+
+CORBA::ULongLong
+TAO_Log_i::get_max_size (ACE_ENV_SINGLE_ARG_DECL)
+ ACE_THROW_SPEC ((CORBA::SystemException))
+{
+ ACE_READ_GUARD_THROW_EX (ACE_SYNCH_RW_MUTEX,
+ guard,
+ this->recordstore_->lock (),
+ CORBA::INTERNAL ());
+ ACE_CHECK_RETURN (0);
+
+ return recordstore_->get_max_size (ACE_ENV_SINGLE_ARG_PARAMETER);
+}
+
+void
+TAO_Log_i::set_max_size (CORBA::ULongLong size
+ ACE_ENV_ARG_DECL)
+ ACE_THROW_SPEC ((CORBA::SystemException,
+ DsLogAdmin::InvalidParam))
+{
+ ACE_WRITE_GUARD_THROW_EX (ACE_SYNCH_RW_MUTEX,
+ guard,
+ this->recordstore_->lock (),
+ CORBA::INTERNAL ());
+ ACE_CHECK;
+
+ CORBA::ULongLong old_size =
+ this->recordstore_->get_max_size (ACE_ENV_SINGLE_ARG_PARAMETER);
+ ACE_CHECK;
+
+ // @@ The current revision of the specification (formal/03-07-01) is
+ // unclear whether an AttributeValueChange event should be sent if a
+ // log attribute was changed (to a new value), or whether the events
+ // should be sent unconditionally. I have submitted a defect report
+ // to the OMG for clarification.
+ //
+ // In the mean time, we're interepreting it to mean that events are
+ // only sent when the value has changed.
+ if (size == old_size)
+ return;
+
+ // size == 0 => infinite size.
+ if (size != 0)
+ {
+ CORBA::ULongLong current_size =
+ this->recordstore_->get_current_size (ACE_ENV_SINGLE_ARG_PARAMETER);
+ ACE_CHECK;
+
+ if (size < current_size)
+ ACE_THROW (DsLogAdmin::InvalidParam ());
+ }
+
+ this->recordstore_->set_max_size (size ACE_ENV_ARG_PARAMETER);
+ ACE_CHECK;
+
+ if (notifier_)
+ {
+ // @@ Calling create_log_reference () in the ctor or in ::init()
+ // leads to an infinate loop. This should be removed when that
+ // is fixed.
+ if (CORBA::is_nil (this->log_.in ()))
+ {
+ this->log_ = logmgr_i_.create_log_reference (this->logid_
+ ACE_ENV_ARG_PARAMETER);
+ ACE_CHECK;
+ }
+
+ notifier_->max_log_size_value_change (this->log_.in (),
+ this->logid_,
+ old_size,
+ size
+ ACE_ENV_ARG_PARAMETER);
+ ACE_CHECK;
+ }
+
+ // @@ The current revision of the specification (formal/03-07-01)
+ // doesn't specify the interaction between set_max_size() and the
+ // capacity alarm thresholds list. Publicly available documentation
+ // I've read for other log service implementations doesn't offer any
+ // guidance either. I have submitted a defect report to the OMG for
+ // clarification.
+ //
+ // In the mean time, we will call reset_capacity_alarm_threshold()
+ // to reset the "current_threshold_" index. This will result in
+ // ThresholdAlarm being sent when the next threshold is crossed. An
+ // argument could be made that an event should be be sent for each
+ // threshold that has already been crossed. Hopefully, this will be
+ // clarified when/if the OMG charters a RTF for the log service.
+ // --jtc
+ //
+ this->reset_capacity_alarm_threshold (ACE_ENV_SINGLE_ARG_PARAMETER);
+ ACE_CHECK;
+}
+
+CORBA::ULongLong
+TAO_Log_i::get_current_size (ACE_ENV_SINGLE_ARG_DECL)
+ ACE_THROW_SPEC ((CORBA::SystemException))
+{
+ ACE_READ_GUARD_THROW_EX (ACE_SYNCH_RW_MUTEX,
+ guard,
+ this->recordstore_->lock (),
+ CORBA::INTERNAL ());
+ ACE_CHECK_RETURN (0);
+
+ return this->recordstore_->get_current_size (ACE_ENV_SINGLE_ARG_PARAMETER);
+}
+
+CORBA::ULongLong
+TAO_Log_i::get_n_records (ACE_ENV_SINGLE_ARG_DECL)
+ ACE_THROW_SPEC ((CORBA::SystemException))
+{
+ ACE_READ_GUARD_THROW_EX (ACE_SYNCH_RW_MUTEX,
+ guard,
+ this->recordstore_->lock (),
+ CORBA::INTERNAL ());
+ ACE_CHECK_RETURN (0);
+
+ return this->recordstore_->get_n_records (ACE_ENV_SINGLE_ARG_PARAMETER);
+}
+
+DsLogAdmin::LogFullActionType
+TAO_Log_i::get_log_full_action (ACE_ENV_SINGLE_ARG_DECL)
+ ACE_THROW_SPEC ((CORBA::SystemException))
+{
+ ACE_READ_GUARD_THROW_EX (ACE_SYNCH_RW_MUTEX,
+ guard,
+ this->recordstore_->lock (),
+ CORBA::INTERNAL ());
+ ACE_CHECK_RETURN (0);
+
+ return this->recordstore_->get_log_full_action(ACE_ENV_SINGLE_ARG_PARAMETER);
+}
+
+void
+TAO_Log_i::set_log_full_action (DsLogAdmin::LogFullActionType action
+ ACE_ENV_ARG_DECL)
+ ACE_THROW_SPEC ((CORBA::SystemException,
+ DsLogAdmin::InvalidLogFullAction))
+{
+ ACE_WRITE_GUARD_THROW_EX (ACE_SYNCH_RW_MUTEX,
+ guard,
+ this->recordstore_->lock (),
+ CORBA::INTERNAL ());
+ ACE_CHECK;
+
+ if (action != DsLogAdmin::wrap && action != DsLogAdmin::halt)
+ ACE_THROW (DsLogAdmin::InvalidLogFullAction ());
+
+ DsLogAdmin::LogFullActionType old_action =
+ this->recordstore_->get_log_full_action (ACE_ENV_SINGLE_ARG_PARAMETER);
+ ACE_CHECK;
+
+ // @@ The current revision of the specification (formal/03-07-01) is
+ // unclear whether an AttributeValueChange event should be sent if a
+ // log attribute was changed (to a new value), or whether the events
+ // should be sent unconditionally. I have submitted a defect report
+ // to the OMG for clarification.
+ //
+ // In the mean time, we're interepreting it to mean that events are
+ // only sent when the value has changed.
+ if (action == old_action)
+ return;
+
+ this->recordstore_->set_log_full_action (action ACE_ENV_ARG_PARAMETER);
+ ACE_CHECK;
+
+ if (notifier_)
+ {
+ // @@ Calling create_log_reference () in the ctor or in ::init()
+ // leads to an infinate loop. This should be removed when that
+ // is fixed.
+ if (CORBA::is_nil (this->log_.in ()))
+ {
+ this->log_ = logmgr_i_.create_log_reference (this->logid_
+ ACE_ENV_ARG_PARAMETER);
+ ACE_CHECK;
+ }
+
+ notifier_->log_full_action_value_change (this->log_.in (),
+ this->logid_,
+ old_action,
+ action
+ ACE_ENV_ARG_PARAMETER);
+ ACE_CHECK;
+ }
+
+ // @@ The current revision of the specification (formal/03-07-01)
+ // doesn't specify the interaction between set_log_full_action() and the
+ // capacity alarm thresholds list. Publicly available documentation
+ // I've read for other log service implementations doesn't offer any
+ // guidance either. I have submitted a defect report to the OMG for
+ // clarification.
+ //
+ // In the mean time, we will call reset_capacity_alarm_threshold()
+ // to reset the "current_threshold_" index. This will result in
+ // ThresholdAlarm being sent when the next threshold is crossed. An
+ // argument could be made that an event should be be sent for each
+ // threshold that has already been crossed. Hopefully, this will be
+ // clarified when/if the OMG charters a RTF for the log service.
+ // --jtc
+ //
+ this->reset_capacity_alarm_threshold (ACE_ENV_SINGLE_ARG_PARAMETER);
+ ACE_CHECK;
+}
+
+DsLogAdmin::AdministrativeState
+TAO_Log_i::get_administrative_state (ACE_ENV_SINGLE_ARG_DECL)
+ ACE_THROW_SPEC ((CORBA::SystemException))
+{
+ ACE_READ_GUARD_THROW_EX (ACE_SYNCH_RW_MUTEX,
+ guard,
+ this->recordstore_->lock (),
+ CORBA::INTERNAL ());
+ ACE_CHECK_RETURN (0);
+
+ return this->recordstore_->get_administrative_state (ACE_ENV_SINGLE_ARG_PARAMETER);
+}
+
+void
+TAO_Log_i::set_administrative_state (DsLogAdmin::AdministrativeState state
+ ACE_ENV_ARG_DECL)
+ ACE_THROW_SPEC ((CORBA::SystemException))
+{
+ ACE_WRITE_GUARD_THROW_EX (ACE_SYNCH_RW_MUTEX,
+ guard,
+ this->recordstore_->lock (),
+ CORBA::INTERNAL ());
+ ACE_CHECK;
+
+ DsLogAdmin::AdministrativeState old_state =
+ this->recordstore_->get_administrative_state (ACE_ENV_SINGLE_ARG_PARAMETER);
+ ACE_CHECK;
+
+ // @@ The current revision of the specification (formal/03-07-01) is
+ // unclear whether an AttributeValueChange event should be sent if a
+ // log attribute was changed (to a new value), or whether the events
+ // should be sent unconditionally. I have submitted a defect report
+ // to the OMG for clarification.
+ //
+ // In the mean time, we're interepreting it to mean that events are
+ // only sent when the value has changed.
+ if (state == old_state)
+ return;
+
+ this->recordstore_->set_administrative_state (state ACE_ENV_ARG_PARAMETER);
+ ACE_CHECK;
+
+ if (notifier_)
+ {
+ // @@ Calling create_log_reference () in the ctor or in ::init()
+ // leads to an infinate loop. This should be removed when that
+ // is fixed.
+ if (CORBA::is_nil (this->log_.in ()))
+ {
+ this->log_ = logmgr_i_.create_log_reference (this->logid_
+ ACE_ENV_ARG_PARAMETER);
+ ACE_CHECK;
+ }
+
+ notifier_->administrative_state_change (this->log_.in (),
+ this->logid_,
+ state
+ ACE_ENV_ARG_PARAMETER);
+ ACE_CHECK;
+ }
+}
+
+DsLogAdmin::ForwardingState
+TAO_Log_i::get_forwarding_state (ACE_ENV_SINGLE_ARG_DECL)
+ ACE_THROW_SPEC ((CORBA::SystemException))
+{
+ ACE_READ_GUARD_THROW_EX (ACE_SYNCH_RW_MUTEX,
+ guard,
+ this->recordstore_->lock (),
+ CORBA::INTERNAL ());
+ ACE_CHECK_RETURN (0);
+
+ return
+ this->recordstore_->get_forwarding_state (ACE_ENV_SINGLE_ARG_PARAMETER);
+}
+
+void
+TAO_Log_i::set_forwarding_state (DsLogAdmin::ForwardingState state
+ ACE_ENV_ARG_DECL)
+ ACE_THROW_SPEC ((CORBA::SystemException))
+{
+ ACE_WRITE_GUARD_THROW_EX (ACE_SYNCH_RW_MUTEX,
+ guard,
+ this->recordstore_->lock (),
+ CORBA::INTERNAL ());
+ ACE_CHECK;
+
+ DsLogAdmin::ForwardingState old_state =
+ this->recordstore_->get_forwarding_state (ACE_ENV_SINGLE_ARG_PARAMETER);
+ ACE_CHECK;
+
+ // @@ The current revision of the specification (formal/03-07-01) is
+ // unclear whether an AttributeValueChange event should be sent if a
+ // log attribute was changed (to a new value), or whether the events
+ // should be sent unconditionally. I have submitted a defect report
+ // to the OMG for clarification.
+ //
+ // In the mean time, we're interepreting it to mean that events are
+ // only sent when the value has changed.
+ if (state == old_state)
+ return;
+
+ this->recordstore_->set_forwarding_state (state ACE_ENV_ARG_PARAMETER);
+ ACE_CHECK;
+
+ if (notifier_)
+ {
+ // @@ Calling create_log_reference () in the ctor or in ::init()
+ // leads to an infinate loop. This should be removed when that
+ // is fixed.
+ if (CORBA::is_nil (this->log_.in ()))
+ {
+ this->log_ = logmgr_i_.create_log_reference (this->logid_
+ ACE_ENV_ARG_PARAMETER);
+ ACE_CHECK;
+ }
+
+ notifier_->forwarding_state_change (this->log_.in (),
+ this->logid_,
+ state
+ ACE_ENV_ARG_PARAMETER);
+ ACE_CHECK;
+ }
+}
+
+DsLogAdmin::OperationalState
+TAO_Log_i::get_operational_state (ACE_ENV_SINGLE_ARG_DECL_NOT_USED)
+ ACE_THROW_SPEC ((CORBA::SystemException))
+{
+ // No locks are necessary, since op_state_ is set in ::init() and
+ // never changed.
+ return this->op_state_;
+}
+
+DsLogAdmin::TimeInterval
+TAO_Log_i::get_interval (ACE_ENV_SINGLE_ARG_DECL)
+ ACE_THROW_SPEC ((CORBA::SystemException))
+{
+ ACE_READ_GUARD_THROW_EX (ACE_SYNCH_RW_MUTEX,
+ guard,
+ this->recordstore_->lock (),
+ CORBA::INTERNAL ());
+ ACE_CHECK_RETURN (0);
+
+ return this->recordstore_->get_interval (ACE_ENV_SINGLE_ARG_PARAMETER);
+}
+
+void
+TAO_Log_i::set_interval (const DsLogAdmin::TimeInterval &interval
+ ACE_ENV_ARG_DECL)
+ ACE_THROW_SPEC ((CORBA::SystemException,
+ DsLogAdmin::InvalidTime,
+ DsLogAdmin::InvalidTimeInterval))
+{
+ ACE_WRITE_GUARD_THROW_EX (ACE_SYNCH_RW_MUTEX,
+ guard,
+ this->recordstore_->lock (),
+ CORBA::INTERNAL ());
+ ACE_CHECK;
+
+ // validate interval
+ if (interval.start != 0)
+ {
+ if (interval.start >= interval.stop)
+ ACE_THROW (DsLogAdmin::InvalidTimeInterval ());
+ }
+
+ DsLogAdmin::TimeInterval old_interval =
+ this->recordstore_->get_interval (ACE_ENV_SINGLE_ARG_PARAMETER);
+ ACE_CHECK;
+
+ // @@ The current revision of the specification (formal/03-07-01) is
+ // unclear whether an AttributeValueChange event should be sent if a
+ // log attribute was changed (to a new value), or whether the events
+ // should be sent unconditionally. I have submitted a defect report
+ // to the OMG for clarification.
+ //
+ // In the mean time, we're interepreting it to mean that events are
+ // only sent when the value has changed.
+ if (interval == old_interval)
+ return;
+
+ this->recordstore_->set_interval (interval ACE_ENV_ARG_PARAMETER);
+ ACE_CHECK;
+
+ if (notifier_)
+ {
+ // @@ Calling create_log_reference () in the ctor or in ::init()
+ // leads to an infinate loop. This should be removed when that
+ // is fixed.
+ if (CORBA::is_nil (this->log_.in ()))
+ {
+ this->log_ = logmgr_i_.create_log_reference (this->logid_
+ ACE_ENV_ARG_PARAMETER);
+ ACE_CHECK;
+ }
+
+ if (interval.start != old_interval.start)
+ {
+ notifier_->start_time_value_change (this->log_.in (),
+ this->logid_,
+ old_interval.start,
+ interval.start
+ ACE_ENV_ARG_PARAMETER);
+ ACE_CHECK;
+ }
+
+ if (interval.stop != old_interval.stop)
+ {
+ notifier_->stop_time_value_change (this->log_.in (),
+ this->logid_,
+ old_interval.stop,
+ interval.stop
+ ACE_ENV_ARG_PARAMETER);
+ ACE_CHECK;
+ }
+ }
+}
+
+DsLogAdmin::AvailabilityStatus
+TAO_Log_i::get_availability_status (ACE_ENV_SINGLE_ARG_DECL)
+ ACE_THROW_SPEC ((CORBA::SystemException))
+{
+ ACE_READ_GUARD_THROW_EX (ACE_SYNCH_RW_MUTEX,
+ guard,
+ this->recordstore_->lock (),
+ CORBA::INTERNAL ());
+ ACE_CHECK_RETURN (0);
+
+ return this->get_availability_status_i (ACE_ENV_SINGLE_ARG_PARAMETER);
+}
+
+DsLogAdmin::AvailabilityStatus
+TAO_Log_i::get_availability_status_i (ACE_ENV_SINGLE_ARG_DECL)
+ ACE_THROW_SPEC ((CORBA::SystemException))
+{
+ // The log is considered "on duty" if all the following are true:
+ // * operational state is enabled
+ // * adminstrative state is unlocked
+ // * current time falls within the log duration time.
+ // * current time falls within one (or more) of the log
+ // scheduling times.
+
+ const CORBA::Boolean s = this->scheduled (ACE_ENV_SINGLE_ARG_PARAMETER);
+ ACE_CHECK_RETURN (this->avail_status_);
+
+ DsLogAdmin::AdministrativeState admin_state =
+ this->recordstore_->get_administrative_state (ACE_ENV_SINGLE_ARG_PARAMETER);
+ ACE_CHECK_RETURN (this->avail_status_);
+
+ if (this->op_state_ == DsLogAdmin::enabled
+ && admin_state == DsLogAdmin::unlocked
+ && s == 1)
+ {
+ this->avail_status_.off_duty = 0; // "on duty"
+
+ }
+ else
+ this->avail_status_.off_duty = 1;
+ // The log_full flag is set by the write operations.
+ return this->avail_status_;
+}
+
+DsLogAdmin::CapacityAlarmThresholdList*
+TAO_Log_i::get_capacity_alarm_thresholds (ACE_ENV_SINGLE_ARG_DECL)
+ ACE_THROW_SPEC ((CORBA::SystemException))
+{
+ ACE_READ_GUARD_THROW_EX (ACE_SYNCH_RW_MUTEX,
+ guard,
+ this->recordstore_->lock (),
+ CORBA::INTERNAL ());
+ ACE_CHECK_RETURN (0);
+
+ return this->recordstore_->get_capacity_alarm_thresholds (ACE_ENV_SINGLE_ARG_PARAMETER);
+}
+
+void
+TAO_Log_i::set_capacity_alarm_thresholds (const
+ DsLogAdmin::CapacityAlarmThresholdList
+ &threshs
+ ACE_ENV_ARG_DECL)
+ ACE_THROW_SPEC ((CORBA::SystemException,
+ DsLogAdmin::InvalidThreshold))
+{
+ ACE_WRITE_GUARD_THROW_EX (ACE_SYNCH_RW_MUTEX,
+ guard,
+ this->recordstore_->lock (),
+ CORBA::INTERNAL ());
+ ACE_CHECK;
+
+ const CORBA::Boolean validated =
+ TAO_Log_i::validate_capacity_alarm_thresholds (threshs
+ ACE_ENV_ARG_PARAMETER);
+ ACE_CHECK;
+
+ if (!validated)
+ ACE_THROW (DsLogAdmin::InvalidThreshold ());
+
+ DsLogAdmin::CapacityAlarmThresholdList_var old_threshs =
+ this->recordstore_->get_capacity_alarm_thresholds (ACE_ENV_SINGLE_ARG_PARAMETER);
+ ACE_CHECK;
+
+ // @@ The current revision of the specification (formal/03-07-01) is
+ // unclear whether an AttributeValueChange event should be sent if a
+ // log attribute was changed (to a new value), or whether the events
+ // should be sent unconditionally. I have submitted a defect report
+ // to the OMG for clarification.
+ //
+ // In the mean time, we're interepreting it to mean that events are
+ // only sent when the value has changed.
+ if (threshs == old_threshs.in ())
+ return;
+
+ this->recordstore_->set_capacity_alarm_thresholds (threshs
+ ACE_ENV_ARG_PARAMETER);
+ ACE_CHECK;
+
+ if (notifier_)
+ {
+ // @@ Calling create_log_reference () in the ctor or in ::init()
+ // leads to an infinate loop. This should be removed when that
+ // is fixed.
+ if (CORBA::is_nil (this->log_.in ()))
+ {
+ this->log_ = logmgr_i_.create_log_reference (this->logid_
+ ACE_ENV_ARG_PARAMETER);
+ ACE_CHECK;
+ }
+
+ notifier_->capacity_alarm_threshold_value_change (this->log_.in (),
+ this->logid_,
+ old_threshs.in (),
+ threshs
+ ACE_ENV_ARG_PARAMETER);
+ ACE_CHECK;
+ }
+
+ // @@ The current revision of the specification (formal/03-07-01)
+ // doesn't completly describe the behavior of changing the capacity
+ // alarm threshold list. Publicly available documentation I've read
+ // for other log service implementations doesn't offer much guidance
+ // either. I have submitted a defect report to the OMG for
+ // clarification.
+ //
+ // In the mean time, we will call reset_capacity_alarm_threshold()
+ // to reset the "current_threshold_" index. This will result in
+ // ThresholdAlarm being sent when the next threshold is crossed. An
+ // argument could be made that an event should be be sent for each
+ // threshold that has already been crossed. Hopefully, this will be
+ // clarified when/if the OMG charters a RTF for the log service.
+ // --jtc
+ //
+ this->thresholds_ = threshs;
+ this->reset_capacity_alarm_threshold (ACE_ENV_SINGLE_ARG_PARAMETER);
+ ACE_CHECK;
+}
+
+DsLogAdmin::WeekMask*
+TAO_Log_i::get_week_mask (ACE_ENV_SINGLE_ARG_DECL)
+ ACE_THROW_SPEC ((CORBA::SystemException))
+{
+ ACE_READ_GUARD_THROW_EX (ACE_SYNCH_RW_MUTEX,
+ guard,
+ this->recordstore_->lock (),
+ CORBA::INTERNAL ());
+ ACE_CHECK_RETURN (0);
+
+ return this->recordstore_->get_week_mask (ACE_ENV_SINGLE_ARG_PARAMETER);
+}
+
+void
+TAO_Log_i::set_week_mask (const DsLogAdmin::WeekMask &masks
+ ACE_ENV_ARG_DECL)
+ ACE_THROW_SPEC ((CORBA::SystemException,
+ DsLogAdmin::InvalidTime,
+ DsLogAdmin::InvalidTimeInterval,
+ DsLogAdmin::InvalidMask))
+{
+ ACE_WRITE_GUARD_THROW_EX (ACE_SYNCH_RW_MUTEX,
+ guard,
+ this->recordstore_->lock (),
+ CORBA::INTERNAL ());
+ ACE_CHECK;
+
+ validate_week_mask (masks ACE_ENV_ARG_PARAMETER);
+ ACE_CHECK;
+
+ DsLogAdmin::WeekMask_var old_masks =
+ this->recordstore_->get_week_mask (ACE_ENV_SINGLE_ARG_PARAMETER);
+ ACE_CHECK;
+
+ // @@ The current revision of the specification (formal/03-07-01) is
+ // unclear whether an AttributeValueChange event should be sent if a
+ // log attribute was changed (to a new value), or whether the events
+ // should be sent unconditionally. I have submitted a defect report
+ // to the OMG for clarification.
+ //
+ // In the mean time, we're interepreting it to mean that events are
+ // only sent when the value has changed.
+ if (masks == old_masks.in ())
+ return;
+
+ this->recordstore_->set_week_mask (masks ACE_ENV_ARG_PARAMETER);
+ ACE_CHECK;
+
+ this->reset_week_mask (masks ACE_ENV_ARG_PARAMETER);
+ ACE_CHECK;
+
+ if (notifier_)
+ {
+ // @@ Calling create_log_reference () in the ctor or in ::init()
+ // leads to an infinate loop. This should be removed when that
+ // is fixed.
+ if (CORBA::is_nil (this->log_.in ()))
+ {
+ this->log_ = logmgr_i_.create_log_reference (this->logid_
+ ACE_ENV_ARG_PARAMETER);
+ ACE_CHECK;
+ }
+
+ notifier_->week_mask_value_change (this->log_.in (),
+ this->logid_,
+ old_masks.in (),
+ masks
+ ACE_ENV_ARG_PARAMETER);
+ ACE_CHECK;
+ }
+}
+
+DsLogAdmin::RecordList*
+TAO_Log_i::query (const char *grammar,
+ const char *constraint,
+ DsLogAdmin::Iterator_out iter_out
+ ACE_ENV_ARG_DECL)
+ ACE_THROW_SPEC ((CORBA::SystemException,
+ DsLogAdmin::InvalidGrammar,
+ DsLogAdmin::InvalidConstraint))
+{
+ ACE_READ_GUARD_THROW_EX (ACE_SYNCH_RW_MUTEX,
+ guard,
+ this->recordstore_->lock (),
+ CORBA::INTERNAL ());
+ ACE_CHECK_RETURN (0);
+
+ return this->recordstore_->query (grammar,
+ constraint,
+ iter_out
+ ACE_ENV_ARG_PARAMETER);
+}
+
+DsLogAdmin::RecordList*
+TAO_Log_i::retrieve (DsLogAdmin::TimeT from_time,
+ CORBA::Long how_many,
+ DsLogAdmin::Iterator_out iter_out
+ ACE_ENV_ARG_DECL)
+ ACE_THROW_SPEC ((CORBA::SystemException))
+{
+ ACE_READ_GUARD_THROW_EX (ACE_SYNCH_RW_MUTEX,
+ guard,
+ this->recordstore_->lock (),
+ CORBA::INTERNAL ());
+ ACE_CHECK_RETURN (0);
+
+ return this->recordstore_->retrieve (from_time,
+ how_many,
+ iter_out
+ ACE_ENV_ARG_PARAMETER);
+}
+
+CORBA::ULong
+TAO_Log_i::match (const char* grammar,
+ const char *constraint
+ ACE_ENV_ARG_DECL)
+ ACE_THROW_SPEC ((CORBA::SystemException,
+ DsLogAdmin::InvalidGrammar,
+ DsLogAdmin::InvalidConstraint))
+{
+ ACE_READ_GUARD_THROW_EX (ACE_SYNCH_RW_MUTEX,
+ guard,
+ this->recordstore_->lock (),
+ CORBA::INTERNAL ());
+ ACE_CHECK_RETURN (0);
+
+ const CORBA::ULong count =
+ this->recordstore_->match (grammar,
+ constraint
+ ACE_ENV_ARG_PARAMETER);
+ ACE_CHECK_RETURN (0);
+
+ return count;
+}
+
+CORBA::ULong
+TAO_Log_i::delete_records (const char *grammar,
+ const char *constraint
+ ACE_ENV_ARG_DECL)
+ ACE_THROW_SPEC ((CORBA::SystemException,
+ DsLogAdmin::InvalidGrammar,
+ DsLogAdmin::InvalidConstraint))
+{
+ ACE_WRITE_GUARD_THROW_EX (ACE_SYNCH_RW_MUTEX,
+ guard,
+ this->recordstore_->lock (),
+ CORBA::INTERNAL ());
+ ACE_CHECK_RETURN (0);
+
+ const CORBA::ULong count =
+ this->recordstore_->delete_records (grammar,
+ constraint
+ ACE_ENV_ARG_PARAMETER);
+ ACE_CHECK_RETURN (0);
+
+ if (count > 0)
+ {
+ if (avail_status_.log_full)
+ {
+ const CORBA::ULongLong current_size =
+ this->recordstore_->get_current_size (ACE_ENV_SINGLE_ARG_PARAMETER);
+ ACE_CHECK_RETURN (0);
+
+ const CORBA::ULongLong max_size =
+ this->recordstore_->get_max_size (ACE_ENV_SINGLE_ARG_PARAMETER);
+ ACE_CHECK_RETURN (0);
+
+ if (current_size < max_size)
+ {
+ avail_status_.log_full = 0;
+ }
+ }
+
+ this->reset_capacity_alarm_threshold (ACE_ENV_SINGLE_ARG_PARAMETER);
+ ACE_CHECK_RETURN (0);
+ }
+
+ return count;
+}
+
+CORBA::ULong
+TAO_Log_i::delete_records_by_id (const DsLogAdmin::RecordIdList &ids
+ ACE_ENV_ARG_DECL)
+ ACE_THROW_SPEC ((CORBA::SystemException))
+{
+ ACE_WRITE_GUARD_THROW_EX (ACE_SYNCH_RW_MUTEX,
+ guard,
+ this->recordstore_->lock (),
+ CORBA::INTERNAL ());
+ ACE_CHECK_RETURN (0);
+
+ const CORBA::ULong count =
+ this->recordstore_->delete_records_by_id (ids ACE_ENV_ARG_PARAMETER);
+ ACE_CHECK_RETURN (0);
+
+ if (count > 0)
+ {
+ if (avail_status_.log_full)
+ {
+ const CORBA::ULongLong current_size =
+ this->recordstore_->get_current_size (ACE_ENV_SINGLE_ARG_PARAMETER);
+ ACE_CHECK_RETURN (0);
+
+ const CORBA::ULongLong max_size =
+ this->recordstore_->get_max_size (ACE_ENV_SINGLE_ARG_PARAMETER);
+ ACE_CHECK_RETURN (0);
+
+ if (current_size < max_size)
+ {
+ avail_status_.log_full = 0;
+ }
+ }
+
+ this->reset_capacity_alarm_threshold (ACE_ENV_SINGLE_ARG_PARAMETER);
+ ACE_CHECK_RETURN (0);
+ }
+
+ return count;
+}
+
+void
+TAO_Log_i::write_records (const DsLogAdmin::Anys &records
+ ACE_ENV_ARG_DECL)
+ ACE_THROW_SPEC ((CORBA::SystemException,
+ DsLogAdmin::LogFull,
+ DsLogAdmin::LogOffDuty,
+ DsLogAdmin::LogLocked,
+ DsLogAdmin::LogDisabled))
+{
+ // create a record list..
+ DsLogAdmin::RecordList reclist (records.length ());
+ reclist.length (records.length ());
+
+ for (CORBA::ULong i = 0; i < records.length (); ++i)
+ {
+ reclist [i].info = records[i];
+ }
+
+ this->write_recordlist (reclist ACE_ENV_ARG_PARAMETER);
+ ACE_CHECK;
+}
+
+void
+TAO_Log_i::write_recordlist (const DsLogAdmin::RecordList &reclist
+ ACE_ENV_ARG_DECL)
+ ACE_THROW_SPEC ((CORBA::SystemException,
+ DsLogAdmin::LogFull,
+ DsLogAdmin::LogOffDuty,
+ DsLogAdmin::LogLocked,
+ DsLogAdmin::LogDisabled))
+{
+ ACE_WRITE_GUARD_THROW_EX (ACE_SYNCH_RW_MUTEX,
+ guard,
+ this->recordstore_->lock (),
+ CORBA::INTERNAL ());
+ ACE_CHECK;
+
+ DsLogAdmin::LogFullActionType log_full_action =
+ this->recordstore_->get_log_full_action (ACE_ENV_SINGLE_ARG_PARAMETER);
+ ACE_CHECK;
+
+ DsLogAdmin::AdministrativeState admin_state =
+ this->recordstore_->get_administrative_state (ACE_ENV_SINGLE_ARG_PARAMETER);
+ ACE_CHECK;
+
+ // @@ The current revision of the specification (formal/03-07-01)
+ // does not explicitly specify the preference of exceptions to be
+ // thrown when multiple error conditions are present.
+ //
+ // However, the because log is considered off duty if the log's
+ // operational state is disabled or its administrative state is
+ // locked, we handle the LogOffDuty exception last so the more
+ // specific LogLocked and LogDisabled exceptions will be thrown.
+
+ DsLogAdmin::AvailabilityStatus avail_stat =
+ this->get_availability_status_i (ACE_ENV_SINGLE_ARG_PARAMETER);
+ ACE_CHECK;
+
+ if (admin_state == DsLogAdmin::locked)
+ {
+ ACE_THROW (DsLogAdmin::LogLocked ());
+ }
+ else if (this->op_state_ == DsLogAdmin::disabled)
+ {
+ ACE_THROW (DsLogAdmin::LogDisabled ());
+ }
+ else if (avail_stat.off_duty == 1)
+ {
+ ACE_THROW (DsLogAdmin::LogOffDuty ());
+ }
+
+ CORBA::Short num_written (0);
+
+ for (CORBA::ULong i = 0; i < reclist.length (); i++)
+ {
+ // retval == 1 => log store reached max size.
+
+ int retval = this->recordstore_->log (reclist[i] ACE_ENV_ARG_PARAMETER);
+ ACE_CHECK;
+
+ if (retval == 1)
+ {
+ // The Log is full . check what the policy is and take
+ // appropriate action.
+ if (log_full_action == DsLogAdmin::halt)
+ {
+ avail_status_.log_full = 1;
+ ACE_THROW (DsLogAdmin::LogFull (num_written));
+ }
+
+ // the policy is to wrap. for this we need to delete a few
+ // records. let the record store decide how many.
+
+ if (this->recordstore_->purge_old_records (ACE_ENV_SINGLE_ARG_PARAMETER) == -1)
+ ACE_THROW (CORBA::PERSIST_STORE ());
+
+ // Now, we want to attempt to write the same record again
+ // so decrement the index to balance the inc. in the for loop.
+ --i;
+ }
+ else if (retval == 0)
+ {
+ num_written++;
+
+ this->check_capacity_alarm_threshold (ACE_ENV_SINGLE_ARG_PARAMETER);
+ ACE_CHECK;
+ }
+ else
+ {
+ ACE_THROW (CORBA::PERSIST_STORE ());
+ }
+ } // for
+}
+
+void
+TAO_Log_i::set_record_attribute (DsLogAdmin::RecordId id,
+ const DsLogAdmin::NVList &attr_list
+ ACE_ENV_ARG_DECL)
+ ACE_THROW_SPEC ((CORBA::SystemException,
+ DsLogAdmin::InvalidRecordId,
+ DsLogAdmin::InvalidAttribute))
+{
+ ACE_WRITE_GUARD_THROW_EX (ACE_SYNCH_RW_MUTEX,
+ guard,
+ this->recordstore_->lock (),
+ CORBA::INTERNAL ());
+ ACE_CHECK;
+
+ this->recordstore_->set_record_attribute (id, attr_list
+ ACE_ENV_ARG_PARAMETER);
+}
+
+CORBA::ULong
+TAO_Log_i::set_records_attribute (const char *grammar,
+ const char *constraint,
+ const DsLogAdmin::NVList
+ &attr_list ACE_ENV_ARG_DECL)
+ ACE_THROW_SPEC ((CORBA::SystemException,
+ DsLogAdmin::InvalidGrammar,
+ DsLogAdmin::InvalidConstraint,
+ DsLogAdmin::InvalidAttribute))
+{
+ ACE_WRITE_GUARD_THROW_EX (ACE_SYNCH_RW_MUTEX,
+ guard,
+ this->recordstore_->lock (),
+ CORBA::INTERNAL ());
+ ACE_CHECK_RETURN (0);
+
+ return this->recordstore_->set_records_attribute (grammar,
+ constraint,
+ attr_list
+ ACE_ENV_ARG_PARAMETER);
+}
+
+DsLogAdmin::NVList*
+TAO_Log_i::get_record_attribute (DsLogAdmin::RecordId id
+ ACE_ENV_ARG_DECL)
+ ACE_THROW_SPEC ((CORBA::SystemException,
+ DsLogAdmin::InvalidRecordId))
+{
+ ACE_READ_GUARD_THROW_EX (ACE_SYNCH_RW_MUTEX,
+ guard,
+ this->recordstore_->lock (),
+ CORBA::INTERNAL ());
+ ACE_CHECK_RETURN (0);
+
+
+ return this->recordstore_->get_record_attribute (id
+ ACE_ENV_ARG_PARAMETER);
+}
+
+void
+TAO_Log_i::flush (ACE_ENV_SINGLE_ARG_DECL)
+ ACE_THROW_SPEC ((CORBA::SystemException,
+ DsLogAdmin::UnsupportedQoS))
+{
+ /// XXX locks?
+ this->recordstore_->flush (ACE_ENV_SINGLE_ARG_PARAMETER);
+}
+
+CORBA::Boolean
+TAO_Log_i::scheduled (ACE_ENV_SINGLE_ARG_DECL)
+ ACE_THROW_SPEC ((CORBA::SystemException))
+{
+ DsLogAdmin::TimeInterval interval =
+ this->recordstore_->get_interval (ACE_ENV_SINGLE_ARG_PARAMETER);
+ ACE_CHECK_RETURN (0);
+
+ TimeBase::TimeT current_time;
+ ACE_Time_Value now = ACE_OS::gettimeofday ();
+ ORBSVCS_Time::Time_Value_to_TimeT (current_time, now);
+
+ if ((current_time >= interval.start) &&
+ ((current_time <= interval.stop) || (interval.stop == 0)) )
+ {
+ if (weekly_intervals_.length () > 0)
+ {
+ // work out when sunday is in nanoseconds.
+ timeval t;
+ t = (timeval) now;
+ struct tm *sunday;
+
+ time_t clock = (time_t) t.tv_sec;
+ sunday = ACE_OS::localtime (&clock);
+
+ sunday->tm_sec = 0;
+ sunday->tm_min = 0;
+ sunday->tm_hour = 0;
+ sunday->tm_mday -= sunday->tm_wday;
+
+ t.tv_sec = ACE_OS::mktime (sunday) ;
+ t.tv_usec = 0;
+
+ TimeBase::TimeT nano_sunday =
+ (CORBA::ULongLong) t.tv_sec * 10000000;
+
+ for (CORBA::ULong i = 0; i < weekly_intervals_.length (); ++i)
+ {
+ if (current_time >= (weekly_intervals_[i].start + nano_sunday) &&
+ current_time <= (weekly_intervals_[i].stop + nano_sunday))
+ {
+ return true;
+ }
+ }
+ return false;
+ }
+ else
+ return true;
+ }
+ else
+ return false;
+}
+
+void
+TAO_Log_i::copy_attributes (DsLogAdmin::Log_ptr log
+ ACE_ENV_ARG_DECL)
+ ACE_THROW_SPEC ((CORBA::SystemException))
+{
+ const DsLogAdmin::LogFullActionType log_full_action =
+ this->get_log_full_action (ACE_ENV_SINGLE_ARG_PARAMETER);
+ ACE_CHECK;
+
+ log->set_log_full_action (log_full_action
+ ACE_ENV_ARG_PARAMETER);
+ ACE_CHECK;
+
+ const CORBA::ULongLong max_size =
+ this->get_max_size (ACE_ENV_SINGLE_ARG_PARAMETER);
+ ACE_CHECK;
+
+ log->set_max_size (max_size
+ ACE_ENV_ARG_PARAMETER);
+ ACE_CHECK;
+
+ DsLogAdmin::QoSList_var log_qos =
+ this->get_log_qos (ACE_ENV_SINGLE_ARG_PARAMETER);
+ ACE_CHECK;
+
+ log->set_log_qos (log_qos.in ()
+ ACE_ENV_ARG_PARAMETER);
+ ACE_CHECK;
+
+ const CORBA::ULong max_record_life =
+ this->get_max_record_life (ACE_ENV_SINGLE_ARG_PARAMETER);
+ ACE_CHECK;
+
+ log->set_max_record_life (max_record_life
+ ACE_ENV_ARG_PARAMETER);
+ ACE_CHECK;
+
+ const DsLogAdmin::AdministrativeState adminstrative_state =
+ this->get_administrative_state (ACE_ENV_SINGLE_ARG_PARAMETER);
+ ACE_CHECK;
+
+ log->set_administrative_state (adminstrative_state
+ ACE_ENV_ARG_PARAMETER);
+ ACE_CHECK;
+
+ const DsLogAdmin::ForwardingState forwarding_state =
+ this->get_forwarding_state (ACE_ENV_SINGLE_ARG_PARAMETER);
+ ACE_CHECK;
+
+ log->set_forwarding_state (forwarding_state
+ ACE_ENV_ARG_PARAMETER);
+ ACE_CHECK;
+
+ const DsLogAdmin::TimeInterval interval =
+ this->get_interval (ACE_ENV_SINGLE_ARG_PARAMETER);
+ ACE_CHECK;
+
+ log->set_interval (interval
+ ACE_ENV_ARG_PARAMETER);
+ ACE_CHECK;
+
+ DsLogAdmin::CapacityAlarmThresholdList_var capacity_list =
+ this->get_capacity_alarm_thresholds (ACE_ENV_SINGLE_ARG_PARAMETER);
+ ACE_CHECK;
+
+ log->set_capacity_alarm_thresholds (capacity_list.in ()
+ ACE_ENV_ARG_PARAMETER);
+ ACE_CHECK;
+
+ DsLogAdmin::WeekMask_var week_mask =
+ this->get_week_mask (ACE_ENV_SINGLE_ARG_PARAMETER);
+ ACE_CHECK;
+
+ log->set_week_mask (week_mask.in ()
+ ACE_ENV_ARG_PARAMETER);
+ ACE_CHECK;
+}
+
+void
+TAO_Log_i::remove_old_records (ACE_ENV_SINGLE_ARG_DECL)
+ ACE_THROW_SPEC ((CORBA::SystemException))
+{
+ const CORBA::ULong count =
+ this->recordstore_->remove_old_records (ACE_ENV_SINGLE_ARG_PARAMETER);
+ ACE_CHECK;
+
+ if (count > 0)
+ {
+ if (avail_status_.log_full)
+ {
+ const CORBA::ULongLong current_size =
+ this->recordstore_->get_current_size (ACE_ENV_SINGLE_ARG_PARAMETER);
+ ACE_CHECK;
+
+ const CORBA::ULongLong max_size =
+ this->recordstore_->get_max_size (ACE_ENV_SINGLE_ARG_PARAMETER);
+ ACE_CHECK;
+
+ if (current_size < max_size)
+ {
+ avail_status_.log_full = 0;
+ }
+ }
+
+ this->reset_capacity_alarm_threshold (ACE_ENV_SINGLE_ARG_PARAMETER);
+ ACE_CHECK;
+ }
+}
+
+void
+TAO_Log_i::check_capacity_alarm_threshold (ACE_ENV_SINGLE_ARG_DECL)
+ ACE_THROW_SPEC ((CORBA::SystemException))
+{
+ const CORBA::ULongLong max_size =
+ this->recordstore_->get_max_size (ACE_ENV_SINGLE_ARG_PARAMETER);
+ ACE_CHECK;
+
+ if (max_size != 0 && this->thresholds_.length () > 0)
+ {
+ const DsLogAdmin::LogFullActionType log_full_action =
+ this->recordstore_->get_log_full_action (ACE_ENV_SINGLE_ARG_PARAMETER);
+ ACE_CHECK;
+
+ CORBA::ULongLong current_size =
+ ((log_full_action == DsLogAdmin::wrap)
+ ? this->recordstore_->get_gauge (ACE_ENV_SINGLE_ARG_PARAMETER)
+ : this->recordstore_->get_current_size (ACE_ENV_SINGLE_ARG_PARAMETER));
+ ACE_CHECK;
+
+ const CORBA::UShort percent =
+ static_cast<CORBA::UShort> (((double) ACE_UINT64_DBLCAST_ADAPTER (current_size * 100U) /
+ (double) ACE_UINT64_DBLCAST_ADAPTER (max_size)));
+
+ while (current_threshold_ < this->thresholds_.length ()
+ && this->thresholds_[this->current_threshold_] <= percent)
+ {
+ if (notifier_)
+ {
+ const DsLogNotification::PerceivedSeverityType severity =
+ ((percent == 100)
+ ? DsLogNotification::critical
+ : DsLogNotification::minor);
+
+ // @@ Calling create_log_reference () in the ctor or in ::init()
+ // leads to an infinate loop. This should be removed when that
+ // is fixed.
+ if (CORBA::is_nil (this->log_.in ()))
+ {
+ this->log_ = logmgr_i_.create_log_reference (this->logid_
+ ACE_ENV_ARG_PARAMETER);
+ ACE_CHECK;
+ }
+
+ notifier_->threshold_alarm (
+ this->log_.in (),
+ logid_,
+ this->thresholds_[this->current_threshold_],
+ percent,
+ severity
+ ACE_ENV_ARG_PARAMETER);
+ ACE_CHECK;
+ }
+ else
+ {
+ if (TAO_debug_level > 0)
+ ACE_DEBUG ((LM_DEBUG,
+ "threshold of %d breached\n",
+ this->thresholds_[this->current_threshold_]));
+ }
+
+ ++this->current_threshold_;
+ }
+
+ // "When a log object is created with the wrap option, the
+ // capacity threshold alarms are triggered as if coupled to a
+ // gauge that counts from zero to the highest capacity threshold
+ // value defined and then resets to zero."
+ if (log_full_action == DsLogAdmin::wrap
+ && this->current_threshold_ == this->thresholds_.length ())
+ {
+ this->recordstore_->reset_gauge ();
+ this->current_threshold_ = 0;
+ }
+ }
+}
+
+void
+TAO_Log_i::reset_capacity_alarm_threshold (ACE_ENV_SINGLE_ARG_DECL)
+ ACE_THROW_SPEC ((CORBA::SystemException))
+{
+ const CORBA::ULongLong max_size =
+ this->recordstore_->get_max_size (ACE_ENV_SINGLE_ARG_PARAMETER);
+ ACE_CHECK;
+
+ if (max_size != 0 && this->thresholds_.length() > 0)
+ {
+ const DsLogAdmin::LogFullActionType log_full_action =
+ this->recordstore_->get_log_full_action (ACE_ENV_SINGLE_ARG_PARAMETER);
+ ACE_CHECK;
+
+ if (log_full_action == DsLogAdmin::halt)
+ {
+ const CORBA::ULongLong current_size =
+ this->recordstore_->get_current_size (ACE_ENV_SINGLE_ARG_PARAMETER);
+ ACE_CHECK;
+
+ const CORBA::UShort percent =
+ static_cast<CORBA::UShort> ((((double) ACE_UINT64_DBLCAST_ADAPTER (current_size * 100U)) /
+ (double) ACE_UINT64_DBLCAST_ADAPTER (max_size)));
+
+ this->current_threshold_ = 0;
+
+ while (this->current_threshold_ < this->thresholds_.length ()
+ && this->thresholds_[this->current_threshold_] <= percent)
+ ++this->current_threshold_;
+ }
+ }
+}
+
+CORBA::Boolean
+TAO_Log_i::validate_capacity_alarm_thresholds (
+ const DsLogAdmin::CapacityAlarmThresholdList & threshs
+ ACE_ENV_ARG_DECL_NOT_USED)
+ ACE_THROW_SPEC ((CORBA::SystemException))
+{
+ for (CORBA::ULong i = 0; i < threshs.length (); i++)
+ if (threshs[i] > 100)
+ return false;
+
+ // @@ The current revision of the specification (formal/03-07-01)
+ // does not require theshold values be in order or unique. This
+ // appears to be an TAO TLS implementation artifact for efficent
+ // threshold checks. We could eliminate this restriction by
+ // normalizing the sequence.
+
+ if (threshs.length () > 1)
+ for (CORBA::ULong i = 0; i < threshs.length () - 1; i++)
+ if (threshs[i] >= threshs[i + 1])
+ return false;
+
+ return true;
+}
+
+void
+TAO_Log_i::reset_log_qos (const DsLogAdmin::QoSList& qos
+ ACE_ENV_ARG_DECL_NOT_USED)
+{
+ // @@ The current revision of the specification (formal/03-07-01)
+ // does not clearly define the semantics to follow when the QoSList
+ // contains mutually exclusive, unsupported, or unknown properties.
+ // I have submitted a defect report to the OMG for clarification.
+ //
+ // In the mean time, the last property found in the QoSList takes
+ // presidence.
+ // --jtc
+
+ DsLogAdmin::QoSType qostype = DsLogAdmin::QoSNone;
+
+ for (CORBA::ULong i = 0; i < qos.length (); ++i)
+ {
+ qostype = qos[i];
+ }
+
+ this->qostype_ = qostype;
+
+ if (this->qostype_ == DsLogAdmin::QoSFlush)
+ this->log_flush_handler_.schedule ();
+ else
+ this->log_flush_handler_.cancel ();
+}
+
+void
+TAO_Log_i::validate_log_qos (const DsLogAdmin::QoSList& qos
+ ACE_ENV_ARG_DECL)
+ ACE_THROW_SPEC ((DsLogAdmin::UnsupportedQoS))
+{
+ DsLogAdmin::QoSList denied;
+
+ // validate properties..
+ for (CORBA::ULong i = 0; i < qos.length (); ++i)
+ {
+ DsLogAdmin::QoSType qostype = qos[i];
+ if (qostype != DsLogAdmin::QoSNone &&
+ qostype != DsLogAdmin::QoSFlush &&
+ qostype != DsLogAdmin::QoSReliability)
+ {
+ CORBA::ULong len = denied.length();
+ denied.length(len + 1);
+ denied[len] = qostype;
+ }
+ }
+
+ // if there were any unknown/unsupported properties, thrown an
+ // exception.
+ if (denied.length() != 0)
+ {
+ ACE_THROW (DsLogAdmin::UnsupportedQoS (denied));
+ }
+}
+
+void
+TAO_Log_i::reset_week_mask (const DsLogAdmin::WeekMask& masks
+ ACE_ENV_ARG_DECL_NOT_USED)
+{
+ CORBA::ULong count = 0;
+ weekly_intervals_.length (100);
+
+ // convert the weekmask into a sequence of time intervals.
+ for (CORBA::ULong k = 0; k < masks.length (); ++k)
+ {
+ for (CORBA::ULong j = 0; j < masks[k].intervals.length (); ++j)
+ {
+ for (int d = 0; d < 7; ++d)
+ {
+ if ( (1 << d) & masks[k].days)
+ {
+ DsLogAdmin::TimeInterval temp_interval;
+
+ temp_interval.start =
+ CORBA::ULongLong (
+ (d * 3600* 24) +
+ (masks[k].intervals[j].start.hour * 3600) +
+ (masks[k].intervals[j].start.minute * 60)) * 10000000;
+
+ temp_interval.stop =
+ CORBA::ULongLong (
+ (d * 3600* 24) +
+ (masks[k].intervals[j].stop.hour * 3600) +
+ (masks[k].intervals[j].stop.minute * 60)) * 10000000;
+
+ weekly_intervals_[count] = temp_interval;
+ ++count;
+ }
+ }
+ }
+ }
+ weekly_intervals_.length (count);
+
+ //TODO: SORT AND CLEAN
+}
+
+void
+TAO_Log_i::validate_week_mask (const DsLogAdmin::WeekMask& masks
+ ACE_ENV_ARG_DECL)
+ ACE_THROW_SPEC ((DsLogAdmin::InvalidTime,
+ DsLogAdmin::InvalidTimeInterval,
+ DsLogAdmin::InvalidMask))
+{
+ for (CORBA::ULong i = 0; i < masks.length (); ++i)
+ {
+ if (masks[i].days > (DsLogAdmin::Sunday +
+ DsLogAdmin::Monday +
+ DsLogAdmin::Tuesday +
+ DsLogAdmin::Wednesday +
+ DsLogAdmin::Thursday +
+ DsLogAdmin::Friday +
+ DsLogAdmin::Saturday)
+ )
+ ACE_THROW (DsLogAdmin::InvalidMask ());
+
+ for (CORBA::ULong j = 0; j < masks[i].intervals.length (); ++j)
+ {
+ if (masks[i].intervals[j].start.hour > 23 ||
+ masks[i].intervals[j].start.minute > 59 ||
+ masks[i].intervals[j].stop.hour > 23 ||
+ masks[i].intervals[j].stop.minute > 59)
+ ACE_THROW (DsLogAdmin::InvalidTime ());
+
+ if (masks[i].intervals[j].stop.hour <
+ masks[i].intervals[j].start.hour)
+ ACE_THROW (DsLogAdmin::InvalidTimeInterval ());
+
+ if (masks[i].intervals[j].stop.hour ==
+ masks[i].intervals[j].start.hour &&
+ masks[i].intervals[j].stop.minute <=
+ masks[i].intervals[j].start.minute)
+ ACE_THROW (DsLogAdmin::InvalidTimeInterval ());
+ }
+ }
+}
+
+
+bool
+operator==(const DsLogAdmin::CapacityAlarmThresholdList& rhs,
+ const DsLogAdmin::CapacityAlarmThresholdList& lhs)
+{
+ const CORBA::ULong length = rhs.length ();
+
+ if (length != lhs.length ())
+ {
+ return false;
+ }
+
+ for (CORBA::ULong i = 0; i < length; ++i)
+ {
+ if (rhs[i] != lhs[i])
+ {
+ return false;
+ }
+ }
+
+ return true;
+}
+
+bool
+operator!=(const DsLogAdmin::CapacityAlarmThresholdList& rhs,
+ const DsLogAdmin::CapacityAlarmThresholdList& lhs)
+{
+ return !(lhs == rhs);
+}
+
+
+bool
+operator==(const DsLogAdmin::IntervalsOfDay& rhs,
+ const DsLogAdmin::IntervalsOfDay& lhs)
+{
+ const CORBA::ULong length = rhs.length ();
+
+ if (length != lhs.length ())
+ {
+ return false;
+ }
+
+ for (CORBA::ULong i = 0; i < length; ++i)
+ {
+ if (rhs[i] != lhs[i])
+ {
+ return false;
+ }
+ }
+
+ return true;
+}
+
+bool
+operator!=(const DsLogAdmin::IntervalsOfDay& rhs,
+ const DsLogAdmin::IntervalsOfDay& lhs)
+{
+ return !(lhs == rhs);
+}
+
+
+bool
+operator==(const DsLogAdmin::QoSList& rhs,
+ const DsLogAdmin::QoSList& lhs)
+{
+ const CORBA::ULong length = rhs.length ();
+
+ if (length != lhs.length ())
+ {
+ return false;
+ }
+
+ for (CORBA::ULong i = 0; i < length; ++i)
+ {
+ if (rhs[i] != lhs[i])
+ {
+ return false;
+ }
+ }
+
+ return true;
+}
+
+bool
+operator!=(const DsLogAdmin::QoSList& rhs,
+ const DsLogAdmin::QoSList& lhs)
+{
+ return !(lhs == rhs);
+}
+
+
+bool
+operator==(const DsLogAdmin::Time24& rhs,
+ const DsLogAdmin::Time24& lhs)
+{
+ return (rhs.hour == lhs.hour &&
+ rhs.minute == lhs.minute);
+}
+
+bool
+operator!=(const DsLogAdmin::Time24& rhs,
+ const DsLogAdmin::Time24& lhs)
+{
+ return !(lhs == rhs);
+}
+
+
+bool
+operator==(const DsLogAdmin::Time24Interval& rhs,
+ const DsLogAdmin::Time24Interval& lhs)
+{
+ return (rhs.start == lhs.start &&
+ rhs.stop == lhs.stop);
+}
+
+bool
+operator!=(const DsLogAdmin::Time24Interval& rhs,
+ const DsLogAdmin::Time24Interval& lhs)
+{
+ return !(lhs == rhs);
+}
+
+
+bool
+operator==(const DsLogAdmin::TimeInterval& rhs,
+ const DsLogAdmin::TimeInterval& lhs)
+{
+ return (rhs.start == lhs.start &&
+ rhs.stop == lhs.stop);
+}
+
+bool
+operator!=(const DsLogAdmin::TimeInterval& rhs,
+ const DsLogAdmin::TimeInterval& lhs)
+{
+ return !(lhs == rhs);
+}
+
+
+bool
+operator==(const DsLogAdmin::WeekMaskItem& rhs,
+ const DsLogAdmin::WeekMaskItem& lhs)
+{
+ return (rhs.days == lhs.days &&
+ rhs.intervals == lhs.intervals);
+}
+
+bool
+operator!=(const DsLogAdmin::WeekMaskItem& rhs,
+ const DsLogAdmin::WeekMaskItem& lhs)
+{
+ return !(lhs == rhs);
+}
+
+
+bool
+operator==(const DsLogAdmin::WeekMask& rhs,
+ const DsLogAdmin::WeekMask& lhs)
+{
+ const CORBA::ULong length = rhs.length ();
+
+ if (length != lhs.length ())
+ {
+ return false;
+ }
+
+ for (CORBA::ULong i = 0; i < length; ++i)
+ {
+ if (rhs[i] != lhs[i])
+ {
+ return false;
+ }
+ }
+
+ return true;
+}
+
+bool
+operator!=(const DsLogAdmin::WeekMask& rhs,
+ const DsLogAdmin::WeekMask& lhs)
+{
+ return !(lhs == rhs);
+}
+
+TAO_END_VERSIONED_NAMESPACE_DECL
diff --git a/TAO/orbsvcs/orbsvcs/Log/Log_i.h b/TAO/orbsvcs/orbsvcs/Log/Log_i.h
new file mode 100644
index 00000000000..38d0ffa0e54
--- /dev/null
+++ b/TAO/orbsvcs/orbsvcs/Log/Log_i.h
@@ -0,0 +1,509 @@
+// -*- C++ -*-
+
+//=============================================================================
+/**
+ * @file Log_i.h
+ *
+ * $Id$
+ *
+ * Implementation of the DsLogAdmin::Log interface.
+ *
+ * @author Matthew Braun <mjb2@cs.wustl.edu>
+ * @author Pradeep Gore <pradeep@cs.wustl.edu>
+ * @author David A. Hanvey <d.hanvey@qub.ac.uk>
+ */
+//=============================================================================
+
+
+#ifndef TAO_TLS_LOG_I_H
+#define TAO_TLS_LOG_I_H
+
+#include /**/ "ace/pre.h"
+
+#include "orbsvcs/Log/LogRecordStore.h"
+
+#if !defined (ACE_LACKS_PRAGMA_ONCE)
+# pragma once
+#endif /* ACE_LACKS_PRAGMA_ONCE */
+
+#include "orbsvcs/Log/Log_Compaction_Handler.h"
+#include "orbsvcs/Log/Log_Flush_Handler.h"
+#include "orbsvcs/Log/LogNotification.h"
+#include "orbsvcs/Log/LogRecordStore.h"
+#include "orbsvcs/DsLogAdminS.h"
+#include "ace/Reactor.h"
+#include "orbsvcs/Log/log_serv_export.h"
+
+TAO_BEGIN_VERSIONED_NAMESPACE_DECL
+
+class TAO_LogMgr_i;
+
+/**
+ * @class TAO_Log_i
+ *
+ * @brief Used to log events to a logging server
+ *
+ * This implementation attempts to conform to the telecom
+ * logging specification.
+ */
+class TAO_Log_Serv_Export TAO_Log_i : public virtual POA_DsLogAdmin::Log
+{
+
+public:
+
+ /// Constructor.
+ TAO_Log_i (CORBA::ORB_ptr orb,
+ TAO_LogMgr_i& logmgr_i,
+ DsLogAdmin::LogMgr_ptr factory,
+ DsLogAdmin::LogId id,
+ TAO_LogNotification *log_notifier);
+
+ /// Destructor.
+ ~TAO_Log_i ();
+
+ /// Initlialize the Log.
+ void init (ACE_ENV_SINGLE_ARG_DECL);
+
+ /**
+ * @name DsLogAdmin::Log Methods
+ *
+ * DsLogAdmin::Log methods.
+ */
+ //@{
+ /// Return the factory of the log.
+ DsLogAdmin::LogMgr_ptr my_factory (ACE_ENV_SINGLE_ARG_DECL)
+ ACE_THROW_SPEC ((CORBA::SystemException));
+
+ /// Return the id of the log.
+ DsLogAdmin::LogId id (ACE_ENV_SINGLE_ARG_DECL)
+ ACE_THROW_SPEC ((CORBA::SystemException));
+
+ /// Get the list of the QoS properties supported by the log.
+ DsLogAdmin::QoSList*
+ get_log_qos (ACE_ENV_SINGLE_ARG_DECL)
+ ACE_THROW_SPEC ((CORBA::SystemException));
+
+ /// Set the list of the QoS properties supported by the log.
+ void set_log_qos (const DsLogAdmin::QoSList & qos
+ ACE_ENV_ARG_DECL)
+ ACE_THROW_SPEC ((CORBA::SystemException,
+ DsLogAdmin::UnsupportedQoS));
+
+ /// Get the record life in seconds (0 infinite).
+ CORBA::ULong
+ get_max_record_life (ACE_ENV_SINGLE_ARG_DECL)
+ ACE_THROW_SPEC ((CORBA::SystemException));
+
+ /// Set the record life in seconds (0 infinite).
+ void
+ set_max_record_life (CORBA::ULong life
+ ACE_ENV_ARG_DECL)
+ ACE_THROW_SPEC ((CORBA::SystemException));
+
+ /// Get the maximum size in octets.
+ CORBA::ULongLong
+ get_max_size (ACE_ENV_SINGLE_ARG_DECL)
+ ACE_THROW_SPEC ((CORBA::SystemException));
+
+ /// Set the maximum size in octets.
+ void
+ set_max_size (CORBA::ULongLong size
+ ACE_ENV_ARG_DECL)
+ ACE_THROW_SPEC ((CORBA::SystemException,
+ DsLogAdmin::InvalidParam));
+
+ /// Get the current size of the log in octets.
+ CORBA::ULongLong
+ get_current_size (ACE_ENV_SINGLE_ARG_DECL)
+ ACE_THROW_SPEC ((CORBA::SystemException));
+
+ /// Return the number of records in the log.
+ CORBA::ULongLong
+ get_n_records (ACE_ENV_SINGLE_ARG_DECL)
+ ACE_THROW_SPEC ((CORBA::SystemException));
+
+ /// Get the action to be taken when the log reaches its maximum size.
+ DsLogAdmin::LogFullActionType
+ get_log_full_action (ACE_ENV_SINGLE_ARG_DECL)
+ ACE_THROW_SPEC ((CORBA::SystemException));
+
+ /// Set the action to be taken when the log reaches its maximum size.
+ void
+ set_log_full_action (DsLogAdmin::LogFullActionType action
+ ACE_ENV_ARG_DECL)
+ ACE_THROW_SPEC ((CORBA::SystemException,
+ DsLogAdmin::InvalidLogFullAction));
+
+ /// Get the administrative state of the log.
+ DsLogAdmin::AdministrativeState
+ get_administrative_state (ACE_ENV_SINGLE_ARG_DECL)
+ ACE_THROW_SPEC ((CORBA::SystemException));
+
+ /// Set the administrative state of the log.
+ void
+ set_administrative_state (DsLogAdmin::AdministrativeState state
+ ACE_ENV_ARG_DECL)
+ ACE_THROW_SPEC ((CORBA::SystemException));
+
+ /// Get the forwarding state of the log.
+ /// @@ Note: is it ok to make this method virtual?
+ /// @@@ Of course! get_forwarding_state() is virtual in the base
+ /// class dictated by the IDL! -Ossama
+ virtual DsLogAdmin::ForwardingState
+ get_forwarding_state (ACE_ENV_SINGLE_ARG_DECL)
+ ACE_THROW_SPEC ((CORBA::SystemException));
+
+ /// Set the forwarding state of the log.
+ /// @@ Note: is it ok to make this method virtual?
+ void
+ set_forwarding_state (DsLogAdmin::ForwardingState state
+ ACE_ENV_ARG_DECL)
+ ACE_THROW_SPEC ((CORBA::SystemException));
+
+ /// Get the operational state of the log.
+ DsLogAdmin::OperationalState
+ get_operational_state (ACE_ENV_SINGLE_ARG_DECL)
+ ACE_THROW_SPEC ((CORBA::SystemException));
+
+ /// Get the log duration
+ DsLogAdmin::TimeInterval
+ get_interval (ACE_ENV_SINGLE_ARG_DECL)
+ ACE_THROW_SPEC ((CORBA::SystemException));
+
+ /// Set the log duration.
+ void
+ set_interval (const DsLogAdmin::TimeInterval & interval
+ ACE_ENV_ARG_DECL)
+ ACE_THROW_SPEC ((CORBA::SystemException,
+ DsLogAdmin::InvalidTime,
+ DsLogAdmin::InvalidTimeInterval));
+
+ /// Get the availability status
+ DsLogAdmin::AvailabilityStatus
+ get_availability_status (ACE_ENV_SINGLE_ARG_DECL)
+ ACE_THROW_SPEC ((CORBA::SystemException));
+
+ /// Get the capacity alarm threshold
+ DsLogAdmin::CapacityAlarmThresholdList*
+ get_capacity_alarm_thresholds (ACE_ENV_SINGLE_ARG_DECL)
+ ACE_THROW_SPEC ((CORBA::SystemException));
+
+ /**
+ * Set the capacity alarm threshold. Threshold values represent
+ * percentage levels at which the log should emit events to signal
+ * that a log full or log wrap condition is approaching. If the log
+ * is set to wrap, the thresholds are relative to the log size
+ * between wraps (after a wrap, the percentage full resets to
+ * 0).
+ */
+ void
+ set_capacity_alarm_thresholds
+ (const DsLogAdmin::CapacityAlarmThresholdList & threshs
+ ACE_ENV_ARG_DECL)
+ ACE_THROW_SPEC ((CORBA::SystemException,
+ DsLogAdmin::InvalidThreshold));
+
+ /// Get the weekly scheduling parameters
+ DsLogAdmin::WeekMask*
+ get_week_mask (ACE_ENV_SINGLE_ARG_DECL)
+ ACE_THROW_SPEC ((CORBA::SystemException));
+
+ /// Set the weekly scheduling parameters.
+ void
+ set_week_mask (const DsLogAdmin::WeekMask & masks
+ ACE_ENV_ARG_DECL)
+ ACE_THROW_SPEC ((CORBA::SystemException,
+ DsLogAdmin::InvalidTime,
+ DsLogAdmin::InvalidTimeInterval,
+ DsLogAdmin::InvalidMask));
+
+ /// Returns all records in the log that match the given constraint
+ /// <c>.
+ DsLogAdmin::RecordList*
+ query (const char * grammar,
+ const char * c,
+ DsLogAdmin::Iterator_out i
+ ACE_ENV_ARG_DECL)
+ ACE_THROW_SPEC ((CORBA::SystemException,
+ DsLogAdmin::InvalidGrammar,
+ DsLogAdmin::InvalidConstraint));
+
+ /// Retrieve <how_many> records from time <from_time> using iterator
+ /// <i>.
+ DsLogAdmin::RecordList*
+ retrieve (DsLogAdmin::TimeT from_time,
+ CORBA::Long how_many,
+ DsLogAdmin::Iterator_out i
+ ACE_ENV_ARG_DECL)
+ ACE_THROW_SPEC ((CORBA::SystemException));
+
+ /// Returns the number of records matching constraint <c>.
+ CORBA::ULong
+ match (const char * grammar,
+ const char * c
+ ACE_ENV_ARG_DECL)
+ ACE_THROW_SPEC ((CORBA::SystemException,
+ DsLogAdmin::InvalidGrammar,
+ DsLogAdmin::InvalidConstraint));
+
+ /// Delete records matching constraint <c>.
+ CORBA::ULong
+ delete_records (const char * grammar,
+ const char * c
+ ACE_ENV_ARG_DECL)
+ ACE_THROW_SPEC ((CORBA::SystemException,
+ DsLogAdmin::InvalidGrammar,
+ DsLogAdmin::InvalidConstraint));
+
+ /// Delete records matching ids in <ids>
+ CORBA::ULong
+ delete_records_by_id (const DsLogAdmin::RecordIdList & ids
+ ACE_ENV_ARG_DECL)
+ ACE_THROW_SPEC ((CORBA::SystemException));
+
+
+ /// Write records to the log storage.
+ void
+ write_records (const DsLogAdmin::Anys & records
+ ACE_ENV_ARG_DECL)
+ ACE_THROW_SPEC ((CORBA::SystemException,
+ DsLogAdmin::LogFull,
+ DsLogAdmin::LogOffDuty,
+ DsLogAdmin::LogLocked,
+ DsLogAdmin::LogDisabled));
+
+ /// Write a list of record ids to storage. Raises DsLogAdmin::LogFull
+ /// and DsLogAdmin::LogLocked
+ void
+ write_recordlist (const DsLogAdmin::RecordList & list
+ ACE_ENV_ARG_DECL)
+ ACE_THROW_SPEC ((CORBA::SystemException,
+ DsLogAdmin::LogFull,
+ DsLogAdmin::LogOffDuty,
+ DsLogAdmin::LogLocked,
+ DsLogAdmin::LogDisabled));
+
+ /// Set single record attributes.
+ void
+ set_record_attribute (DsLogAdmin::RecordId id,
+ const DsLogAdmin::NVList & attr_list
+ ACE_ENV_ARG_DECL)
+ ACE_THROW_SPEC ((CORBA::SystemException,
+ DsLogAdmin::InvalidRecordId,
+ DsLogAdmin::InvalidAttribute));
+
+ /// Set the attributes of all records that matches the
+ /// constraints with same attr_list.
+ CORBA::ULong
+ set_records_attribute (const char * grammar,
+ const char * c,
+ const DsLogAdmin::NVList & attr_list
+ ACE_ENV_ARG_DECL)
+ ACE_THROW_SPEC ((CORBA::SystemException,
+ DsLogAdmin::InvalidGrammar,
+ DsLogAdmin::InvalidConstraint,
+ DsLogAdmin::InvalidAttribute));
+
+ /// Get the attributes of the record with id <id>. Raises
+ /// DsLogAdmin::InvalidRecordId
+ DsLogAdmin::NVList*
+ get_record_attribute (DsLogAdmin::RecordId id
+ ACE_ENV_ARG_DECL)
+ ACE_THROW_SPEC ((CORBA::SystemException,
+ DsLogAdmin::InvalidRecordId));
+
+ /// Causes all pending events to be written to storage. Raises
+ /// DsLogAdmin::UnsupportedQos
+ void
+ flush (ACE_ENV_SINGLE_ARG_DECL)
+ ACE_THROW_SPEC ((CORBA::SystemException,
+ DsLogAdmin::UnsupportedQoS));
+ //@}
+
+ /// Remove records that have exceeded max_record_life_.
+ void remove_old_records (ACE_ENV_SINGLE_ARG_DECL)
+ ACE_THROW_SPEC ((CORBA::SystemException));
+
+protected:
+ /// Get the availability status
+ /// @note must be called with locks held
+ DsLogAdmin::AvailabilityStatus
+ get_availability_status_i (ACE_ENV_SINGLE_ARG_DECL)
+ ACE_THROW_SPEC ((CORBA::SystemException));
+
+ /// Tells if the Log is scheduled to run now.
+ /// @note must be called with locks held
+ CORBA::Boolean scheduled (ACE_ENV_SINGLE_ARG_DECL)
+ ACE_THROW_SPEC ((CORBA::SystemException));
+
+ /// Copy the attributes of the log being passed.
+ void copy_attributes (DsLogAdmin::Log_ptr log
+ ACE_ENV_ARG_DECL)
+ ACE_THROW_SPEC ((CORBA::SystemException));
+
+ /// Check if threshold reached.
+ void check_capacity_alarm_threshold (ACE_ENV_SINGLE_ARG_DECL)
+ ACE_THROW_SPEC ((CORBA::SystemException));
+
+ /// Reset capacity alarm threshold.
+ void reset_capacity_alarm_threshold (ACE_ENV_SINGLE_ARG_DECL)
+ ACE_THROW_SPEC ((CORBA::SystemException));
+
+ /// Check that valid threshold values have been given.
+ static CORBA::Boolean validate_capacity_alarm_thresholds (
+ const DsLogAdmin::CapacityAlarmThresholdList & threshs
+ ACE_ENV_ARG_DECL)
+ ACE_THROW_SPEC ((CORBA::SystemException));
+
+ /// Reset Log QoS
+ void reset_log_qos (const DsLogAdmin::QoSList& qos
+ ACE_ENV_ARG_DECL);
+
+ /// Validate log QoS
+ void validate_log_qos (const DsLogAdmin::QoSList& qos
+ ACE_ENV_ARG_DECL)
+ ACE_THROW_SPEC ((DsLogAdmin::UnsupportedQoS));
+
+ /// Reset Week Mask
+ ///
+ /// Used to initialize internal data structures that represent the
+ /// week mask list when the log service starts, and to reinitialize
+ /// them when they are changed.
+ ///
+ void reset_week_mask (const DsLogAdmin::WeekMask& masks
+ ACE_ENV_ARG_DECL);
+
+ /// Validate Week Mask
+ ///
+ /// Used to check whether week mask is valid. If not, throws an
+ /// InvalidTime, InvalidTimeInterval, or InvalidMask exception.
+ ///
+ void validate_week_mask (const DsLogAdmin::WeekMask& masks
+ ACE_ENV_ARG_DECL)
+ ACE_THROW_SPEC ((DsLogAdmin::InvalidTime,
+ DsLogAdmin::InvalidTimeInterval,
+ DsLogAdmin::InvalidMask));
+
+protected:
+ /// Reference to the LogMgr servant
+ TAO_LogMgr_i& logmgr_i_;
+
+ /// The log's object reference
+ DsLogAdmin::Log_var log_;
+
+ /// The log's factory's object reference
+ DsLogAdmin::LogMgr_var factory_;
+
+ /// The log's id
+ DsLogAdmin::LogId logid_;
+
+ /// The log's operational state
+ DsLogAdmin::OperationalState op_state_;
+
+ /// The log's availability status
+ DsLogAdmin::AvailabilityStatus avail_status_;
+
+ /// The list of points at which the log should generate events
+ /// indicating approaching full capacity
+ DsLogAdmin::CapacityAlarmThresholdList thresholds_;
+
+ /// The next capacity alarm threshold.
+ CORBA::ULong current_threshold_;
+
+ /// A Sequence of the weekly intervals when the log is in operation.
+ DsLogAdmin::TimeIntervalSeq weekly_intervals_;
+
+ /// The QoS type of the log
+ DsLogAdmin::QoSType qostype_;
+
+ /// The reactor used for timing (startup and shutdown), etc
+ ACE_Reactor *reactor_;
+
+ /// The storage for all the records
+ TAO_LogRecordStore* recordstore_;
+
+ /// For sending Log Generated events.
+ TAO_LogNotification* notifier_;
+
+ /// Log Compaction Handler
+ TAO_Log_Compaction_Handler log_compaction_handler_;
+
+ /// Log Compaction Interval
+ static const ACE_Time_Value log_compaction_interval_;
+
+ /// Log Flush Handler
+ TAO_Log_Flush_Handler log_flush_handler_;
+
+ /// Log Flush Interval
+ static const ACE_Time_Value log_flush_interval_;
+};
+
+bool TAO_Log_Serv_Export
+operator==(const DsLogAdmin::CapacityAlarmThresholdList& rhs,
+ const DsLogAdmin::CapacityAlarmThresholdList& lhs);
+
+bool TAO_Log_Serv_Export
+operator!=(const DsLogAdmin::CapacityAlarmThresholdList& rhs,
+ const DsLogAdmin::CapacityAlarmThresholdList& lhs);
+
+bool TAO_Log_Serv_Export
+operator==(const DsLogAdmin::IntervalsOfDay& rhs,
+ const DsLogAdmin::IntervalsOfDay& lhs);
+
+bool TAO_Log_Serv_Export
+operator!=(const DsLogAdmin::IntervalsOfDay& rhs,
+ const DsLogAdmin::IntervalsOfDay& lhs);
+
+bool TAO_Log_Serv_Export
+operator==(const DsLogAdmin::QoSList& rhs,
+ const DsLogAdmin::QoSList& lhs);
+
+bool TAO_Log_Serv_Export
+operator!=(const DsLogAdmin::QoSList& rhs,
+ const DsLogAdmin::QoSList& lhs);
+
+bool TAO_Log_Serv_Export
+operator==(const DsLogAdmin::Time24& rhs,
+ const DsLogAdmin::Time24& lhs);
+
+bool TAO_Log_Serv_Export
+operator!=(const DsLogAdmin::Time24& rhs,
+ const DsLogAdmin::Time24& lhs);
+
+bool TAO_Log_Serv_Export
+operator==(const DsLogAdmin::Time24Interval& rhs,
+ const DsLogAdmin::Time24Interval& lhs);
+
+bool TAO_Log_Serv_Export
+operator!=(const DsLogAdmin::Time24Interval& rhs,
+ const DsLogAdmin::Time24Interval& lhs);
+
+bool TAO_Log_Serv_Export
+operator==(const DsLogAdmin::TimeInterval& rhs,
+ const DsLogAdmin::TimeInterval& lhs);
+
+bool TAO_Log_Serv_Export
+operator!=(const DsLogAdmin::TimeInterval& rhs,
+ const DsLogAdmin::TimeInterval& lhs);
+
+bool TAO_Log_Serv_Export
+operator==(const DsLogAdmin::WeekMaskItem& rhs,
+ const DsLogAdmin::WeekMaskItem& lhs);
+
+bool TAO_Log_Serv_Export
+operator!=(const DsLogAdmin::WeekMaskItem& rhs,
+ const DsLogAdmin::WeekMaskItem& lhs);
+
+bool TAO_Log_Serv_Export
+operator==(const DsLogAdmin::WeekMask& rhs,
+ const DsLogAdmin::WeekMask& lhs);
+
+bool TAO_Log_Serv_Export
+operator!=(const DsLogAdmin::WeekMask& rhs,
+ const DsLogAdmin::WeekMask& lhs);
+
+TAO_END_VERSIONED_NAMESPACE_DECL
+
+#include /**/ "ace/post.h"
+
+#endif /* TAO_TLS_LOG_I_H */
diff --git a/TAO/orbsvcs/orbsvcs/Log/NotifyLogConsumer.cpp b/TAO/orbsvcs/orbsvcs/Log/NotifyLogConsumer.cpp
new file mode 100644
index 00000000000..97f1a9803f1
--- /dev/null
+++ b/TAO/orbsvcs/orbsvcs/Log/NotifyLogConsumer.cpp
@@ -0,0 +1,144 @@
+#include "orbsvcs/Log/NotifyLog_i.h"
+#include "orbsvcs/Log/LogMgr_i.h"
+#include "orbsvcs/Log/LogNotification.h"
+
+ACE_RCSID (Log,
+ NotifyLogConsumer,
+ "$Id$")
+
+TAO_BEGIN_VERSIONED_NAMESPACE_DECL
+
+TAO_Notify_LogConsumer::TAO_Notify_LogConsumer (TAO_NotifyLog_i *log)
+: log_ (log)
+{
+}
+
+TAO_Notify_LogConsumer::~TAO_Notify_LogConsumer (void)
+{
+}
+
+void
+TAO_Notify_LogConsumer::connect (
+ CosNotifyChannelAdmin::ConsumerAdmin_ptr consumer_admin
+ ACE_ENV_ARG_DECL)
+{
+ // Activate the consumer with the default_POA_
+ CosNotifyComm::PushConsumer_var objref =
+ this->_this (ACE_ENV_SINGLE_ARG_PARAMETER);
+ ACE_CHECK;
+
+ CosNotifyChannelAdmin::ProxySupplier_var proxysupplier =
+ consumer_admin->obtain_notification_push_supplier (CosNotifyChannelAdmin::ANY_EVENT, proxy_supplier_id_ ACE_ENV_ARG_PARAMETER);
+ ACE_CHECK;
+
+ ACE_ASSERT (!CORBA::is_nil (proxysupplier.in ()));
+
+ // narrow
+ this->proxy_supplier_ =
+ CosNotifyChannelAdmin::ProxyPushSupplier::
+ _narrow (proxysupplier.in () ACE_ENV_ARG_PARAMETER);
+ ACE_CHECK;
+
+ ACE_ASSERT (!CORBA::is_nil (proxy_supplier_.in ()));
+
+ proxy_supplier_->connect_any_push_consumer (objref.in ()
+ ACE_ENV_ARG_PARAMETER);
+ ACE_CHECK;
+
+}
+
+void
+TAO_Notify_LogConsumer::disconnect (ACE_ENV_SINGLE_ARG_DECL)
+{
+ this->proxy_supplier_->
+ disconnect_push_supplier(ACE_ENV_SINGLE_ARG_PARAMETER);
+ ACE_CHECK;
+}
+
+void
+TAO_Notify_LogConsumer::offer_change
+ (const CosNotification::EventTypeSeq & /*added*/,
+ const CosNotification::EventTypeSeq & /*removed*/
+ ACE_ENV_ARG_DECL_NOT_USED)
+ ACE_THROW_SPEC ((
+ CORBA::SystemException,
+ CosNotifyComm::InvalidEventType
+ ))
+{
+ // No-Op.
+}
+
+void
+TAO_Notify_LogConsumer::push
+ (const CORBA::Any& event
+ ACE_ENV_ARG_DECL)
+ ACE_THROW_SPEC ((
+ CORBA::SystemException,
+ CosEventComm::Disconnected
+ ))
+{
+ // create a record list...
+ DsLogAdmin::RecordList recList (1);
+ recList.length (1);
+
+ recList [0].info = event;
+
+ // @@ The current revision of the specification (formal/03-07-01)
+ // states:
+ //
+ // * When a push operation is invoked and a log is full, then a
+ // NO_RESOURCE (sic) SystemException is raised with a LOGFULL
+ // minor code.
+ //
+ // * When a push operation is invoked on a log that is off-duty,
+ // then a NO_RESOURCE (sic) SystemException is raised with a
+ // LOGOFFDUTY minor code.
+ //
+ // * When a push operation is invoked on a log that is locked, then
+ // a NO_PERMISSIONS (sic) SystemException is raised with a LOGLOCKED
+ // minor code.
+ //
+ // * When a push operation is invoked on a log that is disabled,
+ // then a TRANSIENT SystemException is raised with a LOGDISABLED
+ // minor code.
+ //
+ // But neither the Telecom Logging or the CORBA specification define
+ // the values for these minor codes.
+ //
+ // I have submitted a defect report to the OMG for clarification.
+ // --jtc
+ ACE_TRY
+ {
+ // log the RecordList.
+ this->log_->write_recordlist (recList ACE_ENV_ARG_PARAMETER);
+ ACE_TRY_CHECK;
+ }
+ ACE_CATCH (DsLogAdmin::LogFull, ex)
+ {
+ ACE_THROW (CORBA::NO_RESOURCES ());
+ }
+ ACE_CATCH (DsLogAdmin::LogOffDuty, ex)
+ {
+ ACE_THROW (CORBA::NO_RESOURCES ());
+ }
+ ACE_CATCH (DsLogAdmin::LogLocked, ex)
+ {
+ ACE_THROW (CORBA::NO_PERMISSION ());
+ }
+ ACE_CATCH (DsLogAdmin::LogDisabled, ex)
+ {
+ ACE_THROW (CORBA::TRANSIENT ());
+ }
+ ACE_ENDTRY;
+}
+
+void
+TAO_Notify_LogConsumer::disconnect_push_consumer
+ (ACE_ENV_SINGLE_ARG_DECL_NOT_USED)
+ ACE_THROW_SPEC ((
+ CORBA::SystemException
+ ))
+{
+}
+
+TAO_END_VERSIONED_NAMESPACE_DECL
diff --git a/TAO/orbsvcs/orbsvcs/Log/NotifyLogConsumer.h b/TAO/orbsvcs/orbsvcs/Log/NotifyLogConsumer.h
new file mode 100644
index 00000000000..c464e91f8d4
--- /dev/null
+++ b/TAO/orbsvcs/orbsvcs/Log/NotifyLogConsumer.h
@@ -0,0 +1,117 @@
+// -*- C++ -*-
+
+//=============================================================================
+/**
+ * @file NotifyLogConsumer.h
+ *
+ * $Id$
+ *
+ * The NotifyLogConsumer connects to the NotifyLog and logs the events
+ * that are pushed to the NotifyLog.
+ *
+ * @author David A. Hanvey <d.hanvey@qub.ac.uk>
+ */
+//=============================================================================
+
+#ifndef TAO_TLS_NOTIFYLOGCONSUMER_H
+#define TAO_TLS_NOTIFYLOGCONSUMER_H
+
+#include /**/ "ace/pre.h"
+
+#include "orbsvcs/DsLogAdminS.h"
+
+#if !defined (ACE_LACKS_PRAGMA_ONCE)
+# pragma once
+#endif /* ACE_LACKS_PRAGMA_ONCE */
+
+#include "orbsvcs/DsNotifyLogAdminS.h"
+#include "orbsvcs/Log/Log_i.h"
+
+#include "orbsvcs/Log/notifylog_serv_export.h"
+
+#if defined(_MSC_VER)
+#pragma warning(push)
+#pragma warning(disable:4250)
+#endif /* _MSC_VER */
+
+TAO_BEGIN_VERSIONED_NAMESPACE_DECL
+
+class TAO_LogMgr_i;
+class TAO_NotifyLog_i;
+class TAO_NotifyLogFactory_i;
+
+/**
+ * @class TAO_Notify_LogConsumer
+ *
+ * @brief An implementation of the PushConsumer interface.
+ *
+ * Connects to the NotifyLog and writes LogRecords to the
+ * Log when events are 'pushed' to the NotifyLog which is an
+ * EventChannel.
+ */
+class TAO_Notify_LogConsumer :
+ public virtual POA_CosNotifyComm::PushConsumer
+{
+public:
+ // = Initialization and Termination methods.
+
+ /// Constructor.
+ TAO_Notify_LogConsumer (TAO_NotifyLog_i *log);
+
+ /// Connect to NotifyLog.
+ void connect (CosNotifyChannelAdmin::ConsumerAdmin_ptr consumer_admin ACE_ENV_ARG_DECL);
+
+ /// Disconnect from NotifyLog.
+ virtual void disconnect (ACE_ENV_SINGLE_ARG_DECL);
+
+protected:
+ /// Destructor.
+ virtual ~TAO_Notify_LogConsumer (void);
+
+ // = NotifyPublish method
+ virtual void offer_change (
+ const CosNotification::EventTypeSeq & added,
+ const CosNotification::EventTypeSeq & removed
+ ACE_ENV_ARG_DECL
+ )
+ ACE_THROW_SPEC ((
+ CORBA::SystemException,
+ CosNotifyComm::InvalidEventType
+ ));
+
+ // = PushSupplier methods
+ virtual void push (
+ const CORBA::Any & event
+ ACE_ENV_ARG_DECL
+ )
+ ACE_THROW_SPEC ((
+ CORBA::SystemException,
+ CosEventComm::Disconnected
+ ));
+
+ virtual void disconnect_push_consumer (
+ ACE_ENV_SINGLE_ARG_DECL
+ )
+ ACE_THROW_SPEC ((
+ CORBA::SystemException
+ ));
+
+ /// ProxyPushSupplier used to connect to NotifyLog.
+ CosNotifyChannelAdmin::ProxyPushSupplier_var proxy_supplier_;
+
+ /// The ID of the proxySupplier.
+ CosNotifyChannelAdmin::ProxyID proxy_supplier_id_;
+
+ /// The NotifyLog that this consumer connects to
+ /// and whose events are to be logged.
+ TAO_NotifyLog_i *log_;
+};
+
+TAO_END_VERSIONED_NAMESPACE_DECL
+
+#if defined(_MSC_VER)
+#pragma warning(pop)
+#endif /* _MSC_VER */
+
+#include /**/ "ace/post.h"
+#endif /* TAO_TLS_NOTIFYLOGCONSUMER_H */
diff --git a/TAO/orbsvcs/orbsvcs/Log/NotifyLogFactory_i.cpp b/TAO/orbsvcs/orbsvcs/Log/NotifyLogFactory_i.cpp
new file mode 100644
index 00000000000..32af058cd1c
--- /dev/null
+++ b/TAO/orbsvcs/orbsvcs/Log/NotifyLogFactory_i.cpp
@@ -0,0 +1,462 @@
+#include "orbsvcs/Log/NotifyLogFactory_i.h"
+#include "orbsvcs/Log/LogNotification.h"
+#include "orbsvcs/Log/NotifyLogNotification.h"
+#include "ace/OS_NS_stdio.h"
+
+ACE_RCSID (Log,
+ NotifyLogFactory_i,
+ "$Id$")
+
+TAO_BEGIN_VERSIONED_NAMESPACE_DECL
+
+TAO_NotifyLogFactory_i::TAO_NotifyLogFactory_i (void)
+{
+}
+
+TAO_NotifyLogFactory_i::TAO_NotifyLogFactory_i (CosNotifyChannelAdmin::EventChannelFactory_ptr ecf)
+: notify_factory_ (ecf)
+{
+ ACE_DECLARE_NEW_CORBA_ENV;
+
+ CosNotifyChannelAdmin::ChannelID id;
+ CosNotifyChannelAdmin::AdminID adminID = 0;
+ CosNotification::QoSProperties initial_qos;
+ CosNotification::AdminProperties initial_admin;
+
+ this->event_channel_ =
+ this->notify_factory_->create_channel (initial_qos,
+ initial_admin,
+ id
+ ACE_ENV_ARG_PARAMETER);
+
+ this->consumer_admin_ = this->event_channel_->new_for_consumers(CosNotifyChannelAdmin::OR_OP, adminID);
+
+ CosNotification::EventTypeSeq added(1);
+ CosNotification::EventTypeSeq removed (0);
+ added.length (1);
+ removed.length (0);
+
+ added[0].domain_name = CORBA::string_dup ("*");
+ added[0].type_name = CORBA::string_dup ("*");
+
+ this->consumer_admin_->subscription_change (added, removed ACE_ENV_ARG_PARAMETER);
+ ACE_CHECK;
+
+ ACE_NEW_THROW_EX (this->notifier_,
+ TAO_NotifyLogNotification(this->event_channel_.in ()),
+ CORBA::NO_MEMORY ());
+}
+
+TAO_NotifyLogFactory_i::~TAO_NotifyLogFactory_i()
+{
+ // No-Op.
+}
+
+DsNotifyLogAdmin::NotifyLogFactory_ptr
+TAO_NotifyLogFactory_i::activate (CORBA::ORB_ptr orb,
+ PortableServer::POA_ptr poa
+ ACE_ENV_ARG_DECL)
+{
+ TAO_LogMgr_i::init (orb, poa ACE_ENV_ARG_PARAMETER);
+ ACE_CHECK_RETURN (DsNotifyLogAdmin::NotifyLogFactory::_nil ());
+
+
+ PortableServer::ObjectId_var oid =
+ this->factory_poa_->activate_object (this
+ ACE_ENV_ARG_PARAMETER);
+ ACE_CHECK_RETURN (DsNotifyLogAdmin::NotifyLogFactory::_nil ());
+
+ CORBA::Object_var obj =
+ this->factory_poa_->id_to_reference (oid.in ()
+ ACE_ENV_ARG_PARAMETER);
+ ACE_CHECK_RETURN (DsNotifyLogAdmin::NotifyLogFactory::_nil ());
+
+ // narrow and store the result..
+ this->log_mgr_ =
+ DsLogAdmin::LogMgr::_narrow (obj.in ()
+ ACE_ENV_ARG_PARAMETER);
+ ACE_CHECK_RETURN (DsNotifyLogAdmin::NotifyLogFactory::_nil ());
+
+ DsNotifyLogAdmin::NotifyLogFactory_var v_return =
+ DsNotifyLogAdmin::NotifyLogFactory::_narrow (obj.in ()
+ ACE_ENV_ARG_PARAMETER);
+ ACE_CHECK_RETURN (DsNotifyLogAdmin::NotifyLogFactory::_nil ());
+
+ return v_return._retn ();
+}
+
+DsNotifyLogAdmin::NotifyLog_ptr
+TAO_NotifyLogFactory_i::create (
+ DsLogAdmin::LogFullActionType full_action,
+ CORBA::ULongLong max_size,
+ const DsLogAdmin::CapacityAlarmThresholdList & thresholds,
+ const CosNotification::QoSProperties & initial_qos,
+ const CosNotification::AdminProperties & initial_admin,
+ DsLogAdmin::LogId_out id_out
+ ACE_ENV_ARG_DECL
+ )
+ ACE_THROW_SPEC ((
+ CORBA::SystemException,
+ DsLogAdmin::InvalidLogFullAction,
+ DsLogAdmin::InvalidThreshold,
+ CosNotification::UnsupportedQoS,
+ CosNotification::UnsupportedAdmin
+ ))
+{
+ ACE_UNUSED_ARG (initial_qos);
+ ACE_UNUSED_ARG (initial_admin);
+
+ this->create_i (full_action,
+ max_size,
+ & thresholds,
+ id_out
+ ACE_ENV_ARG_PARAMETER);
+ ACE_CHECK_RETURN (DsNotifyLogAdmin::NotifyLog::_nil ());
+ DsLogAdmin::LogId id = id_out;
+
+#if (TAO_HAS_MINIMUM_POA == 0)
+ DsLogAdmin::Log_var log =
+ this->create_log_reference (id ACE_ENV_ARG_PARAMETER);
+ ACE_CHECK_RETURN (DsNotifyLogAdmin::NotifyLog::_nil ());
+#else
+ DsLogAdmin::Log_var log =
+ this->create_log_object (id ACE_ENV_ARG_PARAMETER);
+ ACE_CHECK_RETURN (DsNotifyLogAdmin::NotifyLog::_nil ());
+#endif
+
+ // narrow to NotifyLog
+ DsNotifyLogAdmin::NotifyLog_var notify_log =
+ DsNotifyLogAdmin::NotifyLog::_narrow (log.in ());
+
+ // @@ JTC - squelch exception?
+ notifier_->object_creation (id ACE_ENV_ARG_PARAMETER);
+ ACE_CHECK_RETURN (DsNotifyLogAdmin::NotifyLog::_nil ());
+
+ return notify_log._retn ();
+}
+
+DsNotifyLogAdmin::NotifyLog_ptr
+TAO_NotifyLogFactory_i::create_with_id (
+ DsLogAdmin::LogId id,
+ DsLogAdmin::LogFullActionType full_action,
+ CORBA::ULongLong max_size,
+ const DsLogAdmin::CapacityAlarmThresholdList & thresholds,
+ const CosNotification::QoSProperties & initial_qos,
+ const CosNotification::AdminProperties & initial_admin
+ ACE_ENV_ARG_DECL
+ )
+ ACE_THROW_SPEC ((
+ CORBA::SystemException,
+ DsLogAdmin::LogIdAlreadyExists,
+ DsLogAdmin::InvalidLogFullAction,
+ DsLogAdmin::InvalidThreshold,
+ CosNotification::UnsupportedQoS,
+ CosNotification::UnsupportedAdmin
+ ))
+{
+ ACE_UNUSED_ARG (initial_qos);
+ ACE_UNUSED_ARG (initial_admin);
+
+ this->create_with_id_i (id,
+ full_action,
+ max_size,
+ & thresholds
+ ACE_ENV_ARG_PARAMETER);
+ ACE_CHECK_RETURN (DsNotifyLogAdmin::NotifyLog::_nil ());
+
+#if (TAO_HAS_MINIMUM_POA == 0)
+ DsLogAdmin::Log_var log =
+ this->create_log_reference (id ACE_ENV_ARG_PARAMETER);
+ ACE_CHECK_RETURN (DsNotifyLogAdmin::NotifyLog::_nil ());
+#else
+ DsLogAdmin::Log_var log =
+ this->create_log_object (id ACE_ENV_ARG_PARAMETER);
+ ACE_CHECK_RETURN (DsNotifyLogAdmin::NotifyLog::_nil ());
+#endif
+
+ // narrow to NotifyLog
+ DsNotifyLogAdmin::NotifyLog_var notify_log =
+ DsNotifyLogAdmin::NotifyLog::_narrow (log.in ());
+
+ // @@ JTC - squelch exception?
+ notifier_->object_creation (id ACE_ENV_ARG_PARAMETER);
+ ACE_CHECK_RETURN (DsNotifyLogAdmin::NotifyLog::_nil ());
+
+ return notify_log._retn();
+}
+
+CORBA::RepositoryId
+TAO_NotifyLogFactory_i::create_repositoryid ()
+{
+ return CORBA::string_dup("IDL:omg.org/DsNotifyLogAdmin:NotifyLog:1.0");
+}
+
+PortableServer::ServantBase*
+TAO_NotifyLogFactory_i::create_log_servant (DsLogAdmin::LogId id
+ ACE_ENV_ARG_DECL)
+{
+ TAO_NotifyLog_i* notify_log_i;
+
+ ACE_NEW_THROW_EX (notify_log_i,
+ TAO_NotifyLog_i (this->orb_.in (),
+ this->log_poa_.in (),
+ *this,
+ this->log_mgr_.in (),
+ this->notify_factory_.in (),
+ this->notifier_,
+ id
+ ),
+ CORBA::NO_MEMORY ());
+ ACE_CHECK_RETURN (0);
+
+ notify_log_i->init (ACE_ENV_SINGLE_ARG_PARAMETER);
+ ACE_CHECK_RETURN (0);
+
+ //initialise the LogConsumer object
+ notify_log_i->activate (ACE_ENV_SINGLE_ARG_PARAMETER);
+ ACE_CHECK_RETURN (0);
+
+ return notify_log_i;
+}
+
+CosNotifyChannelAdmin::AdminID
+TAO_NotifyLogFactory_i::MyID (ACE_ENV_SINGLE_ARG_DECL)
+ ACE_THROW_SPEC ((
+ CORBA::SystemException
+ ))
+{
+ return consumer_admin_->MyID (ACE_ENV_SINGLE_ARG_PARAMETER);
+}
+
+CosNotifyChannelAdmin::EventChannel_ptr
+TAO_NotifyLogFactory_i::MyChannel (ACE_ENV_SINGLE_ARG_DECL)
+ ACE_THROW_SPEC ((
+ CORBA::SystemException
+ ))
+{
+ ACE_THROW_RETURN (CORBA::NO_IMPLEMENT(), 0);
+}
+
+CosNotifyChannelAdmin::InterFilterGroupOperator
+TAO_NotifyLogFactory_i::MyOperator (ACE_ENV_SINGLE_ARG_DECL)
+ ACE_THROW_SPEC ((
+ CORBA::SystemException
+ ))
+{
+ return consumer_admin_->MyOperator (ACE_ENV_SINGLE_ARG_PARAMETER);
+}
+
+CosNotifyFilter::MappingFilter_ptr
+TAO_NotifyLogFactory_i::priority_filter (ACE_ENV_SINGLE_ARG_DECL)
+ ACE_THROW_SPEC ((
+ CORBA::SystemException
+ ))
+{
+ return consumer_admin_->priority_filter (ACE_ENV_SINGLE_ARG_PARAMETER);
+}
+
+void
+TAO_NotifyLogFactory_i::priority_filter (CosNotifyFilter::MappingFilter_ptr filter ACE_ENV_ARG_DECL)
+ ACE_THROW_SPEC ((
+ CORBA::SystemException
+ ))
+{
+ consumer_admin_->priority_filter(filter ACE_ENV_ARG_PARAMETER);
+}
+
+CosNotifyFilter::MappingFilter_ptr
+TAO_NotifyLogFactory_i::lifetime_filter (ACE_ENV_SINGLE_ARG_DECL)
+ ACE_THROW_SPEC ((
+ CORBA::SystemException
+ ))
+{
+ return consumer_admin_->lifetime_filter (ACE_ENV_SINGLE_ARG_PARAMETER);
+}
+
+void
+TAO_NotifyLogFactory_i::lifetime_filter (CosNotifyFilter::MappingFilter_ptr filter ACE_ENV_ARG_DECL)
+ ACE_THROW_SPEC ((
+ CORBA::SystemException
+ ))
+{
+ consumer_admin_->lifetime_filter (filter ACE_ENV_ARG_PARAMETER);
+}
+
+CosNotifyChannelAdmin::ProxyIDSeq*
+TAO_NotifyLogFactory_i::pull_suppliers (ACE_ENV_SINGLE_ARG_DECL)
+ ACE_THROW_SPEC ((
+ CORBA::SystemException
+ ))
+{
+ return consumer_admin_->pull_suppliers (ACE_ENV_SINGLE_ARG_PARAMETER);
+}
+
+CosNotifyChannelAdmin::ProxyIDSeq*
+TAO_NotifyLogFactory_i::push_suppliers (ACE_ENV_SINGLE_ARG_DECL)
+ ACE_THROW_SPEC ((
+ CORBA::SystemException
+ ))
+{
+ return consumer_admin_->push_suppliers (ACE_ENV_SINGLE_ARG_PARAMETER);
+}
+
+CosNotifyChannelAdmin::ProxySupplier_ptr
+TAO_NotifyLogFactory_i::get_proxy_supplier (
+ CosNotifyChannelAdmin::ProxyID proxy_id ACE_ENV_ARG_DECL)
+ ACE_THROW_SPEC ((
+ CosNotifyChannelAdmin::ProxyNotFound,
+ CORBA::SystemException
+ ))
+{
+ return consumer_admin_->get_proxy_supplier (proxy_id ACE_ENV_ARG_PARAMETER);
+}
+
+CosNotifyChannelAdmin::ProxySupplier_ptr
+TAO_NotifyLogFactory_i::obtain_notification_pull_supplier (
+ CosNotifyChannelAdmin::ClientType ctype,
+ CosNotifyChannelAdmin::ProxyID& proxy_id ACE_ENV_ARG_DECL)
+ ACE_THROW_SPEC ((
+ CosNotifyChannelAdmin::AdminLimitExceeded,
+ CORBA::SystemException
+ ))
+{
+ return consumer_admin_->obtain_notification_pull_supplier (ctype, proxy_id ACE_ENV_ARG_PARAMETER);
+}
+
+CosNotifyChannelAdmin::ProxySupplier_ptr
+TAO_NotifyLogFactory_i::obtain_notification_push_supplier (
+ CosNotifyChannelAdmin::ClientType ctype,
+ CosNotifyChannelAdmin::ProxyID& proxy_id ACE_ENV_ARG_DECL)
+ ACE_THROW_SPEC ((
+ CosNotifyChannelAdmin::AdminLimitExceeded,
+ CORBA::SystemException
+ ))
+{
+ return consumer_admin_->obtain_notification_push_supplier (ctype, proxy_id ACE_ENV_ARG_PARAMETER);
+}
+
+CosEventChannelAdmin::ProxyPushSupplier_ptr
+TAO_NotifyLogFactory_i::obtain_push_supplier (
+ ACE_ENV_SINGLE_ARG_DECL
+ )
+ ACE_THROW_SPEC ((
+ CORBA::SystemException
+ ))
+{
+ return consumer_admin_->obtain_push_supplier (ACE_ENV_SINGLE_ARG_PARAMETER);
+}
+
+
+
+CosEventChannelAdmin::ProxyPullSupplier_ptr
+TAO_NotifyLogFactory_i::obtain_pull_supplier (
+ ACE_ENV_SINGLE_ARG_DECL
+ )
+ ACE_THROW_SPEC ((
+ CORBA::SystemException
+ ))
+
+{
+ return consumer_admin_->obtain_pull_supplier (ACE_ENV_SINGLE_ARG_PARAMETER);
+}
+
+void
+TAO_NotifyLogFactory_i::destroy (ACE_ENV_SINGLE_ARG_DECL_NOT_USED)
+ ACE_THROW_SPEC ((
+ CORBA::SystemException
+ ))
+{
+ // No-Op.
+}
+
+//CosNotifyComm::NotifySubscribe
+void
+TAO_NotifyLogFactory_i::subscription_change (const CosNotification::EventTypeSeq& added,
+ const CosNotification::EventTypeSeq& removed
+ ACE_ENV_ARG_DECL)
+ ACE_THROW_SPEC ((
+ CosNotifyComm::InvalidEventType,
+ CORBA::SystemException
+ ))
+{
+ consumer_admin_->subscription_change (added, removed ACE_ENV_ARG_PARAMETER);
+}
+
+CosNotification::QoSProperties*
+TAO_NotifyLogFactory_i::get_qos (ACE_ENV_SINGLE_ARG_DECL)
+ ACE_THROW_SPEC ((
+ CORBA::SystemException
+ ))
+{
+ return consumer_admin_->get_qos (ACE_ENV_SINGLE_ARG_PARAMETER);
+}
+
+void
+TAO_NotifyLogFactory_i::set_qos (const CosNotification::QoSProperties& qos ACE_ENV_ARG_DECL)
+ ACE_THROW_SPEC ((
+ CosNotification::UnsupportedQoS,
+ CORBA::SystemException
+ ))
+{
+ consumer_admin_->set_qos (qos ACE_ENV_ARG_PARAMETER);
+}
+
+void
+TAO_NotifyLogFactory_i::validate_qos (const CosNotification::QoSProperties& required_qos,
+ CosNotification::NamedPropertyRangeSeq_out available_qos
+ ACE_ENV_ARG_DECL)
+ ACE_THROW_SPEC ((
+ CosNotification::UnsupportedQoS,
+ CORBA::SystemException
+ ))
+{
+ consumer_admin_->validate_qos (required_qos, available_qos ACE_ENV_ARG_PARAMETER);
+}
+
+CosNotifyFilter::FilterID
+TAO_NotifyLogFactory_i::add_filter (CosNotifyFilter::Filter_ptr filter ACE_ENV_ARG_DECL)
+ ACE_THROW_SPEC ((
+ CORBA::SystemException
+ ))
+{
+ return consumer_admin_->add_filter (filter ACE_ENV_ARG_PARAMETER);
+}
+
+void
+TAO_NotifyLogFactory_i::remove_filter (CosNotifyFilter::FilterID id ACE_ENV_ARG_DECL)
+ ACE_THROW_SPEC ((
+ CORBA::SystemException
+ ))
+{
+ consumer_admin_->remove_filter (id ACE_ENV_ARG_PARAMETER);
+}
+
+CosNotifyFilter::Filter_ptr
+TAO_NotifyLogFactory_i::get_filter (CosNotifyFilter::FilterID id ACE_ENV_ARG_DECL)
+ ACE_THROW_SPEC ((
+ CosNotifyFilter::FilterNotFound,
+ CORBA::SystemException
+ ))
+{
+ return consumer_admin_->get_filter (id ACE_ENV_ARG_PARAMETER);
+}
+
+CosNotifyFilter::FilterIDSeq*
+TAO_NotifyLogFactory_i::get_all_filters (ACE_ENV_SINGLE_ARG_DECL)
+ ACE_THROW_SPEC ((
+ CORBA::SystemException
+ ))
+{
+ return consumer_admin_->get_all_filters (ACE_ENV_SINGLE_ARG_PARAMETER);
+}
+
+void
+TAO_NotifyLogFactory_i::remove_all_filters (ACE_ENV_SINGLE_ARG_DECL)
+ ACE_THROW_SPEC ((
+ CORBA::SystemException
+ ))
+{
+ consumer_admin_->remove_all_filters (ACE_ENV_SINGLE_ARG_PARAMETER);
+}
+
+TAO_END_VERSIONED_NAMESPACE_DECL
diff --git a/TAO/orbsvcs/orbsvcs/Log/NotifyLogFactory_i.h b/TAO/orbsvcs/orbsvcs/Log/NotifyLogFactory_i.h
new file mode 100644
index 00000000000..bbe8127c077
--- /dev/null
+++ b/TAO/orbsvcs/orbsvcs/Log/NotifyLogFactory_i.h
@@ -0,0 +1,281 @@
+// -*- C++ -*-
+
+//=============================================================================
+/**
+ * @file NotifyLogFactory_i.h
+ *
+ * $Id$
+ *
+ * Implements the Factory for NotifyLog Objects.
+ *
+ *
+ * @author David A. Hanvey <d.hanvey@qub.ac.uk>
+ */
+//=============================================================================
+
+#ifndef TAO_TLS_NOTIFYLOGFACTORY_I_H
+#define TAO_TLS_NOTIFYLOGFACTORY_I_H
+
+#include /**/ "ace/pre.h"
+
+#include "orbsvcs/DsNotifyLogAdminS.h"
+
+#if !defined (ACE_LACKS_PRAGMA_ONCE)
+# pragma once
+#endif /* ACE_LACKS_PRAGMA_ONCE */
+
+#include "orbsvcs/DsLogAdminS.h"
+#include "orbsvcs/Log/LogMgr_i.h"
+#include "orbsvcs/Log/NotifyLog_i.h"
+
+#if defined(_MSC_VER)
+#pragma warning(push)
+#pragma warning(disable:4250)
+#endif /* _MSC_VER */
+
+TAO_BEGIN_VERSIONED_NAMESPACE_DECL
+
+class TAO_NotifyLog_i;
+class TAO_NotifyLogNotification;
+
+/**
+ * @class TAO_NotifyLogFactory_i
+ *
+ * @brief The NotifyLogFactory is a factory that is used to create NotifyLogs which are event-aware.
+ */
+class TAO_NotifyLog_Serv_Export TAO_NotifyLogFactory_i :
+ public POA_DsNotifyLogAdmin::NotifyLogFactory,
+ public TAO_LogMgr_i
+{
+public:
+ //= Initialization and termination code.
+
+ /// Constructor - default.
+ TAO_NotifyLogFactory_i (void);
+
+ /// Constructor.
+ TAO_NotifyLogFactory_i (CosNotifyChannelAdmin::EventChannelFactory_ptr ecf);
+
+ /// Destructor.
+ ~TAO_NotifyLogFactory_i ();
+
+ /// Activate this servant with the ORB and POA passed in.
+ DsNotifyLogAdmin::NotifyLogFactory_ptr
+ activate (CORBA::ORB_ptr orb,
+ PortableServer::POA_ptr poa
+ ACE_ENV_ARG_DECL);
+
+ /// Used to create an NotifyLog.
+ DsNotifyLogAdmin::NotifyLog_ptr create (
+ DsLogAdmin::LogFullActionType full_action,
+ CORBA::ULongLong max_size,
+ const DsLogAdmin::CapacityAlarmThresholdList & thresholds,
+ const CosNotification::QoSProperties & initial_qos,
+ const CosNotification::AdminProperties & initial_admin,
+ DsLogAdmin::LogId_out id
+ ACE_ENV_ARG_DECL
+ )
+ ACE_THROW_SPEC ((
+ CORBA::SystemException,
+ DsLogAdmin::InvalidLogFullAction,
+ DsLogAdmin::InvalidThreshold,
+ CosNotification::UnsupportedQoS,
+ CosNotification::UnsupportedAdmin
+ ));
+
+ /// Same as create (), but allows clients to specify the id.
+ DsNotifyLogAdmin::NotifyLog_ptr create_with_id (
+ DsLogAdmin::LogId id,
+ DsLogAdmin::LogFullActionType full_action,
+ CORBA::ULongLong max_size,
+ const DsLogAdmin::CapacityAlarmThresholdList & thresholds,
+ const CosNotification::QoSProperties & initial_qos,
+ const CosNotification::AdminProperties & initial_admin
+ ACE_ENV_ARG_DECL
+ )
+ ACE_THROW_SPEC ((
+ CORBA::SystemException,
+ DsLogAdmin::LogIdAlreadyExists,
+ DsLogAdmin::InvalidLogFullAction,
+ DsLogAdmin::InvalidThreshold,
+ CosNotification::UnsupportedQoS,
+ CosNotification::UnsupportedAdmin
+ ));
+
+
+ // = Methods from CosNotifyChannelAdmin::ConsumerAdmin.
+ CosNotifyChannelAdmin::AdminID MyID (ACE_ENV_SINGLE_ARG_DECL)
+ ACE_THROW_SPEC ((
+ CORBA::SystemException
+ ));
+
+ CosNotifyChannelAdmin::EventChannel_ptr MyChannel (ACE_ENV_SINGLE_ARG_DECL)
+ ACE_THROW_SPEC ((
+ CORBA::SystemException
+ ));
+
+ CosNotifyChannelAdmin::InterFilterGroupOperator MyOperator (ACE_ENV_SINGLE_ARG_DECL)
+ ACE_THROW_SPEC ((
+ CORBA::SystemException
+ ));
+
+ CosNotifyFilter::MappingFilter_ptr priority_filter (ACE_ENV_SINGLE_ARG_DECL)
+ ACE_THROW_SPEC ((
+ CORBA::SystemException
+ ));
+ void priority_filter (CosNotifyFilter::MappingFilter_ptr ACE_ENV_ARG_DECL)
+ ACE_THROW_SPEC ((
+ CORBA::SystemException
+ ));
+
+ CosNotifyFilter::MappingFilter_ptr lifetime_filter (ACE_ENV_SINGLE_ARG_DECL)
+ ACE_THROW_SPEC ((
+ CORBA::SystemException
+ ));
+ void lifetime_filter (CosNotifyFilter::MappingFilter_ptr ACE_ENV_ARG_DECL)
+ ACE_THROW_SPEC ((
+ CORBA::SystemException
+ ));
+
+ CosNotifyChannelAdmin::ProxyIDSeq* pull_suppliers (ACE_ENV_SINGLE_ARG_DECL)
+ ACE_THROW_SPEC ((
+ CORBA::SystemException
+ ));
+ CosNotifyChannelAdmin::ProxyIDSeq* push_suppliers (ACE_ENV_SINGLE_ARG_DECL)
+ ACE_THROW_SPEC ((
+ CORBA::SystemException
+ ));
+
+ CosNotifyChannelAdmin::ProxySupplier_ptr get_proxy_supplier (
+ CosNotifyChannelAdmin::ProxyID proxy_id ACE_ENV_ARG_DECL)
+ ACE_THROW_SPEC ((
+ CosNotifyChannelAdmin::ProxyNotFound,
+ CORBA::SystemException
+ ));
+
+ CosNotifyChannelAdmin::ProxySupplier_ptr obtain_notification_pull_supplier (
+ CosNotifyChannelAdmin::ClientType ctype,
+ CosNotifyChannelAdmin::ProxyID& proxy_id ACE_ENV_ARG_DECL)
+ ACE_THROW_SPEC ((
+ CosNotifyChannelAdmin::AdminLimitExceeded,
+ CORBA::SystemException
+ ));
+
+ CosNotifyChannelAdmin::ProxySupplier_ptr obtain_notification_push_supplier (
+ CosNotifyChannelAdmin::ClientType ctype,
+ CosNotifyChannelAdmin::ProxyID& id ACE_ENV_ARG_DECL)
+ ACE_THROW_SPEC ((
+ CosNotifyChannelAdmin::AdminLimitExceeded,
+ CORBA::SystemException
+ ));
+
+ CosEventChannelAdmin::ProxyPushSupplier_ptr obtain_push_supplier (
+ ACE_ENV_SINGLE_ARG_DECL
+ )
+ ACE_THROW_SPEC ((
+ CORBA::SystemException
+ ));
+
+ CosEventChannelAdmin::ProxyPullSupplier_ptr obtain_pull_supplier (
+ ACE_ENV_SINGLE_ARG_DECL
+ )
+ ACE_THROW_SPEC ((
+ CORBA::SystemException
+ ));
+
+ void destroy (ACE_ENV_SINGLE_ARG_DECL)
+ ACE_THROW_SPEC ((
+ CORBA::SystemException
+ ));
+
+ /// CosNotifyComm::NotifySubscribe.
+ void subscription_change (const CosNotification::EventTypeSeq& added,
+ const CosNotification::EventTypeSeq& removed
+ ACE_ENV_ARG_DECL)
+ ACE_THROW_SPEC ((
+ CosNotifyComm::InvalidEventType,
+ CORBA::SystemException
+ ));
+
+ /// CosNotification::QoSAdmin.
+ CosNotification::QoSProperties* get_qos (ACE_ENV_SINGLE_ARG_DECL)
+ ACE_THROW_SPEC ((
+ CORBA::SystemException
+ ));
+ void set_qos (const CosNotification::QoSProperties& ACE_ENV_ARG_DECL)
+ ACE_THROW_SPEC ((
+ CosNotification::UnsupportedQoS,
+ CORBA::SystemException
+ ));
+ void validate_qos (const CosNotification::QoSProperties&,
+ CosNotification::NamedPropertyRangeSeq_out
+ ACE_ENV_ARG_DECL)
+ ACE_THROW_SPEC ((
+ CosNotification::UnsupportedQoS,
+ CORBA::SystemException
+ ));
+
+ /// CosNotifyFilter::FilterAdmin.
+ CosNotifyFilter::FilterID add_filter (CosNotifyFilter::Filter_ptr ACE_ENV_ARG_DECL)
+ ACE_THROW_SPEC ((
+ CORBA::SystemException
+ ));
+ void remove_filter (CosNotifyFilter::FilterID ACE_ENV_ARG_DECL)
+ ACE_THROW_SPEC ((
+ CORBA::SystemException
+ ));
+ CosNotifyFilter::Filter_ptr get_filter (CosNotifyFilter::FilterID ACE_ENV_ARG_DECL)
+ ACE_THROW_SPEC ((
+ CosNotifyFilter::FilterNotFound,
+ CORBA::SystemException
+ ));
+ CosNotifyFilter::FilterIDSeq* get_all_filters (ACE_ENV_SINGLE_ARG_DECL)
+ ACE_THROW_SPEC ((
+ CORBA::SystemException
+ ));
+ void remove_all_filters (ACE_ENV_SINGLE_ARG_DECL)
+ ACE_THROW_SPEC ((
+ CORBA::SystemException
+ ));
+
+protected:
+ virtual CORBA::RepositoryId
+ create_repositoryid ();
+
+ virtual PortableServer::ServantBase*
+ create_log_servant (DsLogAdmin::LogId id
+ ACE_ENV_ARG_DECL);
+
+ /// Our object ref. after <active>ation.
+ DsLogAdmin::LogMgr_var log_mgr_;
+
+ /// The Channel ID.
+ CosNotifyChannelAdmin::ChannelID channel_id_;
+
+ /// The EventChannel the factory uses to enable the
+ /// NotifyLogNotification object to connect to and send
+ /// log-generated events.
+ CosNotifyChannelAdmin::EventChannel_var event_channel_;
+
+ /// The ConsumerAdmin that the NotifyLogFactory supports.
+ CosNotifyChannelAdmin::ConsumerAdmin_var consumer_admin_;
+
+ //CosEventChannelAdmin::EventChannel_var es_event_channel_;
+
+ //CosEventChannelAdmin::ConsumerAdmin_var es_consumer_admin_;
+
+ /// Used for log-generated events.
+ TAO_NotifyLogNotification* notifier_;
+
+ /// The EventChannelFactory used to create an EventChannel.
+ CosNotifyChannelAdmin::EventChannelFactory_var notify_factory_;
+};
+
+TAO_END_VERSIONED_NAMESPACE_DECL
+
+#if defined(_MSC_VER)
+#pragma warning(pop)
+#endif /* _MSC_VER */
+
+#include /**/ "ace/post.h"
+#endif /* TAO_TLS_NOTIFYLOGFACTORY_I_H */
diff --git a/TAO/orbsvcs/orbsvcs/Log/NotifyLogNotification.cpp b/TAO/orbsvcs/orbsvcs/Log/NotifyLogNotification.cpp
new file mode 100644
index 00000000000..1a3762a4d51
--- /dev/null
+++ b/TAO/orbsvcs/orbsvcs/Log/NotifyLogNotification.cpp
@@ -0,0 +1,88 @@
+#include "orbsvcs/Log/LogNotification.h"
+#include "orbsvcs/Log/NotifyLogNotification.h"
+#include "orbsvcs/Time_Utilities.h"
+#include "tao/debug.h"
+
+ACE_RCSID (Log,
+ NotifyLogNotification,
+ "$Id$")
+
+
+TAO_BEGIN_VERSIONED_NAMESPACE_DECL
+
+TAO_NotifyLogNotification::TAO_NotifyLogNotification (
+ CosNotifyChannelAdmin::EventChannel_ptr ec)
+ : TAO_LogNotification (),
+ event_channel_ (CosNotifyChannelAdmin::EventChannel::_duplicate (ec))
+{
+ ACE_DECLARE_NEW_CORBA_ENV;
+
+ CosNotifyComm::PushSupplier_var objref =
+ this->_this (ACE_ENV_SINGLE_ARG_PARAMETER);
+ ACE_CHECK;
+ ACE_ASSERT (!CORBA::is_nil (objref.in ()));
+
+ CosNotifyChannelAdmin::AdminID adminID;
+ CosNotifyChannelAdmin::SupplierAdmin_var supplier_admin =
+ this->event_channel_->new_for_suppliers (CosNotifyChannelAdmin::OR_OP, adminID);
+
+ ACE_ASSERT (!CORBA::is_nil (supplier_admin.in ()));
+
+ CosNotifyChannelAdmin::ProxyConsumer_var proxyconsumer =
+ supplier_admin->obtain_notification_push_consumer (CosNotifyChannelAdmin::ANY_EVENT, proxy_consumer_id_ ACE_ENV_ARG_PARAMETER);
+ ACE_CHECK;
+
+ ACE_ASSERT (!CORBA::is_nil (proxyconsumer.in ()));
+
+ // narrow
+ this->proxy_consumer_ =
+ CosNotifyChannelAdmin::ProxyPushConsumer::_narrow (proxyconsumer.in () ACE_ENV_ARG_PARAMETER);
+ ACE_CHECK;
+
+ ACE_ASSERT (!CORBA::is_nil (this->proxy_consumer_.in ()));
+
+ proxy_consumer_->connect_any_push_supplier (objref.in ()
+ ACE_ENV_ARG_PARAMETER);
+ ACE_CHECK;
+}
+
+TAO_NotifyLogNotification::~TAO_NotifyLogNotification (void)
+{
+ // No-Op.
+}
+
+void
+TAO_NotifyLogNotification::send_notification (const CORBA::Any& any)
+ ACE_THROW_SPEC ((
+ CORBA::SystemException
+ ))
+{
+ this->proxy_consumer_->push (any);
+}
+
+void
+TAO_NotifyLogNotification::subscription_change
+ (const CosNotification::EventTypeSeq & /*added*/,
+ const CosNotification::EventTypeSeq & /*removed */
+ ACE_ENV_ARG_DECL_NOT_USED)
+ ACE_THROW_SPEC ((
+ CORBA::SystemException,
+ CosNotifyComm::InvalidEventType
+ ))
+{
+ //No-Op.
+}
+
+void
+TAO_NotifyLogNotification::disconnect_push_supplier
+ (ACE_ENV_SINGLE_ARG_DECL)
+ ACE_THROW_SPEC ((
+ CORBA::SystemException
+ ))
+{
+ ACE_ASSERT (!CORBA::is_nil (this->proxy_consumer_.in ()));
+
+ this->proxy_consumer_->disconnect_push_consumer(ACE_ENV_SINGLE_ARG_PARAMETER);
+}
+
+TAO_END_VERSIONED_NAMESPACE_DECL
diff --git a/TAO/orbsvcs/orbsvcs/Log/NotifyLogNotification.h b/TAO/orbsvcs/orbsvcs/Log/NotifyLogNotification.h
new file mode 100644
index 00000000000..00e86066473
--- /dev/null
+++ b/TAO/orbsvcs/orbsvcs/Log/NotifyLogNotification.h
@@ -0,0 +1,108 @@
+// -*- C++ -*-
+
+//=============================================================================
+/**
+ * @file NotifyLogNotification.h
+ *
+ * $Id$
+ *
+ * Methods to enable log-generated events.
+ *
+ * @author D A Hanvey <d.hanvey@qub.ac.uk>
+ */
+//=============================================================================
+
+#ifndef TAO_TLS_NOTIFY_LOG_NOTIFICATION_H
+#define TAO_TLS_NOTIFY_LOG_NOTIFICATION_H
+
+#include /**/ "ace/pre.h"
+
+#include "orbsvcs/DsNotifyLogAdminS.h"
+
+#if !defined (ACE_LACKS_PRAGMA_ONCE)
+# pragma once
+#endif /* ACE_LACKS_PRAGMA_ONCE */
+
+#include "orbsvcs/CosEventCommS.h"
+#include "orbsvcs/CosNotifyChannelAdminS.h"
+#include "orbsvcs/CosNotifyCommC.h"
+
+#include "orbsvcs/Log/notifylog_serv_export.h"
+
+#if defined(_MSC_VER)
+#pragma warning(push)
+#pragma warning(disable:4250)
+#endif /* _MSC_VER */
+
+TAO_BEGIN_VERSIONED_NAMESPACE_DECL
+
+/**
+ * @class TAO_NotifyLogNotification
+ *
+ * @brief Used to forward log generated events to a logging server.
+ */
+class TAO_NotifyLog_Serv_Export TAO_NotifyLogNotification :
+ public TAO_LogNotification,
+ public POA_CosNotifyComm::PushSupplier
+{
+public:
+ // = Initialization and Termination methods.
+
+ /// Constructor.
+ TAO_NotifyLogNotification (CosNotifyChannelAdmin::EventChannel_ptr);
+
+ /// Destructor.
+ ~TAO_NotifyLogNotification (void);
+
+protected:
+ // = Helper methods
+ // = Data members
+
+ /// The proxy that we are connected to.
+ CosNotifyChannelAdmin::ProxyPushConsumer_var proxy_consumer_;
+
+ /// This supplier's id.
+ CosNotifyChannelAdmin::ProxyID proxy_consumer_id_;
+
+ // = NotifySubscribe
+ virtual void subscription_change (
+ const CosNotification::EventTypeSeq & added,
+ const CosNotification::EventTypeSeq & removed
+ ACE_ENV_ARG_DECL
+ )
+ ACE_THROW_SPEC ((
+ CORBA::SystemException,
+ CosNotifyComm::InvalidEventType
+ ));
+
+ // = StructuredPushSupplier method
+ virtual void disconnect_push_supplier (
+ ACE_ENV_SINGLE_ARG_DECL
+ )
+ ACE_THROW_SPEC ((
+ CORBA::SystemException
+ ));
+
+ /// Send the event on the event channel.
+ virtual void send_notification (const CORBA::Any& any)
+ ACE_THROW_SPEC ((
+ CORBA::SystemException
+ ));
+
+private:
+ /// A reference to the ORB.
+ CORBA::ORB_var orb_;
+
+ /// A pointer to the EventChannel that events are to be sent to.
+ /// This channel is contained in the NotifyLogFactory.
+ CosNotifyChannelAdmin::EventChannel_var event_channel_;
+};
+
+TAO_END_VERSIONED_NAMESPACE_DECL
+
+#if defined(_MSC_VER)
+#pragma warning(pop)
+#endif /* _MSC_VER */
+
+#include /**/ "ace/post.h"
+#endif /* TAO_TLS_NOTIFY_LOG_NOTIFICATION_H */
diff --git a/TAO/orbsvcs/orbsvcs/Log/NotifyLog_i.cpp b/TAO/orbsvcs/orbsvcs/Log/NotifyLog_i.cpp
new file mode 100644
index 00000000000..db13c800447
--- /dev/null
+++ b/TAO/orbsvcs/orbsvcs/Log/NotifyLog_i.cpp
@@ -0,0 +1,371 @@
+#include "orbsvcs/Log/NotifyLog_i.h"
+#include "orbsvcs/Log/LogMgr_i.h"
+#include "orbsvcs/Log/LogNotification.h"
+
+ACE_RCSID (Log,
+ NotifyLog_i,
+ "$Id$")
+
+#define CA_FILTER "threshold > 10"
+#define TCL_GRAMMAR "TCL"
+
+TAO_BEGIN_VERSIONED_NAMESPACE_DECL
+
+TAO_NotifyLog_i::TAO_NotifyLog_i (CORBA::ORB_ptr orb,
+ PortableServer::POA_ptr poa,
+ TAO_LogMgr_i &logmgr_i,
+ DsLogAdmin::LogMgr_ptr factory,
+ CosNotifyChannelAdmin::EventChannelFactory_ptr ecf,
+ TAO_LogNotification *log_notifier,
+ DsLogAdmin::LogId id)
+ : TAO_Log_i (orb, logmgr_i, factory, id, log_notifier),
+ notify_factory_ (CosNotifyChannelAdmin::EventChannelFactory::_duplicate (ecf)),
+ poa_ (PortableServer::POA::_duplicate (poa))
+{
+ ACE_DECLARE_NEW_CORBA_ENV;
+
+ CosNotifyChannelAdmin::ChannelID channel_id;
+
+ CosNotification::QoSProperties initial_qos;
+ CosNotification::AdminProperties initial_admin;
+
+
+ ACE_ASSERT (!CORBA::is_nil (this->notify_factory_.in ()));
+
+ this->event_channel_ =
+ this->notify_factory_->create_channel (initial_qos,
+ initial_admin,
+ channel_id
+ ACE_ENV_ARG_PARAMETER);
+}
+
+TAO_NotifyLog_i::~TAO_NotifyLog_i ()
+{
+ this->event_channel_->destroy ();
+}
+
+DsLogAdmin::Log_ptr
+TAO_NotifyLog_i::copy (DsLogAdmin::LogId &id ACE_ENV_ARG_DECL)
+ ACE_THROW_SPEC ((
+ CORBA::SystemException
+ ))
+{
+ DsNotifyLogAdmin::NotifyLogFactory_var notifyLogFactory =
+ DsNotifyLogAdmin::NotifyLogFactory::_narrow (factory_.in () ACE_ENV_ARG_PARAMETER);
+ ACE_CHECK_RETURN (DsLogAdmin::Log::_nil ());
+
+ CosNotification::QoSProperties* qos = get_qos (ACE_ENV_SINGLE_ARG_PARAMETER);
+ ACE_CHECK_RETURN (DsLogAdmin::Log::_nil ());
+
+ CosNotification::AdminProperties* admin = get_admin (ACE_ENV_SINGLE_ARG_PARAMETER);
+ ACE_CHECK_RETURN (DsLogAdmin::Log::_nil ());
+
+ DsNotifyLogAdmin::NotifyLog_var log =
+ notifyLogFactory->create (DsLogAdmin::halt, 0, thresholds_, static_cast<const CosNotification::QoSProperties> (*qos),
+ static_cast<const CosNotification::AdminProperties> (*admin), id);
+
+ this->copy_attributes (log.in () ACE_ENV_ARG_PARAMETER);
+ ACE_CHECK_RETURN (DsLogAdmin::Log::_nil ());
+
+ return log._retn ();
+}
+
+DsLogAdmin::Log_ptr
+TAO_NotifyLog_i::copy_with_id (DsLogAdmin::LogId id ACE_ENV_ARG_DECL)
+ ACE_THROW_SPEC ((
+ CORBA::SystemException
+ ))
+{
+ DsNotifyLogAdmin::NotifyLogFactory_var notifyLogFactory =
+ DsNotifyLogAdmin::NotifyLogFactory::_narrow (factory_.in () ACE_ENV_ARG_PARAMETER);
+ ACE_CHECK_RETURN (DsLogAdmin::Log::_nil ());
+
+ CosNotification::QoSProperties* qos = get_qos (ACE_ENV_SINGLE_ARG_PARAMETER);
+ ACE_CHECK_RETURN (DsLogAdmin::Log::_nil ());
+
+ CosNotification::AdminProperties* admin = get_admin (ACE_ENV_SINGLE_ARG_PARAMETER);
+ ACE_CHECK_RETURN (DsLogAdmin::Log::_nil ());
+
+ DsNotifyLogAdmin::NotifyLog_var log =
+ notifyLogFactory->create_with_id (id, DsLogAdmin::halt, 0, thresholds_, static_cast<const CosNotification::QoSProperties> (*qos),
+ static_cast<const CosNotification::AdminProperties> (*admin));
+
+ this->copy_attributes (log.in () ACE_ENV_ARG_PARAMETER);
+ ACE_CHECK_RETURN (DsLogAdmin::Log::_nil ());
+
+ return log._retn ();
+}
+
+
+void
+TAO_NotifyLog_i::destroy (ACE_ENV_SINGLE_ARG_DECL)
+ ACE_THROW_SPEC ((CORBA::SystemException))
+{
+ notifier_->object_deletion (logid_ ACE_ENV_ARG_PARAMETER);
+ ACE_CHECK;
+
+ // Remove ourselves from the list of logs.
+ this->logmgr_i_.remove (this->logid_
+ ACE_ENV_ARG_PARAMETER);
+ ACE_CHECK;
+
+ // Deregister with POA.
+ PortableServer::ObjectId_var id =
+ this->poa_->servant_to_id (this
+ ACE_ENV_ARG_PARAMETER);
+ ACE_CHECK;
+
+ this->poa_->deactivate_object (id.in ()
+ ACE_ENV_ARG_PARAMETER);
+ ACE_CHECK;
+}
+
+void
+TAO_NotifyLog_i::activate (ACE_ENV_SINGLE_ARG_DECL)
+{
+
+ CosNotifyChannelAdmin::AdminID adminid = 0;
+ CosNotifyChannelAdmin::InterFilterGroupOperator ifgop =
+ CosNotifyChannelAdmin::OR_OP;
+
+ this->consumer_admin_ =
+ this->event_channel_->new_for_consumers (ifgop, adminid ACE_ENV_ARG_PARAMETER);
+ ACE_CHECK;
+
+ ACE_ASSERT (!CORBA::is_nil (consumer_admin_.in ()));
+
+ CosNotifyFilter::FilterFactory_var ffact =
+ this->event_channel_->default_filter_factory (ACE_ENV_SINGLE_ARG_PARAMETER);
+ ACE_CHECK;
+
+ // setup a filter at the consumer admin
+ CosNotifyFilter::Filter_var ca_filter =
+ ffact->create_filter (TCL_GRAMMAR ACE_ENV_ARG_PARAMETER);
+ ACE_CHECK;
+
+ ACE_ASSERT (!CORBA::is_nil (ca_filter.in ()));
+
+ CosNotifyFilter::ConstraintExpSeq constraint_list (1);
+ constraint_list.length (1);
+
+ constraint_list[0].event_types.length (0);
+ constraint_list[0].constraint_expr = CORBA::string_dup (CA_FILTER);
+
+ ca_filter->add_constraints (constraint_list ACE_ENV_ARG_PARAMETER);
+ ACE_CHECK;
+
+ consumer_admin_->add_filter (ca_filter.in () ACE_ENV_ARG_PARAMETER);
+ ACE_CHECK;
+
+ // Setup the CA to receive all type of events
+ CosNotification::EventTypeSeq added(1);
+ CosNotification::EventTypeSeq removed (0);
+ added.length (1);
+ removed.length (0);
+
+ added[0].domain_name = CORBA::string_dup ("*");
+ added[0].type_name = CORBA::string_dup ("*");
+
+ this->consumer_admin_->subscription_change (added, removed ACE_ENV_ARG_PARAMETER);
+ ACE_CHECK;
+
+ ACE_NEW_THROW_EX (this->my_log_consumer_,
+ TAO_Notify_LogConsumer (this),
+ CORBA::NO_MEMORY ());
+
+ this->my_log_consumer_->connect (this->consumer_admin_.in () ACE_ENV_ARG_PARAMETER);
+}
+
+//IDL to C++
+CosNotifyFilter::Filter_ptr
+TAO_NotifyLog_i::get_filter (ACE_ENV_SINGLE_ARG_DECL)
+ ACE_THROW_SPEC ((
+ CORBA::SystemException
+ ))
+{
+ //TODO: need to add impl
+ ACE_THROW_RETURN (CORBA::NO_IMPLEMENT (), 0);
+}
+
+void
+TAO_NotifyLog_i::set_filter (CosNotifyFilter::Filter_ptr /* filter */
+ ACE_ENV_ARG_DECL)
+ ACE_THROW_SPEC ((
+ CORBA::SystemException
+ ))
+{
+ ACE_THROW (CORBA::NO_IMPLEMENT ());
+
+ //TODO: need to add impl
+}
+
+CosNotifyChannelAdmin::EventChannelFactory_ptr
+TAO_NotifyLog_i::MyFactory (ACE_ENV_SINGLE_ARG_DECL)
+ ACE_THROW_SPEC ((
+ CORBA::SystemException
+ ))
+{
+ //TODO: need to add impl
+ ACE_THROW_RETURN (CORBA::NO_IMPLEMENT (), 0);
+}
+
+CosNotifyChannelAdmin::ConsumerAdmin_ptr
+TAO_NotifyLog_i::default_consumer_admin (ACE_ENV_SINGLE_ARG_DECL)
+ ACE_THROW_SPEC ((
+ CORBA::SystemException
+ ))
+{
+ return this->event_channel_->default_consumer_admin (ACE_ENV_SINGLE_ARG_PARAMETER);
+}
+
+CosNotifyChannelAdmin::SupplierAdmin_ptr
+TAO_NotifyLog_i::default_supplier_admin (ACE_ENV_SINGLE_ARG_DECL)
+ ACE_THROW_SPEC ((
+ CORBA::SystemException
+ ))
+{
+ return this->event_channel_->default_supplier_admin (ACE_ENV_SINGLE_ARG_PARAMETER);
+}
+
+CosNotifyFilter::FilterFactory_ptr
+TAO_NotifyLog_i::default_filter_factory (ACE_ENV_SINGLE_ARG_DECL)
+ ACE_THROW_SPEC ((
+ CORBA::SystemException
+ ))
+{
+ return this->event_channel_->default_filter_factory (ACE_ENV_SINGLE_ARG_PARAMETER);
+}
+
+CosNotifyChannelAdmin::ConsumerAdmin_ptr
+TAO_NotifyLog_i::new_for_consumers (CosNotifyChannelAdmin::InterFilterGroupOperator op,
+ CosNotifyChannelAdmin::AdminID& id ACE_ENV_ARG_DECL)
+ ACE_THROW_SPEC ((
+ CORBA::SystemException
+ ))
+{
+ return this->event_channel_->new_for_consumers (op,id ACE_ENV_ARG_PARAMETER);
+}
+
+CosNotifyChannelAdmin::SupplierAdmin_ptr
+TAO_NotifyLog_i::new_for_suppliers (CosNotifyChannelAdmin::InterFilterGroupOperator op,
+ CosNotifyChannelAdmin::AdminID& id ACE_ENV_ARG_DECL)
+ ACE_THROW_SPEC ((
+ CORBA::SystemException
+ ))
+{
+ return this->event_channel_->new_for_suppliers (op,id ACE_ENV_ARG_PARAMETER);
+}
+
+CosNotifyChannelAdmin::ConsumerAdmin_ptr
+TAO_NotifyLog_i::get_consumeradmin (CosNotifyChannelAdmin::AdminID id ACE_ENV_ARG_DECL)
+ ACE_THROW_SPEC ((
+ CosNotifyChannelAdmin::AdminNotFound,
+ CORBA::SystemException
+ ))
+{
+ return this->event_channel_->get_consumeradmin (id ACE_ENV_ARG_PARAMETER);
+}
+
+CosNotifyChannelAdmin::SupplierAdmin_ptr
+TAO_NotifyLog_i::get_supplieradmin (CosNotifyChannelAdmin::AdminID id ACE_ENV_ARG_DECL)
+ ACE_THROW_SPEC ((
+ CosNotifyChannelAdmin::AdminNotFound,
+ CORBA::SystemException
+ ))
+{
+ return this->event_channel_->get_supplieradmin (id ACE_ENV_ARG_PARAMETER);
+}
+
+CosNotifyChannelAdmin::AdminIDSeq*
+TAO_NotifyLog_i::get_all_consumeradmins (ACE_ENV_SINGLE_ARG_DECL)
+ ACE_THROW_SPEC ((
+ CORBA::SystemException
+ ))
+{
+ return this->event_channel_->get_all_consumeradmins (ACE_ENV_SINGLE_ARG_PARAMETER);
+}
+
+CosNotifyChannelAdmin::AdminIDSeq*
+TAO_NotifyLog_i::get_all_supplieradmins (ACE_ENV_SINGLE_ARG_DECL)
+ ACE_THROW_SPEC ((
+ CORBA::SystemException
+ ))
+{
+ return this->event_channel_->get_all_supplieradmins (ACE_ENV_SINGLE_ARG_PARAMETER);
+}
+
+CosNotification::AdminProperties*
+TAO_NotifyLog_i::get_admin (ACE_ENV_SINGLE_ARG_DECL)
+ ACE_THROW_SPEC ((
+ CORBA::SystemException
+ ))
+{
+ return this->event_channel_->get_admin (ACE_ENV_SINGLE_ARG_PARAMETER);
+}
+
+void
+TAO_NotifyLog_i::set_admin (const CosNotification::AdminProperties& admin ACE_ENV_ARG_DECL)
+ ACE_THROW_SPEC ((
+ CosNotification::UnsupportedAdmin,
+ CORBA::SystemException
+ ))
+{
+ this->event_channel_->set_admin (admin ACE_ENV_ARG_PARAMETER);
+}
+
+CosNotification::QoSProperties*
+TAO_NotifyLog_i::get_qos (ACE_ENV_SINGLE_ARG_DECL)
+ ACE_THROW_SPEC ((
+ CORBA::SystemException
+ ))
+{
+ //need to add merging of QoS from Log_i and EventChannel_i
+ ACE_THROW_RETURN (CORBA::NO_IMPLEMENT (), 0);
+}
+
+void
+TAO_NotifyLog_i::set_qos (const CosNotification::QoSProperties& /* qos */
+ ACE_ENV_ARG_DECL)
+ ACE_THROW_SPEC ((
+ CosNotification::UnsupportedQoS,
+ CORBA::SystemException
+ ))
+{
+ ACE_THROW (CORBA::NO_IMPLEMENT ());
+ //TODO: need to add later
+}
+
+void
+TAO_NotifyLog_i::validate_qos (
+ const CosNotification::QoSProperties& /* required_qos */,
+ CosNotification::NamedPropertyRangeSeq_out /* available_qos */
+ ACE_ENV_ARG_DECL)
+ ACE_THROW_SPEC ((CosNotification::UnsupportedQoS,
+ CORBA::SystemException))
+{
+ ACE_THROW (CORBA::NO_IMPLEMENT ());
+
+ //TODO: need to add later
+}
+
+CosEventChannelAdmin::ConsumerAdmin_ptr
+TAO_NotifyLog_i::for_consumers (ACE_ENV_SINGLE_ARG_DECL)
+ ACE_THROW_SPEC ((
+ CORBA::SystemException
+ ))
+{
+ return this->event_channel_->for_consumers(ACE_ENV_SINGLE_ARG_PARAMETER);
+}
+
+CosEventChannelAdmin::SupplierAdmin_ptr
+TAO_NotifyLog_i::for_suppliers (
+ ACE_ENV_SINGLE_ARG_DECL
+ )
+ ACE_THROW_SPEC ((
+ CORBA::SystemException
+ ))
+{
+ return this->event_channel_->for_suppliers(ACE_ENV_SINGLE_ARG_PARAMETER);
+}
+
+TAO_END_VERSIONED_NAMESPACE_DECL
diff --git a/TAO/orbsvcs/orbsvcs/Log/NotifyLog_i.h b/TAO/orbsvcs/orbsvcs/Log/NotifyLog_i.h
new file mode 100644
index 00000000000..81218cf3962
--- /dev/null
+++ b/TAO/orbsvcs/orbsvcs/Log/NotifyLog_i.h
@@ -0,0 +1,240 @@
+// -*- C++ -*-
+
+//=============================================================================
+/**
+ * @file NotifyLog_i.h
+ *
+ * $Id$
+ *
+ * Implementation of the DsNotifyLogAdmin::NotifyLog interface.
+ * File also conatins TAO_Notify_LogConsumer which is used
+ * to write events to the Log.
+ *
+ * @author David A. Hanvey <d.hanvey@qub.ac.uk>
+ */
+//=============================================================================
+
+#ifndef TAO_TLS_NOTIFYLOG_I_H
+#define TAO_TLS_NOTIFYLOG_I_H
+
+#include /**/ "ace/pre.h"
+
+#include "orbsvcs/DsLogAdminS.h"
+
+#if !defined (ACE_LACKS_PRAGMA_ONCE)
+# pragma once
+#endif /* ACE_LACKS_PRAGMA_ONCE */
+
+#include "orbsvcs/DsNotifyLogAdminS.h"
+#include "orbsvcs/Log/Log_i.h"
+#include "orbsvcs/Log/NotifyLogConsumer.h"
+
+#include "orbsvcs/Log/notifylog_serv_export.h"
+
+#if defined(_MSC_VER)
+#pragma warning(push)
+#pragma warning(disable:4250)
+#endif /* _MSC_VER */
+
+TAO_BEGIN_VERSIONED_NAMESPACE_DECL
+
+class TAO_LogMgr_i;
+class TAO_NotifyLog_i;
+class TAO_NotifyLogFactory_i;
+
+/**
+ * @class TAO_NotifyLog_i
+ *
+ * @brief The NotifyLog is an EventChannel and a Log.
+ *
+ * It is used to log events that pass through the EventChannel.
+ * The class supports the @c destroy> method to destroy the Log.
+ */
+class TAO_NotifyLog_Serv_Export TAO_NotifyLog_i :
+ public TAO_Log_i,
+ public POA_DsNotifyLogAdmin::NotifyLog
+{
+public:
+ // = Initialization and Termination.
+
+ /// Constructor.
+ TAO_NotifyLog_i (CORBA::ORB_ptr orb,
+ PortableServer::POA_ptr poa,
+ TAO_LogMgr_i &logmgr_i,
+ DsLogAdmin::LogMgr_ptr factory,
+ CosNotifyChannelAdmin::EventChannelFactory_ptr ecf,
+ TAO_LogNotification *log_notifier,
+ DsLogAdmin::LogId id);
+
+ /// Destructor.
+ ~TAO_NotifyLog_i ();
+
+ /// Duplicate the log.
+ virtual DsLogAdmin::Log_ptr copy (DsLogAdmin::LogId &id ACE_ENV_ARG_DECL)
+ ACE_THROW_SPEC ((
+ CORBA::SystemException
+ ));
+
+ /// Duplicate the log specifying an id.
+ virtual DsLogAdmin::Log_ptr copy_with_id (DsLogAdmin::LogId id ACE_ENV_ARG_DECL)
+ ACE_THROW_SPEC ((
+ CORBA::SystemException
+ ));
+
+ /// Destroy the log object and all contained records.
+ void
+ destroy (ACE_ENV_SINGLE_ARG_DECL)
+ ACE_THROW_SPEC ((CORBA::SystemException));
+
+ /// Activate the NotifyLog.
+ void
+ activate (ACE_ENV_SINGLE_ARG_DECL);
+
+ // = Methods from CosNotifyChannelAdmin::EventChannel.
+ CosNotifyFilter::Filter_ptr
+ get_filter (ACE_ENV_SINGLE_ARG_DECL)
+ ACE_THROW_SPEC ((
+ CORBA::SystemException
+ ));
+
+ void set_filter (CosNotifyFilter::Filter_ptr filter ACE_ENV_ARG_DECL)
+ ACE_THROW_SPEC ((
+ CORBA::SystemException
+ ));
+
+ CosNotifyChannelAdmin::EventChannelFactory_ptr
+ MyFactory (ACE_ENV_SINGLE_ARG_DECL)
+ ACE_THROW_SPEC ((
+ CORBA::SystemException
+ ));
+
+ CosNotifyChannelAdmin::ConsumerAdmin_ptr
+ default_consumer_admin (ACE_ENV_SINGLE_ARG_DECL)
+ ACE_THROW_SPEC ((
+ CORBA::SystemException
+ ));
+
+ CosNotifyChannelAdmin::SupplierAdmin_ptr
+ default_supplier_admin (ACE_ENV_SINGLE_ARG_DECL)
+ ACE_THROW_SPEC ((
+ CORBA::SystemException
+ ));
+
+ CosNotifyFilter::FilterFactory_ptr
+ default_filter_factory (ACE_ENV_SINGLE_ARG_DECL)
+ ACE_THROW_SPEC ((
+ CORBA::SystemException
+ ));
+
+ CosNotifyChannelAdmin::ConsumerAdmin_ptr
+ new_for_consumers (CosNotifyChannelAdmin::InterFilterGroupOperator op,
+ CosNotifyChannelAdmin::AdminID& id ACE_ENV_ARG_DECL)
+ ACE_THROW_SPEC ((
+ CORBA::SystemException
+ ));
+
+ CosNotifyChannelAdmin::SupplierAdmin_ptr
+ new_for_suppliers (CosNotifyChannelAdmin::InterFilterGroupOperator op,
+ CosNotifyChannelAdmin::AdminID& id ACE_ENV_ARG_DECL)
+ ACE_THROW_SPEC ((
+ CORBA::SystemException
+ ));
+
+ CosNotifyChannelAdmin::ConsumerAdmin_ptr
+ get_consumeradmin (CosNotifyChannelAdmin::AdminID id ACE_ENV_ARG_DECL)
+ ACE_THROW_SPEC ((
+ CosNotifyChannelAdmin::AdminNotFound,
+ CORBA::SystemException
+ ));
+
+ CosNotifyChannelAdmin::SupplierAdmin_ptr
+ get_supplieradmin (CosNotifyChannelAdmin::AdminID id ACE_ENV_ARG_DECL)
+ ACE_THROW_SPEC ((
+ CosNotifyChannelAdmin::AdminNotFound,
+ CORBA::SystemException
+ ));
+
+ CosNotifyChannelAdmin::AdminIDSeq*
+ get_all_consumeradmins (ACE_ENV_SINGLE_ARG_DECL)
+ ACE_THROW_SPEC ((
+ CORBA::SystemException
+ ));
+
+ CosNotifyChannelAdmin::AdminIDSeq*
+ get_all_supplieradmins (ACE_ENV_SINGLE_ARG_DECL)
+ ACE_THROW_SPEC ((
+ CORBA::SystemException
+ ));
+
+ CosNotification::AdminProperties*
+ get_admin (ACE_ENV_SINGLE_ARG_DECL)
+ ACE_THROW_SPEC ((
+ CORBA::SystemException
+ ));
+
+ void set_admin (const CosNotification::AdminProperties& admin ACE_ENV_ARG_DECL)
+ ACE_THROW_SPEC ((
+ CosNotification::UnsupportedAdmin,
+ CORBA::SystemException
+ ));
+
+ CosNotification::QoSProperties*
+ get_qos (ACE_ENV_SINGLE_ARG_DECL)
+ ACE_THROW_SPEC ((
+ CORBA::SystemException
+ ));
+
+ void set_qos (const CosNotification::QoSProperties& ACE_ENV_ARG_DECL)
+ ACE_THROW_SPEC ((
+ CosNotification::UnsupportedQoS,
+ CORBA::SystemException
+ ));
+
+ void validate_qos (const CosNotification::QoSProperties&,
+ CosNotification::NamedPropertyRangeSeq_out ACE_ENV_ARG_DECL)
+ ACE_THROW_SPEC ((
+ CosNotification::UnsupportedQoS,
+ CORBA::SystemException
+ ));
+
+ // = Methods from DsEventLogAdmin::EventLog.
+ CosEventChannelAdmin::ConsumerAdmin_ptr
+ for_consumers (ACE_ENV_SINGLE_ARG_DECL)
+ ACE_THROW_SPEC ((
+ CORBA::SystemException
+ ));
+
+ CosEventChannelAdmin::SupplierAdmin_ptr
+ for_suppliers (ACE_ENV_SINGLE_ARG_DECL)
+ ACE_THROW_SPEC ((
+ CORBA::SystemException
+ ));
+
+private:
+ /// The PushConsumer that consumes the events and stores them
+ /// in the log.
+ TAO_Notify_LogConsumer *my_log_consumer_;
+
+ /// The Event Channel that the log uses.
+ CosNotifyChannelAdmin::EventChannel_var event_channel_;
+
+ /// The Event Channel ID that the log uses.
+ CosNotifyChannelAdmin::ChannelID channelID_;
+
+ /// The EventChannelFactory used to create the EventChannel above.
+ CosNotifyChannelAdmin::EventChannelFactory_var notify_factory_;
+
+ /// The ConsumerAdmin that the log uses.
+ CosNotifyChannelAdmin::ConsumerAdmin_var consumer_admin_;
+
+ PortableServer::POA_var poa_;
+};
+
+TAO_END_VERSIONED_NAMESPACE_DECL
+
+#if defined(_MSC_VER)
+#pragma warning(pop)
+#endif /* _MSC_VER */
+
+#include /**/ "ace/post.h"
+#endif /* TAO_TLS_NOTIFYLOG_I_H */
diff --git a/TAO/orbsvcs/orbsvcs/Log/RTEventLogConsumer.cpp b/TAO/orbsvcs/orbsvcs/Log/RTEventLogConsumer.cpp
new file mode 100644
index 00000000000..08a2cfd036e
--- /dev/null
+++ b/TAO/orbsvcs/orbsvcs/Log/RTEventLogConsumer.cpp
@@ -0,0 +1,68 @@
+#include "orbsvcs/Log/RTEventLog_i.h"
+#include "orbsvcs/Log/LogMgr_i.h"
+#include "orbsvcs/Log/LogNotification.h"
+#include "orbsvcs/Event_Utilities.h"
+#include "orbsvcs/Event/EC_Event_Channel.h"
+#include "orbsvcs/Event/EC_Default_Factory.h"
+#include "orbsvcs/Event/EC_Dispatching.h"
+#include "orbsvcs/Event/EC_ConsumerAdmin.h"
+#include "orbsvcs/Event/EC_SupplierAdmin.h"
+#include "orbsvcs/Event/EC_Timeout_Generator.h"
+#include "orbsvcs/Event/EC_ObserverStrategy.h"
+#include "orbsvcs/Event/EC_ConsumerControl.h"
+#include "orbsvcs/Event/EC_SupplierControl.h"
+#include "ace/Dynamic_Service.h"
+
+ACE_RCSID (Log,
+ RTEventLogConsumer,
+ "$Id$")
+
+TAO_BEGIN_VERSIONED_NAMESPACE_DECL
+
+TAO_Rtec_LogConsumer::TAO_Rtec_LogConsumer (TAO_RTEventLog_i *log)
+ : log_ (log)
+{
+}
+
+TAO_Rtec_LogConsumer::~TAO_Rtec_LogConsumer (void)
+{
+}
+
+void
+TAO_Rtec_LogConsumer::connect (RtecEventChannelAdmin::ConsumerAdmin_ptr consumer_admin)
+{
+ RtecEventComm::PushConsumer_var myself = this->_this ();
+ this->supplier_proxy_ = consumer_admin->obtain_push_supplier ();
+
+ ACE_ConsumerQOS_Factory qos;
+ qos.start_disjunction_group (1);
+ qos.insert_type (ACE_ES_EVENT_ANY,
+ 0);
+ this->supplier_proxy_->connect_push_consumer (myself.in(), qos.get_ConsumerQOS ());
+}
+
+void
+TAO_Rtec_LogConsumer::push (const RtecEventComm::EventSet& events ACE_ENV_ARG_DECL)
+ ACE_THROW_SPEC ((CORBA::SystemException))
+{
+ // create a record list...
+ DsLogAdmin::RecordList recList (1);
+ recList.length (1);
+
+ recList [0].info <<= events;
+
+ this->log_->write_recordlist (recList ACE_ENV_ARG_PARAMETER);
+
+ ACE_CHECK;
+
+}
+
+void
+TAO_Rtec_LogConsumer::disconnect_push_consumer (ACE_ENV_SINGLE_ARG_DECL)
+ ACE_THROW_SPEC ((CORBA::SystemException))
+{
+ this->supplier_proxy_->disconnect_push_supplier (
+ ACE_ENV_SINGLE_ARG_PARAMETER);
+}
+
+TAO_END_VERSIONED_NAMESPACE_DECL
diff --git a/TAO/orbsvcs/orbsvcs/Log/RTEventLogConsumer.h b/TAO/orbsvcs/orbsvcs/Log/RTEventLogConsumer.h
new file mode 100644
index 00000000000..05fdb9d65f4
--- /dev/null
+++ b/TAO/orbsvcs/orbsvcs/Log/RTEventLogConsumer.h
@@ -0,0 +1,95 @@
+// -*- C++ -*-
+
+//=============================================================================
+/**
+ * @file RTEventLogConsumer.h
+ *
+ * $Id$
+ *
+ * The RTEventLogConsumer connects to the RTEventLog and logs the events
+ * that are pushed to the RTEventLog.
+ *
+ * @author David A. Hanvey <d.hanvey@qub.ac.uk>
+ */
+//=============================================================================
+
+#ifndef TAO_TLS_RTEVENTLOGCONSUMER_H
+#define TAO_TLS_RTEVENTLOGCONSUMER_H
+
+#include /**/ "ace/pre.h"
+
+#include "orbsvcs/DsLogAdminS.h"
+
+#if !defined (ACE_LACKS_PRAGMA_ONCE)
+# pragma once
+#endif /* ACE_LACKS_PRAGMA_ONCE */
+
+#include "orbsvcs/RTEventLogAdminS.h"
+#include "orbsvcs/Log/Log_i.h"
+#include "orbsvcs/Event/EC_Event_Channel.h"
+#include "orbsvcs/Event/EC_Factory.h"
+#include "orbsvcs/Event/EC_Defaults.h"
+
+#include "orbsvcs/Log/rteventlog_serv_export.h"
+
+#if defined(_MSC_VER)
+#pragma warning(push)
+#pragma warning(disable:4250)
+#endif /* _MSC_VER */
+
+
+TAO_BEGIN_VERSIONED_NAMESPACE_DECL
+
+class TAO_LogMgr_i;
+class TAO_RTEventLog_i;
+class TAO_RTEventLogFactory_i;
+
+/**
+ * @class TAO_Rtec_LogConsumer
+ *
+ * @brief An implementation of the PushConsumer interface.
+ *
+ * Connects to the RTEventLog and writes LogRecords to the
+ * Log when events are 'pushed' to the RTEventLog which is an
+ * EventChannel.
+ */
+class TAO_RTEventLog_Serv_Export TAO_Rtec_LogConsumer :public virtual POA_RtecEventComm::PushConsumer
+{
+public:
+ // = Initialization and Termination methods.
+
+ /// Constructor.
+ TAO_Rtec_LogConsumer (TAO_RTEventLog_i *log);
+
+ /// Destructor.
+ ~TAO_Rtec_LogConsumer (void);
+
+ /// Connect to RTEventLog.
+ void connect (RtecEventChannelAdmin::ConsumerAdmin_ptr consumer_admin);
+
+private:
+ /// Disconnect from EventLog.
+ void disconnect_push_consumer (ACE_ENV_SINGLE_ARG_DECL)
+ ACE_THROW_SPEC ((CORBA::SystemException));
+
+ /// This method will call TAO_Log_i::log() to write
+ /// the event to the Log.
+ void push (const RtecEventComm::EventSet& events ACE_ENV_ARG_DECL)
+ ACE_THROW_SPEC ((CORBA::SystemException));
+
+ /// ProxyPushSupplier used to connect to RTEventLog.
+ RtecEventChannelAdmin::ProxyPushSupplier_var supplier_proxy_;
+
+ /// The RTEventLog that this consumer connects to
+ /// and whose events are to be logged.
+ TAO_RTEventLog_i *log_;
+};
+
+TAO_END_VERSIONED_NAMESPACE_DECL
+
+#if defined(_MSC_VER)
+#pragma warning(pop)
+#endif /* _MSC_VER */
+
+#include /**/ "ace/post.h"
+#endif /* TAO_TLS_RTEVENTLOGCONSUMER_H */
diff --git a/TAO/orbsvcs/orbsvcs/Log/RTEventLogFactory_i.cpp b/TAO/orbsvcs/orbsvcs/Log/RTEventLogFactory_i.cpp
new file mode 100644
index 00000000000..bffeb96ecf4
--- /dev/null
+++ b/TAO/orbsvcs/orbsvcs/Log/RTEventLogFactory_i.cpp
@@ -0,0 +1,242 @@
+#include "orbsvcs/Log/RTEventLogFactory_i.h"
+#include "orbsvcs/Log/LogNotification.h"
+#include "orbsvcs/Log/RTEventLogNotification.h"
+#include "orbsvcs/Event/EC_ConsumerAdmin.h"
+#include "orbsvcs/Event/EC_ProxySupplier.h"
+#include "orbsvcs/Event/EC_ProxyConsumer.h"
+#include "orbsvcs/Event/EC_Event_Channel.h"
+#include "orbsvcs/ESF/ESF_Peer_Workers.h"
+#include "orbsvcs/ESF/ESF_Peer_Admin.h"
+#include "orbsvcs/ESF/ESF_Shutdown_Proxy.h"
+#include "orbsvcs/Event/EC_ConsumerAdmin.h"
+#include "orbsvcs/Event_Utilities.h"
+#include "orbsvcs/Sched/Config_Scheduler.h"
+#include "orbsvcs/Event/EC_Default_Factory.h"
+#include "orbsvcs/Event/EC_Event_Channel.h"
+#include "ace/OS_NS_stdio.h"
+
+#include "ace/Auto_Ptr.h"
+
+ACE_RCSID (Log,
+ RTEventLogFactory_i,
+ "$Id$")
+
+
+TAO_BEGIN_VERSIONED_NAMESPACE_DECL
+
+TAO_RTEventLogFactory_i::TAO_RTEventLogFactory_i (void)
+{
+}
+
+TAO_RTEventLogFactory_i::~TAO_RTEventLogFactory_i()
+{
+}
+
+int
+TAO_RTEventLogFactory_i::init (CORBA::ORB_ptr orb,
+ PortableServer::POA_ptr poa
+ ACE_ENV_ARG_DECL)
+{
+ TAO_LogMgr_i::init (orb, poa ACE_ENV_ARG_PARAMETER);
+ ACE_CHECK_RETURN (-1);
+
+
+ PortableServer::POA_var defPOA =
+ this->_default_POA (ACE_ENV_SINGLE_ARG_PARAMETER);
+ ACE_CHECK_RETURN (-1);
+
+ TAO_EC_Event_Channel_Attributes attr (defPOA.in (), defPOA.in ());
+
+ this->impl = 0;
+ ACE_NEW_THROW_EX (impl,
+ TAO_EC_Event_Channel (attr),
+ CORBA::NO_MEMORY ());
+ ACE_CHECK_RETURN (-1);
+
+ auto_ptr <TAO_EC_Event_Channel> ec (impl);
+
+ impl->activate (ACE_ENV_SINGLE_ARG_PARAMETER);
+ ACE_CHECK_RETURN (-1);
+
+ PortableServer::ObjectId_var oidec = poa_->activate_object (ec.get ()
+ ACE_ENV_ARG_PARAMETER);
+ ACE_CHECK_RETURN (-1);
+
+ ec.release ();
+
+ CORBA::Object_var objec =
+ poa_->id_to_reference (oidec.in () ACE_ENV_ARG_PARAMETER);
+ ACE_CHECK_RETURN (-1);
+
+ this->event_channel_ = RtecEventChannelAdmin::EventChannel::_narrow (objec.in ());
+
+
+ this->consumer_admin_ = this->event_channel_->for_consumers(ACE_ENV_SINGLE_ARG_PARAMETER);
+
+ ACE_NEW_THROW_EX (this->notifier_,
+ TAO_RTEventLogNotification(this->event_channel_.in ()),
+ CORBA::NO_MEMORY ());
+ return 0;
+}
+
+RTEventLogAdmin::EventLogFactory_ptr
+TAO_RTEventLogFactory_i::activate (ACE_ENV_SINGLE_ARG_DECL)
+{
+ RTEventLogAdmin::EventLogFactory_var v_return;
+
+ PortableServer::ObjectId_var oid =
+ this->factory_poa_->activate_object (this
+ ACE_ENV_ARG_PARAMETER);
+ ACE_CHECK_RETURN (v_return._retn ());
+
+ CORBA::Object_var obj =
+ this->factory_poa_->id_to_reference (oid.in ()
+ ACE_ENV_ARG_PARAMETER);
+ ACE_CHECK_RETURN (v_return._retn ());
+
+ // narrow and store the result..
+ this->log_mgr_ =
+ DsLogAdmin::LogMgr::_narrow (obj.in ()
+ ACE_ENV_ARG_PARAMETER);
+ ACE_CHECK_RETURN (v_return._retn ());
+
+ v_return =
+ RTEventLogAdmin::EventLogFactory::_narrow (obj.in ()
+ ACE_ENV_ARG_PARAMETER);
+ ACE_CHECK_RETURN (RTEventLogAdmin::EventLogFactory::_nil ());
+
+ return v_return._retn ();
+}
+
+RTEventLogAdmin::EventLog_ptr
+TAO_RTEventLogFactory_i::create (
+ DsLogAdmin::LogFullActionType full_action,
+ CORBA::ULongLong max_size,
+ const DsLogAdmin::CapacityAlarmThresholdList & thresholds,
+ DsLogAdmin::LogId_out id_out
+ ACE_ENV_ARG_DECL
+ )
+ ACE_THROW_SPEC ((
+ CORBA::SystemException,
+ DsLogAdmin::InvalidLogFullAction,
+ DsLogAdmin::InvalidThreshold
+ ))
+{
+ this->create_i (full_action,
+ max_size,
+ & thresholds,
+ id_out
+ ACE_ENV_ARG_PARAMETER);
+ ACE_CHECK_RETURN (RTEventLogAdmin::EventLog::_nil ());
+ DsLogAdmin::LogId id = id_out;
+
+#if (TAO_HAS_MINIMUM_POA == 0)
+ DsLogAdmin::Log_var log =
+ this->create_log_reference (id ACE_ENV_ARG_PARAMETER);
+ ACE_CHECK_RETURN (RTEventLogAdmin::EventLog::_nil ());
+#else
+ DsLogAdmin::Log_var log =
+ this->create_log_object (id ACE_ENV_ARG_PARAMETER);
+ ACE_CHECK_RETURN (RTEventLogAdmin::EventLog::_nil ());
+#endif
+
+ // narrow to EventLog
+ RTEventLogAdmin::EventLog_var event_log =
+ RTEventLogAdmin::EventLog::_narrow (log.in ());
+
+ // @@ JTC - squelch exception?
+ notifier_->object_creation (id ACE_ENV_ARG_PARAMETER);
+ ACE_CHECK_RETURN (RTEventLogAdmin::EventLog::_nil ());
+
+ return event_log._retn();
+}
+
+RTEventLogAdmin::EventLog_ptr
+TAO_RTEventLogFactory_i::create_with_id (
+ DsLogAdmin::LogId id,
+ DsLogAdmin::LogFullActionType full_action,
+ CORBA::ULongLong max_size,
+ const DsLogAdmin::CapacityAlarmThresholdList & thresholds
+ ACE_ENV_ARG_DECL
+ )
+ ACE_THROW_SPEC ((
+ CORBA::SystemException,
+ DsLogAdmin::LogIdAlreadyExists,
+ DsLogAdmin::InvalidLogFullAction,
+ DsLogAdmin::InvalidThreshold
+ ))
+{
+ this->create_with_id_i (id,
+ full_action,
+ max_size,
+ & thresholds
+ ACE_ENV_ARG_PARAMETER);
+ ACE_CHECK_RETURN (RTEventLogAdmin::EventLog::_nil ());
+
+#if (TAO_HAS_MINIMUM_POA == 0)
+ DsLogAdmin::Log_var log =
+ this->create_log_reference (id ACE_ENV_ARG_PARAMETER);
+ ACE_CHECK_RETURN (RTEventLogAdmin::EventLog::_nil ());
+#else
+ DsLogAdmin::Log_var log =
+ this->create_log_object (id ACE_ENV_ARG_PARAMETER);
+ ACE_CHECK_RETURN (RTEventLogAdmin::EventLog::_nil ());
+#endif
+
+ // narrow to EventLog
+ RTEventLogAdmin::EventLog_var event_log =
+ RTEventLogAdmin::EventLog::_narrow (log.in ());
+
+ // @@ JTC - squelch exception?
+ notifier_->object_creation (id ACE_ENV_ARG_PARAMETER);
+ ACE_CHECK_RETURN (RTEventLogAdmin::EventLog::_nil ());
+
+ return event_log._retn ();
+}
+
+CORBA::RepositoryId
+TAO_RTEventLogFactory_i::create_repositoryid ()
+{
+ return CORBA::string_dup("IDL:omg.org/RTEventLogAdmin:EventLog:1.0");
+}
+
+PortableServer::ServantBase*
+TAO_RTEventLogFactory_i::create_log_servant (DsLogAdmin::LogId id
+ ACE_ENV_ARG_DECL)
+{
+ TAO_RTEventLog_i* event_log_i;
+
+ ACE_NEW_THROW_EX (event_log_i,
+ TAO_RTEventLog_i (this->orb_.in (),
+ this->poa_.in (),
+ this->log_poa_.in (),
+ *this,
+ this->log_mgr_.in (),
+ this->notifier_,
+ id
+ ),
+ CORBA::NO_MEMORY ());
+ ACE_CHECK_RETURN (0);
+
+ event_log_i->init (ACE_ENV_SINGLE_ARG_PARAMETER);
+ ACE_CHECK_RETURN (0);
+
+ //initialise the LogConsumer object
+ event_log_i->activate (ACE_ENV_SINGLE_ARG_PARAMETER);
+ ACE_CHECK_RETURN (0);
+
+ return event_log_i;
+}
+
+RtecEventChannelAdmin::ProxyPushSupplier_ptr
+TAO_RTEventLogFactory_i::obtain_push_supplier (
+ ACE_ENV_SINGLE_ARG_DECL_NOT_USED
+ )
+ ACE_THROW_SPEC ((
+ CORBA::SystemException
+ ))
+{
+ return consumer_admin_->obtain_push_supplier();
+}
+
+TAO_END_VERSIONED_NAMESPACE_DECL
diff --git a/TAO/orbsvcs/orbsvcs/Log/RTEventLogFactory_i.h b/TAO/orbsvcs/orbsvcs/Log/RTEventLogFactory_i.h
new file mode 100644
index 00000000000..d416bd028ec
--- /dev/null
+++ b/TAO/orbsvcs/orbsvcs/Log/RTEventLogFactory_i.h
@@ -0,0 +1,141 @@
+// -*- C++ -*-
+
+//=============================================================================
+/**
+ * @file RTEventLogFactory_i.h
+ *
+ * $Id$
+ *
+ * Implements the Factory for NotifyLog Objects.
+ *
+ * @author David A. Hanvey <d.hanvey@qub.ac.uk>
+ */
+//=============================================================================
+
+#ifndef TLS_RTEVENTLOGFACTORY_I_H
+#define TLS_RTEVENTLOGFACTORY_I_H
+
+#include /**/ "ace/pre.h"
+
+#include "orbsvcs/RTEventLogAdminS.h"
+
+#if !defined (ACE_LACKS_PRAGMA_ONCE)
+# pragma once
+#endif /* ACE_LACKS_PRAGMA_ONCE */
+
+#include "orbsvcs/DsLogAdminS.h"
+#include "orbsvcs/Log/LogMgr_i.h"
+#include "orbsvcs/RtecEventChannelAdminS.h"
+#include "orbsvcs/RtecSchedulerS.h"
+
+#include "orbsvcs/Log/RTEventLog_i.h"
+#include "orbsvcs/Log/rteventlog_serv_export.h"
+
+#if defined(_MSC_VER)
+#pragma warning(push)
+#pragma warning(disable:4250)
+#endif /* _MSC_VER */
+
+TAO_BEGIN_VERSIONED_NAMESPACE_DECL
+
+class TAO_RTEventLog_i;
+class TAO_RTEventLogNotification;
+
+/**
+ * @class TAO_RTEventLogFactory_i
+ *
+ * @brief The TAO_RTEventLogFactory is a factory that is used to create RTEventLogs which are event-aware.
+ */
+class TAO_RTEventLog_Serv_Export TAO_RTEventLogFactory_i :
+ public POA_RTEventLogAdmin::EventLogFactory,
+ public TAO_LogMgr_i
+{
+public:
+ //= Initialization and termination code.
+
+ /// Constructor.
+ TAO_RTEventLogFactory_i (void);
+
+ /// Destructor.
+ ~TAO_RTEventLogFactory_i ();
+
+ /// Initialise the EventChannel and obtain a
+ /// pointer to it.
+ int
+ init (CORBA::ORB_ptr orb,
+ PortableServer::POA_ptr poa
+ ACE_ENV_ARG_DECL);
+
+ /// Activate this servant
+ RTEventLogAdmin::EventLogFactory_ptr
+ activate (ACE_ENV_SINGLE_ARG_DECL);
+
+ /// Used to create a RTEventLog.
+ RTEventLogAdmin::EventLog_ptr create (
+ DsLogAdmin::LogFullActionType full_action,
+ CORBA::ULongLong max_size,
+ const DsLogAdmin::CapacityAlarmThresholdList & thresholds,
+ DsLogAdmin::LogId_out id
+ ACE_ENV_ARG_DECL
+ )
+ ACE_THROW_SPEC ((
+ CORBA::SystemException,
+ DsLogAdmin::InvalidLogFullAction,
+ DsLogAdmin::InvalidThreshold
+ ));
+
+ /// Same as create (), but allows clients to specify the id.
+ RTEventLogAdmin::EventLog_ptr create_with_id (
+ DsLogAdmin::LogId id,
+ DsLogAdmin::LogFullActionType full_action,
+ CORBA::ULongLong max_size,
+ const DsLogAdmin::CapacityAlarmThresholdList & thresholds
+ ACE_ENV_ARG_DECL
+ )
+ ACE_THROW_SPEC ((
+ CORBA::SystemException,
+ DsLogAdmin::LogIdAlreadyExists,
+ DsLogAdmin::InvalidLogFullAction,
+ DsLogAdmin::InvalidThreshold
+ ));
+
+ // = Implementation of the RtecEventChannelAdmin::ConsumerAdmin methods.
+ RtecEventChannelAdmin::ProxyPushSupplier_ptr obtain_push_supplier (
+ ACE_ENV_SINGLE_ARG_DECL
+ )
+ ACE_THROW_SPEC ((
+ CORBA::SystemException
+ ));
+
+protected:
+ virtual CORBA::RepositoryId
+ create_repositoryid ();
+
+ virtual PortableServer::ServantBase*
+ create_log_servant (DsLogAdmin::LogId id
+ ACE_ENV_ARG_DECL);
+
+ /// Our object ref. after <active>ation.
+ DsLogAdmin::LogMgr_var log_mgr_;
+
+ /// The event channel used for log generated events.
+ TAO_EC_Event_Channel *impl;
+
+ /// The object used for log generated events.
+ TAO_RTEventLogNotification* notifier_;
+
+ /// EventChannel used to obtain the ConsumerAdmin.
+ RtecEventChannelAdmin::EventChannel_var event_channel_;
+
+ /// The ConsumerAdmin that the EventLogFactory supports.
+ RtecEventChannelAdmin::ConsumerAdmin_var consumer_admin_;
+};
+
+TAO_END_VERSIONED_NAMESPACE_DECL
+
+#if defined(_MSC_VER)
+#pragma warning(pop)
+#endif /* _MSC_VER */
+
+#include /**/ "ace/post.h"
+#endif /* TAO_TLS_RTEVENTLOGFACTORY_I_H */
diff --git a/TAO/orbsvcs/orbsvcs/Log/RTEventLogNotification.cpp b/TAO/orbsvcs/orbsvcs/Log/RTEventLogNotification.cpp
new file mode 100644
index 00000000000..d3ceeb987e8
--- /dev/null
+++ b/TAO/orbsvcs/orbsvcs/Log/RTEventLogNotification.cpp
@@ -0,0 +1,90 @@
+#include "orbsvcs/Log/LogNotification.h"
+#include "orbsvcs/Log/RTEventLogNotification.h"
+#include "orbsvcs/Time_Utilities.h"
+#include "tao/debug.h"
+#include "orbsvcs/Event_Utilities.h"
+#include "orbsvcs/RtecEventChannelAdminC.h"
+#include "orbsvcs/Event_Service_Constants.h"
+#include "orbsvcs/ESF/ESF_Peer_Workers.h"
+#include "orbsvcs/ESF/ESF_Peer_Admin.h"
+#include "orbsvcs/ESF/ESF_Shutdown_Proxy.h"
+#include "orbsvcs/Event/EC_ProxySupplier.h"
+#include "orbsvcs/Event/EC_Dispatching.h"
+#include "orbsvcs/Event/EC_Filter_Builder.h"
+#include "orbsvcs/Event/EC_QOS_Info.h"
+#include "orbsvcs/Event/EC_Event_Channel.h"
+#include "orbsvcs/Event/EC_Scheduling_Strategy.h"
+#include "orbsvcs/Event/EC_ConsumerControl.h"
+#include "orbsvcs/ESF/ESF_RefCount_Guard.h"
+#include "orbsvcs/ESF/ESF_Proxy_RefCount_Guard.h"
+
+ACE_RCSID (Log,
+ RTEventLogNotification,
+ "$Id$")
+
+TAO_BEGIN_VERSIONED_NAMESPACE_DECL
+
+TAO_RTEventLogNotification::TAO_RTEventLogNotification (
+ RtecEventChannelAdmin::EventChannel_ptr ec)
+ : TAO_LogNotification (),
+ event_channel_ (RtecEventChannelAdmin::EventChannel::_duplicate (ec))
+{
+ ACE_DECLARE_NEW_CORBA_ENV;
+
+ obtainProxyConsumer (ACE_ENV_SINGLE_ARG_PARAMETER);
+}
+
+TAO_RTEventLogNotification::~TAO_RTEventLogNotification (void)
+{
+ // No-Op.
+}
+
+void
+TAO_RTEventLogNotification::disconnect_push_supplier (ACE_ENV_SINGLE_ARG_DECL_NOT_USED)
+ ACE_THROW_SPEC ((CORBA::SystemException))
+{
+ // No-Op.
+}
+
+void
+TAO_RTEventLogNotification::obtainProxyConsumer (ACE_ENV_SINGLE_ARG_DECL)
+{
+ RtecEventChannelAdmin::SupplierAdmin_var supplier_admin =
+ event_channel_->for_suppliers();
+
+ consumer_ = supplier_admin->obtain_push_consumer();
+
+ RtecEventComm::PushSupplier_var supplier =
+ this->_this (ACE_ENV_SINGLE_ARG_PARAMETER);
+
+ // Simple publication, but usually the helper classes in
+ // $TAO_ROOT/orbsvcs/Event_Utils.h are a better way to do this.
+ RtecEventChannelAdmin::SupplierQOS qos;
+ qos.publications.length (1);
+ RtecEventComm::EventHeader& h0 =
+ qos.publications[0].event.header;
+ h0.type = ACE_ES_EVENT_UNDEFINED; // first free event type
+ h0.source = 1; // first free event source
+
+ consumer_->connect_push_supplier (supplier.in(), qos);
+}
+
+void
+TAO_RTEventLogNotification::send_notification (const CORBA::Any& any)
+ ACE_THROW_SPEC ((CORBA::SystemException))
+{
+ RtecEventComm::EventSet event (1);
+ event.length (1);
+ event[0].header.type = ACE_ES_EVENT_UNDEFINED;
+ event[0].header.source = 1;
+ event[0].header.ttl = 1;
+#ifndef TAO_LACKS_EVENT_CHANNEL_ANY
+ event[0].data.any_value <<= any;
+#else
+ ACE_UNUSED_ARG (any);
+#endif
+
+ consumer_->push(event);
+}
+
+TAO_END_VERSIONED_NAMESPACE_DECL
diff --git a/TAO/orbsvcs/orbsvcs/Log/RTEventLogNotification.h b/TAO/orbsvcs/orbsvcs/Log/RTEventLogNotification.h
new file mode 100644
index 00000000000..785efe87c79
--- /dev/null
+++ b/TAO/orbsvcs/orbsvcs/Log/RTEventLogNotification.h
@@ -0,0 +1,93 @@
+// -*- C++ -*-
+
+//=============================================================================
+/**
+ * @file RTEventLogNotification.h
+ *
+ * $Id$
+ *
+ * Methods to enable log-generated events.
+ *
+ * @author D A Hanvey <d.hanvey@qub.ac.uk>
+ */
+//=============================================================================
+
+#ifndef TAO_TLS_RTEVENT_LOG_NOTIFICATION_H
+#define TAO_TLS_RTEVENT_LOG_NOTIFICATION_H
+
+#include /**/ "ace/pre.h"
+
+#include "orbsvcs/Event/EC_ConsumerAdmin.h"
+
+#if !defined (ACE_LACKS_PRAGMA_ONCE)
+# pragma once
+#endif /* ACE_LACKS_PRAGMA_ONCE */
+
+#include "orbsvcs/Event/EC_Event_Channel.h"
+#include "orbsvcs/RTEventLogAdminS.h"
+#include "orbsvcs/Event/EC_Default_Factory.h"
+#include "orbsvcs/RtecEventCommS.h"
+#include "orbsvcs/Event/EC_ProxySupplier.h"
+#include "orbsvcs/Event/EC_ProxyConsumer.h"
+
+#include "orbsvcs/Log/rteventlog_serv_export.h"
+
+#if defined(_MSC_VER)
+#pragma warning(push)
+#pragma warning(disable:4250)
+#endif /* _MSC_VER */
+
+TAO_BEGIN_VERSIONED_NAMESPACE_DECL
+
+/**
+ * @class TAO_RTEventLogNotification
+ *
+ * @brief Used to forward log generated events to a logging server.
+ */
+class TAO_RTEventLog_Serv_Export TAO_RTEventLogNotification :
+ public TAO_LogNotification,
+ public POA_RtecEventComm::PushSupplier
+{
+public:
+ // = Initialization and Termination methods.
+
+ /// Constructor.
+ TAO_RTEventLogNotification (RtecEventChannelAdmin::EventChannel_ptr);
+
+ /// Destructor.
+ ~TAO_RTEventLogNotification (void);
+
+ /// The skeleton methods.
+ virtual void disconnect_push_supplier (ACE_ENV_SINGLE_ARG_DECL_NOT_USED)
+ ACE_THROW_SPEC ((CORBA::SystemException));
+
+protected:
+ // = Helper methods
+
+ /// Used to connect this PushSupplier to the EventChannel
+ /// that will log these events.
+ void obtainProxyConsumer (ACE_ENV_SINGLE_ARG_DECL);
+
+ // Send the event on the event channel.
+ virtual void send_notification (const CORBA::Any& any)
+ ACE_THROW_SPEC ((CORBA::SystemException));
+
+private:
+ /// The ORB reference.
+ CORBA::ORB_var orb_;
+
+ /// The event channel we connect to.
+ RtecEventChannelAdmin::EventChannel_var event_channel_;
+
+ /// The ProxyPushConsumer used to connect to the event channel.
+ RtecEventChannelAdmin::ProxyPushConsumer_var consumer_;
+};
+
+TAO_END_VERSIONED_NAMESPACE_DECL
+
+#if defined(_MSC_VER)
+#pragma warning(pop)
+#endif /* _MSC_VER */
+
+#include /**/ "ace/post.h"
+#endif /* TAO_TLS_RTEVENT_LOG_NOTIFICATION_H */
diff --git a/TAO/orbsvcs/orbsvcs/Log/RTEventLog_i.cpp b/TAO/orbsvcs/orbsvcs/Log/RTEventLog_i.cpp
new file mode 100644
index 00000000000..3aacac1ff86
--- /dev/null
+++ b/TAO/orbsvcs/orbsvcs/Log/RTEventLog_i.cpp
@@ -0,0 +1,166 @@
+#include "orbsvcs/Log/RTEventLog_i.h"
+#include "orbsvcs/Log/LogMgr_i.h"
+#include "orbsvcs/Log/LogNotification.h"
+#include "orbsvcs/Event_Utilities.h"
+#include "orbsvcs/Event/EC_Event_Channel.h"
+#include "orbsvcs/Event/EC_Default_Factory.h"
+#include "orbsvcs/Event/EC_Dispatching.h"
+#include "orbsvcs/Event/EC_ConsumerAdmin.h"
+#include "orbsvcs/Event/EC_SupplierAdmin.h"
+#include "orbsvcs/Event/EC_Timeout_Generator.h"
+#include "orbsvcs/Event/EC_ObserverStrategy.h"
+#include "orbsvcs/Event/EC_ConsumerControl.h"
+#include "orbsvcs/Event/EC_SupplierControl.h"
+#include "ace/Dynamic_Service.h"
+
+ACE_RCSID (Log,
+ RTEventLog_i,
+ "$Id$")
+
+TAO_BEGIN_VERSIONED_NAMESPACE_DECL
+
+TAO_RTEventLog_i::TAO_RTEventLog_i (CORBA::ORB_ptr orb,
+ PortableServer::POA_ptr poa,
+ PortableServer::POA_ptr log_poa,
+ TAO_LogMgr_i &logmgr_i,
+ DsLogAdmin::LogMgr_ptr factory,
+ TAO_LogNotification *log_notifier,
+ DsLogAdmin::LogId id
+ )
+ : TAO_Log_i (orb, logmgr_i, factory, id, log_notifier),
+ poa_ (PortableServer::POA::_duplicate (poa)),
+ log_poa_ (PortableServer::POA::_duplicate (log_poa))
+{
+ ACE_DECLARE_NEW_CORBA_ENV;
+
+ TAO_EC_Event_Channel_Attributes attr (poa_.in(), poa_.in());
+
+ ACE_NEW_THROW_EX (this->event_channel_,
+ TAO_EC_Event_Channel(attr),
+ CORBA::NO_MEMORY ());
+}
+
+TAO_RTEventLog_i::~TAO_RTEventLog_i ()
+{
+ this->event_channel_->destroy ();
+
+ delete this->event_channel_;
+}
+
+
+DsLogAdmin::Log_ptr
+TAO_RTEventLog_i::copy (DsLogAdmin::LogId &id ACE_ENV_ARG_DECL)
+ ACE_THROW_SPEC ((CORBA::SystemException))
+{
+ RTEventLogAdmin::EventLogFactory_var eventLogFactory =
+ RTEventLogAdmin::EventLogFactory::_narrow (factory_.in () ACE_ENV_ARG_PARAMETER);
+ ACE_CHECK_RETURN (DsLogAdmin::Log::_nil ());
+
+ RTEventLogAdmin::EventLog_var log =
+ eventLogFactory->create (DsLogAdmin::halt, 0, thresholds_,
+ id ACE_ENV_ARG_PARAMETER);
+ ACE_CHECK_RETURN (DsLogAdmin::Log::_nil ());
+
+ copy_attributes (log.in () ACE_ENV_ARG_PARAMETER);
+ ACE_CHECK_RETURN (DsLogAdmin::Log::_nil ());
+
+ return log._retn ();
+}
+
+DsLogAdmin::Log_ptr
+TAO_RTEventLog_i::copy_with_id (DsLogAdmin::LogId id ACE_ENV_ARG_DECL)
+ ACE_THROW_SPEC ((DsLogAdmin::LogIdAlreadyExists, CORBA::SystemException))
+{
+ RTEventLogAdmin::EventLogFactory_var eventLogFactory =
+ RTEventLogAdmin::EventLogFactory::_narrow (factory_.in () ACE_ENV_ARG_PARAMETER);
+ ACE_CHECK_RETURN (DsLogAdmin::Log::_nil ());
+
+ RTEventLogAdmin::EventLog_var log =
+ eventLogFactory->create_with_id (id, DsLogAdmin::halt, 0,
+ thresholds_ ACE_ENV_ARG_PARAMETER);
+ ACE_CHECK_RETURN (DsLogAdmin::Log::_nil ());
+
+ copy_attributes (log.in () ACE_ENV_ARG_PARAMETER);
+ ACE_CHECK_RETURN (DsLogAdmin::Log::_nil ());
+
+ return log._retn ();
+}
+
+void
+TAO_RTEventLog_i::destroy (ACE_ENV_SINGLE_ARG_DECL)
+ ACE_THROW_SPEC ((CORBA::SystemException))
+{
+ notifier_->object_deletion (logid_ ACE_ENV_ARG_PARAMETER);
+ ACE_CHECK;
+
+ // Remove ourselves from the list of logs.
+ this->logmgr_i_.remove (this->logid_
+ ACE_ENV_ARG_PARAMETER);
+ ACE_CHECK;
+
+ // Deregister with POA.
+ PortableServer::ObjectId_var id =
+ this->log_poa_->servant_to_id (this
+ ACE_ENV_ARG_PARAMETER);
+ ACE_CHECK;
+
+ this->log_poa_->deactivate_object (id.in ()
+ ACE_ENV_ARG_PARAMETER);
+ ACE_CHECK;
+}
+
+void
+TAO_RTEventLog_i::activate (ACE_ENV_SINGLE_ARG_DECL)
+{
+ RtecEventChannelAdmin::ConsumerAdmin_var consumer_admin =
+ this->event_channel_->for_consumers (ACE_ENV_SINGLE_ARG_PARAMETER);
+ ACE_CHECK;
+
+ this->my_log_consumer_ = new TAO_Rtec_LogConsumer (this);
+ this->my_log_consumer_->connect (consumer_admin.in ());
+}
+
+RtecEventChannelAdmin::ConsumerAdmin_ptr
+TAO_RTEventLog_i::for_consumers (ACE_ENV_SINGLE_ARG_DECL)
+ ACE_THROW_SPEC ((CORBA::SystemException))
+{
+ return this->event_channel_->for_consumers(ACE_ENV_SINGLE_ARG_PARAMETER);
+}
+
+RtecEventChannelAdmin::SupplierAdmin_ptr
+TAO_RTEventLog_i::for_suppliers (
+ ACE_ENV_SINGLE_ARG_DECL
+ )
+ ACE_THROW_SPEC ((
+ CORBA::SystemException
+ ))
+{
+ return this->event_channel_->for_suppliers(ACE_ENV_SINGLE_ARG_PARAMETER);
+}
+
+RtecEventChannelAdmin::Observer_Handle
+TAO_RTEventLog_i::append_observer (
+ RtecEventChannelAdmin::Observer_ptr observer
+ ACE_ENV_ARG_DECL)
+ ACE_THROW_SPEC ((
+ CORBA::SystemException,
+ RtecEventChannelAdmin::EventChannel::SYNCHRONIZATION_ERROR,
+ RtecEventChannelAdmin::EventChannel::CANT_APPEND_OBSERVER))
+{
+ return this->observer_strategy_->append_observer (observer
+ ACE_ENV_ARG_PARAMETER);
+}
+
+void
+TAO_RTEventLog_i::remove_observer (
+ RtecEventChannelAdmin::Observer_Handle handle
+ ACE_ENV_ARG_DECL)
+ ACE_THROW_SPEC ((
+ CORBA::SystemException,
+ RtecEventChannelAdmin::EventChannel::SYNCHRONIZATION_ERROR,
+ RtecEventChannelAdmin::EventChannel::CANT_REMOVE_OBSERVER))
+{
+ this->observer_strategy_->remove_observer (handle ACE_ENV_ARG_PARAMETER);
+}
+
+TAO_END_VERSIONED_NAMESPACE_DECL
diff --git a/TAO/orbsvcs/orbsvcs/Log/RTEventLog_i.h b/TAO/orbsvcs/orbsvcs/Log/RTEventLog_i.h
new file mode 100644
index 00000000000..6dc0b4975b3
--- /dev/null
+++ b/TAO/orbsvcs/orbsvcs/Log/RTEventLog_i.h
@@ -0,0 +1,138 @@
+// -*- C++ -*-
+
+//=============================================================================
+/**
+ * @file RTEventLog_i.h
+ *
+ * $Id$
+ *
+ * Implementation of the RTEventLogAdmin::NotifyLog interface.
+ *
+ *
+ * @author David A. Hanvey <d.hanvey@qub.ac.uk>
+ */
+//=============================================================================
+
+#ifndef TAO_TLS_RTEVENTLOG_I_H
+#define TAO_TLS_RTEVENTLOG_I_H
+
+#include /**/ "ace/pre.h"
+
+#include "orbsvcs/DsLogAdminS.h"
+
+#if !defined (ACE_LACKS_PRAGMA_ONCE)
+# pragma once
+#endif /* ACE_LACKS_PRAGMA_ONCE */
+
+#include "orbsvcs/RTEventLogAdminS.h"
+#include "orbsvcs/Log/Log_i.h"
+#include "orbsvcs/Event/EC_Event_Channel.h"
+#include "orbsvcs/Event/EC_Factory.h"
+#include "orbsvcs/Event/EC_Defaults.h"
+#include "orbsvcs/Log/RTEventLogConsumer.h"
+
+#include "orbsvcs/Log/rteventlog_serv_export.h"
+
+#if defined(_MSC_VER)
+#pragma warning(push)
+#pragma warning(disable:4250)
+#endif /* _MSC_VER */
+
+TAO_BEGIN_VERSIONED_NAMESPACE_DECL
+
+class TAO_LogMgr_i;
+class TAO_RTEventLog_i;
+class TAO_RTEventLogFactory_i;
+
+/**
+ * @class TAO_RTEventLog_i
+ *
+ * @brief The RTEventLog is an EventChannel and a Log.
+ *
+ * It is used to log events that pass through the EventChannel.
+ * The class supports the @c destroy> method to destroy the Log.
+ */
+class TAO_RTEventLog_Serv_Export TAO_RTEventLog_i :
+ public TAO_Log_i,
+ public POA_RTEventLogAdmin::EventLog
+{
+public:
+ // = Initialization and Termination methods.
+
+ /// Constructor.
+ TAO_RTEventLog_i (CORBA::ORB_ptr orb,
+ PortableServer::POA_ptr poa,
+ PortableServer::POA_ptr log_poa,
+ TAO_LogMgr_i &logmgr_i,
+ DsLogAdmin::LogMgr_ptr factory,
+ TAO_LogNotification *log_notifier,
+ DsLogAdmin::LogId id);
+
+ /// Destructor.
+ ~TAO_RTEventLog_i ();
+
+ /// Duplicate the log.
+ virtual DsLogAdmin::Log_ptr copy (DsLogAdmin::LogId &id ACE_ENV_ARG_DECL)
+ ACE_THROW_SPEC ((CORBA::SystemException));
+
+ /// Duplicate the log specifying an id.
+ virtual DsLogAdmin::Log_ptr copy_with_id (DsLogAdmin::LogId id ACE_ENV_ARG_DECL)
+ ACE_THROW_SPEC ((DsLogAdmin::LogIdAlreadyExists, CORBA::SystemException));
+
+ /// Destroy the log object and all contained records.
+ void
+ destroy (ACE_ENV_SINGLE_ARG_DECL)
+ ACE_THROW_SPEC ((CORBA::SystemException));
+
+ /// Activate the RTEventLog.
+ void
+ activate (ACE_ENV_SINGLE_ARG_DECL);
+
+ // = The RtecEventChannelAdmin::EventChannel interface methods.
+ RtecEventChannelAdmin::ConsumerAdmin_ptr
+ for_consumers (ACE_ENV_SINGLE_ARG_DECL)
+ ACE_THROW_SPEC ((CORBA::SystemException));
+
+ RtecEventChannelAdmin::SupplierAdmin_ptr
+ for_suppliers (ACE_ENV_SINGLE_ARG_DECL)
+ ACE_THROW_SPEC ((CORBA::SystemException));
+
+ virtual RtecEventChannelAdmin::Observer_Handle
+ append_observer (RtecEventChannelAdmin::Observer_ptr
+ ACE_ENV_ARG_DECL)
+ ACE_THROW_SPEC ((
+ CORBA::SystemException,
+ RtecEventChannelAdmin::EventChannel::SYNCHRONIZATION_ERROR,
+ RtecEventChannelAdmin::EventChannel::CANT_APPEND_OBSERVER));
+ virtual void
+ remove_observer (RtecEventChannelAdmin::Observer_Handle
+ ACE_ENV_ARG_DECL)
+ ACE_THROW_SPEC ((
+ CORBA::SystemException,
+ RtecEventChannelAdmin::EventChannel::SYNCHRONIZATION_ERROR,
+ RtecEventChannelAdmin::EventChannel::CANT_REMOVE_OBSERVER));
+
+ private:
+ /// The EventChannel used.
+ TAO_EC_Event_Channel *event_channel_;
+
+ /// The LogConsumer which logs the events the EventChannel above
+ /// receives.
+ TAO_Rtec_LogConsumer *my_log_consumer_;
+
+ /// The observer strategy
+ TAO_EC_ObserverStrategy *observer_strategy_;
+
+ PortableServer::POA_var poa_;
+
+ PortableServer::POA_var log_poa_;
+};
+
+TAO_END_VERSIONED_NAMESPACE_DECL
+
+#if defined(_MSC_VER)
+#pragma warning(pop)
+#endif /* _MSC_VER */
+
+#include /**/ "ace/post.h"
+#endif /* TAO_TLS_RTEVENTLOG_I_H */
diff --git a/TAO/orbsvcs/orbsvcs/Log/eventlog_export.h b/TAO/orbsvcs/orbsvcs/Log/eventlog_export.h
new file mode 100644
index 00000000000..2b21d1f4463
--- /dev/null
+++ b/TAO/orbsvcs/orbsvcs/Log/eventlog_export.h
@@ -0,0 +1,37 @@
+/* -*- C++ -*- $Id$ */
+// generate_export_file.pl,v 1.8 2001/03/04 09:16:29 nanbor Exp
+// Definition for Win32 Export directives.
+// This file is generated automatically by generate_export_file.pl
+// ------------------------------
+#ifndef TAO_EVENTLOG_EXPORT_H
+#define TAO_EVENTLOG_EXPORT_H
+
+#include "ace/config-all.h"
+
+#if defined (ACE_AS_STATIC_LIBS) && !defined (TAO_EVENTLOG_HAS_DLL)
+# define TAO_EVENTLOG_HAS_DLL 0
+#endif /* ACE_AS_STATIC_LIBS && TAO_EVENTLOG_HAS_DLL */
+
+#if !defined (TAO_EVENTLOG_HAS_DLL)
+# define TAO_EVENTLOG_HAS_DLL 1
+#endif /* ! TAO_EVENTLOG_HAS_DLL */
+
+#if defined (TAO_EVENTLOG_HAS_DLL) && (TAO_EVENTLOG_HAS_DLL == 1)
+# if defined (TAO_EVENTLOG_BUILD_DLL)
+# define TAO_EventLog_Export ACE_Proper_Export_Flag
+# define TAO_EVENTLOG_SINGLETON_DECLARATION(T) ACE_EXPORT_SINGLETON_DECLARATION (T)
+# define TAO_EVENTLOG_SINGLETON_DECLARE(SINGLETON_TYPE, CLASS, LOCK) ACE_EXPORT_SINGLETON_DECLARE(SINGLETON_TYPE, CLASS, LOCK)
+# else /* TAO_EVENTLOG_BUILD_DLL */
+# define TAO_EventLog_Export ACE_Proper_Import_Flag
+# define TAO_EVENTLOG_SINGLETON_DECLARATION(T) ACE_IMPORT_SINGLETON_DECLARATION (T)
+# define TAO_EVENTLOG_SINGLETON_DECLARE(SINGLETON_TYPE, CLASS, LOCK) ACE_IMPORT_SINGLETON_DECLARE(SINGLETON_TYPE, CLASS, LOCK)
+# endif /* TAO_EVENTLOG_BUILD_DLL */
+#else /* TAO_EVENTLOG_HAS_DLL == 1 */
+# define TAO_EventLog_Export
+# define TAO_EVENTLOG_SINGLETON_DECLARATION(T)
+# define TAO_EVENTLOG_SINGLETON_DECLARE(SINGLETON_TYPE, CLASS, LOCK)
+#endif /* TAO_EVENTLOG_HAS_DLL == 1 */
+
+#endif /* TAO_EVENTLOG_EXPORT_H */
+
+// End of auto generated file.
diff --git a/TAO/orbsvcs/orbsvcs/Log/eventlog_serv_export.h b/TAO/orbsvcs/orbsvcs/Log/eventlog_serv_export.h
new file mode 100644
index 00000000000..f3537333c31
--- /dev/null
+++ b/TAO/orbsvcs/orbsvcs/Log/eventlog_serv_export.h
@@ -0,0 +1,37 @@
+/* -*- C++ -*- $Id$ */
+// generate_export_file.pl,v 1.8 2001/03/04 09:16:29 nanbor Exp
+// Definition for Win32 Export directives.
+// This file is generated automatically by generate_export_file.pl
+// ------------------------------
+#ifndef TAO_EVENTLOG_SERV_EXPORT_H
+#define TAO_EVENTLOG_SERV_EXPORT_H
+
+#include "ace/config-all.h"
+
+#if defined (ACE_AS_STATIC_LIBS) && !defined (TAO_EVENTLOG_SERV_HAS_DLL)
+# define TAO_EVENTLOG_SERV_HAS_DLL 0
+#endif /* ACE_AS_STATIC_LIBS && TAO_EVENTLOG_SERV_HAS_DLL */
+
+#if !defined (TAO_EVENTLOG_SERV_HAS_DLL)
+# define TAO_EVENTLOG_SERV_HAS_DLL 1
+#endif /* ! TAO_EVENTLOG_SERV_HAS_DLL */
+
+#if defined (TAO_EVENTLOG_SERV_HAS_DLL) && (TAO_EVENTLOG_SERV_HAS_DLL == 1)
+# if defined (TAO_EVENTLOG_SERV_BUILD_DLL)
+# define TAO_EventLog_Serv_Export ACE_Proper_Export_Flag
+# define TAO_EVENTLOG_SERV_SINGLETON_DECLARATION(T) ACE_EXPORT_SINGLETON_DECLARATION (T)
+# define TAO_EVENTLOG_SERV_SINGLETON_DECLARE(SINGLETON_TYPE, CLASS, LOCK) ACE_EXPORT_SINGLETON_DECLARE(SINGLETON_TYPE, CLASS, LOCK)
+# else /* TAO_EVENTLOG_SERV_BUILD_DLL */
+# define TAO_EventLog_Serv_Export ACE_Proper_Import_Flag
+# define TAO_EVENTLOG_SERV_SINGLETON_DECLARATION(T) ACE_IMPORT_SINGLETON_DECLARATION (T)
+# define TAO_EVENTLOG_SERV_SINGLETON_DECLARE(SINGLETON_TYPE, CLASS, LOCK) ACE_IMPORT_SINGLETON_DECLARE(SINGLETON_TYPE, CLASS, LOCK)
+# endif /* TAO_EVENTLOG_SERV_BUILD_DLL */
+#else /* TAO_EVENTLOG_SERV_HAS_DLL == 1 */
+# define TAO_EventLog_Serv_Export
+# define TAO_EVENTLOG_SERV_SINGLETON_DECLARATION(T)
+# define TAO_EVENTLOG_SERV_SINGLETON_DECLARE(SINGLETON_TYPE, CLASS, LOCK)
+#endif /* TAO_EVENTLOG_SERV_HAS_DLL == 1 */
+
+#endif /* TAO_EVENTLOG_SERV_EXPORT_H */
+
+// End of auto generated file.
diff --git a/TAO/orbsvcs/orbsvcs/Log/eventlog_skel_export.h b/TAO/orbsvcs/orbsvcs/Log/eventlog_skel_export.h
new file mode 100644
index 00000000000..f0d5cb23cf2
--- /dev/null
+++ b/TAO/orbsvcs/orbsvcs/Log/eventlog_skel_export.h
@@ -0,0 +1,37 @@
+/* -*- C++ -*- $Id$ */
+// generate_export_file.pl,v 1.8 2001/03/04 09:16:29 nanbor Exp
+// Definition for Win32 Export directives.
+// This file is generated automatically by generate_export_file.pl
+// ------------------------------
+#ifndef TAO_EVENTLOG_SKEL_EXPORT_H
+#define TAO_EVENTLOG_SKEL_EXPORT_H
+
+#include "ace/config-all.h"
+
+#if defined (ACE_AS_STATIC_LIBS) && !defined (TAO_EVENTLOG_SKEL_HAS_DLL)
+# define TAO_EVENTLOG_SKEL_HAS_DLL 0
+#endif /* ACE_AS_STATIC_LIBS && TAO_EVENTLOG_SKEL_HAS_DLL */
+
+#if !defined (TAO_EVENTLOG_SKEL_HAS_DLL)
+# define TAO_EVENTLOG_SKEL_HAS_DLL 1
+#endif /* ! TAO_EVENTLOG_SKEL_HAS_DLL */
+
+#if defined (TAO_EVENTLOG_SKEL_HAS_DLL) && (TAO_EVENTLOG_SKEL_HAS_DLL == 1)
+# if defined (TAO_EVENTLOG_SKEL_BUILD_DLL)
+# define TAO_EventLog_Skel_Export ACE_Proper_Export_Flag
+# define TAO_EVENTLOG_SKEL_SINGLETON_DECLARATION(T) ACE_EXPORT_SINGLETON_DECLARATION (T)
+# define TAO_EVENTLOG_SKEL_SINGLETON_DECLARE(SINGLETON_TYPE, CLASS, LOCK) ACE_EXPORT_SINGLETON_DECLARE(SINGLETON_TYPE, CLASS, LOCK)
+# else /* TAO_EVENTLOG_SKEL_BUILD_DLL */
+# define TAO_EventLog_Skel_Export ACE_Proper_Import_Flag
+# define TAO_EVENTLOG_SKEL_SINGLETON_DECLARATION(T) ACE_IMPORT_SINGLETON_DECLARATION (T)
+# define TAO_EVENTLOG_SKEL_SINGLETON_DECLARE(SINGLETON_TYPE, CLASS, LOCK) ACE_IMPORT_SINGLETON_DECLARE(SINGLETON_TYPE, CLASS, LOCK)
+# endif /* TAO_EVENTLOG_SKEL_BUILD_DLL */
+#else /* TAO_EVENTLOG_SKEL_HAS_DLL == 1 */
+# define TAO_EventLog_Skel_Export
+# define TAO_EVENTLOG_SKEL_SINGLETON_DECLARATION(T)
+# define TAO_EVENTLOG_SKEL_SINGLETON_DECLARE(SINGLETON_TYPE, CLASS, LOCK)
+#endif /* TAO_EVENTLOG_SKEL_HAS_DLL == 1 */
+
+#endif /* TAO_EVENTLOG_SKEL_EXPORT_H */
+
+// End of auto generated file.
diff --git a/TAO/orbsvcs/orbsvcs/Log/log_export.h b/TAO/orbsvcs/orbsvcs/Log/log_export.h
new file mode 100644
index 00000000000..97ea3366e3e
--- /dev/null
+++ b/TAO/orbsvcs/orbsvcs/Log/log_export.h
@@ -0,0 +1,39 @@
+/* -*- C++ -*- $Id$ */
+// log_export.h,v 1.2 2000/10/10 22:16:02 nanbor Exp
+// Definition for Win32 Export directives.
+// This file is generated automatically by generate_export_file.pl
+// ------------------------------
+#ifndef TAO_LOG_EXPORT_H
+#define TAO_LOG_EXPORT_H
+
+#include "ace/config-all.h"
+
+#if defined (TAO_AS_STATIC_LIBS)
+# if !defined (TAO_LOG_HAS_DLL)
+# define TAO_LOG_HAS_DLL 0
+# endif /* ! TAO_LOG_HAS_DLL */
+#else
+# if !defined (TAO_LOG_HAS_DLL)
+# define TAO_LOG_HAS_DLL 1
+# endif /* ! TAO_LOG_HAS_DLL */
+#endif
+
+#if defined (TAO_LOG_HAS_DLL) && (TAO_LOG_HAS_DLL == 1)
+# if defined (TAO_LOG_BUILD_DLL)
+# define TAO_Log_Export ACE_Proper_Export_Flag
+# define TAO_LOG_SINGLETON_DECLARATION(T) ACE_EXPORT_SINGLETON_DECLARATION (T)
+# define TAO_LOG_SINGLETON_DECLARE(SINGLETON_TYPE, CLASS, LOCK) ACE_EXPORT_SINGLETON_DECLARE(SINGLETON_TYPE, CLASS, LOCK)
+# else /* TAO_LOG_BUILD_DLL */
+# define TAO_Log_Export ACE_Proper_Import_Flag
+# define TAO_LOG_SINGLETON_DECLARATION(T) ACE_IMPORT_SINGLETON_DECLARATION (T)
+# define TAO_LOG_SINGLETON_DECLARE(SINGLETON_TYPE, CLASS, LOCK) ACE_IMPORT_SINGLETON_DECLARE(SINGLETON_TYPE, CLASS, LOCK)
+# endif /* TAO_LOG_BUILD_DLL */
+#else /* TAO_LOG_HAS_DLL == 1 */
+# define TAO_Log_Export
+# define TAO_LOG_SINGLETON_DECLARATION(T)
+# define TAO_LOG_SINGLETON_DECLARE(SINGLETON_TYPE, CLASS, LOCK)
+#endif /* TAO_LOG_HAS_DLL == 1 */
+
+#endif /* TAO_LOG_EXPORT_H */
+
+// End of auto generated file.
diff --git a/TAO/orbsvcs/orbsvcs/Log/log_serv_export.h b/TAO/orbsvcs/orbsvcs/Log/log_serv_export.h
new file mode 100644
index 00000000000..000f75e5922
--- /dev/null
+++ b/TAO/orbsvcs/orbsvcs/Log/log_serv_export.h
@@ -0,0 +1,39 @@
+/* -*- C++ -*- $Id$ */
+// log_serv_export.h,v 1.2 2000/10/10 22:16:02 nanbor Exp
+// Definition for Win32 Export directives.
+// This file is generated automatically by generate_export_file.pl
+// ------------------------------
+#ifndef TAO_LOG_SERV_EXPORT_H
+#define TAO_LOG_SERV_EXPORT_H
+
+#include "ace/config-all.h"
+
+#if defined (TAO_AS_STATIC_LIBS)
+# if !defined (TAO_LOG_SERV_HAS_DLL)
+# define TAO_LOG_SERV_HAS_DLL 0
+# endif /* ! TAO_LOG_SERV_HAS_DLL */
+#else
+# if !defined (TAO_LOG_SERV_HAS_DLL)
+# define TAO_LOG_SERV_HAS_DLL 1
+# endif /* ! TAO_LOG_SERV_HAS_DLL */
+#endif
+
+#if defined (TAO_LOG_SERV_HAS_DLL) && (TAO_LOG_SERV_HAS_DLL == 1)
+# if defined (TAO_LOG_SERV_BUILD_DLL)
+# define TAO_Log_Serv_Export ACE_Proper_Export_Flag
+# define TAO_LOG_SERV_SINGLETON_DECLARATION(T) ACE_EXPORT_SINGLETON_DECLARATION (T)
+# define TAO_LOG_SERV_SINGLETON_DECLARE(SINGLETON_TYPE, CLASS, LOCK) ACE_EXPORT_SINGLETON_DECLARE(SINGLETON_TYPE, CLASS, LOCK)
+# else /* TAO_LOG_SERV_BUILD_DLL */
+# define TAO_Log_Serv_Export ACE_Proper_Import_Flag
+# define TAO_LOG_SERV_SINGLETON_DECLARATION(T) ACE_IMPORT_SINGLETON_DECLARATION (T)
+# define TAO_LOG_SERV_SINGLETON_DECLARE(SINGLETON_TYPE, CLASS, LOCK) ACE_IMPORT_SINGLETON_DECLARE(SINGLETON_TYPE, CLASS, LOCK)
+# endif /* TAO_LOG_SERV_BUILD_DLL */
+#else /* TAO_LOG_SERV_HAS_DLL == 1 */
+# define TAO_Log_Serv_Export
+# define TAO_LOG_SERV_SINGLETON_DECLARATION(T)
+# define TAO_LOG_SERV_SINGLETON_DECLARE(SINGLETON_TYPE, CLASS, LOCK)
+#endif /* TAO_LOG_SERV_HAS_DLL == 1 */
+
+#endif /* TAO_LOG_SERV_EXPORT_H */
+
+// End of auto generated file.
diff --git a/TAO/orbsvcs/orbsvcs/Log/log_skel_export.h b/TAO/orbsvcs/orbsvcs/Log/log_skel_export.h
new file mode 100644
index 00000000000..db1ff0231fc
--- /dev/null
+++ b/TAO/orbsvcs/orbsvcs/Log/log_skel_export.h
@@ -0,0 +1,41 @@
+
+
+/* -*- C++ -*- $Id$ */
+// log_skel_export.h,v 1.2 2000/10/10 22:16:02 nanbor Exp
+// Definition for Win32 Export directives.
+// This file is generated automatically by generate_export_file.pl
+// ------------------------------
+#ifndef TAO_LOG_SKEL_EXPORT_H
+#define TAO_LOG_SKEL_EXPORT_H
+
+#include "ace/config-all.h"
+
+#if defined (TAO_AS_STATIC_LIBS)
+# if !defined (TAO_LOG_SKEL_HAS_DLL)
+# define TAO_LOG_SKEL_HAS_DLL 0
+# endif /* ! TAO_LOG_SKEL_HAS_DLL */
+#else
+# if !defined (TAO_LOG_SKEL_HAS_DLL)
+# define TAO_LOG_SKEL_HAS_DLL 1
+# endif /* ! TAO_LOG_SKEL_HAS_DLL */
+#endif
+
+#if defined (TAO_LOG_SKEL_HAS_DLL) && (TAO_LOG_SKEL_HAS_DLL == 1)
+# if defined (TAO_LOG_SKEL_BUILD_DLL)
+# define TAO_Log_Skel_Export ACE_Proper_Export_Flag
+# define TAO_LOG_SKEL_SINGLETON_DECLARATION(T) ACE_EXPORT_SINGLETON_DECLARATION (T)
+# define TAO_LOG_SKEL_SINGLETON_DECLARE(SINGLETON_TYPE, CLASS, LOCK) ACE_EXPORT_SINGLETON_DECLARE(SINGLETON_TYPE, CLASS, LOCK)
+# else /* TAO_LOG_SKEL_BUILD_DLL */
+# define TAO_Log_Skel_Export ACE_Proper_Import_Flag
+# define TAO_LOG_SKEL_SINGLETON_DECLARATION(T) ACE_IMPORT_SINGLETON_DECLARATION (T)
+# define TAO_LOG_SKEL_SINGLETON_DECLARE(SINGLETON_TYPE, CLASS, LOCK) ACE_IMPORT_SINGLETON_DECLARE(SINGLETON_TYPE, CLASS, LOCK)
+# endif /* TAO_LOG_SKEL_BUILD_DLL */
+#else /* TAO_LOG_SKEL_HAS_DLL == 1 */
+# define TAO_Log_Skel_Export
+# define TAO_LOG_SKEL_SINGLETON_DECLARATION(T)
+# define TAO_LOG_SKEL_SINGLETON_DECLARE(SINGLETON_TYPE, CLASS, LOCK)
+#endif /* TAO_LOG_SKEL_HAS_DLL == 1 */
+
+#endif /* TAO_LOG_SKEL_EXPORT_H */
+
+// End of auto generated file.
diff --git a/TAO/orbsvcs/orbsvcs/Log/notifylog_export.h b/TAO/orbsvcs/orbsvcs/Log/notifylog_export.h
new file mode 100644
index 00000000000..c9f1d99ef4e
--- /dev/null
+++ b/TAO/orbsvcs/orbsvcs/Log/notifylog_export.h
@@ -0,0 +1,37 @@
+/* -*- C++ -*- $Id$ */
+// generate_export_file.pl,v 1.8 2001/03/04 09:16:29 nanbor Exp
+// Definition for Win32 Export directives.
+// This file is generated automatically by generate_export_file.pl
+// ------------------------------
+#ifndef TAO_NOTIFYLOG_EXPORT_H
+#define TAO_NOTIFYLOG_EXPORT_H
+
+#include "ace/config-all.h"
+
+#if defined (ACE_AS_STATIC_LIBS) && !defined (TAO_NOTIFYLOG_HAS_DLL)
+# define TAO_NOTIFYLOG_HAS_DLL 0
+#endif /* ACE_AS_STATIC_LIBS && TAO_NOTIFYLOG_HAS_DLL */
+
+#if !defined (TAO_NOTIFYLOG_HAS_DLL)
+# define TAO_NOTIFYLOG_HAS_DLL 1
+#endif /* ! TAO_NOTIFYLOG_HAS_DLL */
+
+#if defined (TAO_NOTIFYLOG_HAS_DLL) && (TAO_NOTIFYLOG_HAS_DLL == 1)
+# if defined (TAO_NOTIFYLOG_BUILD_DLL)
+# define TAO_NotifyLog_Export ACE_Proper_Export_Flag
+# define TAO_NOTIFYLOG_SINGLETON_DECLARATION(T) ACE_EXPORT_SINGLETON_DECLARATION (T)
+# define TAO_NOTIFYLOG_SINGLETON_DECLARE(SINGLETON_TYPE, CLASS, LOCK) ACE_EXPORT_SINGLETON_DECLARE(SINGLETON_TYPE, CLASS, LOCK)
+# else /* TAO_NOTIFYLOG_BUILD_DLL */
+# define TAO_NotifyLog_Export ACE_Proper_Import_Flag
+# define TAO_NOTIFYLOG_SINGLETON_DECLARATION(T) ACE_IMPORT_SINGLETON_DECLARATION (T)
+# define TAO_NOTIFYLOG_SINGLETON_DECLARE(SINGLETON_TYPE, CLASS, LOCK) ACE_IMPORT_SINGLETON_DECLARE(SINGLETON_TYPE, CLASS, LOCK)
+# endif /* TAO_NOTIFYLOG_BUILD_DLL */
+#else /* TAO_NOTIFYLOG_HAS_DLL == 1 */
+# define TAO_NotifyLog_Export
+# define TAO_NOTIFYLOG_SINGLETON_DECLARATION(T)
+# define TAO_NOTIFYLOG_SINGLETON_DECLARE(SINGLETON_TYPE, CLASS, LOCK)
+#endif /* TAO_NOTIFYLOG_HAS_DLL == 1 */
+
+#endif /* TAO_NOTIFYLOG_EXPORT_H */
+
+// End of auto generated file.
diff --git a/TAO/orbsvcs/orbsvcs/Log/notifylog_serv_export.h b/TAO/orbsvcs/orbsvcs/Log/notifylog_serv_export.h
new file mode 100644
index 00000000000..b9a3c655dc8
--- /dev/null
+++ b/TAO/orbsvcs/orbsvcs/Log/notifylog_serv_export.h
@@ -0,0 +1,37 @@
+/* -*- C++ -*- $Id$ */
+// generate_export_file.pl,v 1.8 2001/03/04 09:16:29 nanbor Exp
+// Definition for Win32 Export directives.
+// This file is generated automatically by generate_export_file.pl
+// ------------------------------
+#ifndef TAO_NOTIFYLOG_SERV_EXPORT_H
+#define TAO_NOTIFYLOG_SERV_EXPORT_H
+
+#include "ace/config-all.h"
+
+#if defined (ACE_AS_STATIC_LIBS) && !defined (TAO_NOTIFYLOG_SERV_HAS_DLL)
+# define TAO_NOTIFYLOG_SERV_HAS_DLL 0
+#endif /* ACE_AS_STATIC_LIBS && TAO_NOTIFYLOG_SERV_HAS_DLL */
+
+#if !defined (TAO_NOTIFYLOG_SERV_HAS_DLL)
+# define TAO_NOTIFYLOG_SERV_HAS_DLL 1
+#endif /* ! TAO_NOTIFYLOG_SERV_HAS_DLL */
+
+#if defined (TAO_NOTIFYLOG_SERV_HAS_DLL) && (TAO_NOTIFYLOG_SERV_HAS_DLL == 1)
+# if defined (TAO_NOTIFYLOG_SERV_BUILD_DLL)
+# define TAO_NotifyLog_Serv_Export ACE_Proper_Export_Flag
+# define TAO_NOTIFYLOG_SERV_SINGLETON_DECLARATION(T) ACE_EXPORT_SINGLETON_DECLARATION (T)
+# define TAO_NOTIFYLOG_SERV_SINGLETON_DECLARE(SINGLETON_TYPE, CLASS, LOCK) ACE_EXPORT_SINGLETON_DECLARE(SINGLETON_TYPE, CLASS, LOCK)
+# else /* TAO_NOTIFYLOG_SERV_BUILD_DLL */
+# define TAO_NotifyLog_Serv_Export ACE_Proper_Import_Flag
+# define TAO_NOTIFYLOG_SERV_SINGLETON_DECLARATION(T) ACE_IMPORT_SINGLETON_DECLARATION (T)
+# define TAO_NOTIFYLOG_SERV_SINGLETON_DECLARE(SINGLETON_TYPE, CLASS, LOCK) ACE_IMPORT_SINGLETON_DECLARE(SINGLETON_TYPE, CLASS, LOCK)
+# endif /* TAO_NOTIFYLOG_SERV_BUILD_DLL */
+#else /* TAO_NOTIFYLOG_SERV_HAS_DLL == 1 */
+# define TAO_NotifyLog_Serv_Export
+# define TAO_NOTIFYLOG_SERV_SINGLETON_DECLARATION(T)
+# define TAO_NOTIFYLOG_SERV_SINGLETON_DECLARE(SINGLETON_TYPE, CLASS, LOCK)
+#endif /* TAO_NOTIFYLOG_SERV_HAS_DLL == 1 */
+
+#endif /* TAO_NOTIFYLOG_SERV_EXPORT_H */
+
+// End of auto generated file.
diff --git a/TAO/orbsvcs/orbsvcs/Log/notifylog_skel_export.h b/TAO/orbsvcs/orbsvcs/Log/notifylog_skel_export.h
new file mode 100644
index 00000000000..b810fa8bb69
--- /dev/null
+++ b/TAO/orbsvcs/orbsvcs/Log/notifylog_skel_export.h
@@ -0,0 +1,37 @@
+/* -*- C++ -*- $Id$ */
+// generate_export_file.pl,v 1.8 2001/03/04 09:16:29 nanbor Exp
+// Definition for Win32 Export directives.
+// This file is generated automatically by generate_export_file.pl
+// ------------------------------
+#ifndef TAO_NOTIFYLOG_SKEL_EXPORT_H
+#define TAO_NOTIFYLOG_SKEL_EXPORT_H
+
+#include "ace/config-all.h"
+
+#if defined (ACE_AS_STATIC_LIBS) && !defined (TAO_NOTIFYLOG_SKEL_HAS_DLL)
+# define TAO_NOTIFYLOG_SKEL_HAS_DLL 0
+#endif /* ACE_AS_STATIC_LIBS && TAO_NOTIFYLOG_SKEL_HAS_DLL */
+
+#if !defined (TAO_NOTIFYLOG_SKEL_HAS_DLL)
+# define TAO_NOTIFYLOG_SKEL_HAS_DLL 1
+#endif /* ! TAO_NOTIFYLOG_SKEL_HAS_DLL */
+
+#if defined (TAO_NOTIFYLOG_SKEL_HAS_DLL) && (TAO_NOTIFYLOG_SKEL_HAS_DLL == 1)
+# if defined (TAO_NOTIFYLOG_SKEL_BUILD_DLL)
+# define TAO_NotifyLog_Skel_Export ACE_Proper_Export_Flag
+# define TAO_NOTIFYLOG_SKEL_SINGLETON_DECLARATION(T) ACE_EXPORT_SINGLETON_DECLARATION (T)
+# define TAO_NOTIFYLOG_SKEL_SINGLETON_DECLARE(SINGLETON_TYPE, CLASS, LOCK) ACE_EXPORT_SINGLETON_DECLARE(SINGLETON_TYPE, CLASS, LOCK)
+# else /* TAO_NOTIFYLOG_SKEL_BUILD_DLL */
+# define TAO_NotifyLog_Skel_Export ACE_Proper_Import_Flag
+# define TAO_NOTIFYLOG_SKEL_SINGLETON_DECLARATION(T) ACE_IMPORT_SINGLETON_DECLARATION (T)
+# define TAO_NOTIFYLOG_SKEL_SINGLETON_DECLARE(SINGLETON_TYPE, CLASS, LOCK) ACE_IMPORT_SINGLETON_DECLARE(SINGLETON_TYPE, CLASS, LOCK)
+# endif /* TAO_NOTIFYLOG_SKEL_BUILD_DLL */
+#else /* TAO_NOTIFYLOG_SKEL_HAS_DLL == 1 */
+# define TAO_NotifyLog_Skel_Export
+# define TAO_NOTIFYLOG_SKEL_SINGLETON_DECLARATION(T)
+# define TAO_NOTIFYLOG_SKEL_SINGLETON_DECLARE(SINGLETON_TYPE, CLASS, LOCK)
+#endif /* TAO_NOTIFYLOG_SKEL_HAS_DLL == 1 */
+
+#endif /* TAO_NOTIFYLOG_SKEL_EXPORT_H */
+
+// End of auto generated file.
diff --git a/TAO/orbsvcs/orbsvcs/Log/rteventlog_export.h b/TAO/orbsvcs/orbsvcs/Log/rteventlog_export.h
new file mode 100644
index 00000000000..9ad106e8d33
--- /dev/null
+++ b/TAO/orbsvcs/orbsvcs/Log/rteventlog_export.h
@@ -0,0 +1,37 @@
+/* -*- C++ -*- $Id$ */
+// generate_export_file.pl,v 1.8 2001/03/04 09:16:29 nanbor Exp
+// Definition for Win32 Export directives.
+// This file is generated automatically by generate_export_file.pl
+// ------------------------------
+#ifndef TAO_RTEVENTLOG_EXPORT_H
+#define TAO_RTEVENTLOG_EXPORT_H
+
+#include "ace/config-all.h"
+
+#if defined (ACE_AS_STATIC_LIBS) && !defined (TAO_RTEVENTLOG_HAS_DLL)
+# define TAO_RTEVENTLOG_HAS_DLL 0
+#endif /* ACE_AS_STATIC_LIBS && TAO_RTEVENTLOG_HAS_DLL */
+
+#if !defined (TAO_RTEVENTLOG_HAS_DLL)
+# define TAO_RTEVENTLOG_HAS_DLL 1
+#endif /* ! TAO_RTEVENTLOG_HAS_DLL */
+
+#if defined (TAO_RTEVENTLOG_HAS_DLL) && (TAO_RTEVENTLOG_HAS_DLL == 1)
+# if defined (TAO_RTEVENTLOG_BUILD_DLL)
+# define TAO_RTEventLog_Export ACE_Proper_Export_Flag
+# define TAO_RTEVENTLOG_SINGLETON_DECLARATION(T) ACE_EXPORT_SINGLETON_DECLARATION (T)
+# define TAO_RTEVENTLOG_SINGLETON_DECLARE(SINGLETON_TYPE, CLASS, LOCK) ACE_EXPORT_SINGLETON_DECLARE(SINGLETON_TYPE, CLASS, LOCK)
+# else /* TAO_RTEVENTLOG_BUILD_DLL */
+# define TAO_RTEventLog_Export ACE_Proper_Import_Flag
+# define TAO_RTEVENTLOG_SINGLETON_DECLARATION(T) ACE_IMPORT_SINGLETON_DECLARATION (T)
+# define TAO_RTEVENTLOG_SINGLETON_DECLARE(SINGLETON_TYPE, CLASS, LOCK) ACE_IMPORT_SINGLETON_DECLARE(SINGLETON_TYPE, CLASS, LOCK)
+# endif /* TAO_RTEVENTLOG_BUILD_DLL */
+#else /* TAO_RTEVENTLOG_HAS_DLL == 1 */
+# define TAO_RTEventLog_Export
+# define TAO_RTEVENTLOG_SINGLETON_DECLARATION(T)
+# define TAO_RTEVENTLOG_SINGLETON_DECLARE(SINGLETON_TYPE, CLASS, LOCK)
+#endif /* TAO_RTEVENTLOG_HAS_DLL == 1 */
+
+#endif /* TAO_RTEVENTLOG_EXPORT_H */
+
+// End of auto generated file.
diff --git a/TAO/orbsvcs/orbsvcs/Log/rteventlog_serv_export.h b/TAO/orbsvcs/orbsvcs/Log/rteventlog_serv_export.h
new file mode 100644
index 00000000000..c3791cd48ae
--- /dev/null
+++ b/TAO/orbsvcs/orbsvcs/Log/rteventlog_serv_export.h
@@ -0,0 +1,37 @@
+/* -*- C++ -*- $Id$ */
+// generate_export_file.pl,v 1.8 2001/03/04 09:16:29 nanbor Exp
+// Definition for Win32 Export directives.
+// This file is generated automatically by generate_export_file.pl
+// ------------------------------
+#ifndef TAO_RTEVENTLOG_SERV_EXPORT_H
+#define TAO_RTEVENTLOG_SERV_EXPORT_H
+
+#include "ace/config-all.h"
+
+#if defined (ACE_AS_STATIC_LIBS) && !defined (TAO_RTEVENTLOG_SERV_HAS_DLL)
+# define TAO_RTEVENTLOG_SERV_HAS_DLL 0
+#endif /* ACE_AS_STATIC_LIBS && TAO_RTEVENTLOG_SERV_HAS_DLL */
+
+#if !defined (TAO_RTEVENTLOG_SERV_HAS_DLL)
+# define TAO_RTEVENTLOG_SERV_HAS_DLL 1
+#endif /* ! TAO_RTEVENTLOG_SERV_HAS_DLL */
+
+#if defined (TAO_RTEVENTLOG_SERV_HAS_DLL) && (TAO_RTEVENTLOG_SERV_HAS_DLL == 1)
+# if defined (TAO_RTEVENTLOG_SERV_BUILD_DLL)
+# define TAO_RTEventLog_Serv_Export ACE_Proper_Export_Flag
+# define TAO_RTEVENTLOG_SERV_SINGLETON_DECLARATION(T) ACE_EXPORT_SINGLETON_DECLARATION (T)
+# define TAO_RTEVENTLOG_SERV_SINGLETON_DECLARE(SINGLETON_TYPE, CLASS, LOCK) ACE_EXPORT_SINGLETON_DECLARE(SINGLETON_TYPE, CLASS, LOCK)
+# else /* TAO_RTEVENTLOG_SERV_BUILD_DLL */
+# define TAO_RTEventLog_Serv_Export ACE_Proper_Import_Flag
+# define TAO_RTEVENTLOG_SERV_SINGLETON_DECLARATION(T) ACE_IMPORT_SINGLETON_DECLARATION (T)
+# define TAO_RTEVENTLOG_SERV_SINGLETON_DECLARE(SINGLETON_TYPE, CLASS, LOCK) ACE_IMPORT_SINGLETON_DECLARE(SINGLETON_TYPE, CLASS, LOCK)
+# endif /* TAO_RTEVENTLOG_SERV_BUILD_DLL */
+#else /* TAO_RTEVENTLOG_SERV_HAS_DLL == 1 */
+# define TAO_RTEventLog_Serv_Export
+# define TAO_RTEVENTLOG_SERV_SINGLETON_DECLARATION(T)
+# define TAO_RTEVENTLOG_SERV_SINGLETON_DECLARE(SINGLETON_TYPE, CLASS, LOCK)
+#endif /* TAO_RTEVENTLOG_SERV_HAS_DLL == 1 */
+
+#endif /* TAO_RTEVENTLOG_SERV_EXPORT_H */
+
+// End of auto generated file.
diff --git a/TAO/orbsvcs/orbsvcs/Log/rteventlog_skel_export.h b/TAO/orbsvcs/orbsvcs/Log/rteventlog_skel_export.h
new file mode 100644
index 00000000000..bd0276592f9
--- /dev/null
+++ b/TAO/orbsvcs/orbsvcs/Log/rteventlog_skel_export.h
@@ -0,0 +1,37 @@
+/* -*- C++ -*- $Id$ */
+// generate_export_file.pl,v 1.8 2001/03/04 09:16:29 nanbor Exp
+// Definition for Win32 Export directives.
+// This file is generated automatically by generate_export_file.pl
+// ------------------------------
+#ifndef TAO_RTEVENTLOG_SKEL_EXPORT_H
+#define TAO_RTEVENTLOG_SKEL_EXPORT_H
+
+#include "ace/config-all.h"
+
+#if defined (ACE_AS_STATIC_LIBS) && !defined (TAO_RTEVENTLOG_SKEL_HAS_DLL)
+# define TAO_RTEVENTLOG_SKEL_HAS_DLL 0
+#endif /* ACE_AS_STATIC_LIBS && TAO_RTEVENTLOG_SKEL_HAS_DLL */
+
+#if !defined (TAO_RTEVENTLOG_SKEL_HAS_DLL)
+# define TAO_RTEVENTLOG_SKEL_HAS_DLL 1
+#endif /* ! TAO_RTEVENTLOG_SKEL_HAS_DLL */
+
+#if defined (TAO_RTEVENTLOG_SKEL_HAS_DLL) && (TAO_RTEVENTLOG_SKEL_HAS_DLL == 1)
+# if defined (TAO_RTEVENTLOG_SKEL_BUILD_DLL)
+# define TAO_RTEventLog_Skel_Export ACE_Proper_Export_Flag
+# define TAO_RTEVENTLOG_SKEL_SINGLETON_DECLARATION(T) ACE_EXPORT_SINGLETON_DECLARATION (T)
+# define TAO_RTEVENTLOG_SKEL_SINGLETON_DECLARE(SINGLETON_TYPE, CLASS, LOCK) ACE_EXPORT_SINGLETON_DECLARE(SINGLETON_TYPE, CLASS, LOCK)
+# else /* TAO_RTEVENTLOG_SKEL_BUILD_DLL */
+# define TAO_RTEventLog_Skel_Export ACE_Proper_Import_Flag
+# define TAO_RTEVENTLOG_SKEL_SINGLETON_DECLARATION(T) ACE_IMPORT_SINGLETON_DECLARATION (T)
+# define TAO_RTEVENTLOG_SKEL_SINGLETON_DECLARE(SINGLETON_TYPE, CLASS, LOCK) ACE_IMPORT_SINGLETON_DECLARE(SINGLETON_TYPE, CLASS, LOCK)
+# endif /* TAO_RTEVENTLOG_SKEL_BUILD_DLL */
+#else /* TAO_RTEVENTLOG_SKEL_HAS_DLL == 1 */
+# define TAO_RTEventLog_Skel_Export
+# define TAO_RTEVENTLOG_SKEL_SINGLETON_DECLARATION(T)
+# define TAO_RTEVENTLOG_SKEL_SINGLETON_DECLARE(SINGLETON_TYPE, CLASS, LOCK)
+#endif /* TAO_RTEVENTLOG_SKEL_HAS_DLL == 1 */
+
+#endif /* TAO_RTEVENTLOG_SKEL_EXPORT_H */
+
+// End of auto generated file.
diff --git a/TAO/orbsvcs/orbsvcs/Makefile.am b/TAO/orbsvcs/orbsvcs/Makefile.am
new file mode 100644
index 00000000000..9ba84c529a9
--- /dev/null
+++ b/TAO/orbsvcs/orbsvcs/Makefile.am
@@ -0,0 +1,6166 @@
+## Process this file with automake to create Makefile.in
+##
+## $Id$
+##
+## This file was generated by MPC. Any changes made directly to
+## this file will be lost the next time it is generated.
+##
+## MPC Command:
+## ../bin/mwc.pl -type automake -noreldefs TAO.mwc
+
+includedir = @includedir@/orbsvcs
+pkgconfigdir = @libdir@/pkgconfig
+
+ACE_BUILDDIR = $(top_builddir)/..
+ACE_ROOT = $(top_srcdir)/..
+TAO_BUILDDIR = $(top_builddir)
+TAO_IDL = ACE_ROOT=$(ACE_ROOT) TAO_ROOT=$(TAO_ROOT) $(TAO_BUILDDIR)/TAO_IDL/tao_idl
+TAO_IDL_DEP = $(TAO_BUILDDIR)/TAO_IDL/tao_idl
+TAO_IDLFLAGS = -Ge 1 -Wb,pre_include=ace/pre.h -Wb,post_include=ace/post.h -I$(TAO_ROOT) -I$(srcdir) -g $(ACE_BUILDDIR)/apps/gperf/src/gperf
+TAO_ROOT = $(top_srcdir)
+
+
+## Makefile.CosNaming_IDL.am
+
+BUILT_SOURCES = \
+ CosNamingC.cpp \
+ CosNamingC.h \
+ CosNamingC.inl \
+ CosNamingS.cpp \
+ CosNamingS.h \
+ CosNamingS.inl \
+ CosNamingS_T.cpp \
+ CosNamingS_T.h \
+ CosNamingS_T.inl
+
+CLEANFILES = \
+ CosNaming-stamp \
+ CosNamingC.cpp \
+ CosNamingC.h \
+ CosNamingC.inl \
+ CosNamingS.cpp \
+ CosNamingS.h \
+ CosNamingS.inl \
+ CosNamingS_T.cpp \
+ CosNamingS_T.h \
+ CosNamingS_T.inl
+
+CosNamingC.cpp CosNamingC.h CosNamingC.inl CosNamingS.cpp CosNamingS.h CosNamingS.inl CosNamingS_T.cpp CosNamingS_T.h CosNamingS_T.inl: CosNaming-stamp
+
+CosNaming-stamp: $(srcdir)/CosNaming.idl $(TAO_IDL_DEP)
+ $(TAO_IDL) $(TAO_IDLFLAGS) -I$(TAO_ROOT)/orbsvcs -GT -Wb,versioning_begin=TAO_BEGIN_VERSIONED_NAMESPACE_DECL -Wb,versioning_end=TAO_END_VERSIONED_NAMESPACE_DECL -Wb,stub_export_macro=TAO_Naming_Export -Wb,stub_export_include=orbsvcs/Naming/naming_export.h -Wb,skel_export_macro=TAO_Naming_Skel_Export -Wb,skel_export_include=orbsvcs/Naming/naming_skel_export.h $(srcdir)/CosNaming.idl
+ @touch $@
+
+
+nobase_include_HEADERS = \
+ CosNaming.idl
+
+## Makefile.CosNaming.am
+
+lib_LTLIBRARIES = libTAO_CosNaming.la
+
+libTAO_CosNaming_la_CPPFLAGS = \
+ -I$(ACE_ROOT) \
+ -I$(ACE_BUILDDIR) \
+ -I$(TAO_ROOT) \
+ -I$(TAO_BUILDDIR) \
+ -I$(TAO_ROOT)/orbsvcs \
+ -I$(TAO_BUILDDIR)/orbsvcs \
+ -DTAO_NAMING_BUILD_DLL
+
+libTAO_CosNaming_la_SOURCES = \
+ CosNamingC.cpp \
+ Naming/Naming_Client.cpp
+
+libTAO_CosNaming_la_LDFLAGS = \
+ -version-number @TAO_MAJOR@:@TAO_MINOR@:@TAO_BETA@
+
+libTAO_CosNaming_la_LIBADD = \
+ $(TAO_BUILDDIR)/tao/libTAO_AnyTypeCode.la \
+ $(TAO_BUILDDIR)/tao/libTAO.la \
+ $(ACE_BUILDDIR)/ace/libACE.la
+
+nobase_include_HEADERS += \
+ CosNamingC.h \
+ CosNamingC.inl \
+ Naming/Naming_Client.h \
+ Naming/naming_export.h
+
+pkgconfig_DATA = \
+ TAO_CosNaming.pc
+
+CLEANFILES += \
+ TAO_CosNaming.pc
+
+TAO_CosNaming.pc: ${top_builddir}/config.status ${srcdir}/TAO_CosNaming.pc.in
+ ${top_builddir}/config.status --file $@:${srcdir}/TAO_CosNaming.pc.in
+
+EXTRA_DIST = \
+ CosNaming.rc \
+ TAO_CosNaming.pc.in
+
+
+## Makefile.CosProperty_IDL.am
+
+BUILT_SOURCES += \
+ CosPropertyC.cpp \
+ CosPropertyC.h \
+ CosPropertyC.inl \
+ CosPropertyS.cpp \
+ CosPropertyS.h \
+ CosPropertyS.inl \
+ CosPropertyS_T.cpp \
+ CosPropertyS_T.h \
+ CosPropertyS_T.inl
+
+CLEANFILES += \
+ CosProperty-stamp \
+ CosPropertyC.cpp \
+ CosPropertyC.h \
+ CosPropertyC.inl \
+ CosPropertyS.cpp \
+ CosPropertyS.h \
+ CosPropertyS.inl \
+ CosPropertyS_T.cpp \
+ CosPropertyS_T.h \
+ CosPropertyS_T.inl
+
+CosPropertyC.cpp CosPropertyC.h CosPropertyC.inl CosPropertyS.cpp CosPropertyS.h CosPropertyS.inl CosPropertyS_T.cpp CosPropertyS_T.h CosPropertyS_T.inl: CosProperty-stamp
+
+CosProperty-stamp: $(srcdir)/CosProperty.idl $(TAO_IDL_DEP)
+ $(TAO_IDL) $(TAO_IDLFLAGS) -I$(TAO_ROOT)/orbsvcs -GT -Wb,versioning_begin=TAO_BEGIN_VERSIONED_NAMESPACE_DECL -Wb,versioning_end=TAO_END_VERSIONED_NAMESPACE_DECL -Wb,stub_export_macro=TAO_Property_Export -Wb,stub_export_include=orbsvcs/Property/property_export.h -Wb,skel_export_macro=TAO_Property_Skel_Export -Wb,skel_export_include=orbsvcs/Property/property_skel_export.h $(srcdir)/CosProperty.idl
+ @touch $@
+
+BUILT_SOURCES += \
+ CosPropertyServiceC.cpp \
+ CosPropertyServiceC.h \
+ CosPropertyServiceC.inl \
+ CosPropertyServiceS.cpp \
+ CosPropertyServiceS.h \
+ CosPropertyServiceS.inl \
+ CosPropertyServiceS_T.cpp \
+ CosPropertyServiceS_T.h \
+ CosPropertyServiceS_T.inl
+
+CLEANFILES += \
+ CosPropertyService-stamp \
+ CosPropertyServiceC.cpp \
+ CosPropertyServiceC.h \
+ CosPropertyServiceC.inl \
+ CosPropertyServiceS.cpp \
+ CosPropertyServiceS.h \
+ CosPropertyServiceS.inl \
+ CosPropertyServiceS_T.cpp \
+ CosPropertyServiceS_T.h \
+ CosPropertyServiceS_T.inl
+
+CosPropertyServiceC.cpp CosPropertyServiceC.h CosPropertyServiceC.inl CosPropertyServiceS.cpp CosPropertyServiceS.h CosPropertyServiceS.inl CosPropertyServiceS_T.cpp CosPropertyServiceS_T.h CosPropertyServiceS_T.inl: CosPropertyService-stamp
+
+CosPropertyService-stamp: $(srcdir)/CosPropertyService.idl $(TAO_IDL_DEP)
+ $(TAO_IDL) $(TAO_IDLFLAGS) -I$(TAO_ROOT)/orbsvcs -GT -Wb,versioning_begin=TAO_BEGIN_VERSIONED_NAMESPACE_DECL -Wb,versioning_end=TAO_END_VERSIONED_NAMESPACE_DECL -Wb,stub_export_macro=TAO_Property_Export -Wb,stub_export_include=orbsvcs/Property/property_export.h -Wb,skel_export_macro=TAO_Property_Skel_Export -Wb,skel_export_include=orbsvcs/Property/property_skel_export.h $(srcdir)/CosPropertyService.idl
+ @touch $@
+
+
+nobase_include_HEADERS += \
+ CosProperty.idl \
+ CosPropertyService.idl
+
+## Makefile.CosProperty.am
+
+lib_LTLIBRARIES += libTAO_CosProperty.la
+
+libTAO_CosProperty_la_CPPFLAGS = \
+ -I$(ACE_ROOT) \
+ -I$(ACE_BUILDDIR) \
+ -I$(TAO_ROOT) \
+ -I$(TAO_BUILDDIR) \
+ -I$(TAO_ROOT)/orbsvcs \
+ -I$(TAO_BUILDDIR)/orbsvcs \
+ -DTAO_PROPERTY_BUILD_DLL
+
+libTAO_CosProperty_la_SOURCES = \
+ CosPropertyC.cpp \
+ CosPropertyServiceC.cpp
+
+libTAO_CosProperty_la_LDFLAGS = \
+ -version-number @TAO_MAJOR@:@TAO_MINOR@:@TAO_BETA@
+
+libTAO_CosProperty_la_LIBADD = \
+ $(TAO_BUILDDIR)/tao/libTAO_AnyTypeCode.la \
+ $(TAO_BUILDDIR)/tao/libTAO.la \
+ $(ACE_BUILDDIR)/ace/libACE.la
+
+nobase_include_HEADERS += \
+ CosPropertyC.h \
+ CosPropertyC.inl \
+ CosPropertyServiceC.h \
+ CosPropertyServiceC.inl \
+ Property/property_export.h
+
+pkgconfig_DATA += \
+ TAO_CosProperty.pc
+
+CLEANFILES += \
+ TAO_CosProperty.pc
+
+TAO_CosProperty.pc: ${top_builddir}/config.status ${srcdir}/TAO_CosProperty.pc.in
+ ${top_builddir}/config.status --file $@:${srcdir}/TAO_CosProperty.pc.in
+
+EXTRA_DIST += \
+ TAO_CosProperty.pc.in
+
+
+## Makefile.CosProperty_Skel.am
+
+lib_LTLIBRARIES += libTAO_CosProperty_Skel.la
+
+libTAO_CosProperty_Skel_la_CPPFLAGS = \
+ -I$(ACE_ROOT) \
+ -I$(ACE_BUILDDIR) \
+ -I$(TAO_ROOT) \
+ -I$(TAO_BUILDDIR) \
+ -I$(TAO_ROOT)/orbsvcs \
+ -I$(TAO_BUILDDIR)/orbsvcs \
+ -DTAO_PROPERTY_SKEL_BUILD_DLL
+
+libTAO_CosProperty_Skel_la_SOURCES = \
+ CosPropertyS.cpp \
+ CosPropertyServiceS.cpp
+
+libTAO_CosProperty_Skel_la_LDFLAGS = \
+ -version-number @TAO_MAJOR@:@TAO_MINOR@:@TAO_BETA@
+
+libTAO_CosProperty_Skel_la_LIBADD = \
+ $(TAO_BUILDDIR)/tao/libTAO_PortableServer.la \
+ libTAO_CosProperty.la \
+ $(TAO_BUILDDIR)/tao/libTAO_AnyTypeCode.la \
+ $(TAO_BUILDDIR)/tao/libTAO.la \
+ $(ACE_BUILDDIR)/ace/libACE.la
+
+nobase_include_HEADERS += \
+ CosPropertyS.h \
+ CosPropertyS.inl \
+ CosPropertyS_T.cpp \
+ CosPropertyS_T.h \
+ CosPropertyS_T.inl \
+ CosPropertyServiceS.h \
+ CosPropertyServiceS.inl \
+ CosPropertyServiceS_T.cpp \
+ CosPropertyServiceS_T.h \
+ CosPropertyServiceS_T.inl \
+ Property/property_skel_export.h
+
+pkgconfig_DATA += \
+ TAO_CosProperty_Skel.pc
+
+CLEANFILES += \
+ TAO_CosProperty_Skel.pc
+
+TAO_CosProperty_Skel.pc: ${top_builddir}/config.status ${srcdir}/TAO_CosProperty_Skel.pc.in
+ ${top_builddir}/config.status --file $@:${srcdir}/TAO_CosProperty_Skel.pc.in
+
+EXTRA_DIST += \
+ TAO_CosProperty_Skel.pc.in
+
+
+## Makefile.CosProperty_Serv.am
+
+lib_LTLIBRARIES += libTAO_CosProperty_Serv.la
+
+libTAO_CosProperty_Serv_la_CPPFLAGS = \
+ -I$(ACE_ROOT) \
+ -I$(ACE_BUILDDIR) \
+ -I$(TAO_ROOT) \
+ -I$(TAO_BUILDDIR) \
+ -I$(TAO_ROOT)/orbsvcs \
+ -I$(TAO_BUILDDIR)/orbsvcs \
+ -DTAO_PROPERTY_SERV_BUILD_DLL
+
+libTAO_CosProperty_Serv_la_SOURCES = \
+ Property/CosPropertyService_i.cpp
+
+libTAO_CosProperty_Serv_la_LDFLAGS = \
+ -version-number @TAO_MAJOR@:@TAO_MINOR@:@TAO_BETA@
+
+libTAO_CosProperty_Serv_la_LIBADD = \
+ libTAO_CosProperty_Skel.la \
+ $(TAO_BUILDDIR)/tao/libTAO_PortableServer.la \
+ libTAO_CosProperty.la \
+ $(TAO_BUILDDIR)/tao/libTAO_AnyTypeCode.la \
+ $(TAO_BUILDDIR)/tao/libTAO.la \
+ $(ACE_BUILDDIR)/ace/libACE.la
+
+nobase_include_HEADERS += \
+ Property/CosPropertyService_i.h \
+ Property/property_serv_export.h
+
+pkgconfig_DATA += \
+ TAO_CosProperty_Serv.pc
+
+CLEANFILES += \
+ TAO_CosProperty_Serv.pc
+
+TAO_CosProperty_Serv.pc: ${top_builddir}/config.status ${srcdir}/TAO_CosProperty_Serv.pc.in
+ ${top_builddir}/config.status --file $@:${srcdir}/TAO_CosProperty_Serv.pc.in
+
+EXTRA_DIST += \
+ TAO_CosProperty_Serv.pc.in
+
+
+## Makefile.AV.am
+
+if !BUILD_ACE_FOR_TAO
+
+BUILT_SOURCES += \
+ AVStreamsC.cpp \
+ AVStreamsC.h \
+ AVStreamsC.inl \
+ AVStreamsS.cpp \
+ AVStreamsS.h \
+ AVStreamsS.inl \
+ AVStreamsS_T.cpp \
+ AVStreamsS_T.inl
+
+CLEANFILES += \
+ AVStreams-stamp \
+ AVStreamsC.cpp \
+ AVStreamsC.h \
+ AVStreamsC.inl \
+ AVStreamsS.cpp \
+ AVStreamsS.h \
+ AVStreamsS.inl \
+ AVStreamsS_T.cpp \
+ AVStreamsS_T.inl
+
+AVStreamsC.cpp AVStreamsC.h AVStreamsC.inl AVStreamsS.cpp AVStreamsS.h AVStreamsS.inl AVStreamsS_T.cpp AVStreamsS_T.inl: AVStreams-stamp
+
+AVStreams-stamp: $(srcdir)/AVStreams.idl $(TAO_IDL_DEP)
+ $(TAO_IDL) $(TAO_IDLFLAGS) -I$(TAO_ROOT)/orbsvcs -GT -Wb,versioning_begin=TAO_BEGIN_VERSIONED_NAMESPACE_DECL -Wb,versioning_end=TAO_END_VERSIONED_NAMESPACE_DECL -Wb,export_macro=TAO_AV_Export -Wb,export_include=orbsvcs/AV/AV_export.h $(srcdir)/AVStreams.idl
+ @touch $@
+
+BUILT_SOURCES += \
+ Null_MediaCtrlC.cpp \
+ Null_MediaCtrlC.h \
+ Null_MediaCtrlC.inl \
+ Null_MediaCtrlS.cpp \
+ Null_MediaCtrlS.h \
+ Null_MediaCtrlS.inl \
+ Null_MediaCtrlS_T.cpp \
+ Null_MediaCtrlS_T.inl
+
+CLEANFILES += \
+ Null_MediaCtrl-stamp \
+ Null_MediaCtrlC.cpp \
+ Null_MediaCtrlC.h \
+ Null_MediaCtrlC.inl \
+ Null_MediaCtrlS.cpp \
+ Null_MediaCtrlS.h \
+ Null_MediaCtrlS.inl \
+ Null_MediaCtrlS_T.cpp \
+ Null_MediaCtrlS_T.inl
+
+Null_MediaCtrlC.cpp Null_MediaCtrlC.h Null_MediaCtrlC.inl Null_MediaCtrlS.cpp Null_MediaCtrlS.h Null_MediaCtrlS.inl Null_MediaCtrlS_T.cpp Null_MediaCtrlS_T.inl: Null_MediaCtrl-stamp
+
+Null_MediaCtrl-stamp: $(srcdir)/Null_MediaCtrl.idl $(TAO_IDL_DEP)
+ $(TAO_IDL) $(TAO_IDLFLAGS) -I$(TAO_ROOT)/orbsvcs -GT -Wb,versioning_begin=TAO_BEGIN_VERSIONED_NAMESPACE_DECL -Wb,versioning_end=TAO_END_VERSIONED_NAMESPACE_DECL -Wb,export_macro=TAO_AV_Export -Wb,export_include=orbsvcs/AV/AV_export.h $(srcdir)/Null_MediaCtrl.idl
+ @touch $@
+
+BUILT_SOURCES += \
+ sfpC.cpp \
+ sfpC.h \
+ sfpC.inl \
+ sfpS.cpp \
+ sfpS.h \
+ sfpS.inl \
+ sfpS_T.cpp \
+ sfpS_T.inl
+
+CLEANFILES += \
+ sfp-stamp \
+ sfpC.cpp \
+ sfpC.h \
+ sfpC.inl \
+ sfpS.cpp \
+ sfpS.h \
+ sfpS.inl \
+ sfpS_T.cpp \
+ sfpS_T.inl
+
+sfpC.cpp sfpC.h sfpC.inl sfpS.cpp sfpS.h sfpS.inl sfpS_T.cpp sfpS_T.inl: sfp-stamp
+
+sfp-stamp: $(srcdir)/sfp.idl $(TAO_IDL_DEP)
+ $(TAO_IDL) $(TAO_IDLFLAGS) -I$(TAO_ROOT)/orbsvcs -GT -Wb,versioning_begin=TAO_BEGIN_VERSIONED_NAMESPACE_DECL -Wb,versioning_end=TAO_END_VERSIONED_NAMESPACE_DECL -Wb,export_macro=TAO_AV_Export -Wb,export_include=orbsvcs/AV/AV_export.h $(srcdir)/sfp.idl
+ @touch $@
+
+lib_LTLIBRARIES += libTAO_AV.la
+
+libTAO_AV_la_CPPFLAGS = \
+ -I$(ACE_ROOT) \
+ -I$(ACE_BUILDDIR) \
+ -I$(TAO_ROOT) \
+ -I$(TAO_BUILDDIR) \
+ -I$(TAO_ROOT)/orbsvcs \
+ -I$(TAO_BUILDDIR)/orbsvcs \
+ -DTAO_AV_BUILD_DLL
+
+libTAO_AV_la_SOURCES = \
+ AV/AVStreams_i.cpp \
+ AV/AV_Core.cpp \
+ AV/Endpoint_Strategy.cpp \
+ AV/Fill_ACE_QoS.cpp \
+ AV/FlowSpec_Entry.cpp \
+ AV/MCast.cpp \
+ AV/Policy.cpp \
+ AV/Protocol_Factory.cpp \
+ AV/QoS_UDP.cpp \
+ AV/RTCP.cpp \
+ AV/RTCP_Channel.cpp \
+ AV/RTCP_Packet.cpp \
+ AV/RTP.cpp \
+ AV/SCTP_SEQ.cpp \
+ AV/TCP.cpp \
+ AV/Transport.cpp \
+ AV/UDP.cpp \
+ AV/default_resource.cpp \
+ AV/md5c.cpp \
+ AV/media_timer.cpp \
+ AV/sfp.cpp \
+ AVStreamsC.cpp \
+ AVStreamsS.cpp \
+ Null_MediaCtrlC.cpp \
+ Null_MediaCtrlS.cpp \
+ sfpC.cpp \
+ sfpS.cpp
+
+libTAO_AV_la_LDFLAGS = \
+ -version-number @TAO_MAJOR@:@TAO_MINOR@:@TAO_BETA@
+
+libTAO_AV_la_LIBADD = \
+ libTAO_CosNaming.la \
+ libTAO_CosProperty_Serv.la \
+ libTAO_CosProperty_Skel.la \
+ $(TAO_BUILDDIR)/tao/libTAO_PortableServer.la \
+ libTAO_CosProperty.la \
+ $(TAO_BUILDDIR)/tao/libTAO_AnyTypeCode.la \
+ $(TAO_BUILDDIR)/tao/libTAO.la \
+ $(ACE_BUILDDIR)/ace/libACE.la
+
+nobase_include_HEADERS += \
+ AV/AVStreams_i.h \
+ AV/AVStreams_i.i \
+ AV/AV_Core.h \
+ AV/AV_export.h \
+ AV/Endpoint_Strategy.h \
+ AV/Endpoint_Strategy_T.cpp \
+ AV/Endpoint_Strategy_T.h \
+ AV/Fill_ACE_QoS.h \
+ AV/FlowSpec_Entry.h \
+ AV/FlowSpec_Entry.i \
+ AV/Flows_T.cpp \
+ AV/Flows_T.h \
+ AV/MCast.h \
+ AV/MCast.i \
+ AV/Policy.h \
+ AV/Policy.i \
+ AV/Protocol_Factory.h \
+ AV/QoS_UDP.h \
+ AV/QoS_UDP.i \
+ AV/RTCP.h \
+ AV/RTCP_Channel.h \
+ AV/RTCP_Packet.h \
+ AV/RTP.h \
+ AV/Resource_Factory.h \
+ AV/SCTP_SEQ.h \
+ AV/TCP.h \
+ AV/Transport.h \
+ AV/Transport.i \
+ AV/UDP.h \
+ AV/UDP.i \
+ AV/default_resource.h \
+ AV/global.h \
+ AV/md5.h \
+ AV/media_timer.h \
+ AV/ntp-time.h \
+ AV/sfp.h \
+ AVStreams.idl \
+ AVStreamsC.h \
+ AVStreamsC.inl \
+ AVStreamsS.h \
+ AVStreamsS.inl \
+ AVStreamsS_T.cpp \
+ AVStreamsS_T.inl \
+ Null_MediaCtrl.idl \
+ Null_MediaCtrlC.h \
+ Null_MediaCtrlC.inl \
+ Null_MediaCtrlS.h \
+ Null_MediaCtrlS.inl \
+ Null_MediaCtrlS_T.cpp \
+ Null_MediaCtrlS_T.inl \
+ sfp.idl \
+ sfpC.h \
+ sfpC.inl \
+ sfpS.h \
+ sfpS.inl \
+ sfpS_T.cpp \
+ sfpS_T.inl
+
+endif !BUILD_ACE_FOR_TAO
+
+EXTRA_DIST += \
+ AV.rc
+
+
+## Makefile.CosConcurrency_IDL.am
+
+BUILT_SOURCES += \
+ CosConcurrencyControlC.cpp \
+ CosConcurrencyControlC.h \
+ CosConcurrencyControlC.inl \
+ CosConcurrencyControlS.cpp \
+ CosConcurrencyControlS.h \
+ CosConcurrencyControlS.inl \
+ CosConcurrencyControlS_T.cpp \
+ CosConcurrencyControlS_T.h \
+ CosConcurrencyControlS_T.inl
+
+CLEANFILES += \
+ CosConcurrencyControl-stamp \
+ CosConcurrencyControlC.cpp \
+ CosConcurrencyControlC.h \
+ CosConcurrencyControlC.inl \
+ CosConcurrencyControlS.cpp \
+ CosConcurrencyControlS.h \
+ CosConcurrencyControlS.inl \
+ CosConcurrencyControlS_T.cpp \
+ CosConcurrencyControlS_T.h \
+ CosConcurrencyControlS_T.inl
+
+CosConcurrencyControlC.cpp CosConcurrencyControlC.h CosConcurrencyControlC.inl CosConcurrencyControlS.cpp CosConcurrencyControlS.h CosConcurrencyControlS.inl CosConcurrencyControlS_T.cpp CosConcurrencyControlS_T.h CosConcurrencyControlS_T.inl: CosConcurrencyControl-stamp
+
+CosConcurrencyControl-stamp: $(srcdir)/CosConcurrencyControl.idl $(TAO_IDL_DEP)
+ $(TAO_IDL) $(TAO_IDLFLAGS) -I$(TAO_ROOT)/orbsvcs -GT -Wb,versioning_begin=TAO_BEGIN_VERSIONED_NAMESPACE_DECL -Wb,versioning_end=TAO_END_VERSIONED_NAMESPACE_DECL -Wb,stub_export_macro=TAO_Concurrency_Export -Wb,stub_export_include=orbsvcs/Concurrency/concurrency_export.h -Wb,skel_export_macro=TAO_Concurrency_Skel_Export -Wb,skel_export_include=orbsvcs/Concurrency/concurrency_skel_export.h $(srcdir)/CosConcurrencyControl.idl
+ @touch $@
+
+
+nobase_include_HEADERS += \
+ CosConcurrencyControl.idl
+
+## Makefile.CosConcurrency.am
+
+lib_LTLIBRARIES += libTAO_CosConcurrency.la
+
+libTAO_CosConcurrency_la_CPPFLAGS = \
+ -I$(ACE_ROOT) \
+ -I$(ACE_BUILDDIR) \
+ -I$(TAO_ROOT) \
+ -I$(TAO_BUILDDIR) \
+ -I$(TAO_ROOT)/orbsvcs \
+ -I$(TAO_BUILDDIR)/orbsvcs \
+ -DTAO_CONCURRENCY_BUILD_DLL
+
+libTAO_CosConcurrency_la_SOURCES = \
+ CosConcurrencyControlC.cpp
+
+libTAO_CosConcurrency_la_LDFLAGS = \
+ -version-number @TAO_MAJOR@:@TAO_MINOR@:@TAO_BETA@
+
+libTAO_CosConcurrency_la_LIBADD = \
+ $(TAO_BUILDDIR)/tao/libTAO_AnyTypeCode.la \
+ $(TAO_BUILDDIR)/tao/libTAO.la \
+ $(ACE_BUILDDIR)/ace/libACE.la
+
+nobase_include_HEADERS += \
+ Concurrency/concurrency_export.h \
+ CosConcurrencyControlC.h \
+ CosConcurrencyControlC.inl
+
+pkgconfig_DATA += \
+ TAO_CosConcurrency.pc
+
+CLEANFILES += \
+ TAO_CosConcurrency.pc
+
+TAO_CosConcurrency.pc: ${top_builddir}/config.status ${srcdir}/TAO_CosConcurrency.pc.in
+ ${top_builddir}/config.status --file $@:${srcdir}/TAO_CosConcurrency.pc.in
+
+EXTRA_DIST += \
+ TAO_CosConcurrency.pc.in
+
+
+## Makefile.CosConcurrency_Skel.am
+
+lib_LTLIBRARIES += libTAO_CosConcurrency_Skel.la
+
+libTAO_CosConcurrency_Skel_la_CPPFLAGS = \
+ -I$(ACE_ROOT) \
+ -I$(ACE_BUILDDIR) \
+ -I$(TAO_ROOT) \
+ -I$(TAO_BUILDDIR) \
+ -I$(TAO_ROOT)/orbsvcs \
+ -I$(TAO_BUILDDIR)/orbsvcs \
+ -DTAO_CONCURRENCY_SKEL_BUILD_DLL
+
+libTAO_CosConcurrency_Skel_la_SOURCES = \
+ CosConcurrencyControlS.cpp
+
+libTAO_CosConcurrency_Skel_la_LDFLAGS = \
+ -version-number @TAO_MAJOR@:@TAO_MINOR@:@TAO_BETA@
+
+libTAO_CosConcurrency_Skel_la_LIBADD = \
+ $(TAO_BUILDDIR)/tao/libTAO_PortableServer.la \
+ libTAO_CosConcurrency.la \
+ $(TAO_BUILDDIR)/tao/libTAO_AnyTypeCode.la \
+ $(TAO_BUILDDIR)/tao/libTAO.la \
+ $(ACE_BUILDDIR)/ace/libACE.la
+
+nobase_include_HEADERS += \
+ Concurrency/concurrency_skel_export.h \
+ CosConcurrencyControlS.h \
+ CosConcurrencyControlS.inl
+
+pkgconfig_DATA += \
+ TAO_CosConcurrency_Skel.pc
+
+CLEANFILES += \
+ TAO_CosConcurrency_Skel.pc
+
+TAO_CosConcurrency_Skel.pc: ${top_builddir}/config.status ${srcdir}/TAO_CosConcurrency_Skel.pc.in
+ ${top_builddir}/config.status --file $@:${srcdir}/TAO_CosConcurrency_Skel.pc.in
+
+EXTRA_DIST += \
+ TAO_CosConcurrency_Skel.pc.in
+
+
+## Makefile.CosConcurrency_Serv.am
+
+lib_LTLIBRARIES += libTAO_CosConcurrency_Serv.la
+
+libTAO_CosConcurrency_Serv_la_CPPFLAGS = \
+ -I$(ACE_ROOT) \
+ -I$(ACE_BUILDDIR) \
+ -I$(TAO_ROOT) \
+ -I$(TAO_BUILDDIR) \
+ -I$(TAO_ROOT)/orbsvcs \
+ -I$(TAO_BUILDDIR)/orbsvcs \
+ -DTAO_CONCURRENCY_SERV_BUILD_DLL
+
+libTAO_CosConcurrency_Serv_la_SOURCES = \
+ Concurrency/CC_Lock.cpp \
+ Concurrency/CC_LockSet.cpp \
+ Concurrency/CC_LockSetFactory.cpp \
+ Concurrency/Concurrency_Loader.cpp \
+ Concurrency/Concurrency_Utils.cpp
+
+libTAO_CosConcurrency_Serv_la_LDFLAGS = \
+ -version-number @TAO_MAJOR@:@TAO_MINOR@:@TAO_BETA@
+
+libTAO_CosConcurrency_Serv_la_LIBADD = \
+ libTAO_CosConcurrency_Skel.la \
+ $(TAO_BUILDDIR)/tao/libTAO_PortableServer.la \
+ libTAO_CosConcurrency.la \
+ $(TAO_BUILDDIR)/tao/libTAO_AnyTypeCode.la \
+ $(TAO_BUILDDIR)/tao/libTAO.la \
+ $(ACE_BUILDDIR)/ace/libACE.la
+
+nobase_include_HEADERS += \
+ Concurrency/CC_Lock.h \
+ Concurrency/CC_LockSet.h \
+ Concurrency/CC_LockSetFactory.h \
+ Concurrency/Concurrency_Loader.h \
+ Concurrency/Concurrency_Utils.h \
+ Concurrency/concurrency_serv_export.h
+
+pkgconfig_DATA += \
+ TAO_CosConcurrency_Serv.pc
+
+CLEANFILES += \
+ TAO_CosConcurrency_Serv.pc
+
+TAO_CosConcurrency_Serv.pc: ${top_builddir}/config.status ${srcdir}/TAO_CosConcurrency_Serv.pc.in
+ ${top_builddir}/config.status --file $@:${srcdir}/TAO_CosConcurrency_Serv.pc.in
+
+EXTRA_DIST += \
+ TAO_CosConcurrency_Serv.pc.in
+
+
+## Makefile.CosEvent_IDL.am
+
+if !BUILD_MINIMUM_CORBA
+
+BUILT_SOURCES += \
+ CosTypedEventCommC.cpp \
+ CosTypedEventCommC.h \
+ CosTypedEventCommC.inl \
+ CosTypedEventCommS.cpp \
+ CosTypedEventCommS.h \
+ CosTypedEventCommS.inl \
+ CosTypedEventCommS_T.cpp \
+ CosTypedEventCommS_T.h \
+ CosTypedEventCommS_T.inl
+
+CLEANFILES += \
+ CosTypedEventComm-stamp \
+ CosTypedEventCommC.cpp \
+ CosTypedEventCommC.h \
+ CosTypedEventCommC.inl \
+ CosTypedEventCommS.cpp \
+ CosTypedEventCommS.h \
+ CosTypedEventCommS.inl \
+ CosTypedEventCommS_T.cpp \
+ CosTypedEventCommS_T.h \
+ CosTypedEventCommS_T.inl
+
+CosTypedEventCommC.cpp CosTypedEventCommC.h CosTypedEventCommC.inl CosTypedEventCommS.cpp CosTypedEventCommS.h CosTypedEventCommS.inl CosTypedEventCommS_T.cpp CosTypedEventCommS_T.h CosTypedEventCommS_T.inl: CosTypedEventComm-stamp
+
+CosTypedEventComm-stamp: $(srcdir)/CosTypedEventComm.idl $(TAO_IDL_DEP)
+ $(TAO_IDL) $(TAO_IDLFLAGS) -I$(TAO_ROOT)/orbsvcs -GT -Wb,stub_export_macro=TAO_Event_Export -Wb,stub_export_include=orbsvcs/CosEvent/event_export.h -Wb,skel_export_macro=TAO_Event_Skel_Export -Wb,skel_export_include=orbsvcs/CosEvent/event_skel_export.h $(srcdir)/CosTypedEventComm.idl
+ @touch $@
+
+BUILT_SOURCES += \
+ CosTypedEventChannelAdminC.cpp \
+ CosTypedEventChannelAdminC.h \
+ CosTypedEventChannelAdminC.inl \
+ CosTypedEventChannelAdminS.cpp \
+ CosTypedEventChannelAdminS.h \
+ CosTypedEventChannelAdminS.inl \
+ CosTypedEventChannelAdminS_T.cpp \
+ CosTypedEventChannelAdminS_T.h \
+ CosTypedEventChannelAdminS_T.inl
+
+CLEANFILES += \
+ CosTypedEventChannelAdmin-stamp \
+ CosTypedEventChannelAdminC.cpp \
+ CosTypedEventChannelAdminC.h \
+ CosTypedEventChannelAdminC.inl \
+ CosTypedEventChannelAdminS.cpp \
+ CosTypedEventChannelAdminS.h \
+ CosTypedEventChannelAdminS.inl \
+ CosTypedEventChannelAdminS_T.cpp \
+ CosTypedEventChannelAdminS_T.h \
+ CosTypedEventChannelAdminS_T.inl
+
+CosTypedEventChannelAdminC.cpp CosTypedEventChannelAdminC.h CosTypedEventChannelAdminC.inl CosTypedEventChannelAdminS.cpp CosTypedEventChannelAdminS.h CosTypedEventChannelAdminS.inl CosTypedEventChannelAdminS_T.cpp CosTypedEventChannelAdminS_T.h CosTypedEventChannelAdminS_T.inl: CosTypedEventChannelAdmin-stamp
+
+CosTypedEventChannelAdmin-stamp: $(srcdir)/CosTypedEventChannelAdmin.idl $(TAO_IDL_DEP)
+ $(TAO_IDL) $(TAO_IDLFLAGS) -I$(TAO_ROOT)/orbsvcs -GT -Wb,stub_export_macro=TAO_Event_Export -Wb,stub_export_include=orbsvcs/CosEvent/event_export.h -Wb,skel_export_macro=TAO_Event_Skel_Export -Wb,skel_export_include=orbsvcs/CosEvent/event_skel_export.h $(srcdir)/CosTypedEventChannelAdmin.idl
+ @touch $@
+
+BUILT_SOURCES += \
+ CosEventCommC.cpp \
+ CosEventCommC.h \
+ CosEventCommC.inl \
+ CosEventCommS.cpp \
+ CosEventCommS.h \
+ CosEventCommS.inl \
+ CosEventCommS_T.cpp \
+ CosEventCommS_T.h \
+ CosEventCommS_T.inl
+
+CLEANFILES += \
+ CosEventComm-stamp \
+ CosEventCommC.cpp \
+ CosEventCommC.h \
+ CosEventCommC.inl \
+ CosEventCommS.cpp \
+ CosEventCommS.h \
+ CosEventCommS.inl \
+ CosEventCommS_T.cpp \
+ CosEventCommS_T.h \
+ CosEventCommS_T.inl
+
+CosEventCommC.cpp CosEventCommC.h CosEventCommC.inl CosEventCommS.cpp CosEventCommS.h CosEventCommS.inl CosEventCommS_T.cpp CosEventCommS_T.h CosEventCommS_T.inl: CosEventComm-stamp
+
+CosEventComm-stamp: $(srcdir)/CosEventComm.idl $(TAO_IDL_DEP)
+ $(TAO_IDL) $(TAO_IDLFLAGS) -I$(TAO_ROOT)/orbsvcs -GT -Wb,versioning_begin=TAO_BEGIN_VERSIONED_NAMESPACE_DECL -Wb,versioning_end=TAO_END_VERSIONED_NAMESPACE_DECL -Wb,stub_export_macro=TAO_Event_Export -Wb,stub_export_include=orbsvcs/CosEvent/event_export.h -Wb,skel_export_macro=TAO_Event_Skel_Export -Wb,skel_export_include=orbsvcs/CosEvent/event_skel_export.h $(srcdir)/CosEventComm.idl
+ @touch $@
+
+BUILT_SOURCES += \
+ CosEventChannelAdminC.cpp \
+ CosEventChannelAdminC.h \
+ CosEventChannelAdminC.inl \
+ CosEventChannelAdminS.cpp \
+ CosEventChannelAdminS.h \
+ CosEventChannelAdminS.inl \
+ CosEventChannelAdminS_T.cpp \
+ CosEventChannelAdminS_T.h \
+ CosEventChannelAdminS_T.inl
+
+CLEANFILES += \
+ CosEventChannelAdmin-stamp \
+ CosEventChannelAdminC.cpp \
+ CosEventChannelAdminC.h \
+ CosEventChannelAdminC.inl \
+ CosEventChannelAdminS.cpp \
+ CosEventChannelAdminS.h \
+ CosEventChannelAdminS.inl \
+ CosEventChannelAdminS_T.cpp \
+ CosEventChannelAdminS_T.h \
+ CosEventChannelAdminS_T.inl
+
+CosEventChannelAdminC.cpp CosEventChannelAdminC.h CosEventChannelAdminC.inl CosEventChannelAdminS.cpp CosEventChannelAdminS.h CosEventChannelAdminS.inl CosEventChannelAdminS_T.cpp CosEventChannelAdminS_T.h CosEventChannelAdminS_T.inl: CosEventChannelAdmin-stamp
+
+CosEventChannelAdmin-stamp: $(srcdir)/CosEventChannelAdmin.idl $(TAO_IDL_DEP)
+ $(TAO_IDL) $(TAO_IDLFLAGS) -I$(TAO_ROOT)/orbsvcs -GT -Wb,versioning_begin=TAO_BEGIN_VERSIONED_NAMESPACE_DECL -Wb,versioning_end=TAO_END_VERSIONED_NAMESPACE_DECL -Wb,stub_export_macro=TAO_Event_Export -Wb,stub_export_include=orbsvcs/CosEvent/event_export.h -Wb,skel_export_macro=TAO_Event_Skel_Export -Wb,skel_export_include=orbsvcs/CosEvent/event_skel_export.h $(srcdir)/CosEventChannelAdmin.idl
+ @touch $@
+
+
+nobase_include_HEADERS += \
+ CosEventChannelAdmin.idl \
+ CosEventComm.idl \
+ CosTypedEventChannelAdmin.idl \
+ CosTypedEventComm.idl
+
+endif !BUILD_MINIMUM_CORBA
+
+## Makefile.CosEvent.am
+
+if !BUILD_MINIMUM_CORBA
+
+lib_LTLIBRARIES += libTAO_CosEvent.la
+
+libTAO_CosEvent_la_CPPFLAGS = \
+ -I$(ACE_ROOT) \
+ -I$(ACE_BUILDDIR) \
+ -I$(TAO_ROOT) \
+ -I$(TAO_BUILDDIR) \
+ -I$(TAO_ROOT)/orbsvcs \
+ -I$(TAO_BUILDDIR)/orbsvcs \
+ -DTAO_HAS_TYPED_EVENT_CHANNEL \
+ -DTAO_EVENT_BUILD_DLL
+
+libTAO_CosEvent_la_SOURCES = \
+ CosEventChannelAdminC.cpp \
+ CosEventCommC.cpp \
+ CosTypedEventChannelAdminC.cpp \
+ CosTypedEventCommC.cpp
+
+libTAO_CosEvent_la_LDFLAGS = \
+ -version-number @TAO_MAJOR@:@TAO_MINOR@:@TAO_BETA@
+
+libTAO_CosEvent_la_LIBADD = \
+ $(TAO_BUILDDIR)/tao/libTAO_AnyTypeCode.la \
+ $(TAO_BUILDDIR)/tao/libTAO.la \
+ $(ACE_BUILDDIR)/ace/libACE.la
+
+nobase_include_HEADERS += \
+ CosEvent/event_export.h \
+ CosEventChannelAdminC.h \
+ CosEventChannelAdminC.inl \
+ CosEventCommC.h \
+ CosEventCommC.inl \
+ CosTypedEventChannelAdminC.h \
+ CosTypedEventChannelAdminC.inl \
+ CosTypedEventCommC.h \
+ CosTypedEventCommC.inl
+
+pkgconfig_DATA += \
+ TAO_CosEvent.pc
+
+CLEANFILES += \
+ TAO_CosEvent.pc
+
+TAO_CosEvent.pc: ${top_builddir}/config.status ${srcdir}/TAO_CosEvent.pc.in
+ ${top_builddir}/config.status --file $@:${srcdir}/TAO_CosEvent.pc.in
+
+endif !BUILD_MINIMUM_CORBA
+
+EXTRA_DIST += \
+ CosEvent.rc \
+ TAO_CosEvent.pc.in
+
+
+## Makefile.Svc_Utils.am
+
+BUILT_SOURCES += \
+ TimeBaseC.cpp \
+ TimeBaseC.h \
+ TimeBaseC.inl \
+ TimeBaseS.cpp \
+ TimeBaseS.h \
+ TimeBaseS.inl \
+ TimeBaseS_T.cpp \
+ TimeBaseS_T.inl
+
+CLEANFILES += \
+ TimeBase-stamp \
+ TimeBaseC.cpp \
+ TimeBaseC.h \
+ TimeBaseC.inl \
+ TimeBaseS.cpp \
+ TimeBaseS.h \
+ TimeBaseS.inl \
+ TimeBaseS_T.cpp \
+ TimeBaseS_T.inl
+
+TimeBaseC.cpp TimeBaseC.h TimeBaseC.inl TimeBaseS.cpp TimeBaseS.h TimeBaseS.inl TimeBaseS_T.cpp TimeBaseS_T.inl: TimeBase-stamp
+
+TimeBase-stamp: $(srcdir)/TimeBase.idl $(TAO_IDL_DEP)
+ $(TAO_IDL) $(TAO_IDLFLAGS) -I$(TAO_ROOT)/orbsvcs -GT -Wb,versioning_begin=TAO_BEGIN_VERSIONED_NAMESPACE_DECL -Wb,versioning_end=TAO_END_VERSIONED_NAMESPACE_DECL -Wb,export_macro=TAO_Svc_Utils_Export -Wb,export_include=orbsvcs/svc_utils_export.h $(srcdir)/TimeBase.idl
+ @touch $@
+
+BUILT_SOURCES += \
+ RtecBaseC.cpp \
+ RtecBaseC.h \
+ RtecBaseC.inl \
+ RtecBaseS.cpp \
+ RtecBaseS.h \
+ RtecBaseS.inl \
+ RtecBaseS_T.cpp \
+ RtecBaseS_T.inl
+
+CLEANFILES += \
+ RtecBase-stamp \
+ RtecBaseC.cpp \
+ RtecBaseC.h \
+ RtecBaseC.inl \
+ RtecBaseS.cpp \
+ RtecBaseS.h \
+ RtecBaseS.inl \
+ RtecBaseS_T.cpp \
+ RtecBaseS_T.inl
+
+RtecBaseC.cpp RtecBaseC.h RtecBaseC.inl RtecBaseS.cpp RtecBaseS.h RtecBaseS.inl RtecBaseS_T.cpp RtecBaseS_T.inl: RtecBase-stamp
+
+RtecBase-stamp: $(srcdir)/RtecBase.idl $(TAO_IDL_DEP)
+ $(TAO_IDL) $(TAO_IDLFLAGS) -I$(TAO_ROOT)/orbsvcs -GT -Wb,versioning_begin=TAO_BEGIN_VERSIONED_NAMESPACE_DECL -Wb,versioning_end=TAO_END_VERSIONED_NAMESPACE_DECL -Wb,export_macro=TAO_Svc_Utils_Export -Wb,export_include=orbsvcs/svc_utils_export.h $(srcdir)/RtecBase.idl
+ @touch $@
+
+lib_LTLIBRARIES += libTAO_Svc_Utils.la
+
+libTAO_Svc_Utils_la_CPPFLAGS = \
+ -I$(ACE_ROOT) \
+ -I$(ACE_BUILDDIR) \
+ -I$(TAO_ROOT) \
+ -I$(TAO_BUILDDIR) \
+ -I$(TAO_ROOT)/orbsvcs \
+ -I$(TAO_BUILDDIR)/orbsvcs \
+ -DTAO_SVC_UTILS_BUILD_DLL
+
+libTAO_Svc_Utils_la_SOURCES = \
+ IOR_Multicast.cpp \
+ RtecBaseC.cpp \
+ RtecBaseS.cpp \
+ Shutdown_Utilities.cpp \
+ TimeBaseC.cpp \
+ TimeBaseS.cpp \
+ Time_Utilities.cpp
+
+libTAO_Svc_Utils_la_LDFLAGS = \
+ -version-number @TAO_MAJOR@:@TAO_MINOR@:@TAO_BETA@
+
+libTAO_Svc_Utils_la_LIBADD = \
+ $(TAO_BUILDDIR)/tao/libTAO_PortableServer.la \
+ $(TAO_BUILDDIR)/tao/libTAO_AnyTypeCode.la \
+ $(TAO_BUILDDIR)/tao/libTAO.la \
+ $(ACE_BUILDDIR)/ace/libACE.la
+
+nobase_include_HEADERS += \
+ IOR_Multicast.h \
+ RtecBase.idl \
+ RtecBaseC.h \
+ RtecBaseC.inl \
+ RtecBaseS.h \
+ RtecBaseS.inl \
+ RtecBaseS_T.cpp \
+ RtecBaseS_T.inl \
+ Shutdown_Utilities.h \
+ TimeBase.idl \
+ TimeBaseC.h \
+ TimeBaseC.inl \
+ TimeBaseS.h \
+ TimeBaseS.inl \
+ TimeBaseS_T.cpp \
+ TimeBaseS_T.inl \
+ Time_Utilities.h \
+ Time_Utilities.i \
+ svc_utils_export.h
+
+pkgconfig_DATA += \
+ TAO_Svc_Utils.pc
+
+CLEANFILES += \
+ TAO_Svc_Utils.pc
+
+TAO_Svc_Utils.pc: ${top_builddir}/config.status ${srcdir}/TAO_Svc_Utils.pc.in
+ ${top_builddir}/config.status --file $@:${srcdir}/TAO_Svc_Utils.pc.in
+
+EXTRA_DIST += \
+ Svc_Utils.rc \
+ TAO_Svc_Utils.pc.in
+
+
+## Makefile.CosEvent_Skel.am
+
+if !BUILD_MINIMUM_CORBA
+
+lib_LTLIBRARIES += libTAO_CosEvent_Skel.la
+
+libTAO_CosEvent_Skel_la_CPPFLAGS = \
+ -I$(ACE_ROOT) \
+ -I$(ACE_BUILDDIR) \
+ -I$(TAO_ROOT) \
+ -I$(TAO_BUILDDIR) \
+ -I$(TAO_ROOT)/orbsvcs \
+ -I$(TAO_BUILDDIR)/orbsvcs \
+ -DTAO_HAS_TYPED_EVENT_CHANNEL \
+ -DTAO_EVENT_SKEL_BUILD_DLL
+
+libTAO_CosEvent_Skel_la_SOURCES = \
+ CosEventChannelAdminS.cpp \
+ CosEventCommS.cpp \
+ CosTypedEventChannelAdminS.cpp \
+ CosTypedEventCommS.cpp
+
+libTAO_CosEvent_Skel_la_LDFLAGS = \
+ -version-number @TAO_MAJOR@:@TAO_MINOR@:@TAO_BETA@
+
+libTAO_CosEvent_Skel_la_LIBADD = \
+ $(TAO_BUILDDIR)/tao/libTAO_PortableServer.la \
+ libTAO_CosEvent.la \
+ $(TAO_BUILDDIR)/tao/libTAO_AnyTypeCode.la \
+ $(TAO_BUILDDIR)/tao/libTAO.la \
+ $(ACE_BUILDDIR)/ace/libACE.la
+
+nobase_include_HEADERS += \
+ CosEvent/event_skel_export.h \
+ CosEventChannelAdminS.h \
+ CosEventChannelAdminS.inl \
+ CosEventChannelAdminS_T.cpp \
+ CosEventChannelAdminS_T.h \
+ CosEventChannelAdminS_T.inl \
+ CosEventCommS.h \
+ CosEventCommS.inl \
+ CosEventCommS_T.cpp \
+ CosEventCommS_T.h \
+ CosEventCommS_T.inl \
+ CosTypedEventChannelAdminS.h \
+ CosTypedEventChannelAdminS.inl \
+ CosTypedEventChannelAdminS_T.cpp \
+ CosTypedEventChannelAdminS_T.h \
+ CosTypedEventChannelAdminS_T.inl \
+ CosTypedEventCommS.h \
+ CosTypedEventCommS.inl \
+ CosTypedEventCommS_T.cpp \
+ CosTypedEventCommS_T.h \
+ CosTypedEventCommS_T.inl
+
+pkgconfig_DATA += \
+ TAO_CosEvent_Skel.pc
+
+CLEANFILES += \
+ TAO_CosEvent_Skel.pc
+
+TAO_CosEvent_Skel.pc: ${top_builddir}/config.status ${srcdir}/TAO_CosEvent_Skel.pc.in
+ ${top_builddir}/config.status --file $@:${srcdir}/TAO_CosEvent_Skel.pc.in
+
+endif !BUILD_MINIMUM_CORBA
+
+EXTRA_DIST += \
+ CosEvent_Skel.rc \
+ TAO_CosEvent_Skel.pc.in
+
+
+## Makefile.CosEvent_Serv.am
+
+if BUILD_CORBA_MESSAGING
+if !BUILD_MINIMUM_CORBA
+
+lib_LTLIBRARIES += libTAO_CosEvent_Serv.la
+
+libTAO_CosEvent_Serv_la_CPPFLAGS = \
+ -I$(ACE_ROOT) \
+ -I$(ACE_BUILDDIR) \
+ -I$(TAO_ROOT) \
+ -I$(TAO_BUILDDIR) \
+ -I$(TAO_ROOT)/orbsvcs \
+ -I$(TAO_BUILDDIR)/orbsvcs \
+ -DTAO_HAS_TYPED_EVENT_CHANNEL \
+ -DTAO_EVENT_SERV_BUILD_DLL
+
+libTAO_CosEvent_Serv_la_SOURCES = \
+ CosEvent/CEC_ConsumerAdmin.cpp \
+ CosEvent/CEC_ConsumerControl.cpp \
+ CosEvent/CEC_Default_Factory.cpp \
+ CosEvent/CEC_Dispatching.cpp \
+ CosEvent/CEC_Dispatching_Task.cpp \
+ CosEvent/CEC_DynamicImplementation.cpp \
+ CosEvent/CEC_EventChannel.cpp \
+ CosEvent/CEC_Event_Loader.cpp \
+ CosEvent/CEC_Factory.cpp \
+ CosEvent/CEC_MT_Dispatching.cpp \
+ CosEvent/CEC_ProxyPullConsumer.cpp \
+ CosEvent/CEC_ProxyPullSupplier.cpp \
+ CosEvent/CEC_ProxyPushConsumer.cpp \
+ CosEvent/CEC_ProxyPushSupplier.cpp \
+ CosEvent/CEC_Pulling_Strategy.cpp \
+ CosEvent/CEC_Reactive_ConsumerControl.cpp \
+ CosEvent/CEC_Reactive_Pulling_Strategy.cpp \
+ CosEvent/CEC_Reactive_SupplierControl.cpp \
+ CosEvent/CEC_SupplierAdmin.cpp \
+ CosEvent/CEC_SupplierControl.cpp \
+ CosEvent/CEC_TypedConsumerAdmin.cpp \
+ CosEvent/CEC_TypedEvent.cpp \
+ CosEvent/CEC_TypedEventChannel.cpp \
+ CosEvent/CEC_TypedProxyPushConsumer.cpp \
+ CosEvent/CEC_TypedSupplierAdmin.cpp
+
+libTAO_CosEvent_Serv_la_LDFLAGS = \
+ -version-number @TAO_MAJOR@:@TAO_MINOR@:@TAO_BETA@
+
+libTAO_CosEvent_Serv_la_LIBADD = \
+ libTAO_Svc_Utils.la \
+ libTAO_CosNaming.la \
+ $(TAO_BUILDDIR)/tao/libTAO_IFR_Client.la \
+ $(TAO_BUILDDIR)/tao/libTAO_DynamicInterface.la \
+ $(TAO_BUILDDIR)/tao/libTAO_Messaging.la \
+ $(TAO_BUILDDIR)/tao/libTAO_PI.la \
+ $(TAO_BUILDDIR)/tao/libTAO_CodecFactory.la \
+ $(TAO_BUILDDIR)/tao/libTAO_Valuetype.la \
+ libTAO_CosEvent_Skel.la \
+ $(TAO_BUILDDIR)/tao/libTAO_PortableServer.la \
+ libTAO_CosEvent.la \
+ $(TAO_BUILDDIR)/tao/libTAO_AnyTypeCode.la \
+ $(TAO_BUILDDIR)/tao/libTAO.la \
+ $(ACE_BUILDDIR)/ace/libACE.la
+
+nobase_include_HEADERS += \
+ CosEvent/CEC_ConsumerAdmin.h \
+ CosEvent/CEC_ConsumerAdmin.i \
+ CosEvent/CEC_ConsumerControl.h \
+ CosEvent/CEC_Default_Factory.h \
+ CosEvent/CEC_Default_Factory.i \
+ CosEvent/CEC_Defaults.h \
+ CosEvent/CEC_Dispatching.h \
+ CosEvent/CEC_Dispatching_Task.h \
+ CosEvent/CEC_Dispatching_Task.i \
+ CosEvent/CEC_DynamicImplementation.h \
+ CosEvent/CEC_DynamicImplementation.i \
+ CosEvent/CEC_EventChannel.h \
+ CosEvent/CEC_EventChannel.i \
+ CosEvent/CEC_Event_Loader.h \
+ CosEvent/CEC_Factory.h \
+ CosEvent/CEC_MT_Dispatching.h \
+ CosEvent/CEC_ProxyPullConsumer.h \
+ CosEvent/CEC_ProxyPullConsumer.i \
+ CosEvent/CEC_ProxyPullSupplier.h \
+ CosEvent/CEC_ProxyPullSupplier.i \
+ CosEvent/CEC_ProxyPushConsumer.h \
+ CosEvent/CEC_ProxyPushConsumer.i \
+ CosEvent/CEC_ProxyPushSupplier.h \
+ CosEvent/CEC_ProxyPushSupplier.i \
+ CosEvent/CEC_Pulling_Strategy.h \
+ CosEvent/CEC_Reactive_ConsumerControl.h \
+ CosEvent/CEC_Reactive_ConsumerControl.i \
+ CosEvent/CEC_Reactive_Pulling_Strategy.h \
+ CosEvent/CEC_Reactive_Pulling_Strategy.i \
+ CosEvent/CEC_Reactive_SupplierControl.h \
+ CosEvent/CEC_Reactive_SupplierControl.i \
+ CosEvent/CEC_SupplierAdmin.h \
+ CosEvent/CEC_SupplierAdmin.i \
+ CosEvent/CEC_SupplierControl.h \
+ CosEvent/CEC_TypedConsumerAdmin.h \
+ CosEvent/CEC_TypedConsumerAdmin.i \
+ CosEvent/CEC_TypedEvent.h \
+ CosEvent/CEC_TypedEvent.i \
+ CosEvent/CEC_TypedEventChannel.h \
+ CosEvent/CEC_TypedEventChannel.i \
+ CosEvent/CEC_TypedProxyPushConsumer.h \
+ CosEvent/CEC_TypedProxyPushConsumer.i \
+ CosEvent/CEC_TypedSupplierAdmin.h \
+ CosEvent/CEC_TypedSupplierAdmin.i \
+ CosEvent/event_serv_export.h
+
+pkgconfig_DATA += \
+ TAO_CosEvent_Serv.pc
+
+CLEANFILES += \
+ TAO_CosEvent_Serv.pc
+
+TAO_CosEvent_Serv.pc: ${top_builddir}/config.status ${srcdir}/TAO_CosEvent_Serv.pc.in
+ ${top_builddir}/config.status --file $@:${srcdir}/TAO_CosEvent_Serv.pc.in
+
+endif !BUILD_MINIMUM_CORBA
+endif BUILD_CORBA_MESSAGING
+
+EXTRA_DIST += \
+ CosEvent_Serv.rc \
+ TAO_CosEvent_Serv.pc.in
+
+
+## Makefile.CosLifeCycle.am
+
+BUILT_SOURCES += \
+ CosLifeCycleC.cpp \
+ CosLifeCycleC.h \
+ CosLifeCycleC.inl \
+ CosLifeCycleS.cpp \
+ CosLifeCycleS.h \
+ CosLifeCycleS.inl \
+ CosLifeCycleS_T.cpp \
+ CosLifeCycleS_T.h \
+ CosLifeCycleS_T.inl
+
+CLEANFILES += \
+ CosLifeCycle-stamp \
+ CosLifeCycleC.cpp \
+ CosLifeCycleC.h \
+ CosLifeCycleC.inl \
+ CosLifeCycleS.cpp \
+ CosLifeCycleS.h \
+ CosLifeCycleS.inl \
+ CosLifeCycleS_T.cpp \
+ CosLifeCycleS_T.h \
+ CosLifeCycleS_T.inl
+
+CosLifeCycleC.cpp CosLifeCycleC.h CosLifeCycleC.inl CosLifeCycleS.cpp CosLifeCycleS.h CosLifeCycleS.inl CosLifeCycleS_T.cpp CosLifeCycleS_T.h CosLifeCycleS_T.inl: CosLifeCycle-stamp
+
+CosLifeCycle-stamp: $(srcdir)/CosLifeCycle.idl $(TAO_IDL_DEP)
+ $(TAO_IDL) $(TAO_IDLFLAGS) -I$(TAO_ROOT)/orbsvcs -GT -Wb,versioning_begin=TAO_BEGIN_VERSIONED_NAMESPACE_DECL -Wb,versioning_end=TAO_END_VERSIONED_NAMESPACE_DECL -Wb,export_macro=TAO_LifeCycle_Export -Wb,export_include=orbsvcs/LifeCycle/lifecycle_export.h $(srcdir)/CosLifeCycle.idl
+ @touch $@
+
+BUILT_SOURCES += \
+ LifeCycleServiceC.cpp \
+ LifeCycleServiceC.h \
+ LifeCycleServiceC.inl \
+ LifeCycleServiceS.cpp \
+ LifeCycleServiceS.h \
+ LifeCycleServiceS.inl \
+ LifeCycleServiceS_T.cpp \
+ LifeCycleServiceS_T.h \
+ LifeCycleServiceS_T.inl
+
+CLEANFILES += \
+ LifeCycleService-stamp \
+ LifeCycleServiceC.cpp \
+ LifeCycleServiceC.h \
+ LifeCycleServiceC.inl \
+ LifeCycleServiceS.cpp \
+ LifeCycleServiceS.h \
+ LifeCycleServiceS.inl \
+ LifeCycleServiceS_T.cpp \
+ LifeCycleServiceS_T.h \
+ LifeCycleServiceS_T.inl
+
+LifeCycleServiceC.cpp LifeCycleServiceC.h LifeCycleServiceC.inl LifeCycleServiceS.cpp LifeCycleServiceS.h LifeCycleServiceS.inl LifeCycleServiceS_T.cpp LifeCycleServiceS_T.h LifeCycleServiceS_T.inl: LifeCycleService-stamp
+
+LifeCycleService-stamp: $(srcdir)/LifeCycleService.idl $(TAO_IDL_DEP)
+ $(TAO_IDL) $(TAO_IDLFLAGS) -I$(TAO_ROOT)/orbsvcs -GT -Wb,versioning_begin=TAO_BEGIN_VERSIONED_NAMESPACE_DECL -Wb,versioning_end=TAO_END_VERSIONED_NAMESPACE_DECL -Wb,export_macro=TAO_LifeCycle_Export -Wb,export_include=orbsvcs/LifeCycle/lifecycle_export.h $(srcdir)/LifeCycleService.idl
+ @touch $@
+
+lib_LTLIBRARIES += libTAO_CosLifeCycle.la
+
+libTAO_CosLifeCycle_la_CPPFLAGS = \
+ -I$(ACE_ROOT) \
+ -I$(ACE_BUILDDIR) \
+ -I$(TAO_ROOT) \
+ -I$(TAO_BUILDDIR) \
+ -I$(TAO_ROOT)/orbsvcs \
+ -I$(TAO_BUILDDIR)/orbsvcs \
+ -DTAO_LIFECYCLE_BUILD_DLL
+
+libTAO_CosLifeCycle_la_SOURCES = \
+ CosLifeCycleC.cpp \
+ CosLifeCycleS.cpp \
+ LifeCycleServiceC.cpp \
+ LifeCycleServiceS.cpp
+
+libTAO_CosLifeCycle_la_LDFLAGS = \
+ -version-number @TAO_MAJOR@:@TAO_MINOR@:@TAO_BETA@
+
+libTAO_CosLifeCycle_la_LIBADD = \
+ $(TAO_BUILDDIR)/tao/libTAO_PortableServer.la \
+ libTAO_CosNaming.la \
+ $(TAO_BUILDDIR)/tao/libTAO_AnyTypeCode.la \
+ $(TAO_BUILDDIR)/tao/libTAO.la \
+ $(ACE_BUILDDIR)/ace/libACE.la
+
+nobase_include_HEADERS += \
+ CosLifeCycle.idl \
+ CosLifeCycleC.h \
+ CosLifeCycleC.inl \
+ CosLifeCycleS.h \
+ CosLifeCycleS.inl \
+ CosLifeCycleS_T.cpp \
+ CosLifeCycleS_T.h \
+ CosLifeCycleS_T.inl \
+ LifeCycleService.idl \
+ LifeCycleServiceC.h \
+ LifeCycleServiceC.inl \
+ LifeCycleServiceS.h \
+ LifeCycleServiceS.inl \
+ LifeCycleServiceS_T.cpp \
+ LifeCycleServiceS_T.h \
+ LifeCycleServiceS_T.inl
+
+pkgconfig_DATA += \
+ TAO_CosLifeCycle.pc
+
+CLEANFILES += \
+ TAO_CosLifeCycle.pc
+
+TAO_CosLifeCycle.pc: ${top_builddir}/config.status ${srcdir}/TAO_CosLifeCycle.pc.in
+ ${top_builddir}/config.status --file $@:${srcdir}/TAO_CosLifeCycle.pc.in
+
+EXTRA_DIST += \
+ CosLifeCycle.rc \
+ TAO_CosLifeCycle.pc.in
+
+
+## Makefile.PortableGroup.am
+
+if BUILD_CORBA_MESSAGING
+if !BUILD_MINIMUM_CORBA
+
+BUILT_SOURCES += \
+ miopC.cpp \
+ miopC.h \
+ miopC.inl \
+ miopS.cpp \
+ miopS.h \
+ miopS.inl \
+ miopS_T.cpp \
+ miopS_T.inl
+
+CLEANFILES += \
+ miop-stamp \
+ miopC.cpp \
+ miopC.h \
+ miopC.inl \
+ miopS.cpp \
+ miopS.h \
+ miopS.inl \
+ miopS_T.cpp \
+ miopS_T.inl
+
+miopC.cpp miopC.h miopC.inl miopS.cpp miopS.h miopS.inl miopS_T.cpp miopS_T.inl: miop-stamp
+
+miop-stamp: $(srcdir)/miop.idl $(TAO_IDL_DEP)
+ $(TAO_IDL) $(TAO_IDLFLAGS) -I$(TAO_ROOT)/orbsvcs -GT -Wb,versioning_begin=TAO_BEGIN_VERSIONED_NAMESPACE_DECL -Wb,versioning_end=TAO_END_VERSIONED_NAMESPACE_DECL -Wb,export_macro=TAO_PortableGroup_Export -Wb,export_include=orbsvcs/PortableGroup/portablegroup_export.h $(srcdir)/miop.idl
+ @touch $@
+
+BUILT_SOURCES += \
+ PortableGroup_Simple_DSC.cpp \
+ PortableGroup_Simple_DSC.h \
+ PortableGroup_Simple_DSC.inl \
+ PortableGroup_Simple_DSS.inl \
+ PortableGroup_Simple_DSS_T.inl
+
+CLEANFILES += \
+ PortableGroup_Simple_DS-stamp \
+ PortableGroup_Simple_DSC.cpp \
+ PortableGroup_Simple_DSC.h \
+ PortableGroup_Simple_DSC.inl \
+ PortableGroup_Simple_DSS.inl \
+ PortableGroup_Simple_DSS_T.inl
+
+PortableGroup_Simple_DSC.cpp PortableGroup_Simple_DSC.h PortableGroup_Simple_DSC.inl PortableGroup_Simple_DSS.inl PortableGroup_Simple_DSS_T.inl: PortableGroup_Simple_DS-stamp
+
+PortableGroup_Simple_DS-stamp: $(srcdir)/PortableGroup_Simple_DS.idl $(TAO_IDL_DEP)
+ $(TAO_IDL) $(TAO_IDLFLAGS) -I$(TAO_ROOT)/orbsvcs -GT -Wb,versioning_begin=TAO_BEGIN_VERSIONED_NAMESPACE_DECL -Wb,versioning_end=TAO_END_VERSIONED_NAMESPACE_DECL -Wb,export_macro=TAO_PortableGroup_Export -Wb,export_include=orbsvcs/PortableGroup/portablegroup_export.h $(srcdir)/PortableGroup_Simple_DS.idl
+ @touch $@
+
+BUILT_SOURCES += \
+ PortableGroupC.cpp \
+ PortableGroupC.h \
+ PortableGroupC.inl \
+ PortableGroupS.cpp \
+ PortableGroupS.h \
+ PortableGroupS.inl \
+ PortableGroupS_T.cpp \
+ PortableGroupS_T.inl
+
+CLEANFILES += \
+ PortableGroup-stamp \
+ PortableGroupC.cpp \
+ PortableGroupC.h \
+ PortableGroupC.inl \
+ PortableGroupS.cpp \
+ PortableGroupS.h \
+ PortableGroupS.inl \
+ PortableGroupS_T.cpp \
+ PortableGroupS_T.inl
+
+PortableGroupC.cpp PortableGroupC.h PortableGroupC.inl PortableGroupS.cpp PortableGroupS.h PortableGroupS.inl PortableGroupS_T.cpp PortableGroupS_T.inl: PortableGroup-stamp
+
+PortableGroup-stamp: $(srcdir)/PortableGroup.idl $(TAO_IDL_DEP)
+ $(TAO_IDL) $(TAO_IDLFLAGS) -I$(TAO_ROOT)/orbsvcs -GT -Wb,versioning_begin=TAO_BEGIN_VERSIONED_NAMESPACE_DECL -Wb,versioning_end=TAO_END_VERSIONED_NAMESPACE_DECL -Wb,export_macro=TAO_PortableGroup_Export -Wb,export_include=orbsvcs/PortableGroup/portablegroup_export.h -GC $(srcdir)/PortableGroup.idl
+ @touch $@
+
+lib_LTLIBRARIES += libTAO_PortableGroup.la
+
+libTAO_PortableGroup_la_CPPFLAGS = \
+ -I$(ACE_ROOT) \
+ -I$(ACE_BUILDDIR) \
+ -I$(TAO_ROOT) \
+ -I$(TAO_BUILDDIR) \
+ -I$(TAO_ROOT)/orbsvcs \
+ -I$(TAO_BUILDDIR)/orbsvcs \
+ -DTAO_PORTABLEGROUP_BUILD_DLL
+
+libTAO_PortableGroup_la_SOURCES = \
+ PortableGroup/GOA.cpp \
+ PortableGroup/MIOP.cpp \
+ PortableGroup/PG_Default_Property_Validator.cpp \
+ PortableGroup/PG_FactoryRegistry.cpp \
+ PortableGroup/PG_GenericFactory.cpp \
+ PortableGroup/PG_Group_Factory.cpp \
+ PortableGroup/PG_Group_Guard.cpp \
+ PortableGroup/PG_Location_Equal_To.cpp \
+ PortableGroup/PG_Location_Hash.cpp \
+ PortableGroup/PG_MemberInfo.cpp \
+ PortableGroup/PG_Null_Property_Validator.cpp \
+ PortableGroup/PG_ObjectGroupManager.cpp \
+ PortableGroup/PG_Object_Adapter_Factory.cpp \
+ PortableGroup/PG_Object_Group.cpp \
+ PortableGroup/PG_Object_Group_Manipulator.cpp \
+ PortableGroup/PG_Operators.cpp \
+ PortableGroup/PG_Properties_Encoder.cpp \
+ PortableGroup/PG_Properties_Support.cpp \
+ PortableGroup/PG_PropertyManager.cpp \
+ PortableGroup/PG_Property_Set.cpp \
+ PortableGroup/PG_Property_Utils.cpp \
+ PortableGroup/PG_Servant_Dispatcher.cpp \
+ PortableGroup/PG_Utils.cpp \
+ PortableGroup/PortableGroup_Acceptor_Registry.cpp \
+ PortableGroup/PortableGroup_Loader.cpp \
+ PortableGroup/PortableGroup_ORBInitializer.cpp \
+ PortableGroup/PortableGroup_Request_Dispatcher.cpp \
+ PortableGroup/Portable_Group_Map.cpp \
+ PortableGroup/UIPMC_Acceptor.cpp \
+ PortableGroup/UIPMC_Connection_Handler.cpp \
+ PortableGroup/UIPMC_Connector.cpp \
+ PortableGroup/UIPMC_Endpoint.cpp \
+ PortableGroup/UIPMC_Factory.cpp \
+ PortableGroup/UIPMC_Message_Block_Data_Iterator.cpp \
+ PortableGroup/UIPMC_Profile.cpp \
+ PortableGroup/UIPMC_Transport.cpp \
+ PortableGroup/UIPMC_Wait_Never.cpp \
+ PortableGroupC.cpp \
+ PortableGroupS.cpp \
+ PortableGroup_Simple_DSC.cpp \
+ miopC.cpp \
+ miopS.cpp
+
+libTAO_PortableGroup_la_LDFLAGS = \
+ -version-number @TAO_MAJOR@:@TAO_MINOR@:@TAO_BETA@
+
+libTAO_PortableGroup_la_LIBADD = \
+ $(TAO_BUILDDIR)/tao/libTAO_Messaging.la \
+ $(TAO_BUILDDIR)/tao/libTAO_PI.la \
+ $(TAO_BUILDDIR)/tao/libTAO_CodecFactory.la \
+ $(TAO_BUILDDIR)/tao/libTAO_PortableServer.la \
+ $(TAO_BUILDDIR)/tao/libTAO_Valuetype.la \
+ $(TAO_BUILDDIR)/tao/libTAO_IORManip.la \
+ libTAO_CosNaming.la \
+ $(TAO_BUILDDIR)/tao/libTAO_AnyTypeCode.la \
+ $(TAO_BUILDDIR)/tao/libTAO.la \
+ $(ACE_BUILDDIR)/ace/libACE.la
+
+nobase_include_HEADERS += \
+ PortableGroup.idl \
+ PortableGroup/GOA.h \
+ PortableGroup/MIOP.h \
+ PortableGroup/PG_Default_Property_Validator.h \
+ PortableGroup/PG_FactoryRegistry.h \
+ PortableGroup/PG_GenericFactory.h \
+ PortableGroup/PG_Group_Factory.h \
+ PortableGroup/PG_Group_Guard.h \
+ PortableGroup/PG_Location_Equal_To.h \
+ PortableGroup/PG_Location_Equal_To.inl \
+ PortableGroup/PG_Location_Hash.h \
+ PortableGroup/PG_Location_Hash.inl \
+ PortableGroup/PG_MemberInfo.h \
+ PortableGroup/PG_Null_Property_Validator.h \
+ PortableGroup/PG_ObjectGroupManager.h \
+ PortableGroup/PG_Object_Adapter_Factory.h \
+ PortableGroup/PG_Object_Group.h \
+ PortableGroup/PG_Object_Group_Manipulator.h \
+ PortableGroup/PG_Operators.h \
+ PortableGroup/PG_Properties_Encoder.h \
+ PortableGroup/PG_Properties_Encoder.inl \
+ PortableGroup/PG_Properties_Support.h \
+ PortableGroup/PG_PropertyManager.h \
+ PortableGroup/PG_Property_Set.h \
+ PortableGroup/PG_Property_Utils.h \
+ PortableGroup/PG_Servant_Dispatcher.h \
+ PortableGroup/PG_Utils.h \
+ PortableGroup/PortableGroup_Acceptor_Registry.h \
+ PortableGroup/PortableGroup_Loader.h \
+ PortableGroup/PortableGroup_ORBInitializer.h \
+ PortableGroup/PortableGroup_Request_Dispatcher.h \
+ PortableGroup/Portable_Group_Map.h \
+ PortableGroup/UIPMC_Acceptor.h \
+ PortableGroup/UIPMC_Acceptor.i \
+ PortableGroup/UIPMC_Connection_Handler.h \
+ PortableGroup/UIPMC_Connector.h \
+ PortableGroup/UIPMC_Endpoint.h \
+ PortableGroup/UIPMC_Endpoint.i \
+ PortableGroup/UIPMC_Factory.h \
+ PortableGroup/UIPMC_Message_Block_Data_Iterator.h \
+ PortableGroup/UIPMC_Profile.h \
+ PortableGroup/UIPMC_Transport.h \
+ PortableGroup/UIPMC_Wait_Never.h \
+ PortableGroup/portablegroup_export.h \
+ PortableGroupC.h \
+ PortableGroupC.inl \
+ PortableGroupS.h \
+ PortableGroupS.inl \
+ PortableGroupS_T.cpp \
+ PortableGroupS_T.inl \
+ PortableGroup_Simple_DS.idl \
+ PortableGroup_Simple_DSC.h \
+ PortableGroup_Simple_DSC.inl \
+ PortableGroup_Simple_DSS.inl \
+ PortableGroup_Simple_DSS_T.inl \
+ miop.idl \
+ miopC.h \
+ miopC.inl \
+ miopS.h \
+ miopS.inl \
+ miopS_T.cpp \
+ miopS_T.inl
+
+pkgconfig_DATA += \
+ TAO_PortableGroup.pc
+
+CLEANFILES += \
+ TAO_PortableGroup.pc
+
+TAO_PortableGroup.pc: ${top_builddir}/config.status ${srcdir}/TAO_PortableGroup.pc.in
+ ${top_builddir}/config.status --file $@:${srcdir}/TAO_PortableGroup.pc.in
+
+endif !BUILD_MINIMUM_CORBA
+endif BUILD_CORBA_MESSAGING
+
+EXTRA_DIST += \
+ PortableGroup.rc \
+ TAO_PortableGroup.pc.in
+
+
+## Makefile.CosLoadBalancing.am
+
+if BUILD_AMI
+if BUILD_CORBA_MESSAGING
+if !BUILD_MINIMUM_CORBA
+
+BUILT_SOURCES += \
+ CosLoadBalancingC.cpp \
+ CosLoadBalancingC.h \
+ CosLoadBalancingC.inl \
+ CosLoadBalancingS.cpp \
+ CosLoadBalancingS.h \
+ CosLoadBalancingS.inl \
+ CosLoadBalancingS_T.cpp \
+ CosLoadBalancingS_T.h \
+ CosLoadBalancingS_T.inl
+
+CLEANFILES += \
+ CosLoadBalancing-stamp \
+ CosLoadBalancingC.cpp \
+ CosLoadBalancingC.h \
+ CosLoadBalancingC.inl \
+ CosLoadBalancingS.cpp \
+ CosLoadBalancingS.h \
+ CosLoadBalancingS.inl \
+ CosLoadBalancingS_T.cpp \
+ CosLoadBalancingS_T.h \
+ CosLoadBalancingS_T.inl
+
+CosLoadBalancingC.cpp CosLoadBalancingC.h CosLoadBalancingC.inl CosLoadBalancingS.cpp CosLoadBalancingS.h CosLoadBalancingS.inl CosLoadBalancingS_T.cpp CosLoadBalancingS_T.h CosLoadBalancingS_T.inl: CosLoadBalancing-stamp
+
+CosLoadBalancing-stamp: $(srcdir)/CosLoadBalancing.idl $(TAO_IDL_DEP)
+ $(TAO_IDL) $(TAO_IDLFLAGS) -I$(TAO_ROOT)/orbsvcs -GT -GC -Wb,versioning_begin=TAO_BEGIN_VERSIONED_NAMESPACE_DECL -Wb,versioning_end=TAO_END_VERSIONED_NAMESPACE_DECL -Wb,export_macro=TAO_LoadBalancing_Export -Wb,export_include=orbsvcs/LoadBalancing/LoadBalancing_export.h $(srcdir)/CosLoadBalancing.idl
+ @touch $@
+
+BUILT_SOURCES += \
+ LB_ORTC.cpp \
+ LB_ORTC.h \
+ LB_ORTC.inl \
+ LB_ORTS.h \
+ LB_ORTS.inl \
+ LB_ORTS_T.h \
+ LB_ORTS_T.inl
+
+CLEANFILES += \
+ LB_ORT-stamp \
+ LB_ORTC.cpp \
+ LB_ORTC.h \
+ LB_ORTC.inl \
+ LB_ORTS.h \
+ LB_ORTS.inl \
+ LB_ORTS_T.h \
+ LB_ORTS_T.inl
+
+LB_ORTC.cpp LB_ORTC.h LB_ORTC.inl LB_ORTS.h LB_ORTS.inl LB_ORTS_T.h LB_ORTS_T.inl: LB_ORT-stamp
+
+LB_ORT-stamp: $(srcdir)/LB_ORT.idl $(TAO_IDL_DEP)
+ $(TAO_IDL) $(TAO_IDLFLAGS) -I$(TAO_ROOT)/orbsvcs -GT -GC -Wb,versioning_begin=TAO_BEGIN_VERSIONED_NAMESPACE_DECL -Wb,versioning_end=TAO_END_VERSIONED_NAMESPACE_DECL -Wb,export_macro=TAO_LoadBalancing_Export -Wb,export_include=orbsvcs/LoadBalancing/LoadBalancing_export.h $(srcdir)/LB_ORT.idl
+ @touch $@
+
+lib_LTLIBRARIES += libTAO_CosLoadBalancing.la
+
+libTAO_CosLoadBalancing_la_CPPFLAGS = \
+ -I$(ACE_ROOT) \
+ -I$(ACE_BUILDDIR) \
+ -I$(TAO_ROOT) \
+ -I$(TAO_BUILDDIR) \
+ -I$(TAO_ROOT)/orbsvcs \
+ -I$(TAO_BUILDDIR)/orbsvcs \
+ -DTAO_LOADBALANCING_BUILD_DLL
+
+libTAO_CosLoadBalancing_la_SOURCES = \
+ CosLoadBalancingC.cpp \
+ CosLoadBalancingS.cpp \
+ LB_ORTC.cpp \
+ LoadBalancing/LB_CPU_Load_Average_Monitor.cpp \
+ LoadBalancing/LB_CPU_Utilization_Monitor.cpp \
+ LoadBalancing/LB_ClientComponent.cpp \
+ LoadBalancing/LB_ClientORBInitializer.cpp \
+ LoadBalancing/LB_ClientRequestInterceptor.cpp \
+ LoadBalancing/LB_Component.cpp \
+ LoadBalancing/LB_IORInterceptor.cpp \
+ LoadBalancing/LB_LeastLoaded.cpp \
+ LoadBalancing/LB_LoadAlert.cpp \
+ LoadBalancing/LB_LoadAlertInfo.cpp \
+ LoadBalancing/LB_LoadAlert_Handler.cpp \
+ LoadBalancing/LB_LoadAverage.cpp \
+ LoadBalancing/LB_LoadManager.cpp \
+ LoadBalancing/LB_LoadMinimum.cpp \
+ LoadBalancing/LB_MemberLocator.cpp \
+ LoadBalancing/LB_ORBInitializer.cpp \
+ LoadBalancing/LB_ObjectReferenceFactory.cpp \
+ LoadBalancing/LB_Pull_Handler.cpp \
+ LoadBalancing/LB_Random.cpp \
+ LoadBalancing/LB_RoundRobin.cpp \
+ LoadBalancing/LB_ServerRequestInterceptor.cpp
+
+libTAO_CosLoadBalancing_la_LDFLAGS = \
+ -version-number @TAO_MAJOR@:@TAO_MINOR@:@TAO_BETA@
+
+libTAO_CosLoadBalancing_la_LIBADD = \
+ $(TAO_BUILDDIR)/tao/libTAO_IORInterceptor.la \
+ $(TAO_BUILDDIR)/tao/libTAO_ObjRefTemplate.la \
+ $(TAO_BUILDDIR)/tao/libTAO_PI_Server.la \
+ libTAO_PortableGroup.la \
+ $(TAO_BUILDDIR)/tao/libTAO_Messaging.la \
+ $(TAO_BUILDDIR)/tao/libTAO_PI.la \
+ $(TAO_BUILDDIR)/tao/libTAO_CodecFactory.la \
+ $(TAO_BUILDDIR)/tao/libTAO_PortableServer.la \
+ $(TAO_BUILDDIR)/tao/libTAO_Valuetype.la \
+ $(TAO_BUILDDIR)/tao/libTAO_IORManip.la \
+ libTAO_CosNaming.la \
+ $(TAO_BUILDDIR)/tao/libTAO_AnyTypeCode.la \
+ $(TAO_BUILDDIR)/tao/libTAO.la \
+ $(ACE_BUILDDIR)/ace/libACE.la
+
+nobase_include_HEADERS += \
+ CosLoadBalancing.idl \
+ CosLoadBalancingC.h \
+ CosLoadBalancingC.inl \
+ CosLoadBalancingS.h \
+ CosLoadBalancingS.inl \
+ CosLoadBalancingS_T.cpp \
+ CosLoadBalancingS_T.h \
+ CosLoadBalancingS_T.inl \
+ LB_ORT.idl \
+ LB_ORTC.h \
+ LB_ORTC.inl \
+ LB_ORTS.h \
+ LB_ORTS.inl \
+ LB_ORTS_T.h \
+ LB_ORTS_T.inl \
+ LoadBalancing/LB_CPU_Load_Average_Monitor.h \
+ LoadBalancing/LB_CPU_Utilization_Monitor.h \
+ LoadBalancing/LB_ClientComponent.h \
+ LoadBalancing/LB_ClientORBInitializer.h \
+ LoadBalancing/LB_ClientRequestInterceptor.h \
+ LoadBalancing/LB_Component.h \
+ LoadBalancing/LB_IORInterceptor.h \
+ LoadBalancing/LB_LeastLoaded.h \
+ LoadBalancing/LB_LeastLoaded.inl \
+ LoadBalancing/LB_LoadAlert.h \
+ LoadBalancing/LB_LoadAlert.inl \
+ LoadBalancing/LB_LoadAlertInfo.h \
+ LoadBalancing/LB_LoadAlert_Handler.h \
+ LoadBalancing/LB_LoadAverage.h \
+ LoadBalancing/LB_LoadAverage.inl \
+ LoadBalancing/LB_LoadManager.h \
+ LoadBalancing/LB_LoadMinimum.h \
+ LoadBalancing/LB_LoadMinimum.inl \
+ LoadBalancing/LB_MemberLocator.h \
+ LoadBalancing/LB_ORBInitializer.h \
+ LoadBalancing/LB_ObjectReferenceFactory.h \
+ LoadBalancing/LB_Pull_Handler.h \
+ LoadBalancing/LB_Random.h \
+ LoadBalancing/LB_RoundRobin.h \
+ LoadBalancing/LB_ServerRequestInterceptor.h
+
+pkgconfig_DATA += \
+ TAO_CosLoadBalancing.pc
+
+CLEANFILES += \
+ TAO_CosLoadBalancing.pc
+
+TAO_CosLoadBalancing.pc: ${top_builddir}/config.status ${srcdir}/TAO_CosLoadBalancing.pc.in
+ ${top_builddir}/config.status --file $@:${srcdir}/TAO_CosLoadBalancing.pc.in
+
+endif !BUILD_MINIMUM_CORBA
+endif BUILD_CORBA_MESSAGING
+endif BUILD_AMI
+
+EXTRA_DIST += \
+ CosLoadBalancing.rc \
+ TAO_CosLoadBalancing.pc.in
+
+
+## Makefile.CosNaming_Skel.am
+
+lib_LTLIBRARIES += libTAO_CosNaming_Skel.la
+
+libTAO_CosNaming_Skel_la_CPPFLAGS = \
+ -I$(ACE_ROOT) \
+ -I$(ACE_BUILDDIR) \
+ -I$(TAO_ROOT) \
+ -I$(TAO_BUILDDIR) \
+ -I$(TAO_ROOT)/orbsvcs \
+ -I$(TAO_BUILDDIR)/orbsvcs \
+ -DTAO_NAMING_SKEL_BUILD_DLL
+
+libTAO_CosNaming_Skel_la_SOURCES = \
+ CosNamingS.cpp
+
+libTAO_CosNaming_Skel_la_LDFLAGS = \
+ -version-number @TAO_MAJOR@:@TAO_MINOR@:@TAO_BETA@
+
+libTAO_CosNaming_Skel_la_LIBADD = \
+ $(TAO_BUILDDIR)/tao/libTAO_PortableServer.la \
+ libTAO_CosNaming.la \
+ $(TAO_BUILDDIR)/tao/libTAO_AnyTypeCode.la \
+ $(TAO_BUILDDIR)/tao/libTAO.la \
+ $(ACE_BUILDDIR)/ace/libACE.la
+
+nobase_include_HEADERS += \
+ CosNamingS.h \
+ CosNamingS.inl \
+ CosNamingS_T.cpp \
+ CosNamingS_T.h \
+ CosNamingS_T.inl \
+ Naming/naming_skel_export.h
+
+pkgconfig_DATA += \
+ TAO_CosNaming_Skel.pc
+
+CLEANFILES += \
+ TAO_CosNaming_Skel.pc
+
+TAO_CosNaming_Skel.pc: ${top_builddir}/config.status ${srcdir}/TAO_CosNaming_Skel.pc.in
+ ${top_builddir}/config.status --file $@:${srcdir}/TAO_CosNaming_Skel.pc.in
+
+EXTRA_DIST += \
+ CosNaming_Skel.rc \
+ TAO_CosNaming_Skel.pc.in
+
+
+## Makefile.CosNaming_Serv.am
+
+if !BUILD_ACE_FOR_TAO
+
+lib_LTLIBRARIES += libTAO_CosNaming_Serv.la
+
+libTAO_CosNaming_Serv_la_CPPFLAGS = \
+ -I$(ACE_ROOT) \
+ -I$(ACE_BUILDDIR) \
+ -I$(TAO_ROOT) \
+ -I$(TAO_BUILDDIR) \
+ -I$(TAO_ROOT)/orbsvcs \
+ -I$(TAO_BUILDDIR)/orbsvcs \
+ -DTAO_NAMING_SERV_BUILD_DLL
+
+libTAO_CosNaming_Serv_la_SOURCES = \
+ Naming/Entries.cpp \
+ Naming/Flat_File_Persistence.cpp \
+ Naming/Hash_Naming_Context.cpp \
+ Naming/Naming_Context_Interface.cpp \
+ Naming/Naming_Loader.cpp \
+ Naming/Naming_Server.cpp \
+ Naming/Persistent_Context_Index.cpp \
+ Naming/Persistent_Entries.cpp \
+ Naming/Persistent_Naming_Context.cpp \
+ Naming/Storable.cpp \
+ Naming/Storable_Naming_Context.cpp \
+ Naming/Storable_Naming_Context_Activator.cpp \
+ Naming/Transient_Naming_Context.cpp
+
+libTAO_CosNaming_Serv_la_LDFLAGS = \
+ -version-number @TAO_MAJOR@:@TAO_MINOR@:@TAO_BETA@
+
+libTAO_CosNaming_Serv_la_LIBADD = \
+ $(TAO_BUILDDIR)/tao/libTAO_IORTable.la \
+ libTAO_Svc_Utils.la \
+ $(TAO_BUILDDIR)/tao/libTAO_Messaging.la \
+ $(TAO_BUILDDIR)/tao/libTAO_PI.la \
+ $(TAO_BUILDDIR)/tao/libTAO_CodecFactory.la \
+ $(TAO_BUILDDIR)/tao/libTAO_Valuetype.la \
+ libTAO_CosNaming_Skel.la \
+ $(TAO_BUILDDIR)/tao/libTAO_PortableServer.la \
+ libTAO_CosNaming.la \
+ $(TAO_BUILDDIR)/tao/libTAO_AnyTypeCode.la \
+ $(TAO_BUILDDIR)/tao/libTAO.la \
+ $(ACE_BUILDDIR)/ace/libACE.la
+
+nobase_include_HEADERS += \
+ Naming/Entries.h \
+ Naming/Flat_File_Persistence.h \
+ Naming/Hash_Naming_Context.h \
+ Naming/Naming_Context_Interface.h \
+ Naming/Naming_Loader.h \
+ Naming/Naming_Server.h \
+ Naming/Persistent_Context_Index.h \
+ Naming/Persistent_Entries.h \
+ Naming/Persistent_Naming_Context.h \
+ Naming/Storable.h \
+ Naming/Storable.inl \
+ Naming/Storable_Naming_Context.h \
+ Naming/Storable_Naming_Context_Activator.h \
+ Naming/Transient_Naming_Context.h \
+ Naming/naming_serv_export.h \
+ Naming/nsconf.h
+
+pkgconfig_DATA += \
+ TAO_CosNaming_Serv.pc
+
+CLEANFILES += \
+ TAO_CosNaming_Serv.pc
+
+TAO_CosNaming_Serv.pc: ${top_builddir}/config.status ${srcdir}/TAO_CosNaming_Serv.pc.in
+ ${top_builddir}/config.status --file $@:${srcdir}/TAO_CosNaming_Serv.pc.in
+
+endif !BUILD_ACE_FOR_TAO
+
+EXTRA_DIST += \
+ CosNaming_Serv.rc \
+ TAO_CosNaming_Serv.pc.in
+
+
+## Makefile.CosNotification_IDL.am
+
+if !BUILD_MINIMUM_CORBA
+
+BUILT_SOURCES += \
+ CosNotificationC.cpp \
+ CosNotificationC.h \
+ CosNotificationC.inl \
+ CosNotificationS.cpp \
+ CosNotificationS.h \
+ CosNotificationS.inl \
+ CosNotificationS_T.cpp \
+ CosNotificationS_T.h \
+ CosNotificationS_T.inl
+
+CLEANFILES += \
+ CosNotification-stamp \
+ CosNotificationC.cpp \
+ CosNotificationC.h \
+ CosNotificationC.inl \
+ CosNotificationS.cpp \
+ CosNotificationS.h \
+ CosNotificationS.inl \
+ CosNotificationS_T.cpp \
+ CosNotificationS_T.h \
+ CosNotificationS_T.inl
+
+CosNotificationC.cpp CosNotificationC.h CosNotificationC.inl CosNotificationS.cpp CosNotificationS.h CosNotificationS.inl CosNotificationS_T.cpp CosNotificationS_T.h CosNotificationS_T.inl: CosNotification-stamp
+
+CosNotification-stamp: $(srcdir)/CosNotification.idl $(TAO_IDL_DEP)
+ $(TAO_IDL) $(TAO_IDLFLAGS) -I$(TAO_ROOT)/orbsvcs -GT -Wb,versioning_begin=TAO_BEGIN_VERSIONED_NAMESPACE_DECL -Wb,versioning_end=TAO_END_VERSIONED_NAMESPACE_DECL -Wb,stub_export_macro=TAO_Notify_Export -Wb,stub_export_include=orbsvcs/Notify/notify_export.h -Wb,skel_export_macro=TAO_Notify_Skel_Export -Wb,skel_export_include=orbsvcs/Notify/notify_skel_export.h $(srcdir)/CosNotification.idl
+ @touch $@
+
+BUILT_SOURCES += \
+ CosNotifyCommC.cpp \
+ CosNotifyCommC.h \
+ CosNotifyCommC.inl \
+ CosNotifyCommS.cpp \
+ CosNotifyCommS.h \
+ CosNotifyCommS.inl \
+ CosNotifyCommS_T.cpp \
+ CosNotifyCommS_T.h \
+ CosNotifyCommS_T.inl
+
+CLEANFILES += \
+ CosNotifyComm-stamp \
+ CosNotifyCommC.cpp \
+ CosNotifyCommC.h \
+ CosNotifyCommC.inl \
+ CosNotifyCommS.cpp \
+ CosNotifyCommS.h \
+ CosNotifyCommS.inl \
+ CosNotifyCommS_T.cpp \
+ CosNotifyCommS_T.h \
+ CosNotifyCommS_T.inl
+
+CosNotifyCommC.cpp CosNotifyCommC.h CosNotifyCommC.inl CosNotifyCommS.cpp CosNotifyCommS.h CosNotifyCommS.inl CosNotifyCommS_T.cpp CosNotifyCommS_T.h CosNotifyCommS_T.inl: CosNotifyComm-stamp
+
+CosNotifyComm-stamp: $(srcdir)/CosNotifyComm.idl $(TAO_IDL_DEP)
+ $(TAO_IDL) $(TAO_IDLFLAGS) -I$(TAO_ROOT)/orbsvcs -GT -Wb,versioning_begin=TAO_BEGIN_VERSIONED_NAMESPACE_DECL -Wb,versioning_end=TAO_END_VERSIONED_NAMESPACE_DECL -Wb,stub_export_macro=TAO_Notify_Export -Wb,stub_export_include=orbsvcs/Notify/notify_export.h -Wb,skel_export_macro=TAO_Notify_Skel_Export -Wb,skel_export_include=orbsvcs/Notify/notify_skel_export.h $(srcdir)/CosNotifyComm.idl
+ @touch $@
+
+BUILT_SOURCES += \
+ CosNotifyFilterC.cpp \
+ CosNotifyFilterC.h \
+ CosNotifyFilterC.inl \
+ CosNotifyFilterS.cpp \
+ CosNotifyFilterS.h \
+ CosNotifyFilterS.inl \
+ CosNotifyFilterS_T.cpp \
+ CosNotifyFilterS_T.h \
+ CosNotifyFilterS_T.inl
+
+CLEANFILES += \
+ CosNotifyFilter-stamp \
+ CosNotifyFilterC.cpp \
+ CosNotifyFilterC.h \
+ CosNotifyFilterC.inl \
+ CosNotifyFilterS.cpp \
+ CosNotifyFilterS.h \
+ CosNotifyFilterS.inl \
+ CosNotifyFilterS_T.cpp \
+ CosNotifyFilterS_T.h \
+ CosNotifyFilterS_T.inl
+
+CosNotifyFilterC.cpp CosNotifyFilterC.h CosNotifyFilterC.inl CosNotifyFilterS.cpp CosNotifyFilterS.h CosNotifyFilterS.inl CosNotifyFilterS_T.cpp CosNotifyFilterS_T.h CosNotifyFilterS_T.inl: CosNotifyFilter-stamp
+
+CosNotifyFilter-stamp: $(srcdir)/CosNotifyFilter.idl $(TAO_IDL_DEP)
+ $(TAO_IDL) $(TAO_IDLFLAGS) -I$(TAO_ROOT)/orbsvcs -GT -Wb,versioning_begin=TAO_BEGIN_VERSIONED_NAMESPACE_DECL -Wb,versioning_end=TAO_END_VERSIONED_NAMESPACE_DECL -Wb,stub_export_macro=TAO_Notify_Export -Wb,stub_export_include=orbsvcs/Notify/notify_export.h -Wb,skel_export_macro=TAO_Notify_Skel_Export -Wb,skel_export_include=orbsvcs/Notify/notify_skel_export.h $(srcdir)/CosNotifyFilter.idl
+ @touch $@
+
+BUILT_SOURCES += \
+ CosNotifyChannelAdminC.cpp \
+ CosNotifyChannelAdminC.h \
+ CosNotifyChannelAdminC.inl \
+ CosNotifyChannelAdminS.cpp \
+ CosNotifyChannelAdminS.h \
+ CosNotifyChannelAdminS.inl \
+ CosNotifyChannelAdminS_T.cpp \
+ CosNotifyChannelAdminS_T.h \
+ CosNotifyChannelAdminS_T.inl
+
+CLEANFILES += \
+ CosNotifyChannelAdmin-stamp \
+ CosNotifyChannelAdminC.cpp \
+ CosNotifyChannelAdminC.h \
+ CosNotifyChannelAdminC.inl \
+ CosNotifyChannelAdminS.cpp \
+ CosNotifyChannelAdminS.h \
+ CosNotifyChannelAdminS.inl \
+ CosNotifyChannelAdminS_T.cpp \
+ CosNotifyChannelAdminS_T.h \
+ CosNotifyChannelAdminS_T.inl
+
+CosNotifyChannelAdminC.cpp CosNotifyChannelAdminC.h CosNotifyChannelAdminC.inl CosNotifyChannelAdminS.cpp CosNotifyChannelAdminS.h CosNotifyChannelAdminS.inl CosNotifyChannelAdminS_T.cpp CosNotifyChannelAdminS_T.h CosNotifyChannelAdminS_T.inl: CosNotifyChannelAdmin-stamp
+
+CosNotifyChannelAdmin-stamp: $(srcdir)/CosNotifyChannelAdmin.idl $(TAO_IDL_DEP)
+ $(TAO_IDL) $(TAO_IDLFLAGS) -I$(TAO_ROOT)/orbsvcs -GT -Wb,versioning_begin=TAO_BEGIN_VERSIONED_NAMESPACE_DECL -Wb,versioning_end=TAO_END_VERSIONED_NAMESPACE_DECL -Wb,stub_export_macro=TAO_Notify_Export -Wb,stub_export_include=orbsvcs/Notify/notify_export.h -Wb,skel_export_macro=TAO_Notify_Skel_Export -Wb,skel_export_include=orbsvcs/Notify/notify_skel_export.h $(srcdir)/CosNotifyChannelAdmin.idl
+ @touch $@
+
+BUILT_SOURCES += \
+ NotifyExtC.cpp \
+ NotifyExtC.h \
+ NotifyExtC.inl \
+ NotifyExtS.cpp \
+ NotifyExtS.h \
+ NotifyExtS.inl \
+ NotifyExtS_T.cpp \
+ NotifyExtS_T.h \
+ NotifyExtS_T.inl
+
+CLEANFILES += \
+ NotifyExt-stamp \
+ NotifyExtC.cpp \
+ NotifyExtC.h \
+ NotifyExtC.inl \
+ NotifyExtS.cpp \
+ NotifyExtS.h \
+ NotifyExtS.inl \
+ NotifyExtS_T.cpp \
+ NotifyExtS_T.h \
+ NotifyExtS_T.inl
+
+NotifyExtC.cpp NotifyExtC.h NotifyExtC.inl NotifyExtS.cpp NotifyExtS.h NotifyExtS.inl NotifyExtS_T.cpp NotifyExtS_T.h NotifyExtS_T.inl: NotifyExt-stamp
+
+NotifyExt-stamp: $(srcdir)/NotifyExt.idl $(TAO_IDL_DEP)
+ $(TAO_IDL) $(TAO_IDLFLAGS) -I$(TAO_ROOT)/orbsvcs -GT -Wb,versioning_begin=TAO_BEGIN_VERSIONED_NAMESPACE_DECL -Wb,versioning_end=TAO_END_VERSIONED_NAMESPACE_DECL -Wb,stub_export_macro=TAO_Notify_Export -Wb,stub_export_include=orbsvcs/Notify/notify_export.h -Wb,skel_export_macro=TAO_Notify_Skel_Export -Wb,skel_export_include=orbsvcs/Notify/notify_skel_export.h $(srcdir)/NotifyExt.idl
+ @touch $@
+
+BUILT_SOURCES += \
+ Event_ForwarderC.cpp \
+ Event_ForwarderC.h \
+ Event_ForwarderC.inl \
+ Event_ForwarderS.cpp \
+ Event_ForwarderS.h \
+ Event_ForwarderS.inl \
+ Event_ForwarderS_T.cpp \
+ Event_ForwarderS_T.h \
+ Event_ForwarderS_T.inl
+
+CLEANFILES += \
+ Event_Forwarder-stamp \
+ Event_ForwarderC.cpp \
+ Event_ForwarderC.h \
+ Event_ForwarderC.inl \
+ Event_ForwarderS.cpp \
+ Event_ForwarderS.h \
+ Event_ForwarderS.inl \
+ Event_ForwarderS_T.cpp \
+ Event_ForwarderS_T.h \
+ Event_ForwarderS_T.inl
+
+Event_ForwarderC.cpp Event_ForwarderC.h Event_ForwarderC.inl Event_ForwarderS.cpp Event_ForwarderS.h Event_ForwarderS.inl Event_ForwarderS_T.cpp Event_ForwarderS_T.h Event_ForwarderS_T.inl: Event_Forwarder-stamp
+
+Event_Forwarder-stamp: $(srcdir)/Event_Forwarder.idl $(TAO_IDL_DEP)
+ $(TAO_IDL) $(TAO_IDLFLAGS) -I$(TAO_ROOT)/orbsvcs -GT -Wb,versioning_begin=TAO_BEGIN_VERSIONED_NAMESPACE_DECL -Wb,versioning_end=TAO_END_VERSIONED_NAMESPACE_DECL -Wb,stub_export_macro=TAO_Notify_Export -Wb,stub_export_include=orbsvcs/Notify/notify_export.h -Wb,skel_export_macro=TAO_Notify_Skel_Export -Wb,skel_export_include=orbsvcs/Notify/notify_skel_export.h $(srcdir)/Event_Forwarder.idl
+ @touch $@
+
+
+nobase_include_HEADERS += \
+ CosNotification.idl \
+ CosNotifyChannelAdmin.idl \
+ CosNotifyComm.idl \
+ CosNotifyFilter.idl \
+ Event_Forwarder.idl \
+ NotifyExt.idl
+
+endif !BUILD_MINIMUM_CORBA
+
+## Makefile.CosNotification.am
+
+if !BUILD_MINIMUM_CORBA
+
+lib_LTLIBRARIES += libTAO_CosNotification.la
+
+libTAO_CosNotification_la_CPPFLAGS = \
+ -I$(ACE_ROOT) \
+ -I$(ACE_BUILDDIR) \
+ -I$(TAO_ROOT) \
+ -I$(TAO_BUILDDIR) \
+ -I$(TAO_ROOT)/orbsvcs \
+ -I$(TAO_BUILDDIR)/orbsvcs \
+ -DTAO_HAS_TYPED_EVENT_CHANNEL \
+ -DTAO_NOTIFY_BUILD_DLL
+
+libTAO_CosNotification_la_SOURCES = \
+ CosNotificationC.cpp \
+ CosNotifyChannelAdminC.cpp \
+ CosNotifyCommC.cpp \
+ CosNotifyFilterC.cpp \
+ Event_ForwarderC.cpp \
+ Notify/Notify_Extensions.cpp \
+ NotifyExtC.cpp
+
+libTAO_CosNotification_la_LDFLAGS = \
+ -version-number @TAO_MAJOR@:@TAO_MINOR@:@TAO_BETA@
+
+libTAO_CosNotification_la_LIBADD = \
+ libTAO_CosEvent.la \
+ $(TAO_BUILDDIR)/tao/libTAO_AnyTypeCode.la \
+ $(TAO_BUILDDIR)/tao/libTAO.la \
+ $(ACE_BUILDDIR)/ace/libACE.la
+
+nobase_include_HEADERS += \
+ CosNotificationC.h \
+ CosNotificationC.inl \
+ CosNotifyChannelAdminC.h \
+ CosNotifyChannelAdminC.inl \
+ CosNotifyCommC.h \
+ CosNotifyCommC.inl \
+ CosNotifyFilterC.h \
+ CosNotifyFilterC.inl \
+ Event_ForwarderC.h \
+ Event_ForwarderC.inl \
+ Notify/Notify_Extensions.h \
+ Notify/notify_export.h \
+ NotifyExtC.h \
+ NotifyExtC.inl
+
+pkgconfig_DATA += \
+ TAO_CosNotification.pc
+
+CLEANFILES += \
+ TAO_CosNotification.pc
+
+TAO_CosNotification.pc: ${top_builddir}/config.status ${srcdir}/TAO_CosNotification.pc.in
+ ${top_builddir}/config.status --file $@:${srcdir}/TAO_CosNotification.pc.in
+
+endif !BUILD_MINIMUM_CORBA
+
+EXTRA_DIST += \
+ CosNotification.rc \
+ TAO_CosNotification.pc.in
+
+
+## Makefile.ETCL.am
+
+lib_LTLIBRARIES += libTAO_ETCL.la
+
+libTAO_ETCL_la_CPPFLAGS = \
+ -I$(ACE_ROOT) \
+ -I$(ACE_BUILDDIR) \
+ -I$(TAO_ROOT) \
+ -I$(TAO_BUILDDIR) \
+ -I$(TAO_ROOT)/orbsvcs \
+ -I$(TAO_BUILDDIR)/orbsvcs \
+ -DTAO_ETCL_BUILD_DLL
+
+libTAO_ETCL_la_SOURCES = \
+ ETCL/ETCL_Constraint.cpp \
+ ETCL/ETCL_Interpreter.cpp \
+ ETCL/ETCL_l.cpp \
+ ETCL/ETCL_y.cpp
+
+libTAO_ETCL_la_LDFLAGS = \
+ -version-number @TAO_MAJOR@:@TAO_MINOR@:@TAO_BETA@
+
+libTAO_ETCL_la_LIBADD = \
+ $(TAO_BUILDDIR)/tao/libTAO_AnyTypeCode.la \
+ $(TAO_BUILDDIR)/tao/libTAO.la \
+ $(ACE_BUILDDIR)/ace/libACE.la
+
+nobase_include_HEADERS += \
+ ETCL/ETCL_Constraint.h \
+ ETCL/ETCL_Constraint.inl \
+ ETCL/ETCL_Constraint_Visitor.h \
+ ETCL/ETCL_Interpreter.h \
+ ETCL/ETCL_y.h \
+ ETCL/etcl_export.h
+
+pkgconfig_DATA += \
+ TAO_ETCL.pc
+
+CLEANFILES += \
+ TAO_ETCL.pc
+
+TAO_ETCL.pc: ${top_builddir}/config.status ${srcdir}/TAO_ETCL.pc.in
+ ${top_builddir}/config.status --file $@:${srcdir}/TAO_ETCL.pc.in
+
+EXTRA_DIST += \
+ ETCL.rc \
+ TAO_ETCL.pc.in
+
+
+## Makefile.CosNotification_Skel.am
+
+if !BUILD_MINIMUM_CORBA
+
+lib_LTLIBRARIES += libTAO_CosNotification_Skel.la
+
+libTAO_CosNotification_Skel_la_CPPFLAGS = \
+ -I$(ACE_ROOT) \
+ -I$(ACE_BUILDDIR) \
+ -I$(TAO_ROOT) \
+ -I$(TAO_BUILDDIR) \
+ -I$(TAO_ROOT)/orbsvcs \
+ -I$(TAO_BUILDDIR)/orbsvcs \
+ -DTAO_HAS_TYPED_EVENT_CHANNEL \
+ -DTAO_NOTIFY_SKEL_BUILD_DLL
+
+libTAO_CosNotification_Skel_la_SOURCES = \
+ CosNotificationS.cpp \
+ CosNotifyChannelAdminS.cpp \
+ CosNotifyCommS.cpp \
+ CosNotifyFilterS.cpp \
+ Event_ForwarderS.cpp \
+ NotifyExtS.cpp
+
+libTAO_CosNotification_Skel_la_LDFLAGS = \
+ -version-number @TAO_MAJOR@:@TAO_MINOR@:@TAO_BETA@
+
+libTAO_CosNotification_Skel_la_LIBADD = \
+ libTAO_CosEvent_Skel.la \
+ $(TAO_BUILDDIR)/tao/libTAO_PortableServer.la \
+ libTAO_CosNotification.la \
+ libTAO_CosEvent.la \
+ $(TAO_BUILDDIR)/tao/libTAO_AnyTypeCode.la \
+ $(TAO_BUILDDIR)/tao/libTAO.la \
+ $(ACE_BUILDDIR)/ace/libACE.la
+
+nobase_include_HEADERS += \
+ CosNotificationS.h \
+ CosNotificationS.inl \
+ CosNotificationS_T.cpp \
+ CosNotificationS_T.h \
+ CosNotificationS_T.inl \
+ CosNotifyChannelAdminS.h \
+ CosNotifyChannelAdminS.inl \
+ CosNotifyChannelAdminS_T.cpp \
+ CosNotifyChannelAdminS_T.h \
+ CosNotifyChannelAdminS_T.inl \
+ CosNotifyCommS.h \
+ CosNotifyCommS.inl \
+ CosNotifyCommS_T.cpp \
+ CosNotifyCommS_T.h \
+ CosNotifyCommS_T.inl \
+ CosNotifyFilterS.h \
+ CosNotifyFilterS.inl \
+ CosNotifyFilterS_T.cpp \
+ CosNotifyFilterS_T.h \
+ CosNotifyFilterS_T.inl \
+ Event_ForwarderS.h \
+ Event_ForwarderS.inl \
+ Event_ForwarderS_T.cpp \
+ Event_ForwarderS_T.h \
+ Event_ForwarderS_T.inl \
+ Notify/notify_skel_export.h \
+ NotifyExtS.h \
+ NotifyExtS.inl \
+ NotifyExtS_T.cpp \
+ NotifyExtS_T.h \
+ NotifyExtS_T.inl
+
+pkgconfig_DATA += \
+ TAO_CosNotification_Skel.pc
+
+CLEANFILES += \
+ TAO_CosNotification_Skel.pc
+
+TAO_CosNotification_Skel.pc: ${top_builddir}/config.status ${srcdir}/TAO_CosNotification_Skel.pc.in
+ ${top_builddir}/config.status --file $@:${srcdir}/TAO_CosNotification_Skel.pc.in
+
+endif !BUILD_MINIMUM_CORBA
+
+EXTRA_DIST += \
+ CosNotification_Skel.rc \
+ TAO_CosNotification_Skel.pc.in
+
+
+## Makefile.CosNotification_Serv.am
+
+if !BUILD_MINIMUM_CORBA
+
+lib_LTLIBRARIES += libTAO_CosNotification_Serv.la
+
+libTAO_CosNotification_Serv_la_CPPFLAGS = \
+ -I$(ACE_ROOT) \
+ -I$(ACE_BUILDDIR) \
+ -I$(TAO_ROOT) \
+ -I$(TAO_BUILDDIR) \
+ -I$(TAO_ROOT)/orbsvcs \
+ -I$(TAO_BUILDDIR)/orbsvcs \
+ -DTAO_HAS_TYPED_EVENT_CHANNEL \
+ -DTAO_NOTIFY_SERV_BUILD_DLL
+
+libTAO_CosNotification_Serv_la_SOURCES = \
+ Notify/Admin.cpp \
+ Notify/AdminProperties.cpp \
+ Notify/Any/AnyEvent.cpp \
+ Notify/Any/CosEC_ProxyPushConsumer.cpp \
+ Notify/Any/CosEC_ProxyPushSupplier.cpp \
+ Notify/Any/ProxyPushConsumer.cpp \
+ Notify/Any/ProxyPushSupplier.cpp \
+ Notify/Any/PushConsumer.cpp \
+ Notify/Any/PushSupplier.cpp \
+ Notify/Bit_Vector.cpp \
+ Notify/Buffering_Strategy.cpp \
+ Notify/Builder.cpp \
+ Notify/Consumer.cpp \
+ Notify/ConsumerAdmin.cpp \
+ Notify/CosNotify_Initializer.cpp \
+ Notify/CosNotify_Service.cpp \
+ Notify/Default_Factory.cpp \
+ Notify/Delivery_Request.cpp \
+ Notify/ETCL_Filter.cpp \
+ Notify/ETCL_FilterFactory.cpp \
+ Notify/Event.cpp \
+ Notify/EventChannel.cpp \
+ Notify/EventChannelFactory.cpp \
+ Notify/EventType.cpp \
+ Notify/EventTypeSeq.cpp \
+ Notify/Event_Manager.cpp \
+ Notify/Event_Persistence_Factory.cpp \
+ Notify/FilterAdmin.cpp \
+ Notify/ID_Factory.cpp \
+ Notify/Method_Request.cpp \
+ Notify/Method_Request_Dispatch.cpp \
+ Notify/Method_Request_Event.cpp \
+ Notify/Method_Request_Lookup.cpp \
+ Notify/Method_Request_Shutdown.cpp \
+ Notify/Method_Request_Updates.cpp \
+ Notify/Name_Value_Pair.cpp \
+ Notify/Notify_Constraint_Interpreter.cpp \
+ Notify/Notify_Constraint_Visitors.cpp \
+ Notify/Notify_Default_CO_Factory.cpp \
+ Notify/Notify_Default_Collection_Factory.cpp \
+ Notify/Notify_Default_EMO_Factory.cpp \
+ Notify/Notify_Default_POA_Factory.cpp \
+ Notify/Notify_EventChannelFactory_i.cpp \
+ Notify/Object.cpp \
+ Notify/POA_Helper.cpp \
+ Notify/Peer.cpp \
+ Notify/Persistent_File_Allocator.cpp \
+ Notify/Properties.cpp \
+ Notify/PropertySeq.cpp \
+ Notify/Property_Boolean.cpp \
+ Notify/Proxy.cpp \
+ Notify/ProxyConsumer.cpp \
+ Notify/ProxySupplier.cpp \
+ Notify/QoSProperties.cpp \
+ Notify/Random_File.cpp \
+ Notify/Reactive_Task.cpp \
+ Notify/Reconnection_Registry.cpp \
+ Notify/Refcountable.cpp \
+ Notify/Routing_Slip.cpp \
+ Notify/Routing_Slip_Persistence_Manager.cpp \
+ Notify/Routing_Slip_Queue.cpp \
+ Notify/Sequence/SequenceProxyPushConsumer.cpp \
+ Notify/Sequence/SequenceProxyPushSupplier.cpp \
+ Notify/Sequence/SequencePushConsumer.cpp \
+ Notify/Sequence/SequencePushSupplier.cpp \
+ Notify/Service.cpp \
+ Notify/Standard_Event_Persistence.cpp \
+ Notify/Structured/StructuredEvent.cpp \
+ Notify/Structured/StructuredProxyPushConsumer.cpp \
+ Notify/Structured/StructuredProxyPushSupplier.cpp \
+ Notify/Structured/StructuredPushConsumer.cpp \
+ Notify/Structured/StructuredPushSupplier.cpp \
+ Notify/Subscription_Change_Worker.cpp \
+ Notify/Supplier.cpp \
+ Notify/SupplierAdmin.cpp \
+ Notify/ThreadPool_Task.cpp \
+ Notify/Timer_Queue.cpp \
+ Notify/Timer_Reactor.cpp \
+ Notify/Topology_Loader.cpp \
+ Notify/Topology_Object.cpp \
+ Notify/Topology_Saver.cpp \
+ Notify/Worker_Task.cpp
+
+libTAO_CosNotification_Serv_la_LDFLAGS = \
+ -version-number @TAO_MAJOR@:@TAO_MINOR@:@TAO_BETA@
+
+libTAO_CosNotification_Serv_la_LIBADD = \
+ libTAO_ETCL.la \
+ $(TAO_BUILDDIR)/tao/libTAO_DynamicAny.la \
+ libTAO_CosNotification_Skel.la \
+ libTAO_CosEvent_Skel.la \
+ libTAO_CosNotification.la \
+ libTAO_CosEvent.la \
+ libTAO_Svc_Utils.la \
+ $(TAO_BUILDDIR)/tao/libTAO_PortableServer.la \
+ $(TAO_BUILDDIR)/tao/libTAO_AnyTypeCode.la \
+ $(TAO_BUILDDIR)/tao/libTAO.la \
+ $(ACE_BUILDDIR)/ace/libACE.la
+
+nobase_include_HEADERS += \
+ Notify/Admin.h \
+ Notify/Admin.inl \
+ Notify/AdminProperties.h \
+ Notify/AdminProperties.inl \
+ Notify/Any/AnyEvent.h \
+ Notify/Any/CosEC_ProxyPushConsumer.h \
+ Notify/Any/CosEC_ProxyPushSupplier.h \
+ Notify/Any/ProxyPushConsumer.h \
+ Notify/Any/ProxyPushSupplier.h \
+ Notify/Any/PushConsumer.h \
+ Notify/Any/PushSupplier.h \
+ Notify/Bit_Vector.h \
+ Notify/Buffering_Strategy.h \
+ Notify/Builder.h \
+ Notify/Consumer.h \
+ Notify/Consumer.inl \
+ Notify/ConsumerAdmin.h \
+ Notify/CosNotify_Initializer.h \
+ Notify/CosNotify_Service.h \
+ Notify/Default_Factory.h \
+ Notify/Delivery_Request.h \
+ Notify/Delivery_Request.inl \
+ Notify/ETCL_Filter.h \
+ Notify/ETCL_FilterFactory.h \
+ Notify/Event.h \
+ Notify/Event.inl \
+ Notify/EventChannel.h \
+ Notify/EventChannelFactory.h \
+ Notify/EventType.h \
+ Notify/EventType.inl \
+ Notify/EventTypeSeq.h \
+ Notify/Event_Manager.h \
+ Notify/Event_Persistence_Factory.h \
+ Notify/FilterAdmin.h \
+ Notify/FilterAdmin.inl \
+ Notify/ID_Factory.h \
+ Notify/ID_Factory.inl \
+ Notify/Method_Request.h \
+ Notify/Method_Request_Dispatch.h \
+ Notify/Method_Request_Event.h \
+ Notify/Method_Request_Lookup.h \
+ Notify/Method_Request_Shutdown.h \
+ Notify/Method_Request_Updates.h \
+ Notify/Method_Request_Updates_T.cpp \
+ Notify/Name_Value_Pair.h \
+ Notify/Notify_Constraint_Interpreter.h \
+ Notify/Notify_Constraint_Visitors.h \
+ Notify/Notify_Default_CO_Factory.h \
+ Notify/Notify_Default_Collection_Factory.h \
+ Notify/Notify_Default_EMO_Factory.h \
+ Notify/Notify_Default_POA_Factory.h \
+ Notify/Notify_EventChannelFactory_i.h \
+ Notify/Object.h \
+ Notify/Object.inl \
+ Notify/POA_Helper.h \
+ Notify/POA_Helper.inl \
+ Notify/Peer.h \
+ Notify/Persistent_File_Allocator.h \
+ Notify/Properties.h \
+ Notify/Properties.inl \
+ Notify/PropertySeq.h \
+ Notify/PropertySeq.inl \
+ Notify/Property_Boolean.h \
+ Notify/Property_Boolean.inl \
+ Notify/Proxy.h \
+ Notify/Proxy.inl \
+ Notify/ProxyConsumer.h \
+ Notify/ProxyConsumer.inl \
+ Notify/ProxyConsumer_T.cpp \
+ Notify/ProxySupplier.h \
+ Notify/ProxySupplier.inl \
+ Notify/ProxySupplier_T.cpp \
+ Notify/Proxy_T.cpp \
+ Notify/QoSProperties.h \
+ Notify/QoSProperties.inl \
+ Notify/Random_File.h \
+ Notify/Reactive_Task.h \
+ Notify/Reactive_Task.inl \
+ Notify/Reconnection_Registry.h \
+ Notify/Refcountable.h \
+ Notify/Routing_Slip.h \
+ Notify/Routing_Slip_Persistence_Manager.h \
+ Notify/Routing_Slip_Queue.h \
+ Notify/Sequence/SequenceProxyPushConsumer.h \
+ Notify/Sequence/SequenceProxyPushSupplier.h \
+ Notify/Sequence/SequencePushConsumer.h \
+ Notify/Sequence/SequencePushSupplier.h \
+ Notify/Service.h \
+ Notify/Standard_Event_Persistence.h \
+ Notify/Structured/StructuredEvent.h \
+ Notify/Structured/StructuredProxyPushConsumer.h \
+ Notify/Structured/StructuredProxyPushSupplier.h \
+ Notify/Structured/StructuredPushConsumer.h \
+ Notify/Structured/StructuredPushSupplier.h \
+ Notify/Subscription_Change_Worker.h \
+ Notify/Supplier.h \
+ Notify/Supplier.inl \
+ Notify/SupplierAdmin.h \
+ Notify/ThreadPool_Task.h \
+ Notify/Timer_Queue.h \
+ Notify/Timer_Reactor.h \
+ Notify/Topology_Loader.h \
+ Notify/Topology_Object.h \
+ Notify/Topology_Object.inl \
+ Notify/Topology_Saver.h \
+ Notify/Worker_Task.h \
+ Notify/notify_serv_export.h
+
+pkgconfig_DATA += \
+ TAO_CosNotification_Serv.pc
+
+CLEANFILES += \
+ TAO_CosNotification_Serv.pc
+
+TAO_CosNotification_Serv.pc: ${top_builddir}/config.status ${srcdir}/TAO_CosNotification_Serv.pc.in
+ ${top_builddir}/config.status --file $@:${srcdir}/TAO_CosNotification_Serv.pc.in
+
+endif !BUILD_MINIMUM_CORBA
+
+EXTRA_DIST += \
+ CosNotification_Serv.rc \
+ TAO_CosNotification_Serv.pc.in
+
+
+## Makefile.CosNotification_Persist.am
+
+if BUILD_ACEXML
+if !BUILD_ACE_FOR_TAO
+if !BUILD_MINIMUM_CORBA
+
+lib_LTLIBRARIES += libTAO_CosNotification_Persist.la
+
+libTAO_CosNotification_Persist_la_CPPFLAGS = \
+ -I$(ACE_ROOT) \
+ -I$(ACE_BUILDDIR) \
+ -I$(TAO_ROOT) \
+ -I$(TAO_BUILDDIR) \
+ -I$(TAO_ROOT)/orbsvcs \
+ -I$(TAO_BUILDDIR)/orbsvcs \
+ -I$(ACE_ROOT)/ACEXML/common \
+ -DTAO_HAS_TYPED_EVENT_CHANNEL \
+ -DTAO_NOTIFY_PERSIST_BUILD_DLL
+
+libTAO_CosNotification_Persist_la_SOURCES = \
+ Notify/XML_Loader.cpp \
+ Notify/XML_Saver.cpp \
+ Notify/XML_Topology_Factory.cpp
+
+libTAO_CosNotification_Persist_la_LDFLAGS = \
+ -version-number @TAO_MAJOR@:@TAO_MINOR@:@TAO_BETA@
+
+libTAO_CosNotification_Persist_la_LIBADD = \
+ $(ACE_BUILDDIR)/ACEXML/parser/parser/libACEXML_Parser.la \
+ $(ACE_BUILDDIR)/ACEXML/common/libACEXML.la \
+ libTAO_CosNotification_Serv.la \
+ $(TAO_BUILDDIR)/tao/libTAO_DynamicAny.la \
+ libTAO_ETCL.la \
+ libTAO_CosNotification_Skel.la \
+ libTAO_CosEvent_Skel.la \
+ libTAO_CosNotification.la \
+ libTAO_CosEvent.la \
+ libTAO_Svc_Utils.la \
+ $(TAO_BUILDDIR)/tao/libTAO_PortableServer.la \
+ $(TAO_BUILDDIR)/tao/libTAO_AnyTypeCode.la \
+ $(TAO_BUILDDIR)/tao/libTAO.la \
+ $(ACE_BUILDDIR)/ace/libACE.la
+
+nobase_include_HEADERS += \
+ Notify/XML_Loader.h \
+ Notify/XML_Saver.h \
+ Notify/XML_Topology_Factory.h \
+ Notify/notify_persist_export.h
+
+endif !BUILD_MINIMUM_CORBA
+endif !BUILD_ACE_FOR_TAO
+endif BUILD_ACEXML
+
+## Makefile.CosTime.am
+
+BUILT_SOURCES += \
+ TimeServiceC.cpp \
+ TimeServiceC.h \
+ TimeServiceC.inl \
+ TimeServiceS.cpp \
+ TimeServiceS.h \
+ TimeServiceS.inl \
+ TimeServiceS_T.cpp
+
+CLEANFILES += \
+ TimeService-stamp \
+ TimeServiceC.cpp \
+ TimeServiceC.h \
+ TimeServiceC.inl \
+ TimeServiceS.cpp \
+ TimeServiceS.h \
+ TimeServiceS.inl \
+ TimeServiceS_T.cpp
+
+TimeServiceC.cpp TimeServiceC.h TimeServiceC.inl TimeServiceS.cpp TimeServiceS.h TimeServiceS.inl TimeServiceS_T.cpp: TimeService-stamp
+
+TimeService-stamp: $(srcdir)/TimeService.idl $(TAO_IDL_DEP)
+ $(TAO_IDL) $(TAO_IDLFLAGS) -I$(TAO_ROOT)/orbsvcs -GT -Wb,versioning_begin=TAO_BEGIN_VERSIONED_NAMESPACE_DECL -Wb,versioning_end=TAO_END_VERSIONED_NAMESPACE_DECL -Wb,export_macro=TAO_Time_Export -Wb,export_include=orbsvcs/Time/time_export.h $(srcdir)/TimeService.idl
+ @touch $@
+
+lib_LTLIBRARIES += libTAO_CosTime.la
+
+libTAO_CosTime_la_CPPFLAGS = \
+ -I$(ACE_ROOT) \
+ -I$(ACE_BUILDDIR) \
+ -I$(TAO_ROOT) \
+ -I$(TAO_BUILDDIR) \
+ -I$(TAO_ROOT)/orbsvcs \
+ -I$(TAO_BUILDDIR)/orbsvcs \
+ -DTAO_TIME_BUILD_DLL
+
+libTAO_CosTime_la_SOURCES = \
+ Time/TAO_TIO.cpp \
+ Time/TAO_Time_Service_Clerk.cpp \
+ Time/TAO_Time_Service_Server.cpp \
+ Time/TAO_UTO.cpp \
+ Time/Timer_Helper.cpp \
+ TimeServiceC.cpp \
+ TimeServiceS.cpp
+
+libTAO_CosTime_la_LDFLAGS = \
+ -version-number @TAO_MAJOR@:@TAO_MINOR@:@TAO_BETA@
+
+libTAO_CosTime_la_LIBADD = \
+ libTAO_Svc_Utils.la \
+ $(TAO_BUILDDIR)/tao/libTAO_PortableServer.la \
+ $(TAO_BUILDDIR)/tao/libTAO_AnyTypeCode.la \
+ $(TAO_BUILDDIR)/tao/libTAO.la \
+ $(ACE_BUILDDIR)/ace/libACE.la
+
+nobase_include_HEADERS += \
+ Time/TAO_TIO.h \
+ Time/TAO_Time_Service_Clerk.h \
+ Time/TAO_Time_Service_Server.h \
+ Time/TAO_UTO.h \
+ Time/Timer_Helper.h \
+ Time/time_export.h \
+ TimeService.idl \
+ TimeServiceC.h \
+ TimeServiceC.inl \
+ TimeServiceS.h \
+ TimeServiceS.inl \
+ TimeServiceS_T.cpp
+
+pkgconfig_DATA += \
+ TAO_CosTime.pc
+
+CLEANFILES += \
+ TAO_CosTime.pc
+
+TAO_CosTime.pc: ${top_builddir}/config.status ${srcdir}/TAO_CosTime.pc.in
+ ${top_builddir}/config.status --file $@:${srcdir}/TAO_CosTime.pc.in
+
+EXTRA_DIST += \
+ CosTime.rc \
+ TAO_CosTime.pc.in
+
+
+## Makefile.CosTrading_IDL.am
+
+BUILT_SOURCES += \
+ CosTradingC.cpp \
+ CosTradingC.h \
+ CosTradingC.inl \
+ CosTradingS.cpp \
+ CosTradingS.h \
+ CosTradingS.inl \
+ CosTradingS_T.cpp \
+ CosTradingS_T.h \
+ CosTradingS_T.inl
+
+CLEANFILES += \
+ CosTrading-stamp \
+ CosTradingC.cpp \
+ CosTradingC.h \
+ CosTradingC.inl \
+ CosTradingS.cpp \
+ CosTradingS.h \
+ CosTradingS.inl \
+ CosTradingS_T.cpp \
+ CosTradingS_T.h \
+ CosTradingS_T.inl
+
+CosTradingC.cpp CosTradingC.h CosTradingC.inl CosTradingS.cpp CosTradingS.h CosTradingS.inl CosTradingS_T.cpp CosTradingS_T.h CosTradingS_T.inl: CosTrading-stamp
+
+CosTrading-stamp: $(srcdir)/CosTrading.idl $(TAO_IDL_DEP)
+ $(TAO_IDL) $(TAO_IDLFLAGS) -I$(TAO_ROOT)/orbsvcs -GT -Wb,versioning_begin=TAO_BEGIN_VERSIONED_NAMESPACE_DECL -Wb,versioning_end=TAO_END_VERSIONED_NAMESPACE_DECL -Wb,stub_export_macro=TAO_Trading_Export -Wb,stub_export_include=orbsvcs/Trader/trading_export.h -Wb,skel_export_macro=TAO_Trading_Skel_Export -Wb,skel_export_include=orbsvcs/Trader/trading_skel_export.h $(srcdir)/CosTrading.idl
+ @touch $@
+
+BUILT_SOURCES += \
+ CosTradingReposC.cpp \
+ CosTradingReposC.h \
+ CosTradingReposC.inl \
+ CosTradingReposS.cpp \
+ CosTradingReposS.h \
+ CosTradingReposS.inl \
+ CosTradingReposS_T.cpp \
+ CosTradingReposS_T.h \
+ CosTradingReposS_T.inl
+
+CLEANFILES += \
+ CosTradingRepos-stamp \
+ CosTradingReposC.cpp \
+ CosTradingReposC.h \
+ CosTradingReposC.inl \
+ CosTradingReposS.cpp \
+ CosTradingReposS.h \
+ CosTradingReposS.inl \
+ CosTradingReposS_T.cpp \
+ CosTradingReposS_T.h \
+ CosTradingReposS_T.inl
+
+CosTradingReposC.cpp CosTradingReposC.h CosTradingReposC.inl CosTradingReposS.cpp CosTradingReposS.h CosTradingReposS.inl CosTradingReposS_T.cpp CosTradingReposS_T.h CosTradingReposS_T.inl: CosTradingRepos-stamp
+
+CosTradingRepos-stamp: $(srcdir)/CosTradingRepos.idl $(TAO_IDL_DEP)
+ $(TAO_IDL) $(TAO_IDLFLAGS) -I$(TAO_ROOT)/orbsvcs -GT -Wb,versioning_begin=TAO_BEGIN_VERSIONED_NAMESPACE_DECL -Wb,versioning_end=TAO_END_VERSIONED_NAMESPACE_DECL -Wb,stub_export_macro=TAO_Trading_Export -Wb,stub_export_include=orbsvcs/Trader/trading_export.h -Wb,skel_export_macro=TAO_Trading_Skel_Export -Wb,skel_export_include=orbsvcs/Trader/trading_skel_export.h $(srcdir)/CosTradingRepos.idl
+ @touch $@
+
+BUILT_SOURCES += \
+ CosTradingDynamicC.cpp \
+ CosTradingDynamicC.h \
+ CosTradingDynamicC.inl \
+ CosTradingDynamicS.cpp \
+ CosTradingDynamicS.h \
+ CosTradingDynamicS.inl \
+ CosTradingDynamicS_T.cpp \
+ CosTradingDynamicS_T.h \
+ CosTradingDynamicS_T.inl
+
+CLEANFILES += \
+ CosTradingDynamic-stamp \
+ CosTradingDynamicC.cpp \
+ CosTradingDynamicC.h \
+ CosTradingDynamicC.inl \
+ CosTradingDynamicS.cpp \
+ CosTradingDynamicS.h \
+ CosTradingDynamicS.inl \
+ CosTradingDynamicS_T.cpp \
+ CosTradingDynamicS_T.h \
+ CosTradingDynamicS_T.inl
+
+CosTradingDynamicC.cpp CosTradingDynamicC.h CosTradingDynamicC.inl CosTradingDynamicS.cpp CosTradingDynamicS.h CosTradingDynamicS.inl CosTradingDynamicS_T.cpp CosTradingDynamicS_T.h CosTradingDynamicS_T.inl: CosTradingDynamic-stamp
+
+CosTradingDynamic-stamp: $(srcdir)/CosTradingDynamic.idl $(TAO_IDL_DEP)
+ $(TAO_IDL) $(TAO_IDLFLAGS) -I$(TAO_ROOT)/orbsvcs -GT -Wb,versioning_begin=TAO_BEGIN_VERSIONED_NAMESPACE_DECL -Wb,versioning_end=TAO_END_VERSIONED_NAMESPACE_DECL -Wb,stub_export_macro=TAO_Trading_Export -Wb,stub_export_include=orbsvcs/Trader/trading_export.h -Wb,skel_export_macro=TAO_Trading_Skel_Export -Wb,skel_export_include=orbsvcs/Trader/trading_skel_export.h $(srcdir)/CosTradingDynamic.idl
+ @touch $@
+
+
+nobase_include_HEADERS += \
+ CosTrading.idl \
+ CosTradingDynamic.idl \
+ CosTradingRepos.idl
+
+## Makefile.CosTrading.am
+
+lib_LTLIBRARIES += libTAO_CosTrading.la
+
+libTAO_CosTrading_la_CPPFLAGS = \
+ -I$(ACE_ROOT) \
+ -I$(ACE_BUILDDIR) \
+ -I$(TAO_ROOT) \
+ -I$(TAO_BUILDDIR) \
+ -I$(TAO_ROOT)/orbsvcs \
+ -I$(TAO_BUILDDIR)/orbsvcs \
+ -DTAO_TRADING_BUILD_DLL
+
+libTAO_CosTrading_la_SOURCES = \
+ CosTradingC.cpp \
+ CosTradingDynamicC.cpp \
+ CosTradingReposC.cpp
+
+libTAO_CosTrading_la_LDFLAGS = \
+ -version-number @TAO_MAJOR@:@TAO_MINOR@:@TAO_BETA@
+
+libTAO_CosTrading_la_LIBADD = \
+ $(TAO_BUILDDIR)/tao/libTAO_AnyTypeCode.la \
+ $(TAO_BUILDDIR)/tao/libTAO.la \
+ $(ACE_BUILDDIR)/ace/libACE.la
+
+nobase_include_HEADERS += \
+ CosTradingC.h \
+ CosTradingC.inl \
+ CosTradingDynamicC.h \
+ CosTradingDynamicC.inl \
+ CosTradingReposC.h \
+ CosTradingReposC.inl \
+ Trader/trading_export.h
+
+pkgconfig_DATA += \
+ TAO_CosTrading.pc
+
+CLEANFILES += \
+ TAO_CosTrading.pc
+
+TAO_CosTrading.pc: ${top_builddir}/config.status ${srcdir}/TAO_CosTrading.pc.in
+ ${top_builddir}/config.status --file $@:${srcdir}/TAO_CosTrading.pc.in
+
+EXTRA_DIST += \
+ CosTrading.rc \
+ TAO_CosTrading.pc.in
+
+
+## Makefile.CosTrading_Skel.am
+
+lib_LTLIBRARIES += libTAO_CosTrading_Skel.la
+
+libTAO_CosTrading_Skel_la_CPPFLAGS = \
+ -I$(ACE_ROOT) \
+ -I$(ACE_BUILDDIR) \
+ -I$(TAO_ROOT) \
+ -I$(TAO_BUILDDIR) \
+ -I$(TAO_ROOT)/orbsvcs \
+ -I$(TAO_BUILDDIR)/orbsvcs \
+ -DTAO_TRADING_SKEL_BUILD_DLL
+
+libTAO_CosTrading_Skel_la_SOURCES = \
+ CosTradingDynamicS.cpp \
+ CosTradingReposS.cpp \
+ CosTradingS.cpp
+
+libTAO_CosTrading_Skel_la_LDFLAGS = \
+ -version-number @TAO_MAJOR@:@TAO_MINOR@:@TAO_BETA@
+
+libTAO_CosTrading_Skel_la_LIBADD = \
+ $(TAO_BUILDDIR)/tao/libTAO_PortableServer.la \
+ libTAO_CosTrading.la \
+ $(TAO_BUILDDIR)/tao/libTAO_AnyTypeCode.la \
+ $(TAO_BUILDDIR)/tao/libTAO.la \
+ $(ACE_BUILDDIR)/ace/libACE.la
+
+nobase_include_HEADERS += \
+ CosTradingDynamicS.h \
+ CosTradingDynamicS.inl \
+ CosTradingDynamicS_T.cpp \
+ CosTradingDynamicS_T.h \
+ CosTradingDynamicS_T.inl \
+ CosTradingReposS.h \
+ CosTradingReposS.inl \
+ CosTradingReposS_T.cpp \
+ CosTradingReposS_T.h \
+ CosTradingReposS_T.inl \
+ CosTradingS.h \
+ CosTradingS.inl \
+ CosTradingS_T.cpp \
+ CosTradingS_T.h \
+ CosTradingS_T.inl \
+ Trader/trading_skel_export.h
+
+pkgconfig_DATA += \
+ TAO_CosTrading_Skel.pc
+
+CLEANFILES += \
+ TAO_CosTrading_Skel.pc
+
+TAO_CosTrading_Skel.pc: ${top_builddir}/config.status ${srcdir}/TAO_CosTrading_Skel.pc.in
+ ${top_builddir}/config.status --file $@:${srcdir}/TAO_CosTrading_Skel.pc.in
+
+EXTRA_DIST += \
+ CosTrading_Skel.rc \
+ TAO_CosTrading_Skel.pc.in
+
+
+## Makefile.CosTrading_Serv.am
+
+lib_LTLIBRARIES += libTAO_CosTrading_Serv.la
+
+libTAO_CosTrading_Serv_la_CPPFLAGS = \
+ -I$(ACE_ROOT) \
+ -I$(ACE_BUILDDIR) \
+ -I$(TAO_ROOT) \
+ -I$(TAO_BUILDDIR) \
+ -I$(TAO_ROOT)/orbsvcs \
+ -I$(TAO_BUILDDIR)/orbsvcs \
+ -DTAO_TRADING_SERV_BUILD_DLL
+
+libTAO_CosTrading_Serv_la_SOURCES = \
+ Trader/Constraint_Interpreter.cpp \
+ Trader/Constraint_Nodes.cpp \
+ Trader/Constraint_Visitors.cpp \
+ Trader/Constraint_l.cpp \
+ Trader/Constraint_y.cpp \
+ Trader/Interpreter.cpp \
+ Trader/Interpreter_Utils.cpp \
+ Trader/Offer_Database.cpp \
+ Trader/Offer_Iterators.cpp \
+ Trader/Service_Type_Repository.cpp \
+ Trader/Trader.cpp \
+ Trader/Trader_Constraint_Visitors.cpp \
+ Trader/Trader_Interfaces.cpp \
+ Trader/Trader_Utils.cpp \
+ Trader/Trading_Loader.cpp
+
+libTAO_CosTrading_Serv_la_LDFLAGS = \
+ -version-number @TAO_MAJOR@:@TAO_MINOR@:@TAO_BETA@
+
+libTAO_CosTrading_Serv_la_LIBADD = \
+ $(TAO_BUILDDIR)/tao/libTAO_IORTable.la \
+ $(TAO_BUILDDIR)/tao/libTAO_Utils.la \
+ $(TAO_BUILDDIR)/tao/libTAO_PI.la \
+ $(TAO_BUILDDIR)/tao/libTAO_CodecFactory.la \
+ libTAO_Svc_Utils.la \
+ $(TAO_BUILDDIR)/tao/libTAO_DynamicAny.la \
+ libTAO_CosTrading_Skel.la \
+ $(TAO_BUILDDIR)/tao/libTAO_PortableServer.la \
+ libTAO_CosTrading.la \
+ $(TAO_BUILDDIR)/tao/libTAO_AnyTypeCode.la \
+ $(TAO_BUILDDIR)/tao/libTAO.la \
+ $(ACE_BUILDDIR)/ace/libACE.la
+
+nobase_include_HEADERS += \
+ Trader/Constraint_Interpreter.h \
+ Trader/Constraint_Nodes.h \
+ Trader/Constraint_Visitors.h \
+ Trader/Interpreter.h \
+ Trader/Interpreter_Utils.h \
+ Trader/Interpreter_Utils_T.cpp \
+ Trader/Offer_Database.h \
+ Trader/Offer_Iterators.h \
+ Trader/Offer_Iterators_T.cpp \
+ Trader/Service_Type_Repository.h \
+ Trader/Trader.h \
+ Trader/Trader_Constraint_Visitors.h \
+ Trader/Trader_Interfaces.h \
+ Trader/Trader_T.cpp \
+ Trader/Trader_Utils.h \
+ Trader/Trading_Loader.h \
+ Trader/trading_serv_export.h
+
+pkgconfig_DATA += \
+ TAO_CosTrading_Serv.pc
+
+CLEANFILES += \
+ TAO_CosTrading_Serv.pc
+
+TAO_CosTrading_Serv.pc: ${top_builddir}/config.status ${srcdir}/TAO_CosTrading_Serv.pc.in
+ ${top_builddir}/config.status --file $@:${srcdir}/TAO_CosTrading_Serv.pc.in
+
+EXTRA_DIST += \
+ CosTrading_Serv.rc \
+ TAO_CosTrading_Serv.pc.in
+
+
+## Makefile.DsLogAdmin_IDL.am
+
+BUILT_SOURCES += \
+ DsLogAdminC.cpp \
+ DsLogAdminC.h \
+ DsLogAdminC.inl \
+ DsLogAdminS.cpp \
+ DsLogAdminS.h \
+ DsLogAdminS.inl \
+ DsLogAdminS_T.cpp \
+ DsLogAdminS_T.h \
+ DsLogAdminS_T.inl
+
+CLEANFILES += \
+ DsLogAdmin-stamp \
+ DsLogAdminC.cpp \
+ DsLogAdminC.h \
+ DsLogAdminC.inl \
+ DsLogAdminS.cpp \
+ DsLogAdminS.h \
+ DsLogAdminS.inl \
+ DsLogAdminS_T.cpp \
+ DsLogAdminS_T.h \
+ DsLogAdminS_T.inl
+
+DsLogAdminC.cpp DsLogAdminC.h DsLogAdminC.inl DsLogAdminS.cpp DsLogAdminS.h DsLogAdminS.inl DsLogAdminS_T.cpp DsLogAdminS_T.h DsLogAdminS_T.inl: DsLogAdmin-stamp
+
+DsLogAdmin-stamp: $(srcdir)/DsLogAdmin.idl $(TAO_IDL_DEP)
+ $(TAO_IDL) $(TAO_IDLFLAGS) -I$(TAO_ROOT)/orbsvcs -GT -Wb,versioning_begin=TAO_BEGIN_VERSIONED_NAMESPACE_DECL -Wb,versioning_end=TAO_END_VERSIONED_NAMESPACE_DECL -Wb,stub_export_macro=TAO_Log_Export -Wb,stub_export_include=orbsvcs/Log/log_export.h -Wb,skel_export_macro=TAO_Log_Skel_Export -Wb,skel_export_include=orbsvcs/Log/log_skel_export.h $(srcdir)/DsLogAdmin.idl
+ @touch $@
+
+BUILT_SOURCES += \
+ DsLogNotificationC.cpp \
+ DsLogNotificationC.h \
+ DsLogNotificationC.inl \
+ DsLogNotificationS.cpp \
+ DsLogNotificationS.h \
+ DsLogNotificationS.inl \
+ DsLogNotificationS_T.cpp \
+ DsLogNotificationS_T.h \
+ DsLogNotificationS_T.inl
+
+CLEANFILES += \
+ DsLogNotification-stamp \
+ DsLogNotificationC.cpp \
+ DsLogNotificationC.h \
+ DsLogNotificationC.inl \
+ DsLogNotificationS.cpp \
+ DsLogNotificationS.h \
+ DsLogNotificationS.inl \
+ DsLogNotificationS_T.cpp \
+ DsLogNotificationS_T.h \
+ DsLogNotificationS_T.inl
+
+DsLogNotificationC.cpp DsLogNotificationC.h DsLogNotificationC.inl DsLogNotificationS.cpp DsLogNotificationS.h DsLogNotificationS.inl DsLogNotificationS_T.cpp DsLogNotificationS_T.h DsLogNotificationS_T.inl: DsLogNotification-stamp
+
+DsLogNotification-stamp: $(srcdir)/DsLogNotification.idl $(TAO_IDL_DEP)
+ $(TAO_IDL) $(TAO_IDLFLAGS) -I$(TAO_ROOT)/orbsvcs -GT -Wb,versioning_begin=TAO_BEGIN_VERSIONED_NAMESPACE_DECL -Wb,versioning_end=TAO_END_VERSIONED_NAMESPACE_DECL -Wb,stub_export_macro=TAO_Log_Export -Wb,stub_export_include=orbsvcs/Log/log_export.h -Wb,skel_export_macro=TAO_Log_Skel_Export -Wb,skel_export_include=orbsvcs/Log/log_skel_export.h $(srcdir)/DsLogNotification.idl
+ @touch $@
+
+
+nobase_include_HEADERS += \
+ DsLogAdmin.idl \
+ DsLogNotification.idl
+
+## Makefile.DsLogAdmin.am
+
+lib_LTLIBRARIES += libTAO_DsLogAdmin.la
+
+libTAO_DsLogAdmin_la_CPPFLAGS = \
+ -I$(ACE_ROOT) \
+ -I$(ACE_BUILDDIR) \
+ -I$(TAO_ROOT) \
+ -I$(TAO_BUILDDIR) \
+ -I$(TAO_ROOT)/orbsvcs \
+ -I$(TAO_BUILDDIR)/orbsvcs \
+ -DTAO_LOG_BUILD_DLL
+
+libTAO_DsLogAdmin_la_SOURCES = \
+ DsLogAdminC.cpp \
+ DsLogNotificationC.cpp
+
+libTAO_DsLogAdmin_la_LDFLAGS = \
+ -version-number @TAO_MAJOR@:@TAO_MINOR@:@TAO_BETA@
+
+libTAO_DsLogAdmin_la_LIBADD = \
+ $(TAO_BUILDDIR)/tao/libTAO_AnyTypeCode.la \
+ $(TAO_BUILDDIR)/tao/libTAO.la \
+ $(ACE_BUILDDIR)/ace/libACE.la
+
+nobase_include_HEADERS += \
+ DsLogAdminC.h \
+ DsLogAdminC.inl \
+ DsLogNotificationC.h \
+ DsLogNotificationC.inl \
+ Log/log_export.h
+
+pkgconfig_DATA += \
+ TAO_DsLogAdmin.pc
+
+CLEANFILES += \
+ TAO_DsLogAdmin.pc
+
+TAO_DsLogAdmin.pc: ${top_builddir}/config.status ${srcdir}/TAO_DsLogAdmin.pc.in
+ ${top_builddir}/config.status --file $@:${srcdir}/TAO_DsLogAdmin.pc.in
+
+EXTRA_DIST += \
+ DsLogAdmin.rc \
+ TAO_DsLogAdmin.pc.in
+
+
+## Makefile.DsEventLogAdmin_IDL.am
+
+if !BUILD_MINIMUM_CORBA
+
+BUILT_SOURCES += \
+ DsEventLogAdminC.cpp \
+ DsEventLogAdminC.h \
+ DsEventLogAdminC.inl \
+ DsEventLogAdminS.cpp \
+ DsEventLogAdminS.h \
+ DsEventLogAdminS.inl \
+ DsEventLogAdminS_T.cpp \
+ DsEventLogAdminS_T.h \
+ DsEventLogAdminS_T.inl
+
+CLEANFILES += \
+ DsEventLogAdmin-stamp \
+ DsEventLogAdminC.cpp \
+ DsEventLogAdminC.h \
+ DsEventLogAdminC.inl \
+ DsEventLogAdminS.cpp \
+ DsEventLogAdminS.h \
+ DsEventLogAdminS.inl \
+ DsEventLogAdminS_T.cpp \
+ DsEventLogAdminS_T.h \
+ DsEventLogAdminS_T.inl
+
+DsEventLogAdminC.cpp DsEventLogAdminC.h DsEventLogAdminC.inl DsEventLogAdminS.cpp DsEventLogAdminS.h DsEventLogAdminS.inl DsEventLogAdminS_T.cpp DsEventLogAdminS_T.h DsEventLogAdminS_T.inl: DsEventLogAdmin-stamp
+
+DsEventLogAdmin-stamp: $(srcdir)/DsEventLogAdmin.idl $(TAO_IDL_DEP)
+ $(TAO_IDL) $(TAO_IDLFLAGS) -I$(TAO_ROOT)/orbsvcs -GT -Wb,versioning_begin=TAO_BEGIN_VERSIONED_NAMESPACE_DECL -Wb,versioning_end=TAO_END_VERSIONED_NAMESPACE_DECL -Wb,stub_export_macro=TAO_EventLog_Export -Wb,stub_export_include=orbsvcs/Log/eventlog_export.h -Wb,skel_export_macro=TAO_EventLog_Skel_Export -Wb,skel_export_include=orbsvcs/Log/eventlog_skel_export.h $(srcdir)/DsEventLogAdmin.idl
+ @touch $@
+
+
+nobase_include_HEADERS += \
+ DsEventLogAdmin.idl
+
+endif !BUILD_MINIMUM_CORBA
+
+## Makefile.DsEventLogAdmin.am
+
+if !BUILD_MINIMUM_CORBA
+
+lib_LTLIBRARIES += libTAO_DsEventLogAdmin.la
+
+libTAO_DsEventLogAdmin_la_CPPFLAGS = \
+ -I$(ACE_ROOT) \
+ -I$(ACE_BUILDDIR) \
+ -I$(TAO_ROOT) \
+ -I$(TAO_BUILDDIR) \
+ -I$(TAO_ROOT)/orbsvcs \
+ -I$(TAO_BUILDDIR)/orbsvcs \
+ -DTAO_HAS_TYPED_EVENT_CHANNEL \
+ -DTAO_EVENTLOG_BUILD_DLL
+
+libTAO_DsEventLogAdmin_la_SOURCES = \
+ DsEventLogAdminC.cpp
+
+libTAO_DsEventLogAdmin_la_LDFLAGS = \
+ -version-number @TAO_MAJOR@:@TAO_MINOR@:@TAO_BETA@
+
+libTAO_DsEventLogAdmin_la_LIBADD = \
+ libTAO_CosEvent.la \
+ libTAO_DsLogAdmin.la \
+ $(TAO_BUILDDIR)/tao/libTAO_AnyTypeCode.la \
+ $(TAO_BUILDDIR)/tao/libTAO.la \
+ $(ACE_BUILDDIR)/ace/libACE.la
+
+nobase_include_HEADERS += \
+ DsEventLogAdminC.h \
+ DsEventLogAdminC.inl \
+ Log/eventlog_export.h
+
+pkgconfig_DATA += \
+ TAO_DsEventLogAdmin.pc
+
+CLEANFILES += \
+ TAO_DsEventLogAdmin.pc
+
+TAO_DsEventLogAdmin.pc: ${top_builddir}/config.status ${srcdir}/TAO_DsEventLogAdmin.pc.in
+ ${top_builddir}/config.status --file $@:${srcdir}/TAO_DsEventLogAdmin.pc.in
+
+endif !BUILD_MINIMUM_CORBA
+
+EXTRA_DIST += \
+ DsEventLogAdmin.rc \
+ TAO_DsEventLogAdmin.pc.in
+
+
+## Makefile.DsLogAdmin_Skel.am
+
+lib_LTLIBRARIES += libTAO_DsLogAdmin_Skel.la
+
+libTAO_DsLogAdmin_Skel_la_CPPFLAGS = \
+ -I$(ACE_ROOT) \
+ -I$(ACE_BUILDDIR) \
+ -I$(TAO_ROOT) \
+ -I$(TAO_BUILDDIR) \
+ -I$(TAO_ROOT)/orbsvcs \
+ -I$(TAO_BUILDDIR)/orbsvcs \
+ -DTAO_LOG_SKEL_BUILD_DLL
+
+libTAO_DsLogAdmin_Skel_la_SOURCES = \
+ DsLogAdminS.cpp \
+ DsLogNotificationS.cpp
+
+libTAO_DsLogAdmin_Skel_la_LDFLAGS = \
+ -version-number @TAO_MAJOR@:@TAO_MINOR@:@TAO_BETA@
+
+libTAO_DsLogAdmin_Skel_la_LIBADD = \
+ $(TAO_BUILDDIR)/tao/libTAO_PortableServer.la \
+ libTAO_DsLogAdmin.la \
+ $(TAO_BUILDDIR)/tao/libTAO_AnyTypeCode.la \
+ $(TAO_BUILDDIR)/tao/libTAO.la \
+ $(ACE_BUILDDIR)/ace/libACE.la
+
+nobase_include_HEADERS += \
+ DsLogAdminS.h \
+ DsLogAdminS.inl \
+ DsLogAdminS_T.cpp \
+ DsLogAdminS_T.h \
+ DsLogAdminS_T.inl \
+ DsLogNotificationS.h \
+ DsLogNotificationS.inl \
+ DsLogNotificationS_T.cpp \
+ DsLogNotificationS_T.h \
+ DsLogNotificationS_T.inl \
+ Log/log_skel_export.h
+
+pkgconfig_DATA += \
+ TAO_DsLogAdmin_Skel.pc
+
+CLEANFILES += \
+ TAO_DsLogAdmin_Skel.pc
+
+TAO_DsLogAdmin_Skel.pc: ${top_builddir}/config.status ${srcdir}/TAO_DsLogAdmin_Skel.pc.in
+ ${top_builddir}/config.status --file $@:${srcdir}/TAO_DsLogAdmin_Skel.pc.in
+
+EXTRA_DIST += \
+ TAO_DsLogAdmin_Skel.pc.in
+
+
+## Makefile.DsLogAdmin_Serv.am
+
+lib_LTLIBRARIES += libTAO_DsLogAdmin_Serv.la
+
+libTAO_DsLogAdmin_Serv_la_CPPFLAGS = \
+ -I$(ACE_ROOT) \
+ -I$(ACE_BUILDDIR) \
+ -I$(TAO_ROOT) \
+ -I$(TAO_BUILDDIR) \
+ -I$(TAO_ROOT)/orbsvcs \
+ -I$(TAO_BUILDDIR)/orbsvcs \
+ -DTAO_LOG_SERV_BUILD_DLL
+
+libTAO_DsLogAdmin_Serv_la_SOURCES = \
+ Log/BasicLogFactory_i.cpp \
+ Log/BasicLog_i.cpp \
+ Log/Hash_Iterator_i.cpp \
+ Log/Hash_LogRecordStore.cpp \
+ Log/Hash_LogStore.cpp \
+ Log/Hash_Persistence_Strategy.cpp \
+ Log/Iterator_i.cpp \
+ Log/LogActivator.cpp \
+ Log/LogMgr_i.cpp \
+ Log/LogNotification.cpp \
+ Log/LogRecordStore.cpp \
+ Log/Log_Compaction_Handler.cpp \
+ Log/Log_Constraint_Interpreter.cpp \
+ Log/Log_Constraint_Visitors.cpp \
+ Log/Log_Flush_Handler.cpp \
+ Log/Log_i.cpp
+
+libTAO_DsLogAdmin_Serv_la_LDFLAGS = \
+ -version-number @TAO_MAJOR@:@TAO_MINOR@:@TAO_BETA@
+
+libTAO_DsLogAdmin_Serv_la_LIBADD = \
+ libTAO_Svc_Utils.la \
+ $(TAO_BUILDDIR)/tao/libTAO_Utils.la \
+ $(TAO_BUILDDIR)/tao/libTAO_PI.la \
+ $(TAO_BUILDDIR)/tao/libTAO_CodecFactory.la \
+ libTAO_ETCL.la \
+ $(TAO_BUILDDIR)/tao/libTAO_DynamicAny.la \
+ libTAO_DsLogAdmin_Skel.la \
+ $(TAO_BUILDDIR)/tao/libTAO_PortableServer.la \
+ libTAO_DsLogAdmin.la \
+ $(TAO_BUILDDIR)/tao/libTAO_AnyTypeCode.la \
+ $(TAO_BUILDDIR)/tao/libTAO.la \
+ $(ACE_BUILDDIR)/ace/libACE.la
+
+nobase_include_HEADERS += \
+ Log/BasicLogFactory_i.h \
+ Log/BasicLog_i.h \
+ Log/Hash_Iterator_i.h \
+ Log/Hash_LogRecordStore.h \
+ Log/Hash_LogStore.h \
+ Log/Hash_Persistence_Strategy.h \
+ Log/Iterator_i.h \
+ Log/LogActivator.h \
+ Log/LogMgr_i.h \
+ Log/LogNotification.h \
+ Log/LogRecordStore.h \
+ Log/LogStore.h \
+ Log/Log_Compaction_Handler.h \
+ Log/Log_Constraint_Interpreter.h \
+ Log/Log_Constraint_Visitors.h \
+ Log/Log_Flush_Handler.h \
+ Log/Log_Persistence_Strategy.h \
+ Log/Log_i.h \
+ Log/log_serv_export.h
+
+pkgconfig_DATA += \
+ TAO_DsLogAdmin_Serv.pc
+
+CLEANFILES += \
+ TAO_DsLogAdmin_Serv.pc
+
+TAO_DsLogAdmin_Serv.pc: ${top_builddir}/config.status ${srcdir}/TAO_DsLogAdmin_Serv.pc.in
+ ${top_builddir}/config.status --file $@:${srcdir}/TAO_DsLogAdmin_Serv.pc.in
+
+EXTRA_DIST += \
+ TAO_DsLogAdmin_Serv.pc.in
+
+
+## Makefile.DsEventLogAdmin_Skel.am
+
+if !BUILD_MINIMUM_CORBA
+
+lib_LTLIBRARIES += libTAO_DsEventLogAdmin_Skel.la
+
+libTAO_DsEventLogAdmin_Skel_la_CPPFLAGS = \
+ -I$(ACE_ROOT) \
+ -I$(ACE_BUILDDIR) \
+ -I$(TAO_ROOT) \
+ -I$(TAO_BUILDDIR) \
+ -I$(TAO_ROOT)/orbsvcs \
+ -I$(TAO_BUILDDIR)/orbsvcs \
+ -DTAO_HAS_TYPED_EVENT_CHANNEL \
+ -DTAO_EVENTLOG_SKEL_BUILD_DLL
+
+libTAO_DsEventLogAdmin_Skel_la_SOURCES = \
+ DsEventLogAdminS.cpp
+
+libTAO_DsEventLogAdmin_Skel_la_LDFLAGS = \
+ -version-number @TAO_MAJOR@:@TAO_MINOR@:@TAO_BETA@
+
+libTAO_DsEventLogAdmin_Skel_la_LIBADD = \
+ libTAO_CosEvent_Skel.la \
+ libTAO_DsLogAdmin_Skel.la \
+ $(TAO_BUILDDIR)/tao/libTAO_PortableServer.la \
+ libTAO_DsEventLogAdmin.la \
+ libTAO_CosEvent.la \
+ libTAO_DsLogAdmin.la \
+ $(TAO_BUILDDIR)/tao/libTAO_AnyTypeCode.la \
+ $(TAO_BUILDDIR)/tao/libTAO.la \
+ $(ACE_BUILDDIR)/ace/libACE.la
+
+nobase_include_HEADERS += \
+ DsEventLogAdminS.h \
+ DsEventLogAdminS.inl \
+ DsEventLogAdminS_T.cpp \
+ DsEventLogAdminS_T.h \
+ DsEventLogAdminS_T.inl \
+ Log/eventlog_skel_export.h
+
+pkgconfig_DATA += \
+ TAO_DsEventLogAdmin_Skel.pc
+
+CLEANFILES += \
+ TAO_DsEventLogAdmin_Skel.pc
+
+TAO_DsEventLogAdmin_Skel.pc: ${top_builddir}/config.status ${srcdir}/TAO_DsEventLogAdmin_Skel.pc.in
+ ${top_builddir}/config.status --file $@:${srcdir}/TAO_DsEventLogAdmin_Skel.pc.in
+
+endif !BUILD_MINIMUM_CORBA
+
+EXTRA_DIST += \
+ TAO_DsEventLogAdmin_Skel.pc.in
+
+
+## Makefile.DsEventLogAdmin_Serv.am
+
+if BUILD_CORBA_MESSAGING
+if !BUILD_MINIMUM_CORBA
+
+lib_LTLIBRARIES += libTAO_DsEventLogAdmin_Serv.la
+
+libTAO_DsEventLogAdmin_Serv_la_CPPFLAGS = \
+ -I$(ACE_ROOT) \
+ -I$(ACE_BUILDDIR) \
+ -I$(TAO_ROOT) \
+ -I$(TAO_BUILDDIR) \
+ -I$(TAO_ROOT)/orbsvcs \
+ -I$(TAO_BUILDDIR)/orbsvcs \
+ -DTAO_HAS_TYPED_EVENT_CHANNEL \
+ -DTAO_EVENTLOG_SERV_BUILD_DLL
+
+libTAO_DsEventLogAdmin_Serv_la_SOURCES = \
+ Log/EventLogConsumer.cpp \
+ Log/EventLogFactory_i.cpp \
+ Log/EventLogNotification.cpp \
+ Log/EventLog_i.cpp
+
+libTAO_DsEventLogAdmin_Serv_la_LDFLAGS = \
+ -version-number @TAO_MAJOR@:@TAO_MINOR@:@TAO_BETA@
+
+libTAO_DsEventLogAdmin_Serv_la_LIBADD = \
+ libTAO_CosEvent_Serv.la \
+ libTAO_CosNaming.la \
+ $(TAO_BUILDDIR)/tao/libTAO_IFR_Client.la \
+ $(TAO_BUILDDIR)/tao/libTAO_DynamicInterface.la \
+ $(TAO_BUILDDIR)/tao/libTAO_Messaging.la \
+ $(TAO_BUILDDIR)/tao/libTAO_Valuetype.la \
+ libTAO_DsLogAdmin_Serv.la \
+ $(TAO_BUILDDIR)/tao/libTAO_Utils.la \
+ $(TAO_BUILDDIR)/tao/libTAO_PI.la \
+ $(TAO_BUILDDIR)/tao/libTAO_CodecFactory.la \
+ libTAO_Svc_Utils.la \
+ libTAO_ETCL.la \
+ $(TAO_BUILDDIR)/tao/libTAO_DynamicAny.la \
+ libTAO_DsEventLogAdmin_Skel.la \
+ libTAO_CosEvent_Skel.la \
+ libTAO_DsLogAdmin_Skel.la \
+ $(TAO_BUILDDIR)/tao/libTAO_PortableServer.la \
+ libTAO_DsEventLogAdmin.la \
+ libTAO_CosEvent.la \
+ libTAO_DsLogAdmin.la \
+ $(TAO_BUILDDIR)/tao/libTAO_AnyTypeCode.la \
+ $(TAO_BUILDDIR)/tao/libTAO.la \
+ $(ACE_BUILDDIR)/ace/libACE.la
+
+nobase_include_HEADERS += \
+ Log/EventLogConsumer.h \
+ Log/EventLogFactory_i.h \
+ Log/EventLogNotification.h \
+ Log/EventLog_i.h \
+ Log/eventlog_serv_export.h
+
+pkgconfig_DATA += \
+ TAO_DsEventLogAdmin_Serv.pc
+
+CLEANFILES += \
+ TAO_DsEventLogAdmin_Serv.pc
+
+TAO_DsEventLogAdmin_Serv.pc: ${top_builddir}/config.status ${srcdir}/TAO_DsEventLogAdmin_Serv.pc.in
+ ${top_builddir}/config.status --file $@:${srcdir}/TAO_DsEventLogAdmin_Serv.pc.in
+
+endif !BUILD_MINIMUM_CORBA
+endif BUILD_CORBA_MESSAGING
+
+EXTRA_DIST += \
+ TAO_DsEventLogAdmin_Serv.pc.in
+
+
+## Makefile.DsNotifyLogAdmin_IDL.am
+
+if !BUILD_MINIMUM_CORBA
+
+BUILT_SOURCES += \
+ DsNotifyLogAdminC.cpp \
+ DsNotifyLogAdminC.h \
+ DsNotifyLogAdminC.inl \
+ DsNotifyLogAdminS.cpp \
+ DsNotifyLogAdminS.h \
+ DsNotifyLogAdminS.inl \
+ DsNotifyLogAdminS_T.cpp \
+ DsNotifyLogAdminS_T.h \
+ DsNotifyLogAdminS_T.inl
+
+CLEANFILES += \
+ DsNotifyLogAdmin-stamp \
+ DsNotifyLogAdminC.cpp \
+ DsNotifyLogAdminC.h \
+ DsNotifyLogAdminC.inl \
+ DsNotifyLogAdminS.cpp \
+ DsNotifyLogAdminS.h \
+ DsNotifyLogAdminS.inl \
+ DsNotifyLogAdminS_T.cpp \
+ DsNotifyLogAdminS_T.h \
+ DsNotifyLogAdminS_T.inl
+
+DsNotifyLogAdminC.cpp DsNotifyLogAdminC.h DsNotifyLogAdminC.inl DsNotifyLogAdminS.cpp DsNotifyLogAdminS.h DsNotifyLogAdminS.inl DsNotifyLogAdminS_T.cpp DsNotifyLogAdminS_T.h DsNotifyLogAdminS_T.inl: DsNotifyLogAdmin-stamp
+
+DsNotifyLogAdmin-stamp: $(srcdir)/DsNotifyLogAdmin.idl $(TAO_IDL_DEP)
+ $(TAO_IDL) $(TAO_IDLFLAGS) -I$(TAO_ROOT)/orbsvcs -GT -Wb,versioning_begin=TAO_BEGIN_VERSIONED_NAMESPACE_DECL -Wb,versioning_end=TAO_END_VERSIONED_NAMESPACE_DECL -Wb,stub_export_macro=TAO_NotifyLog_Export -Wb,stub_export_include=orbsvcs/Log/notifylog_export.h -Wb,skel_export_macro=TAO_NotifyLog_Skel_Export -Wb,skel_export_include=orbsvcs/Log/notifylog_skel_export.h $(srcdir)/DsNotifyLogAdmin.idl
+ @touch $@
+
+
+nobase_include_HEADERS += \
+ DsNotifyLogAdmin.idl
+
+endif !BUILD_MINIMUM_CORBA
+
+## Makefile.DsNotifyLogAdmin.am
+
+if !BUILD_MINIMUM_CORBA
+
+lib_LTLIBRARIES += libTAO_DsNotifyLogAdmin.la
+
+libTAO_DsNotifyLogAdmin_la_CPPFLAGS = \
+ -I$(ACE_ROOT) \
+ -I$(ACE_BUILDDIR) \
+ -I$(TAO_ROOT) \
+ -I$(TAO_BUILDDIR) \
+ -I$(TAO_ROOT)/orbsvcs \
+ -I$(TAO_BUILDDIR)/orbsvcs \
+ -DTAO_HAS_TYPED_EVENT_CHANNEL \
+ -DTAO_NOTIFYLOG_BUILD_DLL
+
+libTAO_DsNotifyLogAdmin_la_SOURCES = \
+ DsNotifyLogAdminC.cpp
+
+libTAO_DsNotifyLogAdmin_la_LDFLAGS = \
+ -version-number @TAO_MAJOR@:@TAO_MINOR@:@TAO_BETA@
+
+libTAO_DsNotifyLogAdmin_la_LIBADD = \
+ libTAO_CosNotification.la \
+ libTAO_DsEventLogAdmin.la \
+ libTAO_CosEvent.la \
+ libTAO_DsLogAdmin.la \
+ $(TAO_BUILDDIR)/tao/libTAO_AnyTypeCode.la \
+ $(TAO_BUILDDIR)/tao/libTAO.la \
+ $(ACE_BUILDDIR)/ace/libACE.la
+
+nobase_include_HEADERS += \
+ DsNotifyLogAdminC.h \
+ DsNotifyLogAdminC.inl \
+ Log/notifylog_export.h
+
+pkgconfig_DATA += \
+ TAO_DsNotifyLogAdmin.pc
+
+CLEANFILES += \
+ TAO_DsNotifyLogAdmin.pc
+
+TAO_DsNotifyLogAdmin.pc: ${top_builddir}/config.status ${srcdir}/TAO_DsNotifyLogAdmin.pc.in
+ ${top_builddir}/config.status --file $@:${srcdir}/TAO_DsNotifyLogAdmin.pc.in
+
+endif !BUILD_MINIMUM_CORBA
+
+EXTRA_DIST += \
+ DsNotifyLogAdmin.rc \
+ TAO_DsNotifyLogAdmin.pc.in
+
+
+## Makefile.DsNotifyLogAdmin_Skel.am
+
+if !BUILD_MINIMUM_CORBA
+
+lib_LTLIBRARIES += libTAO_DsNotifyLogAdmin_Skel.la
+
+libTAO_DsNotifyLogAdmin_Skel_la_CPPFLAGS = \
+ -I$(ACE_ROOT) \
+ -I$(ACE_BUILDDIR) \
+ -I$(TAO_ROOT) \
+ -I$(TAO_BUILDDIR) \
+ -I$(TAO_ROOT)/orbsvcs \
+ -I$(TAO_BUILDDIR)/orbsvcs \
+ -DTAO_HAS_TYPED_EVENT_CHANNEL \
+ -DTAO_NOTIFYLOG_SKEL_BUILD_DLL
+
+libTAO_DsNotifyLogAdmin_Skel_la_SOURCES = \
+ DsNotifyLogAdminS.cpp
+
+libTAO_DsNotifyLogAdmin_Skel_la_LDFLAGS = \
+ -version-number @TAO_MAJOR@:@TAO_MINOR@:@TAO_BETA@
+
+libTAO_DsNotifyLogAdmin_Skel_la_LIBADD = \
+ libTAO_CosNotification_Skel.la \
+ libTAO_DsEventLogAdmin_Skel.la \
+ libTAO_CosEvent_Skel.la \
+ libTAO_DsLogAdmin_Skel.la \
+ $(TAO_BUILDDIR)/tao/libTAO_PortableServer.la \
+ libTAO_DsNotifyLogAdmin.la \
+ libTAO_CosNotification.la \
+ libTAO_DsEventLogAdmin.la \
+ libTAO_CosEvent.la \
+ libTAO_DsLogAdmin.la \
+ $(TAO_BUILDDIR)/tao/libTAO_AnyTypeCode.la \
+ $(TAO_BUILDDIR)/tao/libTAO.la \
+ $(ACE_BUILDDIR)/ace/libACE.la
+
+nobase_include_HEADERS += \
+ DsNotifyLogAdminS.h \
+ DsNotifyLogAdminS.inl \
+ DsNotifyLogAdminS_T.cpp \
+ DsNotifyLogAdminS_T.h \
+ DsNotifyLogAdminS_T.inl \
+ Log/notifylog_skel_export.h
+
+pkgconfig_DATA += \
+ TAO_DsNotifyLogAdmin_Skel.pc
+
+CLEANFILES += \
+ TAO_DsNotifyLogAdmin_Skel.pc
+
+TAO_DsNotifyLogAdmin_Skel.pc: ${top_builddir}/config.status ${srcdir}/TAO_DsNotifyLogAdmin_Skel.pc.in
+ ${top_builddir}/config.status --file $@:${srcdir}/TAO_DsNotifyLogAdmin_Skel.pc.in
+
+endif !BUILD_MINIMUM_CORBA
+
+EXTRA_DIST += \
+ TAO_DsNotifyLogAdmin_Skel.pc.in
+
+
+## Makefile.DsNotifyLogAdmin_Serv.am
+
+if !BUILD_MINIMUM_CORBA
+
+lib_LTLIBRARIES += libTAO_DsNotifyLogAdmin_Serv.la
+
+libTAO_DsNotifyLogAdmin_Serv_la_CPPFLAGS = \
+ -I$(ACE_ROOT) \
+ -I$(ACE_BUILDDIR) \
+ -I$(TAO_ROOT) \
+ -I$(TAO_BUILDDIR) \
+ -I$(TAO_ROOT)/orbsvcs \
+ -I$(TAO_BUILDDIR)/orbsvcs \
+ -DTAO_HAS_TYPED_EVENT_CHANNEL \
+ -DTAO_NOTIFYLOG_SERV_BUILD_DLL
+
+libTAO_DsNotifyLogAdmin_Serv_la_SOURCES = \
+ Log/NotifyLogConsumer.cpp \
+ Log/NotifyLogFactory_i.cpp \
+ Log/NotifyLogNotification.cpp \
+ Log/NotifyLog_i.cpp
+
+libTAO_DsNotifyLogAdmin_Serv_la_LDFLAGS = \
+ -version-number @TAO_MAJOR@:@TAO_MINOR@:@TAO_BETA@
+
+libTAO_DsNotifyLogAdmin_Serv_la_LIBADD = \
+ libTAO_DsLogAdmin_Serv.la \
+ $(TAO_BUILDDIR)/tao/libTAO_Utils.la \
+ $(TAO_BUILDDIR)/tao/libTAO_PI.la \
+ $(TAO_BUILDDIR)/tao/libTAO_CodecFactory.la \
+ libTAO_Svc_Utils.la \
+ libTAO_ETCL.la \
+ $(TAO_BUILDDIR)/tao/libTAO_DynamicAny.la \
+ libTAO_DsNotifyLogAdmin_Skel.la \
+ libTAO_CosNotification_Skel.la \
+ libTAO_DsEventLogAdmin_Skel.la \
+ libTAO_CosEvent_Skel.la \
+ libTAO_DsLogAdmin_Skel.la \
+ $(TAO_BUILDDIR)/tao/libTAO_PortableServer.la \
+ libTAO_DsNotifyLogAdmin.la \
+ libTAO_CosNotification.la \
+ libTAO_DsEventLogAdmin.la \
+ libTAO_CosEvent.la \
+ libTAO_DsLogAdmin.la \
+ $(TAO_BUILDDIR)/tao/libTAO_AnyTypeCode.la \
+ $(TAO_BUILDDIR)/tao/libTAO.la \
+ $(ACE_BUILDDIR)/ace/libACE.la
+
+nobase_include_HEADERS += \
+ Log/NotifyLogConsumer.h \
+ Log/NotifyLogFactory_i.h \
+ Log/NotifyLogNotification.h \
+ Log/NotifyLog_i.h \
+ Log/notifylog_serv_export.h
+
+pkgconfig_DATA += \
+ TAO_DsNotifyLogAdmin_Serv.pc
+
+CLEANFILES += \
+ TAO_DsNotifyLogAdmin_Serv.pc
+
+TAO_DsNotifyLogAdmin_Serv.pc: ${top_builddir}/config.status ${srcdir}/TAO_DsNotifyLogAdmin_Serv.pc.in
+ ${top_builddir}/config.status --file $@:${srcdir}/TAO_DsNotifyLogAdmin_Serv.pc.in
+
+endif !BUILD_MINIMUM_CORBA
+
+EXTRA_DIST += \
+ TAO_DsNotifyLogAdmin_Serv.pc.in
+
+
+## Makefile.ESF.am
+
+
+nobase_include_HEADERS += \
+ ESF/ESF_Busy_Lock.cpp \
+ ESF/ESF_Busy_Lock.h \
+ ESF/ESF_Busy_Lock.i \
+ ESF/ESF_Copy_On_Read.cpp \
+ ESF/ESF_Copy_On_Read.h \
+ ESF/ESF_Copy_On_Write.cpp \
+ ESF/ESF_Copy_On_Write.h \
+ ESF/ESF_Copy_On_Write.i \
+ ESF/ESF_Defaults.h \
+ ESF/ESF_Delayed_Changes.cpp \
+ ESF/ESF_Delayed_Changes.h \
+ ESF/ESF_Delayed_Changes.i \
+ ESF/ESF_Delayed_Command.cpp \
+ ESF/ESF_Delayed_Command.h \
+ ESF/ESF_Delayed_Command.i \
+ ESF/ESF_Immediate_Changes.cpp \
+ ESF/ESF_Immediate_Changes.h \
+ ESF/ESF_Immediate_Changes.i \
+ ESF/ESF_Peer_Admin.cpp \
+ ESF/ESF_Peer_Admin.h \
+ ESF/ESF_Peer_Workers.cpp \
+ ESF/ESF_Peer_Workers.h \
+ ESF/ESF_Peer_Workers.i \
+ ESF/ESF_Proxy_Admin.cpp \
+ ESF/ESF_Proxy_Admin.h \
+ ESF/ESF_Proxy_Admin.i \
+ ESF/ESF_Proxy_Collection.cpp \
+ ESF/ESF_Proxy_Collection.h \
+ ESF/ESF_Proxy_List.cpp \
+ ESF/ESF_Proxy_List.h \
+ ESF/ESF_Proxy_List.i \
+ ESF/ESF_Proxy_RB_Tree.cpp \
+ ESF/ESF_Proxy_RB_Tree.h \
+ ESF/ESF_Proxy_RB_Tree.i \
+ ESF/ESF_Proxy_RefCount_Guard.cpp \
+ ESF/ESF_Proxy_RefCount_Guard.h \
+ ESF/ESF_Proxy_RefCount_Guard.i \
+ ESF/ESF_RefCount_Guard.cpp \
+ ESF/ESF_RefCount_Guard.h \
+ ESF/ESF_RefCount_Guard.i \
+ ESF/ESF_Shutdown_Proxy.cpp \
+ ESF/ESF_Shutdown_Proxy.h \
+ ESF/ESF_Shutdown_Proxy.i \
+ ESF/ESF_Worker.cpp \
+ ESF/ESF_Worker.h \
+ ESF/esf_export.h
+
+## Makefile.FTORB_Utils.am
+
+if BUILD_CORBA_MESSAGING
+if !BUILD_MINIMUM_CORBA
+
+BUILT_SOURCES += \
+ FT_CORBA_ORBC.cpp \
+ FT_CORBA_ORBC.h \
+ FT_CORBA_ORBC.inl \
+ FT_CORBA_ORBS.cpp \
+ FT_CORBA_ORBS.h \
+ FT_CORBA_ORBS.inl \
+ FT_CORBA_ORBS_T.cpp \
+ FT_CORBA_ORBS_T.h \
+ FT_CORBA_ORBS_T.inl
+
+CLEANFILES += \
+ FT_CORBA_ORB-stamp \
+ FT_CORBA_ORBC.cpp \
+ FT_CORBA_ORBC.h \
+ FT_CORBA_ORBC.inl \
+ FT_CORBA_ORBS.cpp \
+ FT_CORBA_ORBS.h \
+ FT_CORBA_ORBS.inl \
+ FT_CORBA_ORBS_T.cpp \
+ FT_CORBA_ORBS_T.h \
+ FT_CORBA_ORBS_T.inl
+
+FT_CORBA_ORBC.cpp FT_CORBA_ORBC.h FT_CORBA_ORBC.inl FT_CORBA_ORBS.cpp FT_CORBA_ORBS.h FT_CORBA_ORBS.inl FT_CORBA_ORBS_T.cpp FT_CORBA_ORBS_T.h FT_CORBA_ORBS_T.inl: FT_CORBA_ORB-stamp
+
+FT_CORBA_ORB-stamp: $(srcdir)/FT_CORBA_ORB.idl $(TAO_IDL_DEP)
+ $(TAO_IDL) $(TAO_IDLFLAGS) -I$(TAO_ROOT)/orbsvcs -GT -Wb,versioning_begin=TAO_BEGIN_VERSIONED_NAMESPACE_DECL -Wb,versioning_end=TAO_END_VERSIONED_NAMESPACE_DECL -Wb,skel_export_include=tao/PortableServer/PolicyS.h -Wb,export_macro=TAO_FT_ORB_Utils_Export -Wb,export_include=orbsvcs/FaultTolerance/FT_ORB_Utils_export.h $(srcdir)/FT_CORBA_ORB.idl
+ @touch $@
+
+lib_LTLIBRARIES += libTAO_FTORB_Utils.la
+
+libTAO_FTORB_Utils_la_CPPFLAGS = \
+ -I$(ACE_ROOT) \
+ -I$(ACE_BUILDDIR) \
+ -I$(TAO_ROOT) \
+ -I$(TAO_BUILDDIR) \
+ -I$(TAO_ROOT)/orbsvcs \
+ -I$(TAO_BUILDDIR)/orbsvcs \
+ -DTAO_FT_ORB_UTILS_BUILD_DLL
+
+libTAO_FTORB_Utils_la_SOURCES = \
+ FT_CORBA_ORBC.cpp \
+ FT_CORBA_ORBS.cpp \
+ FaultTolerance/FT_IOGR_Property.cpp
+
+libTAO_FTORB_Utils_la_LDFLAGS = \
+ -version-number @TAO_MAJOR@:@TAO_MINOR@:@TAO_BETA@
+
+libTAO_FTORB_Utils_la_LIBADD = \
+ libTAO_PortableGroup.la \
+ $(TAO_BUILDDIR)/tao/libTAO_Messaging.la \
+ $(TAO_BUILDDIR)/tao/libTAO_PI.la \
+ $(TAO_BUILDDIR)/tao/libTAO_CodecFactory.la \
+ $(TAO_BUILDDIR)/tao/libTAO_Valuetype.la \
+ libTAO_CosNaming.la \
+ $(TAO_BUILDDIR)/tao/libTAO_PortableServer.la \
+ $(TAO_BUILDDIR)/tao/libTAO_IORManip.la \
+ $(TAO_BUILDDIR)/tao/libTAO_AnyTypeCode.la \
+ $(TAO_BUILDDIR)/tao/libTAO.la \
+ $(ACE_BUILDDIR)/ace/libACE.la
+
+nobase_include_HEADERS += \
+ FT_CORBA_ORB.idl \
+ FT_CORBA_ORBC.h \
+ FT_CORBA_ORBC.inl \
+ FT_CORBA_ORBS.h \
+ FT_CORBA_ORBS.inl \
+ FT_CORBA_ORBS_T.cpp \
+ FT_CORBA_ORBS_T.h \
+ FT_CORBA_ORBS_T.inl \
+ FaultTolerance/FT_IOGR_Property.h \
+ FaultTolerance/FT_IOGR_Property.inl \
+ FaultTolerance/FT_ORB_Utils_export.h
+
+pkgconfig_DATA += \
+ TAO_FTORB_Utils.pc
+
+CLEANFILES += \
+ TAO_FTORB_Utils.pc
+
+TAO_FTORB_Utils.pc: ${top_builddir}/config.status ${srcdir}/TAO_FTORB_Utils.pc.in
+ ${top_builddir}/config.status --file $@:${srcdir}/TAO_FTORB_Utils.pc.in
+
+endif !BUILD_MINIMUM_CORBA
+endif BUILD_CORBA_MESSAGING
+
+EXTRA_DIST += \
+ TAO_FTORB_Utils.pc.in
+
+
+## Makefile.FTRT_ClientORB.am
+
+if BUILD_CORBA_MESSAGING
+
+lib_LTLIBRARIES += libTAO_FTRT_ClientORB.la
+
+libTAO_FTRT_ClientORB_la_CPPFLAGS = \
+ -I$(ACE_ROOT) \
+ -I$(ACE_BUILDDIR) \
+ -I$(TAO_ROOT) \
+ -I$(TAO_BUILDDIR) \
+ -I$(TAO_ROOT)/orbsvcs \
+ -I$(TAO_BUILDDIR)/orbsvcs \
+ -DTAO_FTRT_BUILD_DLL
+
+libTAO_FTRT_ClientORB_la_SOURCES = \
+ FtRtEvent/ClientORB/FTRT_ClientORB_Initializer.cpp \
+ FtRtEvent/ClientORB/FTRT_ClientORB_Interceptor.cpp \
+ FtRtEvent/ClientORB/FTRT_ClientORB_Loader.cpp
+
+libTAO_FTRT_ClientORB_la_LDFLAGS = \
+ -version-number @TAO_MAJOR@:@TAO_MINOR@:@TAO_BETA@
+
+libTAO_FTRT_ClientORB_la_LIBADD = \
+ $(TAO_BUILDDIR)/tao/libTAO_Messaging.la \
+ $(TAO_BUILDDIR)/tao/libTAO_PI.la \
+ $(TAO_BUILDDIR)/tao/libTAO_CodecFactory.la \
+ $(TAO_BUILDDIR)/tao/libTAO_PortableServer.la \
+ $(TAO_BUILDDIR)/tao/libTAO_Valuetype.la \
+ $(TAO_BUILDDIR)/tao/libTAO_AnyTypeCode.la \
+ $(TAO_BUILDDIR)/tao/libTAO.la \
+ $(ACE_BUILDDIR)/ace/libACE.la
+
+nobase_include_HEADERS += \
+ FtRtEvent/ClientORB/FTRT_ClientORB_Initializer.h \
+ FtRtEvent/ClientORB/FTRT_ClientORB_Interceptor.h \
+ FtRtEvent/ClientORB/FTRT_ClientORB_Loader.h
+
+endif BUILD_CORBA_MESSAGING
+
+## Makefile.RTEvent.am
+
+BUILT_SOURCES += \
+ RtecDefaultEventDataC.cpp \
+ RtecDefaultEventDataC.h \
+ RtecDefaultEventDataC.inl \
+ RtecDefaultEventDataS_T.cpp
+
+CLEANFILES += \
+ RtecDefaultEventData-stamp \
+ RtecDefaultEventDataC.cpp \
+ RtecDefaultEventDataC.h \
+ RtecDefaultEventDataC.inl \
+ RtecDefaultEventDataS_T.cpp
+
+RtecDefaultEventDataC.cpp RtecDefaultEventDataC.h RtecDefaultEventDataC.inl RtecDefaultEventDataS_T.cpp: RtecDefaultEventData-stamp
+
+RtecDefaultEventData-stamp: $(srcdir)/RtecDefaultEventData.idl $(TAO_IDL_DEP)
+ $(TAO_IDL) $(TAO_IDLFLAGS) -I$(TAO_ROOT)/orbsvcs -GT -Wb,versioning_begin=TAO_BEGIN_VERSIONED_NAMESPACE_DECL -Wb,versioning_end=TAO_END_VERSIONED_NAMESPACE_DECL -Wb,stub_export_macro=TAO_RTEvent_Export -Wb,stub_export_include=orbsvcs/Event/event_export.h -Wb,skel_export_macro=TAO_RTEvent_Skel_Export -Wb,skel_export_include=orbsvcs/Event/event_skel_export.h $(srcdir)/RtecDefaultEventData.idl
+ @touch $@
+
+BUILT_SOURCES += \
+ RtecEventCommC.cpp \
+ RtecEventCommC.h \
+ RtecEventCommC.inl \
+ RtecEventCommS_T.cpp
+
+CLEANFILES += \
+ RtecEventComm-stamp \
+ RtecEventCommC.cpp \
+ RtecEventCommC.h \
+ RtecEventCommC.inl \
+ RtecEventCommS_T.cpp
+
+RtecEventCommC.cpp RtecEventCommC.h RtecEventCommC.inl RtecEventCommS_T.cpp: RtecEventComm-stamp
+
+RtecEventComm-stamp: $(srcdir)/RtecEventComm.idl $(TAO_IDL_DEP)
+ $(TAO_IDL) $(TAO_IDLFLAGS) -I$(TAO_ROOT)/orbsvcs -GT -Wb,versioning_begin=TAO_BEGIN_VERSIONED_NAMESPACE_DECL -Wb,versioning_end=TAO_END_VERSIONED_NAMESPACE_DECL -Wb,stub_export_macro=TAO_RTEvent_Export -Wb,stub_export_include=orbsvcs/Event/event_export.h -Wb,skel_export_macro=TAO_RTEvent_Skel_Export -Wb,skel_export_include=orbsvcs/Event/event_skel_export.h $(srcdir)/RtecEventComm.idl
+ @touch $@
+
+BUILT_SOURCES += \
+ RtecEventChannelAdminC.cpp \
+ RtecEventChannelAdminC.h \
+ RtecEventChannelAdminC.inl \
+ RtecEventChannelAdminS_T.cpp
+
+CLEANFILES += \
+ RtecEventChannelAdmin-stamp \
+ RtecEventChannelAdminC.cpp \
+ RtecEventChannelAdminC.h \
+ RtecEventChannelAdminC.inl \
+ RtecEventChannelAdminS_T.cpp
+
+RtecEventChannelAdminC.cpp RtecEventChannelAdminC.h RtecEventChannelAdminC.inl RtecEventChannelAdminS_T.cpp: RtecEventChannelAdmin-stamp
+
+RtecEventChannelAdmin-stamp: $(srcdir)/RtecEventChannelAdmin.idl $(TAO_IDL_DEP)
+ $(TAO_IDL) $(TAO_IDLFLAGS) -I$(TAO_ROOT)/orbsvcs -GT -Wb,versioning_begin=TAO_BEGIN_VERSIONED_NAMESPACE_DECL -Wb,versioning_end=TAO_END_VERSIONED_NAMESPACE_DECL -Wb,stub_export_macro=TAO_RTEvent_Export -Wb,stub_export_include=orbsvcs/Event/event_export.h -Wb,skel_export_macro=TAO_RTEvent_Skel_Export -Wb,skel_export_include=orbsvcs/Event/event_skel_export.h $(srcdir)/RtecEventChannelAdmin.idl
+ @touch $@
+
+BUILT_SOURCES += \
+ RtecUDPAdminC.cpp \
+ RtecUDPAdminC.h \
+ RtecUDPAdminC.inl \
+ RtecUDPAdminS_T.cpp
+
+CLEANFILES += \
+ RtecUDPAdmin-stamp \
+ RtecUDPAdminC.cpp \
+ RtecUDPAdminC.h \
+ RtecUDPAdminC.inl \
+ RtecUDPAdminS_T.cpp
+
+RtecUDPAdminC.cpp RtecUDPAdminC.h RtecUDPAdminC.inl RtecUDPAdminS_T.cpp: RtecUDPAdmin-stamp
+
+RtecUDPAdmin-stamp: $(srcdir)/RtecUDPAdmin.idl $(TAO_IDL_DEP)
+ $(TAO_IDL) $(TAO_IDLFLAGS) -I$(TAO_ROOT)/orbsvcs -GT -Wb,versioning_begin=TAO_BEGIN_VERSIONED_NAMESPACE_DECL -Wb,versioning_end=TAO_END_VERSIONED_NAMESPACE_DECL -Wb,stub_export_macro=TAO_RTEvent_Export -Wb,stub_export_include=orbsvcs/Event/event_export.h -Wb,skel_export_macro=TAO_RTEvent_Skel_Export -Wb,skel_export_include=orbsvcs/Event/event_skel_export.h $(srcdir)/RtecUDPAdmin.idl
+ @touch $@
+
+lib_LTLIBRARIES += libTAO_RTEvent.la
+
+libTAO_RTEvent_la_CPPFLAGS = \
+ -I$(ACE_ROOT) \
+ -I$(ACE_BUILDDIR) \
+ -I$(TAO_ROOT) \
+ -I$(TAO_BUILDDIR) \
+ -I$(TAO_ROOT)/orbsvcs \
+ -I$(TAO_BUILDDIR)/orbsvcs \
+ -DTAO_RTEVENT_BUILD_DLL
+
+libTAO_RTEvent_la_SOURCES = \
+ Event_Utilities.cpp \
+ RtecDefaultEventDataC.cpp \
+ RtecEventChannelAdminC.cpp \
+ RtecEventCommC.cpp \
+ RtecUDPAdminC.cpp
+
+libTAO_RTEvent_la_LDFLAGS = \
+ -version-number @TAO_MAJOR@:@TAO_MINOR@:@TAO_BETA@
+
+libTAO_RTEvent_la_LIBADD = \
+ libTAO_Svc_Utils.la \
+ $(TAO_BUILDDIR)/tao/libTAO_PortableServer.la \
+ $(TAO_BUILDDIR)/tao/libTAO_AnyTypeCode.la \
+ $(TAO_BUILDDIR)/tao/libTAO.la \
+ $(ACE_BUILDDIR)/ace/libACE.la
+
+nobase_include_HEADERS += \
+ Event/event_export.h \
+ Event/event_skel_export.h \
+ Event_Utilities.h \
+ Event_Utilities.i \
+ RtecDefaultEventData.idl \
+ RtecDefaultEventDataC.h \
+ RtecDefaultEventDataC.inl \
+ RtecEventChannelAdmin.idl \
+ RtecEventChannelAdminC.h \
+ RtecEventChannelAdminC.inl \
+ RtecEventComm.idl \
+ RtecEventCommC.h \
+ RtecEventCommC.inl \
+ RtecUDPAdmin.idl \
+ RtecUDPAdminC.h \
+ RtecUDPAdminC.inl
+
+pkgconfig_DATA += \
+ TAO_RTEvent.pc
+
+CLEANFILES += \
+ TAO_RTEvent.pc
+
+TAO_RTEvent.pc: ${top_builddir}/config.status ${srcdir}/TAO_RTEvent.pc.in
+ ${top_builddir}/config.status --file $@:${srcdir}/TAO_RTEvent.pc.in
+
+EXTRA_DIST += \
+ RTEvent.rc \
+ TAO_RTEvent.pc.in
+
+
+## Makefile.RTEvent_Skel.am
+
+if BUILD_CORBA_MESSAGING
+
+lib_LTLIBRARIES += libTAO_RTEvent_Skel.la
+
+libTAO_RTEvent_Skel_la_CPPFLAGS = \
+ -I$(ACE_ROOT) \
+ -I$(ACE_BUILDDIR) \
+ -I$(TAO_ROOT) \
+ -I$(TAO_BUILDDIR) \
+ -I$(TAO_ROOT)/orbsvcs \
+ -I$(TAO_BUILDDIR)/orbsvcs \
+ -DTAO_RTEVENT_SKEL_BUILD_DLL
+
+libTAO_RTEvent_Skel_la_SOURCES = \
+ RtecDefaultEventDataS.cpp \
+ RtecEventChannelAdminS.cpp \
+ RtecEventCommS.cpp \
+ RtecUDPAdminS.cpp
+
+libTAO_RTEvent_Skel_la_LDFLAGS = \
+ -version-number @TAO_MAJOR@:@TAO_MINOR@:@TAO_BETA@
+
+libTAO_RTEvent_Skel_la_LIBADD = \
+ libTAO_RTEvent.la \
+ libTAO_Svc_Utils.la \
+ $(TAO_BUILDDIR)/tao/libTAO_Messaging.la \
+ $(TAO_BUILDDIR)/tao/libTAO_PI.la \
+ $(TAO_BUILDDIR)/tao/libTAO_CodecFactory.la \
+ $(TAO_BUILDDIR)/tao/libTAO_PortableServer.la \
+ $(TAO_BUILDDIR)/tao/libTAO_Valuetype.la \
+ $(TAO_BUILDDIR)/tao/libTAO_AnyTypeCode.la \
+ $(TAO_BUILDDIR)/tao/libTAO.la \
+ $(ACE_BUILDDIR)/ace/libACE.la
+
+nobase_include_HEADERS += \
+ Event/event_skel_export.h \
+ RtecDefaultEventDataS.h \
+ RtecDefaultEventDataS.inl \
+ RtecEventChannelAdminS.h \
+ RtecEventChannelAdminS.inl \
+ RtecEventCommS.h \
+ RtecEventCommS.inl \
+ RtecUDPAdminS.h \
+ RtecUDPAdminS.inl
+
+pkgconfig_DATA += \
+ TAO_RTEvent_Skel.pc
+
+CLEANFILES += \
+ TAO_RTEvent_Skel.pc
+
+TAO_RTEvent_Skel.pc: ${top_builddir}/config.status ${srcdir}/TAO_RTEvent_Skel.pc.in
+ ${top_builddir}/config.status --file $@:${srcdir}/TAO_RTEvent_Skel.pc.in
+
+endif BUILD_CORBA_MESSAGING
+
+EXTRA_DIST += \
+ RTEvent_Skel.rc \
+ TAO_RTEvent_Skel.pc.in
+
+
+## Makefile.RTEvent_Serv.am
+
+if BUILD_CORBA_MESSAGING
+if !BUILD_ACE_FOR_TAO
+
+lib_LTLIBRARIES += libTAO_RTEvent_Serv.la
+
+libTAO_RTEvent_Serv_la_CPPFLAGS = \
+ -I$(ACE_ROOT) \
+ -I$(ACE_BUILDDIR) \
+ -I$(TAO_ROOT) \
+ -I$(TAO_BUILDDIR) \
+ -I$(TAO_ROOT)/orbsvcs \
+ -I$(TAO_BUILDDIR)/orbsvcs \
+ -DTAO_RTEVENT_SERV_BUILD_DLL
+
+libTAO_RTEvent_Serv_la_SOURCES = \
+ Event/ECG_Adapters.cpp \
+ Event/ECG_CDR_Message_Receiver.cpp \
+ Event/ECG_CDR_Message_Sender.cpp \
+ Event/ECG_Complex_Address_Server.cpp \
+ Event/ECG_ConsumerEC_Control.cpp \
+ Event/ECG_Mcast_EH.cpp \
+ Event/ECG_Mcast_Gateway.cpp \
+ Event/ECG_Reactive_ConsumerEC_Control.cpp \
+ Event/ECG_Reconnect_ConsumerEC_Control.cpp \
+ Event/ECG_Simple_Address_Server.cpp \
+ Event/ECG_Simple_Mcast_EH.cpp \
+ Event/ECG_UDP_EH.cpp \
+ Event/ECG_UDP_Out_Endpoint.cpp \
+ Event/ECG_UDP_Receiver.cpp \
+ Event/ECG_UDP_Sender.cpp \
+ Event/EC_And_Filter.cpp \
+ Event/EC_Basic_Factory.cpp \
+ Event/EC_Basic_Filter_Builder.cpp \
+ Event/EC_Bitmask_Filter.cpp \
+ Event/EC_Channel_Destroyer.cpp \
+ Event/EC_Conjunction_Filter.cpp \
+ Event/EC_ConsumerAdmin.cpp \
+ Event/EC_ConsumerControl.cpp \
+ Event/EC_Default_Factory.cpp \
+ Event/EC_Default_ProxyConsumer.cpp \
+ Event/EC_Default_ProxySupplier.cpp \
+ Event/EC_Disjunction_Filter.cpp \
+ Event/EC_Dispatching.cpp \
+ Event/EC_Dispatching_Task.cpp \
+ Event/EC_Event_Channel.cpp \
+ Event/EC_Event_Channel_Base.cpp \
+ Event/EC_Factory.cpp \
+ Event/EC_Filter.cpp \
+ Event/EC_Filter_Builder.cpp \
+ Event/EC_Gateway.cpp \
+ Event/EC_Gateway_IIOP.cpp \
+ Event/EC_Gateway_IIOP_Factory.cpp \
+ Event/EC_Group_Scheduling.cpp \
+ Event/EC_Lifetime_Utils.cpp \
+ Event/EC_MT_Dispatching.cpp \
+ Event/EC_Masked_Type_Filter.cpp \
+ Event/EC_Negation_Filter.cpp \
+ Event/EC_Null_Factory.cpp \
+ Event/EC_Null_Scheduling.cpp \
+ Event/EC_ObserverStrategy.cpp \
+ Event/EC_Per_Supplier_Filter.cpp \
+ Event/EC_Prefix_Filter_Builder.cpp \
+ Event/EC_ProxyConsumer.cpp \
+ Event/EC_ProxySupplier.cpp \
+ Event/EC_Proxy_Disconnector.cpp \
+ Event/EC_QOS_Info.cpp \
+ Event/EC_Reactive_ConsumerControl.cpp \
+ Event/EC_Reactive_Dispatching.cpp \
+ Event/EC_Reactive_SupplierControl.cpp \
+ Event/EC_Reactive_Timeout_Generator.cpp \
+ Event/EC_Scheduling_Strategy.cpp \
+ Event/EC_SupplierAdmin.cpp \
+ Event/EC_SupplierControl.cpp \
+ Event/EC_Supplier_Filter.cpp \
+ Event/EC_Supplier_Filter_Builder.cpp \
+ Event/EC_TPC_Dispatching.cpp \
+ Event/EC_TPC_Dispatching_Task.cpp \
+ Event/EC_TPC_Factory.cpp \
+ Event/EC_TPC_ProxyConsumer.cpp \
+ Event/EC_TPC_ProxySupplier.cpp \
+ Event/EC_Timeout_Filter.cpp \
+ Event/EC_Timeout_Generator.cpp \
+ Event/EC_Trivial_Supplier_Filter.cpp \
+ Event/EC_Type_Filter.cpp \
+ Event/EC_UDP_Admin.cpp
+
+libTAO_RTEvent_Serv_la_LDFLAGS = \
+ -version-number @TAO_MAJOR@:@TAO_MINOR@:@TAO_BETA@
+
+libTAO_RTEvent_Serv_la_LIBADD = \
+ libTAO_RTEvent_Skel.la \
+ libTAO_RTEvent.la \
+ libTAO_Svc_Utils.la \
+ $(TAO_BUILDDIR)/tao/libTAO_Messaging.la \
+ $(TAO_BUILDDIR)/tao/libTAO_PI.la \
+ $(TAO_BUILDDIR)/tao/libTAO_CodecFactory.la \
+ $(TAO_BUILDDIR)/tao/libTAO_PortableServer.la \
+ $(TAO_BUILDDIR)/tao/libTAO_Valuetype.la \
+ $(TAO_BUILDDIR)/tao/libTAO_AnyTypeCode.la \
+ $(TAO_BUILDDIR)/tao/libTAO.la \
+ $(ACE_BUILDDIR)/ace/libACE.la
+
+nobase_include_HEADERS += \
+ Channel_Clients_T.cpp \
+ Channel_Clients_T.h \
+ Channel_Clients_T.i \
+ Event/ECG_Adapters.h \
+ Event/ECG_CDR_Message_Receiver.h \
+ Event/ECG_CDR_Message_Receiver.i \
+ Event/ECG_CDR_Message_Sender.h \
+ Event/ECG_CDR_Message_Sender.i \
+ Event/ECG_Complex_Address_Server.h \
+ Event/ECG_Complex_Address_Server.i \
+ Event/ECG_ConsumerEC_Control.h \
+ Event/ECG_Mcast_EH.h \
+ Event/ECG_Mcast_EH.i \
+ Event/ECG_Mcast_Gateway.h \
+ Event/ECG_Mcast_Gateway.i \
+ Event/ECG_Reactive_ConsumerEC_Control.h \
+ Event/ECG_Reconnect_ConsumerEC_Control.h \
+ Event/ECG_Simple_Address_Server.h \
+ Event/ECG_Simple_Address_Server.i \
+ Event/ECG_Simple_Mcast_EH.h \
+ Event/ECG_UDP_EH.h \
+ Event/ECG_UDP_EH.i \
+ Event/ECG_UDP_Out_Endpoint.h \
+ Event/ECG_UDP_Out_Endpoint.i \
+ Event/ECG_UDP_Receiver.h \
+ Event/ECG_UDP_Receiver.i \
+ Event/ECG_UDP_Sender.h \
+ Event/ECG_UDP_Sender.inl \
+ Event/EC_And_Filter.h \
+ Event/EC_Basic_Factory.h \
+ Event/EC_Basic_Filter_Builder.h \
+ Event/EC_Basic_Filter_Builder.i \
+ Event/EC_Bitmask_Filter.h \
+ Event/EC_Busy_Lock.cpp \
+ Event/EC_Busy_Lock.h \
+ Event/EC_Busy_Lock.i \
+ Event/EC_Channel_Destroyer.h \
+ Event/EC_Conjunction_Filter.h \
+ Event/EC_ConsumerAdmin.h \
+ Event/EC_ConsumerControl.h \
+ Event/EC_Default_Factory.h \
+ Event/EC_Default_Factory.i \
+ Event/EC_Default_ProxyConsumer.h \
+ Event/EC_Default_ProxySupplier.h \
+ Event/EC_Disjunction_Filter.h \
+ Event/EC_Dispatching.h \
+ Event/EC_Dispatching_Task.h \
+ Event/EC_Dispatching_Task.i \
+ Event/EC_Event_Channel.h \
+ Event/EC_Event_Channel_Base.h \
+ Event/EC_Event_Channel_Base.i \
+ Event/EC_Factory.h \
+ Event/EC_Filter.h \
+ Event/EC_Filter.i \
+ Event/EC_Filter_Builder.h \
+ Event/EC_Filter_Builder.i \
+ Event/EC_Gateway.h \
+ Event/EC_Gateway_IIOP.h \
+ Event/EC_Gateway_IIOP_Factory.h \
+ Event/EC_Gateway_IIOP_Factory.i \
+ Event/EC_Group_Scheduling.h \
+ Event/EC_Group_Scheduling.inl \
+ Event/EC_Lifetime_Utils.h \
+ Event/EC_Lifetime_Utils.i \
+ Event/EC_Lifetime_Utils_T.cpp \
+ Event/EC_Lifetime_Utils_T.h \
+ Event/EC_Lifetime_Utils_T.i \
+ Event/EC_MT_Dispatching.h \
+ Event/EC_Masked_Type_Filter.h \
+ Event/EC_Negation_Filter.h \
+ Event/EC_Null_Factory.h \
+ Event/EC_Null_Scheduling.h \
+ Event/EC_Null_Scheduling.i \
+ Event/EC_ObserverStrategy.h \
+ Event/EC_ObserverStrategy.i \
+ Event/EC_Per_Supplier_Filter.h \
+ Event/EC_Per_Supplier_Filter.i \
+ Event/EC_Prefix_Filter_Builder.h \
+ Event/EC_Prefix_Filter_Builder.i \
+ Event/EC_ProxyConsumer.h \
+ Event/EC_ProxyConsumer.i \
+ Event/EC_ProxySupplier.h \
+ Event/EC_ProxySupplier.i \
+ Event/EC_Proxy_Disconnector.h \
+ Event/EC_QOS_Info.h \
+ Event/EC_QOS_Info.i \
+ Event/EC_Reactive_ConsumerControl.h \
+ Event/EC_Reactive_ConsumerControl.i \
+ Event/EC_Reactive_Dispatching.h \
+ Event/EC_Reactive_SupplierControl.h \
+ Event/EC_Reactive_SupplierControl.i \
+ Event/EC_Reactive_Timeout_Generator.h \
+ Event/EC_Scheduling_Strategy.h \
+ Event/EC_SupplierAdmin.h \
+ Event/EC_SupplierControl.h \
+ Event/EC_Supplier_Filter.h \
+ Event/EC_Supplier_Filter.i \
+ Event/EC_Supplier_Filter_Builder.h \
+ Event/EC_TPC_Dispatching.h \
+ Event/EC_TPC_Dispatching_Task.h \
+ Event/EC_TPC_Factory.h \
+ Event/EC_TPC_ProxyConsumer.h \
+ Event/EC_TPC_ProxySupplier.h \
+ Event/EC_TPC_ProxySupplier.i \
+ Event/EC_Timeout_Filter.h \
+ Event/EC_Timeout_Filter.i \
+ Event/EC_Timeout_Generator.h \
+ Event/EC_Timeout_Generator.i \
+ Event/EC_Trivial_Supplier_Filter.h \
+ Event/EC_Type_Filter.h \
+ Event/EC_UDP_Admin.h
+
+pkgconfig_DATA += \
+ TAO_RTEvent_Serv.pc
+
+CLEANFILES += \
+ TAO_RTEvent_Serv.pc
+
+TAO_RTEvent_Serv.pc: ${top_builddir}/config.status ${srcdir}/TAO_RTEvent_Serv.pc.in
+ ${top_builddir}/config.status --file $@:${srcdir}/TAO_RTEvent_Serv.pc.in
+
+endif !BUILD_ACE_FOR_TAO
+endif BUILD_CORBA_MESSAGING
+
+EXTRA_DIST += \
+ RTEvent_Serv.rc \
+ TAO_RTEvent_Serv.pc.in
+
+
+## Makefile.FtRtEvent.am
+
+if BUILD_CORBA_MESSAGING
+if !BUILD_ACE_FOR_TAO
+if !BUILD_MINIMUM_CORBA
+
+BUILT_SOURCES += \
+ FTRTC.cpp \
+ FTRTC.h \
+ FTRTC.inl \
+ FTRTS.cpp \
+ FTRTS.h \
+ FTRTS.inl \
+ FTRTS_T.cpp \
+ FTRTS_T.h \
+ FTRTS_T.inl
+
+CLEANFILES += \
+ FTRT-stamp \
+ FTRTC.cpp \
+ FTRTC.h \
+ FTRTC.inl \
+ FTRTS.cpp \
+ FTRTS.h \
+ FTRTS.inl \
+ FTRTS_T.cpp \
+ FTRTS_T.h \
+ FTRTS_T.inl
+
+FTRTC.cpp FTRTC.h FTRTC.inl FTRTS.cpp FTRTS.h FTRTS.inl FTRTS_T.cpp FTRTS_T.h FTRTS_T.inl: FTRT-stamp
+
+FTRT-stamp: $(srcdir)/FTRT.idl $(TAO_IDL_DEP)
+ $(TAO_IDL) $(TAO_IDLFLAGS) -I$(TAO_ROOT)/orbsvcs -GT -Wb,versioning_begin=TAO_BEGIN_VERSIONED_NAMESPACE_DECL -Wb,versioning_end=TAO_END_VERSIONED_NAMESPACE_DECL -Wb,export_macro=TAO_FtRtEvent_Export -Wb,export_include=orbsvcs/FtRtEvent/Utils/ftrtevent_export.h -GC $(srcdir)/FTRT.idl
+ @touch $@
+
+BUILT_SOURCES += \
+ FtRtecEventCommC.cpp \
+ FtRtecEventCommC.h \
+ FtRtecEventCommC.inl \
+ FtRtecEventCommS.cpp \
+ FtRtecEventCommS.h \
+ FtRtecEventCommS.inl \
+ FtRtecEventCommS_T.cpp \
+ FtRtecEventCommS_T.h \
+ FtRtecEventCommS_T.inl
+
+CLEANFILES += \
+ FtRtecEventComm-stamp \
+ FtRtecEventCommC.cpp \
+ FtRtecEventCommC.h \
+ FtRtecEventCommC.inl \
+ FtRtecEventCommS.cpp \
+ FtRtecEventCommS.h \
+ FtRtecEventCommS.inl \
+ FtRtecEventCommS_T.cpp \
+ FtRtecEventCommS_T.h \
+ FtRtecEventCommS_T.inl
+
+FtRtecEventCommC.cpp FtRtecEventCommC.h FtRtecEventCommC.inl FtRtecEventCommS.cpp FtRtecEventCommS.h FtRtecEventCommS.inl FtRtecEventCommS_T.cpp FtRtecEventCommS_T.h FtRtecEventCommS_T.inl: FtRtecEventComm-stamp
+
+FtRtecEventComm-stamp: $(srcdir)/FtRtecEventComm.idl $(TAO_IDL_DEP)
+ $(TAO_IDL) $(TAO_IDLFLAGS) -I$(TAO_ROOT)/orbsvcs -GT -Wb,versioning_begin=TAO_BEGIN_VERSIONED_NAMESPACE_DECL -Wb,versioning_end=TAO_END_VERSIONED_NAMESPACE_DECL -Wb,export_macro=TAO_FtRtEvent_Export -Wb,export_include=orbsvcs/FtRtEvent/Utils/ftrtevent_export.h -GC $(srcdir)/FtRtecEventComm.idl
+ @touch $@
+
+BUILT_SOURCES += \
+ FTRT_GroupManagerC.cpp \
+ FTRT_GroupManagerC.h \
+ FTRT_GroupManagerC.inl \
+ FTRT_GroupManagerS.cpp \
+ FTRT_GroupManagerS.h \
+ FTRT_GroupManagerS.inl \
+ FTRT_GroupManagerS_T.cpp \
+ FTRT_GroupManagerS_T.h \
+ FTRT_GroupManagerS_T.inl
+
+CLEANFILES += \
+ FTRT_GroupManager-stamp \
+ FTRT_GroupManagerC.cpp \
+ FTRT_GroupManagerC.h \
+ FTRT_GroupManagerC.inl \
+ FTRT_GroupManagerS.cpp \
+ FTRT_GroupManagerS.h \
+ FTRT_GroupManagerS.inl \
+ FTRT_GroupManagerS_T.cpp \
+ FTRT_GroupManagerS_T.h \
+ FTRT_GroupManagerS_T.inl
+
+FTRT_GroupManagerC.cpp FTRT_GroupManagerC.h FTRT_GroupManagerC.inl FTRT_GroupManagerS.cpp FTRT_GroupManagerS.h FTRT_GroupManagerS.inl FTRT_GroupManagerS_T.cpp FTRT_GroupManagerS_T.h FTRT_GroupManagerS_T.inl: FTRT_GroupManager-stamp
+
+FTRT_GroupManager-stamp: $(srcdir)/FTRT_GroupManager.idl $(TAO_IDL_DEP)
+ $(TAO_IDL) $(TAO_IDLFLAGS) -I$(TAO_ROOT)/orbsvcs -GT -Wb,versioning_begin=TAO_BEGIN_VERSIONED_NAMESPACE_DECL -Wb,versioning_end=TAO_END_VERSIONED_NAMESPACE_DECL -Wb,export_macro=TAO_FtRtEvent_Export -Wb,export_include=orbsvcs/FtRtEvent/Utils/ftrtevent_export.h -GC $(srcdir)/FTRT_GroupManager.idl
+ @touch $@
+
+BUILT_SOURCES += \
+ FtRtecEventChannelAdminC.cpp \
+ FtRtecEventChannelAdminC.h \
+ FtRtecEventChannelAdminC.inl \
+ FtRtecEventChannelAdminS.cpp \
+ FtRtecEventChannelAdminS.h \
+ FtRtecEventChannelAdminS.inl \
+ FtRtecEventChannelAdminS_T.cpp \
+ FtRtecEventChannelAdminS_T.h \
+ FtRtecEventChannelAdminS_T.inl
+
+CLEANFILES += \
+ FtRtecEventChannelAdmin-stamp \
+ FtRtecEventChannelAdminC.cpp \
+ FtRtecEventChannelAdminC.h \
+ FtRtecEventChannelAdminC.inl \
+ FtRtecEventChannelAdminS.cpp \
+ FtRtecEventChannelAdminS.h \
+ FtRtecEventChannelAdminS.inl \
+ FtRtecEventChannelAdminS_T.cpp \
+ FtRtecEventChannelAdminS_T.h \
+ FtRtecEventChannelAdminS_T.inl
+
+FtRtecEventChannelAdminC.cpp FtRtecEventChannelAdminC.h FtRtecEventChannelAdminC.inl FtRtecEventChannelAdminS.cpp FtRtecEventChannelAdminS.h FtRtecEventChannelAdminS.inl FtRtecEventChannelAdminS_T.cpp FtRtecEventChannelAdminS_T.h FtRtecEventChannelAdminS_T.inl: FtRtecEventChannelAdmin-stamp
+
+FtRtecEventChannelAdmin-stamp: $(srcdir)/FtRtecEventChannelAdmin.idl $(TAO_IDL_DEP)
+ $(TAO_IDL) $(TAO_IDLFLAGS) -I$(TAO_ROOT)/orbsvcs -GT -Wb,versioning_begin=TAO_BEGIN_VERSIONED_NAMESPACE_DECL -Wb,versioning_end=TAO_END_VERSIONED_NAMESPACE_DECL -Wb,export_macro=TAO_FtRtEvent_Export -Wb,export_include=orbsvcs/FtRtEvent/Utils/ftrtevent_export.h $(srcdir)/FtRtecEventChannelAdmin.idl
+ @touch $@
+
+lib_LTLIBRARIES += libTAO_FtRtEvent.la
+
+libTAO_FtRtEvent_la_CPPFLAGS = \
+ -I$(ACE_ROOT) \
+ -I$(ACE_BUILDDIR) \
+ -I$(TAO_ROOT) \
+ -I$(TAO_BUILDDIR) \
+ -I$(TAO_ROOT)/orbsvcs \
+ -I$(TAO_BUILDDIR)/orbsvcs \
+ -DTAO_FTRTEVENT_BUILD_DLL
+
+libTAO_FtRtEvent_la_SOURCES = \
+ FTRTC.cpp \
+ FTRTS.cpp \
+ FTRT_GroupManagerC.cpp \
+ FTRT_GroupManagerS.cpp \
+ FtRtEvent/Utils/FTEC_Gateway.cpp \
+ FtRtEvent/Utils/Log.cpp \
+ FtRtEvent/Utils/Safe_InputCDR.cpp \
+ FtRtEvent/Utils/UUID.cpp \
+ FtRtecEventChannelAdminC.cpp \
+ FtRtecEventChannelAdminS.cpp \
+ FtRtecEventCommC.cpp \
+ FtRtecEventCommS.cpp
+
+libTAO_FtRtEvent_la_LDFLAGS = \
+ -version-number @TAO_MAJOR@:@TAO_MINOR@:@TAO_BETA@
+
+libTAO_FtRtEvent_la_LIBADD = \
+ $(TAO_BUILDDIR)/tao/libTAO_PI_Server.la \
+ libTAO_RTEvent_Serv.la \
+ libTAO_RTEvent_Skel.la \
+ libTAO_RTEvent.la \
+ libTAO_Svc_Utils.la \
+ libTAO_FTORB_Utils.la \
+ libTAO_PortableGroup.la \
+ $(TAO_BUILDDIR)/tao/libTAO_Messaging.la \
+ $(TAO_BUILDDIR)/tao/libTAO_PI.la \
+ $(TAO_BUILDDIR)/tao/libTAO_CodecFactory.la \
+ $(TAO_BUILDDIR)/tao/libTAO_Valuetype.la \
+ libTAO_CosNaming.la \
+ $(TAO_BUILDDIR)/tao/libTAO_PortableServer.la \
+ $(TAO_BUILDDIR)/tao/libTAO_IORManip.la \
+ $(TAO_BUILDDIR)/tao/libTAO_AnyTypeCode.la \
+ $(TAO_BUILDDIR)/tao/libTAO.la \
+ $(ACE_BUILDDIR)/ace/libACE.la
+
+nobase_include_HEADERS += \
+ FTRT.idl \
+ FTRTC.h \
+ FTRTC.inl \
+ FTRTS.h \
+ FTRTS.inl \
+ FTRTS_T.cpp \
+ FTRTS_T.h \
+ FTRTS_T.inl \
+ FTRT_GroupManager.idl \
+ FTRT_GroupManagerC.h \
+ FTRT_GroupManagerC.inl \
+ FTRT_GroupManagerS.h \
+ FTRT_GroupManagerS.inl \
+ FTRT_GroupManagerS_T.cpp \
+ FTRT_GroupManagerS_T.h \
+ FTRT_GroupManagerS_T.inl \
+ FtRtEvent/Utils/FTEC_Gateway.h \
+ FtRtEvent/Utils/FTEC_Gateway.inl \
+ FtRtEvent/Utils/Log.h \
+ FtRtEvent/Utils/Log.inl \
+ FtRtEvent/Utils/Safe_InputCDR.h \
+ FtRtEvent/Utils/Safe_InputCDR.inl \
+ FtRtEvent/Utils/UUID.h \
+ FtRtEvent/Utils/UUID.inl \
+ FtRtecEventChannelAdmin.idl \
+ FtRtecEventChannelAdminC.h \
+ FtRtecEventChannelAdminC.inl \
+ FtRtecEventChannelAdminS.h \
+ FtRtecEventChannelAdminS.inl \
+ FtRtecEventChannelAdminS_T.cpp \
+ FtRtecEventChannelAdminS_T.h \
+ FtRtecEventChannelAdminS_T.inl \
+ FtRtecEventComm.idl \
+ FtRtecEventCommC.h \
+ FtRtecEventCommC.inl \
+ FtRtecEventCommS.h \
+ FtRtecEventCommS.inl \
+ FtRtecEventCommS_T.cpp \
+ FtRtecEventCommS_T.h \
+ FtRtecEventCommS_T.inl
+
+endif !BUILD_MINIMUM_CORBA
+endif !BUILD_ACE_FOR_TAO
+endif BUILD_CORBA_MESSAGING
+
+## Makefile.FTRT_EventChannel.am
+
+if BUILD_CORBA_MESSAGING
+if !BUILD_ACE_FOR_TAO
+if !BUILD_MINIMUM_CORBA
+
+lib_LTLIBRARIES += libTAO_FTRT_EventChannel.la
+
+libTAO_FTRT_EventChannel_la_CPPFLAGS = \
+ -I$(ACE_ROOT) \
+ -I$(ACE_BUILDDIR) \
+ -I$(TAO_ROOT) \
+ -I$(TAO_BUILDDIR) \
+ -I$(TAO_ROOT)/orbsvcs \
+ -I$(TAO_BUILDDIR)/orbsvcs \
+ -DTAO_FTRTEC_BUILD_DLL
+
+libTAO_FTRT_EventChannel_la_SOURCES = \
+ FtRtEvent/EventChannel/AMI_Primary_Replication_Strategy.cpp \
+ FtRtEvent/EventChannel/AMI_Replication_Strategy.cpp \
+ FtRtEvent/EventChannel/Basic_Replication_Strategy.cpp \
+ FtRtEvent/EventChannel/Dynamic_Bitset.cpp \
+ FtRtEvent/EventChannel/FTEC_Become_Primary_Listener.cpp \
+ FtRtEvent/EventChannel/FTEC_ConsumerAdmin.cpp \
+ FtRtEvent/EventChannel/FTEC_Event_Channel.cpp \
+ FtRtEvent/EventChannel/FTEC_Event_Channel_Impl.cpp \
+ FtRtEvent/EventChannel/FTEC_Factory.cpp \
+ FtRtEvent/EventChannel/FTEC_Group_Manager.cpp \
+ FtRtEvent/EventChannel/FTEC_ORBInitializer.cpp \
+ FtRtEvent/EventChannel/FTEC_ProxyConsumer.cpp \
+ FtRtEvent/EventChannel/FTEC_ProxySupplier.cpp \
+ FtRtEvent/EventChannel/FTEC_SupplierAdmin.cpp \
+ FtRtEvent/EventChannel/FT_ProxyAdmin_Base.cpp \
+ FtRtEvent/EventChannel/Fault_Detector.cpp \
+ FtRtEvent/EventChannel/Fault_Detector_Loader.cpp \
+ FtRtEvent/EventChannel/ForwardCtrlServerInterceptor.cpp \
+ FtRtEvent/EventChannel/FtEventServiceInterceptor.cpp \
+ FtRtEvent/EventChannel/GroupInfoPublisher.cpp \
+ FtRtEvent/EventChannel/IOGR_Maker.cpp \
+ FtRtEvent/EventChannel/Identification_Service.cpp \
+ FtRtEvent/EventChannel/ObjectGroupManagerHandler.cpp \
+ FtRtEvent/EventChannel/ProxyConsumerStateWorker.cpp \
+ FtRtEvent/EventChannel/ProxySupplierStateWorker.cpp \
+ FtRtEvent/EventChannel/Replication_Service.cpp \
+ FtRtEvent/EventChannel/Replication_Strategy.cpp \
+ FtRtEvent/EventChannel/Request_Context_Repository.cpp \
+ FtRtEvent/EventChannel/SCTP_Fault_Detector.cpp \
+ FtRtEvent/EventChannel/Set_Update_Interceptor.cpp \
+ FtRtEvent/EventChannel/Update_Manager.cpp \
+ FtRtEvent/EventChannel/UpdateableHandler.cpp \
+ FtRtEvent/EventChannel/create_persistent_poa.cpp \
+ FtRtEvent/EventChannel/replace_key.cpp
+
+libTAO_FTRT_EventChannel_la_LDFLAGS = \
+ -version-number @TAO_MAJOR@:@TAO_MINOR@:@TAO_BETA@
+
+libTAO_FTRT_EventChannel_la_LIBADD = \
+ $(TAO_BUILDDIR)/tao/libTAO_Utils.la \
+ libTAO_FtRtEvent.la \
+ $(TAO_BUILDDIR)/tao/libTAO_PI_Server.la \
+ libTAO_RTEvent_Serv.la \
+ libTAO_RTEvent_Skel.la \
+ libTAO_RTEvent.la \
+ libTAO_Svc_Utils.la \
+ libTAO_FTORB_Utils.la \
+ libTAO_PortableGroup.la \
+ $(TAO_BUILDDIR)/tao/libTAO_Messaging.la \
+ $(TAO_BUILDDIR)/tao/libTAO_PI.la \
+ $(TAO_BUILDDIR)/tao/libTAO_CodecFactory.la \
+ $(TAO_BUILDDIR)/tao/libTAO_Valuetype.la \
+ libTAO_CosNaming.la \
+ $(TAO_BUILDDIR)/tao/libTAO_PortableServer.la \
+ $(TAO_BUILDDIR)/tao/libTAO_IORManip.la \
+ $(TAO_BUILDDIR)/tao/libTAO_AnyTypeCode.la \
+ $(TAO_BUILDDIR)/tao/libTAO.la \
+ $(ACE_BUILDDIR)/ace/libACE.la
+
+nobase_include_HEADERS += \
+ FtRtEvent/EventChannel/AMI_Primary_Replication_Strategy.h \
+ FtRtEvent/EventChannel/AMI_Replication_Strategy.h \
+ FtRtEvent/EventChannel/Basic_Replication_Strategy.h \
+ FtRtEvent/EventChannel/ConnectionHandler_T.cpp \
+ FtRtEvent/EventChannel/ConnectionHandler_T.h \
+ FtRtEvent/EventChannel/Dynamic_Bitset.h \
+ FtRtEvent/EventChannel/Dynamic_Bitset.inl \
+ FtRtEvent/EventChannel/FTEC_Become_Primary_Listener.h \
+ FtRtEvent/EventChannel/FTEC_ConsumerAdmin.h \
+ FtRtEvent/EventChannel/FTEC_Event_Channel.h \
+ FtRtEvent/EventChannel/FTEC_Event_Channel_Impl.h \
+ FtRtEvent/EventChannel/FTEC_Factory.h \
+ FtRtEvent/EventChannel/FTEC_Group_Manager.h \
+ FtRtEvent/EventChannel/FTEC_ORBInitializer.h \
+ FtRtEvent/EventChannel/FTEC_ProxyConsumer.h \
+ FtRtEvent/EventChannel/FTEC_ProxySupplier.h \
+ FtRtEvent/EventChannel/FTEC_SupplierAdmin.h \
+ FtRtEvent/EventChannel/FT_ProxyAdmin_Base.h \
+ FtRtEvent/EventChannel/FT_ProxyAdmin_T.cpp \
+ FtRtEvent/EventChannel/FT_ProxyAdmin_T.h \
+ FtRtEvent/EventChannel/Fault_Detector.h \
+ FtRtEvent/EventChannel/Fault_Detector_Loader.h \
+ FtRtEvent/EventChannel/Fault_Detector_T.cpp \
+ FtRtEvent/EventChannel/Fault_Detector_T.h \
+ FtRtEvent/EventChannel/ForwardCtrlServerInterceptor.h \
+ FtRtEvent/EventChannel/FtEventServiceInterceptor.h \
+ FtRtEvent/EventChannel/GroupInfoPublisher.h \
+ FtRtEvent/EventChannel/IOGR_Maker.h \
+ FtRtEvent/EventChannel/Identification_Service.h \
+ FtRtEvent/EventChannel/ObjectGroupManagerHandler.h \
+ FtRtEvent/EventChannel/ProxyConsumerStateWorker.h \
+ FtRtEvent/EventChannel/ProxySupplierStateWorker.h \
+ FtRtEvent/EventChannel/Replication_Service.h \
+ FtRtEvent/EventChannel/Replication_Strategy.h \
+ FtRtEvent/EventChannel/Request_Context_Repository.h \
+ FtRtEvent/EventChannel/SCTP_Fault_Detector.h \
+ FtRtEvent/EventChannel/Set_Update_Interceptor.h \
+ FtRtEvent/EventChannel/Update_Manager.h \
+ FtRtEvent/EventChannel/UpdateableHandler.h \
+ FtRtEvent/EventChannel/create_persistent_poa.h \
+ FtRtEvent/EventChannel/ftrtec_export.h
+
+endif !BUILD_MINIMUM_CORBA
+endif !BUILD_ACE_FOR_TAO
+endif BUILD_CORBA_MESSAGING
+
+## Makefile.FT_ClientORB.am
+
+if BUILD_ACE_UUID
+if BUILD_CORBA_MESSAGING
+if BUILD_INTERCEPTORS
+if !BUILD_ACE_FOR_TAO
+if !BUILD_MINIMUM_CORBA
+
+lib_LTLIBRARIES += libTAO_FT_ClientORB.la
+
+libTAO_FT_ClientORB_la_CPPFLAGS = \
+ -I$(ACE_ROOT) \
+ -I$(ACE_BUILDDIR) \
+ -I$(TAO_ROOT) \
+ -I$(TAO_BUILDDIR) \
+ -I$(TAO_ROOT)/orbsvcs \
+ -I$(TAO_BUILDDIR)/orbsvcs \
+ -DTAO_FT_CLIENTORB_BUILD_DLL
+
+libTAO_FT_ClientORB_la_SOURCES = \
+ FaultTolerance/FT_ClientORBInitializer.cpp \
+ FaultTolerance/FT_ClientPolicyFactory.cpp \
+ FaultTolerance/FT_ClientPolicy_i.cpp \
+ FaultTolerance/FT_ClientRequest_Interceptor.cpp \
+ FaultTolerance/FT_ClientService_Activate.cpp \
+ FaultTolerance/FT_Endpoint_Selector_Factory.cpp \
+ FaultTolerance/FT_Invocation_Endpoint_Selectors.cpp \
+ FaultTolerance/FT_Service_Callbacks.cpp
+
+libTAO_FT_ClientORB_la_LDFLAGS = \
+ -version-number @TAO_MAJOR@:@TAO_MINOR@:@TAO_BETA@
+
+libTAO_FT_ClientORB_la_LIBADD = \
+ libTAO_FTORB_Utils.la \
+ libTAO_PortableGroup.la \
+ $(TAO_BUILDDIR)/tao/libTAO_Messaging.la \
+ $(TAO_BUILDDIR)/tao/libTAO_PI.la \
+ $(TAO_BUILDDIR)/tao/libTAO_CodecFactory.la \
+ $(TAO_BUILDDIR)/tao/libTAO_Valuetype.la \
+ libTAO_CosNaming.la \
+ $(TAO_BUILDDIR)/tao/libTAO_PortableServer.la \
+ $(TAO_BUILDDIR)/tao/libTAO_IORManip.la \
+ $(TAO_BUILDDIR)/tao/libTAO_AnyTypeCode.la \
+ $(TAO_BUILDDIR)/tao/libTAO.la \
+ $(ACE_BUILDDIR)/ace/libACE.la
+
+nobase_include_HEADERS += \
+ FaultTolerance/FT_ClientORBInitializer.h \
+ FaultTolerance/FT_ClientPolicyFactory.h \
+ FaultTolerance/FT_ClientPolicy_i.h \
+ FaultTolerance/FT_ClientPolicy_i.inl \
+ FaultTolerance/FT_ClientRequest_Interceptor.h \
+ FaultTolerance/FT_ClientService_Activate.h \
+ FaultTolerance/FT_Endpoint_Selector_Factory.h \
+ FaultTolerance/FT_Invocation_Endpoint_Selectors.h \
+ FaultTolerance/FT_Service_Callbacks.h
+
+pkgconfig_DATA += \
+ TAO_FT_ClientORB.pc
+
+CLEANFILES += \
+ TAO_FT_ClientORB.pc
+
+TAO_FT_ClientORB.pc: ${top_builddir}/config.status ${srcdir}/TAO_FT_ClientORB.pc.in
+ ${top_builddir}/config.status --file $@:${srcdir}/TAO_FT_ClientORB.pc.in
+
+endif !BUILD_MINIMUM_CORBA
+endif !BUILD_ACE_FOR_TAO
+endif BUILD_INTERCEPTORS
+endif BUILD_CORBA_MESSAGING
+endif BUILD_ACE_UUID
+
+EXTRA_DIST += \
+ TAO_FT_ClientORB.pc.in
+
+
+## Makefile.FT_ServerORB.am
+
+if BUILD_CORBA_MESSAGING
+if BUILD_INTERCEPTORS
+if !BUILD_MINIMUM_CORBA
+
+lib_LTLIBRARIES += libTAO_FT_ServerORB.la
+
+libTAO_FT_ServerORB_la_CPPFLAGS = \
+ -I$(ACE_ROOT) \
+ -I$(ACE_BUILDDIR) \
+ -I$(TAO_ROOT) \
+ -I$(TAO_BUILDDIR) \
+ -I$(TAO_ROOT)/orbsvcs \
+ -I$(TAO_BUILDDIR)/orbsvcs \
+ -DTAO_FT_SERVERORB_BUILD_DLL
+
+libTAO_FT_ServerORB_la_SOURCES = \
+ FaultTolerance/FT_ServerORBInitializer.cpp \
+ FaultTolerance/FT_ServerPolicyFactory.cpp \
+ FaultTolerance/FT_ServerPolicy_i.cpp \
+ FaultTolerance/FT_ServerRequest_Interceptor.cpp \
+ FaultTolerance/FT_ServerService_Activate.cpp
+
+libTAO_FT_ServerORB_la_LDFLAGS = \
+ -version-number @TAO_MAJOR@:@TAO_MINOR@:@TAO_BETA@
+
+libTAO_FT_ServerORB_la_LIBADD = \
+ $(TAO_BUILDDIR)/tao/libTAO_PI_Server.la \
+ libTAO_FTORB_Utils.la \
+ libTAO_PortableGroup.la \
+ $(TAO_BUILDDIR)/tao/libTAO_Messaging.la \
+ $(TAO_BUILDDIR)/tao/libTAO_PI.la \
+ $(TAO_BUILDDIR)/tao/libTAO_CodecFactory.la \
+ $(TAO_BUILDDIR)/tao/libTAO_Valuetype.la \
+ libTAO_CosNaming.la \
+ $(TAO_BUILDDIR)/tao/libTAO_PortableServer.la \
+ $(TAO_BUILDDIR)/tao/libTAO_IORManip.la \
+ $(TAO_BUILDDIR)/tao/libTAO_AnyTypeCode.la \
+ $(TAO_BUILDDIR)/tao/libTAO.la \
+ $(ACE_BUILDDIR)/ace/libACE.la
+
+nobase_include_HEADERS += \
+ FaultTolerance/FT_ServerORBInitializer.h \
+ FaultTolerance/FT_ServerPolicyFactory.h \
+ FaultTolerance/FT_ServerPolicy_i.h \
+ FaultTolerance/FT_ServerPolicy_i.inl \
+ FaultTolerance/FT_ServerRequest_Interceptor.h \
+ FaultTolerance/FT_ServerService_Activate.h
+
+pkgconfig_DATA += \
+ TAO_FT_ServerORB.pc
+
+CLEANFILES += \
+ TAO_FT_ServerORB.pc
+
+TAO_FT_ServerORB.pc: ${top_builddir}/config.status ${srcdir}/TAO_FT_ServerORB.pc.in
+ ${top_builddir}/config.status --file $@:${srcdir}/TAO_FT_ServerORB.pc.in
+
+endif !BUILD_MINIMUM_CORBA
+endif BUILD_INTERCEPTORS
+endif BUILD_CORBA_MESSAGING
+
+EXTRA_DIST += \
+ TAO_FT_ServerORB.pc.in
+
+
+## Makefile.FaultTolerance.am
+
+if BUILD_ACE_UUID
+if BUILD_CORBA_MESSAGING
+if BUILD_INTERCEPTORS
+if !BUILD_ACE_FOR_TAO
+if !BUILD_MINIMUM_CORBA
+
+BUILT_SOURCES += \
+ FT_CORBAC.cpp \
+ FT_CORBAC.h \
+ FT_CORBAC.inl \
+ FT_CORBAS.cpp \
+ FT_CORBAS.h \
+ FT_CORBAS.inl \
+ FT_CORBAS_T.cpp \
+ FT_CORBAS_T.inl
+
+CLEANFILES += \
+ FT_CORBA-stamp \
+ FT_CORBAC.cpp \
+ FT_CORBAC.h \
+ FT_CORBAC.inl \
+ FT_CORBAS.cpp \
+ FT_CORBAS.h \
+ FT_CORBAS.inl \
+ FT_CORBAS_T.cpp \
+ FT_CORBAS_T.inl
+
+FT_CORBAC.cpp FT_CORBAC.h FT_CORBAC.inl FT_CORBAS.cpp FT_CORBAS.h FT_CORBAS.inl FT_CORBAS_T.cpp FT_CORBAS_T.inl: FT_CORBA-stamp
+
+FT_CORBA-stamp: $(srcdir)/FT_CORBA.idl $(TAO_IDL_DEP)
+ $(TAO_IDL) $(TAO_IDLFLAGS) -I$(TAO_ROOT)/orbsvcs -GT -Wb,versioning_begin=TAO_BEGIN_VERSIONED_NAMESPACE_DECL -Wb,versioning_end=TAO_END_VERSIONED_NAMESPACE_DECL -Wb,export_macro=TAO_FT_Export -Wb,export_include=orbsvcs/FaultTolerance/fault_tol_export.h -Wb,skel_export_include=tao/PortableServer/PolicyS.h $(srcdir)/FT_CORBA.idl
+ @touch $@
+
+BUILT_SOURCES += \
+ FT_ReplicaC.cpp \
+ FT_ReplicaC.h \
+ FT_ReplicaC.inl \
+ FT_ReplicaS.cpp \
+ FT_ReplicaS.h \
+ FT_ReplicaS.inl \
+ FT_ReplicaS_T.cpp \
+ FT_ReplicaS_T.inl
+
+CLEANFILES += \
+ FT_Replica-stamp \
+ FT_ReplicaC.cpp \
+ FT_ReplicaC.h \
+ FT_ReplicaC.inl \
+ FT_ReplicaS.cpp \
+ FT_ReplicaS.h \
+ FT_ReplicaS.inl \
+ FT_ReplicaS_T.cpp \
+ FT_ReplicaS_T.inl
+
+FT_ReplicaC.cpp FT_ReplicaC.h FT_ReplicaC.inl FT_ReplicaS.cpp FT_ReplicaS.h FT_ReplicaS.inl FT_ReplicaS_T.cpp FT_ReplicaS_T.inl: FT_Replica-stamp
+
+FT_Replica-stamp: $(srcdir)/FT_Replica.idl $(TAO_IDL_DEP)
+ $(TAO_IDL) $(TAO_IDLFLAGS) -I$(TAO_ROOT)/orbsvcs -GT -Wb,versioning_begin=TAO_BEGIN_VERSIONED_NAMESPACE_DECL -Wb,versioning_end=TAO_END_VERSIONED_NAMESPACE_DECL -Wb,export_macro=TAO_FT_Export -Wb,export_include=orbsvcs/FaultTolerance/fault_tol_export.h -Wb,skel_export_include=tao/PortableServer/PolicyS.h $(srcdir)/FT_Replica.idl
+ @touch $@
+
+BUILT_SOURCES += \
+ FT_NotifierC.cpp \
+ FT_NotifierC.h \
+ FT_NotifierC.inl \
+ FT_NotifierS.cpp \
+ FT_NotifierS.h \
+ FT_NotifierS.inl \
+ FT_NotifierS_T.cpp \
+ FT_NotifierS_T.inl
+
+CLEANFILES += \
+ FT_Notifier-stamp \
+ FT_NotifierC.cpp \
+ FT_NotifierC.h \
+ FT_NotifierC.inl \
+ FT_NotifierS.cpp \
+ FT_NotifierS.h \
+ FT_NotifierS.inl \
+ FT_NotifierS_T.cpp \
+ FT_NotifierS_T.inl
+
+FT_NotifierC.cpp FT_NotifierC.h FT_NotifierC.inl FT_NotifierS.cpp FT_NotifierS.h FT_NotifierS.inl FT_NotifierS_T.cpp FT_NotifierS_T.inl: FT_Notifier-stamp
+
+FT_Notifier-stamp: $(srcdir)/FT_Notifier.idl $(TAO_IDL_DEP)
+ $(TAO_IDL) $(TAO_IDLFLAGS) -I$(TAO_ROOT)/orbsvcs -GT -Wb,versioning_begin=TAO_BEGIN_VERSIONED_NAMESPACE_DECL -Wb,versioning_end=TAO_END_VERSIONED_NAMESPACE_DECL -Wb,export_macro=TAO_FT_Export -Wb,export_include=orbsvcs/FaultTolerance/fault_tol_export.h -Wb,skel_export_include=tao/PortableServer/PolicyS.h $(srcdir)/FT_Notifier.idl
+ @touch $@
+
+BUILT_SOURCES += \
+ FT_FaultDetectorFactoryC.cpp \
+ FT_FaultDetectorFactoryC.h \
+ FT_FaultDetectorFactoryC.inl \
+ FT_FaultDetectorFactoryS.cpp \
+ FT_FaultDetectorFactoryS.h \
+ FT_FaultDetectorFactoryS.inl \
+ FT_FaultDetectorFactoryS_T.cpp \
+ FT_FaultDetectorFactoryS_T.inl
+
+CLEANFILES += \
+ FT_FaultDetectorFactory-stamp \
+ FT_FaultDetectorFactoryC.cpp \
+ FT_FaultDetectorFactoryC.h \
+ FT_FaultDetectorFactoryC.inl \
+ FT_FaultDetectorFactoryS.cpp \
+ FT_FaultDetectorFactoryS.h \
+ FT_FaultDetectorFactoryS.inl \
+ FT_FaultDetectorFactoryS_T.cpp \
+ FT_FaultDetectorFactoryS_T.inl
+
+FT_FaultDetectorFactoryC.cpp FT_FaultDetectorFactoryC.h FT_FaultDetectorFactoryC.inl FT_FaultDetectorFactoryS.cpp FT_FaultDetectorFactoryS.h FT_FaultDetectorFactoryS.inl FT_FaultDetectorFactoryS_T.cpp FT_FaultDetectorFactoryS_T.inl: FT_FaultDetectorFactory-stamp
+
+FT_FaultDetectorFactory-stamp: $(srcdir)/FT_FaultDetectorFactory.idl $(TAO_IDL_DEP)
+ $(TAO_IDL) $(TAO_IDLFLAGS) -I$(TAO_ROOT)/orbsvcs -GT -Wb,versioning_begin=TAO_BEGIN_VERSIONED_NAMESPACE_DECL -Wb,versioning_end=TAO_END_VERSIONED_NAMESPACE_DECL -Wb,export_macro=TAO_FT_Export -Wb,export_include=orbsvcs/FaultTolerance/fault_tol_export.h -Wb,skel_export_include=tao/PortableServer/PolicyS.h $(srcdir)/FT_FaultDetectorFactory.idl
+ @touch $@
+
+BUILT_SOURCES += \
+ FT_ReplicationManagerC.cpp \
+ FT_ReplicationManagerC.h \
+ FT_ReplicationManagerC.inl \
+ FT_ReplicationManagerS.cpp \
+ FT_ReplicationManagerS.h \
+ FT_ReplicationManagerS.inl \
+ FT_ReplicationManagerS_T.cpp \
+ FT_ReplicationManagerS_T.inl
+
+CLEANFILES += \
+ FT_ReplicationManager-stamp \
+ FT_ReplicationManagerC.cpp \
+ FT_ReplicationManagerC.h \
+ FT_ReplicationManagerC.inl \
+ FT_ReplicationManagerS.cpp \
+ FT_ReplicationManagerS.h \
+ FT_ReplicationManagerS.inl \
+ FT_ReplicationManagerS_T.cpp \
+ FT_ReplicationManagerS_T.inl
+
+FT_ReplicationManagerC.cpp FT_ReplicationManagerC.h FT_ReplicationManagerC.inl FT_ReplicationManagerS.cpp FT_ReplicationManagerS.h FT_ReplicationManagerS.inl FT_ReplicationManagerS_T.cpp FT_ReplicationManagerS_T.inl: FT_ReplicationManager-stamp
+
+FT_ReplicationManager-stamp: $(srcdir)/FT_ReplicationManager.idl $(TAO_IDL_DEP)
+ $(TAO_IDL) $(TAO_IDLFLAGS) -I$(TAO_ROOT)/orbsvcs -GT -Wb,versioning_begin=TAO_BEGIN_VERSIONED_NAMESPACE_DECL -Wb,versioning_end=TAO_END_VERSIONED_NAMESPACE_DECL -Wb,export_macro=TAO_FT_Export -Wb,export_include=orbsvcs/FaultTolerance/fault_tol_export.h -Wb,skel_export_include=tao/PortableServer/PolicyS.h $(srcdir)/FT_ReplicationManager.idl
+ @touch $@
+
+lib_LTLIBRARIES += libTAO_FaultTolerance.la
+
+libTAO_FaultTolerance_la_CPPFLAGS = \
+ -I$(ACE_ROOT) \
+ -I$(ACE_BUILDDIR) \
+ -I$(TAO_ROOT) \
+ -I$(TAO_BUILDDIR) \
+ -I$(TAO_ROOT)/orbsvcs \
+ -I$(TAO_BUILDDIR)/orbsvcs \
+ -DTAO_HAS_TYPED_EVENT_CHANNEL \
+ -DTAO_FT_BUILD_DLL
+
+libTAO_FaultTolerance_la_SOURCES = \
+ FT_CORBAC.cpp \
+ FT_CORBAS.cpp \
+ FT_FaultDetectorFactoryC.cpp \
+ FT_FaultDetectorFactoryS.cpp \
+ FT_NotifierC.cpp \
+ FT_NotifierS.cpp \
+ FT_ReplicaC.cpp \
+ FT_ReplicaS.cpp \
+ FT_ReplicationManagerC.cpp \
+ FT_ReplicationManagerS.cpp
+
+libTAO_FaultTolerance_la_LDFLAGS = \
+ -version-number @TAO_MAJOR@:@TAO_MINOR@:@TAO_BETA@
+
+libTAO_FaultTolerance_la_LIBADD = \
+ libTAO_FT_ServerORB.la \
+ libTAO_FT_ClientORB.la \
+ libTAO_FTORB_Utils.la \
+ libTAO_PortableGroup.la \
+ $(TAO_BUILDDIR)/tao/libTAO_Messaging.la \
+ $(TAO_BUILDDIR)/tao/libTAO_Valuetype.la \
+ libTAO_CosNaming.la \
+ $(TAO_BUILDDIR)/tao/libTAO_IORManip.la \
+ libTAO_CosNotification.la \
+ libTAO_CosEvent.la \
+ $(TAO_BUILDDIR)/tao/libTAO_PI_Server.la \
+ $(TAO_BUILDDIR)/tao/libTAO_PortableServer.la \
+ $(TAO_BUILDDIR)/tao/libTAO_PI.la \
+ $(TAO_BUILDDIR)/tao/libTAO_CodecFactory.la \
+ $(TAO_BUILDDIR)/tao/libTAO_AnyTypeCode.la \
+ $(TAO_BUILDDIR)/tao/libTAO.la \
+ $(ACE_BUILDDIR)/ace/libACE.la
+
+nobase_include_HEADERS += \
+ FT_CORBA.idl \
+ FT_CORBAC.h \
+ FT_CORBAC.inl \
+ FT_CORBAS.h \
+ FT_CORBAS.inl \
+ FT_CORBAS_T.cpp \
+ FT_CORBAS_T.inl \
+ FT_FaultDetectorFactory.idl \
+ FT_FaultDetectorFactoryC.h \
+ FT_FaultDetectorFactoryC.inl \
+ FT_FaultDetectorFactoryS.h \
+ FT_FaultDetectorFactoryS.inl \
+ FT_FaultDetectorFactoryS_T.cpp \
+ FT_FaultDetectorFactoryS_T.inl \
+ FT_Notifier.idl \
+ FT_NotifierC.h \
+ FT_NotifierC.inl \
+ FT_NotifierS.h \
+ FT_NotifierS.inl \
+ FT_NotifierS_T.cpp \
+ FT_NotifierS_T.inl \
+ FT_Replica.idl \
+ FT_ReplicaC.h \
+ FT_ReplicaC.inl \
+ FT_ReplicaS.h \
+ FT_ReplicaS.inl \
+ FT_ReplicaS_T.cpp \
+ FT_ReplicaS_T.inl \
+ FT_ReplicationManager.idl \
+ FT_ReplicationManagerC.h \
+ FT_ReplicationManagerC.inl \
+ FT_ReplicationManagerS.h \
+ FT_ReplicationManagerS.inl \
+ FT_ReplicationManagerS_T.cpp \
+ FT_ReplicationManagerS_T.inl \
+ FaultTolerance/fault_tol_export.h
+
+pkgconfig_DATA += \
+ TAO_FaultTolerance.pc
+
+CLEANFILES += \
+ TAO_FaultTolerance.pc
+
+TAO_FaultTolerance.pc: ${top_builddir}/config.status ${srcdir}/TAO_FaultTolerance.pc.in
+ ${top_builddir}/config.status --file $@:${srcdir}/TAO_FaultTolerance.pc.in
+
+endif !BUILD_MINIMUM_CORBA
+endif !BUILD_ACE_FOR_TAO
+endif BUILD_INTERCEPTORS
+endif BUILD_CORBA_MESSAGING
+endif BUILD_ACE_UUID
+
+EXTRA_DIST += \
+ FaultTolerance.rc \
+ TAO_FaultTolerance.pc.in
+
+
+## Makefile.HTIOP.am
+
+if !BUILD_ACE_FOR_TAO
+
+BUILT_SOURCES += \
+ HTIOPC.cpp \
+ HTIOPC.h \
+ HTIOPC.inl \
+ HTIOPS.h \
+ HTIOPS.inl \
+ HTIOPS_T.cpp \
+ HTIOPS_T.h \
+ HTIOPS_T.inl
+
+CLEANFILES += \
+ HTIOP-stamp \
+ HTIOPC.cpp \
+ HTIOPC.h \
+ HTIOPC.inl \
+ HTIOPS.h \
+ HTIOPS.inl \
+ HTIOPS_T.cpp \
+ HTIOPS_T.h \
+ HTIOPS_T.inl
+
+HTIOPC.cpp HTIOPC.h HTIOPC.inl HTIOPS.h HTIOPS.inl HTIOPS_T.cpp HTIOPS_T.h HTIOPS_T.inl: HTIOP-stamp
+
+HTIOP-stamp: $(srcdir)/HTIOP.idl $(TAO_IDL_DEP)
+ $(TAO_IDL) $(TAO_IDLFLAGS) -I$(TAO_ROOT)/orbsvcs -GT -Wb,versioning_begin=TAO_BEGIN_VERSIONED_NAMESPACE_DECL -Wb,versioning_end=TAO_END_VERSIONED_NAMESPACE_DECL -Wb,export_macro=HTIOP_Export -Wb,export_include=orbsvcs/HTIOP/HTIOP_Export.h $(srcdir)/HTIOP.idl
+ @touch $@
+
+lib_LTLIBRARIES += libTAO_HTIOP.la
+
+libTAO_HTIOP_la_CPPFLAGS = \
+ -I$(ACE_ROOT) \
+ -I$(ACE_BUILDDIR) \
+ -I$(ACE_ROOT)/protocols \
+ -I$(TAO_ROOT) \
+ -I$(TAO_BUILDDIR) \
+ -I$(TAO_ROOT)/orbsvcs \
+ -I$(TAO_BUILDDIR)/orbsvcs \
+ -DHTIOP_BUILD_DLL
+
+libTAO_HTIOP_la_SOURCES = \
+ HTIOP/HTIOP_Acceptor.cpp \
+ HTIOP/HTIOP_Acceptor_Impl.cpp \
+ HTIOP/HTIOP_Completion_Handler.cpp \
+ HTIOP/HTIOP_Connection_Handler.cpp \
+ HTIOP/HTIOP_Connector.cpp \
+ HTIOP/HTIOP_Connector_Impl.cpp \
+ HTIOP/HTIOP_Endpoint.cpp \
+ HTIOP/HTIOP_Factory.cpp \
+ HTIOP/HTIOP_Profile.cpp \
+ HTIOP/HTIOP_Transport.cpp \
+ HTIOP/htiop_endpointsC.cpp \
+ HTIOPC.cpp
+
+libTAO_HTIOP_la_LDFLAGS = \
+ -version-number @TAO_MAJOR@:@TAO_MINOR@:@TAO_BETA@
+
+libTAO_HTIOP_la_LIBADD = \
+ $(TAO_BUILDDIR)/tao/libTAO_AnyTypeCode.la \
+ $(TAO_BUILDDIR)/tao/libTAO.la \
+ $(ACE_BUILDDIR)/protocols/ace/HTBP/libACE_HTBP.la \
+ $(ACE_BUILDDIR)/ace/libACE.la
+
+nobase_include_HEADERS += \
+ HTIOP.idl \
+ HTIOP/HTIOP_Acceptor.h \
+ HTIOP/HTIOP_Acceptor.i \
+ HTIOP/HTIOP_Acceptor_Impl.h \
+ HTIOP/HTIOP_Completion_Handler.h \
+ HTIOP/HTIOP_Connection_Handler.h \
+ HTIOP/HTIOP_Connector.h \
+ HTIOP/HTIOP_Connector_Impl.h \
+ HTIOP/HTIOP_Endpoint.h \
+ HTIOP/HTIOP_Endpoint.i \
+ HTIOP/HTIOP_Factory.h \
+ HTIOP/HTIOP_Profile.h \
+ HTIOP/HTIOP_Transport.h \
+ HTIOP/htiop_endpoints.pidl \
+ HTIOP/htiop_endpointsC.h \
+ HTIOPC.h \
+ HTIOPC.inl \
+ HTIOPS.h \
+ HTIOPS.inl \
+ HTIOPS_T.cpp \
+ HTIOPS_T.h \
+ HTIOPS_T.inl
+
+endif !BUILD_ACE_FOR_TAO
+
+## Makefile.IFRService.am
+
+if !BUILD_ACE_FOR_TAO
+if !BUILD_MINIMUM_CORBA
+
+lib_LTLIBRARIES += libTAO_IFRService.la
+
+libTAO_IFRService_la_CPPFLAGS = \
+ -I$(ACE_ROOT) \
+ -I$(ACE_BUILDDIR) \
+ -I$(TAO_ROOT) \
+ -I$(TAO_BUILDDIR) \
+ -I$(TAO_ROOT)/orbsvcs \
+ -I$(TAO_BUILDDIR)/orbsvcs \
+ -DTAO_IFRSERVICE_BUILD_DLL
+
+libTAO_IFRService_la_SOURCES = \
+ IFRService/AbstractInterfaceDef_i.cpp \
+ IFRService/AliasDef_i.cpp \
+ IFRService/ArrayDef_i.cpp \
+ IFRService/AttributeDef_i.cpp \
+ IFRService/ComponentContainer_i.cpp \
+ IFRService/ComponentDef_i.cpp \
+ IFRService/ComponentModuleDef_i.cpp \
+ IFRService/ComponentRepository_i.cpp \
+ IFRService/ConstantDef_i.cpp \
+ IFRService/ConsumesDef_i.cpp \
+ IFRService/Contained_i.cpp \
+ IFRService/Container_i.cpp \
+ IFRService/EmitsDef_i.cpp \
+ IFRService/EnumDef_i.cpp \
+ IFRService/EventDef_i.cpp \
+ IFRService/EventPortDef_i.cpp \
+ IFRService/ExceptionDef_i.cpp \
+ IFRService/ExtAbstractInterfaceDef_i.cpp \
+ IFRService/ExtAttributeDef_i.cpp \
+ IFRService/ExtInterfaceDef_i.cpp \
+ IFRService/ExtLocalInterfaceDef_i.cpp \
+ IFRService/ExtValueDef_i.cpp \
+ IFRService/FactoryDef_i.cpp \
+ IFRService/FinderDef_i.cpp \
+ IFRService/FixedDef_i.cpp \
+ IFRService/HomeDef_i.cpp \
+ IFRService/IDLType_i.cpp \
+ IFRService/IFR_BaseS.cpp \
+ IFRService/IFR_BasicS.cpp \
+ IFRService/IFR_ComponentsS.cpp \
+ IFRService/IFR_ExtendedS.cpp \
+ IFRService/IFR_Service_Loader.cpp \
+ IFRService/IFR_Service_Utils.cpp \
+ IFRService/IRObject_i.cpp \
+ IFRService/InterfaceAttrExtension_i.cpp \
+ IFRService/InterfaceDef_i.cpp \
+ IFRService/LocalInterfaceDef_i.cpp \
+ IFRService/ModuleDef_i.cpp \
+ IFRService/NativeDef_i.cpp \
+ IFRService/OperationDef_i.cpp \
+ IFRService/Options.cpp \
+ IFRService/PrimitiveDef_i.cpp \
+ IFRService/ProvidesDef_i.cpp \
+ IFRService/PublishesDef_i.cpp \
+ IFRService/RecursDef_i.cpp \
+ IFRService/Repository_i.cpp \
+ IFRService/SequenceDef_i.cpp \
+ IFRService/StringDef_i.cpp \
+ IFRService/StructDef_i.cpp \
+ IFRService/TypedefDef_i.cpp \
+ IFRService/UnionDef_i.cpp \
+ IFRService/UsesDef_i.cpp \
+ IFRService/ValueBoxDef_i.cpp \
+ IFRService/ValueDef_i.cpp \
+ IFRService/ValueMemberDef_i.cpp \
+ IFRService/WstringDef_i.cpp
+
+libTAO_IFRService_la_LDFLAGS = \
+ -version-number @TAO_MAJOR@:@TAO_MINOR@:@TAO_BETA@
+
+libTAO_IFRService_la_LIBADD = \
+ $(TAO_BUILDDIR)/tao/libTAO_IORTable.la \
+ libTAO_Svc_Utils.la \
+ $(TAO_BUILDDIR)/tao/libTAO_PortableServer.la \
+ $(TAO_BUILDDIR)/tao/libTAO_TypeCodeFactory.la \
+ $(TAO_BUILDDIR)/tao/libTAO_IFR_Client.la \
+ $(TAO_BUILDDIR)/tao/libTAO_AnyTypeCode.la \
+ $(TAO_BUILDDIR)/tao/libTAO.la \
+ $(ACE_BUILDDIR)/ace/libACE.la
+
+nobase_include_HEADERS += \
+ IFRService/AbstractInterfaceDef_i.h \
+ IFRService/AliasDef_i.h \
+ IFRService/ArrayDef_i.h \
+ IFRService/AttributeDef_i.h \
+ IFRService/ComponentContainer_i.h \
+ IFRService/ComponentDef_i.h \
+ IFRService/ComponentModuleDef_i.h \
+ IFRService/ComponentRepository_i.h \
+ IFRService/ConstantDef_i.h \
+ IFRService/ConsumesDef_i.h \
+ IFRService/Contained_i.h \
+ IFRService/Container_i.h \
+ IFRService/EmitsDef_i.h \
+ IFRService/EnumDef_i.h \
+ IFRService/EventDef_i.h \
+ IFRService/EventPortDef_i.h \
+ IFRService/ExceptionDef_i.h \
+ IFRService/ExtAbstractInterfaceDef_i.h \
+ IFRService/ExtAttributeDef_i.h \
+ IFRService/ExtInterfaceDef_i.h \
+ IFRService/ExtLocalInterfaceDef_i.h \
+ IFRService/ExtValueDef_i.h \
+ IFRService/FactoryDef_i.h \
+ IFRService/FinderDef_i.h \
+ IFRService/FixedDef_i.h \
+ IFRService/HomeDef_i.h \
+ IFRService/IDLType_i.h \
+ IFRService/IFR_BaseS.h \
+ IFRService/IFR_BaseS.inl \
+ IFRService/IFR_BaseS_T.cpp \
+ IFRService/IFR_BasicS.h \
+ IFRService/IFR_BasicS.inl \
+ IFRService/IFR_BasicS_T.cpp \
+ IFRService/IFR_ComponentsS.h \
+ IFRService/IFR_ComponentsS.inl \
+ IFRService/IFR_ComponentsS_T.cpp \
+ IFRService/IFR_ExtendedS.h \
+ IFRService/IFR_ExtendedS.inl \
+ IFRService/IFR_ExtendedS_T.cpp \
+ IFRService/IFR_Service_Loader.h \
+ IFRService/IFR_Service_Utils.h \
+ IFRService/IFR_Service_Utils_T.cpp \
+ IFRService/IRObject_i.h \
+ IFRService/InterfaceAttrExtension_i.h \
+ IFRService/InterfaceDef_i.h \
+ IFRService/LocalInterfaceDef_i.h \
+ IFRService/ModuleDef_i.h \
+ IFRService/NativeDef_i.h \
+ IFRService/OperationDef_i.h \
+ IFRService/Options.h \
+ IFRService/PrimitiveDef_i.h \
+ IFRService/ProvidesDef_i.h \
+ IFRService/PublishesDef_i.h \
+ IFRService/RecursDef_i.h \
+ IFRService/Repository_i.h \
+ IFRService/SequenceDef_i.h \
+ IFRService/StringDef_i.h \
+ IFRService/StructDef_i.h \
+ IFRService/TypedefDef_i.h \
+ IFRService/UnionDef_i.h \
+ IFRService/UsesDef_i.h \
+ IFRService/ValueBoxDef_i.h \
+ IFRService/ValueDef_i.h \
+ IFRService/ValueMemberDef_i.h \
+ IFRService/WstringDef_i.h
+
+endif !BUILD_MINIMUM_CORBA
+endif !BUILD_ACE_FOR_TAO
+
+EXTRA_DIST += \
+ IFRService.rc
+
+
+## Makefile.RTCORBAEvent.am
+
+if BUILD_CORBA_MESSAGING
+if BUILD_RT_CORBA
+if !BUILD_ACE_FOR_TAO
+
+lib_LTLIBRARIES += libTAO_RTCORBAEvent.la
+
+libTAO_RTCORBAEvent_la_CPPFLAGS = \
+ -I$(ACE_ROOT) \
+ -I$(ACE_BUILDDIR) \
+ -I$(TAO_ROOT) \
+ -I$(TAO_BUILDDIR) \
+ -I$(TAO_ROOT)/orbsvcs \
+ -I$(TAO_BUILDDIR)/orbsvcs \
+ -DTAO_RTCORBAEVENT_BUILD_DLL
+
+libTAO_RTCORBAEvent_la_SOURCES = \
+ Event/EC_RTCORBA_Dispatching.cpp \
+ Event/EC_RTCORBA_Factory.cpp
+
+libTAO_RTCORBAEvent_la_LDFLAGS = \
+ -version-number @TAO_MAJOR@:@TAO_MINOR@:@TAO_BETA@
+
+libTAO_RTCORBAEvent_la_LIBADD = \
+ $(TAO_BUILDDIR)/tao/libTAO_RTPortableServer.la \
+ $(TAO_BUILDDIR)/tao/libTAO_RTCORBA.la \
+ libTAO_RTEvent_Serv.la \
+ libTAO_RTEvent_Skel.la \
+ libTAO_RTEvent.la \
+ libTAO_Svc_Utils.la \
+ $(TAO_BUILDDIR)/tao/libTAO_Messaging.la \
+ $(TAO_BUILDDIR)/tao/libTAO_PI.la \
+ $(TAO_BUILDDIR)/tao/libTAO_CodecFactory.la \
+ $(TAO_BUILDDIR)/tao/libTAO_PortableServer.la \
+ $(TAO_BUILDDIR)/tao/libTAO_Valuetype.la \
+ $(TAO_BUILDDIR)/tao/libTAO_AnyTypeCode.la \
+ $(TAO_BUILDDIR)/tao/libTAO.la \
+ $(ACE_BUILDDIR)/ace/libACE.la
+
+nobase_include_HEADERS += \
+ Event/EC_RTCORBA_Dispatching.h \
+ Event/EC_RTCORBA_Factory.h
+
+endif !BUILD_ACE_FOR_TAO
+endif BUILD_RT_CORBA
+endif BUILD_CORBA_MESSAGING
+
+## Makefile.RTEventLogAdmin_IDL.am
+
+if BUILD_CORBA_MESSAGING
+
+BUILT_SOURCES += \
+ RTEventLogAdminC.cpp \
+ RTEventLogAdminC.h \
+ RTEventLogAdminC.inl \
+ RTEventLogAdminS.cpp \
+ RTEventLogAdminS.h \
+ RTEventLogAdminS.inl \
+ RTEventLogAdminS_T.cpp \
+ RTEventLogAdminS_T.h \
+ RTEventLogAdminS_T.inl
+
+CLEANFILES += \
+ RTEventLogAdmin-stamp \
+ RTEventLogAdminC.cpp \
+ RTEventLogAdminC.h \
+ RTEventLogAdminC.inl \
+ RTEventLogAdminS.cpp \
+ RTEventLogAdminS.h \
+ RTEventLogAdminS.inl \
+ RTEventLogAdminS_T.cpp \
+ RTEventLogAdminS_T.h \
+ RTEventLogAdminS_T.inl
+
+RTEventLogAdminC.cpp RTEventLogAdminC.h RTEventLogAdminC.inl RTEventLogAdminS.cpp RTEventLogAdminS.h RTEventLogAdminS.inl RTEventLogAdminS_T.cpp RTEventLogAdminS_T.h RTEventLogAdminS_T.inl: RTEventLogAdmin-stamp
+
+RTEventLogAdmin-stamp: $(srcdir)/RTEventLogAdmin.idl $(TAO_IDL_DEP)
+ $(TAO_IDL) $(TAO_IDLFLAGS) -I$(TAO_ROOT)/orbsvcs -GT -Wb,versioning_begin=TAO_BEGIN_VERSIONED_NAMESPACE_DECL -Wb,versioning_end=TAO_END_VERSIONED_NAMESPACE_DECL -Wb,stub_export_macro=TAO_RTEventLog_Export -Wb,stub_export_include=orbsvcs/Log/rteventlog_export.h -Wb,skel_export_macro=TAO_RTEventLog_Skel_Export -Wb,skel_export_include=orbsvcs/Log/rteventlog_skel_export.h $(srcdir)/RTEventLogAdmin.idl
+ @touch $@
+
+
+nobase_include_HEADERS += \
+ RTEventLogAdmin.idl
+
+endif BUILD_CORBA_MESSAGING
+
+## Makefile.RTEventLogAdmin.am
+
+if BUILD_CORBA_MESSAGING
+
+lib_LTLIBRARIES += libTAO_RTEventLogAdmin.la
+
+libTAO_RTEventLogAdmin_la_CPPFLAGS = \
+ -I$(ACE_ROOT) \
+ -I$(ACE_BUILDDIR) \
+ -I$(TAO_ROOT) \
+ -I$(TAO_BUILDDIR) \
+ -I$(TAO_ROOT)/orbsvcs \
+ -I$(TAO_BUILDDIR)/orbsvcs \
+ -DTAO_RTEVENTLOG_BUILD_DLL
+
+libTAO_RTEventLogAdmin_la_SOURCES = \
+ RTEventLogAdminC.cpp
+
+libTAO_RTEventLogAdmin_la_LDFLAGS = \
+ -version-number @TAO_MAJOR@:@TAO_MINOR@:@TAO_BETA@
+
+libTAO_RTEventLogAdmin_la_LIBADD = \
+ libTAO_RTEvent.la \
+ libTAO_Svc_Utils.la \
+ $(TAO_BUILDDIR)/tao/libTAO_Messaging.la \
+ $(TAO_BUILDDIR)/tao/libTAO_PI.la \
+ $(TAO_BUILDDIR)/tao/libTAO_CodecFactory.la \
+ $(TAO_BUILDDIR)/tao/libTAO_PortableServer.la \
+ $(TAO_BUILDDIR)/tao/libTAO_Valuetype.la \
+ libTAO_DsLogAdmin.la \
+ $(TAO_BUILDDIR)/tao/libTAO_AnyTypeCode.la \
+ $(TAO_BUILDDIR)/tao/libTAO.la \
+ $(ACE_BUILDDIR)/ace/libACE.la
+
+nobase_include_HEADERS += \
+ Log/rteventlog_export.h \
+ RTEventLogAdminC.h \
+ RTEventLogAdminC.inl
+
+pkgconfig_DATA += \
+ TAO_RTEventLogAdmin.pc
+
+CLEANFILES += \
+ TAO_RTEventLogAdmin.pc
+
+TAO_RTEventLogAdmin.pc: ${top_builddir}/config.status ${srcdir}/TAO_RTEventLogAdmin.pc.in
+ ${top_builddir}/config.status --file $@:${srcdir}/TAO_RTEventLogAdmin.pc.in
+
+endif BUILD_CORBA_MESSAGING
+
+EXTRA_DIST += \
+ TAO_RTEventLogAdmin.pc.in
+
+
+## Makefile.RTSched.am
+
+BUILT_SOURCES += \
+ RtecSchedulerC.cpp \
+ RtecSchedulerC.h \
+ RtecSchedulerC.inl \
+ RtecSchedulerS.cpp \
+ RtecSchedulerS.h \
+ RtecSchedulerS.inl \
+ RtecSchedulerS_T.cpp \
+ RtecSchedulerS_T.h \
+ RtecSchedulerS_T.inl
+
+CLEANFILES += \
+ RtecScheduler-stamp \
+ RtecSchedulerC.cpp \
+ RtecSchedulerC.h \
+ RtecSchedulerC.inl \
+ RtecSchedulerS.cpp \
+ RtecSchedulerS.h \
+ RtecSchedulerS.inl \
+ RtecSchedulerS_T.cpp \
+ RtecSchedulerS_T.h \
+ RtecSchedulerS_T.inl
+
+RtecSchedulerC.cpp RtecSchedulerC.h RtecSchedulerC.inl RtecSchedulerS.cpp RtecSchedulerS.h RtecSchedulerS.inl RtecSchedulerS_T.cpp RtecSchedulerS_T.h RtecSchedulerS_T.inl: RtecScheduler-stamp
+
+RtecScheduler-stamp: $(srcdir)/RtecScheduler.idl $(TAO_IDL_DEP)
+ $(TAO_IDL) $(TAO_IDLFLAGS) -I$(TAO_ROOT)/orbsvcs -GT -Wb,versioning_begin=TAO_BEGIN_VERSIONED_NAMESPACE_DECL -Wb,versioning_end=TAO_END_VERSIONED_NAMESPACE_DECL -Wb,export_macro=TAO_RTSched_Export -Wb,export_include=orbsvcs/Sched/sched_export.h $(srcdir)/RtecScheduler.idl
+ @touch $@
+
+lib_LTLIBRARIES += libTAO_RTSched.la
+
+libTAO_RTSched_la_CPPFLAGS = \
+ -I$(ACE_ROOT) \
+ -I$(ACE_BUILDDIR) \
+ -I$(TAO_ROOT) \
+ -I$(TAO_BUILDDIR) \
+ -I$(TAO_ROOT)/orbsvcs \
+ -I$(TAO_BUILDDIR)/orbsvcs \
+ -DTAO_RTSCHED_BUILD_DLL
+
+libTAO_RTSched_la_SOURCES = \
+ RtecSchedulerC.cpp \
+ RtecSchedulerS.cpp \
+ Runtime_Scheduler.cpp \
+ Sched/Config_Scheduler.cpp \
+ Sched/DynSched.cpp \
+ Sched/Reconfig_Sched_Utils.cpp \
+ Sched/SchedEntry.cpp \
+ Sched/Scheduler.cpp \
+ Sched/Scheduler_Generic.cpp \
+ Sched/Strategy_Scheduler.cpp \
+ Scheduler_Factory.cpp \
+ Scheduler_Utilities.cpp
+
+libTAO_RTSched_la_LDFLAGS = \
+ -version-number @TAO_MAJOR@:@TAO_MINOR@:@TAO_BETA@
+
+libTAO_RTSched_la_LIBADD = \
+ libTAO_Svc_Utils.la \
+ $(TAO_BUILDDIR)/tao/libTAO_PortableServer.la \
+ libTAO_CosNaming.la \
+ $(TAO_BUILDDIR)/tao/libTAO_AnyTypeCode.la \
+ $(TAO_BUILDDIR)/tao/libTAO.la \
+ $(ACE_BUILDDIR)/ace/libACE.la
+
+nobase_include_HEADERS += \
+ RtecScheduler.idl \
+ RtecSchedulerC.h \
+ RtecSchedulerC.inl \
+ RtecSchedulerS.h \
+ RtecSchedulerS.inl \
+ RtecSchedulerS_T.cpp \
+ RtecSchedulerS_T.h \
+ RtecSchedulerS_T.inl \
+ Runtime_Scheduler.h \
+ Sched/Config_Scheduler.h \
+ Sched/DynSched.h \
+ Sched/DynSched.i \
+ Sched/Reconfig_Sched_Utils.h \
+ Sched/Reconfig_Sched_Utils_T.cpp \
+ Sched/SchedEntry.h \
+ Sched/SchedEntry.i \
+ Sched/Scheduler.h \
+ Sched/Scheduler_Generic.h \
+ Sched/Strategy_Scheduler.h \
+ Scheduler_Factory.h \
+ Scheduler_Factory.i \
+ Scheduler_Utilities.h \
+ Scheduler_Utilities.i
+
+EXTRA_DIST += \
+ RTSched.rc
+
+
+## Makefile.RTEventLogAdmin_Skel.am
+
+if BUILD_CORBA_MESSAGING
+
+lib_LTLIBRARIES += libTAO_RTEventLogAdmin_Skel.la
+
+libTAO_RTEventLogAdmin_Skel_la_CPPFLAGS = \
+ -I$(ACE_ROOT) \
+ -I$(ACE_BUILDDIR) \
+ -I$(TAO_ROOT) \
+ -I$(TAO_BUILDDIR) \
+ -I$(TAO_ROOT)/orbsvcs \
+ -I$(TAO_BUILDDIR)/orbsvcs \
+ -DTAO_RTEVENTLOG_SKEL_BUILD_DLL
+
+libTAO_RTEventLogAdmin_Skel_la_SOURCES = \
+ RTEventLogAdminS.cpp
+
+libTAO_RTEventLogAdmin_Skel_la_LDFLAGS = \
+ -version-number @TAO_MAJOR@:@TAO_MINOR@:@TAO_BETA@
+
+libTAO_RTEventLogAdmin_Skel_la_LIBADD = \
+ libTAO_RTEvent_Skel.la \
+ libTAO_DsLogAdmin_Skel.la \
+ libTAO_RTEventLogAdmin.la \
+ libTAO_RTEvent.la \
+ libTAO_Svc_Utils.la \
+ $(TAO_BUILDDIR)/tao/libTAO_Messaging.la \
+ $(TAO_BUILDDIR)/tao/libTAO_PI.la \
+ $(TAO_BUILDDIR)/tao/libTAO_CodecFactory.la \
+ $(TAO_BUILDDIR)/tao/libTAO_PortableServer.la \
+ $(TAO_BUILDDIR)/tao/libTAO_Valuetype.la \
+ libTAO_DsLogAdmin.la \
+ $(TAO_BUILDDIR)/tao/libTAO_AnyTypeCode.la \
+ $(TAO_BUILDDIR)/tao/libTAO.la \
+ $(ACE_BUILDDIR)/ace/libACE.la
+
+nobase_include_HEADERS += \
+ Log/rteventlog_skel_export.h \
+ RTEventLogAdminS.h \
+ RTEventLogAdminS.inl \
+ RTEventLogAdminS_T.cpp \
+ RTEventLogAdminS_T.h \
+ RTEventLogAdminS_T.inl
+
+pkgconfig_DATA += \
+ TAO_RTEventLogAdmin_Skel.pc
+
+CLEANFILES += \
+ TAO_RTEventLogAdmin_Skel.pc
+
+TAO_RTEventLogAdmin_Skel.pc: ${top_builddir}/config.status ${srcdir}/TAO_RTEventLogAdmin_Skel.pc.in
+ ${top_builddir}/config.status --file $@:${srcdir}/TAO_RTEventLogAdmin_Skel.pc.in
+
+endif BUILD_CORBA_MESSAGING
+
+EXTRA_DIST += \
+ TAO_RTEventLogAdmin_Skel.pc.in
+
+
+## Makefile.RTEventLogAdmin_Serv.am
+
+if BUILD_CORBA_MESSAGING
+if !BUILD_ACE_FOR_TAO
+
+lib_LTLIBRARIES += libTAO_RTEventLogAdmin_Serv.la
+
+libTAO_RTEventLogAdmin_Serv_la_CPPFLAGS = \
+ -I$(ACE_ROOT) \
+ -I$(ACE_BUILDDIR) \
+ -I$(TAO_ROOT) \
+ -I$(TAO_BUILDDIR) \
+ -I$(TAO_ROOT)/orbsvcs \
+ -I$(TAO_BUILDDIR)/orbsvcs \
+ -DTAO_RTEVENTLOG_SERV_BUILD_DLL
+
+libTAO_RTEventLogAdmin_Serv_la_SOURCES = \
+ Log/RTEventLogConsumer.cpp \
+ Log/RTEventLogFactory_i.cpp \
+ Log/RTEventLogNotification.cpp \
+ Log/RTEventLog_i.cpp
+
+libTAO_RTEventLogAdmin_Serv_la_LDFLAGS = \
+ -version-number @TAO_MAJOR@:@TAO_MINOR@:@TAO_BETA@
+
+libTAO_RTEventLogAdmin_Serv_la_LIBADD = \
+ libTAO_RTSched.la \
+ libTAO_CosNaming.la \
+ libTAO_RTEvent_Serv.la \
+ libTAO_DsLogAdmin_Serv.la \
+ $(TAO_BUILDDIR)/tao/libTAO_Utils.la \
+ libTAO_ETCL.la \
+ $(TAO_BUILDDIR)/tao/libTAO_DynamicAny.la \
+ libTAO_RTEventLogAdmin_Skel.la \
+ libTAO_RTEvent_Skel.la \
+ libTAO_DsLogAdmin_Skel.la \
+ libTAO_RTEventLogAdmin.la \
+ libTAO_RTEvent.la \
+ libTAO_Svc_Utils.la \
+ $(TAO_BUILDDIR)/tao/libTAO_Messaging.la \
+ $(TAO_BUILDDIR)/tao/libTAO_PI.la \
+ $(TAO_BUILDDIR)/tao/libTAO_CodecFactory.la \
+ $(TAO_BUILDDIR)/tao/libTAO_PortableServer.la \
+ $(TAO_BUILDDIR)/tao/libTAO_Valuetype.la \
+ libTAO_DsLogAdmin.la \
+ $(TAO_BUILDDIR)/tao/libTAO_AnyTypeCode.la \
+ $(TAO_BUILDDIR)/tao/libTAO.la \
+ $(ACE_BUILDDIR)/ace/libACE.la
+
+nobase_include_HEADERS += \
+ Log/RTEventLogConsumer.h \
+ Log/RTEventLogFactory_i.h \
+ Log/RTEventLogNotification.h \
+ Log/RTEventLog_i.h \
+ Log/rteventlog_serv_export.h
+
+pkgconfig_DATA += \
+ TAO_RTEventLogAdmin_Serv.pc
+
+CLEANFILES += \
+ TAO_RTEventLogAdmin_Serv.pc
+
+TAO_RTEventLogAdmin_Serv.pc: ${top_builddir}/config.status ${srcdir}/TAO_RTEventLogAdmin_Serv.pc.in
+ ${top_builddir}/config.status --file $@:${srcdir}/TAO_RTEventLogAdmin_Serv.pc.in
+
+endif !BUILD_ACE_FOR_TAO
+endif BUILD_CORBA_MESSAGING
+
+EXTRA_DIST += \
+ TAO_RTEventLogAdmin_Serv.pc.in
+
+
+## Makefile.RTKokyuEvent.am
+
+if BUILD_CORBA_MESSAGING
+if !BUILD_ACE_FOR_TAO
+
+lib_LTLIBRARIES += libTAO_RTKokyuEvent.la
+
+libTAO_RTKokyuEvent_la_CPPFLAGS = \
+ -I$(ACE_ROOT) \
+ -I$(ACE_BUILDDIR) \
+ -I$(TAO_ROOT) \
+ -I$(TAO_BUILDDIR) \
+ -I$(TAO_ROOT)/orbsvcs \
+ -I$(TAO_BUILDDIR)/orbsvcs \
+ -I$(ACE_ROOT)/Kokyu \
+ -DTAO_RTKOKYUEVENT_BUILD_DLL
+
+libTAO_RTKokyuEvent_la_SOURCES = \
+ Event/EC_Kokyu_Dispatching.cpp \
+ Event/EC_Kokyu_Factory.cpp \
+ Event/EC_Kokyu_Filter.cpp \
+ Event/EC_Kokyu_Filter_Builder.cpp \
+ Event/EC_Kokyu_Scheduling.cpp
+
+libTAO_RTKokyuEvent_la_LDFLAGS = \
+ -version-number @TAO_MAJOR@:@TAO_MINOR@:@TAO_BETA@
+
+libTAO_RTKokyuEvent_la_LIBADD = \
+ $(ACE_BUILDDIR)/Kokyu/libKokyu.la \
+ libTAO_RTSched.la \
+ libTAO_CosNaming.la \
+ libTAO_RTEvent_Serv.la \
+ libTAO_RTEvent_Skel.la \
+ libTAO_RTEvent.la \
+ libTAO_Svc_Utils.la \
+ $(TAO_BUILDDIR)/tao/libTAO_Messaging.la \
+ $(TAO_BUILDDIR)/tao/libTAO_PI.la \
+ $(TAO_BUILDDIR)/tao/libTAO_CodecFactory.la \
+ $(TAO_BUILDDIR)/tao/libTAO_PortableServer.la \
+ $(TAO_BUILDDIR)/tao/libTAO_Valuetype.la \
+ $(TAO_BUILDDIR)/tao/libTAO_AnyTypeCode.la \
+ $(TAO_BUILDDIR)/tao/libTAO.la \
+ $(ACE_BUILDDIR)/ace/libACE.la
+
+nobase_include_HEADERS += \
+ Event/EC_Kokyu_Dispatching.h \
+ Event/EC_Kokyu_Dispatching.i \
+ Event/EC_Kokyu_Factory.h \
+ Event/EC_Kokyu_Factory.i \
+ Event/EC_Kokyu_Filter.h \
+ Event/EC_Kokyu_Filter_Builder.h \
+ Event/EC_Kokyu_Filter_Builder.i \
+ Event/EC_Kokyu_Scheduling.h \
+ Event/EC_Kokyu_Scheduling.i
+
+endif !BUILD_ACE_FOR_TAO
+endif BUILD_CORBA_MESSAGING
+
+## Makefile.RTSchedEvent.am
+
+if BUILD_CORBA_MESSAGING
+if !BUILD_ACE_FOR_TAO
+
+lib_LTLIBRARIES += libTAO_RTSchedEvent.la
+
+libTAO_RTSchedEvent_la_CPPFLAGS = \
+ -I$(ACE_ROOT) \
+ -I$(ACE_BUILDDIR) \
+ -I$(TAO_ROOT) \
+ -I$(TAO_BUILDDIR) \
+ -I$(TAO_ROOT)/orbsvcs \
+ -I$(TAO_BUILDDIR)/orbsvcs \
+ -DTAO_RTSCHEDEVENT_BUILD_DLL
+
+libTAO_RTSchedEvent_la_SOURCES = \
+ Event/EC_Gateway_Sched.cpp \
+ Event/EC_Priority_Dispatching.cpp \
+ Event/EC_Priority_Scheduling.cpp \
+ Event/EC_Sched_Factory.cpp \
+ Event/EC_Sched_Filter.cpp \
+ Event/EC_Sched_Filter_Builder.cpp
+
+libTAO_RTSchedEvent_la_LDFLAGS = \
+ -version-number @TAO_MAJOR@:@TAO_MINOR@:@TAO_BETA@
+
+libTAO_RTSchedEvent_la_LIBADD = \
+ libTAO_RTSched.la \
+ libTAO_CosNaming.la \
+ libTAO_RTEvent_Serv.la \
+ libTAO_RTEvent_Skel.la \
+ libTAO_RTEvent.la \
+ libTAO_Svc_Utils.la \
+ $(TAO_BUILDDIR)/tao/libTAO_Messaging.la \
+ $(TAO_BUILDDIR)/tao/libTAO_PI.la \
+ $(TAO_BUILDDIR)/tao/libTAO_CodecFactory.la \
+ $(TAO_BUILDDIR)/tao/libTAO_PortableServer.la \
+ $(TAO_BUILDDIR)/tao/libTAO_Valuetype.la \
+ $(TAO_BUILDDIR)/tao/libTAO_AnyTypeCode.la \
+ $(TAO_BUILDDIR)/tao/libTAO.la \
+ $(ACE_BUILDDIR)/ace/libACE.la
+
+nobase_include_HEADERS += \
+ Event/EC_Gateway_Sched.h \
+ Event/EC_Priority_Dispatching.h \
+ Event/EC_Priority_Scheduling.h \
+ Event/EC_Priority_Scheduling.i \
+ Event/EC_Sched_Factory.h \
+ Event/EC_Sched_Factory.i \
+ Event/EC_Sched_Filter.h \
+ Event/EC_Sched_Filter_Builder.h \
+ Event/EC_Sched_Filter_Builder.i
+
+endif !BUILD_ACE_FOR_TAO
+endif BUILD_CORBA_MESSAGING
+
+EXTRA_DIST += \
+ RTSchedEvent.rc
+
+
+## Makefile.RT_Notification.am
+
+if BUILD_RT_CORBA
+if !BUILD_MINIMUM_CORBA
+
+lib_LTLIBRARIES += libTAO_RT_Notification.la
+
+libTAO_RT_Notification_la_CPPFLAGS = \
+ -I$(ACE_ROOT) \
+ -I$(ACE_BUILDDIR) \
+ -I$(TAO_ROOT) \
+ -I$(TAO_BUILDDIR) \
+ -I$(TAO_ROOT)/orbsvcs \
+ -I$(TAO_BUILDDIR)/orbsvcs \
+ -DTAO_HAS_TYPED_EVENT_CHANNEL \
+ -DTAO_RT_NOTIFY_BUILD_DLL
+
+libTAO_RT_Notification_la_SOURCES = \
+ Notify/RT_Builder.cpp \
+ Notify/RT_Factory.cpp \
+ Notify/RT_Notify_Service.cpp \
+ Notify/RT_POA_Helper.cpp \
+ Notify/RT_Properties.cpp \
+ Notify/Structured/RT_StructuredProxyPushSupplier.cpp
+
+libTAO_RT_Notification_la_LDFLAGS = \
+ -version-number @TAO_MAJOR@:@TAO_MINOR@:@TAO_BETA@
+
+libTAO_RT_Notification_la_LIBADD = \
+ libTAO_CosNotification_Serv.la \
+ $(TAO_BUILDDIR)/tao/libTAO_DynamicAny.la \
+ libTAO_ETCL.la \
+ libTAO_CosNotification_Skel.la \
+ libTAO_CosEvent_Skel.la \
+ libTAO_CosNotification.la \
+ libTAO_CosEvent.la \
+ libTAO_Svc_Utils.la \
+ $(TAO_BUILDDIR)/tao/libTAO_PortableServer.la \
+ $(TAO_BUILDDIR)/tao/libTAO_RTCORBA.la \
+ $(TAO_BUILDDIR)/tao/libTAO_PI.la \
+ $(TAO_BUILDDIR)/tao/libTAO_CodecFactory.la \
+ $(TAO_BUILDDIR)/tao/libTAO_AnyTypeCode.la \
+ $(TAO_BUILDDIR)/tao/libTAO.la \
+ $(ACE_BUILDDIR)/ace/libACE.la
+
+nobase_include_HEADERS += \
+ Notify/RT_Builder.h \
+ Notify/RT_Factory.h \
+ Notify/RT_Notify_Service.h \
+ Notify/RT_POA_Helper.h \
+ Notify/RT_Properties.h \
+ Notify/RT_Properties.inl \
+ Notify/Structured/RT_StructuredProxyPushSupplier.h
+
+endif !BUILD_MINIMUM_CORBA
+endif BUILD_RT_CORBA
+
+EXTRA_DIST += \
+ RT_Notification.rc
+
+
+## Makefile.Security.am
+
+if BUILD_CORBA_MESSAGING
+if BUILD_INTERCEPTORS
+
+BUILT_SOURCES += \
+ CSIC.cpp \
+ CSIC.h \
+ CSIC.inl \
+ CSIS.inl \
+ CSIS_T.inl
+
+CLEANFILES += \
+ CSI-stamp \
+ CSIC.cpp \
+ CSIC.h \
+ CSIC.inl \
+ CSIS.inl \
+ CSIS_T.inl
+
+CSIC.cpp CSIC.h CSIC.inl CSIS.inl CSIS_T.inl: CSI-stamp
+
+CSI-stamp: $(srcdir)/CSI.idl $(TAO_IDL_DEP)
+ $(TAO_IDL) $(TAO_IDLFLAGS) -I$(TAO_ROOT)/orbsvcs -GT -Wb,versioning_begin=TAO_BEGIN_VERSIONED_NAMESPACE_DECL -Wb,versioning_end=TAO_END_VERSIONED_NAMESPACE_DECL -Wb,export_macro=TAO_Security_Export -Wb,export_include=orbsvcs/Security/security_export.h $(srcdir)/CSI.idl
+ @touch $@
+
+BUILT_SOURCES += \
+ CSIIOPC.cpp \
+ CSIIOPC.h \
+ CSIIOPC.inl \
+ CSIIOPS.inl \
+ CSIIOPS_T.inl
+
+CLEANFILES += \
+ CSIIOP-stamp \
+ CSIIOPC.cpp \
+ CSIIOPC.h \
+ CSIIOPC.inl \
+ CSIIOPS.inl \
+ CSIIOPS_T.inl
+
+CSIIOPC.cpp CSIIOPC.h CSIIOPC.inl CSIIOPS.inl CSIIOPS_T.inl: CSIIOP-stamp
+
+CSIIOP-stamp: $(srcdir)/CSIIOP.idl $(TAO_IDL_DEP)
+ $(TAO_IDL) $(TAO_IDLFLAGS) -I$(TAO_ROOT)/orbsvcs -GT -Wb,versioning_begin=TAO_BEGIN_VERSIONED_NAMESPACE_DECL -Wb,versioning_end=TAO_END_VERSIONED_NAMESPACE_DECL -Wb,export_macro=TAO_Security_Export -Wb,export_include=orbsvcs/Security/security_export.h $(srcdir)/CSIIOP.idl
+ @touch $@
+
+BUILT_SOURCES += \
+ GSSUPC.cpp \
+ GSSUPC.h \
+ GSSUPC.inl \
+ GSSUPS.inl \
+ GSSUPS_T.inl
+
+CLEANFILES += \
+ GSSUP-stamp \
+ GSSUPC.cpp \
+ GSSUPC.h \
+ GSSUPC.inl \
+ GSSUPS.inl \
+ GSSUPS_T.inl
+
+GSSUPC.cpp GSSUPC.h GSSUPC.inl GSSUPS.inl GSSUPS_T.inl: GSSUP-stamp
+
+GSSUP-stamp: $(srcdir)/GSSUP.idl $(TAO_IDL_DEP)
+ $(TAO_IDL) $(TAO_IDLFLAGS) -I$(TAO_ROOT)/orbsvcs -GT -Wb,versioning_begin=TAO_BEGIN_VERSIONED_NAMESPACE_DECL -Wb,versioning_end=TAO_END_VERSIONED_NAMESPACE_DECL -Wb,export_macro=TAO_Security_Export -Wb,export_include=orbsvcs/Security/security_export.h $(srcdir)/GSSUP.idl
+ @touch $@
+
+BUILT_SOURCES += \
+ SecurityC.cpp \
+ SecurityC.h \
+ SecurityC.inl \
+ SecurityS.cpp \
+ SecurityS.h \
+ SecurityS.inl \
+ SecurityS_T.cpp \
+ SecurityS_T.inl
+
+CLEANFILES += \
+ Security-stamp \
+ SecurityC.cpp \
+ SecurityC.h \
+ SecurityC.inl \
+ SecurityS.cpp \
+ SecurityS.h \
+ SecurityS.inl \
+ SecurityS_T.cpp \
+ SecurityS_T.inl
+
+SecurityC.cpp SecurityC.h SecurityC.inl SecurityS.cpp SecurityS.h SecurityS.inl SecurityS_T.cpp SecurityS_T.inl: Security-stamp
+
+Security-stamp: $(srcdir)/Security.idl $(TAO_IDL_DEP)
+ $(TAO_IDL) $(TAO_IDLFLAGS) -I$(TAO_ROOT)/orbsvcs -GT -Wb,versioning_begin=TAO_BEGIN_VERSIONED_NAMESPACE_DECL -Wb,versioning_end=TAO_END_VERSIONED_NAMESPACE_DECL -Wb,export_macro=TAO_Security_Export -Wb,export_include=orbsvcs/Security/security_export.h $(srcdir)/Security.idl
+ @touch $@
+
+BUILT_SOURCES += \
+ SecurityLevel1C.cpp \
+ SecurityLevel1C.h \
+ SecurityLevel1C.inl \
+ SecurityLevel1S.cpp \
+ SecurityLevel1S.h \
+ SecurityLevel1S.inl \
+ SecurityLevel1S_T.cpp \
+ SecurityLevel1S_T.inl
+
+CLEANFILES += \
+ SecurityLevel1-stamp \
+ SecurityLevel1C.cpp \
+ SecurityLevel1C.h \
+ SecurityLevel1C.inl \
+ SecurityLevel1S.cpp \
+ SecurityLevel1S.h \
+ SecurityLevel1S.inl \
+ SecurityLevel1S_T.cpp \
+ SecurityLevel1S_T.inl
+
+SecurityLevel1C.cpp SecurityLevel1C.h SecurityLevel1C.inl SecurityLevel1S.cpp SecurityLevel1S.h SecurityLevel1S.inl SecurityLevel1S_T.cpp SecurityLevel1S_T.inl: SecurityLevel1-stamp
+
+SecurityLevel1-stamp: $(srcdir)/SecurityLevel1.idl $(TAO_IDL_DEP)
+ $(TAO_IDL) $(TAO_IDLFLAGS) -I$(TAO_ROOT)/orbsvcs -GT -Wb,versioning_begin=TAO_BEGIN_VERSIONED_NAMESPACE_DECL -Wb,versioning_end=TAO_END_VERSIONED_NAMESPACE_DECL -Wb,export_macro=TAO_Security_Export -Wb,export_include=orbsvcs/Security/security_export.h $(srcdir)/SecurityLevel1.idl
+ @touch $@
+
+BUILT_SOURCES += \
+ SecurityLevel2C.cpp \
+ SecurityLevel2C.h \
+ SecurityLevel2C.inl \
+ SecurityLevel2S.cpp \
+ SecurityLevel2S.h \
+ SecurityLevel2S.inl \
+ SecurityLevel2S_T.cpp \
+ SecurityLevel2S_T.inl
+
+CLEANFILES += \
+ SecurityLevel2-stamp \
+ SecurityLevel2C.cpp \
+ SecurityLevel2C.h \
+ SecurityLevel2C.inl \
+ SecurityLevel2S.cpp \
+ SecurityLevel2S.h \
+ SecurityLevel2S.inl \
+ SecurityLevel2S_T.cpp \
+ SecurityLevel2S_T.inl
+
+SecurityLevel2C.cpp SecurityLevel2C.h SecurityLevel2C.inl SecurityLevel2S.cpp SecurityLevel2S.h SecurityLevel2S.inl SecurityLevel2S_T.cpp SecurityLevel2S_T.inl: SecurityLevel2-stamp
+
+SecurityLevel2-stamp: $(srcdir)/SecurityLevel2.idl $(TAO_IDL_DEP)
+ $(TAO_IDL) $(TAO_IDLFLAGS) -I$(TAO_ROOT)/orbsvcs -GT -Wb,versioning_begin=TAO_BEGIN_VERSIONED_NAMESPACE_DECL -Wb,versioning_end=TAO_END_VERSIONED_NAMESPACE_DECL -Wb,export_macro=TAO_Security_Export -Wb,export_include=orbsvcs/Security/security_export.h $(srcdir)/SecurityLevel2.idl
+ @touch $@
+
+BUILT_SOURCES += \
+ SecurityLevel3C.cpp \
+ SecurityLevel3C.h \
+ SecurityLevel3C.inl \
+ SecurityLevel3S.inl \
+ SecurityLevel3S_T.inl
+
+CLEANFILES += \
+ SecurityLevel3-stamp \
+ SecurityLevel3C.cpp \
+ SecurityLevel3C.h \
+ SecurityLevel3C.inl \
+ SecurityLevel3S.inl \
+ SecurityLevel3S_T.inl
+
+SecurityLevel3C.cpp SecurityLevel3C.h SecurityLevel3C.inl SecurityLevel3S.inl SecurityLevel3S_T.inl: SecurityLevel3-stamp
+
+SecurityLevel3-stamp: $(srcdir)/SecurityLevel3.idl $(TAO_IDL_DEP)
+ $(TAO_IDL) $(TAO_IDLFLAGS) -I$(TAO_ROOT)/orbsvcs -GT -Wb,versioning_begin=TAO_BEGIN_VERSIONED_NAMESPACE_DECL -Wb,versioning_end=TAO_END_VERSIONED_NAMESPACE_DECL -Wb,export_macro=TAO_Security_Export -Wb,export_include=orbsvcs/Security/security_export.h $(srcdir)/SecurityLevel3.idl
+ @touch $@
+
+lib_LTLIBRARIES += libTAO_Security.la
+
+libTAO_Security_la_CPPFLAGS = \
+ -I$(ACE_ROOT) \
+ -I$(ACE_BUILDDIR) \
+ -I$(TAO_ROOT) \
+ -I$(TAO_BUILDDIR) \
+ -I$(TAO_ROOT)/orbsvcs \
+ -I$(TAO_BUILDDIR)/orbsvcs \
+ -DTAO_SECURITY_BUILD_DLL
+
+libTAO_Security_la_SOURCES = \
+ CSIC.cpp \
+ CSIIOPC.cpp \
+ GSSUPC.cpp \
+ Security/CSI_Utils.cpp \
+ Security/SL2_EstablishTrustPolicy.cpp \
+ Security/SL2_QOPPolicy.cpp \
+ Security/SL3_ContextEstablishmentPolicy.cpp \
+ Security/SL3_CredentialsAcquirerFactory.cpp \
+ Security/SL3_CredentialsCurator.cpp \
+ Security/SL3_ObjectCredentialsPolicy.cpp \
+ Security/SL3_PolicyFactory.cpp \
+ Security/SL3_SecurityCurrent.cpp \
+ Security/SL3_SecurityCurrent_Impl.cpp \
+ Security/SL3_SecurityManager.cpp \
+ Security/Security_Current.cpp \
+ Security/Security_Current_Impl.cpp \
+ Security/Security_ORBInitializer.cpp \
+ Security/Security_PolicyFactory.cpp \
+ SecurityC.cpp \
+ SecurityLevel1C.cpp \
+ SecurityLevel1S.cpp \
+ SecurityLevel2C.cpp \
+ SecurityLevel2S.cpp \
+ SecurityLevel3C.cpp \
+ SecurityS.cpp
+
+libTAO_Security_la_LDFLAGS = \
+ -version-number @TAO_MAJOR@:@TAO_MINOR@:@TAO_BETA@
+
+libTAO_Security_la_LIBADD = \
+ $(TAO_BUILDDIR)/tao/libTAO_Valuetype.la \
+ $(TAO_BUILDDIR)/tao/libTAO_PI.la \
+ $(TAO_BUILDDIR)/tao/libTAO_CodecFactory.la \
+ $(TAO_BUILDDIR)/tao/libTAO_PortableServer.la \
+ $(TAO_BUILDDIR)/tao/libTAO_AnyTypeCode.la \
+ $(TAO_BUILDDIR)/tao/libTAO.la \
+ $(ACE_BUILDDIR)/ace/libACE.la
+
+nobase_include_HEADERS += \
+ CSI.idl \
+ CSIC.h \
+ CSIC.inl \
+ CSIIOP.idl \
+ CSIIOPC.h \
+ CSIIOPC.inl \
+ CSIIOPS.inl \
+ CSIIOPS_T.inl \
+ CSIS.inl \
+ CSIS_T.inl \
+ GSSUP.idl \
+ GSSUPC.h \
+ GSSUPC.inl \
+ GSSUPS.inl \
+ GSSUPS_T.inl \
+ Security.idl \
+ Security/CSI_Utils.h \
+ Security/SL2_EstablishTrustPolicy.h \
+ Security/SL2_QOPPolicy.h \
+ Security/SL3_ContextEstablishmentPolicy.h \
+ Security/SL3_CredentialsAcquirerFactory.h \
+ Security/SL3_CredentialsCurator.h \
+ Security/SL3_ObjectCredentialsPolicy.h \
+ Security/SL3_PolicyFactory.h \
+ Security/SL3_SecurityCurrent.h \
+ Security/SL3_SecurityCurrent.inl \
+ Security/SL3_SecurityCurrent_Impl.h \
+ Security/SL3_SecurityManager.h \
+ Security/Security_Current.h \
+ Security/Security_Current.inl \
+ Security/Security_Current_Impl.h \
+ Security/Security_ORBInitializer.h \
+ Security/Security_PolicyFactory.h \
+ Security/security_export.h \
+ SecurityC.h \
+ SecurityC.inl \
+ SecurityLevel1.idl \
+ SecurityLevel1C.h \
+ SecurityLevel1C.inl \
+ SecurityLevel1S.h \
+ SecurityLevel1S.inl \
+ SecurityLevel1S_T.cpp \
+ SecurityLevel1S_T.inl \
+ SecurityLevel2.idl \
+ SecurityLevel2C.h \
+ SecurityLevel2C.inl \
+ SecurityLevel2S.h \
+ SecurityLevel2S.inl \
+ SecurityLevel2S_T.cpp \
+ SecurityLevel2S_T.inl \
+ SecurityLevel3.idl \
+ SecurityLevel3C.h \
+ SecurityLevel3C.inl \
+ SecurityLevel3S.inl \
+ SecurityLevel3S_T.inl \
+ SecurityS.h \
+ SecurityS.inl \
+ SecurityS_T.cpp \
+ SecurityS_T.inl
+
+endif BUILD_INTERCEPTORS
+endif BUILD_CORBA_MESSAGING
+
+EXTRA_DIST += \
+ Security.rc
+
+
+## Makefile.SSLIOP.am
+
+if BUILD_CORBA_MESSAGING
+if BUILD_INTERCEPTORS
+if BUILD_SSL
+if !BUILD_ACE_FOR_TAO
+
+BUILT_SOURCES += \
+ SSLIOPC.cpp \
+ SSLIOPC.h \
+ SSLIOPC.inl \
+ SSLIOPS_T.cpp
+
+CLEANFILES += \
+ SSLIOP-stamp \
+ SSLIOPC.cpp \
+ SSLIOPC.h \
+ SSLIOPC.inl \
+ SSLIOPS_T.cpp
+
+SSLIOPC.cpp SSLIOPC.h SSLIOPC.inl SSLIOPS_T.cpp: SSLIOP-stamp
+
+SSLIOP-stamp: $(srcdir)/SSLIOP.idl $(TAO_IDL_DEP)
+ $(TAO_IDL) $(TAO_IDLFLAGS) -I$(TAO_ROOT)/orbsvcs -GT -Wb,versioning_begin=TAO_BEGIN_VERSIONED_NAMESPACE_DECL -Wb,versioning_end=TAO_END_VERSIONED_NAMESPACE_DECL -Wb,export_macro=TAO_SSLIOP_Export -Wb,export_include=orbsvcs/SSLIOP/SSLIOP_Export.h $(srcdir)/SSLIOP.idl
+ @touch $@
+
+lib_LTLIBRARIES += libTAO_SSLIOP.la
+
+libTAO_SSLIOP_la_CPPFLAGS = \
+ -I$(ACE_ROOT) \
+ -I$(ACE_BUILDDIR) \
+ -I$(TAO_ROOT) \
+ -I$(TAO_BUILDDIR) \
+ -I$(TAO_ROOT)/orbsvcs \
+ -I$(TAO_BUILDDIR)/orbsvcs \
+ -DACE_HAS_SSL=1 \
+ @ACE_TLS_CPPFLAGS@ \
+ -DTAO_SSLIOP_BUILD_DLL
+
+libTAO_SSLIOP_la_SOURCES = \
+ SSLIOP/IIOP_SSL_Acceptor.cpp \
+ SSLIOP/IIOP_SSL_Connection_Handler.cpp \
+ SSLIOP/IIOP_SSL_Connector.cpp \
+ SSLIOP/IIOP_SSL_Transport.cpp \
+ SSLIOP/SSLIOP_Accept_Strategy.cpp \
+ SSLIOP/SSLIOP_Acceptor.cpp \
+ SSLIOP/SSLIOP_ClientCredentials.cpp \
+ SSLIOP/SSLIOP_Connection_Handler.cpp \
+ SSLIOP/SSLIOP_Connector.cpp \
+ SSLIOP/SSLIOP_Credentials.cpp \
+ SSLIOP/SSLIOP_CredentialsAcquirer.cpp \
+ SSLIOP/SSLIOP_CredentialsAcquirerFactory.cpp \
+ SSLIOP/SSLIOP_Current.cpp \
+ SSLIOP/SSLIOP_Current_Impl.cpp \
+ SSLIOP/SSLIOP_EVP_PKEY.cpp \
+ SSLIOP/SSLIOP_Endpoint.cpp \
+ SSLIOP/SSLIOP_Factory.cpp \
+ SSLIOP/SSLIOP_Invocation_Interceptor.cpp \
+ SSLIOP/SSLIOP_ORBInitializer.cpp \
+ SSLIOP/SSLIOP_OwnCredentials.cpp \
+ SSLIOP/SSLIOP_Profile.cpp \
+ SSLIOP/SSLIOP_TargetCredentials.cpp \
+ SSLIOP/SSLIOP_Transport.cpp \
+ SSLIOP/SSLIOP_Util.cpp \
+ SSLIOP/params_dup.c \
+ SSLIOP/ssl_endpointsC.cpp \
+ SSLIOPC.cpp
+
+libTAO_SSLIOP_la_LDFLAGS = \
+ -version-number @TAO_MAJOR@:@TAO_MINOR@:@TAO_BETA@ @ACE_TLS_LDFLAGS@
+
+libTAO_SSLIOP_la_LIBADD = \
+ $(TAO_BUILDDIR)/tao/libTAO_PI_Server.la \
+ $(ACE_BUILDDIR)/ace/SSL/libACE_SSL.la \
+ libTAO_Security.la \
+ $(TAO_BUILDDIR)/tao/libTAO_PI.la \
+ $(TAO_BUILDDIR)/tao/libTAO_CodecFactory.la \
+ $(TAO_BUILDDIR)/tao/libTAO_Valuetype.la \
+ $(TAO_BUILDDIR)/tao/libTAO_PortableServer.la \
+ $(TAO_BUILDDIR)/tao/libTAO_AnyTypeCode.la \
+ $(TAO_BUILDDIR)/tao/libTAO.la \
+ $(ACE_BUILDDIR)/ace/libACE.la \
+ @ACE_TLS_LIBS@
+
+nobase_include_HEADERS += \
+ SSLIOP.idl \
+ SSLIOP/IIOP_SSL_Acceptor.h \
+ SSLIOP/IIOP_SSL_Connection_Handler.h \
+ SSLIOP/IIOP_SSL_Connection_Handler.inl \
+ SSLIOP/IIOP_SSL_Connector.h \
+ SSLIOP/IIOP_SSL_Transport.h \
+ SSLIOP/SSLIOP_Accept_Strategy.h \
+ SSLIOP/SSLIOP_Acceptor.h \
+ SSLIOP/SSLIOP_Acceptor.i \
+ SSLIOP/SSLIOP_ClientCredentials.h \
+ SSLIOP/SSLIOP_Connection_Handler.h \
+ SSLIOP/SSLIOP_Connection_Handler.i \
+ SSLIOP/SSLIOP_Connector.h \
+ SSLIOP/SSLIOP_Credentials.h \
+ SSLIOP/SSLIOP_Credentials.inl \
+ SSLIOP/SSLIOP_CredentialsAcquirer.h \
+ SSLIOP/SSLIOP_CredentialsAcquirerFactory.h \
+ SSLIOP/SSLIOP_Current.h \
+ SSLIOP/SSLIOP_Current.inl \
+ SSLIOP/SSLIOP_Current_Impl.h \
+ SSLIOP/SSLIOP_Current_Impl.inl \
+ SSLIOP/SSLIOP_EVP_PKEY.h \
+ SSLIOP/SSLIOP_Endpoint.h \
+ SSLIOP/SSLIOP_Endpoint.i \
+ SSLIOP/SSLIOP_Export.h \
+ SSLIOP/SSLIOP_Factory.h \
+ SSLIOP/SSLIOP_Invocation_Interceptor.h \
+ SSLIOP/SSLIOP_ORBInitializer.h \
+ SSLIOP/SSLIOP_OpenSSL_st_T.h \
+ SSLIOP/SSLIOP_OpenSSL_st_T.inl \
+ SSLIOP/SSLIOP_OwnCredentials.h \
+ SSLIOP/SSLIOP_Profile.h \
+ SSLIOP/SSLIOP_SSL.h \
+ SSLIOP/SSLIOP_TargetCredentials.h \
+ SSLIOP/SSLIOP_Transport.h \
+ SSLIOP/SSLIOP_Util.h \
+ SSLIOP/SSLIOP_X509.h \
+ SSLIOP/params_dup.h \
+ SSLIOP/ssl_endpoints.pidl \
+ SSLIOP/ssl_endpointsC.h \
+ SSLIOPC.h \
+ SSLIOPC.inl
+
+endif !BUILD_ACE_FOR_TAO
+endif BUILD_SSL
+endif BUILD_INTERCEPTORS
+endif BUILD_CORBA_MESSAGING
+
+EXTRA_DIST += \
+ SSLIOP.rc
+
+
+## Clean up template repositories, etc.
+clean-local:
+ -rm -f *~ *.bak *.rpo *.sym lib*.*_pure_* core core.*
+ -rm -f gcctemp.c gcctemp so_locations *.ics
+ -rm -rf cxx_repository ptrepository ti_files
+ -rm -rf templateregistry ir.out
+ -rm -rf ptrepository SunWS_cache Templates.DB
diff --git a/TAO/orbsvcs/orbsvcs/Metrics.idl b/TAO/orbsvcs/orbsvcs/Metrics.idl
new file mode 100644
index 00000000000..00e87c7f87a
--- /dev/null
+++ b/TAO/orbsvcs/orbsvcs/Metrics.idl
@@ -0,0 +1,331 @@
+// $Id$
+
+#ifndef METRICS_IDL
+#define METRICS_IDL
+
+#include "TimeBase.idl"
+#include "RtecScheduler.idl"
+#pragma prefix ""
+
+module Metrics
+{
+ // Types
+
+ enum TIMEPROBE_EVENT_TYPE
+ {
+ WORK_START,
+ WORK_STOP,
+ WORK_SUSPEND,
+ WORK_RESUME
+ };
+
+ typedef TIMEPROBE_EVENT_TYPE TIMEPROBE_EVENT_TYPE_t;
+
+ typedef TimeBase::TimeT Time; // time type
+ typedef sequence<RtecScheduler::handle_t> Handle_Set_t; // handle sequence
+
+ struct QoSParameter_t
+ // = TITLE
+ // Describes the monitored QoS for an "RT_Operation".
+ //
+ // = DESCRIPTION
+ // The deadline success and failure counts for an operation.
+ {
+ RtecScheduler::handle_t handle;
+ // The handle of the operation for which the information is stored
+
+ string entry_point;
+ // The name of the operation for which the information is stored
+
+ unsigned long deadlines_made;
+ // The number of deadlines successfully met.
+
+ unsigned long deadlines_missed;
+ // The number of deadlines missed.
+
+ unsigned long operations_cancelled;
+ // The number of operations cancelled.
+
+ short is_hrt;
+ // Indicates whether or not the operation is hard real-time.
+ };
+
+ typedef sequence<QoSParameter_t> QoSParameter_Set;
+
+
+ struct QoSData
+ // = TITLE
+ // Describes the monitored QoS for the visualization browser.
+ //
+ // = DESCRIPTION
+ // Aggregate success, failure, and cancellation counts the operations.
+ {
+ long hrt_deadlines_made;
+ // The number of hard real-time deadlines successfully met.
+
+ long hrt_deadlines_missed;
+ // The number of hard real-time deadlines missed.
+
+ long hrt_operations_cancelled;
+ // The number of hard real-time operations that were cancelled.
+
+ long srt_deadlines_made;
+ // The number of soft real-time deadlines successfully met.
+
+ long srt_deadlines_missed;
+ // The number of soft real-time deadlines missed.
+
+ long srt_operations_cancelled;
+ // The number of soft real-time operations that were cancelled.
+ };
+
+ struct UtilData
+ // = TITLE
+ // Describes the monitored QoS for the visualization browser.
+ //
+ // = DESCRIPTION
+ // Aggregate success, failure, and cancellation counts the operations.
+ {
+ double hrt_op_utilization;
+ // The percentage of the time spent in hard real-time operations.
+
+ double srt_op_utilization;
+ // The percentage of the time spent in soft real-time operations.
+
+ double queue_utilization;
+ // The percentage of the time spent managing queues.
+ };
+
+ struct ProbeIdentity_t
+ // = TITLE
+ // Describes the identity of a timeprobe.
+ //
+ // = DESCRIPTION
+ // The name and identifier for a timeprobe.
+ {
+ unsigned long probe_id;
+ // The unique identifier for the timeprobe.
+
+ string probe_name;
+ // The name of the timeprobe.
+ };
+
+ typedef sequence<ProbeIdentity_t> ProbeIdentity_Set;
+
+ struct TimeprobeParameter_t
+ // = TITLE
+ // Describes the monitored data for a timeprobe.
+ //
+ // = DESCRIPTION
+ // The duration of an interval for a timeprobe.
+ {
+ unsigned long probe_id;
+ // The name of the timeprobe that collected the data.
+
+ short is_operation;
+ // Indicates whether or not the data are for an operation.
+
+ short is_hrt;
+ // Indicates whether or not an operation is hard real-time.
+
+ short is_full_interval;
+ // Indicates whether or not the time reported is for the entire
+ // interval measured by the time probe.
+
+ short cross_thread_probe;
+ // Indicates whether or not the time reported is for the entire
+ // interval measured by the time probe.
+
+ Time start_event_time;
+ // The start of the event for sorting purposes.
+
+ Time stop_event_time;
+ // The start of the event for sorting purposes.
+
+ Time interval;
+ // The elapsed time within the timeprobe.
+ };
+
+ typedef sequence<TimeprobeParameter_t> TimeprobeParameter_Set;
+
+
+ // Exceptions
+
+ exception SYNCHRONIZATION {};
+ // A synchronization error occurred in a method.
+
+ exception INTERNAL {};
+ // An error occurred in an internal data structure.
+
+ exception INTERNAL_0 {};
+ exception INTERNAL_1 {};
+ exception INTERNAL_2 {};
+ exception INTERNAL_3 {};
+ exception INTERNAL_4 {};
+ exception INTERNAL_5 {};
+ exception INTERNAL_6 {};
+ exception INTERNAL_7 {};
+ exception INTERNAL_8 {};
+ // These are to track down an infrequently reproducible
+ // error, and should be removed eventually.
+
+ exception NIL_LOGGER {};
+ // An operation was passed a nil logger pointer.
+
+ // Interfaces
+
+ interface QoSLogger
+ // = TITLE
+ // This interface provides access to a QoS logger.
+ //
+ // = DESCRIPTION
+ // This interface allows clients log monitored QoS information.
+ {
+ oneway void send_banner (in string banner);
+ // Sends a banner to the logger, which is recorded in the
+ // output log and communicated to the visualization browser.
+
+ oneway void log_aggregate_QoS (in Metrics::QoSParameter_Set qos_set,
+ in Time interval);
+ // Reports the aggregate QoS information for all operations
+ // to the passed QoS logger.
+
+ oneway void set_identities (in Metrics::ProbeIdentity_Set identity_set);
+ // Binds the names of various timeprobes to their identifiers so
+ // that ids alone can be used (for efficiency) in passing data.
+
+ oneway void set_identity (in Metrics::ProbeIdentity_t identity);
+ // Binds the names of various timeprobes to their identifiers so
+ // that ids alone can be used (for efficiency) in passing data.
+
+ oneway void log_timeprobe_data (in Metrics::TimeprobeParameter_Set data_set,
+ in Time interval);
+ // Reports timeprobe data collected since last run.
+ };
+
+
+ interface QoSMonitor
+ // = TITLE
+ // This interface provides access to a QoS data monitor.
+ //
+ // = DESCRIPTION
+ // This interface allows objects to store and query monitored
+ // QoS information.
+ {
+ void report_made_deadline (in RtecScheduler::handle_t handle)
+ raises (INTERNAL_0);
+ // Report a successful upcall.
+
+ void report_missed_deadline (in RtecScheduler::handle_t handle)
+ raises (INTERNAL_1);
+ // Report an unsuccessful upcall.
+
+ void reset_statistics (in RtecScheduler::handle_t handle)
+ raises (INTERNAL_7, INTERNAL_8);
+ // Resets the aggregate QoS information for the given
+ // operation handle.
+
+ void get_aggregate_QoS (in RtecScheduler::handle_t handle,
+ out Metrics::QoSParameter_t qos)
+ raises (INTERNAL_2, INTERNAL_3);
+ // Retrieves the aggregate QoS information for the given
+ // operation handle.
+
+ void get_aggregate_QoS_set (in Metrics::Handle_Set_t handle_set,
+ out Metrics::QoSParameter_Set qos_set)
+ raises (INTERNAL_4, INTERNAL_5);
+ // Retrieves the aggregate QoS information for all operations
+ // in the passed handle set.
+ };
+
+
+ interface ReportingQoSMonitor : QoSMonitor
+ // = TITLE
+ // This interface provides access to a QoS data monitor.
+ //
+ // = DESCRIPTION
+ // This interface allows objects to report monitored
+ // QoS information to a QoS logger.
+ {
+ void report_aggregate_QoS (in Metrics::QoSLogger logger,
+ in Metrics::Time interval)
+ raises (NIL_LOGGER, INTERNAL_6);
+ // Reports the aggregate QoS information for all operations
+ // to the passed QoS logger.
+ };
+
+ interface FrameManager
+ // = TITLE
+ // This interface provides access to a QoS data monitor.
+ //
+ // = DESCRIPTION
+ // This interface allows objects to query or report monitored
+ // QoS information that was collected by QoS monitoring adapters.
+ {
+ short register_period (in RtecScheduler::Period_t p)
+ raises (INTERNAL, SYNCHRONIZATION);
+ // Binds the period to the internal frame map, with a new frame data
+ // structure. Returns 0 if a new entry is bound successfully,
+ // returns 1 if an attempt is made to bind an existing entry, and
+ // returns -1 if failures occur.
+
+ short update_all_frames_with_time (in Time tv)
+ raises (SYNCHRONIZATION);
+ // Updates time frames, based on the passed time value.
+
+ short update_all_frames ()
+ raises (SYNCHRONIZATION);
+ // Updates time frames, based on the current time as of the call.
+
+ short update_frame_with_time (in RtecScheduler::Period_t p, in Time tv)
+ raises (INTERNAL, SYNCHRONIZATION);
+ // Updates the passed period's time frame, based on the passed time
+ // value.
+
+ short update_frame (in RtecScheduler::Period_t p)
+ raises (INTERNAL, SYNCHRONIZATION);
+ // Updates the passed period's time frame, based on the current time
+ // as of the call.
+
+ short reset_all_frames_with_time (in Time tv)
+ raises (SYNCHRONIZATION);
+ // Resets time frames, based on the passed time value.
+
+ short reset_all_frames ()
+ raises (SYNCHRONIZATION);
+ // Resets time frames, based on the current time as of the call.
+
+ short reset_frame_with_time (in RtecScheduler::Period_t p, in Time tv)
+ raises (INTERNAL, SYNCHRONIZATION);
+ // Resets the passed period's start-of-frame, based on the passed time
+ // value.
+
+ short reset_frame (in RtecScheduler::Period_t p)
+ raises (INTERNAL, SYNCHRONIZATION);
+ // Resets the passed period's start-of-frame, based on the current time
+ // as of the call.
+
+ short get_start_time (in RtecScheduler::Period_t p, out Time start)
+ raises (INTERNAL, SYNCHRONIZATION);
+ // Gets the start time for the period's current frame.
+
+ short get_end_time (in RtecScheduler::Period_t p, out Time end)
+ raises (INTERNAL, SYNCHRONIZATION);
+ // Gets the end time for the period's current frame.
+
+ short get_frame_id (in RtecScheduler::Period_t p, out unsigned long id)
+ raises (INTERNAL, SYNCHRONIZATION);
+ // Gets the locally unique identifier for the period's current frame.
+
+ short get_frame_data (in RtecScheduler::Period_t p, out Time start,
+ out Time end, out unsigned long id)
+ raises (INTERNAL, SYNCHRONIZATION);
+ // Gets the start time, end time, and id for the period's current frame.
+ };
+
+};
+
+#endif /* METRICS_IDL */
+
+
+
diff --git a/TAO/orbsvcs/orbsvcs/Metrics/Metrics_FrameManager.cpp b/TAO/orbsvcs/orbsvcs/Metrics/Metrics_FrameManager.cpp
new file mode 100644
index 00000000000..42663238c81
--- /dev/null
+++ b/TAO/orbsvcs/orbsvcs/Metrics/Metrics_FrameManager.cpp
@@ -0,0 +1,14 @@
+// $Id$
+
+#ifndef METRICS_FRAME_MANAGER_CPP
+#define METRICS_FRAME_MANAGER_CPP
+
+#include "orbsvcs/Metrics/Metrics_FrameManager.h"
+
+#if !defined (__ACE_INLINE__)
+#include "orbsvcs/Metrics/Metrics_FrameManager.i"
+#endif /* __ACE_INLINE__ */
+
+
+#endif /* METRICS_FRAME_MANAGER_CPP */
+
diff --git a/TAO/orbsvcs/orbsvcs/Metrics/Metrics_FrameManager.h b/TAO/orbsvcs/orbsvcs/Metrics/Metrics_FrameManager.h
new file mode 100644
index 00000000000..689ed44ee6f
--- /dev/null
+++ b/TAO/orbsvcs/orbsvcs/Metrics/Metrics_FrameManager.h
@@ -0,0 +1,37 @@
+// $Id$
+
+#ifndef METRICS_FRAME_MANAGER_H
+#define METRICS_FRAME_MANAGER_H
+
+#include "ace/OS.h"
+
+#if !defined (ACE_LACKS_PRAGMA_ONCE)
+# pragma once
+#endif /* ACE_LACKS_PRAGMA_ONCE */
+
+#include "ace/Hash_Map_Manager.h"
+#include "ace/Singleton.h"
+
+#include "orbsvcs/Time_Utilities.h"
+#include "orbsvcs/RtecSchedulerC.h"
+
+#include "orbsvcs/Metrics/Metrics_Utils.h"
+
+#if defined (__ACE_INLINE__)
+#include "orbsvcs/Metrics/Metrics_FrameManager.i"
+#endif /* __ACE_INLINE__ */
+
+#include "orbsvcs/Metrics/Metrics_FrameManager_T.h"
+
+TAO_BEGIN_VERSIONED_NAMESPACE_DECL
+
+typedef TAO_Metrics_FrameManager<ACE_SYNCH_MUTEX>
+TAO_METRICS_FRAME_MGR_TYPE;
+
+typedef ACE_Singleton<TAO_METRICS_FRAME_MGR_TYPE, ACE_SYNCH_MUTEX>
+TAO_METRICS_FRAME_MGR_SINGLETON;
+
+TAO_END_VERSIONED_NAMESPACE_DECL
+
+#endif /* METRICS_FRAME_MANAGER_H */
+
diff --git a/TAO/orbsvcs/orbsvcs/Metrics/Metrics_FrameManager.i b/TAO/orbsvcs/orbsvcs/Metrics/Metrics_FrameManager.i
new file mode 100644
index 00000000000..bb47ba99272
--- /dev/null
+++ b/TAO/orbsvcs/orbsvcs/Metrics/Metrics_FrameManager.i
@@ -0,0 +1,9 @@
+// $Id$
+
+#ifndef METRICS_FRAME_MANAGER_I
+#define METRICS_FRAME_MANAGER_I
+
+
+
+#endif /* METRICS_FRAME_MANAGER_I */
+
diff --git a/TAO/orbsvcs/orbsvcs/Metrics/Metrics_FrameManager_T.cpp b/TAO/orbsvcs/orbsvcs/Metrics/Metrics_FrameManager_T.cpp
new file mode 100644
index 00000000000..d8ff5ef8e8b
--- /dev/null
+++ b/TAO/orbsvcs/orbsvcs/Metrics/Metrics_FrameManager_T.cpp
@@ -0,0 +1,14 @@
+// $Id$
+
+#ifndef METRICS_FRAME_MANAGER_T_CPP
+#define METRICS_FRAME_MANAGER_T_CPP
+
+#include "orbsvcs/Metrics/Metrics_FrameManager_T.h"
+
+#if !defined (__ACE_INLINE__)
+#include "orbsvcs/Metrics/Metrics_FrameManager_T.i"
+#endif /* __ACE_INLINE__ */
+
+
+#endif /* METRICS_FRAME_MANAGER_T_CPP */
+
diff --git a/TAO/orbsvcs/orbsvcs/Metrics/Metrics_FrameManager_T.h b/TAO/orbsvcs/orbsvcs/Metrics/Metrics_FrameManager_T.h
new file mode 100644
index 00000000000..a3226d8647c
--- /dev/null
+++ b/TAO/orbsvcs/orbsvcs/Metrics/Metrics_FrameManager_T.h
@@ -0,0 +1,277 @@
+// $Id$
+
+#ifndef METRICS_FRAME_MANAGER_T_H
+#define METRICS_FRAME_MANAGER_T_H
+
+#include "ace/OS.h"
+
+#if !defined (ACE_LACKS_PRAGMA_ONCE)
+# pragma once
+#endif /* ACE_LACKS_PRAGMA_ONCE */
+
+#include "ace/Hash_Map_Manager.h"
+#include "ace/High_Res_Timer.h"
+
+#include "orbsvcs/Time_Utilities.h"
+#include "orbsvcs/RtecSchedulerC.h"
+#include "orbsvcs/MetricsS.h"
+
+#include "orbsvcs/Metrics/Metrics_FrameManager.h"
+
+
+template <class ACE_LOCK>
+struct TAO_Metrics_Frame_Manager_Data
+{
+ // = TITLE
+ // Defines a class for time frame management data.
+ //
+ // = DESCRIPTION
+ // This class makes use of the <ACE_Time_Value> class to
+ // store period and endpoint data for a given time frame.
+
+public:
+
+ TAO_Metrics_Frame_Manager_Data (RtecScheduler::Period_t p)
+ : frame_id_ (0), period_ (0, p / 10) {}
+ // Constructor. Note that p is in hundreds of nanoseconds so we
+ // divide by ten to get microseconds. The start_ and end_ data
+ // members are set equal to ACE_Time_Value::zero by their own
+ // default constructors.
+
+ CORBA::ULong frame_id_;
+ // Stores the number of previous frames for that period. May roll
+ // over, but is intended to provide a locally (for a large range of
+ // locality) unique frame identifier.
+
+ ACE_Time_Value period_;
+ // Relative time to the next frame, from the start of this one.
+
+ ACE_Time_Value start_;
+ // Absolute time of the start of the frame and end of the last.
+
+ ACE_Time_Value end_;
+ // Absolute time to the end of the frame and start of the next.
+
+ ACE_LOCK lock_;
+ // Lock for synchronizing access to the data instance.
+};
+
+
+template <class ACE_LOCK>
+class TAO_Metrics_FrameManager : public POA_Metrics::FrameManager
+
+{
+ // = TITLE
+ // Defines a class that implements a local metrics cache.
+ //
+ // = DESCRIPTION
+ // This class makes use of the <ACE_Metrics_Cache> class to
+ // implement a cache for local use.
+public:
+
+ typedef TAO_Metrics_FrameManager<ACE_LOCK> TAO_METRICS_FRAME_MANAGER_TYPE;
+ typedef TAO_Metrics_Frame_Manager_Data<ACE_LOCK> TAO_METRICS_FRAME_MANAGER_DATA_TYPE;
+
+ typedef ACE_Hash_Map_Manager_Ex<RtecScheduler::Period_t,
+ TAO_METRICS_FRAME_MANAGER_DATA_TYPE *,
+ ACE_Hash<RtecScheduler::Period_t>,
+ ACE_Equal_To<RtecScheduler::Period_t>,
+ ACE_Null_Mutex> METRICS_FRAME_DATA_MAP;
+ // Type of map used for O(1) lookup of monitored data for operations.
+
+ typedef ACE_Hash_Map_Entry<RtecScheduler::Period_t,
+ TAO_METRICS_FRAME_MANAGER_DATA_TYPE *>
+ METRICS_FRAME_DATA_MAP_ENTRY;
+ // Type of entry in monitor map.
+
+ typedef ACE_Hash_Map_Iterator_Ex<RtecScheduler::Period_t,
+ TAO_METRICS_FRAME_MANAGER_DATA_TYPE *,
+ ACE_Hash<RtecScheduler::Period_t>,
+ ACE_Equal_To<RtecScheduler::Period_t>,
+ ACE_Null_Mutex>
+ METRICS_FRAME_DATA_MAP_ITERATOR;
+ // Type of iterator for monitor map.
+
+ TAO_Metrics_FrameManager ();
+ // Constructor.
+
+ ~TAO_Metrics_FrameManager ();
+ // Destructor.
+
+ CORBA::Short register_period (RtecScheduler::Period_t p,
+ CORBA::Environment &ACE_TRY_ENV
+ = CORBA::Environment::default_environment ())
+ ACE_THROW_SPEC ((CORBA::SystemException,
+ Metrics::INTERNAL,
+ Metrics::SYNCHRONIZATION));
+ // Binds the period to the internal frame map, with a new frame data
+ // structure. Returns 0 if a new entry is bound successfully,
+ // returns 1 if an attempt is made to bind an existing entry, and
+ // returns -1 if failures occur.
+
+ CORBA::Short update_all_frames (const ACE_Time_Value& tv);
+ // Updates time frames, based on the passed time value.
+
+ CORBA::Short update_all_frames_with_time (Metrics::Time mt,
+ CORBA::Environment &ACE_TRY_ENV
+ = CORBA::Environment::default_environment ())
+ ACE_THROW_SPEC ((CORBA::SystemException,
+ Metrics::SYNCHRONIZATION));
+ // Updates time frames, based on the passed time value.
+
+ CORBA::Short update_all_frames (CORBA::Environment &ACE_TRY_ENV
+ = CORBA::Environment::default_environment ())
+ ACE_THROW_SPEC ((CORBA::SystemException,
+ Metrics::SYNCHRONIZATION));
+ // Updates time frames, based on the current time as of the call.
+
+ CORBA::Short update_frame (RtecScheduler::Period_t p, const ACE_Time_Value& tv);
+ // Updates the passed period's time frame, based on the passed time
+ // value.
+
+ CORBA::Short update_frame_with_time (RtecScheduler::Period_t p,
+ Metrics::Time mt,
+ CORBA::Environment &ACE_TRY_ENV
+ = CORBA::Environment::default_environment ())
+ ACE_THROW_SPEC ((CORBA::SystemException,
+ Metrics::INTERNAL,
+ Metrics::SYNCHRONIZATION));
+ // Updates the passed period's time frame, based on the passed time
+ // value.
+
+ CORBA::Short update_frame (RtecScheduler::Period_t p,
+ CORBA::Environment &ACE_TRY_ENV
+ = CORBA::Environment::default_environment ())
+ ACE_THROW_SPEC ((CORBA::SystemException,
+ Metrics::INTERNAL,
+ Metrics::SYNCHRONIZATION));
+ // Updates the passed period's time frame, based on the current time
+ // as of the call.
+
+ CORBA::Short reset_all_frames (const ACE_Time_Value& tv);
+ // Resets time frames, based on the passed time value.
+
+ CORBA::Short reset_all_frames_with_time (Metrics::Time mt,
+ CORBA::Environment &ACE_TRY_ENV
+ = CORBA::Environment::default_environment ())
+ ACE_THROW_SPEC ((CORBA::SystemException,
+ Metrics::SYNCHRONIZATION));
+ // Resets time frames, based on the passed time value.
+
+ CORBA::Short reset_all_frames (CORBA::Environment &ACE_TRY_ENV
+ = CORBA::Environment::default_environment ())
+ ACE_THROW_SPEC ((CORBA::SystemException,
+ Metrics::SYNCHRONIZATION));
+ // Resets time frames, based on the current time as of the call.
+
+ CORBA::Short reset_frame (RtecScheduler::Period_t p, const ACE_Time_Value& tv);
+ // Resets the passed period's start-of-frame, based on the passed time
+ // value.
+
+ CORBA::Short reset_frame_with_time (RtecScheduler::Period_t p,
+ Metrics::Time mt,
+ CORBA::Environment &ACE_TRY_ENV
+ = CORBA::Environment::default_environment ())
+ ACE_THROW_SPEC ((CORBA::SystemException,
+ Metrics::INTERNAL,
+ Metrics::SYNCHRONIZATION));
+ // Resets the passed period's start-of-frame, based on the passed time
+ // value.
+
+ CORBA::Short reset_frame (RtecScheduler::Period_t p,
+ CORBA::Environment &ACE_TRY_ENV
+ = CORBA::Environment::default_environment ())
+ ACE_THROW_SPEC ((CORBA::SystemException,
+ Metrics::INTERNAL,
+ Metrics::SYNCHRONIZATION));
+ // Resets the passed period's start-of-frame, based on the current time
+ // as of the call.
+
+ CORBA::Short get_start_time (RtecScheduler::Period_t p, ACE_Time_Value &start);
+ // Gets the start time for the period's current frame.
+
+ CORBA::Short get_start_time (RtecScheduler::Period_t p,
+ Metrics::Time &start,
+ CORBA::Environment &ACE_TRY_ENV
+ = CORBA::Environment::default_environment ())
+ ACE_THROW_SPEC ((CORBA::SystemException,
+ Metrics::INTERNAL,
+ Metrics::SYNCHRONIZATION));
+ // Gets the start time for the period's current frame.
+
+ CORBA::Short get_end_time (RtecScheduler::Period_t p, ACE_Time_Value &end);
+ // Gets the end time for the period's current frame.
+
+ CORBA::Short get_end_time (RtecScheduler::Period_t p,
+ Metrics::Time &end,
+ CORBA::Environment &ACE_TRY_ENV
+ = CORBA::Environment::default_environment ())
+ ACE_THROW_SPEC ((CORBA::SystemException,
+ Metrics::INTERNAL,
+ Metrics::SYNCHRONIZATION));
+ // Gets the end time for the period's current frame.
+
+ CORBA::Short get_frame_id (RtecScheduler::Period_t p,
+ CORBA::ULong &id,
+ CORBA::Environment &ACE_TRY_ENV
+ = CORBA::Environment::default_environment ())
+ ACE_THROW_SPEC ((CORBA::SystemException,
+ Metrics::INTERNAL,
+ Metrics::SYNCHRONIZATION));
+ // Gets the locally unique identifier for the period's current frame.
+
+ CORBA::Short get_frame_data (RtecScheduler::Period_t p, ACE_Time_Value &start,
+ ACE_Time_Value &end, CORBA::ULong &id);
+ // Gets the start time, end time, and id period's current frame.
+
+ CORBA::Short get_frame_data (RtecScheduler::Period_t p,
+ Metrics::Time &start,
+ Metrics::Time &end,
+ CORBA::ULong &id,
+ CORBA::Environment &ACE_TRY_ENV
+ = CORBA::Environment::default_environment ())
+ ACE_THROW_SPEC ((CORBA::SystemException,
+ Metrics::INTERNAL,
+ Metrics::SYNCHRONIZATION));
+ // Gets the start time, end time, and id period's current frame.
+
+protected:
+
+ CORBA::Short update_data (TAO_Metrics_Frame_Manager_Data<ACE_LOCK> & data,
+ const ACE_Time_Value& tv);
+ // Updates the passed frame data structure's start and end times,
+ // based on the passed time value. This is a protected internal
+ // method, and should only be called with locks already held.
+
+
+ CORBA::Short reset_data (TAO_Metrics_Frame_Manager_Data<ACE_LOCK> & data,
+ const ACE_Time_Value& tv);
+ // Resets the passed frame data structure's start and end times, to
+ // the passed time value and one period later, respectively. This
+ // is a protected internal method, and should only be called with
+ // locks already held.
+
+ METRICS_FRAME_DATA_MAP frame_data_map_;
+ // Maps periods to frame data.
+
+ // Count of the number of registered periods.
+ u_long period_count_;
+
+ ACE_LOCK lock_;
+ // Lock for synchronizing access to the map.
+};
+
+#if defined (ACE_TEMPLATES_REQUIRE_SOURCE)
+#include "orbsvcs/Metrics/Metrics_FrameManager_T.cpp"
+#endif /* ACE_TEMPLATES_REQUIRE_SOURCE */
+
+#if defined (ACE_TEMPLATES_REQUIRE_PRAGMA)
+#pragma implementation ("Metrics_FrameManager_T.cpp")
+#endif /* ACE_TEMPLATES_REQUIRE_PRAGMA */
+
+#if defined (__ACE_INLINE__)
+#include "orbsvcs/Metrics/Metrics_FrameManager_T.i"
+#endif /* __ACE_INLINE__ */
+
+#endif /* METRICS_FRAME_MANAGER_T_H */
+
diff --git a/TAO/orbsvcs/orbsvcs/Metrics/Metrics_FrameManager_T.i b/TAO/orbsvcs/orbsvcs/Metrics/Metrics_FrameManager_T.i
new file mode 100644
index 00000000000..a14671b359e
--- /dev/null
+++ b/TAO/orbsvcs/orbsvcs/Metrics/Metrics_FrameManager_T.i
@@ -0,0 +1,821 @@
+// $Id$
+
+#ifndef METRICS_FRAME_MANAGER_T_I
+#define METRICS_FRAME_MANAGER_T_I
+
+
+////////////////////////////////////
+// Class TAO_Metrics_FrameManager //
+////////////////////////////////////
+
+
+// Default constructor.
+
+template <class ACE_LOCK>
+ACE_INLINE
+TAO_Metrics_FrameManager<ACE_LOCK>::
+TAO_Metrics_FrameManager ()
+ : period_count_ (0)
+{
+ // Ensure that the high res timer global scale factor
+ // is set before any of its static methods are used
+ ACE_High_Res_Timer::global_scale_factor ();
+}
+
+// Destructor. Note: this is *not* thread safe. If we're destroying
+// the frame manager then there had better not be any threads in the
+// manager anyway. If a use case requires thread safety at
+// destruction, then some kind of external reader-writer locking and
+// barrier synchronization scheme will be needed to make this work
+// efficiently.
+
+template <class ACE_LOCK>
+ACE_INLINE
+TAO_Metrics_FrameManager<ACE_LOCK>::
+~TAO_Metrics_FrameManager ()
+{
+ // Iterate through and delete the data structures in the map
+ METRICS_FRAME_DATA_MAP_ITERATOR iter (frame_data_map_);
+ while (iter.done () == 0)
+ {
+ delete (*iter).int_id_;
+ ++iter;
+ }
+}
+
+
+// Binds the period to the internal frame map, with a new frame data
+// structure. Returns 0 if a new entry is bound successfully, returns
+// 1 if an attempt is made to bind an existing entry, and returns -1
+// if failures occur.
+
+template <class ACE_LOCK>
+ACE_INLINE CORBA::Short
+TAO_Metrics_FrameManager<ACE_LOCK>::
+register_period (RtecScheduler::Period_t p,
+ CORBA::Environment &ACE_TRY_ENV)
+ ACE_THROW_SPEC ((CORBA::SystemException,
+ Metrics::INTERNAL,
+ Metrics::SYNCHRONIZATION))
+{
+ // Treat a zero period as a special case: no need to register, but
+ // no harm if someone tries.
+ if (p == 0)
+ {
+ return 0;
+ }
+
+ // Synchronize read/write access to the map while the new period's
+ // frame is being installed.
+ ACE_Write_Guard<ACE_LOCK> mon (this->lock_);
+ if (mon.locked () == 0)
+ {
+ ACE_THROW_RETURN (Metrics::SYNCHRONIZATION (), -1);
+ }
+
+ int result = 0;
+ TAO_Metrics_Frame_Manager_Data<ACE_LOCK> * data = 0;
+ if (frame_data_map_.find (p) != 0)
+ {
+ ACE_NEW_RETURN (data, TAO_Metrics_Frame_Manager_Data<ACE_LOCK> (p), -1);
+ result = frame_data_map_.trybind (p, data);
+ if (result == 0)
+ {
+ // All is well: count the new period.
+ ++period_count_;
+ }
+ else
+ {
+ delete data;
+
+ // We failed to bind: throw an exception.
+ ACE_THROW_RETURN (Metrics::INTERNAL (), -1);
+ }
+ }
+
+ return result;
+}
+
+// Updates time frames, based on the passed time value.
+
+template <class ACE_LOCK>
+ACE_INLINE CORBA::Short
+TAO_Metrics_FrameManager<ACE_LOCK>::
+update_all_frames (const ACE_Time_Value& tv)
+{
+ // Synchronize read/write access to the map while the new frames are
+ // being computed.
+ ACE_Write_Guard<ACE_LOCK> mon (this->lock_);
+ if (mon.locked () == 0)
+ {
+ return -1;
+ }
+
+ METRICS_FRAME_DATA_MAP_ITERATOR iter (frame_data_map_);
+ while (iter.done () == 0)
+ {
+ update_data (*((*iter).int_id_), tv);
+ ++iter;
+ }
+ return 0;
+}
+
+
+// Updates time frames, based on the passed time value.
+
+template <class ACE_LOCK>
+ACE_INLINE CORBA::Short
+TAO_Metrics_FrameManager<ACE_LOCK>::
+update_all_frames_with_time (Metrics::Time mt,
+ CORBA::Environment &ACE_TRY_ENV)
+ ACE_THROW_SPEC ((CORBA::SystemException,
+ Metrics::SYNCHRONIZATION))
+{
+ // Reentrant method that calls locked method.
+ ACE_Time_Value tv;
+ ORBSVCS_Time::TimeT_to_Time_Value(tv, mt);
+ if (this->update_all_frames (tv) < 0)
+ {
+ ACE_THROW_RETURN (Metrics::SYNCHRONIZATION (), -1);
+ }
+
+ return 0;
+}
+
+// Updates time frames, based on the current time as of the call.
+
+template <class ACE_LOCK>
+ACE_INLINE CORBA::Short
+TAO_Metrics_FrameManager<ACE_LOCK>::
+update_all_frames (CORBA::Environment &ACE_TRY_ENV)
+ ACE_THROW_SPEC ((CORBA::SystemException,
+ Metrics::SYNCHRONIZATION))
+{
+ // Synchronize read/write access to the map while the new frames are
+ // being computed.
+ ACE_Write_Guard<ACE_LOCK> mon (this->lock_);
+ if (mon.locked () == 0)
+ {
+ ACE_THROW_RETURN (Metrics::SYNCHRONIZATION (), -1);
+ }
+
+ METRICS_FRAME_DATA_MAP_ITERATOR iter (frame_data_map_);
+
+ // Grab the common time stamp as late as possible, i.e., after all
+ // locks are held.
+ ACE_Time_Value tv;
+ ACE_hrtime_t hrtime_now = ACE_OS::gethrtime ();
+ ACE_High_Res_Timer::hrtime_to_tv (tv, hrtime_now);
+
+ while (iter.done () == 0)
+ {
+ update_data (*((*iter).int_id_), tv);
+ ++iter;
+ }
+ return 0;
+}
+
+
+// Updates the passed period's time frame, based on the passed time
+// value.
+
+template <class ACE_LOCK>
+ACE_INLINE CORBA::Short
+TAO_Metrics_FrameManager<ACE_LOCK>::
+update_frame (RtecScheduler::Period_t p, const ACE_Time_Value& tv)
+{
+ // Treat a zero period as a special case.
+ if (p == 0)
+ {
+ return 0;
+ }
+
+ TAO_Metrics_Frame_Manager_Data<ACE_LOCK> * data;
+
+ // Synchronize write access to the map during pointer lookup only
+ ACE_Read_Guard<ACE_LOCK> mon (this->lock_);
+ if (mon.locked () == 0)
+ {
+ return -1;
+ }
+
+ if (frame_data_map_.find (p, data) == 0 && data != 0)
+ {
+ mon.release ();
+
+ // Synchronize read/write access to the specific data structure
+ // instance during update
+ ACE_Write_Guard<ACE_LOCK> data_mon (data->lock_);
+ if (data_mon.locked () == 0)
+ {
+ return -1;
+ }
+ return update_data (*data, tv);
+ }
+
+ return -2;
+}
+
+// Updates the passed period's time frame, based on the passed time
+// value.
+
+template <class ACE_LOCK>
+ACE_INLINE CORBA::Short
+TAO_Metrics_FrameManager<ACE_LOCK>::
+update_frame_with_time (RtecScheduler::Period_t p, Metrics::Time mt,
+ CORBA::Environment &ACE_TRY_ENV)
+ ACE_THROW_SPEC ((CORBA::SystemException,
+ Metrics::INTERNAL,
+ Metrics::SYNCHRONIZATION))
+{
+ // Treat a zero period as a special case.
+ if (p == 0)
+ {
+ return 0;
+ }
+
+ // Reentrant method that calls locked method.
+ ACE_Time_Value tv;
+ ORBSVCS_Time::TimeT_to_Time_Value(tv, mt);
+ switch (this->update_frame (p, tv))
+ {
+ case -1: ACE_THROW_RETURN (Metrics::SYNCHRONIZATION (), -1);
+ case -2: ACE_THROW_RETURN (Metrics::INTERNAL (), -1);
+ default: return 0;
+ }
+}
+
+
+// Updates the passed period's time frame, based on the current time
+// as of the call.
+
+template <class ACE_LOCK>
+ACE_INLINE CORBA::Short
+TAO_Metrics_FrameManager<ACE_LOCK>::
+update_frame (RtecScheduler::Period_t p, CORBA::Environment &ACE_TRY_ENV)
+ ACE_THROW_SPEC ((CORBA::SystemException,
+ Metrics::INTERNAL,
+ Metrics::SYNCHRONIZATION))
+{
+ // Treat a zero period as a special case.
+ if (p == 0)
+ {
+ return 0;
+ }
+
+ TAO_Metrics_Frame_Manager_Data<ACE_LOCK> * data;
+
+ // Synchronize write access to the map during pointer lookup only
+ ACE_Read_Guard<ACE_LOCK> mon (this->lock_);
+ if (mon.locked () == 0)
+ {
+ ACE_THROW_RETURN (Metrics::SYNCHRONIZATION (), -1);
+ }
+
+ if (frame_data_map_.find (p, data) == 0 && data != 0)
+ {
+ mon.release ();
+
+ // Synchronize read/write access to the specific data structure instance during
+ // update
+ ACE_Write_Guard<ACE_LOCK> data_mon (data->lock_);
+ if (data_mon.locked () == 0)
+ {
+ ACE_THROW_RETURN (Metrics::SYNCHRONIZATION (), -1);
+ }
+
+ // Grab the time stamp as late as possible, i.e., after all locks
+ // are held.
+ ACE_Time_Value tv;
+ ACE_hrtime_t hrtime_now = ACE_OS::gethrtime ();
+ ACE_High_Res_Timer::hrtime_to_tv (tv, hrtime_now);
+
+ return update_data (*data, tv);
+ }
+
+ ACE_THROW_RETURN (Metrics::INTERNAL (), -1);
+}
+
+
+// Resets time frames, based on the passed time value.
+
+template <class ACE_LOCK>
+ACE_INLINE CORBA::Short
+TAO_Metrics_FrameManager<ACE_LOCK>::
+reset_all_frames (const ACE_Time_Value& tv)
+{
+ // Synchronize read/write access to the map during the reset
+ ACE_Write_Guard<ACE_LOCK> mon (this->lock_);
+ if (mon.locked () == 0)
+ {
+ return -1;
+ }
+
+ METRICS_FRAME_DATA_MAP_ITERATOR iter (frame_data_map_);
+ while (iter.done () == 0)
+ {
+ reset_data (*((*iter).int_id_), tv);
+ ++iter;
+ }
+ return 0;
+}
+
+
+// Resets time frames, based on the passed time value.
+
+template <class ACE_LOCK>
+ACE_INLINE CORBA::Short
+TAO_Metrics_FrameManager<ACE_LOCK>::
+reset_all_frames_with_time (Metrics::Time mt,
+ CORBA::Environment &ACE_TRY_ENV)
+ ACE_THROW_SPEC ((CORBA::SystemException,
+ Metrics::SYNCHRONIZATION))
+{
+ // Reentrant method that calls locked method.
+ ACE_Time_Value tv;
+ ORBSVCS_Time::TimeT_to_Time_Value(tv, mt);
+ if (this->reset_all_frames (tv) < 0)
+ {
+ ACE_THROW_RETURN (Metrics::SYNCHRONIZATION (), -1);
+ }
+
+ return 0;
+}
+
+// Resets time frames, based on the current time as of the call.
+
+template <class ACE_LOCK>
+ACE_INLINE CORBA::Short
+TAO_Metrics_FrameManager<ACE_LOCK>::
+reset_all_frames (CORBA::Environment &ACE_TRY_ENV)
+ ACE_THROW_SPEC ((CORBA::SystemException,
+ Metrics::SYNCHRONIZATION))
+{
+ // Synchronize read/write access to the map during the reset
+ ACE_Write_Guard<ACE_LOCK> mon (this->lock_);
+ if (mon.locked () == 0)
+ {
+ ACE_THROW_RETURN (Metrics::SYNCHRONIZATION (), -1);
+ }
+
+ METRICS_FRAME_DATA_MAP_ITERATOR iter (frame_data_map_);
+
+ // Grab the time stamp as late as possible, i.e., after all locks
+ // are held.
+ ACE_Time_Value tv;
+ ACE_hrtime_t hrtime_now = ACE_OS::gethrtime ();
+ ACE_High_Res_Timer::hrtime_to_tv (tv, hrtime_now);
+
+ while (iter.done () == 0)
+ {
+ reset_data (* ((*iter).int_id_), tv);
+ ++iter;
+ }
+ return 0;
+}
+
+
+// Resets the passed period's start-of-frame, based on the passed time
+// value.
+
+template <class ACE_LOCK>
+ACE_INLINE CORBA::Short
+TAO_Metrics_FrameManager<ACE_LOCK>::
+reset_frame (RtecScheduler::Period_t p, const ACE_Time_Value& tv)
+{
+ // Treat a zero period as a special case.
+ if (p == 0)
+ {
+ return 0;
+ }
+
+ TAO_Metrics_Frame_Manager_Data<ACE_LOCK> * data;
+
+ // Synchronize write access to the map during lookup only
+ ACE_Read_Guard<ACE_LOCK> mon (this->lock_);
+ if (mon.locked () == 0)
+ {
+ return -1;
+ }
+
+ if (frame_data_map_.find (p, data) == 0 && data != 0)
+ {
+ mon.release ();
+
+ // Synchronize read/write access to the individual data
+ // structure instance during reset
+ ACE_Write_Guard<ACE_LOCK> data_mon (data->lock_);
+ if (data_mon.locked () == 0)
+ {
+ return -1;
+ }
+
+ return reset_data (*data, tv);
+ }
+
+ return -2;
+}
+
+// Resets the passed period's start-of-frame, based on the passed time
+// value.
+
+template <class ACE_LOCK>
+ACE_INLINE CORBA::Short
+TAO_Metrics_FrameManager<ACE_LOCK>::
+reset_frame_with_time (RtecScheduler::Period_t p, Metrics::Time mt,
+ CORBA::Environment &ACE_TRY_ENV)
+ ACE_THROW_SPEC ((CORBA::SystemException,
+ Metrics::INTERNAL,
+ Metrics::SYNCHRONIZATION))
+{
+ // Treat a zero period as a special case.
+ if (p == 0)
+ {
+ return 0;
+ }
+
+ // Reentrant method that calls locked method.
+ ACE_Time_Value tv;
+ ORBSVCS_Time::TimeT_to_Time_Value(tv, mt);
+ switch (this->reset_frame (p, tv))
+ {
+ case -1: ACE_THROW_RETURN (Metrics::SYNCHRONIZATION (), -1);
+ case -2: ACE_THROW_RETURN (Metrics::INTERNAL (), -1);
+ default: return 0;
+ }
+}
+
+
+// Resets the passed period's start-of-frame, based on the current
+// time as of the call.
+
+template <class ACE_LOCK>
+ACE_INLINE CORBA::Short
+TAO_Metrics_FrameManager<ACE_LOCK>::
+reset_frame (RtecScheduler::Period_t p, CORBA::Environment &ACE_TRY_ENV)
+ ACE_THROW_SPEC ((CORBA::SystemException,
+ Metrics::INTERNAL,
+ Metrics::SYNCHRONIZATION))
+{
+ // Treat a zero period as a special case.
+ if (p == 0)
+ {
+ return 0;
+ }
+
+ TAO_Metrics_Frame_Manager_Data<ACE_LOCK> * data;
+
+ // Synchronize write access to the map during lookup only
+ ACE_Read_Guard<ACE_LOCK> mon (this->lock_);
+ if (mon.locked () == 0)
+ {
+ ACE_THROW_RETURN (Metrics::SYNCHRONIZATION (), -1);
+ }
+
+ if (frame_data_map_.find (p, data) == 0 && data != 0)
+ {
+ mon.release ();
+
+ // Synchronize read/write access to the individual data
+ // structure instance during reset
+ ACE_Write_Guard<ACE_LOCK> data_mon (data->lock_);
+ if (data_mon.locked () == 0)
+ {
+ ACE_THROW_RETURN (Metrics::SYNCHRONIZATION (), -1);
+ }
+
+ // Grab the time stamp as late as possible, i.e., after all locks
+ // are held.
+ ACE_Time_Value tv;
+ ACE_hrtime_t hrtime_now = ACE_OS::gethrtime ();
+ ACE_High_Res_Timer::hrtime_to_tv (tv, hrtime_now);
+
+ if (data == 0)
+ {
+ ACE_THROW_RETURN (Metrics::INTERNAL (), -1);
+ }
+
+ return reset_data (*data, tv);
+ }
+
+ ACE_THROW_RETURN (Metrics::INTERNAL (), -1);
+}
+
+
+// Gets the start time for the period's current frame.
+
+template <class ACE_LOCK>
+ACE_INLINE CORBA::Short
+TAO_Metrics_FrameManager<ACE_LOCK>::
+get_start_time (RtecScheduler::Period_t p, ACE_Time_Value &start)
+{
+ // Treat a zero period as a special case.
+ if (p == 0)
+ {
+ start = ACE_Time_Value::zero;
+ return 0;
+ }
+
+ TAO_Metrics_Frame_Manager_Data<ACE_LOCK> * data;
+
+ // Synchronize write access to the map during lookup only
+ ACE_Read_Guard<ACE_LOCK> mon (this->lock_);
+ if (mon.locked () == 0)
+ {
+ return -1;
+ }
+
+ if (frame_data_map_.find (p, data) == 0 && data != 0)
+ {
+ mon.release ();
+
+ // Synchronize write access to the individual data structure instance
+ ACE_Read_Guard<ACE_LOCK> data_mon (data->lock_);
+ if (data_mon.locked () == 0)
+ {
+ return -1;
+ }
+
+ start.set (data->start_.sec (), data->start_.usec ());
+ return 0;
+ }
+
+ return -2;
+}
+
+// Gets the start time for the period's current frame.
+
+template <class ACE_LOCK>
+ACE_INLINE CORBA::Short
+TAO_Metrics_FrameManager<ACE_LOCK>::
+get_start_time (RtecScheduler::Period_t p, Metrics::Time &start,
+ CORBA::Environment &ACE_TRY_ENV)
+ ACE_THROW_SPEC ((CORBA::SystemException,
+ Metrics::INTERNAL,
+ Metrics::SYNCHRONIZATION))
+{
+ // Treat a zero period as a special case.
+ if (p == 0)
+ {
+ start = 0;
+ return 0;
+ }
+
+ // Reentrant method that calls locked method.
+ ACE_Time_Value tv;
+ switch (this->get_start_time (p, tv))
+ {
+ case -1: ACE_THROW_RETURN (Metrics::SYNCHRONIZATION (), -1);
+ case -2: ACE_THROW_RETURN (Metrics::INTERNAL (), -1);
+ default: ORBSVCS_Time::Time_Value_to_TimeT (start, tv);
+ return 0;
+ }
+}
+
+
+// Gets the end time for the period's current frame.
+
+template <class ACE_LOCK>
+ACE_INLINE CORBA::Short
+TAO_Metrics_FrameManager<ACE_LOCK>::
+get_end_time (RtecScheduler::Period_t p, ACE_Time_Value &end)
+{
+ // Treat a zero period as a special case.
+ if (p == 0)
+ {
+ end = ACE_Time_Value::zero;
+ return 0;
+ }
+
+ TAO_Metrics_Frame_Manager_Data<ACE_LOCK> * data = 0;
+
+ // Synchronize write access to the map during lookup only
+ ACE_Read_Guard<ACE_LOCK> mon (this->lock_);
+ if (mon.locked () == 0)
+ {
+ return -1;
+ }
+
+ if (frame_data_map_.find (p, data) == 0 && data != 0)
+ {
+ mon.release ();
+
+ // Synchronize write access to the individual data structure instance
+ ACE_Read_Guard<ACE_LOCK> data_mon (data->lock_);
+ if (data_mon.locked () == 0)
+ {
+ return -1;
+ }
+
+ end.set (data->end_.sec (), data->end_.usec ());
+ return 0;
+ }
+
+ return -2;
+}
+
+
+// Gets the end time for the period's current frame.
+
+template <class ACE_LOCK>
+ACE_INLINE CORBA::Short
+TAO_Metrics_FrameManager<ACE_LOCK>::
+get_end_time (RtecScheduler::Period_t p, Metrics::Time &end,
+ CORBA::Environment &ACE_TRY_ENV)
+ ACE_THROW_SPEC ((CORBA::SystemException,
+ Metrics::INTERNAL,
+ Metrics::SYNCHRONIZATION))
+{
+ // Treat a zero period as a special case.
+ if (p == 0)
+ {
+ end = 0;
+ return 0;
+ }
+
+ // Reentrant method that calls locked method.
+ ACE_Time_Value tv;
+ switch (this->get_end_time (p, tv))
+ {
+ case -1: ACE_THROW_RETURN (Metrics::SYNCHRONIZATION (), -1);
+ case -2: ACE_THROW_RETURN (Metrics::INTERNAL (), -1);
+ default: ORBSVCS_Time::Time_Value_to_TimeT (end, tv);
+ return 0;
+ }
+}
+
+// Gets the locally unique identifier for the period's current frame.
+
+template <class ACE_LOCK>
+ACE_INLINE CORBA::Short
+TAO_Metrics_FrameManager<ACE_LOCK>::
+get_frame_id (RtecScheduler::Period_t p,
+ CORBA::ULong &id,
+ CORBA::Environment &ACE_TRY_ENV)
+ ACE_THROW_SPEC ((CORBA::SystemException,
+ Metrics::INTERNAL,
+ Metrics::SYNCHRONIZATION))
+{
+ // Treat a zero period as a special case.
+ if (p == 0)
+ {
+ id = 0;
+ return 0;
+ }
+
+ TAO_Metrics_Frame_Manager_Data<ACE_LOCK> * data;
+
+ // Synchronize write access to the map during lookup only
+ ACE_Read_Guard<ACE_LOCK> mon (this->lock_);
+ if (mon.locked () == 0)
+ {
+ ACE_THROW_RETURN (Metrics::SYNCHRONIZATION (), -1);
+ }
+
+ if (frame_data_map_.find (p, data) == 0 && data != 0)
+ {
+ mon.release ();
+
+ // Synchronize write access to the individual data structure instance
+ ACE_Read_Guard<ACE_LOCK> data_mon (data->lock_);
+ if (data_mon.locked () == 0)
+ {
+ ACE_THROW_RETURN (Metrics::SYNCHRONIZATION (), -1);
+ }
+
+ id = data->frame_id_;
+ return 0;
+ }
+
+ ACE_THROW_RETURN (Metrics::INTERNAL (), -1);
+}
+
+
+// Gets the start time, end time, and id period's current frame.
+
+template <class ACE_LOCK>
+ACE_INLINE CORBA::Short
+TAO_Metrics_FrameManager<ACE_LOCK>::
+get_frame_data (RtecScheduler::Period_t p, ACE_Time_Value &start,
+ ACE_Time_Value &end, CORBA::ULong &id)
+{
+ // Treat a zero period as a special case.
+ if (p == 0)
+ {
+ start = ACE_Time_Value::zero;
+ end = ACE_Time_Value::zero;
+ id = 0;
+ return 0;
+ }
+
+ TAO_Metrics_Frame_Manager_Data<ACE_LOCK> * data;
+
+ // Synchronize write access to the map during lookup only
+ ACE_Read_Guard<ACE_LOCK> mon (this->lock_);
+ if (mon.locked () == 0)
+ {
+ return -1;
+ }
+
+ if (frame_data_map_.find (p, data) == 0 && data != 0)
+ {
+ mon.release ();
+
+ // Synchronize write access to the individual data structure instance
+ ACE_Read_Guard<ACE_LOCK> data_mon (data->lock_);
+ if (data_mon.locked () == 0)
+ {
+ return -1;
+ }
+
+ start.set (data->start_.sec (), data->start_.usec ());
+ end.set (data->end_.sec (), data->end_.usec ());
+ id = data->frame_id_;
+ return 0;
+ }
+
+ return -2;
+}
+
+
+
+// Gets the start time, end time, and id period's current frame.
+
+template <class ACE_LOCK>
+ACE_INLINE CORBA::Short
+TAO_Metrics_FrameManager<ACE_LOCK>::
+get_frame_data (RtecScheduler::Period_t p, Metrics::Time &start,
+ Metrics::Time &end, CORBA::ULong &id,
+ CORBA::Environment &ACE_TRY_ENV)
+ ACE_THROW_SPEC ((CORBA::SystemException,
+ Metrics::INTERNAL,
+ Metrics::SYNCHRONIZATION))
+{
+ // Treat a zero period as a special case.
+ if (p == 0)
+ {
+ start = 0;
+ end = 0;
+ id = 0;
+ return 0;
+ }
+
+ // Reentrant method that calls locked method.
+ ACE_Time_Value start_tv, end_tv;
+ switch (this->get_frame_data (p, start_tv, end_tv, id))
+ {
+ case -1: ACE_THROW_RETURN (Metrics::SYNCHRONIZATION (), -1);
+ case -2: ACE_THROW_RETURN (Metrics::INTERNAL (), -1);
+ default: ORBSVCS_Time::Time_Value_to_TimeT (start, start_tv);
+ ORBSVCS_Time::Time_Value_to_TimeT (end, end_tv);
+ return 0;
+ }
+}
+
+
+// Updates the passed frame data structure's start and end times,
+// based on the passed time value. This is a protected internal
+// method, and should only be called with locks already held.
+
+template <class ACE_LOCK>
+ACE_INLINE CORBA::Short
+TAO_Metrics_FrameManager<ACE_LOCK>::
+update_data (TAO_Metrics_Frame_Manager_Data<ACE_LOCK> & data, const ACE_Time_Value& tv)
+{
+ if (data.end_ == ACE_Time_Value::zero)
+ {
+ return reset_data (data, tv);
+ }
+
+ // Advance to the frame that encloses the passed time value.
+ while (data.end_ < tv)
+ {
+ data.end_ += data.period_;
+ ++data.frame_id_;
+ }
+
+ data.start_.set (data.end_.sec (), data.end_.usec ());
+ data.start_ -= data.period_;
+ return 0;
+}
+
+
+// Resets the passed frame data structure's start and end times, to
+// the passed time value and one period later, respectively. This is
+// a protected internal method, and should only be called with locks
+// already held.
+
+template <class ACE_LOCK>
+ACE_INLINE CORBA::Short
+TAO_Metrics_FrameManager<ACE_LOCK>::
+reset_data (TAO_Metrics_Frame_Manager_Data<ACE_LOCK> & data, const ACE_Time_Value& tv)
+{
+ data.start_.set (tv.sec (), tv.usec ());
+ data.end_.set (tv.sec () + data.period_.sec (),
+ tv.usec () + data.period_.usec ());
+ return 0;
+}
+
+
+#endif /* METRICS_FRAME_MANAGER_T_I */
+
diff --git a/TAO/orbsvcs/orbsvcs/Metrics/Metrics_LocalCache.cpp b/TAO/orbsvcs/orbsvcs/Metrics/Metrics_LocalCache.cpp
new file mode 100644
index 00000000000..c1b7f9eb788
--- /dev/null
+++ b/TAO/orbsvcs/orbsvcs/Metrics/Metrics_LocalCache.cpp
@@ -0,0 +1,12 @@
+// $Id$
+
+#ifndef METRICS_LOCAL_CACHE_CPP
+#define METRICS_LOCAL_CACHE_CPP
+
+#include "orbsvcs/Metrics/Metrics_LocalCache.h"
+
+#if !defined (__ACE_INLINE__)
+#include "orbsvcs/Metrics/Metrics_LocalCache.i"
+#endif /* __ACE_INLINE__ */
+
+#endif /* METRICS_LOCAL_CACHE_CPP */
diff --git a/TAO/orbsvcs/orbsvcs/Metrics/Metrics_LocalCache.h b/TAO/orbsvcs/orbsvcs/Metrics/Metrics_LocalCache.h
new file mode 100644
index 00000000000..71fcb092381
--- /dev/null
+++ b/TAO/orbsvcs/orbsvcs/Metrics/Metrics_LocalCache.h
@@ -0,0 +1,115 @@
+// -*- C++ -*-
+//
+// $Id$
+
+#ifndef METRICS_LOCAL_CACHE_H
+#define METRICS_LOCAL_CACHE_H
+
+#include /**/ "ace/pre.h"
+
+#include "ace/config-all.h"
+
+#if !defined (ACE_LACKS_PRAGMA_ONCE)
+# pragma once
+#endif /* ACE_LACKS_PRAGMA_ONCE */
+
+#include "ace/Hash_Map_Manager.h"
+#include "ace/Metrics_Cache.h"
+#include "ace/Metrics_Cache_T.h"
+#include "ace/Singleton.h"
+#include "ace/Synch_Traits.h"
+#include "ace/Thread_Mutex.h"
+
+#include "orbsvcs/Time_Utilities.h"
+#include "orbsvcs/Scheduler_Factory.h"
+#include "orbsvcs/MetricsC.h"
+
+#include "orbsvcs/Metrics/Metrics_Utils.h"
+
+#if defined (ACE_METRICS_COLLECTION)
+
+#if defined (ACE_ENABLE_TIMEPROBES) && defined (ACE_COMPILE_TIMEPROBES)
+
+#include "orbsvcs/Metrics/Metrics_LocalCache_T.h"
+
+TAO_BEGIN_VERSIONED_NAMESPACE_DECL
+
+typedef TAO_Metrics_LocalCache<ACE_SYNCH_MUTEX, ACE_New_Allocator>
+TAO_METRICS_CACHE_TYPE;
+
+typedef ACE_Singleton<TAO_METRICS_CACHE_TYPE, ACE_SYNCH_MUTEX>
+TAO_METRICS_CACHE_SINGLETON_TYPE;
+
+typedef TAO_Metrics_ReportingLocalCache<ACE_SYNCH_MUTEX, ACE_New_Allocator>
+TAO_METRICS_REPORTING_CACHE_TYPE;
+
+typedef ACE_Singleton<TAO_METRICS_REPORTING_CACHE_TYPE, ACE_SYNCH_MUTEX>
+TAO_METRICS_REPORTING_CACHE_SINGLETON_TYPE;
+
+#if defined (TAO_USES_REPORTING_METRICS)
+typedef TAO_METRICS_REPORTING_CACHE_TYPE TAO_METRICS_CACHE;
+typedef TAO_METRICS_REPORTING_CACHE_SINGLETON_TYPE TAO_METRICS_CACHE_SINGLETON;
+#else
+typedef TAO_METRICS_CACHE_TYPE TAO_METRICS_CACHE;
+typedef TAO_METRICS_CACHE_SINGLETON_TYPE TAO_METRICS_CACHE_SINGLETON;
+#endif
+
+/**
+ * NOTE: This is a simple macro which calls the appropriate registration function with the cache to
+ * store the data from this pointer. At the ACE level there is no need to give a PROBE_TYPE
+ * because there is only one probe type (ACE_Timeprobe).
+ *
+ * USAGE_LEVEL: TAO
+ *
+ * Q1: Where is this and the next macro used? One example is on TAO/orbsvcs/orbsvcs/Metrics. No where in the ace code.
+ * So is this a ACE or TAO macro?
+ *
+ * Q2: Is the function (register + METRICS_REGION) a ACE or TAO?
+ * A2: TAO. Define in Metrics_Local_Cache_T.h. The only METRICS_REGION that exists is 'base_metrics'. Used
+ * in $TAO_ROOT/orbsvcs/orbsvcs/Metrics/Metrics_Utils.cpp
+ *
+ * @param METRICS_PTR - Initialized pointer to the Metrics_Cache. This pointer is used to register the probe
+ * with the associated cache.
+ * @param METIRCS_REGION - At present there is only one 'base_metrics'.
+ * @param PROBE_NAME - String name of the probe
+ * @param PROBE_TYPE - Unsigned integer representing the probe type
+ * @param METRICS_HANDLE - Variable used to contain the metrics probe handle that is the result of this function
+ * The type of the handle is a RtecScheduler::handle_t
+ */
+# define REGISTER_METRICS_PROBE_RETURN(METRICS_PTR,METRICS_REGION,PROBE_NAME,PROBE_TYPE,METRICS_HANDLE) \
+do { if((METRICS_PTR->metrics_enabled())) { \
+METRICS_HANDLE = METRICS_PTR-> \
+register_##METRICS_REGION ( \
+PROBE_NAME, \
+PROBE_TYPE); \
+} } while (0)
+
+/**
+ * Same as above but instead of just reporting information to a cache there is also reference to a Metrics_Loger (TAO feature).
+ * The logger is used to record the information. The type of probe is register with the logger
+ *
+ * USAGE_LEVEL: TAO
+ */
+# define REGISTER_METRICS_REPORTING_PROBE_RETURN(METRICS_PTR,METRICS_REGION,PROBE_NAME,PROBE_TYPE,METRICS_LOGGER_REF,METRICS_HANDLE) \
+do { if((METRICS_PTR->metrics_enabled())) { \
+METRICS_HANDLE = METRICS_PTR-> \
+register_##METRICS_REGION## ( \
+PROBE_NAME, \
+PROBE_TYPE, \
+METRICS_LOGGER_REF); \
+} } while (0)
+
+
+TAO_END_VERSIONED_NAMESPACE_DECL
+
+#if defined (__ACE_INLINE__)
+#include "orbsvcs/Metrics/Metrics_LocalCache.i"
+#endif /* __ACE_INLINE__ */
+
+#endif /* ACE_ENABLE_TIMEPROBES && ACE_COMPILE_TIMEPROBES */
+#endif /* ACE_METRICS_COLLECTION */
+
+#include /**/ "ace/post.h"
+
+#endif /* METRICS_LOCAL_CACHE_H */
+
diff --git a/TAO/orbsvcs/orbsvcs/Metrics/Metrics_LocalCache.i b/TAO/orbsvcs/orbsvcs/Metrics/Metrics_LocalCache.i
new file mode 100644
index 00000000000..a9ccf1b5acd
--- /dev/null
+++ b/TAO/orbsvcs/orbsvcs/Metrics/Metrics_LocalCache.i
@@ -0,0 +1,10 @@
+// $Id$
+
+#ifndef METRICS_LOCAL_CACHE_I
+#define METRICS_LOCAL_CACHE_I
+
+#endif /* METRICS_LOCAL_CACHE_I */
+
+
+
+
diff --git a/TAO/orbsvcs/orbsvcs/Metrics/Metrics_LocalCache_T.cpp b/TAO/orbsvcs/orbsvcs/Metrics/Metrics_LocalCache_T.cpp
new file mode 100644
index 00000000000..2478ce10532
--- /dev/null
+++ b/TAO/orbsvcs/orbsvcs/Metrics/Metrics_LocalCache_T.cpp
@@ -0,0 +1,488 @@
+// $Id$
+
+#ifndef METRICS_LOCAL_CACHE_T_CPP
+#define METRICS_LOCAL_CACHE_T_CPP
+
+#include "orbsvcs/Metrics/Metrics_LocalCache_T.h"
+
+#if defined VXWORKS
+#include <cacheLib.h>
+#endif
+
+TAO_BEGIN_VERSIONED_NAMESPACE_DECL
+
+//////////////////////////////////////
+// Class TAO_Metrics_LocalTimeprobe //
+//////////////////////////////////////
+
+// Default constructor.
+
+template <class ACE_LOCK, class ALLOCATOR>
+TAO_Metrics_LocalTimeprobe<ACE_LOCK, ALLOCATOR>::
+TAO_Metrics_LocalTimeprobe (u_int id,
+ const char *name,
+ u_long size,
+ ALLOCATOR * alloc)
+ : ACE_Metrics_Timeprobe<ACE_LOCK, ALLOCATOR> (alloc, id, name, size),
+ is_operation_ (0),
+ is_hrt_ (0),
+ data_set_ (0)
+{
+}
+
+template <class ACE_LOCK, class ALLOCATOR>
+void
+TAO_Metrics_LocalTimeprobe<ACE_LOCK, ALLOCATOR>::report_intervals (int report_full_interval_times)
+{
+ u_long data_set_length = 0;
+
+ // Modified by BRM. This should also work for ACE_Based_Pointer since the conversion
+ // operator should fire.
+ // Metrics::TimeprobeParameter_Set * data_set = data_set_.addr ();
+ Metrics::TimeprobeParameter_Set * data_set = data_set_;
+
+ //ACE_Time_Value full_start_time (ACE_Time_Value::zero);
+ ACE_hrtime_t full_start_time = 0;
+ //ACE_Time_Value full_stop_time (ACE_Time_Value::zero);
+ ACE_hrtime_t full_stop_time = 0;
+
+ if (!data_set)
+ {
+#if defined (METRICS_CACHE_ERROR_OUTPUT_ENABLED)
+ ACE_ERROR ((LM_ERROR,
+ "TAO_Metrics_LocalTimeprobe::report_intervals:"
+ " no data set installed"));
+#endif
+ return;
+ }
+ else
+ {
+ data_set_length = data_set->length ();
+ }
+
+ if (this->current_size_ == 0 && this->report_buffer_full_ == 0)
+ return;
+
+ u_long valid_intervals = 0;
+ int good_interval;
+
+ // Note the case of current_size_ and report_buffer_full_ both being
+ // 0 was checked above, which simplifies this code.
+ // This logic make no sense to me. What are you going for here, Chris?
+ // If the buffer fills, then report_buffer_full == 1, and current size == 0.
+ // We always needs i to start at 0, though?????
+ // u_long i;
+ // i = (report_buffer_full_ == 0) ? 1 : this->current_size_;
+ u_long start_evt_ndx = 0;
+ u_long full_interval_start_evt_ndx = 0;
+ u_long full_interval_start_ndx_set = 0;
+ u_long stop_evt_ndx = 0;
+ short any_cross_thread_event = 0;
+ short is_cross_thread_event = 0;
+ do
+ {
+ // Begin a new interval at each successive start event.
+ if (is_event (this->timeprobes ()[start_evt_ndx],
+ ACE_Metrics_Timeprobe<ACE_LOCK, ALLOCATOR>::WORK_START))
+ {
+ // If we see the start event, then reset the cross thread indicator
+ is_cross_thread_event = 0;
+
+ if (!full_interval_start_ndx_set)
+ {
+ full_interval_start_ndx_set = 1;
+ full_interval_start_evt_ndx = start_evt_ndx;
+ }
+
+ // Accumulates elapsed time in the measured interval, taking
+ // into account paired suspend and resume markers.
+ ACE_Time_Value elapsed_time (ACE_Time_Value::zero);
+
+ // Stores current start time: either from a start or resume event.
+ ACE_Time_Value start_time (this->timeprobes ()[start_evt_ndx].time_);
+
+ // Check if this start time is less than the full interval for worse
+ // case time.
+ if (full_start_time == 0 ||
+ this->timeprobes ()[start_evt_ndx].time_ < full_start_time)
+ {
+ full_start_time = this->timeprobes ()[start_evt_ndx].time_;
+ }
+ if (full_stop_time == 0 ||
+ this->timeprobes ()[start_evt_ndx].time_ > full_stop_time)
+ {
+ full_stop_time = this->timeprobes ()[start_evt_ndx].time_;
+ }
+
+ good_interval = 1;
+
+ // Increment past the start event and start looking for the stop event
+ u_long stop_or_suspend_evt_ndx = (start_evt_ndx + 1) % this ->max_size_; // Modulus increment: loops around at the end.
+ do
+ {
+ // If the index is at the end, skip and exit the loop.
+ if (stop_or_suspend_evt_ndx == this->current_size_)
+ {
+ break;
+ }
+
+ // This needs to be rethought... Events that occur across threads are a real thing.
+ // So for now, the behavior is to just indicate the events that are cross thread
+// if (this->timeprobes ()[start_evt_ndx].thread_ != this->timeprobes ()[stop_or_suspend_evt_ndx].thread_)
+// {
+// stop_or_suspend_evt_ndx = (stop_or_suspend_evt_ndx + 1) % this ->max_size_; // Modulus increment: loops around at the end.
+// continue;
+// }
+
+ // Check for the stop event
+ if (is_event (this->timeprobes ()[stop_or_suspend_evt_ndx],
+ ACE_Metrics_Timeprobe<ACE_LOCK, ALLOCATOR>::WORK_STOP))
+ {
+ ++valid_intervals;
+
+ if (this->timeprobes ()[start_evt_ndx].thread_ != this->timeprobes ()[stop_or_suspend_evt_ndx].thread_)
+ {
+ // If any probe is cross, thread then the interval is cross thread.
+ any_cross_thread_event = 1;
+
+ is_cross_thread_event = 1;
+ }
+
+ // done this way for efficiency: no temporaries constructed
+ elapsed_time += this->timeprobes ()[stop_or_suspend_evt_ndx].time_;
+ elapsed_time -= start_time;
+
+ // This doesn't make sense. Full start time better be the result of
+ // a start event.
+// if (full_start_time == ACE_Time_Value::zero ||
+// this->timeprobes ()[j].time_ < full_start_time)
+// {
+// full_start_time.set (this->timeprobes()[j].time_.sec (),
+// this->timeprobes()[j].time_.usec());
+// }
+
+ if (full_stop_time == 0 ||
+ this->timeprobes ()[stop_or_suspend_evt_ndx].time_ > full_stop_time)
+ {
+ full_stop_time = this->timeprobes()[stop_or_suspend_evt_ndx].time_;
+ }
+
+ stop_evt_ndx = stop_or_suspend_evt_ndx;
+ // Increase the length of the data set and record
+ // the interval info.
+ ++data_set_length;
+ data_set->length (data_set_length);
+ (*(data_set))[data_set_length-1].is_full_interval = 0;
+ (*(data_set))[data_set_length-1].probe_id = this->id_;
+ (*(data_set))[data_set_length-1].is_operation = this->is_operation_;
+ (*(data_set))[data_set_length-1].is_hrt = this->is_hrt_;
+ (*(data_set))[data_set_length-1].cross_thread_probe = is_cross_thread_event;
+ ORBSVCS_Time::Time_Value_to_TimeT
+ ((*(data_set)) [data_set_length-1].start_event_time,
+ this->timeprobes ()[start_evt_ndx].time_);
+ ORBSVCS_Time::Time_Value_to_TimeT
+ ((*(data_set)) [data_set_length-1].stop_event_time,
+ this->timeprobes ()[stop_or_suspend_evt_ndx].time_);
+ ORBSVCS_Time::Time_Value_to_TimeT
+ ((*(data_set)) [data_set_length-1].interval,
+ elapsed_time);
+#if defined (METRICS_CACHE_DEBUG_OUTPUT_ENABLED)
+ ACE_OS::printf (" %9lu\n",
+ (u_long)
+ ACE_U64_TO_U32((*(data_set))
+ [data_set_length-1].interval
+ / 10));
+#endif
+ break;
+ }
+
+ // If it wasn't a stop event, check for a suspend event
+#if defined (ACE_HAS_METRICS_BASE_POINTERS)
+ else if (this->timeprobes ()[stop_or_suspend_evt_ndx].event_ == (u_long)
+ ACE_Metrics_Timeprobe<ACE_LOCK, ALLOCATOR>::WORK_SUSPEND)
+#else
+ else if (this->timeprobes ()[stop_or_suspend_evt_ndx].event_.event_number_ == (u_long)
+ ACE_Metrics_Timeprobe<ACE_LOCK, ALLOCATOR>::WORK_SUSPEND)
+#endif
+ {
+ u_long resume_evt_ndx = (stop_or_suspend_evt_ndx + 1) % this ->max_size_; // Modulus increment: loops around at the end.
+ do
+ {
+ // Skip until we reach the next event in the same thread, or if the
+ // index is at the end, skip and exit the loop.
+// if (this->timeprobes ()[j].thread_ != this->timeprobes ()[k].thread_
+// || k == this->current_size_)
+// {
+// continue;
+// }
+
+ // If we saw a suspend event, the next event has to be a resume event
+ if (is_event (this->timeprobes ()[resume_evt_ndx],
+ ACE_Metrics_Timeprobe<ACE_LOCK, ALLOCATOR>::WORK_RESUME))
+ {
+ // Store the elapsed time between the last
+ // start and the suspend event.
+ elapsed_time +=
+ this->timeprobes ()[stop_or_suspend_evt_ndx].time_ - start_time;
+
+ // Update the start time to be that of the
+ // resume event.
+ start_time = this->timeprobes ()[resume_evt_ndx].time_;
+
+ // This code doesn't make sense here. It always has to hit the stop to
+ // adjust the stop time. Anything else is a partial and invalid.
+// if (full_start_time == ACE_Time_Value::zero ||
+// this->timeprobes ()[resume_evt_ndx].time_ < full_start_time)
+// {
+// full_start_time.
+// set (this->timeprobes()[resume_evt_ndx].time_.sec (),
+// this->timeprobes()[resume_evt_ndx].time_.usec ());
+// }
+// if (full_stop_time == ACE_Time_Value::zero ||
+// this->timeprobes ()[resume_evt_ndx].time_ > full_stop_time)
+// {
+// full_stop_time.
+// set (this->timeprobes()[resume_evt_ndx].time_.sec (),
+// this->timeprobes()[resume_evt_ndx].time_.usec ());
+// }
+
+
+ // Keep looking for the end of the interval
+ // after the resume event.
+ stop_or_suspend_evt_ndx = resume_evt_ndx;
+ break;
+ }
+ else if (is_event (this->timeprobes ()[resume_evt_ndx],
+ ACE_Metrics_Timeprobe<ACE_LOCK, ALLOCATOR>::WORK_START) ||
+ is_event (this->timeprobes ()[resume_evt_ndx],
+ ACE_Metrics_Timeprobe<ACE_LOCK, ALLOCATOR>::WORK_STOP) ||
+ is_event (this->timeprobes ()[resume_evt_ndx],
+ ACE_Metrics_Timeprobe<ACE_LOCK, ALLOCATOR>::WORK_SUSPEND))
+ {
+ // Something went wrong during the current interval:
+ // just ignore the previous start time stamp.
+ good_interval = 0;
+ break;
+ }
+
+ resume_evt_ndx = (resume_evt_ndx + 1) % this ->max_size_; // Modulus increment: loops around at the end.
+
+ } while (resume_evt_ndx != this->current_size_);
+ }
+
+ // If we got a start event, make sure that we don't see another start or resume
+ // until we see a stop or suspend event
+ else if (is_event (this->timeprobes ()[stop_or_suspend_evt_ndx],
+ ACE_Metrics_Timeprobe<ACE_LOCK, ALLOCATOR>::WORK_START) ||
+ is_event (this->timeprobes ()[stop_or_suspend_evt_ndx],
+ ACE_Metrics_Timeprobe<ACE_LOCK, ALLOCATOR>::WORK_RESUME))
+ {
+ // Something went wrong during the current interval:
+ // just ignore the previous start time stamp.
+ break;
+ }
+
+ stop_or_suspend_evt_ndx = (stop_or_suspend_evt_ndx + 1) % this ->max_size_; // Modulus increment: loops around at the end.
+
+ } while (stop_or_suspend_evt_ndx != this->current_size_ && good_interval);
+
+ // If we found the stop of
+ start_evt_ndx = stop_or_suspend_evt_ndx;
+ }
+
+ start_evt_ndx = (start_evt_ndx + 1) % this ->max_size_; // Modulus increment: loops around at the end.
+
+ } while (start_evt_ndx < this->current_size_);
+
+
+ if (report_full_interval_times)
+ {
+ // Increase the length of the data set and record the full interval.
+ ++data_set_length;
+ data_set->length (data_set_length);
+ (*(data_set))[data_set_length-1].is_full_interval = 1;
+ (*(data_set))[data_set_length-1].probe_id = this->id_;
+ (*(data_set))[data_set_length-1].is_operation = this->is_operation_;
+ (*(data_set))[data_set_length-1].is_hrt = this->is_hrt_;
+ (*(data_set))[data_set_length-1].cross_thread_probe = any_cross_thread_event;
+ ORBSVCS_Time::Time_Value_to_TimeT
+ ((*(data_set)) [data_set_length-1].start_event_time,
+ this->timeprobes ()[start_evt_ndx].time_);
+ ORBSVCS_Time::Time_Value_to_TimeT
+ ((*(data_set)) [data_set_length-1].stop_event_time,
+ this->timeprobes ()[stop_evt_ndx].time_);
+ ORBSVCS_Time::Time_Value_to_TimeT(
+ (*(data_set))[data_set_length-1].interval,
+ full_stop_time - full_start_time);
+ }
+}
+
+
+// Flush the TAO metrics local timeprobe into shared memory.
+
+template <class ACE_LOCK, class ALLOCATOR>
+void
+TAO_Metrics_LocalTimeprobe<ACE_LOCK, ALLOCATOR>::flush_TAO_Metrics_LocalTimeprobe ()
+{
+// TBD - 1) replace VXWORKS with a nicer ACE/TAO #define
+// 2) provide a general capability to apply an arbitrary
+// functor to the whole data structure framework (e.g., flush).
+
+#if defined VXWORKS
+ // TBD - implement this
+#endif
+}
+
+
+//////////////////////////////////
+// Class TAO_Metrics_LocalCache //
+//////////////////////////////////
+
+
+template <class ACE_LOCK, class ALLOCATOR>
+void
+TAO_Metrics_LocalCache<ACE_LOCK, ALLOCATOR>::reset_statistics ()
+{
+ // Call the base class reset method first.
+ this->reset_base_statistics ();
+
+ // Iterate over consumer side base map,
+ // resetting probes.
+ METRICS_BASE_MONITOR_MAP_ITERATOR
+ base_iter (this->base_monitor_maps_ [this->consumer_index_]);
+
+ for (TAO_Metrics_Cache_Data_Base * data_base = 0;
+ base_iter.done () == 0;
+ ++base_iter)
+ {
+ // Modified by BRM. This should also work for ACE_Based_Pointer since the conversion
+ // operator should fire.
+// data_base = (*base_iter).int_id_.addr ();
+ data_base = (*base_iter).int_id_;
+ // Modified by BRM. This should also work for ACE_Based_Pointer since the conversion
+ // operator should fire.
+// if (data_base.addr ())
+ if (data_base)
+ {
+ data_base->probe.reset ();
+ }
+ }
+
+
+ // Iterate over consumer side monitor map,
+ // resetting counts and probes.
+ METRICS_MONITOR_MAP_ITERATOR data_iter (this->
+ monitor_maps_ [this->
+ consumer_index_]);
+ for (TAO_Metrics_Cache_Data * data = 0;
+ data_iter.done () == 0;
+ ++data_iter)
+ {
+ // Modified by BRM. This should also work for ACE_Based_Pointer since the conversion
+ // operator should fire.
+// data = (*data_iter).int_id_.addr ();
+ data = (*data_iter).int_id_;
+ if (data)
+ {
+ data->probe.reset ();
+ data->missed_deadlines = 0;
+ data->made_deadlines = 0;
+ data->cancellations = 0;
+ }
+ }
+}
+
+
+// Flush the TAO local metrics cache into shared memory.
+
+template <class ACE_LOCK, class ALLOCATOR>
+void
+TAO_Metrics_LocalCache<ACE_LOCK, ALLOCATOR>::
+flush_TAO_Metrics_LocalCache ()
+{
+#if defined VXWORKS
+
+ // TBD - fix this: is it complete?
+
+ // TBD - add base metrics map flush
+
+ // TBD - do probes need their own flush method?
+
+ // flush the class
+ // cacheFlush (
+ // DATA_CACHE,
+ // this,
+ // sizeof (TAO_Metrics_LocalCache<ACE_LOCK, ALLOCATOR>));
+
+ // flush the monitor data map hash table
+ // cacheFlush (DATA_CACHE,
+ // &monitor_maps_ [this->consumer_index_],
+ // sizeof (METRICS_MONITOR_MAP));
+
+ // flush the nodes in the monitor data map hash table
+ // and the data stored in the nodes.
+ // METRICS_MONITOR_MAP_ITERATOR data_iter (this->
+ // monitor_maps_ [this->
+ // consumer_index_]);
+ // for (;
+ // data_iter.done () == 0;
+ // ++data_iter)
+ // {
+ // METRICS_MONITOR_MAP_ENTRY *entry;
+ // data_iter.next (entry);
+ // if (entry)
+ // {
+ // cacheFlush (DATA_CACHE,
+ // entry,
+ // sizeof (METRICS_MONITOR_MAP_ENTRY));
+ // if (entry->int_id_.addr ())
+ // {
+ // cacheFlush (DATA_CACHE,
+ // entry->int_id_.addr (),
+ // sizeof (TAO_Metrics_Cache_Data));
+ // }
+ // }
+ // }
+
+ // flush the base class probe counts
+ // cacheFlush (DATA_CACHE,
+ // this->
+ // enqueue_count_ [this->consumer_index_].addr (),
+ // this->probe_set_size_ * sizeof (u_long));
+
+ // cacheFlush (DATA_CACHE,
+ // this->
+ // dequeue_count_ [this->consumer_index_].addr (),
+ // this->probe_set_size_ * sizeof (u_long));
+
+ // flush the base class probe pointer arrays
+ // cacheFlush (
+ // DATA_CACHE,
+ // this->enqueue_probes_ [this->consumer_index_],
+ // this->
+ // probe_set_size_
+ // * sizeof (ACE_Metrics_Timeprobe<ACE_LOCK,ALLOCATOR> *));
+ // cacheFlush (
+ // DATA_CACHE,
+ // this->dequeue_probes_ [this->consumer_index_],
+ // this->probe_set_size_
+ // * sizeof (ACE_Metrics_Timeprobe<ACE_LOCK, ALLOCATOR> *));
+
+ // flush the base class probes
+ // for (u_int i = 0; i < this->probe_set_size_; ++i)
+ // {
+ // cacheFlush (
+ // DATA_CACHE,
+ // this->enqueue_probes_ [this->consumer_index_][i],
+ // sizeof (ACE_Metrics_Timeprobe<ACE_LOCK, ALLOCATOR>));
+ // cacheFlush (
+ // DATA_CACHE,
+ // this->dequeue_probes_ [this->consumer_index_][i],
+ // sizeof (ACE_Metrics_Timeprobe<ACE_LOCK, ALLOCATOR>));
+ // }
+#endif
+}
+
+TAO_END_VERSIONED_NAMESPACE_DECL
+
+#endif /* METRICS_LOCAL_CACHE_T_CPP */
diff --git a/TAO/orbsvcs/orbsvcs/Metrics/Metrics_LocalCache_T.h b/TAO/orbsvcs/orbsvcs/Metrics/Metrics_LocalCache_T.h
new file mode 100644
index 00000000000..97d51de3248
--- /dev/null
+++ b/TAO/orbsvcs/orbsvcs/Metrics/Metrics_LocalCache_T.h
@@ -0,0 +1,329 @@
+// -*- C++ -*-
+
+// $Id$
+
+#ifndef METRICS_LOCAL_CACHE_T_H
+#define METRICS_LOCAL_CACHE_T_H
+
+#include "ace/OS.h"
+
+#if !defined (ACE_LACKS_PRAGMA_ONCE)
+# pragma once
+#endif /* ACE_LACKS_PRAGMA_ONCE */
+
+#include "ace/Hash_Map_Manager.h"
+#include "ace/Metrics_Cache.h"
+#include "ace/Metrics_Cache_T.h"
+
+#include "orbsvcs/Time_Utilities.h"
+#include "orbsvcs/Scheduler_Factory.h"
+#include "orbsvcs/MetricsC.h"
+#include "orbsvcs/Metrics/Metrics_Utils.h"
+
+TAO_BEGIN_VERSIONED_NAMESPACE_DECL
+
+#if defined (ACE_HAS_METRICS_BASE_POINTERS)
+ typedef ACE_Based_Pointer<char> ACE_METRICS_STRING_TYPE;
+ typedef ACE_Based_Pointer<Metrics::TimeprobeParameter_Set> ACE_METRICS_PARAMETER_SET_TYPE;
+#else
+ typedef char * ACE_METRICS_STRING_TYPE;
+ typedef Metrics::TimeprobeParameter_Set * ACE_METRICS_PARAMETER_SET_TYPE;
+#endif
+
+//DCL:Commented out to remove Linux compile error
+//#include "orbsvcs/Metrics/Metrics_LocalCache.h"
+
+template <typename ACE_LOCK, typename ALLOCATOR>
+class TAO_Metrics_LocalTimeprobe
+ : public ACE_Metrics_Timeprobe<ACE_LOCK, ALLOCATOR>
+{
+ // = TITLE
+ // Defines a class that implements a local timeprobe.
+ //
+ // = DESCRIPTION
+ // This class makes use of the <ACE_Metrics_Timeprobe> class to
+ // implement a timeprobe for use in a local metrics cache.
+public:
+
+ typedef TAO_Metrics_LocalTimeprobe<ACE_LOCK, ALLOCATOR> TAO_METRICS_TIMEPROBE_TYPE;
+
+ TAO_Metrics_LocalTimeprobe (u_int id = 0,
+ const char *name = 0,
+ u_long size
+ = METRICS_DEFAULT_TIMEPROBE_TABLE_SIZE,
+ ALLOCATOR * alloc = (ALLOCATOR*)ALLOCATOR::instance());
+ // Default constructor.
+
+ void report_intervals (int report_full_interval_times = 0);
+ // Reports valid intervals between start and stop events.
+
+ void install_data_set (Metrics::TimeprobeParameter_Set *data_set = 0);
+ // Installs or unistalls the data set into which probe will report.
+
+ void mark_as_operation (void) {this->is_operation_ = 1;}
+ // Marks the probe as being for an operation.
+
+ void set_hrt (int hrt) {this->is_hrt_ = hrt;}
+ // Marks the probe as being SRT/HRT.
+
+ ACE_Time_Value last_recorded_timestamp (void);
+ // Returns the last timestamp that was recorded in the probe.
+ // If no stamps are recorded, returns zero.
+
+ void flush_TAO_Metrics_LocalTimeprobe ();
+ // Flush the TAO metrics local timeprobe into shared memory.
+
+protected:
+
+ int is_operation_;
+ // Indicates whether or not the probe is for an operation.
+
+ int is_hrt_;
+ // Indicates whether or not the probe is Hard Real-Time.
+
+ ACE_METRICS_PARAMETER_SET_TYPE data_set_;
+ // Points to a probe metrics data set.
+};
+
+template <class ACE_LOCK, class ALLOCATOR>
+class TAO_Metrics_LocalCache
+ : public ACE_Metrics_Cache<ACE_LOCK, ALLOCATOR>
+{
+ // = TITLE
+ // Defines a class that implements a local metrics cache.
+ //
+ // = DESCRIPTION
+ // This class makes use of the <ACE_Metrics_Cache> class to
+ // implement a cache for local use.
+public:
+
+ typedef ACE_Metrics_Timeprobe<ACE_LOCK, ALLOCATOR>
+ ACE_METRICS_TIMEPROBE_TYPE;
+
+#if defined (ACE_HAS_METRICS_BASE_POINTERS)
+ typedef ACE_Based_Pointer<ACE_METRICS_TIMEPROBE_TYPE>
+ ACE_METRICS_TIMEPROBE_BASED_PTR_TYPE;
+#else
+ typedef ACE_METRICS_TIMEPROBE_TYPE * ACE_METRICS_TIMEPROBE_BASED_PTR_TYPE;
+#endif
+
+ typedef TAO_Metrics_LocalTimeprobe<ACE_LOCK, ALLOCATOR> TAO_METRICS_TIMEPROBE_TYPE;
+
+ typedef TAO_Metrics_LocalCache<ACE_LOCK, ALLOCATOR> TAO_METRICS_CACHE_TYPE;
+
+ struct TAO_Metrics_Cache_Data_Base
+ {
+ ACE_METRICS_STRING_TYPE probe_name;
+ TAO_Metrics_LocalTimeprobe<ACE_LOCK, ALLOCATOR> probe;
+ };
+
+ struct TAO_Metrics_Cache_Data : public TAO_Metrics_Cache_Data_Base
+ {
+ int is_hrt;
+ u_long missed_deadlines;
+ u_long made_deadlines;
+ u_long cancellations;
+ };
+
+#if defined (ACE_HAS_METRICS_BASE_POINTERS)
+ typedef ACE_Based_Pointer<TAO_Metrics_Cache_Data_Base> ACE_METRICS_CACHE_DATA_BASE_TYPE;
+ typedef ACE_Based_Pointer<TAO_Metrics_Cache_Data> ACE_METRICS_CACHE_DATA_TYPE;
+#else
+ typedef TAO_Metrics_Cache_Data_Base* ACE_METRICS_CACHE_DATA_BASE_TYPE;
+ typedef TAO_Metrics_Cache_Data* ACE_METRICS_CACHE_DATA_TYPE;
+#endif
+
+ typedef ACE_Hash_Map_Manager_Ex<RtecScheduler::handle_t,
+ ACE_METRICS_CACHE_DATA_BASE_TYPE,
+ ACE_Hash<RtecScheduler::handle_t>,
+ ACE_Equal_To<RtecScheduler::handle_t>,
+ ACE_Null_Mutex> METRICS_BASE_MONITOR_MAP;
+ // Type of map used for O(1) lookup of monitored data for operations.
+
+ typedef ACE_Hash_Map_Entry<RtecScheduler::handle_t,
+ ACE_METRICS_CACHE_DATA_BASE_TYPE >
+ METRICS_BASE_MONITOR_MAP_ENTRY;
+ // Type of entry in monitor map.
+
+ typedef ACE_Hash_Map_Iterator_Ex<RtecScheduler::handle_t,
+ ACE_METRICS_CACHE_DATA_BASE_TYPE,
+ ACE_Hash<RtecScheduler::handle_t>,
+ ACE_Equal_To<RtecScheduler::handle_t>,
+ ACE_Null_Mutex>
+ METRICS_BASE_MONITOR_MAP_ITERATOR;
+ // Type of iterator for monitor map.
+
+ typedef ACE_Hash_Map_Manager_Ex<RtecScheduler::handle_t,
+ ACE_METRICS_CACHE_DATA_TYPE,
+ ACE_Hash<RtecScheduler::handle_t>,
+ ACE_Equal_To<RtecScheduler::handle_t>,
+ ACE_Null_Mutex> METRICS_MONITOR_MAP;
+ // Type of map used for O(1) lookup of monitored data for operations.
+
+ typedef ACE_Hash_Map_Entry<RtecScheduler::handle_t,
+ ACE_METRICS_CACHE_DATA_TYPE >
+ METRICS_MONITOR_MAP_ENTRY;
+ // Type of entry in monitor map.
+
+ typedef ACE_Hash_Map_Iterator_Ex<RtecScheduler::handle_t,
+ ACE_METRICS_CACHE_DATA_TYPE,
+ ACE_Hash<RtecScheduler::handle_t>,
+ ACE_Equal_To<RtecScheduler::handle_t>,
+ ACE_Null_Mutex>
+ METRICS_MONITOR_MAP_ITERATOR;
+ // Type of iterator for monitor map.
+
+ TAO_Metrics_LocalCache (u_long table_size
+ = METRICS_DEFAULT_TIMEPROBE_TABLE_SIZE,
+ u_long number_of_probes
+ = METRICS_DEFAULT_TIMEPROBE_COUNT,
+ ALLOCATOR * alloc = (ALLOCATOR*)ALLOCATOR::instance());
+ // Constructor.
+
+ ~TAO_Metrics_LocalCache () {this->fini ();}
+ // Destructor.
+
+ void reset_statistics ();
+ // Reset the collection of metrics data.
+
+ int init (u_long number_of_probes);
+ // Factory method for constructing probes.
+
+ void fini ();
+ // Method for destroying probes.
+
+ void register_upcall_adapter (RtecScheduler::handle_t handle,
+ const char *name,
+ int is_hrt,
+ unsigned short incr_upcall_id = 1);
+ // Registers an upcall adapter, allocates monitoring data structures
+ // for it in hash maps if not already present.
+
+ RtecScheduler::handle_t register_base_metrics (const char *name,
+ TAO_Metrics_Utils::Base_Metrics_Type bmt,
+ unsigned short incr_base_id = 1);
+ // Registers a base metrics probe, allocates monitoring data structures
+ // for it in hash maps, returns a handle to the metrics segment.
+
+ void report_upcall_start (RtecScheduler::handle_t handle);
+ // Inline: Records start time of an upcall.
+
+ int report_upcall_stop (RtecScheduler::handle_t handle,
+ const ACE_Time_Value & deadline);
+ // Inline: Records end time of an upcall, returns 0 if the deadline
+ // was made, 1 if the deadline was missed, or -1 if an error occurred.
+ // If the passed deadline is equal to ACE_Time_Value::zero, by definition
+ // the deadline is made, and the method returns 0.
+
+ void report_upcall_cancellation (RtecScheduler::handle_t handle);
+ // Inline: Reports a cancelled upcall.
+
+ void report_base_metrics_start (RtecScheduler::handle_t handle);
+ // Inline: Records start time of a base metrics segment.
+
+ void report_base_metrics_stop (RtecScheduler::handle_t handle);
+ // Inline: Records stop time of a base metrics segment.
+
+ void report_base_metrics_suspend (RtecScheduler::handle_t handle);
+ // Inline: Records start time of a base metrics segment.
+
+ void report_base_metrics_resume (RtecScheduler::handle_t handle);
+ // Inline: Records stop time of a base metrics segment.
+
+ void flush_TAO_Metrics_LocalCache ();
+ // Flush the TAO metrics local cache into shared memory.
+
+protected:
+ void increment_base_handle(TAO_Metrics_Utils::Base_Metrics_Type bmt);
+ // Used to increment the probe id counter for a particular metrics type
+
+ void increment_upcall_handle();
+ // Used to increment the probe id counter for a upcall probe type
+
+ METRICS_BASE_MONITOR_MAP base_monitor_maps_ [2];
+ // These map base metrics ids to base monitor data.
+
+ METRICS_MONITOR_MAP monitor_maps_ [2];
+ // These map operation handles to upcall monitor data.
+
+ // Count of the number of registered sched probes.
+ u_long sched_count_;
+
+ // Count of the number of registered quo probes.
+ u_long quo_count_;
+
+ // Count of the number of registered tns probes.
+ u_long tns_count_;
+
+ // Count of the number of registered teec probes.
+ u_long teec_count_;
+
+ // Count of the number of registered rtarm probes.
+ u_long rtarm_count_;
+
+ // Count of the number of registered upcall adapters.
+ u_long upcall_adapter_count_;
+
+ // Holds the next base metrics probe handle to assign
+ RtecScheduler::handle_t next_base_metrics_handle_;
+
+};
+
+
+
+template <class ACE_LOCK, class ALLOCATOR>
+class TAO_Metrics_ReportingLocalCache
+ : public TAO_Metrics_LocalCache<ACE_LOCK, ALLOCATOR>
+{
+ // = TITLE
+ // Defines a class that adds metrics logger reporting to a local cache.
+ //
+ // = DESCRIPTION
+ // This class makes use of the <TAO_Metrics_LocalCache> as its
+ // a cache for local use, and adds reporting to the logger.
+public:
+
+ TAO_Metrics_ReportingLocalCache (u_long table_size
+ = METRICS_DEFAULT_TIMEPROBE_TABLE_SIZE,
+ u_long number_of_probes
+ = METRICS_DEFAULT_TIMEPROBE_COUNT,
+ ALLOCATOR * alloc = (ALLOCATOR*)ALLOCATOR::instance());
+ // Constructor.
+
+ ~TAO_Metrics_ReportingLocalCache () {this->fini ();}
+ // Destructor.
+
+ void output_statistics (Metrics::QoSLogger_ptr logger);
+ // Output the statistics to the remote logger servant.
+
+ void register_upcall_adapter (RtecScheduler::handle_t handle,
+ const char *name,
+ int is_hrt,
+ Metrics::QoSLogger_ptr logger);
+ // Registers an upcall adapter, allocates monitoring data structures
+ // for it in hash maps if not already present.
+
+ RtecScheduler::handle_t register_base_metrics (const char *name,
+ TAO_Metrics_Utils::Base_Metrics_Type bmt,
+ Metrics::QoSLogger_ptr logger);
+ // Registers a base metrics probe, allocates monitoring data structures
+ // for it in hash maps, returns a handle to the metrics segment.
+
+ int register_probes (Metrics::QoSLogger_ptr logger);
+ // Registers probes with the logger.
+
+ void flush_TAO_Metrics_ReportingLocalCache ();
+ // Flush the TAO metrics local cache into shared memory.
+};
+
+TAO_END_VERSIONED_NAMESPACE_DECL
+
+#if defined (ACE_TEMPLATES_REQUIRE_SOURCE)
+#include "orbsvcs/Metrics/Metrics_LocalCache_T.cpp"
+#endif /* ACE_TEMPLATES_REQUIRE_SOURCE */
+
+#if defined (ACE_TEMPLATES_REQUIRE_PRAGMA)
+#pragma implementation ("Metrics_LocalCache_T.cpp")
+#endif /* ACE_TEMPLATES_REQUIRE_PRAGMA */
+
+#endif /* METRICS_LOCAL_CACHE_T_H */
diff --git a/TAO/orbsvcs/orbsvcs/Metrics/Metrics_Logger.cpp b/TAO/orbsvcs/orbsvcs/Metrics/Metrics_Logger.cpp
new file mode 100644
index 00000000000..71f0e444678
--- /dev/null
+++ b/TAO/orbsvcs/orbsvcs/Metrics/Metrics_Logger.cpp
@@ -0,0 +1,871 @@
+// $Id$
+
+#include "orbsvcs/Metrics/Metrics_Logger.h"
+#include "ace/Auto_Ptr.h"
+#include "ace/ace_wchar.h"
+
+ACE_RCSID(Metrics_Logger, Metrics_Logger, "$Id$")
+
+#if defined (ACE_METRICS_COLLECTION)
+
+#if defined (ACE_ENABLE_TIMEPROBES) && defined (ACE_COMPILE_TIMEPROBES)
+
+static const int OPEN_CLOSE_BANNER_CYCLE = 4;
+
+TAO_BEGIN_VERSIONED_NAMESPACE_DECL
+
+//////////////////////////////
+// class TAO_Metrics_Logger //
+//////////////////////////////
+
+// Default constructor.
+
+TAO_Metrics_Logger::TAO_Metrics_Logger (int generate_events,
+ int generate_log,
+ int generate_export_file,
+ const char *log_filename)
+ : generate_events_ (generate_events),
+#ifdef VXWORKS
+ generate_log_ (1),
+ log_filename_ ("logger.txt"),
+#else
+ generate_log_ (generate_log),
+ log_filename_ (log_filename),
+#endif
+ generate_totals_(0),
+ generate_export_file_(generate_export_file),
+ log_started_ (0),
+ log_file_ (stdout),
+ export_file_(stdout),
+ saveFileCnt_(0)
+{
+#ifdef VXWORKS
+ taskPrioritySet( taskIdSelf(), 145 );
+#endif
+
+#if defined (METRICS_LOGGER_SENDS_EVENTS)
+ if (this->generate_events_)
+ {
+ // Connect the underlying DOVE event supplier.
+ if (this->dove_supplier_.connect () < 0)
+ {
+#if defined (METRICS_LOGGER_ERROR_OUTPUT_ENABLED)
+ ACE_ERROR ((LM_ERROR, "failed to connect DOVE event supplier\n"));
+#endif
+ this->generate_events_ = 0;
+ }
+ }
+#endif /* METRICS_LOGGER_SENDS_EVENTS */
+
+ if (generate_log_)
+ {
+ if (log_filename_)
+ {
+ log_file_ = ACE_OS::fopen (log_filename_, "w+");
+ if (log_file_ == NULL)
+ {
+ generate_log_ = 0;
+#if defined (METRICS_LOGGER_ERROR_OUTPUT_ENABLED)
+ ACE_ERROR ((LM_ERROR,
+ "Logger failed to open log file %s\n",
+ log_filename_));
+#endif
+ return;
+ }
+
+ if (generate_export_file_)
+ {
+ export_file_ = ACE_OS::fopen ("remote_logger_export.excel", "w+");
+ if (export_file_ == NULL)
+ {
+#if defined (METRICS_LOGGER_ERROR_OUTPUT_ENABLED)
+ ACE_ERROR ((LM_ERROR, "Logger failed to open log file %s\n", log_filename_));
+#endif
+ return;
+ }
+ }
+ log_started_ = 1;
+ }
+
+ // Write a start of logging session message.
+ time_t current_time = ACE_OS::time ();
+ ACE_OS::fprintf (log_file_,
+ "\n\nTAO_Metrics Metrics Logging Session: %s\n\n",
+ ACE_OS::ctime (& current_time));
+
+ ACE_OS::fprintf (export_file_,
+ "\n\nTAO_Metrics Metrics Logging Session: %s\n\n",
+ ACE_OS::ctime (& current_time));
+ if (log_filename_)
+ {
+ ACE_OS::fflush (log_file_);
+ ACE_OS::fflush (export_file_);
+// ACE_OS::fclose (log_file_);
+ }
+ }
+}
+
+
+// Destructor.
+
+TAO_Metrics_Logger::~TAO_Metrics_Logger ()
+{
+ if (generate_log_)
+ {
+ if (log_filename_)
+ {
+// log_file_ = ACE_OS::fopen (log_filename_, "a+");
+ }
+
+ ACE_OS::fprintf (log_file_, "\n\n");
+
+ ACE_OS::fflush (log_file_);
+
+ ACE_OS::fprintf (export_file_, "\n\n");
+ ACE_OS::fflush (export_file_);
+
+ if (log_filename_)
+ {
+// ACE_OS::fclose (log_file_);
+ }
+ }
+
+#if defined (METRICS_LOGGER_SENDS_EVENTS)
+ if (this->generate_events_)
+ {
+ this->dove_supplier_.disconnect ();
+ }
+#endif /* METRICS_LOGGER_SENDS_EVENTS */
+}
+
+
+// Active object loop for processing logged data.
+
+int
+TAO_Metrics_Logger::svc (void)
+{
+ ACE_Message_Block *mb;
+
+ // Loop forever.
+ while (1)
+ if (this->getq (mb) < 0)
+ {
+#if defined (METRICS_LOGGER_ERROR_OUTPUT_ENABLED)
+ ACE_ERROR ((LM_ERROR,
+ "(%P|%t) getq failed in TAO_Metrics_Logger::svc"));
+#endif
+ return -1;
+ }
+ else if (! mb)
+ {
+#if defined (METRICS_LOGGER_ERROR_OUTPUT_ENABLED)
+ ACE_ERROR ((LM_ERROR,
+ "(%P|%t) null message block pointer in TAO_Metrics_Logger::svc"));
+#endif
+ return -1;
+ }
+ else if (! mb->rd_ptr ())
+ {
+#if defined (METRICS_LOGGER_ERROR_OUTPUT_ENABLED)
+ ACE_ERROR ((LM_ERROR,
+ "(%P|%t) null message block pointer in TAO_Metrics_Logger::svc"));
+#endif
+ return -1;
+ }
+ else
+ {
+ // Process message.
+
+ TAO_Metrics_Logger_Data *data = (TAO_Metrics_Logger_Data *) mb->rd_ptr ();
+ switch (data->data_type_)
+ {
+ case TAO_Metrics_Logger_Data::QOS_TYPE:
+ this->process_aggregate_QoS (*data->qos_params_, data->interval_);
+ delete data;
+ delete mb;
+ break;
+
+ case TAO_Metrics_Logger_Data::TIMEPROBE_TYPE:
+ this->process_timeprobe_data (*data->timeprobe_params_, data->interval_);
+ delete data;
+ delete mb;
+ break;
+
+ case TAO_Metrics_Logger_Data::BANNER_TYPE:
+ this->process_banner (data->banner_);
+ delete data;
+ delete mb;
+ break;
+
+ default:
+#if defined (METRICS_LOGGER_ERROR_OUTPUT_ENABLED)
+ ACE_ERROR ((LM_ERROR,
+ "(%P|%t) unrecognized data type in TAO_Metrics_Logger::svc"));
+#endif
+ return -1;
+ }
+ }
+
+// Modified by BAP. Remove unreachable code.
+// return 0;
+}
+
+
+// Sends a banner to be written to the log file and to the visualization browser.
+
+void
+TAO_Metrics_Logger::send_banner (const char *banner
+ ACE_ENV_ARG_DECL)
+ throw (CORBA::SystemException)
+{
+ // Package up the data and put it on the task queue.
+
+ TAO_Metrics_Logger_Data *data;
+ ACE_NEW (data,
+ TAO_Metrics_Logger_Data (TAO_Metrics_Logger_Data::BANNER_TYPE));
+ ACE_NEW (data->banner_, char [ACE_OS::strlen (banner) + 1]);
+ ACE_OS::strcpy (data->banner_, banner);
+
+ ACE_Message_Block *mb;
+ ACE_NEW (mb,
+ ACE_Message_Block ((char *) data,
+ sizeof (TAO_Metrics_Logger_Data)));
+
+ if (this->putq (mb) < 0)
+ {
+#if defined (METRICS_LOGGER_ERROR_OUTPUT_ENABLED)
+ ACE_ERROR ((LM_ERROR,
+ "TAO_Metrics_Logger::send_banner putq failed"));
+#endif
+ }
+}
+
+void
+TAO_Metrics_Logger::process_banner (const char *banner)
+{
+ if (this->generate_log_)
+ {
+ if (log_filename_)
+ {
+// log_file_ = ACE_OS::fopen (log_filename_, "a+");
+ }
+
+ ACE_OS::fprintf (log_file_,
+ "%s\n", banner);
+ ACE_OS::fprintf (export_file_,
+ "%s\n", banner);
+ if (log_filename_)
+ {
+ ACE_OS::fflush (log_file_);
+ ACE_OS::fflush (export_file_);
+
+ // Close and then reopen the file. We can't afford to open & close all of the time.
+ if (( saveFileCnt_++ % OPEN_CLOSE_BANNER_CYCLE) == 0 )
+ {
+ ACE_OS::fclose (log_file_);
+ log_file_ = ACE_OS::fopen (log_filename_, "a+");
+
+ ACE_OS::fclose (export_file_);
+ export_file_ = ACE_OS::fopen ("remote_logger_export.excel", "a+");
+ }
+ }
+ }
+}
+
+
+// Reports the aggregate QoS information for all operations
+// to the passed QoS logger.
+
+void
+TAO_Metrics_Logger::log_aggregate_QoS (const Metrics::QoSParameter_Set & qos_params,
+ Metrics::Time interval
+ ACE_ENV_ARG_DECL)
+ throw (CORBA::SystemException)
+{
+// This is a temporary patch to eliminate this data from the log. It was
+// done to bypass a long rebuild that would have been required otherwise.
+// Remove this patch later. Brian Mendel
+
+ //Added to remove Linux warning (Boeing Extension)
+ ACE_UNUSED_ARG(qos_params);
+ ACE_UNUSED_ARG(interval);
+
+ // Package up the data and put it on the task queue.
+#if 0
+ TAO_Metrics_Logger_Data *data;
+ ACE_NEW (data,
+ TAO_Metrics_Logger_Data (TAO_Metrics_Logger_Data::QOS_TYPE,
+ interval));
+ ACE_NEW (data->qos_params_,
+ Metrics::QoSParameter_Set (qos_params));
+
+ ACE_Message_Block *mb;
+ ACE_NEW (mb,
+ ACE_Message_Block ((char *) data,
+ sizeof (TAO_Metrics_Logger_Data)));
+
+ if (this->putq (mb) < 0)
+ {
+#if defined (METRICS_LOGGER_ERROR_OUTPUT_ENABLED)
+ ACE_ERROR ((LM_ERROR,
+ "TAO_Metrics_Logger::log_aggregate_QoS putq failed"));
+#endif
+ }
+#endif
+}
+
+
+// Processes the aggregate QoS information for all operations
+// to the passed QoS logger.
+
+void
+TAO_Metrics_Logger::process_aggregate_QoS (const Metrics::QoSParameter_Set & qos_params,
+ Metrics::Time interval)
+{
+ //Added to remove Linux warning (Boeing Extension)
+ ACE_UNUSED_ARG(interval);
+
+ if (this->generate_log_)
+ {
+ if (log_filename_)
+ {
+// log_file_ = ACE_OS::fopen (log_filename_, "a+");
+ }
+
+ ACE_OS::fprintf (log_file_,
+ "\nName missed made cancelled\n");
+
+ ACE_OS::fprintf (export_file_,
+ "\n\n Name \t missed \t made \t cancelled\n");
+ }
+
+#if defined (METRICS_LOGGER_SENDS_EVENTS)
+ if (this->generate_events_)
+ {
+ this->qos_data_.hrt_deadlines_missed = 0;
+ this->qos_data_.hrt_deadlines_made = 0;
+ this->qos_data_.hrt_operations_cancelled = 0;
+ this->qos_data_.srt_deadlines_missed = 0;
+ this->qos_data_.srt_deadlines_made = 0;
+ this->qos_data_.srt_operations_cancelled = 0;
+ }
+#endif /* METRICS_LOGGER_SENDS_EVENTS */
+
+ for (u_long i = 0; i < qos_params.length (); ++i)
+ {
+#if defined (METRICS_LOGGER_SENDS_EVENTS)
+ if (this->generate_events_)
+ {
+ if (qos_params [i].is_hrt)
+ {
+ this->qos_data_.hrt_deadlines_missed +=
+ qos_params [i].deadlines_missed;
+ this->qos_data_.hrt_deadlines_made +=
+ qos_params [i].deadlines_made;
+ this->qos_data_.hrt_operations_cancelled +=
+ qos_params [i].operations_cancelled;
+ }
+ else
+ {
+ this->qos_data_.srt_deadlines_missed +=
+ qos_params [i].deadlines_missed;
+ this->qos_data_.srt_deadlines_made +=
+ qos_params [i].deadlines_made;
+ this->qos_data_.srt_operations_cancelled +=
+ qos_params [i].operations_cancelled;
+ }
+ }
+#endif /* METRICS_LOGGER_SENDS_EVENTS */
+
+ if (this->generate_log_)
+ {
+ ACE_OS::fprintf (log_file_,
+ "%-50s %8lu %8lu %8lu\n",
+ (const char *)qos_params [i].entry_point,
+ qos_params [i].deadlines_missed,
+ qos_params [i].deadlines_made,
+ qos_params [i].operations_cancelled);
+ ACE_OS::fprintf (export_file_,
+ " %s \t %lu \t %lu \t %lu\n",
+ (const char *)qos_params [i].entry_point,
+ qos_params [i].deadlines_missed,
+ qos_params [i].deadlines_made,
+ qos_params [i].operations_cancelled);
+ }
+ }
+
+#if defined (METRICS_LOGGER_SENDS_EVENTS)
+ if (this->generate_events_)
+ {
+ // Push an event to the visualization browser.
+ CORBA::Any any;
+
+ ACE_TRY_NEW_ENV
+ {
+ any.replace (Metrics::_tc_QoSData, &qos_data_, 0, ACE_TRY_ENV);
+ ACE_TRY_CHECK;
+ }
+ ACE_CATCHANY
+ {
+#if defined (METRICS_LOGGER_ERROR_OUTPUT_ENABLED)
+ ACE_PRINT_EXCEPTION (ACE_ANY_EXCEPTION, "TAO_Metrics_Logger::process_aggregate_QoS");
+#endif
+ return;
+ }
+ ACE_ENDTRY;
+
+ this->dove_supplier_.notify (any);
+ }
+#endif /* METRICS_LOGGER_SENDS_EVENTS */
+
+ if (this->generate_log_)
+ {
+ if (log_filename_)
+ {
+ ACE_OS::fflush (log_file_);
+// ACE_OS::fclose (log_file_);
+ }
+ }
+}
+
+
+// Binds the names of various timeprobes to their identifiers so
+// that ids alone can be used (for efficiency) in passing data.
+
+void
+TAO_Metrics_Logger::set_identities (const Metrics::ProbeIdentity_Set &
+ probe_identities
+ ACE_ENV_ARG_DECL)
+ throw (CORBA::SystemException)
+{
+ for (u_long i = 0; i < probe_identities.length (); ++i)
+ {
+ this->set_identity (probe_identities [i]
+ ACE_ENV_ARG_DECL);
+ ACE_CHECK;
+ }
+}
+
+void
+TAO_Metrics_Logger::set_identity (const Metrics::ProbeIdentity_t & probe_identity
+ ACE_ENV_ARG_DECL)
+ throw (CORBA::SystemException)
+{
+ // Look up the existing name that is bound, creating one if there is
+ // not one there already.
+ CORBA::String_var *name = 0;
+ if (probe_name_map_.find (probe_identity.probe_id, name) != 0
+ || name == 0)
+ {
+ ACE_NEW_THROW_EX (name,
+ CORBA::String_var (probe_identity.probe_name),
+ CORBA::NO_MEMORY ());
+ ACE_CHECK;
+
+ // What is this used for? BRM
+ auto_ptr<CORBA::String_var> name_ptr (name);
+
+ if (probe_name_map_.rebind (probe_identity.probe_id, name) < 0)
+ {
+#if defined (METRICS_LOGGER_ERROR_OUTPUT_ENABLED)
+ ACE_ERROR ((LM_ERROR, "TAO_Metrics_Logger::set_identity bind failed.\n"));
+#endif
+ return;
+ }
+
+ // DEBUG
+ const char * name_cstr = name->in ();
+ ACE_DEBUG ((LM_DEBUG,
+ "Logger registered name [%s] with id [%u]\n",
+ name_cstr, probe_identity.probe_id));
+
+ name_ptr.release ();
+ }
+ else
+ {
+ // DEBUG
+ const char * old_name_cstr = name->in ();
+
+ // Unconditionally set the name to the new name.
+ *name = probe_identity.probe_name;
+
+ // DEBUG
+ const char * new_name_cstr = name->in ();
+ ACE_DEBUG ((LM_DEBUG,
+ "Logger CHANGED name from [%s] to [%s] for id [%u]\n",
+ old_name_cstr, new_name_cstr, probe_identity.probe_id));
+ }
+}
+
+
+// Reports timeprobe data collected since last run.
+
+void
+TAO_Metrics_Logger::log_timeprobe_data (const Metrics::TimeprobeParameter_Set &
+ timeprobe_params,
+ Metrics::Time interval
+ ACE_ENV_ARG_DECL)
+ throw (CORBA::SystemException)
+{
+ // Package up the data and put it on the task queue.
+
+ TAO_Metrics_Logger_Data *data;
+ ACE_NEW (data,
+ TAO_Metrics_Logger_Data (TAO_Metrics_Logger_Data::TIMEPROBE_TYPE,
+ interval));
+ ACE_NEW (data->timeprobe_params_,
+ Metrics::TimeprobeParameter_Set (timeprobe_params));
+
+ ACE_Message_Block *mb;
+ ACE_NEW (mb,
+ ACE_Message_Block ((char *) data,
+ sizeof (TAO_Metrics_Logger_Data)));
+
+ if (this->putq (mb) < 0)
+ {
+#if defined (METRICS_LOGGER_ERROR_OUTPUT_ENABLED)
+ ACE_ERROR ((LM_ERROR,
+ "TAO_Metrics_Logger::log_timeprobe_data putq failed"));
+#endif
+ }
+}
+
+
+// Processes timeprobe data collected since last run.
+void
+TAO_Metrics_Logger::process_timeprobe_data (const Metrics::TimeprobeParameter_Set & timeprobe_params,
+ Metrics::Time interval)
+{
+ if (this->generate_log_)
+ {
+ if (log_filename_)
+ {
+ // log_file_ = ACE_OS::fopen (log_filename_, "a+");
+ }
+
+ ACE_OS::fprintf (log_file_,
+ "\n\n\n"
+ "Interval (usec): %9lu \n\n"
+ "Probe elapsed_time(usec) Start Time (usecs) Stop Time (usec)\n\n",
+ // Modified by BAP. This really should be corrected since we are truncating the interval here.
+ // We can get away with it here for now since the intervals are small enough to not roll over.
+ (u_long) ACE_U64_TO_U32(interval)/10 );
+
+ ACE_OS::fprintf (export_file_,
+ "\n\n\n"
+ "Interval (usec): \t %9lu \t \n\n"
+ "Probe \t elapsed_time(usec) \tStart Time (usecs) \t Stop Time (usec)\n\n",
+ // Modified by BAP. This really should be corrected since we are truncating the interval here.
+ // We can get away with it here for now since the intervals are small enough to not roll over.
+ (u_long) ACE_U64_TO_U32(interval)/10 );
+ }
+
+#if defined (METRICS_LOGGER_SENDS_EVENTS)
+ Metrics::Time queue_time = 0;
+ Metrics::Time hrt_op_time = 0;
+ Metrics::Time srt_op_time = 0;
+#endif /* METRICS_LOGGER_SENDS_EVENTS */
+
+ for (u_long i = 0; i < timeprobe_params.length (); ++i)
+ {
+#if defined (METRICS_LOGGER_SENDS_EVENTS)
+ if (! timeprobe_params [i].is_full_interval)
+ {
+ if (timeprobe_params [i].is_operation)
+ {
+ if (timeprobe_params [i].is_hrt)
+ {
+ hrt_op_time += timeprobe_params [i].interval;
+ }
+ else
+ {
+ srt_op_time += timeprobe_params [i].interval;
+ }
+ }
+ else
+ {
+ queue_time += timeprobe_params [i].interval;
+ }
+ }
+#endif /* METRICS_LOGGER_SENDS_EVENTS */
+
+ if (this->generate_log_)
+ {
+ // Look up the name of the probe in the hash map.
+ // If successful, use the name, and if not just use the probe id.
+ CORBA::String_var *probe_name = 0;
+ char format_spec[255];
+ char export_spec[255];
+
+ if (probe_name_map_.find (timeprobe_params [i].probe_id, probe_name) == 0
+ && probe_name != 0)
+ {
+ if (timeprobe_params [i].cross_thread_probe &&
+ timeprobe_params [i].is_full_interval)
+ {
+ if (generate_totals_)
+ {
+#if defined (ACE_LACKS_LONGLONG_T)
+ // This needs to be fixed for platforms that do not have 64 bit support. This will result
+ // in overruns as currently written
+ ACE_OS::fprintf (log_file_,
+ " %-40s (total) %20lu %20lu %20lu *** Cross Thread Event ***\n",
+ (const char *) *probe_name,
+ (u_long) ACE_U64_TO_U32(timeprobe_params [i].interval)/10,
+ (u_long) ACE_U64_TO_U32(timeprobe_params [i].start_event_time)/10,
+ (u_long) ACE_U64_TO_U32(timeprobe_params [i].stop_event_time)/10);
+ ACE_OS::fprintf (export_file_,
+ " %s (total) \t %lu \t %lu \t %lu \t ***Cross Thread Event***\n",
+ (const char *) *probe_name,
+ (u_long) ACE_U64_TO_U32(timeprobe_params [i].interval)/10,
+ (u_long) ACE_U64_TO_U32(timeprobe_params [i].start_event_time)/10,
+ (u_long) ACE_U64_TO_U32(timeprobe_params [i].stop_event_time)/10);
+#else
+ // Build up the format specifiers since the specifier or not portable
+ ACE_OS::strcpy(format_spec, " %-40s (total) ");
+ ACE_OS::strcat(format_spec, ACE_UINT64_FORMAT_SPECIFIER);
+ ACE_OS::strcat(format_spec, " ");
+ ACE_OS::strcat(format_spec, ACE_UINT64_FORMAT_SPECIFIER);
+ ACE_OS::strcat(format_spec, " ");
+ ACE_OS::strcat(format_spec, ACE_UINT64_FORMAT_SPECIFIER);
+ ACE_OS::strcat(format_spec, " *** Cross Thread Event ***\n");
+
+ ACE_OS::strcpy(export_spec, " %-40s (total) \t ");
+ ACE_OS::strcat(export_spec, ACE_UINT64_FORMAT_SPECIFIER);
+ ACE_OS::strcat(export_spec, " \t ");
+ ACE_OS::strcat(export_spec, ACE_UINT64_FORMAT_SPECIFIER);
+ ACE_OS::strcat(export_spec, " \t ");
+ ACE_OS::strcat(export_spec, ACE_UINT64_FORMAT_SPECIFIER);
+ ACE_OS::strcat(export_spec, " \t*** Cross Thread Event ***\n");
+
+ ACE_OS::fprintf (log_file_,
+ format_spec,
+ (const char *) *probe_name,
+ timeprobe_params [i].interval / 10,
+ timeprobe_params [i].start_event_time / 10,
+ timeprobe_params [i].stop_event_time / 10);
+ ACE_OS::fprintf (export_file_,
+ export_spec,
+ (const char *) *probe_name,
+ timeprobe_params [i].interval / 10,
+ timeprobe_params [i].start_event_time / 10,
+ timeprobe_params [i].stop_event_time / 10);
+#endif
+ }
+ }
+ else
+ {
+#if defined (ACE_LACKS_LONGLONG_T)
+ // This needs to be fixed for platforms that do not have 64 bit support. This will result
+ // in overruns as currently written
+ ACE_OS::fprintf (log_file_,
+ " %-40s %20lu %20lu %20lu *** Cross Thread Event ***\n",
+ (const char *) *probe_name,
+ (u_long) ACE_U64_TO_U32(timeprobe_params [i].interval)/10,
+ (u_long) ACE_U64_TO_U32(timeprobe_params [i].start_event_time)/10,
+ (u_long) ACE_U64_TO_U32(timeprobe_params [i].stop_event_time)/10);
+ ACE_OS::fprintf (export_file_,
+ " %s \t %lu \t %lu \t %lu \t ***Cross Thread Event***\n",
+ (const char *) *probe_name,
+ (u_long) ACE_U64_TO_U32(timeprobe_params [i].interval)/10,
+ (u_long) ACE_U64_TO_U32(timeprobe_params [i].start_event_time)/10,
+ (u_long) ACE_U64_TO_U32(timeprobe_params [i].stop_event_time)/10);
+#else
+ // Build up the format specifiers since the specifier or not portable
+ ACE_OS::strcpy(format_spec, " %-40s ");
+ ACE_OS::strcat(format_spec, ACE_UINT64_FORMAT_SPECIFIER);
+ ACE_OS::strcat(format_spec, " ");
+ ACE_OS::strcat(format_spec, ACE_UINT64_FORMAT_SPECIFIER);
+ ACE_OS::strcat(format_spec, " ");
+ ACE_OS::strcat(format_spec, ACE_UINT64_FORMAT_SPECIFIER);
+ ACE_OS::strcat(format_spec, " *** Cross Thread Event ***\n");
+
+ ACE_OS::strcpy(export_spec, " %-40s \t ");
+ ACE_OS::strcat(export_spec, ACE_UINT64_FORMAT_SPECIFIER);
+ ACE_OS::strcat(export_spec, " \t ");
+ ACE_OS::strcat(export_spec, ACE_UINT64_FORMAT_SPECIFIER);
+ ACE_OS::strcat(export_spec, " \t ");
+ ACE_OS::strcat(export_spec, ACE_UINT64_FORMAT_SPECIFIER);
+ ACE_OS::strcat(export_spec, " \t *** Cross Thread Event ***\n");
+
+ ACE_OS::fprintf (log_file_,
+ format_spec,
+ (const char *) *probe_name,
+ timeprobe_params [i].interval / 10,
+ timeprobe_params [i].start_event_time / 10,
+ timeprobe_params [i].stop_event_time / 10);
+ ACE_OS::fprintf (export_file_,
+ export_spec,
+ (const char *) *probe_name,
+ timeprobe_params [i].interval / 10,
+ timeprobe_params [i].start_event_time / 10,
+ timeprobe_params [i].stop_event_time / 10);
+#endif
+ }
+
+ }
+ else
+ {
+ if (timeprobe_params [i].cross_thread_probe &&
+ timeprobe_params [i].is_full_interval)
+ {
+ if (generate_totals_)
+#if defined (ACE_LACKS_LONGLONG_T)
+ ACE_OS::fprintf (log_file_,
+ " [id (total): %8lu] %9lu %9lu %9lu *** Cross Thread Event ***\n",
+ timeprobe_params [i].probe_id,
+ (u_long) ACE_U64_TO_U32(timeprobe_params [i].interval)/10,
+ (u_long) ACE_U64_TO_U32(timeprobe_params [i].start_event_time)/10,
+ (u_long) ACE_U64_TO_U32(timeprobe_params [i].stop_event_time)/10);
+ ACE_OS::fprintf (export_file_,
+ " [id (total): %lu] \t %lu \t %lu \t %lu \t ***Cross Thread Event***\n",
+ timeprobe_params [i].probe_id,
+ (u_long) ACE_U64_TO_U32(timeprobe_params [i].interval)/10,
+ (u_long) ACE_U64_TO_U32(timeprobe_params [i].start_event_time)/10,
+ (u_long) ACE_U64_TO_U32(timeprobe_params [i].stop_event_time)/10);
+#else
+ // Build up the format specifiers since the specifier or not portable
+ ACE_OS::strcpy(format_spec, " [id (total): %8lu] ");
+ ACE_OS::strcat(format_spec, ACE_UINT64_FORMAT_SPECIFIER);
+ ACE_OS::strcat(format_spec, " ");
+ ACE_OS::strcat(format_spec, ACE_UINT64_FORMAT_SPECIFIER);
+ ACE_OS::strcat(format_spec, " ");
+ ACE_OS::strcat(format_spec, ACE_UINT64_FORMAT_SPECIFIER);
+ ACE_OS::strcat(format_spec, " *** Cross Thread Event ***\n");
+
+ ACE_OS::strcpy(export_spec, " [id (total): %8lu] \t ");
+ ACE_OS::strcat(export_spec, ACE_UINT64_FORMAT_SPECIFIER);
+ ACE_OS::strcat(export_spec, " \t ");
+ ACE_OS::strcat(export_spec, ACE_UINT64_FORMAT_SPECIFIER);
+ ACE_OS::strcat(export_spec, " \t ");
+ ACE_OS::strcat(export_spec, ACE_UINT64_FORMAT_SPECIFIER);
+ ACE_OS::strcat(export_spec, " \t*** Cross Thread Event ***\n");
+
+ if (probe_name == 0)
+ {
+ ACE_DEBUG((LM_DEBUG, "Found a probe with id: %d with no name\n", timeprobe_params [i].probe_id));
+ }
+ else
+ {
+ ACE_OS::fprintf (log_file_,
+ format_spec,
+ (const char *) *probe_name,
+ timeprobe_params [i].interval / 10,
+ timeprobe_params [i].start_event_time / 10,
+ timeprobe_params [i].stop_event_time / 10);
+ ACE_OS::fprintf (export_file_,
+ export_spec,
+ (const char *) *probe_name,
+ timeprobe_params [i].interval / 10,
+ timeprobe_params [i].start_event_time / 10,
+ timeprobe_params [i].stop_event_time / 10);
+ }
+#endif
+ }
+ else
+#if defined (ACE_LACKS_LONGLONG_T)
+ ACE_OS::fprintf (log_file_,
+ " [id: %14lu] %9lu %9lu %9lu \n",
+ timeprobe_params [i].probe_id,
+ (u_long) ACE_U64_TO_U32(timeprobe_params [i].interval)/10,
+ (u_long) ACE_U64_TO_U32(timeprobe_params [i].start_event_time)/10,
+ (u_long) ACE_U64_TO_U32(timeprobe_params [i].stop_event_time)/10);
+ ACE_OS::fprintf (export_file_,
+ " [id: %lu] \t %lu \t %lu \t %lu\n",
+ timeprobe_params [i].probe_id,
+ (u_long) ACE_U64_TO_U32(timeprobe_params [i].interval)/10,
+ (u_long) ACE_U64_TO_U32(timeprobe_params [i].start_event_time)/10,
+ (u_long) ACE_U64_TO_U32(timeprobe_params [i].stop_event_time)/10);
+#else
+ // Build up the format specifiers since the specifier or not portable
+ ACE_OS::strcpy(format_spec, " [id: %14lu] ");
+ ACE_OS::strcat(format_spec, ACE_UINT64_FORMAT_SPECIFIER);
+ ACE_OS::strcat(format_spec, " ");
+ ACE_OS::strcat(format_spec, ACE_UINT64_FORMAT_SPECIFIER);
+ ACE_OS::strcat(format_spec, " ");
+ ACE_OS::strcat(format_spec, ACE_UINT64_FORMAT_SPECIFIER);
+ ACE_OS::strcat(format_spec, " *** Cross Thread Event ***\n");
+
+ ACE_OS::strcpy(export_spec, " [id: %lu] \t ");
+ ACE_OS::strcat(export_spec, ACE_UINT64_FORMAT_SPECIFIER);
+ ACE_OS::strcat(export_spec, " \t ");
+ ACE_OS::strcat(export_spec, ACE_UINT64_FORMAT_SPECIFIER);
+ ACE_OS::strcat(export_spec, " \t ");
+ ACE_OS::strcat(export_spec, ACE_UINT64_FORMAT_SPECIFIER);
+ ACE_OS::strcat(export_spec, " *** Cross Thread Event ***\n");
+
+ if (probe_name == 0)
+ {
+ ACE_DEBUG((LM_DEBUG, "Found a probe with id: %d with no name\n", timeprobe_params [i].probe_id));
+ }
+ else
+ {
+ ACE_OS::fprintf (log_file_,
+ format_spec,
+ (const char *) *probe_name,
+ timeprobe_params [i].interval / 10,
+ timeprobe_params [i].start_event_time / 10,
+ timeprobe_params [i].stop_event_time / 10);
+ ACE_OS::fprintf (export_file_,
+ export_spec,
+ (const char *) *probe_name,
+ timeprobe_params [i].interval / 10,
+ timeprobe_params [i].start_event_time / 10,
+ timeprobe_params [i].stop_event_time / 10);
+ }
+#endif
+
+ }
+ } // End if (this->generate_log_)
+ }
+
+#if defined (METRICS_LOGGER_SENDS_EVENTS)
+ if (this->generate_events_)
+ {
+ CORBA::Any any;
+
+ util_data_.hrt_op_utilization =
+ static_cast<CORBA::Double> (ACE_UINT64_DBLCAST_ADAPTER (hrt_op_time))
+ / static_cast<CORBA::Double> (ACE_UINT64_DBLCAST_ADAPTER (interval));
+
+ util_data_.srt_op_utilization =
+ static_cast<CORBA::Double> (ACE_UINT64_DBLCAST_ADAPTER (srt_op_time))
+ / static_cast<CORBA::Double> (ACE_UINT64_DBLCAST_ADAPTER (interval));
+
+ util_data_.queue_utilization =
+ static_cast<CORBA::Double> (ACE_UINT64_DBLCAST_ADAPTER (queue_time))
+ / static_cast<CORBA::Double> (ACE_UINT64_DBLCAST_ADAPTER (interval));
+
+ ACE_TRY_NEW_ENV
+ {
+ any.replace (Metrics::_tc_UtilData, &util_data_, 0, ACE_TRY_ENV);
+ ACE_TRY_CHECK;
+ }
+ ACE_CATCHANY
+ {
+#if defined (METRICS_LOGGER_ERROR_OUTPUT_ENABLED)
+ ACE_PRINT_EXCEPTION (ACE_ANY_EXCEPTION, "TAO_Metrics_Logger::process_aggregate_QoS");
+#endif
+ return;
+ }
+ ACE_ENDTRY;
+
+ this->dove_supplier_.notify (any);
+ }
+#endif /* METRICS_LOGGER_SENDS_EVENTS */
+
+ if (this->generate_log_)
+ {
+ if (log_filename_)
+ {
+ ACE_OS::fflush (log_file_);
+ ACE_OS::fflush (export_file_);
+// ACE_OS::fclose (log_file_);
+ }
+ }
+}
+
+TAO_END_VERSIONED_NAMESPACE_DECL
+
+#endif /* ACE_ENABLE_TIMEPROBES & ACE_COMPILE_TIMEPROBES */
+#endif /* ACE_METRICS_COLLECTION */
diff --git a/TAO/orbsvcs/orbsvcs/Metrics/Metrics_Logger.h b/TAO/orbsvcs/orbsvcs/Metrics/Metrics_Logger.h
new file mode 100644
index 00000000000..f836ca5faf3
--- /dev/null
+++ b/TAO/orbsvcs/orbsvcs/Metrics/Metrics_Logger.h
@@ -0,0 +1,224 @@
+// -*- C++ -*-
+
+// $Id$
+
+#ifndef METRICS_LOGGER_H
+#define METRICS_LOGGER_H
+
+#if ! defined (VXWORKS)
+
+#if defined (ACE_METRICS_COLLECTION)
+
+#if defined (ACE_ENABLE_TIMEPROBES) && defined (ACE_COMPILE_TIMEPROBES)
+
+// Comment out both of these to disable output
+# define METRICS_LOGGER_ERROR_OUTPUT_ENABLED
+# define METRICS_LOGGER_DEBUG_OUTPUT_ENABLED
+
+#endif /* ! VXWORKS */
+
+// Comment this out to disable event passing
+#define TAO_METRICS_LOGGER_SENDS_EVENTS
+
+#include "ace/OS.h"
+#include "ace/Task.h"
+#include "ace/Singleton.h"
+#include "ace/Functor.h"
+#include "ace/Hash_Map_Manager.h"
+
+//#include "tao/TAO.h"
+
+#include "orbsvcs/Time_Utilities.h"
+#include "orbsvcs/MetricsS.h"
+#include "orbsvcs/RtecEventCommS.h"
+
+#include "orbsvcs/Metrics/Metrics_Utils.h"
+
+#if defined (METRICS_LOGGER_SENDS_EVENTS)
+#include "MetricsC.h"
+#include "DOVE_Supplier.h"
+#endif /* METRICS_LOGGER_SENDS_EVENTS */
+
+#if !defined (ACE_LACKS_PRAGMA_ONCE)
+# pragma once
+#endif /* ACE_LACKS_PRAGMA_ONCE */
+
+TAO_BEGIN_VERSIONED_NAMESPACE_DECL
+
+class TAO_Metrics_Export TAO_Metrics_Logger_Data
+{
+ // = TITLE
+ // Defines a class for logger data.
+ //
+ // = DESCRIPTION
+ // This class is used to transfer metrics data to the logger class.
+public:
+
+ enum LOGGER_DATA_TYPE {QOS_TYPE, TIMEPROBE_TYPE, BANNER_TYPE};
+
+ TAO_Metrics_Logger_Data (LOGGER_DATA_TYPE data_type,
+ Metrics::Time interval = ORBSVCS_Time::zero ())
+ : data_type_ (data_type),
+ interval_ (interval),
+ qos_params_ (0),
+ timeprobe_params_ (0),
+ banner_ (0)
+ {
+ }
+ // Constructor.
+
+ ~TAO_Metrics_Logger_Data ()
+ {
+ delete qos_params_;
+ delete timeprobe_params_;
+ delete banner_;
+ }
+ // Destructor.
+
+ LOGGER_DATA_TYPE data_type_;
+ // Identifies type of data.
+
+ Metrics::Time interval_;
+ // Time interval over which data were collected.
+
+ Metrics::QoSParameter_Set * qos_params_;
+ // Points to a QoS parameter data set.
+
+ Metrics::TimeprobeParameter_Set * timeprobe_params_;
+ // Points to a timeprobe data set.
+
+ char * banner_;
+ // Banner for entry in the log and/or visualization stream.
+};
+
+
+
+class TAO_Metrics_Export TAO_Metrics_Logger
+ : public ACE_Task<ACE_MT_SYNCH>, public POA_Metrics::QoSLogger
+ // = TITLE
+ // This class implements a Metrics QoS logger.
+ //
+ // = DESCRIPTION
+ // This class allows clients to log monitored QoS.
+{
+public:
+
+ typedef ACE_Hash_Map_Manager_Ex<CORBA::ULong,
+ CORBA::String_var *,
+ ACE_Hash<CORBA::ULong>,
+ ACE_Equal_To<CORBA::ULong>,
+ ACE_Null_Mutex> PROBE_NAME_MAP;
+ // Type of map used for O(1) lookup of probe names.
+
+ typedef ACE_Hash_Map_Entry<CORBA::ULong, CORBA::String_var> PROBE_NAME_MAP_ENTRY;
+ // Type of map used for O(1) lookup of RT_Infos by their handles.
+
+ TAO_Metrics_Logger (int generate_events = 0, int generate_log = 0, int generate_export_file = 1, const char *log_filename = 0);
+ // Default constructor.
+
+ virtual ~TAO_Metrics_Logger ();
+ // Destructor.
+
+ virtual int svc (void);
+ // Active object loop for processing logged data.
+
+ void send_banner (const char *banner
+ ACE_ENV_ARG_DECL)
+ throw (CORBA::SystemException);
+ // Sends a banner to be written to the log file and to the visualization browser.
+
+ void process_banner (const char *banner);
+ // Writes banner to the log file and/or to the visualization browser.
+
+ void log_aggregate_QoS (const Metrics::QoSParameter_Set & qos_params,
+ Metrics::Time interval
+ ACE_ENV_ARG_DECL)
+ throw (CORBA::SystemException);
+ // Reports the aggregate QoS information for all operations
+ // to the passed QoS logger.
+
+ void process_aggregate_QoS (const Metrics::QoSParameter_Set & qos_params,
+ Metrics::Time interval);
+ // Processes the aggregate QoS information for all operations
+ // to the passed QoS logger.
+
+ void set_identities (const Metrics::ProbeIdentity_Set & probe_identities
+ ACE_ENV_ARG_DECL)
+ throw (CORBA::SystemException);
+ // Binds the names of various timeprobes to their identifiers so
+ // that ids alone can be used (for efficiency) in passing data.
+
+ void set_identity (const Metrics::ProbeIdentity_t & probe_identity
+ ACE_ENV_ARG_DECL)
+ throw (CORBA::SystemException);
+ // Binds the names of various timeprobes to their identifiers so
+ // that ids alone can be used (for efficiency) in passing data.
+
+ void log_timeprobe_data (const Metrics::TimeprobeParameter_Set & timeprobe_params,
+ Metrics::Time interval
+ ACE_ENV_ARG_DECL)
+ throw (CORBA::SystemException);
+ // Reports timeprobe data collected since last run.
+
+ void process_timeprobe_data (const Metrics::TimeprobeParameter_Set & timeprobe_params,
+ Metrics::Time interval);
+ // Processes timeprobe data collected since last run.
+
+protected:
+
+ int generate_events_;
+ // Indicates whether or not to generate events for displays.
+
+ int generate_log_;
+ // Indicates whether or not to generate a text log.
+
+ const char *log_filename_;
+ // Name of the text log file (if any)
+
+ int generate_totals_;
+ // Indicates whether information of totals are logged.
+
+ int generate_export_file_;
+ // Indicates whether information of totals are logged.
+
+ int log_started_;
+ // Indicates whether or not the log has been started already.
+
+ FILE *log_file_;
+ // Handle to the text log file (if any).
+
+ FILE *export_file_;
+ // Handle to the excel export log file (if any).
+
+ PROBE_NAME_MAP probe_name_map_;
+ // Maps probe ids to their names.
+
+#if defined (METRICS_LOGGER_SENDS_EVENTS)
+ DOVE_Supplier dove_supplier_;
+ // DOVE Event supplier.
+
+ Metrics::QoSData qos_data_;
+ // QoS data structure.
+
+ Metrics::UtilData util_data_;
+ // Utilization data structure.
+
+#endif /* METRICS_LOGGER_SENDS_EVENTS */
+
+ // Only write the file once every OPEN_CLOSE_BANNER_CYCLE banner
+ // changes
+ int saveFileCnt_;
+};
+
+typedef ACE_Singleton<Metrics::QoSLogger_var, ACE_SYNCH_MUTEX>
+TAO_METRICS_LOGGER_REF_SINGLETON;
+
+typedef ACE_Singleton<TAO_Metrics_Logger, ACE_SYNCH_MUTEX>
+TAO_METRICS_LOGGER_SINGLETON;
+
+TAO_END_VERSIONED_NAMESPACE_DECL
+
+#endif /* ACE_ENABLE_TIMEPROBES & ACE_COMPILE_TIMEPROBES */
+#endif /* ACE_METRICS_COLLECTION */
+
+#endif /* METRICS_LOGGER_H */
diff --git a/TAO/orbsvcs/orbsvcs/Metrics/Metrics_UpcallMonitor.cpp b/TAO/orbsvcs/orbsvcs/Metrics/Metrics_UpcallMonitor.cpp
new file mode 100644
index 00000000000..fe4ec645da8
--- /dev/null
+++ b/TAO/orbsvcs/orbsvcs/Metrics/Metrics_UpcallMonitor.cpp
@@ -0,0 +1,23 @@
+// $Id$
+
+#ifndef METRICS_UPCALL_MONITOR_CPP
+#define METRICS_UPCALL_MONITOR_CPP
+
+#include "orbsvcs/Metrics/Metrics_UpcallMonitor.h"
+
+#if defined (ACE_METRICS_COLLECTION)
+
+#if defined (ACE_ENABLE_TIMEPROBES) && defined (ACE_COMPILE_TIMEPROBES)
+
+#if !defined (__ACE_INLINE__)
+#include "orbsvcs/Metrics/Metrics_UpcallMonitor.i"
+#endif /* __ACE_INLINE__ */
+
+#else
+#error ACE_COMPILE_TIMEPROBES must be defined in order to collect metrics
+#endif /* ACE_ENABLE_TIMEPROBES & ACE_COMPILE_TIMEPROBES */
+#endif /* ACE_METRICS_COLLECTION */
+
+
+#endif /* METRICS_UPCALL_MONITOR_CPP */
+
diff --git a/TAO/orbsvcs/orbsvcs/Metrics/Metrics_UpcallMonitor.h b/TAO/orbsvcs/orbsvcs/Metrics/Metrics_UpcallMonitor.h
new file mode 100644
index 00000000000..69dde8b966c
--- /dev/null
+++ b/TAO/orbsvcs/orbsvcs/Metrics/Metrics_UpcallMonitor.h
@@ -0,0 +1,264 @@
+// -*- C++ -*-
+
+// $Id$
+
+#ifndef METRICS_UPCALL_MONITOR_H
+#define METRICS_UPCALL_MONITOR_H
+
+#if defined (ACE_METRICS_COLLECTION)
+
+#if defined (ACE_ENABLE_TIMEPROBES) && defined (ACE_COMPILE_TIMEPROBES)
+
+#if ! defined (VXWORKS)
+
+// Comment out both of these to disable output
+# define METRICS_MONITOR_ERROR_OUTPUT_ENABLED
+# define METRICS_MONITOR_DEBUG_OUTPUT_ENABLED
+
+#endif /* ! VXWORKS */
+
+#include "ace/Singleton.h"
+#include "ace/Hash_Map_Manager.h"
+
+#include "orbsvcs/RtecEventCommS.h"
+#include "orbsvcs/Time_Utilities.h"
+#include "orbsvcs/MetricsS.h"
+
+#include "orbsvcs/Metrics/Metrics_LocalCache.h"
+#include "orbsvcs/Metrics/Metrics_FrameManager.h"
+#include "orbsvcs/Metrics/Metrics_Utils.h"
+
+TAO_BEGIN_VERSIONED_NAMESPACE_DECL
+
+class TAO_Metrics_Export TAO_Metrics_UpcallMonitor
+ : public POA_Metrics::QoSMonitor
+{
+ // = TITLE
+ // This class implements a Metrics QoS monitor.
+ //
+ // = DESCRIPTION
+ // This class allows clients to monitor QoS, collected
+ // by the rest of the metrics framework.
+public:
+
+ typedef ACE_Hash_Map_Manager_Ex<RtecScheduler::handle_t,
+ CORBA::ULong,
+ ACE_Hash<RtecScheduler::handle_t>,
+ ACE_Equal_To<RtecScheduler::handle_t>,
+ ACE_SYNCH_MUTEX> MONITOR_MAP;
+ // Type of map used for O(1) lookup of missed/made deadline counts
+ // by operation handles.
+
+ typedef ACE_Hash_Map_Entry<RtecScheduler::handle_t, CORBA::ULong>
+ MONITOR_MAP_ENTRY;
+ // Type of map used for O(1) lookup of RT_Infos by their handles.
+
+ typedef ACE_Hash_Map_Iterator_Ex<RtecScheduler::handle_t,
+ CORBA::ULong,
+ ACE_Hash<RtecScheduler::handle_t>,
+ ACE_Equal_To<RtecScheduler::handle_t>,
+ ACE_SYNCH_MUTEX> MONITOR_MAP_ITERATOR;
+ // Type of map used for O(1) lookup of missed/made deadline counts
+ // by operation handles.
+
+
+ TAO_Metrics_UpcallMonitor ();
+ // Default constructor.
+
+ ~TAO_Metrics_UpcallMonitor ();
+ // Destructor.
+
+ virtual void
+ report_made_deadline (RtecScheduler::handle_t handle
+ ACE_ENV_ARG_DECL
+ )
+ ACE_THROW_SPEC ((CORBA::SystemException,
+ Metrics::INTERNAL_0));
+ // Reports a successful upcall.
+
+ virtual void
+ report_missed_deadline (RtecScheduler::handle_t handle
+ ACE_ENV_ARG_DECL
+ )
+ ACE_THROW_SPEC ((CORBA::SystemException,
+ Metrics::INTERNAL_1));
+ // Reports an unsuccessful upcall.
+
+ virtual void
+ get_aggregate_QoS (RtecScheduler::handle_t handle,
+ Metrics::QoSParameter_t_out qos
+ ACE_ENV_ARG_DECL
+ )
+ ACE_THROW_SPEC ((CORBA::SystemException,
+ Metrics::INTERNAL_2,
+ Metrics::INTERNAL_3));
+ // Get the aggregate QoS statistics collected for the passed handle.
+
+ virtual void get_aggregate_QoS_set (
+ const Metrics::Handle_Set_t & handle_set,
+ Metrics::QoSParameter_Set_out qos_set
+ ACE_ENV_ARG_DECL)
+ ACE_THROW_SPEC ((CORBA::SystemException,
+ Metrics::INTERNAL_4,
+ Metrics::INTERNAL_5));
+ // Get the aggregate QoS statistics collected for each handle in the
+ // passed set.
+
+ virtual void
+ reset_statistics (RtecScheduler::handle_t handle
+ ACE_ENV_ARG_DECL)
+ ACE_THROW_SPEC ((CORBA::SystemException,
+ Metrics::INTERNAL_7,
+ Metrics::INTERNAL_8));
+ // Resets the aggregate QoS information for the given operation.
+
+ MONITOR_MAP &missed_map ();
+ // Accessor for map of operation handle to a count of deadlines missed.
+
+ MONITOR_MAP &made_map ();
+ // Accessor for map of operation handle to a count of deadlines made.
+
+private:
+
+ // = Implementation members.
+
+ MONITOR_MAP missed_map_;
+ // Maps operation handle to a count of deadlines missed.
+
+ MONITOR_MAP made_map_;
+ // Maps operation handle to a count of deadlines made.
+
+};
+
+
+class TAO_Metrics_Export TAO_Metrics_ReportingUpcallMonitor
+ : public POA_Metrics::ReportingQoSMonitor
+{
+ // = TITLE
+ // This class implements a reporting extension for a Metrics QoS monitor.
+ //
+ // = DESCRIPTION
+ // This class uses delegation to avoid the ugly consequences of
+ // multiple inheritance from a common IDL base class along two
+ // inheritance paths.
+public:
+
+ typedef ACE_Hash_Map_Manager_Ex<RtecScheduler::handle_t,
+ CORBA::ULong,
+ ACE_Hash<RtecScheduler::handle_t>,
+ ACE_Equal_To<RtecScheduler::handle_t>,
+ ACE_SYNCH_MUTEX> MONITOR_MAP;
+ // Type of map used for O(1) lookup of missed/made deadline counts
+ // by operation handles.
+
+ typedef ACE_Hash_Map_Entry<RtecScheduler::handle_t, CORBA::ULong>
+ MONITOR_MAP_ENTRY;
+ // Type of map used for O(1) lookup of RT_Infos by their handles.
+
+ typedef ACE_Hash_Map_Iterator_Ex<RtecScheduler::handle_t,
+ CORBA::ULong,
+ ACE_Hash<RtecScheduler::handle_t>,
+ ACE_Equal_To<RtecScheduler::handle_t>,
+ ACE_SYNCH_MUTEX> MONITOR_MAP_ITERATOR;
+ // Type of map used for O(1) lookup of missed/made deadline counts
+ // by operation handles.
+
+
+ TAO_Metrics_ReportingUpcallMonitor ();
+ // Default constructor.
+
+ ~TAO_Metrics_ReportingUpcallMonitor ();
+ // Destructor.
+
+ virtual void
+ report_made_deadline (RtecScheduler::handle_t handle
+ ACE_ENV_ARG_DECL)
+ ACE_THROW_SPEC ((CORBA::SystemException,
+ Metrics::INTERNAL_0));
+ // Reports a successful upcall.
+
+ virtual void
+ report_missed_deadline (RtecScheduler::handle_t handle
+ ACE_ENV_ARG_DECL)
+ ACE_THROW_SPEC ((CORBA::SystemException,
+ Metrics::INTERNAL_1));
+ // Reports an unsuccessful upcall.
+
+ virtual void
+ get_aggregate_QoS (RtecScheduler::handle_t handle,
+ Metrics::QoSParameter_t_out qos
+ ACE_ENV_ARG_DECL)
+ ACE_THROW_SPEC ((CORBA::SystemException,
+ Metrics::INTERNAL_2,
+ Metrics::INTERNAL_3));
+ // Get the aggregate QoS statistics collected for the passed handle.
+
+ virtual void get_aggregate_QoS_set (
+ const Metrics::Handle_Set_t & handle_set,
+ Metrics::QoSParameter_Set_out qos_set
+ ACE_ENV_ARG_DECL)
+ ACE_THROW_SPEC ((CORBA::SystemException,
+ Metrics::INTERNAL_4,
+ Metrics::INTERNAL_5));
+ // Get the aggregate QoS statistics collected for each handle in the
+ // passed set.
+
+ virtual void report_aggregate_QoS (
+ Metrics::QoSLogger_ptr logger,
+ Metrics::Time interval
+ ACE_ENV_ARG_DECL)
+ ACE_THROW_SPEC ((CORBA::SystemException,
+ Metrics::NIL_LOGGER,
+ Metrics::INTERNAL_6));
+ // Report the aggregate QoS statistics to the logger.
+
+ virtual void
+ reset_statistics (RtecScheduler::handle_t handle
+ ACE_ENV_ARG_DECL)
+ ACE_THROW_SPEC ((CORBA::SystemException,
+ Metrics::INTERNAL_7,
+ Metrics::INTERNAL_8));
+ // Resets the aggregate QoS information for the given operation.
+
+private:
+
+ TAO_Metrics_UpcallMonitor monitor_;
+ // The monitor we're wrapping.
+};
+
+TAO_END_VERSIONED_NAMESPACE_DECL
+
+#if defined (__ACE_INLINE__)
+#include "orbsvcs/Metrics/Metrics_UpcallMonitor.i"
+#endif /* __ACE_INLINE__ */
+
+#include "orbsvcs/Metrics/Metrics_UpcallMonitor_T.h"
+
+TAO_BEGIN_VERSIONED_NAMESPACE_DECL
+
+typedef TAO_Metrics_UpcallMonitorAdapter<ACE_SYNCH_MUTEX, ACE_New_Allocator>
+TAO_METRICS_MONITOR_ADAPTER_TYPE;
+
+typedef TAO_Metrics_ReportingUpcallMonitorAdapter<ACE_SYNCH_MUTEX, ACE_New_Allocator>
+TAO_METRICS_REPORTING_MONITOR_ADAPTER_TYPE;
+
+typedef ACE_Singleton<TAO_Metrics_UpcallMonitor, ACE_SYNCH_MUTEX>
+TAO_METRICS_MONITOR_SINGLETON_TYPE;
+
+typedef ACE_Singleton<TAO_Metrics_ReportingUpcallMonitor, ACE_SYNCH_MUTEX>
+TAO_METRICS_REPORTING_MONITOR_SINGLETON_TYPE;
+
+#if defined (TAO_USES_REPORTING_METRICS)
+typedef TAO_METRICS_REPORTING_MONITOR_ADAPTER_TYPE TAO_METRICS_MONITOR_ADAPTER;
+typedef TAO_METRICS_REPORTING_MONITOR_SINGLETON_TYPE TAO_METRICS_MONITOR_SINGLETON;
+#else
+typedef TAO_METRICS_MONITOR_ADAPTER_TYPE TAO_METRICS_MONITOR_ADAPTER;
+typedef TAO_METRICS_MONITOR_SINGLETON_TYPE TAO_METRICS_MONITOR_SINGLETON;
+#endif
+
+TAO_END_VERSIONED_NAMESPACE_DECL
+
+#endif /* ACE_ENABLE_TIMEPROBES & ACE_COMPILE_TIMEPROBES */
+#endif /* ACE_METRICS_COLLECTION */
+
+#endif /* METRICS_UPCALL_MONITOR_H */
diff --git a/TAO/orbsvcs/orbsvcs/Metrics/Metrics_UpcallMonitor.i b/TAO/orbsvcs/orbsvcs/Metrics/Metrics_UpcallMonitor.i
new file mode 100644
index 00000000000..9b028ba293b
--- /dev/null
+++ b/TAO/orbsvcs/orbsvcs/Metrics/Metrics_UpcallMonitor.i
@@ -0,0 +1,381 @@
+// -*- C++ -*-
+//
+// $Id$
+
+// @METRICS@
+
+#ifndef METRICS_UPCALL_MONITOR_I
+#define METRICS_UPCALL_MONITOR_I
+
+//# if defined (METRICS_USES_OP_CANCELLATION)
+//# undef METRICS_USES_OP_CANCELLATION
+//# endif /* METRICS_USES_OP_CANCELLATION */
+
+# if ! defined (METRICS_USES_OP_CANCELLATION)
+# define METRICS_USES_OP_CANCELLATION
+# endif /* ! METRICS_USES_OP_CANCELLATION */
+
+TAO_BEGIN_VERSIONED_NAMESPACE_DECL
+
+/////////////////////////////////////
+// Class TAO_Metrics_UpcallMonitor //
+/////////////////////////////////////
+
+// Default constructor.
+
+ACE_INLINE
+TAO_Metrics_UpcallMonitor::TAO_Metrics_UpcallMonitor ()
+{
+}
+
+// Destructor.
+
+ACE_INLINE
+TAO_Metrics_UpcallMonitor::~TAO_Metrics_UpcallMonitor ()
+{
+}
+
+// Reports a successful upcall.
+
+ACE_INLINE void
+TAO_Metrics_UpcallMonitor::
+report_made_deadline (RtecScheduler::handle_t handle
+ ACE_ENV_ARG_DECL)
+ ACE_THROW_SPEC ((CORBA::SystemException,
+ Metrics::INTERNAL_0))
+{
+ CORBA::ULong count = 0;
+ MONITOR_MAP_ENTRY *entry;
+
+ if (made_map_.trybind (handle, count, entry) < 0)
+ {
+ ACE_DEBUG ((LM_DEBUG,
+ "Failed trybind for handle %u in made map\n", handle));
+ ACE_THROW (Metrics::INTERNAL_0 ());
+ }
+
+ ++entry->int_id_;
+}
+
+// Reports an unsuccessful upcall.
+
+ACE_INLINE void
+TAO_Metrics_UpcallMonitor::
+report_missed_deadline (RtecScheduler::handle_t handle
+ ACE_ENV_ARG_DECL)
+ ACE_THROW_SPEC ((CORBA::SystemException,
+ Metrics::INTERNAL_1))
+{
+ CORBA::ULong count = 0;
+ MONITOR_MAP_ENTRY *entry;
+
+ if (missed_map_.trybind (handle, count, entry) < 0)
+ {
+ ACE_DEBUG ((LM_DEBUG,
+ "Failed trybind for handle %u in missed map\n", handle));
+ ACE_THROW (Metrics::INTERNAL_1 ());
+ }
+
+ ++entry->int_id_;
+}
+
+
+// Get the aggregate QoS statistics collected so far by the monitor.
+
+ACE_INLINE void
+TAO_Metrics_UpcallMonitor::get_aggregate_QoS (RtecScheduler::handle_t handle,
+ Metrics::QoSParameter_t_out qos
+ ACE_ENV_ARG_DECL)
+ ACE_THROW_SPEC ((CORBA::SystemException,
+ Metrics::INTERNAL_2,
+ Metrics::INTERNAL_3))
+{
+ CORBA::ULong made_count = 0;
+ CORBA::ULong missed_count = 0;
+ MONITOR_MAP_ENTRY *made_entry;
+ MONITOR_MAP_ENTRY *missed_entry;
+
+ if (made_map_.trybind (handle, made_count, made_entry) < 0)
+ {
+ ACE_DEBUG ((LM_DEBUG, "TAO_Metrics_UpcallMonitor::get_aggregate_QoS: "
+ "Failed trybind for handle %u in made map\n", handle));
+ ACE_THROW (Metrics::INTERNAL_2 ());
+ }
+
+ if (missed_map_.trybind (handle, missed_count, missed_entry) < 0)
+ {
+ ACE_DEBUG ((LM_DEBUG, "TAO_Metrics_UpcallMonitor::get_aggregate_QoS: "
+ "Failed trybind for handle %u in missed map\n", handle));
+ ACE_THROW (Metrics::INTERNAL_3 ());
+ }
+
+ ACE_NEW_THROW_EX (qos,
+ Metrics::QoSParameter_t,
+ CORBA::NO_MEMORY ());
+
+ qos->handle = handle;
+ qos->deadlines_made = made_entry->int_id_;
+ qos->deadlines_missed = missed_entry->int_id_;
+ qos->operations_cancelled = 0;
+ qos->is_hrt = 0;
+}
+
+
+// Get the aggregate QoS statistics collected for each handle in the
+// passed set.
+
+ACE_INLINE void
+TAO_Metrics_UpcallMonitor::get_aggregate_QoS_set (
+ const Metrics::Handle_Set_t & handle_set,
+ Metrics::QoSParameter_Set_out qos_set
+ ACE_ENV_ARG_DECL)
+ ACE_THROW_SPEC ((CORBA::SystemException,
+ Metrics::INTERNAL_4,
+ Metrics::INTERNAL_5))
+{
+ CORBA::ULong made_count = 0;
+ CORBA::ULong missed_count = 0;
+ MONITOR_MAP_ENTRY *made_entry = 0;
+ MONITOR_MAP_ENTRY *missed_entry = 0;
+
+ ACE_NEW_THROW_EX (qos_set,
+ Metrics::QoSParameter_Set (handle_set.length ()),
+ CORBA::NO_MEMORY ());
+ qos_set->length (handle_set.length ());
+
+
+ for (u_int i = 0; i < handle_set.length (); ++i)
+ {
+ made_count = 0;
+ missed_count = 0;
+ made_entry = 0;
+ missed_entry = 0;
+
+ if (made_map_.trybind (handle_set [i], made_count, made_entry) < 0)
+ {
+ ACE_DEBUG ((LM_DEBUG,
+ "TAO_Metrics_UpcallMonitor::get_aggregate_QoS_set: "
+ "Failed trybind for handle_set [%d] = %u in made map\n",
+ i, handle_set [i]));
+ ACE_THROW (Metrics::INTERNAL_4 ());
+ }
+
+ if (missed_map_.trybind (handle_set [i], missed_count, missed_entry) < 0)
+ {
+ ACE_DEBUG ((LM_DEBUG,
+ "TAO_Metrics_UpcallMonitor::get_aggregate_QoS_set: "
+ "Failed trybind for handle_set[%d]=%u in missed map\n",
+ i, handle_set [i]));
+ ACE_THROW (Metrics::INTERNAL_5 ());
+ }
+
+ qos_set [i].handle = handle_set [i];
+ qos_set [i].deadlines_made = made_entry->int_id_;
+ qos_set [i].deadlines_missed = missed_entry->int_id_;
+ qos_set [i].operations_cancelled = 0;
+ qos_set [i].is_hrt = 0;
+ }
+}
+
+
+
+// Resets the aggregate QoS information for the given operation.
+
+ACE_INLINE void
+TAO_Metrics_UpcallMonitor::reset_statistics (RtecScheduler::handle_t handle
+ ACE_ENV_ARG_DECL)
+ ACE_THROW_SPEC ((CORBA::SystemException,
+ Metrics::INTERNAL_7,
+ Metrics::INTERNAL_8))
+{
+ CORBA::ULong count = 0;
+
+ if (made_map_.rebind (handle, count) < 0)
+ {
+ ACE_THROW (Metrics::INTERNAL_7 ());
+ }
+
+ if (missed_map_.rebind (handle, count) < 0)
+ {
+ ACE_THROW (Metrics::INTERNAL_8 ());
+ }
+}
+
+
+// Accessor for map of operation handle to a count of deadlines missed.
+
+ACE_INLINE
+TAO_Metrics_UpcallMonitor::MONITOR_MAP &
+TAO_Metrics_UpcallMonitor::missed_map ()
+{
+ return this->missed_map_;
+}
+
+// Accessor for map of operation handle to a count of deadlines made.
+
+ACE_INLINE
+TAO_Metrics_UpcallMonitor::MONITOR_MAP &
+TAO_Metrics_UpcallMonitor::made_map ()
+{
+ return this->made_map_;
+}
+
+//////////////////////////////////////////////
+// Class TAO_Metrics_ReportingUpcallMonitor //
+//////////////////////////////////////////////
+
+// Default constructor.
+
+ACE_INLINE
+TAO_Metrics_ReportingUpcallMonitor::TAO_Metrics_ReportingUpcallMonitor ()
+{
+}
+
+// Destructor.
+
+ACE_INLINE
+TAO_Metrics_ReportingUpcallMonitor::~TAO_Metrics_ReportingUpcallMonitor ()
+{
+}
+
+// Reports a successful upcall.
+
+ACE_INLINE void
+TAO_Metrics_ReportingUpcallMonitor::
+report_made_deadline (RtecScheduler::handle_t handle
+ ACE_ENV_ARG_DECL)
+ ACE_THROW_SPEC ((CORBA::SystemException,
+ Metrics::INTERNAL_0))
+{
+ monitor_.report_made_deadline (handle
+ ACE_ENV_ARG_DECL);
+}
+
+// Reports an unsuccessful upcall.
+
+ACE_INLINE void
+TAO_Metrics_ReportingUpcallMonitor::
+report_missed_deadline (RtecScheduler::handle_t handle
+ ACE_ENV_ARG_DECL)
+ ACE_THROW_SPEC ((CORBA::SystemException,
+ Metrics::INTERNAL_1))
+{
+ monitor_.report_missed_deadline (handle
+ ACE_ENV_ARG_DECL);
+}
+
+
+// Get the aggregate QoS statistics collected so far by the monitor.
+
+ACE_INLINE void
+TAO_Metrics_ReportingUpcallMonitor::get_aggregate_QoS (RtecScheduler::handle_t handle,
+ Metrics::QoSParameter_t_out qos
+ ACE_ENV_ARG_DECL)
+ ACE_THROW_SPEC ((CORBA::SystemException,
+ Metrics::INTERNAL_2,
+ Metrics::INTERNAL_3))
+{
+ monitor_.get_aggregate_QoS (handle,
+ qos
+ ACE_ENV_ARG_DECL);
+}
+
+
+// Get the aggregate QoS statistics collected for each handle in the
+// passed set.
+
+ACE_INLINE void
+TAO_Metrics_ReportingUpcallMonitor::get_aggregate_QoS_set (
+ const Metrics::Handle_Set_t & handle_set,
+ Metrics::QoSParameter_Set_out qos_set
+ ACE_ENV_ARG_DECL)
+ ACE_THROW_SPEC ((CORBA::SystemException,
+ Metrics::INTERNAL_4,
+ Metrics::INTERNAL_5))
+{
+ monitor_.get_aggregate_QoS_set (handle_set,
+ qos_set
+ ACE_ENV_ARG_DECL);
+}
+
+
+
+// Resets the aggregate QoS information for the given operation.
+
+ACE_INLINE void
+TAO_Metrics_ReportingUpcallMonitor::reset_statistics (RtecScheduler::handle_t handle
+ ACE_ENV_ARG_DECL)
+ ACE_THROW_SPEC ((CORBA::SystemException,
+ Metrics::INTERNAL_7,
+ Metrics::INTERNAL_8))
+{
+ monitor_.reset_statistics (handle
+ ACE_ENV_ARG_DECL);
+}
+
+
+// Reports the aggregate QoS statistics to the logger.
+
+ACE_INLINE void
+TAO_Metrics_ReportingUpcallMonitor::report_aggregate_QoS (
+ Metrics::QoSLogger_ptr logger,
+ Metrics::Time interval
+ ACE_ENV_ARG_DECL)
+ ACE_THROW_SPEC ((CORBA::SystemException,
+ Metrics::NIL_LOGGER,
+ Metrics::INTERNAL_6))
+{
+ if (CORBA::is_nil (logger))
+ {
+ ACE_THROW (Metrics::NIL_LOGGER ());
+ }
+
+ Metrics::QoSParameter_Set qos_set;
+ u_int set_length = 1;
+
+ // First, look at made map handles
+ MONITOR_MAP_ITERATOR iter (monitor_.made_map ());
+ for (; iter.done () == 0; ++iter, ++set_length)
+ {
+ CORBA::ULong missed_count;
+ if (monitor_.missed_map ().find ((*iter).ext_id_, missed_count) < 0)
+ {
+ missed_count = 0;
+ }
+
+ qos_set.length (set_length);
+
+ qos_set [set_length - 1].entry_point = (const char *) "MONITOR MADE_MAP_OP";
+ qos_set [set_length - 1].handle = (*iter).ext_id_;
+ qos_set [set_length - 1].deadlines_made = (*iter).int_id_;
+ qos_set [set_length - 1].deadlines_missed = missed_count;
+ qos_set [set_length - 1].operations_cancelled = 0;
+ qos_set [set_length - 1].is_hrt = 0;
+ }
+
+ // Then, find missed map handles with no made map entry.
+ MONITOR_MAP_ITERATOR missed_iter (monitor_.missed_map ());
+ for (; missed_iter.done () == 0; ++missed_iter)
+ {
+ CORBA::ULong made_count;
+ if (monitor_.made_map ().find ((*missed_iter).ext_id_, made_count) < 0)
+ {
+ qos_set.length (set_length);
+
+ qos_set [set_length - 1].entry_point = (const char *) "MONITOR MISS_MAP_OP";
+ qos_set [set_length - 1].handle = (*missed_iter).ext_id_;
+ qos_set [set_length - 1].deadlines_made = 0;
+ qos_set [set_length - 1].deadlines_missed = (*missed_iter).int_id_;
+ qos_set [set_length - 1].operations_cancelled = 0;
+ qos_set [set_length - 1].is_hrt = 0;
+
+ ++set_length;
+ }
+ }
+
+ logger->log_aggregate_QoS (qos_set, interval);
+}
+
+TAO_END_VERSIONED_NAMESPACE_DECL
+
+#endif /* METRICS_UPCALL_MONITOR_I */
diff --git a/TAO/orbsvcs/orbsvcs/Metrics/Metrics_UpcallMonitor_T.cpp b/TAO/orbsvcs/orbsvcs/Metrics/Metrics_UpcallMonitor_T.cpp
new file mode 100644
index 00000000000..333b49c3ff6
--- /dev/null
+++ b/TAO/orbsvcs/orbsvcs/Metrics/Metrics_UpcallMonitor_T.cpp
@@ -0,0 +1,28 @@
+// $Id$
+
+#ifndef METRICS_UPCALL_MONITOR_T_CPP
+#define METRICS_UPCALL_MONITOR_T_CPP
+
+#include "orbsvcs/Metrics/Metrics_UpcallMonitor_T.h"
+
+#if !defined (__ACE_INLINE__)
+#include "orbsvcs/Metrics/Metrics_UpcallMonitor_T.i"
+#endif /* __ACE_INLINE__ */
+
+TAO_BEGIN_VERSIONED_NAMESPACE_DECL
+
+// Virtual destructor: destroy actual consumer if we own it.
+template <class ACE_LOCK, class ALLOCATOR>
+TAO_Metrics_UpcallMonitorAdapter<ACE_LOCK, ALLOCATOR>::
+~TAO_Metrics_UpcallMonitorAdapter ()
+{
+ if (adapter_owns_consumer_)
+ {
+ delete (& consumer_);
+ }
+}
+
+TAO_END_VERSIONED_NAMESPACE_DECL
+
+#endif /* METRICS_UPCALL_MONITOR_T_CPP */
+
diff --git a/TAO/orbsvcs/orbsvcs/Metrics/Metrics_UpcallMonitor_T.h b/TAO/orbsvcs/orbsvcs/Metrics/Metrics_UpcallMonitor_T.h
new file mode 100644
index 00000000000..4c5958cb09e
--- /dev/null
+++ b/TAO/orbsvcs/orbsvcs/Metrics/Metrics_UpcallMonitor_T.h
@@ -0,0 +1,164 @@
+// -*- C++ -*-
+
+// $Id$
+
+#ifndef METRICS_UPCALL_MONITOR_T_H
+#define METRICS_UPCALL_MONITOR_T_H
+
+#if ! defined (VXWORKS)
+
+// Comment out both of these to disable output
+# define METRICS_MONITOR_ERROR_OUTPUT_ENABLED
+# define METRICS_MONITOR_DEBUG_OUTPUT_ENABLED
+
+#endif /* ! VXWORKS */
+
+#include "orbsvcs/Metrics/Metrics_LocalCache.h"
+#include "orbsvcs/Metrics/Metrics_FrameManager.h"
+
+#include "ace/Hash_Map_Manager.h"
+
+#include "orbsvcs/RtecEventCommS.h"
+#include "orbsvcs/Time_Utilities.h"
+#include "orbsvcs/MetricsS.h"
+
+#include "orbsvcs/Metrics/Metrics_UpcallMonitor.h"
+
+
+TAO_BEGIN_VERSIONED_NAMESPACE_DECL
+
+template <class ACE_LOCK, class ALLOCATOR>
+class TAO_Metrics_UpcallMonitorAdapter
+ : public RtecEventComm::PushConsumer
+{
+ // = TITLE
+ // This class implements an adapter for monitoring QoS received by
+ // an event push consumer.
+ //
+ // = DESCRIPTION
+ // This class wraps the consumer event push upcall with time
+ // probe and monitor reporting calls.
+public:
+
+ TAO_Metrics_UpcallMonitorAdapter (
+ POA_Metrics::QoSMonitor & monitor,
+ TAO_Metrics_LocalCache<ACE_LOCK, ALLOCATOR> & cache,
+ TAO_Metrics_FrameManager<ACE_LOCK> & frame_manager,
+ POA_RtecEventComm::PushConsumer & consumer,
+ TAO::String_Manager entry_point,
+ RtecScheduler::handle_t handle,
+ RtecScheduler::Period_t period,
+ RtecScheduler::Time wcet,
+ RtecScheduler::Criticality_t criticality,
+ int adapter_owns_consumer = 1,
+ int cache_register = 1);
+ // Constructor that takes a reference to the various metrics
+ // objects, the actual push consumer we're monitoring, QoS info
+ // about the consumer, and an int that indicates whether (non-zero)
+ // or not (zero) we need to destroy the consumer in our destructor.
+
+ virtual ~TAO_Metrics_UpcallMonitorAdapter ();
+ // Virtual destructor: destroys actual consumer if it owns it.
+
+ RtecScheduler::Period_t get_period ();
+ // Get the current period for the adapter.
+
+ void set_period (RtecScheduler::Period_t period);
+ // Set the current period for the adapter.
+
+ void push (const RtecEventComm::EventSet & data,
+ CORBA::Environment &ACE_TRY_ENV =
+ CORBA::Environment::default_environment ());
+ // Do a monitored push to the actual PushConsumer for which we're a proxy
+
+ void disconnect_push_consumer (CORBA::Environment &ACE_TRY_ENV =
+ CORBA::Environment::default_environment ());
+ // Delegates to the actual PushConsumer for which we're a proxy
+
+protected:
+
+ // = Implementation members.
+
+ POA_Metrics::QoSMonitor & monitor_;
+ // A reference to the monitor to which we report.
+
+ TAO_Metrics_LocalCache<ACE_LOCK, ALLOCATOR> & cache_;
+ // A reference to the metrics data cache to which we report.
+
+ TAO_Metrics_FrameManager<ACE_LOCK> & frame_manager_;
+ // A reference to the frame manager we use.
+
+ POA_RtecEventComm::PushConsumer & consumer_;
+ // A reference to the actual PushConsumer for which we're a proxy
+
+ RtecScheduler::handle_t handle_;
+ // Handle of the operation we're wrapping.
+
+ RtecScheduler::Period_t period_;
+ // Current period for the adapter.
+
+ ACE_Time_Value execution_time_;
+ // Current execution time for the adapter.
+
+ int is_critical_;
+ // Whether or not the adapter is critical.
+
+ int adapter_owns_consumer_;
+ // indicates whether (non-zero) or not (zero) we need
+ // to destroy the consumer in our destructor.
+
+};
+
+template <class ACE_LOCK, class ALLOCATOR>
+class TAO_Metrics_ReportingUpcallMonitorAdapter
+ : public TAO_Metrics_UpcallMonitorAdapter <ACE_LOCK, ALLOCATOR>
+{
+ // = TITLE
+ // This class implements an adapter for monitoring QoS received by
+ // an event push consumer.
+ //
+ // = DESCRIPTION
+ // This class wraps the consumer event push upcall with time
+ // probe and monitor reporting calls.
+public:
+
+ TAO_Metrics_ReportingUpcallMonitorAdapter (
+ POA_Metrics::QoSMonitor & monitor,
+ TAO_Metrics_ReportingLocalCache<ACE_LOCK, ALLOCATOR> & cache,
+ TAO_Metrics_FrameManager<ACE_LOCK> & frame_manager,
+ POA_RtecEventComm::PushConsumer & consumer,
+ TAO::String_Manager entry_point,
+ RtecScheduler::handle_t handle,
+ RtecScheduler::Period_t period,
+ RtecScheduler::Time wcet,
+ RtecScheduler::Criticality_t criticality,
+ int adapter_owns_consumer = 1,
+ Metrics::QoSLogger_ptr logger = 0);
+ // Constructor that takes a reference to a logger object and
+ // info needed to construct or base class.
+
+protected:
+
+ // = Implementation members.
+
+ Metrics::QoSLogger_ptr logger_;
+ // A (possibly null) CORBA pointer to a logging object
+
+};
+
+TAO_END_VERSIONED_NAMESPACE_DECL
+
+#if defined (__ACE_INLINE__)
+#include "orbsvcs/Metrics/Metrics_UpcallMonitor_T.i"
+#endif /* __ACE_INLINE__ */
+
+#if defined (ACE_TEMPLATES_REQUIRE_SOURCE)
+#include "orbsvcs/Metrics/Metrics_UpcallMonitor_T.cpp"
+#endif /* ACE_TEMPLATES_REQUIRE_SOURCE */
+
+#if defined (ACE_TEMPLATES_REQUIRE_PRAGMA)
+#pragma implementation ("Metrics_UpcallMonitor_T.cpp")
+#endif /* ACE_TEMPLATES_REQUIRE_PRAGMA */
+
+#endif /* METRICS_UPCALL_MONITOR_T_H */
+
diff --git a/TAO/orbsvcs/orbsvcs/Metrics/Metrics_UpcallMonitor_T.i b/TAO/orbsvcs/orbsvcs/Metrics/Metrics_UpcallMonitor_T.i
new file mode 100644
index 00000000000..08b866de338
--- /dev/null
+++ b/TAO/orbsvcs/orbsvcs/Metrics/Metrics_UpcallMonitor_T.i
@@ -0,0 +1,263 @@
+// -*- C++ -*-
+//
+// $Id$
+
+// @METRICS@
+
+#ifndef METRICS_UPCALL_MONITOR_T_I
+#define METRICS_UPCALL_MONITOR_T_I
+
+//# if defined (METRICS_USES_OP_CANCELLATION)
+//# undef METRICS_USES_OP_CANCELLATION
+//# endif /* METRICS_USES_OP_CANCELLATION */
+
+# if ! defined (METRICS_USES_OP_CANCELLATION)
+# define METRICS_USES_OP_CANCELLATION
+# endif /* ! METRICS_USES_OP_CANCELLATION */
+
+
+TAO_BEGIN_VERSIONED_NAMESPACE_DECL
+
+////////////////////////////////////////////
+// class TAO_Metrics_UpcallMonitorAdapter //
+////////////////////////////////////////////
+
+
+// Constructor that takes a reference to the actual push consumer
+// we're monitoring and an int that indicates whether (non-zero) or
+// not (zero) we need to destroy the consumer in our destructor.
+
+template <class ACE_LOCK, class ALLOCATOR>
+ACE_INLINE
+TAO_Metrics_UpcallMonitorAdapter<ACE_LOCK, ALLOCATOR>::
+TAO_Metrics_UpcallMonitorAdapter (
+ POA_Metrics::QoSMonitor & monitor,
+ TAO_Metrics_LocalCache<ACE_LOCK, ALLOCATOR> &cache,
+ TAO_Metrics_FrameManager<ACE_LOCK> &frame_manager,
+ POA_RtecEventComm::PushConsumer & consumer,
+ TAO::String_Manager entry_point,
+ RtecScheduler::handle_t handle,
+ RtecScheduler::Period_t period,
+ RtecScheduler::Time wcet,
+ RtecScheduler::Criticality_t criticality,
+ int adapter_owns_consumer,
+ int cache_register)
+ : monitor_ (monitor),
+ cache_ (cache),
+ frame_manager_ (frame_manager),
+ consumer_ (consumer),
+ handle_ (handle),
+ period_ (period),
+ adapter_owns_consumer_ (adapter_owns_consumer)
+{
+//DCL:Added to remove Linux compile warning
+ ACE_UNUSED_ARG(entry_point);
+
+ // Ensure that the high res timer global scale factor
+ // is set before any of its static methods are used
+ ACE_High_Res_Timer::global_scale_factor ();
+
+ // Store the RT_Info execution time.
+ ORBSVCS_Time::TimeT_to_Time_Value(this->execution_time_,
+ wcet);
+ this->is_critical_ =
+ (criticality == RtecScheduler::HIGH_CRITICALITY
+ || criticality == RtecScheduler::VERY_HIGH_CRITICALITY)
+ ? 1 : 0;
+
+ // Use the type-preserving argument rather than the base class
+ // reference which is fine everywhere but here.
+ if (cache_register)
+ {
+ if (cache.metrics_enabled())
+ cache.register_upcall_adapter (this->handle_,
+ entry_point,
+ this->is_critical_);
+ }
+}
+
+
+// Get the current priod for the adapter.
+
+template <class ACE_LOCK, class ALLOCATOR>
+ACE_INLINE RtecScheduler::Period_t
+TAO_Metrics_UpcallMonitorAdapter<ACE_LOCK, ALLOCATOR>::
+get_period ()
+{
+ return this->period_;
+}
+
+
+// Set the current priod for the adapter.
+
+template <class ACE_LOCK, class ALLOCATOR>
+ACE_INLINE void
+TAO_Metrics_UpcallMonitorAdapter<ACE_LOCK, ALLOCATOR>::
+set_period (RtecScheduler::Period_t period)
+{
+ this->period_ = period;
+}
+
+
+// Do a monitored push to the actual PushConsumer for which we're a proxy
+template <class ACE_LOCK, class ALLOCATOR>
+ACE_INLINE void
+TAO_Metrics_UpcallMonitorAdapter<ACE_LOCK, ALLOCATOR>::
+push (const RtecEventComm::EventSet & data,
+ CORBA::Environment &ACE_TRY_ENV)
+{
+ // Save stamped deadline.
+ ACE_Time_Value deadline_tv;
+
+ // If we get an error, just set the deadline to zero, and possibly
+ // complain.
+ if (this->frame_manager_.get_end_time (this->period_, deadline_tv) < 0)
+ {
+ deadline_tv = ACE_Time_Value::zero;
+# if defined (METRICS_MONITOR_ERROR_OUTPUT_ENABLED)
+ ACE_ERROR ((LM_ERROR,
+ "TAO_Metrics_UpcallMonitorAdapter::push"
+ " get_end_time failed .\n"));
+# endif /* METRICS_MONITOR_ERROR_OUTPUT_ENABLED */
+ }
+
+# if defined (METRICS_USES_OP_CANCELLATION)
+
+ // Take current time stamp and add expected execution to get
+ // projected completion. Done this way for efficiency, to minimize
+ // temporaries and their copies and constructor and destructor calls.
+ ACE_Time_Value projected_tv;
+ ACE_hrtime_t hrtime_now = ACE_OS::gethrtime ();
+ ACE_High_Res_Timer::hrtime_to_tv (projected_tv,
+ hrtime_now);
+ projected_tv += this->execution_time_;
+
+ // Operation cancellation: uses WCET to determine whether or not
+ // deadline will be met. A critical operation (is_critical_) is
+ // dispatched unconditionally. A zero deadline indicates an
+ // operation is not deadline-bound and thus is not subject to
+ // cancellation.
+ if (this->is_critical_
+ || deadline_tv >= projected_tv
+ || deadline_tv == ACE_Time_Value::zero)
+ {
+# endif /* METRICS_USES_OP_CANCELLATION */
+
+ // Record the start of the upcall in the cache.
+#if 0
+ if ( this->handle_ != TAO_Metrics_Utils::timeoutEvent ())
+#endif /* 0 */
+ if (cache_.metrics_enabled())
+ cache_.report_upcall_start (this->handle_);
+
+ // Push to the actual consumer.
+ consumer_.push (data, ACE_TRY_ENV);
+ ACE_CHECK;
+
+ // Record the end of the upcall in the cache, and report whether
+ // the deadline was made or missed to the monitor.
+
+#if 0
+ if ( this->handle_ != TAO_Metrics_Utils::timeoutEvent ())
+ {
+#else /* 1 */
+ if (1)
+ {
+#endif /* 0 */
+ if (cache_.metrics_enabled())
+ {
+ int result = cache_.report_upcall_stop (this->handle_, deadline_tv);
+ if (result == 0)
+ {
+ monitor_.report_made_deadline (this->handle_, ACE_TRY_ENV);
+ ACE_CHECK;
+ }
+ else if (result == 1)
+ {
+ monitor_.report_missed_deadline (this->handle_, ACE_TRY_ENV);
+ ACE_CHECK;
+ }
+# if defined (METRICS_MONITOR_ERROR_OUTPUT_ENABLED)
+ else
+ {
+ ACE_ERROR ((LM_ERROR,
+ "TAO_Metrics_UpcallMonitorAdapter::push"
+ " upcall stop reporting failed .\n"));
+ }
+
+# endif /* METRICS_MONITOR_ERROR_OUTPUT_ENABLED */
+ }
+ }
+# if defined (METRICS_USES_OP_CANCELLATION)
+ }
+ else
+ {
+# if defined (METRICS_MONITOR_DEBUG_OUTPUT_ENABLED)
+ ACE_DEBUG ((LM_INFO,
+ "SRT Operation cancelled .\n"));
+# endif /* METRICS_MONITOR_DEBUG_OUTPUT_ENABLED */
+
+ if (cache_.metrics_enabled())
+ {
+ // The operation push was cancelled: report the cancellation to
+ // the cache and the missed deadline to the monitor.
+ cache_.report_upcall_cancellation (this->handle_);
+ monitor_.report_missed_deadline (this->handle_, ACE_TRY_ENV);
+ ACE_CHECK;
+ }
+ }
+
+# endif /* METRICS_USES_OP_CANCELLATION */
+}
+
+// Delegates to the actual PushConsumer for which we're a proxy.
+
+template <class ACE_LOCK, class ALLOCATOR>
+ACE_INLINE void
+TAO_Metrics_UpcallMonitorAdapter<ACE_LOCK, ALLOCATOR>::
+disconnect_push_consumer (CORBA::Environment &ACE_TRY_ENV)
+{
+ consumer_.disconnect_push_consumer (ACE_TRY_ENV);
+}
+
+
+template <class ACE_LOCK, class ALLOCATOR>
+ACE_INLINE
+TAO_Metrics_ReportingUpcallMonitorAdapter<ACE_LOCK, ALLOCATOR>::
+TAO_Metrics_ReportingUpcallMonitorAdapter (
+ POA_Metrics::QoSMonitor & monitor,
+ TAO_Metrics_ReportingLocalCache<ACE_LOCK, ALLOCATOR> &cache,
+ TAO_Metrics_FrameManager<ACE_LOCK> &frame_manager,
+ POA_RtecEventComm::PushConsumer & consumer,
+ TAO::String_Manager entry_point,
+ RtecScheduler::handle_t handle,
+ RtecScheduler::Period_t period,
+ RtecScheduler::Time wcet,
+ RtecScheduler::Criticality_t criticality,
+ int adapter_owns_consumer,
+ Metrics::QoSLogger_ptr logger)
+ : TAO_Metrics_UpcallMonitorAdapter<ACE_LOCK, ALLOCATOR>
+ (monitor,
+ cache,
+ frame_manager,
+ consumer,
+ entry_point,
+ handle,
+ period,
+ wcet,
+ criticality,
+ adapter_owns_consumer,
+ 0 /* don't register */),
+ logger_ (logger)
+{
+ // Use the type-preserving argument rather than the base class
+ // reference which is fine everywhere but here.
+ cache.register_upcall_adapter (this->handle_,
+ entry_point,
+ this->is_critical_,
+ this->logger_);
+}
+
+TAO_END_VERSIONED_NAMESPACE_DECL
+
+#endif /* METRICS_UPCALL_MONITOR_T_I */
diff --git a/TAO/orbsvcs/orbsvcs/Metrics/Metrics_Utils.cpp b/TAO/orbsvcs/orbsvcs/Metrics/Metrics_Utils.cpp
new file mode 100644
index 00000000000..99c51fe77b7
--- /dev/null
+++ b/TAO/orbsvcs/orbsvcs/Metrics/Metrics_Utils.cpp
@@ -0,0 +1,534 @@
+// $Id$
+
+#ifndef METRICS_UTILS_CPP
+#define METRICS_UTILS_CPP
+
+#if defined (ACE_METRICS_COLLECTION)
+
+#if defined (ACE_ENABLE_TIMEPROBES) && defined (ACE_COMPILE_TIMEPROBES)
+
+
+#include "ace/Metrics_Cache.h"
+#include "orbsvcs/Metrics/Metrics_Utils.h"
+#include "orbsvcs/Metrics/Metrics_LocalCache.h"
+
+TAO_BEGIN_VERSIONED_NAMESPACE_DECL
+
+/////////////////////////////
+// Class TAO_Metrics_Utils //
+/////////////////////////////
+
+// Static constants
+
+const u_int WSOA_Metrics_Handles::WSOA_METRICS_MAX_TILING_FACTOR = 64;
+
+const u_int TAO_Metrics_Utils::METRICS_BUFSIZE = 64;
+
+const u_int TAO_Metrics_Utils::METRICS_ENQUEUE_PROBE_ID_BASE = 0;
+const u_int TAO_Metrics_Utils::METRICS_DEQUEUE_PROBE_ID_BASE = 1000;
+const u_int TAO_Metrics_Utils::METRICS_SCHED_PROBE_ID_BASE = 2000;
+const u_int TAO_Metrics_Utils::METRICS_QUO_PROBE_ID_BASE = 3000;
+const u_int TAO_Metrics_Utils::METRICS_RTARM_PROBE_ID_BASE = 4000;
+const u_int TAO_Metrics_Utils::METRICS_TNS_PROBE_ID_BASE = 5000;
+const u_int TAO_Metrics_Utils::METRICS_TEEC_PROBE_ID_BASE = 6000;
+const u_int TAO_Metrics_Utils::METRICS_UPCALL_MONITOR_ADAPTER_ID_BASE = 7000;
+
+// Static variable
+
+RtecScheduler::handle_t TAO_Metrics_Utils::timeoutEvent_ = 72;
+
+
+
+// Static method to set the mission state in the logger.
+
+void
+TAO_Metrics_Utils::set_mission_state (int i, Metrics::QoSLogger_ptr logger)
+{
+ if (CORBA::is_nil (logger))
+ {
+#if defined (METRICS_UTILS_ERROR_OUTPUT_ENABLED)
+ ACE_ERROR ((LM_ERROR,
+ "TAO_Metrics_Utils::set_mission_state:\n"
+ "Logger IOR reference is nil.\n"));
+#endif
+ return;
+ }
+
+ char banner [TAO_Metrics_Utils::METRICS_BUFSIZE];
+ ACE_OS::memset (banner, 0, TAO_Metrics_Utils::METRICS_BUFSIZE);
+ ACE_OS::sprintf (banner, "\n\n*** Mission State %d ***\n\n", i);
+
+ ACE_TRY_NEW_ENV
+ {
+ logger->send_banner (banner
+ ACE_ENV_ARG_DECL);
+ ACE_TRY_CHECK;
+ }
+ ACE_CATCHANY
+ {
+#if defined (METRICS_UTILS_ERROR_OUTPUT_ENABLED)
+ ACE_PRINT_EXCEPTION (ACE_ANY_EXCEPTION,
+ "TAO_Metrics_LocalCache::set_mission_state:"
+ " logger call failed\n");
+#endif
+ }
+ ACE_ENDTRY;
+}
+
+// Sets the logger reference.
+
+Metrics::QoSLogger_var
+TAO_Metrics_Utils::get_logger (const char * logger_ior_str,
+ CORBA::ORB_ptr orb)
+{
+ Metrics::QoSLogger_var logger;
+ if (logger_ior_str && orb)
+ {
+ ACE_TRY_NEW_ENV
+ {
+ CORBA::Object_var obj =
+ orb->string_to_object (logger_ior_str);
+ ACE_TRY_CHECK;
+
+ if (CORBA::is_nil (obj.in ()))
+ {
+#if defined (METRICS_UTILS_ERROR_OUTPUT_ENABLED)
+ ACE_ERROR ((LM_ERROR,
+ "TAO_Metrics_Utils::get_logger:\n"
+ "Logger IOR string produced a "
+ "nil reference:\n[%s]",
+ logger_ior_str));
+#endif
+ return logger;
+ }
+ else
+ {
+ logger = Metrics::QoSLogger::_narrow (obj.in ());
+ ACE_TRY_CHECK;
+
+ if (CORBA::is_nil (logger.in ()))
+ {
+#if defined (METRICS_UTILS_ERROR_OUTPUT_ENABLED)
+ ACE_ERROR ((LM_ERROR,
+ "TAO_Metrics_LocalCache::set_logger:\n"
+ "Could not narrow IOR to logger:\n[%s]",
+ logger_ior_str));
+#endif
+ return logger;
+ }
+ }
+ }
+ ACE_CATCHANY
+ {
+#if defined (METRICS_UTILS_ERROR_OUTPUT_ENABLED)
+ ACE_PRINT_EXCEPTION (ACE_ANY_EXCEPTION,
+ "TAO_Metrics_LocalCache::set_logger exception");
+#endif
+ return logger;
+ }
+ ACE_ENDTRY;
+ }
+#if defined (METRICS_UTILS_ERROR_OUTPUT_ENABLED)
+ else
+ {
+ ACE_ERROR ((LM_ERROR,
+ "TAO_Metrics_LocalCache::set_logger:\n"
+ "must pass a non-zero orb and ior pointer\n"));
+ }
+#endif
+ return logger;
+}
+
+
+////////////////////////////////
+// class WSOA_Metrics_Handles //
+////////////////////////////////
+
+// Default constructor - registers all WSOA METRICS INSTRUMENTATION handles.
+
+WSOA_Metrics_Handles::WSOA_Metrics_Handles ()
+ : tiles_requested_ (0)
+ , compute_metrics_handle_(0)
+ , RTARM_triggered_adaptation_metrics_handle_(0)
+ , RTARM_region_transition_metrics_handle_(0)
+ , QuO_contract_eval_metrics_handle_(0)
+ , tile_request_delegate_metrics_handle_(0)
+ , image_received_metrics_handle_(0)
+ , image_processed_metrics_handle_(0)
+ , image_quiescent_metrics_handle_(0)
+ , tile_received_first_metrics_handle_(0)
+ , tile_queuing_first_metrics_handle_(0)
+ , tile_decompression_first_metrics_handle_(0)
+ , tile_decompression_handle_(0)
+ , tile_ipm_first_metrics_handle_(0)
+ , tile_processed_first_metrics_handle_(0)
+ , zlib_compression_handle_(0)
+ , zlib_decompression_handle_(0)
+{
+#ifdef TAO_USES_REPORTING_METRICS
+ REGISTER_METRICS_REPORTING_PROBE_RETURN(TAO_METRICS_REPORTING_CACHE_SINGLETON_TYPE::instance(),
+ base_metrics,
+ "TAO_compute_scheduling",
+ TAO_Metrics_Utils::SCHED,
+ *TAO_METRICS_LOGGER_REF_SINGLETON::instance(),
+ this->compute_metrics_handle_);
+
+ REGISTER_METRICS_REPORTING_PROBE_RETURN(TAO_METRICS_REPORTING_CACHE_SINGLETON_TYPE::instance(),
+ base_metrics,
+ "RTARM_triggered_adaptation",
+ TAO_Metrics_Utils::RTARM,
+ *TAO_METRICS_LOGGER_REF_SINGLETON::instance(),
+ this->RTARM_triggered_adaptation_metrics_handle_);
+
+ REGISTER_METRICS_REPORTING_PROBE_RETURN(TAO_METRICS_REPORTING_CACHE_SINGLETON_TYPE::instance(),
+ base_metrics,
+ "RTARM_region_transition",
+ TAO_Metrics_Utils::RTARM,
+ *TAO_METRICS_LOGGER_REF_SINGLETON::instance(),
+ this->RTARM_region_transition_metrics_handle_);
+
+ REGISTER_METRICS_REPORTING_PROBE_RETURN(TAO_METRICS_REPORTING_CACHE_SINGLETON_TYPE::instance(),
+ base_metrics,
+ "QuO_contract_eval",
+ TAO_Metrics_Utils::QUO,
+ *TAO_METRICS_LOGGER_REF_SINGLETON::instance(),
+ this->QuO_contract_eval_metrics_handle_);
+
+ REGISTER_METRICS_REPORTING_PROBE_RETURN(TAO_METRICS_REPORTING_CACHE_SINGLETON_TYPE::instance(),
+ base_metrics,
+ "tile_request_delegate",
+ TAO_Metrics_Utils::QUO,
+ *TAO_METRICS_LOGGER_REF_SINGLETON::instance(),
+ this->tile_request_delegate_metrics_handle_);
+
+ REGISTER_METRICS_REPORTING_PROBE_RETURN(TAO_METRICS_REPORTING_CACHE_SINGLETON_TYPE::instance(),
+ base_metrics,
+ "image_received",
+ TAO_Metrics_Utils::QUO,
+ *TAO_METRICS_LOGGER_REF_SINGLETON::instance(),
+ this->image_received_metrics_handle_);
+
+ REGISTER_METRICS_REPORTING_PROBE_RETURN(TAO_METRICS_REPORTING_CACHE_SINGLETON_TYPE::instance(),
+ base_metrics,
+ "image_processed",
+ TAO_Metrics_Utils::QUO,
+ *TAO_METRICS_LOGGER_REF_SINGLETON::instance(),
+ this->image_processed_metrics_handle_);
+
+ REGISTER_METRICS_REPORTING_PROBE_RETURN(TAO_METRICS_REPORTING_CACHE_SINGLETON_TYPE::instance(),
+ base_metrics,
+ "image_quiescent",
+ TAO_Metrics_Utils::QUO,
+ *TAO_METRICS_LOGGER_REF_SINGLETON::instance(),
+ this->image_quiescent_metrics_handle_);
+
+ char registration_name[64];
+ u_int i;
+
+ // Store the first tile received handle, and make room for the others.
+ REGISTER_METRICS_REPORTING_PROBE_RETURN(TAO_METRICS_REPORTING_CACHE_SINGLETON_TYPE::instance(),
+ base_metrics,
+ "tile_received_0",
+ TAO_Metrics_Utils::QUO,
+ *TAO_METRICS_LOGGER_REF_SINGLETON::instance(),
+ this->tile_received_first_metrics_handle_);
+
+ RtecScheduler::handle_t temp_metrics_handle = 0;
+ for (i = 1; i <= WSOA_METRICS_MAX_TILING_FACTOR; ++i)
+ {
+ ::sprintf (registration_name, "tile_received_%d", i);
+
+ // We just throw the handles away rather than storing them,
+ // as they're always calculated by offset from the first.
+ REGISTER_METRICS_REPORTING_PROBE_RETURN(TAO_METRICS_REPORTING_CACHE_SINGLETON_TYPE::instance(),
+ base_metrics,
+ registration_name,
+ TAO_Metrics_Utils::QUO,
+ *TAO_METRICS_LOGGER_REF_SINGLETON::instance(),
+ temp_metrics_handle);
+ }
+
+ // Store the first tile processed handle, and make room for the others.
+ REGISTER_METRICS_REPORTING_PROBE_RETURN(TAO_METRICS_REPORTING_CACHE_SINGLETON_TYPE::instance(),
+ base_metrics,
+ "tile_processed_0",
+ TAO_Metrics_Utils::QUO,
+ *TAO_METRICS_LOGGER_REF_SINGLETON::instance(),
+ this->tile_processed_first_metrics_handle_);
+
+ for (i = 1; i <= WSOA_METRICS_MAX_TILING_FACTOR; ++i)
+ {
+ ::sprintf (registration_name, "tile_processed_%d", i);
+
+ // We just throw the handles away rather than storing them,
+ // as they're always calculated by offset from the first.
+ REGISTER_METRICS_REPORTING_PROBE_RETURN(TAO_METRICS_REPORTING_CACHE_SINGLETON_TYPE::instance(),
+ base_metrics,
+ registration_name,
+ TAO_Metrics_Utils::QUO,
+ *TAO_METRICS_LOGGER_REF_SINGLETON::instance(),
+ temp_metrics_handle);
+ }
+
+ // Store the first tile processed handle, and make room for the others.
+ REGISTER_METRICS_REPORTING_PROBE_RETURN(TAO_METRICS_REPORTING_CACHE_SINGLETON_TYPE::instance(),
+ base_metrics,
+ "tile_queuing_0",
+ TAO_Metrics_Utils::QUO,
+ *TAO_METRICS_LOGGER_REF_SINGLETON::instance(),
+ this->tile_queuing_first_metrics_handle_);
+
+ for (i = 1; i <= WSOA_METRICS_MAX_TILING_FACTOR; ++i)
+ {
+ ::sprintf (registration_name, "tile_queuing_%d", i);
+
+ // We just throw the handles away rather than storing them,
+ // as they're always calculated by offset from the first.
+ REGISTER_METRICS_REPORTING_PROBE_RETURN(TAO_METRICS_REPORTING_CACHE_SINGLETON_TYPE::instance(),
+ base_metrics,
+ registration_name,
+ TAO_Metrics_Utils::QUO,
+ *TAO_METRICS_LOGGER_REF_SINGLETON::instance(),
+ temp_metrics_handle);
+ }
+
+ // Store the first tile processed handle, and make room for the others.
+ REGISTER_METRICS_REPORTING_PROBE_RETURN(TAO_METRICS_REPORTING_CACHE_SINGLETON_TYPE::instance(),
+ base_metrics,
+ "tile_decompression_0",
+ TAO_Metrics_Utils::QUO,
+ *TAO_METRICS_LOGGER_REF_SINGLETON::instance(),
+ this->tile_decompression_first_metrics_handle_);
+
+ for (i = 1; i <= WSOA_METRICS_MAX_TILING_FACTOR; ++i)
+ {
+ ::sprintf (registration_name, "tile_decompression_%d", i);
+
+ // We just throw the handles away rather than storing them,
+ // as they're always calculated by offset from the first.
+ REGISTER_METRICS_REPORTING_PROBE_RETURN(TAO_METRICS_REPORTING_CACHE_SINGLETON_TYPE::instance(),
+ base_metrics,
+ registration_name,
+ TAO_Metrics_Utils::QUO,
+ *TAO_METRICS_LOGGER_REF_SINGLETON::instance(),
+ temp_metrics_handle);
+ }
+
+ REGISTER_METRICS_REPORTING_PROBE_RETURN(TAO_METRICS_REPORTING_CACHE_SINGLETON_TYPE::instance(),
+ base_metrics,
+ "tile_ipm_0",
+ TAO_Metrics_Utils::QUO,
+ *TAO_METRICS_LOGGER_REF_SINGLETON::instance(),
+ this->tile_ipm_first_metrics_handle_);
+
+ for (i = 1; i <= WSOA_METRICS_MAX_TILING_FACTOR; ++i)
+ {
+ ::sprintf (registration_name, "tile_ipm_%d", i);
+
+ // We just throw the handles away rather than storing them,
+ // as they're always calculated by offset from the first.
+ REGISTER_METRICS_REPORTING_PROBE_RETURN(TAO_METRICS_REPORTING_CACHE_SINGLETON_TYPE::instance(),
+ base_metrics,
+ registration_name,
+ TAO_Metrics_Utils::QUO,
+ *TAO_METRICS_LOGGER_REF_SINGLETON::instance(),
+ temp_metrics_handle);
+ }
+
+ REGISTER_METRICS_REPORTING_PROBE_RETURN(TAO_METRICS_REPORTING_CACHE_SINGLETON_TYPE::instance(),
+ base_metrics,
+ "zlib Compression",
+ TAO_Metrics_Utils::SCHED,
+ *TAO_METRICS_LOGGER_REF_SINGLETON::instance(),
+ this->zlib_compression_handle_);
+
+ REGISTER_METRICS_REPORTING_PROBE_RETURN(TAO_METRICS_REPORTING_CACHE_SINGLETON_TYPE::instance(),
+ base_metrics,
+ "zlib Compression",
+ TAO_Metrics_Utils::SCHED,
+ *TAO_METRICS_LOGGER_REF_SINGLETON::instance(),
+ this->zlib_decompression_handle_);
+#else /* ! TAO_USES_REPORTING_METRICS */
+ REGISTER_METRICS_PROBE_RETURN(TAO_METRICS_CACHE_SINGLETON_TYPE::instance(),
+ base_metrics,
+ "TAO_compute_scheduling",
+ TAO_Metrics_Utils::SCHED,
+ this->compute_metrics_handle_);
+
+ REGISTER_METRICS_PROBE_RETURN(TAO_METRICS_CACHE_SINGLETON_TYPE::instance(),
+ base_metrics,
+ "RTARM_triggered_adaptation",
+ TAO_Metrics_Utils::RTARM,
+ this->RTARM_triggered_adaptation_metrics_handle_);
+
+ REGISTER_METRICS_PROBE_RETURN(TAO_METRICS_CACHE_SINGLETON_TYPE::instance(),
+ base_metrics,
+ "RTARM_region_transition",
+ TAO_Metrics_Utils::RTARM,
+ this->RTARM_region_transition_metrics_handle_);
+
+ REGISTER_METRICS_PROBE_RETURN(TAO_METRICS_CACHE_SINGLETON_TYPE::instance(),
+ base_metrics,
+ "QuO_contract_eval",
+ TAO_Metrics_Utils::QUO,
+ this->QuO_contract_eval_metrics_handle_);
+
+ REGISTER_METRICS_PROBE_RETURN(TAO_METRICS_CACHE_SINGLETON_TYPE::instance(),
+ base_metrics,
+ "tile_request_delegate",
+ TAO_Metrics_Utils::QUO,
+ this->tile_request_delegate_metrics_handle_);
+
+ REGISTER_METRICS_PROBE_RETURN(TAO_METRICS_CACHE_SINGLETON_TYPE::instance(),
+ base_metrics,
+ "image_received",
+ TAO_Metrics_Utils::QUO,
+ this->image_received_metrics_handle_);
+
+ REGISTER_METRICS_PROBE_RETURN(TAO_METRICS_CACHE_SINGLETON_TYPE::instance(),
+ base_metrics,
+ "image_processed",
+ TAO_Metrics_Utils::QUO,
+ this->image_processed_metrics_handle_);
+
+ REGISTER_METRICS_PROBE_RETURN(TAO_METRICS_CACHE_SINGLETON_TYPE::instance(),
+ base_metrics,
+ "image_quiescent",
+ TAO_Metrics_Utils::QUO,
+ this->image_quiescent_metrics_handle_);
+
+ char registration_name[64];
+ u_int i;
+
+ // Store the first tile received handle, and make room for the others.
+ REGISTER_METRICS_PROBE_RETURN(TAO_METRICS_CACHE_SINGLETON_TYPE::instance(),
+ base_metrics,
+ "tile_received_0",
+ TAO_Metrics_Utils::QUO,
+ this->tile_received_first_metrics_handle_);
+
+ RtecScheduler::handle_t temp_metrics_handle;
+ for (i = 1; i <= WSOA_METRICS_MAX_TILING_FACTOR; ++i)
+ {
+ ::sprintf (registration_name, "tile_received_%d", i);
+
+ // We just throw the handles away rather than storing them,
+ // as they're always calculated by offset from the first.
+ REGISTER_METRICS_PROBE_RETURN(TAO_METRICS_CACHE_SINGLETON_TYPE::instance(),
+ base_metrics,
+ registration_name,
+ TAO_Metrics_Utils::QUO,
+ temp_metrics_handle);
+ }
+
+ // Store the first tile processed handle, and make room for the others.
+ REGISTER_METRICS_PROBE_RETURN(TAO_METRICS_CACHE_SINGLETON_TYPE::instance(),
+ base_metrics,
+ "tile_processed_0",
+ TAO_Metrics_Utils::QUO,
+ this->tile_processed_first_metrics_handle_);
+
+ for (i = 1; i <= WSOA_METRICS_MAX_TILING_FACTOR; ++i)
+ {
+ ::sprintf (registration_name, "tile_processed_%d", i);
+
+ // We just throw the handles away rather than storing them,
+ // as they're always calculated by offset from the first.
+ REGISTER_METRICS_PROBE_RETURN(TAO_METRICS_CACHE_SINGLETON_TYPE::instance(),
+ base_metrics,
+ registration_name,
+ TAO_Metrics_Utils::QUO,
+ temp_metrics_handle);
+ }
+
+ // Store the first tile processed handle, and make room for the others.
+ REGISTER_METRICS_PROBE_RETURN(TAO_METRICS_CACHE_SINGLETON_TYPE::instance(),
+ base_metrics,
+ "tile_queuing_0",
+ TAO_Metrics_Utils::QUO,
+ this->tile_queuing_first_metrics_handle_);
+
+ for (i = 1; i <= WSOA_METRICS_MAX_TILING_FACTOR; ++i)
+ {
+ ::sprintf (registration_name, "tile_queuing_%d", i);
+
+ // We just throw the handles away rather than storing them,
+ // as they're always calculated by offset from the first.
+ REGISTER_METRICS_PROBE_RETURN(TAO_METRICS_CACHE_SINGLETON_TYPE::instance(),
+ base_metrics,
+ registration_name,
+ TAO_Metrics_Utils::QUO,
+ temp_metrics_handle);
+ }
+
+ // Store the first tile processed handle, and make room for the others.
+ REGISTER_METRICS_PROBE_RETURN(TAO_METRICS_CACHE_SINGLETON_TYPE::instance(),
+ base_metrics,
+ "tile_decompression_0",
+ TAO_Metrics_Utils::QUO,
+ this->tile_decompression_first_metrics_handle_);
+
+ for (i = 1; i <= WSOA_METRICS_MAX_TILING_FACTOR; ++i)
+ {
+ ::sprintf (registration_name, "tile_decompression_%d", i);
+
+ // We just throw the handles away rather than storing them,
+ // as they're always calculated by offset from the first.
+ REGISTER_METRICS_PROBE_RETURN(TAO_METRICS_CACHE_SINGLETON_TYPE::instance(),
+ base_metrics,
+ registration_name,
+ TAO_Metrics_Utils::QUO,
+ temp_metrics_handle);
+ }
+
+ REGISTER_METRICS_PROBE_RETURN(TAO_METRICS_CACHE_SINGLETON_TYPE::instance(),
+ base_metrics,
+ "tile_ipm_0",
+ TAO_Metrics_Utils::QUO,
+ this->tile_ipm_first_metrics_handle_);
+
+ for (i = 1; i <= WSOA_METRICS_MAX_TILING_FACTOR; ++i)
+ {
+ ::sprintf (registration_name, "tile_ipm_%d", i);
+
+ // We just throw the handles away rather than storing them,
+ // as they're always calculated by offset from the first.
+ REGISTER_METRICS_PROBE_RETURN(TAO_METRICS_CACHE_SINGLETON_TYPE::instance(),
+ base_metrics,
+ registration_name,
+ TAO_Metrics_Utils::QUO,
+ temp_metrics_handle);
+
+ REGISTER_METRICS_PROBE_RETURN(TAO_METRICS_CACHE_SINGLETON_TYPE::instance(),
+ base_metrics,
+ registration_name,
+ TAO_Metrics_Utils::QUO,
+ tile_decompression_handle_);
+ }
+
+ REGISTER_METRICS_PROBE_RETURN(TAO_METRICS_CACHE_SINGLETON_TYPE::instance(),
+ base_metrics,
+ "zlib Compression",
+ TAO_Metrics_Utils::SCHED,
+ this->zlib_compression_handle_);
+
+ REGISTER_METRICS_PROBE_RETURN(TAO_METRICS_CACHE_SINGLETON_TYPE::instance(),
+ base_metrics,
+ "zlib Compression",
+ TAO_Metrics_Utils::SCHED,
+ this->zlib_decompression_handle_);
+#endif /* TAO_USES_REPORTING_METRICS */
+}
+
+TAO_END_VERSIONED_NAMESPACE_DECL
+
+#if !defined (__ACE_INLINE__)
+#include "orbsvcs/Metrics/Metrics_Utils.i"
+#endif /* __ACE_INLINE__ */
+
+#else
+#error ACE_COMPILE_TIMEPROBES must be defined in order to collect metrics
+#endif /* ACE_ENABLE_TIMEPROBES & ACE_COMPILE_TIMEPROBES */
+#endif /* ACE_METRICS_COLLECTION */
+
+#endif /* METRICS_UTILS_CPP */
diff --git a/TAO/orbsvcs/orbsvcs/Metrics/Metrics_Utils.h b/TAO/orbsvcs/orbsvcs/Metrics/Metrics_Utils.h
new file mode 100644
index 00000000000..5e0e0ebd36d
--- /dev/null
+++ b/TAO/orbsvcs/orbsvcs/Metrics/Metrics_Utils.h
@@ -0,0 +1,187 @@
+// -*- C++ -*-
+
+// $Id$
+
+#ifndef METRICS_UTILS_H
+#define METRICS_UTILS_H
+
+
+#if defined (ACE_METRICS_COLLECTION)
+
+#if defined (ACE_ENABLE_TIMEPROBES) && defined (ACE_COMPILE_TIMEPROBES)
+
+#if ! defined (VXWORKS)
+
+// Comment out both of these to disable output
+# define METRICS_UTILS_ERROR_OUTPUT_ENABLED
+# define METRICS_UTILS_DEBUG_OUTPUT_ENABLED
+
+#endif /* ! VXWORKS */
+
+#include "ace/OS.h"
+#include "ace/Singleton.h"
+#include "orbsvcs/RtecSchedulerC.h"
+#include "orbsvcs/MetricsC.h"
+#include "orbsvcs/Metrics/metrics_export.h"
+
+#if !defined (ACE_LACKS_PRAGMA_ONCE)
+# pragma once
+#endif /* ACE_LACKS_PRAGMA_ONCE */
+
+TAO_BEGIN_VERSIONED_NAMESPACE_DECL
+
+class TAO_Metrics_Export TAO_Metrics_Utils
+{
+ // = TITLE
+ // Defines a class for various metrics utility functions.
+ //
+ // = DESCRIPTION
+ // This class provides static methods for various general
+ // purpose tasks for managing and using the metrics framework.
+
+public:
+
+ // Type declarations
+
+ enum Base_Metrics_Type {SCHED, QUO, RTARM, TNS, TEEC};
+
+ static const u_int METRICS_BUFSIZE;
+ // Constant size for local buffers.
+
+ static const u_int METRICS_ENQUEUE_PROBE_ID_BASE;
+ static const u_int METRICS_DEQUEUE_PROBE_ID_BASE;
+ static const u_int METRICS_SCHED_PROBE_ID_BASE;
+ static const u_int METRICS_QUO_PROBE_ID_BASE;
+ static const u_int METRICS_TNS_PROBE_ID_BASE;
+ static const u_int METRICS_TEEC_PROBE_ID_BASE;
+ static const u_int METRICS_RTARM_PROBE_ID_BASE;
+ static const u_int METRICS_UPCALL_MONITOR_ADAPTER_ID_BASE;
+ // Constants for offsets into ranges of probe ids.
+
+ static void set_mission_state (int i, Metrics::QoSLogger_ptr logger);
+ // Sets the mission state in the logger referenced by the passed pointer.
+
+ static void set_mission_state (int i, const char * logger_ior_str);
+ // Sets the mission state in the logger referenced by the passed ior string.
+
+ static Metrics::QoSLogger_var get_logger (const char * logger_ior_str,
+ CORBA::ORB_ptr orb_);
+ // Gets a pointer to a logger from the passed logger ior string,
+ // using the passed ORB.
+
+ static RtecScheduler::handle_t timeoutEvent (void);
+ // Accessor for static timeout event handle. This handle is ignored
+ // by the QoS monitor, since by definition it will be dispatched
+ // after the end-of-frame.
+
+ static void timeoutEvent (RtecScheduler::handle_t handle);
+ // Mutator for static timeout event handle. This handle is ignored
+ // by the QoS monitor, since by definition it will be dispatched
+ // after the end-of-frame.
+
+private:
+
+ static RtecScheduler::handle_t timeoutEvent_;
+};
+
+
+struct TAO_Metrics_Export WSOA_Metrics_Handles
+{
+ // = TITLE
+ // Defines a helper class for WSOA METRICS INSTRUMENTATION.
+ //
+ // = DESCRIPTION
+ // This class provides a single point of initialization (registration)
+ // and storage for the handles used in WSOA metrics collection. It is necessary
+ // to define this class at this level to cross-cut multiple layers of the
+ // architecture and provide consistent points of instrumentation across layers.
+
+public:
+
+ WSOA_Metrics_Handles ();
+ // Default constructor - registers all handles.
+
+ // number of tile handles to reserve in each category.
+ static const u_int WSOA_METRICS_MAX_TILING_FACTOR;
+
+ // global attribute to decide when image is downloaded.
+ u_long tiles_requested_;
+
+ // Globally accessible handles for METRICS INSTRUMENTATION
+ RtecScheduler::handle_t compute_metrics_handle_;
+ RtecScheduler::handle_t RTARM_triggered_adaptation_metrics_handle_;
+ RtecScheduler::handle_t RTARM_region_transition_metrics_handle_;
+ RtecScheduler::handle_t QuO_contract_eval_metrics_handle_;
+ RtecScheduler::handle_t tile_request_delegate_metrics_handle_;
+ RtecScheduler::handle_t image_received_metrics_handle_;
+ RtecScheduler::handle_t image_processed_metrics_handle_;
+ RtecScheduler::handle_t image_quiescent_metrics_handle_;
+ RtecScheduler::handle_t tile_received_first_metrics_handle_;
+ RtecScheduler::handle_t tile_queuing_first_metrics_handle_;
+ RtecScheduler::handle_t tile_decompression_first_metrics_handle_;
+ RtecScheduler::handle_t tile_decompression_handle_;
+ RtecScheduler::handle_t tile_ipm_first_metrics_handle_;
+ RtecScheduler::handle_t tile_processed_first_metrics_handle_;
+
+ RtecScheduler::handle_t zlib_compression_handle_;
+ RtecScheduler::handle_t zlib_decompression_handle_;
+};
+
+typedef ACE_Singleton<WSOA_Metrics_Handles, ACE_SYNCH_MUTEX>
+WSOA_METRICS_HANDLES_SINGLETON;
+
+/**
+ * NOTE: This is a simple macro which calls the appropriate registration function with the cache to
+ * store the data from this pointer. At the ACE level there is no need to give a PROBE_TYPE
+ * because there is only one probe type (ACE_Timeprobe).
+ *
+ * USAGE_LEVEL: TAO
+ *
+ * Q1: Where is this and the next macro used? One example is on TAO/orbsvcs/orbsvcs/Metrics. No where in the ace code.
+ * So is this a ACE or TAO macro?
+ *
+ * Q2: Is the function (register + METRICS_REGION) a ACE or TAO?
+ * A2: TAO. Define in Metrics_Local_Cache_T.h. The only METRICS_REGION that exists is 'base_metrics'. Used
+ * in $TAO_ROOT/orbsvcs/orbsvcs/Metrics/Metrics_Utils.cpp
+ *
+ * @param METRICS_PTR - Initialized pointer to the Metrics_Cache. This pointer is used to register the probe
+ * with the associated cache.
+ * @param METIRCS_REGION - At present there is only one 'base_metrics'.
+ * @param PROBE_NAME - String name of the probe
+ * @param PROBE_TYPE - Unsigned integer representing the probe type
+ * @param METRICS_HANDLE - Variable used to contain the metrics probe handle that is the result of this function
+ * The type of the handle is a RtecScheduler::handle_t
+ */
+# define REGISTER_METRICS_PROBE_RETURN(METRICS_PTR,METRICS_REGION,PROBE_NAME,PROBE_TYPE,METRICS_HANDLE) \
+do { if((METRICS_PTR->metrics_enabled())) { \
+METRICS_HANDLE = METRICS_PTR-> \
+register_##METRICS_REGION ( \
+PROBE_NAME, \
+PROBE_TYPE); \
+} } while (0)
+
+/**
+ * Same as above but instead of just reporting information to a cache there is also reference to a Metrics_Loger (TAO feature).
+ * The logger is used to record the information. The type of probe is register with the logger
+ *
+ * USAGE_LEVEL: TAO
+ */
+# define REGISTER_METRICS_REPORTING_PROBE_RETURN(METRICS_PTR,METRICS_REGION,PROBE_NAME,PROBE_TYPE,METRICS_LOGGER_REF,METRICS_HANDLE) \
+do { if((METRICS_PTR->metrics_enabled())) { \
+METRICS_HANDLE = METRICS_PTR-> \
+register_##METRICS_REGION## ( \
+PROBE_NAME, \
+PROBE_TYPE, \
+METRICS_LOGGER_REF); \
+} } while (0)
+
+TAO_END_VERSIONED_NAMESPACE_DECL
+
+#if defined (__ACE_INLINE__)
+#include "orbsvcs/Metrics/Metrics_Utils.i"
+#endif /* __ACE_INLINE__ */
+
+#endif /* ACE_ENABLE_TIMEPROBES & ACE_COMPILE_TIMEPROBES */
+#endif /* ACE_METRICS_COLLECTION */
+
+#endif /* METRICS_UTILS_H */
diff --git a/TAO/orbsvcs/orbsvcs/Metrics/Metrics_Utils.i b/TAO/orbsvcs/orbsvcs/Metrics/Metrics_Utils.i
new file mode 100644
index 00000000000..04a77bddb52
--- /dev/null
+++ b/TAO/orbsvcs/orbsvcs/Metrics/Metrics_Utils.i
@@ -0,0 +1,39 @@
+// -*- C++ -*-
+//
+// $Id$
+
+#ifndef METRICS_UTILS_I
+#define METRICS_UTILS_I
+
+TAO_BEGIN_VERSIONED_NAMESPACE_DECL
+
+/////////////////////////////
+// Class TAO_Metrics_Utils //
+/////////////////////////////
+
+// Accessor for static timeout event handle. This handle is ignored
+// by the QoS monitor, since by definition it will be dispatched
+// after the end-of-frame.
+
+ACE_INLINE
+RtecScheduler::handle_t
+TAO_Metrics_Utils::timeoutEvent (void)
+{
+ return TAO_Metrics_Utils::timeoutEvent_;
+}
+
+
+// Mutator for static timeout event handle. This handle is ignored
+// by the QoS monitor, since by definition it will be dispatched
+// after the end-of-frame.
+
+ACE_INLINE
+void
+TAO_Metrics_Utils::timeoutEvent (RtecScheduler::handle_t handle)
+{
+ TAO_Metrics_Utils::timeoutEvent_ = handle;
+}
+
+TAO_END_VERSIONED_NAMESPACE_DECL
+
+#endif /* METRICS_UTILS_I */
diff --git a/TAO/orbsvcs/orbsvcs/Metrics/metrics_export.h b/TAO/orbsvcs/orbsvcs/Metrics/metrics_export.h
new file mode 100644
index 00000000000..846c6c45427
--- /dev/null
+++ b/TAO/orbsvcs/orbsvcs/Metrics/metrics_export.h
@@ -0,0 +1,50 @@
+
+// -*- C++ -*-
+// $Id$
+// Definition for Win32 Export directives.
+// This file is generated automatically by generate_export_file.pl TAO_Metrics
+// ------------------------------
+#ifndef TAO_METRICS_EXPORT_H
+#define TAO_METRICS_EXPORT_H
+
+#include "ace/config-all.h"
+
+#if !defined (TAO_METRICS_HAS_DLL)
+# define TAO_METRICS_HAS_DLL 1
+#endif /* ! TAO_METRICS_HAS_DLL */
+
+#if defined (TAO_METRICS_HAS_DLL) && (TAO_METRICS_HAS_DLL == 1)
+# if defined (TAO_METRICS_BUILD_DLL)
+# define TAO_Metrics_Export ACE_Proper_Export_Flag
+# define TAO_METRICS_SINGLETON_DECLARATION(T) ACE_EXPORT_SINGLETON_DECLARATION (T)
+# define TAO_METRICS_SINGLETON_DECLARE(SINGLETON_TYPE, CLASS, LOCK) ACE_EXPORT_SINGLETON_DECLARE(SINGLETON_TYPE, CLASS, LOCK)
+# else /* TAO_METRICS_BUILD_DLL */
+# define TAO_Metrics_Export ACE_Proper_Import_Flag
+# define TAO_METRICS_SINGLETON_DECLARATION(T) ACE_IMPORT_SINGLETON_DECLARATION (T)
+# define TAO_METRICS_SINGLETON_DECLARE(SINGLETON_TYPE, CLASS, LOCK) ACE_IMPORT_SINGLETON_DECLARE(SINGLETON_TYPE, CLASS, LOCK)
+# endif /* TAO_METRICS_BUILD_DLL */
+#else /* TAO_METRICS_HAS_DLL == 1 */
+# define TAO_Metrics_Export
+# define TAO_METRICS_SINGLETON_DECLARATION(T)
+# define TAO_METRICS_SINGLETON_DECLARE(SINGLETON_TYPE, CLASS, LOCK)
+#endif /* TAO_METRICS_HAS_DLL == 1 */
+
+// Set TAO_METRICS_NTRACE = 0 to turn on library specific tracing even if
+// tracing is turned off for ACE.
+#if !defined (TAO_METRICS_NTRACE)
+# if (ACE_NTRACE == 1)
+# define TAO_METRICS_NTRACE 1
+# else /* (ACE_NTRACE == 1) */
+# define TAO_METRICS_NTRACE 0
+# endif /* (ACE_NTRACE == 1) */
+#endif /* !TAO_METRICS_NTRACE */
+
+#if (TAO_METRICS_NTRACE == 1)
+# define TAO_METRICS_TRACE(X)
+#else /* (TAO_METRICS_NTRACE == 1) */
+# define TAO_METRICS_TRACE(X) ACE_TRACE_IMPL(X)
+#endif /* (TAO_METRICS_NTRACE == 1) */
+
+#endif /* TAO_METRICS_EXPORT_H */
+
+// End of auto generated file.
diff --git a/TAO/orbsvcs/orbsvcs/Naming/Bindings_Iterator_T.cpp b/TAO/orbsvcs/orbsvcs/Naming/Bindings_Iterator_T.cpp
new file mode 100644
index 00000000000..bee9ae0c932
--- /dev/null
+++ b/TAO/orbsvcs/orbsvcs/Naming/Bindings_Iterator_T.cpp
@@ -0,0 +1,232 @@
+// $Id$
+
+#ifndef TAO_BINDINGS_ITERATOR_T_CPP
+#define TAO_BINDINGS_ITERATOR_T_CPP
+
+#include "orbsvcs/Naming/Bindings_Iterator_T.h"
+
+#if !defined (ACE_LACKS_PRAGMA_ONCE)
+# pragma once
+#endif /* ACE_LACKS_PRAGMA_ONCE */
+
+TAO_BEGIN_VERSIONED_NAMESPACE_DECL
+
+template <class ITERATOR, class TABLE_ENTRY>
+TAO_Bindings_Iterator<ITERATOR, TABLE_ENTRY>::TAO_Bindings_Iterator (
+ TAO_Hash_Naming_Context *context,
+ ITERATOR *hash_iter,
+ PortableServer::POA_ptr poa,
+ TAO_SYNCH_RECURSIVE_MUTEX &lock)
+ : destroyed_ (0),
+ context_ (context),
+ hash_iter_ (hash_iter),
+ lock_ (lock),
+ poa_ (PortableServer::POA::_duplicate (poa))
+
+{
+}
+
+template <class ITERATOR, class TABLE_ENTRY>
+TAO_Bindings_Iterator<ITERATOR, TABLE_ENTRY>::~TAO_Bindings_Iterator (void)
+{
+ ACE_DECLARE_NEW_CORBA_ENV;
+ delete hash_iter_;
+
+ // Since we are going away, decrement the reference count on the
+ // Naming Context we were iterating over.
+ context_->interface ()->_remove_ref (ACE_ENV_SINGLE_ARG_PARAMETER);
+}
+
+// Return the Default POA of this Servant
+template <class ITERATOR, class TABLE_ENTRY> PortableServer::POA_ptr
+TAO_Bindings_Iterator<ITERATOR, TABLE_ENTRY>::_default_POA (
+ ACE_ENV_SINGLE_ARG_DECL_NOT_USED)
+{
+ return PortableServer::POA::_duplicate (this->poa_.in ());
+}
+
+template <class ITERATOR, class TABLE_ENTRY> CORBA::Boolean
+TAO_Bindings_Iterator<ITERATOR, TABLE_ENTRY>::next_one (
+ CosNaming::Binding_out b
+ ACE_ENV_ARG_DECL)
+ ACE_THROW_SPEC ((CORBA::SystemException))
+{
+ CosNaming::Binding *binding;
+
+ // Allocate a binding to be returned (even if there no more
+ // bindings, we need to allocate an out parameter.)
+ ACE_NEW_THROW_EX (binding,
+ CosNaming::Binding,
+ CORBA::NO_MEMORY ());
+ ACE_CHECK_RETURN (0);
+
+ b = binding;
+
+ ACE_GUARD_THROW_EX (TAO_SYNCH_RECURSIVE_MUTEX,
+ ace_mon,
+ this->lock_,
+ CORBA::INTERNAL ());
+ ACE_CHECK_RETURN (0);
+
+ // Check to make sure this object is still valid.
+ if (this->destroyed_)
+ ACE_THROW_RETURN (CORBA::OBJECT_NOT_EXIST (), 0);
+
+ // If the context we are iterating over has been destroyed,
+ // self-destruct.
+ if (context_->destroyed ())
+ {
+ destroy (ACE_ENV_SINGLE_ARG_PARAMETER);
+ ACE_CHECK_RETURN (0);
+
+ ACE_THROW_RETURN (CORBA::OBJECT_NOT_EXIST (), 0);
+ }
+
+ // If there are no more bindings.
+ if (hash_iter_->done ())
+ {
+ b->binding_type = CosNaming::nobject;
+ b->binding_name.length (0);
+ return 0;
+ }
+ else
+ {
+ // Return a binding.
+ TABLE_ENTRY *hash_entry = 0;
+ hash_iter_->next (hash_entry);
+
+ if (populate_binding (hash_entry, *binding) == 0)
+ ACE_THROW_RETURN (CORBA::NO_MEMORY (), 0);
+
+ hash_iter_->advance ();
+ return 1;
+ }
+}
+
+template <class ITERATOR, class TABLE_ENTRY> CORBA::Boolean
+TAO_Bindings_Iterator<ITERATOR, TABLE_ENTRY>::next_n (
+ CORBA::ULong how_many,
+ CosNaming::BindingList_out bl
+ ACE_ENV_ARG_DECL)
+ ACE_THROW_SPEC ((CORBA::SystemException))
+{
+ // We perform an allocation before obtaining the lock so that an out
+ // parameter is allocated in case we fail to obtain the lock.
+ ACE_NEW_THROW_EX (bl,
+ CosNaming::BindingList (0),
+ CORBA::NO_MEMORY ());
+ ACE_CHECK_RETURN (0);
+ // Obtain the lock.
+ ACE_GUARD_THROW_EX (TAO_SYNCH_RECURSIVE_MUTEX,
+ ace_mon,
+ this->lock_,
+ CORBA::INTERNAL ());
+ ACE_CHECK_RETURN (0);
+
+ // Check to make sure this object is still valid.
+ if (this->destroyed_)
+ ACE_THROW_RETURN (CORBA::OBJECT_NOT_EXIST (), 0);
+
+ // If the context we are iterating over has been destroyed,
+ // self-destruct.
+ if (context_->destroyed ())
+ {
+ destroy (ACE_ENV_SINGLE_ARG_PARAMETER);
+ ACE_CHECK_RETURN (0);
+
+ ACE_THROW_RETURN (CORBA::OBJECT_NOT_EXIST (), 0);
+ }
+
+ // Check for illegal parameter values.
+ if (how_many == 0)
+ ACE_THROW_RETURN (CORBA::BAD_PARAM (), 0);
+
+ // If there are no more bindings...
+ if (hash_iter_->done ())
+ return 0;
+ else
+ {
+ // Initially assume that the iterator has the requested number of
+ // bindings.
+ bl->length (how_many);
+
+ TABLE_ENTRY *hash_entry = 0;
+
+ // Iterate and populate the BindingList.
+ for (CORBA::ULong i = 0; i < how_many; i++)
+ {
+ hash_iter_->next (hash_entry);
+
+ if (populate_binding (hash_entry, bl[i]) == 0)
+ ACE_THROW_RETURN (CORBA::NO_MEMORY (), 0);
+
+ if (hash_iter_->advance () == 0)
+ {
+ // If no more bindings are left, reset length to the actual
+ // number of bindings populated, and get out of the loop.
+ bl->length (i + 1);
+ break;
+ }
+ }
+ return 1;
+ }
+}
+
+template <class ITERATOR, class TABLE_ENTRY> void
+TAO_Bindings_Iterator<ITERATOR, TABLE_ENTRY>::destroy (ACE_ENV_SINGLE_ARG_DECL)
+ ACE_THROW_SPEC ((CORBA::SystemException))
+{
+ ACE_GUARD_THROW_EX (TAO_SYNCH_RECURSIVE_MUTEX,
+ ace_mon,
+ this->lock_,
+ CORBA::INTERNAL ());
+ ACE_CHECK;
+
+ // Check to make sure this object is still valid.
+ if (this->destroyed_)
+ ACE_THROW (CORBA::OBJECT_NOT_EXIST ());
+
+ // Mark the object invalid.
+ this->destroyed_ = 1;
+
+ 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;
+}
+
+template <class ITERATOR, class TABLE_ENTRY> int
+TAO_Bindings_Iterator<ITERATOR, TABLE_ENTRY>::populate_binding (
+ TABLE_ENTRY *hash_entry,
+ CosNaming::Binding &b)
+{
+ b.binding_type = hash_entry->int_id_.type_;
+ b.binding_name.length (1);
+
+ // Here we perform a check before assignment to make sure
+ // CORBA::string_dup is not called on 0 pointer, since the spec does
+ // not say what should happen in that case.
+ if (hash_entry->ext_id_.id () != 0)
+ {
+ b.binding_name[0].id =
+ hash_entry->ext_id_.id ();
+ if (b.binding_name[0].id.in () == 0)
+ return 0;
+ }
+ if (hash_entry->ext_id_.kind () != 0)
+ {
+ b.binding_name[0].kind =
+ hash_entry->ext_id_.kind ();
+ if (b.binding_name[0].kind.in () == 0)
+ return 0;
+ }
+ return 1;
+}
+
+TAO_END_VERSIONED_NAMESPACE_DECL
+
+#endif /* TAO_BINDINGS_ITERATOR_T_CPP */
diff --git a/TAO/orbsvcs/orbsvcs/Naming/Bindings_Iterator_T.h b/TAO/orbsvcs/orbsvcs/Naming/Bindings_Iterator_T.h
new file mode 100644
index 00000000000..6bed837d729
--- /dev/null
+++ b/TAO/orbsvcs/orbsvcs/Naming/Bindings_Iterator_T.h
@@ -0,0 +1,145 @@
+// -*- C++ -*-
+
+//=============================================================================
+/**
+ * @file Bindings_Iterator_T.h
+ *
+ * $Id$
+ *
+ * @author Marina Spivak <marina@cs.wustl.edu>
+ */
+//=============================================================================
+
+
+#ifndef TAO_BINDINGS_ITERATOR_T_H
+#define TAO_BINDINGS_ITERATOR_T_H
+#include /**/ "ace/pre.h"
+
+#include "orbsvcs/Naming/Hash_Naming_Context.h"
+
+
+TAO_BEGIN_VERSIONED_NAMESPACE_DECL
+
+/**
+ * @class TAO_Bindings_Iterator
+ *
+ * @brief This class implements the <BindingIterator> interface that is
+ * part of the <CosNaming> idl module. This class works with Hash_Map-based
+ * implementations of CosNaming::NamingContext.
+ *
+ * This class is templatized by the types of the underlying
+ * hash table iterator and hash table entry, so that it can be
+ * used for both TAO_Transient_Naming_Context and
+ * TAO_Persistent_Naming_Context (and any other classes with
+ * underlying data structures supporting
+ * ACE_Hash_Map_Manager/Iterator - like interfaces).
+ *
+ * Instances of <TAO_Bindings_Iterator>s affect reference counts
+ * of corresponding Naming Contexts. Reference count on a
+ * Naming Context is incremented by one for a lifetime of each
+ * instance of <TAO_Bindings_Iterator> created for that
+ * context, i.e., a Naming Context cannot
+ * be cleaned up (but, of course, it can be invalidated) before
+ * all of its iterators have been cleaned up. When <destroy>
+ * method is invoked on a Naming Context, all of its iterators are
+ * destroyed in a "lazy evaluation" fashion, i.e., whenever a next
+ * operation is invoked on an iterator, and it can detect that
+ * the corresponding Naming Context has been invalidated, the
+ * iterator is destroyed.
+ */
+template <class ITERATOR, class TABLE_ENTRY>
+class TAO_Bindings_Iterator : public virtual POA_CosNaming::BindingIterator
+{
+public:
+ // = Intialization and termination methods.
+ /**
+ * Constructor expects a pointer to a
+ * dynamically allocated hash map iterator (destructor
+ * deallocates hash map iterator).
+ */
+ TAO_Bindings_Iterator (TAO_Hash_Naming_Context *context,
+ ITERATOR *hash_iter,
+ PortableServer::POA_ptr poa,
+ TAO_SYNCH_RECURSIVE_MUTEX &lock);
+
+
+ /// Destructor.
+ ~TAO_Bindings_Iterator (void);
+
+ /// Returns the Default POA of this Servant object
+ virtual PortableServer::POA_ptr _default_POA (ACE_ENV_SINGLE_ARG_DECL);
+
+ // = Idl methods.
+
+ /// This operation passes back the next unseen binding. True is
+ /// returned if a binding is passed back, and false is returned otherwise.
+ CORBA::Boolean next_one (CosNaming::Binding_out b
+ ACE_ENV_ARG_DECL)
+ ACE_THROW_SPEC ((CORBA::SystemException));
+
+ /**
+ * This operation passes back at most <how_many> unseen bindings.
+ * True is returned if bindings were passed back, and false is
+ * returned if no bindings were passed back.
+ */
+ CORBA::Boolean next_n (CORBA::ULong how_many,
+ CosNaming::BindingList_out bl
+ ACE_ENV_ARG_DECL)
+ ACE_THROW_SPEC ((CORBA::SystemException));
+
+ /// This operation destroys the iterator.
+ void destroy (ACE_ENV_SINGLE_ARG_DECL)
+ ACE_THROW_SPEC ((CORBA::SystemException));
+
+ // = Helper method.
+
+ /**
+ * Helper function used by TAO_*_Naming_Context and
+ * TAO_BindingIterator: populate a binding <b> with info contained
+ * in <hash_entry>. Return 1 if everything went smoothly, 0 if an
+ * allocation failed.
+ */
+ static int populate_binding (TABLE_ENTRY *hash_entry,
+ CosNaming::Binding &b);
+
+private:
+ /**
+ * Flag indicating whether this iterator is still valid. (The
+ * iterator becomes invalid when <destroy> method has been invoked
+ * on it, or when <destroy> method has been invoked on the
+ * corresponding Naming Context.) This flag is necessary
+ * because immediate destruction of this servant might not be possible
+ * due to pending requests in the POA.
+ */
+ int destroyed_;
+
+ /**
+ * Pointer to the Naming Context we are iterating over. We need
+ * this pointer to make sure the context is still valid before
+ * each iteration, and to decrement its reference count once we are <destroyed>.
+ */
+ TAO_Hash_Naming_Context *context_;
+
+ /// A pointer to the hash map iterator.
+ ITERATOR *hash_iter_;
+
+ /// Lock passed on from Naming Context to serialize access to the
+ /// internal data structure.
+ TAO_SYNCH_RECURSIVE_MUTEX &lock_;
+
+ /// Implement a different _default_POA().
+ PortableServer::POA_var poa_;
+};
+
+TAO_END_VERSIONED_NAMESPACE_DECL
+
+#if defined (ACE_TEMPLATES_REQUIRE_SOURCE)
+#include "orbsvcs/Naming/Bindings_Iterator_T.cpp"
+#endif /* ACE_TEMPLATES_REQUIRE_SOURCE */
+
+#if defined (ACE_TEMPLATES_REQUIRE_PRAGMA)
+#pragma implementation ("Bindings_Iterator_T.cpp")
+#endif /* ACE_TEMPLATES_REQUIRE_PRAGMA */
+
+#include /**/ "ace/post.h"
+#endif /* TAO_BINDINGS_ITERATOR_T_H */
diff --git a/TAO/orbsvcs/orbsvcs/Naming/Entries.cpp b/TAO/orbsvcs/orbsvcs/Naming/Entries.cpp
new file mode 100644
index 00000000000..5fddba2a270
--- /dev/null
+++ b/TAO/orbsvcs/orbsvcs/Naming/Entries.cpp
@@ -0,0 +1,127 @@
+// $Id$
+
+// ============================================================================
+//
+// = LIBRARY
+// cos
+//
+// = FILENAME
+// Entries.cpp
+//
+// = AUTHOR
+// Marina Spivak <marina@cs.wustl.edu>
+//
+// ============================================================================
+
+#include "orbsvcs/Naming/Entries.h"
+
+ACE_RCSID(Naming, Entries, "$Id$")
+
+
+TAO_BEGIN_VERSIONED_NAMESPACE_DECL
+
+TAO_IntId::TAO_IntId (void)
+ : type_ (CosNaming::nobject)
+{
+ ref_ = CORBA::Object::_nil ();
+}
+
+TAO_IntId::TAO_IntId (CORBA::Object_ptr obj,
+ CosNaming::BindingType type)
+ : type_ (type)
+{
+ ref_ = CORBA::Object::_duplicate (obj);
+}
+
+TAO_IntId::TAO_IntId (const TAO_IntId &rhs)
+{
+ type_ = rhs.type_;
+ ref_ = CORBA::Object::_duplicate (rhs.ref_);
+}
+
+TAO_IntId::~TAO_IntId (void)
+{
+ CORBA::release (ref_);
+}
+
+void
+TAO_IntId::operator= (const TAO_IntId &rhs)
+{
+ // check for self assignment.
+ if (&rhs == this)
+ return;
+
+ type_ = rhs.type_;
+
+ CORBA::release (ref_);
+ ref_ = CORBA::Object::_duplicate (rhs.ref_);
+}
+
+TAO_ExtId::TAO_ExtId (void)
+ : kind_ (),
+ id_ ()
+{
+}
+
+TAO_ExtId::TAO_ExtId (const char *id,
+ const char *kind)
+ : kind_ (kind),
+ id_ (id)
+{
+}
+
+TAO_ExtId::TAO_ExtId (const TAO_ExtId &rhs)
+{
+ id_ = rhs.id_;
+ kind_ = rhs.kind_;
+}
+
+TAO_ExtId::~TAO_ExtId (void)
+{
+}
+
+const char *
+TAO_ExtId::id (void)
+{
+ return id_.fast_rep ();
+}
+
+const char *
+TAO_ExtId::kind (void)
+{
+ return kind_.fast_rep ();
+}
+
+void
+TAO_ExtId::operator= (const TAO_ExtId &rhs)
+{
+ // Check for self assignment.
+ if (&rhs == this)
+ return;
+
+ id_ = rhs.id_;
+ kind_ = rhs.kind_;
+}
+
+bool
+TAO_ExtId::operator== (const TAO_ExtId &rhs) const
+{
+ return id_ == rhs.id_ && kind_ == rhs.kind_;
+}
+
+bool
+TAO_ExtId::operator!= (const TAO_ExtId &rhs) const
+{
+ return id_ != rhs.id_ || kind_ != rhs.kind_;
+}
+
+u_long
+TAO_ExtId::hash (void) const
+{
+ ACE_CString temp (id_);
+ temp += kind_;
+
+ return temp.hash ();
+}
+
+TAO_END_VERSIONED_NAMESPACE_DECL
diff --git a/TAO/orbsvcs/orbsvcs/Naming/Entries.h b/TAO/orbsvcs/orbsvcs/Naming/Entries.h
new file mode 100644
index 00000000000..e41d9bdf258
--- /dev/null
+++ b/TAO/orbsvcs/orbsvcs/Naming/Entries.h
@@ -0,0 +1,139 @@
+// -*- C++ -*-
+
+//=============================================================================
+/**
+ * @file Entries.h
+ *
+ * $Id$
+ *
+ * @author Marina Spivak <marina@cs.wustl.edu>
+ */
+//=============================================================================
+
+
+#ifndef TAO_ENTRIES_H
+#define TAO_ENTRIES_H
+#include /**/ "ace/pre.h"
+
+#include "ace/Hash_Map_Manager.h"
+
+#if !defined (ACE_LACKS_PRAGMA_ONCE)
+# pragma once
+#endif /* ACE_LACKS_PRAGMA_ONCE */
+
+#include "ace/SString.h"
+
+#include "orbsvcs/CosNamingC.h"
+#include "orbsvcs/Naming/naming_serv_export.h"
+
+TAO_BEGIN_VERSIONED_NAMESPACE_DECL
+
+/**
+ * @class TAO_IntId
+ *
+ * @brief Helper class for TAO_Transient_Bindings_Map: unifies several
+ * data items, so they can be stored together as a <value>
+ * for a <key> in a hash table holding the state of a Transient
+ * Naming Context.
+ *
+ * This class holds CORBA Object pointer and a binding type, so
+ * they can be stored together as a <value> for a <key> in a
+ * hash table holding the state of a Transient Naming Context.
+ */
+class TAO_Naming_Serv_Export TAO_IntId
+{
+public:
+ // = Initialization and termination methods.
+ /// Constructor.
+ TAO_IntId (void);
+
+ /// Constructor.
+ TAO_IntId (CORBA::Object_ptr obj,
+ CosNaming::BindingType type /* = CosNaming::nobject */);
+
+ /// Copy constructor.
+ TAO_IntId (const TAO_IntId & rhs);
+
+ /// Destructor.
+ ~TAO_IntId (void);
+
+ /// Assignment operator (does copy memory).
+ void operator= (const TAO_IntId & rhs);
+
+ // = Data members.
+
+ /// Object reference to be stored in a Transient Naming Context.
+ CORBA::Object_ptr ref_;
+
+ /// Binding type for <ref_>.
+ CosNaming::BindingType type_;
+};
+
+/**
+ * @class TAO_ExtId
+ *
+ * @brief Helper class for TAO_Transient_Bindings_Map: unifies several
+ * data items, so they can be stored together as a <key>
+ * for a <value> in a hash table holding the state of a Transient
+ * Naming Context.
+ *
+ * This class holds id and kind strings, so
+ * they can be stored together as a <key> for a <value> in a
+ * hash table holding the state of a Transient Naming Context.
+ */
+class TAO_Naming_Serv_Export TAO_ExtId
+{
+public:
+ // = Initialization and termination methods.
+
+ /// Constructor.
+ TAO_ExtId (void);
+
+ /// Constructor.
+ TAO_ExtId (const char *id,
+ const char *kind);
+
+ /// Copy constructor.
+ TAO_ExtId (const TAO_ExtId & rhs);
+
+ /// Destructor.
+ ~TAO_ExtId (void);
+
+ // = Assignment and comparison operators.
+
+ /// Assignment operator (does copy memory).
+ void operator= (const TAO_ExtId & rhs);
+
+ /// Equality comparison operator (must match both id_ and kind_).
+ bool operator== (const TAO_ExtId &rhs) const;
+
+ /// Inequality comparison operator.
+ bool operator!= (const TAO_ExtId &rhs) const;
+
+ /// <hash> function is required in order for this class to be usable by
+ /// ACE_Hash_Map_Manager.
+ u_long hash (void) const;
+
+ // = Data members.
+
+ /// <kind> portion of the name to be associated with some object
+ /// reference in a Transient Naming Context.
+ ACE_CString kind_;
+
+ /// <id> portion of the name to be associated with some object
+ /// reference in a Transient Naming Context.
+ ACE_CString id_;
+
+ // = Accessors
+
+ /// Return <id_> in a const char * format.
+ const char * id (void);
+
+ /// Return <kind_> in a const char * format.
+ const char * kind (void);
+};
+
+TAO_END_VERSIONED_NAMESPACE_DECL
+
+#include /**/ "ace/post.h"
+#endif /* TAO_ENTRIES_H */
diff --git a/TAO/orbsvcs/orbsvcs/Naming/Flat_File_Persistence.cpp b/TAO/orbsvcs/orbsvcs/Naming/Flat_File_Persistence.cpp
new file mode 100644
index 00000000000..6d5ccc82e09
--- /dev/null
+++ b/TAO/orbsvcs/orbsvcs/Naming/Flat_File_Persistence.cpp
@@ -0,0 +1,361 @@
+// $Id$
+
+//-----------------------------------------------------------------------------
+// Flat File class implementations
+//-----------------------------------------------------------------------------
+#include "orbsvcs/Naming/Flat_File_Persistence.h"
+
+#include "ace/Log_Msg.h"
+#include "ace/OS_NS_sys_stat.h"
+#include "ace/OS_NS_unistd.h"
+#include "ace/OS_NS_fcntl.h"
+
+TAO_BEGIN_VERSIONED_NAMESPACE_DECL
+
+TAO_NS_FlatFileStream::TAO_NS_FlatFileStream (const ACE_CString & file,
+ const char * mode)
+ : fl_ (0)
+{
+ ACE_TRACE("TAO_NS_FlatFileStream");
+ file_ = file;
+ mode_ = mode;
+}
+
+TAO_NS_FlatFileStream::~TAO_NS_FlatFileStream ()
+{
+ ACE_TRACE("~TAO_NS_FlatFileStream");
+ if ( fl_ != 0 )
+ this->close();
+}
+
+void
+TAO_NS_FlatFileStream::remove ()
+{
+ ACE_TRACE("remove");
+ ACE_OS::unlink(ACE_TEXT_CHAR_TO_TCHAR(file_.c_str()));
+}
+
+int
+TAO_NS_FlatFileStream::exists ()
+{
+ ACE_TRACE("exists");
+ // We could check the mode for this file, but for now just check exists
+ return ! ACE_OS::access(file_.c_str(), F_OK);
+}
+
+int
+TAO_NS_FlatFileStream::open()
+{
+ ACE_TRACE("open");
+ // For now, three flags exist "r", "w", and "c"
+ int flags = 0;
+ const char *fdmode = 0;
+ if( strchr(mode_.c_str(), 'r') )
+ if( strchr(mode_.c_str(), 'w') )
+ flags = O_RDWR, fdmode = "r+";
+ else
+ flags = O_RDONLY, fdmode = "r";
+ else
+ flags = O_WRONLY, fdmode = "w";
+ if( strchr(mode_.c_str(), 'c') )
+ flags |= O_CREAT;
+#ifndef ACE_WIN32
+ if( ACE_OS::flock_init (&filelock_, flags, ACE_TEXT_CHAR_TO_TCHAR(file_.c_str()), 0666) != 0 )
+ ACE_ERROR_RETURN ((LM_ERROR,
+ "Cannot open file %s for mode %s: (%d) %s\n",
+ file_.c_str(), mode_.c_str(),
+ errno, ACE_OS::strerror(errno)),
+ -1);
+#else
+ if( (filelock_.handle_= ACE_OS::open (ACE_TEXT_CHAR_TO_TCHAR(file_.c_str()), flags, 0)) == ACE_INVALID_HANDLE )
+ ACE_ERROR_RETURN ((LM_ERROR,
+ "Cannot open file %s for mode %s: (%d) %s\n",
+ file_.c_str(), mode_.c_str(),
+ errno, ACE_OS::strerror(errno)),
+ -1);
+#endif
+ this->fl_ = ACE_OS::fdopen(filelock_.handle_, ACE_TEXT_CHAR_TO_TCHAR(fdmode));
+ if (this->fl_ == 0)
+ ACE_ERROR_RETURN ((LM_ERROR,
+ "Cannot fdopen file %s for mode %s: (%d) %s\n",
+ file_.c_str(), mode_.c_str(),
+ errno, ACE_OS::strerror(errno)),
+ -1);
+ return 0;
+}
+
+int
+TAO_NS_FlatFileStream::close()
+{
+ ACE_TRACE("close");
+ ACE_OS::fflush(fl_);
+#ifndef ACE_WIN32
+ ACE_OS::flock_destroy (&filelock_, 0);
+#endif
+ ACE_OS::fclose (fl_); // even though flock_destroy closes the handle
+ // we still need to destroy the FILE*
+
+ fl_ = 0;
+ return 0;
+}
+
+int
+TAO_NS_FlatFileStream::flock (int whence, int start, int len)
+{
+ ACE_TRACE("flock");
+#if defined (ACE_WIN32)
+ ACE_UNUSED_ARG (whence);
+ ACE_UNUSED_ARG (start);
+ ACE_UNUSED_ARG (len);
+#else
+ if( ACE_OS::strcmp(mode_.c_str(), "r") == 0 )
+ ACE_OS::flock_rdlock(&filelock_, whence, start, len);
+ else
+ ACE_OS::flock_wrlock(&filelock_, whence, start, len);
+#endif
+ return 0;
+}
+
+int
+TAO_NS_FlatFileStream::funlock (int whence, int start, int len)
+{
+ ACE_TRACE("funlock");
+#if defined (ACE_WIN32)
+ ACE_UNUSED_ARG (whence);
+ ACE_UNUSED_ARG (start);
+ ACE_UNUSED_ARG (len);
+#else
+ ACE_OS::flock_unlock(&filelock_, whence, start, len);
+#endif
+ return 0;
+}
+
+time_t
+TAO_NS_FlatFileStream::last_changed(void)
+{
+ ACE_TRACE("TAO_NS_FlatFileStream::last_changed");
+ ACE_stat st;
+ ACE_OS::fstat(filelock_.handle_, &st);
+#if !defined (ACE_HAS_WINCE)
+ return st.st_mtime;
+#else
+ return st.st_mtime.sec ();
+#endif /* ACE_HAS_WINCE */
+}
+
+TAO_Storable_Base &
+TAO_NS_FlatFileStream::operator <<(
+ const TAO_NS_Persistence_Header &header)
+{
+ ACE_TRACE("TAO_NS_FlatFileStream::operator <<");
+ ACE_OS::rewind(this->fl_);
+ ACE_OS::fprintf(this->fl_, "%d\n%d\n", header.size(), header.destroyed());
+ ACE_OS::fflush(this->fl_);
+
+ return *this;
+}
+
+TAO_Storable_Base &
+TAO_NS_FlatFileStream::operator >>(
+ TAO_NS_Persistence_Header &header)
+{
+ ACE_TRACE("TAO_NS_FlatFileStream::operator >>");
+ unsigned int size;
+ int destroyed;
+
+ ACE_OS::rewind(this->fl_);
+ switch (fscanf(fl_, "%u\n", &size))
+ {
+ case 0:
+ this->setstate (badbit);
+ return *this;
+ case EOF:
+ this->setstate (eofbit);
+ return *this;
+ }
+ header.size(size);
+
+ switch (fscanf(fl_, "%d\n", &destroyed))
+ {
+ case 0:
+ this->setstate (badbit);
+ return *this;
+ case EOF:
+ this->setstate (eofbit);
+ return *this;
+ }
+ header.destroyed(destroyed);
+
+ return *this;
+
+}
+
+TAO_Storable_Base &
+TAO_NS_FlatFileStream::operator <<(
+ const TAO_NS_Persistence_Record &record)
+{
+ ACE_TRACE("TAO_NS_FlatFileStream::operator <<");
+ TAO_NS_Persistence_Record::Record_Type type = record.type();
+ ACE_OS::fprintf(this->fl_, "%d\n", type);
+
+ ACE_CString id = record.id();
+ ACE_OS::fprintf(this->fl_, ACE_SIZE_T_FORMAT_SPECIFIER ACE_TEXT("\n%s\n"),
+ id.length(), id.c_str());
+
+ ACE_CString kind = record.kind();
+ ACE_OS::fprintf(this->fl_, ACE_SIZE_T_FORMAT_SPECIFIER ACE_TEXT ("\n%s\n"),
+ kind.length(), kind.c_str());
+
+ ACE_CString ref = record.ref();
+ ACE_OS::fprintf(this->fl_, ACE_SIZE_T_FORMAT_SPECIFIER ACE_TEXT ("\n%s\n"),
+ ref.length(), ref.c_str());
+
+ ACE_OS::fflush(this->fl_);
+
+ return *this;
+}
+
+TAO_Storable_Base &
+TAO_NS_FlatFileStream::operator >>(
+ TAO_NS_Persistence_Record &record)
+{
+ ACE_TRACE("TAO_NS_FlatFileStream::operator >>");
+ TAO_NS_Persistence_Record::Record_Type type;
+ int temp_type_in;
+ switch (fscanf(fl_, "%d\n", &temp_type_in))
+ {
+ case 0:
+ this->setstate (badbit);
+ return *this;
+ case EOF:
+ this->setstate (eofbit);
+ return *this;
+ }
+ type = (TAO_NS_Persistence_Record::Record_Type) temp_type_in;
+ record.type(type);
+
+ int bufSize = 0;
+
+ //id
+ switch (fscanf(fl_, "%d\n", &bufSize))
+ {
+ case 0:
+ this->setstate (badbit);
+ return *this;
+ case EOF:
+ this->setstate (eofbit);
+ return *this;
+ }
+ char *id = new char[bufSize+1];
+ //char *id;
+ //ACE_NEW_RETURN (id, char[bufSize+1], 1);
+ if (ACE_OS::fgets(ACE_TEXT_CHAR_TO_TCHAR(id), bufSize+1, fl_) == 0 &&
+ bufSize != 0)
+ {
+ this->setstate (badbit);
+ return *this;
+ }
+ ACE_CString newId(id);
+ record.id(newId);
+ delete [] id;
+
+ //kind
+ switch (fscanf(fl_, "%d\n", &bufSize))
+ {
+ case 0:
+ this->setstate (badbit);
+ return *this;
+ case EOF:
+ this->setstate (eofbit);
+ return *this;
+ }
+ char *kind = new char[bufSize+1];
+ //char *kind;
+ //ACE_NEW (kind, char[bufSize+1]);
+ if (ACE_OS::fgets(ACE_TEXT_CHAR_TO_TCHAR(kind), bufSize+1, fl_) == 0 &&
+ bufSize != 0)
+ {
+ this->setstate (badbit);
+ return *this;
+ }
+ kind[bufSize] = '\0';
+ ACE_CString newKind(kind);
+ record.kind(newKind);
+ delete [] kind;
+
+ //ref
+ switch (fscanf(fl_, "%d\n", &bufSize))
+ {
+ case 0:
+ this->setstate (badbit);
+ return *this;
+ case EOF:
+ this->setstate (eofbit);
+ return *this;
+ }
+ char *ref = new char[bufSize+1];
+ //char *ref;
+ //ACE_NEW(ref, char[bufSize+1]);
+ if (ACE_OS::fgets(ACE_TEXT_CHAR_TO_TCHAR(ref), bufSize+1, fl_) == 0 &&
+ bufSize != 0)
+ {
+ this->setstate (badbit);
+ return *this;
+ }
+ ACE_CString newRef(ref);
+ record.ref(newRef);
+ delete [] ref;
+
+ return *this;
+
+}
+
+TAO_Storable_Base &
+TAO_NS_FlatFileStream::operator <<(
+ const TAO_NS_Persistence_Global &global)
+{
+ ACE_TRACE("TAO_NS_FlatFileStream::operator <<");
+ ACE_OS::rewind(this->fl_);
+ ACE_OS::fprintf(this->fl_, "%d\n", global.counter());
+ ACE_OS::fflush(this->fl_);
+
+ return *this;
+}
+
+TAO_Storable_Base &
+TAO_NS_FlatFileStream::operator >>(
+ TAO_NS_Persistence_Global &global)
+{
+ ACE_TRACE("TAO_NS_FlatFileStream::operator >>");
+ unsigned int counter = 0;
+
+ ACE_OS::rewind(this->fl_);
+ switch (fscanf(fl_, "%u\n", &counter))
+ {
+ case 0:
+ this->setstate (badbit);
+ break; // Still set the global.counter (to 0)
+ case EOF:
+ this->setstate (eofbit);
+ break; // Still set the global.counter (to 0)
+ }
+ global.counter(counter);
+
+ return *this;
+}
+
+
+TAO_Storable_Base *
+TAO_NS_FlatFileFactory::create_stream (const ACE_CString & file,
+ const ACE_TCHAR * mode)
+{
+ ACE_TRACE("TAO_NS_FlatFileFactory::create_stream");
+ TAO_Storable_Base *stream = 0;
+
+ ACE_NEW_RETURN (stream,
+ TAO_NS_FlatFileStream(file, ACE_TEXT_ALWAYS_CHAR (mode)),
+ 0);
+ return stream;
+}
+
+TAO_END_VERSIONED_NAMESPACE_DECL
diff --git a/TAO/orbsvcs/orbsvcs/Naming/Flat_File_Persistence.h b/TAO/orbsvcs/orbsvcs/Naming/Flat_File_Persistence.h
new file mode 100644
index 00000000000..8c76dbc99a3
--- /dev/null
+++ b/TAO/orbsvcs/orbsvcs/Naming/Flat_File_Persistence.h
@@ -0,0 +1,95 @@
+// -*- C++ -*-
+
+//=============================================================================
+/**
+ * @file Flat_File_Persistence.h
+ *
+ * $Id$
+ *
+ * @author Marina Spivak <marina@cs.wustl.edu>
+ */
+//=============================================================================
+
+#ifndef TAO_FLAT_FILE_PERSISTENCE_H
+#define TAO_FLAT_FILE_PERSISTENCE_H
+
+#include "orbsvcs/Naming/Storable.h"
+#include "ace/OS_NS_stdio.h"
+
+TAO_BEGIN_VERSIONED_NAMESPACE_DECL
+
+//------------------------------------------------------------------------
+// The Flat File concrete classes
+//------------------------------------------------------------------------
+class TAO_NS_FlatFileStream : public TAO_Storable_Base
+{
+public:
+
+ TAO_NS_FlatFileStream(const ACE_CString & file, const char * mode);
+ virtual ~TAO_NS_FlatFileStream();
+
+ /// Remove a file by name (file is not open)
+ virtual void remove();
+
+ /// Check if a file exists on disk (file is not open)
+ virtual int exists();
+
+ /// Open a file (the remaining methods below all require an open file)
+ virtual int open();
+
+ /// Close an open file
+ virtual int close();
+
+ /// Acquire a file lock
+ virtual int flock (int whence, int start, int len);
+
+ /// Release a file lock
+ virtual int funlock (int whence, int start, int len);
+
+ /// Returns the last time an open file was changed
+ virtual time_t last_changed(void);
+
+ /// Write a header to disk
+ virtual TAO_Storable_Base& operator << (
+ const TAO_NS_Persistence_Header& header);
+
+ /// Read a header from disk
+ virtual TAO_Storable_Base& operator >> (
+ TAO_NS_Persistence_Header& header);
+
+ /// Write a record to disk
+ virtual TAO_Storable_Base& operator << (
+ const TAO_NS_Persistence_Record& record);
+
+ /// Read a record from disk
+ virtual TAO_Storable_Base& operator >> (
+ TAO_NS_Persistence_Record& record);
+
+ /// Write the global data to disk
+ virtual TAO_Storable_Base& operator << (
+ const TAO_NS_Persistence_Global& global);
+
+ /// Read the global data from disk
+ virtual TAO_Storable_Base& operator >> (
+ TAO_NS_Persistence_Global& global);
+
+private:
+ ACE_OS::ace_flock_t filelock_;
+ FILE* fl_;
+ ACE_CString file_;
+ ACE_CString mode_;
+};
+
+class TAO_NS_FlatFileFactory : public TAO_Naming_Service_Persistence_Factory
+{
+public:
+ // Factory Methods
+
+ /// Create the stream that can operate on a disk file
+ virtual TAO_Storable_Base *create_stream(const ACE_CString & file,
+ const ACE_TCHAR * mode);
+};
+
+TAO_END_VERSIONED_NAMESPACE_DECL
+
+#endif
diff --git a/TAO/orbsvcs/orbsvcs/Naming/Hash_Naming_Context.cpp b/TAO/orbsvcs/orbsvcs/Naming/Hash_Naming_Context.cpp
new file mode 100644
index 00000000000..3cb59bd6da9
--- /dev/null
+++ b/TAO/orbsvcs/orbsvcs/Naming/Hash_Naming_Context.cpp
@@ -0,0 +1,680 @@
+// $Id$
+// ============================================================================
+//
+// = LIBRARY
+// TAO_CosNaming
+//
+// = FILENAME
+// Hash_Naming_Context.cpp
+//
+// = AUTHOR
+// Marina Spivak <marina@cs.wustl.edu> and
+// Sergio Flores-Gaitan <sergio@cs.wustl.edu>
+//
+// ============================================================================
+
+#include "orbsvcs/Naming/Hash_Naming_Context.h"
+#include "orbsvcs/Naming/nsconf.h"
+#include "ace/Auto_Ptr.h"
+
+ACE_RCSID (Naming,
+ Hash_Naming_Context,
+ "$Id$")
+
+
+TAO_BEGIN_VERSIONED_NAMESPACE_DECL
+
+// -------------------------------------------------
+
+TAO_Bindings_Map::~TAO_Bindings_Map (void)
+{
+}
+
+// -------------------------------------------------
+
+TAO_Hash_Naming_Context::TAO_Hash_Naming_Context (PortableServer::POA_ptr poa,
+ const char *poa_id)
+ : context_ (0),
+ interface_ (0),
+ destroyed_ (0),
+ poa_ (PortableServer::POA::_duplicate (poa)),
+ poa_id_ (poa_id)
+{
+}
+
+void
+TAO_Hash_Naming_Context::interface (TAO_Naming_Context *i)
+{
+ this->interface_ = i;
+}
+
+TAO_Hash_Naming_Context::~TAO_Hash_Naming_Context (void)
+{
+ delete context_;
+}
+
+PortableServer::POA_ptr
+TAO_Hash_Naming_Context::_default_POA (void)
+{
+ return PortableServer::POA::_duplicate (this->poa_.in ());
+}
+
+CosNaming::NamingContext_ptr
+TAO_Hash_Naming_Context::get_context (const CosNaming::Name &name
+ ACE_ENV_ARG_DECL)
+{
+ // Naming context we will return.
+ CosNaming::NamingContext_var result =
+ CosNaming::NamingContext::_nil ();
+
+ // Create compound name to be resolved, i.e.,
+ // (<name> - last component). To avoid copying, we can just reuse
+ // <name>'s buffer, since we will not be modifying it.
+ CORBA::ULong name_len = name.length ();
+ CosNaming::Name comp_name (name.maximum (),
+ name_len - 1,
+ const_cast<CosNaming::NameComponent*> (name.get_buffer ()));
+ ACE_TRY
+ {
+ // Resolve the name.
+ CORBA::Object_var context = resolve (comp_name
+ ACE_ENV_ARG_PARAMETER);
+ ACE_TRY_CHECK;
+
+ // Try narrowing object reference to the NamingContext type.
+ result = CosNaming::NamingContext::_narrow (context.in ()
+ ACE_ENV_ARG_PARAMETER);
+ ACE_TRY_CHECK;
+ }
+ ACE_CATCH (CosNaming::NamingContext::NotFound, ex)
+ {
+ // Add the last component of the name, which was stripped before
+ // the call to resolve.
+ CORBA::ULong rest_len = ex.rest_of_name.length () + 1;
+ ex.rest_of_name.length (rest_len);
+ ex.rest_of_name[rest_len - 1] = name[name_len - 1];
+
+ ACE_RE_THROW;
+ }
+ ACE_ENDTRY;
+ ACE_CHECK_RETURN (CosNaming::NamingContext::_nil ());
+
+ if (CORBA::is_nil (result.in ()))
+ {
+ CosNaming::Name rest;
+ rest.length (2);
+ rest[0] = name[name_len - 2];
+ rest[1] = name[name_len - 1];
+ ACE_THROW_RETURN (CosNaming::NamingContext::NotFound
+ (CosNaming::NamingContext::not_context,
+ rest),
+ CosNaming::NamingContext::_nil ());
+ }
+ // Finally, if everything went smoothly, just return the resolved
+ // context.
+ return result._retn ();
+}
+
+void
+TAO_Hash_Naming_Context::bind (const CosNaming::Name& n,
+ CORBA::Object_ptr obj
+ ACE_ENV_ARG_DECL)
+{
+ ACE_GUARD_THROW_EX (TAO_SYNCH_RECURSIVE_MUTEX,
+ ace_mon, this->lock_,
+ CORBA::INTERNAL ());
+ ACE_CHECK;
+
+ // Check to make sure this object didn't have <destroy> method
+ // invoked on it.
+ if (this->destroyed_)
+ ACE_THROW (CORBA::OBJECT_NOT_EXIST ());
+
+ // Get the length of the name.
+ CORBA::ULong name_len = n.length ();
+
+ // Check for invalid name.
+ if (name_len == 0)
+ ACE_THROW (CosNaming::NamingContext::InvalidName());
+
+ // If we received compound name, resolve it to get the context in
+ // which the binding should take place, then perform the binding on
+ // target context.
+ if (name_len > 1)
+ {
+ CosNaming::NamingContext_var context =
+ this->get_context (n ACE_ENV_ARG_PARAMETER);
+ ACE_CHECK;
+
+ CosNaming::Name simple_name;
+ simple_name.length (1);
+ simple_name[0] = n[name_len - 1];
+ ACE_TRY
+ {
+ context->bind (simple_name, obj ACE_ENV_ARG_PARAMETER);
+ ACE_TRY_CHECK;
+ }
+ ACE_CATCH (CORBA::TIMEOUT, timeoutEx)
+ {
+ ACE_TRY_THROW (CosNaming::NamingContext::CannotProceed
+ (context.in (), simple_name));
+ }
+ ACE_ENDTRY;
+ }
+ // If we received a simple name, we need to bind it in this context.
+ else
+ {
+ // Try binding the name.
+ int result = this->context_->bind (n[0].id,
+ n[0].kind,
+ obj,
+ CosNaming::nobject);
+ if (result == 1)
+ ACE_THROW (CosNaming::NamingContext::AlreadyBound());
+
+ // Something went wrong with the internal structure
+ else if (result == -1)
+ ACE_THROW (CORBA::INTERNAL ());
+ }
+}
+
+void
+TAO_Hash_Naming_Context::rebind (const CosNaming::Name& n,
+ CORBA::Object_ptr obj
+ ACE_ENV_ARG_DECL)
+{
+ ACE_GUARD_THROW_EX (TAO_SYNCH_RECURSIVE_MUTEX, ace_mon,
+ this->lock_,
+ CORBA::INTERNAL ());
+ ACE_CHECK;
+
+ // Check to make sure this object didn't have <destroy> method
+ // invoked on it.
+ if (this->destroyed_)
+ ACE_THROW (CORBA::OBJECT_NOT_EXIST ());
+
+ // Get the length of the name.
+ CORBA::ULong name_len = n.length ();
+
+ // Check for invalid name.
+ if (name_len == 0)
+ ACE_THROW (CosNaming::NamingContext::InvalidName());
+
+ // If we received compound name, resolve it to get the context in
+ // which the rebinding should take place, then perform the rebinding
+ // on target context.
+ if (name_len > 1)
+ {
+ CosNaming::NamingContext_var context =
+ get_context (n ACE_ENV_ARG_PARAMETER);
+ ACE_CHECK;
+
+ CosNaming::Name simple_name;
+ simple_name.length (1);
+ simple_name[0] = n[name_len - 1];
+ ACE_TRY
+ {
+ context->rebind (simple_name, obj ACE_ENV_ARG_PARAMETER);
+ ACE_TRY_CHECK;
+ }
+ ACE_CATCH (CORBA::TIMEOUT, timeoutEx)
+ {
+ ACE_TRY_THROW (CosNaming::NamingContext::CannotProceed
+ (context.in (), simple_name));
+ }
+ ACE_ENDTRY;
+ }
+ else
+ // If we received a simple name, we need to rebind it in this
+ // context.
+ {
+ int result = this->context_->rebind (n[0].id,
+ n[0].kind,
+ obj,
+ CosNaming::nobject);
+ // Check for error conditions.
+ if (result == -1)
+ ACE_THROW (CORBA::INTERNAL ());
+
+ else if (result == -2)
+ ACE_THROW (CosNaming::NamingContext::NotFound
+ (CosNaming::NamingContext::not_object,
+ n));
+ }
+}
+
+void
+TAO_Hash_Naming_Context::bind_context (const CosNaming::Name &n,
+ CosNaming::NamingContext_ptr nc
+ ACE_ENV_ARG_DECL)
+{
+ ACE_GUARD_THROW_EX (TAO_SYNCH_RECURSIVE_MUTEX, ace_mon,
+ this->lock_,
+ CORBA::INTERNAL ());
+ ACE_CHECK;
+
+ // Check to make sure this object didn't have <destroy> method
+ // invoked on it.
+ if (this->destroyed_)
+ ACE_THROW (CORBA::OBJECT_NOT_EXIST ());
+
+ // Do not allow binding of nil context reference.
+ if (CORBA::is_nil (nc))
+ ACE_THROW (CORBA::BAD_PARAM ());
+
+ // Get the length of the name.
+ CORBA::ULong name_len = n.length ();
+
+ // Check for invalid name.
+ if (name_len == 0)
+ ACE_THROW (CosNaming::NamingContext::InvalidName());
+
+ // If we received compound name, resolve it to get the context in
+ // which the binding should take place, then perform the binding on
+ // target context.
+ if (name_len > 1)
+ {
+ CosNaming::NamingContext_var context =
+ get_context (n ACE_ENV_ARG_PARAMETER);
+ ACE_CHECK;
+
+ CosNaming::Name simple_name;
+ simple_name.length (1);
+ simple_name[0] = n[name_len - 1];
+ ACE_TRY
+ {
+ context->bind_context (simple_name, nc ACE_ENV_ARG_PARAMETER);
+ ACE_TRY_CHECK;
+ }
+ ACE_CATCH (CORBA::TIMEOUT, timeoutEx)
+ {
+ ACE_TRY_THROW (CosNaming::NamingContext::CannotProceed
+ (context.in (), simple_name));
+ }
+ ACE_ENDTRY;
+ }
+ // If we received a simple name, we need to bind it in this context.
+ else
+ {
+ // Try binding the name.
+ int result = this->context_->bind (n[0].id,
+ n[0].kind,
+ nc,
+ CosNaming::ncontext);
+ if (result == 1)
+ ACE_THROW (CosNaming::NamingContext::AlreadyBound());
+
+ // Something went wrong with the internal structure
+ else if (result == -1)
+ ACE_THROW (CORBA::INTERNAL ());
+ }
+}
+
+void
+TAO_Hash_Naming_Context::rebind_context (const CosNaming::Name &n,
+ CosNaming::NamingContext_ptr nc
+ ACE_ENV_ARG_DECL)
+{
+ ACE_GUARD_THROW_EX (TAO_SYNCH_RECURSIVE_MUTEX, ace_mon,
+ this->lock_,
+ CORBA::INTERNAL ());
+ ACE_CHECK;
+
+ // Check to make sure this object didn't have <destroy> method
+ // invoked on it.
+ if (this->destroyed_)
+ ACE_THROW (CORBA::OBJECT_NOT_EXIST ());
+
+ // Get the length of the name.
+ CORBA::ULong name_len = n.length ();
+
+ // Check for invalid name.
+ if (name_len == 0)
+ ACE_THROW (CosNaming::NamingContext::InvalidName());
+
+ // If we received compound name, resolve it to get the context in
+ // which the rebinding should take place, then perform the rebinding
+ // on target context.
+ if (name_len > 1)
+ {
+ CosNaming::NamingContext_var context =
+ get_context (n ACE_ENV_ARG_PARAMETER);
+ ACE_CHECK;
+
+ CosNaming::Name simple_name;
+ simple_name.length (1);
+ simple_name[0] = n[name_len - 1];
+ ACE_TRY
+ {
+ context->rebind_context (simple_name, nc ACE_ENV_ARG_PARAMETER);
+ ACE_TRY_CHECK;
+ }
+ ACE_CATCH (CORBA::TIMEOUT, timeoutEx)
+ {
+ ACE_TRY_THROW (CosNaming::NamingContext::CannotProceed
+ (context.in (), simple_name));
+ }
+ ACE_ENDTRY;
+ }
+ else
+ // If we received a simple name, we need to rebind it in this
+ // context.
+ {
+ int result = this->context_->rebind (n[0].id,
+ n[0].kind,
+ nc,
+ CosNaming::ncontext);
+ // Check for error conditions.
+ if (result == -1)
+ ACE_THROW (CORBA::INTERNAL ());
+
+ else if (result == -2)
+ ACE_THROW (CosNaming::NamingContext::NotFound
+ (CosNaming::NamingContext::not_context,
+ n));
+ }
+}
+
+CORBA::Object_ptr
+TAO_Hash_Naming_Context::resolve (const CosNaming::Name& n
+ ACE_ENV_ARG_DECL)
+{
+ ACE_GUARD_THROW_EX (TAO_SYNCH_RECURSIVE_MUTEX, ace_mon, this->lock_,
+ CORBA::INTERNAL ());
+ ACE_CHECK_RETURN (CORBA::Object::_nil ());
+
+ // Check to make sure this object didn't have <destroy> method
+ // invoked on it.
+ if (this->destroyed_)
+ ACE_THROW_RETURN (CORBA::OBJECT_NOT_EXIST (),
+ CORBA::Object::_nil ());
+
+ // Get the length of the name.
+ CORBA::ULong name_len = n.length ();
+
+ // Check for invalid name.
+ if (name_len == 0)
+ ACE_THROW_RETURN (CosNaming::NamingContext::InvalidName(),
+ CORBA::Object::_nil ());
+
+ // Resolve the first component of the name.
+
+ // Stores the binding type for the first name component.
+ CosNaming::BindingType type;
+
+ // Stores the object reference bound to the first name component.
+ CORBA::Object_var result;
+
+ if (this->context_->find (n[0].id,
+ n[0].kind,
+ result.out (),
+ type) == -1)
+ ACE_THROW_RETURN (CosNaming::NamingContext::NotFound
+ (CosNaming::NamingContext::missing_node,
+ n),
+ CORBA::Object::_nil ());
+
+ // If the name we have to resolve is a compound name, we need to
+ // resolve it recursively.
+ if (name_len > 1)
+ {
+ CosNaming::NamingContext_var context =
+ CosNaming::NamingContext::_nil ();
+
+ if (type == CosNaming::ncontext)
+ {
+ // Narrow to NamingContext.
+ context = CosNaming::NamingContext::_narrow (result.in ()
+ ACE_ENV_ARG_PARAMETER);
+ ACE_CHECK_RETURN (CORBA::Object::_nil ());
+ }
+ else
+ // The first name component wasn't bound to a NamingContext.
+ ACE_THROW_RETURN (CosNaming::NamingContext::NotFound
+ (CosNaming::NamingContext::not_context,
+ n),
+ CORBA::Object::_nil ());
+
+ // If narrow failed...
+ if (CORBA::is_nil (context.in ()))
+ ACE_THROW_RETURN (CosNaming::NamingContext::NotFound
+ (CosNaming::NamingContext::not_context,
+ n),
+ CORBA::Object::_nil ());
+ else
+ {
+ // Successfully resolved the first name component, need to
+ // recursively call resolve on <n> without the first component.
+
+ // We need a name just like <n> but without the first
+ // component. Instead of copying data we can reuse <n>'s
+ // buffer since we will only be using it for 'in' parameters
+ // (no modifications).
+ CosNaming::Name rest_of_name
+ (n.maximum () - 1,
+ n.length () - 1,
+ const_cast<CosNaming::NameComponent*> (n.get_buffer ())
+ + 1);
+
+ // If there are any exceptions, they will propagate up.
+ ACE_TRY
+ {
+ CORBA::Object_ptr resolved_ref;
+ resolved_ref = context->resolve (rest_of_name
+ ACE_ENV_ARG_PARAMETER);
+ ACE_TRY_CHECK;
+ return resolved_ref;
+ }
+ ACE_CATCH (CORBA::TIMEOUT, timeoutEx)
+ {
+ ACE_TRY_THROW (CosNaming::NamingContext::CannotProceed
+ (context.in (), rest_of_name));
+ }
+ ACE_ENDTRY;
+ }
+ }
+ // If the name we had to resolve was simple, we just need to return
+ // the result.
+ return result._retn ();
+}
+
+void
+TAO_Hash_Naming_Context::unbind (const CosNaming::Name& n
+ ACE_ENV_ARG_DECL)
+{
+ ACE_GUARD_THROW_EX (TAO_SYNCH_RECURSIVE_MUTEX, ace_mon,
+ this->lock_,
+ CORBA::INTERNAL ());
+ ACE_CHECK;
+
+ // Check to make sure this object didn't have <destroy> method
+ // invoked on it.
+ if (this->destroyed_)
+ ACE_THROW (CORBA::OBJECT_NOT_EXIST ());
+
+ // Get the length of the name.
+ CORBA::ULong name_len = n.length ();
+
+ // Check for invalid name.
+ if (name_len == 0)
+ ACE_THROW (CosNaming::NamingContext::InvalidName());
+
+ // If we received compound name, resolve it to get the context in
+ // which the unbinding should take place, then perform the unbinding
+ // on target context.
+ if (name_len > 1)
+ {
+ CosNaming::NamingContext_var context =
+ get_context (n ACE_ENV_ARG_PARAMETER);
+ ACE_CHECK;
+
+ CosNaming::Name simple_name;
+ simple_name.length (1);
+ simple_name[0] = n[name_len - 1];
+ ACE_TRY
+ {
+ context->unbind (simple_name ACE_ENV_ARG_PARAMETER);
+ ACE_TRY_CHECK;
+ }
+ ACE_CATCH (CORBA::TIMEOUT, timeoutEx)
+ {
+ ACE_TRY_THROW (CosNaming::NamingContext::CannotProceed
+ (context.in (), simple_name));
+ }
+ ACE_ENDTRY;
+ }
+ // If we received a simple name, we need to unbind it in this
+ // context.
+ else
+ if (this->context_->unbind (n[0].id,
+ n[0].kind) == -1)
+ ACE_THROW (CosNaming::NamingContext::NotFound
+ (CosNaming::NamingContext::missing_node,
+ n));
+}
+
+CosNaming::NamingContext_ptr
+TAO_Hash_Naming_Context::bind_new_context (const CosNaming::Name& n
+ ACE_ENV_ARG_DECL)
+{
+ ACE_GUARD_THROW_EX (TAO_SYNCH_RECURSIVE_MUTEX,
+ ace_mon,
+ this->lock_,
+ CORBA::INTERNAL ());
+ ACE_CHECK_RETURN (CosNaming::NamingContext::_nil ());
+
+ // Check to make sure this object didn't have <destroy> method
+ // invoked on it.
+ if (this->destroyed_)
+ ACE_THROW_RETURN (CORBA::OBJECT_NOT_EXIST (),
+ CosNaming::NamingContext::_nil ());
+
+ // Get the length of the name.
+ CORBA::ULong name_len = n.length ();
+
+ // Check for invalid name.
+ if (name_len == 0)
+ ACE_THROW_RETURN (CosNaming::NamingContext::InvalidName(),
+ CosNaming::NamingContext::_nil ());
+
+ // If we received compound name, resolve it to get the context in
+ // which the binding should take place, then perform the operation on
+ // target context.
+ if (name_len > 1)
+ {
+ CosNaming::NamingContext_var context =
+ get_context (n ACE_ENV_ARG_PARAMETER);
+ ACE_CHECK_RETURN (CosNaming::NamingContext::_nil ());
+
+ CosNaming::Name simple_name;
+ simple_name.length (1);
+ simple_name[0] = n[name_len - 1];
+ return context->bind_new_context (simple_name ACE_ENV_ARG_PARAMETER);
+ }
+
+ // If we received a simple name, we need to bind it in this context.
+
+ // Stores our new Naming Context.
+ CosNaming::NamingContext_var result =
+ CosNaming::NamingContext::_nil ();
+
+ // Create new context.
+ result = new_context (ACE_ENV_SINGLE_ARG_PARAMETER);
+ ACE_CHECK_RETURN (CosNaming::NamingContext::_nil ());
+
+ // Bind the new context to the name.
+ ACE_TRY
+ {
+ bind_context (n,
+ result.in ()
+ ACE_ENV_ARG_PARAMETER);
+ ACE_TRY_CHECK;
+ }
+ ACE_CATCHANY
+ {
+ // If the bind() operation fails we must destroy the recently
+ // created context, should any exceptions be raised by the
+ // destroy() operation we want to ignore them.
+ {
+ ACE_DECLARE_NEW_CORBA_ENV;
+ ACE_TRY_EX(DESTROY)
+ {
+ result->destroy (ACE_ENV_SINGLE_ARG_PARAMETER);
+ ACE_TRY_CHECK_EX(DESTROY);
+ }
+ ACE_CATCHANY
+ {
+ }
+ ACE_ENDTRY;
+ }
+ // Re-raise the exception in bind_context()
+ ACE_RE_THROW;
+ }
+ ACE_ENDTRY;
+ ACE_CHECK_RETURN (CosNaming::NamingContext::_nil ());
+ return result._retn ();
+}
+
+void
+TAO_Hash_Naming_Context::destroy (ACE_ENV_SINGLE_ARG_DECL)
+{
+ ACE_GUARD_THROW_EX (TAO_SYNCH_RECURSIVE_MUTEX,
+ ace_mon,
+ this->lock_,
+ CORBA::INTERNAL ());
+ ACE_CHECK;
+
+ // Check to make sure this object didn't have <destroy> method
+ // invoked on it.
+ if (this->destroyed_)
+ ACE_THROW (CORBA::OBJECT_NOT_EXIST ());
+
+ if (this->context_->current_size () != 0)
+ ACE_THROW (CosNaming::NamingContext::NotEmpty());
+
+ // Destroy is a no-op on a root context.
+ if (root ())
+ return;
+
+ else
+ {
+ this->destroyed_ = 2;
+
+ // 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 ();
+
+ PortableServer::ObjectId_var id =
+ PortableServer::string_to_ObjectId (poa_id_.fast_rep ());
+
+ ACE_CHECK;
+
+ poa->deactivate_object (id.in ()
+ ACE_ENV_ARG_PARAMETER);
+ ACE_CHECK;
+ }
+}
+
+int
+TAO_Hash_Naming_Context::root (void)
+{
+ return (ACE_OS::strcmp (this->poa_id_.fast_rep (),
+ TAO_ROOT_NAMING_CONTEXT) == 0);
+}
+
+int
+TAO_Hash_Naming_Context::destroyed (void)
+{
+ return this->destroyed_;
+}
+
+TAO_Naming_Context *
+TAO_Hash_Naming_Context::interface (void)
+{
+ return this->interface_;
+}
+
+TAO_END_VERSIONED_NAMESPACE_DECL
diff --git a/TAO/orbsvcs/orbsvcs/Naming/Hash_Naming_Context.h b/TAO/orbsvcs/orbsvcs/Naming/Hash_Naming_Context.h
new file mode 100644
index 00000000000..21fb9d571f3
--- /dev/null
+++ b/TAO/orbsvcs/orbsvcs/Naming/Hash_Naming_Context.h
@@ -0,0 +1,280 @@
+// -*- C++ -*-
+
+//=============================================================================
+/**
+ * @file Hash_Naming_Context.h
+ *
+ * $Id$
+ *
+ * @author Marina Spivak <marina@cs.wustl.edu>
+ */
+//=============================================================================
+
+
+#ifndef TAO_HASH_NAMING_CONTEXT_H
+#define TAO_HASH_NAMING_CONTEXT_H
+
+#include /**/ "ace/pre.h"
+
+#include "orbsvcs/Naming/Naming_Context_Interface.h"
+#include "orbsvcs/Naming/naming_serv_export.h"
+
+#include "ace/Recursive_Thread_Mutex.h"
+#include "ace/SString.h"
+
+// This is to remove "inherits via dominance" warnings from MSVC.
+#if defined (_MSC_VER)
+# pragma warning (disable : 4250)
+#endif /* _MSC_VER */
+
+// Note: 'interface' has been defined as struct on WinCE platform and
+// gives a compiler error. This undef has been found harmless on
+// Windows and solaris platforms; however, if this generates
+// error, then proper ifdef must be added around following block.
+#if defined (interface)
+#undef interface
+#endif // interface
+
+TAO_BEGIN_VERSIONED_NAMESPACE_DECL
+
+/**
+ * @class TAO_Bindings_Map
+ *
+ * @brief This abstract base class defines an interface for hash-based
+ * data structures used in implementations of NamingContext
+ * (i.e., TAO_Transient_Naming_Context and TAO_Persistent_Naming_Context)
+ *
+ * Define an interface for several hash-based data structures, so
+ * that we can write some code that would work with any of them,
+ * i.e., TAO_Hash_Naming_Context.
+ */
+class TAO_Naming_Serv_Export TAO_Bindings_Map
+{
+
+public:
+
+ /// Destructor.
+ virtual ~TAO_Bindings_Map (void);
+
+ /// Return current number of entries (name bindings) in the
+ /// underlying hash map.
+ virtual size_t current_size (void) = 0;
+
+ /**
+ * Add a binding with the specified parameters to the table.
+ * Return 0 on success and -1 on failure, 1 if there already is a
+ * binding with <id> and <kind>.
+ */
+ virtual int bind (const char *id,
+ const char *kind,
+ CORBA::Object_ptr obj,
+ CosNaming::BindingType type) = 0;
+
+ /**
+ * Overwrite a binding containing <id> and <kind> (or create a new
+ * one if one doesn't exist) with the specified parameters. Returns
+ * -1 on failure.
+ */
+ virtual int rebind (const char *id,
+ const char *kind,
+ CORBA::Object_ptr obj,
+ CosNaming::BindingType type) = 0;
+
+ /// Remove a binding containing <id> and <kind> from the table.
+ /// Return 0 on success and -1 on failure.
+ virtual int unbind (const char * id,
+ const char * kind) = 0;
+
+ /**
+ * Find the binding containing <id> and <kind> in the table, and
+ * pass binding's type and object back to the caller by reference.
+ * Return 0 on success and -1 on failure. Note: a 'duplicated' object
+ * reference is assigned to <obj>, so the caller is responsible for
+ * its deallocation.
+ */
+ virtual int find (const char * id,
+ const char * kind,
+ CORBA::Object_ptr & obj,
+ CosNaming::BindingType &type) = 0;
+
+};
+
+/**
+ * @class TAO_Hash_Naming_Context
+ *
+ * @brief This class factors out common code for two 'ConcreteImplementors'
+ * in the Bridge pattern architecture of the CosNaming::NamingContext
+ * implementation.
+ *
+ * This class contains 'algorithm' code that is common to two
+ * hash-table-based implementations of the NamingContext:
+ * TAO_Transient_Naming_Context and TAO_Persistent_Naming_Context.
+ * To help achieve this 'templatization', we use the abstract base
+ * class TAO_Bindings_Map, which provides a common interface to the data structures
+ * used in TAO_Persistent_Namng_Context and TAO_Transient_Naming_Context.
+ */
+class TAO_Naming_Serv_Export TAO_Hash_Naming_Context :public TAO_Naming_Context_Impl
+{
+public:
+ // = Initialization and termination methods.
+ /// Constructor.
+ TAO_Hash_Naming_Context (PortableServer::POA_ptr poa,
+ const char *poa_id);
+
+ /// Set our <interface_> pointer.
+ void interface (TAO_Naming_Context *i);
+
+ /// Destructor.
+ virtual ~TAO_Hash_Naming_Context (void);
+
+ // = Accessors.
+
+ /// Get the pointer to our <interface>.
+ TAO_Naming_Context *interface (void);
+
+ /// Returns true if this Naming Context is a root Naming Context for
+ /// the server, and false otherwise.
+ int root (void);
+
+ /// Returns true if this context had <destroy> operation invoked on
+ /// it, and false otherwise.
+ int destroyed (void);
+
+ // = CosNaming::NamingContext idl interface methods.
+
+ /**
+ * Create a binding for name <n> and object <obj> in the naming
+ * context. Compound names are treated as follows: ctx->bind (<c1;
+ * c2; c3; cn>, obj) = (ctx->resolve (<c1; c2; cn-1>))->bind (<cn>,
+ * obj) if the there already exists a binding for the specified
+ * name, <AlreadyBound> exception is thrown. Naming contexts should
+ * be bound using <bind_context> and <rebind_context> in order to
+ * participate in name resolution later.
+ */
+ virtual void bind (const CosNaming::Name &n,
+ CORBA::Object_ptr obj
+ ACE_ENV_ARG_DECL);
+
+ /**
+ * This is similar to <bind> operation above, except for when the
+ * binding for the specified name already exists in the specified
+ * context. In that case, the existing binding is replaced with the
+ * new one.
+ */
+ virtual void rebind (const CosNaming::Name &n,
+ CORBA::Object_ptr obj
+ ACE_ENV_ARG_DECL);
+
+ /**
+ * This is the version of <bind> specifically for binding naming
+ * contexts, so that they will participate in name resolution when
+ * compound names are passed to be resolved.
+ */
+ virtual void bind_context (const CosNaming::Name &n,
+ CosNaming::NamingContext_ptr nc
+ ACE_ENV_ARG_DECL);
+
+ /**
+ * This is a version of <rebind> specifically for naming contexts,
+ * so that they can participate in name resolution when compound
+ * names are passed.
+ */
+ virtual void rebind_context (const CosNaming::Name &n,
+ CosNaming::NamingContext_ptr nc
+ ACE_ENV_ARG_DECL);
+
+ /**
+ * Return object reference that is bound to the name. Compound name
+ * resolve is defined as follows: ctx->resolve (<c1; c2; cn>) =
+ * ctx->resolve (<c1; c2 cn-1>)->resolve (<cn>) The naming service
+ * does not return the type of the object. Clients are responsible
+ * for "narrowing" the object to the appropriate type.
+ */
+ virtual CORBA::Object_ptr resolve (const CosNaming::Name &n
+ ACE_ENV_ARG_DECL);
+
+ /**
+ * Remove the name binding from the context. When compound names
+ * are used, unbind is defined as follows: ctx->unbind (<c1; c2;
+ * cn>) = (ctx->resolve (<c1; c2; cn-1>))->unbind (<cn>)
+ */
+ virtual void unbind (const CosNaming::Name &n
+ ACE_ENV_ARG_DECL);
+
+ /**
+ * This operation creates a new context and binds it to the name
+ * supplied as an argument. The newly-created context is
+ * implemented by the same server as the context in which it was
+ * bound (the name argument excluding the last component).
+ */
+ virtual CosNaming::NamingContext_ptr bind_new_context (const CosNaming::Name &n
+ ACE_ENV_ARG_DECL);
+
+ /**
+ * Delete the naming context. The user should take care to <unbind> any
+ * bindings in which the given context is bound to some names, to
+ * avoid dangling references when invoking <destroy> operation.
+ * NOTE: <destory> is a no-op on the root context.
+ * NOTE: after <destroy> is invoked on a Naming Context, all
+ * BindingIterators associated with that Naming Context are also destroyed.
+ */
+ virtual void destroy (ACE_ENV_SINGLE_ARG_DECL);
+
+ /// Returns the Default POA of this Servant object
+ virtual PortableServer::POA_ptr _default_POA (void);
+
+protected:
+ // = Helper method used by other methods.
+
+ /**
+ * <get_context> is used by methods that need to resolve a compound
+ * name before performing the actual operation (e.g., bind, unbind,
+ * etc.) <get_context> takes a full name (including the last
+ * component that doesn't need to be resolved), and returns a
+ * pointer to the target context.
+ */
+ CosNaming::NamingContext_ptr get_context (const CosNaming::Name &name
+ ACE_ENV_ARG_DECL);
+
+ /**
+ * Pointer to the data structure used to store this Naming Context's
+ * bindings. <context_> is initialized with a concrete data
+ * structure by subclasses, which know which data structure to use.
+ */
+ TAO_Bindings_Map *context_;
+
+ /**
+ * Pointer to the <interface> object for which we serve as a
+ * <concrete implementation>, i.e., the object that delegates to us
+ * all client CosNaming::NamingContext CORBA calls.
+ * We need this pointer for reference counting.
+ */
+ TAO_Naming_Context *interface_;
+
+ /// Lock used to serialize access to the underlying data structure.
+ TAO_SYNCH_RECURSIVE_MUTEX lock_;
+
+ /**
+ * Flag indicating whether this Naming Context is no longer valid.
+ * This flag is necessary because immediate destruction
+ * might not be possible if there are pending requests on this servant
+ * in the POA.
+ */
+ int destroyed_;
+
+ /// POA we are registered with.
+ PortableServer::POA_var poa_;
+
+ /**
+ * ID with which we are registered with <poa_>.
+ * Note, if <poa_id_> is equivalent to TAO_ROOT_NAMING_CONTEXT, then this Naming Context
+ * is the root Naming Context for the server, i.e., it is un<destroy>able.
+ */
+ ACE_CString poa_id_;
+};
+
+TAO_END_VERSIONED_NAMESPACE_DECL
+
+#include /**/ "ace/post.h"
+
+#endif /* TAO_HASH_NAMING_CONTEXT_H */
diff --git a/TAO/orbsvcs/orbsvcs/Naming/Naming_Client.cpp b/TAO/orbsvcs/orbsvcs/Naming/Naming_Client.cpp
new file mode 100644
index 00000000000..ac7c42f87d0
--- /dev/null
+++ b/TAO/orbsvcs/orbsvcs/Naming/Naming_Client.cpp
@@ -0,0 +1,67 @@
+// $Id$
+
+#include "orbsvcs/Naming/Naming_Client.h"
+#include "orbsvcs/CosNamingC.h"
+#include "ace/Log_Msg.h"
+
+ACE_RCSID (Naming,
+ Naming_Client,
+ "$Id$")
+
+TAO_BEGIN_VERSIONED_NAMESPACE_DECL
+
+CosNaming::NamingContext_ptr
+TAO_Naming_Client::operator -> (void) const
+{
+ return this->naming_context_.ptr ();
+}
+
+CosNaming::NamingContext_ptr
+TAO_Naming_Client::get_context (void) const
+{
+ // Must duplicate this pointer so it can be stored in a _var.
+ return CosNaming::NamingContext::_duplicate (this->naming_context_.in ());
+}
+
+int
+TAO_Naming_Client::init (CORBA::ORB_ptr orb,
+ ACE_Time_Value *timeout)
+{
+ ACE_DECLARE_NEW_CORBA_ENV;
+ ACE_TRY
+ {
+ CORBA::Object_var naming_obj =
+ orb->resolve_initial_references ("NameService", timeout ACE_ENV_ARG_PARAMETER);
+ ACE_TRY_CHECK;
+
+ if (CORBA::is_nil (naming_obj.in ()))
+ ACE_ERROR_RETURN ((LM_ERROR,
+ " (%P|%t) Unable to initialize the NameService.\n"),
+ -1);
+ this->naming_context_ =
+ CosNaming::NamingContext::_narrow (naming_obj.in ()
+ ACE_ENV_ARG_PARAMETER);
+ ACE_TRY_CHECK;
+ }
+ ACE_CATCHANY
+ {
+ ACE_PRINT_EXCEPTION (ACE_ANY_EXCEPTION, "TAO_Naming_Client::init");
+ return -1;
+ }
+ ACE_ENDTRY;
+ ACE_CHECK_RETURN (-1);
+
+ return 0;
+}
+
+TAO_Naming_Client::TAO_Naming_Client (void)
+{
+ // Do nothing
+}
+
+TAO_Naming_Client::~TAO_Naming_Client (void)
+{
+ // Do nothing
+}
+
+TAO_END_VERSIONED_NAMESPACE_DECL
diff --git a/TAO/orbsvcs/orbsvcs/Naming/Naming_Client.h b/TAO/orbsvcs/orbsvcs/Naming/Naming_Client.h
new file mode 100644
index 00000000000..56b48d7f37d
--- /dev/null
+++ b/TAO/orbsvcs/orbsvcs/Naming/Naming_Client.h
@@ -0,0 +1,78 @@
+/* -*- C++ -*- */
+
+//=============================================================================
+/**
+ * @file Naming_Client.h
+ *
+ * $Id$
+ *
+ * Implement wrappers useful to Naming Service clients.
+ *
+ *
+ * @author Nagarajan Surendran (naga@cs.wustl.edu)
+ * @author Matt Braun <mjb2@cs.wustl.edu>
+ * @author and Douglas C. Schmidt <schmidt@cs.wustl.edu>.
+ */
+//=============================================================================
+
+
+#ifndef TAO_NAMING_CLIENT_H
+#define TAO_NAMING_CLIENT_H
+#include /**/ "ace/pre.h"
+
+#include "tao/ORB.h"
+#include "orbsvcs/CosNamingC.h"
+#include "orbsvcs/Naming/naming_export.h"
+
+TAO_BEGIN_VERSIONED_NAMESPACE_DECL
+
+/**
+ * @class TAO_Naming_Client
+ *
+ * @brief This class is intended to simplify programs that want to play
+ * the role of Naming Service clients.
+ *
+ * Wrapper class that locates the root Naming Context. It also
+ * defines the operator-> so that <NamingContext> functions like
+ * <resolve>, etc. can be directly called on a
+ * <TAO_Naming_Client> object, and will be forwarded to the root
+ * Naming Context.
+ */
+class TAO_Naming_Export TAO_Naming_Client
+{
+public:
+ // = Initialization and termination methods.
+
+ /// Default constructor.
+ TAO_Naming_Client (void);
+
+ /**
+ * Look for a Naming Service for a period of <timeout> using
+ * <resolve_initial_references>. Return 0 if Naming Service is
+ * successfully located, and -1 on failure.
+ */
+ int init (CORBA::ORB_ptr orb,
+ ACE_Time_Value *timeout = 0);
+
+ /// Destructor.
+ ~TAO_Naming_Client (void);
+
+ /// Returns a pointer to the root Naming Context.
+ CosNaming::NamingContext_ptr operator-> (void) const;
+
+ /**
+ * Returns a pointer to the root Naming Context. This ptr is
+ * duplicated via <_duplicate> so that it can be stored into a
+ * <*_var>.
+ */
+ CosNaming::NamingContext_ptr get_context (void) const;
+
+protected:
+ /// Reference to the root Naming Context.
+ CosNaming::NamingContext_var naming_context_;
+};
+
+TAO_END_VERSIONED_NAMESPACE_DECL
+
+#include /**/ "ace/post.h"
+#endif /* TAO_NAMING_CLIENT_H */
diff --git a/TAO/orbsvcs/orbsvcs/Naming/Naming_Context_Interface.cpp b/TAO/orbsvcs/orbsvcs/Naming/Naming_Context_Interface.cpp
new file mode 100644
index 00000000000..809c1795a42
--- /dev/null
+++ b/TAO/orbsvcs/orbsvcs/Naming/Naming_Context_Interface.cpp
@@ -0,0 +1,539 @@
+// $Id$
+
+// ============================================================================
+//
+// = LIBRARY
+// cos
+//
+// = FILENAME
+// Naming_Context_Interface.cpp
+//
+// = AUTHOR
+// Marina Spivak <marina@cs.wustl.edu>
+//
+// ============================================================================
+
+#include "orbsvcs/Naming/Naming_Context_Interface.h"
+#include "ace/ACE.h"
+#include "ace/OS_NS_string.h"
+#include "ace/os_include/os_ctype.h"
+
+TAO_BEGIN_VERSIONED_NAMESPACE_DECL
+
+TAO_Naming_Context::TAO_Naming_Context (TAO_Naming_Context_Impl *impl)
+ : impl_ (impl)
+{
+}
+
+TAO_Naming_Context::~TAO_Naming_Context (void)
+{
+ delete impl_;
+}
+
+PortableServer::POA_ptr
+TAO_Naming_Context::_default_POA (ACE_ENV_SINGLE_ARG_DECL_NOT_USED/*env*/)
+{
+ return impl_->_default_POA ();
+}
+
+void
+TAO_Naming_Context::bind (const CosNaming::Name &n,
+ CORBA::Object_ptr obj
+ ACE_ENV_ARG_DECL)
+ ACE_THROW_SPEC ((CORBA::SystemException,
+ CosNaming::NamingContext::NotFound,
+ CosNaming::NamingContext::CannotProceed,
+ CosNaming::NamingContext::InvalidName,
+ CosNaming::NamingContext::AlreadyBound))
+{
+ impl_->bind (n, obj ACE_ENV_ARG_PARAMETER);
+}
+
+void
+TAO_Naming_Context::rebind (const CosNaming::Name &n,
+ CORBA::Object_ptr obj
+ ACE_ENV_ARG_DECL)
+ ACE_THROW_SPEC ((CORBA::SystemException,
+ CosNaming::NamingContext::NotFound,
+ CosNaming::NamingContext::CannotProceed,
+ CosNaming::NamingContext::InvalidName))
+{
+ impl_->rebind (n, obj ACE_ENV_ARG_PARAMETER);
+}
+
+void
+TAO_Naming_Context::bind_context (const CosNaming::Name &n,
+ CosNaming::NamingContext_ptr nc
+ ACE_ENV_ARG_DECL)
+ ACE_THROW_SPEC ((CORBA::SystemException,
+ CosNaming::NamingContext::NotFound,
+ CosNaming::NamingContext::CannotProceed,
+ CosNaming::NamingContext::InvalidName,
+ CosNaming::NamingContext::AlreadyBound))
+{
+ impl_->bind_context (n, nc ACE_ENV_ARG_PARAMETER);
+}
+
+void
+TAO_Naming_Context::rebind_context (const CosNaming::Name &n,
+ CosNaming::NamingContext_ptr nc
+ ACE_ENV_ARG_DECL)
+ ACE_THROW_SPEC ((CORBA::SystemException,
+ CosNaming::NamingContext::NotFound,
+ CosNaming::NamingContext::CannotProceed,
+ CosNaming::NamingContext::InvalidName))
+{
+ impl_->rebind_context (n, nc ACE_ENV_ARG_PARAMETER);
+}
+
+CORBA::Object_ptr
+TAO_Naming_Context::resolve (const CosNaming::Name &n
+ ACE_ENV_ARG_DECL)
+ ACE_THROW_SPEC ((CORBA::SystemException,
+ CosNaming::NamingContext::NotFound,
+ CosNaming::NamingContext::CannotProceed,
+ CosNaming::NamingContext::InvalidName))
+{
+ return impl_->resolve (n ACE_ENV_ARG_PARAMETER);
+}
+
+void
+TAO_Naming_Context::unbind (const CosNaming::Name &n
+ ACE_ENV_ARG_DECL)
+ ACE_THROW_SPEC ((CORBA::SystemException,
+ CosNaming::NamingContext::NotFound,
+ CosNaming::NamingContext::CannotProceed,
+ CosNaming::NamingContext::InvalidName))
+{
+ impl_->unbind (n ACE_ENV_ARG_PARAMETER);
+}
+
+CosNaming::NamingContext_ptr
+TAO_Naming_Context::new_context (ACE_ENV_SINGLE_ARG_DECL)
+ ACE_THROW_SPEC ((CORBA::SystemException))
+{
+ return impl_->new_context (ACE_ENV_SINGLE_ARG_PARAMETER);
+}
+
+CosNaming::NamingContext_ptr
+TAO_Naming_Context::bind_new_context (const CosNaming::Name &n
+ ACE_ENV_ARG_DECL)
+ ACE_THROW_SPEC ((CORBA::SystemException,
+ CosNaming::NamingContext::NotFound,
+ CosNaming::NamingContext::AlreadyBound,
+ CosNaming::NamingContext::CannotProceed,
+ CosNaming::NamingContext::InvalidName))
+{
+ return impl_->bind_new_context (n ACE_ENV_ARG_PARAMETER);
+}
+
+void
+TAO_Naming_Context::destroy (ACE_ENV_SINGLE_ARG_DECL)
+ ACE_THROW_SPEC ((CORBA::SystemException,
+ CosNaming::NamingContext::NotEmpty))
+{
+ impl_->destroy (ACE_ENV_SINGLE_ARG_PARAMETER);
+}
+
+void
+TAO_Naming_Context::list (CORBA::ULong how_many,
+ CosNaming::BindingList_out bl,
+ CosNaming::BindingIterator_out bi
+ ACE_ENV_ARG_DECL)
+ ACE_THROW_SPEC ((CORBA::SystemException))
+{
+ impl_->list (how_many, bl, bi ACE_ENV_ARG_PARAMETER);
+}
+
+void
+TAO_Naming_Context::
+to_string_helper_length (CORBA::ULong &len, const char * &src)
+{
+ for (const char *j =src; *j != '\0'; ++j)
+ {
+ ++len;
+ if (*j == '.' || *j == '\\' || *j == '/')
+ ++len;
+ }
+ ++len; // '.' seperator or '/' seperator
+
+}
+
+void
+TAO_Naming_Context::
+to_string_helper_assign (char * &k, const char * &src)
+{
+ for (; *src != '\0'; ++src)
+ {
+ if (*src == '.' || *src == '\\' || *src == '/')
+ {
+ *k = '\\';
+ ++k;
+ }
+ *k = *src;
+ ++k;
+ }
+
+}
+
+char *
+TAO_Naming_Context::to_string (const CosNaming::Name &n
+ ACE_ENV_ARG_DECL)
+ ACE_THROW_SPEC ((CORBA::SystemException,
+ CosNaming::NamingContext::InvalidName))
+{
+ // Accepts a Name and returns a stringified name.
+
+ // Check for invalid name.
+ if (n.length () == 0)
+ ACE_THROW_RETURN (CosNaming::NamingContext::InvalidName(),
+ 0);
+
+ // Length of the return string
+ CORBA::ULong len = 0;
+
+ CORBA::ULong i;
+ for (i=0; i < n.length (); ++i)
+ {
+ const char *id = n[i].id.in ();
+
+ // Count number of characters in id
+ this->to_string_helper_length (len, id);
+
+ const char *kind = n[i].kind.in ();
+
+ // Count number of characters in kind
+ this->to_string_helper_length (len, kind);
+ }
+
+ // Allocate memory to the return parameter
+ //
+ char *str_name = CORBA::string_alloc (len);
+
+ // check for memory allocation
+ //
+ if (str_name == 0)
+ {
+ ACE_THROW_RETURN (CORBA::NO_MEMORY (), 0);
+ }
+
+ char *k = str_name;
+
+ // Stringify the name
+ for (i=0; i < n.length (); ++i)
+ {
+
+ // Stringify Id
+ //
+ const char *id = n[i].id.in ();
+ this->to_string_helper_assign (k, id);
+
+ const char *kind = n[i].kind.in ();
+
+ if (*kind != '\0')
+ {
+ // If 'kind' is set,
+ // Append a seperator between the id and kind.
+ //
+ *k = '.';
+ ++k;
+
+ // Stringify Kind
+ //
+ this->to_string_helper_assign (k, kind);
+ }
+
+ // If this is not the last name component, add a seperator
+ // between the name components
+ //
+ if (i != (n.length ()-1))
+ {
+ *k = '/';
+ ++k;
+ }
+
+ }
+ // Terminate
+ *k = '\0';
+ ++k;
+
+ return str_name;
+}
+
+void
+TAO_Naming_Context::
+to_name_helper (char *dest, const char*& src, Hint hint)
+{
+ for (; *src != '\0'; ++src, ++dest)
+ {
+ if ((hint == HINT_ID && *src == '.') || *src == '/')
+ {
+ *dest = '\0';
+ return;
+ }
+
+ if (*src == '\\')
+ {
+ src++;
+ if (*src == '\0')
+ {
+ // Case: The very last component
+ *dest = '\0';
+ return;
+ }
+ }
+
+ // In all cases.
+ *dest = *src;
+ }
+
+ // Terminate.
+ *dest = '\0';
+}
+
+CosNaming::Name *
+TAO_Naming_Context::to_name (const char *sn
+ ACE_ENV_ARG_DECL)
+ ACE_THROW_SPEC ((CORBA::SystemException,
+ CosNaming::NamingContext::InvalidName))
+{
+ // Returns the Name from its stringified form.
+ CosNaming::Name n;
+
+ // Total number of name components in the name
+ CORBA::ULong ncomp = 0;
+
+ // Total length of the unstrigified name
+ CORBA::ULong len=0;
+
+
+ for (const char *j = sn; *j != '\0'; ++j)
+ {
+ // Make a pass through the Name and count each character
+ if (*j == '/')
+ {
+ ncomp++;
+ }
+ else if (*j == '\\')
+ {
+ ++j;
+
+ if (*j == '\0')
+ {
+ // Case: The very last component
+ ++len;
+ }
+ }
+
+ // In all cases.
+ ++len;
+ }
+
+
+ // Check for InvalidName i.e. Invalid stringified name
+ //
+ if (len == 0)
+ ACE_THROW_RETURN (CosNaming::NamingContext::InvalidName(),
+ 0);
+
+ // Assign the length of the return unstringified name.
+ //
+ n.length (ncomp+1);
+
+ // Keeps track of the number of the name component
+ //
+ CORBA::ULong count = 0;
+
+ for (const char *k = sn; *k != '\0';)
+ {
+ if (count > ncomp)
+ {
+ ACE_THROW_RETURN (CosNaming::NamingContext::InvalidName(), 0);
+ }
+
+ char *id = CORBA::string_alloc (len);
+ char *kind = CORBA::string_alloc (len);
+
+ // Assign to the id.
+ this->to_name_helper (id, k, HINT_ID);
+
+ if (*k == '.')
+ {
+ k++;
+ // Assign to kind
+ this->to_name_helper (kind, k, HINT_KIND);
+ }
+ else
+ {
+ *kind = '\0';
+ }
+
+ n[count].id = id;
+ n[count].kind = kind;
+
+ count++;
+
+ // End
+ if (*k == '\0')
+ break;
+ k++;
+ }
+
+ return new CosNaming::Name (n);
+}
+
+int
+TAO_Naming_Context::to_url_is_alnum_or_punctuation (char c)
+{
+ if (isalnum (c))
+ return 1;
+
+ // NON US-ASCII charcters excluding those in this array are the
+ // characters that need to be escaped
+ static char non_escaped_punctuation[] =
+ { ';', '/', ':', '?', '@', '=', '+', '$', ',', '-',
+ '_', '.', '!', '~', '*', '\'', '(', ')' };
+ const size_t non_escaped_punctuation_count =
+ sizeof(non_escaped_punctuation)/sizeof(non_escaped_punctuation[0]);
+ for (const char *j = non_escaped_punctuation;
+ j != non_escaped_punctuation + non_escaped_punctuation_count;
+ ++j)
+ {
+ // But if the character is one of the 18 non US-ASCII characters
+ // and hence need not be escaped, then don't increment the
+ // count.
+ if (*j == c)
+ return 1;
+ }
+ return 0;
+}
+
+size_t
+TAO_Naming_Context::to_url_validate_and_compute_size (
+ const char *addr,
+ const char *sn
+ ACE_ENV_ARG_DECL)
+{
+ size_t addr_len = ACE_OS::strlen (addr);
+
+ // Check for invalid address
+ if (addr_len == 0)
+ ACE_THROW_RETURN (CosNaming::NamingContextExt::InvalidAddress (),
+ 0);
+
+ // Make a pass through the in string name to count the number of
+ // characters and if the character
+ // is to be escaped, increment the number of characters by 3.
+ size_t sn_len = 0;
+ for (const char *i = sn; *i != '\0'; ++i)
+ {
+ ++sn_len;
+
+ if (TAO_Naming_Context::to_url_is_alnum_or_punctuation (*i))
+ continue;
+ sn_len += 3;
+ }
+
+ if (sn_len == 0)
+ ACE_THROW_RETURN (CosNaming::NamingContextExt::InvalidName (), 0);
+
+ return addr_len + sn_len;
+}
+
+char *
+TAO_Naming_Context::to_url (const char * addr,
+ const char * sn
+ ACE_ENV_ARG_DECL)
+ ACE_THROW_SPEC ((CORBA::SystemException,
+ CosNaming::NamingContextExt::InvalidAddress,
+ CosNaming::NamingContext::InvalidName))
+{
+ /// Compute how many characters will be required for the URL
+ size_t no_char =
+ TAO_Naming_Context::to_url_validate_and_compute_size (addr, sn
+ ACE_ENV_ARG_PARAMETER);
+ ACE_CHECK_RETURN (0);
+
+
+ // The 'corbaname:' tag is to be prepended at the starting of the
+ // return parameter.
+ //
+ char prefix []= "corbaname:";
+
+ // Allocate dynamic memory
+ //
+ char *str_url = CORBA::string_alloc (static_cast<CORBA::ULong> (no_char + sizeof (prefix)));
+
+ // Copy 'prefix' to the return parameter.
+ char *dest = ACE_OS::strcpy (str_url , prefix);
+
+ /// move to end of dest string
+ dest += ACE_OS::strlen(dest);
+
+ // Concatenate the address
+ dest = ACE_OS::strcat (dest, addr);
+
+ /// Concatenate the seperator between the addr and Name
+ dest += ACE_OS::strlen(dest);
+ dest = ACE_OS::strcat (dest, "#");
+
+ /// move to end of dest string
+ dest += ACE_OS::strlen(dest);
+
+ // Now append the stringified object name to the return variable.
+ // The percent '%' character is used as an escape. If a character
+ // that requires escaping is present in a name component it is
+ // encoded as two hexadecimal digits following a '%' character to
+ // represent the octet. The first hexadecimal character represents
+ // the low-order nibble of the octet and the second hexadecimal
+ // character represents the low order nibble.
+
+ for (const char *i = sn; *i != '\0'; ++i)
+ {
+ if (TAO_Naming_Context::to_url_is_alnum_or_punctuation (*i))
+ {
+ // If the character is a US-ASCII Alphanumeric value...
+ *dest = *i; ++dest;
+ continue;
+ }
+ // this must be an escaped character
+
+ *dest = '%'; ++dest;
+
+ // Append the hexadecimal representation of the character.
+ *dest = ACE::nibble2hex ((*i) >> 4); ++dest;
+ *dest = ACE::nibble2hex (*i); ++dest;
+ }
+
+ // Terminate the string
+ *dest = '\0';
+
+ // ACE_OS::strcat (str_url, dest);
+ return str_url;
+}
+
+CORBA::Object_ptr
+TAO_Naming_Context::resolve_str (const char * n
+ ACE_ENV_ARG_DECL)
+ ACE_THROW_SPEC ((CORBA::SystemException,
+ CosNaming::NamingContext::NotFound,
+ CosNaming::NamingContext::CannotProceed,
+ CosNaming::NamingContext::InvalidName
+ ))
+{
+ // Similar to <resolve> above. It accepts a strigified name as an
+ // argument instead of a Name.
+
+ // Get the unstrigified name.
+ CosNaming::Name_var name = this->to_name (n ACE_ENV_ARG_PARAMETER);
+ ACE_CHECK_RETURN (CORBA::Object::_nil ());
+
+ // Pass this unstringified name to resolve and return an Object_ptr
+ return this->resolve (name.in () ACE_ENV_ARG_PARAMETER);
+}
+
+TAO_Naming_Context_Impl::~TAO_Naming_Context_Impl (void)
+{
+}
+
+TAO_END_VERSIONED_NAMESPACE_DECL
diff --git a/TAO/orbsvcs/orbsvcs/Naming/Naming_Context_Interface.h b/TAO/orbsvcs/orbsvcs/Naming/Naming_Context_Interface.h
new file mode 100644
index 00000000000..54140eb5e57
--- /dev/null
+++ b/TAO/orbsvcs/orbsvcs/Naming/Naming_Context_Interface.h
@@ -0,0 +1,422 @@
+// -*- C++ -*-
+
+//=============================================================================
+/**
+ * @file Naming_Context_Interface.h
+ *
+ * $Id$
+ *
+ * @author Marina Spivak <marina@cs.wustl.edu>
+ */
+//=============================================================================
+
+#ifndef TAO_NAMING_CONTEXT_INTERFACE_H
+#define TAO_NAMING_CONTEXT_INTERFACE_H
+
+#include /**/ "ace/pre.h"
+
+#include "orbsvcs/CosNamingS.h"
+
+#include "orbsvcs/Naming/naming_serv_export.h"
+#include "ace/Null_Mutex.h"
+
+TAO_BEGIN_VERSIONED_NAMESPACE_DECL
+
+class TAO_Naming_Context_Impl;
+
+// This is to remove "inherits via dominance" warnings from MSVC.
+#if defined (_MSC_VER)
+# pragma warning (disable : 4250)
+#endif /* _MSC_VER */
+
+/**
+ * @class TAO_Naming_Context
+ *
+ * @brief This class plays a role of the 'Abstraction' (aka 'Interface')
+ * in the Bridge pattern architecture of the CosNaming::NamingContext
+ * implementation.
+ *
+ * This class simply forwards all client requests to a concrete
+ * NamingContext implementation through its <impl_> pointer. See
+ * README file for more info. Comments for the idl methods
+ * describe methods semantics - actual actions are carried out by
+ * concrete implementors.
+ */
+
+class TAO_Naming_Serv_Export TAO_Naming_Context :
+ public virtual POA_CosNaming::NamingContextExt
+{
+public:
+
+ // = Initialization and termination methods.
+ /// Constructor. Initializes <impl_> with a concrete implementation.
+ TAO_Naming_Context (TAO_Naming_Context_Impl *impl);
+
+ /// Destructor.
+ ~TAO_Naming_Context (void);
+
+ // = CosNaming::NamingContext idl interface methods.
+
+ /**
+ * Create a binding for name <n> and object <obj> in the naming
+ * context. Compound names are treated as follows: ctx->bind (<c1;
+ * c2; c3; cn>, obj) = (ctx->resolve (<c1; c2; cn-1>))->bind (<cn>,
+ * obj) if the there already exists a binding for the specified
+ * name, <AlreadyBound> exception is thrown. Naming contexts should
+ * be bound using <bind_context> and <rebind_context> in order to
+ * participate in name resolution later.
+ */
+ virtual void bind (const CosNaming::Name &n,
+ CORBA::Object_ptr obj
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS)
+ ACE_THROW_SPEC ((CORBA::SystemException,
+ CosNaming::NamingContext::NotFound,
+ CosNaming::NamingContext::CannotProceed,
+ CosNaming::NamingContext::InvalidName,
+ CosNaming::NamingContext::AlreadyBound));
+
+ /**
+ * This is similar to <bind> operation above, except for when the
+ * binding for the specified name already exists in the specified
+ * context. In that case, the existing binding is replaced with the
+ * new one.
+ */
+ virtual void rebind (const CosNaming::Name &n,
+ CORBA::Object_ptr obj
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS)
+ ACE_THROW_SPEC ((CORBA::SystemException,
+ CosNaming::NamingContext::NotFound,
+ CosNaming::NamingContext::CannotProceed,
+ CosNaming::NamingContext::InvalidName));
+
+ /**
+ * This is the version of <bind> specifically for binding naming
+ * contexts, so that they will participate in name resolution when
+ * compound names are passed to be resolved.
+ */
+ virtual void bind_context (const CosNaming::Name &n,
+ CosNaming::NamingContext_ptr nc
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS)
+ ACE_THROW_SPEC ((CORBA::SystemException,
+ CosNaming::NamingContext::NotFound,
+ CosNaming::NamingContext::CannotProceed,
+ CosNaming::NamingContext::InvalidName,
+ CosNaming::NamingContext::AlreadyBound));
+
+ /**
+ * This is a version of <rebind> specifically for naming contexts,
+ * so that they can participate in name resolution when compound
+ * names are passed.
+ */
+ virtual void rebind_context (const CosNaming::Name &n,
+ CosNaming::NamingContext_ptr nc
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS)
+ ACE_THROW_SPEC ((CORBA::SystemException,
+ CosNaming::NamingContext::NotFound,
+ CosNaming::NamingContext::CannotProceed,
+ CosNaming::NamingContext::InvalidName));
+
+ /**
+ * Return object reference that is bound to the name. Compound name
+ * resolve is defined as follows: ctx->resolve (<c1; c2; cn>) =
+ * ctx->resolve (<c1; c2 cn-1>)->resolve (<cn>) The naming service
+ * does not return the type of the object. Clients are responsible
+ * for "narrowing" the object to the appropriate type.
+ */
+ virtual CORBA::Object_ptr resolve (const CosNaming::Name &n
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS)
+ ACE_THROW_SPEC ((CORBA::SystemException,
+ CosNaming::NamingContext::NotFound,
+ CosNaming::NamingContext::CannotProceed,
+ CosNaming::NamingContext::InvalidName));
+
+ /**
+ * Remove the name binding from the context. When compound names
+ * are used, unbind is defined as follows: ctx->unbind (<c1; c2;
+ * cn>) = (ctx->resolve (<c1; c2; cn-1>))->unbind (<cn>)
+ */
+ virtual void unbind (const CosNaming::Name &n
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS)
+ ACE_THROW_SPEC ((CORBA::SystemException,
+ CosNaming::NamingContext::NotFound,
+ CosNaming::NamingContext::CannotProceed,
+ CosNaming::NamingContext::InvalidName));
+
+
+ /**
+ * This operation returns a new naming context implemented by the
+ * same naming server in which the operation was invoked. The
+ * context is not bound.
+ */
+ virtual CosNaming::NamingContext_ptr new_context (
+ ACE_ENV_SINGLE_ARG_DECL_WITH_DEFAULTS)
+ ACE_THROW_SPEC ((CORBA::SystemException));
+
+ /**
+ * This operation creates a new context and binds it to the name
+ * supplied as an argument. The newly-created context is
+ * implemented by the same server as the context in which it was
+ * bound (the name argument excluding the last component).
+ */
+ virtual CosNaming::NamingContext_ptr bind_new_context (
+ const CosNaming::Name &n
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS)
+ ACE_THROW_SPEC ((CORBA::SystemException,
+ CosNaming::NamingContext::NotFound,
+ CosNaming::NamingContext::AlreadyBound,
+ CosNaming::NamingContext::CannotProceed,
+ CosNaming::NamingContext::InvalidName));
+
+ /**
+ * Delete the naming context. The user should take care to <unbind> any
+ * bindings in which the given context is bound to some names, to
+ * avoid dangling references when invoking <destroy> operation.
+ * NOTE: <destory> is a no-op on the root context.
+ * NOTE: after <destroy> is invoked on a Naming Context, all
+ * BindingIterators associated with that Naming Context are also destroyed.
+ */
+ virtual void destroy (ACE_ENV_SINGLE_ARG_DECL_WITH_DEFAULTS)
+ ACE_THROW_SPEC ((CORBA::SystemException,
+ CosNaming::NamingContext::NotEmpty));
+
+ /**
+ * Returns at most the requested number of bindings <how_many> in
+ * <bl>. If the naming context contains additional bindings, they
+ * are returned with a BindingIterator. In the naming context does
+ * not contain any additional bindings <bi> returned as null.
+ */
+ virtual void list (CORBA::ULong how_many,
+ CosNaming::BindingList_out bl,
+ CosNaming::BindingIterator_out bi
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS)
+ ACE_THROW_SPEC ((CORBA::SystemException));
+
+ /**
+ * Stringify the name using '\' as the escape character. The
+ * characters '.' , '/' and '\' are to be escaped. If the input name
+ * is invalid i.e. if the number of characters in the name is zero,
+ * an InvalidName exception is to be raised.
+ */
+ virtual char * to_string (const CosNaming::Name &n
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS)
+ ACE_THROW_SPEC ((CORBA::SystemException,
+ CosNaming::NamingContext::InvalidName));
+
+ /**
+ * The in parameter is an stringified name. This function removes the
+ * escape character '\' and destringifies the stringified name and returns
+ * it.
+ */
+ virtual CosNaming::Name * to_name (const char *sn
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS)
+ ACE_THROW_SPEC ((CORBA::SystemException,
+ CosNaming::NamingContext::InvalidName));
+
+ /**
+ * The in parameter addr refers to the address of the naming context
+ * and sn refers to the strigified name of the object in that
+ * context. This function returns a fully formed URL string like
+ * iiopname://1.1@myhost.555xyz.com:9999/a/b/c
+ */
+ virtual char * to_url ( const char * addr,
+ const char * sn
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS
+ )
+ ACE_THROW_SPEC ((
+ CORBA::SystemException,
+ CosNaming::NamingContextExt::InvalidAddress,
+ CosNaming::NamingContext::InvalidName
+ ));
+
+ /**
+ * Similar to <resolve> as in the CosNaming::NamingContext interface.
+ * It accepts a strigified name as an argument instead of a Name.
+ */
+ virtual CORBA::Object_ptr resolve_str (const char * n
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS
+ )
+ ACE_THROW_SPEC ((
+ CORBA::SystemException,
+ CosNaming::NamingContext::NotFound,
+ CosNaming::NamingContext::CannotProceed,
+ CosNaming::NamingContext::InvalidName
+ ));
+
+ /// Returns the Default POA of this Servant object
+ virtual PortableServer::POA_ptr _default_POA (ACE_ENV_SINGLE_ARG_DECL_WITH_DEFAULTS);
+
+private:
+
+ enum Hint
+ {
+ HINT_ID,
+ HINT_KIND
+ };
+
+ /**
+ * This private function is used as a helper to <to_name>. It reads
+ * character by character from 'src' and depending on the character,
+ * either assigns it to 'dest' or returns back to the calling
+ * function. If the character is a seperator between the 'id' and
+ * 'kind' fields or a seperator between two name components, the
+ * control is returned back to the calling function <to_name>.
+ */
+ void to_name_helper (char *dest, const char*& src, Hint hint);
+
+ /**
+ * This method functions similar to <to_name_helper>. If the
+ * character read is '.' or '/' or '\', an escape character '\' is
+ * prepended before the character.
+ */
+ void to_string_helper_assign (char * &k, const char * &src);
+
+ /**
+ * This method helps count the number of characters in 'src' so
+ * that memory can be allocated for the return parameter. For
+ * all '.' , '/' and '\', the count is incremented by 'one' to
+ * account for the escape character that needs to be
+ * added. Seperators between 'id' and 'kind' as well as seperators
+ * between the name components are also counted.
+ */
+ void to_string_helper_length (CORBA::ULong &len, const char * &src);
+
+ /// Return 1 if the character is alphanumeric or a non-scaped
+ /// punctuation.
+ static int to_url_is_alnum_or_punctuation (char c);
+
+ /// Validate the to_url() method input, and compute the size of the
+ /// returned URL address.
+ static size_t to_url_validate_and_compute_size (const char *add,
+ const char *sn
+ ACE_ENV_ARG_DECL);
+
+protected:
+
+ /// A concrete implementor of the NamingContext functions.
+ TAO_Naming_Context_Impl *impl_;
+};
+
+/**
+ * @class TAO_Naming_Context_Impl
+ *
+ * @brief This abstract base class plays a role of the 'Implementor' in the Bridge
+ * pattern architecture of the NamingContext implementation.
+ *
+ * Subclasses of TAO_Naming_Context_Impl provide concrete
+ * implementations of the NamingContext functionality.
+ */
+class TAO_Naming_Serv_Export TAO_Naming_Context_Impl
+{
+
+public:
+
+ /// Destructor.
+ virtual ~TAO_Naming_Context_Impl (void);
+
+ // = CosNaming::NamingContext idl interface methods.
+
+ /**
+ * Create a binding for name <n> and object <obj> in the naming
+ * context. Compound names are treated as follows: ctx->bind (<c1;
+ * c2; c3; cn>, obj) = (ctx->resolve (<c1; c2; cn-1>))->bind (<cn>,
+ * obj) if the there already exists a binding for the specified
+ * name, <AlreadyBound> exception is thrown. Naming contexts should
+ * be bound using <bind_context> and <rebind_context> in order to
+ * participate in name resolution later.
+ */
+ virtual void bind (const CosNaming::Name &n,
+ CORBA::Object_ptr obj
+ ACE_ENV_ARG_DECL) = 0;
+
+ /**
+ * This is similar to <bind> operation above, except for when the
+ * binding for the specified name already exists in the specified
+ * context. In that case, the existing binding is replaced with the
+ * new one.
+ */
+ virtual void rebind (const CosNaming::Name &n,
+ CORBA::Object_ptr obj
+ ACE_ENV_ARG_DECL) = 0;
+
+ /**
+ * This is the version of <bind> specifically for binding naming
+ * contexts, so that they will participate in name resolution when
+ * compound names are passed to be resolved.
+ */
+ virtual void bind_context (const CosNaming::Name &n,
+ CosNaming::NamingContext_ptr nc
+ ACE_ENV_ARG_DECL) = 0;
+
+ /**
+ * This is a version of <rebind> specifically for naming contexts,
+ * so that they can participate in name resolution when compound
+ * names are passed.
+ */
+ virtual void rebind_context (const CosNaming::Name &n,
+ CosNaming::NamingContext_ptr nc
+ ACE_ENV_ARG_DECL) = 0;
+
+ /**
+ * Return object reference that is bound to the name. Compound name
+ * resolve is defined as follows: ctx->resolve (<c1; c2; cn>) =
+ * ctx->resolve (<c1; c2 cn-1>)->resolve (<cn>) The naming service
+ * does not return the type of the object. Clients are responsible
+ * for "narrowing" the object to the appropriate type.
+ */
+ virtual CORBA::Object_ptr resolve (const CosNaming::Name &n
+ ACE_ENV_ARG_DECL) = 0;
+
+ /**
+ * Remove the name binding from the context. When compound names
+ * are used, unbind is defined as follows: ctx->unbind (<c1; c2;
+ * cn>) = (ctx->resolve (<c1; c2; cn-1>))->unbind (<cn>)
+ */
+ virtual void unbind (const CosNaming::Name &n
+ ACE_ENV_ARG_DECL) = 0;
+
+ /**
+ * This operation returns a new naming context implemented by the
+ * same naming server in which the operation was invoked. The
+ * context is not bound.
+ */
+ virtual CosNaming::NamingContext_ptr new_context (ACE_ENV_SINGLE_ARG_DECL) = 0;
+
+ /**
+ * This operation creates a new context and binds it to the name
+ * supplied as an argument. The newly-created context is
+ * implemented by the same server as the context in which it was
+ * bound (the name argument excluding the last component).
+ */
+ virtual CosNaming::NamingContext_ptr bind_new_context (const CosNaming::Name &n
+ ACE_ENV_ARG_DECL) = 0;
+
+ /**
+ * Delete the naming context. The user should take care to <unbind> any
+ * bindings in which the given context is bound to some names, to
+ * avoid dangling references when invoking <destroy> operation.
+ * NOTE: <destory> is a no-op on the root context.
+ * NOTE: after <destroy> is invoked on a Naming Context, all
+ * BindingIterators associated with that Naming Context are also destroyed.
+ */
+ virtual void destroy (ACE_ENV_SINGLE_ARG_DECL) = 0;
+
+ /**
+ * Returns at most the requested number of bindings <how_many> in
+ * <bl>. If the naming context contains additional bindings, they
+ * are returned with a BindingIterator. In the naming context does
+ * not contain any additional bindings <bi> returned as null.
+ */
+ virtual void list (CORBA::ULong how_many,
+ CosNaming::BindingList_out &bl,
+ CosNaming::BindingIterator_out &bi
+ ACE_ENV_ARG_DECL) = 0;
+
+ /// Returns the Default POA of this Servant object
+ virtual PortableServer::POA_ptr _default_POA (void) = 0;
+};
+
+TAO_END_VERSIONED_NAMESPACE_DECL
+
+#include /**/ "ace/post.h"
+
+#endif /* TAO_NAMING_CONTEXT_INTERFACE_H */
diff --git a/TAO/orbsvcs/orbsvcs/Naming/Naming_Loader.cpp b/TAO/orbsvcs/orbsvcs/Naming/Naming_Loader.cpp
new file mode 100644
index 00000000000..6426cb81819
--- /dev/null
+++ b/TAO/orbsvcs/orbsvcs/Naming/Naming_Loader.cpp
@@ -0,0 +1,98 @@
+// $Id$
+
+// ================================================================
+// LIBRARY
+// libTAO_CosNaming.so
+//
+// DESCRIPTION
+// This class allows for dynamically loading
+// the Naming Service.
+//
+// AUTHORS
+// Priyanka Gontla <pgontla@ece.uci.edu>
+// Carlos O'Ryan <coryan@uci.edu>
+// ================================================================
+
+#include "orbsvcs/Naming/Naming_Loader.h"
+#include "ace/Dynamic_Service.h"
+#include "ace/Argv_Type_Converter.h"
+
+ACE_RCSID (Naming, Naming_Loader, "$Id$")
+
+
+TAO_BEGIN_VERSIONED_NAMESPACE_DECL
+
+TAO_Naming_Loader::TAO_Naming_Loader (void)
+{
+ // Constructor
+}
+
+TAO_Naming_Loader::~TAO_Naming_Loader (void)
+{
+ // Destructor
+}
+
+int
+TAO_Naming_Loader::init (int argc, ACE_TCHAR *argv[])
+{
+ ACE_DECLARE_NEW_CORBA_ENV;
+ ACE_TRY
+ {
+ // Copy command line parameter.
+ ACE_Argv_Type_Converter command_line(argc, argv);
+
+ // Initialize the ORB
+ CORBA::ORB_var orb =
+ CORBA::ORB_init (command_line.get_argc(),
+ command_line.get_ASCII_argv(),
+ 0
+ ACE_ENV_ARG_PARAMETER);
+ ACE_TRY_CHECK;
+
+ // This function call initializes the Naming Service
+ CORBA::Object_var object =
+ this->create_object (orb.in (),
+ command_line.get_argc(),
+ command_line.get_TCHAR_argv ()
+ ACE_ENV_ARG_PARAMETER);
+ ACE_TRY_CHECK;
+ }
+ ACE_CATCHANY
+ {
+ // @@ Should we log this???
+ return -1;
+ }
+ ACE_ENDTRY;
+ return 0;
+}
+
+int
+TAO_Naming_Loader::fini (void)
+{
+ // Remove the Naming Service.
+ return this->naming_server_.fini ();
+}
+
+CORBA::Object_ptr
+TAO_Naming_Loader::create_object (CORBA::ORB_ptr orb,
+ int argc,
+ ACE_TCHAR *argv[]
+ ACE_ENV_ARG_DECL_NOT_USED)
+ ACE_THROW_SPEC ((CORBA::SystemException))
+{
+ int result;
+
+ // Initializes the Naming Service. Returns -1
+ // on an error.
+ result = this->naming_server_.init_with_orb (argc,
+ argv,
+ orb);
+ if (result == -1)
+ return CORBA::Object::_nil ();
+
+ return 0;
+}
+
+TAO_END_VERSIONED_NAMESPACE_DECL
+
+ACE_FACTORY_DEFINE (TAO_Naming_Serv, TAO_Naming_Loader)
diff --git a/TAO/orbsvcs/orbsvcs/Naming/Naming_Loader.h b/TAO/orbsvcs/orbsvcs/Naming/Naming_Loader.h
new file mode 100644
index 00000000000..9f9543ce3f9
--- /dev/null
+++ b/TAO/orbsvcs/orbsvcs/Naming/Naming_Loader.h
@@ -0,0 +1,71 @@
+// -*- C++ -*-
+
+// $Id$
+
+// ============================================================================
+// FILENAME
+// Naming_Loader.h
+//
+// DESCRIPTION
+// This class loads the Naming Service dynamically
+// either from svc.conf file or <string_to_object> call.
+//
+// AUTHORS
+// Priyanka Gontla <pgontla@ece.uci.edu>
+//
+// ============================================================================
+
+#ifndef TAO_NAMING_LOADER_H
+#define TAO_NAMING_LOADER_H
+
+#include "tao/Object_Loader.h"
+
+#if !defined (ACE_LACKS_PRAGMA_ONCE)
+# pragma once
+#endif /* ACE_LACKS_PRAGMA_ONCE */
+
+#include "orbsvcs/Naming/Naming_Server.h"
+
+TAO_BEGIN_VERSIONED_NAMESPACE_DECL
+
+class TAO_Naming_Serv_Export TAO_Naming_Loader : public TAO_Object_Loader
+{
+public:
+
+ /// Constructor
+ TAO_Naming_Loader (void);
+
+ /// Destructor
+ ~TAO_Naming_Loader (void);
+
+ /// Called by the Service Configurator framework to initialize the
+ /// Event Service. Defined in <ace/Service_Config.h>
+ virtual int init (int argc, ACE_TCHAR *argv[]);
+
+ /// Called by the Service Configurator framework to remove the
+ /// Event Service. Defined in <ace/Service_Config.h>
+ virtual int fini (void);
+
+ /// This function call initializes the Naming Service given a reference to the
+ /// ORB and the command line parameters.
+ virtual CORBA::Object_ptr create_object (CORBA::ORB_ptr orb,
+ int argc,
+ ACE_TCHAR *argv[]
+ ACE_ENV_ARG_DECL)
+ ACE_THROW_SPEC ((CORBA::SystemException));
+
+
+ protected:
+ /// Instance of the TAO_Naming_Server
+ TAO_Naming_Server naming_server_;
+
+private:
+ TAO_Naming_Loader (const TAO_Naming_Loader &);
+ TAO_Naming_Loader &operator = (const TAO_Naming_Loader &);
+};
+
+TAO_END_VERSIONED_NAMESPACE_DECL
+
+ACE_FACTORY_DECLARE (TAO_Naming_Serv, TAO_Naming_Loader)
+
+#endif /* TAO_NAMING_LOADER_H */
diff --git a/TAO/orbsvcs/orbsvcs/Naming/Naming_Server.cpp b/TAO/orbsvcs/orbsvcs/Naming/Naming_Server.cpp
new file mode 100644
index 00000000000..5ea0c3bbc03
--- /dev/null
+++ b/TAO/orbsvcs/orbsvcs/Naming/Naming_Server.cpp
@@ -0,0 +1,768 @@
+// $Id$
+
+#include "orbsvcs/Naming/Naming_Server.h"
+#include "orbsvcs/Naming/Transient_Naming_Context.h"
+#include "orbsvcs/Naming/Persistent_Context_Index.h"
+#include "orbsvcs/Naming/Storable_Naming_Context.h"
+#include "orbsvcs/Naming/Storable_Naming_Context_Activator.h"
+#include "orbsvcs/Naming/Flat_File_Persistence.h"
+#include "orbsvcs/CosNamingC.h"
+
+#include "tao/debug.h"
+#include "tao/default_ports.h"
+#include "tao/ORB_Core.h"
+
+#include "tao/IORTable/IORTable.h"
+
+#if defined (TAO_HAS_CORBA_MESSAGING) && TAO_HAS_CORBA_MESSAGING != 0
+#include "tao/Messaging/Messaging.h"
+#endif
+
+#include "tao/AnyTypeCode/Any.h"
+
+#include "ace/Arg_Shifter.h"
+#include "ace/Auto_Ptr.h"
+#include "ace/Get_Opt.h"
+#include "ace/OS_NS_unistd.h"
+
+ACE_RCSID (Naming,
+ Naming_Server,
+ "$Id$")
+
+TAO_BEGIN_VERSIONED_NAMESPACE_DECL
+
+TAO_Naming_Server::TAO_Naming_Server (void)
+ : naming_context_ (),
+ ior_multicast_ (0),
+ naming_service_ior_ (),
+ context_index_ (0),
+ ior_file_name_ (0),
+ pid_file_name_ (0),
+ context_size_ (ACE_DEFAULT_MAP_SIZE),
+ persistence_file_name_ (0),
+ base_address_ (TAO_NAMING_BASE_ADDR),
+ multicast_ (0),
+ use_storable_context_ (0),
+ use_servant_activator_ (0),
+ servant_activator_ (0),
+ use_redundancy_(0),
+ round_trip_timeout_ (0),
+ use_round_trip_timeout_ (0)
+{
+}
+
+TAO_Naming_Server::TAO_Naming_Server (CORBA::ORB_ptr orb,
+ PortableServer::POA_ptr poa,
+ size_t context_size,
+ ACE_Time_Value *timeout,
+ int resolve_for_existing_naming_service,
+ const ACE_TCHAR *persistence_location,
+ void *base_addr,
+ int enable_multicast,
+ int use_storable_context,
+ int round_trip_timeout,
+ int use_round_trip_timeout)
+ : naming_context_ (),
+ ior_multicast_ (0),
+ naming_service_ior_ (),
+ context_index_ (0),
+ ior_file_name_ (0),
+ pid_file_name_ (0),
+ context_size_ (ACE_DEFAULT_MAP_SIZE),
+ persistence_file_name_ (0),
+ base_address_ (TAO_NAMING_BASE_ADDR),
+ multicast_ (0),
+ use_storable_context_ (use_storable_context),
+ use_servant_activator_ (0),
+ servant_activator_ (0),
+ use_redundancy_(0),
+ round_trip_timeout_ (0),
+ use_round_trip_timeout_ (0)
+{
+ if (this->init (orb,
+ poa,
+ context_size,
+ timeout,
+ resolve_for_existing_naming_service,
+ persistence_location,
+ base_addr,
+ enable_multicast,
+ use_storable_context,
+ round_trip_timeout,
+ use_round_trip_timeout) == -1)
+ ACE_ERROR ((LM_ERROR,
+ "(%P|%t) %p\n",
+ "TAO_Naming_Server::init"));
+}
+
+
+int
+TAO_Naming_Server::init (CORBA::ORB_ptr orb,
+ PortableServer::POA_ptr poa,
+ size_t context_size,
+ ACE_Time_Value *timeout,
+ int resolve_for_existing_naming_service,
+ const ACE_TCHAR *persistence_location,
+ void *base_addr,
+ int enable_multicast,
+ int use_storable_context,
+ int round_trip_timeout,
+ int use_round_trip_timeout)
+{
+ if (resolve_for_existing_naming_service)
+ {
+ ACE_DECLARE_NEW_CORBA_ENV;
+ ACE_TRY
+ {
+ // Try to find an existing Naming Service.
+ CORBA::Object_var naming_obj =
+ orb->resolve_initial_references ("NameService",
+ timeout
+ ACE_ENV_ARG_PARAMETER);
+ ACE_TRY_CHECK;
+
+ if (!CORBA::is_nil (naming_obj.in ()))
+ {
+ //
+ // Success in finding a Naming Service.
+ //
+ if (TAO_debug_level > 0)
+ ACE_DEBUG ((LM_DEBUG,
+ "\nNameService found!\n"));
+
+ this->naming_context_ =
+ CosNaming::NamingContext::_narrow (naming_obj.in ()
+ ACE_ENV_ARG_PARAMETER);
+ ACE_TRY_CHECK;
+
+ this->naming_service_ior_ =
+ orb->object_to_string (naming_obj.in ()
+ ACE_ENV_ARG_PARAMETER);
+ ACE_TRY_CHECK;
+
+ return 0;
+ }
+ }
+ ACE_CATCHANY
+ {
+ ACE_PRINT_EXCEPTION (ACE_ANY_EXCEPTION, "TAO_Naming_Server::init");
+ }
+ ACE_ENDTRY;
+ ACE_CHECK_RETURN (-1);
+ }
+
+ if (TAO_debug_level > 0)
+ ACE_DEBUG ((LM_DEBUG,
+ "\nWe'll become a NameService\n"));
+
+ // Become a Naming Service.
+ return this->init_new_naming (orb,
+ poa,
+ persistence_location,
+ base_addr,
+ context_size,
+ enable_multicast,
+ use_storable_context,
+ round_trip_timeout,
+ use_round_trip_timeout);
+}
+
+int
+TAO_Naming_Server::parse_args (int argc,
+ ACE_TCHAR *argv[])
+{
+ ACE_Get_Opt get_opts (argc, argv, ACE_TEXT("b:do:p:s:f:m:u:r:z:"));
+
+ int c;
+ int size, result;
+
+ // This is declared this way to avoid warnings from
+ // some compilers that complain about mismatching types
+ // in the sscanf.
+#if ACE_SIZEOF_VOID_P == ACE_SIZEOF_LONG_LONG
+ ptrdiff_t address;
+#else
+ long int address;
+#endif /* ACE_SIZEOF_VOID_P */
+
+ // Make sure only one persistence option is specified
+ int f_opt_used = 0;
+ int u_opt_used = 0;
+ int r_opt_used = 0;
+
+ while ((c = get_opts ()) != -1)
+ switch (c)
+ {
+ case 'd': // debug flag.
+ TAO_debug_level++;
+ break;
+ case 'o': // outputs the naming service ior to a file.
+ this->ior_file_name_ = get_opts.opt_arg ();
+ break;
+ case 'p':
+ this->pid_file_name_ = get_opts.opt_arg ();
+ break;
+ case 's':
+ size = ACE_OS::atoi (get_opts.opt_arg ());
+ if (size >= 0)
+ this->context_size_ = size;
+ break;
+ case 'b':
+ result = ::sscanf (ACE_TEXT_ALWAYS_CHAR (get_opts.opt_arg ()),
+#if ACE_SIZEOF_VOID_P == ACE_SIZEOF_LONG_LONG
+ ACE_INT64_FORMAT_SPECIFIER,
+#else
+ "%ld",
+#endif /* ACE_SIZEOF_VOID_P */
+ &address);
+ if (result == 0 || result == EOF)
+ ACE_ERROR_RETURN ((LM_ERROR,
+ "Unable to process <-b> option"),
+ -1);
+ this->base_address_ = (void *) address;
+ break;
+ case 'm':
+ this->multicast_ = ACE_OS::atoi(get_opts.opt_arg ());
+ break;
+ case 'f':
+ this->persistence_file_name_ = get_opts.opt_arg ();
+ f_opt_used = 1;
+ break;
+ case 'r':
+ this->use_redundancy_ = 1;
+ this->use_storable_context_ = 1;
+ this->persistence_file_name_ = get_opts.opt_arg ();
+ r_opt_used = 1;
+ break;
+ case 'u':
+ this->use_storable_context_ = 1;
+ this->persistence_file_name_ = get_opts.opt_arg ();
+ u_opt_used = 1;
+ break;
+ case 'z':
+ this->use_round_trip_timeout_ = 1;
+ this->round_trip_timeout_ = (int)1.0e7 * ACE_OS::atoi (get_opts.opt_arg ());
+ break;
+ case '?':
+ default:
+ ACE_ERROR_RETURN ((LM_ERROR,
+ ACE_TEXT ("usage: %s ")
+ ACE_TEXT ("-d ")
+ ACE_TEXT ("-o <ior_output_file> ")
+ ACE_TEXT ("-p <pid_file_name> ")
+ ACE_TEXT ("-s <context_size> ")
+ ACE_TEXT ("-b <base_address> ")
+ ACE_TEXT ("-m <1=enable multicast, 0=disable multicast(default) ")
+ ACE_TEXT ("-f <persistence_file_name> ")
+ ACE_TEXT ("-u <storable_persistence_directory (not used with -f)> ")
+ ACE_TEXT ("-r <redundant_persistence_directory> ")
+ ACE_TEXT ("-z <relative round trip timeout> ")
+ ACE_TEXT ("\n"),
+ argv [0]),
+ -1);
+ }
+
+ if (f_opt_used + u_opt_used + r_opt_used > 1)
+ ACE_ERROR_RETURN ((LM_ERROR,
+ ACE_TEXT ("Only one persistence option can be passed")
+ ACE_TEXT ("\n")),
+ -1);
+
+ return 0;
+}
+
+int
+TAO_Naming_Server::init_with_orb (int argc,
+ ACE_TCHAR *argv [],
+ CORBA::ORB_ptr orb)
+{
+ int result;
+
+ ACE_DECLARE_NEW_CORBA_ENV;
+ ACE_TRY
+ {
+ // Duplicate the ORB
+ this->orb_ = CORBA::ORB::_duplicate (orb);
+
+ // Get the POA from the ORB.
+ CORBA::Object_var poa_object =
+ orb->resolve_initial_references ("RootPOA" ACE_ENV_ARG_PARAMETER);
+ ACE_TRY_CHECK;
+
+ if (CORBA::is_nil (poa_object.in ()))
+ {
+ ACE_ERROR_RETURN ((LM_ERROR,
+ ACE_TEXT(" (%P|%t) Unable to initialize the POA.\n")),
+ -1);
+ }
+
+ // Check the non-ORB arguments. this needs to come before we
+ // initialize my_naming_server so that we can pass on some of
+ // the command-line arguments.
+ result = this->parse_args (argc, argv);
+
+ if (result < 0)
+ return result;
+
+ // Get the POA object.
+ this->root_poa_ = PortableServer::POA::_narrow (poa_object.in ()
+ ACE_ENV_ARG_PARAMETER);
+ ACE_TRY_CHECK;
+
+ // Get the POA_Manager.
+ PortableServer::POAManager_var poa_manager =
+ this->root_poa_->the_POAManager (ACE_ENV_SINGLE_ARG_PARAMETER);
+ ACE_TRY_CHECK;
+
+ poa_manager->activate (ACE_ENV_SINGLE_ARG_PARAMETER);
+ ACE_TRY_CHECK;
+
+ int numPolicies = 2;
+#if (TAO_HAS_MINIMUM_POA == 0)
+ if (this->use_storable_context_)
+ {
+ this->use_servant_activator_ = 1;
+ }
+
+ if (this->use_servant_activator_) {
+ numPolicies += 2;
+ }
+#endif /* TAO_HAS_MINIMUM_POA */
+
+ CORBA::PolicyList policies (numPolicies);
+ policies.length (numPolicies);
+
+ // Id Assignment policy
+ policies[0] =
+ this->root_poa_->create_id_assignment_policy (PortableServer::USER_ID
+ ACE_ENV_ARG_PARAMETER);
+ ACE_TRY_CHECK;
+
+ // Lifespan policy
+ policies[1] =
+ this->root_poa_->create_lifespan_policy (PortableServer::PERSISTENT
+ ACE_ENV_ARG_PARAMETER);
+ ACE_TRY_CHECK;
+
+#if (TAO_HAS_MINIMUM_POA == 0)
+ if (this->use_servant_activator_)
+ {
+ // Request Processing Policy
+ policies[2] =
+ this->root_poa_->create_request_processing_policy (PortableServer::USE_SERVANT_MANAGER
+ ACE_ENV_ARG_PARAMETER);
+ ACE_TRY_CHECK;
+
+ // Servant Retention Policy
+ policies[3] =
+ this->root_poa_->create_servant_retention_policy (PortableServer::RETAIN
+ ACE_ENV_ARG_PARAMETER);
+ ACE_TRY_CHECK;
+ }
+#endif /* TAO_HAS_MINIMUM_POA */
+
+ // We use a different POA, otherwise the user would have to change
+ // the object key each time it invokes the server.
+ this->ns_poa_ = this->root_poa_->create_POA ("NameService",
+ poa_manager.in (),
+ policies
+ ACE_ENV_ARG_PARAMETER);
+ // Warning! If create_POA fails, then the policies won't be
+ // destroyed and there will be hell to pay in memory leaks!
+ ACE_TRY_CHECK;
+
+ // Creation of the new POAs over, so destroy the Policy_ptr's.
+ for (CORBA::ULong i = 0;
+ i < policies.length ();
+ ++i)
+ {
+ CORBA::Policy_ptr policy = policies[i];
+ policy->destroy (ACE_ENV_SINGLE_ARG_PARAMETER);
+ ACE_TRY_CHECK;
+ }
+
+ result = this->init (orb,
+ this->ns_poa_.in (),
+ this->context_size_,
+ 0,
+ 0,
+ this->persistence_file_name_,
+ this->base_address_,
+ this->multicast_,
+ this->use_storable_context_,
+ this->round_trip_timeout_,
+ this->use_round_trip_timeout_);
+ if (result == -1)
+ return result;
+ }
+ ACE_CATCHANY
+ {
+ ACE_PRINT_EXCEPTION (ACE_ANY_EXCEPTION, "TAO_Naming_Server::init_with_orb");
+ return -1;
+ }
+ ACE_ENDTRY;
+ ACE_CHECK_RETURN (-1);
+
+ if (this->ior_file_name_ != 0)
+ {
+ FILE *iorf = ACE_OS::fopen (this->ior_file_name_, ACE_TEXT("w"));
+ if (iorf == 0)
+ {
+ ACE_ERROR_RETURN ((LM_ERROR,
+ ACE_TEXT("Unable to open %s for writing:(%u) %p\n"),
+ this->ior_file_name_,
+ errno,
+ ACE_TEXT("TAO_Naming_Server::init_with_orb")),
+ -1);
+ }
+
+ CORBA::String_var str = this->naming_service_ior ();
+
+ ACE_OS::fprintf (iorf, "%s\n", str.in ());
+ ACE_OS::fclose (iorf);
+ }
+
+ if (this->pid_file_name_ != 0)
+ {
+ FILE *pidf = ACE_OS::fopen (this->pid_file_name_, ACE_TEXT("w"));
+ if (pidf != 0)
+ {
+ ACE_OS::fprintf (pidf,
+ "%ld\n",
+ static_cast<long> (ACE_OS::getpid ()));
+ ACE_OS::fclose (pidf);
+ }
+ }
+
+ return 0;
+}
+
+int
+TAO_Naming_Server::init_new_naming (CORBA::ORB_ptr orb,
+ PortableServer::POA_ptr poa,
+ const ACE_TCHAR *persistence_location,
+ void *base_addr,
+ size_t context_size,
+ int enable_multicast,
+ int use_storable_context,
+ int round_trip_timeout,
+ int use_round_trip_timeout)
+{
+ ACE_DECLARE_NEW_CORBA_ENV;
+ ACE_TRY
+ {
+ if (use_storable_context)
+ {
+ // In lieu of a fully implemented service configurator version
+ // of this Reader and Writer, let's just take something off the
+ // command line for now.
+ TAO_Naming_Service_Persistence_Factory* pf = 0;
+ ACE_NEW_RETURN(pf, TAO_NS_FlatFileFactory, -1);
+ auto_ptr<TAO_Naming_Service_Persistence_Factory> persFactory(pf);
+ // This instance will either get deleted after recreate all or,
+ // in the case of a servant activator's use, on destruction of the
+ // activator.
+
+ // Was a location specified?
+ if (persistence_location == 0)
+ {
+ // No, assign the default location "NameService"
+ persistence_location = ACE_TEXT("NameService");
+ }
+
+ // Now make sure this directory exists
+ if (ACE_OS::access (persistence_location, W_OK|X_OK))
+ {
+ ACE_ERROR ((LM_ERROR, "Invalid persistence directory\n"));
+ return -1;
+ }
+
+#if (TAO_HAS_MINIMUM_POA == 0)
+ if (this->use_servant_activator_)
+ {
+ ACE_NEW_THROW_EX (this->servant_activator_,
+ TAO_Storable_Naming_Context_Activator (orb,
+ persFactory.get(),
+ persistence_location,
+ context_size),
+ CORBA::NO_MEMORY ());
+ this->ns_poa_->set_servant_manager(this->servant_activator_);
+ }
+#endif /* TAO_HAS_MINIMUM_POA */
+
+ this->naming_context_ =
+ TAO_Storable_Naming_Context::recreate_all (orb,
+ poa,
+ TAO_ROOT_NAMING_CONTEXT,
+ context_size,
+ 0,
+ persFactory.get(),
+ persistence_location,
+ use_redundancy_
+ ACE_ENV_ARG_PARAMETER);
+ ACE_TRY_CHECK;
+
+ if (this->use_servant_activator_)
+ persFactory.release();
+ }
+ else if (persistence_location != 0)
+ //
+ // Initialize Persistent Naming Service.
+ //
+ {
+ // Allocate and initialize Persistent Context Index.
+ ACE_NEW_RETURN (this->context_index_,
+ TAO_Persistent_Context_Index (orb, poa),
+ -1);
+
+ if (this->context_index_->open (persistence_location,
+ base_addr) == -1
+ || this->context_index_->init (context_size) == -1)
+ {
+ if (TAO_debug_level >0)
+ ACE_DEBUG ((LM_DEBUG,
+ "TAO_Naming_Server: context_index initialization failed\n"));
+ return -1;
+ }
+
+ // Set the root Naming Context reference.
+ this->naming_context_ =
+ this->context_index_->root_context ();
+ }
+ else
+ {
+ //
+ // Initialize Transient Naming Service.
+ //
+ this->naming_context_ =
+ TAO_Transient_Naming_Context::make_new_context (poa,
+ TAO_ROOT_NAMING_CONTEXT,
+ context_size
+ ACE_ENV_ARG_PARAMETER);
+ ACE_TRY_CHECK;
+
+ }
+
+ // Register with the ORB's resolve_initial_references()
+ // mechanism. Primarily useful for dynamically loaded Name
+ // Services.
+ orb->register_initial_reference ("NameService",
+ this->naming_context_.in ()
+ ACE_ENV_ARG_PARAMETER);
+ ACE_TRY_CHECK;
+
+ // Set the ior of the root Naming Context.
+ this->naming_service_ior_=
+ orb->object_to_string (this->naming_context_.in ()
+ ACE_ENV_ARG_PARAMETER);
+ ACE_TRY_CHECK;
+
+ CORBA::Object_var table_object =
+ orb->resolve_initial_references ("IORTable" ACE_ENV_ARG_PARAMETER);
+ ACE_TRY_CHECK;
+
+ IORTable::Table_var adapter =
+ IORTable::Table::_narrow (table_object.in () ACE_ENV_ARG_PARAMETER);
+ ACE_TRY_CHECK;
+ if (CORBA::is_nil (adapter.in ()))
+ {
+ ACE_ERROR ((LM_ERROR, "Nil IORTable\n"));
+ }
+ else
+ {
+ CORBA::String_var ior =
+ orb->object_to_string (this->naming_context_.in ()
+ ACE_ENV_ARG_PARAMETER);
+ ACE_TRY_CHECK;
+ adapter->bind ("NameService", ior.in () ACE_ENV_ARG_PARAMETER);
+ ACE_TRY_CHECK;
+ }
+
+#if defined (ACE_HAS_IP_MULTICAST)
+ if (enable_multicast)
+ {
+ // @@ Marina: is there anyway to implement this stuff
+ // without using ORB_Core_instance()? For example can you
+ // pass the ORB as an argument?
+
+ //
+ // Install ior multicast handler.
+ //
+ // Get reactor instance from TAO.
+ ACE_Reactor *reactor = orb->orb_core()->reactor ();
+
+ // See if the -ORBMulticastDiscoveryEndpoint option was specified.
+ ACE_CString mde (orb->orb_core ()->orb_params ()->mcast_discovery_endpoint ());
+
+ // First, see if the user has given us a multicast port number
+ // on the command-line;
+ u_short port =
+ orb->orb_core ()->orb_params ()->service_port (TAO::MCAST_NAMESERVICE);
+
+ if (port == 0)
+ {
+ // Check environment var. for multicast port.
+ const char *port_number =
+ ACE_OS::getenv ("NameServicePort");
+
+ if (port_number != 0)
+ port = static_cast<u_short> (ACE_OS::atoi (port_number));
+ }
+
+ // Port wasn't specified on the command-line or in environment -
+ // use the default.
+ if (port == 0)
+ port = TAO_DEFAULT_NAME_SERVER_REQUEST_PORT;
+
+ // Instantiate a handler which will handle client requests for
+ // the root Naming Context ior, received on the multicast port.
+ ACE_NEW_RETURN (this->ior_multicast_,
+ TAO_IOR_Multicast (),
+ -1);
+
+ if (mde.length () != 0)
+ {
+ if (this->ior_multicast_->init (this->naming_service_ior_.in (),
+ mde.c_str (),
+ TAO_SERVICEID_NAMESERVICE) == -1)
+ return -1;
+ }
+ else
+ {
+ if (this->ior_multicast_->init (this->naming_service_ior_.in (),
+ port,
+ ACE_DEFAULT_MULTICAST_ADDR,
+ TAO_SERVICEID_NAMESERVICE) == -1)
+ return -1;
+ }
+
+ // Register event handler for the ior multicast.
+ if (reactor->register_handler (this->ior_multicast_,
+ ACE_Event_Handler::READ_MASK) == -1)
+ {
+ if (TAO_debug_level > 0)
+ ACE_DEBUG ((LM_DEBUG,
+ "TAO_Naming_Server: cannot register Event handler\n"));
+ return -1;
+ }
+
+ if (TAO_debug_level > 0)
+ ACE_DEBUG ((LM_DEBUG,
+ "TAO_Naming_Server: The multicast server setup is done.\n"));
+ }
+#else
+ ACE_UNUSED_ARG (enable_multicast);
+#endif /* ACE_HAS_IP_MULTICAST */
+
+#if defined (TAO_HAS_CORBA_MESSAGING) && TAO_HAS_CORBA_MESSAGING != 0
+ if (use_round_trip_timeout == 1)
+ {
+ TimeBase::TimeT roundTripTimeoutVal = round_trip_timeout;
+ CORBA::Any anyObjectVal;
+ anyObjectVal <<= roundTripTimeoutVal;
+ CORBA::PolicyList polList (1);
+ polList.length (1);
+ polList[0] = orb->create_policy (Messaging::RELATIVE_RT_TIMEOUT_POLICY_TYPE,
+ anyObjectVal);
+ ACE_TRY_CHECK;
+
+ // set a timeout on the orb
+ //
+ CORBA::Object_var orbPolicyManagerObj =
+ orb->resolve_initial_references ("ORBPolicyManager"
+ ACE_ENV_ARG_PARAMETER);
+ ACE_TRY_CHECK;
+
+ CORBA::PolicyManager_var orbPolicyManager =
+ CORBA::PolicyManager::_narrow (orbPolicyManagerObj.in ());
+ ACE_TRY_CHECK;
+ orbPolicyManager->set_policy_overrides (polList, CORBA::SET_OVERRIDE);
+
+ polList[0]->destroy ();
+ ACE_TRY_CHECK;
+ polList[0] = CORBA::Policy::_nil ();
+ }
+#else
+ ACE_UNUSED_ARG (use_round_trip_timeout);
+#endif /* TAO_HAS_CORBA_MESSAGING */
+ }
+ ACE_CATCHANY
+ {
+ ACE_PRINT_EXCEPTION (ACE_ANY_EXCEPTION, "TAO_Naming_Server::init_new_naming");
+ return -1;
+ }
+ ACE_ENDTRY;
+ ACE_CHECK_RETURN (-1);
+
+ return 0;
+}
+
+int
+TAO_Naming_Server::fini (void)
+{
+ // Destroy the child POA ns_poa that is created when initializing
+ // the Naming Service
+ ACE_TRY_NEW_ENV
+ {
+ this->ns_poa_->destroy (1, 1 ACE_ENV_ARG_PARAMETER);
+ ACE_TRY_CHECK;
+
+
+ CORBA::Object_var table_object =
+ this->orb_->resolve_initial_references ("IORTable"
+ ACE_ENV_ARG_PARAMETER);
+ ACE_TRY_CHECK;
+
+ IORTable::Table_var adapter =
+ IORTable::Table::_narrow (table_object.in () ACE_ENV_ARG_PARAMETER);
+ ACE_TRY_CHECK;
+ if (CORBA::is_nil (adapter.in ()))
+ {
+ ACE_ERROR ((LM_ERROR, "Nil IORTable\n"));
+ }
+ else
+ {
+ adapter->unbind ("NameService" ACE_ENV_ARG_PARAMETER);
+ ACE_TRY_CHECK;
+ }
+ }
+ ACE_CATCHANY
+ {
+ // Ignore
+ }
+ ACE_ENDTRY;
+
+
+ if (this->ior_multicast_ != 0)
+ {
+ orb_->orb_core()->reactor ()->remove_handler (this->ior_multicast_,
+ ACE_Event_Handler::READ_MASK | ACE_Event_Handler::DONT_CALL);
+ delete this->ior_multicast_;
+ }
+
+ delete this->context_index_;
+
+ return 0;
+}
+
+char*
+TAO_Naming_Server::naming_service_ior (void)
+{
+ return CORBA::string_dup (this->naming_service_ior_.in ());
+}
+
+CosNaming::NamingContext_ptr
+TAO_Naming_Server::operator-> (void) const
+{
+ return this->naming_context_.ptr ();
+}
+
+TAO_Naming_Server::~TAO_Naming_Server (void)
+{
+#if (TAO_HAS_MINIMUM_POA == 0)
+ if (this->use_servant_activator_)
+ delete this->servant_activator_;
+#endif /* TAO_HAS_MINIMUM_POA */
+}
+
+TAO_END_VERSIONED_NAMESPACE_DECL
diff --git a/TAO/orbsvcs/orbsvcs/Naming/Naming_Server.h b/TAO/orbsvcs/orbsvcs/Naming/Naming_Server.h
new file mode 100644
index 00000000000..5d7c3919fb6
--- /dev/null
+++ b/TAO/orbsvcs/orbsvcs/Naming/Naming_Server.h
@@ -0,0 +1,239 @@
+// -*- C++ -*-
+
+//=============================================================================
+/**
+ * @file Naming_Server.h
+ *
+ * $Id$
+ *
+ * Implement wrappers useful to Naming Service servers.
+ *
+ *
+ * @author Nagarajan Surendran (naga@cs.wustl.edu)
+ * @author Matt Braun <mjb2@cs.wustl.edu>
+ * @author Douglas C. Schmidt <schmidt@cs.wustl.edu>.
+ */
+//=============================================================================
+
+
+#ifndef TAO_NAMING_SERVER_H
+#define TAO_NAMING_SERVER_H
+#include /**/ "ace/pre.h"
+
+#include "tao/ORB.h"
+#include "orbsvcs/CosNamingC.h"
+#include "orbsvcs/IOR_Multicast.h"
+#include "orbsvcs/Naming/Naming_Context_Interface.h"
+#include "orbsvcs/Naming/nsconf.h"
+
+TAO_BEGIN_VERSIONED_NAMESPACE_DECL
+
+// Forward decl;
+class TAO_Persistent_Context_Index;
+class TAO_Storable_Naming_Context_Activator;
+
+/**
+ * @class TAO_Naming_Server
+ *
+ * @brief Defines a wrapper class that holds the root Naming Context.
+ *
+ * This class either finds an existing Naming Service (if the
+ * <resolve_for_existing_naming_service> flag is set) or creates
+ * one (if <resolve_for_existing_naming_service> flag isn't set or
+ * Naming Service was not found). This class also defines the
+ * operator-> so that <NamingContext> functions like <bind>,
+ * <unbind> .. can be called directly on a <TAO_Naming_Server>
+ * object, and be forwareded to the root Naming Context.
+ * This class is intended to simplify
+ * programs that want to play the role of a Naming Service
+ * server. To simplify programs that want to play the role of
+ * Naming Service clients, use <TAO_Naming_Client>.
+ * If a Naming Service is created locally, a TAO_IOR_Multicast
+ * event handler is created and installed on the ORB's reactor.
+ * This event handler allows other clients on the network to
+ * discover and use this Naming Service.
+ * Event handler listens on a multicast port for messages from
+ * clients looking for a Naming Service, and sends back the ior
+ * of the root Naming Context. For more information on how this
+ * bootstraping through a multicast process works, check out
+ * orbsvcs/orbsvcs/TAO_IOR_Multicast.*, implementation of
+ * <resolve_initial_references>, and orbsvcs/Naming/README.
+ */
+class TAO_Naming_Serv_Export TAO_Naming_Server
+{
+public:
+ /// Default constructor.
+ TAO_Naming_Server (void);
+
+ /**
+ * Constructor. Attempts to find an existing Naming Service if
+ * <resolve_for_existing_naming_service> is set to true. If it is
+ * false, or no Naming Service was found during a <timeout> period,
+ * create the Naming Service in this process. If creating the
+ * Naming Service locally, make the root context of size
+ * <context_size>, register it under the <poa>, and make the Naming
+ * Service persistent if <persistence_location> is not 0.
+ * (<persistence_location> specifies name of the file to use for
+ * persistent storage, <base_addr> specifies the address used for
+ * memory mapping <persistent_location> file).
+ * If <enable_multicast> is not zero then the service will respond
+ * to multicast location queries.
+ */
+ TAO_Naming_Server (CORBA::ORB_ptr orb,
+ PortableServer::POA_ptr poa,
+ size_t context_size = ACE_DEFAULT_MAP_SIZE,
+ ACE_Time_Value *timeout = 0,
+ int resolve_for_existing_naming_service = 1,
+ const ACE_TCHAR *persistence_location = 0,
+ void *base_addr = TAO_NAMING_BASE_ADDR,
+ int enable_multicast = 1,
+ int use_storable_context = 0,
+ int round_trip_timeout = 0,
+ int use_round_trip_timeout = 0);
+
+ /**
+ * Initializer. Attempts to find an existing Naming Service if
+ * <resolve_for_existing_naming_service> is set to true. If it is
+ * false, or no Naming Service was found during a <timeout> period,
+ * create the Naming Service in this process. If creating the
+ * Naming Service locally, make the root context of size
+ * <context_size>, register it under the <poa>, and make the Naming
+ * Service persistent if <persistence_location> is not 0.
+ * (<persistence_location> specifies name of the file to use for
+ * persistent storage, <base_addr> specifies the address used for
+ * memory mapping <persistent_location> file).
+ * If <enable_multicast> is not zero then the service will respond
+ * to multicast location queries.
+ */
+ int init (CORBA::ORB_ptr orb,
+ PortableServer::POA_ptr poa,
+ size_t context_size = ACE_DEFAULT_MAP_SIZE,
+ ACE_Time_Value *timeout = 0,
+ int resolve_for_existing_naming_service = 1,
+ const ACE_TCHAR *persistence_location = 0,
+ void *base_addr = TAO_NAMING_BASE_ADDR,
+ int enable_multicast = 1,
+ int use_storable_context = 0,
+ int round_trip_timeout = 0,
+ int use_round_trip_timeout = 0);
+
+ /// Initialize the Naming Service with the command line arguments and
+ /// the ORB.
+ int init_with_orb (int argc,
+ ACE_TCHAR *argv [],
+ CORBA::ORB_ptr orb);
+
+ /// Destroy the child POA created in <init_with_orb>
+ int fini (void);
+
+ /// Destructor.
+ ~TAO_Naming_Server (void);
+
+ /// Returns the IOR of the naming service.
+ char * naming_service_ior (void);
+
+ /// Returns a <NamingContext_ptr> for the root Naming Context.
+ CosNaming::NamingContext_ptr operator-> (void) const;
+
+protected:
+ /**
+ * Helper method: create Naming Service locally.
+ * Make the root context of size
+ * <context_size>, register it under the <root_poa>, and make the Naming
+ * Service persistent if <persistence_location> is not 0.
+ * (<persistence_location> specifies name of the file to use for
+ * persistent storage).
+ * If <enable_multicast> is not zero then the service will respond
+ * to multicast location queries.
+ */
+ int init_new_naming (CORBA::ORB_ptr orb,
+ PortableServer::POA_ptr root_poa,
+ const ACE_TCHAR *persistence_location,
+ void *base_addr,
+ size_t context_size,
+ int enable_multicast,
+ int use_storable_context,
+ int round_trip_timeout = 0,
+ int use_round_trip_timeout = 0);
+
+ /// parses the arguments.
+ int parse_args (int argc, ACE_TCHAR *argv[]);
+
+ /// Root NamingContext_ptr.
+ CosNaming::NamingContext_var naming_context_;
+
+ /// The ior_multicast event handler.
+ TAO_IOR_Multicast *ior_multicast_;
+
+ /// The IOR string of the root naming context.
+ CORBA::String_var naming_service_ior_;
+
+ /**
+ * Pointer to the object used to create/initialize
+ * the Naming Service when local persistent Naming Service is
+ * desired.
+ */
+ TAO_Persistent_Context_Index *context_index_;
+
+ /// The ORB
+ CORBA::ORB_var orb_;
+
+ /// The Root POA.
+ PortableServer::POA_var root_poa_;
+
+ /// The Naming Service POA.
+ PortableServer::POA_var ns_poa_;
+
+ /// File to output the Naming Service IOR.
+ const ACE_TCHAR *ior_file_name_;
+
+ /// File to output the process id.
+ const ACE_TCHAR *pid_file_name_;
+
+ /**
+ * Size of the hash_table allocated upon the creation of the Naming
+ * Service context (if one is created). Note: all the contexts
+ * created under the given context will use the same size for their
+ * initial hash table allocations.
+ */
+ size_t context_size_;
+
+ /// Path to the file to be used to store/read in Naming Service
+ /// persistent state.
+ const ACE_TCHAR *persistence_file_name_;
+
+ /// Address to be used for memory mapping Naming Service state file,
+ /// identified by the <persistence_file_name_>.
+ void *base_address_;
+
+ /// If not zero multicast is enabled.
+ int multicast_;
+
+ /// If not zero use flat file persistence
+ int use_storable_context_;
+
+ /**
+ * If not zero use servant activator that uses flat file persistence.
+ */
+ int use_servant_activator_;
+
+ /**
+ * Need to retain the servant activator between calls to
+ * init_with_orb() and init_new_naming().
+ */
+ TAO_Storable_Naming_Context_Activator *servant_activator_;
+
+ /**
+ * If not zero support redundant naming servers.
+ */
+ int use_redundancy_;
+
+ // If not zero use round trip timeout policy set to value specified
+ int round_trip_timeout_;
+ int use_round_trip_timeout_;
+};
+
+TAO_END_VERSIONED_NAMESPACE_DECL
+
+#include /**/ "ace/post.h"
+#endif /* TAO_NAMING_SERVER_H */
diff --git a/TAO/orbsvcs/orbsvcs/Naming/Naming_Service_Container.cpp b/TAO/orbsvcs/orbsvcs/Naming/Naming_Service_Container.cpp
new file mode 100644
index 00000000000..a9d8fd2b50b
--- /dev/null
+++ b/TAO/orbsvcs/orbsvcs/Naming/Naming_Service_Container.cpp
@@ -0,0 +1,392 @@
+// $Id$
+// ============================================================================
+//
+// = LIBRARY
+// cos
+//
+// = FILENAME
+// Naming_Service_Container.cpp
+//
+// = AUTHOR
+// Bruce Trask <trask_b@ociweb.com>
+//
+// ============================================================================
+
+
+#ifndef NS_CONTAINER_CPP
+#define NS_CONTAINER_CPP
+
+#include "ace/Malloc_Base.h"
+
+#if !defined (ACE_LACKS_PRAGMA_ONCE)
+# pragma once
+#endif /* ACE_LACKS_PRAGMA_ONCE */
+
+#include "orbsvcs/Naming/Naming_Service_Container.h"
+
+TAO_BEGIN_VERSIONED_NAMESPACE_DECL
+
+ACE_ALLOC_HOOK_DEFINE(ACE_NS_Node)
+
+# if ! defined (ACE_HAS_BROKEN_NOOP_DTORS)
+template <class T>
+ACE_NS_Node<T>::~ACE_NS_Node (void)
+{
+}
+# endif /* ! defined (ACE_HAS_BROKEN_NOOP_DTORS) */
+
+template <class T>
+ACE_NS_Node<T>::ACE_NS_Node (const T &i, ACE_NS_Node<T> *n)
+ : next_ (n),
+ item_ (i)
+{
+ // ACE_TRACE ("ACE_NS_Node<T>::ACE_NS_Node");
+}
+
+template <class T>
+ACE_NS_Node<T>::ACE_NS_Node (ACE_NS_Node<T> *n, int)
+ : next_ (n)
+{
+ // ACE_TRACE ("ACE_NS_Node<T>::ACE_NS_Node");
+}
+
+template <class T>
+ACE_NS_Node<T>::ACE_NS_Node (const ACE_NS_Node<T> &s)
+ : next_ (s.next_),
+ item_ (s.item_)
+{
+ // ACE_TRACE ("ACE_NS_Node<T>::ACE_NS_Node");
+}
+
+
+ACE_ALLOC_HOOK_DEFINE(ACE_Unbounded_List)
+
+ template <class T> size_t
+ACE_Unbounded_List<T>::size (void) const
+{
+ // ACE_TRACE ("ACE_Unbounded_List<T>::size");
+ return this->cur_size_;
+}
+
+template <class T> int
+ACE_Unbounded_List<T>::insert_tail (const T &item)
+{
+ ACE_NS_Node<T> *temp;
+
+ // Insert <item> into the old dummy node location.
+ this->head_->item_ = item;
+
+ // Create a new dummy node.
+ ACE_NEW_MALLOC_RETURN (temp,
+ (ACE_NS_Node<T>*) this->allocator_->malloc (sizeof (ACE_NS_Node<T>)),
+ ACE_NS_Node<T> (this->head_->next_),
+ -1);
+ // Link this pointer into the list.
+ this->head_->next_ = temp;
+
+ // Point the head to the new dummy node.
+ this->head_ = temp;
+
+ this->cur_size_++;
+ return 0;
+}
+
+template <class T> void
+ACE_Unbounded_List<T>::reset (void)
+{
+ ACE_TRACE ("reset");
+
+ this->delete_nodes ();
+}
+
+template <class T> void
+ACE_Unbounded_List<T>::dump (void) const
+{
+ ACE_TRACE ("ACE_Unbounded_List<T>::dump");
+
+ ACE_DEBUG ((LM_DEBUG, ACE_BEGIN_DUMP, this));
+ ACE_DEBUG ((LM_DEBUG, ACE_TEXT ("\nhead_ = %u"), this->head_));
+ ACE_DEBUG ((LM_DEBUG, ACE_TEXT ("\nhead_->next_ = %u"), this->head_->next_));
+ ACE_DEBUG ((LM_DEBUG, ACE_TEXT ("\ncur_size_ = %d\n"), this->cur_size_));
+
+ T *item = 0;
+#if !defined (ACE_NLOGGING)
+ size_t count = 1;
+#endif /* ! ACE_NLOGGING */
+
+ for (ACE_Unbounded_List_Iterator<T> iter (*(ACE_Unbounded_List<T> *) this);
+ iter.next (item) != 0;
+ iter.advance ())
+ ACE_DEBUG ((LM_DEBUG, ACE_TEXT ("count = %d\n"), count++));
+
+ ACE_DEBUG ((LM_DEBUG, ACE_END_DUMP));
+}
+
+template <class T> void
+ACE_Unbounded_List<T>::copy_nodes (const ACE_Unbounded_List<T> &us)
+{
+ for (ACE_NS_Node<T> *curr = us.head_->next_;
+ curr != us.head_;
+ curr = curr->next_)
+ this->insert_tail (curr->item_);
+}
+
+template <class T> void
+ACE_Unbounded_List<T>::delete_nodes (void)
+{
+ ACE_NS_Node<T> *curr = this->head_->next_;
+
+ // Keep looking until we've hit the dummy node.
+
+ while (curr != this->head_)
+ {
+ ACE_NS_Node<T> *temp = curr;
+ curr = curr->next_;
+ ACE_DES_FREE_TEMPLATE (temp,
+ this->allocator_->free,
+ ACE_NS_Node,
+ <T>);
+ this->cur_size_--;
+ }
+
+ // Reset the list to be a circular list with just a dummy node.
+ this->head_->next_ = this->head_;
+}
+
+template <class T>
+ACE_Unbounded_List<T>::~ACE_Unbounded_List (void)
+{
+ // ACE_TRACE ("ACE_Unbounded_List<T>::~ACE_Unbounded_List");
+
+ this->delete_nodes ();
+
+ // Delete the dummy node.
+ ACE_DES_FREE_TEMPLATE (head_,
+ this->allocator_->free,
+ ACE_NS_Node,
+ <T>);
+ this->head_ = 0;
+}
+
+template <class T>
+ACE_Unbounded_List<T>::ACE_Unbounded_List (ACE_Allocator *alloc)
+ : head_ (0),
+ cur_size_ (0),
+ allocator_ (alloc)
+{
+ // ACE_TRACE ("ACE_Unbounded_List<T>::ACE_Unbounded_List");
+
+ if (this->allocator_ == 0)
+ this->allocator_ = ACE_Allocator::instance ();
+
+ ACE_NEW_MALLOC (this->head_,
+ (ACE_NS_Node<T>*) this->allocator_->malloc (sizeof (ACE_NS_Node<T>)),
+ ACE_NS_Node<T>);
+ // Make the list circular by pointing it back to itself.
+ this->head_->next_ = this->head_;
+}
+
+template <class T>
+ACE_Unbounded_List<T>::ACE_Unbounded_List (const ACE_Unbounded_List<T> &us)
+ : head_ (0),
+ cur_size_ (0),
+ allocator_ (us.allocator_)
+{
+ ACE_TRACE ("ACE_Unbounded_List<T>::ACE_Unbounded_List");
+
+ if (this->allocator_ == 0)
+ this->allocator_ = ACE_Allocator::instance ();
+
+ ACE_NEW_MALLOC (this->head_,
+ (ACE_NS_Node<T>*) this->allocator_->malloc (sizeof (ACE_NS_Node<T>)),
+ ACE_NS_Node<T>);
+ this->head_->next_ = this->head_;
+ this->copy_nodes (us);
+}
+
+template <class T> void
+ACE_Unbounded_List<T>::operator= (const ACE_Unbounded_List<T> &us)
+{
+ ACE_TRACE ("ACE_Unbounded_List<T>::operator=");
+
+ if (this != &us)
+ {
+ this->delete_nodes ();
+ this->copy_nodes (us);
+ }
+}
+
+template <class T> int
+ACE_Unbounded_List<T>::insert (const T &item)
+{
+ ACE_TRACE ("ACE_Unbounded_List<T>::insert");
+ return this->insert_tail (item);
+}
+
+template <class T> int
+ACE_Unbounded_List<T>::remove (const T &item)
+{
+ // ACE_TRACE ("ACE_Unbounded_List<T>::remove");
+
+ // Insert the item to be founded into the dummy node.
+ this->head_->item_ = item;
+
+ ACE_NS_Node<T> *curr = this->head_;
+
+ while (!(curr->next_->item_ == item))
+ curr = curr->next_;
+
+ if (curr->next_ == this->head_)
+ return -1; // Item was not found.
+ else
+ {
+ ACE_NS_Node<T> *temp = curr->next_;
+ // Skip over the node that we're deleting.
+ curr->next_ = temp->next_;
+ this->cur_size_--;
+ ACE_DES_FREE_TEMPLATE (temp,
+ this->allocator_->free,
+ ACE_NS_Node,
+ <T>);
+ return 0;
+ }
+}
+
+template <class T> ACE_Unbounded_List_Iterator<T>
+ACE_Unbounded_List<T>::begin (void)
+{
+ // ACE_TRACE ("ACE_Unbounded_List<T>::begin");
+ return ACE_Unbounded_List_Iterator<T> (*this);
+}
+
+template <class T> ACE_Unbounded_List_Iterator<T>
+ACE_Unbounded_List<T>::end (void)
+{
+ // ACE_TRACE ("ACE_Unbounded_List<T>::end");
+ return ACE_Unbounded_List_Iterator<T> (*this, 1);
+}
+
+
+ACE_ALLOC_HOOK_DEFINE(ACE_Unbounded_List_Iterator)
+
+ template <class T> void
+ACE_Unbounded_List_Iterator<T>::dump (void) const
+{
+ // ACE_TRACE ("ACE_Unbounded_List_Iterator<T>::dump");
+}
+
+template <class T>
+ACE_Unbounded_List_Iterator<T>::ACE_Unbounded_List_Iterator (ACE_Unbounded_List<T> &s, int end)
+ : current_ (end == 0 ? s.head_->next_ : s.head_ ),
+ set_ (&s)
+{
+ // ACE_TRACE ("ACE_Unbounded_List_Iterator<T>::ACE_Unbounded_List_Iterator");
+}
+
+template <class T> int
+ACE_Unbounded_List_Iterator<T>::advance (void)
+{
+ // ACE_TRACE ("ACE_Unbounded_List_Iterator<T>::advance");
+ this->current_ = this->current_->next_;
+ return this->current_ != this->set_->head_;
+}
+
+template <class T> int
+ACE_Unbounded_List_Iterator<T>::first (void)
+{
+ // ACE_TRACE ("ACE_Unbounded_List_Iterator<T>::first");
+ this->current_ = this->set_->head_->next_;
+ return this->current_ != this->set_->head_;
+}
+
+template <class T> int
+ACE_Unbounded_List_Iterator<T>::done (void) const
+{
+ ACE_TRACE ("ACE_Unbounded_List_Iterator<T>::done");
+
+ return this->current_ == this->set_->head_;
+}
+
+template <class T> int
+ACE_Unbounded_List_Iterator<T>::next (T *&item)
+{
+ // ACE_TRACE ("ACE_Unbounded_List_Iterator<T>::next");
+ if (this->current_ == this->set_->head_)
+ return 0;
+ else
+ {
+ item = &this->current_->item_;
+ return 1;
+ }
+}
+
+template <class T> ACE_Unbounded_List_Iterator<T>
+ACE_Unbounded_List_Iterator<T>::operator++ (int)
+{
+ //ACE_TRACE ("ACE_Unbounded_List_Iterator<T>::operator++ (int)");
+ ACE_Unbounded_List_Iterator<T> retv (*this);
+
+ // postfix operator
+
+ this->advance ();
+ return retv;
+}
+
+template <class T> ACE_Unbounded_List_Iterator<T>&
+ACE_Unbounded_List_Iterator<T>::operator++ (void)
+{
+ // ACE_TRACE ("ACE_Unbounded_List_Iterator<T>::operator++ (void)");
+
+ // prefix operator
+
+ this->advance ();
+ return *this;
+}
+
+template <class T> T&
+ACE_Unbounded_List_Iterator<T>::operator* (void)
+{
+ //ACE_TRACE ("ACE_Unbounded_List_Iterator<T>::operator*");
+ T *retv = 0;
+
+ int result = this->next (retv);
+ ACE_ASSERT (result != 0);
+ ACE_UNUSED_ARG (result);
+
+ return *retv;
+}
+
+template <class T> bool
+ACE_Unbounded_List_Iterator<T>::operator== (const ACE_Unbounded_List_Iterator<T> &rhs) const
+{
+ //ACE_TRACE ("ACE_Unbounded_List_Iterator<T>::operator==");
+ return (this->set_ == rhs.set_ && this->current_ == rhs.current_);
+}
+
+template <class T> bool
+ACE_Unbounded_List_Iterator<T>::operator!= (const ACE_Unbounded_List_Iterator<T> &rhs) const
+{
+ //ACE_TRACE ("ACE_Unbounded_List_Iterator<T>::operator!=");
+ return (this->set_ != rhs.set_ || this->current_ != rhs.current_);
+}
+
+// ---
+
+template <class T> int
+ACE_Unbounded_List<T>::is_empty (void) const
+{
+ ACE_TRACE ("ACE_Unbounded_List<T>::is_empty");
+ return this->head_ == this->head_->next_;
+}
+
+template <class T> int
+ACE_Unbounded_List<T>::is_full (void) const
+{
+ ACE_TRACE ("ACE_Unbounded_List<T>::is_full");
+ return 0; // We should implement a "node of last resort for this..."
+}
+
+TAO_END_VERSIONED_NAMESPACE_DECL
+
+
+#endif /* NS_CONTAINERS_T_CPP */
diff --git a/TAO/orbsvcs/orbsvcs/Naming/Naming_Service_Container.h b/TAO/orbsvcs/orbsvcs/Naming/Naming_Service_Container.h
new file mode 100644
index 00000000000..0d4a61f123f
--- /dev/null
+++ b/TAO/orbsvcs/orbsvcs/Naming/Naming_Service_Container.h
@@ -0,0 +1,234 @@
+// -*- C++ -*-
+
+//=============================================================================
+/**
+ * @file Naming_Service_Container.h
+ *
+ * $Id$
+ *
+ * @author Bruce Trask <trask_b@ociweb.com>
+ */
+//=============================================================================
+
+
+
+#ifndef NS_CONTAINER_H
+#define NS_CONTAINER_H
+#include /**/ "ace/pre.h"
+
+#include "ace/ACE.h"
+
+#if !defined (ACE_LACKS_PRAGMA_ONCE)
+# pragma once
+#endif /* ACE_LACKS_PRAGMA_ONCE */
+
+
+#include "tao/orbconf.h"
+
+// Need by ACE_DLList_Node.
+#include "ace/Containers.h"
+
+ACE_BEGIN_VERSIONED_NAMESPACE_DECL
+class ACE_Allocator;
+ACE_END_VERSIONED_NAMESPACE_DECL
+
+TAO_BEGIN_VERSIONED_NAMESPACE_DECL
+
+template <class T> class ACE_Unbounded_List;
+template <class T> class ACE_Unbounded_List_Iterator;
+
+/**
+ * @class ACE_NS_Node
+ *
+ * @brief Implementation element in a Queue, List, and Stack.
+ */
+template<class T>
+class ACE_NS_Node
+{
+public:
+ friend class ACE_Unbounded_List<T>;
+ friend class ACE_Unbounded_List_Iterator<T>;
+
+# if ! defined (ACE_HAS_BROKEN_NOOP_DTORS)
+ /// This isn't necessary, but it keeps some compilers happy.
+ ~ACE_NS_Node (void);
+# endif /* ! defined (ACE_HAS_BROKEN_NOOP_DTORS) */
+
+private:
+ // = Initialization methods
+ ACE_NS_Node (const T &i, ACE_NS_Node<T> *n);
+ ACE_NS_Node (ACE_NS_Node<T> *n = 0, int = 0);
+ ACE_NS_Node (const ACE_NS_Node<T> &n);
+
+ /// Pointer to next element in the list of <ACE_NS_Node>s.
+ ACE_NS_Node<T> *next_;
+
+ /// Current value of the item in this node.
+ T item_;
+};
+
+/**
+ * @class ACE_Unbounded_List_Iterator
+ *
+ * @brief Implement an iterator over an unbounded List.
+ */
+template <class T>
+class ACE_Unbounded_List_Iterator
+{
+public:
+ // = Initialization method.
+ ACE_Unbounded_List_Iterator (ACE_Unbounded_List<T> &s, int end = 0);
+
+ // = Iteration methods.
+
+ /// Pass back the <next_item> that hasn't been seen in the List.
+ /// Returns 0 when all items have been seen, else 1.
+ int next (T *&next_item);
+
+ /// Move forward by one element in the List. Returns 0 when all the
+ /// items in the List have been seen, else 1.
+ int advance (void);
+
+ /// Move to the first element in the List. Returns 0 if the
+ /// List is empty, else 1.
+ int first (void);
+
+ /// Returns 1 when all items have been seen, else 0.
+ int done (void) const;
+
+ /// Dump the state of an object.
+ void dump (void) const;
+
+ // = STL styled iteration, compare, and reference functions.
+
+ /// Postfix advance.
+ ACE_Unbounded_List_Iterator<T> operator++ (int);
+
+ /// Prefix advance.
+ ACE_Unbounded_List_Iterator<T>& operator++ (void);
+
+ /// Returns a reference to the interal element <this> is pointing to.
+ T& operator* (void);
+
+ /// Check if two iterators point to the same position
+ bool operator== (const ACE_Unbounded_List_Iterator<T> &) const;
+ bool operator!= (const ACE_Unbounded_List_Iterator<T> &) const;
+
+ /// Declare the dynamic allocation hooks.
+ ACE_ALLOC_HOOK_DECLARE;
+
+private:
+
+ /// Pointer to the current node in the iteration.
+ ACE_NS_Node<T> *current_;
+
+ /// Pointer to the set we're iterating over.
+ ACE_Unbounded_List<T> *set_;
+};
+
+/**
+ * @class ACE_Unbounded_List
+ *
+ * @brief Implement a simple unordered set of <T> of unbounded size.
+ *
+ * This implementation of an unordered set uses a circular
+ * linked list with a dummy node. This implementation does not
+ * allow duplicates, but it maintains FIFO ordering of insertions.
+ */
+template <class T>
+class ACE_Unbounded_List
+{
+public:
+ friend class ACE_Unbounded_List_Iterator<T>;
+
+ // Trait definition.
+ typedef ACE_Unbounded_List_Iterator<T> ITERATOR;
+ typedef ACE_Unbounded_List_Iterator<T> iterator;
+
+ // = Initialization and termination methods.
+ /// Constructor. Use user specified allocation strategy
+ /// if specified.
+ ACE_Unbounded_List (ACE_Allocator *alloc = 0);
+
+ /// Copy constructor.
+ ACE_Unbounded_List (const ACE_Unbounded_List<T> &);
+
+ /// Assignment operator.
+ void operator= (const ACE_Unbounded_List<T> &);
+
+ /// Destructor.
+ ~ACE_Unbounded_List (void);
+
+ // = Check boundary conditions.
+
+ /// Returns 1 if the container is empty, otherwise returns 0.
+ int is_empty (void) const;
+
+ /// Returns 1 if the container is full, otherwise returns 0.
+ int is_full (void) const;
+
+ // = Classic unordered set operations.
+
+ /**
+ * Insert <new_item> into the set (doesn't allow duplicates).
+ * Returns -1 if failures occur, 1 if item is already present, else
+ * 0.
+ */
+ int insert (const T &new_item);
+
+ /**
+ * Remove first occurrence of <item> from the set. Returns 0 if
+ * it removes the item, -1 if it can't find the item, and -1 if a
+ * failure occurs.
+ */
+ int remove (const T &item);
+
+ /// Size of the set.
+ size_t size (void) const;
+
+ /// Dump the state of an object.
+ void dump (void) const;
+
+ /// Reset the <ACE_Unbounded_List> to be empty.
+ void reset (void);
+
+ // = STL-styled unidirectional iterator factory.
+ ACE_Unbounded_List_Iterator<T> begin (void);
+ ACE_Unbounded_List_Iterator<T> end (void);
+
+ /// Declare the dynamic allocation hooks.
+ ACE_ALLOC_HOOK_DECLARE;
+
+private:
+ /// Insert <item> at the tail of the set (doesn't check for
+ /// duplicates).
+ int insert_tail (const T &item);
+
+ /// Delete all the nodes in the List.
+ void delete_nodes (void);
+
+ /// Copy nodes into this set.
+ void copy_nodes (const ACE_Unbounded_List<T> &);
+
+ /// Head of the linked list of NS_Nodes.
+ ACE_NS_Node<T> *head_;
+
+ /// Current size of the set.
+ size_t cur_size_;
+
+ /// Allocation strategy of the set.
+ ACE_Allocator *allocator_;
+};
+
+TAO_END_VERSIONED_NAMESPACE_DECL
+
+#if defined (ACE_TEMPLATES_REQUIRE_SOURCE)
+#include "orbsvcs/Naming/Naming_Service_Container.cpp"
+#endif /* ACE_TEMPLATES_REQUIRE_SOURCE */
+
+#if defined (ACE_TEMPLATES_REQUIRE_PRAGMA)
+#pragma implementation ("Naming_Service_Container.cpp")
+#endif /* ACE_TEMPLATES_REQUIRE_PRAGMA */
+
+#include /**/ "ace/post.h"
+#endif /* NS_CONTAINERS_T_H */
diff --git a/TAO/orbsvcs/orbsvcs/Naming/Persistent_Context_Index.cpp b/TAO/orbsvcs/orbsvcs/Naming/Persistent_Context_Index.cpp
new file mode 100644
index 00000000000..97c2407a6bb
--- /dev/null
+++ b/TAO/orbsvcs/orbsvcs/Naming/Persistent_Context_Index.cpp
@@ -0,0 +1,310 @@
+// $Id$
+
+#include "orbsvcs/Naming/Persistent_Context_Index.h"
+#include "orbsvcs/Naming/Persistent_Naming_Context.h"
+
+#include "tao/debug.h"
+
+#include "ace/Auto_Ptr.h"
+#include "ace/OS_NS_unistd.h"
+
+TAO_BEGIN_VERSIONED_NAMESPACE_DECL
+
+int
+TAO_Persistent_Context_Index::unbind (const char *poa_id)
+{
+ ACE_GUARD_RETURN (TAO_SYNCH_MUTEX, ace_mon, this->lock_, -1);
+
+ TAO_Persistent_Index_ExtId name (poa_id);
+ TAO_Persistent_Index_IntId entry;
+ if (this->index_->unbind (name, entry, this->allocator_) != 0)
+ return -1;
+ else
+ {
+ // Free up the memory we allocated in bind().
+ this->allocator_->free ((void *) (entry.counter_));
+ return 0;
+ }
+}
+
+int
+TAO_Persistent_Context_Index::bind (const char *poa_id,
+ ACE_UINT32 *&counter,
+ TAO_Persistent_Context_Index::CONTEXT *hash_map)
+{
+ ACE_GUARD_RETURN (TAO_SYNCH_MUTEX, ace_mon, this->lock_, -1);
+
+ // Allocate memory for items to be stored in the table.
+ size_t poa_id_len = ACE_OS::strlen (poa_id) + 1;
+ size_t counter_len = sizeof (ACE_UINT32);
+ char *ptr = (char *) this->allocator_->malloc (poa_id_len + counter_len);
+
+ if (ptr == 0)
+ return -1;
+ else
+ {
+ // Populate memory with data.
+ counter = reinterpret_cast<ACE_UINT32 *> (ptr);
+ *counter = 0;
+ char * poa_id_ptr = ptr + counter_len;
+ ACE_OS::strcpy (poa_id_ptr, poa_id);
+
+ TAO_Persistent_Index_ExtId name (poa_id_ptr);
+ TAO_Persistent_Index_IntId entry (counter, hash_map);
+ int result = -1;
+
+ // Do a normal bind. This will fail if there's already an
+ // entry with the same name.
+ result = this->index_->bind (name, entry, this->allocator_);
+
+ if (result == 1)
+ {
+ // Entry already existed so bind failed. Free our dynamically
+ // allocated memory.
+ this->allocator_->free ((void *) ptr);
+ return result;
+ }
+
+ if (result == -1)
+ // Free our dynamically allocated memory.
+ this->allocator_->free ((void *) ptr);
+ else
+ // If bind() succeed, it will automatically sync
+ // up the map manager entry. However, we must sync up our
+ // name/value memory.
+ this->allocator_->sync (ptr, poa_id_len + counter_len);
+
+ return result;
+ }
+}
+
+TAO_Persistent_Context_Index::TAO_Persistent_Context_Index
+ (CORBA::ORB_ptr orb,
+ PortableServer::POA_ptr poa)
+ : allocator_ (0),
+ index_ (0),
+ index_file_ (0),
+ base_address_ (0),
+ orb_ (CORBA::ORB::_duplicate (orb)),
+ poa_ (PortableServer::POA::_duplicate (poa))
+{
+}
+
+TAO_Persistent_Context_Index::~TAO_Persistent_Context_Index (void)
+{
+ delete allocator_;
+ ACE_OS::free (reinterpret_cast<void *> (const_cast<ACE_TCHAR *> (index_file_)));
+}
+
+ACE_Allocator*
+TAO_Persistent_Context_Index::allocator (void)
+{
+ return allocator_;
+}
+
+CosNaming::NamingContext_ptr
+TAO_Persistent_Context_Index::root_context (void)
+{
+ return CosNaming::NamingContext::_duplicate (root_context_.in ());
+}
+
+CORBA::ORB_ptr
+TAO_Persistent_Context_Index::orb (void)
+{
+ return orb_.in ();
+}
+
+int
+TAO_Persistent_Context_Index::open (const ACE_TCHAR *file_name,
+ void *base_address)
+{
+ this->base_address_ = base_address;
+
+ index_file_ = ACE_OS::strdup (file_name);
+ if (index_file_ == 0)
+ return -1;
+
+ return create_index ();
+}
+
+int
+TAO_Persistent_Context_Index::init (size_t context_size)
+{
+ // Note: in case of an early exit from this (or helper) function due
+ // to an error condition, we rely on POA to clean up all of the servants
+ // already registered with it.
+
+ // Return value of this function (necessary to keep compilers quiet).
+ int status = 0;
+
+ if (index_->current_size () == 0)
+ // CASE 1:there are no Naming Contexts registered. We need to create
+ // one.
+ {
+ ACE_DECLARE_NEW_CORBA_ENV;
+
+ this->root_context_ =
+ TAO_Persistent_Naming_Context::make_new_context (poa_.in (),
+ TAO_ROOT_NAMING_CONTEXT,
+ context_size,
+ this
+ ACE_ENV_ARG_PARAMETER);
+ ACE_CHECK_RETURN (-1);
+ }
+
+ else
+ // CASE 2:Recreate all Naming Contexts.
+ status = recreate_all ();
+
+ return status;
+}
+
+int
+TAO_Persistent_Context_Index::recreate_all (void)
+{
+ CONTEXT_INDEX::ITERATOR *index_iter = 0;
+
+ ACE_NEW_RETURN (index_iter,
+ (CONTEXT_INDEX::ITERATOR) (*index_),
+ -1);
+
+ ACE_Auto_Basic_Ptr<CONTEXT_INDEX::ITERATOR> it (index_iter);
+
+ // Because of broken old g++!!!
+ typedef ACE_Hash_Map_With_Allocator<TAO_Persistent_Index_ExtId,
+ TAO_Persistent_Index_IntId> IND_DEF;
+
+ IND_DEF::ENTRY *entry = 0;
+
+ if (TAO_debug_level > 0)
+ ACE_DEBUG ((LM_DEBUG, "Starting to recreate Naming Contexts from the file... \n"));
+
+ // For each entry in <index_>, create a Naming Context servant.
+ do
+ {
+ index_iter->next (entry);
+
+ // Put together a servant for the new Naming Context.
+
+ TAO_Persistent_Naming_Context *context_impl = 0;
+ ACE_NEW_RETURN (context_impl,
+ TAO_Persistent_Naming_Context (poa_.in (),
+ entry->ext_id_.poa_id_,
+ this,
+ entry->int_id_.hash_map_,
+ entry->int_id_.counter_),
+ -1);
+
+
+ // Put <context_impl> into the auto pointer temporarily, in case next
+ // allocation fails.
+ ACE_Auto_Basic_Ptr<TAO_Persistent_Naming_Context> temp (context_impl);
+
+ TAO_Naming_Context *context = 0;
+ ACE_NEW_RETURN (context,
+ TAO_Naming_Context (context_impl),
+ -1);
+
+ // Let <implementation> know about it's <interface>.
+ context_impl->interface (context);
+
+ // Release auto pointer and start using reference counting to
+ // control our servant.
+ temp.release ();
+ PortableServer::ServantBase_var s = context;
+
+ // Register with the POA.
+ ACE_DECLARE_NEW_CORBA_ENV;
+ PortableServer::ObjectId_var id =
+ PortableServer::string_to_ObjectId (entry->ext_id_.poa_id_);
+
+ this->poa_->activate_object_with_id (id.in (),
+ context
+ ACE_ENV_ARG_PARAMETER);
+ ACE_CHECK_RETURN (-1);
+
+ CosNaming::NamingContext_var result = context->_this (ACE_ENV_SINGLE_ARG_PARAMETER);
+ ACE_CHECK_RETURN (-1);
+
+ // If this is the root Naming Context, take a note of it.
+ if (context_impl->root ())
+ this->root_context_= result._retn ();
+
+ } while (index_iter->advance ());
+
+ return 0;
+}
+
+int
+TAO_Persistent_Context_Index::create_index (void)
+{
+ // Make sure that the file name is of the legal length.
+ if (ACE_OS::strlen (index_file_) >= MAXNAMELEN + MAXPATHLEN)
+ {
+ errno = ENAMETOOLONG;
+ return -1;
+ }
+
+#if !defined (CHORUS)
+ ACE_MMAP_Memory_Pool::OPTIONS options (base_address_);
+#else
+ // Use base address == 0, don't use a fixed address.
+ ACE_MMAP_Memory_Pool::OPTIONS options (0,
+ 0,
+ 0,
+ ACE_CHORUS_LOCAL_NAME_SPACE_T_SIZE);
+#endif /* CHORUS */
+
+ // Create the allocator with the appropriate options. The name used
+ // for the lock is the same as one used for the file.
+ ACE_NEW_RETURN (this->allocator_,
+ ALLOCATOR (this->index_file_,
+ this->index_file_,
+ &options),
+ -1);
+
+#if !defined (ACE_LACKS_ACCESS)
+ // Now check if the backing store has been created successfully.
+ if (ACE_OS::access (this->index_file_, F_OK) != 0)
+ ACE_ERROR_RETURN ((LM_ERROR,
+ "create_index\n"),
+ -1);
+#endif /* ACE_LACKS_ACCESS */
+
+ void *context_index = 0;
+
+ // This is the easy case since if we find hash table in the
+ // memory-mapped file we know it's already initialized.
+ if (this->allocator_->find (TAO_NAMING_CONTEXT_INDEX, context_index) == 0)
+ this->index_ = (CONTEXT_INDEX *) context_index;
+
+ // Create a new <index_> (because we've just created a new
+ // memory-mapped file).
+ else
+ {
+ size_t index_size = sizeof (CONTEXT_INDEX);
+ context_index = this->allocator_->malloc (index_size);
+
+ if (context_index == 0
+ || create_index_helper (context_index) == -1
+ || this->allocator_->bind (TAO_NAMING_CONTEXT_INDEX,
+ context_index) == -1)
+ {
+ // Attempt to clean up.
+ ACE_ERROR ((LM_ERROR,
+ "create_index\n"));
+ this->allocator_->remove ();
+ return -1;
+ }
+ }
+ return 0;
+}
+
+int
+TAO_Persistent_Context_Index::create_index_helper (void *buffer)
+{
+ this->index_ = new (buffer) CONTEXT_INDEX (this->allocator_);
+ return 0;
+}
+
+TAO_END_VERSIONED_NAMESPACE_DECL
diff --git a/TAO/orbsvcs/orbsvcs/Naming/Persistent_Context_Index.h b/TAO/orbsvcs/orbsvcs/Naming/Persistent_Context_Index.h
new file mode 100644
index 00000000000..97bd7b76018
--- /dev/null
+++ b/TAO/orbsvcs/orbsvcs/Naming/Persistent_Context_Index.h
@@ -0,0 +1,171 @@
+// -*- C++ -*-
+
+//=============================================================================
+/**
+ * @file Persistent_Context_Index.h
+ *
+ * $Id$
+ *
+ * @author Marina Spivak <marina@cs.wustl.edu>
+ */
+//=============================================================================
+
+
+#ifndef TAO_PERSISTENT_CONTEXT_INDEX_H
+#define TAO_PERSISTENT_CONTEXT_INDEX_H
+#include /**/ "ace/pre.h"
+
+#include "orbsvcs/Naming/Persistent_Entries.h"
+#include "orbsvcs/Naming/naming_serv_export.h"
+#include "orbsvcs/Naming/nsconf.h"
+#include "tao/PortableServer/PortableServer.h"
+
+#include "ace/Malloc_T.h"
+#include "ace/MMAP_Memory_Pool.h"
+
+TAO_BEGIN_VERSIONED_NAMESPACE_DECL
+
+/**
+ * @class TAO_Persistent_Context_Index
+ *
+ * @brief This class facilitates implementation of Persistent
+ * Naming Service. It keeps track, centrally, of several pieces of
+ * info for each Persistent Naming Context, allowing to perform the
+ * initialization necessary for each Naming Context to
+ * restore the state of the Naming Service from persistent storage
+ * on server start-up.
+ *
+ * This class creates a memory-mapped file, allocates a hash
+ * table from that file, and uses the hash table to store POA id,
+ * and table and counter pointers for each Persistent Naming
+ * Context. There are methods for adding and deleting entries
+ * from this hash table as new Persistent Naming Contexts are
+ * created and old ones are destroyed. This hash table
+ * facilitates Persistent Naming Context servant initialization
+ * upon Naming Server start-up.
+ */
+class TAO_Naming_Serv_Export TAO_Persistent_Context_Index
+{
+public:
+ // = Some typedefs for convenience.
+
+ /// Hash map in which we will store info about each Persistent Naming Context.
+ typedef ACE_Hash_Map_With_Allocator<TAO_Persistent_Index_ExtId,
+ TAO_Persistent_Index_IntId> CONTEXT_INDEX;
+
+ /// Hash map used by Persistent Naming Context to keep its state.
+ typedef ACE_Hash_Map_With_Allocator<TAO_Persistent_ExtId,
+ TAO_Persistent_IntId> CONTEXT;
+
+ /// Allocator we will be using to make the Naming Service persistent.
+ typedef ACE_Allocator_Adapter <ACE_Malloc <ACE_MMAP_MEMORY_POOL, TAO_SYNCH_MUTEX>
+ > ALLOCATOR;
+
+ // = Initialization and termination methods.
+
+ /// Constructor.
+ TAO_Persistent_Context_Index (CORBA::ORB_ptr orb,
+ PortableServer::POA_ptr poa);
+
+ /**
+ * Create ACE_Allocator, open/create memory-mapped file with the
+ * specified file name/base address. Find or allocate <index_>.
+ * Return 0 on success or -1 on failure.
+ */
+ int open (const ACE_TCHAR *file_name,
+ void * base_address = TAO_NAMING_BASE_ADDR);
+
+ /**
+ * If <index_> contains no entries (i.e., was just created), create
+ * a root Persistent Naming Context servant with table of size
+ * <context_size>, and make an entry for it
+ * in the <index_>. If <index_> contains entries, create a
+ * Persistent Naming Context servant for each entry. Return 0 on
+ * success and -1 on failure.
+ */
+ int init (size_t context_size);
+
+ /**
+ * Destructor. The memory mapped file that was opened/created is
+ * not deleted, since we want it to keep the state of the Naming
+ * Service until the next run.
+ */
+ ~TAO_Persistent_Context_Index (void);
+
+ // = Methods for adding/removing entries.
+
+ /**
+ * Create an entry for a Persistent Naming Context in <index_>,
+ * i.e., a context with <poa_id>, <counter> and <hash_map> has just
+ * been created, and is registering with us.
+ */
+ int bind (const char *poa_id,
+ ACE_UINT32 *&counter,
+ CONTEXT *hash_map);
+
+ /// Remove an entry for the Persistent Naming Context with <poa_id>
+ /// from <index_> (i.e., this context has just been destroyed).
+ int unbind (const char *poa_id);
+
+ // = Accessors.
+
+ /// Return allocator.
+ ACE_Allocator *allocator (void);
+
+ /// Return orb pointer.
+ CORBA::ORB_ptr orb (void);
+
+ /// Return a pointer to the root Naming Context (returns a copy - must be
+ /// deallocated by the user).
+ CosNaming::NamingContext_ptr root_context (void);
+
+private:
+
+ /// Helper for the <init> method. Iterates over <index_>, and
+ /// creates a servant for each entry.
+ int recreate_all (void);
+
+ /// Helper for the <open> method.
+ int create_index (void);
+
+ /// Helper for <create_index> method: places hash table into an
+ /// allocated space.
+ int create_index_helper (void *buffer);
+
+ /// Lock to prevent multiple threads from modifying entries in the
+ /// <index_> simultanneously.
+ TAO_SYNCH_MUTEX lock_;
+
+ /**
+ * Allocator that deals out memory from a memory-mapped file. We
+ * use it here, and in TAO_Persistent_Naming_Context, whenever we
+ * deal with data that should be kept in persistent store.
+ */
+ ALLOCATOR *allocator_;
+
+ /// Hash map where we keep entries for all Persistent Naming
+ /// Contexts.
+ CONTEXT_INDEX *index_;
+
+ /// Name of the memory-mapped file used by <allocator_>.
+ const ACE_TCHAR *index_file_;
+
+ /// Base address for the memory-mapped file.
+ void *base_address_;
+
+ /// ORB. We use it for several object_to_string conversions, and
+ /// keep it around for Persistent Naming Contexts' use.
+ CORBA::ORB_var orb_;
+
+ /// POA under which to register Persistent Naming Context servants
+ /// during start-up.
+ PortableServer::POA_var poa_;
+
+ /// The reference to the root Naming Context.
+ CosNaming::NamingContext_var root_context_;
+};
+
+TAO_END_VERSIONED_NAMESPACE_DECL
+
+#include /**/ "ace/post.h"
+#endif /* TAO_PERSISTENT_CONTEXT_INDEX_H */
diff --git a/TAO/orbsvcs/orbsvcs/Naming/Persistent_Entries.cpp b/TAO/orbsvcs/orbsvcs/Naming/Persistent_Entries.cpp
new file mode 100644
index 00000000000..f5d31b0874c
--- /dev/null
+++ b/TAO/orbsvcs/orbsvcs/Naming/Persistent_Entries.cpp
@@ -0,0 +1,208 @@
+// $Id$
+
+// ============================================================================
+//
+// = LIBRARY
+// cos
+//
+// = FILENAME
+// Persistent_Entries.cpp
+//
+// = AUTHOR
+// Marina Spivak <marina@cs.wustl.edu>
+//
+// ============================================================================
+
+#include "orbsvcs/Naming/Persistent_Entries.h"
+#include "ace/SString.h"
+
+TAO_BEGIN_VERSIONED_NAMESPACE_DECL
+
+TAO_Persistent_IntId::TAO_Persistent_IntId (void)
+ : ref_ (0),
+ type_ (CosNaming::nobject)
+{
+}
+
+TAO_Persistent_IntId::TAO_Persistent_IntId (char * obj_ref,
+ CosNaming::BindingType type)
+ : ref_ (obj_ref),
+ type_ (type)
+{
+}
+
+TAO_Persistent_IntId::TAO_Persistent_IntId (const TAO_Persistent_IntId &rhs)
+{
+ ref_ = rhs.ref_;
+ type_ = rhs.type_;
+}
+
+TAO_Persistent_IntId::~TAO_Persistent_IntId (void)
+{
+}
+
+void
+TAO_Persistent_IntId::operator= (const TAO_Persistent_IntId &rhs)
+{
+ // check for self assignment.
+ if (&rhs == this)
+ return;
+
+ type_ = rhs.type_;
+ ref_ = rhs.ref_;
+}
+
+TAO_Persistent_ExtId::TAO_Persistent_ExtId (void)
+ : id_ (0),
+ kind_ (0)
+{
+}
+
+TAO_Persistent_ExtId::TAO_Persistent_ExtId (const char *id,
+ const char *kind)
+ : id_ (id),
+ kind_ (kind)
+
+{
+}
+
+TAO_Persistent_ExtId::TAO_Persistent_ExtId (const TAO_Persistent_ExtId &rhs)
+{
+ id_ = rhs.id_;
+ kind_ = rhs.kind_;
+}
+
+TAO_Persistent_ExtId::~TAO_Persistent_ExtId (void)
+{
+}
+
+void
+TAO_Persistent_ExtId::operator= (const TAO_Persistent_ExtId &rhs)
+{
+ // Check for self assignment.
+ if (&rhs == this)
+ return;
+
+ id_ = rhs.id_;
+ kind_ = rhs.kind_;
+}
+
+bool
+TAO_Persistent_ExtId::operator== (const TAO_Persistent_ExtId &rhs) const
+{
+ return (ACE_OS::strcmp (id_, rhs.id_) == 0)
+ && (ACE_OS::strcmp (kind_, rhs.kind_) == 0);
+}
+
+bool
+TAO_Persistent_ExtId::operator!= (const TAO_Persistent_ExtId &rhs) const
+{
+ return (ACE_OS::strcmp (id_, rhs.id_) != 0)
+ || (ACE_OS::strcmp (kind_, rhs.kind_) != 0);
+}
+
+u_long
+TAO_Persistent_ExtId::hash (void) const
+{
+ ACE_CString temp (id_);
+ temp += kind_;
+
+ return temp.hash ();
+}
+
+const char *
+TAO_Persistent_ExtId::id (void)
+{
+ return id_;
+}
+
+const char *
+TAO_Persistent_ExtId::kind (void)
+{
+ return kind_;
+}
+
+TAO_Persistent_Index_IntId::TAO_Persistent_Index_IntId (void)
+ : counter_ (0),
+ hash_map_ (0)
+{
+}
+
+TAO_Persistent_Index_IntId::TAO_Persistent_Index_IntId (ACE_UINT32 *counter,
+ ACE_Hash_Map_With_Allocator<TAO_Persistent_ExtId,
+ TAO_Persistent_IntId> * hash_map)
+ : counter_ (counter),
+ hash_map_ (hash_map)
+{
+}
+
+TAO_Persistent_Index_IntId::TAO_Persistent_Index_IntId (const TAO_Persistent_Index_IntId &rhs)
+{
+ counter_ = rhs.counter_;
+ hash_map_ = rhs.hash_map_;
+}
+
+TAO_Persistent_Index_IntId::~TAO_Persistent_Index_IntId (void)
+{
+}
+
+void
+TAO_Persistent_Index_IntId::operator= (const TAO_Persistent_Index_IntId &rhs)
+{
+ // check for self assignment.
+ if (&rhs == this)
+ return;
+
+ counter_ = rhs.counter_;
+ hash_map_ = rhs.hash_map_;
+}
+
+TAO_Persistent_Index_ExtId::TAO_Persistent_Index_ExtId (void)
+ : poa_id_ (0)
+{
+}
+
+TAO_Persistent_Index_ExtId::TAO_Persistent_Index_ExtId (const char *poa_id)
+ : poa_id_ (poa_id)
+{
+}
+
+TAO_Persistent_Index_ExtId::TAO_Persistent_Index_ExtId (const TAO_Persistent_Index_ExtId &rhs)
+{
+ poa_id_ = rhs.poa_id_;
+}
+
+TAO_Persistent_Index_ExtId::~TAO_Persistent_Index_ExtId (void)
+{
+}
+
+void
+TAO_Persistent_Index_ExtId::operator= (const TAO_Persistent_Index_ExtId &rhs)
+{
+ // Check for self assignment.
+ if (&rhs == this)
+ return;
+
+ poa_id_ = rhs.poa_id_;
+}
+
+bool
+TAO_Persistent_Index_ExtId::operator== (const TAO_Persistent_Index_ExtId &rhs) const
+{
+ return (ACE_OS::strcmp (poa_id_, rhs.poa_id_) == 0);
+}
+
+bool
+TAO_Persistent_Index_ExtId::operator!= (const TAO_Persistent_Index_ExtId &rhs) const
+{
+ return (ACE_OS::strcmp (poa_id_, rhs.poa_id_) != 0);
+}
+
+u_long
+TAO_Persistent_Index_ExtId::hash (void) const
+{
+ ACE_CString temp (poa_id_);
+ return temp.hash ();
+}
+
+TAO_END_VERSIONED_NAMESPACE_DECL
diff --git a/TAO/orbsvcs/orbsvcs/Naming/Persistent_Entries.h b/TAO/orbsvcs/orbsvcs/Naming/Persistent_Entries.h
new file mode 100644
index 00000000000..d418414a945
--- /dev/null
+++ b/TAO/orbsvcs/orbsvcs/Naming/Persistent_Entries.h
@@ -0,0 +1,233 @@
+// -*- C++ -*-
+
+//=============================================================================
+/**
+ * @file Persistent_Entries.h
+ *
+ * $Id$
+ *
+ * @author Marina Spivak <marina@cs.wustl.edu>
+ */
+//=============================================================================
+
+
+#ifndef TAO_PERSISTENT_ENTRIES_H
+#define TAO_PERSISTENT_ENTRIES_H
+#include /**/ "ace/pre.h"
+
+#include "ace/Hash_Map_With_Allocator_T.h"
+#include "orbsvcs/CosNamingC.h"
+#include "orbsvcs/Naming/naming_serv_export.h"
+
+#if !defined (ACE_LACKS_PRAGMA_ONCE)
+# pragma once
+#endif /* ACE_LACKS_PRAGMA_ONCE */
+
+TAO_BEGIN_VERSIONED_NAMESPACE_DECL
+
+/**
+ * @class TAO_Persistent_IntId
+ *
+ * @brief Helper class for TAO_Persistent_Bindings_Map: unifies several
+ * data items, so they can be stored together as a <value>
+ * for a <key> in a hash table holding the state of a Persistent
+ * Naming Context.
+ *
+ * This class holds a strigified IOR and a binding type, so
+ * they can be stored together as a <value> for a <key> in a
+ * hash table holding the state of a Persistent Naming Context.
+ * Memory for the ior isn't allocated/deallocated, this class just
+ * copies a pointer.
+ */
+class TAO_Naming_Serv_Export TAO_Persistent_IntId
+{
+public:
+ // = Initialization and termination methods.
+ /// Constructor.
+ TAO_Persistent_IntId (void);
+
+ /// Constructor.
+ TAO_Persistent_IntId (char * obj_ref,
+ CosNaming::BindingType type /* = CosNaming::nobject */);
+
+ /// Copy constructor.
+ TAO_Persistent_IntId (const TAO_Persistent_IntId & rhs);
+
+ /// Destructor.
+ ~TAO_Persistent_IntId (void);
+
+ /// Assignment operator.
+ void operator= (const TAO_Persistent_IntId & rhs);
+
+ // = Data members.
+
+ /// Stringified IOR to be stored in a Persistent Naming Context.
+ const char *ref_;
+
+ /// Binding type for <ref_>.
+ CosNaming::BindingType type_;
+};
+
+/**
+ * @class TAO_Persistent_ExtId
+ *
+ * @brief Helper class for TAO_Persistent_Bindings_Map: unifies several
+ * data items, so they can be stored together as a <key>
+ * for a <value> in a hash table holding the state of a Persistent
+ * Naming Context.
+ *
+ * This class holds id and kind strings, so
+ * they can be stored together as a <key> for a <value> in a
+ * hash table holding the state of a Persistent Naming Context.
+ * Memory for id and kind isn't allocated/deallocated, this
+ * class just copies pointers.
+ */
+class TAO_Naming_Serv_Export TAO_Persistent_ExtId
+{
+public:
+ // = Initialization and termination methods.
+
+ /// Constructor.
+ TAO_Persistent_ExtId (void);
+
+ /// Constructor.
+ TAO_Persistent_ExtId (const char *id,
+ const char *kind);
+
+ /// Copy constructor.
+ TAO_Persistent_ExtId (const TAO_Persistent_ExtId & rhs);
+
+ /// Destructor.
+ ~TAO_Persistent_ExtId (void);
+
+ // = Assignment and comparison methods.
+
+ /// Assignment operator (does copy memory).
+ void operator= (const TAO_Persistent_ExtId & rhs);
+
+ /// Equality comparison operator (must match both id_ and kind_).
+ bool operator== (const TAO_Persistent_ExtId &rhs) const;
+
+ /// Inequality comparison operator.
+ bool operator!= (const TAO_Persistent_ExtId &rhs) const;
+
+ /// <hash> function is required in order for this class to be usable by
+ /// ACE_Hash_Map_Manager.
+ u_long hash (void) const;
+
+ // = Data members.
+
+ /// <id> portion of the name to be associated with some object
+ /// reference in a Persistent Naming Context.
+ const char * id_;
+
+ /// <kind> portion of the name to be associated with some object
+ /// reference in a Persistent Naming Context.
+ const char * kind_;
+
+ // Accessors.
+
+ const char * id (void);
+ const char * kind (void);
+};
+
+/**
+ * @class TAO_Persistent_Index_IntId
+ *
+ * @brief Helper class for TAO_Persistent_Context_Index: unifies several
+ * data items, so they can be stored together as a <value>
+ * for a <key> in a hash table holding the state of a Persistent
+ * Context Index. (Persistent Context Index is like directory
+ * that stores info about every active Naming Context).
+ *
+ * This class holds a counter and a hash map pointers, so
+ * they can be stored together as a <value> for a <key> in a
+ * hash table holding the state of a Persistent Context Index.
+ */
+class TAO_Naming_Serv_Export TAO_Persistent_Index_IntId
+{
+public:
+ // = Initialization and termination methods.
+ /// Constructor.
+ TAO_Persistent_Index_IntId (void);
+
+ /// Constructor.
+ TAO_Persistent_Index_IntId (ACE_UINT32 *counter,
+ ACE_Hash_Map_With_Allocator<TAO_Persistent_ExtId,
+ TAO_Persistent_IntId> * hash_map);
+
+ /// Copy constructor.
+ TAO_Persistent_Index_IntId (const TAO_Persistent_Index_IntId & rhs);
+
+ /// Destructor.
+ ~TAO_Persistent_Index_IntId (void);
+
+ /// Assignment operator (does copy memory).
+ void operator= (const TAO_Persistent_Index_IntId & rhs);
+
+ // = Data members.
+
+ /// Pointer to a Persistent Naming Context's counter.
+ ACE_UINT32 *counter_;
+
+ /// Pointer to a Persistent Naming Context's hash map.
+ ACE_Hash_Map_With_Allocator<TAO_Persistent_ExtId,
+ TAO_Persistent_IntId> * hash_map_;
+};
+
+/**
+ * @class TAO_Persistent_Index_ExtId
+ *
+ * @brief Helper class for TAO_Persistent_Context_Index: holds
+ * Persistent Naming Context POA id, so it can be stored as a <key>
+ * for a <value> in a hash table holding state of a Persistent
+ * Context Index. (Persistent Context Index is like directory
+ * that stores info about every active Naming Context).
+ *
+ * We need this wrapper class around the actual data because we must
+ * provide <hash> function for it to work with
+ * ACE_Hash_Map_Manager.
+ */
+class TAO_Naming_Serv_Export TAO_Persistent_Index_ExtId
+{
+public:
+ // = Initialization and termination methods.
+
+ /// Constructor.
+ TAO_Persistent_Index_ExtId (void);
+
+ /// Constructor.
+ TAO_Persistent_Index_ExtId (const char *poa_id);
+
+ /// Copy constructor.
+ TAO_Persistent_Index_ExtId (const TAO_Persistent_Index_ExtId & rhs);
+
+ /// Destructor.
+ ~TAO_Persistent_Index_ExtId (void);
+
+ // = Assignment and comparison methods.
+
+ /// Assignment operator (does copy memory).
+ void operator= (const TAO_Persistent_Index_ExtId & rhs);
+
+ /// Equality comparison operator (must match both id_ and kind_).
+ bool operator== (const TAO_Persistent_Index_ExtId &rhs) const;
+
+ /// Inequality comparison operator.
+ bool operator!= (const TAO_Persistent_Index_ExtId &rhs) const;
+
+ /// <hash> function is required in order for this class to be usable by
+ /// ACE_Hash_Map_Manager.
+ u_long hash (void) const;
+
+ // = Data member.
+
+ /// POA id to be associated with the rest of the info for some
+ /// Persistent Naming Context in the Persistent Context Index.
+ const char * poa_id_;
+};
+
+TAO_END_VERSIONED_NAMESPACE_DECL
+
+#include /**/ "ace/post.h"
+#endif /* TAO_PERSISTENT_ENTRIES_H */
diff --git a/TAO/orbsvcs/orbsvcs/Naming/Persistent_Naming_Context.cpp b/TAO/orbsvcs/orbsvcs/Naming/Persistent_Naming_Context.cpp
new file mode 100644
index 00000000000..80b4a7f4aa7
--- /dev/null
+++ b/TAO/orbsvcs/orbsvcs/Naming/Persistent_Naming_Context.cpp
@@ -0,0 +1,541 @@
+#include "orbsvcs/Naming/Persistent_Naming_Context.h"
+#include "orbsvcs/Naming/Persistent_Context_Index.h"
+#include "orbsvcs/Naming/Bindings_Iterator_T.h"
+#include "ace/OS_NS_stdio.h"
+
+// The following #pragma is needed to disable a warning that occurs
+// in MSVC 6 due to the overly long debugging symbols generated for
+// the ACE_Auto_Basic_Ptr<ACE_Hash_Map_Iterator_Ex<TAO_...> > template
+// instance used by some of the methods in this file.
+#ifdef _MSC_VER
+# pragma warning(disable: 4786) /* identifier was truncated to '255'
+ characters in the browser
+ information */
+#endif /* _MSC_VER */
+
+#include "ace/Auto_Ptr.h"
+
+ACE_RCSID (Naming,
+ Persistent_Naming_Context,
+ "$Id$")
+
+TAO_BEGIN_VERSIONED_NAMESPACE_DECL
+
+int
+TAO_Persistent_Bindings_Map::unbind (const char *id,
+ const char *kind)
+{
+ TAO_Persistent_ExtId name (id, kind);
+ TAO_Persistent_IntId entry;
+ if (this->map_->unbind (name, entry, this->allocator_) != 0)
+ return -1;
+ else
+ {
+ // Free up the memory we allocated in shared_bind(). Note that
+ // this assumes that the "ref" pointer comes first and that
+ // the ref, id and kind are contiguously allocated (see
+ // shared_bind() for details).
+ this->allocator_->free ((void *) (entry.ref_));
+ return 0;
+ }
+}
+
+int
+TAO_Persistent_Bindings_Map::bind (const char *id,
+ const char *kind,
+ CORBA::Object_ptr obj,
+ CosNaming::BindingType type)
+{
+ return this->shared_bind (id, kind, obj, type, 0);
+}
+
+int
+TAO_Persistent_Bindings_Map::rebind (const char *id,
+ const char *kind,
+ CORBA::Object_ptr obj,
+ CosNaming::BindingType type)
+{
+ return this->shared_bind (id, kind, obj, type, 1);
+}
+
+int
+TAO_Persistent_Bindings_Map::find (const char *id,
+ const char *kind,
+ CORBA::Object_ptr & obj,
+ CosNaming::BindingType &type)
+{
+ TAO_Persistent_ExtId name (id, kind);
+ TAO_Persistent_IntId entry;
+
+ if (this->map_->find (name,
+ entry,
+ this->allocator_) != 0)
+ return -1;
+ else
+ {
+ ACE_DECLARE_NEW_CORBA_ENV;
+ obj = orb_->string_to_object (entry.ref_ ACE_ENV_ARG_PARAMETER);
+ ACE_CHECK_RETURN (-1);
+ type = entry.type_;
+
+ return 0;
+ }
+}
+
+TAO_Persistent_Bindings_Map::TAO_Persistent_Bindings_Map (CORBA::ORB_ptr orb)
+ : allocator_ (0),
+ map_ (0),
+ orb_ (CORBA::ORB::_duplicate (orb))
+{
+}
+
+TAO_Persistent_Bindings_Map::~TAO_Persistent_Bindings_Map (void)
+{
+}
+
+void
+TAO_Persistent_Bindings_Map::destroy (void)
+{
+ this->map_->ACE_Hash_Map_With_Allocator<TAO_Persistent_ExtId, TAO_Persistent_IntId>::~ACE_Hash_Map_With_Allocator ();
+ this->allocator_->free (map_);
+}
+
+TAO_Persistent_Bindings_Map::HASH_MAP *
+TAO_Persistent_Bindings_Map::map (void)
+{
+ return this->map_;
+}
+
+size_t
+TAO_Persistent_Bindings_Map::total_size (void)
+{
+ return this->map_->total_size ();
+}
+
+size_t
+TAO_Persistent_Bindings_Map::current_size (void)
+{
+ return map_->current_size ();
+}
+
+int
+TAO_Persistent_Bindings_Map::open (size_t hash_table_size,
+ ACE_Allocator *alloc)
+{
+ allocator_ = alloc;
+
+ // Use allocator to allocate space for the hash map.
+ void *hash_map = 0;
+ size_t map_size = sizeof (HASH_MAP);
+ hash_map = this->allocator_->malloc (map_size);
+
+ // If allocation failed ...
+ if (hash_map == 0)
+ return -1;
+
+ // Initialize allocated hash map through placement new.
+ if (open_helper (hash_table_size, hash_map) == -1)
+ this->allocator_->free (hash_map);
+
+ return 0;
+}
+
+int
+TAO_Persistent_Bindings_Map::open_helper (size_t hash_table_size,
+ void *buffer)
+{
+ this->map_ = new (buffer) HASH_MAP (hash_table_size, this->allocator_);
+ return 0;
+}
+
+void
+TAO_Persistent_Bindings_Map::set (HASH_MAP *map,
+ ACE_Allocator *alloc)
+{
+ allocator_ = alloc;
+ map_ = map;
+}
+
+int
+TAO_Persistent_Bindings_Map::shared_bind (const char * id,
+ const char * kind,
+ CORBA::Object_ptr obj,
+ CosNaming::BindingType type,
+ int rebind)
+{
+ // Obtain a stringified ior of <obj> (i.e., the representation we can store).
+ ACE_DECLARE_NEW_CORBA_ENV;
+ CORBA::String_var ref = orb_->object_to_string (obj ACE_ENV_ARG_PARAMETER);
+ ACE_CHECK_RETURN (-1);
+
+ // Calculate and allocate the memory we need to store this name to
+ // object binding.
+ size_t id_len = ACE_OS::strlen (id) + 1;
+ size_t kind_len = ACE_OS::strlen (kind) + 1;
+ size_t ref_len = ACE_OS::strlen (ref.in ()) + 1;
+ size_t total_len = id_len + kind_len + ref_len;
+ char *ptr = (char *) this->allocator_->malloc (total_len);
+
+ // Allocation failed - bail out.
+ if (ptr == 0)
+ return -1;
+
+ // Allocation succeded - place the data into the allocated memory
+ // and procceed.
+ else
+ {
+ // Note that the <ref> *must* come first to make sure we can
+ // retrieve this pointer later on in unbind().
+ char * ref_ptr = ptr;
+ char * id_ptr = ptr + ref_len;
+ char * kind_ptr = ptr + ref_len + id_len;
+ ACE_OS::strcpy (ref_ptr, ref.in ());
+ ACE_OS::strcpy (id_ptr, id);
+ ACE_OS::strcpy (kind_ptr, kind);
+
+ TAO_Persistent_ExtId new_name (id_ptr, kind_ptr);
+ TAO_Persistent_IntId new_entry (ref_ptr, type);
+ int result = -1;
+
+ if (rebind == 0)
+ {
+ // Do a normal bind. This will fail if there's already an
+ // <new_internal> with the same name.
+ result = this->map_->bind (new_name, new_entry, this->allocator_);
+
+ if (result == 1)
+ {
+ // Entry already existed so bind failed. Free our
+ // dynamically allocated memory.
+ this->allocator_->free ((void *) ptr);
+ return result;
+ }
+ }
+ else
+ // Rebind.
+ {
+ TAO_Persistent_ExtId old_name;
+ TAO_Persistent_IntId old_entry;
+
+ // Check that the types of old and new entries match.
+ if (this->map_->find (new_name,
+ old_entry,
+ this->allocator_) == 0
+ && type != old_entry.type_)
+ result = -2;
+
+ // If types match, perform rebind.
+ else
+ result = this->map_->rebind (new_name, new_entry,
+ old_name, old_entry,
+ this->allocator_);
+ if (result == 1)
+ {
+ // Free up the old binding's memory, if it was replaced.
+ // Note, this assumes that the "ref" pointer comes
+ // first, and that the id, kind, and ref are contiguously
+ // allocated (see beginning of this method for details).
+ this->allocator_->free ((void *) old_entry.ref_);
+ }
+ }
+
+ // Check for failures, and clean up dynamically allocated memory
+ // if necessary.
+ if (result < 0)
+ this->allocator_->free ((void *) ptr);
+
+ else
+ // If bind() or rebind() succeeded, they will automatically sync
+ // up the map manager entry. However, we must sync up our
+ // name/value memory.
+ this->allocator_->sync (ptr, total_len);
+
+ return result;
+ }
+}
+
+TAO_Persistent_Naming_Context::TAO_Persistent_Naming_Context (PortableServer::POA_ptr poa,
+ const char *poa_id,
+ TAO_Persistent_Context_Index *context_index)
+
+ : TAO_Hash_Naming_Context (poa,
+ poa_id),
+ counter_ (0),
+ persistent_context_ (0),
+ index_ (context_index)
+{
+ ACE_NEW (this->persistent_context_,
+ TAO_Persistent_Bindings_Map (context_index->orb ()));
+
+ // Set the superclass pointer.
+ context_ = persistent_context_;
+}
+
+TAO_Persistent_Naming_Context::TAO_Persistent_Naming_Context (PortableServer::POA_ptr poa,
+ const char *poa_id,
+ TAO_Persistent_Context_Index *context_index,
+ HASH_MAP *map,
+ ACE_UINT32 *counter)
+ : TAO_Hash_Naming_Context (poa,
+ poa_id),
+ counter_ (counter),
+ persistent_context_ (0),
+ index_ (context_index)
+{
+ ACE_NEW (this->persistent_context_,
+ TAO_Persistent_Bindings_Map (context_index->orb ()));
+
+ // Set the superclass pointer.
+ context_ = persistent_context_;
+
+ persistent_context_->set (map, index_->allocator ());
+}
+
+int
+TAO_Persistent_Naming_Context::init (size_t hash_table_size)
+{
+ return persistent_context_->open (hash_table_size, index_->allocator ());
+}
+
+TAO_Persistent_Naming_Context::~TAO_Persistent_Naming_Context (void)
+{
+ // Perform appropriate cleanup based on the destruction level specified.
+
+ if (this->destroyed_ > 1)
+ {
+ // Remove ourselves from context index.
+ index_->unbind (poa_id_.c_str ());
+ // Remove the underlying data structure from persistent storage.
+ persistent_context_->destroy ();
+ }
+ else if (this->destroyed_ == 1)
+ // Remove the underlying data structure from persistent storage.
+ persistent_context_->destroy ();
+}
+
+void
+TAO_Persistent_Naming_Context::set_cleanup_level (int level)
+{
+ this->destroyed_ = level;
+}
+
+CosNaming::NamingContext_ptr
+TAO_Persistent_Naming_Context::make_new_context (PortableServer::POA_ptr poa,
+ const char *poa_id,
+ size_t context_size,
+ TAO_Persistent_Context_Index * ind
+ ACE_ENV_ARG_DECL)
+{
+ // Store the stub we will return here.
+ CosNaming::NamingContext_var result;
+
+ // Put together a servant for the new Naming Context.
+
+ TAO_Persistent_Naming_Context *context_impl = 0;
+ ACE_NEW_THROW_EX (context_impl,
+ TAO_Persistent_Naming_Context (poa,
+ poa_id,
+ ind),
+ CORBA::NO_MEMORY ());
+ ACE_CHECK_RETURN (result._retn ());
+
+ // Put <context_impl> into the auto pointer temporarily, in case next
+ // allocation fails.
+ ACE_Auto_Basic_Ptr<TAO_Persistent_Naming_Context> temp (context_impl);
+
+ if (context_impl->init (context_size) == -1)
+ ACE_THROW_RETURN (CORBA::NO_MEMORY (), result._retn ());
+
+ // Insure appropriate cleanup in case of exception conditions ahead.
+ context_impl->set_cleanup_level (1);
+
+ // Register with the index of Naming Contexts.
+ if (ind->bind (context_impl->poa_id_.c_str (),
+ context_impl->counter_,
+ context_impl->persistent_context_->map ()) == -1)
+ ACE_THROW_RETURN (CORBA::INTERNAL (), result._retn ());
+
+ // Insure appropriate cleanup in case of exception conditions ahead.
+ context_impl->set_cleanup_level (2);
+
+ TAO_Naming_Context *context = 0;
+ ACE_NEW_THROW_EX (context,
+ TAO_Naming_Context (context_impl),
+ CORBA::NO_MEMORY ());
+ ACE_CHECK_RETURN (result._retn ());
+
+ // Let <implementation> know about it's <interface>.
+ context_impl->interface (context);
+
+ // Release auto pointer, and start using reference counting to
+ // control our servant.
+ temp.release ();
+ PortableServer::ServantBase_var s = context;
+
+ // Register the new context with the POA.
+ PortableServer::ObjectId_var id =
+ PortableServer::string_to_ObjectId (poa_id);
+
+ poa->activate_object_with_id (id.in (),
+ context
+ ACE_ENV_ARG_PARAMETER);
+ ACE_CHECK_RETURN (result._retn ());
+
+ result = context->_this (ACE_ENV_SINGLE_ARG_PARAMETER);
+ ACE_CHECK_RETURN (CosNaming::NamingContext::_nil ());
+
+ // Everything went smoothly, without errors - we don't need any cleanup.
+ context_impl->set_cleanup_level (0);
+
+ return result._retn ();
+}
+
+CosNaming::NamingContext_ptr
+TAO_Persistent_Naming_Context::new_context (ACE_ENV_SINGLE_ARG_DECL)
+{
+ ACE_GUARD_THROW_EX (TAO_SYNCH_RECURSIVE_MUTEX,
+ ace_mon,
+ this->lock_,
+ CORBA::INTERNAL ());
+ ACE_CHECK_RETURN (CosNaming::NamingContext::_nil ());
+
+ // Check to make sure this object didn't have <destroy> method
+ // invoked on it.
+ if (this->destroyed_)
+ ACE_THROW_RETURN (CORBA::OBJECT_NOT_EXIST (),
+ CosNaming::NamingContext::_nil ());
+
+ // Generate a POA id for the new context.
+ char poa_id[BUFSIZ];
+ ACE_OS::sprintf (poa_id,
+ "%s_%d",
+ this->poa_id_.c_str (),
+ (*this->counter_)++);
+
+ CosNaming::NamingContext_var result =
+ make_new_context (this->poa_.in (),
+ poa_id,
+ this->persistent_context_->total_size (),
+ this->index_
+ ACE_ENV_ARG_PARAMETER);
+ ACE_CHECK_RETURN (CosNaming::NamingContext::_nil ());
+
+ return result._retn ();
+}
+
+void
+TAO_Persistent_Naming_Context::list (CORBA::ULong how_many,
+ CosNaming::BindingList_out &bl,
+ CosNaming::BindingIterator_out &bi
+ ACE_ENV_ARG_DECL)
+{
+ // Allocate nil out parameters in case we won't be able to complete
+ // the operation.
+ bi = CosNaming::BindingIterator::_nil ();
+ ACE_NEW_THROW_EX (bl,
+ CosNaming::BindingList (0),
+ CORBA::NO_MEMORY ());
+ ACE_CHECK;
+
+ // Obtain a lock before we proceed with the operation.
+ ACE_GUARD_THROW_EX (TAO_SYNCH_RECURSIVE_MUTEX,
+ ace_mon,
+ this->lock_,
+ CORBA::INTERNAL ());
+ ACE_CHECK;
+
+ // Check to make sure this object didn't have <destroy> method
+ // invoked on it.
+ if (this->destroyed_)
+ ACE_THROW (CORBA::OBJECT_NOT_EXIST ());
+
+ // Dynamically allocate hash map iterator.
+ HASH_MAP::ITERATOR *hash_iter = 0;
+ ACE_NEW_THROW_EX (hash_iter,
+ HASH_MAP::ITERATOR
+ (*persistent_context_->map ()),
+ CORBA::NO_MEMORY ());
+ ACE_CHECK;
+
+ // Store <hash_iter temporarily in auto pointer, in case we'll have
+ // some failures and throw an exception.
+ ACE_Auto_Basic_Ptr<HASH_MAP::ITERATOR> temp (hash_iter);
+
+ // Silliness below is required because of broken old g++!!! E.g.,
+ // without it, we could have just said HASH_MAP::ITERATOR everywhere we use ITER_DEF.
+ typedef ACE_Hash_Map_With_Allocator<TAO_Persistent_ExtId, TAO_Persistent_IntId>::ITERATOR ITER_DEF;
+ typedef ACE_Hash_Map_With_Allocator<TAO_Persistent_ExtId, TAO_Persistent_IntId>::ENTRY ENTRY_DEF;
+
+ // Typedef to the type of BindingIterator servant for ease of use.
+ typedef TAO_Bindings_Iterator<ITER_DEF, ENTRY_DEF> ITER_SERVANT;
+
+ // A pointer to BindingIterator servant.
+ ITER_SERVANT *bind_iter = 0;
+
+ // Number of bindings that will go into the BindingList.
+ CORBA::ULong n;
+
+ // Calculate number of bindings that will go into bl.
+ if (this->context_->current_size () > how_many)
+ n = how_many;
+ else
+ n = static_cast<CORBA::ULong> (this->context_->current_size ());
+
+ // Use hash iterator to populate a BindingList with bindings.
+ bl->length (n);
+
+ ENTRY_DEF *hash_entry = 0;
+
+ for (CORBA::ULong i = 0; i < n; i++)
+ {
+ hash_iter->next (hash_entry);
+ hash_iter->advance ();
+
+ if (ITER_SERVANT::populate_binding (hash_entry, bl[i]) == 0)
+ ACE_THROW (CORBA::NO_MEMORY());
+ }
+
+ // Now we are done with the BindingsList, and we can follow up on
+ // the iterator business.
+
+ // If we do not need to pass back BindingIterator.
+ if (this->context_->current_size () <= how_many)
+ return;
+ else
+ {
+ // Create a BindingIterator for return.
+ ACE_NEW_THROW_EX (bind_iter,
+ ITER_SERVANT (this, hash_iter, this->poa_.in (), this->lock_),
+ CORBA::NO_MEMORY ());
+ ACE_CHECK;
+
+ // Release <hash_iter> from auto pointer, and start using the
+ // reference counting to control our servant.
+ temp.release ();
+ PortableServer::ServantBase_var iter = bind_iter;
+
+ // Increment reference count on this Naming Context, so it doesn't get
+ // deleted before the BindingIterator servant gets deleted.
+ interface_->_add_ref (ACE_ENV_SINGLE_ARG_PARAMETER);
+ ACE_CHECK;
+
+ // Register with the POA.
+ char poa_id[BUFSIZ];
+ ACE_OS::sprintf (poa_id,
+ "%s_%d",
+ this->poa_id_.c_str (),
+ (*this->counter_)++);
+ PortableServer::ObjectId_var id =
+ PortableServer::string_to_ObjectId (poa_id);
+
+ this->poa_->activate_object_with_id (id.in (),
+ bind_iter
+ ACE_ENV_ARG_PARAMETER);
+ ACE_CHECK;
+
+ bi = bind_iter->_this (ACE_ENV_SINGLE_ARG_PARAMETER);
+ ACE_CHECK;
+ }
+}
+
+TAO_END_VERSIONED_NAMESPACE_DECL
diff --git a/TAO/orbsvcs/orbsvcs/Naming/Persistent_Naming_Context.h b/TAO/orbsvcs/orbsvcs/Naming/Persistent_Naming_Context.h
new file mode 100644
index 00000000000..4ad3b2e61c0
--- /dev/null
+++ b/TAO/orbsvcs/orbsvcs/Naming/Persistent_Naming_Context.h
@@ -0,0 +1,273 @@
+// -*- C++ -*-
+
+//=============================================================================
+/**
+ * @file Persistent_Naming_Context.h
+ *
+ * $Id$
+ *
+ * @author Marina Spivak <marina@cs.wustl.edu>
+ */
+//=============================================================================
+
+
+#ifndef TAO_PERSISTENT_NAMING_CONTEXT_H
+#define TAO_PERSISTENT_NAMING_CONTEXT_H
+#include /**/ "ace/pre.h"
+
+#include "orbsvcs/Naming/Hash_Naming_Context.h"
+#include "orbsvcs/Naming/Persistent_Entries.h"
+#include "orbsvcs/Naming/naming_serv_export.h"
+
+TAO_BEGIN_VERSIONED_NAMESPACE_DECL
+
+/**
+ * @class TAO_Persistent_Bindings_Map
+ *
+ * @brief Provides hash-table-based persistent storage for
+ * name to object bindings in a Naming Context.
+ *
+ * Wrapper on top of ACE_Hash_Map_With_Allocator (which is a wrapper
+ * around ACE_Hash_Map_Manager). Uses ACE_Allocator (allocating
+ * from persistent storage) to make bindings persistent and
+ * supports TAO_Bindings_Map interface. Used by TAO_Persistent_Naming_Context.
+ */
+class TAO_Naming_Serv_Export TAO_Persistent_Bindings_Map
+ : public TAO_Bindings_Map
+{
+public:
+
+ /// Underlying data structure - typedef for ease of use.
+ typedef ACE_Hash_Map_With_Allocator<TAO_Persistent_ExtId, TAO_Persistent_IntId> HASH_MAP;
+
+ // = Initialization and termination methods.
+
+ /// Constructor.
+ TAO_Persistent_Bindings_Map (CORBA::ORB_ptr orb);
+
+ /// Allocate hash map of size <hash_map_size> from persistent storage
+ /// using the <alloc>.
+ int open (size_t hash_map_size,
+ ACE_Allocator *alloc);
+
+ /// The hash map has already been preallocated for us. We just need
+ /// to set our data members take ownership of it.
+ void set (HASH_MAP *map,
+ ACE_Allocator *alloc);
+
+ /// Destructor. Does not deallocate the hash map: if an instance of
+ /// this class goes out of scope, its hash_map remains in persistent storage.
+ virtual ~TAO_Persistent_Bindings_Map (void);
+
+ /**
+ * This method removes the hash map from persistent storage/frees up
+ * the memory. The hash map better be empty, since we are not
+ * cleaning up the insides. (We could add <close> to clean entries,
+ * but not the data inside the entries.
+ */
+ void destroy (void);
+
+ // = Accessor methods.
+
+ /// Get a pointer to the underlying hash map.
+ HASH_MAP *map (void);
+
+ /// Return the size of the underlying hash table.
+ size_t total_size (void);
+
+ /// Return the size of the underlying hash table.
+ virtual size_t current_size (void);
+
+ // = Name bindings manipulation methods.
+
+ /**
+ * Add a binding with the specified parameters to the table.
+ * Return 0 on success and -1 on failure, 1 if there already is a
+ * binding with <id> and <kind>.
+ */
+ virtual int bind (const char *id,
+ const char *kind,
+ CORBA::Object_ptr obj,
+ CosNaming::BindingType type);
+
+ /**
+ * Overwrite a binding containing <id> and <kind> (or create a new
+ * one if one doesn't exist) with the specified parameters. Return
+ * 0 or 1 on success. Return -1 or -2 on failure. (-2 is returned
+ * if the new and old bindings differ in type).
+ */
+ virtual int rebind (const char *id,
+ const char *kind,
+ CORBA::Object_ptr obj,
+ CosNaming::BindingType type);
+
+ /**
+ * Remove a binding containing <id> and <kind> from the table.
+ * Return 0 on success and -1 on failure.
+ */
+ virtual int unbind (const char * id,
+ const char * kind);
+
+ /**
+ * Find the binding containing <id> and <kind> in the table, and
+ * pass binding's type and object back to the caller by reference.
+ * Return 0 on success and -1 on failure. Note: a 'duplicated' object
+ * reference is assigned to <obj>, so the caller is responsible for
+ * its deallocation.
+ */
+ virtual int find (const char * id,
+ const char * kind,
+ CORBA::Object_ptr & obj,
+ CosNaming::BindingType &type);
+
+protected:
+
+ /**
+ * Helper to the <open> method. By isolating placement new into a
+ * separate method, we can deal with memory allocation failures more
+ * efficiently. If there is a problem in HASH_MAP constructor, we
+ * can clean up preallocated space.
+ */
+ int open_helper (size_t hash_table_size,
+ void *buffer);
+
+ /// Helper: factors common code from <bind> and <rebind>.
+ int shared_bind (const char *id,
+ const char *kind,
+ CORBA::Object_ptr obj,
+ CosNaming::BindingType type,
+ int rebind);
+
+ /// Pointer to the allocator we use to make bindings persistent.
+ ACE_Allocator *allocator_;
+
+ /// Pointer to the underlying hash map.
+ HASH_MAP *map_;
+
+ /// Pointer to the orb. We need it to do string/object conversions.
+ CORBA::ORB_var orb_;
+};
+
+class TAO_Persistent_Context_Index;
+
+/**
+ * @class TAO_Persistent_Naming_Context
+ *
+ * @brief This class plays a role of a 'ConcreteImplementor' in the
+ * Bridge pattern architecture of the CosNaming::NamingContext implementation.
+ *
+ * This class provides a persistent implementation of the
+ * NamingContext functionality, i.e., the state is preserved across
+ * process boundaries. Derives from TAO_Hash_Naming_Context and
+ * uses TAO_Persistent_Bindings_Map to store name to object bindings.
+ */
+class TAO_Naming_Serv_Export TAO_Persistent_Naming_Context : public TAO_Hash_Naming_Context
+{
+public:
+ /// Underlying data structure - typedef for ease of use.
+ typedef TAO_Persistent_Bindings_Map::HASH_MAP HASH_MAP;
+
+ // = Initialization and termination methods.
+
+ /// Constructor. MUST be followed up by <init> to allocate the
+ /// underlying data structure from persistent storage!
+ TAO_Persistent_Naming_Context (PortableServer::POA_ptr poa,
+ const char *poa_id,
+ TAO_Persistent_Context_Index *context_index);
+
+ /// Allocate the underlying data structure from persistent storage.
+ /// Returns 0 on success and -1 on failure.
+ int init (size_t hash_table_size = ACE_DEFAULT_MAP_SIZE);
+
+ /**
+ * Constructor that takes in preallocated data structure and takes
+ * ownership of it. This constructor is for 'recreating' servants
+ * from persistent state.
+ */
+ TAO_Persistent_Naming_Context (PortableServer::POA_ptr poa,
+ const char *poa_id,
+ TAO_Persistent_Context_Index *context_index,
+ HASH_MAP * map,
+ ACE_UINT32 *counter);
+
+ /// Destructor.
+ virtual ~TAO_Persistent_Naming_Context (void);
+
+ // = Utility methods.
+ /**
+ * This utility method factors out the code needed to create a new
+ * Persistent Naming Context servant and activate it under the
+ * specified POA with the specified id. This function is static so
+ * that the code can be used, both from inside the class (e.g., <new_context>),
+ * and from outside (e.g., Naming_Utils.cpp).
+ */
+ static CosNaming::NamingContext_ptr make_new_context (PortableServer::POA_ptr poa,
+ const char *poa_id,
+ size_t context_size,
+ TAO_Persistent_Context_Index *ind
+ ACE_ENV_ARG_DECL);
+
+ // = Methods not implemented in TAO_Hash_Naming_Context.
+
+ /**
+ * This operation returns a new naming context implemented by the
+ * same naming server in which the operation was invoked. The
+ * context is not bound.
+ */
+ virtual CosNaming::NamingContext_ptr new_context (ACE_ENV_SINGLE_ARG_DECL);
+
+ /**
+ * Returns at most the requested number of bindings <how_many> in
+ * <bl>. If the naming context contains additional bindings, they
+ * are returned with a BindingIterator. In the naming context does
+ * not contain any additional bindings <bi> returned as null.
+ */
+ virtual void list (CORBA::ULong how_many,
+ CosNaming::BindingList_out &bl,
+ CosNaming::BindingIterator_out &bi
+ ACE_ENV_ARG_DECL);
+
+protected:
+
+ /**
+ * Set <destroyed_> flag (inherited from TAO_Hash_Naming_Context) to
+ * <level>. Legal values for <destroyed_> are 0, 1, and 2. The
+ * values specify the extent of cleanup that should take place in the
+ * context's destructor:
+ * '0' - no cleanup (e.g., if the context goes out of scope, but
+ * it's state is to remain in persistent storage);
+ * '1' - free up the underlying data structure in persistent storage
+ * (e.g., if the initialization of this context was only partially completed
+ * due to some failures, and we need to roll back);
+ * '2' - free up the underlying data structure, and deregister this
+ * naming context from its <index_> (e.g., if the context had
+ * <destroy> method invoked and needs to be completely removed from existence).
+ */
+ void set_cleanup_level (int level);
+
+ /// Counter used for generation of POA ids for children Naming
+ /// Contexts.
+ ACE_UINT32 *counter_;
+
+ /**
+ * A pointer to the underlying data structure used to store name
+ * bindings. While our superclass (TAO_Hash_Naming_Context) also
+ * maintains a pointer to the data structure, keeping this pointer
+ * around saves us from the need to downcast when invoking
+ * non-virtual methods.
+ */
+ TAO_Persistent_Bindings_Map *persistent_context_;
+
+ /**
+ * A pointer to the index object of this naming service: it keeps
+ * track of all the naming contexts created. Every time we make a
+ * new context or destroy one, we need to make an entry there.
+ * Also, we get the allocator needed to initialize us from this guy.
+ */
+ TAO_Persistent_Context_Index *index_;
+};
+
+TAO_END_VERSIONED_NAMESPACE_DECL
+
+#include /**/ "ace/post.h"
+#endif /* TAO_PERSISTENT_NAMING_CONTEXT_H */
diff --git a/TAO/orbsvcs/orbsvcs/Naming/README b/TAO/orbsvcs/orbsvcs/Naming/README
new file mode 100644
index 00000000000..5145337c611
--- /dev/null
+++ b/TAO/orbsvcs/orbsvcs/Naming/README
@@ -0,0 +1,69 @@
+// $Id$
+
+CONTENT
+=======
+This directory contains files implementing CosNaming idl interfaces
+(from CORBA COSS), as well as a few utilities. Server code, service
+executable, and documentation for using the service are located in
+$TAO_ROOT/orbsvcs/Naming_Service.
+
+
+UTILITIES
+=========
+Naming_{Client,Server}.{h,cpp} contain utility classes that can simplify
+programs which play a role of Naming Service server or client. See
+$TAO_ROOT/orbsvcs/Naming_Service/Naming_Service.{h,cpp} and
+$TAO_ROOT/orbsvcs/tests/Simple_Naming/client.{h,cpp} for examples of
+using these classes.
+
+
+IMPLEMENTATION
+==============
+The architecture for TAO's implementation of CosNaming::NamingContext
+interface follows the Bridge pattern.
+
+ * TAO_Naming_Context (in Naming_Context_Interface.h) inherits from
+ POA skeleton, and plays the role of 'Abstraction' (aka 'Interface')
+ in the Bridge architecture - it forwards all client requests to a
+ 'ConcreteImplementor' through an 'Implementor' pointer.
+
+ * TAO_Naming_Context_Impl (in Naming_Context_Interface.h) is an
+ abstract base class for all concrete implementations of
+ NamingContext functionality (i.e., 'Implementor').
+
+ * Currently, TAO Naming Service has two 'ConcreteImplementors':
+ TAO_Transient_Naming_Context (in Transient_Naming_Context.h), and
+ TAO_Persistent_Naming_Context (in Persistent_Naming_Context.h),
+ providing non-persistent and persistent, hash-table-based implementations of the
+ NamingContext functionality, correspondingly. Both
+ 'ConcreteImplementors' inherit from TAO_Hash_Naming_Context (in
+ Hash_Naming_Context.h), which, in turn, inherits from
+ TAO_Naming_Context_Impl. TAO_Hash_Naming_Context factors out code
+ common to both 'ConcreteImplementors'. (Here we have a form of the
+ Template Method pattern).
+
+* Other major classes:
+ - TAO_Persistent_Context_Index - facilitates implementation of the
+ Persistent version of the Naming Service.
+ - TAO_BindingsIterator - implements CosNaming::BindingIterator
+ interface. Can be used with either of the NamingContext 'ConcreteImplementors'.
+
+* Persistent implementation of the Naming Service uses ACE_Allocators
+ and memory-mapped files.
+
+The Bridge implementation class structure makes it easy to:
+
+1) Create and plug-in different CosNaming::NamingContext implementations by
+ subclassing TAO_Naming_Context_Impl.
+
+2) Dynamically load an appropriate NamingContext implementation at
+ run-time, based on the config file entry, by making TAO_Naming_Context_Impl
+ inherit from ACE_Service_Object...
+
+
+TO-DO
+=====
+Extend CosNaming::NamingContext interface and its implementation to
+support binding of more than one object per name and name
+resolution according to policies (e.g., random or round robin), to provide
+Load Balancing functionality.
diff --git a/TAO/orbsvcs/orbsvcs/Naming/Storable.cpp b/TAO/orbsvcs/orbsvcs/Naming/Storable.cpp
new file mode 100644
index 00000000000..b04ee7c389d
--- /dev/null
+++ b/TAO/orbsvcs/orbsvcs/Naming/Storable.cpp
@@ -0,0 +1,25 @@
+// $Id$
+// ============================================================================
+//
+// = LIBRARY
+// cos
+//
+// = FILENAME
+// Storable.cpp
+//
+// = AUTHOR
+// Bruce Trask <trask_b@ociweb.com>
+// Chanaka Liyanaarachchi <chanaka@ociweb.com>
+//
+// ============================================================================
+
+#include "orbsvcs/Naming/Storable.h"
+
+#if !defined (__ACE_INLINE__)
+#include "orbsvcs/Naming/Storable.inl"
+#endif /* __ACE_INLINE__ */
+
+
+
+
+
diff --git a/TAO/orbsvcs/orbsvcs/Naming/Storable.h b/TAO/orbsvcs/orbsvcs/Naming/Storable.h
new file mode 100644
index 00000000000..1fcb9bf14b2
--- /dev/null
+++ b/TAO/orbsvcs/orbsvcs/Naming/Storable.h
@@ -0,0 +1,165 @@
+// -*- C++ -*-
+
+//=============================================================================
+/**
+ * @file Storable.h
+ *
+ * $Id$
+ *
+ * @author Bruce Trask <trask_b@ociweb.com>
+ * @author Chanaka Liyanaarachchi <chanaka@ociweb.com>
+ */
+//=============================================================================
+
+
+#ifndef TAO_NAMING_STORABLE_H
+#define TAO_NAMING_STORABLE_H
+
+#include "ace/config-all.h"
+
+#if !defined (ACE_LACKS_PRAGMA_ONCE)
+#pragma once
+#endif /* ACE_LACKS_PRAGMA_ONCE */
+
+#include "tao/Versioned_Namespace.h"
+#include "ace/SString.h"
+
+TAO_BEGIN_VERSIONED_NAMESPACE_DECL
+
+static const int szInt = sizeof(int);
+static const int szChar = sizeof(char);
+static const int szBool = sizeof(int);
+
+class TAO_NS_Persistence_Header
+{
+ public:
+ void size (unsigned int size);
+ unsigned int size () const ;
+
+ void destroyed (int flag);
+ int destroyed () const ;
+
+ private:
+ unsigned int size_;
+ int destroyed_;
+};
+
+class TAO_NS_Persistence_Record
+{
+ public:
+ enum Record_Type {LOCAL_NCONTEXT, OBJREF, REMOTE_NCONTEXT};
+
+ Record_Type type () const;
+ void type (Record_Type type);
+
+ ACE_CString id () const;
+ void id (const ACE_CString& id);
+
+ ACE_CString kind () const;
+ void kind (const ACE_CString& kind);
+
+ ACE_CString ref () const;
+ void ref (const ACE_CString& ior);
+
+ private:
+ Record_Type type_;
+ ACE_CString id_;
+ ACE_CString kind_;
+ ACE_CString ref_;
+};
+
+class TAO_NS_Persistence_Global
+{
+ public:
+ void counter (unsigned int counter);
+ unsigned int counter () const ;
+
+ private:
+ unsigned int counter_;
+};
+
+class TAO_Storable_Base
+{
+public:
+ TAO_Storable_Base();
+
+ virtual ~TAO_Storable_Base();
+
+ virtual void remove() = 0;
+
+ virtual int exists() = 0;
+
+ virtual int open () = 0;
+
+ virtual int close () = 0;
+
+ virtual int flock (int whence, int start, int len) = 0;
+
+ virtual int funlock (int whence, int start, int len) = 0;
+
+ virtual time_t last_changed(void) = 0;
+
+ // Mimic a portion of the std::ios interface. We need to be able
+ // to indicate error states from the extraction operators below.
+ enum Storable_State { goodbit = 0,
+ badbit = 1,
+ eofbit = 2,
+ failbit = 4
+ };
+
+ void clear (Storable_State state = goodbit);
+
+ void setstate (Storable_State state);
+
+ Storable_State rdstate (void) const;
+
+ bool good (void) const;
+
+ bool bad (void) const;
+
+ bool eof (void) const;
+
+ bool fail (void) const;
+
+ virtual TAO_Storable_Base& operator << (
+ const TAO_NS_Persistence_Header& header) = 0;
+
+ virtual TAO_Storable_Base& operator << (
+ const TAO_NS_Persistence_Record& record) = 0;
+
+ virtual TAO_Storable_Base& operator >> (
+ TAO_NS_Persistence_Header& header) = 0;
+
+ virtual TAO_Storable_Base& operator >> (
+ TAO_NS_Persistence_Record& record) = 0;
+
+ virtual TAO_Storable_Base& operator << (
+ const TAO_NS_Persistence_Global& global) = 0;
+
+ virtual TAO_Storable_Base& operator >> (
+ TAO_NS_Persistence_Global& global) = 0;
+
+private:
+ Storable_State state_;
+};
+
+class TAO_Naming_Service_Persistence_Factory
+{
+public:
+ TAO_Naming_Service_Persistence_Factory();
+
+ virtual ~TAO_Naming_Service_Persistence_Factory();
+
+ // Factory Methods
+
+ virtual TAO_Storable_Base *create_stream(const ACE_CString & file,
+ const ACE_TCHAR * mode) = 0;
+};
+
+TAO_END_VERSIONED_NAMESPACE_DECL
+
+#if defined (__ACE_INLINE__)
+#include "orbsvcs/Naming/Storable.inl"
+#endif /* __ACE_INLINE_ */
+
+#endif /* TAO_NAMING_STORABLE_H */
diff --git a/TAO/orbsvcs/orbsvcs/Naming/Storable.inl b/TAO/orbsvcs/orbsvcs/Naming/Storable.inl
new file mode 100644
index 00000000000..50a149a9c0c
--- /dev/null
+++ b/TAO/orbsvcs/orbsvcs/Naming/Storable.inl
@@ -0,0 +1,170 @@
+// -*- C++ -*-
+
+// $Id$
+// ============================================================================
+//
+// = LIBRARY
+// cos
+//
+// = FILENAME
+// Storable.i
+//
+// = AUTHOR
+// Bruce Trask <trask_b@ociweb.com>
+// Chanaka Liyanaarachchi <chanaka@ociweb.com>
+//
+// ============================================================================
+
+TAO_BEGIN_VERSIONED_NAMESPACE_DECL
+
+ACE_INLINE void
+TAO_NS_Persistence_Header::size (unsigned int size)
+{
+ this->size_ = size;
+}
+
+ACE_INLINE unsigned int
+TAO_NS_Persistence_Header::size () const
+{
+ return this->size_;
+}
+
+ACE_INLINE void
+TAO_NS_Persistence_Header::destroyed (int flag)
+{
+ this->destroyed_ = flag;
+}
+
+ACE_INLINE int
+TAO_NS_Persistence_Header::destroyed () const
+{
+ return this->destroyed_;
+}
+
+
+ACE_INLINE TAO_NS_Persistence_Record::Record_Type
+TAO_NS_Persistence_Record::type () const
+{
+ return this->type_;
+}
+
+ACE_INLINE void
+TAO_NS_Persistence_Record::type (Record_Type type)
+{
+ this->type_ = type;
+}
+
+ACE_INLINE ACE_CString
+TAO_NS_Persistence_Record::id () const
+{
+ return this->id_;
+}
+
+ACE_INLINE void
+TAO_NS_Persistence_Record::id (const ACE_CString& id)
+{
+ this->id_ = id;
+}
+
+ACE_INLINE ACE_CString
+TAO_NS_Persistence_Record::kind () const
+{
+ return this->kind_;
+}
+
+ACE_INLINE void
+TAO_NS_Persistence_Record::kind (const ACE_CString& kind)
+{
+ this->kind_ = kind;
+}
+
+ACE_INLINE ACE_CString
+TAO_NS_Persistence_Record::ref () const
+{
+ return this->ref_;
+}
+
+ACE_INLINE void
+TAO_NS_Persistence_Record::ref (const ACE_CString& ref)
+{
+ this->ref_ = ref;
+}
+
+ACE_INLINE void
+TAO_NS_Persistence_Global::counter (unsigned int counter)
+{
+ this->counter_ = counter;
+}
+
+ACE_INLINE unsigned int
+TAO_NS_Persistence_Global::counter () const
+{
+ return this->counter_;
+}
+
+
+ACE_INLINE
+TAO_Naming_Service_Persistence_Factory::TAO_Naming_Service_Persistence_Factory()
+{
+}
+
+ACE_INLINE
+TAO_Naming_Service_Persistence_Factory::~TAO_Naming_Service_Persistence_Factory()
+{
+}
+
+ACE_INLINE
+TAO_Storable_Base::TAO_Storable_Base()
+ : state_ (goodbit)
+{
+}
+
+ACE_INLINE
+TAO_Storable_Base::~TAO_Storable_Base()
+{
+}
+
+ACE_INLINE void
+TAO_Storable_Base::clear (TAO_Storable_Base::Storable_State state)
+{
+ this->state_ = state;
+}
+
+ACE_INLINE void
+TAO_Storable_Base::setstate (TAO_Storable_Base::Storable_State state)
+{
+ this->clear (static_cast <TAO_Storable_Base::Storable_State> (
+ this->rdstate () | state));
+}
+
+ACE_INLINE TAO_Storable_Base::Storable_State
+TAO_Storable_Base::rdstate (void) const
+{
+ return this->state_;
+}
+
+ACE_INLINE bool
+TAO_Storable_Base::good (void) const
+{
+ return (this->state_ == goodbit);
+}
+
+ACE_INLINE bool
+TAO_Storable_Base::bad (void) const
+{
+ return (this->state_ & badbit);
+}
+
+ACE_INLINE bool
+TAO_Storable_Base::eof (void) const
+{
+ return (this->state_ & eofbit);
+}
+
+ACE_INLINE bool
+TAO_Storable_Base::fail (void) const
+{
+ return (this->state_ & failbit);
+}
+
+TAO_END_VERSIONED_NAMESPACE_DECL
diff --git a/TAO/orbsvcs/orbsvcs/Naming/Storable_Naming_Context.cpp b/TAO/orbsvcs/orbsvcs/Naming/Storable_Naming_Context.cpp
new file mode 100644
index 00000000000..cdcfa73cb3d
--- /dev/null
+++ b/TAO/orbsvcs/orbsvcs/Naming/Storable_Naming_Context.cpp
@@ -0,0 +1,1584 @@
+#include "orbsvcs/Naming/Storable_Naming_Context.h"
+#include "orbsvcs/Naming/Bindings_Iterator_T.h"
+
+#include "tao/debug.h"
+
+// The following #pragma is needed to disable a warning that occurs
+// in MSVC 6 due to the overly long debugging symbols generated for
+// the ACE_Auto_Basic_Ptr<ACE_Hash_Map_Iterator_Ex<TAO_...> > template
+// instance used by some of the methods in this file.
+#ifdef _MSC_VER
+# pragma warning(disable: 4786) /* identifier was truncated to '255'
+ characters in the browser
+ information */
+#endif /* _MSC_VER */
+
+#include "ace/Auto_Ptr.h"
+#include "ace/OS_NS_stdio.h"
+
+ACE_RCSID (Naming,
+ Storable_Naming_Context,
+ "$Id$")
+
+
+TAO_BEGIN_VERSIONED_NAMESPACE_DECL
+
+const char * TAO_Storable_Naming_Context::root_name_;
+ACE_UINT32 TAO_Storable_Naming_Context::gcounter_;
+ACE_Auto_Ptr<TAO_Storable_Base> TAO_Storable_Naming_Context::gfl_;
+int TAO_Storable_Naming_Context::redundant_;
+
+TAO_Storable_IntId::TAO_Storable_IntId (void)
+ : ref_ (CORBA::string_dup ("")),
+ type_ (CosNaming::nobject)
+{
+}
+
+TAO_Storable_IntId::TAO_Storable_IntId (const char * ior,
+ CosNaming::BindingType type)
+ : ref_ (ior),
+ type_ (type)
+{
+}
+
+TAO_Storable_IntId::TAO_Storable_IntId (const TAO_Storable_IntId &rhs)
+{
+ ref_ = rhs.ref_;
+ type_ = rhs.type_;
+}
+
+TAO_Storable_IntId::~TAO_Storable_IntId (void)
+{
+}
+
+void
+TAO_Storable_IntId::operator= (const TAO_Storable_IntId &rhs)
+{
+ // check for self assignment.
+ if (&rhs == this)
+ return;
+
+ type_ = rhs.type_;
+ ref_ = rhs.ref_;
+}
+
+TAO_Storable_ExtId::TAO_Storable_ExtId (void)
+ : id_ (CORBA::string_dup ("")),
+ kind_ (CORBA::string_dup (""))
+{
+}
+
+TAO_Storable_ExtId::TAO_Storable_ExtId (const char *id,
+ const char *kind)
+ : id_ (id)
+ , kind_ (kind)
+{
+}
+
+TAO_Storable_ExtId::TAO_Storable_ExtId (const TAO_Storable_ExtId &rhs)
+{
+ id_ = rhs.id_;
+ kind_ = rhs.kind_;
+}
+
+TAO_Storable_ExtId::~TAO_Storable_ExtId (void)
+{
+}
+
+void
+TAO_Storable_ExtId::operator= (const TAO_Storable_ExtId &rhs)
+{
+ // Check for self assignment.
+ if (&rhs == this)
+ return;
+
+ id_ = rhs.id_;
+ kind_ = rhs.kind_;
+}
+
+bool
+TAO_Storable_ExtId::operator== (const TAO_Storable_ExtId &rhs) const
+{
+ return (ACE_OS::strcmp (id_.in(), rhs.id_.in()) == 0)
+ && (ACE_OS::strcmp (kind_.in(), rhs.kind_.in()) == 0);
+}
+
+bool
+TAO_Storable_ExtId::operator!= (const TAO_Storable_ExtId &rhs) const
+{
+ return (ACE_OS::strcmp (id_.in(), rhs.id_.in()) != 0)
+ || (ACE_OS::strcmp (kind_.in(), rhs.kind_.in()) != 0);
+}
+
+u_long
+TAO_Storable_ExtId::hash (void) const
+{
+ // @CJC I wager this could be optimized a bit better, but I'm not
+ // sure how much it's called. At the very least, we could allocate
+ // just one ACE_CString, and copy id_ and kind_ into that, rather than
+ // taking a double-hit on allocations.
+ ACE_CString temp (id_.in());
+ temp += kind_.in();
+
+ return temp.hash ();
+}
+
+const char *
+TAO_Storable_ExtId::id (void)
+{
+ return id_.in();
+}
+
+const char *
+TAO_Storable_ExtId::kind (void)
+{
+ return kind_.in();
+}
+
+int
+TAO_Storable_Bindings_Map::unbind (const char *id,
+ const char *kind)
+{
+ ACE_TRACE("unbind");
+ TAO_Storable_ExtId name (id, kind);
+ return this->map_.unbind (name);
+}
+
+int
+TAO_Storable_Bindings_Map::bind (const char *id,
+ const char *kind,
+ CORBA::Object_ptr obj,
+ CosNaming::BindingType type)
+{
+ ACE_TRACE("bind");
+ return this->shared_bind (id, kind, obj, type, 0);
+}
+
+int
+TAO_Storable_Bindings_Map::rebind (const char *id,
+ const char *kind,
+ CORBA::Object_ptr obj,
+ CosNaming::BindingType type)
+{
+ ACE_TRACE("rebind");
+ return this->shared_bind (id, kind, obj, type, 1);
+}
+
+int
+TAO_Storable_Bindings_Map::find (const char *id,
+ const char *kind,
+ CORBA::Object_ptr & obj,
+ CosNaming::BindingType &type)
+{
+ ACE_TRACE("find");
+ TAO_Storable_ExtId name (id, kind);
+ TAO_Storable_IntId entry;
+
+ if (this->map_.find (name,
+ entry) != 0)
+ {
+ return -1;
+ }
+ else
+ {
+ ACE_DECLARE_NEW_CORBA_ENV;
+ obj = orb_->string_to_object (entry.ref_.in() ACE_ENV_ARG_PARAMETER);
+ ACE_CHECK_RETURN (-1);
+ type = entry.type_;
+
+ return 0;
+ }
+}
+
+TAO_Storable_Bindings_Map::TAO_Storable_Bindings_Map (size_t hash_table_size,
+ CORBA::ORB_ptr orb)
+ : map_ (hash_table_size),
+ orb_(CORBA::ORB::_duplicate (orb))
+{
+ ACE_TRACE("TAO_Storable_Bindings_Map");
+}
+
+TAO_Storable_Bindings_Map::~TAO_Storable_Bindings_Map (void)
+{
+ ACE_TRACE("~TAO_Storable_Bindings_Map");
+}
+
+TAO_Storable_Bindings_Map::HASH_MAP &
+TAO_Storable_Bindings_Map::map (void)
+{
+ ACE_TRACE("map");
+ return map_;
+}
+
+size_t
+TAO_Storable_Bindings_Map::current_size (void)
+{
+ ACE_TRACE("current_size");
+ return map_.current_size ();
+}
+
+size_t
+TAO_Storable_Bindings_Map::total_size (void)
+{
+ ACE_TRACE("total_size");
+ return map_.total_size ();
+}
+
+int
+TAO_Storable_Bindings_Map::shared_bind (const char * id,
+ const char * kind,
+ CORBA::Object_ptr obj,
+ CosNaming::BindingType type,
+ int rebind)
+{
+ ACE_TRACE("shared_bind");
+ TAO_Storable_ExtId new_name (id, kind);
+ CORBA::String_var ior = orb_->object_to_string(obj);
+ TAO_Storable_IntId new_entry (ior.in(), type);
+ TAO_Storable_IntId old_entry;
+
+ if (rebind == 0)
+ {
+ // Do a normal bind.
+ return this->map_.bind (new_name, new_entry);
+ }
+ else
+ // Rebind.
+ {
+ // Check that types of old and new entries match.
+ if (this->map_.find (new_name,
+ old_entry) == 0
+ && type != old_entry.type_)
+ return -2;
+
+ else
+ return this->map_.rebind (new_name, new_entry);
+ }
+}
+
+void TAO_Storable_Naming_Context::Write(TAO_Storable_Base& wrtr)
+{
+ ACE_TRACE("Write");
+ TAO_NS_Persistence_Header header;
+
+ header.size (static_cast<unsigned int> (storable_context_->current_size()));
+ header.destroyed (destroyed_);
+
+ wrtr << header;
+
+ if (0u == header.size ())
+ return;
+
+ ACE_Hash_Map_Iterator<TAO_Storable_ExtId,TAO_Storable_IntId,
+ ACE_Null_Mutex> it = storable_context_->map().begin();
+ ACE_Hash_Map_Iterator<TAO_Storable_ExtId,TAO_Storable_IntId,
+ ACE_Null_Mutex> itend = storable_context_->map().end();
+
+ ACE_Hash_Map_Entry<TAO_Storable_ExtId,TAO_Storable_IntId> ent = *it;
+
+ while (!(it == itend))
+ {
+ TAO_NS_Persistence_Record record;
+
+ ACE_CString name;
+ CosNaming::BindingType bt = (*it).int_id_.type_;
+ if (bt == CosNaming::ncontext)
+ {
+ CORBA::Object_var
+ obj = orb_->string_to_object ((*it).int_id_.ref_.in ());
+ if (obj->_is_collocated ())
+ {
+ // This is a local (i.e. non federated context) we therefore
+ // store only the ObjectID (persistence filename) for the object.
+
+ // The driving force behind storing ObjectIDs rather than IORs for
+ // local contexts is to provide for a redundant naming service.
+ // That is, a naming service that runs simultaneously on multiple
+ // machines sharing a file system. It allows multiple redundant
+ // copies to be started and stopped independently.
+ // The original target platform was Tru64 Clusters where there was
+ // a cluster address. In that scenario, clients may get different
+ // servers on each request, hence the requirement to keep
+ // synchronized to the disk. It also works on non-cluster system
+ // where the client picks one of the redundant servers and uses it,
+ // while other systems can pick different servers. (However in this
+ // scenario, if a server fails and a client must pick a new server,
+ // that client may not use any saved context IORs, instead starting
+ // from the root to resolve names. So this latter mode is not quite
+ // transparent to clients.) [Rich Seibel (seibel_r) of ociweb.com]
+
+ PortableServer::ObjectId_var
+ oid = poa_->reference_to_id (obj.in ());
+ CORBA::String_var
+ nm = PortableServer::ObjectId_to_string (oid.in ());
+ const char
+ *newname = nm.in ();
+ name.set (newname); // The local ObjectID (persistance filename)
+ record.type (TAO_NS_Persistence_Record::LOCAL_NCONTEXT);
+ }
+ else
+ {
+ // Since this is a foreign (federated) context, we can not store
+ // the objectID (because it isn't in our storage), if we did, when
+ // we restore, we would end up either not finding a permanent
+ // record (and thus ending up incorrectly assuming the context was
+ // destroyed) or loading another context altogether (just because
+ // the contexts shares its objectID filename which is very likely).
+ // [Simon Massey (sma) of prismtech.com]
+
+ name.set ((*it).int_id_.ref_.in ()); // The federated context IOR
+ record.type (TAO_NS_Persistence_Record::REMOTE_NCONTEXT);
+ }
+ }
+ else // if (bt == CosNaming::nobject) // shouldn't be any other, can there?
+ {
+ name.set ((*it).int_id_.ref_.in ()); // The non-context object IOR
+ record.type (TAO_NS_Persistence_Record::OBJREF);
+ }
+ record.ref(name);
+
+ const char *myid = (*it).ext_id_.id();
+ ACE_CString id(myid);
+ record.id(id);
+
+ const char *mykind = (*it).ext_id_.kind();
+ ACE_CString kind(mykind);
+ record.kind(kind);
+
+ wrtr << record;
+ it.advance();
+ }
+}
+
+// Helper function to load a new context into the binding_map
+int
+TAO_Storable_Naming_Context::load_map(File_Open_Lock_and_Check *flck
+ ACE_ENV_ARG_DECL)
+{
+ ACE_TRACE("load_map");
+ // assume file already open for reading
+ TAO_Storable_Bindings_Map *bindings_map;
+
+ // create the new bindings map
+ ACE_NEW_THROW_EX (bindings_map,
+ TAO_Storable_Bindings_Map (hash_table_size_,orb_.in()),
+ CORBA::NO_MEMORY ());
+
+ // get the data for this bindings map from the file
+
+ TAO_NS_Persistence_Header header;
+ TAO_NS_Persistence_Record record;
+
+ // we are only using the size from this header
+ flck->peer() >> header;
+ if (!flck->peer ().good ())
+ {
+ flck->peer ().clear ();
+ ACE_THROW_RETURN (CORBA::INTERNAL (), -1);
+ }
+
+ // reset the destroyed flag
+ this->destroyed_ = header.destroyed();
+
+ // read in the data for the map
+ for (unsigned int i= 0u; i<header.size(); ++i)
+ {
+ flck->peer() >> record;
+ if (!flck->peer ().good ())
+ {
+ flck->peer ().clear ();
+ ACE_THROW_RETURN (CORBA::INTERNAL (), -1);
+ }
+
+ if (TAO_NS_Persistence_Record::LOCAL_NCONTEXT == record.type ())
+ {
+ PortableServer::ObjectId_var
+ id = PortableServer::string_to_ObjectId (record.ref ().c_str ());
+ const char
+ *intf = interface_->_interface_repository_id ();
+ CORBA::Object_var
+ objref = poa_->create_reference_with_id (id.in (), intf);
+ bindings_map->bind ( record.id ().c_str (),
+ record.kind ().c_str (),
+ objref.in (),
+ CosNaming::ncontext );
+ }
+ else
+ {
+ CORBA::Object_var
+ objref = orb_->string_to_object (record.ref ().c_str ());
+ bindings_map->bind ( record.id ().c_str (),
+ record.kind ().c_str (),
+ objref.in (),
+ ((TAO_NS_Persistence_Record::REMOTE_NCONTEXT == record.type ())
+ ? CosNaming::ncontext // REMOTE_NCONTEXT
+ : CosNaming::nobject )); // OBJREF
+ }
+ }
+ storable_context_ = bindings_map;
+ context_ = storable_context_;
+ return 0;
+}
+
+TAO_Storable_Naming_Context::
+File_Open_Lock_and_Check::File_Open_Lock_and_Check(
+ TAO_Storable_Naming_Context * context,
+ const char * mode
+ ACE_ENV_ARG_DECL)
+:closed_(1),
+ context_(context)
+{
+ ACE_TRACE("File_Open_Lock_and_Check");
+ // We only accept a subset of mode argument, check it
+ rwflags_ = 0;
+ for( unsigned int i = 0; i<ACE_OS::strlen(mode); i++ )
+ {
+ switch (mode[i])
+ {
+ case 'r': rwflags_ |= mode_read;
+ break;
+ case 'w': rwflags_ |= mode_write;
+ break;
+ case 'c': rwflags_ |= mode_create;
+ break;
+ default: rwflags_ = -1;
+ }
+ }
+ if( rwflags_ <= 0 )
+ {
+ errno = EINVAL;
+ ACE_THROW(CORBA::PERSIST_STORE());
+ }
+
+ // build the file name
+ ACE_CString file_name(context->persistence_directory_);
+ file_name += "/";
+ file_name += context->name_;
+
+ // Create the stream
+ fl_ = context->factory_->create_stream(file_name, ACE_TEXT_CHAR_TO_TCHAR(mode));
+ if (TAO_Storable_Naming_Context::redundant_)
+ {
+ if (fl_->open() != 0)
+ {
+ delete fl_;
+ ACE_THROW(CORBA::PERSIST_STORE());
+ }
+
+ // acquire a lock on it
+ if (fl_ -> flock(0, 0, 0) != 0)
+ {
+ fl_->close();
+ delete fl_;
+ ACE_THROW(CORBA::INTERNAL());
+ }
+
+ // now that the file is successfully opened and locked it must be
+ // unlocked/closed before we leave this class
+ closed_ = 0;
+
+ if ( ! (rwflags_ & mode_create) )
+ {
+ // Check if our copy is up to date
+ time_t new_last_changed = fl_->last_changed();
+ if( new_last_changed > context->last_changed_ )
+ {
+ context->last_changed_ = new_last_changed;
+ // Throw our map away
+ delete context->storable_context_;
+ // and build a new one from disk
+ context->load_map(this ACE_ENV_ARG_PARAMETER);
+ ACE_CHECK;
+ }
+ }
+ }
+ else if ( ! context->storable_context_ || (rwflags_ & mode_write) )
+ {
+ if (fl_->open() != 0)
+ {
+ delete fl_;
+ ACE_THROW(CORBA::PERSIST_STORE());
+ }
+
+ // now that the file is successfully opened
+ // unlocked/closed before we leave this class
+ closed_ = 0;
+
+ if(!context->storable_context_)
+ {
+ // Load the map from disk
+ context->load_map(this ACE_ENV_ARG_PARAMETER);
+ ACE_CHECK;
+ }
+ }
+ else
+ {
+ // Need to insure that fl_ gets deleted
+ delete fl_;
+ }
+}
+
+void
+TAO_Storable_Naming_Context::
+File_Open_Lock_and_Check::release(void)
+{
+ ACE_TRACE("release");
+ if ( ! closed_ )
+ {
+ // If we updated the disk, save the time stamp
+ if(TAO_Storable_Naming_Context::redundant_)
+ {
+ if( rwflags_ & mode_write )
+ context_->last_changed_ = fl_->last_changed();
+ fl_->funlock(0, 0, 0);
+ }
+ fl_->close();
+ delete fl_;
+ closed_ = 1;
+ }
+}
+
+TAO_Storable_Naming_Context::
+File_Open_Lock_and_Check::~File_Open_Lock_and_Check(void)
+{
+ ACE_TRACE("~File_Open_Lock_and_Check");
+ this->release();
+}
+
+TAO_Storable_Base &
+TAO_Storable_Naming_Context::
+File_Open_Lock_and_Check::peer(void)
+{
+ ACE_TRACE("peer");
+ return *fl_;
+}
+
+TAO_Storable_Naming_Context::TAO_Storable_Naming_Context (
+ CORBA::ORB_ptr orb,
+ PortableServer::POA_ptr poa,
+ const char *poa_id,
+ TAO_Naming_Service_Persistence_Factory *factory,
+ const ACE_TCHAR *persistence_directory,
+ size_t hash_table_size)
+ : TAO_Hash_Naming_Context (poa,
+ poa_id),
+ counter_ (0),
+ storable_context_ (0),
+ orb_(CORBA::ORB::_duplicate (orb)),
+ name_ (poa_id),
+ poa_ (PortableServer::POA::_duplicate (poa)),
+ factory_(factory),
+ persistence_directory_ (ACE_TEXT_ALWAYS_CHAR(persistence_directory)),
+ hash_table_size_(hash_table_size),
+ last_changed_(0)
+{
+ ACE_TRACE("TAO_Storable_Naming_Context");
+}
+
+TAO_Storable_Naming_Context::~TAO_Storable_Naming_Context (void)
+{
+ ACE_TRACE("~TAO_Storable_Naming_Context");
+
+ // If we're in the DTOR as a result of the destroy() operation,
+ // then we go ahead and delete the file. Otherwise, we leave the
+ // file around because they need to be there for persistence.
+ if (this->destroyed_)
+ {
+ // Make sure we delete the associated stream
+ ACE_CString file_name (this->persistence_directory_);
+ file_name += "/";
+ file_name += this->name_;
+
+ // Now delete the file
+ ACE_Auto_Ptr<TAO_Storable_Base>
+ fl (
+ this->factory_->create_stream(file_name.c_str(),
+ ACE_TEXT("r"))
+ );
+ if (fl.get())
+ {
+ if (TAO_debug_level > 5)
+ ACE_DEBUG ((LM_DEBUG, "(%P|%t) NameService: removing file %s\n",
+ file_name.fast_rep()));
+ fl->remove ();
+ }
+ }
+}
+
+CosNaming::NamingContext_ptr
+TAO_Storable_Naming_Context::make_new_context (
+ CORBA::ORB_ptr orb,
+ PortableServer::POA_ptr poa,
+ const char *poa_id,
+ size_t context_size,
+ TAO_Naming_Service_Persistence_Factory *factory,
+ const ACE_TCHAR *persistence_directory,
+ TAO_Storable_Naming_Context **new_context
+ ACE_ENV_ARG_DECL)
+{
+ ACE_TRACE("make_new_context");
+ // Store the stub we will return here.
+ CosNaming::NamingContext_var result;
+
+ // Put together a servant for the new Naming Context.
+
+ TAO_Storable_Naming_Context *context_impl = 0;
+ ACE_NEW_THROW_EX (context_impl,
+ TAO_Storable_Naming_Context (orb,
+ poa,
+ poa_id,
+ factory,
+ persistence_directory,
+ context_size),
+ CORBA::NO_MEMORY ());
+ ACE_CHECK_RETURN (result._retn ());
+
+ // Put <context_impl> into the auto pointer temporarily, in case next
+ // allocation fails.
+ ACE_Auto_Basic_Ptr<TAO_Storable_Naming_Context> temp (context_impl);
+
+ TAO_Naming_Context *context = 0;
+ ACE_NEW_THROW_EX (context,
+ TAO_Naming_Context (context_impl),
+ CORBA::NO_MEMORY ());
+ ACE_CHECK_RETURN (result._retn ());
+
+ // Let <implementation> know about it's <interface>.
+ context_impl->interface (context);
+
+ // Release auto pointer, and start using reference counting to
+ // control our servant.
+ temp.release ();
+ PortableServer::ServantBase_var s = context;
+
+ // Register the new context with the POA.
+ PortableServer::ObjectId_var id =
+ PortableServer::string_to_ObjectId (poa_id);
+
+ // If we try to register a naming context that is already registered,
+ // the following activation causes a POA::ObjectAlreadyActive exception be
+ // thrown which is transmitted as a CORBA::UNKNOWN on the wire. To rectify
+ // this problem, we explicitly throw the correct INS exception in
+ // this situation.
+ ACE_TRY
+ {
+ poa->activate_object_with_id (id.in (),
+ context
+ ACE_ENV_ARG_PARAMETER);
+ ACE_TRY_CHECK;
+ }
+ ACE_CATCH (PortableServer::POA::ObjectAlreadyActive, ex)
+ {
+ ACE_THROW_RETURN (CosNaming::NamingContext::AlreadyBound(),
+ CosNaming::NamingContext::_nil ());
+ }
+ ACE_ENDTRY;
+
+ ACE_CHECK_RETURN (result._retn ());
+
+ result = context->_this (ACE_ENV_SINGLE_ARG_PARAMETER);
+ ACE_CHECK_RETURN (CosNaming::NamingContext::_nil ());
+
+ // return the address of the new context object so that caller can finish
+ *new_context = context_impl;
+
+ return result._retn ();
+}
+
+CosNaming::NamingContext_ptr
+TAO_Storable_Naming_Context::new_context (ACE_ENV_SINGLE_ARG_DECL)
+{
+ ACE_TRACE("new_context");
+ ACE_GUARD_THROW_EX (ACE_SYNCH_RECURSIVE_MUTEX,
+ ace_mon,
+ this->lock_,
+ CORBA::INTERNAL ());
+ ACE_CHECK_RETURN (CosNaming::NamingContext::_nil ());
+
+ {
+ // Open the backing file
+ File_Open_Lock_and_Check flck(this, "r"
+ ACE_ENV_ARG_PARAMETER);
+ ACE_CHECK_RETURN (CosNaming::NamingContext::_nil ());
+
+ // Check to make sure this object didn't have <destroy> method
+ // invoked on it.
+ if (this->destroyed_)
+ ACE_THROW_RETURN (CORBA::OBJECT_NOT_EXIST (),
+ CosNaming::NamingContext::_nil ());
+ }
+
+ TAO_NS_Persistence_Global global;
+
+ // Generate a POA id for the new context.
+ if(redundant_)
+ {
+ // acquire a lock on the file that holds our counter
+ if (gfl_->open() != 0)
+ {
+ delete gfl_.release();
+ ACE_THROW_RETURN(CORBA::PERSIST_STORE(),
+ CosNaming::NamingContext::_nil ());
+ }
+ if (gfl_ -> flock(0, 0, 0) != 0)
+ ACE_THROW_RETURN (CORBA::INTERNAL(),
+ CosNaming::NamingContext::_nil ());
+ // get the counter from disk
+ *gfl_.get() >> global;
+ if (!gfl_.get ()->good () &&
+ gfl_.get ()->rdstate () != TAO_Storable_Base::eofbit)
+ {
+ gfl_.get ()->clear ();
+ ACE_THROW_RETURN (CORBA::INTERNAL (), 0);
+ }
+ gcounter_ = global.counter();
+ // use it to generate a new name
+ }
+ char poa_id[BUFSIZ];
+ ACE_OS::sprintf (poa_id,
+ "%s_%d",
+ root_name_,
+ gcounter_++);
+ // then save it back on disk
+ global.counter(gcounter_);
+ *gfl_.get() << global;
+ if(redundant_)
+ {
+ // and release our lock
+ if (gfl_ -> flock(0, 0, 0) != 0)
+ ACE_THROW_RETURN(CORBA::INTERNAL(),
+ CosNaming::NamingContext::_nil ());
+ gfl_->close();
+ }
+
+ // Create a new context.
+ TAO_Storable_Naming_Context *new_context = 0;
+ CosNaming::NamingContext_var result =
+ make_new_context (this->orb_.in (),
+ this->poa_.in (),
+ poa_id,
+ this->storable_context_->total_size (),
+ this->factory_,
+ ACE_TEXT_CHAR_TO_TCHAR (this->persistence_directory_.c_str ()),
+ &new_context
+ ACE_ENV_ARG_PARAMETER);
+ ACE_CHECK_RETURN (CosNaming::NamingContext::_nil ());
+
+ // Since this is a new context, make an empty map in it
+ ACE_NEW_THROW_EX (new_context->storable_context_,
+ TAO_Storable_Bindings_Map (hash_table_size_,orb_.in ()),
+ CORBA::NO_MEMORY ());
+ ACE_CHECK_RETURN (CosNaming::NamingContext::_nil ());
+ new_context->context_ = new_context->storable_context_;
+
+ File_Open_Lock_and_Check flck(new_context, "wc" ACE_ENV_ARG_PARAMETER);
+ ACE_CHECK_RETURN (CosNaming::NamingContext::_nil ());
+ new_context->Write(flck.peer());
+
+ return result._retn ();
+}
+
+void
+TAO_Storable_Naming_Context::rebind (const CosNaming::Name& n,
+ CORBA::Object_ptr obj
+ ACE_ENV_ARG_DECL)
+{
+ ACE_TRACE("rebind");
+ // Get the length of the name.
+ CORBA::ULong name_len = n.length ();
+
+ // Check for invalid name.
+ if (name_len == 0)
+ ACE_THROW (CosNaming::NamingContext::InvalidName());
+
+ // we didn't need a lock to check the input arg, but now we do
+ ACE_GUARD_THROW_EX (ACE_SYNCH_RECURSIVE_MUTEX, ace_mon,
+ this->lock_,
+ CORBA::INTERNAL ());
+ ACE_CHECK;
+
+ // Open the backing file
+ File_Open_Lock_and_Check flck(this, name_len > 1 ? "r" : "rw"
+ ACE_ENV_ARG_PARAMETER);
+ ACE_CHECK;
+
+ // Check to make sure this object didn't have <destroy> method
+ // invoked on it.
+ if (this->destroyed_)
+ ACE_THROW (CORBA::OBJECT_NOT_EXIST ());
+
+ // If we received compound name, resolve it to get the context in
+ // which the rebinding should take place, then perform the rebinding
+ // on target context.
+ if (name_len > 1)
+ {
+ // This had been a read on the file so now we are done with it
+ flck.release();
+
+ CosNaming::NamingContext_var context =
+ get_context (n ACE_ENV_ARG_PARAMETER);
+ ACE_CHECK;
+
+ CosNaming::Name simple_name;
+ simple_name.length (1);
+ simple_name[0] = n[name_len - 1];
+ context->rebind (simple_name, obj ACE_ENV_ARG_PARAMETER);
+ ACE_CHECK;
+ }
+ // If we received a simple name, we need to rebind it in this
+ // context.
+ else
+ {
+ int result = this->context_->rebind (n[0].id,
+ n[0].kind,
+ obj,
+ CosNaming::nobject);
+
+ // Check for error conditions.
+ if (result == -1)
+ ACE_THROW (CORBA::INTERNAL ());
+
+ else if (result == -2)
+ ACE_THROW (CosNaming::NamingContext::NotFound
+ (CosNaming::NamingContext::not_object, n));
+
+ this->Write(flck.peer());
+ }
+}
+
+void
+TAO_Storable_Naming_Context::bind_context (const CosNaming::Name &n,
+ CosNaming::NamingContext_ptr nc
+ ACE_ENV_ARG_DECL)
+{
+ ACE_TRACE("TAO_Storable_Naming_Context::bind_context");
+ // Get the length of the name.
+ CORBA::ULong name_len = n.length ();
+
+ // Check for invalid name.
+ if (name_len == 0)
+ ACE_THROW (CosNaming::NamingContext::InvalidName());
+
+ // Do not allow binding of nil context reference.
+ if (CORBA::is_nil (nc))
+ ACE_THROW (CORBA::BAD_PARAM ());
+
+ // we didn't need a lock to check the input arg, but now we do
+ ACE_GUARD_THROW_EX (ACE_SYNCH_RECURSIVE_MUTEX, ace_mon,
+ this->lock_,
+ CORBA::INTERNAL ());
+ ACE_CHECK;
+
+ // Open the backing file
+ File_Open_Lock_and_Check flck(this, name_len > 1 ? "r" : "rw"
+ ACE_ENV_ARG_PARAMETER);
+ ACE_CHECK;
+
+ // Check to make sure this object didn't have <destroy> method
+ // invoked on it.
+ if (this->destroyed_)
+ ACE_THROW (CORBA::OBJECT_NOT_EXIST ());
+
+ // If we received compound name, resolve it to get the context in
+ // which the binding should take place, then perform the binding
+ // on target context.
+ if (name_len > 1)
+ {
+ // This had been a read on the file so now we are done with it
+ flck.release();
+
+ CosNaming::NamingContext_var context =
+ get_context (n ACE_ENV_ARG_PARAMETER);
+ ACE_CHECK;
+
+ CosNaming::Name simple_name;
+ simple_name.length (1);
+ simple_name[0] = n[name_len - 1];
+ context->bind_context (simple_name, nc ACE_ENV_ARG_PARAMETER);
+ ACE_CHECK;
+ }
+ // If we received a simple name, we need to bind it in this context.
+ else
+ {
+ // Try binding the name.
+ int result = this->context_->bind (n[0].id,
+ n[0].kind,
+ nc,
+ CosNaming::ncontext);
+ if (result == 1)
+ ACE_THROW (CosNaming::NamingContext::AlreadyBound());
+
+ // Something went wrong with the internal structure
+ else if (result == -1)
+ ACE_THROW (CORBA::INTERNAL ());
+
+ this->Write(flck.peer());
+ }
+}
+
+void
+TAO_Storable_Naming_Context::rebind_context (const CosNaming::Name &n,
+ CosNaming::NamingContext_ptr nc
+ ACE_ENV_ARG_DECL)
+{
+ ACE_TRACE("rebind_context");
+ // Get the length of the name.
+ CORBA::ULong name_len = n.length ();
+
+ // Check for invalid name.
+ if (name_len == 0)
+ ACE_THROW (CosNaming::NamingContext::InvalidName());
+
+ // we didn't need a lock to check the input arg, but now we do
+ ACE_GUARD_THROW_EX (ACE_SYNCH_RECURSIVE_MUTEX, ace_mon,
+ this->lock_,
+ CORBA::INTERNAL ());
+ ACE_CHECK;
+
+ // Open the backing file
+ File_Open_Lock_and_Check flck(this, name_len > 1 ? "r" : "rw"
+ ACE_ENV_ARG_PARAMETER);
+ ACE_CHECK;
+
+ // Check to make sure this object didn't have <destroy> method
+ // invoked on it.
+ if (this->destroyed_)
+ ACE_THROW (CORBA::OBJECT_NOT_EXIST ());
+
+ // If we received compound name, resolve it to get the context in
+ // which the rebinding should take place, then perform the rebinding
+ // on target context.
+ if (name_len > 1)
+ {
+ // This had been a read on the file so now we are done with it
+ flck.release();
+
+ CosNaming::NamingContext_var context =
+ get_context (n ACE_ENV_ARG_PARAMETER);
+ ACE_CHECK;
+
+ CosNaming::Name simple_name;
+ simple_name.length (1);
+ simple_name[0] = n[name_len - 1];
+ context->rebind_context (simple_name, nc ACE_ENV_ARG_PARAMETER);
+ ACE_CHECK;
+ }
+ // If we received a simple name, we need to rebind it in this
+ // context.
+ else
+ {
+ int result = this->context_->rebind (n[0].id,
+ n[0].kind,
+ nc,
+ CosNaming::ncontext);
+ // Check for error conditions.
+ if (result == -1)
+ ACE_THROW (CORBA::INTERNAL ());
+ else if (result == -2)
+ ACE_THROW (CosNaming::NamingContext::NotFound
+ (CosNaming::NamingContext::not_context, n));
+
+ this->Write(flck.peer());
+ }
+}
+
+CORBA::Object_ptr
+TAO_Storable_Naming_Context::resolve (const CosNaming::Name& n
+ ACE_ENV_ARG_DECL)
+{
+ ACE_TRACE("resolve");
+ // Get the length of the name.
+ CORBA::ULong name_len = n.length ();
+
+ // Check for invalid name.
+ if (name_len == 0)
+ ACE_THROW_RETURN (CosNaming::NamingContext::InvalidName(),
+ CORBA::Object::_nil ());
+
+ // we didn't need a lock to check the input arg, but now we do
+ ACE_GUARD_THROW_EX (ACE_SYNCH_RECURSIVE_MUTEX, ace_mon, this->lock_,
+ CORBA::INTERNAL ());
+ ACE_CHECK_RETURN (CORBA::Object::_nil ());
+
+ // Open the backing file
+ File_Open_Lock_and_Check flck(this, "r"
+ ACE_ENV_ARG_PARAMETER);
+ ACE_CHECK_RETURN (CORBA::Object::_nil ());
+
+ // Check to make sure this object didn't have <destroy> method
+ // invoked on it.
+ if (this->destroyed_)
+ ACE_THROW_RETURN (CORBA::OBJECT_NOT_EXIST (),
+ CORBA::Object::_nil ());
+
+ // Resolve the first component of the name.
+ flck.release();
+
+ // Stores the binding type for the first name component.
+ CosNaming::BindingType type;
+ // Stores the object reference bound to the first name component.
+ CORBA::Object_ptr obj = CORBA::Object::_nil ();
+
+ if (this->context_->find (n[0].id,
+ n[0].kind,
+ obj,
+ type) == -1)
+ ACE_THROW_RETURN (CosNaming::NamingContext::NotFound
+ (CosNaming::NamingContext::missing_node, n),
+ CORBA::Object::_nil ());
+
+ // Store the value in var to avoid memory leaks.
+ CORBA::Object_var result = obj;
+
+ // If the name we have to resolve is a compound name, we need to
+ // resolve it recursively.
+ if (name_len > 1)
+ {
+ CosNaming::NamingContext_var context =
+ CosNaming::NamingContext::_nil ();
+
+ if (type == CosNaming::ncontext)
+ {
+ // Narrow to NamingContext.
+ context = CosNaming::NamingContext::_narrow (result.in ()
+ ACE_ENV_ARG_PARAMETER);
+ ACE_CHECK_RETURN (result._retn ());
+ }
+ else
+ // The first name component wasn't bound to a NamingContext.
+ ACE_THROW_RETURN (CosNaming::NamingContext::NotFound
+ (CosNaming::NamingContext::not_context,
+ n),
+ CORBA::Object::_nil ());
+
+ // If narrow failed...
+ if (CORBA::is_nil (context.in ()))
+ ACE_THROW_RETURN (CosNaming::NamingContext::NotFound
+ (CosNaming::NamingContext::not_context, n),
+ CORBA::Object::_nil ());
+ else
+ {
+ // Successfully resolved the first name component, need to
+ // recursively call resolve on <n> without the first component.
+
+ // We need a name just like <n> but without the first
+ // component. Instead of copying data we can reuse <n>'s
+ // buffer since we will only be using it for 'in' parameters
+ // (no modifications).
+ CosNaming::Name rest_of_name
+ (n.maximum () - 1,
+ n.length () - 1,
+ const_cast<CosNaming::NameComponent*> (n.get_buffer ()) + 1);
+
+ // If there are any exceptions, they will propagate up.
+ return context->resolve (rest_of_name
+ ACE_ENV_ARG_PARAMETER);
+ }
+ }
+ // If the name we had to resolve was simple, we just need to return
+ // the result.
+ return result._retn ();
+}
+
+void
+TAO_Storable_Naming_Context::unbind (const CosNaming::Name& n
+ ACE_ENV_ARG_DECL)
+{
+ ACE_TRACE("unbind");
+ // Get the length of the name.
+ CORBA::ULong name_len = n.length ();
+
+ // Check for invalid name.
+ if (name_len == 0)
+ ACE_THROW (CosNaming::NamingContext::InvalidName());
+
+ // we didn't need a lock to check the input arg, but now we do
+ ACE_GUARD_THROW_EX (ACE_SYNCH_RECURSIVE_MUTEX, ace_mon,
+ this->lock_,
+ CORBA::INTERNAL ());
+ ACE_CHECK;
+
+ // Open the backing file
+ File_Open_Lock_and_Check flck(this, name_len > 1 ? "r" : "rw"
+ ACE_ENV_ARG_PARAMETER);
+ ACE_CHECK;
+
+ // Check to make sure this object didn't have <destroy> method
+ // invoked on it.
+ if (this->destroyed_)
+ ACE_THROW (CORBA::OBJECT_NOT_EXIST ());
+
+ // If we received compound name, resolve it to get the context in
+ // which the unbinding should take place, then perform the unbinding
+ // on target context.
+ if (name_len > 1)
+ {
+ // This had been a read on the file so now we are done with it
+ flck.release();
+
+ CosNaming::NamingContext_var context =
+ get_context (n ACE_ENV_ARG_PARAMETER);
+ ACE_CHECK;
+
+ CosNaming::Name simple_name;
+ simple_name.length (1);
+ simple_name[0] = n[name_len - 1];
+ context->unbind (simple_name ACE_ENV_ARG_PARAMETER);
+ ACE_CHECK;
+ }
+ // If we received a simple name, we need to unbind it in this
+ // context.
+ else
+ {
+ if (this->context_->unbind (n[0].id,
+ n[0].kind) == -1)
+ ACE_THROW (CosNaming::NamingContext::NotFound
+ (CosNaming::NamingContext::missing_node, n));
+
+ this->Write(flck.peer());
+ }
+}
+
+CosNaming::NamingContext_ptr
+TAO_Storable_Naming_Context::bind_new_context (const CosNaming::Name& n
+ ACE_ENV_ARG_DECL)
+{
+ ACE_TRACE("bind_new_context");
+ // Get the length of the name.
+ CORBA::ULong name_len = n.length ();
+
+ // Check for invalid name.
+ if (name_len == 0)
+ ACE_THROW_RETURN (CosNaming::NamingContext::InvalidName(),
+ CosNaming::NamingContext::_nil ());
+
+ ACE_GUARD_THROW_EX (ACE_SYNCH_RECURSIVE_MUTEX,
+ ace_mon,
+ this->lock_,
+ CORBA::INTERNAL ());
+ ACE_CHECK_RETURN (CosNaming::NamingContext::_nil ());
+
+ // Check to make sure this object didn't have <destroy> method
+ // invoked on it.
+ if (this->destroyed_)
+ ACE_THROW_RETURN (CORBA::OBJECT_NOT_EXIST (),
+ CosNaming::NamingContext::_nil ());
+
+ // Open the backing file
+ File_Open_Lock_and_Check flck(this, name_len > 1 ? "r" : "rw"
+ ACE_ENV_ARG_PARAMETER);
+ ACE_CHECK_RETURN (CosNaming::NamingContext::_nil ());
+
+ // Check to make sure this object didn't have <destroy> method
+ // invoked on it.
+ if (this->destroyed_)
+ ACE_THROW_RETURN (CORBA::OBJECT_NOT_EXIST (),
+ CosNaming::NamingContext::_nil ());
+
+ // If we received compound name, resolve it to get the context in
+ // which the binding should take place, then perform the operation on
+ // target context.
+ if (name_len > 1)
+ {
+ // This had been a read on the file so now we are done with it
+ flck.release();
+
+ CosNaming::NamingContext_var context =
+ get_context (n ACE_ENV_ARG_PARAMETER);
+ ACE_CHECK_RETURN (CosNaming::NamingContext::_nil ());
+
+ CosNaming::Name simple_name;
+ simple_name.length (1);
+ simple_name[0] = n[name_len - 1];
+ return context->bind_new_context (simple_name ACE_ENV_ARG_PARAMETER);
+ ACE_CHECK_RETURN (CosNaming::NamingContext::_nil ());
+ }
+ // If we received a simple name, we need to bind it in this context.
+
+ // This had been a read on the file so now we are done with it
+ flck.release();
+
+ // Stores our new Naming Context.
+ CosNaming::NamingContext_var result =
+ CosNaming::NamingContext::_nil ();
+
+ // Create new context.
+ result = new_context (ACE_ENV_SINGLE_ARG_PARAMETER);
+ ACE_CHECK_RETURN (CosNaming::NamingContext::_nil ());
+
+ // Bind the new context to the name.
+ ACE_TRY
+ {
+ bind_context (n,
+ result.in ()
+ ACE_ENV_ARG_PARAMETER);
+ ACE_TRY_CHECK;
+ }
+ ACE_CATCHANY
+ {
+ {
+ ACE_DECLARE_NEW_CORBA_ENV;
+ ACE_TRY_EX(DESTROY)
+ {
+ result->destroy (ACE_ENV_SINGLE_ARG_PARAMETER);
+ ACE_TRY_CHECK_EX(DESTROY);
+ }
+ ACE_CATCHANY
+ {
+ // Do nothing?
+ }
+ ACE_ENDTRY;
+ }
+ // Re-raise the exception in bind_context()
+ ACE_RE_THROW;
+ }
+ ACE_ENDTRY;
+ ACE_CHECK_RETURN (CosNaming::NamingContext::_nil ());
+ return result._retn ();
+}
+
+void
+TAO_Storable_Naming_Context::destroy (ACE_ENV_SINGLE_ARG_DECL)
+{
+ ACE_TRACE("destroy");
+ ACE_GUARD_THROW_EX (ACE_SYNCH_RECURSIVE_MUTEX,
+ ace_mon,
+ this->lock_,
+ CORBA::INTERNAL ());
+ ACE_CHECK;
+
+ // Open the backing file
+ File_Open_Lock_and_Check flck(this, "rw"
+ ACE_ENV_ARG_PARAMETER);
+ ACE_CHECK;
+
+ // Check to make sure this object didn't have <destroy> method
+ // invoked on it.
+ if (this->destroyed_)
+ ACE_THROW (CORBA::OBJECT_NOT_EXIST ());
+
+ if (this->context_->current_size () != 0)
+ ACE_THROW (CosNaming::NamingContext::NotEmpty());
+
+ // Destroy is a no-op on a root context.
+ if (root ())
+ return;
+
+ else
+ {
+ this->destroyed_ = 2;
+
+ // 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 ();
+
+ PortableServer::ObjectId_var id =
+ PortableServer::string_to_ObjectId (poa_id_.fast_rep ());
+
+ ACE_CHECK;
+
+ poa->deactivate_object (id.in ()
+ ACE_ENV_ARG_PARAMETER);
+ ACE_CHECK;
+
+ this->Write(flck.peer());
+ }
+}
+
+
+void
+TAO_Storable_Naming_Context::bind (const CosNaming::Name& n,
+ CORBA::Object_ptr obj
+ ACE_ENV_ARG_DECL)
+{
+ ACE_TRACE("TAO_Storable_Naming_Context::bind");
+ // Get the length of the name.
+ CORBA::ULong name_len = n.length ();
+
+ // Check for invalid name.
+ if (name_len == 0)
+ ACE_THROW (CosNaming::NamingContext::InvalidName());
+
+ // we didn't need a lock to check the input arg, but now we do
+ ACE_GUARD_THROW_EX (ACE_SYNCH_RECURSIVE_MUTEX, ace_mon,
+ this->lock_,
+ CORBA::INTERNAL ());
+ ACE_CHECK;
+
+ // Open the backing file
+ File_Open_Lock_and_Check flck(this, name_len > 1 ? "r" : "rw"
+ ACE_ENV_ARG_PARAMETER);
+ ACE_CHECK;
+
+ // Check to make sure this object didn't have <destroy> method
+ // invoked on it.
+ if (this->destroyed_)
+ ACE_THROW (CORBA::OBJECT_NOT_EXIST ());
+
+ // If we received compound name, resolve it to get the context in
+ // which the binding should take place, then perform the binding
+ // on target context.
+ if (name_len > 1)
+ {
+ // This had been a read on the file so now we are done with it
+ flck.release();
+
+ CosNaming::NamingContext_var context =
+ get_context (n ACE_ENV_ARG_PARAMETER);
+ ACE_CHECK;
+
+ CosNaming::Name simple_name;
+ simple_name.length (1);
+ simple_name[0] = n[name_len - 1];
+ context->bind (simple_name, obj ACE_ENV_ARG_PARAMETER);
+ ACE_CHECK;
+ }
+ // If we received a simple name, we need to bind it in this context.
+ else
+ {
+ // Try binding the name.
+ int result = this->context_->bind (n[0].id,
+ n[0].kind,
+ obj,
+ CosNaming::nobject);
+ if (result == 1)
+ ACE_THROW (CosNaming::NamingContext::AlreadyBound());
+
+ // Something went wrong with the internal structure
+ else if (result == -1)
+ ACE_THROW (CORBA::INTERNAL ());
+
+ this->Write(flck.peer());
+ }
+}
+
+
+void
+TAO_Storable_Naming_Context::list (CORBA::ULong how_many,
+ CosNaming::BindingList_out &bl,
+ CosNaming::BindingIterator_out &bi
+ ACE_ENV_ARG_DECL)
+{
+ ACE_TRACE("list");
+ // Allocate nil out parameters in case we won't be able to complete
+ // the operation.
+ bi = CosNaming::BindingIterator::_nil ();
+ ACE_NEW_THROW_EX (bl,
+ CosNaming::BindingList (0),
+ CORBA::NO_MEMORY ());
+ ACE_CHECK;
+
+ // Obtain a lock before we proceed with the operation.
+ ACE_GUARD_THROW_EX (ACE_SYNCH_RECURSIVE_MUTEX,
+ ace_mon,
+ this->lock_,
+ CORBA::INTERNAL ());
+ ACE_CHECK;
+
+ // Open the backing file
+ File_Open_Lock_and_Check flck(this, "r"
+ ACE_ENV_ARG_PARAMETER);
+ ACE_CHECK;
+
+ // Check to make sure this object didn't have <destroy> method
+ // invoked on it.
+ if (this->destroyed_)
+ ACE_THROW (CORBA::OBJECT_NOT_EXIST ());
+
+ // We have the map in memory, let the disk go
+ flck.release();
+
+ // Dynamically allocate iterator for traversing the underlying hash map.
+ HASH_MAP::ITERATOR *hash_iter = 0;
+ ACE_NEW_THROW_EX (hash_iter,
+ HASH_MAP::ITERATOR (storable_context_->map ()),
+ CORBA::NO_MEMORY ());
+ ACE_CHECK;
+
+ // Store <hash_iter temporarily in auto pointer, in case we'll have
+ // some failures and throw an exception.
+ ACE_Auto_Basic_Ptr<HASH_MAP::ITERATOR> temp (hash_iter);
+
+ // Silliness below is required because of broken old g++!!! E.g.,
+ // without it, we could have just said HASH_MAP::ITERATOR everywhere we use ITER_DEF.
+ typedef ACE_Hash_Map_Manager<TAO_Storable_ExtId,
+ TAO_Storable_IntId,
+ ACE_Null_Mutex>::ITERATOR ITER_DEF;
+ typedef ACE_Hash_Map_Manager<TAO_Storable_ExtId,
+ TAO_Storable_IntId,
+ ACE_Null_Mutex>::ENTRY ENTRY_DEF;
+
+ // Typedef to the type of BindingIterator servant for ease of use.
+ typedef TAO_Bindings_Iterator<ITER_DEF, ENTRY_DEF> ITER_SERVANT;
+
+ // A pointer to BindingIterator servant.
+ ITER_SERVANT *bind_iter = 0;
+
+ // Number of bindings that will go into the BindingList <bl>.
+ CORBA::ULong n;
+
+ // Calculate number of bindings that will go into <bl>.
+ if (this->context_->current_size () > how_many)
+ n = how_many;
+ else
+ n = static_cast<CORBA::ULong> (this->context_->current_size ());
+
+ // Use the hash map iterator to populate <bl> with bindings.
+ bl->length (n);
+
+ ENTRY_DEF *hash_entry = 0;
+
+ for (CORBA::ULong i = 0; i < n; i++)
+ {
+ hash_iter->next (hash_entry);
+ hash_iter->advance ();
+
+ if (ITER_SERVANT::populate_binding (hash_entry, bl[i]) == 0)
+ ACE_THROW (CORBA::NO_MEMORY());
+ }
+
+ // Now we are done with the BindingsList, and we can follow up on
+ // the BindingIterator business.
+
+ // If we do not need to pass back BindingIterator.
+ if (this->context_->current_size () <= how_many)
+ return;
+ else
+ {
+ // *** This is a problem. Is there an exception we can throw? ***
+ ACE_UNUSED_ARG (bind_iter);
+ ACE_THROW (CORBA::NO_IMPLEMENT ());
+
+#if 0
+ // Create a BindingIterator for return.
+ ACE_NEW_THROW_EX (bind_iter,
+ ITER_SERVANT (this, hash_iter,
+ this->poa_.in (), this->lock_),
+ CORBA::NO_MEMORY ());
+ ACE_CHECK;
+
+ // Release <hash_iter> from auto pointer, and start using
+ // reference counting to control our servant.
+ temp.release ();
+ PortableServer::ServantBase_var iter = bind_iter;
+
+ // Increment reference count on this Naming Context, so it doesn't get
+ // deleted before the BindingIterator servant gets deleted.
+ interface_->_add_ref (ACE_ENV_SINGLE_ARG_PARAMETER);
+ ACE_CHECK;
+
+ // Register with the POA.
+ char poa_id[BUFSIZ];
+ ACE_OS::sprintf (poa_id,
+ "%s_%d",
+ this->poa_id_.c_str (),
+ this->counter_++);
+ PortableServer::ObjectId_var id =
+ PortableServer::string_to_ObjectId (poa_id);
+
+ this->poa_->activate_object_with_id (id.in (),
+ bind_iter
+ ACE_ENV_ARG_PARAMETER);
+ ACE_CHECK;
+
+ bi = bind_iter->_this (ACE_ENV_SINGLE_ARG_PARAMETER);
+ ACE_CHECK;
+#endif /* 0 */
+ }
+}
+
+TAO_END_VERSIONED_NAMESPACE_DECL
+
+#include "orbsvcs/Naming/Naming_Service_Container.h"
+
+TAO_BEGIN_VERSIONED_NAMESPACE_DECL
+
+CosNaming::NamingContext_ptr TAO_Storable_Naming_Context::recreate_all(
+ CORBA::ORB_ptr orb,
+ PortableServer::POA_ptr poa,
+ const char *poa_id,
+ size_t context_size,
+ int reentering,
+ TAO_Naming_Service_Persistence_Factory *factory,
+ const ACE_TCHAR *persistence_directory,
+ int use_redundancy
+ ACE_ENV_ARG_DECL)
+{
+ ACE_TRACE("recreate_all");
+
+ ACE_UNUSED_ARG (reentering);
+
+ // Whether we are redundant is global
+ redundant_ = use_redundancy;
+
+ // Save the root name for later use
+ root_name_ = poa_id;
+
+ // Create a new context.
+ TAO_Storable_Naming_Context *new_context = 0;
+ CosNaming::NamingContext_var result =
+ make_new_context (orb,
+ poa,
+ poa_id,
+ context_size,
+ factory,
+ persistence_directory,
+ &new_context
+ ACE_ENV_ARG_PARAMETER);
+ ACE_CHECK_RETURN (CosNaming::NamingContext::_nil ());
+
+ // Now does this already exist on disk?
+ ACE_TString file_name(persistence_directory);
+ file_name += ACE_TEXT("/");
+ file_name += ACE_TEXT_CHAR_TO_TCHAR(poa_id);
+ ACE_Auto_Ptr<TAO_Storable_Base> fl (factory->create_stream(ACE_TEXT_ALWAYS_CHAR(file_name.c_str()), ACE_TEXT("r")));
+ if (fl->exists())
+ {
+ // Load the map from disk
+ File_Open_Lock_and_Check flck(new_context, "r" ACE_ENV_ARG_PARAMETER);
+ ACE_CHECK_RETURN (CosNaming::NamingContext::_nil ());
+ }
+ else
+ {
+ // Since this is a new context, make and empty map in it
+ ACE_NEW_THROW_EX (new_context->storable_context_,
+ TAO_Storable_Bindings_Map (context_size,orb),
+ CORBA::NO_MEMORY ());
+ ACE_CHECK_RETURN (CosNaming::NamingContext::_nil ());
+ new_context->context_ = new_context->storable_context_;
+ File_Open_Lock_and_Check flck(new_context, "wc" ACE_ENV_ARG_PARAMETER);
+ ACE_CHECK_RETURN (CosNaming::NamingContext::_nil ());
+ new_context->Write(flck.peer());
+ }
+
+ // build the global file name
+ file_name += ACE_TEXT("_global");
+
+ // Create the stream for the counter used to uniquely creat context names
+ gfl_.reset(factory->create_stream(ACE_TEXT_ALWAYS_CHAR(file_name.c_str()), ACE_TEXT("crw")));
+ if (gfl_->open() != 0)
+ {
+ delete gfl_.release();
+ ACE_THROW_RETURN(CORBA::PERSIST_STORE(),
+ CosNaming::NamingContext::_nil ());
+ }
+
+ // get the counter from disk
+ TAO_NS_Persistence_Global global;
+ *gfl_.get() >> global;
+ if (!gfl_.get ()->good () &&
+ gfl_.get ()->rdstate () != TAO_Storable_Base::eofbit)
+ {
+ gfl_.get ()->clear ();
+ ACE_THROW_RETURN (CORBA::INTERNAL (), 0);
+ }
+ gcounter_ = global.counter();
+ if(redundant_) gfl_->close();
+
+ return result._retn ();
+}
+
+TAO_END_VERSIONED_NAMESPACE_DECL
diff --git a/TAO/orbsvcs/orbsvcs/Naming/Storable_Naming_Context.h b/TAO/orbsvcs/orbsvcs/Naming/Storable_Naming_Context.h
new file mode 100644
index 00000000000..87f8bb203a2
--- /dev/null
+++ b/TAO/orbsvcs/orbsvcs/Naming/Storable_Naming_Context.h
@@ -0,0 +1,474 @@
+/* -*- C++ -*- */
+//=============================================================================
+/**
+ * @file Storable_Naming_Context.h
+ *
+ * $Id$
+ *
+ * @author Bruce Trask <trask_b@ociweb.com>
+ */
+//=============================================================================
+
+
+#ifndef TAO_STORABLE_NAMING_CONTEXT_H
+#define TAO_STORABLE_NAMING_CONTEXT_H
+#include /**/ "ace/pre.h"
+
+#include "orbsvcs/Naming/Hash_Naming_Context.h"
+#include "ace/Hash_Map_Manager.h"
+#include "ace/Auto_Ptr.h"
+
+#include "orbsvcs/Naming/Storable.h"
+
+#if !defined (ACE_LACKS_PRAGMA_ONCE)
+# pragma once
+#endif /* ACE_LACKS_PRAGMA_ONCE */
+
+TAO_BEGIN_VERSIONED_NAMESPACE_DECL
+
+class TAO_Naming_Serv_Export TAO_Storable_IntId
+{
+public:
+ // = Initialization and termination methods.
+ /// Constructor.
+ TAO_Storable_IntId (void);
+
+ /// Constructor.
+ TAO_Storable_IntId (/* in */ const char * ior,
+ CosNaming::BindingType type /* = CosNaming::nobject */);
+
+ /// Copy constructor.
+ TAO_Storable_IntId (const TAO_Storable_IntId & rhs);
+
+ /// Destructor.
+ ~TAO_Storable_IntId (void);
+
+ /// Assignment operator.
+ void operator= (const TAO_Storable_IntId & rhs);
+
+ // = Data members.
+
+ /// Stringified IOR to be stored in a Persistent Naming Context.
+ CORBA::String_var ref_;
+
+ /// Binding type for <ref_>.
+ CosNaming::BindingType type_;
+};
+
+class TAO_Naming_Serv_Export TAO_Storable_ExtId
+{
+public:
+ // = Initialization and termination methods.
+
+ /// Constructor.
+ TAO_Storable_ExtId (void);
+
+ /// Constructor.
+ TAO_Storable_ExtId (/* in */ const char *id,
+ /* in */ const char *kind);
+
+ /// Copy constructor.
+ TAO_Storable_ExtId (const TAO_Storable_ExtId & rhs);
+
+ /// Destructor.
+ ~TAO_Storable_ExtId (void);
+
+ // = Assignment and comparison methods.
+
+ /// Assignment operator (does copy memory).
+ void operator= (const TAO_Storable_ExtId & rhs);
+
+ /// Equality comparison operator (must match both id_ and kind_).
+ bool operator== (const TAO_Storable_ExtId &rhs) const;
+
+ /// Inequality comparison operator.
+ bool operator!= (const TAO_Storable_ExtId &rhs) const;
+
+ /// <hash> function is required in order for this class to be usable by
+ /// ACE_Hash_Map_Manager.
+ u_long hash (void) const;
+
+ // = Data members.
+
+ /// <id> portion of the name to be associated with some object
+ /// reference in a Storable Naming Context.
+ CORBA::String_var id_;
+
+ /// <kind> portion of the name to be associated with some object
+ /// reference in a Storable Naming Context.
+ CORBA::String_var kind_;
+
+ // Accessors.
+ // follow the mapping rules!
+
+ const char * id (void);
+ const char * kind (void);
+
+};
+
+
+/**
+ * @class TAO_Storable_Bindings_Map
+ *
+ * @brief Provides hash-table-based transient storage for name to object
+ * bindings in a Naming Context.
+ *
+ * A thin wrapper on top of ACE_Hash_Map_Manager. Supports
+ * TAO_Bindings_Map interface. Used by TAO_Transient_Naming_Context.
+ */
+class TAO_Naming_Serv_Export TAO_Storable_Bindings_Map : public TAO_Bindings_Map
+{
+public:
+
+ /// Underlying data structure - typedef for ease of use.
+ typedef ACE_Hash_Map_Manager<TAO_Storable_ExtId,
+ TAO_Storable_IntId,
+ ACE_Null_Mutex> HASH_MAP;
+
+ // = Initialization and termination methods.
+
+ /// Constructor.
+ TAO_Storable_Bindings_Map (size_t hash_table_size, CORBA::ORB_ptr orb);
+
+ /// Destructor.
+ virtual ~TAO_Storable_Bindings_Map (void);
+
+ // = Accessors.
+
+ /// Get a reference to the underlying hash map.
+ HASH_MAP &map (void);
+
+ /// Return the size of the underlying hash table.
+ size_t total_size (void);
+
+ /// Return current number of entries (name bindings) in the
+ /// underlying hash map.
+ virtual size_t current_size (void);
+
+ // = Name bindings manipulation methods.
+
+ /**
+ * Add a binding with the specified parameters to the table.
+ * Return 0 on success and -1 on failure, 1 if there already is a
+ * binding with <id> and <kind>.
+ */
+ virtual int bind (const char *id,
+ const char *kind,
+ CORBA::Object_ptr obj,
+ CosNaming::BindingType type);
+
+ /**
+ * Overwrite a binding containing <id> and <kind> (or create a new
+ * one if one doesn't exist) with the specified parameters. Return
+ * 0 or 1 on success. Return -1 or -2 on failure. (-2 is returned
+ * if the new and old bindings differ in type).
+ */
+ virtual int rebind (const char *id,
+ const char *kind,
+ CORBA::Object_ptr obj,
+ CosNaming::BindingType type);
+
+ /**
+ * Remove a binding containing <id> and <kind> from the table.
+ * Return 0 on success and -1 on failure.
+ */
+ virtual int unbind (const char * id,
+ const char * kind);
+
+ /**
+ * Find the binding containing <id> and <kind> in the table, and
+ * pass binding's type and object back to the caller by reference.
+ * Return 0 on success and -1 on failure. Note: a 'duplicated' object
+ * reference is assigned to <obj>, so the caller is responsible for
+ * its deallocation.
+ */
+ virtual int find (const char * id,
+ const char * kind,
+ CORBA::Object_ptr & obj,
+ CosNaming::BindingType &type);
+
+private:
+
+ /// Helper: factors common code from <bind> and <rebind>.
+ int shared_bind (const char *id,
+ const char *kind,
+ CORBA::Object_ptr obj,
+ CosNaming::BindingType type,
+ int rebind);
+
+ /// Hash map used for storage.
+ HASH_MAP map_;
+
+ CORBA::ORB_var orb_;
+
+};
+
+/**
+ * @class TAO_Storable_Naming_Context
+ *
+ * @brief This class plays a role of a 'ConcreteImplementor' in the
+ * Bridge pattern architecture of the CosNaming::NamingContext
+ * implementation.
+ *
+ * This class provides a implementation of the
+ * NamingContext functionality, i.e., the state can be preserved
+ * across process boundaries. Derives from
+ * TAO_Hash_Naming_Context and uses TAO_Storable_Bindings_Map to
+ * store name to object bindings.
+ */
+class TAO_Naming_Serv_Export TAO_Storable_Naming_Context : public TAO_Hash_Naming_Context
+{
+
+public:
+
+ /// Underlying data structure - typedef for ease of use.
+ typedef TAO_Storable_Bindings_Map::HASH_MAP HASH_MAP;
+
+ // = Initialization and termination methods.
+
+ /// Constructor.
+ TAO_Storable_Naming_Context (CORBA::ORB_ptr orb,
+ PortableServer::POA_ptr poa,
+ const char *poa_id,
+ TAO_Naming_Service_Persistence_Factory *factory,
+ const ACE_TCHAR *persistence_directory,
+ size_t hash_table_size = ACE_DEFAULT_MAP_SIZE);
+
+ /// Destructor.
+ virtual ~TAO_Storable_Naming_Context (void);
+
+ // = Utility methods.
+ /**
+ * This utility method factors out the code needed to create a new
+ * Storable Naming Context servant and activate it under the
+ * specified POA with the specified id. This function is static so
+ * that the code can be used, both from inside the class (e.g.,
+ * <new_context>), and from outside (e.g., Naming_Utils.cpp).
+ */
+ static CosNaming::NamingContext_ptr make_new_context (
+ CORBA::ORB_ptr orb,
+ PortableServer::POA_ptr poa,
+ const char *poa_id,
+ size_t context_size,
+ TAO_Naming_Service_Persistence_Factory *factory,
+ const ACE_TCHAR *persistence_directory,
+ TAO_Storable_Naming_Context **new_context
+ ACE_ENV_ARG_DECL);
+
+ // = Methods not implemented in TAO_Hash_Naming_Context.
+
+ static CosNaming::NamingContext_ptr recreate_all(
+ CORBA::ORB_ptr orb,
+ PortableServer::POA_ptr poa,
+ const char *poa_id,
+ size_t context_size,
+ int reentering,
+ TAO_Naming_Service_Persistence_Factory *factory,
+ const ACE_TCHAR *persistence_directory,
+ int use_redundancy
+ ACE_ENV_ARG_DECL);
+
+
+ /**
+ * This operation returns a new naming context implemented by the
+ * same naming server in which the operation was invoked. The
+ * context is not bound.
+ */
+ virtual CosNaming::NamingContext_ptr new_context (ACE_ENV_SINGLE_ARG_DECL);
+
+ /**
+ * Returns at most the requested number of bindings <how_many> in
+ * <bl>. If the naming context contains additional bindings, they
+ * are returned with a BindingIterator. In the naming context does
+ * not contain any additional bindings <bi> returned as null.
+ */
+ virtual void list (CORBA::ULong how_many,
+ CosNaming::BindingList_out &bl,
+ CosNaming::BindingIterator_out &bi
+ ACE_ENV_ARG_DECL);
+
+
+ virtual void rebind (const CosNaming::Name& n,
+ CORBA::Object_ptr obj
+ ACE_ENV_ARG_DECL);
+
+ /**
+ * Create a binding for name <n> and object <obj> in the naming
+ * context. Compound names are treated as follows: ctx->bind (<c1;
+ * c2; c3; cn>, obj) = (ctx->resolve (<c1; c2; cn-1>))->bind (<cn>,
+ * obj) if the there already exists a binding for the specified
+ * name, <AlreadyBound> exception is thrown. Naming contexts should
+ * be bound using <bind_context> and <rebind_context> in order to
+ * participate in name resolution later.
+ */
+ virtual void bind (const CosNaming::Name &n,
+ CORBA::Object_ptr obj
+ ACE_ENV_ARG_DECL);
+
+
+ /**
+ * This is the version of <bind> specifically for binding naming
+ * contexts, so that they will participate in name resolution when
+ * compound names are passed to be resolved.
+ */
+ virtual void bind_context (const CosNaming::Name &n,
+ CosNaming::NamingContext_ptr nc
+ ACE_ENV_ARG_DECL);
+
+ /**
+ * This is a version of <rebind> specifically for naming contexts,
+ * so that they can participate in name resolution when compound
+ * names are passed.
+ */
+ virtual void rebind_context (const CosNaming::Name &n,
+ CosNaming::NamingContext_ptr nc
+ ACE_ENV_ARG_DECL);
+
+ /**
+ * Return object reference that is bound to the name. Compound name
+ * resolve is defined as follows: ctx->resolve (<c1; c2; cn>) =
+ * ctx->resolve (<c1; c2 cn-1>)->resolve (<cn>) The naming service
+ * does not return the type of the object. Clients are responsible
+ * for "narrowing" the object to the appropriate type.
+ */
+ virtual CORBA::Object_ptr resolve (const CosNaming::Name &n
+ ACE_ENV_ARG_DECL);
+
+ /**
+ * Remove the name binding from the context. When compound names
+ * are used, unbind is defined as follows: ctx->unbind (<c1; c2;
+ * cn>) = (ctx->resolve (<c1; c2; cn-1>))->unbind (<cn>)
+ */
+ virtual void unbind (const CosNaming::Name &n
+ ACE_ENV_ARG_DECL);
+
+ /**
+ * This operation creates a new context and binds it to the name
+ * supplied as an argument. The newly-created context is
+ * implemented by the same server as the context in which it was
+ * bound (the name argument excluding the last component).
+ */
+ virtual CosNaming::NamingContext_ptr bind_new_context (
+ const CosNaming::Name &n
+ ACE_ENV_ARG_DECL);
+
+ /**
+ * Delete the naming context. The user should take care to <unbind> any
+ * bindings in which the given context is bound to some names, to
+ * avoid dangling references when invoking <destroy> operation.
+ * NOTE: <destory> is a no-op on the root context.
+ * NOTE: after <destroy> is invoked on a Naming Context, all
+ * BindingIterators associated with that Naming Context are also destroyed.
+ */
+ virtual void destroy (ACE_ENV_SINGLE_ARG_DECL);
+
+protected:
+
+ /// Global counter used for generation of POA ids for children Naming
+ /// Contexts.
+ static ACE_UINT32 gcounter_;
+
+ /// Counter used for generation of transients
+ ACE_UINT32 counter_;
+
+ /**
+ * A pointer to the underlying data structure used to store name
+ * bindings. While our superclass (TAO_Hash_Naming_Context) also
+ * maintains a pointer to the data structure, keeping this pointer
+ * around saves us from the need to downcast when invoking
+ * non-virtual methods.
+ */
+ TAO_Storable_Bindings_Map *storable_context_;
+
+ CORBA::ORB_var orb_;
+
+ ACE_CString name_;
+
+ PortableServer::POA_var poa_;
+
+ TAO_Naming_Service_Persistence_Factory *factory_;
+
+ /// The directory in which to store the files
+ ACE_CString persistence_directory_;
+
+ /// Save the hash table initial size
+ size_t hash_table_size_;
+
+ /// Disk time that match current memory state
+ time_t last_changed_;
+
+ /// Flag to tell use whether we are redundant or not
+ static int redundant_;
+
+ static const char * root_name_;
+
+ /// The pointer to the global file used to allocate new contexts
+ static ACE_Auto_Ptr<TAO_Storable_Base> gfl_;
+
+/**
+ * @class File_Open_Lock_and_Check
+ *
+ * @brief Helper class for the TAO_Storable_Naming_Context.
+ *
+ * Guard class for the TAO_Storable_Naming_Context. It opens
+ * a file for read/write and sets a lock on it. It then checks
+ * if the file has changed and re-reads it if it has.
+ *
+ * The destructor insures that the lock gets released.
+ *
+ * <pre>
+ * How to use this class:
+ * File_Open_Lock_and_Check flck(this, name_len > 1 ? "r" : "rw");
+ ACE_CHECK;
+ * </pre>
+ */
+class File_Open_Lock_and_Check
+{
+public:
+
+ /// Constructor - we always need the object which we guard.
+ File_Open_Lock_and_Check(TAO_Storable_Naming_Context * context,
+ const char * mode
+ ACE_ENV_ARG_DECL);
+
+ /// Destructor
+ ~File_Open_Lock_and_Check(void);
+
+ /// Releases the lock, closes the file, and deletes the I/O stream.
+ void release(void);
+
+ /// Returns the stream to read/write on
+ TAO_Storable_Base & peer(void);
+
+private:
+ /// Default constructor
+ File_Open_Lock_and_Check(void);
+
+ /// A flag to keep us from trying to close things more than once.
+ int closed_;
+
+ /// We need to save the pointer to our parent for cleaning up
+ TAO_Storable_Naming_Context * context_;
+
+ /// The pointer to the actual file I/O (bridge pattern)
+ TAO_Storable_Base *fl_;
+
+ /// The flags that we were opened with
+ int rwflags_;
+
+ /// Symbolic values for the flags in the above
+ enum{ mode_write = 1, mode_read = 2, mode_create = 4 };
+}; // end of embedded class File_Open_Lock_and_Check
+
+ friend class File_Open_Lock_and_Check;
+
+ int load_map(File_Open_Lock_and_Check *flck ACE_ENV_ARG_DECL);
+
+ void Write(TAO_Storable_Base& wrtr);
+
+};
+
+TAO_END_VERSIONED_NAMESPACE_DECL
+
+#include /**/ "ace/post.h"
+#endif /* TAO_STORABLE_NAMING_CONTEXT_H */
diff --git a/TAO/orbsvcs/orbsvcs/Naming/Storable_Naming_Context_Activator.cpp b/TAO/orbsvcs/orbsvcs/Naming/Storable_Naming_Context_Activator.cpp
new file mode 100644
index 00000000000..b2bb63bf6cf
--- /dev/null
+++ b/TAO/orbsvcs/orbsvcs/Naming/Storable_Naming_Context_Activator.cpp
@@ -0,0 +1,125 @@
+// $Id$
+// ============================================================================
+//
+// = LIBRARY
+// cos
+//
+// = FILENAME
+// Storable_Naming_Context_Activator.h
+//
+// = AUTHOR
+// Byron Harris <harris_b@ociweb.com>
+//
+// ============================================================================
+
+#include "orbsvcs/Naming/Storable_Naming_Context_Activator.h"
+
+#if (TAO_HAS_MINIMUM_POA == 0)
+#include "orbsvcs/Naming/Naming_Context_Interface.h"
+#include "orbsvcs/Naming/Storable_Naming_Context.h"
+#include "orbsvcs/Naming/Storable.h"
+#include "ace/Auto_Ptr.h"
+
+TAO_BEGIN_VERSIONED_NAMESPACE_DECL
+
+TAO_Storable_Naming_Context_Activator::TAO_Storable_Naming_Context_Activator (
+ CORBA::ORB_ptr orb,
+ TAO_Naming_Service_Persistence_Factory *factory,
+ const ACE_TCHAR *persistence_directory,
+ size_t context_size)
+ : orb_(orb),
+ factory_(factory),
+ persistence_directory_(persistence_directory),
+ context_size_(context_size)
+{
+}
+
+TAO_Storable_Naming_Context_Activator::~TAO_Storable_Naming_Context_Activator ()
+{
+ delete factory_;
+}
+
+PortableServer::Servant
+TAO_Storable_Naming_Context_Activator::incarnate (
+ const PortableServer::ObjectId &oid,
+ PortableServer::POA_ptr poa
+ ACE_ENV_ARG_DECL)
+ ACE_THROW_SPEC ((CORBA::SystemException,
+ PortableServer::ForwardRequest))
+{
+
+ // Make sure complete initialization has been done
+ ACE_ASSERT (factory_ != 0);
+
+ CORBA::String_var poa_id = PortableServer::ObjectId_to_string (oid);
+
+ // The approached used is to simply verify that there is a
+ // persistence element that exists that corresponds to the
+ // poa_id. If so, an empty context is created. Later, when the
+ // context is accessed it will be determined that the contents of
+ // the persistence elment needs to be read in.
+
+ // Does this already exist on disk?
+ ACE_TString file_name(persistence_directory_);
+ file_name += ACE_TEXT("/");
+ file_name += ACE_TEXT_CHAR_TO_TCHAR(poa_id.in());
+ TAO_Storable_Base * fl = factory_->create_stream(ACE_TEXT_ALWAYS_CHAR(file_name.c_str()), ACE_TEXT("rw"));
+ if (!fl->exists()) {
+ ACE_THROW_RETURN (CORBA::OBJECT_NOT_EXIST (),
+ 0);
+ }
+
+ // Store the stub we will return here.
+ CosNaming::NamingContext_var result (CosNaming::NamingContext::_nil());
+
+ // Put together a servant for the new Naming Context.
+
+ TAO_Storable_Naming_Context *context_impl = 0;
+ ACE_NEW_THROW_EX (context_impl,
+ TAO_Storable_Naming_Context (orb_,
+ poa,
+ poa_id.in (),
+ factory_,
+ persistence_directory_,
+ context_size_),
+ CORBA::NO_MEMORY ());
+ ACE_CHECK_RETURN (0);
+
+ // Put <context_impl> into the auto pointer temporarily, in case next
+ // allocation fails.
+ ACE_Auto_Basic_Ptr<TAO_Storable_Naming_Context> temp (context_impl);
+
+ TAO_Naming_Context *context = 0;
+ ACE_NEW_THROW_EX (context,
+ TAO_Naming_Context (context_impl),
+ CORBA::NO_MEMORY ());
+ ACE_CHECK_RETURN (0);
+
+ // Let <implementation> know about it's <interface>.
+ context_impl->interface (context);
+
+ // Release auto pointer, and start using reference counting to
+ // control our servant.
+ temp.release ();
+
+ return context;
+}
+
+void
+TAO_Storable_Naming_Context_Activator::etherealize (
+ const PortableServer::ObjectId &/*oid*/,
+ PortableServer::POA_ptr /*adapter*/,
+ PortableServer::Servant servant,
+ CORBA::Boolean /*cleanup_in_progress*/,
+ CORBA::Boolean remaining_activations
+ ACE_ENV_ARG_DECL_NOT_USED)
+ ACE_THROW_SPEC ((CORBA::SystemException))
+{
+ if (!remaining_activations) {
+ delete servant;
+ }
+}
+
+TAO_END_VERSIONED_NAMESPACE_DECL
+
+#endif /* TAO_HAS_MINIMUM_POA */
diff --git a/TAO/orbsvcs/orbsvcs/Naming/Storable_Naming_Context_Activator.h b/TAO/orbsvcs/orbsvcs/Naming/Storable_Naming_Context_Activator.h
new file mode 100644
index 00000000000..d8799fd1137
--- /dev/null
+++ b/TAO/orbsvcs/orbsvcs/Naming/Storable_Naming_Context_Activator.h
@@ -0,0 +1,91 @@
+// -*- C++ -*-
+
+// $Id$
+
+// ============================================================================
+//
+// = LIBRARY
+// cos
+//
+// = FILENAME
+// Storable_Naming_Context_Activator.h
+//
+// = AUTHOR
+// Byron Harris <harris_b@ociweb.com>
+//
+// ============================================================================
+
+#ifndef TAO_STORABLE_NAMING_CONTEXT_ACTIVATOR_H
+#define TAO_STORABLE_NAMING_CONTEXT_ACTIVATOR_H
+#include /**/ "ace/pre.h"
+
+#include "tao/PortableServer/PortableServer.h"
+#include "tao/PortableServer/ServantActivatorC.h"
+#include "tao/LocalObject.h"
+
+#if (TAO_HAS_MINIMUM_POA == 0)
+
+#include "orbsvcs/Naming/naming_serv_export.h"
+
+TAO_BEGIN_VERSIONED_NAMESPACE_DECL
+
+class TAO_Naming_Service_Persistence_Factory;
+
+/**
+ * A servant activator to be use with a TAO_Storable_Naming_Context.
+ * Permits contexts saved to disk in one naming service process to be
+ * "lazily" created on demand in other processes by reading the
+ * context file off disk only when a request to the context is made.
+ */
+class TAO_Naming_Serv_Export TAO_Storable_Naming_Context_Activator :
+ public virtual PortableServer::ServantActivator
+{
+public:
+
+ /**
+ * The constructor takes arguments needed to create a
+ * TAO_Storable_Naming_Context and TAO_Naming_Context on demand.
+ */
+ TAO_Storable_Naming_Context_Activator(CORBA::ORB_ptr orb,
+ TAO_Naming_Service_Persistence_Factory *factory,
+ const ACE_TCHAR *persistence_directory,
+ size_t context_size);
+
+ virtual ~TAO_Storable_Naming_Context_Activator();
+
+ /**
+ * Create a TAO_Storable_Naming_Context and TAO_Naming_Context on
+ * demand if a request to a naming context CORBA reference is made
+ * and the servant implementing this reference does not yet exist.
+ */
+ virtual PortableServer::Servant incarnate (const PortableServer::ObjectId &oid,
+ PortableServer::POA_ptr poa
+ ACE_ENV_ARG_DECL)
+ ACE_THROW_SPEC ((CORBA::SystemException,
+ PortableServer::ForwardRequest));
+
+ /**
+ * Used by the POA to delete the servant created from a call to incarnate.
+ */
+ virtual void etherealize (const PortableServer::ObjectId &oid,
+ PortableServer::POA_ptr adapter,
+ PortableServer::Servant servant,
+ CORBA::Boolean cleanup_in_progress,
+ CORBA::Boolean remaining_activations
+ ACE_ENV_ARG_DECL)
+ ACE_THROW_SPEC ((CORBA::SystemException));
+
+private:
+
+ CORBA::ORB_ptr orb_;
+ TAO_Naming_Service_Persistence_Factory *factory_;
+ const ACE_TCHAR *persistence_directory_;
+ size_t context_size_;
+};
+
+TAO_END_VERSIONED_NAMESPACE_DECL
+
+#endif /* TAO_HAS_MINIMUM_POA */
+
+#include /**/ "ace/post.h"
+#endif
diff --git a/TAO/orbsvcs/orbsvcs/Naming/Transient_Naming_Context.cpp b/TAO/orbsvcs/orbsvcs/Naming/Transient_Naming_Context.cpp
new file mode 100644
index 00000000000..06eb43a44b5
--- /dev/null
+++ b/TAO/orbsvcs/orbsvcs/Naming/Transient_Naming_Context.cpp
@@ -0,0 +1,344 @@
+// $Id$
+// ============================================================================
+//
+// = LIBRARY
+// cos
+//
+// = FILENAME
+// Transient_Naming_Context.cpp
+//
+// = AUTHOR
+// Marina Spivak <marina@cs.wustl.edu> and
+// Sergio Flores-Gaitan <sergio@cs.wustl.edu>
+//
+// ============================================================================
+#include "ace/Auto_Ptr.h"
+#include "orbsvcs/Naming/Transient_Naming_Context.h"
+#include "orbsvcs/Naming/Bindings_Iterator_T.h"
+#include "ace/OS_NS_stdio.h"
+
+ACE_RCSID(Naming, Transient_Naming_Context, "$Id$")
+
+TAO_BEGIN_VERSIONED_NAMESPACE_DECL
+
+int
+TAO_Transient_Bindings_Map::unbind (const char *id,
+ const char *kind)
+{
+ TAO_ExtId name (id, kind);
+ return this->map_.unbind (name);
+}
+
+int
+TAO_Transient_Bindings_Map::bind (const char *id,
+ const char *kind,
+ CORBA::Object_ptr obj,
+ CosNaming::BindingType type)
+{
+ return this->shared_bind (id, kind, obj, type, 0);
+}
+
+int
+TAO_Transient_Bindings_Map::rebind (const char *id,
+ const char *kind,
+ CORBA::Object_ptr obj,
+ CosNaming::BindingType type)
+{
+ return this->shared_bind (id, kind, obj, type, 1);
+}
+
+int
+TAO_Transient_Bindings_Map::find (const char *id,
+ const char *kind,
+ CORBA::Object_ptr & obj,
+ CosNaming::BindingType &type)
+{
+ TAO_ExtId name (id, kind);
+ TAO_IntId entry;
+
+ if (this->map_.find (name,
+ entry) != 0)
+ return -1;
+ else
+ {
+ obj = CORBA::Object::_duplicate (entry.ref_);
+ type = entry.type_;
+ return 0;
+ }
+}
+
+TAO_Transient_Bindings_Map::TAO_Transient_Bindings_Map (size_t hash_table_size)
+ : map_ (hash_table_size)
+{
+}
+
+TAO_Transient_Bindings_Map::~TAO_Transient_Bindings_Map (void)
+{
+}
+
+TAO_Transient_Bindings_Map::HASH_MAP &
+TAO_Transient_Bindings_Map::map (void)
+{
+ return map_;
+}
+
+size_t
+TAO_Transient_Bindings_Map::current_size (void)
+{
+ return map_.current_size ();
+}
+
+size_t
+TAO_Transient_Bindings_Map::total_size (void)
+{
+ return map_.total_size ();
+}
+
+int
+TAO_Transient_Bindings_Map::shared_bind (const char * id,
+ const char * kind,
+ CORBA::Object_ptr obj,
+ CosNaming::BindingType type,
+ int rebind)
+{
+ TAO_ExtId new_name (id, kind);
+ TAO_IntId new_entry (obj, type);
+ TAO_IntId old_entry;
+
+ if (rebind == 0)
+ // Do a normal bind.
+ return this->map_.bind (new_name, new_entry);
+
+ else
+ // Rebind.
+ {
+ // Check that types of old and new entries match.
+ if (this->map_.find (new_name,
+ old_entry) == 0
+ && type != old_entry.type_)
+ return -2;
+
+ else
+ return this->map_.rebind (new_name, new_entry);
+ }
+}
+
+TAO_Transient_Naming_Context::TAO_Transient_Naming_Context (PortableServer::POA_ptr poa,
+ const char *poa_id,
+ size_t hash_table_size)
+ : TAO_Hash_Naming_Context (poa,
+ poa_id),
+ counter_ (0),
+ transient_context_ (0)
+{
+ ACE_NEW (this->transient_context_,
+ TAO_Transient_Bindings_Map (hash_table_size));
+
+ context_ = transient_context_;
+}
+
+TAO_Transient_Naming_Context::~TAO_Transient_Naming_Context (void)
+{
+}
+
+CosNaming::NamingContext_ptr
+TAO_Transient_Naming_Context::make_new_context (PortableServer::POA_ptr poa,
+ const char *poa_id,
+ size_t context_size
+ ACE_ENV_ARG_DECL)
+{
+ // Store the stub we will return here.
+ CosNaming::NamingContext_var result;
+
+ // Put together a servant for the new Naming Context.
+
+ TAO_Transient_Naming_Context *context_impl = 0;
+ ACE_NEW_THROW_EX (context_impl,
+ TAO_Transient_Naming_Context (poa,
+ poa_id,
+ context_size),
+ CORBA::NO_MEMORY ());
+ ACE_CHECK_RETURN (result._retn ());
+
+ // Put <context_impl> into the auto pointer temporarily, in case next
+ // allocation fails.
+ ACE_Auto_Basic_Ptr<TAO_Transient_Naming_Context> temp (context_impl);
+
+ TAO_Naming_Context *context = 0;
+ ACE_NEW_THROW_EX (context,
+ TAO_Naming_Context (context_impl),
+ CORBA::NO_MEMORY ());
+ ACE_CHECK_RETURN (result._retn ());
+
+ // Let <implementation> know about it's <interface>.
+ context_impl->interface (context);
+
+ // Release auto pointer, and start using reference counting to
+ // control our servant.
+ temp.release ();
+ PortableServer::ServantBase_var s = context;
+
+ // Register the new context with the POA.
+ PortableServer::ObjectId_var id =
+ PortableServer::string_to_ObjectId (poa_id);
+
+ poa->activate_object_with_id (id.in (),
+ context
+ ACE_ENV_ARG_PARAMETER);
+ ACE_CHECK_RETURN (result._retn ());
+
+ result = context->_this (ACE_ENV_SINGLE_ARG_PARAMETER);
+ ACE_CHECK_RETURN (CosNaming::NamingContext::_nil ());
+
+ return result._retn ();
+}
+
+CosNaming::NamingContext_ptr
+TAO_Transient_Naming_Context::new_context (ACE_ENV_SINGLE_ARG_DECL)
+{
+ ACE_GUARD_THROW_EX (TAO_SYNCH_RECURSIVE_MUTEX,
+ ace_mon,
+ this->lock_,
+ CORBA::INTERNAL ());
+ ACE_CHECK_RETURN (CosNaming::NamingContext::_nil ());
+
+ // Check to make sure this object didn't have <destroy> method
+ // invoked on it.
+ if (this->destroyed_)
+ ACE_THROW_RETURN (CORBA::OBJECT_NOT_EXIST (),
+ CosNaming::NamingContext::_nil ());
+
+ // Generate a POA id for the new context.
+ char poa_id[BUFSIZ];
+ ACE_OS::sprintf (poa_id,
+ "%s_%d",
+ this->poa_id_.c_str (),
+ this->counter_++);
+
+ // Create a new context.
+ CosNaming::NamingContext_var result =
+ make_new_context (this->poa_.in (),
+ poa_id,
+ this->transient_context_->total_size ()
+ ACE_ENV_ARG_PARAMETER);
+ ACE_CHECK_RETURN (CosNaming::NamingContext::_nil ());
+
+ return result._retn ();
+}
+
+void
+TAO_Transient_Naming_Context::list (CORBA::ULong how_many,
+ CosNaming::BindingList_out &bl,
+ CosNaming::BindingIterator_out &bi
+ ACE_ENV_ARG_DECL)
+{
+ // Allocate nil out parameters in case we won't be able to complete
+ // the operation.
+ bi = CosNaming::BindingIterator::_nil ();
+ ACE_NEW_THROW_EX (bl,
+ CosNaming::BindingList (0),
+ CORBA::NO_MEMORY ());
+ ACE_CHECK;
+
+ // Obtain a lock before we proceed with the operation.
+ ACE_GUARD_THROW_EX (TAO_SYNCH_RECURSIVE_MUTEX,
+ ace_mon,
+ this->lock_,
+ CORBA::INTERNAL ());
+ ACE_CHECK;
+
+ // Check to make sure this object didn't have <destroy> method
+ // invoked on it.
+ if (this->destroyed_)
+ ACE_THROW (CORBA::OBJECT_NOT_EXIST ());
+
+ // Dynamically allocate iterator for traversing the underlying hash map.
+ HASH_MAP::ITERATOR *hash_iter = 0;
+ ACE_NEW_THROW_EX (hash_iter,
+ HASH_MAP::ITERATOR (transient_context_->map ()),
+ CORBA::NO_MEMORY ());
+ ACE_CHECK;
+
+ // Store <hash_iter temporarily in auto pointer, in case we'll have
+ // some failures and throw an exception.
+ ACE_Auto_Basic_Ptr<HASH_MAP::ITERATOR> temp (hash_iter);
+
+ // Silliness below is required because of broken old g++!!! E.g.,
+ // without it, we could have just said HASH_MAP::ITERATOR everywhere we use ITER_DEF.
+ typedef ACE_Hash_Map_Manager<TAO_ExtId, TAO_IntId, ACE_Null_Mutex>::ITERATOR ITER_DEF;
+ typedef ACE_Hash_Map_Manager<TAO_ExtId, TAO_IntId, ACE_Null_Mutex>::ENTRY ENTRY_DEF;
+
+ // Typedef to the type of BindingIterator servant for ease of use.
+ typedef TAO_Bindings_Iterator<ITER_DEF, ENTRY_DEF>
+ ITER_SERVANT;
+
+ // A pointer to BindingIterator servant.
+ ITER_SERVANT *bind_iter = 0;
+
+ // Number of bindings that will go into the BindingList <bl>.
+ CORBA::ULong n;
+
+ // Calculate number of bindings that will go into <bl>.
+ if (this->context_->current_size () > how_many)
+ n = how_many;
+ else
+ n = static_cast<CORBA::ULong> (this->context_->current_size ());
+
+ // Use the hash map iterator to populate <bl> with bindings.
+ bl->length (n);
+
+ ENTRY_DEF *hash_entry = 0;
+
+ for (CORBA::ULong i = 0; i < n; i++)
+ {
+ hash_iter->next (hash_entry);
+ hash_iter->advance ();
+
+ if (ITER_SERVANT::populate_binding (hash_entry, bl[i]) == 0)
+ ACE_THROW (CORBA::NO_MEMORY());
+ }
+
+ // Now we are done with the BindingsList, and we can follow up on
+ // the BindingIterator business.
+
+ // If we do not need to pass back BindingIterator.
+ if (this->context_->current_size () <= how_many)
+ return;
+ else
+ {
+ // Create a BindingIterator for return.
+ ACE_NEW_THROW_EX (bind_iter,
+ ITER_SERVANT (this, hash_iter, this->poa_.in (), this->lock_),
+ CORBA::NO_MEMORY ());
+ ACE_CHECK;
+
+ // Release <hash_iter> from auto pointer, and start using
+ // reference counting to control our servant.
+ temp.release ();
+ PortableServer::ServantBase_var iter = bind_iter;
+
+ // Increment reference count on this Naming Context, so it doesn't get
+ // deleted before the BindingIterator servant gets deleted.
+ interface_->_add_ref (ACE_ENV_SINGLE_ARG_PARAMETER);
+ ACE_CHECK;
+
+ // Register with the POA.
+ char poa_id[BUFSIZ];
+ ACE_OS::sprintf (poa_id,
+ "%s_%d",
+ this->poa_id_.c_str (),
+ this->counter_++);
+ PortableServer::ObjectId_var id =
+ PortableServer::string_to_ObjectId (poa_id);
+
+ this->poa_->activate_object_with_id (id.in (),
+ bind_iter
+ ACE_ENV_ARG_PARAMETER);
+ ACE_CHECK;
+
+ bi = bind_iter->_this (ACE_ENV_SINGLE_ARG_PARAMETER);
+ ACE_CHECK;
+ }
+}
+
+TAO_END_VERSIONED_NAMESPACE_DECL
diff --git a/TAO/orbsvcs/orbsvcs/Naming/Transient_Naming_Context.h b/TAO/orbsvcs/orbsvcs/Naming/Transient_Naming_Context.h
new file mode 100644
index 00000000000..2c3de8a61f3
--- /dev/null
+++ b/TAO/orbsvcs/orbsvcs/Naming/Transient_Naming_Context.h
@@ -0,0 +1,204 @@
+// -*- C++ -*-
+
+//=============================================================================
+/**
+ * @file Transient_Naming_Context.h
+ *
+ * $Id$
+ *
+ * @author Marina Spivak <marina@cs.wustl.edu>
+ */
+//=============================================================================
+
+
+#ifndef TAO_TRANSIENT_NAMING_CONTEXT_H
+#define TAO_TRANSIENT_NAMING_CONTEXT_H
+#include /**/ "ace/pre.h"
+
+#include "orbsvcs/Naming/Hash_Naming_Context.h"
+#include "orbsvcs/Naming/Entries.h"
+#include "ace/Hash_Map_Manager.h"
+
+#if !defined (ACE_LACKS_PRAGMA_ONCE)
+# pragma once
+#endif /* ACE_LACKS_PRAGMA_ONCE */
+
+
+TAO_BEGIN_VERSIONED_NAMESPACE_DECL
+
+/**
+ * @class TAO_Transient_Bindings_Map
+ *
+ * @brief Provides hash-table-based transient storage for name to object
+ * bindings in a Naming Context.
+ *
+ * A thin wrapper on top of ACE_Hash_Map_Manager. Supports
+ * TAO_Bindings_Map interface. Used by TAO_Transient_Naming_Context.
+ */
+class TAO_Naming_Serv_Export TAO_Transient_Bindings_Map : public TAO_Bindings_Map
+{
+public:
+
+ /// Underlying data structure - typedef for ease of use.
+ typedef ACE_Hash_Map_Manager<TAO_ExtId, TAO_IntId, ACE_Null_Mutex> HASH_MAP;
+
+ // = Initialization and termination methods.
+
+ /// Constructor.
+ TAO_Transient_Bindings_Map (size_t hash_table_size);
+
+ /// Destructor.
+ virtual ~TAO_Transient_Bindings_Map (void);
+
+ // = Accessors.
+
+ /// Get a reference to the underlying hash map.
+ HASH_MAP &map (void);
+
+ /// Return the size of the underlying hash table.
+ size_t total_size (void);
+
+ /// Return current number of entries (name bindings) in the
+ /// underlying hash map.
+ virtual size_t current_size (void);
+
+ // = Name bindings manipulation methods.
+
+ /**
+ * Add a binding with the specified parameters to the table.
+ * Return 0 on success and -1 on failure, 1 if there already is a
+ * binding with <id> and <kind>.
+ */
+ virtual int bind (const char *id,
+ const char *kind,
+ CORBA::Object_ptr obj,
+ CosNaming::BindingType type);
+
+ /**
+ * Overwrite a binding containing <id> and <kind> (or create a new
+ * one if one doesn't exist) with the specified parameters. Return
+ * 0 or 1 on success. Return -1 or -2 on failure. (-2 is returned
+ * if the new and old bindings differ in type).
+ */
+ virtual int rebind (const char *id,
+ const char *kind,
+ CORBA::Object_ptr obj,
+ CosNaming::BindingType type);
+
+ /**
+ * Remove a binding containing <id> and <kind> from the table.
+ * Return 0 on success and -1 on failure.
+ */
+ virtual int unbind (const char * id,
+ const char * kind);
+
+ /**
+ * Find the binding containing <id> and <kind> in the table, and
+ * pass binding's type and object back to the caller by reference.
+ * Return 0 on success and -1 on failure. Note: a 'duplicated' object
+ * reference is assigned to <obj>, so the caller is responsible for
+ * its deallocation.
+ */
+ virtual int find (const char * id,
+ const char * kind,
+ CORBA::Object_ptr & obj,
+ CosNaming::BindingType &type);
+
+private:
+
+ /// Helper: factors common code from <bind> and <rebind>.
+ int shared_bind (const char *id,
+ const char *kind,
+ CORBA::Object_ptr obj,
+ CosNaming::BindingType type,
+ int rebind);
+
+ /// Hash map used for storage.
+ HASH_MAP map_;
+};
+
+/**
+ * @class TAO_Transient_Naming_Context
+ *
+ * @brief This class plays a role of a 'ConcreteImplementor' in the
+ * Bridge pattern architecture of the CosNaming::NamingContext
+ * implementation.
+ *
+ * This class provides a transient implementation of the
+ * NamingContext functionality, i.e., the state is not preserved
+ * across process boundaries. Derives from
+ * TAO_Hash_Naming_Context and uses TAO_Transient_Bindings_Map to
+ * store name to object bindings.
+ */
+class TAO_Naming_Serv_Export TAO_Transient_Naming_Context : public TAO_Hash_Naming_Context
+{
+
+public:
+
+ /// Underlying data structure - typedef for ease of use.
+ typedef TAO_Transient_Bindings_Map::HASH_MAP HASH_MAP;
+
+ // = Initialization and termination methods.
+
+ /// Constructor.
+ TAO_Transient_Naming_Context (PortableServer::POA_ptr poa,
+ const char *poa_id,
+ size_t hash_table_size
+ = ACE_DEFAULT_MAP_SIZE);
+
+ /// Destructor.
+ virtual ~TAO_Transient_Naming_Context (void);
+
+ // = Utility methods.
+ /**
+ * This utility method factors out the code needed to create a new
+ * Transient Naming Context servant and activate it under the
+ * specified POA with the specified id. This function is static so
+ * that the code can be used, both from inside the class (e.g., <new_context>),
+ * and from outside (e.g., Naming_Utils.cpp).
+ */
+ static CosNaming::NamingContext_ptr make_new_context (PortableServer::POA_ptr poa,
+ const char *poa_id,
+ size_t context_size
+ ACE_ENV_ARG_DECL);
+
+ // = Methods not implemented in TAO_Hash_Naming_Context.
+
+ /**
+ * This operation returns a new naming context implemented by the
+ * same naming server in which the operation was invoked. The
+ * context is not bound.
+ */
+ virtual CosNaming::NamingContext_ptr new_context (ACE_ENV_SINGLE_ARG_DECL);
+
+ /**
+ * Returns at most the requested number of bindings <how_many> in
+ * <bl>. If the naming context contains additional bindings, they
+ * are returned with a BindingIterator. In the naming context does
+ * not contain any additional bindings <bi> returned as null.
+ */
+ virtual void list (CORBA::ULong how_many,
+ CosNaming::BindingList_out &bl,
+ CosNaming::BindingIterator_out &bi
+ ACE_ENV_ARG_DECL);
+
+protected:
+
+ /// Counter used for generation of POA ids for children Naming
+ /// Contexts.
+ ACE_UINT32 counter_;
+
+ /**
+ * A pointer to the underlying data structure used to store name
+ * bindings. While our superclass (TAO_Hash_Naming_Context) also
+ * maintains a pointer to the data structure, keeping this pointer
+ * around saves us from the need to downcast when invoking
+ * non-virtual methods.
+ */
+ TAO_Transient_Bindings_Map *transient_context_;
+};
+
+TAO_END_VERSIONED_NAMESPACE_DECL
+
+#include /**/ "ace/post.h"
+#endif /* TAO_TRANSIENT_NAMING_CONTEXT_H */
diff --git a/TAO/orbsvcs/orbsvcs/Naming/naming_export.h b/TAO/orbsvcs/orbsvcs/Naming/naming_export.h
new file mode 100644
index 00000000000..3bc9c600e49
--- /dev/null
+++ b/TAO/orbsvcs/orbsvcs/Naming/naming_export.h
@@ -0,0 +1,40 @@
+
+// -*- C++ -*-
+// $Id$
+// Definition for Win32 Export directives.
+// This file is generated automatically by generate_export_file.pl
+// ------------------------------
+#ifndef TAO_NAMING_EXPORT_H
+#define TAO_NAMING_EXPORT_H
+
+#include "ace/config-all.h"
+
+#if defined (TAO_AS_STATIC_LIBS)
+# if !defined (TAO_NAMING_HAS_DLL)
+# define TAO_NAMING_HAS_DLL 0
+# endif /* ! TAO_NAMING_HAS_DLL */
+#else
+# if !defined (TAO_NAMING_HAS_DLL)
+# define TAO_NAMING_HAS_DLL 1
+# endif /* ! TAO_NAMING_HAS_DLL */
+#endif
+
+#if defined (TAO_NAMING_HAS_DLL) && (TAO_NAMING_HAS_DLL == 1)
+# if defined (TAO_NAMING_BUILD_DLL)
+# define TAO_Naming_Export ACE_Proper_Export_Flag
+# define TAO_NAMING_SINGLETON_DECLARATION(T) ACE_EXPORT_SINGLETON_DECLARATION (T)
+# define TAO_NAMING_SINGLETON_DECLARE(SINGLETON_TYPE, CLASS, LOCK) ACE_EXPORT_SINGLETON_DECLARE(SINGLETON_TYPE, CLASS, LOCK)
+# else /* TAO_NAMING_BUILD_DLL */
+# define TAO_Naming_Export ACE_Proper_Import_Flag
+# define TAO_NAMING_SINGLETON_DECLARATION(T) ACE_IMPORT_SINGLETON_DECLARATION (T)
+# define TAO_NAMING_SINGLETON_DECLARE(SINGLETON_TYPE, CLASS, LOCK) ACE_IMPORT_SINGLETON_DECLARE(SINGLETON_TYPE, CLASS, LOCK)
+# endif /* TAO_NAMING_BUILD_DLL */
+#else /* TAO_NAMING_HAS_DLL == 1 */
+# define TAO_Naming_Export
+# define TAO_NAMING_SINGLETON_DECLARATION(T)
+# define TAO_NAMING_SINGLETON_DECLARE(SINGLETON_TYPE, CLASS, LOCK)
+#endif /* TAO_NAMING_HAS_DLL == 1 */
+
+#endif /* TAO_NAMING_EXPORT_H */
+
+// End of auto generated file.
diff --git a/TAO/orbsvcs/orbsvcs/Naming/naming_serv_export.h b/TAO/orbsvcs/orbsvcs/Naming/naming_serv_export.h
new file mode 100644
index 00000000000..220b76294f0
--- /dev/null
+++ b/TAO/orbsvcs/orbsvcs/Naming/naming_serv_export.h
@@ -0,0 +1,40 @@
+
+// -*- C++ -*-
+// $Id$
+// Definition for Win32 Export directives.
+// This file is generated automatically by generate_export_file.pl
+// ------------------------------
+#ifndef TAO_NAMING_SERV_EXPORT_H
+#define TAO_NAMING_SERV_EXPORT_H
+
+#include "ace/config-all.h"
+
+#if defined (TAO_AS_STATIC_LIBS)
+# if !defined (TAO_NAMING_SERV_HAS_DLL)
+# define TAO_NAMING_SERV_HAS_DLL 0
+# endif /* ! TAO_NAMING_SERV_HAS_DLL */
+#else
+# if !defined (TAO_NAMING_SERV_HAS_DLL)
+# define TAO_NAMING_SERV_HAS_DLL 1
+# endif /* ! TAO_NAMING_SERV_HAS_DLL */
+#endif
+
+#if defined (TAO_NAMING_SERV_HAS_DLL) && (TAO_NAMING_SERV_HAS_DLL == 1)
+# if defined (TAO_NAMING_SERV_BUILD_DLL)
+# define TAO_Naming_Serv_Export ACE_Proper_Export_Flag
+# define TAO_NAMING_SERV_SINGLETON_DECLARATION(T) ACE_EXPORT_SINGLETON_DECLARATION (T)
+# define TAO_NAMING_SERV_SINGLETON_DECLARE(SINGLETON_TYPE, CLASS, LOCK) ACE_EXPORT_SINGLETON_DECLARE(SINGLETON_TYPE, CLASS, LOCK)
+# else /* TAO_NAMING_SERV_BUILD_DLL */
+# define TAO_Naming_Serv_Export ACE_Proper_Import_Flag
+# define TAO_NAMING_SERV_SINGLETON_DECLARATION(T) ACE_IMPORT_SINGLETON_DECLARATION (T)
+# define TAO_NAMING_SERV_SINGLETON_DECLARE(SINGLETON_TYPE, CLASS, LOCK) ACE_IMPORT_SINGLETON_DECLARE(SINGLETON_TYPE, CLASS, LOCK)
+# endif /* TAO_NAMING_SERV_BUILD_DLL */
+#else /* TAO_NAMING_SERV_HAS_DLL == 1 */
+# define TAO_Naming_Serv_Export
+# define TAO_NAMING_SERV_SINGLETON_DECLARATION(T)
+# define TAO_NAMING_SERV_SINGLETON_DECLARE(SINGLETON_TYPE, CLASS, LOCK)
+#endif /* TAO_NAMING_SERV_HAS_DLL == 1 */
+
+#endif /* TAO_NAMING_SERV_EXPORT_H */
+
+// End of auto generated file.
diff --git a/TAO/orbsvcs/orbsvcs/Naming/naming_skel_export.h b/TAO/orbsvcs/orbsvcs/Naming/naming_skel_export.h
new file mode 100644
index 00000000000..aef94b094c2
--- /dev/null
+++ b/TAO/orbsvcs/orbsvcs/Naming/naming_skel_export.h
@@ -0,0 +1,40 @@
+
+// -*- C++ -*-
+// $Id$
+// Definition for Win32 Export directives.
+// This file is generated automatically by generate_export_file.pl
+// ------------------------------
+#ifndef TAO_NAMING_SKEL_EXPORT_H
+#define TAO_NAMING_SKEL_EXPORT_H
+
+#include "ace/config-all.h"
+
+#if defined (TAO_AS_STATIC_LIBS)
+# if !defined (TAO_NAMING_SKEL_HAS_DLL)
+# define TAO_NAMING_SKEL_HAS_DLL 0
+# endif /* ! TAO_NAMING_SKEL_HAS_DLL */
+#else
+# if !defined (TAO_NAMING_SKEL_HAS_DLL)
+# define TAO_NAMING_SKEL_HAS_DLL 1
+# endif /* ! TAO_NAMING_SKEL_HAS_DLL */
+#endif
+
+#if defined (TAO_NAMING_SKEL_HAS_DLL) && (TAO_NAMING_SKEL_HAS_DLL == 1)
+# if defined (TAO_NAMING_SKEL_BUILD_DLL)
+# define TAO_Naming_Skel_Export ACE_Proper_Export_Flag
+# define TAO_NAMING_SKEL_SINGLETON_DECLARATION(T) ACE_EXPORT_SINGLETON_DECLARATION (T)
+# define TAO_NAMING_SKEL_SINGLETON_DECLARE(SINGLETON_TYPE, CLASS, LOCK) ACE_EXPORT_SINGLETON_DECLARE(SINGLETON_TYPE, CLASS, LOCK)
+# else /* TAO_NAMING_SKEL_BUILD_DLL */
+# define TAO_Naming_Skel_Export ACE_Proper_Import_Flag
+# define TAO_NAMING_SKEL_SINGLETON_DECLARATION(T) ACE_IMPORT_SINGLETON_DECLARATION (T)
+# define TAO_NAMING_SKEL_SINGLETON_DECLARE(SINGLETON_TYPE, CLASS, LOCK) ACE_IMPORT_SINGLETON_DECLARE(SINGLETON_TYPE, CLASS, LOCK)
+# endif /* TAO_NAMING_SKEL_BUILD_DLL */
+#else /* TAO_NAMING_SKEL_HAS_DLL == 1 */
+# define TAO_Naming_Skel_Export
+# define TAO_NAMING_SKEL_SINGLETON_DECLARATION(T)
+# define TAO_NAMING_SKEL_SINGLETON_DECLARE(SINGLETON_TYPE, CLASS, LOCK)
+#endif /* TAO_NAMING_SKEL_HAS_DLL == 1 */
+
+#endif /* TAO_NAMING_SKEL_EXPORT_H */
+
+// End of auto generated file.
diff --git a/TAO/orbsvcs/orbsvcs/Naming/nsconf.h b/TAO/orbsvcs/orbsvcs/Naming/nsconf.h
new file mode 100644
index 00000000000..6f5b66d830e
--- /dev/null
+++ b/TAO/orbsvcs/orbsvcs/Naming/nsconf.h
@@ -0,0 +1,45 @@
+//=============================================================================
+/**
+ * @file nsconf.h
+ *
+ * $Id$
+ *
+ * Name service configuration file.
+ *
+ *
+ * @author Chris Cleeland
+ * @author Douglas C. Schmidt
+ */
+//=============================================================================
+
+#ifndef TAO_NAMESERVICE_CONF_H
+#define TAO_NAMESERVICE_CONF_H
+#include /**/ "ace/pre.h"
+#include "ace/config-all.h"
+
+#if !defined (ACE_LACKS_PRAGMA_ONCE)
+# pragma once
+#endif /* ACE_LACKS_PRAGMA_ONCE */
+
+// TAO Naming Service.
+
+// Memory mapping address used by TAO's Naming Service when run in
+// persistent mode.
+#if !defined (TAO_NAMING_BASE_ADDR)
+# define TAO_NAMING_BASE_ADDR ACE_DEFAULT_BASE_ADDR
+#endif /* ! TAO_NAMING_BASE_ADDR */
+
+// Poa id of the root Naming Context in a Naming server.
+#if !defined (TAO_ROOT_NAMING_CONTEXT)
+# define TAO_ROOT_NAMING_CONTEXT "NameService"
+#endif /* ! TAO_ROOT_NAMING_CONTEXT */
+
+// The name under which the index of naming contexts is stored in
+// persistent naming service.
+#if !defined (TAO_NAMING_CONTEXT_INDEX)
+# define TAO_NAMING_CONTEXT_INDEX "Naming_Context_Index"
+#endif /* ! TAO_NAMING_CONTEXT_INDEX */
+
+
+#include /**/ "ace/post.h"
+#endif /*TAO_NAMESERVICE_CONF_H*/
diff --git a/TAO/orbsvcs/orbsvcs/Notify/Admin.cpp b/TAO/orbsvcs/orbsvcs/Notify/Admin.cpp
new file mode 100644
index 00000000000..48a0a7d9de0
--- /dev/null
+++ b/TAO/orbsvcs/orbsvcs/Notify/Admin.cpp
@@ -0,0 +1,222 @@
+// $Id$
+#include "orbsvcs/Notify/Admin.h"
+
+#if ! defined (__ACE_INLINE__)
+#include "orbsvcs/Notify/Admin.inl"
+#endif /* __ACE_INLINE__ */
+
+ACE_RCSID (Notify,
+ TAO_Notify_Admin,
+ "$Id$")
+
+#include "orbsvcs/CosNotifyChannelAdminC.h"
+
+#include "orbsvcs/Notify/Container_T.h"
+#include "orbsvcs/Notify/Proxy.h"
+#include "orbsvcs/Notify/EventChannel.h"
+#include "orbsvcs/Notify/Topology_Saver.h"
+#include "orbsvcs/Notify/Save_Persist_Worker_T.h"
+#include "orbsvcs/Notify/Reconnect_Worker_T.h"
+#include "orbsvcs/Notify/Consumer_Map.h"
+#include "orbsvcs/Notify/Supplier_Map.h"
+#include "orbsvcs/Notify/ConsumerAdmin.h"
+#include "orbsvcs/Notify/SupplierAdmin.h"
+
+#include "tao/debug.h"
+
+//#define DEBUG_LEVEL 9
+#ifndef DEBUG_LEVEL
+# define DEBUG_LEVEL TAO_debug_level
+#endif //DEBUG_LEVEL
+
+TAO_BEGIN_VERSIONED_NAMESPACE_DECL
+
+TAO_Notify_Admin::TAO_Notify_Admin ()
+ : ec_ (0)
+ , filter_operator_ (CosNotifyChannelAdmin::OR_OP)
+ , is_default_ (false)
+{
+ // Initialize all Admin objects to initially be subscribed for all
+ // events. This is a reasonable default and is required to allow
+ // Cos Event consumers/suppliers to send/receive events,
+ this->subscribed_types_.insert (TAO_Notify_EventType::special ());
+}
+
+TAO_Notify_Admin::~TAO_Notify_Admin ()
+{
+}
+
+void
+TAO_Notify_Admin::init (TAO_Notify::Topology_Parent* parent ACE_ENV_ARG_DECL)
+{
+ ACE_ASSERT (this->ec_.get() == 0);
+
+ this->ec_.reset (dynamic_cast<TAO_Notify_EventChannel *>(parent));
+ ACE_ASSERT (this->ec_.get() != 0);
+
+ // this-> on the following line confuses VC6
+ initialize (parent ACE_ENV_ARG_PARAMETER);
+
+ TAO_Notify_Proxy_Container* proxy_container = 0;
+ ACE_NEW_THROW_EX (proxy_container,
+ TAO_Notify_Proxy_Container (),
+ CORBA::INTERNAL ());
+ ACE_CHECK;
+ this->proxy_container_.reset (proxy_container);
+
+ this->proxy_container().init (ACE_ENV_SINGLE_ARG_PARAMETER);
+ ACE_CHECK;
+
+}
+
+void
+TAO_Notify_Admin::remove (TAO_Notify_Proxy* proxy ACE_ENV_ARG_DECL)
+{
+ this->proxy_container().remove (proxy ACE_ENV_ARG_PARAMETER);
+ ACE_CHECK;
+}
+
+void
+TAO_Notify_Admin::subscribed_types (TAO_Notify_EventTypeSeq& subscribed_types ACE_ENV_ARG_DECL)
+{
+ ACE_GUARD_THROW_EX (TAO_SYNCH_MUTEX, ace_mon, this->lock_,
+ CORBA::INTERNAL ());
+ ACE_CHECK;
+
+ // Adopt the Admin's subscription.
+ TAO_Notify_EventTypeSeq added (this->subscribed_types_), removed;
+
+ added.add_and_remove (subscribed_types, removed);
+
+ subscribed_types = added;
+}
+
+int
+TAO_Notify_Admin::shutdown (ACE_ENV_SINGLE_ARG_DECL)
+{
+ int sd_ret = TAO_Notify_Object::shutdown (ACE_ENV_SINGLE_ARG_PARAMETER);
+ ACE_CHECK_RETURN (1);
+ if (sd_ret == 1)
+ return 1;
+
+ this->proxy_container().shutdown (ACE_ENV_SINGLE_ARG_PARAMETER);
+ ACE_CHECK_RETURN (1);
+
+ return 0;
+}
+
+void
+TAO_Notify_Admin::insert (TAO_Notify_Proxy* proxy ACE_ENV_ARG_DECL)
+{
+ this->proxy_container().insert (proxy ACE_ENV_ARG_PARAMETER);
+}
+
+void
+TAO_Notify_Admin::save_persistent (TAO_Notify::Topology_Saver& saver ACE_ENV_ARG_DECL)
+{
+ bool changed = this->children_changed_;
+ this->children_changed_ = false;
+ this->self_changed_ = false;
+
+ if (is_persistent ())
+ {
+ TAO_Notify::NVPList attrs;
+ this->save_attrs(attrs);
+
+ const char* type = this->get_admin_type_name();
+
+ bool want_all_children =
+ saver.begin_object(this->id(), type, attrs, changed
+ ACE_ENV_ARG_PARAMETER);
+ ACE_CHECK;
+
+ if (want_all_children || this->filter_admin_.is_changed ())
+ {
+ this->filter_admin_.save_persistent(saver ACE_ENV_ARG_PARAMETER);
+ ACE_CHECK;
+ }
+ if (want_all_children || this->subscribed_types_.is_changed ())
+ {
+ this->subscribed_types_.save_persistent(saver ACE_ENV_ARG_PARAMETER);
+ ACE_CHECK;
+ }
+
+ TAO_Notify::Save_Persist_Worker<TAO_Notify_Proxy>
+ wrk(saver, want_all_children);
+ this->proxy_container().collection()->for_each(&wrk
+ ACE_ENV_ARG_PARAMETER);
+ ACE_CHECK;
+
+ saver.end_object(this->id(), type ACE_ENV_ARG_PARAMETER);
+ }
+}
+
+void
+TAO_Notify_Admin::save_attrs (TAO_Notify::NVPList& attrs)
+{
+ TAO_Notify_Object::save_attrs(attrs);
+ attrs.push_back(TAO_Notify::NVP("InterFilterGroupOperator",
+ this->filter_operator_));
+ if (this->is_default_)
+ {
+ attrs.push_back (TAO_Notify::NVP ("default", "yes"));
+ }
+}
+
+void
+TAO_Notify_Admin::load_attrs(const TAO_Notify::NVPList& attrs)
+{
+ TAO_Notify_Object::load_attrs (attrs);
+ const char* value = 0;
+ if (attrs.find ("InterFilterGroupOperator", value))
+ {
+ this->filter_operator_ = static_cast <CosNotifyChannelAdmin::InterFilterGroupOperator> (ACE_OS::atoi (value));
+ }
+
+ if (attrs.find ("default", value))
+ {
+ this->is_default_ = (ACE_OS::strcmp (value, "yes") == 0);
+ }
+}
+
+TAO_Notify::Topology_Object*
+TAO_Notify_Admin::load_child (const ACE_CString &type,
+ CORBA::Long id,
+ const TAO_Notify::NVPList& attrs
+ ACE_ENV_ARG_DECL_NOT_USED)
+{
+ ACE_UNUSED_ARG (attrs);
+ TAO_Notify::Topology_Object* result = this;
+ if (type == "subscriptions")
+ {
+ if (DEBUG_LEVEL)
+ ACE_DEBUG ((LM_DEBUG,
+ ACE_TEXT ("(%P|%t) Admin reload subscription %d\n"),
+ static_cast<int> (id)
+ ));
+ // since we initialized our subscribed types to everything
+ // in the constructor. we have to clear it out first.
+ this->subscribed_types_.reset();
+ result = &this->subscribed_types_;
+ }
+ else if (type == "filter_admin")
+ {
+ if (DEBUG_LEVEL)
+ ACE_DEBUG ((LM_DEBUG,
+ ACE_TEXT ("(%P|%t) Admin reload filter_admin %d\n"),
+ static_cast<int> (id)
+ ));
+ result = & this->filter_admin_;
+ }
+ return result;
+}
+
+void
+TAO_Notify_Admin::reconnect (ACE_ENV_SINGLE_ARG_DECL)
+{
+ TAO_Notify::Reconnect_Worker<TAO_Notify_Proxy> wrk;
+ this->proxy_container().collection()->for_each(&wrk ACE_ENV_ARG_PARAMETER);
+ ACE_CHECK;
+}
+
+TAO_END_VERSIONED_NAMESPACE_DECL
diff --git a/TAO/orbsvcs/orbsvcs/Notify/Admin.h b/TAO/orbsvcs/orbsvcs/Notify/Admin.h
new file mode 100644
index 00000000000..a7a9487c8c4
--- /dev/null
+++ b/TAO/orbsvcs/orbsvcs/Notify/Admin.h
@@ -0,0 +1,126 @@
+/* -*- C++ -*- */
+/**
+ * @file Admin.h
+ *
+ * $Id$
+ *
+ * @author Pradeep Gore <pradeep@oomworks.com>
+ *
+ *
+ */
+
+#ifndef TAO_Notify_ADMIN_H
+#define TAO_Notify_ADMIN_H
+
+#include /**/ "ace/pre.h"
+
+#include "orbsvcs/Notify/notify_serv_export.h"
+
+#if !defined (ACE_LACKS_PRAGMA_ONCE)
+# pragma once
+#endif /* ACE_LACKS_PRAGMA_ONCE */
+
+#include "orbsvcs/Notify/FilterAdmin.h"
+#include "orbsvcs/Notify/EventTypeSeq.h"
+#include "orbsvcs/Notify/Topology_Object.h"
+#include "orbsvcs/Notify/EventChannel.h"
+
+TAO_BEGIN_VERSIONED_NAMESPACE_DECL
+
+class TAO_Notify_Proxy;
+template <class TYPE> class TAO_Notify_Container_T;
+
+/**
+ * @class TAO_Notify_Admin
+ *
+ * @brief Base class for the ConsumerAdmin and SupplierAdmin.
+ *
+ */
+
+class TAO_Notify_Serv_Export TAO_Notify_Admin : public TAO_Notify::Topology_Parent
+{
+ friend class TAO_Notify_Builder;
+public:
+ typedef CosNotifyChannelAdmin::AdminIDSeq SEQ;
+ typedef CosNotifyChannelAdmin::AdminIDSeq_var SEQ_VAR;
+
+ /// Constuctor
+ TAO_Notify_Admin ();
+
+ /// Destructor
+ virtual ~TAO_Notify_Admin ();
+
+ /// Init
+ void init (TAO_Notify::Topology_Parent * parent ACE_ENV_ARG_DECL);
+
+ /// Insert the proxy in the <proxy_container_>.
+ void insert (TAO_Notify_Proxy* proxy ACE_ENV_ARG_DECL);
+
+ /// Remove type from container_
+ void remove (TAO_Notify_Proxy *proxy ACE_ENV_ARG_DECL);
+
+ /// Access Admin FilterAdmin.
+ TAO_Notify_FilterAdmin& filter_admin (void);
+
+ /// Set Filter operator
+ void filter_operator (
+ CosNotifyChannelAdmin::InterFilterGroupOperator filter_operator
+ );
+
+ /// Access Filter operator
+ CosNotifyChannelAdmin::InterFilterGroupOperator filter_operator (void);
+
+ /// Obtain the Admin's subscribed types.
+ void subscribed_types (TAO_Notify_EventTypeSeq& subscribed_types
+ ACE_ENV_ARG_DECL);
+
+ TAO_Notify_EventChannel * event_channel () const;
+ /// Shutdown
+ virtual int shutdown (ACE_ENV_SINGLE_ARG_DECL);
+
+ virtual void save_persistent (TAO_Notify::Topology_Saver& saver ACE_ENV_ARG_DECL);
+ virtual TAO_Notify::Topology_Object* load_child (const ACE_CString &type,
+ CORBA::Long id, const TAO_Notify::NVPList& attrs ACE_ENV_ARG_DECL);
+ virtual void reconnect (ACE_ENV_SINGLE_ARG_DECL);
+
+ void set_default (bool is_default);
+ bool is_default () const;
+ virtual void load_attrs(const TAO_Notify::NVPList& attrs);
+
+protected:
+ void save_attrs (TAO_Notify::NVPList& attrs);
+ virtual const char * get_admin_type_name (void) const = 0;
+
+ typedef TAO_Notify_Container_T<TAO_Notify_Proxy> TAO_Notify_Proxy_Container;
+
+ TAO_Notify_Proxy_Container& proxy_container();
+ /// = Data Members
+
+ /// The EventChannel.
+ TAO_Notify_EventChannel::Ptr ec_;
+
+
+ /// The types that we've subscribed our proxy objects with the event manager.
+ TAO_Notify_EventTypeSeq subscribed_types_;
+
+ /// Filter Administration
+ TAO_Notify_FilterAdmin filter_admin_;
+
+ /// Filter operator
+ CosNotifyChannelAdmin::InterFilterGroupOperator filter_operator_;
+
+ bool is_default_;
+private:
+ /// The Proxy Container.
+ ACE_Auto_Ptr< TAO_Notify_Proxy_Container > proxy_container_;
+};
+
+TAO_END_VERSIONED_NAMESPACE_DECL
+
+#if defined (__ACE_INLINE__)
+#include "orbsvcs/Notify/Admin.inl"
+#endif /* __ACE_INLINE__ */
+
+#include /**/ "ace/post.h"
+
+#endif /* TAO_Notify_ADMIN_H */
diff --git a/TAO/orbsvcs/orbsvcs/Notify/Admin.inl b/TAO/orbsvcs/orbsvcs/Notify/Admin.inl
new file mode 100644
index 00000000000..d7cb523081e
--- /dev/null
+++ b/TAO/orbsvcs/orbsvcs/Notify/Admin.inl
@@ -0,0 +1,54 @@
+// -*- C++ -*-
+//
+// $Id$
+
+TAO_BEGIN_VERSIONED_NAMESPACE_DECL
+
+ACE_INLINE
+TAO_Notify_EventChannel *
+TAO_Notify_Admin::event_channel () const
+{
+ return this->ec_.get();
+}
+
+
+ACE_INLINE TAO_Notify_FilterAdmin&
+TAO_Notify_Admin::filter_admin (void)
+{
+ return this->filter_admin_;
+}
+
+ACE_INLINE void
+TAO_Notify_Admin::filter_operator (CosNotifyChannelAdmin::InterFilterGroupOperator filter_operator)
+{
+ this->filter_operator_ = filter_operator;
+}
+
+ACE_INLINE CosNotifyChannelAdmin::InterFilterGroupOperator
+TAO_Notify_Admin::filter_operator (void)
+{
+ return this->filter_operator_;
+}
+
+ACE_INLINE
+void
+TAO_Notify_Admin::set_default (bool is_default)
+{
+ this->is_default_ = is_default;
+}
+
+ACE_INLINE
+bool
+TAO_Notify_Admin::is_default (void) const
+{
+ return this->is_default_;
+}
+
+ACE_INLINE TAO_Notify_Admin::TAO_Notify_Proxy_Container&
+TAO_Notify_Admin::proxy_container()
+{
+ ACE_ASSERT( proxy_container_.get() != 0 );
+ return *proxy_container_;
+}
+
+TAO_END_VERSIONED_NAMESPACE_DECL
diff --git a/TAO/orbsvcs/orbsvcs/Notify/AdminProperties.cpp b/TAO/orbsvcs/orbsvcs/Notify/AdminProperties.cpp
new file mode 100644
index 00000000000..37798f3088f
--- /dev/null
+++ b/TAO/orbsvcs/orbsvcs/Notify/AdminProperties.cpp
@@ -0,0 +1,94 @@
+// $Id$
+
+#include "orbsvcs/Notify/AdminProperties.h"
+
+#if ! defined (__ACE_INLINE__)
+#include "orbsvcs/Notify/AdminProperties.inl"
+#endif /* __ACE_INLINE__ */
+
+ACE_RCSID (Notify,
+ TAO_Notify_AdminProperties,
+ "$Id$")
+
+#include "orbsvcs/CosNotificationC.h"
+
+TAO_BEGIN_VERSIONED_NAMESPACE_DECL
+
+TAO_Notify_AdminProperties::TAO_Notify_AdminProperties (void)
+ : max_global_queue_length_ (CosNotification::MaxQueueLength, 0)
+ , max_consumers_ (CosNotification::MaxConsumers, 0)
+ , max_suppliers_ (CosNotification::MaxSuppliers, 0)
+ , reject_new_events_ (CosNotification::RejectNewEvents, 0)
+ , global_queue_length_ (0)
+ , global_queue_not_full_ (global_queue_lock_)
+{
+}
+
+TAO_Notify_AdminProperties::~TAO_Notify_AdminProperties ()
+{
+}
+
+int
+TAO_Notify_AdminProperties::init (const CosNotification::PropertySeq& prop_seq)
+{
+ if (TAO_Notify_PropertySeq::init (prop_seq) != 0)
+ return -1;
+
+ this->max_global_queue_length_.set (*this);
+ this->max_consumers_.set (*this);
+ this->max_suppliers_.set (*this);
+ this->reject_new_events_.set (*this);
+
+ //@@ check if unsupported property was set.
+ // This will happen when number of successfull inits != numbers of items bound in map_.
+
+ return 0;
+}
+
+void
+TAO_Notify_AdminProperties::init ()
+{
+ // This method should only be called once, (during topo load)
+ ACE_ASSERT(this->size() == 0);
+
+ if (this->max_global_queue_length_.is_valid())
+ {
+ CORBA::Any a;
+ a <<= this->max_global_queue_length_.value();
+ this->add(this->max_global_queue_length_.name(), a);
+ }
+ if (this->max_consumers_.is_valid())
+ {
+ CORBA::Any a;
+ a <<= this->max_consumers_.value();
+ this->add(this->max_consumers_.name(), a);
+ }
+ if (this->max_suppliers_.is_valid())
+ {
+ CORBA::Any a;
+ a <<= this->max_suppliers_.value();
+ this->add(this->max_suppliers_.name(), a);
+ }
+ if (this->reject_new_events_.is_valid())
+ {
+ CORBA::Any a;
+ a <<= CORBA::Any::from_boolean(this->reject_new_events_.value());
+ this->add(this->reject_new_events_.name(), a);
+ }
+}
+
+CORBA::Boolean
+TAO_Notify_AdminProperties::queue_full (void)
+{
+ ACE_GUARD_RETURN (TAO_SYNCH_MUTEX, ace_mon, this->global_queue_lock_, 1);
+
+ if (this->max_global_queue_length () == 0)
+ return 0;
+ else
+ if (this->global_queue_length_ >= this->max_global_queue_length ().value ())
+ return 1;
+
+ return 0;
+}
+
+TAO_END_VERSIONED_NAMESPACE_DECL
diff --git a/TAO/orbsvcs/orbsvcs/Notify/AdminProperties.h b/TAO/orbsvcs/orbsvcs/Notify/AdminProperties.h
new file mode 100644
index 00000000000..163e22dc13c
--- /dev/null
+++ b/TAO/orbsvcs/orbsvcs/Notify/AdminProperties.h
@@ -0,0 +1,133 @@
+/* -*- C++ -*- */
+/**
+ * @file AdminProperties.h
+ *
+ * $Id$
+ *
+ * @author Pradeep Gore <pradeep@oomworks.com>
+ *
+ *
+ */
+
+#ifndef TAO_Notify_ADMINPROPERTIES_H
+#define TAO_Notify_ADMINPROPERTIES_H
+
+#include /**/ "ace/pre.h"
+
+#include "orbsvcs/Notify/notify_serv_export.h"
+
+#if !defined (ACE_LACKS_PRAGMA_ONCE)
+# pragma once
+#endif /* ACE_LACKS_PRAGMA_ONCE */
+
+#include "orbsvcs/Notify/PropertySeq.h"
+#include "orbsvcs/Notify/Property_T.h"
+#include "orbsvcs/Notify/Property.h"
+#include "orbsvcs/Notify/Property_Boolean.h"
+
+#include "tao/orbconf.h"
+
+#include "ace/Atomic_Op.h"
+#include "ace/Bound_Ptr.h"
+#include "ace/Condition_Thread_Mutex.h"
+
+TAO_BEGIN_VERSIONED_NAMESPACE_DECL
+
+/**
+ * @class TAO_Notify_AdminProperties
+ *
+ * @brief The AdminProperties per EventChannel.
+ *
+ */
+class TAO_Notify_Serv_Export TAO_Notify_AdminProperties
+ : public TAO_Notify_PropertySeq
+{
+public:
+ typedef ACE_Strong_Bound_Ptr<TAO_Notify_AdminProperties, TAO_SYNCH_MUTEX> Ptr;
+ /// Constuctor
+ TAO_Notify_AdminProperties (void);
+
+ /// Destructor
+ virtual ~TAO_Notify_AdminProperties ();
+
+ // Init
+ int init (const CosNotification::PropertySeq& prop_seq);
+
+ // finish initialization after values are set by topology load
+ void init ();
+
+ // = Const Accessors
+ const TAO_Notify_Property_Long& max_global_queue_length (void) const;
+ const TAO_Notify_Property_Long& max_consumers (void) const;
+ const TAO_Notify_Property_Long& max_suppliers (void) const;
+ const TAO_Notify_Property_Boolean& reject_new_events (void) const;
+
+ // = Non-const accessors
+ TAO_Notify_Property_Long & max_global_queue_length (void);
+ TAO_Notify_Property_Long & max_consumers (void);
+ TAO_Notify_Property_Long & max_suppliers (void);
+ TAO_Notify_Property_Boolean & reject_new_events (void);
+
+ CORBA::Long& global_queue_length (void);
+ TAO_SYNCH_MUTEX& global_queue_lock (void);
+ TAO_SYNCH_CONDITION& global_queue_not_full (void);
+
+ TAO_Notify_Atomic_Property_Long& consumers (void);
+ TAO_Notify_Atomic_Property_Long& suppliers (void);
+
+ // = Helper method
+ /// Returns true if Queue is full
+ CORBA::Boolean queue_full (void);
+
+protected:
+ // @@ Pradeep can you explain why there is any maximum for these
+ // values? Should they be configurable by the user so the resource
+ // requirements can be bounded?
+
+ // = Admin. properties
+ // for all these properties the default O implies no limit
+ /**
+ * The maximum number of events that will be queued by the channel before
+ * the channel begins discarding events or rejecting new events upon
+ * receipt of each new event.
+ */
+ TAO_Notify_Property_Long max_global_queue_length_;
+
+ /// The maximum number of consumers that can be connected to the channel at
+ /// any given time.
+ TAO_Notify_Property_Long max_consumers_;
+
+ /// The maximum number of suppliers that can be connected to the channel at
+ /// any given time.
+ TAO_Notify_Property_Long max_suppliers_;
+
+ /// Reject any new event.
+ TAO_Notify_Property_Boolean reject_new_events_;
+
+ //= Variables
+ /// This is used to count the queue length across all buffers in the Notify Service
+ /// to enforce the "MaxQueueLength" property.
+ CORBA::Long global_queue_length_;
+
+ /// Global queue lock used to serialize access to all queues.
+ TAO_SYNCH_MUTEX global_queue_lock_;
+
+ /// The condition that the queue_length_ is not at max.
+ TAO_SYNCH_CONDITION global_queue_not_full_;
+
+ /// These are used to count the number of consumers and suppliers connected to
+ /// the system.
+ TAO_Notify_Atomic_Property_Long consumers_;
+ TAO_Notify_Atomic_Property_Long suppliers_;
+};
+
+
+TAO_END_VERSIONED_NAMESPACE_DECL
+
+#if defined (__ACE_INLINE__)
+#include "orbsvcs/Notify/AdminProperties.inl"
+#endif /* __ACE_INLINE__ */
+
+
+#include /**/ "ace/post.h"
+#endif /* TAO_Notify_ADMINPROPERTIES_H */
diff --git a/TAO/orbsvcs/orbsvcs/Notify/AdminProperties.inl b/TAO/orbsvcs/orbsvcs/Notify/AdminProperties.inl
new file mode 100644
index 00000000000..bc93ae89184
--- /dev/null
+++ b/TAO/orbsvcs/orbsvcs/Notify/AdminProperties.inl
@@ -0,0 +1,85 @@
+// -*- C++ -*-
+//
+// $Id$
+
+TAO_BEGIN_VERSIONED_NAMESPACE_DECL
+
+ACE_INLINE const TAO_Notify_Property_Long&
+TAO_Notify_AdminProperties::max_global_queue_length (void) const
+{
+ return this->max_global_queue_length_;
+}
+
+ACE_INLINE TAO_Notify_Property_Long&
+TAO_Notify_AdminProperties::max_global_queue_length (void)
+{
+ return this->max_global_queue_length_;
+}
+
+ACE_INLINE const TAO_Notify_Property_Long&
+TAO_Notify_AdminProperties::max_consumers (void) const
+{
+ return this->max_consumers_;
+}
+
+ACE_INLINE TAO_Notify_Property_Long&
+TAO_Notify_AdminProperties::max_consumers (void)
+{
+ return this->max_consumers_;
+}
+
+ACE_INLINE const TAO_Notify_Property_Long&
+TAO_Notify_AdminProperties::max_suppliers (void) const
+{
+ return this->max_suppliers_;
+}
+
+ACE_INLINE TAO_Notify_Property_Long&
+TAO_Notify_AdminProperties::max_suppliers (void)
+{
+ return this->max_suppliers_;
+}
+
+ACE_INLINE const TAO_Notify_Property_Boolean&
+TAO_Notify_AdminProperties::reject_new_events (void) const
+{
+ return this->reject_new_events_;
+}
+
+ACE_INLINE TAO_Notify_Property_Boolean&
+TAO_Notify_AdminProperties::reject_new_events (void)
+{
+ return this->reject_new_events_;
+}
+
+ACE_INLINE CORBA::Long&
+TAO_Notify_AdminProperties::global_queue_length (void)
+{
+ return this->global_queue_length_;
+}
+
+ACE_INLINE TAO_SYNCH_MUTEX&
+TAO_Notify_AdminProperties::global_queue_lock (void)
+{
+ return this->global_queue_lock_;
+}
+
+ACE_INLINE TAO_SYNCH_CONDITION&
+TAO_Notify_AdminProperties::global_queue_not_full(void)
+{
+ return this->global_queue_not_full_;
+}
+
+ACE_INLINE TAO_Notify_Atomic_Property_Long&
+TAO_Notify_AdminProperties::consumers (void)
+{
+ return this->consumers_;
+}
+
+ACE_INLINE TAO_Notify_Atomic_Property_Long&
+TAO_Notify_AdminProperties::suppliers (void)
+{
+ return this->suppliers_;
+}
+
+TAO_END_VERSIONED_NAMESPACE_DECL
diff --git a/TAO/orbsvcs/orbsvcs/Notify/AllocTracker.h b/TAO/orbsvcs/orbsvcs/Notify/AllocTracker.h
new file mode 100644
index 00000000000..e7b1b61ea8a
--- /dev/null
+++ b/TAO/orbsvcs/orbsvcs/Notify/AllocTracker.h
@@ -0,0 +1,81 @@
+// $Id$
+#ifndef ALLOC_TRACKER_H
+#define ALLOC_TRACKER_H
+#include /**/"ace/pre.h"
+
+#include "orbsvcs/Notify/notify_export.h"
+
+#if !defined (ACE_LACKS_PRAGMA_ONCE)
+# pragma once
+#endif /* ACE_LACKS_PRAGMA_ONCE */
+
+//#define DEBUG_MEMORY_USE
+#if defined(_MSC_VER) && defined (_DEBUG) && defined (DEBUG_MEMORY_USE)
+namespace CRT{
+
+/// \brief dump heap allocation stats
+///
+/// This works only on microsoft/windows compilers
+/// but it's handy to diagnose memory allocation problems.
+/// To use, add the following macro in the scope where you
+/// want to check memory usage.
+/// ACE_WIN32_HEAP_MONITOR(name);
+/// where name is a quoted string to label the stats.
+/// When the object created by this macro goes out of scope
+/// it will write a log message like:
+/// (10056|6396) name: New heap blocks: 39; bytes: 19550
+///
+/// For non-debug, or non-vc builds, the macro expands to nothing
+class CrtHeapDumper
+{
+public:
+ CrtHeapDumper(const char * name, bool verbose = false)
+ : name_ (name)
+ , verbose_ (verbose)
+ {
+ _CrtMemCheckpoint (&before_);
+ }
+
+ ~CrtHeapDumper()
+ {
+ dump();
+ }
+ void dump()
+ {
+ _CrtMemState after;
+ _CrtMemCheckpoint (&after);
+ _CrtMemState diff;
+ _CrtMemDifference (&diff, &before_, &after);
+
+ ACE_DEBUG ((LM_DEBUG,
+ ACE_TEXT ("(%P|%t) %s: New heap blocks: %d; bytes: %d\n"),
+ name_.c_str (),
+ static_cast<int> (diff.lCounts[_NORMAL_BLOCK]),
+ static_cast<int> (diff.lSizes[_NORMAL_BLOCK])
+ ));
+ if (this->verbose_)
+ {
+ _CrtSetReportMode( _CRT_WARN, _CRTDBG_MODE_FILE );
+ _CrtSetReportFile( _CRT_WARN, _CRTDBG_FILE_STDOUT );
+ _CrtSetReportMode( _CRT_ERROR, _CRTDBG_MODE_FILE );
+ _CrtSetReportFile( _CRT_ERROR, _CRTDBG_FILE_STDOUT );
+ _CrtSetReportMode( _CRT_ASSERT, _CRTDBG_MODE_FILE );
+ _CrtSetReportFile( _CRT_ASSERT, _CRTDBG_FILE_STDOUT );
+ _CrtMemDumpAllObjectsSince (&this->before_);
+ }
+ }
+
+private:
+ ACE_CString name_;
+ bool verbose_;
+ _CrtMemState before_;
+};
+} //namespace
+#define ACE_WIN32_HEAP_MONITOR(name) \
+ CRT::CrtHeapDumper heap_check___(name); \
+ ACE_UNUSED_ARG (heap_check___)
+#else // _MSC_VER etc
+ #define ACE_WIN32_HEAP_MONITOR(name)
+#endif // _MSC_VER etc
+#include /**/"ace/post.h"
+#endif // ALLOC_TRACKER_H
diff --git a/TAO/orbsvcs/orbsvcs/Notify/Any/AnyEvent.cpp b/TAO/orbsvcs/orbsvcs/Notify/Any/AnyEvent.cpp
new file mode 100644
index 00000000000..2c47a4225ef
--- /dev/null
+++ b/TAO/orbsvcs/orbsvcs/Notify/Any/AnyEvent.cpp
@@ -0,0 +1,140 @@
+// $Id$
+
+#include "orbsvcs/Notify/Any/AnyEvent.h"
+
+ACE_RCSID (Notify, TAO_Notify_AnyEvent, "$Id$")
+
+#include "orbsvcs/Notify/Consumer.h"
+
+#include "tao/corba.h"
+#include "tao/debug.h"
+
+//#define DEBUG_LEVEL 10
+#ifndef DEBUG_LEVEL
+# define DEBUG_LEVEL TAO_debug_level
+#endif //DEBUG_LEVEL
+
+TAO_BEGIN_VERSIONED_NAMESPACE_DECL
+
+TAO_Notify_EventType TAO_Notify_AnyEvent_No_Copy::event_type_;
+
+TAO_Notify_AnyEvent_No_Copy::TAO_Notify_AnyEvent_No_Copy (const CORBA::Any &event)
+ : event_ (&event)
+{
+}
+
+TAO_Notify_AnyEvent_No_Copy::~TAO_Notify_AnyEvent_No_Copy ()
+{
+}
+
+const TAO_Notify_EventType&
+TAO_Notify_AnyEvent_No_Copy::type (void) const
+{
+ return this->event_type_;
+}
+
+void
+TAO_Notify_AnyEvent_No_Copy::convert (CosNotification::StructuredEvent& notification) const
+{
+ TAO_Notify_Event::translate (*this->event_, notification);
+}
+
+CORBA::Boolean
+TAO_Notify_AnyEvent_No_Copy::do_match (CosNotifyFilter::Filter_ptr filter ACE_ENV_ARG_DECL) const
+{
+ if (DEBUG_LEVEL > 0)
+ ACE_DEBUG ((LM_DEBUG, "Notify (%P|%t) - "
+ "TAO_Notify_AnyEvent::do_match ()\n"));
+
+ return filter->match(*this->event_ ACE_ENV_ARG_PARAMETER);
+}
+
+void
+TAO_Notify_AnyEvent_No_Copy::push (TAO_Notify_Consumer* consumer ACE_ENV_ARG_DECL) const
+{
+ if (DEBUG_LEVEL > 0)
+ ACE_DEBUG ((LM_DEBUG, "Notify (%P|%t) - "
+ "TAO_Notify_AnyEvent::push \n"));
+
+ consumer->push (*this->event_ ACE_ENV_ARG_PARAMETER);
+}
+
+void
+TAO_Notify_AnyEvent_No_Copy::push (Event_Forwarder::StructuredProxyPushSupplier_ptr forwarder ACE_ENV_ARG_DECL) const
+{
+ CosNotification::StructuredEvent notification;
+
+ TAO_Notify_Event::translate (*this->event_, notification);
+
+ forwarder->forward_structured (notification ACE_ENV_ARG_PARAMETER);
+}
+
+void
+TAO_Notify_AnyEvent_No_Copy::push_no_filtering (Event_Forwarder::StructuredProxyPushSupplier_ptr forwarder ACE_ENV_ARG_DECL) const
+{
+ CosNotification::StructuredEvent notification;
+
+ TAO_Notify_Event::translate (*this->event_, notification);
+
+ forwarder->forward_structured_no_filtering (notification ACE_ENV_ARG_PARAMETER);
+}
+
+void
+TAO_Notify_AnyEvent_No_Copy::push (Event_Forwarder::ProxyPushSupplier_ptr forwarder ACE_ENV_ARG_DECL) const
+{
+ forwarder->forward_any (*this->event_ ACE_ENV_ARG_PARAMETER);
+}
+
+void
+TAO_Notify_AnyEvent_No_Copy::push_no_filtering (Event_Forwarder::ProxyPushSupplier_ptr forwarder ACE_ENV_ARG_DECL) const
+{
+ forwarder->forward_any_no_filtering (*this->event_ ACE_ENV_ARG_PARAMETER);
+}
+
+void
+TAO_Notify_AnyEvent_No_Copy::marshal (TAO_OutputCDR & cdr) const
+{
+ const ACE_CDR::Octet ANY_CODE = MARSHAL_ANY;
+ cdr.write_octet (ANY_CODE);
+ cdr << (*this->event_);
+}
+
+//static
+TAO_Notify_AnyEvent *
+TAO_Notify_AnyEvent_No_Copy::unmarshal (TAO_InputCDR & cdr)
+{
+ TAO_Notify_AnyEvent * event = 0;
+ CORBA::Any body;
+ if (cdr >> body)
+ {
+ event = new TAO_Notify_AnyEvent (body);
+ }
+ return event;
+}
+
+TAO_Notify_Event *
+TAO_Notify_AnyEvent_No_Copy::copy (ACE_ENV_SINGLE_ARG_DECL) const
+{
+ TAO_Notify_Event * new_event;
+ ACE_NEW_THROW_EX (new_event,
+ TAO_Notify_AnyEvent (*this->event_),
+ CORBA::NO_MEMORY ());
+ ACE_CHECK_RETURN (0);
+ return new_event;
+}
+
+
+/*****************************************************************************/
+
+TAO_Notify_AnyEvent::TAO_Notify_AnyEvent (const CORBA::Any &event)
+ : TAO_Notify_AnyEvent_No_Copy (event)
+ , any_copy_ (event)
+{
+ this->event_ = &any_copy_;
+}
+
+TAO_Notify_AnyEvent::~TAO_Notify_AnyEvent ()
+{
+}
+
+TAO_END_VERSIONED_NAMESPACE_DECL
diff --git a/TAO/orbsvcs/orbsvcs/Notify/Any/AnyEvent.h b/TAO/orbsvcs/orbsvcs/Notify/Any/AnyEvent.h
new file mode 100644
index 00000000000..49c5604065f
--- /dev/null
+++ b/TAO/orbsvcs/orbsvcs/Notify/Any/AnyEvent.h
@@ -0,0 +1,121 @@
+/* -*- C++ -*- */
+/**
+ * @file AnyEvent.h
+ *
+ * $Id$
+ *
+ * @author Pradeep Gore <pradeep@oomworks.com>
+ *
+ *
+ */
+
+#ifndef TAO_Notify_ANYEVENT_H
+#define TAO_Notify_ANYEVENT_H
+
+#include /**/ "ace/pre.h"
+
+#include "orbsvcs/Notify/notify_serv_export.h"
+
+#if !defined (ACE_LACKS_PRAGMA_ONCE)
+# pragma once
+#endif /* ACE_LACKS_PRAGMA_ONCE */
+
+#include "orbsvcs/Notify/Event.h"
+#include "orbsvcs/Notify/EventType.h"
+
+#include "orbsvcs/CosNotificationC.h"
+
+
+TAO_BEGIN_VERSIONED_NAMESPACE_DECL
+
+class TAO_Notify_Consumer;
+class TAO_Notify_AnyEvent;
+/**
+ * @class TAO_Notify_AnyEvent
+ *
+ * @brief
+ *
+ */
+class TAO_Notify_Serv_Export TAO_Notify_AnyEvent_No_Copy : public TAO_Notify_Event
+{
+ friend class TAO_Notify_Builder;
+public:
+ /// Constuctor
+ TAO_Notify_AnyEvent_No_Copy (const CORBA::Any &event);
+
+ /// Destructor
+ virtual ~TAO_Notify_AnyEvent_No_Copy ();
+
+ /// Get the event type.
+ virtual const TAO_Notify_EventType& type (void) const;
+
+ CORBA::Boolean do_match (CosNotifyFilter::Filter_ptr filter ACE_ENV_ARG_DECL) const;
+
+ /// Convert to CosNotification::Structured type
+ virtual void convert (CosNotification::StructuredEvent& notification) const;
+
+ /// Push event to consumer
+ virtual void push (TAO_Notify_Consumer* consumer ACE_ENV_ARG_DECL) const;
+
+ /// Push event to the Event_Forwarder interface
+ virtual void push (Event_Forwarder::StructuredProxyPushSupplier_ptr forwarder ACE_ENV_ARG_DECL) const;
+
+ /// Push event to the Event_Forwarder interface
+ virtual void push_no_filtering (Event_Forwarder::StructuredProxyPushSupplier_ptr forwarder ACE_ENV_ARG_DECL) const;
+
+ /// Push event to the Event_Forwarder interface
+ virtual void push (Event_Forwarder::ProxyPushSupplier_ptr forwarder ACE_ENV_ARG_DECL) const;
+
+ /// Push event to the Event_Forwarder interface
+ virtual void push_no_filtering (Event_Forwarder::ProxyPushSupplier_ptr forwarder ACE_ENV_ARG_DECL) const;
+
+ /// marshal this event into a CDR buffer (for persistence)
+ virtual void marshal (TAO_OutputCDR & cdr) const;
+
+ /// unmarshal this event from a CDR buffer (for persistence)
+ /// \param code a code indicating what type of event to create.
+ /// \param cdr a CDR stream containing the marshalled data for the event.
+ /// \return the new event, or NULL if this is the wrong type of event.
+ static TAO_Notify_AnyEvent * unmarshal (TAO_InputCDR & cdr);
+
+protected:
+ /// returns a copy of this event allocated from the heap
+ virtual TAO_Notify_Event * copy (ACE_ENV_SINGLE_ARG_DECL) const;
+
+protected:
+
+ // This must be a pointer rather than a reference, because the derived
+ // class needs to redirect it to a new copy
+ const CORBA::Any* event_;
+
+ /// Our event type.
+ static TAO_Notify_EventType event_type_;
+};
+
+/****************************************************************************/
+
+/**
+ * @class TAO_Notify_AnyEvent
+ *
+ * @brief AnyEvent implementation.
+ *
+ */
+class TAO_Notify_Serv_Export TAO_Notify_AnyEvent : public TAO_Notify_AnyEvent_No_Copy
+{
+public:
+ /// Constuctor
+ TAO_Notify_AnyEvent (const CORBA::Any &event);
+
+ /// Destructor
+ virtual ~TAO_Notify_AnyEvent ();
+
+protected:
+ /// Copy of the Event.
+ CORBA::Any any_copy_;
+};
+
+TAO_END_VERSIONED_NAMESPACE_DECL
+
+#include /**/ "ace/post.h"
+
+#endif /* TAO_Notify_ANYEVENT_H */
diff --git a/TAO/orbsvcs/orbsvcs/Notify/Any/CosEC_ProxyPushConsumer.cpp b/TAO/orbsvcs/orbsvcs/Notify/Any/CosEC_ProxyPushConsumer.cpp
new file mode 100644
index 00000000000..bcaef713001
--- /dev/null
+++ b/TAO/orbsvcs/orbsvcs/Notify/Any/CosEC_ProxyPushConsumer.cpp
@@ -0,0 +1,90 @@
+// $Id$
+
+#include "orbsvcs/Notify/Any/CosEC_ProxyPushConsumer.h"
+
+ACE_RCSID (Notify, TAO_Notify_CosEC_ProxyPushConsumer, "$Id$")
+
+#include "tao/debug.h"
+#include "orbsvcs/Notify/AdminProperties.h"
+#include "orbsvcs/Notify/Method_Request_Lookup.h"
+#include "orbsvcs/Notify/Worker_Task.h"
+#include "orbsvcs/Notify/Any/AnyEvent.h"
+#include "orbsvcs/Notify/Any/PushSupplier.h"
+
+TAO_BEGIN_VERSIONED_NAMESPACE_DECL
+
+TAO_Notify_CosEC_ProxyPushConsumer::TAO_Notify_CosEC_ProxyPushConsumer (void)
+{
+}
+
+TAO_Notify_CosEC_ProxyPushConsumer::~TAO_Notify_CosEC_ProxyPushConsumer ()
+{
+}
+
+void
+TAO_Notify_CosEC_ProxyPushConsumer::release (void)
+{
+ delete this;
+ //@@ inform factory
+}
+
+void
+TAO_Notify_CosEC_ProxyPushConsumer::push (const CORBA::Any& any ACE_ENV_ARG_DECL)
+ ACE_THROW_SPEC ((
+ CORBA::SystemException
+ , CosEventComm::Disconnected
+ ))
+{
+ // Check if we should proceed at all.
+ if (this->admin_properties().reject_new_events () == 1
+ && this->admin_properties().queue_full ())
+ ACE_THROW (CORBA::IMP_LIMIT ());
+
+ if (this->is_connected () == 0)
+ {
+ ACE_THROW (CosEventComm::Disconnected ());
+ }
+
+ TAO_Notify_AnyEvent_No_Copy event (any);
+
+ TAO_Notify_Method_Request_Lookup_No_Copy request (&event, this);
+
+ this->execute_task (request ACE_ENV_ARG_PARAMETER);
+}
+
+void
+TAO_Notify_CosEC_ProxyPushConsumer::connect_push_supplier (CosEventComm::PushSupplier_ptr push_supplier ACE_ENV_ARG_DECL)
+ ACE_THROW_SPEC ((
+ CORBA::SystemException
+ , CosEventChannelAdmin::AlreadyConnected
+ ))
+{
+ // Convert Supplier to Base Type
+ TAO_Notify_PushSupplier *supplier;
+ ACE_NEW_THROW_EX (supplier,
+ TAO_Notify_PushSupplier (this),
+ CORBA::NO_MEMORY ());
+
+ supplier->init (push_supplier ACE_ENV_ARG_PARAMETER);
+ ACE_CHECK;
+
+ this->connect (supplier ACE_ENV_ARG_PARAMETER);
+}
+
+void
+TAO_Notify_CosEC_ProxyPushConsumer::disconnect_push_consumer (ACE_ENV_SINGLE_ARG_DECL)
+ ACE_THROW_SPEC ((
+ CORBA::SystemException
+ ))
+{
+ TAO_Notify_CosEC_ProxyPushConsumer::Ptr guard( this );
+ this->destroy (ACE_ENV_SINGLE_ARG_PARAMETER);
+}
+
+const char *
+TAO_Notify_CosEC_ProxyPushConsumer::get_proxy_type_name (void) const
+{
+ return "ec_proxy_push_consumer";
+}
+
+TAO_END_VERSIONED_NAMESPACE_DECL
diff --git a/TAO/orbsvcs/orbsvcs/Notify/Any/CosEC_ProxyPushConsumer.h b/TAO/orbsvcs/orbsvcs/Notify/Any/CosEC_ProxyPushConsumer.h
new file mode 100644
index 00000000000..4690fc1fcdd
--- /dev/null
+++ b/TAO/orbsvcs/orbsvcs/Notify/Any/CosEC_ProxyPushConsumer.h
@@ -0,0 +1,86 @@
+/* -*- C++ -*- */
+/**
+ * @file CosEC_ProxyPushConsumer.h
+ *
+ * $Id$
+ *
+ * @author Pradeep Gore <pradeep@oomworks.com>
+ *
+ *
+ */
+
+#ifndef TAO_Notify_COSEC_PROXYPUSHCONSUMER_H
+#define TAO_Notify_COSEC_PROXYPUSHCONSUMER_H
+
+#include /**/ "ace/pre.h"
+
+#include "orbsvcs/Notify/notify_serv_export.h"
+
+#if !defined (ACE_LACKS_PRAGMA_ONCE)
+# pragma once
+#endif /* ACE_LACKS_PRAGMA_ONCE */
+
+#include "orbsvcs/CosEventChannelAdminS.h"
+
+#include "orbsvcs/Notify/ProxyConsumer_T.h"
+
+#if defined(_MSC_VER)
+#pragma warning(push)
+#pragma warning(disable:4250)
+#endif /* _MSC_VER */
+
+TAO_BEGIN_VERSIONED_NAMESPACE_DECL
+
+/**
+ * @class TAO_Notify_CosEC_ProxyPushConsumer
+ *
+ * @brief
+ *
+ */
+class TAO_Notify_Serv_Export TAO_Notify_CosEC_ProxyPushConsumer
+ : public virtual TAO_Notify_ProxyConsumer_T <POA_CosEventChannelAdmin::ProxyPushConsumer>
+{
+ friend class TAO_Notify_Builder;
+public:
+ /// Constuctor
+ TAO_Notify_CosEC_ProxyPushConsumer (void);
+
+ /// Destructor
+ virtual ~TAO_Notify_CosEC_ProxyPushConsumer ();
+
+
+ virtual const char * get_proxy_type_name (void) const;
+
+protected:
+ ///= CosNotifyChannelAdmin::ProxyPushConsumer methods
+
+ virtual void push (const CORBA::Any & data ACE_ENV_ARG_DECL)
+ ACE_THROW_SPEC ((
+ CORBA::SystemException,
+ CosEventComm::Disconnected
+ ));
+
+ virtual void connect_push_supplier (CosEventComm::PushSupplier_ptr push_supplier ACE_ENV_ARG_DECL)
+ ACE_THROW_SPEC ((
+ CORBA::SystemException,
+ CosEventChannelAdmin::AlreadyConnected
+ ));
+
+ virtual void disconnect_push_consumer (ACE_ENV_SINGLE_ARG_DECL)
+ ACE_THROW_SPEC ((
+ CORBA::SystemException
+ ));
+private:
+ /// Release
+ virtual void release (void);
+};
+
+TAO_END_VERSIONED_NAMESPACE_DECL
+
+#if defined(_MSC_VER)
+#pragma warning(pop)
+#endif /* _MSC_VER */
+
+#include /**/ "ace/post.h"
+
+#endif /* TAO_Notify_COSEC_PROXYPUSHCONSUMER_H */
diff --git a/TAO/orbsvcs/orbsvcs/Notify/Any/CosEC_ProxyPushSupplier.cpp b/TAO/orbsvcs/orbsvcs/Notify/Any/CosEC_ProxyPushSupplier.cpp
new file mode 100644
index 00000000000..694b6c378b5
--- /dev/null
+++ b/TAO/orbsvcs/orbsvcs/Notify/Any/CosEC_ProxyPushSupplier.cpp
@@ -0,0 +1,65 @@
+// $Id$
+
+#include "orbsvcs/Notify/Any/CosEC_ProxyPushSupplier.h"
+
+ACE_RCSID (Notify, TAO_Notify_CosEC_ProxyPushSupplier, "$Id$")
+
+#include "tao/debug.h"
+#include "orbsvcs/Notify/Any/PushConsumer.h"
+
+TAO_BEGIN_VERSIONED_NAMESPACE_DECL
+
+TAO_Notify_CosEC_ProxyPushSupplier::TAO_Notify_CosEC_ProxyPushSupplier (void)
+{
+}
+
+TAO_Notify_CosEC_ProxyPushSupplier::~TAO_Notify_CosEC_ProxyPushSupplier ()
+{
+}
+
+void
+TAO_Notify_CosEC_ProxyPushSupplier::release (void)
+{
+
+ delete this;
+ //@@ inform factory
+}
+
+void
+TAO_Notify_CosEC_ProxyPushSupplier::connect_push_consumer (CosEventComm::PushConsumer_ptr push_consumer
+ ACE_ENV_ARG_DECL)
+ ACE_THROW_SPEC ((
+ CORBA::SystemException,
+ CosEventChannelAdmin::AlreadyConnected,
+ CosEventChannelAdmin::TypeError
+ ))
+{
+ // Convert Consumer to Base Type
+ TAO_Notify_PushConsumer* consumer;
+ ACE_NEW_THROW_EX (consumer,
+ TAO_Notify_PushConsumer (this),
+ CORBA::NO_MEMORY ());
+
+ consumer->init (push_consumer ACE_ENV_ARG_PARAMETER);
+ ACE_CHECK;
+
+ this->connect (consumer ACE_ENV_ARG_PARAMETER);
+}
+
+void
+TAO_Notify_CosEC_ProxyPushSupplier::disconnect_push_supplier (ACE_ENV_SINGLE_ARG_DECL)
+ ACE_THROW_SPEC ((
+ CORBA::SystemException
+ ))
+{
+ TAO_Notify_CosEC_ProxyPushSupplier::Ptr guard( this );
+ this->destroy (ACE_ENV_SINGLE_ARG_PARAMETER);
+}
+
+const char *
+TAO_Notify_CosEC_ProxyPushSupplier::get_proxy_type_name (void) const
+{
+ return "ec_proxy_push_supplier";
+}
+
+TAO_END_VERSIONED_NAMESPACE_DECL
diff --git a/TAO/orbsvcs/orbsvcs/Notify/Any/CosEC_ProxyPushSupplier.h b/TAO/orbsvcs/orbsvcs/Notify/Any/CosEC_ProxyPushSupplier.h
new file mode 100644
index 00000000000..0858c51475e
--- /dev/null
+++ b/TAO/orbsvcs/orbsvcs/Notify/Any/CosEC_ProxyPushSupplier.h
@@ -0,0 +1,89 @@
+/* -*- C++ -*- */
+/**
+ * @file CosEC_ProxyPushSupplier.h
+ *
+ * $Id$
+ *
+ * @author Pradeep Gore <pradeep@oomworks.com>
+ *
+ *
+ */
+
+#ifndef TAO_Notify_COSEC_PROXYPUSHSUPPLIER_H
+#define TAO_Notify_COSEC_PROXYPUSHSUPPLIER_H
+
+#include /**/ "ace/pre.h"
+
+#include "orbsvcs/Notify/notify_serv_export.h"
+
+#if !defined (ACE_LACKS_PRAGMA_ONCE)
+# pragma once
+#endif /* ACE_LACKS_PRAGMA_ONCE */
+
+#include "orbsvcs/CosEventChannelAdminS.h"
+
+#include "orbsvcs/Notify/ProxySupplier_T.h"
+
+#if defined(_MSC_VER)
+#pragma warning(push)
+#pragma warning(disable:4250)
+#endif /* _MSC_VER */
+
+TAO_BEGIN_VERSIONED_NAMESPACE_DECL
+
+#if defined ACE_HAS_EXPLICIT_TEMPLATE_INSTANTIATION_EXPORT
+template class TAO_Notify_Serv_Export
+TAO_Notify_ProxySupplier_T<POA_CosEventChannelAdmin::ProxyPushSupplier>;
+#endif /* ACE_HAS_EXPLICIT_TEMPLATE_INSTANTIATION_EXPORT */
+
+/**
+ * @class TAO_Notify_CosEC_ProxyPushSupplier
+ *
+ * @brief
+ *
+ */
+class TAO_Notify_Serv_Export TAO_Notify_CosEC_ProxyPushSupplier
+ : public virtual TAO_Notify_ProxySupplier_T <POA_CosEventChannelAdmin::ProxyPushSupplier>
+{
+ friend class TAO_Notify_Builder;
+public:
+ /// Constuctor
+ TAO_Notify_CosEC_ProxyPushSupplier (void);
+
+ /// Destructor
+ virtual ~TAO_Notify_CosEC_ProxyPushSupplier ();
+
+ virtual const char * get_proxy_type_name (void) const;
+
+ // = Interface methods
+ virtual void connect_push_consumer (
+ CosEventComm::PushConsumer_ptr push_consumer
+ ACE_ENV_ARG_DECL
+ )
+ ACE_THROW_SPEC ((
+ CORBA::SystemException,
+ CosEventChannelAdmin::AlreadyConnected,
+ CosEventChannelAdmin::TypeError
+ ));
+
+ virtual void disconnect_push_supplier (
+ ACE_ENV_SINGLE_ARG_DECL
+ )
+ ACE_THROW_SPEC ((
+ CORBA::SystemException
+ ));
+
+private:
+ /// Release
+ virtual void release (void);
+};
+
+TAO_END_VERSIONED_NAMESPACE_DECL
+
+#if defined(_MSC_VER)
+#pragma warning(pop)
+#endif /* _MSC_VER */
+
+#include /**/ "ace/post.h"
+
+#endif /* TAO_Notify_COSEC_PROXYPUSHSUPPLIER_H */
diff --git a/TAO/orbsvcs/orbsvcs/Notify/Any/ProxyPushConsumer.cpp b/TAO/orbsvcs/orbsvcs/Notify/Any/ProxyPushConsumer.cpp
new file mode 100644
index 00000000000..2ae0cda9608
--- /dev/null
+++ b/TAO/orbsvcs/orbsvcs/Notify/Any/ProxyPushConsumer.cpp
@@ -0,0 +1,134 @@
+// $Id$
+
+#include "orbsvcs/Notify/Any/ProxyPushConsumer.h"
+
+ACE_RCSID (Notify, TAO_Notify_ProxyPushConsumer, "$Id$")
+
+#include "tao/debug.h"
+#include "orbsvcs/Notify/AdminProperties.h"
+#include "orbsvcs/Notify/Properties.h"
+#include "orbsvcs/Notify/Any/AnyEvent.h"
+#include "orbsvcs/Notify/Any/PushSupplier.h"
+
+TAO_BEGIN_VERSIONED_NAMESPACE_DECL
+
+TAO_Notify_ProxyPushConsumer::TAO_Notify_ProxyPushConsumer (void)
+{
+}
+
+TAO_Notify_ProxyPushConsumer::~TAO_Notify_ProxyPushConsumer ()
+{
+}
+
+void
+TAO_Notify_ProxyPushConsumer::release (void)
+{
+ delete this;
+ //@@ inform factory
+}
+
+CosNotifyChannelAdmin::ProxyType
+TAO_Notify_ProxyPushConsumer::MyType (ACE_ENV_SINGLE_ARG_DECL_NOT_USED)
+ ACE_THROW_SPEC ((
+ CORBA::SystemException
+ ))
+{
+ return CosNotifyChannelAdmin::PUSH_ANY;
+}
+
+void
+TAO_Notify_ProxyPushConsumer::push (const CORBA::Any& any ACE_ENV_ARG_DECL)
+ ACE_THROW_SPEC ((
+ CORBA::SystemException
+ , CosEventComm::Disconnected
+ ))
+{
+ // Check if we should proceed at all.
+ if (this->admin_properties().reject_new_events () == 1
+ && this->admin_properties().queue_full ())
+ ACE_THROW (CORBA::IMP_LIMIT ());
+
+ if (this->is_connected () == 0)
+ {
+ ACE_THROW (CosEventComm::Disconnected ());
+ }
+
+ TAO_Notify_AnyEvent_No_Copy event (any);
+ this->push_i (&event ACE_ENV_ARG_PARAMETER);
+}
+
+void
+TAO_Notify_ProxyPushConsumer::connect_any_push_supplier (CosEventComm::PushSupplier_ptr push_supplier ACE_ENV_ARG_DECL)
+ ACE_THROW_SPEC ((
+ CORBA::SystemException
+ , CosEventChannelAdmin::AlreadyConnected
+ ))
+{
+ // Convert Supplier to Base Type
+ TAO_Notify_PushSupplier *supplier;
+ ACE_NEW_THROW_EX (supplier,
+ TAO_Notify_PushSupplier (this),
+ CORBA::NO_MEMORY ());
+
+ supplier->init (push_supplier ACE_ENV_ARG_PARAMETER);
+ ACE_CHECK;
+
+ this->connect (supplier ACE_ENV_ARG_PARAMETER);
+ ACE_CHECK;
+ this->self_change (ACE_ENV_SINGLE_ARG_PARAMETER);
+}
+
+void TAO_Notify_ProxyPushConsumer::disconnect_push_consumer (ACE_ENV_SINGLE_ARG_DECL)
+ ACE_THROW_SPEC ((
+ CORBA::SystemException
+ ))
+{
+ TAO_Notify_ProxyPushConsumer::Ptr guard( this );
+ this->destroy (ACE_ENV_SINGLE_ARG_PARAMETER);
+ ACE_CHECK;
+ this->self_change (ACE_ENV_SINGLE_ARG_PARAMETER);
+}
+
+const char *
+TAO_Notify_ProxyPushConsumer::get_proxy_type_name (void) const
+{
+ return "proxy_push_consumer";
+}
+
+void
+TAO_Notify_ProxyPushConsumer::load_attrs (const TAO_Notify::NVPList& attrs)
+{
+ SuperClass::load_attrs(attrs);
+ ACE_CString ior;
+ if (attrs.load("PeerIOR", ior))
+ {
+ CORBA::ORB_var orb = TAO_Notify_PROPERTIES::instance()->orb();
+ ACE_DECLARE_NEW_CORBA_ENV;
+ ACE_TRY
+ {
+ ACE_TRY_CHECK;
+ CosNotifyComm::PushSupplier_var ps = CosNotifyComm::PushSupplier::_nil();
+ if ( ior.length() > 0 )
+ {
+ CORBA::Object_var obj =
+ orb->string_to_object(ior.c_str() ACE_ENV_ARG_PARAMETER);
+ ACE_TRY_CHECK;
+ ps = CosNotifyComm::PushSupplier::_unchecked_narrow(obj.in() ACE_ENV_ARG_PARAMETER);
+ ACE_TRY_CHECK;
+ }
+ // minor hack: suppress generating subscription updates during reload.
+ bool save_updates = this->updates_off_;
+ this->updates_off_ = true;
+ this->connect_any_push_supplier(ps.in() ACE_ENV_ARG_PARAMETER);
+ ACE_TRY_CHECK;
+ this->updates_off_ = save_updates;
+ }
+ ACE_CATCHALL
+ {
+ ACE_ASSERT(0);
+ }
+ ACE_ENDTRY;
+ }
+}
+
+TAO_END_VERSIONED_NAMESPACE_DECL
diff --git a/TAO/orbsvcs/orbsvcs/Notify/Any/ProxyPushConsumer.h b/TAO/orbsvcs/orbsvcs/Notify/Any/ProxyPushConsumer.h
new file mode 100644
index 00000000000..5d7bb8b4b8e
--- /dev/null
+++ b/TAO/orbsvcs/orbsvcs/Notify/Any/ProxyPushConsumer.h
@@ -0,0 +1,96 @@
+/* -*- C++ -*- */
+/**
+ * @file ProxyPushConsumer.h
+ *
+ * $Id$
+ *
+ * @author Pradeep Gore <pradeep@oomworks.com>
+ *
+ *
+ */
+
+#ifndef TAO_Notify_PROXYPUSHCONSUMER_H
+#define TAO_Notify_PROXYPUSHCONSUMER_H
+
+#include /**/ "ace/pre.h"
+
+#include "orbsvcs/Notify/notify_serv_export.h"
+
+#if !defined (ACE_LACKS_PRAGMA_ONCE)
+# pragma once
+#endif /* ACE_LACKS_PRAGMA_ONCE */
+
+#include "orbsvcs/CosNotifyChannelAdminS.h"
+#include "orbsvcs/Notify/ProxyConsumer_T.h"
+
+#if defined(_MSC_VER)
+#pragma warning(push)
+#pragma warning(disable:4250)
+#endif /* _MSC_VER */
+
+TAO_BEGIN_VERSIONED_NAMESPACE_DECL
+
+/**
+ * @class TAO_Notify_ProxyPushConsumer
+ *
+ * @brief
+ *
+ */
+class TAO_Notify_Serv_Export TAO_Notify_ProxyPushConsumer
+ : public virtual TAO_Notify_ProxyConsumer_T <
+ POA_CosNotifyChannelAdmin::ProxyPushConsumer
+ >
+{
+ typedef TAO_Notify_ProxyConsumer_T <POA_CosNotifyChannelAdmin::ProxyPushConsumer> SuperClass;
+ friend class TAO_Notify_Builder;
+public:
+ /// Constuctor
+ TAO_Notify_ProxyPushConsumer (void);
+
+ /// Destructor
+ virtual ~TAO_Notify_ProxyPushConsumer ();
+
+
+// virtual void save_persistent (TAO_Notify::Topology_Saver& saver ACE_ENV_ARG_DECL);
+ virtual const char * get_proxy_type_name (void) const;
+
+ virtual void load_attrs (const TAO_Notify::NVPList& attrs);
+
+protected:
+ ///= CosNotifyChannelAdmin::ProxyPushConsumer methods
+
+ virtual CosNotifyChannelAdmin::ProxyType MyType (ACE_ENV_SINGLE_ARG_DECL)
+ ACE_THROW_SPEC ((
+ CORBA::SystemException
+ ));
+
+ virtual void push (const CORBA::Any & data ACE_ENV_ARG_DECL)
+ ACE_THROW_SPEC ((
+ CORBA::SystemException,
+ CosEventComm::Disconnected
+ ));
+
+ virtual void connect_any_push_supplier (CosEventComm::PushSupplier_ptr push_supplier ACE_ENV_ARG_DECL)
+ ACE_THROW_SPEC ((
+ CORBA::SystemException,
+ CosEventChannelAdmin::AlreadyConnected
+ ));
+
+ virtual void disconnect_push_consumer (ACE_ENV_SINGLE_ARG_DECL)
+ ACE_THROW_SPEC ((
+ CORBA::SystemException
+ ));
+
+private:
+ /// Release
+ virtual void release (void);
+};
+
+TAO_END_VERSIONED_NAMESPACE_DECL
+
+#if defined(_MSC_VER)
+#pragma warning(pop)
+#endif /* _MSC_VER */
+
+#include /**/ "ace/post.h"
+#endif /* TAO_Notify_PROXYPUSHCONSUMER_H */
diff --git a/TAO/orbsvcs/orbsvcs/Notify/Any/ProxyPushSupplier.cpp b/TAO/orbsvcs/orbsvcs/Notify/Any/ProxyPushSupplier.cpp
new file mode 100644
index 00000000000..d478b3253cc
--- /dev/null
+++ b/TAO/orbsvcs/orbsvcs/Notify/Any/ProxyPushSupplier.cpp
@@ -0,0 +1,110 @@
+// $Id$
+
+#include "orbsvcs/Notify/Any/ProxyPushSupplier.h"
+
+ACE_RCSID (Notify, TAO_Notify_ProxyPushSupplier, "$Id$")
+
+#include "tao/debug.h"
+#include "orbsvcs/Notify/Any/PushConsumer.h"
+#include "orbsvcs/Notify/Properties.h"
+
+TAO_BEGIN_VERSIONED_NAMESPACE_DECL
+
+TAO_Notify_ProxyPushSupplier::TAO_Notify_ProxyPushSupplier (void)
+{
+}
+
+TAO_Notify_ProxyPushSupplier::~TAO_Notify_ProxyPushSupplier ()
+{
+}
+
+void
+TAO_Notify_ProxyPushSupplier::release (void)
+{
+ delete this;
+ //@@ inform factory
+}
+
+void
+TAO_Notify_ProxyPushSupplier::connect_any_push_consumer (CosEventComm::PushConsumer_ptr push_consumer
+ ACE_ENV_ARG_DECL)
+ ACE_THROW_SPEC ((
+ CORBA::SystemException,
+ CosEventChannelAdmin::AlreadyConnected,
+ CosEventChannelAdmin::TypeError
+ ))
+{
+ // Convert Consumer to Base Type
+ TAO_Notify_PushConsumer* consumer;
+ ACE_NEW_THROW_EX (consumer,
+ TAO_Notify_PushConsumer (this),
+ CORBA::NO_MEMORY ());
+
+ consumer->init (push_consumer ACE_ENV_ARG_PARAMETER);
+ ACE_CHECK;
+
+ this->connect (consumer ACE_ENV_ARG_PARAMETER);
+ ACE_CHECK;
+ this->self_change (ACE_ENV_SINGLE_ARG_PARAMETER);
+}
+
+void
+TAO_Notify_ProxyPushSupplier::disconnect_push_supplier (ACE_ENV_SINGLE_ARG_DECL)
+ ACE_THROW_SPEC ((
+ CORBA::SystemException
+ ))
+{
+ TAO_Notify_ProxyPushSupplier::Ptr guard( this );
+ this->destroy (ACE_ENV_SINGLE_ARG_PARAMETER);
+ ACE_CHECK;
+ this->self_change (ACE_ENV_SINGLE_ARG_PARAMETER);
+}
+
+CosNotifyChannelAdmin::ProxyType
+TAO_Notify_ProxyPushSupplier::MyType (ACE_ENV_SINGLE_ARG_DECL_NOT_USED)
+ ACE_THROW_SPEC ((
+ CORBA::SystemException
+ ))
+{
+ return CosNotifyChannelAdmin::PUSH_ANY;
+}
+
+const char *
+TAO_Notify_ProxyPushSupplier::get_proxy_type_name (void) const
+{
+ return "proxy_push_supplier";
+}
+
+void
+TAO_Notify_ProxyPushSupplier::load_attrs (const TAO_Notify::NVPList& attrs)
+{
+ SuperClass::load_attrs(attrs);
+ ACE_CString ior;
+ if (attrs.load("PeerIOR", ior))
+ {
+ CORBA::ORB_var orb = TAO_Notify_PROPERTIES::instance()->orb();
+ ACE_DECLARE_NEW_CORBA_ENV;
+ ACE_TRY
+ {
+ CosNotifyComm::PushConsumer_var pc =
+ CosNotifyComm::PushConsumer::_nil();
+ if (ior.length() > 0)
+ {
+ CORBA::Object_var obj =
+ orb->string_to_object(ior.c_str() ACE_ENV_ARG_PARAMETER);
+ ACE_TRY_CHECK;
+ pc = CosNotifyComm::PushConsumer::_unchecked_narrow(obj.in() ACE_ENV_ARG_PARAMETER);
+ ACE_TRY_CHECK;
+ }
+ this->connect_any_push_consumer(pc.in() ACE_ENV_ARG_PARAMETER);
+ ACE_TRY_CHECK;
+ }
+ ACE_CATCHANY
+ {
+ // if we can't reconnect, tough...
+ }
+ ACE_ENDTRY;
+ }
+}
+
+TAO_END_VERSIONED_NAMESPACE_DECL
diff --git a/TAO/orbsvcs/orbsvcs/Notify/Any/ProxyPushSupplier.h b/TAO/orbsvcs/orbsvcs/Notify/Any/ProxyPushSupplier.h
new file mode 100644
index 00000000000..e9450202c1c
--- /dev/null
+++ b/TAO/orbsvcs/orbsvcs/Notify/Any/ProxyPushSupplier.h
@@ -0,0 +1,98 @@
+/* -*- C++ -*- */
+/**
+ * @file ProxyPushSupplier.h
+ *
+ * $Id$
+ *
+ * @author Pradeep Gore <pradeep@oomworks.com>
+ *
+ *
+ */
+
+#ifndef TAO_Notify_PROXYPUSHSUPPLIER_H
+#define TAO_Notify_PROXYPUSHSUPPLIER_H
+
+#include /**/ "ace/pre.h"
+
+#include "orbsvcs/Notify/notify_serv_export.h"
+
+#if !defined (ACE_LACKS_PRAGMA_ONCE)
+# pragma once
+#endif /* ACE_LACKS_PRAGMA_ONCE */
+
+#include "orbsvcs/CosNotifyChannelAdminS.h"
+#include "orbsvcs/Event_ForwarderS.h"
+
+#include "orbsvcs/Notify/ProxySupplier_T.h"
+
+#if defined(_MSC_VER)
+#pragma warning(push)
+#pragma warning(disable:4250)
+#endif /* _MSC_VER */
+
+TAO_BEGIN_VERSIONED_NAMESPACE_DECL
+
+#if defined ACE_HAS_EXPLICIT_TEMPLATE_INSTANTIATION_EXPORT
+template class TAO_Notify_Serv_Export
+TAO_Notify_ProxySupplier_T<POA_Event_Forwarder::ProxyPushSupplier>;
+#endif /* ACE_HAS_EXPLICIT_TEMPLATE_INSTANTIATION_EXPORT */
+
+/**
+ * @class TAO_Notify_ProxyPushSupplier
+ *
+ * @brief
+ *
+ */
+class TAO_Notify_Serv_Export TAO_Notify_ProxyPushSupplier
+ : public virtual TAO_Notify_ProxySupplier_T <POA_Event_Forwarder::ProxyPushSupplier>
+{
+ typedef TAO_Notify_ProxySupplier_T <POA_Event_Forwarder::ProxyPushSupplier> SuperClass;
+ friend class TAO_Notify_Builder;
+public:
+ /// Constuctor
+ TAO_Notify_ProxyPushSupplier (void);
+
+ /// Destructor
+ virtual ~TAO_Notify_ProxyPushSupplier ();
+
+ virtual const char * get_proxy_type_name (void) const;
+
+ virtual void load_attrs (const TAO_Notify::NVPList& attrs);
+
+ // = Interface methods
+ virtual CosNotifyChannelAdmin::ProxyType MyType (ACE_ENV_SINGLE_ARG_DECL)
+ ACE_THROW_SPEC ((
+ CORBA::SystemException
+ ));
+
+ virtual void connect_any_push_consumer (
+ CosEventComm::PushConsumer_ptr push_consumer
+ ACE_ENV_ARG_DECL
+ )
+ ACE_THROW_SPEC ((
+ CORBA::SystemException,
+ CosEventChannelAdmin::AlreadyConnected,
+ CosEventChannelAdmin::TypeError
+ ));
+
+ virtual void disconnect_push_supplier (
+ ACE_ENV_SINGLE_ARG_DECL
+ )
+ ACE_THROW_SPEC ((
+ CORBA::SystemException
+ ));
+
+private:
+ /// TAO_Notify_Destroy_Callback methods
+ virtual void release (void);
+};
+
+TAO_END_VERSIONED_NAMESPACE_DECL
+
+#if defined(_MSC_VER)
+#pragma warning(pop)
+#endif /* _MSC_VER */
+
+#include /**/ "ace/post.h"
+
+#endif /* TAO_Notify_PROXYPUSHSUPPLIER_H */
diff --git a/TAO/orbsvcs/orbsvcs/Notify/Any/PushConsumer.cpp b/TAO/orbsvcs/orbsvcs/Notify/Any/PushConsumer.cpp
new file mode 100644
index 00000000000..8048c1dcaa5
--- /dev/null
+++ b/TAO/orbsvcs/orbsvcs/Notify/Any/PushConsumer.cpp
@@ -0,0 +1,118 @@
+// $Id$
+
+#include "orbsvcs/Notify/Any/PushConsumer.h"
+
+ACE_RCSID (Notify,
+ TAO_Notify_PushConsumer,
+ "$Id$")
+
+#include "ace/Bound_Ptr.h"
+#include "orbsvcs/CosEventCommC.h"
+#include "orbsvcs/Notify/Event.h"
+#include "orbsvcs/Notify/Properties.h"
+
+TAO_BEGIN_VERSIONED_NAMESPACE_DECL
+
+TAO_Notify_PushConsumer::TAO_Notify_PushConsumer (TAO_Notify_ProxySupplier* proxy)
+ :TAO_Notify_Consumer (proxy)
+{
+}
+
+TAO_Notify_PushConsumer::~TAO_Notify_PushConsumer ()
+{
+}
+
+void
+TAO_Notify_PushConsumer::init (CosEventComm::PushConsumer_ptr push_consumer
+ ACE_ENV_ARG_DECL)
+{
+ // Initialize only once
+ ACE_ASSERT( CORBA::is_nil (this->push_consumer_.in()) );
+
+ // push_consumer not optional
+ if (CORBA::is_nil (push_consumer))
+ {
+ ACE_THROW (CORBA::BAD_PARAM());
+ }
+
+ this->push_consumer_ = CosEventComm::PushConsumer::_duplicate (push_consumer);
+
+ ACE_TRY
+ {
+ this->publish_ =
+ CosNotifyComm::NotifyPublish::_narrow (push_consumer
+ ACE_ENV_ARG_PARAMETER);
+ ACE_TRY_CHECK;
+ }
+ ACE_CATCHANY
+ {
+ // _narrow failed which probably means the interface is CosEventComm type.
+ }
+ ACE_ENDTRY;
+}
+
+void
+TAO_Notify_PushConsumer::release (void)
+{
+ delete this;
+ //@@ inform factory
+}
+
+void
+TAO_Notify_PushConsumer::push (const CORBA::Any& payload ACE_ENV_ARG_DECL)
+{
+ this->push_consumer_->push (payload ACE_ENV_ARG_PARAMETER);
+}
+
+void
+TAO_Notify_PushConsumer::push (const CosNotification::StructuredEvent& event ACE_ENV_ARG_DECL)
+{
+ CORBA::Any any;
+
+ TAO_Notify_Event::translate (event, any);
+
+ this->push_consumer_->push (any ACE_ENV_ARG_PARAMETER);
+}
+
+/// Push a batch of events to this consumer.
+void
+TAO_Notify_PushConsumer::push (const CosNotification::EventBatch& event ACE_ENV_ARG_DECL_NOT_USED)
+{
+ ACE_ASSERT(false);
+ ACE_UNUSED_ARG (event);
+ // TODO exception?
+}
+
+ACE_CString
+TAO_Notify_PushConsumer::get_ior (void) const
+{
+ ACE_CString result;
+ CORBA::ORB_var orb = TAO_Notify_PROPERTIES::instance()->orb();
+ ACE_DECLARE_NEW_CORBA_ENV;
+ ACE_TRY
+ {
+ CORBA::String_var ior = orb->object_to_string(this->push_consumer_.in() ACE_ENV_ARG_PARAMETER);
+ ACE_TRY_CHECK;
+ result = static_cast<const char*> (ior.in ());
+ }
+ ACE_CATCHANY
+ {
+ result.fast_clear();
+ }
+ ACE_ENDTRY;
+ return result;
+}
+
+void
+TAO_Notify_PushConsumer::reconnect_from_consumer (TAO_Notify_Consumer* old_consumer
+ ACE_ENV_ARG_DECL)
+{
+ TAO_Notify_PushConsumer* tmp =
+ dynamic_cast<TAO_Notify_PushConsumer*> (old_consumer);
+ ACE_ASSERT(tmp != 0);
+ this->init(tmp->push_consumer_.in() ACE_ENV_ARG_PARAMETER);
+ ACE_CHECK;
+ this->schedule_timer(false);
+}
+
+TAO_END_VERSIONED_NAMESPACE_DECL
diff --git a/TAO/orbsvcs/orbsvcs/Notify/Any/PushConsumer.h b/TAO/orbsvcs/orbsvcs/Notify/Any/PushConsumer.h
new file mode 100644
index 00000000000..b6d8a5827e2
--- /dev/null
+++ b/TAO/orbsvcs/orbsvcs/Notify/Any/PushConsumer.h
@@ -0,0 +1,78 @@
+/* -*- C++ -*- */
+/**
+ * @file PushConsumer.h
+ *
+ * $Id$
+ *
+ * @author Pradeep Gore <pradeep@oomworks.com>
+ *
+ *
+ */
+
+#ifndef TAO_Notify_PUSHCONSUMER_H
+#define TAO_Notify_PUSHCONSUMER_H
+#include /**/ "ace/pre.h"
+
+#include "orbsvcs/Notify/notify_serv_export.h"
+
+#if !defined (ACE_LACKS_PRAGMA_ONCE)
+# pragma once
+#endif /* ACE_LACKS_PRAGMA_ONCE */
+
+#include "orbsvcs/CosNotifyCommC.h"
+#include "orbsvcs/Notify/Consumer.h"
+
+TAO_BEGIN_VERSIONED_NAMESPACE_DECL
+
+/**
+ * @class TAO_Notify_PushConsumer
+ *
+ * @brief Wrapper for the PushConsumer that connect to the EventChannel.
+ *
+ */
+class TAO_Notify_Serv_Export TAO_Notify_PushConsumer : public TAO_Notify_Consumer
+{
+public:
+ /// Constuctor
+ TAO_Notify_PushConsumer (TAO_Notify_ProxySupplier* proxy);
+
+ /// Destructor
+ virtual ~TAO_Notify_PushConsumer ();
+
+ /// Init
+ void init (CosEventComm::PushConsumer_ptr push_consumer ACE_ENV_ARG_DECL);
+
+ /// Push <event> to this consumer.
+// virtual void push_i (const TAO_Notify_Event* event ACE_ENV_ARG_DECL);
+
+ /// Push <event> to this consumer.
+ virtual void push (const CORBA::Any& event ACE_ENV_ARG_DECL);
+
+ /// Push <event> to this consumer.
+ virtual void push (const CosNotification::StructuredEvent& event ACE_ENV_ARG_DECL);
+
+ /// Push a batch of events to this consumer.
+ virtual void push (const CosNotification::EventBatch& event ACE_ENV_ARG_DECL);
+
+ /// Retrieve the ior of this peer
+ virtual ACE_CString get_ior (void) const;
+
+ /// on reconnect we need to move events from the old consumer
+ /// to the new one
+ virtual void reconnect_from_consumer (
+ TAO_Notify_Consumer* old_consumer
+ ACE_ENV_ARG_DECL);
+
+protected:
+ /// The Consumer
+ CosEventComm::PushConsumer_var push_consumer_;
+
+private:
+ /// TAO_Notify_Destroy_Callback methods.
+ virtual void release (void);
+};
+
+TAO_END_VERSIONED_NAMESPACE_DECL
+
+#include /**/ "ace/post.h"
+#endif /* TAO_Notify_PUSHCONSUMER_H */
diff --git a/TAO/orbsvcs/orbsvcs/Notify/Any/PushSupplier.cpp b/TAO/orbsvcs/orbsvcs/Notify/Any/PushSupplier.cpp
new file mode 100644
index 00000000000..e60246795e2
--- /dev/null
+++ b/TAO/orbsvcs/orbsvcs/Notify/Any/PushSupplier.cpp
@@ -0,0 +1,65 @@
+// $Id$
+
+#include "orbsvcs/Notify/Any/PushSupplier.h"
+
+ACE_RCSID (Notify, TAO_Notify_PushSupplier, "$Id$")
+#include "orbsvcs/Notify/Properties.h"
+
+TAO_BEGIN_VERSIONED_NAMESPACE_DECL
+
+TAO_Notify_PushSupplier::TAO_Notify_PushSupplier (TAO_Notify_ProxyConsumer* proxy)
+ :TAO_Notify_Supplier (proxy)
+{
+}
+
+TAO_Notify_PushSupplier::~TAO_Notify_PushSupplier ()
+{
+}
+
+void
+TAO_Notify_PushSupplier::init (CosEventComm::PushSupplier_ptr push_supplier ACE_ENV_ARG_DECL)
+{
+ // TODO: verify single init call
+ // push_supplier is optional
+ this->push_supplier_ = CosEventComm::PushSupplier::_duplicate (push_supplier);
+
+ ACE_TRY
+ {
+ this->subscribe_ = CosNotifyComm::NotifySubscribe::_narrow (push_supplier ACE_ENV_ARG_PARAMETER);
+ ACE_TRY_CHECK;
+ }
+ ACE_CATCHANY
+ {
+ // _narrow failed which probably means the interface is CosEventComm type.
+ }
+ ACE_ENDTRY;
+}
+
+void
+TAO_Notify_PushSupplier::release (void)
+{
+ delete this;
+ //@@ inform factory
+}
+
+ACE_CString
+TAO_Notify_PushSupplier::get_ior (void) const
+{
+ ACE_CString result;
+ CORBA::ORB_var orb = TAO_Notify_PROPERTIES::instance()->orb();
+ ACE_DECLARE_NEW_CORBA_ENV;
+ ACE_TRY
+ {
+ CORBA::String_var ior = orb->object_to_string(this->push_supplier_.in() ACE_ENV_ARG_PARAMETER);
+ ACE_TRY_CHECK;
+ result = static_cast<const char*> (ior.in ());
+ }
+ ACE_CATCHANY
+ {
+ result.fast_clear();
+ }
+ ACE_ENDTRY;
+ return result;
+}
+
+TAO_END_VERSIONED_NAMESPACE_DECL
diff --git a/TAO/orbsvcs/orbsvcs/Notify/Any/PushSupplier.h b/TAO/orbsvcs/orbsvcs/Notify/Any/PushSupplier.h
new file mode 100644
index 00000000000..47b7c94d0a7
--- /dev/null
+++ b/TAO/orbsvcs/orbsvcs/Notify/Any/PushSupplier.h
@@ -0,0 +1,63 @@
+/* -*- C++ -*- */
+/**
+ * @file PushSupplier.h
+ *
+ * $Id$
+ *
+ * @author Pradeep Gore <pradeep@oomworks.com>
+ *
+ *
+ */
+
+#ifndef TAO_Notify_PUSHSUPPLIER_H
+#define TAO_Notify_PUSHSUPPLIER_H
+#include /**/ "ace/pre.h"
+
+#include "orbsvcs/Notify/notify_serv_export.h"
+
+#if !defined (ACE_LACKS_PRAGMA_ONCE)
+# pragma once
+#endif /* ACE_LACKS_PRAGMA_ONCE */
+
+
+#include "orbsvcs/CosNotifyCommC.h"
+#include "orbsvcs/Notify/Supplier.h"
+
+TAO_BEGIN_VERSIONED_NAMESPACE_DECL
+
+class TAO_Notify_ProxyConsumer;
+
+/**
+ * @class TAO_Notify_StructuredPushSupplier
+ *
+ * @brief Wrapper for the PushSupplier that connect to the EventChannel.
+ *
+ */
+class TAO_Notify_Serv_Export TAO_Notify_PushSupplier : public TAO_Notify_Supplier
+{
+public:
+ /// Constuctor
+ TAO_Notify_PushSupplier (TAO_Notify_ProxyConsumer* proxy);
+
+ /// Destructor
+ virtual ~TAO_Notify_PushSupplier ();
+
+ /// Init
+ void init (CosEventComm::PushSupplier_ptr push_supplier ACE_ENV_ARG_DECL);
+
+ /// Retrieve the ior of this peer
+ virtual ACE_CString get_ior (void) const;
+
+protected:
+ /// The Supplier
+ CosEventComm::PushSupplier_var push_supplier_;
+
+private:
+ /// TAO_Notify_Destroy_Callback methods
+ virtual void release (void);
+};
+
+TAO_END_VERSIONED_NAMESPACE_DECL
+
+#include /**/ "ace/post.h"
+#endif /* TAO_Notify_PUSHSUPPLIER_H */
diff --git a/TAO/orbsvcs/orbsvcs/Notify/Bit_Vector.cpp b/TAO/orbsvcs/orbsvcs/Notify/Bit_Vector.cpp
new file mode 100644
index 00000000000..fd77791b525
--- /dev/null
+++ b/TAO/orbsvcs/orbsvcs/Notify/Bit_Vector.cpp
@@ -0,0 +1,114 @@
+// $Id$
+
+#include "orbsvcs/Notify/Bit_Vector.h"
+
+TAO_BEGIN_VERSIONED_NAMESPACE_DECL
+
+namespace TAO_Notify
+{
+
+Bit_Vector::Bit_Vector()
+ : size_(0)
+ , first_set_bit_(0)
+ , first_cleared_bit_(0)
+{
+}
+
+Bit_Vector::~Bit_Vector()
+{
+}
+
+bool
+Bit_Vector::is_set(const size_t location) const
+{
+ bool result = false;
+ if (location < this->size_)
+ {
+ result = (0 != (this->bitvec_[location >> BPW_LOG_2] & (1 << (location % BITS_PER_WORD))));
+ }
+ return result;
+}
+
+void
+Bit_Vector::set_bit(const size_t location, bool set)
+{
+ if (location >= this->size_)
+ {
+ if ((location >> BPW_LOG_2) >= (this->size_ >> BPW_LOG_2))
+ {
+ size_t need = (location >> BPW_LOG_2) - (this->size_ >> BPW_LOG_2);
+ this->bitvec_.resize(this->bitvec_.size() + need + 1, 0);
+ }
+ this->size_ = location + 1;
+ }
+ if (set)
+ {
+ this->bitvec_[location >> BPW_LOG_2] |= (1 << (location % BITS_PER_WORD));
+ }
+ else
+ {
+ this->bitvec_[location >> BPW_LOG_2] &= ~(1 << (location % BITS_PER_WORD));
+ }
+ this->evaluate_firsts(location, set);
+}
+
+size_t
+Bit_Vector::find_first_bit(bool set) const
+{
+ size_t result = 0;
+ if (set)
+ {
+ result = this->first_set_bit_;
+ }
+ else
+ {
+ result = this->first_cleared_bit_;
+ }
+ return result;
+}
+
+void
+Bit_Vector::evaluate_firsts(const size_t location, bool set)
+{
+ if (set)
+ {
+ if (this->first_cleared_bit_ == location)
+ {
+ this->first_cleared_bit_ = this->find_first_bit_of(location, false);
+ }
+ if (this->first_set_bit_ > location)
+ {
+ this->first_set_bit_ = location;
+ }
+ }
+ else if (!set)
+ {
+ if (this->first_set_bit_ == location)
+ {
+ this->first_set_bit_ = this->find_first_bit_of(location, true);
+ }
+ if (this->first_cleared_bit_ > location)
+ {
+ this->first_cleared_bit_ = location;
+ }
+ }
+}
+
+size_t
+Bit_Vector::find_first_bit_of(const size_t location, bool set)
+{
+ size_t newloc = 0;
+ size_t idx = 0;
+ for (idx = location; (newloc == 0) && (idx < this->size_ + 1); idx++)
+ {
+ if (is_set(idx) == set)
+ {
+ newloc = idx;
+ }
+ }
+ return newloc;
+}
+
+}
+
+TAO_END_VERSIONED_NAMESPACE_DECL
diff --git a/TAO/orbsvcs/orbsvcs/Notify/Bit_Vector.h b/TAO/orbsvcs/orbsvcs/Notify/Bit_Vector.h
new file mode 100644
index 00000000000..46f668814bf
--- /dev/null
+++ b/TAO/orbsvcs/orbsvcs/Notify/Bit_Vector.h
@@ -0,0 +1,81 @@
+// -*- C++ -*-
+
+//=============================================================================
+/**
+ * @file Bit_Vector.h
+ *
+ * $Id$
+ *
+ * This is a basic bit vector class.
+ *
+ * @author Jonathan Pollack <pollack_j@ociweb.com>
+ */
+//=============================================================================
+
+#ifndef BIT_VECTOR_H
+#define BIT_VECTOR_H
+#include /**/ "ace/pre.h"
+
+#include "orbsvcs/Notify/notify_serv_export.h"
+
+#if !defined (ACE_LACKS_PRAGMA_ONCE)
+#pragma once
+#endif /* ACE_LACKS_PRAGMA_ONCE */
+
+#include "tao/Versioned_Namespace.h"
+
+#include "ace/Vector_T.h"
+#include "ace/Basic_Types.h"
+
+TAO_BEGIN_VERSIONED_NAMESPACE_DECL
+
+namespace TAO_Notify
+{
+
+/// \brief Simple bit vector.
+///
+/// Written to support block allocation from persistent storage.
+/// Should be promoted to the ACE level to make it generally usable.
+class TAO_Notify_Serv_Export Bit_Vector
+{
+ typedef ACE_UINT32 BASIC_UINT_TYPE;
+ typedef ACE_Vector<BASIC_UINT_TYPE> VECTOR_TYPE;
+ enum {
+ BITS_PER_WORD = 32,
+ BPW_LOG_2 = 5
+ };
+public:
+
+ /// The constructor.
+ Bit_Vector();
+ /// The destructor.
+ ~Bit_Vector();
+
+ /// \brief Determine if a bit at location is set.
+ bool is_set(const size_t location) const;
+ /// \brief Set or unset a bit at location, growing the vector as needed.
+ void set_bit(const size_t location, bool set);
+
+ /// \brief Find the first bit that is either set or unset in an O(1).
+ size_t find_first_bit(bool set) const;
+
+private:
+ /// Update our first set and unset bits.
+ void evaluate_firsts(const size_t location, bool set);
+ /// Iterate from location to the end, finding the first bit that
+ /// matches the requested set or unset value.
+ size_t find_first_bit_of(const size_t location, bool set);
+
+private:
+ VECTOR_TYPE bitvec_;
+ size_t size_;
+ size_t first_set_bit_;
+ size_t first_cleared_bit_;
+};
+
+}
+
+TAO_END_VERSIONED_NAMESPACE_DECL
+
+#include /**/ "ace/post.h"
+#endif /* BIT_VECTOR_H */
diff --git a/TAO/orbsvcs/orbsvcs/Notify/Buffering_Strategy.cpp b/TAO/orbsvcs/orbsvcs/Notify/Buffering_Strategy.cpp
new file mode 100644
index 00000000000..08b6a810187
--- /dev/null
+++ b/TAO/orbsvcs/orbsvcs/Notify/Buffering_Strategy.cpp
@@ -0,0 +1,266 @@
+// $Id$
+
+#include "orbsvcs/Notify/Buffering_Strategy.h"
+
+ACE_RCSID (Notify, Buffering_Strategy, "$Id$")
+
+
+#include "orbsvcs/Notify/Method_Request.h"
+#include "orbsvcs/Notify/Notify_Extensions.h"
+#include "orbsvcs/Notify/QoSProperties.h"
+#include "orbsvcs/Notify/Notify_Extensions.h"
+
+#include "orbsvcs/CosNotificationC.h"
+#include "orbsvcs/Time_Utilities.h"
+
+#include "tao/debug.h"
+
+#include "ace/Message_Queue.h"
+
+TAO_BEGIN_VERSIONED_NAMESPACE_DECL
+
+TAO_Notify_Buffering_Strategy::TAO_Notify_Buffering_Strategy (
+ TAO_Notify_Message_Queue& msg_queue,
+ const TAO_Notify_AdminProperties::Ptr& admin_properties)
+: msg_queue_ (msg_queue)
+, admin_properties_ (admin_properties)
+, global_queue_lock_ (admin_properties->global_queue_lock ())
+, global_queue_length_ (admin_properties->global_queue_length ())
+, max_queue_length_ (admin_properties->max_global_queue_length ())
+, order_policy_ (CosNotification::OrderPolicy, CosNotification::AnyOrder)
+, discard_policy_ (CosNotification::DiscardPolicy, CosNotification::AnyOrder)
+, max_events_per_consumer_ (CosNotification::MaxEventsPerConsumer)
+, blocking_policy_ (TAO_Notify_Extensions::BlockingPolicy)
+, global_not_full_ (admin_properties->global_queue_not_full())
+, local_not_full_ (global_queue_lock_)
+, local_not_empty_ (global_queue_lock_)
+, shutdown_ (false)
+{
+}
+
+TAO_Notify_Buffering_Strategy::~TAO_Notify_Buffering_Strategy ()
+{
+}
+
+void
+TAO_Notify_Buffering_Strategy::update_qos_properties
+ (const TAO_Notify_QoSProperties& qos_properties)
+{
+ this->order_policy_.set (qos_properties);
+ this->discard_policy_.set (qos_properties);
+ this->max_events_per_consumer_.set(qos_properties);
+ this->blocking_policy_.set (qos_properties);
+}
+
+void
+TAO_Notify_Buffering_Strategy::shutdown (void)
+{
+ ACE_GUARD (ACE_SYNCH_MUTEX, ace_mon, this->global_queue_lock_);
+
+ if (this->shutdown_)
+ {
+ return;
+ }
+
+ this->shutdown_ = true;
+
+ this->local_not_empty_.broadcast ();
+ this->global_not_full_.broadcast();
+ this->local_not_full_.broadcast();
+}
+
+int
+TAO_Notify_Buffering_Strategy::enqueue (TAO_Notify_Method_Request_Queueable* method_request)
+{
+ ACE_GUARD_RETURN (ACE_SYNCH_MUTEX, ace_mon, this->global_queue_lock_, -1);
+
+ if (this->shutdown_)
+ return -1;
+
+ bool discarded_existing = false;
+
+ bool local_overflow = this->max_events_per_consumer_.is_valid() &&
+ static_cast <CORBA::Long> (this->msg_queue_.message_count ()) >= this->max_events_per_consumer_.value();
+
+ bool global_overflow = this->max_queue_length_.value () != 0 &&
+ this->global_queue_length_ >= this->max_queue_length_.value ();
+
+ while (local_overflow || global_overflow)
+ {
+ if (blocking_policy_.is_valid())
+ {
+ ACE_Time_Value timeout;
+ ORBSVCS_Time::TimeT_to_Time_Value(timeout, blocking_policy_.value());
+ // Condition variables take an absolute time
+ timeout += ACE_OS::gettimeofday();
+ if (local_overflow)
+ {
+ local_not_full_.wait(&timeout);
+ }
+ else
+ {
+ global_not_full_.wait(&timeout);
+ }
+ if (errno != ETIME)
+ {
+ local_overflow =
+ this->max_events_per_consumer_.is_valid() &&
+ static_cast <CORBA::Long> (this->msg_queue_.message_count ()) >= this->max_events_per_consumer_.value();
+ global_overflow =
+ this->max_queue_length_.value () != 0 &&
+ this->global_queue_length_ >= this->max_queue_length_.value ();
+ continue;
+ }
+ }
+
+ discarded_existing = this->discard(method_request);
+ if (discarded_existing)
+ {
+ --this->global_queue_length_;
+ local_not_full_.signal();
+ global_not_full_.signal();
+ }
+ break;
+ }
+
+ if (! (local_overflow || global_overflow) || discarded_existing)
+ {
+ if (this->queue (method_request) == -1)
+ {
+ ACE_DEBUG((LM_DEBUG,
+ "Notify (%P|%t) - Panic! failed to enqueue event\n"));
+ return -1;
+ }
+
+ ++this->global_queue_length_;
+
+ local_not_empty_.signal ();
+ }
+ return this->msg_queue_.message_count ();
+}
+
+int
+TAO_Notify_Buffering_Strategy::dequeue (TAO_Notify_Method_Request_Queueable* &method_request, const ACE_Time_Value *abstime)
+{
+ ACE_Message_Block *mb;
+
+ ACE_GUARD_RETURN (ACE_SYNCH_MUTEX, ace_mon, this->global_queue_lock_, -1);
+
+ if ( this->shutdown_ )
+ return -1;
+
+ while (this->msg_queue_.message_count () == 0)
+ {
+ this->local_not_empty_.wait (abstime);
+
+ if (this->shutdown_)
+ return -1;
+
+ if (errno == ETIME)
+ return 0;
+ }
+
+ if (this->msg_queue_.dequeue (mb) == -1)
+ return -1;
+
+ method_request = dynamic_cast<TAO_Notify_Method_Request_Queueable*>(mb);
+
+ if (method_request == 0)
+ return -1;
+
+ --this->global_queue_length_;
+ local_not_full_.signal();
+ global_not_full_.signal();
+
+ return 1;
+}
+
+int
+TAO_Notify_Buffering_Strategy::queue (TAO_Notify_Method_Request_Queueable* method_request)
+{
+ if ( this->shutdown_ )
+ return -1;
+
+ CORBA::Short order = this->order_policy_.value();
+
+ if (! this->order_policy_.is_valid() ||
+ order == CosNotification::AnyOrder ||
+ order == CosNotification::FifoOrder)
+ {
+ if (TAO_debug_level > 0)
+ ACE_DEBUG ((LM_DEBUG, "Notify (%P|%t) - enqueue in fifo order\n"));
+ return this->msg_queue_.enqueue_tail (method_request);
+ }
+
+ if (order == CosNotification::PriorityOrder)
+ {
+ if (TAO_debug_level > 0)
+ ACE_DEBUG ((LM_DEBUG, "Notify (%P|%t) - enqueue in priority order\n"));
+ return this->msg_queue_.enqueue_prio (method_request);
+ }
+
+ if (order == CosNotification::DeadlineOrder)
+ {
+ if (TAO_debug_level > 0)
+ ACE_DEBUG ((LM_DEBUG, "Notify (%P|%t) - enqueue in deadline order\n"));
+ return this->msg_queue_.enqueue_deadline (method_request);
+ }
+
+ if (TAO_debug_level > 0)
+ ACE_DEBUG ((LM_DEBUG, "Notify (%P|%t) - Invalid order policy\n"));
+ return this->msg_queue_.enqueue_tail (method_request);
+}
+
+bool
+TAO_Notify_Buffering_Strategy::discard (TAO_Notify_Method_Request_Queueable* method_request)
+{
+ if (this->shutdown_)
+ {
+ return false;
+ }
+
+ ACE_Message_Block* mb = 0;
+ int result = -1;
+
+ if (this->discard_policy_.is_valid() == 0 ||
+ this->discard_policy_ == CosNotification::AnyOrder ||
+ this->discard_policy_ == CosNotification::FifoOrder)
+ {
+ result = this->msg_queue_.dequeue_head (mb);
+ }
+ else if (this->discard_policy_ == CosNotification::LifoOrder)
+ {
+ // The most current message is NOT the newest one in the queue. It's
+ // the one we're about to add to the queue.
+ result = -1;
+ }
+ else if (this->discard_policy_ == CosNotification::DeadlineOrder)
+ {
+ result = this->msg_queue_.dequeue_deadline (mb);
+ }
+ else if (this->discard_policy_ == CosNotification::PriorityOrder)
+ {
+ result = this->msg_queue_.dequeue_prio (mb);
+ if (mb->msg_priority() >= method_request->msg_priority())
+ {
+ this->msg_queue_.enqueue_prio (mb);
+ result = -1;
+ }
+ }
+ else
+ {
+ if (TAO_debug_level > 0)
+ ACE_DEBUG ((LM_DEBUG, "Notify (%P|%t) - Invalid discard policy\n"));
+ result = this->msg_queue_.dequeue_head (mb);
+ }
+
+ if (result != -1)
+ {
+ ACE_Message_Block::release (mb);
+ return true;
+ }
+
+ return false;
+}
+
+TAO_END_VERSIONED_NAMESPACE_DECL
diff --git a/TAO/orbsvcs/orbsvcs/Notify/Buffering_Strategy.h b/TAO/orbsvcs/orbsvcs/Notify/Buffering_Strategy.h
new file mode 100644
index 00000000000..7baa636a2d9
--- /dev/null
+++ b/TAO/orbsvcs/orbsvcs/Notify/Buffering_Strategy.h
@@ -0,0 +1,121 @@
+/* -*- C++ -*- */
+/**
+ * @file Buffering_Strategy.h
+ *
+ * $Id$
+ *
+ * @author Pradeep Gore <pradeep@oomworks.com>
+ *
+ *
+ */
+
+#ifndef TAO_Notify_BUFFERING_STRATEGY_H
+#define TAO_Notify_BUFFERING_STRATEGY_H
+
+#include /**/ "ace/pre.h"
+
+#include "orbsvcs/Notify/notify_serv_export.h"
+
+#if !defined (ACE_LACKS_PRAGMA_ONCE)
+# pragma once
+#endif /* ACE_LACKS_PRAGMA_ONCE */
+
+#include "ace/Null_Condition.h"
+#include "ace/Message_Queue.h"
+
+#include "orbsvcs/TimeBaseC.h"
+
+#include "orbsvcs/Notify/Property.h"
+#include "orbsvcs/Notify/Property_T.h"
+#include "orbsvcs/Notify/AdminProperties.h"
+
+TAO_BEGIN_VERSIONED_NAMESPACE_DECL
+
+class TAO_Notify_Method_Request_Queueable;
+class TAO_Notify_QoSProperties;
+
+typedef ACE_Message_Queue<ACE_NULL_SYNCH> TAO_Notify_Message_Queue;
+
+/**
+ * @class TAO_Notify_Buffering_Strategy
+ *
+ * @brief Base Strategy to enqueue and dequeue items from a Message Queue.
+ *
+ */
+class TAO_Notify_Serv_Export TAO_Notify_Buffering_Strategy
+{
+public:
+ TAO_Notify_Buffering_Strategy (
+ TAO_Notify_Message_Queue& msg_queue,
+ const TAO_Notify_AdminProperties::Ptr& admin_properties);
+
+ ~TAO_Notify_Buffering_Strategy ();
+
+ /// Update state with the following QoS Properties:
+ /// Order Policy
+ /// Discard Policy
+ /// MaxEventsPerConsumer
+ void update_qos_properties (const TAO_Notify_QoSProperties& qos_properties);
+
+ /// Enqueue according the enqueing strategy.
+ /// Return -1 on error else the number of items in the queue.
+ int enqueue (TAO_Notify_Method_Request_Queueable* method_request);
+
+ /// Dequeue batch. This method will block for @a abstime if non-zero or else blocks till an item is available.
+ /// Return -1 on error or if nothing is available, else the number of items actually dequeued (1).
+ int dequeue (TAO_Notify_Method_Request_Queueable* &method_request,
+ const ACE_Time_Value *abstime);
+
+ /// Shutdown
+ void shutdown (void);
+
+private:
+
+ /// Apply the Order Policy and queue. return -1 on error.
+ int queue (TAO_Notify_Method_Request_Queueable* method_request);
+
+ /// Discard as per the Discard Policy.
+ bool discard (TAO_Notify_Method_Request_Queueable* method_request);
+
+ ///= Data Members
+
+ /// The local Message Queue
+ TAO_Notify_Message_Queue& msg_queue_;
+
+ /// Reference to the properties per event channel.
+ TAO_Notify_AdminProperties::Ptr admin_properties_;
+
+ /// The shared global lock used by all the queues.
+ ACE_SYNCH_MUTEX& global_queue_lock_;
+
+ /// The global queue length - queue length accross all the queues.
+ CORBA::Long& global_queue_length_;
+
+ /// The maximum events that can be queued overall.
+ const TAO_Notify_Property_Long& max_queue_length_;
+
+ /// Order of events in internal buffers.
+ TAO_Notify_Property_Short order_policy_;
+
+ /// Policy to discard when buffers are full.
+ TAO_Notify_Property_Short discard_policy_;
+
+ TAO_Notify_Property_Long max_events_per_consumer_;
+ TAO_Notify_Property_Time blocking_policy_;
+
+
+ TAO_SYNCH_CONDITION& global_not_full_;
+ TAO_SYNCH_CONDITION local_not_full_;
+
+ /// Condition that batch size reached.
+ TAO_SYNCH_CONDITION local_not_empty_;
+
+ /// Flag to shutdown.
+ bool shutdown_;
+};
+
+TAO_END_VERSIONED_NAMESPACE_DECL
+
+#include /**/ "ace/post.h"
+
+#endif /* TAO_Notify_BUFFERING_STRATEGY_H */
diff --git a/TAO/orbsvcs/orbsvcs/Notify/Builder.cpp b/TAO/orbsvcs/orbsvcs/Notify/Builder.cpp
new file mode 100644
index 00000000000..bab9d61ecf0
--- /dev/null
+++ b/TAO/orbsvcs/orbsvcs/Notify/Builder.cpp
@@ -0,0 +1,592 @@
+// $Id$
+#include "orbsvcs/Notify/Builder.h"
+
+ACE_RCSID (Notify,
+ Builder,
+ "$Id$")
+
+#include "ace/Dynamic_Service.h"
+
+#include "tao/PortableServer/PortableServerC.h"
+
+#include "orbsvcs/Notify/Factory.h"
+#include "orbsvcs/Notify/Properties.h"
+#include "orbsvcs/Notify/POA_Helper.h"
+#include "orbsvcs/Notify/ID_Factory.h"
+#include "orbsvcs/Notify/EventChannelFactory.h"
+#include "orbsvcs/Notify/EventChannel.h"
+#include "orbsvcs/Notify/SupplierAdmin.h"
+#include "orbsvcs/Notify/ConsumerAdmin.h"
+#include "orbsvcs/Notify/Worker_Task.h"
+#include "orbsvcs/Notify/Reactive_Task.h"
+#include "orbsvcs/Notify/ThreadPool_Task.h"
+#include "orbsvcs/Notify/FilterFactory.h"
+#include "orbsvcs/Notify/Object.h"
+#include "orbsvcs/Notify/EventType.h"
+#include "orbsvcs/Notify/Event.h"
+#include "orbsvcs/Notify/Any/AnyEvent.h"
+#include "orbsvcs/Notify/Any/ProxyPushConsumer.h"
+#include "orbsvcs/Notify/Any/ProxyPushSupplier.h"
+#include "orbsvcs/Notify/Any/CosEC_ProxyPushConsumer.h"
+#include "orbsvcs/Notify/Any/CosEC_ProxyPushSupplier.h"
+#include "orbsvcs/Notify/Structured/StructuredProxyPushConsumer.h"
+#include "orbsvcs/Notify/Structured/StructuredProxyPushSupplier.h"
+#include "orbsvcs/Notify/Sequence/SequenceProxyPushConsumer.h"
+#include "orbsvcs/Notify/Sequence/SequenceProxyPushSupplier.h"
+#include "orbsvcs/Notify/ETCL_FilterFactory.h"
+#include "orbsvcs/Notify/Container_T.h"
+
+TAO_BEGIN_VERSIONED_NAMESPACE_DECL
+
+template <class PROXY_IMPL,
+ class PROXY,
+ class PROXY_PTR,
+ class PROXY_VAR,
+ class PARENT>
+class TAO_Notify_Proxy_Builder_T
+{
+public:
+ PROXY_PTR
+ build (PARENT *parent, CosNotifyChannelAdmin::ProxyID_out proxy_id
+ , const CosNotification::QoSProperties & initial_qos ACE_ENV_ARG_DECL)
+ {
+ PROXY_VAR proxy_ret;
+
+ TAO_Notify_Factory* factory = TAO_Notify_PROPERTIES::instance ()->factory ();
+
+ PROXY_IMPL* proxy = 0;
+ factory->create (proxy ACE_ENV_ARG_PARAMETER);
+ ACE_CHECK_RETURN (proxy_ret._retn ());
+
+ PortableServer::ServantBase_var servant (proxy);
+
+ proxy->init (parent ACE_ENV_ARG_PARAMETER);
+ ACE_CHECK_RETURN (proxy_ret._retn ());
+
+ proxy->set_qos (initial_qos ACE_ENV_ARG_PARAMETER);
+ ACE_CHECK_RETURN (proxy_ret._retn ());
+
+ CORBA::Object_var obj = proxy->activate (proxy ACE_ENV_ARG_PARAMETER);
+ ACE_CHECK_RETURN (proxy_ret._retn ());
+
+ proxy_id = proxy->id ();
+
+ proxy_ret = PROXY::_narrow (obj.in() ACE_ENV_ARG_PARAMETER);
+ ACE_CHECK_RETURN (proxy_ret._retn ());
+
+ // insert proxy in admin container.
+ parent->insert (proxy ACE_ENV_ARG_PARAMETER);
+ ACE_CHECK_RETURN (PROXY::_nil ());
+
+ return proxy_ret._retn ();
+ }
+
+ PROXY_IMPL*
+ build (PARENT *parent, const CosNotifyChannelAdmin::ProxyID proxy_id
+ ACE_ENV_ARG_DECL)
+ {
+ TAO_Notify_Factory* factory = TAO_Notify_PROPERTIES::instance ()->factory ();
+
+ PROXY_IMPL* proxy = 0;
+ factory->create (proxy ACE_ENV_ARG_PARAMETER);
+ ACE_CHECK_RETURN (0);
+
+ PortableServer::ServantBase_var servant (proxy);
+
+ proxy->init (parent ACE_ENV_ARG_PARAMETER);
+ ACE_CHECK_RETURN (0);
+
+ proxy->activate (proxy, proxy_id ACE_ENV_ARG_PARAMETER);
+ ACE_CHECK_RETURN (0);
+
+ // insert proxy in admin container.
+ parent->insert (proxy ACE_ENV_ARG_PARAMETER);
+ ACE_CHECK_RETURN (0);
+
+ return proxy;
+ }
+
+};
+
+// define the ProxyConsumer Builders.
+typedef TAO_Notify_Proxy_Builder_T<TAO_Notify_ProxyPushConsumer
+ , CosNotifyChannelAdmin::ProxyConsumer
+ , CosNotifyChannelAdmin::ProxyConsumer_ptr
+ , CosNotifyChannelAdmin::ProxyConsumer_var
+ , TAO_Notify_SupplierAdmin>
+TAO_Notify_ProxyPushConsumer_Builder;
+
+typedef TAO_Notify_Proxy_Builder_T<TAO_Notify_StructuredProxyPushConsumer
+ , CosNotifyChannelAdmin::ProxyConsumer
+ , CosNotifyChannelAdmin::ProxyConsumer_ptr
+ , CosNotifyChannelAdmin::ProxyConsumer_var
+ , TAO_Notify_SupplierAdmin>
+TAO_Notify_StructuredProxyPushConsumer_Builder;
+
+typedef TAO_Notify_Proxy_Builder_T<TAO_Notify_SequenceProxyPushConsumer
+ , CosNotifyChannelAdmin::ProxyConsumer
+ , CosNotifyChannelAdmin::ProxyConsumer_ptr
+ , CosNotifyChannelAdmin::ProxyConsumer_var
+ , TAO_Notify_SupplierAdmin>
+TAO_Notify_SequenceProxyPushConsumer_Builder;
+
+typedef TAO_Notify_Proxy_Builder_T<TAO_Notify_CosEC_ProxyPushConsumer
+ , CosEventChannelAdmin::ProxyPushConsumer
+ , CosEventChannelAdmin::ProxyPushConsumer_ptr
+ , CosEventChannelAdmin::ProxyPushConsumer_var
+ , TAO_Notify_SupplierAdmin>
+TAO_Notify_CosEC_ProxyPushConsumer_Builder;
+
+// define the ProxySupplier Builders.
+typedef TAO_Notify_Proxy_Builder_T<TAO_Notify_ProxyPushSupplier
+ , CosNotifyChannelAdmin::ProxySupplier
+ , CosNotifyChannelAdmin::ProxySupplier_ptr
+ , CosNotifyChannelAdmin::ProxySupplier_var
+ , TAO_Notify_ConsumerAdmin>
+TAO_Notify_ProxyPushSupplier_Builder;
+
+typedef TAO_Notify_Proxy_Builder_T<TAO_Notify_StructuredProxyPushSupplier
+ , CosNotifyChannelAdmin::ProxySupplier
+ , CosNotifyChannelAdmin::ProxySupplier_ptr
+ , CosNotifyChannelAdmin::ProxySupplier_var
+ , TAO_Notify_ConsumerAdmin>
+TAO_Notify_StructuredProxyPushSupplier_Builder;
+
+typedef TAO_Notify_Proxy_Builder_T<TAO_Notify_SequenceProxyPushSupplier
+ , CosNotifyChannelAdmin::ProxySupplier
+ , CosNotifyChannelAdmin::ProxySupplier_ptr
+ , CosNotifyChannelAdmin::ProxySupplier_var
+ , TAO_Notify_ConsumerAdmin>
+TAO_Notify_SequenceProxyPushSupplier_Builder;
+
+typedef TAO_Notify_Proxy_Builder_T<TAO_Notify_CosEC_ProxyPushSupplier
+ , CosEventChannelAdmin::ProxyPushSupplier
+ , CosEventChannelAdmin::ProxyPushSupplier_ptr
+ , CosEventChannelAdmin::ProxyPushSupplier_var
+ , TAO_Notify_ConsumerAdmin>
+TAO_Notify_CosEC_ProxyPushSupplier_Builder;
+
+TAO_Notify_Builder::TAO_Notify_Builder (void)
+{
+ // Init the static members.
+ TAO_Notify_AnyEvent::event_type_ = TAO_Notify_EventType::special ();
+}
+
+TAO_Notify_Builder::~TAO_Notify_Builder ()
+{
+}
+
+CosNotifyFilter::FilterFactory_ptr
+TAO_Notify_Builder::build_filter_factory (ACE_ENV_SINGLE_ARG_DECL)
+{
+ TAO_Notify_FilterFactory* ff = ACE_Dynamic_Service<TAO_Notify_FilterFactory>::instance ("TAO_Notify_FilterFactory");
+
+ if (ff == 0)
+ {
+ ACE_NEW_THROW_EX (ff,
+ TAO_Notify_ETCL_FilterFactory (),
+ CORBA::NO_MEMORY ());
+ ACE_CHECK_RETURN (CosNotifyFilter::FilterFactory::_nil ());
+ }
+
+ PortableServer::POA_var default_poa = TAO_Notify_PROPERTIES::instance ()->default_poa ();
+
+ return ff->create (default_poa ACE_ENV_ARG_PARAMETER);
+}
+
+CosNotifyChannelAdmin::EventChannelFactory_ptr
+TAO_Notify_Builder::build_event_channel_factory (PortableServer::POA_ptr poa ACE_ENV_ARG_DECL)
+{
+ CosNotifyChannelAdmin::EventChannelFactory_var ecf_ret;
+
+ TAO_Notify_Factory* factory = TAO_Notify_PROPERTIES::instance ()->factory ();
+
+ // Create ECF
+ TAO_Notify_EventChannelFactory* ecf = 0;
+ factory->create (ecf ACE_ENV_ARG_PARAMETER);
+ ACE_CHECK_RETURN (ecf_ret._retn ());
+
+ ecf->init (poa ACE_ENV_ARG_PARAMETER);
+ ACE_CHECK_RETURN (ecf_ret._retn ());
+ ecf_ret = ecf->activate_self (ACE_ENV_SINGLE_ARG_PARAMETER);
+ ACE_CHECK_RETURN (ecf_ret._retn ());
+
+ return (ecf_ret._retn ());
+}
+
+CosNotifyChannelAdmin::EventChannel_ptr
+TAO_Notify_Builder::build_event_channel (
+ TAO_Notify_EventChannelFactory* ecf,
+ const CosNotification::QoSProperties & initial_qos,
+ const CosNotification::AdminProperties & initial_admin,
+ CosNotifyChannelAdmin::ChannelID_out id ACE_ENV_ARG_DECL)
+{
+ CosNotifyChannelAdmin::EventChannel_var ec_ret;
+
+ TAO_Notify_Factory* factory = TAO_Notify_PROPERTIES::instance ()->factory ();
+
+ TAO_Notify_EventChannel* ec = 0;
+ factory->create (ec ACE_ENV_ARG_PARAMETER);
+ ACE_CHECK_RETURN (ec_ret._retn ());
+
+ ec->init (ecf, initial_qos, initial_admin ACE_ENV_ARG_PARAMETER);
+ ACE_CHECK_RETURN (ec_ret._retn ());
+
+ // insert ec in ec container.
+ ecf->ec_container().insert (ec ACE_ENV_ARG_PARAMETER);
+ ACE_CHECK_RETURN (ec_ret._retn ());
+
+ CORBA::Object_var obj = ec->activate (ec ACE_ENV_ARG_PARAMETER);
+ ACE_CHECK_RETURN (ec_ret._retn ());
+
+ // Populate the ID to return.
+ id = ec->id ();
+
+ ec_ret = CosNotifyChannelAdmin::EventChannel::_narrow (obj.in() ACE_ENV_ARG_PARAMETER);
+ ACE_CHECK_RETURN (ec_ret._retn ());
+
+ return ec_ret._retn ();
+}
+
+TAO_Notify_EventChannel *
+TAO_Notify_Builder::build_event_channel (
+ TAO_Notify_EventChannelFactory* ecf,
+ const CosNotifyChannelAdmin::ChannelID id ACE_ENV_ARG_DECL)
+{
+ TAO_Notify_Factory* factory = TAO_Notify_PROPERTIES::instance ()->factory ();
+
+ TAO_Notify_EventChannel* ec = 0;
+ factory->create (ec ACE_ENV_ARG_PARAMETER);
+ ACE_CHECK_RETURN (0);
+
+ ec->init (ecf ACE_ENV_ARG_PARAMETER); //, initial_qos, initial_admin
+ ACE_CHECK_RETURN (0);
+
+ // insert ec in ec container.
+ ecf->ec_container().insert (ec ACE_ENV_ARG_PARAMETER);
+ ACE_CHECK_RETURN (0);
+
+ ec->activate (ec, id ACE_ENV_ARG_PARAMETER);
+ ACE_CHECK_RETURN (0);
+
+ return ec;
+}
+
+CosNotifyChannelAdmin::ConsumerAdmin_ptr
+TAO_Notify_Builder::build_consumer_admin (
+ TAO_Notify_EventChannel* ec,
+ CosNotifyChannelAdmin::InterFilterGroupOperator op,
+ CosNotifyChannelAdmin::AdminID_out id ACE_ENV_ARG_DECL)
+{
+ CosNotifyChannelAdmin::ConsumerAdmin_var ca_ret;
+
+ TAO_Notify_Factory* factory = TAO_Notify_PROPERTIES::instance ()->factory ();
+
+ TAO_Notify_ConsumerAdmin* ca = 0;
+ factory->create (ca ACE_ENV_ARG_PARAMETER);
+ ACE_CHECK_RETURN (ca_ret._retn ());
+
+ ca->init (ec ACE_ENV_ARG_PARAMETER);
+ ACE_CHECK_RETURN (ca_ret._retn ());
+
+ ca->filter_operator (op);
+
+ CORBA::Object_var obj = ca->activate (ca ACE_ENV_ARG_PARAMETER);
+ ACE_CHECK_RETURN (ca_ret._retn ());
+
+ id = ca->id ();
+
+ ca_ret = CosNotifyChannelAdmin::ConsumerAdmin::_narrow (obj.in() ACE_ENV_ARG_PARAMETER);
+ ACE_CHECK_RETURN (ca_ret._retn ());
+
+ // insert admin in CA container.
+ ec->ca_container_->insert (ca ACE_ENV_ARG_PARAMETER);
+ ACE_CHECK_RETURN (ca_ret._retn ());
+
+ return ca_ret._retn ();
+}
+
+TAO_Notify_ConsumerAdmin *
+TAO_Notify_Builder::build_consumer_admin (
+ TAO_Notify_EventChannel* ec,
+ const CosNotifyChannelAdmin::ChannelID id
+ ACE_ENV_ARG_DECL)
+{
+ TAO_Notify_Factory* factory = TAO_Notify_PROPERTIES::instance ()->factory ();
+ TAO_Notify_ConsumerAdmin * ca = 0;
+ factory->create (ca ACE_ENV_ARG_PARAMETER);
+ ACE_CHECK_RETURN (0);
+
+ ca->init (ec ACE_ENV_ARG_PARAMETER);
+ ACE_CHECK_RETURN (0);
+
+ CORBA::Object_var obj = ca->activate (ca, id ACE_ENV_ARG_PARAMETER);
+ ACE_CHECK_RETURN (0);
+
+ // insert admin in CA container.
+ ec->ca_container_->insert (ca ACE_ENV_ARG_PARAMETER);
+ ACE_CHECK_RETURN (0);
+ return ca;
+}
+
+CosNotifyChannelAdmin::SupplierAdmin_ptr
+TAO_Notify_Builder::build_supplier_admin (TAO_Notify_EventChannel* ec, CosNotifyChannelAdmin::InterFilterGroupOperator op, CosNotifyChannelAdmin::AdminID_out id ACE_ENV_ARG_DECL)
+{
+ CosNotifyChannelAdmin::SupplierAdmin_var sa_ret;
+
+ TAO_Notify_Factory* factory = TAO_Notify_PROPERTIES::instance ()->factory ();
+
+ TAO_Notify_SupplierAdmin* sa = 0;
+ factory->create (sa ACE_ENV_ARG_PARAMETER);
+ ACE_CHECK_RETURN (sa_ret._retn ());
+
+ sa->init (ec ACE_ENV_ARG_PARAMETER);
+ ACE_CHECK_RETURN (sa_ret._retn ());
+
+ sa->filter_operator (op);
+
+ CORBA::Object_var obj = sa->activate (sa ACE_ENV_ARG_PARAMETER);
+ ACE_CHECK_RETURN (sa_ret._retn ());
+
+ id = sa->id ();
+
+ sa_ret = CosNotifyChannelAdmin::SupplierAdmin::_narrow (obj.in() ACE_ENV_ARG_PARAMETER);
+ ACE_CHECK_RETURN (sa_ret._retn ());
+
+ // insert admin in SA container.
+ ec->sa_container().insert (sa ACE_ENV_ARG_PARAMETER);
+ ACE_CHECK_RETURN (sa_ret._retn ());
+
+ return sa_ret._retn ();
+}
+
+TAO_Notify_SupplierAdmin *
+TAO_Notify_Builder::build_supplier_admin (
+ TAO_Notify_EventChannel* ec,
+ const CosNotifyChannelAdmin::ChannelID id
+ ACE_ENV_ARG_DECL)
+{
+ TAO_Notify_Factory* factory = TAO_Notify_PROPERTIES::instance ()->factory ();
+ TAO_Notify_SupplierAdmin * sa = 0;
+ factory->create (sa ACE_ENV_ARG_PARAMETER);
+ ACE_CHECK_RETURN (0);
+
+ sa->init (ec ACE_ENV_ARG_PARAMETER);
+ ACE_CHECK_RETURN (0);
+
+ CORBA::Object_var obj = sa->activate (sa, id ACE_ENV_ARG_PARAMETER);
+ ACE_CHECK_RETURN (0);
+
+ // insert admin in CA container.
+ ec->sa_container().insert (sa ACE_ENV_ARG_PARAMETER);
+ ACE_CHECK_RETURN (0);
+
+ return sa;
+}
+
+CosNotifyChannelAdmin::ProxyConsumer_ptr
+TAO_Notify_Builder::build_proxy(TAO_Notify_SupplierAdmin* sa
+ , CosNotifyChannelAdmin::ClientType ctype
+ , CosNotifyChannelAdmin::ProxyID_out proxy_id
+ , const CosNotification::QoSProperties & initial_qos
+ ACE_ENV_ARG_DECL)
+{
+ switch (ctype)
+ {
+ case CosNotifyChannelAdmin::ANY_EVENT:
+ {
+ TAO_Notify_ProxyPushConsumer_Builder pb;
+ return pb.build (sa, proxy_id, initial_qos ACE_ENV_ARG_PARAMETER);
+ }
+ break;
+
+ case CosNotifyChannelAdmin::STRUCTURED_EVENT:
+ {
+ TAO_Notify_StructuredProxyPushConsumer_Builder pb;
+ return pb.build (sa, proxy_id, initial_qos ACE_ENV_ARG_PARAMETER);
+ }
+ break;
+
+ case CosNotifyChannelAdmin::SEQUENCE_EVENT:
+ {
+ TAO_Notify_SequenceProxyPushConsumer_Builder pb;
+ return pb.build (sa, proxy_id, initial_qos ACE_ENV_ARG_PARAMETER);
+ }
+ break;
+
+ default:
+ ACE_THROW_RETURN (CORBA::BAD_PARAM (),
+ CosNotifyChannelAdmin::ProxyConsumer::_nil ());
+ }
+}
+
+CosNotifyChannelAdmin::ProxySupplier_ptr
+TAO_Notify_Builder::build_proxy(TAO_Notify_ConsumerAdmin* ca
+ , CosNotifyChannelAdmin::ClientType ctype
+ , CosNotifyChannelAdmin::ProxyID_out proxy_id
+ , const CosNotification::QoSProperties & initial_qos
+ ACE_ENV_ARG_DECL)
+{
+ switch (ctype)
+ {
+ case CosNotifyChannelAdmin::ANY_EVENT:
+ {
+ TAO_Notify_ProxyPushSupplier_Builder pb;
+ return pb.build (ca, proxy_id, initial_qos ACE_ENV_ARG_PARAMETER);
+ }
+ break;
+
+ case CosNotifyChannelAdmin::STRUCTURED_EVENT:
+ {
+ TAO_Notify_StructuredProxyPushSupplier_Builder pb;
+ return pb.build (ca, proxy_id, initial_qos ACE_ENV_ARG_PARAMETER);
+ }
+ break;
+
+ case CosNotifyChannelAdmin::SEQUENCE_EVENT:
+ {
+ TAO_Notify_SequenceProxyPushSupplier_Builder pb;
+ return pb.build (ca, proxy_id, initial_qos ACE_ENV_ARG_PARAMETER);
+ }
+ break;
+
+ default:
+ ACE_THROW_RETURN (CORBA::BAD_PARAM (),
+ CosNotifyChannelAdmin::ProxySupplier::_nil ());
+ }
+}
+
+TAO_Notify_ProxyConsumer *
+TAO_Notify_Builder::build_proxy(TAO_Notify_SupplierAdmin* sa
+ , CosNotifyChannelAdmin::ClientType ctype
+ , const CosNotifyChannelAdmin::ProxyID proxy_id
+ ACE_ENV_ARG_DECL)
+{
+ switch (ctype)
+ {
+ case CosNotifyChannelAdmin::ANY_EVENT:
+ {
+ TAO_Notify_ProxyPushConsumer_Builder pb;
+ return pb.build (sa, proxy_id ACE_ENV_ARG_PARAMETER);
+ }
+ break;
+
+ case CosNotifyChannelAdmin::STRUCTURED_EVENT:
+ {
+ TAO_Notify_StructuredProxyPushConsumer_Builder pb;
+ return pb.build (sa, proxy_id ACE_ENV_ARG_PARAMETER);
+ }
+ break;
+
+ case CosNotifyChannelAdmin::SEQUENCE_EVENT:
+ {
+ TAO_Notify_SequenceProxyPushConsumer_Builder pb;
+ return pb.build (sa, proxy_id ACE_ENV_ARG_PARAMETER);
+ }
+ break;
+
+ default:
+ ACE_THROW_RETURN (CORBA::BAD_PARAM (),
+ 0);
+ }
+}
+
+TAO_Notify_ProxySupplier *
+TAO_Notify_Builder::build_proxy(TAO_Notify_ConsumerAdmin* ca
+ , CosNotifyChannelAdmin::ClientType ctype
+ , const CosNotifyChannelAdmin::ProxyID proxy_id
+ ACE_ENV_ARG_DECL)
+{
+ switch (ctype)
+ {
+ case CosNotifyChannelAdmin::ANY_EVENT:
+ {
+ TAO_Notify_ProxyPushSupplier_Builder pb;
+ return pb.build (ca, proxy_id ACE_ENV_ARG_PARAMETER);
+ }
+ break;
+
+ case CosNotifyChannelAdmin::STRUCTURED_EVENT:
+ {
+ TAO_Notify_StructuredProxyPushSupplier_Builder pb;
+ return pb.build (ca, proxy_id ACE_ENV_ARG_PARAMETER);
+ }
+ break;
+
+ case CosNotifyChannelAdmin::SEQUENCE_EVENT:
+ {
+ TAO_Notify_SequenceProxyPushSupplier_Builder pb;
+ return pb.build (ca, proxy_id ACE_ENV_ARG_PARAMETER);
+ }
+ break;
+
+ default:
+ ACE_THROW_RETURN (CORBA::BAD_PARAM (),
+ 0);
+ }
+}
+
+CosEventChannelAdmin::ProxyPushSupplier_ptr
+TAO_Notify_Builder::build_proxy (TAO_Notify_ConsumerAdmin* ca ACE_ENV_ARG_DECL)
+{
+ CosNotifyChannelAdmin::ProxyID proxy_id;
+
+ TAO_Notify_CosEC_ProxyPushSupplier_Builder pb;
+
+ CosNotification::QoSProperties initial_qos;
+
+ return pb.build (ca, proxy_id, initial_qos ACE_ENV_ARG_PARAMETER);
+}
+
+CosEventChannelAdmin::ProxyPushConsumer_ptr
+TAO_Notify_Builder::build_proxy (TAO_Notify_SupplierAdmin* sa ACE_ENV_ARG_DECL)
+{
+ CosNotifyChannelAdmin::ProxyID proxy_id;
+
+ TAO_Notify_CosEC_ProxyPushConsumer_Builder pb;
+
+ CosNotification::QoSProperties initial_qos;
+
+ return pb.build (sa, proxy_id, initial_qos ACE_ENV_ARG_PARAMETER);
+}
+
+void
+TAO_Notify_Builder::apply_reactive_concurrency (TAO_Notify_Object& object ACE_ENV_ARG_DECL)
+{
+ TAO_Notify_Reactive_Task* worker_task;
+
+ ACE_NEW_THROW_EX (worker_task,
+ TAO_Notify_Reactive_Task (),
+ CORBA::NO_MEMORY ());
+ ACE_CHECK;
+
+ object.set_worker_task (worker_task);
+
+ worker_task->init (ACE_ENV_SINGLE_ARG_PARAMETER);
+ ACE_CHECK;
+}
+
+void
+TAO_Notify_Builder::apply_thread_pool_concurrency (TAO_Notify_Object& object, const NotifyExt::ThreadPoolParams& tp_params ACE_ENV_ARG_DECL)
+{
+ TAO_Notify_ThreadPool_Task* worker_task;
+
+ ACE_NEW_THROW_EX (worker_task,
+ TAO_Notify_ThreadPool_Task (),
+ CORBA::NO_MEMORY ());
+ ACE_CHECK;
+
+ object.set_worker_task (worker_task);
+
+ worker_task->init (tp_params, object.admin_properties_ ACE_ENV_ARG_PARAMETER);
+ ACE_CHECK;
+}
+
+void
+TAO_Notify_Builder::apply_lane_concurrency (TAO_Notify_Object& /*object*/, const NotifyExt::ThreadPoolLanesParams& /*tpl_params*/ ACE_ENV_ARG_DECL)
+{
+ // No lane support
+ ACE_THROW (CORBA::NO_IMPLEMENT ());
+}
+
+TAO_END_VERSIONED_NAMESPACE_DECL
diff --git a/TAO/orbsvcs/orbsvcs/Notify/Builder.h b/TAO/orbsvcs/orbsvcs/Notify/Builder.h
new file mode 100644
index 00000000000..7ed2c219c65
--- /dev/null
+++ b/TAO/orbsvcs/orbsvcs/Notify/Builder.h
@@ -0,0 +1,175 @@
+/* -*- C++ -*- */
+/**
+ * @file Builder.h
+ *
+ * $Id$
+ *
+ * @author Pradeep Gore <pradeep@oomworks.com>
+ *
+ *
+ */
+
+#ifndef TAO_Notify_BUILDER_H
+#define TAO_Notify_BUILDER_H
+
+#include /**/ "ace/pre.h"
+
+#include "orbsvcs/Notify/notify_serv_export.h"
+
+#if !defined (ACE_LACKS_PRAGMA_ONCE)
+# pragma once
+#endif /* ACE_LACKS_PRAGMA_ONCE */
+
+#include "orbsvcs/CosNotifyChannelAdminC.h"
+#include "orbsvcs/NotifyExtC.h"
+
+#include "orbsvcs/Notify/AdminProperties.h"
+#include "orbsvcs/Notify/Topology_Object.h"
+
+#include "tao/PortableServer/PortableServer.h"
+
+TAO_BEGIN_VERSIONED_NAMESPACE_DECL
+
+class TAO_Notify_EventChannelFactory;
+class TAO_Notify_EventChannel;
+class TAO_Notify_SupplierAdmin;
+class TAO_Notify_ConsumerAdmin;
+class TAO_Notify_ProxyConsumer;
+class TAO_Notify_ProxySupplier;
+class TAO_Notify_FilterFactory;
+class TAO_Notify_Object;
+
+/**
+ * @class TAO_Notify_Builder
+ *
+ * @brief Helper class to create and activate CORBA objects.
+ *
+ */
+class TAO_Notify_Serv_Export TAO_Notify_Builder
+{
+public:
+ TAO_Notify_Builder (void);
+
+ virtual ~TAO_Notify_Builder ();
+
+ ///= Factory Methods
+
+ /// Build EventChannel Factory.
+ virtual CosNotifyChannelAdmin::EventChannelFactory_ptr
+ build_event_channel_factory (PortableServer::POA_ptr poa ACE_ENV_ARG_DECL);
+
+ /// Build the Filter Factory.
+ virtual CosNotifyFilter::FilterFactory_ptr build_filter_factory (
+ ACE_ENV_SINGLE_ARG_DECL
+ );
+
+ /// Build EventChannel.
+ virtual CosNotifyChannelAdmin::EventChannel_ptr
+ build_event_channel (TAO_Notify_EventChannelFactory* ecf
+ , const CosNotification::QoSProperties & initial_qos
+ , const CosNotification::AdminProperties & initial_admin
+ , CosNotifyChannelAdmin::ChannelID_out id
+ ACE_ENV_ARG_DECL);
+
+
+ virtual TAO_Notify_EventChannel *
+ build_event_channel (TAO_Notify_EventChannelFactory* ecf
+ , const CosNotifyChannelAdmin::ChannelID id
+ ACE_ENV_ARG_DECL);
+
+
+ /// Build ConsumerAdmin
+ virtual CosNotifyChannelAdmin::ConsumerAdmin_ptr
+ build_consumer_admin (TAO_Notify_EventChannel* ec
+ , CosNotifyChannelAdmin::InterFilterGroupOperator op
+ , CosNotifyChannelAdmin::AdminID_out id
+ ACE_ENV_ARG_DECL);
+
+ /// Build ConsumerAdmin during topology restore
+ /// TODO: this returns a reference to the actual type
+ /// to accomodate loadable builder/factory there should
+ /// be an appropriate base class for it to return.
+ virtual TAO_Notify_ConsumerAdmin *
+ build_consumer_admin (TAO_Notify_EventChannel* ec
+ , const CosNotifyChannelAdmin::AdminID id //CORBA::Long id // note: an in parameter!
+ ACE_ENV_ARG_DECL);
+
+ /// Build SupplierAdmin
+ virtual CosNotifyChannelAdmin::SupplierAdmin_ptr
+ build_supplier_admin (TAO_Notify_EventChannel * ec
+ , CosNotifyChannelAdmin::InterFilterGroupOperator op
+ , CosNotifyChannelAdmin::AdminID_out id
+ ACE_ENV_ARG_DECL);
+
+ /// Build ConsumerAdmin during topology restore
+ /// TODO: this returns a reference to the actual type
+ /// to accomodate loadable builder/factory there should
+ /// be an appropriate base class for it to return.
+ virtual TAO_Notify_SupplierAdmin *
+ build_supplier_admin (TAO_Notify_EventChannel * ec
+ , const CosNotifyChannelAdmin::AdminID id //CORBA::Long id // note: an in parameter!
+ ACE_ENV_ARG_DECL);
+
+ /// Build ProxyConsumer
+ virtual CosNotifyChannelAdmin::ProxyConsumer_ptr
+ build_proxy (TAO_Notify_SupplierAdmin* sa
+ , CosNotifyChannelAdmin::ClientType ctype
+ , CosNotifyChannelAdmin::ProxyID_out proxy_id
+ , const CosNotification::QoSProperties & initial_qos
+ ACE_ENV_ARG_DECL);
+
+ /// Reload ProxyConsumer
+ virtual TAO_Notify_ProxyConsumer *
+ build_proxy (TAO_Notify_SupplierAdmin* sa
+ , CosNotifyChannelAdmin::ClientType ctype
+ , const CosNotifyChannelAdmin::ProxyID proxy_id
+ ACE_ENV_ARG_DECL);
+
+ /// Build ProxySupplier.
+ virtual CosNotifyChannelAdmin::ProxySupplier_ptr
+ build_proxy (TAO_Notify_ConsumerAdmin* ca
+ , CosNotifyChannelAdmin::ClientType ctype
+ , CosNotifyChannelAdmin::ProxyID_out proxy_id
+ , const CosNotification::QoSProperties & initial_qos
+ ACE_ENV_ARG_DECL);
+
+ /// Reload ProxySupplier.
+ virtual TAO_Notify_ProxySupplier *
+ build_proxy (TAO_Notify_ConsumerAdmin* ca
+ , CosNotifyChannelAdmin::ClientType ctype
+ , const CosNotifyChannelAdmin::ProxyID proxy_id
+ ACE_ENV_ARG_DECL);
+
+ /// Build CosEC style ProxySupplier.
+ virtual CosEventChannelAdmin::ProxyPushSupplier_ptr
+ build_proxy (TAO_Notify_ConsumerAdmin* ca ACE_ENV_ARG_DECL);
+
+ /// Build CosEC style ProxyConsumer.
+ virtual CosEventChannelAdmin::ProxyPushConsumer_ptr
+ build_proxy (TAO_Notify_SupplierAdmin* sa ACE_ENV_ARG_DECL);
+
+ /// Apply Reactive concurrency.
+ virtual void apply_reactive_concurrency (
+ TAO_Notify_Object& object ACE_ENV_ARG_DECL
+ );
+
+ /// Apply Thread Pools.
+ virtual void apply_thread_pool_concurrency (
+ TAO_Notify_Object& object,
+ const NotifyExt::ThreadPoolParams& tp_params
+ ACE_ENV_ARG_DECL
+ );
+
+ /// Apply Thread Pools with Lanes.
+ virtual void apply_lane_concurrency (
+ TAO_Notify_Object& object,
+ const NotifyExt::ThreadPoolLanesParams& tpl_params
+ ACE_ENV_ARG_DECL
+ );
+};
+
+TAO_END_VERSIONED_NAMESPACE_DECL
+
+#include /**/ "ace/post.h"
+
+#endif /* TAO_Notify_BUILDER_H */
diff --git a/TAO/orbsvcs/orbsvcs/Notify/Consumer.cpp b/TAO/orbsvcs/orbsvcs/Notify/Consumer.cpp
new file mode 100644
index 00000000000..7b19b418ebc
--- /dev/null
+++ b/TAO/orbsvcs/orbsvcs/Notify/Consumer.cpp
@@ -0,0 +1,702 @@
+// $Id$
+
+#include "orbsvcs/Notify/Consumer.h"
+
+#if ! defined (__ACE_INLINE__)
+#include "orbsvcs/Notify/Consumer.inl"
+#endif /* __ACE_INLINE__ */
+
+ACE_RCSID (RT_Notify, TAO_Notify_Consumer, "$Id$")
+
+#include "orbsvcs/Notify/Timer.h"
+#include "orbsvcs/Notify/ProxySupplier.h"
+#include "orbsvcs/Notify/Method_Request_Event.h"
+
+#include "orbsvcs/Time_Utilities.h"
+
+#include "tao/debug.h"
+#include "tao/corba.h"
+
+#include "ace/Bound_Ptr.h"
+#include "ace/Unbounded_Queue.h"
+
+#ifndef DEBUG_LEVEL
+# define DEBUG_LEVEL TAO_debug_level
+#endif //DEBUG_LEVEL
+
+static const int DEFAULT_RETRY_TIMEOUT = 10;//120; // Note : This should be a config param or qos setting
+
+TAO_BEGIN_VERSIONED_NAMESPACE_DECL
+
+TAO_Notify_Consumer::TAO_Notify_Consumer (TAO_Notify_ProxySupplier* proxy)
+: proxy_ (proxy)
+, is_suspended_ (0)
+, pacing_ (proxy->qos_properties_.pacing_interval ())
+, max_batch_size_ (CosNotification::MaximumBatchSize, 0)
+, timer_id_ (-1)
+, timer_ (0)
+{
+ Request_Queue* pending_events = 0;
+ ACE_NEW (pending_events, TAO_Notify_Consumer::Request_Queue ());
+ this->pending_events_.reset( pending_events );
+
+ this->timer_.reset( this->proxy ()->timer () );
+}
+
+TAO_Notify_Consumer::~TAO_Notify_Consumer ()
+{
+ if (this->timer_.isSet())
+ {
+ this->cancel_timer ();
+ this->timer_.reset ();
+ }
+}
+
+TAO_Notify_Proxy*
+TAO_Notify_Consumer::proxy (void)
+{
+ return this->proxy_supplier ();
+}
+
+void
+TAO_Notify_Consumer::qos_changed (const TAO_Notify_QoSProperties& qos_properties)
+{
+ this->max_batch_size_ = qos_properties.maximum_batch_size ();
+}
+
+void
+TAO_Notify_Consumer::resume (ACE_ENV_SINGLE_ARG_DECL)
+{
+ this->is_suspended_ = 0;
+
+ this->dispatch_pending (ACE_ENV_SINGLE_ARG_PARAMETER);
+}
+
+void
+TAO_Notify_Consumer::enqueue_request (
+ TAO_Notify_Method_Request_Event * request
+ ACE_ENV_ARG_DECL)
+{
+ TAO_Notify_Event::Ptr event (
+ request->event ()->queueable_copy (ACE_ENV_SINGLE_ARG_PARAMETER));
+ ACE_CHECK;
+
+ TAO_Notify_Method_Request_Event_Queueable * queue_entry;
+ ACE_NEW_THROW_EX (queue_entry,
+ TAO_Notify_Method_Request_Event_Queueable (*request, event),
+ CORBA::NO_MEMORY ());
+ ACE_CHECK;
+
+ if (DEBUG_LEVEL > 3) ACE_DEBUG ( (LM_DEBUG,
+ ACE_TEXT ("Consumer %d: enqueue_request (%d) @%@.\n"),
+ static_cast<int> (this->proxy ()->id ()),
+ request->sequence (),
+ request
+ ));
+ ACE_GUARD (TAO_SYNCH_MUTEX, ace_mon, *this->proxy_lock ());
+ this->pending_events().enqueue_tail (queue_entry);
+}
+
+bool
+TAO_Notify_Consumer::enqueue_if_necessary (TAO_Notify_Method_Request_Event * request ACE_ENV_ARG_DECL)
+{
+ ACE_GUARD_RETURN (TAO_SYNCH_MUTEX, ace_mon, *this->proxy_lock (), false);
+ if (! this->pending_events().is_empty ())
+ {
+ if (DEBUG_LEVEL > 3)
+ ACE_DEBUG ((LM_DEBUG,
+ ACE_TEXT ("Consumer %d: enqueuing another event. %d\n"),
+ static_cast<int> (this->proxy ()->id ()),
+ request->sequence ()
+ ));
+ TAO_Notify_Event::Ptr event (
+ request->event ()->queueable_copy (ACE_ENV_SINGLE_ARG_PARAMETER));
+ ACE_CHECK_RETURN (false);
+ TAO_Notify_Method_Request_Event_Queueable * queue_entry;
+ ACE_NEW_THROW_EX (queue_entry,
+ TAO_Notify_Method_Request_Event_Queueable (*request,
+ event),
+ CORBA::NO_MEMORY ());
+ ACE_CHECK_RETURN (false);
+ this->pending_events().enqueue_tail (queue_entry);
+ this->schedule_timer (false);
+ return true;
+ }
+ if (this->is_suspended_ == 1)
+ {
+ if (DEBUG_LEVEL > 3)
+ ACE_DEBUG ((LM_DEBUG,
+ ACE_TEXT ("Suspended Consumer %d enqueing event. %d\n"),
+ static_cast<int> (this->proxy ()->id ()),
+ request->sequence ()
+ ));
+ TAO_Notify_Event::Ptr event (
+ request->event ()->queueable_copy (ACE_ENV_SINGLE_ARG_PARAMETER));
+ ACE_CHECK_RETURN (false);
+ TAO_Notify_Method_Request_Event_Queueable * queue_entry;
+ ACE_NEW_THROW_EX (queue_entry,
+ TAO_Notify_Method_Request_Event_Queueable (*request,
+ event),
+ CORBA::NO_MEMORY ());
+ ACE_CHECK_RETURN (false);
+ this->pending_events().enqueue_tail (queue_entry);
+ this->schedule_timer (false);
+ return true;
+ }
+ return false;
+}
+
+void
+TAO_Notify_Consumer::deliver (TAO_Notify_Method_Request_Event * request
+ ACE_ENV_ARG_DECL)
+{
+ // Increment reference counts (safely) to prevent this object and its proxy
+ // from being deleted while the push is in progress.
+ TAO_Notify_Proxy::Ptr proxy_guard (this->proxy ());
+ bool queued = enqueue_if_necessary (request ACE_ENV_ARG_PARAMETER);
+ ACE_CHECK;
+ if (!queued)
+ {
+ DispatchStatus status = this->dispatch_request (request);
+ switch (status)
+ {
+ case DISPATCH_SUCCESS:
+ {
+ request->complete ();
+ break;
+ }
+ case DISPATCH_RETRY:
+ {
+ if (DEBUG_LEVEL > 1)
+ ACE_DEBUG ((LM_DEBUG,
+ ACE_TEXT ("Consumer %d enqueing event %d due ")
+ ACE_TEXT ("to failed dispatch.\n"),
+ static_cast<int> (this->proxy ()->id ()),
+ request->sequence ()));
+ this->enqueue_request (request ACE_ENV_ARG_PARAMETER);
+ ACE_CHECK;
+ this->schedule_timer (true);
+ break;
+ }
+ case DISPATCH_DISCARD:
+ {
+ if (DEBUG_LEVEL > 0)
+ ACE_DEBUG ((LM_DEBUG,
+ ACE_TEXT ("(%P|%t) Consumer %d: Error during "
+ "direct dispatch. Discarding event:%d.\n"),
+ static_cast<int> (this->proxy ()->id ()),
+ request->sequence ()
+ ));
+ request->complete ();
+ break;
+ }
+ case DISPATCH_FAIL:
+ {
+ if (DEBUG_LEVEL > 0)
+ ACE_DEBUG ((LM_DEBUG,
+ ACE_TEXT ("(%P|%t) Consumer %d: Failed during "
+ "direct dispatch :%d. Discarding event.\n"),
+ static_cast<int> (this->proxy ()->id ()),
+ request->sequence ()
+ ));
+ request->complete ();
+ ACE_DECLARE_NEW_ENV;
+ ACE_TRY
+ {
+ this->proxy_supplier ()->destroy (ACE_ENV_SINGLE_ARG_PARAMETER);
+ ACE_TRY_CHECK;
+ }
+ ACE_CATCHANY
+ {
+ // todo is there something meaningful we can do here?
+ ;
+ }
+ ACE_ENDTRY;
+ break;
+ }
+ }
+ }
+}
+
+TAO_Notify_Consumer::DispatchStatus
+TAO_Notify_Consumer::dispatch_request (TAO_Notify_Method_Request_Event * request)
+{
+ DispatchStatus result = DISPATCH_SUCCESS;
+ ACE_DECLARE_NEW_ENV;
+ ACE_TRY
+ {
+ request->event ()->push (this ACE_ENV_ARG_PARAMETER);
+ ACE_TRY_CHECK;
+ if (DEBUG_LEVEL > 8)
+ ACE_DEBUG ((LM_DEBUG,
+ ACE_TEXT ("Consumer %d dispatched single event %d.\n"),
+ static_cast<int> (this->proxy ()->id ()),
+ request->sequence ()
+ ));
+ }
+ ACE_CATCH (CORBA::OBJECT_NOT_EXIST, ex)
+ {
+ if (DEBUG_LEVEL > 0)
+ {
+ ACE_DEBUG ((LM_ERROR,
+ ACE_TEXT ("(%P|%t) TAO_Notify_Consumer %d::push "
+ "(request) %s\n"),
+ static_cast<int> (this->proxy ()->id ()),
+ ex._info ().c_str ()
+ ));
+ }
+ result = DISPATCH_FAIL;
+ }
+ ACE_CATCH (CORBA::TRANSIENT, ex)
+ {
+ if (DEBUG_LEVEL > 0)
+ ACE_DEBUG ((LM_ERROR,
+ ACE_TEXT ("(%P|%t) TAO_Notify_Consumer %d::push "
+ "(request) Transient (minor=%d) %s\n"),
+ static_cast<int> (this->proxy ()->id ()),
+ ex.minor (),
+ ex._info ().c_str ()
+ ));
+ const CORBA::ULong BITS_5_THRU_12_MASK = 0x00000f80u;
+ switch (ex.minor () & 0xfffff000u)
+ {
+ case CORBA::OMGVMCID:
+ switch (ex.minor () & 0x00000fffu)
+ {
+ case 2: // No usable profile
+ case 3: // Request cancelled
+ case 4: // POA destroyed
+ result = DISPATCH_FAIL;
+ break;
+ default:
+ result = DISPATCH_DISCARD;
+ }
+ break;
+
+ case TAO::VMCID:
+ default:
+ switch (ex.minor () & BITS_5_THRU_12_MASK)
+ {
+ case TAO_INVOCATION_SEND_REQUEST_MINOR_CODE:
+ result = DISPATCH_FAIL;
+ break;
+ case TAO_POA_DISCARDING:
+ case TAO_POA_HOLDING:
+ default:
+ result = DISPATCH_RETRY;
+ } break;
+ }
+ }
+ ACE_CATCH (CORBA::TIMEOUT, ex)
+ {
+ if (DEBUG_LEVEL > 0)
+ ACE_DEBUG ((LM_ERROR,
+ ACE_TEXT ("(%P|%t) TAO_Notify_Consumer %u::push "
+ "(request) %s\n"),
+ this->proxy ()->id (),
+ ex._info().c_str ()
+ ));
+ result = DISPATCH_FAIL;
+ }
+ ACE_CATCH (CORBA::COMM_FAILURE, ex)
+ {
+ if (DEBUG_LEVEL > 0)
+ ACE_DEBUG ((LM_ERROR,
+ ACE_TEXT ("(%P|%t) TAO_Notify_Consumer %u::push "
+ "(request) %s\n"),
+ this->proxy ()->id (),
+ ex._info().c_str ()
+ ));
+ result = DISPATCH_FAIL;
+ }
+ ACE_CATCH (CORBA::SystemException, ex)
+ {
+ if (DEBUG_LEVEL > 0)
+ {
+ ACE_DEBUG ((LM_ERROR,
+ ACE_TEXT ("(%P|%t) TAO_Notify_Consumer %d::push "
+ "(request) SystemException %s\n"),
+ static_cast<int> (this->proxy ()->id ()),
+ ex._info ().c_str ()
+ ));
+ }
+ result = DISPATCH_DISCARD;
+ }
+ ACE_CATCHANY
+ {
+ ACE_ERROR ( (LM_ERROR,
+ ACE_TEXT ("(%P|%t) TAO_Notify_Consumer %d::push "
+ "(request) Caught unexpected exception "
+ "pushing event to consumer.\n"),
+ static_cast<int> (this->proxy ()->id ())
+ ));
+ result = DISPATCH_DISCARD;
+ }
+ ACE_ENDTRY;
+
+ // for persistent events that haven't timed out
+ // convert "FAIL" & "DISCARD" to "RETRY"
+ // for transient events, convert RETRY to DISCARD (hey, best_effort.)
+ if (result == DISPATCH_FAIL || result == DISPATCH_DISCARD)
+ {
+ if (request->should_retry ())
+ {
+ result = DISPATCH_RETRY;
+ }
+ }
+ else if (result == DISPATCH_RETRY)
+ {
+ if (! request->should_retry ())
+ {
+ result = DISPATCH_DISCARD;
+ }
+ }
+
+ return result;
+}
+
+TAO_Notify_Consumer::DispatchStatus
+TAO_Notify_Consumer::dispatch_batch (const CosNotification::EventBatch& batch)
+{
+ DispatchStatus result = DISPATCH_SUCCESS;
+ ACE_DECLARE_NEW_ENV;
+ ACE_TRY
+ {
+ this->push (batch ACE_ENV_ARG_PARAMETER);
+ ACE_TRY_CHECK;
+ }
+ ACE_CATCH (CORBA::OBJECT_NOT_EXIST, ex)
+ {
+ if (DEBUG_LEVEL > 0)
+ ACE_DEBUG ((LM_ERROR,
+ ACE_TEXT ("(%P|%t) TAO_Notify_Consumer "
+ "%d::dispatch_batch() %s\n"),
+ static_cast<int> (this->proxy ()->id ()),
+ ex._info ().c_str ()
+ ));
+ result = DISPATCH_FAIL;
+ }
+ ACE_CATCH (CORBA::TRANSIENT, ex)
+ {
+ if (DEBUG_LEVEL > 0)
+ ACE_DEBUG ((LM_ERROR,
+ ACE_TEXT ("(%P|%t) TAO_Notify_Consumer "
+ "%d::dispatch_batch() Transient (minor=%d) %s\n"),
+ static_cast<int> (this->proxy ()->id ()),
+ ex.minor (),
+ ex._info ().c_str ()
+ ));
+ const CORBA::ULong BITS_5_THRU_12_MASK = 0x00000f80u;
+ switch (ex.minor () & 0xfffff000u)
+ {
+ case CORBA::OMGVMCID:
+ switch (ex.minor () & 0x00000fffu)
+ {
+ case 2: // No usable profile
+ case 3: // Request cancelled
+ case 4: // POA destroyed
+ result = DISPATCH_FAIL;
+ break;
+ default:
+ result = DISPATCH_DISCARD;
+ }
+ break;
+
+ case TAO::VMCID:
+ default:
+ switch (ex.minor () & BITS_5_THRU_12_MASK)
+ {
+ case TAO_INVOCATION_SEND_REQUEST_MINOR_CODE:
+ result = DISPATCH_FAIL;
+ break;
+ case TAO_POA_DISCARDING:
+ case TAO_POA_HOLDING:
+ default:
+ result = DISPATCH_RETRY;
+ } break;
+ }
+ }
+ ACE_CATCH (CORBA::TIMEOUT, ex)
+ {
+ if (DEBUG_LEVEL > 0)
+ ACE_DEBUG ((LM_ERROR,
+ ACE_TEXT ("(%P|%t) TAO_Notify_Consumer "
+ "%u::dispatch_batch() %s\n"),
+ this->proxy ()->id (),
+ ex._info().c_str ()
+ ));
+ result = DISPATCH_FAIL;
+ }
+ ACE_CATCH (CORBA::COMM_FAILURE, ex)
+ {
+ if (DEBUG_LEVEL > 0)
+ ACE_DEBUG ((LM_ERROR,
+ ACE_TEXT ("(%P|%t) TAO_Notify_Consumer "
+ "%u::dispatch_batch() %s\n"),
+ this->proxy ()->id (),
+ ex._info().c_str ()
+ ));
+ result = DISPATCH_FAIL;
+ }
+ ACE_CATCH (CORBA::SystemException, ex)
+ {
+ if (DEBUG_LEVEL > 0)
+ {
+ ACE_DEBUG ((LM_ERROR,
+ ACE_TEXT ("(%P|%t) TAO_Notify_Consumer "
+ "%d::dispatch_batch() SystemException %s\n"),
+ static_cast<int> (this->proxy ()->id ()),
+ ex._info ().c_str ()
+ ));
+ }
+ result = DISPATCH_DISCARD;
+ }
+ ACE_CATCHANY
+ {
+ ACE_ERROR ((LM_ERROR,
+ ACE_TEXT ("(%P|%t) TAO_Notify_Consumer "
+ "%d::dispatch_batch() Caught unexpected "
+ "exception pushing batch to consumer.\n"),
+ static_cast<int> (this->proxy ()->id ())
+ ));
+ result = DISPATCH_DISCARD;
+ }
+ ACE_ENDTRY;
+ return result;
+}
+
+void
+TAO_Notify_Consumer::dispatch_pending (ACE_ENV_SINGLE_ARG_DECL_NOT_USED)
+{
+ if (DEBUG_LEVEL > 5)
+ ACE_DEBUG ((LM_DEBUG,
+ ACE_TEXT ("Consumer %d dispatching pending events. Queue size: %d\n"),
+ static_cast<int> (this->proxy ()->id ()),
+ this->pending_events().size ()
+ ));
+
+ // lock ourselves in memory for the duration
+ TAO_Notify_Consumer::Ptr self_grd (this);
+
+ // dispatch events until: 1) the queue is empty; 2) the proxy shuts down, or 3) the dispatch fails
+ ACE_GUARD (TAO_SYNCH_MUTEX, ace_mon, *this->proxy_lock ());
+ bool ok = true;
+ while (ok
+ && !this->proxy_supplier ()->has_shutdown ()
+ && !this->pending_events().is_empty ())
+ {
+ if (! dispatch_from_queue ( this->pending_events(), ace_mon))
+ {
+ this->schedule_timer (true);
+ ok = false;
+ }
+ }
+}
+
+
+// virtual: this is the default, overridden for SequencePushConsumer
+bool
+TAO_Notify_Consumer::dispatch_from_queue (Request_Queue & requests, ACE_Guard <TAO_SYNCH_MUTEX> & ace_mon)
+{
+ bool result = true;
+ TAO_Notify_Method_Request_Event_Queueable * request;
+ if (requests.dequeue_head (request) == 0)
+ {
+ ace_mon.release ();
+ DispatchStatus status = this->dispatch_request (request);
+ switch (status)
+ {
+ case DISPATCH_SUCCESS:
+ {
+ request->complete ();
+ request->release ();
+ result = true;
+ ace_mon.acquire ();
+ break;
+ }
+ case DISPATCH_RETRY:
+ {
+ if (DEBUG_LEVEL > 0)
+ ACE_DEBUG ((LM_DEBUG,
+ ACE_TEXT ("(%P|%t) Consumer %d: Will retry %d\n"),
+ static_cast<int> (this->proxy ()->id ()),
+ request->sequence ()
+ ));
+ ace_mon.acquire ();
+ requests.enqueue_head (request); // put the failed event back where it was
+ result = false;
+ break;
+ }
+ case DISPATCH_DISCARD:
+ {
+ if (DEBUG_LEVEL > 0)
+ ACE_DEBUG ((LM_DEBUG,
+ ACE_TEXT ("(%P|%t) Consumer %d: Error during "
+ "dispatch. Discarding event:%d.\n"),
+ static_cast<int> (this->proxy ()->id ()),
+ request->sequence ()
+ ));
+ request->complete ();
+ ace_mon.acquire ();
+ result = true;
+ break;
+ }
+ case DISPATCH_FAIL:
+ {
+ if (DEBUG_LEVEL > 0)
+ ACE_DEBUG ((LM_DEBUG,
+ ACE_TEXT ("(%P|%t) Consumer %d: Failed. "
+ "Discarding event %d.\n"),
+ static_cast<int> (this->proxy ()->id ()),
+ request->sequence ()
+ ));
+ request->complete ();
+ ace_mon.acquire ();
+ while (requests.dequeue_head (request) == 0)
+ {
+ ace_mon.release ();
+ request->complete ();
+ ace_mon.acquire ();
+ }
+ ace_mon.release ();
+ ACE_DECLARE_NEW_ENV;
+ ACE_TRY
+ {
+ this->proxy_supplier ()->destroy (ACE_ENV_SINGLE_ARG_PARAMETER);
+ ACE_TRY_CHECK;
+ }
+ ACE_CATCHANY
+ {
+ // todo is there something reasonable to do here?
+ }
+ ACE_ENDTRY;
+ ace_mon.acquire ();
+ result = true;
+ break;
+ }
+ default:
+ {
+ ace_mon.acquire ();
+ result = false;
+ break;
+ }
+ }
+ }
+ return result;
+}
+
+//@@todo: rather than is_error, use pacing interval so it will be configurable
+//@@todo: find some way to use batch buffering stratgy for sequence consumers.
+void
+TAO_Notify_Consumer::schedule_timer (bool is_error)
+{
+ if (this->timer_id_ != -1)
+ {
+ return; // We only want a single timeout scheduled.
+ }
+ // don't schedule timer if there's nothing that can be done
+ if (this->is_suspended ())
+ {
+ return;
+ }
+
+ ACE_ASSERT (this->timer_.get() != 0);
+
+ // If we're scheduling the timer due to an error then we want to
+ // use the retry timeout, otherwise we'll assume that the pacing
+ // interval is sufficient for now.
+ ACE_Time_Value tv (DEFAULT_RETRY_TIMEOUT);
+
+ if (! is_error)
+ {
+ if (this->pacing_.is_valid ())
+ {
+ tv = ORBSVCS_Time::to_Time_Value (this->pacing_.value ());
+ }
+ }
+
+ if (DEBUG_LEVEL > 5)
+ {
+ ACE_DEBUG ((LM_DEBUG,
+ ACE_TEXT ("Consumer %d: scheduling pacing/retry for %dms.\n"),
+ static_cast<int> (this->proxy ()->id ()), tv.msec ()));
+ }
+
+ this->timer_id_ =
+ this->timer_->schedule_timer (this, tv, ACE_Time_Value::zero);
+ if (this->timer_id_ == -1)
+ {
+ ACE_ERROR ((LM_ERROR,
+ ACE_TEXT ("TAO_Notify_Consumer %d::schedule_timer () "
+ "Error scheduling timer.\n"),
+ static_cast<int> (this->proxy ()->id ())
+ ));
+ }
+}
+
+void
+TAO_Notify_Consumer::cancel_timer (void)
+{
+ if (this->timer_.isSet() && this->timer_id_ != -1)
+ {
+ if (DEBUG_LEVEL > 5)
+ ACE_DEBUG ((LM_DEBUG,
+ ACE_TEXT ("Consumer %d canceling dispatch timer.\n"),
+ static_cast<int> (this->proxy ()->id ())
+ ));
+
+ this->timer_->cancel_timer (timer_id_);
+ }
+ this->timer_id_ = -1;
+}
+
+int
+TAO_Notify_Consumer::handle_timeout (const ACE_Time_Value&, const void*)
+{
+ TAO_Notify_Consumer::Ptr grd (this);
+ this->timer_id_ = -1; // This must come first, because dispatch_pending may try to resched
+ ACE_DECLARE_NEW_ENV;
+ ACE_TRY
+ {
+ this->dispatch_pending (ACE_ENV_SINGLE_ARG_PARAMETER);
+ ACE_TRY_CHECK;
+ }
+ ACE_CATCHALL
+ {
+ }
+ ACE_ENDTRY;
+
+ return 0;
+}
+
+void
+TAO_Notify_Consumer::shutdown (ACE_ENV_SINGLE_ARG_DECL_NOT_USED)
+{
+ if (this->timer_.isSet ())
+ {
+ this->cancel_timer ();
+ this->timer_.reset ();
+ }
+}
+
+void
+TAO_Notify_Consumer::dispatch_updates_i (const CosNotification::EventTypeSeq& added, const CosNotification::EventTypeSeq& removed
+ ACE_ENV_ARG_DECL)
+{
+ if (!CORBA::is_nil (this->publish_.in ()))
+ this->publish_->offer_change (added, removed ACE_ENV_ARG_PARAMETER);
+}
+
+TAO_SYNCH_MUTEX*
+TAO_Notify_Consumer::proxy_lock (void)
+{
+ return &this->proxy_->lock_;
+}
+
+TAO_Notify_ProxySupplier*
+TAO_Notify_Consumer::proxy_supplier (void)
+{
+ return this->proxy_;
+}
+
+TAO_END_VERSIONED_NAMESPACE_DECL
diff --git a/TAO/orbsvcs/orbsvcs/Notify/Consumer.h b/TAO/orbsvcs/orbsvcs/Notify/Consumer.h
new file mode 100644
index 00000000000..43b591b51e4
--- /dev/null
+++ b/TAO/orbsvcs/orbsvcs/Notify/Consumer.h
@@ -0,0 +1,195 @@
+/* -*- C++ -*- */
+/**
+ * @file Consumer.h
+ *
+ * $Id$
+ *
+ * @author Pradeep Gore <pradeep@oomworks.com>
+ *
+ *
+ */
+
+#ifndef TAO_NOTIFY_CONSUMER_H
+#define TAO_NOTIFY_CONSUMER_H
+
+#include /**/ "ace/pre.h"
+
+#include "orbsvcs/Notify/notify_serv_export.h"
+
+#if !defined (ACE_LACKS_PRAGMA_ONCE)
+# pragma once
+#endif /* ACE_LACKS_PRAGMA_ONCE */
+
+#include "orbsvcs/CosNotifyCommC.h"
+#include "orbsvcs/CosNotificationC.h"
+
+#include "orbsvcs/Notify/Peer.h"
+#include "orbsvcs/Notify/Event.h"
+#include "orbsvcs/Notify/Timer.h"
+#include "ace/Event_Handler.h"
+
+
+TAO_BEGIN_VERSIONED_NAMESPACE_DECL
+
+class TAO_Notify_ProxySupplier;
+class TAO_Notify_Proxy;
+class TAO_Notify_Method_Request_Event_Queueable;
+class TAO_Notify_Method_Request_Event;
+/**
+ * @class TAO_Notify_Consumer
+ *
+ * @brief Astract Base class for wrapping consumer objects that connect to the EventChannel
+ *
+ */
+class TAO_Notify_Serv_Export TAO_Notify_Consumer
+ : public TAO_Notify_Peer
+ , public ACE_Event_Handler // to support timer
+{
+
+public:
+ /// Status returned from dispatch attempts
+ enum DispatchStatus {
+ DISPATCH_SUCCESS,
+ DISPATCH_RETRY, // retry this message
+ DISPATCH_DISCARD, // discard this message
+ DISPATCH_FAIL}; // discard all messages and disconnect consumer
+
+public:
+ /// Constuctor
+ TAO_Notify_Consumer (TAO_Notify_ProxySupplier* proxy);
+
+ /// Destructor
+ virtual ~TAO_Notify_Consumer ();
+
+ /// Access Specific Proxy.
+ TAO_Notify_ProxySupplier* proxy_supplier (void);
+
+ /// Access Base Proxy.
+ virtual TAO_Notify_Proxy* proxy (void);
+
+ /// Dispatch Event to consumer
+ void deliver (TAO_Notify_Method_Request_Event * request ACE_ENV_ARG_DECL);
+
+ /// Push <event> to this consumer.
+ virtual void push (const CORBA::Any& event ACE_ENV_ARG_DECL) = 0;
+
+ /// Push <event> to this consumer.
+ virtual void push (const CosNotification::StructuredEvent& event ACE_ENV_ARG_DECL) = 0;
+
+ /// Push a batch of events to this consumer.
+ virtual void push (const CosNotification::EventBatch& event ACE_ENV_ARG_DECL) = 0;
+
+ /// Dispatch the batch of events to the attached consumer
+ DispatchStatus dispatch_batch (const CosNotification::EventBatch& batch);
+
+ /// Dispatch the pending events
+ void dispatch_pending (ACE_ENV_SINGLE_ARG_DECL);
+
+ /// Is the connection suspended?
+ CORBA::Boolean is_suspended (void);
+
+ /// Suspend Connection
+ void suspend (ACE_ENV_SINGLE_ARG_DECL);
+
+ /// Resume Connection
+ void resume (ACE_ENV_SINGLE_ARG_DECL);
+
+ /// Shutdown the consumer
+ virtual void shutdown (ACE_ENV_SINGLE_ARG_DECL);
+
+ /// on reconnect we need to move events from the old consumer
+ /// to the new one
+ virtual void reconnect_from_consumer (
+ TAO_Notify_Consumer* old_consumer
+ ACE_ENV_ARG_DECL) = 0;
+
+ /// Override, Peer::qos_changed
+ virtual void qos_changed (const TAO_Notify_QoSProperties& qos_properties);
+
+protected:
+ typedef ACE_Unbounded_Queue<TAO_Notify_Method_Request_Event_Queueable *> Request_Queue;
+
+ DispatchStatus dispatch_request (TAO_Notify_Method_Request_Event * request);
+
+ /**
+ * \brief Attempt to dispatch event from a queue.
+ *
+ * Called by dispatch_pending. Deliver one or more events to the Consumer.
+ * If delivery fails, events are left in the queue (or discarded depending
+ * on QoS parameters.)
+ * Undelivered, undiscarded requests are left at the front of the queue.
+ * Overridden in sequence consumer to dispatch as an EventBatch.
+ * \return false if delivery failed and the request(s) cannot be discarded.
+ */
+ virtual bool dispatch_from_queue (
+ Request_Queue & requests,
+ ACE_Guard <TAO_SYNCH_MUTEX> & ace_mon);
+
+ void enqueue_request(TAO_Notify_Method_Request_Event * request ACE_ENV_ARG_DECL);
+
+ /// Add request to a queue if necessary.
+ /// Overridden by sequence consumer to "always" put incoming events into the queue.
+ /// @returns true the request has been enqueued; false the request should be handled now.
+ virtual bool enqueue_if_necessary(
+ TAO_Notify_Method_Request_Event * request
+ ACE_ENV_ARG_DECL);
+
+ // Dispatch updates
+ virtual void dispatch_updates_i (const CosNotification::EventTypeSeq& added,
+ const CosNotification::EventTypeSeq& removed
+ ACE_ENV_ARG_DECL);
+
+ /// Get the shared Proxy Lock
+ TAO_SYNCH_MUTEX* proxy_lock (void);
+
+protected:
+ virtual int handle_timeout (const ACE_Time_Value& current_time,
+ const void* act = 0);
+
+
+ /// Schedule timer
+ void schedule_timer (bool is_error = false);
+
+ /// Cancel timer
+ void cancel_timer (void);
+
+ ///= Protected Data Members
+protected:
+ Request_Queue& pending_events();
+
+ /// The Proxy that we associate with.
+ TAO_Notify_ProxySupplier* proxy_;
+
+ /// Suspended Flag.
+ CORBA::Boolean is_suspended_;
+
+ /// Interface that accepts offer_changes
+ CosNotifyComm::NotifyPublish_var publish_;
+
+ /// The Pacing Interval
+ const TAO_Notify_Property_Time & pacing_;
+
+ /// Max. batch size.
+ TAO_Notify_Property_Long max_batch_size_;
+
+ /// Timer Id.
+ long timer_id_;
+
+ /// The Timer Manager that we use.
+ TAO_Notify_Timer::Ptr timer_;
+
+private:
+
+ /// Events pending to be delivered.
+ ACE_Auto_Ptr< Request_Queue > pending_events_;
+};
+
+TAO_END_VERSIONED_NAMESPACE_DECL
+
+#if defined (__ACE_INLINE__)
+#include "orbsvcs/Notify/Consumer.inl"
+#endif /* __ACE_INLINE__ */
+
+#include /**/ "ace/post.h"
+
+#endif /* TAO_NOTIFY_CONSUMER_H */
diff --git a/TAO/orbsvcs/orbsvcs/Notify/Consumer.inl b/TAO/orbsvcs/orbsvcs/Notify/Consumer.inl
new file mode 100644
index 00000000000..c1dcd33bbe7
--- /dev/null
+++ b/TAO/orbsvcs/orbsvcs/Notify/Consumer.inl
@@ -0,0 +1,27 @@
+// -*- C++ -*-
+//
+// $Id$
+
+TAO_BEGIN_VERSIONED_NAMESPACE_DECL
+
+ACE_INLINE
+TAO_Notify_Consumer::Request_Queue&
+TAO_Notify_Consumer::pending_events()
+{
+ ACE_ASSERT( pending_events_.get() != 0 );
+ return *pending_events_;
+}
+
+ACE_INLINE CORBA::Boolean
+TAO_Notify_Consumer::is_suspended (void)
+{
+ return this->is_suspended_;
+}
+
+ACE_INLINE void
+TAO_Notify_Consumer::suspend (ACE_ENV_SINGLE_ARG_DECL_NOT_USED)
+{
+ this->is_suspended_ = 1;
+}
+
+TAO_END_VERSIONED_NAMESPACE_DECL
diff --git a/TAO/orbsvcs/orbsvcs/Notify/ConsumerAdmin.cpp b/TAO/orbsvcs/orbsvcs/Notify/ConsumerAdmin.cpp
new file mode 100644
index 00000000000..7b10e3bd40b
--- /dev/null
+++ b/TAO/orbsvcs/orbsvcs/Notify/ConsumerAdmin.cpp
@@ -0,0 +1,488 @@
+// $Id$
+
+#include "orbsvcs/Notify/ConsumerAdmin.h"
+
+ACE_RCSID (RT_Notify,
+ TAO_Notify_ConsumerAdmin,
+ "$Id$")
+
+#include "orbsvcs/Notify/Subscription_Change_Worker.h"
+#include "orbsvcs/Notify/Proxy.h"
+#include "orbsvcs/Notify/EventChannel.h"
+#include "orbsvcs/Notify/Properties.h"
+#include "orbsvcs/Notify/Factory.h"
+#include "orbsvcs/Notify/Builder.h"
+#include "orbsvcs/Notify/Find_Worker_T.h"
+#include "orbsvcs/Notify/Seq_Worker_T.h"
+#include "orbsvcs/Notify/ProxySupplier.h"
+
+#include "tao/debug.h"
+
+#include "orbsvcs/ESF/ESF_Proxy_Collection.h"
+
+#include "ace/Auto_Ptr.h"
+
+//#define DEBUG_LEVEL 9
+#ifndef DEBUG_LEVEL
+# define DEBUG_LEVEL TAO_debug_level
+#endif //DEBUG_LEVEL
+
+TAO_BEGIN_VERSIONED_NAMESPACE_DECL
+
+typedef TAO_Notify_Find_Worker_T<TAO_Notify_Proxy
+ , CosNotifyChannelAdmin::ProxySupplier
+ , CosNotifyChannelAdmin::ProxySupplier_ptr
+ , CosNotifyChannelAdmin::ProxyNotFound>
+TAO_Notify_ProxySupplier_Find_Worker;
+
+typedef TAO_Notify_Seq_Worker_T<TAO_Notify_Proxy> TAO_Notify_Proxy_Seq_Worker;
+
+TAO_Notify_ConsumerAdmin::TAO_Notify_ConsumerAdmin (void)
+ : TAO_Notify_Admin ()
+{
+}
+
+const char *
+TAO_Notify_ConsumerAdmin::get_admin_type_name () const
+{
+ return "consumer_admin";
+}
+
+
+
+TAO_Notify_ConsumerAdmin::~TAO_Notify_ConsumerAdmin ()
+{
+}
+
+void
+TAO_Notify_ConsumerAdmin::init (TAO_Notify_EventChannel *ec ACE_ENV_ARG_DECL)
+{
+ TAO_Notify_Admin::init (ec ACE_ENV_ARG_PARAMETER);
+ ACE_CHECK;
+
+ const CosNotification::QoSProperties &default_ca_qos =
+ TAO_Notify_PROPERTIES::instance ()->default_consumer_admin_qos_properties ();
+
+ this->set_qos (default_ca_qos ACE_ENV_ARG_PARAMETER);
+ ACE_CHECK;
+}
+
+void
+TAO_Notify_ConsumerAdmin::_add_ref (ACE_ENV_SINGLE_ARG_DECL_NOT_USED)
+{
+ this->_incr_refcnt ();
+}
+
+void
+TAO_Notify_ConsumerAdmin::_remove_ref (ACE_ENV_SINGLE_ARG_DECL_NOT_USED)
+{
+ this->_decr_refcnt ();
+}
+
+void
+TAO_Notify_ConsumerAdmin::release (void)
+{
+ delete this;
+ //@@ inform factory
+}
+
+void
+TAO_Notify_ConsumerAdmin::destroy (ACE_ENV_SINGLE_ARG_DECL)
+ ACE_THROW_SPEC ((
+ CORBA::SystemException
+ ))
+{
+ int result = this->shutdown (ACE_ENV_SINGLE_ARG_PARAMETER);
+ ACE_CHECK;
+ if ( result == 1)
+ return;
+
+ this->ec_->remove (this ACE_ENV_ARG_PARAMETER);
+ ACE_CHECK;
+}
+
+
+TAO_Notify::Topology_Object*
+TAO_Notify_ConsumerAdmin::load_child (const ACE_CString &type,
+ CORBA::Long id, const TAO_Notify::NVPList& attrs ACE_ENV_ARG_DECL)
+{
+ TAO_Notify::Topology_Object* result = this;
+ if (type == "proxy_push_supplier")
+ {
+ if (DEBUG_LEVEL) ACE_DEBUG ((LM_DEBUG,
+ ACE_TEXT ("(%P|%t) Admin reload proxy %d\n")
+ , static_cast<int> (id)
+ ));
+ result = this->load_proxy(id, CosNotifyChannelAdmin::ANY_EVENT, attrs ACE_ENV_ARG_PARAMETER);
+ ACE_CHECK_RETURN (0);
+ }
+ else if (type == "structured_proxy_push_supplier")
+ {
+ if (DEBUG_LEVEL) ACE_DEBUG ((LM_DEBUG,
+ ACE_TEXT ("(%P|%t) Admin reload proxy %d\n")
+ , static_cast<int> (id)
+ ));
+ result = this->load_proxy(id, CosNotifyChannelAdmin::STRUCTURED_EVENT, attrs ACE_ENV_ARG_PARAMETER);
+ ACE_CHECK_RETURN (0);
+ }
+ else if (type == "sequence_proxy_push_supplier")
+ {
+ if (DEBUG_LEVEL) ACE_DEBUG ((LM_DEBUG,
+ ACE_TEXT ("(%P|%t) Admin reload proxy %d\n")
+ , static_cast<int> (id)
+ ));
+ result = this->load_proxy(id, CosNotifyChannelAdmin::SEQUENCE_EVENT, attrs ACE_ENV_ARG_PARAMETER);
+ ACE_CHECK_RETURN (0);
+ }
+#if 0
+ else if (type == "ec_proxy_push_supplier")
+ {
+ if (DEBUG_LEVEL) ACE_DEBUG ((LM_DEBUG,
+ ACE_TEXT ("(%P|%t) Admin reload proxy %d\n")
+ , static_cast<int> (id)
+ ));
+ result = this->load_proxy(id, attrs ACE_ENV_ARG_PARAMETER);
+ ACE_CHECK_RETURN (0);
+ }
+#endif
+ else
+ {
+ result = TAO_Notify_Admin::load_child (type, id, attrs ACE_ENV_ARG_PARAMETER);
+ ACE_CHECK_RETURN (0);
+ }
+ return result;
+}
+
+TAO_Notify::Topology_Object*
+TAO_Notify_ConsumerAdmin::load_proxy (
+ CORBA::Long id,
+ CosNotifyChannelAdmin::ClientType ctype,
+ const TAO_Notify::NVPList& attrs ACE_ENV_ARG_DECL)
+{
+ TAO_Notify_Builder* bld = TAO_Notify_PROPERTIES::instance()->builder();
+ TAO_Notify_ProxySupplier * proxy =
+ bld->build_proxy (this
+ , ctype
+ , id
+ ACE_ENV_ARG_PARAMETER);
+ ACE_CHECK_RETURN(0);
+ ACE_ASSERT(proxy != 0);
+ proxy->load_attrs (attrs);
+ return proxy;
+}
+
+CosNotifyChannelAdmin::ProxySupplier_ptr
+TAO_Notify_ConsumerAdmin::obtain_notification_push_supplier (CosNotifyChannelAdmin::ClientType ctype,
+ CosNotifyChannelAdmin::ProxyID_out proxy_id
+ ACE_ENV_ARG_DECL
+ )
+ ACE_THROW_SPEC ((
+ CORBA::SystemException
+ , CosNotifyChannelAdmin::AdminLimitExceeded
+ ))
+{
+ CosNotification::QoSProperties initial_qos;
+
+ CosNotifyChannelAdmin::ProxySupplier_var proxy =
+ TAO_Notify_PROPERTIES::instance()->builder()->build_proxy (this
+ , ctype
+ , proxy_id
+ , initial_qos
+ ACE_ENV_ARG_PARAMETER);
+ ACE_CHECK_RETURN (proxy._retn ());
+ this->self_change (ACE_ENV_SINGLE_ARG_PARAMETER);
+ ACE_CHECK_RETURN (proxy._retn ());
+ return proxy._retn ();
+}
+
+CosNotifyChannelAdmin::ProxySupplier_ptr
+TAO_Notify_ConsumerAdmin::obtain_notification_push_supplier_with_qos (CosNotifyChannelAdmin::ClientType ctype,
+ CosNotifyChannelAdmin::ProxyID_out proxy_id,
+ const CosNotification::QoSProperties & initial_qos
+ ACE_ENV_ARG_DECL
+ )
+ ACE_THROW_SPEC ((
+ CORBA::SystemException
+ , CosNotifyChannelAdmin::AdminLimitExceeded
+ , CosNotification::UnsupportedQoS
+ ))
+{
+ CosNotifyChannelAdmin::ProxySupplier_var proxy =
+ TAO_Notify_PROPERTIES::instance()->builder()->build_proxy (this
+ , ctype
+ , proxy_id
+ , initial_qos
+ ACE_ENV_ARG_PARAMETER);
+ ACE_CHECK_RETURN (proxy._retn ());
+ this->self_change (ACE_ENV_SINGLE_ARG_PARAMETER);
+ ACE_CHECK_RETURN (proxy._retn ());
+ return proxy._retn ();
+}
+
+CosEventChannelAdmin::ProxyPushSupplier_ptr
+TAO_Notify_ConsumerAdmin::obtain_push_supplier (ACE_ENV_SINGLE_ARG_DECL)
+ ACE_THROW_SPEC ((
+ CORBA::SystemException
+ ))
+{
+ CosEventChannelAdmin::ProxyPushSupplier_var proxy =
+ TAO_Notify_PROPERTIES::instance()->builder()->build_proxy (this ACE_ENV_ARG_PARAMETER);
+ ACE_CHECK_RETURN (proxy._retn ());
+ this->self_change (ACE_ENV_SINGLE_ARG_PARAMETER);
+ ACE_CHECK_RETURN (proxy._retn ());
+ return proxy._retn ();
+}
+
+CosNotifyChannelAdmin::AdminID
+TAO_Notify_ConsumerAdmin::MyID (ACE_ENV_SINGLE_ARG_DECL_NOT_USED)
+ ACE_THROW_SPEC ((
+ CORBA::SystemException
+ ))
+{
+ return this->id ();
+}
+
+CosNotifyChannelAdmin::EventChannel_ptr
+TAO_Notify_ConsumerAdmin::MyChannel (ACE_ENV_SINGLE_ARG_DECL)
+ ACE_THROW_SPEC ((
+ CORBA::SystemException
+ ))
+{
+ return this->ec_->_this (ACE_ENV_SINGLE_ARG_PARAMETER);
+}
+
+::CosNotifyChannelAdmin::InterFilterGroupOperator
+TAO_Notify_ConsumerAdmin::MyOperator (ACE_ENV_SINGLE_ARG_DECL_NOT_USED)
+ ACE_THROW_SPEC ((
+ CORBA::SystemException
+ ))
+{
+ return this->filter_operator_;
+}
+
+CosNotifyChannelAdmin::ProxyIDSeq*
+TAO_Notify_ConsumerAdmin::push_suppliers (ACE_ENV_SINGLE_ARG_DECL)
+ ACE_THROW_SPEC ((
+ CORBA::SystemException
+ ))
+{
+ TAO_Notify_Proxy_Seq_Worker seq_worker;
+
+ return seq_worker.create (this->proxy_container() ACE_ENV_ARG_PARAMETER);
+}
+
+CosNotifyChannelAdmin::ProxySupplier_ptr
+TAO_Notify_ConsumerAdmin::get_proxy_supplier (CosNotifyChannelAdmin::ProxyID proxy_id ACE_ENV_ARG_DECL)
+ ACE_THROW_SPEC ((
+ CORBA::SystemException
+ , CosNotifyChannelAdmin::ProxyNotFound
+ ))
+{
+ TAO_Notify_ProxySupplier_Find_Worker find_worker;
+
+ return find_worker.resolve (proxy_id, this->proxy_container() ACE_ENV_ARG_PARAMETER);
+}
+
+void TAO_Notify_ConsumerAdmin::set_qos (const CosNotification::QoSProperties & qos ACE_ENV_ARG_DECL)
+ ACE_THROW_SPEC ((
+ CORBA::SystemException
+ , CosNotification::UnsupportedQoS
+ ))
+{
+ this->TAO_Notify_Object::set_qos (qos ACE_ENV_ARG_PARAMETER);
+}
+
+
+CosNotification::QoSProperties*
+TAO_Notify_ConsumerAdmin::get_qos (ACE_ENV_SINGLE_ARG_DECL)
+ ACE_THROW_SPEC ((
+ CORBA::SystemException
+ ))
+{
+ return this->TAO_Notify_Object::get_qos (ACE_ENV_SINGLE_ARG_PARAMETER);
+}
+
+void
+TAO_Notify_ConsumerAdmin::subscription_change (const CosNotification::EventTypeSeq & added,
+ const CosNotification::EventTypeSeq & removed
+ ACE_ENV_ARG_DECL
+ )
+ ACE_THROW_SPEC ((
+ CORBA::SystemException
+ , CosNotifyComm::InvalidEventType
+ ))
+{
+ TAO_Notify_EventTypeSeq seq_added (added);
+ TAO_Notify_EventTypeSeq seq_removed (removed);
+
+ {
+ ACE_GUARD_THROW_EX (TAO_SYNCH_MUTEX, ace_mon, this->lock_,
+ CORBA::INTERNAL ());
+ ACE_CHECK;
+
+ this->subscribed_types_.add_and_remove (seq_added, seq_removed);
+
+ TAO_Notify_Subscription_Change_Worker worker (added, removed);
+
+ this->proxy_container().collection()->for_each (&worker ACE_ENV_ARG_PARAMETER);
+ ACE_CHECK;
+ }
+ this->self_change (ACE_ENV_SINGLE_ARG_PARAMETER);
+ ACE_CHECK;
+}
+
+CosNotifyFilter::FilterID
+TAO_Notify_ConsumerAdmin::add_filter (CosNotifyFilter::Filter_ptr new_filter ACE_ENV_ARG_DECL)
+ ACE_THROW_SPEC ((
+ CORBA::SystemException
+ ))
+{
+ CosNotifyFilter::FilterID fid =
+ this->filter_admin_.add_filter (new_filter ACE_ENV_ARG_PARAMETER);
+ ACE_CHECK_RETURN (fid);
+ this->self_change (ACE_ENV_SINGLE_ARG_PARAMETER);
+ ACE_CHECK_RETURN (fid);
+ return fid;
+}
+
+void
+TAO_Notify_ConsumerAdmin::remove_filter (CosNotifyFilter::FilterID filter ACE_ENV_ARG_DECL)
+ ACE_THROW_SPEC ((
+ CORBA::SystemException
+ , CosNotifyFilter::FilterNotFound
+ ))
+{
+ this->filter_admin_.remove_filter (filter ACE_ENV_ARG_PARAMETER);
+}
+
+::CosNotifyFilter::Filter_ptr
+TAO_Notify_ConsumerAdmin::get_filter (CosNotifyFilter::FilterID filter ACE_ENV_ARG_DECL)
+ ACE_THROW_SPEC ((
+ CORBA::SystemException
+ , CosNotifyFilter::FilterNotFound
+ ))
+{
+ return this->filter_admin_.get_filter (filter ACE_ENV_ARG_PARAMETER);
+}
+
+::CosNotifyFilter::FilterIDSeq*
+TAO_Notify_ConsumerAdmin::get_all_filters (ACE_ENV_SINGLE_ARG_DECL)
+ ACE_THROW_SPEC ((
+ CORBA::SystemException
+ ))
+{
+ return this->filter_admin_.get_all_filters (ACE_ENV_SINGLE_ARG_PARAMETER);
+}
+
+void
+TAO_Notify_ConsumerAdmin::remove_all_filters (ACE_ENV_SINGLE_ARG_DECL)
+ ACE_THROW_SPEC ((
+ CORBA::SystemException
+ ))
+{
+ this->filter_admin_.remove_all_filters (ACE_ENV_SINGLE_ARG_PARAMETER);
+}
+
+/************ UNIMPLMENTED METHODS *************************/
+
+CosNotifyFilter::MappingFilter_ptr
+TAO_Notify_ConsumerAdmin::priority_filter (ACE_ENV_SINGLE_ARG_DECL)
+ ACE_THROW_SPEC ((
+ CORBA::SystemException
+ ))
+{
+ ACE_THROW_RETURN (CORBA::NO_IMPLEMENT (), CosNotifyFilter::MappingFilter::_nil ());
+}
+
+void
+TAO_Notify_ConsumerAdmin::priority_filter (CosNotifyFilter::MappingFilter_ptr /*priority_filter*/ ACE_ENV_ARG_DECL)
+ ACE_THROW_SPEC ((
+ CORBA::SystemException
+ ))
+
+{
+ ACE_THROW (CORBA::NO_IMPLEMENT ());
+}
+
+CosNotifyFilter::MappingFilter_ptr
+TAO_Notify_ConsumerAdmin::lifetime_filter (ACE_ENV_SINGLE_ARG_DECL)
+ ACE_THROW_SPEC ((
+ CORBA::SystemException
+ ))
+
+{
+ ACE_THROW_RETURN (CORBA::NO_IMPLEMENT (), CosNotifyFilter::MappingFilter::_nil ());
+}
+
+void
+TAO_Notify_ConsumerAdmin::lifetime_filter (CosNotifyFilter::MappingFilter_ptr /*lifetime_filter*/ ACE_ENV_ARG_DECL)
+ ACE_THROW_SPEC ((
+ CORBA::SystemException
+ ))
+{
+ ACE_THROW (CORBA::NO_IMPLEMENT ());
+}
+
+::CosNotifyChannelAdmin::ProxyIDSeq*
+TAO_Notify_ConsumerAdmin::pull_suppliers (ACE_ENV_SINGLE_ARG_DECL)
+ ACE_THROW_SPEC ((
+ CORBA::SystemException
+ ))
+{
+ ACE_THROW_RETURN (CORBA::NO_IMPLEMENT (), 0);
+}
+
+CosNotifyChannelAdmin::ProxySupplier_ptr
+TAO_Notify_ConsumerAdmin::obtain_notification_pull_supplier (CosNotifyChannelAdmin::ClientType /*ctype*/,
+ CosNotifyChannelAdmin::ProxyID_out /*proxy_id*/
+ ACE_ENV_ARG_DECL)
+ ACE_THROW_SPEC ((
+ CORBA::SystemException
+ , CosNotifyChannelAdmin::AdminLimitExceeded
+ ))
+
+{
+ ACE_THROW_RETURN (CORBA::NO_IMPLEMENT (), CosNotifyChannelAdmin::ProxySupplier::_nil ());
+}
+
+void
+TAO_Notify_ConsumerAdmin::validate_qos (const CosNotification::QoSProperties & /*required_qos*/,
+ CosNotification::NamedPropertyRangeSeq_out /*available_qos*/
+ ACE_ENV_ARG_DECL
+ )
+ ACE_THROW_SPEC ((
+ CORBA::SystemException
+ , CosNotification::UnsupportedQoS
+ ))
+{
+ ACE_THROW (CORBA::NO_IMPLEMENT ());
+}
+
+CosEventChannelAdmin::ProxyPullSupplier_ptr
+TAO_Notify_ConsumerAdmin::obtain_pull_supplier (ACE_ENV_SINGLE_ARG_DECL)
+ ACE_THROW_SPEC ((
+ CORBA::SystemException
+ ))
+{
+ ACE_THROW_RETURN (CORBA::NO_IMPLEMENT (), CosEventChannelAdmin::ProxyPullSupplier::_nil ());
+}
+
+TAO_Notify_ProxySupplier *
+TAO_Notify_ConsumerAdmin::find_proxy_supplier (
+ TAO_Notify::IdVec & id_path,
+ size_t position
+ ACE_ENV_ARG_DECL)
+{
+ TAO_Notify_ProxySupplier * result = 0;
+ size_t path_size = id_path.size ();
+ if (position < path_size)
+ {
+ TAO_Notify_ProxySupplier_Find_Worker find_worker;
+ TAO_Notify_Proxy * proxy = find_worker.find (id_path[position], this->proxy_container() ACE_ENV_ARG_PARAMETER);
+ ACE_CHECK_RETURN (0);
+ result = dynamic_cast <TAO_Notify_ProxySupplier *> (proxy);
+ }
+ return result;
+}
+
+TAO_END_VERSIONED_NAMESPACE_DECL
diff --git a/TAO/orbsvcs/orbsvcs/Notify/ConsumerAdmin.h b/TAO/orbsvcs/orbsvcs/Notify/ConsumerAdmin.h
new file mode 100644
index 00000000000..a17453cfc07
--- /dev/null
+++ b/TAO/orbsvcs/orbsvcs/Notify/ConsumerAdmin.h
@@ -0,0 +1,254 @@
+/* -*- C++ -*- */
+/**
+ * @file ConsumerAdmin.h
+ *
+ * $Id$
+ *
+ * @author Pradeep Gore <pradeep@oomworks.com>
+ *
+ *
+ */
+
+#ifndef TAO_Notify_CONSUMERADMIN_H
+#define TAO_Notify_CONSUMERADMIN_H
+
+#include /**/ "ace/pre.h"
+
+#include "orbsvcs/Notify/notify_serv_export.h"
+
+#if !defined (ACE_LACKS_PRAGMA_ONCE)
+# pragma once
+#endif /* ACE_LACKS_PRAGMA_ONCE */
+
+#include "orbsvcs/NotifyExtS.h"
+
+#include "orbsvcs/Notify/Admin.h"
+
+#if defined(_MSC_VER)
+#pragma warning(push)
+#pragma warning(disable:4250)
+#endif /* _MSC_VER */
+
+TAO_BEGIN_VERSIONED_NAMESPACE_DECL
+
+class TAO_Notify_ProxySupplier;
+
+/**
+ * @class TAO_Notify_ConsumerAdmin
+ *
+ * @brief Implementation of CosNotifyChannelAdmin::ConsumerAdmin
+ *
+ */
+class TAO_Notify_Serv_Export TAO_Notify_ConsumerAdmin : public POA_NotifyExt::ConsumerAdmin
+ , public virtual TAO_Notify_Admin
+{
+public:
+ typedef TAO_Notify_Refcountable_Guard_T< TAO_Notify_ConsumerAdmin > Ptr;
+ /// Constuctor
+ TAO_Notify_ConsumerAdmin (void);
+
+ /// Destructor
+ virtual ~TAO_Notify_ConsumerAdmin ();
+
+ /// Init
+ void init (TAO_Notify_EventChannel *ec ACE_ENV_ARG_DECL);
+
+ /// ServantBase refcount methods.
+ virtual void _add_ref (ACE_ENV_SINGLE_ARG_DECL);
+ virtual void _remove_ref (ACE_ENV_SINGLE_ARG_DECL);
+
+
+ virtual const char * get_admin_type_name () const;
+
+ virtual TAO_Notify::Topology_Object* load_child (
+ const ACE_CString &type,
+ CORBA::Long id,
+ const TAO_Notify::NVPList& attrs
+ ACE_ENV_ARG_DECL);
+
+ TAO_Notify_ProxySupplier * find_proxy_supplier (
+ TAO_Notify::IdVec & id_path,
+ size_t position
+ ACE_ENV_ARG_DECL);
+
+protected:
+ TAO_Notify::Topology_Object *load_proxy (
+ CORBA::Long id,
+ CosNotifyChannelAdmin::ClientType ctype,
+ const TAO_Notify::NVPList& attrs
+ ACE_ENV_ARG_DECL);
+
+ /// = NotifyExt::ConsumerAdmin methods
+ virtual CosNotifyChannelAdmin::ProxySupplier_ptr
+ obtain_notification_push_supplier_with_qos (CosNotifyChannelAdmin::ClientType ctype,
+ CosNotifyChannelAdmin::ProxyID_out proxy_id,
+ const CosNotification::QoSProperties & initial_qos
+ ACE_ENV_ARG_DECL
+ )
+ ACE_THROW_SPEC ((
+ CORBA::SystemException
+ , CosNotifyChannelAdmin::AdminLimitExceeded
+ , CosNotification::UnsupportedQoS
+ ));
+
+ /// = CosNotifyChannelAdmin::ConsumerAdmin methods
+ virtual CosNotifyChannelAdmin::AdminID MyID (ACE_ENV_SINGLE_ARG_DECL)
+ ACE_THROW_SPEC ((
+ CORBA::SystemException
+ ));
+
+ virtual ::CosNotifyChannelAdmin::EventChannel_ptr MyChannel (ACE_ENV_SINGLE_ARG_DECL
+
+ )
+ ACE_THROW_SPEC ((
+ CORBA::SystemException
+ ));
+
+ virtual ::CosNotifyChannelAdmin::InterFilterGroupOperator MyOperator (ACE_ENV_SINGLE_ARG_DECL)
+ ACE_THROW_SPEC ((
+ CORBA::SystemException
+ ));
+
+ virtual ::CosNotifyFilter::MappingFilter_ptr priority_filter (ACE_ENV_SINGLE_ARG_DECL
+
+ )
+ ACE_THROW_SPEC ((
+ CORBA::SystemException
+ ));
+
+ virtual void priority_filter (CosNotifyFilter::MappingFilter_ptr priority_filter ACE_ENV_ARG_DECL)
+ ACE_THROW_SPEC ((
+ CORBA::SystemException
+ ));
+
+ virtual ::CosNotifyFilter::MappingFilter_ptr lifetime_filter (ACE_ENV_SINGLE_ARG_DECL)
+ ACE_THROW_SPEC ((
+ CORBA::SystemException
+ ));
+
+ virtual void lifetime_filter (CosNotifyFilter::MappingFilter_ptr lifetime_filter
+ ACE_ENV_ARG_DECL)
+ ACE_THROW_SPEC ((
+ CORBA::SystemException
+ ));
+
+ virtual ::CosNotifyChannelAdmin::ProxyIDSeq * pull_suppliers (ACE_ENV_SINGLE_ARG_DECL)
+ ACE_THROW_SPEC ((
+ CORBA::SystemException
+ ));
+
+ virtual ::CosNotifyChannelAdmin::ProxyIDSeq * push_suppliers (ACE_ENV_SINGLE_ARG_DECL)
+ ACE_THROW_SPEC ((
+ CORBA::SystemException
+ ));
+
+ virtual ::CosNotifyChannelAdmin::ProxySupplier_ptr get_proxy_supplier (CosNotifyChannelAdmin::ProxyID proxy_id
+ ACE_ENV_ARG_DECL)
+ ACE_THROW_SPEC ((
+ CORBA::SystemException
+ , CosNotifyChannelAdmin::ProxyNotFound
+ ));
+
+ virtual ::CosNotifyChannelAdmin::ProxySupplier_ptr
+ obtain_notification_pull_supplier (CosNotifyChannelAdmin::ClientType ctype,
+ CosNotifyChannelAdmin::ProxyID_out proxy_id
+ ACE_ENV_ARG_DECL)
+ ACE_THROW_SPEC ((
+ CORBA::SystemException
+ , CosNotifyChannelAdmin::AdminLimitExceeded
+ ));
+
+ virtual ::CosNotifyChannelAdmin::ProxySupplier_ptr
+ obtain_notification_push_supplier (CosNotifyChannelAdmin::ClientType ctype,
+ CosNotifyChannelAdmin::ProxyID_out proxy_id
+ ACE_ENV_ARG_DECL)
+ ACE_THROW_SPEC ((
+ CORBA::SystemException
+ , CosNotifyChannelAdmin::AdminLimitExceeded
+ ));
+
+ virtual void destroy (ACE_ENV_SINGLE_ARG_DECL)
+ ACE_THROW_SPEC ((
+ CORBA::SystemException
+ ));
+
+ virtual ::CosNotification::QoSProperties * get_qos (ACE_ENV_SINGLE_ARG_DECL)
+ ACE_THROW_SPEC ((
+ CORBA::SystemException
+ ));
+
+ virtual void set_qos (const CosNotification::QoSProperties & qos
+ ACE_ENV_ARG_DECL)
+ ACE_THROW_SPEC ((
+ CORBA::SystemException
+ , CosNotification::UnsupportedQoS
+ ));
+
+ virtual void validate_qos (const CosNotification::QoSProperties & required_qos,
+ CosNotification::NamedPropertyRangeSeq_out available_qos
+ ACE_ENV_ARG_DECL)
+ ACE_THROW_SPEC ((
+ CORBA::SystemException
+ , CosNotification::UnsupportedQoS
+ ));
+
+ virtual void subscription_change (const CosNotification::EventTypeSeq & added,
+ const CosNotification::EventTypeSeq & removed
+ ACE_ENV_ARG_DECL)
+ ACE_THROW_SPEC ((
+ CORBA::SystemException
+ , CosNotifyComm::InvalidEventType
+ ));
+
+ virtual CosNotifyFilter::FilterID add_filter (CosNotifyFilter::Filter_ptr new_filter ACE_ENV_ARG_DECL)
+ ACE_THROW_SPEC ((
+ CORBA::SystemException
+ ));
+
+ virtual void remove_filter (CosNotifyFilter::FilterID filter ACE_ENV_ARG_DECL)
+ ACE_THROW_SPEC ((
+ CORBA::SystemException
+ , CosNotifyFilter::FilterNotFound
+ ));
+
+ virtual ::CosNotifyFilter::Filter_ptr get_filter (CosNotifyFilter::FilterID filter ACE_ENV_ARG_DECL)
+ ACE_THROW_SPEC ((
+ CORBA::SystemException
+ , CosNotifyFilter::FilterNotFound
+ ));
+
+ virtual ::CosNotifyFilter::FilterIDSeq * get_all_filters (ACE_ENV_SINGLE_ARG_DECL)
+ ACE_THROW_SPEC ((
+ CORBA::SystemException
+ ));
+
+ virtual void remove_all_filters (ACE_ENV_SINGLE_ARG_DECL)
+ ACE_THROW_SPEC ((
+ CORBA::SystemException
+ ));
+
+ virtual ::CosEventChannelAdmin::ProxyPushSupplier_ptr obtain_push_supplier (ACE_ENV_SINGLE_ARG_DECL)
+ ACE_THROW_SPEC ((
+ CORBA::SystemException
+ ));
+
+ virtual ::CosEventChannelAdmin::ProxyPullSupplier_ptr obtain_pull_supplier (ACE_ENV_SINGLE_ARG_DECL)
+ ACE_THROW_SPEC ((
+ CORBA::SystemException
+ ));
+
+private:
+
+ /// Release this object.
+ virtual void release (void);
+};
+
+TAO_END_VERSIONED_NAMESPACE_DECL
+
+#if defined(_MSC_VER)
+#pragma warning(pop)
+#endif /* _MSC_VER */
+
+#include /**/ "ace/post.h"
+
+#endif /* TAO_Notify_CONSUMERADMIN_H */
diff --git a/TAO/orbsvcs/orbsvcs/Notify/Consumer_Map.h b/TAO/orbsvcs/orbsvcs/Notify/Consumer_Map.h
new file mode 100644
index 00000000000..eec7e570347
--- /dev/null
+++ b/TAO/orbsvcs/orbsvcs/Notify/Consumer_Map.h
@@ -0,0 +1,43 @@
+/* -*- C++ -*- */
+/**
+ * @file Consumer_Map.h
+ *
+ * $Id$
+ *
+ * @author Pradeep Gore <pradeep@oomworks.com>
+ *
+ *
+ */
+
+#ifndef TAO_Notify_CONSUMER_MAP_H
+#define TAO_Notify_CONSUMER_MAP_H
+
+#include /**/ "ace/pre.h"
+
+#include "orbsvcs/Notify/notify_serv_export.h"
+
+#if !defined (ACE_LACKS_PRAGMA_ONCE)
+# pragma once
+#endif /* ACE_LACKS_PRAGMA_ONCE */
+
+
+#include "orbsvcs/Notify/Event_Map_T.h"
+#include "orbsvcs/Notify/ProxySupplier.h"
+
+TAO_BEGIN_VERSIONED_NAMESPACE_DECL
+
+/**
+ * @class TAO_Notify_Consumer_Map
+ *
+ * @brief The Event Map for Consumers.
+ *
+ */
+typedef TAO_Notify_Event_Map_T<TAO_Notify_ProxySupplier,
+ TAO_SYNCH_RW_MUTEX>
+ TAO_Notify_Consumer_Map;
+
+TAO_END_VERSIONED_NAMESPACE_DECL
+
+#include /**/ "ace/post.h"
+
+#endif /* TAO_Notify_CONSUMER_MAP_H */
diff --git a/TAO/orbsvcs/orbsvcs/Notify/Container_T.cpp b/TAO/orbsvcs/orbsvcs/Notify/Container_T.cpp
new file mode 100644
index 00000000000..3656e3dca86
--- /dev/null
+++ b/TAO/orbsvcs/orbsvcs/Notify/Container_T.cpp
@@ -0,0 +1,65 @@
+// $Id$
+
+#ifndef TAO_Notify_CONTAINER_T_CPP
+#define TAO_Notify_CONTAINER_T_CPP
+
+#include "orbsvcs/Notify/Container_T.h"
+
+#include "orbsvcs/Notify/Properties.h"
+#include "orbsvcs/Notify/Factory.h"
+#include "orbsvcs/Notify/POA_Helper.h"
+
+#include "orbsvcs/ESF/ESF_Proxy_Collection.h"
+#include "orbsvcs/ESF/ESF_Shutdown_Proxy.h"
+
+#if ! defined (__ACE_INLINE__)
+#include "orbsvcs/Notify/Container_T.inl"
+#endif /* __ACE_INLINE__ */
+
+TAO_BEGIN_VERSIONED_NAMESPACE_DECL
+
+template<class TYPE>
+TAO_Notify_Container_T<TYPE>::TAO_Notify_Container_T (void)
+ : collection_ (0)
+{
+}
+
+template<class TYPE>
+TAO_Notify_Container_T<TYPE>::~TAO_Notify_Container_T ()
+{
+ delete collection_;
+}
+
+template <class TYPE> void
+TAO_Notify_Container_T<TYPE>::shutdown (ACE_ENV_SINGLE_ARG_DECL)
+{
+ TAO_ESF_Shutdown_Proxy<TYPE> shutdown_worker;
+
+ this->collection_->for_each (&shutdown_worker ACE_ENV_ARG_PARAMETER);
+}
+
+template<class TYPE> void
+TAO_Notify_Container_T<TYPE>::insert (TYPE* type ACE_ENV_ARG_DECL)
+{
+ this->collection_->connected (type ACE_ENV_ARG_PARAMETER);
+}
+
+template<class TYPE> void
+TAO_Notify_Container_T<TYPE>::remove (TYPE* type ACE_ENV_ARG_DECL)
+{
+ this->collection_->disconnected (type ACE_ENV_ARG_PARAMETER);
+}
+
+template<class TYPE> void
+TAO_Notify_Container_T<TYPE>::init (ACE_ENV_SINGLE_ARG_DECL)
+{
+ // get the factory
+ TAO_Notify_Factory* factory = TAO_Notify_PROPERTIES::instance ()->factory ();
+
+ // Init variables
+ factory->create (this->collection_ ACE_ENV_ARG_PARAMETER);
+}
+
+TAO_END_VERSIONED_NAMESPACE_DECL
+
+#endif /* TAO_Notify_CONTAINER_T_CPP */
diff --git a/TAO/orbsvcs/orbsvcs/Notify/Container_T.h b/TAO/orbsvcs/orbsvcs/Notify/Container_T.h
new file mode 100644
index 00000000000..9c06930d1b2
--- /dev/null
+++ b/TAO/orbsvcs/orbsvcs/Notify/Container_T.h
@@ -0,0 +1,82 @@
+/* -*- C++ -*- */
+/**
+ * @file Container_T.h
+ *
+ * $Id$
+ *
+ * @author Pradeep Gore <pradeep@oomworks.com>
+ *
+ *
+ */
+
+#ifndef TAO_Notify_CONTAINER_T_H
+#define TAO_Notify_CONTAINER_T_H
+
+#include /**/ "ace/pre.h"
+
+#include "orbsvcs/Notify/notify_serv_export.h"
+
+#if !defined (ACE_LACKS_PRAGMA_ONCE)
+# pragma once
+#endif /* ACE_LACKS_PRAGMA_ONCE */
+
+#include "orbsvcs/ESF/ESF_Proxy_Collection.h"
+
+TAO_BEGIN_VERSIONED_NAMESPACE_DECL
+
+/**
+ * @class TAO_Notify_Container_T
+ *
+ * @brief A template class that manages a collection.
+ * TYPE = type of collection
+ *
+ */
+template <class TYPE>
+class TAO_Notify_Serv_Export TAO_Notify_Container_T
+{
+ typedef TAO_ESF_Proxy_Collection<TYPE> COLLECTION;
+ public:
+
+ /// Constuctor
+ TAO_Notify_Container_T (void);
+
+ /// Destructor
+ virtual ~TAO_Notify_Container_T ();
+
+ /// Init this object.
+ void init (ACE_ENV_SINGLE_ARG_DECL);
+
+ /// Insert object to this container.
+ virtual void insert (TYPE* type ACE_ENV_ARG_DECL);
+
+ /// Remove type from container_
+ virtual void remove (TYPE* type ACE_ENV_ARG_DECL);
+
+ /// Shutdown
+ virtual void shutdown (ACE_ENV_SINGLE_ARG_DECL);
+
+ /// Collection
+ COLLECTION* collection (void);
+
+protected:
+ /// The collection data structure that we add objects to.
+ COLLECTION* collection_;
+};
+
+TAO_END_VERSIONED_NAMESPACE_DECL
+
+#if defined (__ACE_INLINE__)
+#include "orbsvcs/Notify/Container_T.inl"
+#endif /* __ACE_INLINE__ */
+
+#if defined (ACE_TEMPLATES_REQUIRE_SOURCE)
+#include "orbsvcs/Notify/Container_T.cpp"
+#endif /* ACE_TEMPLATES_REQUIRE_SOURCE */
+
+#if defined (ACE_TEMPLATES_REQUIRE_PRAGMA)
+#pragma implementation ("Container_T.cpp")
+#endif /* ACE_TEMPLATES_REQUIRE_PRAGMA */
+
+#include /**/ "ace/post.h"
+
+#endif /* TAO_Notify_CONTAINER_T_H */
diff --git a/TAO/orbsvcs/orbsvcs/Notify/Container_T.inl b/TAO/orbsvcs/orbsvcs/Notify/Container_T.inl
new file mode 100644
index 00000000000..ccf274aecbf
--- /dev/null
+++ b/TAO/orbsvcs/orbsvcs/Notify/Container_T.inl
@@ -0,0 +1,13 @@
+// -*- C++ -*-
+//
+// $Id$
+
+TAO_BEGIN_VERSIONED_NAMESPACE_DECL
+
+template<class TYPE> ACE_INLINE ACE_TYPENAME TAO_Notify_Container_T<TYPE>::COLLECTION*
+TAO_Notify_Container_T<TYPE>:: collection (void)
+{
+ return this->collection_;
+}
+
+TAO_END_VERSIONED_NAMESPACE_DECL
diff --git a/TAO/orbsvcs/orbsvcs/Notify/CosNotify_Initializer.cpp b/TAO/orbsvcs/orbsvcs/Notify/CosNotify_Initializer.cpp
new file mode 100644
index 00000000000..86d6e46106a
--- /dev/null
+++ b/TAO/orbsvcs/orbsvcs/Notify/CosNotify_Initializer.cpp
@@ -0,0 +1,17 @@
+// $Id$
+
+#include "orbsvcs/Notify/CosNotify_Initializer.h"
+
+ACE_RCSID(Notify, TAO_Notify_CosNotify_Initializer, "$Id$")
+
+#include "orbsvcs/Notify/CosNotify_Service.h"
+
+TAO_BEGIN_VERSIONED_NAMESPACE_DECL
+
+TAO_Notify_CosNotify_Initializer::TAO_Notify_CosNotify_Initializer (void)
+{
+ ACE_Service_Config::static_svcs ()->insert (&ace_svc_desc_TAO_CosNotify_Service);
+ ACE_Service_Config::static_svcs ()->insert (&ace_svc_desc_TAO_Notify_Default_EMO_Factory_OLD);
+}
+
+TAO_END_VERSIONED_NAMESPACE_DECL
diff --git a/TAO/orbsvcs/orbsvcs/Notify/CosNotify_Initializer.h b/TAO/orbsvcs/orbsvcs/Notify/CosNotify_Initializer.h
new file mode 100644
index 00000000000..ce08ffd76eb
--- /dev/null
+++ b/TAO/orbsvcs/orbsvcs/Notify/CosNotify_Initializer.h
@@ -0,0 +1,44 @@
+/* -*- C++ -*- */
+/**
+ * @file CosNotify_Initializer.h
+ *
+ * $Id$
+ *
+ * @author Pradeep Gore <pradeep@oomworks.com>
+ *
+ *
+ */
+
+#ifndef TAO_Notify_COSNOTIFY_INITIALIZER_H
+#define TAO_Notify_COSNOTIFY_INITIALIZER_H
+#include /**/ "ace/pre.h"
+
+#include "orbsvcs/Notify/notify_serv_export.h"
+
+#if !defined (ACE_LACKS_PRAGMA_ONCE)
+# pragma once
+#endif /* ACE_LACKS_PRAGMA_ONCE */
+
+#include "tao/Versioned_Namespace.h"
+
+TAO_BEGIN_VERSIONED_NAMESPACE_DECL
+
+/**
+ * @class TAO_Notify_CosNotify_Initializer
+ *
+ * @brief Helper to load the Cos Notification service into the service conf. for static links.
+ *
+ */
+class TAO_Notify_Serv_Export TAO_Notify_CosNotify_Initializer
+{
+public:
+ /// Constuctor
+ TAO_Notify_CosNotify_Initializer (void);
+};
+
+static TAO_Notify_CosNotify_Initializer TAO_Notify_CosNotify_initializer;
+
+TAO_END_VERSIONED_NAMESPACE_DECL
+
+#include /**/ "ace/post.h"
+#endif /* TAO_Notify_COSNOTIFY_INITIALIZER_H */
diff --git a/TAO/orbsvcs/orbsvcs/Notify/CosNotify_Service.cpp b/TAO/orbsvcs/orbsvcs/Notify/CosNotify_Service.cpp
new file mode 100644
index 00000000000..2128c1852a4
--- /dev/null
+++ b/TAO/orbsvcs/orbsvcs/Notify/CosNotify_Service.cpp
@@ -0,0 +1,314 @@
+// $Id$
+
+#include "orbsvcs/Notify/CosNotify_Service.h"
+#include "orbsvcs/Notify/Properties.h"
+#include "orbsvcs/Notify/Default_Factory.h"
+#include "orbsvcs/Notify/Builder.h"
+#include "ace/Sched_Params.h"
+#include "ace/Arg_Shifter.h"
+#include "ace/Dynamic_Service.h"
+#include "tao/ORB_Core.h"
+#include "orbsvcs/NotifyExtC.h"
+#include "tao/debug.h"
+
+ACE_RCSID (Notify,
+ TAO_CosNotify_Service,
+ "$Id$")
+
+TAO_BEGIN_VERSIONED_NAMESPACE_DECL
+
+TAO_CosNotify_Service::TAO_CosNotify_Service (void)
+{
+}
+
+TAO_CosNotify_Service::~TAO_CosNotify_Service ()
+{
+}
+
+int
+TAO_CosNotify_Service::init (int argc, ACE_TCHAR *argv[])
+{
+ ACE_Arg_Shifter arg_shifter (argc, argv);
+
+ const ACE_TCHAR *current_arg = 0;
+
+ // Default to an all reactive system.
+ int ec_threads = 0;
+ int consumer_threads = 0;
+ int supplier_threads = 0;
+
+ int task_per_proxy = 0;
+
+ TAO_Notify_Properties *properties = TAO_Notify_PROPERTIES::instance();
+
+ while (arg_shifter.is_anything_left ())
+ {
+ if (arg_shifter.cur_arg_strncasecmp (ACE_TEXT("-MTDispatching")) == 0)
+ {
+ arg_shifter.consume_arg ();
+ ACE_DEBUG ((LM_DEBUG,
+ ACE_TEXT ("(%P|%t) The -MTDispatching option has been deprecated, use -DispatchingThreads \n")));
+ }
+ else if (0 != (current_arg = arg_shifter.get_the_parameter (ACE_TEXT("-DispatchingThreads"))))
+ {
+ consumer_threads += ACE_OS::atoi (current_arg);
+ arg_shifter.consume_arg ();
+ }
+ else if (arg_shifter.cur_arg_strncasecmp (ACE_TEXT("-MTSourceEval")) == 0)
+ {
+ arg_shifter.consume_arg ();
+ ACE_DEBUG ((LM_DEBUG,
+ ACE_TEXT ("(%P|%t) The -MTSourceEval option has been deprecated, use -SourceThreads \n")));
+ }
+ else if (0 != (current_arg = arg_shifter.get_the_parameter (ACE_TEXT("-SourceThreads"))))
+ {
+ supplier_threads += ACE_OS::atoi (current_arg);
+ arg_shifter.consume_arg ();
+ }
+ else if (arg_shifter.cur_arg_strncasecmp (ACE_TEXT("-MTLookup")) == 0)
+ {
+ arg_shifter.consume_arg ();
+ ACE_DEBUG ((LM_DEBUG,
+ ACE_TEXT ("(%P|%t) The -MTLookup option has been deprecated, use -SourceThreads \n")));
+ }
+ else if (0 != (current_arg = arg_shifter.get_the_parameter (ACE_TEXT("-LookupThreads"))))
+ {
+ supplier_threads += ACE_OS::atoi (current_arg);
+ arg_shifter.consume_arg ();
+ ACE_DEBUG ((LM_DEBUG,
+ ACE_TEXT ("(%P|%t) The -LookupThreads option has been deprecated, use -SourceThreads \n")));
+ }
+ else if (arg_shifter.cur_arg_strncasecmp (ACE_TEXT("-MTListenerEval")) == 0)
+ {
+ arg_shifter.consume_arg ();
+ ACE_DEBUG ((LM_DEBUG,
+ ACE_TEXT ("(%P|%t) The -MTListenerEval option has been deprecated, use -DispatchingThreads \n")));
+ }
+ else if (0 != (current_arg = arg_shifter.get_the_parameter (ACE_TEXT("-ListenerThreads"))))
+ {
+ // Since this option is always added to consumer_threads, we'll
+ // deprecate it in favor of that option.
+ ACE_DEBUG ((LM_DEBUG,
+ ACE_TEXT ("(%P|%t) The -ListenerThreads option has been deprecated, use -DispatchingThreads \n")));
+ consumer_threads += ACE_OS::atoi (current_arg);
+ arg_shifter.consume_arg ();
+ }
+ else if (arg_shifter.cur_arg_strncasecmp (ACE_TEXT("-AsynchUpdates")) == 0)
+ {
+ arg_shifter.consume_arg ();
+
+ properties->asynch_updates (1);
+ }
+ else if (arg_shifter.cur_arg_strncasecmp (ACE_TEXT("-NoUpdates")) == 0)
+ {
+ arg_shifter.consume_arg ();
+
+ properties->updates (0);
+ }
+ else if (arg_shifter.cur_arg_strncasecmp (ACE_TEXT("-AllocateTaskperProxy")) == 0)
+ {
+ task_per_proxy = 1;
+ arg_shifter.consume_arg ();
+ }
+ else if (arg_shifter.cur_arg_strncasecmp (ACE_TEXT("-AllowReconnect")) == 0)
+ {
+ arg_shifter.consume_arg ();
+ TAO_Notify_PROPERTIES::instance()->allow_reconnect (true);
+ }
+ else
+ {
+ ACE_ERROR ((LM_ERROR,
+ ACE_TEXT ("(%P|%t) Ignoring unknown option for Notify Factory: %s\n"),
+ arg_shifter.get_current()
+ ));
+ arg_shifter.consume_arg ();
+ }
+ }
+
+ // Init the EC QoS
+ {
+ CosNotification::QoSProperties qos;
+ this->set_threads (qos, ec_threads);
+ properties->default_event_channel_qos_properties (qos);
+ }
+
+ if (task_per_proxy == 0)
+ {
+ // Set the per ConsumerAdmin QoS
+ {
+ if (consumer_threads > 0)
+ ACE_DEBUG((LM_DEBUG, "Using %d threads for each ConsumerAdmin.\n", consumer_threads));
+ CosNotification::QoSProperties qos;
+ this->set_threads (qos, consumer_threads);
+ properties->default_consumer_admin_qos_properties (qos);
+ }
+
+ // Set the per SupplierAdmin QoS
+ {
+ if (supplier_threads > 0)
+ ACE_DEBUG((LM_DEBUG, "Using %d threads for each SupplierAdmin.\n", supplier_threads));
+ CosNotification::QoSProperties qos;
+ this->set_threads (qos, supplier_threads);
+ properties->default_supplier_admin_qos_properties (qos);
+ }
+ }
+ else
+ {
+ // Set the per ProxyConsumer QoS
+ {
+ if (supplier_threads > 0)
+ ACE_DEBUG((LM_DEBUG, "Using %d threads for each Supplier.\n", supplier_threads));
+ CosNotification::QoSProperties qos;
+ this->set_threads (qos, supplier_threads); // lookup thread per proxy doesn't make sense.
+ properties->default_proxy_consumer_qos_properties (qos);
+ }
+
+ // Set the per ProxySupplier QoS
+ {
+ if (consumer_threads > 0)
+ ACE_DEBUG((LM_DEBUG, "Using %d threads for each Consumer.\n", consumer_threads));
+ CosNotification::QoSProperties qos;
+ this->set_threads (qos, consumer_threads);
+ properties->default_proxy_supplier_qos_properties (qos);
+ }
+ }
+
+ return 0;
+}
+
+void
+TAO_CosNotify_Service::set_threads (CosNotification::QoSProperties &qos, int threads)
+{
+ NotifyExt::ThreadPoolParams tp_params =
+ {NotifyExt::CLIENT_PROPAGATED, 0, 0, (unsigned)threads, 0, 0, 0, 0, 0 };
+
+ qos.length (1);
+ qos[0].name = CORBA::string_dup (NotifyExt::ThreadPool);
+ qos[0].value <<= tp_params;
+}
+
+int
+TAO_CosNotify_Service::fini (void)
+{
+ return 0;
+}
+
+void
+TAO_CosNotify_Service::init_service (CORBA::ORB_ptr orb ACE_ENV_ARG_DECL)
+{
+ ACE_DEBUG ((LM_DEBUG, "Loading the Cos Notification Service...\n"));
+
+ this->init_i (orb ACE_ENV_ARG_PARAMETER);
+ ACE_CHECK;
+}
+
+void
+TAO_CosNotify_Service::init_i (CORBA::ORB_ptr orb ACE_ENV_ARG_DECL)
+{
+ // Obtain the Root POA
+ CORBA::Object_var object =
+ orb->resolve_initial_references("RootPOA" ACE_ENV_ARG_PARAMETER);
+ ACE_CHECK;
+
+ if (CORBA::is_nil (object.in ()))
+ ACE_ERROR ((LM_ERROR,
+ " (%P|%t) Unable to resolve the RootPOA.\n"));
+
+ PortableServer::POA_var default_poa = PortableServer::POA::_narrow (object.in () ACE_ENV_ARG_PARAMETER);
+ ACE_CHECK;
+
+ /// Set the properties
+ TAO_Notify_Properties* properties = TAO_Notify_PROPERTIES::instance();
+
+ properties->orb (orb);
+ properties->default_poa (default_poa.in ());
+
+ // Init the factory
+ this->factory_.reset (this->create_factory (ACE_ENV_SINGLE_ARG_PARAMETER));
+ ACE_CHECK;
+ ACE_ASSERT( this->factory_.get() != 0 );
+ TAO_Notify_PROPERTIES::instance()->factory (this->factory_.get());
+
+ this->builder_.reset (this->create_builder (ACE_ENV_SINGLE_ARG_PARAMETER));
+ ACE_CHECK;
+ ACE_ASSERT( this->builder_.get() != 0 );
+ TAO_Notify_PROPERTIES::instance()->builder (this->builder_.get());
+}
+
+TAO_Notify_Factory*
+TAO_CosNotify_Service::create_factory (ACE_ENV_SINGLE_ARG_DECL)
+{
+ TAO_Notify_Factory* factory = ACE_Dynamic_Service<TAO_Notify_Factory>::instance ("TAO_Notify_Factory");
+ if (factory == 0)
+ {
+ ACE_NEW_THROW_EX (factory,
+ TAO_Notify_Default_Factory (),
+ CORBA::NO_MEMORY ());
+ ACE_CHECK_RETURN (0);
+ }
+ return factory;
+}
+
+TAO_Notify_Builder*
+TAO_CosNotify_Service::create_builder (ACE_ENV_SINGLE_ARG_DECL)
+{
+ TAO_Notify_Builder* builder = 0;
+ ACE_NEW_THROW_EX (builder,
+ TAO_Notify_Builder (),
+ CORBA::NO_MEMORY ());
+ ACE_CHECK_RETURN (0);
+
+ return builder;
+}
+
+CosNotifyChannelAdmin::EventChannelFactory_ptr
+TAO_CosNotify_Service::create (PortableServer::POA_ptr poa ACE_ENV_ARG_DECL)
+{
+ return this->builder().build_event_channel_factory (poa ACE_ENV_ARG_PARAMETER);
+}
+
+void
+TAO_CosNotify_Service::remove (TAO_Notify_EventChannelFactory* /*ecf*/ ACE_ENV_ARG_DECL_NOT_USED)
+{
+ // NOP.
+}
+
+TAO_Notify_Factory&
+TAO_CosNotify_Service::factory (void)
+{
+ ACE_ASSERT( this->factory_.get() != 0 );
+ return *this->factory_;
+}
+
+TAO_Notify_Builder&
+TAO_CosNotify_Service::builder (void)
+{
+ ACE_ASSERT( this->builder_.get() != 0 );
+ return *this->builder_;
+}
+
+TAO_END_VERSIONED_NAMESPACE_DECL
+
+
+/*********************************************************************************************************************/
+
+ACE_STATIC_SVC_DEFINE (TAO_Notify_Default_EMO_Factory_OLD,
+ ACE_TEXT (TAO_NOTIFY_DEF_EMO_FACTORY_NAME),
+ ACE_SVC_OBJ_T,
+ &ACE_SVC_NAME (TAO_CosNotify_Service),
+ ACE_Service_Type::DELETE_THIS | ACE_Service_Type::DELETE_OBJ,
+ 0)
+
+/*********************************************************************************************************************/
+
+ACE_STATIC_SVC_DEFINE (TAO_CosNotify_Service,
+ ACE_TEXT (TAO_COS_NOTIFICATION_SERVICE_NAME),
+ ACE_SVC_OBJ_T,
+ &ACE_SVC_NAME (TAO_CosNotify_Service),
+ ACE_Service_Type::DELETE_THIS | ACE_Service_Type::DELETE_OBJ,
+ 0)
+
+
+ACE_FACTORY_DEFINE (TAO_Notify_Serv, TAO_CosNotify_Service)
+
+/*********************************************************************************************************************/
diff --git a/TAO/orbsvcs/orbsvcs/Notify/CosNotify_Service.h b/TAO/orbsvcs/orbsvcs/Notify/CosNotify_Service.h
new file mode 100644
index 00000000000..cc91e77d372
--- /dev/null
+++ b/TAO/orbsvcs/orbsvcs/Notify/CosNotify_Service.h
@@ -0,0 +1,95 @@
+/* -*- C++ -*- */
+/**
+ * @file CosNotify_Service.h
+ *
+ * $Id$
+ *
+ * @author Pradeep Gore <pradeep@oomworks.com>
+ *
+ *
+ */
+
+#ifndef TAO_Notify_COSNOTIFY_SERVICE_H
+#define TAO_Notify_COSNOTIFY_SERVICE_H
+#include /**/ "ace/pre.h"
+
+#include "orbsvcs/Notify/notify_serv_export.h"
+
+#if !defined (ACE_LACKS_PRAGMA_ONCE)
+# pragma once
+#endif /* ACE_LACKS_PRAGMA_ONCE */
+
+#include "orbsvcs/Notify/Service.h"
+#include "orbsvcs/Notify/Builder.h"
+#include "orbsvcs/Notify/Factory.h"
+
+TAO_BEGIN_VERSIONED_NAMESPACE_DECL
+
+class TAO_Notify_Properties;
+class TAO_Notify_EventChannelFactory;
+
+/**
+ * @class TAO_CosNotify_Service
+ *
+ * @brief A service object for creating the Notify Service Factory.
+ *
+ */
+class TAO_Notify_Serv_Export TAO_CosNotify_Service : public TAO_Notify_Service
+{
+public:
+ /// Constuctor
+ TAO_CosNotify_Service (void);
+
+ /// Destructor
+ virtual ~TAO_CosNotify_Service ();
+
+ /// Init the service from configurator
+ virtual int init (int argc, ACE_TCHAR *argv[]);
+
+ /// Init the service from driver
+ virtual void init_service (CORBA::ORB_ptr orb ACE_ENV_ARG_DECL);
+
+ virtual int fini (void);
+
+ /// Create the Channel Factory.
+ virtual CosNotifyChannelAdmin::EventChannelFactory_ptr create (PortableServer::POA_ptr default_POA ACE_ENV_ARG_DECL);
+
+ /// Called by the factory when it is destroyed.
+ virtual void remove (TAO_Notify_EventChannelFactory* ecf ACE_ENV_ARG_DECL);
+
+protected:
+ /// Init the data members
+ virtual void init_i (CORBA::ORB_ptr orb ACE_ENV_ARG_DECL);
+
+private:
+
+ /// Create the Factory for Notify objects.
+ virtual TAO_Notify_Factory* create_factory (ACE_ENV_SINGLE_ARG_DECL);
+
+ /// Create the Builder for Notify objects.
+ virtual TAO_Notify_Builder* create_builder (ACE_ENV_SINGLE_ARG_DECL);
+
+ /// Set thread options on <qos>.
+ void set_threads (CosNotification::QoSProperties &qos, int threads);
+
+ TAO_Notify_Factory& factory();
+
+ /// Service component for building NS participants.
+ TAO_Notify_Builder& builder();
+
+ /// Service component for object factory operations.
+ ACE_Auto_Ptr< TAO_Notify_Factory > factory_;
+
+ /// Service component for building NS participants.
+ ACE_Auto_Ptr< TAO_Notify_Builder > builder_;
+};
+
+TAO_END_VERSIONED_NAMESPACE_DECL
+
+ACE_STATIC_SVC_DECLARE (TAO_CosNotify_Service)
+ACE_FACTORY_DECLARE (TAO_Notify_Serv, TAO_CosNotify_Service)
+
+ACE_STATIC_SVC_DECLARE (TAO_Notify_Default_EMO_Factory_OLD)
+
+#include /**/ "ace/post.h"
+#endif /* TAO_Notify_COSNOTIFY_SERVICE_H */
diff --git a/TAO/orbsvcs/orbsvcs/Notify/Default_Factory.cpp b/TAO/orbsvcs/orbsvcs/Notify/Default_Factory.cpp
new file mode 100644
index 00000000000..990da34bdbc
--- /dev/null
+++ b/TAO/orbsvcs/orbsvcs/Notify/Default_Factory.cpp
@@ -0,0 +1,197 @@
+// $Id$
+
+#include "orbsvcs/Notify/Default_Factory.h"
+
+ACE_RCSID (Notify,
+ TAO_Notify_Default_Factory,
+ "$Id$")
+
+#include "orbsvcs/Notify/EventChannelFactory.h"
+#include "orbsvcs/Notify/EventChannel.h"
+#include "orbsvcs/Notify/Admin.h"
+#include "orbsvcs/Notify/Proxy.h"
+#include "orbsvcs/Notify/SupplierAdmin.h"
+#include "orbsvcs/Notify/ConsumerAdmin.h"
+#include "orbsvcs/Notify/Structured/StructuredProxyPushConsumer.h"
+#include "orbsvcs/Notify/Structured/StructuredProxyPushSupplier.h"
+#include "orbsvcs/Notify/Any/ProxyPushConsumer.h"
+#include "orbsvcs/Notify/Any/ProxyPushSupplier.h"
+#include "orbsvcs/Notify/Any/CosEC_ProxyPushConsumer.h"
+#include "orbsvcs/Notify/Any/CosEC_ProxyPushSupplier.h"
+#include "orbsvcs/Notify/Sequence/SequenceProxyPushConsumer.h"
+#include "orbsvcs/Notify/Sequence/SequenceProxyPushSupplier.h"
+#include "orbsvcs/Notify/Supplier.h"
+
+#include "orbsvcs/ESF/ESF_Proxy_List.h"
+#include "orbsvcs/ESF/ESF_Copy_On_Write.h"
+
+
+TAO_BEGIN_VERSIONED_NAMESPACE_DECL
+
+template <class PROXY>
+class COW_Collection_Default_Factory
+{
+public:
+ typedef ACE_TYPENAME TAO_ESF_Proxy_List<PROXY>::Iterator PROXY_ITER;
+ typedef TAO_ESF_Copy_On_Write<PROXY, TAO_ESF_Proxy_List<PROXY>,PROXY_ITER, ACE_SYNCH> COLLECTION;
+ typedef TAO_ESF_Proxy_Collection<PROXY> BASE_COLLECTION;
+
+ void create (BASE_COLLECTION* &collection ACE_ENV_ARG_DECL)
+ {
+ ACE_NEW_THROW_EX (collection,
+ COLLECTION (),
+ CORBA::INTERNAL ());
+ }
+};
+
+TAO_Notify_Default_Factory::TAO_Notify_Default_Factory (void)
+{
+}
+
+TAO_Notify_Default_Factory::~TAO_Notify_Default_Factory ()
+{
+}
+
+void
+TAO_Notify_Default_Factory::create (TAO_Notify_ProxySupplier_Collection* &collection ACE_ENV_ARG_DECL)
+{
+ COW_Collection_Default_Factory<TAO_Notify_ProxySupplier> f;
+ f.create (collection ACE_ENV_ARG_PARAMETER);
+}
+
+void
+TAO_Notify_Default_Factory::create (TAO_Notify_ProxyConsumer_Collection* &collection ACE_ENV_ARG_DECL)
+{
+ COW_Collection_Default_Factory<TAO_Notify_ProxyConsumer> f;
+ f.create (collection ACE_ENV_ARG_PARAMETER);
+}
+
+void
+TAO_Notify_Default_Factory::create (TAO_Notify_EventChannel_Collection* &collection ACE_ENV_ARG_DECL)
+{
+ COW_Collection_Default_Factory<TAO_Notify_EventChannel> f;
+ f.create (collection ACE_ENV_ARG_PARAMETER);
+}
+
+void
+TAO_Notify_Default_Factory::create (TAO_Notify_ConsumerAdmin_Collection* &collection ACE_ENV_ARG_DECL)
+{
+ COW_Collection_Default_Factory<TAO_Notify_ConsumerAdmin> f;
+ f.create (collection ACE_ENV_ARG_PARAMETER);
+}
+
+void
+TAO_Notify_Default_Factory::create (TAO_Notify_SupplierAdmin_Collection* &collection ACE_ENV_ARG_DECL)
+{
+ COW_Collection_Default_Factory<TAO_Notify_SupplierAdmin> f;
+ f.create (collection ACE_ENV_ARG_PARAMETER);
+}
+
+void
+TAO_Notify_Default_Factory::create (TAO_Notify_Proxy_Collection* &collection ACE_ENV_ARG_DECL)
+{
+ COW_Collection_Default_Factory<TAO_Notify_Proxy> f;
+ f.create (collection ACE_ENV_ARG_PARAMETER);
+}
+
+void
+TAO_Notify_Default_Factory::create (TAO_Notify_EventChannelFactory*& factory ACE_ENV_ARG_DECL)
+{
+ ACE_NEW_THROW_EX (factory,
+ TAO_Notify_EventChannelFactory (),
+ CORBA::NO_MEMORY ());
+}
+
+void
+TAO_Notify_Default_Factory::create (TAO_Notify_EventChannel*& channel ACE_ENV_ARG_DECL)
+{
+ ACE_NEW_THROW_EX (channel,
+ TAO_Notify_EventChannel (),
+ CORBA::NO_MEMORY ());
+}
+
+
+void
+TAO_Notify_Default_Factory::create (TAO_Notify_SupplierAdmin*& admin ACE_ENV_ARG_DECL)
+{
+ ACE_NEW_THROW_EX (admin,
+ TAO_Notify_SupplierAdmin (),
+ CORBA::NO_MEMORY ());
+}
+
+void
+TAO_Notify_Default_Factory::create (TAO_Notify_ConsumerAdmin*& admin ACE_ENV_ARG_DECL)
+{
+ ACE_NEW_THROW_EX (admin,
+ TAO_Notify_ConsumerAdmin (),
+ CORBA::NO_MEMORY ());
+}
+
+void
+TAO_Notify_Default_Factory::create (TAO_Notify_StructuredProxyPushConsumer*& proxy ACE_ENV_ARG_DECL)
+{
+ ACE_NEW_THROW_EX (proxy,
+ TAO_Notify_StructuredProxyPushConsumer (),
+ CORBA::NO_MEMORY ());
+}
+
+void
+TAO_Notify_Default_Factory::create (TAO_Notify_StructuredProxyPushSupplier*& proxy ACE_ENV_ARG_DECL)
+{
+ ACE_NEW_THROW_EX (proxy,
+ TAO_Notify_StructuredProxyPushSupplier (),
+ CORBA::NO_MEMORY ());
+}
+
+void
+TAO_Notify_Default_Factory::create (TAO_Notify_ProxyPushConsumer*& proxy ACE_ENV_ARG_DECL)
+{
+ ACE_NEW_THROW_EX (proxy,
+ TAO_Notify_ProxyPushConsumer (),
+ CORBA::NO_MEMORY ());
+}
+
+void
+TAO_Notify_Default_Factory::create (TAO_Notify_ProxyPushSupplier*& proxy ACE_ENV_ARG_DECL)
+{
+ ACE_NEW_THROW_EX (proxy,
+ TAO_Notify_ProxyPushSupplier (),
+ CORBA::NO_MEMORY ());
+}
+
+void
+TAO_Notify_Default_Factory::create (TAO_Notify_CosEC_ProxyPushConsumer*& proxy ACE_ENV_ARG_DECL)
+{
+ ACE_NEW_THROW_EX (proxy,
+ TAO_Notify_CosEC_ProxyPushConsumer (),
+ CORBA::NO_MEMORY ());
+}
+
+void
+TAO_Notify_Default_Factory::create (TAO_Notify_CosEC_ProxyPushSupplier*& proxy ACE_ENV_ARG_DECL)
+{
+ ACE_NEW_THROW_EX (proxy,
+ TAO_Notify_CosEC_ProxyPushSupplier (),
+ CORBA::NO_MEMORY ());
+}
+
+void
+TAO_Notify_Default_Factory::create (TAO_Notify_SequenceProxyPushConsumer*& proxy ACE_ENV_ARG_DECL)
+{
+ ACE_NEW_THROW_EX (proxy,
+ TAO_Notify_SequenceProxyPushConsumer (),
+ CORBA::NO_MEMORY ());
+}
+
+void
+TAO_Notify_Default_Factory::create (TAO_Notify_SequenceProxyPushSupplier*& proxy ACE_ENV_ARG_DECL)
+{
+ ACE_NEW_THROW_EX (proxy,
+ TAO_Notify_SequenceProxyPushSupplier (),
+ CORBA::NO_MEMORY ());
+}
+
+TAO_END_VERSIONED_NAMESPACE_DECL
+
+ACE_FACTORY_DEFINE (TAO_Notify_Serv, TAO_Notify_Default_Factory)
+
diff --git a/TAO/orbsvcs/orbsvcs/Notify/Default_Factory.h b/TAO/orbsvcs/orbsvcs/Notify/Default_Factory.h
new file mode 100644
index 00000000000..106d7cb265d
--- /dev/null
+++ b/TAO/orbsvcs/orbsvcs/Notify/Default_Factory.h
@@ -0,0 +1,101 @@
+/* -*- C++ -*- */
+/**
+ * @file Default_Factory.h
+ *
+ * $Id$
+ *
+ * @author Pradeep Gore <pradeep@oomworks.com>
+ *
+ *
+ */
+
+#ifndef TAO_Notify_DEFAULT_FACTORY_H
+#define TAO_Notify_DEFAULT_FACTORY_H
+#include /**/ "ace/pre.h"
+
+#include "orbsvcs/Notify/notify_serv_export.h"
+
+#if !defined (ACE_LACKS_PRAGMA_ONCE)
+# pragma once
+#endif /* ACE_LACKS_PRAGMA_ONCE */
+
+#include "orbsvcs/Notify/Factory.h"
+
+TAO_BEGIN_VERSIONED_NAMESPACE_DECL
+
+/**
+ * @class TAO_Notify_Default_Factory
+ *
+ * @brief Default_Factory interface for creating Notify Objects.
+ *
+ */
+class TAO_Notify_Serv_Export TAO_Notify_Default_Factory : public TAO_Notify_Factory
+{
+public:
+ /// Constructor
+ TAO_Notify_Default_Factory (void);
+
+ /// Destructor
+ virtual ~TAO_Notify_Default_Factory ();
+
+ /// Create ProxySupplier Collection
+ virtual void create (TAO_Notify_ProxySupplier_Collection*& collection ACE_ENV_ARG_DECL);
+
+ /// Create ProxyConsumer Collection
+ virtual void create (TAO_Notify_ProxyConsumer_Collection*& collection ACE_ENV_ARG_DECL);
+
+ /// Create EventChannel Collection
+ virtual void create (TAO_Notify_EventChannel_Collection*& collection ACE_ENV_ARG_DECL);
+
+ /// Create ConsumerAdmin Collection
+ virtual void create (TAO_Notify_ConsumerAdmin_Collection*& collection ACE_ENV_ARG_DECL);
+
+ /// Create SupplierAdmin Collection
+ virtual void create (TAO_Notify_SupplierAdmin_Collection*& collection ACE_ENV_ARG_DECL);
+
+ /// Create Proxy Collection
+ virtual void create (TAO_Notify_Proxy_Collection*& collection ACE_ENV_ARG_DECL);
+
+ /// Create EventChannelDefault_Factory
+ virtual void create (TAO_Notify_EventChannelFactory*& channel_factory ACE_ENV_ARG_DECL);
+
+ /// Create EventChannel
+ virtual void create (TAO_Notify_EventChannel*& channel ACE_ENV_ARG_DECL);
+
+ /// Create SupplierAdmin
+ virtual void create (TAO_Notify_SupplierAdmin*& admin ACE_ENV_ARG_DECL);
+
+ /// Create ConsumerAdmin
+ virtual void create (TAO_Notify_ConsumerAdmin*& admin ACE_ENV_ARG_DECL);
+
+ /// Create ProxyPushConsumer
+ virtual void create (TAO_Notify_ProxyPushConsumer*& proxy ACE_ENV_ARG_DECL);
+
+ /// Create ProxyPushSupplier
+ virtual void create (TAO_Notify_ProxyPushSupplier*& proxy ACE_ENV_ARG_DECL);
+
+ /// Create CosEC_ProxyPushConsumer
+ virtual void create (TAO_Notify_CosEC_ProxyPushConsumer*& proxy ACE_ENV_ARG_DECL);
+
+ /// Create CosEC_ProxyPushSupplier
+ virtual void create (TAO_Notify_CosEC_ProxyPushSupplier*& proxy ACE_ENV_ARG_DECL);
+
+ /// Create StructuredProxyPushConsumer
+ virtual void create (TAO_Notify_StructuredProxyPushConsumer*& proxy ACE_ENV_ARG_DECL);
+
+ /// Create StructuredProxyPushSupplier
+ virtual void create (TAO_Notify_StructuredProxyPushSupplier*& proxy ACE_ENV_ARG_DECL);
+
+ /// Create SequenceProxyPushConsumer
+ virtual void create (TAO_Notify_SequenceProxyPushConsumer*& proxy ACE_ENV_ARG_DECL);
+
+ /// Create SequenceProxyPushSupplier
+ virtual void create (TAO_Notify_SequenceProxyPushSupplier*& proxy ACE_ENV_ARG_DECL);
+};
+
+TAO_END_VERSIONED_NAMESPACE_DECL
+
+ACE_FACTORY_DECLARE (TAO_Notify_Serv, TAO_Notify_Default_Factory)
+
+#include /**/ "ace/post.h"
+#endif /* TAO_Notify_DEFAULT_FACTORY_H */
diff --git a/TAO/orbsvcs/orbsvcs/Notify/Delivery_Request.cpp b/TAO/orbsvcs/orbsvcs/Notify/Delivery_Request.cpp
new file mode 100644
index 00000000000..a40986b1a0c
--- /dev/null
+++ b/TAO/orbsvcs/orbsvcs/Notify/Delivery_Request.cpp
@@ -0,0 +1,103 @@
+// $Id$
+
+#include "orbsvcs/Notify/Delivery_Request.h"
+
+#if ! defined (__ACE_INLINE__)
+#include "orbsvcs/Notify/Delivery_Request.inl"
+#endif /* __ACE_INLINE__ */
+
+#include "orbsvcs/Notify/Routing_Slip.h"
+
+#include "tao/debug.h"
+#include "tao/corba.h"
+
+//#define DEBUG_LEVEL 9
+#ifndef DEBUG_LEVEL
+# define DEBUG_LEVEL TAO_debug_level
+#endif //DEBUG_LEVEL
+
+TAO_BEGIN_VERSIONED_NAMESPACE_DECL
+
+namespace TAO_Notify
+{
+
+///////////////////
+// Delivery_Request
+Delivery_Request::Delivery_Request (const Routing_Slip_Ptr & routing_slip, size_t request_id)
+ : routing_slip_ (routing_slip)
+ , request_id_ (request_id)
+ , delivery_type_ (0)
+{
+ if (DEBUG_LEVEL > 8) ACE_DEBUG ((LM_DEBUG,
+ ACE_TEXT ("(%P|%t) Delivery_Request:: constructor\n")
+ ));
+}
+
+Delivery_Request::~Delivery_Request ()
+{
+ if (DEBUG_LEVEL > 8) ACE_DEBUG ((LM_DEBUG,
+ ACE_TEXT ("(%P|%t) Delivery_Request:: destructor\n")
+ ));
+}
+
+// DO NOT INLINE THIS. It uses the Routing_Slip_Ptr which cannot be declared at
+// the time Delivery_Request.inl is compiled.
+void
+Delivery_Request::complete ()
+{
+ routing_slip_->delivery_request_complete (this->request_id_);
+}
+
+// DO NOT INLINE THIS. It uses the Routing_Slip_Ptr which cannot be declared at
+// the time Delivery_Request.inl is compiled.
+const TAO_Notify_Event::Ptr &
+Delivery_Request::event () const
+{
+ return this->routing_slip_->event ();
+}
+
+void
+Delivery_Request::marshal (TAO_OutputCDR & cdr)
+{
+ if (this->delivery_type_ != 0)
+ {
+ cdr.write_octet (this->delivery_type_);
+ size_t dest_count = this->destination_id_.size ();
+ cdr.write_ulong (dest_count);
+ for (size_t ndest = 0; ndest < dest_count; ++ ndest)
+ {
+ cdr.write_ulong (this->destination_id_ [ndest]);
+ }
+ }
+}
+
+unsigned long
+Delivery_Request::sequence () const
+{
+ return this->routing_slip_->sequence ();
+}
+
+
+bool
+Delivery_Request::should_retry () const
+{
+ return this->routing_slip_->should_retry ();
+}
+
+void
+Delivery_Request::dispatch (
+ TAO_Notify_ProxySupplier * proxy_supplier,
+ bool filter ACE_ENV_ARG_DECL)
+{
+ this->routing_slip_->dispatch (proxy_supplier, filter ACE_ENV_ARG_PARAMETER);
+}
+
+const Routing_Slip_Ptr &
+Delivery_Request::routing_slip () const
+{
+ return this->routing_slip_;
+}
+
+} // namespace
+
+TAO_END_VERSIONED_NAMESPACE_DECL
diff --git a/TAO/orbsvcs/orbsvcs/Notify/Delivery_Request.h b/TAO/orbsvcs/orbsvcs/Notify/Delivery_Request.h
new file mode 100644
index 00000000000..744bca7d733
--- /dev/null
+++ b/TAO/orbsvcs/orbsvcs/Notify/Delivery_Request.h
@@ -0,0 +1,135 @@
+/* -*- C++ -*- */
+// $Id$
+
+#ifndef TAO_NOTIFY_DELIVERY_REQUEST_H
+#define TAO_NOTIFY_DELIVERY_REQUEST_H
+#include /**/ "ace/pre.h"
+
+#include "orbsvcs/Notify/notify_serv_export.h"
+#include "orbsvcs/Notify/Topology_Object.h"
+#include "orbsvcs/Notify/Event.h"
+#include <ace/Vector_T.h>
+#include <ace/Bound_Ptr.h>
+#if !defined (ACE_LACKS_PRAGMA_ONCE)
+# pragma once
+#endif /* ACE_LACKS_PRAGMA_ONCE */
+
+TAO_BEGIN_VERSIONED_NAMESPACE_DECL
+
+// Forward declarations of referenced classes
+class TAO_Notify_EventChannelFactory;
+class TAO_Notify_ProxySupplier;
+
+namespace TAO_Notify
+{
+
+// Forward declarations of TAO_Notify classes/pointers/collections declared
+// in this header
+class Delivery_Request;
+/// A reference-counted smart pointer to a Delivery_Request.
+typedef ACE_Strong_Bound_Ptr<Delivery_Request, TAO_SYNCH_MUTEX> Delivery_Request_Ptr;
+
+typedef ACE_Unbounded_Queue<Delivery_Request_Ptr> Delivery_Request_Queue;
+
+// Forward declarations of TAO_Notify classes/pointers/collections referenced
+// in this header
+
+class Routing_Slip;
+typedef ACE_Strong_Bound_Ptr<Routing_Slip, TAO_SYNCH_MUTEX> Routing_Slip_Ptr;
+
+/// \brief Represents a request to deliver an event to a particular destination.
+///
+/// A Routing Slip contains a collection of Delivery Requests.
+/// A Delivery Request is associated with a Delivery Method. Delivery Methods
+/// should be lightweight objects because they are copied, queued, and otherwise
+/// passed around while they are waiting to be executed. The Delivery Request is
+/// more stable.
+class TAO_Notify_Serv_Export Delivery_Request
+{
+public:
+ /// Normal constructor
+ /// \param routing_slip the routing slip that owns this Delivery Request.
+ /// \param request_id an id that identifies this Delivery Request to the Routing Slip.
+ Delivery_Request (const Routing_Slip_Ptr & routing_slip, size_t request_id);
+
+ /// \brief A static "factory" method for use during restart.
+ ///
+ /// \param routing_slip. The routing slip to which the new Delivery Request should be attached.
+ /// \param request_id The id used to identify this Delivery Request to the Routing Slip.
+ /// \param ecf The EventChannelFactory responsible for reloading this Delivery Method.
+ /// \param cdr A CDR stream from which the peristent information for this Delivery Requect can be retrieved.
+ /// \return a pointer to the newly-allocated Delivery Request
+ static Delivery_Request_Ptr create (
+ const Routing_Slip_Ptr & routing_slip,
+ size_t request_id,
+ TAO_Notify_EventChannelFactory & ecf,
+ TAO_InputCDR & cdr);
+
+ /// a normal destructor.
+ ~Delivery_Request ();
+
+ /// \brief A method to indicate the delivery is complete.
+ ///
+ /// To be called by the delivery method associated with this delivery request.
+ void complete ();
+
+ /// \brief An accessor method for the event associated with the Routing Slip that owns this Delivery request.
+ const TAO_Notify_Event::Ptr & event () const;
+
+ /// \brief An accessor method for the routing slip that owns this request.
+ const Routing_Slip_Ptr & routing_slip ()const;
+
+ /// \brief Capture Delivery Type for the Delivery Method
+ ///
+ /// Called by the delivery method to capture information that should be persisted.
+ void set_delivery_type (ACE_CDR::Octet type);
+
+ /// \brief Capture destination ID for the Delivery Request.
+ ///
+ /// Called by the delivery method to capture information that should be persisted.
+ void set_destination_id (IdVec & destination_id);
+
+ /// \brief Marshal peristent information for this delivery request and its delivery methods into a CDR stream.
+ ///
+ /// Called during persistent event storage.
+ void marshal (TAO_OutputCDR & cdr);
+
+ /// expose routing slip method
+ unsigned long sequence () const;
+
+ /// expose routing slip method
+ bool should_retry () const;
+
+ /// expose routing slip method
+ void dispatch (TAO_Notify_ProxySupplier * proxy_supplier, bool filter ACE_ENV_ARG_DECL);
+
+ // Meaningless, but needed by ACE_Vector on some platforms (gcc2.x LynxOS)
+ bool operator == (const Delivery_Request & rhs) const;
+ // Meaningless, but needed by ACE_Vector on some platforms
+ bool operator != (const Delivery_Request & rhs) const;
+
+private:
+ /// No null constructor.
+ Delivery_Request ();
+ /// No copy constructor.
+ Delivery_Request (const Delivery_Request & rhs);
+ /// no assignment operator
+ Delivery_Request & operator = (const Delivery_Request & rhs);
+
+private:
+ Routing_Slip_Ptr routing_slip_;
+ size_t request_id_;
+ ACE_CDR::Octet delivery_type_;
+ IdVec destination_id_;
+};
+
+} // namespace
+
+TAO_END_VERSIONED_NAMESPACE_DECL
+
+#if defined (__ACE_INLINE__)
+#include "orbsvcs/Notify/Delivery_Request.inl"
+#endif /* __ACE_INLINE__ */
+
+#include /**/ "ace/post.h"
+#endif /* TAO_NOTIFY_DELIVERY_REQUEST_H */
diff --git a/TAO/orbsvcs/orbsvcs/Notify/Delivery_Request.inl b/TAO/orbsvcs/orbsvcs/Notify/Delivery_Request.inl
new file mode 100644
index 00000000000..a34687b5c64
--- /dev/null
+++ b/TAO/orbsvcs/orbsvcs/Notify/Delivery_Request.inl
@@ -0,0 +1,27 @@
+// -*- C++ -*-
+//
+// $Id$
+
+TAO_BEGIN_VERSIONED_NAMESPACE_DECL
+
+namespace TAO_Notify
+{
+
+ACE_INLINE
+void
+Delivery_Request::set_delivery_type (ACE_CDR::Octet type)
+{
+ this->delivery_type_ = type;
+}
+
+ACE_INLINE
+void
+Delivery_Request::set_destination_id (IdVec & destination_id)
+{
+ this->destination_id_ = destination_id;
+}
+
+} // namespace TAO_Notify
+
+
+TAO_END_VERSIONED_NAMESPACE_DECL
diff --git a/TAO/orbsvcs/orbsvcs/Notify/ETCL_Filter.cpp b/TAO/orbsvcs/orbsvcs/Notify/ETCL_Filter.cpp
new file mode 100644
index 00000000000..ca9765dc57e
--- /dev/null
+++ b/TAO/orbsvcs/orbsvcs/Notify/ETCL_Filter.cpp
@@ -0,0 +1,448 @@
+// $Id$
+
+#include "orbsvcs/Notify/ETCL_Filter.h"
+
+ACE_RCSID(Notify,
+ TAO_Notify_ETCL_Filter,
+ "$Id$")
+
+#include "ace/Auto_Ptr.h"
+#include "tao/debug.h"
+#include "orbsvcs/Notify/Notify_Constraint_Visitors.h"
+
+TAO_BEGIN_VERSIONED_NAMESPACE_DECL
+
+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);
+
+ TAO_Notify_Constraint_Expr *notify_constr_expr = 0;
+
+ for (u_int index = 0; index < id_list.length (); ++index)
+ {
+ if (this->constraint_expr_list_.find (id_list[index],
+ notify_constr_expr) == -1)
+ ACE_THROW_RETURN (CosNotifyFilter::ConstraintNotFound (id_list[index]),
+ 0);
+
+ infoseq[index].constraint_expression =
+ notify_constr_expr->constr_expr;
+
+ // Get an id.
+ infoseq[index].constraint_id = id_list[index];
+ }
+
+ return infoseq._retn ();
+}
+
+CosNotifyFilter::ConstraintInfoSeq *
+TAO_Notify_ETCL_Filter::get_all_constraints (ACE_ENV_SINGLE_ARG_DECL)
+ ACE_THROW_SPEC ((CORBA::SystemException))
+{
+ ACE_GUARD_THROW_EX (TAO_SYNCH_MUTEX, ace_mon, this->lock_,
+ CORBA::INTERNAL ());
+ ACE_CHECK_RETURN (0);
+
+ CORBA::ULong current_size = static_cast<CORBA::ULong> (this->constraint_expr_list_.current_size ());
+
+ // Create the list that goes out.
+ CosNotifyFilter::ConstraintInfoSeq *infoseq_ptr;
+ ACE_NEW_THROW_EX (infoseq_ptr,
+ CosNotifyFilter::ConstraintInfoSeq (current_size),
+ CORBA::NO_MEMORY ());
+ ACE_CHECK_RETURN (0);
+
+ CosNotifyFilter::ConstraintInfoSeq_var infoseq (infoseq_ptr);
+
+ infoseq->length (current_size);
+
+ CONSTRAINT_EXPR_LIST::ITERATOR iter (this->constraint_expr_list_);
+ CONSTRAINT_EXPR_LIST::ENTRY *entry;
+
+ for (u_int index = 0; iter.done () == 0; iter.advance (), ++index)
+ {
+ if (iter.next (entry) != 0)
+ {
+ // Why do we cast to a const object?
+ // We want to force the TAO::String_Manager to make a
+ // copy of the string. It wouldn't unless we coax it to use
+ // the correct assignment operator.
+ infoseq[index].constraint_expression =
+ static_cast<const CosNotifyFilter::ConstraintExp> (entry->int_id_->constr_expr);
+
+ infoseq[index].constraint_id = entry->ext_id_;
+ }
+ }
+
+ return infoseq._retn ();
+}
+
+void
+TAO_Notify_ETCL_Filter::remove_all_constraints (ACE_ENV_SINGLE_ARG_DECL)
+ ACE_THROW_SPEC ((CORBA::SystemException))
+{
+ ACE_GUARD_THROW_EX (TAO_SYNCH_MUTEX, ace_mon, this->lock_,
+ CORBA::INTERNAL ());
+ ACE_CHECK;
+
+ this->remove_all_constraints_i (ACE_ENV_SINGLE_ARG_PARAMETER);
+}
+
+void
+TAO_Notify_ETCL_Filter::remove_all_constraints_i (ACE_ENV_SINGLE_ARG_DECL_NOT_USED)
+ ACE_THROW_SPEC ((CORBA::SystemException))
+{
+ CONSTRAINT_EXPR_LIST::ITERATOR iter (this->constraint_expr_list_);
+ CONSTRAINT_EXPR_LIST::ENTRY *entry;
+
+ u_int index;
+
+ for (index = 0; iter.done () == 0; iter.advance (), ++index)
+ {
+ if (iter.next (entry) != 0)
+ {
+ delete entry->int_id_;
+ entry->int_id_ = 0;
+ }
+ }
+
+ this->constraint_expr_list_.unbind_all ();
+}
+
+void
+TAO_Notify_ETCL_Filter::destroy (ACE_ENV_SINGLE_ARG_DECL)
+ ACE_THROW_SPEC ((CORBA::SystemException))
+{
+ ACE_GUARD_THROW_EX (TAO_SYNCH_MUTEX, ace_mon, this->lock_,
+ CORBA::INTERNAL ());
+ ACE_CHECK;
+
+ this->remove_all_constraints_i (ACE_ENV_SINGLE_ARG_PARAMETER);
+ ACE_CHECK;
+
+ PortableServer::POA_var my_POA = _default_POA ();
+
+ PortableServer::ObjectId_var refTemp = my_POA->servant_to_id (this);
+
+ my_POA->deactivate_object (refTemp.in ());
+}
+
+CORBA::Boolean
+TAO_Notify_ETCL_Filter::match (const CORBA::Any & /*filterable_data */
+ ACE_ENV_ARG_DECL)
+ ACE_THROW_SPEC ((CORBA::SystemException,
+ CosNotifyFilter::UnsupportedFilterableData))
+{
+ ACE_THROW_RETURN (CORBA::NO_IMPLEMENT (),
+ 0);
+}
+
+CORBA::Boolean
+TAO_Notify_ETCL_Filter::match_structured (const CosNotification::StructuredEvent & filterable_data
+ ACE_ENV_ARG_DECL
+ )
+ ACE_THROW_SPEC ((CORBA::SystemException,
+ CosNotifyFilter::UnsupportedFilterableData))
+{
+ ACE_GUARD_THROW_EX (TAO_SYNCH_MUTEX, ace_mon, this->lock_,
+ CORBA::INTERNAL ());
+ ACE_CHECK_RETURN (0);
+
+ // We want to return true if at least one constraint matches.
+ CONSTRAINT_EXPR_LIST::ITERATOR iter (this->constraint_expr_list_);
+ CONSTRAINT_EXPR_LIST::ENTRY *entry;
+
+ TAO_Notify_Constraint_Visitor visitor;
+
+ if (visitor.bind_structured_event (filterable_data) != 0)
+ {
+ // Maybe throw some kind of exception here, or lower down,
+ return 0;
+ }
+
+ for (; iter.done () == 0; iter.advance ())
+ {
+ if (iter.next (entry) != 0)
+ {
+ if (entry->int_id_->interpreter.evaluate (visitor) == 1)
+ {
+ return 1;
+ }
+ }
+ }
+
+ return 0;
+}
+
+CORBA::Boolean
+TAO_Notify_ETCL_Filter::match_typed (
+ const CosNotification::PropertySeq & /* filterable_data */
+ ACE_ENV_ARG_DECL
+ )
+ ACE_THROW_SPEC (( CORBA::SystemException,
+ CosNotifyFilter::UnsupportedFilterableData))
+{
+ ACE_THROW_RETURN (CORBA::NO_IMPLEMENT (),
+ 0);
+}
+
+CosNotifyFilter::CallbackID
+TAO_Notify_ETCL_Filter::attach_callback (
+ CosNotifyComm::NotifySubscribe_ptr /* callback */
+ ACE_ENV_ARG_DECL
+ )
+ ACE_THROW_SPEC ((CORBA::SystemException))
+{
+ ACE_THROW_RETURN (CORBA::NO_IMPLEMENT (),
+ 0);
+}
+
+void
+TAO_Notify_ETCL_Filter::detach_callback (
+ CosNotifyFilter::CallbackID /* callback */
+ ACE_ENV_ARG_DECL
+ )
+ ACE_THROW_SPEC ((CORBA::SystemException,
+ CosNotifyFilter::CallbackNotFound))
+{
+ ACE_THROW (CORBA::NO_IMPLEMENT ());
+}
+
+CosNotifyFilter::CallbackIDSeq *
+TAO_Notify_ETCL_Filter::get_callbacks (ACE_ENV_SINGLE_ARG_DECL)
+ ACE_THROW_SPEC ((CORBA::SystemException))
+{
+ ACE_THROW_RETURN (CORBA::NO_IMPLEMENT (),
+ 0);
+}
+
+TAO_END_VERSIONED_NAMESPACE_DECL
diff --git a/TAO/orbsvcs/orbsvcs/Notify/ETCL_Filter.h b/TAO/orbsvcs/orbsvcs/Notify/ETCL_Filter.h
new file mode 100644
index 00000000000..758c3ea4e38
--- /dev/null
+++ b/TAO/orbsvcs/orbsvcs/Notify/ETCL_Filter.h
@@ -0,0 +1,175 @@
+/* -*- C++ -*- */
+/**
+ * @file ETCL_Filter.h
+ *
+ * $Id$
+ *
+ * @author Pradeep Gore <pradeep@oomworks.com>
+ *
+ *
+ */
+
+#ifndef TAO_Notify_ETCL_FILTER_H
+#define TAO_Notify_ETCL_FILTER_H
+#include /**/ "ace/pre.h"
+
+#include "orbsvcs/Notify/notify_serv_export.h"
+
+#if !defined (ACE_LACKS_PRAGMA_ONCE)
+# pragma once
+#endif /* ACE_LACKS_PRAGMA_ONCE */
+
+#include "ace/Containers_T.h"
+#include "ace/Hash_Map_Manager.h"
+#include "ace/Atomic_Op.h"
+#include "orbsvcs/CosNotifyFilterS.h"
+#include "orbsvcs/Notify/Notify_Constraint_Interpreter.h"
+#include "ace/Null_Mutex.h"
+
+#if defined(_MSC_VER)
+#pragma warning(push)
+#pragma warning(disable:4250)
+#endif /* _MSC_VER */
+
+TAO_BEGIN_VERSIONED_NAMESPACE_DECL
+
+/**
+ * @class TAO_ETCL_Filter
+ *
+ * @brief Implementation of CosNotifyFilter::Filter servant.
+ *
+ */
+class TAO_Notify_Serv_Export TAO_Notify_ETCL_Filter
+ : public POA_CosNotifyFilter::Filter
+{
+public:
+ /// Constuctor
+ TAO_Notify_ETCL_Filter (void);
+
+ /// Destructor
+ virtual ~TAO_Notify_ETCL_Filter ();
+
+protected:
+ virtual char * constraint_grammar (ACE_ENV_SINGLE_ARG_DECL)
+ ACE_THROW_SPEC ((
+ CORBA::SystemException
+ ));
+
+ virtual CosNotifyFilter::ConstraintInfoSeq * add_constraints (const CosNotifyFilter::ConstraintExpSeq & constraint_list ACE_ENV_ARG_DECL)
+ ACE_THROW_SPEC ((
+ CORBA::SystemException,
+ CosNotifyFilter::InvalidConstraint
+ ));
+
+ virtual void 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
+ ));
+
+ virtual CosNotifyFilter::ConstraintInfoSeq * get_constraints (const CosNotifyFilter::ConstraintIDSeq & id_list ACE_ENV_ARG_DECL)
+ ACE_THROW_SPEC ((
+ CORBA::SystemException,
+ CosNotifyFilter::ConstraintNotFound
+ ));
+
+ virtual CosNotifyFilter::ConstraintInfoSeq * get_all_constraints (ACE_ENV_SINGLE_ARG_DECL)
+ ACE_THROW_SPEC ((
+ CORBA::SystemException
+ ));
+
+ virtual void remove_all_constraints (ACE_ENV_SINGLE_ARG_DECL)
+ ACE_THROW_SPEC ((
+ CORBA::SystemException
+ ));
+
+ virtual void destroy (ACE_ENV_SINGLE_ARG_DECL)
+ ACE_THROW_SPEC ((
+ CORBA::SystemException
+ ));
+
+ virtual CORBA::Boolean match (const CORBA::Any & filterable_data ACE_ENV_ARG_DECL)
+ ACE_THROW_SPEC ((
+ CORBA::SystemException,
+ CosNotifyFilter::UnsupportedFilterableData
+ ));
+
+ virtual CORBA::Boolean match_structured (const CosNotification::StructuredEvent & filterable_data ACE_ENV_ARG_DECL)
+ ACE_THROW_SPEC ((
+ CORBA::SystemException,
+ CosNotifyFilter::UnsupportedFilterableData
+ ));
+
+ virtual CORBA::Boolean match_typed (const CosNotification::PropertySeq & filterable_data ACE_ENV_ARG_DECL)
+ ACE_THROW_SPEC ((
+ CORBA::SystemException,
+ CosNotifyFilter::UnsupportedFilterableData
+ ));
+
+ virtual CosNotifyFilter::CallbackID attach_callback (CosNotifyComm::NotifySubscribe_ptr callback ACE_ENV_ARG_DECL)
+ ACE_THROW_SPEC ((
+ CORBA::SystemException
+ ));
+
+ virtual void detach_callback (CosNotifyFilter::CallbackID callback ACE_ENV_ARG_DECL)
+ ACE_THROW_SPEC ((
+ CORBA::SystemException,
+ CosNotifyFilter::CallbackNotFound
+ ));
+
+ virtual CosNotifyFilter::CallbackIDSeq * get_callbacks (ACE_ENV_SINGLE_ARG_DECL)
+ ACE_THROW_SPEC ((
+ CORBA::SystemException
+ ));
+
+private:
+ void add_constraints_i (const CosNotifyFilter::ConstraintInfoSeq& constraint_info_seq ACE_ENV_ARG_DECL)
+ ACE_THROW_SPEC ((
+ CORBA::SystemException,
+ CosNotifyFilter::InvalidConstraint
+ ));
+
+ void remove_all_constraints_i (ACE_ENV_SINGLE_ARG_DECL)
+ ACE_THROW_SPEC ((
+ CORBA::SystemException
+ ));
+
+ struct TAO_Notify_Constraint_Expr
+ {
+ // = DESCRIPTION
+ // Structure for associating ConstraintInfo with an interpreter.
+ //
+ CosNotifyFilter::ConstraintExp constr_expr;
+ // Constraint Expression.
+
+ TAO_Notify_Constraint_Interpreter interpreter;
+ // Constraint Interpreter.
+ };
+
+ /// Lock to serialize access to data members.
+ TAO_SYNCH_MUTEX lock_;
+
+ /// Id generator for ConstraintInfo's.
+ CORBA::Long constraint_expr_ids_;
+
+ /// A list of the constraints stored in this filter.
+ typedef ACE_Hash_Map_Manager <CosNotifyFilter::ConstraintID,
+ TAO_Notify_ETCL_Filter::TAO_Notify_Constraint_Expr*,
+ ACE_SYNCH_NULL_MUTEX>
+ CONSTRAINT_EXPR_LIST;
+
+ CONSTRAINT_EXPR_LIST constraint_expr_list_;
+};
+
+TAO_END_VERSIONED_NAMESPACE_DECL
+
+#if defined(_MSC_VER)
+#pragma warning(pop)
+#endif /* _MSC_VER */
+
+#include /**/ "ace/post.h"
+#endif /* TAO_ETCL_FILTER_H */
diff --git a/TAO/orbsvcs/orbsvcs/Notify/ETCL_FilterFactory.cpp b/TAO/orbsvcs/orbsvcs/Notify/ETCL_FilterFactory.cpp
new file mode 100644
index 00000000000..25d53cd5370
--- /dev/null
+++ b/TAO/orbsvcs/orbsvcs/Notify/ETCL_FilterFactory.cpp
@@ -0,0 +1,81 @@
+// $Id$
+
+#include "orbsvcs/Notify/ETCL_FilterFactory.h"
+
+ACE_RCSID(Notify, TAO_Notify_ETCL_FilterFactory, "$Id$")
+
+#include "orbsvcs/Notify/ETCL_Filter.h"
+
+TAO_BEGIN_VERSIONED_NAMESPACE_DECL
+
+TAO_Notify_ETCL_FilterFactory::TAO_Notify_ETCL_FilterFactory (void)
+{
+}
+
+TAO_Notify_ETCL_FilterFactory::~TAO_Notify_ETCL_FilterFactory ()
+{
+}
+
+CosNotifyFilter::FilterFactory_ptr
+TAO_Notify_ETCL_FilterFactory::create (PortableServer::POA_var& filter_poa ACE_ENV_ARG_DECL)
+{
+ this->filter_poa_ = filter_poa; // save the filter poa.
+
+ PortableServer::ServantBase_var servant_var (this);
+
+ return _this (ACE_ENV_SINGLE_ARG_PARAMETER);
+}
+
+CosNotifyFilter::Filter_ptr
+TAO_Notify_ETCL_FilterFactory::create_filter (const char *constraint_grammar ACE_ENV_ARG_DECL)
+ ACE_THROW_SPEC ((
+ CORBA::SystemException,
+ CosNotifyFilter::InvalidGrammar
+ ))
+{
+ // @@: change to "ExTCL" later.
+ if (ACE_OS::strcmp (constraint_grammar, "TCL") != 0 &&
+ ACE_OS::strcmp (constraint_grammar, "ETCL") != 0 &&
+ ACE_OS::strcmp (constraint_grammar, "EXTENDED_TCL") != 0)
+ ACE_THROW_RETURN (CosNotifyFilter::InvalidGrammar (), 0);
+
+
+ // Create the RefCounted servant.
+ TAO_Notify_ETCL_Filter* filter = 0;
+
+ ACE_NEW_THROW_EX (filter,
+ TAO_Notify_ETCL_Filter (),
+ CORBA::NO_MEMORY ());
+
+ PortableServer::ServantBase_var filter_var (filter);
+
+ PortableServer::ObjectId_var oid =
+ this->filter_poa_->activate_object (filter
+ ACE_ENV_ARG_PARAMETER);
+ ACE_CHECK_RETURN (CosNotifyFilter::Filter::_nil ());
+
+ CORBA::Object_var obj =
+ this->filter_poa_->id_to_reference (oid.in ()
+ ACE_ENV_ARG_PARAMETER);
+ ACE_CHECK_RETURN (CosNotifyFilter::Filter::_nil ());
+
+ return CosNotifyFilter::Filter::_narrow (obj.in ()
+ ACE_ENV_ARG_PARAMETER);
+}
+
+CosNotifyFilter::MappingFilter_ptr
+TAO_Notify_ETCL_FilterFactory::create_mapping_filter (const char * /*constraint_grammar*/,
+ const CORBA::Any & /*default_value*/
+ ACE_ENV_ARG_DECL
+ )
+ ACE_THROW_SPEC ((
+ CORBA::SystemException,
+ CosNotifyFilter::InvalidGrammar
+ ))
+{
+ ACE_THROW_RETURN (CORBA::NO_IMPLEMENT (), CosNotifyFilter::MappingFilter::_nil ());
+}
+
+TAO_END_VERSIONED_NAMESPACE_DECL
+
+ACE_FACTORY_DEFINE (TAO_Notify_Serv, TAO_Notify_ETCL_FilterFactory)
diff --git a/TAO/orbsvcs/orbsvcs/Notify/ETCL_FilterFactory.h b/TAO/orbsvcs/orbsvcs/Notify/ETCL_FilterFactory.h
new file mode 100644
index 00000000000..615f010c0cd
--- /dev/null
+++ b/TAO/orbsvcs/orbsvcs/Notify/ETCL_FilterFactory.h
@@ -0,0 +1,94 @@
+/* -*- C++ -*- */
+/**
+ * @file ETCL_FilterFactory.h
+ *
+ * $Id$
+ *
+ * @author Pradeep Gore <pradeep@oomworks.com>
+ *
+ *
+ */
+
+#ifndef TAO_Notify_ETCL_FILTERFACTORY_H
+#define TAO_Notify_ETCL_FILTERFACTORY_H
+
+#include /**/ "ace/pre.h"
+
+#include "orbsvcs/Notify/notify_serv_export.h"
+
+#if !defined (ACE_LACKS_PRAGMA_ONCE)
+# pragma once
+#endif /* ACE_LACKS_PRAGMA_ONCE */
+
+#include "orbsvcs/CosNotifyFilterS.h"
+
+#include "orbsvcs/Notify/FilterFactory.h"
+
+#if defined(_MSC_VER)
+#pragma warning(push)
+#pragma warning(disable:4250)
+#endif /* _MSC_VER */
+
+TAO_BEGIN_VERSIONED_NAMESPACE_DECL
+
+/**
+ * @class TAO_Notify_ETCL_FilterFactory
+ *
+ * @brief
+ *
+ */
+class TAO_Notify_Serv_Export TAO_Notify_ETCL_FilterFactory :
+ public virtual POA_CosNotifyFilter::FilterFactory,
+ public virtual TAO_Notify_FilterFactory
+{
+public:
+ /// Constuctor
+ TAO_Notify_ETCL_FilterFactory (void);
+
+ /// Destructor
+ virtual ~TAO_Notify_ETCL_FilterFactory ();
+
+ ///= TAO_Notify_FilterFactory methods.
+
+ virtual CosNotifyFilter::FilterFactory_ptr create (
+ PortableServer::POA_var& filter_poa
+ ACE_ENV_ARG_DECL
+ );
+
+ ///= CosNotifyFilter::FilterFactory methods
+
+ virtual CosNotifyFilter::Filter_ptr create_filter (
+ const char * constraint_grammar
+ ACE_ENV_ARG_DECL
+ )
+ ACE_THROW_SPEC ((
+ CORBA::SystemException,
+ CosNotifyFilter::InvalidGrammar
+ ));
+
+ virtual CosNotifyFilter::MappingFilter_ptr create_mapping_filter (
+ const char * constraint_grammar,
+ const CORBA::Any & default_value
+ ACE_ENV_ARG_DECL
+ )
+ ACE_THROW_SPEC ((
+ CORBA::SystemException,
+ CosNotifyFilter::InvalidGrammar
+ ));
+
+protected:
+ /// The POA in which to activate the Filters.
+ PortableServer::POA_var filter_poa_;
+};
+
+TAO_END_VERSIONED_NAMESPACE_DECL
+
+#if defined(_MSC_VER)
+#pragma warning(pop)
+#endif /* _MSC_VER */
+
+ACE_FACTORY_DECLARE (TAO_Notify_Serv, TAO_Notify_ETCL_FilterFactory)
+
+#include /**/ "ace/post.h"
+
+#endif /* TAO_Notify_ETCL_FILTERFACTORY_H */
diff --git a/TAO/orbsvcs/orbsvcs/Notify/Event.cpp b/TAO/orbsvcs/orbsvcs/Notify/Event.cpp
new file mode 100644
index 00000000000..98d7bfd48cc
--- /dev/null
+++ b/TAO/orbsvcs/orbsvcs/Notify/Event.cpp
@@ -0,0 +1,84 @@
+// $Id$
+
+#include "orbsvcs/Notify/Event.h"
+
+#if ! defined (__ACE_INLINE__)
+#include "orbsvcs/Notify/Event.inl"
+#endif /* __ACE_INLINE__ */
+
+ACE_RCSID (Notify,
+ TAO_Notify_Event,
+ "$Id$")
+
+#include "tao/debug.h"
+#include "tao/CDR.h"
+#include "orbsvcs/CosNotificationC.h"
+// NOTE: unfortunately we must know about derived types to implement unmarshal
+#include "orbsvcs/Notify/Any/AnyEvent.h"
+#include "orbsvcs/Notify/Structured/StructuredEvent.h"
+
+TAO_BEGIN_VERSIONED_NAMESPACE_DECL
+
+TAO_Notify_Event::TAO_Notify_Event (void)
+: priority_ (CosNotification::Priority, CosNotification::DefaultPriority)
+, timeout_ (CosNotification::Timeout)
+, reliable_ (CosNotification::EventReliability, false)
+, clone_ (0)
+, is_on_heap_ (false)
+{
+ // if (TAO_debug_level > 0)
+ // ACE_DEBUG ((LM_DEBUG,"event:%x created\n", this ));
+}
+
+TAO_Notify_Event::~TAO_Notify_Event ()
+{
+ // if (TAO_debug_level > 1)
+ // ACE_DEBUG ((LM_DEBUG,"event:%x destroyed\n", this ));
+}
+void
+TAO_Notify_Event::release (void)
+{
+ delete this;
+}
+
+void
+TAO_Notify_Event::translate (const CORBA::Any& any, CosNotification::StructuredEvent& notification)
+{
+ notification.remainder_of_body <<= any;
+ notification.header.fixed_header.event_type.type_name = CORBA::string_dup ("%ANY");
+ notification.header.fixed_header.event_type.domain_name = CORBA::string_dup ("");
+}
+
+void
+TAO_Notify_Event::translate (const CosNotification::StructuredEvent& notification, CORBA::Any& any)
+{
+ any <<= notification; // is the typecode set by this operation or do we need to set it explicity.
+}
+/// Unmarshal an event from a CDR. (for persistence)
+//static
+TAO_Notify_Event *
+TAO_Notify_Event::unmarshal (TAO_InputCDR & cdr)
+{
+ TAO_Notify_Event * result = 0;
+ ACE_CDR::Octet code = 0;
+ if (cdr.read_octet (code))
+ {
+ switch (code)
+ {
+ case MARSHAL_ANY:
+ result = TAO_Notify_AnyEvent::unmarshal (cdr);
+ break;
+ case MARSHAL_STRUCTURED:
+ result = TAO_Notify_StructuredEvent::unmarshal (cdr);
+ break;
+ default:
+ ACE_ERROR ((LM_ERROR,
+ ACE_TEXT ("(%P|%t) TAO_Notify_Event::unmarshal: unknown event code %d\n"),
+ code));
+ break;
+ }
+ }
+ return result;
+}
+
+TAO_END_VERSIONED_NAMESPACE_DECL
diff --git a/TAO/orbsvcs/orbsvcs/Notify/Event.h b/TAO/orbsvcs/orbsvcs/Notify/Event.h
new file mode 100644
index 00000000000..1b44711ce46
--- /dev/null
+++ b/TAO/orbsvcs/orbsvcs/Notify/Event.h
@@ -0,0 +1,139 @@
+/* -*- C++ -*- */
+/**
+ * @file Event.h
+ *
+ * $Id$
+ *
+ * @author Pradeep Gore <pradeep@oomworks.com>
+ *
+ *
+ */
+
+#ifndef TAO_NOTIFY_EVENT_H
+#define TAO_NOTIFY_EVENT_H
+
+#include /**/ "ace/pre.h"
+
+#include "orbsvcs/Notify/notify_serv_export.h"
+
+#if !defined (ACE_LACKS_PRAGMA_ONCE)
+# pragma once
+#endif /* ACE_LACKS_PRAGMA_ONCE */
+
+#include "orbsvcs/Notify/Refcountable.h"
+#include "orbsvcs/Notify/Property.h"
+#include "orbsvcs/Notify/Property_Boolean.h"
+#include "orbsvcs/Notify/Property_T.h"
+
+#include "orbsvcs/Event_ForwarderS.h"
+#include "orbsvcs/CosNotifyFilterC.h"
+#include "orbsvcs/CosNotificationC.h"
+
+#include "ace/Copy_Disabled.h"
+
+TAO_BEGIN_VERSIONED_NAMESPACE_DECL
+
+class TAO_Notify_Consumer;
+class TAO_Notify_EventType;
+
+/**
+ * @class TAO_Notify_Event
+ *
+ * @brief Base class abstraction for Events flowing through the EventChannel.
+ *
+ */
+class TAO_Notify_Serv_Export TAO_Notify_Event
+ : public TAO_Notify_Refcountable
+ , private ACE_Copy_Disabled
+{
+public:
+ typedef TAO_Notify_Refcountable_Guard_T<TAO_Notify_Event> Ptr;
+
+ // Codes to distinguish marshaled events in persistent storage
+ enum {MARSHAL_ANY=1,MARSHAL_STRUCTURED=2};
+ /// Constuctor
+ TAO_Notify_Event (void);
+
+ /// Destructor
+ virtual ~TAO_Notify_Event ();
+
+ /// Translate Any to Structured
+ static void translate (const CORBA::Any& any, CosNotification::StructuredEvent& notification);
+
+ /// Translate Structured to Any
+ static void translate (const CosNotification::StructuredEvent& notification, CORBA::Any& any);
+
+ /// Get the event type.
+ virtual const TAO_Notify_EventType& type (void) const = 0;
+
+ /// Returns true if the filter matches.
+ virtual CORBA::Boolean do_match (CosNotifyFilter::Filter_ptr filter ACE_ENV_ARG_DECL) const = 0;
+
+ /// Convert to CosNotification::Structured type
+ virtual void convert (CosNotification::StructuredEvent& notification) const = 0;
+
+ /// Push event to consumer
+ virtual void push (TAO_Notify_Consumer* consumer ACE_ENV_ARG_DECL) const = 0;
+
+ /// Push event to the Event_Forwarder interface
+ virtual void push (Event_Forwarder::StructuredProxyPushSupplier_ptr forwarder ACE_ENV_ARG_DECL) const = 0;
+
+ /// Push event to the Event_Forwarder interface
+ virtual void push_no_filtering (Event_Forwarder::StructuredProxyPushSupplier_ptr forwarder ACE_ENV_ARG_DECL) const = 0;
+
+ /// Push event to the Event_Forwarder interface
+ virtual void push (Event_Forwarder::ProxyPushSupplier_ptr forwarder ACE_ENV_ARG_DECL) const = 0;
+
+ /// Push event to the Event_Forwarder interface
+ virtual void push_no_filtering (Event_Forwarder::ProxyPushSupplier_ptr forwarder ACE_ENV_ARG_DECL) const = 0;
+
+ /// Return a pointer to a copy of this event on the heap
+ TAO_Notify_Event* queueable_copy (ACE_ENV_SINGLE_ARG_DECL) const;
+
+ /// marshal this event into a CDR buffer (for persistence)
+ virtual void marshal (TAO_OutputCDR& cdr) const = 0;
+
+ /// Unmarshal an event from a CDR. (for persistence)
+ static TAO_Notify_Event* unmarshal (TAO_InputCDR & cdr);
+
+ ///= Accessors
+ /// Priority
+ const TAO_Notify_Property_Short& priority (void) const;
+
+ /// Timeout
+ const TAO_Notify_Property_Time& timeout (void) const;
+
+ /// Reliable
+ const TAO_Notify_Property_Boolean& reliable(void) const;
+
+protected:
+ /// = QoS properties
+
+ /// Priority.
+ TAO_Notify_Property_Short priority_;
+
+ /// Timeout.
+ TAO_Notify_Property_Time timeout_;
+
+ /// Reliability
+ TAO_Notify_Property_Boolean reliable_;
+
+private:
+ /// Return a pointer to a copy of this event on the heap
+ virtual TAO_Notify_Event* copy (ACE_ENV_SINGLE_ARG_DECL) const = 0;
+
+ virtual void release (void);
+
+ mutable Ptr clone_;
+ bool is_on_heap_;
+};
+
+TAO_END_VERSIONED_NAMESPACE_DECL
+
+#if defined (__ACE_INLINE__)
+#include "orbsvcs/Notify/Event.inl"
+#endif /* __ACE_INLINE__ */
+
+#include /**/ "ace/post.h"
+
+#endif /* TAO_NOTIFY_EVENT_H */
diff --git a/TAO/orbsvcs/orbsvcs/Notify/Event.inl b/TAO/orbsvcs/orbsvcs/Notify/Event.inl
new file mode 100644
index 00000000000..36bdd57e0f5
--- /dev/null
+++ b/TAO/orbsvcs/orbsvcs/Notify/Event.inl
@@ -0,0 +1,43 @@
+// -*- C++ -*-
+//
+// $Id$
+
+TAO_BEGIN_VERSIONED_NAMESPACE_DECL
+
+ACE_INLINE const TAO_Notify_Property_Short&
+TAO_Notify_Event::priority (void) const
+{
+ return this->priority_;
+}
+
+ACE_INLINE const TAO_Notify_Property_Time&
+TAO_Notify_Event::timeout (void) const
+{
+ return this->timeout_;
+}
+
+ACE_INLINE const TAO_Notify_Property_Boolean&
+TAO_Notify_Event::reliable (void) const
+{
+ return this->reliable_;
+}
+
+ACE_INLINE
+TAO_Notify_Event*
+TAO_Notify_Event::queueable_copy (ACE_ENV_SINGLE_ARG_DECL) const
+{
+ if ( is_on_heap_ )
+ {
+ return const_cast< TAO_Notify_Event* >( this );
+ }
+ else if (this->clone_.get() == 0)
+ {
+ TAO_Notify_Event* copied = this->copy (ACE_ENV_SINGLE_ARG_PARAMETER);
+ ACE_CHECK_RETURN(0);
+ copied->is_on_heap_ = true;
+ this->clone_.reset( copied );
+ }
+ return this->clone_.get();
+}
+
+TAO_END_VERSIONED_NAMESPACE_DECL
diff --git a/TAO/orbsvcs/orbsvcs/Notify/EventChannel.cpp b/TAO/orbsvcs/orbsvcs/Notify/EventChannel.cpp
new file mode 100644
index 00000000000..a55f5e44f6c
--- /dev/null
+++ b/TAO/orbsvcs/orbsvcs/Notify/EventChannel.cpp
@@ -0,0 +1,685 @@
+// $Id$
+
+#include "orbsvcs/Notify/EventChannel.h"
+
+#include "orbsvcs/Notify/Container_T.h"
+#include "orbsvcs/Notify/EventChannelFactory.h"
+#include "orbsvcs/Notify/ConsumerAdmin.h"
+#include "orbsvcs/Notify/SupplierAdmin.h"
+#include "orbsvcs/Notify/Properties.h"
+#include "orbsvcs/Notify/Factory.h"
+#include "orbsvcs/Notify/Builder.h"
+#include "orbsvcs/Notify/Find_Worker_T.h"
+#include "orbsvcs/Notify/Seq_Worker_T.h"
+#include "orbsvcs/Notify/Topology_Saver.h"
+#include "orbsvcs/Notify/Save_Persist_Worker_T.h"
+#include "orbsvcs/Notify/Reconnect_Worker_T.h"
+#include "orbsvcs/Notify/Proxy.h"
+#include "orbsvcs/Notify/Event_Manager.h"
+#include "orbsvcs/Notify/POA_Helper.h"
+
+#include "tao/debug.h"
+//#define DEBUG_LEVEL 9
+#ifndef DEBUG_LEVEL
+# define DEBUG_LEVEL TAO_debug_level
+#endif //DEBUG_LEVEL
+
+ACE_RCSID(Notify, TAO_Notify_EventChannel, "$Id$")
+
+TAO_BEGIN_VERSIONED_NAMESPACE_DECL
+
+typedef TAO_Notify_Find_Worker_T<TAO_Notify_ConsumerAdmin
+ , CosNotifyChannelAdmin::ConsumerAdmin
+ , CosNotifyChannelAdmin::ConsumerAdmin_ptr
+ , CosNotifyChannelAdmin::AdminNotFound>
+TAO_Notify_ConsumerAdmin_Find_Worker;
+
+typedef TAO_Notify_Find_Worker_T<TAO_Notify_SupplierAdmin
+ , CosNotifyChannelAdmin::SupplierAdmin
+ , CosNotifyChannelAdmin::SupplierAdmin_ptr
+ , CosNotifyChannelAdmin::AdminNotFound>
+TAO_Notify_SupplierAdmin_Find_Worker;
+
+typedef TAO_Notify_Seq_Worker_T<TAO_Notify_ConsumerAdmin> TAO_Notify_ConsumerAdmin_Seq_Worker;
+typedef TAO_Notify_Seq_Worker_T<TAO_Notify_SupplierAdmin> TAO_Notify_SupplierAdmin_Seq_Worker;
+
+TAO_Notify_EventChannel::TAO_Notify_EventChannel (void)
+ : ecf_ (0)
+ , ca_container_ (0)
+ , sa_container_ (0)
+{
+}
+
+TAO_Notify_EventChannel::~TAO_Notify_EventChannel ()
+{
+}
+
+void
+TAO_Notify_EventChannel::init (TAO_Notify_EventChannelFactory* ecf
+ , const CosNotification::QoSProperties & initial_qos
+ , const CosNotification::AdminProperties & initial_admin
+ ACE_ENV_ARG_DECL)
+{
+ ACE_ASSERT (this->ca_container_.get() == 0);
+
+ // this-> on the following line confuses VC6
+ initialize (ecf ACE_ENV_ARG_PARAMETER);
+
+ this->ecf_.reset (ecf);
+
+ // Init ca_container_
+ TAO_Notify_ConsumerAdmin_Container* ca_container = 0;
+ ACE_NEW_THROW_EX (ca_container,
+ TAO_Notify_ConsumerAdmin_Container (),
+ CORBA::INTERNAL ());
+ ACE_CHECK;
+ this->ca_container_.reset (ca_container);
+
+ this->ca_container().init (ACE_ENV_SINGLE_ARG_PARAMETER);
+ ACE_CHECK;
+
+ // Init ca_container_
+ TAO_Notify_SupplierAdmin_Container* sa_container = 0;
+ ACE_NEW_THROW_EX (sa_container,
+ TAO_Notify_SupplierAdmin_Container (),
+ CORBA::INTERNAL ());
+ ACE_CHECK;
+ this->sa_container_.reset (sa_container);
+
+ this->sa_container().init (ACE_ENV_SINGLE_ARG_PARAMETER);
+ ACE_CHECK;
+
+ // Set the admin properties.
+ TAO_Notify_AdminProperties* admin_properties = 0;
+ ACE_NEW_THROW_EX (admin_properties,
+ TAO_Notify_AdminProperties (),
+ CORBA::NO_MEMORY ());
+ ACE_CHECK;
+ this->set_admin_properties (admin_properties);
+
+ // create the event manager. @@ use factory
+ TAO_Notify_Event_Manager* event_manager = 0;
+ ACE_NEW_THROW_EX (event_manager,
+ TAO_Notify_Event_Manager (),
+ CORBA::INTERNAL ());
+ ACE_CHECK;
+ this->set_event_manager (event_manager);
+
+ this->event_manager().init (ACE_ENV_SINGLE_ARG_PARAMETER);
+ ACE_CHECK;
+
+ const CosNotification::QoSProperties &default_ec_qos =
+ TAO_Notify_PROPERTIES::instance ()->default_event_channel_qos_properties ();
+
+ this->set_qos (default_ec_qos ACE_ENV_ARG_PARAMETER);
+ ACE_CHECK;
+
+ this->set_qos (initial_qos ACE_ENV_ARG_PARAMETER);
+ ACE_CHECK;
+
+ this->set_admin (initial_admin ACE_ENV_ARG_PARAMETER);
+ ACE_CHECK;
+
+ // Note originally default admins were allocated here, bt this caused problems
+ // attempting to save the topology changes before the Event Channel was completely
+ // constructed and linked to the ECF.
+ // Lazy evaluation also avoids creating unneded admins.
+}
+
+
+void
+TAO_Notify_EventChannel::init (TAO_Notify::Topology_Parent* parent ACE_ENV_ARG_DECL)
+{
+ ACE_ASSERT (this->ecf_.get() == 0);
+ // this-> on the following line confuses VC6
+ initialize (parent ACE_ENV_ARG_PARAMETER);
+
+ this->ecf_.reset (dynamic_cast <TAO_Notify_EventChannelFactory*>(parent));
+ ACE_ASSERT (this->ecf_.get() !=0);
+
+ // Init ca_container_
+ TAO_Notify_ConsumerAdmin_Container* ca_container = 0;
+ ACE_NEW_THROW_EX (ca_container,
+ TAO_Notify_ConsumerAdmin_Container (),
+ CORBA::INTERNAL ());
+ ACE_CHECK;
+ this->ca_container_.reset (ca_container);
+
+ this->ca_container().init (ACE_ENV_SINGLE_ARG_PARAMETER);
+ ACE_CHECK;
+
+ TAO_Notify_SupplierAdmin_Container* sa_container = 0;
+ // Init ca_container_
+ ACE_NEW_THROW_EX (sa_container,
+ TAO_Notify_SupplierAdmin_Container (),
+ CORBA::INTERNAL ());
+ ACE_CHECK;
+ this->sa_container_.reset (sa_container);
+
+ this->sa_container().init (ACE_ENV_SINGLE_ARG_PARAMETER);
+ ACE_CHECK;
+
+ // Set the admin properties.
+ TAO_Notify_AdminProperties* admin_properties = 0;
+ ACE_NEW_THROW_EX (admin_properties,
+ TAO_Notify_AdminProperties (),
+ CORBA::NO_MEMORY ());
+ ACE_CHECK;
+ this->set_admin_properties (admin_properties);
+
+ // create the event manager. @@ use factory
+ TAO_Notify_Event_Manager* event_manager = 0;
+ ACE_NEW_THROW_EX (event_manager,
+ TAO_Notify_Event_Manager (),
+ CORBA::INTERNAL ());
+ ACE_CHECK;
+ this->set_event_manager (event_manager);
+
+ this->event_manager().init (ACE_ENV_SINGLE_ARG_PARAMETER);
+ ACE_CHECK;
+
+ const CosNotification::QoSProperties &default_ec_qos =
+ TAO_Notify_PROPERTIES::instance ()->default_event_channel_qos_properties ();
+
+ this->set_qos (default_ec_qos ACE_ENV_ARG_PARAMETER);
+ ACE_CHECK;
+
+}
+
+
+void
+TAO_Notify_EventChannel::_add_ref (ACE_ENV_SINGLE_ARG_DECL_NOT_USED)
+{
+ this->_incr_refcnt ();
+}
+
+void
+TAO_Notify_EventChannel::_remove_ref (ACE_ENV_SINGLE_ARG_DECL_NOT_USED)
+{
+ this->_decr_refcnt ();
+}
+
+void
+TAO_Notify_EventChannel::release (void)
+{
+ delete this;
+ //@@ inform factory
+}
+
+int
+TAO_Notify_EventChannel::shutdown (ACE_ENV_SINGLE_ARG_DECL)
+{
+ int sd_ret = TAO_Notify_Object::shutdown (ACE_ENV_SINGLE_ARG_PARAMETER);
+ ACE_CHECK_RETURN (1);
+
+ if (sd_ret == 1)
+ return 1;
+
+ this->ca_container().shutdown (ACE_ENV_SINGLE_ARG_PARAMETER);
+ ACE_CHECK_RETURN (1);
+
+ this->sa_container().shutdown (ACE_ENV_SINGLE_ARG_PARAMETER);
+ ACE_CHECK_RETURN (1);
+
+ this->event_manager().shutdown ();
+
+ return 0;
+}
+
+void
+TAO_Notify_EventChannel::destroy (ACE_ENV_SINGLE_ARG_DECL)
+ ACE_THROW_SPEC ((
+ CORBA::SystemException
+ ))
+{
+ TAO_Notify_EventChannel::Ptr guard( this );
+
+ int result = this->shutdown (ACE_ENV_SINGLE_ARG_PARAMETER);
+ ACE_CHECK;
+ if ( result == 1)
+ return;
+
+ this->ecf_->remove (this ACE_ENV_ARG_PARAMETER);
+ ACE_CHECK;
+
+ this->sa_container_.reset( 0 );
+ this->ca_container_.reset( 0 );
+}
+
+void
+TAO_Notify_EventChannel::remove (TAO_Notify_ConsumerAdmin* consumer_admin ACE_ENV_ARG_DECL)
+{
+ this->ca_container().remove (consumer_admin ACE_ENV_ARG_PARAMETER);
+}
+
+void
+TAO_Notify_EventChannel::remove (TAO_Notify_SupplierAdmin* supplier_admin ACE_ENV_ARG_DECL)
+{
+ this->sa_container().remove (supplier_admin ACE_ENV_ARG_PARAMETER);
+}
+
+void
+TAO_Notify_EventChannel::set_qos (const CosNotification::QoSProperties & qos ACE_ENV_ARG_DECL)
+ ACE_THROW_SPEC ((
+ CORBA::SystemException
+ , CosNotification::UnsupportedQoS
+ ))
+{
+ this->TAO_Notify_Object::set_qos (qos ACE_ENV_ARG_PARAMETER);
+}
+
+CosNotification::QoSProperties*
+TAO_Notify_EventChannel::get_qos (ACE_ENV_SINGLE_ARG_DECL)
+ ACE_THROW_SPEC ((
+ CORBA::SystemException
+ ))
+{
+ return this->TAO_Notify_Object::get_qos (ACE_ENV_SINGLE_ARG_PARAMETER);
+}
+
+CosNotifyChannelAdmin::EventChannelFactory_ptr
+TAO_Notify_EventChannel::MyFactory (ACE_ENV_SINGLE_ARG_DECL)
+ ACE_THROW_SPEC ((
+ CORBA::SystemException
+ ))
+{
+ return this->ecf_->_this (ACE_ENV_SINGLE_ARG_PARAMETER);
+}
+
+CosNotifyChannelAdmin::ConsumerAdmin_ptr
+TAO_Notify_EventChannel::default_consumer_admin (ACE_ENV_SINGLE_ARG_DECL)
+ ACE_THROW_SPEC ((
+ CORBA::SystemException
+ ))
+{
+ if (CORBA::is_nil (default_consumer_admin_.in ()))
+ {
+ ACE_GUARD_RETURN (TAO_SYNCH_MUTEX, guard, this->default_admin_mutex_, CosNotifyChannelAdmin::ConsumerAdmin::_nil());
+ if (CORBA::is_nil (default_consumer_admin_.in ()))
+ {
+ CosNotifyChannelAdmin::AdminID id;
+ this->default_consumer_admin_ = this->new_for_consumers (CosNotifyChannelAdmin::OR_OP, id ACE_ENV_ARG_PARAMETER);
+ ACE_CHECK_RETURN (CosNotifyChannelAdmin::ConsumerAdmin::_nil());
+ // Wish there was a better way to do this!
+ PortableServer::ServantBase * admin_servant =
+ this->poa()->reference_to_servant (
+ this->default_consumer_admin_.in ()
+ ACE_ENV_ARG_PARAMETER);
+ ACE_CHECK_RETURN (CosNotifyChannelAdmin::ConsumerAdmin::_nil());
+ TAO_Notify_Admin * pAdmin = dynamic_cast <TAO_Notify_Admin *> (admin_servant);
+ ACE_ASSERT (pAdmin != 0); // if this assert triggers, we have mixed implementations?
+ if (pAdmin != 0)
+ {
+ pAdmin->set_default (true);
+ }
+ }
+ }
+ return CosNotifyChannelAdmin::ConsumerAdmin::_duplicate (this->default_consumer_admin_.in ());
+}
+
+CosNotifyChannelAdmin::SupplierAdmin_ptr
+TAO_Notify_EventChannel::default_supplier_admin (ACE_ENV_SINGLE_ARG_DECL)
+ ACE_THROW_SPEC ((
+ CORBA::SystemException
+ ))
+{
+ if (CORBA::is_nil (default_supplier_admin_.in ()))
+ {
+ ACE_GUARD_RETURN (TAO_SYNCH_MUTEX, guard, this->default_admin_mutex_, CosNotifyChannelAdmin::SupplierAdmin::_nil());
+ if (CORBA::is_nil (default_supplier_admin_.in ()))
+ {
+ CosNotifyChannelAdmin::AdminID id;
+ this->default_supplier_admin_ = this->new_for_suppliers (CosNotifyChannelAdmin::OR_OP, id ACE_ENV_ARG_PARAMETER);
+ ACE_CHECK_RETURN (CosNotifyChannelAdmin::SupplierAdmin::_nil());
+ PortableServer::ServantBase * admin_servant =
+ this->poa()->poa()->reference_to_servant (
+ this->default_supplier_admin_.in ()
+ ACE_ENV_ARG_PARAMETER);
+ ACE_CHECK_RETURN (0);
+ TAO_Notify_Admin * pAdmin = dynamic_cast <TAO_Notify_Admin *> (admin_servant);
+ ACE_ASSERT (pAdmin != 0); // if this assert triggers, we have mixed implementations?
+ if (pAdmin != 0)
+ {
+ pAdmin->set_default (true);
+ }
+ }
+ }
+ return CosNotifyChannelAdmin::SupplierAdmin::_duplicate (this->default_supplier_admin_.in ());
+}
+
+::CosNotifyFilter::FilterFactory_ptr TAO_Notify_EventChannel::default_filter_factory (ACE_ENV_SINGLE_ARG_DECL)
+ ACE_THROW_SPEC ((
+ CORBA::SystemException
+ ))
+{
+ return this->ecf_->get_default_filter_factory (ACE_ENV_SINGLE_ARG_PARAMETER);
+}
+
+::CosNotifyChannelAdmin::ConsumerAdmin_ptr
+TAO_Notify_EventChannel::new_for_consumers (CosNotifyChannelAdmin::InterFilterGroupOperator op,
+ CosNotifyChannelAdmin::AdminID_out id ACE_ENV_ARG_DECL
+ )
+ ACE_THROW_SPEC ((
+ CORBA::SystemException
+ ))
+
+{
+ ::CosNotifyChannelAdmin::ConsumerAdmin_var ca =
+ TAO_Notify_PROPERTIES::instance()->builder()->build_consumer_admin (this, op, id ACE_ENV_ARG_PARAMETER);
+ ACE_CHECK_RETURN (ca._retn ());
+ this->self_change (ACE_ENV_SINGLE_ARG_PARAMETER);
+ ACE_CHECK_RETURN (ca._retn ());
+ return ca._retn ();
+}
+
+::CosNotifyChannelAdmin::SupplierAdmin_ptr
+TAO_Notify_EventChannel::new_for_suppliers (CosNotifyChannelAdmin::InterFilterGroupOperator op,
+ CosNotifyChannelAdmin::AdminID_out id
+ ACE_ENV_ARG_DECL
+ )
+ ACE_THROW_SPEC ((
+ CORBA::SystemException
+ ))
+{
+ ::CosNotifyChannelAdmin::SupplierAdmin_var sa =
+ TAO_Notify_PROPERTIES::instance()->builder()->build_supplier_admin (this, op, id ACE_ENV_ARG_PARAMETER);
+ ACE_CHECK_RETURN (sa._retn ());
+ this->self_change (ACE_ENV_SINGLE_ARG_PARAMETER);
+ ACE_CHECK_RETURN (sa._retn ());
+ return sa._retn ();
+}
+
+CosNotifyChannelAdmin::ConsumerAdmin_ptr
+TAO_Notify_EventChannel::get_consumeradmin (CosNotifyChannelAdmin::AdminID id ACE_ENV_ARG_DECL)
+ ACE_THROW_SPEC ((
+ CORBA::SystemException
+ , CosNotifyChannelAdmin::AdminNotFound
+ ))
+{
+ TAO_Notify_ConsumerAdmin_Find_Worker find_worker;
+
+ return find_worker.resolve (id, this->ca_container() ACE_ENV_ARG_PARAMETER);
+}
+
+CosNotifyChannelAdmin::SupplierAdmin_ptr
+TAO_Notify_EventChannel::get_supplieradmin (CosNotifyChannelAdmin::AdminID id ACE_ENV_ARG_DECL)
+ ACE_THROW_SPEC ((
+ CORBA::SystemException
+ , CosNotifyChannelAdmin::AdminNotFound
+ ))
+{
+ TAO_Notify_SupplierAdmin_Find_Worker find_worker;
+
+ return find_worker.resolve (id, this->sa_container() ACE_ENV_ARG_PARAMETER);
+}
+
+CosNotifyChannelAdmin::AdminIDSeq*
+TAO_Notify_EventChannel::get_all_consumeradmins (ACE_ENV_SINGLE_ARG_DECL)
+ ACE_THROW_SPEC ((
+ CORBA::SystemException
+ ))
+{
+ TAO_Notify_ConsumerAdmin_Seq_Worker seq_worker;
+
+ return seq_worker.create (this->ca_container() ACE_ENV_ARG_PARAMETER);
+}
+
+CosNotifyChannelAdmin::AdminIDSeq*
+TAO_Notify_EventChannel::get_all_supplieradmins (ACE_ENV_SINGLE_ARG_DECL)
+ ACE_THROW_SPEC ((
+ CORBA::SystemException
+ ))
+{
+ TAO_Notify_SupplierAdmin_Seq_Worker seq_worker;
+
+ return seq_worker.create (this->sa_container() ACE_ENV_ARG_PARAMETER);
+}
+
+void
+TAO_Notify_EventChannel::set_admin (const CosNotification::AdminProperties & admin ACE_ENV_ARG_DECL_NOT_USED)
+ ACE_THROW_SPEC ((
+ CORBA::SystemException
+ , CosNotification::UnsupportedAdmin
+ ))
+{
+ this->admin_properties().init (admin);
+}
+
+CosNotification::AdminProperties*
+TAO_Notify_EventChannel::get_admin (ACE_ENV_SINGLE_ARG_DECL)
+ ACE_THROW_SPEC ((
+ CORBA::SystemException
+ ))
+{
+ CosNotification::AdminProperties_var properties;
+
+ ACE_NEW_THROW_EX (properties,
+ CosNotification::AdminProperties (),
+ CORBA::NO_MEMORY ());
+
+ this->admin_properties().populate (properties);
+
+ return properties._retn ();
+}
+
+CosEventChannelAdmin::ConsumerAdmin_ptr
+TAO_Notify_EventChannel::for_consumers (ACE_ENV_SINGLE_ARG_DECL)
+ ACE_THROW_SPEC ((
+ CORBA::SystemException
+ ))
+{
+ return this->default_consumer_admin(ACE_ENV_SINGLE_ARG_PARAMETER);
+}
+
+CosEventChannelAdmin::SupplierAdmin_ptr
+TAO_Notify_EventChannel::for_suppliers (ACE_ENV_SINGLE_ARG_DECL)
+ ACE_THROW_SPEC ((
+ CORBA::SystemException
+ ))
+{
+ return this->default_supplier_admin (ACE_ENV_SINGLE_ARG_PARAMETER);
+}
+
+void
+TAO_Notify_EventChannel::validate_qos (const CosNotification::QoSProperties & /*required_qos*/,
+ CosNotification::NamedPropertyRangeSeq_out /*available_qos*/
+ ACE_ENV_ARG_DECL
+ )
+ ACE_THROW_SPEC ((
+ CORBA::SystemException
+ , CosNotification::UnsupportedQoS
+ ))
+{
+ ACE_THROW (CORBA::NO_IMPLEMENT ());
+}
+
+void
+TAO_Notify_EventChannel::save_persistent (TAO_Notify::Topology_Saver& saver ACE_ENV_ARG_DECL)
+{
+ bool changed = this->self_changed_;
+ this->self_changed_ = false;
+ this->children_changed_ = false;
+
+ if (is_persistent ())
+ {
+ TAO_Notify::NVPList attrs;
+ this->save_attrs(attrs);
+
+ bool want_all_children = saver.begin_object(
+ this->id(), "channel", attrs, changed ACE_ENV_ARG_PARAMETER);
+ ACE_CHECK;
+
+ TAO_Notify::Save_Persist_Worker<TAO_Notify_ConsumerAdmin> ca_wrk(saver, want_all_children);
+
+ this->ca_container().collection()->for_each(&ca_wrk ACE_ENV_ARG_PARAMETER);
+ ACE_CHECK;
+
+ TAO_Notify::Save_Persist_Worker<TAO_Notify_SupplierAdmin> sa_wrk(saver, want_all_children);
+ this->sa_container().collection()->for_each(&sa_wrk ACE_ENV_ARG_PARAMETER);
+ ACE_CHECK;
+
+ saver.end_object(this->id(), "channel" ACE_ENV_ARG_PARAMETER);
+ }
+}
+
+namespace {
+ template<class T>
+ void add_attr(TAO_Notify::NVPList& attrs, const T& prop) {
+ if (prop.is_valid())
+ {
+ attrs.push_back(TAO_Notify::NVP (prop));
+ }
+ }
+}
+
+void
+TAO_Notify_EventChannel::save_attrs(TAO_Notify::NVPList& attrs)
+{
+ TAO_Notify_Object::save_attrs(attrs);
+ add_attr(attrs, this->admin_properties().max_global_queue_length());
+ add_attr(attrs, this->admin_properties().max_consumers());
+ add_attr(attrs, this->admin_properties().max_suppliers());
+ add_attr(attrs, this->admin_properties().reject_new_events());
+}
+
+void
+TAO_Notify_EventChannel::load_attrs(const TAO_Notify::NVPList& attrs)
+{
+ TAO_Notify_Object::load_attrs(attrs);
+ attrs.load(this->admin_properties().max_global_queue_length());
+ attrs.load(this->admin_properties().max_consumers());
+ attrs.load(this->admin_properties().max_suppliers());
+ attrs.load(this->admin_properties().reject_new_events());
+ this->admin_properties().init();
+}
+
+TAO_Notify::Topology_Object *
+TAO_Notify_EventChannel::load_child (const ACE_CString &type,
+ CORBA::Long id,
+ const TAO_Notify::NVPList& attrs
+ ACE_ENV_ARG_DECL)
+{
+ TAO_Notify::Topology_Object* result = this;
+ if (type == "consumer_admin")
+ {
+ if (DEBUG_LEVEL) ACE_DEBUG ((LM_DEBUG,
+ ACE_TEXT ("(%P|%t) EventChannel reload consumer_admin %d\n")
+ , static_cast<int> (id)
+ ));
+
+ // call special builder method to reload
+ TAO_Notify_Builder* bld = TAO_Notify_PROPERTIES::instance()->builder();
+ TAO_Notify_ConsumerAdmin * ca = bld->build_consumer_admin (
+ this,
+ id
+ ACE_ENV_ARG_PARAMETER);
+ ACE_CHECK_RETURN(0);
+ ca->load_attrs (attrs);
+ if (ca->is_default ())
+ {
+ CORBA::Object_var caob = this->poa()->servant_to_reference (ca ACE_ENV_ARG_PARAMETER);
+ ACE_CHECK_RETURN(0);
+ this->default_consumer_admin_ =
+ CosNotifyChannelAdmin::ConsumerAdmin::_narrow (
+ caob.in () ACE_ENV_ARG_PARAMETER);
+ ACE_CHECK_RETURN(0);
+ }
+ result = ca;
+ }
+ else if (type == "supplier_admin")
+ {
+ if (DEBUG_LEVEL) ACE_DEBUG ((LM_DEBUG,
+ ACE_TEXT ("(%P|%t) EventChannel reload supplier_admin %d\n")
+ , static_cast<int> (id)
+ ));
+ TAO_Notify_Builder* bld = TAO_Notify_PROPERTIES::instance()->builder();
+
+ TAO_Notify_SupplierAdmin * sa = bld->build_supplier_admin (
+ this,
+ id
+ ACE_ENV_ARG_PARAMETER);
+ ACE_CHECK_RETURN(0);
+ sa->load_attrs (attrs);
+ if (sa->is_default ())
+ {
+ CORBA::Object_var saob = this->poa()->servant_to_reference (sa ACE_ENV_ARG_PARAMETER);
+ ACE_CHECK_RETURN(0);
+ this->default_supplier_admin_ =
+ CosNotifyChannelAdmin::SupplierAdmin::_narrow (
+ saob.in () ACE_ENV_ARG_PARAMETER);
+ ACE_CHECK_RETURN(0);
+ }
+ result = sa;
+ }
+ return result;
+}
+TAO_Notify_ProxyConsumer *
+TAO_Notify_EventChannel::find_proxy_consumer (TAO_Notify::IdVec & id_path, size_t position ACE_ENV_ARG_DECL)
+{
+ TAO_Notify_ProxyConsumer * result = 0;
+ size_t path_size = id_path.size ();
+ if (position < path_size)
+ {
+ TAO_Notify_SupplierAdmin_Find_Worker find_worker;
+ TAO_Notify_SupplierAdmin * admin = find_worker.find (id_path[position], this->sa_container() ACE_ENV_ARG_PARAMETER);
+ ACE_CHECK_RETURN (0);
+ ++position;
+ if (admin != 0)
+ {
+ result = admin->find_proxy_consumer (id_path, position
+ ACE_ENV_ARG_PARAMETER);
+ ACE_CHECK_RETURN(0);
+ }
+ }
+ return result;
+}
+
+TAO_Notify_ProxySupplier *
+TAO_Notify_EventChannel::find_proxy_supplier (TAO_Notify::IdVec & id_path, size_t position ACE_ENV_ARG_DECL)
+{
+ TAO_Notify_ProxySupplier * result = 0;
+ size_t path_size = id_path.size ();
+ if (position < path_size)
+ {
+ TAO_Notify_ConsumerAdmin_Find_Worker find_worker;
+ TAO_Notify_ConsumerAdmin * admin = find_worker.find (id_path[position], this->ca_container() ACE_ENV_ARG_PARAMETER);
+ ACE_CHECK_RETURN (0);
+ ++position;
+ if (admin != 0)
+ {
+ result = admin->find_proxy_supplier (id_path, position
+ ACE_ENV_ARG_PARAMETER);
+ ACE_CHECK_RETURN(0);
+ }
+ }
+ return result;
+}
+
+
+void
+TAO_Notify_EventChannel::reconnect (ACE_ENV_SINGLE_ARG_DECL)
+{
+ TAO_Notify::Reconnect_Worker<TAO_Notify_ConsumerAdmin> ca_wrk;
+ this->ca_container().collection()->for_each(&ca_wrk ACE_ENV_ARG_PARAMETER);
+ ACE_CHECK;
+
+ TAO_Notify::Reconnect_Worker<TAO_Notify_SupplierAdmin> sa_wrk;
+ this->sa_container().collection()->for_each(&sa_wrk ACE_ENV_ARG_PARAMETER);
+ ACE_CHECK;
+}
+
+TAO_Notify_EventChannel::TAO_Notify_ConsumerAdmin_Container&
+TAO_Notify_EventChannel::ca_container()
+{
+ ACE_ASSERT( this->ca_container_.get() != 0 );
+ return *ca_container_;
+}
+
+TAO_Notify_EventChannel::TAO_Notify_SupplierAdmin_Container&
+TAO_Notify_EventChannel::sa_container()
+{
+ ACE_ASSERT( this->sa_container_.get() != 0 );
+ return *sa_container_;
+}
+
+TAO_END_VERSIONED_NAMESPACE_DECL
diff --git a/TAO/orbsvcs/orbsvcs/Notify/EventChannel.h b/TAO/orbsvcs/orbsvcs/Notify/EventChannel.h
new file mode 100644
index 00000000000..2fe1c13ff05
--- /dev/null
+++ b/TAO/orbsvcs/orbsvcs/Notify/EventChannel.h
@@ -0,0 +1,254 @@
+/* -*- C++ -*- */
+/**
+ * @file EventChannel.h
+ *
+ * $Id$
+ *
+ * @author Pradeep Gore <pradeep@oomworks.com>
+ *
+ *
+ */
+
+#ifndef TAO_Notify_EVENTCHANNEL_H
+#define TAO_Notify_EVENTCHANNEL_H
+
+#include /**/ "ace/pre.h"
+
+#include "orbsvcs/Notify/notify_serv_export.h"
+
+#if !defined (ACE_LACKS_PRAGMA_ONCE)
+# pragma once
+#endif /* ACE_LACKS_PRAGMA_ONCE */
+
+#include "orbsvcs/CosNotifyChannelAdminS.h"
+#include "orbsvcs/Notify/Topology_Object.h"
+#include "orbsvcs/Notify/Object.h"
+#include "orbsvcs/Notify/EventChannelFactory.h"
+
+TAO_BEGIN_VERSIONED_NAMESPACE_DECL
+
+class TAO_Notify_ConsumerAdmin;
+class TAO_Notify_SupplierAdmin;
+class TAO_Notify_EventChannelFactory;
+class TAO_Notify_ProxyConsumer;
+class TAO_Notify_ProxySupplier;
+template <class TYPE> class TAO_Notify_Container_T;
+
+#if defined(_MSC_VER)
+#pragma warning(push)
+#pragma warning(disable:4250)
+#endif /* _MSC_VER */
+
+/**
+ * @class TAO_Notify_EventChannel
+ *
+ * @brief Implementation of CosNotifyChannelAdmin::EventChannel
+ *
+ */
+class TAO_Notify_Serv_Export TAO_Notify_EventChannel
+ : public POA_CosNotifyChannelAdmin::EventChannel,
+ public TAO_Notify::Topology_Parent
+{
+ friend class TAO_Notify_Builder;
+
+public:
+ typedef TAO_Notify_Refcountable_Guard_T< TAO_Notify_EventChannel > Ptr;
+ typedef CosNotifyChannelAdmin::ChannelIDSeq SEQ;
+ typedef CosNotifyChannelAdmin::ChannelIDSeq_var SEQ_VAR;
+
+ /// Constuctor
+ TAO_Notify_EventChannel (void);
+
+ /// Destructor
+ virtual ~TAO_Notify_EventChannel ();
+
+ /// Init
+ void init (TAO_Notify_EventChannelFactory* ecf
+ , const CosNotification::QoSProperties & initial_qos
+ , const CosNotification::AdminProperties & initial_admin
+ ACE_ENV_ARG_DECL);
+
+ /// Init (for reload)
+ void init (TAO_Notify::Topology_Parent * parent
+ ACE_ENV_ARG_DECL);
+
+ /// Remove ConsumerAdmin from its container.
+ void remove (TAO_Notify_ConsumerAdmin* consumer_admin ACE_ENV_ARG_DECL);
+
+ /// Remove SupplierAdmin from its container.
+ void remove (TAO_Notify_SupplierAdmin* supplier_admin ACE_ENV_ARG_DECL);
+
+ /// ServantBase refcount methods.
+ virtual void _add_ref (ACE_ENV_SINGLE_ARG_DECL);
+ virtual void _remove_ref (ACE_ENV_SINGLE_ARG_DECL);
+
+ // TAO_Notify::Topology_Parent
+
+ virtual void save_persistent (TAO_Notify::Topology_Saver& saver ACE_ENV_ARG_DECL);
+ virtual TAO_Notify::Topology_Object* load_child (const ACE_CString &type,
+ CORBA::Long id,
+ const TAO_Notify::NVPList& attrs
+ ACE_ENV_ARG_DECL);
+ virtual void reconnect (ACE_ENV_SINGLE_ARG_DECL);
+
+ virtual TAO_Notify_Object::ID get_id () const {return id();}
+
+ TAO_Notify_ProxyConsumer * find_proxy_consumer (TAO_Notify::IdVec & id_path, size_t position ACE_ENV_ARG_DECL);
+ TAO_Notify_ProxySupplier * find_proxy_supplier (TAO_Notify::IdVec & id_path, size_t position ACE_ENV_ARG_DECL);
+
+ /// Shutdown
+ virtual int shutdown (ACE_ENV_SINGLE_ARG_DECL);
+ virtual void load_attrs(const TAO_Notify::NVPList& attrs);
+
+private:
+ typedef TAO_Notify_Container_T <TAO_Notify_ConsumerAdmin> TAO_Notify_ConsumerAdmin_Container;
+ typedef TAO_Notify_Container_T <TAO_Notify_SupplierAdmin> TAO_Notify_SupplierAdmin_Container;
+
+ virtual void save_attrs(TAO_Notify::NVPList& attrs);
+
+ /// = Data Members
+ /// The parent object.
+ TAO_Notify_EventChannelFactory::Ptr ecf_;
+
+ TAO_SYNCH_MUTEX default_admin_mutex_;
+
+ // Default Consumer Admin
+ CosNotifyChannelAdmin::ConsumerAdmin_var default_consumer_admin_;
+
+ // Default Supplier Admin
+ CosNotifyChannelAdmin::SupplierAdmin_var default_supplier_admin_;
+
+ /// =CosNotifyChannelAdmin::EventChannel methods
+
+ virtual void destroy (ACE_ENV_SINGLE_ARG_DECL)
+ ACE_THROW_SPEC ((
+ CORBA::SystemException
+ ));
+
+ virtual ::CosNotifyChannelAdmin::EventChannelFactory_ptr MyFactory (ACE_ENV_SINGLE_ARG_DECL
+ )
+ ACE_THROW_SPEC ((
+ CORBA::SystemException
+ ));
+
+ virtual ::CosNotifyChannelAdmin::ConsumerAdmin_ptr default_consumer_admin (ACE_ENV_SINGLE_ARG_DECL
+
+ )
+ ACE_THROW_SPEC ((
+ CORBA::SystemException
+ ));
+
+ virtual ::CosNotifyChannelAdmin::SupplierAdmin_ptr default_supplier_admin (ACE_ENV_SINGLE_ARG_DECL
+
+ )
+ ACE_THROW_SPEC ((
+ CORBA::SystemException
+ ));
+
+ virtual ::CosNotifyFilter::FilterFactory_ptr default_filter_factory (ACE_ENV_SINGLE_ARG_DECL)
+ ACE_THROW_SPEC ((
+ CORBA::SystemException
+ ));
+
+ virtual ::CosNotifyChannelAdmin::ConsumerAdmin_ptr new_for_consumers (CosNotifyChannelAdmin::InterFilterGroupOperator op,
+ CosNotifyChannelAdmin::AdminID_out id
+ ACE_ENV_ARG_DECL)
+ ACE_THROW_SPEC ((
+ CORBA::SystemException
+ ));
+
+ virtual ::CosNotifyChannelAdmin::SupplierAdmin_ptr new_for_suppliers (CosNotifyChannelAdmin::InterFilterGroupOperator op,
+ CosNotifyChannelAdmin::AdminID_out id
+ ACE_ENV_ARG_DECL)
+ ACE_THROW_SPEC ((
+ CORBA::SystemException
+ ));
+
+ virtual ::CosNotifyChannelAdmin::ConsumerAdmin_ptr get_consumeradmin (CosNotifyChannelAdmin::AdminID id
+ ACE_ENV_ARG_DECL)
+ ACE_THROW_SPEC ((
+ CORBA::SystemException
+ , CosNotifyChannelAdmin::AdminNotFound
+ ));
+
+ virtual ::CosNotifyChannelAdmin::SupplierAdmin_ptr get_supplieradmin (CosNotifyChannelAdmin::AdminID id
+ ACE_ENV_ARG_DECL)
+ ACE_THROW_SPEC ((
+ CORBA::SystemException
+ , CosNotifyChannelAdmin::AdminNotFound
+ ));
+
+ virtual ::CosNotifyChannelAdmin::AdminIDSeq * get_all_consumeradmins (ACE_ENV_SINGLE_ARG_DECL)
+ ACE_THROW_SPEC ((
+ CORBA::SystemException
+ ));
+
+ virtual ::CosNotifyChannelAdmin::AdminIDSeq * get_all_supplieradmins (ACE_ENV_SINGLE_ARG_DECL)
+ ACE_THROW_SPEC ((
+ CORBA::SystemException
+ ));
+
+ virtual ::CosNotification::QoSProperties * get_qos (ACE_ENV_SINGLE_ARG_DECL)
+ ACE_THROW_SPEC ((
+ CORBA::SystemException
+ ));
+
+ virtual void set_qos (const CosNotification::QoSProperties & qos
+ ACE_ENV_ARG_DECL)
+ ACE_THROW_SPEC ((
+ CORBA::SystemException
+ , CosNotification::UnsupportedQoS
+ ));
+
+ virtual void validate_qos (const CosNotification::QoSProperties & required_qos,
+ CosNotification::NamedPropertyRangeSeq_out available_qos
+ ACE_ENV_ARG_DECL)
+ ACE_THROW_SPEC ((
+ CORBA::SystemException
+ , CosNotification::UnsupportedQoS
+ ));
+
+ virtual ::CosNotification::AdminProperties * get_admin (ACE_ENV_SINGLE_ARG_DECL)
+ ACE_THROW_SPEC ((
+ CORBA::SystemException
+ ));
+
+ virtual void set_admin (const CosNotification::AdminProperties & admin ACE_ENV_ARG_DECL)
+ ACE_THROW_SPEC ((
+ CORBA::SystemException
+ , CosNotification::UnsupportedAdmin
+ ));
+
+ virtual ::CosEventChannelAdmin::ConsumerAdmin_ptr for_consumers (ACE_ENV_SINGLE_ARG_DECL)
+ ACE_THROW_SPEC ((
+ CORBA::SystemException
+ ));
+
+ virtual ::CosEventChannelAdmin::SupplierAdmin_ptr for_suppliers (ACE_ENV_SINGLE_ARG_DECL)
+ ACE_THROW_SPEC ((
+ CORBA::SystemException
+ ));
+
+private:
+ TAO_Notify_ConsumerAdmin_Container& ca_container();
+ TAO_Notify_SupplierAdmin_Container& sa_container();
+
+ /// ConsumerAdmin Container.
+ ACE_Auto_Ptr< TAO_Notify_ConsumerAdmin_Container > ca_container_;
+
+ /// SupplierAdmin Container.
+ ACE_Auto_Ptr< TAO_Notify_SupplierAdmin_Container > sa_container_;
+
+ /// Release
+ virtual void release (void);
+};
+
+TAO_END_VERSIONED_NAMESPACE_DECL
+
+#if defined(_MSC_VER)
+#pragma warning(pop)
+#endif /* _MSC_VER */
+
+#include /**/ "ace/post.h"
+
+#endif /* TAO_Notify_EVENTCHANNEL_H */
diff --git a/TAO/orbsvcs/orbsvcs/Notify/EventChannelFactory.cpp b/TAO/orbsvcs/orbsvcs/Notify/EventChannelFactory.cpp
new file mode 100644
index 00000000000..2cf855c3009
--- /dev/null
+++ b/TAO/orbsvcs/orbsvcs/Notify/EventChannelFactory.cpp
@@ -0,0 +1,564 @@
+// $Id$
+
+#include "orbsvcs/Notify/EventChannelFactory.h"
+
+ACE_RCSID(Notify, TAO_Notify_EventChannelFactory, "$Id$")
+
+#include "orbsvcs/Notify/Properties.h"
+#include "orbsvcs/Notify/Factory.h"
+#include "orbsvcs/Notify/Builder.h"
+#include "orbsvcs/Notify/Topology_Saver.h"
+#include "orbsvcs/Notify/Topology_Loader.h"
+#include "orbsvcs/Notify/Save_Persist_Worker_T.h"
+#include "orbsvcs/Notify/Reconnect_Worker_T.h"
+#include "orbsvcs/Notify/Event_Persistence_Strategy.h"
+#include "orbsvcs/Notify/Routing_Slip_Persistence_Manager.h"
+#include "orbsvcs/Notify/EventChannel.h"
+#include "orbsvcs/Notify/Container_T.h"
+#include "orbsvcs/Notify/Find_Worker_T.h"
+#include "orbsvcs/Notify/Seq_Worker_T.h"
+#include "orbsvcs/Notify/POA_Helper.h"
+
+#include "ace/Dynamic_Service.h"
+
+#include "tao/debug.h"
+//#define DEBUG_LEVEL 9
+#ifndef DEBUG_LEVEL
+# define DEBUG_LEVEL TAO_debug_level
+#endif //DEBUG_LEVEL
+
+TAO_BEGIN_VERSIONED_NAMESPACE_DECL
+
+// Include this here since this is the only file that
+// requires Topology_Factory.
+namespace TAO_Notify
+{
+ // virtual
+ Topology_Factory::~Topology_Factory ()
+ {
+ }
+}
+
+typedef TAO_Notify_Find_Worker_T<TAO_Notify_EventChannel
+ , CosNotifyChannelAdmin::EventChannel
+ , CosNotifyChannelAdmin::EventChannel_ptr
+ , CosNotifyChannelAdmin::ChannelNotFound>
+TAO_Notify_EventChannel_Find_Worker;
+
+typedef TAO_Notify_Seq_Worker_T<TAO_Notify_EventChannel> TAO_Notify_EventChannel_Seq_Worker;
+
+TAO_Notify_EventChannelFactory::TAO_Notify_EventChannelFactory (void)
+ : topology_save_seq_ (0)
+ , topology_factory_(0)
+ , reconnect_registry_(*this)
+ , loading_topology_ (false)
+{
+}
+
+TAO_Notify_EventChannelFactory::~TAO_Notify_EventChannelFactory ()
+{
+}
+
+void
+TAO_Notify_EventChannelFactory::destroy (ACE_ENV_SINGLE_ARG_DECL)
+ ACE_THROW_SPEC ((
+ CORBA::SystemException
+ ))
+{
+ int result = this->shutdown (ACE_ENV_SINGLE_ARG_PARAMETER);
+ ACE_CHECK;
+ if ( result == 1)
+ return;
+
+ TAO_Notify_Properties* properties = TAO_Notify_PROPERTIES::instance();
+
+ // Reset references to CORBA objects.
+ properties->orb (CORBA::ORB::_nil ());
+ properties->default_poa (PortableServer::POA::_nil ());
+
+ ec_container_.reset( 0 );
+}
+
+void
+TAO_Notify_EventChannelFactory::init (PortableServer::POA_ptr poa ACE_ENV_ARG_DECL)
+{
+ ACE_ASSERT (this->ec_container_.get() == 0);
+
+ this->default_filter_factory_ =
+ TAO_Notify_PROPERTIES::instance()->builder()->build_filter_factory (ACE_ENV_SINGLE_ARG_PARAMETER);
+ ACE_CHECK;
+
+ // Init ec_container_
+ TAO_Notify_EventChannel_Container* ecc = 0;
+ ACE_NEW_THROW_EX (ecc,
+ TAO_Notify_EventChannel_Container (),
+ CORBA::INTERNAL ());
+ ACE_CHECK;
+ this->ec_container_.reset( ecc );
+
+ this->ec_container().init (ACE_ENV_SINGLE_ARG_PARAMETER);
+ ACE_CHECK;
+
+ TAO_Notify_POA_Helper* object_poa = 0;
+
+ // Bootstrap initial Object POA
+ ACE_NEW_THROW_EX (object_poa,
+ TAO_Notify_POA_Helper (),
+ CORBA::NO_MEMORY ());
+ ACE_CHECK;
+
+ ACE_Auto_Ptr<TAO_Notify_POA_Helper> auto_object_poa (object_poa);
+
+ object_poa->init (poa ACE_ENV_ARG_PARAMETER);
+ ACE_CHECK;
+
+ this->adopt_poa (auto_object_poa.release ());
+
+ // Note topology factory is configured separately from the "builder" mediated
+ // objects since it is independant of the "style" of Notification Service.
+ this->topology_factory_ =
+ ACE_Dynamic_Service <TAO_Notify::Topology_Factory>::instance ("Topology_Factory");
+
+ this->load_topology (ACE_ENV_SINGLE_ARG_PARAMETER);
+ ACE_CHECK;
+
+ this->load_event_persistence (ACE_ENV_SINGLE_ARG_PARAMETER);
+ ACE_CHECK;
+}
+
+void
+TAO_Notify_EventChannelFactory::_add_ref (ACE_ENV_SINGLE_ARG_DECL_NOT_USED)
+{
+ this->_incr_refcnt ();
+}
+
+void
+TAO_Notify_EventChannelFactory::_remove_ref (ACE_ENV_SINGLE_ARG_DECL_NOT_USED)
+{
+ this->_decr_refcnt ();
+}
+
+void
+TAO_Notify_EventChannelFactory::release (void)
+{
+ delete this;
+ //@@ inform factory
+}
+
+void
+TAO_Notify_EventChannelFactory::remove (TAO_Notify_EventChannel* event_channel ACE_ENV_ARG_DECL)
+{
+ this->ec_container().remove (event_channel ACE_ENV_ARG_PARAMETER);
+ ACE_CHECK;
+ this->self_change (ACE_ENV_SINGLE_ARG_PARAMETER);
+}
+
+int
+TAO_Notify_EventChannelFactory::shutdown (ACE_ENV_SINGLE_ARG_DECL)
+{
+ int sd_ret = TAO_Notify_Object::shutdown (ACE_ENV_SINGLE_ARG_PARAMETER);
+ ACE_CHECK_RETURN (1);
+
+ if (sd_ret == 1)
+ return 1;
+
+ this->ec_container().shutdown (ACE_ENV_SINGLE_ARG_PARAMETER);
+ ACE_CHECK_RETURN (1);
+
+ return 0;
+}
+
+CosNotifyFilter::FilterFactory_ptr
+TAO_Notify_EventChannelFactory::get_default_filter_factory (ACE_ENV_SINGLE_ARG_DECL_NOT_USED)
+{
+ return CosNotifyFilter::FilterFactory::_duplicate (this->default_filter_factory_.in ());
+}
+
+::CosNotifyChannelAdmin::EventChannel_ptr TAO_Notify_EventChannelFactory::create_channel (
+ const CosNotification::QoSProperties & initial_qos,
+ const CosNotification::AdminProperties & initial_admin,
+ CosNotifyChannelAdmin::ChannelID_out id ACE_ENV_ARG_DECL
+ )
+ ACE_THROW_SPEC ((
+ CORBA::SystemException
+ , CosNotification::UnsupportedQoS
+ , CosNotification::UnsupportedAdmin
+ ))
+{
+ CosNotifyChannelAdmin::EventChannel_var ec =
+ TAO_Notify_PROPERTIES::instance()->builder()->build_event_channel (this
+ , initial_qos
+ , initial_admin
+ , id
+ ACE_ENV_ARG_PARAMETER);
+ ACE_CHECK_RETURN (CosNotifyChannelAdmin::EventChannel::_nil());
+ this->self_change (ACE_ENV_SINGLE_ARG_PARAMETER);
+ ACE_CHECK_RETURN (CosNotifyChannelAdmin::EventChannel::_nil());
+ return ec._retn ();
+}
+
+CosNotifyChannelAdmin::ChannelIDSeq*
+TAO_Notify_EventChannelFactory::get_all_channels (ACE_ENV_SINGLE_ARG_DECL)
+ ACE_THROW_SPEC ((
+ CORBA::SystemException
+ ))
+{
+ TAO_Notify_EventChannel_Seq_Worker seq_worker;
+
+ return seq_worker.create (this->ec_container() ACE_ENV_ARG_PARAMETER);
+}
+
+CosNotifyChannelAdmin::EventChannel_ptr
+TAO_Notify_EventChannelFactory::get_event_channel (CosNotifyChannelAdmin::ChannelID id ACE_ENV_ARG_DECL)
+ ACE_THROW_SPEC ((
+ CORBA::SystemException
+ , CosNotifyChannelAdmin::ChannelNotFound
+ ))
+{
+ TAO_Notify_EventChannel_Find_Worker find_worker;
+
+ return find_worker.resolve (id, this->ec_container() ACE_ENV_ARG_PARAMETER);
+}
+
+void
+TAO_Notify_EventChannelFactory::set_topology_factory(TAO_Notify::Topology_Factory* f)
+{
+ ACE_DEBUG ((LM_DEBUG,
+ ACE_TEXT ("(%P,%t) Debug Topology_Factory installed in EventChannelFactory.\n")
+ ));
+ // If the above meessage appears when you don't expect it
+ // use svc.conf to install the topology factory rather
+ // than calling this method.
+ this->topology_factory_ = f;
+}
+
+void
+TAO_Notify_EventChannelFactory::load_topology (ACE_ENV_SINGLE_ARG_DECL)
+{
+ this->loading_topology_ = true;
+ if (this->topology_factory_ != 0)
+ {
+ // create_loader will open and load the persistence file for validation
+ auto_ptr<TAO_Notify::Topology_Loader> tl(this->topology_factory_->create_loader());
+ if (tl.get () != 0)
+ {
+ tl->load (this ACE_ENV_ARG_PARAMETER);
+ ACE_CHECK;
+ }
+ }
+ else
+ {
+ if (TAO_debug_level > 0)
+ ACE_DEBUG ((LM_DEBUG, ACE_TEXT ("(%P|%t) Topology persistence disabled.\n")));
+ }
+ this->loading_topology_ = false;
+}
+bool
+TAO_Notify_EventChannelFactory::is_persistent () const
+{
+ return true;
+}
+
+void
+TAO_Notify_EventChannelFactory::save_persistent (TAO_Notify::Topology_Saver& saver ACE_ENV_ARG_DECL)
+{
+ bool changed = this->self_changed_;
+ this->self_changed_ = false;
+ this->children_changed_ = false;
+
+ TAO_Notify::NVPList attrs; // ECF has no attributes
+
+ bool want_all_children =
+ saver.begin_object(0, "channel_factory", attrs, changed ACE_ENV_ARG_PARAMETER);
+ ACE_CHECK;
+
+ // for each deleted child
+ // delete_child // if the child has persistence.
+
+ TAO_Notify::Save_Persist_Worker<TAO_Notify_EventChannel> wrk(saver, want_all_children);
+
+ this->ec_container().collection()->for_each(&wrk ACE_ENV_ARG_PARAMETER);
+ ACE_CHECK;
+
+ if (want_all_children || this->reconnect_registry_.is_changed ())
+ {
+ this->reconnect_registry_.save_persistent(saver ACE_ENV_ARG_PARAMETER);
+ ACE_CHECK;
+ }
+ saver.end_object(0, "channel_factory" ACE_ENV_ARG_PARAMETER);
+}
+
+void
+TAO_Notify_EventChannelFactory::load_event_persistence (ACE_ENV_SINGLE_ARG_DECL)
+{
+ TAO_Notify::Event_Persistence_Strategy * strategy =
+ ACE_Dynamic_Service <TAO_Notify::Event_Persistence_Strategy>::instance ("Event_Persistence");
+ if (strategy != 0)
+ {
+ if (this->topology_factory_ != 0)
+ {
+ TAO_Notify::Event_Persistence_Factory * factory = strategy->get_factory ();
+ if (factory != 0)
+ {
+ for (
+ TAO_Notify::Routing_Slip_Persistence_Manager * rspm = factory->first_reload_manager();
+ rspm != 0;
+ rspm = rspm->load_next ())
+ {
+ TAO_Notify::Routing_Slip_Ptr routing_slip = TAO_Notify::Routing_Slip::create (*this, rspm);
+ if (!routing_slip.null ())
+ {
+ this->routing_slip_restart_set_.insert (routing_slip);
+ }
+ else
+ {
+ //@@todo: tell the rspm it's an orphan, but we can't during reload
+ // we need collect these and come back later to remove them
+ ACE_DEBUG ((LM_DEBUG,
+ ACE_TEXT ("(%P|%t) Reload persistent event failed.\n")
+ ));
+ }
+ }
+ }
+ }
+ else
+ {
+ ACE_ERROR ((LM_ERROR,
+ ACE_TEXT ("(%P|%t) Notify Service: Configuration error. Event Persistence requires Topology Persistence.\n")
+ ));
+ ACE_THROW (CORBA::PERSIST_STORE());
+ ACE_CHECK;
+ }
+ }
+}
+
+bool
+TAO_Notify_EventChannelFactory::change_to_parent (ACE_ENV_SINGLE_ARG_DECL)
+{
+ bool saving = false;
+ if (! this->loading_topology_)
+ {
+ // A null pointer means that saving of topology is disabled.
+ if (this->topology_factory_ != 0)
+ {
+ saving = true;
+ // seq is used to check save-in-progress
+ // if it changes while we're waiting for the lock
+ // then our change may have already been saved, so
+ // just return. Caller will signal change again if necessary.
+ short seq = this->topology_save_seq_;
+ ACE_GUARD_THROW_EX (TAO_SYNCH_MUTEX, ace_mon, this->topology_save_lock_, CORBA::INTERNAL ());
+ ACE_CHECK_RETURN(false);
+ if (seq == this->topology_save_seq_)
+ {
+ auto_ptr<TAO_Notify::Topology_Saver> saver(this->topology_factory_->create_saver());
+ if (saver.get() != 0)
+ {
+ this->save_persistent(*saver ACE_ENV_ARG_PARAMETER);
+ ACE_CHECK_RETURN(false);
+ saver->close (ACE_ENV_SINGLE_ARG_PARAMETER);
+ ACE_CHECK_RETURN (false);
+ }
+ this->topology_save_seq_ += 1;
+ }
+ }
+ }
+ return saving;
+}
+
+TAO_Notify::Topology_Object*
+TAO_Notify_EventChannelFactory::load_child (const ACE_CString& type,
+ CORBA::Long id,
+ const TAO_Notify::
+ NVPList& attrs
+ ACE_ENV_ARG_DECL)
+{
+ // ignore anything but our valid children (ie channel)
+ TAO_Notify::Topology_Object * result = this;
+ if (type == "channel")
+ {
+ if (DEBUG_LEVEL) ACE_DEBUG ((LM_DEBUG,
+ ACE_TEXT ("(%P|%t) EventChannelFactory reload channel %d\n")
+ , static_cast<int> (id)
+ ));
+
+ TAO_Notify_Builder* bld = TAO_Notify_PROPERTIES::instance()->builder();
+ TAO_Notify_EventChannel * ec = bld->build_event_channel(
+ this ,
+ id
+ ACE_ENV_ARG_PARAMETER);
+ ACE_CHECK_RETURN(0);
+
+ ec->load_attrs (attrs);
+
+ result = ec;
+ }
+ else if (type == TAO_Notify::REGISTRY_TYPE)
+ {
+ result = & this->reconnect_registry_;
+ }
+ return result;
+}
+
+void
+TAO_Notify_EventChannelFactory::reconnect (ACE_ENV_SINGLE_ARG_DECL)
+{
+ // Reconnect all children first
+ TAO_Notify::Reconnect_Worker<TAO_Notify_EventChannel> wrk;
+
+ this->ec_container().collection()->for_each(&wrk ACE_ENV_ARG_PARAMETER);
+ ACE_CHECK;
+
+ // Then send reconnection announcement to registered clients
+ ACE_ASSERT (!CORBA::is_nil (this->channel_factory_.in ()));
+ this->reconnect_registry_.send_reconnect (this->channel_factory_.in () ACE_ENV_ARG_PARAMETER);
+ ACE_CHECK;
+
+ // reactivate events in-progress
+ Routing_Slip_Set::CONST_ITERATOR iter (this->routing_slip_restart_set_);
+ TAO_Notify::Routing_Slip_Ptr * routing_slip;
+ for (iter.first(); iter.next(routing_slip); iter.advance())
+ {
+ (*routing_slip)->reconnect(ACE_ENV_SINGLE_ARG_PARAMETER);
+ ACE_CHECK;
+ }
+ this->routing_slip_restart_set_.reset ();
+}
+
+NotifyExt::ReconnectionRegistry::ReconnectionID
+TAO_Notify_EventChannelFactory::register_callback (
+ NotifyExt::ReconnectionCallback_ptr reconnection
+ ACE_ENV_ARG_DECL)
+ ACE_THROW_SPEC ((CORBA::SystemException))
+{
+ return this->reconnect_registry_.register_callback (
+ reconnection
+ ACE_ENV_ARG_PARAMETER);
+}
+
+void
+TAO_Notify_EventChannelFactory::unregister_callback (
+ NotifyExt::ReconnectionRegistry::ReconnectionID id
+ ACE_ENV_ARG_DECL)
+ ACE_THROW_SPEC ((CORBA::SystemException))
+{
+ this->reconnect_registry_.unregister_callback (
+ id
+ ACE_ENV_ARG_PARAMETER);
+}
+
+CORBA::Boolean
+TAO_Notify_EventChannelFactory::is_alive (ACE_ENV_SINGLE_ARG_DECL_NOT_USED)
+ ACE_THROW_SPEC ((CORBA::SystemException))
+{
+ return CORBA::Boolean (1);
+}
+
+void
+TAO_Notify_EventChannelFactory::save_topology (ACE_ENV_SINGLE_ARG_DECL)
+ ACE_THROW_SPEC ((CORBA::SystemException))
+{
+ this->self_change (ACE_ENV_SINGLE_ARG_PARAMETER);
+ ACE_CHECK;
+}
+
+TAO_Notify_ProxyConsumer *
+TAO_Notify_EventChannelFactory::find_proxy_consumer (TAO_Notify::IdVec & id_path, size_t position ACE_ENV_ARG_DECL)
+{
+ TAO_Notify_ProxyConsumer * result = 0;
+ size_t path_size = id_path.size ();
+
+ // EventChannelFactory only: The first id is proably for the ECF itself
+ // if so, silently consume it.
+ if (position < path_size && id_path[position] == this->id())
+ {
+ ++position;
+ }
+ if (position < path_size)
+ {
+ TAO_Notify_EventChannel_Find_Worker find_worker;
+
+ TAO_Notify_EventChannel * ec = find_worker.find (id_path[position], this->ec_container() ACE_ENV_ARG_PARAMETER);
+ ACE_CHECK_RETURN (0);
+ ++position;
+ if (ec != 0)
+ {
+ result = ec->find_proxy_consumer (id_path, position
+ ACE_ENV_ARG_PARAMETER);
+ ACE_CHECK_RETURN(0);
+ }
+ }
+ return result;
+}
+
+TAO_Notify_ProxySupplier *
+TAO_Notify_EventChannelFactory::find_proxy_supplier (TAO_Notify::IdVec & id_path, size_t position ACE_ENV_ARG_DECL)
+{
+ TAO_Notify_ProxySupplier * result = 0;
+ size_t path_size = id_path.size ();
+
+ // EventChannelFactory only: The first id is proably for the ECF itself
+ // if so, silently consume it.
+ if (position < path_size && id_path[position] == this->id())
+ {
+ ++position;
+ }
+ if (position < path_size)
+ {
+ TAO_Notify_EventChannel_Find_Worker find_worker;
+ TAO_Notify_EventChannel * ec = find_worker.find (id_path[position], this->ec_container() ACE_ENV_ARG_PARAMETER);
+ ACE_CHECK_RETURN (0);
+ ++position;
+ if (ec != 0)
+ {
+ result = ec->find_proxy_supplier (id_path, position
+ ACE_ENV_ARG_PARAMETER);
+ ACE_CHECK_RETURN(0);
+ }
+ }
+ return result;
+}
+
+CosNotifyChannelAdmin::EventChannelFactory_ptr
+TAO_Notify_EventChannelFactory::activate_self (ACE_ENV_SINGLE_ARG_DECL)
+{
+ CORBA::Object_var obj = this->activate (this ACE_ENV_ARG_PARAMETER);
+ ACE_CHECK_RETURN (CosNotifyChannelAdmin::EventChannelFactory::_nil ());
+ this->channel_factory_
+ = CosNotifyChannelAdmin::EventChannelFactory::_narrow (obj.in() ACE_ENV_ARG_PARAMETER);
+ ACE_CHECK_RETURN (CosNotifyChannelAdmin::EventChannelFactory::_nil ());
+ CosNotifyChannelAdmin::EventChannelFactory::_narrow (obj.in() ACE_ENV_ARG_PARAMETER);
+ ACE_CHECK_RETURN (CosNotifyChannelAdmin::EventChannelFactory::_nil ());
+
+ ACE_TRY_NEW_ENV
+ {
+ if (DEBUG_LEVEL > 9)
+ {
+ ACE_DEBUG ((LM_DEBUG, ACE_TEXT ("(%P|%t) TAO_Notify_EventChannelFactory::activate_self") ));
+ }
+ this->reconnect (ACE_ENV_SINGLE_ARG_PARAMETER);
+ ACE_TRY_CHECK;
+ }
+ ACE_CATCHANY
+ {
+ // ignore for now
+ }
+ ACE_ENDTRY;
+ return this->channel_factory_._retn();
+}
+
+
+TAO_Notify_Object::ID
+TAO_Notify_EventChannelFactory::get_id () const
+{
+ return id();
+}
+
+TAO_Notify_EventChannelFactory::TAO_Notify_EventChannel_Container&
+TAO_Notify_EventChannelFactory::ec_container()
+{
+ ACE_ASSERT( this->ec_container_.get() != 0 );
+ return *ec_container_;
+}
+
+TAO_END_VERSIONED_NAMESPACE_DECL
diff --git a/TAO/orbsvcs/orbsvcs/Notify/EventChannelFactory.h b/TAO/orbsvcs/orbsvcs/Notify/EventChannelFactory.h
new file mode 100644
index 00000000000..be559fae20a
--- /dev/null
+++ b/TAO/orbsvcs/orbsvcs/Notify/EventChannelFactory.h
@@ -0,0 +1,207 @@
+/* -*- C++ -*- */
+/**
+ * @file EventChannelFactory.h
+ *
+ * $Id$
+ *
+ * @author Pradeep Gore <pradeep@oomworks.com>
+ *
+ *
+ */
+
+#ifndef TAO_Notify_EVENTCHANNELFACTORY_H
+#define TAO_Notify_EVENTCHANNELFACTORY_H
+
+#include /**/ "ace/pre.h"
+
+#include "orbsvcs/Notify/notify_serv_export.h"
+
+#if !defined (ACE_LACKS_PRAGMA_ONCE)
+# pragma once
+#endif /* ACE_LACKS_PRAGMA_ONCE */
+
+#include "orbsvcs/Notify/Topology_Object.h"
+#include "orbsvcs/Notify/Topology_Factory.h"
+#include "orbsvcs/Notify/Reconnection_Registry.h"
+#include "orbsvcs/Notify/Routing_Slip.h"
+
+#include "orbsvcs/CosNotifyChannelAdminS.h"
+#include "orbsvcs/NotifyExtS.h"
+
+TAO_BEGIN_VERSIONED_NAMESPACE_DECL
+
+#if defined(_MSC_VER)
+#pragma warning(push)
+#pragma warning(disable:4250)
+#endif /* _MSC_VER */
+
+class TAO_Notify_EventChannel;
+template <class TYPE> class TAO_Notify_Container_T;
+
+/**
+ * @class TAO_Notify_EventChannelFactory
+ *
+ * @brief Implementation of CosNotifyChannelAdmin::EventChannelFactory
+ *
+ */
+class TAO_Notify_Serv_Export TAO_Notify_EventChannelFactory
+ : public virtual POA_NotifyExt::EventChannelFactory
+ , public TAO_Notify::Topology_Parent
+
+{
+ friend class TAO_Notify_Builder;
+ typedef ACE_Unbounded_Set <TAO_Notify::Routing_Slip_Ptr> Routing_Slip_Set;
+
+public:
+ typedef TAO_Notify_Refcountable_Guard_T< TAO_Notify_EventChannelFactory > Ptr;
+
+ /// Constuctor
+ TAO_Notify_EventChannelFactory (void);
+
+ /// Init the factory
+ void init (PortableServer::POA_ptr poa ACE_ENV_ARG_DECL);
+
+ /// Destructor
+ virtual ~TAO_Notify_EventChannelFactory ();
+
+ /// = ServantBase Methods
+ virtual void _add_ref (ACE_ENV_SINGLE_ARG_DECL);
+ virtual void _remove_ref (ACE_ENV_SINGLE_ARG_DECL);
+
+ /// Remove <channel> from the <ec_container_>
+ void remove (TAO_Notify_EventChannel* channel ACE_ENV_ARG_DECL);
+
+ /// Accesor for the default filter factory shared by all EC's.
+ virtual CosNotifyFilter::FilterFactory_ptr get_default_filter_factory (
+ ACE_ENV_SINGLE_ARG_DECL
+ );
+
+
+ //////////////////////////
+ // The following methods are for
+ // unit testing and debugging
+
+ /// Use the registered Topology_Factory to create a loader, and
+ /// load the topology. If no Topology_Factory is registered
+ /// then nothing will be loaded.
+ void load_topology (ACE_ENV_SINGLE_ARG_DECL);
+
+ /// Use the passed in saver factory to generate topology saver objects.
+ /// Does not take ownership.
+ void set_topology_factory(TAO_Notify::Topology_Factory* sf);
+
+ //-- Topology_Parent
+
+ virtual bool is_persistent () const;
+
+ virtual void save_persistent (TAO_Notify::Topology_Saver& saver ACE_ENV_ARG_DECL);
+ virtual bool change_to_parent (ACE_ENV_SINGLE_ARG_DECL);
+ virtual TAO_Notify::Topology_Object* load_child (const ACE_CString &type,
+ CORBA::Long id,
+ const TAO_Notify::NVPList& attrs
+ ACE_ENV_ARG_DECL);
+ CosNotifyChannelAdmin::EventChannelFactory_ptr activate_self (ACE_ENV_SINGLE_ARG_DECL);
+ virtual void reconnect (ACE_ENV_SINGLE_ARG_DECL);
+
+ /// handle change notifications
+ bool handle_change (ACE_ENV_SINGLE_ARG_DECL);
+
+ void load_event_persistence (ACE_ENV_SINGLE_ARG_DECL);
+
+ virtual void save_topology (ACE_ENV_SINGLE_ARG_DECL)
+ ACE_THROW_SPEC ((CORBA::SystemException));
+
+ TAO_Notify_ProxyConsumer * find_proxy_consumer (TAO_Notify::IdVec & id_path, size_t position ACE_ENV_ARG_DECL);
+ TAO_Notify_ProxySupplier * find_proxy_supplier (TAO_Notify::IdVec & id_path, size_t position ACE_ENV_ARG_DECL);
+ TAO_Notify_Object * follow_id_path (TAO_Notify::IdVec & id_path, size_t position ACE_ENV_ARG_DECL);
+ virtual TAO_Notify_Object::ID get_id () const;
+
+
+ private:
+
+ /// = Data Members
+
+ /// The default filter factory.
+ CosNotifyFilter::FilterFactory_var default_filter_factory_;
+
+ /// = NotifyExt methods
+ virtual void destroy (ACE_ENV_SINGLE_ARG_DECL)
+ ACE_THROW_SPEC ((
+ CORBA::SystemException
+ ));
+
+ /// shutdown
+ virtual int shutdown (ACE_ENV_SINGLE_ARG_DECL);
+
+ virtual
+ NotifyExt::ReconnectionRegistry::ReconnectionID register_callback (
+ NotifyExt::ReconnectionCallback_ptr reconnection
+ ACE_ENV_ARG_DECL)
+ ACE_THROW_SPEC ((CORBA::SystemException));
+
+ virtual void unregister_callback (
+ NotifyExt::ReconnectionRegistry::ReconnectionID id
+ ACE_ENV_ARG_DECL)
+ ACE_THROW_SPEC ((CORBA::SystemException));
+
+ virtual CORBA::Boolean is_alive (ACE_ENV_SINGLE_ARG_DECL)
+ ACE_THROW_SPEC ((CORBA::SystemException));
+
+ /// = CosNotifyChannelAdmin Methods
+
+ virtual ::CosNotifyChannelAdmin::EventChannel_ptr create_channel (
+ const CosNotification::QoSProperties & initial_qos,
+ const CosNotification::AdminProperties & initial_admin,
+ CosNotifyChannelAdmin::ChannelID_out id
+ ACE_ENV_ARG_DECL
+ )
+ ACE_THROW_SPEC ((CORBA::SystemException,
+ CosNotification::UnsupportedQoS,
+ CosNotification::UnsupportedAdmin));
+
+ virtual ::CosNotifyChannelAdmin::ChannelIDSeq * get_all_channels (
+ ACE_ENV_SINGLE_ARG_DECL
+ )
+ ACE_THROW_SPEC ((CORBA::SystemException));
+
+ virtual ::CosNotifyChannelAdmin::EventChannel_ptr get_event_channel (
+ CosNotifyChannelAdmin::ChannelID id
+ ACE_ENV_ARG_DECL
+ )
+ ACE_THROW_SPEC ((CORBA::SystemException,
+ CosNotifyChannelAdmin::ChannelNotFound));
+
+private:
+ typedef TAO_Notify_Container_T<TAO_Notify_EventChannel> TAO_Notify_EventChannel_Container;
+
+ TAO_Notify_EventChannel_Container& ec_container();
+
+ /// Container for Event Channels.
+ ACE_Auto_Ptr< TAO_Notify_EventChannel_Container > ec_container_;
+
+ TAO_SYNCH_MUTEX topology_save_lock_;
+
+ CosNotifyChannelAdmin::EventChannelFactory_var channel_factory_;
+
+ /// change-in-progress detector to avoid duplicates
+ short topology_save_seq_;
+ TAO_Notify::Topology_Factory* topology_factory_;
+ TAO_Notify::Reconnection_Registry reconnect_registry_;
+ bool loading_topology_;
+
+ Routing_Slip_Set routing_slip_restart_set_;
+
+ /// Release this object.
+ virtual void release (void);
+
+};
+
+TAO_END_VERSIONED_NAMESPACE_DECL
+
+#if defined(_MSC_VER)
+#pragma warning(pop)
+#endif /* _MSC_VER */
+
+#include /**/ "ace/post.h"
+
+#endif /* TAO_Notify_EVENTCHANNELFACTORY_H */
diff --git a/TAO/orbsvcs/orbsvcs/Notify/EventType.cpp b/TAO/orbsvcs/orbsvcs/Notify/EventType.cpp
new file mode 100644
index 00000000000..e86593e9583
--- /dev/null
+++ b/TAO/orbsvcs/orbsvcs/Notify/EventType.cpp
@@ -0,0 +1,180 @@
+// $Id$
+
+#include "orbsvcs/Notify/EventType.h"
+
+#include "ace/ACE.h"
+#include "ace/Log_Msg.h"
+#include "ace/OS_NS_string.h"
+
+#if ! defined (__ACE_INLINE__)
+#include "orbsvcs/Notify/EventType.inl"
+#endif /* __ACE_INLINE__ */
+
+#include "orbsvcs/Notify/Topology_Saver.h"
+
+ACE_RCSID (Notify,
+ TAO_Notify_EventType,
+ "$Id$")
+
+TAO_BEGIN_VERSIONED_NAMESPACE_DECL
+
+TAO_Notify_EventType
+TAO_Notify_EventType::special (void)
+{
+ return TAO_Notify_EventType ("*", "%ALL");
+}
+
+TAO_Notify_EventType::TAO_Notify_EventType (void)
+{
+}
+
+void
+TAO_Notify_EventType::init_i (const char* domain_name, const char* type_name)
+{
+ this->event_type_.domain_name = domain_name;
+ this->event_type_.type_name = type_name;
+
+ if (this->is_special () == 1)
+ {
+ this->event_type_.domain_name = (const char* )"*";
+ this->event_type_.type_name = (const char* )"%ALL";
+ }
+
+ this->recompute_hash ();
+}
+
+TAO_Notify_EventType::TAO_Notify_EventType (const char* domain_name,
+ const char* type_name)
+{
+ this->init_i (domain_name, type_name);
+}
+
+TAO_Notify_EventType::TAO_Notify_EventType (
+ const CosNotification::EventType& event_type
+ )
+{
+ this->init_i (event_type.domain_name.in (), event_type.type_name.in ());
+}
+
+TAO_Notify_EventType::~TAO_Notify_EventType ()
+{
+}
+
+void
+TAO_Notify_EventType::recompute_hash (void)
+{
+ // @@ Pradeep: this code is bound to crash someday if the strings
+ // are too long.... See if the hash_pjw () function can be modified
+ // to take accumulate multiple strings, as in:
+ // hash = ACE::hash_pjw_accummulate (0, str1);
+ // hash = ACE::hash_pjw_accummulate (hash, str2);
+ //
+ // @@ Or use grow the buffer when needed, or just add the two hash
+ // values or something, but fix this code!
+ //
+ char buffer[BUFSIZ];
+ ACE_OS::strcpy (buffer, this->event_type_.domain_name.in ());
+ ACE_OS::strcat (buffer, this->event_type_.type_name.in ());
+
+ this->hash_value_ = ACE::hash_pjw (buffer);
+}
+
+TAO_Notify_EventType&
+TAO_Notify_EventType::operator=(const CosNotification::EventType& event_type)
+{
+ this->init_i (event_type.domain_name.in (),event_type.type_name.in ());
+
+ return *this;
+}
+
+TAO_Notify_EventType&
+TAO_Notify_EventType::operator=(const TAO_Notify_EventType& event_type)
+{
+ if (this == &event_type)
+ return *this;
+
+ this->init_i (event_type.event_type_.domain_name.in (),event_type.event_type_.type_name.in ());
+
+ return *this;
+}
+
+bool
+TAO_Notify_EventType::operator==(const TAO_Notify_EventType& event_type) const
+{
+ if (this->hash () != event_type.hash ())
+ return false;
+ else // compare the strings
+ return (ACE_OS::strcmp (this->event_type_.type_name, event_type.event_type_.type_name) == 0 &&
+ ACE_OS::strcmp (this->event_type_.domain_name, event_type.event_type_.domain_name) == 0
+ );
+}
+
+bool
+TAO_Notify_EventType::operator!=(const TAO_Notify_EventType& event_type) const
+{
+ if (this->hash () != event_type.hash ())
+ return true;
+ else // compare the strings
+ return (ACE_OS::strcmp (this->event_type_.type_name, event_type.event_type_.type_name) != 0 ||
+ ACE_OS::strcmp (this->event_type_.domain_name, event_type.event_type_.domain_name) != 0
+ );
+}
+
+CORBA::Boolean
+TAO_Notify_EventType::is_special (void) const
+{
+ if ((this->event_type_.domain_name == 0 ||
+ ACE_OS::strcmp (this->event_type_.domain_name, "") == 0 ||
+ ACE_OS::strcmp (this->event_type_.domain_name, "*") == 0) &&
+ (this->event_type_.type_name == 0 ||
+ ACE_OS::strcmp (this->event_type_.type_name, "") == 0 ||
+ ACE_OS::strcmp (this->event_type_.type_name, "*") == 0 ||
+ ACE_OS::strcmp (this->event_type_.type_name, "%ALL") == 0))
+ return 1;
+ else
+ return 0;
+}
+
+void
+TAO_Notify_EventType::dump (void) const
+{
+ ACE_DEBUG ((LM_DEBUG,
+ "(%s,%s)",
+ this->event_type_.domain_name.in (),
+ this->event_type_.type_name.in ()));
+}
+
+/// Initialize from an NVPList, return false on failure
+bool TAO_Notify_EventType::init(const TAO_Notify::NVPList& attrs)
+{
+ bool result = false;
+
+ ACE_CString domain;
+ ACE_CString type;
+ if (attrs.load("Domain", domain) && attrs.load("Type", type))
+ {
+ this->init_i(domain.c_str(), type.c_str());
+ result = true;
+ }
+ return result;
+
+}
+
+ // TAO_Notify::Topology_Object
+
+void
+TAO_Notify_EventType::save_persistent (TAO_Notify::Topology_Saver& saver ACE_ENV_ARG_DECL)
+{
+ TAO_Notify::NVPList attrs;
+ bool changed = true;
+
+ attrs.push_back(TAO_Notify::NVP("Domain", this->event_type_.domain_name.in()));
+ attrs.push_back(TAO_Notify::NVP("Type", this->event_type_.type_name.in()));
+ saver.begin_object(0, "subscription", attrs, changed ACE_ENV_ARG_PARAMETER);
+ ACE_CHECK;
+
+ saver.end_object(0, "subscription" ACE_ENV_ARG_PARAMETER);
+ ACE_CHECK;
+}
+
+TAO_END_VERSIONED_NAMESPACE_DECL
diff --git a/TAO/orbsvcs/orbsvcs/Notify/EventType.h b/TAO/orbsvcs/orbsvcs/Notify/EventType.h
new file mode 100644
index 00000000000..d6ba4bd1033
--- /dev/null
+++ b/TAO/orbsvcs/orbsvcs/Notify/EventType.h
@@ -0,0 +1,107 @@
+/* -*- C++ -*- */
+/**
+ * @file EventType.h
+ *
+ * $Id$
+ *
+ * @author Pradeep Gore <pradeep@oomworks.com>
+ *
+ *
+ */
+
+#ifndef TAO_Notify_EVENTTYPE_H
+#define TAO_Notify_EVENTTYPE_H
+
+#include /**/ "ace/pre.h"
+
+#include "orbsvcs/Notify/notify_serv_export.h"
+
+#if !defined (ACE_LACKS_PRAGMA_ONCE)
+# pragma once
+#endif /* ACE_LACKS_PRAGMA_ONCE */
+
+#include "orbsvcs/CosNotificationC.h"
+#include "orbsvcs/Notify/Topology_Object.h"
+
+
+TAO_BEGIN_VERSIONED_NAMESPACE_DECL
+
+/**
+ * @class TAO_Notify_EventType
+ *
+ * @brief
+ *
+ * This type is used to compare different event types.
+ * It is used by the Event Manager as a key to find subscription lists.
+ *
+ */
+class TAO_Notify_Serv_Export TAO_Notify_EventType : public TAO_Notify::Topology_Savable
+{
+public:
+ /// Constuctor
+ TAO_Notify_EventType (void);
+ TAO_Notify_EventType (const char* domain_name, const char* type_name);
+ TAO_Notify_EventType (const CosNotification::EventType& event_type);
+ // Constuctor
+
+ /// Destructor
+ virtual ~TAO_Notify_EventType ();
+
+ /// hash value
+ u_long hash (void) const;
+
+ /// Assignment from CosNotification::EventType
+ TAO_Notify_EventType& operator=(const CosNotification::EventType& event_type);
+
+ /// Assignment operator.
+ TAO_Notify_EventType& operator=(const TAO_Notify_EventType& event_type);
+
+ /// == operator
+ bool operator==(const TAO_Notify_EventType& notify_event_type) const;
+
+ /// != operator
+ bool operator!=(const TAO_Notify_EventType& notify_event_type) const;
+
+ static TAO_Notify_EventType special (void);
+ // Return the special event type.
+
+ CORBA::Boolean is_special (void) const;
+ // Is this the special event (accept everything).
+
+ const CosNotification::EventType& native (void) const;
+ // Get the type underneath us.
+
+ /// Helper to print contents.
+ void dump (void) const;
+
+ /// Initialize from an NVPList, return false on failure
+ bool init(const TAO_Notify::NVPList& attrs);
+
+ // TAO_Notify::Topology_Object
+
+ virtual void save_persistent (TAO_Notify::Topology_Saver& saver ACE_ENV_ARG_DECL);
+
+protected:
+ /// Init this object.
+ void init_i (const char* domain_name, const char* type_name);
+
+ void recompute_hash (void);
+ // Recompute the hash value.
+
+ // = Data Members
+ CosNotification::EventType event_type_;
+ // The event_type that we're decorating.
+
+ u_long hash_value_;
+ // The hash value computed.
+};
+
+TAO_END_VERSIONED_NAMESPACE_DECL
+
+#if defined (__ACE_INLINE__)
+#include "orbsvcs/Notify/EventType.inl"
+#endif /* __ACE_INLINE__ */
+
+#include /**/ "ace/post.h"
+
+#endif /* TAO_Notify_EVENTTYPE_H */
diff --git a/TAO/orbsvcs/orbsvcs/Notify/EventType.inl b/TAO/orbsvcs/orbsvcs/Notify/EventType.inl
new file mode 100644
index 00000000000..95a07479666
--- /dev/null
+++ b/TAO/orbsvcs/orbsvcs/Notify/EventType.inl
@@ -0,0 +1,19 @@
+// -*- C++ -*-
+//
+// $Id$
+
+TAO_BEGIN_VERSIONED_NAMESPACE_DECL
+
+ACE_INLINE u_long
+TAO_Notify_EventType::hash (void) const
+{
+ return this->hash_value_;
+}
+
+ACE_INLINE const CosNotification::EventType&
+TAO_Notify_EventType::native (void) const
+{
+ return event_type_;
+}
+
+TAO_END_VERSIONED_NAMESPACE_DECL
diff --git a/TAO/orbsvcs/orbsvcs/Notify/EventTypeSeq.cpp b/TAO/orbsvcs/orbsvcs/Notify/EventTypeSeq.cpp
new file mode 100644
index 00000000000..bd9d489dd63
--- /dev/null
+++ b/TAO/orbsvcs/orbsvcs/Notify/EventTypeSeq.cpp
@@ -0,0 +1,317 @@
+// $Id$
+
+#include "orbsvcs/Notify/EventTypeSeq.h"
+#include "orbsvcs/Notify/Topology_Saver.h"
+
+#include "tao/debug.h"
+//#define DEBUG_LEVEL 9
+#ifndef DEBUG_LEVEL
+# define DEBUG_LEVEL TAO_debug_level
+#endif //DEBUG_LEVEL
+
+ACE_RCSID(Notify, TAO_Notify_EventTypeSeq, "$Id$")
+
+TAO_BEGIN_VERSIONED_NAMESPACE_DECL
+
+TAO_Notify_EventTypeSeq::TAO_Notify_EventTypeSeq (void)
+{
+}
+
+TAO_Notify_EventTypeSeq::TAO_Notify_EventTypeSeq (const CosNotification::EventTypeSeq& event_type_seq)
+{
+ this->insert_seq (event_type_seq);
+}
+
+TAO_Notify_EventTypeSeq &
+TAO_Notify_EventTypeSeq::operator = (const TAO_Notify_EventTypeSeq & rhs)
+{
+ ACE_Unbounded_Set <TAO_Notify_EventType>::operator = (rhs);
+ return *this;
+}
+
+TAO_Notify_EventTypeSeq::TAO_Notify_EventTypeSeq (const TAO_Notify_EventTypeSeq & rhs)
+ : TAO_Notify_Object ()
+ , TAO_Notify::Topology_Savable ()
+ , ACE_Unbounded_Set <TAO_Notify_EventType> (rhs)
+ , TAO_Notify::Topology_Object ()
+{
+}
+
+void
+TAO_Notify_EventTypeSeq::populate (CosNotification::EventTypeSeq& event_type_seq) const
+{
+ event_type_seq.length (static_cast<CORBA::ULong> (this->size ()));
+
+ inherited::CONST_ITERATOR iter (*this);
+
+ TAO_Notify_EventType* event_type = 0;
+
+ CORBA::ULong i = 0;
+ for (iter.first (); iter.next (event_type); iter.advance (), ++i)
+ event_type_seq[i] = event_type->native ();
+}
+
+void
+TAO_Notify_EventTypeSeq::populate_no_special (CosNotification::EventTypeSeq& event_type_seq) const
+{
+ // If the special exists in us, don't include it.
+ const TAO_Notify_EventType& special = TAO_Notify_EventType::special ();
+
+ if (this->find (special) == 0)
+ {
+ event_type_seq.length (static_cast<CORBA::ULong> (this->size () - 1));
+ }
+ else
+ event_type_seq.length (static_cast<CORBA::ULong> (this->size ()));
+
+ inherited::CONST_ITERATOR iter (*this);
+
+ TAO_Notify_EventType* event_type;
+
+ CORBA::ULong i = 0;
+ for (iter.first (); iter.next (event_type); iter.advance (), ++i)
+ {
+ if (event_type->is_special () == 0) // if its not the special event type.
+ event_type_seq[i] = event_type->native ();
+ }
+}
+
+void
+TAO_Notify_EventTypeSeq::insert_seq (const CosNotification::EventTypeSeq& event_type_seq)
+{
+ TAO_Notify_EventType event_type;
+
+ for (CORBA::ULong i = 0; i < event_type_seq.length (); ++i)
+ {
+ event_type = event_type_seq[i];
+ inherited::insert (event_type);
+ }
+}
+
+void
+TAO_Notify_EventTypeSeq::remove_seq (const CosNotification::EventTypeSeq& event_type_seq)
+{
+ TAO_Notify_EventType event_type;
+
+ for (CORBA::ULong i = 0; i < event_type_seq.length (); ++i)
+ {
+ event_type = event_type_seq[i];
+ inherited::remove (event_type);
+ }
+}
+
+void
+TAO_Notify_EventTypeSeq::insert_seq (const TAO_Notify_EventTypeSeq& event_type_seq)
+{
+ TAO_Notify_EventTypeSeq::CONST_ITERATOR iter (event_type_seq);
+
+ TAO_Notify_EventType* event_type;
+
+ for (iter.first (); iter.next (event_type); iter.advance ())
+ inherited::insert (*event_type);
+}
+
+void
+TAO_Notify_EventTypeSeq::remove_seq (const TAO_Notify_EventTypeSeq& event_type_seq)
+{
+ TAO_Notify_EventTypeSeq::CONST_ITERATOR iter (event_type_seq);
+
+ TAO_Notify_EventType* event_type;
+
+ for (iter.first (); iter.next (event_type); iter.advance ())
+ inherited::remove (*event_type);
+}
+
+void
+TAO_Notify_EventTypeSeq::add_and_remove (TAO_Notify_EventTypeSeq& seq_added, TAO_Notify_EventTypeSeq& seq_remove)
+{
+ const TAO_Notify_EventType& special = TAO_Notify_EventType::special ();
+
+ if (this->find (special) == 0) // If this object has the special type.
+ {
+ if (seq_added.find (special) == 0) // if the seq. being added has the special type, you cannot be adding or removing anythings. * overrides.
+ {
+ seq_added.reset (); // remove everything from the sequence bening added.
+ seq_remove.reset (); // remove everything form whats being removed.
+ }
+ else // sequence being added does not have *
+ {
+ if (!seq_added.is_empty ()) // if sequence being added is non empty
+ {
+ this->reset (); // take away the * from this object.
+ this->insert_seq (seq_added); // insert the sequence being added as the new list of types.
+
+ seq_remove.reset (); // reset all that is being removed.
+ seq_remove.insert (special); // remove *
+ }
+ else // nothing is being added
+ {
+ if (seq_remove.find (special) == 0) // we're removing everything
+ {
+ this->reset ();
+ seq_remove.reset (); // reset all that is being removed.
+ seq_remove.insert (special); // remove *
+ }
+ else if (!seq_remove.is_empty ())
+ {
+ // if we're currently subscribed for everything and did not added anything, we can't remove something.
+ seq_remove.reset ();
+ }
+ }
+ }
+ }
+ else // if this object does not have the special type.
+ {
+ if (seq_added.find (special) == 0) // but the seq. being added has the special type,
+ {
+ if (seq_remove.find (special) == 0) // and you're removing * as well
+ {
+ seq_added.reset (); // ignore the request
+ seq_remove.reset (); // ignore the request
+ }
+ else // seq being removed does not have the special type
+ {
+ seq_remove.reset (); // everything that we're subscribed for is being removed.
+ seq_remove.insert_seq (*this);
+
+ this->reset (); // insert the special in this object.
+ this->insert (special);
+
+ seq_added.reset (); // also clear our set and add only *
+ seq_added.insert (special);
+ }
+ }
+ else // seq being added does not have special.
+ {
+ if (seq_remove.find (special) == 0) // but we're removing everything.
+ {
+ seq_remove.reset (); // move all that we have currently to removed.
+ seq_remove.insert_seq (*this);
+ }
+
+ // so now there are no specials anywhere..
+ {
+ //= First remove the duplicates in the added and removes lists.
+ // compute the intersection.
+
+ TAO_Notify_EventTypeSeq common;
+ common.intersection (seq_added, seq_remove);
+
+ // remove the common elements from both the lists so Added {BCDK} and Removed {CDEA} will yield Added {BK} and Removed {EA}
+ seq_added.remove_seq (common);
+ seq_remove.remove_seq (common);
+
+ // If we're already subscribed for an element we should not subscribe again (duplicate events).
+ // so if we currently subscribe for ABC and we Added {BK} we should now get ABCK as current subscription and Added {K}
+ common.reset ();
+ common.intersection (*this, seq_added);
+ // remove the common elements from the added list. i,e. doent ask to add what we're already added for.
+ seq_added.remove_seq (common);
+ // update the current subscription.
+ this->insert_seq (seq_added);
+
+
+ // Similarly for removed.. if we're removing EA and now our current list looks like ABC we should emd up with
+ // current subscription BC and Removed {A}
+ common.reset ();
+ common.intersection (*this, seq_remove);
+
+ seq_remove.reset ();
+ seq_remove.insert_seq (common); // only remove what we currently have.
+
+ this->remove_seq (seq_remove);
+ }
+ }
+ }
+}
+
+void
+TAO_Notify_EventTypeSeq::intersection (const TAO_Notify_EventTypeSeq& rhs, const TAO_Notify_EventTypeSeq& lhs)
+{
+ // linear search.
+ TAO_Notify_EventTypeSeq::CONST_ITERATOR rhs_iter (rhs);
+ TAO_Notify_EventType* rhs_event_type;
+
+ TAO_Notify_EventTypeSeq::CONST_ITERATOR lhs_iter (lhs);
+ TAO_Notify_EventType* lhs_event_type;
+
+ for (rhs_iter.first (); rhs_iter.next (rhs_event_type); rhs_iter.advance ())
+ {
+ for (lhs_iter.first (); lhs_iter.next (lhs_event_type); lhs_iter.advance ())
+ {
+ if (*rhs_event_type == *lhs_event_type) // if both are same add to this object.
+ this->insert (*rhs_event_type);
+ }
+ }
+}
+
+void
+TAO_Notify_EventTypeSeq::dump (void) const
+{
+ TAO_Notify_EventTypeSeq::CONST_ITERATOR iter (*this);
+
+ TAO_Notify_EventType* event_type;
+
+ for (iter.first (); iter.next (event_type); iter.advance ())
+ {
+ event_type->dump ();
+ ACE_DEBUG ((LM_DEBUG, ", "));
+ }
+}
+
+ // TAO_Notify::Topology_Object
+void
+TAO_Notify_EventTypeSeq::save_persistent (TAO_Notify::Topology_Saver& saver ACE_ENV_ARG_DECL)
+{
+ bool changed = this->self_changed_;
+ this->self_changed_ = false;
+ this->children_changed_ = false;
+ TAO_Notify::NVPList attrs;
+
+ TAO_Notify_EventTypeSeq::ITERATOR iter (*this);
+ TAO_Notify_EventType* event_type;
+
+ if (this->size() != 0)
+ {
+ saver.begin_object(0, "subscriptions", attrs, changed ACE_ENV_ARG_PARAMETER);
+ ACE_CHECK;
+ for (iter.first (); iter.next (event_type) != 0; iter.advance ())
+ {
+ event_type->save_persistent(saver ACE_ENV_ARG_PARAMETER);
+ ACE_CHECK;
+ }
+// todo:
+// for all deleted children
+// {
+// saver.delete_child(child_type, child_id);
+// }
+ saver.end_object(0, "subscriptions" ACE_ENV_ARG_PARAMETER);
+ ACE_CHECK;
+ }
+}
+
+TAO_Notify::Topology_Object*
+TAO_Notify_EventTypeSeq::load_child (const ACE_CString &type, CORBA::Long id,
+ const TAO_Notify::NVPList& attrs ACE_ENV_ARG_DECL_NOT_USED)
+{
+ ACE_UNUSED_ARG (id);
+ TAO_Notify::Topology_Object *result = this;
+ TAO_Notify_EventType et;
+
+ if ((type == "subscription") && et.init(attrs))
+ {
+ if (DEBUG_LEVEL) ACE_DEBUG ((LM_DEBUG,
+ ACE_TEXT ("(%P|%t) Event_Type reload subscription\n")
+ ));
+ inherited::insert(et);
+ }
+ return result;
+}
+
+void
+TAO_Notify_EventTypeSeq::release (void)
+{
+ delete this;
+}
+
+TAO_END_VERSIONED_NAMESPACE_DECL
diff --git a/TAO/orbsvcs/orbsvcs/Notify/EventTypeSeq.h b/TAO/orbsvcs/orbsvcs/Notify/EventTypeSeq.h
new file mode 100644
index 00000000000..cf66b603c04
--- /dev/null
+++ b/TAO/orbsvcs/orbsvcs/Notify/EventTypeSeq.h
@@ -0,0 +1,88 @@
+/* -*- C++ -*- */
+/**
+ * @file EventTypeSeq.h
+ *
+ * $Id$
+ *
+ * @author Pradeep Gore <pradeep@oomworks.com>
+ *
+ *
+ */
+
+#ifndef TAO_Notify_EVENTTYPESEQ_H
+#define TAO_Notify_EVENTTYPESEQ_H
+#include /**/ "ace/pre.h"
+
+#include "orbsvcs/Notify/notify_serv_export.h"
+
+#if !defined (ACE_LACKS_PRAGMA_ONCE)
+# pragma once
+#endif /* ACE_LACKS_PRAGMA_ONCE */
+
+#include "orbsvcs/Notify/EventType.h"
+#include "ace/Unbounded_Set.h"
+
+TAO_BEGIN_VERSIONED_NAMESPACE_DECL
+
+/**
+ * @class TAO_Notify_EventTypeSeq
+ *
+ * @brief Allows operations using the CosNotification::EventTypeSeq type.
+ *
+ */
+class TAO_Notify_Serv_Export TAO_Notify_EventTypeSeq
+ : public ACE_Unbounded_Set <TAO_Notify_EventType>
+ , public TAO_Notify::Topology_Object
+{
+ typedef ACE_Unbounded_Set <TAO_Notify_EventType> inherited;
+
+public:
+ /// Constructor
+ TAO_Notify_EventTypeSeq (void);
+ TAO_Notify_EventTypeSeq (const CosNotification::EventTypeSeq& event_type_seq);
+ TAO_Notify_EventTypeSeq (const TAO_Notify_EventTypeSeq & rhs);
+ TAO_Notify_EventTypeSeq & operator = (const TAO_Notify_EventTypeSeq & rhs);
+
+ /// Preprocess the types added and removed.
+ void add_and_remove (TAO_Notify_EventTypeSeq& added, TAO_Notify_EventTypeSeq& removed);
+
+ /// Populate this sequence with the intersection of rhs and lhs.
+ void intersection (const TAO_Notify_EventTypeSeq& rhs, const TAO_Notify_EventTypeSeq& lhs);
+
+ /// insert_seq the contents of <event_type_seq> into this object.
+ void insert_seq (const CosNotification::EventTypeSeq& event_type_seq);
+
+ /// remove_seq the contents of <event_type_seq> from this object.
+ void remove_seq (const CosNotification::EventTypeSeq& event_type_seq);
+
+ /// insert_seq the contents of <event_type_seq> into this object.
+ void insert_seq (const TAO_Notify_EventTypeSeq& event_type_seq);
+
+ /// remove_seq the contents of <event_type_seq> from this object.
+ void remove_seq (const TAO_Notify_EventTypeSeq& event_type_seq);
+
+ /// Populate <event_type_seq> with the contents of this object.
+ void populate (CosNotification::EventTypeSeq& event_type) const;
+
+ /// Populate <event_type_seq> with the contents of this object.
+ // Excludes the special event type. This is used to avoid sending * type updates to proxys.
+ void populate_no_special (CosNotification::EventTypeSeq& event_type) const;
+
+ /// Print the contents.
+ void dump (void) const;
+
+ // TAO_Notify::Topology_Object
+
+ virtual void save_persistent (TAO_Notify::Topology_Saver& saver ACE_ENV_ARG_DECL);
+ virtual TAO_Notify::Topology_Object* load_child (const ACE_CString &type, CORBA::Long id,
+ const TAO_Notify::NVPList& attrs ACE_ENV_ARG_DECL);
+
+private:
+
+ virtual void release (void);
+};
+
+TAO_END_VERSIONED_NAMESPACE_DECL
+
+#include /**/ "ace/post.h"
+#endif /* TAO_Notify_EVENTTYPESEQ_H */
diff --git a/TAO/orbsvcs/orbsvcs/Notify/Event_Manager.cpp b/TAO/orbsvcs/orbsvcs/Notify/Event_Manager.cpp
new file mode 100644
index 00000000000..35264373bd4
--- /dev/null
+++ b/TAO/orbsvcs/orbsvcs/Notify/Event_Manager.cpp
@@ -0,0 +1,309 @@
+// $Id$
+
+#include "orbsvcs/Notify/Event_Manager.h"
+
+ACE_RCSID(Notify, TAO_Notify_Event_Manager, "$Id$")
+
+#include "orbsvcs/Notify/ProxyConsumer.h"
+#include "orbsvcs/Notify/ProxySupplier.h"
+#include "orbsvcs/Notify/Consumer_Map.h"
+#include "orbsvcs/Notify/Supplier_Map.h"
+#include "orbsvcs/Notify/Event_Map_T.h"
+
+#include "orbsvcs/ESF/ESF_Worker.h"
+#include "orbsvcs/ESF/ESF_Proxy_Collection.h"
+
+#include "tao/debug.h"
+
+TAO_BEGIN_VERSIONED_NAMESPACE_DECL
+
+/*****************************************************************************/
+
+/**
+ * @class TAO_Notify_ProxyConsumer_Update_Worker
+ *
+ * @brief Inform ProxyConsumer of updates.
+ *
+ */
+class TAO_Notify_Serv_Export TAO_Notify_ProxyConsumer_Update_Worker : public TAO_ESF_Worker<TAO_Notify_ProxyConsumer>
+{
+public:
+ TAO_Notify_ProxyConsumer_Update_Worker (const TAO_Notify_EventTypeSeq& added, const TAO_Notify_EventTypeSeq& removed);
+
+protected:
+ ///= TAO_ESF_Worker method
+ void work (TAO_Notify_ProxyConsumer* proxy ACE_ENV_ARG_DECL);
+
+ const TAO_Notify_EventTypeSeq& added_;
+ const TAO_Notify_EventTypeSeq& removed_;
+};
+
+/********************************************************************************/
+
+/**
+ * @class TAO_Notify_ProxySupplier_Update_Worker
+ *
+ * @brief Inform ProxySupplier of updates.
+ *
+ */
+class TAO_Notify_Serv_Export TAO_Notify_ProxySupplier_Update_Worker : public TAO_ESF_Worker<TAO_Notify_ProxySupplier>
+{
+public:
+ TAO_Notify_ProxySupplier_Update_Worker (const TAO_Notify_EventTypeSeq& added, const TAO_Notify_EventTypeSeq& removed);
+
+protected:
+ ///= TAO_ESF_Worker method
+ void work (TAO_Notify_ProxySupplier* proxy ACE_ENV_ARG_DECL);
+
+ const TAO_Notify_EventTypeSeq& added_;
+ const TAO_Notify_EventTypeSeq& removed_;
+};
+
+/********************************************************************************/
+
+TAO_Notify_Event_Manager::TAO_Notify_Event_Manager (void)
+{
+}
+
+TAO_Notify_Event_Manager::~TAO_Notify_Event_Manager ()
+{
+ if (TAO_debug_level > 0)
+ {
+ ACE_DEBUG ((LM_DEBUG, "destroying consumer/supplier map count = %d/%d, \n",
+ this->consumer_map().proxy_count (), this->supplier_map().proxy_count ()));
+ }
+}
+
+void TAO_Notify_Event_Manager::release()
+{
+ delete this;
+}
+
+void
+TAO_Notify_Event_Manager::init (ACE_ENV_SINGLE_ARG_DECL)
+{
+ ACE_ASSERT (this->consumer_map_.get() == 0);
+
+ TAO_Notify_Consumer_Map* consumer_map = 0;
+ ACE_NEW_THROW_EX (consumer_map,
+ TAO_Notify_Consumer_Map (),
+ CORBA::NO_MEMORY ());
+ ACE_CHECK;
+ this->consumer_map_.reset( consumer_map );
+
+ this->consumer_map().init (ACE_ENV_SINGLE_ARG_PARAMETER);
+ ACE_CHECK;
+
+ TAO_Notify_Supplier_Map* supplier_map = 0;
+ ACE_NEW_THROW_EX (supplier_map,
+ TAO_Notify_Supplier_Map (),
+ CORBA::NO_MEMORY ());
+ ACE_CHECK;
+ this->supplier_map_.reset( supplier_map );
+
+ this->supplier_map_->init (ACE_ENV_SINGLE_ARG_PARAMETER);
+ ACE_CHECK;
+}
+
+void
+TAO_Notify_Event_Manager::shutdown (void)
+{
+}
+
+void
+TAO_Notify_Event_Manager::connect (TAO_Notify_ProxySupplier* proxy_supplier ACE_ENV_ARG_DECL)
+{
+ this->consumer_map().connect (proxy_supplier ACE_ENV_ARG_PARAMETER);
+ ACE_CHECK;
+
+ // Inform about offered types.
+ TAO_Notify_EventTypeSeq removed;
+ proxy_supplier->types_changed (this->offered_types (), removed ACE_ENV_ARG_PARAMETER);
+ ACE_CHECK;
+}
+
+void
+TAO_Notify_Event_Manager::disconnect (TAO_Notify_ProxySupplier* proxy_supplier ACE_ENV_ARG_DECL)
+{
+ this->consumer_map().disconnect (proxy_supplier ACE_ENV_ARG_PARAMETER);
+}
+
+void
+TAO_Notify_Event_Manager::connect (TAO_Notify_ProxyConsumer* proxy_consumer ACE_ENV_ARG_DECL)
+{
+ this->supplier_map().connect (proxy_consumer ACE_ENV_ARG_PARAMETER);
+ ACE_CHECK;
+ // Inform about subscription types.
+ TAO_Notify_EventTypeSeq removed;
+ proxy_consumer->types_changed (this->subscription_types (), removed ACE_ENV_ARG_PARAMETER);
+}
+
+void
+TAO_Notify_Event_Manager::disconnect (TAO_Notify_ProxyConsumer* proxy_consumer ACE_ENV_ARG_DECL)
+{
+ this->supplier_map().disconnect (proxy_consumer ACE_ENV_ARG_PARAMETER);
+}
+
+void
+TAO_Notify_Event_Manager::offer_change (TAO_Notify_ProxyConsumer* proxy_consumer, const TAO_Notify_EventTypeSeq& added, const TAO_Notify_EventTypeSeq& removed ACE_ENV_ARG_DECL)
+{
+ TAO_Notify_EventTypeSeq new_added, last_removed;
+
+ this->publish (proxy_consumer, added, new_added ACE_ENV_ARG_PARAMETER);
+ ACE_CHECK;
+
+ this->un_publish (proxy_consumer, removed, last_removed ACE_ENV_ARG_PARAMETER);
+ ACE_CHECK;
+
+ TAO_Notify_Consumer_Map::ENTRY::COLLECTION* updates_collection = this->consumer_map().updates_collection ();
+
+ TAO_Notify_ProxySupplier_Update_Worker worker (new_added, last_removed);
+
+ if (updates_collection != 0)
+ updates_collection->for_each (&worker ACE_ENV_ARG_PARAMETER);
+}
+
+void
+TAO_Notify_Event_Manager::subscription_change (TAO_Notify_ProxySupplier* proxy_supplier, const TAO_Notify_EventTypeSeq& added, const TAO_Notify_EventTypeSeq& removed ACE_ENV_ARG_DECL)
+{
+ TAO_Notify_EventTypeSeq new_added, last_removed;
+
+ this->subscribe (proxy_supplier, added, new_added ACE_ENV_ARG_PARAMETER);
+ ACE_CHECK;
+ this->un_subscribe (proxy_supplier, removed, last_removed ACE_ENV_ARG_PARAMETER);
+ ACE_CHECK;
+
+ TAO_Notify_Supplier_Map::ENTRY::COLLECTION* updates_collection = this->supplier_map().updates_collection ();
+
+ TAO_Notify_ProxyConsumer_Update_Worker worker (new_added, last_removed);
+
+ if (updates_collection != 0)
+ {
+ updates_collection->for_each (&worker ACE_ENV_ARG_PARAMETER);
+ ACE_CHECK;
+ }
+}
+
+void
+TAO_Notify_Event_Manager::subscribe (TAO_Notify_ProxySupplier* proxy_supplier, const TAO_Notify_EventTypeSeq& seq, TAO_Notify_EventTypeSeq& new_seq ACE_ENV_ARG_DECL)
+{
+ TAO_Notify_EventTypeSeq::CONST_ITERATOR iter (seq);
+
+ TAO_Notify_EventType* event_type;
+
+ for (iter.first (); iter.next (event_type) != 0; iter.advance ())
+ {
+ int result = this->consumer_map().insert (proxy_supplier, *event_type ACE_ENV_ARG_PARAMETER);
+ ACE_CHECK;
+
+ if (result == 1)
+ new_seq.insert (*event_type);
+ }
+}
+
+void
+TAO_Notify_Event_Manager::un_subscribe (TAO_Notify_ProxySupplier* proxy_supplier, const TAO_Notify_EventTypeSeq& seq, TAO_Notify_EventTypeSeq& last_seq ACE_ENV_ARG_DECL)
+{
+ TAO_Notify_EventTypeSeq::CONST_ITERATOR iter (seq);
+
+ TAO_Notify_EventType* event_type = 0;
+
+ for (iter.first (); iter.next (event_type) != 0; iter.advance ())
+ {
+ int result = this->consumer_map().remove (proxy_supplier, *event_type ACE_ENV_ARG_PARAMETER);
+ ACE_CHECK;
+
+ if (result == 1)
+ last_seq.insert (*event_type);
+ }
+}
+
+void
+TAO_Notify_Event_Manager::publish (TAO_Notify_ProxyConsumer* proxy_consumer, const TAO_Notify_EventTypeSeq& seq, TAO_Notify_EventTypeSeq& new_seq ACE_ENV_ARG_DECL)
+{
+ TAO_Notify_EventTypeSeq::CONST_ITERATOR iter (seq);
+
+ TAO_Notify_EventType* event_type = 0;
+
+ for (iter.first (); iter.next (event_type) != 0; iter.advance ())
+ {
+ int result = supplier_map().insert (proxy_consumer, *event_type ACE_ENV_ARG_PARAMETER);
+ ACE_CHECK;
+
+ if (result == 1)
+ new_seq.insert (*event_type);
+ }
+}
+
+void
+TAO_Notify_Event_Manager::un_publish (TAO_Notify_ProxyConsumer* proxy_consumer, const TAO_Notify_EventTypeSeq& seq, TAO_Notify_EventTypeSeq& last_seq ACE_ENV_ARG_DECL)
+{
+ TAO_Notify_EventTypeSeq::CONST_ITERATOR iter (seq);
+
+ TAO_Notify_EventType* event_type = 0;
+
+ for (iter.first (); iter.next (event_type) != 0; iter.advance ())
+ {
+ int result = supplier_map().remove (proxy_consumer, *event_type ACE_ENV_ARG_PARAMETER);
+ ACE_CHECK;
+
+ if (result == 1)
+ last_seq.insert (*event_type);
+ }
+}
+
+TAO_Notify_Consumer_Map&
+TAO_Notify_Event_Manager::consumer_map (void)
+{
+ ACE_ASSERT( this->consumer_map_.get() != 0 );
+ return *this->consumer_map_;
+}
+
+TAO_Notify_Supplier_Map&
+TAO_Notify_Event_Manager::supplier_map (void)
+{
+ ACE_ASSERT( this->supplier_map_.get() != 0 );
+ return *this->supplier_map_;
+}
+
+const TAO_Notify_EventTypeSeq&
+TAO_Notify_Event_Manager::offered_types (void) const
+{
+ return this->supplier_map_->event_types ();
+}
+
+const TAO_Notify_EventTypeSeq&
+TAO_Notify_Event_Manager::subscription_types (void) const
+{
+ return this->consumer_map_->event_types ();
+}
+
+/********************************************************************************/
+
+TAO_Notify_ProxyConsumer_Update_Worker::TAO_Notify_ProxyConsumer_Update_Worker (const TAO_Notify_EventTypeSeq& added, const TAO_Notify_EventTypeSeq& removed)
+ :added_ (added), removed_ (removed)
+{
+}
+
+void
+TAO_Notify_ProxyConsumer_Update_Worker::work (TAO_Notify_ProxyConsumer* proxy ACE_ENV_ARG_DECL)
+{
+ proxy->types_changed (added_, removed_ ACE_ENV_ARG_PARAMETER);
+}
+
+/*****************************************************************************/
+
+TAO_Notify_ProxySupplier_Update_Worker::TAO_Notify_ProxySupplier_Update_Worker (const TAO_Notify_EventTypeSeq& added, const TAO_Notify_EventTypeSeq& removed)
+ :added_ (added), removed_ (removed)
+{
+}
+
+void
+TAO_Notify_ProxySupplier_Update_Worker::work (TAO_Notify_ProxySupplier* proxy ACE_ENV_ARG_DECL)
+{
+ proxy->types_changed (added_, removed_ ACE_ENV_ARG_PARAMETER);
+}
+
+/*****************************************************************************/
+
+TAO_END_VERSIONED_NAMESPACE_DECL
diff --git a/TAO/orbsvcs/orbsvcs/Notify/Event_Manager.h b/TAO/orbsvcs/orbsvcs/Notify/Event_Manager.h
new file mode 100644
index 00000000000..ee897512072
--- /dev/null
+++ b/TAO/orbsvcs/orbsvcs/Notify/Event_Manager.h
@@ -0,0 +1,136 @@
+/* -*- C++ -*- */
+/**
+ * @file Event_Manager.h
+ *
+ * $Id$
+ *
+ * @author Pradeep Gore <pradeep@oomworks.com>
+ *
+ *
+ */
+
+#ifndef TAO_Notify_EVENT_MANAGER_H
+#define TAO_Notify_EVENT_MANAGER_H
+
+#include /**/ "ace/pre.h"
+#include "ace/Auto_Ptr.h"
+
+#include "orbsvcs/Notify/Refcountable.h"
+
+#include "orbsvcs/Notify/notify_serv_export.h"
+
+#if !defined (ACE_LACKS_PRAGMA_ONCE)
+# pragma once
+#endif /* ACE_LACKS_PRAGMA_ONCE */
+
+#include "tao/orbconf.h"
+
+#include "ace/CORBA_macros.h"
+
+TAO_BEGIN_VERSIONED_NAMESPACE_DECL
+
+class TAO_Notify_ProxySupplier;
+class TAO_Notify_ProxyConsumer;
+class TAO_Notify_EventTypeSeq;
+
+template <class PROXY, class ACE_LOCK>
+class TAO_Notify_Event_Map_T;
+
+typedef TAO_Notify_Event_Map_T<TAO_Notify_ProxySupplier,
+ TAO_SYNCH_RW_MUTEX>
+ TAO_Notify_Consumer_Map;
+
+typedef TAO_Notify_Event_Map_T<TAO_Notify_ProxyConsumer,
+ TAO_SYNCH_RW_MUTEX>
+ TAO_Notify_Supplier_Map;
+
+namespace CORBA
+{
+ class Environment;
+}
+
+/**
+ * @class TAO_Notify_Event_Manager
+ *
+ * @brief A class that manages the Consumer and Supplier maps.
+ *
+ */
+class TAO_Notify_Serv_Export TAO_Notify_Event_Manager : public TAO_Notify_Refcountable
+{
+public:
+ typedef TAO_Notify_Refcountable_Guard_T< TAO_Notify_Event_Manager > Ptr;
+ /// Constuctor
+ TAO_Notify_Event_Manager (void);
+
+ /// Destructor
+ virtual ~TAO_Notify_Event_Manager ();
+
+ void release();
+
+ /// Init
+ void init (ACE_ENV_SINGLE_ARG_DECL);
+
+ /// Init
+ void shutdown (void);
+
+ /// Connect ProxySupplier
+ void connect (TAO_Notify_ProxySupplier* proxy_supplier ACE_ENV_ARG_DECL);
+
+ /// Disconnect ProxySupplier
+ void disconnect (TAO_Notify_ProxySupplier* proxy_supplier ACE_ENV_ARG_DECL);
+
+ /// Connect ProxyConsumer
+ void connect (TAO_Notify_ProxyConsumer* proxy_consumer ACE_ENV_ARG_DECL);
+
+ /// Disconnect ProxyConsumer
+ void disconnect (TAO_Notify_ProxyConsumer* proxy_consumer ACE_ENV_ARG_DECL);
+
+ /// Map accessors.
+ TAO_Notify_Consumer_Map& consumer_map (void);
+ TAO_Notify_Supplier_Map& supplier_map (void);
+
+ /// Offer change received on <proxy_consumer>.
+ void offer_change (TAO_Notify_ProxyConsumer* proxy_consumer, const TAO_Notify_EventTypeSeq& added, const TAO_Notify_EventTypeSeq& removed ACE_ENV_ARG_DECL);
+
+ /// Subscription change received on <proxy_supplier>.
+ void subscription_change (TAO_Notify_ProxySupplier* proxy_supplier, const TAO_Notify_EventTypeSeq& added, const TAO_Notify_EventTypeSeq& removed ACE_ENV_ARG_DECL);
+
+ /// What are the types being offered.
+ const TAO_Notify_EventTypeSeq& offered_types (void) const;
+
+ /// What are the types being subscribed.
+ const TAO_Notify_EventTypeSeq& subscription_types (void) const;
+
+protected:
+ /// Subscribe <proxy_supplier> to the event type sequence list <seq>.
+ void subscribe (TAO_Notify_ProxySupplier* proxy_supplier, const TAO_Notify_EventTypeSeq& seq, TAO_Notify_EventTypeSeq& new_seq ACE_ENV_ARG_DECL);
+
+ /// Unsubscribe <proxy_supplier> to the event type sequence list <seq>.
+ void un_subscribe (TAO_Notify_ProxySupplier* proxy_supplier, const TAO_Notify_EventTypeSeq& seq, TAO_Notify_EventTypeSeq& last_seq ACE_ENV_ARG_DECL);
+
+ /// Subscribe <proxy_consumer> to the event type sequence list <seq>.
+ void publish (TAO_Notify_ProxyConsumer* proxy_consumer, const TAO_Notify_EventTypeSeq& seq, TAO_Notify_EventTypeSeq& new_seq ACE_ENV_ARG_DECL);
+
+ /// Subscribe <proxy_consumer> to the event type sequence list <seq>.
+ void un_publish (TAO_Notify_ProxyConsumer* proxy_consumer, const TAO_Notify_EventTypeSeq& seq, TAO_Notify_EventTypeSeq& last_seq ACE_ENV_ARG_DECL);
+
+private:
+ // Disallow copying and assignment; we don't need them
+ // and if we let the compiler generate them it needs the
+ // full declaration of the template arguments for ACE_Auto_Ptr<>
+ // below.
+ TAO_Notify_Event_Manager (TAO_Notify_Event_Manager&);
+ TAO_Notify_Event_Manager& operator= (TAO_Notify_Event_Manager&);
+
+ /// Consumer Map
+ ACE_Auto_Ptr< TAO_Notify_Consumer_Map > consumer_map_;
+
+ /// Supplier Map
+ ACE_Auto_Ptr< TAO_Notify_Supplier_Map > supplier_map_;
+};
+
+TAO_END_VERSIONED_NAMESPACE_DECL
+
+#include /**/ "ace/post.h"
+
+#endif /* TAO_Notify_EVENT_MANAGER_H */
diff --git a/TAO/orbsvcs/orbsvcs/Notify/Event_Map_Entry_T.cpp b/TAO/orbsvcs/orbsvcs/Notify/Event_Map_Entry_T.cpp
new file mode 100644
index 00000000000..5488c3ad420
--- /dev/null
+++ b/TAO/orbsvcs/orbsvcs/Notify/Event_Map_Entry_T.cpp
@@ -0,0 +1,58 @@
+// $Id$
+
+#ifndef TAO_Notify_EVENT_MAP_ENTRY_CPP
+#define TAO_Notify_EVENT_MAP_ENTRY_CPP
+
+#include "orbsvcs/Notify/Event_Map_Entry_T.h"
+
+#if ! defined (__ACE_INLINE__)
+#include "orbsvcs/Notify/Event_Map_Entry_T.inl"
+#endif /* __ACE_INLINE__ */
+
+ACE_RCSID (Notify,
+ TAO_Notify_Event_Map_Entry_T,
+ "$Id$")
+
+#include "orbsvcs/ESF/ESF_Proxy_Collection.h"
+#include "orbsvcs/Notify/Properties.h"
+#include "orbsvcs/Notify/Factory.h"
+
+TAO_BEGIN_VERSIONED_NAMESPACE_DECL
+
+template <class PROXY>
+TAO_Notify_Event_Map_Entry_T<PROXY>::TAO_Notify_Event_Map_Entry_T (void)
+ : collection_ (0), count_ (0), usage_count_ (1)
+{
+}
+
+template <class PROXY>
+TAO_Notify_Event_Map_Entry_T<PROXY>::~TAO_Notify_Event_Map_Entry_T ()
+{
+ delete collection_;
+}
+
+template <class PROXY> void
+TAO_Notify_Event_Map_Entry_T<PROXY>::init (ACE_ENV_SINGLE_ARG_DECL)
+{
+ TAO_Notify_Factory* factory = TAO_Notify_PROPERTIES::instance ()->factory ();
+
+ factory->create (collection_ ACE_ENV_ARG_PARAMETER);
+}
+
+template <class PROXY> void
+TAO_Notify_Event_Map_Entry_T<PROXY>::connected (PROXY* proxy ACE_ENV_ARG_DECL)
+{
+ this->collection_->connected (proxy ACE_ENV_ARG_PARAMETER);
+ ++count_;
+}
+
+template <class PROXY> void
+TAO_Notify_Event_Map_Entry_T<PROXY>::disconnected (PROXY* proxy ACE_ENV_ARG_DECL)
+{
+ this->collection_->disconnected (proxy ACE_ENV_ARG_PARAMETER);
+ --count_;
+}
+
+TAO_END_VERSIONED_NAMESPACE_DECL
+
+#endif /* TAO_Notify_EVENT_MAP_ENTRY_CPP */
diff --git a/TAO/orbsvcs/orbsvcs/Notify/Event_Map_Entry_T.h b/TAO/orbsvcs/orbsvcs/Notify/Event_Map_Entry_T.h
new file mode 100644
index 00000000000..e362f9a7efb
--- /dev/null
+++ b/TAO/orbsvcs/orbsvcs/Notify/Event_Map_Entry_T.h
@@ -0,0 +1,101 @@
+/* -*- C++ -*- */
+/**
+ * @file Event_Map_Entry_T.h
+ *
+ * $Id$
+ *
+ * @author Pradeep Gore <pradeep@oomworks.com>
+ *
+ *
+ */
+
+#ifndef TAO_Notify_EVENT_MAP_ENTRY_T_H
+#define TAO_Notify_EVENT_MAP_ENTRY_T_H
+
+#include /**/ "ace/pre.h"
+
+#include "orbsvcs/Notify/notify_serv_export.h"
+
+#if !defined (ACE_LACKS_PRAGMA_ONCE)
+# pragma once
+#endif /* ACE_LACKS_PRAGMA_ONCE */
+
+#include "ace/Copy_Disabled.h"
+#include "ace/Atomic_Op.h"
+#include "ace/CORBA_macros.h"
+#include "tao/ORB_Constants.h"
+#include "tao/orbconf.h"
+
+TAO_BEGIN_VERSIONED_NAMESPACE_DECL
+
+template <class PROXY, class ACE_LOCK> class TAO_Notify_Event_Map_T;
+template <class PROXY> class TAO_ESF_Proxy_Collection;
+
+/**
+ * @class TAO_Notify_Event_Map_Entry_T
+ *
+ * @brief The entry stored in the event map.
+ *
+ */
+template <class PROXY>
+class TAO_Notify_Event_Map_Entry_T : private ACE_Copy_Disabled
+{
+public:
+ typedef TAO_ESF_Proxy_Collection<PROXY> COLLECTION;
+
+ /// Constructor
+ TAO_Notify_Event_Map_Entry_T (void);
+
+ /// Destructor
+ ~TAO_Notify_Event_Map_Entry_T (void);
+
+ /// Init - Allocates collection
+ void init (ACE_ENV_SINGLE_ARG_DECL);
+
+ /// Connect
+ void connected (PROXY* proxy ACE_ENV_ARG_DECL);
+
+ /// Disconnect
+ void disconnected (PROXY* proxy ACE_ENV_ARG_DECL);
+
+ /// Collection accessor
+ COLLECTION* collection (void);
+
+ /// Count accessor
+ int count (void);
+
+ ///= Reference counting methods.
+ // Incr the ref count.
+ CORBA::ULong _incr_refcnt (void);
+
+ // Decr the ref count. This object is destroyed when the count is 0.
+ CORBA::ULong _decr_refcnt (void);
+
+protected:
+ /// The Collection
+ COLLECTION* collection_;
+
+ /// Count of PROXY's connected in the collection;
+ int count_;
+
+ /// Count of users accessing this entry.
+ ACE_Atomic_Op<TAO_SYNCH_MUTEX,int> usage_count_;
+};
+
+TAO_END_VERSIONED_NAMESPACE_DECL
+
+#if defined (__ACE_INLINE__)
+#include "orbsvcs/Notify/Event_Map_Entry_T.inl"
+#endif /* __ACE_INLINE__ */
+
+#if defined (ACE_TEMPLATES_REQUIRE_SOURCE)
+#include "orbsvcs/Notify/Event_Map_Entry_T.cpp"
+#endif /* ACE_TEMPLATES_REQUIRE_SOURCE */
+
+#if defined (ACE_TEMPLATES_REQUIRE_PRAGMA)
+#pragma implementation ("Event_Map_Entry_T.cpp")
+#endif /* ACE_TEMPLATES_REQUIRE_PRAGMA */
+
+#include /**/ "ace/post.h"
+
+#endif /* TAO_Notify_EVENT_MAP_ENTRY_T_H */
diff --git a/TAO/orbsvcs/orbsvcs/Notify/Event_Map_Entry_T.inl b/TAO/orbsvcs/orbsvcs/Notify/Event_Map_Entry_T.inl
new file mode 100644
index 00000000000..89da0eaed96
--- /dev/null
+++ b/TAO/orbsvcs/orbsvcs/Notify/Event_Map_Entry_T.inl
@@ -0,0 +1,31 @@
+// -*- C++ -*-
+//
+// $Id$
+
+TAO_BEGIN_VERSIONED_NAMESPACE_DECL
+
+template <class PROXY> ACE_INLINE ACE_TYPENAME
+TAO_Notify_Event_Map_Entry_T<PROXY>::COLLECTION*
+TAO_Notify_Event_Map_Entry_T<PROXY>::collection (void) {
+ return collection_;
+}
+
+template <class PROXY> ACE_INLINE int
+TAO_Notify_Event_Map_Entry_T<PROXY>::count (void)
+{
+ return this->count_;
+}
+
+template <class PROXY> ACE_INLINE CORBA::ULong
+TAO_Notify_Event_Map_Entry_T<PROXY>::_incr_refcnt (void)
+{
+ return ++this->usage_count_;
+}
+
+template <class PROXY> ACE_INLINE CORBA::ULong
+TAO_Notify_Event_Map_Entry_T<PROXY>::_decr_refcnt (void)
+{
+ return --this->usage_count_;
+}
+
+TAO_END_VERSIONED_NAMESPACE_DECL
diff --git a/TAO/orbsvcs/orbsvcs/Notify/Event_Map_T.cpp b/TAO/orbsvcs/orbsvcs/Notify/Event_Map_T.cpp
new file mode 100644
index 00000000000..121d1f51fd0
--- /dev/null
+++ b/TAO/orbsvcs/orbsvcs/Notify/Event_Map_T.cpp
@@ -0,0 +1,166 @@
+// $Id$
+
+#ifndef TAO_Notify_EVENT_MAP_T_CPP
+#define TAO_Notify_EVENT_MAP_T_CPP
+
+#include "orbsvcs/Notify/Event_Map_T.h"
+#include "orbsvcs/ESF/ESF_Proxy_Collection.h"
+#include "orbsvcs/Notify/Event_Map_Entry_T.h"
+#include "orbsvcs/Notify/Properties.h"
+#include "orbsvcs/Notify/Factory.h"
+
+#if ! defined (__ACE_INLINE__)
+#include "orbsvcs/Notify/Event_Map_T.inl"
+#endif /* __ACE_INLINE__ */
+
+TAO_BEGIN_VERSIONED_NAMESPACE_DECL
+
+template <class PROXY, class ACE_LOCK>
+TAO_Notify_Event_Map_T<PROXY, ACE_LOCK>::TAO_Notify_Event_Map_T (void)
+ :proxy_count_ (0)
+{
+
+}
+
+template <class PROXY, class ACE_LOCK>
+TAO_Notify_Event_Map_T<PROXY, ACE_LOCK>::~TAO_Notify_Event_Map_T ()
+{
+}
+
+template <class PROXY, class ACE_LOCK> void
+TAO_Notify_Event_Map_T<PROXY, ACE_LOCK>::init (ACE_ENV_SINGLE_ARG_DECL)
+{
+ this->broadcast_entry_.init (ACE_ENV_SINGLE_ARG_PARAMETER);
+ ACE_CHECK;
+
+ this->updates_entry_.init (ACE_ENV_SINGLE_ARG_PARAMETER);
+}
+
+template <class PROXY, class ACE_LOCK> void
+TAO_Notify_Event_Map_T<PROXY, ACE_LOCK>::connect (PROXY* proxy ACE_ENV_ARG_DECL)
+{
+ this->updates_entry_.connected (proxy ACE_ENV_ARG_PARAMETER);
+ ACE_CHECK;
+
+ ACE_WRITE_GUARD (ACE_LOCK, ace_mon, this->lock_);
+ ++this->proxy_count_;
+}
+
+template <class PROXY, class ACE_LOCK> void
+TAO_Notify_Event_Map_T<PROXY, ACE_LOCK>::disconnect (PROXY* proxy ACE_ENV_ARG_DECL)
+{
+ this->updates_entry_.disconnected (proxy ACE_ENV_ARG_PARAMETER);
+ ACE_CHECK;
+
+ ACE_WRITE_GUARD (ACE_LOCK, ace_mon, this->lock_);
+ --this->proxy_count_;
+}
+
+template <class PROXY, class ACE_LOCK> int
+TAO_Notify_Event_Map_T<PROXY, ACE_LOCK>::insert (PROXY* proxy, const TAO_Notify_EventType& event_type ACE_ENV_ARG_DECL)
+{
+ ENTRY* entry;
+
+ int result = -1;
+
+ if (event_type.is_special () == 1)
+ {
+ entry = &this->broadcast_entry_;
+
+ result = 0;
+ }
+ else
+ {
+ ACE_READ_GUARD_RETURN (ACE_LOCK, ace_mon, this->lock_, -1);
+
+ result = this->map_.find (event_type, entry);
+ }
+
+ if (result == -1) // This type is being seen for the first time.
+ {
+ ACE_NEW_THROW_EX (entry,
+ ENTRY (),
+ CORBA::NO_MEMORY ());
+ ACE_CHECK_RETURN (-1);
+
+ entry->init (ACE_ENV_SINGLE_ARG_PARAMETER);
+ ACE_CHECK_RETURN (-1);
+
+ entry->connected (proxy ACE_ENV_ARG_PARAMETER);
+ ACE_CHECK_RETURN (-1);
+
+ ACE_WRITE_GUARD_RETURN (ACE_LOCK, ace_mon, this->lock_, -1);
+
+ if (map_.bind (event_type, entry) == -1)
+ ACE_THROW_RETURN (CORBA::NO_MEMORY (), -1);
+
+ if (this->event_types_.insert (event_type) == -1)
+ return -1;
+
+ return 1;
+ }
+ else // Add to existing entry or the broadcast entry.
+ {
+ entry->connected (proxy ACE_ENV_ARG_PARAMETER);
+ ACE_CHECK_RETURN (-1);
+ }
+
+ return 0;
+}
+
+template <class PROXY, class ACE_LOCK> int
+TAO_Notify_Event_Map_T<PROXY, ACE_LOCK>::remove (PROXY* proxy, const TAO_Notify_EventType& event_type ACE_ENV_ARG_DECL)
+{
+ ENTRY* entry = 0;
+
+ if (event_type.is_special () == 1)
+ {
+ entry = &this->broadcast_entry_;
+
+ entry->disconnected (proxy ACE_ENV_ARG_PARAMETER);
+ ACE_CHECK_RETURN (-1);
+ }
+ else
+ {
+ int result = -1;
+
+ {
+ ACE_READ_GUARD_RETURN (ACE_LOCK, ace_mon, this->lock_, -1);
+
+ result = this->map_.find (event_type, entry);
+ }
+
+ if (result == 0)
+ {
+ entry->disconnected (proxy ACE_ENV_ARG_PARAMETER);
+ ACE_CHECK_RETURN (-1);
+
+ if (entry->count () == 0)
+ {
+ /// Exec a strategy for removing entries.
+ /// Strategy 1: remove_immediately
+ /// Strategy 2: remove a bunch_after crossing a threshold
+ /// Strategy 3: use cached allocator and 1
+
+ // Strategy 1:
+ ACE_WRITE_GUARD_RETURN (ACE_LOCK, ace_mon, this->lock_, -1);
+
+ this->map_.unbind (event_type);
+
+ if (entry->_decr_refcnt () == 0)
+ delete entry;
+
+ if (this->event_types_.remove (event_type) == -1)
+ return -1;
+
+ return 1;
+ }
+ }
+ }
+
+ return 0;
+}
+
+TAO_END_VERSIONED_NAMESPACE_DECL
+
+#endif /* TAO_Notify_EVENT_MAP_T_CPP */
diff --git a/TAO/orbsvcs/orbsvcs/Notify/Event_Map_T.h b/TAO/orbsvcs/orbsvcs/Notify/Event_Map_T.h
new file mode 100644
index 00000000000..011cb6530da
--- /dev/null
+++ b/TAO/orbsvcs/orbsvcs/Notify/Event_Map_T.h
@@ -0,0 +1,123 @@
+/* -*- C++ -*- */
+/**
+ * @file Event_Map_T.h
+ *
+ * $Id$
+ *
+ * @author Pradeep Gore <pradeep@oomworks.com>
+ *
+ *
+ */
+
+#ifndef TAO_Notify_EVENT_MAP_T_H
+#define TAO_Notify_EVENT_MAP_T_H
+#include /**/ "ace/pre.h"
+
+#include "orbsvcs/Notify/notify_serv_export.h"
+
+#if !defined (ACE_LACKS_PRAGMA_ONCE)
+# pragma once
+#endif /* ACE_LACKS_PRAGMA_ONCE */
+
+#include "ace/Hash_Map_Manager.h"
+#include "ace/CORBA_macros.h"
+
+#include "orbsvcs/Notify/EventType.h"
+#include "orbsvcs/Notify/Event_Map_Entry_T.h"
+#include "orbsvcs/Notify/EventTypeSeq.h"
+
+TAO_BEGIN_VERSIONED_NAMESPACE_DECL
+
+/**
+ * @class TAO_Notify_Event_Map_T
+ *
+ * @brief Template class for storing the collection of Proxys.
+ *
+ */
+template <class PROXY, class ACE_LOCK>
+class TAO_Notify_Event_Map_T
+{
+
+public:
+ typedef TAO_Notify_Event_Map_Entry_T<PROXY> ENTRY;
+
+ /// Constuctor
+ TAO_Notify_Event_Map_T (void);
+
+ /// Destructor
+ ~TAO_Notify_Event_Map_T ();
+
+ /// Init
+ void init (ACE_ENV_SINGLE_ARG_DECL);
+
+ /// Connect a PROXY
+ void connect (PROXY* proxy ACE_ENV_ARG_DECL);
+
+ /// Disconnect a PROXY
+ void disconnect (PROXY* proxy ACE_ENV_ARG_DECL);
+
+ /// Associate PROXY and event_type.
+ /// Returns 1 if <event_type> is being seem for the 1st time otherwise returns 0.
+ /// Returns -1 on error.
+ int insert (PROXY* proxy, const TAO_Notify_EventType& event_type ACE_ENV_ARG_DECL);
+
+ /// Remove association of PROXY and event_type.
+ /// Returns 1 if <event_type> is being seem for the last time otherwise returns 0.
+ /// Returns -1 on error.
+ int remove (PROXY* proxy, const TAO_Notify_EventType& event_type ACE_ENV_ARG_DECL);
+
+ /// Find the collection mapped to the <event_type>
+ /// The usage_count on the entry returned is incremented.
+ ENTRY* find (const TAO_Notify_EventType& event_type ACE_ENV_ARG_DECL);
+
+ /// Find the default broadcast list.
+ ACE_TYPENAME ENTRY::COLLECTION* broadcast_collection (void);
+
+ /// Find the update list. This is all the PROXYS connected to this Map.
+ ACE_TYPENAME ENTRY::COLLECTION* updates_collection (void);
+
+ /// Release the usage count on this entry.
+ void release (ENTRY* entry);
+
+ /// Access all the event types available
+ const TAO_Notify_EventTypeSeq& event_types (void);
+
+ /// Access number of proxys connected in all.
+ int proxy_count (void);
+
+protected:
+ /// The Map that stores eventtype to entry mapping.
+ ACE_Hash_Map_Manager <TAO_Notify_EventType, ENTRY*, ACE_SYNCH_NULL_MUTEX> map_;
+
+ /// The lock to use.
+ ACE_LOCK lock_;
+
+ /// Count of proxys connected.
+ int proxy_count_;
+
+ /// The default broadcast list for EventType::special.
+ ENTRY broadcast_entry_;
+
+ /// Update Entry - Keeps a list of all PROXY's connected to this Map. Updates are send to this list.
+ ENTRY updates_entry_;
+
+ /// The event types that are available in this map.
+ TAO_Notify_EventTypeSeq event_types_;
+};
+
+TAO_END_VERSIONED_NAMESPACE_DECL
+
+#if defined (__ACE_INLINE__)
+#include "orbsvcs/Notify/Event_Map_T.inl"
+#endif /* __ACE_INLINE__ */
+
+#if defined (ACE_TEMPLATES_REQUIRE_SOURCE)
+#include "orbsvcs/Notify/Event_Map_T.cpp"
+#endif /* ACE_TEMPLATES_REQUIRE_SOURCE */
+
+#if defined (ACE_TEMPLATES_REQUIRE_PRAGMA)
+#pragma implementation ("Event_Map_T.cpp")
+#endif /* ACE_TEMPLATES_REQUIRE_PRAGMA */
+
+#include /**/ "ace/post.h"
+#endif /* TAO_Notify_EVENT_MAP_T_H */
diff --git a/TAO/orbsvcs/orbsvcs/Notify/Event_Map_T.inl b/TAO/orbsvcs/orbsvcs/Notify/Event_Map_T.inl
new file mode 100644
index 00000000000..2b485893049
--- /dev/null
+++ b/TAO/orbsvcs/orbsvcs/Notify/Event_Map_T.inl
@@ -0,0 +1,56 @@
+// -*- C++ -*-
+//
+// $Id$
+
+TAO_BEGIN_VERSIONED_NAMESPACE_DECL
+
+template <class PROXY, class ACE_LOCK> ACE_INLINE TAO_Notify_Event_Map_Entry_T<PROXY>*
+TAO_Notify_Event_Map_T<PROXY, ACE_LOCK>::find (const TAO_Notify_EventType& event_type ACE_ENV_ARG_DECL_NOT_USED)
+{
+ TAO_Notify_Event_Map_Entry_T<PROXY>* entry;
+
+ ACE_READ_GUARD_RETURN (ACE_LOCK, ace_mon, this->lock_, 0);
+
+ if (map_.find (event_type, entry) == 0)
+ {
+ entry->_incr_refcnt ();
+ return entry;
+ }
+ else
+ return 0;
+}
+
+template <class PROXY, class ACE_LOCK> ACE_INLINE void
+TAO_Notify_Event_Map_T<PROXY, ACE_LOCK>::release (ENTRY* entry)
+{
+ ACE_WRITE_GUARD (ACE_LOCK, ace_mon, this->lock_);
+
+ if (entry->_decr_refcnt () == 0)
+ delete entry;
+}
+
+template <class PROXY, class ACE_LOCK> ACE_INLINE ACE_TYPENAME TAO_Notify_Event_Map_Entry_T<PROXY>::COLLECTION*
+TAO_Notify_Event_Map_T<PROXY, ACE_LOCK>::broadcast_collection (void)
+{
+ return this->broadcast_entry_.collection ();
+}
+
+template <class PROXY, class ACE_LOCK> ACE_INLINE ACE_TYPENAME TAO_Notify_Event_Map_Entry_T<PROXY>::COLLECTION*
+TAO_Notify_Event_Map_T<PROXY, ACE_LOCK>::updates_collection (void)
+{
+ return this->updates_entry_.collection ();
+}
+
+template <class PROXY, class ACE_LOCK> ACE_INLINE int
+TAO_Notify_Event_Map_T<PROXY, ACE_LOCK>::proxy_count (void)
+{
+ return this->proxy_count_;
+}
+
+template <class PROXY, class ACE_LOCK> ACE_INLINE const TAO_Notify_EventTypeSeq&
+TAO_Notify_Event_Map_T<PROXY, ACE_LOCK>::event_types (void)
+{
+ return this->event_types_;
+}
+
+TAO_END_VERSIONED_NAMESPACE_DECL
diff --git a/TAO/orbsvcs/orbsvcs/Notify/Event_Persistence_Factory.cpp b/TAO/orbsvcs/orbsvcs/Notify/Event_Persistence_Factory.cpp
new file mode 100644
index 00000000000..3caa8a0c5a1
--- /dev/null
+++ b/TAO/orbsvcs/orbsvcs/Notify/Event_Persistence_Factory.cpp
@@ -0,0 +1,13 @@
+#include "orbsvcs/Notify/Event_Persistence_Factory.h"
+
+ACE_RCSID (Notify,
+ Event_Persistence_Factory,
+ "$Id$")
+
+TAO_BEGIN_VERSIONED_NAMESPACE_DECL
+
+TAO_Notify::Event_Persistence_Factory::~Event_Persistence_Factory (void)
+{
+}
+
+TAO_END_VERSIONED_NAMESPACE_DECL
diff --git a/TAO/orbsvcs/orbsvcs/Notify/Event_Persistence_Factory.h b/TAO/orbsvcs/orbsvcs/Notify/Event_Persistence_Factory.h
new file mode 100644
index 00000000000..0abc936b92a
--- /dev/null
+++ b/TAO/orbsvcs/orbsvcs/Notify/Event_Persistence_Factory.h
@@ -0,0 +1,54 @@
+/* -*- C++ -*- */
+
+//=============================================================================
+/**
+ * @file Event_Persistence_Factory.h
+ *
+ * $Id$
+ *
+ * A factory class that creates a Routing_Slip_Persistence_Manager.
+ *
+ * @author Jonathan Pollack <pollack_j@ociweb.com>
+ */
+//=============================================================================
+
+#ifndef EVENT_PERSISTENCE_FACTORY_H
+#define EVENT_PERSISTENCE_FACTORY_H
+#include /**/ "ace/pre.h"
+
+#include "orbsvcs/Notify/notify_serv_export.h"
+
+#if !defined (ACE_LACKS_PRAGMA_ONCE)
+#pragma once
+#endif /* ACE_LACKS_PRAGMA_ONCE */
+
+#include "tao/Versioned_Namespace.h"
+
+TAO_BEGIN_VERSIONED_NAMESPACE_DECL
+
+namespace TAO_Notify
+{
+ class Routing_Slip_Persistence_Manager;
+ class Persistent_Callback;
+
+ /// interface to be implemented by specific Event_Persistence_Factories
+ class TAO_Notify_Serv_Export Event_Persistence_Factory
+ {
+ public:
+ virtual ~Event_Persistence_Factory();
+
+ /// Create a Persistence Manager
+ virtual Routing_Slip_Persistence_Manager *
+ create_routing_slip_persistence_manager (Persistent_Callback * callback) = 0;
+
+ /// Begin the reload process by returning the first Routing_Slip_Persistence_Manager
+ /// to continue call Routing_Slip_Persistence_Manager::load_next ()
+ virtual Routing_Slip_Persistence_Manager * first_reload_manager () = 0;
+
+ };
+} // namespace TAO_Notify
+
+TAO_END_VERSIONED_NAMESPACE_DECL
+
+#include /**/ "ace/post.h"
+#endif /* EVENT_PERSISTENCE_FACTORY_H */
diff --git a/TAO/orbsvcs/orbsvcs/Notify/Event_Persistence_Strategy.h b/TAO/orbsvcs/orbsvcs/Notify/Event_Persistence_Strategy.h
new file mode 100644
index 00000000000..51019bac62a
--- /dev/null
+++ b/TAO/orbsvcs/orbsvcs/Notify/Event_Persistence_Strategy.h
@@ -0,0 +1,51 @@
+/* -*- C++ -*- */
+
+//=============================================================================
+/**
+ * @file Event_Persistence_Strategy.h
+ *
+ * $Id$
+ *
+ * A factory class that creates a Routing_Slip_Persistence_Manager.
+ *
+ * @author Jonathan Pollack <pollack_j@ociweb.com>
+ */
+//=============================================================================
+
+#ifndef EVENT_PERSISTENCE_STRATEGY_H
+#define EVENT_PERSISTENCE_STRATEGY_H
+#include /**/ "ace/pre.h"
+
+#include "orbsvcs/Notify/notify_serv_export.h"
+
+#if !defined (ACE_LACKS_PRAGMA_ONCE)
+#pragma once
+#endif /* ACE_LACKS_PRAGMA_ONCE */
+
+#include "tao/Versioned_Namespace.h"
+#include "ace/Service_Object.h"
+
+TAO_BEGIN_VERSIONED_NAMESPACE_DECL
+
+namespace TAO_Notify
+{
+ class Event_Persistence_Factory;
+
+ /// Interface to be implemented by specific strategies
+ class TAO_Notify_Serv_Export Event_Persistence_Strategy: public ACE_Service_Object
+ {
+ public:
+
+ // get the current factory, creating it if necessary
+ virtual Event_Persistence_Factory * get_factory () = 0;
+
+ // release the current factory so a new one can be created
+ virtual void reset () = 0;
+ };
+
+} // namespace TAO_Notify
+
+TAO_END_VERSIONED_NAMESPACE_DECL
+
+#include /**/ "ace/post.h"
+#endif /* EVENT_PERSISTENCE_STRATEGY_H */
diff --git a/TAO/orbsvcs/orbsvcs/Notify/Factory.h b/TAO/orbsvcs/orbsvcs/Notify/Factory.h
new file mode 100644
index 00000000000..22fc4dcf653
--- /dev/null
+++ b/TAO/orbsvcs/orbsvcs/Notify/Factory.h
@@ -0,0 +1,136 @@
+/* -*- C++ -*- */
+/**
+ * @file Factory.h
+ *
+ * $Id$
+ *
+ * @author Pradeep Gore <pradeep@oomworks.com>
+ *
+ *
+ */
+
+#ifndef TAO_Notify_FACTORY_H
+#define TAO_Notify_FACTORY_H
+
+#include /**/ "ace/pre.h"
+
+#if !defined (ACE_LACKS_PRAGMA_ONCE)
+# pragma once
+#endif /* ACE_LACKS_PRAGMA_ONCE */
+
+#include "tao/Versioned_Namespace.h"
+#include "ace/CORBA_macros.h"
+#include "ace/Service_Object.h"
+
+ACE_BEGIN_VERSIONED_NAMESPACE_DECL
+class ACE_Lock;
+ACE_END_VERSIONED_NAMESPACE_DECL
+
+TAO_BEGIN_VERSIONED_NAMESPACE_DECL
+
+class TAO_Notify_Object;
+class TAO_Notify_EventChannelFactory;
+class TAO_Notify_EventChannel;
+class TAO_Notify_SupplierAdmin;
+class TAO_Notify_ConsumerAdmin;
+class TAO_Notify_ProxyPushConsumer;
+class TAO_Notify_CosEC_ProxyPushSupplier;
+class TAO_Notify_CosEC_ProxyPushConsumer;
+class TAO_Notify_ProxyPushSupplier;
+class TAO_Notify_StructuredProxyPushConsumer;
+class TAO_Notify_StructuredProxyPushSupplier;
+class TAO_Notify_SequenceProxyPushConsumer;
+class TAO_Notify_SequenceProxyPushSupplier;
+class TAO_Notify_ProxyConsumer;
+class TAO_Notify_ProxySupplier;
+class TAO_Notify_ConsumerAdmin;
+class TAO_Notify_SupplierAdmin;
+class TAO_Notify_Proxy;
+class TAO_Notify_Consumer;
+class TAO_Notify_Supplier;
+class TAO_Notify_Peer;
+
+namespace CORBA
+{
+ class Environment;
+}
+
+template <class PROXY> class TAO_ESF_Proxy_Collection;
+
+typedef TAO_ESF_Proxy_Collection<TAO_Notify_ProxyConsumer> TAO_Notify_ProxyConsumer_Collection;
+typedef TAO_ESF_Proxy_Collection<TAO_Notify_ProxySupplier> TAO_Notify_ProxySupplier_Collection;
+
+typedef TAO_ESF_Proxy_Collection<TAO_Notify_EventChannel> TAO_Notify_EventChannel_Collection;
+typedef TAO_ESF_Proxy_Collection<TAO_Notify_ConsumerAdmin> TAO_Notify_ConsumerAdmin_Collection;
+typedef TAO_ESF_Proxy_Collection<TAO_Notify_SupplierAdmin> TAO_Notify_SupplierAdmin_Collection;
+typedef TAO_ESF_Proxy_Collection<TAO_Notify_Proxy> TAO_Notify_Proxy_Collection;
+
+/**
+ * @class TAO_Notify_Factory
+ *
+ * @brief Factory interface for creating Notify Objects.
+ *
+ */
+class /*TAO_Notify_Serv_Export*/ TAO_Notify_Factory : public ACE_Service_Object
+{
+public:
+ /// Create ProxySupplier Collection
+ virtual void create (TAO_Notify_ProxySupplier_Collection*& collection ACE_ENV_ARG_DECL) = 0;
+
+ /// Create ProxyConsumer Collection
+ virtual void create (TAO_Notify_ProxyConsumer_Collection*& collection ACE_ENV_ARG_DECL) = 0;
+
+ /// Create EventChannel Collection
+ virtual void create (TAO_Notify_EventChannel_Collection*& collection ACE_ENV_ARG_DECL) = 0;
+
+ /// Create ConsumerAdmin Collection
+ virtual void create (TAO_Notify_ConsumerAdmin_Collection*& collection ACE_ENV_ARG_DECL) = 0;
+
+ /// Create SupplierAdmin Collection
+ virtual void create (TAO_Notify_SupplierAdmin_Collection*& collection ACE_ENV_ARG_DECL) = 0;
+
+ /// Create Proxy Collection
+ virtual void create (TAO_Notify_Proxy_Collection*& collection ACE_ENV_ARG_DECL) = 0;
+
+ /// Create EventChannelFactory
+ virtual void create (TAO_Notify_EventChannelFactory*& channel_factory ACE_ENV_ARG_DECL) = 0;
+
+ /// Create EventChannel
+ virtual void create (TAO_Notify_EventChannel*& channel ACE_ENV_ARG_DECL) = 0;
+
+ /// Create SupplierAdmin
+ virtual void create (TAO_Notify_SupplierAdmin*& admin ACE_ENV_ARG_DECL) = 0;
+
+ /// Create ConsumerAdmin
+ virtual void create (TAO_Notify_ConsumerAdmin*& admin ACE_ENV_ARG_DECL) = 0;
+
+ /// Create ProxyPushConsumer
+ virtual void create (TAO_Notify_ProxyPushConsumer*& proxy ACE_ENV_ARG_DECL) = 0;
+
+ /// Create ProxyPushSupplier
+ virtual void create (TAO_Notify_ProxyPushSupplier*& proxy ACE_ENV_ARG_DECL) = 0;
+
+ /// Create CosEC_ProxyPushConsumer
+ virtual void create (TAO_Notify_CosEC_ProxyPushConsumer*& proxy ACE_ENV_ARG_DECL) = 0;
+
+ /// Create CosEC_ProxyPushSupplier
+ virtual void create (TAO_Notify_CosEC_ProxyPushSupplier*& proxy ACE_ENV_ARG_DECL) = 0;
+
+ /// Create StructuredProxyPushConsumer
+ virtual void create (TAO_Notify_StructuredProxyPushConsumer*& proxy ACE_ENV_ARG_DECL) = 0;
+
+ /// Create StructuredProxyPushSupplier
+ virtual void create (TAO_Notify_StructuredProxyPushSupplier*& proxy ACE_ENV_ARG_DECL) = 0;
+
+ /// Create SequenceProxyPushConsumer
+ virtual void create (TAO_Notify_SequenceProxyPushConsumer*& proxy ACE_ENV_ARG_DECL) = 0;
+
+ /// Create SequenceProxyPushSupplier
+ virtual void create (TAO_Notify_SequenceProxyPushSupplier*& proxy ACE_ENV_ARG_DECL) = 0;
+};
+
+TAO_END_VERSIONED_NAMESPACE_DECL
+
+#include /**/ "ace/post.h"
+
+#endif /* TAO_Notify_FACTORY_H */
diff --git a/TAO/orbsvcs/orbsvcs/Notify/FilterAdmin.cpp b/TAO/orbsvcs/orbsvcs/Notify/FilterAdmin.cpp
new file mode 100644
index 00000000000..81b86902a36
--- /dev/null
+++ b/TAO/orbsvcs/orbsvcs/Notify/FilterAdmin.cpp
@@ -0,0 +1,204 @@
+/* -*- C++ -*- $Id$ */
+
+#include "orbsvcs/Notify/FilterAdmin.h"
+
+#if ! defined (__ACE_INLINE__)
+#include "orbsvcs/Notify/FilterAdmin.inl"
+#endif /* __ACE_INLINE__ */
+
+ACE_RCSID(Notify, FilterAdmin, "$Id$")
+
+#include "orbsvcs/Notify/Topology_Saver.h"
+#include "orbsvcs/Notify/Properties.h"
+#include "ace/Bound_Ptr.h"
+
+TAO_BEGIN_VERSIONED_NAMESPACE_DECL
+
+// Implementation skeleton constructor
+TAO_Notify_FilterAdmin::TAO_Notify_FilterAdmin (void)
+{
+}
+
+// Implementation skeleton destructor
+TAO_Notify_FilterAdmin::~TAO_Notify_FilterAdmin (void)
+{
+}
+
+CosNotifyFilter::FilterID
+TAO_Notify_FilterAdmin::add_filter (CosNotifyFilter::Filter_ptr new_filter ACE_ENV_ARG_DECL)
+ ACE_THROW_SPEC ((CORBA::SystemException))
+{
+ if (CORBA::is_nil (new_filter))
+ ACE_THROW_RETURN (CORBA::BAD_PARAM (), 0);
+
+ ACE_GUARD_THROW_EX (TAO_SYNCH_MUTEX, ace_mon, this->lock_,
+ CORBA::INTERNAL ());
+ ACE_CHECK_RETURN (0);
+
+ CosNotifyFilter::FilterID new_id = this->filter_ids_.id ();
+
+ CosNotifyFilter::Filter_var new_filter_var =
+ CosNotifyFilter::Filter::_duplicate (new_filter);
+
+ if (this->filter_list_.bind (new_id, new_filter_var) == -1)
+ ACE_THROW_RETURN (CORBA::INTERNAL (),
+ 0);
+ else
+ return new_id;
+}
+
+void
+TAO_Notify_FilterAdmin::remove_filter (CosNotifyFilter::FilterID filter_id ACE_ENV_ARG_DECL)
+ ACE_THROW_SPEC ((
+ CORBA::SystemException,
+ CosNotifyFilter::FilterNotFound
+ ))
+{
+ ACE_GUARD_THROW_EX (TAO_SYNCH_MUTEX, ace_mon, this->lock_,
+ CORBA::INTERNAL ());
+ ACE_CHECK;
+
+ if (this->filter_list_.unbind (filter_id) == -1)
+ ACE_THROW (CosNotifyFilter::FilterNotFound ());
+}
+
+CosNotifyFilter::Filter_ptr
+TAO_Notify_FilterAdmin::get_filter (CosNotifyFilter::FilterID filter_id ACE_ENV_ARG_DECL)
+ ACE_THROW_SPEC ((
+ CORBA::SystemException,
+ CosNotifyFilter::FilterNotFound
+ ))
+{
+ ACE_GUARD_THROW_EX (TAO_SYNCH_MUTEX, ace_mon, this->lock_,
+ CORBA::INTERNAL ());
+ ACE_CHECK_RETURN (CosNotifyFilter::Filter::_nil ());
+
+ CosNotifyFilter::Filter_var filter_var;
+
+ if (this->filter_list_.find (filter_id,
+ filter_var) == -1)
+ ACE_THROW_RETURN (CosNotifyFilter::FilterNotFound (),
+ 0);
+
+ return filter_var._retn ();
+}
+
+CosNotifyFilter::FilterIDSeq*
+TAO_Notify_FilterAdmin::get_all_filters (ACE_ENV_SINGLE_ARG_DECL)
+ ACE_THROW_SPEC ((
+ CORBA::SystemException
+ ))
+{
+ ACE_GUARD_THROW_EX (TAO_SYNCH_MUTEX, ace_mon, this->lock_,
+ CORBA::INTERNAL ());
+ ACE_CHECK_RETURN (0);
+
+ // Figure out the length of the list.
+ size_t len = this->filter_list_.current_size ();
+
+ CosNotifyFilter::FilterIDSeq* list_ptr;
+
+ // Allocate the list of <len> length.
+ ACE_NEW_THROW_EX (list_ptr,
+ CosNotifyFilter::FilterIDSeq,
+ CORBA::NO_MEMORY ());
+ ACE_CHECK_RETURN (0);
+
+ CosNotifyFilter::FilterIDSeq_var list (list_ptr);
+
+ list->length (static_cast<CORBA::ULong> (len));
+
+ FILTER_LIST::ITERATOR iter (this->filter_list_);
+ FILTER_LIST::ENTRY *entry;
+
+ u_int index;
+
+ for (index = 0; iter.next (entry) != 0; iter.advance (), ++index)
+ {
+ list[index] = entry->ext_id_;
+ }
+
+ return list._retn ();
+}
+
+void
+TAO_Notify_FilterAdmin::remove_all_filters (ACE_ENV_SINGLE_ARG_DECL)
+ ACE_THROW_SPEC ((CORBA::SystemException))
+{
+ ACE_GUARD_THROW_EX (TAO_SYNCH_MUTEX, ace_mon, this->lock_,
+ CORBA::INTERNAL ());
+ ACE_CHECK;
+
+ this->filter_list_.unbind_all ();
+}
+
+void
+TAO_Notify_FilterAdmin::save_persistent (TAO_Notify::Topology_Saver& saver ACE_ENV_ARG_DECL)
+{
+ if (this->filter_list_.current_size() == 0)
+ return;
+
+ bool changed = true;
+
+ TAO_Notify::NVPList attrs;
+ bool want_children = saver.begin_object(0, "filter_admin", attrs, changed ACE_ENV_ARG_PARAMETER);
+ ACE_CHECK;
+ if (want_children)
+ {
+ FILTER_LIST::ITERATOR iter (this->filter_list_);
+ FILTER_LIST::ENTRY* entry;
+
+ TAO_Notify_Properties* properties = TAO_Notify_PROPERTIES::instance();
+ CORBA::ORB_var orb = properties->orb();
+ ACE_ASSERT(! CORBA::is_nil(orb.in()));
+
+ for (; iter.next(entry) != 0; iter.advance())
+ {
+ TAO_Notify::NVPList fattrs;
+ CORBA::Long id = entry->ext_id_;
+ CORBA::String_var ior = orb->object_to_string(entry->int_id_.in() ACE_ENV_ARG_PARAMETER);
+ ACE_CHECK;
+ fattrs.push_back(TAO_Notify::NVP("IOR", ior.in()));
+ saver.begin_object(id, "filter", fattrs, changed ACE_ENV_ARG_PARAMETER);
+ ACE_CHECK;
+ saver.end_object(id, "filter" ACE_ENV_ARG_PARAMETER);
+ ACE_CHECK;
+ }
+ }
+
+ saver.end_object(0, "filter_admin" ACE_ENV_ARG_PARAMETER);
+}
+
+TAO_Notify::Topology_Object*
+TAO_Notify_FilterAdmin::load_child (const ACE_CString &type, CORBA::Long id,
+ const TAO_Notify::NVPList& attrs ACE_ENV_ARG_DECL)
+{
+ if (type == "filter")
+ {
+ TAO_Notify_Properties* properties = TAO_Notify_PROPERTIES::instance();
+ CORBA::ORB_var orb = properties->orb();
+ ACE_ASSERT(! CORBA::is_nil(orb.in()));
+ ACE_CString ior;
+ attrs.load("IOR", ior);
+
+ CORBA::Object_var obj = orb->string_to_object(ior.c_str() ACE_ENV_ARG_PARAMETER);
+ ACE_CHECK_RETURN(0);
+ CosNotifyFilter::Filter_var filter = CosNotifyFilter::Filter::_unchecked_narrow(obj.in() ACE_ENV_ARG_PARAMETER);
+ ACE_CHECK_RETURN(0);
+ if (! CORBA::is_nil(filter.in()))
+ {
+ this->filter_ids_.set_last_used(id);
+ if (this->filter_list_.bind (id, filter) != 0)
+ ACE_THROW_RETURN (CORBA::INTERNAL (), 0);
+ }
+ }
+ return this;
+}
+
+void
+TAO_Notify_FilterAdmin::release (void)
+{
+ delete this;
+}
+
+TAO_END_VERSIONED_NAMESPACE_DECL
diff --git a/TAO/orbsvcs/orbsvcs/Notify/FilterAdmin.h b/TAO/orbsvcs/orbsvcs/Notify/FilterAdmin.h
new file mode 100644
index 00000000000..dfa0d7eb7af
--- /dev/null
+++ b/TAO/orbsvcs/orbsvcs/Notify/FilterAdmin.h
@@ -0,0 +1,117 @@
+// -*- C++ -*-
+//=============================================================================
+/**
+ * @file FilterAdmin.h
+ *
+ * $Id$
+ *
+ * @author Pradeep Gore <pradeep@cs.wustl.edu>
+ */
+//=============================================================================
+
+
+#ifndef NOTIFY_FILTERADMIN_H
+
+#define NOTIFY_FILTERADMIN_H
+
+#include /**/ "ace/pre.h"
+
+#include "orbsvcs/CosNotifyFilterS.h"
+
+#include "ace/Hash_Map_Manager.h"
+
+#include "orbsvcs/Notify/ID_Factory.h"
+#include "orbsvcs/Notify/Event.h"
+#include "orbsvcs/Notify/notify_serv_export.h"
+#include "orbsvcs/Notify/Topology_Object.h"
+
+TAO_BEGIN_VERSIONED_NAMESPACE_DECL
+
+/**
+ * @class TAO_Notify_FilterAdmin
+ *
+ * @brief FilterAdmin interface methods implementation.
+ *
+ */
+class TAO_Notify_Serv_Export TAO_Notify_FilterAdmin
+ : public TAO_Notify::Topology_Object
+{
+
+ public:
+ /// Constructor
+ TAO_Notify_FilterAdmin (void);
+
+ /// Destructor
+ virtual ~TAO_Notify_FilterAdmin (void);
+
+ // = match operation on all the filters
+ /// See if any of the filters match.
+ CORBA::Boolean match (const TAO_Notify_Event::Ptr &event ACE_ENV_ARG_DECL)
+ ACE_THROW_SPEC ((
+ CORBA::SystemException,
+ CosNotifyFilter::UnsupportedFilterableData
+ ));
+
+ // = match operation on all the filters
+ /// See if any of the filters match.
+ CORBA::Boolean match (const TAO_Notify_Event* event ACE_ENV_ARG_DECL)
+ ACE_THROW_SPEC ((
+ CORBA::SystemException,
+ CosNotifyFilter::UnsupportedFilterableData
+ ));
+
+ virtual CosNotifyFilter::FilterID add_filter (CosNotifyFilter::Filter_ptr new_filter ACE_ENV_ARG_DECL)
+ ACE_THROW_SPEC ((CORBA::SystemException));
+
+ virtual void remove_filter (CosNotifyFilter::FilterID filter ACE_ENV_ARG_DECL)
+ ACE_THROW_SPEC ((
+ CORBA::SystemException,
+ CosNotifyFilter::FilterNotFound
+ ));
+
+ virtual CosNotifyFilter::Filter_ptr get_filter (CosNotifyFilter::FilterID filter ACE_ENV_ARG_DECL)
+ ACE_THROW_SPEC ((
+ CORBA::SystemException,
+ CosNotifyFilter::FilterNotFound
+ ));
+
+ virtual CosNotifyFilter::FilterIDSeq * get_all_filters (ACE_ENV_SINGLE_ARG_DECL)
+ ACE_THROW_SPEC ((
+ CORBA::SystemException
+ ));
+
+ virtual void remove_all_filters (ACE_ENV_SINGLE_ARG_DECL)
+ ACE_THROW_SPEC ((
+ CORBA::SystemException
+ ));
+
+
+ // TAO_Notify::Topology_Object
+
+ virtual void save_persistent (TAO_Notify::Topology_Saver& saver ACE_ENV_ARG_DECL);
+ virtual TAO_Notify::Topology_Object* load_child (const ACE_CString &type, CORBA::Long id,
+ const TAO_Notify::NVPList& attrs ACE_ENV_ARG_DECL);
+ private:
+ typedef ACE_Hash_Map_Manager <CosNotifyFilter::FilterID, CosNotifyFilter::Filter_var, ACE_SYNCH_NULL_MUTEX> FILTER_LIST;
+
+ virtual void release (void);
+
+ /// Mutex to serialize access to data members.
+ TAO_SYNCH_MUTEX lock_;
+
+ /// List of filters
+ FILTER_LIST filter_list_;
+
+ /// Id generator for proxy suppliers
+ TAO_Notify_ID_Factory filter_ids_;
+};
+
+TAO_END_VERSIONED_NAMESPACE_DECL
+
+#if defined (__ACE_INLINE__)
+#include "orbsvcs/Notify/FilterAdmin.inl"
+#endif /* __ACE_INLINE__ */
+
+#include /**/ "ace/post.h"
+
+#endif /* NOTIFY_FILTERADMIN_H */
diff --git a/TAO/orbsvcs/orbsvcs/Notify/FilterAdmin.inl b/TAO/orbsvcs/orbsvcs/Notify/FilterAdmin.inl
new file mode 100644
index 00000000000..3b30256fbb4
--- /dev/null
+++ b/TAO/orbsvcs/orbsvcs/Notify/FilterAdmin.inl
@@ -0,0 +1,39 @@
+// -*- C++ -*-
+//
+//$Id$
+
+TAO_BEGIN_VERSIONED_NAMESPACE_DECL
+
+ACE_INLINE CORBA::Boolean
+TAO_Notify_FilterAdmin::match (const TAO_Notify_Event* event ACE_ENV_ARG_DECL)
+ ACE_THROW_SPEC ((
+ CORBA::SystemException,
+ CosNotifyFilter::UnsupportedFilterableData
+ ))
+{
+ ACE_GUARD_THROW_EX (TAO_SYNCH_MUTEX, ace_mon, this->lock_,
+ CORBA::INTERNAL ());
+ ACE_CHECK_RETURN (0);
+
+ // If no filter is active, match is successfull.
+ if (this->filter_list_.current_size () == 0)
+ return 1;
+
+ // We want to return true if atleast one constraint matches.
+ FILTER_LIST::ITERATOR iter (this->filter_list_);
+ FILTER_LIST::ENTRY *entry;
+ CORBA::Boolean ret_val = 0;
+
+ for (; iter.next (entry); iter.advance ())
+ {
+ ret_val = event->do_match (entry->int_id_.in () ACE_ENV_ARG_PARAMETER);
+ ACE_CHECK_RETURN (0);
+
+ if (ret_val == 1)
+ return 1;
+ }
+
+ return 0;
+}
+
+TAO_END_VERSIONED_NAMESPACE_DECL
diff --git a/TAO/orbsvcs/orbsvcs/Notify/FilterFactory.h b/TAO/orbsvcs/orbsvcs/Notify/FilterFactory.h
new file mode 100644
index 00000000000..a806f8d9437
--- /dev/null
+++ b/TAO/orbsvcs/orbsvcs/Notify/FilterFactory.h
@@ -0,0 +1,49 @@
+/* -*- C++ -*- */
+/**
+ * @file FilterFactory.h
+ *
+ * $Id$
+ *
+ * @author Pradeep Gore <pradeep@oomworks.com>
+ *
+ *
+ */
+
+#ifndef TAO_Notify_FILTERFACTORY_H
+#define TAO_Notify_FILTERFACTORY_H
+
+#include /**/ "ace/pre.h"
+
+#include "orbsvcs/Notify/notify_serv_export.h"
+
+#if !defined (ACE_LACKS_PRAGMA_ONCE)
+# pragma once
+#endif /* ACE_LACKS_PRAGMA_ONCE */
+
+#include "ace/Service_Object.h"
+
+#include "tao/PortableServer/PortableServer.h"
+
+TAO_BEGIN_VERSIONED_NAMESPACE_DECL
+
+/**
+ * @class TAO_Notify_FilterFactory
+ *
+ * @brief Service Object to obtain a CosNotifyFilter::FilterFactory reference.
+ *
+ */
+class /*TAO_Notify_Serv_Export*/ TAO_Notify_FilterFactory : public ACE_Service_Object
+{
+public:
+ /// Factory method to create a FilterFactory reference
+ /// The Factory is activated in the default POA. The filters created are activated in the <filter_poa>.
+ virtual CosNotifyFilter::FilterFactory_ptr create (
+ PortableServer::POA_var& filter_poa
+ ACE_ENV_ARG_DECL) = 0;
+};
+
+TAO_END_VERSIONED_NAMESPACE_DECL
+
+#include /**/ "ace/post.h"
+
+#endif /* TAO_Notify_FILTERFACTORY_H */
diff --git a/TAO/orbsvcs/orbsvcs/Notify/Find_Worker_T.cpp b/TAO/orbsvcs/orbsvcs/Notify/Find_Worker_T.cpp
new file mode 100644
index 00000000000..de2822ae61b
--- /dev/null
+++ b/TAO/orbsvcs/orbsvcs/Notify/Find_Worker_T.cpp
@@ -0,0 +1,49 @@
+// $Id$
+
+#ifndef TAO_Notify_FIND_WORKER_T_CPP
+#define TAO_Notify_FIND_WORKER_T_CPP
+
+#include "orbsvcs/Notify/Find_Worker_T.h"
+
+#if ! defined (__ACE_INLINE__)
+#include "orbsvcs/Notify/Find_Worker_T.inl"
+#endif /* __ACE_INLINE__ */
+
+TAO_BEGIN_VERSIONED_NAMESPACE_DECL
+
+template<class TYPE, class INTERFACE, class INTERFACE_PTR, class EXCEPTION>
+TAO_Notify_Find_Worker_T<TYPE,INTERFACE,INTERFACE_PTR,EXCEPTION>::TAO_Notify_Find_Worker_T (void)
+ :id_ (0), result_ (0)
+{
+}
+
+template<class TYPE, class INTERFACE, class INTERFACE_PTR, class EXCEPTION> TYPE*
+TAO_Notify_Find_Worker_T<TYPE,INTERFACE,INTERFACE_PTR,EXCEPTION>::find (const TAO_Notify_Object::ID id, CONTAINER& container ACE_ENV_ARG_DECL)
+{
+ this->id_ = id;
+
+ container.collection ()->for_each (this ACE_ENV_ARG_PARAMETER);
+ ACE_CHECK_RETURN (0);
+
+ return this->result_;
+}
+
+template<class TYPE, class INTERFACE, class INTERFACE_PTR, class EXCEPTION> INTERFACE_PTR
+TAO_Notify_Find_Worker_T<TYPE,INTERFACE,INTERFACE_PTR,EXCEPTION>::resolve (const TAO_Notify_Object::ID id, CONTAINER& container ACE_ENV_ARG_DECL)
+{
+ this->find (id, container ACE_ENV_ARG_PARAMETER);
+ ACE_CHECK_RETURN (INTERFACE::_nil ());
+
+ if (this->result_ == 0)
+ ACE_THROW_RETURN (EXCEPTION ()
+ , INTERFACE::_nil ());
+
+ CORBA::Object_var object = this->result_->ref (ACE_ENV_SINGLE_ARG_PARAMETER);
+ ACE_CHECK_RETURN (INTERFACE::_nil ());
+
+ return INTERFACE::_narrow (object.in () ACE_ENV_ARG_PARAMETER);
+}
+
+TAO_END_VERSIONED_NAMESPACE_DECL
+
+#endif /* TAO_Notify_FIND_WORKER_T_CPP */
diff --git a/TAO/orbsvcs/orbsvcs/Notify/Find_Worker_T.h b/TAO/orbsvcs/orbsvcs/Notify/Find_Worker_T.h
new file mode 100644
index 00000000000..c9c09eca0fa
--- /dev/null
+++ b/TAO/orbsvcs/orbsvcs/Notify/Find_Worker_T.h
@@ -0,0 +1,77 @@
+/* -*- C++ -*- */
+/**
+ * @file Find_Worker_T.h
+ *
+ * $Id$
+ *
+ * @author Pradeep Gore <pradeep@oomworks.com>
+ *
+ *
+ */
+
+#ifndef TAO_Notify_FIND_WORKER_T_H
+#define TAO_Notify_FIND_WORKER_T_H
+#include /**/ "ace/pre.h"
+
+#include "orbsvcs/Notify/notify_serv_export.h"
+
+#if !defined (ACE_LACKS_PRAGMA_ONCE)
+# pragma once
+#endif /* ACE_LACKS_PRAGMA_ONCE */
+
+#include "orbsvcs/ESF/ESF_Proxy_Collection.h"
+#include "orbsvcs/ESF/ESF_Worker.h"
+#include "orbsvcs/Notify/Container_T.h"
+#include "orbsvcs/Notify/Object.h"
+
+TAO_BEGIN_VERSIONED_NAMESPACE_DECL
+
+/**
+ * @class TAO_Notify_Find_Worker_T
+ *
+ * @brief Helper to locate a TYPE given its ID.
+ *
+ */
+template <class TYPE, class INTERFACE, class INTERFACE_PTR, class EXCEPTION>
+class TAO_Notify_Serv_Export TAO_Notify_Find_Worker_T : public TAO_ESF_Worker<TYPE>
+{
+ typedef TAO_Notify_Container_T<TYPE> CONTAINER;
+ typedef TAO_ESF_Proxy_Collection<TYPE> COLLECTION;
+
+public:
+ /// Constructor
+ TAO_Notify_Find_Worker_T (void);
+
+ /// Find the Type.
+ TYPE* find (const TAO_Notify_Object::ID id, CONTAINER& container ACE_ENV_ARG_DECL);
+
+ /// Find and resolve to the Interface.
+ INTERFACE_PTR resolve (const TAO_Notify_Object::ID id, CONTAINER& container ACE_ENV_ARG_DECL);
+
+protected:
+ ///= TAO_ESF_Worker method
+ void work (TYPE* object ACE_ENV_ARG_DECL);
+
+ /// The id we're looking for.
+ TAO_Notify_Object::ID id_;
+
+ /// The result
+ TYPE* result_;
+};
+
+TAO_END_VERSIONED_NAMESPACE_DECL
+
+#if defined (__ACE_INLINE__)
+#include "orbsvcs/Notify/Find_Worker_T.inl"
+#endif /* __ACE_INLINE__ */
+
+#if defined (ACE_TEMPLATES_REQUIRE_SOURCE)
+#include "orbsvcs/Notify/Find_Worker_T.cpp"
+#endif /* ACE_TEMPLATES_REQUIRE_SOURCE */
+
+#if defined (ACE_TEMPLATES_REQUIRE_PRAGMA)
+#pragma implementation ("Find_Worker_T.cpp")
+#endif /* ACE_TEMPLATES_REQUIRE_PRAGMA */
+
+#include /**/ "ace/post.h"
+#endif /* TAO_Notify_FIND_WORKER_T_H */
diff --git a/TAO/orbsvcs/orbsvcs/Notify/Find_Worker_T.inl b/TAO/orbsvcs/orbsvcs/Notify/Find_Worker_T.inl
new file mode 100644
index 00000000000..2b9af82e37a
--- /dev/null
+++ b/TAO/orbsvcs/orbsvcs/Notify/Find_Worker_T.inl
@@ -0,0 +1,14 @@
+// -*- C++ -*-
+//
+// $Id$
+
+TAO_BEGIN_VERSIONED_NAMESPACE_DECL
+
+template<class TYPE, class INTERFACE, class INTERFACE_PTR, class EXCEPTION> ACE_INLINE void
+TAO_Notify_Find_Worker_T<TYPE,INTERFACE,INTERFACE_PTR,EXCEPTION>::work (TYPE* type ACE_ENV_ARG_DECL_NOT_USED)
+{
+ if (type->id () == this->id_)
+ this->result_ = type;
+}
+
+TAO_END_VERSIONED_NAMESPACE_DECL
diff --git a/TAO/orbsvcs/orbsvcs/Notify/ID_Factory.cpp b/TAO/orbsvcs/orbsvcs/Notify/ID_Factory.cpp
new file mode 100644
index 00000000000..71f0721ee0e
--- /dev/null
+++ b/TAO/orbsvcs/orbsvcs/Notify/ID_Factory.cpp
@@ -0,0 +1,22 @@
+// $Id$
+
+#include "orbsvcs/Notify/ID_Factory.h"
+
+#if ! defined (__ACE_INLINE__)
+#include "orbsvcs/Notify/ID_Factory.inl"
+#endif /* __ACE_INLINE__ */
+
+ACE_RCSID(Notify, TAO_Notify_ID_Factory, "$Id$")
+
+TAO_BEGIN_VERSIONED_NAMESPACE_DECL
+
+TAO_Notify_ID_Factory::TAO_Notify_ID_Factory (void)
+ : seed_ (0)
+{
+}
+
+TAO_Notify_ID_Factory::~TAO_Notify_ID_Factory ()
+{
+}
+
+TAO_END_VERSIONED_NAMESPACE_DECL
diff --git a/TAO/orbsvcs/orbsvcs/Notify/ID_Factory.h b/TAO/orbsvcs/orbsvcs/Notify/ID_Factory.h
new file mode 100644
index 00000000000..f6596be8410
--- /dev/null
+++ b/TAO/orbsvcs/orbsvcs/Notify/ID_Factory.h
@@ -0,0 +1,62 @@
+/* -*- C++ -*- */
+/**
+ * @file ID_Factory.h
+ *
+ * $Id$
+ *
+ * @author Pradeep Gore <pradeep@oomworks.com>
+ *
+ *
+ */
+
+#ifndef TAO_Notify_ID_FACTORY_H
+#define TAO_Notify_ID_FACTORY_H
+
+#include /**/ "ace/pre.h"
+
+#include "orbsvcs/Notify/notify_serv_export.h"
+
+#if !defined (ACE_LACKS_PRAGMA_ONCE)
+# pragma once
+#endif /* ACE_LACKS_PRAGMA_ONCE */
+
+#include "ace/Atomic_Op.h"
+
+#include "orbsvcs/Notify/Object.h"
+
+TAO_BEGIN_VERSIONED_NAMESPACE_DECL
+
+/**
+ * @class TAO_Notify_ID_Factory
+ *
+ * @brief A simple factory for generating ID's for objects created by Notify.
+ *
+ */
+class TAO_Notify_Serv_Export TAO_Notify_ID_Factory
+{
+public:
+ /// Constuctor
+ TAO_Notify_ID_Factory (void);
+
+ /// Destructor
+ ~TAO_Notify_ID_Factory ();
+
+ TAO_Notify_Object::ID id (void);
+
+ void set_last_used (const TAO_Notify_Object::ID id);
+
+private:
+ // Can't use atomic op, because we added the set_last_used() method.
+ TAO_Notify_Object::ID seed_;
+ TAO_SYNCH_MUTEX mtx_;
+};
+
+TAO_END_VERSIONED_NAMESPACE_DECL
+
+#if defined (__ACE_INLINE__)
+#include "orbsvcs/Notify/ID_Factory.inl"
+#endif /* __ACE_INLINE__ */
+
+#include /**/ "ace/post.h"
+
+#endif /* TAO_Notify_ID_FACTORY_H */
diff --git a/TAO/orbsvcs/orbsvcs/Notify/ID_Factory.inl b/TAO/orbsvcs/orbsvcs/Notify/ID_Factory.inl
new file mode 100644
index 00000000000..6aa178a4421
--- /dev/null
+++ b/TAO/orbsvcs/orbsvcs/Notify/ID_Factory.inl
@@ -0,0 +1,24 @@
+// -*- C++ -*-
+//
+// $Id$
+
+TAO_BEGIN_VERSIONED_NAMESPACE_DECL
+
+ACE_INLINE TAO_Notify_Object::ID
+TAO_Notify_ID_Factory::id (void)
+{
+ ACE_GUARD_RETURN (TAO_SYNCH_MUTEX, ace_mon, this->mtx_, 0);
+ return ++seed_;
+}
+
+ACE_INLINE void
+TAO_Notify_ID_Factory::set_last_used (const TAO_Notify_Object::ID id)
+{
+ ACE_GUARD (TAO_SYNCH_MUTEX, ace_mon, this->mtx_);
+ if (this->seed_ < id)
+ {
+ this->seed_ = id;
+ }
+}
+
+TAO_END_VERSIONED_NAMESPACE_DECL
diff --git a/TAO/orbsvcs/orbsvcs/Notify/Method_Request.cpp b/TAO/orbsvcs/orbsvcs/Notify/Method_Request.cpp
new file mode 100644
index 00000000000..e9dc45dbb07
--- /dev/null
+++ b/TAO/orbsvcs/orbsvcs/Notify/Method_Request.cpp
@@ -0,0 +1,62 @@
+// $Id$
+
+#include "orbsvcs/Notify/Method_Request.h"
+
+#include "orbsvcs/Time_Utilities.h"
+#include "ace/OS_NS_sys_time.h"
+
+ACE_RCSID(Notify, TAO_Notify_Method_Request_Queueable, "$Id$")
+
+
+TAO_BEGIN_VERSIONED_NAMESPACE_DECL
+
+TAO_Notify_Method_Request::~TAO_Notify_Method_Request (void)
+{
+}
+
+TAO_Notify_Method_Request_Queueable *
+TAO_Notify_Method_Request_Queueable::copy (ACE_ENV_SINGLE_ARG_DECL_NOT_USED)
+{
+ return this;
+}
+
+TAO_Notify_Method_Request_Queueable::TAO_Notify_Method_Request_Queueable()
+{
+}
+
+TAO_Notify_Method_Request_Queueable::TAO_Notify_Method_Request_Queueable(const TAO_Notify_Event * event)
+{
+ this->init (event);
+}
+
+void
+TAO_Notify_Method_Request_Queueable::init (const TAO_Notify_Event* event)
+{
+ ACE_ASSERT( event != 0 );
+ // Set the parameters that affect queuing in the message queue.
+ // The ACE_Message_Block priorities go from 0 (lowest) to ULONG_MAX
+ // (highest), while the Notification Events go from -32767 (lowest,
+ // even though CORBA::Short goes to -32768) to 32767 (highest).
+
+ // Convert to CORBA::Long to preserve the sign. Conversion to
+ // unsigned long will happen automatically and we do not have to worry
+ // about losing the number in the addition since priority () returns a
+ // CORBA::Short.
+ this->msg_priority ((CORBA::Long)event->priority ().value () + PRIORITY_BASE);
+
+ // The deadline time for the message block is absolute, while the
+ // timeout for the event is relative to the time it was received.
+ // So, we do a little conversion and set it on the message block (us)
+
+ const TAO_Notify_Property_Time& timeout = event->timeout ();
+
+ if (timeout.is_valid () && timeout != 0)
+ {
+ ACE_Time_Value deadline;
+ ORBSVCS_Time::TimeT_to_Time_Value(deadline, timeout.value());
+ deadline += ACE_OS::gettimeofday ();
+ this->msg_deadline_time (deadline);
+ }
+}
+
+TAO_END_VERSIONED_NAMESPACE_DECL
diff --git a/TAO/orbsvcs/orbsvcs/Notify/Method_Request.h b/TAO/orbsvcs/orbsvcs/Notify/Method_Request.h
new file mode 100644
index 00000000000..271c2d721b4
--- /dev/null
+++ b/TAO/orbsvcs/orbsvcs/Notify/Method_Request.h
@@ -0,0 +1,75 @@
+// -*- C++ -*-
+
+/**
+ * @file Method_Request.h
+ *
+ * $Id$
+ *
+ * @author Pradeep Gore <pradeep@oomworks.com>
+ */
+
+#ifndef TAO_Notify_METHOD_REQUEST_H
+#define TAO_Notify_METHOD_REQUEST_H
+
+#include /**/ "ace/pre.h"
+
+#include "orbsvcs/Notify/notify_serv_export.h"
+
+#if !defined (ACE_LACKS_PRAGMA_ONCE)
+# pragma once
+#endif /* ACE_LACKS_PRAGMA_ONCE */
+
+#include "ace/Message_Block.h"
+#include "ace/Bound_Ptr.h"
+#include "ace/OS_NS_sys_time.h"
+
+#include "orbsvcs/Notify/Event.h"
+
+TAO_BEGIN_VERSIONED_NAMESPACE_DECL
+
+class TAO_Notify_Method_Request_Queueable;
+
+/**
+ * @class TAO_Notify_Method_Request
+ *
+ * @brief Base class for Method Requests
+ *
+ */
+class TAO_Notify_Serv_Export TAO_Notify_Method_Request
+{
+public:
+ /// Destructor.
+ virtual ~TAO_Notify_Method_Request (void);
+
+ /// Execute the Request
+ virtual int execute (ACE_ENV_SINGLE_ARG_DECL) = 0;
+ virtual TAO_Notify_Method_Request_Queueable* copy (ACE_ENV_SINGLE_ARG_DECL) = 0;
+};
+
+/***********************************************************************/
+
+/**
+ * @class TAO_Notify_Method_Request_Queueable
+ *
+ * @brief Interface for NS method Requests
+ *
+ */
+class TAO_Notify_Serv_Export TAO_Notify_Method_Request_Queueable
+ : public ACE_Message_Block
+ , public TAO_Notify_Method_Request
+{
+public:
+ enum {PRIORITY_BASE = 32768};
+
+ TAO_Notify_Method_Request_Queueable();
+ TAO_Notify_Method_Request_Queueable(const TAO_Notify_Event * event);
+
+ virtual TAO_Notify_Method_Request_Queueable* copy (ACE_ENV_SINGLE_ARG_DECL);
+ void init (const TAO_Notify_Event * event);
+};
+
+TAO_END_VERSIONED_NAMESPACE_DECL
+
+#include /**/ "ace/post.h"
+
+#endif /* TAO_Notify_METHOD_REQUEST_H */
diff --git a/TAO/orbsvcs/orbsvcs/Notify/Method_Request_Dispatch.cpp b/TAO/orbsvcs/orbsvcs/Notify/Method_Request_Dispatch.cpp
new file mode 100644
index 00000000000..af503aa3077
--- /dev/null
+++ b/TAO/orbsvcs/orbsvcs/Notify/Method_Request_Dispatch.cpp
@@ -0,0 +1,304 @@
+// $Id$
+
+#include "orbsvcs/Notify/Method_Request_Dispatch.h"
+
+ACE_RCSID(Notify, TAO_Notify_Method_Request_Dispatch, "$Id$")
+
+#include "orbsvcs/Notify/ProxySupplier.h"
+#include "orbsvcs/Notify/Consumer.h"
+#include "orbsvcs/Notify/Admin.h"
+#include "orbsvcs/Notify/ConsumerAdmin.h"
+#include "orbsvcs/Notify/EventChannelFactory.h"
+
+#include "tao/debug.h"
+#include "tao/CDR.h"
+
+#include "ace/OS_NS_stdio.h"
+
+#ifndef DEBUG_LEVEL
+# define DEBUG_LEVEL TAO_debug_level
+#endif //DEBUG_LEVEL
+
+TAO_BEGIN_VERSIONED_NAMESPACE_DECL
+
+// Constuct from event
+TAO_Notify_Method_Request_Dispatch::TAO_Notify_Method_Request_Dispatch (
+ const TAO_Notify_Event * event,
+ TAO_Notify_ProxySupplier* proxy_supplier,
+ bool filtering)
+ : TAO_Notify_Method_Request_Event (event)
+ , proxy_supplier_ (proxy_supplier)
+ , filtering_ (filtering)
+{
+}
+
+// Construct from a delivery rquest
+TAO_Notify_Method_Request_Dispatch::TAO_Notify_Method_Request_Dispatch (
+ const TAO_Notify::Delivery_Request_Ptr & delivery,
+ TAO_Notify_ProxySupplier* proxy_supplier,
+ bool filtering)
+ : TAO_Notify_Method_Request_Event (delivery)
+ , proxy_supplier_ (proxy_supplier)
+ , filtering_ (filtering)
+{
+}
+
+// Constuct construct from another method request+event
+// event is passed separately because we may be using a copy
+// of the one in the previous method request
+TAO_Notify_Method_Request_Dispatch::TAO_Notify_Method_Request_Dispatch (
+ const TAO_Notify_Method_Request_Event & request,
+ const TAO_Notify_Event * event,
+ TAO_Notify_ProxySupplier* proxy_supplier,
+ bool filtering)
+ : TAO_Notify_Method_Request_Event (request, event)
+ , proxy_supplier_ (proxy_supplier)
+ , filtering_ (filtering)
+{
+}
+
+TAO_Notify_Method_Request_Dispatch::~TAO_Notify_Method_Request_Dispatch ()
+{
+#if 0
+ ACE_DEBUG ((LM_DEBUG,
+ ACE_TEXT ("(%P|%t) Destroy TAO_Notify_Method_Request_Dispatch @%@\n"),
+ this));
+#endif
+}
+
+int TAO_Notify_Method_Request_Dispatch::execute_i (ACE_ENV_SINGLE_ARG_DECL)
+{
+ if (this->proxy_supplier_->has_shutdown ())
+ return 0; // If we were shutdown while waiting in the queue, return with no action.
+
+ if (this->filtering_ == 1)
+ {
+ TAO_Notify_Admin& parent = this->proxy_supplier_->consumer_admin ();
+ CORBA::Boolean val = this->proxy_supplier_->check_filters (this->event_,
+ parent.filter_admin (),
+ parent.filter_operator ()
+ ACE_ENV_ARG_PARAMETER);
+ ACE_CHECK_RETURN (-1);
+
+ if (TAO_debug_level > 1)
+ ACE_DEBUG ((LM_DEBUG, "Proxysupplier %x filter eval result = %d",&this->proxy_supplier_ , val));
+
+ // Filter failed - do nothing.
+ if (val == 0)
+ return 0;
+ }
+
+ ACE_TRY
+ {
+ TAO_Notify_Consumer* consumer = this->proxy_supplier_->consumer ();
+
+ if (consumer != 0)
+ {
+ consumer->deliver (this ACE_ENV_ARG_PARAMETER);
+ ACE_TRY_CHECK;
+ }
+ }
+ ACE_CATCHANY
+ {
+ if (TAO_debug_level > 0)
+ ACE_PRINT_EXCEPTION (ACE_ANY_EXCEPTION,
+ ACE_TEXT ("TAO_Notify_Method_Request_Dispatch::: error sending event.\n ")
+ );
+ }
+ ACE_ENDTRY;
+
+ return 0;
+}
+
+/// Static method used to reconstruct a Method Request Dispatch
+TAO_Notify_Method_Request_Dispatch_Queueable *
+TAO_Notify_Method_Request_Dispatch::unmarshal (
+ TAO_Notify::Delivery_Request_Ptr & delivery_request,
+ TAO_Notify_EventChannelFactory &ecf,
+ TAO_InputCDR & cdr
+ ACE_ENV_ARG_DECL)
+{
+ bool ok = true;
+ TAO_Notify_Method_Request_Dispatch_Queueable * result = 0;
+ ACE_CString textpath;
+ CORBA::ULong count;
+ if (cdr.read_ulong (count))
+ {
+ TAO_Notify::IdVec id_path (count);
+ for (size_t nid = 0; ok && nid < count; ++nid)
+ {
+ TAO_Notify_Object::ID id = 0;
+ if ( cdr.read_long (id))
+ {
+ id_path.push_back (id);
+ char idbuf[20];
+ ACE_OS::snprintf (idbuf, sizeof(idbuf)-1, "/%d", static_cast<int> (id));
+ textpath += idbuf;
+ }
+ else
+ {
+ ok = false;
+ }
+ }
+
+ if (ok)
+ {
+ TAO_Notify_ProxySupplier* proxy_supplier = ecf.find_proxy_supplier (id_path,
+ 0 ACE_ENV_ARG_PARAMETER);
+ ACE_CHECK_RETURN(0);
+ if (proxy_supplier != 0)
+ {
+ if (DEBUG_LEVEL > 6) ACE_DEBUG ((LM_DEBUG,
+ ACE_TEXT ("(%P|%t) TAO_Notify_Method_Request_Dispatch reload event for %s\n")
+ , textpath.c_str()
+ ));
+ ACE_NEW_NORETURN (result,
+ TAO_Notify_Method_Request_Dispatch_Queueable (delivery_request, proxy_supplier, true));
+ }
+ else
+ {
+ TAO_Notify_ProxyConsumer * proxy_consumer = ecf.find_proxy_consumer (id_path, 0 ACE_ENV_ARG_PARAMETER); //@@todo
+ if (proxy_consumer == 0)
+ {
+ ACE_ERROR ((LM_ERROR,
+ ACE_TEXT ("(%P|%t) TAO_Notify_Method_Request_Dispatch::unmarshal: unknown proxy id %s\n")
+ , textpath.c_str()
+ ));
+ }
+ else
+ {
+ ACE_ERROR ((LM_ERROR,
+ ACE_TEXT ("(%P|%t) TAO_Notify_Method_Request_Dispatch::unmarshal: wrong type of proxy id %s\n")
+ , textpath.c_str()
+ ));
+ }
+ }
+ }
+ else
+ {
+ ACE_ERROR ((LM_ERROR,
+ ACE_TEXT ("(%P|%t) TAO_Notify_Method_Request_Dispatch::unmarshal: Cant read proxy id path\n")
+ ));
+ }
+ }
+ return result;
+}
+
+///////////////////////////////////////////////////////////////////////////////
+
+
+/*******************************************************************/
+
+// Constuct construct from another method request+event
+// event is passed separately because we may be using a copy
+// of the one in the previous method request
+TAO_Notify_Method_Request_Dispatch_Queueable::TAO_Notify_Method_Request_Dispatch_Queueable (
+ const TAO_Notify_Method_Request_Event & request,
+ TAO_Notify_Event::Ptr & event,
+ TAO_Notify_ProxySupplier* proxy_supplier,
+ bool filtering)
+ : TAO_Notify_Method_Request_Dispatch (request, event.get (), proxy_supplier, filtering)
+ , TAO_Notify_Method_Request_Queueable (event.get ())
+ , event_var_( event )
+{
+#if 0
+ ACE_DEBUG ((LM_DEBUG,
+ ACE_TEXT ("(%P|%t) Construct Method_Request_Dispatch @%@\n"),
+ this));
+#endif
+}
+
+ /// Constuct construct from Delivery Request
+ /// should ONLY be used by unmarshall
+TAO_Notify_Method_Request_Dispatch_Queueable::TAO_Notify_Method_Request_Dispatch_Queueable (
+ const TAO_Notify::Delivery_Request_Ptr & request,
+ TAO_Notify_ProxySupplier* proxy_supplier,
+ bool filtering)
+ : TAO_Notify_Method_Request_Dispatch (request, request->event ().get (), proxy_supplier, filtering)
+ , TAO_Notify_Method_Request_Queueable (request->event ().get ())
+ , event_var_( request->event () )
+
+{
+#if 0
+ ACE_DEBUG ((LM_DEBUG,
+ ACE_TEXT ("(%P|%t) Construct unmarshalled Method_Request_Dispatch_Queueable @%@\n"),
+ this));
+#endif
+}
+
+TAO_Notify_Method_Request_Dispatch_Queueable::~TAO_Notify_Method_Request_Dispatch_Queueable ()
+{
+#if 0
+ ACE_DEBUG ((LM_DEBUG,
+ ACE_TEXT ("(%P|%t) Destroy TAO_Notify_Method_Request_Dispatch_Queueable @%@\n"),
+ this));
+#endif
+}
+
+int
+TAO_Notify_Method_Request_Dispatch_Queueable::execute (ACE_ENV_SINGLE_ARG_DECL)
+{
+ return this->execute_i (ACE_ENV_SINGLE_ARG_PARAMETER);
+}
+
+/*********************************************************************************************************/
+
+TAO_Notify_Method_Request_Dispatch_No_Copy::TAO_Notify_Method_Request_Dispatch_No_Copy (
+ const TAO_Notify_Event* event,
+ TAO_Notify_ProxySupplier* proxy_supplier,
+ bool filtering)
+ : TAO_Notify_Method_Request_Dispatch (event, proxy_supplier, filtering)
+{
+#if 0
+ ACE_DEBUG ((LM_DEBUG,
+ ACE_TEXT ("(%P|%t) Construct Method_Request_Dispatch_No_Copy @%@\n"),
+ this));
+#endif
+}
+ /// Constuct construct from another method request
+TAO_Notify_Method_Request_Dispatch_No_Copy::TAO_Notify_Method_Request_Dispatch_No_Copy (
+ const TAO_Notify_Method_Request_Event & request,
+ TAO_Notify_ProxySupplier* proxy_supplier,
+ bool filtering)
+ : TAO_Notify_Method_Request_Dispatch (request, request.event (), proxy_supplier, filtering)
+{
+#if 0
+ ACE_DEBUG ((LM_DEBUG,
+ ACE_TEXT ("(%P|%t) Construct Method_Request_Dispatch_No_Copy @%@\n"),
+ this));
+#endif
+}
+
+TAO_Notify_Method_Request_Dispatch_No_Copy:: ~TAO_Notify_Method_Request_Dispatch_No_Copy ()
+{
+#if 0
+ ACE_DEBUG ((LM_DEBUG,
+ ACE_TEXT ("(%P|%t) Destroy Method_Request_Dispatch_No_Copy @%@\n"),
+ this));
+#endif
+}
+
+int
+TAO_Notify_Method_Request_Dispatch_No_Copy::execute (ACE_ENV_SINGLE_ARG_DECL)
+{
+ return this->execute_i (ACE_ENV_SINGLE_ARG_PARAMETER);
+}
+
+TAO_Notify_Method_Request_Queueable*
+TAO_Notify_Method_Request_Dispatch_No_Copy::copy (ACE_ENV_SINGLE_ARG_DECL)
+{
+ TAO_Notify_Method_Request_Queueable* request;
+
+ TAO_Notify_Event::Ptr event_var (
+ this->event_->queueable_copy (ACE_ENV_SINGLE_ARG_PARAMETER) );
+ ACE_CHECK_RETURN (0);
+
+ ACE_NEW_THROW_EX (request,
+ TAO_Notify_Method_Request_Dispatch_Queueable (*this, event_var, this->proxy_supplier_.get(), this->filtering_),
+ //TAO_Notify_Method_Request_Dispatch_Queueable (*this, event_var, this->proxy_supplier_, this->filtering_),
+ CORBA::INTERNAL ());
+
+ return request;
+}
+
+TAO_END_VERSIONED_NAMESPACE_DECL
diff --git a/TAO/orbsvcs/orbsvcs/Notify/Method_Request_Dispatch.h b/TAO/orbsvcs/orbsvcs/Notify/Method_Request_Dispatch.h
new file mode 100644
index 00000000000..fed8d063cfa
--- /dev/null
+++ b/TAO/orbsvcs/orbsvcs/Notify/Method_Request_Dispatch.h
@@ -0,0 +1,170 @@
+// -*- C++ -*-
+
+/**
+ * @file Method_Request_Dispatch.h
+ *
+ * $Id$
+ *
+ * @author Pradeep Gore <pradeep@oomworks.com>
+ */
+
+#ifndef TAO_Notify_DISPATCH_METHOD_REQUEST_H
+#define TAO_Notify_DISPATCH_METHOD_REQUEST_H
+#include /**/ "ace/pre.h"
+
+#include "orbsvcs/Notify/notify_serv_export.h"
+
+#if !defined (ACE_LACKS_PRAGMA_ONCE)
+# pragma once
+#endif /* ACE_LACKS_PRAGMA_ONCE */
+
+#include "orbsvcs/Notify/Method_Request.h"
+#include "orbsvcs/Notify/Refcountable.h"
+#include "orbsvcs/Notify/Method_Request_Event.h"
+#include "orbsvcs/Notify/ProxySupplier.h"
+#include "orbsvcs/Notify/Delivery_Request.h"
+
+TAO_BEGIN_VERSIONED_NAMESPACE_DECL
+
+class TAO_Notify_EventChannelFactory;
+class TAO_InputCDR;
+class TAO_Notify_Method_Request_Dispatch_Queueable;
+
+/**
+ * @class TAO_Notify_Method_Request_Dispatch
+ *
+ * @brief
+ *
+ */
+class TAO_Notify_Serv_Export TAO_Notify_Method_Request_Dispatch
+ : public TAO_Notify_Method_Request_Event
+{
+public:
+ /// an arbitrary code (Octet) to identify this delivery method type in persistent storage
+ enum {persistence_code = 1};
+
+ /// Constuct from event
+ TAO_Notify_Method_Request_Dispatch (
+ const TAO_Notify_Event * event,
+ TAO_Notify_ProxySupplier* proxy_supplier,
+ bool filtering);
+
+ /// Construct from a delivery rquest
+ TAO_Notify_Method_Request_Dispatch (
+ const TAO_Notify::Delivery_Request_Ptr & delivery,
+ TAO_Notify_ProxySupplier* proxy_supplier,
+ bool filtering);
+
+ /// Constuct construct from another method request+event
+ /// event is passed separately because we may be using a copy
+ /// of the one in the previous method request
+ TAO_Notify_Method_Request_Dispatch (
+ const TAO_Notify_Method_Request_Event & request,
+ const TAO_Notify_Event * event,
+ TAO_Notify_ProxySupplier* proxy_supplier,
+ bool filtering);
+
+public:
+ /// Destructor
+ virtual ~TAO_Notify_Method_Request_Dispatch ();
+
+ /// Static method used to reconstruct a Method Request Dispatch
+ static TAO_Notify_Method_Request_Dispatch_Queueable * unmarshal (
+ TAO_Notify::Delivery_Request_Ptr & delivery_request,
+ TAO_Notify_EventChannelFactory &ecf,
+ TAO_InputCDR & cdr
+ ACE_ENV_ARG_DECL);
+
+
+protected:
+ /// Execute the dispatch operation.
+ int execute_i (ACE_ENV_SINGLE_ARG_DECL);
+
+protected:
+ /// The Proxy
+ TAO_Notify_ProxySupplier::Ptr proxy_supplier_;
+
+ /// Flag is true if we want to do filtering else false.
+ bool filtering_;
+};
+
+/**
+ * @class TAO_Notify_Method_Request_Dispatch_Queueable
+ *
+ * @brief Dispatchs an event to a proxy supplier.
+ *
+ */
+
+class TAO_Notify_Serv_Export TAO_Notify_Method_Request_Dispatch_Queueable
+ : public TAO_Notify_Method_Request_Dispatch
+ , public TAO_Notify_Method_Request_Queueable
+{
+public:
+ /// Construct construct from another method request+event
+ /// event is passed separately because we may be using a copy
+ /// of the one in the previous method request
+ TAO_Notify_Method_Request_Dispatch_Queueable (
+ const TAO_Notify_Method_Request_Event & request,
+ TAO_Notify_Event::Ptr & event,
+ TAO_Notify_ProxySupplier* proxy_supplier,
+ bool filtering);
+
+ /// Constuct construct from Delivery Request
+ /// should ONLY be used by unmarshall
+ TAO_Notify_Method_Request_Dispatch_Queueable (
+ const TAO_Notify::Delivery_Request_Ptr & request,
+ TAO_Notify_ProxySupplier* proxy_supplier,
+ bool filtering);
+
+ /// Destructor
+ virtual ~TAO_Notify_Method_Request_Dispatch_Queueable ();
+
+ /// Execute the Request
+ virtual int execute (ACE_ENV_SINGLE_ARG_DECL);
+
+private:
+ TAO_Notify_Event::Ptr event_var_;
+ TAO_Notify_ProxySupplier::Ptr proxy_guard_;
+};
+
+/*****************************************************************************/
+
+/**
+ * @class TAO_Notify_Method_Request_Dispatch_No_Copy
+ *
+ * @brief Dispatchs an event to a proxy supplier.
+ *
+ */
+class TAO_Notify_Serv_Export TAO_Notify_Method_Request_Dispatch_No_Copy
+ : public TAO_Notify_Method_Request_Dispatch
+ , public TAO_Notify_Method_Request
+{
+public:
+ /// Constuct from event
+ TAO_Notify_Method_Request_Dispatch_No_Copy (
+ const TAO_Notify_Event * event,
+ TAO_Notify_ProxySupplier* proxy_supplier,
+ bool filtering);
+
+ /// Constuct construct from another method request
+ TAO_Notify_Method_Request_Dispatch_No_Copy (
+ const TAO_Notify_Method_Request_Event & request,
+ TAO_Notify_ProxySupplier* proxy_supplier,
+ bool filtering);
+
+ /// Destructor
+ virtual ~TAO_Notify_Method_Request_Dispatch_No_Copy ();
+
+ /// Execute the Request
+ virtual int execute (ACE_ENV_SINGLE_ARG_DECL);
+
+ /// Create a copy of this method request
+ virtual TAO_Notify_Method_Request_Queueable* copy (ACE_ENV_SINGLE_ARG_DECL);
+};
+
+/*****************************************************************************/
+
+TAO_END_VERSIONED_NAMESPACE_DECL
+
+#include /**/ "ace/post.h"
+#endif /* TAO_Notify_DISPATCH_METHOD_REQUEST_H */
diff --git a/TAO/orbsvcs/orbsvcs/Notify/Method_Request_Event.cpp b/TAO/orbsvcs/orbsvcs/Notify/Method_Request_Event.cpp
new file mode 100644
index 00000000000..53ab33da14c
--- /dev/null
+++ b/TAO/orbsvcs/orbsvcs/Notify/Method_Request_Event.cpp
@@ -0,0 +1,102 @@
+// $Id$
+
+#include "orbsvcs/Notify/Method_Request_Event.h"
+#include "orbsvcs/Notify/Delivery_Request.h"
+
+ACE_RCSID (Notify, TAO_Notify_Method_Request_Event_Queueable, "$Id$")
+
+TAO_BEGIN_VERSIONED_NAMESPACE_DECL
+
+TAO_Notify_Method_Request_Event::TAO_Notify_Method_Request_Event (
+ const TAO_Notify_Event * event)
+ : event_ (event)
+{
+}
+
+TAO_Notify_Method_Request_Event::TAO_Notify_Method_Request_Event (
+ const TAO_Notify::Delivery_Request_Ptr & request)
+ : event_ (request->event ().get ())
+ , delivery_request_ (request)
+{
+}
+
+TAO_Notify_Method_Request_Event::TAO_Notify_Method_Request_Event (
+ const TAO_Notify_Method_Request_Event & rhs,
+ const TAO_Notify_Event * event)
+ : event_ (event)
+ , delivery_request_ (rhs.delivery_request_)
+{
+}
+
+TAO_Notify_Method_Request_Event::~TAO_Notify_Method_Request_Event()
+{
+}
+
+void
+TAO_Notify_Method_Request_Event::complete ()
+{
+ if (this->delivery_request_.get () != 0)
+ {
+ this->delivery_request_->complete ();
+ }
+}
+
+
+unsigned long
+TAO_Notify_Method_Request_Event::sequence ()
+{
+ if (this->delivery_request_.get () != 0)
+ {
+ return this->delivery_request_->sequence ();
+ }
+ return 0;
+}
+
+bool
+TAO_Notify_Method_Request_Event::should_retry ()
+{
+ if (this->delivery_request_.get () != 0)
+ {
+ return this->delivery_request_->should_retry ();
+ }
+ return false;
+}
+
+/**********************************************************/
+
+
+TAO_Notify_Method_Request_Event_Queueable::TAO_Notify_Method_Request_Event_Queueable (
+ const TAO_Notify_Method_Request_Event & prev_request,
+ const TAO_Notify_Event::Ptr& event)
+ : TAO_Notify_Method_Request_Queueable (event.get ())
+ , TAO_Notify_Method_Request_Event (prev_request, event.get ())
+ , event_var_ (event)
+{
+}
+
+TAO_Notify_Method_Request_Event_Queueable::TAO_Notify_Method_Request_Event_Queueable (
+ TAO_Notify::Delivery_Request_Ptr & request)
+ : TAO_Notify_Method_Request_Queueable (request->event ().get ())
+ , TAO_Notify_Method_Request_Event (request, request->event ().get ())
+ , event_var_ (request->event ())
+{
+}
+
+TAO_Notify_Method_Request_Event_Queueable::~TAO_Notify_Method_Request_Event_Queueable ()
+{
+}
+
+int
+TAO_Notify_Method_Request_Event_Queueable::execute (ACE_ENV_SINGLE_ARG_DECL_NOT_USED)
+{
+ ACE_ASSERT (false);
+ return -1;
+}
+
+const TAO_Notify_Event *
+TAO_Notify_Method_Request_Event::event() const
+{
+ return this->event_;
+}
+
+TAO_END_VERSIONED_NAMESPACE_DECL
diff --git a/TAO/orbsvcs/orbsvcs/Notify/Method_Request_Event.h b/TAO/orbsvcs/orbsvcs/Notify/Method_Request_Event.h
new file mode 100644
index 00000000000..4acb97f10d9
--- /dev/null
+++ b/TAO/orbsvcs/orbsvcs/Notify/Method_Request_Event.h
@@ -0,0 +1,104 @@
+// -*- C++ -*-
+
+/**
+ * @file Method_Request_Event.h
+ *
+ * $Id$
+ *
+ * @author Pradeep Gore <pradeep@oomworks.com>
+ */
+
+#ifndef TAO_Notify_METHOD_REQUEST_EVENT_H
+#define TAO_Notify_METHOD_REQUEST_EVENT_H
+#include /**/ "ace/pre.h"
+
+#include "orbsvcs/Notify/notify_serv_export.h"
+
+#if !defined (ACE_LACKS_PRAGMA_ONCE)
+# pragma once
+#endif /* ACE_LACKS_PRAGMA_ONCE */
+
+#include "orbsvcs/Notify/Method_Request.h"
+#include "orbsvcs/Notify/Event.h"
+#include "orbsvcs/Notify/ProxySupplier.h"
+#include "tao/Basic_Types.h"
+#include "ace/CORBA_macros.h"
+#include "orbsvcs/Notify/Delivery_Request.h"
+
+TAO_BEGIN_VERSIONED_NAMESPACE_DECL
+
+/**
+ * @class TAO_Notify_Method_Request_Event
+ *
+ * @brief A base class for all Method Requests that are associated with events.
+ *
+ */
+class TAO_Notify_Serv_Export TAO_Notify_Method_Request_Event
+{
+public:
+ /// Construct from event
+ TAO_Notify_Method_Request_Event (const TAO_Notify_Event *);
+
+ /// Construct from a delivery request
+ TAO_Notify_Method_Request_Event (
+ const TAO_Notify::Delivery_Request_Ptr & delivery_request);
+
+ /// Construct from another Method Request
+ /// Event is passed separately because it may be a copy of the one in request.
+ TAO_Notify_Method_Request_Event (const TAO_Notify_Method_Request_Event & rhs,
+ const TAO_Notify_Event * event);
+
+public:
+ /// Destructor
+ virtual ~TAO_Notify_Method_Request_Event ();
+
+ const TAO_Notify_Event * event() const;
+ void complete ();
+ unsigned long sequence ();
+ bool should_retry ();
+
+protected:
+
+ /// The Event
+ const TAO_Notify_Event * event_;
+
+ /// Pointer to the routing slip's delivery request (if any)
+ TAO_Notify::Delivery_Request_Ptr delivery_request_;
+};
+
+/***************************************************************/
+
+/**
+ * @class TAO_Notify_Method_Request_Event_Queueable
+ *
+ * @brief A method request for storing events.
+ *
+ */
+class TAO_Notify_Serv_Export TAO_Notify_Method_Request_Event_Queueable
+ : public TAO_Notify_Method_Request_Queueable
+ , public TAO_Notify_Method_Request_Event
+{
+public:
+ /// Constuctor
+ /// Not the event_var is passed as a separate parameter to avoid throwing
+ /// exceptions from the constructor if it's necessary to copy the event.
+ TAO_Notify_Method_Request_Event_Queueable (
+ const TAO_Notify_Method_Request_Event & prev_request,
+ const TAO_Notify_Event::Ptr & event);
+
+ TAO_Notify_Method_Request_Event_Queueable (
+ TAO_Notify::Delivery_Request_Ptr & request);
+
+ /// Destructor
+ virtual ~TAO_Notify_Method_Request_Event_Queueable ();
+
+ /// satisfy the pure virtual method. Should never be called.
+ virtual int execute (ACE_ENV_SINGLE_ARG_DECL);
+private:
+ TAO_Notify_Event::Ptr event_var_;
+};
+
+TAO_END_VERSIONED_NAMESPACE_DECL
+
+#include /**/ "ace/post.h"
+#endif /* TAO_Notify_METHOD_REQUEST_EVENT_H */
diff --git a/TAO/orbsvcs/orbsvcs/Notify/Method_Request_Lookup.cpp b/TAO/orbsvcs/orbsvcs/Notify/Method_Request_Lookup.cpp
new file mode 100644
index 00000000000..bee058ab534
--- /dev/null
+++ b/TAO/orbsvcs/orbsvcs/Notify/Method_Request_Lookup.cpp
@@ -0,0 +1,233 @@
+// $Id$
+
+#include "orbsvcs/Notify/Method_Request_Lookup.h"
+
+ACE_RCSID(Notify, TAO_Notify_Method_Request_Lookup, "$Id$")
+
+#include "orbsvcs/Notify/Consumer_Map.h"
+#include "orbsvcs/Notify/ProxySupplier.h"
+#include "orbsvcs/Notify/ProxyConsumer.h"
+#include "orbsvcs/Notify/Proxy.h"
+#include "orbsvcs/Notify/Admin.h"
+#include "orbsvcs/Notify/SupplierAdmin.h"
+#include "orbsvcs/Notify/Method_Request_Dispatch.h"
+#include "orbsvcs/Notify/Delivery_Request.h"
+#include "orbsvcs/Notify/EventChannelFactory.h"
+#include "orbsvcs/Notify/Event_Manager.h"
+#include "orbsvcs/Notify/Factory.h"
+
+#include "orbsvcs/ESF/ESF_Proxy_Collection.h"
+
+#include "tao/debug.h"
+#include "tao/CDR.h"
+
+TAO_BEGIN_VERSIONED_NAMESPACE_DECL
+
+TAO_Notify_Method_Request_Lookup::TAO_Notify_Method_Request_Lookup (
+ const TAO_Notify_Event * event,
+ TAO_Notify_ProxyConsumer * proxy)
+ : TAO_Notify_Method_Request_Event (event)
+ , proxy_consumer_ (proxy)
+{
+}
+
+TAO_Notify_Method_Request_Lookup::~TAO_Notify_Method_Request_Lookup ()
+{
+}
+
+void
+TAO_Notify_Method_Request_Lookup::work (
+ TAO_Notify_ProxySupplier* proxy_supplier
+ ACE_ENV_ARG_DECL)
+{
+ if (delivery_request_.get () == 0)
+ {
+ TAO_Notify_Method_Request_Dispatch_No_Copy request (*this, proxy_supplier, true);
+ proxy_supplier->deliver (request ACE_ENV_ARG_PARAMETER);
+ ACE_CHECK;
+ }
+ else
+ {
+ delivery_request_->dispatch (proxy_supplier, true ACE_ENV_ARG_PARAMETER);
+ ACE_CHECK;
+ }
+}
+
+int TAO_Notify_Method_Request_Lookup::execute_i (ACE_ENV_SINGLE_ARG_DECL)
+{
+ if (this->proxy_consumer_->has_shutdown ())
+ return 0; // If we were shutdown while waiting in the queue, return with no action.
+
+ TAO_Notify_SupplierAdmin& parent = this->proxy_consumer_->supplier_admin ();
+
+ CORBA::Boolean val = this->proxy_consumer_->check_filters (this->event_,
+ parent.filter_admin (),
+ parent.filter_operator ()
+ ACE_ENV_ARG_PARAMETER);
+ ACE_CHECK_RETURN (0);
+
+ if (TAO_debug_level > 1)
+ ACE_DEBUG ((LM_DEBUG, "Proxyconsumer %x filter eval result = %d",&this->proxy_consumer_ , val));
+
+ // Filter failed - do nothing.
+ if (val == 0)
+ return 0;
+
+ // The map of subscriptions.
+ TAO_Notify_Consumer_Map& map = this->proxy_consumer_->event_manager ().consumer_map ();
+
+ TAO_Notify_Consumer_Map::ENTRY* entry = map.find (this->event_->type () ACE_ENV_ARG_PARAMETER);
+ ACE_CHECK_RETURN (0);
+
+ TAO_Notify_ProxySupplier_Collection* consumers = 0;
+
+ if (entry != 0)
+ {
+ consumers = entry->collection ();
+
+ if (consumers != 0)
+ {
+ consumers->for_each (this ACE_ENV_ARG_PARAMETER);
+ ACE_CHECK_RETURN (0);
+ }
+
+ map.release (entry);
+ }
+
+ // Get the default consumers
+ consumers = map.broadcast_collection ();
+
+ if (consumers != 0)
+ {
+ consumers->for_each (this ACE_ENV_ARG_PARAMETER);
+ ACE_CHECK_RETURN (0);
+ }
+ this->complete ();
+ return 0;
+}
+
+/// Static method used to reconstruct a Method Request Dispatch
+TAO_Notify_Method_Request_Lookup_Queueable *
+TAO_Notify_Method_Request_Lookup::unmarshal (
+ TAO_Notify::Delivery_Request_Ptr & delivery_request,
+ TAO_Notify_EventChannelFactory &ecf,
+ TAO_InputCDR & cdr
+ ACE_ENV_ARG_DECL)
+{
+ bool ok = true;
+ TAO_Notify_Method_Request_Lookup_Queueable * result = 0;
+ CORBA::ULong count;
+ if (cdr.read_ulong (count))
+ {
+ TAO_Notify::IdVec id_path (count);
+ for (size_t nid = 0; ok && nid < count; ++nid)
+ {
+ TAO_Notify_Object::ID id = 0;
+ if ( cdr.read_long (id))
+ {
+ id_path.push_back (id);
+ }
+ else
+ {
+ ok = false;
+ }
+ }
+
+ if (ok)
+ {
+ TAO_Notify_ProxyConsumer * proxy_consumer = ecf.find_proxy_consumer (
+ id_path,
+ 0 ACE_ENV_ARG_PARAMETER);
+ ACE_CHECK_RETURN(0);
+ if (proxy_consumer != 0)
+ {
+ ACE_NEW_NORETURN (result,
+ TAO_Notify_Method_Request_Lookup_Queueable (delivery_request, proxy_consumer));
+ }
+ else
+ {
+ ACE_ERROR ((LM_ERROR,
+ ACE_TEXT ("(%P|%t) TAO_Notify_Method_Request_Lookup_No_Copy::unmarshal: unknown proxy id\n")
+ ));
+ }
+ }
+ else
+ {
+ ACE_ERROR ((LM_ERROR,
+ ACE_TEXT ("(%P|%t) TAO_Notify_Method_Request_Lookup_No_Copy::unmarshal: Cant read proxy id path\n")
+ ));
+ }
+ }
+ return result;
+
+}
+
+
+/****************************************************************/
+
+TAO_Notify_Method_Request_Lookup_Queueable::TAO_Notify_Method_Request_Lookup_Queueable (
+ const TAO_Notify_Event::Ptr& event,
+ TAO_Notify_ProxyConsumer* proxy_consumer)
+ : TAO_Notify_Method_Request_Lookup (event.get (), proxy_consumer)
+ , TAO_Notify_Method_Request_Queueable (event.get ())
+ , event_var_ (event)
+ , proxy_guard_ (proxy_consumer)
+{
+}
+
+TAO_Notify_Method_Request_Lookup_Queueable::TAO_Notify_Method_Request_Lookup_Queueable (
+ TAO_Notify::Delivery_Request_Ptr & request,
+ TAO_Notify_ProxyConsumer * proxy_consumer)
+ : TAO_Notify_Method_Request_Lookup (request->event ().get (), proxy_consumer)
+ , TAO_Notify_Method_Request_Queueable (request->event ().get ())
+ , event_var_ (request->event ())
+ , proxy_guard_ (proxy_consumer)
+{
+}
+
+
+TAO_Notify_Method_Request_Lookup_Queueable::~TAO_Notify_Method_Request_Lookup_Queueable ()
+{
+}
+
+int
+TAO_Notify_Method_Request_Lookup_Queueable::execute (ACE_ENV_SINGLE_ARG_DECL)
+{
+ return this->execute_i (ACE_ENV_SINGLE_ARG_PARAMETER);
+}
+
+/******************************************************************************************************/
+
+TAO_Notify_Method_Request_Lookup_No_Copy::TAO_Notify_Method_Request_Lookup_No_Copy (
+ const TAO_Notify_Event* event,
+ TAO_Notify_ProxyConsumer* proxy_consumer)
+ : TAO_Notify_Method_Request_Lookup (event, proxy_consumer)
+{
+}
+
+TAO_Notify_Method_Request_Lookup_No_Copy::~TAO_Notify_Method_Request_Lookup_No_Copy ()
+{
+}
+
+int
+TAO_Notify_Method_Request_Lookup_No_Copy::execute (ACE_ENV_SINGLE_ARG_DECL)
+{
+ return this->execute_i (ACE_ENV_SINGLE_ARG_PARAMETER);
+}
+
+TAO_Notify_Method_Request_Queueable*
+TAO_Notify_Method_Request_Lookup_No_Copy::copy (ACE_ENV_SINGLE_ARG_DECL)
+{
+ TAO_Notify_Method_Request_Queueable* request;
+
+ TAO_Notify_Event::Ptr event(this->event_->queueable_copy(ACE_ENV_SINGLE_ARG_PARAMETER));
+ ACE_CHECK_RETURN (0);
+
+ ACE_NEW_THROW_EX (request,
+ TAO_Notify_Method_Request_Lookup_Queueable (event, this->proxy_consumer_),
+ CORBA::INTERNAL ());
+
+ return request;
+}
+
+TAO_END_VERSIONED_NAMESPACE_DECL
diff --git a/TAO/orbsvcs/orbsvcs/Notify/Method_Request_Lookup.h b/TAO/orbsvcs/orbsvcs/Notify/Method_Request_Lookup.h
new file mode 100644
index 00000000000..d54bb62833e
--- /dev/null
+++ b/TAO/orbsvcs/orbsvcs/Notify/Method_Request_Lookup.h
@@ -0,0 +1,140 @@
+// -*- C++ -*-
+
+/**
+ * @file Method_Request_Lookup.h
+ *
+ * $Id$
+ *
+ * @author Pradeep Gore <pradeep@oomworks.com>
+ */
+#ifndef TAO_Notify_LOOKUP_METHOD_REQUEST_H
+#define TAO_Notify_LOOKUP_METHOD_REQUEST_H
+#include /**/ "ace/pre.h"
+
+#include "orbsvcs/Notify/notify_serv_export.h"
+
+#if !defined (ACE_LACKS_PRAGMA_ONCE)
+# pragma once
+#endif /* ACE_LACKS_PRAGMA_ONCE */
+
+#include "orbsvcs/ESF/ESF_Worker.h"
+#include "orbsvcs/Notify/Method_Request_Event.h"
+#include "orbsvcs/Notify/ProxySupplier.h"
+#include "orbsvcs/Notify/ProxyConsumer.h"
+#include "orbsvcs/Notify/Consumer_Map.h"
+#include "orbsvcs/Notify/Delivery_Request.h"
+
+#include "orbsvcs/ESF/ESF_Worker.h"
+
+TAO_BEGIN_VERSIONED_NAMESPACE_DECL
+
+class TAO_Notify_Method_Request_Lookup_Queueable;
+class TAO_Notify_Event;
+
+/**
+ * @class TAO_Notify_Method_Request_Lookup
+ *
+ * @brief
+ *
+ */
+class TAO_Notify_Serv_Export TAO_Notify_Method_Request_Lookup
+ : public TAO_ESF_Worker<TAO_Notify_ProxySupplier>
+ , public TAO_Notify_Method_Request_Event
+{
+public:
+
+ /// an arbitrary code (Octet) to identify this type of request in persistent storage
+ enum {persistence_code = 2};
+
+ /// Destructor
+ virtual ~TAO_Notify_Method_Request_Lookup ();
+
+ /// Static method used to reconstruct a Method Request Dispatch
+ static TAO_Notify_Method_Request_Lookup_Queueable * unmarshal (
+ TAO_Notify::Delivery_Request_Ptr & delivery_request,
+ TAO_Notify_EventChannelFactory &ecf,
+ TAO_InputCDR & cdr
+ ACE_ENV_ARG_DECL);
+
+protected:
+ /// Constuctor
+ TAO_Notify_Method_Request_Lookup (const TAO_Notify_Event * event, TAO_Notify_ProxyConsumer * proxy);
+
+ /// Execute the dispatch operation.
+ int execute_i (ACE_ENV_SINGLE_ARG_DECL);
+
+ ///= TAO_ESF_Worker method
+ virtual void work (TAO_Notify_ProxySupplier* proxy_supplier ACE_ENV_ARG_DECL);
+
+protected:
+
+ /// The Proxy
+ TAO_Notify_ProxyConsumer* proxy_consumer_;
+};
+
+/***************************************************************/
+
+/**
+ * @class TAO_Notify_Method_Request_Lookup_Queueable
+ *
+ * @brief Lookup command object looks up the event type of the given event in the consumer map and send the event to each proxysupplier.
+ *
+ */
+class TAO_Notify_Serv_Export TAO_Notify_Method_Request_Lookup_Queueable
+ : public TAO_Notify_Method_Request_Lookup
+ , public TAO_Notify_Method_Request_Queueable
+{
+public:
+ /// Constuctor from event
+ TAO_Notify_Method_Request_Lookup_Queueable (
+ const TAO_Notify_Event::Ptr& event,
+ TAO_Notify_ProxyConsumer * proxy_consumer);
+
+ /// Constuctor from delivery request
+ TAO_Notify_Method_Request_Lookup_Queueable (
+ TAO_Notify::Delivery_Request_Ptr & request,
+ TAO_Notify_ProxyConsumer * proxy_consumer);
+
+ /// Destructor
+ virtual ~TAO_Notify_Method_Request_Lookup_Queueable ();
+
+ /// Execute the Request
+ virtual int execute (ACE_ENV_SINGLE_ARG_DECL);
+
+private:
+ TAO_Notify_Event::Ptr event_var_;
+ TAO_Notify_ProxyConsumer::Ptr proxy_guard_;
+};
+
+/*****************************************************************************************************************************/
+
+/**
+ * @class TAO_Notify_Method_Request_Lookup_No_Copy
+ *
+ * @brief Lookup command object looks up the event type of the given event in the consumer map and send the event to each proxysupplier.
+ *
+ */
+class TAO_Notify_Serv_Export TAO_Notify_Method_Request_Lookup_No_Copy
+ : public TAO_Notify_Method_Request_Lookup
+ , public TAO_Notify_Method_Request
+{
+public:
+ /// Constuctor
+ TAO_Notify_Method_Request_Lookup_No_Copy (
+ const TAO_Notify_Event* event,
+ TAO_Notify_ProxyConsumer* proxy_consumer);
+
+ /// Destructor
+ virtual ~TAO_Notify_Method_Request_Lookup_No_Copy ();
+
+ /// Execute the Request
+ virtual int execute (ACE_ENV_SINGLE_ARG_DECL);
+
+ /// Create a copy of this object.
+ virtual TAO_Notify_Method_Request_Queueable* copy (ACE_ENV_SINGLE_ARG_DECL);
+};
+
+TAO_END_VERSIONED_NAMESPACE_DECL
+
+#include /**/ "ace/post.h"
+#endif /* TAO_Notify_LOOKUP_METHOD_REQUEST_H */
diff --git a/TAO/orbsvcs/orbsvcs/Notify/Method_Request_Shutdown.cpp b/TAO/orbsvcs/orbsvcs/Notify/Method_Request_Shutdown.cpp
new file mode 100644
index 00000000000..74ca99ef829
--- /dev/null
+++ b/TAO/orbsvcs/orbsvcs/Notify/Method_Request_Shutdown.cpp
@@ -0,0 +1,35 @@
+// $Id$
+
+#include "orbsvcs/Notify/Method_Request_Shutdown.h"
+#include "orbsvcs/Notify/ThreadPool_Task.h"
+
+ACE_RCSID(Notify, TAO_Notify_Method_Request_Shutdown, "$Id$")
+
+TAO_BEGIN_VERSIONED_NAMESPACE_DECL
+
+TAO_Notify_Method_Request_Shutdown::TAO_Notify_Method_Request_Shutdown (TAO_Notify_ThreadPool_Task* task)
+ : task_ (task)
+{
+}
+
+TAO_Notify_Method_Request_Shutdown::~TAO_Notify_Method_Request_Shutdown ()
+{
+}
+
+TAO_Notify_Method_Request_Queueable*
+TAO_Notify_Method_Request_Shutdown::copy (void)
+{
+ return new TAO_Notify_Method_Request_Shutdown (this->task_);
+}
+
+int
+TAO_Notify_Method_Request_Shutdown::execute (ACE_ENV_SINGLE_ARG_DECL_NOT_USED)
+{
+ // Shut down the scheduler by deactivating the activation queue's
+ // underlying message queue - should pop all worker threads off their
+ // wait and they'll exit.
+ this->task_->msg_queue ()->deactivate ();
+ return -1;
+}
+
+TAO_END_VERSIONED_NAMESPACE_DECL
diff --git a/TAO/orbsvcs/orbsvcs/Notify/Method_Request_Shutdown.h b/TAO/orbsvcs/orbsvcs/Notify/Method_Request_Shutdown.h
new file mode 100644
index 00000000000..af38f816524
--- /dev/null
+++ b/TAO/orbsvcs/orbsvcs/Notify/Method_Request_Shutdown.h
@@ -0,0 +1,58 @@
+// -*- C++ -*-
+
+/**
+ * @file Method_Request_Shutdown.h
+ *
+ * $Id$
+ *
+ * @author Pradeep Gore <pradeep@oomworks.com>
+ *
+ *
+ */
+
+#ifndef TAO_Notify_METHOD_REQUEST_SHUTDOWN_H
+#define TAO_Notify_METHOD_REQUEST_SHUTDOWN_H
+#include /**/ "ace/pre.h"
+
+#include "orbsvcs/Notify/notify_serv_export.h"
+
+#if !defined (ACE_LACKS_PRAGMA_ONCE)
+# pragma once
+#endif /* ACE_LACKS_PRAGMA_ONCE */
+
+#include "orbsvcs/Notify/Method_Request.h"
+
+TAO_BEGIN_VERSIONED_NAMESPACE_DECL
+
+class TAO_Notify_ThreadPool_Task;
+
+/**
+ * @class TAO_Notify_Method_Request_Shutdown
+ *
+ * @brief Shutdown message for the ThreadPool_Task
+ *
+ */
+class TAO_Notify_Serv_Export TAO_Notify_Method_Request_Shutdown : public TAO_Notify_Method_Request_Queueable
+{
+public:
+ /// Constuctor
+ TAO_Notify_Method_Request_Shutdown (TAO_Notify_ThreadPool_Task* task);
+
+ /// Destructor
+ virtual ~TAO_Notify_Method_Request_Shutdown ();
+
+ /// Create a copy of this object.
+ TAO_Notify_Method_Request_Queueable* copy (void);
+
+ /// Execute the Request
+ virtual int execute (ACE_ENV_SINGLE_ARG_DECL);
+
+private:
+ // Task to shutdown
+ TAO_Notify_ThreadPool_Task* task_;
+};
+
+TAO_END_VERSIONED_NAMESPACE_DECL
+
+#include /**/ "ace/post.h"
+#endif /* TAO_Notify_METHOD_REQUEST_SHUTDOWN_H */
diff --git a/TAO/orbsvcs/orbsvcs/Notify/Method_Request_Updates.cpp b/TAO/orbsvcs/orbsvcs/Notify/Method_Request_Updates.cpp
new file mode 100644
index 00000000000..18ac5fa1841
--- /dev/null
+++ b/TAO/orbsvcs/orbsvcs/Notify/Method_Request_Updates.cpp
@@ -0,0 +1,59 @@
+// $Id$
+
+#include "orbsvcs/Notify/Method_Request_Updates.h"
+
+ACE_RCSID(Notify, TAO_Notify_Method_Request_Updates, "$Id$")
+
+#include "tao/debug.h"
+#include "orbsvcs/Notify/Proxy.h"
+#include "orbsvcs/Notify/Peer.h"
+
+TAO_BEGIN_VERSIONED_NAMESPACE_DECL
+
+TAO_Notify_Method_Request_Updates::TAO_Notify_Method_Request_Updates (const TAO_Notify_EventTypeSeq& added, const TAO_Notify_EventTypeSeq& removed, TAO_Notify_Proxy* proxy)
+ : TAO_Notify_Method_Request_Updates_Base (added, removed, proxy)
+{
+}
+
+TAO_Notify_Method_Request_Updates::~TAO_Notify_Method_Request_Updates ()
+{
+}
+
+int
+TAO_Notify_Method_Request_Updates::execute (ACE_ENV_SINGLE_ARG_DECL)
+{
+ return this->execute_i (ACE_ENV_SINGLE_ARG_PARAMETER);
+}
+
+/*****************************************************************************/
+
+TAO_Notify_Method_Request_Updates_No_Copy::TAO_Notify_Method_Request_Updates_No_Copy (const TAO_Notify_EventTypeSeq& added
+ , const TAO_Notify_EventTypeSeq& removed, TAO_Notify_Proxy* proxy)
+ : TAO_Notify_Method_Request_Updates_No_Copy_Base (added, removed, proxy)
+{
+}
+
+TAO_Notify_Method_Request_Updates_No_Copy::~TAO_Notify_Method_Request_Updates_No_Copy ()
+{
+}
+
+TAO_Notify_Method_Request_Queueable*
+TAO_Notify_Method_Request_Updates_No_Copy::copy (ACE_ENV_SINGLE_ARG_DECL)
+{
+ TAO_Notify_Method_Request_Queueable* request = 0;
+
+ ACE_NEW_THROW_EX (request,
+ TAO_Notify_Method_Request_Updates (this->added_, this->removed_, this->proxy_),
+ CORBA::NO_MEMORY ());
+ ACE_CHECK_RETURN (request);
+
+ return request;
+}
+
+int
+TAO_Notify_Method_Request_Updates_No_Copy::execute (ACE_ENV_SINGLE_ARG_DECL)
+{
+ return this->execute_i (ACE_ENV_SINGLE_ARG_PARAMETER);
+}
+
+TAO_END_VERSIONED_NAMESPACE_DECL
diff --git a/TAO/orbsvcs/orbsvcs/Notify/Method_Request_Updates.h b/TAO/orbsvcs/orbsvcs/Notify/Method_Request_Updates.h
new file mode 100644
index 00000000000..b9410188772
--- /dev/null
+++ b/TAO/orbsvcs/orbsvcs/Notify/Method_Request_Updates.h
@@ -0,0 +1,90 @@
+// -*- C++ -*-
+
+/**
+ * @file Method_Request_Updates.h
+ *
+ * $Id$
+ *
+ * @author Pradeep Gore <pradeep@oomworks.com>
+ */
+
+#ifndef TAO_Notify_METHOD_REQUEST_UPDATES_H
+#define TAO_Notify_METHOD_REQUEST_UPDATES_H
+#include /**/ "ace/pre.h"
+
+#include "orbsvcs/Notify/notify_serv_export.h"
+
+#if !defined (ACE_LACKS_PRAGMA_ONCE)
+# pragma once
+#endif /* ACE_LACKS_PRAGMA_ONCE */
+
+#include "orbsvcs/Notify/Method_Request_Updates_T.h"
+#include "orbsvcs/Notify/Method_Request.h"
+#include "orbsvcs/Notify/EventTypeSeq.h"
+#include "orbsvcs/Notify/Proxy.h"
+
+TAO_BEGIN_VERSIONED_NAMESPACE_DECL
+
+typedef TAO_Notify_Method_Request_Updates_T<const TAO_Notify_EventTypeSeq
+ , TAO_Notify_Proxy::Ptr
+ , const TAO_Notify_EventTypeSeq&
+ , TAO_Notify_Proxy*
+ > TAO_Notify_Method_Request_Updates_Base;
+
+/**
+ * @class TAO_Notify_Method_Request_Updates
+ *
+ * @brief Command Object to send updates to proxys.
+ *
+ */
+class TAO_Notify_Serv_Export TAO_Notify_Method_Request_Updates
+ : public TAO_Notify_Method_Request_Updates_Base
+ , public TAO_Notify_Method_Request_Queueable
+{
+public:
+ /// Constuctor
+ TAO_Notify_Method_Request_Updates (const TAO_Notify_EventTypeSeq& added, const TAO_Notify_EventTypeSeq& removed, TAO_Notify_Proxy* proxy);
+
+ /// Destructor
+ virtual ~TAO_Notify_Method_Request_Updates ();
+
+ /// Execute the Request
+ virtual int execute (ACE_ENV_SINGLE_ARG_DECL);
+};
+
+/*****************************************************************************/
+
+typedef TAO_Notify_Method_Request_Updates_T<const TAO_Notify_EventTypeSeq&
+ , TAO_Notify_Proxy*
+ , const TAO_Notify_EventTypeSeq&
+ , TAO_Notify_Proxy*
+ > TAO_Notify_Method_Request_Updates_No_Copy_Base;
+
+/**
+ * @class TAO_Notify_Method_Request_Updates_No_Copy
+ *
+ * @brief Command Object to send updates to proxys.
+ *
+ */
+class TAO_Notify_Serv_Export TAO_Notify_Method_Request_Updates_No_Copy
+ : public TAO_Notify_Method_Request_Updates_No_Copy_Base
+ , public TAO_Notify_Method_Request
+{
+public:
+ /// Constuctor
+ TAO_Notify_Method_Request_Updates_No_Copy (const TAO_Notify_EventTypeSeq& added, const TAO_Notify_EventTypeSeq& removed, TAO_Notify_Proxy* proxy);
+
+ /// Destructor
+ virtual ~TAO_Notify_Method_Request_Updates_No_Copy ();
+
+ /// Create a copy of this object.
+ virtual TAO_Notify_Method_Request_Queueable* copy (ACE_ENV_SINGLE_ARG_DECL);
+
+ /// Execute the Request
+ virtual int execute (ACE_ENV_SINGLE_ARG_DECL);
+};
+
+TAO_END_VERSIONED_NAMESPACE_DECL
+
+#include /**/ "ace/post.h"
+#endif /* TAO_Notify_METHOD_REQUEST_UPDATES_H */
diff --git a/TAO/orbsvcs/orbsvcs/Notify/Method_Request_Updates_T.cpp b/TAO/orbsvcs/orbsvcs/Notify/Method_Request_Updates_T.cpp
new file mode 100644
index 00000000000..19db54e852f
--- /dev/null
+++ b/TAO/orbsvcs/orbsvcs/Notify/Method_Request_Updates_T.cpp
@@ -0,0 +1,28 @@
+// $Id$
+
+#ifndef TAO_Notify_Method_Request_Updates_T_CPP
+#define TAO_Notify_Method_Request_Updates_T_CPP
+
+#include "orbsvcs/Notify/Method_Request_Updates_T.h"
+
+#if ! defined (__ACE_INLINE__)
+#include "orbsvcs/Notify/Method_Request_Updates_T.inl"
+#endif /* __ACE_INLINE__ */
+
+TAO_BEGIN_VERSIONED_NAMESPACE_DECL
+
+template <class SEQ, class PROXY, class SEQ_PARAM, class PROXY_PARAM>
+TAO_Notify_Method_Request_Updates_T<SEQ, PROXY, SEQ_PARAM, PROXY_PARAM>::TAO_Notify_Method_Request_Updates_T (SEQ_PARAM added, SEQ_PARAM removed,
+ PROXY_PARAM proxy)
+ : added_ (added), removed_ (removed), proxy_ (proxy)
+{
+}
+
+template <class SEQ, class PROXY, class SEQ_PARAM, class PROXY_PARAM>
+TAO_Notify_Method_Request_Updates_T<SEQ, PROXY, SEQ_PARAM, PROXY_PARAM>::~TAO_Notify_Method_Request_Updates_T ()
+{
+}
+
+TAO_END_VERSIONED_NAMESPACE_DECL
+
+#endif /* TAO_Notify_Method_Request_Updates_T_CPP */
diff --git a/TAO/orbsvcs/orbsvcs/Notify/Method_Request_Updates_T.h b/TAO/orbsvcs/orbsvcs/Notify/Method_Request_Updates_T.h
new file mode 100644
index 00000000000..53b6c1d7b30
--- /dev/null
+++ b/TAO/orbsvcs/orbsvcs/Notify/Method_Request_Updates_T.h
@@ -0,0 +1,81 @@
+/* -*- C++ -*- */
+/**
+ * @file Method_Request_Updates_T.h
+ *
+ * $Id$
+ *
+ * @author Pradeep Gore <pradeep@oomworks.com>
+ *
+ *
+ */
+
+#ifndef TAO_Notify_METHOD_REQUEST_UPDATES_T_H
+#define TAO_Notify_METHOD_REQUEST_UPDATES_T_H
+
+#include /**/ "ace/pre.h"
+
+#include "orbsvcs/Notify/notify_serv_export.h"
+
+#if !defined (ACE_LACKS_PRAGMA_ONCE)
+# pragma once
+#endif /* ACE_LACKS_PRAGMA_ONCE */
+
+#include "tao/orbconf.h"
+#include "ace/CORBA_macros.h"
+
+TAO_BEGIN_VERSIONED_NAMESPACE_DECL
+
+namespace CORBA
+{
+ class Environment;
+}
+
+/**
+ * @class TAO_Notify_Method_Request_Updates_T
+ *
+ * @brief
+ *
+ */
+template <class SEQ, class PROXY, class SEQ_PARAM, class PROXY_PARAM>
+class TAO_Notify_Serv_Export TAO_Notify_Method_Request_Updates_T
+{
+public:
+ /// Constuctor
+ TAO_Notify_Method_Request_Updates_T (SEQ_PARAM added,
+ SEQ_PARAM removed,
+ PROXY_PARAM proxy);
+
+ /// Destructor
+ virtual ~TAO_Notify_Method_Request_Updates_T ();
+
+ /// Execute the Request
+ int execute_i (ACE_ENV_SINGLE_ARG_DECL);
+
+protected:
+ /// Update Added
+ SEQ added_;
+
+ /// Update Removed
+ SEQ removed_;
+
+ /// The Proxy that will receive the updates.
+ PROXY proxy_;
+};
+
+TAO_END_VERSIONED_NAMESPACE_DECL
+
+#if defined (__ACE_INLINE__)
+#include "orbsvcs/Notify/Method_Request_Updates_T.inl"
+#endif /* __ACE_INLINE__ */
+
+#if defined (ACE_TEMPLATES_REQUIRE_SOURCE)
+#include "orbsvcs/Notify/Method_Request_Updates_T.cpp"
+#endif /* ACE_TEMPLATES_REQUIRE_SOURCE */
+
+#if defined (ACE_TEMPLATES_REQUIRE_PRAGMA)
+#pragma implementation ("Method_Request_Updates_T.cpp")
+#endif /* ACE_TEMPLATES_REQUIRE_PRAGMA */
+
+#include /**/ "ace/post.h"
+
+#endif /* TAO_Notify_METHOD_REQUEST_UPDATES_T_H */
diff --git a/TAO/orbsvcs/orbsvcs/Notify/Method_Request_Updates_T.inl b/TAO/orbsvcs/orbsvcs/Notify/Method_Request_Updates_T.inl
new file mode 100644
index 00000000000..657b6dd0929
--- /dev/null
+++ b/TAO/orbsvcs/orbsvcs/Notify/Method_Request_Updates_T.inl
@@ -0,0 +1,36 @@
+// -*- C++ -*-
+//
+// $Id$
+
+#include "tao/debug.h"
+#include "orbsvcs/Notify/Peer.h"
+
+TAO_BEGIN_VERSIONED_NAMESPACE_DECL
+
+template <class SEQ, class PROXY, class SEQ_PARAM, class PROXY_PARAM> ACE_INLINE int
+TAO_Notify_Method_Request_Updates_T<SEQ, PROXY, SEQ_PARAM, PROXY_PARAM>::execute_i (ACE_ENV_SINGLE_ARG_DECL)
+{
+ if (this->proxy_->has_shutdown ())
+ return 0; // If we were shutdown while waiting in the queue, return with no action.
+
+ ACE_TRY
+ {
+ TAO_Notify_Peer* peer = this->proxy_->peer();
+
+ if (peer != 0)
+ {
+ peer->dispatch_updates (this->added_, this->removed_ ACE_ENV_ARG_PARAMETER);
+ ACE_TRY_CHECK;
+ }
+ }
+ ACE_CATCHANY
+ {
+ if (TAO_debug_level > 0)
+ ACE_PRINT_EXCEPTION (ACE_ANY_EXCEPTION, "TAO_Notify_Method_Request_Updates::execute error sending updates\n ");
+ }
+ ACE_ENDTRY;
+
+ return 0;
+}
+
+TAO_END_VERSIONED_NAMESPACE_DECL
diff --git a/TAO/orbsvcs/orbsvcs/Notify/Name_Value_Pair.cpp b/TAO/orbsvcs/orbsvcs/Notify/Name_Value_Pair.cpp
new file mode 100644
index 00000000000..7d1109eb65e
--- /dev/null
+++ b/TAO/orbsvcs/orbsvcs/Notify/Name_Value_Pair.cpp
@@ -0,0 +1,216 @@
+// $Id$
+
+#include "orbsvcs/Notify/Name_Value_Pair.h"
+#include "orbsvcs/Notify/Property_T.h"
+#include "ace/OS_String.h"
+#include "ace/OS_NS_stdio.h"
+
+namespace
+{
+ ACE_UINT64 string_to_uint64 (const char * s)
+ {
+ size_t const len = ACE_OS::strlen (s);
+ if (len == 0)
+ return 0;
+ if (! isdigit(s[0]))
+ return 0;
+
+ ACE_UINT64 t = 0;
+ for (size_t i = 0; i < len; ++i)
+ {
+ if (isdigit(s[i]) == 0)
+ {
+ break;
+ }
+ t *= 10;
+ t += (s[i] - '0');
+ }
+ return t;
+ }
+}
+
+TAO_BEGIN_VERSIONED_NAMESPACE_DECL
+
+namespace TAO_Notify
+{
+ NVP::NVP()
+ {
+ }
+
+ NVP::NVP(const TAO_Notify_Property_Short& p)
+ : name(p.name())
+ {
+ char buf[64];
+ ACE_OS::sprintf (buf, "%d", p.value ());
+ value = buf;
+ }
+
+ NVP::NVP(const TAO_Notify_Property_Long& p)
+ : name(p.name())
+ {
+ char buf[64];
+ long temp = static_cast<long> (p.value ());
+ ACE_OS::sprintf (buf, "%ld", temp);
+ value = buf;
+ }
+
+ NVP::NVP(const TAO_Notify_Property_Time& p)
+ : name(p.name())
+ {
+ ACE_TCHAR buf[128];
+ ACE_UINT64 us = p.value();
+#ifdef ACE_LACKS_LONGLONG_T
+ us.as_string(buf);
+#else
+ ACE_OS::sprintf(buf, ACE_UINT64_FORMAT_SPECIFIER, us);
+#endif /* ACE_LACKS_LONGLONG_T */
+ value = ACE_TEXT_ALWAYS_CHAR (buf);
+ }
+
+ NVP::NVP(const TAO_Notify_Property_Boolean& p)
+ : name(p.name())
+ {
+ value = p.value() ? "true" : "false";
+ }
+
+ NVP::NVP(const char * n, CORBA::Long v)
+ : name(n)
+ {
+ char buf[64];
+ long temp = v;
+ ACE_OS::sprintf (buf, "%ld", temp);
+ value = buf;
+ }
+
+ NVP::NVP(const char * n, const char * v)
+ : name(n), value(v)
+ {
+ }
+
+ NVP::NVP(const char * n, const ACE_CString & v)
+ : name(n), value(v)
+ {
+ }
+
+ bool NVP::operator==(const NVP& rhs) const
+ {
+ return (this->name == rhs.name) != 0;
+ }
+
+ bool NVP::operator!=(const NVP& rhs) const
+ {
+ return ! (rhs == *this);
+ }
+
+ bool NVPList::find (const char * name, ACE_CString& val) const
+ {
+ for (size_t i = 0; i < list_.size(); ++i)
+ {
+ if (list_[i].name == name)
+ {
+ val = list_[i].value;
+ return true;
+ }
+ }
+ return false;
+ }
+
+ bool NVPList::find (const char * name, const char *& val) const
+ {
+ for (size_t i = 0; i < list_.size(); ++i)
+ {
+ if (list_[i].name == name)
+ {
+ val = list_[i].value.c_str ();
+ return true;
+ }
+ }
+ return false;
+ }
+
+ void NVPList::load(TAO_Notify_Property_Short& p) const
+ {
+ const char * v;
+ if (find(p.name(), v))
+ {
+ p.assign (static_cast<CORBA::Short> (ACE_OS::atoi(v)));
+ }
+ }
+
+ void NVPList::load(TAO_Notify_Property_Long& p) const
+ {
+ const char * v;
+ if (find(p.name(), v))
+ {
+ p.assign (static_cast<CORBA::Long> (ACE_OS::atoi(v)));
+ }
+ }
+
+ void NVPList::load(TAO_Notify_Property_Time& p) const
+ {
+ const char * v;
+ if (find(p.name (), v))
+ {
+ p.assign (static_cast<TimeBase::TimeT> (string_to_uint64(v)));
+ }
+ }
+
+ void NVPList::load(TAO_Notify_Property_Boolean& p) const
+ {
+ ACE_CString v;
+ if (find(p.name (), v))
+ {
+ if (v == "true")
+ {
+ p = 1;
+ }
+ else
+ {
+ p = 0;
+ }
+ }
+ }
+
+ bool NVPList::load(const char * n, CORBA::Long& v) const
+ {
+ const char * val;
+ if (find(n, val))
+ {
+ v = static_cast<CORBA::Long> (ACE_OS::atoi(val));
+ return true;
+ }
+ return false;
+ }
+
+ bool NVPList::load(const char * n, ACE_CString& v) const
+ {
+ return find(n, v);
+ }
+
+ void NVPList::push_back(const NVP& v)
+ {
+ for (size_t i = 0; i < list_.size(); ++i)
+ {
+ if (list_[i].name == v.name)
+ {
+ list_[i].value = v.value;
+ return;
+ }
+ }
+ list_.push_back(v);
+ }
+
+ size_t NVPList::size() const
+ {
+ return list_.size();
+ }
+
+ const NVP& NVPList::operator[](size_t ndx) const
+ {
+ ACE_ASSERT (ndx < list_.size());
+ return list_[ndx];
+ }
+
+} // namespace TAO_Notify
+
+TAO_END_VERSIONED_NAMESPACE_DECL
diff --git a/TAO/orbsvcs/orbsvcs/Notify/Name_Value_Pair.h b/TAO/orbsvcs/orbsvcs/Notify/Name_Value_Pair.h
new file mode 100644
index 00000000000..6aa695f0e4a
--- /dev/null
+++ b/TAO/orbsvcs/orbsvcs/Notify/Name_Value_Pair.h
@@ -0,0 +1,102 @@
+// -*- C++ -*-
+
+//=============================================================================
+/**
+* @file Name_Value_Pair.h
+*
+* $Id$
+*
+* @author Jonathan Pollack <pollack_j@ociweb.com>
+*/
+//=============================================================================
+
+#ifndef NAME_VALUE_PAIR_H
+#define NAME_VALUE_PAIR_H
+#include /**/ "ace/pre.h"
+
+#include "orbsvcs/Notify/Property.h"
+#include "orbsvcs/Notify/Property_Boolean.h"
+#include "orbsvcs/Notify/notify_serv_export.h"
+
+#include "ace/SString.h"
+#include "ace/Vector_T.h"
+
+#if !defined (ACE_LACKS_PRAGMA_ONCE)
+#pragma once
+#endif /* ACE_LACKS_PRAGMA_ONCE */
+
+TAO_BEGIN_VERSIONED_NAMESPACE_DECL
+
+namespace TAO_Notify
+{
+ /**
+ * \brief Name/Value Pair
+ *
+ * Associates a name (character string) with a value (encoded into a character string)
+ * For use in managing properties.
+ */
+ class TAO_Notify_Serv_Export NVP {
+ public:
+ /// Construct an undefined name/value (to allow use in collections)
+ NVP();
+ /// Construct from a property containing a short value.
+ explicit NVP(const TAO_Notify_Property_Short& p);
+ /// Construct from a property containing a long value.
+ explicit NVP(const TAO_Notify_Property_Long& p);
+ /// Construct from a property containing a time value
+ explicit NVP(const TAO_Notify_Property_Time& p);
+ /// Construct from a property containing a boolean value
+ explicit NVP(const TAO_Notify_Property_Boolean& p);
+
+ /// Construct from name and long value.
+ NVP(const char * n, CORBA::Long v);
+ /// Construct from name and string value.
+ NVP(const char * n, const char * v);
+ /// Construct from name and string value.
+ NVP(const char * n, const ACE_CString & v);
+
+ /// Assignment operator
+ bool operator==(const NVP& rhs) const;
+ /// Comparison operator compares only name (not value)
+ bool operator!=(const NVP& rhs) const;
+ ACE_CString name;
+ ACE_CString value;
+ };
+
+ /**
+ * \brief Collection of Name/Value Pairs
+ */
+ class TAO_Notify_Serv_Export NVPList {
+ public:
+ /// Find the NVP with the same name as the property, copy the value.
+ void load(TAO_Notify_Property_Short& p) const;
+ /// Find the NVP with the same name as the property, copy the value.
+ void load(TAO_Notify_Property_Long& p) const;
+ /// Find the NVP with the same name as the property, copy the value.
+ void load(TAO_Notify_Property_Time& p) const;
+ /// Find the NVP with the same name as the property, copy the value.
+ void load(TAO_Notify_Property_Boolean& p) const;
+ /// Find the NVP with specified name, copy the value to a string.
+ bool load(const char * n, CORBA::Long& v) const;
+ /// Find the NVP with specified name, copy the value to a long.
+ bool load(const char * n, ACE_CString& v) const;
+ /// add a new name/value pair.
+ void push_back(const NVP& v);
+ /// size of the collection.
+ size_t size() const;
+ /// access NVP via numeric index.
+ const NVP& operator[](size_t ndx) const;
+ /// low level access: find
+ bool find (const char * name, ACE_CString& val) const;
+ /// low level access: use this when you don't need a CString
+ bool find (const char * name, const char *& val) const;
+
+ private:
+ ACE_Vector<NVP> list_;
+ };
+} // namespace TAO_Notify
+
+TAO_END_VERSIONED_NAMESPACE_DECL
+
+#include /**/ "ace/post.h"
+#endif /* NAME_VALUE_PAIR_H */
diff --git a/TAO/orbsvcs/orbsvcs/Notify/Notify_Constraint_Interpreter.cpp b/TAO/orbsvcs/orbsvcs/Notify/Notify_Constraint_Interpreter.cpp
new file mode 100644
index 00000000000..5d6f3e11e21
--- /dev/null
+++ b/TAO/orbsvcs/orbsvcs/Notify/Notify_Constraint_Interpreter.cpp
@@ -0,0 +1,49 @@
+// $Id$
+
+#include "orbsvcs/Notify/Notify_Constraint_Interpreter.h"
+#include "orbsvcs/Notify/Notify_Constraint_Visitors.h"
+
+ACE_RCSID(Notify, NS_Constraint_Interpreter, "$Id$")
+
+
+TAO_BEGIN_VERSIONED_NAMESPACE_DECL
+
+TAO_Notify_Constraint_Interpreter::TAO_Notify_Constraint_Interpreter (void)
+{
+}
+
+TAO_Notify_Constraint_Interpreter::~TAO_Notify_Constraint_Interpreter (void)
+{
+}
+
+void
+TAO_Notify_Constraint_Interpreter::build_tree (
+ const char *constraints
+ ACE_ENV_ARG_DECL
+ )
+ ACE_THROW_SPEC ((CosNotifyFilter::InvalidConstraint,
+ CORBA::NO_MEMORY))
+{
+ if (TAO_ETCL_Interpreter::is_empty_string (constraints))
+ {
+ // Root is deleted in the TAO_Interpreter's destructor.
+ ACE_NEW_THROW_EX (this->root_,
+ TAO_ETCL_Literal_Constraint ((CORBA::Boolean) 1),
+ CORBA::NO_MEMORY ());
+ ACE_CHECK;
+ }
+ else
+ {
+ // root_ is set in this base class call.
+ if (TAO_ETCL_Interpreter::build_tree (constraints) != 0)
+ ACE_THROW (CosNotifyFilter::InvalidConstraint ());
+ }
+}
+
+CORBA::Boolean
+TAO_Notify_Constraint_Interpreter::evaluate (TAO_Notify_Constraint_Visitor &evaluator)
+{
+ return evaluator.evaluate_constraint (this->root_);
+}
+
+TAO_END_VERSIONED_NAMESPACE_DECL
diff --git a/TAO/orbsvcs/orbsvcs/Notify/Notify_Constraint_Interpreter.h b/TAO/orbsvcs/orbsvcs/Notify/Notify_Constraint_Interpreter.h
new file mode 100644
index 00000000000..acb7c8b9d86
--- /dev/null
+++ b/TAO/orbsvcs/orbsvcs/Notify/Notify_Constraint_Interpreter.h
@@ -0,0 +1,65 @@
+// -*- C++ -*-
+
+//=============================================================================
+/**
+ * @file Notify_Constraint_Interpreter.h
+ *
+ * $Id$
+ *
+ * @author Pradeep Gore <pradeep@cs.wustl.edu>
+ */
+//=============================================================================
+
+
+#ifndef TAO_NOTIFY_CONSTRAINT_INTERPRETER_H
+#define TAO_NOTIFY_CONSTRAINT_INTERPRETER_H
+
+#include /**/ "ace/pre.h"
+#include "orbsvcs/ETCL/ETCL_Interpreter.h"
+
+#if !defined (ACE_LACKS_PRAGMA_ONCE)
+# pragma once
+#endif /* ACE_LACKS_PRAGMA_ONCE */
+
+#include "orbsvcs/ETCL/ETCL_Constraint.h"
+#include "orbsvcs/CosNotifyFilterC.h"
+#include "orbsvcs/Notify/notify_serv_export.h"
+
+TAO_BEGIN_VERSIONED_NAMESPACE_DECL
+
+class TAO_Notify_Constraint_Visitor;
+
+/**
+ * @class TAO_Notify_Constraint_Interpreter
+ *
+ * @brief "ETCL" Interpreter for the Notify queries.
+ */
+class TAO_Notify_Serv_Export TAO_Notify_Constraint_Interpreter : public TAO_ETCL_Interpreter
+{
+public:
+ // = Initialization and termination methods.
+ TAO_Notify_Constraint_Interpreter (void);
+
+ /// Destructor
+ virtual ~TAO_Notify_Constraint_Interpreter (void);
+
+ /**
+ * This method builds an expression tree representing the
+ * constraint specified in <constraints>, and throws an Illegal
+ * Constraint exception if the constraint given has syntax errors or
+ * semantic errors, such as mismatched types.
+ */
+ void build_tree (const char* constraints
+ ACE_ENV_ARG_DECL)
+ ACE_THROW_SPEC ((CosNotifyFilter::InvalidConstraint,
+ CORBA::NO_MEMORY));
+
+ /// Returns true if the constraint is evaluated successfully by
+ /// the evaluator.
+ CORBA::Boolean evaluate (TAO_Notify_Constraint_Visitor &evaluator);
+};
+
+TAO_END_VERSIONED_NAMESPACE_DECL
+
+#include /**/ "ace/post.h"
+#endif /* TAO_NOTIFY_CONSTRAINT_INTERPRETER_H */
diff --git a/TAO/orbsvcs/orbsvcs/Notify/Notify_Constraint_Visitors.cpp b/TAO/orbsvcs/orbsvcs/Notify/Notify_Constraint_Visitors.cpp
new file mode 100644
index 00000000000..f342c7e93f5
--- /dev/null
+++ b/TAO/orbsvcs/orbsvcs/Notify/Notify_Constraint_Visitors.cpp
@@ -0,0 +1,1465 @@
+// $Id$
+
+#include "orbsvcs/Notify/Notify_Constraint_Visitors.h"
+#include "orbsvcs/ETCL/ETCL_Constraint.h"
+#include "orbsvcs/ETCL/ETCL_y.h"
+#include "tao/AnyTypeCode/Any_Unknown_IDL_Type.h"
+#include "tao/DynamicAny/DynArray_i.h"
+#include "tao/DynamicAny/DynSequence_i.h"
+#include "tao/DynamicAny/DynStruct_i.h"
+#include "tao/DynamicAny/DynUnion_i.h"
+#include "tao/DynamicAny/DynEnum_i.h"
+#include "tao/DynamicAny/DynAnyFactory.h"
+#include "tao/CDR.h"
+
+TAO_BEGIN_VERSIONED_NAMESPACE_DECL
+
+TAO_Notify_Constraint_Visitor::TAO_Notify_Constraint_Visitor (void)
+ : implicit_id_ (TAO_Notify_Constraint_Visitor::EMPTY),
+ implicit_ids_(implicit_ids_size_),
+ filterable_data_(filterable_data_size_),
+ variable_header_(variable_header_size_)
+{
+ (void) this->implicit_ids_.bind (ACE_CString ("filterable_data",
+ 0,
+ 0),
+ FILTERABLE_DATA);
+ (void) this->implicit_ids_.bind (ACE_CString ("header",
+ 0,
+ 0),
+ HEADER);
+ (void) this->implicit_ids_.bind (ACE_CString ("remainder_of_body",
+ 0,
+ 0),
+ REMAINDER_OF_BODY);
+ (void) this->implicit_ids_.bind (ACE_CString ("fixed_header",
+ 0,
+ 0),
+ FIXED_HEADER);
+ (void) this->implicit_ids_.bind (ACE_CString ("variable_header",
+ 0,
+ 0),
+ VARIABLE_HEADER);
+ (void) this->implicit_ids_.bind (ACE_CString ("event_name",
+ 0,
+ 0),
+ EVENT_NAME);
+ (void) this->implicit_ids_.bind (ACE_CString ("event_type",
+ 0,
+ 0),
+ EVENT_TYPE);
+ (void) this->implicit_ids_.bind (ACE_CString ("domain_name",
+ 0,
+ 0),
+ DOMAIN_NAME);
+ (void) this->implicit_ids_.bind (ACE_CString ("type_name",
+ 0,
+ 0),
+ TYPE_NAME);
+}
+
+int
+TAO_Notify_Constraint_Visitor::bind_structured_event (const CosNotification::StructuredEvent &s_event)
+{
+ // The two sequences contained in a structured event are
+ // copied into hash tables so iteration is done only once.
+
+ CORBA::ULong length = s_event.filterable_data.length ();
+ CORBA::ULong index = 0;
+
+ for (index = 0; index < length; ++index)
+ {
+ ACE_CString name_str (s_event.filterable_data[index].name, 0, 0);
+
+ int status =
+ this->filterable_data_.bind (
+ name_str,
+ s_event.filterable_data[index].value
+ );
+
+ if (status != 0)
+ return -1;
+ }
+
+ length = s_event.header.variable_header.length ();
+
+ for (index = 0; index < length; ++index)
+ {
+ ACE_CString name_str (s_event.header.variable_header[index].name, 0, 0);
+
+ int status =
+ this->variable_header_.bind (
+ name_str,
+ s_event.header.variable_header[index].value
+ );
+
+ if (status != 0)
+ return -1;
+ }
+
+ this->domain_name_ =
+ CORBA::string_dup (s_event.header.fixed_header.event_type.domain_name);
+
+ this->type_name_ =
+ CORBA::string_dup (s_event.header.fixed_header.event_type.type_name);
+
+ this->event_name_ =
+ CORBA::string_dup (s_event.header.fixed_header.event_name);
+
+ this->remainder_of_body_ = s_event.remainder_of_body;
+
+ return 0;
+}
+
+CORBA::Boolean
+TAO_Notify_Constraint_Visitor::evaluate_constraint (
+ TAO_ETCL_Constraint* root
+ )
+{
+ CORBA::Boolean result = 0;
+ this->queue_.reset ();
+
+ // Evaluate the constraint in root_;
+ if (root != 0)
+ {
+ if ((root->accept (this) == 0) &&
+ (! this->queue_.is_empty ()))
+ {
+ TAO_ETCL_Literal_Constraint top;
+ this->queue_.dequeue_head (top);
+ result = (CORBA::Boolean) top;
+ }
+ }
+
+ // If a property couldn't be evaluated we must return 0.
+ return result;
+}
+
+int
+TAO_Notify_Constraint_Visitor::visit_literal (
+ TAO_ETCL_Literal_Constraint *literal
+ )
+{
+ this->queue_.enqueue_head (*literal);
+ return 0;
+}
+
+int
+TAO_Notify_Constraint_Visitor::visit_identifier (TAO_ETCL_Identifier *ident)
+{
+ int return_value = -1;
+ const char *name = ident->value ();
+ ACE_CString key (name, 0, 0);
+
+ CORBA::Any any;
+
+ if (this->filterable_data_.find (key, any) == 0)
+ {
+ if (any.impl() != 0)
+ {
+ this->queue_.enqueue_head (TAO_ETCL_Literal_Constraint (&any));
+ return_value = 0;
+ }
+ }
+
+ return return_value;
+}
+
+int
+TAO_Notify_Constraint_Visitor::visit_union_value (
+ TAO_ETCL_Union_Value *union_value
+ )
+{
+ switch (union_value->sign ())
+ {
+ case 0:
+ this->queue_.enqueue_head (*union_value->string ());
+ break;
+ case -1:
+ this->queue_.enqueue_head (-(*union_value->integer ()));
+ break;
+ case 1:
+ this->queue_.enqueue_head (*union_value->integer ());
+ break;
+ default:
+ return -1;
+ }
+
+ return 0;
+}
+
+int
+TAO_Notify_Constraint_Visitor::visit_union_pos (
+ TAO_ETCL_Union_Pos *union_pos
+ )
+{
+ ACE_DECLARE_NEW_CORBA_ENV;
+ ACE_TRY
+ {
+ if (union_pos->union_value ()->accept (this) == 0)
+ {
+ TAO_ETCL_Literal_Constraint disc_val;
+ this->queue_.dequeue_head (disc_val);
+
+ TAO_DynUnion_i dyn_union;
+ dyn_union.init (this->current_value_.in ()
+ ACE_ENV_ARG_PARAMETER);
+ ACE_TRY_CHECK;
+
+ CORBA::TypeCode_var tc = this->current_value_->type ();
+
+ switch (disc_val.expr_type ())
+ {
+ case TAO_ETCL_INTEGER:
+ case TAO_ETCL_SIGNED:
+ case TAO_ETCL_UNSIGNED:
+ {
+ CORBA::Any disc_any;
+ CORBA::TypeCode_var disc_tc =
+ tc->discriminator_type (ACE_ENV_SINGLE_ARG_PARAMETER);
+ ACE_TRY_CHECK;
+ CORBA::TCKind disc_kind =
+ TAO_DynAnyFactory::unalias (disc_tc.in ()
+ ACE_ENV_ARG_PARAMETER);
+ ACE_TRY_CHECK;
+
+ switch (disc_kind)
+ {
+ case CORBA::tk_boolean:
+ disc_any <<= CORBA::Any::from_boolean ((CORBA::Boolean) disc_val);
+ break;
+ case CORBA::tk_short:
+ disc_any <<= (CORBA::Short) ((CORBA::Long) disc_val);
+ break;
+ case CORBA::tk_ushort:
+ disc_any <<= (CORBA::UShort) ((CORBA::ULong) disc_val);
+ break;
+ case CORBA::tk_long:
+ disc_any <<= (CORBA::Long) disc_val;
+ break;
+ case CORBA::tk_ulong:
+ disc_any <<= (CORBA::ULong) disc_val;
+ break;
+ case CORBA::tk_enum:
+ {
+ TAO_OutputCDR cdr;
+ cdr.write_ulong ((CORBA::ULong) disc_val);
+ TAO_InputCDR in_cdr (cdr);
+ TAO::Unknown_IDL_Type *unk = 0;
+ ACE_NEW_RETURN (unk,
+ TAO::Unknown_IDL_Type (disc_tc.in (),
+ in_cdr),
+ -1);
+
+ disc_any.replace (unk);
+ break;
+ }
+ // @@@ (JP) I don't think ETCL handles 64-bit
+ // integers at this point, and I also think that
+ // chars and/or wchars will just come out in the
+ // constraint as (w)strings of length 1.
+ case CORBA::tk_longlong:
+ case CORBA::tk_ulonglong:
+ case CORBA::tk_char:
+ case CORBA::tk_wchar:
+ default:
+ return -1;
+ }
+
+ DynamicAny::DynAny_var dyn_any =
+ TAO_DynAnyFactory::make_dyn_any (disc_any
+ ACE_ENV_ARG_PARAMETER);
+ ACE_TRY_CHECK;
+ dyn_union.set_discriminator (dyn_any.in ()
+ ACE_ENV_ARG_PARAMETER);
+ ACE_TRY_CHECK;
+ DynamicAny::DynAny_var u_member =
+ dyn_union.member (ACE_ENV_SINGLE_ARG_PARAMETER);
+ ACE_TRY_CHECK;
+ this->current_value_ =
+ u_member->to_any (ACE_ENV_SINGLE_ARG_PARAMETER);
+ ACE_TRY_CHECK;
+
+ break;
+ }
+ case TAO_ETCL_STRING:
+ {
+ const char *name = (const char *) disc_val;
+ CORBA::ULong count =
+ tc->member_count (ACE_ENV_SINGLE_ARG_PARAMETER);
+ ACE_TRY_CHECK;
+
+ const char *member_name = 0;
+ CORBA::ULong i = 0;
+
+ for (i = 0; i < count; ++i)
+ {
+ member_name = tc->member_name (i
+ ACE_ENV_ARG_PARAMETER);
+ ACE_TRY_CHECK;
+
+ if (ACE_OS::strcmp (name, member_name) == 0)
+ break;
+ }
+
+ // If there's no match, member_label will throw
+ // CORBA::TypeCode::Bounds and the catch block will
+ // return -1;
+ this->current_value_ = tc->member_label (i
+ ACE_ENV_ARG_PARAMETER);
+ ACE_TRY_CHECK;
+
+ break;
+ }
+ // The TAO_ETCL_Union_Value that was put on the queue
+ // shouldn't have any other type.
+ default:
+ return -1;
+ }
+
+ TAO_ETCL_Constraint *nested = union_pos->component ();
+
+ // If there's no nested component, then we just want the
+ // union member value on the queue. Otherwise, we want
+ // the member value in current_value_ while we visit
+ // the nested component.
+ if (nested == 0)
+ {
+ TAO_ETCL_Literal_Constraint lit (this->current_value_.ptr ());
+ this->queue_.enqueue_head (lit);
+ return 0;
+ }
+ else
+ return nested->accept (this);
+ }
+ else
+ return -1;
+ }
+ ACE_CATCHANY
+ {
+ return -1;
+ }
+ ACE_ENDTRY;
+}
+
+int
+TAO_Notify_Constraint_Visitor::visit_component_pos (
+ TAO_ETCL_Component_Pos *pos
+ )
+{
+ ACE_DECLARE_NEW_CORBA_ENV;
+ ACE_TRY
+ {
+ // If we are here (from visit_component) the Any containing the
+ // component as found in filterable_data_ will be in current_value_.
+ CORBA::TypeCode_var tc = this->current_value_->type ();
+ CORBA::TCKind kind = TAO_DynAnyFactory::unalias (tc.in ()
+ ACE_ENV_ARG_PARAMETER);
+ ACE_TRY_CHECK;
+
+ DynamicAny::DynAny_var member;
+ CORBA::Boolean success = 0;
+ CORBA::ULong slot = (CORBA::ULong) *pos->integer ();
+
+ switch (kind)
+ {
+ case CORBA::tk_enum:
+ {
+ TAO_DynEnum_i dyn_enum;
+ dyn_enum.init (this->current_value_.in ()
+ ACE_ENV_ARG_PARAMETER);
+ ACE_TRY_CHECK;
+
+ success = dyn_enum.seek (slot
+ ACE_ENV_ARG_PARAMETER);
+ ACE_TRY_CHECK;
+
+ if (success == 0)
+ return -1;
+
+ member =
+ dyn_enum.current_component (ACE_ENV_SINGLE_ARG_PARAMETER);
+ ACE_TRY_CHECK;
+
+ break;
+ }
+ case CORBA::tk_struct:
+ {
+ TAO_DynStruct_i dyn_struct;
+ dyn_struct.init (this->current_value_.in ()
+ ACE_ENV_ARG_PARAMETER);
+ ACE_TRY_CHECK;
+
+ success = dyn_struct.seek (slot
+ ACE_ENV_ARG_PARAMETER);
+ ACE_TRY_CHECK;
+
+ if (success == 0)
+ return -1;
+
+ member = dyn_struct.current_component (ACE_ENV_SINGLE_ARG_PARAMETER);
+ ACE_TRY_CHECK;
+
+ break;
+ }
+ // @@@ (JP) I think enums and structs are the only two cases
+ // handled by Component_Pos, since arrays and sequences are
+ // handled by Component_Array, and unions are handled by
+ // Union_Pos.
+ default:
+ return -1;
+ }
+
+ CORBA::Any_var value = member->to_any (ACE_ENV_SINGLE_ARG_PARAMETER);
+ ACE_TRY_CHECK;
+
+ TAO_ETCL_Constraint *comp = pos->component ();
+
+ if (comp == 0)
+ {
+ TAO_ETCL_Literal_Constraint result (value.ptr ());
+ this->queue_.enqueue_head (result);
+ return 0;
+ }
+ else
+ {
+ this->current_value_ = value._retn ();
+ return comp->accept (this);
+ }
+ }
+ ACE_CATCHANY
+ {
+ return -1;
+ }
+ ACE_ENDTRY;
+}
+
+int
+TAO_Notify_Constraint_Visitor::visit_component_assoc (
+ TAO_ETCL_Component_Assoc *assoc
+ )
+{
+ CORBA::Any any;
+ ACE_CString name (assoc->identifier ()->value (),
+ 0,
+ 0);
+
+ switch (this->implicit_id_)
+ {
+ case FILTERABLE_DATA:
+ if (this->filterable_data_.find (name, any) != 0
+ || any.impl() == 0)
+ return -1;
+ break;
+ case VARIABLE_HEADER:
+ if (this->variable_header_.find (name, any) != 0
+ || any.impl() == 0)
+ return -1;
+ break;
+ // Only the sequence members of CosNotification::StructuredEvent
+ // can be treated as associative arrays.
+ default:
+ return -1;
+ }
+
+ TAO_ETCL_Constraint *comp = assoc->component ();
+ CORBA::Any *any_ptr = 0;
+
+ if (comp == 0)
+ {
+ TAO_ETCL_Literal_Constraint result (&any);
+ this->queue_.enqueue_head (result);
+
+ // If we're at the end of the line, put the name into
+ // current_value_ so visit_exist can use it.
+ ACE_NEW_RETURN (any_ptr,
+ CORBA::Any,
+ -1);
+ (*any_ptr) <<= name.c_str ();
+ this->current_value_ = any_ptr;
+
+ return 0;
+ }
+ else
+ {
+ ACE_NEW_RETURN (any_ptr,
+ CORBA::Any (any),
+ -1);
+ this->current_value_ = any_ptr;
+ return comp->accept (this);
+ }
+}
+
+int
+TAO_Notify_Constraint_Visitor::visit_component_array (TAO_ETCL_Component_Array *array)
+{
+ ACE_DECLARE_NEW_CORBA_ENV;
+ ACE_TRY
+ {
+ // If we are here (from visit_component) the Any containing the
+ // component as found in filterable_data_ will be in
+ // current_value_.
+ CORBA::TypeCode_var tc = this->current_value_->type ();
+ CORBA::TCKind kind = TAO_DynAnyFactory::unalias (tc.in ()
+ ACE_ENV_ARG_PARAMETER);
+ ACE_TRY_CHECK;
+
+ DynamicAny::DynAny_var member;
+ CORBA::Boolean success = 0;
+ CORBA::ULong slot = (CORBA::ULong) *array->integer ();
+
+ switch (kind)
+ {
+ case CORBA::tk_array:
+ {
+ TAO_DynEnum_i dyn_array;
+ dyn_array.init (this->current_value_.in ()
+ ACE_ENV_ARG_PARAMETER);
+ ACE_TRY_CHECK;
+
+ success = dyn_array.seek (slot
+ ACE_ENV_ARG_PARAMETER);
+ ACE_TRY_CHECK;
+
+ if (success == 0)
+ return -1;
+
+ member = dyn_array.current_component (ACE_ENV_SINGLE_ARG_PARAMETER);
+ ACE_TRY_CHECK;
+
+ break;
+ }
+ case CORBA::tk_sequence:
+ {
+ TAO_DynStruct_i dyn_sequence;
+ dyn_sequence.init (this->current_value_.in ()
+ ACE_ENV_ARG_PARAMETER);
+ ACE_TRY_CHECK;
+
+ success = dyn_sequence.seek (slot
+ ACE_ENV_ARG_PARAMETER);
+ ACE_TRY_CHECK;
+
+ if (success == 0)
+ return -1;
+
+ member =
+ dyn_sequence.current_component (ACE_ENV_SINGLE_ARG_PARAMETER);
+ ACE_TRY_CHECK;
+
+ break;
+ }
+ // Enums and sequences are the only two cases handled
+ // by Component_Array.
+ default:
+ return -1;
+ }
+
+ CORBA::Any_var value = member->to_any (ACE_ENV_SINGLE_ARG_PARAMETER);
+ ACE_TRY_CHECK;
+
+ TAO_ETCL_Constraint *comp = array->component ();
+
+ if (comp == 0)
+ {
+ TAO_ETCL_Literal_Constraint result (value.ptr ());
+ this->queue_.enqueue_head (result);
+ return 0;
+ }
+ else
+ {
+ this->current_value_ = value._retn ();
+ return comp->accept (this);
+ }
+ }
+ ACE_CATCHANY
+ {
+ return -1;
+ }
+ ACE_ENDTRY;
+}
+
+int
+TAO_Notify_Constraint_Visitor::visit_special (TAO_ETCL_Special *special)
+{
+ ACE_DECLARE_NEW_CORBA_ENV;
+ ACE_TRY
+ {
+ CORBA::TypeCode_var tc = this->current_value_->type ();
+ tc = TAO_DynAnyFactory::strip_alias (tc.in () ACE_ENV_ARG_PARAMETER);
+ ACE_TRY_CHECK;
+
+ CORBA::TCKind kind = tc->kind (ACE_ENV_SINGLE_ARG_PARAMETER);
+ ACE_TRY_CHECK;
+
+ switch (special->type ())
+ {
+ case TAO_ETCL_LENGTH:
+ {
+ CORBA::ULong length;
+
+ switch (kind)
+ {
+ case CORBA::tk_sequence:
+ {
+ TAO_DynSequence_i dyn_seq;
+ dyn_seq.init (current_value_.in()
+ ACE_ENV_ARG_PARAMETER);
+ ACE_TRY_CHECK;
+
+ DynamicAny::AnySeq_var any_seq =
+ dyn_seq.get_elements (ACE_ENV_SINGLE_ARG_PARAMETER);
+ ACE_TRY_CHECK;
+
+ length = any_seq->length ();
+ }
+ break;
+ case CORBA::tk_array:
+ {
+ length = tc->length (ACE_ENV_SINGLE_ARG_PARAMETER);
+ ACE_TRY_CHECK;
+ }
+ break;
+ default:
+ return -1;
+ }
+
+ TAO_ETCL_Literal_Constraint lit (length);
+ this->queue_.enqueue_head (lit);
+ return 0;
+ }
+ case TAO_ETCL_DISCRIMINANT:
+ {
+ // If the TCKind is not a union, the call to init() will
+ // raise an exception, and the catch block will return -1;
+ TAO_DynUnion_i dyn_union;
+ dyn_union.init (this->current_value_.in ()
+ ACE_ENV_ARG_PARAMETER);
+ ACE_TRY_CHECK;
+
+ DynamicAny::DynAny_var disc =
+ dyn_union.get_discriminator (ACE_ENV_SINGLE_ARG_PARAMETER);
+ ACE_TRY_CHECK;
+
+ CORBA::Any_var disc_any = disc->to_any (ACE_ENV_SINGLE_ARG_PARAMETER);
+ ACE_TRY_CHECK;
+
+ TAO_ETCL_Literal_Constraint lit (disc_any.ptr ());
+ this->queue_.enqueue_head (lit);
+ return 0;
+ }
+ case TAO_ETCL_TYPE_ID:
+ {
+ const char *name = tc->name (ACE_ENV_SINGLE_ARG_PARAMETER);
+ ACE_TRY_CHECK;
+
+ TAO_ETCL_Literal_Constraint lit (name);
+ this->queue_.enqueue_head (lit);
+ return 0;
+ }
+ case TAO_ETCL_REPOS_ID:
+ {
+ const char *id = tc->id (ACE_ENV_SINGLE_ARG_PARAMETER);
+ ACE_TRY_CHECK;
+
+ TAO_ETCL_Literal_Constraint lit (id);
+ this->queue_.enqueue_head (lit);
+ return 0;
+ }
+ default:
+ return -1;
+ }
+ }
+ ACE_CATCHANY
+ {
+ return -1;
+ }
+ ACE_ENDTRY;
+}
+
+int
+TAO_Notify_Constraint_Visitor::visit_component (
+ TAO_ETCL_Component *component
+ )
+{
+ TAO_ETCL_Constraint *nested = component->component ();
+ TAO_ETCL_Identifier *identifier = component->identifier ();
+ ACE_CString component_name (identifier->value (),
+ 0,
+ 0);
+ CORBA::Any *any_ptr = 0;
+
+ if (this->implicit_ids_.find (component_name, this->implicit_id_) != 0)
+ this->implicit_id_ = TAO_Notify_Constraint_Visitor::EMPTY;
+
+ // If this component has no sub-component, only an identifier, then
+ // we just visit the identifier, which puts a literal on the queue
+ // to be handled upon returning from this method call. If there is
+ // a sub-component, we store the literal's value in our member _var
+ // for possible examination at a more nested level, and visit the
+ // sub-component. If the identifier matches one of the nested field
+ // names in CosNotification::StructuredEvent, we just visit the
+ // nested component, if any.
+ if (this->implicit_id_ == TAO_Notify_Constraint_Visitor::EMPTY)
+ {
+ if (nested == 0)
+ {
+ // If this is the end of the line, we put the component name
+ // into current_value_ so visit_exist can use it.
+ ACE_NEW_RETURN (any_ptr,
+ CORBA::Any,
+ -1);
+ (*any_ptr) <<= component_name.c_str ();
+ this->current_value_ = any_ptr;
+ return identifier->accept (this);
+ }
+ else
+ {
+ int result = identifier->accept (this);
+
+ if (result != 0)
+ return result;
+
+ TAO_ETCL_Literal_Constraint id;
+ this->queue_.dequeue_head (id);
+ ACE_NEW_RETURN (any_ptr,
+ CORBA::Any (*(const CORBA::Any *) id),
+ -1);
+ this->current_value_ = any_ptr;
+ }
+ }
+
+ if (nested != 0)
+ return nested->accept (this);
+ else
+ {
+ switch (this->implicit_id_)
+ {
+ case TYPE_NAME:
+ {
+ TAO_ETCL_Literal_Constraint tn (this->type_name_.in ());
+ this->queue_.enqueue_head (tn);
+ return 0;
+ }
+ case EVENT_NAME:
+ {
+ TAO_ETCL_Literal_Constraint en (this->event_name_.in ());
+ this->queue_.enqueue_head (en);
+ return 0;
+ }
+ case DOMAIN_NAME:
+ {
+ TAO_ETCL_Literal_Constraint dn (this->domain_name_.in ());
+ this->queue_.enqueue_head (dn);
+ return 0;
+ }
+ case REMAINDER_OF_BODY:
+ {
+ TAO_ETCL_Literal_Constraint rob (&this->remainder_of_body_);
+ this->queue_.enqueue_head (rob);
+ return 0;
+ }
+ // The above cases are the leaves of the
+ // CosNotification::StructuredEvent "tree". Anything else and we
+ // should have a nested component. otherwise, it's an error.
+ default:
+ return -1;
+ }
+ }
+}
+
+int
+TAO_Notify_Constraint_Visitor::visit_dot (TAO_ETCL_Dot *dot)
+{
+ // If we are here, we know we're headed for a more nested
+ // level, so we just visit it, there's nothing else in this
+ // constraint.
+ return dot->component ()->accept (this);
+}
+
+int
+TAO_Notify_Constraint_Visitor::visit_eval (TAO_ETCL_Eval *eval)
+{
+ // Nothing to do but visit the contained component.
+ return eval->component ()->accept (this);
+}
+
+int
+TAO_Notify_Constraint_Visitor::visit_default (TAO_ETCL_Default *def)
+{
+ TAO_ETCL_Constraint *comp = def->component ();
+
+ if (comp == 0)
+ return -1;
+
+ if (comp->accept (this) != 0)
+ return -1;
+
+ ACE_DECLARE_NEW_CORBA_ENV;
+ ACE_TRY
+ {
+ CORBA::TypeCode_var tc = this->current_value_->type ();
+
+ // If the current member is not a union, this call will throw
+ // BadKind and the catch block will return -1.
+ CORBA::Long default_index = tc->default_index (ACE_ENV_SINGLE_ARG_PARAMETER);
+ ACE_TRY_CHECK;
+
+ // No default index.
+ if (default_index == -1)
+ {
+ TAO_ETCL_Literal_Constraint result ((CORBA::Boolean) 0);
+ this->queue_.enqueue_head (result);
+ return 0;
+ }
+
+ // Okay, there's a default index, but is it active?
+
+ TAO_ETCL_Literal_Constraint disc;
+ this->queue_.dequeue_head (disc);
+ TAO_ETCL_Literal_Constraint default_index_value (default_index);
+ return (disc == default_index_value);
+ }
+ ACE_CATCHANY
+ {
+ return -1;
+ }
+ ACE_ENDTRY;
+}
+
+int
+TAO_Notify_Constraint_Visitor::visit_exist (TAO_ETCL_Exist *exist)
+{
+ TAO_ETCL_Constraint *component = exist->component ();
+
+ if (component->accept (this) == 0)
+ {
+ const char *value = 0;
+ CORBA::Boolean result = 0;
+
+ // For the two cases below, we don't want the item at the top of
+ // the queue, because it's the result of a hash table
+ // lookup. For an existence test, we want the key value, which
+ // is stored in the current_value_ member.
+ if (this->implicit_id_ == FILTERABLE_DATA
+ || this->implicit_id_ == VARIABLE_HEADER)
+ {
+ TAO_ETCL_Literal_Constraint current (&this->current_value_.inout ());
+ value = CORBA::string_dup ((const char *) current);
+ }
+
+ switch (this->implicit_id_)
+ {
+ case FILTERABLE_DATA:
+ result =
+ (this->filterable_data_.find (ACE_CString (value, 0, 0)) == 0);
+ break;
+ case VARIABLE_HEADER:
+ result =
+ (this->variable_header_.find (ACE_CString (value, 0, 0)) == 0);
+ break;
+ case TYPE_NAME:
+ result = (this->type_name_.in () != 0);
+ break;
+ case EVENT_NAME:
+ result = (this->event_name_.in () != 0);
+ break;
+ case DOMAIN_NAME:
+ result = (this->domain_name_.in () != 0);
+ break;
+ // Anything other than the above cases is an error.
+ default:
+ return -1;
+ }
+
+ this->queue_.enqueue_head (TAO_ETCL_Literal_Constraint (result));
+
+ return 0;
+ }
+
+ return -1;
+}
+
+int
+TAO_Notify_Constraint_Visitor::visit_unary_expr (
+ TAO_ETCL_Unary_Expr *unary_expr
+ )
+{
+ TAO_ETCL_Constraint *subexpr = unary_expr->subexpr ();
+
+ if (subexpr->accept (this) == 0)
+ {
+ TAO_ETCL_Literal_Constraint subexpr_result;
+ CORBA::Boolean result = 0;
+ int op_type = unary_expr->type ();
+
+ switch (op_type)
+ {
+ case TAO_ETCL_NOT:
+ this->queue_.dequeue_head (subexpr_result);
+ result = ! (CORBA::Boolean) subexpr_result;
+ this->queue_.enqueue_head (TAO_ETCL_Literal_Constraint (result));
+ return 0;
+ case TAO_ETCL_MINUS:
+ // The leading '-' was parsed separately, so we have to pull
+ // the literal constraint off the queue, apply the class' own
+ // unary minus operator, and put it back.
+ this->queue_.dequeue_head (subexpr_result);
+ this->queue_.enqueue_head (-subexpr_result);
+ return 0;
+ case TAO_ETCL_PLUS:
+ // Leave the literal constraint on the queue. The leading
+ // '+' was just syntactic sugar - no action is necessary.
+ return 0;
+ default:
+ // The parser should never construct a TAO_ETCL_Unary_Constraint
+ // behind any operators except the above three.
+ return -1;
+ }
+ }
+
+ return -1;
+}
+
+int
+TAO_Notify_Constraint_Visitor::visit_binary_expr (
+ TAO_ETCL_Binary_Expr *binary_expr
+ )
+{
+ int bin_op_type = binary_expr->type ();
+
+ switch (bin_op_type)
+ {
+ case TAO_ETCL_OR:
+ return this->visit_or (binary_expr);
+ case TAO_ETCL_AND:
+ return this->visit_and (binary_expr);
+ case TAO_ETCL_LT:
+ case TAO_ETCL_LE:
+ case TAO_ETCL_GT:
+ case TAO_ETCL_GE:
+ case TAO_ETCL_EQ:
+ case TAO_ETCL_NE:
+ case TAO_ETCL_PLUS:
+ case TAO_ETCL_MINUS:
+ case TAO_ETCL_MULT:
+ case TAO_ETCL_DIV:
+ return this->visit_binary_op (binary_expr,
+ bin_op_type);
+ case TAO_ETCL_TWIDDLE:
+ return this->visit_twiddle (binary_expr);
+ case TAO_ETCL_IN:
+ return this->visit_in (binary_expr);
+ default:
+ return -1;
+ }
+}
+
+int
+TAO_Notify_Constraint_Visitor::visit_or (
+ TAO_ETCL_Binary_Expr *binary
+ )
+{
+ int return_value = -1;
+ CORBA::Boolean result = 0;
+ TAO_ETCL_Constraint *lhs = binary->lhs ();
+
+ if (lhs->accept (this) == 0)
+ {
+ TAO_ETCL_Literal_Constraint lhs_result;
+ this->queue_.dequeue_head (lhs_result);
+ result = (CORBA::Boolean) lhs_result;
+
+ // Short-circuiting OR.
+ if (result == 0)
+ {
+ TAO_ETCL_Constraint *rhs = binary->rhs ();
+
+ if (rhs->accept (this) == 0)
+ {
+ TAO_ETCL_Literal_Constraint rhs_result;
+ this->queue_.dequeue_head (rhs_result);
+ result = (CORBA::Boolean) rhs_result;
+ return_value = 0;
+ }
+ }
+ else
+ return_value = 0;
+ }
+
+ if (return_value == 0)
+ this->queue_.enqueue_head (TAO_ETCL_Literal_Constraint (result));
+
+ return return_value;
+}
+
+int
+TAO_Notify_Constraint_Visitor::visit_and (TAO_ETCL_Binary_Expr *binary)
+{
+ int return_value = -1;
+ CORBA::Boolean result = 0;
+ TAO_ETCL_Constraint *lhs = binary->lhs ();
+
+ if (lhs->accept (this) == 0)
+ {
+ TAO_ETCL_Literal_Constraint lhs_result;
+ this->queue_.dequeue_head (lhs_result);
+ result = (CORBA::Boolean) lhs_result;
+
+ // Short-circuiting AND.
+ if (result == 1)
+ {
+ TAO_ETCL_Constraint *rhs = binary->rhs ();
+
+ if (rhs->accept (this) == 0)
+ {
+ TAO_ETCL_Literal_Constraint rhs_result;
+ this->queue_.dequeue_head (rhs_result);
+ result = (CORBA::Boolean) rhs_result;
+ return_value = 0;
+ }
+ }
+ else
+ return_value = 0;
+ }
+
+ if (return_value == 0)
+ this->queue_.enqueue_head (TAO_ETCL_Literal_Constraint (result));
+
+ return return_value;
+}
+
+int
+TAO_Notify_Constraint_Visitor::visit_binary_op (TAO_ETCL_Binary_Expr *binary,
+ int op_type)
+{
+ int return_value = -1;
+ TAO_ETCL_Constraint *lhs = binary->lhs ();
+ CORBA::Boolean result = 0;
+
+ // Perform an operation on the results of evaluating the left and
+ // right branches of this subtree.
+ if (lhs->accept (this) == 0)
+ {
+ TAO_ETCL_Literal_Constraint left_operand;
+ this->queue_.dequeue_head (left_operand);
+ TAO_ETCL_Constraint *rhs = binary->rhs ();
+
+ if (rhs->accept (this) == 0)
+ {
+ TAO_ETCL_Literal_Constraint right_operand;
+ this->queue_.dequeue_head (right_operand);
+ return_value = 0;
+
+ switch (op_type)
+ {
+ case TAO_ETCL_LT:
+ result = left_operand < right_operand;
+ this->queue_.enqueue_head (TAO_ETCL_Literal_Constraint (result));
+ break;
+ case TAO_ETCL_LE:
+ result = left_operand <= right_operand;
+ this->queue_.enqueue_head (TAO_ETCL_Literal_Constraint (result));
+ break;
+ case TAO_ETCL_GT:
+ result = left_operand > right_operand;
+ this->queue_.enqueue_head (TAO_ETCL_Literal_Constraint (result));
+ break;
+ case TAO_ETCL_GE:
+ result = left_operand >= right_operand;
+ this->queue_.enqueue_head (TAO_ETCL_Literal_Constraint (result));
+ break;
+ case TAO_ETCL_EQ:
+ result = left_operand == right_operand;
+ this->queue_.enqueue_head (TAO_ETCL_Literal_Constraint (result));
+ break;
+ case TAO_ETCL_NE:
+ result = left_operand != right_operand;
+ this->queue_.enqueue_head (TAO_ETCL_Literal_Constraint (result));
+ break;
+ case TAO_ETCL_PLUS:
+ this->queue_.enqueue_head (left_operand + right_operand);
+ break;
+ case TAO_ETCL_MINUS:
+ this->queue_.enqueue_head (left_operand - right_operand);
+ break;
+ case TAO_ETCL_MULT:
+ this->queue_.enqueue_head (left_operand * right_operand);
+ break;
+ case TAO_ETCL_DIV:
+ this->queue_.enqueue_head (left_operand / right_operand);
+ break;
+ default:
+ return_value = -1;
+ }
+ }
+ }
+
+ return return_value;
+}
+
+int
+TAO_Notify_Constraint_Visitor::visit_twiddle (TAO_ETCL_Binary_Expr *binary)
+{
+ int return_value = -1;
+ TAO_ETCL_Constraint *lhs = binary->lhs ();
+
+ // Determine if the left operand is a substring of the right.
+ if (lhs->accept (this) == 0)
+ {
+ TAO_ETCL_Literal_Constraint left;
+ this->queue_.dequeue_head (left);
+ TAO_ETCL_Constraint *rhs = binary->rhs ();
+
+ if (rhs->accept (this) == 0)
+ {
+ TAO_ETCL_Literal_Constraint right;
+ this->queue_.dequeue_head (right);
+ CORBA::Boolean result =
+ (ACE_OS::strstr ((const char *) right,
+ (const char *) left) != 0);
+ this->queue_.enqueue_head (TAO_ETCL_Literal_Constraint (result));
+ return_value = 0;
+ }
+ }
+
+ return return_value;
+}
+
+int
+TAO_Notify_Constraint_Visitor::visit_in (TAO_ETCL_Binary_Expr *binary)
+{
+ int return_value = -1;
+ TAO_ETCL_Constraint *lhs = binary->lhs ();
+
+ // Determine if the left operand is contained in the right.
+ if (lhs->accept (this) == 0)
+ {
+ TAO_ETCL_Literal_Constraint left;
+ this->queue_.dequeue_head (left);
+
+ TAO_ETCL_Constraint *rhs = binary->rhs ();
+
+ if (rhs->accept (this) == 0)
+ {
+ TAO_ETCL_Literal_Constraint bag;
+ this->queue_.dequeue_head (bag);
+
+ if (bag.expr_type () == TAO_ETCL_COMPONENT)
+ {
+ const CORBA::Any *component = (const CORBA::Any *) bag;
+ CORBA::TCKind kind = CORBA::tk_null;
+
+ ACE_DECLARE_NEW_CORBA_ENV;
+ ACE_TRY
+ {
+ CORBA::TypeCode_var tc = component->type ();
+ kind = TAO_DynAnyFactory::unalias (tc.in ()
+ ACE_ENV_ARG_PARAMETER);
+ ACE_TRY_CHECK;
+ }
+ ACE_CATCHANY
+ {
+ return return_value;
+ }
+ ACE_ENDTRY;
+
+ CORBA::Boolean result = 0;
+
+ switch (kind)
+ {
+ case CORBA::tk_sequence:
+ result = this->sequence_does_contain (component,
+ left);
+ break;
+ case CORBA::tk_array:
+ result = this->array_does_contain (component,
+ left);
+ break;
+ case CORBA::tk_struct:
+ result = this->struct_does_contain (component,
+ left);
+ break;
+ case CORBA::tk_union:
+ result = this->union_does_contain (component,
+ left);
+ break;
+ case CORBA::tk_any:
+ result = this->any_does_contain (component,
+ left);
+ break;
+ default:
+ return return_value;
+ }
+
+ this->queue_.enqueue_head (TAO_ETCL_Literal_Constraint (result));
+ return_value = 0;
+ }
+ }
+ }
+
+ return return_value;
+}
+
+int
+TAO_Notify_Constraint_Visitor::visit_preference (TAO_ETCL_Preference *)
+{
+ // According to OMG 00-06-20 section 2.4.1, the Notification Service
+ // does not use the preference operators. The method must be here
+ // because it is called by the ETCL node, which may be used by other
+ // CORBA services that do use the preference operators.
+ return -1;
+}
+
+CORBA::Boolean
+TAO_Notify_Constraint_Visitor::sequence_does_contain (const CORBA::Any *any,
+ TAO_ETCL_Literal_Constraint &item)
+{
+ ACE_DECLARE_NEW_CORBA_ENV;
+ ACE_TRY
+ {
+ CORBA::TypeCode_var type = any->type ();
+ CORBA::TypeCode_var base_type =
+ TAO_DynAnyFactory::strip_alias (type.in () ACE_ENV_ARG_PARAMETER);
+ ACE_TRY_CHECK;
+ CORBA::TypeCode_var content_type =
+ base_type->content_type (ACE_ENV_SINGLE_ARG_PARAMETER);
+ ACE_TRY_CHECK;
+ CORBA::TCKind kind =
+ TAO_DynAnyFactory::unalias (content_type.in() ACE_ENV_ARG_PARAMETER);
+ ACE_TRY_CHECK;
+
+ // The literal and the array elements must be
+ // of the same simple type.
+ CORBA::Boolean match = this->simple_type_match (item.expr_type (),
+ kind);
+
+ if (match == 0)
+ return 0;
+
+ TAO_DynSequence_i dyn_seq;
+ dyn_seq.init (*any
+ ACE_ENV_ARG_PARAMETER);
+ ACE_TRY_CHECK;
+
+ DynamicAny::AnySeq_var any_seq =
+ dyn_seq.get_elements (ACE_ENV_SINGLE_ARG_PARAMETER);
+ ACE_TRY_CHECK;
+
+ CORBA::ULong length = any_seq->length ();
+
+ for (CORBA::ULong i = 0; i < length; ++i)
+ {
+ TAO_ETCL_Literal_Constraint element (&any_seq[i]);
+
+ if (item == element)
+ return 1;
+ }
+ }
+ ACE_CATCHANY
+ {
+ return 0;
+ }
+ ACE_ENDTRY;
+
+ return 0;
+}
+
+CORBA::Boolean
+TAO_Notify_Constraint_Visitor::array_does_contain (const CORBA::Any *any,
+ TAO_ETCL_Literal_Constraint &item)
+{
+ ACE_DECLARE_NEW_CORBA_ENV;
+ ACE_TRY
+ {
+ CORBA::TypeCode_var type = any->type ();
+ CORBA::TCKind kind = TAO_DynAnyFactory::unalias (type.in ()
+ ACE_ENV_ARG_PARAMETER);
+ ACE_TRY_CHECK;
+
+ // The literal and the array elements must be
+ // of the same simple type.
+ CORBA::Boolean match = this->simple_type_match (item.expr_type (),
+ kind);
+
+ if (match == 0)
+ return 0;
+
+ TAO_DynArray_i dyn_array;
+ dyn_array.init (*any
+ ACE_ENV_ARG_PARAMETER);
+ ACE_TRY_CHECK;
+
+ DynamicAny::AnySeq_var any_seq =
+ dyn_array.get_elements (ACE_ENV_SINGLE_ARG_PARAMETER);
+ ACE_TRY_CHECK;
+
+ CORBA::ULong length = any_seq->length ();
+
+ for (CORBA::ULong i = 0; i < length; ++i)
+ {
+ TAO_ETCL_Literal_Constraint element (&any_seq[i]);
+
+ if (item == element)
+ return 1;
+ }
+ }
+ ACE_CATCHANY
+ {
+ return 0;
+ }
+ ACE_ENDTRY;
+
+ return 0;
+}
+
+CORBA::Boolean
+TAO_Notify_Constraint_Visitor::struct_does_contain (const CORBA::Any *any,
+ TAO_ETCL_Literal_Constraint &item)
+{
+ ACE_DECLARE_NEW_CORBA_ENV;
+ ACE_TRY
+ {
+ TAO_DynStruct_i dyn_struct;
+ dyn_struct.init (*any
+ ACE_ENV_ARG_PARAMETER);
+ ACE_TRY_CHECK;
+
+ DynamicAny::NameValuePairSeq_var members =
+ dyn_struct.get_members (ACE_ENV_SINGLE_ARG_PARAMETER);
+ ACE_TRY_CHECK;
+
+ CORBA::ULong length = members->length ();
+ CORBA::TypeCode_var tc;
+ CORBA::TCKind kind;
+
+ for (CORBA::ULong i = 0; i < length; ++i)
+ {
+ tc = members[i].value.type ();
+ kind = TAO_DynAnyFactory::unalias (tc.in ()
+ ACE_ENV_ARG_PARAMETER);
+ ACE_TRY_CHECK;
+
+ // The literal and the struct member must be
+ // of the same simple type.
+ CORBA::Boolean match = this->simple_type_match (item.expr_type (),
+ kind);
+
+ if (match == 0)
+ continue;
+
+ TAO_ETCL_Literal_Constraint element (&members[i].value);
+
+ if (item == element)
+ return 1;
+ }
+ }
+ ACE_CATCHANY
+ {
+ return 0;
+ }
+ ACE_ENDTRY;
+
+ return 0;
+}
+
+CORBA::Boolean
+TAO_Notify_Constraint_Visitor::union_does_contain (const CORBA::Any *any,
+ TAO_ETCL_Literal_Constraint &item)
+{
+ ACE_DECLARE_NEW_CORBA_ENV;
+ ACE_TRY
+ {
+ TAO_DynUnion_i dyn_union;
+ dyn_union.init (*any
+ ACE_ENV_ARG_PARAMETER);
+ ACE_TRY_CHECK;
+
+ DynamicAny::DynAny_var cc =
+ dyn_union.current_component (ACE_ENV_SINGLE_ARG_PARAMETER);
+ ACE_TRY_CHECK;
+
+ CORBA::Any_var member = cc->to_any (ACE_ENV_SINGLE_ARG_PARAMETER);
+ ACE_TRY_CHECK;
+
+ CORBA::TypeCode_var tc = member->type ();
+ CORBA::TCKind kind = TAO_DynAnyFactory::unalias (tc.in ()
+ ACE_ENV_ARG_PARAMETER);
+ ACE_TRY_CHECK;
+
+ // The literal and the union member must be
+ // of the same simple type.
+ CORBA::Boolean match = this->simple_type_match (item.expr_type (),
+ kind);
+
+ if (match == 0)
+ return 0;
+
+ TAO_ETCL_Literal_Constraint element (&member.inout ());
+
+ return (item == element);
+ }
+ ACE_CATCHANY
+ {
+ return 0;
+ }
+ ACE_ENDTRY;
+}
+
+CORBA::Boolean
+TAO_Notify_Constraint_Visitor::any_does_contain (
+ const CORBA::Any *any,
+ TAO_ETCL_Literal_Constraint &item
+ )
+{
+ const CORBA::Any *result = 0;
+
+ *any >>= result;
+
+ TAO_ETCL_Literal_Constraint element (const_cast<CORBA::Any *>(result));
+ return item == element;
+}
+
+CORBA::Boolean
+TAO_Notify_Constraint_Visitor::simple_type_match (int expr_type,
+ CORBA::TCKind tc_kind)
+{
+ switch (expr_type)
+ {
+ case TAO_ETCL_STRING:
+ if (tc_kind != CORBA::tk_string)
+ return 0;
+ break;
+ case TAO_ETCL_DOUBLE:
+ if (tc_kind != CORBA::tk_double
+ && tc_kind != CORBA::tk_float)
+ return 0;
+ break;
+ case TAO_ETCL_INTEGER:
+ case TAO_ETCL_SIGNED:
+ if (tc_kind != CORBA::tk_short
+ && tc_kind != CORBA::tk_long
+ && tc_kind != CORBA::tk_longlong)
+ return 0;
+ break;
+ case TAO_ETCL_UNSIGNED:
+ if (tc_kind != CORBA::tk_ushort
+ && tc_kind != CORBA::tk_ulong
+ && tc_kind != CORBA::tk_ulonglong)
+ return 0;
+ break;
+ case TAO_ETCL_BOOLEAN:
+ if (tc_kind != CORBA::tk_boolean)
+ return 0;
+ break;
+ default:
+ return 0;
+ }
+ return 1;
+}
+
+const size_t TAO_Notify_Constraint_Visitor::implicit_ids_size_ = 27;
+const size_t TAO_Notify_Constraint_Visitor::filterable_data_size_ = 31;
+const size_t TAO_Notify_Constraint_Visitor::variable_header_size_ = 31;
+
+TAO_END_VERSIONED_NAMESPACE_DECL
diff --git a/TAO/orbsvcs/orbsvcs/Notify/Notify_Constraint_Visitors.h b/TAO/orbsvcs/orbsvcs/Notify/Notify_Constraint_Visitors.h
new file mode 100644
index 00000000000..2033737b4ec
--- /dev/null
+++ b/TAO/orbsvcs/orbsvcs/Notify/Notify_Constraint_Visitors.h
@@ -0,0 +1,168 @@
+// -*- C++ -*-
+
+//=============================================================================
+/**
+ * @file Notify_Constraint_Visitors.h
+ *
+ * $Id$
+ *
+ * @author Pradeep Gore <pradeep@cs.wustl.edu>
+ * @author Jeff Parsons <parsons@cs.wustl.edu>
+ */
+//=============================================================================
+
+
+#ifndef NOTIFY_CONSTRAINT_VISITORS_H
+#define NOTIFY_CONSTRAINT_VISITORS_H
+
+#include /**/ "ace/pre.h"
+#include "ace/Hash_Map_Manager.h"
+#include "ace/Unbounded_Queue.h"
+#include "ace/Null_Mutex.h"
+
+#if !defined (ACE_LACKS_PRAGMA_ONCE)
+# pragma once
+#endif /* ACE_LACKS_PRAGMA_ONCE */
+
+#include "orbsvcs/ETCL/ETCL_Constraint_Visitor.h"
+#include "orbsvcs/ETCL/ETCL_Constraint.h"
+#include "orbsvcs/CosNotificationC.h"
+
+#include "orbsvcs/Notify/notify_serv_export.h"
+
+TAO_BEGIN_VERSIONED_NAMESPACE_DECL
+
+class TAO_Notify_Property_Constraint;
+
+class TAO_Notify_Serv_Export TAO_Notify_Constraint_Visitor
+ : public TAO_ETCL_Constraint_Visitor
+{
+public:
+ /// Constructor.
+ TAO_Notify_Constraint_Visitor (void);
+
+ /// Put the event data into our hash map.
+ int bind_structured_event (const CosNotification::StructuredEvent &s_event);
+
+ /**
+ * Returns 1 if the event satisfies the constraint
+ * represented by the the expression tree rooted at <root>, 0 if it
+ * doesn't. If an error occurs during the process, the traversal
+ * automatically fails.
+ */
+ CORBA::Boolean evaluate_constraint (TAO_ETCL_Constraint *root);
+
+ // The overridden methods.
+ 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:
+ // Sub-methods for visit_binary_expr().
+ 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);
+
+ // These use dynamic anys to look inside the ETCL component.
+ 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);
+
+ // Utility function to compare a TAO_ETCL_Literal_Constraint type
+ // and a type code.
+ CORBA::Boolean simple_type_match (int expr_type,
+ CORBA::TCKind tc_kind);
+
+ enum structured_event_field
+ {
+ FILTERABLE_DATA,
+ HEADER,
+ FIXED_HEADER,
+ EVENT_TYPE,
+ DOMAIN_NAME,
+ TYPE_NAME,
+ EVENT_NAME,
+ VARIABLE_HEADER,
+ REMAINDER_OF_BODY,
+ EMPTY
+ };
+
+ /// Storage for the type of implicit id the component has (if any).
+ structured_event_field implicit_id_;
+
+ /// Size of implicit_ids_ hash map.
+ /// @note A fixed set of 9 keys are stored in this map. In the absence
+ /// of a minimal perfect hash, ACE's default hash_pjw() and a hash size
+ /// of 27 ensures each element is hashed to a unique bucket.
+ /// TODO: define inline once VC6 support is deprecated.
+ static const size_t implicit_ids_size_;
+
+ /// Lookup table for the implicit ids, to avoid string comparisons in
+ /// derived visitors.
+ ACE_Hash_Map_Manager <ACE_CString, structured_event_field, ACE_Null_Mutex>
+ implicit_ids_;
+
+ /// Size of filterable_data_ hash map.
+ /// TODO: define inline once VC6 support is deprecated.
+ static const size_t filterable_data_size_;
+
+ /// Used to lookup names and values in the event's 'filterable_data' field.
+ ACE_Hash_Map_Manager <ACE_CString, CORBA::Any, ACE_Null_Mutex>
+ filterable_data_;
+
+ /// Size of variable_header_ hash map.
+ /// TODO: define inline once VC6 support is deprecated.
+ static const size_t variable_header_size_;
+
+ /// Used to lookup names and values in the event's 'variable_header' field.
+ ACE_Hash_Map_Manager <ACE_CString, CORBA::Any, ACE_Null_Mutex>
+ variable_header_;
+
+ /// Storage for string names under the structured event's
+ /// 'fixed_header' field.
+ CORBA::String_var domain_name_;
+ CORBA::String_var type_name_;
+ CORBA::String_var event_name_;
+
+ /// Storage for the structured_event's 'remainder_of_body' field.
+ CORBA::Any remainder_of_body_;
+
+ /// The result of a non_boolean operation.
+ ACE_Unbounded_Queue <TAO_ETCL_Literal_Constraint> queue_;
+
+ /// Holder for a value found in the event fields filterable_data,
+ /// variable_header or remainder_of_body.
+ CORBA::Any_var current_value_;
+
+ /// Holder for a string name in the event fields fixed_header,
+ /// variable_header, or filterable_data.
+ CORBA::String_var current_name_;
+};
+
+TAO_END_VERSIONED_NAMESPACE_DECL
+
+#include /**/ "ace/post.h"
+#endif /* NOTIFY_CONSTRAINT_VISITORS_H */
diff --git a/TAO/orbsvcs/orbsvcs/Notify/Notify_Default_CO_Factory.cpp b/TAO/orbsvcs/orbsvcs/Notify/Notify_Default_CO_Factory.cpp
new file mode 100644
index 00000000000..5110d567625
--- /dev/null
+++ b/TAO/orbsvcs/orbsvcs/Notify/Notify_Default_CO_Factory.cpp
@@ -0,0 +1,17 @@
+// $Id$
+
+#include "orbsvcs/Notify/Notify_Default_CO_Factory.h"
+
+ACE_RCSID(Notify, Notify_Default_CO_Factory, "$Id$")
+
+
+TAO_BEGIN_VERSIONED_NAMESPACE_DECL
+
+int
+TAO_Notify_Default_CO_Factory::init_svc (void)
+{
+ // NOP.
+ return 0;
+}
+
+TAO_END_VERSIONED_NAMESPACE_DECL
diff --git a/TAO/orbsvcs/orbsvcs/Notify/Notify_Default_CO_Factory.h b/TAO/orbsvcs/orbsvcs/Notify/Notify_Default_CO_Factory.h
new file mode 100644
index 00000000000..8976e345f10
--- /dev/null
+++ b/TAO/orbsvcs/orbsvcs/Notify/Notify_Default_CO_Factory.h
@@ -0,0 +1,48 @@
+/* -*- C++ -*- */
+//=============================================================================
+/**
+ * @file Notify_Default_CO_Factory.h
+ *
+ * $Id$
+ *
+ *
+ * @author Pradeep Gore <pradeep@cs.wustl.edu>
+ */
+//=============================================================================
+
+
+#ifndef NOTIFY_DEFAULT_CO_FACTORY_H
+#define NOTIFY_DEFAULT_CO_FACTORY_H
+
+#include /**/ "ace/pre.h"
+#include "orbsvcs/Notify/notify_serv_export.h"
+
+#if !defined (ACE_LACKS_PRAGMA_ONCE)
+# pragma once
+#endif /* ACE_LACKS_PRAGMA_ONCE */
+
+#include "tao/Versioned_Namespace.h"
+
+TAO_BEGIN_VERSIONED_NAMESPACE_DECL
+
+/**
+ * @class TAO_Notify_Default_CO_Factory
+ *
+ * @brief TAO_Notify_Default_CO_Factory
+ *
+ * Maintained for backward compatibility.
+ */
+class TAO_Notify_Serv_Export TAO_Notify_Default_CO_Factory
+{
+public:
+ /// Helper function to register the default factory into the service
+ /// configurator.
+ static int init_svc (void);
+
+};
+
+TAO_END_VERSIONED_NAMESPACE_DECL
+
+#include /**/ "ace/post.h"
+
+#endif /* NOTIFY_DEFAULT_CO_FACTORY_H */
diff --git a/TAO/orbsvcs/orbsvcs/Notify/Notify_Default_Collection_Factory.cpp b/TAO/orbsvcs/orbsvcs/Notify/Notify_Default_Collection_Factory.cpp
new file mode 100644
index 00000000000..37a286dbb99
--- /dev/null
+++ b/TAO/orbsvcs/orbsvcs/Notify/Notify_Default_Collection_Factory.cpp
@@ -0,0 +1,17 @@
+// $Id$
+
+#include "orbsvcs/Notify/Notify_Default_Collection_Factory.h"
+
+ACE_RCSID(Notify, Notify_Default_Collection_Factory, "$Id$")
+
+
+TAO_BEGIN_VERSIONED_NAMESPACE_DECL
+
+int
+TAO_Notify_Default_Collection_Factory::init_svc (void)
+{
+ // NOP.
+ return 0;
+}
+
+TAO_END_VERSIONED_NAMESPACE_DECL
diff --git a/TAO/orbsvcs/orbsvcs/Notify/Notify_Default_Collection_Factory.h b/TAO/orbsvcs/orbsvcs/Notify/Notify_Default_Collection_Factory.h
new file mode 100644
index 00000000000..c416d093de5
--- /dev/null
+++ b/TAO/orbsvcs/orbsvcs/Notify/Notify_Default_Collection_Factory.h
@@ -0,0 +1,47 @@
+// -*- C++ -*-
+
+//=============================================================================
+/**
+ * @file Notify_Default_Collection_Factory.h
+ *
+ * $Id$
+ *
+ * @author Pradeep Gore <pradeep@cs.wustl.edu>
+ */
+//=============================================================================
+
+
+#ifndef NOTIFY_DEFAULT_COLLECTION_FACTORY_H
+#define NOTIFY_DEFAULT_COLLECTION_FACTORY_H
+#include /**/ "ace/pre.h"
+
+#include "orbsvcs/Notify/notify_serv_export.h"
+
+#if !defined (ACE_LACKS_PRAGMA_ONCE)
+# pragma once
+#endif /* ACE_LACKS_PRAGMA_ONCE */
+
+#include "tao/Versioned_Namespace.h"
+
+TAO_BEGIN_VERSIONED_NAMESPACE_DECL
+
+/**
+ * @class TAO_Notify_Default_Collection_Factory
+ *
+ * @brief Maintained for backward compatibility.
+ *
+ *
+ */
+class TAO_Notify_Serv_Export TAO_Notify_Default_Collection_Factory
+{
+public:
+
+ /// Helper function to register the default factory into the service
+ /// configurator.
+ static int init_svc (void);
+};
+
+TAO_END_VERSIONED_NAMESPACE_DECL
+
+#include /**/ "ace/post.h"
+#endif /* NOTIFY_DEFAULT_COLLECTION_FACTORY_H */
diff --git a/TAO/orbsvcs/orbsvcs/Notify/Notify_Default_EMO_Factory.cpp b/TAO/orbsvcs/orbsvcs/Notify/Notify_Default_EMO_Factory.cpp
new file mode 100644
index 00000000000..2c9cc3f9237
--- /dev/null
+++ b/TAO/orbsvcs/orbsvcs/Notify/Notify_Default_EMO_Factory.cpp
@@ -0,0 +1,17 @@
+// $Id$
+
+#include "orbsvcs/Notify/Notify_Default_EMO_Factory.h"
+
+ACE_RCSID(Notify, Notify_Default_EMO_Factory, "$Id$")
+
+
+TAO_BEGIN_VERSIONED_NAMESPACE_DECL
+
+int
+TAO_Notify_Default_EMO_Factory::init_svc (void)
+{
+ // NOP.
+ return 0;
+}
+
+TAO_END_VERSIONED_NAMESPACE_DECL
diff --git a/TAO/orbsvcs/orbsvcs/Notify/Notify_Default_EMO_Factory.h b/TAO/orbsvcs/orbsvcs/Notify/Notify_Default_EMO_Factory.h
new file mode 100644
index 00000000000..73023b439bf
--- /dev/null
+++ b/TAO/orbsvcs/orbsvcs/Notify/Notify_Default_EMO_Factory.h
@@ -0,0 +1,45 @@
+// -*- C++ -*-
+
+//=============================================================================
+/**
+ * @file Notify_Default_EMO_Factory.h
+ *
+ * $Id$
+ *
+ * @author Pradeep Gore <pradeep@cs.wustl.edu>
+ */
+//=============================================================================
+
+
+#ifndef NOTIFY_DEFAULT_EMO_FACTORY_H
+#define NOTIFY_DEFAULT_EMO_FACTORY_H
+#include /**/ "ace/pre.h"
+
+#include "orbsvcs/Notify/notify_serv_export.h"
+
+#if !defined (ACE_LACKS_PRAGMA_ONCE)
+# pragma once
+#endif /* ACE_LACKS_PRAGMA_ONCE */
+
+#include "tao/Versioned_Namespace.h"
+
+TAO_BEGIN_VERSIONED_NAMESPACE_DECL
+
+/**
+ * @class TAO_Notify_Default_EMO_Factory
+ *
+ * @brief Maintained for backward compatibility.
+ *
+ */
+class TAO_Notify_Serv_Export TAO_Notify_Default_EMO_Factory
+{
+public:
+ /// Helper function to register the default factory into the service
+ /// configurator.
+ static int init_svc (void);
+};
+
+TAO_END_VERSIONED_NAMESPACE_DECL
+
+#include /**/ "ace/post.h"
+#endif /* NOTIFY_DEFAULT_EMO_FACTORY_H */
diff --git a/TAO/orbsvcs/orbsvcs/Notify/Notify_Default_POA_Factory.cpp b/TAO/orbsvcs/orbsvcs/Notify/Notify_Default_POA_Factory.cpp
new file mode 100644
index 00000000000..6d32c554047
--- /dev/null
+++ b/TAO/orbsvcs/orbsvcs/Notify/Notify_Default_POA_Factory.cpp
@@ -0,0 +1,17 @@
+// $Id$
+
+#include "orbsvcs/Notify/Notify_Default_POA_Factory.h"
+
+ACE_RCSID(Notify, Notify_Default_POA_Factory, "$Id$")
+
+
+TAO_BEGIN_VERSIONED_NAMESPACE_DECL
+
+int
+TAO_Notify_Default_POA_Factory::init_svc (void)
+{
+ // NOP.
+ return 0;
+}
+
+TAO_END_VERSIONED_NAMESPACE_DECL
diff --git a/TAO/orbsvcs/orbsvcs/Notify/Notify_Default_POA_Factory.h b/TAO/orbsvcs/orbsvcs/Notify/Notify_Default_POA_Factory.h
new file mode 100644
index 00000000000..62674479d29
--- /dev/null
+++ b/TAO/orbsvcs/orbsvcs/Notify/Notify_Default_POA_Factory.h
@@ -0,0 +1,44 @@
+// -*- C++ -*-
+
+//=============================================================================
+/**
+ * @file Notify_Default_POA_Factory.h
+ *
+ * $Id$
+ *
+ * @author Pradeep Gore <pradeep@cs.wustl.edu>
+ */
+//=============================================================================
+
+
+#ifndef TAO_NOTIFY_DEFAULT_POA_FACTORY_H
+#define TAO_NOTIFY_DEFAULT_POA_FACTORY_H
+
+#include /**/ "ace/pre.h"
+#include "orbsvcs/Notify/notify_serv_export.h"
+
+#if !defined (ACE_LACKS_PRAGMA_ONCE)
+# pragma once
+#endif /* ACE_LACKS_PRAGMA_ONCE */
+
+#include "tao/Versioned_Namespace.h"
+
+TAO_BEGIN_VERSIONED_NAMESPACE_DECL
+
+/**
+ * @class TAO_Notify_Default_POA_Factory
+ *
+ * @brief Maintained for backward compatibility.
+ */
+class TAO_Notify_Serv_Export TAO_Notify_Default_POA_Factory
+{
+public:
+ /// Helper function to register the default factory into the service
+ /// configurator.
+ static int init_svc (void);
+};
+
+TAO_END_VERSIONED_NAMESPACE_DECL
+
+#include /**/ "ace/post.h"
+#endif /* TAO_NOTIFY_DEFAULT_POA_FACTORY_H */
diff --git a/TAO/orbsvcs/orbsvcs/Notify/Notify_EventChannelFactory_i.cpp b/TAO/orbsvcs/orbsvcs/Notify/Notify_EventChannelFactory_i.cpp
new file mode 100644
index 00000000000..2bc881f15a7
--- /dev/null
+++ b/TAO/orbsvcs/orbsvcs/Notify/Notify_EventChannelFactory_i.cpp
@@ -0,0 +1,41 @@
+// $Id$
+
+#include "orbsvcs/Notify/Notify_EventChannelFactory_i.h"
+
+#include "orbsvcs/Notify/Service.h"
+#include "ace/Dynamic_Service.h"
+#include "tao/PortableServer/Root_POA.h"
+#include "tao/ORB_Core.h"
+
+TAO_BEGIN_VERSIONED_NAMESPACE_DECL
+
+CosNotifyChannelAdmin::EventChannelFactory_ptr
+TAO_Notify_EventChannelFactory_i::create (PortableServer::POA_ptr default_POA ACE_ENV_ARG_DECL)
+{
+ CosNotifyChannelAdmin::EventChannelFactory_var notify_factory;
+
+ TAO_Notify_Service* notify_service = ACE_Dynamic_Service<TAO_Notify_Service>::instance (TAO_COS_NOTIFICATION_SERVICE_NAME);
+
+ if (notify_service == 0)
+ {
+ ACE_DEBUG ((LM_DEBUG, "Service not found! check conf. file\n"));
+ return notify_factory._retn ();
+ }
+
+ TAO_Root_POA *poa = dynamic_cast <TAO_Root_POA*> (default_POA);
+
+ if (poa == 0)
+ return notify_factory._retn ();
+
+ CORBA::ORB_ptr orb = poa->orb_core ().orb () ;
+
+ notify_service->init_service (orb ACE_ENV_ARG_PARAMETER);
+ ACE_CHECK_RETURN (notify_factory._retn ());
+
+ notify_factory = notify_service->create (default_POA ACE_ENV_ARG_PARAMETER);
+ ACE_CHECK_RETURN (notify_factory._retn ());
+
+ return notify_factory._retn ();
+}
+
+TAO_END_VERSIONED_NAMESPACE_DECL
diff --git a/TAO/orbsvcs/orbsvcs/Notify/Notify_EventChannelFactory_i.h b/TAO/orbsvcs/orbsvcs/Notify/Notify_EventChannelFactory_i.h
new file mode 100644
index 00000000000..60ccb0b068d
--- /dev/null
+++ b/TAO/orbsvcs/orbsvcs/Notify/Notify_EventChannelFactory_i.h
@@ -0,0 +1,44 @@
+// -*- C++ -*-
+
+//=============================================================================
+/**
+ * @file Notify_EventChannelFactory_i.h
+ *
+ * $Id$
+ *
+ * @author Pradeep Gore <pradeep@cs.wustl.edu>
+ */
+//=============================================================================
+
+
+#ifndef NOTIFY_EVENTCHANNELFACTORY_I_H
+#define NOTIFY_EVENTCHANNELFACTORY_I_H
+#include /**/ "ace/pre.h"
+
+#include "orbsvcs/CosNotifyChannelAdminS.h"
+#include "orbsvcs/Notify/notify_serv_export.h"
+
+#if !defined (ACE_LACKS_PRAGMA_ONCE)
+#pragma once
+#endif /* ACE_LACKS_PRAGMA_ONCE */
+
+TAO_BEGIN_VERSIONED_NAMESPACE_DECL
+
+/**
+ * @class TAO_Notify_EventChannelFactory_i
+ *
+ * @brief Class maintained for Backward compatibility.
+ *
+ */
+class TAO_Notify_Serv_Export TAO_Notify_EventChannelFactory_i
+{
+public:
+ /// Create a factory servant and activates it with the default POA.
+ /// Also creates a resource factory and assigns it this default_POA.
+ static CosNotifyChannelAdmin::EventChannelFactory_ptr create (PortableServer::POA_ptr default_POA ACE_ENV_ARG_DECL);
+};
+
+TAO_END_VERSIONED_NAMESPACE_DECL
+
+#include /**/ "ace/post.h"
+#endif /* NOTIFY_EVENTCHANNELFACTORY_I_H */
diff --git a/TAO/orbsvcs/orbsvcs/Notify/Notify_Extensions.cpp b/TAO/orbsvcs/orbsvcs/Notify/Notify_Extensions.cpp
new file mode 100644
index 00000000000..a73b9be6a6c
--- /dev/null
+++ b/TAO/orbsvcs/orbsvcs/Notify/Notify_Extensions.cpp
@@ -0,0 +1,12 @@
+// $Id$
+
+#include "orbsvcs/Notify/Notify_Extensions.h"
+
+TAO_BEGIN_VERSIONED_NAMESPACE_DECL
+
+namespace TAO_Notify_Extensions
+{
+ const char BlockingPolicy[] = "BlockingPolicy";
+}
+
+TAO_END_VERSIONED_NAMESPACE_DECL
diff --git a/TAO/orbsvcs/orbsvcs/Notify/Notify_Extensions.h b/TAO/orbsvcs/orbsvcs/Notify/Notify_Extensions.h
new file mode 100644
index 00000000000..247e7655d40
--- /dev/null
+++ b/TAO/orbsvcs/orbsvcs/Notify/Notify_Extensions.h
@@ -0,0 +1,33 @@
+// -*- C++ -*-
+// $Id$
+
+#ifndef TAO_NOTIFY_EXTENSIONS_H
+#define TAO_NOTIFY_EXTENSIONS_H
+
+#include /**/ "ace/pre.h"
+
+#include "orbsvcs/Notify/notify_export.h"
+
+#if !defined (ACE_LACKS_PRAGMA_ONCE)
+# pragma once
+#endif /* ACE_LACKS_PRAGMA_ONCE */
+
+#include "tao/orbconf.h"
+
+#if defined (TAO_EXPORT_MACRO)
+# undef TAO_EXPORT_MACRO
+#endif /* TAO_EXPORT_MACRO */
+#define TAO_EXPORT_MACRO TAO_Notify_Export
+
+TAO_BEGIN_VERSIONED_NAMESPACE_DECL
+
+namespace TAO_Notify_Extensions
+{
+ TAO_NAMESPACE_STORAGE_CLASS const char BlockingPolicy[];
+}
+
+TAO_END_VERSIONED_NAMESPACE_DECL
+
+#include /**/ "ace/post.h"
+
+#endif /* TAO_NOTIFY_EXTENSIONS_H */
diff --git a/TAO/orbsvcs/orbsvcs/Notify/Object.cpp b/TAO/orbsvcs/orbsvcs/Notify/Object.cpp
new file mode 100644
index 00000000000..a00a6c374b8
--- /dev/null
+++ b/TAO/orbsvcs/orbsvcs/Notify/Object.cpp
@@ -0,0 +1,372 @@
+// $Id$
+
+#include "orbsvcs/Notify/Object.h"
+#include "orbsvcs/Notify/POA_Helper.h"
+#include "orbsvcs/Notify/Worker_Task.h"
+#include "orbsvcs/Notify/Properties.h"
+#include "orbsvcs/Notify/Builder.h"
+#include "orbsvcs/Notify/ThreadPool_Task.h"
+#include "orbsvcs/Notify/Reactive_Task.h"
+#include "tao/debug.h"
+#include "orbsvcs/Notify/Event_Manager.h"
+
+#if ! defined (__ACE_INLINE__)
+#include "orbsvcs/Notify/Object.inl"
+#endif /* __ACE_INLINE__ */
+
+ACE_RCSID(Notify, TAO_Notify_Object, "$Id$")
+
+TAO_BEGIN_VERSIONED_NAMESPACE_DECL
+
+TAO_Notify_Object::TAO_Notify_Object (void)
+: poa_ (0)
+, proxy_poa_ (0)
+, own_proxy_poa_ (false)
+, object_poa_ (0)
+, own_object_poa_ (false)
+, id_ (0)
+, own_worker_task_ (false)
+, shutdown_ (false)
+{
+ if (TAO_debug_level > 2 )
+ ACE_DEBUG ((LM_DEBUG,"object:%x created\n", this ));
+}
+
+TAO_Notify_Object::~TAO_Notify_Object ()
+{
+ if (TAO_debug_level > 2 )
+ ACE_DEBUG ((LM_DEBUG,"object:%x destroyed\n", this ));
+
+ this->destroy_proxy_poa ();
+ this->destroy_object_poa ();
+ this->destroy_poa ();
+}
+
+void
+TAO_Notify_Object::initialize (TAO_Notify_Object* parent)
+{
+ ACE_ASSERT (parent != 0 && this->event_manager_.get() == 0);
+
+ // Do not use sets to avoid asserts.
+ // Object must be able to inherit NULL references
+ // due to current design.
+ this->event_manager_ = parent->event_manager_;
+ this->admin_properties_ = parent->admin_properties_;
+ this->inherit_poas( *parent );
+ this->worker_task_ = parent->worker_task_;
+
+ // Pass QoS
+ parent->qos_properties_.transfer (this->qos_properties_);
+ this->qos_changed (this->qos_properties_);
+}
+
+void
+TAO_Notify_Object::set_event_manager( TAO_Notify_Event_Manager* event_manager )
+{
+ ACE_ASSERT( event_manager != 0 );
+ this->event_manager_.reset( event_manager );
+}
+
+CORBA::Object_ptr
+TAO_Notify_Object::activate (PortableServer::Servant servant ACE_ENV_ARG_DECL)
+{
+ return this->poa_->activate (servant, this->id_ ACE_ENV_ARG_PARAMETER);
+}
+
+/// Activate with existing id
+CORBA::Object_ptr
+TAO_Notify_Object::activate (
+ PortableServer::Servant servant,
+ CORBA::Long id
+ ACE_ENV_ARG_DECL)
+{
+ this->id_ = id;
+ return this->poa_->activate_with_id (servant, this->id_ ACE_ENV_ARG_PARAMETER);
+}
+
+
+void
+TAO_Notify_Object::deactivate (ACE_ENV_SINGLE_ARG_DECL)
+{
+ ACE_TRY
+ {
+ this->poa_->deactivate (this->id_ ACE_ENV_ARG_PARAMETER);
+ ACE_TRY_CHECK;
+ }
+ ACE_CATCHANY
+ {
+ // Do not propagate any exceptions
+ if (TAO_debug_level > 2)
+ {
+ ACE_PRINT_EXCEPTION (ACE_ANY_EXCEPTION, "(%P|%t)\n");
+ ACE_DEBUG ((LM_DEBUG, "Could not deactivate object %d\n", this->id_));
+ }
+ }
+ ACE_ENDTRY;
+}
+
+int
+TAO_Notify_Object::shutdown (ACE_ENV_SINGLE_ARG_DECL)
+{
+ {
+ ACE_GUARD_RETURN (TAO_SYNCH_MUTEX, ace_mon, this->lock_, 1);
+
+ if (this->shutdown_ == 1)
+ return 1; // Another thread has already run shutdown.
+
+ this->shutdown_ = 1;
+ }
+
+ this->deactivate (ACE_ENV_SINGLE_ARG_PARAMETER);
+ ACE_CHECK_RETURN (1);
+
+ this->shutdown_worker_task ();
+
+ return 0;
+}
+
+CORBA::Object_ptr
+TAO_Notify_Object::ref (ACE_ENV_SINGLE_ARG_DECL)
+{
+ return this->poa_->id_to_reference (this->id_ ACE_ENV_ARG_PARAMETER);
+}
+
+void
+TAO_Notify_Object::shutdown_worker_task (void)
+{
+ // Only do this if we are the owner.
+ TAO_Notify_Worker_Task::Ptr task( this->worker_task_ );
+ this->worker_task_.reset();
+ if ( task.isSet() )
+ {
+ if ( this->own_worker_task_ )
+ {
+ task->shutdown ();
+ }
+ }
+}
+
+void
+TAO_Notify_Object::destroy_proxy_poa (void)
+{
+ if (this->proxy_poa_ != 0)
+ {
+ ACE_TRY_NEW_ENV
+ {
+ if ( this->proxy_poa_ == this->object_poa_ ) this->object_poa_ = 0;
+ if ( this->proxy_poa_ == this->poa_ ) this->poa_ = 0;
+
+ if ( this->own_proxy_poa_ == true )
+ {
+ this->own_proxy_poa_ = false;
+ ACE_Auto_Ptr< TAO_Notify_POA_Helper > app( object_poa_ );
+ this->proxy_poa_->destroy (ACE_ENV_SINGLE_ARG_PARAMETER);
+ ACE_TRY_CHECK;
+ }
+ this->proxy_poa_ = 0;
+ }
+ ACE_CATCHANY
+ {
+ if (TAO_debug_level > 2)
+ ACE_PRINT_EXCEPTION (ACE_ANY_EXCEPTION,
+ "Proxy shutdown error (%P|%t)\n");
+ }
+ ACE_ENDTRY;
+ }
+}
+
+void
+TAO_Notify_Object::destroy_object_poa (void)
+{
+ if (this->object_poa_ != 0)
+ {
+ ACE_TRY_NEW_ENV
+ {
+ if ( this->object_poa_ == this->proxy_poa_ ) this->proxy_poa_ = 0;
+ if ( this->object_poa_ == this->poa_ ) this->poa_ = 0;
+
+ if ( this->own_object_poa_ == true )
+ {
+ this->own_object_poa_ = false;
+ ACE_Auto_Ptr< TAO_Notify_POA_Helper > aop( object_poa_ );
+ this->object_poa_->destroy (ACE_ENV_SINGLE_ARG_PARAMETER);
+ ACE_TRY_CHECK;
+ }
+ this->object_poa_ = 0;
+ }
+ ACE_CATCHANY
+ {
+ if (TAO_debug_level > 2)
+ ACE_PRINT_EXCEPTION (ACE_ANY_EXCEPTION,
+ "Proxy shutdown error (%P|%t)\n");
+ }
+ ACE_ENDTRY;
+ }
+}
+
+/// Shutdown the current poa.
+void TAO_Notify_Object::destroy_poa (void)
+{
+ this->poa_ = 0;
+}
+
+void
+TAO_Notify_Object::set_worker_task (TAO_Notify_Worker_Task* worker_task)
+{
+ ACE_ASSERT( worker_task != 0 );
+
+ // shutdown the current worker.
+ this->shutdown_worker_task ();
+
+ this->worker_task_.reset (worker_task);
+
+ this->own_worker_task_ = true;
+}
+
+void
+TAO_Notify_Object::set_proxy_poa (TAO_Notify_POA_Helper* proxy_poa)
+{
+ // shutdown current proxy poa.
+ this->destroy_proxy_poa ();
+
+ this->proxy_poa_ = proxy_poa;
+
+ this->own_proxy_poa_ = true;
+}
+
+void
+TAO_Notify_Object::set_object_poa (TAO_Notify_POA_Helper* object_poa)
+{
+ // shutdown current object poa.
+ this->destroy_object_poa ();
+
+ this->object_poa_ = object_poa;
+
+ this->own_object_poa_ = true;
+}
+
+void
+TAO_Notify_Object::set_poa (TAO_Notify_POA_Helper* poa)
+{
+ this->poa_ = poa;
+}
+
+void
+TAO_Notify_Object::set_qos (const CosNotification::QoSProperties & qos ACE_ENV_ARG_DECL)
+{
+ CosNotification::PropertyErrorSeq err_seq;
+
+ TAO_Notify_QoSProperties new_qos_properties;
+
+ if (new_qos_properties.init (qos, err_seq) == -1)
+ ACE_THROW (CORBA::INTERNAL ());
+
+ // Apply the appropriate concurrency QoS
+ if (new_qos_properties.thread_pool ().is_valid ())
+ {
+ if (new_qos_properties.thread_pool ().value ().static_threads == 0)
+ {
+ TAO_Notify_PROPERTIES::instance()->builder()->apply_reactive_concurrency (*this ACE_ENV_ARG_PARAMETER);
+ ACE_CHECK;
+ }
+ else
+ {
+ TAO_Notify_PROPERTIES::instance()->builder()->
+ apply_thread_pool_concurrency (*this, new_qos_properties.thread_pool ().value () ACE_ENV_ARG_PARAMETER);
+ ACE_CHECK;
+ }
+ }
+ else if (new_qos_properties.thread_pool_lane ().is_valid ())
+ TAO_Notify_PROPERTIES::instance()->builder()->
+ apply_lane_concurrency (*this, new_qos_properties.thread_pool_lane ().value () ACE_ENV_ARG_PARAMETER);
+ ACE_CHECK;
+
+ // Update the Thread Task's QoS properties..
+ this->worker_task_->update_qos_properties (new_qos_properties);
+
+ // Inform subclasses of QoS changed.
+ this->qos_changed (new_qos_properties);
+
+ // Init the the overall QoS on this object.
+ if (new_qos_properties.copy (this->qos_properties_) == -1)
+ ACE_THROW (CORBA::INTERNAL ());
+
+ if (err_seq.length () > 0) // Unsupported Property
+ ACE_THROW (CosNotification::UnsupportedQoS (err_seq));
+}
+
+CosNotification::QoSProperties*
+TAO_Notify_Object::get_qos (ACE_ENV_SINGLE_ARG_DECL)
+{
+ CosNotification::QoSProperties_var properties;
+
+ ACE_NEW_THROW_EX (properties,
+ CosNotification::QoSProperties (),
+ CORBA::NO_MEMORY ());
+
+ this->qos_properties_.populate (properties);
+
+ return properties._retn ();
+}
+
+bool
+TAO_Notify_Object::find_qos_property_value (
+ const char * name,
+ CosNotification::PropertyValue & value) const
+{
+ return this->qos_properties_.find (name, value);
+}
+
+
+void
+TAO_Notify_Object::qos_changed (const TAO_Notify_QoSProperties& /*qos_properties*/)
+{
+ // NOP.
+}
+
+TAO_Notify_Timer*
+TAO_Notify_Object::timer (void)
+{
+ ACE_ASSERT (worker_task_.get() != 0);
+ return this->worker_task_->timer ();
+}
+
+namespace
+{
+ template<class T>
+ void add_qos_attr(TAO_Notify::NVPList& attrs, const T& prop)
+ {
+ if (prop.is_valid())
+ {
+ attrs.push_back(TAO_Notify::NVP (prop));
+ }
+ }
+} // namespace
+
+void
+TAO_Notify_Object::save_attrs (TAO_Notify::NVPList& attrs)
+{
+ add_qos_attr(attrs, this->qos_properties_.event_reliability ());
+ add_qos_attr(attrs, this->qos_properties_.connection_reliability ());
+ add_qos_attr(attrs, this->qos_properties_.priority ());
+ add_qos_attr(attrs, this->qos_properties_.timeout ());
+ add_qos_attr(attrs, this->qos_properties_.stop_time_supported ());
+ add_qos_attr(attrs, this->qos_properties_.maximum_batch_size ());
+ add_qos_attr(attrs, this->qos_properties_.pacing_interval ());
+}
+
+void
+TAO_Notify_Object::load_attrs(const TAO_Notify::NVPList& attrs)
+{
+ attrs.load (this->qos_properties_.event_reliability ());
+ attrs.load (this->qos_properties_.connection_reliability ());
+ attrs.load (this->qos_properties_.priority ());
+ attrs.load (this->qos_properties_.timeout ());
+ attrs.load (this->qos_properties_.stop_time_supported ());
+ attrs.load (this->qos_properties_.maximum_batch_size ());
+ attrs.load (this->qos_properties_.pacing_interval ());
+ this->qos_properties_.init ();
+}
+
+
+TAO_END_VERSIONED_NAMESPACE_DECL
diff --git a/TAO/orbsvcs/orbsvcs/Notify/Object.h b/TAO/orbsvcs/orbsvcs/Notify/Object.h
new file mode 100644
index 00000000000..7b9cb510b6c
--- /dev/null
+++ b/TAO/orbsvcs/orbsvcs/Notify/Object.h
@@ -0,0 +1,221 @@
+// -*- C++ -*-
+
+/**
+ * @file Object.h
+ *
+ * $Id$
+ *
+ * @author Pradeep Gore <pradeep@oomworks.com>
+ *
+ *
+ */
+
+#ifndef TAO_Notify_OBJECT_H
+#define TAO_Notify_OBJECT_H
+
+#include /**/ "ace/pre.h"
+
+#include "orbsvcs/Notify/notify_serv_export.h"
+
+#if !defined (ACE_LACKS_PRAGMA_ONCE)
+# pragma once
+#endif /* ACE_LACKS_PRAGMA_ONCE */
+
+#include "orbsvcs/Notify/QoSProperties.h"
+#include "orbsvcs/Notify/AdminProperties.h"
+#include "orbsvcs/Notify/Worker_Task.h"
+#include "orbsvcs/Notify/Refcountable.h"
+#include "orbsvcs/Notify/Name_Value_Pair.h"
+#include "orbsvcs/Notify/Event_Manager.h"
+
+#include "orbsvcs/NotifyExtC.h"
+
+#include "tao/PortableServer/Servant_Base.h"
+
+TAO_BEGIN_VERSIONED_NAMESPACE_DECL
+
+class TAO_Notify_POA_Helper;
+class TAO_Notify_Timer;
+class TAO_Notify_RT_Builder;
+
+/**
+ * @class TAO_Notify_Object
+ *
+ * @brief Base Object for RT_Notify's CORBA Objects.
+ *
+ */
+class TAO_Notify_Serv_Export TAO_Notify_Object : public TAO_Notify_Refcountable
+{
+ friend class TAO_Notify_Builder;
+ friend class TAO_Notify_RT_Builder;
+
+public:
+ /// Id for Objects.
+ typedef CORBA::Long ID;
+
+ /// Destructor
+ virtual ~TAO_Notify_Object (void);
+
+ /// This Object's ID
+ ID id (void) const;
+
+ /// Activate
+ virtual CORBA::Object_ptr activate (PortableServer::Servant servant ACE_ENV_ARG_DECL);
+
+ /// Activate with existing id
+ virtual CORBA::Object_ptr activate (
+ PortableServer::Servant servant,
+ CORBA::Long id
+ ACE_ENV_ARG_DECL);
+
+ /// Deactivate
+ void deactivate (ACE_ENV_SINGLE_ARG_DECL);
+
+ /// Have we been shutdown. returns 1 if shutdown.
+ int has_shutdown (void);
+
+ void execute_task (TAO_Notify_Method_Request& method_request ACE_ENV_ARG_DECL);
+
+ /// Get CORBA Ref.
+ CORBA::Object_ptr ref (ACE_ENV_SINGLE_ARG_DECL);
+
+ /// Set the QoS Properties.
+ virtual void set_qos (const CosNotification::QoSProperties & qos ACE_ENV_ARG_DECL);
+
+ /// Get the QoS Properties.
+ CosNotification::QoSProperties* get_qos (ACE_ENV_SINGLE_ARG_DECL);
+
+ bool find_qos_property_value (
+ const char * name,
+ CosNotification::PropertyValue & value)const;
+
+ /// Obtain the Timer manager associated with this object.
+ virtual TAO_Notify_Timer* timer (void);
+
+ /// Accessor for the Event Manager
+ TAO_Notify_Event_Manager& event_manager (void);
+
+ /// shutdown. Returns 1 ifif the shutdown was already run once before.
+ virtual int shutdown (ACE_ENV_SINGLE_ARG_DECL);
+
+ /// Load our attributes. Each derived type should call the superclass
+ /// load first before loading its own attributes.
+ virtual void load_attrs(const TAO_Notify::NVPList& attrs);
+
+protected:
+ /// Constructor
+ TAO_Notify_Object (void);
+
+ /// Init this object with data from <rhs>.
+ void initialize (TAO_Notify_Object* parent);
+
+ /// Uses the poas from the supplied object
+ void inherit_poas (TAO_Notify_Object& parent);
+
+ /// Adopts the supplied poa as all are poas
+ void adopt_poa (TAO_Notify_POA_Helper* single);
+
+ /// Changes the primary poa to the current proxy poa
+ void set_primary_as_proxy_poa();
+
+ /// Accessor for the proxy_poa_
+ TAO_Notify_POA_Helper* proxy_poa (void);
+
+ /// Accessor for the object_poa_
+ TAO_Notify_POA_Helper* object_poa (void);
+
+ /// Get the POA assigned to us.
+ TAO_Notify_POA_Helper* poa (void);
+
+ // Sets the admin properties
+ void set_event_manager( TAO_Notify_Event_Manager* event_manager );
+
+ // Sets the admin properties
+ void set_admin_properties( TAO_Notify_AdminProperties* admin_properties );
+
+ /// Accessor for the Admin Properties
+ TAO_Notify_AdminProperties& admin_properties (void);
+
+ /// Notification that can be overridden by subclasses to be informed that <qos_properties_> have been modified.
+ virtual void qos_changed (const TAO_Notify_QoSProperties& qos_properties);
+
+ /// Called by derived types to save their attributes. Each
+ /// derived type should call its superclass version before
+ /// saving its own attrs.
+ virtual void save_attrs(TAO_Notify::NVPList& attrs);
+
+ ///= Protected data members.
+
+ /// QoS Properties.
+ TAO_Notify_QoSProperties qos_properties_;
+
+private:
+ /// Set Worker Task. This object assume ownership of the set object.
+ void set_worker_task (TAO_Notify_Worker_Task* worker_task);
+
+ /// Setting the proxy_poa_ gives ownership to this class.
+ void set_proxy_poa (TAO_Notify_POA_Helper* proxy_poa);
+
+ /// Setting the object_poa_ gives ownership to this class.
+ void set_object_poa (TAO_Notify_POA_Helper* object_poa);
+
+ /// Setting the object_poa_ gives ownership to this class.
+ void set_poa (TAO_Notify_POA_Helper* object_poa);
+
+ /// Shutdown the current worker task and delete it if we own it.
+ void shutdown_worker_task (void);
+
+ /// Shutdown the current proxy poa.
+ void destroy_proxy_poa (void);
+
+ /// Shutdown the current object poa.
+ void destroy_object_poa (void);
+
+ /// Shutdown the current poa.
+ void destroy_poa (void);
+
+protected:
+
+ /// The mutex to serialize access to state variables.
+ TAO_SYNCH_MUTEX lock_;
+
+private:
+
+ /// The POA in which the object is activated.
+ TAO_Notify_POA_Helper* poa_;
+
+ /// The POA in which the proxys are activated.
+ TAO_Notify_POA_Helper* proxy_poa_;
+ bool own_proxy_poa_;
+
+ /// The POA in which the object's children are activated.
+ TAO_Notify_POA_Helper* object_poa_;
+ bool own_object_poa_;
+
+ /// Id assigned to this object
+ ID id_;
+
+ /// The event manager.
+ //TAO_Notify_Event_Manager inl includes Object.h
+ TAO_Notify_Refcountable_Guard_T< TAO_Notify_Event_Manager > event_manager_;
+
+ /// Admin Properties.
+ TAO_Notify_AdminProperties::Ptr admin_properties_;
+
+ /// Worker Task.
+ TAO_Notify_Worker_Task::Ptr worker_task_;
+ bool own_worker_task_;
+
+ /// Are we shutdown (i,e. scheduled for destroy).
+ bool shutdown_;
+};
+
+TAO_END_VERSIONED_NAMESPACE_DECL
+
+#if defined (__ACE_INLINE__)
+#include "orbsvcs/Notify/Object.inl"
+#endif /* __ACE_INLINE__ */
+
+#include /**/ "ace/post.h"
+
+#endif /* TAO_Notify_OBJECT_H */
diff --git a/TAO/orbsvcs/orbsvcs/Notify/Object.inl b/TAO/orbsvcs/orbsvcs/Notify/Object.inl
new file mode 100644
index 00000000000..fcc77e8b4d8
--- /dev/null
+++ b/TAO/orbsvcs/orbsvcs/Notify/Object.inl
@@ -0,0 +1,97 @@
+// -*- C++ -*-
+//
+// $Id$
+
+TAO_BEGIN_VERSIONED_NAMESPACE_DECL
+
+ACE_INLINE CORBA::Long
+TAO_Notify_Object::id (void) const
+{
+ return id_;
+}
+
+ACE_INLINE void
+TAO_Notify_Object::execute_task (TAO_Notify_Method_Request& method_request ACE_ENV_ARG_DECL)
+{
+ TAO_Notify_Worker_Task::Ptr task( this->worker_task_ );
+ if ( task.isSet() )
+ {
+ task->execute( method_request ACE_ENV_ARG_PARAMETER );
+ }
+}
+
+ACE_INLINE void
+TAO_Notify_Object::inherit_poas (TAO_Notify_Object& parent)
+{
+ this->set_proxy_poa( parent.proxy_poa() );
+ this->set_object_poa( parent.object_poa() );
+ this->set_poa( parent.poa() );
+
+ // Do not take ownership of parent's poas
+ own_proxy_poa_ = false;
+ own_object_poa_ = false;
+}
+
+ACE_INLINE void
+TAO_Notify_Object::adopt_poa (TAO_Notify_POA_Helper* single)
+{
+ ACE_ASSERT( single != 0 );
+ this->set_proxy_poa( single );
+ this->set_object_poa( single );
+ this->set_poa( single );
+
+ // Maintain ownership of the poa
+}
+
+ACE_INLINE void
+TAO_Notify_Object::set_primary_as_proxy_poa()
+{
+ this->set_poa( this->proxy_poa() );
+}
+
+ACE_INLINE TAO_Notify_POA_Helper*
+TAO_Notify_Object::poa (void)
+{
+ return this->poa_;
+}
+
+ACE_INLINE TAO_Notify_POA_Helper*
+TAO_Notify_Object::object_poa (void)
+{
+ return this->object_poa_;
+}
+
+ACE_INLINE TAO_Notify_POA_Helper*
+TAO_Notify_Object::proxy_poa (void)
+{
+ return this->proxy_poa_;
+}
+
+ACE_INLINE int
+TAO_Notify_Object::has_shutdown (void)
+{
+ return this->shutdown_;
+}
+
+ACE_INLINE void
+TAO_Notify_Object::set_admin_properties( TAO_Notify_AdminProperties* admin_properties )
+{
+ ACE_ASSERT( admin_properties != 0 );
+ this->admin_properties_.reset( admin_properties );
+}
+
+ACE_INLINE TAO_Notify_Event_Manager&
+TAO_Notify_Object::event_manager (void)
+{
+ ACE_ASSERT( this->event_manager_.get() != 0 );
+ return *this->event_manager_;
+}
+
+ACE_INLINE TAO_Notify_AdminProperties&
+TAO_Notify_Object::admin_properties (void)
+{
+ ACE_ASSERT( this->admin_properties_.get() != 0 );
+ return *this->admin_properties_;
+}
+
+TAO_END_VERSIONED_NAMESPACE_DECL
diff --git a/TAO/orbsvcs/orbsvcs/Notify/POA_Helper.cpp b/TAO/orbsvcs/orbsvcs/Notify/POA_Helper.cpp
new file mode 100644
index 00000000000..0137934dd22
--- /dev/null
+++ b/TAO/orbsvcs/orbsvcs/Notify/POA_Helper.cpp
@@ -0,0 +1,218 @@
+// $Id$
+
+#include "orbsvcs/Notify/POA_Helper.h"
+
+#if ! defined (__ACE_INLINE__)
+#include "orbsvcs/Notify/POA_Helper.inl"
+#endif /* __ACE_INLINE__ */
+
+ACE_RCSID(RT_Notify, TAO_Notify_POA_Helper, "$Id$")
+
+#include "tao/debug.h"
+//#define DEBUG_LEVEL 10
+#ifndef DEBUG_LEVEL
+# define DEBUG_LEVEL TAO_debug_level
+#endif // DEBUG_LEVEL
+
+TAO_BEGIN_VERSIONED_NAMESPACE_DECL
+
+TAO_Notify_POA_Helper::TAO_Notify_POA_Helper (void)
+{
+}
+
+TAO_Notify_POA_Helper::~TAO_Notify_POA_Helper ()
+{
+}
+
+ACE_CString
+TAO_Notify_POA_Helper::get_unique_id (void)
+{
+ /// Factory for generating unique ids for the POAs.
+ static TAO_Notify_ID_Factory poa_id_factory;
+
+ char buf[32];
+ ACE_OS::itoa (poa_id_factory.id (), buf, 10);
+
+ return ACE_CString (buf);
+}
+
+void
+TAO_Notify_POA_Helper::init (PortableServer::POA_ptr parent_poa, const char* poa_name ACE_ENV_ARG_DECL)
+{
+ CORBA::PolicyList policy_list (2);
+
+ this->set_policy (parent_poa, policy_list ACE_ENV_ARG_PARAMETER);
+ ACE_CHECK;
+
+ this->create_i (parent_poa, poa_name, policy_list ACE_ENV_ARG_PARAMETER);
+}
+
+void
+TAO_Notify_POA_Helper::init (PortableServer::POA_ptr parent_poa ACE_ENV_ARG_DECL)
+{
+ ACE_CString child_poa_name = this->get_unique_id ();
+
+ this->init (parent_poa, child_poa_name.c_str () ACE_ENV_ARG_PARAMETER);
+}
+
+void
+TAO_Notify_POA_Helper::set_policy (PortableServer::POA_ptr parent_poa, CORBA::PolicyList &policy_list ACE_ENV_ARG_DECL)
+{
+ policy_list.length (2);
+
+ policy_list[0] =
+ parent_poa->create_id_uniqueness_policy (PortableServer::UNIQUE_ID
+ ACE_ENV_ARG_PARAMETER);
+ ACE_CHECK;
+
+ policy_list[1] =
+ parent_poa->create_id_assignment_policy (PortableServer::USER_ID
+ ACE_ENV_ARG_PARAMETER);
+ ACE_CHECK;
+}
+
+
+void
+TAO_Notify_POA_Helper::create_i (PortableServer::POA_ptr parent_poa, const char* poa_name, CORBA::PolicyList &policy_list ACE_ENV_ARG_DECL)
+{
+ PortableServer::POAManager_var manager =
+ parent_poa->the_POAManager (ACE_ENV_SINGLE_ARG_PARAMETER);
+ ACE_CHECK;
+
+ // Create the child POA.
+ this->poa_ = parent_poa->create_POA (poa_name,
+ manager.in (),
+ policy_list
+ ACE_ENV_ARG_PARAMETER);
+ ACE_CHECK;
+
+ if (DEBUG_LEVEL > 0)
+ ACE_DEBUG ((LM_DEBUG, "Created POA : %s\n", this->poa_->the_name ()));
+ /*
+ // Destroy the policies
+ for (CORBA::ULong index = 0; index < policy_list.length (); ++index)
+ {
+ policy_list[index]->destroy ();
+ }
+ */
+}
+
+PortableServer::ObjectId *
+TAO_Notify_POA_Helper::long_to_ObjectId (CORBA::Long id ACE_ENV_ARG_DECL) const
+{
+ // Modified code from string_to_ObjectId ..
+ //
+
+ CORBA::ULong buffer_size = 4;
+
+ // Create the buffer for the Id
+ CORBA::Octet *buffer = PortableServer::ObjectId::allocbuf (buffer_size);
+
+ // Copy the contents
+ ACE_OS::memcpy (buffer, (char*)&id, buffer_size);
+
+ // @@ Pradeep: TAO guarantees that Long is 4 bytes wide, but the
+ // standard only guarantees that it is at least 4 bytes wide. You
+ // may want to think about that....
+
+ // Create and return a new ID
+ PortableServer::ObjectId *obj_id = 0;
+ ACE_NEW_THROW_EX (obj_id,
+ PortableServer::ObjectId (buffer_size,
+ buffer_size,
+ buffer,
+ 1),
+ CORBA::NO_MEMORY ());
+
+ return obj_id;
+}
+
+CORBA::Object_ptr
+TAO_Notify_POA_Helper::activate (PortableServer::Servant servant, CORBA::Long& id ACE_ENV_ARG_DECL)
+{
+ // Generate a new ID.
+ id = this->id_factory_.id ();
+
+ if (DEBUG_LEVEL > 0)
+ ACE_DEBUG ((LM_DEBUG, "Activating object with id = %d in POA : %s\n", id, this->poa_->the_name ()));
+
+ // Convert CORBA::Long to ObjectId
+ PortableServer::ObjectId_var oid =
+ this->long_to_ObjectId (id ACE_ENV_ARG_PARAMETER);
+ ACE_CHECK_RETURN (CORBA::Object::_nil ());
+
+ poa_->activate_object_with_id (oid.in (),
+ servant
+ ACE_ENV_ARG_PARAMETER);
+ ACE_CHECK_RETURN (CORBA::Object::_nil ());
+
+ return poa_->id_to_reference (oid.in ()
+ ACE_ENV_ARG_PARAMETER);
+}
+
+CORBA::Object_ptr
+TAO_Notify_POA_Helper::activate_with_id (PortableServer::Servant servant, CORBA::Long id ACE_ENV_ARG_DECL)
+{
+ if (DEBUG_LEVEL > 0)
+ ACE_DEBUG ((LM_DEBUG, "Activating object with existing id = %d in POA : %s\n", id, this->poa_->the_name ()));
+ this->id_factory_.set_last_used (id);
+
+ // Convert CORBA::Long to ObjectId
+ PortableServer::ObjectId_var oid =
+ this->long_to_ObjectId (id ACE_ENV_ARG_PARAMETER);
+ ACE_CHECK_RETURN (CORBA::Object::_nil ());
+
+ poa_->activate_object_with_id (oid.in (),
+ servant
+ ACE_ENV_ARG_PARAMETER);
+ ACE_CHECK_RETURN (CORBA::Object::_nil ());
+
+ return poa_->id_to_reference (oid.in ()
+ ACE_ENV_ARG_PARAMETER);
+}
+
+void
+TAO_Notify_POA_Helper::deactivate (CORBA::Long id ACE_ENV_ARG_DECL) const
+{
+ // Convert CORBA::Long to ObjectId
+ PortableServer::ObjectId_var oid =
+ this->long_to_ObjectId (id ACE_ENV_ARG_PARAMETER);
+ ACE_CHECK;
+
+ poa_->deactivate_object (oid.in () ACE_ENV_ARG_PARAMETER);
+}
+
+CORBA::Object_ptr
+TAO_Notify_POA_Helper::id_to_reference (CORBA::Long id ACE_ENV_ARG_DECL) const
+{
+ // Convert CORBA::Long to ObjectId
+ PortableServer::ObjectId_var oid =
+ this->long_to_ObjectId (id ACE_ENV_ARG_PARAMETER);
+ ACE_CHECK_RETURN (CORBA::Object::_nil ());
+
+ return poa_->id_to_reference (oid.in ()
+ ACE_ENV_ARG_PARAMETER);
+}
+
+PortableServer::ServantBase *
+TAO_Notify_POA_Helper::reference_to_servant (CORBA::Object_ptr ptr ACE_ENV_ARG_DECL) const
+{
+ return poa_->reference_to_servant (ptr ACE_ENV_ARG_PARAMETER);
+}
+
+CORBA::Object_ptr
+TAO_Notify_POA_Helper::servant_to_reference (
+ PortableServer::ServantBase * servant ACE_ENV_ARG_DECL) const
+{
+ return poa_->servant_to_reference (servant ACE_ENV_ARG_PARAMETER);
+}
+
+
+void
+TAO_Notify_POA_Helper::destroy (ACE_ENV_SINGLE_ARG_DECL)
+{
+ poa_->destroy (1,0 ACE_ENV_ARG_PARAMETER);
+ // The <wait_for_completion> flag = 0
+}
+
+TAO_END_VERSIONED_NAMESPACE_DECL
diff --git a/TAO/orbsvcs/orbsvcs/Notify/POA_Helper.h b/TAO/orbsvcs/orbsvcs/Notify/POA_Helper.h
new file mode 100644
index 00000000000..57b4208324e
--- /dev/null
+++ b/TAO/orbsvcs/orbsvcs/Notify/POA_Helper.h
@@ -0,0 +1,115 @@
+// -*- C++ -*-
+
+/**
+ * @file POA_Helper.h
+ *
+ * $Id$
+ *
+ * @author Pradeep Gore <pradeep@oomworks.com>
+ */
+
+#ifndef TAO_Notify_POA_Helper_H
+#define TAO_Notify_POA_Helper_H
+
+#include /**/ "ace/pre.h"
+
+#include "orbsvcs/Notify/notify_serv_export.h"
+
+#if !defined (ACE_LACKS_PRAGMA_ONCE)
+# pragma once
+#endif /* ACE_LACKS_PRAGMA_ONCE */
+
+#include "orbsvcs/Notify/ID_Factory.h"
+
+#include "tao/PortableServer/PortableServer.h"
+
+#include "ace/Copy_Disabled.h"
+
+TAO_BEGIN_VERSIONED_NAMESPACE_DECL
+
+/**
+ * @class TAO_Notify_POA_Helper
+ *
+ * @brief POA Abstraction.
+ *
+ */
+class TAO_Notify_Serv_Export TAO_Notify_POA_Helper : private ACE_Copy_Disabled
+{
+public:
+ /// Default Constructor
+ TAO_Notify_POA_Helper (void);
+
+ /// Create a new PortableServer::POA.
+ void init (PortableServer::POA_ptr parent_poa,
+ const char* poa_name
+ ACE_ENV_ARG_DECL);
+
+ /// Create a new PortableServer::POA. The name is chosen at random.
+ void init (PortableServer::POA_ptr parent_poa ACE_ENV_ARG_DECL);
+
+ /// Destructor
+ virtual ~TAO_Notify_POA_Helper ();
+
+ /// Get underlying POA
+ PortableServer::POA_ptr poa (void);
+
+ /// Destroy underlying POA.
+ void destroy (ACE_ENV_SINGLE_ARG_DECL);
+
+ /// Activate Object, the POA will assign an ID and return its value.
+ CORBA::Object_ptr activate (PortableServer::Servant servant,
+ CORBA::Long& id
+ ACE_ENV_ARG_DECL);
+
+ /// Activate Object, using existing ID
+ CORBA::Object_ptr activate_with_id (PortableServer::Servant servant, CORBA::Long id ACE_ENV_ARG_DECL);
+
+ /// Deactivate Object with ID
+ void deactivate (CORBA::Long id
+ ACE_ENV_ARG_DECL) const;
+
+ /// Convert ID to reference.
+ CORBA::Object_ptr id_to_reference (CORBA::Long id
+ ACE_ENV_ARG_DECL) const;
+
+ /// Convert reference to pointer to servant
+ PortableServer::ServantBase * reference_to_servant (CORBA::Object_ptr ptr
+ ACE_ENV_ARG_DECL) const;
+
+ CORBA::Object_ptr servant_to_reference (PortableServer::ServantBase * servant ACE_ENV_ARG_DECL) const;
+
+protected:
+ /// Set default POA policies.
+ virtual void set_policy (PortableServer::POA_ptr parent_poa,
+ CORBA::PolicyList &policy_list
+ ACE_ENV_ARG_DECL);
+
+ /// Apply the polices and create child POA.
+ void create_i (PortableServer::POA_ptr parent_poa,
+ const char* poa_name,
+ CORBA::PolicyList &policy_list ACE_ENV_ARG_DECL);
+
+ /// Generate a unique id for each POA created.
+ ACE_CString get_unique_id (void);
+
+ /// Convert id to ObjectID
+ PortableServer::ObjectId* long_to_ObjectId (CORBA::Long id
+ ACE_ENV_ARG_DECL) const;
+
+protected:
+ /// POA
+ PortableServer::POA_var poa_;
+
+ /// ID Factory for objects.
+ TAO_Notify_ID_Factory id_factory_;
+};
+
+TAO_END_VERSIONED_NAMESPACE_DECL
+
+#if defined (__ACE_INLINE__)
+#include "orbsvcs/Notify/POA_Helper.inl"
+#endif /* __ACE_INLINE__ */
+
+#include /**/ "ace/post.h"
+
+#endif /* TAO_Notify_POA_Helper_H */
diff --git a/TAO/orbsvcs/orbsvcs/Notify/POA_Helper.inl b/TAO/orbsvcs/orbsvcs/Notify/POA_Helper.inl
new file mode 100644
index 00000000000..dc559fb00c4
--- /dev/null
+++ b/TAO/orbsvcs/orbsvcs/Notify/POA_Helper.inl
@@ -0,0 +1,13 @@
+// -*- C++ -*-
+//
+// $Id$
+
+TAO_BEGIN_VERSIONED_NAMESPACE_DECL
+
+ACE_INLINE PortableServer::POA_ptr
+TAO_Notify_POA_Helper::poa (void)
+{
+ return this->poa_.in ();
+}
+
+TAO_END_VERSIONED_NAMESPACE_DECL
diff --git a/TAO/orbsvcs/orbsvcs/Notify/Peer.cpp b/TAO/orbsvcs/orbsvcs/Notify/Peer.cpp
new file mode 100644
index 00000000000..6caa4aa6552
--- /dev/null
+++ b/TAO/orbsvcs/orbsvcs/Notify/Peer.cpp
@@ -0,0 +1,125 @@
+// $Id$
+
+#include "orbsvcs/Notify/Peer.h"
+
+ACE_RCSID(Notify, TAO_Notify_Peer, "$Id$")
+
+#include "orbsvcs/Notify/Proxy.h"
+
+#include "tao/debug.h"
+
+TAO_BEGIN_VERSIONED_NAMESPACE_DECL
+
+TAO_Notify_Peer::TAO_Notify_Peer (void)
+{
+}
+
+TAO_Notify_Peer::~TAO_Notify_Peer ()
+{
+}
+
+void
+TAO_Notify_Peer::qos_changed (const TAO_Notify_QoSProperties& /*qos_properties*/)
+{
+ // NOP.
+}
+
+void
+TAO_Notify_Peer::shutdown (ACE_ENV_SINGLE_ARG_DECL_NOT_USED)
+{
+ // NOP.
+}
+
+void
+TAO_Notify_Peer::handle_dispatch_exception (ACE_ENV_SINGLE_ARG_DECL)
+{
+ // Sever all association when a remote client misbehaves. Other strategies like reties are possible but not implemented.
+ this->proxy ()->destroy (ACE_ENV_SINGLE_ARG_PARAMETER);
+}
+
+void
+TAO_Notify_Peer::dispatch_updates (const TAO_Notify_EventTypeSeq & added, const TAO_Notify_EventTypeSeq & removed ACE_ENV_ARG_DECL)
+{
+ TAO_Notify_EventTypeSeq subscribed_types ;
+ this->proxy ()->subscribed_types (subscribed_types ACE_ENV_ARG_PARAMETER);
+ ACE_CHECK;
+
+ ACE_TRY
+ {
+ CosNotification::EventTypeSeq cos_added;
+ CosNotification::EventTypeSeq cos_removed;
+
+ const TAO_Notify_EventType& special = TAO_Notify_EventType::special ();
+
+ // Don;t inform of types that we already know about.
+ // E.g. if we're subscribed for {A,B,C,F}
+ // and we receive an update with added list {A,B,G}
+ // then, we should only send {G} because peer already knows about {A, B}
+ // However if we're subscribed for everything, send all kinds of adds.
+
+ // Don;t inform of removed types that we don;t care about.
+ // e.g. if we're currently subscribed for {A,B,C,F}
+ // and we receive an update with removed list {A, B, D}
+ // then, we should only send {A,B} because the peer is not interested in D.
+ // However if we're subscribed for everything, send all kinds of removes.
+
+ TAO_Notify_EventTypeSeq added_result = added;
+ TAO_Notify_EventTypeSeq removed_result;
+
+ if (subscribed_types.find (special) != 0)
+ {
+ added_result.remove_seq (subscribed_types);
+ removed_result.intersection (subscribed_types, removed);
+ }
+ else
+ {
+ removed_result = removed;
+ }
+
+ added_result.populate_no_special (cos_added);
+ removed_result.populate_no_special (cos_removed);
+
+ if (cos_added.length () != 0 || cos_removed.length () != 0)
+ {
+ // Protect this object from being destroyed in this scope.
+ TAO_Notify_Proxy::Ptr proxy_guard(this->proxy ());
+
+ this->dispatch_updates_i (cos_added, cos_removed ACE_ENV_ARG_PARAMETER);
+ ACE_TRY_CHECK;
+ }
+ }
+ ACE_CATCH (CORBA::OBJECT_NOT_EXIST, not_exist)
+ {
+ this->handle_dispatch_exception (ACE_ENV_SINGLE_ARG_PARAMETER);
+ ACE_TRY_CHECK;
+ }
+ ACE_CATCH (CORBA::NO_IMPLEMENT, no_impl)
+ {
+ // The peer does not implement the offer/subscription_change method
+ // Do nothing. Later, perhaps set a flag that helps us decide if we should dispatch_updates_i.
+ }
+ ACE_CATCH (CORBA::SystemException, sysex)
+ {
+ this->handle_dispatch_exception (ACE_ENV_SINGLE_ARG_PARAMETER);
+ ACE_TRY_CHECK;
+ }
+ ACE_CATCHANY
+ {
+ // Do nothing
+ }
+ ACE_ENDTRY;
+}
+
+CORBA::ULong
+TAO_Notify_Peer::_incr_refcnt (void)
+{
+ return this->proxy ()->_incr_refcnt ();
+}
+
+CORBA::ULong
+TAO_Notify_Peer::_decr_refcnt (void)
+{
+ return this->proxy ()->_decr_refcnt ();
+}
+
+TAO_END_VERSIONED_NAMESPACE_DECL
diff --git a/TAO/orbsvcs/orbsvcs/Notify/Peer.h b/TAO/orbsvcs/orbsvcs/Notify/Peer.h
new file mode 100644
index 00000000000..142ef4484cf
--- /dev/null
+++ b/TAO/orbsvcs/orbsvcs/Notify/Peer.h
@@ -0,0 +1,85 @@
+// -*- C++ -*-
+
+/**
+ * @file Peer.h
+ *
+ * $Id$
+ *
+ * @author Pradeep Gore <pradeep@oomworks.com>
+ */
+
+#ifndef TAO_Notify_PEER_H
+#define TAO_Notify_PEER_H
+#include /**/ "ace/pre.h"
+
+#include "orbsvcs/Notify/notify_serv_export.h"
+
+#if !defined (ACE_LACKS_PRAGMA_ONCE)
+# pragma once
+#endif /* ACE_LACKS_PRAGMA_ONCE */
+
+#include "orbsvcs/CosNotificationC.h"
+#include "orbsvcs/Notify/EventTypeSeq.h"
+
+TAO_BEGIN_VERSIONED_NAMESPACE_DECL
+
+class TAO_Notify_Proxy;
+class TAO_Notify_QoSProperties;
+class TAO_Notify_Peer;
+
+/**
+ * @class TAO_Notify_Peer
+ *
+ * @brief Base class for Supplier and Consumer classes.
+ * This object delegates its reference count to its creator proxy object.
+ *
+ */
+class TAO_Notify_Serv_Export TAO_Notify_Peer
+{
+public:
+ typedef TAO_Notify_Refcountable_Guard_T< TAO_Notify_Peer > Ptr;
+ /// Constuctor
+ TAO_Notify_Peer (void);
+
+ /// Destructor
+ virtual ~TAO_Notify_Peer ();
+
+ /// This method sigantures deliberately match the RefCounting methods required for ESF Proxy
+ CORBA::ULong _incr_refcnt (void);
+ CORBA::ULong _decr_refcnt (void);
+
+ /// Shutdown the peer.
+ virtual void shutdown (ACE_ENV_SINGLE_ARG_DECL);
+
+ /// Access Proxy.
+ virtual TAO_Notify_Proxy* proxy (void) = 0;
+
+ // Dispatch updates
+ virtual void dispatch_updates (const TAO_Notify_EventTypeSeq & added,
+ const TAO_Notify_EventTypeSeq & removed
+ ACE_ENV_ARG_DECL);
+
+ /// QoS changed notification from the Peer.
+ virtual void qos_changed (const TAO_Notify_QoSProperties& qos_properties);
+
+ /// Handle dispatch exceptions.
+ void handle_dispatch_exception (ACE_ENV_SINGLE_ARG_DECL);
+
+ /// Retrieve the ior of this peer
+ virtual ACE_CString get_ior (void) const = 0;
+
+protected:
+ /// Implementation of Peer specific dispatch_updates
+ virtual void dispatch_updates_i (const CosNotification::EventTypeSeq& added,
+ const CosNotification::EventTypeSeq& removed
+ ACE_ENV_ARG_DECL) = 0;
+
+private:
+ /// Release
+ virtual void release (void) = 0;
+};
+
+TAO_END_VERSIONED_NAMESPACE_DECL
+
+#include /**/ "ace/post.h"
+#endif /* TAO_Notify_PEER_H */
diff --git a/TAO/orbsvcs/orbsvcs/Notify/Persistent_File_Allocator.cpp b/TAO/orbsvcs/orbsvcs/Notify/Persistent_File_Allocator.cpp
new file mode 100644
index 00000000000..18cda388126
--- /dev/null
+++ b/TAO/orbsvcs/orbsvcs/Notify/Persistent_File_Allocator.cpp
@@ -0,0 +1,400 @@
+// $Id$
+
+#include "orbsvcs/Notify/Persistent_File_Allocator.h"
+
+#include "tao/debug.h"
+#include "ace/OS_NS_string.h"
+
+//#define DEBUG_LEVEL 9
+#ifndef DEBUG_LEVEL
+# define DEBUG_LEVEL TAO_debug_level
+#endif //DEBUG_LEVEL
+
+TAO_BEGIN_VERSIONED_NAMESPACE_DECL
+
+namespace TAO_Notify
+{
+
+Persistent_Callback::~Persistent_Callback()
+{
+}
+
+Persistent_Storage_Block::Persistent_Storage_Block(const size_t block_number,
+ const size_t block_size)
+ : block_number_(block_number)
+ , no_write_(false)
+ , sync_(false)
+ , block_size_(block_size)
+ , callback_(0)
+ , allocator_owns_(true)
+{
+ ACE_NEW(this->data_, unsigned char[this->block_size_]);
+ ACE_OS::memset(this->data_, 0, this->block_size_);
+
+}
+
+Persistent_Storage_Block::Persistent_Storage_Block(
+ const Persistent_Storage_Block& psb)
+ : block_number_(psb.block_number_)
+ , no_write_(psb.no_write_)
+ , sync_(psb.sync_)
+ , block_size_(psb.block_size_)
+ , callback_(psb.callback_)
+ , allocator_owns_(psb.allocator_owns_)
+{
+ ACE_NEW(this->data_, unsigned char[this->block_size_]);
+ ACE_OS::memcpy(this->data_, psb.data(), this->block_size_);
+}
+
+Persistent_Storage_Block::~Persistent_Storage_Block()
+{
+ delete [] this->data_;
+ this->data_ = 0;
+}
+
+void
+Persistent_Storage_Block::set_no_write()
+{
+ this->no_write_ = true;
+ this->reassign_data(0, true);
+}
+
+bool
+Persistent_Storage_Block::get_no_write()
+{
+ return this->no_write_;
+}
+
+void
+Persistent_Storage_Block::set_sync()
+{
+ this->sync_ = true;
+}
+
+bool
+Persistent_Storage_Block::get_sync() const
+{
+ return this->sync_;
+}
+
+size_t
+Persistent_Storage_Block::block_number() const
+{
+ return this->block_number_;
+}
+
+unsigned char*
+Persistent_Storage_Block::data() const
+{
+ return this->data_;
+}
+
+void
+Persistent_Storage_Block::reassign_data(unsigned char* newptr,
+ bool delete_old)
+{
+ if (delete_old)
+ {
+ delete [] this->data_;
+ }
+ this->data_ = newptr;
+}
+
+void
+Persistent_Storage_Block::set_callback(Persistent_Callback* callback)
+{
+ this->callback_ = callback;
+}
+
+Persistent_Callback*
+Persistent_Storage_Block::get_callback() const
+{
+ return this->callback_;
+}
+
+void
+Persistent_Storage_Block::set_allocator_owns(bool allocator_owns)
+{
+ this->allocator_owns_ = allocator_owns;
+}
+
+bool
+Persistent_Storage_Block::get_allocator_owns() const
+{
+ return this->allocator_owns_;
+}
+
+Persistent_File_Allocator::Persistent_File_Allocator()
+ : pstore_()
+ , terminate_thread_(false)
+ , thread_active_(false)
+ , wake_up_thread_(queue_lock_)
+{
+}
+
+Persistent_File_Allocator::~Persistent_File_Allocator()
+{
+ this->shutdown_thread();
+}
+
+bool
+Persistent_File_Allocator::open (const ACE_TCHAR* filename,
+ const size_t block_size)
+{
+ bool file_opened = this->pstore_.open(filename, block_size);
+ if (file_opened)
+ {
+ this->thread_active_ = true;
+ this->thread_manager_.spawn(this->thr_func, this);
+ }
+ return file_opened;
+}
+
+void
+Persistent_File_Allocator::shutdown()
+{
+ this->shutdown_thread();
+}
+
+Persistent_Storage_Block*
+Persistent_File_Allocator::allocate()
+{
+ Persistent_Storage_Block* result = 0;
+ size_t block_number = 0;
+ ACE_GUARD_RETURN (ACE_SYNCH_MUTEX, ace_mon, this->lock_, 0);
+ if (!this->allocate_block(block_number))
+ {
+ //@@todo: this should never happen
+ // why not. What if the disk is full? Oh, I see we
+ // allocate non-existent blocks. FIX this
+ }
+ if (DEBUG_LEVEL > 0) ACE_DEBUG ((LM_DEBUG,
+ ACE_TEXT ("(%P|%t) Persistent_File_Allocator::allocate: %d\n"),
+ static_cast<int> (block_number)
+ ));
+ result = this->allocate_at(block_number);
+ return result;
+}
+
+Persistent_Storage_Block*
+Persistent_File_Allocator::allocate_at(size_t block_number)
+{
+ Persistent_Storage_Block* result = 0;
+ this->used(block_number);
+ if (DEBUG_LEVEL > 0) ACE_DEBUG ((LM_DEBUG,
+ ACE_TEXT ("(%P|%t) Persistent_File_Allocator::allocate at : %d\n"),
+ static_cast<int> (block_number)
+ ));
+ ACE_NEW_RETURN(result, Persistent_Storage_Block(
+ block_number,
+ this->block_size()),
+ 0);
+ return result;
+}
+
+Persistent_Storage_Block*
+Persistent_File_Allocator::allocate_nowrite()
+{
+ Persistent_Storage_Block* result = 0;
+ ACE_NEW_RETURN (result,
+ Persistent_Storage_Block (static_cast<size_t> (~0), 0),
+ 0);
+ result->set_no_write();
+
+ return result;
+}
+
+void
+Persistent_File_Allocator::used(size_t block_number)
+{
+ ACE_GUARD (ACE_SYNCH_MUTEX, ace_mon, this->free_blocks_lock_);
+ if (DEBUG_LEVEL > 0) ACE_DEBUG ((LM_DEBUG,
+ ACE_TEXT ("(%P|%t) Persistent_File_Allocator::used: %d\n"),
+ static_cast<int> (block_number)
+ ));
+ ACE_ASSERT (!this->free_blocks_.is_set (block_number));
+ this->free_blocks_.set_bit(block_number, true);
+}
+
+void
+Persistent_File_Allocator::free(size_t block_number)
+{
+ if (DEBUG_LEVEL > 0) ACE_DEBUG ((LM_DEBUG,
+ ACE_TEXT ("(%P|%t) Persistent_File_Allocator::free: %d\n"),
+ static_cast<int> (block_number)
+ ));
+ ACE_ASSERT (this->free_blocks_.is_set (block_number));
+ this->free_block(block_number);
+}
+
+size_t
+Persistent_File_Allocator::block_size() const
+{
+ return pstore_.block_size();
+}
+
+bool
+Persistent_File_Allocator::read(Persistent_Storage_Block* psb)
+{
+ bool result = this->thread_active_;
+ bool cached = false;
+ if (result)
+ {
+ Persistent_Storage_Block** psbtemp = 0;
+ {
+ ACE_GUARD_RETURN (ACE_SYNCH_MUTEX, ace_mon, this->queue_lock_, false);
+ size_t queue_size = this->block_queue_.size();
+ for (size_t idx = 0; !cached && (idx < queue_size); ++idx)
+ {
+ // We want to start at the end of the queue and work backwards...
+ size_t actual_block = (queue_size - idx) - 1;
+ if (0 == this->block_queue_.get(psbtemp, actual_block))
+ {
+ cached = ((*psbtemp)->block_number() == psb->block_number());
+ }
+ }
+ // this needs to be done in the guarded section
+ if (cached && (0 != psbtemp))
+ {
+ ACE_OS::memcpy(psb->data(), (*psbtemp)->data(), this->block_size());
+ }
+ }
+ if (!cached)
+ {
+ result = pstore_.read(psb->block_number(), psb->data());
+ }
+ }
+ return result;
+}
+
+bool
+Persistent_File_Allocator::write(Persistent_Storage_Block* psb)
+{
+ bool result = this->thread_active_;
+ if (result)
+ {
+ Persistent_Storage_Block* ourpsb = psb;
+ if (!psb->get_allocator_owns())
+ {
+ if (DEBUG_LEVEL) ACE_DEBUG ((LM_DEBUG,
+ ACE_TEXT ("(%P|%t) Copy PSB %d\n")
+ , static_cast<int> (psb->block_number ())
+ ));
+ ACE_NEW_RETURN(ourpsb, Persistent_Storage_Block(*psb), false);
+ ourpsb->set_allocator_owns(true);
+ }
+ ACE_GUARD_RETURN (ACE_SYNCH_MUTEX, ace_mon, this->queue_lock_, false);
+ if (DEBUG_LEVEL) ACE_DEBUG ((LM_DEBUG,
+ ACE_TEXT ("(%P|%t) Queueing PSB to write block %d\n")
+ , static_cast<int> (psb->block_number ())
+ ));
+ result = (0 == this->block_queue_.enqueue_tail(ourpsb));
+ this->wake_up_thread_.signal();
+ }
+ return result;
+}
+
+void
+Persistent_File_Allocator::free_block(const size_t block_number)
+{
+ ACE_GUARD (ACE_SYNCH_MUTEX, ace_mon, this->free_blocks_lock_);
+ ACE_ASSERT (this->free_blocks_.is_set (block_number));
+ this->free_blocks_.set_bit(block_number, false);
+}
+
+bool
+Persistent_File_Allocator::allocate_block(size_t& block_number)
+{
+ ACE_GUARD_RETURN (ACE_SYNCH_MUTEX, ace_mon, this->free_blocks_lock_, 0);
+ block_number = this->free_blocks_.find_first_bit(false);
+ return true;
+}
+
+ACE_THR_FUNC_RETURN
+Persistent_File_Allocator::thr_func(void * arg)
+{
+ Persistent_File_Allocator* pfa = static_cast<Persistent_File_Allocator*> (arg);
+ pfa->run();
+ return 0;
+}
+
+size_t
+Persistent_File_Allocator::file_size () const
+{
+ return this->pstore_.size ();
+}
+
+void
+Persistent_File_Allocator::shutdown_thread()
+{
+ if (this->thread_active_)
+ {
+ {
+ ACE_GUARD (ACE_SYNCH_MUTEX, ace_mon, this->queue_lock_);
+ this->terminate_thread_ = true;
+ this->wake_up_thread_.signal();
+ }
+ this->thread_manager_.close();
+ ACE_ASSERT (!this->terminate_thread_);
+ ACE_ASSERT (!this->thread_active_);
+ }
+}
+
+void
+Persistent_File_Allocator::run()
+{
+ // We need this because we could be working on writing data
+ // when a call to terminate comes in!
+ bool do_more_work = true;
+ while (do_more_work)
+ {
+ do_more_work = false;
+ Persistent_Storage_Block * blk = 0;
+ {
+ ACE_GUARD (ACE_SYNCH_MUTEX, ace_mon, this->queue_lock_);
+ while (this->block_queue_.is_empty() && !terminate_thread_)
+ {
+ this->wake_up_thread_.wait();
+ }
+ // Awkward interface to peek at head of unbounded queue
+ Persistent_Storage_Block ** pblk = 0;
+ if (0 == this->block_queue_.get(pblk))
+ {
+ do_more_work = true;
+ blk = *pblk;
+ }
+ }
+ if (0 != blk)
+ {
+ Persistent_Callback *callback = blk->get_callback();
+ if (!blk->get_no_write())
+ {
+ pstore_.write(blk->block_number(), blk->data(), blk->get_sync());
+ }
+ {
+ Persistent_Storage_Block * blk2 = 0;
+ ACE_GUARD (ACE_SYNCH_MUTEX, ace_mon, this->queue_lock_);
+ this->block_queue_.dequeue_head (blk2);
+ // if this triggers, someone pushed onto the head of the queue
+ // or removed the head from the queue without telling ME.
+ ACE_ASSERT (blk2 == blk);
+ }
+ // If we own the block, then delete it.
+ if (blk->get_allocator_owns())
+ {
+ delete blk;
+ blk = 0;
+ }
+ if (0 != callback)
+ {
+ callback->persist_complete();
+ }
+ }
+ }
+ this->terminate_thread_ = false;
+ this->thread_active_ = false;
+}
+
+} /* namespace TAO_Notify */
+
+TAO_END_VERSIONED_NAMESPACE_DECL
diff --git a/TAO/orbsvcs/orbsvcs/Notify/Persistent_File_Allocator.h b/TAO/orbsvcs/orbsvcs/Notify/Persistent_File_Allocator.h
new file mode 100644
index 00000000000..718be6e8f54
--- /dev/null
+++ b/TAO/orbsvcs/orbsvcs/Notify/Persistent_File_Allocator.h
@@ -0,0 +1,208 @@
+// -*- C++ -*-
+
+//=============================================================================
+/**
+ * @file Persistent_File_Allocator.h
+ *
+ * $Id$
+ *
+ * A Persistent_File_Allocator manages a free list and allocates and
+ * deallocates blocks from a Random_File. There should be only one
+ * Persistent_File_Allocator for each Random_File.
+ *
+ * @author Jonathan Pollack <pollack_j@ociweb.com>
+ */
+//=============================================================================
+
+#ifndef PERSISTENT_FILE_ALLOCATOR_H
+#define PERSISTENT_FILE_ALLOCATOR_H
+#include /**/ "ace/pre.h"
+#include /**/ "ace/config-all.h"
+
+#if !defined (ACE_LACKS_PRAGMA_ONCE)
+#pragma once
+#endif /* ACE_LACKS_PRAGMA_ONCE */
+
+#include "orbsvcs/Notify/notify_serv_export.h"
+#include "orbsvcs/Notify/Random_File.h"
+#include "orbsvcs/Notify/Bit_Vector.h"
+#include "ace/Containers_T.h"
+#include "ace/Unbounded_Queue.h"
+#include "ace/Thread_Manager.h"
+
+TAO_BEGIN_VERSIONED_NAMESPACE_DECL
+
+namespace TAO_Notify
+{
+
+/// \brief An interface to allow callbacks on completion of persistent storage
+/// requests.
+class TAO_Notify_Serv_Export Persistent_Callback
+{
+public:
+ virtual ~Persistent_Callback();
+ /// \brief Called by a Persistent_File_Allocator when a write request has
+ /// completed.
+ virtual void persist_complete() = 0;
+};
+
+/**
+ * \brief A class to represent a block on disk.
+ *
+ * Contains the raw data to be written on disk as well as
+ * positioning information, synchronization information, and a pointer
+ * to a callback.
+ */
+class TAO_Notify_Serv_Export Persistent_Storage_Block
+{
+public:
+ /// The constructor. Initializes the callback to NULL.
+ Persistent_Storage_Block(
+ const size_t block_number,
+ const size_t block_size);
+ /// The copy constructor. Makes a deep copy of the passed in PSB.
+ Persistent_Storage_Block(const Persistent_Storage_Block& psb);
+ /// The destructor.
+ ~Persistent_Storage_Block();
+
+ /// Set our block to not have any data at all - a no-op. This can be
+ /// used to implement a checkpoint in the write stream.
+ void set_no_write();
+ /// Find out whether we have data to be written.
+ bool get_no_write();
+
+ /// Set our block to be written as a near-atomic operation.
+ void set_sync();
+ /// Find out whether this block should be written near-atomically.
+ bool get_sync() const;
+
+ /// Find out our physical block number.
+ size_t block_number() const;
+
+ /// Return our data to the user.
+ unsigned char* data() const;
+ /// Set our data pointer, and optionally delete it.
+ void reassign_data(unsigned char* newptr, bool delete_old = false);
+
+ /// Return block number and relinquish ownership.
+ size_t detach ();
+
+ /// Set our callback.
+ void set_callback(Persistent_Callback* callback);
+ /// Get our callback.
+ Persistent_Callback* get_callback() const;
+
+ /// Set ownership of this PSB.
+ void set_allocator_owns(bool allocator_owns = true);
+ /// Get ownership status of this PSB.
+ bool get_allocator_owns() const;
+
+private:
+ /// Our raw data.
+ unsigned char* data_;
+ /// The block number corresponding to our data.
+ size_t block_number_;
+ /// Are we a no-op with just a callback?
+ bool no_write_;
+ /// Write in near-atomic fashion.
+ bool sync_;
+ /// The size of our block.
+ size_t block_size_;
+ /// Our optional callback function, to be used in such things as state
+ /// transitions.
+ Persistent_Callback* callback_;
+ /// Does the allocator obtain ownership of our block?
+ bool allocator_owns_;
+};
+
+/**
+ * \brief A class that manages the details of persistent storage.
+ *
+ * Maintains a free list, write queue, allocations of new
+ * blocks, reads, and writes. This class also manages a thread that performs
+ * background updating of a Random_File.
+ * @@todo this is too much for one class to do. It should be refactored.
+ * @@todo: we shouldn't arbitrarily use a thread.
+ */
+class TAO_Notify_Serv_Export Persistent_File_Allocator
+{
+public:
+ /// The constructor.
+ Persistent_File_Allocator();
+ /// The destructor.
+ ~Persistent_File_Allocator();
+
+ bool open (const ACE_TCHAR* filename,
+ const size_t block_size = 512);
+
+ /// \brief Wait for pending I/O and terminate our work thread.
+ void shutdown();
+
+ /// Allocate a new Persistent_Storage_Block and initialize it to an unused
+ /// block of storage.
+ Persistent_Storage_Block* allocate();
+
+ /// \brief Allocate a new Persistent_Storage_Block at a given address
+ Persistent_Storage_Block* allocate_at(size_t block_number);
+
+ /// \brief Allocate a PSB that is marked to not persist
+ Persistent_Storage_Block* allocate_nowrite();
+
+ /// \brief Mark a block as used, removing it from the free list.
+ void used(size_t block_number);
+
+ /// \brief Mark a block number as able to be used again.
+ void free(size_t block_number);
+
+ /// \brief Access block size.
+ size_t block_size() const;
+
+ /// \brief Read data into a PSB.
+ ///
+ /// Data will come either from the queue of blocks to be written, or
+ /// it will be read from the file if there are no queued write requests for
+ /// this block.
+ bool read(Persistent_Storage_Block* psb);
+
+ /// \brief Write this block to the file,
+ ///
+ /// Add the Persistent_Storage_Block to our write queue and let the
+ /// worker thread handle writing this to the Random_File.
+ bool write(Persistent_Storage_Block* psb);
+
+ /// for information (unit test) only.
+ size_t file_size () const;
+
+private:
+ /// Free a previously assigned block.
+ void free_block(const size_t block_number);
+ /// Find and allocate a free block.
+ bool allocate_block(size_t& block_number);
+
+ /// Used during thread startup to cast us back to ourselves and call the
+ /// run() method.
+ static ACE_THR_FUNC_RETURN thr_func(void * arg);
+ /// Wait for pending I/O to complete and shut our worker thread down safely.
+ void shutdown_thread();
+ /// The worker's execution thread.
+ void run();
+
+private:
+ ACE_Thread_Manager thread_manager_;
+ Random_File pstore_;
+ Bit_Vector free_blocks_;
+ ACE_Unbounded_Queue<Persistent_Storage_Block*> block_queue_;
+ ACE_SYNCH_MUTEX lock_;
+ ACE_SYNCH_MUTEX free_blocks_lock_;
+ ACE_SYNCH_MUTEX queue_lock_;
+ bool terminate_thread_;
+ bool thread_active_;
+ ACE_SYNCH_CONDITION wake_up_thread_;
+};
+
+} /* namespace TAO_Notify */
+
+TAO_END_VERSIONED_NAMESPACE_DECL
+
+#include /**/ "ace/post.h"
+#endif /* PERSISTENT_FILE_ALLOCATOR_H */
diff --git a/TAO/orbsvcs/orbsvcs/Notify/Properties.cpp b/TAO/orbsvcs/orbsvcs/Notify/Properties.cpp
new file mode 100644
index 00000000000..798f24fb7f1
--- /dev/null
+++ b/TAO/orbsvcs/orbsvcs/Notify/Properties.cpp
@@ -0,0 +1,44 @@
+// $Id$
+
+#include "orbsvcs/Notify/Properties.h"
+#include "orbsvcs/NotifyExtC.h"
+#include "tao/debug.h"
+
+#if ! defined (__ACE_INLINE__)
+#include "orbsvcs/Notify/Properties.inl"
+#endif /* __ACE_INLINE__ */
+
+ACE_RCSID (Notify,
+ TAO_Notify_Properties,
+ "$Id$")
+
+TAO_BEGIN_VERSIONED_NAMESPACE_DECL
+
+TAO_Notify_Properties::TAO_Notify_Properties (void)
+ : factory_ (0)
+ , builder_ (0)
+ , asynch_updates_ (0)
+ , allow_reconnect_ (false)
+ , updates_ (1)
+{
+ // In case no conf. file is specified, the EC will default to reactive concurrency.
+ NotifyExt::ThreadPoolParams tp_params =
+ {NotifyExt::CLIENT_PROPAGATED,0, 0, 0, 0, 0, 0, 0,0};
+
+ this->ec_qos_.length (1);
+ this->ec_qos_[0].name = CORBA::string_dup (NotifyExt::ThreadPool);
+ this->ec_qos_[0].value <<= tp_params;
+
+ if (TAO_debug_level > 1)
+ ACE_DEBUG ((LM_DEBUG, "in TAO_Properties ctos %x\n", this));
+}
+
+TAO_Notify_Properties::~TAO_Notify_Properties ()
+{
+}
+
+#if defined (ACE_HAS_EXPLICIT_STATIC_TEMPLATE_MEMBER_INSTANTIATION)
+template class TAO_Singleton<TAO_Notify_Properties, ACE_Thread_Mutex> *TAO_Singleton<TAO_Notify_Properties, ACE_Thread_Mutex>::singleton_;
+#endif /* ACE_HAS_EXPLICIT_STATIC_TEMPLATE_MEMBER_INSTANTIATION */
+
+TAO_END_VERSIONED_NAMESPACE_DECL
diff --git a/TAO/orbsvcs/orbsvcs/Notify/Properties.h b/TAO/orbsvcs/orbsvcs/Notify/Properties.h
new file mode 100644
index 00000000000..7ab3ec74637
--- /dev/null
+++ b/TAO/orbsvcs/orbsvcs/Notify/Properties.h
@@ -0,0 +1,155 @@
+// -*- C++ -*-
+
+/**
+ * @file Properties.h
+ *
+ * $Id$
+ *
+ * @author Pradeep Gore <pradeep@oomworks.com>
+ */
+
+#ifndef TAO_Notify_PROPERTIES_H
+#define TAO_Notify_PROPERTIES_H
+
+#include /**/ "ace/pre.h"
+
+#include "orbsvcs/Notify/notify_serv_export.h"
+
+#if !defined (ACE_LACKS_PRAGMA_ONCE)
+# pragma once
+#endif /* ACE_LACKS_PRAGMA_ONCE */
+
+#include "orbsvcs/CosNotificationC.h"
+
+#include "tao/PortableServer/PortableServer.h"
+
+#include "tao/TAO_Singleton.h"
+#include "tao/ORB.h"
+
+TAO_BEGIN_VERSIONED_NAMESPACE_DECL
+
+class TAO_Notify_Factory;
+class TAO_Notify_Builder;
+
+/**
+ * @class TAO_Notify_Properties
+ *
+ * @brief Global properties that strategize Notify's run-time behaviour.
+ *
+ */
+class TAO_Notify_Serv_Export TAO_Notify_Properties
+{
+public:
+ /// Constuctor
+ TAO_Notify_Properties (void);
+
+ /// Destructor
+ ~TAO_Notify_Properties ();
+
+ // = Property Accessors
+ TAO_Notify_Factory* factory (void);
+ void factory (TAO_Notify_Factory* factory);
+
+ TAO_Notify_Builder* builder (void);
+ void builder (TAO_Notify_Builder* builder);
+
+ CORBA::ORB_ptr orb (void);
+ void orb (CORBA::ORB_ptr orb);
+
+ PortableServer::POA_ptr default_poa (void);
+ void default_poa (PortableServer::POA_ptr default_poa);
+
+ CORBA::Boolean asynch_updates (void);
+ void asynch_updates (CORBA::Boolean asynch_updates);
+
+ bool allow_reconnect (void);
+ void allow_reconnect (bool b);
+
+ // Turn on/off update messages.
+ CORBA::Boolean updates (void);
+ void updates (CORBA::Boolean updates);
+
+ // The QoS Property that must be applied to each newly created Event Channel
+ const CosNotification::QoSProperties& default_event_channel_qos_properties (void);
+
+ // Set the default EC QoS Property.
+ void default_event_channel_qos_properties (const CosNotification::QoSProperties &ec_qos);
+
+ // The QoS Property that must be applied to each newly created Supplier Admin
+ const CosNotification::QoSProperties& default_supplier_admin_qos_properties (void);
+
+ // Set the default SA QoS Property.
+ void default_supplier_admin_qos_properties (const CosNotification::QoSProperties &sa_qos);
+
+ // The QoS Property that must be applied to each newly created Consumer Admin
+ const CosNotification::QoSProperties& default_consumer_admin_qos_properties (void);
+
+ // Set the default CA QoS Property.
+ void default_consumer_admin_qos_properties (const CosNotification::QoSProperties &ca_qos);
+
+ // The QoS Property that must be applied to each newly created Proxy Supplier
+ const CosNotification::QoSProperties& default_proxy_supplier_qos_properties (void);
+
+ // Set the default PS QoS Property.
+ void default_proxy_supplier_qos_properties (const CosNotification::QoSProperties &ps_qos);
+
+ // The QoS Property that must be applied to each newly created Proxy Consumer
+ const CosNotification::QoSProperties& default_proxy_consumer_qos_properties (void);
+
+ // Set the default PC QoS Property.
+ void default_proxy_consumer_qos_properties (const CosNotification::QoSProperties &pc_qos);
+
+protected:
+ /// Object Factory
+ TAO_Notify_Factory* factory_;
+
+ /// Object Builder
+ TAO_Notify_Builder* builder_;
+
+ /// ORB
+ CORBA::ORB_var orb_;
+
+ // POA
+ PortableServer::POA_var default_poa_;
+
+ /// True if send asynch updates.
+ CORBA::Boolean asynch_updates_;
+
+ /// True if clients can reconnect to proxies.
+ bool allow_reconnect_;
+
+ /// True if updates are enabled (default).
+ CORBA::Boolean updates_;
+
+ /// The Update period for updates.
+ ACE_Time_Value update_period_;
+
+ /// The default EC QoS Properties.
+ CosNotification::QoSProperties ec_qos_;
+
+ /// The default SA QoS Properties.
+ CosNotification::QoSProperties sa_qos_;
+
+ /// The default CA QoS Properties.
+ CosNotification::QoSProperties ca_qos_;
+
+ /// The default PS QoS Properties.
+ CosNotification::QoSProperties ps_qos_;
+
+ /// The default PC QoS Properties.
+ CosNotification::QoSProperties pc_qos_;
+};
+
+TAO_NOTIFY_SERV_SINGLETON_DECLARE (TAO_Singleton, TAO_Notify_Properties, TAO_SYNCH_MUTEX)
+
+typedef TAO_Singleton<TAO_Notify_Properties, TAO_SYNCH_MUTEX> TAO_Notify_PROPERTIES;
+
+TAO_END_VERSIONED_NAMESPACE_DECL
+
+#if defined (__ACE_INLINE__)
+#include "orbsvcs/Notify/Properties.inl"
+#endif /* __ACE_INLINE__ */
+
+#include /**/ "ace/post.h"
+
+#endif /* TAO_Notify_PROPERTIES_H */
diff --git a/TAO/orbsvcs/orbsvcs/Notify/Properties.inl b/TAO/orbsvcs/orbsvcs/Notify/Properties.inl
new file mode 100644
index 00000000000..c53e7087f8e
--- /dev/null
+++ b/TAO/orbsvcs/orbsvcs/Notify/Properties.inl
@@ -0,0 +1,151 @@
+// -*- C++ -*-
+//
+// $Id$
+
+TAO_BEGIN_VERSIONED_NAMESPACE_DECL
+
+ACE_INLINE TAO_Notify_Factory*
+TAO_Notify_Properties::factory (void)
+{
+ return this->factory_;
+}
+
+ACE_INLINE void
+TAO_Notify_Properties::factory (TAO_Notify_Factory* factory)
+{
+ this->factory_ = factory;
+}
+
+ACE_INLINE TAO_Notify_Builder*
+TAO_Notify_Properties::builder (void)
+{
+ return this->builder_;
+}
+
+ACE_INLINE void
+TAO_Notify_Properties::builder (TAO_Notify_Builder* builder)
+{
+ this->builder_ = builder;
+}
+
+ACE_INLINE CORBA::ORB_ptr
+TAO_Notify_Properties::orb (void)
+{
+ return CORBA::ORB::_duplicate (orb_.in ());
+}
+
+ACE_INLINE void
+TAO_Notify_Properties::orb (CORBA::ORB_ptr orb)
+{
+ orb_ = CORBA::ORB::_duplicate (orb);
+}
+
+ACE_INLINE PortableServer::POA_ptr
+TAO_Notify_Properties::default_poa (void)
+{
+ return PortableServer::POA::_duplicate (this->default_poa_.in ());
+}
+
+ACE_INLINE void
+TAO_Notify_Properties::default_poa (PortableServer::POA_ptr default_poa)
+{
+ this->default_poa_ = PortableServer::POA::_duplicate (default_poa);
+}
+
+ACE_INLINE CORBA::Boolean
+TAO_Notify_Properties::asynch_updates (void)
+{
+ return this->asynch_updates_;
+}
+
+ACE_INLINE void
+TAO_Notify_Properties::asynch_updates (CORBA::Boolean asynch_updates)
+{
+ this->asynch_updates_ = asynch_updates;
+}
+
+ACE_INLINE bool
+TAO_Notify_Properties::allow_reconnect (void)
+{
+ return this->allow_reconnect_;
+}
+
+ACE_INLINE void
+TAO_Notify_Properties::allow_reconnect (bool b)
+{
+ this->allow_reconnect_ = b;
+}
+
+ACE_INLINE CORBA::Boolean
+TAO_Notify_Properties::updates (void)
+{
+ return this->updates_;
+}
+
+ACE_INLINE void
+TAO_Notify_Properties::updates (CORBA::Boolean updates)
+{
+ this->updates_ = updates;
+}
+
+ACE_INLINE const CosNotification::QoSProperties&
+TAO_Notify_Properties::default_event_channel_qos_properties (void)
+{
+ return this->ec_qos_;
+}
+
+ACE_INLINE void
+TAO_Notify_Properties::default_event_channel_qos_properties (const CosNotification::QoSProperties &ec_qos)
+{
+ this->ec_qos_ = ec_qos;
+}
+
+ACE_INLINE const CosNotification::QoSProperties&
+TAO_Notify_Properties::default_supplier_admin_qos_properties (void)
+{
+ return this->sa_qos_;
+}
+
+ACE_INLINE void
+TAO_Notify_Properties::default_supplier_admin_qos_properties (const CosNotification::QoSProperties &sa_qos)
+{
+ this->sa_qos_ = sa_qos;
+}
+
+ACE_INLINE const CosNotification::QoSProperties&
+TAO_Notify_Properties::default_consumer_admin_qos_properties (void)
+{
+ return this->ca_qos_;
+}
+
+ACE_INLINE void
+TAO_Notify_Properties::default_consumer_admin_qos_properties (const CosNotification::QoSProperties &ca_qos)
+{
+ this->ca_qos_ = ca_qos;
+}
+
+ACE_INLINE const CosNotification::QoSProperties&
+TAO_Notify_Properties::default_proxy_supplier_qos_properties (void)
+{
+ return this->ps_qos_;
+}
+
+ACE_INLINE void
+TAO_Notify_Properties::default_proxy_supplier_qos_properties (const CosNotification::QoSProperties &ps_qos)
+{
+ this->ps_qos_ = ps_qos;
+}
+
+ACE_INLINE const CosNotification::QoSProperties&
+TAO_Notify_Properties::default_proxy_consumer_qos_properties (void)
+{
+ return this->pc_qos_;
+}
+
+ACE_INLINE void
+TAO_Notify_Properties::default_proxy_consumer_qos_properties (const CosNotification::QoSProperties &pc_qos)
+{
+ this->pc_qos_ = pc_qos;
+}
+
+TAO_END_VERSIONED_NAMESPACE_DECL
diff --git a/TAO/orbsvcs/orbsvcs/Notify/Property.h b/TAO/orbsvcs/orbsvcs/Notify/Property.h
new file mode 100644
index 00000000000..2d0ef880733
--- /dev/null
+++ b/TAO/orbsvcs/orbsvcs/Notify/Property.h
@@ -0,0 +1,49 @@
+/* -*- C++ -*- */
+/**
+ * @file Property.h
+ *
+ * $Id$
+ *
+ * @author Pradeep Gore <pradeep@oomworks.com>
+ *
+ *
+ */
+
+#ifndef TAO_Notify_PROPERTY_H
+#define TAO_Notify_PROPERTY_H
+
+#include /**/ "ace/pre.h"
+
+#include "orbsvcs/Notify/notify_serv_export.h"
+
+#if !defined (ACE_LACKS_PRAGMA_ONCE)
+# pragma once
+#endif /* ACE_LACKS_PRAGMA_ONCE */
+
+#include "orbsvcs/NotifyExtC.h"
+
+#include "tao/orbconf.h"
+#include "tao/TimeBaseC.h"
+
+ACE_BEGIN_VERSIONED_NAMESPACE_DECL
+template <class LOCK, class TYPE> class ACE_Atomic_Op;
+ACE_END_VERSIONED_NAMESPACE_DECL
+
+TAO_BEGIN_VERSIONED_NAMESPACE_DECL
+
+template <class TYPE> class TAO_Notify_Property_T;
+template <class TYPE> class TAO_Notify_StructProperty_T;
+
+typedef ACE_Atomic_Op <TAO_SYNCH_MUTEX,CORBA::Long> TAO_Notify_Atomic_Property_Long;
+typedef TAO_Notify_Property_T<CORBA::Long> TAO_Notify_Property_Long;
+typedef TAO_Notify_Property_T<CORBA::ULong> TAO_Notify_Property_ULong;
+typedef TAO_Notify_Property_T<CORBA::Short> TAO_Notify_Property_Short;
+typedef TAO_Notify_Property_T<TimeBase::TimeT> TAO_Notify_Property_Time;
+typedef TAO_Notify_StructProperty_T<NotifyExt::ThreadPoolParams> TAO_Notify_Property_ThreadPool;
+typedef TAO_Notify_StructProperty_T<NotifyExt::ThreadPoolLanesParams> TAO_Notify_Property_ThreadPoolLanes;
+
+TAO_END_VERSIONED_NAMESPACE_DECL
+
+#include /**/ "ace/post.h"
+
+#endif /* TAO_Notify_PROPERTY_H */
diff --git a/TAO/orbsvcs/orbsvcs/Notify/PropertySeq.cpp b/TAO/orbsvcs/orbsvcs/Notify/PropertySeq.cpp
new file mode 100644
index 00000000000..bd8adc484f6
--- /dev/null
+++ b/TAO/orbsvcs/orbsvcs/Notify/PropertySeq.cpp
@@ -0,0 +1,65 @@
+// $Id$
+
+#include "orbsvcs/Notify/PropertySeq.h"
+
+#if ! defined (__ACE_INLINE__)
+#include "orbsvcs/Notify/PropertySeq.inl"
+#endif /* __ACE_INLINE__ */
+
+ACE_RCSID(Notify, TAO_Notify_PropertySeq, "$Id$")
+
+TAO_BEGIN_VERSIONED_NAMESPACE_DECL
+
+TAO_Notify_PropertySeq::TAO_Notify_PropertySeq (void)
+{
+}
+
+TAO_Notify_PropertySeq::~TAO_Notify_PropertySeq ()
+{
+}
+
+int
+TAO_Notify_PropertySeq::init (const CosNotification::PropertySeq& prop_seq)
+{
+ ACE_CString name;
+
+ for (CORBA::ULong i = 0; i < prop_seq.length (); ++i)
+ {
+ name = prop_seq[i].name.in ();
+
+ if (this->property_map_.rebind (name, prop_seq[i].value) == -1)
+ return -1;
+ }
+ // Note call to rebind. This allows to call <init> to set updates.
+
+ return 0;
+}
+
+int
+TAO_Notify_PropertySeq::populate (CosNotification::PropertySeq_var& prop_seq) const
+{
+ PROPERTY_MAP::CONST_ITERATOR iterator (this->property_map_);
+
+ int index = prop_seq->length ();
+ prop_seq->length (static_cast<CORBA::ULong> (index + this->property_map_.current_size ()));
+
+ for (PROPERTY_MAP::ENTRY *entry = 0;
+ iterator.next (entry) != 0;
+ iterator.advance (), ++index)
+ {
+ (*prop_seq)[index].name = CORBA::string_dup (entry->ext_id_.c_str ());
+ (*prop_seq)[index].value = entry->int_id_;
+ }
+
+ return 0;
+}
+
+void
+TAO_Notify_PropertySeq::add(const ACE_CString& name, const CORBA::Any& val)
+{
+ int ret = this->property_map_.rebind (name, val);
+ ACE_ASSERT(ret >= 0);
+ ACE_UNUSED_ARG (ret); // because the assert disappears in release builds
+}
+
+TAO_END_VERSIONED_NAMESPACE_DECL
diff --git a/TAO/orbsvcs/orbsvcs/Notify/PropertySeq.h b/TAO/orbsvcs/orbsvcs/Notify/PropertySeq.h
new file mode 100644
index 00000000000..315aac46a0b
--- /dev/null
+++ b/TAO/orbsvcs/orbsvcs/Notify/PropertySeq.h
@@ -0,0 +1,77 @@
+// -*- C++ -*-
+
+/**
+ * @file PropertySeq.h
+ *
+ * $Id$
+ *
+ * @author Pradeep Gore <pradeep@oomworks.com>
+ */
+
+#ifndef TAO_Notify_PROPERTYSEQ_H
+#define TAO_Notify_PROPERTYSEQ_H
+
+#include /**/ "ace/pre.h"
+
+#include "orbsvcs/Notify/notify_serv_export.h"
+
+#if !defined (ACE_LACKS_PRAGMA_ONCE)
+# pragma once
+#endif /* ACE_LACKS_PRAGMA_ONCE */
+
+#include "orbsvcs/CosNotificationC.h"
+
+#include "ace/Hash_Map_Manager.h"
+#include "ace/SString.h"
+#include "ace/Null_Mutex.h"
+
+TAO_BEGIN_VERSIONED_NAMESPACE_DECL
+
+/**
+ * @class TAO_Notify_PropertySeq
+ *
+ * @brief
+ *
+ */
+class TAO_Notify_Serv_Export TAO_Notify_PropertySeq
+{
+public:
+ /// Constuctor
+ TAO_Notify_PropertySeq (void);
+
+ /// Destructor
+ ~TAO_Notify_PropertySeq ();
+
+ /// Return 0 on success, -1 on error.
+ int init (const CosNotification::PropertySeq& prop_seq);
+
+ /// Find the <value> for property <name>. Returns 0 on success.
+ int find (const char* name, CosNotification::PropertyValue& value) const;
+
+ /// Return -1 on error.
+ int populate (CosNotification::PropertySeq_var& prop_seq) const;
+
+ /// return the number of properties available as a sequence
+ size_t size() const;
+
+protected:
+ /// Add the value. Used by subclasses to initialize the property map from their
+ /// member variables.
+ void add(const ACE_CString& name, const CORBA::Any& val);
+
+protected:
+ /// Property Map.
+ typedef ACE_Hash_Map_Manager <ACE_CString, CosNotification::PropertyValue, ACE_SYNCH_NULL_MUTEX> PROPERTY_MAP;
+
+ PROPERTY_MAP property_map_;
+};
+
+TAO_END_VERSIONED_NAMESPACE_DECL
+
+#if defined (__ACE_INLINE__)
+#include "orbsvcs/Notify/PropertySeq.inl"
+#endif /* __ACE_INLINE__ */
+
+#include /**/ "ace/post.h"
+
+#endif /* TAO_Notify_PROPERTYSEQ_H */
diff --git a/TAO/orbsvcs/orbsvcs/Notify/PropertySeq.inl b/TAO/orbsvcs/orbsvcs/Notify/PropertySeq.inl
new file mode 100644
index 00000000000..043f28ab9b6
--- /dev/null
+++ b/TAO/orbsvcs/orbsvcs/Notify/PropertySeq.inl
@@ -0,0 +1,22 @@
+// -*- C++ -*-
+//
+// $Id$
+
+TAO_BEGIN_VERSIONED_NAMESPACE_DECL
+
+ACE_INLINE int
+TAO_Notify_PropertySeq::find (const char* name,
+ CosNotification::PropertyValue& value) const
+{
+ ACE_CString str_name (name);
+ return this->property_map_.find (str_name, value);
+}
+
+ACE_INLINE
+size_t
+TAO_Notify_PropertySeq::size() const
+{
+ return this->property_map_.current_size();
+}
+
+TAO_END_VERSIONED_NAMESPACE_DECL
diff --git a/TAO/orbsvcs/orbsvcs/Notify/Property_Boolean.cpp b/TAO/orbsvcs/orbsvcs/Notify/Property_Boolean.cpp
new file mode 100644
index 00000000000..378ca42dc41
--- /dev/null
+++ b/TAO/orbsvcs/orbsvcs/Notify/Property_Boolean.cpp
@@ -0,0 +1,47 @@
+// $Id$
+
+#include "orbsvcs/Notify/Property_Boolean.h"
+
+#if ! defined (__ACE_INLINE__)
+#include "orbsvcs/Notify/Property_Boolean.inl"
+#endif /* __ACE_INLINE__ */
+
+ACE_RCSID(Notify, TAO_Notify_Property_Boolean, "$Id$")
+
+#include "orbsvcs/Notify/PropertySeq.h"
+
+TAO_BEGIN_VERSIONED_NAMESPACE_DECL
+
+TAO_Notify_Property_Boolean::TAO_Notify_Property_Boolean (const char* name)
+ : name_ (name), valid_(0)
+{
+}
+
+TAO_Notify_Property_Boolean::TAO_Notify_Property_Boolean (const char* name, CORBA::Boolean initial)
+ :name_ (name), value_ (initial), valid_ (1)
+{
+}
+
+int
+TAO_Notify_Property_Boolean::set (const TAO_Notify_PropertySeq& property_seq)
+{
+ CosNotification::PropertyValue value;
+
+ if (property_seq.find (this->name_, value) == -1)
+ return -1;
+
+ value >>= CORBA::Any::to_boolean (this->value_);
+
+ return 0;
+}
+
+void
+TAO_Notify_Property_Boolean::get (CosNotification::PropertySeq& prop_seq)
+{
+ /// Make space
+ prop_seq.length (prop_seq.length () + 1);
+
+ prop_seq[prop_seq.length () - 1].value <<= CORBA::Any::from_boolean (this->value_);
+}
+
+TAO_END_VERSIONED_NAMESPACE_DECL
diff --git a/TAO/orbsvcs/orbsvcs/Notify/Property_Boolean.h b/TAO/orbsvcs/orbsvcs/Notify/Property_Boolean.h
new file mode 100644
index 00000000000..53c0f441de9
--- /dev/null
+++ b/TAO/orbsvcs/orbsvcs/Notify/Property_Boolean.h
@@ -0,0 +1,89 @@
+// -*- C++ -*-
+
+/**
+ * @file Property_Boolean.h
+ *
+ * $Id$
+ *
+ * @author Pradeep Gore <pradeep@oomworks.com>
+ */
+
+#ifndef TAO_Notify_PROPERTY_BOOLEAN_H
+#define TAO_Notify_PROPERTY_BOOLEAN_H
+
+#include /**/ "ace/pre.h"
+
+#include "orbsvcs/Notify/notify_serv_export.h"
+
+#if !defined (ACE_LACKS_PRAGMA_ONCE)
+# pragma once
+#endif /* ACE_LACKS_PRAGMA_ONCE */
+
+#include "orbsvcs/CosNotificationC.h"
+
+TAO_BEGIN_VERSIONED_NAMESPACE_DECL
+
+class TAO_Notify_PropertySeq;
+
+/**
+ * @class TAO_Notify_Property_Boolean
+ *
+ * @brief Boolean Property.
+ *
+ */
+/*******************************************************************************/
+
+class TAO_Notify_Serv_Export TAO_Notify_Property_Boolean
+{
+public:
+ /// Constuctor
+ TAO_Notify_Property_Boolean (const char* name, CORBA::Boolean initial);
+
+ /// Constuctor
+ TAO_Notify_Property_Boolean (const char* name);
+
+ /// Assignment from TAO_Notify_Property_Boolean
+ TAO_Notify_Property_Boolean& operator= (const TAO_Notify_Property_Boolean& rhs);
+
+ /// Assignment from CORBA::Boolean
+ TAO_Notify_Property_Boolean& operator= (const CORBA::Boolean& rhs);
+
+ /// Equality comparison operator.
+ bool operator== (const CORBA::Boolean &rhs) const;
+
+ /// Inequality comparison operator.
+ bool operator!= (const CORBA::Boolean &rhs) const;
+
+ int set (const TAO_Notify_PropertySeq& property_seq);
+
+ void get (CosNotification::PropertySeq& prop_seq);
+
+ /// Return the name
+ const char * name (void) const;
+
+ /// Return the value.
+ CORBA::Boolean value (void) const;
+
+ /// Is the current value valid
+ CORBA::Boolean is_valid (void) const;
+
+protected:
+ /// The Property name.
+ const char* name_;
+
+ /// The value
+ CORBA::Boolean value_;
+
+ /// Is the value valid
+ CORBA::Boolean valid_;
+};
+
+TAO_END_VERSIONED_NAMESPACE_DECL
+
+#if defined (__ACE_INLINE__)
+#include "orbsvcs/Notify/Property_Boolean.inl"
+#endif /* __ACE_INLINE__ */
+
+#include /**/ "ace/post.h"
+
+#endif /* TAO_Notify_PROPERTY_BOOLEAN_H */
diff --git a/TAO/orbsvcs/orbsvcs/Notify/Property_Boolean.inl b/TAO/orbsvcs/orbsvcs/Notify/Property_Boolean.inl
new file mode 100644
index 00000000000..bccd42bed59
--- /dev/null
+++ b/TAO/orbsvcs/orbsvcs/Notify/Property_Boolean.inl
@@ -0,0 +1,62 @@
+// -*- C++ -*-
+//
+// $Id$
+
+TAO_BEGIN_VERSIONED_NAMESPACE_DECL
+
+ACE_INLINE TAO_Notify_Property_Boolean&
+TAO_Notify_Property_Boolean::operator= (const TAO_Notify_Property_Boolean& rhs)
+{
+ if (this == &rhs)
+ return *this;
+
+ if (rhs.is_valid ())
+ {
+ this->name_ = rhs.name_;
+ this->value_ = rhs.value_;
+ this->valid_ = rhs.valid_;
+ }
+
+ return *this;
+}
+
+ACE_INLINE TAO_Notify_Property_Boolean&
+TAO_Notify_Property_Boolean::operator= (const CORBA::Boolean& value)
+{
+ this->value_ = value;
+
+ return *this;
+}
+
+ACE_INLINE bool
+TAO_Notify_Property_Boolean::operator== (const CORBA::Boolean &rhs) const
+{
+ return (this->value_ == rhs);
+}
+
+ACE_INLINE bool
+TAO_Notify_Property_Boolean::operator!= (const CORBA::Boolean &rhs) const
+{
+ return (this->value_ != rhs);
+}
+
+ACE_INLINE
+const char *
+TAO_Notify_Property_Boolean::name (void) const
+{
+ return this->name_;
+}
+
+ACE_INLINE CORBA::Boolean
+TAO_Notify_Property_Boolean::value (void) const
+{
+ return this->value_;
+}
+
+ACE_INLINE CORBA::Boolean
+TAO_Notify_Property_Boolean::is_valid (void) const
+{
+ return this->valid_;
+}
+
+TAO_END_VERSIONED_NAMESPACE_DECL
diff --git a/TAO/orbsvcs/orbsvcs/Notify/Property_T.cpp b/TAO/orbsvcs/orbsvcs/Notify/Property_T.cpp
new file mode 100644
index 00000000000..75b5675e2d5
--- /dev/null
+++ b/TAO/orbsvcs/orbsvcs/Notify/Property_T.cpp
@@ -0,0 +1,137 @@
+// $Id$
+
+#ifndef TAO_Notify_PROPERTY_T_CPP
+#define TAO_Notify_PROPERTY_T_CPP
+
+#include "orbsvcs/Notify/Property_T.h"
+
+#if ! defined (__ACE_INLINE__)
+#include "orbsvcs/Notify/Property_T.inl"
+#endif /* __ACE_INLINE__ */
+
+ACE_RCSID (Notify,
+ TAO_Notify_Property_T,
+ "$Id$")
+
+#include "orbsvcs/Notify/PropertySeq.h"
+
+TAO_BEGIN_VERSIONED_NAMESPACE_DECL
+
+/*****************************************************************************/
+
+template <class TYPE>
+TAO_Notify_PropertyBase_T<TYPE>::TAO_Notify_PropertyBase_T (const char* name)
+ : name_ (name), valid_(0)
+{
+}
+
+template <class TYPE>
+TAO_Notify_PropertyBase_T<TYPE>::TAO_Notify_PropertyBase_T (const char* name, const TYPE& initial)
+ : name_ (name), value_ (initial), valid_ (1)
+{
+}
+
+template <class TYPE>
+TAO_Notify_PropertyBase_T<TYPE>::TAO_Notify_PropertyBase_T (
+ const TAO_Notify_PropertyBase_T &rhs)
+ : name_ (rhs.name_),
+ value_ (rhs.value_),
+ valid_ (rhs.valid_)
+{
+
+}
+
+template <class TYPE>
+TAO_Notify_PropertyBase_T<TYPE>::~TAO_Notify_PropertyBase_T ()
+{
+}
+
+template <class TYPE> void
+TAO_Notify_PropertyBase_T<TYPE>::get (CosNotification::PropertySeq& prop_seq)
+{
+ /// Make space
+ prop_seq.length (prop_seq.length () + 1);
+
+ prop_seq[prop_seq.length () - 1].value <<= this->value_;
+}
+
+/*******************************************************************************/
+
+template <class TYPE>
+TAO_Notify_Property_T<TYPE>::TAO_Notify_Property_T (const char* name)
+ :TAO_Notify_PropertyBase_T <TYPE> (name)
+{
+}
+
+template <class TYPE>
+TAO_Notify_Property_T<TYPE>::TAO_Notify_Property_T (const char* name, const TYPE& initial)
+ :TAO_Notify_PropertyBase_T <TYPE> (name, initial)
+{
+}
+
+template <class TYPE> int
+TAO_Notify_Property_T<TYPE>::set (const TAO_Notify_PropertySeq& property_seq)
+{
+ CosNotification::PropertyValue value;
+
+ if (property_seq.find (this->name_, value) == 0 && (value >>= this->value_))
+ {
+ this->valid_ = 1;
+ return 0;
+ }
+
+ this->valid_ = 0;
+ return -1;
+}
+
+template <class TYPE> int
+TAO_Notify_Property_T<TYPE>::set(const CosNotification::PropertyValue &value)
+{
+ if (value >>= this->value_)
+ {
+ this->valid_ = 1;
+ return 0;
+ }
+
+ return -1;
+}
+
+/*******************************************************************************/
+
+template <class TYPE>
+TAO_Notify_StructProperty_T<TYPE>::TAO_Notify_StructProperty_T (const char* name)
+ :name_ (name), valid_(0)
+{
+}
+
+template <class TYPE>
+TAO_Notify_StructProperty_T<TYPE>::TAO_Notify_StructProperty_T (const char* name, const TYPE& initial)
+ :name_ (name), value_ (initial), valid_ (1)
+{
+}
+
+template <class TYPE> int
+TAO_Notify_StructProperty_T<TYPE>::set (
+ const TAO_Notify_PropertySeq& property_seq)
+{
+ CosNotification::PropertyValue value;
+
+ if (property_seq.find (this->name_, value) == 0)
+ {
+ TYPE* extract_type = 0;
+
+ if ((value >>= extract_type) && extract_type != 0) // make sure we get something valid.
+ {
+ this->value_ = *extract_type; // copy
+ this->valid_ = 1;
+ return 0;
+ }
+ }
+
+ this->valid_ = 0;
+ return -1;
+}
+
+TAO_END_VERSIONED_NAMESPACE_DECL
+
+#endif /* TAO_Notify_PROPERTY_T_CPP */
diff --git a/TAO/orbsvcs/orbsvcs/Notify/Property_T.h b/TAO/orbsvcs/orbsvcs/Notify/Property_T.h
new file mode 100644
index 00000000000..39a79608659
--- /dev/null
+++ b/TAO/orbsvcs/orbsvcs/Notify/Property_T.h
@@ -0,0 +1,170 @@
+// -*- C++ -*-
+
+/**
+ * @file Property_T.h
+ *
+ * $Id$
+ *
+ * @author Pradeep Gore <pradeep@oomworks.com>
+ */
+
+#ifndef TAO_Notify_PROPERTY_T_H
+#define TAO_Notify_PROPERTY_T_H
+
+#include /**/ "ace/pre.h"
+
+#include "orbsvcs/Notify/notify_serv_export.h"
+
+#if !defined (ACE_LACKS_PRAGMA_ONCE)
+# pragma once
+#endif /* ACE_LACKS_PRAGMA_ONCE */
+
+#include "ace/SString.h"
+
+#include "orbsvcs/CosNotificationC.h"
+
+TAO_BEGIN_VERSIONED_NAMESPACE_DECL
+
+class TAO_Notify_PropertySeq;
+
+/**
+ * @class TAO_Notify_PropertyBase_T
+ *
+ * @brief
+ *
+ */
+template <class TYPE>
+class TAO_Notify_PropertyBase_T
+{
+public:
+ /// Constuctor
+ TAO_Notify_PropertyBase_T (const char* name, const TYPE& initial);
+
+ /// Constuctor
+ TAO_Notify_PropertyBase_T (const char* name);
+
+ /// Copy Constuctor
+ TAO_Notify_PropertyBase_T (const TAO_Notify_PropertyBase_T &rhs);
+
+ /// Destructor
+ ~TAO_Notify_PropertyBase_T ();
+
+ /// Equality comparison operator.
+ bool operator== (const TYPE &rhs) const;
+
+ /// Inequality comparison operator.
+ bool operator!= (const TYPE &rhs) const;
+
+ /// Populate the Property Sequence with this valid value.
+ void get (CosNotification::PropertySeq& prop_seq);
+
+ // assign a new value
+ void assign (const TYPE& value);
+
+ /// Return the value.
+ const TYPE& value (void) const;
+
+ /// Return the name
+ const char * name (void) const;
+
+ /// Is the current value valid
+ CORBA::Boolean is_valid (void) const;
+
+ /// Invalidate this property's value.
+ void invalidate (void);
+
+protected:
+ /// The Property name.
+ const char* name_;
+
+ /// The value
+ TYPE value_;
+
+ /// Is the value valid
+ CORBA::Boolean valid_;
+};
+
+
+/*******************************************************************************/
+/**
+ * @class TAO_Notify_Property_T
+ *
+ * @brief
+ *
+ */
+template <class TYPE>
+class TAO_Notify_Property_T : public TAO_Notify_PropertyBase_T<TYPE>
+{
+public:
+ /// Constuctor
+ TAO_Notify_Property_T (const char* name, const TYPE& initial);
+
+ /// Constuctor
+ TAO_Notify_Property_T (const char* name);
+
+ /// Init this Property from the sequence.
+ /// Returns 0 on success, -1 on error
+ int set (const TAO_Notify_PropertySeq& property_seq);
+
+ /// Init this Property from the CosNotification::PropertyValue
+ /// Returns 0 on success, -1 on error
+ int set (const CosNotification::PropertyValue &value);
+};
+
+/*******************************************************************************/
+/**
+ * @class TAO_Notify_StructProperty_T
+ *
+ * @brief
+ *
+ */
+template <class TYPE>
+class TAO_Notify_StructProperty_T
+{
+public:
+ /// Constuctor
+ TAO_Notify_StructProperty_T (const char* name, const TYPE& initial);
+
+ /// Constuctor
+ TAO_Notify_StructProperty_T (const char* name);
+
+ /// Init this Property from the sequence.
+ /// Returns 0 on success, -1 on error
+ int set (const TAO_Notify_PropertySeq& property_seq);
+
+ /// Return the name
+ const char * name (void) const;
+
+ /// Return the value.
+ const TYPE& value (void) const;
+
+ /// Is the current value valid
+ CORBA::Boolean is_valid (void) const;
+
+protected:
+ /// The Property name.
+ const char* name_;
+
+ /// The value
+ TYPE value_;
+
+ /// Is the value valid
+ CORBA::Boolean valid_;
+};
+
+TAO_END_VERSIONED_NAMESPACE_DECL
+
+#if defined (__ACE_INLINE__)
+#include "orbsvcs/Notify/Property_T.inl"
+#endif /* __ACE_INLINE__ */
+
+#if defined (ACE_TEMPLATES_REQUIRE_SOURCE)
+#include "orbsvcs/Notify/Property_T.cpp"
+#endif /* ACE_TEMPLATES_REQUIRE_SOURCE */
+
+#if defined (ACE_TEMPLATES_REQUIRE_PRAGMA)
+#pragma implementation ("Property_T.cpp")
+#endif /* ACE_TEMPLATES_REQUIRE_PRAGMA */
+
+#include /**/ "ace/post.h"
+#endif /* TAO_Notify_PROPERTY_T_H */
diff --git a/TAO/orbsvcs/orbsvcs/Notify/Property_T.inl b/TAO/orbsvcs/orbsvcs/Notify/Property_T.inl
new file mode 100644
index 00000000000..7f66d30c0c0
--- /dev/null
+++ b/TAO/orbsvcs/orbsvcs/Notify/Property_T.inl
@@ -0,0 +1,77 @@
+// -*- C++ -*-
+//
+// $Id$
+
+TAO_BEGIN_VERSIONED_NAMESPACE_DECL
+
+template <class TYPE> ACE_INLINE const TYPE&
+TAO_Notify_PropertyBase_T<TYPE>::value (void) const
+{
+ return this->value_;
+}
+
+template <class TYPE> ACE_INLINE
+const char *
+TAO_Notify_PropertyBase_T<TYPE>::name (void) const
+{
+ return this->name_;
+}
+
+template <class TYPE> ACE_INLINE CORBA::Boolean
+TAO_Notify_PropertyBase_T<TYPE>::is_valid (void) const
+{
+ return this->valid_;
+}
+
+template <class TYPE> ACE_INLINE bool
+TAO_Notify_PropertyBase_T<TYPE>::operator== (const TYPE &rhs) const
+{
+ return (this->value_ == rhs);
+}
+
+template <class TYPE> ACE_INLINE bool
+TAO_Notify_PropertyBase_T<TYPE>::operator!= (const TYPE &rhs) const
+{
+ return (this->value_ != rhs);
+}
+
+template <class TYPE> ACE_INLINE void
+TAO_Notify_PropertyBase_T<TYPE>:: invalidate (void)
+{
+ this->valid_ = 0;
+}
+
+template <class TYPE> ACE_INLINE
+void
+TAO_Notify_PropertyBase_T<TYPE>:: assign (const TYPE& value)
+{
+ this->value_ = value;
+ this->valid_ = 1;
+}
+
+
+
+/******************************************************************************/
+
+template <class TYPE> ACE_INLINE
+const char *
+TAO_Notify_StructProperty_T<TYPE>::name (void) const
+{
+ return this->name_;
+}
+
+template <class TYPE> ACE_INLINE const TYPE&
+TAO_Notify_StructProperty_T<TYPE>::value (void) const
+{
+ return this->value_;
+}
+
+
+
+template <class TYPE> ACE_INLINE CORBA::Boolean
+TAO_Notify_StructProperty_T<TYPE>::is_valid (void) const
+{
+ return this->valid_;
+}
+
+TAO_END_VERSIONED_NAMESPACE_DECL
diff --git a/TAO/orbsvcs/orbsvcs/Notify/Proxy.cpp b/TAO/orbsvcs/orbsvcs/Notify/Proxy.cpp
new file mode 100644
index 00000000000..a088943d05b
--- /dev/null
+++ b/TAO/orbsvcs/orbsvcs/Notify/Proxy.cpp
@@ -0,0 +1,199 @@
+// $Id$
+
+#include "orbsvcs/Notify/Proxy.h"
+
+#if ! defined (__ACE_INLINE__)
+#include "orbsvcs/Notify/Proxy.inl"
+#endif /* __ACE_INLINE__ */
+
+ACE_RCSID(Notify, TAO_Notify_Proxy, "$Id$")
+
+#include "orbsvcs/Notify/Peer.h"
+#include "orbsvcs/Notify/Proxy.h"
+#include "orbsvcs/Notify/Method_Request_Updates.h"
+#include "orbsvcs/Notify/Worker_Task.h"
+#include "orbsvcs/Notify/Properties.h"
+#include "orbsvcs/Notify/POA_Helper.h"
+#include "orbsvcs/Notify/Topology_Saver.h"
+
+TAO_BEGIN_VERSIONED_NAMESPACE_DECL
+
+TAO_Notify_Proxy::TAO_Notify_Proxy (void)
+ : updates_off_ (0)
+{
+}
+
+TAO_Notify_Proxy::~TAO_Notify_Proxy ()
+{
+}
+
+CORBA::Object_ptr
+TAO_Notify_Proxy::activate (PortableServer::Servant servant ACE_ENV_ARG_DECL)
+{
+ // Set the POA that we use to return our <ref>
+ this->set_primary_as_proxy_poa();
+ return TAO_Notify_Object::activate (servant ACE_ENV_ARG_PARAMETER);
+}
+
+CORBA::Object_ptr
+TAO_Notify_Proxy::activate (PortableServer::Servant servant,
+ CORBA::Long id
+ ACE_ENV_ARG_DECL)
+{
+ // Set the POA that we use to return our <ref>
+ this->set_primary_as_proxy_poa();
+ return TAO_Notify_Object::activate (servant, id ACE_ENV_ARG_PARAMETER);
+}
+
+void
+TAO_Notify_Proxy::deactivate (ACE_ENV_SINGLE_ARG_DECL)
+{
+ ACE_ASSERT (this->proxy_poa() != 0 );
+ this->proxy_poa()->deactivate (this->id() ACE_ENV_ARG_PARAMETER);
+}
+
+void
+TAO_Notify_Proxy::subscribed_types (TAO_Notify_EventTypeSeq& subscribed_types ACE_ENV_ARG_DECL)
+{
+ ACE_GUARD_THROW_EX (TAO_SYNCH_MUTEX, ace_mon, this->lock_,
+ CORBA::INTERNAL ());
+ ACE_CHECK;
+
+ // copy
+ subscribed_types = this->subscribed_types_;
+}
+
+void
+TAO_Notify_Proxy::types_changed (const TAO_Notify_EventTypeSeq& added, const TAO_Notify_EventTypeSeq& removed ACE_ENV_ARG_DECL)
+{
+ // return if the updates for this proxy are turned off or
+ // if all the updates in the channel are switched off.
+ if (this->updates_off_ == 1 || TAO_Notify_PROPERTIES::instance()->updates () == 0)
+ return;
+
+ TAO_Notify_Method_Request_Updates_No_Copy request (added, removed, this);
+
+ if (TAO_Notify_PROPERTIES::instance()->asynch_updates () == 1) // if we should send the updates synchronously.
+ {
+ this->execute_task (request ACE_ENV_ARG_PARAMETER);
+ ACE_CHECK;
+ }
+ else // execute in the current thread context.
+ {
+ request.execute (ACE_ENV_SINGLE_ARG_PARAMETER);
+ ACE_CHECK;
+ }
+}
+
+CosNotification::EventTypeSeq*
+TAO_Notify_Proxy::obtain_types (CosNotifyChannelAdmin::ObtainInfoMode mode, const TAO_Notify_EventTypeSeq& types ACE_ENV_ARG_DECL)
+ ACE_THROW_SPEC ((
+ CORBA::SystemException
+ ))
+{
+ CosNotification::EventTypeSeq_var event_type_seq;
+
+ ACE_NEW_THROW_EX (event_type_seq,
+ CosNotification::EventTypeSeq (),
+ CORBA::NO_MEMORY ());
+
+ ACE_GUARD_THROW_EX (TAO_SYNCH_MUTEX, ace_mon, this->lock_, CORBA::INTERNAL ());
+ ACE_CHECK_RETURN (event_type_seq._retn ());
+
+ if (mode == CosNotifyChannelAdmin::ALL_NOW_UPDATES_OFF ||
+ mode == CosNotifyChannelAdmin::ALL_NOW_UPDATES_ON)
+ {
+ types.populate (event_type_seq);
+ }
+
+ if (mode == CosNotifyChannelAdmin::NONE_NOW_UPDATES_ON ||
+ mode == CosNotifyChannelAdmin::ALL_NOW_UPDATES_ON)
+ {
+ this->updates_off_ = 0;
+ }
+ else
+ {
+ this->updates_off_ = 1;
+ }
+
+ return event_type_seq._retn ();
+}
+
+void
+TAO_Notify_Proxy::qos_changed (const TAO_Notify_QoSProperties& qos_properties)
+{
+ //Inform Peers of qos changes.
+ TAO_Notify_Peer* peer = this->peer ();
+
+ if (peer != 0)
+ peer->qos_changed (qos_properties);
+}
+
+void
+TAO_Notify_Proxy::save_persistent (TAO_Notify::Topology_Saver& saver ACE_ENV_ARG_DECL)
+{
+ bool changed = this->children_changed_;
+ this->children_changed_ = false;
+ this->self_changed_ = false;
+
+ if (is_persistent ())
+ {
+ TAO_Notify::NVPList attrs;
+ this->save_attrs(attrs);
+
+ const char * type_name = this->get_proxy_type_name ();
+ bool want_all_children = saver.begin_object(this->id(), type_name, attrs, changed ACE_ENV_ARG_PARAMETER);
+ ACE_CHECK;
+
+ if (want_all_children || this->filter_admin_.is_changed ())
+ {
+ this->filter_admin_.save_persistent(saver ACE_ENV_ARG_PARAMETER);
+ ACE_CHECK;
+ }
+
+ if (want_all_children || this->subscribed_types_.is_changed ())
+ {
+ this->subscribed_types_.save_persistent(saver ACE_ENV_ARG_PARAMETER);
+ ACE_CHECK;
+ }
+
+ // todo: handle removed children
+
+ saver.end_object(this->id(), type_name ACE_ENV_ARG_PARAMETER);
+ }
+}
+
+void
+TAO_Notify_Proxy::save_attrs (TAO_Notify::NVPList& attrs)
+{
+ TAO_Notify_Object::save_attrs(attrs);
+ TAO_Notify_Peer * peer = this->peer();
+ if (peer != 0)
+ {
+ attrs.push_back (TAO_Notify::NVP("PeerIOR", peer->get_ior()));
+ }
+}
+
+TAO_Notify::Topology_Object*
+TAO_Notify_Proxy::load_child (const ACE_CString &type, CORBA::Long id,
+ const TAO_Notify::NVPList& attrs ACE_ENV_ARG_DECL)
+{
+ ACE_UNUSED_ARG (id);
+ ACE_UNUSED_ARG (attrs);
+ TAO_Notify::Topology_Object* result = this;
+ if (type == "subscriptions")
+ {
+ // since we initialized our subscribed types to everything
+ // in the constructor. we have to clear it out first.
+ this->subscribed_types_.reset();
+ result = &this->subscribed_types_;
+ ACE_CHECK_RETURN(0);
+ }
+ else if (type == "filter_admin")
+ {
+ result = & this->filter_admin_;
+ }
+ return result;
+}
+
+TAO_END_VERSIONED_NAMESPACE_DECL
diff --git a/TAO/orbsvcs/orbsvcs/Notify/Proxy.h b/TAO/orbsvcs/orbsvcs/Notify/Proxy.h
new file mode 100644
index 00000000000..d6931ece562
--- /dev/null
+++ b/TAO/orbsvcs/orbsvcs/Notify/Proxy.h
@@ -0,0 +1,139 @@
+// -*- C++ -*-
+
+/**
+ * @file Proxy.h
+ *
+ * $Id$
+ *
+ * @author Pradeep Gore <pradeep@oomworks.com>
+ */
+
+#ifndef TAO_Notify_PROXY_H
+#define TAO_Notify_PROXY_H
+
+#include /**/ "ace/pre.h"
+
+#include "orbsvcs/Notify/notify_serv_export.h"
+
+#if !defined (ACE_LACKS_PRAGMA_ONCE)
+# pragma once
+#endif /* ACE_LACKS_PRAGMA_ONCE */
+
+#include "orbsvcs/Notify/Topology_Object.h"
+#include "orbsvcs/Notify/EventTypeSeq.h"
+#include "orbsvcs/Notify/FilterAdmin.h"
+#include "orbsvcs/Notify/Admin.h"
+
+TAO_BEGIN_VERSIONED_NAMESPACE_DECL
+
+class TAO_Notify_Admin;
+class TAO_Notify_Peer;
+
+/**
+ * @class TAO_Notify_Proxy
+ *
+ * @brief Base class proxy for all proxys in NS.
+ *
+ */
+class TAO_Notify_Serv_Export TAO_Notify_Proxy
+ : public TAO_Notify::Topology_Parent
+{
+ friend class TAO_Notify_Peer;
+
+public:
+ typedef TAO_Notify_Refcountable_Guard_T<TAO_Notify_Proxy> Ptr;
+ typedef CosNotifyChannelAdmin::ProxyIDSeq SEQ;
+ typedef CosNotifyChannelAdmin::ProxyIDSeq_var SEQ_VAR;
+
+ /// Constuctor
+ TAO_Notify_Proxy (void);
+
+ /// Destructor
+ virtual ~TAO_Notify_Proxy ();
+
+ /// Activate
+ virtual CORBA::Object_ptr activate (PortableServer::Servant servant
+ ACE_ENV_ARG_DECL);
+
+ /// Activate with a given ID
+ virtual CORBA::Object_ptr activate (
+ PortableServer::Servant servant,
+ CORBA::Long id
+ ACE_ENV_ARG_DECL);
+
+ /// Deactivate
+ void deactivate (ACE_ENV_SINGLE_ARG_DECL);
+
+ /// Obtain the Proxy's subscribed types.
+ void subscribed_types (TAO_Notify_EventTypeSeq& subscribed_types
+ ACE_ENV_ARG_DECL);
+
+ /// Check if this event passes the admin and proxy filters.
+ CORBA::Boolean check_filters (
+ const TAO_Notify_Event* event,
+ TAO_Notify_FilterAdmin& parent_filter_admin,
+ CosNotifyChannelAdmin::InterFilterGroupOperator filter_operator
+ ACE_ENV_ARG_DECL
+ );
+
+ /// Inform this proxy that the following types are being advertised.
+ void types_changed (const TAO_Notify_EventTypeSeq& added,
+ const TAO_Notify_EventTypeSeq& removed
+ ACE_ENV_ARG_DECL);
+
+ /// Have updates been turned off.
+ CORBA::Boolean updates_off (void);
+
+ /// Destroy this object.
+ virtual void destroy (ACE_ENV_SINGLE_ARG_DECL) = 0;
+
+ /// Access our Peer.
+ virtual TAO_Notify_Peer* peer (void) = 0;
+
+ /// Implement the Obtain Types.
+ virtual CosNotification::EventTypeSeq* obtain_types (
+ CosNotifyChannelAdmin::ObtainInfoMode mode,
+ const TAO_Notify_EventTypeSeq& types
+ ACE_ENV_ARG_DECL
+ )
+ ACE_THROW_SPEC ((CORBA::SystemException));
+
+ /// Notification of subscriptions/offers set at the admin.
+ virtual void admin_types_changed (const CosNotification::EventTypeSeq & added,
+ const CosNotification::EventTypeSeq & removed
+ ACE_ENV_ARG_DECL) = 0;
+
+
+ /// Override, TAO_Notify_Object::qos_changed
+ virtual void qos_changed (const TAO_Notify_QoSProperties& qos_properties);
+
+ // TAO_Notify::Topology_Object
+
+ virtual void save_persistent (TAO_Notify::Topology_Saver& saver ACE_ENV_ARG_DECL);
+ virtual void save_attrs(TAO_Notify::NVPList& attrs);
+ virtual const char * get_proxy_type_name (void) const = 0;
+
+ virtual TAO_Notify::Topology_Object* load_child (const ACE_CString &type, CORBA::Long id,
+ const TAO_Notify::NVPList& attrs ACE_ENV_ARG_DECL);
+
+protected:
+
+ /// Filter Administration
+ TAO_Notify_FilterAdmin filter_admin_;
+
+ /// The types that we're subscribed with the event manager.
+ TAO_Notify_EventTypeSeq subscribed_types_;
+
+ /// True if updates have been turned off.
+ CORBA::Boolean updates_off_;
+};
+
+TAO_END_VERSIONED_NAMESPACE_DECL
+
+#if defined (__ACE_INLINE__)
+#include "orbsvcs/Notify/Proxy.inl"
+#endif /* __ACE_INLINE__ */
+
+#include /**/ "ace/post.h"
+
+#endif /* TAO_Notify_PROXY_H */
diff --git a/TAO/orbsvcs/orbsvcs/Notify/Proxy.inl b/TAO/orbsvcs/orbsvcs/Notify/Proxy.inl
new file mode 100644
index 00000000000..6eff985b31e
--- /dev/null
+++ b/TAO/orbsvcs/orbsvcs/Notify/Proxy.inl
@@ -0,0 +1,40 @@
+// -*- C++ -*-
+//
+// $Id$
+
+TAO_BEGIN_VERSIONED_NAMESPACE_DECL
+
+ACE_INLINE CORBA::Boolean
+TAO_Notify_Proxy::updates_off (void)
+{
+ return this->updates_off_;
+}
+
+ACE_INLINE CORBA::Boolean
+TAO_Notify_Proxy::check_filters (const TAO_Notify_Event* event
+ , TAO_Notify_FilterAdmin& parent_filter_admin
+ , CosNotifyChannelAdmin::InterFilterGroupOperator filter_operator
+ ACE_ENV_ARG_DECL)
+{
+ // check if it passes the parent filter.
+ CORBA::Boolean parent_val =
+ parent_filter_admin.match (event ACE_ENV_ARG_PARAMETER);
+ ACE_CHECK_RETURN (0);
+
+ CORBA::Boolean val = 0;
+
+ if (filter_operator == CosNotifyChannelAdmin::AND_OP)
+ {
+ val = parent_val && this->filter_admin_.match (event ACE_ENV_ARG_PARAMETER);
+ ACE_CHECK_RETURN (0);
+ }
+ else
+ {
+ val = parent_val || this->filter_admin_.match (event ACE_ENV_ARG_PARAMETER);
+ ACE_CHECK_RETURN (0);
+ }
+
+ return val;
+}
+
+TAO_END_VERSIONED_NAMESPACE_DECL
diff --git a/TAO/orbsvcs/orbsvcs/Notify/ProxyConsumer.cpp b/TAO/orbsvcs/orbsvcs/Notify/ProxyConsumer.cpp
new file mode 100644
index 00000000000..cd7587bfacd
--- /dev/null
+++ b/TAO/orbsvcs/orbsvcs/Notify/ProxyConsumer.cpp
@@ -0,0 +1,204 @@
+// $Id$
+
+#include "orbsvcs/Notify/ProxyConsumer.h"
+
+#if ! defined (__ACE_INLINE__)
+#include "orbsvcs/Notify/ProxyConsumer.inl"
+#endif /* __ACE_INLINE__ */
+
+ACE_RCSID(Notify, TAO_Notify_ProxyConsumer, "$Id$")
+
+#include "tao/debug.h"
+#include "ace/Atomic_Op.h"
+#include "orbsvcs/Notify/Supplier.h"
+#include "orbsvcs/Notify/AdminProperties.h"
+#include "orbsvcs/Notify/Property.h"
+#include "orbsvcs/Notify/Proxy.h"
+#include "orbsvcs/Notify/Event_Manager.h"
+#include "orbsvcs/Notify/Method_Request_Lookup.h"
+#include "orbsvcs/Notify/Worker_Task.h"
+#include "orbsvcs/Notify/Properties.h"
+#include "orbsvcs/Notify/SupplierAdmin.h"
+#include "orbsvcs/Notify/EventChannel.h"
+#include "orbsvcs/Notify/Routing_Slip.h"
+
+//#define DEBUG_LEVEL 10
+#ifndef DEBUG_LEVEL
+# define DEBUG_LEVEL TAO_debug_level
+#endif //DEBUG_LEVEL
+
+TAO_BEGIN_VERSIONED_NAMESPACE_DECL
+
+TAO_Notify_ProxyConsumer::TAO_Notify_ProxyConsumer (void)
+ : supplier_admin_ (0)
+{
+}
+
+TAO_Notify_ProxyConsumer::~TAO_Notify_ProxyConsumer ()
+{
+}
+
+TAO_Notify_Peer*
+TAO_Notify_ProxyConsumer::peer (void)
+{
+ return this->supplier ();
+}
+
+void
+TAO_Notify_ProxyConsumer::init (TAO_Notify::Topology_Parent* topology_parent ACE_ENV_ARG_DECL)
+{
+ ACE_ASSERT( this->supplier_admin_.get() == 0 );
+
+ TAO_Notify_Proxy::initialize (topology_parent ACE_ENV_ARG_PARAMETER);
+ ACE_CHECK;
+
+ this->supplier_admin_.reset (dynamic_cast<TAO_Notify_SupplierAdmin *>(topology_parent));
+ ACE_ASSERT (this->supplier_admin_.get() != 0);
+
+ const CosNotification::QoSProperties &default_ps_qos =
+ TAO_Notify_PROPERTIES::instance ()->default_proxy_consumer_qos_properties ();
+
+ this->set_qos (default_ps_qos ACE_ENV_ARG_PARAMETER);
+}
+
+void
+TAO_Notify_ProxyConsumer::connect (TAO_Notify_Supplier *supplier ACE_ENV_ARG_DECL)
+ ACE_THROW_SPEC ((
+ CORBA::SystemException
+ , CosEventChannelAdmin::AlreadyConnected
+ ))
+{
+ // Adopt the supplier
+ ACE_Auto_Ptr< TAO_Notify_Supplier > auto_supplier (supplier);
+
+ TAO_Notify_Atomic_Property_Long& supplier_count = this->admin_properties().suppliers ();
+ const TAO_Notify_Property_Long& max_suppliers = this->admin_properties().max_suppliers ();
+
+ if (max_suppliers != 0 && supplier_count >= max_suppliers.value ())
+ {
+ ACE_THROW (CORBA::IMP_LIMIT ()); // we've reached the limit of suppliers connected.
+ }
+
+ {
+ ACE_GUARD_THROW_EX (TAO_SYNCH_MUTEX, ace_mon, this->lock_,
+ CORBA::INTERNAL ());
+ ACE_CHECK;
+
+ // if supplier is set and reconnect not allowed we get out.
+ if (this->is_connected () && TAO_Notify_PROPERTIES::instance()->allow_reconnect() == false)
+ {
+ ACE_THROW (CosEventChannelAdmin::AlreadyConnected ());
+ }
+
+ // Adopt the supplier
+ this->supplier_ = auto_supplier;
+
+ this->supplier_admin_->subscribed_types (this->subscribed_types_ ACE_ENV_ARG_PARAMETER); // get the parents subscribed types.
+ ACE_CHECK;
+ }
+
+ // Inform QoS values.
+ ACE_ASSERT (this->supplier_.get() != 0);
+ this->supplier_->qos_changed (this->qos_properties_);
+
+ TAO_Notify_EventTypeSeq removed;
+
+ this->event_manager().offer_change (this, this->subscribed_types_, removed ACE_ENV_ARG_PARAMETER);
+ ACE_CHECK;
+
+ this->event_manager().connect (this ACE_ENV_ARG_PARAMETER);
+ ACE_CHECK;
+
+ // Increment the global supplier count
+ ++supplier_count;
+}
+void
+TAO_Notify_ProxyConsumer::push_i (TAO_Notify_Event * event ACE_ENV_ARG_DECL)
+{
+ if (this->supports_reliable_events ())
+ {
+ TAO_Notify_Event::Ptr pevent(event->queueable_copy(ACE_ENV_SINGLE_ARG_PARAMETER));
+ ACE_CHECK;
+ TAO_Notify::Routing_Slip_Ptr routing_slip =
+ TAO_Notify::Routing_Slip::create (pevent ACE_ENV_ARG_PARAMETER);
+ ACE_CHECK;
+ if (DEBUG_LEVEL > 0)
+ ACE_DEBUG((LM_DEBUG, ACE_TEXT ("ProxyConsumer routing event.\n")));
+ routing_slip->route (this, true ACE_ENV_ARG_PARAMETER);
+ ACE_CHECK;
+ routing_slip->wait_persist ();
+ }
+ else
+ {
+ TAO_Notify_Method_Request_Lookup_No_Copy request (event, this);
+ this->execute_task (request ACE_ENV_ARG_PARAMETER);
+ ACE_CHECK;
+ }
+}
+
+bool
+TAO_Notify_ProxyConsumer::supports_reliable_events () const
+{
+ bool reliable = false;
+ CosNotification::PropertyValue value;
+ if (this->find_qos_property_value (CosNotification::EventReliability, value))
+ {
+ CORBA::Long setting;
+ if (value >>= setting)
+ {
+ reliable = (setting == CosNotification::Persistent);
+ }
+ }
+ return reliable;
+}
+
+void
+TAO_Notify_ProxyConsumer::disconnect (ACE_ENV_SINGLE_ARG_DECL)
+{
+ TAO_Notify_EventTypeSeq added;
+
+ event_manager().offer_change (this, added, this->subscribed_types_ ACE_ENV_ARG_PARAMETER);
+ ACE_CHECK;
+
+ this->event_manager().disconnect (this ACE_ENV_ARG_PARAMETER);
+ ACE_CHECK;
+
+ // Decrement the global supplier count
+ this->admin_properties().suppliers ()--;
+}
+
+int
+TAO_Notify_ProxyConsumer::shutdown (ACE_ENV_SINGLE_ARG_DECL)
+{
+ if (this->TAO_Notify_Object::shutdown (ACE_ENV_SINGLE_ARG_PARAMETER) == 1)
+ return 1;
+
+ ACE_CHECK_RETURN (1);
+
+ this->disconnect (ACE_ENV_SINGLE_ARG_PARAMETER);
+ ACE_CHECK_RETURN (1);
+
+ if (this->supplier_.get() != 0)
+ {
+ this->supplier_->shutdown (ACE_ENV_SINGLE_ARG_PARAMETER);
+ ACE_CHECK_RETURN (1);
+ }
+ return 0;
+}
+
+void
+TAO_Notify_ProxyConsumer::destroy (ACE_ENV_SINGLE_ARG_DECL)
+{
+ int result = this->shutdown (ACE_ENV_SINGLE_ARG_PARAMETER);
+ ACE_CHECK;
+ if ( result == 1)
+ return;
+
+ this->supplier_admin_->remove (this ACE_ENV_ARG_PARAMETER);
+ ACE_CHECK;
+
+ // Do not reset this->supplier_.
+ // It is not safe to delete the non-refcounted supplier here.
+}
+
+TAO_END_VERSIONED_NAMESPACE_DECL
diff --git a/TAO/orbsvcs/orbsvcs/Notify/ProxyConsumer.h b/TAO/orbsvcs/orbsvcs/Notify/ProxyConsumer.h
new file mode 100644
index 00000000000..17890c772f2
--- /dev/null
+++ b/TAO/orbsvcs/orbsvcs/Notify/ProxyConsumer.h
@@ -0,0 +1,105 @@
+// -*- C++ -*-
+
+/**
+ * @file ProxyConsumer.h
+ *
+ * $Id$
+ *
+ * @author Pradeep Gore <pradeep@oomworks.com>
+ */
+
+#ifndef TAO_Notify_PROXYCONSUMER_H
+#define TAO_Notify_PROXYCONSUMER_H
+
+#include /**/ "ace/pre.h"
+
+#include "orbsvcs/Notify/notify_serv_export.h"
+#include "orbsvcs/Notify/Event.h"
+#include "orbsvcs/Notify/Proxy.h"
+#include "orbsvcs/Notify/SupplierAdmin.h"
+
+#if !defined (ACE_LACKS_PRAGMA_ONCE)
+# pragma once
+#endif /* ACE_LACKS_PRAGMA_ONCE */
+
+#include "orbsvcs/CosEventChannelAdminC.h"
+
+#include "ace/Auto_Ptr.h"
+
+TAO_BEGIN_VERSIONED_NAMESPACE_DECL
+
+class TAO_Notify_Supplier;
+
+/**
+ * @class TAO_Notify_ProxyConsumer
+ *
+ * @brief Base class for all types of ProxyConsumer implementations.
+ *
+ */
+class TAO_Notify_Serv_Export TAO_Notify_ProxyConsumer
+ : public virtual TAO_Notify_Proxy
+{
+public:
+ typedef TAO_Notify_Refcountable_Guard_T<TAO_Notify_ProxyConsumer> Ptr;
+ /// Constuctor
+ TAO_Notify_ProxyConsumer (void);
+
+ /// Destructor
+ virtual ~TAO_Notify_ProxyConsumer ();
+
+ /// init: overrides Topology_Object method
+ virtual void init (TAO_Notify::Topology_Parent * topology_parent ACE_ENV_ARG_DECL);
+
+ /// Connect
+ void connect (TAO_Notify_Supplier* supplier ACE_ENV_ARG_DECL)
+ ACE_THROW_SPEC ((
+ CORBA::SystemException
+ , CosEventChannelAdmin::AlreadyConnected
+ ));
+
+ /// Disconnect
+ void disconnect (ACE_ENV_SINGLE_ARG_DECL);
+
+ /// Shutdown (TAO_Notify_Container_T method)
+ virtual int shutdown (ACE_ENV_SINGLE_ARG_DECL);
+
+ /// Destroy this object.
+ virtual void destroy (ACE_ENV_SINGLE_ARG_DECL);
+
+
+ /// Return 1 if connected
+ bool is_connected (void) const;
+
+ /// The SA parent.
+ TAO_Notify_SupplierAdmin& supplier_admin (void);
+
+protected:
+ /// Access the Supplier
+ TAO_Notify_Supplier* supplier (void);
+
+ /// Accept an event from the Supplier
+ void push_i (TAO_Notify_Event * event ACE_ENV_ARG_DECL);
+
+private:
+ /// Is this part of a reliable channel
+ bool supports_reliable_events () const;
+
+ ///= Data Members.
+ /// The SA parent.
+ TAO_Notify_SupplierAdmin::Ptr supplier_admin_;
+
+ /// The Supplier that we're connect to.
+ ACE_Auto_Ptr<TAO_Notify_Supplier> supplier_;
+
+ /// Access our Peer.
+ virtual TAO_Notify_Peer* peer (void);
+};
+
+TAO_END_VERSIONED_NAMESPACE_DECL
+
+#if defined (__ACE_INLINE__)
+#include "orbsvcs/Notify/ProxyConsumer.inl"
+#endif /* __ACE_INLINE__ */
+
+#include /**/ "ace/post.h"
+#endif /* TAO_Notify_PROXYCONSUMER_H */
diff --git a/TAO/orbsvcs/orbsvcs/Notify/ProxyConsumer.inl b/TAO/orbsvcs/orbsvcs/Notify/ProxyConsumer.inl
new file mode 100644
index 00000000000..b2b0c8bb5c8
--- /dev/null
+++ b/TAO/orbsvcs/orbsvcs/Notify/ProxyConsumer.inl
@@ -0,0 +1,26 @@
+// -*- C++ -*-
+//
+// $Id$
+
+TAO_BEGIN_VERSIONED_NAMESPACE_DECL
+
+ACE_INLINE bool
+TAO_Notify_ProxyConsumer::is_connected (void) const
+{
+ return (this->supplier_.get() != 0);
+}
+
+ACE_INLINE TAO_Notify_Supplier*
+TAO_Notify_ProxyConsumer::supplier (void)
+{
+ return this->supplier_.get();
+}
+
+ACE_INLINE TAO_Notify_SupplierAdmin&
+TAO_Notify_ProxyConsumer::supplier_admin (void)
+{
+ ACE_ASSERT( this->supplier_admin_.get() != 0 );
+ return *this->supplier_admin_;
+}
+
+TAO_END_VERSIONED_NAMESPACE_DECL
diff --git a/TAO/orbsvcs/orbsvcs/Notify/ProxyConsumer_T.cpp b/TAO/orbsvcs/orbsvcs/Notify/ProxyConsumer_T.cpp
new file mode 100644
index 00000000000..a47122b58d5
--- /dev/null
+++ b/TAO/orbsvcs/orbsvcs/Notify/ProxyConsumer_T.cpp
@@ -0,0 +1,84 @@
+// $Id$
+
+#ifndef TAO_Notify_PROXYCONSUMER_T_CPP
+#define TAO_Notify_PROXYCONSUMER_T_CPP
+
+#include "orbsvcs/Notify/ProxyConsumer_T.h"
+#include "orbsvcs/Notify/SupplierAdmin.h"
+
+#include "orbsvcs/Notify/Event_Manager.h"
+
+TAO_BEGIN_VERSIONED_NAMESPACE_DECL
+
+template <class SERVANT_TYPE>
+TAO_Notify_ProxyConsumer_T<SERVANT_TYPE>::TAO_Notify_ProxyConsumer_T (void)
+{
+}
+
+template <class SERVANT_TYPE>
+TAO_Notify_ProxyConsumer_T<SERVANT_TYPE>::~TAO_Notify_ProxyConsumer_T ()
+{
+}
+
+template <class SERVANT_TYPE> void
+TAO_Notify_ProxyConsumer_T<SERVANT_TYPE>::admin_types_changed (const CosNotification::EventTypeSeq & added,
+ const CosNotification::EventTypeSeq & removed
+ ACE_ENV_ARG_DECL)
+{
+ this->offer_change (added, removed ACE_ENV_ARG_PARAMETER);
+}
+
+template <class SERVANT_TYPE> CosNotifyChannelAdmin::SupplierAdmin_ptr
+TAO_Notify_ProxyConsumer_T<SERVANT_TYPE>::MyAdmin (ACE_ENV_SINGLE_ARG_DECL)
+ ACE_THROW_SPEC ((
+ CORBA::SystemException
+ ))
+{
+ CosNotifyChannelAdmin::SupplierAdmin_var ret;
+
+ CORBA::Object_var object = this->supplier_admin().ref (ACE_ENV_SINGLE_ARG_PARAMETER);
+ ACE_CHECK_RETURN (ret._retn ());
+
+ ret = CosNotifyChannelAdmin::SupplierAdmin::_narrow (object.in () ACE_ENV_ARG_PARAMETER);
+
+ return ret._retn ();
+}
+
+template <class SERVANT_TYPE> void
+TAO_Notify_ProxyConsumer_T<SERVANT_TYPE>::offer_change (const CosNotification::EventTypeSeq & added, const CosNotification::EventTypeSeq & removed ACE_ENV_ARG_DECL)
+ ACE_THROW_SPEC ((
+ CORBA::SystemException,
+ CosNotifyComm::InvalidEventType
+ ))
+{
+ TAO_Notify_EventTypeSeq seq_added (added);
+ TAO_Notify_EventTypeSeq seq_removed (removed);
+
+ {
+ ACE_GUARD_THROW_EX (TAO_SYNCH_MUTEX, ace_mon, this->lock_,
+ CORBA::INTERNAL ());
+ ACE_CHECK;
+
+ this->subscribed_types_.add_and_remove (seq_added, seq_removed);
+ }
+
+ this->event_manager().offer_change (this,
+ seq_added,
+ seq_removed
+ ACE_ENV_ARG_PARAMETER);
+}
+
+template <class SERVANT_TYPE> CosNotification::EventTypeSeq*
+TAO_Notify_ProxyConsumer_T<SERVANT_TYPE>::obtain_subscription_types (
+ CosNotifyChannelAdmin::ObtainInfoMode mode
+ ACE_ENV_ARG_DECL)
+ ACE_THROW_SPEC ((CORBA::SystemException))
+{
+ return
+ this->obtain_types (mode, this->event_manager().subscription_types ()
+ ACE_ENV_ARG_PARAMETER);
+}
+
+TAO_END_VERSIONED_NAMESPACE_DECL
+
+#endif /* TAO_Notify_PROXYCONSUMER_T_CPP */
diff --git a/TAO/orbsvcs/orbsvcs/Notify/ProxyConsumer_T.h b/TAO/orbsvcs/orbsvcs/Notify/ProxyConsumer_T.h
new file mode 100644
index 00000000000..bcb0ada782b
--- /dev/null
+++ b/TAO/orbsvcs/orbsvcs/Notify/ProxyConsumer_T.h
@@ -0,0 +1,86 @@
+// -*- C++ -*-
+
+/**
+ * @file ProxyConsumer_T.h
+ *
+ * $Id$
+ *
+ * @author Pradeep Gore <pradeep@oomworks.com>
+ */
+
+#ifndef TAO_Notify_PROXYCONSUMER_T_H
+#define TAO_Notify_PROXYCONSUMER_T_H
+
+#include /**/ "ace/pre.h"
+
+#include "orbsvcs/Notify/notify_serv_export.h"
+
+#if !defined (ACE_LACKS_PRAGMA_ONCE)
+# pragma once
+#endif /* ACE_LACKS_PRAGMA_ONCE */
+
+#include "orbsvcs/Notify/Proxy_T.h"
+#include "orbsvcs/Notify/ProxyConsumer.h"
+
+TAO_BEGIN_VERSIONED_NAMESPACE_DECL
+
+/**
+ * @class TAO_Notify_ProxyConsumer_T
+ *
+ * @brief
+ *
+ */
+template <class SERVANT_TYPE>
+class TAO_Notify_Serv_Export TAO_Notify_ProxyConsumer_T
+ : public virtual TAO_Notify_Proxy_T <SERVANT_TYPE>,
+ public virtual TAO_Notify_ProxyConsumer
+{
+public:
+ /// Constuctor
+ TAO_Notify_ProxyConsumer_T (void);
+
+ /// Destructor
+ ~TAO_Notify_ProxyConsumer_T ();
+
+ /// Notification of subscriptions set at the admin.
+ virtual void admin_types_changed (const CosNotification::EventTypeSeq & added,
+ const CosNotification::EventTypeSeq & removed
+ ACE_ENV_ARG_DECL);
+
+ virtual CosNotifyChannelAdmin::SupplierAdmin_ptr MyAdmin (ACE_ENV_SINGLE_ARG_DECL)
+ ACE_THROW_SPEC ((
+ CORBA::SystemException
+ ));
+
+ virtual CosNotification::EventTypeSeq * obtain_subscription_types (
+ CosNotifyChannelAdmin::ObtainInfoMode mode
+ ACE_ENV_ARG_DECL
+ )
+ ACE_THROW_SPEC ((
+ CORBA::SystemException
+ ));
+
+ virtual void offer_change (
+ const CosNotification::EventTypeSeq & added,
+ const CosNotification::EventTypeSeq & removed
+ ACE_ENV_ARG_DECL
+ )
+ ACE_THROW_SPEC ((
+ CORBA::SystemException,
+ CosNotifyComm::InvalidEventType
+ ));
+
+};
+
+TAO_END_VERSIONED_NAMESPACE_DECL
+
+#if defined (ACE_TEMPLATES_REQUIRE_SOURCE)
+#include "orbsvcs/Notify/ProxyConsumer_T.cpp"
+#endif /* ACE_TEMPLATES_REQUIRE_SOURCE */
+
+#if defined (ACE_TEMPLATES_REQUIRE_PRAGMA)
+#pragma implementation ("ProxyConsumer_T.cpp")
+#endif /* ACE_TEMPLATES_REQUIRE_PRAGMA */
+
+#include /**/ "ace/post.h"
+#endif /* TAO_Notify_PROXYCONSUMER_T_H */
diff --git a/TAO/orbsvcs/orbsvcs/Notify/ProxySupplier.cpp b/TAO/orbsvcs/orbsvcs/Notify/ProxySupplier.cpp
new file mode 100644
index 00000000000..4d7a0c3023d
--- /dev/null
+++ b/TAO/orbsvcs/orbsvcs/Notify/ProxySupplier.cpp
@@ -0,0 +1,166 @@
+// $Id$
+
+#include "orbsvcs/Notify/ProxySupplier.h"
+
+#if ! defined (__ACE_INLINE__)
+#include "orbsvcs/Notify/ProxySupplier.inl"
+#endif /* __ACE_INLINE__ */
+
+ACE_RCSID(Notify, TAO_Notify_ProxySupplier, "$Id$")
+
+#include "orbsvcs/Notify/Event_Manager.h"
+#include "orbsvcs/Notify/AdminProperties.h"
+#include "orbsvcs/Notify/Consumer.h"
+#include "orbsvcs/Notify/Method_Request_Dispatch.h"
+#include "orbsvcs/Notify/Worker_Task.h"
+#include "orbsvcs/Notify/Buffering_Strategy.h"
+#include "orbsvcs/Notify/Properties.h"
+#include "orbsvcs/Notify/ConsumerAdmin.h"
+
+TAO_BEGIN_VERSIONED_NAMESPACE_DECL
+
+TAO_Notify_ProxySupplier::TAO_Notify_ProxySupplier (void)
+ : consumer_admin_ (0)
+{
+}
+
+TAO_Notify_ProxySupplier::~TAO_Notify_ProxySupplier ()
+{
+}
+
+void
+TAO_Notify_ProxySupplier::init (TAO_Notify_ConsumerAdmin* consumer_admin ACE_ENV_ARG_DECL)
+{
+ ACE_ASSERT (consumer_admin != 0 && this->consumer_admin_.get() == 0);
+
+ TAO_Notify_Proxy::initialize (consumer_admin ACE_ENV_ARG_PARAMETER);
+ ACE_CHECK;
+
+ this->consumer_admin_.reset (consumer_admin);
+
+ const CosNotification::QoSProperties &default_ps_qos =
+ TAO_Notify_PROPERTIES::instance ()->default_proxy_supplier_qos_properties ();
+
+ this->set_qos (default_ps_qos ACE_ENV_ARG_PARAMETER);
+ ACE_CHECK;
+}
+
+TAO_Notify_Peer*
+TAO_Notify_ProxySupplier:: peer (void)
+{
+ return this->consumer ();
+}
+
+void
+TAO_Notify_ProxySupplier::connect (TAO_Notify_Consumer *consumer ACE_ENV_ARG_DECL)
+ ACE_THROW_SPEC ((
+ CORBA::SystemException
+ , CosEventChannelAdmin::AlreadyConnected
+ ))
+{
+ // Adopt the consumer
+ ACE_Auto_Ptr< TAO_Notify_Consumer > auto_consumer (consumer);
+
+ TAO_Notify_Atomic_Property_Long& consumer_count = this->admin_properties().consumers ();
+ const TAO_Notify_Property_Long& max_consumers = this->admin_properties().max_consumers ();
+
+ if (max_consumers != 0 && consumer_count >= max_consumers.value ())
+ {
+ ACE_THROW (CORBA::IMP_LIMIT ()); // we've reached the limit of consumers connected.
+ }
+
+ {
+ ACE_GUARD_THROW_EX (TAO_SYNCH_MUTEX, ace_mon, this->lock_,
+ CORBA::INTERNAL ());
+ ACE_CHECK;
+
+ // if consumer is set and reconnect not allowed we get out.
+ if (this->is_connected () && TAO_Notify_PROPERTIES::instance()->allow_reconnect() == false)
+ {
+ ACE_THROW (CosEventChannelAdmin::AlreadyConnected ());
+ }
+
+ // Adopt the consumer
+ this->consumer_ = auto_consumer;
+
+ this->consumer_admin_->subscribed_types (this->subscribed_types_ ACE_ENV_ARG_PARAMETER); // get the parents subscribed types.
+ ACE_CHECK;
+ }
+
+ // Inform QoS values.
+ ACE_ASSERT (this->consumer_.get() != 0);
+ this->consumer_->qos_changed (this->qos_properties_);
+
+ TAO_Notify_EventTypeSeq removed;
+
+ this->event_manager().subscription_change (this, this->subscribed_types_, removed ACE_ENV_ARG_PARAMETER);
+ ACE_CHECK;
+
+ this->event_manager().connect (this ACE_ENV_ARG_PARAMETER);
+ ACE_CHECK;
+
+ // Increment the global consumer count
+ ++consumer_count;
+}
+
+void
+TAO_Notify_ProxySupplier::disconnect (ACE_ENV_SINGLE_ARG_DECL)
+{
+ TAO_Notify_EventTypeSeq added;
+
+ this->event_manager().subscription_change (this, added, this->subscribed_types_ ACE_ENV_ARG_PARAMETER);
+ ACE_CHECK;
+
+ this->event_manager().disconnect (this ACE_ENV_ARG_PARAMETER);
+ ACE_CHECK;
+
+ // Decrement the global consumer count
+ this->admin_properties().consumers ()--;
+}
+
+int
+TAO_Notify_ProxySupplier::shutdown (ACE_ENV_SINGLE_ARG_DECL)
+{
+ if (this->TAO_Notify_Object::shutdown (ACE_ENV_SINGLE_ARG_PARAMETER) == 1)
+ return 1;
+
+ ACE_CHECK_RETURN (1);
+
+ this->disconnect (ACE_ENV_SINGLE_ARG_PARAMETER);
+ ACE_CHECK_RETURN (1);
+
+ if (this->consumer_.get() != 0)
+ {
+ this->consumer_->shutdown (ACE_ENV_SINGLE_ARG_PARAMETER);
+ }
+ return 0;
+}
+
+void
+TAO_Notify_ProxySupplier::destroy (ACE_ENV_SINGLE_ARG_DECL)
+{
+ int result = this->shutdown (ACE_ENV_SINGLE_ARG_PARAMETER);
+ ACE_CHECK;
+ if ( result == 1)
+ return;
+
+ this->consumer_admin_->remove (this ACE_ENV_ARG_PARAMETER);
+ ACE_CHECK;
+
+ // Do not reset this->consumer_.
+ // It is not safe to delete the non-refcounted consumer here.
+}
+
+void
+TAO_Notify_ProxySupplier::deliver (TAO_Notify_Method_Request_Dispatch_No_Copy & request ACE_ENV_ARG_DECL)
+{
+ this->execute_task (request ACE_ENV_ARG_PARAMETER);
+}
+
+void
+TAO_Notify_ProxySupplier::qos_changed (const TAO_Notify_QoSProperties& qos_properties)
+{
+ TAO_Notify_Proxy::qos_changed (qos_properties);
+}
+
+TAO_END_VERSIONED_NAMESPACE_DECL
diff --git a/TAO/orbsvcs/orbsvcs/Notify/ProxySupplier.h b/TAO/orbsvcs/orbsvcs/Notify/ProxySupplier.h
new file mode 100644
index 00000000000..17ced483590
--- /dev/null
+++ b/TAO/orbsvcs/orbsvcs/Notify/ProxySupplier.h
@@ -0,0 +1,101 @@
+// -*- C++ -*-
+
+/**
+ * @file ProxySupplier.h
+ *
+ * $Id$
+ *
+ * @author Pradeep Gore <pradeep@oomworks.com>
+ */
+
+#ifndef TAO_Notify_PROXYSUPPLIER_H
+#define TAO_Notify_PROXYSUPPLIER_H
+#include /**/ "ace/pre.h"
+
+#include "orbsvcs/Notify/notify_serv_export.h"
+
+#if !defined (ACE_LACKS_PRAGMA_ONCE)
+# pragma once
+#endif /* ACE_LACKS_PRAGMA_ONCE */
+
+#include "orbsvcs/Notify/Event.h"
+#include "orbsvcs/Notify/Proxy.h"
+#include "orbsvcs/Notify/ConsumerAdmin.h"
+
+#include "orbsvcs/CosEventChannelAdminC.h"
+
+TAO_BEGIN_VERSIONED_NAMESPACE_DECL
+
+class TAO_Notify_Consumer;
+class TAO_Notify_Method_Request_Dispatch_No_Copy;
+/**
+ * @class TAO_Notify_ProxySupplier
+ *
+ * @brief Base class for all the ProxySuppliers.
+ *
+ */
+class TAO_Notify_Serv_Export TAO_Notify_ProxySupplier : public virtual TAO_Notify_Proxy
+{
+ friend class TAO_Notify_Consumer;
+
+public:
+ typedef TAO_Notify_Refcountable_Guard_T<TAO_Notify_ProxySupplier> Ptr;
+ /// Constuctor
+ TAO_Notify_ProxySupplier (void);
+
+ /// Destructor
+ virtual ~TAO_Notify_ProxySupplier ();
+
+ /// Init
+ virtual void init (TAO_Notify_ConsumerAdmin* consumer_admin ACE_ENV_ARG_DECL);
+
+ /// Connect
+ void connect (TAO_Notify_Consumer* consumer ACE_ENV_ARG_DECL)
+ ACE_THROW_SPEC ((
+ CORBA::SystemException
+ , CosEventChannelAdmin::AlreadyConnected
+ ));
+ /// Disconnect
+ void disconnect (ACE_ENV_SINGLE_ARG_DECL);
+
+ /// Dispatch Event to consumer
+ virtual void deliver (TAO_Notify_Method_Request_Dispatch_No_Copy & request ACE_ENV_ARG_DECL);
+
+ /// Override TAO_Notify_Container_T::shutdown method
+ virtual int shutdown (ACE_ENV_SINGLE_ARG_DECL);
+
+ /// Destroy this object.
+ virtual void destroy (ACE_ENV_SINGLE_ARG_DECL);
+
+ /// Override, TAO_Notify_Proxy::qos_changed to apply MaxEventssPerConsumer QoS.
+ virtual void qos_changed (const TAO_Notify_QoSProperties& qos_properties);
+
+ /// Returns true if connected
+ bool is_connected (void) const;
+
+ /// Access the Consumer
+ TAO_Notify_Consumer* consumer (void);
+
+ /// The CA parent.
+ TAO_Notify_ConsumerAdmin& consumer_admin (void);
+
+private:
+ ///= Data Members.
+ /// The CA parent.
+ TAO_Notify_ConsumerAdmin::Ptr consumer_admin_;
+
+ /// The Consumer that we're connect to.
+ ACE_Auto_Ptr<TAO_Notify_Consumer> consumer_;
+
+ /// Access our Peer.
+ virtual TAO_Notify_Peer* peer (void);
+};
+
+TAO_END_VERSIONED_NAMESPACE_DECL
+
+#if defined (__ACE_INLINE__)
+#include "orbsvcs/Notify/ProxySupplier.inl"
+#endif /* __ACE_INLINE__ */
+
+#include /**/ "ace/post.h"
+#endif /* TAO_Notify_PROXYSUPPLIER_H */
diff --git a/TAO/orbsvcs/orbsvcs/Notify/ProxySupplier.inl b/TAO/orbsvcs/orbsvcs/Notify/ProxySupplier.inl
new file mode 100644
index 00000000000..c7afa257d59
--- /dev/null
+++ b/TAO/orbsvcs/orbsvcs/Notify/ProxySupplier.inl
@@ -0,0 +1,26 @@
+// -*- C++ -*-
+//
+// $Id$
+
+TAO_BEGIN_VERSIONED_NAMESPACE_DECL
+
+ACE_INLINE bool
+TAO_Notify_ProxySupplier::is_connected (void) const
+{
+ return ( this->consumer_.get() != 0 );
+}
+
+ACE_INLINE TAO_Notify_Consumer*
+TAO_Notify_ProxySupplier::consumer (void)
+{
+ return this->consumer_.get();
+}
+
+ACE_INLINE TAO_Notify_ConsumerAdmin&
+TAO_Notify_ProxySupplier::consumer_admin (void)
+{
+ ACE_ASSERT( this->consumer_admin_.get() != 0 );
+ return *this->consumer_admin_;
+}
+
+TAO_END_VERSIONED_NAMESPACE_DECL
diff --git a/TAO/orbsvcs/orbsvcs/Notify/ProxySupplier_T.cpp b/TAO/orbsvcs/orbsvcs/Notify/ProxySupplier_T.cpp
new file mode 100644
index 00000000000..622acba3277
--- /dev/null
+++ b/TAO/orbsvcs/orbsvcs/Notify/ProxySupplier_T.cpp
@@ -0,0 +1,227 @@
+// $Id$
+
+#ifndef TAO_Notify_PROXYSUPPLIER_T_CPP
+#define TAO_Notify_PROXYSUPPLIER_T_CPP
+
+#include "orbsvcs/Notify/ProxySupplier_T.h"
+
+#include "orbsvcs/Notify/Consumer.h"
+#include "orbsvcs/Notify/Structured/StructuredEvent.h"
+#include "orbsvcs/Notify/Any/AnyEvent.h"
+
+#include "orbsvcs/Notify/Method_Request_Dispatch.h"
+#include "orbsvcs/Notify/Worker_Task.h"
+#include "orbsvcs/Notify/Event_Manager.h"
+#include "orbsvcs/Notify/ConsumerAdmin.h"
+
+TAO_BEGIN_VERSIONED_NAMESPACE_DECL
+
+template <class SERVANT_TYPE>
+TAO_Notify_ProxySupplier_T<SERVANT_TYPE>::TAO_Notify_ProxySupplier_T (void)
+ : is_suspended_ (0)
+{
+}
+
+template <class SERVANT_TYPE>
+TAO_Notify_ProxySupplier_T<SERVANT_TYPE>::~TAO_Notify_ProxySupplier_T ()
+{
+}
+
+template <class SERVANT_TYPE> void
+TAO_Notify_ProxySupplier_T<SERVANT_TYPE>::admin_types_changed (const CosNotification::EventTypeSeq & added,
+ const CosNotification::EventTypeSeq & removed
+ ACE_ENV_ARG_DECL)
+{
+ this->subscription_change (added, removed ACE_ENV_ARG_PARAMETER);
+}
+
+template <class SERVANT_TYPE> void
+TAO_Notify_ProxySupplier_T<SERVANT_TYPE>::forward_structured (const CosNotification::StructuredEvent& notification ACE_ENV_ARG_DECL)
+ ACE_THROW_SPEC ((
+ CORBA::SystemException
+ ))
+{
+ TAO_Notify_StructuredEvent_No_Copy event (notification);
+
+ TAO_Notify_Method_Request_Dispatch_No_Copy request (&event, this, 1);
+
+ this->execute_task (request ACE_ENV_ARG_PARAMETER);
+}
+
+template <class SERVANT_TYPE> void
+TAO_Notify_ProxySupplier_T<SERVANT_TYPE>::forward_structured_no_filtering (const CosNotification::StructuredEvent& notification ACE_ENV_ARG_DECL)
+ ACE_THROW_SPEC ((
+ CORBA::SystemException
+ ))
+{
+ TAO_Notify_StructuredEvent_No_Copy event(notification);
+
+ TAO_Notify_Method_Request_Dispatch_No_Copy request (&event, this, 0);
+
+ this->execute_task (request ACE_ENV_ARG_PARAMETER);
+}
+
+template <class SERVANT_TYPE> void
+TAO_Notify_ProxySupplier_T<SERVANT_TYPE>::forward_any (const CORBA::Any & any ACE_ENV_ARG_DECL)
+ ACE_THROW_SPEC ((
+ CORBA::SystemException
+ ))
+{
+ TAO_Notify_AnyEvent_No_Copy event (any);
+
+ TAO_Notify_Method_Request_Dispatch_No_Copy request (&event, this, 1);
+
+ this->execute_task (request ACE_ENV_ARG_PARAMETER);
+}
+
+template <class SERVANT_TYPE> void
+TAO_Notify_ProxySupplier_T<SERVANT_TYPE>::forward_any_no_filtering (const CORBA::Any& any ACE_ENV_ARG_DECL)
+ ACE_THROW_SPEC ((
+ CORBA::SystemException
+ ))
+{
+ TAO_Notify_AnyEvent_No_Copy event(any);
+
+ TAO_Notify_Method_Request_Dispatch_No_Copy request (&event, this, 0);
+
+ this->execute_task (request ACE_ENV_ARG_PARAMETER);
+}
+
+template <class SERVANT_TYPE> CosNotification::EventTypeSeq*
+TAO_Notify_ProxySupplier_T<SERVANT_TYPE>::obtain_offered_types (CosNotifyChannelAdmin::ObtainInfoMode mode ACE_ENV_ARG_DECL)
+ ACE_THROW_SPEC ((
+ CORBA::SystemException
+ ))
+{
+ return this->obtain_types (mode, this->event_manager().offered_types () ACE_ENV_ARG_PARAMETER);
+}
+
+template <class SERVANT_TYPE> void
+TAO_Notify_ProxySupplier_T<SERVANT_TYPE>::subscription_change (const CosNotification::EventTypeSeq & added,
+ const CosNotification::EventTypeSeq & removed
+ ACE_ENV_ARG_DECL)
+ ACE_THROW_SPEC ((CORBA::SystemException,
+ CosNotifyComm::InvalidEventType))
+{
+ TAO_Notify_EventTypeSeq seq_added (added);
+ TAO_Notify_EventTypeSeq seq_removed (removed);
+
+ {
+ ACE_GUARD_THROW_EX (TAO_SYNCH_MUTEX, ace_mon, this->lock_,
+ CORBA::INTERNAL ());
+ ACE_CHECK;
+
+ this->subscribed_types_.add_and_remove (seq_added, seq_removed);
+ }
+
+ this->event_manager().subscription_change (this, seq_added, seq_removed ACE_ENV_ARG_PARAMETER);
+}
+
+template <class SERVANT_TYPE> void
+TAO_Notify_ProxySupplier_T<SERVANT_TYPE>::suspend_connection (ACE_ENV_SINGLE_ARG_DECL)
+ ACE_THROW_SPEC ((
+ CORBA::SystemException,
+ CosNotifyChannelAdmin::ConnectionAlreadyInactive,
+ CosNotifyChannelAdmin::NotConnected
+ ))
+{
+ {
+ ACE_GUARD_THROW_EX (TAO_SYNCH_MUTEX, ace_mon, this->lock_, CORBA::INTERNAL ());
+
+ if (this->is_connected () == 0)
+ ACE_THROW (CosNotifyChannelAdmin::NotConnected ());
+
+ if (this->consumer()->is_suspended () == 1)
+ ACE_THROW (CosNotifyChannelAdmin::ConnectionAlreadyInactive ());
+ }
+
+ this->consumer()->suspend (ACE_ENV_SINGLE_ARG_PARAMETER);
+ ACE_CHECK;
+ this->self_change (ACE_ENV_SINGLE_ARG_PARAMETER);
+ ACE_CHECK;
+}
+
+template <class SERVANT_TYPE> void
+TAO_Notify_ProxySupplier_T<SERVANT_TYPE>::resume_connection (ACE_ENV_SINGLE_ARG_DECL)
+ ACE_THROW_SPEC ((
+ CORBA::SystemException,
+ CosNotifyChannelAdmin::ConnectionAlreadyActive,
+ CosNotifyChannelAdmin::NotConnected
+ ))
+{
+ {
+ ACE_GUARD_THROW_EX (TAO_SYNCH_MUTEX, ace_mon, this->lock_, CORBA::INTERNAL ());
+
+ if (this->is_connected () == 0)
+ ACE_THROW (CosNotifyChannelAdmin::NotConnected ());
+
+ if (this->consumer()->is_suspended () == 0)
+ ACE_THROW (CosNotifyChannelAdmin::ConnectionAlreadyActive ());
+ }
+
+ this->consumer()->resume (ACE_ENV_SINGLE_ARG_PARAMETER);
+}
+
+template <class SERVANT_TYPE> CosNotifyChannelAdmin::ConsumerAdmin_ptr
+TAO_Notify_ProxySupplier_T<SERVANT_TYPE>::MyAdmin (ACE_ENV_SINGLE_ARG_DECL)
+ ACE_THROW_SPEC ((
+ CORBA::SystemException
+ ))
+{
+ CosNotifyChannelAdmin::ConsumerAdmin_var ret;
+
+ CORBA::Object_var object = this->consumer_admin().ref (ACE_ENV_SINGLE_ARG_PARAMETER);
+ ACE_CHECK_RETURN (ret._retn ());
+
+ ret = CosNotifyChannelAdmin::ConsumerAdmin::_narrow (object.in () ACE_ENV_ARG_PARAMETER);
+
+ return ret._retn ();
+}
+
+/***************************** UNIMPLEMENTED METHODS***************************************/
+
+template <class SERVANT_TYPE> CosNotifyFilter::MappingFilter_ptr
+TAO_Notify_ProxySupplier_T<SERVANT_TYPE>::priority_filter (ACE_ENV_SINGLE_ARG_DECL)
+ ACE_THROW_SPEC ((
+ CORBA::SystemException
+ ))
+{
+ ACE_THROW_RETURN (CORBA::NO_IMPLEMENT (),
+ CosNotifyFilter::MappingFilter::_nil ());
+
+ return CosNotifyFilter::MappingFilter::_nil ();
+}
+
+template <class SERVANT_TYPE> void
+TAO_Notify_ProxySupplier_T<SERVANT_TYPE>::priority_filter (CosNotifyFilter::MappingFilter_ptr /*priority_filter*/ ACE_ENV_ARG_DECL)
+ ACE_THROW_SPEC ((
+ CORBA::SystemException
+ ))
+{
+ ACE_THROW (CORBA::NO_IMPLEMENT ());
+}
+
+template <class SERVANT_TYPE> CosNotifyFilter::MappingFilter_ptr
+TAO_Notify_ProxySupplier_T<SERVANT_TYPE>::lifetime_filter (ACE_ENV_SINGLE_ARG_DECL)
+ ACE_THROW_SPEC ((
+ CORBA::SystemException
+ ))
+{
+ ACE_THROW_RETURN (CORBA::NO_IMPLEMENT (),
+ CosNotifyFilter::MappingFilter::_nil ());
+
+ return CosNotifyFilter::MappingFilter::_nil ();
+}
+
+template <class SERVANT_TYPE> void
+TAO_Notify_ProxySupplier_T<SERVANT_TYPE>::lifetime_filter (CosNotifyFilter::MappingFilter_ptr /*lifetime_filter*/ ACE_ENV_ARG_DECL)
+ ACE_THROW_SPEC ((
+ CORBA::SystemException
+ ))
+{
+ ACE_THROW (CORBA::NO_IMPLEMENT ());
+}
+
+TAO_END_VERSIONED_NAMESPACE_DECL
+
+#endif /* #define TAO_Notify_PROXYSUPPLIER_T_CPP */
diff --git a/TAO/orbsvcs/orbsvcs/Notify/ProxySupplier_T.h b/TAO/orbsvcs/orbsvcs/Notify/ProxySupplier_T.h
new file mode 100644
index 00000000000..f31cba76ee9
--- /dev/null
+++ b/TAO/orbsvcs/orbsvcs/Notify/ProxySupplier_T.h
@@ -0,0 +1,161 @@
+// -*- C++ -*-
+
+/**
+ * @file ProxySupplier_T.h
+ *
+ * $Id$
+ *
+ * @author Pradeep Gore <pradeep@oomworks.com>
+ */
+
+#ifndef TAO_Notify_PROXYSUPPLIER_T_H
+#define TAO_Notify_PROXYSUPPLIER_T_H
+#include /**/ "ace/pre.h"
+
+#include "orbsvcs/Notify/notify_serv_export.h"
+
+#if !defined (ACE_LACKS_PRAGMA_ONCE)
+# pragma once
+#endif /* ACE_LACKS_PRAGMA_ONCE */
+
+#include "orbsvcs/Notify/Proxy_T.h"
+#include "orbsvcs/Notify/ProxySupplier.h"
+
+TAO_BEGIN_VERSIONED_NAMESPACE_DECL
+
+/**
+ * @class TAO_Notify_ProxySupplier_T
+ *
+ * @brief
+ *
+ */
+template <class SERVANT_TYPE>
+class TAO_Notify_ProxySupplier_T : public virtual TAO_Notify_Proxy_T <SERVANT_TYPE>, public virtual TAO_Notify_ProxySupplier
+{
+public:
+ /// Constuctor
+ TAO_Notify_ProxySupplier_T (void);
+
+ /// Destructor
+ ~TAO_Notify_ProxySupplier_T ();
+
+ /// Notification of subscriptions set at the admin.
+ virtual void admin_types_changed (const CosNotification::EventTypeSeq & added,
+ const CosNotification::EventTypeSeq & removed
+ ACE_ENV_ARG_DECL);
+
+ ///= POA_Notify_Internal methods
+ /// POA_Notify_Internal::Event_Forwarder method
+ virtual void forward_structured (const CosNotification::StructuredEvent & event ACE_ENV_ARG_DECL)
+ ACE_THROW_SPEC ((
+ CORBA::SystemException
+ ));
+
+ /// POA_Notify_Internal::Event_Forwarder method
+ virtual void forward_structured_no_filtering (const CosNotification::StructuredEvent & event ACE_ENV_ARG_DECL)
+ ACE_THROW_SPEC ((
+ CORBA::SystemException
+ ));
+
+ /// POA_Notify_Internal::Event_Forwarder method
+ virtual void forward_any (const CORBA::Any & event ACE_ENV_ARG_DECL)
+ ACE_THROW_SPEC ((
+ CORBA::SystemException
+ ));
+
+ /// POA_Notify_Internal::Event_Forwarder method
+ virtual void forward_any_no_filtering (const CORBA::Any & event ACE_ENV_ARG_DECL)
+ ACE_THROW_SPEC ((
+ CORBA::SystemException
+ ));
+protected:
+ //= Data Members
+ CORBA::Boolean is_suspended_;
+
+ // = Interface methods
+ virtual CosNotifyChannelAdmin::ConsumerAdmin_ptr MyAdmin (
+ ACE_ENV_SINGLE_ARG_DECL
+ )
+ ACE_THROW_SPEC ((
+ CORBA::SystemException
+ ));
+
+ virtual void suspend_connection (
+ ACE_ENV_SINGLE_ARG_DECL
+ )
+ ACE_THROW_SPEC ((
+ CORBA::SystemException,
+ CosNotifyChannelAdmin::ConnectionAlreadyInactive,
+ CosNotifyChannelAdmin::NotConnected
+ ));
+
+ virtual void resume_connection (
+ ACE_ENV_SINGLE_ARG_DECL
+ )
+ ACE_THROW_SPEC ((
+ CORBA::SystemException,
+ CosNotifyChannelAdmin::ConnectionAlreadyActive,
+ CosNotifyChannelAdmin::NotConnected
+ ));
+
+ virtual CosNotifyFilter::MappingFilter_ptr priority_filter (
+ ACE_ENV_SINGLE_ARG_DECL
+ )
+ ACE_THROW_SPEC ((
+ CORBA::SystemException
+ ));
+
+ virtual void priority_filter (
+ CosNotifyFilter::MappingFilter_ptr priority_filter
+ ACE_ENV_ARG_DECL
+ )
+ ACE_THROW_SPEC ((
+ CORBA::SystemException
+ ));
+
+ virtual CosNotifyFilter::MappingFilter_ptr lifetime_filter (
+ ACE_ENV_SINGLE_ARG_DECL
+ )
+ ACE_THROW_SPEC ((
+ CORBA::SystemException
+ ));
+
+ virtual void lifetime_filter (
+ CosNotifyFilter::MappingFilter_ptr lifetime_filter
+ ACE_ENV_ARG_DECL
+ )
+ ACE_THROW_SPEC ((
+ CORBA::SystemException
+ ));
+
+ virtual CosNotification::EventTypeSeq * obtain_offered_types (
+ CosNotifyChannelAdmin::ObtainInfoMode mode
+ ACE_ENV_ARG_DECL
+ )
+ ACE_THROW_SPEC ((
+ CORBA::SystemException
+ ));
+
+ virtual void subscription_change (
+ const CosNotification::EventTypeSeq & added,
+ const CosNotification::EventTypeSeq & removed
+ ACE_ENV_ARG_DECL
+ )
+ ACE_THROW_SPEC ((
+ CORBA::SystemException,
+ CosNotifyComm::InvalidEventType
+ ));
+};
+
+TAO_END_VERSIONED_NAMESPACE_DECL
+
+#if defined (ACE_TEMPLATES_REQUIRE_SOURCE)
+#include "orbsvcs/Notify/ProxySupplier_T.cpp"
+#endif /* ACE_TEMPLATES_REQUIRE_SOURCE */
+
+#if defined (ACE_TEMPLATES_REQUIRE_PRAGMA)
+#pragma implementation ("ProxySupplier_T.cpp")
+#endif /* ACE_TEMPLATES_REQUIRE_PRAGMA */
+
+#include /**/ "ace/post.h"
+#endif /* TAO_Notify_PROXYSUPPLIER_T_H */
diff --git a/TAO/orbsvcs/orbsvcs/Notify/Proxy_T.cpp b/TAO/orbsvcs/orbsvcs/Notify/Proxy_T.cpp
new file mode 100644
index 00000000000..518db5e5c02
--- /dev/null
+++ b/TAO/orbsvcs/orbsvcs/Notify/Proxy_T.cpp
@@ -0,0 +1,165 @@
+// $Id$
+
+#include "orbsvcs/Notify/Proxy_T.h"
+
+#ifndef TAO_Notify_PROXY_T_CPP
+#define TAO_Notify_PROXY_T_CPP
+
+TAO_BEGIN_VERSIONED_NAMESPACE_DECL
+
+template <class SERVANT_TYPE>
+TAO_Notify_Proxy_T<SERVANT_TYPE>::TAO_Notify_Proxy_T (void)
+{
+ // Any object that is used by the POA gets a reference count of 1 at construction
+ this->_incr_refcnt();
+}
+
+template <class SERVANT_TYPE>
+TAO_Notify_Proxy_T<SERVANT_TYPE>::~TAO_Notify_Proxy_T ()
+{
+}
+
+template <class SERVANT_TYPE> PortableServer::Servant
+TAO_Notify_Proxy_T<SERVANT_TYPE>::servant (void)
+{
+ return this;
+}
+
+template <class SERVANT_TYPE> void
+TAO_Notify_Proxy_T<SERVANT_TYPE>::_add_ref (ACE_ENV_SINGLE_ARG_DECL_NOT_USED)
+{
+ this->_incr_refcnt ();
+}
+
+template <class SERVANT_TYPE> void
+TAO_Notify_Proxy_T<SERVANT_TYPE>::_remove_ref (ACE_ENV_SINGLE_ARG_DECL_NOT_USED)
+{
+ this->_decr_refcnt ();
+}
+
+template <class SERVANT_TYPE> void
+TAO_Notify_Proxy_T<SERVANT_TYPE>::validate_event_qos (const CosNotification::QoSProperties & /*required_qos*/, CosNotification::NamedPropertyRangeSeq_out /*available_qos*/ ACE_ENV_ARG_DECL)
+ ACE_THROW_SPEC ((
+ CORBA::SystemException,
+ CosNotification::UnsupportedQoS
+ ))
+{
+ ACE_THROW (CORBA::NO_IMPLEMENT ());
+}
+
+template <class SERVANT_TYPE> CosNotification::QoSProperties*
+TAO_Notify_Proxy_T<SERVANT_TYPE>::get_qos (ACE_ENV_SINGLE_ARG_DECL)
+ ACE_THROW_SPEC ((
+ CORBA::SystemException
+ ))
+{
+ ACE_GUARD_THROW_EX (TAO_SYNCH_MUTEX, ace_mon, this->lock_,
+ CORBA::INTERNAL ());
+ ACE_CHECK_RETURN (0);
+
+ return this->TAO_Notify_Object::get_qos (ACE_ENV_SINGLE_ARG_PARAMETER);
+}
+
+template <class SERVANT_TYPE> void
+TAO_Notify_Proxy_T<SERVANT_TYPE>::set_qos (const CosNotification::QoSProperties & qos ACE_ENV_ARG_DECL)
+ ACE_THROW_SPEC ((
+ CORBA::SystemException,
+ CosNotification::UnsupportedQoS
+ ))
+{
+ ACE_GUARD_THROW_EX (TAO_SYNCH_MUTEX, ace_mon, this->lock_,
+ CORBA::INTERNAL ());
+
+ this->TAO_Notify_Object::set_qos (qos ACE_ENV_ARG_PARAMETER);
+}
+
+template <class SERVANT_TYPE> void
+TAO_Notify_Proxy_T<SERVANT_TYPE>::validate_qos (
+ const CosNotification::QoSProperties & /*required_qos*/,
+ CosNotification::NamedPropertyRangeSeq_out /*available_qos*/
+ ACE_ENV_ARG_DECL
+ )
+ ACE_THROW_SPEC ((
+ CORBA::SystemException,
+ CosNotification::UnsupportedQoS
+ ))
+{
+ ACE_THROW (CORBA::NO_IMPLEMENT ());
+}
+
+template <class SERVANT_TYPE> CosNotifyFilter::FilterID
+TAO_Notify_Proxy_T<SERVANT_TYPE>::add_filter (CosNotifyFilter::Filter_ptr new_filter ACE_ENV_ARG_DECL)
+ ACE_THROW_SPEC ((
+ CORBA::SystemException
+ ))
+{
+ ACE_GUARD_THROW_EX (TAO_SYNCH_MUTEX, ace_mon, this->lock_,
+ CORBA::INTERNAL ());
+ ACE_CHECK_RETURN (0);
+
+ CosNotifyFilter::FilterID fid =
+ this->filter_admin_.add_filter (new_filter ACE_ENV_ARG_PARAMETER);
+ ACE_CHECK_RETURN(0);
+ this->self_change (ACE_ENV_SINGLE_ARG_PARAMETER);
+ ACE_CHECK_RETURN(fid);
+ return fid;
+}
+
+template <class SERVANT_TYPE> void
+TAO_Notify_Proxy_T<SERVANT_TYPE>::remove_filter (
+ CosNotifyFilter::FilterID filter
+ ACE_ENV_ARG_DECL
+ )
+ ACE_THROW_SPEC ((
+ CORBA::SystemException,
+ CosNotifyFilter::FilterNotFound
+ ))
+{
+ ACE_GUARD_THROW_EX (TAO_SYNCH_MUTEX, ace_mon, this->lock_,
+ CORBA::INTERNAL ());
+
+ this->filter_admin_.remove_filter (filter ACE_ENV_ARG_PARAMETER);
+}
+
+template <class SERVANT_TYPE> CosNotifyFilter::Filter_ptr
+TAO_Notify_Proxy_T<SERVANT_TYPE>::get_filter (CosNotifyFilter::FilterID filter ACE_ENV_ARG_DECL)
+ ACE_THROW_SPEC ((
+ CORBA::SystemException,
+ CosNotifyFilter::FilterNotFound
+ ))
+{
+ ACE_GUARD_THROW_EX (TAO_SYNCH_MUTEX, ace_mon, this->lock_,
+ CORBA::INTERNAL ());
+ ACE_CHECK_RETURN (CosNotifyFilter::Filter::_nil ());
+
+ return this->filter_admin_.get_filter (filter ACE_ENV_ARG_PARAMETER);
+}
+
+template <class SERVANT_TYPE> CosNotifyFilter::FilterIDSeq*
+TAO_Notify_Proxy_T<SERVANT_TYPE>::get_all_filters (ACE_ENV_SINGLE_ARG_DECL)
+ ACE_THROW_SPEC ((
+ CORBA::SystemException
+ ))
+{
+ ACE_GUARD_THROW_EX (TAO_SYNCH_MUTEX, ace_mon, this->lock_,
+ CORBA::INTERNAL ());
+ ACE_CHECK_RETURN (0);
+
+ return this->filter_admin_.get_all_filters (ACE_ENV_SINGLE_ARG_PARAMETER);
+}
+
+template <class SERVANT_TYPE> void
+TAO_Notify_Proxy_T<SERVANT_TYPE>::remove_all_filters (ACE_ENV_SINGLE_ARG_DECL)
+ ACE_THROW_SPEC ((
+ CORBA::SystemException
+ ))
+{
+ ACE_GUARD_THROW_EX (TAO_SYNCH_MUTEX, ace_mon, this->lock_,
+ CORBA::INTERNAL ());
+
+ this->filter_admin_.remove_all_filters (ACE_ENV_SINGLE_ARG_PARAMETER);
+}
+
+TAO_END_VERSIONED_NAMESPACE_DECL
+
+#endif /* TAO_Notify_PROXY_T_CPP */
diff --git a/TAO/orbsvcs/orbsvcs/Notify/Proxy_T.h b/TAO/orbsvcs/orbsvcs/Notify/Proxy_T.h
new file mode 100644
index 00000000000..2cdc149f502
--- /dev/null
+++ b/TAO/orbsvcs/orbsvcs/Notify/Proxy_T.h
@@ -0,0 +1,161 @@
+// -*- C++ -*-
+
+/**
+ * @file Proxy_T.h
+ *
+ * $Id$
+ *
+ * @author Pradeep Gore <pradeep@oomworks.com>
+ *
+ *
+ */
+
+#ifndef TAO_Notify_PROXY_T_H
+#define TAO_Notify_PROXY_T_H
+
+#include /**/ "ace/pre.h"
+
+#include "orbsvcs/Notify/notify_serv_export.h"
+
+#if !defined (ACE_LACKS_PRAGMA_ONCE)
+# pragma once
+#endif /* ACE_LACKS_PRAGMA_ONCE */
+
+#include "orbsvcs/Notify/Proxy.h"
+
+
+TAO_BEGIN_VERSIONED_NAMESPACE_DECL
+
+/**
+ * @class TAO_Notify_Proxy_T
+ *
+ * @brief The is a base class for all proxys , templatized by the servant
+ * type. All the Filter Admin and QoS Admin interface methods are
+ * implemented here by delegating to the admin implementations.
+ *
+ */
+template <class SERVANT_TYPE>
+class TAO_Notify_Proxy_T : public SERVANT_TYPE, public virtual TAO_Notify_Proxy
+{
+public:
+ /// Constuctor
+ TAO_Notify_Proxy_T (void);
+
+ /// Destructor
+ ~TAO_Notify_Proxy_T ();
+
+ /// Implements TAO_Notify_Object::servant method.
+ virtual PortableServer::Servant servant (void);
+
+ /// ServantBase refcount methods.
+ virtual void _add_ref (ACE_ENV_SINGLE_ARG_DECL);
+ virtual void _remove_ref (ACE_ENV_SINGLE_ARG_DECL);
+
+ virtual void validate_event_qos (
+ const CosNotification::QoSProperties & required_qos,
+ CosNotification::NamedPropertyRangeSeq_out available_qos
+ ACE_ENV_ARG_DECL
+ )
+ ACE_THROW_SPEC ((
+ CORBA::SystemException,
+ CosNotification::UnsupportedQoS
+ ));
+
+ virtual CosNotification::QoSProperties * get_qos (
+ ACE_ENV_SINGLE_ARG_DECL
+ )
+ ACE_THROW_SPEC ((
+ CORBA::SystemException
+ ));
+
+ virtual void set_qos (
+ const CosNotification::QoSProperties & qos
+ ACE_ENV_ARG_DECL
+ )
+ ACE_THROW_SPEC ((
+ CORBA::SystemException,
+ CosNotification::UnsupportedQoS
+ ));
+
+ virtual void validate_qos (
+ const CosNotification::QoSProperties & required_qos,
+ CosNotification::NamedPropertyRangeSeq_out available_qos
+ ACE_ENV_ARG_DECL
+ )
+ ACE_THROW_SPEC ((
+ CORBA::SystemException,
+ CosNotification::UnsupportedQoS
+ ));
+
+ virtual CosNotifyFilter::FilterID add_filter (
+ CosNotifyFilter::Filter_ptr new_filter
+ ACE_ENV_ARG_DECL
+ )
+ ACE_THROW_SPEC ((
+ CORBA::SystemException
+ ));
+
+ virtual void remove_filter (
+ CosNotifyFilter::FilterID filter
+ ACE_ENV_ARG_DECL
+ )
+ ACE_THROW_SPEC ((
+ CORBA::SystemException,
+ CosNotifyFilter::FilterNotFound
+ ));
+
+ virtual CosNotifyFilter::Filter_ptr get_filter (
+ CosNotifyFilter::FilterID filter
+ ACE_ENV_ARG_DECL
+ )
+ ACE_THROW_SPEC ((
+ CORBA::SystemException,
+ CosNotifyFilter::FilterNotFound
+ ));
+
+ virtual CosNotifyFilter::FilterIDSeq * get_all_filters (
+ ACE_ENV_SINGLE_ARG_DECL
+ )
+ ACE_THROW_SPEC ((
+ CORBA::SystemException
+ ));
+
+ virtual void remove_all_filters (
+ ACE_ENV_SINGLE_ARG_DECL
+ )
+ ACE_THROW_SPEC ((
+ CORBA::SystemException
+ ));
+};
+
+#if defined ACE_HAS_EXPLICIT_TEMPLATE_INSTANTIATION_EXPORT
+template class TAO_Notify_Serv_Export
+TAO_Notify_Proxy_T<POA_Event_Forwarder::StructuredProxyPushSupplier>;
+template class TAO_Notify_Serv_Export
+TAO_Notify_Proxy_T<POA_CosNotifyChannelAdmin::SequenceProxyPushSupplier>;
+template class TAO_Notify_Serv_Export
+TAO_Notify_Proxy_T<POA_Event_Forwarder::ProxyPushSupplier>;
+template class TAO_Notify_Serv_Export
+TAO_Notify_Proxy_T<POA_CosEventChannelAdmin::ProxyPushSupplier>;
+template class TAO_Notify_Serv_Export
+TAO_Notify_Proxy_T<POA_CosNotifyChannelAdmin::StructuredProxyPushConsumer>;
+template class TAO_Notify_Serv_Export
+TAO_Notify_Proxy_T<POA_CosNotifyChannelAdmin::SequenceProxyPushConsumer>;
+template class TAO_Notify_Serv_Export
+TAO_Notify_Proxy_T<POA_CosNotifyChannelAdmin::ProxyPushConsumer>;
+template class TAO_Notify_Serv_Export
+TAO_Notify_Proxy_T<POA_CosEventChannelAdmin::ProxyPushConsumer>;
+#endif /* ACE_HAS_EXPLICIT_TEMPLATE_INSTANTIATION_EXPORT */
+
+TAO_END_VERSIONED_NAMESPACE_DECL
+
+#if defined (ACE_TEMPLATES_REQUIRE_SOURCE)
+#include "orbsvcs/Notify/Proxy_T.cpp"
+#endif /* ACE_TEMPLATES_REQUIRE_SOURCE */
+
+#if defined (ACE_TEMPLATES_REQUIRE_PRAGMA)
+#pragma implementation ("Proxy_T.cpp")
+#endif /* ACE_TEMPLATES_REQUIRE_PRAGMA */
+
+#include /**/ "ace/post.h"
+#endif /* TAO_Notify_PROXY_T_H */
diff --git a/TAO/orbsvcs/orbsvcs/Notify/QoSProperties.cpp b/TAO/orbsvcs/orbsvcs/Notify/QoSProperties.cpp
new file mode 100644
index 00000000000..73d20823325
--- /dev/null
+++ b/TAO/orbsvcs/orbsvcs/Notify/QoSProperties.cpp
@@ -0,0 +1,218 @@
+// $Id$
+
+#include "orbsvcs/Notify/QoSProperties.h"
+
+#if ! defined (__ACE_INLINE__)
+#include "orbsvcs/Notify/QoSProperties.inl"
+#endif /* __ACE_INLINE__ */
+
+ACE_RCSID(Notify, TAO_Notify_QoSProperties, "$Id$")
+
+#include "orbsvcs/Notify/Property.h"
+#include "orbsvcs/Notify/Notify_Extensions.h"
+
+TAO_BEGIN_VERSIONED_NAMESPACE_DECL
+
+TAO_Notify_QoSProperties::TAO_Notify_QoSProperties (void)
+ : event_reliability_(CosNotification::EventReliability)
+ , connection_reliability_(CosNotification::ConnectionReliability)
+ , priority_ (CosNotification::Priority)
+ , timeout_ (CosNotification::Timeout)
+ , stop_time_supported_ (CosNotification::StopTimeSupported)
+ , maximum_batch_size_ (CosNotification::MaximumBatchSize)
+ , pacing_interval_ (CosNotification::PacingInterval)
+ , max_events_per_consumer_ (CosNotification::MaxEventsPerConsumer)
+ , discard_policy_ (CosNotification::DiscardPolicy)
+ , order_policy_ (CosNotification::OrderPolicy)
+ , thread_pool_ (NotifyExt::ThreadPool)
+ , thread_pool_lane_ (NotifyExt::ThreadPoolLanes)
+ , blocking_policy_(TAO_Notify_Extensions::BlockingPolicy)
+{
+ unsupported_[0] = CosNotification::StartTimeSupported;
+}
+
+TAO_Notify_QoSProperties::~TAO_Notify_QoSProperties ()
+{
+}
+
+int
+TAO_Notify_QoSProperties::unsupported (ACE_CString& name)
+{
+ for (int i = 0; i < UNSUPPORTED_PROPERTY_COUNT; ++i)
+ {
+ if (this->unsupported_[i] == name)
+ return 1;
+ }
+
+ return 0;
+}
+void
+TAO_Notify_QoSProperties::init ()
+{
+ if (this->event_reliability_.is_valid())
+ {
+ CORBA::Any a;
+ a <<= this->event_reliability_.value();
+ this->add(this->event_reliability_.name(), a);
+ }
+ if (this->connection_reliability_.is_valid())
+ {
+ CORBA::Any a;
+ a <<= this->connection_reliability_.value();
+ this->add(this->connection_reliability_.name(), a);
+ }
+ if (this->priority_.is_valid())
+ {
+ CORBA::Any a;
+ a <<= this->priority_.value();
+ this->add(this->priority_.name(), a);
+ }
+ if (this->timeout_.is_valid())
+ {
+ CORBA::Any a;
+ a <<= this->timeout_.value();
+ this->add(this->timeout_.name(), a);
+ }
+ if (this->stop_time_supported_.is_valid())
+ {
+ CORBA::Any a;
+ a <<= CORBA::Any::from_boolean (this->stop_time_supported_.value());
+ this->add(this->stop_time_supported_.name(), a);
+ }
+ if (this->maximum_batch_size_.is_valid())
+ {
+ CORBA::Any a;
+ a <<= this->maximum_batch_size_.value();
+ this->add(this->maximum_batch_size_.name(), a);
+ }
+ if (this->pacing_interval_.is_valid())
+ {
+ CORBA::Any a;
+ a <<= this->pacing_interval_.value();
+ this->add(this->pacing_interval_.name(), a);
+ }
+ if (this->max_events_per_consumer_.is_valid())
+ {
+ CORBA::Any a;
+ a <<= this->max_events_per_consumer_.value();
+ this->add(this->max_events_per_consumer_.name(), a);
+ }
+ if (this->discard_policy_.is_valid())
+ {
+ CORBA::Any a;
+ a <<= this->discard_policy_.value();
+ this->add(this->discard_policy_.name(), a);
+ }
+ if (this->order_policy_.is_valid())
+ {
+ CORBA::Any a;
+ a <<= this->order_policy_.value();
+ this->add(this->order_policy_.name(), a);
+ }
+
+ if (this->thread_pool_.is_valid())
+ {
+ CORBA::Any a;
+ a <<= this->thread_pool_.value();
+ this->add(this->thread_pool_.name(), a);
+ }
+ if (this->thread_pool_lane_.is_valid())
+ {
+ CORBA::Any a;
+ a <<= this->thread_pool_lane_.value();
+ this->add(this->thread_pool_lane_.name(), a);
+ }
+ if (this->blocking_policy_.is_valid())
+ {
+ CORBA::Any a;
+ a <<= this->blocking_policy_.value();
+ this->add(this->blocking_policy_.name(), a);
+ }
+}
+
+int
+TAO_Notify_QoSProperties::init (const CosNotification::PropertySeq& prop_seq, CosNotification::PropertyErrorSeq& err_seq)
+{
+ int err_index = -1;
+
+ ACE_CString name;
+ for (CORBA::ULong i = 0; i < prop_seq.length (); ++i)
+ {
+ name = prop_seq[i].name.in();
+
+ if (this->unsupported (name))
+ {
+ err_index = err_seq.length ();
+ err_seq.length (err_seq.length () + 1);
+
+ err_seq[err_index].code = CosNotification::UNSUPPORTED_PROPERTY;
+ err_seq[err_index].name = CORBA::string_dup (prop_seq[i].name);
+ }
+ else if (this->property_map_.rebind (prop_seq[i].name.in (), prop_seq[i].value) == -1)
+ return -1;
+ // Note call to rebind. This allows to call <init> to set updates.
+ }
+
+ if (prop_seq.length () > 0)
+ {
+ this->event_reliability_.set (*this);
+ this->connection_reliability_.set (*this);
+ this->priority_.set (*this);
+ this->timeout_.set (*this);
+ this->stop_time_supported_.set (*this);
+ this->maximum_batch_size_.set (*this);
+ this->pacing_interval_.set (*this);
+ this->max_events_per_consumer_.set (*this);
+ this->discard_policy_.set (*this);
+ this->order_policy_.set (*this);
+
+ this->thread_pool_.set (*this);
+ this->thread_pool_lane_.set (*this);
+ this->blocking_policy_.set (*this);
+ }
+
+ return err_index == -1 ? 0 : 1;
+}
+
+int
+TAO_Notify_QoSProperties::copy (TAO_Notify_QoSProperties& qos_properties)
+{
+ qos_properties.event_reliability_ = this->event_reliability_;
+ qos_properties.connection_reliability_ = this->connection_reliability_;
+ qos_properties.priority_ = this->priority_;
+ qos_properties.timeout_ = this->timeout_;
+ qos_properties.stop_time_supported_ = this->stop_time_supported_;
+ qos_properties.maximum_batch_size_ = this->maximum_batch_size_;
+ qos_properties.pacing_interval_ = this->pacing_interval_;
+ qos_properties.max_events_per_consumer_ = this->max_events_per_consumer_;
+ qos_properties.discard_policy_ = this->discard_policy_;
+ qos_properties.order_policy_ = this->order_policy_;
+
+ qos_properties.blocking_policy_ = this->blocking_policy_;
+
+ PROPERTY_MAP::ITERATOR iter (this->property_map_);
+ PROPERTY_MAP::ENTRY *entry;
+
+ for (; iter.next (entry); iter.advance ())
+ {
+ if (qos_properties.property_map_.rebind (entry->ext_id_, entry->int_id_) == -1)
+ return -1;
+ }
+
+ return 0;
+}
+
+int
+TAO_Notify_QoSProperties::transfer (TAO_Notify_QoSProperties& qos_properties)
+{
+ if (this->copy (qos_properties) == -1)
+ return -1;
+
+ // unbind the properties that we don't want to transfer.
+ qos_properties.property_map_.unbind (NotifyExt::ThreadPool);
+ qos_properties.property_map_.unbind (NotifyExt::ThreadPoolLanes);
+
+ return 0;
+}
+
+TAO_END_VERSIONED_NAMESPACE_DECL
diff --git a/TAO/orbsvcs/orbsvcs/Notify/QoSProperties.h b/TAO/orbsvcs/orbsvcs/Notify/QoSProperties.h
new file mode 100644
index 00000000000..6ce71f0941c
--- /dev/null
+++ b/TAO/orbsvcs/orbsvcs/Notify/QoSProperties.h
@@ -0,0 +1,120 @@
+// -*- C++ -*-
+
+/**
+ * @file QoSProperties.h
+ *
+ * $Id$
+ *
+ * @author Pradeep Gore <pradeep@oomworks.com>
+ */
+
+#ifndef TAO_Notify_QOSPROPERTIES_H
+#define TAO_Notify_QOSPROPERTIES_H
+
+#include /**/ "ace/pre.h"
+
+#include "orbsvcs/Notify/notify_serv_export.h"
+
+#if !defined (ACE_LACKS_PRAGMA_ONCE)
+# pragma once
+#endif /* ACE_LACKS_PRAGMA_ONCE */
+
+#include "orbsvcs/Notify/PropertySeq.h"
+#include "orbsvcs/Notify/Property_T.h"
+#include "orbsvcs/Notify/Property_Boolean.h"
+#include "orbsvcs/Notify/Property.h"
+
+TAO_BEGIN_VERSIONED_NAMESPACE_DECL
+
+/**
+ * @class TAO_Notify_QoSProperties
+ *
+ * @brief
+ *
+ */
+class TAO_Notify_Serv_Export TAO_Notify_QoSProperties : public TAO_Notify_PropertySeq
+{
+public:
+ /// Constuctor
+ TAO_Notify_QoSProperties (void);
+
+ /// Destructor
+ virtual ~TAO_Notify_QoSProperties ();
+
+ /// Return 0 on success, 1 if unsupported properties were detected and -1 on error.
+ int init (const CosNotification::PropertySeq& prop_seq, CosNotification::PropertyErrorSeq& err_seq);
+
+ /// This version initializes the base from our members
+ void init ();
+
+ /// Populate <qos_properties> with all properties from this object. Returns -1 on error.
+ int copy (TAO_Notify_QoSProperties& qos_properties);
+
+ /// Populate <qos_properties> with properties that can be transfered.Returns -1 on error.
+ int transfer (TAO_Notify_QoSProperties& qos_properties);
+
+ ///= Accessors
+ const TAO_Notify_Property_ThreadPool& thread_pool (void) const;
+ const TAO_Notify_Property_ThreadPoolLanes& thread_pool_lane (void) const;
+
+ const TAO_Notify_Property_Short& event_reliability (void) const;
+ const TAO_Notify_Property_Short& connection_reliability (void) const;
+ const TAO_Notify_Property_Short& priority (void) const;
+ const TAO_Notify_Property_Time& timeout (void) const;
+ const TAO_Notify_Property_Boolean& stop_time_supported (void) const;
+ const TAO_Notify_Property_Long& maximum_batch_size (void) const;
+ const TAO_Notify_Property_Time& pacing_interval (void) const;
+ const TAO_Notify_Property_Long& max_events_per_consumer (void) const;
+ const TAO_Notify_Property_Short& discard_policy(void) const;
+ const TAO_Notify_Property_Short& order_policy(void) const;
+ const TAO_Notify_Property_Time& blocking_policy(void) const;
+
+ // The non-const accessors are used during topology load
+ TAO_Notify_Property_Short& event_reliability (void);
+ TAO_Notify_Property_Short& connection_reliability (void);
+ TAO_Notify_Property_Short& priority (void);
+ TAO_Notify_Property_Time& timeout (void);
+ TAO_Notify_Property_Boolean& stop_time_supported (void);
+ TAO_Notify_Property_Long& maximum_batch_size (void);
+ TAO_Notify_Property_Time& pacing_interval (void);
+ TAO_Notify_Property_Long& max_events_per_consumer (void);
+ TAO_Notify_Property_Short& discard_policy(void);
+ TAO_Notify_Property_Short& order_policy(void);
+ TAO_Notify_Property_Time& blocking_policy(void);
+
+protected:
+ /// Return 1 if <value> is unsupported.
+ int unsupported (ACE_CString& name);
+
+ enum {UNSUPPORTED_PROPERTY_COUNT = 1};
+
+ ///= Unsupported Properties.
+ ACE_CString unsupported_[UNSUPPORTED_PROPERTY_COUNT];
+
+ ///= Supported standard properties
+ TAO_Notify_Property_Short event_reliability_;
+ TAO_Notify_Property_Short connection_reliability_;
+ TAO_Notify_Property_Short priority_;
+ TAO_Notify_Property_Time timeout_;
+ TAO_Notify_Property_Boolean stop_time_supported_;
+ TAO_Notify_Property_Long maximum_batch_size_;
+ TAO_Notify_Property_Time pacing_interval_;
+ TAO_Notify_Property_Long max_events_per_consumer_;
+ TAO_Notify_Property_Short discard_policy_;
+ TAO_Notify_Property_Short order_policy_;
+
+ /// TAO Extensions
+ TAO_Notify_Property_ThreadPool thread_pool_;
+ TAO_Notify_Property_ThreadPoolLanes thread_pool_lane_;
+ TAO_Notify_Property_Time blocking_policy_;
+};
+
+TAO_END_VERSIONED_NAMESPACE_DECL
+
+#if defined (__ACE_INLINE__)
+#include "orbsvcs/Notify/QoSProperties.inl"
+#endif /* __ACE_INLINE__ */
+
+#include /**/ "ace/post.h"
+
+#endif /* TAO_Notify_QOSPROPERTIES_H */
diff --git a/TAO/orbsvcs/orbsvcs/Notify/QoSProperties.inl b/TAO/orbsvcs/orbsvcs/Notify/QoSProperties.inl
new file mode 100644
index 00000000000..6cf7f8f44fa
--- /dev/null
+++ b/TAO/orbsvcs/orbsvcs/Notify/QoSProperties.inl
@@ -0,0 +1,163 @@
+// -*- C++ -*-
+//
+// $Id$
+
+TAO_BEGIN_VERSIONED_NAMESPACE_DECL
+
+ACE_INLINE
+const TAO_Notify_Property_Short&
+TAO_Notify_QoSProperties::event_reliability(void) const
+{
+ return this->event_reliability_;
+}
+
+ACE_INLINE
+const TAO_Notify_Property_Short&
+TAO_Notify_QoSProperties::connection_reliability(void) const
+{
+ return this->connection_reliability_;
+}
+
+ACE_INLINE
+const TAO_Notify_Property_Short&
+TAO_Notify_QoSProperties::priority(void) const
+{
+ return this->priority_;
+}
+
+ACE_INLINE
+const TAO_Notify_Property_Time&
+TAO_Notify_QoSProperties::timeout(void) const
+{
+ return this->timeout_;
+}
+
+ACE_INLINE
+const TAO_Notify_Property_Boolean&
+TAO_Notify_QoSProperties::stop_time_supported(void) const
+{
+ return this->stop_time_supported_;
+}
+
+ACE_INLINE const TAO_Notify_Property_Long&
+TAO_Notify_QoSProperties::maximum_batch_size (void) const
+{
+ return this->maximum_batch_size_;
+}
+
+ACE_INLINE const TAO_Notify_Property_Time&
+TAO_Notify_QoSProperties::pacing_interval (void) const
+{
+ return this->pacing_interval_;
+}
+
+ACE_INLINE
+const TAO_Notify_Property_Long&
+TAO_Notify_QoSProperties::max_events_per_consumer (void) const
+{
+ return this->max_events_per_consumer_;
+}
+
+ACE_INLINE
+const TAO_Notify_Property_Short&
+TAO_Notify_QoSProperties::discard_policy(void) const
+{
+ return this->discard_policy_;
+}
+
+ACE_INLINE
+const TAO_Notify_Property_Short&
+TAO_Notify_QoSProperties::order_policy(void) const
+{
+ return this->order_policy_;
+}
+
+ACE_INLINE const TAO_Notify_Property_ThreadPool&
+TAO_Notify_QoSProperties::thread_pool (void) const
+{
+ return this->thread_pool_;
+}
+
+ACE_INLINE const TAO_Notify_Property_ThreadPoolLanes&
+TAO_Notify_QoSProperties::thread_pool_lane (void) const
+{
+ return this->thread_pool_lane_;
+}
+
+ACE_INLINE
+const TAO_Notify_Property_Time&
+TAO_Notify_QoSProperties::blocking_policy(void) const
+{
+ return this->blocking_policy_;
+}
+
+///////////////////////////////////////////////////////////////////////////////
+
+ACE_INLINE
+TAO_Notify_Property_Short&
+TAO_Notify_QoSProperties::event_reliability(void)
+{
+ return this->event_reliability_;
+}
+
+ACE_INLINE
+TAO_Notify_Property_Short&
+TAO_Notify_QoSProperties::connection_reliability(void)
+{
+ return this->connection_reliability_;
+}
+
+ACE_INLINE
+TAO_Notify_Property_Short&
+TAO_Notify_QoSProperties::priority(void)
+{
+ return this->priority_;
+}
+
+ACE_INLINE
+TAO_Notify_Property_Time&
+TAO_Notify_QoSProperties::timeout(void)
+{
+ return this->timeout_;
+}
+
+ACE_INLINE
+TAO_Notify_Property_Boolean&
+TAO_Notify_QoSProperties::stop_time_supported(void)
+{
+ return this->stop_time_supported_;
+}
+
+ACE_INLINE TAO_Notify_Property_Long&
+TAO_Notify_QoSProperties::maximum_batch_size (void)
+{
+ return this->maximum_batch_size_;
+}
+
+ACE_INLINE TAO_Notify_Property_Time&
+TAO_Notify_QoSProperties::pacing_interval (void)
+{
+ return this->pacing_interval_;
+}
+ACE_INLINE
+TAO_Notify_Property_Long&
+TAO_Notify_QoSProperties::max_events_per_consumer (void)
+{
+ return this->max_events_per_consumer_;
+}
+
+ACE_INLINE
+TAO_Notify_Property_Short&
+TAO_Notify_QoSProperties::discard_policy(void)
+{
+ return this->discard_policy_;
+}
+
+ACE_INLINE
+TAO_Notify_Property_Short&
+TAO_Notify_QoSProperties::order_policy(void)
+{
+ return this->order_policy_;
+}
+
+TAO_END_VERSIONED_NAMESPACE_DECL
diff --git a/TAO/orbsvcs/orbsvcs/Notify/README b/TAO/orbsvcs/orbsvcs/Notify/README
new file mode 100644
index 00000000000..c30991c4c95
--- /dev/null
+++ b/TAO/orbsvcs/orbsvcs/Notify/README
@@ -0,0 +1,51 @@
+README,v 1.5 2000/12/07 05:56:27 pradeep Exp
+
+README for the Notification Service
+-----------------------------------
+
+Implementation notes
+--------------------
+
+Here is a brief description of the MT options for the Notify Service.
+The motivation for adding these "knobs" is give the user a chance to
+fine tune his/her thread requirements in the Service at its
+bottlenecks. These bottlenecks are at filter evaluation and in the two
+way push to consumers. These are the points at which the Event Channel
+has to interact with remote objects whose implementation is unknown to
+the Event Channel. e.g. if a consumer decided to execute a tight loop
+in its push method, it would block the entire event channel if it was
+single threaded. By deploying a thread pool to perform dispatching
+events to consumers - we can alleviate this problem.
+
+[Also read the $TAO_ROOT/orbsvcs/Notify_Service/README for a proper
+description of how to specify these parameters.]
+
+-DispatchingThreads
+Consider a Notify service running with just one thread, namely the main.
+In this case when the event channel dispatches an event to a consumer (by
+calling its push method) all other consumers will be blocked, waiting for
+their push methods to be invoked. To decouple the consumers from one
+another we can deploy dispatching threads using this option.
+
+
+-SourceThreads
+Deploys a thread pool after event receipt from the supplier. All subsequent
+notification channel processing can happen on this thread and the original
+publishing push() can be ended. Separates server side processing of the
+event from the supplier's publication.
+
+
+Usage:
+-----
+Use the $TAO_ROOT/orbsvcs/Notify_Service to register a ChannelFactory with the
+Naming Service.See the README for more details.
+
+Examples:
+--------
+The $TAO_ROOT/orbsvcs/examples/Notify/Filter example shows how to using
+filtering.
+
+The $TAO_ROOT/orbsvcs/examples/Notify/Subscribe example shows how consumers
+can subscribe only to the required event types.
+
+send comments/suggestions to Pradeep Gore <pradeep@cs.wustl.edu>
diff --git a/TAO/orbsvcs/orbsvcs/Notify/RT_Builder.cpp b/TAO/orbsvcs/orbsvcs/Notify/RT_Builder.cpp
new file mode 100644
index 00000000000..98b297f069a
--- /dev/null
+++ b/TAO/orbsvcs/orbsvcs/Notify/RT_Builder.cpp
@@ -0,0 +1,73 @@
+// $Id$
+
+#include "orbsvcs/Notify/RT_Builder.h"
+
+#include "ace/Auto_Ptr.h"
+#include "ace/Dynamic_Service.h"
+#include "orbsvcs/Notify/ETCL_FilterFactory.h"
+#include "orbsvcs/Notify/RT_POA_Helper.h"
+#include "orbsvcs/Notify/Properties.h"
+#include "orbsvcs/NotifyExtC.h"
+#include "orbsvcs/Notify/Object.h"
+
+ACE_RCSID (RT_Notify,
+ TAO_Notify_RT_Builder,
+ "$Id$")
+
+TAO_BEGIN_VERSIONED_NAMESPACE_DECL
+
+TAO_Notify_RT_Builder::TAO_Notify_RT_Builder (void)
+{
+}
+
+TAO_Notify_RT_Builder::~TAO_Notify_RT_Builder ()
+{
+}
+
+void
+TAO_Notify_RT_Builder::apply_thread_pool_concurrency (TAO_Notify_Object& object
+ , const NotifyExt::ThreadPoolParams& tp_params ACE_ENV_ARG_DECL)
+{
+ TAO_Notify_RT_POA_Helper* proxy_poa = 0;
+
+ // Bootstrap EC Proxy POA
+ ACE_NEW_THROW_EX (proxy_poa,
+ TAO_Notify_RT_POA_Helper (),
+ CORBA::NO_MEMORY ());
+ ACE_CHECK;
+
+ ACE_Auto_Ptr<TAO_Notify_POA_Helper> auto_proxy_poa (proxy_poa);
+
+ PortableServer::POA_var default_poa = TAO_Notify_PROPERTIES::instance ()->default_poa ();
+
+ proxy_poa->init (default_poa.in (), tp_params ACE_ENV_ARG_PARAMETER);
+ ACE_CHECK;
+
+ // Give ownership of proxy_poa
+ object.set_proxy_poa (auto_proxy_poa.release ());
+}
+
+void
+TAO_Notify_RT_Builder::apply_lane_concurrency (TAO_Notify_Object& object
+ , const NotifyExt::ThreadPoolLanesParams& tpl_params ACE_ENV_ARG_DECL)
+{
+ TAO_Notify_RT_POA_Helper* proxy_poa = 0;
+
+ // Bootstrap EC Proxy POA
+ ACE_NEW_THROW_EX (proxy_poa,
+ TAO_Notify_RT_POA_Helper (),
+ CORBA::NO_MEMORY ());
+ ACE_CHECK;
+
+ ACE_Auto_Ptr<TAO_Notify_POA_Helper> auto_proxy_poa (proxy_poa);
+
+ PortableServer::POA_var default_poa = TAO_Notify_PROPERTIES::instance ()->default_poa ();
+
+ proxy_poa->init (default_poa.in (), tpl_params ACE_ENV_ARG_PARAMETER);
+ ACE_CHECK;
+
+ // Give ownership of proxy_poa
+ object.set_proxy_poa (auto_proxy_poa.release ());
+}
+
+TAO_END_VERSIONED_NAMESPACE_DECL
diff --git a/TAO/orbsvcs/orbsvcs/Notify/RT_Builder.h b/TAO/orbsvcs/orbsvcs/Notify/RT_Builder.h
new file mode 100644
index 00000000000..6e0b2bba087
--- /dev/null
+++ b/TAO/orbsvcs/orbsvcs/Notify/RT_Builder.h
@@ -0,0 +1,50 @@
+// -*- C++ -*-
+
+/**
+ * @file RT_Builder.h
+ *
+ * $Id$
+ *
+ * @author Pradeep Gore <pradeep@oomworks.com>
+ */
+
+#ifndef TAO_Notify_RT_BUILDER_H
+#define TAO_Notify_RT_BUILDER_H
+#include /**/ "ace/pre.h"
+
+#include "orbsvcs/Notify/rt_notify_export.h"
+
+#if !defined (ACE_LACKS_PRAGMA_ONCE)
+# pragma once
+#endif /* ACE_LACKS_PRAGMA_ONCE */
+
+#include "orbsvcs/Notify/Builder.h"
+
+TAO_BEGIN_VERSIONED_NAMESPACE_DECL
+
+/**
+ * @class TAO_Notify_RT_Builder
+ *
+ * @brief Builder for RT specific classes.
+ *
+ */
+class TAO_RT_Notify_Export TAO_Notify_RT_Builder : public TAO_Notify_Builder
+{
+public:
+ /// Constuctor
+ TAO_Notify_RT_Builder (void);
+
+ /// Destructor
+ virtual ~TAO_Notify_RT_Builder ();
+
+ /// Apply Thread Pools.
+ virtual void apply_thread_pool_concurrency (TAO_Notify_Object& object, const NotifyExt::ThreadPoolParams& tp_params ACE_ENV_ARG_DECL);
+
+ /// Apply Thread Pools with Lanes.
+ virtual void apply_lane_concurrency (TAO_Notify_Object& object, const NotifyExt::ThreadPoolLanesParams& tpl_params ACE_ENV_ARG_DECL);
+};
+
+TAO_END_VERSIONED_NAMESPACE_DECL
+
+#include /**/ "ace/post.h"
+#endif /* TAO_Notify_RT_BUILDER_H */
diff --git a/TAO/orbsvcs/orbsvcs/Notify/RT_Factory.cpp b/TAO/orbsvcs/orbsvcs/Notify/RT_Factory.cpp
new file mode 100644
index 00000000000..af5484fed61
--- /dev/null
+++ b/TAO/orbsvcs/orbsvcs/Notify/RT_Factory.cpp
@@ -0,0 +1,131 @@
+// $Id$
+
+#include "orbsvcs/Notify/RT_Factory.h"
+#include "orbsvcs/Notify/Structured/RT_StructuredProxyPushSupplier.h"
+
+ACE_RCSID(RT_Notify, TAO_Notify_RT_Factory, "$Id$")
+
+
+TAO_BEGIN_VERSIONED_NAMESPACE_DECL
+
+TAO_Notify_RT_Factory::TAO_Notify_RT_Factory (void)
+{
+}
+
+TAO_Notify_RT_Factory::~TAO_Notify_RT_Factory ()
+{
+}
+
+void
+TAO_Notify_RT_Factory::create (TAO_Notify_StructuredProxyPushSupplier*& proxy ACE_ENV_ARG_DECL)
+{
+ ACE_NEW_THROW_EX (proxy,
+ TAO_Notify_RT_StructuredProxyPushSupplier (),
+ CORBA::NO_MEMORY ());
+}
+
+void
+TAO_Notify_RT_Factory:: create (TAO_Notify_ProxySupplier_Collection*& collection ACE_ENV_ARG_DECL)
+{
+ TAO_Notify_Default_Factory::create (collection ACE_ENV_ARG_PARAMETER);
+}
+
+void
+TAO_Notify_RT_Factory:: create (TAO_Notify_ProxyConsumer_Collection*& collection ACE_ENV_ARG_DECL)
+{
+ TAO_Notify_Default_Factory::create (collection ACE_ENV_ARG_PARAMETER);
+}
+
+void
+TAO_Notify_RT_Factory:: create (TAO_Notify_EventChannel_Collection*& collection ACE_ENV_ARG_DECL)
+{
+ TAO_Notify_Default_Factory::create (collection ACE_ENV_ARG_PARAMETER);
+}
+
+void
+TAO_Notify_RT_Factory:: create (TAO_Notify_ConsumerAdmin_Collection*& collection ACE_ENV_ARG_DECL)
+{
+ TAO_Notify_Default_Factory::create (collection ACE_ENV_ARG_PARAMETER);
+}
+
+void
+TAO_Notify_RT_Factory:: create (TAO_Notify_SupplierAdmin_Collection*& collection ACE_ENV_ARG_DECL)
+{
+ TAO_Notify_Default_Factory::create (collection ACE_ENV_ARG_PARAMETER);
+}
+
+void
+TAO_Notify_RT_Factory:: create (TAO_Notify_Proxy_Collection*& collection ACE_ENV_ARG_DECL)
+{
+ TAO_Notify_Default_Factory::create (collection ACE_ENV_ARG_PARAMETER);
+}
+
+void
+TAO_Notify_RT_Factory:: create (TAO_Notify_EventChannelFactory*& channel_factory ACE_ENV_ARG_DECL)
+{
+ TAO_Notify_Default_Factory::create (channel_factory ACE_ENV_ARG_PARAMETER);
+}
+
+void
+TAO_Notify_RT_Factory:: create (TAO_Notify_EventChannel*& channel ACE_ENV_ARG_DECL)
+{
+ TAO_Notify_Default_Factory::create (channel ACE_ENV_ARG_PARAMETER);
+}
+
+void
+TAO_Notify_RT_Factory:: create (TAO_Notify_SupplierAdmin*& admin ACE_ENV_ARG_DECL)
+{
+ TAO_Notify_Default_Factory::create (admin ACE_ENV_ARG_PARAMETER);
+}
+
+void
+TAO_Notify_RT_Factory:: create (TAO_Notify_ConsumerAdmin*& admin ACE_ENV_ARG_DECL)
+{
+ TAO_Notify_Default_Factory::create (admin ACE_ENV_ARG_PARAMETER);
+}
+
+void
+TAO_Notify_RT_Factory:: create (TAO_Notify_ProxyPushConsumer*& proxy ACE_ENV_ARG_DECL)
+{
+ TAO_Notify_Default_Factory::create (proxy ACE_ENV_ARG_PARAMETER);
+}
+
+void
+TAO_Notify_RT_Factory:: create (TAO_Notify_ProxyPushSupplier*& proxy ACE_ENV_ARG_DECL)
+{
+ TAO_Notify_Default_Factory::create (proxy ACE_ENV_ARG_PARAMETER);
+}
+
+void
+TAO_Notify_RT_Factory:: create (TAO_Notify_CosEC_ProxyPushConsumer*& proxy ACE_ENV_ARG_DECL)
+{
+ TAO_Notify_Default_Factory::create (proxy ACE_ENV_ARG_PARAMETER);
+}
+
+void
+TAO_Notify_RT_Factory:: create (TAO_Notify_CosEC_ProxyPushSupplier*& proxy ACE_ENV_ARG_DECL)
+{
+ TAO_Notify_Default_Factory::create (proxy ACE_ENV_ARG_PARAMETER);
+}
+
+void
+TAO_Notify_RT_Factory:: create (TAO_Notify_StructuredProxyPushConsumer*& proxy ACE_ENV_ARG_DECL)
+{
+ TAO_Notify_Default_Factory::create (proxy ACE_ENV_ARG_PARAMETER);
+}
+
+void
+TAO_Notify_RT_Factory:: create (TAO_Notify_SequenceProxyPushConsumer*& proxy ACE_ENV_ARG_DECL)
+{
+ TAO_Notify_Default_Factory::create (proxy ACE_ENV_ARG_PARAMETER);
+}
+
+void
+TAO_Notify_RT_Factory:: create (TAO_Notify_SequenceProxyPushSupplier*& proxy ACE_ENV_ARG_DECL)
+{
+ TAO_Notify_Default_Factory::create (proxy ACE_ENV_ARG_PARAMETER);
+}
+
+TAO_END_VERSIONED_NAMESPACE_DECL
+
+ACE_FACTORY_DEFINE (TAO_RT_Notify, TAO_Notify_RT_Factory)
diff --git a/TAO/orbsvcs/orbsvcs/Notify/RT_Factory.h b/TAO/orbsvcs/orbsvcs/Notify/RT_Factory.h
new file mode 100644
index 00000000000..38bf46c4662
--- /dev/null
+++ b/TAO/orbsvcs/orbsvcs/Notify/RT_Factory.h
@@ -0,0 +1,100 @@
+// -*- C++ -*-
+
+/**
+ * @file RT_Factory.h
+ *
+ * $Id$
+ *
+ * @author Pradeep Gore <pradeep@oomworks.com>
+ */
+
+#ifndef TAO_Notify_RT_FACTORY_H
+#define TAO_Notify_RT_FACTORY_H
+#include /**/ "ace/pre.h"
+
+#include "orbsvcs/Notify/rt_notify_export.h"
+
+#if !defined (ACE_LACKS_PRAGMA_ONCE)
+# pragma once
+#endif /* ACE_LACKS_PRAGMA_ONCE */
+
+#include "orbsvcs/Notify/Default_Factory.h"
+
+TAO_BEGIN_VERSIONED_NAMESPACE_DECL
+
+/**
+ * @class TAO_Notify_RT_Factory
+ *
+ * @brief The Factory for the RT aware Notify classes.
+ *
+ */
+class TAO_RT_Notify_Export TAO_Notify_RT_Factory : public TAO_Notify_Default_Factory
+{
+public:
+ /// Constuctor
+ TAO_Notify_RT_Factory (void);
+
+ /// Destructor
+ virtual ~TAO_Notify_RT_Factory ();
+
+ /// Create ProxySupplier Collection
+ virtual void create (TAO_Notify_ProxySupplier_Collection*& collection ACE_ENV_ARG_DECL);
+
+ /// Create ProxyConsumer Collection
+ virtual void create (TAO_Notify_ProxyConsumer_Collection*& collection ACE_ENV_ARG_DECL);
+
+ /// Create EventChannel Collection
+ virtual void create (TAO_Notify_EventChannel_Collection*& collection ACE_ENV_ARG_DECL);
+
+ /// Create ConsumerAdmin Collection
+ virtual void create (TAO_Notify_ConsumerAdmin_Collection*& collection ACE_ENV_ARG_DECL);
+
+ /// Create SupplierAdmin Collection
+ virtual void create (TAO_Notify_SupplierAdmin_Collection*& collection ACE_ENV_ARG_DECL);
+
+ /// Create Proxy Collection
+ virtual void create (TAO_Notify_Proxy_Collection*& collection ACE_ENV_ARG_DECL);
+
+ /// Create EventChannelDefault_Factory
+ virtual void create (TAO_Notify_EventChannelFactory*& channel_factory ACE_ENV_ARG_DECL);
+
+ /// Create EventChannel
+ virtual void create (TAO_Notify_EventChannel*& channel ACE_ENV_ARG_DECL);
+
+ /// Create SupplierAdmin
+ virtual void create (TAO_Notify_SupplierAdmin*& admin ACE_ENV_ARG_DECL);
+
+ /// Create ConsumerAdmin
+ virtual void create (TAO_Notify_ConsumerAdmin*& admin ACE_ENV_ARG_DECL);
+
+ /// Create ProxyPushConsumer
+ virtual void create (TAO_Notify_ProxyPushConsumer*& proxy ACE_ENV_ARG_DECL);
+
+ /// Create ProxyPushSupplier
+ virtual void create (TAO_Notify_ProxyPushSupplier*& proxy ACE_ENV_ARG_DECL);
+
+ /// Create CosEC_ProxyPushConsumer
+ virtual void create (TAO_Notify_CosEC_ProxyPushConsumer*& proxy ACE_ENV_ARG_DECL);
+
+ /// Create CosEC_ProxyPushSupplier
+ virtual void create (TAO_Notify_CosEC_ProxyPushSupplier*& proxy ACE_ENV_ARG_DECL);
+
+ /// Create StructuredProxyPushConsumer
+ virtual void create (TAO_Notify_StructuredProxyPushConsumer*& proxy ACE_ENV_ARG_DECL);
+
+ /// Create StructuredProxyPushSupplier
+ virtual void create (TAO_Notify_StructuredProxyPushSupplier*& proxy ACE_ENV_ARG_DECL);
+
+ /// Create SequenceProxyPushConsumer
+ virtual void create (TAO_Notify_SequenceProxyPushConsumer*& proxy ACE_ENV_ARG_DECL);
+
+ /// Create SequenceProxyPushSupplier
+ virtual void create (TAO_Notify_SequenceProxyPushSupplier*& proxy ACE_ENV_ARG_DECL);
+};
+
+TAO_END_VERSIONED_NAMESPACE_DECL
+
+ACE_FACTORY_DECLARE (TAO_RT_Notify, TAO_Notify_RT_Factory)
+
+#include /**/ "ace/post.h"
+#endif /* TAO_Notify_RT_FACTORY_H */
diff --git a/TAO/orbsvcs/orbsvcs/Notify/RT_Notify_Service.cpp b/TAO/orbsvcs/orbsvcs/Notify/RT_Notify_Service.cpp
new file mode 100644
index 00000000000..f9e4ce24128
--- /dev/null
+++ b/TAO/orbsvcs/orbsvcs/Notify/RT_Notify_Service.cpp
@@ -0,0 +1,98 @@
+// $Id$
+
+#include "orbsvcs/Notify/RT_Notify_Service.h"
+
+ACE_RCSID(RT_Notify, TAO_Notify_RT_Notify_Service, "$Id$")
+
+#include "ace/Dynamic_Service.h"
+#include "orbsvcs/Notify/Properties.h"
+#include "orbsvcs/Notify/RT_Properties.h"
+#include "orbsvcs/Notify/RT_Factory.h"
+#include "orbsvcs/Notify/RT_Builder.h"
+
+TAO_BEGIN_VERSIONED_NAMESPACE_DECL
+
+TAO_RT_Notify_Service::TAO_RT_Notify_Service (void)
+{
+}
+
+TAO_RT_Notify_Service::~TAO_RT_Notify_Service ()
+{
+}
+
+void
+TAO_RT_Notify_Service::init_service (CORBA::ORB_ptr orb ACE_ENV_ARG_DECL)
+{
+ ACE_DEBUG ((LM_DEBUG, "Loading the Real-Time Notification Service...\n"));
+
+ this->init_i (orb ACE_ENV_ARG_PARAMETER);
+ ACE_CHECK;
+}
+
+void
+TAO_RT_Notify_Service::init_i (CORBA::ORB_ptr orb ACE_ENV_ARG_DECL)
+{
+ //Init the base class.
+ TAO_CosNotify_Service::init_i (orb ACE_ENV_ARG_PARAMETER);
+ ACE_CHECK;
+
+ TAO_Notify_RT_Properties* properties = TAO_Notify_RT_PROPERTIES::instance();
+
+ // Resolve RTORB
+ CORBA::Object_var object =
+ orb->resolve_initial_references ("RTORB"
+ ACE_ENV_ARG_PARAMETER);
+ ACE_CHECK;
+
+ RTCORBA::RTORB_var rt_orb =
+ RTCORBA::RTORB::_narrow (object.in ()
+ ACE_ENV_ARG_PARAMETER);
+ ACE_CHECK;
+
+ // Resolve RTCurrent
+ object =
+ orb->resolve_initial_references ("RTCurrent"
+ ACE_ENV_ARG_PARAMETER);
+ ACE_CHECK;
+
+ RTCORBA::Current_var current =
+ RTCORBA::Current::_narrow (object.in ()
+ ACE_ENV_ARG_PARAMETER);
+ ACE_CHECK;
+
+ /// Set the properties
+ properties->rt_orb (rt_orb.in ());
+ properties->current (current.in ());
+}
+
+TAO_Notify_Factory*
+TAO_RT_Notify_Service::create_factory (ACE_ENV_SINGLE_ARG_DECL)
+{
+ TAO_Notify_Factory* factory =
+ ACE_Dynamic_Service<TAO_Notify_Factory>::instance ("TAO_Notify_Factory");
+
+ if (factory == 0)
+ {
+ ACE_NEW_THROW_EX (factory,
+ TAO_Notify_RT_Factory (),
+ CORBA::NO_MEMORY ());
+ ACE_CHECK_RETURN(0);
+ }
+ return factory;
+}
+
+TAO_Notify_Builder*
+TAO_RT_Notify_Service::create_builder (ACE_ENV_SINGLE_ARG_DECL)
+{
+ TAO_Notify_Builder* builder = 0;
+ ACE_NEW_THROW_EX (builder,
+ TAO_Notify_RT_Builder (),
+ CORBA::NO_MEMORY ());
+ ACE_CHECK_RETURN(0);
+
+ return builder;
+}
+
+TAO_END_VERSIONED_NAMESPACE_DECL
+
+ACE_FACTORY_DEFINE (TAO_RT_Notify,TAO_RT_Notify_Service)
diff --git a/TAO/orbsvcs/orbsvcs/Notify/RT_Notify_Service.h b/TAO/orbsvcs/orbsvcs/Notify/RT_Notify_Service.h
new file mode 100644
index 00000000000..6383e95fc34
--- /dev/null
+++ b/TAO/orbsvcs/orbsvcs/Notify/RT_Notify_Service.h
@@ -0,0 +1,61 @@
+// -*- C++ -*-
+
+/**
+ * @file RT_Notify_Service.h
+ *
+ * $Id$
+ *
+ * @author Pradeep Gore <pradeep@oomworks.com>
+ *
+ *
+ */
+
+#ifndef TAO_Notify_RT_NOTIFY_SERVICE_H
+#define TAO_Notify_RT_NOTIFY_SERVICE_H
+
+#include /**/ "ace/pre.h"
+#include "orbsvcs/Notify/rt_notify_export.h"
+
+#if !defined (ACE_LACKS_PRAGMA_ONCE)
+# pragma once
+#endif /* ACE_LACKS_PRAGMA_ONCE */
+
+#include "orbsvcs/Notify/CosNotify_Service.h"
+
+TAO_BEGIN_VERSIONED_NAMESPACE_DECL
+
+/**
+ * @class TAO_RT_Notify_Service
+ *
+ * @brief Implemetation of the TAO_Notify_Service interface for RT Notification.
+ *
+ */
+class TAO_RT_Notify_Export TAO_RT_Notify_Service : public TAO_CosNotify_Service
+{
+public:
+ /// Constuctor
+ TAO_RT_Notify_Service (void);
+
+ /// Destructor
+ ~TAO_RT_Notify_Service ();
+
+ /// Init the service.
+ virtual void init_service (CORBA::ORB_ptr orb ACE_ENV_ARG_DECL);
+
+protected:
+ /// Init the data members
+ virtual void init_i (CORBA::ORB_ptr orb ACE_ENV_ARG_DECL);
+
+ /// Create the Factory for RT Notify objects.
+ virtual TAO_Notify_Factory* create_factory (ACE_ENV_SINGLE_ARG_DECL);
+
+ /// Creates the Builder for RT Notify objects.
+ virtual TAO_Notify_Builder* create_builder (ACE_ENV_SINGLE_ARG_DECL);
+};
+
+TAO_END_VERSIONED_NAMESPACE_DECL
+
+ACE_FACTORY_DECLARE (TAO_RT_Notify,TAO_RT_Notify_Service)
+
+#include /**/ "ace/post.h"
+#endif /* TAO_Notify_RT_NOTIFY_SERVICE_H */
diff --git a/TAO/orbsvcs/orbsvcs/Notify/RT_POA_Helper.cpp b/TAO/orbsvcs/orbsvcs/Notify/RT_POA_Helper.cpp
new file mode 100644
index 00000000000..81859ded60f
--- /dev/null
+++ b/TAO/orbsvcs/orbsvcs/Notify/RT_POA_Helper.cpp
@@ -0,0 +1,166 @@
+// $Id$
+
+#include "orbsvcs/Notify/RT_POA_Helper.h"
+#include "tao/RTCORBA/RTCORBA.h"
+#include "tao/debug.h"
+#include "orbsvcs/NotifyExtC.h"
+#include "orbsvcs/Notify/RT_Properties.h"
+#include "ace/SString.h"
+
+ACE_RCSID (Notify,
+ TAO_Notify_RT_POA_Helper,
+ "$Id$")
+
+TAO_BEGIN_VERSIONED_NAMESPACE_DECL
+
+TAO_Notify_RT_POA_Helper::~TAO_Notify_RT_POA_Helper ()
+{
+}
+
+void
+TAO_Notify_RT_POA_Helper::init (PortableServer::POA_ptr parent_poa, const NotifyExt::ThreadPoolParams& tp_params ACE_ENV_ARG_DECL)
+{
+ ACE_CString child_poa_name = this->get_unique_id ();
+
+ this->init (parent_poa, child_poa_name.c_str (), tp_params ACE_ENV_ARG_PARAMETER);
+}
+
+void
+TAO_Notify_RT_POA_Helper::init (PortableServer::POA_ptr parent_poa, const char* poa_name
+ , const NotifyExt::ThreadPoolParams& tp_params ACE_ENV_ARG_DECL)
+{
+ CORBA::PolicyList policy_list (4);
+
+ this->set_policy (parent_poa, policy_list ACE_ENV_ARG_PARAMETER);
+ ACE_CHECK;
+
+ RTCORBA::RTORB_var rt_orb = TAO_Notify_RT_PROPERTIES::instance ()->rt_orb ();
+
+ RTCORBA::PriorityModel priority_model =
+ tp_params.priority_model == NotifyExt::CLIENT_PROPAGATED ?
+ RTCORBA::CLIENT_PROPAGATED : RTCORBA::SERVER_DECLARED;
+
+ if (TAO_debug_level > 0)
+ ACE_DEBUG ((LM_DEBUG, "Priority Model = %d, Server prio = %d\n"
+ , tp_params.priority_model, tp_params.server_priority));
+
+ policy_list.length (3);
+ policy_list[2] =
+ rt_orb->create_priority_model_policy (priority_model,
+ tp_params.server_priority
+ ACE_ENV_ARG_PARAMETER);
+ ACE_CHECK;
+
+ if (TAO_debug_level > 0)
+ ACE_DEBUG ((LM_DEBUG, "Creating threadpool: static threads = %d, def. prio = %d\n"
+ , tp_params.static_threads, tp_params.default_priority));
+
+ // Create the thread-pool.
+ RTCORBA::ThreadpoolId threadpool_id =
+ rt_orb->create_threadpool (tp_params.stacksize,
+ tp_params.static_threads,
+ tp_params.dynamic_threads,
+ tp_params.default_priority,
+ tp_params.allow_request_buffering,
+ tp_params.max_buffered_requests,
+ tp_params.max_request_buffer_size
+ ACE_ENV_ARG_PARAMETER);
+ ACE_CHECK;
+
+ policy_list.length (4);
+ policy_list[3] =
+ rt_orb->create_threadpool_policy (threadpool_id
+ ACE_ENV_ARG_PARAMETER);
+ ACE_CHECK;
+
+ this->create_i (parent_poa, poa_name, policy_list ACE_ENV_ARG_PARAMETER);
+}
+
+void
+TAO_Notify_RT_POA_Helper::init (PortableServer::POA_ptr parent_poa, const NotifyExt::ThreadPoolLanesParams& tpl_params ACE_ENV_ARG_DECL)
+{
+ ACE_CString child_poa_name = this->get_unique_id ();
+
+ this->init (parent_poa, child_poa_name.c_str (), tpl_params ACE_ENV_ARG_PARAMETER);
+}
+
+void
+TAO_Notify_RT_POA_Helper::init (PortableServer::POA_ptr parent_poa, const char* poa_name
+ , const NotifyExt::ThreadPoolLanesParams& tpl_params ACE_ENV_ARG_DECL)
+{
+ CORBA::PolicyList policy_list (4);
+
+ this->set_policy (parent_poa, policy_list ACE_ENV_ARG_PARAMETER);
+ ACE_CHECK;
+
+ RTCORBA::RTORB_var rt_orb = TAO_Notify_RT_PROPERTIES::instance ()->rt_orb ();
+
+ RTCORBA::PriorityModel priority_model =
+ tpl_params.priority_model == NotifyExt::CLIENT_PROPAGATED ?
+ RTCORBA::CLIENT_PROPAGATED : RTCORBA::SERVER_DECLARED;
+
+ policy_list.length (3);
+ policy_list[2] =
+ rt_orb->create_priority_model_policy (priority_model,
+ tpl_params.server_priority
+ ACE_ENV_ARG_PARAMETER);
+ ACE_CHECK;
+
+ // Populate RTCORBA Lanes.
+ RTCORBA::ThreadpoolLanes lanes (tpl_params.lanes.length ());
+ lanes.length (tpl_params.lanes.length ());
+
+ for (CORBA::ULong index = 0; index < tpl_params.lanes.length (); ++index)
+ {
+ if (TAO_debug_level > 0)
+ {
+ ACE_DEBUG ((LM_DEBUG, "Creating threadpool lane %d: priority = %d, static threads = %d\n",
+ index, tpl_params.lanes[index].lane_priority, tpl_params.lanes[index].static_threads));
+ }
+
+ lanes[index].lane_priority = tpl_params.lanes[index].lane_priority;
+ lanes[index].static_threads = tpl_params.lanes[index].static_threads;
+ lanes[index].dynamic_threads = tpl_params.lanes[index].dynamic_threads;
+ }
+
+ // Create the thread-pool.
+ RTCORBA::ThreadpoolId threadpool_id =
+ rt_orb->create_threadpool_with_lanes (tpl_params.stacksize,
+ lanes,
+ tpl_params.allow_borrowing,
+ tpl_params.allow_request_buffering,
+ tpl_params.max_buffered_requests,
+ tpl_params.max_request_buffer_size
+ ACE_ENV_ARG_PARAMETER);
+ ACE_CHECK;
+
+ policy_list.length (4);
+ policy_list[3] =
+ rt_orb->create_threadpool_policy (threadpool_id
+ ACE_ENV_ARG_PARAMETER);
+ ACE_CHECK;
+
+ this->create_i (parent_poa, poa_name, policy_list ACE_ENV_ARG_PARAMETER);
+}
+
+void
+TAO_Notify_RT_POA_Helper::init (PortableServer::POA_ptr parent_poa ACE_ENV_ARG_DECL)
+{
+ CORBA::PolicyList policy_list (1);
+
+ RTCORBA::RTORB_var rt_orb = TAO_Notify_RT_PROPERTIES::instance ()->rt_orb ();
+
+ policy_list.length (1);
+
+ policy_list[0] =
+ rt_orb->create_priority_model_policy (RTCORBA::CLIENT_PROPAGATED,
+ 0
+ ACE_ENV_ARG_PARAMETER);
+ ACE_CHECK;
+
+ ACE_CString child_poa_name = this->get_unique_id ();
+
+ this->create_i (parent_poa, child_poa_name.c_str (), policy_list ACE_ENV_ARG_PARAMETER);
+}
+
+TAO_END_VERSIONED_NAMESPACE_DECL
diff --git a/TAO/orbsvcs/orbsvcs/Notify/RT_POA_Helper.h b/TAO/orbsvcs/orbsvcs/Notify/RT_POA_Helper.h
new file mode 100644
index 00000000000..d272420ef98
--- /dev/null
+++ b/TAO/orbsvcs/orbsvcs/Notify/RT_POA_Helper.h
@@ -0,0 +1,63 @@
+// -*- C++ -*-
+
+/**
+ * @file RT_POA_Helper.h
+ *
+ * $Id$
+ *
+ * @author Pradeep Gore <pradeep@oomworks.com>
+ */
+
+#ifndef TAO_Notify_RT_POA_Helper_H
+#define TAO_Notify_RT_POA_Helper_H
+#include /**/ "ace/pre.h"
+
+#include "orbsvcs/Notify/rt_notify_export.h"
+
+#if !defined (ACE_LACKS_PRAGMA_ONCE)
+# pragma once
+#endif /* ACE_LACKS_PRAGMA_ONCE */
+
+#include "orbsvcs/Notify/POA_Helper.h"
+#include "orbsvcs/NotifyExtC.h"
+
+TAO_BEGIN_VERSIONED_NAMESPACE_DECL
+
+/**
+ * @class TAO_Notify_RT_POA_Helper
+ *
+ * @brief Helper for creating RT POA objects.
+ *
+ */
+class TAO_RT_Notify_Export TAO_Notify_RT_POA_Helper : public TAO_Notify_POA_Helper
+{
+public:
+ /// Destructor
+ ~TAO_Notify_RT_POA_Helper ();
+
+ /// Create a new PortableServer::POA.
+ /// The UNIQUE_ID, USER_ID , CLIENT_PROPAGATED and thread pool policy is applied to the new POA.
+ void init (PortableServer::POA_ptr parent_poa, const char* poa_name, const NotifyExt::ThreadPoolParams& tp_params ACE_ENV_ARG_DECL);
+
+ /// Create a new PortableServer::POA. The name is chosen at random.
+ /// The UNIQUE_ID, USER_ID , CLIENT_PROPAGATED and thread pool policy is applied to the new POA.
+ void init (PortableServer::POA_ptr parent_poa, const NotifyExt::ThreadPoolParams& tp_params ACE_ENV_ARG_DECL);
+
+ /// Create a new PortableServer::POA.
+ /// The UNIQUE_ID, USER_ID , CLIENT_PROPAGATED and thread lane policy is applied to the new POA.
+ void init (PortableServer::POA_ptr parent_poa, const char* poa_name,
+ const NotifyExt::ThreadPoolLanesParams& tpl_params ACE_ENV_ARG_DECL);
+
+ /// Create a new PortableServer::POA. The name is chosen at random.
+ /// The UNIQUE_ID, USER_ID , CLIENT_PROPAGATED and thread lane policy is applied to the new POA.
+ void init (PortableServer::POA_ptr parent_poa, const NotifyExt::ThreadPoolLanesParams& tpl_params ACE_ENV_ARG_DECL);
+
+ /// Create a new PortableServer::POA. The name is chosen at random.
+ /// The CLIENT_PROPAGATED policy is applied to the new POA.
+ void init (PortableServer::POA_ptr parent_poa ACE_ENV_ARG_DECL);
+};
+
+TAO_END_VERSIONED_NAMESPACE_DECL
+
+#include /**/ "ace/post.h"
+#endif /* TAO_Notify_RT_POA_Helper_H */
diff --git a/TAO/orbsvcs/orbsvcs/Notify/RT_Properties.cpp b/TAO/orbsvcs/orbsvcs/Notify/RT_Properties.cpp
new file mode 100644
index 00000000000..6a5aff084e8
--- /dev/null
+++ b/TAO/orbsvcs/orbsvcs/Notify/RT_Properties.cpp
@@ -0,0 +1,22 @@
+// $Id$
+
+#include "orbsvcs/Notify/RT_Properties.h"
+
+#if ! defined (__ACE_INLINE__)
+#include "orbsvcs/Notify/RT_Properties.inl"
+#endif /* __ACE_INLINE__ */
+
+ACE_RCSID(RT_Notify, TAO_Notify_RT_Properties, "$Id$")
+
+
+TAO_BEGIN_VERSIONED_NAMESPACE_DECL
+
+TAO_Notify_RT_Properties::TAO_Notify_RT_Properties (void)
+{
+}
+
+TAO_Notify_RT_Properties::~TAO_Notify_RT_Properties ()
+{
+}
+
+TAO_END_VERSIONED_NAMESPACE_DECL
diff --git a/TAO/orbsvcs/orbsvcs/Notify/RT_Properties.h b/TAO/orbsvcs/orbsvcs/Notify/RT_Properties.h
new file mode 100644
index 00000000000..124f8757145
--- /dev/null
+++ b/TAO/orbsvcs/orbsvcs/Notify/RT_Properties.h
@@ -0,0 +1,68 @@
+// -*- C++ -*-
+
+/**
+ * @file RT_Properties.h
+ *
+ * $Id$
+ *
+ * @author Pradeep Gore <pradeep@oomworks.com>
+ */
+
+#ifndef TAO_Notify_RT_PROPERTIES_H
+#define TAO_Notify_RT_PROPERTIES_H
+#include /**/ "ace/pre.h"
+
+#include "orbsvcs/Notify/rt_notify_export.h"
+
+#if !defined (ACE_LACKS_PRAGMA_ONCE)
+# pragma once
+#endif /* ACE_LACKS_PRAGMA_ONCE */
+
+#include "tao/TAO_Singleton.h"
+#include "tao/RTCORBA/RTCORBA.h"
+
+TAO_BEGIN_VERSIONED_NAMESPACE_DECL
+
+/**
+ * @class TAO_Notify_RT_Properties
+ *
+ * @brief RT specifc global properties are stored here.
+ *
+ */
+class TAO_RT_Notify_Export TAO_Notify_RT_Properties
+{
+ friend class TAO_Singleton<TAO_Notify_RT_Properties, TAO_SYNCH_MUTEX>;
+
+public:
+ /// Constuctor
+ TAO_Notify_RT_Properties (void);
+
+ /// Destructor
+ ~TAO_Notify_RT_Properties ();
+
+ RTCORBA::RTORB_ptr rt_orb (void);
+ void rt_orb (RTCORBA::RTORB_ptr rt_orb);
+
+ RTCORBA::Current_ptr current (void);
+ void current (RTCORBA::Current_ptr current);
+
+protected:
+ /// RT-ORB
+ RTCORBA::RTORB_var rt_orb_;
+
+ /// Current
+ RTCORBA::Current_var current_;
+};
+
+TAO_RT_NOTIFY_SINGLETON_DECLARE (TAO_Singleton, TAO_Notify_RT_Properties, TAO_SYNCH_MUTEX)
+
+typedef TAO_Singleton<TAO_Notify_RT_Properties, TAO_SYNCH_MUTEX> TAO_Notify_RT_PROPERTIES;
+
+TAO_END_VERSIONED_NAMESPACE_DECL
+
+#if defined (__ACE_INLINE__)
+#include "orbsvcs/Notify/RT_Properties.inl"
+#endif /* __ACE_INLINE__ */
+
+#include /**/ "ace/post.h"
+#endif /* TAO_Notify_RT_PROPERTIES_H */
diff --git a/TAO/orbsvcs/orbsvcs/Notify/RT_Properties.inl b/TAO/orbsvcs/orbsvcs/Notify/RT_Properties.inl
new file mode 100644
index 00000000000..71fae93e7ba
--- /dev/null
+++ b/TAO/orbsvcs/orbsvcs/Notify/RT_Properties.inl
@@ -0,0 +1,31 @@
+// -*- C++ -*-
+//
+// $Id$
+
+TAO_BEGIN_VERSIONED_NAMESPACE_DECL
+
+ACE_INLINE RTCORBA::RTORB_ptr
+TAO_Notify_RT_Properties::rt_orb (void)
+{
+ return RTCORBA::RTORB::_duplicate (rt_orb_.in ());
+}
+
+ACE_INLINE void
+TAO_Notify_RT_Properties::rt_orb (RTCORBA::RTORB_ptr rt_orb)
+{
+ rt_orb_ = RTCORBA::RTORB::_duplicate (rt_orb);
+}
+
+ACE_INLINE RTCORBA::Current_ptr
+TAO_Notify_RT_Properties::current (void)
+{
+ return RTCORBA::Current::_duplicate (current_.in());
+}
+
+ACE_INLINE void
+TAO_Notify_RT_Properties::current (RTCORBA::Current_ptr current)
+{
+ current_ = RTCORBA::Current::_duplicate (current);
+}
+
+TAO_END_VERSIONED_NAMESPACE_DECL
diff --git a/TAO/orbsvcs/orbsvcs/Notify/Random_File.cpp b/TAO/orbsvcs/orbsvcs/Notify/Random_File.cpp
new file mode 100644
index 00000000000..b0e528de02b
--- /dev/null
+++ b/TAO/orbsvcs/orbsvcs/Notify/Random_File.cpp
@@ -0,0 +1,161 @@
+// $Id$
+
+#include "orbsvcs/Notify/Random_File.h"
+
+#include "ace/OS.h"
+#include "ace/Log_Msg.h"
+#include "tao/debug.h"
+//#define DEBUG_LEVEL 9
+#ifndef DEBUG_LEVEL
+# define DEBUG_LEVEL TAO_debug_level
+#endif //DEBUG_LEVEL
+
+TAO_BEGIN_VERSIONED_NAMESPACE_DECL
+
+namespace TAO_Notify
+{
+
+Random_File::Random_File()
+ : block_size_(512)
+{
+}
+
+Random_File::~Random_File()
+{
+ this->close();
+}
+
+size_t
+Random_File::block_size() const
+{
+ return this->block_size_;
+}
+
+size_t
+Random_File::size() const
+{
+ Random_File * mutable_this = const_cast<Random_File *> (this);
+ ACE_GUARD_RETURN (ACE_SYNCH_MUTEX, ace_mon, mutable_this->lock_, 0);
+ size_t original_pos = mutable_this->tell ();
+ mutable_this->ACE_FILE::seek(0, SEEK_END);
+ size_t cursize = mutable_this->tell();
+ mutable_this->ACE_FILE::seek (original_pos, SEEK_SET);
+ if ((cursize % this->block_size_) != 0)
+ {
+ cursize += this->block_size_;
+ }
+ return cursize / this->block_size_;
+}
+
+bool
+Random_File::open(const ACE_TCHAR* filename, size_t block_size)
+{
+ ACE_GUARD_RETURN (ACE_SYNCH_MUTEX, ace_mon, this->lock_, false);
+ this->block_size_ = block_size;
+ bool result = (this->close() == 0);
+
+ if (result)
+ {
+ if (DEBUG_LEVEL > 8) ACE_DEBUG ((LM_DEBUG,
+ ACE_TEXT ("(%P|%t) Opening file %s\n")
+ , filename
+ ));
+ ACE_HANDLE handle = ACE_OS::open(filename,
+ O_CREAT | O_RDWR | O_BINARY,
+ ACE_DEFAULT_FILE_PERMS);
+
+ if (handle == ACE_INVALID_HANDLE)
+ {
+ result = false;
+ }
+ else
+ {
+ this->set_handle(handle);
+ if (this->get_handle() == 0)
+ {
+ result = false;
+ }
+ else
+ {
+ result = (this->addr_.set(filename) == 0);
+ }
+ }
+ }
+ return result;
+}
+
+bool
+Random_File::write(const size_t block_number, void* buf, bool atomic)
+{
+ ACE_GUARD_RETURN (ACE_SYNCH_MUTEX, ace_mon, this->lock_, false);
+ if (DEBUG_LEVEL > 8) ACE_DEBUG ((LM_DEBUG,
+ ACE_TEXT ("(%P|%t) Write block %d %c\n"),
+ static_cast<int> (block_number),
+ (atomic ? '*' : ' ')
+ ));
+ bool result = this->seek(block_number);
+ if (result)
+ {
+ if (atomic)
+ {
+ // sync before so that any block pointed to from this block
+ // will be there when this block is written.
+ result = sync();
+ }
+ // ACE uses an ssize_t for buffer size, so we do this to make it happy.
+ ssize_t block_size = this->block_size_;
+ if (result && (block_size !=
+ ACE_OS::write(this->get_handle(), buf, block_size)))
+ {
+ result = false;
+ }
+ if (result && atomic)
+ {
+ // sync after to provide the caller with a guarantee that
+ // this block is physically written to the storage device.
+ result = sync();
+ }
+ }
+ return result;
+}
+
+bool
+Random_File::read(const size_t block_number, void* buf)
+{
+ ACE_GUARD_RETURN (ACE_SYNCH_MUTEX, ace_mon, this->lock_, false);
+ if (DEBUG_LEVEL > 8) ACE_DEBUG ((LM_DEBUG,
+ ACE_TEXT ("(%P|%t) Read block %d\n"),
+ static_cast<int> (block_number)
+ ));
+ bool result = this->seek(block_number);
+ if (result)
+ {
+ ssize_t block_size = this->block_size_;
+ if (block_size !=
+ ACE_OS::read(this->get_handle(), buf, block_size))
+ {
+ result = false;
+ }
+ }
+ return result;
+}
+
+bool
+Random_File::seek(const size_t block_number)
+{
+ ssize_t destloc = block_number * this->block_size_;
+ bool result = (destloc == this->ACE_FILE::seek(destloc, SEEK_SET));
+ return result;
+}
+
+bool
+Random_File::sync()
+{
+ bool result = false;
+ result = (0 == ACE_OS::fsync(this->get_handle()));
+ return result;
+}
+
+} /* namespace TAO_Notify */
+
+TAO_END_VERSIONED_NAMESPACE_DECL
diff --git a/TAO/orbsvcs/orbsvcs/Notify/Random_File.h b/TAO/orbsvcs/orbsvcs/Notify/Random_File.h
new file mode 100644
index 00000000000..c3ebfcd96bf
--- /dev/null
+++ b/TAO/orbsvcs/orbsvcs/Notify/Random_File.h
@@ -0,0 +1,94 @@
+// -*- C++ -*-
+
+//=============================================================================
+/**
+ * @file Random_File.h
+ *
+ * $Id$
+ *
+ * This class implements a a random-access file containing
+ * fixed-size blocks.
+ *
+ * @author Jonathan Pollack <pollack_j@ociweb.com>
+ */
+//=============================================================================
+
+#ifndef RANDOM_FILE_H
+#define RANDOM_FILE_H
+#include /**/ "ace/pre.h"
+#include /**/ "ace/config-all.h"
+
+#if !defined (ACE_LACKS_PRAGMA_ONCE)
+#pragma once
+#endif /* ACE_LACKS_PRAGMA_ONCE */
+
+#include "orbsvcs/Notify/notify_serv_export.h"
+#include "tao/Versioned_Namespace.h"
+#include "ace/FILE.h"
+#include "ace/streams.h"
+#include "ace/Synch_T.h"
+
+TAO_BEGIN_VERSIONED_NAMESPACE_DECL
+
+namespace TAO_Notify
+{
+
+/**
+ * \brief A random file class.
+ *
+ * Derived from ACE_FILE, this class provides access to a
+ * file of fixed-size blocks.
+ *
+ */
+class TAO_Notify_Serv_Export Random_File : public ACE_FILE
+{
+public:
+ /// The constructor.
+ Random_File();
+
+ /// The destructor, which closes the open file.
+ ~Random_File();
+
+ /// Open a file with default permissions.
+ bool open(const ACE_TCHAR* filename, size_t block_size = 512);
+
+ /// Accessor for the block size.
+ /// Note signed size_t is used to be compatible with
+ /// ACE_FILE.
+ size_t block_size() const;
+
+ /// Return the current file size, in number of blocks.
+ size_t size() const;
+
+ /// Write a block to our file, potentially as an "atomic" write.
+ /// If the atomic argument is true, then the operating system's
+ /// write-through cache for this file is flushed both before and
+ /// after the write.
+ /// The flush before ensures that any record pointers in this block
+ /// will point to records that actually appear in the file.
+ /// The flush after provides the caller with a guarantee that
+ /// the data will appear in the file even if the system fails
+ /// immediately after this method returns.
+ bool write(const size_t block_number, void* buffer, bool atomic = false);
+
+ /// Read a block from our file.
+ bool read(const size_t block_number, void* buffer);
+
+private:
+ /// Seek to a given block number, used by reads and writes.
+ bool seek(const size_t block_number);
+
+ /// Synchronize the file to disk, used to implement atomic.
+ bool sync();
+
+private:
+ size_t block_size_;
+ ACE_SYNCH_MUTEX lock_;
+};
+
+} /* namespace TAO_Notify */
+
+TAO_END_VERSIONED_NAMESPACE_DECL
+
+#include /**/ "ace/post.h"
+#endif /* RANDOM_FILE_H */
diff --git a/TAO/orbsvcs/orbsvcs/Notify/Reactive_Task.cpp b/TAO/orbsvcs/orbsvcs/Notify/Reactive_Task.cpp
new file mode 100644
index 00000000000..be6bdd90518
--- /dev/null
+++ b/TAO/orbsvcs/orbsvcs/Notify/Reactive_Task.cpp
@@ -0,0 +1,59 @@
+// $Id$
+
+#include "orbsvcs/Notify/Reactive_Task.h"
+
+#if ! defined (__ACE_INLINE__)
+#include "orbsvcs/Notify/Reactive_Task.inl"
+#endif /* __ACE_INLINE__ */
+
+ACE_RCSID(Notify, TAO_Notify_Reactive_Task, "$Id$")
+
+#include "orbsvcs/Notify/Timer_Reactor.h"
+
+TAO_BEGIN_VERSIONED_NAMESPACE_DECL
+
+TAO_Notify_Reactive_Task::TAO_Notify_Reactive_Task (void)
+ :timer_ (0)
+{
+}
+
+TAO_Notify_Reactive_Task::~TAO_Notify_Reactive_Task ()
+{
+}
+
+void
+TAO_Notify_Reactive_Task::init (ACE_ENV_SINGLE_ARG_DECL)
+{
+ ACE_ASSERT (this->timer_.get() == 0);
+
+ TAO_Notify_Timer_Reactor* timer = 0;
+ ACE_NEW_THROW_EX (timer,
+ TAO_Notify_Timer_Reactor (),
+ CORBA::NO_MEMORY ());
+ this->timer_.reset (timer);
+}
+
+void
+TAO_Notify_Reactive_Task::release (void)
+{
+ delete this; //TODO: Release via factory.
+}
+
+void
+TAO_Notify_Reactive_Task::shutdown (void)
+{
+}
+
+void
+TAO_Notify_Reactive_Task::execute (TAO_Notify_Method_Request& method_request ACE_ENV_ARG_DECL)
+{
+ method_request.execute (ACE_ENV_SINGLE_ARG_PARAMETER);
+}
+
+TAO_Notify_Timer*
+TAO_Notify_Reactive_Task::timer (void)
+{
+ return this->timer_.get();
+}
+
+TAO_END_VERSIONED_NAMESPACE_DECL
diff --git a/TAO/orbsvcs/orbsvcs/Notify/Reactive_Task.h b/TAO/orbsvcs/orbsvcs/Notify/Reactive_Task.h
new file mode 100644
index 00000000000..b7a602cd67c
--- /dev/null
+++ b/TAO/orbsvcs/orbsvcs/Notify/Reactive_Task.h
@@ -0,0 +1,77 @@
+// -*- C++ -*-
+
+/**
+ * @file Reactive_Task.h
+ *
+ * $Id$
+ *
+ * @author Pradeep Gore <pradeep@oomworks.com>
+ */
+
+#ifndef TAO_Notify_REACTIVE_TASK_H
+#define TAO_Notify_REACTIVE_TASK_H
+
+#include /**/ "ace/pre.h"
+
+#include "orbsvcs/Notify/notify_serv_export.h"
+
+#if !defined (ACE_LACKS_PRAGMA_ONCE)
+# pragma once
+#endif /* ACE_LACKS_PRAGMA_ONCE */
+
+#include "orbsvcs/Notify/Worker_Task.h"
+#include "orbsvcs/Notify/AdminProperties.h"
+#include "orbsvcs/Notify/Timer_Reactor.h"
+
+TAO_BEGIN_VERSIONED_NAMESPACE_DECL
+
+/**
+ * @class TAO_Notify_Reactive_Task
+ *
+ * @brief A reactive worker task. Simply executes the command in the
+ * caller's context.
+ *
+ */
+class TAO_Notify_Serv_Export TAO_Notify_Reactive_Task
+ : public TAO_Notify_Worker_Task
+{
+public:
+ /// Constuctor
+ TAO_Notify_Reactive_Task (void);
+
+ /// Destructor
+ virtual ~TAO_Notify_Reactive_Task ();
+
+ /// Init the reactive task.
+ void init (ACE_ENV_SINGLE_ARG_DECL);
+
+ /// Shutdown task
+ virtual void shutdown (void);
+
+ /// Exec the request.
+ virtual void execute (TAO_Notify_Method_Request& method_request ACE_ENV_ARG_DECL);
+
+ /// The object used by clients to register timers. This method returns a Reactor based Timer.
+ virtual TAO_Notify_Timer* timer (void);
+
+ /// Returns NULL.
+ virtual TAO_Notify_Buffering_Strategy* buffering_strategy (void);
+
+private:
+ /// The timer.
+ TAO_Notify_Timer_Reactor::Ptr timer_;
+
+ /// Release
+ virtual void release (void);
+};
+
+
+TAO_END_VERSIONED_NAMESPACE_DECL
+
+#if defined (__ACE_INLINE__)
+#include "orbsvcs/Notify/Reactive_Task.inl"
+#endif /* __ACE_INLINE__ */
+
+#include /**/ "ace/post.h"
+
+#endif /* TAO_Notify_REACTIVE_TASK_H */
diff --git a/TAO/orbsvcs/orbsvcs/Notify/Reactive_Task.inl b/TAO/orbsvcs/orbsvcs/Notify/Reactive_Task.inl
new file mode 100644
index 00000000000..d2b6ec811e5
--- /dev/null
+++ b/TAO/orbsvcs/orbsvcs/Notify/Reactive_Task.inl
@@ -0,0 +1,13 @@
+// -*- C++ -*-
+//
+// $Id$
+
+TAO_BEGIN_VERSIONED_NAMESPACE_DECL
+
+ACE_INLINE TAO_Notify_Buffering_Strategy*
+TAO_Notify_Reactive_Task::buffering_strategy (void)
+{
+ return 0;
+}
+
+TAO_END_VERSIONED_NAMESPACE_DECL
diff --git a/TAO/orbsvcs/orbsvcs/Notify/Reconnect_Worker_T.cpp b/TAO/orbsvcs/orbsvcs/Notify/Reconnect_Worker_T.cpp
new file mode 100644
index 00000000000..4c5857f45c8
--- /dev/null
+++ b/TAO/orbsvcs/orbsvcs/Notify/Reconnect_Worker_T.cpp
@@ -0,0 +1,41 @@
+//=============================================================================
+/**
+* @file Reconnect_Worker_T.cpp
+*
+* $Id$
+*
+* @author Jonathan Pollack <pollack_j@ociweb.com>
+*/
+//=============================================================================
+
+#ifndef RECONNECT_WORKER_CPP
+#define RECONNECT_WORKER_CPP
+
+#include "orbsvcs/Notify/Reconnect_Worker_T.h"
+
+#if !defined (ACE_LACKS_PRAGMA_ONCE)
+#pragma once
+#endif /* ACE_LACKS_PRAGMA_ONCE */
+
+TAO_BEGIN_VERSIONED_NAMESPACE_DECL
+
+namespace TAO_Notify
+{
+ template<class TOPOOBJ>
+ Reconnect_Worker<TOPOOBJ>::Reconnect_Worker()
+ {
+ }
+
+ template<class TOPOOBJ>
+ void
+ Reconnect_Worker<TOPOOBJ>::work (TOPOOBJ* o ACE_ENV_ARG_DECL)
+ {
+ ACE_ASSERT(o != 0);
+ o->reconnect (ACE_ENV_SINGLE_ARG_PARAMETER);
+ ACE_CHECK;
+ }
+} // namespace TAO_Notify
+
+TAO_END_VERSIONED_NAMESPACE_DECL
+
+#endif /* RECONNECT_WORKER_CPP */
diff --git a/TAO/orbsvcs/orbsvcs/Notify/Reconnect_Worker_T.h b/TAO/orbsvcs/orbsvcs/Notify/Reconnect_Worker_T.h
new file mode 100644
index 00000000000..a4c71244ec2
--- /dev/null
+++ b/TAO/orbsvcs/orbsvcs/Notify/Reconnect_Worker_T.h
@@ -0,0 +1,54 @@
+// -*- C++ -*-
+
+//=============================================================================
+/**
+* @file Reconnect_Worker_T.h
+*
+* $Id$
+*
+* @author Jonathan Pollack <pollack_j@ociweb.com>
+*/
+//=============================================================================
+
+#ifndef RECONNECT_WORKER_H
+#define RECONNECT_WORKER_H
+#include /**/ "ace/pre.h"
+
+#include "orbsvcs/ESF/ESF_Worker.h"
+
+#if !defined (ACE_LACKS_PRAGMA_ONCE)
+#pragma once
+#endif /* ACE_LACKS_PRAGMA_ONCE */
+
+TAO_BEGIN_VERSIONED_NAMESPACE_DECL
+
+namespace TAO_Notify
+{
+ /**
+ * \brief Iterate through children reconnecting after reloading persistent information.
+ */
+ template<class TOPOOBJ>
+ class Reconnect_Worker : public TAO_ESF_Worker<TOPOOBJ>
+ {
+ public:
+ /// Constructor
+ Reconnect_Worker();
+
+ // override virtual ESF_Worker method
+ virtual void work (TOPOOBJ* o ACE_ENV_ARG_DECL);
+ };
+} // namespace TAO_Notify
+
+TAO_END_VERSIONED_NAMESPACE_DECL
+
+#if defined (ACE_TEMPLATES_REQUIRE_SOURCE)
+#include "orbsvcs/Notify/Reconnect_Worker_T.cpp"
+#endif /* ACE_TEMPLATES_REQUIRE_SOURCE */
+
+#if defined (ACE_TEMPLATES_REQUIRE_PRAGMA)
+#pragma implementation ("Reconnect_Worker_T.cpp")
+#endif /* ACE_TEMPLATES_REQUIRE_PRAGMA */
+
+#include /**/ "ace/post.h"
+
+#endif /* RECONECT_WORKER_H */
diff --git a/TAO/orbsvcs/orbsvcs/Notify/Reconnection_Registry.cpp b/TAO/orbsvcs/orbsvcs/Notify/Reconnection_Registry.cpp
new file mode 100644
index 00000000000..8eba0d841ef
--- /dev/null
+++ b/TAO/orbsvcs/orbsvcs/Notify/Reconnection_Registry.cpp
@@ -0,0 +1,257 @@
+// -*- C++ -*-
+
+/**
+ * @file Reconnection_Registry.cpp
+ *
+ * $Id$
+ *
+ * @author Dale Wilson <wilson_d@ociweb.com>
+ */
+#include "orbsvcs/Notify/Reconnection_Registry.h"
+
+#include "tao/debug.h"
+#include "orbsvcs/Notify/Properties.h"
+#include "orbsvcs/Notify/Topology_Saver.h"
+#include "ace/Vector_T.h"
+//#define DEBUG_LEVEL 10
+#ifndef DEBUG_LEVEL
+# define DEBUG_LEVEL TAO_debug_level
+#endif
+
+
+TAO_BEGIN_VERSIONED_NAMESPACE_DECL
+
+namespace TAO_Notify
+{
+ const char REGISTRY_TYPE[] = "reconnect_registry";
+ const char RECONNECT_ID[] = "ReconnectId";
+ const char RECONNECT_IOR[] = "IOR";
+ const char REGISTRY_CALLBACK_TYPE[] = "reconnect_callback";
+
+ Reconnection_Registry::Reconnection_Registry (Topology_Parent & parent)
+ : highest_id_(0)
+ {
+ // not the best technique, here. Take advantage of "protected"
+ Topology_Object::topology_parent_ = &parent;
+ }
+
+ Reconnection_Registry::~Reconnection_Registry ()
+ {
+ }
+
+ //////////////////////////
+ // During normal operation
+
+ NotifyExt::ReconnectionRegistry::ReconnectionID
+ Reconnection_Registry::register_callback (
+ NotifyExt::ReconnectionCallback_ptr callback
+ ACE_ENV_ARG_DECL)
+ {
+ //@@todo DO WE NEED THREAD SAFENESS?
+ NotifyExt::ReconnectionRegistry::ReconnectionID next_id = ++highest_id_;
+
+ if (DEBUG_LEVEL > 0)
+ {
+ ACE_DEBUG ((LM_DEBUG,
+ ACE_TEXT ("(%P|%t) Reconnect registry: registering %d\n"),
+ static_cast<int> (next_id)
+ ));
+ }
+ TAO_Notify_Properties* properties = TAO_Notify_PROPERTIES::instance();
+ CORBA::ORB_var orb = properties->orb ();
+
+ CORBA::String_var cior = orb->object_to_string (callback ACE_ENV_ARG_PARAMETER);
+ ACE_CHECK_RETURN (0);
+ ACE_CString ior(cior.in ());
+ if ( 0 != reconnection_registry_.bind (next_id, ior))
+ {
+ //todo throw something;
+ }
+ this->self_change (ACE_ENV_SINGLE_ARG_PARAMETER);
+ ACE_CHECK_RETURN (0);
+
+ return next_id;
+ }
+
+ void
+ Reconnection_Registry::unregister_callback (NotifyExt::ReconnectionRegistry::ReconnectionID id
+ ACE_ENV_ARG_DECL)
+ {
+ if (DEBUG_LEVEL > 0)
+ {
+ ACE_DEBUG ((LM_DEBUG,
+ ACE_TEXT ("(%P|%t) Reconnect registry: unregistering %d\n"),
+ static_cast<int> (id)
+ ));
+ }
+ if ( 0 != reconnection_registry_.unbind (id))
+ {
+ //@@todo throw something
+ }
+ this->self_change (ACE_ENV_SINGLE_ARG_PARAMETER);
+ ACE_CHECK;
+ }
+
+ CORBA::Boolean
+ Reconnection_Registry::is_alive (ACE_ENV_SINGLE_ARG_DECL_NOT_USED)
+ {
+ return CORBA::Boolean(1);
+ }
+
+ //////////////////////
+ // During topology save
+
+ void
+ Reconnection_Registry::save_persistent (Topology_Saver& saver ACE_ENV_ARG_DECL)
+ {
+ bool change = this->self_changed_;
+ this->self_changed_ = false;
+ this->children_changed_ = false;
+
+ NVPList attrs;
+ //@@todo: bool want_all_children =
+ saver.begin_object (0, REGISTRY_TYPE, attrs, change ACE_ENV_ARG_PARAMETER);
+ ACE_CHECK;
+
+ Reconnection_Registry_Type::ENTRY *entry;
+ for (Reconnection_Registry_Type::ITERATOR iter (this->reconnection_registry_);
+ iter.next (entry);
+ iter.advance ())
+ {
+ NVPList cattrs;
+ if (DEBUG_LEVEL > 0)
+ {
+ ACE_DEBUG ((LM_DEBUG,
+ ACE_TEXT ("(%P|%t) Reconnect registry: saving %d\n"),
+ static_cast<int> (entry->ext_id_)
+ ));
+ }
+ cattrs.push_back(NVP(RECONNECT_ID, entry->ext_id_));
+ cattrs.push_back(NVP(RECONNECT_IOR, entry->int_id_));
+ saver.begin_object (entry->ext_id_, REGISTRY_CALLBACK_TYPE, cattrs, true ACE_ENV_ARG_PARAMETER);
+ ACE_CHECK;
+ saver.end_object (entry->ext_id_, REGISTRY_CALLBACK_TYPE ACE_ENV_ARG_PARAMETER);
+ ACE_CHECK;
+ }
+// todo:
+// for all deleted children
+// {
+// saver.delete_child(child_type, child_id);
+// }
+ saver.end_object (0, REGISTRY_TYPE ACE_ENV_ARG_PARAMETER);
+ }
+
+ ///////////////////////////////////////
+ // During reload of persistent topology
+
+ Topology_Object*
+ Reconnection_Registry::load_child (const ACE_CString & type,
+ CORBA::Long,
+ const NVPList& attrs
+ ACE_ENV_ARG_DECL_NOT_USED)
+ {
+ if (type == REGISTRY_CALLBACK_TYPE)
+ {
+ NotifyExt::ReconnectionRegistry::ReconnectionID id;
+ ACE_CString ior;
+ if (attrs.load (RECONNECT_ID, id) && attrs.load (RECONNECT_IOR, ior))
+ {
+ if (id > highest_id_)
+ {
+ highest_id_ = id;
+
+ if (DEBUG_LEVEL > 0)
+ {
+ ACE_DEBUG ((LM_DEBUG,
+ ACE_TEXT ("(%P|%t) Reconnect registry: reloading %d\n"),
+ static_cast<int> (id)
+ ));
+ }
+ }
+ if ( 0 != reconnection_registry_.bind (id, ior))
+ {
+ //@@todo - throw something;
+ }
+ }
+ else
+ {
+ ACE_ERROR ((LM_ERROR,
+ ACE_TEXT ("(%P|%t) Reconnect registry: missing attribute\n")
+ ));
+ }
+ }
+ return this;
+ }
+
+ void
+ Reconnection_Registry::send_reconnect (CosNotifyChannelAdmin::EventChannelFactory_ptr dest_factory
+ ACE_ENV_ARG_DECL_NOT_USED)
+ {
+ TAO_Notify_Properties* properties = TAO_Notify_PROPERTIES::instance();
+ CORBA::ORB_var orb = properties->orb ();
+ ACE_Vector <NotifyExt::ReconnectionRegistry::ReconnectionID> bad_ids;
+
+ Reconnection_Registry_Type::ENTRY *entry;
+ for (Reconnection_Registry_Type::ITERATOR iter (this->reconnection_registry_);
+ iter.next (entry);
+ iter.advance ())
+ {
+ ACE_DECLARE_NEW_ENV;
+ ACE_TRY
+ {
+ if (DEBUG_LEVEL > 0)
+ {
+ ACE_DEBUG ((LM_DEBUG,
+ ACE_TEXT ("(%P|%t) Reconnection Registry: Sending reconnection to client %d\n"),
+ static_cast<int> (entry->ext_id_)
+ ));
+ }
+ ACE_CString & ior = entry->int_id_;
+ CORBA::Object_var obj = orb->string_to_object (ior.c_str () ACE_ENV_ARG_PARAMETER);
+ ACE_TRY_CHECK;
+ NotifyExt::ReconnectionCallback_var callback =
+ NotifyExt::ReconnectionCallback::_narrow (obj.in ());
+ if (!CORBA::is_nil (callback.in ()))
+ {
+ callback->reconnect (dest_factory ACE_ENV_ARG_PARAMETER);
+ ACE_TRY_CHECK;
+ }
+ else
+ {
+ ACE_DEBUG ((LM_DEBUG,
+ ACE_TEXT ("(%P|%t) Reconnection Registry: Can't resolve reconnection client's IOR %d\n"),
+ static_cast<int> (entry->ext_id_)
+ ));
+
+ //throw this entry away but you've got an iterator so be careful
+ bad_ids.push_back (entry->ext_id_);
+ }
+ }
+ ACE_CATCHANY
+ {
+ ACE_DEBUG ((LM_DEBUG,
+ ACE_TEXT ("(%P|%t) Reconnection Registry: Exception sending reconnection to client -- discarding registry entry\n")
+ ));
+ //throw this entry away but you've got an iterator so be careful
+ bad_ids.push_back (entry->ext_id_);
+ //@@todo : we might want to check for retryable exceptions, but for now...
+ }
+ ACE_ENDTRY;
+ }
+ size_t bad_count = bad_ids.size ();
+ for (size_t nbad = 0; nbad < bad_count; ++nbad)
+ {
+ this->reconnection_registry_.unbind (bad_ids[nbad]);
+ }
+ }
+
+ void
+ Reconnection_Registry::release (void)
+ {
+ delete this;
+ //@@ inform factory
+ }
+
+} // namespace TAO_Notify
+
+TAO_END_VERSIONED_NAMESPACE_DECL
diff --git a/TAO/orbsvcs/orbsvcs/Notify/Reconnection_Registry.h b/TAO/orbsvcs/orbsvcs/Notify/Reconnection_Registry.h
new file mode 100644
index 00000000000..0c84190d5a9
--- /dev/null
+++ b/TAO/orbsvcs/orbsvcs/Notify/Reconnection_Registry.h
@@ -0,0 +1,100 @@
+// -*- C++ -*-
+
+/**
+ * @file Reconnection_Registry.h
+ *
+ * $Id$
+ *
+ * @author Dale Wilson <wilson_d@ociweb.com>
+ */
+
+#ifndef TAO_NOTIFY_RECONNECTION_REGISTRY_H
+#define TAO_NOTIFY_RECONNECTION_REGISTRY_H
+#include /**/ <ace/pre.h>
+#include /**/ <ace/config-all.h>
+
+#if !defined (ACE_LACKS_PRAGMA_ONCE)
+# pragma once
+#endif /* ACE_LACKS_PRAGMA_ONCE */
+
+#include "orbsvcs/Notify/Topology_Object.h"
+
+#include "orbsvcs/NotifyExtS.h"
+
+#include "ace/Hash_Map_Manager_T.h"
+#include "ace/Null_Mutex.h"
+
+TAO_BEGIN_VERSIONED_NAMESPACE_DECL
+
+namespace TAO_Notify
+{
+ extern const char REGISTRY_TYPE[];
+ extern const char RECONNECT_ID[];
+ extern const char RECONNECT_IOR[];
+ extern const char REGISTRY_CALLBACK_TYPE[];
+
+ /**
+ * @class Reconnection_Registry
+ *
+ * @brief Implementation of ReconnectionRegistry
+ *
+ */
+ class TAO_Notify_Serv_Export Reconnection_Registry
+ : public Topology_Object
+ {
+ /// The registry consists of a map from ReconnectionID to stringified IOR
+ typedef ACE_Hash_Map_Manager_Ex<NotifyExt::ReconnectionRegistry::ReconnectionID,
+ ACE_CString,
+ ACE_Hash<NotifyExt::ReconnectionRegistry::ReconnectionID>,
+ ACE_Equal_To<NotifyExt::ReconnectionRegistry::ReconnectionID>,
+ ACE_SYNCH_NULL_MUTEX> Reconnection_Registry_Type;
+
+ public:
+
+ /// Constructor
+ Reconnection_Registry (Topology_Parent & parent);
+
+ /// Destructor
+ virtual ~Reconnection_Registry ();
+
+ //////////////////////////
+ // During normal operation
+
+ /// add a new callback to the registry
+ ::NotifyExt::ReconnectionRegistry::ReconnectionID register_callback (
+ ::NotifyExt::ReconnectionCallback_ptr callback
+ ACE_ENV_ARG_DECL);
+
+ ///
+ void unregister_callback (::NotifyExt::ReconnectionRegistry::ReconnectionID id
+ ACE_ENV_ARG_DECL);
+
+ CORBA::Boolean is_alive (ACE_ENV_SINGLE_ARG_DECL);
+
+ //////////////////////
+ // During topology save
+ virtual void save_persistent (Topology_Saver& saver ACE_ENV_ARG_DECL);
+
+ ///////////////////////////////////////
+ // During reload of persistent topology
+
+ virtual Topology_Object* load_child (const ACE_CString & type,
+ CORBA::Long id,
+ const NVPList& attrs
+ ACE_ENV_ARG_DECL);
+
+ void send_reconnect (CosNotifyChannelAdmin::EventChannelFactory_ptr dest_factory
+ ACE_ENV_ARG_DECL);
+
+ private:
+ void release (void);
+
+ Reconnection_Registry_Type reconnection_registry_;
+ ::NotifyExt::ReconnectionRegistry::ReconnectionID highest_id_;
+ };
+} // namespace TAO_Notify
+
+TAO_END_VERSIONED_NAMESPACE_DECL
+
+#include /**/ <ace/post.h>
+#endif /* TAO_NOTIFY_RECONNECTION_REGISTRY_H */
diff --git a/TAO/orbsvcs/orbsvcs/Notify/Refcountable.cpp b/TAO/orbsvcs/orbsvcs/Notify/Refcountable.cpp
new file mode 100644
index 00000000000..0d06a3c0e05
--- /dev/null
+++ b/TAO/orbsvcs/orbsvcs/Notify/Refcountable.cpp
@@ -0,0 +1,252 @@
+// $Id$
+
+#include "orbsvcs/Notify/Refcountable.h"
+#include "tao/debug.h"
+#include "ace/Log_Msg.h"
+
+#include "ace/Guard_T.h"
+
+ACE_RCSID(Notify, TAO_Notify_Refcountable, "$Id$")
+
+#if ( TAO_NOTIFY_REFCOUNT_DIAGNOSTICS != 0 )
+
+#include <map>
+#include <string>
+#include <typeinfo.h>
+
+TAO_BEGIN_VERSIONED_NAMESPACE_DECL
+
+/**
+ * @class TAO_Notify_Tracker
+ *
+ * @brief A debugging tool to track the creation of TAO_Notify_Refcountable objects.
+ *
+ * Usage:
+ * Set USE_TAO_NOTIFY_TRACKER defined above to 1
+ * At any significant point to check object usage
+ * TAO_Notify_Tracker::get_instance().dump();
+ */
+class TAO_Notify_Tracker
+{
+public:
+ struct Entry
+ {
+ TAO_Notify_Refcountable* obj;
+ std::string class_name;
+ };
+
+ static TAO_Notify_Tracker& get_instance();
+
+ void add( TAO_Notify_Refcountable* p );
+
+ void remove( const TAO_Notify_Refcountable* p );
+
+ Entry find( const TAO_Notify_Refcountable* p ) const;
+
+ void dump( const char* title = 0 );
+
+private:
+ TAO_Notify_Tracker();
+ ~TAO_Notify_Tracker();
+
+ friend class std::auto_ptr< TAO_Notify_Tracker >;
+ static std::auto_ptr< TAO_Notify_Tracker > s_instance;
+ mutable TAO_SYNCH_MUTEX lock_;
+ typedef std::map<int, Entry> EntityMap;
+ EntityMap map_;
+ int id_counter_;
+ int last_dump_count_;
+};
+
+void
+TAO_Notify_Refcountable::diagnostic_dump( const char* title )
+{
+ TAO_Notify_Tracker::get_instance().dump( title );
+}
+
+#endif /* TAO_NOTIFY_REFCOUNT_DIAGNOSTICS */
+
+
+TAO_Notify_Refcountable::TAO_Notify_Refcountable (void)
+{
+}
+
+TAO_Notify_Refcountable::~TAO_Notify_Refcountable ()
+{
+#if ( TAO_NOTIFY_REFCOUNT_DIAGNOSTICS != 0 )
+ TAO_Notify_Tracker::Entry e = TAO_Notify_Tracker::get_instance().find( this );
+ if ( e.obj != 0 )
+ {
+ ACE_DEBUG ((LM_DEBUG,"object:%x %s(%d) with refcount:%d destroyed incorrectly.\n",
+ e.obj, e.class_name, e.obj->ref_id_, e.obj->refcount_.value() ));
+
+ if ( e.obj != this || e.obj->ref_id_ != this->ref_id_ )
+ {
+ ACE_DEBUG ((LM_DEBUG, " with an ID mismatch %x->%d != %x->%d!\n",
+ this, ref_id_, e.obj, e.obj->ref_id_));
+ }
+ TAO_Notify_Tracker::get_instance().remove( this );
+ }
+#endif
+ CORBA::ULong refcount = this->refcount_.value();
+ ACE_ASSERT( refcount == 0 );
+ ACE_UNUSED_ARG(refcount);
+}
+
+
+CORBA::ULong
+TAO_Notify_Refcountable::_incr_refcnt (void)
+{
+ CORBA::Long refcount = ++this->refcount_;
+ if (TAO_debug_level > 1 )
+ {
+ ACE_DEBUG ((LM_DEBUG,"object:%x incr refcount = %d\n", this, refcount ));
+ }
+#if ( TAO_NOTIFY_REFCOUNT_DIAGNOSTICS != 0 )
+ // Stack-instantiated-non-servants should never have _incr_refcnt called.
+ // We do not care about stack-instances. Stack-instantiated servants break
+ // the tracker.
+ if ( refcount == 1 )
+ {
+ TAO_Notify_Tracker::get_instance().add( this );
+ }
+#endif
+ return refcount;
+}
+
+CORBA::ULong
+TAO_Notify_Refcountable::_decr_refcnt (void)
+{
+ CORBA::Long refcount = --this->refcount_;
+
+ if (TAO_debug_level > 1 )
+ {
+ ACE_DEBUG ((LM_DEBUG,"object:%x decr refcount = %d\n", this, refcount ));
+ }
+
+ ACE_ASSERT(refcount >= 0);
+
+ if (refcount == 0)
+ {
+ #if ( USE_TAO_NOTIFY_TRACKER != 0 )
+ TAO_Notify_Tracker::get_instance().remove( this );
+ #endif
+ this->release ();
+ }
+ return refcount;
+}
+
+#if ( TAO_NOTIFY_REFCOUNT_DIAGNOSTICS != 0 )
+
+std::auto_ptr< TAO_Notify_Tracker > TAO_Notify_Tracker::s_instance;
+
+TAO_Notify_Tracker::TAO_Notify_Tracker()
+: id_counter_(0)
+, last_dump_count_(0)
+{
+}
+
+
+TAO_Notify_Tracker::~TAO_Notify_Tracker()
+{
+ dump( "destruction" );
+}
+
+
+void
+TAO_Notify_Tracker::dump( const char* title )
+{
+ ACE_Guard<TAO_SYNCH_MUTEX> grd(this->lock_);
+
+ ACE_DEBUG ((LM_DEBUG,"\nTAO_Notify_Tracker: %s\n", (title ? title : "dump")));
+
+ EntityMap::const_iterator iter( map_.begin() );
+ while ( iter != map_.end() )
+ {
+ ACE_DEBUG ((LM_DEBUG,"object:%x %s(%d) with refcount:%d.\n",
+ iter->second.obj, iter->second.class_name, iter->first, iter->second.obj->refcount_.value() ));
+ iter++;
+ }
+
+ EntityMap::size_type current_count = map_.size();
+ int diff = ( current_count - last_dump_count_ );
+ ACE_DEBUG ((LM_DEBUG,"Count: %u\nDifference: %+d\n", current_count, diff ));
+ last_dump_count_ = current_count;
+}
+
+
+TAO_Notify_Tracker&
+TAO_Notify_Tracker::get_instance()
+{
+ if ( s_instance.get() == 0 )
+ {
+ s_instance.reset( new TAO_Notify_Tracker );
+ }
+ return *s_instance;
+}
+
+
+void
+TAO_Notify_Tracker::add( TAO_Notify_Refcountable* p )
+{
+ if ( p == 0 ) return;
+
+ ACE_Guard<TAO_SYNCH_MUTEX> grd(this->lock_);
+ int id = ++id_counter_;
+
+ Entry e = { p, typeid(*p).name() };
+ std::pair< EntityMap::iterator, bool > result =
+ map_.insert( std::make_pair( id, e ) );
+ EntityMap::iterator& it = result.first;
+ if ( result.second == false )
+ {
+ ACE_DEBUG ((LM_DEBUG,"object:%x %s(%d) added twice.\n",
+ it->second.obj, it->second.class_name.c_str(), it->first ));
+ }
+ else
+ {
+ p->ref_id_ = id;
+ }
+}
+
+
+void
+TAO_Notify_Tracker::remove( const TAO_Notify_Refcountable* p )
+{
+ if ( p == 0 ) return;
+
+ ACE_Guard<TAO_SYNCH_MUTEX> grd(this->lock_);
+ int ref_id = p->ref_id_;
+ EntityMap::iterator iter( map_.find( ref_id ) );
+ if ( iter == map_.end() )
+ {
+ const char* class_name = typeid(*iter->second.obj).name();
+ ACE_DEBUG ((LM_DEBUG,"object:%x %s(%d) not found.\n",
+ p, class_name, ref_id ));
+ }
+ else
+ {
+ map_.erase( iter );
+ }
+}
+
+
+TAO_Notify_Tracker::Entry
+TAO_Notify_Tracker::find( const TAO_Notify_Refcountable* p ) const
+{
+ Entry e = { 0, "" };
+ if ( p == 0 ) return e;
+
+ ACE_Guard<TAO_SYNCH_MUTEX> grd(this->lock_);
+ int ref_id = p->ref_id_;
+ EntityMap::const_iterator iter( map_.find( ref_id ) );
+ if ( iter != map_.end() )
+ {
+ return iter->second;
+ }
+ return e;
+}
+
+TAO_END_VERSIONED_NAMESPACE_DECL
+
+#endif /* TAO_NOTIFY_REFCOUNT_DIAGNOSTICS */
diff --git a/TAO/orbsvcs/orbsvcs/Notify/Refcountable.h b/TAO/orbsvcs/orbsvcs/Notify/Refcountable.h
new file mode 100644
index 00000000000..960c7e37a93
--- /dev/null
+++ b/TAO/orbsvcs/orbsvcs/Notify/Refcountable.h
@@ -0,0 +1,99 @@
+// -*- C++ -*-
+
+/**
+ * @file Refcountable.h
+ *
+ * $Id$
+ *
+ * @author Pradeep Gore <pradeep@oomworks.com>
+ */
+
+#ifndef TAO_Notify_REFCOUNTABLE_H
+#define TAO_Notify_REFCOUNTABLE_H
+
+#include /**/ "ace/pre.h"
+
+#include "orbsvcs/Notify/notify_serv_export.h"
+#include "orbsvcs/Notify/Refcountable_Guard_T.h"
+
+#if !defined (ACE_LACKS_PRAGMA_ONCE)
+# pragma once
+#endif /* ACE_LACKS_PRAGMA_ONCE */
+
+#include "tao/orbconf.h"
+#include "tao/Basic_Types.h"
+#include "ace/Synch_Traits.h"
+#include "ace/Thread_Mutex.h"
+#include "ace/Atomic_Op.h"
+
+// Debugging macros
+#ifndef TAO_NOTIFY_REFCOUNT_DIAGNOSTICS
+#define TAO_NOTIFY_REFCOUNT_DIAGNOSTICS 0
+#endif
+
+TAO_BEGIN_VERSIONED_NAMESPACE_DECL
+
+/**
+ * @class TAO_Notify_Refcountable
+ *
+ * @brief Thread-safe refounting, calls the <release> method when refcount falls to 0.
+ *
+ * The refcount is initialized to 0. When an instance of a
+ * derived class becomes owned by a managed pointer
+ * (Refcountable_Guard_T) the reference count becomes non-zero.
+ *
+ * Instances declared on the stack should always have a
+ * refcount of zero.
+ *
+ * A method that creates or simply returns an instance of
+ * Refcountable should not increment the reference count. It is
+ * the responsibility of the client to increment the reference
+ * count (take ownership or guard against deletion). The client
+ * cannot know if the method will or will not incr the refcount
+ * on its behalf.
+ *
+ * Use Refcountable_Guard_T or similar service to guarantee the
+ * exception safe direct pairing of increments and decrements. Avoid
+ * calling _incr_refcnt and _decr_refcnt.
+ */
+
+class TAO_Notify_Serv_Export TAO_Notify_Refcountable
+{
+public:
+ typedef TAO_Notify_Refcountable_Guard_T< TAO_Notify_Refcountable > Ptr;
+
+ /// Constructor
+ TAO_Notify_Refcountable (void);
+
+ /// Destructor
+ /// public for stack allocated instances
+ virtual ~TAO_Notify_Refcountable ();
+
+ /// This method sigantures deliberately match the RefCounting methods required for ESF Proxy
+ /// Public for bridge implementations and various guard classes
+ CORBA::ULong _incr_refcnt (void);
+ CORBA::ULong _decr_refcnt (void);
+
+#if ( TAO_NOTIFY_REFCOUNT_DIAGNOSTICS != 0 )
+ static void diagnostic_dump( const char* title = 0 );
+#endif
+
+private:
+ /// The release method is called when the refcount reaches 0.
+ virtual void release (void) = 0;
+
+ // Use a signed counter so that we can more easily detect
+ // boundary conditions such as too many _decr_refcnt() calls.
+ ACE_Atomic_Op<TAO_SYNCH_MUTEX, CORBA::Long> refcount_;
+
+#if ( TAO_NOTIFY_REFCOUNT_DIAGNOSTICS != 0 )
+ friend class TAO_Notify_Tracker;
+ int ref_id_;
+#endif
+};
+
+TAO_END_VERSIONED_NAMESPACE_DECL
+
+#include /**/ "ace/post.h"
+
+#endif /* TAO_Notify_REFCOUNTABLE_H */
diff --git a/TAO/orbsvcs/orbsvcs/Notify/Refcountable_Guard_T.cpp b/TAO/orbsvcs/orbsvcs/Notify/Refcountable_Guard_T.cpp
new file mode 100644
index 00000000000..9f037fef711
--- /dev/null
+++ b/TAO/orbsvcs/orbsvcs/Notify/Refcountable_Guard_T.cpp
@@ -0,0 +1,14 @@
+// $Id$
+
+#ifndef TAO_Notify_REFCOUNTABLE_GUARD_T_CPP
+#define TAO_Notify_REFCOUNTABLE_GUARD_T_CPP
+
+#include "orbsvcs/Notify/Refcountable_Guard_T.h"
+
+#if ! defined (__ACE_INLINE__)
+#include "orbsvcs/Notify/Refcountable_Guard_T.inl"
+#endif /* __ACE_INLINE__ */
+
+ACE_RCSID (Notify, TAO_Notify_Refcountable_Guard_T, "$Id$")
+
+#endif /* TAO_Notify_REFCOUNTABLE_GUARD_T_CPP */
diff --git a/TAO/orbsvcs/orbsvcs/Notify/Refcountable_Guard_T.h b/TAO/orbsvcs/orbsvcs/Notify/Refcountable_Guard_T.h
new file mode 100644
index 00000000000..67e8bd8bdbc
--- /dev/null
+++ b/TAO/orbsvcs/orbsvcs/Notify/Refcountable_Guard_T.h
@@ -0,0 +1,89 @@
+// -*- C++ -*-
+
+/**
+ * @file Refcountable_Guard_T.h
+ *
+ * $Id$
+ *
+ * @author Pradeep Gore <pradeep@oomworks.com>
+ */
+
+#ifndef TAO_Notify_REFCOUNTABLE_GUARD_T_H
+#define TAO_Notify_REFCOUNTABLE_GUARD_T_H
+
+#include /**/ "ace/pre.h"
+
+#include "orbsvcs/Notify/notify_serv_export.h"
+
+#if !defined (ACE_LACKS_PRAGMA_ONCE)
+# pragma once
+#endif /* ACE_LACKS_PRAGMA_ONCE */
+
+#include "tao/Versioned_Namespace.h"
+
+TAO_BEGIN_VERSIONED_NAMESPACE_DECL
+
+/**
+ * @class TAO_Notify_Refcountable_Guard_T
+ *
+ * @brief Increments the reference count in the constructor, the count is decremented in the destructor.
+ * See Refcountable.h for further notes on usage.
+ *
+ */
+template <class T>
+class TAO_Notify_Refcountable_Guard_T
+{
+public:
+ /// Constuctor
+ explicit TAO_Notify_Refcountable_Guard_T (T* t = 0);
+
+ /// Copy constructor
+ TAO_Notify_Refcountable_Guard_T (const TAO_Notify_Refcountable_Guard_T<T>& rhs);
+
+ /// Destructor
+ ~TAO_Notify_Refcountable_Guard_T ();
+
+ /// Redirection operator
+ T* get (void) const;
+
+ /// Boolean test
+ bool isSet (void) const;
+
+ /// Redirection operator
+ T* operator -> (void) const;
+
+ /// Dereference operator
+ T& operator * () const;
+
+ /// Reassignment
+ void reset (T* t = 0);
+
+ // There is no logical release. Release could return an invalid object.
+
+ /// Assignment
+ TAO_Notify_Refcountable_Guard_T<T>& operator = (
+ const TAO_Notify_Refcountable_Guard_T<T>& rhs);
+
+private:
+ void swap( TAO_Notify_Refcountable_Guard_T<T>& rhs );
+
+ T* t_;
+};
+
+TAO_END_VERSIONED_NAMESPACE_DECL
+
+#if defined (__ACE_INLINE__)
+#include "orbsvcs/Notify/Refcountable_Guard_T.inl"
+#endif /* __ACE_INLINE__ */
+
+#if defined (ACE_TEMPLATES_REQUIRE_SOURCE)
+#include "orbsvcs/Notify/Refcountable_Guard_T.cpp"
+#endif /* ACE_TEMPLATES_REQUIRE_SOURCE */
+
+#if defined (ACE_TEMPLATES_REQUIRE_PRAGMA)
+#pragma implementation ("Refcountable_Guard_T.cpp")
+#endif /* ACE_TEMPLATES_REQUIRE_PRAGMA */
+
+#include /**/ "ace/post.h"
+
+#endif /* TAO_Notify_REFCOUNTABLE_GUARD_T_H */
diff --git a/TAO/orbsvcs/orbsvcs/Notify/Refcountable_Guard_T.inl b/TAO/orbsvcs/orbsvcs/Notify/Refcountable_Guard_T.inl
new file mode 100644
index 00000000000..4ab55e0b75f
--- /dev/null
+++ b/TAO/orbsvcs/orbsvcs/Notify/Refcountable_Guard_T.inl
@@ -0,0 +1,91 @@
+// -*- C++ -*-
+//
+// $Id$
+
+#include "ace/Log_Msg.h"
+
+TAO_BEGIN_VERSIONED_NAMESPACE_DECL
+
+template <class T> ACE_INLINE
+TAO_Notify_Refcountable_Guard_T<T>::TAO_Notify_Refcountable_Guard_T (T *t)
+ : t_ (t)
+{
+ if ( this->t_ != static_cast< T* >( 0 ) ) this->t_->_incr_refcnt();
+}
+
+template <class T> ACE_INLINE
+TAO_Notify_Refcountable_Guard_T<T>::TAO_Notify_Refcountable_Guard_T (const TAO_Notify_Refcountable_Guard_T<T> &rhs)
+ : t_ (rhs.t_)
+{
+ if ( this->t_ != static_cast< T* >( 0 ) ) this->t_->_incr_refcnt();
+}
+
+template <class T> ACE_INLINE
+TAO_Notify_Refcountable_Guard_T<T>::~TAO_Notify_Refcountable_Guard_T ()
+{
+ if ( this->t_ != static_cast< T* >( 0 ) ) this->t_->_decr_refcnt();
+}
+
+template <class T> ACE_INLINE
+T*
+TAO_Notify_Refcountable_Guard_T<T>::get (void) const
+{
+ return this->t_;
+}
+
+template <class T> ACE_INLINE
+bool
+TAO_Notify_Refcountable_Guard_T<T>::isSet (void) const
+{
+ return ( this->t_ != static_cast< T* >( 0 ) );
+}
+
+
+template <class T> ACE_INLINE
+T*
+TAO_Notify_Refcountable_Guard_T<T>::operator-> (void) const
+{
+ ACE_ASSERT ( this->t_ != static_cast< T* >( 0 ) );
+ return this->t_;
+}
+
+template <class T> ACE_INLINE
+T&
+TAO_Notify_Refcountable_Guard_T<T>::operator* (void) const
+{
+ ACE_ASSERT ( this->t_ != static_cast< T* >( 0 ) );
+ return *this->t_;
+}
+
+template <class T> ACE_INLINE
+TAO_Notify_Refcountable_Guard_T<T> &
+TAO_Notify_Refcountable_Guard_T<T>::operator = (
+ const TAO_Notify_Refcountable_Guard_T<T> & rhs)
+{
+ reset( rhs.t_ );
+ return *this;
+}
+
+
+template <class T> ACE_INLINE
+void
+TAO_Notify_Refcountable_Guard_T<T>::reset (T* t)
+{
+ if (this->t_ != t)
+ {
+ TAO_Notify_Refcountable_Guard_T<T> temp( t );
+ swap( temp );
+ }
+}
+
+template <class T> ACE_INLINE
+void
+TAO_Notify_Refcountable_Guard_T<T>::swap(
+ TAO_Notify_Refcountable_Guard_T<T>& rhs )
+{
+ T* temp = this->t_;
+ this->t_ = rhs.t_;
+ rhs.t_ = temp;
+}
+
+TAO_END_VERSIONED_NAMESPACE_DECL
diff --git a/TAO/orbsvcs/orbsvcs/Notify/Routing_Slip.cpp b/TAO/orbsvcs/orbsvcs/Notify/Routing_Slip.cpp
new file mode 100644
index 00000000000..eb101ef2105
--- /dev/null
+++ b/TAO/orbsvcs/orbsvcs/Notify/Routing_Slip.cpp
@@ -0,0 +1,933 @@
+// $Id$
+
+#include "orbsvcs/Notify/Routing_Slip.h"
+
+#include "orbsvcs/Notify/Delivery_Request.h"
+#include "orbsvcs/Notify/Worker_Task.h"
+#include "orbsvcs/Notify/ProxyConsumer.h"
+#include "orbsvcs/Notify/ProxySupplier.h"
+#include "orbsvcs/Notify/Event_Persistence_Strategy.h"
+#include "orbsvcs/Notify/Routing_Slip_Persistence_Manager.h"
+#include "orbsvcs/Notify/Routing_Slip_Queue.h"
+#include "orbsvcs/Notify/Method_Request_Lookup.h"
+#include "orbsvcs/Notify/Method_Request_Dispatch.h"
+
+#include "tao/debug.h"
+#include "tao/corba.h"
+
+#include "ace/Dynamic_Service.h"
+
+//#define DEBUG_LEVEL 9
+#ifndef DEBUG_LEVEL
+# define DEBUG_LEVEL TAO_debug_level
+#endif //DEBUG_LEVEL
+
+#define QUEUE_ALLOWED 1
+
+TAO_BEGIN_VERSIONED_NAMESPACE_DECL
+
+namespace TAO_Notify
+{
+///////////////////////
+// Routing_Slip Statics
+
+Routing_Slip_Queue Routing_Slip::persistent_queue_(QUEUE_ALLOWED);
+
+TAO_SYNCH_MUTEX Routing_Slip::sequence_lock_;
+int Routing_Slip::routing_slip_sequence_= 0;
+size_t Routing_Slip::count_enter_transient_ = 0;
+size_t Routing_Slip::count_continue_transient_ = 0;
+size_t Routing_Slip::count_enter_reloaded_ = 0;
+size_t Routing_Slip::count_enter_new_ = 0;
+size_t Routing_Slip::count_continue_new_ = 0;
+size_t Routing_Slip::count_enter_complete_while_new_ = 0;
+size_t Routing_Slip::count_enter_saving_ = 0;
+size_t Routing_Slip::count_enter_saved_ = 0;
+size_t Routing_Slip::count_enter_updating_ = 0;
+size_t Routing_Slip::count_enter_changed_while_saving_ = 0;
+size_t Routing_Slip::count_continue_changed_while_saving_ = 0;
+size_t Routing_Slip::count_enter_changed_ = 0;
+size_t Routing_Slip::count_continue_changed_ = 0;
+size_t Routing_Slip::count_enter_complete_ = 0;
+size_t Routing_Slip::count_enter_deleting_ = 0;
+size_t Routing_Slip::count_enter_terminal_ = 0;
+
+Routing_Slip_Ptr
+Routing_Slip::create (const TAO_Notify_Event::Ptr& event ACE_ENV_ARG_DECL)
+{
+ Routing_Slip * prs;
+ ACE_NEW_THROW_EX (prs, Routing_Slip (event), CORBA::NO_MEMORY ());
+ ACE_CHECK_RETURN (Routing_Slip_Ptr());
+ Routing_Slip_Ptr result(prs);
+ result->this_ptr_ = result; // let the pointers touch so they use the same ref count
+
+ // note we don't care about ultra-precise stats, so no guard for these
+ if (DEBUG_LEVEL > 8 && ((result->sequence_ % 100) == 0))
+ {
+ ACE_ERROR ((LM_ERROR,
+ ACE_TEXT ("(%P|%t) Routing_Slip_Statistics\n")
+ ACE_TEXT (" enter_transient \t%d\n")
+ ACE_TEXT (" continue_transient \t%d\n")
+ ACE_TEXT (" enter_reloaded \t%d\n")
+ ACE_TEXT (" enter_new \t%d\n")
+ ACE_TEXT (" continue_new \t%d\n")
+ ACE_TEXT (" enter_complete_while_new \t%d\n")
+ ACE_TEXT (" enter_saving \t%d\n")
+ ACE_TEXT (" enter_saved \t%d\n")
+ ACE_TEXT (" enter_updating \t%d\n")
+ ACE_TEXT (" enter_changed_while_saving \t%d\n")
+ ACE_TEXT (" continue_changed_while_saving\t%d\n")
+ ACE_TEXT (" enter_changed \t%d\n")
+ ACE_TEXT (" continue_changed \t%d\n")
+ ACE_TEXT (" enter_complete \t%d\n")
+ ACE_TEXT (" enter_deleting \t%d\n")
+ ACE_TEXT (" enter_terminal \t%d\n")
+ , static_cast<int> (count_enter_transient_)
+ , static_cast<int> (count_continue_transient_)
+ , static_cast<int> (count_enter_reloaded_)
+ , static_cast<int> (count_enter_new_)
+ , static_cast<int> (count_continue_new_)
+ , static_cast<int> (count_enter_complete_while_new_)
+ , static_cast<int> (count_enter_saving_)
+ , static_cast<int> (count_enter_saved_)
+ , static_cast<int> (count_enter_updating_)
+ , static_cast<int> (count_enter_changed_while_saving_)
+ , static_cast<int> (count_continue_changed_while_saving_)
+ , static_cast<int> (count_enter_changed_)
+ , static_cast<int> (count_continue_changed_)
+ , static_cast<int> (count_enter_complete_)
+ , static_cast<int> (count_enter_deleting_)
+ , static_cast<int> (count_enter_terminal_)
+ ));
+ }
+ return result;
+}
+
+// static
+Routing_Slip_Ptr
+Routing_Slip::create (
+ TAO_Notify_EventChannelFactory & ecf,
+ Routing_Slip_Persistence_Manager * rspm)
+{
+ Routing_Slip_Ptr result;
+ ACE_Message_Block * event_mb = 0;
+ ACE_Message_Block * rs_mb = 0;
+ ACE_DECLARE_NEW_ENV;
+ ACE_TRY
+ {
+ if (rspm->reload (event_mb, rs_mb))
+ {
+ TAO_InputCDR cdr_event (event_mb);
+ TAO_Notify_Event::Ptr event (TAO_Notify_Event::unmarshal (cdr_event));
+ if (event.isSet())
+ {
+ result = create (event ACE_ENV_ARG_PARAMETER);
+ ACE_TRY_CHECK;
+ TAO_InputCDR cdr_rs (rs_mb);
+ if ( result->unmarshal (ecf, cdr_rs))
+ {
+ result->set_rspm (rspm);
+ }
+ else
+ {
+ ACE_ERROR ((LM_ERROR,
+ ACE_TEXT ("(%P|%t) Routing_Slip::create: Unmarshalling failed for routing slip.\n")
+ ));
+ result.reset ();
+ }
+ }
+ else
+ {
+ ACE_ERROR ((LM_ERROR,
+ ACE_TEXT ("(%P|%t) Routing_Slip::create: Unmarshalling failed for event.\n")
+ ));
+ }
+ }
+ }
+ ACE_CATCHANY
+ {
+ ACE_ERROR ((LM_ERROR,
+ ACE_TEXT ("(%P|%t) Routing_Slip::create: Exception reloading event.\n")
+ ));
+ }
+ ACE_ENDTRY;
+ delete event_mb;
+ delete rs_mb;
+
+ return result;
+}
+
+void
+Routing_Slip::set_rspm (Routing_Slip_Persistence_Manager * rspm)
+{
+ this->rspm_ = rspm;
+ if (rspm_ != 0)
+ {
+ rspm->set_callback (this);
+ }
+}
+
+Routing_Slip::Routing_Slip(
+ const TAO_Notify_Event::Ptr& event)
+ : is_safe_ (false)
+ , until_safe_ (internals_)
+ , this_ptr_ (0)
+ , event_(event)
+ , state_ (rssCREATING)
+ , complete_requests_ (0)
+ , rspm_ (0)
+{
+ Routing_Slip_Guard guard (sequence_lock_);
+ this->sequence_ = ++routing_slip_sequence_;
+ if (DEBUG_LEVEL > 1) ACE_DEBUG ((LM_DEBUG,
+ ACE_TEXT ("(%P|%t) Routing Slip #%d: constructor\n"),
+ this->sequence_
+ ));
+}
+
+Routing_Slip::~Routing_Slip ()
+{
+ if (DEBUG_LEVEL > 8) ACE_DEBUG ((LM_DEBUG,
+ ACE_TEXT ("(%P|%t) Routing Slip #%d: destructor\n"),
+ this->sequence_
+ ));
+}
+
+bool
+Routing_Slip::create_persistence_manager()
+{
+ if (this->rspm_ == 0)
+ {
+ Event_Persistence_Strategy * strategy =
+ ACE_Dynamic_Service <TAO_Notify::Event_Persistence_Strategy>::instance ("Event_Persistence");
+ if (strategy != 0)
+ {
+ Event_Persistence_Factory * factory = strategy->get_factory ();
+ if (factory != 0)
+ {
+ set_rspm (factory->create_routing_slip_persistence_manager(this));
+ }
+ }
+ }
+ return this->rspm_ != 0;
+}
+
+const TAO_Notify_Event::Ptr &
+Routing_Slip::event () const
+{
+ return this->event_;
+}
+
+void
+Routing_Slip::wait_persist ()
+{
+ Routing_Slip_Guard guard (this->internals_);
+ while (!this->is_safe_)
+ {
+ this->until_safe_.wait ();
+ }
+}
+
+void
+Routing_Slip::route (TAO_Notify_ProxyConsumer* pc, bool reliable_channel ACE_ENV_ARG_DECL)
+{
+ ACE_ASSERT(pc != 0);
+
+ TAO_Notify_ProxyConsumer::Ptr pcgrd(pc);
+
+ Routing_Slip_Guard guard (this->internals_);
+
+ size_t request_id = delivery_requests_.size ();
+
+ if (DEBUG_LEVEL > 8) ACE_DEBUG ((LM_DEBUG,
+ ACE_TEXT ("(%P|%t) Routing Slip #%d: add Delivery_Request #%d: lookup, completed %d of %d\n"),
+ this->sequence_,
+ static_cast<int> (request_id),
+ static_cast<int> (this->complete_requests_),
+ static_cast<int> (this->delivery_requests_.size ())
+ ));
+
+ Delivery_Request_Ptr request (new Delivery_Request (this->this_ptr_, request_id));
+ this->delivery_requests_.push_back (request);
+ TAO_Notify_Method_Request_Lookup_Queueable method (request, pc);
+
+ if (this->state_ == rssCREATING)
+ {
+ if (! reliable_channel)
+ {
+ enter_state_transient (guard);
+ }
+ else if (ACE_Dynamic_Service <TAO_Notify::Event_Persistence_Strategy>::instance ("Event_Persistence") == 0)
+ {
+ enter_state_transient (guard);
+ }
+ else if (! this->event_->reliable().is_valid())
+ {
+ enter_state_new (guard);
+ }
+ else if (this->event_->reliable().value() == CosNotification::Persistent)
+ {
+ enter_state_new (guard);
+ }
+ else
+ {
+ enter_state_transient (guard);
+ }
+ }
+ guard.release ();
+ pc->execute_task (method ACE_ENV_ARG_PARAMETER);
+}
+#if 0 // forward
+void
+Routing_Slip::forward (TAO_Notify_ProxySupplier* ps, bool filter)
+{
+ // must be the first action
+ ACE_ASSERT (this->state_ == rssCREATING);
+
+ TAO_Notify_ProxySupplier::Ptr psgrd(ps);
+ Routing_Slip_Guard guard (this->internals_);
+
+ enter_state_transient (guard);
+ size_t request_id = delivery_requests_.size ();
+
+ if (DEBUG_LEVEL > 8) ACE_DEBUG ((LM_DEBUG,
+ ACE_TEXT ("(%P|%t) Routing Slip #%d: add Delivery_Request #%d: Forward %s; completed %d of %d\n"),
+ this->sequence_,
+ static_cast<int> (request_id),
+ filter ? ACE_TEXT ("Filter") : ACE_TEXT ("No Filter"),
+ static_cast<int> (this->complete_requests_),
+ static_cast<int> (this->delivery_requests_.size ())
+ ));
+
+ Delivery_Request_Ptr request (new Delivery_Request (this->this_ptr_, request_id));
+ if (! ps->has_shutdown() )
+ {
+ this->delivery_requests_.push_back (request);
+// Delivery_Method_Dispatch method (request, ps, filter);
+ TAO_Notify_Method_Request_Dispatch_No_Copy method (request, ps, filter);
+ guard.release ();
+ if (DEBUG_LEVEL > 8)
+ ACE_DEBUG ((LM_DEBUG,
+ "(%P|%t) Routing Slip #%d: dispatching Delivery_Request %d to "
+ "proxy supplier %d\n",
+ this->sequence_,
+ static_cast<int> (request_id),
+ ps->id()));
+ ps->worker_task()->execute (method);
+ }
+ else
+ {
+ if (DEBUG_LEVEL > 5)
+ ACE_DEBUG ((LM_DEBUG,
+ "(%P|%t) Routing Slip #%d: not dispatching Delivery_Request %d to "
+ "proxy supplier %d; already shut down\n",
+ this->sequence_,
+ static_cast<int> (request_id),
+ ps->id()));
+ }
+}
+#endif // forward
+
+void
+Routing_Slip::dispatch (
+ TAO_Notify_ProxySupplier* ps,
+ bool filter
+ ACE_ENV_ARG_DECL)
+{
+ // cannot be the first action
+ ACE_ASSERT (this->state_ != rssCREATING);
+
+ TAO_Notify_ProxySupplier::Ptr psgrd(ps);
+ Routing_Slip_Guard guard (this->internals_);
+
+ size_t request_id = delivery_requests_.size ();
+
+ if (DEBUG_LEVEL > 8) ACE_DEBUG ((LM_DEBUG,
+ ACE_TEXT ("(%P|%t) Routing Slip #%d: add Delivery_Request #%d: Dispatch %s; completed %d of %d\n"),
+ this->sequence_,
+ static_cast<int> (request_id),
+ filter ? ACE_TEXT ("Filter") : ACE_TEXT ("No Filter"),
+ static_cast<int> (this->complete_requests_),
+ static_cast<int> (this->delivery_requests_.size ())
+ ));
+
+ Delivery_Request_Ptr request (new Delivery_Request (this->this_ptr_, request_id));
+ if (! ps->has_shutdown() )
+ {
+ this->delivery_requests_.push_back (request);
+ TAO_Notify_Method_Request_Dispatch_No_Copy method (request, ps, filter);
+ guard.release ();
+ if (DEBUG_LEVEL > 8)
+ ACE_DEBUG ((LM_DEBUG,
+ "(%P|%t) Routing Slip #%d: dispatching Delivery_Request %d to "
+ "proxy supplier %d\n",
+ this->sequence_,
+ static_cast<int> (request_id),
+ ps->id()));
+ ps->execute_task (method ACE_ENV_ARG_PARAMETER);
+ ACE_CHECK;
+ }
+ else
+ {
+ if (DEBUG_LEVEL > 5)
+ ACE_DEBUG ((LM_DEBUG,
+ "(%P|%t) Routing Slip #%d: not dispatching Delivery_Request %d to "
+ "proxy supplier %d; already shut down\n",
+ this->sequence_,
+ static_cast<int> (request_id),
+ ps->id()));
+ }
+}
+
+//////////
+// signals
+
+void
+Routing_Slip::delivery_request_complete (size_t request_id)
+{
+ Routing_Slip_Guard guard (this->internals_);
+ ACE_ASSERT (request_id < this->delivery_requests_.size ());
+ // reset the pointer to allow the delivery_request to be deleted.
+ this->delivery_requests_[request_id].reset ();
+ this->complete_requests_ += 1;
+
+ if (DEBUG_LEVEL > 8) ACE_DEBUG ((LM_DEBUG,
+ ACE_TEXT ("(%P|%t) Routing Slip #%d: delivery_request_complete #%d: completed %d of %d\n"),
+ this->sequence_,
+ static_cast<int> (request_id),
+ static_cast<int> (this->complete_requests_),
+ static_cast<int> (this->delivery_requests_.size ())
+ ));
+ State state = this->state_;
+ switch (state)
+ {
+ case rssTRANSIENT:
+ {
+ continue_state_transient (guard);
+ break;
+ }
+ case rssNEW:
+ {
+ continue_state_new (guard);
+ break;
+ }
+ case rssSAVING:
+ {
+ enter_state_changed_while_saving (guard);
+ break;
+ }
+ case rssUPDATING:
+ {
+ enter_state_changed_while_saving (guard);
+ break;
+ }
+ case rssSAVED:
+ {
+ enter_state_changed (guard);
+ break;
+ }
+ case rssCHANGED_WHILE_SAVING:
+ {
+ continue_state_changed_while_saving (guard);
+ break;
+ }
+ case rssCHANGED:
+ {
+ continue_state_changed (guard);
+ break;
+ }
+ default:
+ {
+ ACE_ERROR ((LM_ERROR,
+ ACE_TEXT ("(%P|%t) Notification Service Routing Slip: Unexpected delivery_request_complete in state %d\n"),
+ static_cast<int> (this->state_)
+ ));
+ break;
+ }
+ }
+}
+
+void
+Routing_Slip::at_front_of_persist_queue ()
+{
+ Routing_Slip_Guard guard (this->internals_);
+ State state = this->state_;
+ switch (state)
+ {
+ case rssNEW:
+ {
+ if (DEBUG_LEVEL > 8) ACE_DEBUG ((LM_DEBUG,
+ ACE_TEXT ("(%P|%t) Routing Slip #%d: NEW Reached front of queue\n"),
+ this->sequence_
+ ));
+ enter_state_saving (guard);
+ break;
+ }
+ case rssCOMPLETE_WHILE_NEW:
+ {
+ if (DEBUG_LEVEL > 8) ACE_DEBUG ((LM_DEBUG,
+ ACE_TEXT ("(%P|%t) Routing Slip #%d: COMPLETE_WHILE_NEW Reached front of queue\n"),
+ this->sequence_
+ ));
+ this->persistent_queue_.complete ();
+ enter_state_terminal (guard);
+ break;
+ }
+ case rssCHANGED:
+ {
+ if (DEBUG_LEVEL > 8) ACE_DEBUG ((LM_DEBUG,
+ ACE_TEXT ("(%P|%t) Routing Slip #%d: CHANGED Reached front of queue\n"),
+ this->sequence_
+ ));
+ enter_state_updating (guard);
+ break;
+ }
+ case rssCOMPLETE:
+ {
+ if (DEBUG_LEVEL > 8) ACE_DEBUG ((LM_DEBUG,
+ ACE_TEXT ("(%P|%t) Routing Slip #%d: COMPLETE Reached front of queue\n"),
+ this->sequence_
+ ));
+ enter_state_deleting (guard);
+ break;
+ }
+ default:
+ {
+ ACE_ERROR ((LM_ERROR,
+ ACE_TEXT ("(%P|%t) Routing Slip %d: Unexpected at_front_of_persist_queue in state %d\n"),
+ this->sequence_,
+ static_cast<int> (this->state_)
+ ));
+ break;
+ }
+ }
+}
+
+void
+Routing_Slip::persist_complete ()
+{
+ // keep this object around til this method returns.
+ Routing_Slip_Ptr me(this->this_ptr_);
+ Routing_Slip_Guard guard (this->internals_);
+ ACE_ASSERT (guard.locked ());
+
+ // allow the ConsumerProxy to return from the CORBA push call.
+ if (! is_safe_)
+ {
+ is_safe_ = true;
+ this->until_safe_.signal ();
+ }
+
+ State state = this->state_;
+ switch (state)
+ {
+ case rssSAVING:
+ {
+ if (DEBUG_LEVEL > 8) ACE_DEBUG ((LM_DEBUG,
+ ACE_TEXT ("(%P|%t) Routing Slip #%d: SAVING persist complete\n"),
+ this->sequence_
+ ));
+ enter_state_saved(guard);
+ break;
+ }
+ case rssCHANGED_WHILE_SAVING:
+ {
+ enter_state_changed (guard);
+ break;
+ }
+ case rssUPDATING:
+ {
+ if (DEBUG_LEVEL > 8) ACE_DEBUG ((LM_DEBUG,
+ ACE_TEXT ("(%P|%t) Routing Slip #%d: UPDATING persist complete\n"),
+ this->sequence_
+ ));
+ enter_state_saved (guard);
+ break;
+ }
+ case rssDELETING:
+ {
+ if (DEBUG_LEVEL > 8) ACE_DEBUG ((LM_DEBUG,
+ ACE_TEXT ("(%P|%t) Routing Slip #%d: DELETING persist complete\n"),
+ this->sequence_
+ ));
+ enter_state_terminal (guard);
+ break;
+ }
+ default:
+ {
+ ACE_ERROR ((LM_ERROR,
+ ACE_TEXT ("(%P|%t) Notification Service Routing Slip: Unexpected transition in state %d\n"),
+ static_cast<int> (this->state_)
+ ));
+ break;
+ }
+ }
+ this->persistent_queue_.complete ();
+}
+
+//////////////////
+// support methods
+
+bool
+Routing_Slip::all_deliveries_complete () const
+{
+ return this->complete_requests_ == this->delivery_requests_.size ();
+}
+
+void
+Routing_Slip::add_to_persist_queue(Routing_Slip_Guard & guard)
+{
+ guard.release ();
+ this->persistent_queue_.add (this->this_ptr_);
+ guard.acquire (); // necessary?
+}
+
+////////////////////
+// State transitions
+
+void
+Routing_Slip::enter_state_new (Routing_Slip_Guard & guard)
+{
+ ++count_enter_new_;
+ if (DEBUG_LEVEL > 8) ACE_DEBUG ((LM_DEBUG,
+ ACE_TEXT ("(%P|%t) Routing Slip #%d: enter state NEW\n"),
+ this->sequence_
+ ));
+ this->state_ = rssNEW;
+ add_to_persist_queue(guard);
+}
+
+void
+Routing_Slip::continue_state_new (Routing_Slip_Guard & guard)
+{
+ ++count_continue_new_;
+ if (all_deliveries_complete ())
+ {
+ this->enter_state_complete_while_new (guard);
+ }
+}
+void
+Routing_Slip::enter_state_complete_while_new (Routing_Slip_Guard & guard)
+{
+ ++count_enter_complete_while_new_;
+ ACE_UNUSED_ARG (guard);
+ if (DEBUG_LEVEL > 8) ACE_DEBUG ((LM_DEBUG,
+ ACE_TEXT ("(%P|%t) Routing Slip #%d: enter state COMPLETE_WHILE_NEW\n"),
+ this->sequence_
+ ));
+ // allow the ConsumerProxy to return from the CORBA push call.
+ if (! is_safe_)
+ {
+ is_safe_ = true;
+ this->until_safe_.signal ();
+ }
+ this->state_ = rssCOMPLETE_WHILE_NEW;
+}
+
+void
+Routing_Slip::enter_state_reloaded (Routing_Slip_Guard & guard)
+{
+ ++count_enter_reloaded_;
+ ACE_UNUSED_ARG (guard);
+ if (DEBUG_LEVEL > 8) ACE_DEBUG ((LM_DEBUG,
+ ACE_TEXT ("(%P|%t) Routing Slip #&d: enter state RELOADED\n"),
+ this->sequence_
+ ));
+ this->state_ = rssRELOADED;
+}
+
+void
+Routing_Slip::enter_state_transient (Routing_Slip_Guard & guard)
+{
+ ++count_enter_transient_;
+ ACE_UNUSED_ARG (guard);
+ if (DEBUG_LEVEL > 8) ACE_DEBUG ((LM_DEBUG,
+ ACE_TEXT ("(%P|%t) Routing Slip #%d: enter state TRANSIENT\n"),
+ this->sequence_
+ ));
+ this->state_ = rssTRANSIENT;
+ if (! is_safe_)
+ {
+ is_safe_ = true;
+ this->until_safe_.signal ();
+ }
+ if (all_deliveries_complete ())
+ {
+ enter_state_terminal (guard);
+ }
+}
+
+void
+Routing_Slip::continue_state_transient (Routing_Slip_Guard & guard)
+{
+ ++count_continue_transient_;
+ if (all_deliveries_complete ())
+ {
+ enter_state_terminal (guard);
+ }
+}
+void
+Routing_Slip::enter_state_saving (Routing_Slip_Guard & guard)
+{
+ ++count_enter_saving_;
+ if (!create_persistence_manager ())
+ {
+ // Note This should actually be a throw (out of memory)
+ // but we cheat and make this a transient event.
+ this->persistent_queue_.complete ();
+ enter_state_transient (guard);
+ }
+ else
+ {
+ if (DEBUG_LEVEL > 8) ACE_DEBUG ((LM_DEBUG,
+ ACE_TEXT ("(%P|%t) Routing Slip #%d: enter state SAVING\n"),
+ this->sequence_
+ ));
+ this->state_ = rssSAVING;
+
+ TAO_OutputCDR event_cdr;
+ this->event_->marshal (event_cdr);
+
+ const ACE_Message_Block *event_mb = event_cdr.begin ();
+ TAO_OutputCDR rs_cdr;
+ marshal (rs_cdr);
+ const ACE_Message_Block *rs_mb = rs_cdr.begin ();
+
+ guard.release ();
+ this->rspm_->store (*event_mb, *rs_mb);
+
+ guard.acquire (); // necessary?
+ }
+}
+
+void
+Routing_Slip::enter_state_saved (Routing_Slip_Guard & guard)
+{
+ ++count_enter_saved_;
+ ACE_UNUSED_ARG (guard);
+ if (DEBUG_LEVEL > 8) ACE_DEBUG ((LM_DEBUG,
+ ACE_TEXT ("(%P|%t) Routing Slip #%d: enter state SAVED\n"),
+ this->sequence_
+ ));
+ this->state_ = rssSAVED;
+}
+
+void
+Routing_Slip::enter_state_updating (Routing_Slip_Guard & guard)
+{
+ ++count_enter_updating_;
+ if (DEBUG_LEVEL > 8) ACE_DEBUG ((LM_DEBUG,
+ ACE_TEXT ("(%P|%t) Routing Slip #%d: enter state UPDATING\n"),
+ this->sequence_
+ ));
+ this->state_ = rssUPDATING;
+
+ TAO_OutputCDR rs_cdr;
+ marshal (rs_cdr);
+ const ACE_Message_Block *rs_mb = rs_cdr.begin ();
+ guard.release ();
+
+ ACE_ASSERT (this->rspm_ != 0);
+ this->rspm_->update (*rs_mb);
+ guard.acquire (); // necessary?
+}
+
+
+void
+Routing_Slip::enter_state_changed_while_saving (Routing_Slip_Guard & guard)
+{
+ ++count_enter_changed_while_saving_;
+ ACE_UNUSED_ARG (guard);
+ if (DEBUG_LEVEL > 8) ACE_DEBUG ((LM_DEBUG,
+ ACE_TEXT ("(%P|%t) Routing Slip #%d: enter state CHANGED_WHILE_SAVING\n"),
+ this->sequence_
+ ));
+ this->state_ = rssCHANGED_WHILE_SAVING;
+}
+
+void
+Routing_Slip::continue_state_changed_while_saving (Routing_Slip_Guard & guard)
+{
+ ACE_UNUSED_ARG (guard);
+ // no action necessary
+}
+
+void
+Routing_Slip::enter_state_changed (Routing_Slip_Guard & guard)
+{
+ ++count_enter_changed_;
+ if (DEBUG_LEVEL > 8) ACE_DEBUG ((LM_DEBUG,
+ ACE_TEXT ("(%P|%t) Routing Slip #%d: enter state CHANGED\n"),
+ this->sequence_
+ ));
+ // complete state change BEFORE initiating request to avoid
+ // race condition if request finishes before state is stable.
+ this->state_ = rssCHANGED;
+ if (all_deliveries_complete ())
+ {
+ enter_state_complete (guard);
+ }
+ add_to_persist_queue (guard);
+}
+
+void
+Routing_Slip::continue_state_changed (Routing_Slip_Guard & guard)
+{
+ ++count_continue_changed_;
+ if (all_deliveries_complete ())
+ {
+ enter_state_complete (guard);
+ }
+}
+
+void
+Routing_Slip::enter_state_complete (Routing_Slip_Guard & guard)
+{
+ ++count_enter_complete_;
+ ACE_UNUSED_ARG (guard);
+ if (DEBUG_LEVEL > 8) ACE_DEBUG ((LM_DEBUG,
+ ACE_TEXT ("(%P|%t) Routing Slip #%d: enter state COMPLETE\n"),
+ this->sequence_
+ ));
+ this->state_ = rssCOMPLETE;
+}
+
+void
+Routing_Slip::enter_state_deleting (Routing_Slip_Guard & guard)
+{
+ ++count_enter_deleting_;
+ if (DEBUG_LEVEL > 8) ACE_DEBUG ((LM_DEBUG,
+ ACE_TEXT ("(%P|%t) Routing Slip #%d: enter state DELETING\n"),
+ this->sequence_
+ ));
+ this->state_ = rssDELETING;
+ guard.release ();
+ this->rspm_->remove ();
+ guard.acquire (); // necessary?
+}
+
+void
+Routing_Slip::enter_state_terminal (Routing_Slip_Guard & guard)
+{
+ ++count_enter_terminal_;
+ ACE_UNUSED_ARG (guard);
+ ACE_ASSERT( this->is_safe_);
+ if (DEBUG_LEVEL > 8) ACE_DEBUG ((LM_DEBUG,
+ ACE_TEXT ("(%P|%t) Routing Slip #%d: enter state TERMINAL\n"),
+ this->sequence_
+ ));
+ this->state_ = rssTERMINAL;
+ this->this_ptr_.reset ();
+}
+
+void
+Routing_Slip::marshal (TAO_OutputCDR & cdr)
+{
+ size_t request_count = this->delivery_requests_.size();
+ cdr.write_ulong (request_count - this->complete_requests_);
+ for (size_t nreq = 0; nreq < request_count; ++nreq)
+ {
+ Delivery_Request * request = this->delivery_requests_[nreq].get ();
+ if (request != 0)
+ {
+ request->marshal (cdr);
+ }
+ }
+}
+
+bool
+Routing_Slip::unmarshal (TAO_Notify_EventChannelFactory &ecf, TAO_InputCDR & cdr)
+{
+ CORBA::ULong count = 0;
+ cdr.read_ulong (count);
+ for (size_t nreq = 0; nreq < count; ++nreq)
+ {
+ ACE_CDR::Octet code = 0;
+ while (cdr.read_octet(code))
+ {
+ ACE_DECLARE_NEW_ENV;
+ ACE_TRY
+ {
+ if (code == TAO_Notify_Method_Request_Dispatch::persistence_code)
+ {
+ Delivery_Request * prequest;
+ ACE_NEW_THROW_EX (
+ prequest,
+ Delivery_Request(this_ptr_, this->delivery_requests_.size ()),
+ CORBA::NO_MEMORY ());
+ ACE_TRY_CHECK;
+ Delivery_Request_Ptr request(prequest);
+ TAO_Notify_Method_Request_Dispatch_Queueable * method =
+ TAO_Notify_Method_Request_Dispatch::unmarshal (
+ request,
+ ecf,
+ cdr
+ ACE_ENV_ARG_PARAMETER);
+ ACE_TRY_CHECK;
+ if (method != 0)
+ {
+ this->delivery_requests_.push_back (request);
+ this->delivery_methods_.push_back (method);
+ }
+ }
+ else if (code == TAO_Notify_Method_Request_Lookup::persistence_code)
+ {
+ Delivery_Request_Ptr request(new Delivery_Request(this_ptr_, this->delivery_requests_.size ()));
+ TAO_Notify_Method_Request_Lookup_Queueable * method =
+ TAO_Notify_Method_Request_Lookup::unmarshal (
+ request,
+ ecf,
+ cdr
+ ACE_ENV_ARG_PARAMETER);
+ ACE_TRY_CHECK
+ if (method != 0)
+ {
+ this->delivery_requests_.push_back (request);
+ this->delivery_methods_.push_back (method);
+ }
+ }
+ }
+ ACE_CATCHANY;
+ {
+ // @@todo should we log this?
+ // just ignore failures
+ }
+ ACE_ENDTRY;
+ }
+ }
+ return this->delivery_requests_.size () > 0;
+}
+
+void
+Routing_Slip::reconnect (ACE_ENV_SINGLE_ARG_DECL)
+{
+ Routing_Slip_Guard guard (this->internals_);
+ enter_state_saved (guard);
+ guard.release ();
+ //@@todo is there a worker_task available to do this?
+ size_t count = this->delivery_methods_.size ();
+ for (size_t nmethod = 0; nmethod < count; ++nmethod)
+ {
+ this->delivery_methods_[nmethod]->execute (ACE_ENV_SINGLE_ARG_PARAMETER);
+ ACE_CHECK;
+ }
+ this->delivery_methods_.clear ();
+}
+
+int
+Routing_Slip::sequence() const
+{
+ return this->sequence_;
+}
+
+bool
+Routing_Slip::should_retry () const
+{
+ // simple minded test: if it's transient, don't retry it
+ // @@todo Eventually this should check timeout, discard policy, etc.
+ return this->state_ != rssTRANSIENT;
+}
+
+} // namespace
+
+TAO_END_VERSIONED_NAMESPACE_DECL
diff --git a/TAO/orbsvcs/orbsvcs/Notify/Routing_Slip.h b/TAO/orbsvcs/orbsvcs/Notify/Routing_Slip.h
new file mode 100644
index 00000000000..5670dfc1d05
--- /dev/null
+++ b/TAO/orbsvcs/orbsvcs/Notify/Routing_Slip.h
@@ -0,0 +1,242 @@
+// -*- C++ -*-
+
+/**
+ * @file Routing_Slip.h
+ *
+ * $Id$
+ *
+ * @author Dale Wilson <wilson_d@ociweb.com>
+ */
+
+#ifndef TAO_NOTIFY_ROUTING_SLIP_H
+#define TAO_NOTIFY_ROUTING_SLIP_H
+#include /**/ "ace/pre.h"
+
+#include "orbsvcs/Notify/notify_serv_export.h"
+#include "orbsvcs/Notify/Event.h"
+#include "orbsvcs/Notify/Delivery_Request.h"
+#include "orbsvcs/Notify/Event_Persistence_Factory.h"
+
+#include "orbsvcs/Notify/Persistent_File_Allocator.h" // for Persistent_Callback
+
+#include <ace/Vector_T.h>
+#include <ace/Malloc_Base.h> // necessary?
+
+#if !defined (ACE_LACKS_PRAGMA_ONCE)
+# pragma once
+#endif /* ACE_LACKS_PRAGMA_ONCE */
+
+TAO_BEGIN_VERSIONED_NAMESPACE_DECL
+
+// Forward declarations of classes/pointers/collections
+// referenced from this header
+class TAO_Notify_EventChannelFactory;
+class TAO_Notify_Method_Request;
+class TAO_Notify_ProxyConsumer;
+class TAO_Notify_ProxySupplier;
+class TAO_Notify_Method_Request_Queueable;
+
+namespace TAO_Notify
+{
+
+class Routing_Slip_Persistence_Manager;
+
+// Forward declarations of TAO_Notify classes/pointers/collections
+// referenced from this header
+
+/// A vector of Delivery Requests. The body of a Routing_Slip.
+typedef ACE_Vector <Delivery_Request_Ptr> Delivery_Request_Vec;
+
+/// A vector of Methods_. Used during recovery.
+typedef ACE_Vector <TAO_Notify_Method_Request_Queueable *> Delivery_Method_Vec;
+
+class Routing_Slip;
+/// A reference-counted smart pointer to a Routing_Slip
+typedef ACE_Strong_Bound_Ptr<Routing_Slip, TAO_SYNCH_MUTEX> Routing_Slip_Ptr;
+
+class Routing_Slip_Persistence_Manager;
+
+class Routing_Slip_Queue;
+
+/**
+ * \brief Class which manages the delivery of events to destination.
+ *
+ * Interacts with persistent storage to provide reliable delivery.
+ */
+class TAO_Notify_Serv_Export Routing_Slip : public Persistent_Callback
+{
+ typedef ACE_Guard< TAO_SYNCH_MUTEX > Routing_Slip_Guard;
+public:
+ /// "Factory" method for normal use.
+ static Routing_Slip_Ptr create (const TAO_Notify_Event::Ptr& event
+ ACE_ENV_ARG_DECL);
+
+ /// "Factory" method for use during reload from persistent storage.
+ static Routing_Slip_Ptr create (
+ TAO_Notify_EventChannelFactory & ecf,
+ Routing_Slip_Persistence_Manager * rspm);
+
+ void set_rspm (Routing_Slip_Persistence_Manager * rspm);
+
+ void reconnect (ACE_ENV_SINGLE_ARG_DECL);
+
+ /// destructor (should be private but that inspires compiler wars)
+ virtual ~Routing_Slip ();
+
+ //////////////////
+ // Action requests
+
+ /// Route this event to destinations
+ /// must be the Action request after
+ /// the routing slip is created.
+ void route (TAO_Notify_ProxyConsumer* pc, bool reliable_channel ACE_ENV_ARG_DECL);
+
+ /// \brief Schedule delivery to a consumer via a proxy supplier
+ /// \param proxy_supplier the proxy supplier that will deliver the event
+ /// \param filter should consumer-based filtering be applied?
+ void dispatch (TAO_Notify_ProxySupplier * proxy_supplier, bool filter ACE_ENV_ARG_DECL);
+
+
+ /////////////////////////////////////////
+ /// \brief Wait until the event/routing_slip has
+ /// been saved at least once.
+ void wait_persist ();
+
+ /////////////////////////////////////
+ // signals from the rest of the world
+
+ /// \brief A delivery request has been satisfied.
+ void delivery_request_complete (size_t request_id);
+
+ /// \brief This Routing_Slip reached the front of the persistence queue
+ void at_front_of_persist_queue ();
+
+ /// \brief The persistent storage has completed the last request.
+ virtual void persist_complete ();
+
+ /////////////////////////////////////////////////////
+ // \brief Access the event associated with this routing slip
+ const TAO_Notify_Event::Ptr & event () const;
+
+ /// \brief Provide an identifying number for this Routing Slip
+ /// to use in debug messages.
+ int sequence() const;
+
+ /// \brief Should delivery of this event be retried if it fails?
+ bool should_retry () const;
+
+private:
+ ////////////////////
+ // state transitions
+ void enter_state_transient (Routing_Slip_Guard & guard);
+ void continue_state_transient (Routing_Slip_Guard & guard);
+ void enter_state_reloaded (Routing_Slip_Guard & guard);
+ void enter_state_new (Routing_Slip_Guard & guard);
+ void continue_state_new (Routing_Slip_Guard & guard);
+ void enter_state_complete_while_new (Routing_Slip_Guard & guard);
+ void enter_state_saving (Routing_Slip_Guard & guard);
+ void enter_state_saved (Routing_Slip_Guard & guard);
+ void enter_state_updating (Routing_Slip_Guard & guard);
+ void enter_state_changed_while_saving (Routing_Slip_Guard & guard);
+ void continue_state_changed_while_saving (Routing_Slip_Guard & guard);
+ void enter_state_changed (Routing_Slip_Guard & guard);
+ void continue_state_changed (Routing_Slip_Guard & guard);
+ void enter_state_complete (Routing_Slip_Guard & guard);
+ void enter_state_deleting (Routing_Slip_Guard & guard);
+ void enter_state_terminal (Routing_Slip_Guard & guard);
+
+private:
+ bool create_persistence_manager();
+
+ /// Private constructor for use by create method
+ Routing_Slip(const TAO_Notify_Event::Ptr& event);
+
+ /// Test to see if all deliveries are complete.
+ bool all_deliveries_complete () const;
+
+ /// This routing_slip needs to be saved.
+ void add_to_persist_queue(Routing_Slip_Guard & guard);
+
+ /// Marshal into a CDR
+ void marshal (TAO_OutputCDR & cdr);
+
+ /// Marshal from CDR
+ bool unmarshal (TAO_Notify_EventChannelFactory &ecf, TAO_InputCDR & rscdr);
+
+private:
+ /// Protection for internal information
+ TAO_SYNCH_MUTEX internals_;
+ /// true when event persistence qos is guaranteed
+ bool is_safe_;
+ /// signalled when is_safe_ goes true
+ ACE_SYNCH_CONDITION until_safe_;
+
+ /// Smart pointer to this object
+ /// Provides continuity between smart pointers and "Routing_Slip::this"
+ /// Also lets the Routing_Slip manage its own minimum lifetime.
+ Routing_Slip_Ptr this_ptr_;
+
+ // The event being delivered.
+ TAO_Notify_Event::Ptr event_;
+
+ /// A mini-state machine to control persistence
+ /// See external doc for circles and arrows.
+ enum State
+ {
+ rssCREATING,
+ rssTRANSIENT,
+ rssRELOADED,
+ rssNEW,
+ rssCOMPLETE_WHILE_NEW,
+ rssSAVING,
+ rssSAVED,
+ rssUPDATING,
+ rssCHANGED_WHILE_SAVING,
+ rssCHANGED,
+ rssCOMPLETE,
+ rssDELETING,
+ rssTERMINAL
+ } state_;
+
+ /// A collection of delivery requests
+ Delivery_Request_Vec delivery_requests_;
+
+ /// Methods that should be restarted during event recovery
+ Delivery_Method_Vec delivery_methods_;
+
+ /// How many delivery requests are complete
+ size_t complete_requests_;
+
+ /// Pointer to a Routing_Slip_Persistence_Manager
+ Routing_Slip_Persistence_Manager * rspm_;
+
+ int sequence_;
+
+ static TAO_SYNCH_MUTEX sequence_lock_;
+ static int routing_slip_sequence_;
+ static size_t count_enter_transient_;
+ static size_t count_continue_transient_;
+ static size_t count_enter_reloaded_;
+ static size_t count_enter_new_;
+ static size_t count_continue_new_;
+ static size_t count_enter_complete_while_new_;
+ static size_t count_enter_saving_;
+ static size_t count_enter_saved_;
+ static size_t count_enter_updating_;
+ static size_t count_enter_changed_while_saving_;
+ static size_t count_continue_changed_while_saving_;
+ static size_t count_enter_changed_;
+ static size_t count_continue_changed_;
+ static size_t count_enter_complete_;
+ static size_t count_enter_deleting_;
+ static size_t count_enter_terminal_;
+
+ static Routing_Slip_Queue persistent_queue_;
+};
+
+} // namespace
+
+TAO_END_VERSIONED_NAMESPACE_DECL
+
+#include /**/ "ace/post.h"
+#endif /* TAO_NOTIFY_ROUTING_SLIP_H */
diff --git a/TAO/orbsvcs/orbsvcs/Notify/Routing_Slip_Persistence_Manager.cpp b/TAO/orbsvcs/orbsvcs/Notify/Routing_Slip_Persistence_Manager.cpp
new file mode 100644
index 00000000000..62915a67221
--- /dev/null
+++ b/TAO/orbsvcs/orbsvcs/Notify/Routing_Slip_Persistence_Manager.cpp
@@ -0,0 +1,804 @@
+// $Id$
+
+#include "orbsvcs/Notify/Routing_Slip_Persistence_Manager.h"
+#include "orbsvcs/Notify/Standard_Event_Persistence.h"
+#include "orbsvcs/Notify/Persistent_File_Allocator.h"
+
+TAO_BEGIN_VERSIONED_NAMESPACE_DECL
+
+namespace TAO_Notify
+{
+
+Routing_Slip_Persistence_Manager::Routing_Slip_Persistence_Manager(
+ Standard_Event_Persistence_Factory* factory)
+ : removed_(false)
+ , serial_number_(0)
+ , allocator_(factory->allocator())
+ , factory_(factory)
+ , first_event_block_(0)
+ , first_routing_slip_block_(0)
+ , callback_(0)
+ , event_mb_ (0)
+ , routing_slip_mb_(0)
+{
+ this->prev_manager_ = this;
+ this->next_manager_ = this;
+}
+
+Routing_Slip_Persistence_Manager::~Routing_Slip_Persistence_Manager()
+{
+ ACE_ASSERT(this->prev_manager_ == this);
+ ACE_ASSERT(this->next_manager_ == this);
+ delete this->first_event_block_;
+ this->first_event_block_ = 0;
+ delete this->first_routing_slip_block_;
+ this->first_routing_slip_block_ = 0;
+ delete this->event_mb_;
+ this->event_mb_ = 0;
+ delete this->routing_slip_mb_;
+ this->routing_slip_mb_ = 0;
+}
+
+void
+Routing_Slip_Persistence_Manager::set_callback(Persistent_Callback* callback)
+{
+ ACE_GUARD(ACE_SYNCH_MUTEX, ace_mon, this->lock_);
+ this->callback_ = callback;
+}
+
+bool
+Routing_Slip_Persistence_Manager::store_root()
+{
+ bool result = false;
+
+ this->factory_->get_preallocated_pointer (
+ this->routing_slip_header_.next_serial_number,
+ this->routing_slip_header_.next_routing_slip_block);
+
+ // we should already have a psb, but JIC
+ ACE_ASSERT(this->first_routing_slip_block_ != 0);
+ ACE_ASSERT(this->first_routing_slip_block_->block_number() ==
+ ROUTING_SLIP_ROOT_BLOCK_NUMBER);
+
+ // Don't take any chances. Use hard-wired root serial number.
+ this->routing_slip_header_.serial_number = ROUTING_SLIP_ROOT_SERIAL_NUMBER;
+
+ // This will eventually break after something like 58000 years.
+ // At such time we should change this to !=.
+ ACE_ASSERT(this->routing_slip_header_.next_serial_number >
+ ROUTING_SLIP_ROOT_SERIAL_NUMBER);
+
+ ACE_Message_Block versioninfo(2);
+ versioninfo.wr_ptr()[0] = 1; // Major version number
+ versioninfo.wr_ptr()[1] = 0; // Minor version number
+ versioninfo.wr_ptr(2);
+ ACE_GUARD_RETURN(ACE_SYNCH_MUTEX, ace_mon, this->lock_, result);
+ result = this->build_chain(this->first_routing_slip_block_,
+ this->routing_slip_header_, this->allocated_routing_slip_blocks_,
+ versioninfo);
+ if (result)
+ {
+ this->routing_slip_header_.put_header(*this->first_routing_slip_block_);
+ this->allocator_->write(this->first_routing_slip_block_);
+ }
+ return result;
+}
+
+bool
+Routing_Slip_Persistence_Manager::reload(
+ ACE_Message_Block*& event,
+ ACE_Message_Block*& routing_slip)
+{
+ bool result = false;
+ if (this->event_mb_ != 0 && this->routing_slip_mb_ != 0)
+ {
+ event = this->event_mb_;
+ this->event_mb_ = 0;
+ routing_slip = this->routing_slip_mb_;
+ this->routing_slip_mb_ = 0;
+ result = true;
+ }
+ else
+ {
+ event = 0;
+ routing_slip = 0;
+ }
+ return result;
+}
+
+bool
+Routing_Slip_Persistence_Manager::load(
+ Block_Number block_number,
+ Block_Serial_Number expected_serial_number)
+{
+ /**
+ * NOTE: There is no need to worry about guarding anything. We assume
+ * that there will be one and only one thread doing the entire
+ * reload process.
+ */
+ bool result = false;
+ size_t block_size = this->allocator_->block_size();
+ this->first_routing_slip_block_ =
+ this->allocator_->allocate_at(block_number);
+ this->first_routing_slip_block_->set_allocator_owns(false);
+ this->first_routing_slip_block_->set_sync();
+
+ this->serial_number_ = expected_serial_number;
+
+ ACE_NEW_NORETURN(this->routing_slip_mb_, ACE_Message_Block(block_size));
+ ACE_NEW_NORETURN(this->event_mb_, ACE_Message_Block(block_size));
+ if (this->event_mb_ != 0 && this->routing_slip_mb_ != 0)
+ {
+ if (this->reload_chain(
+ this->first_routing_slip_block_,
+ this->routing_slip_header_,
+ this->allocated_routing_slip_blocks_,
+ this->routing_slip_mb_,
+ expected_serial_number))
+ {
+ if (this->routing_slip_header_.event_block != 0)
+ {
+ this->first_event_block_ = this->allocator_->allocate_at(
+ this->routing_slip_header_.event_block);
+ result = this->reload_chain(
+ this->first_event_block_,
+ this->event_header_,
+ this->allocated_event_blocks_,
+ this->event_mb_,
+ 0);
+ }
+ else if (block_number == ROUTING_SLIP_ROOT_BLOCK_NUMBER)
+ {
+ // only the root can lack event
+ result = true;
+ }
+ else
+ {
+ ACE_ERROR((LM_ERROR,
+ ACE_TEXT(
+ "(%P|%t) Reloaded Persistent Event is missing event.\n")
+ ));
+ }
+ }
+ }
+ if (! result)
+ {
+ delete this->routing_slip_mb_;
+ this->routing_slip_mb_ = 0;
+ delete this->event_mb_;
+ this->event_mb_ = 0;
+ }
+ return result;
+}
+
+Routing_Slip_Persistence_Manager *
+Routing_Slip_Persistence_Manager::load_next ()
+{
+ Routing_Slip_Persistence_Manager * result;
+ ACE_NEW_RETURN(result, Routing_Slip_Persistence_Manager (this->factory_), 0);
+
+ if (result->load(this->routing_slip_header_.next_routing_slip_block,
+ this->routing_slip_header_.next_serial_number))
+ {
+ result->dllist_push_back();
+ }
+ else
+ {
+ // steal the psb for use as the next psb.
+ // delete the rspm. We'll create another one later.
+ Persistent_Storage_Block * next_psb = result->first_routing_slip_block_;
+ result->first_routing_slip_block_ = 0;
+// next_psb->set_allocator_owns(true);
+ this->factory_->done_reloading (
+ next_psb,
+ result->serial_number_);
+ delete result;
+ result = 0;
+ }
+ return result;
+}
+
+bool
+Routing_Slip_Persistence_Manager::store(const ACE_Message_Block& event,
+ const ACE_Message_Block& routing_slip)
+{
+ bool result = false;
+ ACE_GUARD_RETURN(ACE_SYNCH_MUTEX, ace_mon, this->lock_, result);
+ if (!this->removed_)
+ {
+ result = store_i(event, routing_slip);
+ }
+ return result;
+}
+
+bool
+Routing_Slip_Persistence_Manager::update(const ACE_Message_Block& routing_slip)
+{
+ bool result = false;
+ ACE_GUARD_RETURN(ACE_SYNCH_MUTEX, ace_mon, this->lock_, result);
+ // If we have not gotten the event yet or we have no allocator, fail
+ if (!this->removed_)
+ {
+ if (this->persisted())
+ {
+ result = update_i(routing_slip);
+ }
+ }
+ return result;
+}
+
+bool
+Routing_Slip_Persistence_Manager::remove()
+{
+ bool result = false;
+ ACE_GUARD_RETURN(ACE_SYNCH_MUTEX, ace_mon, this->lock_, result);
+ // Assert that this is in the dllist
+ ACE_ASSERT(this->prev_manager_ != this);
+ ACE_ASSERT(this->persisted());
+ Routing_Slip_Persistence_Manager* prev = this->prev_manager_;
+ // Once our previous manager removes us, we can deallocate in any order
+ this->factory_->lock.acquire();
+ this->remove_from_dllist();
+ result = prev->update_next_manager(this);
+ this->factory_->lock.release();
+ size_t block_number = 0;
+ if (this->first_routing_slip_block_ != 0)
+ {
+ this->allocator_->free(this->first_routing_slip_block_->block_number());
+ delete this->first_routing_slip_block_;
+ this->first_routing_slip_block_ = 0;
+ }
+ if (this->first_event_block_ != 0)
+ {
+ this->allocator_->free(this->first_event_block_->block_number());
+ delete this->first_event_block_;
+ this->first_event_block_ = 0;
+ }
+ while (this->allocated_routing_slip_blocks_.pop(block_number) == 0)
+ {
+ this->allocator_->free(block_number);
+ }
+ while (this->allocated_event_blocks_.pop(block_number) == 0)
+ {
+ this->allocator_->free(block_number);
+ }
+ this->removed_ = true;
+ Persistent_Storage_Block* callbackblock =
+ this->allocator_->allocate_nowrite();
+ callbackblock->set_callback(this->callback_);
+ result &= this->allocator_->write(callbackblock);
+ return result;
+}
+
+Routing_Slip_Persistence_Manager::Block_Header::Block_Header(Header_Type type)
+ : serial_number (0)
+ , next_overflow(0)
+ , header_type (static_cast<Block_Type> (type))
+ , data_size(0)
+{
+}
+Routing_Slip_Persistence_Manager::Block_Header::~Block_Header (void)
+{
+}
+
+size_t
+Routing_Slip_Persistence_Manager::Block_Header::extract_header(
+ Persistent_Storage_Block& psb, size_t offset)
+{
+ size_t pos = offset;
+ unsigned char* data = psb.data();
+
+ serial_number = data[pos++];
+ serial_number = (serial_number << 8) + data[pos++];
+ serial_number = (serial_number << 8) + data[pos++];
+ serial_number = (serial_number << 8) + data[pos++];
+ serial_number = (serial_number << 8) + data[pos++];
+ serial_number = (serial_number << 8) + data[pos++];
+ serial_number = (serial_number << 8) + data[pos++];
+ serial_number = (serial_number << 8) + data[pos++];
+
+ next_overflow = data[pos++];
+ next_overflow = (next_overflow << 8) + data[pos++];
+ next_overflow = (next_overflow << 8) + data[pos++];
+ next_overflow = (next_overflow << 8) + data[pos++];
+
+ header_type = data[pos++];
+ header_type = (data_size << 8) + data[pos++];
+
+ data_size = data[pos++];
+ data_size = (data_size << 8) + data[pos++];
+ return pos;
+}
+
+size_t
+Routing_Slip_Persistence_Manager::Block_Header::put_header(
+ Persistent_Storage_Block& psb, size_t offset)
+{
+ // Assume that our psb can hold our small amount of data...
+ size_t pos = offset;
+ unsigned char* data = psb.data();
+ // Store serial_number
+ data[pos++] = static_cast<unsigned char> ((serial_number >> 56) & 0xff);
+ data[pos++] = static_cast<unsigned char> ((serial_number >> 48) & 0xff);
+ data[pos++] = static_cast<unsigned char> ((serial_number >> 40) & 0xff);
+ data[pos++] = static_cast<unsigned char> ((serial_number >> 32) & 0xff);
+ data[pos++] = static_cast<unsigned char> ((serial_number >> 24) & 0xff);
+ data[pos++] = static_cast<unsigned char> ((serial_number >> 16) & 0xff);
+ data[pos++] = static_cast<unsigned char> ((serial_number >> 8) & 0xff);
+ data[pos++] = static_cast<unsigned char> ((serial_number >> 0) & 0xff);
+ // Store next_overflow
+ data[pos++] = static_cast<unsigned char> (next_overflow >> 24);
+ data[pos++] = static_cast<unsigned char> ((next_overflow >> 16) & 0xff);
+ data[pos++] = static_cast<unsigned char> ((next_overflow >> 8) & 0xff);
+ data[pos++] = static_cast<unsigned char> (next_overflow & 0xff);
+ // Store header_type
+ data[pos++] = static_cast<unsigned char> ((header_type >> 8) & 0xff);
+ data[pos++] = static_cast<unsigned char> (header_type & 0xff);
+ // Store data_size
+ data[pos++] = static_cast<unsigned char> ((data_size >> 8) & 0xff);
+ data[pos++] = static_cast<unsigned char> (data_size & 0xff);
+
+ return pos;
+}
+
+Routing_Slip_Persistence_Manager::Routing_Slip_Header::Routing_Slip_Header()
+ : Block_Header (BT_Event)
+ , next_routing_slip_block(0)
+ , next_serial_number(0)
+ , event_block(0)
+{
+}
+
+size_t
+Routing_Slip_Persistence_Manager::Routing_Slip_Header::extract_header(
+ Persistent_Storage_Block& psb, size_t offset)
+{
+ size_t pos = offset;
+ pos = this->Block_Header::extract_header(psb, pos);
+ unsigned char* data = psb.data();
+ next_routing_slip_block = data[pos++];
+ next_routing_slip_block = (next_routing_slip_block << 8) + data[pos++];
+ next_routing_slip_block = (next_routing_slip_block << 8) + data[pos++];
+ next_routing_slip_block = (next_routing_slip_block << 8) + data[pos++];
+ next_serial_number = data[pos++];
+ next_serial_number = (next_serial_number << 8) + data[pos++];
+ next_serial_number = (next_serial_number << 8) + data[pos++];
+ next_serial_number = (next_serial_number << 8) + data[pos++];
+ next_serial_number = (next_serial_number << 8) + data[pos++];
+ next_serial_number = (next_serial_number << 8) + data[pos++];
+ next_serial_number = (next_serial_number << 8) + data[pos++];
+ next_serial_number = (next_serial_number << 8) + data[pos++];
+ event_block = data[pos++];
+ event_block = (event_block << 8) + data[pos++];
+ event_block = (event_block << 8) + data[pos++];
+ event_block = (event_block << 8) + data[pos++];
+ return pos;
+}
+
+size_t
+Routing_Slip_Persistence_Manager::Routing_Slip_Header::put_header(
+ Persistent_Storage_Block& psb, size_t offset)
+{
+ // Assume that our psb can hold our small amount of data...
+ size_t pos = offset;
+ // Store serial number, next_overflow and data_size
+ pos = this->Block_Header::put_header(psb, pos);
+
+ unsigned char* data = psb.data();
+ // Store next_routing_slip_block
+ data[pos++] = static_cast<unsigned char> (next_routing_slip_block >> 24);
+ data[pos++] = static_cast<unsigned char> ((next_routing_slip_block >> 16) & 0xff);
+ data[pos++] = static_cast<unsigned char> ((next_routing_slip_block >> 8) & 0xff);
+ data[pos++] = static_cast<unsigned char> (next_routing_slip_block & 0xff);
+ // Store serial_number
+ data[pos++] = static_cast<unsigned char> ((next_serial_number >> 56) & 0xff);
+ data[pos++] = static_cast<unsigned char> ((next_serial_number >> 48) & 0xff);
+ data[pos++] = static_cast<unsigned char> ((next_serial_number >> 40) & 0xff);
+ data[pos++] = static_cast<unsigned char> ((next_serial_number >> 32) & 0xff);
+ data[pos++] = static_cast<unsigned char> ((next_serial_number >> 24) & 0xff);
+ data[pos++] = static_cast<unsigned char> ((next_serial_number >> 16) & 0xff);
+ data[pos++] = static_cast<unsigned char> ((next_serial_number >> 8) & 0xff);
+ data[pos++] = static_cast<unsigned char> ((next_serial_number >> 0) & 0xff);
+ // Store event_block
+ data[pos++] = static_cast<unsigned char> (event_block >> 24);
+ data[pos++] = static_cast<unsigned char> ((event_block >> 16) & 0xff);
+ data[pos++] = static_cast<unsigned char> ((event_block >> 8) & 0xff);
+ data[pos++] = static_cast<unsigned char> (event_block & 0xff);
+ return pos;
+}
+
+Routing_Slip_Persistence_Manager::Overflow_Header::Overflow_Header ()
+ : Block_Header (BT_Overflow)
+{
+}
+
+Routing_Slip_Persistence_Manager::Event_Header::Event_Header ()
+ : Block_Header (BT_Routing_Slip)
+{
+}
+
+bool
+Routing_Slip_Persistence_Manager::store_i(const ACE_Message_Block& event,
+ const ACE_Message_Block& routing_slip)
+{
+ bool result = false;
+
+ bool initially_persisted = this->persisted();
+ if (!initially_persisted)
+ {
+ this->factory_->lock.acquire();
+ this->factory_->preallocate_next_record(this->serial_number_,
+ this->first_routing_slip_block_,
+ this->routing_slip_header_.next_serial_number,
+ this->routing_slip_header_.next_routing_slip_block);
+ this->routing_slip_header_.serial_number = this->serial_number_;
+ }
+
+ result = this->build_chain(this->first_routing_slip_block_,
+ this->routing_slip_header_, this->allocated_routing_slip_blocks_,
+ routing_slip);
+
+ if (result)
+ {
+ // No need for a callback here since we do our own below
+ result &= this->store_event(event);
+ // If we have an event block allocated, update our header
+ if (this->first_event_block_ != 0)
+ {
+ this->routing_slip_header_.event_block =
+ this->first_event_block_->block_number();
+ }
+ else
+ {
+ ACE_ERROR((LM_ERROR,
+ ACE_TEXT(
+ "(%P|%t) No Event is being stored with this routing slip.\n")
+ ));
+ }
+ // Always write our first block out.
+ this->dllist_push_back();
+ result &= (this->write_first_routing_slip_block() != 0);
+ // because the first rs blocks everywhere have been given sync, we are
+ // guaranteed that they will be totally written by the time we get to this
+ // empty callback-only block.
+ Persistent_Storage_Block* callbackblock =
+ this->allocator_->allocate_nowrite();
+ callbackblock->set_callback(this->callback_);
+ result &= this->allocator_->write(callbackblock);
+ }
+ if (!initially_persisted)
+ {
+ this->factory_->lock.release();
+ }
+ return result;
+}
+
+bool
+Routing_Slip_Persistence_Manager::update_i(
+ const ACE_Message_Block& routing_slip)
+{
+ bool result = true;
+ size_t routing_slip_size = routing_slip.total_length();
+ if (routing_slip_size != 0)
+ {
+ result = this->build_chain(this->first_routing_slip_block_,
+ this->routing_slip_header_, this->allocated_routing_slip_blocks_,
+ routing_slip);
+
+ result &= this->allocator_->write(this->first_routing_slip_block_);
+ }
+ Persistent_Storage_Block* callbackblock =
+ this->allocator_->allocate_nowrite();
+ callbackblock->set_callback(this->callback_);
+ result &= this->allocator_->write(callbackblock);
+ return result;
+}
+
+bool
+Routing_Slip_Persistence_Manager::store_event(
+ const ACE_Message_Block& event)
+{
+ bool result = true;
+ size_t event_size = event.total_length();
+ if (event_size != 0)
+ {
+ if (this->first_event_block_ == 0)
+ {
+ this->first_event_block_ = this->allocator_->allocate();
+ this->first_event_block_->set_allocator_owns(false);
+ }
+
+ result = this->build_chain(this->first_event_block_,
+ this->event_header_, this->allocated_event_blocks_,
+ event);
+
+ result &= this->allocator_->write(this->first_event_block_);
+ }
+ return result;
+}
+
+size_t
+Routing_Slip_Persistence_Manager::fill_block(Persistent_Storage_Block& psb,
+ size_t offset_into_block, const ACE_Message_Block* data,
+ size_t offset_into_msg)
+{
+ unsigned char* ptr = (unsigned char*)data->rd_ptr();
+ return this->fill_block(psb, offset_into_block, ptr + offset_into_msg,
+ data->length() - offset_into_msg);
+}
+
+size_t
+Routing_Slip_Persistence_Manager::fill_block(Persistent_Storage_Block& psb,
+ size_t offset_into_block, unsigned char* data, size_t data_size)
+{
+ size_t result = 0;
+ if (data_size > 0)
+ {
+ const size_t max_size = this->allocator_->block_size() - offset_into_block;
+ size_t size_to_copy = data_size;
+ if (size_to_copy > max_size)
+ {
+ size_to_copy = max_size;
+ result = data_size - size_to_copy;
+ }
+ else
+ {
+ result = 0;
+ }
+ ACE_OS::memcpy(psb.data() + offset_into_block, data, size_to_copy);
+ }
+ return result;
+}
+
+bool
+Routing_Slip_Persistence_Manager::build_chain(
+ Persistent_Storage_Block* first_block, Block_Header& first_header,
+ ACE_Unbounded_Stack<size_t>& allocated_blocks,
+ const ACE_Message_Block& data)
+{
+ size_t data_size = data.total_length();
+ size_t remainder = data_size;
+ bool result = true;
+ // Save the number of items currently on the allocation list for
+ ACE_Unbounded_Stack<size_t> blocks_to_free;
+ size_t block_number = 0;
+
+ // reverse the order so when we pop, we free up things closer to block 0
+ // first
+ while (allocated_blocks.pop(block_number) == 0)
+ {
+ blocks_to_free.push(block_number);
+ }
+ size_t pos = first_header.put_header(
+ *first_block);
+ const ACE_Message_Block* mblk = &data;
+ remainder = this->fill_block(*first_block, pos, mblk, 0);
+ while ((remainder == 0) && (mblk->cont() != 0))
+ {
+ pos += mblk->length();
+ mblk = mblk->cont();
+ remainder = this->fill_block(*first_block, pos, mblk, 0);
+ }
+ first_header.data_size =
+ static_cast<TAO_Notify::Routing_Slip_Persistence_Manager::Block_Size> (data_size - remainder);
+ first_header.next_overflow = 0;
+
+ Block_Header* prevhdr = &first_header;
+ Persistent_Storage_Block* prevblk = first_block;
+
+ while (remainder > 0)
+ {
+ Overflow_Header* hdr = 0;
+ ACE_NEW_RETURN(hdr, Overflow_Header, result);
+
+ Persistent_Storage_Block* curblk = this->allocator_->allocate();
+ allocated_blocks.push(curblk->block_number());
+ // Set the previous block's overflow "pointer" to us.
+ prevhdr->next_overflow = curblk->block_number();
+ prevhdr->put_header(*prevblk);
+ pos = hdr->put_header(*curblk);
+ hdr->data_size =
+ static_cast<TAO_Notify::Routing_Slip_Persistence_Manager::Block_Size> (remainder);
+
+ size_t offset_into_msg = mblk->length() - remainder;
+ remainder = this->fill_block(*curblk, pos, mblk, offset_into_msg);
+ while ((remainder == 0) && (mblk->cont() != 0))
+ {
+ pos += mblk->length();
+ mblk = mblk->cont();
+ remainder = this->fill_block(*curblk, pos, mblk, 0);
+ }
+
+ hdr->data_size = hdr->data_size -
+ static_cast<TAO_Notify::Routing_Slip_Persistence_Manager::Block_Size> (remainder);
+ if (prevblk != first_block)
+ {
+ // allocator obtains ownership, so write out and delete the header
+ // only.
+ result &= this->allocator_->write(prevblk);
+ delete prevhdr;
+ }
+ prevblk = curblk;
+ prevhdr = hdr;
+ }
+ if (prevblk != first_block)
+ {
+ prevhdr->put_header(*prevblk);
+ result &= this->allocator_->write(prevblk);
+ delete prevhdr;
+ }
+ pos = first_header.put_header(
+ *first_block);
+ // Free all but the first routing_slip_block
+ while (blocks_to_free.pop(block_number) == 0)
+ {
+ this->allocator_->free(block_number);
+ }
+
+ return result;
+}
+
+bool
+Routing_Slip_Persistence_Manager::reload_chain(
+ Persistent_Storage_Block* first_block, Block_Header& first_header,
+ ACE_Unbounded_Stack<size_t>& allocated_blocks,
+ ACE_Message_Block* amb,
+ ACE_UINT64 expected_serial_number
+ )
+{
+ bool result = false;
+ size_t block_size = this->allocator_->block_size();
+ if (this->allocator_->read(first_block))
+ {
+ size_t pos = 0;
+ size_t nextptr = 0;
+ ACE_Message_Block* mbptr = amb;
+ ACE_Message_Block* mbnew = 0;
+
+ pos = first_header.extract_header(*first_block);
+ if (first_header.serial_number == expected_serial_number)
+ {
+ // We have to copy the first block because we cache it.
+ ACE_OS::memcpy(mbptr->wr_ptr(), first_block->data(),
+ block_size);
+ mbptr->rd_ptr(pos);
+ mbptr->wr_ptr(pos + first_header.data_size);
+ nextptr = first_header.next_overflow;
+ while (nextptr != 0)
+ {
+ Overflow_Header overflow_header;
+ ACE_NEW_RETURN(mbnew, ACE_Message_Block(block_size), result);
+ mbptr->cont(mbnew);
+ Persistent_Storage_Block* psb = this->allocator_->allocate_at(nextptr);
+ mbptr = mbnew;
+ // Deallocate the PSB's data and reallocate it to our wr_ptr()...
+ psb->reassign_data(static_cast<unsigned char*> (static_cast<void*> (mbptr->wr_ptr())), true);
+ // ...read into the PSB (whose data is inside of the AMB)...
+ this->allocator_->read(psb);
+ allocated_blocks.push(psb->block_number());
+ // ...extract all headers so we know the data's size...
+ pos = overflow_header.extract_header(*psb);
+ // ...set up the region that somebody else can look at...
+ mbptr->rd_ptr(pos);
+ mbptr->wr_ptr(pos + overflow_header.data_size);
+ // ...then make sure we don't delete data since we don't own it.
+ psb->reassign_data(0);
+ delete psb;
+ nextptr = overflow_header.next_overflow;
+ }
+ result = true;
+ }
+ }
+ return result;
+}
+
+bool
+Routing_Slip_Persistence_Manager::update_next_manager(
+ Routing_Slip_Persistence_Manager* next)
+{
+ bool result = false;
+ ACE_GUARD_RETURN(ACE_SYNCH_MUTEX, ace_mon, this->lock_, result);
+ ACE_ASSERT(this->persisted());
+ if (!this->removed_)
+ {
+ bool updated = false;
+ if (this->next_manager_ != 0)
+ {
+ if (this->routing_slip_header_.next_serial_number !=
+ next->routing_slip_header_.next_serial_number)
+ {
+ this->routing_slip_header_.next_serial_number =
+ next->routing_slip_header_.next_serial_number;
+ updated = true;
+ }
+ if (this->routing_slip_header_.next_routing_slip_block !=
+ next->routing_slip_header_.next_routing_slip_block)
+ {
+ this->routing_slip_header_.next_routing_slip_block =
+ next->routing_slip_header_.next_routing_slip_block;
+ updated = true;
+ }
+ }
+ if (updated)
+ {
+ this->write_first_routing_slip_block();
+ }
+ }
+ return result;
+}
+
+bool
+Routing_Slip_Persistence_Manager::persisted()
+{
+ return (0 != this->first_routing_slip_block_);
+}
+
+bool
+Routing_Slip_Persistence_Manager::is_root () const
+{
+ return this->serial_number_ == ROUTING_SLIP_ROOT_SERIAL_NUMBER;
+}
+
+void
+Routing_Slip_Persistence_Manager::release_all ()
+{
+ ACE_ASSERT(is_root());
+ while (this->next_manager_ != this)
+ {
+ Routing_Slip_Persistence_Manager * next = this->next_manager_;
+ next->remove_from_dllist();
+ ACE_ASSERT(next != this->next_manager_);
+ delete next;
+ }
+}
+
+size_t
+Routing_Slip_Persistence_Manager::write_first_routing_slip_block(
+ bool prepare_only)
+{
+ size_t pos = this->routing_slip_header_.put_header(
+ *this->first_routing_slip_block_);
+ if (!prepare_only)
+ {
+ this->allocator_->write(this->first_routing_slip_block_);
+ }
+ return pos;
+}
+
+void
+Routing_Slip_Persistence_Manager::dllist_push_back()
+{
+ insert_before (&this->factory_->root());
+}
+
+void
+Routing_Slip_Persistence_Manager::insert_before (Routing_Slip_Persistence_Manager * node)
+{
+ // Since this is a private function, the caller should have done locking
+ // on the factory before calling here. The same is true for removals.
+ ACE_ASSERT(this->prev_manager_ == this);
+ ACE_ASSERT(this->next_manager_ == this);
+ ACE_ASSERT(node != this);
+ this->prev_manager_ = node->prev_manager_;
+ node->prev_manager_ = this;
+ this->next_manager_ = node;
+ this->prev_manager_->next_manager_ = this;
+}
+
+void
+Routing_Slip_Persistence_Manager::remove_from_dllist()
+{
+ // Since this is a private function, the caller should have done locking
+ // on the factory before calling here. The same is true for insertions.
+ ACE_ASSERT(this->persisted());
+ ACE_ASSERT(this->prev_manager_ != this);
+ ACE_ASSERT(this->next_manager_ != this);
+ this->prev_manager_->next_manager_ = this->next_manager_;
+ this->next_manager_->prev_manager_ = this->prev_manager_;
+ this->prev_manager_ = this;
+ this->next_manager_ = this;
+}
+
+} /* namespace TAO_Notify */
+
+TAO_END_VERSIONED_NAMESPACE_DECL
diff --git a/TAO/orbsvcs/orbsvcs/Notify/Routing_Slip_Persistence_Manager.h b/TAO/orbsvcs/orbsvcs/Notify/Routing_Slip_Persistence_Manager.h
new file mode 100644
index 00000000000..0704a315884
--- /dev/null
+++ b/TAO/orbsvcs/orbsvcs/Notify/Routing_Slip_Persistence_Manager.h
@@ -0,0 +1,267 @@
+// -*- C++ -*-
+
+//=============================================================================
+/**
+ * @file Routing_Slip_Persistence_Manager.h
+ *
+ * $Id$
+ *
+ * A Routing_Slip_Persistence manager controls the actual allocation of
+ * blocks through a Persistent_Storage_Allocator and can persist an
+ * event and its routing slip.
+ *
+ * @author Jonathan Pollack <pollack_j@ociweb.com>
+ */
+//=============================================================================
+
+#ifndef ROUTING_SLIP_PERSISTENCE_MANAGER_H
+#define ROUTING_SLIP_PERSISTENCE_MANAGER_H
+#include /**/ "ace/pre.h"
+
+#include "orbsvcs/Notify/notify_serv_export.h"
+
+#if !defined (ACE_LACKS_PRAGMA_ONCE)
+#pragma once
+#endif /* ACE_LACKS_PRAGMA_ONCE */
+
+#include "tao/Versioned_Namespace.h"
+#include "ace/Message_Block.h"
+#include "ace/Synch_T.h"
+#include "ace/Containers_T.h"
+
+TAO_BEGIN_VERSIONED_NAMESPACE_DECL
+
+namespace TAO_Notify
+{
+// Some forward declarations.
+class Standard_Event_Persistence_Factory;
+class Persistent_File_Allocator;
+class Persistent_Storage_Block;
+class Persistent_Callback;
+
+/**
+ * \brief Manage interaction between Routing_Slip and persistent storage.
+ *
+ * todo: to complete the strategization of event persistent storage this
+ * should become an interface that is implemented differently by different
+ * strategies. For now it interacts with Standard_Event_Persistence.
+ */
+class TAO_Notify_Serv_Export Routing_Slip_Persistence_Manager
+{
+public:
+ /// A unique identifier for logical blocks in persistent storage.
+ typedef ACE_UINT64 Block_Serial_Number;
+ /// The physical address of a block in persistent storage.
+ typedef ACE_UINT32 Block_Number;
+ /// The size of a block in persistent storage.
+ typedef ACE_UINT16 Block_Size;
+ /// A code to indicate the type of block in persistent storage.
+ typedef ACE_UINT16 Block_Type;
+
+ /// The constructor.
+ Routing_Slip_Persistence_Manager(Standard_Event_Persistence_Factory* factory);
+
+ /// The destructor.
+ ~Routing_Slip_Persistence_Manager();
+
+ /// Set up callbacks
+ void set_callback(Persistent_Callback* callback);
+
+
+ /// Store an event + routing slip.
+ bool store(const ACE_Message_Block& event,
+ const ACE_Message_Block& routing_slip);
+
+ /// \brief Update the routing slip.
+ ///
+ /// We must always overwrite the first block
+ /// last, and it may not chance. Other blocks should be freed and
+ /// reallocated.
+ bool update(const ACE_Message_Block& routing_slip);
+
+ /// \brief Remove our associated event and routing slip from the
+ /// Persistent_File_Allocator.
+ bool remove();
+
+ /////////////////////////////////////////
+ // Methods to be used during reload only.
+
+ /// \brief Call this method to recover data during event reload.
+ ///
+ /// It should not fail under normal circumstances.
+ /// Caller owns the resulting message blocks and is responsible
+ /// for deleting them.
+ /// Reload the event and routing_slip from the Persistent_File_Allocator.
+ bool reload(ACE_Message_Block*& event, ACE_Message_Block*&routing_slip);
+
+ /// \brief Get next RSPM during reload.
+ ///
+ /// After using the data from the reload method, call this
+ /// method to get the next RSPM. It returns a null pointer
+ /// when all persistent events have been reloaded.
+ Routing_Slip_Persistence_Manager * load_next ();
+
+ /////////////////////////
+ // Implementation methods.
+ // Should not be called by Routing_Slip
+
+ /// \brief Commit root data to disk, which should only be done for a root node.
+ bool store_root();
+
+ /// \brief Reload data into this RSPM from the given block/serial#
+ ///
+ /// \return false if the reload is not successful.
+ bool load(Block_Number block_number, Block_Serial_Number expected_serial_number);
+
+ /// \brief Is this RSPM attached to the root block?
+ bool is_root () const;
+
+ /// \brief During cleanup for shut down, release all chained RSPMs.
+ void release_all ();
+
+private:
+ /**
+ * \brief private: Storage for header information of all persistent block.
+ */
+ class Block_Header
+ {
+ public:
+ enum Header_Type {
+ BT_Routing_Slip,
+ BT_Event,
+ BT_Overflow
+ };
+
+ Block_Header(Header_Type type);
+ virtual ~Block_Header (void);
+ virtual size_t extract_header(Persistent_Storage_Block& psb,
+ size_t offset = 0);
+ virtual size_t put_header(Persistent_Storage_Block& psb,
+ size_t offset = 0);
+
+ public:
+ /// Our serial number
+ Block_Serial_Number serial_number;
+ /// Address of the overflow record (if any)
+ Block_Number next_overflow;
+ /// How much extra header data is in this block (not including this header)
+ Block_Type header_type;
+ /// How much actual data is in this block? (not including headers)
+ Block_Size data_size;
+ };
+
+ /**
+ * \brief private: Storage for header information for Routing_Slip blocks.
+ */
+ class Routing_Slip_Header : public Block_Header
+ {
+ public:
+ Routing_Slip_Header();
+ virtual size_t extract_header(Persistent_Storage_Block& psb,
+ size_t offset = 0);
+ virtual size_t put_header(Persistent_Storage_Block& psb,
+ size_t offset = 0);
+
+ public:
+ /// The next event in the system
+ Block_Number next_routing_slip_block;
+ /// The next expected serial number
+ Block_Serial_Number next_serial_number;
+ Block_Number event_block;
+ };
+
+ /// \brief An Event block header.
+ ///
+ /// is just a Block_Header with no extra data
+ class Event_Header : public Block_Header
+ {
+ public:
+ Event_Header ();
+ };
+
+ /// \brief An overflow block header.
+ ///
+ /// is just a Block_Header with no extra data
+ /// The same record type is used for both Routing_Slip
+ /// and Event overflows.
+ class Overflow_Header : public Block_Header
+ {
+ public:
+ Overflow_Header ();
+ };
+
+ bool store_i(const ACE_Message_Block& event,
+ const ACE_Message_Block& routing_slip);
+
+ bool update_i(const ACE_Message_Block& routing_slip);
+
+ bool store_event(const ACE_Message_Block& event);
+
+ /// Fill in a block with data, and return the number of bytes
+ /// of data remaining to be written.
+ size_t fill_block(Persistent_Storage_Block& psb,
+ size_t offset_into_block, const ACE_Message_Block* data,
+ size_t offset_into_msg);
+ size_t fill_block(Persistent_Storage_Block& psb,
+ size_t offset_into_block, unsigned char* data,
+ size_t data_size);
+
+ /// Build a chain of Persistent_Storage_Blocks
+ bool build_chain(
+ Persistent_Storage_Block* first_block,
+ Block_Header& first_header,
+ ACE_Unbounded_Stack<size_t>& allocated_blocks,
+ const ACE_Message_Block& data);
+
+ /// Reload a chain from persistent store.
+ bool reload_chain(Persistent_Storage_Block* first_block,
+ Block_Header& first_header,
+ ACE_Unbounded_Stack<size_t>& allocated_blocks,
+ ACE_Message_Block* amb,
+ ACE_UINT64 expected_serial_number);
+
+ /// Locked method to do the work of setting the next_manager_.
+ bool update_next_manager(Routing_Slip_Persistence_Manager* next);
+
+ /// Have we been persisted yet?
+ bool persisted();
+
+ /// Write out our first event block.
+ size_t write_first_routing_slip_block(bool prepare_only = false);
+
+ /// Insert ourselves into a linked list of Routing_Slip_Persistnce_Managers
+ void dllist_push_back();
+
+ void insert_before (Routing_Slip_Persistence_Manager * node);
+
+ /// Remove ourselves from a linked list of Routing_Slip_Persistence_Managers
+ void remove_from_dllist();
+
+private:
+ ACE_SYNCH_MUTEX lock_;
+ bool removed_;
+ ACE_UINT64 serial_number_;
+ Persistent_File_Allocator* allocator_;
+ Standard_Event_Persistence_Factory* factory_;
+ Event_Header event_header_;
+ Routing_Slip_Header routing_slip_header_;
+ Persistent_Storage_Block* first_event_block_;
+ Persistent_Storage_Block* first_routing_slip_block_;
+ /// We are part of a doubly-linked list
+ Routing_Slip_Persistence_Manager* prev_manager_;
+ Routing_Slip_Persistence_Manager* next_manager_;
+ ACE_Unbounded_Stack<size_t> allocated_event_blocks_;
+ ACE_Unbounded_Stack<size_t> allocated_routing_slip_blocks_;
+ Persistent_Callback* callback_;
+
+ /// if these are non-zero we own 'em
+ ACE_Message_Block * event_mb_;
+ ACE_Message_Block * routing_slip_mb_;
+};
+
+} /* namespace TAO_Notify */
+
+TAO_END_VERSIONED_NAMESPACE_DECL
+
+#include /**/ "ace/post.h"
+#endif /* ROUTING_SLIP_PERSISTENCE_MANAGER_H */
diff --git a/TAO/orbsvcs/orbsvcs/Notify/Routing_Slip_Queue.cpp b/TAO/orbsvcs/orbsvcs/Notify/Routing_Slip_Queue.cpp
new file mode 100644
index 00000000000..4447981d06f
--- /dev/null
+++ b/TAO/orbsvcs/orbsvcs/Notify/Routing_Slip_Queue.cpp
@@ -0,0 +1,112 @@
+// $Id$
+
+#include "orbsvcs/Notify/Routing_Slip_Queue.h"
+
+#include "tao/debug.h"
+#include "ace/Dynamic_Service.h"
+
+//#define DEBUG_LEVEL 9
+#ifndef DEBUG_LEVEL
+# define DEBUG_LEVEL TAO_debug_level
+#endif //DEBUG_LEVEL
+
+
+TAO_BEGIN_VERSIONED_NAMESPACE_DECL
+
+namespace TAO_Notify
+{
+ Routing_Slip_Queue::Routing_Slip_Queue (size_t allowed)
+ : allowed_ (allowed)
+ , active_ (0)
+ {
+ }
+
+ Routing_Slip_Queue::~Routing_Slip_Queue ()
+ {
+ }
+
+ void
+ Routing_Slip_Queue::add (const Routing_Slip_Ptr & routing_slip)
+ {
+ Guard guard (internals_);
+ ACE_ASSERT (guard.locked()); // check recursion
+ if (this->allowed_ == 0)
+ {
+ ++this->active_;
+ guard.release ();
+ routing_slip->at_front_of_persist_queue ();
+// guard.acquire ();
+ }
+ else
+ {
+ this->queue_.enqueue_tail (routing_slip);
+ dispatch (guard);
+ }
+ }
+
+ void Routing_Slip_Queue::complete ()
+ {
+ Guard guard (internals_);
+ ACE_ASSERT (guard.locked()); // check recursion
+ ACE_ASSERT (this->active_ > 0);
+ --this->active_;
+ dispatch (guard);
+ }
+
+ void
+ Routing_Slip_Queue::dispatch (Guard & guard)
+ {
+ // we start out pretty nice,
+ // but the more work we do for other people
+ // the less nice we get.
+ size_t nice = this->allowed_ + 1;
+ while (nice > 0 && (this->active_ < this->allowed_))
+ {
+ if (dispatch_one (guard))
+ {
+ --nice;
+ }
+ else
+ {
+ // that's about as nice as I get.
+ nice = 0;
+ }
+ }
+ }
+
+ bool
+ Routing_Slip_Queue::dispatch_one (Guard & guard)
+ {
+ bool ok = false;
+ Routing_Slip_Ptr routing_slip;
+ if (this->queue_.dequeue_head (routing_slip) == 0)
+ {
+ ++this->active_;
+ guard.release ();
+ routing_slip->at_front_of_persist_queue ();
+ guard.acquire ();
+ }
+ return ok;
+ }
+
+ void
+ Routing_Slip_Queue::set_allowed (size_t allowed)
+ {
+ Guard guard (internals_);
+ size_t allowed_was = this->allowed_;
+ this->allowed_ = allowed;
+ if (allowed == 0 && allowed_was != 0)
+ {
+ while (dispatch_one (guard))
+ {
+ ; // work happens in dispatc_one
+ }
+ }
+ else
+ {
+ dispatch (guard);
+ }
+ }
+} // namespace
+
+TAO_END_VERSIONED_NAMESPACE_DECL
diff --git a/TAO/orbsvcs/orbsvcs/Notify/Routing_Slip_Queue.h b/TAO/orbsvcs/orbsvcs/Notify/Routing_Slip_Queue.h
new file mode 100644
index 00000000000..4d28e093c0b
--- /dev/null
+++ b/TAO/orbsvcs/orbsvcs/Notify/Routing_Slip_Queue.h
@@ -0,0 +1,93 @@
+// -*- C++ -*-
+
+// $Id$
+
+#ifndef TAO_NOTIFY_ROUTING_SLIP_QUEUE_H
+#define TAO_NOTIFY_ROUTING_SLIP_QUEUE_H
+#include /**/ "ace/pre.h"
+
+#include "orbsvcs/Notify/Routing_Slip.h"
+
+#if !defined (ACE_LACKS_PRAGMA_ONCE)
+# pragma once
+#endif /* ACE_LACKS_PRAGMA_ONCE */
+
+TAO_BEGIN_VERSIONED_NAMESPACE_DECL
+
+namespace TAO_Notify
+{
+ /**
+ * \brief A queue of Routing_Slips waiting to be persisted.
+ *
+ * The Routing_Slip_Queue keeps a queue of Routing_Slips waiting
+ * to be written to persistent storage. The "allowed" parameter
+ * determines how many Routing_Slips can be handled simultaneously
+ * by the persistent storage. Until this threshold is reached,
+ * Routing_Slips are not held in the queue, but pass straight through.
+ *
+ * Once the allowe number of Routing_Slips are being handled, any
+ * additional requests are held in the queue until persistence is
+ * complete for another Routing_Slips.
+ *
+ * Having Routing_Slips waiting in the queue is "a good thing" [TM]
+ * because it allows delivery completions to be applied to the
+ * routing slip before it is written -- thereby reducing or completely
+ * eliminating the number of actual writes to persistent storage.
+ *
+ * Experimentation indicates that a good value for "allowed" is 1.
+ *
+ * Allowed == 0 is treated as a special case meaning pass all Routing_Slips
+ * through the queue immediately. Setting it a good way to test how well
+ * your storage device withstands continuous beating.
+ */
+ class TAO_Notify_Serv_Export Routing_Slip_Queue
+ {
+ typedef ACE_Unbounded_Queue <Routing_Slip_Ptr> Queue;
+ typedef ACE_Guard< TAO_SYNCH_MUTEX > Guard;
+ public:
+ /**
+ * \brief Construct setting "allowed".
+ * \param allowed the number of Routing_Slips that can be handled
+ * simultaneously by the persistent store.
+ */
+ Routing_Slip_Queue (size_t allowed = 1);
+ /// Destructor.
+ ~Routing_Slip_Queue ();
+
+ /**
+ * \brief Add a routing slip to the tail of the queue and dispatch if necessary.
+ */
+ void add (const Routing_Slip_Ptr & routing_slip);
+ /**
+ * \brief A call back to indicate that processing is complete for a previously-queued
+ * Routing_Slip.
+ */
+ void complete ();
+
+ /**
+ * /brief Adjust the "allowed" value on-the-fly (not recommended, but it works.)
+ */
+ void set_allowed (size_t allowed);
+
+ private:
+ void dispatch (Guard & guard);
+ bool dispatch_one (Guard & guard);
+
+ private:
+ Routing_Slip_Queue (const Routing_Slip_Queue & rhs);
+ Routing_Slip_Queue & operator = (const Routing_Slip_Queue & rhs);
+ private:
+ // configuration setting
+ size_t allowed_;
+ /// Protection for internal information
+ TAO_SYNCH_MUTEX internals_;
+ size_t active_;
+ Queue queue_;
+
+ };
+} // namespace
+
+TAO_END_VERSIONED_NAMESPACE_DECL
+
+#include /**/ "ace/post.h"
+#endif /* TAO_NOTIFY_ROUTING_SLIP_QUEUE_H */
diff --git a/TAO/orbsvcs/orbsvcs/Notify/Save_Persist_Worker_T.cpp b/TAO/orbsvcs/orbsvcs/Notify/Save_Persist_Worker_T.cpp
new file mode 100644
index 00000000000..1be68b66c33
--- /dev/null
+++ b/TAO/orbsvcs/orbsvcs/Notify/Save_Persist_Worker_T.cpp
@@ -0,0 +1,47 @@
+//=============================================================================
+/**
+* @file Save_Persist_Worker_T.cpp
+*
+* $Id$
+*
+* @author Jonathan Pollack <pollack_j@ociweb.com>
+*/
+//=============================================================================
+
+#ifndef SAVE_PERSIST_WORKER_CPP
+#define SAVE_PERSIST_WORKER_CPP
+
+#include "orbsvcs/ESF/ESF_Worker.h"
+
+#if !defined (ACE_LACKS_PRAGMA_ONCE)
+#pragma once
+#endif /* ACE_LACKS_PRAGMA_ONCE */
+
+TAO_BEGIN_VERSIONED_NAMESPACE_DECL
+
+namespace TAO_Notify
+{
+ template<class TOPOOBJ>
+ Save_Persist_Worker<TOPOOBJ>::Save_Persist_Worker(Topology_Saver& saver,
+ bool want_all_children)
+ : saver_ (saver)
+ , want_all_children_ (want_all_children)
+ {
+ }
+
+ template<class TOPOOBJ>
+ void
+ Save_Persist_Worker<TOPOOBJ>::work (TOPOOBJ* o ACE_ENV_ARG_DECL)
+ {
+ ACE_ASSERT(o != 0);
+ if (this->want_all_children_ || o->is_changed ())
+ {
+ o->save_persistent (saver_ ACE_ENV_ARG_PARAMETER);
+ ACE_CHECK;
+ }
+ }
+} // namespace TAO_Notify
+
+TAO_END_VERSIONED_NAMESPACE_DECL
+
+#endif /* SAVE_PERSIST_WORKER_CPP */
diff --git a/TAO/orbsvcs/orbsvcs/Notify/Save_Persist_Worker_T.h b/TAO/orbsvcs/orbsvcs/Notify/Save_Persist_Worker_T.h
new file mode 100644
index 00000000000..a9d425891f0
--- /dev/null
+++ b/TAO/orbsvcs/orbsvcs/Notify/Save_Persist_Worker_T.h
@@ -0,0 +1,63 @@
+// -*- C++ -*-
+
+//=============================================================================
+/**
+* \file Save_Persist_Worker_T.h
+*
+* $Id$
+*
+* \author Jonathan Pollack <pollack_j@ociweb.com>
+*/
+//=============================================================================
+
+#ifndef SAVE_PERSIST_WORKER_H
+#define SAVE_PERSIST_WORKER_H
+#include /**/ "ace/pre.h"
+
+#include "orbsvcs/ESF/ESF_Worker.h"
+
+#if !defined (ACE_LACKS_PRAGMA_ONCE)
+#pragma once
+#endif /* ACE_LACKS_PRAGMA_ONCE */
+
+
+TAO_BEGIN_VERSIONED_NAMESPACE_DECL
+
+namespace TAO_Notify
+{
+ /**
+ * \brief Iterate through children saving persistent topology information.
+ */
+ template<class TOPOOBJ>
+ class Save_Persist_Worker : public TAO_ESF_Worker<TOPOOBJ>
+ {
+ public:
+ /**
+ * /brief Constructor
+ * /param saver the object that will save persistent information.
+ * /param want_all_children if true, unmodified children should be saved, too.
+ */
+ Save_Persist_Worker(Topology_Saver& saver, bool want_all_children);
+
+ // override virtual ESF_Worker method
+ virtual void work (TOPOOBJ* o ACE_ENV_ARG_DECL);
+
+ private:
+ Topology_Saver& saver_;
+ bool want_all_children_;
+ };
+} // namespace TAO_Notify
+
+TAO_END_VERSIONED_NAMESPACE_DECL
+
+#if defined (ACE_TEMPLATES_REQUIRE_SOURCE)
+#include "orbsvcs/Notify/Save_Persist_Worker_T.cpp"
+#endif /* ACE_TEMPLATES_REQUIRE_SOURCE */
+
+#if defined (ACE_TEMPLATES_REQUIRE_PRAGMA)
+#pragma implementation ("Save_Persist_Worker_T.cpp")
+#endif /* ACE_TEMPLATES_REQUIRE_PRAGMA */
+
+#include /**/ "ace/post.h"
+
+#endif /* SAVE_PERSIST_WORKER_H */
diff --git a/TAO/orbsvcs/orbsvcs/Notify/Seq_Worker_T.cpp b/TAO/orbsvcs/orbsvcs/Notify/Seq_Worker_T.cpp
new file mode 100644
index 00000000000..a1a29b3eb35
--- /dev/null
+++ b/TAO/orbsvcs/orbsvcs/Notify/Seq_Worker_T.cpp
@@ -0,0 +1,38 @@
+// $Id$
+
+#ifndef TAO_Notify_SEQ_WORKER_T_CPP
+#define TAO_Notify_SEQ_WORKER_T_CPP
+
+#include "orbsvcs/Notify/Seq_Worker_T.h"
+
+#if ! defined (__ACE_INLINE__)
+#include "orbsvcs/Notify/Seq_Worker_T.inl"
+#endif /* __ACE_INLINE__ */
+
+TAO_BEGIN_VERSIONED_NAMESPACE_DECL
+
+template <class T>
+TAO_Notify_Seq_Worker_T<T>::TAO_Notify_Seq_Worker_T (void)
+{
+}
+
+template<class TYPE> ACE_TYPENAME TAO_Notify_Seq_Worker_T<TYPE>::SEQ*
+TAO_Notify_Seq_Worker_T<TYPE>::create (CONTAINER &container ACE_ENV_ARG_DECL)
+{
+ SEQ* tmp;
+ ACE_NEW_THROW_EX (tmp, //this->seq_,
+ SEQ (),
+ CORBA::INTERNAL ());
+
+ this->seq_ = tmp;
+
+ container.collection ()->for_each (this ACE_ENV_ARG_PARAMETER);
+ ACE_CHECK_RETURN (0);
+
+ return this->seq_._retn ();
+
+}
+
+TAO_END_VERSIONED_NAMESPACE_DECL
+
+#endif /* TAO_Notify_SEQ_WORKER_T_CPP */
diff --git a/TAO/orbsvcs/orbsvcs/Notify/Seq_Worker_T.h b/TAO/orbsvcs/orbsvcs/Notify/Seq_Worker_T.h
new file mode 100644
index 00000000000..5e89210356e
--- /dev/null
+++ b/TAO/orbsvcs/orbsvcs/Notify/Seq_Worker_T.h
@@ -0,0 +1,72 @@
+// -*- C++ -*-
+
+/**
+ * @file Seq_Worker_T.h
+ *
+ * $Id$
+ *
+ * @author Pradeep Gore <pradeep@oomworks.com>
+ */
+
+#ifndef TAO_Notify_SEQ_WORKER_T_H
+#define TAO_Notify_SEQ_WORKER_T_H
+#include /**/ "ace/pre.h"
+
+#include "orbsvcs/Notify/notify_serv_export.h"
+
+#if !defined (ACE_LACKS_PRAGMA_ONCE)
+# pragma once
+#endif /* ACE_LACKS_PRAGMA_ONCE */
+
+#include "orbsvcs/ESF/ESF_Proxy_Collection.h"
+#include "orbsvcs/ESF/ESF_Worker.h"
+#include "orbsvcs/Notify/Container_T.h"
+
+TAO_BEGIN_VERSIONED_NAMESPACE_DECL
+
+/**
+ * @class TAO_Notify_Seq_Worker_T
+ *
+ * @brief Helper to construct a sequence of IDS in a collections.
+ *
+ */
+template <class TYPE>
+class TAO_Notify_Serv_Export TAO_Notify_Seq_Worker_T
+ : public TAO_ESF_Worker<TYPE>
+{
+ typedef TAO_Notify_Container_T<TYPE> CONTAINER;
+ typedef TAO_ESF_Proxy_Collection<TYPE> COLLECTION;
+ typedef typename TYPE::SEQ SEQ;
+ typedef typename TYPE::SEQ_VAR SEQ_VAR;
+
+public:
+ /// Constructor
+ TAO_Notify_Seq_Worker_T (void);
+
+ /// create a SEQ
+ SEQ* create (CONTAINER& container ACE_ENV_ARG_DECL);
+
+protected:
+ ///= TAO_ESF_Worker method
+ void work (TYPE* object ACE_ENV_ARG_DECL);
+
+ /// The result
+ SEQ_VAR seq_;
+};
+
+TAO_END_VERSIONED_NAMESPACE_DECL
+
+#if defined (__ACE_INLINE__)
+#include "orbsvcs/Notify/Seq_Worker_T.inl"
+#endif /* __ACE_INLINE__ */
+
+#if defined (ACE_TEMPLATES_REQUIRE_SOURCE)
+#include "orbsvcs/Notify/Seq_Worker_T.cpp"
+#endif /* ACE_TEMPLATES_REQUIRE_SOURCE */
+
+#if defined (ACE_TEMPLATES_REQUIRE_PRAGMA)
+#pragma implementation ("Seq_Worker_T.cpp")
+#endif /* ACE_TEMPLATES_REQUIRE_PRAGMA */
+
+#include /**/ "ace/post.h"
+#endif /* TAO_Notify_SEQ_WORKER_T_H */
diff --git a/TAO/orbsvcs/orbsvcs/Notify/Seq_Worker_T.inl b/TAO/orbsvcs/orbsvcs/Notify/Seq_Worker_T.inl
new file mode 100644
index 00000000000..43dc3487646
--- /dev/null
+++ b/TAO/orbsvcs/orbsvcs/Notify/Seq_Worker_T.inl
@@ -0,0 +1,15 @@
+// -*- C++ -*-
+//
+// $Id$
+
+TAO_BEGIN_VERSIONED_NAMESPACE_DECL
+
+template<class TYPE> ACE_INLINE void
+TAO_Notify_Seq_Worker_T<TYPE>::work (TYPE* type ACE_ENV_ARG_DECL_NOT_USED)
+{
+ this->seq_->length (this->seq_->length () + 1);
+
+ this->seq_[this->seq_->length () - 1] = type->id ();
+}
+
+TAO_END_VERSIONED_NAMESPACE_DECL
diff --git a/TAO/orbsvcs/orbsvcs/Notify/Sequence/SequenceProxyPushConsumer.cpp b/TAO/orbsvcs/orbsvcs/Notify/Sequence/SequenceProxyPushConsumer.cpp
new file mode 100644
index 00000000000..a7c5adb49c3
--- /dev/null
+++ b/TAO/orbsvcs/orbsvcs/Notify/Sequence/SequenceProxyPushConsumer.cpp
@@ -0,0 +1,139 @@
+// $Id$
+
+#include "orbsvcs/Notify/Sequence/SequenceProxyPushConsumer.h"
+
+ACE_RCSID (Notify, TAO_Notify_SequenceProxyPushConsumer, "$Id$")
+
+#include "tao/debug.h"
+#include "orbsvcs/Notify/Sequence/SequencePushSupplier.h"
+#include "orbsvcs/Notify/AdminProperties.h"
+#include "orbsvcs/Notify/Structured/StructuredEvent.h"
+#include "orbsvcs/Notify/Properties.h"
+
+TAO_BEGIN_VERSIONED_NAMESPACE_DECL
+
+TAO_Notify_SequenceProxyPushConsumer::TAO_Notify_SequenceProxyPushConsumer (void)
+:pacing_interval_ (CosNotification::PacingInterval)
+{
+}
+
+TAO_Notify_SequenceProxyPushConsumer::~TAO_Notify_SequenceProxyPushConsumer ()
+{
+}
+
+void
+TAO_Notify_SequenceProxyPushConsumer::release (void)
+{
+ delete this;
+ //@@ inform factory
+}
+
+CosNotifyChannelAdmin::ProxyType
+TAO_Notify_SequenceProxyPushConsumer::MyType (ACE_ENV_SINGLE_ARG_DECL_NOT_USED)
+ ACE_THROW_SPEC ((
+ CORBA::SystemException
+ ))
+{
+ return CosNotifyChannelAdmin::PUSH_SEQUENCE;
+}
+
+void
+TAO_Notify_SequenceProxyPushConsumer::connect_sequence_push_supplier (CosNotifyComm::SequencePushSupplier_ptr push_supplier ACE_ENV_ARG_DECL)
+ ACE_THROW_SPEC ((
+ CORBA::SystemException
+ , CosEventChannelAdmin::AlreadyConnected
+ ))
+{
+ // Convert Supplier to Base Type
+ TAO_Notify_SequencePushSupplier *supplier;
+ ACE_NEW_THROW_EX (supplier,
+ TAO_Notify_SequencePushSupplier (this),
+ CORBA::NO_MEMORY ());
+
+ supplier->init (push_supplier ACE_ENV_ARG_PARAMETER);
+ ACE_CHECK;
+
+ this->connect (supplier ACE_ENV_ARG_PARAMETER);
+ ACE_CHECK;
+ this->self_change (ACE_ENV_SINGLE_ARG_PARAMETER);
+}
+
+void
+TAO_Notify_SequenceProxyPushConsumer::push_structured_events (const CosNotification::EventBatch& event_batch ACE_ENV_ARG_DECL)
+ ACE_THROW_SPEC ((
+ CORBA::SystemException
+ , CosEventComm::Disconnected
+ ))
+{
+ // Check if we should proceed at all.
+ if (this->admin_properties().reject_new_events () == 1 && this->admin_properties().queue_full ())
+ ACE_THROW (CORBA::IMP_LIMIT ());
+
+ if (this->is_connected () == 0)
+ {
+ ACE_THROW (CosEventComm::Disconnected ());
+ }
+
+ for (CORBA::ULong i = 0; i < event_batch.length (); ++i)
+ {
+ const CosNotification::StructuredEvent& notification = event_batch[i];
+
+ TAO_Notify_StructuredEvent_No_Copy event (notification);
+ this->push_i (&event ACE_ENV_ARG_PARAMETER);
+ ACE_CHECK;
+ }
+}
+
+void
+TAO_Notify_SequenceProxyPushConsumer::disconnect_sequence_push_consumer (ACE_ENV_SINGLE_ARG_DECL)
+ ACE_THROW_SPEC ((
+ CORBA::SystemException
+ ))
+{
+ TAO_Notify_SequenceProxyPushConsumer::Ptr guard( this );
+ this->destroy (ACE_ENV_SINGLE_ARG_PARAMETER);
+ ACE_CHECK;
+ this->self_change (ACE_ENV_SINGLE_ARG_PARAMETER);
+}
+
+const char *
+TAO_Notify_SequenceProxyPushConsumer::get_proxy_type_name (void) const
+{
+ return "sequence_proxy_push_consumer";
+}
+
+void
+TAO_Notify_SequenceProxyPushConsumer::load_attrs (const TAO_Notify::NVPList& attrs)
+{
+ SuperClass::load_attrs(attrs);
+ ACE_CString ior;
+ if (attrs.load("PeerIOR", ior))
+ {
+ CORBA::ORB_var orb = TAO_Notify_PROPERTIES::instance()->orb();
+ ACE_DECLARE_NEW_CORBA_ENV;
+ ACE_TRY
+ {
+ CosNotifyComm::SequencePushSupplier_var ps = CosNotifyComm::SequencePushSupplier::_nil();
+ if ( ior.length() > 0 )
+ {
+ CORBA::Object_var obj = orb->string_to_object(ior.c_str() ACE_ENV_ARG_PARAMETER);
+ ACE_TRY_CHECK;
+ ps = CosNotifyComm::SequencePushSupplier::_unchecked_narrow(obj.in() ACE_ENV_ARG_PARAMETER);
+ ACE_TRY_CHECK;
+ }
+ // minor hack: suppress generating subscription updates during reload.
+ bool save_updates = this->updates_off_;
+ this->updates_off_ = true;
+ this->connect_sequence_push_supplier(ps.in() ACE_ENV_ARG_PARAMETER);
+ ACE_TRY_CHECK;
+ this->updates_off_ = save_updates;
+ }
+ ACE_CATCHANY
+ {
+ ACE_ASSERT(0);
+ }
+ ACE_ENDTRY;
+ }
+}
+
+TAO_END_VERSIONED_NAMESPACE_DECL
diff --git a/TAO/orbsvcs/orbsvcs/Notify/Sequence/SequenceProxyPushConsumer.h b/TAO/orbsvcs/orbsvcs/Notify/Sequence/SequenceProxyPushConsumer.h
new file mode 100644
index 00000000000..4db216993cb
--- /dev/null
+++ b/TAO/orbsvcs/orbsvcs/Notify/Sequence/SequenceProxyPushConsumer.h
@@ -0,0 +1,102 @@
+/* -*- C++ -*- */
+/**
+ * @file SequenceProxyPushConsumer.h
+ *
+ * $Id$
+ *
+ * @author Pradeep Gore <pradeep@oomworks.com>
+ *
+ *
+ */
+
+#ifndef TAO_Notify_SEQUENCEPROXYPUSHCONSUMER_H
+#define TAO_Notify_SEQUENCEPROXYPUSHCONSUMER_H
+
+#include /**/ "ace/pre.h"
+
+#include "orbsvcs/Notify/notify_serv_export.h"
+
+#if !defined (ACE_LACKS_PRAGMA_ONCE)
+# pragma once
+#endif /* ACE_LACKS_PRAGMA_ONCE */
+
+#include "orbsvcs/CosNotifyChannelAdminS.h"
+
+#include "orbsvcs/Notify/ProxyConsumer_T.h"
+
+#if defined(_MSC_VER)
+#pragma warning(push)
+#pragma warning(disable:4250)
+#endif /* _MSC_VER */
+
+TAO_BEGIN_VERSIONED_NAMESPACE_DECL
+
+/**
+ * @class TAO_Notify_SequenceProxyPushConsumer
+ *
+ * @brief
+ *
+ */
+class TAO_Notify_Serv_Export TAO_Notify_SequenceProxyPushConsumer
+ : public virtual TAO_Notify_ProxyConsumer_T <POA_CosNotifyChannelAdmin::SequenceProxyPushConsumer>
+{
+ typedef TAO_Notify_ProxyConsumer_T <POA_CosNotifyChannelAdmin::SequenceProxyPushConsumer> SuperClass;
+ friend class TAO_Notify_Builder;
+public:
+ /// Constuctor
+ TAO_Notify_SequenceProxyPushConsumer (void);
+
+ /// Destructor
+ virtual ~TAO_Notify_SequenceProxyPushConsumer ();
+
+ virtual const char * get_proxy_type_name (void) const;
+
+ virtual void load_attrs (const TAO_Notify::NVPList& attrs);
+
+protected:
+ ///= Data Members
+ TAO_Notify_Property_Time pacing_interval_;
+
+ ///= Protected Methods
+
+ //= interface methods
+ virtual CosNotifyChannelAdmin::ProxyType MyType (ACE_ENV_SINGLE_ARG_DECL)
+ ACE_THROW_SPEC ((
+ CORBA::SystemException
+ ));
+
+ virtual void connect_sequence_push_supplier (CosNotifyComm::SequencePushSupplier_ptr push_supplier
+ ACE_ENV_ARG_DECL
+ )
+ ACE_THROW_SPEC ((
+ CORBA::SystemException,
+ CosEventChannelAdmin::AlreadyConnected
+ ));
+
+ virtual void push_structured_events (const CosNotification::EventBatch & notifications
+ ACE_ENV_ARG_DECL
+ )
+ ACE_THROW_SPEC ((
+ CORBA::SystemException,
+ CosEventComm::Disconnected
+ ));
+
+ virtual void disconnect_sequence_push_consumer (ACE_ENV_SINGLE_ARG_DECL)
+ ACE_THROW_SPEC ((
+ CORBA::SystemException
+ ));
+
+private:
+ /// TAO_Notify_Destroy_Callback methods
+ virtual void release (void);
+};
+
+TAO_END_VERSIONED_NAMESPACE_DECL
+
+#if defined(_MSC_VER)
+#pragma warning(pop)
+#endif /* _MSC_VER */
+
+#include /**/ "ace/post.h"
+
+#endif /* TAO_Notify_SEQUENCEPROXYPUSHCONSUMER_H */
diff --git a/TAO/orbsvcs/orbsvcs/Notify/Sequence/SequenceProxyPushSupplier.cpp b/TAO/orbsvcs/orbsvcs/Notify/Sequence/SequenceProxyPushSupplier.cpp
new file mode 100644
index 00000000000..be2f9f74299
--- /dev/null
+++ b/TAO/orbsvcs/orbsvcs/Notify/Sequence/SequenceProxyPushSupplier.cpp
@@ -0,0 +1,108 @@
+// $Id$
+
+#include "orbsvcs/Notify/Sequence/SequenceProxyPushSupplier.h"
+
+ACE_RCSID (Notify, TAO_Notify_SequenceProxyPushSupplier, "$Id$")
+
+#include "tao/debug.h"
+#include "orbsvcs/Notify/Sequence/SequencePushConsumer.h"
+#include "orbsvcs/Notify/Properties.h"
+
+TAO_BEGIN_VERSIONED_NAMESPACE_DECL
+
+TAO_Notify_SequenceProxyPushSupplier::TAO_Notify_SequenceProxyPushSupplier (void)
+{
+}
+
+TAO_Notify_SequenceProxyPushSupplier::~TAO_Notify_SequenceProxyPushSupplier ()
+{
+}
+
+void
+TAO_Notify_SequenceProxyPushSupplier::release (void)
+{
+ delete this;
+ //@@ inform factory
+}
+
+void
+TAO_Notify_SequenceProxyPushSupplier::connect_sequence_push_consumer (CosNotifyComm::SequencePushConsumer_ptr push_consumer ACE_ENV_ARG_DECL)
+ ACE_THROW_SPEC ((
+ CORBA::SystemException
+ , CosEventChannelAdmin::AlreadyConnected
+ , CosEventChannelAdmin::TypeError
+ ))
+{
+ // Convert Consumer to Base Type
+ TAO_Notify_SequencePushConsumer* consumer;
+ ACE_NEW_THROW_EX (consumer,
+ TAO_Notify_SequencePushConsumer (this),
+ CORBA::NO_MEMORY ());
+
+ consumer->init (push_consumer ACE_ENV_ARG_PARAMETER);
+ ACE_CHECK;
+
+ this->connect (consumer ACE_ENV_ARG_PARAMETER);
+ ACE_CHECK;
+ this->self_change (ACE_ENV_SINGLE_ARG_PARAMETER);
+}
+
+void
+TAO_Notify_SequenceProxyPushSupplier::disconnect_sequence_push_supplier (ACE_ENV_SINGLE_ARG_DECL)
+ ACE_THROW_SPEC ((
+ CORBA::SystemException
+ ))
+
+{
+ TAO_Notify_SequenceProxyPushSupplier::Ptr guard( this );
+ this->destroy (ACE_ENV_SINGLE_ARG_PARAMETER);
+ ACE_CHECK;
+ this->self_change (ACE_ENV_SINGLE_ARG_PARAMETER);
+}
+
+CosNotifyChannelAdmin::ProxyType
+TAO_Notify_SequenceProxyPushSupplier::MyType (ACE_ENV_SINGLE_ARG_DECL_NOT_USED)
+ ACE_THROW_SPEC ((
+ CORBA::SystemException
+ ))
+{
+ return CosNotifyChannelAdmin::PUSH_SEQUENCE;
+}
+
+const char *
+TAO_Notify_SequenceProxyPushSupplier::get_proxy_type_name (void) const
+{
+ return "sequence_proxy_push_supplier";
+}
+
+void
+TAO_Notify_SequenceProxyPushSupplier::load_attrs (const TAO_Notify::NVPList& attrs)
+{
+ SuperClass::load_attrs(attrs);
+ ACE_CString ior;
+ if (attrs.load("PeerIOR", ior))
+ {
+ CORBA::ORB_var orb = TAO_Notify_PROPERTIES::instance()->orb();
+ ACE_DECLARE_NEW_CORBA_ENV;
+ ACE_TRY
+ {
+ CosNotifyComm::SequencePushConsumer_var pc = CosNotifyComm::SequencePushConsumer::_nil();
+ if (ior.length() > 0)
+ {
+ CORBA::Object_var obj = orb->string_to_object(ior.c_str() ACE_ENV_ARG_PARAMETER);
+ ACE_TRY_CHECK;
+ pc = CosNotifyComm::SequencePushConsumer::_unchecked_narrow(obj.in() ACE_ENV_ARG_PARAMETER);
+ ACE_TRY_CHECK;
+ }
+ this->connect_sequence_push_consumer(pc.in() ACE_ENV_ARG_PARAMETER);
+ ACE_TRY_CHECK;
+ }
+ ACE_CATCHANY
+ {
+ // if we can't reconnect, tough
+ }
+ ACE_ENDTRY;
+ }
+}
+
+TAO_END_VERSIONED_NAMESPACE_DECL
diff --git a/TAO/orbsvcs/orbsvcs/Notify/Sequence/SequenceProxyPushSupplier.h b/TAO/orbsvcs/orbsvcs/Notify/Sequence/SequenceProxyPushSupplier.h
new file mode 100644
index 00000000000..6603d5613e9
--- /dev/null
+++ b/TAO/orbsvcs/orbsvcs/Notify/Sequence/SequenceProxyPushSupplier.h
@@ -0,0 +1,99 @@
+/* -*- C++ -*- */
+/**
+ * @file SequenceProxyPushSupplier.h
+ *
+ * $Id$
+ *
+ * @author Pradeep Gore <pradeep@oomworks.com>
+ *
+ *
+ */
+
+#ifndef TAO_Notify_SEQUENCEPROXYPUSHSUPPLIER_H
+#define TAO_Notify_SEQUENCEPROXYPUSHSUPPLIER_H
+
+#include /**/ "ace/pre.h"
+
+#include "orbsvcs/Notify/notify_serv_export.h"
+
+#if !defined (ACE_LACKS_PRAGMA_ONCE)
+# pragma once
+#endif /* ACE_LACKS_PRAGMA_ONCE */
+
+#include "orbsvcs/CosNotifyChannelAdminS.h"
+
+#include "orbsvcs/Notify/ProxySupplier_T.h"
+
+#if defined(_MSC_VER)
+#pragma warning(push)
+#pragma warning(disable:4250)
+#endif /* _MSC_VER */
+
+TAO_BEGIN_VERSIONED_NAMESPACE_DECL
+
+#if defined ACE_HAS_EXPLICIT_TEMPLATE_INSTANTIATION_EXPORT
+template class TAO_Notify_Serv_Export
+TAO_Notify_ProxySupplier_T<POA_CosNotifyChannelAdmin::SequenceProxyPushSupplier>;
+#endif /* ACE_HAS_EXPLICIT_TEMPLATE_INSTANTIATION_EXPORT */
+
+/**
+ * @class TAO_Notify_SequenceProxyPushSupplier
+ *
+ * @brief Implements the CosNotifyChannelAdmin::SequenceProxyPushSupplier methods.
+ *
+ *
+ */
+class TAO_Notify_Serv_Export TAO_Notify_SequenceProxyPushSupplier
+ : public virtual TAO_Notify_ProxySupplier_T <POA_CosNotifyChannelAdmin::SequenceProxyPushSupplier>
+{
+ typedef TAO_Notify_ProxySupplier_T <POA_CosNotifyChannelAdmin::SequenceProxyPushSupplier> SuperClass;
+ friend class TAO_Notify_Builder;
+
+public:
+ /// Constuctor
+ TAO_Notify_SequenceProxyPushSupplier (void);
+
+ /// Destructor
+ virtual ~TAO_Notify_SequenceProxyPushSupplier ();
+
+
+ virtual const char * get_proxy_type_name (void) const;
+
+ virtual void load_attrs (const TAO_Notify::NVPList& attrs);
+
+ /// = Servant methods
+ virtual CosNotifyChannelAdmin::ProxyType MyType (ACE_ENV_SINGLE_ARG_DECL)
+ ACE_THROW_SPEC ((
+ CORBA::SystemException
+ ));
+
+ virtual void connect_sequence_push_consumer (
+ CosNotifyComm::SequencePushConsumer_ptr push_consumer
+ ACE_ENV_ARG_DECL
+ )
+ ACE_THROW_SPEC ((
+ CORBA::SystemException,
+ CosEventChannelAdmin::AlreadyConnected,
+ CosEventChannelAdmin::TypeError
+ ));
+
+ virtual void disconnect_sequence_push_supplier (
+ ACE_ENV_SINGLE_ARG_DECL
+ )
+ ACE_THROW_SPEC ((
+ CORBA::SystemException
+ ));
+
+ /// TAO_Notify_Destroy_Callback methods
+ virtual void release (void);
+};
+
+TAO_END_VERSIONED_NAMESPACE_DECL
+
+#if defined(_MSC_VER)
+#pragma warning(pop)
+#endif /* _MSC_VER */
+
+#include /**/ "ace/post.h"
+
+#endif /* TAO_Notify_SEQUENCEPROXYPUSHSUPPLIER_H */
diff --git a/TAO/orbsvcs/orbsvcs/Notify/Sequence/SequencePushConsumer.cpp b/TAO/orbsvcs/orbsvcs/Notify/Sequence/SequencePushConsumer.cpp
new file mode 100644
index 00000000000..19f972cd0cc
--- /dev/null
+++ b/TAO/orbsvcs/orbsvcs/Notify/Sequence/SequencePushConsumer.cpp
@@ -0,0 +1,297 @@
+// $Id$
+
+#include "orbsvcs/Notify/Sequence/SequencePushConsumer.h"
+
+ACE_RCSID (Notify, TAO_Notify_SequencePushConsumer, "$Id$")
+
+#include "ace/Reactor.h"
+#include "tao/debug.h"
+#include "orbsvcs/Notify/QoSProperties.h"
+#include "orbsvcs/Notify/ProxySupplier.h"
+#include "orbsvcs/Notify/Worker_Task.h"
+#include "orbsvcs/Notify/Consumer.h"
+#include "orbsvcs/Notify/Method_Request_Dispatch.h"
+#include "orbsvcs/Notify/Method_Request_Event.h"
+#include "orbsvcs/Notify/Timer.h"
+#include "orbsvcs/Notify/Proxy.h"
+#include "orbsvcs/Notify/Properties.h"
+//#define DEBUG_LEVEL 10
+#ifndef DEBUG_LEVEL
+# define DEBUG_LEVEL TAO_debug_level
+#endif //DEBUG_LEVEL
+
+TAO_BEGIN_VERSIONED_NAMESPACE_DECL
+
+TAO_Notify_SequencePushConsumer::TAO_Notify_SequencePushConsumer (TAO_Notify_ProxySupplier* proxy)
+: TAO_Notify_Consumer (proxy)
+{
+}
+
+TAO_Notify_SequencePushConsumer::~TAO_Notify_SequencePushConsumer ()
+{
+}
+
+void
+TAO_Notify_SequencePushConsumer::init (CosNotifyComm::SequencePushConsumer_ptr push_consumer ACE_ENV_ARG_DECL)
+{
+ // Initialize only once
+ ACE_ASSERT( CORBA::is_nil (this->push_consumer_.in()) );
+
+ if (CORBA::is_nil (push_consumer))
+ {
+ ACE_THROW (CORBA::BAD_PARAM());
+ }
+
+ this->push_consumer_ = CosNotifyComm::SequencePushConsumer::_duplicate (push_consumer);
+ this->publish_ = CosNotifyComm::NotifyPublish::_duplicate (push_consumer);
+}
+
+void
+TAO_Notify_SequencePushConsumer::release (void)
+{
+ delete this;
+ //@@ inform factory
+}
+
+bool
+TAO_Notify_SequencePushConsumer::dispatch_from_queue (Request_Queue& requests, ACE_Guard <TAO_SYNCH_MUTEX> & ace_mon)
+{
+ bool result = true;
+ if (DEBUG_LEVEL > 0)
+ {
+ ACE_DEBUG ( (LM_DEBUG,
+ ACE_TEXT ("(%P|%t) SequencePushConsumer dispatch queued requests. queue size:%u\n"),
+ requests.size ()));
+ }
+
+ long queue_size = requests.size ();
+ CORBA::Long max_batch_size = queue_size;
+ if (this->max_batch_size_.is_valid () )
+ {
+ max_batch_size = this->max_batch_size_.value ();
+ }
+ CORBA::Long batch_size = queue_size;
+ if (batch_size > max_batch_size)
+ {
+ batch_size = max_batch_size;
+ }
+ if (batch_size > 0)
+ {
+ CosNotification::EventBatch batch (batch_size);
+ batch.length (batch_size);
+
+ Request_Queue completed;
+
+ CORBA::Long pos = 0;
+ TAO_Notify_Method_Request_Event_Queueable * request = 0;
+ while (pos < batch_size && requests.dequeue_head (request) == 0)
+ {
+ if (DEBUG_LEVEL > 0)
+ {
+ ACE_DEBUG ( (LM_DEBUG,
+ ACE_TEXT ("(%P|%t) Sequence Dispatch Method_Request_Dispatch @%@\n"),
+ request));
+ }
+
+ const TAO_Notify_Event * ev = request->event ();
+ ev->convert (batch [pos]);
+ ++pos;
+
+ // note enqueue at head, use queue as stack.
+ completed.enqueue_head (request);
+ }
+ batch.length (pos);
+ ACE_ASSERT (pos > 0);
+
+ ace_mon.release ();
+ TAO_Notify_Consumer::DispatchStatus status =
+ this->dispatch_batch (batch);
+ ace_mon.acquire ();
+ switch (status)
+ {
+ case DISPATCH_SUCCESS:
+ {
+ TAO_Notify_Method_Request_Event_Queueable * request = 0;
+ while (completed.dequeue_head (request) == 0)
+ {
+ request->complete ();
+ request->release ();
+ }
+ result = true;
+ break;
+ }
+ case DISPATCH_FAIL:
+ {
+ TAO_Notify_Method_Request_Event_Queueable * request = 0;
+ while (completed.dequeue_head (request) == 0)
+ {
+ if (request->should_retry ())
+ {
+ if (DEBUG_LEVEL > 0)
+ ACE_DEBUG ((LM_DEBUG, ACE_TEXT ("(%P|%t) Consumer %d: Will retry %d\n"),
+ static_cast <int> (this->proxy ()->id ()),
+ request->sequence ()));
+ requests.enqueue_head (request);
+ result = false;
+ }
+ else
+ {
+ if (DEBUG_LEVEL > 0)
+ ACE_DEBUG ((LM_DEBUG, ACE_TEXT ("(%P|%t) Consumer %d: Discarding %d\n"),
+ static_cast<int> (this->proxy ()->id ()),
+ request->sequence ()));
+ request->complete ();
+ request->release ();
+ }
+ }
+ while (requests.dequeue_head (request) == 0)
+ {
+ if (request->should_retry ())
+ {
+ if (DEBUG_LEVEL > 0)
+ ACE_DEBUG ((LM_DEBUG, ACE_TEXT ("(%P|%t) Consumer %d: Will retry %d\n"),
+ static_cast<int> (this->proxy ()->id ()),
+ request->sequence ()));
+ requests.enqueue_head (request);
+ result = false;
+ }
+ else
+ {
+ if (DEBUG_LEVEL > 0)
+ ACE_DEBUG ((LM_DEBUG, ACE_TEXT ("(%P|%t) Consumer %d: Discarding %d\n"),
+ static_cast<int> (this->proxy ()->id ()),
+ request->sequence ()));
+ request->complete ();
+ request->release ();
+ }
+ }
+ ace_mon.release();
+ ACE_DECLARE_NEW_ENV;
+ ACE_TRY
+ {
+ this->proxy_supplier ()->destroy (ACE_ENV_SINGLE_ARG_PARAMETER);
+ ACE_TRY_CHECK;
+ }
+ ACE_CATCHANY
+ {
+ // todo is there something meaningful we can do here?
+ ;
+ }
+ ACE_ENDTRY;
+ ace_mon.acquire();
+ break;
+ }
+ case DISPATCH_RETRY:
+ case DISPATCH_DISCARD:
+ {
+ TAO_Notify_Method_Request_Event_Queueable * request = 0;
+ while (completed.dequeue_head (request) == 0)
+ {
+ if (request->should_retry ())
+ {
+ if (DEBUG_LEVEL > 0)
+ ACE_DEBUG ((LM_DEBUG, ACE_TEXT ("(%P|%t) Consumer %d: Will retry %d\n"),
+ static_cast<int> (this->proxy ()->id ()),
+ request->sequence ()));
+ requests.enqueue_head (request);
+ result = false;
+ }
+ else
+ {
+ if (DEBUG_LEVEL > 0)
+ ACE_DEBUG ((LM_DEBUG, ACE_TEXT ("(%P|%t) Consumer %d: Discarding %d\n"),
+ static_cast<int> (this->proxy ()->id ()),
+ request->sequence ()));
+ request->complete ();
+ request->release ();
+ }
+ }
+ break;
+ }
+ default:
+ {
+ result = false;
+ break;
+ }
+ }
+ }
+ return result;
+}
+
+bool
+TAO_Notify_SequencePushConsumer::enqueue_if_necessary (
+ TAO_Notify_Method_Request_Event * request
+ ACE_ENV_ARG_DECL)
+{
+ if (DEBUG_LEVEL > 0)
+ ACE_DEBUG ( (LM_DEBUG, "SequencePushConsumer enqueing event.\n"));
+ this->enqueue_request (request ACE_ENV_ARG_PARAMETER);
+ ACE_CHECK_RETURN (false);
+
+ size_t mbs = static_cast<size_t>(this->max_batch_size_.value());
+
+ if (this->pending_events().size() >= mbs || this->pacing_.is_valid () == 0)
+ {
+ this->dispatch_pending (ACE_ENV_SINGLE_ARG_PARAMETER);
+ ACE_CHECK_RETURN (false);
+ }
+ else
+ {
+ schedule_timer (false);
+ }
+ return true;
+}
+
+
+void
+TAO_Notify_SequencePushConsumer::push (const CORBA::Any& /*event*/ ACE_ENV_ARG_DECL_NOT_USED)
+{
+ //NOP
+}
+
+void
+TAO_Notify_SequencePushConsumer::push (const CosNotification::StructuredEvent& /*notification*/ ACE_ENV_ARG_DECL_NOT_USED)
+{
+ //NOP
+}
+
+
+void
+TAO_Notify_SequencePushConsumer::push (const CosNotification::EventBatch& event_batch ACE_ENV_ARG_DECL)
+{
+ this->push_consumer_->push_structured_events (event_batch ACE_ENV_ARG_PARAMETER);
+ ACE_CHECK;
+}
+
+ACE_CString
+TAO_Notify_SequencePushConsumer::get_ior (void) const
+{
+ ACE_CString result;
+ CORBA::ORB_var orb = TAO_Notify_PROPERTIES::instance ()->orb ();
+ ACE_DECLARE_NEW_CORBA_ENV;
+ ACE_TRY
+ {
+ CORBA::String_var ior = orb->object_to_string (this->push_consumer_.in () ACE_ENV_ARG_PARAMETER);
+ ACE_TRY_CHECK;
+ result = static_cast<const char*> (ior.in ());
+ }
+ ACE_CATCHANY
+ {
+ result.fast_clear();
+ }
+ ACE_ENDTRY;
+ return result;
+}
+
+void
+TAO_Notify_SequencePushConsumer::reconnect_from_consumer (TAO_Notify_Consumer* old_consumer
+ ACE_ENV_ARG_DECL)
+{
+ TAO_Notify_SequencePushConsumer* tmp = dynamic_cast<TAO_Notify_SequencePushConsumer *> (old_consumer);
+ ACE_ASSERT(tmp != 0);
+ this->init(tmp->push_consumer_.in() ACE_ENV_ARG_PARAMETER);
+ ACE_CHECK;
+ this->schedule_timer(false);
+}
+
+TAO_END_VERSIONED_NAMESPACE_DECL
diff --git a/TAO/orbsvcs/orbsvcs/Notify/Sequence/SequencePushConsumer.h b/TAO/orbsvcs/orbsvcs/Notify/Sequence/SequencePushConsumer.h
new file mode 100644
index 00000000000..ac5661e674f
--- /dev/null
+++ b/TAO/orbsvcs/orbsvcs/Notify/Sequence/SequencePushConsumer.h
@@ -0,0 +1,94 @@
+/* -*- C++ -*- */
+/**
+ * @file SequencePushConsumer.h
+ *
+ * $Id$
+ *
+ * @author Pradeep Gore <pradeep@oomworks.com>
+ *
+ *
+ */
+
+#ifndef TAO_Notify_SEQUENCEPUSHCONSUMER_H
+#define TAO_Notify_SEQUENCEPUSHCONSUMER_H
+#include /**/ "ace/pre.h"
+
+#include "orbsvcs/Notify/notify_serv_export.h"
+
+#if !defined (ACE_LACKS_PRAGMA_ONCE)
+# pragma once
+#endif /* ACE_LACKS_PRAGMA_ONCE */
+
+#include "ace/Event_Handler.h"
+#include "orbsvcs/Notify/Event.h"
+#include "orbsvcs/Notify/Property.h"
+#include "orbsvcs/Notify/Property_T.h"
+#include "orbsvcs/Notify/Consumer.h"
+#include "orbsvcs/Notify/AdminProperties.h"
+#include "ace/Null_Condition.h"
+
+TAO_BEGIN_VERSIONED_NAMESPACE_DECL
+
+class TAO_Notify_ProxySupplier;
+class TAO_Notify_QoSProperties;
+class TAO_Notify_Timer;
+
+/**
+ * @class TAO_Notify_SequencePushConsumer
+ *
+ * @brief
+ *
+ */
+class TAO_Notify_Serv_Export TAO_Notify_SequencePushConsumer
+ : public TAO_Notify_Consumer
+{
+public:
+ TAO_Notify_SequencePushConsumer (TAO_Notify_ProxySupplier* proxy);
+
+ virtual ~TAO_Notify_SequencePushConsumer ();
+
+ /// Init the Consumer
+ void init (CosNotifyComm::SequencePushConsumer_ptr push_consumer ACE_ENV_ARG_DECL);
+
+ /// Add request to a queue if necessary.
+ /// for Sequence it's always necessary.
+ virtual bool enqueue_if_necessary(
+ TAO_Notify_Method_Request_Event * request
+ ACE_ENV_ARG_DECL);
+
+ virtual bool dispatch_from_queue (
+ Request_Queue & requests,
+ ACE_Guard <TAO_SYNCH_MUTEX> & ace_mon);
+
+
+ /// Push <event> to this consumer.
+ virtual void push (const CORBA::Any& event ACE_ENV_ARG_DECL);
+
+ // Push event.
+ virtual void push (const CosNotification::StructuredEvent & event ACE_ENV_ARG_DECL);
+
+ /// Push a batch of events to this consumer.
+ virtual void push (const CosNotification::EventBatch& event ACE_ENV_ARG_DECL);
+
+ /// Retrieve the ior of this peer
+ virtual ACE_CString get_ior (void) const;
+
+ /// on reconnect we need to move events from the old consumer
+ /// to the new one
+ virtual void reconnect_from_consumer (TAO_Notify_Consumer* old_consumer
+ ACE_ENV_ARG_DECL);
+
+protected:
+
+ /// The Consumer
+ CosNotifyComm::SequencePushConsumer_var push_consumer_;
+
+private:
+ /// TAO_Notify_Destroy_Callback methods.
+ virtual void release (void);
+};
+
+TAO_END_VERSIONED_NAMESPACE_DECL
+
+#include /**/ "ace/post.h"
+#endif /* TAO_Notify_SEQUENCEPUSHCONSUMER_H */
diff --git a/TAO/orbsvcs/orbsvcs/Notify/Sequence/SequencePushSupplier.cpp b/TAO/orbsvcs/orbsvcs/Notify/Sequence/SequencePushSupplier.cpp
new file mode 100644
index 00000000000..df010388763
--- /dev/null
+++ b/TAO/orbsvcs/orbsvcs/Notify/Sequence/SequencePushSupplier.cpp
@@ -0,0 +1,56 @@
+// $Id$
+
+#include "orbsvcs/Notify/Sequence/SequencePushSupplier.h"
+
+ACE_RCSID (Notify, TAO_Notify_SequencePushSupplier, "$Id$")
+
+#include "orbsvcs/Notify/Properties.h"
+
+TAO_BEGIN_VERSIONED_NAMESPACE_DECL
+
+TAO_Notify_SequencePushSupplier::TAO_Notify_SequencePushSupplier (TAO_Notify_ProxyConsumer* proxy)
+ :TAO_Notify_Supplier (proxy)
+{
+}
+
+TAO_Notify_SequencePushSupplier::~TAO_Notify_SequencePushSupplier ()
+{
+}
+
+void
+TAO_Notify_SequencePushSupplier::init (CosNotifyComm::SequencePushSupplier_ptr push_supplier ACE_ENV_ARG_DECL_NOT_USED)
+{
+ // TODO: verify single init call
+ // push_supplier is optional
+ this->push_supplier_ = CosNotifyComm::SequencePushSupplier::_duplicate (push_supplier);
+ this->subscribe_ = CosNotifyComm::NotifySubscribe::_duplicate (push_supplier);
+}
+
+void
+TAO_Notify_SequencePushSupplier::release (void)
+{
+ delete this;
+ //@@ inform factory
+}
+
+ACE_CString
+TAO_Notify_SequencePushSupplier::get_ior (void) const
+{
+ ACE_CString result;
+ CORBA::ORB_var orb = TAO_Notify_PROPERTIES::instance()->orb();
+ ACE_DECLARE_NEW_CORBA_ENV;
+ ACE_TRY
+ {
+ CORBA::String_var ior = orb->object_to_string(this->push_supplier_.in() ACE_ENV_ARG_PARAMETER);
+ ACE_TRY_CHECK;
+ result = static_cast<const char*> (ior.in ());
+ }
+ ACE_CATCHANY
+ {
+ result.fast_clear();
+ }
+ ACE_ENDTRY;
+ return result;
+}
+
+TAO_END_VERSIONED_NAMESPACE_DECL
diff --git a/TAO/orbsvcs/orbsvcs/Notify/Sequence/SequencePushSupplier.h b/TAO/orbsvcs/orbsvcs/Notify/Sequence/SequencePushSupplier.h
new file mode 100644
index 00000000000..2b2af2efc08
--- /dev/null
+++ b/TAO/orbsvcs/orbsvcs/Notify/Sequence/SequencePushSupplier.h
@@ -0,0 +1,61 @@
+/* -*- C++ -*- */
+/**
+ * @file SequencePushSupplier.h
+ *
+ * $Id$
+ *
+ * @author Pradeep Gore <pradeep@oomworks.com>
+ *
+ *
+ */
+
+#ifndef TAO_Notify_SEQUENCEPUSHSUPPLIER_H
+#define TAO_Notify_SEQUENCEPUSHSUPPLIER_H
+#include /**/ "ace/pre.h"
+
+#include "orbsvcs/Notify/notify_serv_export.h"
+
+#if !defined (ACE_LACKS_PRAGMA_ONCE)
+# pragma once
+#endif /* ACE_LACKS_PRAGMA_ONCE */
+
+#include "orbsvcs/CosNotifyCommC.h"
+#include "orbsvcs/Notify/Supplier.h"
+
+TAO_BEGIN_VERSIONED_NAMESPACE_DECL
+
+class TAO_Notify_ProxyConsumer;
+
+/**
+ * @class TAO_Notify_SequencePushSupplier
+ *
+ * @brief Wrapper for the SequencePushSupplier that connect to the EventChannel.
+ *
+ */
+class TAO_Notify_Serv_Export TAO_Notify_SequencePushSupplier : public TAO_Notify_Supplier
+{
+public:
+ /// Constuctor
+ TAO_Notify_SequencePushSupplier (TAO_Notify_ProxyConsumer* proxy);
+
+ /// Destructor
+ virtual ~TAO_Notify_SequencePushSupplier ();
+
+ /// Init
+ void init (CosNotifyComm::SequencePushSupplier_ptr push_supplier ACE_ENV_ARG_DECL);
+
+ /// TAO_Notify_Destroy_Callback methods
+ virtual void release (void);
+
+ /// Retrieve the ior of this peer
+ virtual ACE_CString get_ior (void) const;
+
+protected:
+ /// The Supplier
+ CosNotifyComm::SequencePushSupplier_var push_supplier_;
+};
+
+TAO_END_VERSIONED_NAMESPACE_DECL
+
+#include /**/ "ace/post.h"
+#endif /* TAO_Notify_SEQUENCEPUSHSUPPLIER_H */
diff --git a/TAO/orbsvcs/orbsvcs/Notify/Service.cpp b/TAO/orbsvcs/orbsvcs/Notify/Service.cpp
new file mode 100644
index 00000000000..f4cda660134
--- /dev/null
+++ b/TAO/orbsvcs/orbsvcs/Notify/Service.cpp
@@ -0,0 +1,15 @@
+// $Id$
+
+#include "orbsvcs/Notify/Service.h"
+
+ACE_RCSID (Notify,
+ TAO_Notify_Service,
+ "$Id$")
+
+TAO_BEGIN_VERSIONED_NAMESPACE_DECL
+
+TAO_Notify_Service::~TAO_Notify_Service ()
+{
+}
+
+TAO_END_VERSIONED_NAMESPACE_DECL
diff --git a/TAO/orbsvcs/orbsvcs/Notify/Service.h b/TAO/orbsvcs/orbsvcs/Notify/Service.h
new file mode 100644
index 00000000000..6fdfd47f2ab
--- /dev/null
+++ b/TAO/orbsvcs/orbsvcs/Notify/Service.h
@@ -0,0 +1,84 @@
+// -*- C++ -*-
+
+/**
+ * @file Service.h
+ *
+ * $Id$
+ *
+ * @author Pradeep Gore <pradeep@oomworks.com>
+ */
+
+#ifndef TAO_Notify_SERVICE_H
+#define TAO_Notify_SERVICE_H
+#include /**/ "ace/pre.h"
+
+#include "orbsvcs/Notify/notify_serv_export.h"
+
+#if !defined (ACE_LACKS_PRAGMA_ONCE)
+# pragma once
+#endif /* ACE_LACKS_PRAGMA_ONCE */
+
+#include "tao/Versioned_Namespace.h"
+
+#include "ace/Service_Object.h"
+#include "ace/Service_Config.h"
+#include "ace/CORBA_macros.h"
+
+TAO_BEGIN_VERSIONED_NAMESPACE_DECL
+
+namespace PortableServer
+{
+ class POA;
+ typedef POA *POA_ptr;
+}
+
+namespace CosNotifyChannelAdmin
+{
+ class EventChannelFactory;
+ typedef EventChannelFactory *EventChannelFactory_ptr;
+}
+
+namespace CORBA
+{
+ class ORB;
+ typedef ORB *ORB_ptr;
+}
+
+/**
+ * @class TAO_Notify_Service
+ *
+ * @brief Abstract ACE_Service_Object interface that is a
+ * factory for creating a Notify EventChannelFactory.
+ * Note that a Service creates only 1 Factory object.
+ *
+ */
+class TAO_Notify_Serv_Export TAO_Notify_Service : public ACE_Service_Object
+{
+public:
+ /// Destructor.
+ virtual ~TAO_Notify_Service (void);
+
+ /// Init the service from configurator
+ virtual int init (int argc, ACE_TCHAR *argv[]) = 0;
+
+ /// Init the service.
+ virtual void init_service (CORBA::ORB_ptr orb ACE_ENV_ARG_DECL) = 0;
+
+ /// Create the Channel Factory.
+ virtual CosNotifyChannelAdmin::EventChannelFactory_ptr create (
+ PortableServer::POA_ptr default_POA ACE_ENV_ARG_DECL
+ ) = 0;
+};
+
+TAO_END_VERSIONED_NAMESPACE_DECL
+
+#define TAO_NOTIFY_DEF_EMO_FACTORY_NAME "Notify_Default_Event_Manager_Objects_Factory"
+
+#define TAO_NOTIFICATION_SERVICE_NAME "TAO_Notify_Service"
+
+#define TAO_COS_NOTIFICATION_SERVICE_NAME "TAO_CosNotify_Service"
+
+#define TAO_RT_NOTIFICATION_SERVICE_NAME "TAO_RT_Notify_Service"
+
+#include /**/ "ace/post.h"
+#endif /* TAO_Notify_SERVICE_H */
diff --git a/TAO/orbsvcs/orbsvcs/Notify/Standard_Event_Persistence.cpp b/TAO/orbsvcs/orbsvcs/Notify/Standard_Event_Persistence.cpp
new file mode 100644
index 00000000000..65389ef7c35
--- /dev/null
+++ b/TAO/orbsvcs/orbsvcs/Notify/Standard_Event_Persistence.cpp
@@ -0,0 +1,234 @@
+// $Id$
+
+#include "orbsvcs/Notify/Standard_Event_Persistence.h"
+#include "orbsvcs/Notify/Persistent_File_Allocator.h"
+#include "tao/debug.h"
+#include "ace/Dynamic_Service.h"
+#include "ace/OS_NS_strings.h"
+
+TAO_BEGIN_VERSIONED_NAMESPACE_DECL
+
+namespace TAO_Notify
+{
+
+Standard_Event_Persistence::Standard_Event_Persistence ()
+ : filename_ (ACE_TEXT ("__PERSISTENT_EVENT__.DB"))
+ , block_size_ (512)
+ , factory_ (0)
+{
+}
+
+Standard_Event_Persistence::~Standard_Event_Persistence ()
+{
+}
+
+// get the current factory, creating it if necessary
+Event_Persistence_Factory *
+Standard_Event_Persistence::get_factory ()
+{
+ //@@todo guard? ; doublecheck?
+ if (this->factory_ == 0)
+ {
+ ACE_NEW_NORETURN (
+ this->factory_,
+ Standard_Event_Persistence_Factory ()
+ );
+ if (this->factory_ != 0)
+ {
+ if (!this->factory_->open (this->filename_.c_str ()))
+ {
+ this->factory_ = 0;
+ }
+ }
+ }
+ return this->factory_;
+}
+
+// release the current factory so a new one can be created
+void
+Standard_Event_Persistence::reset ()
+{
+ delete this->factory_;
+ this->factory_ = 0;
+}
+
+int
+Standard_Event_Persistence::init (int argc, ACE_TCHAR *argv[])
+{
+ int result = 0;
+ bool verbose = false;
+ for (int narg = 0; narg < argc; ++narg)
+ {
+ ACE_TCHAR * av = argv[narg];
+ if (ACE_OS::strcasecmp (av, ACE_TEXT ("-v")) == 0)
+ {
+ verbose = true;
+ ACE_DEBUG ((LM_DEBUG,
+ ACE_TEXT ("(%P|%t) Standard_Event_Persistence: -verbose\n")
+ ));
+ }
+ else if (ACE_OS::strcasecmp (av, ACE_TEXT ("-file_path")) == 0 && narg + 1 < argc)
+ {
+ this->filename_ = argv[narg + 1];
+ if (TAO_debug_level > 0 || verbose)
+ {
+ ACE_DEBUG ((LM_DEBUG,
+ ACE_TEXT ("(%P|%t) Standard_Event_Persistence: Setting -file_path: %s\n"),
+ this->filename_.c_str ()
+ ));
+ }
+ narg += 1;
+ }
+ else if (ACE_OS::strcasecmp (av, ACE_TEXT ("-block_size")) == 0 && narg + 1 < argc)
+ {
+ this->block_size_ = ACE_OS::atoi(argv[narg + 1]);
+ if (TAO_debug_level > 0 || verbose)
+ {
+ ACE_DEBUG ((LM_DEBUG,
+ ACE_TEXT ("(%P|%t) Standard_Event_Persistence: Setting -block_size: %d\n"),
+ this->block_size_
+ ));
+ }
+ narg += 1;
+ }
+ else
+ {
+ ACE_ERROR ((LM_ERROR,
+ ACE_TEXT ("(%P|%t) Unknown parameter to Standard Event Persistence: %s\n"),
+ argv[narg]
+ ));
+ result = -1;
+ }
+ }
+ return result;
+}
+
+int
+Standard_Event_Persistence::fini ()
+{
+ delete this->factory_;
+ this->factory_ = 0;
+ return 0;
+}
+
+Standard_Event_Persistence_Factory::Standard_Event_Persistence_Factory ()
+ : allocator_()
+ , root_(this)
+ , psb_(0)
+ , serial_number_(ROUTING_SLIP_ROOT_SERIAL_NUMBER + 1)
+ , is_reloading_ (false)
+{
+}
+
+bool
+Standard_Event_Persistence_Factory::open (const ACE_TCHAR* filename,
+ ACE_UINT32 block_size)
+{
+ bool result = false;
+ if (allocator_.open (filename, block_size))
+ {
+ this->is_reloading_ = this->root_.load(ROUTING_SLIP_ROOT_BLOCK_NUMBER, ROUTING_SLIP_ROOT_SERIAL_NUMBER);
+ if (! this->is_reloading_)
+ {
+ ACE_ASSERT (this->psb_ == 0);
+// this->psb_ = this->allocator_.allocate();
+ this->root_.store_root();
+ }
+ result = true;
+ }
+ return result;
+}
+
+Standard_Event_Persistence_Factory::~Standard_Event_Persistence_Factory()
+{
+ if (TAO_debug_level > 0)
+ {
+ ACE_DEBUG ((LM_DEBUG,
+ ACE_TEXT ("(%P|%t) Standard_Event_Persistence_Factory::~Standard_Event_Persistence_Factory\n")
+ ));
+ }
+ this->root_.release_all ();
+ delete this->psb_;
+ this->psb_ = 0;
+ this->allocator_.shutdown();
+}
+
+Routing_Slip_Persistence_Manager*
+Standard_Event_Persistence_Factory::create_routing_slip_persistence_manager(
+ Persistent_Callback* callback)
+{
+ Routing_Slip_Persistence_Manager* rspm = 0;
+ ACE_NEW_RETURN(rspm, Routing_Slip_Persistence_Manager(this), rspm);
+ rspm->set_callback(callback);
+ return rspm;
+}
+
+Routing_Slip_Persistence_Manager *
+Standard_Event_Persistence_Factory::first_reload_manager()
+{
+ Routing_Slip_Persistence_Manager * result = 0;
+ if (this->is_reloading_)
+ {
+ result = this->root_.load_next();
+ }
+ return result;
+}
+
+void
+Standard_Event_Persistence_Factory::done_reloading(
+ Persistent_Storage_Block * next_psb,
+ ACE_UINT64 current_serial_number)
+{
+ ACE_ASSERT (this->psb_ == 0);
+ this->psb_ = next_psb;
+ this->serial_number_ = current_serial_number;
+ this->is_reloading_ = false;
+}
+
+void
+Standard_Event_Persistence_Factory::preallocate_next_record(
+ ACE_UINT64& current_serial_number,
+ Persistent_Storage_Block*& current_psb,
+ ACE_UINT64& next_serial_number,
+ ACE_UINT32& next_block_number)
+{
+ // return current serial number and
+ // a psb containing current record number
+ current_serial_number = this->serial_number_;
+ this->psb_->set_allocator_owns(false); // give up ownership
+ this->psb_->set_sync();
+ current_psb = this->psb_;
+ this->get_preallocated_pointer (next_serial_number, next_block_number);
+}
+
+void
+Standard_Event_Persistence_Factory::get_preallocated_pointer(
+ ACE_UINT64& next_serial_number,
+ ACE_UINT32& next_block_number)
+{
+ ++this->serial_number_;
+ this->psb_ = this->allocator_.allocate();
+
+ next_serial_number = this->serial_number_;
+ next_block_number = this->psb_->block_number();
+}
+
+Persistent_File_Allocator*
+Standard_Event_Persistence_Factory::allocator()
+{
+ return &this->allocator_;
+}
+
+Routing_Slip_Persistence_Manager &
+Standard_Event_Persistence_Factory::root()
+{
+ return this->root_;
+}
+
+} // End TAO_Notify_Namespace
+
+TAO_END_VERSIONED_NAMESPACE_DECL
+
+ACE_FACTORY_NAMESPACE_DEFINE (TAO_Notify_Serv,
+ TAO_Notify_Standard_Event_Persistence,
+ TAO_Notify::Standard_Event_Persistence)
diff --git a/TAO/orbsvcs/orbsvcs/Notify/Standard_Event_Persistence.h b/TAO/orbsvcs/orbsvcs/Notify/Standard_Event_Persistence.h
new file mode 100644
index 00000000000..995577d761a
--- /dev/null
+++ b/TAO/orbsvcs/orbsvcs/Notify/Standard_Event_Persistence.h
@@ -0,0 +1,134 @@
+// -*- C++ -*-
+
+//=============================================================================
+/**
+ * \file Event_Persistence_Factory.h
+ *
+ * $Id$
+ *
+ * The standard implementation of Event_Persistence_Factory.
+ *
+ * \author Jonathan Pollack <pollack_j@ociweb.com>
+ */
+//=============================================================================
+
+#ifndef STANDARD_EVENT_PERSISTENCE_H
+#define STANDARD_EVENT_PERSISTENCE_H
+#include /**/ "ace/pre.h"
+#include /**/ "ace/config-all.h"
+
+#if !defined (ACE_LACKS_PRAGMA_ONCE)
+#pragma once
+#endif /* ACE_LACKS_PRAGMA_ONCE */
+
+#include "orbsvcs/Notify/Event_Persistence_Strategy.h"
+#include "orbsvcs/Notify/Event_Persistence_Factory.h"
+#include "orbsvcs/Notify/Persistent_File_Allocator.h"
+#include "orbsvcs/Notify/Routing_Slip_Persistence_Manager.h"
+#include <ace/SString.h>
+
+
+TAO_BEGIN_VERSIONED_NAMESPACE_DECL
+
+namespace TAO_Notify
+{
+ static const ACE_UINT32 ROUTING_SLIP_ROOT_BLOCK_NUMBER = 0;
+ static const ACE_UINT64 ROUTING_SLIP_ROOT_SERIAL_NUMBER = 1;
+
+ /// \brief Standard (i.e. default) implementation of Event_Persistence_Factory interface
+ class TAO_Notify_Serv_Export Standard_Event_Persistence_Factory :
+ public Event_Persistence_Factory
+ {
+ public:
+ /// Constructor
+ Standard_Event_Persistence_Factory ();
+ /// Destructor
+ virtual ~Standard_Event_Persistence_Factory();
+
+ /// Open persistence file and initialize.
+ /// /param filename the fully qualified path/name of the file to contain
+ /// persistent information.
+ /// /param block_size the size of a physical block on the device containing
+ /// the file.
+ bool open (const ACE_TCHAR* filename, ACE_UINT32 block_size = 512);
+
+ //////////////////////////////////////////////////////
+ // Implement Event_Persistence_Factory virtual methods.
+ virtual Routing_Slip_Persistence_Manager*
+ create_routing_slip_persistence_manager(Persistent_Callback* callback);
+
+ virtual Routing_Slip_Persistence_Manager * first_reload_manager();
+
+ /// reloading process complete. Where should the chain continue?
+ void done_reloading(
+ Persistent_Storage_Block * next_psb,
+ ACE_UINT64 current_serial_number);
+
+ /// return current serial # and a psb containing current record#
+ /// allocate new serial # and record number, and return those, too.
+ void preallocate_next_record(
+ ACE_UINT64& current_serial_number,
+ Persistent_Storage_Block*& current_psb,
+ ACE_UINT64& next_serial_number,
+ ACE_UINT32& next_block_number);
+
+ // return block pointer info for the
+ void get_preallocated_pointer(
+ ACE_UINT64& next_serial_number,
+ ACE_UINT32& next_block_number);
+
+ /// Accessor for file allocator.
+ /// Intended for use only by the Routing Slip Persistence Manager
+ Persistent_File_Allocator* allocator();
+
+ /// Access root record.
+ /// Intended for use only by the Routing Slip Persistence Manager
+ Routing_Slip_Persistence_Manager & root();
+
+ public:
+ ACE_SYNCH_MUTEX lock;
+
+ private:
+ Persistent_File_Allocator allocator_;
+ Routing_Slip_Persistence_Manager root_;
+ Persistent_Storage_Block* psb_;
+ ACE_UINT64 serial_number_;
+ bool is_reloading_;
+ };
+
+ /// \brief The standard implementation of the
+ /// Event_Persistence_Strategy interface.
+ class TAO_Notify_Serv_Export Standard_Event_Persistence :
+ public Event_Persistence_Strategy
+ {
+ public :
+ /// Constructor.
+ Standard_Event_Persistence ();
+ /// Destructor.
+ virtual ~Standard_Event_Persistence ();
+ /////////////////////////////////////////////
+ // Override Event_Persistent_Strategy methods
+ // Parse arguments and initialize.
+ virtual int init(int argc, ACE_TCHAR *argv[]);
+ // Prepare for shutdown
+ virtual int fini ();
+
+ // get the current factory, creating it if necessary
+ virtual Event_Persistence_Factory * get_factory ();
+
+ private:
+ // release the current factory so a new one can be created
+ virtual void reset ();
+
+ ACE_TString filename_; // set via -file_path
+ ACE_UINT32 block_size_; // set via -block_size
+ Standard_Event_Persistence_Factory * factory_;
+ };
+}
+
+TAO_END_VERSIONED_NAMESPACE_DECL
+
+ACE_FACTORY_DECLARE (TAO_Notify_Serv, TAO_Notify_Standard_Event_Persistence)
+
+#include /**/ "ace/post.h"
+#endif /* STANDARD_EVENT_PERSISTENCE_H */
diff --git a/TAO/orbsvcs/orbsvcs/Notify/Structured/RT_StructuredProxyPushSupplier.cpp b/TAO/orbsvcs/orbsvcs/Notify/Structured/RT_StructuredProxyPushSupplier.cpp
new file mode 100644
index 00000000000..c4df69993b1
--- /dev/null
+++ b/TAO/orbsvcs/orbsvcs/Notify/Structured/RT_StructuredProxyPushSupplier.cpp
@@ -0,0 +1,81 @@
+// $Id$
+
+#include "orbsvcs/Notify/Structured/RT_StructuredProxyPushSupplier.h"
+#include "tao/debug.h"
+
+#include "tao/debug.h"
+#include "orbsvcs/Notify/Method_Request_Dispatch.h"
+
+ACE_RCSID (Notify, TAO_Notify_RT_StructuredProxyPushSupplier, "$Id$")
+
+TAO_BEGIN_VERSIONED_NAMESPACE_DECL
+
+TAO_Notify_RT_StructuredProxyPushSupplier::TAO_Notify_RT_StructuredProxyPushSupplier (void)
+{
+}
+
+TAO_Notify_RT_StructuredProxyPushSupplier::~TAO_Notify_RT_StructuredProxyPushSupplier ()
+{
+}
+
+CORBA::Object_ptr
+TAO_Notify_RT_StructuredProxyPushSupplier::activate (PortableServer::Servant servant ACE_ENV_ARG_DECL)
+{
+ CORBA::Object_var object = TAO_Notify_Proxy::activate (servant ACE_ENV_ARG_PARAMETER);
+ ACE_CHECK_RETURN (CORBA::Object::_nil ());
+
+ // Obtain our ref.
+ CORBA::Object_var obj = this->ref (ACE_ENV_SINGLE_ARG_PARAMETER);
+ ACE_CHECK_RETURN (CORBA::Object::_nil ());
+
+ this->event_forwarder_ = Event_Forwarder::StructuredProxyPushSupplier::_narrow (obj.in () ACE_ENV_ARG_PARAMETER);
+
+ return object._retn ();
+}
+
+CORBA::Object_ptr
+TAO_Notify_RT_StructuredProxyPushSupplier::activate (PortableServer::Servant ,
+ CORBA::Long ACE_ENV_ARG_DECL_NOT_USED)
+{
+ return CORBA::Object::_nil ();
+}
+
+void
+TAO_Notify_RT_StructuredProxyPushSupplier::deliver (TAO_Notify_Method_Request_Dispatch_No_Copy & request ACE_ENV_ARG_DECL)
+{
+ ACE_TRY
+ {
+ request.event()->push (this->event_forwarder_.in () ACE_ENV_ARG_PARAMETER);
+ ACE_TRY_CHECK;
+ }
+ ACE_CATCHANY
+ {
+ if (TAO_debug_level > 2)
+ {
+ ACE_PRINT_EXCEPTION (ACE_ANY_EXCEPTION, "(%P|%t) TAO_Notify_RT_StructuredProxyPushSupplier::push failed\n");
+ }
+
+ }
+ ACE_ENDTRY;
+}
+
+void
+TAO_Notify_RT_StructuredProxyPushSupplier::push_no_filtering (const TAO_Notify_Event* event ACE_ENV_ARG_DECL)
+{
+ ACE_TRY
+ {
+ event->push_no_filtering (this->event_forwarder_.in () ACE_ENV_ARG_PARAMETER);
+ ACE_TRY_CHECK;
+ }
+ ACE_CATCHANY
+ {
+ if (TAO_debug_level > 2)
+ {
+ ACE_PRINT_EXCEPTION (ACE_ANY_EXCEPTION, "(%P|%t) TAO_Notify_RT_StructuredProxyPushSupplier::push failed\n");
+ }
+
+ }
+ ACE_ENDTRY;
+}
+
+TAO_END_VERSIONED_NAMESPACE_DECL
diff --git a/TAO/orbsvcs/orbsvcs/Notify/Structured/RT_StructuredProxyPushSupplier.h b/TAO/orbsvcs/orbsvcs/Notify/Structured/RT_StructuredProxyPushSupplier.h
new file mode 100644
index 00000000000..995a4ceeb31
--- /dev/null
+++ b/TAO/orbsvcs/orbsvcs/Notify/Structured/RT_StructuredProxyPushSupplier.h
@@ -0,0 +1,63 @@
+/* -*- C++ -*- */
+/**
+ * @file RT_StructuredProxyPushSupplier.h
+ *
+ * $Id$
+ *
+ * @author Pradeep Gore <pradeep@oomworks.com>
+ *
+ *
+ */
+
+#ifndef TAO_Notify_RT_STRUCTUREDPROXYPUSHSUPPLIER_H
+#define TAO_Notify_RT_STRUCTUREDPROXYPUSHSUPPLIER_H
+#include /**/ "ace/pre.h"
+
+#include "orbsvcs/Notify/rt_notify_export.h"
+
+#if !defined (ACE_LACKS_PRAGMA_ONCE)
+# pragma once
+#endif /* ACE_LACKS_PRAGMA_ONCE */
+
+#include "orbsvcs/Notify/Structured/StructuredProxyPushSupplier.h"
+
+TAO_BEGIN_VERSIONED_NAMESPACE_DECL
+
+/**
+ * @class TAO_Notify_RT_StructuredProxyPushSupplier
+ *
+ * @brief
+ *
+ */
+class TAO_RT_Notify_Export TAO_Notify_RT_StructuredProxyPushSupplier :
+ public virtual TAO_Notify_StructuredProxyPushSupplier
+{
+public:
+ /// Constuctor
+ TAO_Notify_RT_StructuredProxyPushSupplier (void);
+
+ /// Destructor
+ ~TAO_Notify_RT_StructuredProxyPushSupplier ();
+
+ /// Activate this object and obtain the Event_Forwarder interface.
+ virtual CORBA::Object_ptr activate (PortableServer::Servant servant ACE_ENV_ARG_DECL);
+
+ /// Dummy method to prevent hidden TAO_Notify_Proxy::activate warning.
+ virtual CORBA::Object_ptr activate (PortableServer::Servant servant,
+ CORBA::Long id ACE_ENV_ARG_DECL);
+
+ /// Dispatch Event to consumer
+ void deliver (TAO_Notify_Method_Request_Dispatch_No_Copy & request ACE_ENV_ARG_DECL);
+
+ /// Dispatch Event to consumer, no filtering
+ virtual void push_no_filtering (const TAO_Notify_Event* event ACE_ENV_ARG_DECL);
+
+private:
+ /// Our ref.
+ Event_Forwarder::StructuredProxyPushSupplier_var event_forwarder_;
+};
+
+TAO_END_VERSIONED_NAMESPACE_DECL
+
+#include /**/ "ace/post.h"
+#endif /* TAO_Notify_RT_STRUCTUREDPROXYPUSHSUPPLIER_H */
diff --git a/TAO/orbsvcs/orbsvcs/Notify/Structured/StructuredEvent.cpp b/TAO/orbsvcs/orbsvcs/Notify/Structured/StructuredEvent.cpp
new file mode 100644
index 00000000000..86d312d8f4e
--- /dev/null
+++ b/TAO/orbsvcs/orbsvcs/Notify/Structured/StructuredEvent.cpp
@@ -0,0 +1,142 @@
+// $Id$
+
+#include "orbsvcs/Notify/Structured/StructuredEvent.h"
+
+ACE_RCSID(RT_Notify, TAO_Notify_StructuredEvent, "$Id$")
+
+#include "orbsvcs/Notify/PropertySeq.h"
+#include "orbsvcs/Notify/Consumer.h"
+#include "tao/debug.h"
+#include "tao/corba.h"
+
+TAO_BEGIN_VERSIONED_NAMESPACE_DECL
+
+TAO_Notify_StructuredEvent_No_Copy::TAO_Notify_StructuredEvent_No_Copy (const CosNotification::StructuredEvent &notification)
+ : notification_ (&notification), type_ (notification.header.fixed_header.event_type)
+{
+ const CosNotification::PropertySeq& prop_seq = notification.header.variable_header;
+
+ for (CORBA::ULong i = 0; i < prop_seq.length (); ++i)
+ {
+ if (ACE_OS::strcmp (prop_seq[i].name.in (), CosNotification::Priority) == 0)
+ this->priority_.set (prop_seq[i].value);
+ else if (ACE_OS::strcmp (prop_seq[i].name.in (), CosNotification::Timeout) == 0)
+ this->timeout_.set (prop_seq[i].value);
+ }
+}
+
+const TAO_Notify_EventType&
+TAO_Notify_StructuredEvent_No_Copy::type (void) const
+{
+ return this->type_;
+}
+
+TAO_Notify_StructuredEvent_No_Copy::~TAO_Notify_StructuredEvent_No_Copy ()
+{
+}
+
+void
+TAO_Notify_StructuredEvent_No_Copy::marshal (TAO_OutputCDR & cdr) const
+{
+ static const ACE_CDR::Octet STRUCTURED_CODE = MARSHAL_STRUCTURED;
+ cdr.write_octet (STRUCTURED_CODE);
+ cdr << (*this->notification_);
+}
+
+//static
+TAO_Notify_StructuredEvent *
+TAO_Notify_StructuredEvent_No_Copy::unmarshal (TAO_InputCDR & cdr)
+{
+ TAO_Notify_StructuredEvent * event = 0;
+ CosNotification::StructuredEvent body;
+ if (cdr >> body)
+ {
+ event = new TAO_Notify_StructuredEvent (body);
+ }
+ return event;
+}
+
+TAO_Notify_Event *
+TAO_Notify_StructuredEvent_No_Copy::copy (ACE_ENV_SINGLE_ARG_DECL) const
+{
+ TAO_Notify_Event * new_event;
+ ACE_NEW_THROW_EX (new_event,
+ TAO_Notify_StructuredEvent (*this->notification_),
+ CORBA::NO_MEMORY ());
+ ACE_CHECK_RETURN (0);
+ return new_event;
+}
+
+CORBA::Boolean
+TAO_Notify_StructuredEvent_No_Copy::do_match (CosNotifyFilter::Filter_ptr filter ACE_ENV_ARG_DECL) const
+{
+ if (TAO_debug_level > 0)
+ ACE_DEBUG ((LM_DEBUG, "Notify (%P|%t) - "
+ "TAO_Notify_StructuredEvent::do_match ()\n"));
+
+ return filter->match_structured (*this->notification_ ACE_ENV_ARG_PARAMETER);
+}
+
+void
+TAO_Notify_StructuredEvent_No_Copy::convert (CosNotification::StructuredEvent& notification) const
+{
+ notification = *this->notification_;
+}
+
+void
+TAO_Notify_StructuredEvent_No_Copy::push (TAO_Notify_Consumer* consumer ACE_ENV_ARG_DECL) const
+{
+ if (TAO_debug_level > 0)
+ ACE_DEBUG ((LM_DEBUG, "Notify (%P|%t) - "
+ "TAO_Notify_StructuredEvent::do_push ("
+ "CosNotifyComm::StructuredPushConsumer_ptr)\n"));
+
+ consumer->push (*this->notification_ ACE_ENV_ARG_PARAMETER);
+}
+
+void
+TAO_Notify_StructuredEvent_No_Copy::push (Event_Forwarder::StructuredProxyPushSupplier_ptr forwarder ACE_ENV_ARG_DECL) const
+{
+ forwarder->forward_structured (*this->notification_ ACE_ENV_ARG_PARAMETER);
+}
+
+void
+TAO_Notify_StructuredEvent_No_Copy::push_no_filtering (Event_Forwarder::StructuredProxyPushSupplier_ptr forwarder ACE_ENV_ARG_DECL) const
+{
+ forwarder->forward_structured_no_filtering (*this->notification_ ACE_ENV_ARG_PARAMETER);
+}
+
+void
+TAO_Notify_StructuredEvent_No_Copy::push (Event_Forwarder::ProxyPushSupplier_ptr forwarder ACE_ENV_ARG_DECL) const
+{
+ CORBA::Any any;
+
+ TAO_Notify_Event::translate (*this->notification_, any);
+
+ forwarder->forward_any (any ACE_ENV_ARG_PARAMETER);
+}
+
+void
+TAO_Notify_StructuredEvent_No_Copy::push_no_filtering (Event_Forwarder::ProxyPushSupplier_ptr forwarder ACE_ENV_ARG_DECL) const
+{
+ CORBA::Any any;
+
+ TAO_Notify_Event::translate (*this->notification_, any);
+
+ forwarder->forward_any_no_filtering (any ACE_ENV_ARG_PARAMETER);
+}
+
+/*****************************************************************************************************/
+
+TAO_Notify_StructuredEvent::TAO_Notify_StructuredEvent (const CosNotification::StructuredEvent& notification)
+ : TAO_Notify_StructuredEvent_No_Copy (notification)
+ , notification_copy (notification)
+{
+ this->notification_ = &notification_copy;
+}
+
+TAO_Notify_StructuredEvent::~TAO_Notify_StructuredEvent ()
+{
+}
+
+TAO_END_VERSIONED_NAMESPACE_DECL
diff --git a/TAO/orbsvcs/orbsvcs/Notify/Structured/StructuredEvent.h b/TAO/orbsvcs/orbsvcs/Notify/Structured/StructuredEvent.h
new file mode 100644
index 00000000000..5ed850afd93
--- /dev/null
+++ b/TAO/orbsvcs/orbsvcs/Notify/Structured/StructuredEvent.h
@@ -0,0 +1,112 @@
+/* -*- C++ -*- */
+/**
+ * @file StructuredEvent.h
+ *
+ * $Id$
+ *
+ * @author Pradeep Gore <pradeep@oomworks.com>
+ *
+ *
+ */
+#ifndef TAO_Notify_STRUCTUREDEVENT_H
+#define TAO_Notify_STRUCTUREDEVENT_H
+
+#include /**/ "ace/pre.h"
+#include "orbsvcs/Notify/notify_serv_export.h"
+
+#if !defined (ACE_LACKS_PRAGMA_ONCE)
+# pragma once
+#endif /* ACE_LACKS_PRAGMA_ONCE */
+
+#include "orbsvcs/Notify/Event.h"
+#include "orbsvcs/Notify/EventType.h"
+#include "orbsvcs/CosNotificationC.h"
+
+TAO_BEGIN_VERSIONED_NAMESPACE_DECL
+
+class TAO_Notify_StructuredEvent;
+
+/**
+ * @class TAO_Notify_StructuredEvent_No_Copy
+ *
+ * @brief StructuredEvent implementation.
+ *
+ */
+
+class TAO_Notify_Serv_Export TAO_Notify_StructuredEvent_No_Copy : public TAO_Notify_Event
+{
+public:
+ /// Constuctor
+ TAO_Notify_StructuredEvent_No_Copy (const CosNotification::StructuredEvent& notification);
+
+ /// Destructor
+ virtual ~TAO_Notify_StructuredEvent_No_Copy ();
+
+ /// marshal this event into a CDR buffer (for persistence)
+ virtual void marshal (TAO_OutputCDR & cdr) const;
+
+ CORBA::Boolean do_match (CosNotifyFilter::Filter_ptr filter ACE_ENV_ARG_DECL) const;
+
+ /// Convert to CosNotification::Structured type
+ virtual void convert (CosNotification::StructuredEvent& notification) const;
+
+ /// Get the event type.
+ virtual const TAO_Notify_EventType& type (void) const;
+
+ /// Push event to consumer
+ virtual void push (TAO_Notify_Consumer* consumer ACE_ENV_ARG_DECL) const;
+
+ /// Push event to the Event_Forwarder interface
+ virtual void push (Event_Forwarder::StructuredProxyPushSupplier_ptr forwarder ACE_ENV_ARG_DECL) const;
+
+ /// Push event to the Event_Forwarder interface
+ virtual void push_no_filtering (Event_Forwarder::StructuredProxyPushSupplier_ptr forwarder ACE_ENV_ARG_DECL) const;
+
+ /// Push event to the Event_Forwarder interface
+ virtual void push (Event_Forwarder::ProxyPushSupplier_ptr forwarder ACE_ENV_ARG_DECL) const;
+
+ /// Push event to the Event_Forwarder interface
+ virtual void push_no_filtering (Event_Forwarder::ProxyPushSupplier_ptr forwarder ACE_ENV_ARG_DECL) const;
+
+ /// unmarshal this event from a CDR buffer (for persistence)
+ /// \return the new event, or NULL if this is the wrong type of event.
+ static TAO_Notify_StructuredEvent * unmarshal (TAO_InputCDR & cdr);
+
+protected:
+ /// returns a copy of this event allocated on the heap
+ virtual TAO_Notify_Event * copy (ACE_ENV_SINGLE_ARG_DECL) const;
+
+ /// Structured Event
+ const CosNotification::StructuredEvent* notification_;
+
+ /// Our type.
+ const TAO_Notify_EventType type_;
+};
+
+/*****************************************************************************/
+
+/**
+ * @class TAO_Notify_StructuredEvent
+ *
+ * @brief StructuredEvent implementation.
+ *
+ */
+class TAO_Notify_Serv_Export TAO_Notify_StructuredEvent : public TAO_Notify_StructuredEvent_No_Copy
+{
+public:
+ /// Constuctor
+ TAO_Notify_StructuredEvent (const CosNotification::StructuredEvent& notification);
+
+ /// Destructor
+ virtual ~TAO_Notify_StructuredEvent ();
+
+
+protected:
+ /// Copy of the Event.
+ CosNotification::StructuredEvent notification_copy;
+};
+
+TAO_END_VERSIONED_NAMESPACE_DECL
+
+#include /**/ "ace/post.h"
+#endif /* TAO_Notify_STRUCTUREDEVENT_H */
diff --git a/TAO/orbsvcs/orbsvcs/Notify/Structured/StructuredProxyPushConsumer.cpp b/TAO/orbsvcs/orbsvcs/Notify/Structured/StructuredProxyPushConsumer.cpp
new file mode 100644
index 00000000000..d79e907a741
--- /dev/null
+++ b/TAO/orbsvcs/orbsvcs/Notify/Structured/StructuredProxyPushConsumer.cpp
@@ -0,0 +1,135 @@
+// $Id$
+
+#include "orbsvcs/Notify/Structured/StructuredProxyPushConsumer.h"
+
+ACE_RCSID(RT_Notify, TAO_Notify_StructuredProxyPushConsumer, "$Id$")
+
+#include "ace/Bound_Ptr.h"
+#include "ace/Auto_Ptr.h"
+#include "tao/debug.h"
+#include "orbsvcs/Notify/Structured/StructuredPushSupplier.h"
+#include "orbsvcs/Notify/Structured/StructuredEvent.h"
+#include "orbsvcs/Notify/AdminProperties.h"
+#include "orbsvcs/Notify/Properties.h"
+
+TAO_BEGIN_VERSIONED_NAMESPACE_DECL
+
+TAO_Notify_StructuredProxyPushConsumer::TAO_Notify_StructuredProxyPushConsumer (void)
+{
+}
+
+TAO_Notify_StructuredProxyPushConsumer::~TAO_Notify_StructuredProxyPushConsumer ()
+{
+}
+
+void
+TAO_Notify_StructuredProxyPushConsumer::release (void)
+{
+ delete this;
+ //@@ inform factory
+}
+
+CosNotifyChannelAdmin::ProxyType
+TAO_Notify_StructuredProxyPushConsumer::MyType (ACE_ENV_SINGLE_ARG_DECL_NOT_USED)
+ ACE_THROW_SPEC ((
+ CORBA::SystemException
+ ))
+{
+ return CosNotifyChannelAdmin::PUSH_STRUCTURED;
+}
+
+void
+TAO_Notify_StructuredProxyPushConsumer::connect_structured_push_supplier (CosNotifyComm::StructuredPushSupplier_ptr push_supplier ACE_ENV_ARG_DECL)
+ ACE_THROW_SPEC ((
+ CORBA::SystemException
+ , CosEventChannelAdmin::AlreadyConnected
+ ))
+{
+ // Convert Supplier to Base Type
+ TAO_Notify_StructuredPushSupplier * supplier;
+ ACE_NEW_THROW_EX (supplier,
+ TAO_Notify_StructuredPushSupplier (this),
+ CORBA::NO_MEMORY ());
+
+ supplier->init (push_supplier ACE_ENV_ARG_PARAMETER);
+ ACE_CHECK;
+ this->connect (supplier ACE_ENV_ARG_PARAMETER);
+ ACE_CHECK;
+ this->self_change (ACE_ENV_SINGLE_ARG_PARAMETER);
+}
+
+void
+TAO_Notify_StructuredProxyPushConsumer::push_structured_event (const CosNotification::StructuredEvent & notification ACE_ENV_ARG_DECL)
+ ACE_THROW_SPEC ((
+ CORBA::SystemException
+ , CosEventComm::Disconnected
+ ))
+{
+ // Check if we should proceed at all.
+ if (this->admin_properties().reject_new_events () == 1
+ && this->admin_properties().queue_full ())
+ ACE_THROW (CORBA::IMP_LIMIT ());
+
+ if (this->is_connected () == 0)
+ {
+ ACE_THROW (CosEventComm::Disconnected ());
+ }
+
+ TAO_Notify_StructuredEvent_No_Copy event (notification);
+ this->push_i (&event ACE_ENV_ARG_PARAMETER);
+}
+
+void
+TAO_Notify_StructuredProxyPushConsumer::disconnect_structured_push_consumer (ACE_ENV_SINGLE_ARG_DECL)
+ ACE_THROW_SPEC ((
+ CORBA::SystemException
+ ))
+{
+ TAO_Notify_StructuredProxyPushConsumer::Ptr guard( this );
+ this->destroy (ACE_ENV_SINGLE_ARG_PARAMETER);
+ ACE_CHECK;
+ this->self_change (ACE_ENV_SINGLE_ARG_PARAMETER);
+}
+
+const char *
+TAO_Notify_StructuredProxyPushConsumer::get_proxy_type_name (void) const
+{
+ return "structured_proxy_push_consumer";
+}
+
+void
+TAO_Notify_StructuredProxyPushConsumer::load_attrs (const TAO_Notify::NVPList& attrs)
+{
+ SuperClass::load_attrs(attrs);
+ ACE_CString ior;
+ if (attrs.load("PeerIOR", ior))
+ {
+ CORBA::ORB_var orb = TAO_Notify_PROPERTIES::instance()->orb();
+ ACE_DECLARE_NEW_CORBA_ENV;
+ ACE_TRY
+ {
+ ACE_TRY_CHECK;
+ CosNotifyComm::StructuredPushSupplier_var ps = CosNotifyComm::StructuredPushSupplier::_nil();
+ if ( ior.length() > 0 )
+ {
+ CORBA::Object_var obj = orb->string_to_object(ior.c_str() ACE_ENV_ARG_PARAMETER);
+ ACE_TRY_CHECK;
+ ps = CosNotifyComm::StructuredPushSupplier::_unchecked_narrow(obj.in() ACE_ENV_ARG_PARAMETER);
+ ACE_TRY_CHECK;
+ }
+ // minor hack: suppress generating subscription updates during reload.
+ bool save_updates = this->updates_off_;
+ this->updates_off_ = true;
+ this->connect_structured_push_supplier(ps.in() ACE_ENV_ARG_PARAMETER);
+ ACE_TRY_CHECK;
+ this->updates_off_ = save_updates;
+ }
+ ACE_CATCHANY
+ {
+ // if we can't reconnect to peer, tough...
+ }
+ ACE_ENDTRY;
+ }
+}
+
+TAO_END_VERSIONED_NAMESPACE_DECL
diff --git a/TAO/orbsvcs/orbsvcs/Notify/Structured/StructuredProxyPushConsumer.h b/TAO/orbsvcs/orbsvcs/Notify/Structured/StructuredProxyPushConsumer.h
new file mode 100644
index 00000000000..82ec83de086
--- /dev/null
+++ b/TAO/orbsvcs/orbsvcs/Notify/Structured/StructuredProxyPushConsumer.h
@@ -0,0 +1,105 @@
+/* -*- C++ -*- */
+/**
+ * @file StructuredProxyPushConsumer.h
+ *
+ * $Id$
+ *
+ * @author Pradeep Gore <pradeep@oomworks.com>
+ *
+ *
+ */
+
+#ifndef TAO_Notify_STRUCTUREDPROXYPUSHCONSUMER_H
+#define TAO_Notify_STRUCTUREDPROXYPUSHCONSUMER_H
+
+#include /**/ "ace/pre.h"
+
+#include "orbsvcs/Notify/notify_serv_export.h"
+
+#if !defined (ACE_LACKS_PRAGMA_ONCE)
+# pragma once
+#endif /* ACE_LACKS_PRAGMA_ONCE */
+
+#include "orbsvcs/CosNotifyChannelAdminS.h"
+
+#include "orbsvcs/Notify/ProxyConsumer_T.h"
+
+#if defined(_MSC_VER)
+#pragma warning(push)
+#pragma warning(disable:4250)
+#endif /* _MSC_VER */
+
+TAO_BEGIN_VERSIONED_NAMESPACE_DECL
+
+/**
+ * @class TAO_Notify_StructuredProxyPushConsumer
+ *
+ * @brief CosNotifyChannelAdmin::StructuredProxyPushConsumer implementation.
+ *
+ */
+class TAO_Notify_Serv_Export TAO_Notify_StructuredProxyPushConsumer
+ : public virtual TAO_Notify_ProxyConsumer_T <POA_CosNotifyChannelAdmin::StructuredProxyPushConsumer>
+{
+ typedef TAO_Notify_ProxyConsumer_T <POA_CosNotifyChannelAdmin::StructuredProxyPushConsumer> SuperClass;
+ friend class TAO_Notify_Builder;
+
+public:
+ /// Constuctor
+ TAO_Notify_StructuredProxyPushConsumer (void);
+
+ /// Destructor
+ virtual ~TAO_Notify_StructuredProxyPushConsumer ();
+
+
+ virtual void load_attrs (const TAO_Notify::NVPList& attrs);
+
+protected:
+
+ // = interface methods
+ virtual CosNotifyChannelAdmin::ProxyType MyType (ACE_ENV_SINGLE_ARG_DECL)
+ ACE_THROW_SPEC ((
+ CORBA::SystemException
+ ));
+
+ virtual void connect_structured_push_supplier (
+ CosNotifyComm::StructuredPushSupplier_ptr push_supplier
+ ACE_ENV_ARG_DECL
+ )
+ ACE_THROW_SPEC ((
+ CORBA::SystemException,
+ CosEventChannelAdmin::AlreadyConnected
+ ));
+
+ virtual void push_structured_event (
+ const CosNotification::StructuredEvent & notification
+ ACE_ENV_ARG_DECL
+ )
+ ACE_THROW_SPEC ((
+ CORBA::SystemException,
+ CosEventComm::Disconnected
+ ));
+
+ virtual void disconnect_structured_push_consumer (
+ ACE_ENV_SINGLE_ARG_DECL
+ )
+ ACE_THROW_SPEC ((
+ CORBA::SystemException
+ ));
+
+ virtual const char * get_proxy_type_name (void) const;
+
+private:
+
+ /// Release
+ virtual void release (void);
+};
+
+TAO_END_VERSIONED_NAMESPACE_DECL
+
+#if defined(_MSC_VER)
+#pragma warning(pop)
+#endif /* _MSC_VER */
+
+#include /**/ "ace/post.h"
+
+#endif /* TAO_Notify_STRUCTUREDPROXYPUSHCONSUMER_H */
diff --git a/TAO/orbsvcs/orbsvcs/Notify/Structured/StructuredProxyPushSupplier.cpp b/TAO/orbsvcs/orbsvcs/Notify/Structured/StructuredProxyPushSupplier.cpp
new file mode 100644
index 00000000000..10e753f3437
--- /dev/null
+++ b/TAO/orbsvcs/orbsvcs/Notify/Structured/StructuredProxyPushSupplier.cpp
@@ -0,0 +1,111 @@
+// $Id$
+
+#include "orbsvcs/Notify/Structured/StructuredProxyPushSupplier.h"
+
+#include "tao/PortableServer/Servant_Base.h"
+#include "tao/debug.h"
+
+#include "orbsvcs/Notify/Structured/StructuredPushConsumer.h"
+#include "orbsvcs/Notify/Properties.h"
+
+
+ACE_RCSID(RT_Notify, TAO_Notify_StructuredProxyPushSupplier, "$Id$")
+
+TAO_BEGIN_VERSIONED_NAMESPACE_DECL
+
+TAO_Notify_StructuredProxyPushSupplier::TAO_Notify_StructuredProxyPushSupplier (void)
+{
+}
+
+TAO_Notify_StructuredProxyPushSupplier::~TAO_Notify_StructuredProxyPushSupplier ()
+{
+}
+
+void
+TAO_Notify_StructuredProxyPushSupplier::release (void)
+{
+ delete this;
+ //@@ inform factory
+}
+
+CosNotifyChannelAdmin::ProxyType
+TAO_Notify_StructuredProxyPushSupplier::MyType (ACE_ENV_SINGLE_ARG_DECL_NOT_USED)
+ ACE_THROW_SPEC ((
+ CORBA::SystemException
+ ))
+{
+ return CosNotifyChannelAdmin::PUSH_STRUCTURED;
+}
+
+void
+TAO_Notify_StructuredProxyPushSupplier::connect_structured_push_consumer (CosNotifyComm::StructuredPushConsumer_ptr push_consumer ACE_ENV_ARG_DECL)
+ ACE_THROW_SPEC ((
+ CORBA::SystemException
+ , CosEventChannelAdmin::AlreadyConnected
+ , CosEventChannelAdmin::TypeError
+ ))
+{
+ // Convert Consumer to Base Type
+ TAO_Notify_StructuredPushConsumer* consumer;
+ ACE_NEW_THROW_EX (consumer,
+ TAO_Notify_StructuredPushConsumer (this),
+ CORBA::NO_MEMORY ());
+
+ consumer->init (push_consumer ACE_ENV_ARG_PARAMETER);
+ ACE_CHECK;
+
+ this->connect (consumer ACE_ENV_ARG_PARAMETER);
+ ACE_CHECK;
+ this->self_change (ACE_ENV_SINGLE_ARG_PARAMETER);
+}
+
+void
+TAO_Notify_StructuredProxyPushSupplier::disconnect_structured_push_supplier (ACE_ENV_SINGLE_ARG_DECL)
+ ACE_THROW_SPEC ((
+ CORBA::SystemException
+ ))
+
+{
+ TAO_Notify_StructuredProxyPushSupplier::Ptr guard( this );
+ this->destroy (ACE_ENV_SINGLE_ARG_PARAMETER);
+ ACE_CHECK;
+ this->self_change (ACE_ENV_SINGLE_ARG_PARAMETER);
+}
+
+const char *
+TAO_Notify_StructuredProxyPushSupplier::get_proxy_type_name (void) const
+{
+ return "structured_proxy_push_supplier";
+}
+
+void
+TAO_Notify_StructuredProxyPushSupplier::load_attrs (const TAO_Notify::NVPList& attrs)
+{
+ SuperClass::load_attrs(attrs);
+ ACE_CString ior;
+ if (attrs.load("PeerIOR", ior))
+ {
+ CORBA::ORB_var orb = TAO_Notify_PROPERTIES::instance()->orb();
+ ACE_DECLARE_NEW_CORBA_ENV;
+ ACE_TRY
+ {
+ CosNotifyComm::StructuredPushConsumer_var pc = CosNotifyComm::StructuredPushConsumer::_nil();
+ if (ior.length() > 0)
+ {
+ CORBA::Object_var obj = orb->string_to_object(ior.c_str() ACE_ENV_ARG_PARAMETER);
+ ACE_TRY_CHECK;
+ pc = CosNotifyComm::StructuredPushConsumer::_unchecked_narrow(obj.in() ACE_ENV_ARG_PARAMETER);
+ ACE_TRY_CHECK;
+ }
+ this->connect_structured_push_consumer(pc.in() ACE_ENV_ARG_PARAMETER);
+ ACE_TRY_CHECK;
+ }
+ ACE_CATCHANY
+ {
+ // if we can't connect... tough
+ }
+ ACE_ENDTRY;
+ }
+}
+
+TAO_END_VERSIONED_NAMESPACE_DECL
diff --git a/TAO/orbsvcs/orbsvcs/Notify/Structured/StructuredProxyPushSupplier.h b/TAO/orbsvcs/orbsvcs/Notify/Structured/StructuredProxyPushSupplier.h
new file mode 100644
index 00000000000..b3a3526dbe9
--- /dev/null
+++ b/TAO/orbsvcs/orbsvcs/Notify/Structured/StructuredProxyPushSupplier.h
@@ -0,0 +1,103 @@
+/* -*- C++ -*- */
+/**
+ * @file StructuredProxyPushSupplier.h
+ *
+ * $Id$
+ *
+ * @author Pradeep Gore <pradeep@oomworks.com>
+ *
+ *
+ */
+
+#ifndef TAO_Notify_STRUCTUREDPROXYPUSHSUPPLIER_H
+#define TAO_Notify_STRUCTUREDPROXYPUSHSUPPLIER_H
+
+#include /**/ "ace/pre.h"
+
+#include "orbsvcs/Notify/notify_serv_export.h"
+
+#if !defined (ACE_LACKS_PRAGMA_ONCE)
+# pragma once
+#endif /* ACE_LACKS_PRAGMA_ONCE */
+
+#include "orbsvcs/CosNotifyChannelAdminS.h"
+#include "orbsvcs/Event_ForwarderS.h"
+
+#include "orbsvcs/Notify/ProxySupplier_T.h"
+
+#if defined(_MSC_VER)
+#pragma warning(push)
+#pragma warning(disable:4250)
+#endif /* _MSC_VER */
+
+TAO_BEGIN_VERSIONED_NAMESPACE_DECL
+
+#if defined ACE_HAS_EXPLICIT_TEMPLATE_INSTANTIATION_EXPORT
+template class TAO_Notify_Serv_Export
+TAO_Notify_ProxySupplier_T<POA_Event_Forwarder::StructuredProxyPushSupplier>;
+#endif /* ACE_HAS_EXPLICIT_TEMPLATE_INSTANTIATION_EXPORT */
+
+/**
+ * @class TAO_Notify_StructuredProxyPushSupplier
+ *
+ * @brief Implements the CosNotifyChannelAdmin::StructuredProxyPushSupplier methods.
+ *
+ *
+ */
+class TAO_Notify_Serv_Export TAO_Notify_StructuredProxyPushSupplier
+ : public virtual TAO_Notify_ProxySupplier_T <POA_Event_Forwarder::StructuredProxyPushSupplier>
+{
+ typedef TAO_Notify_ProxySupplier_T <POA_Event_Forwarder::StructuredProxyPushSupplier> SuperClass;
+ friend class TAO_Notify_Builder;
+
+public:
+ /// Constuctor
+ TAO_Notify_StructuredProxyPushSupplier (void);
+
+ /// Destructor
+ virtual ~TAO_Notify_StructuredProxyPushSupplier ();
+
+
+ virtual void load_attrs (const TAO_Notify::NVPList& attrs);
+
+ /// = Servant methods
+ // = interface methods
+ virtual CosNotifyChannelAdmin::ProxyType MyType (ACE_ENV_SINGLE_ARG_DECL)
+ ACE_THROW_SPEC ((
+ CORBA::SystemException
+ ));
+
+ virtual void connect_structured_push_consumer (
+ CosNotifyComm::StructuredPushConsumer_ptr push_consumer
+ ACE_ENV_ARG_DECL
+ )
+ ACE_THROW_SPEC ((
+ CORBA::SystemException,
+ CosEventChannelAdmin::AlreadyConnected,
+ CosEventChannelAdmin::TypeError
+ ));
+
+ virtual void disconnect_structured_push_supplier (
+ ACE_ENV_SINGLE_ARG_DECL
+ )
+ ACE_THROW_SPEC ((
+ CORBA::SystemException
+ ));
+
+ virtual const char * get_proxy_type_name (void) const;
+
+private:
+
+ /// Release
+ virtual void release (void);
+};
+
+TAO_END_VERSIONED_NAMESPACE_DECL
+
+#if defined(_MSC_VER)
+#pragma warning(pop)
+#endif /* _MSC_VER */
+
+#include /**/ "ace/post.h"
+
+#endif /* TAO_Notify_STRUCTUREDPROXYPUSHSUPPLIER_H */
diff --git a/TAO/orbsvcs/orbsvcs/Notify/Structured/StructuredPushConsumer.cpp b/TAO/orbsvcs/orbsvcs/Notify/Structured/StructuredPushConsumer.cpp
new file mode 100644
index 00000000000..feb1b56c29c
--- /dev/null
+++ b/TAO/orbsvcs/orbsvcs/Notify/Structured/StructuredPushConsumer.cpp
@@ -0,0 +1,101 @@
+// $Id$
+#include "orbsvcs/Notify/Structured/StructuredPushConsumer.h"
+
+ACE_RCSID(RT_Notify, TAO_Notify_StructuredPushConsumer, "$Id$")
+
+#include "orbsvcs/Notify/Properties.h"
+#include "orbsvcs/Notify/Event.h"
+#include "ace/Bound_Ptr.h"
+
+TAO_BEGIN_VERSIONED_NAMESPACE_DECL
+
+TAO_Notify_StructuredPushConsumer::TAO_Notify_StructuredPushConsumer (TAO_Notify_ProxySupplier* proxy)
+ :TAO_Notify_Consumer (proxy)
+{
+}
+
+TAO_Notify_StructuredPushConsumer::~TAO_Notify_StructuredPushConsumer ()
+{
+}
+
+void
+TAO_Notify_StructuredPushConsumer::init (CosNotifyComm::StructuredPushConsumer_ptr push_consumer ACE_ENV_ARG_DECL)
+{
+ // Initialize only once
+ ACE_ASSERT( CORBA::is_nil (this->push_consumer_.in()) );
+
+ if (CORBA::is_nil (push_consumer))
+ {
+ ACE_THROW (CORBA::BAD_PARAM());
+ }
+
+ this->push_consumer_ = CosNotifyComm::StructuredPushConsumer::_duplicate (push_consumer);
+
+ this->publish_ = CosNotifyComm::NotifyPublish::_duplicate (push_consumer);
+
+}
+
+void
+TAO_Notify_StructuredPushConsumer::release (void)
+{
+ delete this;
+ //@@ inform factory
+}
+
+void
+TAO_Notify_StructuredPushConsumer::push (const CORBA::Any& event ACE_ENV_ARG_DECL)
+{
+ CosNotification::StructuredEvent notification;
+
+ TAO_Notify_Event::translate (event, notification);
+
+ this->push_consumer_->push_structured_event (notification ACE_ENV_ARG_PARAMETER);
+}
+
+void
+TAO_Notify_StructuredPushConsumer::push (const CosNotification::StructuredEvent& event ACE_ENV_ARG_DECL)
+{
+ this->push_consumer_->push_structured_event (event ACE_ENV_ARG_PARAMETER);
+}
+
+/// Push a batch of events to this consumer.
+void
+TAO_Notify_StructuredPushConsumer::push (const CosNotification::EventBatch& event ACE_ENV_ARG_DECL_NOT_USED)
+{
+ ACE_ASSERT(false);
+ ACE_UNUSED_ARG (event);
+ // TODO exception?
+}
+
+void
+TAO_Notify_StructuredPushConsumer::reconnect_from_consumer (TAO_Notify_Consumer* old_consumer
+ ACE_ENV_ARG_DECL)
+{
+ TAO_Notify_StructuredPushConsumer* tmp = dynamic_cast<TAO_Notify_StructuredPushConsumer *> (old_consumer);
+ ACE_ASSERT(tmp != 0);
+ this->init(tmp->push_consumer_.in() ACE_ENV_ARG_PARAMETER);
+ ACE_CHECK;
+ this->schedule_timer(false);
+}
+
+ACE_CString
+TAO_Notify_StructuredPushConsumer::get_ior (void) const
+{
+ ACE_CString result;
+ CORBA::ORB_var orb = TAO_Notify_PROPERTIES::instance()->orb();
+ ACE_DECLARE_NEW_CORBA_ENV;
+ ACE_TRY
+ {
+ CORBA::String_var ior = orb->object_to_string(this->push_consumer_.in() ACE_ENV_ARG_PARAMETER);
+ ACE_TRY_CHECK;
+ result = static_cast<const char*> (ior.in ());
+ }
+ ACE_CATCHANY
+ {
+ result.fast_clear();
+ }
+ ACE_ENDTRY;
+ return result;
+}
+
+TAO_END_VERSIONED_NAMESPACE_DECL
diff --git a/TAO/orbsvcs/orbsvcs/Notify/Structured/StructuredPushConsumer.h b/TAO/orbsvcs/orbsvcs/Notify/Structured/StructuredPushConsumer.h
new file mode 100644
index 00000000000..9b9d603d383
--- /dev/null
+++ b/TAO/orbsvcs/orbsvcs/Notify/Structured/StructuredPushConsumer.h
@@ -0,0 +1,81 @@
+/* -*- C++ -*- */
+/**
+ * @file StructuredPushConsumer.h
+ *
+ * $Id$
+ *
+ * @author Pradeep Gore <pradeep@oomworks.com>
+ *
+ *
+ */
+
+#ifndef TAO_Notify_STRUCTUREDPUSHCONSUMER_H
+#define TAO_Notify_STRUCTUREDPUSHCONSUMER_H
+#include /**/ "ace/pre.h"
+
+#include "orbsvcs/Notify/notify_serv_export.h"
+
+#if !defined (ACE_LACKS_PRAGMA_ONCE)
+# pragma once
+#endif /* ACE_LACKS_PRAGMA_ONCE */
+
+#include "orbsvcs/CosNotifyCommC.h"
+#include "orbsvcs/Notify/Consumer.h"
+
+TAO_BEGIN_VERSIONED_NAMESPACE_DECL
+
+class TAO_Notify_ProxySupplier;
+
+/**
+ * @class TAO_Notify_StructuredPushConsumer
+ *
+ * @brief Wrapper for the StructuredPushConsumer that connect to the EventChannel.
+ *
+ */
+class TAO_Notify_Serv_Export TAO_Notify_StructuredPushConsumer : public TAO_Notify_Consumer
+{
+public:
+ /// Constuctor
+ TAO_Notify_StructuredPushConsumer (TAO_Notify_ProxySupplier* proxy);
+
+ /// Init the Consumer
+ void init (CosNotifyComm::StructuredPushConsumer_ptr push_consumer ACE_ENV_ARG_DECL);
+
+ /// Destructor
+ virtual ~TAO_Notify_StructuredPushConsumer ();
+
+ /// Push <event> to this consumer.
+// virtual void push_i (const TAO_Notify_Event* event ACE_ENV_ARG_DECL);
+
+ /// Push <event> to this consumer.
+ virtual void push (const CORBA::Any& event ACE_ENV_ARG_DECL);
+
+ /// Push <event> to this consumer.
+ virtual void push (const CosNotification::StructuredEvent& event ACE_ENV_ARG_DECL);
+
+ /// Push a batch of events to this consumer.
+ virtual void push (const CosNotification::EventBatch& event ACE_ENV_ARG_DECL);
+
+ /// Retrieve the ior of this peer
+ virtual ACE_CString get_ior (void) const;
+
+ /// on reconnect we need to move events from the old consumer
+ /// to the new one
+ virtual void reconnect_from_consumer (
+ TAO_Notify_Consumer* old_consumer
+ ACE_ENV_ARG_DECL);
+
+
+protected:
+ /// The Consumer
+ CosNotifyComm::StructuredPushConsumer_var push_consumer_;
+
+private:
+ /// Release
+ virtual void release (void);
+};
+
+TAO_END_VERSIONED_NAMESPACE_DECL
+
+#include /**/ "ace/post.h"
+#endif /* TAO_Notify_STRUCTUREDPUSHCONSUMER_H */
diff --git a/TAO/orbsvcs/orbsvcs/Notify/Structured/StructuredPushSupplier.cpp b/TAO/orbsvcs/orbsvcs/Notify/Structured/StructuredPushSupplier.cpp
new file mode 100644
index 00000000000..69e28687a34
--- /dev/null
+++ b/TAO/orbsvcs/orbsvcs/Notify/Structured/StructuredPushSupplier.cpp
@@ -0,0 +1,55 @@
+// $Id$
+
+#include "orbsvcs/Notify/Structured/StructuredPushSupplier.h"
+
+ACE_RCSID(RT_Notify, TAO_Notify_StructuredPushSupplier, "$Id$")
+#include "orbsvcs/Notify/Properties.h"
+
+TAO_BEGIN_VERSIONED_NAMESPACE_DECL
+
+TAO_Notify_StructuredPushSupplier::TAO_Notify_StructuredPushSupplier (TAO_Notify_ProxyConsumer* proxy)
+ :TAO_Notify_Supplier (proxy)
+{
+}
+
+TAO_Notify_StructuredPushSupplier::~TAO_Notify_StructuredPushSupplier ()
+{
+}
+
+void
+TAO_Notify_StructuredPushSupplier::init (CosNotifyComm::StructuredPushSupplier_ptr push_supplier ACE_ENV_ARG_DECL_NOT_USED)
+{
+ // TODO: verify single init call
+ // push_supplier is optional
+ this->push_supplier_ = CosNotifyComm::StructuredPushSupplier::_duplicate (push_supplier);
+ this->subscribe_ = CosNotifyComm::NotifySubscribe::_duplicate (push_supplier);
+}
+
+void
+TAO_Notify_StructuredPushSupplier::release (void)
+{
+ delete this;
+ //@@ inform factory
+}
+
+ACE_CString
+TAO_Notify_StructuredPushSupplier::get_ior (void) const
+{
+ ACE_CString result;
+ CORBA::ORB_var orb = TAO_Notify_PROPERTIES::instance()->orb();
+ ACE_DECLARE_NEW_CORBA_ENV;
+ ACE_TRY
+ {
+ CORBA::String_var ior = orb->object_to_string(this->push_supplier_.in() ACE_ENV_ARG_PARAMETER);
+ ACE_TRY_CHECK;
+ result = static_cast<const char*> (ior.in ());
+ }
+ ACE_CATCHANY
+ {
+ result.fast_clear();
+ }
+ ACE_ENDTRY;
+ return result;
+}
+
+TAO_END_VERSIONED_NAMESPACE_DECL
diff --git a/TAO/orbsvcs/orbsvcs/Notify/Structured/StructuredPushSupplier.h b/TAO/orbsvcs/orbsvcs/Notify/Structured/StructuredPushSupplier.h
new file mode 100644
index 00000000000..b123bdb35d7
--- /dev/null
+++ b/TAO/orbsvcs/orbsvcs/Notify/Structured/StructuredPushSupplier.h
@@ -0,0 +1,62 @@
+/* -*- C++ -*- */
+/**
+ * @file StructuredPushSupplier.h
+ *
+ * $Id$
+ *
+ * @author Pradeep Gore <pradeep@oomworks.com>
+ *
+ *
+ */
+
+#ifndef TAO_Notify_STRUCTUREDPUSHSUPPLIER_H
+#define TAO_Notify_STRUCTUREDPUSHSUPPLIER_H
+#include /**/ "ace/pre.h"
+
+#include "orbsvcs/Notify/notify_serv_export.h"
+
+#if !defined (ACE_LACKS_PRAGMA_ONCE)
+# pragma once
+#endif /* ACE_LACKS_PRAGMA_ONCE */
+
+#include "orbsvcs/CosNotifyCommC.h"
+#include "orbsvcs/Notify/Supplier.h"
+
+TAO_BEGIN_VERSIONED_NAMESPACE_DECL
+
+class TAO_Notify_ProxyConsumer;
+
+/**
+ * @class TAO_Notify_StructuredPushSupplier
+ *
+ * @brief Wrapper for the StructuredPushSupplier that connect to the EventChannel.
+ *
+ */
+class TAO_Notify_Serv_Export TAO_Notify_StructuredPushSupplier : public TAO_Notify_Supplier
+{
+public:
+ /// Constuctor
+ TAO_Notify_StructuredPushSupplier (TAO_Notify_ProxyConsumer* proxy);
+
+ /// Destructor
+ virtual ~TAO_Notify_StructuredPushSupplier ();
+
+ /// Init
+ void init (CosNotifyComm::StructuredPushSupplier_ptr push_supplier ACE_ENV_ARG_DECL);
+
+ /// Retrieve the ior of this peer
+ virtual ACE_CString get_ior (void) const;
+
+protected:
+ /// The Supplier
+ CosNotifyComm::StructuredPushSupplier_var push_supplier_;
+
+private:
+ /// Release
+ virtual void release (void);
+};
+
+TAO_END_VERSIONED_NAMESPACE_DECL
+
+#include /**/ "ace/post.h"
+#endif /* TAO_Notify_STRUCTUREDPUSHSUPPLIER_H */
diff --git a/TAO/orbsvcs/orbsvcs/Notify/Subscription_Change_Worker.cpp b/TAO/orbsvcs/orbsvcs/Notify/Subscription_Change_Worker.cpp
new file mode 100644
index 00000000000..70e0e846b04
--- /dev/null
+++ b/TAO/orbsvcs/orbsvcs/Notify/Subscription_Change_Worker.cpp
@@ -0,0 +1,29 @@
+// $Id$
+
+#include "orbsvcs/Notify/Subscription_Change_Worker.h"
+
+#include "orbsvcs/Notify/Proxy.h"
+
+ACE_RCSID(Notify, TAO_Subscription_Change_Worker, "$Id$")
+
+
+TAO_BEGIN_VERSIONED_NAMESPACE_DECL
+
+TAO_Notify_Subscription_Change_Worker::TAO_Notify_Subscription_Change_Worker (
+ const CosNotification::EventTypeSeq & added,
+ const CosNotification::EventTypeSeq & removed)
+ : added_ (added), removed_ (removed)
+{
+}
+
+TAO_Notify_Subscription_Change_Worker::~TAO_Notify_Subscription_Change_Worker ()
+{
+}
+
+void
+TAO_Notify_Subscription_Change_Worker::work (TAO_Notify_Proxy* proxy ACE_ENV_ARG_DECL)
+{
+ proxy->admin_types_changed (this->added_, this->removed_ ACE_ENV_ARG_PARAMETER);
+}
+
+TAO_END_VERSIONED_NAMESPACE_DECL
diff --git a/TAO/orbsvcs/orbsvcs/Notify/Subscription_Change_Worker.h b/TAO/orbsvcs/orbsvcs/Notify/Subscription_Change_Worker.h
new file mode 100644
index 00000000000..dc17f2a64b6
--- /dev/null
+++ b/TAO/orbsvcs/orbsvcs/Notify/Subscription_Change_Worker.h
@@ -0,0 +1,54 @@
+// -*- C++ -*-
+
+/**
+ * @file Subscription_Change_Worker.h
+ *
+ * $Id$
+ *
+ * @author Pradeep Gore <pradeep@oomworks.com>
+ */
+
+#ifndef TAO_SUBSCRIPTION_CHANGE_WORKER_H
+#define TAO_SUBSCRIPTION_CHANGE_WORKER_H
+#include /**/ "ace/pre.h"
+
+#include "orbsvcs/Notify/notify_serv_export.h"
+
+#if !defined (ACE_LACKS_PRAGMA_ONCE)
+# pragma once
+#endif /* ACE_LACKS_PRAGMA_ONCE */
+
+#include "orbsvcs/CosNotificationC.h"
+#include "orbsvcs/ESF/ESF_Worker.h"
+
+TAO_BEGIN_VERSIONED_NAMESPACE_DECL
+
+class TAO_Notify_Proxy;
+
+/**
+ * @class TAO_Subscription_Change_Worker
+ *
+ * @brief
+ *
+ */
+class TAO_Notify_Serv_Export TAO_Notify_Subscription_Change_Worker : public TAO_ESF_Worker<TAO_Notify_Proxy>
+{
+public:
+ /// Constuctor
+ TAO_Notify_Subscription_Change_Worker (const CosNotification::EventTypeSeq & added, const CosNotification::EventTypeSeq & removed);
+
+ /// Destructor
+ virtual ~TAO_Notify_Subscription_Change_Worker ();
+
+ ///= TAO_ESF_Worker method
+ void work (TAO_Notify_Proxy* proxy ACE_ENV_ARG_DECL);
+
+protected:
+ const CosNotification::EventTypeSeq & added_;
+ const CosNotification::EventTypeSeq & removed_;
+};
+
+TAO_END_VERSIONED_NAMESPACE_DECL
+
+#include /**/ "ace/post.h"
+#endif /* TAO_SUBSCRIPTION_CHANGE_WORKER_H */
diff --git a/TAO/orbsvcs/orbsvcs/Notify/Supplier.cpp b/TAO/orbsvcs/orbsvcs/Notify/Supplier.cpp
new file mode 100644
index 00000000000..bf1d0eae7ee
--- /dev/null
+++ b/TAO/orbsvcs/orbsvcs/Notify/Supplier.cpp
@@ -0,0 +1,41 @@
+// $Id$
+
+#include "orbsvcs/Notify/Supplier.h"
+
+#if ! defined (__ACE_INLINE__)
+#include "orbsvcs/Notify/Supplier.inl"
+#endif /* __ACE_INLINE__ */
+
+ACE_RCSID(Notify, TAO_Notify_Supplier, "$Id$")
+
+#include "orbsvcs/Notify/ProxyConsumer.h"
+#include "orbsvcs/Notify/Proxy.h"
+
+TAO_BEGIN_VERSIONED_NAMESPACE_DECL
+
+TAO_Notify_Supplier::TAO_Notify_Supplier (TAO_Notify_ProxyConsumer* proxy)
+ : proxy_ (proxy)
+{
+}
+
+TAO_Notify_Supplier::~TAO_Notify_Supplier ()
+{
+}
+
+TAO_Notify_Proxy*
+TAO_Notify_Supplier::proxy (void)
+{
+ return this->proxy_consumer ();
+}
+
+void
+TAO_Notify_Supplier::dispatch_updates_i (
+ const CosNotification::EventTypeSeq& added,
+ const CosNotification::EventTypeSeq& removed
+ ACE_ENV_ARG_DECL)
+{
+ if (!CORBA::is_nil (this->subscribe_.in ()))
+ this->subscribe_->subscription_change (added, removed ACE_ENV_ARG_PARAMETER);
+}
+
+TAO_END_VERSIONED_NAMESPACE_DECL
diff --git a/TAO/orbsvcs/orbsvcs/Notify/Supplier.h b/TAO/orbsvcs/orbsvcs/Notify/Supplier.h
new file mode 100644
index 00000000000..f8032aae3d7
--- /dev/null
+++ b/TAO/orbsvcs/orbsvcs/Notify/Supplier.h
@@ -0,0 +1,70 @@
+// -*- C++ -*-
+
+/**
+ * @file Supplier.h
+ *
+ * $Id$
+ *
+ * @author Pradeep Gore <pradeep@oomworks.com>
+ */
+
+#ifndef TAO_Notify_SUPPLIER_H
+#define TAO_Notify_SUPPLIER_H
+#include /**/ "ace/pre.h"
+
+#include "orbsvcs/Notify/notify_serv_export.h"
+
+#if !defined (ACE_LACKS_PRAGMA_ONCE)
+# pragma once
+#endif /* ACE_LACKS_PRAGMA_ONCE */
+
+#include "orbsvcs/Notify/Peer.h"
+
+#include "orbsvcs/CosNotifyCommC.h"
+
+TAO_BEGIN_VERSIONED_NAMESPACE_DECL
+
+class TAO_Notify_ProxyConsumer;
+
+/**
+ * @class TAO_Notify_Supplier
+ *
+ * @brief Base Wrappers for Suppliers that connect to the EventChannel.
+ *
+ */
+class TAO_Notify_Serv_Export TAO_Notify_Supplier : public TAO_Notify_Peer
+{
+public:
+ /// Constuctor
+ TAO_Notify_Supplier (TAO_Notify_ProxyConsumer* proxy);
+
+ /// Destructor
+ virtual ~TAO_Notify_Supplier ();
+
+ /// Access Specific Proxy.
+ TAO_Notify_ProxyConsumer* proxy_consumer (void);
+
+ /// Access Base Proxy.
+ virtual TAO_Notify_Proxy* proxy (void);
+
+protected:
+ /// Dispatch updates implementation.
+ virtual void dispatch_updates_i (const CosNotification::EventTypeSeq& added,
+ const CosNotification::EventTypeSeq& removed
+ ACE_ENV_ARG_DECL);
+
+ /// The proxy that we associate with.
+ TAO_Notify_ProxyConsumer* proxy_;
+
+ /// Interface that accepts subscription_changes
+ CosNotifyComm::NotifySubscribe_var subscribe_;
+};
+
+TAO_END_VERSIONED_NAMESPACE_DECL
+
+#if defined (__ACE_INLINE__)
+#include "orbsvcs/Notify/Supplier.inl"
+#endif /* __ACE_INLINE__ */
+
+#include /**/ "ace/post.h"
+#endif /* TAO_Notify_SUPPLIER_H */
diff --git a/TAO/orbsvcs/orbsvcs/Notify/Supplier.inl b/TAO/orbsvcs/orbsvcs/Notify/Supplier.inl
new file mode 100644
index 00000000000..19d48fb5634
--- /dev/null
+++ b/TAO/orbsvcs/orbsvcs/Notify/Supplier.inl
@@ -0,0 +1,13 @@
+// -*- C++ -*-
+//
+// $Id$
+
+TAO_BEGIN_VERSIONED_NAMESPACE_DECL
+
+ACE_INLINE TAO_Notify_ProxyConsumer*
+TAO_Notify_Supplier::proxy_consumer (void)
+{
+ return this->proxy_;
+}
+
+TAO_END_VERSIONED_NAMESPACE_DECL
diff --git a/TAO/orbsvcs/orbsvcs/Notify/SupplierAdmin.cpp b/TAO/orbsvcs/orbsvcs/Notify/SupplierAdmin.cpp
new file mode 100644
index 00000000000..71ff8590b4c
--- /dev/null
+++ b/TAO/orbsvcs/orbsvcs/Notify/SupplierAdmin.cpp
@@ -0,0 +1,430 @@
+// $Id$
+
+#include "orbsvcs/Notify/SupplierAdmin.h"
+
+ACE_RCSID (RT_Notify,
+ TAO_Notify_SupplierAdmin,
+ "$Id$")
+
+#include "orbsvcs/Notify/Builder.h"
+#include "orbsvcs/Notify/ProxyConsumer.h"
+#include "orbsvcs/Notify/EventChannel.h"
+#include "orbsvcs/Notify/Subscription_Change_Worker.h"
+#include "orbsvcs/Notify/Find_Worker_T.h"
+#include "orbsvcs/Notify/Seq_Worker_T.h"
+#include "orbsvcs/Notify/Properties.h"
+
+#include "tao/debug.h"
+
+#include "orbsvcs/ESF/ESF_Proxy_Collection.h"
+
+//#define DEBUG_LEVEL 9
+#ifndef DEBUG_LEVEL
+# define DEBUG_LEVEL TAO_debug_level
+#endif //DEBUG_LEVEL
+
+TAO_BEGIN_VERSIONED_NAMESPACE_DECL
+
+typedef TAO_Notify_Find_Worker_T<TAO_Notify_Proxy
+ , CosNotifyChannelAdmin::ProxyConsumer
+ , CosNotifyChannelAdmin::ProxyConsumer_ptr
+ , CosNotifyChannelAdmin::ProxyNotFound>
+TAO_Notify_ProxyConsumer_Find_Worker;
+
+typedef TAO_Notify_Seq_Worker_T<TAO_Notify_Proxy> TAO_Notify_Proxy_Seq_Worker;
+
+TAO_Notify_SupplierAdmin::TAO_Notify_SupplierAdmin (void)
+ : TAO_Notify_Admin ()
+{
+}
+
+const char *
+TAO_Notify_SupplierAdmin::get_admin_type_name () const
+{
+ return "supplier_admin";
+}
+
+TAO_Notify_SupplierAdmin::~TAO_Notify_SupplierAdmin ()
+{
+}
+
+void
+TAO_Notify_SupplierAdmin::init (TAO_Notify_EventChannel *ec ACE_ENV_ARG_DECL)
+{
+ TAO_Notify_Admin::init (ec ACE_ENV_ARG_PARAMETER);
+ ACE_CHECK;
+
+ const CosNotification::QoSProperties &default_sa_qos =
+ TAO_Notify_PROPERTIES::instance ()->default_supplier_admin_qos_properties ();
+
+ this->set_qos (default_sa_qos ACE_ENV_ARG_PARAMETER);
+}
+
+void
+TAO_Notify_SupplierAdmin::_add_ref (ACE_ENV_SINGLE_ARG_DECL_NOT_USED)
+{
+ this->_incr_refcnt ();
+}
+
+void
+TAO_Notify_SupplierAdmin::_remove_ref (ACE_ENV_SINGLE_ARG_DECL_NOT_USED)
+{
+ this->_decr_refcnt ();
+}
+
+void
+TAO_Notify_SupplierAdmin::release (void)
+{
+ delete this;
+ //@@ inform factory
+}
+
+void
+TAO_Notify_SupplierAdmin::destroy (ACE_ENV_SINGLE_ARG_DECL)
+ ACE_THROW_SPEC ((
+ CORBA::SystemException
+ ))
+{
+ int result = this->shutdown (ACE_ENV_SINGLE_ARG_PARAMETER);
+ ACE_CHECK;
+ if ( result == 1)
+ return;
+
+ this->ec_->remove (this ACE_ENV_ARG_PARAMETER);
+ ACE_CHECK;
+}
+
+TAO_Notify::Topology_Object*
+TAO_Notify_SupplierAdmin::load_child (const ACE_CString &type,
+ CORBA::Long id, const TAO_Notify::NVPList& attrs ACE_ENV_ARG_DECL)
+{
+ TAO_Notify::Topology_Object* result = this;
+ if (type == "proxy_push_consumer")
+ {
+ if (DEBUG_LEVEL) ACE_DEBUG ((LM_DEBUG,
+ ACE_TEXT ("(%P|%t) Admin reload proxy %d\n")
+ , static_cast<int> (id)
+ ));
+ result = this->load_proxy(id, CosNotifyChannelAdmin::ANY_EVENT, attrs ACE_ENV_ARG_PARAMETER);
+ ACE_CHECK_RETURN (0);
+ }
+ else if (type == "structured_proxy_push_consumer")
+ {
+ if (DEBUG_LEVEL) ACE_DEBUG ((LM_DEBUG,
+ ACE_TEXT ("(%P|%t) Admin reload proxy %d\n")
+ , static_cast<int> (id)
+ ));
+ result = this->load_proxy(id, CosNotifyChannelAdmin::STRUCTURED_EVENT, attrs ACE_ENV_ARG_PARAMETER);
+ ACE_CHECK_RETURN (0);
+ }
+ else if (type == "sequence_proxy_push_consumer")
+ {
+ if (DEBUG_LEVEL) ACE_DEBUG ((LM_DEBUG,
+ ACE_TEXT ("(%P|%t) Admin reload proxy %d\n")
+ , static_cast<int> (id)
+ ));
+ result = this->load_proxy(id, CosNotifyChannelAdmin::SEQUENCE_EVENT, attrs ACE_ENV_ARG_PARAMETER);
+ ACE_CHECK_RETURN (0);
+ }
+ else
+ {
+ result = TAO_Notify_Admin::load_child (type, id, attrs ACE_ENV_ARG_PARAMETER);
+ ACE_CHECK_RETURN (0);
+ }
+ return result;
+}
+
+TAO_Notify::Topology_Object*
+TAO_Notify_SupplierAdmin::load_proxy (
+ CORBA::Long id,
+ CosNotifyChannelAdmin::ClientType ctype,
+ const TAO_Notify::NVPList& attrs ACE_ENV_ARG_DECL)
+{
+ TAO_Notify_Builder* bld = TAO_Notify_PROPERTIES::instance()->builder();
+ TAO_Notify_ProxyConsumer * proxy =
+ bld->build_proxy (this
+ , ctype
+ , id
+ ACE_ENV_ARG_PARAMETER);
+ ACE_CHECK_RETURN(0);
+ ACE_ASSERT(proxy != 0);
+ proxy->load_attrs (attrs);
+ return proxy;
+}
+
+
+void
+TAO_Notify_SupplierAdmin::set_qos (const CosNotification::QoSProperties & qos ACE_ENV_ARG_DECL)
+ ACE_THROW_SPEC ((
+ CORBA::SystemException
+ , CosNotification::UnsupportedQoS
+ ))
+{
+ this->TAO_Notify_Object::set_qos (qos ACE_ENV_ARG_PARAMETER);
+}
+
+CosNotification::QoSProperties*
+TAO_Notify_SupplierAdmin::get_qos (ACE_ENV_SINGLE_ARG_DECL)
+ ACE_THROW_SPEC ((
+ CORBA::SystemException
+ ))
+{
+ return this->TAO_Notify_Object::get_qos (ACE_ENV_SINGLE_ARG_PARAMETER);
+}
+
+CosNotifyChannelAdmin::ProxyConsumer_ptr
+TAO_Notify_SupplierAdmin::obtain_notification_push_consumer (CosNotifyChannelAdmin::ClientType ctype
+ , CosNotifyChannelAdmin::ProxyID_out proxy_id
+ ACE_ENV_ARG_DECL)
+ ACE_THROW_SPEC ((
+ CORBA::SystemException
+ , CosNotifyChannelAdmin::AdminLimitExceeded
+ ))
+
+{
+ CosNotification::QoSProperties initial_qos;
+
+ CosNotifyChannelAdmin::ProxyConsumer_var proxy =
+ TAO_Notify_PROPERTIES::instance()->builder()->build_proxy (this
+ , ctype
+ , proxy_id
+ , initial_qos
+ ACE_ENV_ARG_PARAMETER);
+ ACE_CHECK_RETURN (proxy._retn ());
+ this->self_change (ACE_ENV_SINGLE_ARG_PARAMETER);
+ ACE_CHECK_RETURN (proxy._retn ());
+ return proxy._retn ();
+}
+
+CosNotifyChannelAdmin::ProxyConsumer_ptr
+TAO_Notify_SupplierAdmin::obtain_notification_push_consumer_with_qos (CosNotifyChannelAdmin::ClientType ctype,
+ CosNotifyChannelAdmin::ProxyID_out proxy_id,
+ const CosNotification::QoSProperties & initial_qos
+ ACE_ENV_ARG_DECL
+ )
+ ACE_THROW_SPEC ((
+ CORBA::SystemException
+ , CosNotifyChannelAdmin::AdminLimitExceeded
+ , CosNotification::UnsupportedQoS
+ ))
+{
+ CosNotifyChannelAdmin::ProxyConsumer_var proxy =
+ TAO_Notify_PROPERTIES::instance()->builder()->build_proxy (this
+ , ctype
+ , proxy_id,
+ initial_qos
+ ACE_ENV_ARG_PARAMETER);
+ ACE_CHECK_RETURN (proxy._retn ());
+ this->self_change (ACE_ENV_SINGLE_ARG_PARAMETER);
+ ACE_CHECK_RETURN (proxy._retn ());
+ return proxy._retn ();
+}
+
+
+CosEventChannelAdmin::ProxyPushConsumer_ptr
+TAO_Notify_SupplierAdmin::obtain_push_consumer (ACE_ENV_SINGLE_ARG_DECL)
+ ACE_THROW_SPEC ((
+ CORBA::SystemException
+ ))
+{
+ CosEventChannelAdmin::ProxyPushConsumer_var proxy =
+ TAO_Notify_PROPERTIES::instance()->builder()->build_proxy (this ACE_ENV_ARG_PARAMETER);
+ ACE_CHECK_RETURN (proxy._retn ());
+ this->self_change (ACE_ENV_SINGLE_ARG_PARAMETER);
+ ACE_CHECK_RETURN (proxy._retn ());
+ return proxy._retn ();
+}
+
+CosNotifyChannelAdmin::AdminID
+TAO_Notify_SupplierAdmin::MyID (ACE_ENV_SINGLE_ARG_DECL_NOT_USED)
+ ACE_THROW_SPEC ((
+ CORBA::SystemException
+ ))
+{
+ return this->id ();
+}
+
+CosNotifyChannelAdmin::EventChannel_ptr
+TAO_Notify_SupplierAdmin::MyChannel (ACE_ENV_SINGLE_ARG_DECL)
+ ACE_THROW_SPEC ((
+ CORBA::SystemException
+ ))
+{
+ return this->ec_->_this (ACE_ENV_SINGLE_ARG_PARAMETER);
+}
+
+::CosNotifyChannelAdmin::InterFilterGroupOperator
+TAO_Notify_SupplierAdmin::MyOperator (ACE_ENV_SINGLE_ARG_DECL_NOT_USED)
+ ACE_THROW_SPEC ((
+ CORBA::SystemException
+ ))
+{
+ return this->filter_operator_;
+}
+
+CosNotifyChannelAdmin::ProxyIDSeq*
+TAO_Notify_SupplierAdmin::push_consumers (ACE_ENV_SINGLE_ARG_DECL)
+ ACE_THROW_SPEC ((
+ CORBA::SystemException
+ ))
+{
+ TAO_Notify_Proxy_Seq_Worker seq_worker;
+
+ return seq_worker.create (this->proxy_container() ACE_ENV_ARG_PARAMETER);
+}
+
+CosNotifyChannelAdmin::ProxyConsumer_ptr
+TAO_Notify_SupplierAdmin::get_proxy_consumer (CosNotifyChannelAdmin::ProxyID proxy_id ACE_ENV_ARG_DECL)
+ ACE_THROW_SPEC ((
+ CORBA::SystemException
+ , CosNotifyChannelAdmin::ProxyNotFound
+ ))
+{
+ TAO_Notify_ProxyConsumer_Find_Worker find_worker;
+
+ return find_worker.resolve (proxy_id, this->proxy_container() ACE_ENV_ARG_PARAMETER);
+}
+
+void
+TAO_Notify_SupplierAdmin::offer_change (const CosNotification::EventTypeSeq & added,
+ const CosNotification::EventTypeSeq & removed
+ ACE_ENV_ARG_DECL
+ )
+ ACE_THROW_SPEC ((
+ CORBA::SystemException
+ , CosNotifyComm::InvalidEventType
+ ))
+
+{
+ TAO_Notify_EventTypeSeq seq_added (added);
+ TAO_Notify_EventTypeSeq seq_removed (removed);
+
+ {
+ ACE_GUARD_THROW_EX (TAO_SYNCH_MUTEX, ace_mon, this->lock_,
+ CORBA::INTERNAL ());
+ ACE_CHECK;
+
+ this->subscribed_types_.add_and_remove (seq_added, seq_removed);
+
+ TAO_Notify_Subscription_Change_Worker worker (added, removed);
+
+ this->proxy_container().collection ()->for_each (&worker ACE_ENV_ARG_PARAMETER);
+ }
+}
+
+CosNotifyFilter::FilterID
+TAO_Notify_SupplierAdmin::add_filter (CosNotifyFilter::Filter_ptr new_filter ACE_ENV_ARG_DECL)
+ ACE_THROW_SPEC ((
+ CORBA::SystemException
+ ))
+{
+ CosNotifyFilter::FilterID fid =
+ this->filter_admin_.add_filter (new_filter ACE_ENV_ARG_PARAMETER);
+ ACE_CHECK_RETURN (fid);
+ this->self_change (ACE_ENV_SINGLE_ARG_PARAMETER);
+ ACE_CHECK_RETURN (fid);
+ return fid;
+}
+
+void
+TAO_Notify_SupplierAdmin::remove_filter (CosNotifyFilter::FilterID filter ACE_ENV_ARG_DECL)
+ ACE_THROW_SPEC ((
+ CORBA::SystemException
+ , CosNotifyFilter::FilterNotFound
+ ))
+{
+ this->filter_admin_.remove_filter (filter ACE_ENV_ARG_PARAMETER);
+}
+
+::CosNotifyFilter::Filter_ptr
+TAO_Notify_SupplierAdmin::get_filter (CosNotifyFilter::FilterID filter ACE_ENV_ARG_DECL)
+ ACE_THROW_SPEC ((
+ CORBA::SystemException
+ , CosNotifyFilter::FilterNotFound
+ ))
+{
+ return this->filter_admin_.get_filter (filter ACE_ENV_ARG_PARAMETER);
+}
+
+::CosNotifyFilter::FilterIDSeq*
+TAO_Notify_SupplierAdmin::get_all_filters (ACE_ENV_SINGLE_ARG_DECL)
+ ACE_THROW_SPEC ((
+ CORBA::SystemException
+ ))
+{
+ return this->filter_admin_.get_all_filters (ACE_ENV_SINGLE_ARG_PARAMETER);
+}
+
+void
+TAO_Notify_SupplierAdmin::remove_all_filters (ACE_ENV_SINGLE_ARG_DECL)
+ ACE_THROW_SPEC ((
+ CORBA::SystemException
+ ))
+{
+ this->filter_admin_.remove_all_filters (ACE_ENV_SINGLE_ARG_PARAMETER);
+}
+
+/************** UNIMPLEMENTED METHODS ***************/
+
+CosEventChannelAdmin::ProxyPullConsumer_ptr
+TAO_Notify_SupplierAdmin::obtain_pull_consumer (ACE_ENV_SINGLE_ARG_DECL)
+ ACE_THROW_SPEC ((
+ CORBA::SystemException
+ ))
+{
+ ACE_THROW_RETURN (CORBA::NO_IMPLEMENT (), CosEventChannelAdmin::ProxyPullConsumer::_nil ());
+}
+
+CosNotifyChannelAdmin::ProxyIDSeq*
+TAO_Notify_SupplierAdmin::pull_consumers (ACE_ENV_SINGLE_ARG_DECL)
+ ACE_THROW_SPEC ((
+ CORBA::SystemException
+ ))
+{
+ ACE_THROW_RETURN (CORBA::NO_IMPLEMENT (), 0);
+}
+
+
+void
+TAO_Notify_SupplierAdmin::validate_qos (const CosNotification::QoSProperties & /*required_qos*/,
+ CosNotification::NamedPropertyRangeSeq_out /*available_qos*/
+ ACE_ENV_ARG_DECL)
+ ACE_THROW_SPEC ((
+ CORBA::SystemException
+ , CosNotification::UnsupportedQoS
+ ))
+{
+ ACE_THROW (CORBA::NO_IMPLEMENT ());
+}
+
+CosNotifyChannelAdmin::ProxyConsumer_ptr
+TAO_Notify_SupplierAdmin::obtain_notification_pull_consumer (CosNotifyChannelAdmin::ClientType /*ctype*/,
+ CosNotifyChannelAdmin::ProxyID_out /*proxy_id*/
+ ACE_ENV_ARG_DECL)
+ ACE_THROW_SPEC ((
+ CORBA::SystemException
+ , CosNotifyChannelAdmin::AdminLimitExceeded
+ ))
+{
+ ACE_THROW_RETURN (CORBA::NO_IMPLEMENT (), CosNotifyChannelAdmin::ProxyConsumer::_nil ());
+}
+
+TAO_Notify_ProxyConsumer *
+TAO_Notify_SupplierAdmin::find_proxy_consumer (
+ TAO_Notify::IdVec & id_path,
+ size_t position
+ ACE_ENV_ARG_DECL)
+{
+ TAO_Notify_ProxyConsumer * result = 0;
+ size_t path_size = id_path.size ();
+ if (position < path_size)
+ {
+ TAO_Notify_ProxyConsumer_Find_Worker find_worker;
+ TAO_Notify_Proxy * proxy = find_worker.find (id_path[position], this->proxy_container() ACE_ENV_ARG_PARAMETER);
+ ACE_CHECK_RETURN (0);
+ result = dynamic_cast <TAO_Notify_ProxyConsumer *> (proxy);
+ }
+ return result;
+}
+
+TAO_END_VERSIONED_NAMESPACE_DECL
diff --git a/TAO/orbsvcs/orbsvcs/Notify/SupplierAdmin.h b/TAO/orbsvcs/orbsvcs/Notify/SupplierAdmin.h
new file mode 100644
index 00000000000..eeeaf0d40ab
--- /dev/null
+++ b/TAO/orbsvcs/orbsvcs/Notify/SupplierAdmin.h
@@ -0,0 +1,219 @@
+// -*- C++ -*-
+
+/**
+ * @file SupplierAdmin.h
+ *
+ * $Id$
+ *
+ * @author Pradeep Gore <pradeep@oomworks.com>
+ */
+
+#ifndef TAO_Notify_SUPPLIERADMIN_H
+#define TAO_Notify_SUPPLIERADMIN_H
+
+#include /**/ "ace/pre.h"
+
+#include "orbsvcs/Notify/notify_serv_export.h"
+#include "orbsvcs/Notify/Admin.h"
+
+#include "orbsvcs/NotifyExtS.h"
+
+#if !defined (ACE_LACKS_PRAGMA_ONCE)
+# pragma once
+#endif /* ACE_LACKS_PRAGMA_ONCE */
+
+#if defined(_MSC_VER)
+#pragma warning(push)
+#pragma warning(disable:4250)
+#endif /* _MSC_VER */
+
+TAO_BEGIN_VERSIONED_NAMESPACE_DECL
+
+class TAO_Notify_ProxyConsumer;
+
+/**
+ * @class TAO_Notify_SupplierAdmin
+ *
+ * @brief Implementation of CosNotifyChannelAdmin::SupplierAdmin
+ *
+ */
+class TAO_Notify_Serv_Export TAO_Notify_SupplierAdmin
+ : public virtual POA_NotifyExt::SupplierAdmin,
+ public virtual TAO_Notify_Admin
+{
+public:
+ typedef TAO_Notify_Refcountable_Guard_T< TAO_Notify_SupplierAdmin > Ptr;
+
+ /// Constuctor
+ TAO_Notify_SupplierAdmin (void);
+
+ /// Destructor
+ virtual ~TAO_Notify_SupplierAdmin ();
+
+ /// Init
+ void init (TAO_Notify_EventChannel *ec ACE_ENV_ARG_DECL);
+
+ /// ServantBase refcount methods.
+ virtual void _add_ref (ACE_ENV_SINGLE_ARG_DECL);
+ virtual void _remove_ref (ACE_ENV_SINGLE_ARG_DECL);
+
+
+ virtual const char * get_admin_type_name () const;
+
+ virtual TAO_Notify::Topology_Object* load_child (
+ const ACE_CString &type,
+ CORBA::Long id,
+ const TAO_Notify::NVPList& attrs
+ ACE_ENV_ARG_DECL);
+
+ TAO_Notify_ProxyConsumer * find_proxy_consumer (
+ TAO_Notify::IdVec & id_path,
+ size_t position
+ ACE_ENV_ARG_DECL);
+
+protected:
+
+ TAO_Notify::Topology_Object *load_proxy (
+ CORBA::Long id,
+ CosNotifyChannelAdmin::ClientType ctype,
+ const TAO_Notify::NVPList& attrs
+ ACE_ENV_ARG_DECL);
+
+ /// = NotifyExt::SupplierAdmin methods
+ CosNotifyChannelAdmin::ProxyConsumer_ptr
+ obtain_notification_push_consumer_with_qos (
+ CosNotifyChannelAdmin::ClientType ctype,
+ CosNotifyChannelAdmin::ProxyID_out proxy_id,
+ const CosNotification::QoSProperties & initial_qos
+ ACE_ENV_ARG_DECL
+ )
+ ACE_THROW_SPEC ((CORBA::SystemException,
+ CosNotifyChannelAdmin::AdminLimitExceeded,
+ CosNotification::UnsupportedQoS));
+
+ /// = CosNotifyChannelAdmin::SupplierAdmin methods
+ virtual CosNotifyChannelAdmin::AdminID MyID (ACE_ENV_SINGLE_ARG_DECL)
+ ACE_THROW_SPEC ((CORBA::SystemException));
+
+ virtual ::CosNotifyChannelAdmin::EventChannel_ptr MyChannel (
+ ACE_ENV_SINGLE_ARG_DECL
+ )
+ ACE_THROW_SPEC ((CORBA::SystemException));
+
+ virtual ::CosNotifyChannelAdmin::InterFilterGroupOperator MyOperator (
+ ACE_ENV_SINGLE_ARG_DECL
+ )
+ ACE_THROW_SPEC ((CORBA::SystemException));
+
+ virtual ::CosNotifyChannelAdmin::ProxyIDSeq * pull_consumers (
+ ACE_ENV_SINGLE_ARG_DECL
+ )
+ ACE_THROW_SPEC ((CORBA::SystemException));
+
+ virtual ::CosNotifyChannelAdmin::ProxyIDSeq * push_consumers (
+ ACE_ENV_SINGLE_ARG_DECL
+ )
+ ACE_THROW_SPEC ((CORBA::SystemException));
+
+ virtual ::CosNotifyChannelAdmin::ProxyConsumer_ptr get_proxy_consumer (
+ CosNotifyChannelAdmin::ProxyID proxy_id
+ ACE_ENV_ARG_DECL
+ )
+ ACE_THROW_SPEC ((CORBA::SystemException,
+ CosNotifyChannelAdmin::ProxyNotFound));
+
+ virtual ::CosNotifyChannelAdmin::ProxyConsumer_ptr
+ obtain_notification_pull_consumer (
+ CosNotifyChannelAdmin::ClientType ctype,
+ CosNotifyChannelAdmin::ProxyID_out proxy_id
+ ACE_ENV_ARG_DECL
+ )
+ ACE_THROW_SPEC ((CORBA::SystemException,
+ CosNotifyChannelAdmin::AdminLimitExceeded));
+
+ virtual ::CosNotifyChannelAdmin::ProxyConsumer_ptr
+ obtain_notification_push_consumer (
+ CosNotifyChannelAdmin::ClientType ctype,
+ CosNotifyChannelAdmin::ProxyID_out proxy_id
+ ACE_ENV_ARG_DECL
+ )
+ ACE_THROW_SPEC ((CORBA::SystemException,
+ CosNotifyChannelAdmin::AdminLimitExceeded));
+
+ virtual void destroy (ACE_ENV_SINGLE_ARG_DECL)
+ ACE_THROW_SPEC ((CORBA::SystemException));
+
+ virtual ::CosNotification::QoSProperties* get_qos (ACE_ENV_SINGLE_ARG_DECL)
+ ACE_THROW_SPEC ((CORBA::SystemException));
+
+ virtual void set_qos (const CosNotification::QoSProperties& qos
+ ACE_ENV_ARG_DECL)
+ ACE_THROW_SPEC ((CORBA::SystemException,
+ CosNotification::UnsupportedQoS));
+
+ virtual void validate_qos (
+ const CosNotification::QoSProperties & required_qos,
+ CosNotification::NamedPropertyRangeSeq_out available_qos
+ ACE_ENV_ARG_DECL
+ )
+ ACE_THROW_SPEC ((CORBA::SystemException,
+ CosNotification::UnsupportedQoS));
+
+ virtual void offer_change (const CosNotification::EventTypeSeq & added,
+ const CosNotification::EventTypeSeq & removed
+ ACE_ENV_ARG_DECL)
+ ACE_THROW_SPEC ((
+ CORBA::SystemException
+ , CosNotifyComm::InvalidEventType
+ ));
+
+ virtual CosNotifyFilter::FilterID add_filter (
+ CosNotifyFilter::Filter_ptr new_filter ACE_ENV_ARG_DECL
+ )
+ ACE_THROW_SPEC ((CORBA::SystemException));
+
+ virtual void remove_filter (
+ CosNotifyFilter::FilterID filter ACE_ENV_ARG_DECL
+ )
+ ACE_THROW_SPEC ((CORBA::SystemException,
+ CosNotifyFilter::FilterNotFound));
+
+ virtual ::CosNotifyFilter::Filter_ptr get_filter (
+ CosNotifyFilter::FilterID filter
+ ACE_ENV_ARG_DECL
+ )
+ ACE_THROW_SPEC ((CORBA::SystemException,
+ CosNotifyFilter::FilterNotFound));
+
+ virtual ::CosNotifyFilter::FilterIDSeq * get_all_filters (
+ ACE_ENV_SINGLE_ARG_DECL
+ )
+ ACE_THROW_SPEC ((CORBA::SystemException));
+
+ virtual void remove_all_filters (ACE_ENV_SINGLE_ARG_DECL)
+ ACE_THROW_SPEC ((CORBA::SystemException));
+
+ virtual ::CosEventChannelAdmin::ProxyPushConsumer_ptr obtain_push_consumer (
+ ACE_ENV_SINGLE_ARG_DECL
+ )
+ ACE_THROW_SPEC ((CORBA::SystemException));
+
+ virtual ::CosEventChannelAdmin::ProxyPullConsumer_ptr obtain_pull_consumer (
+ ACE_ENV_SINGLE_ARG_DECL
+ )
+ ACE_THROW_SPEC ((CORBA::SystemException));
+
+private:
+ /// Release
+ virtual void release (void);
+};
+
+TAO_END_VERSIONED_NAMESPACE_DECL
+
+#if defined(_MSC_VER)
+#pragma warning(pop)
+#endif /* _MSC_VER */
+
+#include /**/ "ace/post.h"
+
+#endif /* TAO_Notify_SUPPLIERADMIN_H */
diff --git a/TAO/orbsvcs/orbsvcs/Notify/Supplier_Map.h b/TAO/orbsvcs/orbsvcs/Notify/Supplier_Map.h
new file mode 100644
index 00000000000..0a28afc1792
--- /dev/null
+++ b/TAO/orbsvcs/orbsvcs/Notify/Supplier_Map.h
@@ -0,0 +1,37 @@
+// -*- C++ -*-
+
+/**
+ * @file Supplier_Map.h
+ *
+ * $Id$
+ *
+ * @author Pradeep Gore <pradeep@oomworks.com>
+ */
+
+#ifndef TAO_Notify_SUPPLIER_MAP_H
+#define TAO_Notify_SUPPLIER_MAP_H
+#include /**/ "ace/pre.h"
+
+#include "orbsvcs/Notify/notify_serv_export.h"
+
+#if !defined (ACE_LACKS_PRAGMA_ONCE)
+# pragma once
+#endif /* ACE_LACKS_PRAGMA_ONCE */
+
+#include "orbsvcs/Notify/Event_Map_T.h"
+#include "orbsvcs/Notify/ProxyConsumer.h"
+
+TAO_BEGIN_VERSIONED_NAMESPACE_DECL
+
+/**
+ * @typedef TAO_Notify_Supplier_Map
+ *
+ * @brief The Event Map for Suppliers.
+ *
+ */
+typedef TAO_Notify_Event_Map_T<TAO_Notify_ProxyConsumer, TAO_SYNCH_RW_MUTEX> TAO_Notify_Supplier_Map;
+
+TAO_END_VERSIONED_NAMESPACE_DECL
+
+#include /**/ "ace/post.h"
+#endif /* TAO_Notify_SUPPLIER_MAP_H */
diff --git a/TAO/orbsvcs/orbsvcs/Notify/ThreadPool_Task.cpp b/TAO/orbsvcs/orbsvcs/Notify/ThreadPool_Task.cpp
new file mode 100644
index 00000000000..01a7a51711f
--- /dev/null
+++ b/TAO/orbsvcs/orbsvcs/Notify/ThreadPool_Task.cpp
@@ -0,0 +1,200 @@
+// $Id$
+
+#include "orbsvcs/Notify/ThreadPool_Task.h"
+
+ACE_RCSID(Notify, TAO_Notify_ThreadPool_Task, "$Id$")
+
+#include "orbsvcs/Notify/Properties.h"
+#include "orbsvcs/Notify/Timer_Queue.h"
+#include "orbsvcs/Notify/Buffering_Strategy.h"
+
+#include "tao/debug.h"
+#include "tao/ORB_Core.h"
+
+#include "ace/OS_NS_errno.h"
+
+TAO_BEGIN_VERSIONED_NAMESPACE_DECL
+
+TAO_Notify_ThreadPool_Task::TAO_Notify_ThreadPool_Task (void)
+: shutdown_ (false)
+{
+}
+
+TAO_Notify_ThreadPool_Task::~TAO_Notify_ThreadPool_Task ()
+{
+}
+
+int
+TAO_Notify_ThreadPool_Task::init (int argc, ACE_TCHAR **argv)
+{
+ return this->ACE_Task<ACE_NULL_SYNCH>::init (argc, argv);
+}
+
+TAO_Notify_Timer*
+TAO_Notify_ThreadPool_Task::timer (void)
+{
+ return this->timer_.get();
+}
+
+void
+TAO_Notify_ThreadPool_Task::init (const NotifyExt::ThreadPoolParams& tp_params,
+ const TAO_Notify_AdminProperties::Ptr& admin_properties ACE_ENV_ARG_DECL)
+{
+ ACE_ASSERT (this->timer_.get() == 0);
+
+ TAO_Notify_Timer_Queue* timer = 0;
+ ACE_NEW_THROW_EX (timer,
+ TAO_Notify_Timer_Queue (),
+ CORBA::NO_MEMORY ());
+ ACE_CHECK;
+ this->timer_.reset (timer);
+
+
+ TAO_Notify_Buffering_Strategy* buffering_strategy = 0;
+ ACE_NEW_THROW_EX (buffering_strategy,
+ TAO_Notify_Buffering_Strategy (*msg_queue (), admin_properties),
+ CORBA::NO_MEMORY ());
+ this->buffering_strategy_.reset (buffering_strategy);
+ ACE_CHECK;
+
+ long flags = THR_NEW_LWP | THR_DETACHED;
+ CORBA::ORB_var orb =
+ TAO_Notify_PROPERTIES::instance()->orb ();
+
+ flags |=
+ orb->orb_core ()->orb_params ()->thread_creation_flags ();
+
+ // Guards the thread for auto-deletion; paired with close.
+ // This is done in the originating thread before the spawn to
+ // avoid any race conditions.
+ for ( CORBA::ULong i = 0; i < tp_params.static_threads; ++i )
+ {
+ this->_incr_refcnt();
+ }
+
+ // Become an active object.
+ if (this->ACE_Task <ACE_NULL_SYNCH>::activate (flags,
+ tp_params.static_threads,
+ 0,
+ ACE_THR_PRI_OTHER_DEF) == -1)
+ {
+ // Undo the ref counts on error
+ for ( CORBA::ULong i = 0; i < tp_params.static_threads; ++i )
+ {
+ this->_decr_refcnt();
+ }
+
+ if (TAO_debug_level > 0)
+ {
+ if (ACE_OS::last_error () == EPERM)
+ ACE_DEBUG ((LM_DEBUG, ACE_TEXT ("Insufficient privilege.\n")));
+ else
+ ACE_DEBUG ((LM_ERROR,
+ ACE_TEXT ("(%t) task activation at priority %d failed\n")
+ ACE_TEXT ("exiting!\n%a"),
+ tp_params.default_priority));
+ }
+ ACE_THROW (CORBA::BAD_PARAM ());
+ }
+}
+
+void
+TAO_Notify_ThreadPool_Task::execute (TAO_Notify_Method_Request& method_request ACE_ENV_ARG_DECL)
+{
+ if (!shutdown_)
+ {
+ TAO_Notify_Method_Request_Queueable* request_copy = method_request.copy (ACE_ENV_SINGLE_ARG_PARAMETER);
+ ACE_CHECK;
+
+ if (this->buffering_strategy_->enqueue (request_copy) == -1)
+ {
+ if (TAO_debug_level > 0)
+ ACE_DEBUG ((LM_DEBUG, "NS_ThreadPool_Task (%P|%t) - "
+ "failed to enqueue\n"));
+ }
+ }
+}
+
+int
+TAO_Notify_ThreadPool_Task::svc (void)
+{
+ TAO_Notify_Method_Request_Queueable* method_request;
+
+ while (!shutdown_)
+ {
+ ACE_TRY_NEW_ENV
+ {
+ ACE_Time_Value* dequeue_blocking_time = 0;
+ ACE_Time_Value earliest_time;
+
+ if (!this->timer_->impl().is_empty ())
+ {
+ earliest_time = this->timer_->impl().earliest_time ();
+ dequeue_blocking_time = &earliest_time;
+ }
+
+ // Dequeue 1 item
+ int result = buffering_strategy_->dequeue (method_request, dequeue_blocking_time);
+
+ if (result > 0)
+ {
+ method_request->execute (ACE_ENV_SINGLE_ARG_PARAMETER);
+ ACE_TRY_CHECK;
+
+ ACE_Message_Block::release (method_request);
+ }
+ else if (errno == ETIME)
+ {
+ this->timer_->impl ().expire ();
+ }
+ else
+ {
+ if (TAO_debug_level > 0)
+ ACE_DEBUG ((LM_DEBUG, "ThreadPool_Task dequeue failed\n"));
+ }
+ }
+ ACE_CATCHANY
+ {
+ ACE_PRINT_EXCEPTION (ACE_ANY_EXCEPTION,
+ "ThreadPool_Task (%P|%t) exception in method request\n");
+ }
+ ACE_ENDTRY;
+ } /* while */
+
+ return 0;
+}
+
+void
+TAO_Notify_ThreadPool_Task::shutdown (void)
+{
+ if (this->shutdown_)
+ {
+ return;
+ }
+
+ this->shutdown_ = true;
+
+ this->buffering_strategy_->shutdown ();
+}
+
+void
+TAO_Notify_ThreadPool_Task::release (void)
+{
+ delete this;
+}
+
+int
+TAO_Notify_ThreadPool_Task::close (u_long)
+{
+ // _incr_refcnt() for each spawned thread in init()
+ this->_decr_refcnt();
+ return 0;
+}
+
+void
+TAO_Notify_ThreadPool_Task::update_qos_properties (const TAO_Notify_QoSProperties& qos_properties)
+{
+ this->buffering_strategy_->update_qos_properties (qos_properties);
+}
+
+TAO_END_VERSIONED_NAMESPACE_DECL
diff --git a/TAO/orbsvcs/orbsvcs/Notify/ThreadPool_Task.h b/TAO/orbsvcs/orbsvcs/Notify/ThreadPool_Task.h
new file mode 100644
index 00000000000..ffff9d3a1a6
--- /dev/null
+++ b/TAO/orbsvcs/orbsvcs/Notify/ThreadPool_Task.h
@@ -0,0 +1,98 @@
+// -*- C++ -*-
+
+/**
+ * @file ThreadPool_Task.h
+ *
+ * $Id$
+ *
+ * @author Pradeep Gore <pradeep@oomworks.com>
+ */
+
+#ifndef TAO_Notify_THREADPOOL_TASK_H
+#define TAO_Notify_THREADPOOL_TASK_H
+
+#include /**/ "ace/pre.h"
+
+#include "orbsvcs/Notify/notify_serv_export.h"
+
+#include "orbsvcs/Notify/Timer_Queue.h"
+#include "orbsvcs/Notify/AdminProperties.h"
+#include "orbsvcs/Notify/Worker_Task.h"
+
+#include "ace/Task.h"
+#include "ace/Message_Queue.h"
+#include "ace/Reactor.h"
+#include "ace/Null_Condition.h"
+
+#if !defined (ACE_LACKS_PRAGMA_ONCE)
+# pragma once
+#endif /* ACE_LACKS_PRAGMA_ONCE */
+
+TAO_BEGIN_VERSIONED_NAMESPACE_DECL
+
+class TAO_Notify_Buffering_Strategy;
+
+/**
+ * @class TAO_Notify_ThreadPool_Task
+ *
+ * @brief Implements a Thread Pool Worker Task.
+ *
+ */
+class TAO_Notify_Serv_Export TAO_Notify_ThreadPool_Task
+ : public TAO_Notify_Worker_Task
+ , public ACE_Task<ACE_NULL_SYNCH>
+{
+ friend class TAO_Notify_Method_Request_Shutdown;
+
+public:
+ /// Constuctor
+ TAO_Notify_ThreadPool_Task (void);
+
+ /// Destructor
+ virtual ~TAO_Notify_ThreadPool_Task ();
+
+ /// Call the base class init
+ virtual int init (int argc, ACE_TCHAR **argv);
+
+ /// release reference to my self.
+ virtual int close (u_long flags);
+
+ /// Activate the threadpool
+ void init (const NotifyExt::ThreadPoolParams& tp_params, const TAO_Notify_AdminProperties::Ptr& admin_properties ACE_ENV_ARG_DECL);
+
+ /// Queue the request
+ virtual void execute (TAO_Notify_Method_Request& method_request ACE_ENV_ARG_DECL);
+
+ /// Shutdown task
+ virtual void shutdown ();
+
+ /// Update QoS Properties.
+ virtual void update_qos_properties (const TAO_Notify_QoSProperties& qos_properties);
+
+ /// The object used by clients to register timers.
+ virtual TAO_Notify_Timer* timer (void);
+
+protected:
+ /// Task svc
+ virtual int svc (void);
+
+private:
+ /// Release
+ virtual void release (void);
+
+ /// The buffering strategy to use.
+ ACE_Auto_Ptr< TAO_Notify_Buffering_Strategy > buffering_strategy_;
+
+ /// Shutdown
+ bool shutdown_;
+
+ /// The Queue based timer.
+ TAO_Notify_Timer_Queue::Ptr timer_;
+};
+
+
+TAO_END_VERSIONED_NAMESPACE_DECL
+
+#include /**/ "ace/post.h"
+
+#endif /* TAO_Notify_THREADPOOL_TASK_H */
diff --git a/TAO/orbsvcs/orbsvcs/Notify/Timer.h b/TAO/orbsvcs/orbsvcs/Notify/Timer.h
new file mode 100644
index 00000000000..3b3a829f7e7
--- /dev/null
+++ b/TAO/orbsvcs/orbsvcs/Notify/Timer.h
@@ -0,0 +1,56 @@
+// -*- C++ -*-
+
+/**
+ * @file Timer.h
+ *
+ * $Id$
+ *
+ * @author Pradeep Gore <pradeep@oomworks.com>
+ */
+
+#ifndef TAO_Notify_TIMER_H
+#define TAO_Notify_TIMER_H
+#include /**/ "ace/pre.h"
+
+#include "orbsvcs/Notify/notify_serv_export.h"
+
+#if !defined (ACE_LACKS_PRAGMA_ONCE)
+# pragma once
+#endif /* ACE_LACKS_PRAGMA_ONCE */
+
+#include "orbsvcs/Notify/Refcountable.h"
+
+#include "ace/Time_Value.h"
+
+ACE_BEGIN_VERSIONED_NAMESPACE_DECL
+class ACE_Event_Handler;
+ACE_END_VERSIONED_NAMESPACE_DECL
+
+TAO_BEGIN_VERSIONED_NAMESPACE_DECL
+
+/**
+ * @class TAO_Notify_Timer
+ *
+ * @brief Interface for scheduling timers.
+ *
+ */
+class TAO_Notify_Serv_Export TAO_Notify_Timer : public TAO_Notify_Refcountable
+{
+public:
+ typedef TAO_Notify_Refcountable_Guard_T< TAO_Notify_Timer > Ptr;
+ /// Destructor
+ virtual ~TAO_Notify_Timer (){};
+
+ /// Schedule a timer
+ virtual long schedule_timer (ACE_Event_Handler *handler,
+ const ACE_Time_Value &delay_time,
+ const ACE_Time_Value &interval) = 0;
+
+ /// Cancel Timer
+ virtual int cancel_timer (long timer_id) = 0;
+};
+
+TAO_END_VERSIONED_NAMESPACE_DECL
+
+#include /**/ "ace/post.h"
+#endif /* TAO_Notify_TIMER_H */
diff --git a/TAO/orbsvcs/orbsvcs/Notify/Timer_Queue.cpp b/TAO/orbsvcs/orbsvcs/Notify/Timer_Queue.cpp
new file mode 100644
index 00000000000..642f313f2f3
--- /dev/null
+++ b/TAO/orbsvcs/orbsvcs/Notify/Timer_Queue.cpp
@@ -0,0 +1,48 @@
+// $Id$
+
+#include "orbsvcs/Notify/Timer_Queue.h"
+
+ACE_RCSID (Notify, TAO_Notify_Timer_Queue, "$Id$")
+
+TAO_BEGIN_VERSIONED_NAMESPACE_DECL
+
+TAO_Notify_Timer_Queue::TAO_Notify_Timer_Queue (void)
+{
+}
+
+TAO_Notify_Timer_Queue::~TAO_Notify_Timer_Queue ()
+{
+}
+
+void
+TAO_Notify_Timer_Queue::release (void)
+{
+ delete this;
+ //@@ inform factory
+}
+
+long
+TAO_Notify_Timer_Queue::schedule_timer (ACE_Event_Handler *handler,
+ const ACE_Time_Value &delay_time,
+ const ACE_Time_Value &interval)
+{
+ return
+ this->timer_queue_.schedule (handler,
+ 0,
+ timer_queue_.gettimeofday () + delay_time,
+ interval);
+}
+
+int
+TAO_Notify_Timer_Queue::cancel_timer (long timer_id)
+{
+ return this->timer_queue_.cancel (timer_id);
+}
+
+ACE_Timer_Queue&
+TAO_Notify_Timer_Queue::impl (void)
+{
+ return this->timer_queue_;
+}
+
+TAO_END_VERSIONED_NAMESPACE_DECL
diff --git a/TAO/orbsvcs/orbsvcs/Notify/Timer_Queue.h b/TAO/orbsvcs/orbsvcs/Notify/Timer_Queue.h
new file mode 100644
index 00000000000..3f0f021e217
--- /dev/null
+++ b/TAO/orbsvcs/orbsvcs/Notify/Timer_Queue.h
@@ -0,0 +1,70 @@
+// -*- C++ -*-
+
+/**
+ * @file Timer_Queue.h
+ *
+ * $Id$
+ *
+ * @author Pradeep Gore <pradeep@oomworks.com>
+ */
+
+#ifndef TAO_Notify_TIMER_QUEUE_H
+#define TAO_Notify_TIMER_QUEUE_H
+#include /**/ "ace/pre.h"
+
+#include "orbsvcs/Notify/notify_serv_export.h"
+
+#include "orbsvcs/Notify/Timer.h"
+
+#include "ace/Timer_Queue.h"
+#include "ace/Timer_Heap.h"
+#include "ace/Recursive_Thread_Mutex.h"
+
+#if !defined (ACE_LACKS_PRAGMA_ONCE)
+# pragma once
+#endif /* ACE_LACKS_PRAGMA_ONCE */
+
+TAO_BEGIN_VERSIONED_NAMESPACE_DECL
+
+/**
+ * @class TAO_Notify_Timer_Queue
+ *
+ * @brief ACE_Timer_Queue based timer.
+ *
+ */
+class TAO_Notify_Serv_Export TAO_Notify_Timer_Queue : public TAO_Notify_Timer
+{
+public:
+ typedef TAO_Notify_Refcountable_Guard_T< TAO_Notify_Timer_Queue > Ptr;
+
+ /// Constuctor
+ TAO_Notify_Timer_Queue (void);
+
+ /// Destructor
+ virtual ~TAO_Notify_Timer_Queue ();
+
+
+ /// Schedule a timer
+ virtual long schedule_timer (ACE_Event_Handler *handler,
+ const ACE_Time_Value &delay_time,
+ const ACE_Time_Value &interval);
+
+ /// Cancel Timer
+ virtual int cancel_timer (long timer_id);
+
+ /// Get the native impl.
+ ACE_Timer_Queue& impl (void);
+
+protected:
+ /// The Timer Queue
+ ACE_Timer_Heap timer_queue_;
+
+private:
+ /// Release
+ virtual void release (void);
+};
+
+TAO_END_VERSIONED_NAMESPACE_DECL
+
+#include /**/ "ace/post.h"
+#endif /* TAO_Notify_TIMER_QUEUE_H */
diff --git a/TAO/orbsvcs/orbsvcs/Notify/Timer_Reactor.cpp b/TAO/orbsvcs/orbsvcs/Notify/Timer_Reactor.cpp
new file mode 100644
index 00000000000..8109a230c30
--- /dev/null
+++ b/TAO/orbsvcs/orbsvcs/Notify/Timer_Reactor.cpp
@@ -0,0 +1,50 @@
+// $Id$
+
+#include "orbsvcs/Notify/Timer_Reactor.h"
+
+ACE_RCSID (Notify,
+ Timer_Reactor,
+ "$Id$")
+
+#include "orbsvcs/Notify/Properties.h"
+#include "tao/ORB_Core.h"
+#include "ace/Reactor.h"
+
+
+TAO_BEGIN_VERSIONED_NAMESPACE_DECL
+
+TAO_Notify_Timer_Reactor::TAO_Notify_Timer_Reactor (void)
+ :reactor_ (0)
+{
+ // Get the ORB
+ CORBA::ORB_var orb = TAO_Notify_PROPERTIES::instance()->orb ();
+
+ this->reactor_ = orb->orb_core ()->reactor ();
+}
+
+TAO_Notify_Timer_Reactor::~TAO_Notify_Timer_Reactor ()
+{
+}
+
+void
+TAO_Notify_Timer_Reactor::release (void)
+{
+ delete this;
+ //@@ inform factory
+}
+
+long
+TAO_Notify_Timer_Reactor::schedule_timer (ACE_Event_Handler *handler,
+ const ACE_Time_Value &delay_time,
+ const ACE_Time_Value &interval)
+{
+ return this->reactor_->schedule_timer (handler, 0, delay_time, interval);
+}
+
+int
+TAO_Notify_Timer_Reactor::cancel_timer (long timer_id)
+{
+ return this->reactor_->cancel_timer (timer_id);
+}
+
+TAO_END_VERSIONED_NAMESPACE_DECL
diff --git a/TAO/orbsvcs/orbsvcs/Notify/Timer_Reactor.h b/TAO/orbsvcs/orbsvcs/Notify/Timer_Reactor.h
new file mode 100644
index 00000000000..31ef686604c
--- /dev/null
+++ b/TAO/orbsvcs/orbsvcs/Notify/Timer_Reactor.h
@@ -0,0 +1,66 @@
+// -*- C++ -*-
+
+/**
+ * @file Timer_Reactor.h
+ *
+ * $Id$
+ *
+ * @author Pradeep Gore <pradeep@oomworks.com>
+ */
+
+#ifndef TAO_Notify_TIMER_REACTOR_H
+#define TAO_Notify_TIMER_REACTOR_H
+#include /**/ "ace/pre.h"
+
+#include "orbsvcs/Notify/notify_serv_export.h"
+#include "orbsvcs/Notify/Timer.h"
+
+#if !defined (ACE_LACKS_PRAGMA_ONCE)
+# pragma once
+#endif /* ACE_LACKS_PRAGMA_ONCE */
+
+ACE_BEGIN_VERSIONED_NAMESPACE_DECL
+class ACE_Reactor;
+ACE_END_VERSIONED_NAMESPACE_DECL
+
+TAO_BEGIN_VERSIONED_NAMESPACE_DECL
+
+/**
+ * @class TAO_Notify_Timer_Reactor
+ *
+ * @brief Reactor::instance based timer. The timers are dispatched by
+ * the main thread.
+ */
+class TAO_Notify_Serv_Export TAO_Notify_Timer_Reactor : public TAO_Notify_Timer
+{
+public:
+ typedef TAO_Notify_Refcountable_Guard_T< TAO_Notify_Timer_Reactor > Ptr;
+
+ /// Constuctor
+ TAO_Notify_Timer_Reactor (void);
+
+ /// Destructor
+ virtual ~TAO_Notify_Timer_Reactor ();
+
+
+ /// Schedule a timer
+ virtual long schedule_timer (ACE_Event_Handler *handler,
+ const ACE_Time_Value &delay_time,
+ const ACE_Time_Value &interval);
+
+ /// Cancel Timer
+ virtual int cancel_timer (long timer_id);
+
+protected:
+ /// The instance reactor that we use.
+ ACE_Reactor* reactor_;
+
+private:
+ /// Release
+ virtual void release (void);
+};
+
+TAO_END_VERSIONED_NAMESPACE_DECL
+
+#include /**/ "ace/post.h"
+#endif /* TAO_Notify_TIMER_REACTOR_H */
diff --git a/TAO/orbsvcs/orbsvcs/Notify/Topology_Factory.h b/TAO/orbsvcs/orbsvcs/Notify/Topology_Factory.h
new file mode 100644
index 00000000000..33f313825a6
--- /dev/null
+++ b/TAO/orbsvcs/orbsvcs/Notify/Topology_Factory.h
@@ -0,0 +1,54 @@
+// -*- C++ -*-
+
+/**
+ * @file Topology_Factory.h
+ *
+ * $Id$
+ *
+ * @author Dale Wilson <wilson_d@ociweb.com>
+ */
+
+#ifndef TAO_NOTIFY_TOPOLOGY_FACTORY_H
+#define TAO_NOTIFY_TOPOLOGY_FACTORY_H
+#include /**/ "ace/pre.h"
+
+#include "orbsvcs/Notify/notify_serv_export.h"
+
+#include "ace/Service_Object.h"
+
+#if !defined (ACE_LACKS_PRAGMA_ONCE)
+# pragma once
+#endif /* ACE_LACKS_PRAGMA_ONCE */
+
+#include "tao/Versioned_Namespace.h"
+
+TAO_BEGIN_VERSIONED_NAMESPACE_DECL
+
+namespace TAO_Notify
+{
+ class Topology_Saver;
+ class Topology_Loader;
+
+ /**
+ * @brief Service Object to allow dynamic control of the loaded saver factory.
+ *
+ */
+ class TAO_Notify_Serv_Export Topology_Factory : public ACE_Service_Object
+ {
+ public:
+ /// Create a Saver.
+ /// \return a pointer to a Topology_Saver which must be deleted
+ /// by the caller.
+ virtual Topology_Saver* create_saver () = 0;
+ /// Create a Loader
+ /// \return a pointer to a Topology_Loader which must be deleted
+ /// by the caller.
+ virtual Topology_Loader* create_loader () = 0;
+ virtual ~Topology_Factory ();
+ };
+}
+
+TAO_END_VERSIONED_NAMESPACE_DECL
+
+#include /**/ "ace/post.h"
+#endif
diff --git a/TAO/orbsvcs/orbsvcs/Notify/Topology_Loader.cpp b/TAO/orbsvcs/orbsvcs/Notify/Topology_Loader.cpp
new file mode 100644
index 00000000000..27eeb6ad143
--- /dev/null
+++ b/TAO/orbsvcs/orbsvcs/Notify/Topology_Loader.cpp
@@ -0,0 +1,20 @@
+// $Id$
+
+#include "orbsvcs/Notify/Topology_Loader.h"
+
+TAO_BEGIN_VERSIONED_NAMESPACE_DECL
+
+TAO_Notify::Topology_Loader::Topology_Loader ()
+{
+}
+
+TAO_Notify::Topology_Loader::~Topology_Loader ()
+{
+}
+
+void
+TAO_Notify::Topology_Loader::close (ACE_ENV_SINGLE_ARG_DECL_NOT_USED)
+{
+}
+
+TAO_END_VERSIONED_NAMESPACE_DECL
diff --git a/TAO/orbsvcs/orbsvcs/Notify/Topology_Loader.h b/TAO/orbsvcs/orbsvcs/Notify/Topology_Loader.h
new file mode 100644
index 00000000000..599afa07985
--- /dev/null
+++ b/TAO/orbsvcs/orbsvcs/Notify/Topology_Loader.h
@@ -0,0 +1,84 @@
+// -*- C++ -*-
+
+//=============================================================================
+/**
+ * @file Topology_Loader.h
+ *
+ * $Id$
+ *
+ * @author Jonathan Pollack <pollack_j@ociweb.com>
+ */
+//=============================================================================
+
+#ifndef TOPOLOGY_LOADER_H
+#define TOPOLOGY_LOADER_H
+#include /**/ "ace/pre.h"
+
+#include "orbsvcs/Notify/notify_serv_export.h"
+
+#include "ace/config-all.h"
+
+#if !defined (ACE_LACKS_PRAGMA_ONCE)
+#pragma once
+#endif /* ACE_LACKS_PRAGMA_ONCE */
+
+#include "tao/Versioned_Namespace.h"
+#include "ace/CORBA_macros.h"
+
+TAO_BEGIN_VERSIONED_NAMESPACE_DECL
+
+namespace CORBA
+{
+ class Environment;
+}
+
+namespace TAO_Notify
+{
+
+/// A forward declaration.
+class Topology_Object;
+
+/**
+ * \brief An interface for an object that loads Persistent Topology Information.
+ *
+ * A persistent store must provide an implemention this interface.
+ *
+ */
+class TAO_Notify_Serv_Export Topology_Loader
+{
+public:
+ /// The constructor.
+ Topology_Loader ();
+
+ /// The destructor.
+ virtual ~Topology_Loader ();
+
+ /** \brief Begin the restore process.
+ *
+ * Call this function to start the reload of data from a persistent store.
+ * When the Topology_Loader detects a child object, it should
+ * call the load_child method of the object passed in, then do the same
+ * loading process on the returned object.
+ */
+ virtual void load (Topology_Object *root ACE_ENV_ARG_DECL) = 0;
+
+ /**
+ * \brief Close the loader after loading is complete.
+ *
+ * This is not pure virtual because some loaders may not need to be closed.
+ * The default implementation does nothing.
+ *
+ * There should be a corresponding open, but the signature may
+ * vary based on the type of loader, so we can't include it in the
+ * interface.
+ */
+ virtual void close (ACE_ENV_SINGLE_ARG_DECL);
+};
+
+} // namespace TAO_Notify
+
+TAO_END_VERSIONED_NAMESPACE_DECL
+
+#include /**/ "ace/post.h"
+
+#endif /* TOPOLOGY_LOADER */
diff --git a/TAO/orbsvcs/orbsvcs/Notify/Topology_Object.cpp b/TAO/orbsvcs/orbsvcs/Notify/Topology_Object.cpp
new file mode 100644
index 00000000000..ac174723aa3
--- /dev/null
+++ b/TAO/orbsvcs/orbsvcs/Notify/Topology_Object.cpp
@@ -0,0 +1,151 @@
+// $Id$
+
+#include "orbsvcs/Notify/Topology_Object.h"
+
+#if ! defined (__ACE_INLINE__)
+#include "orbsvcs/Notify/Topology_Object.inl"
+#endif /* __ACE_INLINE__ */
+
+// question: is there a race_conditon with self_changed and children_changed?
+// answer: toplogy_changed and/or children_changed must be set after the change is
+// made, and before the call to child_change.
+// self_changed and children_changed must be cleared before this object and its
+// children have been saved in Topology_Object::save_persistent ().
+// If these rules are followed, the only risk is a (harmless) extra save.
+
+TAO_BEGIN_VERSIONED_NAMESPACE_DECL
+
+namespace TAO_Notify
+{
+ Topology_Savable::~Topology_Savable (void)
+ {
+ }
+
+ void
+ Topology_Savable::reconnect (ACE_ENV_SINGLE_ARG_DECL_NOT_USED)
+ {
+ }
+
+ Topology_Object::Topology_Object ()
+ : TAO_Notify_Object ()
+ , Topology_Savable ()
+ , self_changed_ (false)
+ , children_changed_ (false)
+ , topology_parent_ (0)
+ {
+ }
+
+ Topology_Object::~Topology_Object ()
+ {
+ }
+
+ void
+ Topology_Object::initialize (Topology_Parent* topology_parent ACE_ENV_ARG_DECL_NOT_USED)
+ {
+ ACE_ASSERT (topology_parent != 0 && this->topology_parent_ == 0);
+ this->topology_parent_ = topology_parent;
+ TAO_Notify_Object::initialize (topology_parent);
+ }
+
+ Topology_Parent *
+ Topology_Object::topology_parent () const
+ {
+ return this->topology_parent_;
+ }
+
+
+ Topology_Object *
+ Topology_Object::load_child (const ACE_CString & /*type*/,
+ CORBA::Long /* id */,
+ const NVPList& /* attrs */
+ ACE_ENV_ARG_DECL_NOT_USED)
+ {
+ return 0;
+ }
+
+ bool
+ Topology_Object::is_persistent () const
+ {
+ bool result = false;
+ if (this->qos_properties_.event_reliability().is_valid ())
+ {
+ result = CosNotification::Persistent == this->qos_properties_.event_reliability().value ();
+ }
+ else if (this->topology_parent () != 0)
+ {
+ result = this->topology_parent ()->is_persistent ();
+ }
+ return result;
+ }
+
+ bool
+ Topology_Object::self_change (ACE_ENV_SINGLE_ARG_DECL)
+ {
+ this->self_changed_ = true;
+ return send_change (ACE_ENV_SINGLE_ARG_PARAMETER);
+ }
+
+ bool
+ Topology_Object::send_change (ACE_ENV_SINGLE_ARG_DECL)
+ {
+ bool saving = false;
+ if (is_persistent ())
+ {
+ while (this->self_changed_ || this->children_changed_)
+ {
+ saving = this->change_to_parent (ACE_ENV_SINGLE_ARG_PARAMETER);
+ ACE_CHECK_RETURN (false);
+ if (!saving)
+ {
+ this->self_changed_ = false;
+ this->children_changed_ = false;
+ }
+ }
+ }
+ else
+ {
+ this->self_changed_ = false;
+ this->children_changed_ = false;
+ }
+ return saving;
+ }
+
+ bool
+ Topology_Object::change_to_parent (ACE_ENV_SINGLE_ARG_DECL)
+ {
+ bool result = false;
+ Topology_Parent * parent = this->topology_parent();
+ if (parent != 0)
+ {
+ result = parent->child_change(ACE_ENV_SINGLE_ARG_PARAMETER);
+ ACE_CHECK_RETURN (false);
+ }
+ return result;
+ }
+
+ void
+ Topology_Object::get_id_path (TAO_Notify::IdVec & id_path) const
+ {
+ if (this->topology_parent() != 0)
+ {
+ this->topology_parent()->get_id_path (id_path);
+ }
+ id_path.push_back (this->get_id ());
+ }
+
+ TAO_Notify_Object::ID
+ Topology_Object::get_id () const
+ {
+ // If this assert triggers then implement the
+ // get_id method in the actual class
+ // derived from Topology_Object
+ // or else figure out why this method was called
+ // on an object that doesn't have an id.
+ ACE_ASSERT (false);
+ // if it is called in a release build, provide 'em a value
+ return -1;
+ }
+
+} // namespace TAO_Notify
+
+TAO_END_VERSIONED_NAMESPACE_DECL
diff --git a/TAO/orbsvcs/orbsvcs/Notify/Topology_Object.h b/TAO/orbsvcs/orbsvcs/Notify/Topology_Object.h
new file mode 100644
index 00000000000..53e825c0939
--- /dev/null
+++ b/TAO/orbsvcs/orbsvcs/Notify/Topology_Object.h
@@ -0,0 +1,213 @@
+// -*- C++ -*-
+
+//=============================================================================
+/**
+* @file Topology_Object.h
+*
+* $Id$
+*
+* @author Jonathan Pollack <pollack_j@ociweb.com>
+*/
+//=============================================================================
+
+#ifndef TOPOLOGY_OBJECT_H
+#define TOPOLOGY_OBJECT_H
+#include /**/ "ace/pre.h"
+
+#include "orbsvcs/Notify/Object.h"
+#include "orbsvcs/Notify/Name_Value_Pair.h"
+
+#include "ace/SString.h"
+#include "ace/Vector_T.h"
+
+#if !defined (ACE_LACKS_PRAGMA_ONCE)
+#pragma once
+#endif /* ACE_LACKS_PRAGMA_ONCE */
+
+TAO_BEGIN_VERSIONED_NAMESPACE_DECL
+
+/// \namespace TAO_Notify
+/// \brief A namespace to be used by all of TAO's Notification Service
+/// implementation.
+///
+/// The initial implementation used the TAO_Notify_ prefix rather than
+/// a namespace. As part of the reliable Notification Service project
+/// we started using this TAO_Notify namespace, but there are still
+/// many parts of the Notification Service that are in the global
+/// namespace with a TAO_NS prefix.
+
+// @@ Wouldn't it be better to use something like
+//
+// namespace TAO
+// {
+// namespace Notify {}
+//
+// }
+//
+namespace TAO_Notify
+{
+ class Topology_Saver;
+ class Topology_Parent;
+
+ /// A vector of IDS. Used as a path from the EventChannelFactory to a proxy.
+ typedef ACE_Vector <TAO_Notify_Object::ID> IdVec;
+
+ /// \brief Interface to be implemented by savable topology objects.
+ class TAO_Notify_Serv_Export Topology_Savable
+ {
+ public:
+ /// Destructor.
+ virtual ~Topology_Savable (void);
+
+ /// Save our state to a Topology_Saver.
+ ///
+ /// Use the methods of a Topology_Saver to store all information we want
+ /// persisted. This function is called by our parent, which gives us a
+ /// saver to use. In turn, we must call this function on all of our
+ /// children.
+ /// The implementation should look like:
+ /// bool change = this->self_changed_;
+ /// this->self_changed_ = false;
+ /// this->children_changed_ = false;
+ /// if (is_persistent ())
+ /// {
+ /// bool want_all_children = saver.begin_object(
+ /// this->id(), type, attrs, change ACE_ENV_ARG_PARAMETER);
+ /// ACE_CHECK;
+ /// for all children
+ /// {
+ /// if (want_all_children || child.is_changed())
+ /// {
+ /// child.save_persistent(saver ACE_ENV_ARG_PARAMETER);
+ /// ACE_CHECK;
+ /// }
+ /// }
+ /// for all deleted children
+ /// {
+ /// saver.delete_child(child_type, child_id);
+ /// }
+ /// saver.end_object(this->id(), type ACE_ENV_ARG_PARAMETER);
+ /// )
+ virtual void save_persistent (Topology_Saver& saver ACE_ENV_ARG_DECL) = 0;
+
+ /// Re-establish connections that we had before a shutdown.
+ ///
+ /// After a topology restore, this method is called so we can reconnect
+ /// to any external objects with whom we were interacting. We should
+ /// call the reconnect() method on all of our children to give them
+ /// the chance to do the same.
+ virtual void reconnect (ACE_ENV_SINGLE_ARG_DECL_NOT_USED);
+
+ };
+
+ /// \brief Base class for Persistent Topology Objects.
+ ///
+ /// Topology objects must be derived from this class to allow themselves
+ /// to be persisted.
+ /// Note: virtual inheritance from TopologySavable is unnecessary,
+ /// but HP ACC compiler warns if it's not there.
+ class TAO_Notify_Serv_Export Topology_Object :
+ public virtual TAO_Notify_Object,
+ public virtual Topology_Savable
+ {
+ public:
+ /// The constructor.
+ Topology_Object ();
+
+ /// The destructor.
+ virtual ~Topology_Object ();
+
+ /// Init this object with data from <rhs>.
+ virtual void initialize (Topology_Parent* topology_parent ACE_ENV_ARG_DECL);
+
+ /// \brief Create a child of the appropriate type and return it.
+ ///
+ /// Use "type" as passed in to determine what kind of child (supporting
+ /// the Topology_Object interface) to create and return. Inform it of
+ /// its new ID.
+ virtual Topology_Object* load_child (const ACE_CString & /*type*/,
+ CORBA::Long /* id */,
+ const NVPList& /* attrs */
+ ACE_ENV_ARG_DECL_NOT_USED);
+
+ /// \brief Find the id associated with topology object.
+ ///
+ /// A bit of a hack because id is unknown to Topology_Object
+ /// the get_id returns the same thing as id -- we just need someone
+ /// to find it for us.
+ virtual TAO_Notify_Object::ID get_id () const;
+
+ /// \brief Get the path of id's from the root to this object.
+ void get_id_path (IdVec & id_path) const;
+
+ /// \brief Is there an unsaved change for this object or its children?
+ bool is_changed () const;
+
+ protected:
+ /// \brief Should this object be saved?
+ ///
+ /// This is a way for send_change() and save_persistent() to find out
+ /// if this object has a persistent QoS connection property.
+ /// \return true (default) if object should be saved.
+ virtual bool is_persistent () const;
+
+ /// \brief Method to report change in this object
+ ///
+ /// see also Topology_Parent::child_change ()
+ /// \return false if save will never happen
+ bool self_change (ACE_ENV_SINGLE_ARG_DECL);
+
+ /// \brief pointer to our topological parent
+ ///
+ /// \return 0 if none
+ Topology_Parent * topology_parent () const;
+
+ /// \brief Handle details of propagating change
+ ///
+ /// \return false if save will never happen
+ bool send_change (ACE_ENV_SINGLE_ARG_DECL);
+
+ private:
+ /// \brief Send change to parent.
+ ///
+ /// Override this if you don't expect to have a parent
+ /// (top level of tree)
+ /// private virtual because this should only be called from send_change()
+ /// \return false if save will never happen
+ virtual bool change_to_parent (ACE_ENV_SINGLE_ARG_DECL);
+
+ protected:
+ /// true if this object changed since last save_persistent
+ bool self_changed_;
+ /// true of any of this object's children changed since last save_persistent
+ bool children_changed_;
+
+ /// A safely-typed copy of parent_;
+ Topology_Parent * topology_parent_;
+ };
+
+ /// \brief Interface for topology objects that act as parents.
+ ///
+ /// Any topology object which contains other topology objects
+ /// must implement this interface so that it's children can signal
+ /// that they have changed.
+ class TAO_Notify_Serv_Export Topology_Parent : public Topology_Object
+ {
+ public:
+ /// Called by a child that has changed.
+ /// A child calls this method to report that it has changed.
+ /// \return false if save will never happen
+ bool child_change (ACE_ENV_SINGLE_ARG_DECL);
+ };
+
+} // namespace TAO_Notify
+
+TAO_END_VERSIONED_NAMESPACE_DECL
+
+#if defined (__ACE_INLINE__)
+#include "orbsvcs/Notify/Topology_Object.inl"
+#endif /* __ACE_INLINE__ */
+
+#include /**/ "ace/post.h"
+
+#endif /* TOPOLOGY_OBJECT */
diff --git a/TAO/orbsvcs/orbsvcs/Notify/Topology_Object.inl b/TAO/orbsvcs/orbsvcs/Notify/Topology_Object.inl
new file mode 100644
index 00000000000..14363a16d6f
--- /dev/null
+++ b/TAO/orbsvcs/orbsvcs/Notify/Topology_Object.inl
@@ -0,0 +1,26 @@
+// -*- C++ -*-
+//
+// $Id$
+
+TAO_BEGIN_VERSIONED_NAMESPACE_DECL
+
+namespace TAO_Notify
+{
+ ACE_INLINE
+ bool
+ Topology_Object::is_changed () const
+ {
+ return this->self_changed_ | this->children_changed_;
+ }
+
+ ACE_INLINE
+ bool
+ Topology_Parent::child_change (ACE_ENV_SINGLE_ARG_DECL)
+ {
+ this->children_changed_ = true;
+ return send_change (ACE_ENV_SINGLE_ARG_PARAMETER);
+ }
+
+} // namespace TAO_Notify
+
+TAO_END_VERSIONED_NAMESPACE_DECL
diff --git a/TAO/orbsvcs/orbsvcs/Notify/Topology_Saver.cpp b/TAO/orbsvcs/orbsvcs/Notify/Topology_Saver.cpp
new file mode 100644
index 00000000000..65c9aa9f681
--- /dev/null
+++ b/TAO/orbsvcs/orbsvcs/Notify/Topology_Saver.cpp
@@ -0,0 +1,16 @@
+// $Id$
+
+#include "orbsvcs/Notify/Topology_Saver.h"
+
+TAO_BEGIN_VERSIONED_NAMESPACE_DECL
+
+TAO_Notify::Topology_Saver::~Topology_Saver ()
+{
+}
+
+void
+TAO_Notify::Topology_Saver::close (ACE_ENV_SINGLE_ARG_DECL_NOT_USED)
+{
+}
+
+TAO_END_VERSIONED_NAMESPACE_DECL
diff --git a/TAO/orbsvcs/orbsvcs/Notify/Topology_Saver.h b/TAO/orbsvcs/orbsvcs/Notify/Topology_Saver.h
new file mode 100644
index 00000000000..91648109b7a
--- /dev/null
+++ b/TAO/orbsvcs/orbsvcs/Notify/Topology_Saver.h
@@ -0,0 +1,114 @@
+// -*- C++ -*-
+
+//=============================================================================
+/**
+* @file Topology_Saver.h
+*
+* $Id$
+*
+* @author Jonathan Pollack <pollack_j@ociweb.com>
+*/
+//=============================================================================
+
+#ifndef TOPOLOGY_SAVER_H
+#define TOPOLOGY_SAVER_H
+#include /**/ "ace/pre.h"
+
+#include "orbsvcs/Notify/Topology_Object.h"
+#include "orbsvcs/Notify/notify_serv_export.h"
+
+#include "ace/SString.h"
+
+#if !defined (ACE_LACKS_PRAGMA_ONCE)
+#pragma once
+#endif /* ACE_LACKS_PRAGMA_ONCE */
+
+TAO_BEGIN_VERSIONED_NAMESPACE_DECL
+
+namespace TAO_Notify
+{
+ /**
+ * \brief An interface to be implemented by objects that save Topology.
+ *
+ * A persistent topology store must provide an implemention this interface.
+ *
+ */
+ class TAO_Notify_Serv_Export Topology_Saver
+ {
+ public:
+
+ /// The destructor.
+ virtual ~Topology_Saver ();
+
+ /** \brief Begin the storage of an object.
+ *
+ * Call this function with the type and ID of an object to be stored.
+ * This object may have children, and this will necessitate nested calls
+ * to begin_object.
+ * Design principle:
+ * Names should be descriptive enough to allow the objects' parent to create
+ * an instance of the desired class. This instance will be registered
+ * with the poa using the id.
+ * The instance itself should will load its own attributes.
+ * Example <proxy type="push_supplier" events="any" id="20"...> is not a
+ * good design because the name "proxy" is not descriptive enough.
+ * "<structured_proxy_push_supplier id="20"...> is better because this
+ * allows the parent to create the correct type of object without decoding
+ * attributes.
+ * \param id numeric id for this object
+ * \param type string containing the unique type name for this class of objects
+ * \param attrs a collection of name/value attributes
+ * \param change true if this object's attributes have changed.
+ * \return bool want_all_children. If true even changed children should be saved.
+ */
+ virtual bool begin_object (CORBA::Long id,
+ const ACE_CString &type,
+ const NVPList& attrs,
+ bool changed
+ ACE_ENV_ARG_DECL) = 0;
+
+ /** \brief Report deleted children to the saver.
+ *
+ * Use the ID and "type" as passed in to determine which child we should
+ * delete. A parent should call this function when one of its children
+ * is deleted.
+ * \param id numeric id for the deleted child
+ * \param type the type name for the class of the deleted child.
+ *
+ */
+ virtual void delete_child (
+ CORBA::Long id,
+ const ACE_CString & type
+ ACE_ENV_ARG_DECL_NOT_USED)
+ {
+ ACE_UNUSED_ARG (id);
+ ACE_UNUSED_ARG (type);
+ }
+
+ /** \brief End the storage of an object.
+ *
+ * This function should be called to end the scope of the current object
+ * and commit it to the persistent store.
+ */
+ virtual void end_object (CORBA::Long id,
+ const ACE_CString &type
+ ACE_ENV_ARG_DECL) = 0;
+
+ /**
+ * \brief Close the saver.
+ *
+ * This is not pure virtual. The default implementation does nothing.
+ *
+ * There should be a corresponding open, but the signature may
+ * vary based on the type of saver, so we can't include it in the
+ * interface.
+ */
+ virtual void close (ACE_ENV_SINGLE_ARG_DECL);
+ };
+} // namespace TAO_Notify
+
+TAO_END_VERSIONED_NAMESPACE_DECL
+
+#include /**/ "ace/post.h"
+
+#endif /* TOPOLOGY_SAVER */
diff --git a/TAO/orbsvcs/orbsvcs/Notify/Worker_Task.cpp b/TAO/orbsvcs/orbsvcs/Notify/Worker_Task.cpp
new file mode 100644
index 00000000000..6fb6d3c2e6b
--- /dev/null
+++ b/TAO/orbsvcs/orbsvcs/Notify/Worker_Task.cpp
@@ -0,0 +1,22 @@
+// $Id$
+
+#include "orbsvcs/Notify/Worker_Task.h"
+
+ACE_RCSID(Notify, TAO_Notify_Worker_Task, "$Id$")
+
+TAO_BEGIN_VERSIONED_NAMESPACE_DECL
+
+TAO_Notify_Worker_Task::TAO_Notify_Worker_Task (void)
+{
+}
+
+TAO_Notify_Worker_Task::~TAO_Notify_Worker_Task ()
+{
+}
+
+void
+TAO_Notify_Worker_Task::update_qos_properties (const TAO_Notify_QoSProperties& /*qos_properties*/)
+{
+}
+
+TAO_END_VERSIONED_NAMESPACE_DECL
diff --git a/TAO/orbsvcs/orbsvcs/Notify/Worker_Task.h b/TAO/orbsvcs/orbsvcs/Notify/Worker_Task.h
new file mode 100644
index 00000000000..b1e529c56bd
--- /dev/null
+++ b/TAO/orbsvcs/orbsvcs/Notify/Worker_Task.h
@@ -0,0 +1,71 @@
+// -*- C++ -*-
+
+/**
+ * @file Worker_Task.h
+ *
+ * $Id$
+ *
+ * @author Pradeep Gore <pradeep@oomworks.com>
+ */
+
+#ifndef TAO_Notify_WORKER_TASK_H
+#define TAO_Notify_WORKER_TASK_H
+
+#include /**/ "ace/pre.h"
+
+#include "orbsvcs/Notify/notify_serv_export.h"
+
+#if !defined (ACE_LACKS_PRAGMA_ONCE)
+# pragma once
+#endif /* ACE_LACKS_PRAGMA_ONCE */
+
+#include "orbsvcs/Notify/Method_Request.h"
+#include "orbsvcs/Notify/Refcountable.h"
+
+TAO_BEGIN_VERSIONED_NAMESPACE_DECL
+
+class TAO_Notify_AdminProperties;
+class TAO_Notify_QoSProperties;
+class TAO_Notify_Timer;
+class TAO_Notify_Buffering_Strategy;
+
+/**
+ * @class TAO_Notify_Worker_Task
+ *
+ * @brief Base Worker Task.
+ *
+ * Memory Management : The Worker Task should be allocated on the heap and
+ * the <shutdown> method should be called to release memory.
+ *
+ */
+class TAO_Notify_Serv_Export TAO_Notify_Worker_Task : public TAO_Notify_Refcountable
+{
+public:
+ typedef TAO_Notify_Refcountable_Guard_T< TAO_Notify_Worker_Task > Ptr;
+
+ /// Constuctor
+ TAO_Notify_Worker_Task (void);
+
+ /// Update QoS Properties.
+ virtual void update_qos_properties (const TAO_Notify_QoSProperties& qos_properties);
+
+ ///= Public method to be implemented by subclasses.
+ /// Exec the request.
+ virtual void execute (TAO_Notify_Method_Request& method_request ACE_ENV_ARG_DECL) = 0;
+
+ /// Shutdown task
+ virtual void shutdown (void) = 0;
+
+ /// The object used by clients to register timers.
+ virtual TAO_Notify_Timer* timer (void) = 0;
+
+
+protected:
+ /// Destructor
+ virtual ~TAO_Notify_Worker_Task ();
+};
+
+TAO_END_VERSIONED_NAMESPACE_DECL
+
+#include /**/ "ace/post.h"
+#endif /* TAO_Notify_WORKER_TASK_H */
diff --git a/TAO/orbsvcs/orbsvcs/Notify/XML_Loader.cpp b/TAO/orbsvcs/orbsvcs/Notify/XML_Loader.cpp
new file mode 100644
index 00000000000..7dd33e5deb6
--- /dev/null
+++ b/TAO/orbsvcs/orbsvcs/Notify/XML_Loader.cpp
@@ -0,0 +1,234 @@
+// $Id$
+
+#include "orbsvcs/Notify/XML_Loader.h"
+#include "orbsvcs/Notify/Topology_Object.h"
+
+#include "ACEXML/common/DefaultHandler.h"
+#include "ACEXML/parser/parser/Parser.h"
+#include "ACEXML/common/FileCharStream.h"
+
+#include "ace/Containers_T.h"
+#include "tao/debug.h"
+#include "ace/OS_NS_unistd.h"
+
+//#define DEBUG_LEVEL 9
+#ifndef DEBUG_LEVEL
+# define DEBUG_LEVEL TAO_debug_level
+#endif //DEBUG_LEVEL
+
+using namespace TAO_Notify;
+
+TAO_BEGIN_VERSIONED_NAMESPACE_DECL
+
+namespace TAO_Notify {
+ extern const char TOPOLOGY_ID_NAME[];
+}
+
+TAO_END_VERSIONED_NAMESPACE_DECL
+
+namespace {
+ CORBA::Long makeNVPList (NVPList& nvp, ACEXML_Attributes* attrs)
+ {
+ CORBA::Long id = 0;
+ for (size_t i = 0; i < attrs->getLength (); ++i)
+ {
+ const char * name = attrs->getQName (i);
+ const char * value = attrs->getValue (i);
+ if (ACE_OS::strcmp (name,
+ TAO_VERSIONED_NAMESPACE_NAME::TAO_Notify::TOPOLOGY_ID_NAME) == 0)
+ {
+ id = ACE_OS::atoi (value);
+ }
+ nvp.push_back (NVP (name, value));
+ }
+ return id;
+ }
+}
+
+TAO_BEGIN_VERSIONED_NAMESPACE_DECL
+
+namespace TAO_Notify
+{
+ XML_Loader::XML_Loader ()
+ : input_ (0)
+ , live_ (false)
+ {
+ }
+
+ XML_Loader::~XML_Loader ()
+ {
+ }
+
+ bool
+ XML_Loader::open (const ACE_CString & base_name)
+ {
+ bool result = false;
+
+ // if *.xml exists, use it
+ // if it does not exist then
+ // use the previous one was renamed to *.000
+ // If neither *.xml nor *.000 exist then something
+ // "impossible" happened (or its a new system with no saved state).
+
+ this->file_name_ = base_name;
+ this->file_name_ += ".xml";
+
+ // 4 is "read permission"
+ result = (0 == ACE_OS::access (this->file_name_.c_str (), 4));
+ if (result)
+ {
+ this->live_ = false;
+ ACEXML_FileCharStream* fstm = new ACEXML_FileCharStream;
+ // xml input source will take ownership
+
+ if (fstm->open (this->file_name_.c_str ()) == 0)
+ {
+ // InputSource takes ownership
+ ACEXML_InputSource input (fstm);
+
+ ACEXML_Parser parser;
+ parser.setContentHandler (this);
+ parser.setDTDHandler (this);
+ parser.setErrorHandler (this);
+ parser.setEntityResolver (this);
+
+ ACEXML_TRY_NEW_ENV
+ {
+ parser.parse (&input ACEXML_ENV_ARG_PARAMETER);
+ ACEXML_TRY_CHECK;
+ }
+ ACEXML_CATCH (ACEXML_Exception, ex)
+ {
+ // The only way to find out what it is, it to let it print itself, so...
+ ACE_ERROR ((LM_ERROR, "Unable to load \"%s\".\n Will try backup file.\n", this->file_name_.c_str ()));
+ ex.print ();
+ result = false;
+ }
+ ACEXML_ENDTRY;
+ }
+ else
+ {
+ ACE_DEBUG((LM_DEBUG, ACE_TEXT("Unable to open the XML input file: %s.\n Will try backup file.\n"), file_name_.c_str()));
+ result = false;
+ }
+ }
+
+ if (! result)
+ {
+ this->file_name_ = base_name;
+ this->file_name_ += ".000";
+ result = (0 == ACE_OS::access (this->file_name_.c_str (), 4));
+ }
+ return result;
+ }
+
+ //virtual
+ void
+ XML_Loader::load (Topology_Object *root ACE_ENV_ARG_DECL)
+ {
+ ACE_ASSERT (root != 0);
+ this->live_ = true;
+
+ ACEXML_FileCharStream* fstm = new ACEXML_FileCharStream;
+ // xml input source will take ownership
+
+ if (fstm->open (this->file_name_.c_str ()) == 0)
+ {
+ // InputSource takes ownership
+ ACEXML_InputSource input (fstm);
+
+ ACEXML_Parser parser;
+ parser.setContentHandler (this);
+ parser.setDTDHandler (this);
+ parser.setErrorHandler (this);
+ parser.setEntityResolver (this);
+
+ ACEXML_TRY_NEW_ENV
+ {
+ object_stack_.push (root);
+ parser.parse (&input ACEXML_ENV_ARG_PARAMETER);
+ ACEXML_TRY_CHECK;
+ ACE_ASSERT (object_stack_.size () == 1);
+ Topology_Object* cur;
+ object_stack_.pop (cur);
+ }
+ ACEXML_CATCH (ACEXML_Exception, ex)
+ {
+ // The only way to find out what it is, it to let it print itself, so...
+ ACE_ERROR ((LM_ERROR, "Unable to load \"%s\".\n", this->file_name_.c_str ()));
+ ex.print ();
+ ACE_THROW(CORBA::INTERNAL());
+ }
+ ACEXML_ENDTRY;
+ }
+ else
+ {
+ ACE_DEBUG((LM_DEBUG, ACE_TEXT("Unable to open the XML input file: %s.\n"), file_name_.c_str()));
+ ACE_THROW(CORBA::INTERNAL());
+ }
+ }
+
+ void
+ XML_Loader::startElement (const ACEXML_Char*,
+ const ACEXML_Char*,
+ const ACEXML_Char* name,
+ ACEXML_Attributes* xml_attrs ACEXML_ENV_ARG_DECL)
+ ACE_THROW_SPEC ( (ACEXML_SAXException))
+ {
+ ACE_ASSERT (name != 0);
+ ACE_ASSERT (xml_attrs != 0);
+ if (this->live_)
+ {
+ ACE_ASSERT (object_stack_.size () > 0);
+ Topology_Object* cur = 0;
+ if (object_stack_.top (cur) == 0)
+ {
+ ACE_DECLARE_NEW_ENV;
+ ACE_TRY
+ {
+ NVPList attrs;
+ CORBA::Long id = makeNVPList (attrs, xml_attrs);
+
+ if (DEBUG_LEVEL > 5) ACE_DEBUG ((LM_INFO,
+ ACE_TEXT("(%P|%t) XML_Loader: Element %s\n"),
+ name
+ ));
+
+ ACE_CString cname (name);
+ Topology_Object* next = cur->load_child (
+ cname, id, attrs ACE_ENV_ARG_PARAMETER);
+ ACE_ASSERT(next != 0);
+ ACE_TRY_CHECK;
+ object_stack_.push (next);
+ }
+ ACE_CATCHANY
+ {
+ ACEXML_THROW (ACEXML_SAXException (ACE_ANY_EXCEPTION._info ().c_str ()));
+ }
+ ACE_ENDTRY;
+ }
+ }
+ }
+
+ void
+ XML_Loader::endElement (const ACEXML_Char*,
+ const ACEXML_Char*,
+ const ACEXML_Char* name ACEXML_ENV_ARG_DECL_NOT_USED)
+ ACE_THROW_SPEC ( (ACEXML_SAXException))
+ {
+ ACE_UNUSED_ARG (name);
+ if (this->live_)
+ {
+ ACE_ASSERT (object_stack_.size () > 0);
+ if (DEBUG_LEVEL > 5) ACE_DEBUG ((LM_INFO,
+ ACE_TEXT("(%P|%t) XML_Loader: End Element %s\n"),
+ name
+ ));
+ Topology_Object* cur;
+ object_stack_.pop (cur);
+ }
+ }
+
+} /* namespace TAO_Notify */
+
+TAO_END_VERSIONED_NAMESPACE_DECL
diff --git a/TAO/orbsvcs/orbsvcs/Notify/XML_Loader.h b/TAO/orbsvcs/orbsvcs/Notify/XML_Loader.h
new file mode 100644
index 00000000000..7069179d9bd
--- /dev/null
+++ b/TAO/orbsvcs/orbsvcs/Notify/XML_Loader.h
@@ -0,0 +1,87 @@
+// -*- C++ -*-
+
+//=============================================================================
+/**
+ * @file XML_Loader.h
+ *
+ * $Id$
+ *
+ * A topology saver class that outputs XML.
+ *
+ * @author Jonathan Pollack <pollack_j@ociweb.com>
+ */
+//=============================================================================
+
+#ifndef XML_LOADER_H
+#define XML_LOADER_H
+#include /**/ "ace/pre.h"
+#include /**/ "ace/config-all.h"
+
+#if !defined (ACE_LACKS_PRAGMA_ONCE)
+#pragma once
+#endif /* ACE_LACKS_PRAGMA_ONCE */
+
+#include "orbsvcs/Notify/Topology_Loader.h"
+
+#include "ACEXML/common/DefaultHandler.h"
+#include "ACEXML/parser/parser/Parser.h"
+#include "ACEXML/common/FileCharStream.h"
+
+#include "ace/streams.h"
+
+TAO_BEGIN_VERSIONED_NAMESPACE_DECL
+
+namespace TAO_Notify
+{
+ /// \brief Load Notification Service Topology from an XML file.
+class XML_Loader : public ACEXML_DefaultHandler , public Topology_Loader
+{
+public:
+ /// The constructor.
+ XML_Loader ();
+
+ virtual ~XML_Loader ();
+
+ /// Open a file and perform preliminary validation to determine whether
+ /// the file is complete and valid.
+ bool open (const ACE_CString & file_name);
+
+ ///////////////////////////////////
+ // Override Topology_Loader methods
+ // see Topology_Loader.h for documentation
+ virtual void load (Topology_Object *root ACE_ENV_ARG_DECL);
+
+
+ /////////////////////////////////////////
+ // Override ACEXML_DefaultHandler methods
+
+ virtual void startElement (const ACEXML_Char* namespaceURI,
+ const ACEXML_Char* localName,
+ const ACEXML_Char* qName,
+ ACEXML_Attributes* atts ACEXML_ENV_ARG_DECL)
+ ACE_THROW_SPEC ((ACEXML_SAXException));
+
+ virtual void endElement (const ACEXML_Char*,
+ const ACEXML_Char*,
+ const ACEXML_Char* name ACEXML_ENV_ARG_DECL_NOT_USED)
+ ACE_THROW_SPEC ((ACEXML_SAXException));
+
+
+private:
+ /// The name of the file from which data is read.
+ ACE_CString file_name_;
+ /// A stream representing our current output.
+ FILE * input_;
+
+ typedef ACE_Unbounded_Stack<Topology_Object*> TopoStack;
+ TopoStack object_stack_;
+ // if false, then we're just checking syntax of topology file.
+ bool live_;
+};
+
+} // namespace TAO_Notify
+
+TAO_END_VERSIONED_NAMESPACE_DECL
+
+#include /**/ "ace/post.h"
+#endif /* XML_LOADER_H */
diff --git a/TAO/orbsvcs/orbsvcs/Notify/XML_Saver.cpp b/TAO/orbsvcs/orbsvcs/Notify/XML_Saver.cpp
new file mode 100644
index 00000000000..f6f0864b46f
--- /dev/null
+++ b/TAO/orbsvcs/orbsvcs/Notify/XML_Saver.cpp
@@ -0,0 +1,203 @@
+// $Id$
+
+#include "orbsvcs/Notify/XML_Saver.h"
+
+#include "ACEXML/common/XML_Util.h"
+
+#include "ace/High_Res_Timer.h"
+#include "ace/OS_NS_stdio.h"
+#include "ace/OS_NS_unistd.h"
+
+TAO_BEGIN_VERSIONED_NAMESPACE_DECL
+
+namespace TAO_Notify
+{
+ extern const char TOPOLOGY_ID_NAME[];
+
+ XML_Saver::XML_Saver(bool timestamp)
+ : output_ (0)
+ , close_out_ (false)
+ , backup_count_ (1)
+ , timestamp_ (timestamp)
+ {
+ }
+
+ XML_Saver::~XML_Saver()
+ {
+ if (this->output_ != 0)
+ {
+ ACE_ERROR ((LM_ERROR,
+ ACE_TEXT ("(%P|%t) XML_Saver warning close not called or failed\n")
+ ));
+ }
+ }
+
+ void
+ XML_Saver::backup_file_name (char * file_path, int nfile)
+ {
+ ACE_OS::snprintf(file_path, MAXPATHLEN, "%s.%3.3d",
+ this->base_name_.c_str (),
+ nfile);
+ }
+
+ void
+ XML_Saver::close (ACE_ENV_SINGLE_ARG_DECL)
+ {
+ if (this->close_out_ && this->output_ != 0)
+ {
+ this->end_object(0, "notification_service" ACE_ENV_ARG_PARAMETER);
+ ACE_CHECK;
+
+ ACE_OS::fclose(this->output_);
+ this->output_ = 0;
+
+ // delete the oldest backup file (if it exists)
+ size_t nfile = this->backup_count_ - 1;
+ char old_path [MAXPATHLEN + 1];
+ backup_file_name (old_path, nfile);
+ ACE_OS::unlink (old_path);
+
+ while (nfile != 0)
+ {
+ char new_path [MAXPATHLEN + 1];
+ nfile -= 1;
+ backup_file_name (new_path, nfile);
+ // this may fail, we don't care
+ ACE_OS::rename (new_path, old_path);
+ ACE_OS::strcpy (old_path, new_path);
+ }
+ // old_path now contains the name of the backup file
+ ACE_CString xml_name = this->base_name_;
+ xml_name += ".xml";
+
+ ACE_OS::rename (xml_name.c_str (), old_path);
+
+ ACE_CString new_name = this->base_name_;
+ new_name += ".new";
+ ACE_OS::rename (new_name.c_str (), xml_name.c_str ());
+ }
+ this->output_ = 0;
+ }
+
+ bool
+ XML_Saver::open(const ACE_CString & base_name, size_t backup_count)
+ {
+ this->base_name_ = base_name;
+ this->backup_count_ = backup_count;
+ if (base_name == "cout")
+ {
+ this->output_ = stdout;
+ this->close_out_ = false;
+ }
+ else if (base_name == "cerr")
+ {
+ this->output_ = stderr;
+ this->close_out_ = false;
+ }
+ else
+ {
+ ACE_CString file_name = base_name;
+ file_name += ".new";
+
+ this->output_ = ACE_OS::fopen (file_name.c_str(), ACE_TEXT("wb"));
+ if (this->output_) {
+ this->close_out_ = true;
+ } else {
+ ACE_ERROR ((LM_ERROR,
+ ACE_TEXT ("(%P|%t) XML_Saver unable to open %s\n"),
+ base_name.c_str()));
+ }
+ }
+ if (this->output_ != 0)
+ {
+ FILE *out = this->output_;
+
+ ACE_OS::fprintf (out, "<?xml version=\"1.0\"?>\n");
+
+ ACE_DECLARE_NEW_CORBA_ENV;
+ ACE_TRY
+ {
+ bool changed = true;
+ NVPList attrs;
+
+ ACE_Time_Value now = ACE_High_Res_Timer::gettimeofday();
+
+ ACE_UINT64 nowus = now.usec();
+ static const ACE_UINT64 USECSPERSEC = 1000 * 1000;
+ ACE_UINT64 tmpus = now.sec();
+ nowus += tmpus * USECSPERSEC;
+
+ char nowusstr[128];
+#ifdef ACE_LACKS_LONGLONG_T
+ nowus.as_string(nowusstr);
+#else
+ ACE_OS::sprintf(nowusstr, ACE_UINT64_FORMAT_SPECIFIER, nowus);
+#endif /* ACE_LACKS_LONGLONG_T */
+
+ attrs.push_back(NVP("version", "1.0"));
+ if (this->timestamp_)
+ {
+ attrs.push_back(NVP("timestamp", nowusstr));
+ }
+ this->begin_object(0, "notification_service", attrs, changed ACE_ENV_ARG_PARAMETER);
+ ACE_TRY_CHECK;
+ }
+ ACE_CATCHANY
+ {
+ ACE_PRINT_EXCEPTION (ACE_ANY_EXCEPTION,
+ ACE_TEXT ("(%P|%t) XML_Saver Unknown exception\n"));
+ delete this->output_;
+ this->output_ = 0;
+ }
+ ACE_ENDTRY;
+ }
+ return this->output_ != 0;
+ }
+
+ bool XML_Saver::begin_object(CORBA::Long id,
+ const ACE_CString& type,
+ const NVPList& attrs,
+ bool /* changed */
+ ACE_ENV_ARG_DECL_NOT_USED)
+ {
+ ACE_ASSERT(this->output_ != 0);
+
+ FILE *out = this->output_;
+
+ ACE_OS::fprintf (out, "%s%s%s", indent_.c_str(), "<", type.c_str());
+ if (id != 0)
+ {
+ // not all ostreams know what to do with a CORBA::Long
+ long lid = id;
+ ACE_OS::fprintf (out, " %s%s%ld%s", TOPOLOGY_ID_NAME, "=\"", lid, "\"");
+ }
+
+ const size_t BUF_SIZE = 512;
+ ACE_CString tmp(BUF_SIZE);
+ for (size_t idx = 0; idx < attrs.size(); idx++)
+ {
+ ACEXML_escape_string(attrs[idx].value, tmp);
+ ACE_OS::fprintf (out, "%s%s%s%s%s", " ",
+ attrs[idx].name.c_str (), "=\"", tmp.c_str(), "\"");
+ }
+ ACE_OS::fprintf (out, ">\n");
+ this->indent_ += " ";
+ return true;
+ }
+
+ void XML_Saver::end_object (CORBA::Long /* id */,
+ const ACE_CString& type
+ ACE_ENV_ARG_DECL_NOT_USED)
+ {
+ ACE_ASSERT(this->output_ != 0);
+ FILE *out = this->output_;
+ if (this->indent_.length() >= 2)
+ {
+ this->indent_ = this->indent_.substr(2);
+ }
+ ACE_OS::fprintf (out, "%s%s%s%s", indent_.c_str(), "</",
+ type.c_str(), ">\n");
+ }
+} /* namespace TAO_Notify */
+
+TAO_END_VERSIONED_NAMESPACE_DECL
diff --git a/TAO/orbsvcs/orbsvcs/Notify/XML_Saver.h b/TAO/orbsvcs/orbsvcs/Notify/XML_Saver.h
new file mode 100644
index 00000000000..f7c9afb87e1
--- /dev/null
+++ b/TAO/orbsvcs/orbsvcs/Notify/XML_Saver.h
@@ -0,0 +1,87 @@
+// -*- C++ -*-
+
+//=============================================================================
+/**
+ * @file XML_Saver.h
+ *
+ * $Id$
+ *
+ * @author Jonathan Pollack <pollack_j@ociweb.com>
+ */
+//=============================================================================
+
+#ifndef XML_SAVER_H
+#define XML_SAVER_H
+#include /**/ "ace/pre.h"
+
+#include "orbsvcs/Notify/Topology_Saver.h"
+
+#include "ace/streams.h"
+
+#if !defined (ACE_LACKS_PRAGMA_ONCE)
+#pragma once
+#endif /* ACE_LACKS_PRAGMA_ONCE */
+
+TAO_BEGIN_VERSIONED_NAMESPACE_DECL
+
+namespace TAO_Notify
+{
+
+/**
+ * \brief Save Notification Service Topology to an XML file.
+ */
+class XML_Saver : public Topology_Saver
+{
+public:
+ /// Construct an XML_Saver.
+ /// Initialization is deferred to "open()"
+ XML_Saver (bool timestamp = true);
+
+ virtual ~XML_Saver ();
+
+ /// Open the output file.
+ /// \param file_name the fully qualified file name
+ /// \return true if successful
+ bool open (const ACE_CString & file_name, size_t backup_count);
+
+ //////////////////////////////////
+ // Override Topology_Saver methods
+ // see Topology_Saver.h for doc
+ virtual bool begin_object (CORBA::Long id,
+ const ACE_CString& type,
+ const NVPList& attrs,
+ bool changed
+ ACE_ENV_ARG_DECL);
+
+ virtual void end_object (CORBA::Long id,
+ const ACE_CString& type
+ ACE_ENV_ARG_DECL);
+
+ virtual void close (ACE_ENV_SINGLE_ARG_DECL);
+
+private:
+ void backup_file_name (char * file_path, int nfile);
+
+private:
+ /// A stream representing our current output.
+ FILE * output_;
+ bool close_out_;
+
+ /// the name of the output file
+ ACE_CString base_name_;
+ size_t backup_count_;
+
+ /// true to enable timestamping
+ bool timestamp_;
+
+ /// A string consisting of spaces that is our current indentation level.
+ ACE_CString indent_;
+
+};
+
+} // namespace TAO_Notify
+
+TAO_END_VERSIONED_NAMESPACE_DECL
+
+#include /**/ "ace/post.h"
+#endif /* XML_SAVER_H */
diff --git a/TAO/orbsvcs/orbsvcs/Notify/XML_Topology_Factory.cpp b/TAO/orbsvcs/orbsvcs/Notify/XML_Topology_Factory.cpp
new file mode 100644
index 00000000000..8b263987fe8
--- /dev/null
+++ b/TAO/orbsvcs/orbsvcs/Notify/XML_Topology_Factory.cpp
@@ -0,0 +1,162 @@
+// $Id$
+
+#include "orbsvcs/Notify/XML_Topology_Factory.h"
+#include "orbsvcs/Notify/XML_Saver.h"
+#include "orbsvcs/Notify/XML_Loader.h"
+
+#include "tao/debug.h"
+#include "ace/OS_NS_strings.h"
+//#include "ace/Service_Object.h"
+
+
+TAO_BEGIN_VERSIONED_NAMESPACE_DECL
+
+namespace TAO_Notify
+{
+ const char TOPOLOGY_ID_NAME[] = "TopologyID";
+
+ XML_Topology_Factory::XML_Topology_Factory()
+ : save_base_path_ ("./Notification_Service_Topology")
+ , load_base_path_ ("./Notification_Service_Topology")
+ , backup_count_ (2)
+ , timestamp_ (true)
+ {
+ }
+
+ // virtual
+ XML_Topology_Factory::~XML_Topology_Factory ()
+ {
+ }
+
+ // virtual
+ Topology_Saver*
+ XML_Topology_Factory::create_saver ()
+ {
+ XML_Saver *saver = 0;
+
+ ACE_NEW_RETURN (saver, XML_Saver (this->timestamp_), 0);
+
+ if (! saver->open ( this->save_base_path_.c_str (), this->backup_count_))
+ {
+ delete saver;
+ saver = 0;
+ }
+ return static_cast<Topology_Saver *> (saver);
+ }
+
+ // virtual
+ Topology_Loader*
+ XML_Topology_Factory::create_loader()
+ {
+ XML_Loader *loader = 0;
+ ACE_NEW_NORETURN(loader, XML_Loader);
+
+ if (! loader->open(this->load_base_path_))
+ {
+ delete loader;
+ loader = 0;
+ }
+ return static_cast<Topology_Loader *> (loader);
+ }
+
+ // virtual
+ int
+ XML_Topology_Factory::init (int argc, ACE_TCHAR *argv[])
+ {
+ int result = 0;
+ bool verbose = false;
+ for (int narg = 0; narg < argc; ++narg)
+ {
+ ACE_TCHAR * av = argv[narg];
+ if (ACE_OS::strcasecmp (av, "-v") == 0)
+ {
+ verbose = true;
+ ACE_DEBUG ((LM_DEBUG,
+ ACE_TEXT ("(%P|%t) Standard_Event_Persistence: -verbose\n")
+ ));
+ }
+ else if (ACE_OS::strcasecmp (av, "-base_path") == 0 && narg + 1 < argc)
+ {
+ this->save_base_path_ = argv[narg + 1];
+ this->load_base_path_ = argv[narg + 1];
+ if (TAO_debug_level > 0 || verbose)
+ {
+ ACE_DEBUG ((LM_DEBUG,
+ ACE_TEXT ("(%P|%t) XML_TopologyFactory: Setting -base_path: %s\n"),
+ this->save_base_path_.c_str ()
+ ));
+ }
+ narg += 1;
+ }
+ else if (ACE_OS::strcasecmp (av, "-save_base_path") == 0 && narg + 1 < argc)
+ {
+ this->save_base_path_ = argv[narg + 1];
+ if (TAO_debug_level > 0 || verbose)
+ {
+ ACE_DEBUG ((LM_DEBUG,
+ ACE_TEXT ("(%P|%t) XML_TopologyFactory: Setting -save_base_path: %s\n"),
+ this->save_base_path_.c_str ()
+ ));
+ }
+ narg += 1;
+ }
+ else if (ACE_OS::strcasecmp (av, "-load_base_path") == 0 && narg + 1 < argc)
+ {
+ this->load_base_path_ = argv[narg + 1];
+ if (TAO_debug_level > 0 || verbose)
+ {
+ ACE_DEBUG ((LM_DEBUG,
+ ACE_TEXT ("(%P|%t) XML_TopologyFactory: Setting -load_base_path: %s\n"),
+ this->load_base_path_.c_str ()
+ ));
+ }
+ narg += 1;
+ }
+ else if (ACE_OS::strcasecmp (av, "-backup_count") == 0 && narg + 1 < argc)
+ {
+ this->backup_count_ = ACE_OS::atoi(argv[narg + 1]);
+ if (TAO_debug_level > 0 || verbose)
+ {
+ ACE_DEBUG ((LM_DEBUG,
+ ACE_TEXT ("(%P|%t) XML_TopologyFactory: Setting -file_count: %d\n"),
+ this->backup_count_
+ ));
+ }
+ narg += 1;
+ }
+ else if (ACE_OS::strcasecmp (av, "-no_timestamp") == 0)
+ {
+ this->timestamp_ = false;
+ if (TAO_debug_level > 0 || verbose)
+ {
+ ACE_DEBUG ((LM_DEBUG,
+ ACE_TEXT ("(%P|%t) XML_TopologyFactory: Setting -no_timestamp\n")
+ ));
+ }
+ }
+ else
+ {
+ ACE_ERROR ((LM_ERROR,
+ ACE_TEXT ("(%P|%t) Unknown parameter to XML Topology Factory: %s\n"),
+ argv[narg]
+ ));
+ result = -1;
+ }
+ }
+ return result;
+ }
+
+ // virtual
+ int
+ XML_Topology_Factory::fini ()
+ {
+ // nothing to do yet
+ return 0;
+ }
+} /* namespace TAO_Notify */
+
+TAO_END_VERSIONED_NAMESPACE_DECL
+
+ACE_FACTORY_NAMESPACE_DEFINE (TAO_Notify_Persist,
+ TAO_Notify_XML_Topology_Factory,
+ TAO_Notify::XML_Topology_Factory)
diff --git a/TAO/orbsvcs/orbsvcs/Notify/XML_Topology_Factory.h b/TAO/orbsvcs/orbsvcs/Notify/XML_Topology_Factory.h
new file mode 100644
index 00000000000..b6dc0686d8a
--- /dev/null
+++ b/TAO/orbsvcs/orbsvcs/Notify/XML_Topology_Factory.h
@@ -0,0 +1,85 @@
+// -*- C++ -*-
+
+//=============================================================================
+/**
+ * @file XML_Topology_Factory.h
+ *
+ * $Id$
+ *
+ * @author Jonathan Pollack <pollack_j@ociweb.com>
+ */
+//=============================================================================
+
+#ifndef XML_TOPOLOGY_FACTORY_H
+#define XML_TOPOLOGY_FACTORY_H
+#include /**/ "ace/pre.h"
+
+#include "orbsvcs/Notify/Topology_Factory.h"
+#include "orbsvcs/Notify/notify_persist_export.h"
+
+#include "tao/corba.h"
+#include "ace/SString.h"
+
+
+#if !defined (ACE_LACKS_PRAGMA_ONCE)
+#pragma once
+#endif /* ACE_LACKS_PRAGMA_ONCE */
+
+TAO_BEGIN_VERSIONED_NAMESPACE_DECL
+
+namespace TAO_Notify
+{
+ extern const char TOPOLOGY_ID_NAME[];
+
+ /**
+ * \brief Create XML topology savers and loaders
+ *
+ * Loaded by a svc.conf line like:
+ * dynamic Topology_Factory Service_Object* TAO_CosNotificationd:_make_XML_Topology_Factory() "[arguments]"
+ * where arguments are:
+ * -base_path Base path (directory and filename) for both saving and loading.
+ * .xml will be appended to the base path
+ * Default is ./Notification_Service_Topology
+ * -save_base_path Base path for saving.
+ * -load_base_path Base path for loading.
+ * -file_count How many backup copies to keep. Default is 1
+ * -no_timestamp Disable timestamping (makes files diffable)
+ * Note: you can set both saving and storing to the same file using -base_path
+ * Or you can set them independently using -save_base_path
+ * and -load_base_path
+ *
+ */
+ class TAO_Notify_Persist_Export XML_Topology_Factory : public Topology_Factory
+ {
+ public:
+ /// The constructor.
+ XML_Topology_Factory ();
+ virtual ~XML_Topology_Factory ();
+
+ ////////////////////////////////////
+ // Override Topology_Factory methods
+ // documented in Topology_Factory.h
+ virtual Topology_Saver* create_saver ();
+ virtual Topology_Loader* create_loader();
+
+ ////////////////////////////////
+ // Override Share_Object methods
+ // documented in ace/Shared_Object.h
+ virtual int init (int argc, ACE_TCHAR *argv[]);
+ virtual int fini ();
+
+ private:
+ ACE_CString save_base_path_;
+ ACE_CString load_base_path_;
+ size_t backup_count_;
+ bool timestamp_;
+ };
+
+} // namespace TAO_Notify
+
+TAO_END_VERSIONED_NAMESPACE_DECL
+
+ACE_FACTORY_DECLARE (TAO_Notify_Persist, TAO_Notify_XML_Topology_Factory)
+
+#include /**/ "ace/post.h"
+#endif /* XML_TOPOLOGY_FACTORY_H */
diff --git a/TAO/orbsvcs/orbsvcs/Notify/notify_export.h b/TAO/orbsvcs/orbsvcs/Notify/notify_export.h
new file mode 100644
index 00000000000..d17be740d41
--- /dev/null
+++ b/TAO/orbsvcs/orbsvcs/Notify/notify_export.h
@@ -0,0 +1,40 @@
+
+// -*- C++ -*-
+// $Id$
+// Definition for Win32 Export directives.
+// This file is generated automatically by generate_export_file.pl
+// ------------------------------
+#ifndef TAO_NOTIFY_EXPORT_H
+#define TAO_NOTIFY_EXPORT_H
+
+#include "ace/config-all.h"
+
+#if defined (TAO_AS_STATIC_LIBS)
+# if !defined (TAO_NOTIFY_HAS_DLL)
+# define TAO_NOTIFY_HAS_DLL 0
+# endif /* ! TAO_NOTIFY_HAS_DLL */
+#else
+# if !defined (TAO_NOTIFY_HAS_DLL)
+# define TAO_NOTIFY_HAS_DLL 1
+# endif /* ! TAO_NOTIFY_HAS_DLL */
+#endif
+
+#if defined (TAO_NOTIFY_HAS_DLL) && (TAO_NOTIFY_HAS_DLL == 1)
+# if defined (TAO_NOTIFY_BUILD_DLL)
+# define TAO_Notify_Export ACE_Proper_Export_Flag
+# define TAO_NOTIFY_SINGLETON_DECLARATION(T) ACE_EXPORT_SINGLETON_DECLARATION (T)
+# define TAO_NOTIFY_SINGLETON_DECLARE(SINGLETON_TYPE, CLASS, LOCK) ACE_EXPORT_SINGLETON_DECLARE(SINGLETON_TYPE, CLASS, LOCK)
+# else /* TAO_NOTIFY_BUILD_DLL */
+# define TAO_Notify_Export ACE_Proper_Import_Flag
+# define TAO_NOTIFY_SINGLETON_DECLARATION(T) ACE_IMPORT_SINGLETON_DECLARATION (T)
+# define TAO_NOTIFY_SINGLETON_DECLARE(SINGLETON_TYPE, CLASS, LOCK) ACE_IMPORT_SINGLETON_DECLARE(SINGLETON_TYPE, CLASS, LOCK)
+# endif /* TAO_NOTIFY_BUILD_DLL */
+#else /* TAO_NOTIFY_HAS_DLL == 1 */
+# define TAO_Notify_Export
+# define TAO_NOTIFY_SINGLETON_DECLARATION(T)
+# define TAO_NOTIFY_SINGLETON_DECLARE(SINGLETON_TYPE, CLASS, LOCK)
+#endif /* TAO_NOTIFY_HAS_DLL == 1 */
+
+#endif /* TAO_NOTIFY_EXPORT_H */
+
+// End of auto generated file.
diff --git a/TAO/orbsvcs/orbsvcs/Notify/notify_persist_export.h b/TAO/orbsvcs/orbsvcs/Notify/notify_persist_export.h
new file mode 100644
index 00000000000..ae5ef11a7b9
--- /dev/null
+++ b/TAO/orbsvcs/orbsvcs/Notify/notify_persist_export.h
@@ -0,0 +1,60 @@
+
+// -*- C++ -*-
+// $Id$
+// Definition for Win32 Export directives.
+// This file is generated automatically by generate_export_file.pl TAO_Notify_Persist
+// ------------------------------
+#ifndef TAO_NOTIFY_PERSIST_EXPORT_H
+#define TAO_NOTIFY_PERSIST_EXPORT_H
+
+#include "ace/config-all.h"
+
+#if defined (TAO_AS_STATIC_LIBS)
+# if !defined (TAO_NOTIFY_PERSIST_HAS_DLL)
+# define TAO_NOTIFY_PERSIST_HAS_DLL 0
+# endif /* ! TAO_NOTIFY_PERSIST_HAS_DLL */
+#else
+# if !defined (TAO_NOTIFY_PERSIST_HAS_DLL)
+# define TAO_NOTIFY_PERSIST_HAS_DLL 1
+# endif /* ! TAO_NOTIFY_PERSIST_HAS_DLL */
+#endif
+
+#if defined (TAO_NOTIFY_PERSIST_HAS_DLL) && (TAO_NOTIFY_PERSIST_HAS_DLL == 1)
+# if defined (TAO_NOTIFY_PERSIST_BUILD_DLL)
+# define TAO_Notify_Persist_Export ACE_Proper_Export_Flag
+# define TAO_NOTIFY_PERSIST_SINGLETON_DECLARATION(T) ACE_EXPORT_SINGLETON_DECLARATION (T)
+# define TAO_NOTIFY_PERSIST_SINGLETON_DECLARE(SINGLETON_TYPE, CLASS, LOCK) ACE_EXPORT_SINGLETON_DECLARE(SINGLETON_TYPE, CLASS, LOCK)
+# else /* TAO_NOTIFY_PERSIST_BUILD_DLL */
+# define TAO_Notify_Persist_Export ACE_Proper_Import_Flag
+# define TAO_NOTIFY_PERSIST_SINGLETON_DECLARATION(T) ACE_IMPORT_SINGLETON_DECLARATION (T)
+# define TAO_NOTIFY_PERSIST_SINGLETON_DECLARE(SINGLETON_TYPE, CLASS, LOCK) ACE_IMPORT_SINGLETON_DECLARE(SINGLETON_TYPE, CLASS, LOCK)
+# endif /* TAO_NOTIFY_PERSIST_BUILD_DLL */
+#else /* TAO_NOTIFY_PERSIST_HAS_DLL == 1 */
+# define TAO_Notify_Persist_Export
+# define TAO_NOTIFY_PERSIST_SINGLETON_DECLARATION(T)
+# define TAO_NOTIFY_PERSIST_SINGLETON_DECLARE(SINGLETON_TYPE, CLASS, LOCK)
+#endif /* TAO_NOTIFY_PERSIST_HAS_DLL == 1 */
+
+// Set TAO_NOTIFY_PERSIST_NTRACE = 0 to turn on library specific tracing even if
+// tracing is turned off for ACE.
+#if !defined (TAO_NOTIFY_PERSIST_NTRACE)
+# if (ACE_NTRACE == 1)
+# define TAO_NOTIFY_PERSIST_NTRACE 1
+# else /* (ACE_NTRACE == 1) */
+# define TAO_NOTIFY_PERSIST_NTRACE 0
+# endif /* (ACE_NTRACE == 1) */
+#endif /* !TAO_NOTIFY_PERSIST_NTRACE */
+
+#if (TAO_NOTIFY_PERSIST_NTRACE == 1)
+# define TAO_NOTIFY_PERSIST_TRACE(X)
+#else /* (TAO_NOTIFY_PERSIST_NTRACE == 1) */
+# if !defined (ACE_HAS_TRACE)
+# define ACE_HAS_TRACE
+# endif /* ACE_HAS_TRACE */
+# define TAO_NOTIFY_PERSIST_TRACE(X) ACE_TRACE_IMPL(X)
+# include "ace/Trace.h"
+#endif /* (TAO_NOTIFY_PERSIST_NTRACE == 1) */
+
+#endif /* TAO_NOTIFY_PERSIST_EXPORT_H */
+
+// End of auto generated file.
diff --git a/TAO/orbsvcs/orbsvcs/Notify/notify_serv_export.h b/TAO/orbsvcs/orbsvcs/Notify/notify_serv_export.h
new file mode 100644
index 00000000000..ec47ee40ada
--- /dev/null
+++ b/TAO/orbsvcs/orbsvcs/Notify/notify_serv_export.h
@@ -0,0 +1,40 @@
+
+// -*- C++ -*-
+// $Id$
+// Definition for Win32 Export directives.
+// This file is generated automatically by generate_export_file.pl
+// ------------------------------
+#ifndef TAO_NOTIFY_SERV_EXPORT_H
+#define TAO_NOTIFY_SERV_EXPORT_H
+
+#include "ace/config-all.h"
+
+#if defined (TAO_AS_STATIC_LIBS)
+# if !defined (TAO_NOTIFY_SERV_HAS_DLL)
+# define TAO_NOTIFY_SERV_HAS_DLL 0
+# endif /* ! TAO_NOTIFY_SERV_HAS_DLL */
+#else
+# if !defined (TAO_NOTIFY_SERV_HAS_DLL)
+# define TAO_NOTIFY_SERV_HAS_DLL 1
+# endif /* ! TAO_NOTIFY_SERV_HAS_DLL */
+#endif
+
+#if defined (TAO_NOTIFY_SERV_HAS_DLL) && (TAO_NOTIFY_SERV_HAS_DLL == 1)
+# if defined (TAO_NOTIFY_SERV_BUILD_DLL)
+# define TAO_Notify_Serv_Export ACE_Proper_Export_Flag
+# define TAO_NOTIFY_SERV_SINGLETON_DECLARATION(T) ACE_EXPORT_SINGLETON_DECLARATION (T)
+# define TAO_NOTIFY_SERV_SINGLETON_DECLARE(SINGLETON_TYPE, CLASS, LOCK) ACE_EXPORT_SINGLETON_DECLARE(SINGLETON_TYPE, CLASS, LOCK)
+# else /* TAO_NOTIFY_SERV_BUILD_DLL */
+# define TAO_Notify_Serv_Export ACE_Proper_Import_Flag
+# define TAO_NOTIFY_SERV_SINGLETON_DECLARATION(T) ACE_IMPORT_SINGLETON_DECLARATION (T)
+# define TAO_NOTIFY_SERV_SINGLETON_DECLARE(SINGLETON_TYPE, CLASS, LOCK) ACE_IMPORT_SINGLETON_DECLARE(SINGLETON_TYPE, CLASS, LOCK)
+# endif /* TAO_NOTIFY_SERV_BUILD_DLL */
+#else /* TAO_NOTIFY_SERV_HAS_DLL == 1 */
+# define TAO_Notify_Serv_Export
+# define TAO_NOTIFY_SERV_SINGLETON_DECLARATION(T)
+# define TAO_NOTIFY_SERV_SINGLETON_DECLARE(SINGLETON_TYPE, CLASS, LOCK)
+#endif /* TAO_NOTIFY_SERV_HAS_DLL == 1 */
+
+#endif /* TAO_NOTIFY_SERV_EXPORT_H */
+
+// End of auto generated file.
diff --git a/TAO/orbsvcs/orbsvcs/Notify/notify_skel_export.h b/TAO/orbsvcs/orbsvcs/Notify/notify_skel_export.h
new file mode 100644
index 00000000000..52b01d16fd6
--- /dev/null
+++ b/TAO/orbsvcs/orbsvcs/Notify/notify_skel_export.h
@@ -0,0 +1,40 @@
+
+// -*- C++ -*-
+// $Id$
+// Definition for Win32 Export directives.
+// This file is generated automatically by generate_export_file.pl
+// ------------------------------
+#ifndef TAO_NOTIFY_SKEL_EXPORT_H
+#define TAO_NOTIFY_SKEL_EXPORT_H
+
+#include "ace/config-all.h"
+
+#if defined (TAO_AS_STATIC_LIBS)
+# if !defined (TAO_NOTIFY_SKEL_HAS_DLL)
+# define TAO_NOTIFY_SKEL_HAS_DLL 0
+# endif /* ! TAO_NOTIFY_SKEL_HAS_DLL */
+#else
+# if !defined (TAO_NOTIFY_SKEL_HAS_DLL)
+# define TAO_NOTIFY_SKEL_HAS_DLL 1
+# endif /* ! TAO_NOTIFY_SKEL_HAS_DLL */
+#endif
+
+#if defined (TAO_NOTIFY_SKEL_HAS_DLL) && (TAO_NOTIFY_SKEL_HAS_DLL == 1)
+# if defined (TAO_NOTIFY_SKEL_BUILD_DLL)
+# define TAO_Notify_Skel_Export ACE_Proper_Export_Flag
+# define TAO_NOTIFY_SKEL_SINGLETON_DECLARATION(T) ACE_EXPORT_SINGLETON_DECLARATION (T)
+# define TAO_NOTIFY_SKEL_SINGLETON_DECLARE(SINGLETON_TYPE, CLASS, LOCK) ACE_EXPORT_SINGLETON_DECLARE(SINGLETON_TYPE, CLASS, LOCK)
+# else /* TAO_NOTIFY_SKEL_BUILD_DLL */
+# define TAO_Notify_Skel_Export ACE_Proper_Import_Flag
+# define TAO_NOTIFY_SKEL_SINGLETON_DECLARATION(T) ACE_IMPORT_SINGLETON_DECLARATION (T)
+# define TAO_NOTIFY_SKEL_SINGLETON_DECLARE(SINGLETON_TYPE, CLASS, LOCK) ACE_IMPORT_SINGLETON_DECLARE(SINGLETON_TYPE, CLASS, LOCK)
+# endif /* TAO_NOTIFY_SKEL_BUILD_DLL */
+#else /* TAO_NOTIFY_SKEL_HAS_DLL == 1 */
+# define TAO_Notify_Skel_Export
+# define TAO_NOTIFY_SKEL_SINGLETON_DECLARATION(T)
+# define TAO_NOTIFY_SKEL_SINGLETON_DECLARE(SINGLETON_TYPE, CLASS, LOCK)
+#endif /* TAO_NOTIFY_SKEL_HAS_DLL == 1 */
+
+#endif /* TAO_NOTIFY_SKEL_EXPORT_H */
+
+// End of auto generated file.
diff --git a/TAO/orbsvcs/orbsvcs/Notify/rt_notify_export.h b/TAO/orbsvcs/orbsvcs/Notify/rt_notify_export.h
new file mode 100644
index 00000000000..288a67cb67f
--- /dev/null
+++ b/TAO/orbsvcs/orbsvcs/Notify/rt_notify_export.h
@@ -0,0 +1,39 @@
+// -*- C++ -*-
+// $Id$
+// Definition for Win32 Export directives.
+// This file is generated automatically by generate_export_file.pl
+// ------------------------------
+#ifndef TAO_RT_NOTIFY_EXPORT_H
+#define TAO_RT_NOTIFY_EXPORT_H
+
+#include "ace/config-all.h"
+
+#if defined (TAO_AS_STATIC_LIBS)
+# if !defined (TAO_RT_NOTIFY_HAS_DLL)
+# define TAO_RT_NOTIFY_HAS_DLL 0
+# endif /* ! TAO_RT_NOTIFY_HAS_DLL */
+#else
+# if !defined (TAO_RT_NOTIFY_HAS_DLL)
+# define TAO_RT_NOTIFY_HAS_DLL 1
+# endif /* ! TAO_RT_NOTIFY_HAS_DLL */
+#endif
+
+#if defined (TAO_RT_NOTIFY_HAS_DLL) && (TAO_RT_NOTIFY_HAS_DLL == 1)
+# if defined (TAO_RT_NOTIFY_BUILD_DLL)
+# define TAO_RT_Notify_Export ACE_Proper_Export_Flag
+# define TAO_RT_NOTIFY_SINGLETON_DECLARATION(T) ACE_EXPORT_SINGLETON_DECLARATION (T)
+# define TAO_RT_NOTIFY_SINGLETON_DECLARE(SINGLETON_TYPE, CLASS, LOCK) ACE_EXPORT_SINGLETON_DECLARE(SINGLETON_TYPE, CLASS, LOCK)
+# else /* TAO_RT_NOTIFY_BUILD_DLL */
+# define TAO_RT_Notify_Export ACE_Proper_Import_Flag
+# define TAO_RT_NOTIFY_SINGLETON_DECLARATION(T) ACE_IMPORT_SINGLETON_DECLARATION (T)
+# define TAO_RT_NOTIFY_SINGLETON_DECLARE(SINGLETON_TYPE, CLASS, LOCK) ACE_IMPORT_SINGLETON_DECLARE(SINGLETON_TYPE, CLASS, LOCK)
+# endif /* TAO_RT_NOTIFY_BUILD_DLL */
+#else /* TAO_RT_NOTIFY_HAS_DLL == 1 */
+# define TAO_RT_Notify_Export
+# define TAO_RT_NOTIFY_SINGLETON_DECLARATION(T)
+# define TAO_RT_NOTIFY_SINGLETON_DECLARE(SINGLETON_TYPE, CLASS, LOCK)
+#endif /* TAO_RT_NOTIFY_HAS_DLL == 1 */
+
+#endif /* TAO_RT_NOTIFY_EXPORT_H */
+
+// End of auto generated file.
diff --git a/TAO/orbsvcs/orbsvcs/NotifyExt.idl b/TAO/orbsvcs/orbsvcs/NotifyExt.idl
new file mode 100644
index 00000000000..5e0d9ca9b69
--- /dev/null
+++ b/TAO/orbsvcs/orbsvcs/NotifyExt.idl
@@ -0,0 +1,184 @@
+/**
+ * @file NotifyExt.idl
+ *
+ * @brief Additional interfaces for QoS properties to Notify.
+ *
+ * $Id$
+ *
+ * @author Pradeep Gore <pradeep@oomworks.com>
+ */
+
+#ifndef _NOTIFY_EXT_IDL_
+#define _NOTIFY_EXT_IDL_
+
+#include "CosNotifyChannelAdmin.idl"
+
+#pragma prefix ""
+
+/**
+ * @namespace NotifyExt
+ *
+ * @brief Notify Extensions.
+ */
+module NotifyExt
+{
+ // Priority defs. same as RTCORBA
+ typedef short Priority;
+ const Priority minPriority = 0;
+ const Priority maxPriority = 32767;
+
+ enum PriorityModel
+ {
+ CLIENT_PROPAGATED,
+ SERVER_DECLARED
+ };
+
+ /*
+ * ThreadPool QoS property,
+ */
+ const string ThreadPool = "ThreadPool";
+
+ // ThreadPoolParams : same as RTCORBA::create_threadpool
+ struct ThreadPoolParams
+ {
+ PriorityModel priority_model;
+ Priority server_priority;
+
+ unsigned long stacksize;
+ unsigned long static_threads;
+ unsigned long dynamic_threads;
+ Priority default_priority;
+ boolean allow_request_buffering;
+ unsigned long max_buffered_requests;
+ unsigned long max_request_buffer_size;
+ };
+
+ /*
+ * ThreadPoolLanes QoS property,
+ */
+ const string ThreadPoolLanes = "ThreadPoolLanes";
+
+ struct ThreadPoolLane
+ {
+ PriorityModel priority_model;
+ Priority server_priority;
+
+ Priority lane_priority;
+ unsigned long static_threads;
+ unsigned long dynamic_threads;
+ };
+
+ typedef sequence <ThreadPoolLane> ThreadPoolLanes_List;
+
+ struct ThreadPoolLanesParams
+ {
+ PriorityModel priority_model;
+ Priority server_priority;
+
+ unsigned long stacksize;
+ ThreadPoolLanes_List lanes;
+ boolean allow_borrowing;
+ boolean allow_request_buffering;
+ unsigned long max_buffered_requests;
+ unsigned long max_request_buffer_size;
+ };
+
+ /**
+ * \brief An interface which gets registered with a ReconnectionRegistry.
+ *
+ * A supplier or consumer must implement this interface in order to
+ * allow the Notification Service to attempt to reconnect to it after
+ * a failure. The supplier or consumer must register its instance of
+ * this interface with the ReconnectionRegistry.
+ */
+ interface ReconnectionCallback
+ {
+ /// Perform operations to reconnect to the Notification Service
+ /// after a failure.
+ void reconnect (in Object new_connection);
+
+ /// Check to see if the ReconnectionCallba ck is alive
+ boolean is_alive ();
+ };
+
+ /**
+ * \brief An interface that handles registration of suppliers and consumers.
+ *
+ * This registry should be implemented by an EventChannelFactory and
+ * will call the appropriate reconnect methods for all ReconnectionCallback
+ * objects registered with it.
+ */
+ interface ReconnectionRegistry
+ {
+ typedef long ReconnectionID;
+ ReconnectionID register_callback(in ReconnectionCallback reconection);
+
+ void unregister_callback (in ReconnectionID id);
+
+ /// Check to see if the ReconnectionRegistry is alive
+ boolean is_alive ();
+ };
+
+ /**
+ * Extend the EventChannelFactory to have a shutdown method
+ * and a Reconnection Registry
+ */
+ interface EventChannelFactory
+ : CosNotifyChannelAdmin::EventChannelFactory
+ , ReconnectionRegistry
+ {
+ void destroy ();
+ /// save topology: for diagnostic and testing purposes
+ /// Normal topology save is automatic when connectivity persistence
+ /// is configured.
+ void save_topology();
+ };
+
+ interface ConsumerAdmin : CosNotifyChannelAdmin::ConsumerAdmin
+ {
+ // Create a new push-style proxy supplier
+ /**
+ * @param ctype The event format that the ProxyConsumer should
+ * support
+ * @param proxy_id The ID assigned to the new proxy supplier
+ * @param initial_qos Configure the initial QoS properties of the
+ * new Proxy.
+ * @return The new ProxySupplier
+ * @throws AdminLimitExceeded if a limit in this admin is reached,
+ * such as the maximum number of proxies.
+ * @throws CosNotification::UnsupportedQoS if the requested QoS
+ * properties cannot be satisfied or are invalid
+ */
+ CosNotifyChannelAdmin::ProxySupplier obtain_notification_push_supplier_with_qos (in CosNotifyChannelAdmin::ClientType ctype,
+ out CosNotifyChannelAdmin::ProxyID proxy_id,
+ in CosNotification::QoSProperties initial_qos)
+ raises ( CosNotifyChannelAdmin::AdminLimitExceeded,
+ CosNotification::UnsupportedQoS
+ );
+ };
+
+ interface SupplierAdmin : CosNotifyChannelAdmin::SupplierAdmin
+ {
+ // Create a new push-style proxy supplier
+ /**
+ * @param ctype The event format that the ProxyConsumer should
+ * support
+ * @param proxy_id The ID assigned to the new proxy supplier
+ * @param initial_qos Configure the initial QoS properties of the
+ * new Proxy.
+ * @return The new ProxyConsumer
+ * @throws AdminLimitExceeded if a limit in this admin is reached,
+ * such as the maximum number of proxies.
+ * @throws CosNotification::UnsupportedQoS if the requested QoS
+ * properties cannot be satisfied or are invalid
+ */
+ CosNotifyChannelAdmin::ProxyConsumer obtain_notification_push_consumer_with_qos (in CosNotifyChannelAdmin::ClientType ctype,
+ out CosNotifyChannelAdmin::ProxyID proxy_id,
+ in CosNotification::QoSProperties initial_qos)
+ raises ( CosNotifyChannelAdmin::AdminLimitExceeded,
+ CosNotification::UnsupportedQoS
+ );
+ };
+};
+
+#endif /* _NOTIFY_EXT_IDL_ */
diff --git a/TAO/orbsvcs/orbsvcs/Null_MediaCtrl.idl b/TAO/orbsvcs/orbsvcs/Null_MediaCtrl.idl
new file mode 100644
index 00000000000..199b8d40398
--- /dev/null
+++ b/TAO/orbsvcs/orbsvcs/Null_MediaCtrl.idl
@@ -0,0 +1,5 @@
+// $Id$
+
+interface Null_MediaCtrl
+{
+};
diff --git a/TAO/orbsvcs/orbsvcs/PortableGroup.idl b/TAO/orbsvcs/orbsvcs/PortableGroup.idl
new file mode 100644
index 00000000000..310952a767a
--- /dev/null
+++ b/TAO/orbsvcs/orbsvcs/PortableGroup.idl
@@ -0,0 +1,323 @@
+// -*- IDL -*-
+
+//=============================================================================
+/**
+ * @file PortableGroup.idl
+ *
+ * $Id$
+ */
+//=============================================================================
+
+#ifndef _PORTABLEGROUP_IDL_
+#define _PORTABLEGROUP_IDL_
+
+#include "tao/PortableServer/PortableServer_include.pidl"
+#include "CosNaming.idl"
+#include "tao/IOP.pidl"
+#include "tao/GIOP.pidl"
+#include <orb.idl>
+#include "PortableGroup_Simple_DS.idl"
+
+module PortableGroup
+{
+ typeprefix PortableGroup "omg.org";
+
+ /// MembershipStyle
+ const string PG_MEMBERSHIP_STYLE =
+ "org.omg.PortableGroup.MembershipStyle";
+
+ /// InitialNumberMembers
+ const string PG_INITIAL_NUMBER_MEMBERS =
+ "org.omg.PortableGroup.InitialNumberMembers";
+
+ /// MinimumNumberMembers
+ const string PG_MINIMUM_NUMBER_MEMBERS =
+ "org.omg.PortableGroup.MinimumNumberMembers";
+
+ /// Factories
+ const string PG_FACTORIES = "org.omg.PortableGroup.Factories";
+
+ typedef sequence <octet> GroupIIOPProfile; // tag = TAG_GROUP_IIOP
+
+ // Specification of Common Types and Exceptions for Group Management
+ interface GenericFactory;
+
+ typedef CORBA::RepositoryId _TypeId;
+ typedef Object ObjectGroup;
+ typedef sequence<ObjectGroup> ObjectGroups;
+ typedef CosNaming::Name Name;
+ typedef any Value;
+
+ struct Property {
+ Name nam;
+ Value val;
+ };
+
+ typedef sequence<Property> Properties;
+ typedef Name Location;
+ typedef sequence<Location> Locations;
+ typedef Properties Criteria;
+
+ struct FactoryInfo {
+ GenericFactory the_factory;
+ Location the_location;
+ Criteria the_criteria;
+ };
+ typedef sequence<FactoryInfo> FactoryInfos;
+
+ typedef long MembershipStyleValue;
+ const MembershipStyleValue MEMB_APP_CTRL = 0;
+ const MembershipStyleValue MEMB_INF_CTRL = 1;
+
+ typedef FactoryInfos FactoriesValue;
+ typedef unsigned short InitialNumberMembersValue;
+ typedef unsigned short MinimumNumberMembersValue;
+
+ exception InterfaceNotFound {};
+ exception ObjectGroupNotFound {};
+ exception MemberNotFound {};
+ exception ObjectNotFound {};
+ exception MemberAlreadyPresent {};
+ exception ObjectNotCreated {};
+ exception ObjectNotAdded {};
+ /// TAO Specific: TypeConfict exception
+ exception TypeConflict {};
+ exception UnsupportedProperty {
+ Name nam;
+ Value val;
+ };
+
+ exception InvalidProperty {
+ Name nam;
+ Value val;
+ };
+
+ exception NoFactory {
+ Location the_location;
+ _TypeId type_id;
+ };
+
+ exception InvalidCriteria {
+ Criteria invalid_criteria;
+ };
+
+ exception CannotMeetCriteria {
+ Criteria unmet_criteria;
+ };
+
+ // Specification of PropertyManager Interface
+ interface PropertyManager {
+
+ void set_default_properties (in Properties props)
+ raises (InvalidProperty, UnsupportedProperty);
+
+ Properties get_default_properties();
+
+ void remove_default_properties (in Properties props)
+ raises (InvalidProperty, UnsupportedProperty);
+
+ void set_type_properties (in _TypeId type_id, in Properties overrides)
+ raises (InvalidProperty, UnsupportedProperty);
+
+ Properties get_type_properties(in _TypeId type_id);
+
+ void remove_type_properties (in _TypeId type_id, in Properties props)
+ raises (InvalidProperty, UnsupportedProperty);
+
+ void set_properties_dynamically
+ (in ObjectGroup object_group, in Properties overrides)
+ raises (ObjectGroupNotFound,
+ InvalidProperty,
+ UnsupportedProperty);
+
+ Properties get_properties (in ObjectGroup object_group)
+ raises (ObjectGroupNotFound);
+ }; // endPropertyManager
+
+
+ // Specification of ObjectGroupManager Interface
+ interface ObjectGroupManager {
+ ObjectGroup create_member (in ObjectGroup object_group,
+ in Location the_location,
+ in _TypeId type_id,
+ in Criteria the_criteria)
+ raises (ObjectGroupNotFound,
+ MemberAlreadyPresent,
+ NoFactory,
+ ObjectNotCreated,
+ InvalidCriteria,
+ CannotMeetCriteria);
+
+ ObjectGroup add_member (in ObjectGroup object_group,
+ in Location the_location,
+ in Object member)
+ raises (ObjectGroupNotFound,
+ MemberAlreadyPresent,
+ ObjectNotAdded);
+
+ ObjectGroup remove_member (in ObjectGroup object_group,
+ in Location the_location)
+ raises (ObjectGroupNotFound, MemberNotFound);
+
+ Locations locations_of_members (in ObjectGroup object_group)
+ raises (ObjectGroupNotFound);
+
+ ObjectGroups groups_at_location (in Location the_location);
+
+ ObjectGroupId get_object_group_id (in ObjectGroup object_group)
+ raises (ObjectGroupNotFound);
+
+ ObjectGroup get_object_group_ref (in ObjectGroup object_group)
+ raises (ObjectGroupNotFound);
+
+ Object get_member_ref (in ObjectGroup object_group,
+ in Location loc)
+ raises (ObjectGroupNotFound, MemberNotFound);
+
+ // TAO-specific extension.
+ ObjectGroup get_object_group_ref_from_id (
+ in ObjectGroupId group_id)
+ raises (ObjectGroupNotFound);
+
+ }; // end ObjectGroupManager
+
+
+ // Specification of GenericFactory Interface
+ interface GenericFactory {
+ typedef any FactoryCreationId;
+
+ Object create_object (in _TypeId type_id,
+ in Criteria the_criteria,
+ out FactoryCreationId factory_creation_id)
+ raises (NoFactory,
+ ObjectNotCreated,
+ InvalidCriteria,
+ InvalidProperty,
+ CannotMeetCriteria);
+
+ void delete_object (in FactoryCreationId factory_creation_id)
+ raises (ObjectNotFound);
+
+ }; // end GenericFactory
+
+ ///////////////////////
+ // The following FactoryRegistry interface is not included in the OMG PortableGroup IDL.
+ // It's an extension needed as part of implementing the FT CORBA specification.
+
+
+ /**
+ * a name for the role the object will play
+ * This allows multiple objects that implement the same interface (TypeId)
+ * to exist at a location as long as they play different roles.
+ */
+ typedef CORBA::Identifier RoleName;
+
+ /**
+ * Reserved criteria name for specifing role.
+ */
+ const string role_criterion = "org.omg.portablegroup.Role";
+
+ /**
+ * Interface to allow generic factories for replicas to register themselves.
+ * Factories are distinguished by the role to be played by the created-object (role) and the
+ * location at which they create the object (FactoryInfo.the_location)
+ *
+ * Because this is an extension to the FT CORBA specification applications that wish to
+ * adhere to the specification as written should use the type id as the role name when
+ * interacting with the FactoryRegistry.
+ */
+ interface FactoryRegistry
+ {
+ /**
+ * register a factory to create objects of the given type
+ * at the location given in the FactoryInfo.
+ *
+ * @param role the role the object-to-be-created plays.
+ * @param type_id type id of the object-to-be-created.
+ * @param factory_info information about the factory including its location.
+ * @throws MemberAlreadyPresent if there is already a factory for this type of object
+ * at this location.
+ * @throws TypeConflict if the specified type_id is different from the type_id previously
+ * registered for this role.
+ */
+ void register_factory(in RoleName role, in _TypeId type_id, in FactoryInfo factory_info)
+ raises (MemberAlreadyPresent, TypeConflict);
+
+ /**
+ * Remove the registration of a factory.
+ * @param role the role played by the object formerly created by this factory.
+ * @param location where the factory formerly created objects.
+ * @throws MemberNotPresent if no factory is available for the given role at this location.
+ */
+ void unregister_factory(in RoleName role, in Location the_location)
+ raises (MemberNotFound);
+
+ /**
+ * Remove the registration of all factories that create a particular type of object.
+ * If no factories exist for the given type, the registry is unchanged.
+ * This is not an error.
+ * @param type_id the type of object formerly created by the factories to be unregistered.
+ */
+ void unregister_factory_by_role(in RoleName role);
+
+ /**
+ * Remove the registration of all factories that create objects at a particular location.
+ * If the location is unknown the registry is unchanged.
+ * This is not an error.
+ * @param location where the factories formerly created objects.
+ */
+ void unregister_factory_by_location(in Location the_location);
+
+ /**
+ * List all the factories that create objects that fill a given role
+ * If the role is unknown, an empty list is returned. This is not an error.
+ * @param role the type of object the factories create.
+ * @param type_id what type of object is created to fill this role.
+ */
+ FactoryInfos list_factories_by_role(in RoleName role, out _TypeId type_id);
+
+ /**
+ * List all the factories that create a objects at a given location.
+ * If no factories are registered for this location, an empty list is returned.
+ * This is not an error.
+ * @param location where the factories create objects.
+ */
+ FactoryInfos list_factories_by_location(in Location the_location);
+
+ }; // end of FactoryRegistry
+
+
+ const string TAO_UPDATE_OBJECT_GROUP_METHOD_NAME = "tao_update_object_group";
+
+ interface TAO_UpdateObjectGroup {
+ /**
+ * Pseudo used method to update IOGR in Object Group Members
+ * TAO specific. The CORBA spec. doesn't address the issue.
+ */
+ void tao_update_object_group (
+ in string iogr,
+ in PortableGroup::ObjectGroupRefVersion version,
+ in boolean is_primary);
+ };
+
+ exception NotAGroupObject {};
+ typedef sequence <PortableServer::ObjectId> IDs;
+
+ local interface GOA : PortableServer::POA {
+ PortableServer::ObjectId create_id_for_reference(in Object the_ref)
+ raises (NotAGroupObject);
+
+ IDs reference_to_ids(in Object the_ref)
+ raises (NotAGroupObject);
+
+ void associate_reference_with_id (in Object ref,
+ in PortableServer::ObjectId oid)
+ raises (NotAGroupObject);
+
+ void disassociate_reference_with_id (in Object ref,
+ in PortableServer::ObjectId oid)
+ raises (NotAGroupObject);
+ };
+}; // end PortableGroup
+
+#endif /* _PORTABLEGROUP_IDL_ */
diff --git a/TAO/orbsvcs/orbsvcs/PortableGroup.mpc b/TAO/orbsvcs/orbsvcs/PortableGroup.mpc
new file mode 100644
index 00000000000..2c63bc2bff5
--- /dev/null
+++ b/TAO/orbsvcs/orbsvcs/PortableGroup.mpc
@@ -0,0 +1,40 @@
+// -*- MPC -*-
+// $Id$
+
+project(PortableGroup) : orbsvcslib, core, naming, iormanip, messaging, minimum_corba, tao_versioning_idl_defaults {
+ sharedname = TAO_PortableGroup
+ idlflags += -Wb,export_macro=TAO_PortableGroup_Export \
+ -Wb,export_include=orbsvcs/PortableGroup/portablegroup_export.h
+ dynamicflags = TAO_PORTABLEGROUP_BUILD_DLL
+ tagchecks += PortableGroup
+
+ IDL_Files {
+ miop.idl
+ PortableGroup_Simple_DS.idl
+ }
+
+ IDL_Files {
+ idlflags += -GC
+ PortableGroup.idl
+ }
+
+ Source_Files {
+ miopC.cpp
+ miopS.cpp
+ PortableGroupC.cpp
+ PortableGroupS.cpp
+ PortableGroup_Simple_DSC.cpp
+ PortableGroup
+ }
+
+ Header_Files {
+ PortableGroup/portablegroup_export.h
+ }
+
+ Template_Files {
+ }
+
+ Pkgconfig_Files {
+ TAO_PortableGroup.pc.in
+ }
+}
diff --git a/TAO/orbsvcs/orbsvcs/PortableGroup.rc b/TAO/orbsvcs/orbsvcs/PortableGroup.rc
new file mode 100644
index 00000000000..a432c83a01c
--- /dev/null
+++ b/TAO/orbsvcs/orbsvcs/PortableGroup.rc
@@ -0,0 +1,30 @@
+#include "..\..\tao\Version.h"
+
+1 VERSIONINFO
+ FILEVERSION TAO_MAJOR_VERSION,TAO_MINOR_VERSION,TAO_BETA_VERSION,0
+ PRODUCTVERSION TAO_MAJOR_VERSION,TAO_MINOR_VERSION,TAO_BETA_VERSION,0
+ FILEFLAGSMASK 0x3fL
+ FILEFLAGS 0x0L
+ FILEOS 0x4L
+ FILETYPE 0x1L
+ FILESUBTYPE 0x0L
+BEGIN
+ BLOCK "StringFileInfo"
+ BEGIN
+ BLOCK "040904B0"
+ BEGIN
+ VALUE "FileDescription", "PortableGroup\0"
+ VALUE "FileVersion", TAO_VERSION "\0"
+ VALUE "InternalName", "TAO_PortableGroupDLL\0"
+ VALUE "LegalCopyright", "\0"
+ VALUE "LegalTrademarks", "\0"
+ VALUE "OriginalFilename", "TAO_PortableGroup.DLL\0"
+ VALUE "ProductName", "ORBSVCS\0"
+ VALUE "ProductVersion", TAO_VERSION "\0"
+ END
+ END
+ BLOCK "VarFileInfo"
+ BEGIN
+ VALUE "Translation", 0x409, 1200
+ END
+END
diff --git a/TAO/orbsvcs/orbsvcs/PortableGroup/GOA.cpp b/TAO/orbsvcs/orbsvcs/PortableGroup/GOA.cpp
new file mode 100644
index 00000000000..804e235f797
--- /dev/null
+++ b/TAO/orbsvcs/orbsvcs/PortableGroup/GOA.cpp
@@ -0,0 +1,711 @@
+#include "orbsvcs/PortableGroup/GOA.h"
+
+
+ACE_RCSID (PortableGroup,
+ GOA,
+ "$Id$")
+
+
+#include "orbsvcs/PortableGroup/PortableGroup_Acceptor_Registry.h"
+#include "orbsvcs/PortableGroup/PortableGroup_Request_Dispatcher.h"
+
+#include "tao/ORB_Core.h"
+#include "tao/ORB.h"
+#include "tao/Stub.h"
+#include "tao/Tagged_Components.h"
+#include "tao/Profile.h"
+#include "tao/CDR.h"
+
+#include "ace/Auto_Ptr.h"
+
+TAO_BEGIN_VERSIONED_NAMESPACE_DECL
+
+PortableServer::ObjectId *
+TAO_GOA::create_id_for_reference (CORBA::Object_ptr the_ref
+ ACE_ENV_ARG_DECL)
+ ACE_THROW_SPEC ((
+ CORBA::SystemException,
+ PortableGroup::NotAGroupObject
+ ))
+{
+ // Get the RepositoryId from the Group reference so
+ // we know what kind of reference to make.
+ const char* repository_id = the_ref->_stubobj ()->type_id.in ();
+
+ // Create a temporary object reference and then get the
+ // ObjectId out of it.
+ CORBA::Object_var obj_ref = this->create_reference (repository_id
+ ACE_ENV_ARG_PARAMETER);
+ ACE_CHECK_RETURN (0);
+
+ PortableServer::ObjectId_var obj_id =
+ this->reference_to_id (obj_ref.in () ACE_ENV_ARG_PARAMETER);
+ ACE_CHECK_RETURN (0);
+
+ // Associate the object reference with the group reference.
+ this->associate_group_with_ref (the_ref,
+ obj_ref.in ()
+ ACE_ENV_ARG_PARAMETER);
+ ACE_CHECK_RETURN (0);
+
+ return obj_id._retn ();
+}
+
+PortableGroup::IDs *
+TAO_GOA::reference_to_ids (CORBA::Object_ptr the_ref
+ ACE_ENV_ARG_DECL_NOT_USED)
+ ACE_THROW_SPEC ((
+ CORBA::SystemException,
+ PortableGroup::NotAGroupObject
+ ))
+{
+ ACE_UNUSED_ARG (the_ref);
+
+ return 0;
+}
+
+void
+TAO_GOA::associate_reference_with_id (CORBA::Object_ptr ref,
+ const PortableServer::ObjectId & oid
+ ACE_ENV_ARG_DECL)
+ ACE_THROW_SPEC ((
+ CORBA::SystemException,
+ PortableGroup::NotAGroupObject
+ ))
+{
+ // Create a reference for the specified ObjectId, since
+ // it is much easier to extract the object key from the
+ // reference.
+ CORBA::Object_var obj_ref = this->id_to_reference (oid
+ ACE_ENV_ARG_PARAMETER);
+ ACE_CHECK;
+
+ // Associate the object reference with the group reference.
+ this->associate_group_with_ref (ref,
+ obj_ref.in ()
+ ACE_ENV_ARG_PARAMETER);
+ ACE_CHECK;
+}
+
+void
+TAO_GOA::disassociate_reference_with_id (CORBA::Object_ptr ref,
+ const PortableServer::ObjectId & oid
+ ACE_ENV_ARG_DECL_NOT_USED)
+ ACE_THROW_SPEC ((
+ CORBA::SystemException,
+ PortableGroup::NotAGroupObject
+ ))
+{
+ ACE_UNUSED_ARG (ref);
+ ACE_UNUSED_ARG (oid);
+}
+
+
+TAO_GOA::TAO_GOA (const TAO_Root_POA::String &name,
+ PortableServer::POAManager_ptr poa_manager,
+ const TAO_POA_Policy_Set &policies,
+ TAO_Root_POA *parent,
+ ACE_Lock &lock,
+ TAO_SYNCH_MUTEX &thread_lock,
+ TAO_ORB_Core &orb_core,
+ TAO_Object_Adapter *object_adapter
+ ACE_ENV_ARG_DECL)
+ : TAO_Regular_POA (name,
+ poa_manager,
+ policies,
+ parent,
+ lock,
+ thread_lock,
+ orb_core,
+ object_adapter
+ ACE_ENV_ARG_PARAMETER)
+{
+}
+
+TAO_GOA::~TAO_GOA (void)
+{
+}
+
+TAO_Root_POA *
+TAO_GOA::new_POA (const String &name,
+ PortableServer::POAManager_ptr poa_manager,
+ const TAO_POA_Policy_Set &policies,
+ TAO_Root_POA *parent,
+ ACE_Lock &lock,
+ TAO_SYNCH_MUTEX &thread_lock,
+ TAO_ORB_Core &orb_core,
+ TAO_Object_Adapter *object_adapter
+ ACE_ENV_ARG_DECL)
+{
+ TAO_GOA *poa = 0;
+
+ ACE_NEW_THROW_EX (poa,
+ TAO_GOA (name,
+ poa_manager,
+ policies,
+ parent,
+ lock,
+ thread_lock,
+ orb_core,
+ object_adapter
+ ACE_ENV_ARG_PARAMETER),
+ CORBA::NO_MEMORY ());
+ ACE_CHECK_RETURN (0);
+
+ return poa;
+}
+
+// Standard POA interfaces
+PortableServer::POA_ptr
+TAO_GOA::create_POA (const char *adapter_name,
+ PortableServer::POAManager_ptr poa_manager,
+ const CORBA::PolicyList &policies
+ ACE_ENV_ARG_DECL)
+ ACE_THROW_SPEC ((CORBA::SystemException,
+ PortableServer::POA::AdapterAlreadyExists,
+ PortableServer::POA::InvalidPolicy))
+{
+ PortableServer::POA_ptr poa = this->TAO_Regular_POA::create_POA (adapter_name,
+ poa_manager,
+ policies
+ ACE_ENV_ARG_PARAMETER);
+ ACE_CHECK_RETURN (poa);
+ return poa;
+}
+
+PortableServer::POA_ptr
+TAO_GOA::find_POA (const char *adapter_name,
+ CORBA::Boolean activate_it
+ ACE_ENV_ARG_DECL)
+ ACE_THROW_SPEC ((CORBA::SystemException,
+ PortableServer::POA::AdapterNonExistent))
+{
+ PortableServer::POA_ptr poa = this->TAO_Regular_POA::find_POA (adapter_name,
+ activate_it
+ ACE_ENV_ARG_PARAMETER);
+ ACE_CHECK_RETURN (poa);
+ return poa;
+}
+
+void
+TAO_GOA::destroy (CORBA::Boolean etherealize_objects,
+ CORBA::Boolean wait_for_completion
+ ACE_ENV_ARG_DECL)
+ ACE_THROW_SPEC ((CORBA::SystemException))
+{
+ this->TAO_Regular_POA::destroy (etherealize_objects,
+ wait_for_completion
+ ACE_ENV_ARG_PARAMETER);
+ ACE_CHECK;
+}
+
+
+#if (TAO_HAS_MINIMUM_POA == 0)
+
+PortableServer::ThreadPolicy_ptr
+TAO_GOA::create_thread_policy (PortableServer::ThreadPolicyValue value
+ ACE_ENV_ARG_DECL)
+ ACE_THROW_SPEC ((CORBA::SystemException))
+{
+ PortableServer::ThreadPolicy_ptr policy =
+ this->TAO_Regular_POA::create_thread_policy (value
+ ACE_ENV_ARG_PARAMETER);
+ ACE_CHECK_RETURN (policy);
+ return policy;
+}
+
+#endif /* TAO_HAS_MINIMUM_POA == 0 */
+
+PortableServer::LifespanPolicy_ptr
+TAO_GOA::create_lifespan_policy (PortableServer::LifespanPolicyValue value
+ ACE_ENV_ARG_DECL)
+ ACE_THROW_SPEC ((CORBA::SystemException))
+{
+ PortableServer::LifespanPolicy_ptr policy =
+ this->TAO_Regular_POA::create_lifespan_policy (value
+ ACE_ENV_ARG_PARAMETER);
+ ACE_CHECK_RETURN (policy);
+ return policy;
+}
+
+PortableServer::IdUniquenessPolicy_ptr
+TAO_GOA::create_id_uniqueness_policy (PortableServer::IdUniquenessPolicyValue value
+ ACE_ENV_ARG_DECL)
+ ACE_THROW_SPEC ((CORBA::SystemException))
+{
+ PortableServer::IdUniquenessPolicy_ptr policy =
+ this->TAO_Regular_POA::create_id_uniqueness_policy (value
+ ACE_ENV_ARG_PARAMETER);
+ ACE_CHECK_RETURN (policy);
+ return policy;
+}
+
+
+PortableServer::IdAssignmentPolicy_ptr
+TAO_GOA::create_id_assignment_policy (PortableServer::IdAssignmentPolicyValue value
+ ACE_ENV_ARG_DECL)
+ ACE_THROW_SPEC ((CORBA::SystemException))
+{
+ PortableServer::IdAssignmentPolicy_ptr policy =
+ this->TAO_Regular_POA::create_id_assignment_policy (value
+ ACE_ENV_ARG_PARAMETER);
+ ACE_CHECK_RETURN (policy);
+ return policy;
+}
+
+
+#if (TAO_HAS_MINIMUM_POA == 0)
+
+PortableServer::ImplicitActivationPolicy_ptr
+TAO_GOA::create_implicit_activation_policy (PortableServer::ImplicitActivationPolicyValue value
+ ACE_ENV_ARG_DECL)
+ ACE_THROW_SPEC ((CORBA::SystemException))
+{
+ PortableServer::ImplicitActivationPolicy_ptr policy =
+ this->TAO_Regular_POA::create_implicit_activation_policy (value
+ ACE_ENV_ARG_PARAMETER);
+ ACE_CHECK_RETURN (policy);
+ return policy;
+}
+
+PortableServer::ServantRetentionPolicy_ptr
+TAO_GOA::create_servant_retention_policy (PortableServer::ServantRetentionPolicyValue value
+ ACE_ENV_ARG_DECL)
+ ACE_THROW_SPEC ((CORBA::SystemException))
+{
+ PortableServer::ServantRetentionPolicy_ptr policy =
+ this->TAO_Regular_POA::create_servant_retention_policy (value
+ ACE_ENV_ARG_PARAMETER);
+ ACE_CHECK_RETURN (policy);
+ return policy;
+}
+
+
+PortableServer::RequestProcessingPolicy_ptr
+TAO_GOA::create_request_processing_policy (PortableServer::RequestProcessingPolicyValue value
+ ACE_ENV_ARG_DECL)
+ ACE_THROW_SPEC ((CORBA::SystemException))
+{
+ PortableServer::RequestProcessingPolicy_ptr policy =
+ this->TAO_Regular_POA::create_request_processing_policy (value
+ ACE_ENV_ARG_PARAMETER);
+ ACE_CHECK_RETURN (policy);
+ return policy;
+}
+
+
+#endif /* TAO_HAS_MINIMUM_POA == 0 */
+
+char *
+TAO_GOA::the_name (ACE_ENV_SINGLE_ARG_DECL)
+ ACE_THROW_SPEC ((CORBA::SystemException))
+{
+ char * name =
+ this->TAO_Regular_POA::the_name (ACE_ENV_SINGLE_ARG_PARAMETER);
+ ACE_CHECK_RETURN (name);
+ return name;
+}
+
+PortableServer::POA_ptr
+TAO_GOA::the_parent (ACE_ENV_SINGLE_ARG_DECL)
+ ACE_THROW_SPEC ((CORBA::SystemException))
+{
+ PortableServer::POA_ptr parent =
+ this->TAO_Regular_POA::the_parent (ACE_ENV_SINGLE_ARG_PARAMETER);
+ ACE_CHECK_RETURN (parent);
+ return parent;
+}
+
+PortableServer::POAList *
+TAO_GOA::the_children (ACE_ENV_SINGLE_ARG_DECL)
+ ACE_THROW_SPEC ((CORBA::SystemException))
+{
+ PortableServer::POAList *children =
+ this->TAO_Regular_POA::the_children (ACE_ENV_SINGLE_ARG_PARAMETER);
+ ACE_CHECK_RETURN (children);
+ return children;
+}
+
+PortableServer::POAManager_ptr
+TAO_GOA::the_POAManager (ACE_ENV_SINGLE_ARG_DECL)
+ ACE_THROW_SPEC ((CORBA::SystemException))
+{
+ PortableServer::POAManager_ptr poa_manager =
+ this->TAO_Regular_POA::the_POAManager (ACE_ENV_SINGLE_ARG_PARAMETER);
+ ACE_CHECK_RETURN (poa_manager);
+ return poa_manager;
+}
+
+
+#if (TAO_HAS_MINIMUM_POA == 0)
+
+PortableServer::AdapterActivator_ptr
+TAO_GOA::the_activator (ACE_ENV_SINGLE_ARG_DECL)
+ ACE_THROW_SPEC ((CORBA::SystemException))
+{
+ PortableServer::AdapterActivator_ptr activator =
+ this->TAO_Regular_POA::the_activator (ACE_ENV_SINGLE_ARG_PARAMETER);
+ ACE_CHECK_RETURN (activator);
+ return activator;
+}
+
+void
+TAO_GOA::the_activator (PortableServer::AdapterActivator_ptr adapter_activator
+ ACE_ENV_ARG_DECL)
+ ACE_THROW_SPEC ((CORBA::SystemException))
+{
+ this->TAO_Regular_POA::the_activator (adapter_activator
+ ACE_ENV_ARG_PARAMETER);
+ ACE_CHECK;
+}
+
+PortableServer::ServantManager_ptr
+TAO_GOA::get_servant_manager (ACE_ENV_SINGLE_ARG_DECL)
+ ACE_THROW_SPEC ((CORBA::SystemException,
+ PortableServer::POA::WrongPolicy))
+{
+ PortableServer::ServantManager_ptr servant_manager =
+ this->TAO_Regular_POA::get_servant_manager (ACE_ENV_SINGLE_ARG_PARAMETER);
+ ACE_CHECK_RETURN (servant_manager);
+ return servant_manager;
+}
+
+void
+TAO_GOA::set_servant_manager (PortableServer::ServantManager_ptr imgr
+ ACE_ENV_ARG_DECL)
+ ACE_THROW_SPEC ((CORBA::SystemException,
+ PortableServer::POA::WrongPolicy))
+{
+ this->TAO_Regular_POA::set_servant_manager (imgr
+ ACE_ENV_ARG_PARAMETER);
+ ACE_CHECK;
+}
+
+PortableServer::Servant
+TAO_GOA::get_servant (ACE_ENV_SINGLE_ARG_DECL)
+ ACE_THROW_SPEC ((CORBA::SystemException,
+ PortableServer::POA::NoServant,
+ PortableServer::POA::WrongPolicy))
+{
+ PortableServer::Servant servant =
+ this->TAO_Regular_POA::get_servant (ACE_ENV_SINGLE_ARG_PARAMETER);
+ ACE_CHECK_RETURN (servant);
+ return servant;
+}
+
+void
+TAO_GOA::set_servant (PortableServer::Servant servant
+ ACE_ENV_ARG_DECL)
+ ACE_THROW_SPEC ((CORBA::SystemException,
+ PortableServer::POA::WrongPolicy))
+{
+ this->TAO_Regular_POA::set_servant (servant
+ ACE_ENV_ARG_PARAMETER);
+ ACE_CHECK;
+}
+
+#endif /* TAO_HAS_MINIMUM_POA == 0 */
+
+PortableServer::ObjectId *
+TAO_GOA::activate_object (PortableServer::Servant p_servant
+ ACE_ENV_ARG_DECL)
+ ACE_THROW_SPEC ((CORBA::SystemException,
+ PortableServer::POA::ServantAlreadyActive,
+ PortableServer::POA::WrongPolicy))
+{
+ PortableServer::ObjectId *object_id =
+ this->TAO_Regular_POA::activate_object (p_servant
+ ACE_ENV_ARG_PARAMETER);
+ ACE_CHECK_RETURN (object_id);
+ return object_id;
+}
+
+void
+TAO_GOA::activate_object_with_id (const PortableServer::ObjectId &id,
+ PortableServer::Servant p_servant
+ ACE_ENV_ARG_DECL)
+ ACE_THROW_SPEC ((CORBA::SystemException,
+ PortableServer::POA::ServantAlreadyActive,
+ PortableServer::POA::ObjectAlreadyActive,
+ PortableServer::POA::WrongPolicy))
+{
+ this->TAO_Regular_POA::activate_object_with_id (id,
+ p_servant
+ ACE_ENV_ARG_PARAMETER);
+ ACE_CHECK;
+}
+
+void
+TAO_GOA::deactivate_object (const PortableServer::ObjectId &oid
+ ACE_ENV_ARG_DECL)
+ ACE_THROW_SPEC ((CORBA::SystemException,
+ PortableServer::POA::ObjectNotActive,
+ PortableServer::POA::WrongPolicy))
+{
+ this->TAO_Regular_POA::deactivate_object (oid
+ ACE_ENV_ARG_PARAMETER);
+ ACE_CHECK;
+}
+
+CORBA::Object_ptr
+TAO_GOA::create_reference (const char *intf
+ ACE_ENV_ARG_DECL)
+ ACE_THROW_SPEC ((CORBA::SystemException,
+ PortableServer::POA::WrongPolicy))
+{
+ CORBA::Object_ptr obj =
+ this->TAO_Regular_POA::create_reference (intf
+ ACE_ENV_ARG_PARAMETER);
+ ACE_CHECK_RETURN (obj);
+ return obj;
+}
+
+CORBA::Object_ptr
+TAO_GOA::create_reference_with_id (const PortableServer::ObjectId &oid,
+ const char *intf
+ ACE_ENV_ARG_DECL)
+ ACE_THROW_SPEC ((CORBA::SystemException))
+{
+ CORBA::Object_ptr obj =
+ this->TAO_Regular_POA::create_reference_with_id (oid,
+ intf
+ ACE_ENV_ARG_PARAMETER);
+ ACE_CHECK_RETURN (obj);
+ return obj;
+}
+
+PortableServer::ObjectId *
+TAO_GOA::servant_to_id (PortableServer::Servant p_servant
+ ACE_ENV_ARG_DECL)
+ ACE_THROW_SPEC ((CORBA::SystemException,
+ PortableServer::POA::ServantNotActive,
+ PortableServer::POA::WrongPolicy))
+{
+ PortableServer::ObjectId *object_id =
+ this->TAO_Regular_POA::servant_to_id (p_servant
+ ACE_ENV_ARG_PARAMETER);
+ ACE_CHECK_RETURN (object_id);
+ return object_id;
+}
+
+CORBA::Object_ptr
+TAO_GOA::servant_to_reference (PortableServer::Servant p_servant
+ ACE_ENV_ARG_DECL)
+ ACE_THROW_SPEC ((CORBA::SystemException,
+ PortableServer::POA::ServantNotActive,
+ PortableServer::POA::WrongPolicy))
+{
+ CORBA::Object_ptr obj =
+ this->TAO_Regular_POA::servant_to_reference (p_servant
+ ACE_ENV_ARG_PARAMETER);
+ ACE_CHECK_RETURN (obj);
+ return obj;
+}
+
+
+PortableServer::Servant
+TAO_GOA::reference_to_servant (CORBA::Object_ptr reference
+ ACE_ENV_ARG_DECL)
+ ACE_THROW_SPEC ((CORBA::SystemException,
+ PortableServer::POA::ObjectNotActive,
+ PortableServer::POA::WrongAdapter,
+ PortableServer::POA::WrongPolicy))
+{
+ PortableServer::Servant servant =
+ this->TAO_Regular_POA::reference_to_servant (reference
+ ACE_ENV_ARG_PARAMETER);
+ ACE_CHECK_RETURN (servant);
+ return servant;
+}
+
+PortableServer::ObjectId *
+TAO_GOA::reference_to_id (CORBA::Object_ptr reference
+ ACE_ENV_ARG_DECL)
+ ACE_THROW_SPEC ((CORBA::SystemException,
+ PortableServer::POA::WrongAdapter,
+ PortableServer::POA::WrongPolicy))
+{
+ PortableServer::ObjectId *object_id =
+ this->TAO_Regular_POA::reference_to_id (reference
+ ACE_ENV_ARG_PARAMETER);
+ ACE_CHECK_RETURN (object_id);
+ return object_id;
+}
+
+PortableServer::Servant
+TAO_GOA::id_to_servant (const PortableServer::ObjectId &oid
+ ACE_ENV_ARG_DECL)
+ ACE_THROW_SPEC ((CORBA::SystemException,
+ PortableServer::POA::ObjectNotActive,
+ PortableServer::POA::WrongPolicy))
+{
+ PortableServer::Servant servant =
+ this->TAO_Regular_POA::id_to_servant (oid
+ ACE_ENV_ARG_PARAMETER);
+ ACE_CHECK_RETURN (servant);
+ return servant;
+}
+
+CORBA::Object_ptr
+TAO_GOA::id_to_reference (const PortableServer::ObjectId &oid
+ ACE_ENV_ARG_DECL)
+ ACE_THROW_SPEC ((CORBA::SystemException,
+ PortableServer::POA::ObjectNotActive,
+ PortableServer::POA::WrongPolicy))
+{
+ CORBA::Object_ptr obj =
+ this->TAO_Regular_POA::id_to_reference (oid
+ ACE_ENV_ARG_PARAMETER);
+ ACE_CHECK_RETURN (obj);
+ return obj;
+}
+
+CORBA::OctetSeq *
+TAO_GOA::id (ACE_ENV_SINGLE_ARG_DECL)
+ ACE_THROW_SPEC ((CORBA::SystemException))
+{
+ return this->TAO_Regular_POA::id (ACE_ENV_SINGLE_ARG_PARAMETER);
+}
+
+int
+TAO_GOA::find_group_component (const CORBA::Object_ptr the_ref,
+ PortableGroup::TagGroupTaggedComponent &group)
+{
+ const TAO_MProfile& profiles = the_ref->_stubobj ()->base_profiles ();
+ const TAO_Profile* profile;
+ CORBA::ULong slot;
+
+ // Iterate through the tagged profiles, and
+ // create acceptors for the multicast ones.
+ slot = 0;
+ while (0 != (profile = profiles.get_profile (slot)))
+ {
+ if (this->find_group_component_in_profile (profile, group) == 0)
+ return 0;
+
+ ++slot;
+ }
+
+ // Not found.
+ return -1;
+}
+
+int
+TAO_GOA::find_group_component_in_profile (const TAO_Profile* profile,
+ PortableGroup::TagGroupTaggedComponent &group)
+{
+ // Iterate through the tagged components looking for
+ // group tag.
+ const TAO_Tagged_Components& components = profile->tagged_components ();
+
+ IOP::TaggedComponent tagged_component;
+ tagged_component.tag = IOP::TAG_GROUP;
+
+ // Try to find it.
+ if (components.get_component (tagged_component) == 0)
+ return -1;
+
+ // Found it.
+ const CORBA::Octet *buf =
+ tagged_component.component_data.get_buffer ();
+
+ TAO_InputCDR in_cdr (reinterpret_cast <const char*> (buf),
+ tagged_component.component_data.length ());
+
+ // Extract the Byte Order.
+ CORBA::Boolean byte_order;
+ if ((in_cdr >> ACE_InputCDR::to_boolean (byte_order)) == 0)
+ return -1;
+ in_cdr.reset_byte_order (static_cast <int> (byte_order));
+
+ if ((in_cdr >> group) == 0)
+ return -1;
+
+ return 0;
+}
+
+int
+TAO_GOA::create_group_acceptors (CORBA::Object_ptr the_ref,
+ TAO_PortableGroup_Acceptor_Registry &acceptor_registry,
+ TAO_ORB_Core &orb_core
+ ACE_ENV_ARG_DECL)
+{
+ const TAO_MProfile& profiles = the_ref->_stubobj ()->base_profiles ();
+ const TAO_Profile* profile;
+ CORBA::ULong slot;
+ int num = 0;
+
+ // Iterate through the tagged profiles, and
+ // create acceptors for the multicast ones.
+ slot = 0;
+ while (0 != (profile = profiles.get_profile (slot)))
+ {
+ if (profile->supports_multicast ())
+ {
+ acceptor_registry.open (profile,
+ orb_core
+ ACE_ENV_ARG_PARAMETER);
+ ACE_CHECK_RETURN (0);
+ ++num;
+ }
+
+ ++slot;
+ }
+
+ // Return the number of acceptors registered.
+ return num;
+}
+
+void
+TAO_GOA::associate_group_with_ref (
+ CORBA::Object_ptr group_ref,
+ CORBA::Object_ptr obj_ref
+ ACE_ENV_ARG_DECL)
+ ACE_THROW_SPEC ((CORBA::SystemException,
+ PortableGroup::NotAGroupObject))
+{
+ // Find the Group Component so that we can extract the Group ID.
+ PortableGroup::TagGroupTaggedComponent *tmp_group_id;
+ ACE_NEW_THROW_EX (tmp_group_id,
+ PortableGroup::TagGroupTaggedComponent,
+ CORBA::NO_MEMORY (
+ CORBA::SystemException::_tao_minor_code (
+ TAO::VMCID,
+ ENOMEM),
+ CORBA::COMPLETED_NO));
+ ACE_CHECK;
+
+ PortableGroup::TagGroupTaggedComponent_var group_id = tmp_group_id;
+
+ if (this->find_group_component (group_ref, group_id.inout ()) != 0)
+ {
+ // Group component wasn't found. The group reference
+ // that was passed in must be bogus.
+ ACE_THROW (PortableGroup::NotAGroupObject ());
+ }
+
+ PortableGroup_Request_Dispatcher *rd =
+ dynamic_cast <PortableGroup_Request_Dispatcher*>(
+ this->orb_core_.request_dispatcher());
+
+ // Create the acceptors necessary to receive requests for the
+ // specified group reference.
+ this->create_group_acceptors (group_ref,
+ rd->acceptor_registry_,
+ this->orb_core_
+ ACE_ENV_ARG_PARAMETER);
+
+ ACE_CHECK;
+
+
+ // Add a mapping from GroupId to Object key in the PortableGroup
+ const TAO::ObjectKey &key =
+ obj_ref->_stubobj ()->profile_in_use ()->object_key ();
+ rd->group_map_.add_groupid_objectkey_pair (group_id._retn (),
+ key
+ ACE_ENV_ARG_PARAMETER);
+ ACE_CHECK;
+
+}
+
+TAO_END_VERSIONED_NAMESPACE_DECL
diff --git a/TAO/orbsvcs/orbsvcs/PortableGroup/GOA.h b/TAO/orbsvcs/orbsvcs/PortableGroup/GOA.h
new file mode 100644
index 00000000000..d5bbdeb04dd
--- /dev/null
+++ b/TAO/orbsvcs/orbsvcs/PortableGroup/GOA.h
@@ -0,0 +1,329 @@
+// -*- C++ -*-
+
+//=============================================================================
+/**
+ * @file GOA.h
+ *
+ * $Id$
+ *
+ * Header file for Group Object Adapter
+ *
+ * @author Several
+ */
+//=============================================================================
+
+#ifndef TAO_GOA_H
+#define TAO_GOA_H
+
+#include /**/ "ace/pre.h"
+
+#include "orbsvcs/PortableGroup/portablegroup_export.h"
+
+#if !defined (ACE_LACKS_PRAGMA_ONCE)
+# pragma once
+#endif /* ACE_LACKS_PRAGMA_ONCE */
+
+#include "orbsvcs/PortableGroupC.h"
+#include "tao/PortableServer/Regular_POA.h"
+
+// This is to remove "inherits via dominance" warnings from MSVC.
+// MSVC is being a little too paranoid.
+#if defined(_MSC_VER)
+#pragma warning(push)
+#pragma warning(disable:4250)
+#endif /* _MSC_VER */
+
+TAO_BEGIN_VERSIONED_NAMESPACE_DECL
+
+class TAO_Profile;
+class TAO_PortableGroup_Acceptor_Registry;
+
+/**
+ * @class TAO_GOA
+ *
+ * @brief Implementation of the PortableGroup::GOA interface.
+ *
+ * Implementation of the PortableGroup::GOA interface.
+ */
+class TAO_PortableGroup_Export TAO_GOA :
+ public virtual PortableGroup::GOA,
+ public virtual TAO_Regular_POA
+{
+public:
+ // Methods added by the
+ /// @name MIOP specification methods
+ //@{
+ virtual PortableServer::ObjectId * create_id_for_reference (
+ CORBA::Object_ptr the_ref
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS
+ )
+ ACE_THROW_SPEC ((
+ CORBA::SystemException,
+ PortableGroup::NotAGroupObject
+ ));
+
+
+ virtual PortableGroup::IDs * reference_to_ids (
+ CORBA::Object_ptr the_ref
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS
+ )
+ ACE_THROW_SPEC ((
+ CORBA::SystemException,
+ PortableGroup::NotAGroupObject
+ ));
+
+ virtual void associate_reference_with_id (
+ CORBA::Object_ptr ref,
+ const PortableServer::ObjectId & oid
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS
+ )
+ ACE_THROW_SPEC ((
+ CORBA::SystemException,
+ PortableGroup::NotAGroupObject
+ ));
+
+ virtual void disassociate_reference_with_id (
+ CORBA::Object_ptr ref,
+ const PortableServer::ObjectId & oid
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS
+ )
+ ACE_THROW_SPEC ((
+ CORBA::SystemException,
+ PortableGroup::NotAGroupObject
+ ));
+ //@}
+
+ // Standard POA interface methods
+ PortableServer::POA_ptr create_POA (const char *adapter_name,
+ PortableServer::POAManager_ptr poa_manager,
+ const CORBA::PolicyList &policies
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS)
+ ACE_THROW_SPEC ((CORBA::SystemException,
+ PortableServer::POA::AdapterAlreadyExists,
+ PortableServer::POA::InvalidPolicy));
+
+ PortableServer::POA_ptr find_POA (const char *adapter_name,
+ CORBA::Boolean activate_it
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS)
+ ACE_THROW_SPEC ((CORBA::SystemException,
+ PortableServer::POA::AdapterNonExistent));
+
+ void destroy (CORBA::Boolean etherealize_objects,
+ CORBA::Boolean wait_for_completion
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS)
+ ACE_THROW_SPEC ((CORBA::SystemException));
+
+#if (TAO_HAS_MINIMUM_POA == 0)
+
+ PortableServer::ThreadPolicy_ptr create_thread_policy (PortableServer::ThreadPolicyValue value
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS)
+ ACE_THROW_SPEC ((CORBA::SystemException));
+
+#endif /* TAO_HAS_MINIMUM_POA == 0 */
+
+ PortableServer::LifespanPolicy_ptr create_lifespan_policy (PortableServer::LifespanPolicyValue value
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS)
+ ACE_THROW_SPEC ((CORBA::SystemException));
+
+ PortableServer::IdUniquenessPolicy_ptr create_id_uniqueness_policy (PortableServer::IdUniquenessPolicyValue value
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS)
+ ACE_THROW_SPEC ((CORBA::SystemException));
+
+ PortableServer::IdAssignmentPolicy_ptr create_id_assignment_policy (PortableServer::IdAssignmentPolicyValue value
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS)
+ ACE_THROW_SPEC ((CORBA::SystemException));
+
+#if (TAO_HAS_MINIMUM_POA == 0)
+
+ PortableServer::ImplicitActivationPolicy_ptr create_implicit_activation_policy (PortableServer::ImplicitActivationPolicyValue value
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS)
+ ACE_THROW_SPEC ((CORBA::SystemException));
+
+ PortableServer::ServantRetentionPolicy_ptr create_servant_retention_policy (PortableServer::ServantRetentionPolicyValue value
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS)
+ ACE_THROW_SPEC ((CORBA::SystemException));
+
+ PortableServer::RequestProcessingPolicy_ptr create_request_processing_policy (PortableServer::RequestProcessingPolicyValue value
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS)
+ ACE_THROW_SPEC ((CORBA::SystemException));
+
+#endif /* TAO_HAS_MINIMUM_POA == 0 */
+
+ char * the_name (ACE_ENV_SINGLE_ARG_DECL_WITH_DEFAULTS)
+ ACE_THROW_SPEC ((CORBA::SystemException));
+
+ PortableServer::POA_ptr the_parent (ACE_ENV_SINGLE_ARG_DECL_WITH_DEFAULTS)
+ ACE_THROW_SPEC ((CORBA::SystemException));
+
+ PortableServer::POAList *the_children (ACE_ENV_SINGLE_ARG_DECL_WITH_DEFAULTS)
+ ACE_THROW_SPEC ((CORBA::SystemException));
+
+ PortableServer::POAManager_ptr the_POAManager (ACE_ENV_SINGLE_ARG_DECL_WITH_DEFAULTS)
+ ACE_THROW_SPEC ((CORBA::SystemException));
+
+#if (TAO_HAS_MINIMUM_POA == 0)
+
+ PortableServer::AdapterActivator_ptr the_activator (ACE_ENV_SINGLE_ARG_DECL_WITH_DEFAULTS)
+ ACE_THROW_SPEC ((CORBA::SystemException));
+
+ void the_activator (PortableServer::AdapterActivator_ptr adapter_activator
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS)
+ ACE_THROW_SPEC ((CORBA::SystemException));
+
+ PortableServer::ServantManager_ptr get_servant_manager (ACE_ENV_SINGLE_ARG_DECL_WITH_DEFAULTS)
+ ACE_THROW_SPEC ((CORBA::SystemException,
+ PortableServer::POA::WrongPolicy));
+
+ void set_servant_manager (PortableServer::ServantManager_ptr imgr
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS)
+ ACE_THROW_SPEC ((CORBA::SystemException,
+ PortableServer::POA::WrongPolicy));
+
+ PortableServer::Servant get_servant (ACE_ENV_SINGLE_ARG_DECL_WITH_DEFAULTS)
+ ACE_THROW_SPEC ((CORBA::SystemException,
+ PortableServer::POA::NoServant,
+ PortableServer::POA::WrongPolicy));
+
+ void set_servant (PortableServer::Servant servant
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS)
+ ACE_THROW_SPEC ((CORBA::SystemException,
+ PortableServer::POA::WrongPolicy));
+
+#endif /* TAO_HAS_MINIMUM_POA == 0 */
+
+ PortableServer::ObjectId *activate_object (PortableServer::Servant p_servant
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS)
+ ACE_THROW_SPEC ((CORBA::SystemException,
+ PortableServer::POA::ServantAlreadyActive,
+ PortableServer::POA::WrongPolicy));
+
+ void activate_object_with_id (const PortableServer::ObjectId &id,
+ PortableServer::Servant p_servant
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS)
+ ACE_THROW_SPEC ((CORBA::SystemException,
+ PortableServer::POA::ServantAlreadyActive,
+ PortableServer::POA::ObjectAlreadyActive,
+ PortableServer::POA::WrongPolicy));
+
+ void deactivate_object (const PortableServer::ObjectId &oid
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS)
+ ACE_THROW_SPEC ((CORBA::SystemException,
+ PortableServer::POA::ObjectNotActive,
+ PortableServer::POA::WrongPolicy));
+
+ CORBA::Object_ptr create_reference (const char *intf
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS)
+ ACE_THROW_SPEC ((CORBA::SystemException,
+ PortableServer::POA::WrongPolicy));
+
+ CORBA::Object_ptr create_reference_with_id (const PortableServer::ObjectId &oid,
+ const char *intf
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS)
+ ACE_THROW_SPEC ((CORBA::SystemException));
+
+ PortableServer::ObjectId *servant_to_id (PortableServer::Servant p_servant
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS)
+ ACE_THROW_SPEC ((CORBA::SystemException,
+ PortableServer::POA::ServantNotActive,
+ PortableServer::POA::WrongPolicy));
+
+ CORBA::Object_ptr servant_to_reference (PortableServer::Servant p_servant
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS)
+ ACE_THROW_SPEC ((CORBA::SystemException,
+ PortableServer::POA::ServantNotActive,
+ PortableServer::POA::WrongPolicy));
+
+ PortableServer::Servant reference_to_servant (CORBA::Object_ptr reference
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS)
+ ACE_THROW_SPEC ((CORBA::SystemException,
+ PortableServer::POA::ObjectNotActive,
+ PortableServer::POA::WrongAdapter,
+ PortableServer::POA::WrongPolicy));
+
+ PortableServer::ObjectId *reference_to_id (CORBA::Object_ptr reference
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS)
+ ACE_THROW_SPEC ((CORBA::SystemException,
+ PortableServer::POA::WrongAdapter,
+ PortableServer::POA::WrongPolicy));
+
+ PortableServer::Servant id_to_servant (const PortableServer::ObjectId &oid
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS)
+ ACE_THROW_SPEC ((CORBA::SystemException,
+ PortableServer::POA::ObjectNotActive,
+ PortableServer::POA::WrongPolicy));
+
+ CORBA::Object_ptr id_to_reference (const PortableServer::ObjectId &oid
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS)
+ ACE_THROW_SPEC ((CORBA::SystemException,
+ PortableServer::POA::ObjectNotActive,
+ PortableServer::POA::WrongPolicy));
+
+ CORBA::OctetSeq *id (ACE_ENV_SINGLE_ARG_DECL_WITH_DEFAULTS)
+ ACE_THROW_SPEC ((CORBA::SystemException));
+
+ // End standard POA interface methods.
+
+ TAO_GOA (const String &name,
+ PortableServer::POAManager_ptr poa_manager,
+ const TAO_POA_Policy_Set &policies,
+ TAO_Root_POA *parent,
+ ACE_Lock &lock,
+ TAO_SYNCH_MUTEX &thread_lock,
+ TAO_ORB_Core &orb_core,
+ TAO_Object_Adapter *object_adapter
+ ACE_ENV_ARG_DECL);
+
+ virtual ~TAO_GOA (void);
+
+ // Used to force the initialization of the code.
+ static int Initializer (void);
+
+protected:
+
+ /// Template method for creating new POA's of this type.
+ virtual TAO_Root_POA *new_POA (const String &name,
+ PortableServer::POAManager_ptr poa_manager,
+ const TAO_POA_Policy_Set &policies,
+ TAO_Root_POA *parent,
+ ACE_Lock &lock,
+ TAO_SYNCH_MUTEX &thread_lock,
+ TAO_ORB_Core &orb_core,
+ TAO_Object_Adapter *object_adapter
+ ACE_ENV_ARG_DECL);
+
+ int find_group_component (const CORBA::Object_ptr the_ref,
+ PortableGroup::TagGroupTaggedComponent &group);
+
+ int find_group_component_in_profile (
+ const TAO_Profile* profile,
+ PortableGroup::TagGroupTaggedComponent &group
+ );
+
+ int create_group_acceptors (
+ CORBA::Object_ptr the_ref,
+ TAO_PortableGroup_Acceptor_Registry &acceptor_registry,
+ TAO_ORB_Core &orb_core
+ ACE_ENV_ARG_DECL
+ );
+
+ /// Helper function to associate group references with
+ /// object references.
+ void associate_group_with_ref (
+ CORBA::Object_ptr group_ref,
+ CORBA::Object_ptr obj_ref
+ ACE_ENV_ARG_DECL)
+ ACE_THROW_SPEC ((CORBA::SystemException,
+ PortableGroup::NotAGroupObject));
+};
+
+TAO_END_VERSIONED_NAMESPACE_DECL
+
+// ****************************************************************
+
+#if defined(_MSC_VER)
+#pragma warning(pop)
+#endif /* _MSC_VER */
+
+#include /**/ "ace/post.h"
+
+#endif /* TAO_GOA_H */
diff --git a/TAO/orbsvcs/orbsvcs/PortableGroup/MIOP.cpp b/TAO/orbsvcs/orbsvcs/PortableGroup/MIOP.cpp
new file mode 100644
index 00000000000..ac2bbec66cf
--- /dev/null
+++ b/TAO/orbsvcs/orbsvcs/PortableGroup/MIOP.cpp
@@ -0,0 +1,29 @@
+#include "orbsvcs/PortableGroup/MIOP.h"
+#include "orbsvcs/PortableGroup/UIPMC_Factory.h"
+#include "ace/Service_Config.h"
+#include "orbsvcs/PortableGroup/PortableGroup_Loader.h"
+#include "orbsvcs/PortableGroup/PG_Object_Adapter_Factory.h"
+
+ACE_RCSID (PortableGroup,
+ UIPMC_Factory,
+ "$Id$")
+
+TAO_BEGIN_VERSIONED_NAMESPACE_DECL
+
+namespace TAO
+{
+ /*static*/ int
+ MIOP_Loader::Initializer (void)
+ {
+ ACE_Service_Config::process_directive (
+ ace_svc_desc_TAO_PortableGroup_Loader);
+
+ ACE_Service_Config::process_directive (
+ ace_svc_desc_TAO_PG_Object_Adapter_Factory);
+
+ return ACE_Service_Config::process_directive (
+ ace_svc_desc_TAO_UIPMC_Protocol_Factory);
+ }
+}
+
+TAO_END_VERSIONED_NAMESPACE_DECL
diff --git a/TAO/orbsvcs/orbsvcs/PortableGroup/MIOP.h b/TAO/orbsvcs/orbsvcs/PortableGroup/MIOP.h
new file mode 100644
index 00000000000..7e6219a5e67
--- /dev/null
+++ b/TAO/orbsvcs/orbsvcs/PortableGroup/MIOP.h
@@ -0,0 +1,45 @@
+// -*- C++ -*-
+
+//=============================================================================
+/**
+ * @file MIOP.h
+ *
+ * $Id$
+ *
+ * @author Bala Natarajan
+ */
+//=============================================================================
+#ifndef TAO_MIOP_H
+#define TAO_MIOP_H
+#include /**/ "ace/pre.h"
+
+#include "orbsvcs/PortableGroup/portablegroup_export.h"
+
+#if !defined (ACE_LACKS_PRAGMA_ONCE)
+# pragma once
+#endif /* ACE_LACKS_PRAGMA_ONCE */
+
+#include "tao/Versioned_Namespace.h"
+
+TAO_BEGIN_VERSIONED_NAMESPACE_DECL
+
+namespace TAO
+{
+
+ class TAO_PortableGroup_Export MIOP_Loader
+ {
+ public:
+ /// Used to force the insertion of UIPMC_Factory in the service
+ /// configurator.
+ static int Initializer (void);
+ };
+
+ static int
+ Requires_MIOP_Initializer = MIOP_Loader::Initializer ();
+
+}
+
+TAO_END_VERSIONED_NAMESPACE_DECL
+
+#include /**/ "ace/post.h"
+#endif /*TAO_MIOP_H*/
diff --git a/TAO/orbsvcs/orbsvcs/PortableGroup/PG_Default_Property_Validator.cpp b/TAO/orbsvcs/orbsvcs/PortableGroup/PG_Default_Property_Validator.cpp
new file mode 100644
index 00000000000..fe3650caa71
--- /dev/null
+++ b/TAO/orbsvcs/orbsvcs/PortableGroup/PG_Default_Property_Validator.cpp
@@ -0,0 +1,151 @@
+#include "orbsvcs/PortableGroup/PG_Default_Property_Validator.h"
+#include "orbsvcs/PortableGroup/PG_Operators.h"
+
+
+ACE_RCSID (PortableGroup,
+ PG_Default_Property_Validator,
+ "$Id$")
+
+
+TAO_BEGIN_VERSIONED_NAMESPACE_DECL
+
+TAO_PG_Default_Property_Validator::TAO_PG_Default_Property_Validator (void)
+ : membership_ (1),
+ factories_ (1)
+{
+ this->membership_.length (1);
+ this->membership_[0].id = CORBA::string_dup ("org.omg.PortableGroup.MembershipStyle");
+
+ this->factories_.length (1);
+ this->factories_[0].id = CORBA::string_dup ("org.omg.PortableGroup.Factories");
+}
+
+TAO_PG_Default_Property_Validator::~TAO_PG_Default_Property_Validator (void)
+{
+}
+
+void
+TAO_PG_Default_Property_Validator::validate_property (
+ const PortableGroup::Properties & props
+ ACE_ENV_ARG_DECL)
+ ACE_THROW_SPEC ((CORBA::SystemException,
+ PortableGroup::InvalidProperty,
+ PortableGroup::UnsupportedProperty))
+{
+ const CORBA::ULong len = props.length ();
+
+ for (CORBA::ULong i = 0; i < len; ++i)
+ {
+ const PortableGroup::Property & property = props[i];
+
+ if (property.nam == this->membership_)
+ {
+ PortableGroup::MembershipStyleValue membership;
+ if (!(property.val >>= membership)
+ || (membership != PortableGroup::MEMB_APP_CTRL
+ && membership != PortableGroup::MEMB_INF_CTRL))
+ ACE_THROW (PortableGroup::InvalidProperty (property.nam,
+ property.val));
+ }
+ else if (property.nam == this->factories_)
+ {
+ const PortableGroup::FactoriesValue * factories;
+ if (!(property.val >>= factories))
+ ACE_THROW (PortableGroup::InvalidProperty (property.nam,
+ property.val));
+ else
+ {
+ const CORBA::ULong flen = factories->length ();
+
+ if (flen == 0)
+ ACE_THROW (PortableGroup::InvalidProperty (property.nam,
+ property.val));
+
+ for (CORBA::ULong j = 0; j < flen; ++j)
+ {
+ const PortableGroup::FactoryInfo & factory_info =
+ (*factories)[j];
+
+ if (CORBA::is_nil (factory_info.the_factory.in ())
+ || factory_info.the_location.length () == 0)
+ ACE_THROW (PortableGroup::InvalidProperty (property.nam,
+ property.val));
+ }
+ }
+ }
+ }
+}
+
+void
+TAO_PG_Default_Property_Validator::validate_criteria (
+ const PortableGroup::Properties & props
+ ACE_ENV_ARG_DECL)
+ ACE_THROW_SPEC ((CORBA::SystemException,
+ PortableGroup::InvalidCriteria,
+ PortableGroup::CannotMeetCriteria))
+{
+ const CORBA::ULong len = props.length ();
+ PortableGroup::Criteria invalid_criteria;
+
+ // Optimize for the worst case scenario where all properties are
+ // invalid.
+ invalid_criteria.length (len);
+
+ /// The invalid criteria index.
+ CORBA::ULong p = 0;
+
+ for (CORBA::ULong i = 0; i < len; ++i)
+ {
+ const PortableGroup::Property & property = props[i];
+
+ if (property.nam == this->membership_)
+ {
+ PortableGroup::MembershipStyleValue membership;
+ if (!(property.val >>= membership)
+ || (membership != PortableGroup::MEMB_APP_CTRL
+ && membership != PortableGroup::MEMB_INF_CTRL))
+ invalid_criteria[p++] = property;
+ }
+ else if (property.nam == this->factories_)
+ {
+ PortableGroup::FactoriesValue * factories;
+ if (!(property.val >>= factories))
+ invalid_criteria[p++] = property;
+ else
+ {
+ const CORBA::ULong flen = factories->length ();
+
+ if (flen == 0)
+ invalid_criteria[p++] = property;
+ else
+ {
+ for (CORBA::ULong j = 0; j < flen; ++j)
+ {
+ const PortableGroup::FactoryInfo & factory_info =
+ (*factories)[j];
+
+ if (CORBA::is_nil (factory_info.the_factory.in ())
+ || factory_info.the_location.length () == 0)
+ {
+ invalid_criteria[p++] = property;
+ break;
+ }
+ }
+ }
+ }
+ }
+ }
+
+ if (p > 0)
+ {
+ // Reduce the length of the invalid criteria sequence in an
+ // effort to optimize the copying that will occur when the below
+ // exception is thrown. Reducing the length is fast since no
+ // deallocations should occur.
+ invalid_criteria.length (p);
+
+ ACE_THROW (PortableGroup::InvalidCriteria (invalid_criteria));
+ }
+}
+
+TAO_END_VERSIONED_NAMESPACE_DECL
diff --git a/TAO/orbsvcs/orbsvcs/PortableGroup/PG_Default_Property_Validator.h b/TAO/orbsvcs/orbsvcs/PortableGroup/PG_Default_Property_Validator.h
new file mode 100644
index 00000000000..9f9ced075d9
--- /dev/null
+++ b/TAO/orbsvcs/orbsvcs/PortableGroup/PG_Default_Property_Validator.h
@@ -0,0 +1,86 @@
+// -*- C++ -*-
+
+//=============================================================================
+/**
+ * @file PG_Default_Property_Validator.h
+ *
+ * $Id$
+ *
+ * @author Ossama Othman <ossama@uci.edu>
+ */
+//=============================================================================
+
+#ifndef TAO_PG_DEFAULT_PROPERTY_VALIDATOR_H
+#define TAO_PG_DEFAULT_PROPERTY_VALIDATOR_H
+
+#include /**/ "ace/pre.h"
+
+#include "orbsvcs/PortableGroup/portablegroup_export.h"
+#include "orbsvcs/PortableGroupC.h"
+
+#if !defined (ACE_LACKS_PRAGMA_ONCE)
+#pragma once
+#endif /* ACE_LACKS_PRAGMA_ONCE */
+
+TAO_BEGIN_VERSIONED_NAMESPACE_DECL
+
+/**
+ * @class TAO_PG_Default_Property_Validator
+ *
+ * @brief Default property validator implementation.
+ *
+ * This Property_Validator verifies that all properties defined in the
+ * PortableGroup IDL module are valid. This property validator can be
+ * subclassed to validate a different property set.
+ */
+class TAO_PortableGroup_Export TAO_PG_Default_Property_Validator
+{
+public:
+
+ /// Constructor.
+ TAO_PG_Default_Property_Validator (void);
+
+ /// Destructor
+ virtual ~TAO_PG_Default_Property_Validator (void);
+
+ /// Validate the given properties. Throw an exception when the
+ /// first invalid property is encountered. The remaining properties
+ /// will not be validated.
+ virtual void validate_property (const PortableGroup::Properties & props
+ ACE_ENV_ARG_DECL)
+ ACE_THROW_SPEC ((CORBA::SystemException,
+ PortableGroup::InvalidProperty,
+ PortableGroup::UnsupportedProperty));
+
+ /// Validate the given properties/criteria. All criteria
+ /// will be validated regardless of whether or not an invalid
+ /// property was encountered.
+ virtual void validate_criteria (const PortableGroup::Properties & criteria
+ ACE_ENV_ARG_DECL)
+ ACE_THROW_SPEC ((CORBA::SystemException,
+ PortableGroup::InvalidCriteria,
+ PortableGroup::CannotMeetCriteria));
+
+private:
+
+ /**
+ * @name Pre-initialize property Names.
+ *
+ * These properties are pre-initialized once to reduce property
+ * validation overhead. Note that the InitialNumberReplicas and
+ * MinimumNumberReplicas properties are not validated since there are
+ * no restrictions imposed by TAO's PortableGroup implementation
+ * regarding the number of such members.
+ */
+ //@{
+ PortableGroup::Name membership_;
+ PortableGroup::Name factories_;
+ //@}
+
+};
+
+TAO_END_VERSIONED_NAMESPACE_DECL
+
+#include /**/ "ace/post.h"
+
+#endif /* TAO_PG_PROPERTY_VALIDATOR_H */
diff --git a/TAO/orbsvcs/orbsvcs/PortableGroup/PG_FactoryRegistry.cpp b/TAO/orbsvcs/orbsvcs/PortableGroup/PG_FactoryRegistry.cpp
new file mode 100644
index 00000000000..330d3984006
--- /dev/null
+++ b/TAO/orbsvcs/orbsvcs/PortableGroup/PG_FactoryRegistry.cpp
@@ -0,0 +1,733 @@
+// -*- C++ -*-
+// $Id$
+
+#include "orbsvcs/PortableGroup/PG_FactoryRegistry.h"
+
+#include "ace/Get_Opt.h"
+#include "ace/Vector_T.h"
+#include "ace/OS_NS_stdio.h"
+#include "ace/OS_NS_unistd.h"
+#include "ace/Auto_Ptr.h"
+#include "tao/debug.h"
+#include "tao/ORB_Constants.h"
+#include "tao/PortableServer/POAManagerC.h"
+#include "orbsvcs/PortableGroup/PG_Operators.h" // operator == on CosNaming::Name
+
+TAO_BEGIN_VERSIONED_NAMESPACE_DECL
+
+// Use this macro at the beginning of CORBA methods
+// to aid in debugging.
+#define METHOD_ENTRY(name) \
+ if (TAO_debug_level <= 6){} else \
+ ACE_DEBUG (( LM_DEBUG, \
+ "Enter %s\n", #name \
+ ))
+
+// Use this macro to return from CORBA methods
+// to aid in debugging. Note that you can specify
+// the return value after the macro, for example:
+// METHOD_RETURN(Plugh::plover) xyzzy; is equivalent
+// to return xyzzy;
+// METHOD_RETURN(Plugh::troll); is equivalent to
+// return;
+// WARNING: THIS GENERATES TWO STATEMENTS!!! THE FOLLOWING
+// will not do what you want it to:
+// if (cave_is_closing) METHOD_RETURN(Plugh::pirate) aarrggh;
+// Moral: Always use braces.
+#define METHOD_RETURN(name) \
+ if (TAO_debug_level <= 6){} else \
+ ACE_DEBUG (( LM_DEBUG, \
+ "Leave %s\n", #name \
+ )); \
+ return /* value goes here */
+
+TAO::PG_FactoryRegistry::PG_FactoryRegistry (const char * name)
+ : identity_(name)
+ , orb_ (0)
+ , poa_ (0)
+ , object_id_ (0)
+ , this_obj_ (0)
+ , ior_output_file_(0)
+ , ns_name_(0)
+ , naming_context_(0)
+ , this_name_(1)
+ , quit_on_idle_(0)
+ , quit_state_(LIVE)
+ , linger_(0)
+{
+}
+
+TAO::PG_FactoryRegistry::~PG_FactoryRegistry (void)
+{
+}
+
+//////////////////////////////////////////////////////
+// PG_FactoryRegistry public, non-CORBA methods
+
+int TAO::PG_FactoryRegistry::parse_args (int argc, char * argv[])
+{
+ ACE_Get_Opt get_opts (argc, argv, "o:n:q");
+ int c;
+
+ while ((c = get_opts ()) != -1)
+ {
+ switch (c)
+ {
+ case 'o':
+ {
+ this->ior_output_file_ = get_opts.opt_arg ();
+ break;
+ }
+ case 'n':
+ {
+ this->ns_name_ = get_opts.opt_arg();
+ break;
+ }
+ case 'q':
+ {
+ this->quit_on_idle_ = 1;
+ break;
+ }
+
+ case '?':
+ // fall thru
+ default:
+ ACE_ERROR_RETURN ((LM_ERROR,
+ "usage: %s"
+ " -o <registry ior file>"
+ " -n <name to use to register with name service>"
+ " -q{uit on idle}"
+ "\n",
+ argv [0]),
+ -1);
+ break;
+ }
+ }
+ // Indicates sucessful parsing of the command line
+ return 0;
+}
+
+const char * TAO::PG_FactoryRegistry::identity () const
+{
+ return this->identity_.c_str();
+}
+
+void TAO::PG_FactoryRegistry::_remove_ref (ACE_ENV_SINGLE_ARG_DECL_NOT_USED)
+{
+ this->quit_state_ = GONE;
+}
+
+int TAO::PG_FactoryRegistry::idle (int & result ACE_ENV_ARG_DECL_NOT_USED)
+{
+ result = 0;
+ int quit = 0;
+ if (this->quit_state_ == GONE)
+ {
+ if (linger_ < 2)
+ {
+ ++linger_;
+ }
+ else
+ {
+ quit = 1;
+ }
+ }
+ return quit;
+}
+
+
+int TAO::PG_FactoryRegistry::fini (ACE_ENV_SINGLE_ARG_DECL)
+{
+ if (this->ior_output_file_ != 0)
+ {
+ ACE_OS::unlink (this->ior_output_file_);
+ this->ior_output_file_ = 0;
+ }
+ if (this->ns_name_ != 0)
+ {
+ this->naming_context_->unbind (this_name_
+ ACE_ENV_ARG_PARAMETER);
+ this->ns_name_ = 0;
+ }
+ return 0;
+}
+
+
+void TAO::PG_FactoryRegistry::init (CORBA::ORB_ptr orb, PortableServer::POA_ptr poa ACE_ENV_ARG_DECL)
+{
+ ACE_ASSERT (CORBA::is_nil (this->orb_.in ()));
+ ACE_ASSERT (CORBA::is_nil (this->poa_.in ()));
+ this->orb_ = CORBA::ORB::_duplicate (orb);
+ this->poa_ = PortableServer::POA::_duplicate (poa);
+ ACE_ASSERT ( ! CORBA::is_nil (this->orb_.in ()));
+ ACE_ASSERT ( ! CORBA::is_nil (this->poa_.in ()));
+
+ // Register with the POA.
+ this->object_id_ = this->poa_->activate_object (this ACE_ENV_ARG_PARAMETER);
+ ACE_CHECK;
+
+ // find my identity as a corba object
+ this->this_obj_ =
+ this->poa_->id_to_reference (object_id_.in ()
+ ACE_ENV_ARG_PARAMETER);
+ ACE_CHECK;
+
+ // and create a ior string
+ this->ior_ = this->orb_->object_to_string (this->this_obj_.in ()
+ ACE_ENV_ARG_PARAMETER);
+ ACE_CHECK;
+
+}
+
+int TAO::PG_FactoryRegistry::init (CORBA::ORB_ptr orb
+ ACE_ENV_ARG_DECL)
+{
+ int result = 0;
+
+ this->orb_ = CORBA::ORB::_duplicate (orb);
+
+ // Use the ROOT POA for now
+ CORBA::Object_var poa_object =
+ this->orb_->resolve_initial_references (TAO_OBJID_ROOTPOA
+ ACE_ENV_ARG_PARAMETER);
+ ACE_CHECK_RETURN (-1);
+
+ if (CORBA::is_nil (poa_object.in ()))
+ ACE_ERROR_RETURN ((LM_ERROR,
+ ACE_TEXT (" (%P|%t) Unable to initialize the POA.\n")),
+ -1);
+
+ // Get the POA object.
+ this->poa_ =
+ PortableServer::POA::_narrow (poa_object.in ()
+ ACE_ENV_ARG_PARAMETER);
+
+ ACE_CHECK_RETURN (-1);
+
+ if (CORBA::is_nil (this->poa_.in()))
+ {
+ ACE_ERROR_RETURN ((LM_ERROR,
+ ACE_TEXT (" (%P|%t) Unable to narrow the POA.\n")),
+ -1);
+ }
+
+ PortableServer::POAManager_var poa_manager =
+ this->poa_->the_POAManager (ACE_ENV_SINGLE_ARG_PARAMETER);
+ ACE_CHECK_RETURN(-1);
+
+ poa_manager->activate (ACE_ENV_SINGLE_ARG_PARAMETER);
+ ACE_CHECK_RETURN(-1);
+
+ // Register with the POA.
+ this->object_id_ = this->poa_->activate_object (this ACE_ENV_ARG_PARAMETER);
+ ACE_CHECK_RETURN(-1);
+
+ // find my identity as a corba object
+ this->this_obj_ =
+ this->poa_->id_to_reference (object_id_.in ()
+ ACE_ENV_ARG_PARAMETER);
+ ACE_CHECK_RETURN(-1);
+
+
+ // and create a ior string
+ this->ior_ = this->orb_->object_to_string (this->this_obj_.in ()
+ ACE_ENV_ARG_PARAMETER);
+ ACE_CHECK_RETURN(-1);
+
+
+ if (this->ior_output_file_ != 0)
+ {
+ this->identity_ = "file:";
+ this->identity_ += this->ior_output_file_;
+ result = write_ior_file (this->ior_output_file_,
+ this->ior_.in ());
+ }
+
+ if (this->ns_name_ != 0)
+ {
+ this->identity_ = "name:";
+ this->identity_ += this->ns_name_;
+
+ CORBA::Object_var naming_obj =
+ this->orb_->resolve_initial_references ("NameService" ACE_ENV_ARG_PARAMETER);
+ ACE_CHECK_RETURN(-1);
+
+ if (CORBA::is_nil(naming_obj.in ())){
+ ACE_ERROR_RETURN ((LM_ERROR,
+ "%T %n (%P|%t) Unable to find the Naming Service\n"),
+ 1);
+ }
+
+ this->naming_context_ =
+ CosNaming::NamingContext::_narrow (naming_obj.in () ACE_ENV_ARG_PARAMETER);
+ ACE_CHECK_RETURN(-1);
+
+ this->this_name_.length (1);
+ this->this_name_[0].id = CORBA::string_dup (this->ns_name_);
+
+ this->naming_context_->rebind (this->this_name_, this->this_obj_.in() //CORBA::Object::_duplicate(this_obj)
+ ACE_ENV_ARG_PARAMETER);
+ ACE_CHECK_RETURN(-1);
+ }
+
+ return result;
+}
+
+
+::PortableGroup::FactoryRegistry_ptr TAO::PG_FactoryRegistry::reference()
+{
+ // narrow and duplicate
+ return ::PortableGroup::FactoryRegistry::_narrow(this->this_obj_.in ());
+}
+
+
+//////////////////////////////////////////
+// PG_FactoryRegistry CORBA methods
+
+/* Reference:info
+ typedef CosNaming::Name Name;
+ typedef Name Location;
+ struct FactoryInfo {
+ GenericFactory the_factory;
+ Location the_location;
+ Criteria the_criteria;
+ };
+ typedef sequence<FactoryInfo> FactoryInfos;
+*/
+
+TAO::PG_FactoryRegistry::RoleInfo::RoleInfo(size_t estimated_number_entries)
+ : infos_(estimated_number_entries)
+{
+}
+
+
+void TAO::PG_FactoryRegistry::register_factory (
+ const char * role,
+ const char * type_id,
+ const PortableGroup::FactoryInfo & factory_info
+ ACE_ENV_ARG_DECL
+ )
+ ACE_THROW_SPEC ((
+ CORBA::SystemException
+ , PortableGroup::MemberAlreadyPresent
+ , PortableGroup::TypeConflict))
+{
+ METHOD_ENTRY(TAO::PG_FactoryRegistry::register_factory);
+
+ RoleInfo * role_info = 0;
+ auto_ptr<RoleInfo> safe_entry;
+ if (this->registry_.find(role, role_info) != 0)
+ {
+ ACE_DEBUG(( LM_DEBUG,
+ "%s: adding new role: %s:%s\n",
+ this->identity_.c_str(), role, type_id));
+
+ // Note the 5. It's a guess about the number of factories
+ // that might exist for any particular role object.
+ // todo: make it a parameter.
+ ACE_NEW_THROW_EX (role_info,
+ RoleInfo(5),
+ CORBA::NO_MEMORY());
+ ACE_CHECK;
+
+ ACE_AUTO_PTR_RESET (safe_entry, role_info, RoleInfo);
+ role_info->type_id_ = type_id;
+ }
+ else
+ {
+ if (role_info->type_id_ != type_id)
+ {
+ ACE_THROW ( PortableGroup::TypeConflict() );
+ }
+ }
+
+ PortableGroup::FactoryInfos & infos = role_info->infos_;;
+ size_t length = infos.length();
+ for (size_t nInfo = 0; nInfo < length; ++nInfo)
+ {
+ PortableGroup::FactoryInfo & info = infos[nInfo];
+ if (info.the_location == factory_info.the_location)
+ {
+ ACE_ERROR(( LM_ERROR,
+ "%s: Attempt to register duplicate location %s for role: %s\n" ,
+ this->identity_.c_str(),
+ static_cast<const char *> (info.the_location[0].id),
+ role));
+ ACE_THROW (PortableGroup::MemberAlreadyPresent() );
+ }
+ }
+
+ infos.length(length + 1);
+ infos[length] = factory_info;
+
+ if (safe_entry.get() != 0)
+ {
+ this->registry_.bind(role, safe_entry.release());
+ }
+
+ ACE_DEBUG(( LM_DEBUG,
+ "%s: Added factory: [%d] %s@%s \n",
+ this->identity_.c_str(),
+ static_cast<int> (length + 1),
+ role,
+ static_cast<const char *> (factory_info.the_location[0].id)
+ ));
+
+ METHOD_RETURN(TAO::PG_FactoryRegistry::register_factory);
+}
+
+void TAO::PG_FactoryRegistry::unregister_factory (
+ const char * role,
+ const PortableGroup::Location & location
+ ACE_ENV_ARG_DECL
+ )
+ ACE_THROW_SPEC ((CORBA::SystemException, PortableGroup::MemberNotFound))
+{
+ METHOD_ENTRY(TAO::PG_FactoryRegistry::unregister_factory);
+
+ RoleInfo * role_info = 0;
+ if (this->registry_.find(role, role_info) == 0)
+ {
+ PortableGroup::FactoryInfos & infos = role_info->infos_;
+ int found = 0;
+ size_t length = infos.length();
+ for (size_t nInfo = 0; !found && nInfo < length; ++nInfo)
+ {
+ PortableGroup::FactoryInfo & info = infos[nInfo];
+ if (info.the_location == location)
+ {
+ found = 1;
+
+ ACE_ERROR(( LM_INFO,
+ "%s: Unregistering factory %s@%s\n",
+ this->identity_.c_str(),
+ role,
+ static_cast<const char *> (location[0].id)
+ ));
+ if (length > 1)
+ {
+ // if this is not the last entry
+ if (nInfo + 1 < length)
+ {
+ // move last entry into newly-emptied slot
+ infos[nInfo] = infos[length - 1];
+ nInfo = length -1;
+ }
+ infos.length(nInfo);
+ }
+ else
+ {
+ ACE_ASSERT ( length == 1 );
+ if (this->registry_.unbind (role) == 0)
+ {
+ ACE_DEBUG(( LM_INFO,
+ "%s: No more factories registered for %s\n",
+ this->identity_.c_str(),
+ role
+ ));
+ delete role_info;
+ }
+ else
+ {
+ ACE_ERROR ((LM_ERROR,
+ "%s: LOGIC ERROR AT " __FILE__ " (%d): Entry to be deleted disappeared\n",
+ this->identity_.c_str(),
+ __LINE__));
+ }
+ }
+ }
+ }
+ }
+ else
+ {
+ ACE_ERROR(( LM_ERROR,
+ "%s, Attempt to unregister factory for unknown role %s\n",
+ this->identity_.c_str(),
+ role
+ ));
+ ACE_THROW ( PortableGroup::MemberNotFound() );
+ }
+
+ //////////////////////
+ // request complete
+ // check quit-on-idle
+ if (registry_.current_size() == 0 && quit_state_ == LIVE)
+ {
+ ACE_ERROR(( LM_INFO,
+ "%s is idle\n",
+ identity()
+ ));
+ if (quit_on_idle_)
+ {
+ this->poa_->deactivate_object (this->object_id_.in ()
+ ACE_ENV_ARG_PARAMETER);
+ quit_state_ = DEACTIVATED;
+ }
+ }
+
+ METHOD_RETURN(TAO::PG_FactoryRegistry::unregister_factory);
+}
+
+void TAO::PG_FactoryRegistry::unregister_factory_by_role (
+ const char * role
+ ACE_ENV_ARG_DECL
+ )
+ ACE_THROW_SPEC ((CORBA::SystemException))
+{
+ METHOD_ENTRY(TAO::PG_FactoryRegistry::unregister_factory_by_role);
+
+ RoleInfo * role_info = 0;
+ if (this->registry_.unbind(role, role_info) == 0)
+ {
+ ACE_DEBUG(( LM_DEBUG,
+ "%s: Unregistering all factories for role %s\n",
+ this->identity_.c_str(),
+ role
+ ));
+ // delete the entire set of factories for this location.
+ delete role_info;
+ }
+ else
+ {
+ ACE_ERROR(( LM_INFO,
+ "%s: Unregister_factory_by_role: unknown role: %s\n",
+ this->identity_.c_str(),
+ role
+ ));
+ }
+
+ /////////////////////
+ // Function complete
+ // check quit options
+ if (registry_.current_size() == 0 && quit_state_ == LIVE)
+ {
+ ACE_ERROR(( LM_INFO,
+ "%s is idle\n",
+ identity()
+ ));
+ if (quit_on_idle_)
+ {
+ this->poa_->deactivate_object (this->object_id_.in ()
+ ACE_ENV_ARG_PARAMETER);
+ quit_state_ = DEACTIVATED;
+ }
+ }
+
+ METHOD_RETURN(TAO::PG_FactoryRegistry::unregister_factory_by_role);
+}
+
+void TAO::PG_FactoryRegistry::unregister_factory_by_location (
+ const PortableGroup::Location & location
+ ACE_ENV_ARG_DECL
+ )
+ ACE_THROW_SPEC ((CORBA::SystemException))
+{
+ METHOD_ENTRY(TAO::PG_FactoryRegistry::unregister_factory_by_location);
+
+ ////////////////////////////////////////////
+ // a vector of roles that need to be deleted.
+ ACE_Vector<ACE_CString> emptyRoles;
+
+ // iterate through the registery
+ for (RegistryType_Iterator it = this->registry_.begin();
+ it != this->registry_.end();
+ ++it)
+ {
+ RegistryType_Entry & entry = *it;
+ ACE_CString & role = entry.ext_id_;
+ RoleInfo * role_info = entry.int_id_;
+
+ PortableGroup::FactoryInfos & infos = role_info->infos_;
+ // ACE_ERROR((LM_INFO, "unregister_factory_by_location: Checking role %s\n", role.c_str() ));
+
+ int found = 0;
+ size_t length = infos.length();
+ for (size_t nInfo = 0; !found && nInfo < length; ++nInfo)
+ {
+ PortableGroup::FactoryInfo & info = infos[nInfo];
+ if (info.the_location == location)
+ {
+
+ ACE_ERROR((LM_INFO,
+ "%s: Unregister_factory_by_location: Removing: [%d] %s@%s\n",
+ this->identity_.c_str(),
+ static_cast<int> (nInfo),
+ role.c_str(),
+ static_cast<const char *> (location[0].id)
+ ));
+ found = 1;
+ if (length > 1)
+ {
+ while (nInfo + 1 < length)
+ {
+ ACE_ERROR((LM_INFO,
+ "%s: Unregister_factory_by_location: Move: [%d] %s to [%d]\n",
+ this->identity_.c_str(),
+ (int)nInfo + 1, role.c_str(), (int)nInfo
+ ));
+ infos[nInfo] = infos[nInfo + 1];
+ nInfo += 1;
+ }
+ ACE_ERROR((LM_INFO,
+ "%s: unregister_factory_by_location: New length [%d] %s\n",
+ this->identity_.c_str(),
+ (int)nInfo, role.c_str()
+ ));
+ infos.length(nInfo);
+ }
+ else
+ {
+ ACE_ERROR((LM_INFO,
+ "%s: Removed all entries for %s\n",
+ this->identity_.c_str(),
+ role.c_str()
+ ));
+ ACE_ASSERT ( length == 1 );
+ // remember entries to be deleted
+ emptyRoles.push_back(entry.ext_id_);
+ }
+ }
+ }
+ }
+
+ // now remove any roles that became empty
+
+ for (size_t nRole = 0; nRole < emptyRoles.size(); ++nRole)
+ {
+ ACE_ERROR((LM_INFO,
+ "%s: Remove role %s\n",
+ this->identity_.c_str(),
+ emptyRoles[nRole].c_str()
+ ));
+ RoleInfo * role_info;
+ if (this->registry_.unbind(emptyRoles[nRole], role_info) == 0)
+ {
+ delete role_info;
+ }
+ else
+ {
+ ACE_ERROR ((LM_ERROR,
+ "%s: LOGIC ERROR AT " __FILE__ " (%d): Role to be deleted disappeared\n",
+ this->identity_.c_str(),
+ __LINE__));
+ }
+ }
+ //////////////////////////
+ // If all types are gone...
+ if (registry_.current_size() == 0 && quit_state_ == LIVE)
+ {
+ ACE_ERROR(( LM_INFO,
+ "%s is idle\n",
+ identity()
+ ));
+ if (quit_on_idle_)
+ {
+ this->poa_->deactivate_object (this->object_id_.in ()
+ ACE_ENV_ARG_PARAMETER);
+ quit_state_ = DEACTIVATED;
+ }
+ }
+
+ METHOD_RETURN(TAO::PG_FactoryRegistry::unregister_factory_by_location);
+}
+
+::PortableGroup::FactoryInfos * TAO::PG_FactoryRegistry::list_factories_by_role (
+ const char * role,
+ CORBA::String_out type_id
+ ACE_ENV_ARG_DECL
+ )
+ ACE_THROW_SPEC ((CORBA::SystemException))
+{
+ METHOD_ENTRY(TAO::PG_FactoryRegistry::list_factories_by_role);
+
+ // allocate stucture to be returned.
+ PortableGroup::FactoryInfos_var result = 0;
+ ACE_NEW_THROW_EX (result, ::PortableGroup::FactoryInfos(),
+ CORBA::NO_MEMORY (TAO::VMCID, CORBA::COMPLETED_NO));
+
+ ACE_CHECK_RETURN (0);
+
+ RoleInfo * role_info = 0;
+ if (this->registry_.find(role, role_info) == 0)
+ {
+ type_id = CORBA::string_dup(role_info->type_id_.c_str());
+ (*result) = role_info->infos_;
+ }
+ else
+ {
+ type_id = CORBA::string_dup("");
+ ACE_ERROR(( LM_INFO,
+ "%s: list_factories_by_role: unknown role %s\n",
+ this->identity_.c_str(),
+ role
+ ));
+ }
+ METHOD_RETURN(TAO::PG_FactoryRegistry::list_factories_by_role) result._retn();
+}
+
+::PortableGroup::FactoryInfos * TAO::PG_FactoryRegistry::list_factories_by_location (
+ const PortableGroup::Location & location
+ ACE_ENV_ARG_DECL
+ )
+ ACE_THROW_SPEC ((CORBA::SystemException))
+{
+ METHOD_ENTRY(TAO::PG_FactoryRegistry::list_factories_by_location);
+ ::PortableGroup::FactoryInfos_var result;
+ ACE_NEW_THROW_EX (result, ::PortableGroup::FactoryInfos(this->registry_.current_size()),
+ CORBA::NO_MEMORY (TAO::VMCID, CORBA::COMPLETED_NO));
+
+ ACE_CHECK_RETURN (0);
+
+ size_t result_length = 0;
+
+ // iterate through the registery
+ for (RegistryType_Iterator it = this->registry_.begin();
+ it != this->registry_.end();
+ ++it)
+ {
+ RegistryType_Entry & entry = *it;
+ RoleInfo * role_info = entry.int_id_;
+
+ PortableGroup::FactoryInfos & found_infos = role_info->infos_;
+ // iterate through the entry for this type
+ int found = 0;
+ size_t length = found_infos.length();
+ for (size_t nInfo = 0; !found && nInfo < length; ++nInfo)
+ {
+ PortableGroup::FactoryInfo & info = found_infos[nInfo];
+ if (info.the_location == location)
+ {
+ found = 1;
+ result_length += 1;
+ result->length(result_length);
+ (*result)[result_length-1] = info;
+ }
+ }
+ }
+
+ METHOD_RETURN(TAO::PG_FactoryRegistry::list_factories_by_location) result._retn();
+}
+
+//////////////////////////////
+// Implementation methods
+
+int TAO::PG_FactoryRegistry::write_ior_file(const char * outputFile, const char * ior)
+{
+ int result = -1;
+ FILE* out = ACE_OS::fopen (outputFile, "w");
+ if (out)
+ {
+ ACE_OS::fprintf (out, "%s", ior);
+ ACE_OS::fclose (out);
+ result = 0;
+ }
+ else
+ {
+ ACE_ERROR ((LM_ERROR,
+ "Open failed for %s\n", outputFile
+ ));
+ }
+ return result;
+}
+
+TAO_END_VERSIONED_NAMESPACE_DECL
diff --git a/TAO/orbsvcs/orbsvcs/PortableGroup/PG_FactoryRegistry.h b/TAO/orbsvcs/orbsvcs/PortableGroup/PG_FactoryRegistry.h
new file mode 100644
index 00000000000..b16268b5f66
--- /dev/null
+++ b/TAO/orbsvcs/orbsvcs/PortableGroup/PG_FactoryRegistry.h
@@ -0,0 +1,263 @@
+// -*- C++ -*-
+
+//=============================================================================
+/**
+ * @file PG_FactoryRegistry.h
+ *
+ * $Id$
+ *
+ * This file declares the implementation of PortableGroup::FactoryRegistry.
+ * Eventually this should be folded into the Fault Tolerance ReplicationManager
+ *
+ * @author Dale Wilson <wilson_d@ociweb.com>
+ */
+//=============================================================================
+
+#ifndef TAO_PG_FACTORYREGISTRY_H_
+#define TAO_PG_FACTORYREGISTRY_H_
+#include /**/ "ace/pre.h"
+#include /**/ "ace/ACE.h"
+
+#if !defined (ACE_LACKS_PRAGMA_ONCE)
+#pragma once
+#endif /* ACE_LACKS_PRAGMA_ONCE */
+
+#include "tao/Versioned_Namespace.h"
+
+/////////////////////////////////
+// Includes needed by this header
+#include "orbsvcs/PortableGroup/portablegroup_export.h"
+#include "orbsvcs/PortableGroupS.h"
+#include "ace/Hash_Map_Manager.h"
+#include "ace/SString.h"
+#include "ace/Null_Mutex.h"
+
+TAO_BEGIN_VERSIONED_NAMESPACE_DECL
+
+//////////////////////////////////
+// Classes declared in this header
+namespace TAO
+{
+ class PG_FactoryRegistry;
+}
+
+/////////////////////
+// Forward references
+
+namespace TAO
+{
+ /**
+ * Implement the PortableGroup::FactoryRegistry interface
+ * Note FactoryRegistry is not part of the OMG standard. It was added
+ * as part of the TAO implementation of Fault Tolerant CORBA
+ */
+ class TAO_PortableGroup_Export PG_FactoryRegistry
+ : public virtual POA_PortableGroup::FactoryRegistry
+ {
+ struct RoleInfo
+ {
+ ACE_CString type_id_;
+ PortableGroup::FactoryInfos infos_;
+
+ RoleInfo(size_t estimated_number_entries = 5);
+ };
+ typedef ACE_Null_Mutex MapMutex;
+ typedef ACE_Hash_Map_Manager <ACE_CString, RoleInfo *, MapMutex> RegistryType;
+ typedef ACE_Hash_Map_Entry <ACE_CString, RoleInfo *> RegistryType_Entry;
+ typedef ACE_Hash_Map_Iterator <ACE_CString, RoleInfo *, MapMutex> RegistryType_Iterator;
+
+ //////////////////////
+ // non-CORBA interface
+ public:
+ /// Constructor
+ PG_FactoryRegistry (const char * name = "FactoryRegistry");
+
+ /// virtual Destructor
+ virtual ~PG_FactoryRegistry (void);
+
+ /**
+ * Parse command line arguments.
+ * @param argc traditional C argc
+ * @param argv traditional C argv
+ * @return zero for success; nonzero is process return code for failure.
+ */
+ int parse_args (int argc, char * argv[]);
+
+ /**
+ * Initialize this object.
+ * @param orbManager our ORB -- we keep var to it.
+ * @return zero for success; nonzero is process return code for failure.
+ */
+ int init (CORBA::ORB_ptr orb ACE_ENV_ARG_DECL);
+
+ /**
+ * alternative init using designated poa
+ */
+ void init (CORBA::ORB_ptr orb, PortableServer::POA_ptr poa ACE_ENV_ARG_DECL);
+
+ /**
+ * Prepare to exit.
+ * @return zero for success; nonzero is process return code for failure.
+ */
+ int fini (ACE_ENV_SINGLE_ARG_DECL);
+
+ /**
+ * Processing to happen when the ORB's event loop is idle.
+ * @param result is a place to return status to be returned by the process
+ * @returns 0 to continue. 1 to quit.
+ */
+ int idle(int & result ACE_ENV_ARG_DECL);
+
+ /**
+ * Identify this object.
+ * @return a string to identify this object for logging/console message purposes.
+ */
+ const char * identity () const;
+
+ /**
+ * An object reference to the this object.
+ * Duplicated by the call so it may (and probably should) be assigned to a _var..
+ */
+ ::PortableGroup::FactoryRegistry_ptr reference();
+
+ ////////////////////////////////
+ // override servant base methods
+ virtual void _remove_ref (ACE_ENV_SINGLE_ARG_DECL);
+
+ //////////////////
+ // CORBA interface
+ // See IDL for documentation
+
+ virtual void register_factory (
+ const char * role,
+ const char * type_id,
+ const PortableGroup::FactoryInfo & factory_info
+ ACE_ENV_ARG_DECL
+ )
+ ACE_THROW_SPEC ((
+ CORBA::SystemException
+ , PortableGroup::MemberAlreadyPresent
+ , PortableGroup::TypeConflict));
+
+ virtual void unregister_factory (
+ const char * role,
+ const PortableGroup::Location & location
+ ACE_ENV_ARG_DECL
+ )
+ ACE_THROW_SPEC ((CORBA::SystemException, PortableGroup::MemberNotFound));
+
+ virtual void unregister_factory_by_role (
+ const char * role
+ ACE_ENV_ARG_DECL
+ )
+ ACE_THROW_SPEC ((CORBA::SystemException));
+
+
+ virtual void unregister_factory_by_location (
+ const PortableGroup::Location & location
+ ACE_ENV_ARG_DECL
+ )
+ ACE_THROW_SPEC ((CORBA::SystemException));
+
+ virtual ::PortableGroup::FactoryInfos * list_factories_by_role (
+ const char * role,
+ CORBA::String_out type_id
+ ACE_ENV_ARG_DECL
+ )
+ ACE_THROW_SPEC ((CORBA::SystemException));
+
+ virtual ::PortableGroup::FactoryInfos * list_factories_by_location (
+ const PortableGroup::Location & location
+ ACE_ENV_ARG_DECL
+ )
+ ACE_THROW_SPEC ((CORBA::SystemException));
+
+ /////////////////////////
+ // Implementation methods
+ private:
+ /**
+ * Write this factory's IOR to a file
+ */
+ int write_ior_file (const char * outputFile, const char * ior);
+
+ ///////////////
+ // Data Members
+ private:
+
+ /**
+ * A human-readable string to distinguish this from other Notifiers.
+ */
+ ACE_CString identity_;
+
+ /**
+ * Protect internal state.
+ * Mutex should be locked by corba methods, or by
+ * external (public) methods before calling implementation
+ * methods.
+ * Implementation methods should assume the mutex is
+ * locked if necessary.
+ */
+ TAO_SYNCH_MUTEX internals_;
+ typedef ACE_Guard<TAO_SYNCH_MUTEX> InternalGuard;
+
+ /**
+ * The orb
+ */
+ CORBA::ORB_var orb_;
+
+ /**
+ * The POA used to activate this object.
+ */
+ PortableServer::POA_var poa_;
+
+ /**
+ * The CORBA object id assigned to this object.
+ */
+ PortableServer::ObjectId_var object_id_;
+
+ /**
+ * This objects identity as a CORBA object.
+ */
+ CORBA::Object_var this_obj_;
+
+ /**
+ * IOR of this object as assigned by poa.
+ */
+ CORBA::String_var ior_;
+
+ /**
+ * A file to which the factory's IOR should be written.
+ */
+ const char * ior_output_file_;
+
+ /**
+ * A name to be used to register the factory with the name service.
+ */
+ const char * ns_name_;
+
+ CosNaming::NamingContext_var naming_context_;
+
+ CosNaming::Name this_name_;
+
+ /**
+ * Quit on idle flag.
+ */
+ int quit_on_idle_;
+
+ /**
+ * State of the quit process
+ */
+ enum {LIVE, DEACTIVATED, GONE} quit_state_;
+
+ int linger_;
+
+ RegistryType registry_;
+
+ };
+} // namespace TAO
+
+TAO_END_VERSIONED_NAMESPACE_DECL
+
+#include /**/ "ace/post.h"
+
+#endif // TAO_PG_FACTORYREGISTRY_H_
diff --git a/TAO/orbsvcs/orbsvcs/PortableGroup/PG_Factory_Map.h b/TAO/orbsvcs/orbsvcs/PortableGroup/PG_Factory_Map.h
new file mode 100644
index 00000000000..33c4e1cf421
--- /dev/null
+++ b/TAO/orbsvcs/orbsvcs/PortableGroup/PG_Factory_Map.h
@@ -0,0 +1,46 @@
+// -*- C++ -*-
+
+//=======================================================================
+/**
+ * @file PG_Factory_Map.h
+ *
+ * $Id$
+ *
+ * @author Ossama Othman <ossama@uci.edu>
+ */
+//=======================================================================
+
+
+#ifndef TAO_PG_FACTORY_MAP_H
+#define TAO_PG_FACTORY_MAP_H
+
+#include /**/ "ace/pre.h"
+
+#include "ace/config-all.h"
+
+#if !defined (ACE_LACKS_PRAGMA_ONCE)
+# pragma once
+#endif /* ACE_LACKS_PRAGMA_ONCE */
+
+#include "orbsvcs/PortableGroup/PG_Factory_Set.h"
+
+#include "orbsvcs/PortableGroupC.h"
+
+#include "ace/Hash_Map_Manager_T.h"
+#include "ace/Null_Mutex.h"
+
+TAO_BEGIN_VERSIONED_NAMESPACE_DECL
+
+/// Factory hash map.
+typedef ACE_Hash_Map_Manager_Ex<
+ ACE_UINT32,
+ TAO_PG_Factory_Set,
+ ACE_Hash<ACE_UINT32>,
+ ACE_Equal_To<ACE_UINT32>,
+ ACE_Null_Mutex> TAO_PG_Factory_Map;
+
+TAO_END_VERSIONED_NAMESPACE_DECL
+
+#include /**/ "ace/post.h"
+
+#endif /* TAO_PG_FACTORY_MAP_H */
diff --git a/TAO/orbsvcs/orbsvcs/PortableGroup/PG_Factory_Set.h b/TAO/orbsvcs/orbsvcs/PortableGroup/PG_Factory_Set.h
new file mode 100644
index 00000000000..9b545e49831
--- /dev/null
+++ b/TAO/orbsvcs/orbsvcs/PortableGroup/PG_Factory_Set.h
@@ -0,0 +1,58 @@
+// -*- C++ -*-
+
+//=======================================================================
+/**
+ * @file PG_Factory_Set.h
+ *
+ * $Id$
+ *
+ * @author Ossama Othman <ossama@uci.edu>
+ */
+//=======================================================================
+
+
+#ifndef TAO_PG_FACTORY_SET_H
+#define TAO_PG_FACTORY_SET_H
+
+#include /**/ "ace/pre.h"
+
+#include "ace/config-all.h"
+
+#if !defined (ACE_LACKS_PRAGMA_ONCE)
+# pragma once
+#endif /* ACE_LACKS_PRAGMA_ONCE */
+
+#include "orbsvcs/PortableGroupC.h"
+
+#include "ace/Array_Base.h"
+
+TAO_BEGIN_VERSIONED_NAMESPACE_DECL
+
+/**
+ * @class TAO_PG_Factory_Node
+ *
+ * @brief Structure that contains all factory-specific information.
+ *
+ * Each member created by the infrastructure instead of the
+ * application will have a corresponding TAO_PG_Factory_Node structure
+ * associated with it. A list of these will be maintained by the
+ * infrastructure so that it is possible for the instrastructure to
+ * destroy members it created when destroying the object group.
+ */
+struct TAO_PG_Factory_Node
+{
+ /// Member factory information.
+ PortableGroup::FactoryInfo factory_info;
+
+ /// FactoryCreationId assigned to the member.
+ PortableGroup::GenericFactory::FactoryCreationId_var factory_creation_id;
+
+};
+
+typedef ACE_Array_Base<TAO_PG_Factory_Node> TAO_PG_Factory_Set;
+
+TAO_END_VERSIONED_NAMESPACE_DECL
+
+#include /**/ "ace/post.h"
+
+#endif /* TAO_PG_FACTORY_SET_H */
diff --git a/TAO/orbsvcs/orbsvcs/PortableGroup/PG_GenericFactory.cpp b/TAO/orbsvcs/orbsvcs/PortableGroup/PG_GenericFactory.cpp
new file mode 100644
index 00000000000..0461276bea1
--- /dev/null
+++ b/TAO/orbsvcs/orbsvcs/PortableGroup/PG_GenericFactory.cpp
@@ -0,0 +1,780 @@
+#include "orbsvcs/PortableGroup/PG_GenericFactory.h"
+#include "orbsvcs/PortableGroup/PG_MemberInfo.h"
+#include "orbsvcs/PortableGroup/PG_ObjectGroupManager.h"
+#include "orbsvcs/PortableGroup/PG_PropertyManager.h"
+#include "orbsvcs/PortableGroup/PG_Property_Utils.h"
+#include "orbsvcs/PortableGroup/PG_conf.h"
+
+#include "ace/OS_NS_stdio.h"
+
+#include "tao/ORB_Constants.h"
+
+ACE_RCSID (PortableGroup,
+ PG_GenericFactory,
+ "$Id$")
+
+
+TAO_BEGIN_VERSIONED_NAMESPACE_DECL
+
+TAO_PG_GenericFactory::TAO_PG_GenericFactory (
+ TAO_PG_ObjectGroupManager & object_group_manager,
+ TAO_PG_PropertyManager & property_manager)
+ : poa_ (),
+ object_group_manager_ (object_group_manager),
+ property_manager_ (property_manager),
+ factory_map_ (TAO_PG_MAX_OBJECT_GROUPS),
+ next_fcid_ (0),
+ lock_ ()
+{
+ this->object_group_manager_.generic_factory (this);
+}
+
+TAO_PG_GenericFactory::~TAO_PG_GenericFactory (void)
+{
+ ACE_DECLARE_NEW_CORBA_ENV;
+
+ TAO_PG_Factory_Map::iterator end = this->factory_map_.end ();
+ for (TAO_PG_Factory_Map::iterator i = this->factory_map_.begin ();
+ i != end;
+ ++i)
+ {
+ TAO_PG_Factory_Set & factory_set = (*i).int_id_;
+
+ ACE_TRY
+ {
+ this->delete_object_i (factory_set,
+ 1 /* Ignore exceptions */
+ ACE_ENV_ARG_PARAMETER);
+ ACE_TRY_CHECK;
+ }
+ ACE_CATCHANY
+ {
+ // Ignore all exceptions.
+ }
+ ACE_ENDTRY;
+ }
+
+ (void) this->factory_map_.close ();
+}
+
+CORBA::Object_ptr
+TAO_PG_GenericFactory::create_object (
+ const char * type_id,
+ const PortableGroup::Criteria & the_criteria,
+ PortableGroup::GenericFactory::FactoryCreationId_out factory_creation_id
+ ACE_ENV_ARG_DECL)
+ ACE_THROW_SPEC ((CORBA::SystemException,
+ PortableGroup::NoFactory,
+ PortableGroup::ObjectNotCreated,
+ PortableGroup::InvalidCriteria,
+ PortableGroup::InvalidProperty,
+ PortableGroup::CannotMeetCriteria))
+{
+ PortableGroup::Properties_var properties =
+ this->property_manager_.get_type_properties (type_id
+ ACE_ENV_ARG_PARAMETER);
+ ACE_CHECK_RETURN (CORBA::Object::_nil ());
+
+ PortableGroup::MembershipStyleValue membership_style =
+ TAO_PG_MEMBERSHIP_STYLE;
+ PortableGroup::FactoriesValue factory_infos(0);
+
+ PortableGroup::InitialNumberMembersValue initial_number_members =
+ TAO_PG_INITIAL_NUMBER_MEMBERS;
+ PortableGroup::MinimumNumberMembersValue minimum_number_members =
+ TAO_PG_MINIMUM_NUMBER_MEMBERS;
+
+ // Make sure the criteria for the object group being created are
+ // valid.
+ this->process_criteria (type_id,
+ the_criteria,
+ membership_style,
+ factory_infos,
+ initial_number_members,
+ minimum_number_members
+ ACE_ENV_ARG_PARAMETER);
+ ACE_CHECK_RETURN (CORBA::Object::_nil ());
+
+ CORBA::ULong fcid = 0;
+
+ {
+ ACE_GUARD_RETURN (TAO_SYNCH_MUTEX,
+ guard,
+ this->lock_,
+ CORBA::Object::_nil ());
+
+ // Start out with an initial value.
+ fcid = this->next_fcid_;
+
+ // Loop until a free FactoryCreationId is found, being careful to
+ // search through the range of FactoryCreationIds only once.
+ while (this->factory_map_.find (this->next_fcid_) == 0)
+ {
+ this->next_fcid_++;
+
+ // If this is true, then no FactoryCreationIds are available.
+ // This is highly unlikely since TAO implements a
+ // FactoryCreationId as a 32 bit unsigned integer, meaning
+ // that over 4 billion object groups are being managed by this
+ // generic factory!
+ if (this->next_fcid_ == fcid)
+ ACE_THROW_RETURN (PortableGroup::ObjectNotCreated (),
+ CORBA::Object::_nil ());
+ }
+
+ // Just in case this->next_fcid_ was modified in the above search,
+ // reassign the value.
+ fcid = this->next_fcid_;
+ }
+
+ // The ObjectId for the newly created object group is comprised
+ // solely of the FactoryCreationId.
+ PortableServer::ObjectId_var oid;
+ this->get_ObjectId (fcid, oid.out ());
+
+ PortableGroup::ObjectGroup_var object_group =
+ this->object_group_manager_.create_object_group (fcid,
+ oid.in (),
+ type_id,
+ the_criteria
+ ACE_ENV_ARG_PARAMETER);
+ ACE_CHECK_RETURN (CORBA::Object::_nil ());
+
+ TAO_PG_Factory_Set factory_set;
+
+ const CORBA::ULong factory_infos_count = factory_infos.length ();
+
+ ACE_TRY
+ {
+ if (factory_infos_count > 0
+ && membership_style == PortableGroup::MEMB_INF_CTRL)
+ {
+ this->populate_object_group (object_group.in (),
+ type_id,
+ factory_infos,
+ initial_number_members,
+ factory_set
+ ACE_ENV_ARG_PARAMETER);
+ ACE_TRY_CHECK;
+
+ if (this->factory_map_.bind (fcid, factory_set) != 0)
+ ACE_TRY_THROW (PortableGroup::ObjectNotCreated ());
+
+ }
+
+ // Allocate a new FactoryCreationId for use as an "out" parameter.
+ PortableGroup::GenericFactory::FactoryCreationId * tmp = 0;
+ ACE_NEW_THROW_EX (tmp,
+ PortableGroup::GenericFactory::FactoryCreationId,
+ CORBA::NO_MEMORY (
+ CORBA::SystemException::_tao_minor_code (
+ TAO::VMCID,
+ ENOMEM),
+ CORBA::COMPLETED_NO));
+ ACE_CHECK_RETURN (CORBA::Object::_nil ());
+
+ factory_creation_id = tmp;
+
+ *tmp <<= fcid;
+ }
+ ACE_CATCHANY
+ {
+ this->delete_object_i (factory_set,
+ 1 /* Ignore exceptions */
+ ACE_ENV_ARG_PARAMETER);
+ ACE_TRY_CHECK;
+
+ this->object_group_manager_.destroy_object_group (oid.in ()
+ ACE_ENV_ARG_PARAMETER);
+ ACE_TRY_CHECK;
+
+ ACE_RE_THROW;
+ }
+ ACE_ENDTRY;
+ ACE_CHECK_RETURN (CORBA::Object::_nil ());
+
+ {
+ ACE_GUARD_RETURN (TAO_SYNCH_MUTEX,
+ guard,
+ this->lock_,
+ CORBA::Object::_nil ());
+
+ // Object group was successfully created. Increment the next
+ // FactoryCreationId in preparation for the next object group.
+ this->next_fcid_++;
+ }
+
+ return object_group._retn ();
+}
+
+void
+TAO_PG_GenericFactory::delete_object (
+ const PortableGroup::GenericFactory::FactoryCreationId &
+ factory_creation_id
+ ACE_ENV_ARG_DECL)
+ ACE_THROW_SPEC ((CORBA::SystemException,
+ PortableGroup::ObjectNotFound))
+{
+ CORBA::ULong fcid = 0;
+
+ if (factory_creation_id >>= fcid) // Extract the actual FactoryCreationId.
+ {
+ // Successfully extracted the FactoryCreationId. Now find the
+ // TAO_PG_Factory_Set corresponding to it.
+
+ ACE_GUARD (TAO_SYNCH_MUTEX, guard, this->lock_);
+
+ // If no entry exists in the factory map, infrastructure
+ // controlled membership was not used.
+ TAO_PG_Factory_Map::ENTRY *entry = 0;
+ if (this->factory_map_.find (fcid, entry) == 0)
+ {
+ TAO_PG_Factory_Set & factory_set = entry->int_id_;
+
+ this->delete_object_i (factory_set,
+ 0 /* Do not ignore exceptions */
+ ACE_ENV_ARG_PARAMETER);
+ ACE_CHECK;
+
+ if (this->factory_map_.unbind (fcid) != 0)
+ ACE_THROW (CORBA::INTERNAL ());
+ }
+ }
+ else
+ ACE_THROW (PortableGroup::ObjectNotFound ()); // @@
+ // CORBA::BAD_PARAM
+ // instead?
+
+ // The ObjectId for the newly created object group is comprised
+ // solely of the FactoryCreationId.
+ PortableServer::ObjectId_var oid;
+ this->get_ObjectId (fcid, oid.out ());
+
+ // Destroy the object group entry.
+ this->object_group_manager_.destroy_object_group (
+ oid.in ()
+ ACE_ENV_ARG_PARAMETER);
+ ACE_CHECK;
+}
+
+void
+TAO_PG_GenericFactory::delete_object_i (TAO_PG_Factory_Set & factory_set,
+ CORBA::Boolean ignore_exceptions
+ ACE_ENV_ARG_DECL)
+{
+ const size_t len = factory_set.size ();
+
+ size_t ilen = len;
+ for (size_t i = 0; i != len; ++i)
+ {
+ // Destroy the object group member in reverse order in case the
+ // array list is only partially destroyed and another call to
+ // GenericFactory::delete_object() occurs afterwards.
+ --ilen;
+
+ TAO_PG_Factory_Node & factory_node = factory_set[ilen];
+
+ PortableGroup::GenericFactory_ptr factory =
+ factory_node.factory_info.the_factory.in ();
+ const PortableGroup::GenericFactory::FactoryCreationId & member_fcid =
+ factory_node.factory_creation_id.in ();
+
+ ACE_TRY
+ {
+ factory->delete_object (member_fcid
+ ACE_ENV_ARG_PARAMETER);
+ ACE_TRY_CHECK;
+ }
+ ACE_CATCHANY
+ {
+ // Exceptions are generally only ignored when this
+ // GenericFactory (not the one being invoked above) is
+ // destroyed. The idea is to allow the GenericFactory to be
+ // destroyed regardless of whether or not all object group
+ // members have been destroyed, and minimize the number of
+ // object group members that have not been destroyed.
+ if (!ignore_exceptions)
+ ACE_RE_THROW;
+ }
+ ACE_ENDTRY;
+ ACE_CHECK;
+
+ // Since GenericFactory::delete_object() can throw an exception,
+ // decrease the size of the factory array incrementally since
+ // some object group members may not have been destroyed yet.
+ // Note that this size reduction is fast since no memory is
+ // actually deallocated.
+ factory_set.size (ilen);
+ }
+}
+
+void
+TAO_PG_GenericFactory::delete_member (
+ CORBA::ULong group_id,
+ const PortableGroup::Location & location
+ ACE_ENV_ARG_DECL)
+{
+ ACE_GUARD (TAO_SYNCH_MUTEX, guard, this->lock_);
+
+ // If no entry exists in the factory map, infrastructure
+ // controlled membership was not used.
+ TAO_PG_Factory_Map::ENTRY *entry = 0;
+ if (this->factory_map_.find (group_id, entry) == 0)
+ {
+ TAO_PG_Factory_Set & factory_set = entry->int_id_;
+
+ const size_t len = factory_set.size ();
+
+ // Iterate through the factory_set until a location match
+ // occurs. If a location match occurs, the member was created
+ // by the infrastructure, i.e. this GenericFactory
+ // implementation. If no location matches, the member was
+ // created by the application, and no operation will be
+ // performed.
+ //
+ // @todo This is linear search. Change to use a container with
+ // better search times.
+ for (size_t i = 0; i < len; ++i)
+ {
+ TAO_PG_Factory_Node & node = factory_set[i];
+ PortableGroup::FactoryInfo & info = node.factory_info;
+
+ if (info.the_location == location)
+ {
+ info.the_factory->delete_object (node.factory_creation_id.in ()
+ ACE_ENV_ARG_PARAMETER);
+ ACE_CHECK;
+
+ // The member has been successfully deleted. Reduce the
+ // size of the factory_set accordingly.
+ if (len > 1)
+ {
+ // Move the last element to the location of the
+ // current one and reduce the size of the set by
+ // one.
+ const size_t new_len = len - 1;
+ node = factory_set[new_len]; // Memberwise copy
+ factory_set.size (new_len);
+ }
+ else
+ {
+ // A copy isn't necessary if the last member was
+ // deleted.
+ factory_set.size (0);
+ }
+
+ return;
+ }
+ }
+ }
+}
+
+void
+TAO_PG_GenericFactory::poa (PortableServer::POA_ptr p)
+{
+ ACE_ASSERT (CORBA::is_nil (this->poa_.in ())
+ && !CORBA::is_nil (p));
+
+ this->poa_ = PortableServer::POA::_duplicate (p);
+}
+
+void
+TAO_PG_GenericFactory::populate_object_group (
+ PortableGroup::ObjectGroup_ptr object_group,
+ const char * type_id,
+ const PortableGroup::FactoryInfos & factory_infos,
+ PortableGroup::InitialNumberMembersValue initial_number_members,
+ TAO_PG_Factory_Set & factory_set
+ ACE_ENV_ARG_DECL)
+{
+ CORBA::ULong factory_infos_count = factory_infos.length ();
+ factory_set.size (factory_infos_count);
+
+ for (CORBA::ULong j = 0; j < factory_infos_count; ++j)
+ {
+ TAO_PG_Factory_Node & factory_node = factory_set[j];
+
+ const PortableGroup::FactoryInfo &factory_info = factory_infos[j];
+
+ if (j < static_cast<CORBA::ULong> (initial_number_members))
+ {
+ PortableGroup::GenericFactory_ptr factory =
+ factory_info.the_factory.in ();
+
+ if (CORBA::is_nil (factory))
+ {
+ // @@ instead InvalidProperty?
+ ACE_THROW (PortableGroup::NoFactory (factory_info.the_location,
+ type_id));
+ }
+
+ // Do not allow the PortableGroup::MemberAlreadyPresent
+ // exception to be propagated to this scope.
+ const CORBA::Boolean propagate_member_already_present = 0;
+
+ factory_node.factory_creation_id =
+ this->create_member (object_group,
+ factory_info,
+ type_id,
+ propagate_member_already_present
+ ACE_ENV_ARG_PARAMETER);
+ ACE_CHECK;
+ }
+
+ factory_node.factory_info = factory_info; // Memberwise copy
+ }
+}
+
+void
+TAO_PG_GenericFactory::get_ObjectId (
+ CORBA::ULong fcid,
+ PortableServer::ObjectId_out oid)
+{
+ // Since the POA used by the LoadManager uses the NON_RETAIN
+ // policy, explicitly choose an ObjectId that is unique to a given
+ // type.
+
+ // Make the ObjectId be the next value of the number of types that
+ // have been registered with the LoadManager. For example, if two
+ // types of objects have been registered with the LoadManager, then
+ // the ObjectId for the object currently being registered will be
+ // "3" since the object will be the third type of object registered
+ // with the LoadManager. Previously used values will not be reused
+ // to ensure that a ServantLocator does not inadvertently return a
+ // reference to an object that had a previously used ObjectId.
+ // Specifcally, the numerical value used for the ObjectId increases
+ // monotonically.
+
+ // 4294967295UL -- Largest 32 bit unsigned integer
+ // 123456789012 -- 10 digits
+ // + 2 for "UL" (unnecessary, but let's be safe)
+ // + 1 for null terminator
+ // + 1 for good luck. :-)
+ const size_t MAX_OID_LEN = 14;
+
+ char oid_str[MAX_OID_LEN] = { 0 };
+ ACE_OS::sprintf (oid_str,
+ "%ul",
+ fcid);
+
+ oid = PortableServer::string_to_ObjectId (oid_str);
+}
+
+void
+TAO_PG_GenericFactory::process_criteria (
+ const char * type_id,
+ const PortableGroup::Criteria & criteria,
+ PortableGroup::MembershipStyleValue & membership_style,
+ PortableGroup::FactoriesValue & factory_infos,
+ PortableGroup::InitialNumberMembersValue & initial_number_members,
+ PortableGroup::MinimumNumberMembersValue & minimum_number_members
+ ACE_ENV_ARG_DECL)
+{
+ // Get type-specific properties.
+ PortableGroup::Properties_var props =
+ this->property_manager_.get_type_properties (type_id
+ ACE_ENV_ARG_PARAMETER);
+ ACE_CHECK;
+
+ // Merge the given criteria with the type-specific criteria.
+ TAO_PG::override_properties (criteria, props.inout ());
+
+ PortableGroup::Criteria unmet_criteria;
+ unmet_criteria.length (4); // The four criteria understood by this
+ // method.
+
+ // Unmet criteria count.
+ CORBA::ULong uc = 0;
+
+ PortableGroup::Name name (1);
+ name.length (1);
+
+ PortableGroup::Value value;
+ PortableGroup::Value value1;
+ PortableGroup::Value value2;
+ PortableGroup::Value value3;
+
+ // MembershipStyle
+ name[0].id = CORBA::string_dup ("org.omg.PortableGroup.MembershipStyle");
+ if (TAO_PG::get_property_value (name, props.in (), value)
+ && (!(value >>= membership_style)
+ || (membership_style != PortableGroup::MEMB_APP_CTRL
+ && membership_style != PortableGroup::MEMB_INF_CTRL)))
+ {
+ // This only occurs if extraction of the actual value from the
+ // Any fails.
+ ACE_THROW (PortableGroup::InvalidProperty (name, value));
+ }
+
+ // Factories
+ const PortableGroup::FactoryInfos * factory_infos_tmp = 0;
+ name[0].id = CORBA::string_dup ("org.omg.PortableGroup.Factories");
+ if (TAO_PG::get_property_value (name, props.in (), value1)
+ && !(value1 >>= factory_infos_tmp))
+ {
+ // This only occurs if extraction of the actual value from the
+ // Any fails.
+ ACE_THROW (PortableGroup::InvalidProperty (name, value1));
+ }
+
+ const CORBA::ULong factory_infos_count =
+ (factory_infos_tmp == 0 ? 0 : factory_infos_tmp->length ());
+
+ // InitialNumberMembers
+ name[0].id =
+ CORBA::string_dup ("org.omg.PortableGroup.InitialNumberMembers");
+ if (TAO_PG::get_property_value (name, props.in (), value2)
+ && !(value2 >>= initial_number_members))
+ {
+ // This only occurs if extraction of the actual value from the
+ // Any fails.
+ ACE_THROW (PortableGroup::InvalidProperty (name, value2));
+ }
+
+ if (membership_style == PortableGroup::MEMB_INF_CTRL)
+ {
+ // If the number of factories is less than the initial number of
+ // members or the desired number of initial members cannot
+ // possibly be created.
+
+ if (factory_infos_count < static_cast<CORBA::ULong> (initial_number_members))
+ {
+ unmet_criteria[uc].nam = name;
+ unmet_criteria[uc++].val = value2;
+ }
+ }
+
+ // MinimumNumberMembers
+ name[0].id =
+ CORBA::string_dup ("org.omg.PortableGroup.MinimumNumberMembers");
+ if (TAO_PG::get_property_value (name, props.in (), value3)
+ && !(value3 >>= minimum_number_members))
+ {
+ // This only occurs if extraction of the actual value from the
+ // Any fails.
+ ACE_THROW (PortableGroup::InvalidProperty (name, value3));
+ }
+
+ // If the minimum number of members is less than the initial number
+ // of members, the MinimumNumberMembers property is cannot be
+ // initially met.
+ //
+ // @note This code is not part of the above "MEMB_INF_CTRL" criteria
+ // check since the "name" and "value" variables have been
+ // changed.
+ if (membership_style == PortableGroup::MEMB_INF_CTRL)
+ {
+ if (minimum_number_members < initial_number_members
+ || static_cast<CORBA::ULong> (minimum_number_members) > factory_infos_count)
+ {
+ unmet_criteria[uc].nam = name;
+ unmet_criteria[uc++].val = value3;
+ }
+ else if (factory_infos_tmp != 0)
+ {
+ factory_infos.length (factory_infos_count);
+ factory_infos = *factory_infos_tmp;
+ }
+ }
+
+ if (uc > 0)
+ {
+ // Reduce the length of the unmet criteria sequence in an effort
+ // to optimize the copying that will occur when the below
+ // exception is thrown. Reducing the length is fast since no
+ // deallocations should occur.
+ unmet_criteria.length (uc);
+
+ ACE_THROW (PortableGroup::CannotMeetCriteria (unmet_criteria));
+ }
+}
+
+void
+TAO_PG_GenericFactory::check_minimum_number_members (
+ PortableGroup::ObjectGroup_ptr object_group,
+ CORBA::ULong group_id,
+ const char * type_id
+ ACE_ENV_ARG_DECL)
+{
+ // Check if we've dropped below the MinimumNumberMembers threshold.
+ // If so, attempt to create enough new members to fill the gap.
+
+ // If no entry exists in the factory map, infrastructure (this
+ // GenericFactory implementation) controlled membership was not
+ // used.
+ TAO_PG_Factory_Map::ENTRY *entry = 0;
+ if (this->factory_map_.find (group_id, entry) != 0)
+ return;
+
+ TAO_PG_Factory_Set & factory_set = entry->int_id_;
+
+ PortableGroup::Properties_var props =
+ this->property_manager_.get_properties (object_group
+ ACE_ENV_ARG_PARAMETER);
+ ACE_CHECK;
+
+ PortableGroup::Name name (1);
+ name.length (1);
+
+ PortableGroup::Value value;
+
+ // MinimumNumberMembers
+ name[0].id =
+ CORBA::string_dup ("org.omg.PortableGroup.MinimumNumberMembers");
+
+ PortableGroup::MinimumNumberMembersValue minimum_number_members;
+
+ if (TAO_PG::get_property_value (name, props.in (), value))
+ {
+ if (!(value >>= minimum_number_members))
+ {
+ // This only occurs if extraction of the actual value from
+ // the Any fails. It shouldn't fail at this point.
+ ACE_THROW (CORBA::INTERNAL ());
+ }
+
+ const CORBA::ULong count =
+ this->object_group_manager_.member_count (object_group
+ ACE_ENV_ARG_PARAMETER);
+ ACE_CHECK;
+
+ if (count >= static_cast<CORBA::ULong> (minimum_number_members))
+ return;
+
+ const CORBA::ULong gap =
+ static_cast<CORBA::ULong> (minimum_number_members) - count;
+
+ CORBA::ULong creation_count = 0;
+
+ const size_t len = factory_set.size ();
+
+ static const PortableGroup::GenericFactory::FactoryCreationId *
+ nil_fcid = 0;
+
+ for (size_t i = 0; i < len; ++i)
+ {
+ TAO_PG_Factory_Node & node = factory_set[i];
+
+ PortableGroup::GenericFactory::FactoryCreationId * const tmp_fcid =
+ node.factory_creation_id;
+
+ // Check if the application supplied GenericFactory was
+ // already invoked.
+ if (tmp_fcid != nil_fcid)
+ continue;
+
+ ACE_TRY
+ {
+ const CORBA::Boolean propagate_member_already_present = 1;
+
+ node.factory_creation_id =
+ this->create_member (object_group,
+ node.factory_info,
+ type_id,
+ propagate_member_already_present
+ ACE_ENV_ARG_PARAMETER);
+ ACE_TRY_CHECK;
+
+ ++creation_count;
+
+ // Check if the MinimumNumberMembers threshold gap has
+ // been filled.
+ if (gap == creation_count)
+ return;
+ }
+ ACE_CATCH (PortableGroup::MemberAlreadyPresent, ex)
+ {
+ // Ignore this exception and continue.
+ }
+ ACE_ENDTRY;
+ ACE_CHECK;
+ }
+
+ // @todo If we get this far, and the MinimumNumberMembers
+ // threshold gap hasn't been filled, what do we do? Throw
+ // a CORBA::TRANSIENT?
+ }
+}
+
+PortableGroup::GenericFactory::FactoryCreationId *
+TAO_PG_GenericFactory::create_member (
+ PortableGroup::ObjectGroup_ptr object_group,
+ const PortableGroup::FactoryInfo & factory_info,
+ const char * type_id,
+ const CORBA::Boolean propagate_member_already_present
+ ACE_ENV_ARG_DECL)
+ ACE_THROW_SPEC ((CORBA::SystemException,
+ PortableGroup::NoFactory,
+ PortableGroup::ObjectNotCreated,
+ PortableGroup::InvalidCriteria,
+ PortableGroup::InvalidProperty,
+ PortableGroup::CannotMeetCriteria,
+ PortableGroup::MemberAlreadyPresent))
+{
+ PortableGroup::GenericFactory::FactoryCreationId_var fcid;
+
+ CORBA::Object_var member =
+ factory_info.the_factory->create_object (type_id,
+ factory_info.the_criteria,
+ fcid.out ()
+ ACE_ENV_ARG_PARAMETER);
+ ACE_CHECK_RETURN (0);
+
+ ACE_TRY
+ {
+ // @@ Should an "_is_a()" be performed here? While it
+ // appears to be the right thing to do, it can be
+ // expensive.
+ //
+ // Make sure an Object of the correct type was created.
+ // It is possible that an object of the wrong type was
+ // created if the type_id parameter does not match the
+ // type of object the GenericFactory creates.
+ CORBA::Boolean right_type_id =
+ member->_is_a (type_id
+ ACE_ENV_ARG_PARAMETER);
+ ACE_TRY_CHECK;
+
+ // @todo Strategize this -- e.g. strict type checking.
+ if (!right_type_id)
+ {
+ // An Object of incorrect type was created. Delete
+ // it, and throw a NoFactory exception.
+ factory_info.the_factory->delete_object (fcid.in ()
+ ACE_ENV_ARG_PARAMETER);
+ ACE_TRY_CHECK;
+
+ ACE_TRY_THROW (PortableGroup::NoFactory (factory_info.the_location,
+ type_id));
+ }
+
+ this->object_group_manager_._tao_add_member (
+ object_group,
+ factory_info.the_location,
+ member.in (),
+ type_id,
+ propagate_member_already_present
+ ACE_ENV_ARG_PARAMETER);
+ ACE_TRY_CHECK;
+ }
+ ACE_CATCHANY
+ {
+ // If the member reference is not nil, then the factory
+ // was successfully invoked. Since an exception was
+ // thrown, clean up the up created member.
+ if (!CORBA::is_nil (member.in ()))
+ {
+ factory_info.the_factory->delete_object (fcid.in ()
+ ACE_ENV_ARG_PARAMETER);
+ ACE_TRY_CHECK;
+ }
+
+ ACE_RE_THROW;
+ }
+ ACE_ENDTRY;
+ ACE_CHECK_RETURN (0);
+
+ return fcid._retn ();
+}
+
+TAO_END_VERSIONED_NAMESPACE_DECL
diff --git a/TAO/orbsvcs/orbsvcs/PortableGroup/PG_GenericFactory.h b/TAO/orbsvcs/orbsvcs/PortableGroup/PG_GenericFactory.h
new file mode 100644
index 00000000000..96b725c941a
--- /dev/null
+++ b/TAO/orbsvcs/orbsvcs/PortableGroup/PG_GenericFactory.h
@@ -0,0 +1,248 @@
+// -*- C++ -*-
+
+//=============================================================================
+/**
+ * @file PG_GenericFactory.h
+ *
+ * $Id$
+ *
+ * @author Ossama Othman <ossama@dre.vanderbilt.edu>
+ */
+//=============================================================================
+
+
+#ifndef TAO_PG_GENERIC_FACTORY_H
+#define TAO_PG_GENERIC_FACTORY_H
+
+#include /**/ "ace/pre.h"
+
+#include "ace/config-all.h"
+
+#if !defined (ACE_LACKS_PRAGMA_ONCE)
+#pragma once
+#endif /* ACE_LACKS_PRAGMA_ONCE */
+
+#include "orbsvcs/PortableGroup/PG_Factory_Map.h"
+#include "orbsvcs/PortableGroup/portablegroup_export.h"
+#include "tao/PortableServer/PortableServerC.h"
+#include "orbsvcs/PortableGroupC.h"
+#include "ace/Null_Mutex.h"
+
+TAO_BEGIN_VERSIONED_NAMESPACE_DECL
+
+/// Forward declarations.
+class TAO_PG_ObjectGroupManager;
+class TAO_PG_PropertyManager;
+
+struct TAO_PG_ObjectGroup_Map_Entry;
+
+
+/**
+ * @class TAO_PG_GenericFactory
+ *
+ * @brief PortableGroup::GenericFactory implementation used by the
+ * load balancer when creating object groups.
+ *
+ * This GenericFactory creates an object group reference for given set
+ * of replicas. Those replicas will be created by this GenericFactory
+ * if the "infrastructure-controlled" membership style is configured.
+ */
+class TAO_PortableGroup_Export TAO_PG_GenericFactory
+ : public virtual PortableGroup::GenericFactory
+{
+public:
+
+ /// Constructor.
+ TAO_PG_GenericFactory (TAO_PG_ObjectGroupManager & object_group_map,
+ TAO_PG_PropertyManager & property_manager);
+
+ /// Destructor.
+ ~TAO_PG_GenericFactory (void);
+
+ /**
+ * @name TAO_LoadBalancer::GenericFactory methods
+ */
+ //@{
+
+ /**
+ * Create an object of the specified type that adheres to the
+ * restrictions defined by the provided Criteria. The out
+ * FactoryCreationId parameter may be passed to the delete_object()
+ * method to delete the object.
+ */
+ virtual CORBA::Object_ptr create_object (
+ const char * type_id,
+ const PortableGroup::Criteria & the_criteria,
+ PortableGroup::GenericFactory::FactoryCreationId_out
+ factory_creation_id
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS)
+ ACE_THROW_SPEC ((CORBA::SystemException,
+ PortableGroup::NoFactory,
+ PortableGroup::ObjectNotCreated,
+ PortableGroup::InvalidCriteria,
+ PortableGroup::InvalidProperty,
+ PortableGroup::CannotMeetCriteria));
+
+ /**
+ * Delete the object corresponding to the provided
+ * FactoryCreationId. If the object is actually an ObjectGroup,
+ * then all members within the ObjectGroup will be deleted.
+ * Afterward, the ObjectGroup itself will be deleted.
+ */
+ virtual void delete_object (
+ const PortableGroup::GenericFactory::FactoryCreationId &
+ factory_creation_id
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS)
+ ACE_THROW_SPEC ((CORBA::SystemException,
+ PortableGroup::ObjectNotFound));
+
+ //@}
+
+ /// Set the POA to use when creating object references.
+ void poa (PortableServer::POA_ptr p);
+
+ /// Call delete_object() on all factories use to create members in a
+ /// given object group.
+ /**
+ * If ignore_exceptions is true, any exception returned from the
+ * delete_object() call on the remote factory will be ignored in
+ * order to allow other objects to be deleted via other registered
+ * factories.
+ */
+ void delete_object_i (TAO_PG_Factory_Set & factory_set,
+ CORBA::Boolean ignore_exceptions
+ ACE_ENV_ARG_DECL);
+
+ /// If the member corresponding to the given group ID and location
+ /// was created by the infrastructure, call delete_object() on the
+ /// remote GenericFactory that created it.
+ /**
+ * This method is only used by the TAO_PG_ObjectGroupManager class
+ * when ObjectGroupManager::remove_member() is explicitly called.
+ */
+ void delete_member (CORBA::ULong group_id,
+ const PortableGroup::Location & location
+ ACE_ENV_ARG_DECL);
+
+ /// Verify that the MinimumNumberMembers criterion is satisfied.
+ /**
+ * If the current number of members in the given object group is
+ * less than the MinimumNumberMembers criterion in effect for that
+ * group, the infrastructure will attempt create and add more
+ * members to the group by invoking any unused application-supplied
+ * GenericFactorys.
+ */
+ void check_minimum_number_members (
+ PortableGroup::ObjectGroup_ptr object_group,
+ CORBA::ULong group_id,
+ const char * type_id
+ ACE_ENV_ARG_DECL);
+
+ /// Create a new object group member using the supplied FactoryInfo
+ /// and RepositoryId and add it to the given object group.
+ /**
+ * @note This method is only used by the infrastructure.
+ */
+ PortableGroup::GenericFactory::FactoryCreationId * create_member (
+ PortableGroup::ObjectGroup_ptr object_group,
+ const PortableGroup::FactoryInfo & factory_info,
+ const char * type_id,
+ const CORBA::Boolean propagate_member_already_present
+ ACE_ENV_ARG_DECL)
+ ACE_THROW_SPEC ((CORBA::SystemException,
+ PortableGroup::NoFactory,
+ PortableGroup::ObjectNotCreated,
+ PortableGroup::InvalidCriteria,
+ PortableGroup::InvalidProperty,
+ PortableGroup::CannotMeetCriteria,
+ PortableGroup::MemberAlreadyPresent));
+
+private:
+
+ /// Populate the object group being created. Called when the
+ /// infrastructure-controlled membership style is used for the
+ /// object group being created.
+ void populate_object_group (
+ PortableGroup::ObjectGroup_ptr object_group,
+ const char * type_id,
+ const PortableGroup::FactoryInfos &factory_infos,
+ PortableGroup::InitialNumberMembersValue initial_number_members,
+ TAO_PG_Factory_Set & factory_set
+ ACE_ENV_ARG_DECL);
+
+ /// Get a new ObjectId to be used when creating a new ObjectGroup.
+ /**
+ * An ObjectId created by this method will never be reused within
+ * the scope of a given ReplicationManager. A value suitable for
+ * use in a map association <ext_id> is also returned.
+ */
+ void get_ObjectId (CORBA::ULong fcid,
+ PortableServer::ObjectId_out oid);
+
+ /// Process criteria to be applied to the object group being
+ /// created.
+ /**
+ * Only the MemberShipStyle, Factories, InitialNumberMembers and
+ * MinimumNumberMembers criteria/properties are defined by the
+ * PortableGroup IDL. Other services that implement the
+ * GenericFactory interface, such as load balancing and fault
+ * tolerance, may choose to support more.
+ * @par
+ * The extracted criteria are object group-specific. In particular,
+ * they are the object group creation time criteria.
+ */
+ void process_criteria (
+ const char * type_id,
+ const PortableGroup::Criteria & criteria,
+ PortableGroup::MembershipStyleValue & membership_style,
+ PortableGroup::FactoriesValue & factory_infos,
+ PortableGroup::InitialNumberMembersValue & initial_number_members,
+ PortableGroup::MinimumNumberMembersValue & minimum_number_members
+ ACE_ENV_ARG_DECL);
+
+private:
+
+ /// Reference to the POA used to create object group references.
+ PortableServer::POA_var poa_;
+
+ /// Reference to the ObjectGroup map.
+ TAO_PG_ObjectGroupManager & object_group_manager_;
+
+ /// Reference to the PropertyManager.
+ TAO_PG_PropertyManager & property_manager_;
+
+ /// Table that maps FactoryCreationId to TAO_PG_Factory_Set.
+ /**
+ * The TAO_PG_Factory_Set corresponding to a given FactoryCreationId
+ * contains the information necessary to clean up objects (members)
+ * that were created by the infrastructure, i.e. this
+ * GenericFactory. For example, this GenericFactory will invoke
+ * other application defined GenericFactorys when creating new
+ * object group members. The information returned from those
+ * application defined GenericFactorys is stored in a
+ * TAO_PG_Factory_Set, and thus this table.
+ */
+ TAO_PG_Factory_Map factory_map_;
+
+ /// The FactoryCreationId that will be assigned to the next object
+ /// group that is created.
+ /**
+ * Value that is used when assigning a FactoryCreationId to the
+ * factory that was used to create a given ObjectGroup. The
+ * FactoryCreationId is typically comprised of this value in
+ * addition to another value that makes it unique to a given Load
+ * Balancer.
+ */
+ CORBA::ULong next_fcid_;
+
+ /// Lock used to synchronize access to the factory creation id
+ /// index (i.e. next_fcid_).
+ TAO_SYNCH_MUTEX lock_;
+
+};
+
+TAO_END_VERSIONED_NAMESPACE_DECL
+
+#include /**/ "ace/post.h"
+
+#endif /* TAO_PG_GENERIC_FACTORY_H */
diff --git a/TAO/orbsvcs/orbsvcs/PortableGroup/PG_Group_Factory.cpp b/TAO/orbsvcs/orbsvcs/PortableGroup/PG_Group_Factory.cpp
new file mode 100644
index 00000000000..3c84812d454
--- /dev/null
+++ b/TAO/orbsvcs/orbsvcs/PortableGroup/PG_Group_Factory.cpp
@@ -0,0 +1,232 @@
+// -*- C++ -*-
+
+//=============================================================================
+/**
+ * @file PG_Group_Factory.cpp
+ *
+ * $Id$
+ *
+ * @author Dale Wilson <wilson_d@ociweb.com>
+ */
+//=============================================================================
+
+#include "orbsvcs/PortableGroup/PG_Group_Factory.h"
+#include "orbsvcs/PortableGroup/PG_Property_Utils.h"
+#include "orbsvcs/PortableGroup/PG_conf.h"
+#include "orbsvcs/PortableGroupC.h"
+#include "orbsvcs/PortableGroup/PG_Object_Group.h"
+#include <orbsvcs/PortableGroup/PG_Utils.h>
+
+ACE_RCSID (PortableGroup,
+ PG_Group_Factory,
+ "$Id$")
+
+
+TAO_BEGIN_VERSIONED_NAMESPACE_DECL
+
+TAO::PG_Group_Factory::PG_Group_Factory ()
+ : orb_ (CORBA::ORB::_nil())
+ , poa_ (PortableServer::POA::_nil())
+ , manipulator_ ()
+ , domain_id_ ("default-domain")
+
+{
+}
+
+TAO::PG_Group_Factory::~PG_Group_Factory (void)
+{
+ for (Group_Map_Iterator it = this->group_map_.begin ();
+ it != this->group_map_.end ();
+ ++it)
+ {
+ TAO::PG_Object_Group * group = (*it).int_id_;
+ delete group;
+ }
+ this->group_map_.unbind_all ();
+}
+
+
+void TAO::PG_Group_Factory::init (
+ CORBA::ORB_ptr orb,
+ PortableServer::POA_ptr poa,
+ PortableGroup::FactoryRegistry_ptr factory_registry
+ ACE_ENV_ARG_DECL)
+{
+ ACE_ASSERT (CORBA::is_nil (this->orb_.in ()));
+ ACE_ASSERT (CORBA::is_nil (this->poa_.in ()));
+ ACE_ASSERT (CORBA::is_nil (this->factory_registry_.in ()));
+
+ this->orb_ = CORBA::ORB::_duplicate(orb);
+ this->poa_ = PortableServer::POA::_duplicate (poa);
+ this->factory_registry_ = PortableGroup::FactoryRegistry::_duplicate (factory_registry);
+
+
+ ACE_ASSERT (!CORBA::is_nil (this->orb_.in ()));
+ ACE_ASSERT (!CORBA::is_nil (this->poa_.in ()));
+ ACE_ASSERT (!CORBA::is_nil (this->factory_registry_.in ()));
+
+ this->manipulator_.init (orb, poa ACE_ENV_ARG_PARAMETER);
+// ACE_CHECK;
+}
+
+
+TAO::PG_Object_Group * TAO::PG_Group_Factory::create_group (
+ const char * type_id,
+ const PortableGroup::Criteria & the_criteria,
+ TAO::PG_Property_Set * typeid_properties
+ ACE_ENV_ARG_DECL)
+ ACE_THROW_SPEC ((CORBA::SystemException,
+ PortableGroup::NoFactory,
+ PortableGroup::ObjectNotCreated,
+ PortableGroup::InvalidCriteria,
+ PortableGroup::InvalidProperty,
+ PortableGroup::CannotMeetCriteria))
+{
+ ///////////////////////////////////
+ // Create an empty group reference
+
+ PortableGroup::ObjectGroupId group_id = 0;
+ PortableGroup::ObjectGroup_var empty_group =
+ this->manipulator_.create_object_group (
+ type_id,
+ this->domain_id_,
+ group_id
+ ACE_ENV_ARG_PARAMETER);
+ ACE_CHECK_RETURN (0);
+
+ // pick up the object group information as assigned by
+ // ObjectGroupManager
+
+ PortableGroup::TagGroupTaggedComponent tagged_component;
+ if (! TAO::PG_Utils::get_tagged_component (empty_group, tagged_component))
+ {
+ ACE_THROW_RETURN (PortableGroup::ObjectNotCreated(), 0);
+ }
+
+ TAO::PG_Object_Group * objectGroup = 0;
+
+ ACE_NEW_THROW_EX (
+ objectGroup,
+ TAO::PG_Object_Group (
+ this->orb_.in (),
+ this->factory_registry_.in (),
+ this->manipulator_,
+ empty_group.in (),
+ tagged_component,
+ type_id,
+ the_criteria,
+ typeid_properties
+ ),
+ CORBA::NO_MEMORY());
+
+ if (this->group_map_.bind (group_id, objectGroup) != 0)
+ {
+ delete objectGroup;
+ ACE_THROW_RETURN (PortableGroup::ObjectNotCreated(), 0);
+ }
+ return objectGroup;
+}
+
+void TAO::PG_Group_Factory::delete_group (PortableGroup::ObjectGroup_ptr object_group
+ ACE_ENV_ARG_DECL)
+ ACE_THROW_SPEC ((CORBA::SystemException,
+ PortableGroup::ObjectNotFound))
+{
+ if (! destroy_group (object_group))
+ {
+ ACE_THROW (PortableGroup::ObjectNotFound ());
+ }
+}
+
+
+void TAO::PG_Group_Factory::delete_group (PortableGroup::ObjectGroupId group_id
+ ACE_ENV_ARG_DECL)
+ ACE_THROW_SPEC ((CORBA::SystemException,
+ PortableGroup::ObjectNotFound))
+{
+ if (! destroy_group (group_id))
+ {
+ ACE_THROW (PortableGroup::ObjectNotFound ());
+ }
+}
+
+ // insert group. Take ownership
+int TAO::PG_Group_Factory::insert_group ( ::TAO::PG_Object_Group * group)
+{
+ return insert_group (group->get_object_group_id(), group);
+}
+
+int TAO::PG_Group_Factory::insert_group (PortableGroup::ObjectGroupId group_id, ::TAO::PG_Object_Group * group)
+{
+ return (this->group_map_.bind (group_id, group) == 0);
+}
+
+int TAO::PG_Group_Factory::find_group (PortableGroup::ObjectGroupId group_id, ::TAO::PG_Object_Group *& group) const
+{
+ return (this->group_map_.find (group_id , group) == 0);
+}
+
+int TAO::PG_Group_Factory::find_group (PortableGroup::ObjectGroup_ptr object_group, ::TAO::PG_Object_Group *& group) const
+{
+ int result = 0;
+ PortableGroup::TagGroupTaggedComponent tc;
+ if (TAO::PG_Utils::get_tagged_component (object_group, tc))
+ {
+ result = find_group (tc.object_group_id, group);
+ }
+ return result;
+}
+
+int TAO::PG_Group_Factory::destroy_group (PortableGroup::ObjectGroupId group_id)
+{
+ ::TAO::PG_Object_Group * group = 0;
+ int result = (this->group_map_.unbind (group_id, group) == 0);
+ if (result)
+ {
+ delete group;
+ }
+ return result;
+}
+
+int TAO::PG_Group_Factory::destroy_group (PortableGroup::ObjectGroup_ptr object_group)
+{
+ PortableGroup::TagGroupTaggedComponent tc;
+ TAO::PG_Utils::get_tagged_component (object_group, tc);
+ return destroy_group (tc.object_group_id);
+}
+
+
+
+PortableGroup::ObjectGroups *
+TAO::PG_Group_Factory::groups_at_location (
+ const PortableGroup::Location & the_location
+ ACE_ENV_ARG_DECL)
+ ACE_THROW_SPEC ( (CORBA::SystemException))
+{
+ size_t upper_limit = this->group_map_.current_size ();
+ PortableGroup::ObjectGroups * result = 0;
+ ACE_NEW_THROW_EX (
+ result,
+ PortableGroup::ObjectGroups (upper_limit),
+ CORBA::NO_MEMORY());
+ ACE_CHECK_RETURN (0);
+
+ result->length(upper_limit);
+
+ size_t group_count = 0;
+ for (Group_Map_Iterator it = this->group_map_.begin ();
+ it != this->group_map_.end ();
+ ++it)
+ {
+ TAO::PG_Object_Group * group = (*it).int_id_;
+ if (group->has_member_at (the_location))
+ {
+ (*result)[group_count] = group->reference ();
+ ++group_count;
+ }
+ }
+ result->length (group_count);
+ return result;
+}
+
+TAO_END_VERSIONED_NAMESPACE_DECL
diff --git a/TAO/orbsvcs/orbsvcs/PortableGroup/PG_Group_Factory.h b/TAO/orbsvcs/orbsvcs/PortableGroup/PG_Group_Factory.h
new file mode 100644
index 00000000000..b9bd1309492
--- /dev/null
+++ b/TAO/orbsvcs/orbsvcs/PortableGroup/PG_Group_Factory.h
@@ -0,0 +1,184 @@
+// -*- C++ -*-
+
+//=============================================================================
+/**
+ * @file PG_Group_Factory.h
+ *
+ * $Id$
+ *
+ * @author Dale Wilson <wilson_d@ociweb.com>
+ */
+//=============================================================================
+
+#ifndef TAO_PG_GROUP_FACTORY_H
+#define TAO_PG_GROUP_FACTORY_H
+
+#include /**/ "ace/pre.h"
+
+#include "orbsvcs/PortableGroup/portablegroup_export.h"
+
+#if !defined (ACE_LACKS_PRAGMA_ONCE)
+#pragma once
+#endif /* ACE_LACKS_PRAGMA_ONCE */
+
+#include "orbsvcs/PortableGroup/PG_Object_Group_Manipulator.h"
+
+#include "orbsvcs/PortableGroupC.h"
+
+#include "tao/PortableServer/PortableServer.h"
+
+#include "ace/ACE.h"
+#include "ace/Hash_Map_Manager.h"
+
+
+TAO_BEGIN_VERSIONED_NAMESPACE_DECL
+
+//////////////////
+// Forward reference
+namespace TAO
+{
+ class PG_Property_Set;
+} // namespace TAO_PG
+
+namespace TAO
+{
+ /////////////////////
+ // forward references
+ class PG_Object_Group;
+
+ /**
+ * class PG_Group_Factory
+ */
+ class TAO_PortableGroup_Export PG_Group_Factory
+ {
+ ////////////////////////////////////////////////////////////
+ // typedef private implementation classes
+ typedef ACE_Hash_Map_Manager_Ex<
+ PortableGroup::ObjectGroupId,
+ ::TAO::PG_Object_Group *,
+ ACE_Hash<ACE_UINT64>,
+ ACE_Equal_To<ACE_UINT64>,
+ TAO_SYNCH_MUTEX> Group_Map;
+
+ typedef ACE_Hash_Map_Entry <PortableGroup::ObjectGroupId, ::TAO::PG_Object_Group *> Group_Map_Entry;
+
+ typedef ACE_Hash_Map_Iterator_Ex <
+ PortableGroup::ObjectGroupId,
+ ::TAO::PG_Object_Group *,
+ ACE_Hash<ACE_UINT64>,
+ ACE_Equal_To<ACE_UINT64>,
+ TAO_SYNCH_MUTEX> Group_Map_Iterator;
+
+ public:
+
+ /// Constructor.
+ PG_Group_Factory ();
+
+ /// Destructor.
+ ~PG_Group_Factory ();
+
+ void init (
+ CORBA::ORB_ptr orb,
+ PortableServer::POA_ptr poa,
+ PortableGroup::FactoryRegistry_ptr factory_registry
+ ACE_ENV_ARG_DECL);
+
+
+ TAO::PG_Object_Group * create_group (
+ const char * type_id,
+ const PortableGroup::Criteria & the_criteria,
+ TAO::PG_Property_Set * typeid_properties
+ ACE_ENV_ARG_DECL)
+ ACE_THROW_SPEC ((CORBA::SystemException,
+ PortableGroup::NoFactory,
+ PortableGroup::ObjectNotCreated,
+ PortableGroup::InvalidCriteria,
+ PortableGroup::InvalidProperty,
+ PortableGroup::CannotMeetCriteria));
+
+
+ void delete_group (PortableGroup::ObjectGroup_ptr object_group
+ ACE_ENV_ARG_DECL)
+ ACE_THROW_SPEC ((CORBA::SystemException,
+ PortableGroup::ObjectNotFound));
+
+
+ void delete_group (PortableGroup::ObjectGroupId group_id
+ ACE_ENV_ARG_DECL)
+ ACE_THROW_SPEC ((CORBA::SystemException,
+ PortableGroup::ObjectNotFound));
+
+ PortableGroup::ObjectGroups *
+ groups_at_location (
+ const PortableGroup::Location & the_location
+ ACE_ENV_ARG_DECL)
+ ACE_THROW_SPEC ( (CORBA::SystemException));
+
+
+
+ /**
+ * insert existing group. Take ownership
+ * note: uses group id extracted from group object
+ * @return bool true if insertion successful
+ */
+ int insert_group ( ::TAO::PG_Object_Group * group);
+
+ /**
+ * insert group. Take ownership
+ * @return bool true if insertion successful
+ */
+ int insert_group (PortableGroup::ObjectGroupId group_id, ::TAO::PG_Object_Group * group);
+
+ /**
+ * find group
+ * @return bool true if found
+ */
+ int find_group (PortableGroup::ObjectGroupId group_id, ::TAO::PG_Object_Group *& group) const;
+
+ /**
+ * find group
+ * note: uses group id extracted from object_group
+ * @return bool true if found
+ */
+ int find_group (PortableGroup::ObjectGroup_ptr object_group, ::TAO::PG_Object_Group *& group) const;
+
+ /**
+ * remove group from map and delete it.
+ * @return bool true if found
+ */
+ int destroy_group (PortableGroup::ObjectGroupId object_group_id);
+
+ /**
+ * remove group from map and delete it.
+ * note: uses group id extracted from object_group
+ * @return bool true if found
+ */
+ int destroy_group (PortableGroup::ObjectGroup_ptr object_group);
+
+ private:
+
+ private:
+
+ CORBA::ORB_var orb_;
+
+ /// Reference to the POA used to create object group references.
+ PortableServer::POA_var poa_;
+
+ /// The factory registry for replica factories
+ PortableGroup::FactoryRegistry_var factory_registry_;
+
+ ::TAO::PG_Object_Group_Manipulator manipulator_;
+
+ const char * domain_id_;
+
+ Group_Map group_map_;
+
+
+ };
+} // namespace TAO
+
+TAO_END_VERSIONED_NAMESPACE_DECL
+
+#include /**/ "ace/post.h"
+
+#endif /* TAO_PG_GROUP_FACTORY_H */
diff --git a/TAO/orbsvcs/orbsvcs/PortableGroup/PG_Group_Guard.cpp b/TAO/orbsvcs/orbsvcs/PortableGroup/PG_Group_Guard.cpp
new file mode 100644
index 00000000000..dc93a9e2e2c
--- /dev/null
+++ b/TAO/orbsvcs/orbsvcs/PortableGroup/PG_Group_Guard.cpp
@@ -0,0 +1,59 @@
+#include "orbsvcs/PortableGroup/PG_Group_Guard.h"
+
+#include "orbsvcs/PortableGroup/PG_GenericFactory.h"
+#include "orbsvcs/PortableGroup/PG_ObjectGroupManager.h"
+
+
+ACE_RCSID (PortableGroup,
+ PG_Group_Guard,
+ "$Id$")
+
+
+TAO_BEGIN_VERSIONED_NAMESPACE_DECL
+
+TAO_PG_Group_Guard::TAO_PG_Group_Guard (
+ TAO_PG_GenericFactory & generic_factory,
+ TAO_PG_Factory_Set & factory_set,
+ TAO_PG_ObjectGroupManager & group_manager,
+ const PortableServer::ObjectId & oid)
+ : generic_factory_ (generic_factory),
+ factory_set_ (factory_set),
+ group_manager_ (group_manager),
+ oid_ (oid),
+ released_ (0)
+{
+}
+
+TAO_PG_Group_Guard::~TAO_PG_Group_Guard (void)
+{
+ if (!this->released_)
+ {
+ ACE_DECLARE_NEW_CORBA_ENV;
+ ACE_TRY
+ {
+ this->generic_factory_.delete_object_i (this->factory_set_,
+ 1 // Ignore exceptions
+ ACE_ENV_ARG_PARAMETER);
+ ACE_TRY_CHECK;
+
+ // This should never throw an exception if this Guard is
+ // used properly.
+ this->group_manager_.destroy_object_group (this->oid_
+ ACE_ENV_ARG_PARAMETER);
+ ACE_TRY_CHECK;
+ }
+ ACE_CATCHANY
+ {
+ // Ignore all exceptions.
+ }
+ ACE_ENDTRY;
+ }
+}
+
+void
+TAO_PG_Group_Guard::release (void)
+{
+ this->released_ = 1;
+}
+
+TAO_END_VERSIONED_NAMESPACE_DECL
diff --git a/TAO/orbsvcs/orbsvcs/PortableGroup/PG_Group_Guard.h b/TAO/orbsvcs/orbsvcs/PortableGroup/PG_Group_Guard.h
new file mode 100644
index 00000000000..2c6ca8fe9ee
--- /dev/null
+++ b/TAO/orbsvcs/orbsvcs/PortableGroup/PG_Group_Guard.h
@@ -0,0 +1,93 @@
+// -*- C++ -*-
+
+//=============================================================================
+/**
+ * @file PG_Group_Guard.h
+ *
+ * $Id$
+ *
+ * @author Ossama Othman <ossama@uci.edu>
+ */
+//=============================================================================
+
+
+#ifndef TAO_PG_GROUP_GUARD_H
+#define TAO_PG_GROUP_GUARD_H
+
+#include /**/ "ace/pre.h"
+
+#include "ace/config-all.h"
+
+#if !defined (ACE_LACKS_PRAGMA_ONCE)
+#pragma once
+#endif /* ACE_LACKS_PRAGMA_ONCE */
+
+#include "orbsvcs/PortableGroup/PG_Factory_Set.h"
+
+#include "tao/PortableServer/PortableServerC.h"
+
+TAO_BEGIN_VERSIONED_NAMESPACE_DECL
+
+/// Forward declarations.
+class TAO_PG_GenericFactory;
+class TAO_PG_ObjectGroupManager;
+
+/**
+ * @class TAO_PG_Group_Guard
+ *
+ * @brief Guard implementation used to make object group cleanup
+ * exception-safe.
+ *
+ * This guard's destructor performs cleanup of object group
+ * resources. Thus, cleanup is performed when this guard goes out of
+ * scope unless explicitly released from that responsibility.
+ *
+ * This guard is meant to be used internally by the
+ * TAO_PG_GenericFactory class.
+ */
+class TAO_PG_Group_Guard
+{
+public:
+
+ /// Constructor.
+ TAO_PG_Group_Guard (TAO_PG_GenericFactory & generic_factory,
+ TAO_PG_Factory_Set & factory_set,
+ TAO_PG_ObjectGroupManager & group_manager,
+ const PortableServer::ObjectId & oid);
+
+ /// Destructor.
+ ~TAO_PG_Group_Guard (void);
+
+ /// Relinquish cleanup responsibility.
+ void release (void);
+
+private:
+
+ /// Reference to the infrastructure TAO_PG_GenericFactory that
+ /// created the below TAO_PG_Factory_Set.
+ TAO_PG_GenericFactory & generic_factory_;
+
+ /// Reference to the TAO_PG_Factory_Set that contains all
+ /// application-specific GenericFactory object references.
+ TAO_PG_Factory_Set & factory_set_;
+
+ /// Reference to the TAO_PG_ObjectGroupManager that maintains the
+ /// object group map.
+ TAO_PG_ObjectGroupManager & group_manager_;
+
+ /// Reference to the ObjectId that is the map key necessary to
+ /// unbind the corresponding object group map entry from the map
+ /// upon destruction.
+ const PortableServer::ObjectId & oid_;
+
+ /// Flag that dictates whether or not the destructor will perform
+ /// cleanup.
+ int released_;
+
+};
+
+TAO_END_VERSIONED_NAMESPACE_DECL
+
+#include /**/ "ace/post.h"
+
+#endif /* TAO_PG_GROUP_GUARD_H */
diff --git a/TAO/orbsvcs/orbsvcs/PortableGroup/PG_Location_Equal_To.cpp b/TAO/orbsvcs/orbsvcs/PortableGroup/PG_Location_Equal_To.cpp
new file mode 100644
index 00000000000..2fc8e11dadc
--- /dev/null
+++ b/TAO/orbsvcs/orbsvcs/PortableGroup/PG_Location_Equal_To.cpp
@@ -0,0 +1,11 @@
+// -*- C++ -*-
+
+#include "orbsvcs/PortableGroup/PG_Location_Equal_To.h"
+
+ACE_RCSID (PortableGroup,
+ PG_Location_Equal_To,
+ "$Id$")
+
+#if !defined (__ACE_INLINE__)
+#include "orbsvcs/PortableGroup/PG_Location_Equal_To.inl"
+#endif /* !__ACE_INLINE__ */
diff --git a/TAO/orbsvcs/orbsvcs/PortableGroup/PG_Location_Equal_To.h b/TAO/orbsvcs/orbsvcs/PortableGroup/PG_Location_Equal_To.h
new file mode 100644
index 00000000000..cbfc12a8949
--- /dev/null
+++ b/TAO/orbsvcs/orbsvcs/PortableGroup/PG_Location_Equal_To.h
@@ -0,0 +1,59 @@
+// -*- C++ -*-
+
+//=============================================================================
+/**
+ * @file PG_Location_Equal_To.h
+ *
+ * $Id$
+ *
+ * @author Ossama Othman <ossama@uci.edu>
+ */
+//=============================================================================
+
+
+#ifndef TAO_PG_LOCATION_EQUAL_TO_H
+#define TAO_PG_LOCATION_EQUAL_TO_H
+
+#include /**/ "ace/pre.h"
+
+#include "ace/config-all.h"
+
+#if !defined (ACE_LACKS_PRAGMA_ONCE)
+# pragma once
+#endif /* ACE_LACKS_PRAGMA_ONCE */
+
+#include "orbsvcs/PortableGroup/PG_Operators.h"
+#include "orbsvcs/PortableGroup/portablegroup_export.h"
+#include "orbsvcs/PortableGroupC.h"
+
+TAO_BEGIN_VERSIONED_NAMESPACE_DECL
+
+/**
+ * @class TAO_PG_Location_Equal_To
+ *
+ * @brief "Equal_To" function object that determines if two location
+ * names are the same.
+ *
+ * This functor simply does a string comparison of each of the
+ * elements in the given TAO_PortableGroup::Location name sequences.
+ */
+class TAO_PortableGroup_Export TAO_PG_Location_Equal_To
+{
+public:
+
+ /// Perform a string comparison on each of the sequence elements in
+ /// the given locations.
+ int operator() (const PortableGroup::Location &lhs,
+ const PortableGroup::Location &rhs) const;
+
+};
+
+TAO_END_VERSIONED_NAMESPACE_DECL
+
+#if defined (__ACE_INLINE__)
+#include "orbsvcs/PortableGroup/PG_Location_Equal_To.inl"
+#endif /* __ACE_INLINE__ */
+
+#include /**/ "ace/post.h"
+
+#endif /* TAO_PG_LOCATION_EQUAL_TO_H */
diff --git a/TAO/orbsvcs/orbsvcs/PortableGroup/PG_Location_Equal_To.inl b/TAO/orbsvcs/orbsvcs/PortableGroup/PG_Location_Equal_To.inl
new file mode 100644
index 00000000000..052d968242b
--- /dev/null
+++ b/TAO/orbsvcs/orbsvcs/PortableGroup/PG_Location_Equal_To.inl
@@ -0,0 +1,15 @@
+// -*- C++ -*-
+//
+// $Id$
+
+TAO_BEGIN_VERSIONED_NAMESPACE_DECL
+
+ACE_INLINE int
+TAO_PG_Location_Equal_To::operator () (
+ const PortableGroup::Location &lhs,
+ const PortableGroup::Location &rhs) const
+{
+ return lhs == rhs;
+}
+
+TAO_END_VERSIONED_NAMESPACE_DECL
diff --git a/TAO/orbsvcs/orbsvcs/PortableGroup/PG_Location_Hash.cpp b/TAO/orbsvcs/orbsvcs/PortableGroup/PG_Location_Hash.cpp
new file mode 100644
index 00000000000..0197726bfe8
--- /dev/null
+++ b/TAO/orbsvcs/orbsvcs/PortableGroup/PG_Location_Hash.cpp
@@ -0,0 +1,13 @@
+// -*- C++ -*-
+//
+// $Id$
+
+#include "orbsvcs/PortableGroup/PG_Location_Hash.h"
+
+#if !defined (__ACE_INLINE__)
+#include "orbsvcs/PortableGroup/PG_Location_Hash.inl"
+#endif /* __ACE_INLINE__ */
+
+ACE_RCSID (PortableGroup,
+ PG_Location_Hash,
+ "$Id$")
diff --git a/TAO/orbsvcs/orbsvcs/PortableGroup/PG_Location_Hash.h b/TAO/orbsvcs/orbsvcs/PortableGroup/PG_Location_Hash.h
new file mode 100644
index 00000000000..d59b5320ff0
--- /dev/null
+++ b/TAO/orbsvcs/orbsvcs/PortableGroup/PG_Location_Hash.h
@@ -0,0 +1,53 @@
+// -*- C++ -*-
+
+//=============================================================================
+/**
+ * @file PG_Location_Hash.h
+ *
+ * $Id$
+ *
+ * @author Ossama Othman <ossama@uci.edu>
+ */
+//=============================================================================
+
+
+#ifndef TAO_PG_LOCATION_HASH_H
+#define TAO_PG_LOCATION_HASH_H
+
+#include /**/ "ace/pre.h"
+
+#include "ace/config-all.h"
+
+#if !defined (ACE_LACKS_PRAGMA_ONCE)
+# pragma once
+#endif /* ACE_LACKS_PRAGMA_ONCE */
+
+#include "orbsvcs/PortableGroup/portablegroup_export.h"
+#include "orbsvcs/PortableGroupC.h"
+#include "ace/ACE.h"
+
+TAO_BEGIN_VERSIONED_NAMESPACE_DECL
+
+/**
+ * @class TAO_PG_Location_Hash
+ *
+ * @brief Hash function object for generating a hash for a Location.
+ */
+class TAO_PortableGroup_Export TAO_PG_Location_Hash
+{
+
+public:
+
+ /// Creates a hash based on all of elements of the given Location
+ CORBA::ULong operator() (const PortableGroup::Location &) const;
+};
+
+TAO_END_VERSIONED_NAMESPACE_DECL
+
+#if defined (__ACE_INLINE__)
+#include "orbsvcs/PortableGroup/PG_Location_Hash.inl"
+#endif /* __ACE_INLINE__ */
+
+#include /**/ "ace/post.h"
+
+#endif /* TAO_PG_LOCATION_HASH_H */
diff --git a/TAO/orbsvcs/orbsvcs/PortableGroup/PG_Location_Hash.inl b/TAO/orbsvcs/orbsvcs/PortableGroup/PG_Location_Hash.inl
new file mode 100644
index 00000000000..a0b591b1068
--- /dev/null
+++ b/TAO/orbsvcs/orbsvcs/PortableGroup/PG_Location_Hash.inl
@@ -0,0 +1,25 @@
+// -*- C++ -*-
+//
+// $Id$
+
+TAO_BEGIN_VERSIONED_NAMESPACE_DECL
+
+ACE_INLINE CORBA::ULong
+TAO_PG_Location_Hash::operator() (
+ const PortableGroup::Location &location) const
+{
+ // @todo Interim implementation until we figure out what to do when a
+ // location has multiple components.
+
+ CORBA::ULong len = location.length ();
+ CORBA::ULong hash = 0;
+
+ for (CORBA::ULong i = 0; i < len; ++i)
+ hash +=
+ ACE::hash_pjw (location[i].id.in ()) +
+ ACE::hash_pjw (location[i].kind.in ());
+
+ return hash;
+}
+
+TAO_END_VERSIONED_NAMESPACE_DECL
diff --git a/TAO/orbsvcs/orbsvcs/PortableGroup/PG_Location_Map.h b/TAO/orbsvcs/orbsvcs/PortableGroup/PG_Location_Map.h
new file mode 100644
index 00000000000..e0eb6dbf756
--- /dev/null
+++ b/TAO/orbsvcs/orbsvcs/PortableGroup/PG_Location_Map.h
@@ -0,0 +1,54 @@
+// -*- C++ -*-
+
+//=======================================================================
+/**
+ * @file PG_Location_Map.h
+ *
+ * $Id$
+ *
+ * @author Ossama Othman <ossama@uci.edu>
+ */
+//=======================================================================
+
+
+#ifndef TAO_PG_LOCATION_MAP_H
+#define TAO_PG_LOCATION_MAP_H
+
+#include /**/ "ace/pre.h"
+
+#include "ace/config-all.h"
+
+#if !defined (ACE_LACKS_PRAGMA_ONCE)
+# pragma once
+#endif /* ACE_LACKS_PRAGMA_ONCE */
+
+#include "orbsvcs/PortableGroup/PG_Location_Hash.h"
+#include "orbsvcs/PortableGroup/PG_Location_Equal_To.h"
+
+#include "orbsvcs/PortableGroupC.h"
+
+#include "ace/Array_Base.h"
+#include "ace/Hash_Map_Manager_T.h"
+#include "ace/Null_Mutex.h"
+
+TAO_BEGIN_VERSIONED_NAMESPACE_DECL
+
+/// Forward declarations.
+struct TAO_PG_ObjectGroup_Map_Entry;
+
+typedef ACE_Array_Base<TAO_PG_ObjectGroup_Map_Entry *>
+ TAO_PG_ObjectGroup_Array;
+
+/// Location hash map.
+typedef ACE_Hash_Map_Manager_Ex<
+ PortableGroup::Location,
+ TAO_PG_ObjectGroup_Array *,
+ TAO_PG_Location_Hash,
+ TAO_PG_Location_Equal_To,
+ ACE_Null_Mutex> TAO_PG_Location_Map;
+
+TAO_END_VERSIONED_NAMESPACE_DECL
+
+#include /**/ "ace/post.h"
+
+#endif /* TAO_PG_LOCATION_MAP_H */
diff --git a/TAO/orbsvcs/orbsvcs/PortableGroup/PG_MemberInfo.cpp b/TAO/orbsvcs/orbsvcs/PortableGroup/PG_MemberInfo.cpp
new file mode 100644
index 00000000000..1485e8277d9
--- /dev/null
+++ b/TAO/orbsvcs/orbsvcs/PortableGroup/PG_MemberInfo.cpp
@@ -0,0 +1,18 @@
+#include "orbsvcs/PortableGroup/PG_MemberInfo.h"
+#include "orbsvcs/PortableGroup/PG_Operators.h"
+
+ACE_RCSID (PortableGroup,
+ PG_MemberInfo,
+ "$Id$")
+
+TAO_BEGIN_VERSIONED_NAMESPACE_DECL
+
+bool
+TAO_PG_MemberInfo::operator== (const TAO_PG_MemberInfo & rhs)
+{
+ // For the purposes of the member info set, only the location is
+ // important.
+ return location == rhs.location;
+}
+
+TAO_END_VERSIONED_NAMESPACE_DECL
diff --git a/TAO/orbsvcs/orbsvcs/PortableGroup/PG_MemberInfo.h b/TAO/orbsvcs/orbsvcs/PortableGroup/PG_MemberInfo.h
new file mode 100644
index 00000000000..41d428bd0bb
--- /dev/null
+++ b/TAO/orbsvcs/orbsvcs/PortableGroup/PG_MemberInfo.h
@@ -0,0 +1,62 @@
+// -*- C++ -*-
+
+//=======================================================================
+/**
+ * @file PG_MemberInfo.h
+ *
+ * $Id$
+ *
+ * @author Ossama Othman <ossama@uci.edu>
+ */
+//=======================================================================
+
+
+#ifndef TAO_PG_MEMBER_INFO_H
+#define TAO_PG_MEMBER_INFO_H
+
+#include /**/ "ace/pre.h"
+
+#include "ace/config-all.h"
+
+#if !defined (ACE_LACKS_PRAGMA_ONCE)
+# pragma once
+#endif /* ACE_LACKS_PRAGMA_ONCE */
+
+#include "orbsvcs/PortableGroupC.h"
+#include "ace/Unbounded_Set.h"
+
+TAO_BEGIN_VERSIONED_NAMESPACE_DECL
+
+/**
+ * @class TAO_PG_MemberInfo
+ *
+ * @brief Structure that contains all member-specific information.
+ *
+ * Structure that contains all member-specific information.
+ */
+struct TAO_PG_MemberInfo
+{
+
+ /// Reference to the member.
+ CORBA::Object_var member;
+
+ /// The location at which the member resides.
+ PortableGroup::Location location;
+
+ /// Equality operator.
+ /**
+ * For the purposes of the member info set, only the location is
+ * important. In particular, if a member already resides at the
+ * given location, this equality operator will return true.
+ */
+ bool operator== (const TAO_PG_MemberInfo & rhs);
+
+};
+
+typedef ACE_Unbounded_Set<TAO_PG_MemberInfo> TAO_PG_MemberInfo_Set;
+
+TAO_END_VERSIONED_NAMESPACE_DECL
+
+#include /**/ "ace/post.h"
+
+#endif /* TAO_PG_MEMBER_INFO_H */
diff --git a/TAO/orbsvcs/orbsvcs/PortableGroup/PG_Null_Property_Validator.cpp b/TAO/orbsvcs/orbsvcs/PortableGroup/PG_Null_Property_Validator.cpp
new file mode 100644
index 00000000000..5251b3d7931
--- /dev/null
+++ b/TAO/orbsvcs/orbsvcs/PortableGroup/PG_Null_Property_Validator.cpp
@@ -0,0 +1,30 @@
+#include "orbsvcs/PortableGroup/PG_Null_Property_Validator.h"
+
+
+ACE_RCSID (PortableGroup,
+ PG_Null_Property_Validator,
+ "$Id$")
+
+TAO_BEGIN_VERSIONED_NAMESPACE_DECL
+
+void
+TAO_PG_Null_Property_Validator::validate_property (
+ const PortableGroup::Properties &
+ ACE_ENV_ARG_DECL_NOT_USED)
+ ACE_THROW_SPEC ((CORBA::SystemException,
+ PortableGroup::InvalidProperty,
+ PortableGroup::UnsupportedProperty))
+{
+}
+
+void
+TAO_PG_Null_Property_Validator::validate_criteria (
+ const PortableGroup::Properties &
+ ACE_ENV_ARG_DECL_NOT_USED)
+ ACE_THROW_SPEC ((CORBA::SystemException,
+ PortableGroup::InvalidCriteria,
+ PortableGroup::CannotMeetCriteria))
+{
+}
+
+TAO_END_VERSIONED_NAMESPACE_DECL
diff --git a/TAO/orbsvcs/orbsvcs/PortableGroup/PG_Null_Property_Validator.h b/TAO/orbsvcs/orbsvcs/PortableGroup/PG_Null_Property_Validator.h
new file mode 100644
index 00000000000..41047a90c99
--- /dev/null
+++ b/TAO/orbsvcs/orbsvcs/PortableGroup/PG_Null_Property_Validator.h
@@ -0,0 +1,67 @@
+// -*- C++ -*-
+
+//=============================================================================
+/**
+ * @file PG_Null_Property_Validator.h
+ *
+ * $Id$
+ *
+ * @author Ossama Othman <ossama@uci.edu>
+ */
+//=============================================================================
+
+#ifndef TAO_PG_NULL_PROPERTY_VALIDATOR_H
+#define TAO_PG_NULL_PROPERTY_VALIDATOR_H
+
+#include /**/ "ace/pre.h"
+
+#include "orbsvcs/PortableGroup/portablegroup_export.h"
+#include "orbsvcs/PortableGroupC.h"
+
+#if !defined (ACE_LACKS_PRAGMA_ONCE)
+#pragma once
+#endif /* ACE_LACKS_PRAGMA_ONCE */
+
+
+TAO_BEGIN_VERSIONED_NAMESPACE_DECL
+
+/**
+ * @class TAO_PG_Null_Property_Validator
+ *
+ * @brief No-op property validator.
+ *
+ * This property validator performs no validation whatsoever.
+ */
+class TAO_PortableGroup_Export TAO_PG_Null_Property_Validator
+{
+public:
+
+ /// Validate the given properties.
+ /**
+ * This particular implementation performs no validation
+ * whatsoever.
+ */
+ void validate_property (const PortableGroup::Properties & props
+ ACE_ENV_ARG_DECL)
+ ACE_THROW_SPEC ((CORBA::SystemException,
+ PortableGroup::InvalidProperty,
+ PortableGroup::UnsupportedProperty));
+
+ /// Validate the given criteria.
+ /**
+ * This particular implementation performs no validation
+ * whatsoever.
+ */
+ void validate_criteria (const PortableGroup::Properties & criteria
+ ACE_ENV_ARG_DECL)
+ ACE_THROW_SPEC ((CORBA::SystemException,
+ PortableGroup::InvalidCriteria,
+ PortableGroup::CannotMeetCriteria));
+
+};
+
+TAO_END_VERSIONED_NAMESPACE_DECL
+
+#include /**/ "ace/post.h"
+
+#endif /* TAO_PG_PROPERTY_VALIDATOR_H */
diff --git a/TAO/orbsvcs/orbsvcs/PortableGroup/PG_ObjectGroupManager.cpp b/TAO/orbsvcs/orbsvcs/PortableGroup/PG_ObjectGroupManager.cpp
new file mode 100644
index 00000000000..7b78ef895bc
--- /dev/null
+++ b/TAO/orbsvcs/orbsvcs/PortableGroup/PG_ObjectGroupManager.cpp
@@ -0,0 +1,871 @@
+#include "orbsvcs/PortableGroup/PG_ObjectGroupManager.h"
+#include "orbsvcs/PortableGroup/PG_GenericFactory.h"
+#include "orbsvcs/PortableGroup/PG_conf.h"
+#include "orbsvcs/PortableGroup/PG_Operators.h"
+
+#include "tao/debug.h"
+#include "tao/ORB_Constants.h"
+
+#include "ace/Auto_Ptr.h"
+#include "ace/Reverse_Lock_T.h"
+
+ACE_RCSID (PortableGroup,
+ PG_ObjectGroupManager,
+ "$Id$")
+
+
+TAO_BEGIN_VERSIONED_NAMESPACE_DECL
+
+TAO_PG_ObjectGroupManager::TAO_PG_ObjectGroupManager (void)
+ : poa_ (),
+ object_group_map_ (TAO_PG_MAX_OBJECT_GROUPS),
+ location_map_ (TAO_PG_MAX_LOCATIONS),
+ generic_factory_ (0),
+ lock_ ()
+{
+}
+
+TAO_PG_ObjectGroupManager::~TAO_PG_ObjectGroupManager (void)
+{
+ for (TAO_PG_Location_Map::iterator i = this->location_map_.begin ();
+ i != this->location_map_.end ();
+ ++i)
+ {
+ // Destroy the group array
+ delete (*i).int_id_;
+ }
+ (void) this->location_map_.close ();
+
+ for (TAO_PG_ObjectGroup_Map::iterator j = this->object_group_map_.begin ();
+ j != this->object_group_map_.end ();
+ ++j)
+ {
+ // Destroy the object group entry
+ delete (*j).int_id_;
+ }
+ (void) this->object_group_map_.close ();
+}
+
+PortableGroup::ObjectGroup_ptr
+TAO_PG_ObjectGroupManager::create_member (
+ PortableGroup::ObjectGroup_ptr /* object_group */,
+ const PortableGroup::Location & /* the_location */,
+ const char * /* type_id */,
+ const PortableGroup::Criteria & /* the_criteria */
+ ACE_ENV_ARG_DECL)
+ ACE_THROW_SPEC ((CORBA::SystemException,
+ PortableGroup::ObjectGroupNotFound,
+ PortableGroup::MemberAlreadyPresent,
+ PortableGroup::NoFactory,
+ PortableGroup::ObjectNotCreated,
+ PortableGroup::InvalidCriteria,
+ PortableGroup::CannotMeetCriteria))
+{
+ ACE_THROW_RETURN (CORBA::NO_IMPLEMENT (),
+ PortableGroup::ObjectGroup::_nil ());
+}
+
+PortableGroup::ObjectGroup_ptr
+TAO_PG_ObjectGroupManager::add_member (
+ PortableGroup::ObjectGroup_ptr object_group,
+ const PortableGroup::Location & the_location,
+ CORBA::Object_ptr member
+ ACE_ENV_ARG_DECL)
+ ACE_THROW_SPEC ((CORBA::SystemException,
+ PortableGroup::ObjectGroupNotFound,
+ PortableGroup::MemberAlreadyPresent,
+ PortableGroup::ObjectNotAdded))
+{
+ if (CORBA::is_nil (member))
+ ACE_THROW_RETURN (CORBA::BAD_PARAM (),
+ PortableGroup::ObjectGroup::_nil ());
+
+ ACE_GUARD_RETURN (TAO_SYNCH_MUTEX,
+ guard,
+ this->lock_,
+ PortableGroup::ObjectGroup::_nil ());
+
+ // Verify that the member's RepositoryId matches the object group's
+ // type ID.
+ const CORBA::Boolean check_type_id = 1;
+
+ return this->add_member_i (object_group,
+ the_location,
+ member,
+ check_type_id
+ ACE_ENV_ARG_PARAMETER);
+
+}
+
+
+PortableGroup::ObjectGroup_ptr
+TAO_PG_ObjectGroupManager::_tao_add_member (
+ PortableGroup::ObjectGroup_ptr object_group,
+ const PortableGroup::Location & the_location,
+ CORBA::Object_ptr member,
+ const char * type_id,
+ const CORBA::Boolean propagate_member_already_present
+ ACE_ENV_ARG_DECL)
+ ACE_THROW_SPEC ((CORBA::SystemException,
+ PortableGroup::MemberAlreadyPresent,
+ PortableGroup::NoFactory))
+{
+ if (CORBA::is_nil (member))
+ ACE_THROW_RETURN (CORBA::BAD_PARAM (),
+ PortableGroup::ObjectGroup::_nil ());
+
+ ACE_GUARD_RETURN (TAO_SYNCH_MUTEX,
+ guard,
+ this->lock_,
+ PortableGroup::ObjectGroup::_nil ());
+
+ PortableGroup::ObjectGroup_var new_group;
+
+ ACE_TRY
+ {
+ // TypeId already checked by GenericFactory.
+ const CORBA::Boolean check_type_id = 0;
+
+ new_group = this->add_member_i (object_group,
+ the_location,
+ member,
+ check_type_id
+ ACE_ENV_ARG_PARAMETER);
+ ACE_TRY_CHECK;
+ }
+ ACE_CATCH (PortableGroup::ObjectGroupNotFound, ex)
+ {
+ ACE_TRY_THROW (CORBA::INTERNAL ());
+ }
+ ACE_CATCH (PortableGroup::MemberAlreadyPresent, ex)
+ {
+ if (propagate_member_already_present)
+ ACE_RE_THROW;
+ else
+ ACE_TRY_THROW (CORBA::INTERNAL ());
+ }
+ ACE_CATCH (PortableGroup::ObjectNotAdded, ex)
+ {
+ ACE_TRY_THROW (PortableGroup::NoFactory (the_location,
+ type_id));
+ }
+ ACE_ENDTRY;
+ ACE_CHECK_RETURN (PortableGroup::ObjectGroup::_nil ());
+
+ return new_group._retn ();
+}
+
+PortableGroup::ObjectGroup_ptr
+TAO_PG_ObjectGroupManager::add_member_i (
+ PortableGroup::ObjectGroup_ptr object_group,
+ const PortableGroup::Location & the_location,
+ CORBA::Object_ptr member,
+ const CORBA::Boolean check_type_id
+ ACE_ENV_ARG_DECL)
+ ACE_THROW_SPEC ((CORBA::SystemException,
+ PortableGroup::ObjectGroupNotFound,
+ PortableGroup::MemberAlreadyPresent,
+ PortableGroup::ObjectNotAdded))
+{
+ TAO_PG_ObjectGroup_Map_Entry * group_entry =
+ this->get_group_entry (object_group
+ ACE_ENV_ARG_PARAMETER);
+ ACE_CHECK_RETURN (PortableGroup::ObjectGroup::_nil ());
+
+ if (check_type_id)
+ {
+ CORBA::Boolean right_type_id =
+ this->valid_type_id (object_group,
+ group_entry,
+ member
+ ACE_ENV_ARG_PARAMETER);
+ ACE_CHECK_RETURN (PortableGroup::ObjectGroup::_nil ());
+
+ if (!right_type_id)
+ {
+ // The member's type_id does not match the object group's
+ // type_id.
+ ACE_THROW_RETURN (PortableGroup::ObjectNotAdded (),
+ PortableGroup::ObjectGroup::_nil ());
+ }
+ }
+
+ TAO_PG_ObjectGroup_Array * groups = 0;
+ if (this->location_map_.find (the_location, groups) == 0
+ && this->member_already_present (*groups, group_entry))
+ ACE_THROW_RETURN (PortableGroup::MemberAlreadyPresent (),
+ PortableGroup::ObjectGroup::_nil ());
+
+ TAO_PG_MemberInfo member_info;
+ member_info.member = CORBA::Object::_duplicate (member);
+ member_info.location = the_location;
+
+ if (groups == 0)
+ {
+ ACE_NEW_THROW_EX (groups,
+ TAO_PG_ObjectGroup_Array,
+ CORBA::NO_MEMORY (
+ CORBA::SystemException::_tao_minor_code (
+ TAO::VMCID,
+ ENOMEM),
+ CORBA::COMPLETED_NO));
+ ACE_CHECK_RETURN (0);
+
+ auto_ptr<TAO_PG_ObjectGroup_Array> safe_groups (groups);
+
+ // This should not fail!
+ if (this->location_map_.bind (the_location, groups) != 0)
+ {
+ ACE_THROW_RETURN (PortableGroup::ObjectNotAdded (),
+ PortableGroup::ObjectGroup::_nil ());
+ }
+
+ (void) safe_groups.release ();
+ }
+
+ // No object group member of the object group with the given
+ // ObjectGroupId resides at the location. Add the object group
+ // entry to array of object groups residing at the location.
+ const size_t groups_len = groups->size ();
+ groups->size (groups_len + 1);
+ (*groups)[groups_len] = group_entry;
+
+ // Don't bother checking for duplicates since a check is already
+ // performed when binding to the location map above.
+ if (group_entry->member_infos.insert_tail (member_info) != 0)
+ ACE_THROW_RETURN (PortableGroup::ObjectNotAdded (),
+ PortableGroup::ObjectGroup::_nil ());
+
+ return PortableGroup::ObjectGroup::_duplicate (object_group);
+}
+
+PortableGroup::ObjectGroup_ptr
+TAO_PG_ObjectGroupManager::remove_member (
+ PortableGroup::ObjectGroup_ptr object_group,
+ const PortableGroup::Location & the_location
+ ACE_ENV_ARG_DECL)
+ ACE_THROW_SPEC ((CORBA::SystemException,
+ PortableGroup::ObjectGroupNotFound,
+ PortableGroup::MemberNotFound))
+{
+ ACE_GUARD_RETURN (TAO_SYNCH_MUTEX, guard, this->lock_, 0);
+
+ TAO_PG_ObjectGroup_Map_Entry * group_entry =
+ this->get_group_entry (object_group
+ ACE_ENV_ARG_PARAMETER);
+ ACE_CHECK_RETURN (PortableGroup::ObjectGroup::_nil ());
+
+ TAO_PG_ObjectGroup_Array * groups = 0;
+ if (this->location_map_.find (the_location, groups) != 0)
+ ACE_THROW_RETURN (PortableGroup::ObjectGroupNotFound (),
+ PortableGroup::ObjectGroup::_nil ());
+
+ // Multiple members from different object groups may reside at the
+ // same location. Iterate through the list to attempt to find a
+ // match for the exact object group.
+ size_t to_be_removed = 0;
+
+ // get the position of the object group in the object_group_array
+ to_be_removed = this->get_object_group_position (*groups, group_entry);
+
+ // remove the element from the array and resize the array.
+ const size_t groups_len = groups->size ();
+ size_t j;
+ for (size_t i = to_be_removed; i < groups_len - 1; ++i)
+ {
+ j = i + 1;
+ (*groups)[i] = (*groups)[j];
+ }
+
+ groups->size (groups_len - 1);
+
+ TAO_PG_MemberInfo_Set & member_infos = group_entry->member_infos;
+
+ TAO_PG_MemberInfo_Set::iterator end = member_infos.end ();
+
+ for (TAO_PG_MemberInfo_Set::iterator iter = member_infos.begin ();
+ iter != end;
+ ++iter)
+ {
+ const TAO_PG_MemberInfo & info = *iter;
+
+ if (info.location == the_location)
+ {
+ // Give the GenericFactory a chance to delete a member if
+ // its membership is under infrastructure control.
+ if (this->generic_factory_)
+ {
+ this->generic_factory_->delete_member (group_entry->group_id,
+ the_location
+ ACE_ENV_ARG_PARAMETER);
+ ACE_CHECK_RETURN (PortableGroup::ObjectGroup::_nil ());
+ }
+
+ if (member_infos.remove (info) == 0)
+ {
+ if (this->generic_factory_)
+ {
+ this->generic_factory_->check_minimum_number_members (
+ object_group,
+ group_entry->group_id,
+ group_entry->type_id.in ()
+ ACE_ENV_ARG_PARAMETER);
+ ACE_CHECK_RETURN (PortableGroup::ObjectGroup::_nil ());
+ }
+
+ return PortableGroup::ObjectGroup::_duplicate (object_group);
+ }
+ else
+ break;
+ }
+ }
+
+ ACE_THROW_RETURN (PortableGroup::MemberNotFound (),
+ PortableGroup::ObjectGroup::_nil ());
+}
+
+PortableGroup::Locations *
+TAO_PG_ObjectGroupManager::locations_of_members (
+ PortableGroup::ObjectGroup_ptr object_group
+ ACE_ENV_ARG_DECL)
+ ACE_THROW_SPEC ((CORBA::SystemException,
+ PortableGroup::ObjectGroupNotFound))
+{
+ ACE_GUARD_RETURN (TAO_SYNCH_MUTEX, guard, this->lock_, 0);
+
+ TAO_PG_ObjectGroup_Map_Entry * group_entry =
+ this->get_group_entry (object_group
+ ACE_ENV_ARG_PARAMETER);
+ ACE_CHECK_RETURN (0);
+
+ PortableGroup::Locations *temp = 0;
+ ACE_NEW_THROW_EX (temp,
+ PortableGroup::Locations,
+ CORBA::NO_MEMORY (
+ CORBA::SystemException::_tao_minor_code (
+ TAO::VMCID,
+ ENOMEM),
+ CORBA::COMPLETED_NO));
+ ACE_CHECK_RETURN (0);
+
+ PortableGroup::Locations_var locations = temp;
+
+ TAO_PG_MemberInfo_Set & member_infos = group_entry->member_infos;
+
+ locations->length (static_cast<CORBA::ULong> (member_infos.size ()));
+
+ CORBA::ULong loc = 0;
+ TAO_PG_MemberInfo_Set::iterator end = member_infos.end ();
+
+ for (TAO_PG_MemberInfo_Set::iterator i = member_infos.begin ();
+ i != end;
+ ++i)
+ locations[loc++] = (*i).location;
+
+ return locations._retn ();
+}
+
+PortableGroup::ObjectGroups *
+TAO_PG_ObjectGroupManager::groups_at_location (
+ const PortableGroup::Location & the_location
+ ACE_ENV_ARG_DECL)
+ ACE_THROW_SPEC ((CORBA::SystemException))
+{
+ PortableGroup::ObjectGroups * ogs;
+ ACE_NEW_THROW_EX (ogs,
+ PortableGroup::ObjectGroups,
+ CORBA::NO_MEMORY ());
+ ACE_CHECK_RETURN (0);
+
+ PortableGroup::ObjectGroups_var object_groups = ogs;
+
+ ACE_GUARD_RETURN (TAO_SYNCH_MUTEX, guard, this->lock_, 0);
+
+ TAO_PG_ObjectGroup_Array * groups;
+ if (this->location_map_.find (the_location, groups) == 0)
+ {
+ CORBA::ULong len = static_cast<CORBA::ULong> (groups->size ());
+
+ ogs->length (len);
+
+ for (CORBA::ULong i = 0; i < len; ++i)
+ {
+ object_groups[i] =
+ PortableGroup::ObjectGroup::_duplicate (
+ (*groups)[i]->object_group.in ());
+ }
+ }
+
+ return object_groups._retn ();
+}
+
+PortableGroup::ObjectGroupId
+TAO_PG_ObjectGroupManager::get_object_group_id (
+ PortableGroup::ObjectGroup_ptr object_group
+ ACE_ENV_ARG_DECL)
+ ACE_THROW_SPEC ((CORBA::SystemException,
+ PortableGroup::ObjectGroupNotFound))
+{
+ ACE_GUARD_RETURN (TAO_SYNCH_MUTEX,
+ guard,
+ this->lock_,
+ 0);
+
+ TAO_PG_ObjectGroup_Map_Entry * entry =
+ this->get_group_entry (object_group
+ ACE_ENV_ARG_PARAMETER);
+ ACE_CHECK_RETURN (0);
+
+ if (entry == 0)
+ ACE_THROW_RETURN (CORBA::INTERNAL (), 0);
+
+ // Only the lower 32 bits of the 64 bit PortableGroup::ObjectGroupId
+ // are ever used.
+ return entry->group_id;
+}
+
+PortableGroup::ObjectGroup_ptr
+TAO_PG_ObjectGroupManager::get_object_group_ref (
+ PortableGroup::ObjectGroup_ptr object_group
+ ACE_ENV_ARG_DECL)
+ ACE_THROW_SPEC ((CORBA::SystemException,
+ PortableGroup::ObjectGroupNotFound))
+{
+ TAO_PG_ObjectGroup_Map_Entry * entry = 0;
+
+ {
+ ACE_GUARD_RETURN (TAO_SYNCH_MUTEX,
+ guard,
+ this->lock_,
+ PortableGroup::ObjectGroup::_nil ());
+
+
+ entry = this->get_group_entry (object_group
+ ACE_ENV_ARG_PARAMETER);
+ ACE_CHECK_RETURN (PortableGroup::ObjectGroup::_nil ());
+ }
+
+ if (entry == 0)
+ ACE_THROW_RETURN (CORBA::INTERNAL (),
+ PortableGroup::ObjectGroup::_nil ());
+
+ // This implemenation does not change the object group reference.
+ return PortableGroup::ObjectGroup::_duplicate (object_group);
+}
+
+CORBA::Object_ptr
+TAO_PG_ObjectGroupManager::get_member_ref (
+ PortableGroup::ObjectGroup_ptr object_group,
+ const PortableGroup::Location & loc
+ ACE_ENV_ARG_DECL)
+ ACE_THROW_SPEC ((CORBA::SystemException,
+ PortableGroup::ObjectGroupNotFound,
+ PortableGroup::MemberNotFound))
+{
+ ACE_GUARD_RETURN (TAO_SYNCH_MUTEX,
+ guard,
+ this->lock_,
+ CORBA::Object::_nil ());
+
+ TAO_PG_ObjectGroup_Map_Entry * group_entry =
+ this->get_group_entry (object_group
+ ACE_ENV_ARG_PARAMETER);
+ ACE_CHECK_RETURN (PortableGroup::ObjectGroup::_nil ());
+
+ // This method assumes that it is faster to check for non-existence
+ // of an object group (and hence the member) at a given location,
+ // instead of existence of a member at a given location.
+
+ TAO_PG_ObjectGroup_Array * groups = 0;
+ if (this->location_map_.find (loc, groups) == 0
+ && this->member_already_present (*groups, group_entry))
+ {
+ TAO_PG_MemberInfo_Set & member_infos = group_entry->member_infos;
+
+ TAO_PG_MemberInfo_Set::iterator end = member_infos.end ();
+
+ // @todo If the object group contains a large number of members,
+ // this loop could take a while. Explore potentially
+ // faster containers for the list of PG_MemberInfos in the
+ // future.
+ for (TAO_PG_MemberInfo_Set::iterator i = member_infos.begin ();
+ i != end;
+ ++i)
+ if ((*i).location == loc)
+ return CORBA::Object::_duplicate ((*i).member.in ());
+ }
+
+ // No member of the given object group is present at the given
+ // location.
+ ACE_THROW_RETURN (PortableGroup::MemberNotFound (),
+ CORBA::Object::_nil ());
+}
+
+PortableGroup::ObjectGroup_ptr
+TAO_PG_ObjectGroupManager::get_object_group_ref_from_id (
+ PortableGroup::ObjectGroupId group_id
+ ACE_ENV_ARG_DECL
+ )
+ ACE_THROW_SPEC ((
+ CORBA::SystemException
+ , PortableGroup::ObjectGroupNotFound
+ ))
+{
+ //@@ If we change the PG's concept of ObjectGroupId from
+ // PortableServer::ObjectId to PortableGroup::ObjectGroupId, can
+ // just call TAO_PG_ObjectGroupManager::object_group() here.
+
+ TAO_PG_ObjectGroup_Map_Entry * group_entry = 0;
+ {
+ ACE_GUARD_RETURN (TAO_SYNCH_MUTEX,
+ guard,
+ this->lock_,
+ PortableGroup::ObjectGroup::_nil ());
+
+ if (this->object_group_map_.find (ACE_U64_TO_U32 (group_id),
+ group_entry)
+ != 0)
+ {
+ ACE_THROW_RETURN (PortableGroup::ObjectGroupNotFound (),
+ PortableGroup::ObjectGroup::_nil ());
+ }
+ }
+
+ if (group_entry == 0)
+ {
+ ACE_THROW_RETURN (CORBA::INTERNAL (),
+ PortableGroup::ObjectGroup::_nil ());
+ }
+
+ return
+ PortableGroup::ObjectGroup::_duplicate (group_entry->object_group.in ());
+}
+
+PortableGroup::ObjectGroup_ptr
+TAO_PG_ObjectGroupManager::create_object_group (
+ CORBA::ULong group_id,
+ const PortableServer::ObjectId &oid,
+ const char * type_id,
+ const PortableGroup::Criteria & the_criteria
+ ACE_ENV_ARG_DECL)
+{
+ if (CORBA::is_nil (this->poa_.in ()))
+ ACE_THROW_RETURN (CORBA::INTERNAL (), CORBA::Object::_nil ());
+
+ // Create a reference for the ObjectGroup corresponding to the
+ // RepositoryId of the object being created.
+ CORBA::Object_var object_group =
+ this->poa_->create_reference_with_id (oid,
+ type_id
+ ACE_ENV_ARG_PARAMETER);
+ ACE_CHECK_RETURN (CORBA::Object::_nil ());
+
+ TAO_PG_ObjectGroup_Map_Entry * group_entry = 0;
+ ACE_NEW_THROW_EX (group_entry,
+ TAO_PG_ObjectGroup_Map_Entry,
+ CORBA::NO_MEMORY (
+ CORBA::SystemException::_tao_minor_code (
+ TAO::VMCID,
+ ENOMEM),
+ CORBA::COMPLETED_NO));
+ ACE_CHECK_RETURN (CORBA::Object::_nil ());
+
+ auto_ptr<TAO_PG_ObjectGroup_Map_Entry> safe_group_entry (group_entry);
+
+ // Set the RepositoryId associated with the created ObjectGroup_Map
+ // entry.
+ group_entry->type_id = CORBA::string_dup (type_id);
+
+ group_entry->group_id = group_id;
+
+ group_entry->object_group = object_group;
+
+ CORBA::ULong len = the_criteria.length ();
+ group_entry->properties.length (len);
+ for (CORBA::ULong i = 0; i < len; ++i)
+ group_entry->properties[i] = the_criteria[i];
+
+ {
+ ACE_GUARD_RETURN (TAO_SYNCH_MUTEX,
+ guard,
+ this->lock_,
+ 0);
+
+ if (this->object_group_map_.bind (oid, group_entry) != 0)
+ ACE_THROW_RETURN (PortableGroup::ObjectNotCreated (),
+ PortableGroup::ObjectGroup::_nil ());
+ }
+
+ (void) safe_group_entry.release ();
+
+ return object_group._retn ();
+}
+
+void
+TAO_PG_ObjectGroupManager::destroy_object_group (
+ const PortableServer::ObjectId & oid
+ ACE_ENV_ARG_DECL)
+{
+ ACE_GUARD (TAO_SYNCH_MUTEX, guard, this->lock_);
+
+ TAO_PG_ObjectGroup_Map_Entry * group_entry = 0;
+ if (this->object_group_map_.unbind (oid, group_entry) != 0)
+ ACE_THROW (PortableGroup::ObjectNotFound ());
+
+ delete group_entry;
+}
+
+char *
+TAO_PG_ObjectGroupManager::type_id (
+ PortableGroup::ObjectGroup_ptr object_group
+ ACE_ENV_ARG_DECL)
+{
+ ACE_GUARD_RETURN (TAO_SYNCH_MUTEX,
+ guard,
+ this->lock_,
+ 0);
+
+ TAO_PG_ObjectGroup_Map_Entry * group_entry =
+ this->get_group_entry (object_group
+ ACE_ENV_ARG_PARAMETER);
+ ACE_CHECK_RETURN (0);
+
+ return CORBA::string_dup (group_entry->type_id.in ());
+}
+
+PortableGroup::ObjectGroup_ptr
+TAO_PG_ObjectGroupManager::object_group (const PortableServer::ObjectId & oid)
+{
+ ACE_GUARD_RETURN (TAO_SYNCH_MUTEX,
+ guard,
+ this->lock_,
+ PortableGroup::ObjectGroup::_nil ());
+
+ TAO_PG_ObjectGroup_Map_Entry * group_entry = 0;
+ if (this->object_group_map_.find (oid, group_entry) == 0)
+ return
+ PortableGroup::ObjectGroup::_duplicate (group_entry->object_group.in ());
+ else
+ return PortableGroup::ObjectGroup::_nil ();
+}
+
+CORBA::ULong
+TAO_PG_ObjectGroupManager::member_count (
+ PortableGroup::ObjectGroup_ptr group
+ ACE_ENV_ARG_DECL)
+ ACE_THROW_SPEC ((CORBA::SystemException,
+ PortableGroup::ObjectGroupNotFound))
+{
+// ACE_GUARD_RETURN (TAO_SYNCH_MUTEX,
+// guard,
+// this->lock_,
+// 0);
+
+ TAO_PG_ObjectGroup_Map_Entry * group_entry =
+ this->get_group_entry (group
+ ACE_ENV_ARG_PARAMETER);
+ ACE_CHECK_RETURN (0);
+
+ return static_cast<CORBA::ULong> (group_entry->member_infos.size ());
+}
+
+void
+TAO_PG_ObjectGroupManager::poa (PortableServer::POA_ptr p)
+{
+ this->poa_ = PortableServer::POA::_duplicate (p);
+}
+
+
+PortableGroup::Properties *
+TAO_PG_ObjectGroupManager::get_properties (
+ PortableGroup::ObjectGroup_ptr object_group
+ ACE_ENV_ARG_DECL)
+ ACE_THROW_SPEC ((CORBA::SystemException,
+ PortableGroup::ObjectGroupNotFound))
+{
+ PortableGroup::Properties * properties = 0;
+ ACE_NEW_THROW_EX (properties,
+ PortableGroup::Properties,
+ CORBA::NO_MEMORY (
+ CORBA::SystemException::_tao_minor_code (
+ TAO::VMCID,
+ ENOMEM),
+ CORBA::COMPLETED_NO));
+ ACE_CHECK_RETURN (0);
+
+ PortableGroup::Properties_var safe_properties = properties;
+
+ {
+ ACE_GUARD_RETURN (TAO_SYNCH_MUTEX,
+ guard,
+ this->lock_,
+ 0);
+
+ TAO_PG_ObjectGroup_Map_Entry * group_entry =
+ this->get_group_entry (object_group
+ ACE_ENV_ARG_PARAMETER);
+ ACE_CHECK_RETURN (0);
+
+ *properties = group_entry->properties;
+ }
+
+ return safe_properties._retn ();
+}
+
+TAO_PG_ObjectGroup_Map_Entry *
+TAO_PG_ObjectGroupManager::get_group_entry (
+ CORBA::Object_ptr object_group
+ ACE_ENV_ARG_DECL)
+ ACE_THROW_SPEC ((CORBA::SystemException,
+ PortableGroup::ObjectGroupNotFound))
+{
+ if (CORBA::is_nil (this->poa_.in ()))
+ ACE_THROW_RETURN (CORBA::INTERNAL (), 0);
+
+ PortableServer::ObjectId_var oid;
+ ACE_TRY
+ {
+ oid = this->poa_->reference_to_id (object_group
+ ACE_ENV_ARG_PARAMETER);
+ ACE_TRY_CHECK;
+ }
+ ACE_CATCH (PortableServer::POA::WrongAdapter, ex)
+ {
+ if (TAO_debug_level > 0)
+ ACE_PRINT_EXCEPTION (ex, "TAO_PG (%P|%t) Unexpected exception\n");
+
+ ACE_TRY_THROW (CORBA::INTERNAL ());
+ }
+ ACE_CATCH (PortableServer::POA::WrongPolicy, ex)
+ {
+ if (TAO_debug_level > 0)
+ ACE_PRINT_EXCEPTION (ex, "TAO_PG (%P|%t) Unexpected exception\n");
+
+ ACE_TRY_THROW (CORBA::INTERNAL ());
+ }
+ ACE_ENDTRY;
+ ACE_CHECK_RETURN (0);
+
+ TAO_PG_ObjectGroup_Map_Entry * group_entry = 0;
+ if (this->object_group_map_.find (oid.in (), group_entry) != 0)
+ ACE_THROW_RETURN (PortableGroup::ObjectGroupNotFound (),
+ 0);
+
+ return group_entry;
+}
+
+CORBA::Boolean
+TAO_PG_ObjectGroupManager::member_already_present (
+ const TAO_PG_ObjectGroup_Array &groups,
+ TAO_PG_ObjectGroup_Map_Entry * group_entry)
+{
+ // Multiple members from different object groups may reside at the
+ // same location. Iterate through the list to attempt to find a
+ // match.
+ size_t len = groups.size ();
+ for (size_t i = 0; i < len; ++i)
+ {
+ // It should be enough just to compare the group_entry pointers,
+ // but that seems brittle. Better to check a controlled value,
+ // like the ObjectGroupId.
+ if (groups[i]->group_id == group_entry->group_id)
+ {
+ // Member with given type ID exists at the given
+ // location.
+ return 1;
+ }
+ }
+
+ // No member with given type ID present at the given location.
+ return 0;
+}
+
+size_t
+TAO_PG_ObjectGroupManager::get_object_group_position (
+ const TAO_PG_ObjectGroup_Array &groups,
+ TAO_PG_ObjectGroup_Map_Entry * group_entry)
+{
+ // Multiple members from different object groups may reside at the
+ // same location. Iterate through the list to attempt to find a
+ // match.
+ size_t len = groups.size ();
+ for (size_t i = 0; i < len; ++i)
+ {
+ // It should be enough just to compare the group_entry pointers,
+ // but that seems brittle. Better to check a controlled value,
+ // like the ObjectGroupId.
+ if (groups[i]->group_id == group_entry->group_id)
+ {
+ // Member with given type ID exists at the given
+ // location.
+ return i;
+ }
+ }
+
+ // No member with given type ID present at the given location.
+ return 0;
+}
+
+CORBA::Boolean
+TAO_PG_ObjectGroupManager::valid_type_id (
+ PortableGroup::ObjectGroup_ptr object_group,
+ TAO_PG_ObjectGroup_Map_Entry * group_entry,
+ CORBA::Object_ptr member
+ ACE_ENV_ARG_DECL)
+{
+ // @todo Strategize this -- e.g. strict type checking.
+
+ if (CORBA::is_nil (member))
+ ACE_THROW_RETURN (CORBA::BAD_PARAM (), false);
+
+ // Before we can use this code, i.e. the reverse lock, the
+ // TAO_PG_ObjectGroup_Entry should be made so that it is reference
+ // counted. This is necessary since releasing the lock would
+ // allow other threads to destroy/unbind the object group entry.
+ // Another alternative is to simply attempt to reacquire the
+ // object group map entry once the lock is reacquired, which is
+ // easier to implement.
+
+ // Copy the type_id before releasing the lock to avoid a race
+ // condition.
+ CORBA::String_var type_id =
+ CORBA::string_dup (group_entry->type_id.in ());
+
+ CORBA::Boolean right_type_id = 0;
+ {
+ // Release the lock during the type_id check. No need to block
+ // other threads during the invocation.
+ ACE_Reverse_Lock<TAO_SYNCH_MUTEX> reverse_lock (this->lock_);
+
+ ACE_GUARD_RETURN (ACE_Reverse_Lock<TAO_SYNCH_MUTEX>,
+ reverse_guard,
+ reverse_lock,
+ right_type_id);
+
+ // Make sure an Object of the correct type was created. It is
+ // possible that an object of the wrong type was created if the
+ // type_id parameter does not match the type of object the
+ // GenericFactory creates.
+ right_type_id =
+ member->_is_a (type_id.in ()
+ ACE_ENV_ARG_PARAMETER);
+ ACE_CHECK_RETURN (right_type_id);
+ }
+
+ // Make sure the group entry still exists. It may have been
+ // destroyed by another thread.
+ group_entry = this->get_group_entry (object_group
+ ACE_ENV_ARG_PARAMETER);
+ ACE_CHECK_RETURN (right_type_id);
+
+ return right_type_id;
+}
+
+void
+TAO_PG_ObjectGroupManager::generic_factory (
+ TAO_PG_GenericFactory * generic_factory)
+{
+ this->generic_factory_ = generic_factory;
+}
+
+TAO_END_VERSIONED_NAMESPACE_DECL
diff --git a/TAO/orbsvcs/orbsvcs/PortableGroup/PG_ObjectGroupManager.h b/TAO/orbsvcs/orbsvcs/PortableGroup/PG_ObjectGroupManager.h
new file mode 100644
index 00000000000..b78cc4028f3
--- /dev/null
+++ b/TAO/orbsvcs/orbsvcs/PortableGroup/PG_ObjectGroupManager.h
@@ -0,0 +1,314 @@
+// -*- C++ -*-
+
+//=============================================================================
+/**
+ * @file PG_ObjectGroupManager.h
+ *
+ * $Id$
+ *
+ * @author Ossama Othman <ossama@uci.edu>
+ */
+//=============================================================================
+
+
+#ifndef TAO_PG_OBJECT_GROUP_MANAGER_H
+#define TAO_PG_OBJECT_GROUP_MANAGER_H
+
+#include /**/ "ace/pre.h"
+
+#include "orbsvcs/PortableGroup/portablegroup_export.h"
+#include "orbsvcs/PortableGroupS.h"
+
+#if !defined (ACE_LACKS_PRAGMA_ONCE)
+#pragma once
+#endif /* ACE_LACKS_PRAGMA_ONCE */
+
+#include "orbsvcs/PortableGroup/PG_ObjectGroup_Map.h"
+#include "orbsvcs/PortableGroup/PG_Location_Map.h"
+
+#include "tao/PortableServer/Key_Adapters.h"
+#include "tao/PortableServer/PortableServerC.h"
+
+
+TAO_BEGIN_VERSIONED_NAMESPACE_DECL
+
+/// Forward declarations
+class TAO_PG_GenericFactory;
+
+
+/**
+ * @class TAO_PG_ObjectGroupManager
+ *
+ * @brief PortableGroup::ObjectGroupManager implementation.
+ *
+ * The ObjectGroupManager provides the interface necessary to
+ * facilitate application-controlled object group membership.
+ */
+class TAO_PortableGroup_Export TAO_PG_ObjectGroupManager
+ : public virtual POA_PortableGroup::ObjectGroupManager
+{
+public:
+
+ /// Constructor.
+ TAO_PG_ObjectGroupManager (void);
+
+ /// Destructor.
+ ~TAO_PG_ObjectGroupManager (void);
+
+ /**
+ * @name PortableGroup::ObjectGroupManager methods
+ *
+ * Methods required by the PortableGroup::ObjectGroupManager
+ * interface.
+ */
+ //@{
+
+ /// Create a member and add it to the given object group.
+ virtual PortableGroup::ObjectGroup_ptr create_member (
+ PortableGroup::ObjectGroup_ptr object_group,
+ const PortableGroup::Location & the_location,
+ const char * type_id,
+ const PortableGroup::Criteria & the_criteria
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS)
+ ACE_THROW_SPEC ((CORBA::SystemException,
+ PortableGroup::ObjectGroupNotFound,
+ PortableGroup::MemberAlreadyPresent,
+ PortableGroup::NoFactory,
+ PortableGroup::ObjectNotCreated,
+ PortableGroup::InvalidCriteria,
+ PortableGroup::CannotMeetCriteria));
+
+ /// Add an existing object to the ObjectGroup.
+ virtual PortableGroup::ObjectGroup_ptr add_member (
+ PortableGroup::ObjectGroup_ptr object_group,
+ const PortableGroup::Location & the_location,
+ CORBA::Object_ptr member
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS)
+ ACE_THROW_SPEC ((CORBA::SystemException,
+ PortableGroup::ObjectGroupNotFound,
+ PortableGroup::MemberAlreadyPresent,
+ PortableGroup::ObjectNotAdded));
+
+ /**
+ * Remove an object at a specific location from the given
+ * ObjectGroup. Deletion of application created objects must be
+ * deleted by the application. Objects created by the
+ * infrastructure (load balancer) will be deleted by the
+ * infrastructure.
+ */
+ virtual PortableGroup::ObjectGroup_ptr remove_member (
+ PortableGroup::ObjectGroup_ptr object_group,
+ const PortableGroup::Location & the_location
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS)
+ ACE_THROW_SPEC ((CORBA::SystemException,
+ PortableGroup::ObjectGroupNotFound,
+ PortableGroup::MemberNotFound));
+
+ /// Return the locations of the members in the given ObjectGroup.
+ virtual PortableGroup::Locations * locations_of_members (
+ PortableGroup::ObjectGroup_ptr object_group
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS)
+ ACE_THROW_SPEC ((CORBA::SystemException,
+ PortableGroup::ObjectGroupNotFound));
+
+ /// Return the locations of the members in the given ObjectGroup.
+ virtual PortableGroup::ObjectGroups * groups_at_location (
+ const PortableGroup::Location & the_location
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS)
+ ACE_THROW_SPEC ((CORBA::SystemException));
+
+ /// Return the ObjectGroupId for the given ObjectGroup.
+ /// @note Does this method make sense for load balanced objects?
+ virtual PortableGroup::ObjectGroupId get_object_group_id (
+ PortableGroup::ObjectGroup_ptr object_group
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS)
+ ACE_THROW_SPEC ((CORBA::SystemException,
+ PortableGroup::ObjectGroupNotFound));
+
+ /// @note Does this method make sense for load balanced objects?
+ virtual PortableGroup::ObjectGroup_ptr get_object_group_ref (
+ PortableGroup::ObjectGroup_ptr object_group
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS)
+ ACE_THROW_SPEC ((CORBA::SystemException,
+ PortableGroup::ObjectGroupNotFound));
+
+ /// Return the reference corresponding to the member of a given
+ /// ObjectGroup at the given location.
+ virtual CORBA::Object_ptr get_member_ref (
+ PortableGroup::ObjectGroup_ptr object_group,
+ const PortableGroup::Location & loc
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS)
+ ACE_THROW_SPEC ((CORBA::SystemException,
+ PortableGroup::ObjectGroupNotFound,
+ PortableGroup::MemberNotFound));
+ /**
+ * TAO-specific extension.
+ * Return the ObjectGroup reference for the given ObjectGroupId.
+ */
+ virtual PortableGroup::ObjectGroup_ptr get_object_group_ref_from_id (
+ PortableGroup::ObjectGroupId group_id
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS
+ )
+ ACE_THROW_SPEC ((
+ CORBA::SystemException
+ , PortableGroup::ObjectGroupNotFound
+ ));
+
+ //@}
+
+ /// TAO-specific member addition method.
+ /**
+ * This method is meant to be invoked by TAO's GenericFactory
+ * implementation. It is designed to allow only certain exceptions
+ * to be propagated to the caller, and to prevent redundant remote
+ * RepositoryId checking.
+ */
+ PortableGroup::ObjectGroup_ptr _tao_add_member (
+ PortableGroup::ObjectGroup_ptr object_group,
+ const PortableGroup::Location & the_location,
+ CORBA::Object_ptr member,
+ const char * type_id,
+ const CORBA::Boolean propagate_member_already_present
+ ACE_ENV_ARG_DECL)
+ ACE_THROW_SPEC ((CORBA::SystemException,
+ PortableGroup::MemberAlreadyPresent,
+ PortableGroup::NoFactory));
+
+ /// Create object group hash map entry that represents an actual
+ /// ObjectGroup.
+ /**
+ * @note This method is used mainly by the
+ * GenericFactory::create_object() method.
+ */
+ PortableGroup::ObjectGroup_ptr create_object_group (
+ CORBA::ULong group_id,
+ const PortableServer::ObjectId &oid,
+ const char * type_id,
+ const PortableGroup::Criteria & the_criteria
+ ACE_ENV_ARG_DECL);
+
+ /// Destroy the object group corresponding to the given ObjectId.
+ /**
+ * @note This method is used mainly by the
+ * GenericFactory::delete_object() method.
+ */
+ void destroy_object_group (const PortableServer::ObjectId & oid
+ ACE_ENV_ARG_DECL);
+
+ /// Return the properties set when the object group was created, and
+ /// the dynamic properties that may have overridden them.
+ PortableGroup::Properties * get_properties (
+ PortableGroup::ObjectGroup_ptr object_group
+ ACE_ENV_ARG_DECL)
+ ACE_THROW_SPEC ((CORBA::SystemException,
+ PortableGroup::ObjectGroupNotFound));
+
+ /// Return the type_id for the given object group.
+ char * type_id (PortableGroup::ObjectGroup_ptr object_group
+ ACE_ENV_ARG_DECL);
+
+ /// Return the object group associated with the given ObjectId.
+ /**
+ * @return Returns PortableGroup::ObjectGroup::_nil() if no object
+ * group corresponding to the given ObjectId exists.
+ */
+ PortableGroup::ObjectGroup_ptr object_group (
+ const PortableServer::ObjectId & oid);
+
+ /// Return the number of members in the given object group.
+ CORBA::ULong member_count (PortableGroup::ObjectGroup_ptr group
+ ACE_ENV_ARG_DECL)
+ ACE_THROW_SPEC ((CORBA::SystemException,
+ PortableGroup::ObjectGroupNotFound));
+
+ /// Set the POA to use when converting object group references to
+ /// ObjectIds.
+ void poa (PortableServer::POA_ptr p);
+
+ /// Set the pointer to the GenericFactory associated with this
+ /// ObjectGroupManager.
+ /**
+ * The TAO_PG_GenericFactory will only be used when
+ * ObjectGroupManager::remove_member() is explicitly called so that
+ * the infrastructure may be given an opportunity to clean up any
+ * object group members it may have created.
+ */
+ void generic_factory (TAO_PG_GenericFactory * generic_factory);
+
+protected:
+
+ /// Underlying and non-locking implementation of the add_member()
+ /// and _tao_add_member() methods in this class.
+ PortableGroup::ObjectGroup_ptr add_member_i (
+ PortableGroup::ObjectGroup_ptr object_group,
+ const PortableGroup::Location & the_location,
+ CORBA::Object_ptr member,
+ const CORBA::Boolean check_type_id
+ ACE_ENV_ARG_DECL)
+ ACE_THROW_SPEC ((CORBA::SystemException,
+ PortableGroup::ObjectGroupNotFound,
+ PortableGroup::MemberAlreadyPresent,
+ PortableGroup::ObjectNotAdded));
+
+ /// Obtain the ObjectGroup hash map entry corresponding to the given
+ /// ObjectGroup reference.
+ TAO_PG_ObjectGroup_Map_Entry * get_group_entry (
+ PortableGroup::ObjectGroup_ptr object_group
+ ACE_ENV_ARG_DECL)
+ ACE_THROW_SPEC ((CORBA::SystemException,
+ PortableGroup::ObjectGroupNotFound));
+
+
+ /// Check if a member resides at the location to which the group
+ /// array belongs to.
+ /**
+ * A member is actually represented by the object group to which it
+ * belongs. In this implementation, a pointer to a object group
+ * hash map entry is associated with a given a location.
+ */
+ CORBA::Boolean member_already_present (
+ const TAO_PG_ObjectGroup_Array & groups,
+ TAO_PG_ObjectGroup_Map_Entry * group_entry);
+
+ /// get the position of the object_group_map_entry
+ size_t get_object_group_position (
+ const TAO_PG_ObjectGroup_Array & groups,
+ TAO_PG_ObjectGroup_Map_Entry * group_entry);
+
+ /// Verify that the member type_id matches the object group type_id.
+ /**
+ * @todo Strategize this -- e.g. strict type checking.
+ */
+ CORBA::Boolean valid_type_id (
+ PortableGroup::ObjectGroup_ptr object_group,
+ TAO_PG_ObjectGroup_Map_Entry * group_entry,
+ CORBA::Object_ptr member
+ ACE_ENV_ARG_DECL);
+
+private:
+
+ /// Reference to the POA that created the object group references.
+ PortableServer::POA_var poa_;
+
+ /// The underlying table that contains all object group
+ /// information.
+ TAO_PG_ObjectGroup_Map object_group_map_;
+
+ /// Map that contains list of all members at a given location, in
+ /// addition to the load monitor at that location.
+ TAO_PG_Location_Map location_map_;
+
+ /// Pointer to the TAO_PG_GenericFactory class responsible for
+ /// object group creation/destruction.
+ TAO_PG_GenericFactory * generic_factory_;
+
+ /// Lock used to synchronize access to the underlying tables.
+ TAO_SYNCH_MUTEX lock_;
+
+};
+
+TAO_END_VERSIONED_NAMESPACE_DECL
+
+#include /**/ "ace/post.h"
+
+#endif /* TAO_PG_OBJECT_GROUP_MANAGER_H */
diff --git a/TAO/orbsvcs/orbsvcs/PortableGroup/PG_ObjectGroup_Map.h b/TAO/orbsvcs/orbsvcs/PortableGroup/PG_ObjectGroup_Map.h
new file mode 100644
index 00000000000..4673a79df0f
--- /dev/null
+++ b/TAO/orbsvcs/orbsvcs/PortableGroup/PG_ObjectGroup_Map.h
@@ -0,0 +1,84 @@
+// -*- C++ -*-
+
+//=======================================================================
+/**
+ * @file PG_ObjectGroup_Map.h
+ *
+ * $Id$
+ *
+ * @author Ossama Othman <ossama@uci.edu>
+ */
+//=======================================================================
+
+
+#ifndef TAO_PG_OBJECTGROUP_MAP_H
+#define TAO_PG_OBJECTGROUP_MAP_H
+
+#include /**/ "ace/pre.h"
+
+#include "ace/config-all.h"
+
+#if !defined (ACE_LACKS_PRAGMA_ONCE)
+# pragma once
+#endif /* ACE_LACKS_PRAGMA_ONCE */
+
+#include "orbsvcs/PortableGroup/PG_MemberInfo.h"
+
+#include "orbsvcs/PortableGroupC.h"
+
+#include "tao/PortableServer/Key_Adapters.h"
+#include "tao/PortableServer/PortableServerC.h"
+
+#include "ace/Hash_Map_Manager_T.h"
+#include "ace/Null_Mutex.h"
+
+TAO_BEGIN_VERSIONED_NAMESPACE_DECL
+
+/**
+ * @class TAO_PG_ObjectGroup_Map_Entry
+ *
+ * @brief Value field of the ObjectGroup map.
+ */
+struct TAO_PG_ObjectGroup_Map_Entry
+{
+public:
+
+ /// The RepositoryId corresponding to all Members in the
+ /// ObjectGroup.
+ CORBA::String_var type_id;
+
+ /// This is the PortableGroup::ObjectGroupId.
+ /**
+ * The spec states that PortableGroup::ObjectGroupId is a
+ * CORBA::ULongLong. However, the over 4 billion group IDs that can
+ * be represented by a CORBA::ULong should be plenty for any
+ * application.
+ */
+ CORBA::ULong group_id;
+
+ /// Reference to the ObjectGroup.
+ PortableGroup::ObjectGroup_var object_group;
+
+ /// Unbounded set containing member references and all related
+ /// information for each member.
+ TAO_PG_MemberInfo_Set member_infos;
+
+ /// Properties used when creating this object group, in addition to
+ /// those set dynamically after the creation.
+ PortableGroup::Properties properties;
+
+};
+
+/// ObjectId hash map typedef.
+typedef ACE_Hash_Map_Manager_Ex<
+ PortableServer::ObjectId,
+ TAO_PG_ObjectGroup_Map_Entry *,
+ TAO_ObjectId_Hash,
+ ACE_Equal_To<PortableServer::ObjectId>,
+ ACE_Null_Mutex> TAO_PG_ObjectGroup_Map;
+
+TAO_END_VERSIONED_NAMESPACE_DECL
+
+#include /**/ "ace/post.h"
+
+#endif /* TAO_PG_OBJECTGROUP_MAP_H */
diff --git a/TAO/orbsvcs/orbsvcs/PortableGroup/PG_Object_Adapter_Factory.cpp b/TAO/orbsvcs/orbsvcs/PortableGroup/PG_Object_Adapter_Factory.cpp
new file mode 100644
index 00000000000..f8545615ad6
--- /dev/null
+++ b/TAO/orbsvcs/orbsvcs/PortableGroup/PG_Object_Adapter_Factory.cpp
@@ -0,0 +1,48 @@
+// $Id$
+
+#include "orbsvcs/PortableGroup/PG_Object_Adapter_Factory.h"
+#include "orbsvcs/PortableGroup/PG_Servant_Dispatcher.h"
+
+#include "tao/PortableServer/Object_Adapter.h"
+#include "tao/ORB_Core.h"
+
+ACE_RCSID (TAO_PortableGroup,
+ PG_Object_Adapter_Factory,
+ "$Id$")
+
+TAO_BEGIN_VERSIONED_NAMESPACE_DECL
+
+TAO_PG_Object_Adapter_Factory::TAO_PG_Object_Adapter_Factory (void)
+{
+}
+
+TAO_Adapter*
+TAO_PG_Object_Adapter_Factory::create (TAO_ORB_Core *orb_core)
+{
+ TAO_Object_Adapter *object_adapter = 0;
+ ACE_NEW_RETURN (object_adapter,
+ TAO_Object_Adapter (orb_core->server_factory ()->
+ active_object_map_creation_parameters (),
+ *orb_core),
+ 0);
+
+ // Create and register the RT servant dispatcher.
+ TAO_PG_Servant_Dispatcher *rt_servant_dispatcher = 0;
+ ACE_NEW_RETURN (rt_servant_dispatcher,
+ TAO_PG_Servant_Dispatcher,
+ 0);
+ object_adapter->servant_dispatcher (rt_servant_dispatcher);
+
+
+ return object_adapter;
+}
+
+TAO_END_VERSIONED_NAMESPACE_DECL
+
+ACE_FACTORY_DEFINE (TAO_PortableGroup, TAO_PG_Object_Adapter_Factory)
+ACE_STATIC_SVC_DEFINE (TAO_PG_Object_Adapter_Factory,
+ ACE_TEXT ("TAO_GOA"),
+ ACE_SVC_OBJ_T,
+ &ACE_SVC_NAME (TAO_PG_Object_Adapter_Factory),
+ ACE_Service_Type::DELETE_THIS | ACE_Service_Type::DELETE_OBJ,
+ 0)
diff --git a/TAO/orbsvcs/orbsvcs/PortableGroup/PG_Object_Adapter_Factory.h b/TAO/orbsvcs/orbsvcs/PortableGroup/PG_Object_Adapter_Factory.h
new file mode 100644
index 00000000000..7edf4fe521e
--- /dev/null
+++ b/TAO/orbsvcs/orbsvcs/PortableGroup/PG_Object_Adapter_Factory.h
@@ -0,0 +1,47 @@
+// -*- C++ -*-
+
+//=============================================================================
+/**
+ * @file PG_Object_Adapter_Factory.h
+ *
+ * $Id$
+ *
+ * @author Johnny Willemsen
+ */
+// ===================================================================
+
+#ifndef TAO_PG_OBJECT_ADAPTER_FACTORY_H
+#define TAO_PG_OBJECT_ADAPTER_FACTORY_H
+#include /**/ "ace/pre.h"
+
+#include "orbsvcs/PortableGroup/portablegroup_export.h"
+
+#include "tao/PortableServer/Object_Adapter_Factory.h"
+#include "tao/orbconf.h"
+
+#include "ace/Service_Config.h"
+
+#if !defined (ACE_LACKS_PRAGMA_ONCE)
+# pragma once
+#endif /* ACE_LACKS_PRAGMA_ONCE */
+
+TAO_BEGIN_VERSIONED_NAMESPACE_DECL
+
+class TAO_PortableGroup_Export TAO_PG_Object_Adapter_Factory : public TAO_Object_Adapter_Factory
+{
+public:
+ /// Constructor
+ TAO_PG_Object_Adapter_Factory (void);
+
+ /// Create adapter.
+ virtual TAO_Adapter *create (TAO_ORB_Core *orb_core);
+};
+
+TAO_END_VERSIONED_NAMESPACE_DECL
+
+ACE_STATIC_SVC_DECLARE (TAO_PG_Object_Adapter_Factory)
+ACE_FACTORY_DECLARE (TAO_PortableGroup, TAO_PG_Object_Adapter_Factory)
+
+#include /**/ "ace/post.h"
+
+#endif /* TAO_PG_OBJECT_ADAPTER_FACTORY_H */
diff --git a/TAO/orbsvcs/orbsvcs/PortableGroup/PG_Object_Group.cpp b/TAO/orbsvcs/orbsvcs/PortableGroup/PG_Object_Group.cpp
new file mode 100644
index 00000000000..09d492e76a0
--- /dev/null
+++ b/TAO/orbsvcs/orbsvcs/PortableGroup/PG_Object_Group.cpp
@@ -0,0 +1,896 @@
+// $Id$
+
+#include "orbsvcs/PortableGroup/PG_Object_Group.h"
+#include "orbsvcs/PortableGroup/PG_conf.h"
+
+#include "orbsvcs/PortableGroup/PG_Operators.h" // Borrow operator== on CosNaming::Name
+#include "orbsvcs/PortableGroup/PG_Utils.h"
+
+#include "tao/debug.h"
+
+#include "ace/Get_Opt.h"
+#include "ace/Vector_T.h"
+
+
+// Borland Developer Studio 2006 and earlier give a warning about comparing
+// signed and unsigned values in the minimum_polulate() and
+// initial_populate() warnings. The comparison uses a unsigned long and
+// unsigned short and it seems that the compiler promotes the unsigned
+// short of an int and this then gives the warning. Just for Borland
+// disabled the warning in this file.
+#if defined (__BORLANDC__) && (__BORLANDC__ <= 0x582)
+# pragma option push -w-csu
+# pragma nopushoptwarn
+# pragma nopackwarning
+#endif /* __BORLANDC__ && __BORLANDC__ <= 0x582 */
+
+#define TODO int todo;
+
+TAO_BEGIN_VERSIONED_NAMESPACE_DECL
+
+TAO::PG_Object_Group::MemberInfo::MemberInfo (
+ CORBA::Object_ptr member,
+ const PortableGroup::Location & location)
+ : member_ (CORBA::Object::_duplicate (member))
+ , factory_(PortableGroup::GenericFactory::_nil ())
+ , location_ (location)
+ , is_primary_ (0)
+{
+}
+
+TAO::PG_Object_Group::MemberInfo::MemberInfo (
+ CORBA::Object_ptr member,
+ const PortableGroup::Location & location,
+ PortableGroup::GenericFactory_ptr factory,
+ PortableGroup::GenericFactory::FactoryCreationId factory_id)
+ : member_ (CORBA::Object::_duplicate (member))
+ , factory_ (PortableGroup::GenericFactory::_duplicate (factory))
+ , factory_id_ (factory_id)
+ , location_ (location)
+ , is_primary_ (0)
+{
+}
+
+TAO::PG_Object_Group::MemberInfo::~MemberInfo (void)
+{
+ if( ! CORBA::is_nil (this->factory_.in()))
+ {
+ this->factory_->delete_object (this->factory_id_);
+ }
+}
+
+
+TAO::PG_Object_Group::PG_Object_Group (
+ CORBA::ORB_ptr orb,
+ PortableGroup::FactoryRegistry_ptr factory_registry,
+ TAO::PG_Object_Group_Manipulator & manipulator,
+ CORBA::Object_ptr empty_group,
+ const PortableGroup::TagGroupTaggedComponent & tagged_component,
+ const char * type_id,
+ const PortableGroup::Criteria & the_criteria,
+ TAO::PG_Property_Set * type_properties)
+ : internals_()
+ , orb_ (CORBA::ORB::_duplicate (orb))
+ , factory_registry_ (PortableGroup::FactoryRegistry::_duplicate (factory_registry))
+ , manipulator_ (manipulator)
+ , empty_ (1)
+ , role_ (type_id)
+ , type_id_ (CORBA::string_dup (type_id))
+ , tagged_component_ (tagged_component)
+ , reference_ (CORBA::Object::_duplicate(empty_group))
+ , members_ ()
+ , primary_location_(0)
+ , properties_ (the_criteria, type_properties)
+ , initial_number_members_ (0)
+ , minimum_number_members_ (0)
+ , group_specific_factories_ ()
+{
+}
+
+TAO::PG_Object_Group::~PG_Object_Group (void)
+{
+ for (MemberMap_Iterator it = this->members_.begin();
+ it != this->members_.end();
+ ++it)
+ {
+ MemberInfo * member = (*it).int_id_;
+ delete member;
+ }
+ this->members_.unbind_all ();
+}
+
+#if 0 // may want this again someday
+/////////////////////
+// q&d debug function
+static void
+dump_ior (const char * base,
+ const char * ext,
+ unsigned long version,
+ const char * iogr)
+{
+ char filename[1000];
+ ACE_OS::sprintf(filename, "%s_%lu.%s", base, version, ext );
+
+ FILE * iorfile = ACE_OS::fopen(filename, "w");
+ ACE_OS::fwrite (iogr, 1, ACE_OS::strlen(iogr), iorfile);
+ ACE_OS::fclose (iorfile);
+}
+#endif // may want this again someday
+
+PortableGroup::ObjectGroup_ptr
+TAO::PG_Object_Group::reference (void) const
+{
+ ACE_GUARD_RETURN (TAO_SYNCH_MUTEX,
+ guard,
+ this->internals_,
+ PortableGroup::ObjectGroup::_nil ());
+ return PortableGroup::ObjectGroup::_duplicate (this->reference_);
+}
+
+void
+TAO::PG_Object_Group::get_group_specific_factories (
+ PortableGroup::FactoryInfos & result) const
+{
+ ACE_GUARD (TAO_SYNCH_MUTEX, guard, this->internals_);
+
+ // copy is needed to have some semblance of thread safeness.
+ // if performance is an issue avoid this method.
+ result = this->group_specific_factories_;
+}
+
+const PortableGroup::Location &
+TAO::PG_Object_Group::get_primary_location (void) const
+{
+ ACE_GUARD_RETURN (TAO_SYNCH_MUTEX,
+ guard,
+ this->internals_,
+ this->primary_location_);
+ return this->primary_location_;
+}
+
+
+PortableGroup::ObjectGroup_ptr
+TAO::PG_Object_Group::add_member_to_iogr (CORBA::Object_ptr member
+ ACE_ENV_ARG_DECL)
+{
+ // assume internals is locked
+
+ PortableGroup::ObjectGroup_var result;
+
+ ////////////////////////////
+ // @@ HACK ALERT
+ // The PortableGroup::ObjectGroupManager creates an object reference
+ // containing a dummy entry so it will have a place to store the
+ // tagged group component. If this is the first entry, we need to
+ // remove that entry once we have a *real* member. This can be
+ // avoided when we get support for TAG_MULTIPLE_COMPONENTS. For
+ // now, we already have a copy of the tagGroupTagged component and
+ // we're going to use it below wen we increment the group version so
+ // we can clean out the dummy entry.
+ PortableGroup::ObjectGroup_var cleaned =
+ PortableGroup::ObjectGroup::_duplicate (this->reference_.in ());
+ if (this->empty_)
+ {
+ // remove the original profile. It's a dummy entry supplied by
+ // create_object.
+ cleaned =
+ this->manipulator_.remove_profiles (cleaned.in (),
+ this->reference_.in ()
+ ACE_ENV_ARG_PARAMETER);
+ ACE_CHECK_RETURN (PortableGroup::ObjectGroup::_nil());
+ this->empty_ = 0;
+ }
+
+ // create a list of references to be merged
+ TAO_IOP::TAO_IOR_Manipulation::IORList iors (2);
+ iors.length (2);
+ iors [0] = CORBA::Object::_duplicate (cleaned.in());
+ iors [1] = CORBA::Object::_duplicate (member);
+
+ // Now merge the list into one new IOGR
+ result =
+ this->manipulator_.merge_iors (iors ACE_ENV_ARG_PARAMETER);
+ ACE_CHECK_RETURN (PortableGroup::ObjectGroup::_nil ());
+ return result._retn ();
+}
+
+void
+TAO::PG_Object_Group::add_member (const PortableGroup::Location & the_location,
+ CORBA::Object_ptr member
+ ACE_ENV_ARG_DECL)
+ ACE_THROW_SPEC ((CORBA::SystemException,
+ PortableGroup::ObjectNotAdded))
+
+{
+ ACE_GUARD (TAO_SYNCH_MUTEX, guard, this->internals_);
+
+ /////////////////////////////////////////
+ // Convert the new member to a string IOR
+ // This keeps a clean IOR (not an IOGR!)
+ // while we add it to a group. We need a
+ // IORs, not IOGRs to send new IOGRs out
+ // to replicas.
+
+ CORBA::String_var member_ior_string =
+ orb_->object_to_string (member
+ ACE_ENV_ARG_PARAMETER);
+ ACE_CHECK;
+
+ PortableGroup::ObjectGroup_var new_reference =
+ add_member_to_iogr (member
+ ACE_ENV_ARG_PARAMETER);
+ ACE_CHECK;
+
+ // Convert new member back to a (non group) ior.
+ CORBA::Object_var member_ior =
+ this->orb_->string_to_object (member_ior_string.in ()
+ ACE_ENV_ARG_PARAMETER);
+ ACE_CHECK;
+
+ MemberInfo * info = 0;
+ ACE_NEW_THROW_EX (info,
+ MemberInfo (member_ior.in (),
+ the_location),
+ CORBA::NO_MEMORY());
+
+ if (this->members_.bind (the_location, info) != 0)
+ {
+ // @@ Dale why this is a NO MEMORY exception?
+ ACE_THROW(CORBA::NO_MEMORY());
+ }
+
+ this->reference_ = new_reference; // note var-to-var assignment does
+ // a duplicate
+ if (this->increment_version ())
+ {
+ this->distribute_iogr (ACE_ENV_SINGLE_ARG_PARAMETER);
+ ACE_CHECK;
+ }
+ else
+ {
+ ACE_THROW (PortableGroup::ObjectNotAdded ());
+ }
+
+ if (TAO_debug_level > 6)
+ {
+ ACE_DEBUG ((LM_DEBUG,
+ ACE_TEXT("PG (%P|%t) exit Object_Group add_member \n")));
+ }
+}
+
+int
+TAO::PG_Object_Group::set_primary_member (
+ TAO_IOP::TAO_IOR_Property * prop,
+ const PortableGroup::Location & the_location
+ ACE_ENV_ARG_DECL)
+ ACE_THROW_SPEC ((CORBA::SystemException,
+ PortableGroup::MemberNotFound))
+{
+ ACE_GUARD_RETURN (TAO_SYNCH_MUTEX,
+ guard,
+ this->internals_,
+ 0);
+ int result = 1;
+ MemberInfo * info = 0;
+ if (this->members_.find (the_location, info) == 0)
+ {
+ int cleared = 0;
+ this->primary_location_ = the_location;
+ for (MemberMap_Iterator it = this->members_.begin();
+ !cleared && it != this->members_.end();
+ ++it)
+ {
+ cleared = (*it).int_id_->is_primary_;
+ (*it).int_id_->is_primary_ = 0;
+ }
+ info->is_primary_ = 1;
+
+ int set_ok =
+ this->manipulator_.set_primary (prop,
+ this->reference_.in (),
+ info->member_.in ()
+ ACE_ENV_ARG_PARAMETER);
+ ACE_CHECK_RETURN (0);
+ if (!set_ok)
+ {
+ if (TAO_debug_level > 3)
+ {
+ ACE_ERROR ((LM_ERROR,
+ ACE_TEXT ("%T %n (%P|%t) - ")
+ ACE_TEXT ("Can't set primary in IOGR .\n")
+ ));
+ }
+//@@: ACE_THROW (FT::PrimaryNotSet());
+ result = 0;
+ }
+
+ if (result && this->increment_version ())
+ {
+ this->distribute_iogr (ACE_ENV_SINGLE_ARG_PARAMETER);
+ ACE_CHECK_RETURN (0);
+ }
+ else
+ {
+ if (TAO_debug_level > 3)
+ {
+ ACE_DEBUG ((LM_DEBUG,
+ ACE_TEXT("TAO-PG (%P|%t) - set_primary_location ")
+ ACE_TEXT("throwing PrimaryNotSet because increment")
+ ACE_TEXT("version failed.\n")
+ ));
+ }
+//@@: ACE_THROW (FT::PrimaryNotSet());
+ result = 0;
+ }
+ }
+ else
+ {
+ if (TAO_debug_level > 3)
+ {
+ ACE_DEBUG ((LM_DEBUG,
+ ACE_TEXT ("TAO-PG (%P|%t) - set_primary_location ")
+ ACE_TEXT ("throwing MemberNotFound.\n")));
+ }
+ ACE_THROW_RETURN (PortableGroup::MemberNotFound(),
+ -1);
+ }
+
+ return result;
+}
+
+
+void
+TAO::PG_Object_Group::remove_member (
+ const PortableGroup::Location & the_location
+ ACE_ENV_ARG_DECL)
+ ACE_THROW_SPEC ( (CORBA::SystemException,
+ PortableGroup::MemberNotFound))
+{
+ ACE_GUARD (TAO_SYNCH_MUTEX, guard, this->internals_);
+ MemberInfo * info = 0;
+ if (this->members_.unbind (the_location, info) == 0)
+ {
+ if (this->members_.current_size() > 0)
+ {
+ this->reference_ =
+ this->manipulator_.remove_profiles (this->reference_.in (),
+ info->member_.in ()
+ ACE_ENV_ARG_PARAMETER);
+ ACE_CHECK;
+ }
+ else
+ {
+ empty_ = 1;
+ }
+
+ delete info;
+
+ if (the_location == this->primary_location_)
+ {
+ this->primary_location_.length(0);
+ }
+
+ if (this->increment_version ())
+ {
+ this->distribute_iogr (ACE_ENV_SINGLE_ARG_PARAMETER);
+ ACE_CHECK;
+ }
+
+ }
+ else
+ {
+ if (TAO_debug_level > 6)
+ {
+ ACE_DEBUG ((LM_DEBUG,
+ "TAO-PG (%P|%t) - "
+ "remove_member throwing MemberNotFound.\n"
+ ));
+ }
+ ACE_THROW (PortableGroup::MemberNotFound() );
+ }
+}
+
+
+PortableGroup::ObjectGroupId
+TAO::PG_Object_Group::get_object_group_id (void) const
+{
+ ACE_GUARD_RETURN (TAO_SYNCH_MUTEX,
+ guard,
+ this->internals_,
+ 0);
+ return this->tagged_component_.object_group_id;
+}
+
+void
+TAO::PG_Object_Group::set_properties_dynamically (
+ const PortableGroup::Properties & overrides
+ ACE_ENV_ARG_DECL)
+ ACE_THROW_SPEC ((CORBA::SystemException,
+ PortableGroup::InvalidProperty,
+ PortableGroup::UnsupportedProperty))
+{
+ ACE_GUARD (TAO_SYNCH_MUTEX, guard, this->internals_);
+
+ this->properties_.decode (overrides ACE_ENV_ARG_PARAMETER);
+
+ //@@ int todo_override_rather_than_replace?
+}
+
+void
+TAO::PG_Object_Group::get_properties (
+ PortableGroup::Properties_var & result) const
+ ACE_THROW_SPEC ((CORBA::SystemException))
+{
+ ACE_GUARD (TAO_SYNCH_MUTEX, guard, this->internals_);
+ this->properties_.export_properties(*result);
+}
+
+
+PortableGroup::TypeId
+TAO::PG_Object_Group::get_type_id (void) const
+{
+ ACE_GUARD_RETURN (TAO_SYNCH_MUTEX,
+ guard,
+ this->internals_,
+ 0);
+ return CORBA::string_dup (this->type_id_);
+}
+
+
+///////////////////
+// Internal method
+
+int
+TAO::PG_Object_Group::increment_version (void)
+{
+ // assume internals is locked
+ int result = 0;
+ this->tagged_component_.object_group_ref_version += 1;
+ if (TAO_debug_level > 3)
+ {
+ ACE_DEBUG ((LM_DEBUG,
+ ACE_TEXT ("%T %n (%P|%t) - Setting IOGR version to %u\n"),
+ static_cast<unsigned> (this->tagged_component_.object_group_ref_version)
+ ));
+ }
+
+ // Set the version
+ if (TAO::PG_Utils::set_tagged_component (this->reference_,
+ this->tagged_component_))
+ {
+ result = 1;
+ }
+ return result;
+}
+
+
+//////////////////
+// Internal method
+void
+TAO::PG_Object_Group::distribute_iogr (ACE_ENV_SINGLE_ARG_DECL)
+{
+ // assume internals is locked
+ CORBA::String_var iogr =
+ this->orb_->object_to_string (this->reference_.in()
+ ACE_ENV_ARG_PARAMETER);
+ ACE_CHECK;
+
+// size_t n_rep = 0; // for dump_ior below
+ for (MemberMap_Iterator it = this->members_.begin();
+ it != this->members_.end ();
+ ++it)
+ {
+ MemberInfo const * info = (*it).int_id_;
+ //
+ // Unchecked narrow means the member doesn't have to actually implement the TAO_UpdateObjectGroup interface
+ // PortableGroup::TAO_UpdateObjectGroup_var uog = PortableGroup::TAO_UpdateObjectGroup::_unchecked_narrow ( info->member_);
+ // but it doesn work: error message at replica is:
+ // TAO-FT (2996|976) - Wrong version information within the interceptor [1 | 0]
+ // TAO_Perfect_Hash_OpTable:find for operation 'tao_update_object_group' (length=23) failed
+ // back to using _narrow
+ PortableGroup::TAO_UpdateObjectGroup_var uog =
+ PortableGroup::TAO_UpdateObjectGroup::_narrow ( info->member_.in ());
+ if (!CORBA::is_nil (uog.in ()))
+ {
+ ACE_TRY_NEW_ENV
+ {
+ if (TAO_debug_level > 3)
+ {
+ ACE_DEBUG ((LM_DEBUG,
+ "PG (%P|%t) - Object_Group pushing "
+ "IOGR to %s member: %s@%s.\n",
+ (info->is_primary_ ? "Primary" : "Backup"),
+ this->role_.c_str (),
+ static_cast<const char *> (info->location_[0].id)
+ ));
+ }
+ // dump_ior ("group", "iogr", this->tagged_component_.object_group_ref_version, iogr);
+ // CORBA::String_var replica_ior = this->orb_->object_to_string(uog.in() ACE_ENV_ARG_PARAMETER);
+ // dump_ior (info->location_[0].id, "ior", (this->tagged_component_.object_group_ref_version * 100) + n_rep++, replica_ior);
+ uog->tao_update_object_group (iogr.in (),
+ this->tagged_component_.object_group_ref_version,
+ info->is_primary_
+ ACE_ENV_ARG_PARAMETER);
+ ACE_TRY_CHECK;
+ }
+ ACE_CATCHANY
+ {
+ // we expect an exception
+ // tao_update_object_group is not a real method
+ }
+ ACE_ENDTRY;
+ }
+ else
+ {
+ ACE_ERROR ((LM_ERROR,
+ "TAO::PG_Object_Group::distribute iogr can't "
+ "narrow member reference to "
+ "PortableGroup::TAO_UpdateObjectGroup.\n"
+ ));
+ }
+ }
+}
+
+PortableGroup::Locations *
+TAO::PG_Object_Group::locations_of_members (ACE_ENV_SINGLE_ARG_DECL)
+ ACE_THROW_SPEC ((CORBA::SystemException))
+{
+ ACE_GUARD_RETURN (TAO_SYNCH_MUTEX,
+ guard,
+ this->internals_,
+ 0);
+
+ PortableGroup::Locations * result = 0;
+
+ size_t count = this->members_.current_size ();
+
+ ACE_NEW_THROW_EX (
+ result,
+ PortableGroup::Locations (count),
+ CORBA::NO_MEMORY() );
+ ACE_CHECK_RETURN (0);
+
+ result->length (count);
+
+ size_t pos = 0;
+ for (MemberMap_Iterator it = this->members_.begin();
+ it != this->members_.end();
+ ++it)
+ {
+ const PortableGroup::Location & location = (*it).ext_id_;
+ PortableGroup::Location & out = (*result)[pos];
+ out = location;
+ }
+ return result;
+}
+
+CORBA::Object_ptr
+TAO::PG_Object_Group::get_member_reference (
+ const PortableGroup::Location & the_location
+ ACE_ENV_ARG_DECL)
+ ACE_THROW_SPEC ((
+ CORBA::SystemException,
+ PortableGroup::MemberNotFound))
+{
+ ACE_GUARD_RETURN (TAO_SYNCH_MUTEX,
+ guard,
+ this->internals_,
+ CORBA::Object::_nil ());
+
+ CORBA::Object_var result;
+
+ MemberInfo * info = 0;
+ if (this->members_.find (the_location, info) == 0)
+ {
+ result = CORBA::Object::_duplicate (info->member_.in ());
+ }
+ else
+ {
+ ACE_THROW_RETURN (PortableGroup::MemberNotFound(), result._retn ());
+ }
+ return result._retn ();
+}
+
+
+PortableGroup::MembershipStyleValue
+TAO::PG_Object_Group::get_membership_style (void) const
+{
+ PortableGroup::MembershipStyleValue membership_style = 0;
+ if (!TAO::find (properties_,
+ PortableGroup::PG_MEMBERSHIP_STYLE,
+ membership_style))
+ {
+ membership_style = TAO_PG_MEMBERSHIP_STYLE;
+ }
+ return membership_style;
+}
+
+
+PortableGroup::MinimumNumberMembersValue
+TAO::PG_Object_Group::get_minimum_number_members (void) const
+{
+ PortableGroup::MinimumNumberMembersValue minimum_number_members = 0;
+ if (!TAO::find (properties_,
+ PortableGroup::PG_MINIMUM_NUMBER_MEMBERS,
+ minimum_number_members))
+ {
+ minimum_number_members = TAO_PG_MINIMUM_NUMBER_MEMBERS;
+ }
+ return minimum_number_members;
+}
+
+PortableGroup::InitialNumberMembersValue
+TAO::PG_Object_Group::get_initial_number_members (void) const
+{
+ PortableGroup::InitialNumberMembersValue initial_number_members = 0;
+ if (!TAO::find (properties_,
+ PortableGroup::PG_INITIAL_NUMBER_MEMBERS,
+ initial_number_members))
+ {
+ initial_number_members = TAO_PG_INITIAL_NUMBER_MEMBERS;
+ }
+ return initial_number_members;
+}
+
+void
+TAO::PG_Object_Group::create_member (
+ const PortableGroup::Location & the_location,
+ const char * type_id,
+ const PortableGroup::Criteria & the_criteria
+ ACE_ENV_ARG_DECL)
+ ACE_THROW_SPEC ( (CORBA::SystemException,
+ PortableGroup::MemberAlreadyPresent,
+ PortableGroup::NoFactory,
+ PortableGroup::ObjectNotCreated,
+ PortableGroup::InvalidCriteria,
+ PortableGroup::CannotMeetCriteria))
+{
+ ACE_GUARD (TAO_SYNCH_MUTEX, guard, this->internals_);
+
+
+ if (0 != this->members_.find (the_location))
+ {
+ // @@ what if factories were passed as criteria?
+
+ CORBA::String_var factory_type;
+ PortableGroup::FactoryInfos_var factories =
+ this->factory_registry_->list_factories_by_role (
+ role_.c_str(),
+ factory_type.out ()
+ ACE_ENV_ARG_PARAMETER);
+ ACE_CHECK;
+
+ // @@ what if factory_type != type_id != this->type_id_
+
+ int created = 0; // bool
+ CORBA::ULong factory_count = factories->length ();
+ for (CORBA::ULong factory_pos = 0;
+ ! created && factory_pos < factory_count;
+ ++factory_pos)
+ {
+ const PortableGroup::FactoryInfo & factory_info =
+ (*factories)[factory_pos];
+ if (factory_info.the_location == the_location)
+ {
+ // @@ should we merge the_criteria with
+ // factory_info.the_criteria?
+
+ PortableGroup::GenericFactory::FactoryCreationId_var fcid;
+ CORBA::Object_var member =
+ factory_info.the_factory->create_object (
+ type_id,
+ the_criteria,
+ fcid. out()
+ ACE_ENV_ARG_PARAMETER);
+ ACE_CHECK;
+
+ // convert the new member to a stringified IOR to avoid
+ // contamination with group info
+ CORBA::String_var member_ior_string =
+ orb_->object_to_string (member.in ()
+ ACE_ENV_ARG_PARAMETER);
+ ACE_CHECK;
+
+ PortableGroup::ObjectGroup_var new_reference =
+ this->add_member_to_iogr (member.in ()
+ ACE_ENV_ARG_PARAMETER);
+ ACE_CHECK;
+
+ // Convert new member back to a (non group) ior.
+ CORBA::Object_var member_ior =
+ this->orb_->string_to_object (member_ior_string.in ()
+ ACE_ENV_ARG_PARAMETER);
+ ACE_CHECK;
+
+ MemberInfo * info = 0;
+ ACE_NEW_THROW_EX (info, MemberInfo(
+ member_ior.in(),
+ the_location,
+ factory_info.the_factory,
+ fcid.in ()),
+ CORBA::NO_MEMORY());
+ ACE_CHECK;
+
+ if (this->members_.bind (the_location, info) != 0)
+ {
+ ACE_THROW(CORBA::NO_MEMORY());
+ }
+
+ this->reference_ = new_reference; // note var-to-var
+ // assignment does a
+ // duplicate
+ if (this->increment_version ())
+ {
+ this->distribute_iogr (ACE_ENV_SINGLE_ARG_PARAMETER);
+ ACE_CHECK;
+ }
+ created = 1;
+ }
+ }
+ if (! created)
+ {
+ ACE_THROW (PortableGroup::NoFactory ());
+ }
+ }
+ else
+ {
+ ACE_THROW (PortableGroup::MemberAlreadyPresent ());
+ }
+}
+
+void
+TAO::PG_Object_Group::create_members (size_t count ACE_ENV_ARG_DECL)
+ ACE_THROW_SPEC ((CORBA::SystemException,
+ PortableGroup::NoFactory))
+{
+ // assume internals is locked
+ // @@ what if factories were passed as criteria?
+
+ CORBA::String_var factory_type;
+ PortableGroup::FactoryInfos_var factories =
+ this->factory_registry_->list_factories_by_role (
+ role_.c_str(),
+ factory_type.out ()
+ ACE_ENV_ARG_PARAMETER);
+ ACE_CHECK;
+
+ CORBA::ULong factory_count = factories->length ();
+ if (factory_count > 0)
+ {
+ CORBA::ULong factory_pos = 0;
+ while (members_.current_size () < count && factory_pos < factory_count)
+ {
+ const PortableGroup::FactoryInfo & factory_info =
+ (*factories)[factory_pos];
+ const PortableGroup::Location & factory_location =
+ factory_info.the_location;
+ if (0 != this->members_.find (factory_location))
+ {
+ ///////////////////////////////////////////
+ // If a factory refuses to create a replica
+ // it's not fatal.
+ ACE_TRY_NEW_ENV
+ {
+ PortableGroup::GenericFactory::FactoryCreationId_var fcid;
+ CORBA::Object_var member =
+ factory_info.the_factory->create_object (
+ this->type_id_.in (),
+ factory_info.the_criteria,
+ fcid. out()
+ ACE_ENV_ARG_PARAMETER);
+ ACE_TRY_CHECK;
+
+ // convert the new member to a stringified IOR to avoid
+ // contamination with group info
+ CORBA::String_var member_ior_string =
+ orb_->object_to_string (member.in ()
+ ACE_ENV_ARG_PARAMETER);
+ ACE_TRY_CHECK;
+
+ PortableGroup::ObjectGroup_var new_reference =
+ this->add_member_to_iogr (member.in ()
+ ACE_ENV_ARG_PARAMETER);
+ ACE_TRY_CHECK;
+
+ // Convert new member back to a (non group) ior.
+ CORBA::Object_var member_ior =
+ this->orb_->string_to_object (member_ior_string.in ()
+ ACE_ENV_ARG_PARAMETER);
+ ACE_TRY_CHECK;
+
+ MemberInfo * info = 0;
+ ACE_NEW_THROW_EX (info, MemberInfo(
+ member_ior.in(),
+ factory_location,
+ factory_info.the_factory,
+ fcid.in ()),
+ CORBA::NO_MEMORY());
+ ACE_TRY_CHECK;
+
+ if (this->members_.bind (factory_location, info) != 0)
+ {
+ ACE_TRY_THROW(CORBA::NO_MEMORY());
+ }
+ this->reference_ =
+ new_reference; // note var-to-var assignment does
+ // a duplicate
+ }
+ ACE_CATCHANY
+ {
+ // log, but otherwise ignore the errorf
+ if (TAO_debug_level > 0)
+ {
+ ACE_ERROR ((LM_ERROR,
+ ACE_TEXT ("PG (%P|%t) Replica Factory ")
+ ACE_TEXT ("@ %s refused create_object ")
+ ACE_TEXT ("request for type %s\n"),
+ static_cast<const char *> (factory_info.the_location[0].id),
+ static_cast<const char *> (this->type_id_.in ())
+ ));
+ }
+ }
+ ACE_ENDTRY;
+ }
+ }
+
+ if (this->increment_version ())
+ {
+ this->distribute_iogr (ACE_ENV_SINGLE_ARG_PARAMETER);
+ ACE_CHECK;
+ }
+ }
+ else
+ {
+ ACE_THROW (PortableGroup::NoFactory());
+ }
+}
+
+void
+TAO::PG_Object_Group::initial_populate (ACE_ENV_SINGLE_ARG_DECL)
+{
+ ACE_GUARD (TAO_SYNCH_MUTEX, guard, this->internals_);
+
+ if (this->get_membership_style () == PortableGroup::MEMB_INF_CTRL)
+ {
+ PortableGroup::InitialNumberMembersValue initial_number_members =
+ this->get_initial_number_members ();
+
+ if (this->members_.current_size () < initial_number_members)
+ {
+ this->create_members (initial_number_members
+ ACE_ENV_ARG_PARAMETER);
+ ACE_CHECK;
+ }
+ }
+}
+
+void
+TAO::PG_Object_Group::minimum_populate (ACE_ENV_SINGLE_ARG_DECL)
+{
+ ACE_GUARD (TAO_SYNCH_MUTEX, guard, this->internals_);
+
+ if ( this->get_membership_style () == PortableGroup::MEMB_INF_CTRL )
+ {
+ PortableGroup::MinimumNumberMembersValue minimum_number_members =
+ this->get_minimum_number_members ();
+ if (members_.current_size () < minimum_number_members)
+ {
+ this->create_members (minimum_number_members ACE_ENV_ARG_PARAMETER);
+ }
+ }
+}
+
+int
+TAO::PG_Object_Group::has_member_at (const PortableGroup::Location & location)
+{
+ return (0 == this->members_.find (location));
+}
+
+TAO_END_VERSIONED_NAMESPACE_DECL
+
+// Restore original compiler flags.
+#if defined (__BORLANDC__) && (__BORLANDC__ <= 0x582)
+# pragma option pop
+# pragma nopushoptwarn
+# pragma nopackwarning
+#endif /* __BORLANDC__ && __BORLANDC__ <= 0x582 */
diff --git a/TAO/orbsvcs/orbsvcs/PortableGroup/PG_Object_Group.h b/TAO/orbsvcs/orbsvcs/PortableGroup/PG_Object_Group.h
new file mode 100644
index 00000000000..aaf4628cda3
--- /dev/null
+++ b/TAO/orbsvcs/orbsvcs/PortableGroup/PG_Object_Group.h
@@ -0,0 +1,382 @@
+// -*- C++ -*-
+
+//=============================================================================
+/**
+ * @file PG_Object_Group.h
+ *
+ * $Id$
+ *
+ * Manage all information related to an object group.
+ * @@ Note: the above description is optimistic. The hope is to eventually
+ * @@ consolidate all information related to an object group into this object.
+ * @@ however at the moment GenericFactory, ObjectGroupManager, and
+ * FT_ReplicationManager have parallel collections of object group
+ * information.
+ *
+ * @author Dale Wilson <wilson_d@ociweb.com>
+ */
+//=============================================================================
+
+#ifndef TAO_PG_OBJECT_GROUP_H_
+#define TAO_PG_OBJECT_GROUP_H_
+#include /**/ "ace/pre.h"
+
+#include "orbsvcs/PortableGroup/portablegroup_export.h"
+
+#if !defined (ACE_LACKS_PRAGMA_ONCE)
+#pragma once
+#endif /* ACE_LACKS_PRAGMA_ONCE */
+
+
+/////////////////////////////////
+// Includes needed by this header
+#include "orbsvcs/PortableGroup/PG_Property_Set.h"
+#include "orbsvcs/PortableGroup/PG_Location_Hash.h"
+#include "orbsvcs/PortableGroup/PG_Location_Equal_To.h"
+#include "orbsvcs/PortableGroup/PG_Object_Group_Manipulator.h"
+#include "orbsvcs/PortableGroupC.h"
+#include "tao/PortableServer/PortableServer.h"
+#include "ace/Hash_Map_Manager_T.h"
+#include "ace/ACE.h"
+
+TAO_BEGIN_VERSIONED_NAMESPACE_DECL
+
+/////////////////////
+// Forward references
+
+namespace TAO_IOP
+{
+ class TAO_IOR_Property;
+}
+
+////////////////
+// Class declarations
+namespace TAO
+{
+ /**
+ */
+ class TAO_PortableGroup_Export PG_Object_Group
+ {
+ // Information about an object group member
+ struct MemberInfo
+ {
+ /// Reference to the member.
+ CORBA::Object_var member_;
+
+ /// The factory that was used to create this object
+ /// nil if application created.
+ PortableGroup::GenericFactory_var factory_;
+
+ /// FactoryCreationId assigned to the member. Empty if application created
+ PortableGroup::GenericFactory::FactoryCreationId factory_id_;
+
+ /// Location where this member exists
+ PortableGroup::Location location_;
+
+
+ /// TRUE if this is primary member
+ CORBA::Boolean is_primary_;
+
+
+ ///////////////
+ // Methods
+
+ /// Construct an application-supplied member.
+ MemberInfo (CORBA::Object_ptr member, const PortableGroup::Location & location);
+
+ /// Construct a infrastructure-created member.
+ MemberInfo (
+ CORBA::Object_ptr member,
+ const PortableGroup::Location & location,
+ PortableGroup::GenericFactory_ptr factory,
+ PortableGroup::GenericFactory::FactoryCreationId factory_id);
+
+ /// Destructor
+ ~MemberInfo();
+ };
+
+ typedef TAO_SYNCH_MUTEX MemberMapMutex;
+ typedef ACE_Hash_Map_Manager_Ex <
+ PortableGroup::Location,
+ MemberInfo *,
+ TAO_PG_Location_Hash,
+ TAO_PG_Location_Equal_To,
+ MemberMapMutex> MemberMap;
+ typedef ACE_Hash_Map_Entry <PortableGroup::Location, MemberInfo *> MemberMap_Entry;
+ typedef ACE_Hash_Map_Iterator_Ex <
+ PortableGroup::Location,
+ MemberInfo *,
+ TAO_PG_Location_Hash,
+ TAO_PG_Location_Equal_To,
+ MemberMapMutex> MemberMap_Iterator;
+
+ /////////////////////
+ // Construct/Destruct
+ public:
+ /**
+ * @@TODO DOC
+ */
+ PG_Object_Group (
+ CORBA::ORB_ptr orb,
+ PortableGroup::FactoryRegistry_ptr factory_registry,
+ TAO::PG_Object_Group_Manipulator & manipulator,
+ CORBA::Object_ptr empty_group,
+ const PortableGroup::TagGroupTaggedComponent & tagged_component,
+ const char * type_id,
+ const PortableGroup::Criteria & the_criteria,
+ TAO::PG_Property_Set * type_properties);
+
+
+ /// Destructor
+ ~PG_Object_Group ();
+
+ /////////////////
+ // public methods
+
+ public:
+ /// return a duplicated reference to this group (IOGR)
+ PortableGroup::ObjectGroup_ptr reference()const;
+
+ /**
+ * Note the caller receives a copy of the factoryinfos in the result argument.
+ * inefficient, but thread safe.
+ */
+ void get_group_specific_factories (PortableGroup::FactoryInfos & result) const;
+
+ /**
+ * get location of primary member
+ */
+ const PortableGroup::Location & get_primary_location() const;
+
+ /**
+ * returns a duplicate
+ * caller must release
+ */
+ PortableGroup::TypeId get_type_id ()const;
+
+
+ /**
+ * @@TODO DOC
+ */
+ PortableGroup::MembershipStyleValue get_membership_style() const;
+
+ /**
+ * @@TODO DOC
+ */
+ PortableGroup::MinimumNumberMembersValue get_minimum_number_members () const;
+
+ /**
+ * @@TODO DOC
+ */
+ PortableGroup::InitialNumberMembersValue get_initial_number_members () const;
+
+
+
+ /**
+ * @@TODO DOC
+ */
+ void set_properties_dynamically (
+ const PortableGroup::Properties & overrides
+ ACE_ENV_ARG_DECL)
+ ACE_THROW_SPEC ((CORBA::SystemException,
+ PortableGroup::InvalidProperty,
+ PortableGroup::UnsupportedProperty));
+
+ /**
+ * @@TODO DOC
+ */
+ void get_properties (PortableGroup::Properties_var & result) const
+ ACE_THROW_SPEC ((CORBA::SystemException));
+
+ /**
+ * @@TODO DOC
+ */
+ PortableGroup::ObjectGroupId get_object_group_id () const;
+
+ /**
+ * Add a new member to the group.
+ * @param the_location the location for the new member
+ * @param member the member to be added
+ */
+ void add_member (
+ const PortableGroup::Location & the_location,
+ CORBA::Object_ptr member
+ ACE_ENV_ARG_DECL)
+ ACE_THROW_SPEC ( (CORBA::SystemException,
+ PortableGroup::ObjectNotAdded));
+
+ /**
+ * set the replica at the given location to be primary.
+ * Note: This should return void and throw FT::PrimaryNotSet
+ * but to avoid dependancies between PortableGroup and FaultTolerance
+ * it returns a boolean result. A false return means caller should
+ * throw FT::PrimaryNot_Set.
+ */
+ int set_primary_member (
+ TAO_IOP::TAO_IOR_Property * prop,
+ const PortableGroup::Location & the_location
+ ACE_ENV_ARG_DECL)
+ ACE_THROW_SPEC ((
+ CORBA::SystemException
+ , PortableGroup::MemberNotFound
+ ));
+
+ /**
+ * @@TODO DOC
+ */
+ void remove_member (
+ const PortableGroup::Location & the_location
+ ACE_ENV_ARG_DECL)
+ ACE_THROW_SPEC ( (CORBA::SystemException,
+ PortableGroup::MemberNotFound));
+
+
+ /**
+ * @@TODO DOC
+ */
+ void create_member (
+ const PortableGroup::Location & the_location,
+ const char * type_id,
+ const PortableGroup::Criteria & the_criteria
+ ACE_ENV_ARG_DECL)
+ ACE_THROW_SPEC ( (CORBA::SystemException,
+ PortableGroup::MemberAlreadyPresent,
+ PortableGroup::NoFactory,
+ PortableGroup::ObjectNotCreated,
+ PortableGroup::InvalidCriteria,
+ PortableGroup::CannotMeetCriteria));
+
+ /**
+ * @@TODO DOC
+ */
+ PortableGroup::Locations * locations_of_members (ACE_ENV_SINGLE_ARG_DECL)
+ ACE_THROW_SPEC ((CORBA::SystemException));
+
+ /**
+ * @@TODO DOC
+ */
+ CORBA::Object_ptr get_member_reference (
+ const PortableGroup::Location & the_location
+ ACE_ENV_ARG_DECL)
+ ACE_THROW_SPEC ((
+ CORBA::SystemException,
+ PortableGroup::MemberNotFound));
+
+
+ /**
+ * @@TODO DOC
+ */
+ void initial_populate (ACE_ENV_SINGLE_ARG_DECL);
+
+ /**
+ * @@TODO DOC
+ */
+ void minimum_populate (ACE_ENV_SINGLE_ARG_DECL);
+
+
+ /**
+ * @@TODO DOC
+ */
+ int has_member_at (const PortableGroup::Location & location );
+
+ /////////////////////////
+ // Implementation methods
+ private:
+
+ int increment_version ();
+
+ void distribute_iogr (ACE_ENV_SINGLE_ARG_DECL);
+
+ PortableGroup::ObjectGroup_ptr add_member_to_iogr(CORBA::Object_ptr member ACE_ENV_ARG_DECL);
+
+
+ void create_members (size_t count ACE_ENV_ARG_DECL)
+ ACE_THROW_SPEC ((
+ CORBA::SystemException,
+ PortableGroup::NoFactory
+ ));
+
+
+ /////////////////////////
+ // Forbidden methods
+ private:
+ PG_Object_Group ();
+ PG_Object_Group (const PG_Object_Group & rhs);
+ PG_Object_Group & operator = (const PG_Object_Group & rhs);
+
+
+ /////////////////
+ // Static Methods
+ public:
+
+ ///////////////
+ // Static Data
+ private:
+
+ ///////////////
+ // Data Members
+ private:
+
+ /**
+ * Protect internal state.
+ */
+ mutable TAO_SYNCH_MUTEX internals_;
+
+ CORBA::ORB_var orb_;
+
+ /// Where to find the factories for replicas.
+ PortableGroup::FactoryRegistry_var factory_registry_;
+
+
+ // The object group manipulator
+ TAO::PG_Object_Group_Manipulator & manipulator_;
+
+ /// boolean true if empty group
+ int empty_;
+
+ ACE_CString role_;
+ PortableGroup::TypeId_var type_id_;
+
+ /**
+ * the GroupTaggedComponent that defines this group
+ * contains:
+ * GIOP::Version component_version;
+ * TAO::String_Manager group_domain_id;
+ * PortableGroup::ObjectGroupId object_group_id;
+ * PortableGroup::ObjectGroupRefVersion object_group_ref_version;
+ */
+ PortableGroup::TagGroupTaggedComponent tagged_component_;
+
+ /**
+ * the reference (IOGR) to this group
+ */
+ PortableGroup::ObjectGroup_var reference_;
+
+ /**
+ * The CORBA object id assigned to this object group
+ */
+ PortableServer::ObjectId_var object_id_;
+
+ // group members
+ MemberMap members_;
+
+ PortableGroup::Location primary_location_;
+
+ // Miscellaneous properties passed to create_object when this group
+ // was initially created. To be used to create new members.
+ TAO::PG_Property_Set properties_;
+
+ // Cached property information
+
+ PortableGroup::InitialNumberMembersValue initial_number_members_;
+ PortableGroup::MinimumNumberMembersValue minimum_number_members_;
+ PortableGroup::FactoryInfos group_specific_factories_;
+
+ };
+} // namespace TAO
+
+TAO_END_VERSIONED_NAMESPACE_DECL
+
+#include /**/ "ace/post.h"
+
+#endif // TAO_PG_OBJECT_GROUP_H_
diff --git a/TAO/orbsvcs/orbsvcs/PortableGroup/PG_Object_Group_Manipulator.cpp b/TAO/orbsvcs/orbsvcs/PortableGroup/PG_Object_Group_Manipulator.cpp
new file mode 100644
index 00000000000..2fb57ae571a
--- /dev/null
+++ b/TAO/orbsvcs/orbsvcs/PortableGroup/PG_Object_Group_Manipulator.cpp
@@ -0,0 +1,190 @@
+// -*- C++ -*-
+
+//=============================================================================
+/**
+ * @file PG_Object_Group_Manipulator.cpp
+ *
+ * $Id$
+ *
+ * @author Dale Wilson <wilson_d@ociweb.com>
+ */
+//=============================================================================
+
+#include "orbsvcs/PortableGroup/PG_Object_Group_Manipulator.h"
+#include "orbsvcs/PortableGroup/PG_Utils.h"
+
+#include "tao/debug.h"
+#include <ace/OS_NS_stdio.h>
+
+ACE_RCSID (PortableGroup,
+ PG_Object_Group_Manipulator,
+ "$Id$")
+
+
+TAO_BEGIN_VERSIONED_NAMESPACE_DECL
+
+TAO::PG_Object_Group_Manipulator::PG_Object_Group_Manipulator ()
+ : orb_ (CORBA::ORB::_nil ())
+ , poa_ (PortableServer::POA::_nil ())
+ , iorm_ ()
+ , lock_ogid_ ()
+ , next_ogid_ (1) // don't use ogid 0
+{
+}
+
+TAO::PG_Object_Group_Manipulator::~PG_Object_Group_Manipulator ()
+{
+}
+
+void TAO::PG_Object_Group_Manipulator::allocate_ogid (PortableGroup::ObjectGroupId & ogid)
+{
+ ACE_GUARD (TAO_SYNCH_MUTEX, guard, this->lock_ogid_);
+
+ // The numerical value used for the ObjectId increases
+ // monotonically.
+
+ ogid = this->next_ogid_;
+ this->next_ogid_ += 1;
+}
+
+PortableServer::ObjectId * TAO::PG_Object_Group_Manipulator::convert_ogid_to_oid (PortableGroup::ObjectGroupId ogid) const
+{
+ // 4294967295 -- Largest 32 bit unsigned integer
+ char oid_str[11];
+ ACE_OS::snprintf (oid_str, sizeof(oid_str),
+ "%lu",
+ static_cast<ACE_UINT32> (ogid));
+ oid_str[sizeof(oid_str) - 1] = '\0';
+
+ return PortableServer::string_to_ObjectId (oid_str);
+}
+
+PortableGroup::ObjectGroup_ptr
+TAO::PG_Object_Group_Manipulator::create_object_group (
+ const char * type_id,
+ const char * domain_id,
+ PortableGroup::ObjectGroupId & group_id
+ ACE_ENV_ARG_DECL)
+{
+ allocate_ogid(group_id);
+ PortableServer::ObjectId_var oid = convert_ogid_to_oid (group_id);
+
+ // Create a reference for the ObjectGroup
+ CORBA::Object_var object_group =
+ this->poa_->create_reference_with_id (oid.in(),
+ type_id
+ ACE_ENV_ARG_PARAMETER);
+ ACE_CHECK_RETURN (CORBA::Object::_nil ());
+
+ PortableGroup::TagGroupTaggedComponent tag_component;
+
+ tag_component.component_version.major = (CORBA::Octet) 1;
+ tag_component.component_version.minor = (CORBA::Octet) 0;
+ tag_component.group_domain_id = domain_id;
+ tag_component.object_group_id = group_id;
+ tag_component.object_group_ref_version = 0;
+
+ // Set the property
+ TAO::PG_Utils::set_tagged_component (object_group,
+ tag_component);
+ ACE_CHECK_RETURN (CORBA::Object::_nil ());
+
+ return object_group._retn ();
+}
+
+void
+TAO::PG_Object_Group_Manipulator::init (CORBA::ORB_ptr orb,
+ PortableServer::POA_ptr poa
+ ACE_ENV_ARG_DECL)
+{
+ ACE_ASSERT (CORBA::is_nil (this->orb_.in ()) && !CORBA::is_nil (orb));
+ this->orb_ = CORBA::ORB::_duplicate (orb);
+
+ ACE_ASSERT (CORBA::is_nil (this->poa_.in ()) && !CORBA::is_nil (poa));
+ this->poa_ = PortableServer::POA::_duplicate (poa);
+
+ // Get an object reference for the ORBs IORManipulation object!
+ CORBA::Object_var IORM = this->orb_->resolve_initial_references (
+ TAO_OBJID_IORMANIPULATION, 0 ACE_ENV_ARG_PARAMETER);
+ ACE_CHECK;
+
+ this->iorm_ = TAO_IOP::TAO_IOR_Manipulation::_narrow (
+ IORM.in () ACE_ENV_ARG_PARAMETER);
+// ACE_CHECK;
+}
+
+int TAO::PG_Object_Group_Manipulator::set_primary (
+ TAO_IOP::TAO_IOR_Property * prop,
+ PortableGroup::ObjectGroup_ptr group,
+ CORBA::Object_ptr new_primary
+ ACE_ENV_ARG_DECL) const
+{
+ int sts = this->iorm_->is_primary_set (prop, group ACE_ENV_ARG_PARAMETER);
+ ACE_CHECK_RETURN (0);
+ if (sts)
+ {
+ (void)this->iorm_->remove_primary_tag (prop, group ACE_ENV_ARG_PARAMETER);
+ ACE_CHECK_RETURN (0);
+ }
+ /////note: iorm takes it's parameters in the "wrong" order for this call
+ return this->iorm_->set_primary (prop, new_primary, group ACE_ENV_ARG_PARAMETER);
+}
+
+PortableGroup::ObjectGroup_ptr TAO::PG_Object_Group_Manipulator::merge_iors(
+ TAO_IOP::TAO_IOR_Manipulation::IORList & list ACE_ENV_ARG_DECL) const
+{
+ return this->iorm_->merge_iors (list ACE_ENV_ARG_PARAMETER);
+}
+
+PortableGroup::ObjectGroup_ptr TAO::PG_Object_Group_Manipulator::remove_profiles(
+ PortableGroup::ObjectGroup_ptr group,
+ PortableGroup::ObjectGroup_ptr profile
+ ACE_ENV_ARG_DECL) const
+{
+ return this->iorm_->remove_profiles(group, profile ACE_ENV_ARG_PARAMETER);
+}
+
+void dump_membership (const char * label, PortableGroup::ObjectGroup_ptr member)
+{
+ ACE_UNUSED_ARG (label);
+ ACE_UNUSED_ARG (member);
+#if 0
+ PortableGroup::TagFTGroupTaggedComponent ft_tag_component;
+ TAO_FT_IOGR_Property prop (ft_tag_component);
+ if (this->iorm_->is_primary_set (&prop, member))
+ {
+ ACE_DEBUG ( (LM_DEBUG,
+ ACE_TEXT ("%T %n (%P|%t) - %s: PRIMARY member.\n"),
+ label
+ ));
+ }
+ else
+ {
+ ACE_DEBUG ( (LM_DEBUG,
+ ACE_TEXT ("%T %n (%P|%t) - %s: backup member.\n"),
+ label
+ ));
+ }
+
+ PortableGroup::TagGroupTaggedComponent tag_component;
+ if (TAO::PG_Utils::get_tagged_component (member, tag_component))
+ {
+ ACE_DEBUG ( (LM_DEBUG,
+ ACE_TEXT ("%T %n (%P|%t) - %s: Group: .")
+ ACE_TEXT (" version: %u\n"),
+
+ label,
+ tag_component.object_group_ref_version
+ ));
+ }
+ else
+ {
+ ACE_DEBUG ( (LM_DEBUG,
+ ACE_TEXT ("%T %n (%P|%t) - %s: No group information found.\n"),
+ label
+ ));
+ }
+#endif
+}
+
+TAO_END_VERSIONED_NAMESPACE_DECL
diff --git a/TAO/orbsvcs/orbsvcs/PortableGroup/PG_Object_Group_Manipulator.h b/TAO/orbsvcs/orbsvcs/PortableGroup/PG_Object_Group_Manipulator.h
new file mode 100644
index 00000000000..4397cbfe8e0
--- /dev/null
+++ b/TAO/orbsvcs/orbsvcs/PortableGroup/PG_Object_Group_Manipulator.h
@@ -0,0 +1,123 @@
+// -*- C++ -*-
+
+//=============================================================================
+/**
+ * @file PG_Object_Group_Manipulator.h
+ *
+ * $Id$
+ *
+ * @author Dale Wilson <wilson_d@ociweb.com>
+ */
+//=============================================================================
+
+
+#ifndef TAO_PG_OBJECT_GROUP_MANIPULATOR_H
+#define TAO_PG_OBJECT_GROUP_MANIPULATOR_H
+
+#include /**/ "ace/pre.h"
+
+#include "orbsvcs/PortableGroup/portablegroup_export.h"
+
+#if !defined (ACE_LACKS_PRAGMA_ONCE)
+#pragma once
+#endif /* ACE_LACKS_PRAGMA_ONCE */
+
+#include "orbsvcs/PortableGroupS.h"
+
+#include "tao/IORManipulation/IORManip_Loader.h"
+
+TAO_BEGIN_VERSIONED_NAMESPACE_DECL
+
+namespace TAO
+{
+
+ /**
+ * @class TAO::PG_Object_Group_Manipulator
+ *
+ * @brief PortableGroup::ObjectGroupManager implementation.
+ *
+ * The ObjectGroupManager provides the interface necessary to
+ * facilitate application-controlled object group membership.
+ */
+ class TAO_PortableGroup_Export PG_Object_Group_Manipulator
+ {
+ public:
+
+ /// Constructor.
+ PG_Object_Group_Manipulator ();
+
+ /// Destructor.
+ ~PG_Object_Group_Manipulator ();
+
+ /**
+ * Initializes the group creator.
+ */
+ void init (CORBA::ORB_ptr orb,
+ PortableServer::POA_ptr poa
+ ACE_ENV_ARG_DECL);
+
+ /**
+ * Create an empty object group.
+ */
+ PortableGroup::ObjectGroup_ptr create_object_group (
+ const char * type_id,
+ const char * domain_id,
+ PortableGroup::ObjectGroupId & group_id
+ ACE_ENV_ARG_DECL);
+
+ PortableGroup::ObjectGroup_ptr remove_profiles (
+ PortableGroup::ObjectGroup_ptr group,
+ PortableGroup::ObjectGroup_ptr profile
+ ACE_ENV_ARG_DECL) const;
+
+ PortableGroup::ObjectGroup_ptr merge_iors (
+ TAO_IOP::TAO_IOR_Manipulation::IORList & iors
+ ACE_ENV_ARG_DECL) const;
+
+ int set_primary (
+ TAO_IOP::TAO_IOR_Property * prop,
+ PortableGroup::ObjectGroup_ptr reference,
+ CORBA::Object_ptr new_primary
+ ACE_ENV_ARG_DECL) const;
+
+ void dump_membership (const char * label,
+ PortableGroup::ObjectGroup_ptr member) const;
+
+ private:
+
+ /**
+ * Allocate an ogid for a new object group
+ */
+ void allocate_ogid (PortableGroup::ObjectGroupId & ogid);
+
+ /**
+ * convert numeric OGID to Sequence<Octet> oid
+ */
+ PortableServer::ObjectId *
+ convert_ogid_to_oid (PortableGroup::ObjectGroupId ogid) const;
+
+ private:
+
+ /// The orb
+ CORBA::ORB_var orb_;
+
+ /// Reference to the POA that created the object group references.
+ PortableServer::POA_var poa_;
+
+ /// The ORBs IORManipulation object
+ TAO_IOP::TAO_IOR_Manipulation_var iorm_;
+
+ /// Lock used to synchronize access to next_ogid_.
+ TAO_SYNCH_MUTEX lock_ogid_;
+
+ /// Next ogid to be allocated.
+ PortableGroup::ObjectGroupId next_ogid_;
+
+ };
+} //namespace TAO
+
+TAO_END_VERSIONED_NAMESPACE_DECL
+
+#include /**/ "ace/post.h"
+
+#endif /* TAO::PG_OBJECT_GROUP_CREATOR_H */
diff --git a/TAO/orbsvcs/orbsvcs/PortableGroup/PG_Operators.cpp b/TAO/orbsvcs/orbsvcs/PortableGroup/PG_Operators.cpp
new file mode 100644
index 00000000000..9513dc724bb
--- /dev/null
+++ b/TAO/orbsvcs/orbsvcs/PortableGroup/PG_Operators.cpp
@@ -0,0 +1,33 @@
+#include "orbsvcs/PortableGroup/PG_Operators.h"
+#include "ace/OS_NS_string.h"
+
+ACE_RCSID (PortableGroup,
+ PG_Operators,
+ "$Id$")
+
+TAO_BEGIN_VERSIONED_NAMESPACE_DECL
+
+bool
+operator== (const CosNaming::Name & lhs, const CosNaming::Name & rhs)
+{
+ const CORBA::ULong lhs_len = lhs.length ();
+ const CORBA::ULong rhs_len = rhs.length ();
+
+ if (lhs_len != rhs_len)
+ return false;
+
+ for (CORBA::ULong i = 0; i < lhs_len; ++i)
+ if (ACE_OS::strcmp (lhs[i].id.in (), rhs[i].id.in ()) != 0
+ || ACE_OS::strcmp (lhs[i].kind.in (), rhs[i].kind.in ()) != 0)
+ return false;
+
+ return true;
+}
+
+bool
+operator!= (const CosNaming::Name & lhs, const CosNaming::Name & rhs)
+{
+ return !(lhs == rhs);
+}
+
+TAO_END_VERSIONED_NAMESPACE_DECL
diff --git a/TAO/orbsvcs/orbsvcs/PortableGroup/PG_Operators.h b/TAO/orbsvcs/orbsvcs/PortableGroup/PG_Operators.h
new file mode 100644
index 00000000000..6218b5da005
--- /dev/null
+++ b/TAO/orbsvcs/orbsvcs/PortableGroup/PG_Operators.h
@@ -0,0 +1,50 @@
+// -*- C++ -*-
+
+
+//=============================================================================
+/**
+ * @file PG_Operators.h
+ *
+ * $Id$
+ *
+ * @author Ossama Othman <ossama@uci.edu>
+ */
+//=============================================================================
+
+
+#ifndef TAO_PG_OPERATORS_H
+#define TAO_PG_OPERATORS_H
+
+#include /**/ "ace/pre.h"
+
+#include "orbsvcs/PortableGroup/portablegroup_export.h"
+
+#if !defined (ACE_LACKS_PRAGMA_ONCE)
+#pragma once
+#endif /* ACE_LACKS_PRAGMA_ONCE */
+
+#include "orbsvcs/CosNamingC.h"
+
+TAO_BEGIN_VERSIONED_NAMESPACE_DECL
+
+/// Global CosNaming::Name equality operator.
+/**
+ * Used for checking equality of PortableGroup::Location and
+ * PortableGroup::Property variables.
+ */
+bool TAO_PortableGroup_Export operator== (const CosNaming::Name & lhs,
+ const CosNaming::Name & rhs);
+
+/// Global CosNaming::Name inequality operator.
+/**
+ * This simple implementation simply negates the result of the
+ * equality operator.
+ */
+bool TAO_PortableGroup_Export operator!= (const CosNaming::Name & lhs,
+ const CosNaming::Name & rhs);
+
+TAO_END_VERSIONED_NAMESPACE_DECL
+
+#include /**/ "ace/post.h"
+
+#endif /* TAO_PG_OPERATORS_H */
diff --git a/TAO/orbsvcs/orbsvcs/PortableGroup/PG_Properties_Encoder.cpp b/TAO/orbsvcs/orbsvcs/PortableGroup/PG_Properties_Encoder.cpp
new file mode 100644
index 00000000000..de1fa1c7223
--- /dev/null
+++ b/TAO/orbsvcs/orbsvcs/PortableGroup/PG_Properties_Encoder.cpp
@@ -0,0 +1,67 @@
+//=============================================================================
+/**
+ * @file PG_Properties_Encoder.cpp
+ *
+ * $Id$
+ *
+ * This file implements classes to help manage the Properties
+ * defined in the Portable Object Group.
+ *
+ * @author Dale Wilson <wilson_d@ociweb.com>
+ */
+//=============================================================================
+#include "orbsvcs/PortableGroup/PG_Properties_Encoder.h"
+
+
+#if ! defined (__ACE_INLINE__)
+#include "orbsvcs/PortableGroup/PG_Properties_Encoder.inl"
+#endif /* ! __ACE_INLINE__ */
+
+TAO_BEGIN_VERSIONED_NAMESPACE_DECL
+
+//////////
+// Properties_Encoder
+TAO_PG::Properties_Encoder::Properties_Encoder ()
+{
+}
+
+TAO_PG::Properties_Encoder::~Properties_Encoder ()
+{
+}
+
+
+void TAO_PG::Properties_Encoder::add (
+ const char * name,
+ const PortableGroup::Value & value)
+{
+ NamedValue nv(name, value);
+ values_.push_back(nv);
+}
+
+void TAO_PG::Properties_Encoder::encode (
+ PortableGroup::Properties * property_set) const
+{
+ ACE_ASSERT (property_set != 0);
+ size_t count = values_.size();
+ property_set->length(count);
+ for( size_t nItem = 0; nItem < count; ++nItem )
+ {
+ const NamedValue & nv = values_[nItem];
+ PortableGroup::Property & property = (*property_set)[nItem];
+ PortableGroup::Name & nsName = property.nam;
+ PortableGroup::Value & anyValue = property.val;
+ // assign the value
+ anyValue = (nv.value_);
+
+ // assign the name
+ // @@: This restricts the name to a single level with no "kind"
+ // @@: remove this restriction (?)
+ nsName.length(1);
+ CosNaming::NameComponent & nc = nsName[0];
+
+ nc.id = CORBA::string_dup (nv.name_.c_str());
+ // nc.kind defaults to empty. Leave it that way (for now)
+ }
+}
+
+TAO_END_VERSIONED_NAMESPACE_DECL
diff --git a/TAO/orbsvcs/orbsvcs/PortableGroup/PG_Properties_Encoder.h b/TAO/orbsvcs/orbsvcs/PortableGroup/PG_Properties_Encoder.h
new file mode 100644
index 00000000000..d1780105873
--- /dev/null
+++ b/TAO/orbsvcs/orbsvcs/PortableGroup/PG_Properties_Encoder.h
@@ -0,0 +1,101 @@
+// -*- C++ -*-
+
+//=============================================================================
+/**
+ * @file PG_Properties_Encoder.h
+ *
+ * $Id$
+ *
+ * This file declares a class to help manage PortableGroup::Properties
+ *
+ * @author Dale Wilson <wilson_d@ociweb.com>
+ */
+//=============================================================================
+#ifndef TAO_PG_PROPERTIES_ENCODER_H
+#define TAO_PG_PROPERTIES_ENCODER_H
+
+#include /**/ "ace/pre.h"
+#include <ace/config-all.h>
+#if !defined (ACE_LACKS_PRAGMA_ONCE)
+#pragma once
+#endif /* ACE_LACKS_PRAGMA_ONCE */
+
+#include "orbsvcs/PortableGroupS.h"
+#include "orbsvcs/CosNamingC.h"
+#include "orbsvcs/PortableGroup/portablegroup_export.h"
+
+#include "ace/Vector_T.h"
+#include "ace/SString.h"
+
+TAO_BEGIN_VERSIONED_NAMESPACE_DECL
+
+namespace TAO_PG
+{
+ /**
+ * A helper to assemble a set of properties into a PortableGroup::Properties structure.
+ *
+ * To use a Properties_Encoder:
+ * Create it.
+ * Add properties to it using the add method.
+ * Allocate a new PortableGroup::Properties.
+ * Use the encode method to transfer the properties into the
+ * PortableGroup::Properties.
+ */
+ class TAO_PortableGroup_Export Properties_Encoder
+ {
+ // Originally NamedValue was an ACE_Pair, but ACE_Pair allows operator ==
+ // (delegating to the member's operators ==.) Since CORBA::Any does
+ // not support operator ==, this confused gcc version 2.9-gnupro-98r2
+ // on LynxOS pfadev04 3.0.1 110298-G PowerPC
+ struct NamedValue
+ {
+ public:
+ ACE_CString name_;
+ PortableGroup::Value value_;
+ NamedValue ();
+ NamedValue (const ACE_CString & name, const PortableGroup::Value & value);
+ NamedValue (const NamedValue & rhs);
+ NamedValue & operator = (const NamedValue & rhs);
+ /// Meaningless method to keep ACE_Vector happy
+ bool operator == (const NamedValue &rhs) const;
+ /// Meaningless method to keep ACE_Vector happy
+ bool operator != (const NamedValue &rhs) const;
+ };
+ typedef ACE_Vector< NamedValue, 10 > NamedValueVec;
+
+ public:
+ /**
+ * Construct an empty set of properties.
+ */
+ Properties_Encoder ();
+
+ /// standard destructor
+ ~Properties_Encoder ();
+
+ /**
+ * add a name/value property to the Properties_Encoder.
+ */
+ void add (const char * name, const PortableGroup::Value & value);
+
+ /**
+ * Encode all properties in this Properties_Encoder into a PortableGroup::Properties.
+ *
+ */
+ void encode (PortableGroup::Properties * property_set) const;
+
+ private:
+ Properties_Encoder (const Properties_Encoder & rhs);
+ Properties_Encoder & operator = (const Properties_Encoder & rhs);
+ private:
+ NamedValueVec values_;
+ };
+
+} //namespace TAO_PG
+
+TAO_END_VERSIONED_NAMESPACE_DECL
+
+#if defined (__ACE_INLINE__)
+#include "orbsvcs/PortableGroup/PG_Properties_Encoder.inl"
+#endif /* __ACE_INLINE__ */
+#include /**/ "ace/post.h"
+#endif // TAO_PG_PROPERTIES_ENCODER_H
diff --git a/TAO/orbsvcs/orbsvcs/PortableGroup/PG_Properties_Encoder.inl b/TAO/orbsvcs/orbsvcs/PortableGroup/PG_Properties_Encoder.inl
new file mode 100644
index 00000000000..aa64246f6a5
--- /dev/null
+++ b/TAO/orbsvcs/orbsvcs/PortableGroup/PG_Properties_Encoder.inl
@@ -0,0 +1,64 @@
+// -*- C++ -*-
+
+//=============================================================================
+/**
+ * @file PG_Properties_Encoder.inl
+ *
+ * $Id$
+ *
+ * @author Dale Wilson <wilson_d@ociweb.com>
+ */
+//=============================================================================
+
+TAO_BEGIN_VERSIONED_NAMESPACE_DECL
+
+namespace TAO_PG
+{
+ ACE_INLINE
+ Properties_Encoder::NamedValue::NamedValue ()
+ {
+ }
+
+ ACE_INLINE
+ Properties_Encoder::NamedValue::NamedValue (const ACE_CString & name, const PortableGroup::Value & value)
+ : name_ (name)
+ , value_ (value)
+ {
+ }
+
+ ACE_INLINE
+ Properties_Encoder::NamedValue::NamedValue (const Properties_Encoder::NamedValue & rhs)
+ : name_ (rhs.name_)
+ , value_ (rhs.value_)
+ {
+ }
+
+ ACE_INLINE
+ Properties_Encoder::NamedValue &
+ Properties_Encoder::NamedValue::operator = (const Properties_Encoder::NamedValue & rhs)
+ {
+ if (this != &rhs)
+ {
+ this->name_ = rhs.name_;
+ this->value_ = rhs.value_;
+ }
+ return *this;
+ }
+
+ ACE_INLINE
+ bool
+ Properties_Encoder::NamedValue::operator == (const Properties_Encoder::NamedValue &rhs) const
+ {
+ return this->name_ == rhs.name_;
+ }
+
+ ACE_INLINE
+ bool
+ Properties_Encoder::NamedValue::operator != (const Properties_Encoder::NamedValue &rhs) const
+ {
+ return this->name_ != rhs.name_;
+ }
+
+} //namespace TAO_PG
+
+TAO_END_VERSIONED_NAMESPACE_DECL
diff --git a/TAO/orbsvcs/orbsvcs/PortableGroup/PG_Properties_Support.cpp b/TAO/orbsvcs/orbsvcs/PortableGroup/PG_Properties_Support.cpp
new file mode 100644
index 00000000000..cc8d023d899
--- /dev/null
+++ b/TAO/orbsvcs/orbsvcs/PortableGroup/PG_Properties_Support.cpp
@@ -0,0 +1,151 @@
+// -*- C++ -*-
+
+//=============================================================================
+/**
+ * @file PG_Properties_Support.cpp
+ *
+ * $Id$
+ *
+ * This file implements classes to help manage PortableGroup::Properties
+ *
+ * @author Dale Wilson <wilson_d@ociweb.com>
+ */
+//=============================================================================
+
+#include "orbsvcs/PortableGroup/PG_Properties_Support.h"
+
+TAO_BEGIN_VERSIONED_NAMESPACE_DECL
+
+TAO::PG_Properties_Support::PG_Properties_Support ()
+{
+}
+
+TAO::PG_Properties_Support::~PG_Properties_Support ()
+{
+
+}
+
+void TAO::PG_Properties_Support::set_default_property (const char * name,
+ const PortableGroup::Value & value
+ ACE_ENV_ARG_DECL)
+ ACE_THROW_SPEC ((CORBA::SystemException))
+{
+ this->default_properties_.set_property(name, value ACE_ENV_ARG_PARAMETER);
+}
+
+void TAO::PG_Properties_Support::set_default_properties (const PortableGroup::Properties & props
+ ACE_ENV_ARG_DECL)
+ ACE_THROW_SPEC ((CORBA::SystemException))
+{
+ this->default_properties_.decode (props ACE_ENV_ARG_PARAMETER);
+}
+
+PortableGroup::Properties *
+TAO::PG_Properties_Support::get_default_properties (
+ ACE_ENV_SINGLE_ARG_DECL)
+ ACE_THROW_SPEC ((
+ CORBA::SystemException,
+ PortableGroup::InvalidProperty,
+ PortableGroup::UnsupportedProperty))
+{
+ PortableGroup::Properties_var result;
+ ACE_NEW_THROW_EX ( result, PortableGroup::Properties(), CORBA::NO_MEMORY());
+ ACE_CHECK_RETURN (0);
+ this->default_properties_.export_properties (*result);
+ return result._retn ();
+}
+
+void TAO::PG_Properties_Support::remove_default_properties (
+ const PortableGroup::Properties & props
+ ACE_ENV_ARG_DECL_NOT_USED)
+ ACE_THROW_SPEC ((CORBA::SystemException))
+{
+ this->default_properties_.remove (props);
+}
+
+void
+TAO::PG_Properties_Support::set_type_properties (
+ const char *type_id,
+ const PortableGroup::Properties & overrides
+ ACE_ENV_ARG_DECL)
+ ACE_THROW_SPEC ( (CORBA::SystemException,
+ PortableGroup::InvalidProperty,
+ PortableGroup::UnsupportedProperty))
+{
+ ACE_GUARD (TAO_SYNCH_MUTEX, guard, this->internals_);
+
+ TAO::PG_Property_Set * typeid_properties;
+ if ( 0 != this->properties_map_.find (type_id, typeid_properties))
+ {
+ ACE_NEW_THROW_EX (
+ typeid_properties,
+ TAO::PG_Property_Set (overrides, & this->default_properties_),
+ CORBA::NO_MEMORY());
+ this->properties_map_.bind (type_id, typeid_properties);
+ }
+ typeid_properties->clear ();
+ typeid_properties->decode (overrides ACE_ENV_ARG_PARAMETER);
+}
+
+PortableGroup::Properties *
+TAO::PG_Properties_Support::get_type_properties (
+ const char *type_id
+ ACE_ENV_ARG_DECL)
+ ACE_THROW_SPEC ( (CORBA::SystemException))
+{
+ PortableGroup::Properties_var result;
+ ACE_NEW_THROW_EX (result, PortableGroup::Properties(), CORBA::NO_MEMORY ());
+
+ ACE_GUARD_RETURN (TAO_SYNCH_MUTEX, guard, this->internals_, 0);
+
+ TAO::PG_Property_Set * typeid_properties = 0;
+ if ( 0 != this->properties_map_.find (type_id, typeid_properties))
+ {
+ typeid_properties->export_properties (*result);
+ }
+ return result._retn ();
+}
+
+void
+TAO::PG_Properties_Support::remove_type_properties (
+ const char *type_id,
+ const PortableGroup::Properties & props
+ ACE_ENV_ARG_DECL_NOT_USED)
+ ACE_THROW_SPEC ( (CORBA::SystemException))
+{
+ // NOTE: do not actually delete the properties for this type.
+ // There may be object groups depending on these.
+ // Reference counted pointers could be used to allow property sets
+ // for unused typeids to be deleted.
+
+ ACE_GUARD (TAO_SYNCH_MUTEX, guard, this->internals_);
+
+ TAO::PG_Property_Set * typeid_properties = 0;
+ if ( 0 != this->properties_map_.find (type_id, typeid_properties))
+ {
+ typeid_properties->remove (props);
+ }
+}
+
+
+TAO::PG_Property_Set *
+TAO::PG_Properties_Support::find_typeid_properties (
+ const char *type_id
+ ACE_ENV_ARG_DECL)
+ ACE_THROW_SPEC ((CORBA::SystemException))
+{
+ ACE_GUARD_RETURN (TAO_SYNCH_MUTEX, guard, this->internals_, 0);
+
+ TAO::PG_Property_Set * typeid_properties = 0;
+ if ( 0 != this->properties_map_.find (type_id, typeid_properties))
+ {
+ ACE_NEW_THROW_EX (
+ typeid_properties,
+ TAO::PG_Property_Set (& this->default_properties_),
+ CORBA::NO_MEMORY());
+ this->properties_map_.bind (type_id, typeid_properties);
+ }
+ return typeid_properties;
+}
+
+TAO_END_VERSIONED_NAMESPACE_DECL
diff --git a/TAO/orbsvcs/orbsvcs/PortableGroup/PG_Properties_Support.h b/TAO/orbsvcs/orbsvcs/PortableGroup/PG_Properties_Support.h
new file mode 100644
index 00000000000..50e2f504ffd
--- /dev/null
+++ b/TAO/orbsvcs/orbsvcs/PortableGroup/PG_Properties_Support.h
@@ -0,0 +1,214 @@
+// -*- C++ -*-
+
+//=============================================================================
+/**
+ * @file PG_Properties_Support.h
+ *
+ * $Id$
+ *
+ * This file declares classes to help manage the PortableGroup::Properties
+ * It serves roughly the same purpose as PG_PropertiesManager, but takes a
+ * different approach that suits the needs of FT CORBA.
+ * It would be possible to replace PG_PropertiesManager, or implement it in
+ * terms of PG_Properties_Support at some time in the future.
+ *
+ * @author Dale Wilson <wilson_d@ociweb.com>
+ */
+//=============================================================================
+#ifndef TAO_PG_PROPERTIES_SUPPORT_H
+#define TAO_PG_PROPERTIES_SUPPORT_H
+
+#include "orbsvcs/PortableGroup/PG_Property_Set.h"
+#include "orbsvcs/PortableGroup/portablegroup_export.h"
+
+TAO_BEGIN_VERSIONED_NAMESPACE_DECL
+
+namespace TAO
+{
+ /**
+ * This Properties Support object manages Property Sets (TAO::PG_Property_Set).
+ *
+ * One set, default_properties_,
+ * acts as a "global" default set of properties.
+ *
+ * The collection, properties_map_, contains a set of properties for each
+ * PortableGroup::type_id. The default set acts as a "parent" for each of
+ * these type_id sets.
+ *
+ * Expected use: When an object group is created that implements the interface
+ * identified by type_id, the corresponding typed_id propery set acts as a
+ * parent to the Property set contained in the PG_Object_Group.
+ *
+ * This heirarchy of property sets provides the correct property behavior. A
+ * request for a propery to an ObjectGroup will be satisfied from:
+ * by the object group group property set, or
+ * the typed_id property set, or
+ * the default property set, or
+ * the request will fail..
+ *
+ * Note that changes to type_id or default properties will be visible
+ * immediately at the ObjectGroup level.
+ */
+
+ class TAO_PortableGroup_Export PG_Properties_Support
+ {
+ typedef ACE_Hash_Map_Manager<
+ ACE_CString,
+ ::TAO::PG_Property_Set *,
+ TAO_SYNCH_MUTEX> Properties_Map;
+ typedef ACE_Hash_Map_Iterator<
+ ACE_CString,
+ ::TAO::PG_Property_Set *,
+ TAO_SYNCH_MUTEX> Properties_Map_Iterator;
+
+ public:
+ PG_Properties_Support ();
+ ~PG_Properties_Support ();
+
+ /**
+ * Set a single default property.
+ * Overwriting any value previously set for that property.
+ * Leaving all other properties untouched.
+ * @param name the name of the property to set
+ * @value an Any containing the value.
+ */
+ void set_default_property (const char * name,
+ const PortableGroup::Value & value
+ ACE_ENV_ARG_DECL)
+ ACE_THROW_SPEC ((CORBA::SystemException));
+
+ /**
+ * Update the default property set.
+ *
+ * Properties that appear in props are replaced in or added to the default
+ * property set. Properties that do not appear in props are unchanged.
+ *
+ * @param props the set of properties to update the defaults.
+ */
+ void set_default_properties (const PortableGroup::Properties & props
+ ACE_ENV_ARG_DECL)
+ ACE_THROW_SPEC ((CORBA::SystemException));
+
+ /**
+ * Export the default properties in PortableGroup::Properties format.
+ *
+ * This produces the properties in a format suitable for use across
+ * a CORBA interface.
+ * The caller owns the resulting Properties and must release it to avoid
+ * resource leaks.
+ * @returns a newly allocated PortableGroup::Properties.
+ */
+ PortableGroup::Properties * get_default_properties (ACE_ENV_SINGLE_ARG_DECL)
+ ACE_THROW_SPEC ( (CORBA::SystemException,
+ PortableGroup::InvalidProperty,
+ PortableGroup::UnsupportedProperty));
+
+ /**
+ * Undefine default properties that appear in props.
+ *
+ * Properties that are defined in props are removed from the default
+ * property set. Removal is done by name. The property values do not
+ * have to match. There is no penalty for attempting to remove a property
+ * that does not exist.
+ * @param props a set of propertys to be removed by name.
+ */
+ void remove_default_properties (
+ const PortableGroup::Properties & props
+ ACE_ENV_ARG_DECL)
+ ACE_THROW_SPEC ((CORBA::SystemException));
+
+ /**
+ * Override or define properties associated with a type_id.
+ *
+ * If a property set does not exist for type_id, a new one will be created.
+ * Any property included in overrides will be set or replaced in the type_id
+ * property set. Any property not in overrides will be unchanged.
+ *
+ * Contrary to the "throws" specification, this method does not attempt
+ * to validate the properties because doing so would unnecessarily constrain
+ * the uses to which this class could be put (although one could strategize the
+ * validation.)
+ */
+ void set_type_properties (
+ const char *type_id,
+ const PortableGroup::Properties & overrides
+ ACE_ENV_ARG_DECL)
+ ACE_THROW_SPEC ((
+ CORBA::SystemException,
+ PortableGroup::InvalidProperty,
+ PortableGroup::UnsupportedProperty));
+
+ /**
+ * Export the property set in a PortableGroup::Properties format.
+ *
+ * This produces the properties associated with a type_id -- including
+ * any default properties that have not been overridden at the type_id level
+ * in a format suitable for use across a CORBA interface.
+ *
+ * The caller owns the resulting Properties and must release it to avoid
+ * resource leaks.
+ *
+ * Compare this method to find_typeid_properties which returns a pointer
+ * to the internal representation of the properties in TAO::PG_Property_Set
+ * format. This is more efficient, but suitable only for internal use.
+ *
+ * @param type_id identifies the set of properties to be exported.
+ * @returns a newly allocated PortableGroup::Properties that must be released by the caller.
+ */
+ PortableGroup::Properties * get_type_properties (
+ const char *type_id
+ ACE_ENV_ARG_DECL)
+ ACE_THROW_SPEC ( (CORBA::SystemException));
+
+ /**
+ * Export the property set in a PortableGroup::Properties format.
+ *
+ * This method is intended to provide a parent
+ * for the property set in a newly-created Object Group of the given
+ * type_id.
+ *
+ * Callers who intend to send the property set across a CORBA interface
+ * should use the get_type_properties method.
+ *
+ * @param type_id identifies the set of properties to be found.
+ * @returns a pointer to a Property_Set owned by this Properties_Support object.
+ */
+ TAO::PG_Property_Set * find_typeid_properties (
+ const char *type_id
+ ACE_ENV_ARG_DECL)
+ ACE_THROW_SPEC ((CORBA::SystemException));
+
+ /**
+ * Undefine default properties that appear in props.
+ *
+ * Properties that are defined in props are removed from the type_id
+ * property set. Removal is done by name. The property values do not
+ * have to match. There is no penalty for attempting to remove a property
+ * that does not exist.
+ * @param props a set of propertys to be removed by name from the type_id set.
+ */
+ void remove_type_properties (
+ const char *type_id,
+ const PortableGroup::Properties & props
+ ACE_ENV_ARG_DECL)
+ ACE_THROW_SPEC ( (CORBA::SystemException));
+
+ ///////////////
+ // Data Members
+ private:
+ /**
+ * Protect internal state.
+ */
+ TAO_SYNCH_MUTEX internals_;
+
+ /// The default property set.
+ TAO::PG_Property_Set default_properties_;
+
+ /// A collection of property sets indexed by type_id.
+ Properties_Map properties_map_;
+ };
+} //namespace TAO_PG
+
+TAO_END_VERSIONED_NAMESPACE_DECL
+
+#endif // TAO_PG_PROPERTIES_SUPPORT_H
diff --git a/TAO/orbsvcs/orbsvcs/PortableGroup/PG_PropertyManager.cpp b/TAO/orbsvcs/orbsvcs/PortableGroup/PG_PropertyManager.cpp
new file mode 100644
index 00000000000..f6d9fb2a13c
--- /dev/null
+++ b/TAO/orbsvcs/orbsvcs/PortableGroup/PG_PropertyManager.cpp
@@ -0,0 +1,368 @@
+// -*- C++ -*-
+
+#include "orbsvcs/PortableGroup/PG_PropertyManager.h"
+#include "orbsvcs/PortableGroup/PG_ObjectGroupManager.h"
+#include "orbsvcs/PortableGroup/PG_Property_Utils.h"
+
+#include "tao/ORB_Constants.h"
+
+#include "ace/SString.h"
+
+ACE_RCSID (PortableGroup,
+ PG_PropertyManager,
+ "$Id$")
+
+TAO_BEGIN_VERSIONED_NAMESPACE_DECL
+
+TAO_PG_PropertyManager::TAO_PG_PropertyManager (
+ TAO_PG_ObjectGroupManager & object_group_manager)
+ : object_group_manager_ (object_group_manager),
+ default_properties_ (),
+ type_properties_ (),
+ lock_ (),
+ property_validator_ ()
+{
+}
+
+
+void
+TAO_PG_PropertyManager::set_default_properties (
+ const PortableGroup::Properties & props
+ ACE_ENV_ARG_DECL)
+ ACE_THROW_SPEC ((CORBA::SystemException,
+ PortableGroup::InvalidProperty,
+ PortableGroup::UnsupportedProperty))
+{
+ // First verify that the "Factories" property is not in the
+ // Properties sequence. According to the spec, it is not allowed to
+ // be set as part of the default properties.
+ PortableGroup::Name factories;
+ factories.length (1);
+ factories[0].id = CORBA::string_dup ("org.omg.PortableGroup.Factories");
+
+ CORBA::ULong len = props.length ();
+ for (CORBA::ULong i = 0; i < len; ++i)
+ {
+ PortableGroup::Property property = props[i];
+
+ if (property.nam == factories)
+ ACE_THROW (PortableGroup::InvalidProperty (property.nam,
+ property.val));
+ }
+
+ this->property_validator_.validate_property (props
+ ACE_ENV_ARG_PARAMETER);
+ ACE_CHECK;
+
+ ACE_GUARD (TAO_SYNCH_MUTEX, guard, this->lock_);
+
+ this->default_properties_ = props;
+}
+
+
+PortableGroup::Properties *
+TAO_PG_PropertyManager::get_default_properties (
+ ACE_ENV_SINGLE_ARG_DECL)
+ ACE_THROW_SPEC ((CORBA::SystemException))
+{
+ ACE_GUARD_RETURN (TAO_SYNCH_MUTEX, guard, this->lock_, 0);
+
+ PortableGroup::Properties * props = 0;
+ ACE_NEW_THROW_EX (props,
+ PortableGroup::Properties (this->default_properties_),
+ CORBA::NO_MEMORY (
+ CORBA::SystemException::_tao_minor_code (
+ TAO::VMCID,
+ ENOMEM),
+ CORBA::COMPLETED_NO));
+ ACE_CHECK_RETURN (0);
+
+ return props;
+}
+
+
+void
+TAO_PG_PropertyManager::remove_default_properties (
+ const PortableGroup::Properties &props
+ ACE_ENV_ARG_DECL)
+ ACE_THROW_SPEC ((CORBA::SystemException,
+ PortableGroup::InvalidProperty,
+ PortableGroup::UnsupportedProperty))
+{
+ if (props.length () == 0)
+ return; // @@ Throw CORBA::BAD_PARAM instead?
+
+ ACE_GUARD (TAO_SYNCH_MUTEX, guard, this->lock_);
+
+ this->remove_properties (props,
+ this->default_properties_
+ ACE_ENV_ARG_PARAMETER);
+ ACE_CHECK;
+}
+
+
+void
+TAO_PG_PropertyManager::set_type_properties (
+ const char * type_id,
+ const PortableGroup::Properties & overrides
+ ACE_ENV_ARG_DECL)
+ ACE_THROW_SPEC ((CORBA::SystemException,
+ PortableGroup::InvalidProperty,
+ PortableGroup::UnsupportedProperty))
+{
+ this->property_validator_.validate_property (overrides
+ ACE_ENV_ARG_PARAMETER);
+ ACE_CHECK;
+
+ CORBA::ULong num_overrides = overrides.length ();
+
+ if (num_overrides == 0)
+ return; // Throw CORBA::BAD_PARAM exception instead?
+
+ ACE_GUARD (TAO_SYNCH_MUTEX, guard, this->lock_);
+
+ Type_Prop_Table::ENTRY * entry = 0;
+ if (this->type_properties_.find (type_id, entry) != 0)
+ ACE_THROW (CORBA::BAD_PARAM ());
+
+ PortableGroup::Properties & props = entry->int_id_;
+ props = overrides;
+}
+
+
+PortableGroup::Properties *
+TAO_PG_PropertyManager::get_type_properties (
+ const char * type_id
+ ACE_ENV_ARG_DECL)
+ ACE_THROW_SPEC ((CORBA::SystemException))
+{
+ ACE_GUARD_RETURN (TAO_SYNCH_MUTEX, guard, this->lock_, 0);
+
+
+ Type_Prop_Table::ENTRY * entry = 0;
+ PortableGroup::Properties * type_properties = 0;
+
+ if (this->type_properties_.find (type_id, entry) == 0)
+ type_properties = &entry->int_id_;
+
+ const CORBA::ULong def_props_len = this->default_properties_.length ();
+ const CORBA::ULong type_props_len =
+ (type_properties == 0 ? 0 : type_properties->length ());
+ const CORBA::ULong props_len =
+ (def_props_len > type_props_len ? def_props_len : type_props_len);
+
+ PortableGroup::Properties * tmp_properties = 0;
+ ACE_NEW_THROW_EX (tmp_properties,
+ PortableGroup::Properties (props_len),
+ CORBA::NO_MEMORY (
+ CORBA::SystemException::_tao_minor_code (
+ TAO::VMCID,
+ ENOMEM),
+ CORBA::COMPLETED_NO));
+ ACE_CHECK_RETURN (0);
+
+ PortableGroup::Properties_var properties = tmp_properties;
+
+ // Set the length to the length of the largest of the two property
+ // sequences. The idea is to keep the cost of the incremental
+ // growth that may occur in TAO_PG::override_properties() to a
+ // minimum.
+ properties->length (props_len);
+
+ *tmp_properties = this->default_properties_;
+
+ if (type_properties != 0 && type_props_len > 0)
+ TAO_PG::override_properties (*type_properties, *tmp_properties);
+
+ return properties._retn ();
+}
+
+
+void
+TAO_PG_PropertyManager::remove_type_properties (
+ const char * type_id,
+ const PortableGroup::Properties & props
+ ACE_ENV_ARG_DECL)
+ ACE_THROW_SPEC ((CORBA::SystemException,
+ PortableGroup::InvalidProperty,
+ PortableGroup::UnsupportedProperty))
+{
+ if (props.length () == 0)
+ return; // @@ Throw CORBA::BAD_PARAM instead?
+
+ ACE_GUARD (TAO_SYNCH_MUTEX, guard, this->lock_);
+
+ Type_Prop_Table::ENTRY * entry = 0;
+ if (this->type_properties_.find (type_id, entry) != 0)
+ ACE_THROW (CORBA::BAD_PARAM ());
+
+ PortableGroup::Properties & type_properties = entry->int_id_;
+
+ this->remove_properties (props,
+ type_properties
+ ACE_ENV_ARG_PARAMETER);
+ ACE_CHECK;
+}
+
+
+void
+TAO_PG_PropertyManager::set_properties_dynamically (
+ PortableGroup::ObjectGroup_ptr /* object_group */,
+ const PortableGroup::Properties & /* overrides */
+ ACE_ENV_ARG_DECL)
+ ACE_THROW_SPEC ((CORBA::SystemException,
+ PortableGroup::ObjectGroupNotFound,
+ PortableGroup::InvalidProperty,
+ PortableGroup::UnsupportedProperty))
+{
+#if 0
+ // First verify that the "InitialNumberMembers" property is not in
+ // the Properties sequence. According to the spec, it is not
+ // allowed to be set as part of the default properties.
+ PortableGroup::Name factories;
+ factories.length (1);
+ factories[0].id =
+ CORBA::string_dup ("org.omg.PortableGroup.InitialNumberMembers");
+
+ CORBA::ULong len = props.length ();
+ for (CORBA::ULong i = 0; i < len; ++i)
+ {
+ PortableGroup::Property property = props[i];
+
+ if (property.nam == factories)
+ ACE_THROW (PortableGroup::InvalidProperty (property.nam,
+ property.val));
+ }
+
+ this->property_validator_.validate_property (overrides
+ ACE_ENV_ARG_PARAMETER);
+ ACE_CHECK;
+
+ // @todo Set the properties in the object group map entry.
+#endif /* 0 */
+
+ ACE_THROW (CORBA::NO_IMPLEMENT ());
+}
+
+
+PortableGroup::Properties *
+TAO_PG_PropertyManager::get_properties (
+ PortableGroup::ObjectGroup_ptr object_group
+ ACE_ENV_ARG_DECL)
+ ACE_THROW_SPEC ((CORBA::SystemException,
+ PortableGroup::ObjectGroupNotFound))
+{
+ CORBA::ULong properties_len = 0;
+
+ ACE_GUARD_RETURN (TAO_SYNCH_MUTEX, property_map_guard, this->lock_, 0);
+
+ // @@ Race condition here!
+ PortableGroup::Properties_var dynamic_properties =
+ this->object_group_manager_.get_properties (object_group
+ ACE_ENV_ARG_PARAMETER);
+ ACE_CHECK_RETURN (0);
+
+ CORBA::ULong dyn_props_len = dynamic_properties->length ();
+ if (dyn_props_len > properties_len)
+ properties_len = dyn_props_len;
+
+ CORBA::String_var type_id =
+ this->object_group_manager_.type_id (object_group
+ ACE_ENV_ARG_PARAMETER);
+ ACE_CHECK_RETURN (0);
+
+ CORBA::ULong type_props_len = 0;
+ PortableGroup::Properties * type_properties = 0;
+ Type_Prop_Table::ENTRY * type_entry = 0;
+ if (this->type_properties_.find (type_id.in (), type_entry) == 0)
+ {
+ type_properties = &type_entry->int_id_;
+ type_props_len = type_properties->length ();
+
+ if (type_props_len > properties_len)
+ properties_len = type_props_len;
+ }
+
+ CORBA::ULong def_props_len = this->default_properties_.length ();
+ if (def_props_len > properties_len)
+ properties_len = def_props_len;
+
+ PortableGroup::Properties * tmp_properties = 0;
+ ACE_NEW_THROW_EX (tmp_properties,
+ PortableGroup::Properties (properties_len),
+ CORBA::NO_MEMORY (
+ CORBA::SystemException::_tao_minor_code (
+ TAO::VMCID,
+ ENOMEM),
+ CORBA::COMPLETED_NO));
+ ACE_CHECK_RETURN (0);
+
+ PortableGroup::Properties_var properties = tmp_properties;
+
+ // Set the length to the length of the largest of the three property
+ // sequences. The idea is to keep the cost of the incremental
+ // growth that may occur in TAO_PG::override_properties() to a
+ // minimum.
+ properties->length (properties_len);
+
+ // Start out with a copy of the default properties.
+ *tmp_properties = this->default_properties_;
+
+ // Override default properties with type-specific properties.
+ if (type_properties != 0)
+ TAO_PG::override_properties (*type_properties, *tmp_properties);
+
+ // Now override with the dynamic (object group) properties.
+ TAO_PG::override_properties (dynamic_properties.in (), *tmp_properties);
+
+ return properties._retn ();
+}
+
+
+void
+TAO_PG_PropertyManager::remove_properties (
+ const PortableGroup::Properties & to_be_removed,
+ PortableGroup::Properties &properties
+ ACE_ENV_ARG_DECL)
+ ACE_THROW_SPEC ((CORBA::SystemException,
+ PortableGroup::InvalidProperty,
+ PortableGroup::UnsupportedProperty))
+{
+ const CORBA::ULong num_removed = to_be_removed.length ();
+ if (num_removed == 0)
+ return; // @@ Throw CORBA::BAD_PARAM instead?
+
+ const CORBA::ULong old_length = properties.length ();
+
+ const CORBA::ULong new_length = old_length - num_removed;
+
+ PortableGroup::Properties new_properties (new_length);
+ new_properties.length (new_length);
+
+ // @@ Slow O(n^2) operation. Switching to a faster container for
+ // the default properties might be a good idea at some point in
+ // the future.
+ CORBA::ULong n = 0;
+ for (CORBA::ULong i = 0; i < num_removed; ++i)
+ {
+ const CORBA::ULong old_n = n;
+ const PortableGroup::Property &remove = to_be_removed[i];
+
+ for (CORBA::ULong j = 0; j < old_length; ++j)
+ if (remove.nam != properties[j].nam)
+ new_properties[n++] = properties[j];
+
+ // The property to be removed doesn't exist in the current list
+ // of default properties.
+ if (n == old_n)
+ ACE_THROW (PortableGroup::InvalidProperty (remove.nam,
+ remove.val));
+ }
+
+ // All properties were successfully removed, and the remaining ones
+ // were placed in the "new_properties" variable. Now copy that
+ // variable.
+ properties = new_properties;
+}
+
+TAO_END_VERSIONED_NAMESPACE_DECL
diff --git a/TAO/orbsvcs/orbsvcs/PortableGroup/PG_PropertyManager.h b/TAO/orbsvcs/orbsvcs/PortableGroup/PG_PropertyManager.h
new file mode 100644
index 00000000000..5d6c40fa063
--- /dev/null
+++ b/TAO/orbsvcs/orbsvcs/PortableGroup/PG_PropertyManager.h
@@ -0,0 +1,192 @@
+// -*- C++ -*-
+
+//=============================================================================
+/**
+ * @file PG_PropertyManager.h
+ *
+ * $Id$
+ *
+ * @author Ossama Othman <ossama@uci.edu>
+ */
+//=============================================================================
+
+#ifndef TAO_PG_PROPERTY_MANAGER_H
+#define TAO_PG_PROPERTY_MANAGER_H
+
+#include /**/ "ace/pre.h"
+
+#include "ace/config-all.h"
+
+#if !defined (ACE_LACKS_PRAGMA_ONCE)
+#pragma once
+#endif /* ACE_LACKS_PRAGMA_ONCE */
+
+#include "orbsvcs/PortableGroup/PG_Default_Property_Validator.h"
+#include "orbsvcs/PortableGroup/portablegroup_export.h"
+#include "orbsvcs/PortableGroupS.h"
+
+#include "ace/SString.h"
+#include "ace/Null_Mutex.h"
+#include "ace/Functor.h"
+#include "ace/Hash_Map_Manager_T.h"
+
+TAO_BEGIN_VERSIONED_NAMESPACE_DECL
+
+/// Forward declarations.
+class TAO_PG_ObjectGroupManager;
+
+/**
+ * @class TAO_PG_PropertyManager
+ *
+ * @brief Class that implements the PortableGroup::PropertyManager
+ * interface.
+ *
+ * Only the default and type-specific properties are housed in this
+ * class. The properties used at creation time of an object group and
+ * those set dynamically after object group creation are stored in the
+ * TAO_PG_ObjectGroup_Map_Entry structure. However, the
+ * PropertyManager is still used to manage those properties.
+ */
+class TAO_PortableGroup_Export TAO_PG_PropertyManager
+ : public virtual POA_PortableGroup::PropertyManager
+{
+public:
+
+ /// Constructor.
+ TAO_PG_PropertyManager (TAO_PG_ObjectGroupManager & object_group_manager);
+
+ /**
+ * @name PortableGroup::PropertyManager methods
+ *
+ * Methods required by the PortableGroup::PropertyManager
+ * interface.
+ */
+ //@{
+
+ /// Set the default properties to be used by all object groups.
+ virtual void set_default_properties (
+ const PortableGroup::Properties & props
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS)
+ ACE_THROW_SPEC ((CORBA::SystemException,
+ PortableGroup::InvalidProperty,
+ PortableGroup::UnsupportedProperty));
+
+ /// Get the default properties used by all object groups.
+ virtual PortableGroup::Properties * get_default_properties (
+ ACE_ENV_SINGLE_ARG_DECL_WITH_DEFAULTS)
+ ACE_THROW_SPEC ((CORBA::SystemException));
+
+ /// Remove default properties.
+ virtual void remove_default_properties (
+ const PortableGroup::Properties & props
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS)
+ ACE_THROW_SPEC ((CORBA::SystemException,
+ PortableGroup::InvalidProperty,
+ PortableGroup::UnsupportedProperty));
+
+ /// Set properties associated with a given Member type. These
+ /// properties override the default properties.
+ virtual void set_type_properties (
+ const char * type_id,
+ const PortableGroup::Properties & overrides
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS)
+ ACE_THROW_SPEC ((CORBA::SystemException,
+ PortableGroup::InvalidProperty,
+ PortableGroup::UnsupportedProperty));
+
+ /**
+ * Return the properties associated with a give Replica type. These
+ * properties include the type-specific properties in use, in
+ * addition to the default properties that were not overridden.
+ */
+ virtual PortableGroup::Properties * get_type_properties (
+ const char * type_id
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS)
+ ACE_THROW_SPEC ((CORBA::SystemException));
+
+ /// Remove the given properties associated with the Replica type ID.
+ virtual void remove_type_properties (
+ const char * type_id,
+ const PortableGroup::Properties & props
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS)
+ ACE_THROW_SPEC ((CORBA::SystemException,
+ PortableGroup::InvalidProperty,
+ PortableGroup::UnsupportedProperty));
+
+ /**
+ * Dynamically set the properties associated with a given object
+ * group as the load balancer and replicas are being executed.
+ * These properties override the type-specific and default
+ * properties.
+ */
+ virtual void set_properties_dynamically (
+ PortableGroup::ObjectGroup_ptr object_group,
+ const PortableGroup::Properties & overrides
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS)
+ ACE_THROW_SPEC ((CORBA::SystemException,
+ PortableGroup::ObjectGroupNotFound,
+ PortableGroup::InvalidProperty,
+ PortableGroup::UnsupportedProperty));
+
+ /**
+ * Return the properties currently in use by the given object
+ * group. These properties include those that were set dynamically,
+ * type-specific properties that weren't overridden, properties that
+ * were used when the replica was created, and default properties
+ * that weren't overridden.
+ */
+ virtual PortableGroup::Properties * get_properties (
+ PortableGroup::ObjectGroup_ptr object_group
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS)
+ ACE_THROW_SPEC ((CORBA::SystemException,
+ PortableGroup::ObjectGroupNotFound));
+
+ //@}
+
+ /// Type-specific property hash map.
+ typedef ACE_Hash_Map_Manager_Ex<
+ ACE_CString,
+ PortableGroup::Properties,
+ ACE_Hash<ACE_CString>,
+ ACE_Equal_To<ACE_CString>,
+ ACE_Null_Mutex> Type_Prop_Table;
+
+private:
+
+ /// Remove properties "to_be_removed" from the given list of
+ /// properties.
+ void remove_properties (const PortableGroup::Properties & to_be_removed,
+ PortableGroup::Properties &properties
+ ACE_ENV_ARG_DECL)
+ ACE_THROW_SPEC ((CORBA::SystemException,
+ PortableGroup::InvalidProperty,
+ PortableGroup::UnsupportedProperty));
+
+private:
+
+ /// Table that maps ObjectId to Object Group related information.
+ TAO_PG_ObjectGroupManager & object_group_manager_;
+
+ /// Default properties.
+ PortableGroup::Properties default_properties_;
+
+ /// Table of type-specific object group properties.
+ Type_Prop_Table type_properties_;
+
+ /// Lock used to synchronize access to the default properties and
+ /// the type-specific properties.
+ TAO_SYNCH_MUTEX lock_;
+
+ /// The property validator.
+ /**
+ * @todo Strategize the validator, or use template policies.
+ */
+ TAO_PG_Default_Property_Validator property_validator_;
+
+};
+
+TAO_END_VERSIONED_NAMESPACE_DECL
+
+#include /**/ "ace/post.h"
+
+#endif /* TAO_PG_PROPERTY_MANAGER_H */
diff --git a/TAO/orbsvcs/orbsvcs/PortableGroup/PG_Property_Set.cpp b/TAO/orbsvcs/orbsvcs/PortableGroup/PG_Property_Set.cpp
new file mode 100644
index 00000000000..e63ff905d9d
--- /dev/null
+++ b/TAO/orbsvcs/orbsvcs/PortableGroup/PG_Property_Set.cpp
@@ -0,0 +1,360 @@
+//=============================================================================
+/**
+ * @file PG_Property_Set.cpp
+ *
+ * $Id$
+ *
+ * This file implements classes to help manage the Properties
+ * defined in the Portable Object Group.
+ *
+ * Note: this started as a simple helper class to make decoding sets of properties
+ * easier, but expanded to provide more general support for managing sets of properties.
+ *
+ * @author Dale Wilson <wilson_d@ociweb.com>
+ */
+//=============================================================================
+#include "orbsvcs/PortableGroup/PG_Property_Set.h"
+#include "tao/debug.h"
+
+TAO_BEGIN_VERSIONED_NAMESPACE_DECL
+
+//////////////////////
+// PG_Property_Set
+
+TAO::PG_Property_Set::PG_Property_Set()
+ : defaults_ (0)
+{
+}
+
+TAO::PG_Property_Set::PG_Property_Set (
+ const PortableGroup::Properties & property_set
+ ACE_ENV_ARG_DECL)
+ ACE_THROW_SPEC ((CORBA::SystemException))
+ : defaults_ (0)
+{
+ this->decode (property_set ACE_ENV_ARG_PARAMETER);
+}
+
+TAO::PG_Property_Set::PG_Property_Set (
+ const PortableGroup::Properties & property_set,
+ PG_Property_Set * defaults
+ ACE_ENV_ARG_DECL)
+ ACE_THROW_SPEC ((CORBA::SystemException))
+ : defaults_ (defaults)
+{
+ this->decode (property_set ACE_ENV_ARG_PARAMETER);
+}
+
+
+TAO::PG_Property_Set::PG_Property_Set (
+ PG_Property_Set * defaults)
+ : defaults_ (defaults)
+{
+}
+
+TAO::PG_Property_Set::~PG_Property_Set ()
+{
+ this->clear ();
+}
+
+void
+TAO::PG_Property_Set::decode (const PortableGroup::Properties & property_set
+ ACE_ENV_ARG_DECL)
+ ACE_THROW_SPEC ((CORBA::SystemException))
+{
+ ACE_GUARD (TAO_SYNCH_MUTEX, guard, this->internals_);
+
+ size_t count = property_set.length ();
+ for (size_t nItem = 0; nItem < count; ++nItem)
+ {
+ const PortableGroup::Property & property = property_set[nItem];
+ const CosNaming::Name & nsName = property.nam;
+ // note assumption one level name with no kind
+ // @@ TODO: fix this
+ const CosNaming::NameComponent & nc = nsName[0];
+
+ this->set_property (static_cast<const char *> (nc.id),
+ property.val
+ ACE_ENV_ARG_PARAMETER);
+ ACE_CHECK;
+
+#if 0
+ ACE_CString name = static_cast<const char *> (nc.id);
+
+ const PortableGroup::Value * value_copy;
+ ACE_NEW_THROW_EX (value_copy,
+ PortableGroup::Value (property.val),
+ CORBA::NO_MEMORY ());
+ ACE_CHECK;
+
+ const PortableGroup::Value * replaced_value = 0;
+ if (0 == this->values_.rebind (name, value_copy, replaced_value))
+ {
+ if (0 != replaced_value)
+ {
+ delete replaced_value;
+ }
+ }
+ else
+ {
+ if (TAO_debug_level > 3)
+ {
+ ACE_ERROR ( (LM_ERROR,
+ "%n\n%T: Property_set: rebind failed.\n"
+ ));
+ }
+ // @@ should throw something here
+ ACE_THROW (CORBA::NO_MEMORY ());
+ }
+#endif
+ }
+}
+
+void TAO::PG_Property_Set::clear ()
+{
+ ACE_GUARD (TAO_SYNCH_MUTEX, guard, this->internals_);
+ for (ValueMapIterator it = this->values_.begin ();
+ it != this->values_.end ();
+ ++it)
+ {
+ delete (*it).int_id_;
+ }
+ this->values_.unbind_all ();
+}
+
+void TAO::PG_Property_Set::remove (const PortableGroup::Properties & property_set)
+ ACE_THROW_SPEC ((CORBA::SystemException))
+{
+ ACE_GUARD (TAO_SYNCH_MUTEX, guard, this->internals_);
+ size_t count = property_set.length ();
+ for (size_t nItem = 0; nItem < count; ++nItem)
+ {
+ const PortableGroup::Property & property = property_set[nItem];
+ const CosNaming::Name & nsName = property.nam;
+ // note assumption one level name with no kind
+ // @@ TODO: fix this
+ const CosNaming::NameComponent & nc = nsName[0];
+ ACE_CString name = static_cast<const char *> (nc.id);
+
+ const PortableGroup::Value * deleted_value;
+ if ( 0 == this->values_.unbind (name, deleted_value))
+ {
+ delete deleted_value;
+ }
+ else
+ {
+ // don't worry about it.
+ }
+ }
+}
+
+void TAO::PG_Property_Set::set_property (
+ const char * name,
+ const PortableGroup::Value & value
+ ACE_ENV_ARG_DECL)
+{
+ ACE_CString key (name);
+ PortableGroup::Value * value_copy;
+ ACE_NEW_THROW_EX (
+ value_copy, PortableGroup::Value (value),
+ CORBA::NO_MEMORY ());
+ ACE_CHECK;
+
+ const PortableGroup::Value * replaced_value = 0;
+ if (0 == this->values_.rebind (name, value_copy, replaced_value))
+ {
+ if (0 != replaced_value)
+ {
+ delete replaced_value;
+ }
+ }
+ else
+ {
+ if (TAO_debug_level > 3)
+ {
+ ACE_ERROR ( (LM_ERROR,
+ "%n\n%T: Property_set: rebind failed.\n"
+ ));
+ }
+ // @@ should throw something here
+ ACE_THROW (CORBA::NO_MEMORY ());
+ }
+}
+
+
+
+void TAO::PG_Property_Set::export_properties(PortableGroup::Properties & property_set) const
+{
+ ValueMap merged_values;
+ this->merge_properties (merged_values);
+
+ property_set.length (merged_values.current_size ());
+
+ size_t pos = 0;
+ for (ValueMapIterator it = merged_values.begin ();
+ it != merged_values.end ();
+ ++it)
+ {
+ const ACE_CString & name = (*it).ext_id_;
+ const PortableGroup::Value * value = (*it).int_id_;
+
+ PortableGroup::Property & property = property_set[pos];
+ CosNaming::Name & nsName = property.nam;
+ //@@ note assumption: single level name, no kind
+ nsName.length(1);
+ CosNaming::NameComponent & nc = nsName[0];
+ nc.id = CORBA::string_dup (name.c_str ());
+ PortableGroup::Value & val = property.val;
+ val = *value; // NOTE: Any assignment does a deep copy
+ ++pos;
+ }
+ ACE_ASSERT (pos == property_set.length ());
+}
+
+void TAO::PG_Property_Set::merge_properties (ValueMap & merged_values) const
+{
+ ACE_GUARD (TAO_SYNCH_MUTEX, guard, this->internals_);
+ if (0 != this->defaults_)
+ {
+ this->defaults_->merge_properties (merged_values);
+ }
+ // note AFICT ACE_Hash_Map does not support const iterators, hence the const cast.
+ ValueMap & mutable_values = const_cast<ValueMap &> (this->values_);
+ for (ValueMapIterator it = mutable_values.begin ();
+ it != mutable_values.end ();
+ ++it)
+ {
+ merged_values.rebind ( (*it).ext_id_, (*it).int_id_);
+ }
+}
+
+
+
+int TAO::PG_Property_Set::find (
+ const ACE_CString & key,
+ const PortableGroup::Value *& pValue) const
+{
+ ACE_GUARD_RETURN (TAO_SYNCH_MUTEX, guard, this->internals_, 0);
+ int found = (0 == this->values_.find (key, pValue));
+ if (! found)
+ {
+ if (0 != this->defaults_)
+ {
+ found = this->defaults_->find (key, pValue);
+ }
+ }
+ return found;
+}
+
+TAO_END_VERSIONED_NAMESPACE_DECL
+
+//#define PG_PS_UNIT_TEST
+#ifdef PG_PS_UNIT_TEST
+#include "orbsvcs/PortableGroup/PG_Properties_Encoder.h"
+
+TAO_BEGIN_VERSIONED_NAMESPACE_DECL
+
+int TAO_PG::test_encode_decode ()
+{
+ int result = 1;
+ static const long testLong = 123456L;
+ static const char * testLongKey = "MyLong";
+
+ static const char * testString = "Now is the time for all good people.";
+ static const char * testStringKey = "plover";
+
+ static const double testDouble = 3.1415;
+ static const char * testDoubleKey = "pi";
+
+ PortableGroup::Properties_var property_set = new PortableGroup::Properties;
+ //scope encoder to be sure its gone before decoding
+ {
+ TAO_PG::Encoder encoder;
+ PortableGroup::Value value;
+ value <<= (CORBA::Long) testLong;
+ encoder.add (testLongKey, value);
+
+ value <<= testString;
+ encoder.add (testStringKey, value);
+
+ value <<= (CORBA::Double) testDouble;
+ encoder.add (testDoubleKey, value);
+
+ encoder.encode (property_set);
+ }
+
+ TAO::PG_Property_Set decoder (property_set);
+
+ CORBA::Long longResult = 0;
+ if (find (decoder, testLongKey, longResult) )
+ {
+ if (longResult != testLong)
+ {
+ ACE_ERROR ( (LM_ERROR,
+ "%n\n%T: %s = %d expecting %d\n",
+ testLongKey,
+ (int)longResult,
+ (int)testLong
+ ));
+ result = 0;
+ }
+ }
+ else
+ {
+ ACE_ERROR ( (LM_ERROR,
+ "%n\n%T: Can't find value for %s\n", testLongKey
+ ));
+ result = 0;
+ }
+
+ const char * stringResult = "";
+ if (find (decoder, testStringKey, stringResult))
+ {
+ if (0 != ACE_OS::strcmp (testString, stringResult))
+ {
+ ACE_ERROR ( (LM_ERROR,
+ "%n\n%T: %s = \"%s\" expecting \"%s\"\n",
+ testStringKey,
+ (int)stringResult,
+ (int)testString
+ ));
+ result = 0;
+ }
+ }
+ else
+ {
+ ACE_ERROR ( (LM_ERROR,
+ "%n\n%T: Can't find value for %s\n", testStringKey
+ ));
+ result = 0;
+ }
+
+
+ CORBA::Double doubleResult = 0.0;
+ if (find (decoder, testDoubleKey, doubleResult))
+ {
+ if (doubleResult != testDouble)
+ {
+ ACE_ERROR ( (LM_ERROR,
+ "%n\n%T: %s = \"%f\" expecting \"%f\"\n",
+ testDoubleKey,
+ doubleResult,
+ testDouble
+ ));
+ result = 0;
+ }
+ }
+ else
+ {
+ ACE_ERROR ( (LM_ERROR,
+ "%n\n%T: Can't find value for %s\n", testDoubleKey
+ ));
+ result = 0;
+ }
+
+ return result;
+}
+
+TAO_END_VERSIONED_NAMESPACE_DECL
+
+#endif // PG_PS_UNIT_TEST
diff --git a/TAO/orbsvcs/orbsvcs/PortableGroup/PG_Property_Set.h b/TAO/orbsvcs/orbsvcs/PortableGroup/PG_Property_Set.h
new file mode 100644
index 00000000000..44aae869da7
--- /dev/null
+++ b/TAO/orbsvcs/orbsvcs/PortableGroup/PG_Property_Set.h
@@ -0,0 +1,200 @@
+// -*- C++ -*-
+
+//=============================================================================
+/**
+ * @file PG_Property_Set.h
+ *
+ * $Id$
+ *
+ * This file declares classes to help manage the Properties
+ * defined in the Portable Object Group.
+ *
+ * Note: this started as a simple helper class to make decoding sets of properties
+ * easier, but expanded to provide more general support for managing sets of properties.
+ *
+ * A more appropriate name would be PG_Properties_Set. Maybe this can be changed someday.
+ *
+ * @author Dale Wilson <wilson_d@ociweb.com>
+ */
+//=============================================================================
+#ifndef TAO_PG_PROPERTY_SET
+#define TAO_PG_PROPERTY_SET
+#include /**/ "ace/pre.h"
+
+#include "orbsvcs/PortableGroup/portablegroup_export.h"
+#include "orbsvcs/PortableGroupS.h"
+#include "orbsvcs/CosNamingC.h"
+#include "ace/Hash_Map_Manager.h"
+#include "ace/SString.h"
+#include "ace/Null_Mutex.h"
+
+TAO_BEGIN_VERSIONED_NAMESPACE_DECL
+
+namespace TAO
+{
+
+ /**
+ * The PG_Property_Set captures the set of properties from a
+ * PortableGroup::Properties structure in a more usable format (a
+ * hash map), and provides methods for operating on these properties.
+ *
+ * It supports "chains" of property sets to implement default value semantics.
+ * If a requested property is not found in this set, the default set(s) are searched.
+ * Thus, any property found at this level overrides the defaults.
+ *
+ * See: PG_Properties_Support for more details on use of this object.
+ *
+ * A PG_Property_Set may also be used for it's original purpose as a stand-alone
+ * helper class for extracting values from PortableGroup::Properties.
+ */
+
+ class TAO_PortableGroup_Export PG_Property_Set
+ {
+ typedef ACE_Hash_Map_Manager<
+ ACE_CString,
+ const PortableGroup::Value *,
+ ACE_SYNCH_NULL_MUTEX> ValueMap;
+ typedef ACE_Hash_Map_Iterator<
+ ACE_CString,
+ const PortableGroup::Value *,
+ ACE_SYNCH_NULL_MUTEX> ValueMapIterator;
+
+ public:
+
+ /**
+ * constructor: empty set with no defaults.
+ */
+ PG_Property_Set (void);
+
+ /**
+ * constructor
+ * @param property_set the properties to be decoded
+ */
+ PG_Property_Set (const PortableGroup::Properties & property_set
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS)
+ ACE_THROW_SPEC ((CORBA::SystemException));
+
+ /**
+ * constructor with defaults
+ * @param property_set the properties to be decoded
+ * @param defaults a propert set decoder that supplies default values.
+ */
+ PG_Property_Set (const PortableGroup::Properties & property_set,
+ PG_Property_Set * defaults
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS)
+ ACE_THROW_SPEC ((CORBA::SystemException));
+
+ /**
+ * constructor with defaults, but no properties (yet)
+ * (note this is not a copy constructor)
+ * @param defaults a propert set decoder that supplies default values.
+ */
+ PG_Property_Set (PG_Property_Set * defaults);
+
+
+ ~PG_Property_Set ();
+
+ /**
+ * general purpose find. returns a pointer to an Any
+ * if templated methods were available:
+ * template <typename TYPE >
+ * int find (const ACE_CString & key, TYPE & value) const;
+ * instead, see global function below
+ * @param key the (simple) name of the property
+ * @param pValue an out parameter to receive a pointer to the Any containing the value
+ * @returns boolean true if found
+ */
+ int find (const ACE_CString & key, const PortableGroup::Value *& pValue)const;
+
+
+ /**
+ * Decode additional properties
+ * Duplicate values replace previous values.
+ * @param property_set the properties to be decoded
+ */
+ void decode (const PortableGroup::Properties & property_set ACE_ENV_ARG_DECL)
+ ACE_THROW_SPEC ((CORBA::SystemException));
+
+ /**
+ * Clear properties
+ * Does not clear default properties.
+ */
+ void clear ();
+
+ void remove (const PortableGroup::Properties & property_set)
+ ACE_THROW_SPEC ((CORBA::SystemException));
+
+ /**
+ * set or replace a single property
+ */
+ void set_property (
+ const char * name,
+ const PortableGroup::Value & value
+ ACE_ENV_ARG_DECL);
+
+
+ /**
+ * Export the properties to a PortableGroup::Properties
+ *
+ * This method is intended to be used to implement the PropertyManager::get_*_properties
+ * methods. If you want to access the properties for any purpose other than exporting
+ * them across a CORBA interface, it is much more efficient to use the find interface.
+ *
+ */
+ void export_properties(PortableGroup::Properties & property_set) const;
+
+ /////////////////////////
+ // Implementation Methods
+ private:
+ /**
+ * populate a ValueMap with the properties known to this decoder
+ * including but overriding default values
+ */
+ void merge_properties (ValueMap & merged_values) const;
+
+ ////////////////////
+ // Forbidden methods
+ private:
+ PG_Property_Set(const PG_Property_Set & rhs);
+ PG_Property_Set & operator = (const PG_Property_Set & rhs);
+
+ ///////////////
+ // Data Members
+ private:
+
+ /**
+ * Protect internal state.
+ */
+ mutable TAO_SYNCH_MUTEX internals_;
+
+ ValueMap values_;
+ /**
+ * a parent to another property decoder that provides default values
+ * these can be chained indefinitely.
+ * @todo reference counted pointers would be a good idea here.
+ */
+ PG_Property_Set * defaults_;
+ };
+
+
+#ifdef PG_PS_UNIT_TEST
+
+ /**
+ * unit test: encode and decode properties.
+ * Initialize CORBA before calling this function.
+ * Success is silent, failure prints on cerr.
+ * @returns 1 if test passed; 0 if test failed.
+ */
+ int test_encode_decode();
+#endif // PG_PS_UNIT_TEST
+} //namespace TAO
+
+TAO_END_VERSIONED_NAMESPACE_DECL
+
+////////////////////////////////////
+// include templated helper function
+#include "orbsvcs/PortableGroup/PG_Property_Set_Find.h"
+
+#include /**/ "ace/post.h"
+
+#endif // TAO_PG_PROPERTY_SET
diff --git a/TAO/orbsvcs/orbsvcs/PortableGroup/PG_Property_Set_Find.h b/TAO/orbsvcs/orbsvcs/PortableGroup/PG_Property_Set_Find.h
new file mode 100644
index 00000000000..6f68524d8ac
--- /dev/null
+++ b/TAO/orbsvcs/orbsvcs/PortableGroup/PG_Property_Set_Find.h
@@ -0,0 +1,55 @@
+// -*- C++ -*-
+
+//=============================================================================
+/**
+ * @file PG_Property_Set_Find.h
+ *
+ * $Id$
+ *
+ * This is a companion function for the properties docoder
+ * to work around compilers that don't support templated methods.
+ *
+ * @author Dale Wilson <wilson_d@ociweb.com>
+ */
+//=============================================================================
+#ifndef TAO_PG_PROPERTY_SET_FIND_H
+#define TAO_PG_PROPERTY_SET_FIND_H
+#include /**/ "ace/pre.h"
+#include <ace/ACE.h>
+
+#if !defined (ACE_LACKS_PRAGMA_ONCE)
+# pragma once
+#endif /* ACE_LACKS_PRAGMA_ONCE */
+
+#include "orbsvcs/PortableGroup/portablegroup_export.h"
+
+#include "ace/Hash_Map_Manager.h"
+
+TAO_BEGIN_VERSIONED_NAMESPACE_DECL
+
+namespace TAO
+{
+ /**
+ * Find a value in a TAO::PG_Property_Set.
+ * This is a work-around for the lack of
+ * templated methods.
+ */
+ template <typename TYPE>
+ int find (const PG_Property_Set & decoder, const ACE_CString & key, TYPE & value)
+ {
+ int result = 0;
+ PortableGroup::Value const * any;
+ if ( decoder.find (key, any))
+ {
+ result = ((*any) >>= value);
+ }
+ return result;
+ }
+
+} //namespace TAO
+
+TAO_END_VERSIONED_NAMESPACE_DECL
+
+#include /**/ "ace/post.h"
+
+#endif // TAO_PG_PROPERTY_SET_FIND_H
diff --git a/TAO/orbsvcs/orbsvcs/PortableGroup/PG_Property_Utils.cpp b/TAO/orbsvcs/orbsvcs/PortableGroup/PG_Property_Utils.cpp
new file mode 100644
index 00000000000..897facce517
--- /dev/null
+++ b/TAO/orbsvcs/orbsvcs/PortableGroup/PG_Property_Utils.cpp
@@ -0,0 +1,82 @@
+#include "orbsvcs/PortableGroup/PG_Property_Utils.h"
+#include "orbsvcs/PortableGroup/PG_Operators.h"
+
+ACE_RCSID (PortableGroup,
+ PG_Property_Utils,
+ "$Id$")
+
+TAO_BEGIN_VERSIONED_NAMESPACE_DECL
+
+CORBA::Boolean
+TAO_PG::get_property_value (const PortableGroup::Name & property_name,
+ const PortableGroup::Properties & properties,
+ PortableGroup::Value & property_value)
+{
+ const CORBA::ULong len = properties.length ();
+ for (CORBA::ULong i = 0; i < len; ++i)
+ {
+ const PortableGroup::Property & property = properties[i];
+ if (property.nam == property_name)
+ {
+ property_value = property.val;
+ return 1;
+ }
+ }
+
+ return 0;
+}
+
+void
+TAO_PG::override_properties (
+ const PortableGroup::Properties & overrides,
+ PortableGroup::Properties &properties)
+{
+ const CORBA::ULong num_overrides = overrides.length ();
+ if (num_overrides == 0)
+ return;
+
+ const CORBA::ULong old_length = properties.length ();
+
+ const CORBA::ULong new_length =
+ (num_overrides > old_length ? num_overrides : old_length);
+
+ // Increase the length wholesale as much as possible. The idea is
+ // to keep the cost of the incremental growth that may occur below
+ // to a minimum.
+ properties.length (new_length);
+
+ // @@ Slow O(n^2) operation. Note that it may be slower than O(n^2)
+ // if the length of the property sequence must be increased
+ // on-the-fly due to the allocations and copies incurred by such
+ // an operation.
+ for (CORBA::ULong i = 0; i < num_overrides; ++i)
+ {
+ const PortableGroup::Property &override = overrides[i];
+
+ CORBA::ULong j = 0;
+ for ( ; j < old_length; ++j)
+ if (properties[j].nam == override.nam)
+ {
+ properties[j].val = override.val;
+ break;
+ }
+
+ // No property to override. Append the override.
+ if (j == old_length)
+ {
+ // @@ Slow incremental growth! In order to set the length
+ // only once, i.e. a priori, instead of multiple times a
+ // searches in the override list and the property list
+ // must be performed to determine how many additional
+ // properties from the override list must be appended to
+ // the properties list. Depending on the size of each
+ // list, such an operation may be just as slow as this
+ // operation.
+ const CORBA::ULong current_length = properties.length ();
+ properties.length (current_length + 1);
+ properties[current_length] = override;
+ }
+ }
+}
+
+TAO_END_VERSIONED_NAMESPACE_DECL
diff --git a/TAO/orbsvcs/orbsvcs/PortableGroup/PG_Property_Utils.h b/TAO/orbsvcs/orbsvcs/PortableGroup/PG_Property_Utils.h
new file mode 100644
index 00000000000..8e8395f2bc6
--- /dev/null
+++ b/TAO/orbsvcs/orbsvcs/PortableGroup/PG_Property_Utils.h
@@ -0,0 +1,57 @@
+// -*- C++ -*-
+
+//=============================================================================
+/**
+ * @file PG_Property_Utils.h
+ *
+ * $Id$
+ *
+ * @author Ossama Othman <ossama@uci.edu>
+ */
+//=============================================================================
+
+
+#ifndef TAO_PG_PROPERTY_UTILS_H
+#define TAO_PG_PROPERTY_UTILS_H
+
+#include /**/ "ace/pre.h"
+
+#include "ace/config-all.h"
+
+#if !defined (ACE_LACKS_PRAGMA_ONCE)
+#pragma once
+#endif /* ACE_LACKS_PRAGMA_ONCE */
+
+#include "orbsvcs/PortableGroup/portablegroup_export.h"
+#include "orbsvcs/PortableGroupC.h"
+
+TAO_BEGIN_VERSIONED_NAMESPACE_DECL
+
+namespace TAO_PG
+{
+ /// Retrieve the value of the given property from the given property
+ /// list.
+ /**
+ * @return true if successful, false otherwise
+ */
+ TAO_PortableGroup_Export CORBA::Boolean get_property_value (
+ const PortableGroup::Name & property_name,
+ const PortableGroup::Properties & properties,
+ PortableGroup::Value & property_value);
+
+ /// Override properties in the "properties" sequence with those in
+ /// the "overrides" sequence.
+ /**
+ * If no property is overridden, the override in question will be
+ * appended to the "properties" list.
+ */
+ TAO_PortableGroup_Export void override_properties (
+ const PortableGroup::Properties & overrides,
+ PortableGroup::Properties &properties);
+
+}
+
+TAO_END_VERSIONED_NAMESPACE_DECL
+
+#include /**/ "ace/post.h"
+#endif /* TAO_PG_PROPERTY_UTILS_H */
diff --git a/TAO/orbsvcs/orbsvcs/PortableGroup/PG_Servant_Dispatcher.cpp b/TAO/orbsvcs/orbsvcs/PortableGroup/PG_Servant_Dispatcher.cpp
new file mode 100644
index 00000000000..4b3504795e2
--- /dev/null
+++ b/TAO/orbsvcs/orbsvcs/PortableGroup/PG_Servant_Dispatcher.cpp
@@ -0,0 +1,70 @@
+// $Id$
+
+#include "orbsvcs/PortableGroup/GOA.h"
+#include "orbsvcs/PortableGroup/PG_Servant_Dispatcher.h"
+
+ACE_RCSID(PortableGroup,
+ PG_Servant_Dispatcher,
+ "$Id$")
+
+TAO_BEGIN_VERSIONED_NAMESPACE_DECL
+
+TAO_PG_Servant_Dispatcher::~TAO_PG_Servant_Dispatcher (void)
+{
+}
+
+TAO_Root_POA *
+TAO_PG_Servant_Dispatcher::create_Root_POA (const ACE_CString &name,
+ PortableServer::POAManager_ptr poa_manager,
+ const TAO_POA_Policy_Set &policies,
+ ACE_Lock &lock,
+ TAO_SYNCH_MUTEX &thread_lock,
+ TAO_ORB_Core &orb_core,
+ TAO_Object_Adapter *object_adapter
+ ACE_ENV_ARG_DECL)
+{
+ TAO_Root_POA *poa = 0;
+
+ ACE_NEW_THROW_EX (poa,
+ TAO_GOA (name,
+ poa_manager,
+ policies,
+ 0,
+ lock,
+ thread_lock,
+ orb_core,
+ object_adapter
+ ACE_ENV_ARG_PARAMETER),
+ CORBA::NO_MEMORY ());
+ ACE_CHECK_RETURN (0);
+
+ return poa;
+}
+
+void
+TAO_PG_Servant_Dispatcher::pre_invoke_remote_request (
+ TAO_Root_POA &,
+ CORBA::Short,
+ TAO_ServerRequest &,
+ TAO::Portable_Server::Servant_Upcall::Pre_Invoke_State &
+ ACE_ENV_ARG_DECL_NOT_USED)
+{
+}
+
+void
+TAO_PG_Servant_Dispatcher::pre_invoke_collocated_request (
+ TAO_Root_POA &,
+ CORBA::Short,
+ TAO::Portable_Server::Servant_Upcall::Pre_Invoke_State &
+ ACE_ENV_ARG_DECL_NOT_USED)
+{
+}
+
+void
+TAO_PG_Servant_Dispatcher::post_invoke (
+ TAO_Root_POA &,
+ TAO::Portable_Server::Servant_Upcall::Pre_Invoke_State &)
+{
+}
+
+TAO_END_VERSIONED_NAMESPACE_DECL
diff --git a/TAO/orbsvcs/orbsvcs/PortableGroup/PG_Servant_Dispatcher.h b/TAO/orbsvcs/orbsvcs/PortableGroup/PG_Servant_Dispatcher.h
new file mode 100644
index 00000000000..a5718c240cc
--- /dev/null
+++ b/TAO/orbsvcs/orbsvcs/PortableGroup/PG_Servant_Dispatcher.h
@@ -0,0 +1,72 @@
+// -*- C++ -*-
+
+//=============================================================================
+/**
+ * @file PG_Servant_Dispatcher.h
+ *
+ * $Id$
+ *
+ * @author Johnny Willemsen <jwillemsen@remedy.nl>
+ */
+//=============================================================================
+
+#ifndef TAO_PG_SERVANT_DISPATCHER_H
+#define TAO_PG_SERVANT_DISPATCHER_H
+#include /**/ "ace/pre.h"
+
+#include "orbsvcs/PortableGroup/portablegroup_export.h"
+#include "tao/PortableServer/Servant_Dispatcher.h"
+
+#if !defined (ACE_LACKS_PRAGMA_ONCE)
+# pragma once
+#endif /* ACE_LACKS_PRAGMA_ONCE */
+
+TAO_BEGIN_VERSIONED_NAMESPACE_DECL
+
+/**
+ * @class TAO_PG_Servant_Dispatcher
+ *
+ * @brief Concrete instantiation of the Servant_Dispatcher strategy.
+ *
+ * This class just calls _dispatch on the servant_upcall. No extra
+ * processing is done or needed.
+ *
+ */
+class TAO_PortableGroup_Export TAO_PG_Servant_Dispatcher
+ : public TAO_Servant_Dispatcher
+{
+public:
+ virtual ~TAO_PG_Servant_Dispatcher (void);
+
+ /// Pre_invoke remote request.
+ void pre_invoke_remote_request (TAO_Root_POA &poa,
+ CORBA::Short servant_priority,
+ TAO_ServerRequest &req,
+ TAO::Portable_Server::Servant_Upcall::Pre_Invoke_State &pre_invoke_state
+ ACE_ENV_ARG_DECL);
+
+ /// Pre_invoke collocated request.
+ void pre_invoke_collocated_request (TAO_Root_POA &poa,
+ CORBA::Short servant_priority,
+ TAO::Portable_Server::Servant_Upcall::Pre_Invoke_State &pre_invoke_state
+ ACE_ENV_ARG_DECL);
+
+ /// Post_invoke request.
+ void post_invoke (TAO_Root_POA &poa,
+ TAO::Portable_Server::Servant_Upcall::Pre_Invoke_State &pre_invoke_state);
+
+ /// Factory method for creating new POA's.
+ TAO_Root_POA *create_Root_POA (const ACE_CString &name,
+ PortableServer::POAManager_ptr poa_manager,
+ const TAO_POA_Policy_Set &policies,
+ ACE_Lock &lock,
+ TAO_SYNCH_MUTEX &thread_lock,
+ TAO_ORB_Core &orb_core,
+ TAO_Object_Adapter *object_adapter
+ ACE_ENV_ARG_DECL);
+};
+
+TAO_END_VERSIONED_NAMESPACE_DECL
+
+#include /**/ "ace/post.h"
+#endif /* TAO_PG_SERVANT_DISPATCHER_H */
diff --git a/TAO/orbsvcs/orbsvcs/PortableGroup/PG_Utils.cpp b/TAO/orbsvcs/orbsvcs/PortableGroup/PG_Utils.cpp
new file mode 100644
index 00000000000..a57079ffea8
--- /dev/null
+++ b/TAO/orbsvcs/orbsvcs/PortableGroup/PG_Utils.cpp
@@ -0,0 +1,176 @@
+#include "orbsvcs/PortableGroup/PG_Utils.h"
+
+#include "tao/MProfile.h"
+#include "tao/Profile.h"
+#include "tao/Stub.h"
+#include "tao/Tagged_Components.h"
+#include "tao/CDR.h"
+
+#include "ace/OS_NS_string.h"
+
+
+ACE_RCSID (PortableGroup,
+ PG_Utils,
+ "$Id$")
+
+TAO_BEGIN_VERSIONED_NAMESPACE_DECL
+
+namespace TAO
+{
+ /*static*/ CORBA::Boolean
+ PG_Utils::set_tagged_component (
+ PortableGroup::ObjectGroup *&ior,
+ PortableGroup::TagGroupTaggedComponent &tg)
+ {
+ if (ior->_stubobj () == 0)
+ return 0;
+
+ // We need to apply the property for every profile in the IOR
+ TAO_MProfile &tmp_pfiles =
+ ior->_stubobj ()->base_profiles ();
+
+ // Create the output CDR stream
+ TAO_OutputCDR cdr;
+
+ IOP::TaggedComponent tagged_components;
+ tagged_components.tag = IOP::TAG_FT_GROUP;
+
+ // Encode the property in to the tagged_components
+ CORBA::Boolean retval =
+ PG_Utils::encode_properties (cdr,
+ tg);
+
+ if (retval == 0)
+ return retval;
+
+ // Get the length of the CDR stream
+ CORBA::ULong length = static_cast<CORBA::ULong> (cdr.total_length ());
+
+ // Set the length
+ tagged_components.component_data.length (length);
+
+ // Get the pointer to the underlying buffer
+ CORBA::Octet *buf =
+ tagged_components.component_data.get_buffer ();
+
+ for (const ACE_Message_Block *i = cdr.begin ();
+ i != 0;
+ i = i->cont ())
+ {
+
+ ACE_OS::memcpy (buf, i->rd_ptr (), i->length ());
+ buf += i->length ();
+ }
+ const IOP::TaggedComponent &tmp_tc = tagged_components;
+
+ // Get the profile count.
+ CORBA::ULong count =
+ ior->_stubobj ()->base_profiles ().profile_count ();
+
+ // Go through every profile and set the TaggedComponent field
+ for (CORBA::ULong p_idx = 0; p_idx < count ; ++p_idx)
+ {
+ // Get the tagged components in the profile
+ TAO_Tagged_Components &tag_comp =
+ tmp_pfiles.get_profile (p_idx)->tagged_components ();
+
+ // Finally set the <tagged_component> in the
+ // <TAO_Tagged_Component>
+ tag_comp.set_component (tmp_tc);
+ }
+
+ // Success
+ return 1;
+ }
+
+ /*static*/ CORBA::Boolean
+ PG_Utils::get_tagged_component (
+ PortableGroup::ObjectGroup *&ior,
+ PortableGroup::TagGroupTaggedComponent &tg)
+ {
+ if (ior->_stubobj () == 0)
+ return 0;
+
+ TAO_MProfile &mprofile =
+ ior->_stubobj ()->base_profiles ();
+
+ // Looking for a tagged component with a TAG_FT_GROUP flag.
+ IOP::TaggedComponent tc;
+ tc.tag = IOP::TAG_FT_GROUP;
+
+ CORBA::ULong count =
+ mprofile.profile_count ();
+
+ for (CORBA::ULong i = 0;
+ i < count;
+ i++)
+ {
+
+ // Get the Tagged Components
+ const TAO_Tagged_Components &pfile_tagged =
+ mprofile.get_profile (i)->tagged_components ();
+
+ // Look for the primary
+ if (pfile_tagged.get_component (tc) == 1)
+ {
+ TAO_InputCDR cdr (reinterpret_cast<const char*> (tc.component_data.get_buffer ()),
+ tc.component_data.length ());
+
+ CORBA::Boolean byte_order;
+
+ cdr >> ACE_InputCDR::to_boolean (byte_order);
+
+ if (!cdr.good_bit ())
+ return 0;
+
+ cdr.reset_byte_order (static_cast<int> (byte_order));
+
+ cdr >> tg;
+
+ if (cdr.good_bit ())
+ return 1;
+ }
+ }
+
+ return 0;
+ }
+
+ CORBA::Boolean
+ PG_Utils::encode_properties (
+ TAO_OutputCDR &cdr,
+ PortableGroup::TagGroupTaggedComponent &tg)
+ {
+ cdr << ACE_OutputCDR::from_boolean (TAO_ENCAP_BYTE_ORDER);
+
+ if (!cdr.good_bit ())
+ return 0;
+
+ // the version info
+ cdr << tg.component_version;
+
+ if (!cdr.good_bit ())
+ return 0;
+
+ // the domain id
+ cdr << tg.group_domain_id.in ();
+
+ if (!cdr.good_bit ())
+ return 0;
+
+ // Object group id
+ cdr << tg.object_group_id;
+
+ if (!cdr.good_bit ())
+ return 0;
+
+ // Object group reference version
+ cdr << tg.object_group_ref_version;
+
+ if (!cdr.good_bit ())
+ return 0;
+
+ return cdr.good_bit ();
+ }
+}
+
+TAO_END_VERSIONED_NAMESPACE_DECL
diff --git a/TAO/orbsvcs/orbsvcs/PortableGroup/PG_Utils.h b/TAO/orbsvcs/orbsvcs/PortableGroup/PG_Utils.h
new file mode 100644
index 00000000000..5552f38c3a3
--- /dev/null
+++ b/TAO/orbsvcs/orbsvcs/PortableGroup/PG_Utils.h
@@ -0,0 +1,59 @@
+// -*- C++ -*-
+
+//=============================================================================
+/**
+ * @file PG_Utils.h
+ *
+ * $Id$
+ *
+ * Utility methods
+ *
+ * @author Balachandran Natarajan <bala@dre.vanderbilt.edu>
+ */
+//=============================================================================
+#ifndef TAO_PORTABLEGROUP_UTILS_H
+#define TAO_PORTABLEGROUP_UTILS_H
+#include /**/ "ace/pre.h"
+
+#include "orbsvcs/PortableGroupC.h"
+
+#if !defined (ACE_LACKS_PRAGMA_ONCE)
+# pragma once
+#endif /* ACE_LACKS_PRAGMA_ONCE */
+
+#include "orbsvcs/PortableGroup/portablegroup_export.h"
+
+TAO_BEGIN_VERSIONED_NAMESPACE_DECL
+
+namespace TAO
+{
+ /**
+ * @class PG_Utils
+ *
+ * @brief Simple utility class
+ */
+ class TAO_PortableGroup_Export PG_Utils
+ {
+ public:
+
+ /// Set tagged component for the object group
+ static CORBA::Boolean set_tagged_component (
+ PortableGroup::ObjectGroup *&ior,
+ PortableGroup::TagGroupTaggedComponent &t);
+
+ /// Get tagged component for the object group
+ static CORBA::Boolean get_tagged_component (
+ PortableGroup::ObjectGroup *&ior,
+ PortableGroup::TagGroupTaggedComponent &t);
+
+ private:
+ static CORBA::Boolean encode_properties (
+ TAO_OutputCDR &cdr,
+ PortableGroup::TagGroupTaggedComponent &tg);
+ };
+}
+
+TAO_END_VERSIONED_NAMESPACE_DECL
+
+#include /**/ "ace/post.h"
+#endif /*TAO_PORTABLEGROUP_UTILS_H*/
diff --git a/TAO/orbsvcs/orbsvcs/PortableGroup/PG_conf.h b/TAO/orbsvcs/orbsvcs/PortableGroup/PG_conf.h
new file mode 100644
index 00000000000..7f993ad8f71
--- /dev/null
+++ b/TAO/orbsvcs/orbsvcs/PortableGroup/PG_conf.h
@@ -0,0 +1,64 @@
+// -*- C++ -*-
+
+//=============================================================================
+/**
+ * @file PG_conf.h
+ *
+ * $Id$
+ *
+ * @author Ossama Othman <ossama@uci.edu>
+ */
+//=============================================================================
+
+
+#ifndef TAO_PG_CONF_H
+#define TAO_PG_CONF_H
+
+#include /**/ "ace/pre.h"
+
+#include "ace/config-all.h"
+
+#if !defined (ACE_LACKS_PRAGMA_ONCE)
+#pragma once
+#endif /* ACE_LACKS_PRAGMA_ONCE */
+
+#include "orbsvcs/PortableGroupC.h"
+
+TAO_BEGIN_VERSIONED_NAMESPACE_DECL
+
+#ifndef TAO_PG_MAX_OBJECT_GROUPS // @@ why create arbitrary limits?
+/// The maximum number of object groups to be managed by the
+/// ObjectGroupManager. This number is also equal to the number of
+/// factory sets managed by the GenericFactory.
+const size_t TAO_PG_MAX_OBJECT_GROUPS = 1024;
+#endif /* TAO_PG_MAX_NUMBER_OF_OBJECT_GROUPS */
+
+#ifndef TAO_PG_MAX_LOCATIONS // @@ why create arbitrary limits?
+/// The maximum number of locations to be managed by the
+/// ObjectGroupManager.
+const size_t TAO_PG_MAX_LOCATIONS = 1024;
+#endif /* TAO_PG_MAX_LOCATIONS */
+
+#ifndef TAO_PG_MEMBERSHIP_STYLE
+/// The default object group membership style.
+const PortableGroup::MembershipStyleValue TAO_PG_MEMBERSHIP_STYLE =
+ PortableGroup::MEMB_INF_CTRL;
+#endif /* TAO_PG_INITIAL_NUMBER_MEMBERS */
+
+#ifndef TAO_PG_INITIAL_NUMBER_MEMBERS
+/// The default initial number of object group members.
+const PortableGroup::InitialNumberMembersValue TAO_PG_INITIAL_NUMBER_MEMBERS =
+ 2;
+#endif /* TAO_PG_INITIAL_NUMBER_MEMBERS */
+
+#ifndef TAO_PG_MINIMUM_NUMBER_MEMBERS
+/// The default minimum number of object group members.
+const PortableGroup::MinimumNumberMembersValue TAO_PG_MINIMUM_NUMBER_MEMBERS =
+ TAO_PG_INITIAL_NUMBER_MEMBERS;
+#endif /* TAO_PG_MINIMUM_NUMBER_MEMBERS */
+
+TAO_END_VERSIONED_NAMESPACE_DECL
+
+#include /**/ "ace/post.h"
+
+#endif /* TAO_PG_CONF_H */
diff --git a/TAO/orbsvcs/orbsvcs/PortableGroup/PortableGroup_Acceptor_Registry.cpp b/TAO/orbsvcs/orbsvcs/PortableGroup/PortableGroup_Acceptor_Registry.cpp
new file mode 100644
index 00000000000..a22594ca04b
--- /dev/null
+++ b/TAO/orbsvcs/orbsvcs/PortableGroup/PortableGroup_Acceptor_Registry.cpp
@@ -0,0 +1,191 @@
+// $Id$
+
+#include "orbsvcs/PortableGroup/PortableGroup_Acceptor_Registry.h"
+#include "tao/ORB_Core.h"
+#include "tao/Profile.h"
+#include "tao/Protocol_Factory.h"
+#include "tao/GIOP_Message_State.h"
+#include "tao/debug.h"
+#include "tao/Endpoint.h"
+#include "tao/Thread_Lane_Resources.h"
+#include "tao/Leader_Follower.h"
+
+ACE_RCSID (PortableGroup,
+ PortableGroup_Acceptor_Registry,
+ "$Id$")
+
+TAO_BEGIN_VERSIONED_NAMESPACE_DECL
+
+TAO_PortableGroup_Acceptor_Registry::TAO_PortableGroup_Acceptor_Registry (void)
+{
+}
+
+TAO_PortableGroup_Acceptor_Registry::~TAO_PortableGroup_Acceptor_Registry (void)
+{
+ // Free the memory for the endpoints.
+ Entry *entry;
+ Acceptor_Registry_Iterator iter (this->registry_);
+
+ while (iter.next (entry))
+ {
+ delete entry->endpoint;
+ delete entry->acceptor;
+ iter.advance ();
+ }
+}
+
+
+void
+TAO_PortableGroup_Acceptor_Registry::open (const TAO_Profile* profile,
+ TAO_ORB_Core &orb_core
+ ACE_ENV_ARG_DECL)
+{
+ Entry *entry;
+
+ if (this->find (profile, entry) == 1)
+ {
+ // Found it. Increment the reference count.
+ ++entry->cnt;
+ }
+ else
+ {
+ // Not found. Open a new acceptor.
+
+ // Now get the list of available protocol factories.
+ TAO_ProtocolFactorySetItor end =
+ orb_core.protocol_factories ()->end ();
+
+ // int found = 0;
+ // If usable protocol (factory) is found then this will be
+ // set equal to 1.
+
+ for (TAO_ProtocolFactorySetItor factory =
+ orb_core.protocol_factories ()->begin ();
+ factory != end;
+ ++factory)
+ {
+ if ((*factory)->factory ()->tag () == profile->tag ())
+ {
+ this->open_i (profile,
+ orb_core,
+ factory
+ ACE_ENV_ARG_PARAMETER);
+ ACE_CHECK;
+
+ // found = 1; // A usable protocol was found.
+ }
+ else
+ continue;
+ }
+ }
+}
+
+#define MAX_ADDR_LENGTH (32)
+
+void
+TAO_PortableGroup_Acceptor_Registry::open_i (const TAO_Profile* profile,
+ TAO_ORB_Core &orb_core,
+ TAO_ProtocolFactorySetItor &factory
+ ACE_ENV_ARG_DECL)
+{
+ TAO_Acceptor *acceptor = (*factory)->factory ()->make_acceptor ();
+
+ if (acceptor != 0)
+ {
+ // Extract the desired endpoint/protocol version if one
+ // exists.
+ const TAO_GIOP_Message_Version &version = profile->version ();
+ char buffer [MAX_ADDR_LENGTH];
+
+ // Removed the constness of profile. We're not changing
+ // anything, but need to call a nonconst function.
+ TAO_Profile* nc_profile = const_cast<TAO_Profile *> (profile);
+ nc_profile->endpoint ()->addr_to_string (buffer, MAX_ADDR_LENGTH);
+
+ if (acceptor->open (&orb_core,
+ orb_core.lane_resources ().leader_follower ().reactor(),
+ version.major,
+ version.minor,
+ buffer,
+ 0) == -1)
+ {
+ delete acceptor;
+
+ if (TAO_debug_level > 0)
+ ACE_ERROR ((LM_ERROR,
+ ACE_TEXT ("TAO (%P|%t) ")
+ ACE_TEXT ("unable to open acceptor ")
+ ACE_TEXT ("for <%s>%p\n"),
+ buffer,
+ ""));
+
+ ACE_THROW (CORBA::BAD_PARAM (
+ CORBA::SystemException::_tao_minor_code (
+ TAO_ACCEPTOR_REGISTRY_OPEN_LOCATION_CODE,
+ EINVAL),
+ CORBA::COMPLETED_NO));
+ }
+
+ // Add acceptor to list.
+ Entry tmp_entry;
+ tmp_entry.acceptor = acceptor;
+ tmp_entry.endpoint = nc_profile->endpoint ()->duplicate ();
+ tmp_entry.cnt = 1;
+
+ if (this->registry_.enqueue_tail (tmp_entry) == -1)
+ {
+ delete acceptor;
+
+ if (TAO_debug_level > 0)
+ ACE_ERROR ((LM_ERROR,
+ ACE_TEXT ("TAO (%P|%t) ")
+ ACE_TEXT ("unable to add acceptor to registry")
+ ACE_TEXT ("for <%s>%p\n"),
+ buffer,
+ ""));
+
+ ACE_THROW (CORBA::BAD_PARAM (
+ CORBA::SystemException::_tao_minor_code (
+ TAO_ACCEPTOR_REGISTRY_OPEN_LOCATION_CODE,
+ EINVAL),
+ CORBA::COMPLETED_NO));
+ }
+ }
+ else
+ {
+ if (TAO_debug_level > 0)
+ ACE_ERROR ((LM_ERROR,
+ ACE_TEXT ("TAO (%P|%t) ")
+ ACE_TEXT ("unable to create acceptor ")
+ ));
+
+ ACE_THROW (CORBA::BAD_PARAM (
+ CORBA::SystemException::_tao_minor_code (
+ TAO_ACCEPTOR_REGISTRY_OPEN_LOCATION_CODE,
+ EINVAL),
+ CORBA::COMPLETED_NO));
+ }
+}
+
+int
+TAO_PortableGroup_Acceptor_Registry::find (const TAO_Profile* profile,
+ Entry *&entry)
+{
+ Acceptor_Registry_Iterator iter (this->registry_);
+
+ while (iter.next (entry))
+ {
+ // Since the endpoint routine is nonconst, need to
+ // cast away the constness even though we're not
+ // changing anything.
+ TAO_Profile *nc_profile = const_cast<TAO_Profile *> (profile);
+ if (entry->endpoint->is_equivalent (nc_profile->endpoint ()))
+ return 1;
+
+ iter.advance ();
+ }
+
+ return 0;
+}
+
+TAO_END_VERSIONED_NAMESPACE_DECL
diff --git a/TAO/orbsvcs/orbsvcs/PortableGroup/PortableGroup_Acceptor_Registry.h b/TAO/orbsvcs/orbsvcs/PortableGroup/PortableGroup_Acceptor_Registry.h
new file mode 100644
index 00000000000..1ecc90efa4d
--- /dev/null
+++ b/TAO/orbsvcs/orbsvcs/PortableGroup/PortableGroup_Acceptor_Registry.h
@@ -0,0 +1,117 @@
+// -*- C++ -*-
+
+//=============================================================================
+/**
+ * @file PortableGroup_Acceptor_Registry.h
+ *
+ * $Id$
+ *
+ * Registry for dynamically created acceptors.
+ *
+ * @author Frank Hunleth <fhunleth@cs.wustl.edu>
+ */
+//=============================================================================
+
+#ifndef TAO_PORTABLEGROUP_ACCEPTOR_REGISTRY_H
+#define TAO_PORTABLEGROUP_ACCEPTOR_REGISTRY_H
+
+#include /**/ "ace/pre.h"
+
+#include "ace/Unbounded_Queue.h"
+
+#if !defined (ACE_LACKS_PRAGMA_ONCE)
+# pragma once
+#endif /* ACE_LACKS_PRAGMA_ONCE */
+
+#include "ace/CORBA_macros.h"
+
+#include "orbsvcs/PortableGroup/portablegroup_export.h"
+
+#include "tao/Transport_Acceptor.h"
+#include "tao/Resource_Factory.h"
+
+TAO_BEGIN_VERSIONED_NAMESPACE_DECL
+
+class TAO_Profile;
+
+namespace CORBA
+{
+ class Environment;
+}
+
+/**
+ * @class TAO_PortableGroup_Acceptor_Registry
+ *
+ * @brief .
+ *
+ * There is one TAO_PortableGroup_Acceptor_Registry per ORB_Core.
+ */
+class TAO_PortableGroup_Export TAO_PortableGroup_Acceptor_Registry
+{
+public:
+
+ /**
+ * @struct Entry
+ *
+ * @brief Value field of the portable group acceptor registry.
+ */
+ struct Entry
+ {
+ /// Pointer to the acceptor for this GroupId.
+ TAO_Acceptor *acceptor;
+
+ /// Cached endpoint that the acceptor is listening on.
+ TAO_Endpoint *endpoint;
+
+ /// Count of times that this GroupId has been opened.
+ int cnt;
+ };
+
+
+ // = Initialization and termination methods.
+ /// Default constructor.
+ TAO_PortableGroup_Acceptor_Registry (void);
+
+ /// Default destructor.
+ ~TAO_PortableGroup_Acceptor_Registry (void);
+
+ /// Open an acceptor based on a tagged profile.
+ void open (const TAO_Profile* profile,
+ TAO_ORB_Core &orb_core
+ ACE_ENV_ARG_DECL);
+
+ /// Close all open acceptors.
+ int close_all (void);
+
+ typedef ACE_Unbounded_Queue<Entry> Acceptor_Registry;
+ typedef ACE_Unbounded_Queue_Iterator<Entry> Acceptor_Registry_Iterator;
+
+protected:
+
+ /// Helper function to open a group acceptor.
+ void open_i (const TAO_Profile* profile,
+ TAO_ORB_Core &orb_core,
+ TAO_ProtocolFactorySetItor &factory
+ ACE_ENV_ARG_DECL);
+
+ /// Find an acceptor by using a profile.
+ int find (const TAO_Profile* profile,
+ Entry *&entry);
+
+private:
+
+ // The acceptor registry should not be copied.
+ TAO_PortableGroup_Acceptor_Registry (
+ const TAO_PortableGroup_Acceptor_Registry&);
+ void operator= (const TAO_PortableGroup_Acceptor_Registry&);
+
+private:
+ /// List of acceptors that are currently open.
+ Acceptor_Registry registry_;
+};
+
+TAO_END_VERSIONED_NAMESPACE_DECL
+
+#include /**/ "ace/post.h"
+
+#endif /* TAO_PORTABLEGROUP_ACCEPTOR_REGISTRY_H */
diff --git a/TAO/orbsvcs/orbsvcs/PortableGroup/PortableGroup_Loader.cpp b/TAO/orbsvcs/orbsvcs/PortableGroup/PortableGroup_Loader.cpp
new file mode 100644
index 00000000000..2878d3db9a6
--- /dev/null
+++ b/TAO/orbsvcs/orbsvcs/PortableGroup/PortableGroup_Loader.cpp
@@ -0,0 +1,83 @@
+// $Id$
+
+#include "orbsvcs/PortableGroup/PortableGroup_Loader.h"
+#include "orbsvcs/PortableGroup/PG_Object_Adapter_Factory.h"
+#include "orbsvcs/PortableGroup/PortableGroup_ORBInitializer.h"
+#include "ace/Dynamic_Service.h"
+#include "tao/ORB_Core.h"
+#include "tao/ORBInitializer_Registry.h"
+
+ACE_RCSID (PortableGroup,
+ PortableGroup_Loader,
+ "$Id$")
+
+
+TAO_BEGIN_VERSIONED_NAMESPACE_DECL
+
+TAO_PortableGroup_Loader::TAO_PortableGroup_Loader (void)
+{
+}
+
+int
+TAO_PortableGroup_Loader::init (int /*argc*/,
+ char* /*argv*/ [])
+{
+ ACE_TRACE ("TAO_PortableGroup_Loader::init");
+ // Register the ORB initializer.
+ ACE_TRY_NEW_ENV
+ {
+ PortableInterceptor::ORBInitializer_ptr temp_orb_initializer =
+ PortableInterceptor::ORBInitializer::_nil ();
+ PortableInterceptor::ORBInitializer_var orb_initializer;
+
+ /// Register the Portablegroup ORBInitializer.
+ ACE_NEW_THROW_EX (temp_orb_initializer,
+ TAO_PortableGroup_ORBInitializer (),
+ CORBA::NO_MEMORY (
+ CORBA::SystemException::_tao_minor_code (
+ TAO::VMCID,
+ ENOMEM),
+ CORBA::COMPLETED_NO));
+ ACE_TRY_CHECK;
+ orb_initializer = temp_orb_initializer;
+
+ PortableInterceptor::register_orb_initializer (orb_initializer.in ()
+ ACE_ENV_ARG_PARAMETER);
+ ACE_TRY_CHECK;
+ }
+ ACE_CATCHANY
+ {
+ ACE_PRINT_EXCEPTION (ACE_ANY_EXCEPTION,
+ "Unexpected exception caught while initializing the PortableGroup:");
+ return 1;
+ }
+ ACE_ENDTRY;
+
+ return 0;
+}
+
+int
+TAO_PortableGroup_Loader::Initializer (void)
+{
+ ACE_Service_Config::process_directive (ace_svc_desc_TAO_PortableGroup_Loader);
+ TAO_PortableGroup_Loader *tmp =
+ ACE_Dynamic_Service<TAO_PortableGroup_Loader>::instance (
+ "PortableGroup_Loader");
+
+ if (tmp != 0)
+ {
+ return tmp->init (0, 0);
+ }
+
+ return -1;
+}
+
+TAO_END_VERSIONED_NAMESPACE_DECL
+
+ACE_STATIC_SVC_DEFINE (TAO_PortableGroup_Loader,
+ ACE_TEXT ("PortableGroup_Loader"),
+ ACE_SVC_OBJ_T,
+ &ACE_SVC_NAME (TAO_PortableGroup_Loader),
+ ACE_Service_Type::DELETE_THIS | ACE_Service_Type::DELETE_OBJ,
+ 0)
+ACE_FACTORY_DEFINE (TAO_PortableGroup, TAO_PortableGroup_Loader)
diff --git a/TAO/orbsvcs/orbsvcs/PortableGroup/PortableGroup_Loader.h b/TAO/orbsvcs/orbsvcs/PortableGroup/PortableGroup_Loader.h
new file mode 100644
index 00000000000..7dac70972c2
--- /dev/null
+++ b/TAO/orbsvcs/orbsvcs/PortableGroup/PortableGroup_Loader.h
@@ -0,0 +1,68 @@
+// -*- C++ -*-
+
+//=============================================================================
+/**
+ * @file PortableGroup_Loader.h
+ *
+ * $Id$
+ *
+ * Loads and initializes the PortableGroup extensions to TAO.
+ *
+ * @author Frank Hunleth <fhunleth@cs.wustl.edu>
+ */
+//=============================================================================
+
+#ifndef TAO_PORTABLEGROUP_LOADER_H
+#define TAO_PORTABLEGROUP_LOADER_H
+
+#include /**/ "ace/pre.h"
+
+#include "orbsvcs/PortableGroup/portablegroup_export.h"
+
+#if !defined (ACE_LACKS_PRAGMA_ONCE)
+# pragma once
+#endif /* ACE_LACKS_PRAGMA_ONCE */
+
+#include "tao/Versioned_Namespace.h"
+
+#include "ace/Service_Config.h"
+#include "ace/Service_Object.h"
+
+
+TAO_BEGIN_VERSIONED_NAMESPACE_DECL
+
+/**
+ * @class TAO_PortableGroup_Adapter
+ *
+ * @brief TAO_PortableGroup_Adapter.
+ *
+ * This class acts as a facade for the PortableGroup library to the
+ * ORB.
+ */
+class TAO_PortableGroup_Export TAO_PortableGroup_Loader
+ : public ACE_Service_Object
+{
+public:
+ /// Constructor.
+ TAO_PortableGroup_Loader (void);
+
+ /// Initialize the PortableGroup loader hooks.
+ virtual int init (int argc,
+ char *[]);
+
+ /// Used to force the initialization of the ORB code.
+ static int Initializer (void);
+};
+
+static int
+TAO_Requires_PortableGroup_Initializer =
+ TAO_PortableGroup_Loader::Initializer ();
+
+TAO_END_VERSIONED_NAMESPACE_DECL
+
+ACE_STATIC_SVC_DECLARE (TAO_PortableGroup_Loader)
+ACE_FACTORY_DECLARE (TAO_PortableGroup, TAO_PortableGroup_Loader)
+
+#include /**/ "ace/post.h"
+
+#endif /* TAO_PORTABLEGROUP_LOADER_H */
diff --git a/TAO/orbsvcs/orbsvcs/PortableGroup/PortableGroup_ORBInitializer.cpp b/TAO/orbsvcs/orbsvcs/PortableGroup/PortableGroup_ORBInitializer.cpp
new file mode 100644
index 00000000000..870c6b75e59
--- /dev/null
+++ b/TAO/orbsvcs/orbsvcs/PortableGroup/PortableGroup_ORBInitializer.cpp
@@ -0,0 +1,71 @@
+// $Id$
+
+#include "orbsvcs/PortableGroup/PortableGroup_ORBInitializer.h"
+#include "orbsvcs/PortableGroup/PortableGroup_Request_Dispatcher.h"
+
+#include "tao/Exception.h"
+#include "tao/ORB_Core.h"
+#include "tao/PI/ORBInitInfo.h"
+#include "tao/debug.h"
+
+ACE_RCSID (PortableGroup,
+ PortableGroup_ORBInitializer,
+ "$Id$")
+
+static const char pg_poa_factory_name[] = "TAO_GOA";
+static const char pg_poa_factory_directive[] = ACE_DYNAMIC_SERVICE_DIRECTIVE(
+ "TAO_GOA", "TAO_PortableGroup", "_make_TAO_PG_Object_Adapter_Factory", "");
+
+TAO_BEGIN_VERSIONED_NAMESPACE_DECL
+
+void
+TAO_PortableGroup_ORBInitializer::pre_init (
+ PortableInterceptor::ORBInitInfo_ptr info
+ ACE_ENV_ARG_DECL)
+ ACE_THROW_SPEC ((CORBA::SystemException))
+{
+ // Narrow to a TAO_ORBInitInfo object to get access to the
+ // orb_core() TAO extension.
+ TAO_ORBInitInfo_var tao_info = TAO_ORBInitInfo::_narrow (info
+ ACE_ENV_ARG_PARAMETER);
+ ACE_CHECK;
+
+ if (CORBA::is_nil (tao_info.in ()))
+ {
+ if (TAO_debug_level > 0)
+ ACE_ERROR ((LM_ERROR,
+ "(%P|%t) PortableGroup_ORBInitializer::pre_init:\n"
+ "(%P|%t) Unable to narrow "
+ "\"PortableInterceptor::ORBInitInfo_ptr\" to\n"
+ "(%P|%t) \"TAO_ORBInitInfo_ptr.\"\n"));
+
+ ACE_THROW (CORBA::INTERNAL ());
+ }
+
+ // Set a new request dispatcher in the ORB.
+ PortableGroup_Request_Dispatcher *rd = 0;
+ ACE_NEW_THROW_EX (rd,
+ PortableGroup_Request_Dispatcher (),
+ CORBA::NO_MEMORY (
+ CORBA::SystemException::_tao_minor_code (
+ TAO::VMCID,
+ ENOMEM),
+ CORBA::COMPLETED_NO));
+ ACE_CHECK;
+
+ tao_info->orb_core ()->request_dispatcher (rd);
+
+ // If the application resolves the root POA, make sure we load the PG POA.
+ TAO_ORB_Core::set_poa_factory (pg_poa_factory_name,
+ pg_poa_factory_directive);
+}
+
+void
+TAO_PortableGroup_ORBInitializer::post_init (
+ PortableInterceptor::ORBInitInfo_ptr
+ ACE_ENV_ARG_DECL_NOT_USED)
+ ACE_THROW_SPEC ((CORBA::SystemException))
+{
+}
+
+TAO_END_VERSIONED_NAMESPACE_DECL
diff --git a/TAO/orbsvcs/orbsvcs/PortableGroup/PortableGroup_ORBInitializer.h b/TAO/orbsvcs/orbsvcs/PortableGroup/PortableGroup_ORBInitializer.h
new file mode 100644
index 00000000000..56f730edd59
--- /dev/null
+++ b/TAO/orbsvcs/orbsvcs/PortableGroup/PortableGroup_ORBInitializer.h
@@ -0,0 +1,61 @@
+// -*- C++ -*-
+
+//=============================================================================
+/**
+ * @file PortableGroup_ORBInitializer.h
+ *
+ * $Id$
+ *
+ * @author Frank Hunleth <fhunleth@cs.wustl.edu>
+ */
+//=============================================================================
+
+
+#ifndef TAO_PORTABLEGROUP_ORB_INITIALIZER_H
+#define TAO_PORTABLEGROUP_ORB_INITIALIZER_H
+
+#include /**/ "ace/pre.h"
+
+#include "orbsvcs/PortableGroup/portablegroup_export.h"
+
+#if !defined (ACE_LACKS_PRAGMA_ONCE)
+# pragma once
+#endif /* ACE_LACKS_PRAGMA_ONCE */
+
+#include "tao/PI/PI.h"
+#include "tao/LocalObject.h"
+
+// This is to remove "inherits via dominance" warnings from MSVC.
+// MSVC is being a little too paranoid.
+#if defined(_MSC_VER)
+#pragma warning(push)
+#pragma warning(disable:4250)
+#endif /* _MSC_VER */
+
+TAO_BEGIN_VERSIONED_NAMESPACE_DECL
+
+/// PortableGroup ORB initializer.
+class TAO_PortableGroup_Export TAO_PortableGroup_ORBInitializer :
+ public virtual PortableInterceptor::ORBInitializer,
+ public virtual TAO_Local_RefCounted_Object
+{
+public:
+ virtual void pre_init (PortableInterceptor::ORBInitInfo_ptr info
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS)
+ ACE_THROW_SPEC ((CORBA::SystemException));
+
+ virtual void post_init (PortableInterceptor::ORBInitInfo_ptr info
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS)
+ ACE_THROW_SPEC ((CORBA::SystemException));
+
+};
+
+TAO_END_VERSIONED_NAMESPACE_DECL
+
+#if defined(_MSC_VER)
+#pragma warning(pop)
+#endif /* _MSC_VER */
+
+#include /**/ "ace/post.h"
+
+#endif /* TAO_PORTABLEGROUP_ORB_INITIALIZER_H */
diff --git a/TAO/orbsvcs/orbsvcs/PortableGroup/PortableGroup_Request_Dispatcher.cpp b/TAO/orbsvcs/orbsvcs/PortableGroup/PortableGroup_Request_Dispatcher.cpp
new file mode 100644
index 00000000000..ae3fbe2d941
--- /dev/null
+++ b/TAO/orbsvcs/orbsvcs/PortableGroup/PortableGroup_Request_Dispatcher.cpp
@@ -0,0 +1,61 @@
+// $Id$
+
+#include "orbsvcs/PortableGroup/UIPMC_Profile.h"
+#include "orbsvcs/PortableGroup/PortableGroup_Request_Dispatcher.h"
+#include "orbsvcs/PortableGroup/PortableGroup_Loader.h"
+
+#include "tao/TAO_Server_Request.h"
+#include "tao/ORB_Core.h"
+
+ACE_RCSID (PortableGroup,
+ PortableGroup_Request_Dispatcher,
+ "$Id$")
+
+TAO_BEGIN_VERSIONED_NAMESPACE_DECL
+
+PortableGroup_Request_Dispatcher::~PortableGroup_Request_Dispatcher (void)
+{
+}
+
+void
+PortableGroup_Request_Dispatcher::dispatch (TAO_ORB_Core *orb_core,
+ TAO_ServerRequest &request,
+ CORBA::Object_out forward_to
+ ACE_ENV_ARG_DECL)
+{
+ // Check if the request contains a tagged profile
+ if (request.profile ().discriminator () == GIOP::ProfileAddr)
+ {
+ // Get the IOP::Tagged profile.
+ const IOP::TaggedProfile &tagged_profile =
+ request.profile ().tagged_profile ();
+ PortableGroup::TagGroupTaggedComponent group;
+
+ // Extract a Group ID from the profile if it exists.
+ int result = TAO_UIPMC_Profile::extract_group_component (tagged_profile,
+ group);
+ if (result == 0)
+ {
+ // Got a group. Dispatch based on the group ID
+ this->group_map_.dispatch (&group,
+ orb_core,
+ request,
+ forward_to
+ ACE_ENV_ARG_PARAMETER);
+ ACE_CHECK;
+
+ return;
+ }
+
+ // Else, fall through and dispatch based on object key like normal.
+ }
+
+ // Dispatch based on object key.
+ orb_core->adapter_registry ()->dispatch (request.object_key (),
+ request,
+ forward_to
+ ACE_ENV_ARG_PARAMETER);
+ ACE_CHECK;
+}
+
+TAO_END_VERSIONED_NAMESPACE_DECL
diff --git a/TAO/orbsvcs/orbsvcs/PortableGroup/PortableGroup_Request_Dispatcher.h b/TAO/orbsvcs/orbsvcs/PortableGroup/PortableGroup_Request_Dispatcher.h
new file mode 100644
index 00000000000..fb6ae13e934
--- /dev/null
+++ b/TAO/orbsvcs/orbsvcs/PortableGroup/PortableGroup_Request_Dispatcher.h
@@ -0,0 +1,70 @@
+//-*- C++ -*-
+
+//=============================================================================
+/**
+ * @file PortableGroup_Request_Dispatcher.h
+ *
+ * $Id$
+ *
+ * A class that strategizes the request dispatching procedure.
+ *
+ * @author Frank Hunleth <fhunleth@cs.wustl.edu>
+ */
+//=============================================================================
+
+
+#ifndef TAO_PORTABLEGROUP_REQUEST_DISPATCHER_H
+#define TAO_PORTABLEGROUP_REQUEST_DISPATCHER_H
+
+#include /**/ "ace/pre.h"
+
+#include "tao/Request_Dispatcher.h"
+
+#include "orbsvcs/PortableGroup/portablegroup_export.h"
+#include "orbsvcs/PortableGroup/Portable_Group_Map.h"
+#include "orbsvcs/PortableGroup/PortableGroup_Acceptor_Registry.h"
+
+TAO_BEGIN_VERSIONED_NAMESPACE_DECL
+
+// Forward declarations.
+class TAO_PortableGroup_Loader;
+
+/**
+ * @class PortableGroup_Request_Dispatcher
+ *
+ * @brief A class that strategizes the request dispatching procedure.
+ *
+ */
+class TAO_PortableGroup_Export PortableGroup_Request_Dispatcher
+ : public TAO_Request_Dispatcher
+{
+ friend class TAO_GOA;
+
+public:
+
+ /// Destructor.
+ virtual ~PortableGroup_Request_Dispatcher (void);
+
+ /**
+ * Dispatch a request.
+ */
+ virtual void dispatch (TAO_ORB_Core *orb_core,
+ TAO_ServerRequest &request,
+ CORBA::Object_out forward_to
+ ACE_ENV_ARG_DECL);
+
+private:
+
+ /// Hash map containing the GroupId->ObjectKey mappings.
+ TAO_Portable_Group_Map group_map_;
+
+ /// Registry for all of the group (multicast) acceptors.
+ TAO_PortableGroup_Acceptor_Registry acceptor_registry_;
+
+};
+
+TAO_END_VERSIONED_NAMESPACE_DECL
+
+#include /**/ "ace/post.h"
+
+#endif /* TAO_PORTABLEGROUP_REQUEST_DISPATCHER_H */
diff --git a/TAO/orbsvcs/orbsvcs/PortableGroup/Portable_Group_Map.cpp b/TAO/orbsvcs/orbsvcs/PortableGroup/Portable_Group_Map.cpp
new file mode 100644
index 00000000000..73745a4460b
--- /dev/null
+++ b/TAO/orbsvcs/orbsvcs/PortableGroup/Portable_Group_Map.cpp
@@ -0,0 +1,180 @@
+// $Id$
+
+#include "orbsvcs/PortableGroup/Portable_Group_Map.h"
+#include "tao/ORB_Core.h"
+#include "tao/TAO_Server_Request.h"
+#include "tao/CDR.h"
+
+ACE_RCSID (PortableGroup,
+ Portable_Group_Map,
+ "$Id$")
+
+TAO_BEGIN_VERSIONED_NAMESPACE_DECL
+
+/// Constructor.
+TAO_Portable_Group_Map::TAO_Portable_Group_Map ()
+{
+}
+
+/// Destructor.
+TAO_Portable_Group_Map::~TAO_Portable_Group_Map (void)
+{
+ for (Iterator i = this->map_.begin ();
+ i != this->map_.end ();
+ ++i)
+ {
+ // Deallocate the id.
+ delete (*i).ext_id_;
+
+ // Delete the chain of Map_Entries.
+ Map_Entry *entry = (*i).int_id_;
+ while (entry)
+ {
+ Map_Entry *next = entry->next;
+ delete entry;
+ entry = next;
+ }
+
+ }
+
+ this->map_.close ();
+}
+
+
+void
+TAO_Portable_Group_Map::add_groupid_objectkey_pair (
+ PortableGroup::TagGroupTaggedComponent *group_id,
+ const TAO::ObjectKey &key
+ ACE_ENV_ARG_DECL
+ )
+{
+ ACE_GUARD (TAO_SYNCH_MUTEX,
+ guard,
+ this->lock_);
+
+ Map_Entry *new_entry;
+
+ // We take ownership of the group_id memory. Be sure we don't
+ // forget about it.
+ PortableGroup::TagGroupTaggedComponent_var safe_group = group_id;
+
+ ACE_NEW_THROW_EX (new_entry,
+ Map_Entry (),
+ CORBA::NO_MEMORY (
+ CORBA::SystemException::_tao_minor_code (
+ TAO::VMCID,
+ ENOMEM),
+ CORBA::COMPLETED_NO));
+ ACE_CHECK;
+
+ // Fill out the entry.
+ new_entry->key = key;
+
+ // First, check if the GroupId is already in the map.
+ Map_Entry *entry;
+ if (this->map_.find (group_id,
+ entry) == 0)
+ {
+ // Add the object key to the list of object keys serviced by this GroupId.
+ new_entry->next = entry->next;
+ entry->next = new_entry;
+ }
+ else
+ {
+ new_entry->next = 0;
+
+ // Add the
+ int result =
+ this->map_.bind (group_id,
+ new_entry);
+
+ if (result != 0)
+ {
+ delete new_entry;
+ ACE_THROW (CORBA::INTERNAL ());
+ }
+
+ // Transfer ownership of group_id to the map.
+ (void) safe_group._retn ();
+ }
+}
+
+void
+TAO_Portable_Group_Map::remove_groupid_objectkey_pair (const PortableGroup::TagGroupTaggedComponent* /*group_id*/,
+ const TAO::ObjectKey &/*key*/
+ ACE_ENV_ARG_DECL_NOT_USED)
+{
+
+}
+
+
+void
+TAO_Portable_Group_Map::dispatch (PortableGroup::TagGroupTaggedComponent* group_id,
+ TAO_ORB_Core *orb_core,
+ TAO_ServerRequest &request,
+ CORBA::Object_out forward_to
+ ACE_ENV_ARG_DECL)
+{
+ ACE_GUARD (TAO_SYNCH_MUTEX,
+ guard,
+ this->lock_);
+
+ // Look up the GroupId.
+ Map_Entry *entry = 0;
+ if (this->map_.find (group_id,
+ entry) == 0)
+ {
+
+ // Save the read pointer in the message block since
+ // every time we dispatch the request, we need to
+ // reset it so that the request demarshals correctly.
+ TAO_InputCDR *tao_in = request.incoming ();
+ ACE_Message_Block *msgblk =
+ const_cast<ACE_Message_Block *> (tao_in->start ());
+ char *read_ptr = msgblk->rd_ptr ();
+
+ // Iterate through the list of ObjectKeys.
+ while (entry)
+ {
+ orb_core->adapter_registry ()->dispatch (entry->key,
+ request,
+ forward_to
+ ACE_ENV_ARG_PARAMETER);
+ ACE_CHECK;
+
+ // Reset the read pointer in the message block.
+ msgblk->rd_ptr (read_ptr);
+ entry = entry->next;
+ }
+ }
+}
+
+u_long
+TAO_GroupId_Hash::operator () (const PortableGroup::TagGroupTaggedComponent *id) const
+{
+ u_long hash =
+ ACE::hash_pjw ((const char *) id->group_domain_id,
+ ACE_OS::strlen ((const char *) id->group_domain_id));
+
+ // Truncate the object_group_id in half for the has.
+ // Divide by one so that the ACE_U_LongLong representation
+ // will automatically cast down to a u_long
+ hash += (u_long) (id->object_group_id / 1);
+
+ hash += id->object_group_ref_version;
+
+ return hash;
+}
+
+int
+TAO_GroupId_Equal_To::operator () (
+ const PortableGroup::TagGroupTaggedComponent *lhs,
+ const PortableGroup::TagGroupTaggedComponent *rhs) const
+{
+ return
+ ACE_OS::strcmp (lhs->group_domain_id, rhs->group_domain_id) == 0
+ && lhs->object_group_id == rhs->object_group_id
+ && lhs->object_group_ref_version == rhs->object_group_ref_version;
+}
+
+TAO_END_VERSIONED_NAMESPACE_DECL
diff --git a/TAO/orbsvcs/orbsvcs/PortableGroup/Portable_Group_Map.h b/TAO/orbsvcs/orbsvcs/PortableGroup/Portable_Group_Map.h
new file mode 100644
index 00000000000..c6c69ae9e11
--- /dev/null
+++ b/TAO/orbsvcs/orbsvcs/PortableGroup/Portable_Group_Map.h
@@ -0,0 +1,139 @@
+// -*- C++ -*-
+
+//=============================================================================
+/**
+ * @file Portable_Group_Map.h
+ *
+ * $Id$
+ *
+ * @author Frank Hunleth <fhunleth@cs.wustl.edu>
+ */
+//=============================================================================
+
+#ifndef TAO_PORTABLE_GROUP_MAP_H
+#define TAO_PORTABLE_GROUP_MAP_H
+
+#include /**/ "ace/pre.h"
+
+#include "orbsvcs/PortableGroup/portablegroup_export.h"
+
+#if !defined (ACE_LACKS_PRAGMA_ONCE)
+# pragma once
+#endif /* ACE_LACKS_PRAGMA_ONCE */
+
+#include "orbsvcs/PortableGroupC.h"
+
+#include "tao/Object_KeyC.h"
+
+#include "ace/Null_Mutex.h"
+#include "ace/Hash_Map_Manager_T.h"
+
+TAO_BEGIN_VERSIONED_NAMESPACE_DECL
+
+class TAO_ServerRequest;
+
+/**
+ * @class TAO_GroupId_Hash
+ *
+ * @brief Hashing class for Group Ids.
+ *
+ * Define the hash() method for Group Ids.
+ */
+class TAO_PortableGroup_Export TAO_GroupId_Hash
+{
+public:
+
+ /// Returns hash value.
+ u_long operator () (const PortableGroup::TagGroupTaggedComponent *id) const;
+};
+
+/**
+ * @class TAO_GroupId_Equal_To
+ *
+ * @brief Hashing class for Group Ids.
+ *
+ * Define the Equal_To () method for Object Ids.
+ */
+class TAO_PortableGroup_Export TAO_GroupId_Equal_To
+{
+public:
+
+ /// Returns 1 if equal.
+ int operator () (const PortableGroup::TagGroupTaggedComponent *lhs,
+ const PortableGroup::TagGroupTaggedComponent *rhs) const;
+};
+
+/**
+ * @class TAO_Portable_Group_Map
+ *
+ * @brief Map of GroupIds to ObjectKeys.
+ */
+class TAO_PortableGroup_Export TAO_Portable_Group_Map
+{
+public:
+
+ /**
+ * @struct Map_Entry
+ *
+ * @brief Value field of the portable group map.
+ */
+ struct Map_Entry
+ {
+ /// The key.
+ TAO::ObjectKey key;
+
+ /// next ObjectKey in the group.
+ struct Map_Entry *next;
+ };
+
+ /// Constructor.
+ TAO_Portable_Group_Map ();
+
+ /// Destructor.
+ ~TAO_Portable_Group_Map (void);
+
+ /// Add a GroupId->ObjectKey mapping to the map.
+ /// This function takes ownership of the memory pointed to be group_id
+ void add_groupid_objectkey_pair (PortableGroup::TagGroupTaggedComponent *group_id,
+ const TAO::ObjectKey &key
+ ACE_ENV_ARG_DECL);
+
+
+ /// Remove a GroupId->ObjectKey mapping from the map.
+ void remove_groupid_objectkey_pair (const PortableGroup::TagGroupTaggedComponent* group_id,
+ const TAO::ObjectKey &key
+ ACE_ENV_ARG_DECL);
+
+ /// Dispatch a request to all of the ObjectIds that belong to
+ /// the specified group.
+ void dispatch (PortableGroup::TagGroupTaggedComponent* group_id,
+ TAO_ORB_Core *orb_core,
+ TAO_ServerRequest &request,
+ CORBA::Object_out forward_to
+ ACE_ENV_ARG_DECL);
+
+ /// Id hash map.
+ typedef ACE_Hash_Map_Manager_Ex<
+ PortableGroup::TagGroupTaggedComponent *,
+ Map_Entry *,
+ TAO_GroupId_Hash,
+ TAO_GroupId_Equal_To,
+ ACE_Null_Mutex> GroupId_Table;
+ typedef GroupId_Table::iterator Iterator;
+
+protected:
+ /// Lock used to synchronize access to map_.
+ TAO_SYNCH_MUTEX lock_;
+
+ /// Id map.
+ GroupId_Table map_;
+};
+
+TAO_END_VERSIONED_NAMESPACE_DECL
+
+//#if defined (__ACE_INLINE__)
+//# include "Portable_Group_Map.i"
+//#endif /* __ACE_INLINE__ */
+
+#include /**/ "ace/post.h"
+#endif /* TAO_PORTABLE_GROUP_MAP_H */
diff --git a/TAO/orbsvcs/orbsvcs/PortableGroup/README b/TAO/orbsvcs/orbsvcs/PortableGroup/README
new file mode 100644
index 00000000000..7faf4cd6e46
--- /dev/null
+++ b/TAO/orbsvcs/orbsvcs/PortableGroup/README
@@ -0,0 +1,43 @@
+$Id$
+
+This directory contains an implementation of the MIOP specification
+for TAO. This currently includes:
+
+ . The UIPMC (Unreliable IP multicast) Pluggable Protocol
+ . The PortableGroup extensions to the POA
+ . Request dispatch hooks to TAO to dispatch based on GroupID
+
+For examples on how to use MIOP, see $TAO_ROOT/orbsvcs/tests/Miop.
+
+Compilation Note:
+
+The PortableGroup library requires the CosNaming library due to references
+to it in the IDL from the MIOP specification. It is not really used in
+actual implementation.
+
+Implementation Notes:
+
+The current MIOP implementation is usable, but not complete according
+to the final MIOP specification. The following are current limitations:
+
+ 1. MIOP packet reassembly. This limits requests to about 5-6K in length
+ depending on the platform. Miop packet segmentation is available,
+ but not completely tested.
+
+ 2. Disassociating a group reference from a servant is not implemented.
+ If interested in fixing this, be aware of the race conditions if a
+ servant disassociates during an upcall. The TAO event services all
+ have code to handle this issue.
+
+ 3. Clients must call _unchecked_narrow to narrow any group references
+ since a multicast group manager isn't supported yet (and UIPMC does
+ not support twoway invocations)
+
+ 4. TAO does not have a multicast group manager, so groups must be
+ assigned by creating a MIOP CORBALOC formatted reference. See
+ the tests or the MIOP specification for example group references.
+
+ 5. TAO does not have a multicast gateway implementation, so using MIOP
+ is currently limited to networks that natively support multicast
+
+
diff --git a/TAO/orbsvcs/orbsvcs/PortableGroup/UIPMC_Acceptor.cpp b/TAO/orbsvcs/orbsvcs/PortableGroup/UIPMC_Acceptor.cpp
new file mode 100644
index 00000000000..1b3377b9f19
--- /dev/null
+++ b/TAO/orbsvcs/orbsvcs/PortableGroup/UIPMC_Acceptor.cpp
@@ -0,0 +1,354 @@
+// This may look like C, but it's really -*- C++ -*-
+//
+// $Id$
+
+#include "orbsvcs/PortableGroup/UIPMC_Profile.h"
+#include "orbsvcs/PortableGroup/UIPMC_Acceptor.h"
+
+#include "tao/MProfile.h"
+#include "tao/ORB_Core.h"
+#include "tao/debug.h"
+#include "tao/Protocols_Hooks.h"
+#include "tao/ORB_Constants.h"
+
+#include "ace/Auto_Ptr.h"
+#include "ace/os_include/os_netdb.h"
+
+#if !defined(__ACE_INLINE__)
+#include "orbsvcs/PortableGroup/UIPMC_Acceptor.i"
+#endif /* __ACE_INLINE__ */
+
+ACE_RCSID (PortableGroup,
+ UIPMC_Acceptor,
+ "$Id$")
+
+TAO_BEGIN_VERSIONED_NAMESPACE_DECL
+
+TAO_UIPMC_Acceptor::TAO_UIPMC_Acceptor (CORBA::Boolean /*flag*/)
+ : TAO_Acceptor (IOP::TAG_UIPMC),
+ addrs_ (0),
+ hosts_ (0),
+ endpoint_count_ (0),
+ version_ (TAO_DEF_GIOP_MAJOR, TAO_DEF_GIOP_MINOR),
+ orb_core_ (0),
+ connection_handler_ (0)
+{
+}
+
+TAO_UIPMC_Acceptor::~TAO_UIPMC_Acceptor (void)
+{
+ // Make sure we are closed before we start destroying the
+ // strategies.
+ this->close ();
+
+ delete [] this->addrs_;
+
+ for (size_t i = 0; i < this->endpoint_count_; ++i)
+ CORBA::string_free (this->hosts_[i]);
+
+ delete [] this->hosts_;
+}
+
+int
+TAO_UIPMC_Acceptor::create_profile (const TAO::ObjectKey &,
+ TAO_MProfile &,
+ CORBA::Short)
+{
+ // The standard mechanism for adding profiles to object references
+ // for each pluggable protocol doesn't apply to UIPMC profiles, so
+ // this function just returns success without doing anything. The
+ // appropiate mechanism for getting UIPMC profiles is to call the
+ // multicast group manager to get a Group reference. Invocations
+ // sent to this group reference will be dispatched to the servants
+ // that belong to that group.
+ return 0;
+}
+
+int
+TAO_UIPMC_Acceptor::is_collocated (const TAO_Endpoint *)
+{
+ // @@ Not clear how
+ // to best handle collation. For example, one servant could
+ // be collocated, but we still need to send the request out on
+ // the network to see if there are any other servants in the
+ // group.
+ return 0; // Not collocated
+}
+
+int
+TAO_UIPMC_Acceptor::close (void)
+{
+ return 0;
+}
+
+int
+TAO_UIPMC_Acceptor::open (TAO_ORB_Core *orb_core,
+ ACE_Reactor *reactor,
+ int major,
+ int minor,
+ const char *address,
+ const char *options)
+{
+ this->orb_core_ = orb_core;
+
+ if (this->hosts_ != 0)
+ {
+ // The hostname cache has already been set!
+ // This is bad mojo, i.e. an internal TAO error.
+ ACE_ERROR_RETURN ((LM_ERROR,
+ ACE_TEXT ("TAO (%P|%t) ")
+ ACE_TEXT ("UIPMC_Acceptor::open - ")
+ ACE_TEXT ("hostname already set\n\n")),
+ -1);
+ }
+
+ if (address == 0)
+ return -1;
+
+ if (major >=0 && minor >= 0)
+ this->version_.set_version (static_cast<CORBA::Octet> (major),
+ static_cast<CORBA::Octet> (minor));
+ // Parse options
+ if (this->parse_options (options) == -1)
+ return -1;
+
+ ACE_INET_Addr addr;
+
+ const char *port_separator_loc = ACE_OS::strchr (address, ':');
+ const char *specified_hostname = 0;
+ char tmp_host[MAXHOSTNAMELEN + 1];
+
+ // Both host and port have to be specified.
+ if (addr.set (address) != 0)
+ return -1;
+
+ // Extract out just the host part of the address.
+ size_t len = port_separator_loc - address;
+ ACE_OS::memcpy (tmp_host, address, len);
+ tmp_host[len] = '\0';
+
+ specified_hostname = tmp_host;
+
+ this->endpoint_count_ = 1; // Only one hostname to store
+
+ ACE_NEW_RETURN (this->addrs_,
+ ACE_INET_Addr[this->endpoint_count_],
+ -1);
+
+ ACE_NEW_RETURN (this->hosts_,
+ char *[this->endpoint_count_],
+ -1);
+
+ this->hosts_[0] = 0;
+
+ if (this->hostname (orb_core,
+ addr,
+ this->hosts_[0],
+ specified_hostname) != 0)
+ return -1;
+
+ // Copy the addr. The port is (re)set in
+ // TAO_UIPMC_Acceptor::open_i().
+ if (this->addrs_[0].set (addr) != 0)
+ return -1;
+
+ return this->open_i (addr,
+ reactor);
+}
+
+int
+TAO_UIPMC_Acceptor::open_default (TAO_ORB_Core *,
+ ACE_Reactor *,
+ int,
+ int,
+ const char *)
+{
+ // There is no such thing as a default multicast listen
+ // port. The mechanism for choosing these ports is done
+ // when creating the group ids. (I.e. not here).
+ return -1;
+}
+
+int
+TAO_UIPMC_Acceptor::open_i (const ACE_INET_Addr& addr,
+ ACE_Reactor *reactor)
+{
+ ACE_NEW_RETURN (this->connection_handler_,
+ TAO_UIPMC_Connection_Handler (this->orb_core_),
+ -1);
+
+ this->connection_handler_->local_addr (addr);
+ this->connection_handler_->open_server ();
+
+ int result =
+ reactor->register_handler (this->connection_handler_,
+ ACE_Event_Handler::READ_MASK);
+ if (result == -1)
+ return result;
+
+ // Connection handler ownership now belongs to the Reactor.
+ this->connection_handler_->remove_reference ();
+
+ // Set the port for each addr. If there is more than one network
+ // interface then the endpoint created on each interface will be on
+ // the same port. This is how a wildcard socket bind() is supposed
+ // to work.
+ u_short port = addr.get_port_number ();
+ for (size_t j = 0; j < this->endpoint_count_; ++j)
+ this->addrs_[j].set_port_number (port, 1);
+
+ if (TAO_debug_level > 5)
+ {
+ for (size_t i = 0; i < this->endpoint_count_; ++i)
+ {
+ ACE_DEBUG ((LM_DEBUG,
+ ACE_TEXT ("\nTAO (%P|%t) UIPMC_Acceptor::open_i - ")
+ ACE_TEXT ("listening on: <%s:%u>\n"),
+ this->hosts_[i],
+ this->addrs_[i].get_port_number ()));
+ }
+ }
+
+ return 0;
+}
+
+int
+TAO_UIPMC_Acceptor::hostname (TAO_ORB_Core *,
+ ACE_INET_Addr &addr,
+ char *&host,
+ const char *)
+{
+ // Only have dotted decimal addresses for multicast.
+ return this->dotted_decimal_address (addr, host);
+}
+
+int
+TAO_UIPMC_Acceptor::dotted_decimal_address (ACE_INET_Addr &addr,
+ char *&host)
+{
+ const char *tmp = addr.get_host_addr ();
+ if (tmp == 0)
+ {
+ if (TAO_debug_level > 0)
+ ACE_DEBUG ((LM_DEBUG,
+ ACE_TEXT ("\n\nTAO (%P|%t) ")
+ ACE_TEXT ("UIPMC_Acceptor::dotted_decimal_address ")
+ ACE_TEXT ("- %p\n\n"),
+ ACE_TEXT ("cannot determine hostname")));
+ return -1;
+ }
+
+ host = CORBA::string_dup (tmp);
+ return 0;
+}
+
+CORBA::ULong
+TAO_UIPMC_Acceptor::endpoint_count (void)
+{
+ return this->endpoint_count_;
+}
+
+int
+TAO_UIPMC_Acceptor::object_key (IOP::TaggedProfile &,
+ TAO::ObjectKey &)
+{
+ // No object key to extract. Just return success.
+ return 1;
+}
+
+
+int
+TAO_UIPMC_Acceptor::parse_options (const char *str)
+{
+ if (str == 0)
+ return 0; // No options to parse. Not a problem.
+
+ // Use an option format similar to the one used for CGI scripts in
+ // HTTP URLs.
+ // e.g.: option1=foo&option2=bar
+
+ ACE_CString options (str);
+
+ size_t len = options.length ();
+
+ const char option_delimiter = '&';
+
+ // Count the number of options.
+
+ CORBA::ULong option_count = 1;
+ // Number of endpoints in the string (initialized to 1).
+
+ // Only check for endpoints after the protocol specification and
+ // before the object key.
+ for (size_t i = 0; i < len; ++i)
+ if (options[i] == option_delimiter)
+ ++option_count;
+
+ // The idea behind the following loop is to split the options into
+ // (option, name) pairs.
+ // For example,
+ // `option1=foo&option2=bar'
+ // will be parsed into:
+ // `option1=foo'
+ // `option2=bar'
+
+ ACE_CString::size_type begin = 0;
+ ACE_CString::size_type end = 0;
+
+ for (CORBA::ULong j = 0; j < option_count; ++j)
+ {
+ if (j < option_count - 1)
+ end = options.find (option_delimiter, begin);
+ else
+ end = len;
+
+ if (end == begin)
+ ACE_ERROR_RETURN ((LM_ERROR,
+ ACE_TEXT ("TAO (%P|%t) Zero length UIPMC option.\n")),
+ -1);
+ else if (end != ACE_CString::npos)
+ {
+ ACE_CString opt = options.substring (begin, end);
+
+ ACE_CString::size_type const slot = opt.find ("=");
+
+ if (slot == len - 1
+ || slot == ACE_CString::npos)
+ ACE_ERROR_RETURN ((LM_ERROR,
+ ACE_TEXT ("TAO (%P|%t) UIPMC option <%s> is ")
+ ACE_TEXT ("missing a value.\n"),
+ opt.c_str ()),
+ -1);
+
+ ACE_CString name = opt.substring (0, slot);
+ ACE_CString value = opt.substring (slot + 1);
+
+ if (name.length () == 0)
+ ACE_ERROR_RETURN ((LM_ERROR,
+ ACE_TEXT ("TAO (%P|%t) Zero length UIPMC ")
+ ACE_TEXT ("option name.\n")),
+ -1);
+
+ if (name == "priority")
+ {
+ ACE_ERROR_RETURN ((LM_ERROR,
+ ACE_TEXT ("TAO (%P|%t) Invalid UIPMC endpoint format: ")
+ ACE_TEXT ("endpoint priorities no longer supported. \n"),
+ value.c_str ()),
+ -1);
+ }
+ else
+ ACE_ERROR_RETURN ((LM_ERROR,
+ ACE_TEXT ("TAO (%P|%t) Invalid UIPMC option: <%s>\n"),
+ name.c_str ()),
+ -1);
+
+ begin = end + 1;
+ }
+ else
+ break; // No other options.
+ }
+ return 0;
+}
+
+TAO_END_VERSIONED_NAMESPACE_DECL
diff --git a/TAO/orbsvcs/orbsvcs/PortableGroup/UIPMC_Acceptor.h b/TAO/orbsvcs/orbsvcs/PortableGroup/UIPMC_Acceptor.h
new file mode 100644
index 00000000000..6c783e885c1
--- /dev/null
+++ b/TAO/orbsvcs/orbsvcs/PortableGroup/UIPMC_Acceptor.h
@@ -0,0 +1,160 @@
+// -*- C++ -*-
+
+//=============================================================================
+/**
+ * @file UIPMC_Acceptor.h
+ *
+ * $Id$
+ *
+ * MIOP specific acceptor processing
+ *
+ * @author Frank Hunleth <fhunleth@cs.wustl.edu>
+ */
+//=============================================================================
+
+#ifndef TAO_UIPMC_ACCEPTOR_H
+#define TAO_UIPMC_ACCEPTOR_H
+
+#include /**/ "ace/pre.h"
+
+#include "orbsvcs/PortableGroup/UIPMC_Connection_Handler.h"
+
+#if !defined (ACE_LACKS_PRAGMA_ONCE)
+# pragma once
+#endif /* ACE_LACKS_PRAGMA_ONCE */
+
+#include "tao/Transport_Acceptor.h"
+#include "tao/Acceptor_Impl.h"
+#include "tao/GIOP_Message_State.h"
+
+#include "ace/Acceptor.h"
+#include "ace/SOCK_Acceptor.h"
+
+#include "orbsvcs/PortableGroup/portablegroup_export.h"
+
+TAO_BEGIN_VERSIONED_NAMESPACE_DECL
+
+// TAO UIPMC_Acceptor concrete call defination
+
+/**
+ * @class TAO_UIPMC_Acceptor
+ *
+ * @brief TAO_UIPMC_Acceptor
+ *
+ * The UIPMC-specific bridge class for the concrete acceptor.
+ */
+class TAO_PortableGroup_Export TAO_UIPMC_Acceptor : public TAO_Acceptor
+{
+public:
+ /// Constructor.
+ TAO_UIPMC_Acceptor (CORBA::Boolean flag = 0);
+
+ /// Destructor.
+ ~TAO_UIPMC_Acceptor (void);
+
+ /// @@ Helper method for the implementation repository, should go
+ /// away
+ const ACE_INET_Addr& address (void) const;
+
+ /// Returns the array of endpoints in this acceptor
+ const ACE_INET_Addr *endpoints (void);
+
+ /**
+ * The TAO_Acceptor methods, check the documentation in
+ * Pluggable.h for details.
+ */
+ virtual int open (TAO_ORB_Core *orb_core,
+ ACE_Reactor *reactor,
+ int version_major,
+ int version_minor,
+ const char *address,
+ const char *options = 0);
+ virtual int open_default (TAO_ORB_Core *orb_core,
+ ACE_Reactor *reactor,
+ int version_major,
+ int version_minor,
+ const char *options = 0);
+ virtual int close (void);
+ virtual int create_profile (const TAO::ObjectKey &object_key,
+ TAO_MProfile &mprofile,
+ CORBA::Short priority);
+ virtual int is_collocated (const TAO_Endpoint *endpoint);
+ virtual CORBA::ULong endpoint_count (void);
+
+ virtual int object_key (IOP::TaggedProfile &profile,
+ TAO::ObjectKey &key);
+
+ /**
+ * Set the host name for the given addr.
+ * A hostname may be forced by using specified_hostname. This
+ * is useful if the given address corresponds to more than one
+ * hostname and the desired one cannot be determined in any
+ * other way.
+ */
+ int hostname (TAO_ORB_Core *orb_core,
+ ACE_INET_Addr &addr,
+ char *&host,
+ const char *specified_hostname = 0);
+
+ /**
+ * Set the host name for the given address using the dotted decimal
+ * format.
+ */
+ int dotted_decimal_address (ACE_INET_Addr &addr,
+ char *&host);
+
+protected:
+
+ /**
+ * Implement the common part of the open*() methods. This method is
+ * virtual to allow a derived class implementation to be invoked
+ * instead.
+ */
+ virtual int open_i (const ACE_INET_Addr &addr,
+ ACE_Reactor *reactor);
+
+ /// Parse protocol specific options.
+ virtual int parse_options (const char *options);
+
+protected:
+
+ /// Array of ACE_INET_Addr instances, each one corresponding to a
+ /// given network interface.
+ ACE_INET_Addr *addrs_;
+
+ /**
+ * Cache the information about the endpoints serviced by this
+ * acceptor.
+ * There may in fact be multiple hostnames for this endpoint. For
+ * example, if the IP address is INADDR_ANY (0.0.0.0) then there
+ * will be possibly a different hostname for each interface.
+ */
+ char **hosts_;
+
+ /// The number of host names cached in the hosts_ array (equivalent
+ /// to the number of endpoints opened by this Acceptor).
+ CORBA::ULong endpoint_count_;
+
+ /**
+ * The GIOP version for this endpoint
+ * @@ Theoretically this shouldn't be here!! We need to look at a
+ * way to move this out
+ */
+ TAO_GIOP_Message_Version version_;
+
+ /// ORB Core.
+ TAO_ORB_Core *orb_core_;
+
+private:
+
+ TAO_UIPMC_Connection_Handler *connection_handler_;
+};
+
+TAO_END_VERSIONED_NAMESPACE_DECL
+
+#if defined(__ACE_INLINE__)
+#include "orbsvcs/PortableGroup/UIPMC_Acceptor.i"
+#endif /* __ACE_INLINE__ */
+
+#include /**/ "ace/post.h"
+#endif /* TAO_UIPMC_ACCEPTOR_H */
diff --git a/TAO/orbsvcs/orbsvcs/PortableGroup/UIPMC_Acceptor.i b/TAO/orbsvcs/orbsvcs/PortableGroup/UIPMC_Acceptor.i
new file mode 100644
index 00000000000..ec296d0f9b6
--- /dev/null
+++ b/TAO/orbsvcs/orbsvcs/PortableGroup/UIPMC_Acceptor.i
@@ -0,0 +1,29 @@
+// -*- C++ -*-
+//
+// $Id$
+
+
+TAO_BEGIN_VERSIONED_NAMESPACE_DECL
+
+ACE_INLINE const ACE_INET_Addr&
+TAO_UIPMC_Acceptor::address (void) const
+{
+ ACE_ASSERT (this->addrs_ != 0);
+
+ // @@ This is busted.
+ // The Implementation Repository will have to start supporting
+ // IORs with multiple profiles. For now, we just return the
+ // first addr.
+ // -Ossama
+ return this->addrs_[0];
+}
+
+ACE_INLINE const ACE_INET_Addr *
+TAO_UIPMC_Acceptor::endpoints (void)
+{
+ ACE_ASSERT (this->addrs_ != 0);
+
+ return this->addrs_;
+}
+
+TAO_END_VERSIONED_NAMESPACE_DECL
diff --git a/TAO/orbsvcs/orbsvcs/PortableGroup/UIPMC_Connection_Handler.cpp b/TAO/orbsvcs/orbsvcs/PortableGroup/UIPMC_Connection_Handler.cpp
new file mode 100644
index 00000000000..df2fbd006c7
--- /dev/null
+++ b/TAO/orbsvcs/orbsvcs/PortableGroup/UIPMC_Connection_Handler.cpp
@@ -0,0 +1,267 @@
+// This may look like C, but it's really -*- C++ -*-
+//
+// $Id$
+
+
+#include "orbsvcs/PortableGroup/UIPMC_Connection_Handler.h"
+#include "orbsvcs/PortableGroup/UIPMC_Transport.h"
+#include "orbsvcs/PortableGroup/UIPMC_Endpoint.h"
+
+#include "tao/Timeprobe.h"
+#include "tao/debug.h"
+#include "tao/ORB_Core.h"
+#include "tao/ORB.h"
+#include "tao/CDR.h"
+#include "tao/Server_Strategy_Factory.h"
+#include "tao/Transport_Cache_Manager.h"
+#include "tao/Thread_Lane_Resources.h"
+#include "tao/Base_Transport_Property.h"
+#include "tao/Resume_Handle.h"
+
+
+ACE_RCSID(PortableGroup,
+ UIPMC_Connection_Handler,
+ "$Id$")
+
+TAO_BEGIN_VERSIONED_NAMESPACE_DECL
+
+TAO_UIPMC_Connection_Handler::TAO_UIPMC_Connection_Handler (ACE_Thread_Manager *t)
+ : TAO_UIPMC_SVC_HANDLER (t, 0 , 0),
+ TAO_Connection_Handler (0),
+ udp_socket_ (ACE_sap_any_cast (ACE_INET_Addr &)),
+ mcast_socket_ (),
+ using_mcast_ (0)
+{
+ // This constructor should *never* get called, it is just here to
+ // make the compiler happy: the default implementation of the
+ // Creation_Strategy requires a constructor with that signature, we
+ // don't use that implementation, but some (most?) compilers
+ // instantiate it anyway.
+ ACE_ASSERT (0);
+}
+
+
+TAO_UIPMC_Connection_Handler::TAO_UIPMC_Connection_Handler (TAO_ORB_Core *orb_core)
+ : TAO_UIPMC_SVC_HANDLER (orb_core->thr_mgr (), 0, 0),
+ TAO_Connection_Handler (orb_core),
+ udp_socket_ (ACE_sap_any_cast (ACE_INET_Addr &)),
+ mcast_socket_ (),
+ using_mcast_ (0)
+{
+ TAO_UIPMC_Transport* specific_transport = 0;
+ ACE_NEW(specific_transport,
+ TAO_UIPMC_Transport(this, orb_core, 0));
+
+ // store this pointer (indirectly increment ref count)
+ this->transport (specific_transport);
+}
+
+
+TAO_UIPMC_Connection_Handler::~TAO_UIPMC_Connection_Handler (void)
+{
+ if (this->using_mcast_)
+ {
+ // Closing a multicast socket automatically unsubscribes us from
+ // the multicast group.
+ this->mcast_socket_.close ();
+ }
+ else
+ this->udp_socket_.close ();
+
+ delete this->transport ();
+}
+
+ACE_HANDLE
+TAO_UIPMC_Connection_Handler::get_handle (void) const
+{
+ if (this->using_mcast_)
+ return this->mcast_socket_.get_handle ();
+ else
+ return this->udp_socket_.get_handle ();
+}
+
+const ACE_INET_Addr &
+TAO_UIPMC_Connection_Handler::addr (void)
+{
+ return this->addr_;
+}
+
+
+void
+TAO_UIPMC_Connection_Handler::addr (const ACE_INET_Addr &addr)
+{
+ this->addr_ = addr;
+}
+
+
+const ACE_INET_Addr &
+TAO_UIPMC_Connection_Handler::local_addr (void)
+{
+ return local_addr_;
+}
+
+
+void
+TAO_UIPMC_Connection_Handler::local_addr (const ACE_INET_Addr &addr)
+{
+ local_addr_ = addr;
+}
+
+
+const ACE_SOCK_Dgram &
+TAO_UIPMC_Connection_Handler::dgram (void)
+{
+ return this->udp_socket_;
+}
+
+const ACE_SOCK_Dgram_Mcast &
+TAO_UIPMC_Connection_Handler::mcast_dgram (void)
+{
+ return this->mcast_socket_;
+}
+
+
+int
+TAO_UIPMC_Connection_Handler::open_handler (void *v)
+{
+ return this->open (v);
+}
+
+int
+TAO_UIPMC_Connection_Handler::open (void*)
+{
+ this->udp_socket_.open (this->local_addr_);
+
+ if(TAO_debug_level > 5)
+ {
+ ACE_DEBUG ((LM_DEBUG,
+ ACE_TEXT("TAO (%P|%t) TAO_UIPMC_Connection_Handler::open, ")
+ ACE_TEXT("listening on: <%s:%u>\n"),
+ this->local_addr_.get_host_addr (),
+ this->local_addr_.get_port_number ()));
+ }
+
+ this->using_mcast_ = 0;
+
+ // Set that the transport is now connected, if fails we return -1
+ // Use C-style cast b/c otherwise we get warnings on lots of
+ // compilers
+ if (!this->transport ()->post_open ((size_t) this->udp_socket_.get_handle ()))
+ return -1;
+
+ return 0;
+}
+
+int
+TAO_UIPMC_Connection_Handler::open_server (void)
+{
+ this->mcast_socket_.join (this->local_addr_);
+ if( TAO_debug_level > 5)
+ {
+ ACE_DEBUG ((LM_DEBUG,
+ ACE_TEXT("TAO (%P|%t) TAO_UIPMC_Connection_Handler::open_server, ")
+ ACE_TEXT("subcribed to multicast group at %s:%d\n"),
+ this->local_addr_.get_host_addr (),
+ this->local_addr_.get_port_number ()
+ ));
+ }
+
+ this->transport ()->id ((size_t) this->mcast_socket_.get_handle ());
+ this->using_mcast_ = 1;
+
+ return 0;
+}
+
+int
+TAO_UIPMC_Connection_Handler::resume_handler (void)
+{
+ return ACE_Event_Handler::ACE_APPLICATION_RESUMES_HANDLER;
+}
+
+int
+TAO_UIPMC_Connection_Handler::close_connection (void)
+{
+ return this->close_connection_eh (this);
+}
+
+int
+TAO_UIPMC_Connection_Handler::handle_input (ACE_HANDLE h)
+{
+ return this->handle_input_eh (h, this);
+}
+
+int
+TAO_UIPMC_Connection_Handler::handle_output (ACE_HANDLE handle)
+{
+ int result =
+ this->handle_output_eh (handle, this);
+
+ if (result == -1)
+ {
+ this->close_connection ();
+ return 0;
+ }
+
+ return result;
+}
+
+int
+TAO_UIPMC_Connection_Handler::handle_timeout (const ACE_Time_Value &,
+ const void *)
+{
+ // We don't use this upcall for I/O. This is only used by the
+ // Connector to indicate that the connection timedout. Therefore,
+ // we should call close().
+ return this->close ();
+}
+
+int
+TAO_UIPMC_Connection_Handler::handle_close (ACE_HANDLE,
+ ACE_Reactor_Mask)
+{
+ // No asserts here since the handler is registered with the Reactor
+ // and the handler ownership is given to the Reactor. When the
+ // Reactor closes, it will call handle_close() on the handler. It
+ // is however important to overwrite handle_close() to do nothing
+ // since the base class does too much.
+ return 0;
+}
+
+int
+TAO_UIPMC_Connection_Handler::close (u_long)
+{
+ this->state_changed (TAO_LF_Event::LFS_CONNECTION_CLOSED,
+ this->orb_core ()->leader_follower ());
+ this->transport ()->remove_reference ();
+ return 0;
+}
+
+int
+TAO_UIPMC_Connection_Handler::release_os_resources (void)
+{
+ return this->peer().close ();
+}
+
+int
+TAO_UIPMC_Connection_Handler::add_transport_to_cache (void)
+{
+ ACE_INET_Addr addr;
+
+ // This function is called by the acceptor to add this
+ // transport to the transport cache. This is really
+ // important for proper shutdown. The address used
+ // is irrelevent, since UIPMC is connectionless.
+
+ // Construct a UIPMC_Endpoint object.
+ TAO_UIPMC_Endpoint endpoint (addr);
+
+ // Construct a property object
+ TAO_Base_Transport_Property prop (&endpoint);
+
+ // Add the handler to Cache
+ return this->orb_core ()->lane_resources ()
+ .transport_cache ().cache_transport (&prop,
+ this->transport ());
+}
+
+TAO_END_VERSIONED_NAMESPACE_DECL
diff --git a/TAO/orbsvcs/orbsvcs/PortableGroup/UIPMC_Connection_Handler.h b/TAO/orbsvcs/orbsvcs/PortableGroup/UIPMC_Connection_Handler.h
new file mode 100644
index 00000000000..51153c2d196
--- /dev/null
+++ b/TAO/orbsvcs/orbsvcs/PortableGroup/UIPMC_Connection_Handler.h
@@ -0,0 +1,149 @@
+// -*- C++ -*-
+
+//=============================================================================
+/**
+ * @file UIPMC_Connection_Handler.h
+ *
+ * $Id$
+ *
+ * @author Frank Hunleth <fhunleth@cs.wustl.edu>
+ */
+//=============================================================================
+
+#ifndef TAO_UIPMC_CONNECTION_HANDLER_H
+#define TAO_UIPMC_CONNECTION_HANDLER_H
+
+#include /**/ "ace/pre.h"
+
+#include "orbsvcs/PortableGroup/portablegroup_export.h"
+
+#if !defined (ACE_LACKS_PRAGMA_ONCE)
+#pragma once
+#endif /* ACE_LACKS_PRAGMA_ONCE */
+
+#include "orbsvcs/PortableGroup/UIPMC_Transport.h"
+
+#include "tao/Wait_Strategy.h"
+#include "tao/Connection_Handler.h"
+
+#include "ace/Acceptor.h"
+#include "ace/Reactor.h"
+#include "ace/SOCK_Dgram_Mcast.h"
+#include "ace/SOCK_Dgram.h"
+
+
+TAO_BEGIN_VERSIONED_NAMESPACE_DECL
+
+// Forward Decls
+class TAO_Pluggable_Messaging;
+
+// ****************************************************************
+
+/**
+ * @class TAO_UIPMC_Connection_Handler
+ *
+ * @brief Handles requests on a single connection.
+ *
+ * The Connection handler which is common for the Acceptor and
+ * the Connector
+ */
+class TAO_PortableGroup_Export TAO_UIPMC_Connection_Handler :
+ public TAO_UIPMC_SVC_HANDLER,
+ public TAO_Connection_Handler
+{
+
+public:
+
+ TAO_UIPMC_Connection_Handler (ACE_Thread_Manager* t = 0);
+
+ /// Constructor. <arg> parameter is used by the Acceptor to pass the
+ /// protocol configuration properties for this connection.
+ TAO_UIPMC_Connection_Handler (TAO_ORB_Core *orb_core);
+
+
+ /// Destructor.
+ ~TAO_UIPMC_Connection_Handler (void);
+
+ //@{
+ /** @name Connection Handler overloads
+ */
+ virtual int open_handler (void *v);
+ //@}
+
+ // @@ Frank: Similar to open, but called on server
+ virtual int open_server (void);
+
+ /// Close called by the Acceptor or Connector when connection
+ /// establishment fails.
+ int close (u_long = 0);
+
+ //@{
+ /** @name Event Handler overloads
+ */
+ virtual int resume_handler (void);
+ virtual int close_connection (void);
+ virtual int handle_input (ACE_HANDLE);
+ virtual int handle_output (ACE_HANDLE);
+ virtual int handle_close (ACE_HANDLE, ACE_Reactor_Mask);
+ virtual int handle_timeout (const ACE_Time_Value &current_time,
+ const void *act = 0);
+ virtual int open (void *);
+ //@}
+
+ /// Add ourselves to Cache.
+ int add_transport_to_cache (void);
+
+ // UIPMC Additions - Begin
+ ACE_HANDLE get_handle (void) const;
+
+ const ACE_INET_Addr &addr (void);
+
+ void addr (const ACE_INET_Addr &addr);
+
+ const ACE_INET_Addr &local_addr (void);
+
+ void local_addr (const ACE_INET_Addr &addr);
+
+ const ACE_INET_Addr &server_addr (void);
+
+ void server_addr (const ACE_INET_Addr &addr);
+
+ const ACE_SOCK_Dgram &dgram (void);
+
+ const ACE_SOCK_Dgram_Mcast &mcast_dgram (void);
+ // UIPMC Additions - End
+
+protected:
+
+ // UIPMC Additions - Begin
+
+ /// Client side UDP socket (send only).
+ ACE_SOCK_Dgram udp_socket_;
+
+ /// Server side Mcast UDP socket (receive only).
+ ACE_SOCK_Dgram_Mcast mcast_socket_;
+
+ /// Flag that specifies whether multicast is in use or not.
+ CORBA::Boolean using_mcast_;
+
+ // This is always the remote address
+ ACE_INET_Addr addr_;
+
+ // This is always the local address for the connector
+ ACE_INET_Addr local_addr_;
+
+ // UIPMC Additions - End
+
+ //@{
+ /**
+ * @name TAO_Connection Handler overloads
+ */
+ virtual int release_os_resources (void);
+ //@}
+
+};
+
+TAO_END_VERSIONED_NAMESPACE_DECL
+
+#include /**/ "ace/post.h"
+#endif /* TAO_UIPMC_CONNECTION_HANDLER_H */
diff --git a/TAO/orbsvcs/orbsvcs/PortableGroup/UIPMC_Connector.cpp b/TAO/orbsvcs/orbsvcs/PortableGroup/UIPMC_Connector.cpp
new file mode 100644
index 00000000000..30f909e93e4
--- /dev/null
+++ b/TAO/orbsvcs/orbsvcs/PortableGroup/UIPMC_Connector.cpp
@@ -0,0 +1,215 @@
+// $Id$
+
+#include "orbsvcs/PortableGroup/UIPMC_Profile.h"
+#include "orbsvcs/PortableGroup/UIPMC_Connector.h"
+
+#include "tao/debug.h"
+#include "tao/ORB_Core.h"
+#include "tao/Environment.h"
+#include "tao/Base_Transport_Property.h"
+#include "tao/Protocols_Hooks.h"
+
+#include "ace/Connector.h"
+#include "ace/OS_NS_strings.h"
+
+ACE_RCSID (PortableGroup,
+ UIPMC_Connector, "$Id$")
+
+TAO_BEGIN_VERSIONED_NAMESPACE_DECL
+
+TAO_UIPMC_Connector::TAO_UIPMC_Connector (CORBA::Boolean)
+ : TAO_Connector (IOP::TAG_UIPMC)
+{
+}
+
+TAO_UIPMC_Connector::~TAO_UIPMC_Connector (void)
+{
+}
+
+int
+TAO_UIPMC_Connector::open (TAO_ORB_Core *orb_core)
+{
+ this->orb_core (orb_core);
+
+ // For the sake of uniformity do
+ if (this->create_connect_strategy () == -1)
+ return -1;
+
+ // @@ Michael: We do not use traditional connection management.
+
+ return 0;
+}
+
+int
+TAO_UIPMC_Connector::close (void)
+{
+ SvcHandlerIterator iter (svc_handler_table_);
+
+ while (!iter.done ())
+ {
+ (*iter).int_id_->remove_reference ();
+ iter++;
+ }
+
+ return 0;
+}
+
+int
+TAO_UIPMC_Connector::set_validate_endpoint (TAO_Endpoint *endpoint)
+{
+ if (endpoint->tag () != IOP::TAG_UIPMC)
+ return -1;
+
+ TAO_UIPMC_Endpoint *uipmc_endpoint =
+ dynamic_cast<TAO_UIPMC_Endpoint *> (endpoint );
+
+ if (uipmc_endpoint == 0)
+ return -1;
+
+ const ACE_INET_Addr &remote_address =
+ uipmc_endpoint->object_addr ();
+
+ // Verify that the remote ACE_INET_Addr was initialized properly.
+ // Failure can occur if hostname lookup failed when initializing the
+ // remote ACE_INET_Addr.
+ if (remote_address.get_type () != AF_INET)
+ {
+ if (TAO_debug_level > 0)
+ {
+ ACE_DEBUG ((LM_DEBUG,
+ ACE_TEXT ("TAO (%P|%t) UIPMC connection failed.\n")
+ ACE_TEXT ("TAO (%P|%t) This is most likely ")
+ ACE_TEXT ("due to a hostname lookup ")
+ ACE_TEXT ("failure.\n")));
+ }
+
+ return -1;
+ }
+
+ return 0;
+}
+
+TAO_Transport *
+TAO_UIPMC_Connector::make_connection (TAO::Profile_Transport_Resolver *,
+ TAO_Transport_Descriptor_Interface &desc,
+ ACE_Time_Value *)
+{
+ TAO_UIPMC_Endpoint *uipmc_endpoint =
+ dynamic_cast<TAO_UIPMC_Endpoint *> (desc.endpoint ());
+
+ if (uipmc_endpoint == 0)
+ return 0;
+
+ const ACE_INET_Addr &remote_address =
+ uipmc_endpoint->object_addr ();
+
+ TAO_UIPMC_Connection_Handler *svc_handler = 0;
+
+ if (this->svc_handler_table_.find (remote_address, svc_handler) == -1)
+ {
+ TAO_UIPMC_Connection_Handler *svc_handler_i = 0;
+ ACE_NEW_RETURN (svc_handler_i,
+ TAO_UIPMC_Connection_Handler (this->orb_core ()),
+ 0);
+
+ svc_handler_i->local_addr (ACE_sap_any_cast (ACE_INET_Addr &));
+ svc_handler_i->addr (remote_address);
+
+ svc_handler_i->open (0);
+
+ svc_handler_table_.bind (remote_address,
+ svc_handler_i);
+ svc_handler = svc_handler_i;
+
+ if (TAO_debug_level > 2)
+ ACE_DEBUG ((LM_DEBUG,
+ ACE_TEXT ("(%P|%t) UIPMC_Connector::make_connection, ")
+ ACE_TEXT ("new connection on HANDLE %d\n"),
+ svc_handler->get_handle ()));
+ }
+
+ // @@ Michael: We do not use traditional connection management.
+ svc_handler->add_reference ();
+
+ return svc_handler->transport ();
+}
+
+
+TAO_Profile *
+TAO_UIPMC_Connector::create_profile (TAO_InputCDR& cdr)
+{
+ TAO_Profile *pfile;
+ ACE_NEW_RETURN (pfile,
+ TAO_UIPMC_Profile (this->orb_core ()),
+ 0);
+
+ int r = pfile->decode (cdr);
+ if (r == -1)
+ {
+ pfile->_decr_refcnt ();
+ pfile = 0;
+ }
+
+ return pfile;
+}
+
+TAO_Profile *
+TAO_UIPMC_Connector::make_profile (ACE_ENV_SINGLE_ARG_DECL)
+{
+ // The endpoint should be of the form:
+ // N.n@host:port/object_key
+ // or:
+ // host:port/object_key
+
+ TAO_Profile *profile = 0;
+ ACE_NEW_THROW_EX (profile,
+ TAO_UIPMC_Profile (this->orb_core ()),
+ CORBA::NO_MEMORY (
+ CORBA::SystemException::_tao_minor_code (
+ TAO::VMCID,
+ ENOMEM),
+ CORBA::COMPLETED_NO));
+ ACE_CHECK_RETURN (0);
+
+ return profile;
+}
+
+int
+TAO_UIPMC_Connector::check_prefix (const char *endpoint)
+{
+ // Check for a valid string
+ if (!endpoint || !*endpoint)
+ return -1; // Failure
+
+ static const char protocol[] = "miop";
+ static size_t const len = sizeof (protocol) - 1;
+
+ size_t const slot = ACE_OS::strchr (endpoint, ':') - endpoint;
+
+ // Check for the proper prefix in the IOR. If the proper prefix
+ // isn't in the IOR then it is not an IOR we can use.
+ if (slot == len
+ && ACE_OS::strncasecmp (endpoint, protocol, len) == 0)
+ return 0;
+
+ return -1;
+ // Failure: not a MIOP IOR
+ // DO NOT throw an exception here.
+}
+
+char
+TAO_UIPMC_Connector::object_key_delimiter (void) const
+{
+ return TAO_UIPMC_Profile::object_key_delimiter_;
+}
+
+int
+TAO_UIPMC_Connector::cancel_svc_handler (
+ TAO_Connection_Handler * /* svc_handler */)
+{
+ // Noop
+ return 0;
+}
+
+TAO_END_VERSIONED_NAMESPACE_DECL
+
diff --git a/TAO/orbsvcs/orbsvcs/PortableGroup/UIPMC_Connector.h b/TAO/orbsvcs/orbsvcs/PortableGroup/UIPMC_Connector.h
new file mode 100644
index 00000000000..43357053bd2
--- /dev/null
+++ b/TAO/orbsvcs/orbsvcs/PortableGroup/UIPMC_Connector.h
@@ -0,0 +1,99 @@
+// -*- C++ -*-
+
+//=============================================================================
+/**
+ * @file UIPMC_Connector.h
+ *
+ * $Id$
+ *
+ * MIOP specific connector processing.
+ *
+ * @author Frank Hunleth <fhunleth@cs.wustl.edu>
+ */
+//=============================================================================
+
+#ifndef TAO_UIPMC_CONNECTOR_H
+#define TAO_UIPMC_CONNECTOR_H
+
+#include /**/ "ace/pre.h"
+
+#include "orbsvcs/PortableGroup/portablegroup_export.h"
+
+#if !defined (ACE_LACKS_PRAGMA_ONCE)
+# pragma once
+#endif /* ACE_LACKS_PRAGMA_ONCE */
+
+#include "orbsvcs/PortableGroup/UIPMC_Connection_Handler.h"
+
+#include "tao/Transport_Connector.h"
+#include "ace/Null_Mutex.h"
+
+TAO_BEGIN_VERSIONED_NAMESPACE_DECL
+
+// ****************************************************************
+
+/**
+ * @class TAO_UIPMC_Connector
+ *
+ * @brief UIPMC-specific Connector bridge for pluggable protocols.
+ *
+ * Concrete instance of the TAO_Connector class. Responsible
+ * for establishing a connection with a server and is called from the
+ * Connector_Registory.
+ */
+class TAO_PortableGroup_Export TAO_UIPMC_Connector : public TAO_Connector
+{
+public:
+ // = Initialization and termination methods.
+ /// Constructor.
+ TAO_UIPMC_Connector (CORBA::Boolean flag = 0);
+
+ /// Destructor.
+ ~TAO_UIPMC_Connector (void);
+
+ // = The TAO_Connector methods, please check the documentation on
+ // Transport_Connector.h
+ int open (TAO_ORB_Core *orb_core);
+ int close (void);
+ TAO_Profile *create_profile (TAO_InputCDR& cdr);
+
+ virtual int check_prefix (const char *endpoint);
+
+ virtual char object_key_delimiter (void) const;
+
+protected:
+ /// = More TAO_Connector methods, please check the documentation on
+ /// Transport_Connector.h
+ int set_validate_endpoint (TAO_Endpoint *endpoint);
+
+ TAO_Transport *make_connection (TAO::Profile_Transport_Resolver *r,
+ TAO_Transport_Descriptor_Interface &desc,
+ ACE_Time_Value *timeout = 0);
+
+ virtual TAO_Profile * make_profile (ACE_ENV_SINGLE_ARG_DECL);
+
+ /// Cancel the passed cvs handler from the connector
+ virtual int cancel_svc_handler (TAO_Connection_Handler * svc_handler);
+
+private:
+ // @@ Michael: UDP Addition
+ ACE_Hash_Map_Manager_Ex < ACE_INET_Addr,
+ TAO_UIPMC_Connection_Handler *,
+ ACE_Hash < ACE_INET_Addr >,
+ ACE_Equal_To < ACE_INET_Addr >,
+ ACE_Null_Mutex >
+ svc_handler_table_;
+
+ typedef ACE_Hash_Map_Iterator_Ex < ACE_INET_Addr,
+ TAO_UIPMC_Connection_Handler *,
+ ACE_Hash < ACE_INET_Addr >,
+ ACE_Equal_To < ACE_INET_Addr >,
+ ACE_Null_Mutex >
+ SvcHandlerIterator;
+};
+
+TAO_END_VERSIONED_NAMESPACE_DECL
+
+#include /**/ "ace/post.h"
+
+#endif /* TAO_UIPMC_CONNECTOR_H */
diff --git a/TAO/orbsvcs/orbsvcs/PortableGroup/UIPMC_Endpoint.cpp b/TAO/orbsvcs/orbsvcs/PortableGroup/UIPMC_Endpoint.cpp
new file mode 100644
index 00000000000..056cfd741b6
--- /dev/null
+++ b/TAO/orbsvcs/orbsvcs/PortableGroup/UIPMC_Endpoint.cpp
@@ -0,0 +1,150 @@
+// $Id$
+
+#include "orbsvcs/PortableGroup/UIPMC_Endpoint.h"
+#include "orbsvcs/PortableGroup/UIPMC_Profile.h"
+
+#include "tao/debug.h"
+#include "ace/Guard_T.h"
+#include "tao/ORB_Constants.h"
+#include "ace/OS_NS_stdio.h"
+#include "ace/OS_NS_string.h"
+#include "ace/OS_Memory.h"
+
+ACE_RCSID (tao,
+ UIPMC_Endpoint,
+ "$Id$")
+
+
+#if !defined (__ACE_INLINE__)
+# include "orbsvcs/PortableGroup/UIPMC_Endpoint.i"
+#endif /* __ACE_INLINE__ */
+
+TAO_BEGIN_VERSIONED_NAMESPACE_DECL
+
+TAO_UIPMC_Endpoint::TAO_UIPMC_Endpoint (void)
+ : TAO_Endpoint (IOP::TAG_UIPMC),
+ object_addr_ (),
+ next_ (0)
+{
+}
+
+
+TAO_UIPMC_Endpoint::TAO_UIPMC_Endpoint (const ACE_INET_Addr &addr)
+ : TAO_Endpoint (IOP::TAG_UIPMC),
+ object_addr_ (addr),
+ next_ (0)
+{
+ this->object_addr (addr);
+}
+
+TAO_UIPMC_Endpoint::TAO_UIPMC_Endpoint (const CORBA::Octet class_d_address[4],
+ CORBA::UShort port)
+ : TAO_Endpoint (IOP::TAG_UIPMC),
+ port_ (port),
+ next_ (0)
+{
+ for (int i = 0; i<4; i++)
+ this->class_d_address_[i] = class_d_address[i];
+
+ this->update_object_addr ();
+}
+
+
+TAO_UIPMC_Endpoint::~TAO_UIPMC_Endpoint (void)
+{
+
+}
+
+void
+TAO_UIPMC_Endpoint::object_addr (const ACE_INET_Addr &addr)
+{
+ this->port_ = addr.get_port_number();
+ this->uint_ip_addr (addr.get_ip_address ());
+
+ this->object_addr_.set (addr);
+}
+
+const char *
+TAO_UIPMC_Endpoint::get_host_addr (void) const
+{
+ return this->object_addr_.get_host_addr ();
+}
+
+
+int
+TAO_UIPMC_Endpoint::addr_to_string (char *buffer, size_t length)
+{
+ size_t actual_len =
+ 15 // chars in dotted decimal addr
+ + sizeof (':') // delimiter
+ + 5 // max port
+ + sizeof ('\0');
+
+ if (length < actual_len)
+ return -1;
+
+ ACE_OS::sprintf (buffer, "%d.%d.%d.%d:%d",
+ this->class_d_address_[0],
+ this->class_d_address_[1],
+ this->class_d_address_[2],
+ this->class_d_address_[3],
+ this->port_);
+
+ return 0;
+}
+
+TAO_Endpoint *
+TAO_UIPMC_Endpoint::next (void)
+{
+ return this->next_;
+}
+
+TAO_Endpoint *
+TAO_UIPMC_Endpoint::duplicate (void)
+{
+ TAO_UIPMC_Endpoint *endpoint = 0;
+
+ ACE_NEW_RETURN (endpoint,
+ TAO_UIPMC_Endpoint (this->object_addr_),
+ 0);
+
+ return endpoint;
+}
+
+CORBA::Boolean
+TAO_UIPMC_Endpoint::is_equivalent (const TAO_Endpoint *other_endpoint)
+{
+ TAO_Endpoint *endpt = const_cast<TAO_Endpoint *> (other_endpoint);
+
+ TAO_UIPMC_Endpoint *endpoint = dynamic_cast<TAO_UIPMC_Endpoint *> (endpt);
+ if (endpoint == 0)
+ return 0;
+
+ return
+ this->port_ == endpoint->port_
+ && ACE_OS::memcmp (this->class_d_address_, endpoint->class_d_address_, 4) == 0;
+}
+
+CORBA::ULong
+TAO_UIPMC_Endpoint::hash (void)
+{
+ if (this->hash_val_ != 0)
+ return this->hash_val_;
+
+ {
+ ACE_GUARD_RETURN (TAO_SYNCH_MUTEX,
+ guard,
+ this->addr_lookup_lock_,
+ this->hash_val_);
+ // .. DCL
+ if (this->hash_val_ != 0)
+ return this->hash_val_;
+
+ this->hash_val_ =
+ this->uint_ip_addr () + this->port_;
+ }
+
+ return this->hash_val_;
+}
+
+TAO_END_VERSIONED_NAMESPACE_DECL
diff --git a/TAO/orbsvcs/orbsvcs/PortableGroup/UIPMC_Endpoint.h b/TAO/orbsvcs/orbsvcs/PortableGroup/UIPMC_Endpoint.h
new file mode 100644
index 00000000000..3c137d6c9ef
--- /dev/null
+++ b/TAO/orbsvcs/orbsvcs/PortableGroup/UIPMC_Endpoint.h
@@ -0,0 +1,129 @@
+// -*- C++ -*-
+
+//=============================================================================
+/**
+ * @file UIPMC_Endpoint.h
+ *
+ * $Id$
+ *
+ * UIPMC implementation of PP Framework Endpoint interface.
+ *
+ * @author Frank Hunleth <fhunleth@cs.wustl.edu>
+ */
+//=============================================================================
+
+#ifndef TAO_UIPMC_ENDPOINT_H
+#define TAO_UIPMC_ENDPOINT_H
+
+#include /**/ "ace/pre.h"
+
+#include "tao/Endpoint.h"
+
+#if !defined (ACE_LACKS_PRAGMA_ONCE)
+# pragma once
+#endif /* ACE_LACKS_PRAGMA_ONCE */
+
+#include "ace/INET_Addr.h"
+
+#include "orbsvcs/PortableGroup/portablegroup_export.h"
+
+TAO_BEGIN_VERSIONED_NAMESPACE_DECL
+
+/**
+ * @class TAO_UIPMC_Endpoint
+ *
+ * @brief TAO_UIPMC_Endpoint
+ *
+ * UIPMC-specific implementation of PP Framework Endpoint interface.
+ */
+class TAO_PortableGroup_Export TAO_UIPMC_Endpoint : public TAO_Endpoint
+{
+public:
+ // = Initialization and termination methods.
+
+ /// Default constructor.
+ TAO_UIPMC_Endpoint (void);
+
+ /// Constructor.
+ TAO_UIPMC_Endpoint (const ACE_INET_Addr &addr);
+
+ /// Constructor. @@ Frank - deprecate this.
+ TAO_UIPMC_Endpoint (const CORBA::Octet class_d_address[4],
+ CORBA::UShort port);
+
+ /// Destructor.
+ ~TAO_UIPMC_Endpoint (void);
+
+ // = Implementation of abstract TAO_Endpoint methods. See
+ // Endpoint.h for their documentation.
+
+ virtual TAO_Endpoint *next (void);
+ virtual int addr_to_string (char *buffer, size_t length);
+
+ /// Makes a copy of <this>
+ virtual TAO_Endpoint *duplicate (void);
+
+ /// Return true if this endpoint is equivalent to <other_endpoint>. Two
+ /// endpoints are equivalent iff their port and host are the same.
+ CORBA::Boolean is_equivalent (const TAO_Endpoint *other_endpoint);
+
+ /// Return a hash value for this object.
+ CORBA::ULong hash (void);
+
+ // Allocates memory and returns a copy of <this>
+
+ // = UIPMC_Endpoint-specific methods.
+
+ /// Return a reference to the <object_addr>.
+ const ACE_INET_Addr &object_addr (void) const;
+
+ /// Set the IP multicast address and port.
+ void object_addr (const ACE_INET_Addr &addr);
+
+ /// Return a pointer to the stringified host address (not including the
+ /// port). This class retains ownership of the address memory.
+ const char *get_host_addr (void) const;
+
+ /// Return the port number.
+ CORBA::UShort port (void) const;
+
+ /// Set the port number.
+ CORBA::UShort port (CORBA::UShort p); //@@ Frank - deprecate this.
+
+ //TAO_UIPMC_Connection_Handler *&hint (void);
+ // Access to our <hint_>.
+
+
+private:
+
+ /// Helper methods for getting and setting the IP address.
+ ACE_UINT32 uint_ip_addr (void) const;
+ void uint_ip_addr (ACE_UINT32 ip_addr);
+
+ /// Helper method to update the cached object address.
+ void update_object_addr (void);
+
+ /// IP Multicast address. @@ Frank - deprecate this.
+ CORBA::Octet class_d_address_[4];
+
+ /// UDP port number. @@ Frank - deprecate this.
+ CORBA::UShort port_;
+
+ /// Cached instance of <ACE_INET_Addr> for use in making
+ /// invocations, etc.
+ ACE_INET_Addr object_addr_;
+
+ /// UIPMC Endpoints can be stringed into a list. Return the next
+ /// endpoint in the list, if any.
+ TAO_UIPMC_Endpoint *next_;
+};
+
+TAO_END_VERSIONED_NAMESPACE_DECL
+
+#if defined (__ACE_INLINE__)
+# include "orbsvcs/PortableGroup/UIPMC_Endpoint.i"
+#endif /* __ACE_INLINE__ */
+
+#include /**/ "ace/post.h"
+
+#endif /* TAO_UIPMC_PROFILE_H */
diff --git a/TAO/orbsvcs/orbsvcs/PortableGroup/UIPMC_Endpoint.i b/TAO/orbsvcs/orbsvcs/PortableGroup/UIPMC_Endpoint.i
new file mode 100644
index 00000000000..7d91cc4d459
--- /dev/null
+++ b/TAO/orbsvcs/orbsvcs/PortableGroup/UIPMC_Endpoint.i
@@ -0,0 +1,52 @@
+// -*- C++ -*-
+//
+// $Id$
+
+TAO_BEGIN_VERSIONED_NAMESPACE_DECL
+
+ACE_INLINE const ACE_INET_Addr &
+TAO_UIPMC_Endpoint::object_addr (void) const
+{
+ return this->object_addr_;
+}
+
+
+ACE_INLINE CORBA::UShort
+TAO_UIPMC_Endpoint::port (void) const
+{
+ return this->port_;
+}
+
+ACE_INLINE CORBA::UShort
+TAO_UIPMC_Endpoint::port (CORBA::UShort p)
+{
+ return this->port_ = p;
+}
+
+
+ACE_INLINE ACE_UINT32
+TAO_UIPMC_Endpoint::uint_ip_addr (void) const
+{
+ return (((ACE_UINT32)this->class_d_address_[0] << 24) |
+ ((ACE_UINT32)this->class_d_address_[1] << 16) |
+ ((ACE_UINT32)this->class_d_address_[2] << 8) |
+ ((ACE_UINT32)this->class_d_address_[3]));
+}
+
+ACE_INLINE void
+TAO_UIPMC_Endpoint::uint_ip_addr (ACE_UINT32 ip_addr)
+{
+ this->class_d_address_[0] = (CORBA::Char)(ip_addr >> 24);
+ this->class_d_address_[1] = (CORBA::Char)((ip_addr >> 16) & 0xff);
+ this->class_d_address_[2] = (CORBA::Char)((ip_addr >> 8) & 0xff);
+ this->class_d_address_[3] = (CORBA::Char)(ip_addr & 0xff);
+}
+
+ACE_INLINE void
+TAO_UIPMC_Endpoint::update_object_addr (void)
+{
+ this->object_addr_.set (this->port_,
+ this->uint_ip_addr ());
+}
+
+TAO_END_VERSIONED_NAMESPACE_DECL
diff --git a/TAO/orbsvcs/orbsvcs/PortableGroup/UIPMC_Factory.cpp b/TAO/orbsvcs/orbsvcs/PortableGroup/UIPMC_Factory.cpp
new file mode 100644
index 00000000000..3a16a9f9793
--- /dev/null
+++ b/TAO/orbsvcs/orbsvcs/PortableGroup/UIPMC_Factory.cpp
@@ -0,0 +1,99 @@
+// $Id$
+
+#include "orbsvcs/PortableGroup/UIPMC_Factory.h"
+#include "orbsvcs/PortableGroup/UIPMC_Acceptor.h"
+#include "orbsvcs/PortableGroup/UIPMC_Connector.h"
+#include "ace/OS_NS_strings.h"
+#include "tao/ORB_Constants.h"
+
+ACE_RCSID (PortableGroup,
+ UIPMC_Factory,
+ "$Id$")
+
+static const char the_prefix[] = "uipmc";
+
+TAO_BEGIN_VERSIONED_NAMESPACE_DECL
+
+TAO_UIPMC_Protocol_Factory::TAO_UIPMC_Protocol_Factory (void)
+ : TAO_Protocol_Factory (IOP::TAG_UIPMC),
+ major_ (TAO_DEF_GIOP_MAJOR),
+ minor_ (TAO_DEF_GIOP_MINOR)
+{
+}
+
+TAO_UIPMC_Protocol_Factory::~TAO_UIPMC_Protocol_Factory (void)
+{
+}
+
+int
+TAO_UIPMC_Protocol_Factory::match_prefix (const ACE_CString &prefix)
+{
+ // Check for the proper prefix for this protocol.
+ return (ACE_OS::strcasecmp (prefix.c_str (), ::the_prefix) == 0);
+}
+
+const char *
+TAO_UIPMC_Protocol_Factory::prefix (void) const
+{
+ return ::the_prefix;
+}
+
+char
+TAO_UIPMC_Protocol_Factory::options_delimiter (void) const
+{
+ return '/';
+}
+
+TAO_Acceptor *
+TAO_UIPMC_Protocol_Factory::make_acceptor (void)
+{
+ TAO_Acceptor *acceptor = 0;
+
+ ACE_NEW_RETURN (acceptor,
+ TAO_UIPMC_Acceptor,
+ 0);
+
+ return acceptor;
+}
+
+int
+TAO_UIPMC_Protocol_Factory::init (int /* argc */,
+ char* /* argv */ [])
+{
+ return 0;
+}
+
+TAO_Connector *
+TAO_UIPMC_Protocol_Factory::make_connector (void)
+{
+ TAO_Connector *connector = 0;
+
+ ACE_NEW_RETURN (connector,
+ TAO_UIPMC_Connector,
+ 0);
+ return connector;
+}
+
+int
+TAO_UIPMC_Protocol_Factory::requires_explicit_endpoint (void) const
+{
+ // A multicast endpoint can't be picked automatically in the
+ // pluggable protocol framework. It must be determined from
+ // the UIPMC profile that has the group reference. This information
+ // is either specified by the user or generated by the
+ // multicast group manager or other UIPMC profile generation
+ // interface.
+ return 1;
+}
+
+TAO_END_VERSIONED_NAMESPACE_DECL
+
+ACE_STATIC_SVC_DEFINE (TAO_UIPMC_Protocol_Factory,
+ ACE_TEXT ("UIPMC_Factory"),
+ ACE_SVC_OBJ_T,
+ &ACE_SVC_NAME (TAO_UIPMC_Protocol_Factory),
+ ACE_Service_Type::DELETE_THIS |
+ ACE_Service_Type::DELETE_OBJ,
+ 0)
+
+ACE_FACTORY_DEFINE (TAO_PortableGroup, TAO_UIPMC_Protocol_Factory)
diff --git a/TAO/orbsvcs/orbsvcs/PortableGroup/UIPMC_Factory.h b/TAO/orbsvcs/orbsvcs/PortableGroup/UIPMC_Factory.h
new file mode 100644
index 00000000000..8b7ab75adf2
--- /dev/null
+++ b/TAO/orbsvcs/orbsvcs/PortableGroup/UIPMC_Factory.h
@@ -0,0 +1,72 @@
+// -*- C++ -*-
+
+//=============================================================================
+/**
+ * @file UIPMC_Factory.h
+ *
+ * $Id$
+ *
+ * @author Frank Hunleth <fhunleth@cs.wustl.edu>
+ */
+//=============================================================================
+
+#ifndef TAO_UIPMC_FACTORY_H
+#define TAO_UIPMC_FACTORY_H
+
+#include /**/ "ace/pre.h"
+
+#include "tao/Protocol_Factory.h"
+
+#if !defined (ACE_LACKS_PRAGMA_ONCE)
+# pragma once
+#endif /* ACE_LACKS_PRAGMA_ONCE */
+
+#include "ace/Service_Config.h"
+
+#include "orbsvcs/PortableGroup/portablegroup_export.h"
+
+TAO_BEGIN_VERSIONED_NAMESPACE_DECL
+
+class TAO_Acceptor;
+class TAO_Connector;
+
+class TAO_PortableGroup_Export TAO_UIPMC_Protocol_Factory : public TAO_Protocol_Factory
+{
+public:
+ TAO_UIPMC_Protocol_Factory (void);
+ virtual ~TAO_UIPMC_Protocol_Factory (void);
+
+ // = Service Configurator hooks.
+ /// Dynamic linking hook
+ virtual int init (int argc, char* argv[]);
+
+ /// Verify prefix is a match
+ virtual int match_prefix (const ACE_CString &prefix);
+
+ /// Returns the prefix used by the protocol.
+ virtual const char *prefix (void) const;
+
+ /// Return the character used to mark where an endpoint ends and
+ /// where its options begin.
+ virtual char options_delimiter (void) const;
+
+ // = Check Protocol_Factory.h for a description of these methods.
+ virtual TAO_Acceptor *make_acceptor (void);
+ virtual TAO_Connector *make_connector (void);
+ virtual int requires_explicit_endpoint (void) const;
+
+private:
+ /// Changing the version number can be used to provide backwards
+ /// compatibility with old clients.
+ int major_;
+ int minor_;
+};
+
+TAO_END_VERSIONED_NAMESPACE_DECL
+
+ACE_STATIC_SVC_DECLARE (TAO_UIPMC_Protocol_Factory)
+ACE_FACTORY_DECLARE (TAO_PortableGroup, TAO_UIPMC_Protocol_Factory)
+
+#include /**/ "ace/post.h"
+
+#endif /* TAO_UIPMC_FACTORY_H */
diff --git a/TAO/orbsvcs/orbsvcs/PortableGroup/UIPMC_Message_Block_Data_Iterator.cpp b/TAO/orbsvcs/orbsvcs/PortableGroup/UIPMC_Message_Block_Data_Iterator.cpp
new file mode 100644
index 00000000000..4e3d4173fcf
--- /dev/null
+++ b/TAO/orbsvcs/orbsvcs/PortableGroup/UIPMC_Message_Block_Data_Iterator.cpp
@@ -0,0 +1,89 @@
+// $Id$
+
+#include "orbsvcs/PortableGroup/UIPMC_Message_Block_Data_Iterator.h"
+
+TAO_BEGIN_VERSIONED_NAMESPACE_DECL
+
+UIPMC_Message_Block_Data_Iterator::UIPMC_Message_Block_Data_Iterator (iovec *iov, int iovcnt) :
+ iov_ (iov),
+ iovcnt_ (iovcnt),
+ iov_ptr_ (0),
+ iov_index_ (0),
+ iov_len_left_ (0),
+ state_ (INTER_BLOCK)
+{
+}
+
+size_t
+UIPMC_Message_Block_Data_Iterator::next_block (size_t max_length,
+ iovec &block)
+{
+ if (this->state_ == INTER_BLOCK)
+ {
+ // Check that there are some iovec buffers left.
+ if (this->iov_index_ >= this->iovcnt_)
+ return 0;
+
+
+ size_t current_iov_len =
+ this->iov_[this->iov_index_].iov_len;
+
+ if (current_iov_len <= max_length)
+ {
+ // Return the full data portion.
+ block.iov_len = static_cast<u_long> (current_iov_len);
+ block.iov_base = this->iov_[this->iov_index_].iov_base;
+
+ // Go to the next block.
+ this->iov_index_++;
+
+ return current_iov_len;
+ }
+ else
+ {
+ // Let the caller use the first part of this
+ // message block.
+ block.iov_len = static_cast<u_long> (max_length);
+ block.iov_base = this->iov_[this->iov_index_].iov_base;
+
+ // Break up the block.
+ this->iov_len_left_ = current_iov_len - max_length;
+ this->iov_ptr_ =
+ reinterpret_cast<char *> (reinterpret_cast<char *> (block.iov_base)
+ + max_length);
+ this->state_ = INTRA_BLOCK;
+
+ return max_length;
+ }
+ }
+ else
+ {
+ // Currently scanning a split block.
+ if (this->iov_len_left_ <= max_length)
+ {
+ // Return everything that's left in the block.
+ block.iov_len = static_cast<u_long> (this->iov_len_left_);
+ block.iov_base = this->iov_ptr_;
+
+ // Go to the next block.
+ this->iov_index_++;
+
+ // Update the state.
+ this->state_ = INTER_BLOCK;
+
+ return this->iov_len_left_;
+ }
+ else
+ {
+ // Split a little more off the block.
+ block.iov_len = static_cast<u_long> (this->iov_len_left_);
+ block.iov_base = this->iov_ptr_;
+
+ this->iov_len_left_ -= max_length;
+ this->iov_ptr_ += max_length;
+ return max_length;
+ }
+ }
+}
+
+TAO_END_VERSIONED_NAMESPACE_DECL
diff --git a/TAO/orbsvcs/orbsvcs/PortableGroup/UIPMC_Message_Block_Data_Iterator.h b/TAO/orbsvcs/orbsvcs/PortableGroup/UIPMC_Message_Block_Data_Iterator.h
new file mode 100644
index 00000000000..0378e1aac7c
--- /dev/null
+++ b/TAO/orbsvcs/orbsvcs/PortableGroup/UIPMC_Message_Block_Data_Iterator.h
@@ -0,0 +1,70 @@
+// -*- C++ -*-
+
+//=============================================================================
+/**
+ * @file UIPMC_Message_Block_Data_Iterator.h
+ *
+ * $Id$
+ *
+ * @author Frank Hunleth <frank@hunleth.com>
+ */
+//=============================================================================
+
+#ifndef TAO_UIPMC_MESSAGE_BLOCK_DATA_ITERATOR_H
+#define TAO_UIPMC_MESSAGE_BLOCK_DATA_ITERATOR_H
+#include /**/ "ace/pre.h"
+
+#include "ace/os_include/sys/os_uio.h"
+#include "ace/os_include/os_stddef.h"
+
+#if !defined (ACE_LACKS_PRAGMA_ONCE)
+# pragma once
+#endif /* ACE_LACKS_PRAGMA_ONCE */
+
+#include "tao/Versioned_Namespace.h"
+
+TAO_BEGIN_VERSIONED_NAMESPACE_DECL
+
+/**
+ * @class UIPMC_Message_Block_Data_Iterator
+ *
+ * @brief This is a help class for iterating through ACE_Message_Blocks and to
+ * segment them into MIOP packets.
+ */
+class UIPMC_Message_Block_Data_Iterator
+{
+public:
+ /// Constructor
+ UIPMC_Message_Block_Data_Iterator (iovec *iov, int iovcnt);
+
+ /// Get the next data block that has a size less than or equal
+ /// to max_length. Return the length of the block returned.
+ size_t next_block (size_t max_length,
+ iovec &block);
+
+private:
+ enum State
+ {
+ INTER_BLOCK,
+ INTRA_BLOCK
+ };
+
+ iovec *iov_;
+ int iovcnt_;
+
+ // Point internal to a message block, if we have to split one up.
+ char *iov_ptr_;
+ int iov_index_;
+
+ // Length used in a split message block.
+ size_t iov_len_left_;
+
+ // Current message iterator state.
+ State state_;
+
+};
+
+TAO_END_VERSIONED_NAMESPACE_DECL
+
+#include /**/ "ace/post.h"
+#endif /* TAO_UIPMC_MESSAGE_BLOCK_DATA_ITERATOR_H */
diff --git a/TAO/orbsvcs/orbsvcs/PortableGroup/UIPMC_Profile.cpp b/TAO/orbsvcs/orbsvcs/PortableGroup/UIPMC_Profile.cpp
new file mode 100644
index 00000000000..d242aef76a1
--- /dev/null
+++ b/TAO/orbsvcs/orbsvcs/PortableGroup/UIPMC_Profile.cpp
@@ -0,0 +1,800 @@
+// $Id$
+
+#include "orbsvcs/PortableGroup/UIPMC_Profile.h"
+#include "orbsvcs/PortableGroup/miopconf.h"
+#include "tao/CDR.h"
+#include "tao/Environment.h"
+#include "tao/ORB.h"
+#include "tao/ORB_Core.h"
+#include "tao/debug.h"
+#include "tao/target_specification.h"
+#include "ace/os_include/os_ctype.h"
+
+#include "orbsvcs/miopC.h"
+#include "orbsvcs/PortableGroupC.h"
+
+ACE_RCSID (PortableGroup,
+ UIPMC_Profile,
+ "$Id$")
+
+static const char the_prefix[] = "uipmc";
+
+// UIPMC doesn't support object keys, so send profiles by default in the GIOP 1.2 target
+// specification.
+static const CORBA::Short default_addressing_mode_ = TAO_Target_Specification::Profile_Addr;
+
+TAO_BEGIN_VERSIONED_NAMESPACE_DECL
+
+const char TAO_UIPMC_Profile::object_key_delimiter_ = '/';
+
+char
+TAO_UIPMC_Profile::object_key_delimiter (void) const
+{
+ return TAO_UIPMC_Profile::object_key_delimiter_;
+}
+
+
+TAO_UIPMC_Profile::TAO_UIPMC_Profile (TAO_ORB_Core *orb_core)
+ : TAO_Profile (IOP::TAG_UIPMC,
+ orb_core,
+ TAO_GIOP_Message_Version (TAO_DEF_GIOP_MAJOR, TAO_DEF_GIOP_MINOR)),
+ endpoint_ (),
+ count_ (1),
+ tagged_profile_ ()
+{
+ addressing_mode_ = default_addressing_mode_;
+}
+
+TAO_UIPMC_Profile::TAO_UIPMC_Profile (const ACE_INET_Addr &addr,
+ TAO_ORB_Core *orb_core)
+ : TAO_Profile (IOP::TAG_UIPMC,
+ orb_core,
+ TAO_GIOP_Message_Version (TAO_DEF_GIOP_MAJOR, TAO_DEF_GIOP_MINOR)),
+ endpoint_ (addr),
+ count_ (1),
+ tagged_profile_ ()
+{
+ addressing_mode_ = default_addressing_mode_;
+}
+
+TAO_UIPMC_Profile::TAO_UIPMC_Profile (const CORBA::Octet class_d_address[4],
+ CORBA::UShort port,
+ TAO_ORB_Core *orb_core)
+ : TAO_Profile (IOP::TAG_UIPMC,
+ orb_core,
+ TAO_GIOP_Message_Version (TAO_DEF_GIOP_MAJOR, TAO_DEF_GIOP_MINOR)),
+ endpoint_ (class_d_address, port),
+ count_ (1),
+ tagged_profile_ ()
+{
+ addressing_mode_ = default_addressing_mode_;
+}
+
+/*
+
+TAO_UIPMC_Profile::TAO_UIPMC_Profile (const char *string,
+ TAO_ORB_Core *orb_core
+ ACE_ENV_ARG_DECL)
+ : TAO_Profile (TAO_TAG_UIPMC_PROFILE,
+ orb_core,
+ TAO_GIOP_Message_Version (TAO_DEF_GIOP_MAJOR, TAO_DEF_GIOP_MINOR)),
+ endpoint_ (),
+ count_ (1),
+ tagged_profile_ ()
+{
+ this->add_group_component ();
+ this->parse_string (string ACE_ENV_ARG_PARAMETER);
+ ACE_CHECK;
+ addressing_mode_ = default_addressing_mode_;
+}
+
+TAO_UIPMC_Profile::TAO_UIPMC_Profile (TAO_ORB_Core *orb_core)
+ : TAO_Profile (TAO_TAG_UIPMC_PROFILE,
+ orb_core,
+ TAO_GIOP_Message_Version (TAO_DEF_GIOP_MAJOR, TAO_DEF_GIOP_MINOR)),
+ endpoint_ (),
+ count_ (1),
+ tagged_profile_ ()
+{
+ addressing_mode_ = default_addressing_mode_;
+}
+*/
+
+TAO_UIPMC_Profile::~TAO_UIPMC_Profile (void)
+{
+}
+
+int
+TAO_UIPMC_Profile::decode (TAO_InputCDR& cdr)
+{
+ // The following is a selective reproduction of TAO_Profile::decode
+
+ CORBA::ULong encap_len = cdr.length ();
+
+ // Read and verify major, minor versions, ignoring profiles
+ // whose versions we don't understand.
+ if (!(cdr.read_octet (this->version_.major)
+ && this->version_.major == TAO_DEF_GIOP_MAJOR
+ && cdr.read_octet (this->version_.minor)
+ && this->version_.minor <= TAO_DEF_GIOP_MINOR))
+ {
+ if (TAO_debug_level > 0)
+ {
+ ACE_DEBUG ((LM_DEBUG,
+ ACE_TEXT ("TAO (%P|%t) - Profile::decode - v%d.%d\n"),
+ this->version_.major,
+ this->version_.minor));
+ }
+
+ return -1;
+ }
+
+ // Transport specific details
+ if (this->decode_profile (cdr) < 0)
+ {
+ return -1;
+ }
+
+ // UIPMC profiles must have tagged components.
+ if (this->tagged_components_.decode (cdr) == 0)
+ {
+ return -1;
+ }
+
+ if (cdr.length () != 0 && TAO_debug_level)
+ {
+ // If there is extra data in the profile we are supposed to
+ // ignore it, but print a warning just in case...
+ ACE_DEBUG ((LM_DEBUG,
+ ACE_TEXT ("%d bytes out of %d left after profile data\n"),
+ cdr.length (),
+ encap_len));
+ }
+
+ // We don't call ::decode_endpoints because it is implemented
+ // as ACE_NOTSUP_RETURN (-1) for this profile
+
+ return 1;
+}
+
+int
+TAO_UIPMC_Profile::decode_endpoints (void)
+{
+ ACE_NOTSUP_RETURN (-1);
+}
+
+int
+TAO_UIPMC_Profile::decode_profile (TAO_InputCDR& cdr)
+{
+ CORBA::UShort port = 0;
+ ACE_CString address;
+ if (!(cdr.read_string (address)
+ && cdr.read_ushort (port)))
+ {
+ if (TAO_debug_level > 0)
+ ACE_DEBUG ((LM_DEBUG,
+ ACE_TEXT ("TAO (%P|%t) UIPMC_Profile::decode - ")
+ ACE_TEXT ("Couldn't unmarshal address and port!\n")));
+ return -1;
+ }
+
+ if (cdr.good_bit ())
+ {
+ // If everything was successful, update the endpoint's address
+ // and port with the new data.
+ ACE_INET_Addr addr (port, address.c_str ());
+ this->endpoint_.object_addr (addr);
+ return 1;
+ }
+
+ return -1;
+}
+
+void
+TAO_UIPMC_Profile::parse_string (const char *string
+ ACE_ENV_ARG_DECL)
+{
+ this->parse_string_i (string
+ ACE_ENV_ARG_PARAMETER);
+}
+
+void
+TAO_UIPMC_Profile::parse_string_i (const char *string
+ ACE_ENV_ARG_DECL)
+{
+ // Remove the "N.n@" version prefix, if it exists, and verify the
+ // version is one that we accept.
+
+ // Check for MIOP version
+ if (isdigit (string [0]) &&
+ string[1] == '.' &&
+ isdigit (string [2]) &&
+ string[3] == '@')
+ {
+ if (string[0] != '1' ||
+ string[2] != '0')
+ {
+ ACE_THROW (CORBA::INV_OBJREF (
+ CORBA::SystemException::_tao_minor_code (
+ TAO::VMCID,
+ EINVAL),
+ CORBA::COMPLETED_NO));
+ }
+
+ string += 4;
+ // Skip over the "N.n@"
+ }
+
+ // UIPMC profiles always use GIOP 1.2
+ this->version_.set_version (1, 2);
+
+ //
+ // Parse the group_id.
+ //
+
+ // Parse the group component version.
+ if (isdigit (string [0]) &&
+ string[1] == '.' &&
+ isdigit (string [2]) &&
+ string[3] == '-')
+ {
+ CORBA::Char major;
+ CORBA::Char minor;
+
+ major = (char) (string [0] - '0');
+ minor = (char) (string [2] - '0');
+
+ // Verify that a supported version of MIOP is specified.
+ if (major != TAO_DEF_MIOP_MAJOR ||
+ minor > TAO_DEF_MIOP_MINOR)
+ {
+ ACE_THROW (CORBA::INV_OBJREF (
+ CORBA::SystemException::_tao_minor_code (
+ TAO::VMCID,
+ EINVAL),
+ CORBA::COMPLETED_NO));
+ }
+
+ // Skip over "N.n-"
+ string += 4;
+ }
+ else
+ {
+ // The group component version is mandatory.
+ ACE_THROW (CORBA::INV_OBJREF (
+ CORBA::SystemException::_tao_minor_code (
+ TAO::VMCID,
+ EINVAL),
+ CORBA::COMPLETED_NO));
+ }
+
+ // Parse the group_domain_id.
+ // The Domain ID is terminated with a '-'.
+
+ // Wrap the string in a ACE_CString
+ ACE_CString ace_str (string, 0, 0);
+
+ // Look for the group domain delimitor.
+ ACE_CString::size_type pos = ace_str.find ('-');
+
+ if (pos == ACE_CString::npos)
+ {
+ // The group_domain_id is mandatory, so throw an
+ // exception if it isn't found.
+ ACE_THROW (CORBA::INV_OBJREF (
+ CORBA::SystemException::_tao_minor_code (
+ TAO::VMCID,
+ EINVAL),
+ CORBA::COMPLETED_NO));
+ }
+
+ // Save the group_domain_id.
+ ACE_CString group_domain_id = ace_str.substring (0, pos);
+
+ // Parse the group_id.
+ // The group_id is terminated with a '-' or a '/'.
+
+ // Skip past the last '-'.
+ ++pos;
+ ACE_CString::size_type end_pos = ace_str.find ('-',pos);
+
+ CORBA::Boolean parse_group_ref_version_flag = 0;
+
+ if (end_pos != ACE_CString::npos)
+ {
+ // String was terminated by a '-', so there's a group
+ // reference version to be parsed.
+ parse_group_ref_version_flag = 1;
+ }
+ else
+ {
+ // Look for a slash as the separator.
+ end_pos = ace_str.find ('/', pos);
+
+ if (end_pos == ACE_CString::npos)
+ {
+ // The Group ID is mandatory, so throw an exception.
+ ACE_THROW (CORBA::INV_OBJREF (
+ CORBA::SystemException::_tao_minor_code (
+ TAO::VMCID,
+ EINVAL),
+ CORBA::COMPLETED_NO));
+ }
+ }
+
+ // Get the domain_id.
+ ACE_CString str_domain_id = ace_str.substring (pos, end_pos - pos);
+
+ // Convert the domain_id into numerical form.
+ // @@ group_id is actually 64 bits, but strtoul only can parse 32 bits.
+ // @@ Need a 64 bit strtoul...
+ PortableGroup::ObjectGroupId group_id =
+ ACE_OS::strtoul (str_domain_id.c_str (), 0, 10);
+
+ PortableGroup::ObjectGroupRefVersion ref_version = 0;
+ if (parse_group_ref_version_flag)
+ {
+ // Try to find the group version. It is terminated by a '/'.
+ pos = end_pos + 1;
+ end_pos = ace_str.find ('/', pos);
+ if (end_pos == ACE_CString::npos)
+ {
+ // The group version was expected but not found,
+ // so throw an exception.
+ ACE_THROW (CORBA::INV_OBJREF (
+ CORBA::SystemException::_tao_minor_code (
+ TAO::VMCID,
+ EINVAL),
+ CORBA::COMPLETED_NO));
+ }
+
+ ACE_CString str_group_ref_ver = ace_str.substring (pos, end_pos - pos);
+
+ ref_version =
+ ACE_OS::strtoul (str_group_ref_ver.c_str (), 0, 10);
+ }
+
+ // Parse the group multicast address.
+ // The multicast address is terminated by a ':'.
+ pos = end_pos + 1;
+ end_pos = ace_str.find (':', pos);
+
+ if (end_pos == ACE_CString::npos)
+ {
+ // The multicast address is mandatory, so throw an exception,
+ // since it wasn't found.
+ ACE_THROW (CORBA::INV_OBJREF (
+ CORBA::SystemException::_tao_minor_code (
+ TAO::VMCID,
+ EINVAL),
+ CORBA::COMPLETED_NO));
+ }
+
+ ACE_CString mcast_addr = ace_str.substring (pos, end_pos - pos);
+
+ // Parse the multicast port number.
+
+ // First check that there's something left in the string.
+ pos = end_pos + 1;
+ if (ace_str[pos] == '\0')
+ {
+ // The multicast port is mandatory, so throw an exception,
+ // since it wasn't found.
+ ACE_THROW (CORBA::INV_OBJREF (
+ CORBA::SystemException::_tao_minor_code (
+ TAO::VMCID,
+ EINVAL),
+ CORBA::COMPLETED_NO));
+ }
+
+ CORBA::UShort mcast_port =
+ static_cast<CORBA::UShort> (ACE_OS::strtoul (ace_str.c_str () + pos, 0, 10));
+
+ //
+ // Finally, set all of the fields of the profile.
+ //
+
+ ACE_INET_Addr addr (mcast_port, mcast_addr.c_str ());
+ this->endpoint_.object_addr (addr);
+
+ this->set_group_info (group_domain_id.c_str (),
+ group_id,
+ ref_version);
+
+}
+
+CORBA::Boolean
+TAO_UIPMC_Profile::do_is_equivalent (const TAO_Profile *other_profile)
+{
+ const TAO_UIPMC_Profile *op =
+ dynamic_cast<const TAO_UIPMC_Profile *> (other_profile);
+
+ if (op == 0)
+ return 0;
+
+ return this->endpoint_.is_equivalent (&op->endpoint_);
+}
+
+CORBA::ULong
+TAO_UIPMC_Profile::hash (CORBA::ULong max
+ ACE_ENV_ARG_DECL_NOT_USED)
+{
+ // Get the hashvalue for all endpoints.
+ CORBA::ULong hashval = this->endpoint_.hash ();
+
+ hashval += this->version_.minor;
+ hashval += this->tag ();
+
+ return hashval % max;
+}
+
+TAO_Endpoint*
+TAO_UIPMC_Profile::endpoint (void)
+{
+ return &this->endpoint_;
+}
+
+int
+TAO_UIPMC_Profile::encode_endpoints (void)
+{
+ return 1;
+}
+
+CORBA::ULong
+TAO_UIPMC_Profile::endpoint_count (void) const
+{
+ return 1;
+}
+
+char *
+TAO_UIPMC_Profile::to_string (ACE_ENV_SINGLE_ARG_DECL_NOT_USED)
+{
+ // @@ Frank: Update to pull out GroupID information...
+
+ size_t buflen = (ACE_OS::strlen (::the_prefix) +
+ 3 /* "loc" */ +
+ 1 /* colon separator */ +
+ 2 /* double-slash separator */ +
+ 1 /* major version */ +
+ 1 /* decimal point */ +
+ 1 /* minor version */ +
+ 1 /* `@' character */ +
+ 15 /* dotted decimal IPv4 address */ +
+ 1 /* colon separator */ +
+ 5 /* port number */);
+
+ char * buf = CORBA::string_alloc (static_cast<CORBA::ULong> (buflen));
+
+ ACE_OS::sprintf (buf,
+ "corbaloc:%s://1.0@%s:%d",
+ ::the_prefix,
+ this->endpoint_.get_host_addr (),
+ this->endpoint_.port ());
+ return buf;
+}
+
+const char *
+TAO_UIPMC_Profile::prefix (void)
+{
+ return ::the_prefix;
+}
+
+IOP::TaggedProfile &
+TAO_UIPMC_Profile::create_tagged_profile (void)
+{
+ // Check whether we have already created the TaggedProfile
+ if (this->tagged_profile_.profile_data.length () == 0)
+ {
+ // As we have not created we will now create the TaggedProfile
+ this->tagged_profile_.tag = IOP::TAG_UIPMC;
+
+ // Create the encapsulation....
+ TAO_OutputCDR encap;
+
+ // Create the profile body
+ this->create_profile_body (encap);
+
+ CORBA::ULong length =
+ static_cast<CORBA::ULong> (encap.total_length ());
+
+#if (TAO_NO_COPY_OCTET_SEQUENCES == 1)
+ // Place the message block in to the Sequence of Octets that we
+ // have
+ this->tagged_profile_.profile_data.replace (length,
+ encap.begin ());
+#else
+ this->tagged_profile_.profile_data.length (length);
+ CORBA::Octet *buffer =
+ this->tagged_profile_.profile_data.get_buffer ();
+ for (const ACE_Message_Block *i = encap.begin ();
+ i != encap.end ();
+ i = i->next ())
+ {
+ ACE_OS::memcpy (buffer, i->rd_ptr (), i->length ());
+ buffer += i->length ();
+ }
+#endif /* TAO_NO_COPY_OCTET_SEQUENCES == 1 */
+ }
+
+ return this->tagged_profile_;
+}
+
+void
+TAO_UIPMC_Profile::create_profile_body (TAO_OutputCDR &encap) const
+{
+ encap.write_octet (TAO_ENCAP_BYTE_ORDER);
+
+ // The GIOP version
+ // Note: Only GIOP 1.2 and above are supported currently for MIOP.
+ encap.write_octet (this->version_.major);
+ encap.write_octet (this->version_.minor);
+
+ // Address.
+ encap.write_string (this->endpoint_.get_host_addr ());
+
+ // Port number.
+ encap.write_ushort (this->endpoint_.port ());
+
+ // UIPMC is only supported by versions of GIOP that have tagged components,
+ // so unconditionally encode the components.
+ this->tagged_components ().encode (encap);
+}
+
+/*
+int
+TAO_UIPMC_Profile::decode_endpoints (void)
+{
+ IOP::TaggedComponent tagged_component;
+ tagged_component.tag = TAO_TAG_ENDPOINTS;
+
+ if (this->tagged_components_.get_component (tagged_component))
+ {
+ const CORBA::Octet *buf =
+ tagged_component.component_data.get_buffer ();
+
+ TAO_InputCDR in_cdr (reinterpret_cast<const char*> (buf),
+ tagged_component.component_data.length ());
+
+ // Extract the Byte Order.
+ CORBA::Boolean byte_order;
+ if ((in_cdr >> ACE_InputCDR::to_boolean (byte_order)) == 0)
+ return -1;
+ in_cdr.reset_byte_order (static_cast<int> (byte_order));
+
+ // Extract endpoints sequence.
+ TAO_UIPMCEndpointSequence endpoints;
+
+ if ((in_cdr >> endpoints) == 0)
+ return -1;
+
+ // Get the priority of the first endpoint (head of the list.
+ // It's other data is extracted as part of the standard profile
+ // decoding.
+ this->endpoint_.priority (endpoints[0].priority);
+
+ // Use information extracted from the tagged component to
+ // populate the profile. Skip the first endpoint, since it is
+ // always extracted through standard profile body. Also, begin
+ // from the end of the sequence to preserve endpoint order,
+ // since <add_endpoint> method reverses the order of endpoints
+ // in the list.
+ for (CORBA::ULong i = endpoints.length () - 1;
+ i > 0;
+ --i)
+ {
+ TAO_UIPMC_Endpoint *endpoint = 0;
+ ACE_NEW_RETURN (endpoint,
+ TAO_UIPMC_Endpoint (endpoints[i].host,
+ endpoints[i].port,
+ endpoints[i].priority),
+ -1);
+
+ this->add_endpoint (endpoint);
+ }
+ }
+
+ return 0;
+}
+*/
+
+void
+TAO_UIPMC_Profile::set_group_info (const char *domain_id,
+ PortableGroup::ObjectGroupId group_id,
+ PortableGroup::ObjectGroupRefVersion ref_version)
+{
+ // First, record the group information.
+ this->group_domain_id_.set (domain_id);
+ this->group_id_ = group_id;
+ this->ref_version_ = ref_version;
+
+ // Update the cached version of the group component.
+ this->update_cached_group_component ();
+}
+
+void
+TAO_UIPMC_Profile::update_cached_group_component (void)
+{
+ PortableGroup::TagGroupTaggedComponent group;
+
+ // Encode the data structure.
+ group.component_version.major = TAO_DEF_MIOP_MAJOR;
+ group.component_version.minor = TAO_DEF_MIOP_MINOR;
+
+ group.group_domain_id = CORBA::string_dup (this->group_domain_id_.c_str ());
+ group.object_group_id = this->group_id_;
+ group.object_group_ref_version = this->ref_version_;
+
+ TAO_OutputCDR out_cdr;
+
+ // Write the byte order.
+ out_cdr << ACE_OutputCDR::from_boolean (ACE_CDR_BYTE_ORDER);
+
+ // Write the group information.
+ if ((out_cdr << group) == 0)
+ {
+ ACE_DEBUG ((LM_DEBUG,
+ "Error marshaling group component!"));
+ return;
+ }
+
+ size_t length = out_cdr.total_length ();
+
+ IOP::TaggedComponent tagged_component;
+ tagged_component.tag = IOP::TAG_GROUP;
+ tagged_component.component_data.length (static_cast<CORBA::ULong> (length));
+ CORBA::Octet *buf =
+ tagged_component.component_data.get_buffer ();
+
+ for (const ACE_Message_Block *iterator = out_cdr.begin ();
+ iterator != 0;
+ iterator = iterator->cont ())
+ {
+ size_t i_length = iterator->length ();
+ ACE_OS::memcpy (buf, iterator->rd_ptr (), i_length);
+
+ buf += i_length;
+ }
+
+ // Add component with encoded endpoint data to this profile's
+ // TaggedComponents.
+ this->tagged_components_.set_component (tagged_component);
+}
+
+void
+TAO_UIPMC_Profile::request_target_specifier (
+ TAO_Target_Specification &target_spec,
+ TAO_Target_Specification::TAO_Target_Address required_type
+ ACE_ENV_ARG_DECL)
+{
+ // Fill out the target specifier based on the required type.
+ switch (required_type)
+ {
+ case TAO_Target_Specification::Profile_Addr:
+
+ // Only using a profile as the target specifier is supported
+ // at this time. Object keys are strictly not supported since
+ // UIPMC profiles do not have object keys.
+ target_spec.target_specifier (
+ this->create_tagged_profile ());
+ break;
+
+ case TAO_Target_Specification::Key_Addr:
+ case TAO_Target_Specification::Reference_Addr:
+ default:
+ // Unsupported or unknown required type. Throw an exception.
+ ACE_THROW (CORBA::MARSHAL ());
+ }
+}
+
+int
+TAO_UIPMC_Profile::supports_multicast (void) const
+{
+ // Yes! We support multicast!
+ return 1;
+}
+
+void
+TAO_UIPMC_Profile::addressing_mode (CORBA::Short addr_mode
+ ACE_ENV_ARG_DECL)
+{
+ // ** See race condition note about addressing mode in Profile.h **
+ switch (addr_mode)
+ {
+ case TAO_Target_Specification::Profile_Addr:
+ case TAO_Target_Specification::Reference_Addr:
+ this->addressing_mode_ = addr_mode;
+ break;
+
+ case TAO_Target_Specification::Key_Addr:
+ // There is no object key, so it is not supported.
+
+ default:
+ ACE_THROW (CORBA::BAD_PARAM (
+ CORBA::SystemException::_tao_minor_code (
+ TAO::VMCID,
+ EINVAL),
+ CORBA::COMPLETED_NO));
+ }
+}
+
+int
+TAO_UIPMC_Profile::extract_group_component (const IOP::TaggedProfile &profile,
+ PortableGroup::TagGroupTaggedComponent &group)
+{
+ // Create the decoding stream from the encapsulation in the buffer,
+//#if (TAO_NO_COPY_OCTET_SEQUENCES == 1)
+// TAO_InputCDR cdr (profile.profile_data.mb ());
+//#else
+ TAO_InputCDR cdr (reinterpret_cast<const char*> (profile.profile_data.get_buffer ()),
+ profile.profile_data.length ());
+//#endif /* TAO_NO_COPY_OCTET_SEQUENCES == 1 */
+
+ // Extract the Byte Order.
+ CORBA::Boolean byte_order;
+ if ((cdr >> ACE_InputCDR::to_boolean (byte_order)) == 0)
+ return -1;
+ cdr.reset_byte_order (static_cast<int> (byte_order));
+
+ // Read and verify major, minor versions, ignoring UIPMC profiles
+ // whose versions we don't understand.
+ CORBA::Octet major;
+ CORBA::Octet minor = CORBA::Octet();
+
+ // Read the version. We just read it here. We don't*do any*
+ // processing.
+ if (!(cdr.read_octet (major)
+ && cdr.read_octet (minor)))
+ {
+ if (TAO_debug_level > 0)
+ {
+ ACE_DEBUG ((LM_DEBUG,
+ ACE_TEXT ("TAO (%P|%t) UIPMC_Profile::extract_group_component - v%d.%d\n"),
+ major,
+ minor));
+ }
+ return -1;
+ }
+
+ // Decode the endpoint.
+ ACE_CString address;
+ CORBA::UShort port;
+
+ if (!(cdr.read_string (address)
+ && cdr.read_ushort (port)))
+ {
+ if (TAO_debug_level > 0)
+ ACE_DEBUG ((LM_DEBUG,
+ ACE_TEXT ("TAO (%P|%t) UIPMC_Profile::extract_group_component - Couldn't unmarshal address and port!\n")));
+ return -1;
+ }
+
+ TAO_Tagged_Components tagged_components;
+ if (tagged_components.decode (cdr) == 0)
+ return -1;
+
+ IOP::TaggedComponent tagged_component;
+ tagged_component.tag = IOP::TAG_GROUP;
+
+ // Try to find it.
+ if (tagged_components.get_component (tagged_component) == 0)
+ return -1;
+
+ // Found it.
+ const CORBA::Octet *buf =
+ tagged_component.component_data.get_buffer ();
+
+ TAO_InputCDR in_cdr (reinterpret_cast<const char*> (buf),
+ tagged_component.component_data.length ());
+
+ // Extract the Byte Order.
+ if ((in_cdr >> ACE_InputCDR::to_boolean (byte_order)) == 0)
+ return -1;
+ in_cdr.reset_byte_order (static_cast<int> (byte_order));
+
+ if ((in_cdr >> group) == 0)
+ return -1;
+
+ return 0;
+}
+
+TAO_END_VERSIONED_NAMESPACE_DECL
diff --git a/TAO/orbsvcs/orbsvcs/PortableGroup/UIPMC_Profile.h b/TAO/orbsvcs/orbsvcs/PortableGroup/UIPMC_Profile.h
new file mode 100644
index 00000000000..a6f8846eeb5
--- /dev/null
+++ b/TAO/orbsvcs/orbsvcs/PortableGroup/UIPMC_Profile.h
@@ -0,0 +1,165 @@
+// -*- C++ -*-
+
+//=============================================================================
+/**
+ * @file UIPMC_Profile.h
+ *
+ * $Id$
+ *
+ * UIPMC profile specific processing
+ *
+ * @author Frank Hunleth <fhunleth@cs.wustl.edu>
+ */
+//=============================================================================
+
+#ifndef TAO_UIPMC_PROFILE_H
+#define TAO_UIPMC_PROFILE_H
+
+#include /**/ "ace/pre.h"
+
+#include "orbsvcs/PortableGroup/portablegroup_export.h"
+
+#if !defined (ACE_LACKS_PRAGMA_ONCE)
+# pragma once
+#endif /* ACE_LACKS_PRAGMA_ONCE */
+
+#include "orbsvcs/PortableGroup/UIPMC_Endpoint.h"
+
+#include "orbsvcs/PortableGroupC.h"
+
+#include "tao/Object_KeyC.h"
+#include "tao/target_specification.h"
+#include "tao/Profile.h"
+
+#include "ace/SString.h"
+
+TAO_BEGIN_VERSIONED_NAMESPACE_DECL
+
+// TAO UIPMC_Profile concrete Profile definitions
+/**
+ * @class TAO_UIPMC_Profile
+ *
+ * @brief This class defines the protocol specific attributes required
+ * for locating ORBs over a TCP/IP network.
+ *
+ * This class defines the UIPMC profile as specified in the CORBA
+ * specification.
+ *
+ * @NOTE: This class inherits the ObjectKey from TAO_Profile which may
+ * not be needed at all! But lets punt on this for the timebeing.
+ */
+class TAO_PortableGroup_Export TAO_UIPMC_Profile : public TAO_Profile
+{
+public:
+ /// The object key delimiter that UIPMC uses or expects.
+ static const char object_key_delimiter_;
+ virtual char object_key_delimiter (void) const;
+
+ /// Return the char string prefix.
+ static const char *prefix (void);
+
+ /// Profile constructor, default. Used when the profile contents
+ /// are not yet known or when it is being decoded from an IOR.
+ TAO_UIPMC_Profile (TAO_ORB_Core *orb_core);
+
+ /// Profile constructor, same as above except the object_key has
+ /// already been marshaled.
+ TAO_UIPMC_Profile (const ACE_INET_Addr &addr,
+ TAO_ORB_Core *orb_core);
+
+ /// Profile constructor.
+ TAO_UIPMC_Profile (const CORBA::Octet class_d_address[4],
+ CORBA::UShort port,
+ TAO_ORB_Core *orb_core);
+
+ /// Create object using a string ior.
+ TAO_UIPMC_Profile (const char *string,
+ TAO_ORB_Core *orb_core
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS);
+
+ /// Destructor is to be called only through <_decr_refcnt>.
+ ~TAO_UIPMC_Profile (void);
+
+ /// Template methods. Please see tao/Profile.h for documentation.
+
+ /// N.B. We have to override the TAO_Profile default decode because
+ /// in UIPMC there is no object key marshalled and we do not implement
+ /// a useable ::decode_endpoints
+ virtual int decode (TAO_InputCDR& cdr);
+ virtual void parse_string (const char *string
+ ACE_ENV_ARG_DECL);
+ virtual char * to_string (ACE_ENV_SINGLE_ARG_DECL);
+ virtual int encode_endpoints (void);
+ virtual TAO_Endpoint *endpoint (void);
+ virtual CORBA::ULong endpoint_count (void) const;
+ virtual CORBA::ULong hash (CORBA::ULong max
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS);
+ virtual IOP::TaggedProfile &create_tagged_profile (void);
+ virtual void request_target_specifier (
+ TAO_Target_Specification &target_spec,
+ TAO_Target_Specification::TAO_Target_Address r
+ ACE_ENV_ARG_DECL);
+ virtual int supports_multicast (void) const;
+ virtual void addressing_mode (CORBA::Short addr_mode
+ ACE_ENV_ARG_DECL);
+ static int extract_group_component (const IOP::TaggedProfile &profile,
+ PortableGroup::TagGroupTaggedComponent &group);
+
+ /// Add the mandatory group component to this profile.
+ void set_group_info (const char *domain_id,
+ PortableGroup::ObjectGroupId group_id,
+ PortableGroup::ObjectGroupRefVersion ref_version);
+
+
+protected:
+ /// Template methods, please see documentation in tao/Profile.h
+ virtual int decode_profile (TAO_InputCDR& cdr);
+ virtual int decode_endpoints (void);
+ virtual void parse_string_i (const char *
+ ACE_ENV_ARG_DECL);
+ virtual void create_profile_body (TAO_OutputCDR &cdr) const;
+ virtual CORBA::Boolean do_is_equivalent (const TAO_Profile *other_profile);
+ virtual void update_cached_group_component (void);
+
+protected:
+
+ /**
+ * Head of this profile's list of endpoints. This endpoint is not
+ * dynamically allocated because a profile always contains at least
+ * one endpoint.
+ *
+ * Currently, a profile contains more than one endpoint, i.e.,
+ * list contains more than just the head, only when RTCORBA is enabled.
+ * However, in the near future, this will be used in nonRT
+ * mode as well, e.g., to support TAG_ALTERNATE_IIOP_ADDRESS
+ * feature.
+ * Addressing info of the default endpoint, i.e., head of the list,
+ * is transmitted using standard UIPMC ProfileBody components. See
+ * <encode_endpoints> method documentation above for how the rest of
+ * the endpoint list is transmitted.
+ */
+ TAO_UIPMC_Endpoint endpoint_;
+
+ /// Number of endpoints in the list headed by <endpoint_>.
+ CORBA::ULong count_;
+
+private:
+
+ /// Cached version of our tagged profile.
+ IOP::TaggedProfile tagged_profile_;
+
+ /// Group Domain ID.
+ ACE_CString group_domain_id_;
+
+ /// Our group ID within the group domain.
+ PortableGroup::ObjectGroupId group_id_;
+
+ /// The group reference's version.
+ PortableGroup::ObjectGroupRefVersion ref_version_;
+
+};
+
+TAO_END_VERSIONED_NAMESPACE_DECL
+
+#include /**/ "ace/post.h"
+#endif /* TAO_UIPMC_PROFILE_H */
diff --git a/TAO/orbsvcs/orbsvcs/PortableGroup/UIPMC_Transport.cpp b/TAO/orbsvcs/orbsvcs/PortableGroup/UIPMC_Transport.cpp
new file mode 100644
index 00000000000..32c3b149dcb
--- /dev/null
+++ b/TAO/orbsvcs/orbsvcs/PortableGroup/UIPMC_Transport.cpp
@@ -0,0 +1,613 @@
+// $Id$
+
+#include "orbsvcs/PortableGroup/UIPMC_Profile.h"
+#include "orbsvcs/PortableGroup/UIPMC_Transport.h"
+#include "orbsvcs/PortableGroup/UIPMC_Connection_Handler.h"
+#include "orbsvcs/PortableGroup/UIPMC_Message_Block_Data_Iterator.h"
+#include "orbsvcs/PortableGroup/UIPMC_Acceptor.h"
+#include "orbsvcs/PortableGroup/UIPMC_Wait_Never.h"
+
+#include "tao/Acceptor_Registry.h"
+#include "tao/operation_details.h"
+#include "tao/Timeprobe.h"
+#include "tao/CDR.h"
+#include "tao/Transport_Mux_Strategy.h"
+#include "tao/Wait_Strategy.h"
+#include "tao/Stub.h"
+#include "tao/ORB_Core.h"
+#include "tao/debug.h"
+#include "tao/Resume_Handle.h"
+#include "tao/GIOP_Message_Base.h"
+#include "tao/GIOP_Message_Lite.h"
+
+ACE_RCSID (PortableGroup,
+ UIPMC_Transport,
+ "$Id$")
+
+
+// Local MIOP Definitions:
+
+// Note: We currently support packet fragmentation on transmit, but
+// do not support reassembly.
+
+// Limit the number of fragments that we can divide a message
+// into.
+#define MIOP_MAX_FRAGMENTS (1)
+#define MIOP_MAX_HEADER_SIZE (272) // See MIOP Spec. Must be a multiple of 8.
+#define MIOP_MAX_DGRAM_SIZE (ACE_MAX_DGRAM_SIZE)
+
+#define MIOP_MAGIC_OFFSET (0)
+#define MIOP_VERSION_OFFSET (4)
+#define MIOP_FLAGS_OFFSET (5)
+#define MIOP_PACKET_LENGTH_OFFSET (6)
+#define MIOP_PACKET_NUMBER_OFFSET (8)
+#define MIOP_NUMBER_OF_PACKETS_OFFSET (12)
+#define MIOP_ID_LENGTH_OFFSET (16)
+#define MIOP_MIN_LENGTH_ID (0)
+#define MIOP_MAX_LENGTH_ID (252)
+#define MIOP_ID_DEFAULT_LENGTH (12)
+#define MIOP_ID_CONTENT_OFFSET (20)
+#define MIOP_HEADER_PADDING (0) // The ID field needs to be padded to
+ // a multiple of 8 bytes.
+#define MIOP_HEADER_SIZE (MIOP_ID_CONTENT_OFFSET \
+ + MIOP_ID_DEFAULT_LENGTH \
+ + MIOP_HEADER_PADDING)
+#define MIOP_MIN_HEADER_SIZE (MIOP_ID_CONTENT_OFFSET \
+ + MIOP_MIN_LENGTH_ID \
+ + (8 - MIOP_MIN_LENGTH_ID) /* padding */)
+
+static const CORBA::Octet miop_magic[4] = { 0x4d, 0x49, 0x4f, 0x50 }; // 'M', 'I', 'O', 'P'
+
+TAO_BEGIN_VERSIONED_NAMESPACE_DECL
+
+struct MIOP_Packet
+{
+ iovec iov[ACE_IOV_MAX];
+ int iovcnt;
+ int length;
+};
+
+
+TAO_UIPMC_Transport::TAO_UIPMC_Transport (TAO_UIPMC_Connection_Handler *handler,
+ TAO_ORB_Core *orb_core,
+ CORBA::Boolean /*flag*/)
+ : TAO_Transport (IOP::TAG_UIPMC,
+ orb_core)
+ , connection_handler_ (handler)
+ , messaging_object_ (0)
+{
+ // Use the normal GIOP object
+ ACE_NEW (this->messaging_object_,
+ TAO_GIOP_Message_Base (orb_core,
+ this,
+ MIOP_MAX_DGRAM_SIZE));
+
+ // Replace the default wait strategy with our own
+ // since we don't support waiting on anything.
+ delete this->ws_;
+ ACE_NEW (this->ws_,
+ TAO_UIPMC_Wait_Never (this));
+}
+
+TAO_UIPMC_Transport::~TAO_UIPMC_Transport (void)
+{
+ delete this->messaging_object_;
+}
+
+ACE_Event_Handler *
+TAO_UIPMC_Transport::event_handler_i (void)
+{
+ return this->connection_handler_;
+}
+
+TAO_Connection_Handler *
+TAO_UIPMC_Transport::connection_handler_i (void)
+{
+ return this->connection_handler_;
+}
+
+TAO_Pluggable_Messaging *
+TAO_UIPMC_Transport::messaging_object (void)
+{
+ return this->messaging_object_;
+}
+
+
+void
+TAO_UIPMC_Transport::write_unique_id (TAO_OutputCDR &miop_hdr, unsigned long unique)
+{
+ // We currently construct a unique ID for each MIOP message by
+ // concatenating the address of the buffer to a counter. We may
+ // also need to use a MAC address or something more unique to
+ // fully comply with the MIOP specification.
+
+ static unsigned long counter = 1; // Don't worry about race conditions on counter,
+ // since buffer addresses can't be the same if
+ // this is being called simultaneously.
+
+ CORBA::Octet unique_id[MIOP_ID_DEFAULT_LENGTH];
+
+ unique_id[0] = static_cast<CORBA::Octet> (unique & 0xff);
+ unique_id[1] = static_cast<CORBA::Octet> ((unique & 0xff00) >> 8);
+ unique_id[2] = static_cast<CORBA::Octet> ((unique & 0xff0000) >> 16);
+ unique_id[3] = static_cast<CORBA::Octet> ((unique & 0xff000000) >> 24);
+
+ unique_id[4] = static_cast<CORBA::Octet> (counter & 0xff);
+ unique_id[5] = static_cast<CORBA::Octet> ((counter & 0xff00) >> 8);
+ unique_id[6] = static_cast<CORBA::Octet> ((counter & 0xff0000) >> 16);
+ unique_id[7] = static_cast<CORBA::Octet> ((counter & 0xff000000) >> 24);
+
+ unique_id[8] = 0;
+ unique_id[9] = 0;
+ unique_id[10] = 0;
+ unique_id[11] = 0;
+
+ miop_hdr.write_ulong (MIOP_ID_DEFAULT_LENGTH);
+ miop_hdr.write_octet_array (unique_id, MIOP_ID_DEFAULT_LENGTH);
+}
+
+ssize_t
+TAO_UIPMC_Transport::send (iovec *iov, int iovcnt,
+ size_t &bytes_transferred,
+ const ACE_Time_Value *)
+{
+ const ACE_INET_Addr &addr = this->connection_handler_->addr ();
+ bytes_transferred = 0;
+
+ // Calculate the bytes to send. This value is only used for
+ // error conditions to fake a good return. We do this for
+ // semantic consistency with DIOP, and since errors aren't
+ // handled correctly from send_i (our fault). If these
+ // semantics are not desirable, the error handling problems
+ // that need to be fixed can be found in
+ // UIPMC_Connection_Handler::decr_refcount which will need to
+ // deregister the connection handler from the UIPMC_Connector
+ // cache.
+ ssize_t bytes_to_send = 0;
+ for (int i = 0; i < iovcnt; i++)
+ bytes_to_send += iov[i].iov_len;
+
+ MIOP_Packet fragments[MIOP_MAX_FRAGMENTS];
+ MIOP_Packet *current_fragment;
+ int num_fragments = 1;
+
+ UIPMC_Message_Block_Data_Iterator mb_iter (iov, iovcnt);
+
+ // Initialize the first fragment
+ current_fragment = &fragments[0];
+ current_fragment->iovcnt = 1; // The MIOP Header
+ current_fragment->length = MIOP_HEADER_SIZE;
+
+ // Go through all of the message blocks.
+ while (mb_iter.next_block (MIOP_MAX_DGRAM_SIZE - current_fragment->length,
+ current_fragment->iov[current_fragment->iovcnt]))
+ {
+ // Increment the length and iovcnt.
+ current_fragment->length += current_fragment->iov[current_fragment->iovcnt].iov_len;
+ current_fragment->iovcnt++;
+
+ // Check if we've filled up this fragment or if we've run out of
+ // iov entries.
+ if (current_fragment->length == MIOP_MAX_DGRAM_SIZE ||
+ current_fragment->iovcnt == ACE_IOV_MAX)
+ {
+ // Make a new fragment.
+ num_fragments++;
+
+ // Check if too many fragments
+ if (num_fragments > MIOP_MAX_FRAGMENTS)
+ {
+ // This is an error as we do not send more.
+ // Silently drop the message but log an error.
+
+ // Pluggable_Messaging::transport_message only
+ // cares if it gets -1 or 0 so we can return a
+ // partial length and it will think all has gone
+ // well.
+ if (TAO_debug_level > 0)
+ {
+ ACE_DEBUG ((LM_DEBUG,
+ ACE_TEXT ("\n\nTAO (%P|%t) ")
+ ACE_TEXT ("UIPMC_Transport::send_i ")
+ ACE_TEXT ("Message of size %d needs too many MIOP fragments (max is %d).\n")
+ ACE_TEXT ("You may be able to increase ACE_MAX_DGRAM_SIZE.\n"),
+ bytes_to_send,
+ MIOP_MAX_FRAGMENTS));
+ }
+
+ // Pretend it is o.k. See note by bytes_to_send calculation.
+ bytes_transferred = bytes_to_send;
+ return 1;
+ }
+
+ // Otherwise, initialize another fragment.
+ current_fragment++;
+ current_fragment->iovcnt = 1; // The MIOP Header
+ current_fragment->length = MIOP_HEADER_SIZE;
+ }
+ }
+
+ // Build a generic MIOP Header.
+
+ // Allocate space on the stack for the header (add 8 to account for
+ // the possibility of adjusting for alignment).
+ char header_buffer[MIOP_HEADER_SIZE + 8];
+ TAO_OutputCDR miop_hdr (header_buffer, MIOP_HEADER_SIZE + 8);
+
+ miop_hdr.write_octet_array (miop_magic, 4); // Magic
+ miop_hdr.write_octet (0x10); // Version
+ CORBA::Octet *flags_field = reinterpret_cast<CORBA::Octet *> (miop_hdr.current ()->wr_ptr ());
+
+ // Write flags octet:
+ // Bit Description
+ // 0 Endian
+ // 1 Stop message flag (Assigned later)
+ // 2 - 7 Set to 0
+ miop_hdr.write_octet (TAO_ENCAP_BYTE_ORDER); // Flags
+
+ // Packet Length
+ // NOTE: We can save pointers and write them later without byte swapping since
+ // in CORBA, the sender chooses the endian.
+ CORBA::UShort *packet_length = reinterpret_cast<CORBA::UShort *> (miop_hdr.current ()->wr_ptr ());
+ miop_hdr.write_short (0);
+
+ // Packet number
+ CORBA::ULong *packet_number = reinterpret_cast<CORBA::ULong *> (miop_hdr.current ()->wr_ptr ());
+ miop_hdr.write_ulong (0);
+
+ // Number of packets field
+ miop_hdr.write_ulong (num_fragments);
+
+ // UniqueId
+ ptrdiff_t unique_id = reinterpret_cast<ptrdiff_t> (iov);
+ this->write_unique_id (miop_hdr,
+ static_cast<unsigned long> (unique_id));
+
+ // Send the buffers.
+ current_fragment = &fragments[0];
+ while (num_fragments > 0 &&
+ current_fragment->iovcnt > 1)
+ {
+ // Fill in the packet length header field.
+ *packet_length = static_cast<CORBA::UShort> (current_fragment->length);
+
+ // If this is the last fragment, set the stop message flag.
+ if (num_fragments == 1)
+ {
+ *flags_field |= 0x02;
+ }
+
+ // Setup the MIOP header in the iov list.
+ current_fragment->iov[0].iov_base = miop_hdr.current ()->rd_ptr ();
+ current_fragment->iov[0].iov_len = MIOP_HEADER_SIZE;
+
+ // Send the fragment. - Need to check for errors!!
+ ssize_t rc = this->connection_handler_->dgram ().send (current_fragment->iov,
+ current_fragment->iovcnt,
+ addr);
+
+ if (rc <= 0)
+ {
+ if (TAO_debug_level > 0)
+ {
+ ACE_DEBUG ((LM_DEBUG,
+ ACE_TEXT ("\n\nTAO (%P|%t) ")
+ ACE_TEXT ("UIPMC_Transport::send")
+ ACE_TEXT (" %p\n\n"),
+ ACE_TEXT ("Error returned from transport:")));
+ }
+
+ // Pretend it is o.k. See note by bytes_to_send calculation.
+ bytes_transferred = bytes_to_send;
+ return 1;
+ }
+
+ // Increment the number of bytes transferred, but don't
+ // count the MIOP header that we added.
+ bytes_transferred += rc - MIOP_HEADER_SIZE;
+
+ if (TAO_debug_level > 0)
+ {
+ ACE_DEBUG ((LM_DEBUG,
+ "TAO_UIPMC_Transport::send_i: sent %d bytes to %s:%d\n",
+ rc,
+ addr.get_host_addr (),
+ addr.get_port_number ()));
+ }
+
+ // Go to the next fragment.
+ (*packet_number)++;
+ ++current_fragment;
+ --num_fragments;
+ }
+
+ // Return total bytes transferred.
+ return bytes_transferred;
+}
+
+
+ssize_t
+TAO_UIPMC_Transport::recv (char *buf,
+ size_t len,
+ const ACE_Time_Value * /*max_wait_time*/)
+{
+ ACE_INET_Addr from_addr;
+
+ ssize_t n = this->connection_handler_->mcast_dgram ().recv (buf,
+ len,
+ from_addr);
+ if (TAO_debug_level > 5)
+ {
+ ACE_DEBUG ((LM_DEBUG,
+ "TAO_UIPMC_Transport::recv_i: received %d bytes from %s:%d\n",
+ n,
+ from_addr.get_host_addr (),
+ from_addr.get_port_number ()));
+ }
+
+ // Make sure that we at least have a MIOP header.
+ if (n < MIOP_MIN_HEADER_SIZE)
+ {
+ if (TAO_debug_level > 0)
+ {
+ ACE_DEBUG ((LM_DEBUG,
+ "TAO_UIPMC_Transport::recv_i: packet of size %d is too small from %s:%d\n",
+ n,
+ from_addr.get_host_addr (),
+ from_addr.get_port_number ()));
+ }
+ return 0;
+ }
+
+ // Check for MIOP magic bytes.
+ if (buf[MIOP_MAGIC_OFFSET] != miop_magic [0] ||
+ buf[MIOP_MAGIC_OFFSET + 1] != miop_magic [1] ||
+ buf[MIOP_MAGIC_OFFSET + 2] != miop_magic [2] ||
+ buf[MIOP_MAGIC_OFFSET + 3] != miop_magic [3])
+ {
+ if (TAO_debug_level > 0)
+ {
+ ACE_DEBUG ((LM_DEBUG,
+ "TAO_UIPMC_Transport::recv_i: UIPMC packet didn't contain magic bytes.\n"));
+ }
+
+ return 0;
+ }
+
+ // Retrieve the byte order.
+ // 0 = Big endian
+ // 1 = Small endian
+ CORBA::Octet byte_order = buf[MIOP_FLAGS_OFFSET] & 0x01;
+
+ // Ignore the header version, other flags, packet length and number of packets.
+
+ // Get the length of the ID.
+ CORBA::ULong id_length;
+#if !defined (ACE_DISABLE_SWAP_ON_READ)
+ if (byte_order == ACE_CDR_BYTE_ORDER)
+ {
+ id_length = *reinterpret_cast<ACE_CDR::ULong*> (&buf[MIOP_ID_LENGTH_OFFSET]);
+ }
+ else
+ {
+ ACE_CDR::swap_4 (&buf[MIOP_ID_LENGTH_OFFSET],
+ reinterpret_cast<char*> (&id_length));
+ }
+#else
+ id_length = *reinterpret_cast<ACE_CDR::ULong*> (&buf[MIOP_ID_LENGTH_OFFSET]);
+#endif /* ACE_DISABLE_SWAP_ON_READ */
+
+ // Make sure that the length field is legal.
+ if (id_length > MIOP_MAX_LENGTH_ID ||
+ static_cast<ssize_t> (MIOP_ID_CONTENT_OFFSET + id_length) > n)
+ {
+ if (TAO_debug_level > 0)
+ {
+ ACE_DEBUG ((LM_DEBUG,
+ "TAO_UIPMC_Transport::recv_i: Invalid ID length.\n"));
+ }
+
+ return 0;
+ }
+
+ // Trim off the header for now.
+ ssize_t miop_header_size = (MIOP_ID_CONTENT_OFFSET + id_length + 7) & ~0x7;
+ if (miop_header_size > n)
+ {
+ if (TAO_debug_level > 0)
+ {
+ ACE_DEBUG ((LM_DEBUG,
+ "TAO_UIPMC_Transport::recv_i: MIOP packet not large enough for padding.\n"));
+ }
+
+ return 0;
+ }
+
+ n -= miop_header_size;
+ ACE_OS::memmove (buf, buf + miop_header_size, n);
+
+ return n;
+}
+
+int
+TAO_UIPMC_Transport::handle_input (TAO_Resume_Handle &rh,
+ ACE_Time_Value *max_wait_time,
+ int /*block*/)
+{
+ // If there are no messages then we can go ahead to read from the
+ // handle for further reading..
+
+ // The buffer on the stack which will be used to hold the input
+ // messages
+ char buf [MIOP_MAX_DGRAM_SIZE];
+
+#if defined (ACE_INITIALIZE_MEMORY_BEFORE_USE)
+ (void) ACE_OS::memset (buf,
+ '\0',
+ sizeof buf);
+#endif /* ACE_INITIALIZE_MEMORY_BEFORE_USE */
+
+ // Create a data block
+ ACE_Data_Block db (sizeof (buf),
+ ACE_Message_Block::MB_DATA,
+ buf,
+ this->orb_core_->input_cdr_buffer_allocator (),
+ this->orb_core_->locking_strategy (),
+ ACE_Message_Block::DONT_DELETE,
+ this->orb_core_->input_cdr_dblock_allocator ());
+
+ // Create a message block
+ ACE_Message_Block message_block (&db,
+ ACE_Message_Block::DONT_DELETE,
+ this->orb_core_->input_cdr_msgblock_allocator ());
+
+
+ // Align the message block
+ ACE_CDR::mb_align (&message_block);
+
+
+ // Read the message into the message block that we have created on
+ // the stack.
+ ssize_t n = this->recv (message_block.rd_ptr (),
+ message_block.space (),
+ max_wait_time);
+
+ // If there is an error return to the reactor..
+ if (n <= 0)
+ {
+ if (TAO_debug_level)
+ {
+ ACE_DEBUG ((LM_DEBUG,
+ ACE_TEXT ("TAO: (%P|%t|%N|%l) recv returned error on transport %d after fault %p\n"),
+ this->id (),
+ ACE_TEXT ("handle_input_i ()\n")));
+ }
+
+ if (n == -1)
+ this->tms_->connection_closed ();
+
+ return n;
+ }
+
+ // Set the write pointer in the stack buffer.
+ message_block.wr_ptr (n);
+
+
+ // Make a node of the message block..
+ TAO_Queued_Data qd (&message_block);
+ size_t mesg_length;
+
+ // Parse the incoming message for validity. The check needs to be
+ // performed by the messaging objects.
+ if (this->messaging_object ()->parse_next_message (message_block,
+ qd,
+ mesg_length) == -1)
+ {
+ if (TAO_debug_level)
+ {
+ ACE_DEBUG ((LM_DEBUG,
+ ACE_TEXT ("TAO: (%P|%t|%N|%l) handle_input failed on transport %d after fault\n"),
+ this->id () ));
+ }
+
+ return -1;
+ }
+
+ if (message_block.length () > mesg_length)
+ {
+ if (TAO_debug_level)
+ {
+ ACE_DEBUG ((LM_DEBUG,
+ ACE_TEXT ("TAO: (%P|%t|%N|%l) handle_input failed on transport %d after fault\n"),
+ this->id () ));
+ }
+
+ return -1;
+ }
+
+ // NOTE: We are not performing any queueing nor any checking for
+ // missing data. We are assuming that ALL the data would be got in a
+ // single read.
+
+ // Process the message
+ return this->process_parsed_messages (&qd, rh);
+}
+
+int
+TAO_UIPMC_Transport::register_handler (void)
+{
+ // We never register register the handler with the reactor
+ // as we never need to be informed about any incoming data,
+ // assuming we only use one-ways.
+ // If we would register and ICMP Messages would arrive, e.g
+ // due to a not reachable server, we would get informed - as this
+ // disturbs the general MIOP assumptions of not being
+ // interested in any network failures, we ignore ICMP messages.
+ return 0;
+}
+
+int
+TAO_UIPMC_Transport::send_request (TAO_Stub *stub,
+ TAO_ORB_Core *orb_core,
+ TAO_OutputCDR &stream,
+ int message_semantics,
+ ACE_Time_Value *max_wait_time)
+{
+ if (this->ws_->sending_request (orb_core,
+ message_semantics) == -1)
+ return -1;
+
+ if (this->send_message (stream,
+ stub,
+ message_semantics,
+ max_wait_time) == -1)
+
+ return -1;
+
+ return 0;
+}
+
+int
+TAO_UIPMC_Transport::send_message (TAO_OutputCDR &stream,
+ TAO_Stub *stub,
+ int message_semantics,
+ ACE_Time_Value *max_wait_time)
+{
+ // Format the message in the stream first
+ if (this->messaging_object_->format_message (stream) != 0)
+ return -1;
+
+ // Strictly speaking, should not need to loop here because the
+ // socket never gets set to a nonblocking mode ... some Linux
+ // versions seem to need it though. Leaving it costs little.
+
+ // This guarantees to send all data (bytes) or return an error.
+ ssize_t n = this->send_message_shared (stub,
+ message_semantics,
+ stream.begin (),
+ max_wait_time);
+
+ if (n == -1)
+ {
+ if (TAO_debug_level)
+ ACE_DEBUG ((LM_DEBUG,
+ ACE_TEXT ("TAO: (%P|%t|%N|%l) closing transport %d after fault %p\n"),
+ this->id (),
+ ACE_TEXT ("send_message ()\n")));
+
+ return -1;
+ }
+
+ return 1;
+}
+
+int
+TAO_UIPMC_Transport::messaging_init (CORBA::Octet major,
+ CORBA::Octet minor)
+{
+ this->messaging_object_->init (major,
+ minor);
+ return 1;
+}
+
+TAO_END_VERSIONED_NAMESPACE_DECL
diff --git a/TAO/orbsvcs/orbsvcs/PortableGroup/UIPMC_Transport.h b/TAO/orbsvcs/orbsvcs/PortableGroup/UIPMC_Transport.h
new file mode 100644
index 00000000000..634b85c0b1a
--- /dev/null
+++ b/TAO/orbsvcs/orbsvcs/PortableGroup/UIPMC_Transport.h
@@ -0,0 +1,131 @@
+// -*- C++ -*-
+
+//=============================================================================
+/**
+ * @file UIPMC_Transport.h
+ *
+ * $Id$
+ *
+ * @author Frank Hunleth <fhunleth@cs.wustl.edu>
+ */
+//=============================================================================
+
+#ifndef TAO_UIPMC_TRANSPORT_H
+#define TAO_UIPMC_TRANSPORT_H
+#include /**/ "ace/pre.h"
+
+#include "orbsvcs/PortableGroup/portablegroup_export.h"
+
+#if !defined (ACE_LACKS_PRAGMA_ONCE)
+# pragma once
+#endif /* ACE_LACKS_PRAGMA_ONCE */
+
+#include "tao/Transport.h"
+
+#include "ace/SOCK_Stream.h"
+#include "ace/Svc_Handler.h"
+
+TAO_BEGIN_VERSIONED_NAMESPACE_DECL
+
+// Forward decls.
+class TAO_UIPMC_Connection_Handler;
+class TAO_ORB_Core;
+class TAO_Operation_Details;
+class TAO_Pluggable_Messaging;
+class TAO_Acceptor;
+
+// Service Handler for this transport
+typedef ACE_Svc_Handler<ACE_SOCK_STREAM, ACE_NULL_SYNCH>
+ TAO_UIPMC_SVC_HANDLER;
+
+#if defined ACE_HAS_EXPLICIT_TEMPLATE_INSTANTIATION_EXPORT
+template class TAO_PortableGroup_Export ACE_Svc_Handler<ACE_SOCK_STREAM, ACE_NULL_SYNCH>;
+#endif /* ACE_HAS_EXPLICIT_TEMPLATE_INSTANTIATION_EXPORT */
+
+/**
+ * @class TAO_UIPMC_Transport
+ *
+ * @brief Specialization of the base TAO_Transport class to handle the
+ * MIOP protocol.
+ */
+class TAO_PortableGroup_Export TAO_UIPMC_Transport : public TAO_Transport
+{
+public:
+
+ /// Constructor.
+ TAO_UIPMC_Transport (TAO_UIPMC_Connection_Handler *handler,
+ TAO_ORB_Core *orb_core,
+ CORBA::Boolean flag);
+
+ /// Default destructor.
+ ~TAO_UIPMC_Transport (void);
+
+ /// Look for the documentation in Transport.h.
+ virtual int handle_input (TAO_Resume_Handle &rh,
+ ACE_Time_Value *max_wait_time = 0,
+ int block = 0);
+protected:
+ /** @name Overridden Template Methods
+ *
+ * These are implementations of template methods declared by TAO_Transport.
+ */
+ //@{
+
+ virtual ACE_Event_Handler * event_handler_i (void);
+ virtual TAO_Connection_Handler *connection_handler_i (void);
+ virtual TAO_Pluggable_Messaging *messaging_object (void);
+
+ /// Write the complete Message_Block chain to the connection.
+ virtual ssize_t send (iovec *iov, int iovcnt,
+ size_t &bytes_transferred,
+ const ACE_Time_Value *max_wait_time);
+
+
+ /// Read len bytes from into buf.
+ virtual ssize_t recv (char *buf,
+ size_t len,
+ const ACE_Time_Value *s = 0);
+
+ virtual int register_handler (void);
+
+public:
+ /// @@TODO: These methods IMHO should have more meaningful
+ /// names. The names seem to indicate nothing.
+ virtual int send_request (TAO_Stub *stub,
+ TAO_ORB_Core *orb_core,
+ TAO_OutputCDR &stream,
+ int message_semantics,
+ ACE_Time_Value *max_wait_time);
+
+ virtual int send_message (TAO_OutputCDR &stream,
+ TAO_Stub *stub = 0,
+ int message_semantics = TAO_Transport::TAO_TWOWAY_REQUEST,
+ ACE_Time_Value *max_time_wait = 0);
+
+ /// Initialising the messaging object
+ virtual int messaging_init (CORBA::Octet major,
+ CORBA::Octet minor);
+
+ //@}
+
+private:
+ /// Process the message that we have read.
+ int process_message (void);
+
+ /// Construct and write a unique ID to the MIOP header.
+ void write_unique_id (TAO_OutputCDR &miop_hdr, unsigned long unique);
+
+private:
+
+ /// The connection service handler used for accessing lower layer
+ /// communication protocols.
+ TAO_UIPMC_Connection_Handler *connection_handler_;
+
+ /// Our messaging object.
+ TAO_Pluggable_Messaging *messaging_object_;
+};
+
+TAO_END_VERSIONED_NAMESPACE_DECL
+
+#include /**/ "ace/post.h"
+#endif /* TAO_UIPMC_TRANSPORT_H */
diff --git a/TAO/orbsvcs/orbsvcs/PortableGroup/UIPMC_Wait_Never.cpp b/TAO/orbsvcs/orbsvcs/PortableGroup/UIPMC_Wait_Never.cpp
new file mode 100644
index 00000000000..0e1a0f1bc89
--- /dev/null
+++ b/TAO/orbsvcs/orbsvcs/PortableGroup/UIPMC_Wait_Never.cpp
@@ -0,0 +1,53 @@
+// $Id$
+
+#include "orbsvcs/PortableGroup/UIPMC_Wait_Never.h"
+#include "tao/ORB_Core.h"
+#include "tao/Transport.h"
+#include "tao/debug.h"
+
+ACE_RCSID(tao, Wait_On_Leader_Follower, "$Id$")
+
+TAO_BEGIN_VERSIONED_NAMESPACE_DECL
+
+TAO_UIPMC_Wait_Never::TAO_UIPMC_Wait_Never (TAO_Transport *transport)
+ : TAO_Wait_Strategy (transport)
+{
+}
+
+TAO_UIPMC_Wait_Never::~TAO_UIPMC_Wait_Never (void)
+{
+}
+
+int
+TAO_UIPMC_Wait_Never::register_handler (void)
+{
+ return -1;
+}
+
+bool
+TAO_UIPMC_Wait_Never::non_blocking (void) const
+{
+ return true;
+}
+
+bool
+TAO_UIPMC_Wait_Never::can_process_upcalls (void) const
+{
+ return true;
+}
+
+int
+TAO_UIPMC_Wait_Never::sending_request (TAO_ORB_Core *,
+ int)
+{
+ return 0;
+}
+
+int
+TAO_UIPMC_Wait_Never::wait (ACE_Time_Value *,
+ TAO_Synch_Reply_Dispatcher &)
+{
+ return -1;
+}
+
+TAO_END_VERSIONED_NAMESPACE_DECL
diff --git a/TAO/orbsvcs/orbsvcs/PortableGroup/UIPMC_Wait_Never.h b/TAO/orbsvcs/orbsvcs/PortableGroup/UIPMC_Wait_Never.h
new file mode 100644
index 00000000000..9f39cd77b91
--- /dev/null
+++ b/TAO/orbsvcs/orbsvcs/PortableGroup/UIPMC_Wait_Never.h
@@ -0,0 +1,58 @@
+// -*- C++ -*-
+
+//=============================================================================
+/**
+ * @file UIPMC_Wait_Never.h
+ *
+ * $Id$
+ *
+ * @author Frank Hunleth <fhunleth@cs.wustl.edu>
+ */
+//=============================================================================
+
+
+#ifndef TAO_UIPMC_WAIT_NEVER_H
+#define TAO_UIPMC_WAIT_NEVER_H
+#include /**/ "ace/pre.h"
+
+#include "tao/Wait_Strategy.h"
+
+#if !defined (ACE_LACKS_PRAGMA_ONCE)
+# pragma once
+#endif /* ACE_LACKS_PRAGMA_ONCE */
+
+#include "orbsvcs/PortableGroup/portablegroup_export.h"
+
+TAO_BEGIN_VERSIONED_NAMESPACE_DECL
+
+/**
+ * @class TAO_UIPMC_Wait_Never
+ *
+ * @brief Since two-ways are not supported by UIPMC and more
+ * generally, anything that requires waiting isn't supported, so
+ * return error if anyone tries to do this.
+ */
+class TAO_PortableGroup_Export TAO_UIPMC_Wait_Never : public TAO_Wait_Strategy
+{
+
+public:
+ /// Constructor.
+ TAO_UIPMC_Wait_Never (TAO_Transport *transport);
+
+ /// Destructor.
+ virtual ~TAO_UIPMC_Wait_Never (void);
+
+ // = Documented in TAO_Wait_Strategy.
+ virtual int sending_request (TAO_ORB_Core *orb_core,
+ int two_way);
+ virtual int wait (ACE_Time_Value *max_wait_time,
+ TAO_Synch_Reply_Dispatcher &rd);
+ virtual int register_handler (void);
+ virtual bool non_blocking (void) const;
+ virtual bool can_process_upcalls (void) const;
+};
+
+TAO_END_VERSIONED_NAMESPACE_DECL
+
+#include /**/ "ace/post.h"
+#endif /* TAO_UIPMC_WAIT_NEVER_H */
diff --git a/TAO/orbsvcs/orbsvcs/PortableGroup/miopconf.h b/TAO/orbsvcs/orbsvcs/PortableGroup/miopconf.h
new file mode 100644
index 00000000000..44db690f7b2
--- /dev/null
+++ b/TAO/orbsvcs/orbsvcs/PortableGroup/miopconf.h
@@ -0,0 +1,41 @@
+// -*- C++ -*-
+
+//=============================================================================
+/**
+ * @file miopconf.h
+ *
+ * $Id$
+ *
+ * Build configuration file.
+ *
+ * @author Copyright 1995 by Sun Microsystems, Inc.
+ * @author Chris Cleeland
+ * @author Douglas C. Schmidt
+ */
+//=============================================================================
+
+#ifndef TAO_MIOPCONF_H
+#define TAO_MIOPCONF_H
+#include /**/ "ace/pre.h"
+
+#include "ace/config-all.h"
+
+#if !defined (ACE_LACKS_PRAGMA_ONCE)
+# pragma once
+#endif /* ACE_LACKS_PRAGMA_ONCE */
+
+// This is the version of the MIOP spec that TAO supports. The
+// exact usage of the version has not been emphasized. But TAO should
+// get a TaggedComponents for a group with this version number. So, for
+// the present, we do a sanity check for our version and raise an error on
+// a mismatch.
+
+#if !defined (TAO_DEF_MIOP_MAJOR)
+#define TAO_DEF_MIOP_MAJOR 1
+#endif /* TAO_DEF_MIOP_MAJOR */
+#if !defined (TAO_DEF_MIOP_MINOR)
+#define TAO_DEF_MIOP_MINOR 0
+#endif /* TAO_DEF_MIOP_MINOR */
+
+#include /**/ "ace/post.h"
+#endif /*TAO_MIOPCONF_H*/
diff --git a/TAO/orbsvcs/orbsvcs/PortableGroup/portablegroup_export.h b/TAO/orbsvcs/orbsvcs/PortableGroup/portablegroup_export.h
new file mode 100644
index 00000000000..15494956536
--- /dev/null
+++ b/TAO/orbsvcs/orbsvcs/PortableGroup/portablegroup_export.h
@@ -0,0 +1,40 @@
+
+// -*- C++ -*-
+// $Id$
+// Definition for Win32 Export directives.
+// This file is generated automatically by generate_export_file.pl
+// ------------------------------
+#ifndef TAO_PORTABLEGROUP_EXPORT_H
+#define TAO_PORTABLEGROUP_EXPORT_H
+
+#include "ace/config-all.h"
+
+#if defined (TAO_AS_STATIC_LIBS)
+# if !defined (TAO_PORTABLEGROUP_HAS_DLL)
+# define TAO_PORTABLEGROUP_HAS_DLL 0
+# endif /* ! TAO_PORTABLEGROUP_HAS_DLL */
+#else
+# if !defined (TAO_PORTABLEGROUP_HAS_DLL)
+# define TAO_PORTABLEGROUP_HAS_DLL 1
+# endif /* ! TAO_PORTABLEGROUP_HAS_DLL */
+#endif
+
+#if defined (TAO_PORTABLEGROUP_HAS_DLL) && (TAO_PORTABLEGROUP_HAS_DLL == 1)
+# if defined (TAO_PORTABLEGROUP_BUILD_DLL)
+# define TAO_PortableGroup_Export ACE_Proper_Export_Flag
+# define TAO_PORTABLEGROUP_SINGLETON_DECLARATION(T) ACE_EXPORT_SINGLETON_DECLARATION (T)
+# define TAO_PORTABLEGROUP_SINGLETON_DECLARE(SINGLETON_TYPE, CLASS, LOCK) ACE_EXPORT_SINGLETON_DECLARE(SINGLETON_TYPE, CLASS, LOCK)
+# else /* TAO_PORTABLEGROUP_BUILD_DLL */
+# define TAO_PortableGroup_Export ACE_Proper_Import_Flag
+# define TAO_PORTABLEGROUP_SINGLETON_DECLARATION(T) ACE_IMPORT_SINGLETON_DECLARATION (T)
+# define TAO_PORTABLEGROUP_SINGLETON_DECLARE(SINGLETON_TYPE, CLASS, LOCK) ACE_IMPORT_SINGLETON_DECLARE(SINGLETON_TYPE, CLASS, LOCK)
+# endif /* TAO_PORTABLEGROUP_BUILD_DLL */
+#else /* TAO_PORTABLEGROUP_HAS_DLL == 1 */
+# define TAO_PortableGroup_Export
+# define TAO_PORTABLEGROUP_SINGLETON_DECLARATION(T)
+# define TAO_PORTABLEGROUP_SINGLETON_DECLARE(SINGLETON_TYPE, CLASS, LOCK)
+#endif /* TAO_PORTABLEGROUP_HAS_DLL == 1 */
+
+#endif /* TAO_PORTABLEGROUP_EXPORT_H */
+
+// End of auto generated file.
diff --git a/TAO/orbsvcs/orbsvcs/PortableGroup_Simple_DS.idl b/TAO/orbsvcs/orbsvcs/PortableGroup_Simple_DS.idl
new file mode 100644
index 00000000000..5da9ea78453
--- /dev/null
+++ b/TAO/orbsvcs/orbsvcs/PortableGroup_Simple_DS.idl
@@ -0,0 +1,41 @@
+// -*- IDL -*-
+
+//=============================================================================
+/**
+ * @file PortableGroup_Simple_DS.idl
+ *
+ * $Id$
+ *
+ * The aim of this file is to provide a seperation between the actual
+ * PortableGroup interface and some of the data structures defined in
+ * this module. This would be apparent if you look at
+ * FT_CORBA_ORB.idl. FT_CORBA_ORB.idl can get away by just including
+ * this file and the generated code from this instead of linking in
+ * PortableGroup and the likes.
+ */
+//=============================================================================
+
+#ifndef _PORTABLEGROUP_SIMPLE_DS_IDL_
+#define _PORTABLEGROUP_SIMPLE_DS_IDL_
+
+#include "tao/GIOP.pidl"
+
+module PortableGroup
+{
+ typeprefix PortableGroup "omg.org";
+
+ // Specification for Interoperable Object Group References
+ typedef string GroupDomainId;
+ typedef unsigned long long ObjectGroupId;
+ typedef unsigned long ObjectGroupRefVersion;
+
+ struct TagGroupTaggedComponent
+ { // tag = TAG_GROUP;
+ GIOP::Version component_version;
+ GroupDomainId group_domain_id;
+ ObjectGroupId object_group_id;
+ ObjectGroupRefVersion object_group_ref_version;
+ };
+};
+
+#endif /*_PORTABLEGROUP_SIMPLE_DS_IDL_*/
diff --git a/TAO/orbsvcs/orbsvcs/Property/CosPropertyService_i.cpp b/TAO/orbsvcs/orbsvcs/Property/CosPropertyService_i.cpp
new file mode 100644
index 00000000000..817d0726b4b
--- /dev/null
+++ b/TAO/orbsvcs/orbsvcs/Property/CosPropertyService_i.cpp
@@ -0,0 +1,1888 @@
+// $Id$
+
+// ============================================================================
+//
+// = LIBRARY
+// cos
+//
+// = FILENAME
+// CosPropertyService_i.cpp
+//
+// = AUTHOR
+// Alexander Babu Arulanthu <alex@cs.wustl.edu>
+//
+// ============================================================================
+
+#include "orbsvcs/Property/CosPropertyService_i.h"
+#include "ace/ACE.h"
+#include "ace/OS_NS_string.h"
+
+ACE_RCSID(Property, CosPropertyService_i, "$Id$")
+
+TAO_BEGIN_VERSIONED_NAMESPACE_DECL
+
+// = Methods to deal with ACE_Hash_Map_Manager.
+
+CosProperty_Hash_Key::CosProperty_Hash_Key (void)
+{
+}
+
+CosProperty_Hash_Key::CosProperty_Hash_Key (const char * &name)
+ : pname_ (CORBA::string_dup (name))
+{
+}
+
+CosProperty_Hash_Key::CosProperty_Hash_Key (const CosPropertyService::PropertyName &name)
+ : pname_ (CORBA::string_dup (name))
+{
+}
+
+CosProperty_Hash_Key::CosProperty_Hash_Key (const CosProperty_Hash_Key &src)
+ : pname_ (src.pname_)
+{
+}
+
+bool
+CosProperty_Hash_Key::operator == (const CosProperty_Hash_Key &hash_key) const
+{
+ return (ACE_OS::strcmp (this->pname_,
+ hash_key.pname_) == 0);
+}
+
+u_long
+CosProperty_Hash_Key::hash (void) const
+{
+ u_long ret = ACE::hash_pjw (this->pname_);
+
+ return ret;
+}
+
+CosProperty_Hash_Key::~CosProperty_Hash_Key (void)
+{
+}
+
+//======================================================================
+
+CosProperty_Hash_Value::CosProperty_Hash_Value (void)
+{
+}
+
+CosProperty_Hash_Value::CosProperty_Hash_Value (const CORBA::Any &any,
+ const CosPropertyService::PropertyModeType &mode)
+ : pvalue_ (any),
+ pmode_ (mode)
+{
+}
+
+CosProperty_Hash_Value::CosProperty_Hash_Value (const CosProperty_Hash_Value &src)
+ : pvalue_ (src.pvalue_),
+ pmode_ (src.pmode_)
+{
+}
+
+CosProperty_Hash_Value::~CosProperty_Hash_Value (void)
+{
+}
+
+//======================================================================
+
+// Constructor.
+TAO_PropertySetFactory::TAO_PropertySetFactory (void)
+{
+}
+
+// Destructor.
+TAO_PropertySetFactory::~TAO_PropertySetFactory (void)
+{
+}
+
+// Returns a new TAO_PropertySet object. "The property set returned
+// will *not* have any initial properties." Keep sequence of things
+// new'ed and at the destructor of the factory delete all these New'ed
+// things.
+
+CosPropertyService::PropertySet_ptr
+TAO_PropertySetFactory::create_propertyset (ACE_ENV_SINGLE_ARG_DECL)
+ ACE_THROW_SPEC ((CORBA::SystemException))
+{
+ // New a TAO_PropertySet.
+ TAO_PropertySet *new_set;
+ ACE_NEW_RETURN (new_set, TAO_PropertySet, 0);
+
+ // Successful, store this in the products sequence and return.
+ CORBA::ULong cur_len = this->propertyset_products_.length ();
+ this->propertyset_products_.length (cur_len + 1);
+ this->propertyset_products_[cur_len] = new_set;
+ return new_set->_this (ACE_ENV_SINGLE_ARG_PARAMETER);
+}
+
+// Allows a client to create a new TAO_PropertySet with specific
+// constraints. "All the properties will have *fixed-normal* modes".
+
+CosPropertyService::PropertySet_ptr
+TAO_PropertySetFactory::create_constrained_propertyset (const CosPropertyService::PropertyTypes &allowed_property_types,
+ const CosPropertyService::Properties &allowed_properties
+ ACE_ENV_ARG_DECL)
+ ACE_THROW_SPEC ((CORBA::SystemException,
+ CosPropertyService::ConstraintNotSupported))
+{
+ TAO_PropertySet *new_set = 0;
+ CosPropertyService::PropertySet_ptr propset_ptr = 0;
+
+ ACE_TRY
+ {
+ // New a TAO_PropertySet using these constraints.
+ ACE_NEW_RETURN (new_set,
+ TAO_PropertySet (allowed_property_types,
+ allowed_properties
+ ACE_ENV_ARG_PARAMETER), 0);
+ ACE_TRY_CHECK;
+
+ // Successful, store this in the products sequence.
+ CORBA::ULong products_len = this->propertyset_products_.length ();
+ this->propertyset_products_.length (products_len + 1);
+ this->propertyset_products_[products_len] = new_set;
+
+ // All done.
+ propset_ptr = new_set->_this (ACE_ENV_SINGLE_ARG_PARAMETER);
+ ACE_TRY_CHECK;
+ }
+ ACE_CATCH (CORBA::UserException, ex)
+ {
+ // Release the memory.
+ delete new_set;
+
+ // Throw the exception.
+ ACE_TRY_THROW (CosPropertyService::ConstraintNotSupported());
+ }
+ ACE_CATCH (CORBA::SystemException, ex)
+ {
+ // Release memory.
+ delete new_set;
+
+ // Throw the exception.
+ ACE_RE_THROW;
+ }
+ ACE_ENDTRY;
+ ACE_CHECK_RETURN (0);
+
+ return propset_ptr;
+}
+
+// Allows a client to create a new TAO_PropertySet with specific
+// constraints. "All the properties will have *fixed-normal* modes".
+
+CosPropertyService::PropertySet_ptr
+TAO_PropertySetFactory::create_initial_propertyset (const CosPropertyService::Properties &initial_properties
+ ACE_ENV_ARG_DECL)
+ ACE_THROW_SPEC ((CORBA::SystemException,
+ CosPropertyService::MultipleExceptions))
+{
+ TAO_PropertySet *new_set = 0;
+ CosPropertyService::PropertySet_ptr propset_ptr = 0;
+
+ ACE_TRY
+ {
+ // New a TAO_PropertySet.
+ ACE_NEW_RETURN (new_set,
+ TAO_PropertySet (initial_properties
+ ACE_ENV_ARG_PARAMETER), 0);
+ ACE_TRY_CHECK;
+
+ // Successful, store this in the products sequence.
+ CORBA::ULong products_len = this->propertyset_products_.length ();
+ this->propertyset_products_.length (products_len + 1);
+ this->propertyset_products_[products_len] = new_set;
+
+ // All done.
+ propset_ptr = new_set->_this (ACE_ENV_SINGLE_ARG_PARAMETER);
+ ACE_TRY_CHECK;
+ }
+ ACE_CATCH (CosPropertyService::MultipleExceptions, ex)
+ {
+ // Release memory.
+ delete new_set;
+
+ // Throw the exception.
+ ACE_RE_THROW;
+ }
+ ACE_CATCH (CORBA::SystemException, ex)
+ {
+ // Release the memory.
+ delete new_set;
+
+ // Throw the exception.
+ ACE_RE_THROW;
+ }
+ ACE_ENDTRY;
+ ACE_CHECK_RETURN (0);
+
+ return propset_ptr;
+}
+
+// Destructor.
+TAO_PropertySetDefFactory::~TAO_PropertySetDefFactory (void)
+{
+ // Release all the new'ed products.
+ for (CORBA::ULong pi = 0;
+ pi < this->propertysetdef_products_.length ();
+ pi++)
+ delete this->propertysetdef_products_[pi];
+}
+
+//======================================================================
+
+// Constrctor.
+TAO_PropertySetDefFactory::TAO_PropertySetDefFactory (void)
+{
+}
+
+// Returns a new TAO_PropertySetDef object. "The property setdef
+// returned will *not* have any initial properties."
+// Keep sequence of things new'ed and at the destructor of the factory
+// delete all these New'ed things.
+
+CosPropertyService::PropertySetDef_ptr
+TAO_PropertySetDefFactory::create_propertysetdef (ACE_ENV_SINGLE_ARG_DECL)
+ ACE_THROW_SPEC ((CORBA::SystemException))
+{
+ // New a TAO_PropertySetDef.
+ TAO_PropertySetDef *new_set;
+ ACE_NEW_RETURN (new_set, TAO_PropertySetDef, 0);
+
+ // Successful, store this in the products sequence and return.
+ CORBA::ULong cur_len = this->propertysetdef_products_.length ();
+ this->propertysetdef_products_.length (cur_len + 1);
+ this->propertysetdef_products_[cur_len] = new_set;
+
+ CosPropertyService::PropertySetDef_ptr propsetdef_ptr =
+ new_set->_this (ACE_ENV_SINGLE_ARG_PARAMETER);
+ ACE_CHECK_RETURN (0);
+
+ return propsetdef_ptr;
+}
+
+CosPropertyService::PropertySetDef_ptr
+TAO_PropertySetDefFactory::create_constrained_propertysetdef (const CosPropertyService::PropertyTypes &allowed_property_types,
+ const CosPropertyService::PropertyDefs &allowed_property_defs
+ ACE_ENV_ARG_DECL)
+ ACE_THROW_SPEC ((CORBA::SystemException,
+ CosPropertyService::ConstraintNotSupported))
+{
+ TAO_PropertySetDef *new_set = 0;
+ CosPropertyService::PropertySetDef_ptr propsetdef_ptr = 0;
+
+ ACE_TRY
+ {
+ // New a TAO_PropertySetDef using these constraints.
+ ACE_NEW_RETURN (new_set,
+ TAO_PropertySetDef (allowed_property_types,
+ allowed_property_defs
+ ACE_ENV_ARG_PARAMETER), 0);
+ ACE_TRY_CHECK;
+
+ // Successful, store this in the products sequence.
+ CORBA::ULong products_len = this->propertysetdef_products_.length ();
+ this->propertysetdef_products_.length (products_len + 1);
+ this->propertysetdef_products_[products_len] = new_set;
+
+ // All done. Return the pointer.
+ propsetdef_ptr = new_set->_this (ACE_ENV_SINGLE_ARG_PARAMETER);
+ ACE_TRY_CHECK;
+ }
+ ACE_CATCH (CORBA::UserException, ex)
+ {
+ // Release the memory.
+ delete new_set;
+
+ // Throw the exception.
+ ACE_TRY_THROW (CosPropertyService::ConstraintNotSupported());
+ }
+ ACE_CATCH (CORBA::SystemException, ex)
+ {
+ // Release memory.
+ delete new_set;
+
+ // Throw the exception.
+ ACE_RE_THROW;
+ }
+ ACE_ENDTRY;
+ ACE_CHECK_RETURN (0);
+
+ return propsetdef_ptr;
+}
+
+// Allows the client to create a new TAO_PropertySetDef with specific
+// initital constraints.
+
+CosPropertyService::PropertySetDef_ptr
+TAO_PropertySetDefFactory::create_initial_propertysetdef (const CosPropertyService::PropertyDefs &initial_property_defs
+ ACE_ENV_ARG_DECL)
+ ACE_THROW_SPEC ((CORBA::SystemException,
+ CosPropertyService::MultipleExceptions))
+{
+ TAO_PropertySetDef *new_set = 0;
+ CosPropertyService::PropertySetDef_ptr propsetdef_ptr = 0;
+
+ ACE_TRY
+ {
+ // New a TAO_PropertySet using these lengths.
+ ACE_NEW_RETURN (new_set,
+ TAO_PropertySetDef (initial_property_defs
+ ACE_ENV_ARG_PARAMETER), 0);
+ ACE_TRY_CHECK;
+
+ // Successful, store this in the products sequence.
+ CORBA::ULong products_len = this->propertysetdef_products_.length ();
+ this->propertysetdef_products_.length (products_len + 1);
+ this->propertysetdef_products_[products_len] = new_set;
+
+ // All done.
+ propsetdef_ptr = new_set->_this (ACE_ENV_SINGLE_ARG_PARAMETER);
+ ACE_TRY_CHECK;
+ }
+ ACE_CATCH (CosPropertyService::MultipleExceptions, ex)
+ {
+ // Release memory.
+ delete new_set;
+
+ // Throw the exception.
+ ACE_RE_THROW;
+ }
+ ACE_CATCH (CORBA::SystemException, ex)
+ {
+ // Release the memory.
+ delete new_set;
+
+ // Throw the exception.
+ ACE_RE_THROW;
+ }
+ ACE_ENDTRY;
+ ACE_CHECK_RETURN (0);
+
+ return propsetdef_ptr;
+}
+
+//======================================================================
+
+// Makes default sized hash_table_. All the sequences are set the max
+// length as 0.
+
+TAO_PropertySet::TAO_PropertySet (void)
+{
+}
+
+// Init values that the PropertySetFactory will want to specify. Write
+// the allowed properties in the Hash Table with *fixed-normal* mode.
+// @@ Need to check for duplicate properties and raise exceptions.
+
+
+TAO_PropertySet::TAO_PropertySet (const CosPropertyService::PropertyTypes allowed_property_types,
+ const CosPropertyService::Properties allowed_properties
+ ACE_ENV_ARG_DECL)
+ : allowed_property_types_ (allowed_property_types),
+ allowed_property_names_ (allowed_properties.length ())
+{
+ // Set the length for the sequence, just to make sure.
+ this->allowed_property_names_.length (allowed_properties.length ());
+
+ // Keep the allowed property names in the sequence..
+ for (CORBA::ULong ni = 0;
+ ni < allowed_properties.length ();
+ ni++)
+ this->allowed_property_names_[ni] =
+ allowed_properties[ni].property_name;
+
+ // Define the allowed properties in the hash table.
+ ACE_TRY
+ {
+ this->define_properties (allowed_properties
+ ACE_ENV_ARG_PARAMETER);
+ ACE_TRY_CHECK;
+ }
+ ACE_CATCHANY
+ {
+ ACE_PRINT_EXCEPTION (ACE_ANY_EXCEPTION, "TAO_PropertySet-Constructor");
+ ACE_RE_THROW;
+ }
+ ACE_ENDTRY;
+ ACE_CHECK;
+}
+
+// TAO_PropertySetDef's constructor needs this, for initializing the
+// allowed properties' sequence withe just the maximum length.
+
+TAO_PropertySet::TAO_PropertySet (const CosPropertyService::PropertyTypes allowed_property_types,
+ const CORBA::ULong number_of_allowed_properties
+ ACE_ENV_ARG_DECL_NOT_USED)
+ : allowed_property_types_ (allowed_property_types),
+ allowed_property_names_ (number_of_allowed_properties)
+{
+}
+
+// PropertySetFactory needs this constructor. Store all the initial
+// properies with *normal* modes.
+
+
+TAO_PropertySet::TAO_PropertySet (const CosPropertyService::Properties initial_properties
+ ACE_ENV_ARG_DECL)
+{
+ // Define all the initial properties in the Property Set. All take
+ // *normal* modes.
+ ACE_TRY
+ {
+ this->define_properties (initial_properties
+ ACE_ENV_ARG_PARAMETER);
+ ACE_TRY_CHECK;
+ }
+ ACE_CATCHANY
+ {
+ ACE_PRINT_EXCEPTION (ACE_ANY_EXCEPTION, "TAO_PropertySet-Constructor");
+ ACE_RE_THROW;
+ }
+ ACE_ENDTRY;
+ ACE_CHECK;
+}
+
+// Destructor. All sequences will be deleted.
+
+TAO_PropertySet::~TAO_PropertySet (void)
+{
+}
+
+// Function to modify or add a property to the PropertySet:
+// Adds the name and the value to the set... Doesn't check for Typecode
+// overwriting, duplicate names, void names etc, yet.
+// @@ Uses Normal mode as the default mode of properties, We can
+// change this behavior based on the Initial set of allowed modes, if
+// there is anything like that set by the client.
+
+
+void
+TAO_PropertySet::define_property (const char *property_name,
+ const CORBA::Any &property_value
+ ACE_ENV_ARG_DECL)
+ ACE_THROW_SPEC ((CORBA::SystemException,
+ CosPropertyService::InvalidPropertyName,
+ CosPropertyService::ConflictingProperty,
+ CosPropertyService::UnsupportedTypeCode,
+ CosPropertyService::UnsupportedProperty,
+ CosPropertyService::ReadOnlyProperty))
+{
+ // Check the name's validity.
+ if (property_name == 0)
+ ACE_THROW (CosPropertyService::InvalidPropertyName());
+
+ CORBA::TypeCode_var arg_tc = property_value.type ();
+
+ // Is this type allowed?
+ if (is_type_allowed (arg_tc.in ()) != 1)
+ ACE_THROW (CosPropertyService::UnsupportedTypeCode());
+
+ // Is this property allowed?
+ if (is_property_allowed (property_name) != 1)
+ ACE_THROW (CosPropertyService::UnsupportedProperty());
+
+ // Try to bind the property. Use normal mode.
+ CosProperty_Hash_Key hash_key (property_name);
+ CosProperty_Hash_Value hash_value (property_value,
+ CosPropertyService::normal);
+ COSPROPERTY_HASH_ENTRY *entry_ptr;
+ //CosProperty_Hash_Key old_key;
+ //CosProperty_Hash_Value old_value;
+
+ int ret = this->hash_table_.bind (hash_key,
+ hash_value,
+ entry_ptr);
+
+ CORBA::TypeCode_var mapped_tc;
+
+ switch (ret)
+ {
+ case 0:
+ break;
+ case 1:
+ // Property already exists.
+
+ // Is the pointer valid?
+ if (entry_ptr == 0)
+ ACE_THROW (CORBA::UNKNOWN ());
+
+ mapped_tc = entry_ptr->int_id_.pvalue_.type ();
+
+ {
+ CORBA::Boolean const equal_tc =
+ mapped_tc.in ()->equal (arg_tc.in ()
+ ACE_ENV_ARG_PARAMETER);
+ ACE_CHECK;
+
+ // If type is not the same, raise exception.
+ if (!equal_tc)
+ 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());
+
+ // Use the mode that is already there.
+ hash_value.pmode_ = entry_ptr->int_id_.pmode_;
+
+ // Everything is fine. Overwrite the value.
+ if (this->hash_table_.rebind (hash_key,
+ hash_value) != 1)
+ {
+ ACE_DEBUG ((LM_DEBUG,
+ "TAO_PropertySet::Define Property failed\n"));
+ ACE_THROW (CORBA::UNKNOWN ());
+ }
+ break;
+ default:
+ // Error. ret is -1.
+ ACE_THROW (CORBA::UNKNOWN ());
+ }
+
+ return;
+}
+
+// Tells whether this type is allowed in this property set or no.
+
+CORBA::Boolean
+TAO_PropertySet::is_type_allowed (CORBA::TypeCode_ptr type)
+{
+ ACE_DECLARE_NEW_CORBA_ENV;
+
+ // If the sequence is empty, no constraints.
+ if (this->allowed_property_types_.length () == 0)
+ return 1;
+
+ // Check in the allowed_property_types sequence.
+ CORBA::Boolean ret_val = 0;
+ for (CORBA::ULong ti = 0;
+ ti < this->allowed_property_types_.length ();
+ ti++)
+ {
+ ACE_TRY
+ {
+ ret_val = this->allowed_property_types_[ti]->equal (type
+ ACE_ENV_ARG_PARAMETER);
+ ACE_TRY_CHECK;
+
+ if (ret_val == 1)
+ return 1;
+ }
+ ACE_CATCHANY
+ {
+ ACE_PRINT_EXCEPTION (ACE_ANY_EXCEPTION,
+ "TAO_PropertySet::is_type_allowed failed");
+ return ret_val;
+ }
+ ACE_ENDTRY;
+ ACE_CHECK_RETURN (0);
+ }
+
+ // Type not found.
+ return ret_val;
+}
+
+// Tells whether this property is allowed in this property or no.
+
+CORBA::Boolean
+TAO_PropertySet::is_property_allowed (const char* property_name)
+{
+ // If the sequence is empty, no constraints.
+ if (this->allowed_property_names_.length() == 0)
+ return 1;
+
+ // Check in the allowed_property_names.
+ for (CORBA::ULong ni = 0;
+ ni < this->allowed_property_names_.length ();
+ ni++)
+ if (ACE_OS::strcmp ((const char *) this->allowed_property_names_[ni],
+ property_name) == 0)
+ return 1;
+
+ // Name not found in the sequence.
+ return 0;
+}
+
+// Defining a sequence of properties
+//
+// Check for overwriting, duplicate names, void names etc and raise
+// appropriate exceptions.
+
+
+void
+TAO_PropertySet::define_properties (const CosPropertyService::Properties &nproperties
+ ACE_ENV_ARG_DECL)
+ ACE_THROW_SPEC ((CORBA::SystemException,
+ CosPropertyService::MultipleExceptions))
+{
+ // Get the length.
+ CORBA::ULong sequence_length = nproperties.length ();
+
+ // Define multiple exceptions object.
+ CosPropertyService::MultipleExceptions multi_ex;
+
+ for (CORBA::ULong pi = 0; pi < sequence_length; pi++)
+ {
+ ACE_TRY
+ {
+ // Define this property.
+ this->define_property (nproperties [pi].property_name.in (),
+ nproperties [pi].property_value
+ 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 =
+ nproperties[pi].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 =
+ nproperties[pi].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 =
+ nproperties[pi].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 =
+ nproperties[pi].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 =
+ nproperties[pi].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));
+}
+
+// Returns the current number of properties associated with this
+// PropertySet.
+
+
+CORBA::ULong
+TAO_PropertySet::get_number_of_properties (ACE_ENV_SINGLE_ARG_DECL_NOT_USED)
+ ACE_THROW_SPEC ((CORBA::SystemException))
+{
+ return static_cast<CORBA::ULong> (this->hash_table_.current_size ());
+}
+
+// Returns all of the property names currently defined in the
+// PropertySet. If the PropertySet contains more than <how_many>
+// property names, then the remaining property names are put into the
+// PropertyNamesIterator.
+
+
+void
+TAO_PropertySet::get_all_property_names (CORBA::ULong how_many,
+ CosPropertyService::PropertyNames_out property_names,
+ CosPropertyService::PropertyNamesIterator_out rest
+ ACE_ENV_ARG_DECL)
+ ACE_THROW_SPEC ((CORBA::SystemException))
+{
+ // Allocating storage is a must.
+ ACE_NEW (property_names,
+ CosPropertyService::PropertyNames);
+
+ CORBA::ULong num_of_properties =
+ this->get_number_of_properties (ACE_ENV_SINGLE_ARG_PARAMETER);
+ ACE_CHECK;
+
+ if (num_of_properties == 0)
+ // Nothing to do.
+ return;
+
+ // Set the length of the property_names appropriately.
+ CORBA::ULong sequence_length = 0;
+
+ if (how_many > 0)
+ {
+ if (how_many >= num_of_properties)
+ sequence_length = num_of_properties;
+ else
+ sequence_length = how_many;
+ property_names->length (sequence_length);
+ }
+
+ // Iterate thru names and put them in the property_names.
+
+ COSPROPERTY_HASH_ENTRY *entry_ptr;
+ COSPROPERTY_HASH_ITERATOR iterator (this->hash_table_);
+
+ for (CORBA::ULong ni = 0;
+ ni < sequence_length;
+ ni++, iterator.advance ())
+ if (iterator.next (entry_ptr) != 0)
+ property_names [ni] =
+ CORBA::string_dup (entry_ptr->ext_id_.pname_.in ());
+
+ // If there are some more properties, put them in the
+ // iterator. How?? Make a new PropertySet and use that to create
+ // propertyNames Iterator.
+
+ if (num_of_properties > how_many)
+ {
+ TAO_PropertySet *property_set;
+
+ ACE_NEW (property_set, TAO_PropertySet);
+
+ for (CORBA::ULong i = how_many;
+ i < num_of_properties;
+ i++, iterator.advance ())
+ if (iterator.next (entry_ptr) != 0)
+ if (property_set->hash_table_.bind (entry_ptr->ext_id_,
+ entry_ptr->int_id_) < 0)
+ ACE_DEBUG ((LM_DEBUG,
+ "Error:TAO_PropertySet::get_all_property_names\n"));
+
+ // Make the NamesIterator out of this TAO_PropertySet.
+ TAO_PropertyNamesIterator *names_iterator;
+ ACE_NEW (names_iterator, TAO_PropertyNamesIterator (*property_set));
+
+ // Init the out parameter.
+
+ // Get the Interface ptr.
+ CosPropertyService::PropertyNamesIterator_ptr iterator_ptr =
+ names_iterator->_this (ACE_ENV_SINGLE_ARG_PARAMETER);
+ ACE_CHECK;
+
+ // POA stuff todo here, since we have <destroy> method in the
+ // <NamesIterator> interface.
+ // Give ownership of this servant to the POA.
+ names_iterator->_remove_ref (ACE_ENV_SINGLE_ARG_PARAMETER);
+ ACE_CHECK;
+
+ // Init the out parameter.
+ rest = iterator_ptr;
+ }
+}
+
+// Returns the value of a property in the PropertySet.
+
+
+CORBA::Any *
+TAO_PropertySet::get_property_value (const char *property_name
+ ACE_ENV_ARG_DECL)
+ ACE_THROW_SPEC ((CORBA::SystemException,
+ CosPropertyService::PropertyNotFound,
+ CosPropertyService::InvalidPropertyName))
+{
+ // Check the name's validity.
+ if (property_name == 0)
+ ACE_THROW_RETURN (CosPropertyService::InvalidPropertyName(),
+ 0);
+
+ // Get the value out of the hash table.
+
+ CosProperty_Hash_Key hash_key (property_name);
+ CosProperty_Hash_Value hash_value;
+
+ if (this->hash_table_.find (hash_key, hash_value) != 0)
+ ACE_THROW_RETURN (CosPropertyService::PropertyNotFound(),
+ 0);
+
+ // Return the any value got.
+ CORBA::Any *any_ptr =0;
+ ACE_NEW_RETURN (any_ptr,
+ CORBA::Any (hash_value.pvalue_),
+ 0);
+ return any_ptr;
+}
+
+// Returns the values of the properties listed in property_names. When
+// the boolean return value is true, the Properties parameter contains
+// valid values for all requested property names. If false, then all
+// properties with a value of type tk_void may have failed due to
+// <PropertyNotFound> or <InvalidPropertyName>.
+
+
+CORBA::Boolean
+TAO_PropertySet::get_properties (const CosPropertyService::PropertyNames &property_names,
+ CosPropertyService::Properties_out nproperties
+ ACE_ENV_ARG_DECL)
+ ACE_THROW_SPEC ((CORBA::SystemException))
+{
+ // Allocate memory for the out parameter.
+ ACE_NEW_RETURN (nproperties,
+ CosPropertyService::Properties,
+ 0);
+
+ // Validate the length.
+ CORBA::ULong n = property_names.length ();
+ if (n == 0)
+ return 0;
+
+ // Set the length for the out parameter.
+ nproperties->length (n);
+
+ // Get values for all the names.
+
+ CORBA::Any_ptr any_ptr = 0;
+ CORBA::Boolean ret_val = 1;
+
+ for (CORBA::ULong i = 0; i < n; i++)
+ {
+ any_ptr = get_property_value (property_names [i]
+ ACE_ENV_ARG_PARAMETER);
+ ACE_CHECK_RETURN (0);
+
+ if (any_ptr != 0)
+ {
+ // Property is found.
+ nproperties [i].property_name = property_names [i];
+ nproperties [i].property_value = *any_ptr;
+ }
+ else
+ {
+ // Invalid name. Ret value is False.
+ ret_val = 0;
+
+ // Assign void type to this name in the out parameter.
+ nproperties [i].property_name =
+ property_names [i];
+
+ // Make an any value with tk_void type.
+ CORBA::Any any;
+ any._tao_set_typecode (CORBA::_tc_void);
+ nproperties [i].property_value = any;
+ }
+ }
+
+ return ret_val;
+}
+
+
+void
+TAO_PropertySet::get_all_properties (CORBA::ULong how_many,
+ CosPropertyService::Properties_out nproperties,
+ CosPropertyService::PropertiesIterator_out rest
+ ACE_ENV_ARG_DECL)
+ ACE_THROW_SPEC ((CORBA::SystemException))
+{
+ // Allocate memory for the out parameter.
+ ACE_NEW (nproperties,
+ CosPropertyService::Properties);
+
+ // Validate the length.
+ CORBA::ULong num_of_properties =
+ this->get_number_of_properties (ACE_ENV_SINGLE_ARG_PARAMETER);
+ ACE_CHECK;
+
+ if (num_of_properties == 0)
+ return;
+
+ // Set the length for the nproperties if how_many > 0.
+ CORBA::ULong sequence_length = 0;
+
+ if (how_many > 0)
+ {
+ if (how_many >= num_of_properties)
+ sequence_length = num_of_properties;
+ else
+ sequence_length = how_many;
+
+ nproperties->length (sequence_length);
+ }
+
+ // Prepare an iterator and iterate through the PropertySet. Retrive
+ // the values.
+
+ COSPROPERTY_HASH_ITERATOR iterator (this->hash_table_);
+ COSPROPERTY_HASH_ENTRY *entry_ptr = 0;
+
+ for (CORBA::ULong i = 0;
+ i < sequence_length;
+ i++, iterator.advance ())
+ if (iterator.next (entry_ptr) != 0)
+ {
+ nproperties[i].property_name =
+ CORBA::string_dup (entry_ptr->ext_id_.pname_.in ());
+ nproperties[i].property_value =
+ entry_ptr->int_id_.pvalue_;
+ }
+
+ // If there are more properties, put them in the <PropertiesIterator>.
+ // Make a new <TAO_PropertySet> and use that to create an Properties
+ // iterator. put that in a iterator and assign that to the out
+ // paramerter.
+
+ if (num_of_properties > how_many)
+ {
+ TAO_PropertySet *prop_set;
+
+ ACE_NEW (prop_set, TAO_PropertySet);
+
+ for (CORBA::ULong i = sequence_length;
+ i < num_of_properties;
+ i++, iterator.advance ())
+ {
+ if (iterator.next (entry_ptr) != 0
+ && prop_set->hash_table_.bind (entry_ptr->ext_id_,
+ entry_ptr->int_id_) < 0)
+ ACE_DEBUG ((LM_DEBUG,
+ "Error:TAO_PropertySet::get_all_properties\n"));
+ }
+
+ // Make the iterator out of the new TAO_Propset.
+ TAO_PropertiesIterator *iterator = 0;
+ ACE_NEW (iterator,
+ TAO_PropertiesIterator (*prop_set));
+
+ // Init the out parameter.
+
+ // Get the interface ptr.
+ CosPropertyService::PropertiesIterator_ptr iterator_ptr =
+ iterator->_this (ACE_ENV_SINGLE_ARG_PARAMETER);
+ ACE_CHECK;
+
+ // POA stuff todo here, since we have <destroy> method in the
+ // <NamesIterator> interface.
+ // Give ownership of this servant to the POA.
+ iterator->_remove_ref (ACE_ENV_SINGLE_ARG_PARAMETER);
+ ACE_CHECK;
+
+ // Init the out parameter.
+ rest = iterator_ptr;
+ }
+}
+
+// Deletes the specified property if it exists from a PropertySet.
+
+
+void
+TAO_PropertySet::delete_property (const char *property_name
+ ACE_ENV_ARG_DECL)
+ ACE_THROW_SPEC ((CORBA::SystemException,
+ CosPropertyService::PropertyNotFound,
+ CosPropertyService::InvalidPropertyName,
+ CosPropertyService::FixedProperty))
+{
+ // Check the name's validity.
+ if (property_name == 0)
+ ACE_THROW (CosPropertyService::InvalidPropertyName());
+
+ // Get the entry from the Hash Table.
+
+ CosProperty_Hash_Key hash_key (property_name);
+ COSPROPERTY_HASH_ENTRY *entry_ptr = 0;
+
+ if (this->hash_table_.find (hash_key,
+ entry_ptr) == -1)
+ ACE_THROW (CosPropertyService::PropertyNotFound());
+
+ // If property is fixed, then raise exception.
+ if ((entry_ptr->int_id_.pmode_ == CosPropertyService::fixed_normal)
+ || (entry_ptr->int_id_.pmode_ == CosPropertyService::fixed_readonly))
+ ACE_THROW (CosPropertyService::FixedProperty());
+
+ // Unbind this property.
+ if (this->hash_table_.unbind (entry_ptr) != 0)
+ {
+ ACE_THROW (CORBA::UNKNOWN ());
+ }
+
+ return;
+}
+
+// Deletes the properties defined in the property_names
+// parameter. This is a batch operation that returns the
+// MultipleExceptions exception if any delete failed.
+
+
+void
+TAO_PropertySet::delete_properties (const CosPropertyService::PropertyNames &property_names
+ ACE_ENV_ARG_DECL)
+ ACE_THROW_SPEC ((CORBA::SystemException,
+ CosPropertyService::MultipleExceptions))
+{
+ // Get the length.
+ CORBA::ULong sequence_length = property_names.length ();
+
+ // Declare multiple exceptions' object.
+ CosPropertyService::MultipleExceptions *multi_ex = 0;
+ ACE_NEW (multi_ex,
+ CosPropertyService::MultipleExceptions);
+
+ for (CORBA::ULong pi = 0; pi < sequence_length; pi++)
+ {
+ ACE_TRY
+ {
+ // Delete this property.
+ this->delete_property (property_names[pi]
+ ACE_ENV_ARG_PARAMETER);
+ ACE_TRY_CHECK;
+ }
+ 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_names[pi];
+ }
+ 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_names[pi];
+ }
+ ACE_CATCH (CosPropertyService::FixedProperty, 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::fixed_property;
+ multi_ex->exceptions[len].failing_property_name =
+ property_names[pi];
+ }
+ ACE_CATCH (CORBA::SystemException, sysex)
+ {
+ // We cant afford to get this. Throw this.
+ ACE_RE_THROW;
+ }
+ ACE_ENDTRY;
+ ACE_CHECK;
+ }
+
+ // Raise the multiple exceptions if there are any.
+ if (multi_ex->exceptions.length () > 0)
+ ACE_THROW (CosPropertyService::MultipleExceptions (*multi_ex));
+}
+
+// Delete all the properties in the current ProperySet : Delete the
+// properties one by one.
+
+
+CORBA::Boolean
+TAO_PropertySet::delete_all_properties (ACE_ENV_SINGLE_ARG_DECL)
+ ACE_THROW_SPEC ((CORBA::SystemException))
+{
+ // Get all the property names in a names' sequence.
+ CosPropertyService::PropertyNames *names_ptr = 0;
+ CosPropertyService::PropertyNames_out names_out (names_ptr);
+ CosPropertyService::PropertyNames_var names;
+
+ CosPropertyService::PropertyNamesIterator *iter_ptr = 0;
+ CosPropertyService::PropertyNamesIterator_out iter_out (iter_ptr);
+ CosPropertyService::PropertyNamesIterator_var iter;
+
+ CORBA::ULong size = this->get_number_of_properties (ACE_ENV_SINGLE_ARG_PARAMETER);
+ ACE_CHECK_RETURN (0);
+
+ this->get_all_property_names (size,
+ names_out,
+ iter_out
+ ACE_ENV_ARG_PARAMETER);
+ ACE_CHECK_RETURN (0);
+
+ // Get the out values on to the var varibles.
+ names = names_out.ptr ();
+ iter = iter_out.ptr ();
+
+ // Delete all these properties.
+ this->delete_properties (names.in ()
+ ACE_ENV_ARG_PARAMETER);
+ ACE_CHECK_RETURN (0);
+
+ // All properties deleted.
+ return 1;
+}
+
+// Returns TRUE if the property is defined in the PropertySet.
+
+
+CORBA::Boolean
+TAO_PropertySet::is_property_defined (const char *property_name
+ ACE_ENV_ARG_DECL_NOT_USED)
+ ACE_THROW_SPEC ((CORBA::SystemException,
+ CosPropertyService::InvalidPropertyName))
+{
+ CosProperty_Hash_Key hash_key (property_name);
+
+ if (this->hash_table_.find (hash_key) == 0)
+ return 1;
+ else
+ return 0;
+}
+
+
+void
+TAO_PropertySet::operator= (const TAO_PropertySet &)
+{
+ // 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());
+
+ // 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 = 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 = 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;
+}
+
+TAO_END_VERSIONED_NAMESPACE_DECL
diff --git a/TAO/orbsvcs/orbsvcs/Property/CosPropertyService_i.h b/TAO/orbsvcs/orbsvcs/Property/CosPropertyService_i.h
new file mode 100644
index 00000000000..d887745dec3
--- /dev/null
+++ b/TAO/orbsvcs/orbsvcs/Property/CosPropertyService_i.h
@@ -0,0 +1,621 @@
+// -*- C++ -*-
+
+//=============================================================================
+/**
+ * @file CosPropertyService_i.h
+ *
+ * $Id$
+ *
+ * @author Alexander Babu Arulanthu <alex@cs.wustl.edu>
+ */
+//=============================================================================
+
+#ifndef TAO_COSPROPERTYSERVICE_I_H
+#define TAO_COSPROPERTYSERVICE_I_H
+
+#include /**/ "ace/pre.h"
+
+#include "orbsvcs/Property/property_serv_export.h"
+
+#if !defined (ACE_LACKS_PRAGMA_ONCE)
+# pragma once
+#endif /* ACE_LACKS_PRAGMA_ONCE */
+
+#include "orbsvcs/CosPropertyS.h"
+
+#include "tao/Sequence_T.h"
+#include "ace/Hash_Map_Manager.h"
+#include "ace/Null_Mutex.h"
+
+// This is to remove "inherits via dominance" warnings from MSVC.
+// MSVC is being a little too paranoid.
+#if defined(_MSC_VER)
+#pragma warning(push)
+#pragma warning(disable:4250)
+#endif /* _MSC_VER */
+
+TAO_BEGIN_VERSIONED_NAMESPACE_DECL
+
+// = Classes to deal with the ACE_Hash_Map_Manager.
+
+class TAO_Property_Serv_Export CosProperty_Hash_Key
+{
+ // = TITLE
+ // Key for the Hash Table. The EXT_ID of the
+ // ACE_Hash_Map_Manager.
+public:
+ // = Initialization and termination methods.
+
+ CosProperty_Hash_Key (void);
+ // Default constructor.
+
+ CosProperty_Hash_Key (const char * &name);
+ // Constructor from a const string.
+
+ CosProperty_Hash_Key (const CosPropertyService::PropertyName &name);
+ // Costructor that takes PropertyName.
+
+ CosProperty_Hash_Key (const CosProperty_Hash_Key &hash_key);
+ // Copy constructor.
+
+ virtual ~CosProperty_Hash_Key (void);
+ // Destructor.
+
+ virtual bool operator == (const CosProperty_Hash_Key &hash_key) const;
+ // The operator for hash binding and "find"ing.
+
+ virtual u_long hash (void) const;
+ // The function that computes a hash value.
+
+// private:
+
+ CosPropertyService::PropertyName_var pname_;
+ // Storage pointer.
+};
+
+class TAO_Property_Serv_Export CosProperty_Hash_Value
+{
+ // = TITLE
+ // This will be the value part in the Hash_Table. The INT_ID of
+ // the ACE_Hash_Map_Manager.
+public:
+ // = Initialization and termination methods.
+
+ CosProperty_Hash_Value (void);
+ // Default constructor.
+
+ CosProperty_Hash_Value (const CORBA::Any &any,
+ const CosPropertyService::PropertyModeType &mode);
+ // Constructor with the property_value and the property_mode.
+
+ CosProperty_Hash_Value (const CosProperty_Hash_Value &hash_value);
+ // Copy constructor.
+
+ virtual ~CosProperty_Hash_Value (void);
+ // Destructor.
+
+//private:
+
+ CORBA::Any pvalue_;
+ // property value.
+
+ CosPropertyService::PropertyModeType pmode_;
+ // Property Mode.
+};
+
+// ============================================================================
+
+// Forward declaration.
+class TAO_PropertySet;
+
+// ============================================================================
+
+class TAO_Property_Serv_Export TAO_PropertySetFactory : public virtual POA_CosPropertyService::PropertySetFactory
+{
+ // = TITLE
+ // Factory class for the TAO_PropertySet class objects.
+ //
+ // = DESCRIPTION
+ // The object may be created with some predfined properties.
+public:
+ // = Initialization and termination methods.
+
+ TAO_PropertySetFactory (void);
+ // Constructor.
+
+ virtual ~TAO_PropertySetFactory (void);
+ // Destructor.
+
+ virtual CosPropertyService::PropertySet_ptr
+ create_propertyset (ACE_ENV_SINGLE_ARG_DECL_WITH_DEFAULTS)
+ ACE_THROW_SPEC ((CORBA::SystemException));
+ // Returns a new TAO_PropertySet object. "The property set returned
+ // will *not* have any initial properties."
+
+ virtual CosPropertyService::PropertySet_ptr
+ create_constrained_propertyset (const CosPropertyService::PropertyTypes &allowed_property_types,
+ const CosPropertyService::Properties &allowed_properties
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS)
+ ACE_THROW_SPEC ((CORBA::SystemException,
+ CosPropertyService::ConstraintNotSupported));
+ // Allows a client to create a new TAO_PropertySet with specific
+ // constraints. "All the properties will have *fixed-normal* modes".
+
+ virtual CosPropertyService::PropertySet_ptr
+ create_initial_propertyset (const CosPropertyService::Properties &initial_properties
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS)
+ ACE_THROW_SPEC ((CORBA::SystemException,
+ CosPropertyService::MultipleExceptions));
+ // Allows a client to create a new TAO_PropertySet with specific
+ // initial properties."All the properties will have *fixed-normal"
+ // modes".
+
+private:
+ TAO::unbounded_value_sequence<TAO_PropertySet*> propertyset_products_;
+ // The PropertySet objects new'ed and given to the client. Let us
+ // keep track all of them so that we can delete them at the end.
+};
+
+// ============================================================================
+
+// Forward declaration.
+class TAO_PropertySetDef;
+
+// ============================================================================
+
+class TAO_Property_Serv_Export TAO_PropertySetDefFactory : public virtual POA_CosPropertyService::PropertySetDefFactory
+{
+ // = TITLE
+ // Factory class for the TAO_PropertySetDef objects.
+ //
+ // = DESCRIPTION
+ // The object creation may be done with some predefined properties.
+public:
+ // = Initialization and termination methods.
+
+ TAO_PropertySetDefFactory(void);
+ // Constructor.
+
+ virtual ~TAO_PropertySetDefFactory (void);
+ // Destructor.
+
+ virtual CosPropertyService::PropertySetDef_ptr
+ create_propertysetdef (ACE_ENV_SINGLE_ARG_DECL_WITH_DEFAULTS)
+ ACE_THROW_SPEC ((CORBA::SystemException));
+ // Returns a new TAO_PropertySetDef object.
+
+ virtual CosPropertyService::PropertySetDef_ptr
+ create_constrained_propertysetdef (const CosPropertyService::PropertyTypes &allowed_property_types,
+ const CosPropertyService::PropertyDefs &allowed_property_defs
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS)
+ ACE_THROW_SPEC ((CORBA::SystemException,
+ CosPropertyService::ConstraintNotSupported));
+ // Allows a client to create a new TAO_PropertySetDef with specific
+ // constraints.
+
+ virtual CosPropertyService::PropertySetDef_ptr
+ create_initial_propertysetdef (const CosPropertyService::PropertyDefs &initial_property_defs
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS)
+ ACE_THROW_SPEC ((CORBA::SystemException,
+ CosPropertyService::MultipleExceptions));
+ // Allows a client to create a new TAO_PropertySetDef with specific
+ // initial properties.
+
+private:
+ TAO::unbounded_value_sequence<TAO_PropertySetDef*> propertysetdef_products_;
+ // The PropertySet objects new'ed and given to the client. Let us
+ // keep track all of them so that we can delete them at the end.
+};
+
+// ============================================================================
+
+class TAO_Property_Serv_Export TAO_PropertySet : public virtual POA_CosPropertyService::PropertySet
+{
+ // = TITLE
+ // Gives operations for defining, deleting, enumerating and
+ // checking of properties.
+ //
+ // = DESCRIPTION
+ // Uses a HashTable to manage the properties.
+public:
+ friend class TAO_PropertyNamesIterator;
+ friend class TAO_PropertiesIterator;
+
+ // = Initialization and termination methods.
+
+ TAO_PropertySet (void);
+ // Default constructor.
+
+ TAO_PropertySet (const CosPropertyService::PropertyTypes allowed_property_types,
+ const CosPropertyService::Properties allowed_properties
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS);
+ // Init values that the PropertySetFactory will want to specify.
+
+ TAO_PropertySet (const CosPropertyService::Properties initial_properties
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS);
+ // PropertySetFactory needs this constructor.
+
+ TAO_PropertySet (const CosPropertyService::PropertyTypes allowed_property_types,
+ const CORBA::ULong number_of_allowed_propertydefs
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS);
+ // PropertySetDef's construction needs this.
+
+ virtual ~TAO_PropertySet (void);
+ // Destructor function.
+
+ virtual void define_property (const char *property_name,
+ const CORBA::Any &property_value
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS)
+ ACE_THROW_SPEC ((CORBA::SystemException,
+ CosPropertyService::InvalidPropertyName,
+ CosPropertyService::ConflictingProperty,
+ CosPropertyService::UnsupportedTypeCode,
+ CosPropertyService::UnsupportedProperty,
+ CosPropertyService::ReadOnlyProperty));
+
+ // Store the property in the hash after checking for validity of the
+ // property name, duplicate name, type code over writing etc.
+
+ virtual void define_properties (const CosPropertyService::Properties &nproperties
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS)
+ ACE_THROW_SPEC ((CORBA::SystemException,
+ CosPropertyService::MultipleExceptions));
+ // Define a sequence of properties at a time.
+
+ virtual CORBA::ULong get_number_of_properties (ACE_ENV_SINGLE_ARG_DECL_WITH_DEFAULTS)
+ ACE_THROW_SPEC ((CORBA::SystemException));
+ // Get the number of properties that are currently defined in the
+ // PropertySet.
+
+ virtual void get_all_property_names (CORBA::ULong how_many,
+ CosPropertyService::PropertyNames_out property_names,
+ CosPropertyService::PropertyNamesIterator_out rest
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS)
+ ACE_THROW_SPEC ((CORBA::SystemException));
+ // Get the names of all the properties that are currently defined in
+ // the property set.
+
+ virtual CORBA::Any *get_property_value (const char *property_name
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS)
+ ACE_THROW_SPEC ((CORBA::SystemException,
+ CosPropertyService::PropertyNotFound,
+ CosPropertyService::InvalidPropertyName));
+ // Get the value of the property, given the name.
+
+ virtual CORBA::Boolean get_properties (const CosPropertyService::PropertyNames &property_names,
+ CosPropertyService::Properties_out nproperties
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS)
+ ACE_THROW_SPEC ((CORBA::SystemException));
+ // Get all names and their property values.
+
+ virtual void get_all_properties (CORBA::ULong how_many,
+ CosPropertyService::Properties_out nproperties,
+ CosPropertyService::PropertiesIterator_out rest
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS)
+ ACE_THROW_SPEC ((CORBA::SystemException));
+ // Returns all of the property names currently defined in the
+ // PropertySet. If the PropertySet contains more than how_many
+ // property names, then the remaining property names are put into the PropertyNamesIterator.
+
+ virtual void delete_property (const char *property_name
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS)
+ ACE_THROW_SPEC ((CORBA::SystemException,
+ CosPropertyService::PropertyNotFound,
+ CosPropertyService::InvalidPropertyName,
+ CosPropertyService::FixedProperty));
+ // Delete a property given a name.
+
+ virtual void delete_properties (const CosPropertyService::PropertyNames &property_names
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS)
+ ACE_THROW_SPEC ((CORBA::SystemException,
+ CosPropertyService::MultipleExceptions));
+ // Delete all the these properties from this property set.
+
+ virtual CORBA::Boolean delete_all_properties (ACE_ENV_SINGLE_ARG_DECL_WITH_DEFAULTS)
+ ACE_THROW_SPEC ((CORBA::SystemException));
+ // Delete everything from this property set.
+
+ virtual CORBA::Boolean is_property_defined (const char *property_name
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS)
+ ACE_THROW_SPEC ((CORBA::SystemException,
+ CosPropertyService::InvalidPropertyName));
+ // Tell whether this property is defined or no. Forget about the
+ // value.
+
+protected:
+ typedef ACE_Hash_Map_Manager<CosProperty_Hash_Key, CosProperty_Hash_Value, ACE_Null_Mutex>
+ COSPROPERTY_HASH_MAP;
+ typedef ACE_Hash_Map_Entry<CosProperty_Hash_Key, CosProperty_Hash_Value>
+ COSPROPERTY_HASH_ENTRY;
+ typedef ACE_Hash_Map_Iterator<CosProperty_Hash_Key, CosProperty_Hash_Value, ACE_Null_Mutex>
+ COSPROPERTY_HASH_ITERATOR;
+ // Typedefs are useful.
+
+ CORBA::Boolean is_type_allowed (CORBA::TypeCode_ptr type);
+ // Tells whether this type is allowed in this property set or no.
+
+ CORBA::Boolean is_property_allowed (const char *name);
+ // Tells whether this property is allowed in this property set or
+ // no.
+
+private:
+ void operator= (const TAO_PropertySet &);
+ // Made private because not usable
+
+ TAO_PropertySet (const TAO_PropertySet &);
+ // Not possible to copy
+
+public: // @todo make private
+ COSPROPERTY_HASH_MAP hash_table_;
+ // This Hash_Table manages storage for our properties.
+
+protected:
+ CosPropertyService::PropertyTypes allowed_property_types_;
+ // Stores the property types that can be allowed in this property
+ // set.
+
+ CosPropertyService::PropertyNames allowed_property_names_;
+ // Stores the property names that are allowed in this property
+ // set. These properties will be defined with *fixed-normal* modes, by default, at
+ // creation.
+ // If this is *not* empty, these properties will be the only
+ // properties that will exist in this property set. Nothing more
+ // can be defined.
+};
+
+// ============================================================================
+
+class TAO_Property_Serv_Export TAO_PropertySetDef : public virtual POA_CosPropertyService::PropertySetDef,
+ public virtual TAO_PropertySet
+{
+ // = TITLE
+ // This class implements PropertySetDef interface, which is
+ // specialization (subclass) of PropertySet interface. This
+ // class provides operations to PropertySet constraints, define
+ // and modify with modes, and to get or set property modes.
+ //
+ // = DESCRIPTION
+ // It should be noted that a TAO_PropertySetDef is still considered
+ // a PropertySet. The specialization operations are simply to
+ // provide more client access and control of the characteristics
+ // (metadata) of a PropertySet.
+public:
+ // = Initialization and termination methods.
+ TAO_PropertySetDef (void);
+ // Constructor.
+
+ TAO_PropertySetDef (const CosPropertyService::PropertyTypes allowed_property_types,
+ const CosPropertyService::PropertyDefs allowed_property
+ ACE_ENV_ARG_DECL);
+ // The factory uses this constructor.
+
+ TAO_PropertySetDef (const CosPropertyService::PropertyDefs initial_property_defs
+ ACE_ENV_ARG_DECL);
+ // This is also for the factory.
+
+ virtual ~TAO_PropertySetDef (void);
+ // Destructor.
+
+ virtual void get_allowed_property_types (CosPropertyService::PropertyTypes_out property_types
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS)
+ ACE_THROW_SPEC ((CORBA::SystemException));
+ // Indicates which types of properties are supported by this
+ // PropertySet. If the output sequence is empty, then there is no
+ // restrictions on the any TypeCode portion of the property_value
+ // field of a Property in this PropertySet, unless the
+ // get_allowed_properties output sequence is not empty.
+
+ virtual void get_allowed_properties (CosPropertyService::PropertyDefs_out property_defs
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS)
+ ACE_THROW_SPEC ((CORBA::SystemException));
+
+ // Indicates which properties are supported by this PropertySet. If
+ // the output sequence is empty, then there is no restrictions on
+ // the properties that can be in this PropertySet, unless the
+ // get_allowed_property_types output sequence is not empty.
+
+ virtual void define_property_with_mode (const char *property_name,
+ const CORBA::Any &property_value,
+ CosPropertyService::PropertyModeType property_mode
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS)
+ ACE_THROW_SPEC ((CORBA::SystemException,
+ CosPropertyService::InvalidPropertyName,
+ CosPropertyService::ConflictingProperty,
+ CosPropertyService::UnsupportedTypeCode,
+ CosPropertyService::UnsupportedProperty,
+ CosPropertyService::UnsupportedMode,
+ CosPropertyService::ReadOnlyProperty));
+ // This operation will modify or add a property to the
+ // PropertySet. If the property already exists, then the property
+ // type is checked before the value is overwritten. The property
+ // mode is also checked to be sure a new value may be written. If
+ // the property does not exist, then the property is added to the
+ // PropertySet. If type or mode is violated, ConflictingProperty
+ // exception is thrown.
+
+ virtual void define_properties_with_modes (const CosPropertyService::PropertyDefs &property_defs
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS)
+ ACE_THROW_SPEC ((CORBA::SystemException,
+ CosPropertyService::MultipleExceptions));
+ // This operation will modify or add each of the properties in the
+ // Properties parameter to the PropertySet.
+
+ virtual CosPropertyService::PropertyModeType get_property_mode (const char *property_name
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS)
+ ACE_THROW_SPEC ((CORBA::SystemException,
+ CosPropertyService::PropertyNotFound,
+ CosPropertyService::InvalidPropertyName));
+ // Get the mode of a property. Raises InvalidpropertyName,
+ // PropertyNotFound exceptions.
+
+ virtual CORBA::Boolean get_property_modes (const CosPropertyService::PropertyNames &property_names,
+ CosPropertyService::PropertyModes_out property_modes
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS)
+ ACE_THROW_SPEC ((CORBA::SystemException));
+ // 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.
+
+ virtual void set_property_mode (const char *property_name,
+ CosPropertyService::PropertyModeType property_mode
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS)
+ ACE_THROW_SPEC ((CORBA::SystemException,
+ CosPropertyService::InvalidPropertyName,
+ CosPropertyService::PropertyNotFound,
+ CosPropertyService::UnsupportedMode));
+ // Set the mode of a property. Watch the following. The change of
+ // mode is allowed introduce more constraints, but it should not
+ // relax the constraints. The following decisions have been made, in
+ // TAO's implementation. The Property Spec has left this to the
+ // implenters. "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. For
+ // all illegal set_mode attempts, UnsupportedMode exception is
+ // raised.
+
+ virtual void set_property_modes (const CosPropertyService::PropertyModes &property_modes
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS)
+ ACE_THROW_SPEC ((CORBA::SystemException,
+ CosPropertyService::MultipleExceptions));
+ // Batch operation for setting the property. Raises
+ // MultipleExceptions.
+};
+
+// ============================================================================
+
+class TAO_Property_Serv_Export TAO_PropertyNamesIterator
+ : public virtual POA_CosPropertyService::PropertyNamesIterator
+{
+ // = TITLE
+ // The PropertyNamesIterator interface allows a client to
+ // iterate through the names using the next_one or next_n operations.
+ //
+ // = DESCRIPTION
+ // A PropertySet maintains a set of name-value pairs. The
+ // get_all_property_names operation returns a sequence of names
+ // (PropertyNames). If there are additional names, the
+ // get_all_property_names operation returns an object supporting
+ // the PropertyNamesIterator interface with the additional names.
+public:
+ // = Initialization and termination methods.
+ TAO_PropertyNamesIterator (TAO_PropertySet &property_set);
+ // Constructor.
+
+ virtual ~TAO_PropertyNamesIterator (void);
+ // Destructor.
+
+ virtual void reset (ACE_ENV_SINGLE_ARG_DECL_WITH_DEFAULTS)
+ ACE_THROW_SPEC ((CORBA::SystemException));
+ // The reset operation resets the position in an iterator to the
+ // first property name, if one exists.
+
+ virtual CORBA::Boolean next_one (CORBA::String_out property_name
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS)
+ ACE_THROW_SPEC ((CORBA::SystemException));
+ // 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.
+
+
+ virtual CORBA::Boolean next_n (CORBA::ULong how_many,
+ CosPropertyService::PropertyNames_out property_names
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS)
+ ACE_THROW_SPEC ((CORBA::SystemException));
+ // The next_n operation returns true if an item exists at the
+ // current position in the iterator and the how_many parameter was
+ // set greater than zero. The output is a PropertyNames sequence
+ // with at most the how_many number of names. A return of false
+ // signifies no more items in the iterator.
+
+ virtual void destroy (ACE_ENV_SINGLE_ARG_DECL_WITH_DEFAULTS)
+ ACE_THROW_SPEC ((CORBA::SystemException));
+ // Destroys the iterator.
+private:
+ typedef ACE_Hash_Map_Manager<CosProperty_Hash_Key, CosProperty_Hash_Value, ACE_Null_Mutex>
+ COSPROPERTY_HASH_MAP;
+ typedef ACE_Hash_Map_Iterator<CosProperty_Hash_Key, CosProperty_Hash_Value, ACE_Null_Mutex>
+ COSPROPERTY_HASH_ITERATOR;
+ typedef ACE_Hash_Map_Entry<CosProperty_Hash_Key, CosProperty_Hash_Value>
+ COSPROPERTY_HASH_ENTRY;
+
+ COSPROPERTY_HASH_ITERATOR iterator_;
+ // The Iterator object.
+};
+
+// ============================================================================
+
+class TAO_Property_Serv_Export TAO_PropertiesIterator
+ : public virtual POA_CosPropertyService::PropertiesIterator
+{
+ // = TITLE
+ // Thid class implements PropertiesIterator interface allows a client to
+ // iterate through the name-value pairs using the next_one or
+ // next_n operations.
+ //
+ // = DESCRIPTION
+ // A PropertySet maintains a set of name-value pairs. The
+ // get_all_properties operation of the PropertySet interface
+ // returns a sequence of Property structures (Properties). If
+ // there are additional properties, the get_all_properties
+ // operation returns an object supporting the PropertiesIterator
+ // interface with the additional properties.
+public:
+ // = Initialization and termination methods.
+ TAO_PropertiesIterator (TAO_PropertySet &property_set);
+ // Constructor.
+
+ virtual ~TAO_PropertiesIterator (void);
+ // Destructor.
+
+ virtual void reset (ACE_ENV_SINGLE_ARG_DECL_WITH_DEFAULTS)
+ ACE_THROW_SPEC ((CORBA::SystemException));
+ // Resets the position in an iterator to the first property, if one exists.
+
+ virtual CORBA::Boolean next_one (CosPropertyService::Property_out aproperty
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS)
+ ACE_THROW_SPEC ((CORBA::SystemException));
+ // The next_one operation returns true if an item exists at the
+ // current position in the iterator with an output parameter of a
+ // property. A return of false signifies no more items in the
+ // iterator.
+
+ virtual CORBA::Boolean next_n (CORBA::ULong how_many,
+ CosPropertyService::Properties_out nproperties
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS)
+ ACE_THROW_SPEC ((CORBA::SystemException));
+ // The next_n operation returns true if an item exists at the
+ // current position in the iterator and the how_many parameter was
+ // set greater than zero. The output is a properties sequence with
+ // at most the how_many number of properties. A return of false
+ // signifies no more items in the iterator.
+
+ virtual void destroy (ACE_ENV_SINGLE_ARG_DECL_WITH_DEFAULTS)
+ ACE_THROW_SPEC ((CORBA::SystemException));
+ // Destroys the iterator.
+
+private:
+ typedef ACE_Hash_Map_Manager<CosProperty_Hash_Key, CosProperty_Hash_Value, ACE_Null_Mutex>
+ COSPROPERTY_HASH_MAP;
+ typedef ACE_Hash_Map_Iterator<CosProperty_Hash_Key, CosProperty_Hash_Value, ACE_Null_Mutex>
+ COSPROPERTY_HASH_ITERATOR;
+ typedef ACE_Hash_Map_Entry<CosProperty_Hash_Key, CosProperty_Hash_Value>
+ COSPROPERTY_HASH_ENTRY;
+
+ COSPROPERTY_HASH_ITERATOR iterator_;
+ // The iterator object.
+};
+
+TAO_END_VERSIONED_NAMESPACE_DECL
+
+#if defined(_MSC_VER)
+#pragma warning(pop)
+#endif /* _MSC_VER */
+
+#include /**/ "ace/post.h"
+
+#endif /* TAO_COSPROPERTYSERVICE_I_H */
diff --git a/TAO/orbsvcs/orbsvcs/Property/property_export.h b/TAO/orbsvcs/orbsvcs/Property/property_export.h
new file mode 100644
index 00000000000..7013fca3a56
--- /dev/null
+++ b/TAO/orbsvcs/orbsvcs/Property/property_export.h
@@ -0,0 +1,40 @@
+
+// -*- C++ -*-
+// $Id$
+// Definition for Win32 Export directives.
+// This file is generated automatically by generate_export_file.pl
+// ------------------------------
+#ifndef TAO_PROPERTY_EXPORT_H
+#define TAO_PROPERTY_EXPORT_H
+
+#include "ace/config-all.h"
+
+#if defined (TAO_AS_STATIC_LIBS)
+# if !defined (TAO_PROPERTY_HAS_DLL)
+# define TAO_PROPERTY_HAS_DLL 0
+# endif /* ! TAO_PROPERTY_HAS_DLL */
+#else
+# if !defined (TAO_PROPERTY_HAS_DLL)
+# define TAO_PROPERTY_HAS_DLL 1
+# endif /* ! TAO_PROPERTY_HAS_DLL */
+#endif
+
+#if defined (TAO_PROPERTY_HAS_DLL) && (TAO_PROPERTY_HAS_DLL == 1)
+# if defined (TAO_PROPERTY_BUILD_DLL)
+# define TAO_Property_Export ACE_Proper_Export_Flag
+# define TAO_PROPERTY_SINGLETON_DECLARATION(T) ACE_EXPORT_SINGLETON_DECLARATION (T)
+# define TAO_PROPERTY_SINGLETON_DECLARE(SINGLETON_TYPE, CLASS, LOCK) ACE_EXPORT_SINGLETON_DECLARE(SINGLETON_TYPE, CLASS, LOCK)
+# else /* TAO_PROPERTY_BUILD_DLL */
+# define TAO_Property_Export ACE_Proper_Import_Flag
+# define TAO_PROPERTY_SINGLETON_DECLARATION(T) ACE_IMPORT_SINGLETON_DECLARATION (T)
+# define TAO_PROPERTY_SINGLETON_DECLARE(SINGLETON_TYPE, CLASS, LOCK) ACE_IMPORT_SINGLETON_DECLARE(SINGLETON_TYPE, CLASS, LOCK)
+# endif /* TAO_PROPERTY_BUILD_DLL */
+#else /* TAO_PROPERTY_HAS_DLL == 1 */
+# define TAO_Property_Export
+# define TAO_PROPERTY_SINGLETON_DECLARATION(T)
+# define TAO_PROPERTY_SINGLETON_DECLARE(SINGLETON_TYPE, CLASS, LOCK)
+#endif /* TAO_PROPERTY_HAS_DLL == 1 */
+
+#endif /* TAO_PROPERTY_EXPORT_H */
+
+// End of auto generated file.
diff --git a/TAO/orbsvcs/orbsvcs/Property/property_serv_export.h b/TAO/orbsvcs/orbsvcs/Property/property_serv_export.h
new file mode 100644
index 00000000000..593f9bc7d37
--- /dev/null
+++ b/TAO/orbsvcs/orbsvcs/Property/property_serv_export.h
@@ -0,0 +1,40 @@
+
+// -*- C++ -*-
+// $Id$
+// Definition for Win32 Export directives.
+// This file is generated automatically by generate_export_file.pl
+// ------------------------------
+#ifndef TAO_PROPERTY_SERV_EXPORT_H
+#define TAO_PROPERTY_SERV_EXPORT_H
+
+#include "ace/config-all.h"
+
+#if defined (TAO_AS_STATIC_LIBS)
+# if !defined (TAO_PROPERTY_SERV_HAS_DLL)
+# define TAO_PROPERTY_SERV_HAS_DLL 0
+# endif /* ! TAO_PROPERTY_SERV_HAS_DLL */
+#else
+# if !defined (TAO_PROPERTY_SERV_HAS_DLL)
+# define TAO_PROPERTY_SERV_HAS_DLL 1
+# endif /* ! TAO_PROPERTY_SERV_HAS_DLL */
+#endif
+
+#if defined (TAO_PROPERTY_SERV_HAS_DLL) && (TAO_PROPERTY_SERV_HAS_DLL == 1)
+# if defined (TAO_PROPERTY_SERV_BUILD_DLL)
+# define TAO_Property_Serv_Export ACE_Proper_Export_Flag
+# define TAO_PROPERTY_SERV_SINGLETON_DECLARATION(T) ACE_EXPORT_SINGLETON_DECLARATION (T)
+# define TAO_PROPERTY_SERV_SINGLETON_DECLARE(SINGLETON_TYPE, CLASS, LOCK) ACE_EXPORT_SINGLETON_DECLARE(SINGLETON_TYPE, CLASS, LOCK)
+# else /* TAO_PROPERTY_SERV_BUILD_DLL */
+# define TAO_Property_Serv_Export ACE_Proper_Import_Flag
+# define TAO_PROPERTY_SERV_SINGLETON_DECLARATION(T) ACE_IMPORT_SINGLETON_DECLARATION (T)
+# define TAO_PROPERTY_SERV_SINGLETON_DECLARE(SINGLETON_TYPE, CLASS, LOCK) ACE_IMPORT_SINGLETON_DECLARE(SINGLETON_TYPE, CLASS, LOCK)
+# endif /* TAO_PROPERTY_SERV_BUILD_DLL */
+#else /* TAO_PROPERTY_SERV_HAS_DLL == 1 */
+# define TAO_Property_Serv_Export
+# define TAO_PROPERTY_SERV_SINGLETON_DECLARATION(T)
+# define TAO_PROPERTY_SERV_SINGLETON_DECLARE(SINGLETON_TYPE, CLASS, LOCK)
+#endif /* TAO_PROPERTY_SERV_HAS_DLL == 1 */
+
+#endif /* TAO_PROPERTY_SERV_EXPORT_H */
+
+// End of auto generated file.
diff --git a/TAO/orbsvcs/orbsvcs/Property/property_skel_export.h b/TAO/orbsvcs/orbsvcs/Property/property_skel_export.h
new file mode 100644
index 00000000000..60a4aa4fe46
--- /dev/null
+++ b/TAO/orbsvcs/orbsvcs/Property/property_skel_export.h
@@ -0,0 +1,40 @@
+
+// -*- C++ -*-
+// $Id$
+// Definition for Win32 Export directives.
+// This file is generated automatically by generate_export_file.pl
+// ------------------------------
+#ifndef TAO_PROPERTY_SKEL_EXPORT_H
+#define TAO_PROPERTY_SKEL_EXPORT_H
+
+#include "ace/config-all.h"
+
+#if defined (TAO_AS_STATIC_LIBS)
+# if !defined (TAO_PROPERTY_SKEL_HAS_DLL)
+# define TAO_PROPERTY_SKEL_HAS_DLL 0
+# endif /* ! TAO_PROPERTY_SKEL_HAS_DLL */
+#else
+# if !defined (TAO_PROPERTY_SKEL_HAS_DLL)
+# define TAO_PROPERTY_SKEL_HAS_DLL 1
+# endif /* ! TAO_PROPERTY_SKEL_HAS_DLL */
+#endif
+
+#if defined (TAO_PROPERTY_SKEL_HAS_DLL) && (TAO_PROPERTY_SKEL_HAS_DLL == 1)
+# if defined (TAO_PROPERTY_SKEL_BUILD_DLL)
+# define TAO_Property_Skel_Export ACE_Proper_Export_Flag
+# define TAO_PROPERTY_SKEL_SINGLETON_DECLARATION(T) ACE_EXPORT_SINGLETON_DECLARATION (T)
+# define TAO_PROPERTY_SKEL_SINGLETON_DECLARE(SINGLETON_TYPE, CLASS, LOCK) ACE_EXPORT_SINGLETON_DECLARE(SINGLETON_TYPE, CLASS, LOCK)
+# else /* TAO_PROPERTY_SKEL_BUILD_DLL */
+# define TAO_Property_Skel_Export ACE_Proper_Import_Flag
+# define TAO_PROPERTY_SKEL_SINGLETON_DECLARATION(T) ACE_IMPORT_SINGLETON_DECLARATION (T)
+# define TAO_PROPERTY_SKEL_SINGLETON_DECLARE(SINGLETON_TYPE, CLASS, LOCK) ACE_IMPORT_SINGLETON_DECLARE(SINGLETON_TYPE, CLASS, LOCK)
+# endif /* TAO_PROPERTY_SKEL_BUILD_DLL */
+#else /* TAO_PROPERTY_SKEL_HAS_DLL == 1 */
+# define TAO_Property_Skel_Export
+# define TAO_PROPERTY_SKEL_SINGLETON_DECLARATION(T)
+# define TAO_PROPERTY_SKEL_SINGLETON_DECLARE(SINGLETON_TYPE, CLASS, LOCK)
+#endif /* TAO_PROPERTY_SKEL_HAS_DLL == 1 */
+
+#endif /* TAO_PROPERTY_SKEL_EXPORT_H */
+
+// End of auto generated file.
diff --git a/TAO/orbsvcs/orbsvcs/RTCORBAEvent.mpc b/TAO/orbsvcs/orbsvcs/RTCORBAEvent.mpc
new file mode 100644
index 00000000000..92ffc461d20
--- /dev/null
+++ b/TAO/orbsvcs/orbsvcs/RTCORBAEvent.mpc
@@ -0,0 +1,27 @@
+// -*- MPC -*-
+// $Id$
+
+project(RTCORBAEvent) : orbsvcslib, core, rtevent_serv, rtportableserver {
+ sharedname = TAO_RTCORBAEvent
+ dynamicflags = TAO_RTCORBAEVENT_BUILD_DLL
+ tagchecks += RTCORBAEvent
+
+ IDL_Files {
+ }
+
+ Source_Files(ORBSVCS_COMPONENTS) {
+ RTCORBAEvent {
+ Event/EC_RTCORBA_Dispatching.cpp
+ Event/EC_RTCORBA_Factory.cpp
+ }
+ }
+
+ Header_Files {
+ }
+
+ Inline_Files {
+ }
+
+ Template_Files {
+ }
+}
diff --git a/TAO/orbsvcs/orbsvcs/RTCosScheduling.idl b/TAO/orbsvcs/orbsvcs/RTCosScheduling.idl
new file mode 100644
index 00000000000..7ffd6662db1
--- /dev/null
+++ b/TAO/orbsvcs/orbsvcs/RTCosScheduling.idl
@@ -0,0 +1,107 @@
+/* -*- idl -*- */
+
+//=============================================================================
+/**
+ * @file RTCosScheduling.idl
+ *
+ * $Id$
+ *
+ * @author Matt Murphy <murphym@cs.uri.edu>
+ */
+//=============================================================================
+
+/**
+ * This directory contains the idl for the RTCORBA 1.0 Scheduling Service.
+ * To generate the stubs and skeletons, run
+ * tao_idl -I $TAO_ROOT/ RTCosScheduling.idl
+ *
+ */
+
+
+#ifndef _RT_COS_SCHEDULING_
+#define _RT_COS_SCHEDULING_
+
+#include <orb.idl>
+#include "tao/PortableServer/PortableServer_include.pidl"
+
+/**
+ * @module RTCosScheduling
+ *
+ * @brief This module contains the interfaces for the RTCORBA 1.0
+ * Scheduling Service.
+ */
+module RTCosScheduling {
+
+ /**
+ * This exception is thrown by schedule activity when an activity name
+ * is passed that is associated with a priority in the config file.
+ * It is thrown by schedule_object when an object name is passed in
+ * that was not assiciated with a resource priority ceiling in the
+ * config file.
+ */
+ exception UnknownName {};
+
+ /**
+ * @interface ClientScheduler
+ *
+ * @brief This interface is used by clients who wish to
+ * schedule activities using the RT CORBA 1.0 Scheduling Service.
+ */
+ local interface ClientScheduler {
+
+ /**
+ * schedule_activity associates an activity name with a known priority
+ * for that activity. It then sets RT Current to that priority.
+ * If the name passed does not have a priority associated then
+ * schedule_activity throws an UnknownName exception.
+ *
+ * @param activity_name is the name of the activity that the client
+ * would like to run. The activity_name is associated with a
+ * priority by schedule_activity and RT Current is set to that
+ * priority.
+ */
+ void schedule_activity(in string activity_name )
+ raises (UnknownName);
+ };
+
+ /**
+ * @interface ServerScheduler
+ *
+ * @brief This interface is used by nodes that hold a local object
+ * reference.
+ */
+ local interface ServerScheduler {
+
+ /**
+ * create_POA is called by servers that would like to use the
+ * RT CORBA 2.0 Scheduling Service.
+ *
+ * @param parent The poa to base the RT POA upon
+ * @param adapter_name the adapter name for the poa
+ * @param a_POAManager the poa_manager
+ * @param policies the list of non real time policies to be set
+ *
+ */
+ PortableServer::POA create_POA (
+ in PortableServer::POA parent,
+ in string adapter_name,
+ in PortableServer::POAManager a_POAManager,
+ in CORBA::PolicyList policies)
+ raises (PortableServer::POA::AdapterAlreadyExists,
+ PortableServer::POA::InvalidPolicy);
+
+ /**
+ * schedule_object is called on servers to associate a
+ * CORBA object reference with a name. This allows the
+ * scheduling service to map a server object name to a resource
+ * ceiling. An UnknownName exception is found if the object name
+ * is not found in the config file.
+ */
+ void schedule_object(in Object obj, in string name)
+ raises (UnknownName);
+
+ };
+};
+
+
+#endif // _RT_COS_SCHEDULING_IDL_
diff --git a/TAO/orbsvcs/orbsvcs/RTCosScheduling.mpc b/TAO/orbsvcs/orbsvcs/RTCosScheduling.mpc
new file mode 100644
index 00000000000..0350cf8953f
--- /dev/null
+++ b/TAO/orbsvcs/orbsvcs/RTCosScheduling.mpc
@@ -0,0 +1,24 @@
+// -*- MPC -*-
+// $Id$
+
+project(RTCosScheduling) : orbsvcslib, core, rtportableserver, interceptors, codecfactory, tao_versioning_idl_defaults {
+ sharedname = TAO_RTCosScheduling
+ idlflags += -Gd -Wb,export_macro=TAO_RTCosScheduling_Export -Wb,export_include=orbsvcs/RTCosScheduling/RTCosScheduling_export.h
+ dynamicflags += TAO_RTCOSSCHEDULING_BUILD_DLL
+ tagchecks += RTCosScheduling
+ requires += dummy_label
+
+ IDL_Files {
+ RTCosScheduling.idl
+ }
+ Source_Files(ORBSVCS_COMPONENTS) {
+ RTCosScheduling {
+ RTCosSchedulingC.cpp
+ RTCosSchedulingS.cpp
+ RTCosScheduling
+ }
+ }
+ Template_Files {
+ }
+}
+
diff --git a/TAO/orbsvcs/orbsvcs/RTCosScheduling/RTCosScheduling_ClientScheduler_i.cpp b/TAO/orbsvcs/orbsvcs/RTCosScheduling/RTCosScheduling_ClientScheduler_i.cpp
new file mode 100644
index 00000000000..d13cfe93576
--- /dev/null
+++ b/TAO/orbsvcs/orbsvcs/RTCosScheduling/RTCosScheduling_ClientScheduler_i.cpp
@@ -0,0 +1,524 @@
+// -*- C++ -*-
+
+//=============================================================================
+/**
+ * @file RTCosScheduling_ClientScheduler_i.cpp
+ *
+ * $Id$
+ *
+ * @author Matt Murphy <murphym@cs.uri.edu>
+ */
+//=============================================================================
+
+#include "orbsvcs/RTCosScheduling/RTCosScheduling_ClientScheduler_i.h"
+
+#include "ace/OS_NS_errno.h"
+#include "ace/OS_NS_stdio.h"
+
+#include "tao/ORB_Core.h"
+#include "tao/LocalObject.h"
+#include "tao/PortableInterceptorC.h"
+#include "tao/CodecFactory/CodecFactory.h"
+
+TAO_BEGIN_VERSIONED_NAMESPACE_DECL
+
+namespace TAO
+{
+
+ /// Constructor
+ RTCosScheduling_ClientScheduler_i::RTCosScheduling_ClientScheduler_i (
+ CORBA::ORB_var orb,
+ char *node_name,
+ char *file)
+ {
+ ACE_TRY_NEW_ENV
+ {
+ /// Read the resources and ceilings from the config file
+ /// and put them into the activity_map_
+ if ( !ACE_OS::strcmp(file,"") || file == NULL)
+ {
+ ACE_DEBUG((LM_DEBUG,
+ "No config supplied to the ServerScheduler, "
+ "Server will not scheudle object execution "
+ "(ServerScheduler interceptor not installed)"));
+ }
+ else if (!tasks(node_name, file, &activity_map_))
+ {
+ ACE_DEBUG((LM_DEBUG,"Invalid Filename given, aborting!\n"));
+ ACE_OS::exit(1);
+ }
+ // The tasks were successfully read in, create the client interceptor
+ else
+ {
+#if (TAO_HAS_INTERCEPTORS == 1)
+ ACE_NEW_THROW_EX (this->client_interceptor_,
+ RTCosScheduling_ClientScheduler_Interceptor(orb),
+ CORBA::NO_MEMORY());
+ ACE_CHECK;
+
+ TAO_ORB_Core *orb_core = orb->orb_core();
+
+ // @@ (OO) Why isn't an ORBInitializer being used to
+ // register the interceptor? In fact, all of the
+ // following code should be done in an
+ // ORBInitializer, except for the interceptor list
+ // iteration. That is already done by the ORB when
+ // using an ORBInitializer to register an
+ // interceptor.
+
+ /// First, get a list of all interceptors currently registered
+ TAO::ClientRequestInterceptor_List::TYPE &interceptors =
+ orb_core->client_request_interceptors();
+
+
+ /// Now check to see if the ServerScheduler Interceptor has already
+ /// been registered
+ u_int i;
+ u_int unregistered = 1;
+ for (i = 0; i < interceptors.size() && unregistered; ++i)
+ {
+ if (ACE_OS::strncmp(interceptors[i]->_interface_repository_id (),
+ this->client_interceptor_->_interface_repository_id(),
+ ACE_OS::strlen(
+ this->client_interceptor_->_interface_repository_id()-2))
+ == 0)
+ {
+ /// The interceptor is already registered,
+ /// don't try to register it again
+ unregistered = 0;
+ }
+ }
+
+ /// if the ServerScheduler Interceptor was not registered by
+ /// another POA then register it now
+ if (unregistered)
+ {
+ orb_core->add_interceptor(this->client_interceptor_
+ ACE_ENV_ARG_PARAMETER);
+ }
+#endif /* TAO_HAS_INTERCEPTORS == 1 */
+
+ /// Now resolve a reference to the Real Time ORB
+ CORBA::Object_var rt_obj =
+ orb->resolve_initial_references("RTORB"
+ ACE_ENV_ARG_PARAMETER);
+ ACE_TRY_CHECK;
+
+ // Get a reference to the real time orb
+ RTCORBA::RTORB_var rt_orb =
+ RTCORBA::RTORB::_narrow (rt_obj.in ()
+ ACE_ENV_ARG_PARAMETER);
+ ACE_TRY_CHECK;
+
+ /// resolve a reference to RT Current
+ rt_obj =
+ orb->resolve_initial_references ("RTCurrent"
+ ACE_ENV_ARG_PARAMETER);
+ ACE_TRY_CHECK;
+
+ this->current_ =
+ RTCORBA::Current::_narrow (rt_obj.in () ACE_ENV_ARG_PARAMETER);
+ ACE_TRY_CHECK
+
+ /// Resolve a reference to the Linear Priority Mapping Manager
+ rt_obj =
+ orb->resolve_initial_references("PriorityMappingManager"
+ ACE_ENV_ARG_PARAMETER);
+ RTCORBA::PriorityMappingManager_var mapping_manager =
+ RTCORBA::PriorityMappingManager::_narrow(rt_obj.in()
+ ACE_ENV_ARG_PARAMETER);
+ ACE_TRY_CHECK;
+
+ /// Create the Linear Priority Mapping Manager
+ ACE_NEW_THROW_EX(this->pm_,
+ TAO_Linear_Priority_Mapping(
+ ACE_SCHED_FIFO),
+ CORBA::NO_MEMORY());
+ // WHERE the parameter is one of SCHED_OTHER, SCHED_FIFO, or SCHED_RR
+
+ mapping_manager->mapping(this->pm_);
+ ACE_TRY_CHECK;
+ }
+ }
+ ACE_CATCHANY
+ {
+ ACE_ERROR((LM_ERROR, "Could not configure the orb"));
+ ACE_OS::exit(1);
+ }
+ ACE_ENDTRY;
+}
+
+
+/// Implementation skeleton destructor
+RTCosScheduling_ClientScheduler_i::~RTCosScheduling_ClientScheduler_i (void)
+{
+ delete this->pm_;
+#if (TAO_HAS_INTERCEPTORS == 1)
+ delete this->client_interceptor_;
+#endif /* TAO_HAS_INTERCEPTORS == 1 */
+}
+
+
+void RTCosScheduling_ClientScheduler_i::schedule_activity (
+ const char * activity_name
+ ACE_ENV_ARG_DECL)
+ ACE_THROW_SPEC ((
+ CORBA::SystemException,
+ RTCosScheduling::UnknownName))
+{
+ /// Look up the priority using the activity name in the activity map
+ COS_SCHEDULER_ACTIVITY_VALUE priority = 0;
+ CORBA::Short result =
+ this->activity_map_.find(activity_name,
+ priority);
+
+ /// If the activity/priority was found, set the current to the
+ /// appropriate priority.
+ if (result != -1)
+ {
+ this->current_->the_priority(priority
+ ACE_ENV_ARG_PARAMETER);
+ ACE_CHECK;
+ }
+ /// If the activity was not found, throw an UnknownName exception.
+ else
+ {
+ ACE_THROW (RTCosScheduling::UnknownName());
+ }
+}
+
+
+int
+RTCosScheduling_ClientScheduler_i::tasks(
+ const char *node_name,
+ const char *file_name,
+ CosSchedulerActivityMap *activity_map)
+{
+ /// get the activity list just for the particular node
+ const unsigned int BUF_MAX = 256;
+
+ FILE *fp = ACE_OS::fopen(file_name, "r");
+ /// Make sure we can open the file
+ if (fp == NULL)
+ {
+ /// Error return of we cannot open the file.
+ ACE_ERROR_RETURN((LM_ERROR,
+ "Could not find the config file %s, aborting\n",
+ file_name),
+ 0);
+ }
+
+
+ char line[BUF_MAX], key[64];
+ ACE_OS::strsncpy(key, "Node ", sizeof(key));
+ ACE_OS::strcat(key, node_name);
+
+ /// Skip to the appropriate node
+#ifndef ACE_LACKS_CLEARERR
+ ACE_OS::clearerr(fp);
+#else
+# warning ACE_OS::clearerr() is unimplemented on this platform.
+# warning This code may not function properly.
+#endif /* !ACE_LACKS_CLEARERR */
+ do
+ {
+ ACE_OS::fgets(line, BUF_MAX, fp);
+ /// Make sure we did not hit the end of file
+ if (ACE_OS::last_error() == EOF)
+ {
+ ACE_ERROR_RETURN((LM_ERROR,
+ "Node %s not found in config file\n",
+ node_name),
+ 0);
+ break;
+ }
+ }
+ while (ACE_OS::strncmp(line, key, ACE_OS::strlen(key)) != 0);
+
+ /// Skip to the appropriate task section of the node
+#ifndef ACE_LACKS_CLEARERR
+ ACE_OS::clearerr(fp);
+#else
+# warning ACE_OS::clearerr() is unimplemented on this platform.
+# warning This code may not function properly.
+#endif /* !ACE_LACKS_CLEARERR */
+ do
+ {
+ ACE_OS::fgets(line, BUF_MAX, fp);
+ /// Make sure we did not hit the end of file
+ if (ACE_OS::last_error() == EOF)
+ {
+ ACE_ERROR_RETURN((LM_ERROR,
+ "Task list not found for node %s\n",
+ node_name),
+ 0);
+ break;
+ }
+ }
+ while (ACE_OS::strncmp(line, "Tasks:", ACE_OS::strlen("Tasks:")) != 0);
+
+ CORBA::Short done = 0;
+ COS_SCHEDULER_ACTIVITY_KEY name;
+ COS_SCHEDULER_ACTIVITY_VALUE priority = 0;
+ u_int delimiter;
+
+ /// read each activity/priority pair from the config file
+ while (!done)
+ {
+ /// get the activity name
+ ACE_OS::fgets(line, BUF_MAX, fp);
+
+ /// Make sure we did not hit the end of file
+ if (ACE_OS::last_error() == EOF)
+ {
+ ACE_ERROR_RETURN((LM_ERROR,
+ "Task list not found for node %s\n",
+ node_name),
+ 0);
+ break;
+ }
+
+ /// check to make sure we have not reached the end of the list.
+ if (ACE_OS::strncmp(line, "END", ACE_OS::strlen("END")) != 0)
+ {
+ name = ACE_CString(line);
+ delimiter = name.find('\t');
+ char *p = ACE_OS::strchr(line, '\t');
+ if (p)
+ priority = ACE_OS::atoi(p);
+ if (priority == 0)
+ priority = RTCORBA::minPriority;
+ if (delimiter < name.length() && delimiter > 0)
+ {
+ activity_map->bind(name.substr(0, delimiter), priority);
+ }
+ else
+ {
+ ACE_ERROR_RETURN((LM_ERROR,
+ "Error in reading activities from %s",
+ file_name),
+ 0);
+ }
+ }
+ else
+ {
+ done = 1;
+ }
+ }
+
+ return 1;
+}
+
+
+#if (TAO_HAS_INTERCEPTORS == 1)
+
+RTCosScheduling_ClientScheduler_Interceptor::RTCosScheduling_ClientScheduler_Interceptor() : name_("RTCosScheduling_Client_Interceptor")
+{
+ ACE_TRY_NEW_ENV
+ {
+ /// resolve a reference to RT Current
+ int argc = 0;
+ CORBA::ORB_var orb = CORBA::ORB_init (argc,
+ 0,
+ 0
+ ACE_ENV_ARG_PARAMETER);
+ CORBA::Object_var obj =
+ orb->resolve_initial_references ("RTCurrent"
+ ACE_ENV_ARG_PARAMETER);
+ ACE_TRY_CHECK;
+ if (CORBA::is_nil(obj.in()))
+ {
+ ACE_OS::exit(1);
+ }
+ else
+ {
+ this->current_ =
+ RTCORBA::Current::_narrow (obj.in () ACE_ENV_ARG_PARAMETER);
+ }
+ ACE_CHECK;
+
+ obj =
+ orb->resolve_initial_references("CodecFactory"
+ ACE_ENV_ARG_PARAMETER);
+
+ IOP::CodecFactory_var codec_factory;
+ if (CORBA::is_nil(obj.in()))
+ {
+ ACE_DEBUG((LM_DEBUG,
+ "Could not initialize client interceptor, aborting!\n"));
+ ACE_OS::exit(1);
+ }
+ else
+ {
+ codec_factory = IOP::CodecFactory::_narrow(obj.in());
+ }
+
+
+ IOP::Encoding encoding;
+ encoding.format = IOP::ENCODING_CDR_ENCAPS;
+ encoding.major_version = 1;
+ encoding.minor_version = 2;
+
+ this->codec_ = codec_factory->create_codec(encoding);
+ }
+ ACE_CATCHANY
+ {
+ ACE_PRINT_EXCEPTION(ACE_ANY_EXCEPTION,
+ "There was an error constructing the "
+ "ClientScheduler Interceptor\n");
+ }
+ ACE_ENDTRY;
+}
+
+
+RTCosScheduling_ClientScheduler_Interceptor::RTCosScheduling_ClientScheduler_Interceptor(
+ const CORBA::ORB_var orb) : name_("RTCosScheduling_Client_Interceptor")
+{
+ ACE_TRY_NEW_ENV
+ {
+ /// resolve a reference to RT Current
+ CORBA::Object_var obj =
+ orb->resolve_initial_references ("RTCurrent"
+ ACE_ENV_ARG_PARAMETER);
+ ACE_CHECK;
+ if (CORBA::is_nil(obj.in()))
+ {
+ ACE_OS::exit(1);
+ }
+ else
+ {
+ this->current_ =
+ RTCORBA::Current::_narrow (obj.in () ACE_ENV_ARG_PARAMETER);
+ }
+ ACE_TRY_CHECK;
+
+ obj =
+ orb->resolve_initial_references("CodecFactory"
+ ACE_ENV_ARG_PARAMETER);
+
+ // set up the codec factory to create the codec necessary to
+ // encode the octet stream for the service context
+ IOP::CodecFactory_var codec_factory;
+ if (CORBA::is_nil(obj.in()))
+ {
+ ACE_DEBUG((LM_DEBUG,
+ "Could not initialize client interceptor, aborting!\n"));
+ ACE_OS::exit(1);
+ }
+ else
+ {
+ codec_factory = IOP::CodecFactory::_narrow(obj.in());
+ }
+
+
+ IOP::Encoding encoding;
+ encoding.format = IOP::ENCODING_CDR_ENCAPS;
+ encoding.major_version = 1;
+ encoding.minor_version = 2;
+
+ // Create the codec
+ this->codec_ = codec_factory->create_codec(encoding);
+ ACE_TRY_CHECK;
+ }
+ ACE_CATCHANY
+ {
+ ACE_PRINT_EXCEPTION(ACE_ANY_EXCEPTION,
+ "Error in creating Client Interceptor\n");
+ }
+ ACE_ENDTRY;
+}
+
+char *
+RTCosScheduling_ClientScheduler_Interceptor::name (
+ ACE_ENV_SINGLE_ARG_DECL_NOT_USED)
+ACE_THROW_SPEC ((CORBA::SystemException))
+{
+return CORBA::string_dup(this->name_);
+}
+
+void
+RTCosScheduling_ClientScheduler_Interceptor::destroy (
+ ACE_ENV_SINGLE_ARG_DECL_NOT_USED)
+ACE_THROW_SPEC ((CORBA::SystemException))
+{
+}
+
+void
+RTCosScheduling_ClientScheduler_Interceptor::send_request (
+ PortableInterceptor::ClientRequestInfo_ptr ri
+ ACE_ENV_ARG_DECL)
+ ACE_THROW_SPEC ((CORBA::SystemException,
+ PortableInterceptor::ForwardRequest))
+{
+ ACE_TRY
+ {
+
+ // Get the Corba priority that the activity is currently running at
+ CORBA::Any the_priority_as_any;
+ the_priority_as_any <<=
+ this->current_->the_priority();
+ ACE_TRY_CHECK;
+
+ // Set up a service context to hold the priority
+ IOP::ServiceContext sc;
+ sc.context_id = IOP::RTCorbaPriority;
+
+ // Convert the priority to an octet stream
+ // (that is how service contexts send data)
+ sc.context_data =
+ reinterpret_cast<CORBA::OctetSeq &> (*this->codec_->encode (the_priority_as_any));
+ ACE_TRY_CHECK;
+
+ // add the service context
+ ri->add_request_service_context(sc, 0);
+ ACE_TRY_CHECK;
+
+ }
+ ACE_CATCHANY
+ {
+ ACE_PRINT_EXCEPTION (ACE_ANY_EXCEPTION,
+ "ERROR - in Client interceptor\n");
+ ACE_TRY_THROW (CORBA::INTERNAL ());
+ }
+ ACE_ENDTRY;
+}
+
+void
+RTCosScheduling_ClientScheduler_Interceptor::send_poll (
+ PortableInterceptor::ClientRequestInfo_ptr
+ ACE_ENV_ARG_DECL_NOT_USED)
+ACE_THROW_SPEC ((CORBA::SystemException))
+{
+}
+
+void
+RTCosScheduling_ClientScheduler_Interceptor::receive_reply (
+ PortableInterceptor::ClientRequestInfo_ptr
+ ACE_ENV_ARG_DECL_NOT_USED)
+ACE_THROW_SPEC ((CORBA::SystemException))
+{
+}
+
+void
+RTCosScheduling_ClientScheduler_Interceptor::receive_exception (
+ PortableInterceptor::ClientRequestInfo_ptr
+ ACE_ENV_ARG_DECL_NOT_USED)
+ACE_THROW_SPEC ((CORBA::SystemException,
+ PortableInterceptor::ForwardRequest))
+{
+}
+
+void
+RTCosScheduling_ClientScheduler_Interceptor::receive_other (
+ PortableInterceptor::ClientRequestInfo_ptr
+ ACE_ENV_ARG_DECL_NOT_USED)
+ACE_THROW_SPEC ((CORBA::SystemException,
+ PortableInterceptor::ForwardRequest))
+{
+}
+
+#endif /* TAO_HAS_INTERCEPTORS == 1 */
+
+}
+
+TAO_END_VERSIONED_NAMESPACE_DECL
diff --git a/TAO/orbsvcs/orbsvcs/RTCosScheduling/RTCosScheduling_ClientScheduler_i.h b/TAO/orbsvcs/orbsvcs/RTCosScheduling/RTCosScheduling_ClientScheduler_i.h
new file mode 100644
index 00000000000..69ac688e910
--- /dev/null
+++ b/TAO/orbsvcs/orbsvcs/RTCosScheduling/RTCosScheduling_ClientScheduler_i.h
@@ -0,0 +1,218 @@
+// -*- C++ -*-
+
+//=============================================================================
+/**
+ * @file RTCosScheduling_ClientScheduler_i.h
+ *
+ * $Id$
+ *
+ * @author Matt Murphy <murphym@cs.uri.edu>
+ */
+//=============================================================================
+
+#ifndef CLIENT_SCHEDULER_I_H
+#define CLIENT_SCHEDULER_I_H
+
+#include /**/ "ace/pre.h"
+
+#include "ace/Map_T.h"
+#if !defined (ACE_LACKS_PRAGMA_ONCE)
+# pragma once
+#endif /* ACE_LACKS_PRAGMA_ONCE */
+
+#if defined (__BORLANDC__)
+#pragma option push -w-rvl -w-rch -w-ccc -w-inl
+#endif /* __BORLANDC__ */
+
+
+#if defined(_MSC_VER)
+#pragma warning(push)
+#pragma warning(disable:4250)
+#endif /* _MSC_VER */
+
+#include "ace/SString.h"
+#include <orbsvcs/RTCosSchedulingC.h>
+#include <orbsvcs/RTCosScheduling/RTCosScheduling_export.h>
+#include "tao/RTCORBA/Priority_Mapping_Manager.h"
+#include "tao/PortableInterceptorC.h"
+#include "tao/CodecFactory/CodecFactory.h"
+#include "tao/RTCORBA/Linear_Priority_Mapping.h"
+
+TAO_BEGIN_VERSIONED_NAMESPACE_DECL
+
+namespace TAO {
+
+#ifndef COS_SCHEDULER_ACTIVITY_MAP
+#define COS_SCHEDULER_ACTIVITY_MAP
+ /**
+ * This typedef is used in RTCosScheduling_ClientScheduler
+ * to map activity names,stored as an ACE_CString,
+ * to CORBA priorities
+ */
+ typedef ACE_CString COS_SCHEDULER_ACTIVITY_KEY;
+ typedef CORBA::Long COS_SCHEDULER_ACTIVITY_VALUE;
+
+ typedef ACE_Map_Manager_Adapter<
+ COS_SCHEDULER_ACTIVITY_KEY,
+ COS_SCHEDULER_ACTIVITY_VALUE,
+ ACE_Noop_Key_Generator<COS_SCHEDULER_ACTIVITY_KEY> >
+ CosSchedulerActivityMap;
+#endif /* ACTIVITY_MAP */
+
+#if TAO_HAS_INTERCEPTORS
+/**
+ * @class ClientRequestInterceptor
+ *
+ * @brief Simple concrete client request interceptor.
+ */
+class RTCosScheduling_ClientScheduler_Interceptor
+ : public PortableInterceptor::ClientRequestInterceptor
+{
+public:
+
+ RTCosScheduling_ClientScheduler_Interceptor();
+ RTCosScheduling_ClientScheduler_Interceptor(const CORBA::ORB_var orb);
+
+ virtual ~RTCosScheduling_ClientScheduler_Interceptor() { }
+ /**
+ * @name Methods Required by the Client Request Interceptor
+ * Interface
+ *
+ * These are methods that must be implemented since they are pure
+ * virtual in the abstract base class. They are the canonical
+ * methods required for all client request interceptors.
+ */
+ //@{
+ /// Return the name of this ClientRequestInterceptor.
+ //
+ virtual char * name (ACE_ENV_SINGLE_ARG_DECL)
+ ACE_THROW_SPEC ((CORBA::SystemException));
+
+ virtual void destroy (ACE_ENV_SINGLE_ARG_DECL)
+ ACE_THROW_SPEC ((CORBA::SystemException));
+
+ virtual void send_request (
+ PortableInterceptor::ClientRequestInfo_ptr ri
+ ACE_ENV_ARG_DECL)
+ ACE_THROW_SPEC ((CORBA::SystemException,
+ PortableInterceptor::ForwardRequest));
+
+ virtual void send_poll (
+ PortableInterceptor::ClientRequestInfo_ptr ri
+ ACE_ENV_ARG_DECL)
+ ACE_THROW_SPEC ((CORBA::SystemException));
+
+ virtual void receive_reply (
+ PortableInterceptor::ClientRequestInfo_ptr ri
+ ACE_ENV_ARG_DECL)
+ ACE_THROW_SPEC ((CORBA::SystemException));
+
+ virtual void receive_exception (
+ PortableInterceptor::ClientRequestInfo_ptr ri
+ ACE_ENV_ARG_DECL)
+ ACE_THROW_SPEC ((CORBA::SystemException,
+ PortableInterceptor::ForwardRequest));
+
+ virtual void receive_other (
+ PortableInterceptor::ClientRequestInfo_ptr ri
+ ACE_ENV_ARG_DECL)
+ ACE_THROW_SPEC ((CORBA::SystemException,
+ PortableInterceptor::ForwardRequest));
+ //@}
+
+private:
+
+ /// The name of the interceptor
+ const char* name_;
+
+ /// reference to set local priority
+ RTCORBA::Current_var current_;
+
+ IOP::Codec_var codec_;
+
+};
+#endif /* TAO_HAS_INTERCEPTORS */
+
+/**
+ * @class RTCosScheduling_ClientScheduler
+ *
+ * @brief Used in conjunction with the class ServerScheduler to
+ * provide RTCORBA 1.0 compliant scheduling
+ *
+ * This class provides the framework necessary for a client node
+ * to retrieve scheduling information from a config file and set
+ * the local OS priority.
+ *
+ */
+class TAO_RTCosScheduling_Export RTCosScheduling_ClientScheduler_i :
+ public virtual RTCosScheduling::ClientScheduler,
+ public virtual CORBA::LocalObject
+{
+
+ public:
+//@{
+ /*
+ * Constructs a new ClientScheduler object for use on a client
+ * that wishes to use the RTCORBA 1.0 Scheduling Service.
+ *
+ * @param orb The orb
+ * @param node The name of the node the client resides on
+ */
+ RTCosScheduling_ClientScheduler_i (CORBA::ORB_var orb,
+ char* node,
+ char* file);
+
+ ///Destructor
+ virtual ~RTCosScheduling_ClientScheduler_i (void);
+
+
+ /**
+ * Called by clients to set the local thread priority to
+ * that specified in the scheduling config file
+ *
+ * @param activity_name the name of the activity that signifies
+ * the desired priority
+ */
+ virtual void schedule_activity (
+ const char *activity_name
+ ACE_ENV_ARG_DECL_NOT_USED)
+ ACE_THROW_SPEC ((
+ CORBA::SystemException,
+ RTCosScheduling::UnknownName));
+//@}
+
+ private:
+ /// The map to match activity names with corba priorities
+ CosSchedulerActivityMap activity_map_;
+
+ /// RT Current, to change the priority of the thread
+ RTCORBA::Current_var current_;
+
+ /// RT Corba Priority Mapping
+ RTCORBA::PriorityMapping *pm_;
+
+#if TAO_HAS_INTERCEPTORS
+ /// The Server Interceptor that handles the PCP control
+ RTCosScheduling_ClientScheduler_Interceptor *client_interceptor_;
+#endif /* TAO_HAS_INTERCEPTORS */
+
+ int tasks(const char *node_name,
+ const char *file_name,
+ CosSchedulerActivityMap *activity_map);
+
+};
+
+}
+
+TAO_END_VERSIONED_NAMESPACE_DECL
+
+#if defined(_MSC_VER)
+#pragma warning(pop)
+#endif /* _MSC_VER */
+
+#if defined (__BORLANDC__)
+#pragma option pop
+#endif /* __BORLANDC__ */
+
+#include /**/ "ace/post.h"
+#endif /* CLIENT_SCHEDULER_I */
diff --git a/TAO/orbsvcs/orbsvcs/RTCosScheduling/RTCosScheduling_PCP_Manager.cpp b/TAO/orbsvcs/orbsvcs/RTCosScheduling/RTCosScheduling_PCP_Manager.cpp
new file mode 100644
index 00000000000..2f10810d9c9
--- /dev/null
+++ b/TAO/orbsvcs/orbsvcs/RTCosScheduling/RTCosScheduling_PCP_Manager.cpp
@@ -0,0 +1,519 @@
+/* -*- C++ -*- */
+
+//=============================================================================
+/**
+ * @file RTCosScheduling_PCP_Manager.cpp
+ *
+ * $Id$
+ *
+ * @author Matt Murphy <murphym@cs.uri.edu>
+ */
+//=============================================================================
+
+#include "orbsvcs/RTCosScheduling/RTCosScheduling_PCP_Manager.h"
+#include "ace/Condition_Thread_Mutex.h"
+#include "ace/Thread.h"
+#include "ace/OS_NS_stdio.h"
+#include "ace/OS_NS_unistd.h"
+
+#if !defined (__ACE_INLINE__)
+#include "orbsvcs/RTCosScheduling/RTCosScheduling_PCP_Manager.i"
+#endif /* __ACE_INLINE__ */
+
+TAO_BEGIN_VERSIONED_NAMESPACE_DECL
+
+namespace TAO {
+
+CosSchedulingLockList::CosSchedulingLockList(CosSchedulingLockNode *lock_array,
+ const int size,
+ ACE_SYNCH_MUTEX *mutex)
+{
+ ACE_TRY_NEW_ENV
+ {
+ /*
+ * The pointers to the beginnings of the lists must be globally visible,
+ * so I have chosen to use the first three locks in the array.
+ * lock_array[0].next() (== free_->next() ) -> start of free list
+ * lock_array[1].next() (== granted_->next()) -> start of granted list
+ * lock_array[2].next() (== pending_->next()) -> start of pending list
+ */
+
+ /// start of the free list
+ lock_array[0].next(&lock_array[3]);
+
+ /// start with an empty granted list
+ lock_array[1].next(0);
+
+ /// start with an empty pending list
+ lock_array[2].next(0);
+
+ /// initialize the free list (link together the elements in the array)
+ for (int i = 3; i < (size - 1); ++i)
+ {
+ lock_array[i].next(&lock_array[i + 1]);
+ ACE_NEW_THROW_EX(lock_array[i].condition_,
+ ACE_SYNCH_CONDITION(*mutex),
+ CORBA::NO_MEMORY());
+ }
+ ACE_TRY_CHECK;
+ lock_array[size - 1].next(0); /// terminate the free list
+
+
+ /// Update the positions
+ this->free_ = &lock_array[0];
+ this->granted_ = &lock_array[1];
+ this->pending_ = &lock_array[2];
+ }
+ ACE_CATCHANY
+ {
+ ACE_DEBUG((LM_ERROR,
+ "Error in %s: Line %d - Could not generate a Locklist in shared memory\n",
+ __FILE__,
+ __LINE__));
+ ACE_PRINT_EXCEPTION(ACE_ANY_EXCEPTION,
+ "Exception: CosSchedulingLockList()");
+ }
+ ACE_ENDTRY;
+}
+
+void
+CosSchedulingLockList::destroy(const int size)
+{
+ for (int i = 3; i < size; ++i)
+ {
+ this->free_[i].condition_->remove();
+ delete &free_[i].condition_;
+ }
+}
+
+int
+CosSchedulingLockList::grant_lock(const CosSchedulingLockNode& L)
+{
+ if (this->free_->next() == 0)
+ {
+ return 0; /// no free nodes left
+ }
+ /// take a node from the free list
+ CosSchedulingLockNode *new_lock = this->free_->next();
+ this->free_->next(this->free_->next()->next());
+ *new_lock = L;
+
+ if ((this->granted_->next() == 0)
+ || (this->granted_->next()->priority_ceiling_ <= L.priority_ceiling_))
+ {
+ /// insert at the head of the list
+ new_lock->next(this->granted_->next());
+ this->granted_->next(new_lock);
+ }
+ else
+ {
+ /// find the proper location to insert
+ /// the new lock (ordered by priority ceiling)
+ CosSchedulingLockNode *current_lock = granted_->next();
+ while ((current_lock->next() != 0)
+ && (current_lock->next()->priority_ceiling_ > L.priority_ceiling_))
+ {
+ current_lock = current_lock->next();
+ }
+ new_lock->next(current_lock->next());
+ current_lock->next(new_lock);
+ }
+
+ return 1;
+}
+
+int
+CosSchedulingLockList::defer_lock(const CosSchedulingLockNode& L,
+ ACE_SYNCH_MUTEX & mutex)
+{
+ if (this->free_->next() == 0)
+ {
+ return 0; /// no free nodes left
+ }
+ CosSchedulingLockNode *new_lock = free_->next();
+ this->free_->next(free_->next()->next());
+ *new_lock = L;
+
+ if ((this->pending_->next() == 0)
+ ||(this->pending_->next()->priority_ <= L.priority_))
+ {
+ /// insert at the head of the list
+ new_lock->next(this->pending_->next());
+ this->pending_->next(new_lock);
+ }
+ else
+ {
+ /// find the proper location to insert the new lock
+ CosSchedulingLockNode *current_lock = pending_->next();
+ while ((current_lock->next() != 0)
+ && (current_lock->next()->priority_ceiling_ > L.priority_ceiling_))
+ {
+ current_lock = current_lock->next();
+ }
+ new_lock->next(current_lock->next());
+ current_lock->next(new_lock);
+ }
+
+
+ if (new_lock->condition_)
+ {
+ new_lock->condition_->wait(mutex);
+ return 1;
+ }
+ else
+ {
+ return 0;
+ }
+}
+
+
+int
+CosSchedulingLockList::release_lock(CosSchedulingLockNode& L)
+{
+ if (this->granted_->next() == 0)
+ {
+ return 0; /// empty list of granted locks
+ }
+
+ if (this->granted_->next()->threadID_ == L.threadID_)
+ {
+ /// remove the lock at the head of the list and put it on the free list
+
+ /// Set the Lock to the next one in the granted list
+ L = *(this->granted_->next());
+
+ /// (sets next offset from previous statement)
+ L.next(this->granted_->next()->next());
+
+ /// set the next granted's next one to be the next free one
+ this->granted_->next()->next(this->free_->next());
+
+ /// Set the next free one to be the next granted one
+ this->free_->next(this->granted_->next());
+
+ /// Set the next granted on to be the Lock's next one
+ this->granted_->next(L.next());
+
+ /// Set the Locks next on to NULL
+ L.next(0);
+
+ return 1;
+ }
+
+ /// find the lock to remove
+ CosSchedulingLockNode *current_lock = granted_->next();
+ while ((current_lock->next() != 0)
+ && (current_lock->next()->threadID_ != L.threadID_))
+ {
+ current_lock = current_lock->next();
+ }
+ if (current_lock->next() != 0)
+ {
+ /// removes lock and prepends to the free list, as above
+ L = *(current_lock->next());
+ L.next(current_lock->next()->next());
+ current_lock->next()->next(this->free_->next());
+ this->free_->next(current_lock->next());
+ current_lock->next(L.next());
+ L.next(0);
+ return 1;
+ }
+
+ return 0;
+}
+
+int
+CosSchedulingLockList::remove_deferred_lock(CosSchedulingLockNode& L)
+{
+ if (this->pending_->next() == 0)
+ {
+ return 0; /// empty list of pending locks
+ }
+
+ /// take pending lock off the head of the list
+ /// (highest priority request) and add to the free list
+ L = *(this->pending_->next());
+ CosSchedulingLockNode * fn = this->pending_->next();
+ this->pending_->next(this->pending_->next()->next());
+ fn->next(this->free_->next());
+ this->free_->next(fn);
+
+ return 1;
+}
+
+PCP_Manager::PCP_Manager(CosSchedulingLockList *locks,
+ ACE_SYNCH_MUTEX *mutex,
+ const RTCORBA::Current_var current)
+: locks_(locks),
+ mutex_(mutex),
+ current_(current)
+{
+ /// Get the thread ID
+ this->threadID_ = (ACE_OS::getpid() << 16) + int(ACE_Thread::self());
+}
+
+void
+PCP_Manager::lock(const int priority_ceiling, const int priority)
+{
+ ACE_TRY_NEW_ENV
+ {
+
+ /// we do not want the thread to be pre-empted inside
+ /// this critical section, so we
+ /// will set its priority to the highest possible
+ // This is not completely necessary since the server should be running
+ // at RTCORBA::maxPriority
+ this->current_->the_priority(RTCORBA::maxPriority);
+ this->mutex_->acquire();
+ ACE_TRY_CHECK;
+
+ /// create a structure to store my own lock request
+ CosSchedulingLockNode MyLock;
+ MyLock.threadID_ = this->threadID_;
+ MyLock.priority_ceiling_ = MyLock.elevated_priority_ = priority_ceiling;
+ MyLock.priority_ = priority;
+ /// Start by assuming we don't have the lock then go look for it
+ int HaveLock = 0;
+ while (!HaveLock)
+ {
+ /// retrieve the highest priority ceiling from the list
+ CosSchedulingLockNode *highest_lock = this->locks_->highest_ceiling();
+ int prio_ceiling;
+ /// check to see if are at the highest priority,
+ /// if so set the priority ceiling
+ if (highest_lock)
+ {
+ prio_ceiling = highest_lock->priority_ceiling_;
+ }
+ else
+ {
+ prio_ceiling = -1;
+ }
+
+ /// if I hold the highest ceiling or my priority is higher than the
+ /// highest ceiling, just get the lock
+ if ((highest_lock == 0) ||
+ (highest_lock->threadID_ == this->threadID_) ||
+ (highest_lock->priority_ceiling_ < priority))
+ {
+ /// Try and grant the lock, if it is not granted,
+ /// then there are unfortunately no more lock nodes
+ if (!this->locks_->grant_lock (MyLock))
+ {
+ ACE_ERROR ((LM_ERROR,
+ "Fatal error--out of lock nodes!!!"));
+ }
+ /// Lock obtained from grant_lock, don't loop again
+ HaveLock = 1;
+ }
+ else
+ {
+ /// There is another lock out there active, put this one
+ /// in the list of pending locks
+ if (this->locks_->defer_lock(MyLock, *this->mutex_))
+ {
+ /// done waiting for it, remove it from the pending
+ /// lock list, will try again to grant on next loop
+ /// iteration
+ this->locks_->remove_deferred_lock (MyLock);
+ }
+ else
+ {
+ ACE_ERROR((LM_ERROR,
+ "Error in deferring lock\n"));
+ }
+ ACE_TRY_CHECK;
+ }
+ }
+
+ /// remove mutex on the lock list
+ this->mutex_->release();
+ ACE_TRY_CHECK;
+
+ /// at this point we have the right to set the OS priority
+ /// Do so at the priority ceiline.
+ this->current_->the_priority(priority_ceiling);
+
+ ACE_TRY_CHECK;
+ }
+ ACE_CATCHANY
+ {
+ ACE_DEBUG((LM_ERROR,
+ "Error in %s: Line %d - Could lock resource\n"
+ __FILE__,
+ __LINE__));
+ ACE_PRINT_EXCEPTION(ACE_ANY_EXCEPTION,
+ "Exception: PCP_Manager::lock");
+ }
+ ACE_ENDTRY;
+}
+
+void PCP_Manager::release_lock()
+{
+ ACE_TRY_NEW_ENV
+ {
+ /// To prevent pre-emption in the critical section,
+ /// which could lead to unbounded blocking
+ this->current_->the_priority(RTCORBA::maxPriority);
+
+ /// set up the mutex
+ this->mutex_->acquire();
+ ACE_TRY_CHECK;
+
+ /// remove the lock node from the list of locks
+ CosSchedulingLockNode L;
+ L.threadID_ = this->threadID_;
+ this->locks_->release_lock(L);
+
+ /// Done with the list, release the mutex
+ this->mutex_->release();
+ ACE_TRY_CHECK;
+
+ /// Let the highest priority lock signal the condition variable
+ CosSchedulingLockNode *waiter = this->locks_->highest_priority();
+ if (waiter)
+ {
+ waiter->condition_->signal();
+ }
+ ACE_TRY_CHECK;
+
+ /// We do not need to restore priority because we have already set this
+ // thread to wait at RTCORBA::maxPriority at the start of this method
+ }
+ ACE_CATCHANY
+ {
+ ACE_DEBUG((LM_ERROR,
+ "Error in %s: Line %d - Could not release lock\n"
+ __FILE__,
+ __LINE__));
+ ACE_PRINT_EXCEPTION(ACE_ANY_EXCEPTION,
+ "Exception: PCP_Manager::release_lock");
+ }
+ ACE_ENDTRY;
+}
+
+
+PCP_Manager_Factory::PCP_Manager_Factory(const char *shared_file)
+{
+ ACE_TRY_NEW_ENV
+ {
+#if !defined (ACE_LACKS_MMAP)
+ char temp_file[MAXPATHLEN + 1];
+
+ /// Get the temporary directory
+ if (ACE::get_temp_dir (temp_file,
+ MAXPATHLEN - ACE_OS_String::strlen(shared_file))
+ == -1)
+ {
+ ACE_DEBUG((LM_ERROR,
+ "Error in %s: Line %d - Shared File Name too long\n"
+ __FILE__,
+ __LINE__));
+ ACE_OS::exit(1);
+ }
+ ACE_TRY_CHECK;
+
+ /// Add the filename to the end
+ ACE_OS_String::strcat (temp_file, shared_file);
+
+ /// Store in the global variable.
+ this->shm_key_ = temp_file;
+
+#ifndef ACE_LACKS_MKSTEMP
+ if (ACE_OS::mkstemp (this->shm_key_) == 0
+#else
+ char *new_key = ACE_OS::mktemp (this->shm_key_);
+ if (ACE_OS::fopen(new_key, "w") != NULL
+#endif /* ACE_LACKS_MKSTEMP */
+ || (ACE_OS::unlink (this->shm_key_) == -1
+#ifndef ACE_HAS_WINCE
+ && errno == EPERM
+#endif /* ACE_HAS_WINCE */
+ ))
+ ACE_ERROR ((LM_ERROR,
+ "(%P|%t) %p\n",
+ this->shm_key_));
+ ACE_TRY_CHECK;
+
+#else /* !ACE_LACKS_MMAP */
+ ACE_DEBUG((LM_ERROR,
+ "Error in %s: Line %d - ACE_LACKS_MMAP - cannot create shared memory\n"
+ __FILE__,
+ __LINE__));
+ ACE_OS::exit();
+#endif /* !ACE_LACKS_MMAP */
+
+ /// determine space requirements for the lock list
+ u_int CosSchedulingLockList_space =
+ LOCK_ARRAY_SIZE * sizeof (CosSchedulingLockNode);
+
+ /// allocate space in shared memory for size of the lock list
+ int result =
+ this->mem_.open(this->shm_key_, CosSchedulingLockList_space);
+
+ /// Make sure shared memory CosSchedulingLockList is ok, scheduling
+ /// service cannot run without it.
+ if (result == -1)
+ {
+ ACE_ERROR((LM_ERROR,
+ "Error in %s: Line %d - Error in creating the shared "
+ " memory segment to hold Lock information, "
+ "aborting ServerScheduler.\n"
+ __FILE__,
+ __LINE__));
+ ACE_OS::exit(1);
+ }
+
+ ACE_CHECK;
+
+ /// Make the shared memory a place for a lock list
+ this->lock_array_ = static_cast<CosSchedulingLockNode *> (this->mem_.malloc(CosSchedulingLockList_space));
+ /// get the pointer to the list of locks and
+ /// construct a lock list manager object
+ if (this->lock_array_ == 0)
+ {
+ ACE_ERROR((LM_ERROR,
+ "Error in %s: Line %d - Error in creating "
+ "array to hold lock information "
+ "ServerScheduler not created\n "
+ __FILE__,
+ __LINE__));
+ ACE_OS::exit(1);
+ }
+ else
+ {
+ /// construct the new lock list in shared memory
+ ACE_NEW_THROW_EX(this->locks_,
+ CosSchedulingLockList(this->lock_array_,
+ LOCK_ARRAY_SIZE,
+ &this->mutex_),
+ CORBA::NO_MEMORY()
+ );
+ ACE_TRY_CHECK;
+ }
+ }
+ ACE_CATCHANY
+ {
+ ACE_ERROR((LM_ERROR,
+ "Error in %s: Line %d - Error in creating "
+ "PCP_Manager_Factory to create new PCP_Managers\n"
+ __FILE__,
+ __LINE__));
+ ACE_PRINT_EXCEPTION(ACE_ANY_EXCEPTION,
+ "PCP_Manager_Factory::PCP_Manager_Factory\n");
+ }
+ ACE_ENDTRY;
+}
+
+PCP_Manager_Factory::~PCP_Manager_Factory()
+{
+ /// throw out all the old Locks
+ this->locks_->destroy(LOCK_ARRAY_SIZE);
+ /// and delete the shared memory
+ this->mem_.remove();
+ delete this->locks_;
+}
+
+}
+
+TAO_END_VERSIONED_NAMESPACE_DECL
diff --git a/TAO/orbsvcs/orbsvcs/RTCosScheduling/RTCosScheduling_PCP_Manager.h b/TAO/orbsvcs/orbsvcs/RTCosScheduling/RTCosScheduling_PCP_Manager.h
new file mode 100644
index 00000000000..b7d3cda9069
--- /dev/null
+++ b/TAO/orbsvcs/orbsvcs/RTCosScheduling/RTCosScheduling_PCP_Manager.h
@@ -0,0 +1,316 @@
+// -*- C++ -*-
+
+//=============================================================================
+/**
+ * @file RTCosScheduling_PCP_Manager.h
+ *
+ * $Id$
+ *
+ * @author Matt Murphy <murphym@cs.uri.edu>
+ * @author based upon work by Greg Cooper
+ * @author University of Rhode Island
+ */
+//=============================================================================
+
+#ifndef PCP_MANAGER_H
+#define PCP_MANAGER_H
+#include /**/ "ace/pre.h"
+
+#include "ace/config-all.h"
+#if !defined (ACE_LACKS_PRAGMA_ONCE)
+#pragma once
+#endif /* ACE_LACKS_PRAGMA_ONCE */
+
+#include "ace/Shared_Memory_MM.h"
+#include "ace/Map_T.h"
+#include "ace/SString.h"
+#include "tao/RTCORBA/RTCORBA.h"
+
+
+#if defined(_MSC_VER)
+#pragma warning(push)
+#pragma warning(disable:4250)
+#endif /* _MSC_VER */
+
+#if defined (__BORLANDC__)
+#pragma option push -w-rvl -w-rch -w-ccc -w-inl
+#endif /* __BORLANDC__ */
+
+
+TAO_BEGIN_VERSIONED_NAMESPACE_DECL
+
+namespace TAO {
+
+
+#if !defined (LOCK_ARRAY_SIZE)
+ #define LOCK_ARRAY_SIZE 1024
+#endif /* LOCK_ARRAY_SIZE */
+
+#ifndef COS_SCHEDULING_CONTAINERS
+#define COS_SCHEDULING_CONTAINERS
+ /*
+ * ResourceCeilingMap
+ *
+ * This typedef is used in the RTCORBA 1.0 Scheduling Service to
+ * map names of resources on a server with priority ceilings.
+ */
+ typedef ACE_CString COS_SCHEDULING_RESOURCE_KEY;
+ typedef int COS_SCHEDULING_RESOURCE_VALUE;
+
+ typedef ACE_Map_Manager_Adapter<
+ COS_SCHEDULING_RESOURCE_KEY,
+ COS_SCHEDULING_RESOURCE_VALUE,
+ ACE_Noop_Key_Generator<COS_SCHEDULING_RESOURCE_KEY> > CosSchedulingResourceMap;
+#endif /* COS_SCHEDULING_CONTAINERS */
+
+
+/**
+* @class CosSchedulingLockList
+*
+* @brief This program provides an abstract mechanism
+* for the PCP_Manager class to store its lists of locks in
+* shared memory. It provides an efficient allocation and
+* retrieval system and uses a pseudo-linked-list based on
+* offsets (rather than absolute pointers) which allows it
+* to work regardless of where it is mapped in a process's
+* address space. This means it can be used in a shared
+* memory segment.
+*
+*/
+struct CosSchedulingLockNode
+{
+ /// unique ID of the thread owning the lock
+ int threadID_;
+
+ /// the lock's priority ceiling
+ int priority_ceiling_;
+
+ /// the thread's original global priority
+ int priority_;
+
+ /// the thread's elevated priority
+ int elevated_priority_;
+
+ /// offset to the next lock in the list
+ int next_offset_;
+
+ /// Condition Variable to wait on Mutex
+ ACE_SYNCH_CONDITION *condition_;
+
+ /**
+ * Translates the offset to the next lock
+ * to a pointer and returns it
+ */
+ struct CosSchedulingLockNode *next();
+
+ /**
+ * Translates the pointer into an offset and
+ * stores it in the structure
+ */
+ void next(const struct CosSchedulingLockNode *Next);
+
+ /**
+ * Copies the relevant fields while preserving those which should not be
+ *modified
+ */
+ const CosSchedulingLockNode& operator=(const CosSchedulingLockNode& L);
+
+};
+
+class CosSchedulingLockList
+{
+ public:
+ /**
+ * Creates a CosSchedulingLockList structure using the storage in lock_array:
+ * if Init is 1, the array is initialized to indicate that
+ * none of the nodes are in use
+ *
+ * @param lock_array The shared memory space for the CosSchedulingLockList
+ * @param size The size of the lock list
+ * @param mutex the mutex that guards the CosSchedulingLockList
+ */
+ CosSchedulingLockList(CosSchedulingLockNode *lock_array,
+ const int size,
+ ACE_SYNCH_MUTEX *mutex);
+
+ /**
+ * Calls ACE_Thread::remove() on all conditions in the list;
+ * should only be called when SchedInit terminates
+ * (may not be necessary then)
+ *
+ * @param size the number of locks to destroy, starting at head
+ */
+ void destroy(const int size);
+
+ /**
+ * Adds L to the granted list, if space is available
+ * (returns success); the list of granted locks is kept sorted
+ * by priority-ceiling so that the highest ceiling can
+ * be found quickly at the head
+ *
+ * @param L the CosSchedulingLockNode to add to the granted list.
+ */
+ int grant_lock(const CosSchedulingLockNode& L);
+
+ /**
+ * Adds L to the pending list, if space is available
+ * (returns success); the list of pending locks is kept
+ * sorted by priority so that the highest priority thread
+ * awaiting a lock will be at the head; returns pointer to
+ * condition variable upon success, NULL otherwise
+ *
+ * @param L The lock to add to the pending list.
+ * @param mutex The mutex that guards the locks.
+ */
+ int defer_lock(const CosSchedulingLockNode& L,
+ ACE_SYNCH_MUTEX &mutex);
+
+ /**
+ * Removes a node from the granted lock list whose threadID_
+ * matches that of L, replacing L with the removed lock
+ *
+ * @param L released lock
+ */
+ int release_lock(CosSchedulingLockNode& L);
+
+ /**
+ * Removes the first node from the pending lock list,
+ * replacing L with the removed lock
+ *
+ * @param L Reference to the lock that is removed from pending
+ */
+ int remove_deferred_lock(CosSchedulingLockNode& L);
+
+ /**
+ * Returns a pointer to the node containing the highest ceiling (the
+ * first node in the list of held locks)
+ */
+ CosSchedulingLockNode *highest_ceiling();
+
+
+ /**
+ * Returns a pointer to the node with the highest priority
+ * (from the first node in the list of pending locks
+ */
+ CosSchedulingLockNode *highest_priority();
+
+ private:
+
+ /// A list of free locks
+ CosSchedulingLockNode *free_;
+
+ /// A list of Free locks
+ CosSchedulingLockNode *granted_;
+
+ /// A list of pending locks awaiting to be locked
+ CosSchedulingLockNode *pending_;
+
+};
+
+
+/**
+* @class PCP_Manager
+*
+* @brief PCP_Manager handles Priority Ceiling Control Protocol for the
+* RTCORBA 1.0 ServerScheduler
+* Each thread needs a PCP_Manager object: these are created by the
+* PCP_Manager_Factory object, of which only one is needed per process
+*
+*/
+class PCP_Manager
+{
+public:
+
+ /**
+ * Initializes a PCP_Manager object with the given lists, mutex,
+ * condition variable, and priority mapper.
+ *
+ * @param locks A list of the locks to use in the PCP_Manager.
+ * @param mutex The mutex to guard the locks.
+ */
+ PCP_Manager(CosSchedulingLockList *locks,
+ ACE_SYNCH_MUTEX *mutex,
+ const RTCORBA::Current_var current);
+
+ /**
+ * Acquires a lock on a shared resource using the
+ * priority ceiling protocol
+ *
+ * @param PriorityCeiling The priority ceiling of the lock
+ * @param priority The priority to lock at.
+ */
+ void lock(const int PriorityCeiling, const int Priority);
+
+ /**
+ * Releases a lock previously granted with lock()
+ */
+ void release_lock();
+
+ /**
+ * Returns the mThreadID data member
+ */
+ int threadID();
+
+ private:
+ int threadID_; /// ID of thread owning this object
+ CosSchedulingLockList *locks_; /// combined list of locks
+ ACE_SYNCH_MUTEX *mutex_; /// Mutex to guard lock list
+ RTCORBA::Current_var current_; /// reference to set local priority
+
+};
+
+/**
+* @class PCP_Manager_Factory
+*
+* @brief Creates PCP_Managers. Each process needs only one of
+* these objects: it can create a PCP_Manager object for each
+* thread as need arises.
+*/
+class PCP_Manager_Factory
+{
+public:
+
+ /**
+ * Initializes a PCP_Manager_Factory: each process should only
+ * do this once. It attaches a shared memory segment and retrieves
+ * pointers to the granted and pending lock lists as well as
+ * the mutex and condition variable.
+ */
+ PCP_Manager_Factory(const char *shared_file);
+
+ ~PCP_Manager_Factory();
+
+ /**
+ * Creates a new PCP manager object using the lists and
+ * synchronization objects found in shared memory.
+ */
+ PCP_Manager New_PCP_Manager(RTCORBA::Current_var current);
+
+ private:
+ CosSchedulingLockList *locks_; /// lists of granted and pending locks
+ ACE_SYNCH_MUTEX mutex_; /// The mutex for locking the lock list
+ ACE_Shared_Memory_MM mem_; /// shared memory space
+ char *shm_key_; /// Key for shared memory
+ CosSchedulingLockNode *lock_array_; /// The lock list
+
+};
+
+}
+
+TAO_END_VERSIONED_NAMESPACE_DECL
+
+#if defined (__ACE_INLINE__)
+#include "orbsvcs/RTCosScheduling/RTCosScheduling_PCP_Manager.i"
+#endif /* __ACE_INLINE__ */
+
+
+#if defined(_MSC_VER)
+#pragma warning(pop)
+#endif /* _MSC_VER */
+
+#if defined (__BORLANDC__)
+#pragma option pop
+#endif /* __BORLANDC__ */
+
+#include /**/ "ace/post.h"
+#endif /* PCP_MANAGER_H */
diff --git a/TAO/orbsvcs/orbsvcs/RTCosScheduling/RTCosScheduling_PCP_Manager.i b/TAO/orbsvcs/orbsvcs/RTCosScheduling/RTCosScheduling_PCP_Manager.i
new file mode 100644
index 00000000000..15e9ced25a9
--- /dev/null
+++ b/TAO/orbsvcs/orbsvcs/RTCosScheduling/RTCosScheduling_PCP_Manager.i
@@ -0,0 +1,98 @@
+// -*- C++ -*-
+
+//=============================================================================
+/**
+ * @file RTCosScheduling_PCP_Manager.i
+ *
+ * $Id$
+ *
+ * @author Matt Murphy <murphym@cs.uri.edu>
+ * @author based upon work by Greg Cooper
+ * @author University of Rhode Island
+ */
+//=============================================================================
+
+TAO_BEGIN_VERSIONED_NAMESPACE_DECL
+
+/**
+ * Returns a pointer to the node containing the highest ceiling (the
+ * first node in the list of held locks)
+ */
+ACE_INLINE TAO::CosSchedulingLockNode *
+TAO::CosSchedulingLockList::highest_ceiling()
+{
+ return this->granted_->next();
+}
+
+
+/**
+ * Returns a pointer to the node with the highest priority
+ * (from the first node in the list of pending locks
+ */
+ACE_INLINE TAO::CosSchedulingLockNode *
+TAO::CosSchedulingLockList::highest_priority()
+{
+ return this->pending_->next();
+}
+
+
+/**
+ * Returns the mThreadID data member
+ */
+ACE_INLINE int
+TAO::PCP_Manager::threadID()
+{
+ return this->threadID_;
+}
+
+
+/**
+ * Creates a new PCP manager object using the lists and
+ * synchronization objects found in shared memory.
+ */
+ACE_INLINE TAO::PCP_Manager
+TAO::PCP_Manager_Factory::New_PCP_Manager(RTCORBA::Current_var current)
+{
+ return TAO::PCP_Manager(this->locks_, &this->mutex_, current);
+}
+
+ACE_INLINE struct TAO::CosSchedulingLockNode *
+TAO::CosSchedulingLockNode::next()
+{
+ /// INT_MAX is a special value indicating the end of a list
+ if (this->next_offset_ == INT_MAX)
+ {
+ return 0;
+ }
+ else
+ {
+ return this + this->next_offset_;
+ }
+}
+
+ACE_INLINE void
+TAO::CosSchedulingLockNode::next(const struct CosSchedulingLockNode *next_lock)
+{
+ /// INT_MAX is a special value indicating the end of a list
+ if (next_lock == 0)
+ {
+ this->next_offset_ = INT_MAX;
+ }
+ else
+ {
+ this->next_offset_ = next_lock - this;
+ }
+}
+
+ACE_INLINE const TAO::CosSchedulingLockNode&
+TAO::CosSchedulingLockNode::operator=(const CosSchedulingLockNode& L)
+{
+ this->threadID_ = L.threadID_;
+ this->priority_ceiling_ = L.priority_ceiling_;
+ this->priority_ = L.priority_;
+ this->elevated_priority_ = L.elevated_priority_;
+
+ return *this;
+}
+
+TAO_END_VERSIONED_NAMESPACE_DECL
diff --git a/TAO/orbsvcs/orbsvcs/RTCosScheduling/RTCosScheduling_ServerScheduler_i.cpp b/TAO/orbsvcs/orbsvcs/RTCosScheduling/RTCosScheduling_ServerScheduler_i.cpp
new file mode 100644
index 00000000000..d0fb3c1c07b
--- /dev/null
+++ b/TAO/orbsvcs/orbsvcs/RTCosScheduling/RTCosScheduling_ServerScheduler_i.cpp
@@ -0,0 +1,766 @@
+//=============================================================================
+/**
+ * @file RTCosScheduling_ServerScheduler_i.cpp
+ *
+ * $Id$
+ *
+ * @author Matt Murphy <murphym@cs.uri.edu>
+ */
+//=============================================================================
+
+#include "orbsvcs/RTCosScheduling/RTCosScheduling_ServerScheduler_i.h"
+#include "ace/OS_NS_errno.h"
+#include "ace/OS_NS_unistd.h"
+
+#if !defined (__ACE_INLINE__)
+#include "orbsvcs/RTCosScheduling/RTCosScheduling_ServerScheduler_i.i"
+#endif /* __ACE_INLINE__ */
+
+#include "tao/ORB_Core.h"
+#include "tao/PortableServer/Root_POA.h"
+#include "tao/RTCORBA/Linear_Priority_Mapping.h"
+#include "tao/RTCORBA/Priority_Mapping_Manager.h"
+#include "tao/RTPortableServer/RTPortableServer.h"
+#include "tao/CodecFactory/CodecFactory.h"
+
+TAO_BEGIN_VERSIONED_NAMESPACE_DECL
+
+namespace TAO {
+
+RTCosScheduling_ServerScheduler_i::
+ RTCosScheduling_ServerScheduler_i (char *node,
+ char *file,
+ char *shared_file,
+ int numthreads
+ )
+: num_threads_(numthreads),
+ shared_file_(shared_file)
+{
+ /// Read the Resources and ceilings from the config file
+ /// and put them into the resource_map_
+ if ( !ACE_OS::strcmp(file,"") || file == NULL || !TAO_HAS_INTERCEPTORS)
+ {
+ ACE_DEBUG((LM_DEBUG,
+ "Server will not schedule object execution "
+ "(ServerScheduler interceptor not installed)"));
+ }
+ else if (!resources(node, file, &this->resource_map_))
+ {
+ ACE_OS::exit(1);
+ }
+}
+
+
+// Implementation skeleton destructor
+RTCosScheduling_ServerScheduler_i::~RTCosScheduling_ServerScheduler_i (void)
+{
+ delete this->pm_;
+}
+
+
+int
+RTCosScheduling_ServerScheduler_i::configure_ORB(TAO_ORB_Core *orb_core)
+{
+ ACE_TRY_NEW_ENV
+ {
+
+ // Get an object reference to orb from the orb core
+ CORBA::ORB_ptr orb = orb_core->orb();
+
+#if TAO_HAS_INTERCEPTORS
+ /// Construct the interceptor that the Scheduling service uses
+ RTCosScheduling_ServerScheduler_Interceptor *server_interceptor = 0;;
+ ACE_NEW_THROW_EX(server_interceptor,
+ RTCosScheduling_ServerScheduler_Interceptor(orb,
+ this->shared_file_,
+ &this->object_name_map_,
+ &this->resource_map_),
+ CORBA::NO_MEMORY());
+ ACE_TRY_CHECK;
+
+ /// First, get a list of all interceptors currently registered
+ TAO::ServerRequestInterceptor_List::TYPE &interceptors =
+ orb_core->server_request_interceptors();
+
+
+ /// Now check to see if the ServerScheduler Interceptor has already
+ /// been registered
+ u_int i;
+ u_int unregistered = 1;
+ for (i = 0; i < interceptors.size() && unregistered; ++i)
+ {
+ if (ACE_OS::strncmp(
+ interceptors[i]->_interface_repository_id (),
+ server_interceptor->_interface_repository_id(),
+ ACE_OS::strlen(
+ server_interceptor->_interface_repository_id())-2)
+ == 0)
+ {
+ /// The interceptor is already registered,
+ /// don't try to register it again
+ unregistered = 0;
+ }
+ }
+
+ if (unregistered)
+ {
+ orb_core->add_interceptor(server_interceptor
+ ACE_ENV_ARG_PARAMETER);
+ }
+#endif /* TAO_HAS_INTERCEPTORS */
+
+ /// Resolve a reference to the Linear Priority Mapping Manager
+ CORBA::Object_var rt_obj =
+ orb->resolve_initial_references("PriorityMappingManager"
+ ACE_ENV_ARG_PARAMETER);
+ if (CORBA::is_nil(rt_obj.in()))
+ {
+ ACE_DEBUG((LM_DEBUG,
+ "Priority Mapping Manager not available, "
+ "RT not used on server!\n"));
+ return 0;
+ }
+ RTCORBA::PriorityMappingManager_var mapping_manager =
+ RTCORBA::PriorityMappingManager::_narrow(rt_obj.in()
+ ACE_ENV_ARG_PARAMETER);
+ ACE_TRY_CHECK;
+
+ /// Create the Linear Priority Mapping Manager
+ ACE_NEW_THROW_EX(this->pm_,
+ TAO_Linear_Priority_Mapping(
+ ACE_SCHED_FIFO),
+ CORBA::NO_MEMORY());
+
+ mapping_manager->mapping(this->pm_);
+ ACE_TRY_CHECK;
+
+ }
+ ACE_CATCHANY
+ {
+ ACE_ERROR((LM_ERROR, "Could not configure the orb"));
+ ACE_OS::exit(1);
+ }
+ ACE_ENDTRY;
+ return 1;
+}
+
+
+::PortableServer::POA_ptr RTCosScheduling_ServerScheduler_i::create_POA (
+ PortableServer::POA_ptr parent,
+ const char * adapter_name,
+ PortableServer::POAManager_ptr a_POAManager,
+ const CORBA::PolicyList & policies
+ ACE_ENV_ARG_DECL_NOT_USED)
+ ACE_THROW_SPEC (( CORBA::SystemException
+ , PortableServer::POA::AdapterAlreadyExists
+ , PortableServer::POA::InvalidPolicy))
+{
+ ACE_TRY_NEW_ENV
+ {
+ // We should hopefully be using more than one thread
+#if defined (ACE_HAS_THREADS)
+ u_int has_threads = 2;
+#else
+ u_int has_threads = 1;
+#endif /* ACE_HAS_THREADS */
+
+ /// Get the ORB core from the POA Manager
+ TAO_Root_POA *tao_poa = dynamic_cast<TAO_Root_POA*>(parent);
+
+ TAO_ORB_Core &orb_core = tao_poa->orb_core();
+
+ /// configure the orb (linear mapping, register interceptor, etc.)
+ configure_ORB(&orb_core);
+
+ /// Get an object reference to orb from the orb core
+ CORBA::ORB_ptr orb = orb_core.orb();
+
+ /// Now resolve a reference to the Real Time ORB
+ CORBA::Object_var rt_obj =
+ orb->resolve_initial_references("RTORB"
+ ACE_ENV_ARG_PARAMETER);
+ ACE_TRY_CHECK;
+ if (CORBA::is_nil(rt_obj.in()))
+ {
+ ACE_DEBUG((LM_DEBUG,
+ "RTORB not available, "
+ "not using RT on the server!\n"));
+ return 0;
+ }
+
+ /// Get the reference to the RT ORB
+ RTCORBA::RTORB_var rt_orb =
+ RTCORBA::RTORB::_narrow (rt_obj.in ()
+ ACE_ENV_ARG_PARAMETER);
+ ACE_TRY_CHECK;
+
+ if (CORBA::is_nil(rt_orb.in ()))
+ {
+ ACE_DEBUG((LM_DEBUG,
+ "Could not initialize orb for the server interceptor, "
+ "RT will not be used!\n"));
+ return 0;
+ }
+
+
+ // Copy the non realtime policy list
+ CORBA::PolicyList poa_policy_list = policies;
+ poa_policy_list.length (policies.length()+has_threads);
+
+ /// Set the server to run at max priority so it will immediately
+ /// process intercepts and place new requests into the approprate queue
+ poa_policy_list[policies.length()] =
+ rt_orb->create_priority_model_policy (
+ RTCORBA::SERVER_DECLARED,
+ RTCORBA::maxPriority
+ ACE_ENV_ARG_PARAMETER);
+ ACE_TRY_CHECK;
+
+ // Set up the threadpool
+#if defined (ACE_HAS_THREADS)
+ CORBA::ULong stacksize = 0;
+
+ /// ideally 1, but not implemented in TAO. This is fine as long
+ /// the system is not overloaded and can accept all requests
+ CORBA::Boolean allow_request_buffering = 0;
+
+ // ideally max_concurrent - num_threads_, but no request buffer in TAO
+ CORBA::ULong max_buffered_requests = 0;
+
+ /// TAO does not have, nor plan to implement, request buffering
+ CORBA::ULong max_request_buffer_size = 0;
+
+ /// This comes from the model of the system
+ CORBA::ULong static_threads = this->num_threads_;
+
+ CORBA::ULong dynamic_threads = 0;
+
+ /// Set it to max so there will be no priority inversions
+ /// while the request is accepted
+ CORBA::ULong default_thread_priority = RTCORBA::maxPriority;
+
+ /// Create the threadpool the server uses to execute requests
+ RTCORBA::ThreadpoolId threadpool =
+ rt_orb->create_threadpool (stacksize,
+ static_threads,
+ dynamic_threads,
+ default_thread_priority,
+ allow_request_buffering,
+ max_buffered_requests,
+ max_request_buffer_size
+ ACE_ENV_ARG_PARAMETER);
+ ACE_TRY_CHECK;
+
+ poa_policy_list[policies.length()+1] =
+ rt_orb->create_threadpool_policy (threadpool
+ ACE_ENV_ARG_PARAMETER);
+ ACE_TRY_CHECK;
+#endif /* ACE_HAS_THREADS */
+
+
+ /// Create the RT POA
+ PortableServer::POA_var poa =
+ parent->create_POA (adapter_name,
+ a_POAManager,
+ poa_policy_list
+ ACE_ENV_ARG_PARAMETER);
+ ACE_TRY_CHECK;
+
+ RTPortableServer::POA_var rt_poa =
+ RTPortableServer::POA::_narrow(poa.in()
+ ACE_ENV_ARG_PARAMETER);
+
+ /// return the reference to the RT POA
+ return rt_poa.in();
+ }
+ ACE_CATCHANY
+ {
+ ACE_PRINT_EXCEPTION(ACE_ANY_EXCEPTION,
+ "ERROR: Could not create a Scheduling Service POA\n");
+ return parent;
+ }
+ ACE_ENDTRY;
+ return parent;
+}
+
+void
+RTCosScheduling_ServerScheduler_i::schedule_object (
+ CORBA::Object_ptr obj,
+ const char * name
+ ACE_ENV_ARG_DECL)
+ ACE_THROW_SPEC ((CORBA::SystemException
+ , RTCosScheduling::UnknownName))
+{
+ /// Check and see if the object name is in the resource map,
+ /// if it is, then there is a ceiling for it and we can add it to the
+ /// object name map. If there is no name in the resource map, then there
+ /// is no valid ceiling for it, throw an UnknownName exception
+ if (this->resource_map_.find(name) == -1)
+ {
+ ACE_THROW (RTCosScheduling::UnknownName());
+ }
+ else
+ {
+ this->object_name_map_.rebind(obj, name);
+ ACE_CHECK;
+ }
+}
+
+
+
+#if TAO_HAS_INTERCEPTORS
+RTCosScheduling_ServerScheduler_Interceptor::RTCosScheduling_ServerScheduler_Interceptor(
+ CORBA::ORB_ptr orb,
+ char *shared_file,
+ CosSchedulingObjectMap *ObjectMap,
+ CosSchedulingResourceMap *resourceMap)
+: name_("RTCosScheduling_ServerScheduler_Interceptor"),
+ orb_(orb),
+ object_name_map_(ObjectMap),
+ resource_map_(resourceMap)
+{
+ ACE_TRY_NEW_ENV
+ {
+ // Create a new Priority Ceiling protocol manager factory
+ ACE_NEW_THROW_EX(this->PCP_factory_,
+ PCP_Manager_Factory(shared_file),
+ CORBA::NO_MEMORY());
+ ACE_CHECK;
+
+
+ /// Now resolve a reference to the Real Time ORB
+ CORBA::Object_var obj =
+ this->orb_->resolve_initial_references("RTORB"
+ ACE_ENV_ARG_PARAMETER);
+ RTCORBA::RTORB_var rt_orb;
+ ACE_TRY_CHECK;
+ if (CORBA::is_nil(obj.in ()))
+ {
+ ACE_DEBUG((LM_DEBUG,
+ "RTORB not available, "
+ "RT ServerScheduler not used!\n"));
+ return;
+ }
+ else
+ {
+ rt_orb =RTCORBA::RTORB::_narrow (obj.in ()
+ ACE_ENV_ARG_PARAMETER);
+ }
+
+ // Now get a reference to the RTCurrent
+ // for the PCP manager to control
+ obj = this->orb_->resolve_initial_references ("RTCurrent"
+ ACE_ENV_ARG_PARAMETER);
+ ACE_TRY_CHECK;
+ if (CORBA::is_nil(obj.in()))
+ {
+ ACE_DEBUG((LM_DEBUG,
+ "RTCurrent not available, "
+ "RT ServerScheduler not used!\n"));
+ return;
+ }
+ else
+ {
+ this->current_ =
+ RTCORBA::Current::_narrow (obj.in ()
+ ACE_ENV_ARG_PARAMETER);
+ }
+
+ // Now get a reference to the codec factory to create a codec that will
+ // decode the client priority sent in the service context
+ obj =
+ this->orb_->resolve_initial_references ("CodecFactory"
+ ACE_ENV_ARG_PARAMETER);
+ ACE_TRY_CHECK;
+
+ if (CORBA::is_nil(obj.in()))
+ {
+ ACE_DEBUG((LM_DEBUG,
+ "Could not initalize the server interceptor Codec, "
+ "RT ServerScheduler not used!\n"));
+ return;
+ }
+ else
+ {
+ this->codec_factory_ = IOP::CodecFactory::_narrow(obj.in());
+ }
+ ACE_TRY_CHECK;
+
+
+ // Set up the codec
+ IOP::Encoding encoding;
+ encoding.format = IOP::ENCODING_CDR_ENCAPS;
+ encoding.major_version = 1;
+ encoding.minor_version = 2;
+
+ this->codec_ = this->codec_factory_->create_codec(encoding);
+ }
+ ACE_CATCHANY
+ {
+ ACE_PRINT_EXCEPTION(ACE_ANY_EXCEPTION,
+ "Error in installing the interceptor for the ServerScheduler\n");
+ }
+ ACE_ENDTRY;
+}
+
+
+// Delete the objects we have made in the interceptor
+RTCosScheduling_ServerScheduler_Interceptor::~RTCosScheduling_ServerScheduler_Interceptor()
+{
+ this->object_name_map_ = 0;
+ this->resource_map_ = 0;
+ delete this->PCP_factory_;
+}
+
+void
+RTCosScheduling_ServerScheduler_Interceptor::receive_request(
+ PortableInterceptor::ServerRequestInfo_ptr ri
+ ACE_ENV_ARG_DECL_NOT_USED)
+ACE_THROW_SPEC((
+ CORBA::SystemException,
+ PortableInterceptor::ForwardRequest))
+{
+ ACE_TRY_NEW_ENV
+ {
+
+ ACE_CString name = "";
+ COS_SCHEDULING_RESOURCE_VALUE ceiling, base_priority = 0;
+
+ // Now get a reference to the POA, this is used to get a reference
+ // to the target object
+ PortableInterceptor::AdapterName *adapter_seq = ri->adapter_name();
+ ACE_TRY_CHECK;
+ PortableServer::POA_var poa;
+ const char *adapter_name =
+ (*adapter_seq)[adapter_seq->length() - 1];
+
+ CORBA::Object_var obj =
+ this->orb_->resolve_initial_references("RootPOA"
+ ACE_ENV_ARG_PARAMETER);
+ ACE_TRY_CHECK;
+ if (CORBA::is_nil(obj.in()))
+ {
+ ACE_DEBUG((LM_DEBUG,
+ "Could not get root POA, "
+ "RT scheduling not used on server!\n"));
+ return;
+ }
+ else
+ {
+ PortableServer::POA_var root_poa =
+ PortableServer::POA::_narrow(obj.in());
+ if (CORBA::is_nil(root_poa.in()))
+ {
+ ACE_ERROR((LM_ERROR,
+ "No POA found in Interceptor prio not set\n"));
+ return;
+ }
+ poa = root_poa->find_POA(adapter_name, 0);
+ ACE_TRY_CHECK;
+ }
+
+ // decode the Client priority sent in the service context
+ IOP::ServiceId id = IOP::RTCorbaPriority;
+ IOP::ServiceContext_var sc;
+ ACE_TRY_EX(svc_req)
+ {
+ sc = ri->get_request_service_context(id);
+ ACE_TRY_CHECK_EX(svc_req);
+ }
+ ACE_CATCHANY
+ {
+ // The RTCorbaPriority was not sent, do not use real time
+ // Here we cannot let the server continue to run at
+ // RTCORBA::maxPriority, so change to RTCORBA::minPriority
+ // and things will run best effort
+ this->current_->the_priority(RTCORBA::minPriority);
+ return;
+ }
+ ACE_ENDTRY;
+
+ CORBA::OctetSeq ocSeq = CORBA::OctetSeq(
+ sc->context_data.length(),
+ sc->context_data.length(),
+ sc->context_data.get_buffer(),
+ 0);
+ ACE_TRY_CHECK;
+
+ CORBA::Any the_priority_as_any;
+ the_priority_as_any = *this->codec_->decode(ocSeq);
+ ACE_TRY_CHECK;
+
+ RTCORBA::Priority the_client_priority;
+ the_priority_as_any >>= the_client_priority;
+ ACE_TRY_CHECK;
+
+ // get the object from the object ID that is passed
+ CORBA::OctetSeq_var oseq = ri->object_id();
+ PortableServer::ObjectId oid(oseq -> length(),
+ oseq -> length(),
+ oseq -> get_buffer(),
+ 0);
+ ACE_TRY_CHECK;
+
+ CORBA::Object_var target_object = poa->id_to_reference(oid);
+ ACE_TRY_CHECK;
+
+ // Check to make sure we have the object as scheduled by the
+ // ServerScheduler
+ if (this->object_name_map_->find(target_object, name) == -1 )
+ {
+ ACE_DEBUG((LM_DEBUG,
+ "Object not found in config file, "
+ "RT ServerScheduler not used!\n"));
+ // Here we cannot let the server continue to run at
+ // RTCORBA:: maxPriority, so it will run at minPriority
+ // and things will run best effort
+ this->current_->the_priority(RTCORBA::minPriority);
+ return;
+ }
+
+ /// If the object name if found, get its priority ceiling
+ if (this->resource_map_->find(name, ceiling) == -1 )
+ {
+ /// We could not find the Object's priority ceiling
+ /// given its name
+ ACE_DEBUG((LM_DEBUG,
+ "Object Resource Ceiling not found in config file, "
+ "RT ServerScheduler not used!\n"));
+ // Here we cannot let the server continue to run at
+ // RTCORBA:: maxPriority, so it will run at minPriority
+ // and things will run best effort
+ this->current_->the_priority(RTCORBA::minPriority);
+ return;
+ }
+
+ /// Get the base priority of the server
+ if (this->resource_map_->find("BP", base_priority) == -1 )
+ {
+ ACE_DEBUG((LM_DEBUG,
+ "Server Base Priority not found in config file, "
+ "RTServerScheduler not used!\n"));
+ // Here we cannot let the server continue to run at
+ // RTCORBA:: maxPriority, so it will run at minPriority
+ // and things will run best effort
+ this->current_->the_priority(RTCORBA::minPriority);
+ return;
+ }
+
+ /// Create a new PCP Manager to manage the priority control
+ COS_SCHEDULING_INVOCATION_VALUE p = 0;
+ ACE_NEW_THROW_EX(p,
+ PCP_Manager(
+ PCP_factory_->New_PCP_Manager(this->current_)),
+ CORBA::NO_MEMORY());
+ ACE_TRY_CHECK;
+
+ // Get the lock on the resource, using MPCP
+
+ p->lock(ceiling + base_priority,
+ the_client_priority + base_priority);
+
+ /// store the thread in the invocation list
+ this->invocation_map_.bind(
+ p->threadID(),
+ p);
+ ACE_TRY_CHECK;
+ }
+ ACE_CATCHANY
+ {
+ ACE_PRINT_EXCEPTION(ACE_ANY_EXCEPTION,
+ "Unknown exception in the receive request\n");
+ ACE_OS::exit(1);
+ }
+ ACE_ENDTRY;
+}
+
+void
+RTCosScheduling_ServerScheduler_Interceptor::send_reply(
+ PortableInterceptor::ServerRequestInfo_ptr ri
+ ACE_ENV_ARG_DECL_NOT_USED)
+ ACE_THROW_SPEC((
+ CORBA::SystemException
+ ))
+{
+ ACE_UNUSED_ARG(ri);
+ finish_execution();
+}
+
+void
+RTCosScheduling_ServerScheduler_Interceptor::finish_execution()
+{
+ PCP_Manager *p = 0;
+ this->invocation_map_.unbind((ACE_OS::getpid() << 16) + int(ACE_Thread::self()),p);
+ if (p)
+ {
+ /// Release the Lock on the Thread
+ p->release_lock();
+ /// Delete the PCP Manager
+ delete p;
+ }
+}
+
+char*
+RTCosScheduling_ServerScheduler_Interceptor::name(ACE_ENV_SINGLE_ARG_DECL_NOT_USED)
+ ACE_THROW_SPEC((CORBA::SystemException))
+{
+ return CORBA::string_dup(this->name_);
+}
+
+void
+RTCosScheduling_ServerScheduler_Interceptor::destroy(ACE_ENV_SINGLE_ARG_DECL_NOT_USED)
+ ACE_THROW_SPEC((CORBA::SystemException))
+{
+}
+
+void
+RTCosScheduling_ServerScheduler_Interceptor::receive_request_service_contexts(
+ PortableInterceptor::ServerRequestInfo_ptr ri
+ ACE_ENV_ARG_DECL_NOT_USED)
+ ACE_THROW_SPEC((
+ CORBA::SystemException,
+ PortableInterceptor::ForwardRequest))
+{
+ ACE_UNUSED_ARG(ri);
+}
+
+void
+RTCosScheduling_ServerScheduler_Interceptor::send_exception(
+ PortableInterceptor::ServerRequestInfo_ptr ri
+ ACE_ENV_ARG_DECL_NOT_USED)
+ ACE_THROW_SPEC((CORBA::SystemException,
+ PortableInterceptor::ForwardRequest))
+{
+ ACE_UNUSED_ARG(ri);
+ finish_execution();
+}
+
+void
+RTCosScheduling_ServerScheduler_Interceptor::send_other(
+ PortableInterceptor::ServerRequestInfo_ptr ri
+ ACE_ENV_ARG_DECL_NOT_USED)
+ ACE_THROW_SPEC((
+ CORBA::SystemException,
+ PortableInterceptor::ForwardRequest))
+ {
+ ACE_UNUSED_ARG(ri);
+ finish_execution();
+ }
+
+#endif /* TAO_HAS_INTERCEPTORS */
+
+int
+RTCosScheduling_ServerScheduler_i::resources(
+ const char *node_name,
+ const char *file_name,
+ CosSchedulingResourceMap *resource_map)
+{
+ /// get the resource list list just for the particular node
+ const unsigned int BUF_MAX = 256;
+ FILE *fp = ACE_OS::fopen(file_name, "r");
+ if (fp == NULL)
+ {
+ /// Error return of we cannot open the file.
+ ACE_ERROR_RETURN((LM_ERROR,
+ "Could not find the config file %s, aborting\n",
+ file_name),
+ 0);
+ }
+
+
+ char line[BUF_MAX], key[64];
+ ACE_OS::strncpy(key, "Node ", sizeof("Node "));
+ ACE_OS::strcat(key, node_name);
+
+#ifndef ACE_LACKS_CLEARERR
+ ACE_OS::clearerr(fp);
+#else
+# warning ACE_OS::clearerr() is unimplemented on this platform.
+# warning This code may not function properly.
+#endif /* !ACE_LACKS_CLEARERR */
+ do
+ {
+ ACE_OS::fgets(line, BUF_MAX, fp);
+ if (ACE_OS::last_error() == EOF)
+ {
+ ACE_ERROR_RETURN((LM_ERROR,
+ "Node %s not found in config file\n",
+ node_name),
+ 0);
+ break;
+ }
+
+ }
+ while (ACE_OS::strncmp(line,key,ACE_OS::strlen(key)) != 0);
+
+ /// Skip to the appropriate Task section of the node
+#ifndef ACE_LACKS_CLEARERR
+ ACE_OS::clearerr(fp);
+#else
+# warning ACE_OS::clearerr() is unimplemented on this platform.
+# warning This code may not function properly.
+#endif /* !ACE_LACKS_CLEARERR */
+ do
+ {
+ ACE_OS::fgets(line, BUF_MAX, fp);
+ /// Make sure we did not hit the end of file
+ if (ACE_OS::last_error() == EOF)
+ {
+ ACE_ERROR_RETURN((LM_ERROR,
+ "Task list not found for node %s\n",
+ node_name),
+ 0);
+ break;
+ }
+
+ }
+ while (ACE_OS::strncmp(line,
+ "Resources:",
+ ACE_OS::strlen("Resources:")
+ ) != 0);
+
+ CORBA::Short done = 0;
+ COS_SCHEDULING_RESOURCE_KEY name;
+ COS_SCHEDULING_RESOURCE_VALUE priority = 0;
+ u_int delimiter;
+
+ /// read each activity/priority pair from the config file
+ while (!done)
+ {
+ /// get the activity name
+ ACE_OS::fgets(line, BUF_MAX, fp);
+
+ /// check to make sure we have not reached the end of the list.
+ if (ACE_OS::strncmp(line, "END", ACE_OS::strlen(line)-1) != 0)
+ {
+ name = ACE_CString(line);
+ delimiter = name.find('\t');
+ char *p = ACE_OS::strchr(line, '\t');
+ if (p)
+ priority = ACE_OS::atoi(p);
+ if (priority == 0)
+ priority = RTCORBA::minPriority;
+ if (delimiter < name.length() && delimiter > 0)
+ {
+ resource_map->bind(name.substr(0, delimiter), priority);
+ }
+ else
+ {
+ ACE_ERROR_RETURN((LM_ERROR,
+ "Error in reading resources from %s, aborting",
+ file_name),
+ 0);
+ }
+ }
+ else
+ {
+ done = 1;
+ }
+ }
+
+ return 1;
+}
+
+}
+
+TAO_END_VERSIONED_NAMESPACE_DECL
diff --git a/TAO/orbsvcs/orbsvcs/RTCosScheduling/RTCosScheduling_ServerScheduler_i.h b/TAO/orbsvcs/orbsvcs/RTCosScheduling/RTCosScheduling_ServerScheduler_i.h
new file mode 100644
index 00000000000..beb95c8417c
--- /dev/null
+++ b/TAO/orbsvcs/orbsvcs/RTCosScheduling/RTCosScheduling_ServerScheduler_i.h
@@ -0,0 +1,316 @@
+// -*- C++ -*-
+
+//=============================================================================
+/**
+ * @file RTCosScheduling_ServerScheduler_i.h
+ *
+ * $Id$
+ *
+ * @author Matt Murphy <murphym@cs.uri.edu>
+ */
+//=============================================================================
+
+#ifndef SERVER_SCHEDULERI_H
+#define SERVER_SCHEDULERI_H
+
+#include /**/ "ace/pre.h"
+
+#include "ace/Map_T.h"
+#if !defined (ACE_LACKS_PRAGMA_ONCE)
+# pragma once
+#endif /* ACE_LACKS_PRAGMA_ONCE */
+
+#include "ace/SString.h"
+#include <orbsvcs/RTCosSchedulingS.h>
+#include <orbsvcs/RTCosScheduling/RTCosScheduling_export.h>
+#include "orbsvcs/RTCosScheduling/RTCosScheduling_PCP_Manager.h"
+#include "tao/PortableInterceptorC.h"
+#include "tao/CodecFactory/CodecFactory.h"
+#include "tao/LocalObject.h"
+
+
+
+#if defined(_MSC_VER)
+#pragma warning(push)
+#pragma warning(disable:4250)
+#endif /* _MSC_VER */
+
+#if defined (__BORLANDC__)
+#pragma option push -w-rvl -w-rch -w-ccc -w-inl
+#endif /* __BORLANDC__ */
+
+TAO_BEGIN_VERSIONED_NAMESPACE_DECL
+
+#ifndef RTCOSSCHEDULING_SERVER_CONTAINERS
+#define RTCOSSCHEDULING_SERVER_CONTAINERS
+
+/**
+ * CosSchedulingObjectNameMap
+ *
+ * This typedef is used by the RTCORBA 1.0 ServerScheduler to map
+ * CORBA object references to names
+ */
+
+typedef CORBA::Object_var COS_SCHEDULING_OBJECT_NAME_KEY;
+typedef ACE_CString COS_SCHEDULING_OBJECT_NAME_VALUE;
+
+template<>
+class TAO_RTCosScheduling_Export ACE_Equal_To< COS_SCHEDULING_OBJECT_NAME_KEY >
+{
+ public:
+ int operator () (const COS_SCHEDULING_OBJECT_NAME_KEY lhs,
+ const COS_SCHEDULING_OBJECT_NAME_KEY rhs) const;
+};
+
+
+namespace TAO {
+
+class TAO_RTCosScheduling_Export CosSchedulingObjectMap_Hash_Key
+{
+public:
+ u_long operator () (const COS_SCHEDULING_OBJECT_NAME_KEY &key) const;
+};
+
+typedef ACE_Hash_Map_Manager_Ex_Adapter<
+ COS_SCHEDULING_OBJECT_NAME_KEY,
+ COS_SCHEDULING_OBJECT_NAME_VALUE,
+ CosSchedulingObjectMap_Hash_Key,
+ ACE_Equal_To<COS_SCHEDULING_OBJECT_NAME_KEY>,
+ ACE_Noop_Key_Generator<COS_SCHEDULING_OBJECT_NAME_KEY> > CosSchedulingObjectMap;
+
+/**
+ * This typedef is used in the ServerScheduler to hold a list of
+ * priority ceiling protocol managers for each active method call
+ * from a client.
+ */
+typedef int COS_SCHEDULING_INVOCATION_KEY;
+typedef PCP_Manager * COS_SCHEDULING_INVOCATION_VALUE;
+
+class CosSchedulingInvocation_Hash_key
+{
+public:
+ u_long operator () (const COS_SCHEDULING_INVOCATION_KEY &key) const;
+};
+
+typedef ACE_Hash_Map_Manager_Ex_Adapter<
+ COS_SCHEDULING_INVOCATION_KEY,
+ COS_SCHEDULING_INVOCATION_VALUE,
+ CosSchedulingInvocation_Hash_key,
+ ACE_Equal_To<COS_SCHEDULING_INVOCATION_KEY>,
+ ACE_Noop_Key_Generator<COS_SCHEDULING_INVOCATION_KEY> > CosSchedulingInvocationMap;
+
+
+#endif /* RTCOSSCHEDULING_SERVER_CONTAINERS */
+
+#if TAO_HAS_INTERCEPTORS
+ /**
+ * @class RTCosScheduling_ServerScheduler_Interceptor
+ *
+ * @brief The RTCosScheduling_ServerScheduler_Interceptor intercepts CORBA
+ * requests on behalf of the RTCORBA 1.0 scheduling service and
+ * schedules the requests.
+ */
+ class RTCosScheduling_ServerScheduler_Interceptor
+ : public PortableInterceptor::ServerRequestInterceptor
+ {
+ public :
+ RTCosScheduling_ServerScheduler_Interceptor(CORBA::ORB_ptr orb,
+ char *shared_file,
+ CosSchedulingObjectMap *CosSchedulingObjectMap,
+ CosSchedulingResourceMap *resourceMap);
+
+
+ virtual ~RTCosScheduling_ServerScheduler_Interceptor();
+
+ virtual char* name(ACE_ENV_SINGLE_ARG_DECL_WITH_DEFAULTS)
+ ACE_THROW_SPEC((
+ CORBA::SystemException));
+
+ virtual void destroy( ACE_ENV_SINGLE_ARG_DECL_WITH_DEFAULTS)
+ ACE_THROW_SPEC((CORBA::SystemException));
+
+ virtual void receive_request(
+ PortableInterceptor::ServerRequestInfo_ptr ri
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS)
+ ACE_THROW_SPEC((
+ CORBA::SystemException,
+ PortableInterceptor::ForwardRequest));
+
+ virtual void receive_request_service_contexts(
+ PortableInterceptor::ServerRequestInfo_ptr ri
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS)
+ ACE_THROW_SPEC((
+ CORBA::SystemException,
+ PortableInterceptor::ForwardRequest));
+
+ virtual void send_reply(
+ PortableInterceptor::ServerRequestInfo_ptr ri
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS)
+ ACE_THROW_SPEC((CORBA::SystemException));
+
+ virtual void send_exception(
+ PortableInterceptor::ServerRequestInfo_ptr ri
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS)
+ ACE_THROW_SPEC((
+ CORBA::SystemException,
+ PortableInterceptor::ForwardRequest));
+
+ virtual void send_other(
+ PortableInterceptor::ServerRequestInfo_ptr ri
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS)
+ ACE_THROW_SPEC((
+ CORBA::SystemException,
+ PortableInterceptor::ForwardRequest));
+
+ void finish_execution();
+
+
+ private:
+
+ /// The name of the interceptor
+ const char* name_;
+
+ /// reference to set local priority
+ RTCORBA::Current_var current_;
+
+ /// Factory reference to receive PCP_managers
+ PCP_Manager_Factory * PCP_factory_;
+
+ /// Map to match threadIDs with PCP_Managers
+ CosSchedulingInvocationMap invocation_map_;
+
+ //The orb
+ CORBA::ORB_ptr orb_;
+
+ /// Map to match CORBA::Object_vars to names
+ CosSchedulingObjectMap *object_name_map_;
+
+ /// Map to match Resource names to Ceilings
+ CosSchedulingResourceMap *resource_map_;
+
+ // The codec to decode incoming CORBA Priorities
+ IOP::Codec_var codec_;
+
+
+ // The factory to create the codec
+ IOP::CodecFactory_var codec_factory_;
+ };
+
+#endif /* TAO_HAS_INTERCEPTORS */
+
+ /**
+ * @class RTCosScheduling_ServerScheduler_i
+ *
+ * @brief The ServerScheduler class handles server side
+ * scheduling for the RTCORBA 1.0 Scheduling Service.
+ */
+ class TAO_RTCosScheduling_Export RTCosScheduling_ServerScheduler_i
+ : public virtual RTCosScheduling::ServerScheduler,
+ public virtual CORBA::LocalObject
+ {
+ public:
+ // Constructor
+ RTCosScheduling_ServerScheduler_i (char *node,
+ char *file,
+ char *shared_file,
+ int numthreads);
+
+ //Destructor
+ virtual ~RTCosScheduling_ServerScheduler_i (void);
+
+ /**
+ * This creates and returns a RT POA for use on the server.
+ * It accepts a set of non-RT policies and sets these as
+ * well as RT policies (threadpooling and Server Declared).
+ *
+ * @param parent The poa to base the RT POA upon
+ * @param adapter_name the adapter name for the poa
+ * @param a_POAManager the poa_manager
+ * @param policies the list of non real time policies to be set
+ */
+ virtual ::PortableServer::POA_ptr create_POA (
+ PortableServer::POA_ptr parent,
+ const char * adapter_name,
+ PortableServer::POAManager_ptr a_POAManager,
+ const CORBA::PolicyList & policies
+ ACE_ENV_ARG_DECL)
+ ACE_THROW_SPEC ((
+ CORBA::SystemException
+ , PortableServer::POA::AdapterAlreadyExists
+ , PortableServer::POA::InvalidPolicy));
+
+ /**
+ * This maps a CORBA::Object_var with a name. The names are
+ * later associated with priority ceiling stored in the
+ * scheduling config file.
+ *
+ * @param obj the CORBA object reference to associate with a name
+ * @param name name to associate with the CORBA object reference
+ */
+ virtual void schedule_object (CORBA::Object_ptr obj,
+ const char * name
+ ACE_ENV_ARG_DECL)
+ ACE_THROW_SPEC (( CORBA::SystemException
+ , RTCosScheduling::UnknownName));
+
+ private:
+
+ /**
+ * This sets the orb for the ServerScheduler,
+ * it also resolves references to RT current and sets
+ * priority mapping
+ */
+ int configure_ORB(TAO_ORB_Core *orb_core);
+
+ /// RT Current, to change the priority of the thread
+
+ /// RT Corba Priority Mapping , uses
+ /// Linear Priority Mapping
+ RTCORBA::PriorityMapping *pm_;
+
+ /// The number of threads in the server threadpool
+ int num_threads_;
+
+ char *shared_file_;
+
+ /// The map to match CORBA::Object_vars
+ /// to names
+ CosSchedulingObjectMap object_name_map_;
+
+ /// The map to match resource names to corba priorities
+ CosSchedulingResourceMap resource_map_;
+
+ /*
+ * resources populates a string/int map with a list of resources (keys)
+ * and associated priority ceilings(values)
+ *
+ * @param node_name the name of the node the client resides on,
+ * resources() only retrieves ceilings for the local node
+ *
+ * @param map resource_map a reference to the resource map to populate
+ *
+ */
+ int resources(const char* node_name,
+ const char* file_name,
+ CosSchedulingResourceMap * resource_map);
+ };
+}
+
+TAO_END_VERSIONED_NAMESPACE_DECL
+
+#if defined (__ACE_INLINE__)
+#include "orbsvcs/RTCosScheduling/RTCosScheduling_ServerScheduler_i.i"
+#endif /* __ACE_INLINE__ */
+
+
+#if defined(_MSC_VER)
+#pragma warning(pop)
+#endif /* _MSC_VER */
+
+#if defined (__BORLANDC__)
+#pragma option pop
+#endif /* __BORLANDC__ */
+
+
+#include /**/ "ace/post.h"
+#endif /* SERVER_SCHEDULERI_H */
diff --git a/TAO/orbsvcs/orbsvcs/RTCosScheduling/RTCosScheduling_ServerScheduler_i.i b/TAO/orbsvcs/orbsvcs/RTCosScheduling/RTCosScheduling_ServerScheduler_i.i
new file mode 100644
index 00000000000..4bf50f13a5b
--- /dev/null
+++ b/TAO/orbsvcs/orbsvcs/RTCosScheduling/RTCosScheduling_ServerScheduler_i.i
@@ -0,0 +1,39 @@
+// -*- C++ -*-
+
+//=============================================================================
+/**
+ * @file RTCosScheduling_ServerScheduler_i.i
+ *
+ * $Id$
+ *
+ * @author Matt Murphy <murphym@cs.uri.edu>
+ */
+//=============================================================================
+
+
+TAO_BEGIN_VERSIONED_NAMESPACE_DECL
+
+ACE_INLINE int
+ACE_Equal_To< COS_SCHEDULING_OBJECT_NAME_KEY >::operator () (
+ COS_SCHEDULING_OBJECT_NAME_KEY lhs,
+ COS_SCHEDULING_OBJECT_NAME_KEY rhs) const
+{
+ return lhs->_is_equivalent(rhs.in());
+}
+
+ACE_INLINE u_long
+TAO::CosSchedulingObjectMap_Hash_Key::operator () (
+ const COS_SCHEDULING_OBJECT_NAME_KEY &key) const
+{
+ u_long value = key->_hash(ACE_UINT32_MAX);
+ return value;
+}
+
+ACE_INLINE u_long
+TAO::CosSchedulingInvocation_Hash_key::operator () (
+ const COS_SCHEDULING_INVOCATION_KEY &key) const
+{
+ return static_cast<u_long> (key);
+}
+
+TAO_END_VERSIONED_NAMESPACE_DECL
diff --git a/TAO/orbsvcs/orbsvcs/RTCosScheduling/RTCosScheduling_export.h b/TAO/orbsvcs/orbsvcs/RTCosScheduling/RTCosScheduling_export.h
new file mode 100644
index 00000000000..413a49c7658
--- /dev/null
+++ b/TAO/orbsvcs/orbsvcs/RTCosScheduling/RTCosScheduling_export.h
@@ -0,0 +1,60 @@
+
+// -*- C++ -*-
+// $Id$
+// Definition for Win32 Export directives.
+// This file is generated automatically by generate_export_file.pl TAO_RTCosScheduling
+// ------------------------------
+#ifndef TAO_RTCOSSCHEDULING_EXPORT_H
+#define TAO_RTCOSSCHEDULING_EXPORT_H
+
+#include "ace/config-all.h"
+
+#if defined (TAO_AS_STATIC_LIBS)
+# if !defined (TAO_RTCOSSCHEDULING_HAS_DLL)
+# define TAO_RTCOSSCHEDULING_HAS_DLL 0
+# endif /* ! TAO_RTCOSSCHEDULING_HAS_DLL */
+#else
+# if !defined (TAO_RTCOSSCHEDULING_HAS_DLL)
+# define TAO_RTCOSSCHEDULING_HAS_DLL 1
+# endif /* ! TAO_RTCOSSCHEDULING_HAS_DLL */
+#endif
+
+#if defined (TAO_RTCOSSCHEDULING_HAS_DLL) && (TAO_RTCOSSCHEDULING_HAS_DLL == 1)
+# if defined (TAO_RTCOSSCHEDULING_BUILD_DLL)
+# define TAO_RTCosScheduling_Export ACE_Proper_Export_Flag
+# define TAO_RTCOSSCHEDULING_SINGLETON_DECLARATION(T) ACE_EXPORT_SINGLETON_DECLARATION (T)
+# define TAO_RTCOSSCHEDULING_SINGLETON_DECLARE(SINGLETON_TYPE, CLASS, LOCK) ACE_EXPORT_SINGLETON_DECLARE(SINGLETON_TYPE, CLASS, LOCK)
+# else /* TAO_RTCOSSCHEDULING_BUILD_DLL */
+# define TAO_RTCosScheduling_Export ACE_Proper_Import_Flag
+# define TAO_RTCOSSCHEDULING_SINGLETON_DECLARATION(T) ACE_IMPORT_SINGLETON_DECLARATION (T)
+# define TAO_RTCOSSCHEDULING_SINGLETON_DECLARE(SINGLETON_TYPE, CLASS, LOCK) ACE_IMPORT_SINGLETON_DECLARE(SINGLETON_TYPE, CLASS, LOCK)
+# endif /* TAO_RTCOSSCHEDULING_BUILD_DLL */
+#else /* TAO_RTCOSSCHEDULING_HAS_DLL == 1 */
+# define TAO_RTCosScheduling_Export
+# define TAO_RTCOSSCHEDULING_SINGLETON_DECLARATION(T)
+# define TAO_RTCOSSCHEDULING_SINGLETON_DECLARE(SINGLETON_TYPE, CLASS, LOCK)
+#endif /* TAO_RTCOSSCHEDULING_HAS_DLL == 1 */
+
+// Set TAO_RTCOSSCHEDULING_NTRACE = 0 to turn on library specific tracing even if
+// tracing is turned off for ACE.
+#if !defined (TAO_RTCOSSCHEDULING_NTRACE)
+# if (ACE_NTRACE == 1)
+# define TAO_RTCOSSCHEDULING_NTRACE 1
+# else /* (ACE_NTRACE == 1) */
+# define TAO_RTCOSSCHEDULING_NTRACE 0
+# endif /* (ACE_NTRACE == 1) */
+#endif /* !TAO_RTCOSSCHEDULING_NTRACE */
+
+#if (TAO_RTCOSSCHEDULING_NTRACE == 1)
+# define TAO_RTCOSSCHEDULING_TRACE(X)
+#else /* (TAO_RTCOSSCHEDULING_NTRACE == 1) */
+# if !defined (ACE_HAS_TRACE)
+# define ACE_HAS_TRACE
+# endif /* ACE_HAS_TRACE */
+# define TAO_RTCOSSCHEDULING_TRACE(X) ACE_TRACE_IMPL(X)
+# include "ace/Trace.h"
+#endif /* (TAO_RTCOSSCHEDULING_NTRACE == 1) */
+
+#endif /* TAO_RTCOSSCHEDULING_EXPORT_H */
+
+// End of auto generated file.
diff --git a/TAO/orbsvcs/orbsvcs/RTEvent.mpc b/TAO/orbsvcs/orbsvcs/RTEvent.mpc
new file mode 100644
index 00000000000..72141564487
--- /dev/null
+++ b/TAO/orbsvcs/orbsvcs/RTEvent.mpc
@@ -0,0 +1,55 @@
+// -*- MPC -*-
+// $Id$
+
+project(RTEvent) : orbsvcslib, core, svc_utils, tao_versioning_idl_defaults {
+ sharedname = TAO_RTEvent
+ idlflags += -Wb,stub_export_macro=TAO_RTEvent_Export -Wb,stub_export_include=orbsvcs/Event/event_export.h -Wb,skel_export_macro=TAO_RTEvent_Skel_Export -Wb,skel_export_include=orbsvcs/Event/event_skel_export.h
+ dynamicflags = TAO_RTEVENT_BUILD_DLL
+ tagchecks += RTEvent
+
+ IDL_Files {
+ RtecDefaultEventData.idl
+ RtecEventComm.idl
+ RtecEventChannelAdmin.idl
+ RtecUDPAdmin.idl
+ }
+
+ // This could be simplified if the cpp files for RTEvent were
+ // in their own directory.
+ Source_Files {
+ Event_Utilities.cpp
+ RtecDefaultEventDataC.cpp
+ RtecEventCommC.cpp
+ RtecEventChannelAdminC.cpp
+ RtecUDPAdminC.cpp
+ }
+
+ Header_Files {
+ Event_Utilities.h
+ RtecDefaultEventDataC.h
+ RtecEventCommC.h
+ RtecEventChannelAdminC.h
+ RtecUDPAdminC.h
+ Event/event_export.h
+ Event/event_skel_export.h
+ }
+
+ Inline_Files {
+ Event_Utilities.i
+ RtecDefaultEventDataC.inl
+ RtecEventCommC.inl
+ RtecEventChannelAdminC.inl
+ RtecUDPAdminC.inl
+ }
+
+ Resource_Files{
+ RTEvent.rc
+ }
+
+ Template_Files {
+ }
+
+ Pkgconfig_Files {
+ TAO_RTEvent.pc.in
+ }
+}
diff --git a/TAO/orbsvcs/orbsvcs/RTEvent.rc b/TAO/orbsvcs/orbsvcs/RTEvent.rc
new file mode 100644
index 00000000000..9bb0b0f9439
--- /dev/null
+++ b/TAO/orbsvcs/orbsvcs/RTEvent.rc
@@ -0,0 +1,30 @@
+#include "..\..\tao\Version.h"
+
+1 VERSIONINFO
+ FILEVERSION TAO_MAJOR_VERSION,TAO_MINOR_VERSION,TAO_BETA_VERSION,0
+ PRODUCTVERSION TAO_MAJOR_VERSION,TAO_MINOR_VERSION,TAO_BETA_VERSION,0
+ FILEFLAGSMASK 0x3fL
+ FILEFLAGS 0x0L
+ FILEOS 0x4L
+ FILETYPE 0x1L
+ FILESUBTYPE 0x0L
+BEGIN
+ BLOCK "StringFileInfo"
+ BEGIN
+ BLOCK "040904B0"
+ BEGIN
+ VALUE "FileDescription", "RTEvent\0"
+ VALUE "FileVersion", TAO_VERSION "\0"
+ VALUE "InternalName", "TAO_RTEventDLL\0"
+ VALUE "LegalCopyright", "\0"
+ VALUE "LegalTrademarks", "\0"
+ VALUE "OriginalFilename", "TAO_RTEvent.DLL\0"
+ VALUE "ProductName", "ORBSVCS\0"
+ VALUE "ProductVersion", TAO_VERSION "\0"
+ END
+ END
+ BLOCK "VarFileInfo"
+ BEGIN
+ VALUE "Translation", 0x409, 1200
+ END
+END
diff --git a/TAO/orbsvcs/orbsvcs/RTEventLogAdmin.idl b/TAO/orbsvcs/orbsvcs/RTEventLogAdmin.idl
new file mode 100644
index 00000000000..2d2f900fae4
--- /dev/null
+++ b/TAO/orbsvcs/orbsvcs/RTEventLogAdmin.idl
@@ -0,0 +1,56 @@
+// $Id$
+
+// ============================================================================
+//
+// = FILENAME
+// RTEventLogAdmin.idl
+//
+// = DESCRIPTION
+// This module defines the EventLog and
+// EventLogFactory interfaces.
+//
+// = AUTHOR
+// D A Hanvey (d.hanvey@qub.ac.uk)
+//
+// ============================================================================
+
+#ifndef RTEVENT_LOG_ADMIN_IDL
+#define RTEVENT_LOG_ADMIN_IDL
+
+#include "RtecEventChannelAdmin.idl"
+// CORBA Event Service
+
+#include "DsLogAdmin.idl"
+
+#pragma prefix "omg.org"
+
+module RTEventLogAdmin
+{
+ interface EventLog : DsLogAdmin::Log,
+ RtecEventChannelAdmin::EventChannel{};
+
+ interface EventLogFactory : DsLogAdmin::LogMgr,
+ RtecEventChannelAdmin::ConsumerAdmin
+ {
+ EventLog create (
+ in DsLogAdmin::LogFullActionType full_action,
+ in unsigned long long max_size,
+ in DsLogAdmin::CapacityAlarmThresholdList thresholds,
+ out DsLogAdmin::LogId id
+ ) raises (DsLogAdmin::InvalidLogFullAction,
+ DsLogAdmin::InvalidThreshold);
+
+ EventLog create_with_id (
+ in DsLogAdmin::LogId id,
+ in DsLogAdmin::LogFullActionType full_action,
+ in unsigned long long max_size,
+ in DsLogAdmin::CapacityAlarmThresholdList thresholds
+ ) raises (DsLogAdmin::LogIdAlreadyExists,
+ DsLogAdmin::InvalidLogFullAction,
+ DsLogAdmin::InvalidThreshold);
+
+ };
+
+};
+
+#endif /* RTEVENT_LOG_ADMIN_IDL */
diff --git a/TAO/orbsvcs/orbsvcs/RTEventLogAdmin.mpc b/TAO/orbsvcs/orbsvcs/RTEventLogAdmin.mpc
new file mode 100644
index 00000000000..5ecee5826dd
--- /dev/null
+++ b/TAO/orbsvcs/orbsvcs/RTEventLogAdmin.mpc
@@ -0,0 +1,107 @@
+// -*- MPC -*-
+// $Id$
+
+project(RTEventLogAdmin_IDL) : orbsvcslib, core, dslogadmin, rtevent, tao_versioning_idl_defaults {
+ custom_only = 1
+ idlflags += -Wb,stub_export_macro=TAO_RTEventLog_Export -Wb,stub_export_include=orbsvcs/Log/rteventlog_export.h -Wb,skel_export_macro=TAO_RTEventLog_Skel_Export -Wb,skel_export_include=orbsvcs/Log/rteventlog_skel_export.h
+
+ IDL_Files {
+ RTEventLogAdmin.idl
+ }
+}
+
+project(RTEventLogAdmin) : orbsvcslib, core, dslogadmin, rtevent {
+ sharedname = TAO_RTEventLogAdmin
+ dynamicflags = TAO_RTEVENTLOG_BUILD_DLL
+ tagchecks += RTEventLog
+ after += RTEventLogAdmin_IDL
+
+ IDL_Files {
+ }
+
+ Source_Files {
+ RTEventLogAdminC.cpp
+ }
+
+ Header_Files {
+ RTEventLogAdminC.h
+ Log/rteventlog_export.h
+ }
+
+ Inline_Files {
+ RTEventLogAdminC.inl
+ }
+
+ Template_Files {
+ }
+
+ // explicit Resource_Files to avoid including _Skel & _Serv rc files.
+ Resource_Files {
+ }
+
+ Pkgconfig_Files {
+ TAO_RTEventLogAdmin.pc.in
+ }
+}
+
+project(RTEventLogAdmin_Skel) : orbsvcslib, core, rteventlogadmin, dslogadmin_skel, rtevent_skel, portableserver {
+ sharedname = TAO_RTEventLogAdmin_Skel
+ dynamicflags = TAO_RTEVENTLOG_SKEL_BUILD_DLL
+ tagchecks += RTEventLog
+
+ IDL_Files {
+ }
+
+ Source_Files {
+ RTEventLogAdminS.cpp
+ }
+
+ Header_Files {
+ RTEventLogAdminS.h
+ RTEventLogAdminS_T.h
+ Log/rteventlog_skel_export.h
+ }
+
+ Inline_Files {
+ RTEventLogAdminS.inl
+ RTEventLogAdminS_T.inl
+ }
+
+ Template_Files {
+ RTEventLogAdminS_T.cpp
+ }
+
+ Pkgconfig_Files {
+ TAO_RTEventLogAdmin_Skel.pc.in
+ }
+}
+
+project(RTEventLogAdmin_Serv) : orbsvcslib, core, rteventlogadmin_skel, dslogadmin_serv, rtevent_serv, rtsched {
+ sharedname = TAO_RTEventLogAdmin_Serv
+ dynamicflags = TAO_RTEVENTLOG_SERV_BUILD_DLL
+ tagchecks += RTEventLog
+
+ IDL_Files {
+ }
+
+ Source_Files {
+ Log/RTEventLogConsumer.cpp
+ Log/RTEventLogFactory_i.cpp
+ Log/RTEventLogNotification.cpp
+ Log/RTEventLog_i.cpp
+ }
+
+ Header_Files {
+ Log/rteventlog_serv_export.h
+ }
+
+ Inline_Files {
+ }
+
+ Template_Files {
+ }
+
+ Pkgconfig_Files {
+ TAO_RTEventLogAdmin_Serv.pc.in
+ }
+}
diff --git a/TAO/orbsvcs/orbsvcs/RTEvent_Serv.mpc b/TAO/orbsvcs/orbsvcs/RTEvent_Serv.mpc
new file mode 100644
index 00000000000..1e9797263d9
--- /dev/null
+++ b/TAO/orbsvcs/orbsvcs/RTEvent_Serv.mpc
@@ -0,0 +1,99 @@
+// -*- MPC -*-
+// $Id$
+
+project(RTEvent_Serv) : orbsvcslib, core, rtevent_skel, svc_utils, messaging {
+ avoids += ace_for_tao // Requires ACE_crc32
+ sharedname = TAO_RTEvent_Serv
+ dynamicflags = TAO_RTEVENT_SERV_BUILD_DLL
+ tagchecks += RTEvent
+
+ IDL_Files {
+ }
+
+ Source_Files {
+ Event/ECG_Adapters.cpp
+ Event/ECG_CDR_Message_Receiver.cpp
+ Event/ECG_CDR_Message_Sender.cpp
+ Event/ECG_Complex_Address_Server.cpp
+ Event/ECG_Mcast_EH.cpp
+ Event/ECG_Mcast_Gateway.cpp
+ Event/ECG_Simple_Address_Server.cpp
+ Event/ECG_Simple_Mcast_EH.cpp
+ Event/ECG_UDP_EH.cpp
+ Event/ECG_UDP_Out_Endpoint.cpp
+ Event/ECG_UDP_Receiver.cpp
+ Event/ECG_UDP_Sender.cpp
+ Event/ECG_ConsumerEC_Control.cpp
+ Event/ECG_Reactive_ConsumerEC_Control.cpp
+ Event/ECG_Reconnect_ConsumerEC_Control.cpp
+ Event/EC_And_Filter.cpp
+ Event/EC_Basic_Factory.cpp
+ Event/EC_Basic_Filter_Builder.cpp
+ Event/EC_Bitmask_Filter.cpp
+ Event/EC_Channel_Destroyer.cpp
+ Event/EC_Conjunction_Filter.cpp
+ Event/EC_ConsumerAdmin.cpp
+ Event/EC_ConsumerControl.cpp
+ Event/EC_Default_Factory.cpp
+ Event/EC_Default_ProxyConsumer.cpp
+ Event/EC_Default_ProxySupplier.cpp
+ Event/EC_Disjunction_Filter.cpp
+ Event/EC_Dispatching.cpp
+ Event/EC_Dispatching_Task.cpp
+ Event/EC_Event_Channel.cpp
+ Event/EC_Event_Channel_Base.cpp
+ Event/EC_Factory.cpp
+ Event/EC_Filter.cpp
+ Event/EC_Filter_Builder.cpp
+ Event/EC_Gateway.cpp
+ Event/EC_Gateway_IIOP.cpp
+ Event/EC_Gateway_IIOP_Factory.cpp
+ Event/EC_Group_Scheduling.cpp
+ Event/EC_Lifetime_Utils.cpp
+ Event/EC_Masked_Type_Filter.cpp
+ Event/EC_MT_Dispatching.cpp
+ Event/EC_Negation_Filter.cpp
+ Event/EC_Null_Factory.cpp
+ Event/EC_Null_Scheduling.cpp
+ Event/EC_ObserverStrategy.cpp
+ Event/EC_Per_Supplier_Filter.cpp
+ Event/EC_Prefix_Filter_Builder.cpp
+ Event/EC_ProxyConsumer.cpp
+ Event/EC_ProxySupplier.cpp
+ Event/EC_Proxy_Disconnector.cpp
+ Event/EC_QOS_Info.cpp
+ Event/EC_Reactive_ConsumerControl.cpp
+ Event/EC_Reactive_Dispatching.cpp
+ Event/EC_Reactive_SupplierControl.cpp
+ Event/EC_Reactive_Timeout_Generator.cpp
+ Event/EC_Scheduling_Strategy.cpp
+ Event/EC_SupplierAdmin.cpp
+ Event/EC_SupplierControl.cpp
+ Event/EC_Supplier_Filter.cpp
+ Event/EC_Supplier_Filter_Builder.cpp
+ Event/EC_Timeout_Filter.cpp
+ Event/EC_Timeout_Generator.cpp
+ Event/EC_Trivial_Supplier_Filter.cpp
+ Event/EC_Type_Filter.cpp
+ Event/EC_UDP_Admin.cpp
+ Event/EC_TPC_Dispatching.cpp
+ Event/EC_TPC_Dispatching_Task.cpp
+ Event/EC_TPC_Factory.cpp
+ Event/EC_TPC_ProxyConsumer.cpp
+ Event/EC_TPC_ProxySupplier.cpp
+ }
+
+ Template_Files {
+ Event/EC_Busy_Lock.cpp
+ Event/EC_Lifetime_Utils_T.cpp
+ Channel_Clients_T.cpp
+ }
+
+ Resource_Files{
+ RTEvent_Serv.rc
+ }
+
+ Pkgconfig_Files {
+ TAO_RTEvent_Serv.pc.in
+ }
+}
diff --git a/TAO/orbsvcs/orbsvcs/RTEvent_Serv.rc b/TAO/orbsvcs/orbsvcs/RTEvent_Serv.rc
new file mode 100644
index 00000000000..db8c3e96a2c
--- /dev/null
+++ b/TAO/orbsvcs/orbsvcs/RTEvent_Serv.rc
@@ -0,0 +1,30 @@
+#include "..\..\tao\Version.h"
+
+1 VERSIONINFO
+ FILEVERSION TAO_MAJOR_VERSION,TAO_MINOR_VERSION,TAO_BETA_VERSION,0
+ PRODUCTVERSION TAO_MAJOR_VERSION,TAO_MINOR_VERSION,TAO_BETA_VERSION,0
+ FILEFLAGSMASK 0x3fL
+ FILEFLAGS 0x0L
+ FILEOS 0x4L
+ FILETYPE 0x1L
+ FILESUBTYPE 0x0L
+BEGIN
+ BLOCK "StringFileInfo"
+ BEGIN
+ BLOCK "040904B0"
+ BEGIN
+ VALUE "FileDescription", "RTEvent_Serv\0"
+ VALUE "FileVersion", TAO_VERSION "\0"
+ VALUE "InternalName", "TAO_RTEvent_ServDLL\0"
+ VALUE "LegalCopyright", "\0"
+ VALUE "LegalTrademarks", "\0"
+ VALUE "OriginalFilename", "TAO_RTEvent_Serv.DLL\0"
+ VALUE "ProductName", "ORBSVCS\0"
+ VALUE "ProductVersion", TAO_VERSION "\0"
+ END
+ END
+ BLOCK "VarFileInfo"
+ BEGIN
+ VALUE "Translation", 0x409, 1200
+ END
+END
diff --git a/TAO/orbsvcs/orbsvcs/RTEvent_Skel.mpc b/TAO/orbsvcs/orbsvcs/RTEvent_Skel.mpc
new file mode 100644
index 00000000000..6a8bb6d38b6
--- /dev/null
+++ b/TAO/orbsvcs/orbsvcs/RTEvent_Skel.mpc
@@ -0,0 +1,44 @@
+// -*- MPC -*-
+// $Id$
+
+project(RTEvent_Skel) : orbsvcslib, core, rtevent, portableserver {
+ sharedname = TAO_RTEvent_Skel
+ dynamicflags = TAO_RTEVENT_SKEL_BUILD_DLL
+ tagchecks += RTEvent
+
+ IDL_Files {
+ }
+
+ Source_Files {
+ RtecDefaultEventDataS.cpp
+ RtecEventCommS.cpp
+ RtecEventChannelAdminS.cpp
+ RtecUDPAdminS.cpp
+ }
+
+ Header_Files {
+ RtecDefaultEventDataS.h
+ RtecEventCommS.h
+ RtecEventChannelAdminS.h
+ RtecUDPAdminS.h
+ Event/event_skel_export.h
+ }
+
+ Inline_Files {
+ RtecDefaultEventDataS.inl
+ RtecEventCommS.inl
+ RtecEventChannelAdminS.inl
+ RtecUDPAdminS.inl
+ }
+
+ Template_Files {
+ }
+
+ Resource_Files{
+ RTEvent_Skel.rc
+ }
+
+ Pkgconfig_Files {
+ TAO_RTEvent_Skel.pc.in
+ }
+}
diff --git a/TAO/orbsvcs/orbsvcs/RTEvent_Skel.rc b/TAO/orbsvcs/orbsvcs/RTEvent_Skel.rc
new file mode 100644
index 00000000000..89f1ed77e4f
--- /dev/null
+++ b/TAO/orbsvcs/orbsvcs/RTEvent_Skel.rc
@@ -0,0 +1,30 @@
+#include "..\..\tao\Version.h"
+
+1 VERSIONINFO
+ FILEVERSION TAO_MAJOR_VERSION,TAO_MINOR_VERSION,TAO_BETA_VERSION,0
+ PRODUCTVERSION TAO_MAJOR_VERSION,TAO_MINOR_VERSION,TAO_BETA_VERSION,0
+ FILEFLAGSMASK 0x3fL
+ FILEFLAGS 0x0L
+ FILEOS 0x4L
+ FILETYPE 0x1L
+ FILESUBTYPE 0x0L
+BEGIN
+ BLOCK "StringFileInfo"
+ BEGIN
+ BLOCK "040904B0"
+ BEGIN
+ VALUE "FileDescription", "RTEvent_Skel\0"
+ VALUE "FileVersion", TAO_VERSION "\0"
+ VALUE "InternalName", "TAO_RTEvent_SkelDLL\0"
+ VALUE "LegalCopyright", "\0"
+ VALUE "LegalTrademarks", "\0"
+ VALUE "OriginalFilename", "TAO_RTEvent_Skel.DLL\0"
+ VALUE "ProductName", "ORBSVCS\0"
+ VALUE "ProductVersion", TAO_VERSION "\0"
+ END
+ END
+ BLOCK "VarFileInfo"
+ BEGIN
+ VALUE "Translation", 0x409, 1200
+ END
+END
diff --git a/TAO/orbsvcs/orbsvcs/RTKokyuEvent.mpc b/TAO/orbsvcs/orbsvcs/RTKokyuEvent.mpc
new file mode 100644
index 00000000000..e56df1c1027
--- /dev/null
+++ b/TAO/orbsvcs/orbsvcs/RTKokyuEvent.mpc
@@ -0,0 +1,24 @@
+// -*- MPC -*-
+// $Id$
+
+project(RTKokyuEvent) : orbsvcslib, core, rtevent_serv, rtsched, kokyu {
+ sharedname = TAO_RTKokyuEvent
+ dynamicflags = TAO_RTKOKYUEVENT_BUILD_DLL
+ tagchecks += RTKokyuEvent
+
+ IDL_Files {
+ }
+
+ Source_Files(ORBSVCS_COMPONENTS) {
+ RTKokyuEvent {
+ Event/EC_Kokyu_Dispatching.cpp
+ Event/EC_Kokyu_Factory.cpp
+ Event/EC_Kokyu_Filter.cpp
+ Event/EC_Kokyu_Filter_Builder.cpp
+ Event/EC_Kokyu_Scheduling.cpp
+ }
+ }
+
+ Template_Files {
+ }
+}
diff --git a/TAO/orbsvcs/orbsvcs/RTSched.mpc b/TAO/orbsvcs/orbsvcs/RTSched.mpc
new file mode 100644
index 00000000000..4659069665c
--- /dev/null
+++ b/TAO/orbsvcs/orbsvcs/RTSched.mpc
@@ -0,0 +1,32 @@
+// -*- MPC -*-
+// $Id$
+
+project(RTSched) : orbsvcslib, core, naming, portableserver, svc_utils, tao_versioning_idl_defaults {
+ sharedname = TAO_RTSched
+ idlflags += -Wb,export_macro=TAO_RTSched_Export -Wb,export_include=orbsvcs/Sched/sched_export.h
+ dynamicflags = TAO_RTSCHED_BUILD_DLL
+ tagchecks += Sched
+
+ IDL_Files {
+ RtecScheduler.idl
+ }
+
+ Source_Files(ORBSVCS_COMPONENTS) {
+ Sched {
+ RtecSchedulerC.cpp
+ RtecSchedulerS.cpp
+ Scheduler_Factory.cpp
+ Runtime_Scheduler.cpp
+ Scheduler_Utilities.cpp
+ Sched
+ }
+ }
+
+ Template_Files {
+ }
+
+ // To avoid picking up RTSchedEvent.rc as well, explicitly list the files.
+ Resource_Files {
+ RTSched.rc
+ }
+}
diff --git a/TAO/orbsvcs/orbsvcs/RTSched.rc b/TAO/orbsvcs/orbsvcs/RTSched.rc
new file mode 100644
index 00000000000..88566f35e85
--- /dev/null
+++ b/TAO/orbsvcs/orbsvcs/RTSched.rc
@@ -0,0 +1,30 @@
+#include "..\..\tao\Version.h"
+
+1 VERSIONINFO
+ FILEVERSION TAO_MAJOR_VERSION,TAO_MINOR_VERSION,TAO_BETA_VERSION,0
+ PRODUCTVERSION TAO_MAJOR_VERSION,TAO_MINOR_VERSION,TAO_BETA_VERSION,0
+ FILEFLAGSMASK 0x3fL
+ FILEFLAGS 0x0L
+ FILEOS 0x4L
+ FILETYPE 0x1L
+ FILESUBTYPE 0x0L
+BEGIN
+ BLOCK "StringFileInfo"
+ BEGIN
+ BLOCK "040904B0"
+ BEGIN
+ VALUE "FileDescription", "RTSched\0"
+ VALUE "FileVersion", TAO_VERSION "\0"
+ VALUE "InternalName", "TAO_RTSchedDLL\0"
+ VALUE "LegalCopyright", "\0"
+ VALUE "LegalTrademarks", "\0"
+ VALUE "OriginalFilename", "TAO_RTSched.DLL\0"
+ VALUE "ProductName", "ORBSVCS\0"
+ VALUE "ProductVersion", TAO_VERSION "\0"
+ END
+ END
+ BLOCK "VarFileInfo"
+ BEGIN
+ VALUE "Translation", 0x409, 1200
+ END
+END
diff --git a/TAO/orbsvcs/orbsvcs/RTSchedEvent.mpc b/TAO/orbsvcs/orbsvcs/RTSchedEvent.mpc
new file mode 100644
index 00000000000..e23e9e8e73f
--- /dev/null
+++ b/TAO/orbsvcs/orbsvcs/RTSchedEvent.mpc
@@ -0,0 +1,25 @@
+// -*- MPC -*-
+// $Id$
+
+project(RTSchedEvent) : orbsvcslib, core, rtevent_serv, rtsched {
+ sharedname = TAO_RTSchedEvent
+ dynamicflags = TAO_RTSCHEDEVENT_BUILD_DLL
+ tagchecks += RTSchedEvent
+
+ IDL_Files {
+ }
+
+ Source_Files(ORBSVCS_COMPONENTS) {
+ RTSchedEvent {
+ Event/EC_Gateway_Sched.cpp
+ Event/EC_Priority_Dispatching.cpp
+ Event/EC_Priority_Scheduling.cpp
+ Event/EC_Sched_Factory.cpp
+ Event/EC_Sched_Filter.cpp
+ Event/EC_Sched_Filter_Builder.cpp
+ }
+ }
+
+ Template_Files {
+ }
+}
diff --git a/TAO/orbsvcs/orbsvcs/RTSchedEvent.rc b/TAO/orbsvcs/orbsvcs/RTSchedEvent.rc
new file mode 100644
index 00000000000..4962285f17b
--- /dev/null
+++ b/TAO/orbsvcs/orbsvcs/RTSchedEvent.rc
@@ -0,0 +1,30 @@
+#include "..\..\tao\Version.h"
+
+1 VERSIONINFO
+ FILEVERSION TAO_MAJOR_VERSION,TAO_MINOR_VERSION,TAO_BETA_VERSION,0
+ PRODUCTVERSION TAO_MAJOR_VERSION,TAO_MINOR_VERSION,TAO_BETA_VERSION,0
+ FILEFLAGSMASK 0x3fL
+ FILEFLAGS 0x0L
+ FILEOS 0x4L
+ FILETYPE 0x1L
+ FILESUBTYPE 0x0L
+BEGIN
+ BLOCK "StringFileInfo"
+ BEGIN
+ BLOCK "040904B0"
+ BEGIN
+ VALUE "FileDescription", "RTSchedEvent\0"
+ VALUE "FileVersion", TAO_VERSION "\0"
+ VALUE "InternalName", "TAO_RTSchedEventDLL\0"
+ VALUE "LegalCopyright", "\0"
+ VALUE "LegalTrademarks", "\0"
+ VALUE "OriginalFilename", "TAO_RTSchedEvent.DLL\0"
+ VALUE "ProductName", "ORBSVCS\0"
+ VALUE "ProductVersion", TAO_VERSION "\0"
+ END
+ END
+ BLOCK "VarFileInfo"
+ BEGIN
+ VALUE "Translation", 0x409, 1200
+ END
+END
diff --git a/TAO/orbsvcs/orbsvcs/RT_Notification.mpc b/TAO/orbsvcs/orbsvcs/RT_Notification.mpc
new file mode 100644
index 00000000000..f43b2825357
--- /dev/null
+++ b/TAO/orbsvcs/orbsvcs/RT_Notification.mpc
@@ -0,0 +1,26 @@
+// -*- MPC -*-
+// $Id$
+
+project(RT_Notification) : orbsvcslib, core, rtcorba, notification_serv, tao_versioning_idl_defaults {
+ sharedname = TAO_RT_Notification
+ idlflags += -Wb,export_macro=TAO_RT_Notify_Export -Wb,export_include=orbsvcs/Notify/rt_notify_export.h
+ dynamicflags = TAO_RT_NOTIFY_BUILD_DLL
+ tagchecks += RT_Notify
+
+ IDL_Files {
+ }
+
+ Source_Files(ORBSVCS_COMPONENTS) {
+ RT_Notify {
+ Notify/RT_Builder.cpp
+ Notify/RT_Factory.cpp
+ Notify/RT_Notify_Service.cpp
+ Notify/RT_POA_Helper.cpp
+ Notify/RT_Properties.cpp
+ Notify/Structured/RT_StructuredProxyPushSupplier.cpp
+ }
+ }
+
+ Template_Files {
+ }
+}
diff --git a/TAO/orbsvcs/orbsvcs/RT_Notification.rc b/TAO/orbsvcs/orbsvcs/RT_Notification.rc
new file mode 100644
index 00000000000..f39d9fe9699
--- /dev/null
+++ b/TAO/orbsvcs/orbsvcs/RT_Notification.rc
@@ -0,0 +1,30 @@
+#include "..\..\tao\Version.h"
+
+1 VERSIONINFO
+ FILEVERSION TAO_MAJOR_VERSION,TAO_MINOR_VERSION,TAO_BETA_VERSION,0
+ PRODUCTVERSION TAO_MAJOR_VERSION,TAO_MINOR_VERSION,TAO_BETA_VERSION,0
+ FILEFLAGSMASK 0x3fL
+ FILEFLAGS 0x0L
+ FILEOS 0x4L
+ FILETYPE 0x1L
+ FILESUBTYPE 0x0L
+BEGIN
+ BLOCK "StringFileInfo"
+ BEGIN
+ BLOCK "040904B0"
+ BEGIN
+ VALUE "FileDescription", "CosNotification\0"
+ VALUE "FileVersion", TAO_VERSION "\0"
+ VALUE "InternalName", "TAO_CosNotificationDLL\0"
+ VALUE "LegalCopyright", "\0"
+ VALUE "LegalTrademarks", "\0"
+ VALUE "OriginalFilename", "TAO_CosNotification.DLL\0"
+ VALUE "ProductName", "ORBSVCS\0"
+ VALUE "ProductVersion", TAO_VERSION "\0"
+ END
+ END
+ BLOCK "VarFileInfo"
+ BEGIN
+ VALUE "Translation", 0x409, 1200
+ END
+END
diff --git a/TAO/orbsvcs/orbsvcs/RtecBase.idl b/TAO/orbsvcs/orbsvcs/RtecBase.idl
new file mode 100644
index 00000000000..193e6f65299
--- /dev/null
+++ b/TAO/orbsvcs/orbsvcs/RtecBase.idl
@@ -0,0 +1,92 @@
+// $Id$
+/**
+ * @file RtecBase.idl
+ *
+ * @brief Define the RtecBase module
+ *
+ * RtecBase.idl,v 1.2 2001/09/17 20:50:34 coryan Exp
+ *
+ * @author Carlos O'Ryan <coryan@uci.edu>
+ */
+
+#ifndef TAO_RTEC_BASE_IDL
+#define TAO_RTEC_BASE_IDL
+
+/**
+ * @namespace RtecBase
+ *
+ * @brief Define types shared by the real-time scheduling and event
+ * services.
+ *
+ * These types are defined in a separate module to decouple the
+ * real-time event services from the scheduling service interface (and
+ * implementation!)
+ */
+module RtecBase
+{
+ /// Specify type of call.
+ enum Dependency_Type_t
+ {
+ /// One-way call.
+ ONE_WAY_CALL,
+ /// Two-way call.
+ TWO_WAY_CALL
+ };
+
+ /// Provide a fast, low-footprint identifier for RT_Infos.
+ /**
+ * The Event and Scheduling Service need to communicate information
+ * about RT_Infos (descriptions about the scheduling properties of a
+ * simple operation). On a centralized application one would use
+ * pointers for such a task, but obviously that does not work on a
+ * distributed system.
+ * It is tempting to use object references to identify each RT_Info,
+ * but that does not work either: first the *contents* of the
+ * RT_Info must be transmitted between applications, and object
+ * references are not good identifiers (due to the semantics of
+ * _is_equivalent())
+ *
+ * The handle_t type is used to generate unique identifiers on the
+ * scheduling service, the Event Service can then refer to any
+ * RT_Info using either their name or the quicker handle_t.
+ */
+ typedef long handle_t;
+
+ enum Dependency_Enabled_Type_t
+ // Specify whether a dependency is enabled, disabled, or
+ // non-volatile (enabled + cannot be disabled automatically).
+ {
+ DEPENDENCY_DISABLED,
+ DEPENDENCY_ENABLED,
+ DEPENDENCY_NON_VOLATILE
+ };
+
+ /// Define dependencies between two RT_Infos
+ struct Dependency_Info
+ {
+ /// Type of dependency
+ Dependency_Type_t dependency_type;
+
+ /// Number of times the dependency is called
+ long number_of_calls;
+
+ /// Dependency
+ handle_t rt_info;
+
+ handle_t rt_info_depended_on;
+ Dependency_Enabled_Type_t enabled;
+ // Notice the reference to the RT_Info we
+ // depend on.
+ };
+
+ /// Helper typedef to define the OS priority.
+ typedef long OS_Priority;
+
+ /// Helper typedef to define the OS-independent priority
+ typedef long Preemption_Priority_t;
+
+ /// Helper typedef to define the OS-independent sub-priority
+ typedef long Preemption_Subpriority_t;
+};
+
+#endif /* TAO_RTEC_BASE_IDL */
diff --git a/TAO/orbsvcs/orbsvcs/RtecDefaultEventData.idl b/TAO/orbsvcs/orbsvcs/RtecDefaultEventData.idl
new file mode 100644
index 00000000000..ab51ef3a3bb
--- /dev/null
+++ b/TAO/orbsvcs/orbsvcs/RtecDefaultEventData.idl
@@ -0,0 +1,78 @@
+/**
+ * @file RtecDefaultEventData.idl
+ *
+ * @brief Define the RtecBase module
+ *
+ * $Id$
+ *
+ * TAO's Real-time Event Service is described in:
+ *
+ * http://doc.ece.uci.edu/~coryan/EC/
+ *
+ * @author Carlos O'Ryan <coryan@uci.edu>
+ */
+
+#ifndef TAO_RTEC_DEFAULTEVENTDATA_IDL
+#define TAO_RTEC_DEFAULTEVENTDATA_IDL
+
+#include <OctetSeq.pidl>
+
+#pragma prefix ""
+
+/// Define one of the common event payloads
+typedef CORBA::OctetSeq EventPayload;
+
+/**
+ * @brief User defined Event Data
+ *
+ *
+ * This structure defines the default payload in TAO's Real-time Event
+ * Service.
+ *
+ * Users wanting maximum flexibility can use an Any, users that only
+ * have one type of event may use structures, other users may preffer
+ * union, trying to strike a balance between performance and
+ * flexibility. Users willing to implement their own marshalling may
+ * use a sequence of octets.
+ *
+ * The Event Service is completely transparent as to the contents of
+ * this structure.
+ */
+struct RtecEventData
+{
+#ifndef TAO_LACKS_EVENT_CHANNEL_OCTET_SEQUENCE
+ /// Add padding to align the octet sequence contents
+ /**
+ * This fields ensures that the contents of the octet sequence
+ * following are always aligned to an 8-byte boundary.
+ * Such alignment allows application developers to implement custom
+ * demarshaling from the octet sequence without requiring any data
+ * copies.
+ *
+ * This is how this works:
+ * - The last field in the header is an 8-byte unsigned long, hence
+ the header finishes on an 8 byte boundary.
+ * - The pad1 long has 4 bytes.
+ * - The length in the octet sequence adds another 4 bytes.
+ * - Thus the data in the octet sequence starts on an 8 bytes
+ * boundary too.
+ */
+ long pad1;
+
+ /// Octet sequence payload.
+ /**
+ * This is the payload used more often by high-performance
+ * applications.
+ */
+ EventPayload payload;
+#endif /* TAO_LACKS_EVENT_CHANNEL_OCTET_SEQUENCE */
+
+#ifndef TAO_LACKS_EVENT_CHANNEL_ANY
+ /// Use a CORBA any type as payload.
+ any any_value;
+#endif /* TAO_LACKS_EVENT_CHANNEL_ANY */
+};
+
+#pragma prefix ""
+
+#endif /* TAO_RTEC_DEFAULTEVENTDATA_IDL */
diff --git a/TAO/orbsvcs/orbsvcs/RtecEventChannelAdmin.idl b/TAO/orbsvcs/orbsvcs/RtecEventChannelAdmin.idl
new file mode 100644
index 00000000000..b217e6bffca
--- /dev/null
+++ b/TAO/orbsvcs/orbsvcs/RtecEventChannelAdmin.idl
@@ -0,0 +1,393 @@
+/**
+ * @file RtecEventChannelAdmin.idl
+ *
+ * @brief Define the RtecEventChannelAdmin module
+ *
+ * $Id$
+ *
+ * TAO's Real-time Event Service is described in:
+ *
+ * http://doc.ece.uci.edu/~coryan/EC/
+ *
+ * @author Carlos O'Ryan <coryan@uci.edu>
+ * @author Tim Harrison <harrison@cs.wustl.edu>
+ */
+
+#ifndef TAO_RTEC_EVENTCHANNELADMIN_IDL
+#define TAO_RTEC_EVENTCHANNELADMIN_IDL
+
+#include "RtecEventComm.idl"
+#include "RtecBase.idl"
+
+/**
+ * @namespace RtecEventChannelAdmin
+ *
+ * @brief Interfaces and data structures provided by TAO's Real-time
+ * Event Service implementation
+ */
+module RtecEventChannelAdmin
+{
+ /**
+ * @exception AlreadyConnected
+ *
+ * @brief Exception raised if a consumer or supplier tries to
+ * reconnect even though it is connected already.
+ *
+ * In some configurations the Event Channel implementation allows
+ * reconnections, and treats them as changes in the QoS properties
+ * of the client. This exception is not used in those cases.
+ */
+ exception AlreadyConnected {};
+
+ /**
+ * @struct Dependency
+ *
+ * @brief Encapsulate the parameters of a consumer QoS property
+ *
+ * This structure is used to represent both filtering information
+ * and the QoS requirements that the consumer has for events that
+ * pass the filter.
+ *
+ * @todo It has become painfully obvious that we don't need a
+ * complete RtecEventComm::Event to declare the dependency, simply
+ * the EventHeader would do.
+ */
+ struct Dependency
+ {
+ /// The filtering information, usually takes the form of an event
+ /// type and/or source that the consumer is interested in.
+ RtecEventComm::Event event;
+
+ /// The handle to the RT_Info structure that describes the
+ /// behavior of the consumer upon receiving such an event
+ /**
+ * This handle is ignored for Event Channels configured without an
+ * scheduling service.
+ */
+ RtecBase::handle_t rt_info;
+ };
+
+ /// Define a list of consumer QoS properties
+ typedef sequence<Dependency> DependencySet;
+
+ /**
+ * @struct ConsumerQOS
+ *
+ * @brief Define the complete QoS properties of a consumer
+ *
+ * Consumers declared their QoS properties using a DependencySet and
+ * a special flag to indicate if they are a gateway consumer.
+ * Gateway consumers are ignored in the computation of changes to
+ * the subscription list.
+ */
+ struct ConsumerQOS
+ {
+ /// List of QoS, filtering, correlation and timeouts for this
+ /// consumer.
+ DependencySet dependencies;
+
+ /// If TRUE the consumer is a gateway, i.e., it forwards events
+ /// from a remote peer.
+ boolean is_gateway;
+ };
+
+ /**
+ * @struct Publication
+ *
+ * @brief Encapsulate one supplier publication and the QoS
+ * properties for that publication.
+ *
+ * Suppliers can publish multiple event types, each one with
+ * different QoS properties.
+ *
+ * @todo It has become painfully obvious that we don't need a
+ * complete RtecEventComm::Event to declare the publication, simply
+ * the EventHeader would do.
+ */
+ struct Publication
+ {
+ /// The event publication, normally only the event source and type
+ /// (from the header) is considered.
+ RtecEventComm::Event event;
+
+ /// The dependency information, this includes the RT_Info handle,
+ /// the type of request and other details.
+ /**
+ * This field is ignored by event channels configured without an
+ * scheduling service.
+ */
+ RtecBase::Dependency_Info dependency_info;
+ };
+
+ /// A list of Publication structures
+ typedef sequence<Publication> PublicationSet;
+
+ /**
+ * @struct SupplierQOS
+ *
+ * @brief Describe the complete QoS and filtering properties for a
+ * supplier
+ *
+ * Consumers declared their QoS properties and publications using a
+ * PublicationSet and a special flag to indicate if they are a
+ * gateway supplier.
+ * Gateway suppliers are ignored in the computation of changes to
+ * the publication list.
+ */
+ struct SupplierQOS
+ {
+ /// The publications
+ PublicationSet publications;
+
+ /// Set to TRUE if the supplier is a gateway.
+ boolean is_gateway;
+ };
+
+ /**
+ * @exception TypeError
+ *
+ * @brief Obsolete exception
+ */
+ exception TypeError {};
+
+ /**
+ * @interface ProxyPushSupplier
+ *
+ * @brief Interface used to implement the Abstract Session pattern
+ * for the consumers
+ *
+ * Each consumer converse with the Event Channel via a different
+ * object that implements the ProxyPushSupplier interface. This is
+ * a common idiom in CORBA, as it allows the identification of the
+ * remove consumer efficiently.
+ */
+ interface ProxyPushSupplier : RtecEventComm::PushSupplier
+ {
+ /// Connect a consumer with the Event Channel
+ /**
+ * The ConsumerQOS argument is used to setup the filtering and
+ * QoS properties of the consumer.
+ *
+ * @param push_consumer The consumer that will receive the events.
+ * @param qos The QoS properties for this consumer
+ * @throws CORBA::BAD_PARAM if push_consumer is nil
+ * @throws AlreadyConnected if this operation is invoked multiple
+ * times
+ * @todo The TypeError exception is not used and should be
+ * removed.
+ */
+ void connect_push_consumer(in RtecEventComm::PushConsumer push_consumer,
+ in ConsumerQOS qos)
+ raises(AlreadyConnected, TypeError);
+
+ /// Temporarily suspend reception of events from the Event
+ /// Channel.
+ /**
+ * Calling this method is more efficient than dropping the
+ * events when received by the consumer, and less expensive than
+ * disconnecting and connecting again (but it is not free!!)
+ */
+ void suspend_connection ();
+
+ /// Resume the reception of events.
+ void resume_connection ();
+
+/*
+ //@{
+ void checkpoint (in RtecEventComm::SequenceNumber last_received)
+ raises (Invalid_Checkpoint);
+ void resend_by_sequence (in RtecEventComm::SequenceNumber last_received)
+ raises (Invalid_Resend_Request);
+ void resend_by_date (in RtecEventComm::Time last_timestamp)
+ raises (Invalid_Resend_Request);
+ //@}
+*/
+ };
+
+ /**
+ * @interface ProxyPushConsumer
+ *
+ * @brief Interface used to implement the Abstract Session pattern
+ * for the suppliers.
+ *
+ * Each supplier converse with the Event Channel via a different
+ * object that implements the ProxyPushConsumer interface. This is
+ * a common idiom in CORBA, as it allows identification of the
+ * remote supplier efficiently.
+ */
+ interface ProxyPushConsumer : RtecEventComm::PushConsumer
+ {
+ /// Connect a supplier with the Event Channel
+ /**
+ * @param push_supplier A callback interface, the
+ * disconnect_push_supplier operation is called when the Event
+ * Channel is destroyed.
+ * @param qos This argument is used to pre-compute filtering and
+ * QoS properties for the supplier.
+ *
+ * @throws CORBA::BAD_PARAM if the push_supplier argument is nil
+ * @throws AlreadyConnected if this operation is invoked multiple
+ * times.
+ */
+ void connect_push_supplier (in RtecEventComm::PushSupplier push_supplier,
+ in SupplierQOS qos)
+ raises (AlreadyConnected);
+ };
+
+ /**
+ * @interface ConsumerAdmin
+ *
+ * @brief Implement an Abstract Factory to create ProxyPushSupplier
+ * objects.
+ */
+ interface ConsumerAdmin
+ {
+ /// Create a new ProxyPushSupplier object
+ /**
+ * There is an inherent risk of leaking a ProxyPushSupplier
+ * here, i.e. if the application does not call
+ * connect_push_consumer() at all. The Event Service may choose
+ * to reclaim ProxyPushSupplier objects that have been idle for
+ * too long.
+ */
+ ProxyPushSupplier obtain_push_supplier ();
+ };
+
+ /**
+ * @class SupplierAdmin
+ *
+ * @brief Implement an Abstract Factory to create ProxyPushConsumer
+ * objects.
+ */
+ interface SupplierAdmin
+ {
+ /// Create a new ProxyPushConsumer object
+ /**
+ * There is an inherent risk of leaking a ProxyPushConsumer
+ * here, i.e. if the application does not call
+ * connect_push_supplier() at all. The Event Service may choose
+ * to reclaim ProxyPushConsumer objects that have been idle for
+ * too long.
+ */
+ ProxyPushConsumer obtain_push_consumer ();
+ };
+
+ /**
+ * @class Observer
+ *
+ * @brief Monitor changes in the consumer subscriptions and/or
+ * supplier publciations.
+ *
+ * The event channel reports changes in its internal subscription
+ * and/or publication list via this interface.
+ */
+ interface Observer
+ {
+ /// A change in the list of consumers has ocurred.
+ /**
+ * The disjunction of the subscriptions is sent to the
+ * observer.
+ */
+ void update_consumer (in ConsumerQOS sub);
+
+ /// A change in the list of suppliers has ocurred.
+ /**
+ * The list of all the event publications is passed to the
+ * observer.
+ */
+ void update_supplier (in SupplierQOS pub);
+ };
+
+ /// Opaque identifier for a connected Observer.
+ typedef unsigned long Observer_Handle;
+
+ /**
+ * @class EventChannel
+ *
+ * @brief The main interface for the event service
+ *
+ * This class provides the main entry point for the Event Service.
+ * The class follows a protocol similar to the COS Events Service as
+ * described in the CORBAservices spec.
+ */
+ interface EventChannel
+ {
+ /**
+ * @exception SYNCHRONIZATION_ERROR
+ *
+ * @brief Exception raised if the Event Channel cannot acquire its
+ * internal locks.
+ */
+ exception SYNCHRONIZATION_ERROR {};
+
+ /**
+ * @exception CANT_APPEND_OBSERVER
+ *
+ * @brief Exception raised if the Event Channel is unable to add
+ * an observer due to some internal limitation.
+ */
+ exception CANT_APPEND_OBSERVER {};
+
+ /**
+ * @exception CANT_REMOVE_OBSERVER
+ *
+ * @brief Exception raised if the Event Channel is unable to remove
+ * an observer due to some internal limitation or because the
+ * observer cannot be found.
+ */
+ exception CANT_REMOVE_OBSERVER {};
+
+ //@{
+ /**
+ * @name Unused exceptions
+ *
+ * @todo The following exceptions are not declared in any raises()
+ * clause, therefore they cannot be raised! They should be
+ * removed or added to the right places.
+ */
+
+ /// Exception raised if the QOS properties required are invalid or
+ /// cannot be satisfied
+ exception QOS_ERROR {};
+
+ /// Exception raised if the subscriptions are invalid
+ exception SUBSCRIPTION_ERROR {};
+
+ /// Exception raised if the requested correlation (a form of
+ /// filtering) is invalid
+ exception CORRELATION_ERROR {};
+
+ /// Exception raised if the event cannot be dispatched
+ exception DISPATCH_ERROR {};
+ //@}
+
+ /// Consumers call this method to gain access to the
+ /// ProxyPushSupplier factory.
+ ConsumerAdmin for_consumers ();
+
+ /// Suppliers call this method to gain access to the
+ /// ProxyPushConsumer factory.
+ SupplierAdmin for_suppliers ();
+
+ /// Shuts down the Event Channel.
+ /**
+ * Calling this methods destroys the event service, all its
+ * resource and results in a call to disconnect_push_XXX() on all
+ * connected clients.
+ */
+ void destroy ();
+
+ /// Add an observer to the event channel.
+ /**
+ * Return the handle used in the remove_observer() call.
+ */
+ Observer_Handle append_observer (in Observer gw)
+ raises (SYNCHRONIZATION_ERROR,CANT_APPEND_OBSERVER);
+
+ /// Remove the observer.
+ void remove_observer (in Observer_Handle gw)
+ raises (SYNCHRONIZATION_ERROR,CANT_REMOVE_OBSERVER);
+ };
+};
+
+#endif /* TAO_RTEC_EVENTCHANNELADMIN_IDL */
diff --git a/TAO/orbsvcs/orbsvcs/RtecEventComm.idl b/TAO/orbsvcs/orbsvcs/RtecEventComm.idl
new file mode 100644
index 00000000000..59fe732f592
--- /dev/null
+++ b/TAO/orbsvcs/orbsvcs/RtecEventComm.idl
@@ -0,0 +1,175 @@
+/**
+ * @file RtecEventComm.idl
+ *
+ * @brief Define the RtecEventComm module
+ *
+ * $Id$
+ *
+ * TAO's Real-time Event Service is described in:
+ *
+ * http://doc.ece.uci.edu/~coryan/EC/
+ *
+ * @author Carlos O'Ryan <coryan@uci.edu>
+ * @author Tim Harrison <harrison@cs.wustl.edu>
+ */
+#ifndef TAO_RTEC_EVENTCOMM_IDL
+#define TAO_RTEC_EVENTCOMM_IDL
+
+#include "TimeBase.idl"
+
+// Remove the prefix definition...
+// @@ TODO Is this the "Right Thing"? AFAIK the spec does not mention
+// if pragmas should survive the file scope...
+#pragma prefix ""
+
+#include "RtecDefaultEventData.idl"
+
+/**
+ * @namespace RtecEventComm
+ *
+ * @brief Interfaces and data structures used by the event service
+ * clients
+ */
+module RtecEventComm
+{
+ /// The event data
+ typedef RtecEventData EventData;
+
+ /// Shortcut for the time structures.
+ typedef TimeBase::TimeT Time;
+
+ typedef long EventSourceID;
+ typedef long _EventType;
+
+ /**
+ * @struct EventHeader
+ *
+ * @brief Define the structure of an event header
+ *
+ * The event header is the portion of the event examined by the
+ * event service for filtering purposes.
+ *
+ * Events can be filtered based on their type and SourceID, though
+ * the latest is a misnomer, over time it has evolved into a 'source
+ * class' or 'event domain' field, i.e. multiple sources can have
+ * the same 'ID' and the same source can generate events with
+ * different IDs.
+ */
+ struct EventHeader
+ {
+ /// The event type.
+ /**
+ * Notice that the 'type' of the event may or may not be related
+ * to the data type in its contents. I.e. it is perfectly
+ * possible to send the same payload with different values in this
+ * field. In other words, this is just a filterable value, and
+ * it is up to the application to define (or not) its relation to
+ * the contents of the event.
+ */
+ _EventType type;
+
+ /// Some way to identify the supplier.
+ EventSourceID source;
+
+ /// The "Time To Live" counter.
+ /**
+ * Each time an EC process the event it decreases the TTL field,
+ * when it gets to zero the message is no longer forwarded.
+ */
+ long ttl;
+
+ /// Applications can use this field to time-stamp the event at the
+ /// source.
+ /**
+ * @todo Because the filtering language uses EventHeaders as
+ * filtering expressions (yeah, it sucks) we also use this field
+ * to pass timeout values into the EC filter.
+ */
+ Time creation_time;
+
+#ifndef TAO_LACKS_EVENT_CHANNEL_TIMESTAMPS
+ //@{
+ /** @name Benchmarking timestamps
+ *
+ * The following timestamps are used to benchmark the Event
+ * Channel, they should not be used by the application and may be
+ * removed without notice.
+ */
+ Time ec_recv_time;
+ Time ec_send_time;
+ //@}
+#endif /* TAO_LACKS_EVENT_CHANNEL_TIMESTAMPS */
+ };
+
+ /**
+ * @struct Event
+ *
+ * @brief The basic events delivered by the Event Service.
+ *
+ * The event service uses this structure to pass events around.
+ */
+ struct Event
+ {
+ /// The header, used for filtering
+ EventHeader header;
+
+ /// The payload, the event service treats this as an opaque data
+ /// field.
+ EventData data;
+ };
+ /// The real argument to the push() operations.
+ /**
+ * For performance reasons TAO's Real-time Event Service uses
+ * sequences of events
+ */
+ typedef sequence<Event> EventSet;
+
+ /**
+ * @interface PushConsumer
+ *
+ * @brief Define the interface used by consumers to receive events.
+ *
+ * Applications usually implement this interface to subscribe for
+ * events.
+ */
+ interface PushConsumer
+ {
+ /// Main event delivery callback
+ oneway void push (in EventSet data);
+
+ /// Callback method to indicate a disconnection.
+ /**
+ * If the event service is destroyed while a consumer is still
+ * connected then the following callback operation is invoked on
+ * the consumer.
+ *
+ * The same operation is used by suppliers to disconnect from the
+ * Event Channel, but it is invoked via their
+ * RtecEventChannelAdmin::ProxyPushConsumer peer.
+ */
+ void disconnect_push_consumer ();
+ };
+
+ /**
+ * @interface PushSupplier
+ *
+ * @brief Defines the interface used by suppliers to receive
+ * callbacks from the Event Channel.
+ */
+ interface PushSupplier
+ {
+ /// Callback method to indicate a disconnection.
+ /**
+ * If the event service is destroyed while a supplier is still
+ * connected then the following callback operation is invoked on
+ * the supplier.
+ *
+ * The same operation is used by consumers to disconnect from the
+ * Event Channel, but it is invoked via their
+ * RtecEventChannelAdmin::ProxyPushSupplier peer.
+ */
+ void disconnect_push_supplier ();
+ };
+};
+
+#endif /* TAO_RTEC_EVENTCOMM_IDL */
diff --git a/TAO/orbsvcs/orbsvcs/RtecScheduler.idl b/TAO/orbsvcs/orbsvcs/RtecScheduler.idl
new file mode 100644
index 00000000000..374ef6c195b
--- /dev/null
+++ b/TAO/orbsvcs/orbsvcs/RtecScheduler.idl
@@ -0,0 +1,496 @@
+// $Id$
+
+#ifndef TAO_RTEC_SCHEDULER_IDL
+#define TAO_RTEC_SCHEDULER_IDL
+
+#include "TimeBase.idl"
+#include "RtecBase.idl"
+#pragma prefix ""
+
+module RtecScheduler
+{
+ // Module TimeBase defines the OMG Time Service.
+ typedef TimeBase::TimeT Time; // 100 nanoseconds
+ typedef Time Quantum_t;
+
+ typedef long Period_t; // 100 nanoseconds
+
+ typedef long Threads_t;
+
+ typedef sequence<Period_t> Period_Set;
+
+ enum Criticality_t
+ // Defines the criticality of the operation.
+ // For use with Dynamic Scheduler.
+ {
+ VERY_LOW_CRITICALITY,
+ LOW_CRITICALITY,
+ MEDIUM_CRITICALITY,
+ HIGH_CRITICALITY,
+ VERY_HIGH_CRITICALITY
+ };
+
+ enum Importance_t
+ // Defines the importance of the operation,
+ // which can be used by the Scheduler as a
+ // "tie-breaker" when other scheduling
+ // parameters are equal.
+ {
+ VERY_LOW_IMPORTANCE,
+ LOW_IMPORTANCE,
+ MEDIUM_IMPORTANCE,
+ HIGH_IMPORTANCE,
+ VERY_HIGH_IMPORTANCE
+ };
+
+ enum Info_Type_t
+ // Defines type of operation information.
+ {
+ OPERATION,
+ CONJUNCTION,
+ DISJUNCTION,
+ REMOTE_DEPENDANT
+ };
+
+ typedef RtecBase::Dependency_Enabled_Type_t Dependency_Enabled_Type_t;
+ typedef RtecBase::Dependency_Type_t Dependency_Type_t;
+
+ enum RT_Info_Enabled_Type_t
+ // Specify whether an RT_Info is enabled, disabled, or
+ // non-volatile (enabled + cannot be disabled automatically).
+ {
+ RT_INFO_DISABLED,
+ RT_INFO_ENABLED,
+ RT_INFO_NON_VOLATILE
+ };
+
+ typedef RtecBase::handle_t handle_t;
+ // RT_Info's are assigned per-application
+ // unique identifiers.
+
+ struct RT_Info_Enable_State_Pair
+ {
+ handle_t handle;
+ RT_Info_Enabled_Type_t enabled;
+ };
+
+ typedef sequence<RT_Info_Enable_State_Pair> RT_Info_Enable_State_Pair_Set;
+
+ typedef RtecBase::Dependency_Info Dependency_Info;
+
+ typedef sequence<Dependency_Info> Dependency_Set;
+
+ typedef RtecBase::OS_Priority OS_Priority;
+ typedef RtecBase::Preemption_Subpriority_t Preemption_Subpriority_t;
+ typedef RtecBase::Preemption_Priority_t Preemption_Priority_t;
+
+ struct RT_Info
+ // = TITLE
+ // Describes the QoS for an "RT_Operation".
+ //
+ // = DESCRIPTION
+ // The CPU requirements and QoS for each
+ // "entity" implementing an application
+ // operation is described by the following
+ // information.
+ {
+ // Application-defined string that uniquely
+ // identifies the operation.
+ string entry_point;
+
+ // The scheduler-defined unique identifier.
+ handle_t handle;
+
+ // Execution times.
+ Time worst_case_execution_time;
+ Time typical_execution_time;
+
+ // To account for server data caching.
+ Time cached_execution_time;
+
+ // For rate-base operations, this expresses
+ // the rate. 0 means "completely pasive",
+ // i.e., this operation only executes when
+ // called.
+ Period_t period;
+
+ // Operation Criticality (user assigned significance).
+ Criticality_t criticality;
+
+ // Operation importance, used to "break ties".
+ Importance_t importance;
+
+ // For time-slicing (for BACKGROUND operations only).
+ Quantum_t quantum;
+
+ // The number of internal threads contained by
+ // the operation.
+ Threads_t threads;
+
+ // The following attributes are defined by
+ // the Scheduler once the off-line schedule
+ // is computed.
+
+ // The operations we depend upon.
+ Dependency_Set dependencies;
+
+ // The OS thread priority for processing the
+ // events generated from this RT_Info.=
+ OS_Priority priority;
+
+ // For ordering RT_Info's with equal priority.
+ Preemption_Subpriority_t preemption_subpriority;
+
+ // The queue number for this RT_Info.
+ Preemption_Priority_t preemption_priority;
+
+ // Info_Type
+ Info_Type_t info_type;
+ // Whether or not the RT_Info is enabled.
+ RT_Info_Enabled_Type_t enabled;
+
+ // Token reserved for the scheduler's internal use:
+ // information placed here from outside the scheduler
+ // implementation is prone to be overwritten.
+ unsigned long long volatile_token;
+ };
+
+ enum Dispatching_Type_t
+ // Defines the type of prioritization strategy
+ // to be used by a dispatching queue
+ {
+ STATIC_DISPATCHING,
+ DEADLINE_DISPATCHING,
+ LAXITY_DISPATCHING
+ };
+
+ struct Config_Info
+ // = TITLE
+ // Describes configuration information for a dispatching queue
+ //
+ // = DESCRIPTION
+ // The CPU requirements and QoS for each
+ // "entity" implementing an application
+ // operation is described by the following
+ // information.
+ {
+ // preemption priority for messages dispatched by the queue
+ Preemption_Priority_t preemption_priority;
+
+ // OS priority of the dispatching thread associated with the queue
+ OS_Priority thread_priority;
+
+ // type of dispatching queue
+ Dispatching_Type_t dispatching_type;
+
+ // Set of timer periods associated with the priority level
+ Period_Set timer_periods;
+ };
+
+ typedef sequence<Config_Info> Config_Info_Set;
+
+ enum Anomaly_Severity
+ // Defines the type of prioritization strategy
+ // to be used by a dispatching queue
+ {
+ ANOMALY_FATAL,
+ ANOMALY_ERROR,
+ ANOMALY_WARNING,
+ ANOMALY_NONE
+ };
+
+ struct Scheduling_Anomaly
+ // = TITLE
+ // Describes an anomalous condition encountered during scheduling.
+ //
+ // = DESCRIPTION
+ // The severity and description of an anomolous
+ // condition encountered during schedule computation
+ // is described by the following information.
+ {
+ // Application-defined string that describes
+ // the anomalous condition.
+ string description;
+
+ // Severity of the anomaly
+ Anomaly_Severity severity;
+ };
+
+ typedef sequence<Scheduling_Anomaly> Scheduling_Anomaly_Set;
+
+ exception CYCLIC_DEPENDENCIES {};
+ // There are cycles in the registered dependencies.
+
+ exception UNRESOLVED_LOCAL_DEPENDENCIES {};
+ // There are unresolved local dependencies: one
+ // or more nodes that are not declared as having
+ // unresolved remote dependencies has no threads,
+ // period, or dependencies on another node.
+
+ exception THREAD_SPECIFICATION {};
+ // A node that specifies threads does not specify a period.
+
+ exception DUPLICATE_NAME {};
+ // The application is trying to register the same task again.
+
+ exception UNKNOWN_TASK {};
+ // The RT_Info handle was not valid.
+
+ exception NOT_SCHEDULED {};
+ // The application is trying to obtain scheduling information, but
+ // none is available.
+
+ exception UTILIZATION_BOUND_EXCEEDED {};
+ exception INSUFFICIENT_THREAD_PRIORITY_LEVELS {};
+ exception TASK_COUNT_MISMATCH {};
+ // Problems while computing scheduling.
+
+ exception UNKNOWN_PRIORITY_LEVEL {};
+ // Problems obtaining run-time dispatch queue info.
+
+ exception SYNCHRONIZATION_FAILURE {};
+ // Problems acquiring a synchronization resource.
+
+ exception INTERNAL {};
+ // Problems with the internal scheduler data structures.
+
+ typedef sequence<RT_Info> RT_Info_Set;
+
+ // TODO: Find a reasonable name for this interface, maybe we should
+ // change the name of the module to RtecSchedulerAdmin and name this
+ // Scheduler
+ interface Scheduler
+ // = DESCRIPTION
+ // This class holds all the RT_Info's for a single application.
+ // During the configuration run this will be implemented as a
+ // single remote object, whose services are used by the
+ // suppliers, consumers and the EC.
+ // At run-time each process will hold a copy of the compiled
+ // version of the Scheduler, using the precomputed data to
+ // resolve requests (avoiding any remote calls) and ignoring any
+ // requests for modifying its state.
+ // A Factory class will be used to choose the proper
+ // implementation.
+ //
+ // This class must be registered with the naming service using a
+ // well known name ("Scheduler" seems the obvious choice), the
+ // Naming Context will account for different applications and
+ // modes.
+ //
+ // Once the scheduling data is computed it can be retrieved
+ // remotely to generate the code for the run-time version.
+ {
+ handle_t create (in string entry_point)
+ raises (DUPLICATE_NAME, INTERNAL, SYNCHRONIZATION_FAILURE);
+ // Creates a new RT_Info entry for the function identifier
+ // "entry_point", it can be any string, but the fully qualified
+ // name function name is suggested.
+ // Returns a handle to the RT_Info.
+
+ handle_t lookup (in string entry_point)
+ raises (UNKNOWN_TASK, SYNCHRONIZATION_FAILURE);
+ // Lookups a handle for entry_point.
+
+ RT_Info get (in handle_t handle)
+ raises (UNKNOWN_TASK, SYNCHRONIZATION_FAILURE);
+ // Retrieve information about an RT_Info.
+
+ void set (in handle_t handle,
+ in Criticality_t criticality,
+ in Time wc_time,
+ in Time typical_time,
+ in Time cached_time,
+ in Period_t period,
+ in Importance_t importance,
+ in Quantum_t quantum,
+ in Threads_t threads,
+ in Info_Type_t info_type)
+ raises (UNKNOWN_TASK, INTERNAL, SYNCHRONIZATION_FAILURE);
+ // Set the input attributes of an RT_Info. Multiple calls
+ // to set with the same handle will result in registration
+ // of different tuples for the same RT_Info, e.g., for multi-rate
+ // admission control.
+ // Notice that some values may not be modified (like priority).
+ // Criticality and Info_Type are only used with the Dynamic Scheduler.
+
+ void reset (in handle_t handle,
+ in Criticality_t criticality,
+ in Time wc_time,
+ in Time typical_time,
+ in Time cached_time,
+ in Period_t period,
+ in Importance_t importance,
+ in Quantum_t quantum,
+ in Threads_t threads,
+ in Info_Type_t info_type)
+ raises (UNKNOWN_TASK, INTERNAL, SYNCHRONIZATION_FAILURE);
+ // Removes previous tuples and resets the attributes of an RT_Info.
+ // Notice that some values may not be modified (like priority).
+ // Criticality and Info_Type are only used with the Dynamic Scheduler.
+
+
+ void set_seq (in RT_Info_Set infos)
+ raises (UNKNOWN_TASK, INTERNAL, SYNCHRONIZATION_FAILURE);
+ // Set the input attributes of an RT_Info. Tuples for the passed
+ // sequence elements will be concatenated with the previous
+ // tuples for the same RT_Infos, e.g., for multi-rate admission control.
+ // Notice that some values may not be modified (like priority).
+
+ void reset_seq (in RT_Info_Set infos)
+ raises (UNKNOWN_TASK, INTERNAL, SYNCHRONIZATION_FAILURE);
+ // Reset the input attributes of an RT_Info. Tuples for the passed
+ // sequence elements will be replace the previous
+ // tuples for the same RT_Infos, e.g., for multi-rate admission control.
+ // Notice that some values may not be modified (like priority).
+
+ void replace_seq (in RT_Info_Set infos)
+ raises (UNKNOWN_TASK, INTERNAL, SYNCHRONIZATION_FAILURE);
+ // Replace all RT_Infos, setting characteristics of the RT_Infos
+ // corresponding to the passed handles. All other RT_Infos are reset
+ // to their uninitialized values, i.e., the same they have just after
+ // the create call.
+
+ void add_dependency (in handle_t handle,
+ in handle_t dependency,
+ in long number_of_calls,
+ in Dependency_Type_t dependency_type)
+ raises (SYNCHRONIZATION_FAILURE, UNKNOWN_TASK);
+ // Adds <dependency> to <handle>.
+ // Dependency_Type_t is only used with the Dynamic Scheduler.
+
+ void remove_dependency (in handle_t handle,
+ in handle_t dependency,
+ in long number_of_calls,
+ in Dependency_Type_t dependency_type)
+ raises (SYNCHRONIZATION_FAILURE, UNKNOWN_TASK);
+ // Removes <dependency> from <handle>. Raises UNKNOWN_TASK
+ // if no matching dependency is found.
+
+ void set_dependency_enable_state (in handle_t handle,
+ in handle_t dependency,
+ in long number_of_calls,
+ in Dependency_Type_t dependency_type,
+ in Dependency_Enabled_Type_t enabled)
+ raises (SYNCHRONIZATION_FAILURE, UNKNOWN_TASK);
+ // Enables or disables <dependency> on <handle>. Raises UNKNOWN_TASK
+ // if no matching dependency is found.
+
+ void set_dependency_enable_state_seq (in Dependency_Set dependencies)
+ raises (SYNCHRONIZATION_FAILURE, UNKNOWN_TASK);
+ // Sets the enable state of each dependency in the sequence. Raises
+ // UNKNOWN_TASK if no matching dependency is found.
+
+ void set_rt_info_enable_state (in handle_t handle,
+ in RT_Info_Enabled_Type_t enabled)
+ raises (SYNCHRONIZATION_FAILURE, INTERNAL, UNKNOWN_TASK);
+ // Enables or disables the RT_Info. Raises UNKNOWN_TASK
+ // if no matching RT_Info is found.
+
+ void set_rt_info_enable_state_seq (in RT_Info_Enable_State_Pair_Set pair_set)
+ raises (SYNCHRONIZATION_FAILURE, INTERNAL, UNKNOWN_TASK);
+ // Enables or disables each rt_info in the passed set. Raises UNKNOWN_TASK
+ // if no matching dependency is found.
+
+ void priority (in handle_t handle,
+ out OS_Priority o_priority,
+ out Preemption_Subpriority_t p_subpriority,
+ out Preemption_Priority_t p_priority)
+ raises (UNKNOWN_TASK, SYNCHRONIZATION_FAILURE, NOT_SCHEDULED);
+ void entry_point_priority (in string entry_point,
+ out OS_Priority o_priority,
+ out Preemption_Subpriority_t p_subpriority,
+ out Preemption_Priority_t p_priority)
+ raises (UNKNOWN_TASK, SYNCHRONIZATION_FAILURE, NOT_SCHEDULED);
+ // Obtain the run time priorities.
+ // TODO: Do we need the two interfaces or is it simply confusing?
+ // If we should to keep only the <handle> version: Are the extra
+ // round-trips too expensive?
+ // If we choose only the <entry_point> version: Are the copies for
+ // the string affordable?
+
+ void compute_scheduling (in long minimum_priority,
+ in long maximum_priority,
+ out RT_Info_Set infos,
+ out Dependency_Set dependencies,
+ out Config_Info_Set configs,
+ out Scheduling_Anomaly_Set anomalies)
+ raises (UTILIZATION_BOUND_EXCEEDED,
+ SYNCHRONIZATION_FAILURE,
+ INSUFFICIENT_THREAD_PRIORITY_LEVELS,
+ TASK_COUNT_MISMATCH,
+ INTERNAL,
+ DUPLICATE_NAME);
+ // Computes the scheduling priorities, returns the RT_Info's with
+ // their priorities properly filled.
+ // This info can be cached by a Run_Time_Scheduler service or
+ // dumped into a C++ file for compilation and even faster (static)
+ // lookup.
+
+
+ void recompute_scheduling (in long minimum_priority,
+ in long maximum_priority,
+ out Scheduling_Anomaly_Set anomalies)
+ raises (UTILIZATION_BOUND_EXCEEDED,
+ SYNCHRONIZATION_FAILURE,
+ INSUFFICIENT_THREAD_PRIORITY_LEVELS,
+ TASK_COUNT_MISMATCH,
+ INTERNAL,
+ DUPLICATE_NAME);
+ // Recomputes the scheduling priorities, etc.
+
+ void get_rt_info_set (out RT_Info_Set infos)
+ raises (SYNCHRONIZATION_FAILURE,
+ INTERNAL);
+ // Returns the set of rt_infos, with their assigned priorities (as
+ // of the last schedule re-computation).
+
+ void get_dependency_set (out Dependency_Set dependencies)
+ raises (SYNCHRONIZATION_FAILURE,
+ INTERNAL);
+ // Returns the set of rt_infos, with their assigned priorities (as
+ // of the last schedule re-computation).
+
+ void get_config_info_set (out Config_Info_Set configs)
+ raises (SYNCHRONIZATION_FAILURE,
+ INTERNAL);
+ // Returns the set of config_infos, describing the appropriate
+ // number, types, and priority levels for the dispatching lanes.
+
+ void dispatch_configuration (in Preemption_Priority_t p_priority,
+ out OS_Priority o_priority,
+ out Dispatching_Type_t d_type)
+ raises (NOT_SCHEDULED,
+ SYNCHRONIZATION_FAILURE,
+ UNKNOWN_PRIORITY_LEVEL);
+ // Returns the thread priority and dispatching type assigned
+ // to the dispatching priority level that was passed in. This
+ // information can be used to configure the queues through which
+ // the scheduled operations are to be dispatched.
+ //
+ // If the schedule has not been computed:
+ // raises (NOT_SCHEDULED);
+ //
+ // If the schedule has been computed, but the passed
+ // priority level is outside those assigned:
+ // raises (UNKNOWN_PRIORITY_LEVEL);
+
+
+ Preemption_Priority_t last_scheduled_priority ()
+ raises (SYNCHRONIZATION_FAILURE, NOT_SCHEDULED);
+ // Returns the last priority number assigned to an operation in the schedule.
+ // The number returned is one less than the total number of scheduled priorities.
+ // All scheduled priorities range from 0 to the number returned, inclusive.
+ //
+ // If the schedule has not been computed:
+ // raises (NOT_SCHEDULED);
+
+ void get_config_infos(out Config_Info_Set configs)
+ raises (SYNCHRONIZATION_FAILURE, NOT_SCHEDULED);
+ // Provides the set of Config_Infos associated with the current schedule.
+ //
+ // If the schedule has not been computed:
+ // raises (NOT_SCHEDULED);
+ };
+};
+
+#endif /* TAO_RTEC_SCHEDULER_IDL */
diff --git a/TAO/orbsvcs/orbsvcs/RtecUDPAdmin.idl b/TAO/orbsvcs/orbsvcs/RtecUDPAdmin.idl
new file mode 100644
index 00000000000..b63f52fe9a2
--- /dev/null
+++ b/TAO/orbsvcs/orbsvcs/RtecUDPAdmin.idl
@@ -0,0 +1,61 @@
+/**
+ * @file RtecUDPAdmin.idl
+ *
+ * @brief Define the RtecUDPAdmin module
+ *
+ * $Id$
+ *
+ * TAO's Real-time Event Service is described in:
+ *
+ * http://doc.ece.uci.edu/~coryan/EC/
+ *
+ * @author Carlos O'Ryan <coryan@uci.edu>
+ */
+
+#ifndef TAO_RTEC_UDP_ADMIN_IDL
+#define TAO_RTEC_UDP_ADMIN_IDL
+
+#include "RtecEventComm.idl"
+
+/**
+ * @namespace RtecUDPAdmin
+ *
+ * @brief Define the data structures and interfaces used by UDP-based
+ * gateways
+ */
+module RtecUDPAdmin
+{
+ /**
+ * @struct UDP_Addr
+ *
+ * @brief Represent a UDP SAP.
+ */
+ struct UDP_Addr
+ {
+ /// The IP address
+ unsigned long ipaddr;
+ /// The UDP port
+ unsigned short port;
+ };
+
+ /**
+ * @interface AddrServer
+ *
+ * @brief Defines a interface to configure the mapping between
+ * events and multicast groups (or UDP broadcast or UDP unicast)
+ * addresses.
+ */
+ interface AddrServer
+ {
+ /// Get the UDP address give the event header
+ /**
+ * @param header The event header, used to fetch the type and
+ * source of the event
+ * @param addr Return the address used for the given event type
+ */
+ void get_addr (in RtecEventComm::EventHeader header,
+ out UDP_Addr addr);
+ };
+};
+
+#endif /* TAO_RTEC_UDP_ADMIN_IDL */
diff --git a/TAO/orbsvcs/orbsvcs/Runtime_Scheduler.cpp b/TAO/orbsvcs/orbsvcs/Runtime_Scheduler.cpp
new file mode 100644
index 00000000000..d582988c508
--- /dev/null
+++ b/TAO/orbsvcs/orbsvcs/Runtime_Scheduler.cpp
@@ -0,0 +1,594 @@
+// $Id$
+
+#include "orbsvcs/Time_Utilities.h"
+#include "orbsvcs/Runtime_Scheduler.h"
+#include "ace/OS_NS_string.h"
+
+ACE_RCSID (orbsvcs,
+ Runtime_Scheduler,
+ "$Id$")
+
+TAO_BEGIN_VERSIONED_NAMESPACE_DECL
+
+// Constructor. Initialize the data from the POD_RT_Info array.
+
+ACE_Runtime_Scheduler::
+ACE_Runtime_Scheduler (int config_count,
+ ACE_Scheduler_Factory::POD_Config_Info config_info[],
+ int entry_count,
+ ACE_Scheduler_Factory::POD_RT_Info rt_info[])
+ : config_count_ (config_count),
+ config_info_ (config_info),
+ entry_count_ (entry_count),
+ rt_info_ (rt_info)
+{
+}
+
+// Create an RT_Info. In the config run scheduler this actually constructs
+// a new RT_Info. Here, we just return its handle, or an error value if
+// it's not present.
+
+RtecScheduler::handle_t
+ACE_Runtime_Scheduler::create (const char *entry_point
+ ACE_ENV_ARG_DECL_NOT_USED)
+ ACE_THROW_SPEC ((CORBA::SystemException,
+ RtecScheduler::DUPLICATE_NAME))
+{
+ // Just make sure it's there and return its handle.
+ for (int i = 0; i < entry_count_; ++i)
+ if (ACE_OS::strcmp (entry_point,
+ rt_info_[i].entry_point) == 0)
+ return i + 1;
+
+ // TODO: throw an exception or print an error.
+ return -1;
+}
+
+// Lookup a handle for an RT_Info, and return its handle, or an error
+// value if it's not present.
+
+RtecScheduler::handle_t
+ACE_Runtime_Scheduler::lookup (const char * entry_point
+ ACE_ENV_ARG_DECL)
+ ACE_THROW_SPEC ((CORBA::SystemException))
+{
+ return create (entry_point ACE_ENV_ARG_PARAMETER);
+}
+
+
+// Return a pointer to the RT_Info corresponding to the passed handle.
+
+RtecScheduler::RT_Info *
+ACE_Runtime_Scheduler::get (RtecScheduler::handle_t handle
+ ACE_ENV_ARG_DECL)
+ ACE_THROW_SPEC((CORBA::SystemException,
+ RtecScheduler::UNKNOWN_TASK))
+{
+ if (handle <= 0 || handle > entry_count_)
+ ACE_THROW_RETURN (RtecScheduler::UNKNOWN_TASK (),
+ 0);
+ // Note: there is no memory leak here, according to the CORBA spec,
+ // we are supposed to allocate an structure and return it, the
+ // caller owns it from then on.
+
+ // Allocate a new RT_Info
+ RtecScheduler::RT_Info* info;
+ ACE_NEW_THROW_EX (info,
+ RtecScheduler::RT_Info,
+ CORBA::NO_MEMORY ());
+ ACE_CHECK_RETURN (0);
+
+
+ info->entry_point = rt_info_[handle - 1].entry_point;
+ info->handle = rt_info_[handle - 1].handle;
+ info->worst_case_execution_time = rt_info_[handle - 1].worst_case_execution_time;
+ info->typical_execution_time = rt_info_[handle - 1].typical_execution_time;
+ info->cached_execution_time = rt_info_[handle - 1].cached_execution_time;
+ info->period = rt_info_[handle - 1].period;
+ info->criticality = RtecScheduler::Criticality_t(rt_info_[handle - 1].criticality);
+ info->importance = RtecScheduler::Importance_t(rt_info_[handle - 1].importance);
+ info->quantum = rt_info_[handle - 1].quantum;
+ info->threads = rt_info_[handle - 1].threads;
+ info->priority = rt_info_[handle - 1].priority;
+ info->preemption_subpriority = rt_info_[handle - 1].static_subpriority;
+ info->preemption_priority = rt_info_[handle - 1].preemption_priority;
+ info->info_type = RtecScheduler::Info_Type_t(rt_info_[handle - 1].info_type);
+
+ return info;
+}
+
+
+// Set characteristics of the RT_Info corresponding to the passed handle.
+
+void
+ACE_Runtime_Scheduler::set (::RtecScheduler::handle_t handle,
+ ::RtecScheduler::Criticality_t criticality,
+ ::RtecScheduler::Time time,
+ ::RtecScheduler::Time typical_time,
+ ::RtecScheduler::Time cached_time,
+ ::RtecScheduler::Period_t period,
+ ::RtecScheduler::Importance_t importance,
+ ::RtecScheduler::Quantum_t quantum,
+ ::RtecScheduler::Threads_t threads,
+ ::RtecScheduler::Info_Type_t info_type
+ ACE_ENV_ARG_DECL)
+ ACE_THROW_SPEC ((CORBA::SystemException,
+ RtecScheduler::UNKNOWN_TASK))
+{
+ // We compare the values with the ones stored and print a message on
+ // any differences.
+ if (handle <= 0 || handle > entry_count_)
+ {
+ ACE_DEBUG ((LM_DEBUG, "Unknown task: no entry for handle %d\n",
+ handle));
+ ACE_THROW (RtecScheduler::UNKNOWN_TASK());
+ // NOTREACHED
+ }
+ if (rt_info_[handle - 1].worst_case_execution_time != time
+ || rt_info_[handle - 1].typical_execution_time != typical_time
+ || rt_info_[handle - 1].cached_execution_time != cached_time
+ || rt_info_[handle - 1].period != period
+ || rt_info_[handle - 1].criticality != criticality
+ || rt_info_[handle - 1].importance != static_cast<CORBA::Long> (importance)
+ || rt_info_[handle - 1].quantum != quantum
+ || rt_info_[handle - 1].info_type != info_type
+ || rt_info_[handle - 1].threads != static_cast<CORBA::Long> (threads))
+ ACE_ERROR ((LM_ERROR,
+ "invalid data for RT_Info: %s\n",
+ (const char*)rt_info_[handle - 1].entry_point));
+ // TODO: throw something here.
+}
+
+
+void
+ACE_Runtime_Scheduler::reset (RtecScheduler::handle_t handle,
+ RtecScheduler::Criticality_t criticality,
+ RtecScheduler::Time time,
+ RtecScheduler::Time typical_time,
+ RtecScheduler::Time cached_time,
+ RtecScheduler::Period_t period,
+ RtecScheduler::Importance_t importance,
+ RtecScheduler::Quantum_t quantum,
+ RtecScheduler::Threads_t threads,
+ RtecScheduler::Info_Type_t info_type
+ ACE_ENV_ARG_DECL)
+ ACE_THROW_SPEC ((CORBA::SystemException,
+ RtecScheduler::UNKNOWN_TASK))
+{
+ // Just go ahead and call the set method
+ this->set (handle, criticality, time, typical_time, cached_time,
+ period, importance, quantum, threads, info_type ACE_ENV_ARG_PARAMETER );
+}
+
+
+void
+ACE_Runtime_Scheduler::set_seq (const RtecScheduler::RT_Info_Set& infos
+ ACE_ENV_ARG_DECL)
+ ACE_THROW_SPEC ((CORBA::SystemException,
+ RtecScheduler::UNKNOWN_TASK,
+ RtecScheduler::INTERNAL,
+ RtecScheduler::SYNCHRONIZATION_FAILURE))
+{
+ for (u_int i = 0; i < infos.length (); ++i)
+ {
+#if defined (__BORLANDC__) && (__BORLANDC__ <= 0x582) && defined (NDEBUG)
+ // BCB2006 and BCB6 get an internal backend error when building this
+ // code in release mode, reported to Borland as QC27961
+ RtecScheduler::RT_Info info = infos[i];
+
+ // Call the internal set method.
+ this->set (info.handle,
+ info.criticality,
+ info.worst_case_execution_time,
+ info.typical_execution_time,
+ info.cached_execution_time,
+ info.period,
+ info.importance,
+ info.quantum,
+ info.threads,
+ info.info_type
+ ACE_ENV_ARG_PARAMETER);
+ ACE_CHECK;
+#else
+ // Call the internal set method.
+ this->set (infos[i].handle,
+ infos[i].criticality,
+ infos[i].worst_case_execution_time,
+ infos[i].typical_execution_time,
+ infos[i].cached_execution_time,
+ infos[i].period,
+ infos[i].importance,
+ infos[i].quantum,
+ infos[i].threads,
+ infos[i].info_type
+ ACE_ENV_ARG_PARAMETER);
+ ACE_CHECK;
+#endif
+ }
+}
+
+void
+ACE_Runtime_Scheduler::replace_seq (const RtecScheduler::RT_Info_Set& infos
+ ACE_ENV_ARG_DECL)
+ ACE_THROW_SPEC ((CORBA::SystemException,
+ RtecScheduler::UNKNOWN_TASK,
+ RtecScheduler::INTERNAL,
+ RtecScheduler::SYNCHRONIZATION_FAILURE))
+{
+ for (u_int i = 0; i < infos.length (); ++i)
+ {
+#if defined (__BORLANDC__) && (__BORLANDC__ <= 0x582) && defined (NDEBUG)
+ // BCB2006 and BCB6 get an internal backend error when building this
+ // code in release mode, reported to Borland as QC27961
+ RtecScheduler::RT_Info info = infos[i];
+
+ // Call the internal set method.
+ this->set (info.handle,
+ info.criticality,
+ info.worst_case_execution_time,
+ info.typical_execution_time,
+ info.cached_execution_time,
+ info.period,
+ info.importance,
+ info.quantum,
+ info.threads,
+ info.info_type
+ ACE_ENV_ARG_PARAMETER);
+ ACE_CHECK;
+#else
+ // Call the internal set method.
+ this->set (infos[i].handle,
+ infos[i].criticality,
+ infos[i].worst_case_execution_time,
+ infos[i].typical_execution_time,
+ infos[i].cached_execution_time,
+ infos[i].period,
+ infos[i].importance,
+ infos[i].quantum,
+ infos[i].threads,
+ infos[i].info_type
+ ACE_ENV_ARG_PARAMETER);
+ ACE_CHECK;
+#endif
+ }
+}
+
+
+void
+ACE_Runtime_Scheduler::reset_seq (const RtecScheduler::RT_Info_Set& infos
+ ACE_ENV_ARG_DECL)
+ ACE_THROW_SPEC ((CORBA::SystemException,
+ RtecScheduler::UNKNOWN_TASK,
+ RtecScheduler::INTERNAL,
+ RtecScheduler::SYNCHRONIZATION_FAILURE))
+{
+ // Just call the set sequence method
+ this->set_seq (infos ACE_ENV_ARG_PARAMETER);
+}
+
+
+// Returns the priority and subpriority values assigned to an RT_Info,
+// based on its handle.
+
+void
+ACE_Runtime_Scheduler::priority (RtecScheduler::handle_t handle,
+ RtecScheduler::OS_Priority& o_priority,
+ RtecScheduler::Preemption_Subpriority_t& subpriority,
+ RtecScheduler::Preemption_Priority_t& p_priority
+ ACE_ENV_ARG_DECL)
+ ACE_THROW_SPEC ((CORBA::SystemException,
+ RtecScheduler::UNKNOWN_TASK,
+ RtecScheduler::NOT_SCHEDULED))
+{
+ if (handle <= 0 || handle > entry_count_)
+ ACE_THROW (RtecScheduler::UNKNOWN_TASK ());
+ // NOTREACHED
+
+ o_priority = rt_info_[handle - 1].priority;
+ subpriority = rt_info_[handle - 1].static_subpriority;
+ p_priority = rt_info_[handle - 1].preemption_priority;
+}
+
+
+// Returns the priority and subpriority values assigned to an RT_Info,
+// based on its entry point name.
+
+void
+ACE_Runtime_Scheduler::entry_point_priority (const char * entry_point,
+ RtecScheduler::OS_Priority& priority,
+ RtecScheduler::Preemption_Subpriority_t& subpriority,
+ RtecScheduler::Preemption_Priority_t& p_priority
+ ACE_ENV_ARG_DECL)
+ ACE_THROW_SPEC ((CORBA::SystemException,
+ RtecScheduler::UNKNOWN_TASK,
+ RtecScheduler::NOT_SCHEDULED))
+{
+ RtecScheduler::handle_t handle = lookup (entry_point ACE_ENV_ARG_PARAMETER);
+ ACE_CHECK;
+
+ if (handle < -1)
+ // The exception was thrown or is in ACE_ENV_SINGLE_ARG_PARAMETER already.
+ return;
+ this->priority (handle,
+ priority,
+ subpriority,
+ p_priority
+ ACE_ENV_ARG_PARAMETER);
+}
+
+
+// In the config run scheduler, this method registers a dependency between
+// two RT_Infos. In the run time scheduler, this is a no-op.
+
+void
+ACE_Runtime_Scheduler::add_dependency (RtecScheduler::handle_t handle,
+ RtecScheduler::handle_t /* dependency */,
+ CORBA::Long /* number_of_calls */,
+ RtecScheduler::Dependency_Type_t /* dependency_type */
+ ACE_ENV_ARG_DECL)
+ ACE_THROW_SPEC ((CORBA::SystemException,
+ RtecScheduler::UNKNOWN_TASK))
+{
+ if (handle <= 0 || handle > entry_count_)
+ ACE_THROW (RtecScheduler::UNKNOWN_TASK ());
+ // NOTREACHED
+
+#if 0
+ // Just check that the information is consistent.
+ RtecScheduler::Dependency_Set& deps = rt_info_[handle - 1]->dependencies;
+ for (CORBA::ULong i = 0; i < deps.length (); ++i)
+ {
+ if (deps[i].rt_info == dependency
+ && deps[i].number_of_calls == number_of_calls
+ && deps[i].dependency_type == dependency_type)
+ {
+ return;
+ }
+ }
+ ACE_ERROR ((LM_ERROR, "unmatched dependency on %s\n",
+ (const char*)rt_info_[handle - 1]->entry_point));
+#endif
+}
+
+
+// In the reconfig scheduler, this method removes a dependency between
+// two RT_Infos. In the run time scheduler, this is a no-op.
+
+void
+ACE_Runtime_Scheduler::remove_dependency (RtecScheduler::handle_t handle,
+ RtecScheduler::handle_t /* dependency */,
+ CORBA::Long /* number_of_calls */,
+ RtecScheduler::Dependency_Type_t /* dependency_type */
+ ACE_ENV_ARG_DECL)
+ ACE_THROW_SPEC ((CORBA::SystemException,
+ RtecScheduler::UNKNOWN_TASK))
+{
+ if (handle <= 0 || handle > entry_count_)
+ ACE_THROW (RtecScheduler::UNKNOWN_TASK ());
+}
+
+
+// In the reconfig scheduler, this method enables a dependency between
+// two RT_Infos. In the run time scheduler, this is a no-op.
+
+void
+ACE_Runtime_Scheduler::set_dependency_enable_state (RtecScheduler::handle_t handle,
+ RtecScheduler::handle_t /* dependency */,
+ CORBA::Long /* number_of_calls */,
+ RtecScheduler::Dependency_Type_t /* dependency_type */,
+ RtecScheduler::Dependency_Enabled_Type_t /* enabled */
+ ACE_ENV_ARG_DECL)
+ ACE_THROW_SPEC ((CORBA::SystemException,
+ RtecScheduler::UNKNOWN_TASK))
+{
+ if (handle <= 0 || handle > entry_count_)
+ ACE_THROW (RtecScheduler::UNKNOWN_TASK ());
+}
+
+
+// In the reconfig scheduler, this method enables or disables an RT_Info.
+// In the run time scheduler, this is a no-op.
+
+void
+ACE_Runtime_Scheduler::set_rt_info_enable_state (RtecScheduler::handle_t handle,
+ RtecScheduler::RT_Info_Enabled_Type_t /* enabled */
+ ACE_ENV_ARG_DECL)
+ ACE_THROW_SPEC ((CORBA::SystemException,
+ RtecScheduler::UNKNOWN_TASK))
+{
+ if (handle <= 0 || handle > entry_count_)
+ ACE_THROW (RtecScheduler::UNKNOWN_TASK ());
+}
+
+
+void ACE_Runtime_Scheduler::set_dependency_enable_state_seq (const RtecScheduler::Dependency_Set & dependencies
+ ACE_ENV_ARG_DECL)
+ ACE_THROW_SPEC ((CORBA::SystemException,
+ RtecScheduler::SYNCHRONIZATION_FAILURE,
+ RtecScheduler::UNKNOWN_TASK))
+ // This method sets the enable state of a sequence of dependencies.
+{
+ ACE_UNUSED_ARG (dependencies);
+
+ ACE_THROW (CORBA::NO_IMPLEMENT ());
+}
+
+void ACE_Runtime_Scheduler::set_rt_info_enable_state_seq (
+ const RtecScheduler::RT_Info_Enable_State_Pair_Set &
+ ACE_ENV_ARG_DECL_NOT_USED)
+ ACE_THROW_SPEC ((CORBA::SystemException,
+ RtecScheduler::SYNCHRONIZATION_FAILURE,
+ RtecScheduler::UNKNOWN_TASK))
+// This method enables or disables a sequence of RT_Infos.
+{
+}
+
+// In the config run scheduler, this method causes scheduling information
+// to be computed for all registered RT_Infos. In the run time scheduler,
+// this is a no-op.
+
+void
+ACE_Runtime_Scheduler::compute_scheduling (CORBA::Long /* minimum_priority */,
+ CORBA::Long /* maximum_priority */,
+ RtecScheduler::RT_Info_Set_out /* infos */,
+ RtecScheduler::Dependency_Set_out /*dependencies */,
+ RtecScheduler::Config_Info_Set_out /* configs */,
+ RtecScheduler::Scheduling_Anomaly_Set_out /* anomalies */
+ ACE_ENV_ARG_DECL_NOT_USED)
+ ACE_THROW_SPEC ((CORBA::SystemException,
+ RtecScheduler::UTILIZATION_BOUND_EXCEEDED,
+ RtecScheduler::INSUFFICIENT_THREAD_PRIORITY_LEVELS,
+ RtecScheduler::TASK_COUNT_MISMATCH))
+{
+ // TODO: Right now just do nothing, later we could validate the
+ // priorities (without recomputing).
+ // TODO: fill up the infos.
+ return;
+}
+
+// Recomputes the scheduling priorities, etc.
+
+void
+ACE_Runtime_Scheduler::recompute_scheduling (CORBA::Long minimum_priority,
+ CORBA::Long maximum_priority,
+ RtecScheduler::Scheduling_Anomaly_Set_out anomalies
+ ACE_ENV_ARG_DECL_NOT_USED)
+
+ ACE_THROW_SPEC ((CORBA::SystemException,
+ RtecScheduler::UTILIZATION_BOUND_EXCEEDED,
+ RtecScheduler::SYNCHRONIZATION_FAILURE,
+ RtecScheduler::INSUFFICIENT_THREAD_PRIORITY_LEVELS,
+ RtecScheduler::TASK_COUNT_MISMATCH,
+ RtecScheduler::INTERNAL,
+ RtecScheduler::DUPLICATE_NAME))
+{
+ // TODO: Right now just do nothing.
+ ACE_UNUSED_ARG(minimum_priority);
+ ACE_UNUSED_ARG(maximum_priority);
+ ACE_UNUSED_ARG(anomalies);
+
+ return;
+}
+
+
+// Returns the set of rt_infos, with their assigned priorities (as
+// of the last schedule re-computation).
+
+void
+ACE_Runtime_Scheduler::get_rt_info_set (RtecScheduler::RT_Info_Set_out infos
+ ACE_ENV_ARG_DECL_NOT_USED)
+
+ ACE_THROW_SPEC ((CORBA::SystemException,
+ RtecScheduler::SYNCHRONIZATION_FAILURE,
+ RtecScheduler::INTERNAL))
+{
+ // TODO: Right now just do nothing.
+ ACE_UNUSED_ARG(infos);
+ return;
+}
+
+
+// Returns the set of rt_infos, with their assigned priorities (as
+// of the last schedule re-computation).
+
+void
+ACE_Runtime_Scheduler::get_dependency_set (RtecScheduler::Dependency_Set_out dependencies
+ ACE_ENV_ARG_DECL_NOT_USED)
+
+ ACE_THROW_SPEC ((CORBA::SystemException,
+ RtecScheduler::SYNCHRONIZATION_FAILURE,
+ RtecScheduler::INTERNAL))
+{
+ // TODO: Right now just do nothing.
+ ACE_UNUSED_ARG(dependencies);
+ return;
+}
+
+
+// Returns the set of config_infos, describing the appropriate
+// number, types, and priority levels for the dispatching lanes.
+
+void
+ACE_Runtime_Scheduler::get_config_info_set (RtecScheduler::Config_Info_Set_out configs
+ ACE_ENV_ARG_DECL_NOT_USED)
+ ACE_THROW_SPEC ((CORBA::SystemException,
+ RtecScheduler::SYNCHRONIZATION_FAILURE,
+ RtecScheduler::INTERNAL))
+{
+ // TODO: Right now just do nothing.
+ ACE_UNUSED_ARG(configs);
+ return;
+}
+
+
+// Provides the thread priority and queue type for the given priority
+// level.
+
+void
+ACE_Runtime_Scheduler::dispatch_configuration (RtecScheduler::Preemption_Priority_t p_priority,
+ RtecScheduler::OS_Priority& priority,
+ RtecScheduler::Dispatching_Type_t & d_type
+ ACE_ENV_ARG_DECL)
+ ACE_THROW_SPEC ((CORBA::SystemException,
+ RtecScheduler::NOT_SCHEDULED,
+ RtecScheduler::UNKNOWN_PRIORITY_LEVEL))
+{
+ // Throw an exception if a valid schedule has not been loaded
+ if (config_count_ <= 0
+ || config_info_ [p_priority].preemption_priority != p_priority)
+ {
+ ACE_THROW (RtecScheduler::NOT_SCHEDULED ());
+ ACE_NOTREACHED (return);
+ }
+ // throw an exception if an invalid priority was passed
+ else if (p_priority < 0 || p_priority >= config_count_)
+ {
+ ACE_THROW (RtecScheduler::UNKNOWN_PRIORITY_LEVEL());
+ ACE_NOTREACHED (return);
+ }
+ else
+ {
+ priority = config_info_ [p_priority].thread_priority;
+ d_type = config_info_ [p_priority].dispatching_type;
+ return;
+ }
+}
+
+
+// Returns the last priority number assigned to an operation in the
+// schedule. The number returned is one less than the total number
+// of scheduled priorities. All scheduled priorities range from 0
+// to the number returned, inclusive.
+
+RtecScheduler::Preemption_Priority_t
+ACE_Runtime_Scheduler::last_scheduled_priority (ACE_ENV_SINGLE_ARG_DECL)
+ ACE_THROW_SPEC ((CORBA::SystemException,
+ RtecScheduler::NOT_SCHEDULED))
+{
+ // throw an exception if a valid schedule has not been loaded
+ if (config_count_ <= 0)
+ ACE_THROW_RETURN (RtecScheduler::NOT_SCHEDULED(),
+ (RtecScheduler::Preemption_Priority_t) -1);
+ else
+ return (RtecScheduler::Preemption_Priority_t) (config_count_ - 1);
+}
+
+
+void
+ACE_Runtime_Scheduler::get_config_infos (RtecScheduler::Config_Info_Set_out /*configs */
+ ACE_ENV_ARG_DECL)
+ ACE_THROW_SPEC ((CORBA::SystemException,
+ RtecScheduler::NOT_SCHEDULED))
+{
+ // throw an exception if a valid schedule has not been loaded
+ if (this->config_count_ <= 0)
+ ACE_THROW (RtecScheduler::NOT_SCHEDULED());
+ //TODO: fill the Config_Info_Set with the runtime Config_Infos
+ //for now, this function is unimplemented
+ //
+ // @@ If unimplemented we either return a CORBA::NO_IMPL exception
+ // or a proprietary ACE_NOTSUP; -- Bala
+ ACE_THROW (CORBA::NO_IMPLEMENT ());
+}
+
+TAO_END_VERSIONED_NAMESPACE_DECL
diff --git a/TAO/orbsvcs/orbsvcs/Runtime_Scheduler.h b/TAO/orbsvcs/orbsvcs/Runtime_Scheduler.h
new file mode 100644
index 00000000000..f7afe874c75
--- /dev/null
+++ b/TAO/orbsvcs/orbsvcs/Runtime_Scheduler.h
@@ -0,0 +1,288 @@
+// -*- C++ -*-
+//
+// $Id$
+
+// ============================================================================
+//
+// = LIBRARY
+// orbsvcs
+//
+// = FILENAME
+// Runtime_Scheduler.h
+//
+// = AUTHOR
+// Chris Gill <cdgill@cs.wustl.edu>
+//
+// ============================================================================
+
+#ifndef ACE_RUNTIME_SCHEDULER_H
+#define ACE_RUNTIME_SCHEDULER_H
+#include /**/ "ace/pre.h"
+
+#include "orbsvcs/Scheduler_Factory.h"
+#include "orbsvcs/RtecSchedulerS.h"
+#include "orbsvcs/Sched/sched_export.h"
+
+TAO_BEGIN_VERSIONED_NAMESPACE_DECL
+
+class TAO_RTSched_Export ACE_Runtime_Scheduler : public POA_RtecScheduler::Scheduler
+{
+ // = TITLE
+ // A fast and simple servant for RtecScheduler::Scheduler based on
+ // precomputed schedules.
+ //
+ // = DESCRIPTION
+ // This class offers the services of the scheduler, but based on
+ // precomputed and precompiled information. This results in a
+ // highly optimized execution after the configuration runs.
+public:
+ ACE_Runtime_Scheduler (int config_count,
+ ACE_Scheduler_Factory::POD_Config_Info config_info[],
+ int entry_count,
+ ACE_Scheduler_Factory::POD_RT_Info rt_info[]);
+ // Constructor. Initialize the data from the POD_RT_Info array.
+
+ virtual RtecScheduler::handle_t create (const char * entry_point
+ ACE_ENV_ARG_DECL)
+ ACE_THROW_SPEC ((CORBA::SystemException,
+ RtecScheduler::DUPLICATE_NAME));
+ // Create an RT_Info. In the config run scheduler this actually constructs
+ // a new RT_Info. Here, we just return its handle, or an error value if
+ // it's not present.
+
+ virtual RtecScheduler::handle_t lookup (const char * entry_point
+ ACE_ENV_ARG_DECL)
+ ACE_THROW_SPEC((CORBA::SystemException));
+ // Lookup a handle for an RT_Info, and return its handle, or an error
+ // value if it's not present.
+
+ virtual RtecScheduler::RT_Info* get (RtecScheduler::handle_t handle
+ ACE_ENV_ARG_DECL)
+ ACE_THROW_SPEC ((CORBA::SystemException,
+ RtecScheduler::UNKNOWN_TASK));
+ // Return a pointer to the RT_Info corresponding to the passed handle.
+
+ virtual void set (::RtecScheduler::handle_t handle,
+ ::RtecScheduler::Criticality_t criticality,
+ ::RtecScheduler::Time time,
+ ::RtecScheduler::Time typical_time,
+ ::RtecScheduler::Time cached_time,
+ ::RtecScheduler::Period_t period,
+ ::RtecScheduler::Importance_t importance,
+ ::RtecScheduler::Quantum_t quantum,
+ ::RtecScheduler::Threads_t threads,
+ ::RtecScheduler::Info_Type_t info_type
+ ACE_ENV_ARG_DECL)
+ ACE_THROW_SPEC ((CORBA::SystemException,
+ RtecScheduler::UNKNOWN_TASK));
+ // Set characteristics of the RT_Info corresponding to the passed handle.
+
+ virtual void reset (RtecScheduler::handle_t handle,
+ RtecScheduler::Criticality_t criticality,
+ RtecScheduler::Time time,
+ RtecScheduler::Time typical_time,
+ RtecScheduler::Time cached_time,
+ RtecScheduler::Period_t period,
+ RtecScheduler::Importance_t importance,
+ RtecScheduler::Quantum_t quantum,
+ RtecScheduler::Threads_t threads,
+ RtecScheduler::Info_Type_t info_type
+ ACE_ENV_ARG_DECL)
+ ACE_THROW_SPEC ((CORBA::SystemException,
+ RtecScheduler::UNKNOWN_TASK));
+ // Reset characteristics of the RT_Info corresponding to the passed handle.
+
+ virtual void set_seq (const RtecScheduler::RT_Info_Set& infos
+ ACE_ENV_ARG_DECL)
+ ACE_THROW_SPEC ((CORBA::SystemException,
+ RtecScheduler::UNKNOWN_TASK,
+ RtecScheduler::INTERNAL,
+ RtecScheduler::SYNCHRONIZATION_FAILURE));
+ // Set characteristics of the RT_Infos corresponding to the passed handles.
+ // Tuples are added in the case of existing and/or multiple definitions.
+
+ virtual void replace_seq (const RtecScheduler::RT_Info_Set& infos
+ ACE_ENV_ARG_DECL)
+ ACE_THROW_SPEC ((CORBA::SystemException,
+ RtecScheduler::UNKNOWN_TASK,
+ RtecScheduler::INTERNAL,
+ RtecScheduler::SYNCHRONIZATION_FAILURE));
+ // Replace characteristics of the RT_Infos corresponding to the
+ // passed handles.
+
+ virtual void reset_seq (const RtecScheduler::RT_Info_Set& infos
+ ACE_ENV_ARG_DECL)
+ ACE_THROW_SPEC ((CORBA::SystemException,
+ RtecScheduler::UNKNOWN_TASK,
+ RtecScheduler::INTERNAL,
+ RtecScheduler::SYNCHRONIZATION_FAILURE));
+ // Reset characteristics of the RT_Infos corresponding to the passed handles.
+ // Tuples are replaced in the case of existing and/or multiple definitions.
+
+ virtual void priority (RtecScheduler::handle_t handle,
+ RtecScheduler::OS_Priority& o_priority,
+ RtecScheduler::Preemption_Subpriority_t& p_subpriority,
+ RtecScheduler::Preemption_Priority_t& p_priority
+ ACE_ENV_ARG_DECL)
+ ACE_THROW_SPEC ((CORBA::SystemException,
+ RtecScheduler::UNKNOWN_TASK,
+ RtecScheduler::NOT_SCHEDULED));
+ // Returns the priority and subpriority values assigned to an RT_Info,
+ // based on its handle.
+
+ virtual void entry_point_priority (const char * entry_point,
+ RtecScheduler::OS_Priority& o_priority,
+ RtecScheduler::Preemption_Subpriority_t& p_subpriority,
+ RtecScheduler::Preemption_Priority_t& p_priority
+ ACE_ENV_ARG_DECL)
+ ACE_THROW_SPEC ((CORBA::SystemException,
+ RtecScheduler::UNKNOWN_TASK,
+ RtecScheduler::NOT_SCHEDULED));
+ // Returns the priority and subpriority values assigned to an RT_Info,
+ // based on its entry point name.
+
+ virtual void add_dependency (RtecScheduler::handle_t handle,
+ RtecScheduler::handle_t dependency,
+ CORBA::Long number_of_calls,
+ RtecScheduler::Dependency_Type_t dependency_type
+ ACE_ENV_ARG_DECL)
+ ACE_THROW_SPEC ((CORBA::SystemException,
+ RtecScheduler::UNKNOWN_TASK));
+ // In the config run scheduler, this method registers a dependency between
+ // two RT_Infos. In the run time scheduler, this is a no-op.
+
+ virtual void remove_dependency (RtecScheduler::handle_t handle,
+ RtecScheduler::handle_t dependency,
+ CORBA::Long number_of_calls,
+ RtecScheduler::Dependency_Type_t dependency_type
+ ACE_ENV_ARG_DECL)
+ ACE_THROW_SPEC ((CORBA::SystemException,
+ RtecScheduler::UNKNOWN_TASK));
+ // In the reconfig scheduler, this method removes a dependency between
+ // two RT_Infos. In the run time scheduler, this is a no-op.
+
+ virtual void set_dependency_enable_state (RtecScheduler::handle_t handle,
+ RtecScheduler::handle_t dependency,
+ CORBA::Long number_of_calls,
+ RtecScheduler::Dependency_Type_t dependency_type,
+ RtecScheduler::Dependency_Enabled_Type_t enabled
+ ACE_ENV_ARG_DECL)
+ ACE_THROW_SPEC ((CORBA::SystemException,
+ RtecScheduler::UNKNOWN_TASK));
+ // In the reconfig scheduler, this method (re)enabes a dependency between
+ // two RT_Infos. In the run time scheduler, this is a no-op.
+
+ virtual void set_rt_info_enable_state (RtecScheduler::handle_t handle,
+ RtecScheduler::RT_Info_Enabled_Type_t enabled
+ ACE_ENV_ARG_DECL)
+ ACE_THROW_SPEC ((CORBA::SystemException,
+ RtecScheduler::UNKNOWN_TASK));
+ // In the reconfig scheduler, enables or disables an RT_Info.
+ // In the run time scheduler, this is a no-op.
+
+ virtual void set_dependency_enable_state_seq (const RtecScheduler::Dependency_Set & dependencies
+ ACE_ENV_ARG_DECL)
+ ACE_THROW_SPEC ((CORBA::SystemException,
+ RtecScheduler::SYNCHRONIZATION_FAILURE,
+ RtecScheduler::UNKNOWN_TASK));
+ // This method sets the enable state of a sequence of dependencies.
+
+ virtual void set_rt_info_enable_state_seq (const RtecScheduler::RT_Info_Enable_State_Pair_Set & pair_set
+ ACE_ENV_ARG_DECL)
+ ACE_THROW_SPEC ((CORBA::SystemException,
+ RtecScheduler::SYNCHRONIZATION_FAILURE,
+ RtecScheduler::UNKNOWN_TASK));
+ // This method enables or disables a sequence of RT_Infos.
+
+ virtual void compute_scheduling (CORBA::Long minimum_priority,
+ CORBA::Long maximum_priority,
+ RtecScheduler::RT_Info_Set_out infos,
+ RtecScheduler::Dependency_Set_out deps,
+ RtecScheduler::Config_Info_Set_out configs,
+ RtecScheduler::Scheduling_Anomaly_Set_out anomalies
+ ACE_ENV_ARG_DECL)
+ ACE_THROW_SPEC ((CORBA::SystemException,
+ RtecScheduler::UTILIZATION_BOUND_EXCEEDED,
+ RtecScheduler::INSUFFICIENT_THREAD_PRIORITY_LEVELS,
+ RtecScheduler::TASK_COUNT_MISMATCH));
+ // In the config run scheduler, this method causes scheduling information
+ // to be computed for all registered RT_Infos. In the run time scheduler,
+ // this is a no-op.
+
+ virtual void recompute_scheduling (CORBA::Long minimum_priority,
+ CORBA::Long maximum_priority,
+ RtecScheduler::Scheduling_Anomaly_Set_out anomalies
+ ACE_ENV_ARG_DECL)
+ ACE_THROW_SPEC ((CORBA::SystemException,
+ RtecScheduler::UTILIZATION_BOUND_EXCEEDED,
+ RtecScheduler::SYNCHRONIZATION_FAILURE,
+ RtecScheduler::INSUFFICIENT_THREAD_PRIORITY_LEVELS,
+ RtecScheduler::TASK_COUNT_MISMATCH,
+ RtecScheduler::INTERNAL,
+ RtecScheduler::DUPLICATE_NAME));
+ // Recomputes the scheduling priorities, etc.
+
+ virtual void get_rt_info_set (RtecScheduler::RT_Info_Set_out infos
+ ACE_ENV_ARG_DECL)
+ ACE_THROW_SPEC ((CORBA::SystemException,
+ RtecScheduler::SYNCHRONIZATION_FAILURE,
+ RtecScheduler::INTERNAL));
+ // Returns the set of rt_infos, with their assigned priorities (as
+ // of the last schedule re-computation).
+
+ virtual void get_dependency_set (RtecScheduler::Dependency_Set_out dependencies
+ ACE_ENV_ARG_DECL)
+ ACE_THROW_SPEC ((CORBA::SystemException,
+ RtecScheduler::SYNCHRONIZATION_FAILURE,
+ RtecScheduler::INTERNAL));
+ // Returns the set of rt_infos, with their assigned priorities (as
+ // of the last schedule re-computation).
+
+ virtual void get_config_info_set (RtecScheduler::Config_Info_Set_out configs
+ ACE_ENV_ARG_DECL)
+ ACE_THROW_SPEC ((CORBA::SystemException,
+ RtecScheduler::SYNCHRONIZATION_FAILURE,
+ RtecScheduler::INTERNAL));
+ // Returns the set of config_infos, describing the appropriate
+ // number, types, and priority levels for the dispatching lanes.
+
+ virtual void dispatch_configuration (RtecScheduler::Preemption_Priority_t p_priority,
+ RtecScheduler::OS_Priority& o_priority,
+ RtecScheduler::Dispatching_Type_t & d_type
+ ACE_ENV_ARG_DECL)
+ ACE_THROW_SPEC ((CORBA::SystemException,
+ RtecScheduler::NOT_SCHEDULED,
+ RtecScheduler::UNKNOWN_PRIORITY_LEVEL));
+ // Provides the thread priority and queue type for the given priority level.
+
+ virtual RtecScheduler::Preemption_Priority_t last_scheduled_priority (ACE_ENV_SINGLE_ARG_DECL)
+ ACE_THROW_SPEC ((CORBA::SystemException,
+ RtecScheduler::NOT_SCHEDULED));
+ // Returns the last priority number assigned to an operation in the
+ // schedule. The number returned is one less than the total number
+ // of scheduled priorities. All scheduled priorities range from 0
+ // to the number returned, inclusive.
+
+ virtual void get_config_infos (RtecScheduler::Config_Info_Set_out configs
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS)
+ ACE_THROW_SPEC ((CORBA::SystemException,
+ RtecScheduler::NOT_SCHEDULED));
+
+private:
+ int config_count_;
+ // The number of elements in the config array.
+
+ ACE_Scheduler_Factory::POD_Config_Info* config_info_;
+ // The array of precomputed queue configuration structures.
+
+ int entry_count_;
+ // The number of elements in the RT_Info array.
+
+ ACE_Scheduler_Factory::POD_RT_Info* rt_info_;
+ // The array of precomputed RT_Info structures.
+};
+
+TAO_END_VERSIONED_NAMESPACE_DECL
+
+#include /**/ "ace/post.h"
+#endif /* ACE_RUNTIME_SCHEDULER_H */
diff --git a/TAO/orbsvcs/orbsvcs/SL3CSI.idl b/TAO/orbsvcs/orbsvcs/SL3CSI.idl
new file mode 100644
index 00000000000..3f6f3981d43
--- /dev/null
+++ b/TAO/orbsvcs/orbsvcs/SL3CSI.idl
@@ -0,0 +1,353 @@
+//tabstop=4
+//***********************************************************************
+// ORBAsec SL3
+// ----------------------------------------------------------------------
+// Copyright (C) 2001 Adiron, LLC.
+// All rights reserved.
+// ----------------------------------------------------------------------
+// $Id$
+//***********************************************************************
+#ifndef _SL3CSIArgs_IDL_
+#define _SL3CSIArgs_IDL_
+#include <SL3/SecurityLevel3.idl>
+#include <SL3/Trust.idl>
+#include <SL3/UserPassword.idl>
+#include <SL3/TransportSecurity.idl>
+#include <SL3/SL3AQArgs.idl>
+#include <SL3OMG/ATLAS.idl>
+#include <SL3/SL3Authorization.idl>
+#include <SL3/ATLASCache.idl>
+
+#pragma prefix "adiron.com"
+
+/**
+ * This module contains structures and a factory interface to
+ * create tagged argument lists that will be given to the
+ * args parameter of the SecurityLevel3::CredentialsCurator.
+ * <p>
+ * ORBAsec SL3 uses this kind of mechanism because it is the
+ * easiest way to represent optional arguments.
+ * <P>
+ * To alleviate the hassles of dealing with any's and creating
+ * them, there is a factory retrieved by ORB::resolve_initial_references
+ * using "SL3:ArgumentFactory". From this object one may create an
+ * acquisition argument builder. This approach takes most of the work
+ * out of forming the Credentials acquisition argument.
+ * The form of the arguments and their requiredness or optionality
+ * are defined by the specific acquisition mechanisms using them.
+ *
+ * The Credentials Acquired with these arguments handle the
+ * CORBA CSIv2 protocol.
+ */
+module SL3CSI {
+
+ /**
+ * There is currently only one acquisition method for
+ * CSI based Credentials.
+ */
+ const SecurityLevel3::AcquisitionMethod AQM_CSIArgs = "CSIArgs";
+
+ /**
+ * An object of this interface is created by the Argument Factory Object.
+ * It aids in creating the Credentials Acquisition Argument for
+ * CSI based Credentials.
+ */
+ local interface CSIArgBuilder : SL3AQArgs::GenericArgBuilder {
+
+ /**
+ * This operation explicitly disables caching of ATLAS tokens.
+ * This is used in the case where CSI credentials are needed
+ * in order to communicate with an external cache. If cacheing
+ * were enabled in this case, then there would be a cache for
+ * the cache, which gets recursively messy.
+ */
+ void addSetNoLocalCache();
+
+ /**
+ * This operation adds an already existing ATLASCache as an
+ * acquisition argument. This is used in the case where an
+ * externalized cache is to be used. If a cache is not
+ * explicitly added to the argument, then a new cache will
+ * be created by the Credentials Curator.
+ */
+ void addATLASCache(
+ in ATLASCache::AuthTokenCache cache
+ );
+
+ /**
+ * This operation places a user defined Password Generator
+ * in the acquisition argument.
+ */
+ void addUserPasswordCAGenerator(
+ in UserPassword::PasswordGenerator generator
+ );
+
+ /**
+ * This operation places a user defined Password Processor
+ * in the acquisition argument.
+ */
+ void addUserPasswordCAProcessor(
+ in UserPassword::PasswordProcessor processor
+ );
+
+ /**
+ * This operation causes the creation credentials that
+ * have a "quoted" principal. CSI Credentials of this
+ * type will assert the particular principal name to a server.
+ */
+ void addNamedQuotedPrincipal(
+ in SecurityLevel3::PrincipalName principal_name
+ );
+
+ /**
+ * This operation causes the creation credentials that
+ * have a "quoted" principal. CSI Credentials of this
+ * type will assert the particular identity to a server.
+ */
+ void addEncodedQuotedPrincipal(
+ in SecurityLevel3::IdentityStatement identity
+ );
+
+ /**
+ * This operation places a user defined Trust Decider in
+ * the acquisition argument.
+ */
+ void addLocalTrustInServerDecider(
+ in Trust::LocalTrustInServerDecider trust_decider
+ );
+
+ /**
+ * This operation causes CSI Credentials to be created
+ * over a particular transport as if you created the
+ * transport credentials using the
+ * TransportSecurity::CredentialsCurator and used the
+ * addUseTransportCredentials operation of this object.
+ */
+ void addTransportCredentialsAQArgs(
+ in TransportSecurity::MechanismId mechanism_id,
+ in TransportSecurity::AcquisitionMethod acquisition_method,
+ in any acquisition_arguments
+ );
+
+ /**
+ * This operation causes CSI Credentials to be created
+ * over a particular transport credentials that have
+ * already been created by using the
+ * TransportSecurity::CredentialsCurator.
+ */
+ void addUseTransportCredentials(
+ in TransportSecurity::OwnCredentials credentials
+ );
+
+ /**
+ * This operation adds an ATLAS to your CSI Credentials.
+ * ATLAS is the Authorization Token Layer Acquisition Service.
+ * Each ATLAS represents a specific Authorization context, and
+ * is used to give your clients the ability to "log" in, and
+ * present credentials (i.e. an Authorization Token) for which
+ * to work the requests. It also gives the ability for clients
+ * to cache the tokens, so performance will be better.
+ * <p>
+ * None of the arguments can be null.
+ * <p>
+ * The cache_id is the caching Id, according to the ATLAS
+ * specification which must be unique to this authorization
+ * context, amongst all other authorization contexts. If you
+ * do not have a cache id, then this argument should be an
+ * empty octet sequence.
+ * <P>
+ * The token_dispenser is the ATLAS AuthTokenDispenser interface.
+ * This cannot be a "local" object.
+ * <p>
+ * The supports_delegation_by_client and requires_delegation_by_client
+ * arguments tell the client the way in which it
+ * will use the ATLAS. This
+ * information gets put in the ATLAS Profile, which is put
+ * in the IOR of the objects associated with the credentials.
+ * <p>
+ * The token_processor is the "sister" to the ATLAS, as it
+ * understands the tokens that the ATLAS ships out to clients.
+ * It is specific to the Authorization context. It may be
+ * a local object, but also can make remote calls.
+ */
+ void addATLASObject(
+ in ATLAS::ATLASCacheId cache_id,
+ in ATLAS::AuthTokenDispenser token_dispenser,
+ in boolean supports_delegation_by_client,
+ in boolean requires_delegation_by_client,
+ in SL3Authorization::TokenProcessor token_processor
+ );
+
+ };
+
+ /**
+ * This interface is a factory for arguments that will
+ * be in use for ORBAsec credentials acquisition mechanisms.
+ * It is retrievable off the ORB at "SL3:ArgumentFactory"
+ */
+ local interface ArgumentFactory {
+
+ /**
+ * Creates a new CSI Argument Builder object with the specified
+ * Credentials usage.
+ */
+ CSIArgBuilder createCSIArgBuilder(
+ in SecurityLevel3::CredentialsUsage usage
+ );
+
+ /**
+ * This operation creates a Tagged Argument containing
+ * an flag that will disable the creation of the default
+ * ATLASCache.
+ *
+ * @see CSIArgBuilder
+ */
+ SL3AQArgs::Argument createSetNoLocalCache();
+
+ /**
+ * This operation creates a Tagged Argument containing
+ * an ATLASCache implementation to use for caching ATLAS
+ * tokens.
+ * <p>
+ * For a description of the arguments, please see the
+ * corresponding operation in the CSIArgBuilder.
+ *
+ * @see CSIArgBuilder
+ */
+ SL3AQArgs::Argument createATLASCache(
+ in ATLASCache::AuthTokenCache cache
+ );
+
+ /**
+ * This operation creates a Tagged Argument containing
+ * the following information for acquiring CSI credentials.
+ * <p>
+ * For a description of the arguments, please see the
+ * corresponding operation in the CSIArgBuilder.
+ *
+ * @see CSIArgBuilder
+ */
+ SL3AQArgs::Argument createUserPasswordCAGenerator(
+ in UserPassword::PasswordGenerator generator
+ );
+
+ /**
+ * This operation creates a Tagged Argument containing
+ * the following information for acquiring CSI credentials.
+ * <p>
+ * For a description of the arguments, please see the
+ * corresponding operation in the CSIArgBuilder.
+ *
+ * @see CSIArgBuilder
+ */
+ SL3AQArgs::Argument createUserPasswordCAProcessor(
+ in UserPassword::PasswordProcessor processor
+ );
+
+ /**
+ * This operation creates a Tagged Argument containing
+ * the following information for acquiring CSI credentials.
+ * <p>
+ * For a description of the arguments, please see the
+ * corresponding operation in the CSIArgBuilder.
+ *
+ * @see CSIArgBuilder
+ */
+ SL3AQArgs::Argument createKerberosCAGenerator(
+ );
+
+ /**
+ * This operation creates a Tagged Argument containing
+ * the following information for acquiring CSI credentials.
+ * <p>
+ * For a description of the arguments, please see the
+ * corresponding operation in the CSIArgBuilder.
+ *
+ * @see CSIArgBuilder
+ */
+ SL3AQArgs::Argument createKerberosCAProcessor(
+ );
+
+ /**
+ * This operation creates a Tagged Argument containing
+ * the following information for acquiring CSI credentials.
+ * <p>
+ * For a description of the arguments, please see the
+ * corresponding operation in the CSIArgBuilder.
+ *
+ * @see CSIArgBuilder
+ */
+ SL3AQArgs::Argument createNamedQuotedPrincipal(
+ in SecurityLevel3::PrincipalName prin_name
+ );
+
+ /**
+ * This operation creates a Tagged Argument containing
+ * the following information for acquiring CSI credentials.
+ * <p>
+ * For a description of the arguments, please see the
+ * corresponding operation in the CSIArgBuilder.
+ *
+ * @see CSIArgBuilder
+ */
+ SL3AQArgs::Argument createEncodedQuotedPrincipal(
+ in SecurityLevel3::IdentityStatement prin_name
+ );
+
+ /**
+ * This operation creates a Arg_TrustInServerDecider tagged
+ * argument.
+ */
+ SL3AQArgs::Argument createLocalTrustInServerDecider(
+ in Trust::LocalTrustInServerDecider trust_decider
+ );
+
+ /**
+ * This operation creates a Tagged Argument containing
+ * the following information for acquiring CSI credentials.
+ * <p>
+ * For a description of the arguments, please see the
+ * corresponding operation in the CSIArgBuilder.
+ *
+ * @see CSIArgBuilder
+ */
+ SL3AQArgs::Argument createTransportCredentialsAQArgs(
+ in TransportSecurity::MechanismId mechanism_id,
+ in TransportSecurity::AcquisitionMethod acquisition_method,
+ in any acquisition_arguments
+ );
+
+ /**
+ * This operation creates a Tagged Argument containing
+ * the following information for acquiring CSI credentials.
+ * <p>
+ * For a description of the arguments, please see the
+ * corresponding operation in the CSIArgBuilder.
+ *
+ * @see CSIArgBuilder
+ */
+ SL3AQArgs::Argument createUseTransportCredentials(
+ in TransportSecurity::OwnCredentials credentials
+ );
+
+ /**
+ * This operation creates a Tagged Argument containing
+ * the following information for acquiring CSI credentials.
+ * <p>
+ * For a description of the arguments, please see the
+ * corresponding operation in the CSIArgBuilder.
+ *
+ * @see CSIArgBuilder
+ */
+ SL3AQArgs::Argument createATLASObject(
+ in ATLAS::ATLASCacheId cache_id,
+ in ATLAS::AuthTokenDispenser token_dispenser,
+ in boolean supports_endorsement_by_client,
+ in boolean requires_endorsement_by_client,
+ in SL3Authorization::TokenProcessor token_processor
+ );
+
+ };
+
+};
+#endif
diff --git a/TAO/orbsvcs/orbsvcs/SL3TCPIP.idl b/TAO/orbsvcs/orbsvcs/SL3TCPIP.idl
new file mode 100644
index 00000000000..f6d2c1a5246
--- /dev/null
+++ b/TAO/orbsvcs/orbsvcs/SL3TCPIP.idl
@@ -0,0 +1,203 @@
+//tabstop=4
+//***********************************************************************
+// ORBAsec SL3
+// ----------------------------------------------------------------------
+// Copyright (C) 2001 Adiron, LLC.
+// All rights reserved.
+// ----------------------------------------------------------------------
+// $Id$
+//***********************************************************************
+#ifndef _SL3TCPIP_IDL_
+#define _SL3TCPIP_IDL_
+#include <orb.idl>
+#include <SL3/SecurityLevel3.idl>
+#include <SL3/TransportSecurity.idl>
+#include <SL3/SL3AQArgs.idl>
+
+#pragma prefix "adiron.com"
+
+module SL3TCPIP {
+
+ const TransportSecurity::MechanismId MID_TCPIP = "TCPIP";
+
+ /**
+ * This is the only acquisition mechanism for acquiring TCPIP
+ * Transport Credentials.
+ */
+ const TransportSecurity::AcquisitionMethod AQM_TCPIPArgs = "TCPIPArgs";
+
+ /**
+ * An object of this interface is created by the Argument Factory Object.
+ * It aids in creating the Credentials Acquisition Argument for
+ * TCPIP based Transport Credentials.
+ */
+ local interface TCPIPArgBuilder : SL3AQArgs::GenericArgBuilder {
+
+ /**
+ * This operation adds Transport Credentials CSIv1 protocol
+ * version capability.
+ * @param support If false, the associated transports will
+ * always be expected to carry CSIv2 information.
+ * Default is true.
+ * For CSIv2 capability without the ability to
+ * use these credentials for CSIv1 transports, this
+ * argument must be explicitly stated with a value
+ * of false.
+ */
+ void addSupportCSIv1(
+ in boolean support
+ );
+
+ /**
+ * This operation adds Transport Credentials CSIv2 protocol
+ * version capability.
+ * @param support If false, the associated transports will
+ * not, or be expected to carry CSIv2 information.
+ * If true, they must, if CSIv1 support is false.
+ * It's default value is false.
+ */
+ void addSupportCSIv2(
+ in boolean support
+ );
+
+ /**
+ * This operation adds Transport Credentials Initiator Options to
+ * the acquisition argument. This argument is only relevant when
+ * the Credentials Usage include Initiate.
+ *
+ * @param bind This argument contains the interface to which to bind.
+ * An empty string signifies to use the operating system
+ * default.
+ * @param low_port If this argument is 0, the system select the port.
+ * If this argument is not 0, then connections
+ * will attempt to bind to this port or higher.
+ * @param high_port If low_port is not 0, and this argument is greater
+ * than or equal to low_port, then the lowest
+ * available port within the range will be selected.
+ * @param timeout Timeout (in milliseconds) for connection establishment.
+ * The value 0 indicates an indefinite wait.
+ */
+ void addTCPIPInitiatorOptions(
+ in string bind, // Interface to bind the socket to.
+ // If empty, then system selects
+ in long low_port, // If 0 system selects
+ in long high_port, // Only if low_port != 0, high port >=low_port
+ // If equal, it binds to that port.
+ // If greater, it will try for ports within
+ // the range.
+ in long timeout // default timeout for connections.
+ );
+
+ /**
+ * This operation adds Transport Credentials Acceptor Options to
+ * the acquisition argument. This argument is only relevant when
+ * the Credentials Usage include Accept.
+ *
+ * @param hosts This operation contains a list of "hosts", or
+ * addresses that should be placed in the IOR of
+ * objects associated with these credentials.
+ * @param bind This argument contains the interface to which to
+ * bind. An empty string signifies to use the
+ * operating system default.
+ * @param low_port If this argument is 0, the system select the port.
+ * If this argument is not 0, then connections
+ * will attempt to bind to this port or higher.
+ * @param high_port If low_port is not 0, and this argument is greater
+ * than or equal to low_port, then the lowest
+ * available port within the range will be selected.
+ * @param backlog Socket Listening Backlog. 0 means use operating
+ * system default.
+ * @param numeric If this argument is true, all addresses associated
+ * with these credentials that are placed in IORs
+ * will be in numeric form.
+ */
+ void addTCPIPAcceptorOptions(
+ in CORBA::StringSeq hosts, // If empty, system select
+ in string bind, // if not empty, must be one of hosts.
+ in long low_port, // 0 means system select
+ in long high_port, // Only if low_port != 0;
+ in long backlog, // socket parameter
+ in boolean numeric // use numeric addresses inIORs?
+ );
+ };
+
+ /**
+ * This interface is used to create the TCPIP Argument Builder
+ */
+ local interface ArgumentFactory : SL3AQArgs::ArgumentFactory {
+
+ /**
+ * This operation creates a TCPIP Transport Security
+ * Credentials Acquisition Argument Builder.
+ */
+ TCPIPArgBuilder createTCPIPArgBuilder(
+ in TransportSecurity::CredentialsUsage usage
+ );
+
+ /**
+ * This operation creates a TaggedArgument containing
+ * the following information for acquiring transport
+ * credentials with CSIv1 capability turned off or on.
+ *
+ * @param support. If false, call GIOP requests traveling
+ * over these transports is expected to
+ * carry CSIv2 information.
+ */
+ SL3AQArgs::Argument createSupportCSIv1(
+ in boolean support
+ );
+
+ /**
+ * This operation creates a TaggedArgument containing
+ * the following information for acquiring transport
+ * credentials with CSIv2 capability turned off or on.
+ *
+ * @param support. If false, call GIOP requests traveling
+ * over these transports will not and is
+ * not expected to carry CSIv2 information.
+ */
+ SL3AQArgs::Argument createSupportCSIv2(
+ in boolean support
+ );
+
+ /**
+ * This operation creates a Tagged Argument containing
+ * the following information for acquiring TCPIP credentials.
+ * <p>
+ * For a description of the arguments, please see the
+ * corresponding operation in the TCPIPArgBuilder.
+ *
+ * @see TCPIPArgBuilder
+ */
+ SL3AQArgs::Argument createTCPIPInitiatorOptions(
+ in string bind, // Interface to bind the socket to.
+ // If empty, then system selects
+ in long low_port, // If 0 system selects
+ in long high_port, // Only if low_port != 0, high port >=low_port
+ // If equal, it binds to that port.
+ // If greater, it will try for ports within
+ // the range.
+ in long timeout // default timeout for connections.
+ );
+
+ /**
+ * This operation creates a Tagged Argument containing
+ * the following information for acquiring TCPIP credentials.
+ * <p>
+ * For a description of the arguments, please see the
+ * corresponding operation in the TCPIPArgBuilder.
+ *
+ * @see TCPIPArgBuilder
+ */
+ SL3AQArgs::Argument createTCPIPAcceptorOptions(
+ in CORBA::StringSeq hosts, // If empty, system select
+ in string bind, // if not empty, must be one of hosts.
+ in long low_port, // 0 means system select
+ in long high_port, // Only if low_port != 0;
+ in long backlog, // socket parameter
+ in boolean numeric // use numeric addresses inIORs?
+ );
+ };
+};
+
+#endif
diff --git a/TAO/orbsvcs/orbsvcs/SL3TLS.idl b/TAO/orbsvcs/orbsvcs/SL3TLS.idl
new file mode 100644
index 00000000000..c5701351e11
--- /dev/null
+++ b/TAO/orbsvcs/orbsvcs/SL3TLS.idl
@@ -0,0 +1,350 @@
+//tabstop=4
+//***********************************************************************
+// ORBAsec SL3
+// ----------------------------------------------------------------------
+// Copyright (C) 2001 Adiron, LLC.
+// All rights reserved.
+// ----------------------------------------------------------------------
+// $Id$
+//***********************************************************************
+#ifndef _SL3TLS_IDL_
+#define _SL3TLS_IDL_
+#include <orb.idl>
+#include <SL3/SecurityLevel3.idl>
+#include <SL3/TransportSecurity.idl>
+#include <SL3/SL3AQArgs.idl>
+#include <SL3/SL3TCPIP.idl>
+
+#pragma prefix "adiron.com"
+
+module SL3TLS {
+ const TransportSecurity::MechanismId MID_TLS = "TLS";
+
+ /**
+ * This is the only acquisition mechanism for acquiring TLS
+ * Transport Credentials.
+ */
+ const TransportSecurity::AcquisitionMethod AQM_TLSArgs = "TLSArgs";
+
+ /**
+ * Implementers may create their own local version of
+ * this interface to verify chains of X509 Certificates.
+ */
+ local interface TLSX509IdentityVerifier {
+
+ /**
+ * This operation is called by the security service at the
+ * TLS Transport Credentials creation phase to add certificates
+ * as trusted entities directed by other TLS options.
+ */
+ void add_trusted_authority(
+ in SecurityLevel3::X509IdentityStatement auth
+ );
+
+ /**
+ * This operation is called by the security service to determine
+ * if the peer is allowed to be anonymous. This means that the
+ * peer has not delivered a certificate and did not authenticate
+ * itself.
+ */
+ boolean is_anonymous_allowed();
+
+ /**
+ * This operation is called by the security service at the
+ * transport authentication phase, when the peer certificate
+ * needs to be verified. The X509IdentityStatement will contain
+ * a sequence of encoded X509 Certificates, which may be empty.
+ */
+ boolean verify(
+ in SecurityLevel3::X509IdentityStatement ident
+ );
+ };
+
+ /**
+ * The TLS KeyStore Acquisition Builder extends the TCPIP
+ * Builder. This is because the same TCPIP Acquisition Arguments
+ * apply to TLS, as TCPIP sits underneath TLS.
+ */
+ local interface TLSKeyStoreArgBuilder : SL3TCPIP::TCPIPArgBuilder {
+
+ /**
+ * This operation adds a X509 Certificate Chain Identity Verifier
+ * argument to the acquisition arguments.
+ *
+ * @param verifier The locally defined interface that will verify
+ * the certificate chain.
+ */
+ void addTLSX509IdentityVerifier(
+ in TLSX509IdentityVerifier verifier
+ );
+
+ /**
+ * This operation is used when there is a password on
+ * the keystore.
+ *
+ * @param keystore This argument contains the URL of the
+ * keystore.
+ * @param storetype This argument contains the type of the
+ * keystore. Currently, one of "IAIKKeyStore"
+ * or "jks".
+ * @param storepass This is the password that protects the
+ * key store.
+ * @param keyalias This argument contains the alias of a private
+ * key in the keystore. If this argument is
+ * an empty string, then the credentials will
+ * be considered anonymous.
+ * @param keypass This argument contains the password that
+ * unlocks the private key named by the keyalias.
+ * @param trusted_cert_names
+ * This argument contains the alias of certificates
+ * in the key store that are considered trusted
+ * to verify certificates of the peer during
+ * authentication. A empty string sequence signifies
+ * that the default chain verifier will accept
+ * chains ending in any trusted certificate
+ * entry found in the keystore.
+ * <p>
+ * Note: On the default TLSX509IdentityVerifier, anonymous
+ * communication is always allowed.
+ */
+ void addTLSKeyStoreWithStorePass(
+ in string keystore,
+ in string storetype,
+ in string storepass,
+ in string keyalias,
+ in string keypass,
+ in CORBA::StringSeq trusted_cert_names
+ );
+
+ /**
+ * This operation is used when there is no password on
+ * the keystore. This approach should only be used in
+ * cases where the integrity of the keystore is not an issue.
+ *
+ * @param keystore This argument contains the URL of the
+ * keystore.
+ * @param storetype This argument contains the type of the
+ * keystore. Currently, one of "IAIKKeyStore"
+ * or "jks".
+ * @param keyalias This argument contains the alias of a private
+ * key in the keystore. If this argument is
+ * an empty string, then the credentials will
+ * be considered anonymous.
+ * @param keypass This argument contains the password that
+ * unlocks the private key named by the keyalias.
+ * @param trusted_cert_names
+ * This argument contains the alias of certificates
+ * in the key store that are considered trusted
+ * to verify certificates of the peer during
+ * authentication. A empty string sequence signifies
+ * that the default chain verifier will accept
+ * chains ending in any trusted certificate
+ * entry found in the keystore.
+ * <p>
+ * Note: On the default TLSX509IdentityVerifier, anonymous
+ * communication is always allowed.
+ */
+ void addTLSKeyStoreNoStorePass(
+ in string keystore,
+ in string storetype,
+ in string keyalias,
+ in string keypass,
+ in CORBA::StringSeq trusted_cert_names
+ );
+
+ /**
+ * This operation is used when there is a password on
+ * the keystore.
+ *
+ * @param keystore This argument contains the octet
+ * sequence containing the keystore.
+ * @param storetype This argument contains the type of the
+ * keystore. Currently, one of "IAIKKeyStore"
+ * or "jks".
+ * @param storepass This is the password that protects the
+ * key store.
+ * @param keyalias This argument contains the alias of a private
+ * key in the keystore. If this argument is
+ * an empty string, then the credentials will
+ * be considered anonymous.
+ * @param keypass This argument contains the password that
+ * unlocks the private key named by the keyalias.
+ * @param trusted_cert_names
+ * This argument contains the alias of certificates
+ * in the key store that are considered trusted
+ * to verify certificates of the peer during
+ * authentication. A empty string sequence signifies
+ * that the default chain verifier will accept
+ * chains ending in any trusted certificate
+ * entry found in the keystore.
+ * <p>
+ * Note: On the default TLSX509IdentityVerifier, anonymous
+ * communication is always allowed.
+ */
+ void addTLSEncodedKeyStoreWithStorePass(
+ in CORBA::OctetSeq keystore,
+ in string storetype,
+ in string storepass,
+ in string keyalias,
+ in string keypass,
+ in CORBA::StringSeq trusted_cert_names
+ );
+
+ /**
+ * This operation is used when there is no password on
+ * the keystore. This approach should only be used in
+ * cases where the integrity of the keystore is not an issue.
+ *
+ * @param keystore This argument contains the octet
+ * sequence containing the keystore.
+ * @param storetype This argument contains the type of the
+ * keystore. Currently, one of "IAIKKeyStore"
+ * or "jks".
+ * @param keyalias This argument contains the alias of a private
+ * key in the keystore. If this argument is
+ * an empty string, then the credentials will
+ * be considered anonymous.
+ * @param keypass This argument contains the password that
+ * unlocks the private key named by the keyalias.
+ * @param trusted_cert_names
+ * This argument contains the alias of certificates
+ * in the key store that are considered trusted
+ * to verify certificates of the peer during
+ * authentication. A empty string sequence signifies
+ * that the default chain verifier will accept
+ * chains ending in any trusted certificate
+ * entry found in the keystore.
+ * <p>
+ * Note: On the default TLSX509IdentityVerifier, anonymous
+ * communication is always allowed.
+ */
+ void addTLSEncodedKeyStoreNoStorePass(
+ in CORBA::OctetSeq keystore,
+ in string storetype,
+ in string keyalias,
+ in string keypass,
+ in CORBA::StringSeq trusted_cert_names
+ );
+ };
+
+ /**
+ * This acquisition mechanism specifies getting TLS credential
+ * information from a Java KeyStore file. The Argument Factory
+ * and Builder inherit the TCPIP.
+ * The arguments used in TCPIP apply
+ * in setting up TCPIP sockets, because TCPIP lies
+ * below SSL/TLS.
+ * <p>
+ * If the TCPIPInitiatorOptions and/or TCPIPAcceptorOptions
+ * arguments are present, then they are followed, otherwise
+ * defaults for TCPIP are used.
+ * <p>
+ * The Arguments should have one of
+ * TLSKeyStoreWithStorePass or TLSKeyStoreNoStorePass. If
+ * neither of them is specified, the resulting Credentials will
+ * run in TLS anonymously.
+ *
+ */
+ const TransportSecurity::AcquisitionMethod
+ AQM_TLSKeyStoreArgs = "TLSKeyStoreArgs";
+
+ /**
+ * This object allows to create the Builder for use with TLS
+ * and a Java KeyStore.
+ */
+ local interface ArgumentFactory : SL3TCPIP::ArgumentFactory {
+
+ /**
+ * This operation creates a TLS KeyStore Arg Builder
+ * object.
+ */
+ TLSKeyStoreArgBuilder createTLSKeyStoreArgBuilder(
+ in TransportSecurity::CredentialsUsage usage
+ );
+
+ /**
+ * This operation creates a Tagged Argument containing
+ * a reference to a X509 Certificate Chain Verifier
+ */
+ SL3AQArgs::Argument createTLSX509IdentityVerifier(
+ in TLSX509IdentityVerifier verifier
+ );
+
+ /**
+ * This operation creates a Tagged Argument containing
+ * the following information for acquiring credentials
+ * from a Java KeyStore that is protected with a password.
+ * <p>
+ * For a description of the arguments, please see the
+ * corresponding operation in the TLSKeyStoreArgBuilder.
+ *
+ * @see TLSKeyStoreArgBuilder
+ */
+ SL3AQArgs::Argument createTLSKeyStoreWithStorePass(
+ in string keystore,
+ in string storetype,
+ in string storepass,
+ in string keyalias,
+ in string keypass,
+ in CORBA::StringSeq trusted_cert_names
+ );
+
+ /**
+ * This operation creates a Tagged Argument containing
+ * the following information for acquiring credentials
+ * from a Java KeyStore that may be protected with a password.
+ * <p>
+ * For a description of the arguments, please see the
+ * corresponding operation in the TLSKeyStoreArgBuilder.
+ *
+ * @see TLSKeyStoreArgBuilder
+ */
+ SL3AQArgs::Argument createTLSKeyStoreNoStorePass(
+ in string keystore,
+ in string storetype,
+ in string keyalias,
+ in string keypass,
+ in CORBA::StringSeq trusted_cert_names
+ );
+
+ /**
+ * This operation creates a Tagged Argument containing
+ * the following information for acquiring credentials
+ * from a Java KeyStore that is protected with a password.
+ * <p>
+ * For a description of the arguments, please see the
+ * corresponding operation in the TLSKeyStoreArgBuilder.
+ *
+ * @see TLSKeyStoreArgBuilder
+ */
+ SL3AQArgs::Argument createTLSEncodedKeyStoreWithStorePass(
+ in CORBA::OctetSeq keystore,
+ in string storetype,
+ in string storepass,
+ in string keyalias,
+ in string keypass,
+ in CORBA::StringSeq trusted_cert_names
+ );
+
+ /**
+ * This operation creates a Tagged Argument containing
+ * the following information for acquiring credentials
+ * from a Java KeyStore that may be protected with a password.
+ * <p>
+ * For a description of the arguments, please see the
+ * corresponding operation in the TLSKeyStoreArgBuilder.
+ *
+ * @see TLSKeyStoreArgBuilder
+ */
+ SL3AQArgs::Argument createTLSEncodedKeyStoreNoStorePass(
+ in CORBA::OctetSeq keystore,
+ in string storetype,
+ in string keyalias,
+ in string keypass,
+ in CORBA::StringSeq trusted_cert_names
+ );
+
+ };
+
+};
+#endif
diff --git a/TAO/orbsvcs/orbsvcs/SSLIOP.idl b/TAO/orbsvcs/orbsvcs/SSLIOP.idl
new file mode 100644
index 00000000000..ba4f9c406b6
--- /dev/null
+++ b/TAO/orbsvcs/orbsvcs/SSLIOP.idl
@@ -0,0 +1,98 @@
+// -*- IDL -*-
+//
+// $Id$
+
+// File: SSLIOP.idl
+// Part of the Security Service with additions from the Firewall
+// specification.
+
+#ifndef _SSLIOP_IDL
+#define _SSLIOP_IDL
+
+#include "tao/IOP.pidl"
+#include "Security.idl"
+// #include <Firewall.idl>
+
+#pragma prefix "omg.org"
+
+module SSLIOP {
+
+ /// Security mechanism SSL
+ const IOP::ComponentId TAG_SSL_SEC_TRANS = 20;
+
+ struct SSL {
+ Security::AssociationOptions target_supports;
+ Security::AssociationOptions target_requires;
+ unsigned short port;
+ };
+
+ // const Firewall::IdTag TAG_ID_SSL_CERT = xx; // OMG allocated
+
+ /// A DER encoded X.509 certificate.
+ typedef sequence<octet> ASN_1_Cert;
+
+ /// A chain of DER encoded X.509 certificates. The chain is actually
+ /// a sequence, according CORBA CDR encapsulation rules.
+ /// The sender's certificate is first, followed by any Certificate
+ /// Authority certificates proceeding sequentially upward.
+ typedef sequence<ASN_1_Cert> SSL_Cert;
+
+ /// The following are TAO extensions.
+# pragma prefix "ssliop.tao"
+ /// The SSLIOP::Current interface provides methods to gain access to
+ /// the SSL session state for the current execution context.
+ local interface Current : CORBA::Current {
+
+
+ /// Exception that indicates a SSLIOP::Current operation was
+ /// invoked outside of an SSL session.
+ exception NoContext {};
+
+ /// Return the peer certificate associated with the current
+ /// request.
+ ASN_1_Cert get_peer_certificate () raises (NoContext);
+
+ /// Return the certificate chain associated with the current
+ /// execution context. If no SSL session is being used for the
+ /// request or upcall, then the NoContext exception is raised.
+ /**
+ * On the client side, the chain does include the peer (server)
+ * certficate. However, the certificate chain on the server side
+ * does NOT contain the peer (client) certificate.
+ */
+ SSL_Cert get_peer_certificate_chain () raises (NoContext);
+
+ /// Returns true if the current execution context is not within a
+ /// SSL session. This method is mostly useful as an inexpensive
+ /// means of determining whether or not SSL session state is
+ /// available.
+ boolean no_context ();
+ };
+
+ enum FileType {
+ ASN1,
+ PEM
+ };
+
+ struct File {
+ FileType type;
+ string filename;
+ string password; // Only needed for encrypted PEM files.
+ };
+
+ /// The AuthData structure is the SSLIOP-specific authentication
+ /// data that will be passed to the
+ /// SecurityLevel2::PrincipalAuthenticator::authenticate() method.
+ /// Note that this TAO-specific.
+ struct AuthData {
+ File certificate;
+ File key;
+ };
+
+# pragma prefix "omg.org"
+
+};
+
+#pragma prefix ""
+
+#endif /* _SSLIOP_IDL */
diff --git a/TAO/orbsvcs/orbsvcs/SSLIOP.mpc b/TAO/orbsvcs/orbsvcs/SSLIOP.mpc
new file mode 100644
index 00000000000..4485f068c26
--- /dev/null
+++ b/TAO/orbsvcs/orbsvcs/SSLIOP.mpc
@@ -0,0 +1,29 @@
+// -*- MPC -*-
+//
+// $Id$
+
+project(SSLIOP) : orbsvcslib, core, security, ssl, pi_server, interceptors, tao_versioning_idl_defaults {
+ sharedname = TAO_SSLIOP
+ idlflags += -Wb,export_macro=TAO_SSLIOP_Export -Wb,export_include=orbsvcs/SSLIOP/SSLIOP_Export.h -SS
+ dynamicflags = TAO_SSLIOP_BUILD_DLL
+ tagchecks += SSLIOP
+ pch_header =
+ pch_source =
+
+ IDL_Files {
+ SSLIOP.idl
+ }
+
+ Source_Files(ORBSVCS_COMPONENTS) {
+ SSLIOP {
+ SSLIOP
+ }
+ }
+
+ IDL_Files {
+ idlflags += -Sci -Gp -Gd -Ge 1 -Sc -Sa -Sorb \
+ -o SSLIOP
+ idlflags -= -St
+ SSLIOP/ssl_endpoints.pidl
+ }
+}
diff --git a/TAO/orbsvcs/orbsvcs/SSLIOP.rc b/TAO/orbsvcs/orbsvcs/SSLIOP.rc
new file mode 100644
index 00000000000..861b6bf944a
--- /dev/null
+++ b/TAO/orbsvcs/orbsvcs/SSLIOP.rc
@@ -0,0 +1,30 @@
+#include "..\..\tao\Version.h"
+
+1 VERSIONINFO
+ FILEVERSION TAO_MAJOR_VERSION,TAO_MINOR_VERSION,TAO_BETA_VERSION,0
+ PRODUCTVERSION TAO_MAJOR_VERSION,TAO_MINOR_VERSION,TAO_BETA_VERSION,0
+ FILEFLAGSMASK 0x3fL
+ FILEFLAGS 0x0L
+ FILEOS 0x4L
+ FILETYPE 0x1L
+ FILESUBTYPE 0x0L
+BEGIN
+ BLOCK "StringFileInfo"
+ BEGIN
+ BLOCK "040904B0"
+ BEGIN
+ VALUE "FileDescription", "SSLIOP\0"
+ VALUE "FileVersion", TAO_VERSION "\0"
+ VALUE "InternalName", "TAO_SSLIOPDLL\0"
+ VALUE "LegalCopyright", "\0"
+ VALUE "LegalTrademarks", "\0"
+ VALUE "OriginalFilename", "TAO_SSLIOP.DLL\0"
+ VALUE "ProductName", "ORBSVCS\0"
+ VALUE "ProductVersion", TAO_VERSION "\0"
+ END
+ END
+ BLOCK "VarFileInfo"
+ BEGIN
+ VALUE "Translation", 0x409, 1200
+ END
+END
diff --git a/TAO/orbsvcs/orbsvcs/SSLIOP/IIOP_SSL_Acceptor.cpp b/TAO/orbsvcs/orbsvcs/SSLIOP/IIOP_SSL_Acceptor.cpp
new file mode 100644
index 00000000000..89bea659c76
--- /dev/null
+++ b/TAO/orbsvcs/orbsvcs/SSLIOP/IIOP_SSL_Acceptor.cpp
@@ -0,0 +1,39 @@
+#include "orbsvcs/SSLIOP/IIOP_SSL_Acceptor.h"
+
+#include "tao/ORB_Core.h"
+#include "tao/debug.h"
+
+
+ACE_RCSID (SSLIOP,
+ IIOP_SSL_Acceptor,
+ "$Id$")
+
+TAO_BEGIN_VERSIONED_NAMESPACE_DECL
+
+TAO::IIOP_SSL_Acceptor::IIOP_SSL_Acceptor (CORBA::Boolean flag)
+ : TAO_IIOP_Acceptor (flag),
+ base_acceptor_ (),
+ creation_strategy_ (0),
+ concurrency_strategy_ (0),
+ accept_strategy_ (0)
+{
+}
+
+TAO::IIOP_SSL_Acceptor::~IIOP_SSL_Acceptor (void)
+{
+ // Make sure we are closed before we start destroying the
+ // strategies.
+ this->close ();
+
+ delete this->creation_strategy_;
+ delete this->concurrency_strategy_;
+ delete this->accept_strategy_;
+}
+
+int
+TAO::IIOP_SSL_Acceptor::close (void)
+{
+ return this->base_acceptor_.close ();
+}
+
+TAO_END_VERSIONED_NAMESPACE_DECL
diff --git a/TAO/orbsvcs/orbsvcs/SSLIOP/IIOP_SSL_Acceptor.h b/TAO/orbsvcs/orbsvcs/SSLIOP/IIOP_SSL_Acceptor.h
new file mode 100644
index 00000000000..951e2ab73be
--- /dev/null
+++ b/TAO/orbsvcs/orbsvcs/SSLIOP/IIOP_SSL_Acceptor.h
@@ -0,0 +1,86 @@
+// -*- C++ -*-
+
+//=============================================================================
+/**
+ * @file IIOP_SSL_Acceptor.h
+ *
+ * $Id$
+ *
+ * SSL-aware IIOP specific acceptor processing
+ *
+ * @author Ossama Othman <ossama@dre.vanderbilt.edu>
+ */
+//=============================================================================
+
+
+#ifndef TAO_IIOP_SSL_ACCEPTOR_H
+#define TAO_IIOP_SSL_ACCEPTOR_H
+
+#include /**/ "ace/pre.h"
+
+#include "orbsvcs/SSLIOP/IIOP_SSL_Connection_Handler.h"
+
+#if !defined (ACE_LACKS_PRAGMA_ONCE)
+# pragma once
+#endif /* ACE_LACKS_PRAGMA_ONCE */
+
+#include "tao/IIOP_Acceptor.h"
+
+TAO_BEGIN_VERSIONED_NAMESPACE_DECL
+
+namespace TAO
+{
+
+ /**
+ * @class IIOP_SSL_Acceptor
+ *
+ * @brief An SSL aware IIOP acceptor.
+ *
+ * The class differs from the non-SSL aware TAO_IIOP_Acceptor class
+ * since it uses a different a set of Acceptor strategies. In
+ * particular, it overrides the open_i() method to use the Acceptor
+ * strategies tailored to use the SSL aware server connection handler.
+ * See the TAO_IIOP_SSL_Connection_Handler notes for details.
+ */
+ class IIOP_SSL_Acceptor : public TAO_IIOP_Acceptor
+ {
+ public:
+
+ typedef ACE_Strategy_Acceptor<IIOP_SSL_Connection_Handler, ACE_SOCK_ACCEPTOR> TAO_IIOP_SSL_BASE_ACCEPTOR;
+ typedef TAO_Creation_Strategy<IIOP_SSL_Connection_Handler> TAO_IIOP_SSL_CREATION_STRATEGY;
+ typedef TAO_Concurrency_Strategy<IIOP_SSL_Connection_Handler> TAO_IIOP_SSL_CONCURRENCY_STRATEGY;
+ typedef TAO_Accept_Strategy<IIOP_SSL_Connection_Handler, ACE_SOCK_ACCEPTOR> TAO_IIOP_SSL_ACCEPT_STRATEGY;
+
+ /// Constructor.
+ IIOP_SSL_Acceptor (CORBA::Boolean flag = 0);
+
+ /// Destructor.
+ ~IIOP_SSL_Acceptor (void);
+
+ virtual int close (void);
+
+ private:
+
+ /// The concrete acceptor, as a pointer to it's base class.
+ TAO_IIOP_SSL_BASE_ACCEPTOR base_acceptor_;
+
+ /**
+ * @name Acceptor Strategies
+ *
+ * Server side creation, concurrency and accept strategies.
+ */
+ //@{
+ TAO_IIOP_SSL_CREATION_STRATEGY *creation_strategy_;
+ TAO_IIOP_SSL_CONCURRENCY_STRATEGY *concurrency_strategy_;
+ TAO_IIOP_SSL_ACCEPT_STRATEGY *accept_strategy_;
+ //@}
+
+ };
+
+} // End TAO namespace.
+
+TAO_END_VERSIONED_NAMESPACE_DECL
+
+#include /**/ "ace/post.h"
+
+#endif /* TAO_IIOP_SSL_ACCEPTOR_H */
diff --git a/TAO/orbsvcs/orbsvcs/SSLIOP/IIOP_SSL_Connection_Handler.cpp b/TAO/orbsvcs/orbsvcs/SSLIOP/IIOP_SSL_Connection_Handler.cpp
new file mode 100644
index 00000000000..fb9a61ba32b
--- /dev/null
+++ b/TAO/orbsvcs/orbsvcs/SSLIOP/IIOP_SSL_Connection_Handler.cpp
@@ -0,0 +1,90 @@
+#include "orbsvcs/SSLIOP/IIOP_SSL_Connection_Handler.h"
+#include "orbsvcs/SSLIOP/IIOP_SSL_Transport.h"
+#include "orbsvcs/SSLIOP/SSLIOP_Connection_Handler.h"
+#include "tao/Timeprobe.h"
+#include "tao/ORB_Core.h"
+#include "tao/ORB.h"
+#include "tao/debug.h"
+
+
+ACE_RCSID (SSLIOP,
+ IIOP_SSL_Connection_Handler,
+ "$Id$")
+
+
+#if !defined (__ACE_INLINE__)
+#include "orbsvcs/SSLIOP/IIOP_SSL_Connection_Handler.inl"
+#endif /* __ACE_INLINE__ */
+
+#if defined (ACE_ENABLE_TIMEPROBES)
+
+static const char * const TAO_IIOP_SSL_Connect_Timeprobe_Description[] =
+{
+ "IIOP_SSL_Connection_Handler::handle_input - start",
+ "IIOP_SSL_Connection_Handler::handle_input - end",
+
+ "IIOP_SSL_Connection_Handler::handle_locate - start",
+ "IIOP_SSL_Connection_Handler::handle_locate - end",
+
+ "IIOP_SSL_Connection_Handler::receive_request - end",
+
+ "IIOP_SSL_Connection_Handler::send_request - start",
+ "IIOP_SSL_Connection_Handler::send_request - end"};
+
+enum
+{
+ // Timeprobe description table start key
+ TAO_IIOP_SSL_CONNECTION_HANDLER_HANDLE_INPUT_START = 320,
+ TAO_IIOP_SSL_CONNECTION_HANDLER_HANDLE_INPUT_END,
+
+ TAO_IIOP_SSL_CONNECTION_HANDLER_HANDLE_LOCATE_START,
+ TAO_IIOP_SSL_CONNECTION_HANDLER_HANDLE_LOCATE_END,
+
+ TAO_IIOP_SSL_CONNECTION_HANDLER_RECEIVE_REQUEST_END
+
+};
+
+// Setup Timeprobes
+ACE_TIMEPROBE_EVENT_DESCRIPTIONS (TAO_IIOP_SSL_Connect_Timeprobe_Description,
+ TAO_IIOP_SSL_CONNECTION_HANDLER_HANDLE_INPUT_START);
+
+#endif /* ACE_ENABLE_TIMEPROBES */
+
+TAO_BEGIN_VERSIONED_NAMESPACE_DECL
+
+TAO::IIOP_SSL_Connection_Handler::IIOP_SSL_Connection_Handler (
+ ACE_Thread_Manager *t)
+ : TAO_IIOP_Connection_Handler (t)
+{
+ // This constructor should *never* get called, it is just here to
+ // make the compiler happy: the default implementation of the
+ // Creation_Strategy requires a constructor with that signature, we
+ // don't use that implementation, but some (most?) compilers
+ // instantiate it anyway.
+ ACE_ASSERT (0);
+}
+
+
+TAO::IIOP_SSL_Connection_Handler::IIOP_SSL_Connection_Handler (
+ TAO_ORB_Core *orb_core,
+ CORBA::Boolean /* flag */)
+ : TAO_IIOP_Connection_Handler (orb_core, 0)
+{
+ // Delete the transport with TAO_IIOP_Connection_Handler.
+ delete this->transport ();
+
+ IIOP_SSL_Transport* specific_transport = 0;
+ ACE_NEW (specific_transport,
+ IIOP_SSL_Transport (this,
+ orb_core,
+ 0));
+
+ // store this pointer
+ this->transport (specific_transport);
+}
+
+TAO::IIOP_SSL_Connection_Handler::~IIOP_SSL_Connection_Handler (void)
+{
+}
+
+TAO_END_VERSIONED_NAMESPACE_DECL
diff --git a/TAO/orbsvcs/orbsvcs/SSLIOP/IIOP_SSL_Connection_Handler.h b/TAO/orbsvcs/orbsvcs/SSLIOP/IIOP_SSL_Connection_Handler.h
new file mode 100644
index 00000000000..3c81122ede9
--- /dev/null
+++ b/TAO/orbsvcs/orbsvcs/SSLIOP/IIOP_SSL_Connection_Handler.h
@@ -0,0 +1,122 @@
+// -*- C++ -*-
+
+//=============================================================================
+/**
+ * @file IIOP_SSL_Connection_Handler.h
+ *
+ * $Id$
+ *
+ * @author Ossama Othman <ossama@dre.vanderbilt.edu>
+ */
+//=============================================================================
+
+
+#ifndef TAO_IIOP_SSL_CONNECTION_HANDLER_H
+#define TAO_IIOP_SSL_CONNECTION_HANDLER_H
+
+#include /**/ "ace/pre.h"
+
+#include "orbsvcs/SSLIOP/SSLIOP_Export.h"
+
+#if !defined (ACE_LACKS_PRAGMA_ONCE)
+#pragma once
+#endif /* ACE_LACKS_PRAGMA_ONCE */
+
+#include "orbsvcs/SSLIOP/SSLIOP_Current.h"
+
+#include "orbsvcs/SSLIOPC.h"
+#include "tao/IIOP_Connection_Handler.h"
+
+TAO_BEGIN_VERSIONED_NAMESPACE_DECL
+
+namespace TAO
+{
+
+ /**
+ * @class IIOP_SSL_Connection_Handler
+ *
+ * @brief
+ * IIOP connection handler designed to be "SSL aware," i.e. it is
+ * aware of the existence of the SSLIOP connection handler. It
+ * makes sure that SSL session state from a previous connection is
+ * not associated with the non-SSL connection handled by this
+ * handler.
+ *
+ * This class is just a place holder to create the
+ * TAO_IIOP_SSL_Transport which does the work of clearing the TSS
+ * SSL state.
+ */
+ class IIOP_SSL_Connection_Handler : public TAO_IIOP_Connection_Handler
+ {
+ public:
+
+ /// Constructor.
+ IIOP_SSL_Connection_Handler (ACE_Thread_Manager* t = 0);
+ IIOP_SSL_Connection_Handler (TAO_ORB_Core *orb_core,
+ CORBA::Boolean flag);
+
+ /// Destructor.
+ ~IIOP_SSL_Connection_Handler (void);
+
+ };
+
+ // ****************************************************************
+
+ /**
+ * @class Null_SSL_State_Guard
+ *
+ * @brief
+ * This class sets up null TSS SSL state upon instantiation, and
+ * restores the previous TSS SSL state when that instance goes out
+ * of scope.
+ *
+ * This guard is used to make TSS SSL state configuration and
+ * deconfiguration during an upcall exception safe. Exceptions are
+ * not supposed to be propagated up to the scope this guard is used
+ * in, so this guard may be unnecessary. However, since proper TSS
+ * SSL state configuration/deconfiguration is critical to proper
+ * security support, this guard is used to ensure that
+ * configuration/deconfiguration is exception safe.
+ */
+ class Null_SSL_State_Guard
+ {
+ public:
+
+ /// Constructor that sets up the null TSS SSL state.
+ Null_SSL_State_Guard (TAO::SSLIOP::Current_ptr current,
+ int &result);
+
+ /// Destructor that restores the previous TSS SSL state.
+ ~Null_SSL_State_Guard (void);
+
+ private:
+
+ /// The SSLIOP::Current implementation that was previously
+ /// associated with the current thread and invocation.
+ /**
+ * It is stored here until the invocation completes, after which
+ * it placed back into TSS.
+ */
+ TAO::SSLIOP::Current_Impl *previous_current_impl_;
+
+ /// Reference to the SSLIOP::Current object.
+ TAO::SSLIOP::Current_ptr current_;
+
+ /// Flag that specifies whether or not setup of the SSLIOP::Current
+ /// object completed for the current thread and invocation.
+ bool setup_done_;
+
+ };
+
+} // End TAO namespace.
+
+TAO_END_VERSIONED_NAMESPACE_DECL
+
+#if defined (__ACE_INLINE__)
+#include "orbsvcs/SSLIOP/IIOP_SSL_Connection_Handler.inl"
+#endif /* __ACE_INLINE__ */
+
+
+#include /**/ "ace/post.h"
+
+#endif /* TAO_IIOP_SSL_CONNECTION_HANDLER_H */
diff --git a/TAO/orbsvcs/orbsvcs/SSLIOP/IIOP_SSL_Connection_Handler.inl b/TAO/orbsvcs/orbsvcs/SSLIOP/IIOP_SSL_Connection_Handler.inl
new file mode 100644
index 00000000000..7a0b3d4b320
--- /dev/null
+++ b/TAO/orbsvcs/orbsvcs/SSLIOP/IIOP_SSL_Connection_Handler.inl
@@ -0,0 +1,33 @@
+// -*- C++ -*-
+//
+// $Id$
+
+TAO_BEGIN_VERSIONED_NAMESPACE_DECL
+
+ACE_INLINE
+TAO::Null_SSL_State_Guard::Null_SSL_State_Guard (
+ TAO::SSLIOP::Current_ptr current,
+ int &result)
+ : previous_current_impl_ (0),
+ current_ (current), // No need to duplicate
+ setup_done_ (false)
+{
+ // Invalidate the TSS SSL session state to make sure that SSL state
+ // from a previous SSL connection is not confused with this non-SSL
+ // connection.
+ current->setup (this->previous_current_impl_,
+ 0, // Null SSL state
+ this->setup_done_);
+
+ result = 0;
+}
+
+ACE_INLINE
+TAO::Null_SSL_State_Guard::~Null_SSL_State_Guard (void)
+{
+ // Restore the previous TSS SSL state.
+ this->current_->teardown (this->previous_current_impl_,
+ this->setup_done_);
+}
+
+TAO_END_VERSIONED_NAMESPACE_DECL
diff --git a/TAO/orbsvcs/orbsvcs/SSLIOP/IIOP_SSL_Connector.cpp b/TAO/orbsvcs/orbsvcs/SSLIOP/IIOP_SSL_Connector.cpp
new file mode 100644
index 00000000000..51a3db9a486
--- /dev/null
+++ b/TAO/orbsvcs/orbsvcs/SSLIOP/IIOP_SSL_Connector.cpp
@@ -0,0 +1,288 @@
+#include "orbsvcs/SSLIOP/IIOP_SSL_Connector.h"
+
+#include "tao/debug.h"
+#include "tao/ORB_Core.h"
+#include "tao/Environment.h"
+#include "tao/IIOP_Endpoint.h"
+#include "tao/Transport_Cache_Manager.h"
+#include "tao/Thread_Lane_Resources.h"
+#include "tao/Connect_Strategy.h"
+#include "tao/Wait_Strategy.h"
+#include "tao/Profile_Transport_Resolver.h"
+#include "tao/Transport.h"
+
+#include "ace/Strategies_T.h"
+
+
+ACE_RCSID (SSLIOP,
+ IIOP_SSL_Connector,
+ "$Id$")
+
+TAO_BEGIN_VERSIONED_NAMESPACE_DECL
+
+TAO::IIOP_SSL_Connector::IIOP_SSL_Connector (CORBA::Boolean flag)
+ : TAO_IIOP_Connector (flag),
+ connect_strategy_ (),
+ base_connector_ ()
+{
+}
+
+TAO::IIOP_SSL_Connector::~IIOP_SSL_Connector (void)
+{
+}
+
+int
+TAO::IIOP_SSL_Connector::open (TAO_ORB_Core *orb_core)
+{
+ this->orb_core (orb_core);
+
+ // Create our connect strategy
+ if (this->create_connect_strategy () == -1)
+ return -1;
+
+ // Our connect creation strategy
+ CONNECT_CREATION_STRATEGY *connect_creation_strategy = 0;
+
+ ACE_NEW_RETURN (connect_creation_strategy,
+ CONNECT_CREATION_STRATEGY (orb_core->thr_mgr (),
+ orb_core,
+ this->lite_flag_),
+ -1);
+
+ // Our activation strategy
+ CONNECT_CONCURRENCY_STRATEGY *concurrency_strategy = 0;
+
+ ACE_NEW_RETURN (concurrency_strategy,
+ CONNECT_CONCURRENCY_STRATEGY (orb_core),
+ -1);
+
+
+ return this->base_connector_.open (this->orb_core ()->reactor (),
+ connect_creation_strategy,
+ &this->connect_strategy_,
+ concurrency_strategy);
+}
+
+int
+TAO::IIOP_SSL_Connector::close (void)
+{
+ delete this->base_connector_.creation_strategy ();
+ delete this->base_connector_.concurrency_strategy ();
+ return this->base_connector_.close ();
+}
+
+int
+TAO::IIOP_SSL_Connector::set_validate_endpoint (TAO_Endpoint *endpoint)
+{
+ if (endpoint->tag () != IOP::TAG_INTERNET_IOP)
+ return -1;
+
+ TAO_IIOP_Endpoint *iiop_endpoint =
+ dynamic_cast<TAO_IIOP_Endpoint *> (endpoint);
+
+ if (iiop_endpoint == 0)
+ return -1;
+
+ const ACE_INET_Addr &remote_address =
+ iiop_endpoint->object_addr ();
+
+ // Verify that the remote ACE_INET_Addr was initialized properly.
+ // Failure can occur if hostname lookup failed when initializing the
+ // remote ACE_INET_Addr.
+ if (remote_address.get_type () != AF_INET)
+ {
+ if (TAO_debug_level > 0)
+ {
+ ACE_DEBUG ((LM_DEBUG,
+ ACE_TEXT ("TAO (%P|%t) IIOP_SSL connection failed.\n")
+ ACE_TEXT ("TAO (%P|%t) This is most likely ")
+ ACE_TEXT ("due to a hostname lookup ")
+ ACE_TEXT ("failure.\n")));
+ }
+
+ return -1;
+ }
+
+ return 0;
+}
+
+TAO_Transport *
+TAO::IIOP_SSL_Connector::make_connection (
+ TAO::Profile_Transport_Resolver *r,
+ TAO_Transport_Descriptor_Interface &desc,
+ ACE_Time_Value *max_wait_time)
+{
+ TAO_IIOP_Endpoint *iiop_endpoint =
+ dynamic_cast<TAO_IIOP_Endpoint *> (desc.endpoint ());
+
+ if (iiop_endpoint == 0)
+ return 0;
+
+ const ACE_INET_Addr &remote_address =
+ iiop_endpoint->object_addr ();
+
+ if (TAO_debug_level > 4)
+ ACE_DEBUG ((LM_DEBUG,
+ ACE_TEXT ("(%P|%t) IIOP_SSL_Connector::connect ")
+ ACE_TEXT ("making a new connection \n")));
+
+ // Get the right synch options
+ ACE_Synch_Options synch_options;
+
+ this->active_connect_strategy_->synch_options (max_wait_time,
+ synch_options);
+
+ // If we don't need to block for a transport just set the timeout to
+ // be zero.
+ ACE_Time_Value tmp_zero (ACE_Time_Value::zero);
+ if (!r->blocked_connect ())
+ {
+ synch_options.timeout (ACE_Time_Value::zero);
+ max_wait_time = &tmp_zero;
+ }
+
+
+ IIOP_SSL_Connection_Handler *svc_handler = 0;
+
+ // Connect.
+ int result =
+ this->base_connector_.connect (svc_handler,
+ remote_address,
+ synch_options);
+
+ // The connect() method creates the service handler and bumps the
+ // #REFCOUNT# up one extra. There are three possibilities from
+ // calling connect(): (a) connection succeeds immediately - in this
+ // case, the #REFCOUNT# on the handler is two; (b) connection
+ // completion is pending - in this case, the #REFCOUNT# on the
+ // handler is also two; (c) connection fails immediately - in this
+ // case, the #REFCOUNT# on the handler is one since close() gets
+ // called on the handler.
+ //
+ // The extra reference count in
+ // TAO_Connect_Creation_Strategy::make_svc_handler() is needed in
+ // the case when connection completion is pending and we are going
+ // to wait on a variable in the handler to changes, signifying
+ // success or failure. Note, that this increment cannot be done
+ // once the connect() returns since this might be too late if
+ // another thread pick up the completion and potentially deletes the
+ // handler before we get a chance to increment the reference count.
+
+ // Make sure that we always do a remove_reference
+ ACE_Event_Handler_var svc_handler_auto_ptr (svc_handler);
+
+ TAO_Transport *transport =
+ svc_handler->transport ();
+
+ if (result == -1)
+ {
+ // No immediate result, wait for completion
+ if (errno == EWOULDBLOCK)
+ {
+ // Try to wait until connection completion. Incase we block, then we
+ // get a connected transport or not. In case of non block we get
+ // a connected or not connected transport
+ if (!this->wait_for_connection_completion (r,
+ transport,
+ max_wait_time))
+ {
+ if (TAO_debug_level > 2)
+ ACE_ERROR ((LM_ERROR, "TAO (%P|%t) - IIOP_SSL_Connector::"
+ "make_connection, "
+ "wait for completion failed\n"));
+ }
+ }
+ else
+ {
+ // Transport is not usable
+ transport = 0;
+ }
+ }
+
+ // In case of errors transport is zero
+ if (transport == 0)
+ {
+ // Give users a clue to the problem.
+ if (TAO_debug_level)
+ {
+ ACE_DEBUG ((LM_ERROR,
+ "TAO (%P|%t) - IIOP_SSL_Connector::make_connection, "
+ "connection to <%s:%d> failed (%p)\n",
+ iiop_endpoint->host (), iiop_endpoint->port (),
+ "errno"));
+ }
+
+ return 0;
+ }
+
+ // At this point, the connection has be successfully connected.
+ // #REFCOUNT# is one.
+ if (TAO_debug_level > 2)
+ ACE_DEBUG ((LM_DEBUG,
+ "TAO (%P|%t) - IIOP_SSL_Connector::make_connection, "
+ "new connection to <%s:%d> on Transport[%d]\n",
+ iiop_endpoint->host (), iiop_endpoint->port (),
+ svc_handler->peer ().get_handle ()));
+
+ // Add the handler to Cache
+ int retval =
+ this->orb_core ()->lane_resources ().transport_cache ().cache_transport (
+ &desc,
+ transport);
+
+ // Failure in adding to cache.
+ if (retval != 0)
+ {
+ // Close the handler.
+ svc_handler->close ();
+
+ if (TAO_debug_level > 0)
+ {
+ ACE_ERROR ((LM_ERROR,
+ "TAO (%P|%t) - IIOP_SSL_Connector::make_connection, "
+ "could not add the new connection to cache\n"));
+ }
+
+ return 0;
+ }
+
+ if (transport->is_connected () &&
+ transport->wait_strategy ()->register_handler () != 0)
+ {
+ // Registration failures.
+
+ // Purge from the connection cache, if we are not in the cache, this
+ // just does nothing.
+ (void) transport->purge_entry ();
+
+ // Close the handler.
+ (void) transport->close_connection ();
+
+ if (TAO_debug_level > 0)
+ ACE_ERROR ((LM_ERROR,
+ "TAO (%P|%t) - IIOP_SSL_Connector [%d]::make_connection, "
+ "could not register the transport "
+ "in the reactor.\n",
+ transport->id ()));
+
+ return 0;
+ }
+
+ return transport;
+}
+
+int
+TAO::IIOP_SSL_Connector::cancel_svc_handler (
+ TAO_Connection_Handler * svc_handler)
+{
+ IIOP_SSL_Connection_Handler* handler=
+ dynamic_cast<IIOP_SSL_Connection_Handler*> (svc_handler);
+
+ if (handler)
+ // Cancel from the connector
+ return this->base_connector_.cancel (handler);
+
+ return -1;
+}
+
+TAO_END_VERSIONED_NAMESPACE_DECL
diff --git a/TAO/orbsvcs/orbsvcs/SSLIOP/IIOP_SSL_Connector.h b/TAO/orbsvcs/orbsvcs/SSLIOP/IIOP_SSL_Connector.h
new file mode 100644
index 00000000000..b051fa19cae
--- /dev/null
+++ b/TAO/orbsvcs/orbsvcs/SSLIOP/IIOP_SSL_Connector.h
@@ -0,0 +1,104 @@
+// -*- C++ -*-
+
+//=============================================================================
+/**
+ * @file IIOP_SSL_Connector.h
+ *
+ * $Id$
+ *
+ * IIOP specific connector processing -- SSL aware version
+ *
+ * @author Ossama Othman <ossama@uci.edu>
+ */
+//=============================================================================
+
+
+#ifndef TAO_IIOP_SSL_CONNECTOR_H
+#define TAO_IIOP_SSL_CONNECTOR_H
+
+#include /**/ "ace/pre.h"
+
+#include "orbsvcs/SSLIOP/IIOP_SSL_Connection_Handler.h"
+
+#if !defined (ACE_LACKS_PRAGMA_ONCE)
+# pragma once
+#endif /* ACE_LACKS_PRAGMA_ONCE */
+
+#include "tao/IIOP_Connector.h"
+
+TAO_BEGIN_VERSIONED_NAMESPACE_DECL
+
+namespace TAO
+{
+ /**
+ * @class IIOP_SSL_Connector
+ *
+ * @brief IIOP-specific Connector (SSL aware) bridge for pluggable
+ * protocols.
+ *
+ * Concrete instance of the TAO_Connector class. Responsible
+ * for establishing a connection with a server and is called from the
+ * Connector_Registry.
+ */
+ class IIOP_SSL_Connector : public TAO_IIOP_Connector
+ {
+ public:
+
+ /// Constructor.
+ IIOP_SSL_Connector (CORBA::Boolean flag = 0);
+
+ /// Destructor.
+ ~IIOP_SSL_Connector (void);
+
+ int open (TAO_ORB_Core *orb_core);
+ int close (void);
+
+ public:
+
+ typedef TAO_Connect_Concurrency_Strategy<IIOP_SSL_Connection_Handler>
+ CONNECT_CONCURRENCY_STRATEGY;
+
+ typedef TAO_Connect_Creation_Strategy<IIOP_SSL_Connection_Handler>
+ CONNECT_CREATION_STRATEGY;
+
+ typedef ACE_Connect_Strategy<IIOP_SSL_Connection_Handler,
+ ACE_SOCK_CONNECTOR>
+ CONNECT_STRATEGY ;
+
+ typedef ACE_Strategy_Connector<IIOP_SSL_Connection_Handler,
+ ACE_SOCK_CONNECTOR>
+ BASE_CONNECTOR;
+
+ protected:
+
+ /**
+ * @name The TAO_Connector Methods
+ *
+ * Check the documentation in tao/Transport_Connector.h for details.
+ */
+ //@{
+ int set_validate_endpoint (TAO_Endpoint *ep);
+
+ TAO_Transport *make_connection (TAO::Profile_Transport_Resolver *r,
+ TAO_Transport_Descriptor_Interface &desc,
+ ACE_Time_Value *timeout = 0);
+
+ virtual int cancel_svc_handler (TAO_Connection_Handler * svc_handler);
+ //@}
+
+ private:
+
+ /// Our connect strategy
+ CONNECT_STRATEGY connect_strategy_;
+
+ /// The connector initiating connection requests for IIOP_SSL.
+ BASE_CONNECTOR base_connector_;
+ };
+
+} // End TAO namespace.
+
+TAO_END_VERSIONED_NAMESPACE_DECL
+
+#include /**/ "ace/post.h"
+
+#endif /* TAO_IIOP_SSL_CONNECTOR_H */
diff --git a/TAO/orbsvcs/orbsvcs/SSLIOP/IIOP_SSL_Transport.cpp b/TAO/orbsvcs/orbsvcs/SSLIOP/IIOP_SSL_Transport.cpp
new file mode 100644
index 00000000000..1a5d1724a2e
--- /dev/null
+++ b/TAO/orbsvcs/orbsvcs/SSLIOP/IIOP_SSL_Transport.cpp
@@ -0,0 +1,54 @@
+#include "orbsvcs/SSLIOP/IIOP_SSL_Transport.h"
+#include "orbsvcs/SSLIOP/IIOP_SSL_Connection_Handler.h"
+#include "orbsvcs/SSLIOP/SSLIOP_Util.h"
+
+#include "tao/ORB_Core.h"
+#include "tao/ORB.h"
+#include "tao/Timeprobe.h"
+#include "tao/debug.h"
+
+
+ACE_RCSID (SSLIOP,
+ IIOP_SSL_Transport,
+ "$Id$")
+
+TAO_BEGIN_VERSIONED_NAMESPACE_DECL
+
+TAO::IIOP_SSL_Transport::IIOP_SSL_Transport (
+ IIOP_SSL_Connection_Handler *handler,
+ TAO_ORB_Core *orb_core,
+ CORBA::Boolean flag)
+ : TAO_IIOP_Transport (handler,
+ orb_core,
+ flag)
+{
+ this->current_ =
+ TAO::SSLIOP::Util::current (orb_core);
+}
+
+TAO::IIOP_SSL_Transport::~IIOP_SSL_Transport (void)
+{
+}
+
+int
+TAO::IIOP_SSL_Transport::handle_input (TAO_Resume_Handle &rh,
+ ACE_Time_Value *max_wait_time,
+ int block)
+{
+ int result = 0;
+
+ // Invalidate the TSS SSL session state to make sure that SSL state
+ // from a previous SSL connection is not confused with this non-SSL
+ // connection.
+ TAO::Null_SSL_State_Guard guard (this->current_.in (), result);
+
+ if (result != 0)
+ return -1;
+
+ return
+ this->TAO_IIOP_Transport::handle_input (rh,
+ max_wait_time,
+ block);
+}
+
+TAO_END_VERSIONED_NAMESPACE_DECL
diff --git a/TAO/orbsvcs/orbsvcs/SSLIOP/IIOP_SSL_Transport.h b/TAO/orbsvcs/orbsvcs/SSLIOP/IIOP_SSL_Transport.h
new file mode 100644
index 00000000000..a6c1aa7ea0f
--- /dev/null
+++ b/TAO/orbsvcs/orbsvcs/SSLIOP/IIOP_SSL_Transport.h
@@ -0,0 +1,90 @@
+// -*- C++ -*-
+
+//=============================================================================
+/**
+ * @file IIOP_SSL_Transport.h
+ *
+ * $Id$
+ *
+ * @author Ossama Othman <ossama@uci.edu>
+ */
+//=============================================================================
+
+
+#ifndef TAO_IIOP_SSL_TRANSPORT_H
+#define TAO_IIOP_SSL_TRANSPORT_H
+
+#include /**/ "ace/pre.h"
+
+#include "orbsvcs/SSLIOP/SSLIOP_Current.h"
+
+#if !defined (ACE_LACKS_PRAGMA_ONCE)
+#pragma once
+#endif /* ACE_LACKS_PRAGMA_ONCE */
+
+#include "tao/IIOP_Transport.h"
+
+TAO_BEGIN_VERSIONED_NAMESPACE_DECL
+
+class TAO_ORB_Core;
+class TAO_Resume_Handle;
+
+namespace TAO
+{
+ class IIOP_SSL_Connection_Handler;
+
+ /**
+ * @class IIOP_SSL_Transport
+ *
+ * @brief
+ * IIOP Transport designed to be "SSL aware," i.e. it is
+ * aware of the existence of the SSLIOP Transport. It makes
+ * sure that SSL session state from a previous connection is not
+ * associated with the non-SSL connection handled by this handler.
+ *
+ * However, this class overrides the handle_input() method to
+ * invalidate the current TSS SSL state during a standard IIOP
+ * (insecure) upcall. This prevents SSL session state from a
+ * previous SSL connection from being associated with non-SSL
+ * connections processed by this connection handler. In particular,
+ * this is very important for closing a security hole in nested
+ * upcalls. For example, an SSLIOP request is made. During that
+ * secure upcall, an insecure nested upcall is made. A naive
+ * implementation would associate the TSS SSL state from the secure
+ * upcall with the insecure upcall. This implementation closes that
+ * security hole.
+ */
+ class IIOP_SSL_Transport : public TAO_IIOP_Transport
+ {
+ public:
+ /// Constructor.
+ IIOP_SSL_Transport (IIOP_SSL_Connection_Handler *handler,
+ TAO_ORB_Core *orb_core,
+ CORBA::Boolean flag = 0);
+
+ /// Default destructor.
+ ~IIOP_SSL_Transport (void);
+
+ /** @name Overridden Template Methods
+ *
+ * Please check the documentation in "tao/Transport.h" for more
+ * details.
+ */
+ virtual int handle_input (TAO_Resume_Handle &rh,
+ ACE_Time_Value *max_wait_time = 0,
+ int block = 0);
+
+ protected:
+
+ /// Reference to the TAO::SSLIOP::Current object.
+ TAO::SSLIOP::Current_var current_;
+
+ };
+
+} // End TAO namespace.
+
+TAO_END_VERSIONED_NAMESPACE_DECL
+
+#include /**/ "ace/post.h"
+
+#endif /* TAO_IIOP_SSL_TRANSPORT_H */
diff --git a/TAO/orbsvcs/orbsvcs/SSLIOP/SSLIOP_Accept_Strategy.cpp b/TAO/orbsvcs/orbsvcs/SSLIOP/SSLIOP_Accept_Strategy.cpp
new file mode 100644
index 00000000000..5de9b828787
--- /dev/null
+++ b/TAO/orbsvcs/orbsvcs/SSLIOP/SSLIOP_Accept_Strategy.cpp
@@ -0,0 +1,66 @@
+#include "orbsvcs/SSLIOP/SSLIOP_Accept_Strategy.h"
+
+
+ACE_RCSID (SSLIOP,
+ SSLIOP_Accept_Strategy,
+ "$Id$")
+
+TAO_BEGIN_VERSIONED_NAMESPACE_DECL
+
+TAO::SSLIOP::Accept_Strategy::Accept_Strategy (
+ TAO_ORB_Core * orb_core,
+ const ACE_Time_Value & timeout)
+ : TAO_Accept_Strategy<TAO::SSLIOP::Connection_Handler,
+ ACE_SSL_SOCK_ACCEPTOR> (orb_core),
+ timeout_ (timeout)
+{
+}
+
+int
+TAO::SSLIOP::Accept_Strategy::accept_svc_handler (handler_type * svc_handler)
+{
+ ACE_TRACE ("TAO::SSLIOP::Accept_Strategy::accept_svc_handler");
+
+ // The following code is basically the same code found in
+ // ACE_Accept_Strategy::accept_svc_handler(). The only difference
+ // is that a timeout value is passed to the peer acceptor's accept()
+ // method. A timeout is necessary to prevent malicious or
+ // misbehaved clients from only completing the TCP handshake and not
+ // the SSL handshake. Without the timeout, a denial-of-service
+ // vulnerability would exist where multiple incomplete SSL passive
+ // connections (i.e. where only the TCP handshake is completed)
+ // could result in the server process running out of file
+ // descriptors. That would be due to the SSL handshaking process
+ // blocking/waiting for the handshake to complete.
+
+ // The timeout value will be modified. Make a copy.
+ ACE_Time_Value timeout (this->timeout_);
+
+ // Try to find out if the implementation of the reactor that we are
+ // using requires us to reset the event association for the newly
+ // created handle. This is because the newly created handle will
+ // inherit the properties of the listen handle, including its event
+ // associations.
+ const int reset_new_handle = this->reactor_->uses_event_associations ();
+
+ if (this->peer_acceptor_.accept (svc_handler->peer (), // stream
+ 0, // remote address
+ &timeout, // timeout
+ 1, // restart
+ reset_new_handle // reset new handler
+ ) == -1)
+ {
+ // Ensure that errno is preserved in case the svc_handler
+ // close() method resets it.
+ ACE_Errno_Guard error (errno);
+
+ // Close down handler to avoid memory leaks.
+ svc_handler->close (0);
+
+ return -1;
+ }
+ else
+ return 0;
+}
+
+TAO_END_VERSIONED_NAMESPACE_DECL
diff --git a/TAO/orbsvcs/orbsvcs/SSLIOP/SSLIOP_Accept_Strategy.h b/TAO/orbsvcs/orbsvcs/SSLIOP/SSLIOP_Accept_Strategy.h
new file mode 100644
index 00000000000..0ce82cca857
--- /dev/null
+++ b/TAO/orbsvcs/orbsvcs/SSLIOP/SSLIOP_Accept_Strategy.h
@@ -0,0 +1,98 @@
+// -*- C++ -*-
+
+//=============================================================================
+/**
+ * @file SSLIOP_Accept_Strategy.h
+ *
+ * $Id$
+ *
+ * IIOP/SSL specific accept strategy
+ *
+ * @author Ossama Othman <ossama@dre.vanderbilt.edu>
+ */
+//=============================================================================
+
+
+#ifndef TAO_SSLIOP_ACCEPT_STRATEGY_H
+#define TAO_SSLIOP_ACCEPT_STRATEGY_H
+
+#include /**/ "ace/pre.h"
+
+#include "ace/config-all.h"
+
+#if !defined (ACE_LACKS_PRAGMA_ONCE)
+# pragma once
+#endif /* ACE_LACKS_PRAGMA_ONCE */
+
+#include "orbsvcs/SSLIOP/SSLIOP_Connection_Handler.h"
+
+#include "tao/Acceptor_Impl.h"
+
+#include "ace/SSL/SSL_SOCK_Acceptor.h"
+
+TAO_BEGIN_VERSIONED_NAMESPACE_DECL
+
+namespace TAO
+{
+ namespace SSLIOP
+ {
+
+ /**
+ * @class Accept_Strategy
+ *
+ * @brief SSLIOP-specific accept strategy that builds on the
+ * TAO_Accept_Strategy implementation.
+ *
+ * This accept strategy builds on on the TAO_Accept_Strategy
+ * implementation. It sub-classes that class, and overrides the
+ * accept_svc_handler() method so that a timeout value may be
+ * passed to the underlying peer acceptor. This is necessary to
+ * defend against a simple Denial-of-Service attack.
+ * @par
+ * Since SSL requires two handshakes, one TCP and one SSL, it is
+ * possible for a malicious client to establish a TCP connection
+ * to the SSL port, and never complete the SSL handshake. The
+ * underlying SSL passive connection code would block/hang waiting
+ * for the SSL handshake to complete. Given enough incomplete
+ * connections where only the TCP handshake is completed, a server
+ * process could potentially run out of available file
+ * descriptors, thus preventing legitimate client connections from
+ * being established.
+ * @par.
+ * The timeout defense alluded to above bounds the time this sort of
+ * DoS attack lasts.
+ */
+ class Accept_Strategy
+ : public TAO_Accept_Strategy<TAO::SSLIOP::Connection_Handler,
+ ACE_SSL_SOCK_ACCEPTOR>
+ {
+ public:
+
+ /// Constructor.
+ Accept_Strategy (TAO_ORB_Core * orb_core,
+ const ACE_Time_Value & timeout);
+
+ /// Overridden method that forces a passive connection timeout value
+ /// to be passed to the underlying acceptor.
+ virtual int accept_svc_handler (handler_type * svc_handler);
+
+ private:
+
+ /// The accept() timeout.
+ /**
+ * This timeout includes the overall time to complete the SSL
+ * handshake. This includes both the TCP handshake and the SSL
+ * handshake.
+ */
+ const ACE_Time_Value timeout_;
+
+ };
+
+ } // End SSLIOP namespace
+} // End TAO namespace
+
+TAO_END_VERSIONED_NAMESPACE_DECL
+
+#include /**/ "ace/post.h"
+
+#endif /* TAO_SSLIOP_ACCEPT_STRATEGY_H */
diff --git a/TAO/orbsvcs/orbsvcs/SSLIOP/SSLIOP_Acceptor.cpp b/TAO/orbsvcs/orbsvcs/SSLIOP/SSLIOP_Acceptor.cpp
new file mode 100644
index 00000000000..41428c0a1ed
--- /dev/null
+++ b/TAO/orbsvcs/orbsvcs/SSLIOP/SSLIOP_Acceptor.cpp
@@ -0,0 +1,684 @@
+#include "orbsvcs/SSLIOP/SSLIOP_Acceptor.h"
+#include "orbsvcs/SSLIOP/SSLIOP_Profile.h"
+
+#include "tao/MProfile.h"
+#include "tao/ORB_Core.h"
+#include "tao/Server_Strategy_Factory.h"
+#include "tao/Codeset_Manager.h"
+#include "tao/CDR.h"
+#include "tao/debug.h"
+
+#if !defined(__ACE_INLINE__)
+#include "orbsvcs/SSLIOP/SSLIOP_Acceptor.i"
+#endif /* __ACE_INLINE__ */
+
+
+ACE_RCSID (SSLIOP,
+ SSLIOP_Acceptor,
+ "$Id$")
+
+TAO_BEGIN_VERSIONED_NAMESPACE_DECL
+
+TAO::SSLIOP::Acceptor::Acceptor (::Security::QOP qop,
+ const ACE_Time_Value & timeout)
+ : TAO::IIOP_SSL_Acceptor (),
+ ssl_acceptor_ (),
+ creation_strategy_ (0),
+ concurrency_strategy_ (0),
+ accept_strategy_ (0),
+ timeout_ (timeout)
+{
+ // --- CSIv1 ---
+
+ // Clear all bits in the SSLIOP::SSL association option fields.
+ this->ssl_component_.target_supports = 0;
+ this->ssl_component_.target_requires = 0;
+
+ // SSLIOP requires these Security::AssociationOptions by default.
+ ACE_SET_BITS (this->ssl_component_.target_requires,
+ ::Security::Integrity
+ | ::Security::Confidentiality
+ | ::Security::NoDelegation);
+
+ // SSLIOP supports these Security::AssociationOptions by default.
+ ACE_SET_BITS (this->ssl_component_.target_supports,
+ ::Security::Integrity
+ | ::Security::Confidentiality
+ | ::Security::EstablishTrustInTarget
+ | ::Security::NoDelegation);
+
+ // Initialize the default SSL port to zero (wild card port).
+ this->ssl_component_.port = 0;
+
+ // @@ This should go away once we support setting security
+ // association options through policies.
+ if (qop == ::Security::SecQOPNoProtection)
+ ACE_SET_BITS (this->ssl_component_.target_supports,
+ ::Security::NoProtection);
+
+
+ // --- CSIv2 ---
+
+ // Clear all bits in the CSIIOP::TLS_SEC_TRANS association option
+ // fields.
+ this->csiv2_component_.target_supports = 0;
+ this->csiv2_component_.target_requires = 0;
+
+ // SSLIOP requires these CSIIOP::AssociationOptions by default.
+ ACE_SET_BITS (this->csiv2_component_.target_requires,
+ CSIIOP::Integrity
+ | CSIIOP::Confidentiality
+ | CSIIOP::NoDelegation);
+
+ // SSLIOP supports these CSIIOP::AssociationOptions by default.
+ ACE_SET_BITS (this->csiv2_component_.target_supports,
+ CSIIOP::Integrity
+ | CSIIOP::Confidentiality
+ | CSIIOP::EstablishTrustInTarget
+ | CSIIOP::NoDelegation);
+
+ // @@ This should go away once we support setting security
+ // association options through policies.
+ if (qop == CSIIOP::NoProtection)
+ ACE_SET_BITS (this->csiv2_component_.target_supports,
+ CSIIOP::NoProtection);
+}
+
+TAO::SSLIOP::Acceptor::~Acceptor (void)
+{
+ // Make sure we are closed before we start destroying the
+ // strategies.
+ this->close ();
+
+ delete this->creation_strategy_;
+ delete this->concurrency_strategy_;
+ delete this->accept_strategy_;
+}
+
+int
+TAO::SSLIOP::Acceptor::create_profile (const TAO::ObjectKey &object_key,
+ TAO_MProfile &mprofile,
+ CORBA::Short priority)
+{
+ // Sanity check.
+ if (this->endpoint_count_ == 0)
+ return -1;
+
+ // Check if multiple endpoints should be put in one profile or
+ // if they should be spread across multiple profiles.
+ if (priority == TAO_INVALID_PRIORITY)
+ return this->create_new_profile (object_key,
+ mprofile,
+ priority);
+ else
+ return this->create_shared_profile (object_key,
+ mprofile,
+ priority);
+}
+
+int
+TAO::SSLIOP::Acceptor::create_new_profile (const TAO::ObjectKey &object_key,
+ TAO_MProfile &mprofile,
+ CORBA::Short priority)
+{
+ // Adding this->endpoint_count_ to the TAO_MProfile.
+ const int count = mprofile.profile_count ();
+ if ((mprofile.size () - count) < this->endpoint_count_
+ && mprofile.grow (count + this->endpoint_count_) == -1)
+ return -1;
+
+ // Create a profile for each acceptor endpoint.
+ for (size_t i = 0; i < this->endpoint_count_; ++i)
+ {
+ TAO_SSLIOP_Profile *pfile = 0;
+
+ // @@ We need to create an SSLIOP::SSL component for the object
+ // we're creating an MProfile for. This will allow us to
+ // properly embed secure invocation policies in the generated
+ // IOR, i.e. secure invocation policies on a per-object
+ // basis, rather than on a per-endpoint basis. If no secure
+ // invocation policies have been set then we should use the
+ // below default SSLIOP::SSL component.
+ ACE_NEW_RETURN (pfile,
+ TAO_SSLIOP_Profile (this->hosts_[i],
+ this->addrs_[i].get_port_number (),
+ object_key,
+ this->addrs_[i],
+ this->version_,
+ this->orb_core_,
+ &(this->ssl_component_)),
+ -1);
+ pfile->endpoint ()->priority (priority);
+
+ if (mprofile.give_profile (pfile) == -1)
+ {
+ pfile->_decr_refcnt ();
+ pfile = 0;
+ return -1;
+ }
+
+ if (this->orb_core_->orb_params ()->std_profile_components () == 0)
+ continue;
+
+ pfile->tagged_components ().set_orb_type (TAO_ORB_TYPE);
+
+ TAO_Codeset_Manager *csm = this->orb_core_->codeset_manager();
+ if (csm)
+ csm->set_codeset (pfile->tagged_components());
+
+ IOP::TaggedComponent component;
+ component.tag = ::SSLIOP::TAG_SSL_SEC_TRANS;
+
+ // @@???? Check this code, only intended as guideline...
+ TAO_OutputCDR cdr;
+ cdr << TAO_OutputCDR::from_boolean (TAO_ENCAP_BYTE_ORDER);
+
+ // @@ We need to create an SSLIOP::SSL component for the object
+ // we're creating an MProfile for. This will allow us to
+ // properly embed secure invocation policies in the generated
+ // IOR, i.e. secure invocation policies on a per-object
+ // basis, rather than on a per-endpoint basis. If no secure
+ // invocation policies have been set then we should use the
+ // below default SSLIOP::SSL component.
+ cdr << this->ssl_component_;
+
+ // TAO extension, replace the contents of the octet sequence with
+ // the CDR stream
+ const CORBA::ULong length = cdr.total_length ();
+ component.component_data.length (length);
+ CORBA::Octet *buf = component.component_data.get_buffer ();
+ for (const ACE_Message_Block *i = cdr.begin ();
+ i != 0;
+ i = i->cont ())
+ {
+ ACE_OS::memcpy (buf, i->rd_ptr (), i->length ());
+ buf += i->length ();
+ }
+
+ pfile->tagged_components ().set_component (component);
+ }
+
+ return 0;
+}
+
+
+int
+TAO::SSLIOP::Acceptor::create_shared_profile (const TAO::ObjectKey &object_key,
+ TAO_MProfile &mprofile,
+ CORBA::Short priority)
+{
+ size_t index = 0;
+ TAO_Profile *pfile = 0;
+ TAO_SSLIOP_Profile *ssliop_profile = 0;
+
+ // First see if <mprofile> already contains a SSLIOP profile.
+ for (TAO_PHandle i = 0; i != mprofile.profile_count (); ++i)
+ {
+ pfile = mprofile.get_profile (i);
+ if (pfile->tag () == IOP::TAG_INTERNET_IOP)
+ {
+ ssliop_profile = dynamic_cast<TAO_SSLIOP_Profile *> (pfile);
+ if (ssliop_profile == 0)
+ return -1;
+ break;
+ }
+ }
+
+ // If <mprofile> doesn't contain SSLIOP_Profile, we need to create
+ // one.
+ if (ssliop_profile == 0)
+ {
+ // @@ We need to create an SSLIOP::SSL component for the object
+ // we're creating an MProfile for. This will allow us to
+ // properly embed secure invocation policies in the generated
+ // IOR, i.e. secure invocation policies on a per-object
+ // basis, rather than on a per-endpoint basis. If no secure
+ // invocation policies have been set then we should use the
+ // below default SSLIOP::SSL component.
+ ACE_NEW_RETURN (ssliop_profile,
+ TAO_SSLIOP_Profile (this->hosts_[0],
+ this->addrs_[0].get_port_number (),
+ object_key,
+ this->addrs_[0],
+ this->version_,
+ this->orb_core_,
+ &(this->ssl_component_)),
+ -1);
+
+ TAO_SSLIOP_Endpoint *ssliop_endp =
+ dynamic_cast<TAO_SSLIOP_Endpoint *> (ssliop_profile->endpoint ());
+
+ ssliop_endp->priority (priority);
+ ssliop_endp->iiop_endpoint ()->priority (priority);
+
+ if (mprofile.give_profile (ssliop_profile) == -1)
+ {
+ ssliop_profile->_decr_refcnt ();
+ ssliop_profile = 0;
+ return -1;
+ }
+
+ if (this->orb_core_->orb_params ()->std_profile_components () != 0)
+ {
+ ssliop_profile->tagged_components ().set_orb_type (TAO_ORB_TYPE);
+
+ TAO_Codeset_Manager *csm = this->orb_core_->codeset_manager();
+ if (csm)
+ csm->set_codeset(ssliop_profile->tagged_components());
+
+ IOP::TaggedComponent component;
+ component.tag = ::SSLIOP::TAG_SSL_SEC_TRANS;
+ // @@???? Check this code, only intended as guideline...
+ TAO_OutputCDR cdr;
+ cdr << TAO_OutputCDR::from_boolean (TAO_ENCAP_BYTE_ORDER);
+
+ // @@ We need to create an SSLIOP::SSL component for the
+ // object we're creating an MProfile for. This will
+ // allow us to properly embed secure invocation policies
+ // in the generated IOR, i.e. secure invocation policies
+ // on a per-object basis, rather than on a per-endpoint
+ // basis. If no secure invocation policies have been set
+ // then we should use the below default SSLIOP::SSL
+ // component.
+ cdr << this->ssl_component_;
+
+ // TAO extension, replace the contents of the octet sequence with
+ // the CDR stream
+ CORBA::ULong length = cdr.total_length ();
+ component.component_data.length (length);
+ CORBA::Octet *buf = component.component_data.get_buffer ();
+ for (const ACE_Message_Block *i = cdr.begin ();
+ i != 0;
+ i = i->cont ())
+ {
+ ACE_OS::memcpy (buf, i->rd_ptr (), i->length ());
+ buf += i->length ();
+ }
+
+ ssliop_profile->tagged_components ().set_component (component);
+ }
+
+ index = 1;
+ }
+
+ // Add any remaining endpoints to the SSLIOP_Profile.
+ for (;
+ index < this->endpoint_count_;
+ ++index)
+ {
+ TAO_SSLIOP_Endpoint *ssl_endp = 0;
+ TAO_IIOP_Endpoint *iiop_endp = 0;
+ ACE_NEW_RETURN (iiop_endp,
+ TAO_IIOP_Endpoint (this->hosts_[index],
+ this->addrs_[index].get_port_number (),
+ this->addrs_[index]),
+ -1);
+ iiop_endp->priority (priority);
+
+ ACE_NEW_RETURN (ssl_endp,
+ TAO_SSLIOP_Endpoint (&(this->ssl_component_),
+ iiop_endp),
+ -1);
+
+ ssl_endp->priority (priority);
+ ssliop_profile->add_endpoint (ssl_endp);
+ }
+
+ return 0;
+}
+
+int
+TAO::SSLIOP::Acceptor::is_collocated (const TAO_Endpoint *endpoint)
+{
+ const TAO_SSLIOP_Endpoint *endp =
+ dynamic_cast<const TAO_SSLIOP_Endpoint *> (endpoint);
+
+ // Make sure the dynamically cast pointer is valid.
+ if (endp == 0)
+ return 0;
+
+ for (size_t i = 0; i < this->endpoint_count_; ++i)
+ {
+ // @@ TODO The following code looks funky, why only the address
+ // is compared? What about the IIOP address? Why force a
+ // DNS lookup every time an SSLIOP object is decoded:
+ //
+ // http://deuce.doc.wustl.edu/bugzilla/show_bug.cgi?id=1220
+ //
+ if (endp->iiop_endpoint ()->object_addr () == this->addrs_[i])
+ return 1; // Collocated
+ }
+
+ return 0; // Not collocated
+}
+
+int
+TAO::SSLIOP::Acceptor::close (void)
+{
+ int r = this->ssl_acceptor_.close ();
+ if (this->IIOP_SSL_Acceptor::close () != 0)
+ r = -1;
+
+ return r;
+}
+
+int
+TAO::SSLIOP::Acceptor::open (TAO_ORB_Core *orb_core,
+ ACE_Reactor *reactor,
+ int major,
+ int minor,
+ const char *address,
+ const char *options)
+{
+ // Ensure that neither the endpoint configuration nor the ORB
+ // configuration violate security measures.
+ if (this->verify_secure_configuration (orb_core,
+ major,
+ minor) != 0)
+ return -1;
+
+ ACE_INET_Addr addr;
+ ACE_CString specified_hostname;
+ if (this->parse_address (address, addr, specified_hostname) == -1)
+ return -1;
+
+ // Open the non-SSL enabled endpoints, then open the SSL enabled
+ // endpoints.
+ if (this->IIOP_SSL_Acceptor::open (orb_core,
+ reactor,
+ major,
+ minor,
+ address,
+ options) != 0)
+ return -1;
+
+ // The SSL port is set in the parse_options() method. All we have
+ // to do is call open_i()
+ addr.set_port_number (this->ssl_component_.port);
+
+ return this->ssliop_open_i (orb_core,
+ addr,
+ reactor);
+}
+
+int
+TAO::SSLIOP::Acceptor::open_default (TAO_ORB_Core *orb_core,
+ ACE_Reactor *reactor,
+ int major,
+ int minor,
+ const char *options)
+{
+ // Ensure that neither the endpoint configuration nor the ORB
+ // configuration violate security measures.
+ if (this->verify_secure_configuration (orb_core,
+ major,
+ minor) != 0)
+ return -1;
+
+ // Open the non-SSL enabled endpoints, then open the SSL enabled
+ // endpoints.
+ if (this->IIOP_SSL_Acceptor::open_default (orb_core,
+ reactor,
+ major,
+ minor,
+ options) == -1)
+ return -1;
+
+ // Now that each network interface's hostname has been cached, open
+ // an endpoint on each network interface using the INADDR_ANY
+ // address.
+ ACE_INET_Addr addr;
+
+ // this->ssl_component_.port is initialized to zero or it is set in
+ // this->parse_options().
+ if (addr.set (this->ssl_component_.port,
+ static_cast<ACE_UINT32> (INADDR_ANY),
+ 1) != 0)
+ return -1;
+
+ return this->ssliop_open_i (orb_core,
+ addr,
+ reactor);
+}
+
+int
+TAO::SSLIOP::Acceptor::ssliop_open_i (TAO_ORB_Core *orb_core,
+ const ACE_INET_Addr& addr,
+ ACE_Reactor *reactor)
+{
+ this->orb_core_ = orb_core;
+
+ // Explicitly disable GIOPlite support since it introduces security
+ // holes.
+ static const int giop_lite = 0;
+
+ ACE_NEW_RETURN (this->creation_strategy_,
+ CREATION_STRATEGY (this->orb_core_,
+ giop_lite),
+ -1);
+
+ ACE_NEW_RETURN (this->concurrency_strategy_,
+ CONCURRENCY_STRATEGY (this->orb_core_),
+ -1);
+
+ ACE_NEW_RETURN (this->accept_strategy_,
+ ACCEPT_STRATEGY (this->orb_core_,
+ this->timeout_),
+ -1);
+
+ u_short requested_port = addr.get_port_number ();
+ if (requested_port == 0)
+ {
+ // don't care, i.e., let the OS choose an ephemeral port
+ if (this->ssl_acceptor_.open (addr,
+ reactor,
+ this->creation_strategy_,
+ this->accept_strategy_,
+ this->concurrency_strategy_,
+ 0, 0, 0, 1,
+ this->reuse_addr_) == -1)
+ {
+ if (TAO_debug_level > 0)
+ ACE_DEBUG ((LM_DEBUG,
+ ACE_TEXT ("\n\nTAO (%P|%t) ")
+ ACE_TEXT ("SSLIOP_Acceptor::open_i - %p\n\n"),
+ ACE_TEXT ("cannot open acceptor")));
+ return -1;
+ }
+ }
+ else
+ {
+ ACE_INET_Addr a(addr);
+
+ int found_a_port = 0;
+ ACE_UINT32 last_port = requested_port + this->port_span_ - 1;
+ if (last_port > ACE_MAX_DEFAULT_PORT)
+ {
+ last_port = ACE_MAX_DEFAULT_PORT;
+ }
+
+ for (ACE_UINT32 p = requested_port; p <= last_port; p++)
+ {
+ if (TAO_debug_level > 5)
+ ACE_DEBUG ((LM_DEBUG,
+ ACE_TEXT ("TAO (%P|%t) IIOP_Acceptor::open_i() ")
+ ACE_TEXT ("trying to listen on port %d\n"), p));
+
+ // Now try to actually open on that port
+ a.set_port_number ((u_short)p);
+ if (this->ssl_acceptor_.open (a,
+ reactor,
+ this->creation_strategy_,
+ this->accept_strategy_,
+ this->concurrency_strategy_,
+ 0, 0, 0, 1,
+ this->reuse_addr_) != -1)
+ {
+ found_a_port = 1;
+ break;
+ }
+ }
+
+ // Now, if we couldn't locate a port, we punt
+ if (! found_a_port)
+ {
+ if (TAO_debug_level > 0)
+ ACE_DEBUG ((LM_DEBUG,
+ ACE_TEXT ("\n\nTAO (%P|%t) ")
+ ACE_TEXT ("SSLIOP_Acceptor::open_i - %p\n\n"),
+ ACE_TEXT ("cannot open acceptor")));
+ return -1;
+ }
+ }
+
+ ACE_INET_Addr ssl_address;
+
+ // We do this to make sure the port number the endpoint is listening
+ // on gets set in the addr.
+ if (this->ssl_acceptor_.acceptor ().get_local_addr (ssl_address) != 0)
+ {
+ // @@ Should this be a catastrophic error???
+ if (TAO_debug_level > 0)
+ ACE_DEBUG ((LM_DEBUG,
+ ACE_TEXT ("\n\nTAO (%P|%t) ")
+ ACE_TEXT ("SSLIOP_Acceptor::open_i - %p\n\n"),
+ ACE_TEXT ("cannot get local addr")));
+ return -1;
+ }
+
+ // Reset the SSL endpoint port to the one chosen by the OS (or by
+ // the user if provided.
+ this->ssl_component_.port = ssl_address.get_port_number ();
+
+ (void) this->ssl_acceptor_.acceptor().enable (ACE_CLOEXEC);
+ // This avoids having child processes acquire the listen socket
+ // thereby denying the server the opportunity to restart on a
+ // well-known endpoint. This does not affect the aberrent behavior
+ // on Win32 platforms.
+
+ if (TAO_debug_level > 5)
+ {
+ for (size_t i = 0; i < this->endpoint_count_; ++i)
+ {
+ ACE_DEBUG ((LM_DEBUG,
+ ACE_TEXT ("TAO (%P|%t) ")
+ ACE_TEXT ("SSLIOP_Acceptor::open_i - ")
+ ACE_TEXT ("listening on: <%s:%u>\n"),
+ this->hosts_[i],
+ this->ssl_component_.port));
+ }
+ }
+
+ return 0;
+}
+
+int
+TAO::SSLIOP::Acceptor::parse_options_i (int &argc, ACE_CString ** argv)
+{
+ //first, do the base class parser, then parse the leftovers.
+ int result = this->IIOP_SSL_Acceptor::parse_options_i(argc,argv);
+ if (result == -1)
+ return result;
+
+ // then parse out our own options.
+ int i = 0;
+ while (i < argc)
+ {
+ // since the base class has already iterated over the list once,
+ // it has vound any ill-formed options. Therefore we don't need
+ // to do that again here.
+ int slot = argv[i]->find ("=");
+ ACE_CString name = argv[i]->substring (0, slot);
+ ACE_CString value = argv[i]->substring (slot + 1);
+
+ if (name == "priority")
+ {
+ ACE_ERROR_RETURN ((LM_ERROR,
+ ACE_TEXT ("TAO (%P|%t) Invalid SSLIOP endpoint format: ")
+ ACE_TEXT ("endpoint priorities no longer supported. \n"),
+ value.c_str ()),
+ -1);
+ }
+ else if (ACE_OS::strcmp (name.c_str (), "ssl_port") == 0)
+ {
+ int ssl_port = ACE_OS::atoi (value.c_str ());
+
+ if (ssl_port >= 0 && ssl_port < 65536)
+ this->ssl_component_.port = ssl_port;
+ else
+ ACE_ERROR_RETURN ((LM_ERROR,
+ ACE_TEXT ("TAO (%P|%t) Invalid ")
+ ACE_TEXT ("IIOP/SSL endpoint ")
+ ACE_TEXT ("port: <%s>\n"),
+ value.c_str ()),
+ -1);
+ }
+ else
+ {
+ // the name is not known, skip to the next option
+ i++;
+ continue;
+ }
+ // at the end, we've consumed this argument. Shift the list and
+ // put this one on the end. This technique has the effect of
+ // putting them in reverse order, but that doesn't matter, since
+ // these arguments are only whole strings.
+ argc--;
+ ACE_CString *temp = argv[i];
+ for (int j = i; j <= argc-1; j++)
+ argv[j] = argv[j+1];
+ argv[argc] = temp;
+
+ }
+ return 0;
+}
+
+int
+TAO::SSLIOP::Acceptor::verify_secure_configuration (TAO_ORB_Core *orb_core,
+ int major,
+ int minor)
+{
+ // Sanity check.
+ if (major < 1)
+ {
+ // There is no such thing as IIOP 0.x.
+ errno = EINVAL;
+ return -1;
+ }
+
+ // In order to support a secure connection, the SSLIOP::SSL tagged
+ // component must be embedded in the IOR. This isn't possible if
+ // the user elects to disable standard profile components.
+ // Similarly, IIOP 1.0 does not support tagged components, which
+ // makes it impossible to embed the SSLIOP::SSL tagged component
+ // within the IOR. If the given object explicitly disallows
+ // insecure invocations and standard profile components are
+ // disabled, then return with an error since secure invocations
+ // cannot be supported without standard profile components.
+ //
+ // Note that it isn't enough to support NoProtection. NoProtection
+ // must be required since "support" does not preclude the secure
+ // port from being used.
+
+ if ((orb_core->orb_params ()->std_profile_components () == 0
+ || (major == 1 && minor == 0))
+ && ACE_BIT_DISABLED (this->ssl_component_.target_requires,
+ ::Security::NoProtection))
+ {
+ if (TAO_debug_level > 0)
+ ACE_ERROR ((LM_ERROR,
+ ACE_TEXT ("(%P|%t) Cannot support secure ")
+ ACE_TEXT ("IIOP over SSL connection if\n")
+ ACE_TEXT ("(%P|%t) standard profile ")
+ ACE_TEXT ("components are disabled\n")
+ ACE_TEXT ("(%P|%t) or IIOP 1.0 endpoint is ")
+ ACE_TEXT ("used.\n")));
+
+ errno = EINVAL;
+ return -1;
+ }
+
+ return 0;
+}
+
+TAO_END_VERSIONED_NAMESPACE_DECL
diff --git a/TAO/orbsvcs/orbsvcs/SSLIOP/SSLIOP_Acceptor.h b/TAO/orbsvcs/orbsvcs/SSLIOP/SSLIOP_Acceptor.h
new file mode 100644
index 00000000000..f8c12442dc3
--- /dev/null
+++ b/TAO/orbsvcs/orbsvcs/SSLIOP/SSLIOP_Acceptor.h
@@ -0,0 +1,169 @@
+// -*- C++ -*-
+
+//=============================================================================
+/**
+ * @file SSLIOP_Acceptor.h
+ *
+ * $Id$
+ *
+ * IIOP/SSL specific acceptor processing
+ *
+ *
+ * @author Carlos O'Ryan <coryan@uci.edu>
+ * @author Ossama Othman <ossama@uci.edu>
+ */
+//=============================================================================
+
+
+#ifndef TAO_SSLIOP_ACCEPTOR_H
+#define TAO_SSLIOP_ACCEPTOR_H
+
+#include /**/ "ace/pre.h"
+
+#include "ace/config-all.h"
+
+#if !defined (ACE_LACKS_PRAGMA_ONCE)
+# pragma once
+#endif /* ACE_LACKS_PRAGMA_ONCE */
+
+#include "orbsvcs/SSLIOP/IIOP_SSL_Acceptor.h"
+#include "orbsvcs/SSLIOP/SSLIOP_Connection_Handler.h"
+#include "orbsvcs/SSLIOP/SSLIOP_Accept_Strategy.h"
+
+#include "orbsvcs/SSLIOPC.h" /* CSIv1 */
+#include "orbsvcs/CSIIOPC.h" /* CSIv2 */
+
+TAO_BEGIN_VERSIONED_NAMESPACE_DECL
+
+namespace TAO
+{
+ namespace SSLIOP
+ {
+
+ /**
+ * @class Acceptor
+ *
+ * @brief The SSLIOP-specific bridge class for the concrete acceptor.
+ */
+ class Acceptor
+ : public IIOP_SSL_Acceptor
+ {
+ public:
+
+ /// Constructor.
+ Acceptor (::Security::QOP qop,
+ const ACE_Time_Value & timeout);
+
+ /// Destructor.
+ ~Acceptor (void);
+
+ typedef ACE_Strategy_Acceptor<Connection_Handler, ACE_SSL_SOCK_ACCEPTOR> BASE_ACCEPTOR;
+ typedef TAO_Creation_Strategy<Connection_Handler> CREATION_STRATEGY;
+ typedef TAO_Concurrency_Strategy<Connection_Handler> CONCURRENCY_STRATEGY;
+ typedef Accept_Strategy ACCEPT_STRATEGY;
+
+ /**
+ * @name The TAO_Acceptor Methods
+ *
+ * Check the documentation in tao/Pluggable.h for details.
+ */
+ //@{
+ virtual int open (TAO_ORB_Core *orb_core,
+ ACE_Reactor *reactor,
+ int version_major,
+ int version_minor,
+ const char *address,
+ const char *options = 0);
+ virtual int open_default (TAO_ORB_Core *orb_core,
+ ACE_Reactor *reactor,
+ int version_major,
+ int version_minor,
+ const char *options = 0);
+ virtual int close (void);
+ virtual int create_profile (const TAO::ObjectKey &object_key,
+ TAO_MProfile &mprofile,
+ CORBA::Short priority);
+ virtual int is_collocated (const TAO_Endpoint* endpoint);
+ //@}
+
+ /// Retrieve the CSIv1 SSLIOP::SSL component associated with the
+ /// endpoints set up by this acceptor.
+ const ::SSLIOP::SSL &ssl_component (void) const;
+
+ private:
+
+ /// Implement the common part of the open*() methods.
+ int ssliop_open_i (TAO_ORB_Core *orb_core,
+ const ACE_INET_Addr& addr,
+ ACE_Reactor *reactor);
+
+ /// Parse protocol specific options.
+ virtual int parse_options_i (int &argc, ACE_CString ** argv);
+
+ /// Ensure that neither the endpoint configuration nor the ORB
+ /// configuration violate security measures.
+ int verify_secure_configuration (TAO_ORB_Core *orb_core,
+ int major,
+ int minor);
+
+ /// Helper method to add a new profile to the mprofile for
+ /// each endpoint.
+ int create_new_profile (const TAO::ObjectKey &object_key,
+ TAO_MProfile &mprofile,
+ CORBA::Short priority);
+
+ /// Helper method to create a profile that contains all of
+ /// our endpoints.
+ int create_shared_profile (const TAO::ObjectKey &object_key,
+ TAO_MProfile &mprofile,
+ CORBA::Short priority);
+
+ private:
+
+ /// The concrete acceptor, as a pointer to it's base class.
+ BASE_ACCEPTOR ssl_acceptor_;
+
+ /**
+ * @name Acceptor Strategies
+ *
+ * Strategies used when accepting an incoming connection.
+ */
+ CREATION_STRATEGY *creation_strategy_;
+ CONCURRENCY_STRATEGY *concurrency_strategy_;
+ ACCEPT_STRATEGY *accept_strategy_;
+
+ /// The CSIv1 SSL component.
+ /**
+ * This is the SSLIOP endpoint-specific tagged component that is
+ * embedded in a given IOR.
+ */
+ ::SSLIOP::SSL ssl_component_;
+
+ /// The SSLIOP CSIv2 tagged component.
+ /**
+ *
+ */
+ CSIIOP::TLS_SEC_TRANS csiv2_component_;
+
+ /// The accept() timeout.
+ /**
+ * This timeout includes the overall time to complete the SSL
+ * handshake. This includes both the TCP handshake and the SSL
+ * handshake.
+ */
+ const ACE_Time_Value timeout_;
+
+ };
+
+ } // End SSLIOP namespace.
+} // End TAO namespace.
+
+TAO_END_VERSIONED_NAMESPACE_DECL
+
+#if defined(__ACE_INLINE__)
+#include "orbsvcs/SSLIOP/SSLIOP_Acceptor.i"
+#endif /* __ACE_INLINE__ */
+
+#include /**/ "ace/post.h"
+
+#endif /* TAO_SSLIOP_ACCEPTOR_H */
diff --git a/TAO/orbsvcs/orbsvcs/SSLIOP/SSLIOP_Acceptor.i b/TAO/orbsvcs/orbsvcs/SSLIOP/SSLIOP_Acceptor.i
new file mode 100644
index 00000000000..9dd630f54ef
--- /dev/null
+++ b/TAO/orbsvcs/orbsvcs/SSLIOP/SSLIOP_Acceptor.i
@@ -0,0 +1,14 @@
+// -*- C++ -*-
+//
+// $Id$
+
+
+TAO_BEGIN_VERSIONED_NAMESPACE_DECL
+
+ACE_INLINE const SSLIOP::SSL &
+TAO::SSLIOP::Acceptor::ssl_component (void) const
+{
+ return this->ssl_component_;
+}
+
+TAO_END_VERSIONED_NAMESPACE_DECL
diff --git a/TAO/orbsvcs/orbsvcs/SSLIOP/SSLIOP_ClientCredentials.cpp b/TAO/orbsvcs/orbsvcs/SSLIOP/SSLIOP_ClientCredentials.cpp
new file mode 100644
index 00000000000..4cf1fe799fb
--- /dev/null
+++ b/TAO/orbsvcs/orbsvcs/SSLIOP/SSLIOP_ClientCredentials.cpp
@@ -0,0 +1,142 @@
+// $Id$
+
+#include "orbsvcs/SSLIOP/SSLIOP_ClientCredentials.h"
+#include "orbsvcs/SSLIOP/SSLIOP_OwnCredentials.h"
+
+
+ACE_RCSID (SSLIOP,
+ SSLIOP_ClientCredentials,
+ "$Id$")
+
+
+TAO_BEGIN_VERSIONED_NAMESPACE_DECL
+
+TAO::SSLIOP::ClientCredentials::ClientCredentials (
+ X509 * cert,
+ EVP_PKEY *evp,
+ SSL * ssl)
+ : SSLIOP_Credentials (cert, evp),
+ ssl_ (TAO::SSLIOP::OpenSSL_traits< ::SSL >::_duplicate (ssl))
+{
+}
+
+TAO::SSLIOP::ClientCredentials::~ClientCredentials (void)
+{
+}
+
+SecurityLevel3::CredentialsType
+TAO::SSLIOP::ClientCredentials::creds_type (ACE_ENV_SINGLE_ARG_DECL_NOT_USED)
+ ACE_THROW_SPEC ((CORBA::SystemException))
+{
+ return SecurityLevel3::CT_ClientCredentials;
+}
+
+char *
+TAO::SSLIOP::ClientCredentials::context_id (ACE_ENV_SINGLE_ARG_DECL)
+ ACE_THROW_SPEC ((CORBA::SystemException))
+{
+ ACE_THROW_RETURN (CORBA::NO_IMPLEMENT (), 0);
+}
+
+SecurityLevel3::Principal *
+TAO::SSLIOP::ClientCredentials::client_principal (ACE_ENV_SINGLE_ARG_DECL)
+ ACE_THROW_SPEC ((CORBA::SystemException))
+{
+ ACE_THROW_RETURN (CORBA::NO_IMPLEMENT (), 0);
+}
+
+SecurityLevel3::StatementList *
+TAO::SSLIOP::ClientCredentials::client_supporting_statements (
+ ACE_ENV_SINGLE_ARG_DECL)
+ ACE_THROW_SPEC ((CORBA::SystemException))
+{
+ ACE_THROW_RETURN (CORBA::NO_IMPLEMENT (), 0);
+}
+
+SecurityLevel3::ResourceNameList *
+TAO::SSLIOP::ClientCredentials::client_restricted_resources (
+ ACE_ENV_SINGLE_ARG_DECL)
+ ACE_THROW_SPEC ((CORBA::SystemException))
+{
+ ACE_THROW_RETURN (CORBA::NO_IMPLEMENT (), 0);
+}
+
+SecurityLevel3::Principal *
+TAO::SSLIOP::ClientCredentials::target_principal (ACE_ENV_SINGLE_ARG_DECL)
+ ACE_THROW_SPEC ((CORBA::SystemException))
+{
+ ACE_THROW_RETURN (CORBA::NO_IMPLEMENT (), 0);
+}
+
+SecurityLevel3::StatementList *
+TAO::SSLIOP::ClientCredentials::target_supporting_statements (
+ ACE_ENV_SINGLE_ARG_DECL)
+ ACE_THROW_SPEC ((CORBA::SystemException))
+{
+ ACE_THROW_RETURN (CORBA::NO_IMPLEMENT (), 0);
+}
+
+SecurityLevel3::ResourceNameList *
+TAO::SSLIOP::ClientCredentials::target_restricted_resources (
+ ACE_ENV_SINGLE_ARG_DECL)
+ ACE_THROW_SPEC ((CORBA::SystemException))
+{
+ ACE_THROW_RETURN (CORBA::NO_IMPLEMENT (), 0);
+}
+
+SecurityLevel3::OwnCredentials_ptr
+TAO::SSLIOP::ClientCredentials::parent_credentials (ACE_ENV_SINGLE_ARG_DECL)
+ ACE_THROW_SPEC ((CORBA::SystemException))
+{
+ SecurityLevel3::OwnCredentials_ptr creds =
+ SecurityLevel3::OwnCredentials::_nil ();
+
+ ACE_NEW_THROW_EX (creds,
+ TAO::SSLIOP::OwnCredentials (
+ ::SSL_get_certificate (this->ssl_.in ()),
+ ::SSL_get_privatekey (this->ssl_.in ())),
+ CORBA::NO_MEMORY ());
+ ACE_CHECK_RETURN (creds);
+
+ return creds;
+}
+
+CORBA::Boolean
+TAO::SSLIOP::ClientCredentials::client_authentication (
+ ACE_ENV_SINGLE_ARG_DECL_NOT_USED)
+ ACE_THROW_SPEC ((CORBA::SystemException))
+{
+ // If the client presented no certificate (i.e. cert_.ptr() == 0),
+ // the client was not authenticated. Otherwise, verify the peer's
+ // certificate.
+
+ return
+ this->x509_.in () != 0
+ && SSL_get_verify_result (this->ssl_.in ()) == X509_V_OK;
+}
+
+CORBA::Boolean
+TAO::SSLIOP::ClientCredentials::target_authentication (ACE_ENV_SINGLE_ARG_DECL)
+ ACE_THROW_SPEC ((CORBA::SystemException))
+{
+ ACE_THROW_RETURN (CORBA::NO_IMPLEMENT (), false);
+}
+
+CORBA::Boolean
+TAO::SSLIOP::ClientCredentials::confidentiality (ACE_ENV_SINGLE_ARG_DECL)
+ ACE_THROW_SPEC ((CORBA::SystemException))
+{
+ ACE_THROW_RETURN (CORBA::NO_IMPLEMENT (), false);
+}
+
+CORBA::Boolean
+TAO::SSLIOP::ClientCredentials::integrity (ACE_ENV_SINGLE_ARG_DECL_NOT_USED)
+ ACE_THROW_SPEC ((CORBA::SystemException))
+{
+ // TAO's SSLIOP pluggable transport always provides integrity. Note
+ // that if we
+
+ return true;
+}
+
+TAO_END_VERSIONED_NAMESPACE_DECL
diff --git a/TAO/orbsvcs/orbsvcs/SSLIOP/SSLIOP_ClientCredentials.h b/TAO/orbsvcs/orbsvcs/SSLIOP/SSLIOP_ClientCredentials.h
new file mode 100644
index 00000000000..ce621276918
--- /dev/null
+++ b/TAO/orbsvcs/orbsvcs/SSLIOP/SSLIOP_ClientCredentials.h
@@ -0,0 +1,153 @@
+// -*- C++ -*-
+
+//=============================================================================
+/**
+ * @file SSLIOP_ClientCredentials.h
+ *
+ * $Id$
+ *
+ * @author Ossama Othman <ossama@dre.vanderbilt.edu>
+ */
+//=============================================================================
+
+
+#ifndef TAO_SSLIOP_CLIENT_CREDENTIALS_H
+#define TAO_SSLIOP_CLIENT_CREDENTIALS_H
+
+#include /**/ "ace/pre.h"
+
+#include "orbsvcs/SSLIOP/SSLIOP_Export.h"
+
+#if !defined (ACE_LACKS_PRAGMA_ONCE)
+# pragma once
+#endif /* ACE_LACKS_PRAGMA_ONCE */
+
+#include "orbsvcs/SSLIOP/SSLIOP_Credentials.h"
+#include "orbsvcs/SSLIOP/SSLIOP_SSL.h"
+
+#include "orbsvcs/SecurityLevel3C.h"
+
+#include "tao/LocalObject.h"
+
+#if defined(_MSC_VER)
+#pragma warning(push)
+#pragma warning(disable:4250)
+#endif /* _MSC_VER */
+
+
+TAO_BEGIN_VERSIONED_NAMESPACE_DECL
+
+namespace TAO
+{
+ namespace SSLIOP
+ {
+ /**
+ * @class ClientCredentials
+ *
+ * @brief
+ *
+ *
+ */
+ class ClientCredentials
+ : public virtual SecurityLevel3::ClientCredentials,
+ public virtual SSLIOP_Credentials
+ {
+ public:
+
+ /// Constructor
+ ClientCredentials (::X509 * cert,
+ ::EVP_PKEY * evp,
+ ::SSL * ssl);
+
+ /**
+ * @name SecurityLevel3::Credentials Methods
+ *
+ * Methods required by the SecurityLevel3::Credentials
+ * interface.
+ */
+ //@{
+ virtual SecurityLevel3::CredentialsType creds_type (
+ ACE_ENV_SINGLE_ARG_DECL)
+ ACE_THROW_SPEC ((CORBA::SystemException));
+ //@}
+
+ /**
+ * @name SecurityLevel3::ClientCredentials Methods
+ *
+ * Methods required by the SecurityLevel3::ClientCredentials
+ * interface.
+ */
+ //@{
+ virtual char * context_id (ACE_ENV_SINGLE_ARG_DECL)
+ ACE_THROW_SPEC ((CORBA::SystemException));
+
+ virtual SecurityLevel3::Principal * client_principal (
+ ACE_ENV_SINGLE_ARG_DECL)
+ ACE_THROW_SPEC ((CORBA::SystemException));
+
+ virtual SecurityLevel3::StatementList * client_supporting_statements (
+ ACE_ENV_SINGLE_ARG_DECL)
+ ACE_THROW_SPEC ((CORBA::SystemException));
+
+ virtual SecurityLevel3::ResourceNameList * client_restricted_resources (
+ ACE_ENV_SINGLE_ARG_DECL)
+ ACE_THROW_SPEC ((CORBA::SystemException));
+
+ virtual SecurityLevel3::Principal * target_principal (
+ ACE_ENV_SINGLE_ARG_DECL)
+ ACE_THROW_SPEC ((CORBA::SystemException));
+
+ virtual SecurityLevel3::StatementList * target_supporting_statements (
+ ACE_ENV_SINGLE_ARG_DECL)
+ ACE_THROW_SPEC ((CORBA::SystemException));
+
+ virtual SecurityLevel3::ResourceNameList * target_restricted_resources (
+ ACE_ENV_SINGLE_ARG_DECL)
+ ACE_THROW_SPEC ((CORBA::SystemException));
+
+ virtual SecurityLevel3::OwnCredentials_ptr parent_credentials (
+ ACE_ENV_SINGLE_ARG_DECL)
+ ACE_THROW_SPEC ((CORBA::SystemException));
+
+ virtual CORBA::Boolean client_authentication (ACE_ENV_SINGLE_ARG_DECL)
+ ACE_THROW_SPEC ((CORBA::SystemException));
+
+ virtual CORBA::Boolean target_authentication (ACE_ENV_SINGLE_ARG_DECL)
+ ACE_THROW_SPEC ((CORBA::SystemException));
+
+ virtual CORBA::Boolean confidentiality (ACE_ENV_SINGLE_ARG_DECL)
+ ACE_THROW_SPEC ((CORBA::SystemException));
+
+ virtual CORBA::Boolean integrity (ACE_ENV_SINGLE_ARG_DECL)
+ ACE_THROW_SPEC ((CORBA::SystemException));
+ //@}
+
+ protected:
+
+ /// Destructor
+ /**
+ * Protected destructor to enforce proper memory management
+ * through the reference counting mechanism.
+ */
+ ~ClientCredentials (void);
+
+ private:
+
+ /// Reference to the OpenSSL @c SSL data structure associated
+ /// with the current security context (e.g. SSL connection).
+ TAO::SSLIOP::SSL_var ssl_;
+
+ };
+
+ } // End SSLIOP namespace
+} // End TAO namespace
+
+TAO_END_VERSIONED_NAMESPACE_DECL
+
+#if defined(_MSC_VER)
+#pragma warning(pop)
+#endif /* _MSC_VER */
+
+#include /**/ "ace/post.h"
+
+#endif /* TAO_SSLIOP_CLIENT_CREDENTIALS_H */
diff --git a/TAO/orbsvcs/orbsvcs/SSLIOP/SSLIOP_Connection_Handler.cpp b/TAO/orbsvcs/orbsvcs/SSLIOP/SSLIOP_Connection_Handler.cpp
new file mode 100644
index 00000000000..3d652c1df81
--- /dev/null
+++ b/TAO/orbsvcs/orbsvcs/SSLIOP/SSLIOP_Connection_Handler.cpp
@@ -0,0 +1,445 @@
+#include "orbsvcs/SSLIOP/SSLIOP_Connection_Handler.h"
+#include "orbsvcs/SSLIOP/SSLIOP_Endpoint.h"
+#include "orbsvcs/SSLIOP/SSLIOP_Util.h"
+
+#include "tao/debug.h"
+#include "tao/Base_Transport_Property.h"
+#include "tao/ORB_Core.h"
+#include "tao/IIOP_Endpoint.h"
+#include "tao/IIOP_Connection_Handler.h"
+#include "tao/Transport_Cache_Manager.h"
+#include "tao/Thread_Lane_Resources.h"
+#include "tao/Wait_Strategy.h"
+#include "tao/Protocols_Hooks.h"
+#include "ace/os_include/netinet/os_tcp.h"
+#include "ace/os_include/os_netdb.h"
+
+#if !defined (__ACE_INLINE__)
+# include "orbsvcs/SSLIOP/SSLIOP_Connection_Handler.i"
+#endif /* ! __ACE_INLINE__ */
+
+ACE_RCSID (SSLIOP,
+ SSLIOP_Connection_Handler,
+ "$Id$")
+
+// ****************************************************************
+
+TAO_BEGIN_VERSIONED_NAMESPACE_DECL
+
+TAO::SSLIOP::Connection_Handler::Connection_Handler (
+ ACE_Thread_Manager *t)
+ : SVC_HANDLER (t, 0 , 0),
+ TAO_Connection_Handler (0),
+ current_ ()
+{
+ // This constructor should *never* get called, it is just here to
+ // make the compiler happy: the default implementation of the
+ // Creation_Strategy requires a constructor with that signature, we
+ // don't use that implementation, but some (most?) compilers
+ // instantiate it anyway.
+ ACE_ASSERT (0);
+}
+
+TAO::SSLIOP::Connection_Handler::Connection_Handler (
+ TAO_ORB_Core *orb_core,
+ CORBA::Boolean /* flag */) // SSLIOP does *not* support GIOPlite
+ : SVC_HANDLER (orb_core->thr_mgr (), 0, 0),
+ TAO_Connection_Handler (orb_core),
+ current_ ()
+{
+ this->current_ =
+ TAO::SSLIOP::Util::current (orb_core);
+
+ TAO::SSLIOP::Transport* specific_transport = 0;
+ ACE_NEW (specific_transport,
+ TAO::SSLIOP::Transport (this, orb_core, 0));
+
+ // store this pointer (indirectly increment ref count)
+ this->transport (specific_transport);
+}
+
+TAO::SSLIOP::Connection_Handler::~Connection_Handler (void)
+{
+ delete this->transport ();
+}
+
+int
+TAO::SSLIOP::Connection_Handler::open_handler (void *v)
+{
+ return this->open (v);
+}
+
+int
+TAO::SSLIOP::Connection_Handler::open (void *)
+{
+ TAO_IIOP_Protocol_Properties protocol_properties;
+
+ // Initialize values from ORB params.
+ protocol_properties.send_buffer_size_ =
+ this->orb_core ()->orb_params ()->sock_sndbuf_size ();
+ protocol_properties.recv_buffer_size_ =
+ this->orb_core ()->orb_params ()->sock_rcvbuf_size ();
+ protocol_properties.no_delay_ =
+ this->orb_core ()->orb_params ()->nodelay ();
+
+ TAO_Protocols_Hooks *tph =
+ this->orb_core ()->get_protocols_hooks ();
+
+ int client =
+ this->transport ()->opened_as () == TAO::TAO_CLIENT_ROLE;;
+
+ ACE_DECLARE_NEW_CORBA_ENV;
+
+ ACE_TRY
+ {
+ if (client)
+ {
+ tph->client_protocol_properties_at_orb_level (
+ protocol_properties
+ ACE_ENV_ARG_PARAMETER);
+ ACE_TRY_CHECK;
+ }
+ else
+ {
+ tph->server_protocol_properties_at_orb_level (
+ protocol_properties
+ ACE_ENV_ARG_PARAMETER);
+ ACE_TRY_CHECK;
+ }
+ }
+ ACE_CATCHANY
+ {
+ return -1;
+ }
+ ACE_ENDTRY;
+ ACE_CHECK_RETURN (-1);
+
+ if (this->set_socket_option (this->peer (),
+ protocol_properties.send_buffer_size_,
+ protocol_properties.recv_buffer_size_) == -1)
+ return -1;
+
+#if !defined (ACE_LACKS_TCP_NODELAY)
+ if (this->peer ().set_option (ACE_IPPROTO_TCP,
+ TCP_NODELAY,
+ (void *) &protocol_properties.no_delay_,
+ sizeof (protocol_properties.no_delay_)) == -1)
+ return -1;
+#endif /* ! ACE_LACKS_TCP_NODELAY */
+
+ if (this->transport ()->wait_strategy ()->non_blocking ())
+ {
+ if (this->peer ().enable (ACE_NONBLOCK) == -1)
+ return -1;
+
+ // Enable partial SSL writes.
+ //
+ // By default, OpenSSL attempts to send the entire chunk of
+ // data. This is fine for relatively small chunks of data.
+ // However, if SSL_write() returns with an SSL_ERROR_WANT_WRITE
+ // (basically an EWOULDBLOCK) when using non-blocking I/O, TAO
+ // may attempt to resend the same data with a potentially
+ // different buffer address. Such a scenario is prone to happen
+ // when sending large chunks of data that cause flow control to
+ // occur. For most protocol implementations this is fine.
+ // OpenSSL, on the other hand, requires that the same arguments
+ // be passed to SSL_write() if an SSL_ERROR_WANT_WRITE error
+ // occured on a previous SSL_write() attempt, which cannot be
+ // guaranteed by TAO's current message queuing/construction
+ // code, often resulting in a "bad write retry" OpenSSL error.
+ // To work around this issue, we enable partial SSL_write()s in
+ // SSL/TLS connections created by TAO's SSLIOP pluggable
+ // protocol. Doing so makes SSL_write() behave like write(2).
+ //
+ // This isn't an issue when using blocking I/O.
+ (void) ::SSL_set_mode (this->peer ().ssl (),
+ SSL_MODE_ENABLE_PARTIAL_WRITE);
+ (void) ::SSL_set_mode (this->peer ().ssl (),
+ SSL_MODE_ACCEPT_MOVING_WRITE_BUFFER);
+ }
+
+ // Called by the <Strategy_Acceptor> when the handler is
+ // completely connected.
+ ACE_INET_Addr remote_addr;
+ if (this->peer ().get_remote_addr (remote_addr) == -1)
+ return -1;
+
+ ACE_INET_Addr local_addr;
+ if (this->peer ().get_local_addr (local_addr) == -1)
+ return -1;
+
+ int use_dotted_decimal_addresses =
+ this->orb_core ()->orb_params ()->use_dotted_decimal_addresses ();
+
+ if (local_addr.get_ip_address () == remote_addr.get_ip_address ()
+ && local_addr.get_port_number () == remote_addr.get_port_number ())
+ {
+ if (TAO_debug_level > 0)
+ {
+ char remote_as_string[MAXHOSTNAMELEN + 16];
+ char local_as_string[MAXHOSTNAMELEN + 16];
+
+ (void) remote_addr.addr_to_string (remote_as_string,
+ sizeof (remote_as_string),
+ use_dotted_decimal_addresses);
+ (void) local_addr.addr_to_string (local_as_string,
+ sizeof (local_as_string),
+ use_dotted_decimal_addresses);
+ ACE_ERROR ((LM_ERROR,
+ "TAO(%P|%t) - TAO::SSLIOP::Connection_Handler::open, "
+ "Holy Cow! The remote addr and "
+ "local addr are identical (%s == %s)\n",
+ remote_as_string, local_as_string));
+ }
+
+ return -1;
+ }
+
+ if (TAO_debug_level > 0)
+ {
+ char client[MAXHOSTNAMELEN + 16];
+
+ // Verify that we can resolve the peer hostname.
+ if (remote_addr.addr_to_string (client,
+ sizeof (client),
+ use_dotted_decimal_addresses) == -1)
+ {
+ ACE_OS::strcpy (client, "*unable to obtain*");
+ }
+
+ ACE_DEBUG ((LM_DEBUG,
+ ACE_TEXT ("TAO (%P|%t) SSLIOP connection from ")
+ ACE_TEXT ("client <%s> on [%d]\n"),
+ client,
+ this->peer ().get_handle ()));
+
+ // Verify that we can resolve our hostname.
+ if (local_addr.addr_to_string (client,
+ sizeof (client),
+ use_dotted_decimal_addresses) == -1)
+ {
+ ACE_OS::strcpy (client, "*unable to obtain*");
+ }
+
+ ACE_DEBUG ((LM_DEBUG,
+ ACE_TEXT ("TAO (%P|%t) SSLIOP connection accepted from ")
+ ACE_TEXT ("server <%s> on [%d]\n"),
+ client,
+ this->get_handle ()));
+ }
+
+ // Set that the transport is now connected, if fails we return -1
+ // Use C-style cast b/c otherwise we get warnings on lots of
+ // compilers
+ if (!this->transport ()->post_open ((size_t) this->get_handle ()))
+ return -1;
+
+ // @@ Not needed
+ this->state_changed (TAO_LF_Event::LFS_SUCCESS,
+ this->orb_core ()->leader_follower ());
+
+ return 0;
+}
+
+int
+TAO::SSLIOP::Connection_Handler::resume_handler (void)
+{
+ return ACE_Event_Handler::ACE_APPLICATION_RESUMES_HANDLER;
+}
+
+int
+TAO::SSLIOP::Connection_Handler::close_connection (void)
+{
+ return this->close_connection_eh (this);
+}
+
+int
+TAO::SSLIOP::Connection_Handler::handle_input (ACE_HANDLE h)
+{
+ return this->handle_input_eh (h, this);
+}
+
+int
+TAO::SSLIOP::Connection_Handler::handle_output (ACE_HANDLE handle)
+{
+ const int result =
+ this->handle_output_eh (handle, this);
+
+ if (result == -1)
+ {
+ this->close_connection ();
+ return 0;
+ }
+
+ return result;
+}
+
+int
+TAO::SSLIOP::Connection_Handler::handle_timeout (const ACE_Time_Value &,
+ const void *)
+{
+ // We don't use this upcall for I/O. This is only used by the
+ // Connector to indicate that the connection timedout. Therefore,
+ // we should call close().
+ return this->close ();
+}
+
+int
+TAO::SSLIOP::Connection_Handler::handle_close (ACE_HANDLE,
+ ACE_Reactor_Mask)
+{
+ ACE_ASSERT (0);
+ return 0;
+}
+
+int
+TAO::SSLIOP::Connection_Handler::close (u_long)
+{
+ return this->close_handler ();
+}
+
+int
+TAO::SSLIOP::Connection_Handler::release_os_resources (void)
+{
+ return this->peer().close ();
+}
+
+void
+TAO::SSLIOP::Connection_Handler::pos_io_hook (int & return_value)
+{
+ if (return_value == 0 && ::SSL_pending (this->peer ().ssl ()))
+ return_value = 1;
+}
+
+int
+TAO::SSLIOP::Connection_Handler::add_transport_to_cache (void)
+{
+ ACE_INET_Addr addr;
+
+ // Get the peername.
+ //
+ // Note that the port set in the ACE_INET_Addr is actually the SSL
+ // port!
+ if (this->peer ().get_remote_addr (addr) == -1)
+ return -1;
+
+ // Construct an IIOP_Endpoint object
+ TAO_IIOP_Endpoint tmpoint (
+ addr,
+ this->orb_core()->orb_params()->use_dotted_decimal_addresses());
+
+ // @@ This is broken. We need to include the SecurityAssociation
+ // options to be able to truly distinguish cached SSLIOP
+ // transports.
+ const ::SSLIOP::SSL ssl =
+ {
+ 0, // target_supports
+ 0, // target_requires
+ addr.get_port_number () // port
+ };
+
+ TAO_SSLIOP_Endpoint endpoint (&ssl,
+ &tmpoint);
+
+ // Construct a property object
+ TAO_Base_Transport_Property prop (&endpoint);
+
+ TAO::Transport_Cache_Manager &cache =
+ this->orb_core ()->lane_resources ().transport_cache ();
+
+ // Add the handler to Cache
+ return cache.cache_idle_transport (&prop,
+ this->transport ());
+}
+
+int
+TAO::SSLIOP::Connection_Handler::process_listen_point_list (
+ IIOP::ListenPointList &listen_list)
+{
+ // Get the size of the list
+ const CORBA::ULong len = listen_list.length ();
+
+ for (CORBA::ULong i = 0; i < len; ++i)
+ {
+ IIOP::ListenPoint listen_point = listen_list[i];
+ ACE_INET_Addr addr (listen_point.port,
+ listen_point.host.in ());
+
+
+ if (TAO_debug_level > 0)
+ {
+ ACE_DEBUG ((LM_DEBUG,
+ "(%P|%t) Listening port [%d] on [%s]\n",
+ listen_point.port,
+ listen_point.host.in ()));
+ }
+
+ // Construct an IIOP_Endpoint object using the host as provided
+ // in the listen point list. We must use the host in that form
+ // because that's also how the ORB on the other side will
+ // advertise the host in an IOR.
+ //
+ // Note that the port in the ACE_INET_Addr is actually the SSL
+ // port!
+ TAO_IIOP_Endpoint tmpoint (listen_point.host.in (),
+ listen_point.port,
+ addr);
+
+ // @@ This is broken. Instead of just using the default CORBA
+ // SecurityAssociation options, by not supplying SSLIOP::SSL
+ // instance in the endpoint constructor, we need to include the
+ // actual SecurityAssociation options so that the invocation to
+ // the originator is attempted with the appropriate security
+ // settings. Unfortunately, there is currently no portable way to
+ // send the SecurityAssociation options with the
+ // IIOP::ListenPointList. Presumably the new Firewall
+ // specification will address this deficiency.
+ TAO_SSLIOP_Synthetic_Endpoint endpoint (&tmpoint);
+
+ // Construct a property object
+ TAO_Base_Transport_Property prop (&endpoint);
+
+ // Mark the connection as bidirectional
+ prop.set_bidir_flag (1);
+
+ // The property for this handler has changed. Recache the
+ // handler with this property
+ const int retval = this->transport ()->recache_transport (&prop);
+ if (retval == -1)
+ return retval;
+
+ // Make the handler idle and ready for use
+ this->transport ()->make_idle ();
+ }
+
+ return 0;
+}
+
+int
+TAO::SSLIOP::Connection_Handler::setup_ssl_state (
+ TAO::SSLIOP::Current_Impl *&previous_current_impl,
+ TAO::SSLIOP::Current_Impl *new_current_impl,
+ bool &setup_done)
+{
+ // Make the SSL session state available to the SSLIOP::Current
+ // TSS object.
+ new_current_impl->ssl (this->peer ().ssl ());
+
+ // The following call is reentrant and thread-safe
+ this->current_->setup (previous_current_impl,
+ new_current_impl,
+ setup_done);
+
+ return 0;
+}
+
+void
+TAO::SSLIOP::Connection_Handler::teardown_ssl_state (
+ TAO::SSLIOP::Current_Impl *previous_current_impl,
+ bool &setup_done)
+{
+ this->current_->teardown (previous_current_impl,
+ setup_done);
+}
+
+TAO_END_VERSIONED_NAMESPACE_DECL
diff --git a/TAO/orbsvcs/orbsvcs/SSLIOP/SSLIOP_Connection_Handler.h b/TAO/orbsvcs/orbsvcs/SSLIOP/SSLIOP_Connection_Handler.h
new file mode 100644
index 00000000000..9ce3ba997af
--- /dev/null
+++ b/TAO/orbsvcs/orbsvcs/SSLIOP/SSLIOP_Connection_Handler.h
@@ -0,0 +1,202 @@
+// -*- C++ -*-
+
+//=============================================================================
+/**
+ * @file SSLIOP_Connection_Handler.h
+ *
+ * $Id$
+ *
+ * @author Carlos O'Ryan <coryan@uci.edu>
+ * @author Ossama Othman <ossama@uci.edu>
+ */
+//=============================================================================
+
+
+#ifndef TAO_SSLIOP_CONNECTION_HANDLER_H
+#define TAO_SSLIOP_CONNECTION_HANDLER_H
+
+#include /**/ "ace/pre.h"
+
+#include "ace/config-all.h"
+
+#if !defined (ACE_LACKS_PRAGMA_ONCE)
+#pragma once
+#endif /* ACE_LACKS_PRAGMA_ONCE */
+
+#include "orbsvcs/SSLIOP/SSLIOP_Current.h"
+#include "orbsvcs/SSLIOP/SSLIOP_Transport.h"
+
+#include "tao/Connection_Handler.h"
+#include "tao/IIOPC.h"
+
+#include "ace/Reactor.h"
+
+TAO_BEGIN_VERSIONED_NAMESPACE_DECL
+
+class TAO_IIOP_Properties;
+
+namespace TAO
+{
+ namespace SSLIOP
+ {
+
+ /**
+ * @class Connection_Handler
+ *
+ * @brief Handles requests on a single connection.
+ *
+ * The Connection handler which is common for the Acceptor and
+ * the Connector
+ */
+ class Connection_Handler
+ : public SVC_HANDLER,
+ public TAO_Connection_Handler
+ {
+ public:
+
+ Connection_Handler (ACE_Thread_Manager* t = 0);
+
+ /// Constructor.
+ /**
+ * @param arg Parameter is used by the Acceptor to pass the
+ * protocol configuration properties for this
+ * connection.
+ */
+ Connection_Handler (TAO_ORB_Core *orb_core,
+ CORBA::Boolean flag);
+
+ /// Destructor.
+ ~Connection_Handler (void);
+
+ /**
+ * @name Connection Handler overloads
+ *
+ * Connection Handler overloads.
+ */
+ //@{
+ virtual int open_handler (void *);
+ //@}
+
+ /// Close called by the Acceptor or Connector when connection
+ /// establishment fails.
+ int close (u_long = 0);
+
+ //@{
+ /** @name Event Handler overloads
+ */
+ virtual int resume_handler (void);
+ virtual int close_connection (void);
+ virtual int handle_input (ACE_HANDLE);
+ virtual int handle_output (ACE_HANDLE);
+ virtual int handle_close (ACE_HANDLE, ACE_Reactor_Mask);
+ virtual int handle_timeout (const ACE_Time_Value &current_time,
+ const void *act = 0);
+ virtual int open (void *);
+ //@}
+
+ /// Add ourselves to cache.
+ int add_transport_to_cache (void);
+
+ /// Process the @a listen_list.
+ int process_listen_point_list (IIOP::ListenPointList &listen_list);
+
+ /// Make the SSL session state available to the SSLIOP::Current
+ /// object.
+ int setup_ssl_state (TAO::SSLIOP::Current_Impl *&previous_current_impl,
+ TAO::SSLIOP::Current_Impl *new_current_impl,
+ bool &setup_done);
+
+ /// Teardown the SSL session state.
+ void teardown_ssl_state (
+ TAO::SSLIOP::Current_Impl *previous_current_impl,
+ bool &setup_done);
+
+ protected:
+
+ //@{
+ /**
+ * @name TAO_Connection Handler overloads
+ */
+ virtual int release_os_resources (void);
+ virtual void pos_io_hook (int & return_value);
+ //@}
+
+ protected:
+
+ /// Reference to the SSLIOP::Current object (downcast to gain
+ /// access to the low-level management methods).
+ TAO::SSLIOP::Current_var current_;
+
+ private:
+
+ /// TCP configuration for this connection.
+ TAO_IIOP_Properties *tcp_properties_;
+
+ };
+
+ // ****************************************************************
+
+ /**
+ * @class State_Guard
+ *
+ * @brief This Class that sets up TSS SSL states upon
+ * instantiation, and tears down the TSS SSL state when
+ * that instance goes out of scope.
+ *
+ * This guard is used to make TSS SSL state configuration and
+ * deconfiguration during an upcall exception safe. Exceptions
+ * are not supposed to be propagated up to the scope this guard is
+ * used in, so this guard may be unnecessary. However, since
+ * proper TSS SSL state configuration/deconfiguration is critical
+ * to proper security support, this guard is used to ensure that
+ * configuration/deconfiguration is exception safe.
+ */
+ class State_Guard
+ {
+ public:
+
+ /// Constructor that sets up the TSS SSL state.
+ State_Guard (TAO::SSLIOP::Connection_Handler *handler,
+ int &result);
+
+ /// Destructor that tears down the TSS SSL state.
+ ~State_Guard (void);
+
+ private:
+
+ /// Pointer to the connection handler currently handling the
+ /// request/upcall.
+ Connection_Handler *handler_;
+
+ /// The SSLIOP::Current implementation that was previously
+ /// associated with the current thread and invocation.
+ /**
+ * It is stored here until the invocation completes, after which it
+ * placed back into TSS.
+ */
+ Current_Impl *previous_current_impl_;
+
+ /// The SSLIOP::Current implementation to be associated with the
+ /// current invocation.
+ Current_Impl current_impl_;
+
+ /// Flag that specifies whether or not setup of the SSLIOP::Current
+ /// object completed for the current thread and invocation.
+ bool setup_done_;
+
+ };
+
+ } // End SSLIOP namespace.
+} // End TAO namespace.
+
+TAO_END_VERSIONED_NAMESPACE_DECL
+
+
+#if defined (__ACE_INLINE__)
+#include "orbsvcs/SSLIOP/SSLIOP_Connection_Handler.i"
+#endif /* __ACE_INLINE__ */
+
+
+#include /**/ "ace/post.h"
+
+#endif /* TAO_SSLIOP_CONNECTION_HANDLER_H */
diff --git a/TAO/orbsvcs/orbsvcs/SSLIOP/SSLIOP_Connection_Handler.i b/TAO/orbsvcs/orbsvcs/SSLIOP/SSLIOP_Connection_Handler.i
new file mode 100644
index 00000000000..193fc62f426
--- /dev/null
+++ b/TAO/orbsvcs/orbsvcs/SSLIOP/SSLIOP_Connection_Handler.i
@@ -0,0 +1,29 @@
+// -*- C++ -*-
+//
+// $Id$
+
+TAO_BEGIN_VERSIONED_NAMESPACE_DECL
+
+ACE_INLINE
+TAO::SSLIOP::State_Guard::State_Guard (
+ TAO::SSLIOP::Connection_Handler *handler,
+ int &result)
+ : handler_ (handler),
+ previous_current_impl_ (0),
+ current_impl_ (),
+ setup_done_ (false)
+{
+ // Set up the SSLIOP::Current object.
+ result = this->handler_->setup_ssl_state (this->previous_current_impl_,
+ &(this->current_impl_),
+ this->setup_done_);
+}
+
+ACE_INLINE
+TAO::SSLIOP::State_Guard::~State_Guard (void)
+{
+ this->handler_->teardown_ssl_state (this->previous_current_impl_,
+ this->setup_done_);
+}
+
+TAO_END_VERSIONED_NAMESPACE_DECL
diff --git a/TAO/orbsvcs/orbsvcs/SSLIOP/SSLIOP_Connector.cpp b/TAO/orbsvcs/orbsvcs/SSLIOP/SSLIOP_Connector.cpp
new file mode 100644
index 00000000000..3635555cb98
--- /dev/null
+++ b/TAO/orbsvcs/orbsvcs/SSLIOP/SSLIOP_Connector.cpp
@@ -0,0 +1,862 @@
+#include "orbsvcs/SSLIOP/SSLIOP_Connector.h"
+#include "orbsvcs/SSLIOP/SSLIOP_OwnCredentials.h"
+#include "orbsvcs/SSLIOP/SSLIOP_Profile.h"
+#include "orbsvcs/SSLIOP/SSLIOP_X509.h"
+
+#include "orbsvcs/SecurityLevel2C.h"
+
+#include "tao/debug.h"
+#include "tao/ORB_Core.h"
+#include "tao/Client_Strategy_Factory.h"
+#include "tao/Environment.h"
+#include "tao/Base_Transport_Property.h"
+#include "tao/Transport_Cache_Manager.h"
+#include "tao/Thread_Lane_Resources.h"
+#include "tao/Stub.h"
+#include "tao/Transport_Connector.h"
+#include "tao/Blocked_Connect_Strategy.h"
+#include "tao/Wait_Strategy.h"
+#include "tao/Profile_Transport_Resolver.h"
+#include "ace/Auto_Ptr.h"
+#include "ace/os_include/os_netdb.h"
+
+ACE_RCSID (SSLIOP,
+ SSLIOP_Connector,
+ "$Id$")
+
+TAO_BEGIN_VERSIONED_NAMESPACE_DECL
+
+TAO::SSLIOP::Connector::Connector (::Security::QOP qop)
+ : TAO::IIOP_SSL_Connector (),
+ qop_ (qop),
+ connect_strategy_ (),
+ base_connector_ ()
+{
+}
+
+int
+TAO::SSLIOP::Connector::open (TAO_ORB_Core *orb_core)
+{
+ // Since the ACE_Strategy_Connector (and ACE_Connector) cannot
+ // handle non-blocking connections with protocols that have more
+ // than one handshake, such as SSL, force blocking connections for
+ // SSLIOP. This deficiency will be addressed soon.
+ ACE_NEW_RETURN (this->active_connect_strategy_,
+ TAO_Blocked_Connect_Strategy (orb_core),
+ -1);
+
+ if (this->TAO::IIOP_SSL_Connector::open (orb_core) == -1)
+ return -1;
+
+ // Our connect creation strategy
+ CONNECT_CREATION_STRATEGY *connect_creation_strategy = 0;
+
+ ACE_NEW_RETURN (connect_creation_strategy,
+ CONNECT_CREATION_STRATEGY
+ (orb_core->thr_mgr (),
+ orb_core,
+ 0 /* Forcibly disable TAO's GIOPlite feature.
+ It introduces a security hole. */),
+ -1);
+
+ // Our activation strategy
+ CONNECT_CONCURRENCY_STRATEGY *concurrency_strategy = 0;
+
+ ACE_NEW_RETURN (concurrency_strategy,
+ CONNECT_CONCURRENCY_STRATEGY (orb_core),
+ -1);
+
+ ACE_Reactor *r = this->orb_core ()->reactor ();
+
+ return this->base_connector_.open (r,
+ connect_creation_strategy,
+ &this->connect_strategy_,
+ concurrency_strategy);
+}
+
+int
+TAO::SSLIOP::Connector::close (void)
+{
+ (void) this->TAO::IIOP_SSL_Connector::close ();
+
+ delete this->base_connector_.creation_strategy ();
+ delete this->base_connector_.concurrency_strategy ();
+ return this->base_connector_.close ();
+}
+
+TAO_Transport *
+TAO::SSLIOP::Connector::connect (TAO::Profile_Transport_Resolver *resolver,
+ TAO_Transport_Descriptor_Interface *desc,
+ ACE_Time_Value *timeout
+ ACE_ENV_ARG_DECL)
+{
+ if (TAO_debug_level > 0)
+ ACE_DEBUG ((LM_DEBUG,
+ ACE_TEXT ("TAO (%P|%t) - Connector::connect, ")
+ ACE_TEXT ("looking for SSLIOP connection.\n")));
+
+ TAO_Endpoint *endpoint = desc->endpoint ();
+
+ if (endpoint->tag () != IOP::TAG_INTERNET_IOP)
+ return 0;
+
+ TAO_SSLIOP_Endpoint *ssl_endpoint =
+ dynamic_cast<TAO_SSLIOP_Endpoint *> (endpoint);
+
+ if (ssl_endpoint == 0)
+ return 0;
+
+ // @@ TODO: The EstablishTrust policy should be evaluated once per
+ // connection, not once per invocation. This should
+ // improve performance.
+ //
+ // Check if the user overrode the default establishment of trust
+ // policy for the current object.
+ CORBA::Policy_var policy =
+ resolver->stub ()->get_policy (::Security::SecEstablishTrustPolicy
+ ACE_ENV_ARG_PARAMETER);
+ ACE_CHECK_RETURN (0);
+
+ SecurityLevel2::EstablishTrustPolicy_var trust_policy =
+ SecurityLevel2::EstablishTrustPolicy::_narrow (policy.in ()
+ ACE_ENV_ARG_PARAMETER);
+ ACE_CHECK_RETURN (0);
+
+ // We use a pointer and temporary to make it obvious to determine
+ // if no establishment of trust policy was set. Specifically, if
+ // the "trust" pointer below is zero, then the SSLIOP pluggable
+ // protocol default value will be used.
+ ::Security::EstablishTrust trust = { 0 , 0 };
+ if (!CORBA::is_nil (trust_policy.in ()))
+ {
+ trust = trust_policy->trust (ACE_ENV_SINGLE_ARG_PARAMETER);
+ ACE_CHECK_RETURN (0);
+ }
+
+ // Flag that states whether any form of establishment of trust
+ // should occur.
+ CORBA::Boolean const establish_trust =
+ trust.trust_in_target || trust.trust_in_client;
+
+ // @@ Should this be in a "policy validator?"
+ //
+ // If the SSL port is zero, then no SSLIOP tagged component was
+ // available in the IOR, meaning that there is no way to establish
+ // trust. Throw an exception.
+ if (ssl_endpoint->ssl_component ().port == 0
+ && establish_trust)
+ {
+ if (TAO_debug_level > 0)
+ {
+ ACE_ERROR ((LM_ERROR,
+ ACE_TEXT ("TAO_SSLIOP (%P|%t) ERROR: ")
+ ACE_TEXT ("Cannot establish trust since ")
+ ACE_TEXT ("no SSLIOP tagged component was ")
+ ACE_TEXT ("found in the IOR.\n")));
+ }
+
+ ACE_THROW_RETURN (CORBA::INV_POLICY (), // @@ Correct exception?
+ 0);
+ }
+
+ // Check if the user overrode the default Quality-of-Protection for
+ // the current object.
+ policy = resolver->stub ()->get_policy (::Security::SecQOPPolicy
+ ACE_ENV_ARG_PARAMETER);
+ ACE_CHECK_RETURN (0);
+
+ SecurityLevel2::QOPPolicy_var qop_policy =
+ SecurityLevel2::QOPPolicy::_narrow (policy.in ()
+ ACE_ENV_ARG_PARAMETER);
+ ACE_CHECK_RETURN (0);
+
+ // Temporary variable used to avoid overwriting the default value
+ // set when the ORB was initialized.
+ ::Security::QOP qop = this->qop_;
+
+ if (!CORBA::is_nil (qop_policy.in ()))
+ {
+ qop = qop_policy->qop (ACE_ENV_SINGLE_ARG_PARAMETER);
+ ACE_CHECK_RETURN (0);
+ }
+
+ // If the SSL port is zero, then no SSLIOP tagged component was
+ // available in the IOR, meaning that there is no way to make a
+ // secure invocation. Throw an exception.
+ if (qop != ::Security::SecQOPNoProtection
+ && ssl_endpoint->ssl_component ().port == 0)
+ {
+ if (TAO_debug_level > 0)
+ {
+ ACE_ERROR ((LM_ERROR,
+ ACE_TEXT ("TAO_SSLIOP (%P|%t) ERROR: ")
+ ACE_TEXT ("Cannot make secure invocation since ")
+ ACE_TEXT ("no SSLIOP tagged component was ")
+ ACE_TEXT ("found in the IOR.\n")));
+ }
+
+ ACE_THROW_RETURN (CORBA::INV_POLICY (), // @@ Correct exception?
+ 0);
+ }
+
+ if ((!establish_trust && qop == ::Security::SecQOPNoProtection)
+ || ssl_endpoint->ssl_component ().port == 0)
+ {
+ return this->iiop_connect (ssl_endpoint,
+ resolver,
+ timeout
+ ACE_ENV_ARG_PARAMETER);
+ }
+
+ return this->ssliop_connect (ssl_endpoint,
+ qop,
+ trust,
+ resolver,
+ desc,
+ timeout
+ ACE_ENV_ARG_PARAMETER);
+}
+
+
+TAO_Profile *
+TAO::SSLIOP::Connector::create_profile (TAO_InputCDR& cdr)
+{
+ TAO_Profile *pfile = 0;
+ ACE_NEW_RETURN (pfile,
+ TAO_SSLIOP_Profile (this->orb_core ()),
+ 0);
+
+ const int r = pfile->decode (cdr);
+ if (r == -1)
+ {
+ pfile->_decr_refcnt ();
+ pfile = 0;
+ }
+
+ return pfile;
+}
+
+TAO_Profile *
+TAO::SSLIOP::Connector::make_profile (ACE_ENV_SINGLE_ARG_DECL)
+{
+ // The endpoint should be of the form:
+ // N.n@host:port/object_key
+ // or:
+ // host:port/object_key
+
+ TAO_Profile *profile = 0;
+ ACE_NEW_THROW_EX (profile,
+ TAO_SSLIOP_Profile (this->orb_core (),
+ 0), // SSL component
+ CORBA::NO_MEMORY (
+ CORBA::SystemException::_tao_minor_code (
+ TAO::VMCID,
+ ENOMEM),
+ CORBA::COMPLETED_NO));
+ ACE_CHECK_RETURN (0);
+
+ return profile;
+}
+
+
+TAO_Profile *
+TAO::SSLIOP::Connector::make_secure_profile (ACE_ENV_SINGLE_ARG_DECL)
+{
+ // The endpoint should be of the form:
+ // N.n@host:port/object_key
+ // or:
+ // host:port/object_key
+
+ TAO_Profile *profile = 0;
+ ACE_NEW_THROW_EX (profile,
+ TAO_SSLIOP_Profile (this->orb_core (),
+ 1), // SSL component
+ CORBA::NO_MEMORY (
+ CORBA::SystemException::_tao_minor_code (
+ TAO::VMCID,
+ ENOMEM),
+ CORBA::COMPLETED_NO));
+ ACE_CHECK_RETURN (0);
+
+ return profile;
+}
+
+
+
+TAO_Profile *
+TAO::SSLIOP::Connector::corbaloc_scan (const char *endpoint,
+ size_t &len
+ ACE_ENV_ARG_DECL)
+{
+ int ssl_only = 0;
+ if (this->check_prefix (endpoint) == 0)
+ {
+ ssl_only = 1;
+ }
+ else
+ {
+ if (this->TAO_IIOP_Connector::check_prefix (endpoint) != 0)
+ return 0;
+ }
+
+ // Determine the (first in a list of possibly > 1) endpoint address
+ const char *comma_pos = ACE_OS::strchr (endpoint,',');
+ const char *slash_pos = ACE_OS::strchr (endpoint,'/');
+ if (comma_pos == 0 && slash_pos == 0)
+ {
+ if (TAO_debug_level)
+ {
+ ACE_DEBUG ((LM_DEBUG,
+ ACE_TEXT("(%P|%t) SSLIOP_Connector::corbaloc_scan warning: ")
+ ACE_TEXT("supplied string contains no comma or slash: %s\n"),
+ endpoint));
+ }
+ len = ACE_OS::strlen (endpoint);
+ }
+ else if (slash_pos != 0 || comma_pos > slash_pos)
+ {
+ // The endpoint address does not extend past the first '/' or ','
+ len = slash_pos - endpoint;
+ }
+ else
+ {
+ len = comma_pos - endpoint;
+ }
+
+ //Create the corresponding profile
+ TAO_Profile *ptmp = 0;
+ if (ssl_only)
+ {
+ ptmp = this->make_secure_profile (ACE_ENV_SINGLE_ARG_PARAMETER);
+ ACE_CHECK_RETURN (0);
+ }
+ else
+ {
+ ptmp = this->make_profile (ACE_ENV_SINGLE_ARG_PARAMETER);
+ ACE_CHECK_RETURN (0);
+ }
+
+ return ptmp;
+}
+
+
+int
+TAO::SSLIOP::Connector::check_prefix (const char *endpoint)
+{
+ // Check for a valid string
+ if (!endpoint || !*endpoint) return -1; // Failure
+
+ const char *protocol[] = { "ssliop", "sslioploc" };
+
+ size_t first_slot = ACE_OS::strchr (endpoint, ':') - endpoint;
+
+ size_t len0 = ACE_OS::strlen (protocol[0]);
+ size_t len1 = ACE_OS::strlen (protocol[1]);
+
+ // Check for the proper prefix in the IOR. If the proper prefix
+ // isn't in the IOR then it is not an IOR we can use.
+ if (first_slot == len0 && ACE_OS::strncmp (endpoint, protocol[0], len0) == 0)
+ return 0;
+
+ if (first_slot == len1 && ACE_OS::strncmp (endpoint, protocol[1], len1) == 0)
+ return 0;
+
+ // Failure: not an SSLIOP IOR
+ // DO NOT throw an exception here.
+ return -1;
+}
+
+
+TAO_Transport*
+TAO::SSLIOP::Connector::iiop_connect (
+ TAO_SSLIOP_Endpoint *ssl_endpoint,
+ TAO::Profile_Transport_Resolver *resolver,
+ ACE_Time_Value *timeout
+ ACE_ENV_ARG_DECL)
+{
+ const ::SSLIOP::SSL &ssl_component = ssl_endpoint->ssl_component ();
+
+ // Only allow connection to the insecure IIOP port if the endpoint
+ // explicitly allows it, i.e. if the Security::NoProtection security
+ // association bit is set in the SSLIOP::SSL::target_supports field.
+ // The server performs the same permission check, so this check is
+ // an optimization since a connection will not be established
+ // needlessly, i.e. rejected due to lack of permission.
+ //
+ // Note that it is still possible for the standard non-SSLIOP aware
+ // IIOP pluggable protocol to attempt to connect to the insecure
+ // port. In that case, the server will have to prevent the
+ // connection, and subsequently the request, from completing.
+ if (ACE_BIT_DISABLED (ssl_component.target_supports,
+ ::Security::NoProtection))
+ ACE_THROW_RETURN (CORBA::NO_PERMISSION (
+ CORBA::SystemException::_tao_minor_code (
+ TAO::VMCID,
+ EPERM),
+ CORBA::COMPLETED_NO),
+ 0);
+
+ TAO_IIOP_Endpoint *iiop_endpoint = ssl_endpoint->iiop_endpoint ();
+
+ // An IIOP-only transport descriptor must be used instead of the one
+ // passed to this method since the latter is used for SSLIOP
+ // connections. Doing so prevents an IIOP-only cached transport
+ // from being associated with an SSLIOP connection.
+ TAO_Base_Transport_Property iiop_desc (iiop_endpoint);
+
+ // Note that the IIOP-only transport descriptor is used!
+ return
+ this->TAO::IIOP_SSL_Connector::connect (
+ resolver,
+ &iiop_desc,
+ timeout
+ ACE_ENV_ARG_PARAMETER);
+}
+
+TAO_Transport *
+TAO::SSLIOP::Connector::ssliop_connect (
+ TAO_SSLIOP_Endpoint *ssl_endpoint,
+ ::Security::QOP qop,
+ const ::Security::EstablishTrust &trust,
+ TAO::Profile_Transport_Resolver *resolver,
+ TAO_Transport_Descriptor_Interface *desc,
+ ACE_Time_Value *max_wait_time
+ ACE_ENV_ARG_DECL)
+{
+ const ::SSLIOP::SSL &ssl_component = ssl_endpoint->ssl_component ();
+
+ // @@ The following check for "required insecurity" seems odd, but
+ // I haven't seen anything in the Security spec that says this
+ // policy isn't possible.
+ // -Ossama
+
+ // If the endpoint requires an insecure connection, i.e. the
+ // Security::NoProtection security association bit in the
+ // SSLIOP::SSL::target_requires field is enabled, then prevent an
+ // SSL connection from occuring.
+ if (ACE_BIT_ENABLED (ssl_component.target_requires,
+ ::Security::NoProtection))
+ ACE_THROW_RETURN (CORBA::NO_PERMISSION (
+ CORBA::SystemException::_tao_minor_code (
+ TAO::VMCID,
+ EPERM),
+ CORBA::COMPLETED_NO),
+ 0);
+
+ // If the invocation wants integrity without confidentiality but the
+ // server does not support "no protection," then it won't be
+ // possible to provide integrity. In order to support integrity
+ // without confidentiality, encryption must be disabled but secure
+ // hashes must remain enabled. This is achieved using the "eNULL"
+ // cipher. However, the "eNULL" cipher is only enabled on the
+ // server side if "no protection" is enabled.
+ if (ACE_BIT_DISABLED (ssl_component.target_supports,
+ ::Security::NoProtection)
+ && qop == ::Security::SecQOPIntegrity)
+ ACE_THROW_RETURN (CORBA::INV_POLICY (), 0);
+
+ const ACE_INET_Addr &remote_address =
+ ssl_endpoint->object_addr ();
+
+ // Verify that the remote ACE_INET_Addr was initialized
+ // properly. Failure can occur if hostname lookup failed when
+ // initializing the remote ACE_INET_Addr.
+ if (remote_address.get_type () != AF_INET)
+ {
+ if (TAO_debug_level > 0)
+ {
+ ACE_DEBUG ((LM_DEBUG,
+ ACE_TEXT ("TAO (%P|%t) SSLIOP connection failed.\n")
+ ACE_TEXT ("TAO (%P|%t) This is most likely ")
+ ACE_TEXT ("due to a hostname lookup ")
+ ACE_TEXT ("failure.\n")));
+ }
+
+ return 0;
+ }
+
+ int result = 0;
+ TAO::SSLIOP::Connection_Handler *svc_handler = 0;
+ TAO_Transport *transport = 0;
+
+ // Before we can check the cache to find an existing connection, we
+ // need to make sure the ssl_endpoint is fully initialized with the
+ // local security information. This endpoint initalized by the
+ // profile does not (and cannot) contain the desired QOP, trust, or
+ // credential information which is necesary to uniquely identify
+ // this connection.
+ if (!ssl_endpoint->credentials_set ())
+ {
+ if (TAO_debug_level > 2)
+ ACE_DEBUG ((LM_ERROR,
+ ACE_TEXT ("TAO (%P|%t) Initializing SSLIOP_Endpoint \n")
+ ));
+
+ if (this->base_connector_.creation_strategy ()->make_svc_handler (
+ svc_handler) != 0)
+ {
+ if (TAO_debug_level > 0)
+ ACE_DEBUG ((LM_ERROR,
+ ACE_TEXT ("TAO (%P|%t) Unable to create SSLIOP ")
+ ACE_TEXT ("service handler.\n")));
+
+ return 0;
+ }
+
+ ACE_Auto_Basic_Ptr<TAO::SSLIOP::Connection_Handler>
+ safe_handler (svc_handler);
+ TAO::SSLIOP::OwnCredentials_var credentials =
+ this->retrieve_credentials (resolver->stub (),
+ svc_handler->peer ().ssl ()
+ ACE_ENV_ARG_PARAMETER);
+ ACE_CHECK_RETURN (0);
+
+ svc_handler = safe_handler.release ();
+ ssl_endpoint->set_sec_attrs (qop, trust, credentials.in());
+ }
+
+ // Check the Cache first for connections
+ if (this->orb_core ()->lane_resources ().transport_cache ().find_transport (
+ desc,
+ transport) == 0)
+ {
+ if (TAO_debug_level > 2)
+ ACE_DEBUG ((LM_DEBUG,
+ ACE_TEXT ("TAO (%P|%t) - SSLIOP_Connector::ssliop_connect, ")
+ ACE_TEXT ("got existing transport[%d]\n"),
+ transport->id ()));
+
+ // When the transport is not connected wait for completion
+ if (!transport->is_connected())
+ {
+ if (!this->wait_for_connection_completion (resolver,
+ transport,
+ max_wait_time))
+ {
+ ACE_ERROR ((LM_ERROR,
+ ACE_TEXT ("TAO (%P|%t) - SSLIOP_Connector::ssliop_connect,")
+ ACE_TEXT ("wait for completion failed\n")));
+
+ }
+ }
+ }
+ else
+ {
+ if (TAO_debug_level > 4)
+ ACE_DEBUG ((LM_DEBUG,
+ ACE_TEXT ("TAO (%P|%t) - SSLIOP_Connector::ssliop_connect, ")
+ ACE_TEXT ("making a new connection \n")));
+
+ // Purge connections (if necessary)
+ this->orb_core ()->lane_resources ().transport_cache ().purge ();
+
+ // The svc_handler is created beforehand so that we can get
+ // access to the underlying ACE_SSL_SOCK_Stream (the peer) and
+ // its SSL pointer member prior to descending into the
+ // ACE_Strategy_Connector (the "base_connector_"). This is
+ // thread-safe and reentrant, hence no synchronization is
+ // necessary.
+ //
+ // The make_svc_handler() method creates the service handler and
+ // bumps the #REFCOUNT# up one extra. The extra reference count
+ // in TAO_Connect_Creation_Strategy::make_svc_handler() is
+ // needed in the case when connection completion is pending and
+ // we are going to wait on a variable in the handler to changes,
+ // signifying success or failure. Note, that this increment
+ // cannot be done once the connect() returns since this might be
+ // too late if another thread pick up the completion and
+ // potentially deletes the handler before we get a chance to
+ // increment the reference count.
+ if (svc_handler == 0 &&
+ this->base_connector_.creation_strategy ()->make_svc_handler (
+ svc_handler) != 0)
+ {
+ if (TAO_debug_level > 0)
+ ACE_DEBUG ((LM_ERROR,
+ ACE_TEXT ("TAO (%P|%t) Unable to create SSLIOP ")
+ ACE_TEXT ("service handler.\n")));
+
+ return 0;
+ }
+
+ ACE_Auto_Basic_Ptr<TAO::SSLIOP::Connection_Handler>
+ safe_handler (svc_handler);
+
+ // Setup the establishment of trust connection properties, if
+ // any.
+ int verify_mode = 0;
+
+ // On the server side, "trust_in_client" requires that a peer
+ // (client) certificate exist. Fail if one doesn't exist.
+ //
+ // In SSLIOP's case, trust_in_client also implies
+ // trust_in_target.
+ if (trust.trust_in_client)
+ verify_mode = SSL_VERIFY_PEER | SSL_VERIFY_FAIL_IF_NO_PEER_CERT;
+
+ // Require verification of the target's certificate.
+ else if (trust.trust_in_target)
+ verify_mode = SSL_VERIFY_PEER;
+
+ // Trust in neither the client nor the target is explicitly
+ // specified. Use the default setting.
+ else
+ verify_mode =
+ ACE_SSL_Context::instance ()->default_verify_mode ();
+
+ ::SSL_set_verify (svc_handler->peer ().ssl (),
+ verify_mode,
+ 0);
+
+ // The "eNULL" cipher disables encryption but still uses a
+ // secure hash (e.g. SHA1 or MD5) to ensure integrity. (Try the
+ // command "openssl ciphers -v eNULL".)
+ //
+ // Note that it is not possible to completely disable protection
+ // here.
+ if ((qop == ::Security::SecQOPNoProtection
+ || qop == ::Security::SecQOPIntegrity)
+ && ::SSL_set_cipher_list (svc_handler->peer ().ssl (),
+ "eNULL") == 0)
+ {
+ if (TAO_debug_level > 0)
+ ACE_DEBUG ((LM_ERROR,
+ ACE_TEXT ("(%P|%t) Unable to set eNULL ")
+ ACE_TEXT ("SSL cipher.\n")));
+
+ ACE_THROW_RETURN (CORBA::INV_POLICY (), 0);
+ }
+
+ svc_handler = safe_handler.release ();
+
+ // Get the right synch options
+ ACE_Synch_Options synch_options;
+
+ this->active_connect_strategy_->synch_options (max_wait_time,
+ synch_options);
+
+ // If we don't need to block for a transport just set the timeout to
+ // be zero.
+ ACE_Time_Value tmp_zero (ACE_Time_Value::zero);
+ if (!resolver->blocked_connect ())
+ {
+ synch_options.timeout (ACE_Time_Value::zero);
+ max_wait_time = &tmp_zero;
+ }
+
+ // We obtain the transport in the <svc_handler> variable. As we
+ // know now that the connection is not available in Cache we can
+ // make a new connection
+ result = this->base_connector_.connect (svc_handler,
+ remote_address,
+ synch_options);
+
+ // There are three possibilities from calling connect(): (a)
+ // connection succeeds immediately - in this case, the
+ // #REFCOUNT# on the handler is two; (b) connection completion
+ // is pending - in this case, the #REFCOUNT# on the handler is
+ // also two; (c) connection fails immediately - in this case,
+ // the #REFCOUNT# on the handler is one since close() gets
+ // called on the handler.
+
+ // Make sure that we always do a remove_reference
+ ACE_Event_Handler_var svc_handler_auto_ptr (svc_handler);
+
+ transport =
+ svc_handler->transport ();
+
+ if (result == -1)
+ {
+ // No immediate result, wait for completion
+ if (errno == EWOULDBLOCK)
+ {
+ // Try to wait until connection completion. Incase we block, then we
+ // get a connected transport or not. In case of non block we get
+ // a connected or not connected transport
+ if (!this->wait_for_connection_completion (resolver,
+ transport,
+ max_wait_time))
+ {
+ if (TAO_debug_level > 2)
+ ACE_ERROR ((LM_ERROR, "TAO (%P|%t) - SSLIOP_Connector::"
+ "ssliop_connect, "
+ "wait for completion failed\n"));
+ }
+ }
+ else
+ {
+ // Transport is not usable
+ transport = 0;
+ }
+ }
+
+ // In case of errors transport is zero
+ if (transport == 0)
+ {
+ // Give users a clue to the problem.
+ if (TAO_debug_level)
+ {
+ char buffer [MAXHOSTNAMELEN + 6 + 1];
+ ssl_endpoint->addr_to_string (buffer,
+ sizeof (buffer) - 1);
+ ACE_DEBUG ((LM_ERROR,
+ ACE_TEXT ("TAO (%P|%t) - SSL connection to ")
+ ACE_TEXT ("<%s:%d> failed (%p)\n"),
+ buffer,
+ remote_address.get_port_number (),
+ ACE_TEXT ("errno")));
+ }
+
+ return 0;
+ }
+
+ // At this point, the connection has be successfully connected.
+ // #REFCOUNT# is one.
+ if (TAO_debug_level > 2)
+ ACE_DEBUG ((LM_DEBUG,
+ "TAO (%P|%t) - SSLIOP_Connector::ssliop_connect, "
+ "new SSL connection to port %d on transport[%d]\n",
+ remote_address.get_port_number (),
+ svc_handler->peer ().get_handle ()));
+
+ // Add the handler to Cache
+ int retval =
+ this->orb_core ()->
+ lane_resources ().transport_cache ().cache_transport (desc,
+ transport);
+
+ // Failure in adding to cache.
+ if (retval != 0)
+ {
+ // Close the handler.
+ svc_handler->close ();
+
+ if (TAO_debug_level > 0)
+ {
+ ACE_ERROR ((LM_ERROR,
+ "TAO (%P|%t) - SLIIOP_Connector::ssliop_connect, "
+ "could not add the new connection to cache\n"));
+ }
+
+ return 0;
+ }
+
+ if (transport->is_connected () &&
+ transport->wait_strategy ()->register_handler () != 0)
+ {
+ // Registration failures.
+
+ // Purge from the connection cache, if we are not in the cache, this
+ // just does nothing.
+ (void) transport->purge_entry ();
+
+ // Close the handler.
+ (void) transport->close_connection ();
+
+ if (TAO_debug_level > 0)
+ ACE_ERROR ((LM_ERROR,
+ "TAO (%P|%t) - SSLIOP_Connector [%d]::ssliop_connect, "
+ "could not register the transport "
+ "in the reactor.\n",
+ transport->id ()));
+
+ return 0;
+ }
+ }
+
+ return transport;
+}
+
+TAO::SSLIOP::OwnCredentials *
+TAO::SSLIOP::Connector::retrieve_credentials (TAO_Stub *stub,
+ SSL *ssl
+ ACE_ENV_ARG_DECL)
+{
+ // Check if the user overrode the default invocation credentials.
+ CORBA::Policy_var policy =
+ stub->get_policy (::SecurityLevel3::ContextEstablishmentPolicyType
+ ACE_ENV_ARG_PARAMETER);
+ ACE_CHECK_RETURN (TAO::SSLIOP::OwnCredentials::_nil ());
+
+ SecurityLevel3::ContextEstablishmentPolicy_var creds_policy =
+ SecurityLevel3::ContextEstablishmentPolicy::_narrow (
+ policy.in ()
+ ACE_ENV_ARG_PARAMETER);
+ ACE_CHECK_RETURN (TAO::SSLIOP::OwnCredentials::_nil ());
+
+ TAO::SSLIOP::OwnCredentials_var ssliop_credentials;
+
+ // Set the Credentials (X.509 certificates and corresponding private
+ // keys) to be used for this invocation.
+ if (!CORBA::is_nil (creds_policy.in ()))
+ {
+ SecurityLevel3::OwnCredentialsList_var creds_list =
+ creds_policy->creds_list (ACE_ENV_SINGLE_ARG_PARAMETER);
+ ACE_CHECK_RETURN (TAO::SSLIOP::OwnCredentials::_nil ());
+
+ if (creds_list->length () > 0)
+ {
+ // Assume that we've got an SSLIOP credential.
+ SecurityLevel3::Credentials_ptr credentials =
+ creds_list[0u];
+
+ ssliop_credentials =
+ TAO::SSLIOP::OwnCredentials::_narrow (credentials
+ ACE_ENV_ARG_PARAMETER);
+ ACE_CHECK_RETURN (TAO::SSLIOP::OwnCredentials::_nil ());
+
+ if (!CORBA::is_nil (ssliop_credentials.in ()))
+ {
+ TAO::SSLIOP::X509_var x509 = ssliop_credentials->x509 ();
+ if (::SSL_use_certificate (ssl, x509.in ()) != 1)
+ return TAO::SSLIOP::OwnCredentials::_nil ();
+
+ TAO::SSLIOP::EVP_PKEY_var evp = ssliop_credentials->evp ();
+ if (evp.in () != 0
+ && ::SSL_use_PrivateKey (ssl, evp.in ()) != 1)
+ {
+ // Invalidate the certificate we just set.
+ (void) ::SSL_use_certificate (ssl, 0);
+ return TAO::SSLIOP::OwnCredentials::_nil ();
+ }
+ }
+ }
+ }
+ else
+ {
+ // Use the default certificate and private key, i.e. the one set
+ // in the SSL_CTX that was used when creating the SSL data
+ // structure.
+
+ /**
+ * @todo Check if the CredentialsCurator contains a default set
+ * of SSLIOP OwnCredentials.
+ */
+
+ TAO::SSLIOP::OwnCredentials_ptr & c = ssliop_credentials.out ();
+ ACE_NEW_THROW_EX (c,
+ TAO::SSLIOP::OwnCredentials (
+ ::SSL_get_certificate (ssl),
+ ::SSL_get_privatekey (ssl)),
+ CORBA::NO_MEMORY ());
+ ACE_CHECK_RETURN (TAO::SSLIOP::OwnCredentials::_nil ());
+ }
+
+ return ssliop_credentials._retn ();
+}
+
+int
+TAO::SSLIOP::Connector::cancel_svc_handler (
+ TAO_Connection_Handler * svc_handler)
+{
+ TAO::SSLIOP::Connection_Handler* handler=
+ dynamic_cast<TAO::SSLIOP::Connection_Handler*> (svc_handler);
+
+ if (handler)
+ // Cancel from the connector
+ return this->base_connector_.cancel (handler);
+
+ return -1;
+}
+
+TAO_END_VERSIONED_NAMESPACE_DECL
diff --git a/TAO/orbsvcs/orbsvcs/SSLIOP/SSLIOP_Connector.h b/TAO/orbsvcs/orbsvcs/SSLIOP/SSLIOP_Connector.h
new file mode 100644
index 00000000000..99578662196
--- /dev/null
+++ b/TAO/orbsvcs/orbsvcs/SSLIOP/SSLIOP_Connector.h
@@ -0,0 +1,162 @@
+// -*- C++ -*-
+
+//=============================================================================
+/**
+ * @file SSLIOP_Connector.h
+ *
+ * $Id$
+ *
+ * SSLIOP specific connector processing
+ *
+ * @author Carlos O'Ryan
+ * @author Ossama Othman
+ */
+//=============================================================================
+
+
+#ifndef TAO_SSLIOP_CONNECTOR_H
+#define TAO_SSLIOP_CONNECTOR_H
+
+#include /**/ "ace/pre.h"
+
+#include "ace/config-all.h"
+
+#if !defined (ACE_LACKS_PRAGMA_ONCE)
+# pragma once
+#endif /* ACE_LACKS_PRAGMA_ONCE */
+
+#include "orbsvcs/SSLIOP/IIOP_SSL_Connector.h"
+#include "orbsvcs/SSLIOP/SSLIOP_Connection_Handler.h"
+
+#include "ace/SSL/SSL_SOCK_Connector.h"
+
+TAO_BEGIN_VERSIONED_NAMESPACE_DECL
+
+/// Forward declarations.
+class TAO_Base_Transport_Property;
+
+class TAO_SSLIOP_Endpoint;
+
+namespace TAO
+{
+ namespace SSLIOP
+ {
+ class OwnCredentials;
+
+ /**
+ * @class Connector
+ *
+ * @brief SSLIOP-specific Connector bridge for pluggable protocols.
+ *
+ * Concrete instance of the TAO_Connector class. Responsible
+ * for establishing a connection with a server and is called from
+ * the Connector_Registry.
+ */
+ class Connector : public TAO::IIOP_SSL_Connector
+ {
+ public:
+
+ /// Constructor.
+ Connector (::Security::QOP qop);
+
+ /**
+ * @name The TAO_Connector methods
+ *
+ * Please check the documentation in Transport_Connector.h
+ */
+ //@{
+ virtual int open (TAO_ORB_Core *orb_core);
+ virtual int close (void);
+ virtual TAO_Transport *connect (TAO::Profile_Transport_Resolver *r,
+ TAO_Transport_Descriptor_Interface *desc,
+ ACE_Time_Value *timeout
+ ACE_ENV_ARG_DECL);
+
+ virtual TAO_Profile *create_profile (TAO_InputCDR& cdr);
+ virtual int check_prefix (const char *endpoint);
+ virtual TAO_Profile * corbaloc_scan (const char *ior,
+ size_t &len
+ ACE_ENV_ARG_DECL);
+
+ //@}
+
+ protected:
+
+ /**
+ * @name @c TAO_Connector Methods
+ *
+ * Methods required by the @c TAO_Connector base class.
+ *
+ * @see @c TAO_Connector
+ */
+ //@{
+ virtual TAO_Profile * make_profile (ACE_ENV_SINGLE_ARG_DECL);
+ virtual int cancel_svc_handler (TAO_Connection_Handler * svc_handler);
+ //@}
+
+ /// SSL-specific profile
+ TAO_Profile * make_secure_profile (ACE_ENV_SINGLE_ARG_DECL);
+
+ /// IIOP-specific connection establishment.
+ /**
+ * @note The IIOP endpoint is extracted from the SSLIOP endpoint.
+ */
+ TAO_Transport* iiop_connect (TAO_SSLIOP_Endpoint *ssliop_endpoint,
+ TAO::Profile_Transport_Resolver *r,
+ ACE_Time_Value *timeout
+ ACE_ENV_ARG_DECL);
+
+ /// SSLIOP-specific connection establishment.
+ TAO_Transport* ssliop_connect (TAO_SSLIOP_Endpoint *ssliop_endpoint,
+ ::Security::QOP qop,
+ const ::Security::EstablishTrust &trust,
+ TAO::Profile_Transport_Resolver *r,
+ TAO_Transport_Descriptor_Interface *desc,
+ ACE_Time_Value *timeout
+ ACE_ENV_ARG_DECL);
+
+ /// Retrieve SSLIOP credentials from the policy overrides list
+ /// and set up the underlying SSL connection to use the X.509
+ /// certificates stored within them.
+ TAO::SSLIOP::OwnCredentials * retrieve_credentials (TAO_Stub *stub,
+ SSL *ssl
+ ACE_ENV_ARG_DECL);
+
+ public:
+
+ typedef TAO_Connect_Concurrency_Strategy<Connection_Handler>
+ CONNECT_CONCURRENCY_STRATEGY;
+
+ typedef TAO_Connect_Creation_Strategy<Connection_Handler>
+ CONNECT_CREATION_STRATEGY;
+
+ typedef ACE_Connect_Strategy<Connection_Handler,
+ ACE_SSL_SOCK_CONNECTOR>
+ CONNECT_STRATEGY;
+
+ typedef ACE_Strategy_Connector<Connection_Handler,
+ ACE_SSL_SOCK_CONNECTOR>
+ BASE_CONNECTOR;
+
+ private:
+
+ /// If zero, connect to IIOP over SSL port by default.
+ /// Otherwise, connect to the insecure IIOP port.
+ ::Security::QOP qop_;
+
+ /// Our connect strategy
+ CONNECT_STRATEGY connect_strategy_;
+
+ /// The connector initiating connection requests for IIOP.
+ BASE_CONNECTOR base_connector_;
+
+ };
+
+ } // End SSLIOP namespace.
+} // End TAO namespace.
+
+TAO_END_VERSIONED_NAMESPACE_DECL
+
+#include /**/ "ace/post.h"
+
+#endif /* TAO_SSLIOP_CONNECTOR_H */
diff --git a/TAO/orbsvcs/orbsvcs/SSLIOP/SSLIOP_Credentials.cpp b/TAO/orbsvcs/orbsvcs/SSLIOP/SSLIOP_Credentials.cpp
new file mode 100644
index 00000000000..9f8804ad604
--- /dev/null
+++ b/TAO/orbsvcs/orbsvcs/SSLIOP/SSLIOP_Credentials.cpp
@@ -0,0 +1,267 @@
+#include "orbsvcs/SSLIOP/SSLIOP_Credentials.h"
+
+#include "tao/ORB_Constants.h"
+
+#include "ace/SString.h"
+
+
+ACE_RCSID (SSLIOP,
+ SSLIOP_Credentials,
+ "$Id$")
+
+
+#if !defined (__ACE_INLINE__)
+# include "orbsvcs/SSLIOP/SSLIOP_Credentials.inl"
+#endif /* __ACE_INLINE__ */
+
+TAO_BEGIN_VERSIONED_NAMESPACE_DECL
+
+TAO::SSLIOP_Credentials::SSLIOP_Credentials (::X509 *cert, ::EVP_PKEY *evp)
+ : x509_ (TAO::SSLIOP::OpenSSL_traits< ::X509 >::_duplicate (cert)),
+ evp_ (TAO::SSLIOP::OpenSSL_traits< ::EVP_PKEY >::_duplicate (evp)),
+ id_ (),
+ creds_usage_ (SecurityLevel3::CU_Indefinite),
+ expiry_time_ (),
+ creds_state_ (SecurityLevel3::CS_Invalid)
+{
+ ::X509 *x = cert;
+
+ if (x != 0)
+ {
+ // We use the X.509 certificate's serial number as the
+ // credentials Id.
+ BIGNUM * bn = ASN1_INTEGER_to_BN (::X509_get_serialNumber (x), 0);
+ if (BN_is_zero (bn))
+ this->id_ = CORBA::string_dup ("X509: 00");
+ else
+ {
+ char * id = BN_bn2hex (bn);
+
+ ACE_CString s =
+ ACE_CString ("X509: ")
+ + ACE_CString (const_cast<const char *> (id));
+
+ this->id_ = CORBA::string_dup (s.c_str ());
+
+#ifdef OPENSSL_free
+ OPENSSL_free (id);
+#else
+ // Older versions of OpenSSL didn't define the OpenSSL
+ // macro.
+ CRYPTO_free (id);
+#endif /* OPENSSL_free */
+ }
+
+ // -------------------------------------------
+
+ TimeBase::UtcT & t = this->expiry_time_;
+
+ const ASN1_TIME * exp = X509_get_notAfter (x);
+
+ if (exp->length > ACE_SIZEOF_LONG_LONG)
+ {
+ // @@ Will this ever happen?
+
+ // Overflow!
+ t.time = ACE_UINT64_LITERAL (0xffffffffffffffff);
+ }
+ else
+ {
+ t.time = 0;
+ for (int i = 0; i < exp->length; ++i)
+ {
+ t.time <<= 8;
+ t.time |= (unsigned char) exp->data[i];
+ }
+ }
+ }
+}
+
+TAO::SSLIOP_Credentials::~SSLIOP_Credentials (void)
+{
+}
+
+char *
+TAO::SSLIOP_Credentials::creds_id (ACE_ENV_SINGLE_ARG_DECL_NOT_USED)
+ ACE_THROW_SPEC ((CORBA::SystemException))
+{
+ return CORBA::string_dup (this->id_.in ());
+}
+
+SecurityLevel3::CredentialsUsage
+TAO::SSLIOP_Credentials::creds_usage (ACE_ENV_SINGLE_ARG_DECL_NOT_USED)
+ ACE_THROW_SPEC ((CORBA::SystemException))
+{
+ return SecurityLevel3::CU_Indefinite;
+}
+
+TimeBase::UtcT
+TAO::SSLIOP_Credentials::expiry_time (ACE_ENV_SINGLE_ARG_DECL_NOT_USED)
+ ACE_THROW_SPEC ((CORBA::SystemException))
+{
+ return this->expiry_time_;
+}
+
+SecurityLevel3::CredentialsState
+TAO::SSLIOP_Credentials::creds_state (ACE_ENV_SINGLE_ARG_DECL)
+ ACE_THROW_SPEC ((CORBA::SystemException))
+{
+ const ::X509 *x = this->x509_.in ();
+
+ // The pointer to the underlying X509 structure should only be zero
+ // if destroy() was called on this Credentials object.
+ if (x == 0)
+ ACE_THROW_RETURN (CORBA::BAD_OPERATION (),
+ SecurityLevel3::CS_Invalid);
+
+ if (this->creds_state_ == SecurityLevel3::CS_Valid)
+ {
+ // Make sure the X.509 certificate is still valid.
+
+ const int after_status =
+ ::X509_cmp_current_time (X509_get_notAfter (x));
+
+ if (after_status == 0)
+ {
+ // Error in certificate's "not after" field.
+ ACE_THROW_RETURN (CORBA::BAD_PARAM (), // @@ Correct exception?
+ SecurityLevel3::CS_Invalid);
+ }
+ else if (after_status > 0) // Certificate has expired.
+ this->creds_state_ = SecurityLevel3::CS_Expired;
+ }
+ else if (this->creds_state_ == SecurityLevel3::CS_Invalid)
+ {
+ // Check if the X.509 certificate has become valid.
+
+ const int before_status =
+ ::X509_cmp_current_time (X509_get_notBefore (x));
+
+ if (before_status == 0)
+ {
+ // Error in certificate's "not before" field.
+ ACE_THROW_RETURN (CORBA::BAD_PARAM (), // @@ Correct exception?
+ SecurityLevel3::CS_Invalid);
+ }
+ else if (before_status < 0) // Certificate is now valid.
+ this->creds_state_ = SecurityLevel3::CS_Valid;
+ }
+
+ return this->creds_state_;
+}
+
+char *
+TAO::SSLIOP_Credentials::add_relinquished_listener (
+ SecurityLevel3::RelinquishedCredentialsListener_ptr /* listener */
+ ACE_ENV_ARG_DECL)
+ ACE_THROW_SPEC ((CORBA::SystemException))
+{
+ ACE_THROW_RETURN (CORBA::NO_IMPLEMENT (), 0);
+}
+
+void
+TAO::SSLIOP_Credentials::remove_relinquished_listener (const char * /* id */
+ ACE_ENV_ARG_DECL)
+ ACE_THROW_SPEC ((CORBA::SystemException))
+{
+ ACE_THROW (CORBA::NO_IMPLEMENT ());
+}
+
+bool
+TAO::SSLIOP_Credentials::operator== (const TAO::SSLIOP_Credentials &rhs)
+{
+ ::X509 * xa = this->x509_.in ();
+ ::X509 * xb = rhs.x509_.in ();
+ // EVP_PKEY *ea = this->evp_.in ();
+ // EVP_PKEY *eb = rhs.evp_.in ();
+
+ ACE_DECLARE_NEW_CORBA_ENV;
+ // No need for a full blown ACE_TRY/CATCH block.
+
+ const SecurityLevel3::CredentialsType lct =
+ this->creds_type (ACE_ENV_SINGLE_ARG_PARAMETER);
+ ACE_CHECK_RETURN (false);
+
+ const SecurityLevel3::CredentialsType rct =
+ const_cast<TAO::SSLIOP_Credentials &> (rhs).creds_type (
+ ACE_ENV_SINGLE_ARG_PARAMETER);
+ ACE_CHECK_RETURN (false);
+
+ // Don't bother check the creds_id and expiry_time attributes. They
+ // are checked implicitly by the below X509_cmp() call.
+ //
+ // Additionally, the creds_state attribute is not included in the
+ // check since it is not considered important when distinguishing
+ // between two Credentials.
+
+ return
+ lct == rct
+ && this->creds_usage_ == rhs.creds_usage_
+ && ((xa == xb) || (xa != 0 && xb != 0 && ::X509_cmp (xa, xb) == 0))
+// && ((ea == eb) || (ea != 0 && eb != 0 && ::EVP_PKEY_cmp (ea, eb) == 0))
+ ;
+}
+
+CORBA::ULong
+TAO::SSLIOP_Credentials::hash (void) const
+{
+ ::X509 * x509 = this->x509_.in ();
+
+ return (x509 == 0 ? 0 : ::X509_issuer_name_hash (x509));
+}
+
+TAO::SSLIOP::Credentials_ptr
+TAO::SSLIOP_Credentials::_narrow (CORBA::Object_ptr obj
+ ACE_ENV_ARG_DECL_NOT_USED)
+{
+ return TAO::SSLIOP_Credentials::_duplicate (
+ dynamic_cast<TAO::SSLIOP_Credentials *> (obj));
+}
+
+TAO::SSLIOP::Credentials_ptr
+TAO::SSLIOP_Credentials::_duplicate (TAO::SSLIOP::Credentials_ptr obj)
+{
+ if (!CORBA::is_nil (obj))
+ obj->_add_ref ();
+
+ return obj;
+}
+
+// -----------------------------------------------------------
+
+TAO::SSLIOP::Credentials_ptr
+tao_TAO_SSLIOP_Credentials_duplicate (TAO::SSLIOP::Credentials_ptr p)
+{
+ return TAO::SSLIOP_Credentials::_duplicate (p);
+}
+
+void
+tao_TAO_SSLIOP_Credentials_release (TAO::SSLIOP::Credentials_ptr p)
+{
+ CORBA::release (p);
+}
+
+TAO::SSLIOP::Credentials_ptr
+tao_TAO_SSLIOP_Credentials_nil (void)
+{
+ return TAO::SSLIOP_Credentials::_nil ();
+}
+
+TAO::SSLIOP::Credentials_ptr
+tao_TAO_SSLIOP_Credentials_narrow (CORBA::Object *p
+ ACE_ENV_ARG_DECL)
+{
+ return TAO::SSLIOP_Credentials::_narrow (p
+ ACE_ENV_ARG_PARAMETER);
+}
+
+CORBA::Object_ptr
+tao_TAO_SSLIOP_Credentials_upcast (void *src)
+{
+ TAO::SSLIOP_Credentials **tmp =
+ static_cast<TAO::SSLIOP_Credentials **> (src);
+
+ return *tmp;
+}
+
+TAO_END_VERSIONED_NAMESPACE_DECL
diff --git a/TAO/orbsvcs/orbsvcs/SSLIOP/SSLIOP_Credentials.h b/TAO/orbsvcs/orbsvcs/SSLIOP/SSLIOP_Credentials.h
new file mode 100644
index 00000000000..5fdf4f78e6c
--- /dev/null
+++ b/TAO/orbsvcs/orbsvcs/SSLIOP/SSLIOP_Credentials.h
@@ -0,0 +1,186 @@
+// -*- C++ -*-
+
+//=============================================================================
+/**
+ * @file SSLIOP_Credentials.h
+ *
+ * $Id$
+ *
+ * @author Ossama Othman <ossama@dre.vanderbilt.edu>
+ */
+//=============================================================================
+
+#ifndef TAO_SSLIOP_CREDENTIALS_H
+#define TAO_SSLIOP_CREDENTIALS_H
+
+#include /**/ "ace/pre.h"
+
+#include "orbsvcs/SSLIOP/SSLIOP_Export.h"
+
+#if !defined (ACE_LACKS_PRAGMA_ONCE)
+#pragma once
+#endif /* ACE_LACKS_PRAGMA_ONCE */
+
+#include "orbsvcs/SSLIOP/SSLIOP_X509.h"
+#include "orbsvcs/SSLIOP/SSLIOP_EVP_PKEY.h"
+#include "orbsvcs/SecurityLevel3C.h"
+#include "tao/LocalObject.h"
+
+
+TAO_BEGIN_VERSIONED_NAMESPACE_DECL
+
+namespace TAO
+{
+ class SSLIOP_Credentials;
+
+ namespace SSLIOP
+ {
+ typedef SSLIOP_Credentials* Credentials_ptr;
+ typedef TAO_Pseudo_Var_T<SSLIOP_Credentials> Credentials_var;
+ typedef TAO_Pseudo_Out_T<SSLIOP_Credentials> Credentials_out;
+ }
+
+ /**
+ * @class SSLIOP_Credentials
+ *
+ * @brief SSLIOP-specific implementation of the
+ * SecurityLevel3::Credentials interface.
+ *
+ * This class encapsulates the X.509 certificate associated with a
+ * given a principal.
+ *
+ * @note Why is this class not the TAO::SSLIOP namespace? Because
+ * brain damaged MSVC++ 6 cannot call a base class
+ * constructor of class declared in a namespace that is more
+ * than one level deep in a sub-class base member
+ * initializer list.
+ */
+ class TAO_SSLIOP_Export SSLIOP_Credentials
+ : public virtual SecurityLevel3::Credentials,
+ public virtual TAO_Local_RefCounted_Object
+ {
+ public:
+ typedef SSLIOP::Credentials_ptr _ptr_type;
+ typedef SSLIOP::Credentials_var _var_type;
+ typedef SSLIOP::Credentials_out _out_type;
+
+ /// Constructor
+ SSLIOP_Credentials (::X509 * cert, ::EVP_PKEY * evp);
+
+ /**
+ * @name SecurityLevel3::Credentials Methods
+ *
+ * Methods required by the SecurityLevel3::Credentials
+ * interface.
+ */
+ //@{
+ virtual char * creds_id (ACE_ENV_SINGLE_ARG_DECL)
+ ACE_THROW_SPEC ((CORBA::SystemException));
+
+ virtual
+ SecurityLevel3::CredentialsType creds_type (ACE_ENV_SINGLE_ARG_DECL)
+ ACE_THROW_SPEC ((CORBA::SystemException)) = 0;
+
+ virtual SecurityLevel3::CredentialsUsage creds_usage (
+ ACE_ENV_SINGLE_ARG_DECL)
+ ACE_THROW_SPEC ((CORBA::SystemException));
+
+ virtual TimeBase::UtcT expiry_time (ACE_ENV_SINGLE_ARG_DECL)
+ ACE_THROW_SPEC ((CORBA::SystemException));
+
+ virtual SecurityLevel3::CredentialsState creds_state (
+ ACE_ENV_SINGLE_ARG_DECL)
+ ACE_THROW_SPEC ((CORBA::SystemException));
+
+ virtual char * add_relinquished_listener (
+ SecurityLevel3::RelinquishedCredentialsListener_ptr listener
+ ACE_ENV_ARG_DECL)
+ ACE_THROW_SPEC ((CORBA::SystemException));
+
+ virtual void remove_relinquished_listener (const char * id
+ ACE_ENV_ARG_DECL)
+ ACE_THROW_SPEC ((CORBA::SystemException));
+ //@}
+
+
+ //@{
+ /// Return a pointer to the underlying X.509 certificate.
+ /**
+ * @note Caller owns the returned object. Use a
+ * TAO::SSLIOP::X509_var.
+ */
+ ::X509 *x509 (void);
+ //@}
+
+ /// Return a pointer to the underlying private key.
+ /**
+ * @return Non-zero value if private key is used.
+ *
+ * @note Caller owns the returned object. Use a
+ * TAO::SSLIOP::EVP_PKEY_var.
+ */
+ ::EVP_PKEY *evp (void);
+ //@}
+
+ bool operator== (const SSLIOP_Credentials &rhs);
+
+ CORBA::ULong hash (void) const;
+
+ // The static operations.
+ static SSLIOP::Credentials_ptr _duplicate (SSLIOP::Credentials_ptr obj);
+
+ static SSLIOP::Credentials_ptr _narrow (CORBA::Object_ptr obj
+ ACE_ENV_ARG_DECL);
+
+ static SSLIOP::Credentials_ptr _nil (void)
+ {
+ return (SSLIOP::Credentials_ptr) 0;
+ }
+
+ //@}
+
+ protected:
+
+ /// Destructor.
+ /**
+ * Protected destructor to enforce proper memory management
+ * through the reference counting mechanism.
+ */
+ ~SSLIOP_Credentials (void);
+
+ protected:
+
+ /// Reference to the X.509 certificate associated with this SSLIOP
+ /// Credentials object.
+ SSLIOP::X509_var x509_;
+
+ /// Reference to the private key associated with the X.509
+ /// certificate.
+ SSLIOP::EVP_PKEY_var evp_;
+
+ /// Credentials Identifier.
+ CORBA::String_var id_;
+
+ /// The intended usage of the Credentials.
+ SecurityLevel3::CredentialsUsage creds_usage_;
+
+ /// The time these Credentials expire.
+ TimeBase::UtcT expiry_time_;
+
+ /// The validity of the Credentials.
+ SecurityLevel3::CredentialsState creds_state_;
+
+ };
+
+// } // End SSLIOP namespace
+} // End TAO namespace
+
+TAO_END_VERSIONED_NAMESPACE_DECL
+
+#if defined (__ACE_INLINE__)
+# include "orbsvcs/SSLIOP/SSLIOP_Credentials.inl"
+#endif /* __ACE_INLINE__ */
+
+#include /**/ "ace/post.h"
+
+#endif /* TAO_SSLIOP_CREDENTIALS_H */
diff --git a/TAO/orbsvcs/orbsvcs/SSLIOP/SSLIOP_Credentials.inl b/TAO/orbsvcs/orbsvcs/SSLIOP/SSLIOP_Credentials.inl
new file mode 100644
index 00000000000..42970eb800f
--- /dev/null
+++ b/TAO/orbsvcs/orbsvcs/SSLIOP/SSLIOP_Credentials.inl
@@ -0,0 +1,21 @@
+// -*- C++ -*-
+//
+// $Id$
+
+TAO_BEGIN_VERSIONED_NAMESPACE_DECL
+
+ACE_INLINE ::X509 *
+TAO::SSLIOP_Credentials::x509 (void)
+{
+ return
+ TAO::SSLIOP::OpenSSL_traits< ::X509 >::_duplicate (this->x509_.in ());
+}
+
+ACE_INLINE ::EVP_PKEY *
+TAO::SSLIOP_Credentials::evp (void)
+{
+ return
+ TAO::SSLIOP::OpenSSL_traits< ::EVP_PKEY >::_duplicate (this->evp_.in ());
+}
+
+TAO_END_VERSIONED_NAMESPACE_DECL
diff --git a/TAO/orbsvcs/orbsvcs/SSLIOP/SSLIOP_CredentialsAcquirer.cpp b/TAO/orbsvcs/orbsvcs/SSLIOP/SSLIOP_CredentialsAcquirer.cpp
new file mode 100644
index 00000000000..fcccd07cc67
--- /dev/null
+++ b/TAO/orbsvcs/orbsvcs/SSLIOP/SSLIOP_CredentialsAcquirer.cpp
@@ -0,0 +1,388 @@
+// $Id$
+
+#include "orbsvcs/SSLIOP/SSLIOP_CredentialsAcquirer.h"
+#include "orbsvcs/SSLIOP/SSLIOP_OwnCredentials.h"
+
+#include "tao/debug.h"
+#include "tao/ORB_Constants.h"
+
+#include "ace/SSL/SSL_Context.h"
+
+#include "ace/OS_NS_stdio.h"
+
+#include <openssl/x509.h>
+#include <openssl/pem.h>
+
+
+ACE_RCSID (SSLIOP,
+ SSLIOP_CredentialsAcquirer,
+ "$Id$")
+
+
+// -------------------------------------------------------
+
+#if (defined (TAO_HAS_VERSIONED_NAMESPACE) && TAO_HAS_VERSIONED_NAMESPACE == 1)
+# define TAO_SSLIOP_PASSWORD_CALLBACK_NAME ACE_PREPROC_CONCATENATE(TAO_VERSIONED_NAMESPACE_NAME, _TAO_SSLIOP_password_callback)
+#else
+# define TAO_SSLIOP_PASSWORD_CALLBACK_NAME TAO_SSLIOP_password_callback
+#endif /* TAO_HAS_VERSIONED_NAMESPACE == 1 */
+
+
+extern "C"
+int
+TAO_SSLIOP_PASSWORD_CALLBACK_NAME (char *buf,
+ int size,
+ int /* rwflag */,
+ void *userdata)
+{
+ // @@ I'm probably over complicating this implementation, but that's
+ // what you get when you try to be overly efficient. :-)
+ // -Ossama
+
+ const char * password = static_cast<char *> (userdata);
+
+ int pwlen = -1;
+
+ if (password != 0)
+ {
+ pwlen = ACE_OS::strlen (password);
+
+ int copy_len = pwlen + 1; // Include the NULL terminator
+
+ // Clear the portion of the buffer that exceeds the space that
+ // will be occupied by the password.
+ if (copy_len < size)
+ ACE_OS::memset (buf + copy_len, 0, size - copy_len);
+
+ // Make sure we don't overflow the OpenSSL supplied buffer.
+ // Truncate the password if necessary.
+ copy_len = (copy_len > size) ? size : copy_len;
+
+ ACE_OS::memcpy (buf, password, copy_len);
+
+ // NULL terminate the truncated password.
+ if (copy_len > size)
+ {
+ pwlen = size - 1;
+ buf[pwlen] = '\0';
+ }
+ }
+
+ return pwlen;
+}
+
+// -------------------------------------------------------
+
+TAO_BEGIN_VERSIONED_NAMESPACE_DECL
+
+TAO::SSLIOP::CredentialsAcquirer::CredentialsAcquirer (
+ TAO::SL3::CredentialsCurator_ptr curator,
+ const CORBA::Any & acquisition_arguments)
+ : lock_ (),
+ curator_ (TAO::SL3::CredentialsCurator::_duplicate (curator)),
+ acquisition_arguments_ (acquisition_arguments),
+ destroyed_ (false)
+{
+}
+
+TAO::SSLIOP::CredentialsAcquirer::~CredentialsAcquirer (void)
+{
+}
+
+char *
+TAO::SSLIOP::CredentialsAcquirer::acquisition_method (ACE_ENV_SINGLE_ARG_DECL)
+ ACE_THROW_SPEC ((CORBA::SystemException))
+{
+ this->check_validity (ACE_ENV_SINGLE_ARG_PARAMETER);
+ ACE_CHECK_RETURN (0);
+
+ return CORBA::string_dup ("SL3TLS");
+}
+
+SecurityLevel3::AcquisitionStatus
+TAO::SSLIOP::CredentialsAcquirer::current_status (ACE_ENV_SINGLE_ARG_DECL)
+ ACE_THROW_SPEC ((CORBA::SystemException))
+{
+ this->check_validity (ACE_ENV_SINGLE_ARG_PARAMETER);
+ ACE_CHECK_RETURN (SecurityLevel3::AQST_Failed);
+
+ return SecurityLevel3::AQST_Succeeded; // @@ Really?
+}
+
+CORBA::ULong
+TAO::SSLIOP::CredentialsAcquirer::nth_iteration (ACE_ENV_SINGLE_ARG_DECL)
+ ACE_THROW_SPEC ((CORBA::SystemException))
+{
+ this->check_validity (ACE_ENV_SINGLE_ARG_PARAMETER);
+ ACE_CHECK_RETURN (0);
+
+ // SSL/TLS credentials is single-step process from the point-of-view
+ // of the caller.
+ return 1;
+}
+
+CORBA::Any *
+TAO::SSLIOP::CredentialsAcquirer::get_continuation_data (
+ ACE_ENV_SINGLE_ARG_DECL)
+ ACE_THROW_SPEC ((CORBA::SystemException))
+{
+ // SSL/TLS credentials acquisition does generate continuation data.
+ ACE_THROW_RETURN (CORBA::BAD_INV_ORDER (), 0);
+}
+
+SecurityLevel3::AcquisitionStatus
+TAO::SSLIOP::CredentialsAcquirer::continue_acquisition (
+ const CORBA::Any & /* acquisition_arguments */
+ ACE_ENV_ARG_DECL)
+ ACE_THROW_SPEC ((CORBA::SystemException))
+{
+ // SSL/TLS credentials acquisition does generate continuation data.
+ ACE_THROW_RETURN (CORBA::BAD_INV_ORDER (),
+ SecurityLevel3::AQST_Failed);
+}
+
+SecurityLevel3::OwnCredentials_ptr
+TAO::SSLIOP::CredentialsAcquirer::get_credentials (CORBA::Boolean on_list
+ ACE_ENV_ARG_DECL)
+ ACE_THROW_SPEC ((CORBA::SystemException))
+{
+ this->check_validity (ACE_ENV_SINGLE_ARG_PARAMETER);
+ ACE_CHECK_RETURN (SecurityLevel3::OwnCredentials::_nil ());
+
+ ::SSLIOP::AuthData *data;
+
+ if (!(this->acquisition_arguments_ >>= data))
+ ACE_THROW_RETURN (CORBA::BAD_PARAM (),
+ SecurityLevel3::OwnCredentials::_nil ());
+
+ TAO::SSLIOP::X509_var x509 = this->make_X509 (data->certificate);
+
+ if (x509.in () == 0)
+ ACE_THROW_RETURN (CORBA::BAD_PARAM (),
+ SecurityLevel3::OwnCredentials::_nil ());
+
+ TAO::SSLIOP::EVP_PKEY_var evp = this->make_EVP_PKEY (data->key);
+
+ if (evp.in () == 0)
+ ACE_THROW_RETURN (CORBA::BAD_PARAM (),
+ SecurityLevel3::OwnCredentials::_nil ());
+
+ // Verify that the private key is consistent with the certificate.
+ if (::X509_check_private_key (x509.in (), evp.in ()) != 1)
+ {
+ if (TAO_debug_level > 0)
+ ACE_DEBUG ((LM_ERROR,
+ ACE_TEXT ("(%P|%t) ERROR: Private key is not ")
+ ACE_TEXT ("consistent with X.509 certificate")));
+
+ ACE_THROW_RETURN (CORBA::BAD_PARAM (),
+ SecurityLevel3::OwnCredentials::_nil ());
+ }
+
+ TAO::SSLIOP::OwnCredentials * creds;
+ ACE_NEW_THROW_EX (creds,
+ TAO::SSLIOP::OwnCredentials (x509.in (), evp.in ()),
+ CORBA::NO_MEMORY ());
+ ACE_CHECK_RETURN (SecurityLevel3::OwnCredentials::_nil ());
+
+ SecurityLevel3::OwnCredentials_var credentials = creds;
+
+ if (on_list)
+ {
+ this->curator_->_tao_add_own_credentials (creds
+ ACE_ENV_ARG_PARAMETER);
+ ACE_CHECK_RETURN (SecurityLevel3::OwnCredentials::_nil ());
+ }
+
+ this->destroy (ACE_ENV_SINGLE_ARG_PARAMETER);
+ ACE_CHECK_RETURN (SecurityLevel3::OwnCredentials::_nil ());
+
+ return credentials._retn ();
+}
+
+void
+TAO::SSLIOP::CredentialsAcquirer::destroy (ACE_ENV_SINGLE_ARG_DECL)
+ ACE_THROW_SPEC ((CORBA::SystemException))
+{
+ this->check_validity (ACE_ENV_SINGLE_ARG_PARAMETER);
+ ACE_CHECK;
+
+ ACE_GUARD (TAO_SYNCH_MUTEX,
+ guard,
+ this->lock_);
+
+ if (!this->destroyed_)
+ {
+ this->destroyed_ = true;
+
+ // Release our reference to the CredentialsCurator.
+ (void) this->curator_.out ();
+ }
+}
+
+void
+TAO::SSLIOP::CredentialsAcquirer::check_validity (ACE_ENV_SINGLE_ARG_DECL)
+{
+ ACE_GUARD (TAO_SYNCH_MUTEX,
+ guard,
+ this->lock_);
+
+ if (this->destroyed_)
+ ACE_THROW (CORBA::BAD_INV_ORDER ());
+}
+
+::X509 *
+TAO::SSLIOP::CredentialsAcquirer::make_X509 (const ::SSLIOP::File &certificate)
+{
+ // No password is used or needed when reading ASN.1 encoded
+ // certificates.
+
+ const char *filename = certificate.filename.in ();
+
+ if (filename == 0)
+ return 0;
+
+ FILE *fp = 0;
+ ::X509 *x = 0;
+
+ if (certificate.type == ::SSLIOP::ASN1)
+ {
+ // ASN.1/DER encoded certificate
+
+ // No password is used or needed when reading ASN.1 encoded
+ // certificates.
+
+ const char *filename = certificate.filename.in ();
+
+ if (filename == 0)
+ return 0;
+
+ fp = ACE_OS::fopen (filename, "rb");
+
+ if (fp == 0)
+ {
+ if (TAO_debug_level > 0)
+ ACE_ERROR ((LM_ERROR,
+ ACE_TEXT ("(%P|%t) SSLIOP::CredentialsAcquirer::make_X509 - %p\n"),
+ ACE_TEXT ("fopen")));
+
+ return 0;
+ }
+
+ // Read ASN.1 / DER encoded X.509 certificate from a file, and
+ // convert it to OpenSSL's internal X.509 format.
+ x = ::d2i_X509_fp (fp, 0);
+ }
+ else
+ {
+ // PEM encoded certificate
+
+ fp = ACE_OS::fopen (filename, "r");
+
+ if (fp == 0)
+ {
+ if (TAO_debug_level > 0)
+ ACE_ERROR ((LM_ERROR,
+ ACE_TEXT ("(%P|%t) SSLIOP::CredentialsAcquirer::make_X509 - %p\n"),
+ ACE_TEXT ("fopen")));
+
+ return 0;
+ }
+
+ const char *password = certificate.password.in ();
+
+ // Read PEM encoded X.509 certificate from a file, and convert
+ // it to OpenSSL's internal X.509 format.
+ x = PEM_read_X509 (fp,
+ 0,
+ TAO_SSLIOP_PASSWORD_CALLBACK_NAME,
+ const_cast<char *> (password));
+ }
+
+ (void) ACE_OS::fclose (fp);
+
+ if (x == 0 && TAO_debug_level > 0)
+ ACE_SSL_Context::report_error ();
+
+ return x;
+}
+
+::EVP_PKEY *
+TAO::SSLIOP::CredentialsAcquirer::make_EVP_PKEY (const ::SSLIOP::File &key)
+{
+ // No password is used or needed when reading ASN.1 encoded
+ // private keys.
+
+ const char *filename = key.filename.in ();
+
+ if (filename == 0)
+ return 0;
+
+ FILE *fp = 0;
+ ::EVP_PKEY *evp = 0;
+
+ if (key.type == ::SSLIOP::ASN1)
+ {
+ // ASN.1/DER encoded private key
+
+ // No password is used or needed when reading ASN.1 encoded
+ // private keys.
+
+ const char *filename = key.filename.in ();
+
+ if (filename == 0)
+ return 0;
+
+ fp = ACE_OS::fopen (filename, "rb");
+
+ if (fp == 0)
+ {
+ if (TAO_debug_level > 0)
+ ACE_ERROR ((LM_ERROR,
+ ACE_TEXT ("(%P|%t) SSLIOP::CredentialsAcquirer::make_EVP_PKEY ")
+ ACE_TEXT ("- %p\n"),
+ ACE_TEXT ("fopen")));
+
+ return 0;
+ }
+
+ // Read ASN.1 / DER encoded private key from a file, and convert
+ // it to OpenSSL's internal private key format.
+ evp = ::d2i_PrivateKey_fp (fp, 0);
+ }
+ else
+ {
+ // PEM encoded private key
+
+ fp = ACE_OS::fopen (filename, "r");
+
+ if (fp == 0)
+ {
+ if (TAO_debug_level > 0)
+ ACE_ERROR ((LM_ERROR,
+ ACE_TEXT ("(%P|%t) SSLIOP::CredentialsAcquirer::make_EVP_PKEY ")
+ ACE_TEXT ("- %p\n"),
+ ACE_TEXT ("fopen")));
+
+ return 0;
+ }
+
+ const char *password = key.password.in ();
+
+ // Read PEM encoded private key from a file, and convert it to
+ // OpenSSL's internal private key format.
+ evp = PEM_read_PrivateKey (fp,
+ 0,
+ TAO_SSLIOP_PASSWORD_CALLBACK_NAME,
+ const_cast<char *> (password));
+ }
+
+ (void) ACE_OS::fclose (fp);
+
+ if (evp == 0 && TAO_debug_level > 0)
+ ACE_SSL_Context::report_error ();
+
+ return evp;
+}
+
+TAO_END_VERSIONED_NAMESPACE_DECL
diff --git a/TAO/orbsvcs/orbsvcs/SSLIOP/SSLIOP_CredentialsAcquirer.h b/TAO/orbsvcs/orbsvcs/SSLIOP/SSLIOP_CredentialsAcquirer.h
new file mode 100644
index 00000000000..734ca4d1884
--- /dev/null
+++ b/TAO/orbsvcs/orbsvcs/SSLIOP/SSLIOP_CredentialsAcquirer.h
@@ -0,0 +1,154 @@
+// -*- C++ -*-
+
+//=============================================================================
+/**
+ * @file SSLIOP_CredentialsAcquirer.h
+ *
+ * $Id$
+ *
+ * @author Ossama Othman <ossama@dre.vanderbilt.edu>
+ */
+//=============================================================================
+
+
+#ifndef TAO_SSLIOP_CREDENTIALS_ACQUIRER_H
+#define TAO_SSLIOP_CREDENTIALS_ACQUIRER_H
+
+#include /**/ "ace/pre.h"
+#include "orbsvcs/SSLIOP/SSLIOP_Export.h"
+
+#if !defined (ACE_LACKS_PRAGMA_ONCE)
+# pragma once
+#endif /* ACE_LACKS_PRAGMA_ONCE */
+
+#include "orbsvcs/Security/SL3_CredentialsCurator.h"
+
+#include "orbsvcs/SSLIOPC.h"
+#include "orbsvcs/SecurityLevel3C.h"
+
+#include "tao/LocalObject.h"
+
+#include <openssl/opensslconf.h>
+
+
+#if defined(_MSC_VER)
+#pragma warning(push)
+#pragma warning(disable:4250)
+#endif /* _MSC_VER */
+
+
+/// Forward declarations for OpenSSL data structures.
+extern "C"
+{
+ typedef struct x509_st X509;
+ typedef struct evp_pkey_st EVP_PKEY;
+}
+
+TAO_BEGIN_VERSIONED_NAMESPACE_DECL
+
+namespace TAO
+{
+ namespace SSLIOP
+ {
+ /**
+ * @class CredentialsAcquirer
+ *
+ * @brief SSLIOP-specific SecurityLevel3::CredentialsAcquirer
+ * implementation.
+ *
+ * This class generates SSLIOP-specific credentials.
+ */
+ class TAO_SSLIOP_Export CredentialsAcquirer
+ : public virtual SecurityLevel3::CredentialsAcquirer,
+ public virtual TAO_Local_RefCounted_Object
+ {
+ public:
+
+ /// Constructor
+ CredentialsAcquirer (TAO::SL3::CredentialsCurator_ptr curator,
+ const CORBA::Any & acquisition_arguments);
+
+ /**
+ * @name SecurityLevel3::CredentialsAcquirer Methods
+ *
+ * Methods required by the SecurityLevel3::CredentialsAcquirer
+ * interface.
+ */
+ //@{
+ virtual char * acquisition_method (ACE_ENV_SINGLE_ARG_DECL)
+ ACE_THROW_SPEC ((CORBA::SystemException));
+
+ virtual SecurityLevel3::AcquisitionStatus current_status (
+ ACE_ENV_SINGLE_ARG_DECL)
+ ACE_THROW_SPEC ((CORBA::SystemException));
+
+ virtual CORBA::ULong nth_iteration (ACE_ENV_SINGLE_ARG_DECL)
+ ACE_THROW_SPEC ((CORBA::SystemException));
+
+ virtual CORBA::Any * get_continuation_data (ACE_ENV_SINGLE_ARG_DECL)
+ ACE_THROW_SPEC ((CORBA::SystemException));
+
+ virtual SecurityLevel3::AcquisitionStatus continue_acquisition (
+ const CORBA::Any & acquisition_arguments
+ ACE_ENV_ARG_DECL)
+ ACE_THROW_SPEC ((CORBA::SystemException));
+
+ virtual SecurityLevel3::OwnCredentials_ptr get_credentials (
+ CORBA::Boolean on_list
+ ACE_ENV_ARG_DECL)
+ ACE_THROW_SPEC ((CORBA::SystemException));
+
+ virtual void destroy (ACE_ENV_SINGLE_ARG_DECL)
+ ACE_THROW_SPEC ((CORBA::SystemException));
+ //@}
+
+ protected:
+
+ /// Destructor
+ /**
+ * Protected destructor to enforce proper memory management
+ * through the reference counting mechanism.
+ */
+ ~CredentialsAcquirer (void);
+
+ private:
+
+ /// Verify that this CredentialsAcquirer object is still valid,
+ /// i.e. hasn't been destroyed.
+ void check_validity (ACE_ENV_SINGLE_ARG_DECL);
+
+ /// Create an OpenSSL X.509 certificate data structure.
+ static ::X509 * make_X509 (const ::SSLIOP::File &certificate);
+
+ /// Create an OpenSSL EVP_PKEY key data structure.
+ static ::EVP_PKEY * make_EVP_PKEY (const ::SSLIOP::File &key);
+
+ private:
+
+ /// Lock used for synchronization.
+ TAO_SYNCH_MUTEX lock_;
+
+ /// Reference to the TAO CredentialsCurator implementation.
+ TAO::SL3::CredentialsCurator_var curator_;
+
+ /// SSLIOP-specific credentials acquisition arguments.
+ const CORBA::Any & acquisition_arguments_;
+
+ /// Has this CredentialsAcquirer object completed credentials
+ /// acquisition or been explicitly destroyed?
+ bool destroyed_;
+
+ };
+
+ } // End SSLIOP namespace
+} // End TAO namespace
+
+TAO_END_VERSIONED_NAMESPACE_DECL
+
+#if defined(_MSC_VER)
+#pragma warning(pop)
+#endif /* _MSC_VER */
+
+#include /**/ "ace/post.h"
+
+#endif /* TAO_SSLIOP_CREDENTIALS_ACQUIRER_H */
diff --git a/TAO/orbsvcs/orbsvcs/SSLIOP/SSLIOP_CredentialsAcquirerFactory.cpp b/TAO/orbsvcs/orbsvcs/SSLIOP/SSLIOP_CredentialsAcquirerFactory.cpp
new file mode 100644
index 00000000000..06ac8c86977
--- /dev/null
+++ b/TAO/orbsvcs/orbsvcs/SSLIOP/SSLIOP_CredentialsAcquirerFactory.cpp
@@ -0,0 +1,30 @@
+// $Id$
+
+#include "orbsvcs/SSLIOP/SSLIOP_CredentialsAcquirerFactory.h"
+#include "orbsvcs/SSLIOP/SSLIOP_CredentialsAcquirer.h"
+
+
+ACE_RCSID (SSLIOP,
+ SSLIOP_CredentialsAcquirerFactory,
+ "$Id$")
+
+
+TAO_BEGIN_VERSIONED_NAMESPACE_DECL
+
+SecurityLevel3::CredentialsAcquirer_ptr
+TAO::SSLIOP::CredentialsAcquirerFactory::make (
+ TAO::SL3::CredentialsCurator_ptr curator,
+ const CORBA::Any & acquisition_arguments
+ ACE_ENV_ARG_DECL)
+{
+ SecurityLevel3::CredentialsAcquirer_ptr ca;
+ ACE_NEW_THROW_EX (ca,
+ TAO::SSLIOP::CredentialsAcquirer (curator,
+ acquisition_arguments),
+ CORBA::NO_MEMORY ());
+ ACE_CHECK_RETURN (SecurityLevel3::CredentialsAcquirer::_nil ());
+
+ return ca;
+}
+
+TAO_END_VERSIONED_NAMESPACE_DECL
diff --git a/TAO/orbsvcs/orbsvcs/SSLIOP/SSLIOP_CredentialsAcquirerFactory.h b/TAO/orbsvcs/orbsvcs/SSLIOP/SSLIOP_CredentialsAcquirerFactory.h
new file mode 100644
index 00000000000..dcc44e36919
--- /dev/null
+++ b/TAO/orbsvcs/orbsvcs/SSLIOP/SSLIOP_CredentialsAcquirerFactory.h
@@ -0,0 +1,65 @@
+// -*- C++ -*-
+
+//=============================================================================
+/**
+ * @file SSLIOP_CredentialsAcquirerFactory.h
+ *
+ * $Id$
+ *
+ * @author Ossama Othman <ossama@dre.vanderbilt.edu>
+ */
+//=============================================================================
+
+
+#ifndef TAO_SSLIOP_CREDENTIALS_ACQUIRER_FACTORY_H
+#define TAO_SSLIOP_CREDENTIALS_ACQUIRER_FACTORY_H
+
+#include /**/ "ace/pre.h"
+
+#include "orbsvcs/SSLIOP/SSLIOP_Export.h"
+
+#if !defined (ACE_LACKS_PRAGMA_ONCE)
+# pragma once
+#endif /* ACE_LACKS_PRAGMA_ONCE */
+
+#include "orbsvcs/Security/SL3_CredentialsAcquirerFactory.h"
+
+#include "orbsvcs/SecurityLevel3C.h"
+
+
+TAO_BEGIN_VERSIONED_NAMESPACE_DECL
+
+namespace TAO
+{
+ namespace SSLIOP
+ {
+
+ /**
+ * @class CredentialsAcquirerFactory
+ *
+ * @brief SSLIOP-specific TAO::SL3::CredentialsAcquirerFactory
+ * implementation.
+ *
+ * This class generates SSLIOP::CredentialsAcquirer instances.
+ */
+ class TAO_SSLIOP_Export CredentialsAcquirerFactory
+ : public virtual TAO::SL3::CredentialsAcquirerFactory
+ {
+ public:
+
+ /// Create a TAO::SSLIOP::CredentialsAcquirerFactory.
+ virtual SecurityLevel3::CredentialsAcquirer_ptr make (
+ TAO::SL3::CredentialsCurator_ptr curator,
+ const CORBA::Any & acquisition_arguments
+ ACE_ENV_ARG_DECL);
+
+ };
+
+ } // End SSLIOP namespace
+} // End TAO namespace
+
+TAO_END_VERSIONED_NAMESPACE_DECL
+
+#include /**/ "ace/post.h"
+
+#endif /* TAO_SSLIOP_CREDENTIALS_ACQUIRER_FACTORY_H */
diff --git a/TAO/orbsvcs/orbsvcs/SSLIOP/SSLIOP_Current.cpp b/TAO/orbsvcs/orbsvcs/SSLIOP/SSLIOP_Current.cpp
new file mode 100644
index 00000000000..9d39c05ba21
--- /dev/null
+++ b/TAO/orbsvcs/orbsvcs/SSLIOP/SSLIOP_Current.cpp
@@ -0,0 +1,197 @@
+#include "orbsvcs/SSLIOP/SSLIOP_Current.h"
+#include "tao/debug.h"
+
+
+ACE_RCSID (SSLIOP,
+ SSLIOP_Current,
+ "$Id$")
+
+
+#if !defined (__ACE_INLINE__)
+# include "orbsvcs/SSLIOP/SSLIOP_Current.inl"
+#endif /* __ACE_INLINE__ */
+
+TAO_BEGIN_VERSIONED_NAMESPACE_DECL
+
+TAO::SSLIOP::Current::Current (TAO_ORB_Core *orb_core)
+ : tss_slot_ (0),
+ orb_core_ (orb_core)
+{
+}
+
+TAO::SSLIOP::Current::~Current (void)
+{
+}
+
+::SSLIOP::ASN_1_Cert *
+TAO::SSLIOP::Current::get_peer_certificate (
+ ACE_ENV_SINGLE_ARG_DECL)
+ ACE_THROW_SPEC ((CORBA::SystemException,
+ SSLIOP::Current::NoContext))
+{
+ TAO::SSLIOP::Current_Impl *impl = this->implementation ();
+
+ // If the implementation pointer returned from TSS is zero, then
+ // we're not in the middle of a request or an upcall. Throw an
+ // exception to indicate that.
+ if (impl == 0)
+ ACE_THROW_RETURN (::SSLIOP::Current::NoContext (), 0);
+
+ // A valid value must always be returned, so instantiate a sequence
+ // regardless of whether or not it is populated with certificates.
+ ::SSLIOP::ASN_1_Cert *c = 0;
+ ACE_NEW_THROW_EX (c,
+ ::SSLIOP::ASN_1_Cert,
+ CORBA::NO_MEMORY (
+ CORBA::SystemException::_tao_minor_code (
+ TAO::VMCID,
+ ENOMEM),
+ CORBA::COMPLETED_NO));
+ ACE_CHECK_RETURN (0);
+
+ ::SSLIOP::ASN_1_Cert_var certificate = c;
+
+ // Populate the sequence with the DER encoded certificate.
+ impl->get_peer_certificate (c);
+
+ return certificate._retn ();
+}
+
+SSLIOP::SSL_Cert *
+TAO::SSLIOP::Current::get_peer_certificate_chain (
+ ACE_ENV_SINGLE_ARG_DECL)
+ ACE_THROW_SPEC ((CORBA::SystemException,
+ SSLIOP::Current::NoContext))
+{
+ TAO::SSLIOP::Current_Impl *impl = this->implementation ();
+
+ // If the implementation pointer returned from TSS is zero, then
+ // we're not in the middle of a request or an upcall. Throw an
+ // exception to indicate that.
+ if (impl == 0)
+ ACE_THROW_RETURN (SSLIOP::Current::NoContext (), 0);
+
+ // A valid value must always be returned, so instantiate a sequence
+ // regardless of whether or not it is populated with certificates.
+ ::SSLIOP::SSL_Cert *c = 0;
+ ACE_NEW_THROW_EX (c,
+ ::SSLIOP::SSL_Cert,
+ CORBA::NO_MEMORY (
+ CORBA::SystemException::_tao_minor_code (
+ TAO::VMCID,
+ ENOMEM),
+ CORBA::COMPLETED_NO));
+ ACE_CHECK_RETURN (0);
+
+ ::SSLIOP::SSL_Cert_var cert_chain = c;
+
+ // Populate the sequence with the chain of DER encoded certificates.
+ impl->get_peer_certificate_chain (c);
+
+ return cert_chain._retn ();
+}
+
+CORBA::Boolean
+TAO::SSLIOP::Current::no_context (ACE_ENV_SINGLE_ARG_DECL_NOT_USED)
+ ACE_THROW_SPEC ((CORBA::SystemException))
+{
+ return (this->implementation () == 0 ? 1 : 0);
+}
+
+void
+TAO::SSLIOP::Current::setup (TAO::SSLIOP::Current_Impl *&prev_impl,
+ TAO::SSLIOP::Current_Impl *new_impl,
+ bool &setup_done)
+{
+ // Set the current context and remember the old one.
+
+ prev_impl = this->implementation ();
+
+ (void) this->implementation (new_impl); // Check for error?
+
+ // Setup is complete.
+ setup_done = true;
+}
+
+void
+TAO::SSLIOP::Current::teardown (TAO::SSLIOP::Current_Impl *prev_impl,
+ bool &setup_done)
+{
+ if (setup_done)
+ {
+ // Reset the old context.
+ (void) this->implementation (prev_impl);
+ setup_done = false;
+ }
+}
+
+TAO::SSLIOP::Current_ptr
+TAO::SSLIOP::Current::_narrow (
+ CORBA::Object_ptr obj
+ ACE_ENV_ARG_DECL_NOT_USED)
+{
+ return TAO::SSLIOP::Current::_duplicate (
+ dynamic_cast<TAO::SSLIOP::Current *> (obj));
+}
+
+TAO::SSLIOP::Current_ptr
+TAO::SSLIOP::Current::_duplicate (TAO::SSLIOP::Current_ptr obj)
+{
+ if (!CORBA::is_nil (obj))
+ obj->_add_ref ();
+
+ return obj;
+}
+
+const char *
+TAO::SSLIOP::Current::_interface_repository_id (void) const
+{
+ return "IDL:TAO/SSLIOP/Current:1.0";
+}
+
+// ----------------------------------------------------------------
+
+TAO::SSLIOP::Current_ptr
+tao_TAO_SSLIOP_Current_duplicate (
+ TAO::SSLIOP::Current_ptr p
+ )
+{
+ return TAO::SSLIOP::Current::_duplicate (p);
+}
+
+void
+tao_TAO_SSLIOP_Current_release (
+ TAO::SSLIOP::Current_ptr p
+ )
+{
+ CORBA::release (p);
+}
+
+TAO::SSLIOP::Current_ptr
+tao_TAO_SSLIOP_Current_nil (
+ void
+ )
+{
+ return TAO::SSLIOP::Current::_nil ();
+}
+
+TAO::SSLIOP::Current_ptr
+tao_TAO_SSLIOP_Current_narrow (
+ CORBA::Object *p
+ ACE_ENV_ARG_DECL
+ )
+{
+ return TAO::SSLIOP::Current::_narrow (p ACE_ENV_ARG_PARAMETER);
+}
+
+CORBA::Object *
+tao_TAO_SSLIOP_Current_upcast (
+ void *src
+ )
+{
+ TAO::SSLIOP::Current **tmp =
+ static_cast<TAO::SSLIOP::Current **> (src);
+ return *tmp;
+}
+
+TAO_END_VERSIONED_NAMESPACE_DECL
diff --git a/TAO/orbsvcs/orbsvcs/SSLIOP/SSLIOP_Current.h b/TAO/orbsvcs/orbsvcs/SSLIOP/SSLIOP_Current.h
new file mode 100644
index 00000000000..02b68b6f60b
--- /dev/null
+++ b/TAO/orbsvcs/orbsvcs/SSLIOP/SSLIOP_Current.h
@@ -0,0 +1,177 @@
+// -*- C++ -*-
+
+// ===================================================================
+/**
+ * @file SSLIOP_Current.h
+ *
+ * $Id$
+ *
+ * @author Ossama Othman <ossama@dre.vanderbilt.edu>
+ */
+// ===================================================================
+
+#ifndef TAO_SSLIOP_CURRENT_H
+#define TAO_SSLIOP_CURRENT_H
+
+#include /**/ "ace/pre.h"
+
+#include "orbsvcs/SSLIOP/SSLIOP_Export.h"
+
+#if !defined (ACE_LACKS_PRAGMA_ONCE)
+# pragma once
+#endif /* ACE_LACKS_PRAGMA_ONCE */
+
+#include "orbsvcs/SSLIOP/SSLIOP_Current_Impl.h"
+
+#include "orbsvcs/SSLIOPC.h"
+#include "tao/ORB_Core.h"
+#include "tao/LocalObject.h"
+
+// This is to remove "inherits via dominance" warnings from MSVC.
+// MSVC is being a little too paranoid.
+#if defined(_MSC_VER)
+#pragma warning(push)
+#pragma warning(disable:4250)
+#endif /* _MSC_VER */
+
+TAO_BEGIN_VERSIONED_NAMESPACE_DECL
+
+namespace TAO
+{
+ namespace SSLIOP
+ {
+ class Current;
+ typedef Current * Current_ptr;
+ typedef TAO_Pseudo_Var_T<Current> Current_var;
+ typedef TAO_Pseudo_Out_T<Current> Current_out;
+
+ /**
+ * @class Current
+ *
+ * @brief Implementation of the TAO SSLIOP::Current extension.
+ *
+ * This object can be used to obtain SSL session related
+ * information about the current execution context. For example,
+ * SSL peer certificate chains for the current request can be
+ * obtained from this object.
+ */
+ class Current
+ : public ::SSLIOP::Current,
+ public TAO_Local_RefCounted_Object
+ {
+ public:
+ typedef Current_ptr _ptr_type;
+ typedef Current_var _var_type;
+ typedef Current_out _out_type;
+
+ /// Constructor.
+ Current (TAO_ORB_Core *orb_core);
+
+ /// Return the peer certificate associated with the current
+ /// request.
+ virtual ::SSLIOP::ASN_1_Cert * get_peer_certificate (
+ ACE_ENV_SINGLE_ARG_DECL)
+ ACE_THROW_SPEC ((CORBA::SystemException,
+ ::SSLIOP::Current::NoContext));
+
+ /**
+ * Return the certificate chain associated with the current
+ * execution context. If no SSL session is being used for the
+ * request or upcall, then the NoContext exception is raised.
+ * On the client side, the chain does include the peer (server)
+ * certficate. However, the certificate chain on the server
+ * side does NOT contain the peer (client) certificate.
+ */
+ virtual ::SSLIOP::SSL_Cert * get_peer_certificate_chain (
+ ACE_ENV_SINGLE_ARG_DECL)
+ ACE_THROW_SPEC ((CORBA::SystemException,
+ ::SSLIOP::Current::NoContext));
+
+ /**
+ * This method is mostly useful as an inexpensive means of
+ * determining whether or not SSL session state is available.
+ *
+ * @return @c true if the current execution context is not
+ * within a SSL session.
+ */
+ virtual CORBA::Boolean no_context (ACE_ENV_SINGLE_ARG_DECL)
+ ACE_THROW_SPEC ((CORBA::SystemException));
+
+ /// Set the TSS slot ID assigned to this object.
+ void tss_slot (size_t slot);
+
+ /// Setup the Current.
+ void setup (Current_Impl *& prev_impl,
+ Current_Impl * new_impl,
+ bool &setup_done);
+
+ /// Teardown the Current for this request.
+ void teardown (Current_Impl *prev_impl,
+ bool &setup_done);
+
+ /**
+ * @name Downcast and Reference Counting Methods
+ *
+ * These are basically the same methods generated by the IDL
+ * compiler for all IDL interfaces.
+ */
+ //@{
+ // The static operations.
+ static Current_ptr _duplicate (Current_ptr obj);
+
+ static Current_ptr _narrow (CORBA::Object_ptr obj
+ ACE_ENV_ARG_DECL);
+
+ static Current_ptr _nil (void)
+ {
+ return (Current_ptr)0;
+ }
+
+ virtual const char* _interface_repository_id (void) const;
+ //@}
+
+ protected:
+
+ /// Destructor
+ ~Current (void);
+
+ /// Set the TSS SSLIOP::Current implementation.
+ int implementation (Current_Impl *impl);
+
+ /// Return the TSS SSLIOP::Current implementation.
+ Current_Impl *implementation (void);
+
+ private:
+
+ /// Prevent copying through the copy constructor and the assignment
+ /// operator.
+ //@{
+ Current (const Current &);
+ void operator= (const Current &);
+ //@}
+
+ private:
+
+ /// TSS slot assigned to this object.
+ size_t tss_slot_;
+
+ /// Pointer to the ORB Core corresponding to the ORB with which this
+ /// object is registered.
+ TAO_ORB_Core * const orb_core_;
+ };
+ } // End SSLIOP namespace.
+} // End TAO namespace.
+
+TAO_END_VERSIONED_NAMESPACE_DECL
+
+#if defined (__ACE_INLINE__)
+# include "orbsvcs/SSLIOP/SSLIOP_Current.inl"
+#endif /* __ACE_INLINE__ */
+
+#if defined(_MSC_VER)
+#pragma warning(pop)
+#endif /* _MSC_VER */
+
+#include /**/ "ace/post.h"
+
+#endif /* TAO_SSLIOP_CURRENT_H */
diff --git a/TAO/orbsvcs/orbsvcs/SSLIOP/SSLIOP_Current.inl b/TAO/orbsvcs/orbsvcs/SSLIOP/SSLIOP_Current.inl
new file mode 100644
index 00000000000..1584b919606
--- /dev/null
+++ b/TAO/orbsvcs/orbsvcs/SSLIOP/SSLIOP_Current.inl
@@ -0,0 +1,40 @@
+// -*- C++ -*-
+//
+// $Id$
+
+TAO_BEGIN_VERSIONED_NAMESPACE_DECL
+
+ACE_INLINE void
+TAO::SSLIOP::Current::tss_slot (size_t slot)
+{
+ this->tss_slot_ = slot;
+}
+
+ACE_INLINE int
+TAO::SSLIOP::Current::implementation (TAO::SSLIOP::Current_Impl *impl)
+{
+ if (this->orb_core_ == 0)
+ return -1;
+
+ return this->orb_core_->set_tss_resource (this->tss_slot_, impl);
+}
+
+ACE_INLINE TAO::SSLIOP::Current_Impl *
+TAO::SSLIOP::Current::implementation (void)
+{
+ if (this->orb_core_ == 0)
+ return 0;
+
+ TAO::SL3::SecurityCurrent_Impl *impl =
+ static_cast<TAO::SL3::SecurityCurrent_Impl *> (
+ this->orb_core_->get_tss_resource (this->tss_slot_));
+
+ // Make sure we've got SSL session state in TSS before allowing
+ // further use of the SSLIOP::Current object.
+ if (impl != 0 && impl->tag () == ::SSLIOP::TAG_SSL_SEC_TRANS)
+ return dynamic_cast<TAO::SSLIOP::Current_Impl *> (impl);
+
+ return 0;
+}
+
+TAO_END_VERSIONED_NAMESPACE_DECL
diff --git a/TAO/orbsvcs/orbsvcs/SSLIOP/SSLIOP_Current_Impl.cpp b/TAO/orbsvcs/orbsvcs/SSLIOP/SSLIOP_Current_Impl.cpp
new file mode 100644
index 00000000000..27f173dfaac
--- /dev/null
+++ b/TAO/orbsvcs/orbsvcs/SSLIOP/SSLIOP_Current_Impl.cpp
@@ -0,0 +1,128 @@
+#include "orbsvcs/SSLIOP/SSLIOP_Current_Impl.h"
+
+#include "ace/OS_String.h"
+
+
+ACE_RCSID (SSLIOP,
+ SSLIOP_Current_Impl,
+ "$Id$")
+
+
+#if !defined (__ACE_INLINE__)
+# include "orbsvcs/SSLIOP/SSLIOP_Current_Impl.inl"
+#endif /* __ACE_INLINE__ */
+
+#include "orbsvcs/SSLIOP/SSLIOP_X509.h"
+#include "orbsvcs/SSLIOP/SSLIOP_ClientCredentials.h"
+
+#include "tao/ORB_Constants.h"
+
+#include <openssl/x509.h>
+
+TAO_BEGIN_VERSIONED_NAMESPACE_DECL
+
+TAO::SSLIOP::Current_Impl::~Current_Impl (void)
+{
+}
+
+SecurityLevel3::ClientCredentials_ptr
+TAO::SSLIOP::Current_Impl::client_credentials (
+ ACE_ENV_SINGLE_ARG_DECL)
+ ACE_THROW_SPEC ((CORBA::SystemException))
+{
+ TAO::SSLIOP::X509_var cert = ::SSL_get_peer_certificate (this->ssl_);
+ if (cert.ptr () == 0)
+ ACE_THROW_RETURN (CORBA::BAD_OPERATION (),
+ SecurityLevel3::ClientCredentials::_nil ());
+
+ SecurityLevel3::ClientCredentials_ptr creds;
+ ACE_NEW_THROW_EX (creds,
+ TAO::SSLIOP::ClientCredentials (cert.in (),
+ 0,
+ this->ssl_),
+ CORBA::NO_MEMORY (
+ CORBA::SystemException::_tao_minor_code (
+ TAO::VMCID,
+ ENOMEM),
+ CORBA::COMPLETED_NO));
+ ACE_CHECK_RETURN (SecurityLevel3::ClientCredentials::_nil ());
+
+ return creds;
+}
+
+CORBA::Boolean
+TAO::SSLIOP::Current_Impl::request_is_local (ACE_ENV_SINGLE_ARG_DECL)
+ ACE_THROW_SPEC ((CORBA::SystemException))
+{
+ ACE_THROW_RETURN (CORBA::NO_IMPLEMENT (), 0);
+}
+
+void
+TAO::SSLIOP::Current_Impl::get_peer_certificate (
+ ::SSLIOP::ASN_1_Cert *certificate)
+{
+ if (this->ssl_ == 0)
+ return;
+
+ TAO::SSLIOP::X509_var cert = ::SSL_get_peer_certificate (this->ssl_);
+ if (cert.ptr () == 0)
+ return;
+
+ // Get the size of the ASN.1 encoding.
+ const int cert_length = ::i2d_X509 (cert.in (), 0);
+ if (cert_length <= 0)
+ return;
+
+ certificate->length (cert_length);
+
+ CORBA::Octet *buffer = certificate->get_buffer ();
+
+ // Convert from the internal X509 representation to the DER encoding
+ // representation.
+ (void) ::i2d_X509 (cert.in (), &buffer);
+}
+
+void
+TAO::SSLIOP::Current_Impl::get_peer_certificate_chain (
+ ::SSLIOP::SSL_Cert *cert_chain)
+{
+ if (this->ssl_ == 0)
+ return;
+
+ STACK_OF (X509) *certs = ::SSL_get_peer_cert_chain (this->ssl_);
+ if (certs == 0)
+ return;
+
+ const int chain_length = sk_X509_num (certs);
+ cert_chain->length (chain_length);
+
+ // Copy the peer certificate chain to the SSLIOP::SSL_Cert
+ // sequence.
+ for (int i = 0; i < chain_length; ++i)
+ {
+ // Extract the certificate from the OpenSSL X509 stack.
+ ::X509 *x = sk_X509_value (certs, i);
+
+ // Get the size of the ASN.1 encoding.
+ const int cert_length = ::i2d_X509 (x, 0);
+ if (cert_length <= 0)
+ continue; // @@ What do we do if there is an error?
+
+ ::SSLIOP::ASN_1_Cert &certificate = (*cert_chain)[i];
+ certificate.length (cert_length);
+
+ CORBA::Octet *buffer = certificate.get_buffer ();
+
+ // Convert from the internal X509 representation to the DER
+ // encoding representation.
+ (void) ::i2d_X509 (x, &buffer);
+ }
+}
+
+CORBA::ULong
+TAO::SSLIOP::Current_Impl::tag (void) const
+{
+ return ::SSLIOP::TAG_SSL_SEC_TRANS;
+}
+
+TAO_END_VERSIONED_NAMESPACE_DECL
diff --git a/TAO/orbsvcs/orbsvcs/SSLIOP/SSLIOP_Current_Impl.h b/TAO/orbsvcs/orbsvcs/SSLIOP/SSLIOP_Current_Impl.h
new file mode 100644
index 00000000000..32bc8c7a283
--- /dev/null
+++ b/TAO/orbsvcs/orbsvcs/SSLIOP/SSLIOP_Current_Impl.h
@@ -0,0 +1,113 @@
+// -*- C++ -*-
+
+// ===================================================================
+/**
+ * @file SSLIOP_Current_Impl.h
+ *
+ * $Id$
+ *
+ * @author Ossama Othman <ossama@uci.edu>
+ */
+// ===================================================================
+
+#ifndef TAO_SSLIOP_CURRENT_IMPL_H
+#define TAO_SSLIOP_CURRENT_IMPL_H
+
+#include /**/ "ace/pre.h"
+
+#include "ace/config-all.h"
+
+#if !defined (ACE_LACKS_PRAGMA_ONCE)
+# pragma once
+#endif /* ACE_LACKS_PRAGMA_ONCE */
+
+#include "orbsvcs/SSLIOPC.h"
+#include "orbsvcs/Security/SL3_SecurityCurrent_Impl.h"
+
+#include <openssl/ssl.h>
+
+TAO_BEGIN_VERSIONED_NAMESPACE_DECL
+
+namespace TAO
+{
+ namespace SSLIOP
+ {
+ /**
+ * @class Current_Impl
+ *
+ * @brief TSS portion of the TAO SSLIOP::Current extension, and
+ * the SSLIOP-specific SecurityLevel3::SecurityCurrent
+ * object.
+ *
+ * This class encapsulates the thread-specific state of an SSL
+ * session during a given upcall.
+ */
+ class Current_Impl : public TAO::SL3::SecurityCurrent_Impl
+ {
+ public:
+
+ /// Constructor.
+ Current_Impl (void);
+
+ /// Destructor
+ ~Current_Impl (void);
+
+ /// Implementation of the SSLIOP-specific
+ /// SecurityLevel3::client_credentials() method.
+ virtual SecurityLevel3::ClientCredentials_ptr client_credentials (
+ ACE_ENV_SINGLE_ARG_DECL)
+ ACE_THROW_SPEC ((CORBA::SystemException));
+
+ /// Implementation of the SSLIOP-specific
+ /// SecurityLevel3::request_is_local() method.
+ virtual CORBA::Boolean request_is_local (
+ ACE_ENV_SINGLE_ARG_DECL)
+ ACE_THROW_SPEC ((CORBA::SystemException));
+
+ /// Return the SSL peer certificate associated with the
+ /// current request as an octet sequence, i.e. a DER encoded
+ /// certificate.
+ void get_peer_certificate (::SSLIOP::ASN_1_Cert *certificate);
+
+ /// Return the SSL peer certificate chain associated with the
+ /// current request as a sequence of DER encoded certificates.
+ void get_peer_certificate_chain (::SSLIOP::SSL_Cert *cert_chain);
+
+ /// Set the pointer to the underlying SSL session state.
+ void ssl (SSL *s);
+
+ /// Return pointer to the SSL session state for the current upcall.
+ SSL *ssl (void);
+
+ protected:
+
+ /// Return the unique tag that identifies the concrete subclass.
+ virtual CORBA::ULong tag (void) const;
+
+ private:
+
+ /// Prevent copying through the copy constructor and the assignment
+ /// operator.
+ //@{
+ Current_Impl (const Current_Impl &);
+ void operator= (const Current_Impl &);
+ //@}
+
+ private:
+
+ /// The SSL session state corresponding to the current upcall.
+ SSL *ssl_;
+
+ };
+ } // End SSLIOP namespace.
+} // End TAO namespace.
+
+TAO_END_VERSIONED_NAMESPACE_DECL
+
+#if defined (__ACE_INLINE__)
+# include "orbsvcs/SSLIOP/SSLIOP_Current_Impl.inl"
+#endif /* __ACE_INLINE__ */
+
+#include /**/ "ace/post.h"
+
+#endif /* TAO_SSLIOP_CURRENT_IMPL_H */
diff --git a/TAO/orbsvcs/orbsvcs/SSLIOP/SSLIOP_Current_Impl.inl b/TAO/orbsvcs/orbsvcs/SSLIOP/SSLIOP_Current_Impl.inl
new file mode 100644
index 00000000000..d1f4b91ee81
--- /dev/null
+++ b/TAO/orbsvcs/orbsvcs/SSLIOP/SSLIOP_Current_Impl.inl
@@ -0,0 +1,26 @@
+// -*- C++ -*-
+//
+// $Id$
+
+
+TAO_BEGIN_VERSIONED_NAMESPACE_DECL
+
+ACE_INLINE
+TAO::SSLIOP::Current_Impl::Current_Impl (void)
+ : ssl_ (0)
+{
+}
+
+ACE_INLINE void
+TAO::SSLIOP::Current_Impl::ssl (SSL *s)
+{
+ this->ssl_ = s;
+}
+
+ACE_INLINE SSL *
+TAO::SSLIOP::Current_Impl::ssl (void)
+{
+ return this->ssl_;
+}
+
+TAO_END_VERSIONED_NAMESPACE_DECL
diff --git a/TAO/orbsvcs/orbsvcs/SSLIOP/SSLIOP_EVP_PKEY.cpp b/TAO/orbsvcs/orbsvcs/SSLIOP/SSLIOP_EVP_PKEY.cpp
new file mode 100644
index 00000000000..020904b53d2
--- /dev/null
+++ b/TAO/orbsvcs/orbsvcs/SSLIOP/SSLIOP_EVP_PKEY.cpp
@@ -0,0 +1,76 @@
+// -*- C++ -*-
+
+#include "orbsvcs/SSLIOP/SSLIOP_EVP_PKEY.h"
+
+#include <openssl/x509.h>
+#include <openssl/rsa.h>
+#include <openssl/dsa.h>
+#include <openssl/dh.h>
+#include "orbsvcs/SSLIOP/params_dup.h"
+
+
+ACE_RCSID (SSLIOP,
+ SSLIOP_EVP_PKEY,
+ "$Id$")
+
+
+TAO_BEGIN_VERSIONED_NAMESPACE_DECL
+
+::EVP_PKEY *
+TAO::SSLIOP::OpenSSL_traits< ::EVP_PKEY >::copy (::EVP_PKEY const & key)
+{
+ ::EVP_PKEY * pkey = const_cast< ::EVP_PKEY *> (&key);
+
+ // We're using the EVP_PKEY_var even though it depends on this
+ // trait function. This works since we're not actually using
+ // any of the EVP_PKEY_var methods that call this copy()
+ // trait. This allows us to maintain exception safety.
+ TAO::SSLIOP::EVP_PKEY_var p = ::EVP_PKEY_new ();
+
+ switch (::EVP_PKEY_type (pkey->type))
+ {
+ case EVP_PKEY_RSA:
+ {
+ RSA * rsa = ::EVP_PKEY_get1_RSA (pkey);
+ if (rsa != 0)
+ {
+ // Not exception safe!
+ ::EVP_PKEY_set1_RSA (p.in (), RSAPrivateKey_dup (rsa));
+ ::RSA_free (rsa);
+ }
+ }
+ break;
+
+ case EVP_PKEY_DSA:
+ {
+ DSA * dsa = ::EVP_PKEY_get1_DSA (pkey);
+ if (dsa != 0)
+ {
+ // Not exception safe!
+ ::EVP_PKEY_set1_DSA (p.in (), DSAPARAMS_DUP_WRAPPER_NAME (dsa));
+ ::DSA_free (dsa);
+ }
+ }
+ break;
+
+ case EVP_PKEY_DH:
+ {
+ DH * dh = ::EVP_PKEY_get1_DH (pkey);
+ if (dh != 0)
+ {
+ // Not exception safe!
+ ::EVP_PKEY_set1_DH (p.in (), DHPARAMS_DUP_WRAPPER_NAME (dh));
+ ::DH_free (dh);
+ }
+ }
+ break;
+
+ default:
+ // We should never get here!
+ return 0;
+ }
+
+ return p._retn ();
+}
+
+TAO_END_VERSIONED_NAMESPACE_DECL
diff --git a/TAO/orbsvcs/orbsvcs/SSLIOP/SSLIOP_EVP_PKEY.h b/TAO/orbsvcs/orbsvcs/SSLIOP/SSLIOP_EVP_PKEY.h
new file mode 100644
index 00000000000..8c43b8a5b68
--- /dev/null
+++ b/TAO/orbsvcs/orbsvcs/SSLIOP/SSLIOP_EVP_PKEY.h
@@ -0,0 +1,79 @@
+// -*- C++ -*-
+
+//=============================================================================
+/**
+ * @file SSLIOP_EVP_PKEY.h
+ *
+ * $Id$
+ *
+ * @author Ossama Othman <ossama@dre,vanderbilt.edu>
+ */
+//=============================================================================
+
+#ifndef TAO_SSLIOP_EVP_PKEY_H
+#define TAO_SSLIOP_EVP_PKEY_H
+
+#include /**/ "ace/pre.h"
+
+#include "ace/config-all.h"
+
+#if !defined (ACE_LACKS_PRAGMA_ONCE)
+#pragma once
+#endif /* ACE_LACKS_PRAGMA_ONCE */
+
+#include "orbsvcs/SSLIOP/SSLIOP_OpenSSL_st_T.h"
+
+#include <openssl/evp.h>
+#include <openssl/crypto.h>
+
+TAO_BEGIN_VERSIONED_NAMESPACE_DECL
+
+namespace TAO
+{
+ namespace SSLIOP
+ {
+ // OpenSSL @c EVP_PKEY structure traits specialization.
+ template <>
+ struct OpenSSL_traits< ::EVP_PKEY >
+ {
+ /// OpenSSL lock ID for use in OpenSSL CRYPTO_add() reference
+ /// count manipulation function.
+ enum { LOCK_ID = CRYPTO_LOCK_EVP_PKEY };
+
+ /// Increase the reference count on the given OpenSSL structure.
+ /**
+ * @note This used to be in a function template but MSVC++ 6
+ * can't handle function templates correctly so reproduce
+ * the code in each specialization. *sigh*
+ */
+ static ::EVP_PKEY * _duplicate (::EVP_PKEY * st)
+ {
+ if (st != 0)
+ CRYPTO_add (&(st->references),
+ 1,
+ LOCK_ID);
+
+ return st;
+ }
+
+ /// Perform deep copy of the given OpenSSL structure.
+ static ::EVP_PKEY * copy (::EVP_PKEY const & key);
+
+ /// Decrease the reference count on the given OpenSSL
+ /// structure.
+ static void release (::EVP_PKEY * st)
+ {
+ ::EVP_PKEY_free (st);
+ }
+ };
+
+ typedef OpenSSL_st_var< ::EVP_PKEY > EVP_PKEY_var;
+
+ } // End SSLIOP namespace.
+} // End TAO namespace.
+
+TAO_END_VERSIONED_NAMESPACE_DECL
+
+#include /**/ "ace/post.h"
+
+#endif /* TAO_SSLIOP_EVP_PKEY_H */
diff --git a/TAO/orbsvcs/orbsvcs/SSLIOP/SSLIOP_Endpoint.cpp b/TAO/orbsvcs/orbsvcs/SSLIOP/SSLIOP_Endpoint.cpp
new file mode 100644
index 00000000000..62061e03009
--- /dev/null
+++ b/TAO/orbsvcs/orbsvcs/SSLIOP/SSLIOP_Endpoint.cpp
@@ -0,0 +1,382 @@
+#include "orbsvcs/SSLIOP/SSLIOP_Endpoint.h"
+
+#include "tao/IIOP_Endpoint.h"
+
+#include "ace/OS_NS_stdio.h"
+#include "ace/OS_NS_string.h"
+#include "ace/os_include/os_netdb.h"
+
+#include "tao/debug.h"
+
+ACE_RCSID (SSLIOP,
+ SSLIOP_Endpoint,
+ "$Id$")
+
+
+#if !defined (__ACE_INLINE__)
+# include "orbsvcs/SSLIOP/SSLIOP_Endpoint.i"
+#endif /* __ACE_INLINE__ */
+
+TAO_BEGIN_VERSIONED_NAMESPACE_DECL
+
+TAO_SSLIOP_Endpoint::TAO_SSLIOP_Endpoint (const ::SSLIOP::SSL *ssl_component,
+ TAO_IIOP_Endpoint *iiop_endp)
+ : TAO_Endpoint (IOP::TAG_INTERNET_IOP),
+ object_addr_ (),
+ next_ (0),
+ iiop_endpoint_ (iiop_endp),
+ destroy_iiop_endpoint_ (false),
+ qop_ (::Security::SecQOPIntegrityAndConfidentiality),
+#if !defined (VXWORKS) && !defined (__QNX__)
+ // Some compilers don't like the initialization
+ trust_ (),
+#endif /* !VXWORKS && !__QNX__ */
+ credentials_ (),
+ credentials_set_ (0)
+{
+ if (ssl_component != 0)
+ {
+ // Copy the security association options in the IOR's SSL tagged
+ // component.
+ this->ssl_component_.target_supports = ssl_component->target_supports;
+ this->ssl_component_.target_requires = ssl_component->target_requires;
+ this->ssl_component_.port = ssl_component->port;
+ }
+ else
+ {
+ // No SSL tagged component is available so construct a default
+ // set of security association options, in addition to the IANA
+ // assigned IIOP over SSL port (684). This is generally a
+ // client side issue.
+
+ // Clear all bits in the SSLIOP::SSL association option fields.
+ this->ssl_component_.target_supports = 0;
+ this->ssl_component_.target_requires = 0;
+
+ // SSLIOP requires these Security::AssociationOptions by default.
+ ACE_SET_BITS (this->ssl_component_.target_requires,
+ ::Security::Integrity
+ | ::Security::Confidentiality
+ | ::Security::NoDelegation);
+
+ // SSLIOP supports these Security::AssociationOptions by
+ // default.
+ //
+ // Note that the Security::NoProtection bit is set since we
+ // can't be sure if the server supports SSL, and TAO's SSLIOP
+ // implementation must support IIOP over SSL and plain IIOP.
+ ACE_SET_BITS (this->ssl_component_.target_supports,
+ ::Security::Integrity
+ | ::Security::Confidentiality
+ | ::Security::EstablishTrustInTarget
+ | ::Security::NoProtection
+ | ::Security::NoDelegation);
+
+ // Initialize the default SSL port to zero, not the IANA
+ // assigned IIOP over SSL port (684). We usually only get here
+ // if we're creating a profile on the client side using an IOR
+ // that does not contain an SSLIOP tagged component.
+ this->ssl_component_.port = 0;
+ }
+
+ // Invalidate the Addr until the first attempt to use it is made.
+ this->object_addr_.set_type (-1);
+
+ this->trust_.trust_in_target = 1;
+ this->trust_.trust_in_client = 1;
+}
+
+TAO_SSLIOP_Endpoint::~TAO_SSLIOP_Endpoint (void)
+{
+ if (this->destroy_iiop_endpoint_)
+ delete this->iiop_endpoint_;
+}
+
+#if 0
+static void
+dump_endpoint (const char* msg, const TAO_Endpoint *other_endpoint)
+{
+
+ TAO_Endpoint *endpt = const_cast<TAO_Endpoint *> (other_endpoint);
+
+ TAO_SSLIOP_Endpoint *endpoint =
+ dynamic_cast<TAO_SSLIOP_Endpoint *> (endpt);
+
+ if (endpoint == 0)
+ {
+ ACE_DEBUG ((LM_DEBUG, "TAO (%P|%t) endpoint - %s: Unable to cast an endpoint to SSLIOP_Endpoint\n", msg));
+ return;
+ }
+
+ char hostaddr[MAXHOSTNAMELEN + 16];
+ int gothost = endpoint->addr_to_string (hostaddr, sizeof hostaddr);
+
+ ACE_DEBUG ((LM_INFO, "TAO (%P|%t) SSLIOPEndpoint %s - %@ {%s, ssl=%d, iiop=%d,"
+ " qop=%d, trst=(%d,%d), c=%@, crdh=0x%x}, h=0x%x\n",
+ msg,
+ endpoint,
+ (gothost == 0 ? hostaddr : "*UNKNOWN*"),
+ endpoint->ssl_component ().port ,
+ endpoint->iiop_endpoint ()->port (),
+ endpoint->qop() ,
+ endpoint->trust().trust_in_target ,
+ endpoint->trust().trust_in_client ,
+ endpoint->credentials() ,
+ (endpoint->credentials_set () ? endpoint->credentials()->hash () : 0) ,
+ endpoint->hash ()));
+}
+#endif /* 0 */
+
+int
+TAO_SSLIOP_Endpoint::addr_to_string (char *buffer, size_t length)
+{
+ size_t actual_len =
+ ACE_OS::strlen (this->iiop_endpoint_->host ()) // chars in host name
+ + sizeof (':') // delimiter
+ + ACE_OS::strlen ("65536") // max port
+ + sizeof ('\0');
+
+ if (length < actual_len)
+ return -1;
+
+ ACE_OS::sprintf (buffer,
+ "%s:%d",
+ this->iiop_endpoint_->host (),
+ this->ssl_component_.port);
+
+ return 0;
+}
+
+
+TAO_Endpoint *
+TAO_SSLIOP_Endpoint::next (void)
+{
+ return this->next_;
+}
+
+CORBA::Boolean
+TAO_SSLIOP_Endpoint::is_equivalent (const TAO_Endpoint *other_endpoint)
+{
+ TAO_Endpoint *endpt = const_cast<TAO_Endpoint *> (other_endpoint);
+
+ TAO_SSLIOP_Endpoint *endpoint =
+ dynamic_cast<TAO_SSLIOP_Endpoint *> (endpt);
+
+ if (endpoint == 0)
+ return 0;
+
+ ::Security::EstablishTrust t = endpoint->trust ();
+
+ if ((this->ssl_component_.port != 0
+ && endpoint->ssl_component_.port != 0
+ && this->ssl_component_.port != endpoint->ssl_component_.port)
+ || this->qop_ != endpoint->qop ()
+ || this->trust_.trust_in_target != t.trust_in_target
+ || this->trust_.trust_in_client != t.trust_in_client
+ || (!CORBA::is_nil (this->credentials_.in ())
+ && !(*this->credentials_.in () == *endpoint->credentials ())))
+ {
+ return 0;
+ }
+
+ // Comparing the underlying iiop endpoints is wrong, as their port
+ // numbers often may not make sense. Or may not being used anyway.
+ // Therefore, we only need to directly compare the hosts. See also the
+ // comments in the hash() method.
+ if (this->iiop_endpoint() == 0 || endpoint->iiop_endpoint() == 0)
+ return 0;
+
+ if ((ACE_OS::strcmp (this->iiop_endpoint()->host (),
+ endpoint->iiop_endpoint()->host ()) != 0))
+ return 0;
+
+ return 1;
+}
+
+TAO_Endpoint *
+TAO_SSLIOP_Endpoint::duplicate (void)
+{
+ TAO_SSLIOP_Endpoint *endpoint = 0;
+
+ // @@ We need to set the priority of the newly formed endpoint. It
+ // shouldnt be a problem as long as SSL is not used with RTCORBA.
+ ACE_NEW_RETURN (endpoint,
+ TAO_SSLIOP_Endpoint (&this->ssl_component_,
+ 0),
+ 0);
+
+ if (this->credentials_set_)
+ endpoint->set_sec_attrs (this->qop_,this->trust_, this->credentials_.in());
+
+ endpoint->iiop_endpoint (this->iiop_endpoint_, true);
+ endpoint->hash_val_ = this->hash_val_;
+ return endpoint;
+}
+
+CORBA::ULong
+TAO_SSLIOP_Endpoint::hash (void)
+{
+ // there is actually the potential for a race of the inverse case,
+ // since setting the security attributes will reset the hash_val_,
+ // it is possible this test to pass, but then have the hash reset
+ // before the value is returned.
+ if (this->hash_val_ != 0)
+ return this->hash_val_;
+
+ // Do this with no locks held, as it may try to acquire it, too.
+ const ACE_INET_Addr &oaddr = this->object_addr();
+
+ { // nested scope for the lock
+ ACE_GUARD_RETURN (TAO_SYNCH_MUTEX,
+ guard,
+ this->addr_lookup_lock_,
+ this->hash_val_);
+ // .. DCL
+ if (this->hash_val_ != 0)
+ return this->hash_val_;
+
+
+ // Note that we are not using the underlying IIOP endpoint's hash
+ // value in order to avoid the influence of the IIOP port number,
+ // since it is ignored anyway. When it features a
+ // purely fictional port number, as when accepting an SSL
+ // connection, the unsecured port is undefined and
+ // had we used it in computing the hash it would have broken the
+ // bi-directional support - as the 'guessed' IIOP port value will
+ // hardly match the one specified in the bi-dir service context.
+ this->hash_val_ =
+ oaddr.get_ip_address ()
+ + this->ssl_component_.port;
+ }
+
+ return this->hash_val_;
+}
+
+
+const ACE_INET_Addr &
+TAO_SSLIOP_Endpoint::object_addr (void) const
+{
+ // The object_addr_ is initialized here, rather than at IOR decode
+ // time for several reasons:
+ // 1. A request on the object may never be invoked.
+ // 2. The DNS setup may have changed dynamically.
+ // ...etc..
+
+ // Double checked locking optimization.
+ if (this->object_addr_.get_type () != AF_INET)
+ {
+ const ACE_INET_Addr &iiop_addr = this->iiop_endpoint_->object_addr ();
+
+ ACE_GUARD_RETURN (TAO_SYNCH_MUTEX,
+ guard,
+ this->addr_lookup_lock_,
+ this->object_addr_);
+
+ if (this->object_addr_.get_type () != AF_INET)
+ {
+ this->object_addr_ = iiop_addr;
+ this->object_addr_.set_port_number (this->ssl_component_.port);
+ }
+ }
+
+ return this->object_addr_;
+}
+
+void
+TAO_SSLIOP_Endpoint::set_sec_attrs (::Security::QOP q,
+ const ::Security::EstablishTrust &t,
+ const TAO::SSLIOP::OwnCredentials_ptr c)
+{
+ if (this->credentials_set_)
+ return;
+
+ ACE_GUARD (TAO_SYNCH_MUTEX,
+ guard,
+ this->addr_lookup_lock_);
+
+ // double-check
+ if (this->credentials_set_)
+ return;
+
+ this->qop_ = q;
+ this->trust_ = t;
+ this->credentials_ = TAO::SSLIOP::OwnCredentials::_duplicate (c);
+ this->credentials_set_ = 1;
+
+ // reset the hash value to force a recomputation.
+ this->hash_val_ = 0;
+}
+
+
+
+
+TAO_SSLIOP_Synthetic_Endpoint::~TAO_SSLIOP_Synthetic_Endpoint ()
+{
+}
+
+TAO_SSLIOP_Synthetic_Endpoint::TAO_SSLIOP_Synthetic_Endpoint (const ::SSLIOP::SSL *ssl)
+ : TAO_SSLIOP_Endpoint (ssl, 0)
+{
+}
+
+
+TAO_SSLIOP_Synthetic_Endpoint::TAO_SSLIOP_Synthetic_Endpoint (TAO_IIOP_Endpoint *iiop_endp)
+ : TAO_SSLIOP_Endpoint ((const ::SSLIOP::SSL *)0, iiop_endp)
+{
+ this->ssl_component_.port = iiop_endp->port ();
+}
+
+
+CORBA::Boolean
+TAO_SSLIOP_Synthetic_Endpoint::is_equivalent (const TAO_Endpoint *other_endpoint)
+{
+ TAO_Endpoint *endpt = const_cast<TAO_Endpoint *> (other_endpoint);
+
+ TAO_SSLIOP_Endpoint *endpoint =
+ dynamic_cast<TAO_SSLIOP_Endpoint *> (endpt);
+
+ if (endpoint == 0)
+ return 0;
+
+ if ((this->ssl_component ().port != 0
+ && endpoint->ssl_component ().port != 0
+ && this->ssl_component ().port != endpoint->ssl_component ().port)
+ || this->qop () < endpoint->qop ())
+ {
+ return 0;
+ }
+
+ // Comparing the underlying iiop endpoints is wrong, as their port
+ // numbers often may not make sense, or are not being used anyway.
+ // Therefore, directly comparing the hosts at this point. See also the
+ // comments in the hash() method
+ if (this->iiop_endpoint() == 0 || endpoint->iiop_endpoint() == 0)
+ return 0;
+
+ if ((ACE_OS::strcmp (this->iiop_endpoint()->host (),
+ endpoint->iiop_endpoint()->host ()) != 0))
+ return 0;
+
+ return 1;
+}
+
+TAO_Endpoint *
+TAO_SSLIOP_Synthetic_Endpoint::duplicate (void)
+{
+ TAO_SSLIOP_Synthetic_Endpoint *endpoint = 0;
+
+ // @@ We need to set the priority of the newly formed endpoint. It
+ // shouldnt be a problem as long as SSL is not used with RTCORBA.
+ ACE_NEW_RETURN (endpoint,
+ TAO_SSLIOP_Synthetic_Endpoint (&(this->ssl_component ())),
+ 0);
+
+ if (this->credentials_set())
+ endpoint->set_sec_attrs (this->qop (),this->trust (), this->credentials ());
+
+ endpoint->iiop_endpoint (this->iiop_endpoint (), true);
+ endpoint->hash_val_ = this->hash ();
+ return endpoint;
+}
+
+TAO_END_VERSIONED_NAMESPACE_DECL
diff --git a/TAO/orbsvcs/orbsvcs/SSLIOP/SSLIOP_Endpoint.h b/TAO/orbsvcs/orbsvcs/SSLIOP/SSLIOP_Endpoint.h
new file mode 100644
index 00000000000..d05fec097ad
--- /dev/null
+++ b/TAO/orbsvcs/orbsvcs/SSLIOP/SSLIOP_Endpoint.h
@@ -0,0 +1,256 @@
+// -*- C++ -*-
+
+//=============================================================================
+/**
+ * @file SSLIOP_Endpoint.h
+ *
+ * $Id$
+ *
+ * SSLIOP implementation of PP Framework Endpoint interface.
+ *
+ * @author Marina Spivak <marina@cs.wustl.edu>
+ * @author Ossama Othman <ossama@uci.edu>
+ */
+//=============================================================================
+
+#ifndef TAO_SSLIOP_ENDPOINT_H
+#define TAO_SSLIOP_ENDPOINT_H
+
+#include /**/ "ace/pre.h"
+
+#include "orbsvcs/SSLIOP/SSLIOP_Export.h"
+
+#if !defined (ACE_LACKS_PRAGMA_ONCE)
+# pragma once
+#endif /* ACE_LACKS_PRAGMA_ONCE */
+
+#include "orbsvcs/SSLIOP/SSLIOP_OwnCredentials.h"
+
+#include "orbsvcs/SSLIOPC.h"
+#include "orbsvcs/SecurityC.h"
+
+#include "tao/IIOP_Endpoint.h"
+#include "ace/INET_Addr.h"
+
+TAO_BEGIN_VERSIONED_NAMESPACE_DECL
+
+namespace TAO
+{
+ /// Tag for storing multiple ssl endpoints within a single profile.
+ const ACE_UINT32 TAG_SSL_ENDPOINTS = 0x54414f01U;
+}
+
+// namespace TAO
+// {
+// namespace SSLIOP
+// {
+ /**
+ * @class Endpoint
+ *
+ * @brief SSLIOP-specific implementation of PP Framework Endpoint
+ * interface.
+ *
+ *
+ */
+ class TAO_SSLIOP_Export TAO_SSLIOP_Endpoint : public TAO_Endpoint
+ {
+ public:
+
+ friend class TAO_SSLIOP_Profile;
+
+ /// Constructor
+ TAO_SSLIOP_Endpoint (const ::SSLIOP::SSL *ssl_component,
+ TAO_IIOP_Endpoint *iiop_endp);
+
+ /// Destructor.
+ virtual ~TAO_SSLIOP_Endpoint (void);
+
+ /**
+ * @name TAO_Endpoint Methods
+ *
+ * See Endpoint.h for their documentation.
+ */
+ //@{
+ virtual TAO_Endpoint *next (void);
+ virtual int addr_to_string (char *buffer, size_t length);
+
+ /// Return true if this endpoint is equivalent to @param
+ /// other_endpoint. The relationship is defined as equivalency of
+ /// their qop, hostname and ssl ports (if non-zero).
+ /// Two endpoints may be equivalent even if their iiop counterparts are
+ /// not. In fact, there are cases (as with the LPL processing)
+ /// when those counterparts are not known at all.
+ CORBA::Boolean is_equivalent (const TAO_Endpoint *other_endpoint);
+
+ /// Return a copy of the corresponding endpoints by allocating
+ /// memory.
+ virtual TAO_Endpoint *duplicate (void);
+
+ /// Return a hash value for this object. Note that only the IP
+ /// address and port are used to generate the hash value. This may
+ /// cause a few more hash table collisions in the transport cache,
+ /// because a synthesized SSLIOP endpoints for an address will
+ /// have the same hash value as a fully qualified one. The
+ /// redeeming feature is that it makes / bi-directional SSLIOP work
+ /// by allowing descendent class (Synthetic_Endpoint) instances to
+ /// be used as keys in the cache manager and match other fully
+ /// qualified endpoint. (which were used earlier to cache a
+ /// particular transport)
+ virtual CORBA::ULong hash (void);
+ //@}
+
+ /**
+ * @name SSLIOP_Endpoint-specific Methods
+ */
+ //@{
+ /// Return SSL component corresponding to this endpoint.
+ const ::SSLIOP::SSL &ssl_component (void) const;
+
+ /// Accessor to our IIOP counterpart.
+ TAO_IIOP_Endpoint *iiop_endpoint (void) const;
+
+ /// Mutator to our IIOP counterpart.
+ /**
+ * @param destroy If set to @c true, the TAO::SSLIOP::Endpoint
+ * object retains ownership of the given
+ * TAO_IIOP_Endpoint.
+ */
+ void iiop_endpoint (TAO_IIOP_Endpoint *endpoint, bool destroy);
+
+ /// Return the SSLIOP-specific ACE_INET_Addr.
+ const ACE_INET_Addr &object_addr (void) const;
+
+ /// Set the Quality-of-Protection, establishment of trust, and
+ /// credentials for this endpoint. This is all done in one function
+ /// so that the guard may be used uniformly.
+ void set_sec_attrs (::Security::QOP qop,
+ const ::Security::EstablishTrust &trust,
+ const TAO::SSLIOP::OwnCredentials_ptr creds);
+
+ /// Get the Quality-of-Protection settings for this endpoint.
+ ::Security::QOP qop (void) const;
+
+ /// Get the establishment of trust settings for this endpoint.
+ ::Security::EstablishTrust trust (void) const;
+
+ /// Get the credentials for this endpoint.
+ /**
+ * @note This method does not follow C++ mapping memory
+ * management rules. Specifically, no duplication or
+ * reference counting occurs in this method. This is so
+ * that no additional locks occur when checking the
+ * transport cache.
+ */
+ TAO::SSLIOP::OwnCredentials * credentials (void) const;
+ //@}
+
+
+ /// Credentials are not supplied by the constructor, and it is
+ /// valid to have a nil credential, for instance if the
+ /// SSL_use_certificate() method returns 0. Therefore it is
+ /// necessary to have a new method to distinguish between a
+ /// credential that is nil because it has not been set, vs one
+ /// that was set to nil explicitly.
+ int credentials_set (void) const;
+
+ protected:
+
+ /// Cache the SSL tagged component in a decoded format. Notice
+ /// that we do not need to marshal this object!
+ ::SSLIOP::SSL ssl_component_;
+
+ private:
+
+ /// Cached instance of ACE_INET_Addr for use in making invocations,
+ /// etc.
+ mutable ACE_INET_Addr object_addr_;
+
+ /// IIOP Endpoints can be stringed into a list. Return the next
+ /// endpoint in the list, if any.
+ TAO_SSLIOP_Endpoint *next_;
+
+ /// IIOP counterpart.
+ /**
+ * Since SSLIOP is an 'extension' of IIOP, each SSLIOP_Endpoint
+ * contains SSL-specific information plus a pointer to the
+ * IIOP_Endpoint containing the IIOP portion of our address.
+ */
+ TAO_IIOP_Endpoint *iiop_endpoint_;
+
+ /// Flag that determines whether or not the iiop_endpoint_ member is
+ /// deallocated with delete().
+ bool destroy_iiop_endpoint_;
+
+ /// Quailty-of-Protection settings for this endpoint object.
+ ::Security::QOP qop_;
+
+ /// Establishment of trust settings for this endpoint object.
+ ::Security::EstablishTrust trust_;
+
+ /// SSLIOP-specific credentials for this endpoint object.
+ TAO::SSLIOP::OwnCredentials_var credentials_;
+
+ /// A flag indicating that credentials_ was explicitly initialized
+ int credentials_set_;
+ };
+
+ /**
+ * @class SSLIOP_Synthetic_Endpoint
+ *
+ * @brief SSLIOP-specific implementation of PP Framework Endpoint
+ * interface, representing synthetic endpoints. An endpoints
+ * is synthetic whenever there is insuficient data to fully
+ * initialize an SSLIOP endpoint: qop, trust, credentials,
+ * etc. Such as when creating an SSLIOP endpoint in response
+ * of a Listen Point List or accepting a connection.
+ *
+ * LPL and IOR-originated endpoints can now compare as
+ * equivalent, if they denote the same host, port and
+ * protection. That would have given some false
+ * positives in some very obscure cases (same SSL port, but
+ * different protection or undelying IIOP port, or vice versa)
+ * The "synthetic eVndpoint" has its very own is_equivalent()
+ * to help eliminate any false positives and make the process
+ * more clear.
+ *
+ */
+ class TAO_SSLIOP_Export TAO_SSLIOP_Synthetic_Endpoint : public TAO_SSLIOP_Endpoint
+ {
+ public:
+
+ /// Constructor
+ TAO_SSLIOP_Synthetic_Endpoint (TAO_IIOP_Endpoint *iiop_endp);
+
+ /// Destructor.
+ virtual ~TAO_SSLIOP_Synthetic_Endpoint (void);
+
+ /**
+ * Return true if this endpoint is equivalent to @param
+ * other_endpoint.
+ * Two synthetic endpoints are equivalent iff their iiop counterparts are
+ * equivalent, and, if both have non-zero ssl ports, their ssl
+ * ports are the same.
+ */
+ CORBA::Boolean is_equivalent (const TAO_Endpoint *other_endpoint);
+
+ /// Return a copy of the corresponding endpoints by allocating
+ /// memory.
+ virtual TAO_Endpoint *duplicate (void);
+
+ private:
+ TAO_SSLIOP_Synthetic_Endpoint (const ::SSLIOP::SSL *ssl);
+
+ };
+
+// } // End SSLIOP namespace.
+// } // End TAO namespace.
+
+TAO_END_VERSIONED_NAMESPACE_DECL
+
+#if defined (__ACE_INLINE__)
+#include "orbsvcs/SSLIOP/SSLIOP_Endpoint.i"
+#endif /* __ACE_INLINE__ */
+
+#include /**/ "ace/post.h"
+
+#endif /* TAO_SSLIOP_ENDPOINT_H */
diff --git a/TAO/orbsvcs/orbsvcs/SSLIOP/SSLIOP_Endpoint.i b/TAO/orbsvcs/orbsvcs/SSLIOP/SSLIOP_Endpoint.i
new file mode 100644
index 00000000000..9ea9beb96b6
--- /dev/null
+++ b/TAO/orbsvcs/orbsvcs/SSLIOP/SSLIOP_Endpoint.i
@@ -0,0 +1,70 @@
+// -*- C++ -*-
+//
+// $Id$
+
+
+TAO_BEGIN_VERSIONED_NAMESPACE_DECL
+
+ACE_INLINE TAO_IIOP_Endpoint *
+TAO_SSLIOP_Endpoint::iiop_endpoint (void) const
+{
+ return this->iiop_endpoint_;
+}
+
+ACE_INLINE void
+TAO_SSLIOP_Endpoint::iiop_endpoint (TAO_IIOP_Endpoint *iiop_endpoint,
+ bool destroy)
+{
+ if (iiop_endpoint != 0)
+ {
+ TAO_IIOP_Endpoint *new_endpoint = 0;
+
+ if (destroy)
+ {
+ TAO_Endpoint *endpoint = iiop_endpoint->duplicate ();
+
+ new_endpoint = dynamic_cast<TAO_IIOP_Endpoint *> (endpoint);
+
+ }
+ else
+ new_endpoint = iiop_endpoint;
+
+ if (this->destroy_iiop_endpoint_)
+ delete this->iiop_endpoint_;
+
+ this->iiop_endpoint_ = new_endpoint;
+ this->destroy_iiop_endpoint_ = destroy;
+ }
+}
+
+ACE_INLINE const ::SSLIOP::SSL &
+TAO_SSLIOP_Endpoint::ssl_component (void) const
+{
+ return this->ssl_component_;
+}
+
+ACE_INLINE ::Security::QOP
+TAO_SSLIOP_Endpoint::qop (void) const
+{
+ return this->qop_;
+}
+
+ACE_INLINE ::Security::EstablishTrust
+TAO_SSLIOP_Endpoint::trust (void) const
+{
+ return this->trust_;
+}
+
+ACE_INLINE TAO::SSLIOP::OwnCredentials *
+TAO_SSLIOP_Endpoint::credentials (void) const
+{
+ return this->credentials_.in ();
+}
+
+ACE_INLINE int
+TAO_SSLIOP_Endpoint::credentials_set (void) const
+{
+ return this->credentials_set_;
+}
+
+TAO_END_VERSIONED_NAMESPACE_DECL
diff --git a/TAO/orbsvcs/orbsvcs/SSLIOP/SSLIOP_Export.h b/TAO/orbsvcs/orbsvcs/SSLIOP/SSLIOP_Export.h
new file mode 100644
index 00000000000..806577d0855
--- /dev/null
+++ b/TAO/orbsvcs/orbsvcs/SSLIOP/SSLIOP_Export.h
@@ -0,0 +1,40 @@
+
+// -*- C++ -*-
+// $Id$
+// Definition for Win32 Export directives.
+// This file is generated automatically by generate_export_file.pl
+// ------------------------------
+#ifndef TAO_SSLIOP_EXPORT_H
+#define TAO_SSLIOP_EXPORT_H
+
+#include "ace/config-all.h"
+
+#if defined (TAO_AS_STATIC_LIBS)
+# if !defined (TAO_SSLIOP_HAS_DLL)
+# define TAO_SSLIOP_HAS_DLL 0
+# endif /* ! TAO_SSLIOP_HAS_DLL */
+#else
+# if !defined (TAO_SSLIOP_HAS_DLL)
+# define TAO_SSLIOP_HAS_DLL 1
+# endif /* ! TAO_SSLIOP_HAS_DLL */
+#endif
+
+#if defined (TAO_SSLIOP_HAS_DLL) && (TAO_SSLIOP_HAS_DLL == 1)
+# if defined (TAO_SSLIOP_BUILD_DLL)
+# define TAO_SSLIOP_Export ACE_Proper_Export_Flag
+# define TAO_SSLIOP_SINGLETON_DECLARATION(T) ACE_EXPORT_SINGLETON_DECLARATION (T)
+# define TAO_SSLIOP_SINGLETON_DECLARE(SINGLETON_TYPE, CLASS, LOCK) ACE_EXPORT_SINGLETON_DECLARE(SINGLETON_TYPE, CLASS, LOCK)
+# else /* TAO_SSLIOP_BUILD_DLL */
+# define TAO_SSLIOP_Export ACE_Proper_Import_Flag
+# define TAO_SSLIOP_SINGLETON_DECLARATION(T) ACE_IMPORT_SINGLETON_DECLARATION (T)
+# define TAO_SSLIOP_SINGLETON_DECLARE(SINGLETON_TYPE, CLASS, LOCK) ACE_IMPORT_SINGLETON_DECLARE(SINGLETON_TYPE, CLASS, LOCK)
+# endif /* TAO_SSLIOP_BUILD_DLL */
+#else /* TAO_SSLIOP_HAS_DLL == 1 */
+# define TAO_SSLIOP_Export
+# define TAO_SSLIOP_SINGLETON_DECLARATION(T)
+# define TAO_SSLIOP_SINGLETON_DECLARE(SINGLETON_TYPE, CLASS, LOCK)
+#endif /* TAO_SSLIOP_HAS_DLL == 1 */
+
+#endif /* TAO_SSLIOP_EXPORT_H */
+
+// End of auto generated file.
diff --git a/TAO/orbsvcs/orbsvcs/SSLIOP/SSLIOP_Factory.cpp b/TAO/orbsvcs/orbsvcs/SSLIOP/SSLIOP_Factory.cpp
new file mode 100644
index 00000000000..49a369925e7
--- /dev/null
+++ b/TAO/orbsvcs/orbsvcs/SSLIOP/SSLIOP_Factory.cpp
@@ -0,0 +1,614 @@
+#include "orbsvcs/SSLIOP/SSLIOP_Factory.h"
+#include "orbsvcs/SSLIOP/SSLIOP_Acceptor.h"
+#include "orbsvcs/SSLIOP/SSLIOP_Connector.h"
+#include "orbsvcs/SSLIOP/SSLIOP_ORBInitializer.h"
+#include "ace/OS_NS_strings.h"
+
+#include "orbsvcs/Security/Security_ORBInitializer.h" /// @todo should go away
+
+#include "tao/debug.h"
+#include "tao/ORBInitializer_Registry.h"
+
+#include "ace/SSL/sslconf.h"
+#include "ace/SSL/SSL_Context.h"
+
+ACE_RCSID (SSLIOP,
+ SSLIOP_Factory,
+ "$Id$")
+
+
+// An SSL session id seed value. Needs not be too unique, just somewhat
+// different. See the OpenSSL manual
+static const unsigned char session_id_context_[] =
+ "$Id$";
+
+// Protocol name prefix
+static const char * const the_prefix[] = {"iiop", "ssliop"};
+
+// An OS-dependent path separator character
+static ACE_TCHAR const TAO_PATH_SEPARATOR_STRING[] =
+#if defined(ACE_WIN32)
+ ACE_TEXT (";");
+#else
+ ACE_TEXT (":");
+#endif
+
+TAO_BEGIN_VERSIONED_NAMESPACE_DECL
+
+namespace TAO
+{
+ namespace SSLIOP
+ {
+ static const long ACCEPT_TIMEOUT = 10; // Default accept timeout
+ // in seconds.
+ }
+}
+
+TAO::SSLIOP::Protocol_Factory::Protocol_Factory (void)
+ : TAO_Protocol_Factory (IOP::TAG_INTERNET_IOP),
+ qop_ (::Security::SecQOPIntegrityAndConfidentiality),
+ timeout_ (TAO::SSLIOP::ACCEPT_TIMEOUT)
+{
+}
+
+TAO::SSLIOP::Protocol_Factory::~Protocol_Factory (void)
+{
+}
+
+int
+TAO::SSLIOP::Protocol_Factory::match_prefix (const ACE_CString &prefix)
+{
+ // Check for the proper prefix for this protocol.
+ return (ACE_OS::strcasecmp (prefix.c_str (), ::the_prefix[0]) == 0)
+ || (ACE_OS::strcasecmp (prefix.c_str (), ::the_prefix[1]) == 0);
+}
+
+const char *
+TAO::SSLIOP::Protocol_Factory::prefix (void) const
+{
+ // Note: This method doesn't seem to be used anywhere. Moreover,
+ // keeping it may make things more confusing - a Factory can
+ // well be handling multiple protocol prefixes, not just one!
+ // Shouldn't it be deprecated?
+ return ::the_prefix[0];
+}
+
+char
+TAO::SSLIOP::Protocol_Factory::options_delimiter (void) const
+{
+ return '/';
+}
+
+TAO_Acceptor *
+TAO::SSLIOP::Protocol_Factory::make_acceptor (void)
+{
+ TAO_Acceptor *acceptor = 0;
+
+ ACE_NEW_RETURN (acceptor,
+ TAO::SSLIOP::Acceptor (this->qop_,
+ this->timeout_),
+ 0);
+
+ return acceptor;
+}
+
+
+// Parses a X509 path. Beware: This function modifies
+// the buffer pointed to by arg!
+int
+TAO::SSLIOP::Protocol_Factory::parse_x509_file (char *arg,
+ char **path)
+{
+ ACE_ASSERT (arg != 0);
+ ACE_ASSERT (path != 0);
+
+ char *lst = 0;
+ const char *type_name = ACE_OS::strtok_r (arg, ":", &lst);
+ *path = ACE_OS::strtok_r (0, "", &lst);
+
+ if (ACE_OS::strcasecmp (type_name, "ASN1") == 0)
+ return SSL_FILETYPE_ASN1;
+
+ if (ACE_OS::strcasecmp (type_name, "PEM") == 0)
+ return SSL_FILETYPE_PEM;
+
+ return -1;
+}
+
+
+int
+TAO::SSLIOP::Protocol_Factory::init (int argc,
+ char* argv[])
+{
+ char *certificate_path = 0;
+ char *private_key_path = 0;
+ char *dhparams_path = 0;
+ char *ca_file = 0;
+ char *ca_dir = 0;
+ char *rand_path = 0;
+
+ int certificate_type = -1;
+ int private_key_type = -1;
+ int dhparams_type = -1;
+
+ int prevdebug = -1;
+
+ CSIIOP::AssociationOptions csiv2_target_supports =
+ CSIIOP::Integrity | CSIIOP::Confidentiality;
+ CSIIOP::AssociationOptions csiv2_target_requires =
+ CSIIOP::Integrity | CSIIOP::Confidentiality;
+
+ // Force the Singleton instance to be initialized/instantiated.
+ // Some SSLIOP option combinations below will result in the
+ // Singleton instance never being initialized. In that case,
+ // problems may occur later on due to lack of initialization of the
+ // underlying SSL library (e.g. OpenSSL), which occurs when an
+ // ACE_SSL_Context is instantiated.
+
+ // The code is cleaner this way anyway.
+ ACE_SSL_Context * ssl_ctx = ACE_SSL_Context::instance ();
+ ACE_ASSERT (ssl_ctx != 0);
+
+ size_t session_id_len =
+ (sizeof session_id_context_ >= SSL_MAX_SSL_SESSION_ID_LENGTH)
+ ? SSL_MAX_SSL_SESSION_ID_LENGTH
+ : sizeof session_id_context_;
+
+ // Note that this function returns 1, if the operation succeded.
+ // See SSL_CTX_set_session_id_context(3)
+ if( 1 != ::SSL_CTX_set_session_id_context (ssl_ctx->context(),
+ session_id_context_,
+ session_id_len))
+ {
+ if (TAO_debug_level > 0)
+ ACE_DEBUG ((LM_ERROR,
+ ACE_TEXT ("TAO (%P|%t) Unable to set the session id ")
+ ACE_TEXT ("context to \'%s\'\n"), session_id_context_));
+
+ return -1;
+ }
+
+ for (int curarg = 0; curarg != argc; ++curarg)
+ {
+ if ((ACE_OS::strcasecmp (argv[curarg],
+ "-verbose") == 0)
+ || (ACE_OS::strcasecmp (argv[curarg],
+ "-v") == 0))
+ {
+ if (TAO_debug_level == 0)
+ {
+ prevdebug = TAO_debug_level;
+ TAO_debug_level = 1;
+ }
+ }
+
+ else if (ACE_OS::strcasecmp (argv[curarg],
+ "-SSLNoProtection") == 0)
+ {
+ // Enable the eNULL cipher. Note that enabling the "eNULL"
+ // cipher only disables encryption. However, certificate
+ // exchanges will still occur.
+ if (::SSL_CTX_set_cipher_list (ssl_ctx->context (),
+ "DEFAULT:eNULL") == 0)
+ {
+ if (TAO_debug_level > 0)
+ ACE_DEBUG ((LM_ERROR,
+ ACE_TEXT ("TAO (%P|%t) Unable to set eNULL ")
+ ACE_TEXT ("SSL cipher in SSLIOP ")
+ ACE_TEXT ("factory.\n")));
+
+ return -1;
+ }
+
+ // This does not disable secure invocations on the server
+ // side. It merely enables insecure ones. On the client
+ // side, secure invocations will be disabled unless
+ // overridden by a SecurityLevel2::QOPPolicy in the object
+ // reference.
+ this->qop_ = ::Security::SecQOPNoProtection;
+
+ ACE_SET_BITS (csiv2_target_supports,
+ CSIIOP::NoProtection);
+
+ ACE_CLR_BITS (csiv2_target_requires,
+ CSIIOP::Confidentiality);
+ }
+
+ else if (ACE_OS::strcasecmp (argv[curarg],
+ "-SSLCertificate") == 0)
+ {
+ curarg++;
+ if (curarg < argc)
+ {
+ certificate_type = parse_x509_file (argv[curarg], &certificate_path);
+ }
+ }
+
+ else if (ACE_OS::strcasecmp (argv[curarg],
+ "-SSLPrivateKey") == 0)
+ {
+ curarg++;
+ if (curarg < argc)
+ {
+ private_key_type = parse_x509_file (argv[curarg], &private_key_path);
+ }
+ }
+
+ else if (ACE_OS::strcasecmp (argv[curarg],
+ "-SSLAuthenticate") == 0)
+ {
+ curarg++;
+ if (curarg < argc)
+ {
+ int mode = SSL_VERIFY_NONE;
+ if (ACE_OS::strcasecmp (argv[curarg], "NONE") == 0)
+ {
+ mode = SSL_VERIFY_NONE;
+ }
+ else if (ACE_OS::strcasecmp (argv[curarg], "SERVER") == 0)
+ {
+ mode = SSL_VERIFY_PEER;
+
+ ACE_SET_BITS (csiv2_target_supports,
+ CSIIOP::EstablishTrustInTarget
+ | CSIIOP::EstablishTrustInClient);
+ }
+ else if (ACE_OS::strcasecmp (argv[curarg], "CLIENT") == 0
+ || ACE_OS::strcasecmp (argv[curarg],
+ "SERVER_AND_CLIENT") == 0)
+ {
+ mode = SSL_VERIFY_PEER | SSL_VERIFY_FAIL_IF_NO_PEER_CERT;
+
+ ACE_SET_BITS (csiv2_target_supports,
+ CSIIOP::EstablishTrustInTarget
+ | CSIIOP::EstablishTrustInClient);
+
+ ACE_SET_BITS (csiv2_target_requires,
+ CSIIOP::EstablishTrustInClient);
+ }
+
+ ssl_ctx->default_verify_mode (mode);
+ }
+ }
+
+ else if (ACE_OS::strcasecmp (argv[curarg],
+ "-SSLAcceptTimeout") == 0)
+ {
+ curarg++;
+ if (curarg < argc)
+ {
+ float timeout = 0;
+
+ if (sscanf (argv[curarg], "%f", &timeout) != 1
+ || timeout < 0)
+ ACE_ERROR_RETURN ((LM_ERROR,
+ "ERROR: Invalid -SSLAcceptTimeout "
+ "value: %s.\n",
+ argv[curarg]),
+ -1);
+ else
+ this->timeout_.set (timeout);
+ }
+ }
+
+ else if (ACE_OS::strcasecmp (argv[curarg],
+ "-SSLDHparams") == 0)
+ {
+ curarg++;
+ if (curarg < argc)
+ {
+ dhparams_type = parse_x509_file (argv[curarg], &dhparams_path);
+ }
+ }
+
+ else if (ACE_OS::strcasecmp (argv[curarg],
+ "-SSLCAfile") == 0)
+ {
+ curarg++;
+ if (curarg < argc)
+ {
+ (void) parse_x509_file (argv[curarg], &ca_file);
+ }
+ }
+
+ else if (ACE_OS::strcasecmp (argv[curarg],
+ "-SSLCApath") == 0)
+ {
+ curarg++;
+ if (curarg < argc)
+ {
+ ca_dir = argv[curarg];
+ }
+ }
+
+ else if (ACE_OS::strcasecmp (argv[curarg],
+ "-SSLrand") == 0)
+ {
+ curarg++;
+ if (curarg < argc)
+ {
+ rand_path = argv[curarg];
+ }
+ }
+ }
+
+ // Load some (more) entropy from the user specified sources
+ // in addition to what's pointed to by ACE_SSL_RAND_FILE_ENV
+ if (rand_path != 0)
+ {
+ short errors = 0;
+ char *file_name = 0;
+ const char *path = ACE_OS::strtok_r (rand_path,
+ TAO_PATH_SEPARATOR_STRING,
+ &file_name);
+ while ( path != 0)
+ {
+ if( -1 == ssl_ctx->seed_file (path, -1))
+ {
+ errors++;
+
+ if (TAO_debug_level > 0)
+ ACE_DEBUG ((LM_ERROR,
+ ACE_TEXT ("TAO (%P|%t) Failed to load ")
+ ACE_TEXT ("more entropy from <%s>: %m\n"), path));
+ }
+ else
+ {
+ if (TAO_debug_level > 0)
+ ACE_DEBUG ((LM_ERROR,
+ ACE_TEXT ("TAO (%P|%t) Loaded ")
+ ACE_TEXT ("more entropy from <%s>\n"), path));
+ }
+
+ path = ACE_OS::strtok_r (0, TAO_PATH_SEPARATOR_STRING, &file_name);
+ }
+
+ if (errors > 0)
+ return -1;
+ }
+
+ // Load any trusted certificates explicitely rather than relying on
+ // previously set SSL_CERT_FILE and/or SSL_CERT_PATH environment variable
+ if (ca_file != 0 || ca_dir != 0)
+ {
+ if (ssl_ctx->load_trusted_ca (ca_file, ca_dir) != 0)
+ {
+ if (TAO_debug_level > 0)
+ ACE_DEBUG ((LM_ERROR,
+ ACE_TEXT ("TAO (%P|%t) Unable to load ")
+ ACE_TEXT ("CA certs from %s%s%s\n"),
+ ((ca_file != 0) ? ca_file : ACE_TEXT ("a file pointed to by ")
+ ACE_TEXT (ACE_SSL_CERT_FILE_ENV)
+ ACE_TEXT (" env var (if any)")),
+ ACE_TEXT (" and "),
+ ((ca_dir != 0) ? ca_dir : ACE_TEXT ("a directory pointed to by ")
+ ACE_TEXT (ACE_SSL_CERT_DIR_ENV)
+ ACE_TEXT (" env var (if any)"))));
+
+ return -1;
+ }
+ else
+ {
+ if (TAO_debug_level > 0)
+ ACE_DEBUG ((LM_INFO,
+ ACE_TEXT ("TAO (%P|%t) SSLIOP loaded ")
+ ACE_TEXT ("Trusted Certificates from %s%s%s\n"),
+ ((ca_file != 0) ? ca_file : ACE_TEXT ("a file pointed to by ")
+ ACE_TEXT (ACE_SSL_CERT_FILE_ENV)
+ ACE_TEXT (" env var (if any)")),
+ ACE_TEXT (" and "),
+ ((ca_dir != 0) ? ca_dir : ACE_TEXT ("a directory pointed to by ")
+ ACE_TEXT (ACE_SSL_CERT_DIR_ENV)
+ ACE_TEXT (" env var (if any)"))));
+ }
+ }
+
+ // Load in the DH params. If there was a file explicitly specified,
+ // then we do that here, otherwise we load them in from the cert file.
+ // Note that we only do this on the server side, I think so we might
+ // need to defer this 'til later in the acceptor or something...
+ if (dhparams_path == 0)
+ {
+ // If the user didn't explicitly specify a DH parameters file, we
+ // also might find it concatenated in the certificate file.
+ // So, we set the dhparams to that if it wasn't explicitly set.
+ dhparams_path = certificate_path;
+ dhparams_type = certificate_type;
+ }
+
+ if (dhparams_path != 0)
+ {
+ if (ssl_ctx->dh_params (dhparams_path,
+ dhparams_type) != 0)
+ {
+ if (dhparams_path != certificate_path)
+ {
+ // We only want to fail catastrophically if the user specified
+ // a dh parameter file and we were unable to actually find it
+ // and load from it.
+ if (TAO_debug_level > 0)
+ ACE_DEBUG ((LM_ERROR,
+ ACE_TEXT ("(%P|%t) SSLIOP_Factory: ")
+ ACE_TEXT ("unable to set ")
+ ACE_TEXT ("DH parameters <%s>\n"),
+ dhparams_path));
+ return -1;
+ }
+ else
+ {
+ if (TAO_debug_level > 0)
+ ACE_DEBUG ((LM_INFO,
+ ACE_TEXT ("(%P|%t) SSLIOP_Factory: ")
+ ACE_TEXT ("No DH parameters found in ")
+ ACE_TEXT ("certificate <%s>; either none ")
+ ACE_TEXT ("are needed (RSA) or problems ")
+ ACE_TEXT ("will ensue later.\n"),
+ dhparams_path));
+ }
+ }
+ else
+ {
+ if (TAO_debug_level > 0)
+ ACE_DEBUG ((LM_INFO,
+ ACE_TEXT ("(%P|%t) SSLIOP loaded ")
+ ACE_TEXT ("Diffie-Hellman params ")
+ ACE_TEXT ("from %s\n"),
+ dhparams_path));
+ }
+ }
+
+ // The certificate must be set before the private key since the
+ // ACE_SSL_Context attempts to check the private key for
+ // consistency. That check requires the certificate to be available
+ // in the underlying SSL_CTX.
+ if (certificate_path != 0)
+ {
+ if (ssl_ctx->certificate (certificate_path,
+ certificate_type) != 0)
+ {
+ if (TAO_debug_level > 0)
+ ACE_DEBUG ((LM_ERROR,
+ ACE_TEXT ("TAO (%P|%t) Unable to set ")
+ ACE_TEXT ("SSL certificate <%s> ")
+ ACE_TEXT ("in SSLIOP factory.\n"),
+ certificate_path));
+
+ return -1;
+ }
+ else
+ {
+ if (TAO_debug_level > 0)
+ ACE_DEBUG ((LM_INFO,
+ ACE_TEXT ("TAO (%P|%t) SSLIOP loaded ")
+ ACE_TEXT ("SSL certificate ")
+ ACE_TEXT ("from %s\n"),
+ certificate_path));
+ }
+ }
+
+ if (private_key_path != 0)
+ {
+ if (ssl_ctx->private_key (private_key_path,
+ private_key_type) != 0)
+ {
+ if (TAO_debug_level > 0)
+ {
+ ACE_DEBUG ((LM_ERROR,
+ ACE_TEXT ("TAO (%P|%t) Unable to set ")
+ ACE_TEXT ("SSL private key ")
+ ACE_TEXT ("<%s> in SSLIOP factory.\n"),
+ private_key_path));
+ }
+
+ return -1;
+ }
+ else
+ {
+ if (TAO_debug_level > 0)
+ ACE_DEBUG ((LM_INFO,
+ ACE_TEXT ("TAO (%P|%t) SSLIOP loaded ")
+ ACE_TEXT ("Private Key ")
+ ACE_TEXT ("from %s\n"),
+ private_key_path));
+ }
+ }
+
+ if (this->register_orb_initializer (csiv2_target_supports,
+ csiv2_target_requires) != 0)
+ return -1;
+
+ if (prevdebug != -1)
+ TAO_debug_level = prevdebug;
+
+ return 0;
+}
+
+int
+TAO::SSLIOP::Protocol_Factory::register_orb_initializer (
+ CSIIOP::AssociationOptions csiv2_target_supports,
+ CSIIOP::AssociationOptions csiv2_target_requires)
+{
+ ACE_DECLARE_NEW_CORBA_ENV;
+ ACE_TRY
+ {
+ // @todo: This hard-coding should be fixed once SECIOP is
+ // supported.
+ // Register the Security ORB initializer.
+ PortableInterceptor::ORBInitializer_ptr tmp;
+ ACE_NEW_THROW_EX (tmp,
+ TAO::Security::ORBInitializer,
+ CORBA::NO_MEMORY (
+ CORBA::SystemException::_tao_minor_code (
+ TAO::VMCID,
+ ENOMEM),
+ CORBA::COMPLETED_NO));
+ ACE_TRY_CHECK;
+
+ PortableInterceptor::ORBInitializer_var initializer = tmp;
+
+ PortableInterceptor::register_orb_initializer (initializer.in ()
+ ACE_ENV_ARG_PARAMETER);
+ ACE_TRY_CHECK;
+
+ // Register the SSLIOP ORB initializer.
+ // PortableInterceptor::ORBInitializer_ptr tmp;
+ ACE_NEW_THROW_EX (tmp,
+ TAO::SSLIOP::ORBInitializer (this->qop_,
+ csiv2_target_supports,
+ csiv2_target_requires),
+ CORBA::NO_MEMORY (
+ CORBA::SystemException::_tao_minor_code (
+ TAO::VMCID,
+ ENOMEM),
+ CORBA::COMPLETED_NO));
+ ACE_TRY_CHECK;
+
+ //PortableInterceptor::ORBInitializer_var initializer = tmp;
+ initializer = tmp;
+
+ PortableInterceptor::register_orb_initializer (initializer.in ()
+ ACE_ENV_ARG_PARAMETER);
+ ACE_TRY_CHECK;
+ }
+ ACE_CATCHANY
+ {
+ ACE_PRINT_EXCEPTION (ACE_ANY_EXCEPTION,
+ "Unable to register SSLIOP ORB "
+ "initializer.");
+ return -1;
+ }
+ ACE_ENDTRY;
+ ACE_CHECK_RETURN (-1);
+
+ return 0;
+}
+
+
+TAO_Connector *
+TAO::SSLIOP::Protocol_Factory::make_connector (void)
+{
+ TAO_Connector *connector = 0;
+
+ ACE_NEW_RETURN (connector,
+ TAO::SSLIOP::Connector (this->qop_),
+ 0);
+ return connector;
+}
+
+int
+TAO::SSLIOP::Protocol_Factory::requires_explicit_endpoint (void) const
+{
+ return 0;
+}
+
+TAO_END_VERSIONED_NAMESPACE_DECL
+
+ACE_STATIC_SVC_DEFINE (TAO_SSLIOP_Protocol_Factory,
+ ACE_TEXT ("SSLIOP_Factory"),
+ ACE_SVC_OBJ_T,
+ &ACE_SVC_NAME (TAO_SSLIOP_Protocol_Factory),
+ ACE_Service_Type::DELETE_THIS
+ | ACE_Service_Type::DELETE_OBJ,
+ 0)
+
+ACE_FACTORY_DEFINE (TAO_SSLIOP, TAO_SSLIOP_Protocol_Factory)
diff --git a/TAO/orbsvcs/orbsvcs/SSLIOP/SSLIOP_Factory.h b/TAO/orbsvcs/orbsvcs/SSLIOP/SSLIOP_Factory.h
new file mode 100644
index 00000000000..169e12b7bf2
--- /dev/null
+++ b/TAO/orbsvcs/orbsvcs/SSLIOP/SSLIOP_Factory.h
@@ -0,0 +1,141 @@
+// -*- C++ -*-
+
+//=============================================================================
+/**
+ * @file SSLIOP_Factory.h
+ *
+ * $Id$
+ *
+ * SSLIOP implementation of PP Framework Protocol_Factory interface.
+ *
+ * @author Carlos O'Ryan <coryan@uci.edu>
+ * @author Ossama Othman <ossama@uci.edu>
+ */
+//=============================================================================
+
+
+#ifndef TAO_SSLIOP_FACTORY_H
+#define TAO_SSLIOP_FACTORY_H
+
+#include /**/ "ace/pre.h"
+
+#include "orbsvcs/SSLIOP/SSLIOP_Export.h"
+
+#if !defined (ACE_LACKS_PRAGMA_ONCE)
+# pragma once
+#endif /* ACE_LACKS_PRAGMA_ONCE */
+
+#include "orbsvcs/SecurityC.h"
+#include "orbsvcs/CSIIOPC.h"
+
+#include "tao/Protocol_Factory.h"
+
+#include "ace/Service_Config.h"
+
+
+TAO_BEGIN_VERSIONED_NAMESPACE_DECL
+
+class TAO_Acceptor;
+class TAO_Connector;
+
+namespace TAO
+{
+ namespace SSLIOP
+ {
+
+ /**
+ * @class Protocol_Factory
+ *
+ * @brief SSLIOP-specific protocol factory implementation.
+ *
+ * This class implements the SSLIOP-specific protocol factory
+ * implementation for use in TAO's pluggable protocols framework.
+ */
+ class TAO_SSLIOP_Export Protocol_Factory
+ : public TAO_Protocol_Factory
+ {
+ public:
+
+ /// Constructor.
+ Protocol_Factory (void);
+
+ /// Destructor.
+ virtual ~Protocol_Factory (void);
+
+ // = Service Configurator hooks.
+ /// Dynamic linking hook
+ virtual int init (int argc, char* argv[]);
+
+ /// Verify prefix is a match
+ virtual int match_prefix (const ACE_CString & prefix);
+
+ /// Returns the prefix used by the protocol.
+ virtual const char * prefix (void) const;
+
+ /// Return the character used to mark where an endpoint ends and
+ /// where its options begin.
+ virtual char options_delimiter (void) const;
+
+ // = Check Protocol_Factory.h for a description of these methods.
+ virtual TAO_Acceptor * make_acceptor (void);
+ virtual TAO_Connector * make_connector (void);
+ virtual int requires_explicit_endpoint (void) const;
+
+ private:
+
+ /// Parse an X509 file path, which is expected to looks like:
+ /// <X509Path> ::= <Prefix> ':' <Path>
+ /// <Prefix> ::= 'PEM' | 'ASN1'
+ /// <Path> ::= any-string
+ /// Returns either SSL_FILETYPE_ASN1, SSL_FILETYPE_PEM or -1
+ /// if the prefix can not be recognized. The *path will point
+ /// to the part of the original buffer, after the initial ':',
+ /// or will contain 0, if no path was specified.
+ ///
+ /// Beware: This function modifies the buffer pointed to by arg!
+ ///
+ static int parse_x509_file (char *arg, char **path);
+
+ /// Create and register the SSLIOP ORB initializer.
+ int register_orb_initializer (
+ CSIIOP::AssociationOptions csiv2_target_supports,
+ CSIIOP::AssociationOptions csiv2_target_requires);
+
+ private:
+
+ /// Default quality-of-protection settings for the SSLIOP
+ /// pluggable protocol.
+ ::Security::QOP qop_;
+
+ /// The accept() timeout.
+ /**
+ * This timeout includes the overall time to complete the SSL
+ * handshake. This includes both the TCP handshake and the SSL
+ * handshake.
+ */
+ ACE_Time_Value timeout_;
+
+ /// The SSLIOP-specific CSIv2 transport mechanism component.
+ /**
+ * This SSLIOP-specific structure is embedded in the CSIv2 transport
+ * mechanism list of the @c CSIIOP::CompoundSecMechList IOR tagged
+ * component.
+ */
+ // CSIIOP::TLS_SEC_TRANS * csiv2_component_;
+
+ };
+ } // End SSLIOP namespace.
+} // End TAO namespace.
+
+// Work around preprocessor tokenization.
+typedef TAO::SSLIOP::Protocol_Factory TAO_SSLIOP_Protocol_Factory;
+
+TAO_END_VERSIONED_NAMESPACE_DECL
+
+ACE_STATIC_SVC_DECLARE_EXPORT (TAO_SSLIOP, TAO_SSLIOP_Protocol_Factory)
+ACE_STATIC_SVC_REQUIRE (TAO_SSLIOP_Protocol_Factory)
+ACE_FACTORY_DECLARE (TAO_SSLIOP, TAO_SSLIOP_Protocol_Factory)
+
+#include /**/ "ace/post.h"
+
+#endif /* TAO_SSLIOP_FACTORY_H */
diff --git a/TAO/orbsvcs/orbsvcs/SSLIOP/SSLIOP_Invocation_Interceptor.cpp b/TAO/orbsvcs/orbsvcs/SSLIOP/SSLIOP_Invocation_Interceptor.cpp
new file mode 100644
index 00000000000..5e90c389e80
--- /dev/null
+++ b/TAO/orbsvcs/orbsvcs/SSLIOP/SSLIOP_Invocation_Interceptor.cpp
@@ -0,0 +1,175 @@
+#include "orbsvcs/SSLIOP/SSLIOP_Invocation_Interceptor.h"
+
+#include "orbsvcs/SecurityLevel2C.h"
+
+#include "tao/ORB_Constants.h"
+#include "tao/PortableServer/PS_CurrentC.h"
+#include "tao/debug.h"
+
+#if defined(SSLIOP_DEBUG_PEER_CERTIFICATE)
+#include <openssl/x509.h> // @@ For debugging code below
+#endif /* DEBUG_PEER_CERTIFICATES */
+
+ACE_RCSID (SSLIOP,
+ SSLIOP_Invocation_Interceptor,
+ "$Id$")
+
+
+TAO_BEGIN_VERSIONED_NAMESPACE_DECL
+
+TAO::SSLIOP::Server_Invocation_Interceptor::Server_Invocation_Interceptor (
+ ::SSLIOP::Current_ptr current,
+ ::Security::QOP qop)
+ : ssliop_current_ (::SSLIOP::Current::_duplicate (current)),
+ qop_ (qop)
+{
+}
+
+TAO::SSLIOP::Server_Invocation_Interceptor::~Server_Invocation_Interceptor (
+ void)
+{
+}
+
+char *
+TAO::SSLIOP::Server_Invocation_Interceptor::name (
+ ACE_ENV_SINGLE_ARG_DECL_NOT_USED)
+ ACE_THROW_SPEC ((CORBA::SystemException))
+{
+ return CORBA::string_dup ("TAO::SSLIOP::Server_Invocation_Interceptor");
+}
+
+void
+TAO::SSLIOP::Server_Invocation_Interceptor::destroy (
+ ACE_ENV_SINGLE_ARG_DECL_NOT_USED)
+ ACE_THROW_SPEC ((CORBA::SystemException))
+{
+}
+
+
+void
+TAO::SSLIOP::Server_Invocation_Interceptor::receive_request_service_contexts (
+ PortableInterceptor::ServerRequestInfo_ptr /*ri*/
+ ACE_ENV_ARG_DECL)
+ ACE_THROW_SPEC ((CORBA::SystemException,
+ PortableInterceptor::ForwardRequest))
+{
+ // The current upcall is not being performed through an SSL
+ // connection. If server is configured to disallow insecure
+ // invocations then throw a CORBA::NO_PERMISSION exception.
+ // @@ TODO: Once the SecurityManager is implemented, query it
+ // for the current object's
+ // SecureInvocationPolicy of type
+ // SecTargetSecureInvocationPolicy so that we can
+ // accept or reject requests on a per-object basis
+ // instead on a per-endpoint basis.
+ CORBA::Boolean const no_ssl =
+ this->ssliop_current_->no_context (ACE_ENV_SINGLE_ARG_PARAMETER);
+ ACE_CHECK;
+
+ if (TAO_debug_level >= 3)
+ ACE_DEBUG ((LM_DEBUG, "SSLIOP (%P|%t) Interceptor (context), ssl=%d\n", !(no_ssl)));
+
+ if (no_ssl && this->qop_ != ::Security::SecQOPNoProtection)
+ ACE_THROW (CORBA::NO_PERMISSION ());
+
+#if defined(DEBUG_PEER_CERTIFICATES)
+ ACE_TRY
+ {
+ // If the request was not made through an SSL connection, then
+ // this method will throw the SSLIOP::Current::NoContext
+ // exception. Otherwise, it will return a DER encoded X509
+ // certificate.
+ ::SSLIOP::ASN_1_Cert_var cert =
+ this->ssliop_current_->get_peer_certificate (
+ ACE_ENV_SINGLE_ARG_PARAMETER);
+ ACE_TRY_CHECK;
+
+ // @@ The following debugging code works but I don't think that
+ // we should include it since it dumps alot of information,
+ // i.e. prints two lines of information per request.
+ if (TAO_debug_level > 1)
+ {
+ CORBA::Octet *der_cert = cert->get_buffer ();
+
+ X509 *peer = ::d2i_X509 (0, &der_cert, cert->length ());
+ if (peer != 0)
+ {
+ char buf[BUFSIZ] = { 0 };
+
+ ::X509_NAME_oneline (::X509_get_subject_name (peer),
+ buf,
+ BUFSIZ);
+
+ ACE_DEBUG ((LM_DEBUG,
+ "(%P|%t) Certificate subject: %s\n",
+ buf));
+
+ ::X509_NAME_oneline (::X509_get_issuer_name (peer),
+ buf,
+ BUFSIZ);
+
+ ACE_DEBUG ((LM_DEBUG,
+ "(%P|%t) Certificate issuer: %s\n",
+ buf));
+
+
+ ::X509_free (peer);
+ }
+ }
+ }
+ ACE_CATCH (::SSLIOP::Current::NoContext, exc)
+ {
+ // The current upcall is not being performed through an SSL
+ // connection. If server is configured to disallow insecure
+ // invocations then throw a CORBA::NO_PERMISSION exception.
+ // @@ TODO: Once the SecurityManager is implemented, query it
+ // for the current object's
+ // SecureInvocationPolicy of type
+ // SecTargetSecureInvocationPolicy so that we can
+ // accept or reject requests on a per-object basis
+ // instead on a per-endpoint basis.
+ if (this->qop_ != ::Security::SecQOPNoProtection)
+ ACE_THROW (CORBA::NO_PERMISSION ());
+ }
+ ACE_ENDTRY;
+ ACE_CHECK;
+#endif /* DEBUG_PEER_CERTIFICATES */
+}
+
+
+void
+TAO::SSLIOP::Server_Invocation_Interceptor::receive_request (
+ PortableInterceptor::ServerRequestInfo_ptr /* ri */
+ ACE_ENV_ARG_DECL_NOT_USED)
+ ACE_THROW_SPEC ((CORBA::SystemException,
+ PortableInterceptor::ForwardRequest))
+{
+}
+
+void
+TAO::SSLIOP::Server_Invocation_Interceptor::send_reply (
+ PortableInterceptor::ServerRequestInfo_ptr /* ri */
+ ACE_ENV_ARG_DECL_NOT_USED)
+ ACE_THROW_SPEC ((CORBA::SystemException))
+{
+}
+
+void
+TAO::SSLIOP::Server_Invocation_Interceptor::send_exception (
+ PortableInterceptor::ServerRequestInfo_ptr /* ri */
+ ACE_ENV_ARG_DECL_NOT_USED)
+ ACE_THROW_SPEC ((CORBA::SystemException,
+ PortableInterceptor::ForwardRequest))
+{
+}
+
+void
+TAO::SSLIOP::Server_Invocation_Interceptor::send_other (
+ PortableInterceptor::ServerRequestInfo_ptr /* ri */
+ ACE_ENV_ARG_DECL_NOT_USED)
+ ACE_THROW_SPEC ((CORBA::SystemException,
+ PortableInterceptor::ForwardRequest))
+{
+}
+
+TAO_END_VERSIONED_NAMESPACE_DECL
diff --git a/TAO/orbsvcs/orbsvcs/SSLIOP/SSLIOP_Invocation_Interceptor.h b/TAO/orbsvcs/orbsvcs/SSLIOP/SSLIOP_Invocation_Interceptor.h
new file mode 100644
index 00000000000..9ab7aaffad1
--- /dev/null
+++ b/TAO/orbsvcs/orbsvcs/SSLIOP/SSLIOP_Invocation_Interceptor.h
@@ -0,0 +1,148 @@
+// -*- C++ -*-
+
+// ===================================================================
+/**
+ * @file SSLIOP_Invocation_Interceptor.h
+ *
+ * $Id$
+ *
+ * @author Ossama Othman <ossama@uci.edu>
+ */
+// ===================================================================
+
+#ifndef TAO_SSLIOP_INVOCATION_INTERCEPTOR_H
+#define TAO_SSLIOP_INVOCATION_INTERCEPTOR_H
+
+#include /**/ "ace/pre.h"
+
+#include "orbsvcs/SSLIOP/SSLIOP_Export.h"
+
+#if !defined (ACE_LACKS_PRAGMA_ONCE)
+# pragma once
+#endif /* ACE_LACKS_PRAGMA_ONCE */
+
+#include "orbsvcs/SSLIOPC.h"
+#include "tao/PortableInterceptorC.h"
+#include "tao/PI_Server/PI_Server.h"
+#include "tao/LocalObject.h"
+
+// This is to remove "inherits via dominance" warnings from MSVC.
+// MSVC is being a little too paranoid.
+#if defined (_MSC_VER)
+#pragma warning(push)
+#pragma warning(disable:4250)
+#endif /* _MSC_VER */
+
+
+TAO_BEGIN_VERSIONED_NAMESPACE_DECL
+
+namespace TAO
+{
+ namespace SSLIOP
+ {
+ /**
+ * @class Server_Invocation_Interceptor
+ *
+ * @brief Secure invocation server request interceptor.
+ *
+ * This server request interceptor rejects insecure request
+ * invocations if the effective target object policy requires
+ * secure invocations.
+ */
+ class Server_Invocation_Interceptor
+ : public virtual PortableInterceptor::ServerRequestInterceptor,
+ public virtual TAO_Local_RefCounted_Object
+ {
+ public:
+
+ /// Constructor.
+ Server_Invocation_Interceptor (::SSLIOP::Current_ptr current,
+ ::Security::QOP qop);
+
+ /**
+ * @name PortableInterceptor::ServerRequestInterceptor Methods
+ *
+ * Methods required by the
+ * PortableInterceptor::ServerRequestInterceptor interface.
+ */
+ //@{
+ virtual char * name (ACE_ENV_SINGLE_ARG_DECL_WITH_DEFAULTS)
+ ACE_THROW_SPEC ((CORBA::SystemException));
+
+ virtual void destroy (ACE_ENV_SINGLE_ARG_DECL_WITH_DEFAULTS)
+ ACE_THROW_SPEC ((CORBA::SystemException));
+
+ virtual void receive_request_service_contexts (
+ PortableInterceptor::ServerRequestInfo_ptr ri
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS)
+ ACE_THROW_SPEC ((CORBA::SystemException,
+ PortableInterceptor::ForwardRequest));
+
+ virtual void receive_request (
+ PortableInterceptor::ServerRequestInfo_ptr ri
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS)
+ ACE_THROW_SPEC ((CORBA::SystemException,
+ PortableInterceptor::ForwardRequest));
+
+ virtual void send_reply (
+ PortableInterceptor::ServerRequestInfo_ptr ri
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS)
+ ACE_THROW_SPEC ((CORBA::SystemException));
+
+ virtual void send_exception (
+ PortableInterceptor::ServerRequestInfo_ptr ri
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS)
+ ACE_THROW_SPEC ((CORBA::SystemException,
+ PortableInterceptor::ForwardRequest));
+
+ virtual void send_other (
+ PortableInterceptor::ServerRequestInfo_ptr ri
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS)
+ ACE_THROW_SPEC ((CORBA::SystemException,
+ PortableInterceptor::ForwardRequest));
+ //@}
+
+ protected:
+
+ /// Destructor
+ /**
+ * Protected destructor to force deallocation by the reference
+ * counting mechanism.
+ */
+ ~Server_Invocation_Interceptor (void);
+
+ private:
+
+ /**
+ * @name Copying and Assignment
+ *
+ * Protected to prevent copying through the copy constructor and the
+ * assignment operator.
+ */
+ //@{
+ Server_Invocation_Interceptor (const Server_Invocation_Interceptor &);
+ void operator= (const Server_Invocation_Interceptor &);
+ //@}
+
+ private:
+
+ /// Reference to the current SSLIOP execution context.
+ ::SSLIOP::Current_var ssliop_current_;
+
+ /// The default quality-of-protection settings in use.
+ ::Security::QOP qop_;
+
+ };
+
+ } // End SSLIOP namespace.
+} // End TAO namespace.
+
+TAO_END_VERSIONED_NAMESPACE_DECL
+
+#if defined (_MSC_VER)
+#pragma warning(pop)
+#endif /* _MSC_VER */
+
+#include /**/ "ace/post.h"
+
+#endif /* TAO_SSLIOP_INVOCATION_INTERCEPTOR_H */
diff --git a/TAO/orbsvcs/orbsvcs/SSLIOP/SSLIOP_ORBInitializer.cpp b/TAO/orbsvcs/orbsvcs/SSLIOP/SSLIOP_ORBInitializer.cpp
new file mode 100644
index 00000000000..6f36fa774c5
--- /dev/null
+++ b/TAO/orbsvcs/orbsvcs/SSLIOP/SSLIOP_ORBInitializer.cpp
@@ -0,0 +1,248 @@
+#include "orbsvcs/SSLIOP/SSLIOP_ORBInitializer.h"
+
+
+ACE_RCSID (SSLIOP,
+ SSLIOP_ORBInitializer,
+ "$Id$")
+
+
+#include "orbsvcs/SSLIOP/SSLIOP_Current.h"
+#include "orbsvcs/SSLIOP/SSLIOP_Invocation_Interceptor.h"
+//#include "SSLIOP_IORInterceptor.h"
+#include "orbsvcs/SSLIOP/SSLIOP_CredentialsAcquirerFactory.h"
+
+#include "orbsvcs/Security/SL3_SecurityCurrent.h"
+#include "orbsvcs/Security/SL3_CredentialsCurator.h"
+
+#include "orbsvcs/SSLIOPC.h"
+#include "orbsvcs/CSIIOPC.h"
+
+#include "tao/Exception.h"
+#include "tao/PI/ORBInitInfo.h"
+#include "tao/debug.h"
+
+#include "ace/Auto_Ptr.h"
+
+
+TAO_BEGIN_VERSIONED_NAMESPACE_DECL
+
+TAO::SSLIOP::ORBInitializer::ORBInitializer (
+ ::Security::QOP qop,
+ CSIIOP::AssociationOptions csiv2_target_supports,
+ CSIIOP::AssociationOptions csiv2_target_requires)
+ : qop_ (qop),
+ csiv2_target_supports_ (csiv2_target_supports),
+ csiv2_target_requires_ (csiv2_target_requires)
+{
+}
+
+void
+TAO::SSLIOP::ORBInitializer::pre_init (
+ PortableInterceptor::ORBInitInfo_ptr info
+ ACE_ENV_ARG_DECL)
+ ACE_THROW_SPEC ((CORBA::SystemException))
+{
+ TAO_ORBInitInfo_var tao_info =
+ TAO_ORBInitInfo::_narrow (info
+ ACE_ENV_ARG_PARAMETER);
+ ACE_CHECK;
+
+ if (CORBA::is_nil (tao_info.in ()))
+ ACE_THROW (CORBA::INV_OBJREF ());
+
+ // SSLIOP doesn't use the ORB Core until a request invocation occurs
+ // so there is no problem in retrieving the ORB Core pointer in this
+ // pre_init() method.
+ TAO_ORB_Core *orb_core = tao_info->orb_core ();
+
+ // Create the SSLIOP::Current object.
+ // Note that a new SSLIOP::Current object is created for each ORB.
+ // It wouldn't be very useful to share security context information
+ // with another ORB that isn't configured with security, for
+ // example.
+ SSLIOP::Current_ptr current;
+ ACE_NEW_THROW_EX (current,
+ TAO::SSLIOP::Current (orb_core),
+ CORBA::NO_MEMORY (
+ CORBA::SystemException::_tao_minor_code (
+ TAO::VMCID,
+ ENOMEM),
+ CORBA::COMPLETED_NO));
+ ACE_CHECK;
+
+ SSLIOP::Current_var ssliop_current = current;
+
+ // Register the SSLIOP::Current object reference with the ORB.
+ info->register_initial_reference ("SSLIOPCurrent",
+ ssliop_current.in ()
+ ACE_ENV_ARG_PARAMETER);
+ ACE_CHECK;
+}
+
+void
+TAO::SSLIOP::ORBInitializer::post_init (
+ PortableInterceptor::ORBInitInfo_ptr info
+ ACE_ENV_ARG_DECL)
+ ACE_THROW_SPEC ((CORBA::SystemException))
+{
+ // Note we do not store the SSLIOP::Current as a class member since
+ // we need to avoid potential problems where the same
+ // SSLIOP::Current object is shared between ORBs. Each ORB should
+ // have its own unique SSLIOP::Current object. By obtaining the
+ // SSLIOP::Current object from the resolve_initial_references()
+ // mechanism, we are guaranteed that the SSLIOP::Current object is
+ // specific to the ORB being initialized since a new SSLIOP::Current
+ // object is registered for each ORB in this ORBInitializer's
+ // pre_init() method.
+
+ CORBA::Object_var obj =
+ info->resolve_initial_references ("SSLIOPCurrent"
+ ACE_ENV_ARG_PARAMETER);
+ ACE_CHECK;
+
+ SSLIOP::Current_var ssliop_current =
+ SSLIOP::Current::_narrow (obj.in () ACE_ENV_ARG_PARAMETER);
+ ACE_CHECK;
+
+ if (!CORBA::is_nil (ssliop_current.in ()))
+ {
+ TAO::SSLIOP::Current *tao_current =
+ dynamic_cast<TAO::SSLIOP::Current *> (ssliop_current.in ());
+
+ if (tao_current != 0)
+ {
+ const size_t slot =
+ this->get_tss_slot_id (info ACE_ENV_ARG_PARAMETER);
+ ACE_CHECK;
+
+ tao_current->tss_slot (slot);
+ }
+ else
+ ACE_THROW (CORBA::INTERNAL ());
+ }
+
+ // Create the SSLIOP secure invocation server request interceptor.
+ PortableInterceptor::ServerRequestInterceptor_ptr si =
+ PortableInterceptor::ServerRequestInterceptor::_nil ();
+ ACE_NEW_THROW_EX (si,
+ TAO::SSLIOP::Server_Invocation_Interceptor (
+ ssliop_current.in (),
+ this->qop_),
+ CORBA::NO_MEMORY (
+ CORBA::SystemException::_tao_minor_code (
+ TAO::VMCID,
+ ENOMEM),
+ CORBA::COMPLETED_NO));
+ ACE_CHECK;
+
+ PortableInterceptor::ServerRequestInterceptor_var si_interceptor =
+ si;
+
+ // Register the SSLIOP secure invocation server request interceptor
+ // with the ORB.
+ info->add_server_request_interceptor (si_interceptor.in ()
+ ACE_ENV_ARG_PARAMETER);
+ ACE_CHECK;
+
+// TAO_ORBInitInfo_var tao_info =
+// TAO_ORBInitInfo::_narrow (info
+// ACE_ENV_ARG_PARAMETER);
+// ACE_CHECK;
+
+// if (CORBA::is_nil (tao_info.in ()))
+// ACE_THROW (CORBA::INV_OBJREF ());
+
+// TAO_ORB_Core * orb_core = tao_info->orb_core ();
+
+// // Create the SSLIOP IOR interceptor.
+// PortableInterceptor::IORInterceptor_ptr ii =
+// PortableInterceptor::IORInterceptor::_nil ();
+// ACE_NEW_THROW_EX (ii,
+// TAO::SSLIOP::IORInterceptor (orb_core,
+// this->csiv2_target_supports_,
+// this->csiv2_target_requires_),
+// CORBA::NO_MEMORY (
+// CORBA::SystemException::_tao_minor_code (
+// TAO::VMCID,
+// ENOMEM),
+// CORBA::COMPLETED_NO));
+// ACE_CHECK;
+
+// PortableInterceptor::IORInterceptor_var ior_interceptor =
+// ii;
+
+// // Register the SSLIOP IORInterceptor.
+// info->add_ior_interceptor (ior_interceptor.in ()
+// ACE_ENV_ARG_PARAMETER);
+// ACE_CHECK;
+
+ // Register the SSLIOP-specific vault with the
+ // PrincipalAuthenticator.
+ obj = info->resolve_initial_references ("SecurityLevel3:SecurityManager"
+ ACE_ENV_ARG_PARAMETER);
+ ACE_CHECK;
+
+ SecurityLevel3::SecurityManager_var manager =
+ SecurityLevel3::SecurityManager::_narrow (obj.in ()
+ ACE_ENV_ARG_PARAMETER);
+ ACE_CHECK;
+
+ SecurityLevel3::CredentialsCurator_var curator =
+ manager->credentials_curator (ACE_ENV_SINGLE_ARG_PARAMETER);
+ ACE_CHECK;
+
+ TAO::SL3::CredentialsCurator_var tao_curator =
+ TAO::SL3::CredentialsCurator::_narrow (curator.in ()
+ ACE_ENV_ARG_PARAMETER);
+ ACE_CHECK;
+
+ TAO::SSLIOP::CredentialsAcquirerFactory * factory;
+ ACE_NEW_THROW_EX (factory,
+ TAO::SSLIOP::CredentialsAcquirerFactory,
+ CORBA::NO_MEMORY ());
+ ACE_CHECK;
+
+ auto_ptr<TAO::SSLIOP::CredentialsAcquirerFactory> safe_factory;
+
+ tao_curator->register_acquirer_factory ("SL3TLS",
+ factory
+ ACE_ENV_ARG_PARAMETER);
+ ACE_CHECK;
+
+ (void) safe_factory.release (); // CredentialsCurator now owns
+ // CredentialsAcquirerFactory.
+}
+
+size_t
+TAO::SSLIOP::ORBInitializer::get_tss_slot_id (
+ PortableInterceptor::ORBInitInfo_ptr info
+ ACE_ENV_ARG_DECL)
+{
+ // Obtain the Security Service TSS slot ID from the SecurityCurrent
+ // object.
+ CORBA::Object_var obj =
+ info->resolve_initial_references ("SecurityLevel3:SecurityCurrent"
+ ACE_ENV_ARG_PARAMETER);
+ ACE_CHECK_RETURN (0);
+
+ SecurityLevel3::SecurityCurrent_var current =
+ SecurityLevel3::SecurityCurrent::_narrow (obj.in ()
+ ACE_ENV_ARG_PARAMETER);
+ ACE_CHECK_RETURN (0);
+
+ TAO::SL3::SecurityCurrent * security_current =
+ dynamic_cast<TAO::SL3::SecurityCurrent *> (current.in ());
+
+ if (security_current == 0)
+ {
+ ACE_DEBUG ((LM_DEBUG,
+ "Unable to obtain TSS slot ID from "
+ "\"SecurityCurrent\" object.\n"));
+
+ ACE_THROW_RETURN (CORBA::INTERNAL (), 0);
+ }
+
+ return security_current->tss_slot ();
+}
+
+TAO_END_VERSIONED_NAMESPACE_DECL
diff --git a/TAO/orbsvcs/orbsvcs/SSLIOP/SSLIOP_ORBInitializer.h b/TAO/orbsvcs/orbsvcs/SSLIOP/SSLIOP_ORBInitializer.h
new file mode 100644
index 00000000000..905b526d000
--- /dev/null
+++ b/TAO/orbsvcs/orbsvcs/SSLIOP/SSLIOP_ORBInitializer.h
@@ -0,0 +1,100 @@
+// -*- C++ -*-
+
+//=============================================================================
+/**
+ * @file SSLIOP_ORBInitializer.h
+ *
+ * $Id$
+ *
+ * @author Ossama Othman <ossama@uci.edu>
+ */
+//=============================================================================
+
+
+#ifndef TAO_SSLIOP_ORB_INITIALIZER_H
+#define TAO_SSLIOP_ORB_INITIALIZER_H
+
+#include /**/ "ace/pre.h"
+
+#include "orbsvcs/SSLIOP/SSLIOP_Export.h"
+
+#if !defined (ACE_LACKS_PRAGMA_ONCE)
+# pragma once
+#endif /* ACE_LACKS_PRAGMA_ONCE */
+
+#include "orbsvcs/CSIIOPC.h"
+#include "orbsvcs/SecurityC.h"
+
+#include "tao/PI/PI.h"
+#include "tao/LocalObject.h"
+
+// This is to remove "inherits via dominance" warnings from MSVC.
+// MSVC is being a little too paranoid.
+#if defined(_MSC_VER)
+#pragma warning(push)
+#pragma warning(disable:4250)
+#endif /* _MSC_VER */
+
+TAO_BEGIN_VERSIONED_NAMESPACE_DECL
+
+namespace TAO
+{
+ namespace SSLIOP
+ {
+
+ /**
+ * @name ORBInitializer
+ *
+ * @brief
+ * ORB initializer that registers all SSLIOP-specific interceptors and
+ * object references.
+ */
+ class ORBInitializer
+ : public virtual PortableInterceptor::ORBInitializer,
+ public virtual TAO_Local_RefCounted_Object
+ {
+ public:
+
+ /// Constructor.
+ ORBInitializer (::Security::QOP qop,
+ CSIIOP::AssociationOptions csiv2_target_supports,
+ CSIIOP::AssociationOptions csiv2_target_requires);
+
+ virtual void pre_init (PortableInterceptor::ORBInitInfo_ptr info
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS)
+ ACE_THROW_SPEC ((CORBA::SystemException));
+
+ virtual void post_init (PortableInterceptor::ORBInitInfo_ptr info
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS)
+ ACE_THROW_SPEC ((CORBA::SystemException));
+
+ private:
+
+ // Obtain the TSS slot ID assigned to the "SSLIOPCurrent" object.
+ size_t get_tss_slot_id (PortableInterceptor::ORBInitInfo_ptr info
+ ACE_ENV_ARG_DECL);
+
+ private:
+
+ /// The default quality-of-protection settings in use.
+ ::Security::QOP qop_;
+
+ /// Default support CSIv2 association options.
+ CSIIOP::AssociationOptions csiv2_target_supports_;
+
+ /// Default required CSIv2 association options.
+ CSIIOP::AssociationOptions csiv2_target_requires_;
+ };
+
+ } // End SSLIOP namespace.
+} // End TAO namespace.
+
+TAO_END_VERSIONED_NAMESPACE_DECL
+
+#if defined(_MSC_VER)
+#pragma warning(pop)
+#endif /* _MSC_VER */
+
+#include /**/ "ace/post.h"
+
+#endif /* TAO_SSLIOP_ORB_INITIALIZER_H */
diff --git a/TAO/orbsvcs/orbsvcs/SSLIOP/SSLIOP_OpenSSL_st_T.cpp b/TAO/orbsvcs/orbsvcs/SSLIOP/SSLIOP_OpenSSL_st_T.cpp
new file mode 100644
index 00000000000..f20eb554f4c
--- /dev/null
+++ b/TAO/orbsvcs/orbsvcs/SSLIOP/SSLIOP_OpenSSL_st_T.cpp
@@ -0,0 +1,17 @@
+// $Id$
+
+#ifndef TAO_SSLIOP_OPENSSL_ST_T_CPP
+#define TAO_SSLIOP_OPENSSL_ST_T_CPP
+
+#include "orbsvcs/SSLIOP/SSLIOP_OpenSSL_st_T.h"
+
+#if !defined (ACE_LACKS_PRAGMA_ONCE)
+# pragma once
+#endif /* ACE_LACKS_PRAGMA_ONCE */
+
+
+#if !defined (__ACE_INLINE__)
+#include "orbsvcs/SSLIOP/SSLIOP_OpenSSL_st_T.inl"
+#endif /* !__ACE_INLINE__ */
+
+#endif /* TAO_SSLIOP_OPENSSL_ST_T_CPP */
diff --git a/TAO/orbsvcs/orbsvcs/SSLIOP/SSLIOP_OpenSSL_st_T.h b/TAO/orbsvcs/orbsvcs/SSLIOP/SSLIOP_OpenSSL_st_T.h
new file mode 100644
index 00000000000..1fee4c1504b
--- /dev/null
+++ b/TAO/orbsvcs/orbsvcs/SSLIOP/SSLIOP_OpenSSL_st_T.h
@@ -0,0 +1,139 @@
+// -*- C++ -*-
+
+//=============================================================================
+/**
+ * @file SSLIOP_OpenSSL_st_T.h
+ *
+ * $Id$
+ *
+ * @author Ossama Othman <ossama@dre.vanderbilt.edu>
+ */
+//=============================================================================
+
+#ifndef TAO_SSLIOP_OPENSSL_ST_T_H
+#define TAO_SSLIOP_OPENSSL_ST_T_H
+
+#include /**/ "ace/pre.h"
+
+#include "ace/config-all.h"
+
+#if !defined (ACE_LACKS_PRAGMA_ONCE)
+#pragma once
+#endif /* ACE_LACKS_PRAGMA_ONCE */
+
+#include "tao/Versioned_Namespace.h"
+
+TAO_BEGIN_VERSIONED_NAMESPACE_DECL
+
+namespace TAO
+{
+ namespace SSLIOP
+ {
+ /**
+ * @struct OpenSSL_traits
+ *
+ * @brief Template traits structure for OpenSSL data structures.
+ *
+ * Template traits structure containing constants and functions
+ * specific to a given OpenSSL data structure.
+ */
+ template <typename T>
+ struct OpenSSL_traits;
+
+ /**
+ * @name CORBA-style Reference Count Manipulation Methods
+ *
+ * These reference count manipulation methods are generally
+ * specific to OpenSSL structures.
+ */
+ /// Increase the reference count on the given OpenSSL structure.
+ template <typename T>
+ T * _duplicate (T * st);
+
+ /// Deep copy the given OpenSSL structure.
+ template <typename T>
+ T * copy (T const & st);
+
+ /// Decrease the reference count on the given OpenSSL structure.
+ template <typename T>
+ void release (T * st);
+
+ /**
+ * @class OpenSSL_st_var
+ *
+ * @brief "_var" class for the OpenSSL @param T structure.
+ *
+ * This class is simply used to make operations on instances of
+ * the OpenSSL @c T structure exception safe. It is only used
+ * internally by the SSLIOP pluggable transport.
+ */
+ template <typename T>
+ class OpenSSL_st_var
+ {
+ public:
+
+ /**
+ * @name Constructors
+ *
+ * Constructors.
+ */
+ //@{
+ OpenSSL_st_var (void);
+ OpenSSL_st_var (T * st);
+ OpenSSL_st_var (OpenSSL_st_var<T> const & v);
+ OpenSSL_st_var (T const & st);
+ //@}
+
+ /// Destructor
+ ~OpenSSL_st_var (void);
+
+ /**
+ * @name Assignment operators.
+ *
+ * Assignment operators.
+ */
+ //@{
+ OpenSSL_st_var<T> & operator= (T* st);
+ OpenSSL_st_var<T> & operator= (OpenSSL_st_var<T> const & v);
+ OpenSSL_st_var<T> & operator= (T const & st);
+ //@}
+
+ T const * operator-> (void) const;
+ T* operator-> (void);
+
+ operator const T& () const;
+ operator T& ();
+
+ T* in (void) const;
+ T*& inout (void);
+ T*& out (void);
+ T* _retn (void);
+ T* ptr (void) const;
+
+ private:
+
+ /// The OpenSSL structure whose reference count is managed.
+ T * st_;
+
+ };
+ } // End SSLIOP namespace.
+} // End TAO namespace.
+
+TAO_END_VERSIONED_NAMESPACE_DECL
+
+
+#if defined (__ACE_INLINE__)
+#include "orbsvcs/SSLIOP/SSLIOP_OpenSSL_st_T.inl"
+#endif /* __ACE_INLINE__ */
+
+#if defined (ACE_TEMPLATES_REQUIRE_SOURCE)
+# include "orbsvcs/SSLIOP/SSLIOP_OpenSSL_st_T.cpp"
+#endif /* ACE_TEMPLATES_REQUIRE_SOURCE */
+
+#if defined (ACE_TEMPLATES_REQUIRE_PRAGMA)
+# pragma implementation ("SSLIOP_OpenSSL_st_T.cpp")
+#endif /* ACE_TEMPLATES_REQUIRE_PRAGMA */
+
+#include /**/ "ace/post.h"
+
+#endif /* TAO_SSLIOP_OPENSSL_ST_T_H */
diff --git a/TAO/orbsvcs/orbsvcs/SSLIOP/SSLIOP_OpenSSL_st_T.inl b/TAO/orbsvcs/orbsvcs/SSLIOP/SSLIOP_OpenSSL_st_T.inl
new file mode 100644
index 00000000000..0233a73fc01
--- /dev/null
+++ b/TAO/orbsvcs/orbsvcs/SSLIOP/SSLIOP_OpenSSL_st_T.inl
@@ -0,0 +1,165 @@
+// -*- C++ -*-
+//
+// $Id$
+
+
+#include <openssl/crypto.h>
+
+TAO_BEGIN_VERSIONED_NAMESPACE_DECL
+
+template <typename T> ACE_INLINE T *
+TAO::SSLIOP::_duplicate (T * st)
+{
+ // Shallow copy.
+
+ // OpenSSL provides no structure-specific functions to increase the
+ // reference count on the structure it defines, so we do it
+ // manually.
+ if (st != 0)
+ CRYPTO_add (&(st->references),
+ 1,
+ TAO::SSLIOP::OpenSSL_traits<T>::LOCK_ID);
+
+ return st;
+}
+
+template <typename T> ACE_INLINE T *
+TAO::SSLIOP::copy (T const & st)
+{
+ // Deep copy.
+ return TAO::SSLIOP::OpenSSL_traits<T>::copy (st);
+}
+
+template <typename T> ACE_INLINE void
+TAO::SSLIOP::release (T * st)
+{
+ TAO::SSLIOP::OpenSSL_traits<T>::release (st);
+}
+
+// -------------------------------------------------------------------
+
+template <typename T> ACE_INLINE
+TAO::SSLIOP::OpenSSL_st_var<T>::OpenSSL_st_var (void)
+ : st_ (0)
+{
+}
+
+template <typename T> ACE_INLINE
+TAO::SSLIOP::OpenSSL_st_var<T>::OpenSSL_st_var (T * st)
+ : st_ (st)
+{
+}
+
+template <typename T> ACE_INLINE
+TAO::SSLIOP::OpenSSL_st_var<T>::OpenSSL_st_var (
+ TAO::SSLIOP::OpenSSL_st_var<T> const & st)
+ : st_ (TAO::SSLIOP::OpenSSL_traits<T>::_duplicate (st.ptr ()))
+{
+}
+
+template <typename T> ACE_INLINE
+TAO::SSLIOP::OpenSSL_st_var<T>::OpenSSL_st_var (T const & st)
+ : st_ (TAO::SSLIOP::OpenSSL_traits<T>::copy (st))
+{
+}
+
+template <typename T> ACE_INLINE
+TAO::SSLIOP::OpenSSL_st_var<T>::~OpenSSL_st_var (void)
+{
+ TAO::SSLIOP::OpenSSL_traits<T>::release (this->st_);
+ // TAO::SSLIOP::release (this->st_);
+}
+
+template <typename T> ACE_INLINE TAO::SSLIOP::OpenSSL_st_var<T> &
+TAO::SSLIOP::OpenSSL_st_var<T>::operator= (T * st)
+{
+ TAO::SSLIOP::OpenSSL_traits<T>::release (this->st_);
+ this->st_ = st;
+ return *this;
+}
+
+template <typename T> ACE_INLINE TAO::SSLIOP::OpenSSL_st_var<T> &
+TAO::SSLIOP::OpenSSL_st_var<T>::operator= (
+ TAO::SSLIOP::OpenSSL_st_var<T> const & st)
+{
+ if (this != &st)
+ {
+ TAO::SSLIOP::OpenSSL_traits<T>::release (this->st_);
+ this->st_ = TAO::SSLIOP::OpenSSL_traits<T>::_duplicate (st.ptr ());
+ }
+
+ return *this;
+}
+
+template <typename T> ACE_INLINE TAO::SSLIOP::OpenSSL_st_var<T> &
+TAO::SSLIOP::OpenSSL_st_var<T>::operator= (T const & st)
+{
+ if (this->st_ != &st)
+ {
+ TAO::SSLIOP::OpenSSL_traits<T>::release (this->st_);
+ this->st_ = TAO::SSLIOP::OpenSSL_traits<T>::copy (st);
+ }
+
+ return *this;
+}
+
+template <typename T> ACE_INLINE T const *
+TAO::SSLIOP::OpenSSL_st_var<T>::operator-> (void) const
+{
+ return this->st_;
+}
+
+template <typename T> ACE_INLINE T *
+TAO::SSLIOP::OpenSSL_st_var<T>::operator-> (void)
+{
+ return this->st_;
+}
+
+template <typename T> ACE_INLINE
+TAO::SSLIOP::OpenSSL_st_var<T>::operator T const &() const
+{
+ return *this->st_;
+}
+
+template <typename T> ACE_INLINE
+TAO::SSLIOP::OpenSSL_st_var<T>::operator T &()
+{
+ return *this->st_;
+}
+
+template <typename T> ACE_INLINE T *
+TAO::SSLIOP::OpenSSL_st_var<T>::in (void) const
+{
+ return this->st_;
+}
+
+template <typename T> ACE_INLINE T *&
+TAO::SSLIOP::OpenSSL_st_var<T>::inout (void)
+{
+ return this->st_;
+}
+
+template <typename T> ACE_INLINE T *&
+TAO::SSLIOP::OpenSSL_st_var<T>::out (void)
+{
+ TAO::SSLIOP::OpenSSL_traits<T>::release (this->st_);
+ this->st_ = 0;
+ return this->st_;
+}
+
+template <typename T> ACE_INLINE T *
+TAO::SSLIOP::OpenSSL_st_var<T>::_retn (void)
+{
+ // Yield ownership of the OpenSSL structure.
+ T * st = this->st_;
+ this->st_ = 0;
+ return st;
+}
+
+template <typename T> ACE_INLINE T *
+TAO::SSLIOP::OpenSSL_st_var<T>::ptr (void) const
+{
+ return this->st_;
+}
+
+TAO_END_VERSIONED_NAMESPACE_DECL
diff --git a/TAO/orbsvcs/orbsvcs/SSLIOP/SSLIOP_OwnCredentials.cpp b/TAO/orbsvcs/orbsvcs/SSLIOP/SSLIOP_OwnCredentials.cpp
new file mode 100644
index 00000000000..7d90833fff5
--- /dev/null
+++ b/TAO/orbsvcs/orbsvcs/SSLIOP/SSLIOP_OwnCredentials.cpp
@@ -0,0 +1,77 @@
+// $Id$
+
+#include "orbsvcs/SSLIOP/SSLIOP_OwnCredentials.h"
+
+
+ACE_RCSID (SSLIOP,
+ SSLIOP_OwnCredentials,
+ "$Id$")
+
+
+TAO_BEGIN_VERSIONED_NAMESPACE_DECL
+
+TAO::SSLIOP::OwnCredentials::OwnCredentials (X509 *cert, EVP_PKEY *evp)
+ : SSLIOP_Credentials (cert, evp)
+{
+}
+
+TAO::SSLIOP::OwnCredentials::~OwnCredentials (void)
+{
+}
+
+TAO::SSLIOP::OwnCredentials_ptr
+TAO::SSLIOP::OwnCredentials::_duplicate (TAO::SSLIOP::OwnCredentials_ptr obj)
+{
+ if (!CORBA::is_nil (obj))
+ obj->_add_ref ();
+
+ return obj;
+}
+
+TAO::SSLIOP::OwnCredentials_ptr
+TAO::SSLIOP::OwnCredentials::_narrow (CORBA::Object_ptr obj
+ ACE_ENV_ARG_DECL_NOT_USED)
+{
+ return TAO::SSLIOP::OwnCredentials::_duplicate (
+ dynamic_cast<TAO::SSLIOP::OwnCredentials *> (obj));
+}
+
+TAO::SSLIOP::OwnCredentials_ptr
+TAO::SSLIOP::OwnCredentials::_nil (void)
+{
+ return (OwnCredentials *) 0;
+
+}
+
+SecurityLevel3::CredentialsType
+TAO::SSLIOP::OwnCredentials::creds_type (ACE_ENV_SINGLE_ARG_DECL_NOT_USED)
+ ACE_THROW_SPEC ((CORBA::SystemException))
+{
+ return SecurityLevel3::CT_OwnCredentials;
+}
+
+SecurityLevel3::CredsInitiator_ptr
+TAO::SSLIOP::OwnCredentials::creds_initiator (ACE_ENV_SINGLE_ARG_DECL)
+ ACE_THROW_SPEC ((CORBA::SystemException))
+{
+ ACE_THROW_RETURN (CORBA::NO_IMPLEMENT (),
+ SecurityLevel3::CredsInitiator::_nil ());
+}
+
+SecurityLevel3::CredsAcceptor_ptr
+TAO::SSLIOP::OwnCredentials::creds_acceptor (ACE_ENV_SINGLE_ARG_DECL)
+ ACE_THROW_SPEC ((CORBA::SystemException))
+{
+ ACE_THROW_RETURN (CORBA::NO_IMPLEMENT (),
+ SecurityLevel3::CredsAcceptor::_nil ());
+}
+
+void
+TAO::SSLIOP::OwnCredentials::release_credentials (
+ ACE_ENV_SINGLE_ARG_DECL_NOT_USED)
+ ACE_THROW_SPEC ((CORBA::SystemException))
+{
+ this->creds_state_ = SecurityLevel3::CS_PendingRelease;
+}
+
+TAO_END_VERSIONED_NAMESPACE_DECL
diff --git a/TAO/orbsvcs/orbsvcs/SSLIOP/SSLIOP_OwnCredentials.h b/TAO/orbsvcs/orbsvcs/SSLIOP/SSLIOP_OwnCredentials.h
new file mode 100644
index 00000000000..8376cda69dc
--- /dev/null
+++ b/TAO/orbsvcs/orbsvcs/SSLIOP/SSLIOP_OwnCredentials.h
@@ -0,0 +1,121 @@
+// -*- C++ -*-
+
+//=============================================================================
+/**
+ * @file SSLIOP_OwnCredentials.h
+ *
+ * $Id$
+ *
+ * @author Ossama Othman <ossama@dre.vanderbilt.edu>
+ */
+//=============================================================================
+
+
+#ifndef TAO_SSLIOP_OWN_CREDENTIALS_H
+#define TAO_SSLIOP_OWN_CREDENTIALS_H
+
+#include /**/ "ace/pre.h"
+
+#include "orbsvcs/SSLIOP/SSLIOP_Export.h"
+
+#if !defined (ACE_LACKS_PRAGMA_ONCE)
+# pragma once
+#endif /* ACE_LACKS_PRAGMA_ONCE */
+
+#include "orbsvcs/SSLIOP/SSLIOP_Credentials.h"
+
+#if defined(_MSC_VER)
+#pragma warning(push)
+#pragma warning(disable:4250)
+#endif /* _MSC_VER */
+
+TAO_BEGIN_VERSIONED_NAMESPACE_DECL
+
+namespace TAO
+{
+ namespace SSLIOP
+ {
+ class OwnCredentials;
+ typedef OwnCredentials* OwnCredentials_ptr;
+ typedef TAO_Pseudo_Var_T<OwnCredentials> OwnCredentials_var;
+ typedef TAO_Pseudo_Out_T<OwnCredentials> OwnCredentials_out;
+
+ /**
+ * @class OwnCredentials
+ *
+ * @brief Credentials representing our identity, not our peer's
+ * identity.
+ *
+ * @c OwnCredentials are a representation of our identity, not our
+ * peer's identity.
+ */
+ class OwnCredentials
+ : public virtual SecurityLevel3::OwnCredentials,
+ public virtual SSLIOP_Credentials
+ {
+ public:
+ typedef OwnCredentials_ptr _ptr_type;
+ typedef OwnCredentials_var _var_type;
+ typedef OwnCredentials_out _out_type;
+
+ /// Constructor
+ OwnCredentials (::X509 *cert, ::EVP_PKEY *evp);
+
+ static OwnCredentials_ptr _duplicate (OwnCredentials_ptr obj);
+ static OwnCredentials_ptr _nil (void);
+ static OwnCredentials_ptr _narrow (CORBA::Object_ptr obj
+ ACE_ENV_ARG_DECL);
+
+ /**
+ * @name SecurityLevel3::TargetCredentials Methods
+ *
+ * Methods required by the SecurityLevel3::Credentials
+ * interface.
+ */
+ //@{
+ SecurityLevel3::CredentialsType creds_type (ACE_ENV_SINGLE_ARG_DECL)
+ ACE_THROW_SPEC ((CORBA::SystemException));
+ //@}
+
+ /**
+ * @name SecurityLevel3::OwnCredentials Methods
+ *
+ * Methods required by the SecurityLevel3::OwnCredentials
+ * interface.
+ */
+ //@{
+ virtual SecurityLevel3::CredsInitiator_ptr creds_initiator (
+ ACE_ENV_SINGLE_ARG_DECL)
+ ACE_THROW_SPEC ((CORBA::SystemException));
+
+ virtual SecurityLevel3::CredsAcceptor_ptr creds_acceptor (
+ ACE_ENV_SINGLE_ARG_DECL)
+ ACE_THROW_SPEC ((CORBA::SystemException));
+
+ virtual void release_credentials (ACE_ENV_SINGLE_ARG_DECL)
+ ACE_THROW_SPEC ((CORBA::SystemException));
+ //@}
+
+ protected:
+
+ /// Destructor
+ /**
+ * Protected destructor to enforce proper memory management
+ * through the reference counting mechanism.
+ */
+ ~OwnCredentials (void);
+ };
+
+ } // End SSLIOP namespace
+} // End TAO namespace
+
+
+TAO_END_VERSIONED_NAMESPACE_DECL
+
+#if defined(_MSC_VER)
+#pragma warning(pop)
+#endif /* _MSC_VER */
+
+#include /**/ "ace/post.h"
+
+#endif /* TAO_SSLIOP_OWN_CREDENTIALS_H */
diff --git a/TAO/orbsvcs/orbsvcs/SSLIOP/SSLIOP_Profile.cpp b/TAO/orbsvcs/orbsvcs/SSLIOP/SSLIOP_Profile.cpp
new file mode 100644
index 00000000000..f9c084779cd
--- /dev/null
+++ b/TAO/orbsvcs/orbsvcs/SSLIOP/SSLIOP_Profile.cpp
@@ -0,0 +1,357 @@
+#include "orbsvcs/SSLIOP/SSLIOP_Profile.h"
+#include "orbsvcs/SSLIOP/ssl_endpointsC.h"
+#include "tao/CDR.h"
+#include "tao/Environment.h"
+#include "ace/OS_NS_string.h"
+
+
+ACE_RCSID (SSLIOP,
+ SSLIOP_Profile,
+ "$Id$")
+
+
+TAO_BEGIN_VERSIONED_NAMESPACE_DECL
+
+TAO_SSLIOP_Profile::TAO_SSLIOP_Profile (const ACE_INET_Addr & addr,
+ const TAO::ObjectKey & object_key,
+ const TAO_GIOP_Message_Version & version,
+ TAO_ORB_Core * orb_core,
+ const ::SSLIOP::SSL * ssl_component)
+ : TAO_IIOP_Profile (addr,
+ object_key,
+ version,
+ orb_core),
+ ssl_endpoint_ (ssl_component, 0),
+ ssl_only_ (0)
+{
+ this->ssl_endpoint_.iiop_endpoint (&this->endpoint_, true);
+}
+
+TAO_SSLIOP_Profile::TAO_SSLIOP_Profile (const char * host,
+ CORBA::UShort port,
+ const TAO::ObjectKey & object_key,
+ const ACE_INET_Addr & addr,
+ const TAO_GIOP_Message_Version & version,
+ TAO_ORB_Core * orb_core,
+ const ::SSLIOP::SSL * ssl_component)
+ : TAO_IIOP_Profile (host,
+ port,
+ object_key,
+ addr,
+ version,
+ orb_core),
+ ssl_endpoint_ (ssl_component, 0),
+ ssl_only_ (0)
+{
+ this->ssl_endpoint_.iiop_endpoint (&this->endpoint_, true);
+}
+
+TAO_SSLIOP_Profile::TAO_SSLIOP_Profile (TAO_ORB_Core * orb_core,
+ const ::SSLIOP::SSL * ssl_component)
+ : TAO_IIOP_Profile (orb_core),
+ ssl_endpoint_ (ssl_component, 0),
+ ssl_only_ (0)
+{
+ this->ssl_endpoint_.iiop_endpoint (&this->endpoint_, true);
+}
+
+TAO_SSLIOP_Profile::TAO_SSLIOP_Profile (TAO_ORB_Core * orb_core, int ssl_only)
+ : TAO_IIOP_Profile (orb_core),
+ ssl_endpoint_ (0, 0),
+ ssl_only_ (ssl_only)
+{
+ this->ssl_endpoint_.iiop_endpoint (&this->endpoint_, true);
+}
+
+TAO_SSLIOP_Profile::~TAO_SSLIOP_Profile (void)
+{
+ // Clean up the list of endpoints since we own it.
+ // Skip the head, since it is not dynamically allocated.
+ TAO_Endpoint *tmp = 0;
+
+ for (TAO_Endpoint *next = this->ssl_endpoint_.next ();
+ next != 0;
+ next = tmp)
+ {
+ tmp = next->next ();
+ delete next;
+ }
+}
+
+// return codes:
+// -1 -> error
+// 0 -> can't understand this version
+// 1 -> success.
+int
+TAO_SSLIOP_Profile::decode (TAO_InputCDR & cdr)
+{
+ int r = this->TAO_IIOP_Profile::decode (cdr);
+ if (r != 1)
+ return r;
+
+ // Attempt to decode SSLIOP::SSL tagged component. It may not be
+ // there if we are dealing with pure IIOP profile.
+ int ssl_component_found = 0;
+ IOP::TaggedComponent component;
+ component.tag = ::SSLIOP::TAG_SSL_SEC_TRANS;
+
+ if (this->tagged_components ().get_component (component))
+ {
+ TAO_InputCDR cdr (reinterpret_cast<const char*> (
+ component.component_data.get_buffer ()),
+ component.component_data.length ());
+ CORBA::Boolean byte_order;
+ if ((cdr >> ACE_InputCDR::to_boolean (byte_order)) == 0)
+ return -1;
+ cdr.reset_byte_order (static_cast<int> (byte_order));
+
+ if (cdr >> this->ssl_endpoint_.ssl_component_)
+ ssl_component_found = 1;
+ else
+ return -1;
+ }
+
+ // Since IIOP portion of the profile has already been decoded, we
+ // know how many endpoints it should contain and can finish
+ // initialization accordingly.
+ if (this->count_ < 2)
+ {
+ // This profile contains only one endpoint. Finish initializing
+ // it.
+ this->ssl_endpoint_.iiop_endpoint (&this->endpoint_, true);
+ this->ssl_endpoint_.priority (this->endpoint_.priority ());
+ return 1;
+ }
+ else
+ {
+ // This profile contains more than one endpoint.
+ if (ssl_component_found)
+ {
+ // It is true ssl profile, i.e., not just IIOP, so must have
+ // ssl endpoints encoded.
+
+ if (this->decode_tagged_endpoints () == -1)
+ return -1;
+
+ return 1;
+ }
+ else
+ {
+ // IIOP profile - doesn't have ssl endpoints encoded. We
+ // must create 'dummy' ssl endpoint list anyways, in order to
+ // make iiop endpoints accessable and usable.
+ for (size_t i = 0;
+ i < this->count_;
+ ++i)
+ {
+ TAO_SSLIOP_Endpoint *endpoint = 0;
+ ACE_NEW_RETURN (endpoint,
+ TAO_SSLIOP_Endpoint (0, 0),
+ -1);
+ this->add_endpoint (endpoint);
+ }
+
+ // Now that we have a complete list of ssl endpoins, we can
+ // connect them with their iiop counterparts.
+ TAO_IIOP_Endpoint *iiop_endp = &this->endpoint_;
+
+ for (TAO_SSLIOP_Endpoint * ssl_endp = &this->ssl_endpoint_;
+ ssl_endp != 0;
+ ssl_endp = ssl_endp->next_)
+ {
+ ssl_endp->iiop_endpoint (iiop_endp, true);
+ ssl_endp->priority (iiop_endp->priority ());
+ iiop_endp = iiop_endp->next_;
+ }
+
+ return 1;
+ }
+ }
+}
+
+CORBA::Boolean
+TAO_SSLIOP_Profile::do_is_equivalent (const TAO_Profile * other_profile)
+{
+ const TAO_SSLIOP_Profile *op =
+ dynamic_cast<const TAO_SSLIOP_Profile *> (other_profile);
+
+ // Make sure we have a TAO_SSLIOP_Profile.
+ if (op == 0)
+ return 0;
+
+ // Now verify TAO_SSLIOP_Endpoint equivalence.
+ const TAO_SSLIOP_Endpoint *other_endp = &op->ssl_endpoint_;
+ for (TAO_SSLIOP_Endpoint *endp = &this->ssl_endpoint_;
+ endp != 0;
+ endp = endp->next_)
+ {
+ if (endp->is_equivalent (other_endp))
+ other_endp = other_endp->next_;
+ else
+ return 0;
+ }
+
+ return 1;
+}
+
+TAO_Endpoint*
+TAO_SSLIOP_Profile::endpoint (void)
+{
+ return &this->ssl_endpoint_;
+}
+
+void
+TAO_SSLIOP_Profile::add_endpoint (TAO_SSLIOP_Endpoint * endp)
+{
+ endp->next_ = this->ssl_endpoint_.next_;
+ this->ssl_endpoint_.next_ = endp;
+
+ // We do not want to add our IIOP endpoint counterpart when we are
+ // decoding a profile, and IIOP endpoints have been added before we
+ // even get to SSLIOP-specific decoding.
+ if (endp->iiop_endpoint () != 0)
+ this->TAO_IIOP_Profile::add_endpoint (endp->iiop_endpoint ());
+}
+
+int
+TAO_SSLIOP_Profile::encode_endpoints (void)
+{
+ // If we have more than one endpoint, we encode info about others
+ // into a tagged component for wire transfer.
+ if (this->count_ > 1)
+ {
+ // Encode all endpoints except the first one, since it is always
+ // transferred through standard profile component.
+
+ // Create a data structure and fill it with endpoint info for wire
+ // transfer.
+ TAO_SSLEndpointSequence endpoints;
+ endpoints.length (this->count_ - 1);
+
+ const TAO_SSLIOP_Endpoint *endpoint = this->ssl_endpoint_.next_;
+ for (size_t i = 0;
+ i < this->count_ - 1;
+ ++i)
+ {
+ endpoints[i] = endpoint->ssl_component ();
+ endpoint = endpoint->next_;
+ }
+
+ // Encode the data structure.
+ TAO_OutputCDR out_cdr;
+ if ((out_cdr << ACE_OutputCDR::from_boolean (TAO_ENCAP_BYTE_ORDER)
+ == 0)
+ || (out_cdr << endpoints) == 0)
+ return -1;
+
+ const CORBA::ULong length = out_cdr.total_length ();
+
+ IOP::TaggedComponent tagged_component;
+ tagged_component.tag = TAO::TAG_SSL_ENDPOINTS;
+ tagged_component.component_data.length (length);
+ CORBA::Octet *buf =
+ tagged_component.component_data.get_buffer ();
+
+ for (const ACE_Message_Block *iterator = out_cdr.begin ();
+ iterator != 0;
+ iterator = iterator->cont ())
+ {
+ CORBA::ULong i_length = iterator->length ();
+ ACE_OS::memcpy (buf, iterator->rd_ptr (), i_length);
+
+ buf += i_length;
+ }
+
+ // Add component with encoded endpoint data to this profile's
+ // TaggedComponents.
+ tagged_components_.set_component (tagged_component);
+ }
+
+ return this->TAO_IIOP_Profile::encode_endpoints ();
+}
+
+int
+TAO_SSLIOP_Profile::decode_tagged_endpoints (void)
+{
+ IOP::TaggedComponent tagged_component;
+ tagged_component.tag = TAO::TAG_SSL_ENDPOINTS;
+
+ if (this->tagged_components_.get_component (tagged_component))
+ {
+ const CORBA::Octet *buf =
+ tagged_component.component_data.get_buffer ();
+
+ TAO_InputCDR in_cdr (reinterpret_cast<const char* > (buf),
+ tagged_component.component_data.length ());
+
+ // Extract the Byte Order.
+ CORBA::Boolean byte_order;
+ if ((in_cdr >> ACE_InputCDR::to_boolean (byte_order)) == 0)
+ return -1;
+ in_cdr.reset_byte_order (static_cast<int> (byte_order));
+
+ // Extract endpoints sequence.
+ TAO_SSLEndpointSequence endpoints;
+ if ((in_cdr >> endpoints) == 0)
+ return -1;
+
+ // Use information extracted from the tagged component to
+ // populate the profile. Begin from the end of the sequence to
+ // preserve endpoint order, since <add_endpoint> method reverses
+ // the order of endpoints in the list.
+ for (CORBA::ULong i = endpoints.length () - 1;
+ (i + 1) != 0;
+ --i)
+ {
+ TAO_SSLIOP_Endpoint *endpoint = 0;
+ ACE_NEW_RETURN (endpoint,
+ TAO_SSLIOP_Endpoint (0, 0),
+ -1);
+ endpoint->ssl_component_ = endpoints[i];
+ this->add_endpoint (endpoint);
+ }
+
+ // Now that we have a complete list of ssl endpoins, we can
+ // connect them with their iiop counterparts, which have been
+ // extracted/chained during the IIOP profile decoding.
+ TAO_IIOP_Endpoint *iiop_endp = &this->endpoint_;
+
+ for (TAO_SSLIOP_Endpoint * ssl_endp = &this->ssl_endpoint_;
+ ssl_endp != 0;
+ ssl_endp = ssl_endp->next_)
+ {
+ ssl_endp->iiop_endpoint (iiop_endp, true);
+ ssl_endp->priority (iiop_endp->priority ());
+ iiop_endp = iiop_endp->next_;
+ }
+
+ return 0;
+ }
+
+ // Since this method is only called if we are expecting
+ // TAO_TAG_SSL_ENDPOINTS component, failure to find it is an error.
+ return -1;
+}
+
+void
+TAO_SSLIOP_Profile::parse_string (const char * ior
+ ACE_ENV_ARG_DECL)
+{
+ TAO_IIOP_Profile::parse_string (ior
+ ACE_ENV_ARG_PARAMETER);
+ ACE_CHECK;
+
+ this->ssl_endpoint_.iiop_endpoint (&this->endpoint_, true);
+
+ if( ssl_only_)
+ {
+ this->ssl_endpoint_.ssl_component_.port = this->endpoint_.port_;
+
+ // Note that the Security::NoProtection bit is cleared since we
+ // are sure the server supports SSL (we're told so)
+ ACE_CLR_BITS (this->ssl_endpoint_.ssl_component_.target_supports,
+ Security::NoProtection);
+ }
+}
+
+TAO_END_VERSIONED_NAMESPACE_DECL
diff --git a/TAO/orbsvcs/orbsvcs/SSLIOP/SSLIOP_Profile.h b/TAO/orbsvcs/orbsvcs/SSLIOP/SSLIOP_Profile.h
new file mode 100644
index 00000000000..849914f148d
--- /dev/null
+++ b/TAO/orbsvcs/orbsvcs/SSLIOP/SSLIOP_Profile.h
@@ -0,0 +1,179 @@
+// -*- C++ -*-
+
+//=============================================================================
+/**
+ * @file SSLIOP_Profile.h
+ *
+ * $Id$
+ *
+ * SSLIOP profile specific processing
+ *
+ * @author Carlos O'Ryan <coryan@uci.edu>
+ * @author Ossama Othman <ossama@uci.edu>
+ */
+//=============================================================================
+
+
+#ifndef TAO_SSLIOP_PROFILE_H
+#define TAO_SSLIOP_PROFILE_H
+
+#include /**/ "ace/pre.h"
+
+#include "ace/config-all.h"
+
+#if !defined (ACE_LACKS_PRAGMA_ONCE)
+# pragma once
+#endif /* ACE_LACKS_PRAGMA_ONCE */
+
+#include "orbsvcs/SSLIOP/SSLIOP_Endpoint.h"
+#include "tao/IIOP_Profile.h"
+
+TAO_BEGIN_VERSIONED_NAMESPACE_DECL
+
+// namespace TAO
+// {
+// namespace SSLIOP
+// {
+
+ /**
+ * @class Profile
+ *
+ * @brief This class defines the protocol specific attributes
+ * required for locating ORBs over a TCP/IP network, using
+ * either IIOP or IIOP/SSL for communication.
+ *
+ * This class extends TAO_IIOP_Profile to support secure
+ * communication using SSL.
+ */
+ class TAO_SSLIOP_Profile : public TAO_IIOP_Profile
+ {
+ public:
+ /// Profile constructor, same as above except the object_key has
+ /// already been marshaled.
+ TAO_SSLIOP_Profile (const ACE_INET_Addr & addr,
+ const TAO::ObjectKey & object_key,
+ const TAO_GIOP_Message_Version & version,
+ TAO_ORB_Core * orb_core,
+ const ::SSLIOP::SSL * ssl_component);
+
+ /// Profile constructor, this is the most efficient since it
+ /// doesn't require any address resolution processing.
+ TAO_SSLIOP_Profile (const char *host,
+ CORBA::UShort port,
+ const TAO::ObjectKey & object_key,
+ const ACE_INET_Addr & addr,
+ const TAO_GIOP_Message_Version & version,
+ TAO_ORB_Core * orb_core,
+ const ::SSLIOP::SSL * ssl_component);
+
+ /// Create profile with the given SSLIOP tagged component.
+ TAO_SSLIOP_Profile (TAO_ORB_Core * orb_core,
+ const ::SSLIOP::SSL * ssl_component);
+
+ /// Profile constructor. ssl_only != 0 will force secure
+ /// connections, pnly.
+ TAO_SSLIOP_Profile (TAO_ORB_Core * orb_core, int ssl_only = 0);
+
+
+ // = Please see Profile.h for the documentation of these methods.
+ virtual int decode (TAO_InputCDR& cdr);
+ virtual int encode_endpoints (void);
+ virtual TAO_Endpoint *endpoint (void);
+
+ /**
+ * Override parse_string() from the base class to update the SSL
+ * endpoint's iiop endpoint once the base class has completed
+ * parsing the string.
+ *@par
+ * Initialize this object using the given input string.
+ * URL-style string contain only one endpoint.
+ */
+ virtual void parse_string (const char * string
+ ACE_ENV_ARG_DECL);
+
+ /**
+ * Add @a endp to this profile's list of endpoints (it is
+ * inserted next to the head of the list). This profiles takes
+ * ownership of @a endp. If @a endp's @c iiop_endpoint_ member
+ * is not 0, it is added to our parent's class endpoint list.
+ */
+ void add_endpoint (TAO_SSLIOP_Endpoint * endp);
+
+ protected:
+
+ /// Destructor.
+ /**
+ * Protected destructor to enforce proper memory management
+ * through the reference counting mechanism.
+ */
+ ~TAO_SSLIOP_Profile (void);
+
+ /// Profile equivalence template method.
+ /**
+ * @see TAO_Profile::do_is_equivalent()
+ */
+ virtual CORBA::Boolean do_is_equivalent (
+ const TAO_Profile * other_profile);
+
+ private:
+
+ /**
+ * Helper for @c decode. Decodes TAO_TAG_SSL_ENDPOINTS from a
+ * tagged component. Decode only if RTCORBA is enabled.
+ *
+ * @return 0 on success and -1 on failure.
+ *
+ * @note This should be enabled only when RTCORBA is enabled,
+ * but sadly others pay the price (of footprint) under
+ * normal operations.
+ */
+ int decode_tagged_endpoints (void);
+
+ /**
+ * Head of this profile's list of endpoints. This endpoint is
+ * not dynamically allocated because a profile always contains
+ * at least one endpoint.
+ * @par
+ * Currently, a profile contains more than one endpoint, i.e.,
+ * list contains more than just the head, only when RTCORBA is
+ * enabled. However, in the near future, this will be used in
+ * non-RT mode as well, e.g., to support @c
+ * TAG_ALTERNATE_IIOP_ADDRESS feature.
+ * @par
+ * Since SSLIOP profile is an extension of IIOP profile, its
+ * addressing info is contained in two places: IIOP parent
+ * class contains all iiop addressing while this class contains
+ * SSL-specific addressing additions to iiop. This means that
+ * there are two lists of endpoints: one maintained in the
+ * parent class and one maintained here. Each ssl endpoint
+ * maintains a pointer to its counterpart in the parent class
+ * endpoint list.
+ * @par
+ * For transmission of IIOP addressing information, see
+ * @c TAO_IIOP_Profile. Addressing info of the default SSL
+ * endpoint, i.e., head of the list, is transmitted using
+ * standard SSLIOP::TAG_SSL_SEC_TRANS tagged component. See
+ * @c encode_endpoints method documentation above for how the
+ * rest of the SSL endpoint list is transmitted.
+ */
+ TAO_SSLIOP_Endpoint ssl_endpoint_;
+
+ /**
+ * Allways treat this endpoint as secure, even if the constructor
+ * did not explicitely specify a tagged component for SSL.
+ * @par
+ * Most likely the parse_string() will supply a subset of the
+ * attributes - port number, for instance.
+ */
+ int ssl_only_;
+
+ };
+
+// } // End SSLIOP namespace.
+// } // End TAO namespace.
+
+TAO_END_VERSIONED_NAMESPACE_DECL
+
+#include /**/ "ace/post.h"
+
+#endif /* TAO_SSLIOP_PROFILE_H */
diff --git a/TAO/orbsvcs/orbsvcs/SSLIOP/SSLIOP_SSL.h b/TAO/orbsvcs/orbsvcs/SSLIOP/SSLIOP_SSL.h
new file mode 100644
index 00000000000..b9b01e4a85d
--- /dev/null
+++ b/TAO/orbsvcs/orbsvcs/SSLIOP/SSLIOP_SSL.h
@@ -0,0 +1,85 @@
+// -*- C++ -*-
+
+//=============================================================================
+/**
+ * @file SSLIOP_SSL.h
+ *
+ * OpenSSL @c SSL data structure specializations and typedefs.
+ *
+ * $Id$
+ *
+ * @author Ossama Othman <ossama@dre.vanderbilt.edu>
+ */
+//=============================================================================
+
+#ifndef TAO_SSLIOP_SSL_H
+#define TAO_SSLIOP_SSL_H
+
+#include /**/ "ace/pre.h"
+
+#include "ace/config-all.h"
+
+#if !defined (ACE_LACKS_PRAGMA_ONCE)
+#pragma once
+#endif /* ACE_LACKS_PRAGMA_ONCE */
+
+#include "orbsvcs/SSLIOP/SSLIOP_OpenSSL_st_T.h"
+
+#include <openssl/ssl.h>
+#include <openssl/crypto.h>
+
+
+TAO_BEGIN_VERSIONED_NAMESPACE_DECL
+
+namespace TAO
+{
+ namespace SSLIOP
+ {
+ // OpenSSL @c SSL structure traits specialization.
+ template <>
+ struct OpenSSL_traits< ::SSL >
+ {
+ /// OpenSSL lock ID for use in OpenSSL CRYPTO_add() reference
+ /// count manipulation function.
+ enum { LOCK_ID = CRYPTO_LOCK_SSL };
+
+ /// Increase the reference count on the given OpenSSL structure.
+ /**
+ * @note This used to be in a function template but MSVC++ 6
+ * can't handle function templates correctly so reproduce
+ * the code in each specialization. *sigh*
+ */
+ static ::SSL * _duplicate (::SSL * st)
+ {
+ if (st != 0)
+ CRYPTO_add (&(st->references),
+ 1,
+ LOCK_ID);
+
+ return st;
+ }
+
+ /// Perform deep copy of the given OpenSSL structure.
+ static ::SSL * copy (::SSL const & st)
+ {
+ return ::SSL_dup (const_cast< ::SSL * > (&st));
+ }
+
+ /// Decrease the reference count on the given OpenSSL
+ /// structure.
+ static void release (::SSL * st)
+ {
+ ::SSL_free (st);
+ }
+ };
+
+ typedef OpenSSL_st_var< ::SSL > SSL_var;
+
+ } // End SSLIOP namespace.
+} // End TAO namespace.
+
+TAO_END_VERSIONED_NAMESPACE_DECL
+
+#include /**/ "ace/post.h"
+
+#endif /* TAO_SSLIOP_SSL_H */
diff --git a/TAO/orbsvcs/orbsvcs/SSLIOP/SSLIOP_TargetCredentials.cpp b/TAO/orbsvcs/orbsvcs/SSLIOP/SSLIOP_TargetCredentials.cpp
new file mode 100644
index 00000000000..a081a95c168
--- /dev/null
+++ b/TAO/orbsvcs/orbsvcs/SSLIOP/SSLIOP_TargetCredentials.cpp
@@ -0,0 +1,134 @@
+#include "orbsvcs/SSLIOP/SSLIOP_TargetCredentials.h"
+
+
+ACE_RCSID (SSLIOP,
+ SSLIOP_TargetCredentials,
+ "$Id$")
+
+TAO_BEGIN_VERSIONED_NAMESPACE_DECL
+
+TAO::SSLIOP::TargetCredentials::TargetCredentials (::X509 *cert,
+ ::EVP_PKEY *evp)
+ : SSLIOP_Credentials (cert, evp)
+{
+}
+
+
+SecurityLevel3::CredentialsType
+TAO::SSLIOP::TargetCredentials::creds_type (ACE_ENV_SINGLE_ARG_DECL_NOT_USED)
+ ACE_THROW_SPEC ((CORBA::SystemException))
+{
+ return SecurityLevel3::CT_TargetCredentials;
+}
+
+char *
+TAO::SSLIOP::TargetCredentials::context_id (ACE_ENV_SINGLE_ARG_DECL)
+ ACE_THROW_SPEC ((CORBA::SystemException))
+{
+ ACE_THROW_RETURN (CORBA::NO_IMPLEMENT (), 0);
+}
+
+SecurityLevel3::Principal *
+TAO::SSLIOP::TargetCredentials::client_principal (ACE_ENV_SINGLE_ARG_DECL)
+ ACE_THROW_SPEC ((CORBA::SystemException))
+{
+ ACE_THROW_RETURN (CORBA::NO_IMPLEMENT (), 0);
+}
+
+SecurityLevel3::StatementList *
+TAO::SSLIOP::TargetCredentials::client_supporting_statements (
+ ACE_ENV_SINGLE_ARG_DECL)
+ ACE_THROW_SPEC ((CORBA::SystemException))
+{
+ ACE_THROW_RETURN (CORBA::NO_IMPLEMENT (), 0);
+}
+
+SecurityLevel3::ResourceNameList *
+TAO::SSLIOP::TargetCredentials::client_restricted_resources (
+ ACE_ENV_SINGLE_ARG_DECL)
+ ACE_THROW_SPEC ((CORBA::SystemException))
+{
+ ACE_THROW_RETURN (CORBA::NO_IMPLEMENT (), 0);
+}
+
+SecurityLevel3::Principal *
+TAO::SSLIOP::TargetCredentials::target_principal (ACE_ENV_SINGLE_ARG_DECL)
+ ACE_THROW_SPEC ((CORBA::SystemException))
+{
+ ACE_THROW_RETURN (CORBA::NO_IMPLEMENT (), 0);
+}
+
+SecurityLevel3::StatementList *
+TAO::SSLIOP::TargetCredentials::target_supporting_statements (
+ ACE_ENV_SINGLE_ARG_DECL)
+ ACE_THROW_SPEC ((CORBA::SystemException))
+{
+ ACE_THROW_RETURN (CORBA::NO_IMPLEMENT (), 0);
+}
+
+SecurityLevel3::ResourceNameList *
+TAO::SSLIOP::TargetCredentials::target_restricted_resources (
+ ACE_ENV_SINGLE_ARG_DECL)
+ ACE_THROW_SPEC ((CORBA::SystemException))
+{
+ ACE_THROW_RETURN (CORBA::NO_IMPLEMENT (), 0);
+}
+
+SecurityLevel3::OwnCredentials_ptr
+TAO::SSLIOP::TargetCredentials::parent_credentials (ACE_ENV_SINGLE_ARG_DECL)
+ ACE_THROW_SPEC ((CORBA::SystemException))
+{
+ ACE_THROW_RETURN (CORBA::NO_IMPLEMENT (),
+ SecurityLevel3::OwnCredentials::_nil ());
+}
+
+CORBA::Boolean
+TAO::SSLIOP::TargetCredentials::client_authentication (ACE_ENV_SINGLE_ARG_DECL)
+ ACE_THROW_SPEC ((CORBA::SystemException))
+{
+ ACE_THROW_RETURN (CORBA::NO_IMPLEMENT (), 0);
+}
+
+CORBA::Boolean
+TAO::SSLIOP::TargetCredentials::target_authentication (ACE_ENV_SINGLE_ARG_DECL)
+ ACE_THROW_SPEC ((CORBA::SystemException))
+{
+ ACE_THROW_RETURN (CORBA::NO_IMPLEMENT (), 0);
+}
+
+CORBA::Boolean
+TAO::SSLIOP::TargetCredentials::confidentiality (ACE_ENV_SINGLE_ARG_DECL)
+ ACE_THROW_SPEC ((CORBA::SystemException))
+{
+ ACE_THROW_RETURN (CORBA::NO_IMPLEMENT (), 0);
+}
+
+CORBA::Boolean
+TAO::SSLIOP::TargetCredentials::integrity (ACE_ENV_SINGLE_ARG_DECL)
+ ACE_THROW_SPEC ((CORBA::SystemException))
+{
+ ACE_THROW_RETURN (CORBA::NO_IMPLEMENT (), 0);
+}
+
+CORBA::Boolean
+TAO::SSLIOP::TargetCredentials::target_embodied (ACE_ENV_SINGLE_ARG_DECL)
+ ACE_THROW_SPEC ((CORBA::SystemException))
+{
+ ACE_THROW_RETURN (CORBA::NO_IMPLEMENT (), 0);
+}
+
+CORBA::Boolean
+TAO::SSLIOP::TargetCredentials::target_endorsed (ACE_ENV_SINGLE_ARG_DECL)
+ ACE_THROW_SPEC ((CORBA::SystemException))
+{
+ ACE_THROW_RETURN (CORBA::NO_IMPLEMENT (), 0);
+}
+
+void
+TAO::SSLIOP::TargetCredentials::release (ACE_ENV_SINGLE_ARG_DECL)
+ ACE_THROW_SPEC ((CORBA::SystemException))
+{
+ ACE_THROW (CORBA::NO_IMPLEMENT ());
+}
+
+TAO_END_VERSIONED_NAMESPACE_DECL
diff --git a/TAO/orbsvcs/orbsvcs/SSLIOP/SSLIOP_TargetCredentials.h b/TAO/orbsvcs/orbsvcs/SSLIOP/SSLIOP_TargetCredentials.h
new file mode 100644
index 00000000000..920db9d2e61
--- /dev/null
+++ b/TAO/orbsvcs/orbsvcs/SSLIOP/SSLIOP_TargetCredentials.h
@@ -0,0 +1,129 @@
+// -*- C++ -*-
+
+//=============================================================================
+/**
+ * @file SSLIOP_TargetCredentials.h
+ *
+ * $Id$
+ *
+ * @author Ossama Othman <ossama@dre.vanderbilt.edu>
+ */
+//=============================================================================
+
+#ifndef TAO_SSLIOP_TARGET_CREDENTIALS_H
+#define TAO_SSLIOP_TARGET_CREDENTIALS_H
+
+#include /**/ "ace/pre.h"
+
+#include "orbsvcs/SSLIOP/SSLIOP_Export.h"
+
+#if !defined (ACE_LACKS_PRAGMA_ONCE)
+#pragma once
+#endif /* ACE_LACKS_PRAGMA_ONCE */
+
+#include "orbsvcs/SSLIOP/SSLIOP_Credentials.h"
+
+TAO_BEGIN_VERSIONED_NAMESPACE_DECL
+
+namespace TAO
+{
+ namespace SSLIOP
+ {
+ /**
+ * @class TargetCredentials
+ *
+ * @brief SSLIOP-specific implementation of the
+ * SecurityLevel3::TargetCredentials interface.
+ *
+ * This class implements SSLIOP-specific
+ * SecurityLevel3::TargetCredentials.
+ */
+ class TAO_SSLIOP_Export TargetCredentials
+ : public virtual SecurityLevel3::TargetCredentials,
+ public virtual SSLIOP_Credentials
+ {
+ public:
+
+ TargetCredentials (::X509 *cert, ::EVP_PKEY *evp);
+
+ /**
+ * @name SecurityLevel3::Credentials Methods
+ *
+ * Methods required by the SecurityLevel3::Credentials
+ * interface.
+ */
+ //@{
+ virtual SecurityLevel3::CredentialsType creds_type (
+ ACE_ENV_SINGLE_ARG_DECL)
+ ACE_THROW_SPEC ((CORBA::SystemException));
+ //@}
+
+ /**
+ * @name SecurityLevel3::TargetCredentials Methods
+ *
+ * Methods required by the SecurityLevel3::TargetCredentials
+ * interface.
+ */
+ //@{
+ virtual char * context_id (ACE_ENV_SINGLE_ARG_DECL)
+ ACE_THROW_SPEC ((CORBA::SystemException));
+
+ virtual SecurityLevel3::Principal * client_principal (
+ ACE_ENV_SINGLE_ARG_DECL)
+ ACE_THROW_SPEC ((CORBA::SystemException));
+
+ virtual SecurityLevel3::StatementList * client_supporting_statements (
+ ACE_ENV_SINGLE_ARG_DECL)
+ ACE_THROW_SPEC ((CORBA::SystemException));
+
+ virtual SecurityLevel3::ResourceNameList * client_restricted_resources (
+ ACE_ENV_SINGLE_ARG_DECL)
+ ACE_THROW_SPEC ((CORBA::SystemException));
+
+ virtual SecurityLevel3::Principal * target_principal (
+ ACE_ENV_SINGLE_ARG_DECL)
+ ACE_THROW_SPEC ((CORBA::SystemException));
+
+ virtual SecurityLevel3::StatementList * target_supporting_statements (
+ ACE_ENV_SINGLE_ARG_DECL)
+ ACE_THROW_SPEC ((CORBA::SystemException));
+
+ virtual SecurityLevel3::ResourceNameList * target_restricted_resources (
+ ACE_ENV_SINGLE_ARG_DECL)
+ ACE_THROW_SPEC ((CORBA::SystemException));
+
+ virtual SecurityLevel3::OwnCredentials_ptr parent_credentials (
+ ACE_ENV_SINGLE_ARG_DECL)
+ ACE_THROW_SPEC ((CORBA::SystemException));
+
+ virtual CORBA::Boolean client_authentication (ACE_ENV_SINGLE_ARG_DECL)
+ ACE_THROW_SPEC ((CORBA::SystemException));
+
+ virtual CORBA::Boolean target_authentication (ACE_ENV_SINGLE_ARG_DECL)
+ ACE_THROW_SPEC ((CORBA::SystemException));
+
+ virtual CORBA::Boolean confidentiality (ACE_ENV_SINGLE_ARG_DECL)
+ ACE_THROW_SPEC ((CORBA::SystemException));
+
+ virtual CORBA::Boolean integrity (ACE_ENV_SINGLE_ARG_DECL)
+ ACE_THROW_SPEC ((CORBA::SystemException));
+
+ virtual CORBA::Boolean target_embodied (ACE_ENV_SINGLE_ARG_DECL)
+ ACE_THROW_SPEC ((CORBA::SystemException));
+
+ virtual CORBA::Boolean target_endorsed (ACE_ENV_SINGLE_ARG_DECL)
+ ACE_THROW_SPEC ((CORBA::SystemException));
+
+ virtual void release (ACE_ENV_SINGLE_ARG_DECL)
+ ACE_THROW_SPEC ((CORBA::SystemException));
+ //@}
+
+ };
+ }
+}
+
+TAO_END_VERSIONED_NAMESPACE_DECL
+
+#include /**/ "ace/post.h"
+
+#endif /* TAO_SSLIOP_TARGET_CREDENTIALS_H */
diff --git a/TAO/orbsvcs/orbsvcs/SSLIOP/SSLIOP_Transport.cpp b/TAO/orbsvcs/orbsvcs/SSLIOP/SSLIOP_Transport.cpp
new file mode 100644
index 00000000000..3f60b36bcdf
--- /dev/null
+++ b/TAO/orbsvcs/orbsvcs/SSLIOP/SSLIOP_Transport.cpp
@@ -0,0 +1,385 @@
+#include "orbsvcs/SSLIOP/SSLIOP_Connection_Handler.h"
+#include "orbsvcs/SSLIOP/SSLIOP_Transport.h"
+#include "orbsvcs/SSLIOP/SSLIOP_Profile.h"
+#include "orbsvcs/SSLIOP/SSLIOP_Acceptor.h"
+
+#include "tao/debug.h"
+
+#include "tao/Timeprobe.h"
+#include "tao/CDR.h"
+#include "tao/Transport_Mux_Strategy.h"
+#include "tao/Wait_Strategy.h"
+#include "tao/Stub.h"
+#include "tao/ORB_Core.h"
+#include "tao/debug.h"
+#include "tao/GIOP_Message_Base.h"
+#include "tao/Acceptor_Registry.h"
+#include "tao/Thread_Lane_Resources.h"
+
+ACE_RCSID (SSLIOP,
+ SSLIOP_Transport,
+ "$Id$")
+
+
+TAO_BEGIN_VERSIONED_NAMESPACE_DECL
+
+TAO::SSLIOP::Transport::Transport (
+ TAO::SSLIOP::Connection_Handler *handler,
+ TAO_ORB_Core *orb_core,
+ CORBA::Boolean /* flag */)
+ : TAO_Transport (IOP::TAG_INTERNET_IOP, orb_core),
+ connection_handler_ (handler),
+ messaging_object_ (0)
+{
+ // Use the normal GIOP object
+ ACE_NEW (this->messaging_object_,
+ TAO_GIOP_Message_Base (orb_core, this));
+}
+
+TAO::SSLIOP::Transport::~Transport (void)
+{
+ delete this->messaging_object_;
+}
+
+ACE_Event_Handler *
+TAO::SSLIOP::Transport::event_handler_i (void)
+{
+ return this->connection_handler_;
+}
+
+TAO_Connection_Handler *
+TAO::SSLIOP::Transport::connection_handler_i (void)
+{
+ return this->connection_handler_;
+}
+
+TAO_Pluggable_Messaging *
+TAO::SSLIOP::Transport::messaging_object (void)
+{
+ return this->messaging_object_;
+}
+
+int
+TAO::SSLIOP::Transport::handle_input (TAO_Resume_Handle &rh,
+ ACE_Time_Value *max_wait_time,
+ int block)
+{
+ int result = 0;
+
+ // Set up the SSLIOP::Current object.
+ TAO::SSLIOP::State_Guard ssl_state_guard (this->connection_handler_,
+ result);
+
+ if (result == -1)
+ return -1;
+
+ return TAO_Transport::handle_input (rh,
+ max_wait_time,
+ block);
+}
+
+ssize_t
+TAO::SSLIOP::Transport::send (iovec *iov,
+ int iovcnt,
+ size_t &bytes_transferred,
+ const ACE_Time_Value *max_wait_time)
+{
+ const ssize_t retval =
+ this->connection_handler_->peer ().sendv (iov, iovcnt, max_wait_time);
+
+ if (retval > 0)
+ bytes_transferred = retval;
+
+ return retval;
+}
+
+ssize_t
+TAO::SSLIOP::Transport::recv (char *buf,
+ size_t len,
+ const ACE_Time_Value *max_wait_time)
+{
+ const ssize_t n = this->connection_handler_->peer ().recv (buf,
+ len,
+ max_wait_time);
+
+ // Most of the errors handling is common for
+ // Now the message has been read
+ if (n == -1
+ && TAO_debug_level > 4
+ && errno != ETIME)
+ {
+ ACE_DEBUG ((LM_DEBUG,
+ ACE_TEXT ("TAO (%P|%t) - %p \n"),
+ ACE_TEXT ("TAO - read message failure ")
+ ACE_TEXT ("recv_i () \n")));
+ }
+
+ // Error handling
+ if (n == -1)
+ {
+ if (errno == EWOULDBLOCK)
+ return 0;
+
+ return -1;
+ }
+ // @@ What are the other error handling here??
+ else if (n == 0)
+ {
+ return -1;
+ }
+
+ return n;
+}
+
+int
+TAO::SSLIOP::Transport::send_request (TAO_Stub *stub,
+ TAO_ORB_Core *orb_core,
+ TAO_OutputCDR &stream,
+ int message_semantics,
+ ACE_Time_Value *max_wait_time)
+{
+ if (this->ws_->sending_request (orb_core,
+ message_semantics) == -1)
+ return -1;
+
+ if (this->send_message (stream,
+ stub,
+ message_semantics,
+ max_wait_time) == -1)
+
+ return -1;
+
+ return 0;
+}
+
+int
+TAO::SSLIOP::Transport::send_message (TAO_OutputCDR &stream,
+ TAO_Stub *stub,
+ int message_semantics,
+ ACE_Time_Value *max_wait_time)
+{
+ // Format the message in the stream first
+ if (this->messaging_object_->format_message (stream) != 0)
+ return -1;
+
+ // Strictly speaking, should not need to loop here because the
+ // socket never gets set to a nonblocking mode ... some Linux
+ // versions seem to need it though. Leaving it costs little.
+
+ // This guarantees to send all data (bytes) or return an error.
+ const ssize_t n = this->send_message_shared (stub,
+ message_semantics,
+ stream.begin (),
+ max_wait_time);
+
+ if (n == -1)
+ {
+ if (TAO_debug_level)
+ ACE_DEBUG ((LM_DEBUG,
+ ACE_TEXT ("TAO: (%P|%t|%N|%l) closing transport ")
+ ACE_TEXT ("%d after fault %p\n"),
+ this->id (),
+ ACE_TEXT ("send_message ()\n")));
+
+ return -1;
+ }
+
+ return 1;
+}
+
+
+int
+TAO::SSLIOP::Transport::generate_request_header (
+ TAO_Operation_Details &opdetails,
+ TAO_Target_Specification &spec,
+ TAO_OutputCDR &msg)
+{
+ // Check whether we have a Bi Dir IIOP policy set, whether the
+ // messaging objects are ready to handle bidirectional connections
+ // and also make sure that we have not recd. or sent any information
+ // regarding this before...
+ if (this->orb_core ()->bidir_giop_policy ()
+ && this->messaging_object_->is_ready_for_bidirectional (msg)
+ && this->bidirectional_flag () < 0)
+ {
+ this->set_bidir_context_info (opdetails);
+
+ // Set the flag to 1
+ this->bidirectional_flag (1);
+
+ // At the moment we enable BiDIR giop we have to get a new
+ // request id to make sure that we follow the even/odd rule
+ // for request id's. We only need to do this when enabled
+ // it, after that the Transport Mux Strategy will make sure
+ // that the rule is followed
+ opdetails.request_id (this->tms ()->request_id ());
+ }
+
+ // We are going to pass on this request to the underlying messaging
+ // layer. It should take care of this request
+ return TAO_Transport::generate_request_header (opdetails,
+ spec,
+ msg);
+}
+
+int
+TAO::SSLIOP::Transport::messaging_init (CORBA::Octet major,
+ CORBA::Octet minor)
+{
+ this->messaging_object_->init (major,
+ minor);
+ return 1;
+}
+
+
+int
+TAO::SSLIOP::Transport::tear_listen_point_list (TAO_InputCDR &cdr)
+{
+ CORBA::Boolean byte_order;
+ if ((cdr >> ACE_InputCDR::to_boolean (byte_order)) == 0)
+ return -1;
+
+ cdr.reset_byte_order (static_cast<int> (byte_order));
+
+ IIOP::ListenPointList listen_list;
+ if ((cdr >> listen_list) == 0)
+ return -1;
+
+ // As we have received a bidirectional information, set the flag to
+ // 0
+ this->bidirectional_flag (0);
+
+ return this->connection_handler_->process_listen_point_list (listen_list);
+}
+
+
+
+void
+TAO::SSLIOP::Transport::set_bidir_context_info (
+ TAO_Operation_Details &opdetails)
+{
+ // Get a handle on to the acceptor registry
+ TAO_Acceptor_Registry &ar =
+ this->orb_core ()->lane_resources ().acceptor_registry ();
+
+ // Get the first acceptor in the registry
+ TAO_AcceptorSetIterator acceptor = ar.begin ();
+
+ IIOP::ListenPointList listen_point_list;
+
+ for (;
+ acceptor != ar.end ();
+ acceptor++)
+ {
+ // Check whether it is a IIOP acceptor
+ if ((*acceptor)->tag () == IOP::TAG_INTERNET_IOP)
+ {
+ if (this->get_listen_point (listen_point_list,
+ *acceptor) == -1)
+ {
+ ACE_ERROR ((LM_ERROR,
+ "TAO (%P|%t) - SSLIOP_Transport::set_bidir_info, ",
+ "error getting listen_point \n"));
+
+ return;
+ }
+ }
+ }
+
+ // We have the ListenPointList at this point. Create a output CDR
+ // stream at this point
+ TAO_OutputCDR cdr;
+
+ // Marshall the information into the stream
+ if ((cdr << ACE_OutputCDR::from_boolean (TAO_ENCAP_BYTE_ORDER) == 0)
+ || (cdr << listen_point_list) == 0)
+ return;
+
+ // Add this info in to the svc_list
+ opdetails.request_service_context ().set_context (IOP::BI_DIR_IIOP,
+ cdr);
+ return;
+}
+
+
+int
+TAO::SSLIOP::Transport::get_listen_point (
+ IIOP::ListenPointList &listen_point_list,
+ TAO_Acceptor *acceptor)
+{
+ TAO::SSLIOP::Acceptor *ssliop_acceptor =
+ dynamic_cast<TAO::SSLIOP::Acceptor *> (acceptor);
+
+ if (ssliop_acceptor == 0)
+ return -1;
+
+ // Get the array of IIOP (not SSLIOP!) endpoints serviced by the
+ // SSLIOP_Acceptor.
+ const ACE_INET_Addr *endpoint_addr =
+ ssliop_acceptor->endpoints ();
+
+ // Get the count
+ const size_t count =
+ ssliop_acceptor->endpoint_count ();
+
+ // The SSL port is stored in the SSLIOP::SSL component associated
+ // with the SSLIOP_Acceptor.
+ const ::SSLIOP::SSL &ssl = ssliop_acceptor->ssl_component ();
+
+ // Get the local address of the connection
+ ACE_INET_Addr local_addr;
+ {
+ if (this->connection_handler_->peer ().get_local_addr (local_addr)
+ == -1)
+ {
+ ACE_ERROR_RETURN ((LM_ERROR,
+ ACE_TEXT ("(%P|%t) Could not resolve local host")
+ ACE_TEXT (" address in get_listen_point()\n")),
+ -1);
+ }
+
+ }
+
+ // Note: Looks like there is no point in sending the list of
+ // endpoints on interfaces on which this connection has not
+ // been established. If this is wrong, please correct me.
+ CORBA::String_var local_interface;
+
+ // Get the hostname for the local address
+ if (ssliop_acceptor->hostname (this->orb_core_,
+ local_addr,
+ local_interface.out ()) == -1)
+ {
+ ACE_ERROR_RETURN ((LM_ERROR,
+ ACE_TEXT ("(%P|%t) Could not resolve local host")
+ ACE_TEXT (" name \n")),
+ -1);
+ }
+
+ for (size_t index = 0; index < count; ++index)
+ {
+ if (local_addr.get_ip_address ()
+ == endpoint_addr[index].get_ip_address ())
+ {
+ // Get the count of the number of elements
+ const CORBA::ULong len = listen_point_list.length ();
+
+ // Increase the length by 1
+ listen_point_list.length (len + 1);
+
+ // We have the connection and the acceptor endpoint on the
+ // same interface
+ IIOP::ListenPoint & point = listen_point_list[len];
+ point.host = CORBA::string_dup (local_interface.in ());
+
+ // All endpoints, if more than one, serviced by the
+ // SSLIOP_Acceptor should be listening on the same port (due
+ // to the bind to the INADDR_ANY address).
+ point.port = ssl.port;
+ }
+ }
+
+ return 1;
+}
+
+TAO_END_VERSIONED_NAMESPACE_DECL
diff --git a/TAO/orbsvcs/orbsvcs/SSLIOP/SSLIOP_Transport.h b/TAO/orbsvcs/orbsvcs/SSLIOP/SSLIOP_Transport.h
new file mode 100644
index 00000000000..fec7a5ee95f
--- /dev/null
+++ b/TAO/orbsvcs/orbsvcs/SSLIOP/SSLIOP_Transport.h
@@ -0,0 +1,159 @@
+// -*- C++ -*-
+
+//=============================================================================
+/**
+ * @file SSLIOP_Transport.h
+ *
+ * $Id$
+ *
+ * SSLIOP Transport specific processing.
+ *
+ * @author Carlos O'Ryan <coryan@ece.uci.edu>
+ * @author Ossama Othman <ossama@dre.vanderbilt.edu>
+ */
+//=============================================================================
+
+
+#ifndef TAO_SSLIOP_TRANSPORT_H
+#define TAO_SSLIOP_TRANSPORT_H
+
+#include /**/ "ace/pre.h"
+
+#include "orbsvcs/SSLIOP/SSLIOP_Export.h"
+
+#if !defined (ACE_LACKS_PRAGMA_ONCE)
+# pragma once
+#endif /* ACE_LACKS_PRAGMA_ONCE */
+
+#include "tao/Transport.h"
+#include "tao/operation_details.h"
+#include "tao/GIOP_Message_Version.h"
+#include "tao/Pluggable_Messaging_Utils.h"
+#include "tao/IIOPC.h"
+
+#include "ace/SSL/SSL_SOCK_Stream.h"
+
+#include "ace/Svc_Handler.h"
+
+
+TAO_BEGIN_VERSIONED_NAMESPACE_DECL
+
+// Forward decls.
+class TAO_ORB_Core;
+class TAO_Pluggable_Messaging;
+class TAO_Acceptor;
+
+namespace TAO
+{
+ namespace SSLIOP
+ {
+ typedef ACE_Svc_Handler<ACE_SSL_SOCK_STREAM, ACE_NULL_SYNCH> SVC_HANDLER;
+
+ class Handler_Base;
+ class Connection_Handler;
+
+ /**
+ * @class Transport
+ *
+ * @brief SSLIOP-specific transport implementation.
+ *
+ * SSLIOP-specific transport implementation.
+ */
+ class TAO_SSLIOP_Export Transport : public TAO_Transport
+ {
+ public:
+
+ /// Constructor.
+ Transport (Connection_Handler *handler,
+ TAO_ORB_Core *orb_core,
+ CORBA::Boolean flag);
+
+ /// Default destructor.
+ ~Transport (void);
+
+ /// Overload of the handle_input () in the TAO_Transport
+ /// class. This is required to set up the state guard. The
+ /// thread-per-connection and wait on RW strategies call this
+ /// handle_input ().
+ virtual int handle_input (TAO_Resume_Handle &rh,
+ ACE_Time_Value *max_wait_time = 0,
+ int block = 0);
+
+ protected:
+ /** @name Overridden Template Methods
+ *
+ * These are implementations of template methods declared by
+ * TAO_Transport.
+ */
+ //@{
+ virtual ACE_Event_Handler * event_handler_i (void);
+ virtual TAO_Connection_Handler *connection_handler_i (void);
+
+ virtual TAO_Pluggable_Messaging *messaging_object (void);
+
+ /// Write the complete Message_Block chain to the connection.
+ virtual ssize_t send (iovec *iov, int iovcnt,
+ size_t &bytes_transferred,
+ const ACE_Time_Value *timeout = 0);
+
+ /// Read len bytes from into buf.
+ virtual ssize_t recv (char *buf,
+ size_t len,
+ const ACE_Time_Value *s = 0);
+
+ public:
+ /// @todo These methods IMHO should have more meaningful
+ /// names. The names seem to indicate nothing.
+ virtual int send_request (TAO_Stub *stub,
+ TAO_ORB_Core *orb_core,
+ TAO_OutputCDR &stream,
+ int message_semantics,
+ ACE_Time_Value *max_wait_time);
+
+ virtual int send_message (TAO_OutputCDR &stream,
+ TAO_Stub *stub = 0,
+ int message_semantics =
+ TAO_Transport::TAO_TWOWAY_REQUEST,
+ ACE_Time_Value *max_time_wait = 0);
+
+ virtual int generate_request_header (TAO_Operation_Details &opdetails,
+ TAO_Target_Specification &spec,
+ TAO_OutputCDR &msg);
+
+ /// Initialising the messaging object
+ virtual int messaging_init (CORBA::Octet major,
+ CORBA::Octet minor);
+
+ /// Open teh service context list and process it.
+ virtual int tear_listen_point_list (TAO_InputCDR &cdr);
+ //@}
+
+ private:
+
+ /// Set the Bidirectional context info in the service context
+ /// list.
+ void set_bidir_context_info (TAO_Operation_Details &opdetails);
+
+ /// Add the listen points in @a acceptor to the @a
+ /// listen_point_list if this connection is in the same
+ /// interface as that of the endpoints in the @a acceptor.
+ int get_listen_point (IIOP::ListenPointList &listen_point_list,
+ TAO_Acceptor *acceptor);
+
+ private:
+
+ /// The connection service handler used for accessing lower layer
+ /// communication protocols.
+ Connection_Handler *connection_handler_;
+
+ /// Our messaging object.
+ TAO_Pluggable_Messaging *messaging_object_;
+ };
+
+ } // End SSLIOP namespace.
+} // End TAO namespace.
+
+TAO_END_VERSIONED_NAMESPACE_DECL
+
+#include /**/ "ace/post.h"
+#endif /* TAO_SSLIOP_TRANSPORT_H */
diff --git a/TAO/orbsvcs/orbsvcs/SSLIOP/SSLIOP_Util.cpp b/TAO/orbsvcs/orbsvcs/SSLIOP/SSLIOP_Util.cpp
new file mode 100644
index 00000000000..385e58f64e2
--- /dev/null
+++ b/TAO/orbsvcs/orbsvcs/SSLIOP/SSLIOP_Util.cpp
@@ -0,0 +1,58 @@
+#include "orbsvcs/SSLIOP/SSLIOP_Util.h"
+
+
+ACE_RCSID (SSLIOP,
+ SSLIOP_Util,
+ "$Id$")
+
+
+#include "orbsvcs/SSLIOP/SSLIOP_Connection_Handler.h"
+#include "orbsvcs/SSLIOP/SSLIOP_Current.h"
+
+#include "tao/ORB_Core.h"
+#include "tao/debug.h"
+
+
+TAO_BEGIN_VERSIONED_NAMESPACE_DECL
+
+TAO::SSLIOP::Current_ptr
+TAO::SSLIOP::Util::current (
+ TAO_ORB_Core *orb_core)
+{
+ ACE_DECLARE_NEW_CORBA_ENV;
+ ACE_TRY
+ {
+ // Go straight to the object_ref_table in the ORB Core to avoid
+ // the ORB::resolve_initial_references() mechanism's complaints
+ // about the fact that the ORB isn't fully initialized yet
+ // (happens on the client side).
+ CORBA::Object_var obj =
+ orb_core->object_ref_table ().resolve_initial_reference (
+ "SSLIOPCurrent");
+
+ TAO::SSLIOP::Current_var tao_current =
+ TAO::SSLIOP::Current::_narrow (obj.in ()
+ ACE_ENV_ARG_PARAMETER);
+ ACE_TRY_CHECK;
+
+ if (CORBA::is_nil (tao_current.in ()))
+ ACE_TRY_THROW (CORBA::INV_OBJREF ());
+
+ return tao_current._retn ();
+ }
+ ACE_CATCHANY
+ {
+ if (TAO_debug_level > 0)
+ ACE_PRINT_EXCEPTION (ACE_ANY_EXCEPTION,
+ "Could not resolve "
+ "\"SSLIOPCurrent\" object");
+
+ return 0;
+ }
+ ACE_ENDTRY;
+ ACE_CHECK_RETURN (0);
+
+ return 0;
+}
+
+TAO_END_VERSIONED_NAMESPACE_DECL
diff --git a/TAO/orbsvcs/orbsvcs/SSLIOP/SSLIOP_Util.h b/TAO/orbsvcs/orbsvcs/SSLIOP/SSLIOP_Util.h
new file mode 100644
index 00000000000..15e3e5f1545
--- /dev/null
+++ b/TAO/orbsvcs/orbsvcs/SSLIOP/SSLIOP_Util.h
@@ -0,0 +1,65 @@
+// -*- C++ -*-
+
+//=============================================================================
+/**
+ * @file SSLIOP_Util.h
+ *
+ * $Id$
+ *
+ * Utility class used by the SSLIOP pluggable protocol.
+ *
+ * @author Ossama Othman <ossama@uci.edu>
+ */
+//=============================================================================
+
+
+#ifndef TAO_SSLIOP_UTIL_H
+#define TAO_SSLIOP_UTIL_H
+
+#include /**/ "ace/pre.h"
+
+#include "ace/config-all.h"
+
+#if !defined (ACE_LACKS_PRAGMA_ONCE)
+# pragma once
+#endif /* ACE_LACKS_PRAGMA_ONCE */
+
+#include "orbsvcs/SSLIOP/SSLIOP_Current.h"
+
+
+TAO_BEGIN_VERSIONED_NAMESPACE_DECL
+
+class TAO_ORB_Core;
+class TAO_IIOP_Properties;
+
+namespace TAO
+{
+ namespace SSLIOP
+ {
+ /**
+ * @class Util
+ *
+ * @brief Class that provides utility/helper methods for several
+ * classes in the SSLIOP pluggable protocol.
+ *
+ * Methods useful to many classes in the SSLIOP pluggable protocol
+ * are centrally located in this uility class.
+ */
+ class Util
+ {
+ public:
+
+ /// Access Current.
+ static TAO::SSLIOP::Current_ptr current (
+ TAO_ORB_Core *orb_core);
+
+ };
+
+ } // End SSLIOP namespace.
+} // End TAO namespace.
+
+TAO_END_VERSIONED_NAMESPACE_DECL
+
+#include /**/ "ace/post.h"
+
+#endif /* TAO_SSLIOP_UTIL_H */
diff --git a/TAO/orbsvcs/orbsvcs/SSLIOP/SSLIOP_X509.h b/TAO/orbsvcs/orbsvcs/SSLIOP/SSLIOP_X509.h
new file mode 100644
index 00000000000..fc46e69fa9c
--- /dev/null
+++ b/TAO/orbsvcs/orbsvcs/SSLIOP/SSLIOP_X509.h
@@ -0,0 +1,84 @@
+// -*- C++ -*-
+
+//=============================================================================
+/**
+ * @file SSLIOP_X509.h
+ *
+ * $Id$
+ *
+ * @author Ossama Othman <ossama@uci.edu>
+ */
+//=============================================================================
+
+#ifndef TAO_SSLIOP_X509_H
+#define TAO_SSLIOP_X509_H
+
+#include /**/ "ace/pre.h"
+
+#include "ace/config-all.h"
+
+#if !defined (ACE_LACKS_PRAGMA_ONCE)
+#pragma once
+#endif /* ACE_LACKS_PRAGMA_ONCE */
+
+#include "orbsvcs/SSLIOP/SSLIOP_OpenSSL_st_T.h"
+
+#include <openssl/x509.h>
+#include <openssl/crypto.h>
+
+
+TAO_BEGIN_VERSIONED_NAMESPACE_DECL
+
+namespace TAO
+{
+ namespace SSLIOP
+ {
+ // OpenSSL @c X509 structure traits specialization.
+ template <>
+ struct OpenSSL_traits< ::X509 >
+ {
+ /// OpenSSL lock ID for use in OpenSSL CRYPTO_add() reference
+ /// count manipulation function.
+ enum { LOCK_ID = CRYPTO_LOCK_X509 };
+
+ /// Increase the reference count on the given OpenSSL structure.
+ /**
+ * @note This used to be in a function template but MSVC++ 6
+ * can't handle function templates correctly so reproduce
+ * the code in each specialization. *sigh*
+ */
+ static ::X509 * _duplicate (::X509 * st)
+ {
+ if (st != 0)
+ CRYPTO_add (&(st->references),
+ 1,
+ LOCK_ID);
+
+ return st;
+ }
+
+ /// Perform deep copy of the given OpenSSL structure.
+ static ::X509 * copy (::X509 const & st)
+ {
+ return ::X509_dup (const_cast< ::X509 *> (&st));
+ }
+
+ /// Decrease the reference count on the given OpenSSL
+ /// structure.
+ static void release (::X509 * st)
+ {
+ ::X509_free (st);
+ }
+ };
+
+ typedef OpenSSL_st_var< ::X509 > X509_var;
+
+ } // End SSLIOP namespace.
+} // End TAO namespace.
+
+
+TAO_END_VERSIONED_NAMESPACE_DECL
+
+#include /**/ "ace/post.h"
+
+#endif /* TAO_SSLIOP_X509_H */
diff --git a/TAO/orbsvcs/orbsvcs/SSLIOP/params_dup.c b/TAO/orbsvcs/orbsvcs/SSLIOP/params_dup.c
new file mode 100644
index 00000000000..cea38d78e06
--- /dev/null
+++ b/TAO/orbsvcs/orbsvcs/SSLIOP/params_dup.c
@@ -0,0 +1,19 @@
+// $Id$
+
+#include "params_dup.h"
+
+#include <openssl/asn1.h>
+
+
+DSA *
+DSAPARAMS_DUP_WRAPPER_NAME (DSA * dsa)
+{
+ return DSAparams_dup (dsa);
+}
+
+DH *
+DHPARAMS_DUP_WRAPPER_NAME (DH * dh)
+{
+ return DHparams_dup (dh);
+}
+
diff --git a/TAO/orbsvcs/orbsvcs/SSLIOP/params_dup.h b/TAO/orbsvcs/orbsvcs/SSLIOP/params_dup.h
new file mode 100644
index 00000000000..350705ec2d0
--- /dev/null
+++ b/TAO/orbsvcs/orbsvcs/SSLIOP/params_dup.h
@@ -0,0 +1,44 @@
+/* $Id$ */
+
+#ifndef TAO_SSLIOP_PARAMS_DUP_H
+#define TAO_SSLIOP_PARAMS_DUP_H
+
+#include /**/ "ace/pre.h"
+
+#include "ace/config-macros.h"
+#include "tao/Versioned_Namespace.h"
+
+// As of 0.9.7e, OpenSSL's DSAparams_dup() and DHparams_dup() macros
+// contain casts that are invalid in C++. These C wrapper functions
+// allows them to be called from C++.
+
+#include <openssl/dsa.h>
+#include <openssl/dh.h>
+
+#if (defined (TAO_HAS_VERSIONED_NAMESPACE) && TAO_HAS_VERSIONED_NAMESPACE == 1)
+
+# define DSAPARAMS_DUP_WRAPPER_NAME ACE_PREPROC_CONCATENATE(TAO_VERSIONED_NAMESPACE_NAME, _DSAparams_dup_wrapper)
+# define DHPARAMS_DUP_WRAPPER_NAME ACE_PREPROC_CONCATENATE(TAO_VERSIONED_NAMESPACE_NAME, _DHparams_dup_wrapper)
+
+#else
+
+# define DSAPARAMS_DUP_WRAPPER_NAME DSAparams_dup_wrapper
+# define DHPARAMS_DUP_WRAPPER_NAME DHparams_dup_wrapper
+
+#endif /* ACE_HAS_VERSIONED_NAMESPACE == 1 */
+
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+extern DSA *DSAPARAMS_DUP_WRAPPER_NAME (DSA *dsa);
+extern DH *DHPARAMS_DUP_WRAPPER_NAME (DH *dh);
+
+#ifdef __cplusplus
+}
+#endif
+
+#include /**/ "ace/post.h"
+
+#endif
diff --git a/TAO/orbsvcs/orbsvcs/SSLIOP/ssl_endpoints.pidl b/TAO/orbsvcs/orbsvcs/SSLIOP/ssl_endpoints.pidl
new file mode 100644
index 00000000000..93bbab422d8
--- /dev/null
+++ b/TAO/orbsvcs/orbsvcs/SSLIOP/ssl_endpoints.pidl
@@ -0,0 +1,33 @@
+// $Id$
+// ================================================================
+
+/**
+ * This file contains idl definition for data structures used to
+ * encapsulate data in TAO_TAG_SSL_ENDPOINTS tagged component. This
+ * TAO-specific component is used for transmission of multiple
+ * endpoints per single SSLIOP profile. See SSLIOP_Profile.*
+ * for more details.
+ *
+ * This file was used to generate the code in
+ * ssl_endpoints.* The command used to generate code
+ * is:
+ *
+ * tao_idl
+ * -Sa -Sc -Gp -Gd -DCORBA3 -Sci
+ * -Wb,export_macro=TAO_SSLIOP_Export \
+ * -Wb,pre_include="ace/pre.h" \
+ * -Wb,post_include="ace/post.h" \
+ * ssl_endpoints.pidl
+ */
+
+#ifndef _SSL_ENDPOINTS_IDL_
+#define _SSL_ENDPOINTS_IDL_
+
+#include "orbsvcs/SSLIOP.idl"
+
+/// Stores information for a collection of SSLIOP endpoints.
+typedef sequence <SSLIOP::SSL> TAO_SSLEndpointSequence;
+
+#pragma prefix ""
+
+#endif /* _SSL_ENDPOINTS_IDL_ */
diff --git a/TAO/orbsvcs/orbsvcs/SSLIOP/ssl_endpointsC.cpp b/TAO/orbsvcs/orbsvcs/SSLIOP/ssl_endpointsC.cpp
new file mode 100644
index 00000000000..b9d85e7b2b7
--- /dev/null
+++ b/TAO/orbsvcs/orbsvcs/SSLIOP/ssl_endpointsC.cpp
@@ -0,0 +1,165 @@
+// -*- C++ -*-
+//
+// $Id$
+
+// **** Code generated by the The ACE ORB (TAO) IDL Compiler ****
+// TAO and the TAO IDL Compiler have been developed by:
+// Center for Distributed Object Computing
+// Washington University
+// St. Louis, MO
+// USA
+// http://www.cs.wustl.edu/~schmidt/doc-center.html
+// and
+// Distributed Object Computing Laboratory
+// University of California at Irvine
+// Irvine, CA
+// USA
+// http://doc.ece.uci.edu/
+// and
+// Institute for Software Integrated Systems
+// Vanderbilt University
+// Nashville, TN
+// USA
+// http://www.isis.vanderbilt.edu/
+//
+// Information about TAO is available at:
+// http://www.cs.wustl.edu/~schmidt/TAO.html
+
+// TAO_IDL - Generated from
+// be\be_codegen.cpp:291
+
+
+#include "tao/AnyTypeCode/Null_RefCount_Policy.h"
+#include "tao/AnyTypeCode/TypeCode_Constants.h"
+#include "tao/AnyTypeCode/Alias_TypeCode_Static.h"
+#include "tao/AnyTypeCode/Sequence_TypeCode_Static.h"
+#include "tao/AnyTypeCode/String_TypeCode_Static.h"
+#include "orbsvcs/SSLIOP/ssl_endpointsC.h"
+#include "tao/CDR.h"
+
+#if defined (__BORLANDC__)
+#pragma option -w-rvl -w-rch -w-ccc -w-aus -w-sig
+#endif /* __BORLANDC__ */
+
+TAO_BEGIN_VERSIONED_NAMESPACE_DECL
+
+// TAO_IDL - Generated from
+// be\be_visitor_arg_traits.cpp:69
+
+// Arg traits specializations.
+namespace TAO
+{
+}
+
+
+// TAO_IDL - Generated from
+// be\be_visitor_sequence/sequence_cs.cpp:65
+
+#if !defined (_TAO_SSLENDPOINTSEQUENCE_CS_)
+#define _TAO_SSLENDPOINTSEQUENCE_CS_
+
+TAO_SSLEndpointSequence::TAO_SSLEndpointSequence (void)
+{}
+
+TAO_SSLEndpointSequence::TAO_SSLEndpointSequence (
+ CORBA::ULong max
+ )
+ : TAO::unbounded_value_sequence<
+ SSLIOP::SSL
+ >
+ (max)
+{}
+
+TAO_SSLEndpointSequence::TAO_SSLEndpointSequence (
+ CORBA::ULong max,
+ CORBA::ULong length,
+ SSLIOP::SSL * buffer,
+ CORBA::Boolean release
+ )
+ : TAO::unbounded_value_sequence<
+ SSLIOP::SSL
+ >
+ (max, length, buffer, release)
+{}
+
+TAO_SSLEndpointSequence::TAO_SSLEndpointSequence (
+ const TAO_SSLEndpointSequence &seq
+ )
+ : TAO::unbounded_value_sequence<
+ SSLIOP::SSL
+ >
+ (seq)
+{}
+
+TAO_SSLEndpointSequence::~TAO_SSLEndpointSequence (void)
+{}
+
+#endif /* end #if !defined */
+
+// TAO_IDL - Generated from
+// be\be_visitor_typecode/alias_typecode.cpp:31
+
+
+
+// TAO_IDL - Generated from
+// be\be_visitor_typecode/typecode_defn.cpp:925
+
+
+#ifndef _TAO_TYPECODE_TAO_SSLEndpointSequence_GUARD
+#define _TAO_TYPECODE_TAO_SSLEndpointSequence_GUARD
+namespace TAO
+{
+ namespace TypeCode
+ {
+ TAO::TypeCode::Sequence< ::CORBA::TypeCode_ptr const *,
+ TAO::Null_RefCount_Policy>
+ TAO_SSLEndpointSequence_0 (
+ CORBA::tk_sequence,
+ &SSLIOP::_tc_SSL,
+ 0U);
+
+ ::CORBA::TypeCode_ptr const tc_TAO_SSLEndpointSequence_0 =
+ &TAO_SSLEndpointSequence_0;
+
+ }
+}
+
+
+#endif /* _TAO_TYPECODE_TAO_SSLEndpointSequence_GUARD */
+static TAO::TypeCode::Alias<char const *,
+ CORBA::TypeCode_ptr const *,
+ TAO::Null_RefCount_Policy>
+ _tao_tc_TAO_SSLEndpointSequence (
+ CORBA::tk_alias,
+ "IDL:TAO_SSLEndpointSequence:1.0",
+ "TAO_SSLEndpointSequence",
+ &TAO::TypeCode::tc_TAO_SSLEndpointSequence_0);
+
+::CORBA::TypeCode_ptr const _tc_TAO_SSLEndpointSequence =
+ &_tao_tc_TAO_SSLEndpointSequence;
+
+// TAO_IDL - Generated from
+// be\be_visitor_sequence/cdr_op_cs.cpp:96
+
+#if !defined _TAO_CDR_OP_TAO_SSLEndpointSequence_CPP_
+#define _TAO_CDR_OP_TAO_SSLEndpointSequence_CPP_
+
+CORBA::Boolean operator<< (
+ TAO_OutputCDR &strm,
+ const TAO_SSLEndpointSequence &_tao_sequence
+ )
+{
+ return TAO::marshal_sequence(strm, _tao_sequence);
+}
+
+CORBA::Boolean operator>> (
+ TAO_InputCDR &strm,
+ TAO_SSLEndpointSequence &_tao_sequence
+ )
+{
+ return TAO::demarshal_sequence(strm, _tao_sequence);
+}
+
+#endif /* _TAO_CDR_OP_TAO_SSLEndpointSequence_CPP_ */
+
+TAO_END_VERSIONED_NAMESPACE_DECL
diff --git a/TAO/orbsvcs/orbsvcs/SSLIOP/ssl_endpointsC.h b/TAO/orbsvcs/orbsvcs/SSLIOP/ssl_endpointsC.h
new file mode 100644
index 00000000000..5d117696d17
--- /dev/null
+++ b/TAO/orbsvcs/orbsvcs/SSLIOP/ssl_endpointsC.h
@@ -0,0 +1,158 @@
+// -*- C++ -*-
+//
+// $Id$
+
+// **** Code generated by the The ACE ORB (TAO) IDL Compiler ****
+// TAO and the TAO IDL Compiler have been developed by:
+// Center for Distributed Object Computing
+// Washington University
+// St. Louis, MO
+// USA
+// http://www.cs.wustl.edu/~schmidt/doc-center.html
+// and
+// Distributed Object Computing Laboratory
+// University of California at Irvine
+// Irvine, CA
+// USA
+// http://doc.ece.uci.edu/
+// and
+// Institute for Software Integrated Systems
+// Vanderbilt University
+// Nashville, TN
+// USA
+// http://www.isis.vanderbilt.edu/
+//
+// Information about TAO is available at:
+// http://www.cs.wustl.edu/~schmidt/TAO.html
+
+// TAO_IDL - Generated from
+// be\be_codegen.cpp:153
+
+#ifndef _TAO_IDL_ORIG_SSL_ENDPOINTSC_H_
+#define _TAO_IDL_ORIG_SSL_ENDPOINTSC_H_
+
+#include /**/ "ace/pre.h"
+
+
+#include "ace/config-all.h"
+
+#if !defined (ACE_LACKS_PRAGMA_ONCE)
+# pragma once
+#endif /* ACE_LACKS_PRAGMA_ONCE */
+
+#include "tao/ORB.h"
+#include "tao/SystemException.h"
+#include "tao/Environment.h"
+#include "tao/Sequence_T.h"
+#include "tao/Seq_Var_T.h"
+#include "tao/Seq_Out_T.h"
+
+#include "orbsvcs/SSLIOPC.h"
+
+#if defined (TAO_EXPORT_MACRO)
+#undef TAO_EXPORT_MACRO
+#endif
+#define TAO_EXPORT_MACRO TAO_SSLIOP_Export
+
+#if defined(_MSC_VER)
+#pragma warning(push)
+#pragma warning(disable:4250)
+#endif /* _MSC_VER */
+
+#if defined (__BORLANDC__)
+#pragma option push -w-rvl -w-rch -w-ccc -w-inl
+#endif /* __BORLANDC__ */
+
+TAO_BEGIN_VERSIONED_NAMESPACE_DECL
+
+// TAO_IDL - Generated from
+// be\be_visitor_sequence/sequence_ch.cpp:101
+
+#if !defined (_TAO_SSLENDPOINTSEQUENCE_CH_)
+#define _TAO_SSLENDPOINTSEQUENCE_CH_
+
+class TAO_SSLEndpointSequence;
+
+typedef
+ TAO_FixedSeq_Var_T<
+ TAO_SSLEndpointSequence
+ >
+ TAO_SSLEndpointSequence_var;
+
+typedef
+ TAO_Seq_Out_T<
+ TAO_SSLEndpointSequence
+ >
+ TAO_SSLEndpointSequence_out;
+
+class TAO_SSLIOP_Export TAO_SSLEndpointSequence
+ : public
+ TAO::unbounded_value_sequence<
+ SSLIOP::SSL
+ >
+{
+public:
+ TAO_SSLEndpointSequence (void);
+ TAO_SSLEndpointSequence (CORBA::ULong max);
+ TAO_SSLEndpointSequence (
+ CORBA::ULong max,
+ CORBA::ULong length,
+ SSLIOP::SSL* buffer,
+ CORBA::Boolean release = false
+ );
+ TAO_SSLEndpointSequence (const TAO_SSLEndpointSequence &);
+ ~TAO_SSLEndpointSequence (void);
+
+ typedef TAO_SSLEndpointSequence_var _var_type;
+};
+
+#endif /* end #if !defined */
+
+// TAO_IDL - Generated from
+// be\be_visitor_typecode/typecode_decl.cpp:44
+
+extern TAO_SSLIOP_Export ::CORBA::TypeCode_ptr const _tc_TAO_SSLEndpointSequence;
+
+// TAO_IDL - Generated from
+// be\be_visitor_traits.cpp:61
+
+// Traits specializations.
+namespace TAO
+{
+}
+
+// TAO_IDL - Generated from
+// be\be_visitor_sequence/cdr_op_ch.cpp:71
+
+#if !defined _TAO_CDR_OP_TAO_SSLEndpointSequence_H_
+#define _TAO_CDR_OP_TAO_SSLEndpointSequence_H_
+
+TAO_SSLIOP_Export CORBA::Boolean operator<< (
+ TAO_OutputCDR &,
+ const TAO_SSLEndpointSequence &
+ );
+TAO_SSLIOP_Export CORBA::Boolean operator>> (
+ TAO_InputCDR &,
+ TAO_SSLEndpointSequence &
+ );
+
+#endif /* _TAO_CDR_OP_TAO_SSLEndpointSequence_H_ */
+
+TAO_END_VERSIONED_NAMESPACE_DECL
+
+// TAO_IDL - Generated from
+// be\be_codegen.cpp:955
+
+#if defined(_MSC_VER)
+#pragma warning(pop)
+#endif /* _MSC_VER */
+
+#if defined (__BORLANDC__)
+#pragma option pop
+#endif /* __BORLANDC__ */
+
+#include /**/ "ace/post.h"
+
+#endif /* ifndef */
+
+
diff --git a/TAO/orbsvcs/orbsvcs/Sched/Config_Scheduler.cpp b/TAO/orbsvcs/orbsvcs/Sched/Config_Scheduler.cpp
new file mode 100644
index 00000000000..c8c56c6b5ac
--- /dev/null
+++ b/TAO/orbsvcs/orbsvcs/Sched/Config_Scheduler.cpp
@@ -0,0 +1,674 @@
+// ============================================================================
+//
+// $Id$
+//
+// ============================================================================
+
+#include "orbsvcs/Time_Utilities.h"
+#include "orbsvcs/Scheduler_Factory.h"
+
+#include "orbsvcs/Sched/Config_Scheduler.h"
+
+ACE_RCSID(Sched, Config_Scheduler, "$Id$")
+
+TAO_BEGIN_VERSIONED_NAMESPACE_DECL
+
+ACE_Config_Scheduler::ACE_Config_Scheduler (void)
+#if defined (TAO_USES_STRATEGY_SCHEDULER)
+ : scheduler_strategy_ (static_cast<RtecScheduler::Preemption_Priority_t> (TAO_MIN_CRITICAL_PRIORITY))
+ , impl (new ACE_Strategy_Scheduler (scheduler_strategy_))
+#else
+ : impl (new Scheduler_Generic)
+#endif /* defined (TAO_USES_STRATEGY_SCHEDULER) */
+{
+ // impl->output_level (10);
+}
+
+ACE_Config_Scheduler::~ACE_Config_Scheduler (void)
+{
+ delete impl;
+}
+
+RtecScheduler::handle_t
+ACE_Config_Scheduler::create (const char * entry_point
+ ACE_ENV_ARG_DECL_NOT_USED)
+ ACE_THROW_SPEC ((CORBA::SystemException,
+ RtecScheduler::DUPLICATE_NAME))
+{
+ typedef RtecScheduler::RT_Info* RT_Info_ptr;
+
+ RtecScheduler::RT_Info** rt_info = 0;
+ ACE_NEW_RETURN (rt_info, RT_Info_ptr[1], -1);
+
+ ACE_NEW_RETURN (rt_info[0], RtecScheduler::RT_Info, -1);
+
+ rt_info[0]->entry_point = CORBA::string_dup(entry_point);
+ rt_info[0]->handle = -1;
+ rt_info[0]->worst_case_execution_time = ORBSVCS_Time::zero ();
+ rt_info[0]->typical_execution_time = ORBSVCS_Time::zero ();
+ rt_info[0]->cached_execution_time = ORBSVCS_Time::zero ();
+ rt_info[0]->period = 0;
+ rt_info[0]->criticality = RtecScheduler::VERY_LOW_CRITICALITY;
+ rt_info[0]->importance = RtecScheduler::VERY_LOW_IMPORTANCE;
+ rt_info[0]->quantum = ORBSVCS_Time::zero ();
+ rt_info[0]->threads = 0;
+ rt_info[0]->priority = 0;
+ rt_info[0]->preemption_subpriority = 0;
+ rt_info[0]->preemption_priority = 0;
+ rt_info[0]->info_type = RtecScheduler::OPERATION;
+ rt_info[0]->volatile_token = 0;
+
+ RtecScheduler::handle_t handle = -1;
+#if defined (TAO_USES_STRATEGY_SCHEDULER)
+ switch (impl->register_task (rt_info[0], handle))
+#else
+ switch (impl->register_task (rt_info, 1, handle))
+#endif /* defined (TAO_USES_STRATEGY_SCHEDULER) */
+
+ {
+ case BaseSchedImplType::SUCCEEDED:
+ break;
+ case BaseSchedImplType::ST_VIRTUAL_MEMORY_EXHAUSTED:
+ case BaseSchedImplType::ST_TASK_ALREADY_REGISTERED:
+ default:
+ delete rt_info[0];
+ delete[] rt_info;
+ ACE_ERROR ((LM_ERROR,
+ "Config_Scheduler::create - register_task failed\n"));
+ // @@ TODO: throw something.
+ break;
+ }
+ return handle;
+}
+
+RtecScheduler::handle_t
+ACE_Config_Scheduler::lookup (const char * entry_point
+ ACE_ENV_ARG_DECL_NOT_USED)
+ ACE_THROW_SPEC ((CORBA::SystemException))
+{
+ RtecScheduler::RT_Info* rt_info = 0;
+ switch (impl->get_rt_info (entry_point, rt_info))
+ {
+ case BaseSchedImplType::SUCCEEDED:
+ return rt_info->handle;
+ ACE_NOTREACHED (break);
+ case BaseSchedImplType::FAILED:
+ case BaseSchedImplType::ST_UNKNOWN_TASK:
+ default:
+ ACE_ERROR ((LM_ERROR,
+ "Config_Scheduler::lookup - get_rt_info failed\n"));
+ // @@ TODO: throw something.
+ break;
+ }
+ return -1;
+}
+
+RtecScheduler::RT_Info*
+ACE_Config_Scheduler::get (RtecScheduler::handle_t handle
+ ACE_ENV_ARG_DECL_NOT_USED)
+ ACE_THROW_SPEC((CORBA::SystemException,
+ RtecScheduler::UNKNOWN_TASK))
+{
+ RtecScheduler::RT_Info* rt_info = 0;
+ switch (impl->lookup_rt_info (handle, rt_info))
+ {
+ case BaseSchedImplType::SUCCEEDED:
+ {
+ // IDL memory managment semantics require that we return a copy.
+ RtecScheduler::RT_Info* copy;
+ ACE_NEW_RETURN (copy, RtecScheduler::RT_Info (*rt_info), 0);
+ return copy;
+ }
+ ACE_NOTREACHED (break);
+ case BaseSchedImplType::FAILED:
+ case BaseSchedImplType::ST_UNKNOWN_TASK:
+ default:
+ ACE_ERROR ((LM_ERROR,
+ "Config_Scheduler::get - lookup_rt_info failed\n"));
+ // @@ TODO: throw something.
+ break;
+ }
+ return 0;
+}
+
+void ACE_Config_Scheduler::set (RtecScheduler::handle_t handle,
+ RtecScheduler::Criticality_t criticality,
+ RtecScheduler::Time time,
+ RtecScheduler::Time typical_time,
+ RtecScheduler::Time cached_time,
+ RtecScheduler::Period_t period,
+ RtecScheduler::Importance_t importance,
+ RtecScheduler::Quantum_t quantum,
+ CORBA::Long threads,
+ RtecScheduler::Info_Type_t info_type
+ ACE_ENV_ARG_DECL_NOT_USED)
+ ACE_THROW_SPEC ((CORBA::SystemException,
+ RtecScheduler::UNKNOWN_TASK))
+{
+ RtecScheduler::RT_Info* rt_info = 0;
+ switch (impl->lookup_rt_info (handle, rt_info))
+ {
+ case BaseSchedImplType::SUCCEEDED:
+ rt_info->criticality = criticality,
+ rt_info->worst_case_execution_time = time;
+ rt_info->typical_execution_time = typical_time;
+ rt_info->cached_execution_time = cached_time;
+ rt_info->period = period;
+ rt_info->importance = importance;
+ rt_info->quantum = quantum;
+ rt_info->threads = threads;
+ rt_info->info_type = info_type;
+ break;
+ case BaseSchedImplType::FAILED:
+ case BaseSchedImplType::ST_UNKNOWN_TASK:
+ default:
+ ACE_ERROR ((LM_ERROR,
+ "Config_Scheduler::set - lookup_rt_info failed\n"));
+ // @@ TODO: throw something.
+ break;
+ }
+}
+
+void ACE_Config_Scheduler::priority (RtecScheduler::handle_t handle,
+ RtecScheduler::OS_Priority& priority,
+ RtecScheduler::Preemption_Subpriority_t& p_subpriority,
+ RtecScheduler::Preemption_Priority_t& p_priority
+ ACE_ENV_ARG_DECL_NOT_USED)
+ ACE_THROW_SPEC ((CORBA::SystemException,
+ RtecScheduler::UNKNOWN_TASK,
+ RtecScheduler::NOT_SCHEDULED))
+{
+
+ if (impl->priority (handle, priority, p_subpriority, p_priority) == -1)
+ {
+ ACE_ERROR ((LM_ERROR,
+ "Config_Scheduler::priority - priority failed\n"));
+ // TODO: throw something.
+ }
+}
+
+void ACE_Config_Scheduler::entry_point_priority (const char * entry_point,
+ RtecScheduler::OS_Priority& priority,
+ RtecScheduler::Preemption_Subpriority_t& p_subpriority,
+ RtecScheduler::Preemption_Priority_t& p_priority
+ ACE_ENV_ARG_DECL)
+ ACE_THROW_SPEC((CORBA::SystemException,
+ RtecScheduler::UNKNOWN_TASK,
+ RtecScheduler::NOT_SCHEDULED))
+{
+ this->priority (lookup (entry_point ACE_ENV_ARG_PARAMETER),
+ priority, p_subpriority, p_priority
+ ACE_ENV_ARG_PARAMETER);
+}
+
+void ACE_Config_Scheduler::add_dependency (RtecScheduler::handle_t handle,
+ RtecScheduler::handle_t dependency,
+ CORBA::Long number_of_calls,
+ RtecScheduler::Dependency_Type_t
+ dependency_type
+ ACE_ENV_ARG_DECL_NOT_USED)
+ ACE_THROW_SPEC ((CORBA::SystemException,
+ RtecScheduler::UNKNOWN_TASK))
+{
+
+ RtecScheduler::RT_Info* rt_info = 0;
+ switch (impl->lookup_rt_info (handle, rt_info))
+ {
+ case BaseSchedImplType::SUCCEEDED:
+ {
+ RtecScheduler::Dependency_Info dep;
+ dep.rt_info = dependency;
+ dep.number_of_calls = number_of_calls;
+ dep.dependency_type = dependency_type;
+#if defined (TAO_USES_STRATEGY_SCHEDULER)
+ impl->add_dependency (rt_info, dep);
+#else
+ BaseSchedImplType::add_dependency (rt_info, dep);
+#endif /* defined (TAO_USES_STRATEGY_SCHEDULER) */
+
+ }
+ break;
+ case BaseSchedImplType::FAILED:
+ case BaseSchedImplType::ST_UNKNOWN_TASK:
+ default:
+ ACE_ERROR ((LM_ERROR,
+ "cannot find %d to add dependency", handle));
+ // TODO: throw something.
+ break;
+ }
+}
+
+void ACE_Config_Scheduler::compute_scheduling (CORBA::Long minimum_priority,
+ CORBA::Long maximum_priority,
+ RtecScheduler::RT_Info_Set_out infos,
+ RtecScheduler::Dependency_Set_out dependencies,
+ RtecScheduler::Config_Info_Set_out configs,
+ RtecScheduler::Scheduling_Anomaly_Set_out anomalies
+ ACE_ENV_ARG_DECL_NOT_USED)
+ ACE_THROW_SPEC ((CORBA::SystemException,
+ RtecScheduler::UTILIZATION_BOUND_EXCEEDED,
+ RtecScheduler::INSUFFICIENT_THREAD_PRIORITY_LEVELS,
+ RtecScheduler::TASK_COUNT_MISMATCH))
+{
+
+ // Initialize the scheduler implementation.
+ impl->init (minimum_priority, maximum_priority);
+
+ // Construct an unbounded set to hold any scheduling anomalies.
+ ACE_Unbounded_Set<RtecScheduler::Scheduling_Anomaly *> anomaly_set;
+
+ // Invoke the imlementation's scheduling method.
+ BaseSchedImplType::status_t schedule_status;
+ schedule_status = impl->schedule (anomaly_set);
+
+ if (dependencies.ptr () == 0)
+ {
+ dependencies = new RtecScheduler::Dependency_Set ();
+ }
+
+ // Iterate over the set of anomalies, reporting each one, storing
+ // it in the set of anomalies to return, and determining the worst
+ // anomaly severity.
+ RtecScheduler::Anomaly_Severity severity = RtecScheduler::ANOMALY_NONE;
+ RtecScheduler::Scheduling_Anomaly **anomaly = 0;
+ const char *anomaly_severity_msg = "NONE";
+ CORBA::ULong anomaly_index = 0;
+ CORBA::ULong anomaly_set_size =
+ static_cast<CORBA::ULong> (anomaly_set.size ());
+ if (anomalies.ptr () == 0)
+ {
+ anomalies =
+ new RtecScheduler::Scheduling_Anomaly_Set (anomaly_set_size);
+ }
+ anomalies->length (anomaly_set_size);
+ ACE_Unbounded_Set_Iterator<RtecScheduler::Scheduling_Anomaly *>
+ anomaly_iter (anomaly_set);
+ for (anomaly_iter.first (), anomaly_index = 0;
+ anomaly_iter.next (anomaly);
+ anomaly_iter.advance (), ++anomaly_index)
+ {
+ if (0 == *anomaly)
+ {
+ // if for some reason we stored a null anomaly pointer,
+ // just give default values to that entry in the sequence.
+ anomalies[anomaly_index].severity = RtecScheduler::ANOMALY_NONE;
+ anomalies[anomaly_index].description = "";
+ continue;
+ }
+
+ // Keep track of the *worst* anomaly severity
+ switch ((*anomaly)->severity)
+ {
+ case RtecScheduler::ANOMALY_FATAL:
+ anomaly_severity_msg = "FATAL";
+ severity = RtecScheduler::ANOMALY_FATAL;
+ break;
+
+ case RtecScheduler::ANOMALY_ERROR:
+ anomaly_severity_msg = "ERROR";
+ if (severity != RtecScheduler::ANOMALY_FATAL)
+ {
+ severity = RtecScheduler::ANOMALY_ERROR;
+ }
+ break;
+
+ case RtecScheduler::ANOMALY_WARNING:
+ anomaly_severity_msg = "WARNING";
+ if ((severity != RtecScheduler::ANOMALY_FATAL) &&
+ (severity != RtecScheduler::ANOMALY_ERROR))
+ {
+ severity = RtecScheduler::ANOMALY_WARNING;
+ }
+ break;
+
+ // case RtecScheduler::ANOMALY_NONE:
+ // case Anomaly_Severity_TAO_ENUM_32BIT_ENFORCER:
+ default:
+ anomaly_severity_msg = "UNKNOWN";
+ break;
+ }
+
+ // Output the anomaly message
+ ACE_DEBUG ((LM_DEBUG,
+ "%s: %s\n",
+ anomaly_severity_msg,
+ (*anomaly)->description.in ()));
+
+ // Store the anomaly in the anomaly sequence out parameter
+ anomalies[anomaly_index] = **anomaly;
+
+ // Release the anomaly node.
+ delete *anomaly;
+ }
+
+ switch (severity)
+ {
+ // On a fatal anomaly abort without generating a schedule.
+ case RtecScheduler::ANOMALY_FATAL:
+ // TODO: throw something.
+ ACE_ERROR ((LM_ERROR, "Schedule failed due to FATAL anomaly.\n"));
+ return;
+
+ // Otherwise, make sure we didn't get a fatal return type.
+ default:
+ switch (schedule_status)
+ {
+ case BaseSchedImplType::ST_BAD_INTERNAL_POINTER :
+ // TODO: throw something.
+ ACE_ERROR ((LM_ERROR,
+ "Schedule failed due to bad internal pointer.\n"));
+ return;
+
+ case BaseSchedImplType::ST_VIRTUAL_MEMORY_EXHAUSTED :
+ // TODO: throw something.
+ ACE_ERROR ((LM_ERROR,
+ "Schedule failed due to insufficient memory.\n"));
+ return;
+
+ case BaseSchedImplType::THREAD_COUNT_MISMATCH :
+ // TODO: throw something.
+ ACE_ERROR ((LM_ERROR,
+ "Schedule failed due to thread count mismatch.\n"));
+ return;
+
+ case BaseSchedImplType::TASK_COUNT_MISMATCH :
+ // TODO: throw something.
+ ACE_ERROR ((LM_ERROR,
+ "Schedule failed due to task count mismatch.\n"));
+ return;
+
+ // Otherwise, go ahead and generate a schedule.
+ default:
+ break;
+ }
+ break;
+ }
+
+ // return the set of scheduled RT_Infos
+ if (infos.ptr () == 0)
+ {
+ infos = new RtecScheduler::RT_Info_Set (impl->tasks ());
+ }
+ infos->length (impl->tasks ());
+ for (RtecScheduler::handle_t handle = 1;
+ handle <= static_cast<RtecScheduler::handle_t> (impl->tasks ());
+ ++handle)
+ {
+ RtecScheduler::RT_Info* rt_info = 0;
+ switch (impl->lookup_rt_info (handle, rt_info))
+ {
+ case BaseSchedImplType::SUCCEEDED:
+ // We know that handles start at 1.
+ infos[static_cast<CORBA::ULong> (handle - 1)] = *rt_info;
+ break;
+ case BaseSchedImplType::FAILED:
+ case BaseSchedImplType::ST_UNKNOWN_TASK:
+ default:
+ ACE_ERROR ((LM_ERROR,
+ "Config_Scheduler::schedule - lookup_rt_info failed\n"));
+ // TODO: throw something.
+ break;
+ }
+ }
+
+ // return the set of scheduled Config_Infos
+ if (configs.ptr () == 0)
+ {
+ configs =
+ new RtecScheduler::Config_Info_Set(impl->minimum_priority_queue () + 1);
+ }
+ configs->length (impl->minimum_priority_queue () + 1);
+ for (RtecScheduler::Preemption_Priority_t priority = 0;
+ priority <=
+ static_cast<RtecScheduler::Preemption_Priority_t> (impl->minimum_priority_queue ());
+ ++priority)
+ {
+ RtecScheduler::Config_Info* config_info = 0;
+ switch (impl->lookup_config_info (priority, config_info))
+ {
+ case BaseSchedImplType::SUCCEEDED:
+ // We know that handles start at 1.
+ configs[CORBA::ULong(priority)] = *config_info;
+ break;
+ case BaseSchedImplType::FAILED:
+ case BaseSchedImplType::ST_UNKNOWN_TASK:
+ default:
+ ACE_ERROR ((LM_ERROR,
+ "Config_Scheduler::schedule - "
+ "lookup_config_info failed\n"));
+ // TODO: throw something.
+ break;
+ }
+ }
+
+ ACE_DEBUG ((LM_DEBUG, "Schedule prepared.\n"));
+ ACE_DEBUG ((LM_DEBUG, "Dumping to stdout.\n"));
+ ACE_Scheduler_Factory::dump_schedule (*(infos.ptr()),
+ *(dependencies.ptr()),
+ *(configs.ptr()),
+ *(anomalies.ptr()), 0);
+ ACE_DEBUG ((LM_DEBUG, "Dump done.\n"));
+}
+
+
+void ACE_Config_Scheduler::dispatch_configuration (RtecScheduler::Preemption_Priority_t p_priority,
+ RtecScheduler::OS_Priority& priority,
+ RtecScheduler::Dispatching_Type_t & d_type
+ ACE_ENV_ARG_DECL_NOT_USED)
+ ACE_THROW_SPEC ((CORBA::SystemException,
+ RtecScheduler::NOT_SCHEDULED,
+ RtecScheduler::UNKNOWN_PRIORITY_LEVEL))
+{
+
+ if (impl->dispatch_configuration (p_priority, priority, d_type) == -1)
+ {
+ ACE_ERROR ((LM_ERROR,
+ "Config_Scheduler::dispatch_configuration -"
+ " dispatch_configuration failed\n"));
+ // TODO: throw something.
+ }
+}
+ // provide the thread priority and queue type for the given priority level
+
+
+RtecScheduler::Preemption_Priority_t
+ACE_Config_Scheduler::last_scheduled_priority (ACE_ENV_SINGLE_ARG_DECL_NOT_USED)
+ ACE_THROW_SPEC ((CORBA::SystemException,
+ RtecScheduler::NOT_SCHEDULED))
+{
+
+ RtecScheduler::Preemption_Priority_t priority = impl->minimum_priority_queue ();
+
+ if (priority < 0)
+ {
+ ACE_ERROR ((LM_ERROR,
+ "Config_Scheduler::last_scheduled_priority - priorities failed\n"));
+ // TODO: throw something.
+ }
+
+ return priority;
+}
+ // Returns the last priority number assigned to an operation in the schedule.
+ // The number returned is one less than the total number of scheduled priorities.
+ // All scheduled priorities range from 0 to the number returned, inclusive.
+
+void
+ACE_Config_Scheduler::get_config_infos (RtecScheduler::Config_Info_Set_out configs
+ ACE_ENV_ARG_DECL_NOT_USED)
+ ACE_THROW_SPEC ((CORBA::SystemException,
+ RtecScheduler::SYNCHRONIZATION_FAILURE,
+ RtecScheduler::NOT_SCHEDULED))
+{
+ ACE_UNUSED_ARG ((configs));
+
+ //TODO: fill the Config_Info_Set with the runtime Config_Infos
+ //for now, this function is unimplemented
+ return;
+}
+
+void ACE_Config_Scheduler::reset (RtecScheduler::handle_t,
+ RtecScheduler::Criticality_t,
+ RtecScheduler::Time,
+ RtecScheduler::Time,
+ RtecScheduler::Time,
+ RtecScheduler::Period_t,
+ RtecScheduler::Importance_t,
+ RtecScheduler::Quantum_t,
+ CORBA::Long,
+ RtecScheduler::Info_Type_t
+ ACE_ENV_ARG_DECL)
+ ACE_THROW_SPEC ((CORBA::SystemException,
+ RtecScheduler::UNKNOWN_TASK,
+ RtecScheduler::INTERNAL,
+ RtecScheduler::SYNCHRONIZATION_FAILURE))
+{
+ ACE_THROW (CORBA::NO_IMPLEMENT ());
+}
+
+void ACE_Config_Scheduler::set_seq (const RtecScheduler::RT_Info_Set&
+ ACE_ENV_ARG_DECL)
+ ACE_THROW_SPEC ((CORBA::SystemException,
+ RtecScheduler::UNKNOWN_TASK,
+ RtecScheduler::INTERNAL,
+ RtecScheduler::SYNCHRONIZATION_FAILURE))
+// Set characteristics of the RT_Infos corresponding to the passed handles.
+// Tuples are added in the case of existing and/or multiple definitions.
+{
+ ACE_THROW (CORBA::NO_IMPLEMENT ());
+}
+
+void ACE_Config_Scheduler::reset_seq (const RtecScheduler::RT_Info_Set&
+ ACE_ENV_ARG_DECL)
+ ACE_THROW_SPEC ((CORBA::SystemException,
+ RtecScheduler::UNKNOWN_TASK,
+ RtecScheduler::INTERNAL,
+ RtecScheduler::SYNCHRONIZATION_FAILURE))
+// Reset characteristics of the RT_Infos corresponding to the passed handles.
+// Tuples are replaced in the case of existing and/or multiple definitions.
+{
+ ACE_THROW (CORBA::NO_IMPLEMENT ());
+}
+
+void ACE_Config_Scheduler::replace_seq (const RtecScheduler::RT_Info_Set&
+ ACE_ENV_ARG_DECL)
+ ACE_THROW_SPEC ((CORBA::SystemException,
+ RtecScheduler::UNKNOWN_TASK,
+ RtecScheduler::INTERNAL,
+ RtecScheduler::SYNCHRONIZATION_FAILURE))
+// Replace all RT_Infos, resetting characteristics of the RT_Infos
+// corresponding to the passed handles. All other RT_Infos are
+// reset to their uninitialized values, i.e., the same they have
+// just after the create call.
+{
+ ACE_THROW (CORBA::NO_IMPLEMENT ());
+}
+
+void ACE_Config_Scheduler::remove_dependency (RtecScheduler::handle_t,
+ RtecScheduler::handle_t,
+ CORBA::Long,
+ RtecScheduler::Dependency_Type_t
+ ACE_ENV_ARG_DECL)
+ ACE_THROW_SPEC ((CORBA::SystemException,
+ RtecScheduler::SYNCHRONIZATION_FAILURE,
+ RtecScheduler::UNKNOWN_TASK))
+// This method removes a dependency between two RT_Infos.
+{
+ ACE_THROW (CORBA::NO_IMPLEMENT ());
+}
+
+void ACE_Config_Scheduler::set_dependency_enable_state (RtecScheduler::handle_t,
+ RtecScheduler::handle_t,
+ CORBA::Long,
+ RtecScheduler::Dependency_Type_t,
+ RtecScheduler::Dependency_Enabled_Type_t
+ ACE_ENV_ARG_DECL)
+ ACE_THROW_SPEC ((CORBA::SystemException,
+ RtecScheduler::SYNCHRONIZATION_FAILURE,
+ RtecScheduler::UNKNOWN_TASK))
+// This method sets the enable state of a dependency between two RT_Infos.
+{
+ ACE_THROW (CORBA::NO_IMPLEMENT ());
+}
+
+void ACE_Config_Scheduler::set_dependency_enable_state_seq (const RtecScheduler::Dependency_Set &
+ ACE_ENV_ARG_DECL)
+ ACE_THROW_SPEC ((CORBA::SystemException,
+ RtecScheduler::SYNCHRONIZATION_FAILURE,
+ RtecScheduler::UNKNOWN_TASK))
+// This method sets the enable state of a sequence of dependencies.
+{
+ ACE_THROW (CORBA::NO_IMPLEMENT ());
+}
+
+void ACE_Config_Scheduler::set_rt_info_enable_state (RtecScheduler::handle_t,
+ RtecScheduler::RT_Info_Enabled_Type_t
+ ACE_ENV_ARG_DECL)
+ ACE_THROW_SPEC ((CORBA::SystemException,
+ RtecScheduler::SYNCHRONIZATION_FAILURE,
+ RtecScheduler::UNKNOWN_TASK))
+// This method enables or disables an RT_Info.
+{
+ ACE_THROW (CORBA::NO_IMPLEMENT ());
+}
+
+void ACE_Config_Scheduler::set_rt_info_enable_state_seq (
+ const RtecScheduler::RT_Info_Enable_State_Pair_Set &
+ ACE_ENV_ARG_DECL)
+ ACE_THROW_SPEC ((CORBA::SystemException,
+ RtecScheduler::SYNCHRONIZATION_FAILURE,
+ RtecScheduler::UNKNOWN_TASK))
+// This method enables or disables a sequence of RT_Infos.
+{
+ ACE_THROW (CORBA::NO_IMPLEMENT ());
+}
+
+void ACE_Config_Scheduler::recompute_scheduling (CORBA::Long,
+ CORBA::Long,
+ RtecScheduler::Scheduling_Anomaly_Set_out
+ ACE_ENV_ARG_DECL)
+ ACE_THROW_SPEC ((CORBA::SystemException,
+ RtecScheduler::UTILIZATION_BOUND_EXCEEDED,
+ RtecScheduler::SYNCHRONIZATION_FAILURE,
+ RtecScheduler::INSUFFICIENT_THREAD_PRIORITY_LEVELS,
+ RtecScheduler::TASK_COUNT_MISMATCH,
+ RtecScheduler::INTERNAL,
+ RtecScheduler::DUPLICATE_NAME))
+// Recomputes the scheduling priorities, etc.
+{
+ ACE_THROW (CORBA::NO_IMPLEMENT ());
+}
+
+void ACE_Config_Scheduler::get_rt_info_set (RtecScheduler::RT_Info_Set_out
+ ACE_ENV_ARG_DECL)
+ ACE_THROW_SPEC ((CORBA::SystemException,
+ RtecScheduler::SYNCHRONIZATION_FAILURE,
+ RtecScheduler::INTERNAL))
+// Returns the set of rt_infos, with their assigned priorities (as
+// of the last schedule re-computation).
+{
+ ACE_THROW (CORBA::NO_IMPLEMENT ());
+}
+
+void ACE_Config_Scheduler::get_dependency_set (RtecScheduler::Dependency_Set_out
+ ACE_ENV_ARG_DECL)
+ ACE_THROW_SPEC ((CORBA::SystemException,
+ RtecScheduler::SYNCHRONIZATION_FAILURE,
+ RtecScheduler::INTERNAL))
+// Returns the set of rt_infos, with their assigned priorities (as
+// of the last schedule re-computation).
+{
+ ACE_THROW (CORBA::NO_IMPLEMENT ());
+}
+
+void ACE_Config_Scheduler::get_config_info_set (RtecScheduler::Config_Info_Set_out
+ ACE_ENV_ARG_DECL)
+ ACE_THROW_SPEC ((CORBA::SystemException,
+ RtecScheduler::SYNCHRONIZATION_FAILURE,
+ RtecScheduler::INTERNAL))
+// Returns the set of config_infos, describing the appropriate
+// number, types, and priority levels for the dispatching lanes.
+{
+ ACE_THROW (CORBA::NO_IMPLEMENT ());
+}
+
+TAO_END_VERSIONED_NAMESPACE_DECL
diff --git a/TAO/orbsvcs/orbsvcs/Sched/Config_Scheduler.h b/TAO/orbsvcs/orbsvcs/Sched/Config_Scheduler.h
new file mode 100644
index 00000000000..d6b378d8f82
--- /dev/null
+++ b/TAO/orbsvcs/orbsvcs/Sched/Config_Scheduler.h
@@ -0,0 +1,318 @@
+// -*- C++ -*-
+
+// $Id$
+
+#ifndef ACE_CONFIG_SCHEDULER_H
+#define ACE_CONFIG_SCHEDULER_H
+
+#include /**/ "ace/pre.h"
+
+#include "ace/OS.h"
+
+#if !defined (ACE_LACKS_PRAGMA_ONCE)
+# pragma once
+#endif /* ACE_LACKS_PRAGMA_ONCE */
+
+#include "orbsvcs/RtecSchedulerS.h"
+#include "orbsvcs/Event_Service_Constants.h"
+
+#include "orbsvcs/Sched/sched_export.h"
+
+#if defined (TAO_USES_STRATEGY_SCHEDULER)
+#include "orbsvcs/Sched/Strategy_Scheduler.h"
+#else
+#include "orbsvcs/Sched/Scheduler_Generic.h"
+#endif /* defined (TAO_USES_STRATEGY_SCHEDULER) */
+
+TAO_BEGIN_VERSIONED_NAMESPACE_DECL
+
+class TAO_RTSched_Export ACE_Config_Scheduler
+: public POA_RtecScheduler::Scheduler
+ // = TITLE
+ // A (local) implementation for the RtecScheduler::Scheduler service.
+ //
+ // = DESCRIPTION
+ // This class implements a servant for the
+ // RtecScheduler::Scheduler service, using the Scheduler classes
+ // distributed with the EC.
+{
+public:
+
+ ACE_Config_Scheduler (void);
+ virtual ~ACE_Config_Scheduler (void);
+
+ virtual RtecScheduler::handle_t create (const char * entry_point
+ ACE_ENV_ARG_DECL)
+ ACE_THROW_SPEC ((CORBA::SystemException, RtecScheduler::DUPLICATE_NAME));
+
+ virtual RtecScheduler::handle_t lookup (const char * entry_point
+ ACE_ENV_ARG_DECL)
+ ACE_THROW_SPEC((CORBA::SystemException));
+
+ virtual RtecScheduler::RT_Info* get (RtecScheduler::handle_t handle
+ ACE_ENV_ARG_DECL)
+ ACE_THROW_SPEC ((CORBA::SystemException, RtecScheduler::UNKNOWN_TASK));
+
+ virtual void set (RtecScheduler::handle_t handle,
+ RtecScheduler::Criticality_t criticality,
+ RtecScheduler::Time time,
+ RtecScheduler::Time typical_time,
+ RtecScheduler::Time cached_time,
+ RtecScheduler::Period_t period,
+ RtecScheduler::Importance_t importance,
+ RtecScheduler::Quantum_t quantum,
+ CORBA::Long threads,
+ RtecScheduler::Info_Type_t info_type
+ ACE_ENV_ARG_DECL)
+ ACE_THROW_SPEC ((CORBA::SystemException, RtecScheduler::UNKNOWN_TASK));
+
+ virtual void priority (RtecScheduler::handle_t handle,
+ RtecScheduler::OS_Priority& priority,
+ RtecScheduler::Preemption_Subpriority_t& p_subpriority,
+ RtecScheduler::Preemption_Priority_t& p_priority
+ ACE_ENV_ARG_DECL)
+ ACE_THROW_SPEC ((CORBA::SystemException,
+ RtecScheduler::UNKNOWN_TASK,
+ RtecScheduler::NOT_SCHEDULED));
+
+ virtual void entry_point_priority (const char * entry_point,
+ RtecScheduler::OS_Priority& priority,
+ RtecScheduler::Preemption_Subpriority_t& p_subpriority,
+ RtecScheduler::Preemption_Priority_t& p_priority
+ ACE_ENV_ARG_DECL)
+ ACE_THROW_SPEC ((CORBA::SystemException,
+ RtecScheduler::UNKNOWN_TASK,
+ RtecScheduler::NOT_SCHEDULED));
+
+ virtual void add_dependency (RtecScheduler::handle_t handle,
+ RtecScheduler::handle_t dependency,
+ CORBA::Long number_of_calls,
+ RtecScheduler::Dependency_Type_t dependency_type
+ ACE_ENV_ARG_DECL)
+ ACE_THROW_SPEC ((CORBA::SystemException,
+ RtecScheduler::UNKNOWN_TASK));
+
+ virtual void compute_scheduling (CORBA::Long minimum_priority,
+ CORBA::Long maximum_priority,
+ RtecScheduler::RT_Info_Set_out infos,
+ RtecScheduler::Dependency_Set_out dependencies,
+ RtecScheduler::Config_Info_Set_out configs,
+ RtecScheduler::Scheduling_Anomaly_Set_out anomalies
+ ACE_ENV_ARG_DECL)
+ ACE_THROW_SPEC((CORBA::SystemException,
+ RtecScheduler::UTILIZATION_BOUND_EXCEEDED,
+ RtecScheduler::INSUFFICIENT_THREAD_PRIORITY_LEVELS,
+ RtecScheduler::TASK_COUNT_MISMATCH));
+
+ virtual void dispatch_configuration (RtecScheduler::Preemption_Priority_t p_priority,
+ RtecScheduler::OS_Priority& priority,
+ RtecScheduler::Dispatching_Type_t & d_type
+ ACE_ENV_ARG_DECL)
+ ACE_THROW_SPEC ((CORBA::SystemException,
+ RtecScheduler::NOT_SCHEDULED,
+ RtecScheduler::UNKNOWN_PRIORITY_LEVEL));
+ // provide the thread priority and queue type for the given priority level
+
+ virtual RtecScheduler::Preemption_Priority_t
+ last_scheduled_priority (ACE_ENV_SINGLE_ARG_DECL)
+ ACE_THROW_SPEC ((CORBA::SystemException,
+ RtecScheduler::NOT_SCHEDULED));
+ // Returns the last priority number assigned to an operation in the
+ // schedule.
+ // The number returned is one less than the total number of
+ // scheduled priorities.
+ // All scheduled priorities range from 0 to the number returned,
+ // inclusive.
+
+ virtual void get_config_infos (RtecScheduler::Config_Info_Set_out configs
+ ACE_ENV_ARG_DECL)
+ ACE_THROW_SPEC ((CORBA::SystemException,
+ RtecScheduler::SYNCHRONIZATION_FAILURE,
+ RtecScheduler::NOT_SCHEDULED));
+ // Provides the set of Config_Infos associated with the current schedule.
+
+ virtual void reset (RtecScheduler::handle_t handle,
+ RtecScheduler::Criticality_t criticality,
+ RtecScheduler::Time time,
+ RtecScheduler::Time typical_time,
+ RtecScheduler::Time cached_time,
+ RtecScheduler::Period_t period,
+ RtecScheduler::Importance_t importance,
+ RtecScheduler::Quantum_t quantum,
+ CORBA::Long threads,
+ RtecScheduler::Info_Type_t info_type
+ ACE_ENV_ARG_DECL)
+ ACE_THROW_SPEC ((CORBA::SystemException,
+ RtecScheduler::UNKNOWN_TASK,
+ RtecScheduler::INTERNAL,
+ RtecScheduler::SYNCHRONIZATION_FAILURE));
+ // Reset characteristics of the RT_Info corresponding to the passed handle.
+
+ virtual void set_seq (const RtecScheduler::RT_Info_Set& infos
+ ACE_ENV_ARG_DECL)
+ ACE_THROW_SPEC ((CORBA::SystemException,
+ RtecScheduler::UNKNOWN_TASK,
+ RtecScheduler::INTERNAL,
+ RtecScheduler::SYNCHRONIZATION_FAILURE));
+ // Set characteristics of the RT_Infos corresponding to the passed handles.
+ // Tuples are added in the case of existing and/or multiple definitions.
+
+ virtual void reset_seq (const RtecScheduler::RT_Info_Set& infos
+ ACE_ENV_ARG_DECL)
+ ACE_THROW_SPEC ((CORBA::SystemException,
+ RtecScheduler::UNKNOWN_TASK,
+ RtecScheduler::INTERNAL,
+ RtecScheduler::SYNCHRONIZATION_FAILURE));
+ // Reset characteristics of the RT_Infos corresponding to the passed handles.
+ // Tuples are replaced in the case of existing and/or multiple definitions.
+
+ virtual void replace_seq (const RtecScheduler::RT_Info_Set& infos
+ ACE_ENV_ARG_DECL)
+ ACE_THROW_SPEC ((CORBA::SystemException,
+ RtecScheduler::UNKNOWN_TASK,
+ RtecScheduler::INTERNAL,
+ RtecScheduler::SYNCHRONIZATION_FAILURE));
+ // Replace all RT_Infos, resetting characteristics of the RT_Infos
+ // corresponding to the passed handles. All other RT_Infos are
+ // reset to their uninitialized values, i.e., the same they have
+ // just after the create call.
+
+ virtual void remove_dependency (RtecScheduler::handle_t handle,
+ RtecScheduler::handle_t dependency,
+ CORBA::Long number_of_calls,
+ RtecScheduler::Dependency_Type_t dependency_type
+ ACE_ENV_ARG_DECL)
+ ACE_THROW_SPEC ((CORBA::SystemException,
+ RtecScheduler::SYNCHRONIZATION_FAILURE,
+ RtecScheduler::UNKNOWN_TASK));
+ // This method removes a dependency between two RT_Infos.
+
+ virtual void set_dependency_enable_state (RtecScheduler::handle_t handle,
+ RtecScheduler::handle_t dependency,
+ CORBA::Long number_of_calls,
+ RtecScheduler::Dependency_Type_t dependency_type,
+ RtecScheduler::Dependency_Enabled_Type_t enabled
+ ACE_ENV_ARG_DECL)
+ ACE_THROW_SPEC ((CORBA::SystemException,
+ RtecScheduler::SYNCHRONIZATION_FAILURE,
+ RtecScheduler::UNKNOWN_TASK));
+ // This method sets the enable state of a dependency between two RT_Infos.
+
+ virtual void set_dependency_enable_state_seq (const RtecScheduler::Dependency_Set & dependencies
+ ACE_ENV_ARG_DECL)
+ ACE_THROW_SPEC ((CORBA::SystemException,
+ RtecScheduler::SYNCHRONIZATION_FAILURE,
+ RtecScheduler::UNKNOWN_TASK));
+ // This method sets the enable state of a sequence of dependencies.
+
+ virtual void set_rt_info_enable_state (RtecScheduler::handle_t handle,
+ RtecScheduler::RT_Info_Enabled_Type_t enabled
+ ACE_ENV_ARG_DECL)
+ ACE_THROW_SPEC ((CORBA::SystemException,
+ RtecScheduler::SYNCHRONIZATION_FAILURE,
+ RtecScheduler::UNKNOWN_TASK));
+ // This method enables or disables an RT_Info.
+
+ virtual void set_rt_info_enable_state_seq (const RtecScheduler::RT_Info_Enable_State_Pair_Set & pair_set
+ ACE_ENV_ARG_DECL)
+ ACE_THROW_SPEC ((CORBA::SystemException,
+ RtecScheduler::SYNCHRONIZATION_FAILURE,
+ RtecScheduler::UNKNOWN_TASK));
+ // This method enables or disables a sequence of RT_Infos.
+
+ virtual void recompute_scheduling (CORBA::Long minimum_priority,
+ CORBA::Long maximum_priority,
+ RtecScheduler::Scheduling_Anomaly_Set_out anomalies
+ ACE_ENV_ARG_DECL)
+ ACE_THROW_SPEC ((CORBA::SystemException,
+ RtecScheduler::UTILIZATION_BOUND_EXCEEDED,
+ RtecScheduler::SYNCHRONIZATION_FAILURE,
+ RtecScheduler::INSUFFICIENT_THREAD_PRIORITY_LEVELS,
+ RtecScheduler::TASK_COUNT_MISMATCH,
+ RtecScheduler::INTERNAL,
+ RtecScheduler::DUPLICATE_NAME));
+ // Recomputes the scheduling priorities, etc.
+
+ virtual void get_rt_info_set (RtecScheduler::RT_Info_Set_out infos
+ ACE_ENV_ARG_DECL)
+ ACE_THROW_SPEC ((CORBA::SystemException,
+ RtecScheduler::SYNCHRONIZATION_FAILURE,
+ RtecScheduler::INTERNAL));
+ // Returns the set of rt_infos, with their assigned priorities (as
+ // of the last schedule re-computation).
+
+ virtual void get_dependency_set (RtecScheduler::Dependency_Set_out dependencies
+ ACE_ENV_ARG_DECL)
+ ACE_THROW_SPEC ((CORBA::SystemException,
+ RtecScheduler::SYNCHRONIZATION_FAILURE,
+ RtecScheduler::INTERNAL));
+ // Returns the set of rt_infos, with their assigned priorities (as
+ // of the last schedule re-computation).
+
+ virtual void get_config_info_set (RtecScheduler::Config_Info_Set_out configs
+ ACE_ENV_ARG_DECL)
+ ACE_THROW_SPEC ((CORBA::SystemException,
+ RtecScheduler::SYNCHRONIZATION_FAILURE,
+ RtecScheduler::INTERNAL));
+ // Returns the set of config_infos, describing the appropriate
+ // number, types, and priority levels for the dispatching lanes.
+
+
+private:
+
+#if defined (TAO_USES_STRATEGY_SCHEDULER)
+
+ // trait for the scheduler implementation base class
+ typedef ACE_DynScheduler BaseSchedImplType;
+
+ // traits for the scheduler strategy
+#if defined (TAO_USES_MUF_SCHEDULING)
+
+ typedef ACE_MUF_Scheduler_Strategy Scheduler_Strategy;
+
+#elif defined (TAO_USES_MLF_SCHEDULING)
+# if ! defined (TAO_MIN_CRITICAL_PRIORITY)
+# define TAO_MIN_CRITICAL_PRIORITY 0
+# endif /* ! defined (TAO_MIN_CRITICAL_PRIORITY) */
+ typedef ACE_MLF_Scheduler_Strategy Scheduler_Strategy;
+
+#elif defined (TAO_USES_EDF_SCHEDULING)
+
+# if ! defined (TAO_MIN_CRITICAL_PRIORITY)
+# define TAO_MIN_CRITICAL_PRIORITY 0
+# endif /* ! defined (TAO_MIN_CRITICAL_PRIORITY) */
+ typedef ACE_EDF_Scheduler_Strategy Scheduler_Strategy;
+
+#elif defined (TAO_USES_RMS_SCHEDULING)
+# if ! defined (TAO_MIN_CRITICAL_PRIORITY)
+# define TAO_MIN_CRITICAL_PRIORITY 0
+# endif /* ! defined (TAO_MIN_CRITICAL_PRIORITY) */
+ typedef ACE_RMS_Scheduler_Strategy Scheduler_Strategy;
+
+#elif defined (TAO_USES_CRITICALITY_SCHEDULING)
+ typedef ACE_Criticality_Scheduler_Strategy Scheduler_Strategy;
+
+#else
+ #error scheduling strategy must be defined
+
+#endif /* defined (TAO_USES_MUF_SCHEDULING) */
+
+ Scheduler_Strategy scheduler_strategy_;
+
+#else /* ! defined (TAO_USES_STRATEGY_SCHEDULER) */
+
+ // trait for the scheduler implementation base class
+ typedef ACE_Scheduler BaseSchedImplType;
+
+#endif /* defined (TAO_USES_STRATEGY_SCHEDULER) */
+
+ // implementation base class pointer
+ BaseSchedImplType* impl;
+
+};
+
+TAO_END_VERSIONED_NAMESPACE_DECL
+
+#include /**/ "ace/post.h"
+
+#endif /* ACE_CONFIG_SCHEDULER_H */
diff --git a/TAO/orbsvcs/orbsvcs/Sched/DynSched.cpp b/TAO/orbsvcs/orbsvcs/Sched/DynSched.cpp
new file mode 100644
index 00000000000..69b1e25ddca
--- /dev/null
+++ b/TAO/orbsvcs/orbsvcs/Sched/DynSched.cpp
@@ -0,0 +1,2423 @@
+// $Id$
+//
+// ============================================================================
+//
+// = LIBRARY
+// sched
+//
+// = FILENAME
+// DynSched.cpp
+//
+// = CREATION DATE
+// 23 January 1997
+//
+// = AUTHOR
+// Chris Gill
+//
+// ============================================================================
+
+#include "orbsvcs/Sched/DynSched.h"
+#include "ace/Basic_Types.h"
+#include "ace/Sched_Params.h"
+#include "ace/OS_NS_stdio.h"
+#include "ace/Null_Mutex.h"
+
+#if ! defined (__ACE_INLINE__)
+#include "orbsvcs/Sched/DynSched.i"
+#endif /* __ACE_INLINE__ */
+
+ACE_RCSID(Sched, DynSched, "$Id$")
+
+TAO_BEGIN_VERSIONED_NAMESPACE_DECL
+
+//////////////////////
+// Helper functions //
+//////////////////////
+
+// compare the DFS finish times of two task entries, order higher time *first*
+#if defined (ACE_HAS_WINCE)
+int _cdecl compare_entry_finish_times (const void *first, const void *second)
+#else
+extern "C" int compare_entry_finish_times (const void *first, const void *second)
+#endif // ACE_HAS_WINCE
+{
+ // sort blank entries to the end
+ if (! first)
+ {
+ return (second) ? 1 : 0;
+ }
+ else if (! second)
+ {
+ return -1;
+ }
+
+ const Task_Entry *first_entry =
+ * static_cast<const Task_Entry *const *> (first);
+ const Task_Entry *second_entry =
+ * static_cast<const Task_Entry *const *> (second);
+
+ // sort blank entries to the end
+ if (! first_entry)
+ {
+ return (second_entry) ? 1 : 0;
+ }
+ else if (! second_entry)
+ {
+ return -1;
+ }
+
+ if (first_entry->finished () > second_entry->finished ())
+ {
+ return -1;
+ }
+ else if (first_entry->finished () < second_entry->finished ())
+ {
+ return 1;
+ }
+
+ return 0;
+}
+
+//////////////////////////////////////////
+// class ACE_DynScheduler member functions //
+//////////////////////////////////////////
+
+const char *
+ACE_DynScheduler::status_message (ACE_DynScheduler::status_t status)
+{
+ switch (status)
+ {
+ case NOT_SCHEDULED :
+ return "NOT_SCHEDULED";
+ case SUCCEEDED :
+ return "SUCCEEDED";
+ case ST_NO_TASKS_REGISTERED :
+ return "ST_NO_TASKS_REGISTERED";
+ case ST_TASK_ALREADY_REGISTERED :
+ return "TASK_ALREADY_REGISTERED";
+ case ST_BAD_INTERNAL_POINTER :
+ return "BAD_INTERNAL_POINTER";
+ case ST_VIRTUAL_MEMORY_EXHAUSTED :
+ return "VIRTUAL_MEMORY_EXHAUSTED";
+ case ST_UNKNOWN_TASK :
+ return "UNKNOWN_TASK";
+ case TASK_COUNT_MISMATCH :
+ return "TASK_COUNT_MISMATCH";
+ case THREAD_COUNT_MISMATCH :
+ return "THREAD_COUNT_MISMATCH";
+ case INVALID_PRIORITY :
+ return "INVALID_PRIORITY";
+ case TWO_WAY_DISJUNCTION :
+ return "TWO_WAY_DISJUNCTION (IGNORED)";
+ case TWO_WAY_CONJUNCTION :
+ return "TWO_WAY_CONJUNCTION (IGNORED)";
+ case UNRECOGNIZED_INFO_TYPE :
+ return "UNRECOGNIZED_INFO_TYPE (IGNORED)";
+
+ // The following are only used during scheduling (in the case of
+ // off-line scheduling, they are only used prior to runtime).
+ // To save a little code space (280 bytes on g++ 2.7.2/Solaris 2.5.1),
+ // we could conditionally compile them so that they're not in the
+ // runtime version.
+ case ST_UTILIZATION_BOUND_EXCEEDED :
+ return "UTILIZATION_BOUND_EXCEEDED";
+ case ST_INSUFFICIENT_THREAD_PRIORITY_LEVELS :
+ return "INSUFFICIENT_THREAD_PRIORITY_LEVELS";
+ case ST_CYCLE_IN_DEPENDENCIES :
+ return "CYCLE_IN_DEPENDENCIES";
+ case ST_UNRESOLVED_REMOTE_DEPENDENCIES :
+ return "ST_UNRESOLVED_REMOTE_DEPENDENCIES";
+ case ST_UNRESOLVED_LOCAL_DEPENDENCIES :
+ return "ST_UNRESOLVED_LOCAL_DEPENDENCIES";
+ case ST_INVALID_PRIORITY_ORDERING :
+ return "INVALID_PRIORITY_ORDERING";
+ case UNABLE_TO_OPEN_SCHEDULE_FILE :
+ return "UNABLE_TO_OPEN_SCHEDULE_FILE";
+ case UNABLE_TO_WRITE_SCHEDULE_FILE :
+ return "UNABLE_TO_WRITE_SCHEDULE_FILE";
+ // End of config-only status values.
+
+ default:
+ break;
+ }
+
+ return "UNKNOWN STATUS";
+}
+
+// = Utility function for creating an entry for determining
+// the severity of an anomaly detected during scheduling.
+ACE_DynScheduler::Anomaly_Severity
+ACE_DynScheduler::anomaly_severity (ACE_DynScheduler::status_t status)
+{
+ // Determine severity of the anomaly
+ switch (status)
+ {
+ // Fatal anomalies reflect unrecoverable internal scheduler errors
+ case ST_BAD_INTERNAL_POINTER :
+ case ST_VIRTUAL_MEMORY_EXHAUSTED :
+ case THREAD_COUNT_MISMATCH :
+ case TASK_COUNT_MISMATCH :
+ return RtecScheduler::ANOMALY_FATAL;
+
+ // Errors reflect severe problems with given scheduling information
+ case UNABLE_TO_OPEN_SCHEDULE_FILE :
+ case UNABLE_TO_WRITE_SCHEDULE_FILE :
+ case NOT_SCHEDULED :
+ case ST_UNRESOLVED_LOCAL_DEPENDENCIES :
+ case ST_UNKNOWN_TASK :
+ case ST_CYCLE_IN_DEPENDENCIES :
+ case ST_INVALID_PRIORITY_ORDERING :
+ return RtecScheduler::ANOMALY_ERROR;
+
+ // Warnings reflect serious problems with given scheduling information
+ case ST_TASK_ALREADY_REGISTERED :
+ case ST_UNRESOLVED_REMOTE_DEPENDENCIES :
+ case ST_UTILIZATION_BOUND_EXCEEDED :
+ case ST_INSUFFICIENT_THREAD_PRIORITY_LEVELS :
+ case TWO_WAY_DISJUNCTION :
+ case TWO_WAY_CONJUNCTION :
+ case UNRECOGNIZED_INFO_TYPE :
+ case ST_NO_TASKS_REGISTERED :
+ return RtecScheduler::ANOMALY_WARNING;
+
+ // Produce a lowest severity anomaly for any unknown status value
+ default:
+ return RtecScheduler::ANOMALY_NONE;
+ }
+}
+
+
+// = Utility function for creating an entry for the
+// log of anomalies detected during scheduling.
+ACE_DynScheduler::Scheduling_Anomaly *
+ACE_DynScheduler::create_anomaly (ACE_DynScheduler::status_t status)
+{
+ ACE_DynScheduler::Scheduling_Anomaly * anomaly;
+ ACE_NEW_RETURN (anomaly, ACE_DynScheduler::Scheduling_Anomaly, 0);
+
+ anomaly->severity = anomaly_severity (status);
+ anomaly->description = status_message (status);
+
+ return anomaly;
+}
+
+
+ACE_DynScheduler::ACE_DynScheduler ()
+ // Set the minimum and maximum priority to those for the current platform.
+ // This shouldn't be necessary, but UPSingleProcessorOrb::initialize_reactors
+ // creates threads before the Event Channel calls Scheduler::init ().
+ : minimum_priority_ (ACE_Sched_Params::priority_min (ACE_SCHED_FIFO,
+ ACE_SCOPE_PROCESS))
+ , maximum_priority_ (ACE_Sched_Params::priority_max (ACE_SCHED_FIFO,
+ ACE_SCOPE_PROCESS))
+ , task_entries_ (0)
+ , ordered_task_entries_ (0)
+ , thread_delineators_ (0)
+ , ordered_thread_dispatch_entries_ (0)
+ , dispatch_entries_ (0)
+ , config_info_entries_ (0)
+ , expanded_dispatches_ (0)
+ , ordered_dispatch_entries_ (0)
+ , dispatch_entry_count_ (0)
+ , threads_ (0)
+ , timeline_ (0)
+ , lock_ ()
+ , rt_info_entries_ ()
+ , handles_ (0)
+ , runtime_filename_ (0)
+ , rt_info_filename_ (0)
+ , timeline_filename_ (0)
+ , tasks_ (0)
+ , status_ (NOT_SCHEDULED)
+ , output_level_ (0)
+ , frame_size_ (1)
+ , critical_set_frame_size_ (0)
+ , utilization_ (0.0)
+ , critical_set_utilization_ (0.0)
+ , minimum_priority_queue_ (0)
+ , minimum_guaranteed_priority_queue_ (-1)
+ , up_to_date_ (0)
+ , min_dispatch_id_ (0)
+ , max_dispatch_id_ (0)
+{
+}
+
+
+ACE_DynScheduler::~ACE_DynScheduler ()
+{
+ // release all resources used for the most recent schedule
+ reset ();
+}
+
+
+void
+ACE_DynScheduler::init (const OS_Priority minimum_priority,
+ const OS_Priority maximum_priority,
+ const char *runtime_filename,
+ const char *rt_info_filename,
+ const char *timeline_filename)
+{
+ minimum_priority_ = minimum_priority;
+ maximum_priority_ = maximum_priority;
+ runtime_filename_ = runtime_filename;
+ rt_info_filename_ = rt_info_filename;
+ timeline_filename_ = timeline_filename;
+}
+ // = initializes the scheduler.
+
+ACE_DynScheduler::status_t
+ACE_DynScheduler::register_task (RT_Info *rt_info, handle_t &handle)
+{
+ ACE_DynScheduler::status_t ret = ST_UNKNOWN_TASK;
+
+ // check the pointer we were passed
+ if (! rt_info)
+ {
+ handle = 0;
+ return ret;
+ }
+
+ // try to store the new task's information . . .
+ switch (rt_info_entries_.insert (rt_info))
+ {
+ case 0 : // successfully inserted
+ {
+ rt_info->handle = (handle = ++handles_);
+ ret = SUCCEEDED;
+
+ // zero out the task entry ACT used by the scheduler
+ rt_info->volatile_token = 0;
+
+ // make sure the schedule is reset when a new task is registered
+ reset ();
+
+ if (output_level () >= 5)
+ {
+ ACE_OS::printf ("registered task \"%s\" with RT_Info at %p\n",
+ (const char*)(rt_info->entry_point), rt_info);
+ }
+ }
+ break;
+
+ case 1 : // the entry had already been inserted
+ handle = 0;
+ ret = ST_TASK_ALREADY_REGISTERED;
+ break;
+
+ default :
+ // case -1 : insert failed, probably because virtual memory exhaused
+ handle = 0;
+ ret = ST_VIRTUAL_MEMORY_EXHAUSTED;
+ break;
+ }
+
+ return ret;
+}
+ // = registers a task.
+
+
+
+ACE_DynScheduler::status_t
+ACE_DynScheduler::get_rt_info (Object_Name name,
+ RT_Info* &rtinfo)
+{
+ handle_t handle;
+
+ // This makes a copy. We can optimize this with our own string
+ // class.
+ ACE_CString lookup (name);
+ // Search the map for the <name>. If found, return the RT_Info.
+ if (info_collection_.find (lookup, rtinfo) >= 0)
+ {
+ // If we find it, return.
+ return SUCCEEDED;
+ }
+ else
+ // Otherwise, make one, bind it, and register it.
+ {
+ rtinfo = new RT_Info;
+ rtinfo->info_type = RtecScheduler::OPERATION;
+ rtinfo->entry_point = CORBA::string_dup(name);
+ // Bind the rtinfo to the name.
+ if (info_collection_.bind (lookup, rtinfo) != 0)
+ {
+ delete rtinfo;
+ rtinfo = 0;
+ return FAILED; // Error!
+ }
+ else
+ {
+ // Register the task
+ status_t result = this->register_task (rtinfo, handle);
+ if (result == SUCCEEDED)
+ {
+ rtinfo->handle = handle;
+ return ST_UNKNOWN_TASK; // Didn't find it, but made one!
+ }
+ else
+ {
+ rtinfo->handle = 0;
+ return FAILED;
+ }
+ }
+ }
+}
+
+
+
+
+int ACE_DynScheduler::priority (
+ const RtecScheduler::handle_t handle,
+ RtecScheduler::OS_Priority &priority,
+ RtecScheduler::Preemption_Subpriority_t &subpriority,
+ RtecScheduler::Preemption_Priority_t &preemption_prio)
+{
+ // look up the RT_Info that has the given handle
+ RT_Info *rt_info = 0;
+ if (lookup_rt_info (handle, rt_info) == SUCCEEDED)
+ {
+ // copy the priority values from the RT_Info
+ priority = rt_info->priority;
+ subpriority = rt_info->preemption_subpriority;
+ preemption_prio = rt_info->preemption_priority;
+
+ return 0;
+ }
+ else
+
+ {
+ // RT_Info not found: assign default priority values
+ priority = minimum_priority_;
+ subpriority = ACE_Scheduler_MIN_SUB_PRIORITY;
+ preemption_prio = ACE_Scheduler_MAX_PREEMPTION_PRIORITY;
+
+ if (output_level () >= 3)
+ {
+ ACE_OS::printf ("preemption_prio %d: min %d, pri %d, min_pri %d\n",
+ preemption_prio, minimum_priority_queue (),
+ priority, minimum_priority_);
+ }
+
+ return -1;
+ }
+}
+ // "priority" is the OS thread priority that was assigned to the Task that
+ // was assigned "handle". "subpriority" combines the dynamic and static
+ // subpriorities of the Task that was assigned handle. "preemption_prio"
+ // is a platform-independent priority queue number, ranging from a
+ // highest priority value of 0 to the lowest priority value, which is
+ // returned by "minimum_priority_queue ()". The current and deadline times
+ // supplied are used to compute the operation's dynamic subpriority
+ // Returns 0 on success, or -1 if an invalid handle was supplied.
+
+
+int ACE_DynScheduler::number_of_dependencies(RT_Info* rt_info)
+{
+ return rt_info->dependencies.length();
+}
+
+int ACE_DynScheduler::number_of_dependencies(RT_Info& rt_info)
+{
+ return rt_info.dependencies.length();
+}
+
+int ACE_DynScheduler::add_dependency(RT_Info* rt_info,
+ Dependency_Info& d)
+{
+ RT_Info *temp_info = 0; // temporary pointer to the caller's RT_Info
+
+ switch (d.dependency_type)
+ {
+ case RtecBase::TWO_WAY_CALL:
+
+ temp_info = rt_info;
+ break;
+
+ case RtecBase::ONE_WAY_CALL:
+
+ // swap the handles and point to the caller instead of the called operation
+ if (lookup_rt_info (d.rt_info, temp_info) != SUCCEEDED)
+ {
+ ACE_ERROR ((LM_ERROR,
+ ACE_TEXT("cannot find %d to add dependency\n"), d.rt_info));
+ return -1;
+ }
+
+ d.rt_info = rt_info->handle;
+ break;
+
+ default:
+
+ ACE_ERROR ((LM_ERROR,
+ ACE_TEXT("unrecognized dependency type %d for %s\n"),
+ d.dependency_type, ACE_TEXT_CHAR_TO_TCHAR(rt_info->entry_point.in ())));
+ return -1;
+ }
+
+ ACE_DEBUG ((LM_DEBUG,
+ ACE_TEXT("Sched (%t) adding %s dependency to caller: %s\n"),
+ (const ACE_TCHAR *) ((d.dependency_type == RtecBase::TWO_WAY_CALL)
+ ? ACE_TEXT("TWO_WAY") : ACE_TEXT("ONE_WAY")),
+ ACE_TEXT_CHAR_TO_TCHAR(temp_info->entry_point.in ())));
+
+ RtecScheduler::Dependency_Set& set = temp_info->dependencies;
+ int l = set.length();
+ set.length(l + 1);
+ set[l] = d;
+ return 0;
+}
+
+void ACE_DynScheduler::export_to_file (RT_Info* info, FILE* file)
+{
+ ACE_DynScheduler::export_to_file (*info, file);
+}
+
+void ACE_DynScheduler::export_to_file (RT_Info& info, FILE* file)
+{
+ (void) ACE_OS::fprintf (file,
+ "%s\n%d\n%d\n%d\n%d\n%d\n%d\n%d\n%d\n%u\n"
+ "# begin calls\n%d\n",
+ info.entry_point.in (),
+ info.handle,
+ ACE_U64_TO_U32 (info.worst_case_execution_time),
+ ACE_U64_TO_U32 (info.typical_execution_time),
+ ACE_U64_TO_U32 (info.cached_execution_time),
+ int(info.period),
+ info.criticality,
+ info.importance,
+ ACE_U64_TO_U32 (info.quantum),
+ info.threads,
+ number_of_dependencies(info));
+
+ for (int i = 0; i < number_of_dependencies(info); ++i)
+ {
+ RT_Info tmp;
+ (void) ACE_OS::fprintf (file, "%s, %d\n",
+ (const char*)tmp.entry_point,
+ info.dependencies[i].number_of_calls);
+
+ }
+
+ (void) ACE_OS::fprintf (file, "# end calls\n%d\n%d\n\n",
+ info.priority,
+ info.preemption_subpriority);
+
+
+}
+
+
+int
+ACE_DynScheduler::dispatch_configuration (const Preemption_Priority & p_priority,
+ OS_Priority & priority,
+ Dispatching_Type & d_type)
+{
+ // look up the stored configuration info for the given priority level
+ Config_Info *config_info;
+ if (lookup_config_info (p_priority, config_info) != SUCCEEDED)
+ {
+ ACE_ERROR_RETURN ((LM_ERROR,
+ ACE_TEXT("Config info for priority %lu could not be found\n"),
+ p_priority),
+ -1);
+ }
+
+ priority = config_info->thread_priority;
+ d_type = config_info->dispatching_type;
+
+ return 0;
+}
+ // provide the thread priority and queue type for the given priority level
+
+
+ACE_DynScheduler::status_t
+ACE_DynScheduler::lookup_rt_info (handle_t handle,
+ RT_Info*& rtinfo)
+{
+ if (handle < 0 || (size_t) handle > rt_info_entries_.size ())
+ {
+ return ST_UNKNOWN_TASK;
+ }
+
+ RT_Info** entry;
+ ACE_Unbounded_Set_Iterator <RT_Info *> i (rt_info_entries_);
+ while (i.next (entry) != 0)
+ {
+ i.advance ();
+ RT_Info* info_ptr = *entry;
+ if (info_ptr->handle == handle)
+ {
+ rtinfo = info_ptr;
+ return SUCCEEDED;
+ }
+ }
+
+ return ST_UNKNOWN_TASK;
+}
+ // obtains an RT_Info based on its "handle".
+
+ACE_DynScheduler::status_t
+ACE_DynScheduler::lookup_config_info (Preemption_Priority priority,
+ Config_Info* &config_info)
+{
+ if (config_info_entries_ == 0)
+ {
+ return NOT_SCHEDULED;
+ }
+
+ if (priority < 0 || (size_t) priority > config_info_entries_->size ())
+ {
+ return ST_UNKNOWN_PRIORITY;
+ }
+
+ Config_Info** entry;
+ ACE_Unbounded_Set_Iterator <Config_Info *> i (*config_info_entries_);
+ while (i.next (entry) != 0)
+ {
+ i.advance ();
+ Config_Info* config_ptr = *entry;
+ if (config_ptr->preemption_priority == priority)
+ {
+ config_info = config_ptr;
+ return SUCCEEDED;
+ }
+ }
+
+ return ST_UNKNOWN_PRIORITY;
+}
+ // Obtains a Config_Info based on its priority.
+
+
+void
+ACE_DynScheduler::reset ()
+{
+ // if the schedule is up to date, free resources
+ // and mark schedule as not being up to date
+ if (up_to_date_)
+ {
+ delete [] task_entries_;
+ task_entries_ = 0;
+
+ delete [] ordered_task_entries_;
+ ordered_task_entries_ = 0;
+
+ delete thread_delineators_;
+ thread_delineators_ = 0;
+
+ delete [] ordered_thread_dispatch_entries_;
+ ordered_thread_dispatch_entries_ = 0;
+
+ if (dispatch_entries_)
+ {
+ // free all the dispatch entries in the list, then the list itself
+ ACE_Unbounded_Set_Iterator <Dispatch_Entry *> iter (*dispatch_entries_);
+ Dispatch_Entry **entry = 0;
+ for (iter.first (); ! iter.done (); iter.advance (), entry = 0)
+ {
+ if ((iter.next (entry) != 0) && (entry) && (*entry))
+ {
+ delete (*entry);
+ }
+ }
+ delete dispatch_entries_;
+ dispatch_entries_ = 0;
+ }
+
+ if (config_info_entries_)
+ {
+ // free all the config info entries in the list, then the list itself
+ ACE_Unbounded_Set_Iterator <Config_Info *> iter (*config_info_entries_);
+ Config_Info **entry = 0;
+ for (iter.first (); ! iter.done (); iter.advance (), entry = 0)
+ {
+ if ((iter.next (entry) != 0) && (entry) && (*entry))
+ {
+ delete (*entry);
+ }
+ }
+ delete config_info_entries_;
+ config_info_entries_ = 0;
+ }
+
+
+ if (expanded_dispatches_)
+ {
+ // free all the dispatch entries in the list, then the list itself
+ ACE_Unbounded_Set_Iterator <Dispatch_Entry *> expanded_iter (*expanded_dispatches_);
+ Dispatch_Entry **expanded_entry = 0;
+ for (expanded_iter.first (); ! expanded_iter.done ();
+ expanded_iter.advance (), expanded_entry = 0)
+ {
+ if ((expanded_iter.next (expanded_entry) != 0) &&
+ (expanded_entry) && (*expanded_entry))
+ {
+ delete (*expanded_entry);
+ }
+ }
+ delete expanded_dispatches_;
+ expanded_dispatches_ = 0;
+ }
+
+ delete [] ordered_dispatch_entries_;
+ ordered_dispatch_entries_ = 0;
+
+ dispatch_entry_count_ = 0;
+ threads_ = 0;
+
+ status_ = NOT_SCHEDULED;
+
+ frame_size_ = 1;
+ critical_set_frame_size_ = 0;
+ utilization_ = 0.0;
+ critical_set_utilization_ = 0.0;
+ minimum_priority_queue_ = 0;
+ minimum_guaranteed_priority_queue_ = -1;
+
+ if (timeline_)
+ {
+ // iterate over and delete the set of timeline entries
+ ACE_Ordered_MultiSet_Iterator <TimeLine_Entry_Link> t_iter (*timeline_);
+ TimeLine_Entry_Link *t_entry = 0;
+ for (t_iter.first (); ! t_iter.done (); t_iter.advance (), t_entry = 0)
+ {
+ if ((t_iter.next (t_entry) != 0) && (t_entry))
+ {
+ delete &(t_entry->entry ());
+ }
+ }
+ delete timeline_;
+ timeline_ = 0;
+ }
+
+ up_to_date_ = 0;
+ }
+}
+
+ACE_DynScheduler::status_t
+ACE_DynScheduler::schedule (
+ ACE_Unbounded_Set<RtecScheduler::Scheduling_Anomaly *> &anomaly_set)
+{
+ ACE_GUARD_RETURN (LOCK, ace_mon, lock_, ACE_DynScheduler::FAILED);
+
+ RtecScheduler::Anomaly_Severity severity = RtecScheduler::ANOMALY_NONE;
+ RtecScheduler::Anomaly_Severity temp_severity = RtecScheduler::ANOMALY_NONE;
+ status_t temp_status = SUCCEEDED;
+ Scheduling_Anomaly *anomaly = 0;
+ ACE_CString unresolved_locals (""), unresolved_remotes ("");
+
+ if (up_to_date_)
+ {
+ // do nothing if the RT_Infos have not changed
+ // since the last valid schedule was generated
+ return SUCCEEDED;
+ }
+ else
+ {
+ // save the total number of registered RT_Infos
+ tasks (static_cast<u_int> (rt_info_entries_.size ()));
+ }
+
+ // set up the task entry data structures
+ status_ = setup_task_entries ();
+ if (status_ != SUCCEEDED)
+ {
+ // Create an anomaly, add it to anomaly set
+ anomaly = create_anomaly (status_);
+ if (anomaly)
+ {
+ anomaly_set.insert (anomaly);
+ }
+ else
+ {
+ return ST_VIRTUAL_MEMORY_EXHAUSTED;
+ }
+
+ switch (anomaly->severity)
+ {
+ case RtecScheduler::ANOMALY_FATAL :
+ return status_;
+
+ default:
+ severity = anomaly->severity;
+ break;
+ }
+ }
+
+ // check for cycles in the dependency graph: as a side effect, leaves
+ // the ordered_task_entries_ pointer array sorted in topological order,
+ // which is used by propagate_dispatches () to ensure that dispatches
+ // are propagated top down in the call graph.
+ temp_status = check_dependency_cycles ();
+ if (temp_status != SUCCEEDED)
+ {
+ // Create an anomaly, add it to anomaly set
+ anomaly = create_anomaly (temp_status);
+ if (anomaly)
+ {
+ anomaly_set.insert (anomaly);
+ }
+ else
+ {
+ return ST_VIRTUAL_MEMORY_EXHAUSTED;
+ }
+
+ switch (anomaly->severity)
+ {
+ case RtecScheduler::ANOMALY_FATAL :
+ status_ = temp_status;
+ return status_;
+
+ case RtecScheduler::ANOMALY_ERROR :
+ severity = anomaly->severity;
+ status_ = temp_status;
+ break;
+
+ case RtecScheduler::ANOMALY_WARNING :
+ if (severity == RtecScheduler::ANOMALY_NONE)
+ {
+ severity = anomaly->severity;
+ status_ = temp_status;
+ }
+ break;
+
+ default:
+ break;
+ }
+ }
+
+ // task entries are related, now threads can be found
+ temp_status = identify_threads (unresolved_locals,
+ unresolved_remotes);
+ if (temp_status != SUCCEEDED)
+ {
+ temp_severity = anomaly_severity (temp_status);
+ switch (temp_severity)
+ {
+ case RtecScheduler::ANOMALY_FATAL :
+ status_ = temp_status;
+ return status_;
+
+ case RtecScheduler::ANOMALY_ERROR :
+ severity = temp_severity;
+ status_ = temp_status;
+ break;
+
+ case RtecScheduler::ANOMALY_WARNING :
+ if (severity == RtecScheduler::ANOMALY_NONE)
+ {
+ severity = temp_severity;
+ status_ = temp_status;
+ }
+ break;
+
+ default:
+ break;
+ }
+ }
+
+ // invoke the internal thread scheduling method of the strategy
+ temp_status = schedule_threads (anomaly_set);
+ if (temp_status != SUCCEEDED)
+ {
+ temp_severity = anomaly_severity (temp_status);
+ switch (temp_severity)
+ {
+ case RtecScheduler::ANOMALY_FATAL :
+ status_ = temp_status;
+ return status_;
+
+ case RtecScheduler::ANOMALY_ERROR :
+ severity = temp_severity;
+ status_ = temp_status;
+ break;
+
+ case RtecScheduler::ANOMALY_WARNING :
+ if (severity == RtecScheduler::ANOMALY_NONE)
+ {
+ severity = temp_severity;
+ status_ = temp_status;
+ }
+ break;
+
+ default:
+ break;
+ }
+ }
+
+ // propagate the dispatch information from the
+ // threads throughout the call graph
+ temp_status = propagate_dispatches (anomaly_set,
+ unresolved_locals,
+ unresolved_remotes);
+ if (temp_status != SUCCEEDED)
+ {
+ temp_severity = anomaly_severity (temp_status);
+ switch (temp_severity)
+ {
+ case RtecScheduler::ANOMALY_FATAL :
+ status_ = temp_status;
+ return status_;
+
+ case RtecScheduler::ANOMALY_ERROR :
+ severity = temp_severity;
+ status_ = temp_status;
+ break;
+
+ case RtecScheduler::ANOMALY_WARNING :
+ if (severity == RtecScheduler::ANOMALY_NONE)
+ {
+ severity = temp_severity;
+ status_ = temp_status;
+ }
+ break;
+
+ default:
+ break;
+ }
+ }
+
+ // log anomalies for unresolved local dependencies
+ if (unresolved_locals.length () > 0)
+ {
+ // Create an anomaly, add it to anomaly set
+ anomaly = create_anomaly (ST_UNRESOLVED_LOCAL_DEPENDENCIES);
+ if (anomaly)
+ {
+ anomaly_set.insert (anomaly);
+ }
+ else
+ {
+ return ST_VIRTUAL_MEMORY_EXHAUSTED;
+ }
+
+ ACE_NEW_RETURN (anomaly, ACE_DynScheduler::Scheduling_Anomaly,
+ ST_VIRTUAL_MEMORY_EXHAUSTED);
+
+ ACE_CString temp_str ("The following entry points have "
+ "unresolved local dependencies:\n");
+ temp_str += unresolved_locals;
+
+ anomaly->severity =
+ anomaly_severity (ST_UNRESOLVED_LOCAL_DEPENDENCIES);
+ anomaly->description = temp_str.c_str ();
+ anomaly_set.insert (anomaly);
+ }
+
+ // log anomalies for unresolved remote dependencies
+ if (unresolved_remotes.length () > 0)
+ {
+ // Create an anomaly, add it to anomaly set
+ anomaly = create_anomaly (ST_UNRESOLVED_REMOTE_DEPENDENCIES);
+ if (anomaly)
+ {
+ anomaly_set.insert (anomaly);
+ }
+ else
+ {
+ return ST_VIRTUAL_MEMORY_EXHAUSTED;
+ }
+
+ ACE_NEW_RETURN (anomaly, ACE_DynScheduler::Scheduling_Anomaly,
+ ST_VIRTUAL_MEMORY_EXHAUSTED);
+
+ ACE_CString temp_str ("The following entry points have "
+ "unresolved remote dependencies:\n");
+ temp_str += unresolved_remotes;
+
+ anomaly->severity =
+ anomaly_severity (ST_UNRESOLVED_REMOTE_DEPENDENCIES);
+ anomaly->description = temp_str.c_str ();
+ anomaly_set.insert (anomaly);
+ }
+
+ // invoke the internal dispatch scheduling method of the strategy
+ temp_status = schedule_dispatches (anomaly_set);
+ if (temp_status != SUCCEEDED)
+ {
+ temp_severity = anomaly_severity (temp_status);
+ switch (temp_severity)
+ {
+ case RtecScheduler::ANOMALY_FATAL :
+ status_ = temp_status;
+ return status_;
+
+ case RtecScheduler::ANOMALY_ERROR :
+ severity = temp_severity;
+ status_ = temp_status;
+ break;
+
+ case RtecScheduler::ANOMALY_WARNING :
+ if (severity == RtecScheduler::ANOMALY_NONE)
+ {
+ severity = temp_severity;
+ status_ = temp_status;
+ }
+ break;
+
+ default:
+ break;
+ }
+ }
+
+ // calculate utilization, total frame size, critical set
+ temp_status = calculate_utilization_params ();
+ if (temp_status != SUCCEEDED)
+ {
+ // Create an anomaly, add it to anomaly set
+ anomaly = create_anomaly (temp_status);
+ if (anomaly)
+ {
+ anomaly_set.insert (anomaly);
+ }
+ else
+ {
+ return ST_VIRTUAL_MEMORY_EXHAUSTED;
+ }
+
+ switch (anomaly->severity)
+ {
+ case RtecScheduler::ANOMALY_FATAL :
+ status_ = temp_status;
+ return status_;
+
+ case RtecScheduler::ANOMALY_ERROR :
+ severity = anomaly->severity;
+ status_ = temp_status;
+ break;
+
+ case RtecScheduler::ANOMALY_WARNING :
+ if (severity == RtecScheduler::ANOMALY_NONE)
+ {
+ severity = anomaly->severity;
+ status_ = temp_status;
+ }
+ break;
+
+ default:
+ break;
+ }
+ }
+
+ // calculate utilization, total frame size, critical set
+ temp_status = store_assigned_info ();
+ if (temp_status != SUCCEEDED)
+ {
+ // Create an anomaly, add it to anomaly set
+ anomaly = create_anomaly (temp_status);
+ if (anomaly)
+ {
+ anomaly_set.insert (anomaly);
+ }
+ else
+ {
+ return ST_VIRTUAL_MEMORY_EXHAUSTED;
+ }
+
+ switch (anomaly->severity)
+ {
+ case RtecScheduler::ANOMALY_FATAL :
+ status_ = temp_status;
+ return status_;
+
+ case RtecScheduler::ANOMALY_ERROR :
+ severity = anomaly->severity;
+ status_ = temp_status;
+ break;
+
+ case RtecScheduler::ANOMALY_WARNING :
+ if (severity == RtecScheduler::ANOMALY_NONE)
+ {
+ severity = anomaly->severity;
+ status_ = temp_status;
+ }
+ break;
+
+ default:
+ break;
+ }
+ }
+
+ // generate, store the timeline to a file if file was given
+ if (timeline_filename_ != 0)
+ {
+ // generate the scheduling timeline over the total frame size
+ temp_status = create_timeline ();
+ if (temp_status != SUCCEEDED)
+ {
+ // Create an anomaly, add it to anomaly set
+ anomaly = create_anomaly (temp_status);
+ if (anomaly)
+ {
+ anomaly_set.insert (anomaly);
+ }
+ else
+ {
+ return ST_VIRTUAL_MEMORY_EXHAUSTED;
+ }
+
+ switch (anomaly->severity)
+ {
+ case RtecScheduler::ANOMALY_FATAL :
+ status_ = temp_status;
+ return status_;
+
+ case RtecScheduler::ANOMALY_ERROR :
+ severity = anomaly->severity;
+ status_ = temp_status;
+ break;
+
+ case RtecScheduler::ANOMALY_WARNING :
+ if (severity == RtecScheduler::ANOMALY_NONE)
+ {
+ severity = anomaly->severity;
+ status_ = temp_status;
+ }
+ break;
+
+ default:
+ break;
+ }
+ }
+
+
+ temp_status = output_timeline (timeline_filename_, 0);
+ if (temp_status != SUCCEEDED)
+ {
+ // Create an anomaly, add it to anomaly set
+ anomaly = create_anomaly (temp_status);
+ if (anomaly)
+ {
+ anomaly_set.insert (anomaly);
+ }
+ else
+ {
+ return ST_VIRTUAL_MEMORY_EXHAUSTED;
+ }
+
+ switch (anomaly->severity)
+ {
+ case RtecScheduler::ANOMALY_FATAL :
+ status_ = temp_status;
+ return status_;
+
+ case RtecScheduler::ANOMALY_ERROR :
+ severity = anomaly->severity;
+ status_ = temp_status;
+ break;
+
+ case RtecScheduler::ANOMALY_WARNING :
+ if (severity == RtecScheduler::ANOMALY_NONE)
+ {
+ severity = anomaly->severity;
+ status_ = temp_status;
+ }
+ break;
+
+ default:
+ break;
+ }
+ }
+ }
+
+ // if a valid schedule was generated, mark it as up to date
+ switch (status_)
+ {
+ // These are statuses that indicate a reasonable schedule was generated.
+ case SUCCEEDED:
+ case ST_TASK_ALREADY_REGISTERED :
+ case ST_UNRESOLVED_REMOTE_DEPENDENCIES :
+ case ST_UTILIZATION_BOUND_EXCEEDED :
+ case ST_INSUFFICIENT_THREAD_PRIORITY_LEVELS :
+
+ // if we made it here, the schedule is done
+ up_to_date_ = 1;
+
+ break;
+
+ default:
+ break;
+ }
+
+
+ return status_;
+}
+
+ACE_DynScheduler::status_t
+ACE_DynScheduler::propagate_dispatches (
+ ACE_Unbounded_Set<RtecScheduler::Scheduling_Anomaly *> &anomaly_set,
+ ACE_CString & unresolved_locals,
+ ACE_CString & unresolved_remotes)
+{
+ u_long i;
+ frame_size_ = 1;
+ status_t status = SUCCEEDED;
+ Scheduling_Anomaly * anomaly = 0;
+
+ // iterate through the ordered_task_entries_ array in order
+ // from highest DFS finishing time to lowest, so that every
+ // calling dispatch is accessed before those it calls:
+ // the dispatches propagate top down through the call DAG
+ for (i = 0; i < tasks (); ++i)
+ {
+ switch (ordered_task_entries_ [i]->merge_dispatches (*dispatch_entries_,
+ unresolved_locals,
+ unresolved_remotes))
+ {
+ case Task_Entry::INTERNAL_ERROR :
+ // Create an anomaly, add it to anomaly set
+ anomaly = create_anomaly (ST_BAD_INTERNAL_POINTER);
+ if (anomaly)
+ {
+ anomaly_set.insert (anomaly);
+ }
+ else
+ {
+ return ST_VIRTUAL_MEMORY_EXHAUSTED;
+ }
+
+ return ST_BAD_INTERNAL_POINTER;
+
+ case Task_Entry::TWO_WAY_DISJUNCTION :
+ if (status == SUCCEEDED)
+ {
+ status = TWO_WAY_DISJUNCTION;
+ }
+ anomaly = create_anomaly (TWO_WAY_DISJUNCTION);
+ if (anomaly)
+ {
+ anomaly_set.insert (anomaly);
+ }
+ else
+ {
+ return ST_VIRTUAL_MEMORY_EXHAUSTED;
+ }
+ break;
+
+ case Task_Entry::TWO_WAY_CONJUNCTION :
+ if (status == SUCCEEDED)
+ {
+ status = TWO_WAY_CONJUNCTION;
+ }
+ anomaly = create_anomaly (TWO_WAY_CONJUNCTION);
+ if (anomaly)
+ {
+ anomaly_set.insert (anomaly);
+ }
+ else
+ {
+ return ST_VIRTUAL_MEMORY_EXHAUSTED;
+ }
+ break;
+
+ case Task_Entry::UNRECOGNIZED_INFO_TYPE :
+ if (status == SUCCEEDED)
+ {
+ status = UNRECOGNIZED_INFO_TYPE;
+ }
+ anomaly = create_anomaly (UNRECOGNIZED_INFO_TYPE);
+ if (anomaly)
+ {
+ anomaly_set.insert (anomaly);
+ }
+ else
+ {
+ return ST_VIRTUAL_MEMORY_EXHAUSTED;
+ }
+ break;
+
+ case Task_Entry::SUCCEEDED :
+ default:
+ break;
+ }
+
+ if (ordered_task_entries_ [i]->effective_period () > 0)
+ {
+ frame_size_ =
+ ACE::minimum_frame_size (frame_size_,
+ ordered_task_entries_ [i]->
+ effective_period ());
+ }
+ }
+
+ return status;
+}
+// propagate the dispatch information from the
+// threads throughout the call graph
+
+
+ACE_DynScheduler::status_t
+ACE_DynScheduler::calculate_utilization_params (void)
+{
+ critical_set_frame_size_ = 0;
+ utilization_ = 0.0;
+ critical_set_utilization_ = 0.0;
+
+ minimum_priority_queue_ =
+ ordered_dispatch_entries_ [0]->priority ();
+
+ minimum_guaranteed_priority_queue_ = -1;
+
+ // iterate through ordered task entries, calculating frame size, utilization
+ for (u_int i = 0; i < dispatch_entry_count_; ++i)
+ {
+ // if we've just finished examining another priority level
+ if (minimum_priority_queue_ != ordered_dispatch_entries_ [i]->priority ())
+ {
+ // update parameters for the previous priority level
+ update_priority_level_params ();
+
+ // update the minimum priority queue
+ minimum_priority_queue_ = ordered_dispatch_entries_ [i]->priority ();
+ }
+
+ // Only consider computation times of dispatches of
+ // OPERATION and REMOTE_DEPENDANT descriptors.
+ if (((ordered_dispatch_entries_ [i]->task_entry ().info_type () ==
+ RtecScheduler::OPERATION) ||
+ (ordered_dispatch_entries_ [i]->task_entry ().info_type () ==
+ RtecScheduler::REMOTE_DEPENDANT)) &&
+ (ordered_dispatch_entries_ [i]->task_entry ().effective_period () > 0))
+ {
+ utilization_ +=
+ static_cast<double> (ACE_UINT64_DBLCAST_ADAPTER (ordered_dispatch_entries_ [i]->
+ task_entry ().rt_info ()->worst_case_execution_time)) /
+ static_cast<double> (ordered_dispatch_entries_ [i]->
+ task_entry ().effective_period ());
+ }
+ }
+
+ // update parameters for the lowest priority level
+ update_priority_level_params ();
+
+ // if the critical set is schedulable, return success
+ return (1.0 - critical_set_utilization_ > DBL_EPSILON)
+ ? SUCCEEDED : ST_UTILIZATION_BOUND_EXCEEDED;
+}
+
+
+
+void
+ACE_DynScheduler::update_priority_level_params ()
+{
+ // if we've just finished examining a critical priority level
+ if (minimum_priority_queue_ <= minimum_critical_priority ())
+ {
+ // update the information about the critical set
+ critical_set_frame_size_ = frame_size_;
+ critical_set_utilization_ = utilization_;
+ }
+
+ // if the lowest priority level considered is schedulable
+ if (1.0 - utilization_ > DBL_EPSILON)
+ {
+ // the minimum guaranteed priority queue is the minimum considered so far
+ minimum_guaranteed_priority_queue_ = minimum_priority_queue_;
+ }
+}
+
+ACE_DynScheduler::status_t
+ACE_DynScheduler::setup_task_entries (void)
+{
+ // store number of tasks, based on registrations
+ tasks (static_cast<u_int> (rt_info_entries_.size ()));
+
+ // bail out if there are no tasks registered
+ if (tasks () <= 0)
+ {
+ return ST_NO_TASKS_REGISTERED;
+ }
+
+ // clear the decks of any previous scheduling information
+ reset ();
+
+ // allocate new table of task entries (wrappers for rt_infos)
+ size_t task_count = tasks ();
+ ACE_NEW_RETURN (task_entries_, Task_Entry [task_count],
+ ST_VIRTUAL_MEMORY_EXHAUSTED);
+
+ // allocate new table of pointers to task entries (for sorting)
+ ACE_NEW_RETURN (ordered_task_entries_, Task_Entry *[task_count],
+ ST_VIRTUAL_MEMORY_EXHAUSTED);
+ // @@ TODO: this is completely bogus code, the bit-wise
+ // representation of a null pointer is not always a string of
+ // zeroes. The correct way to intialize this array is with a for
+ // loop.
+ // ACE_OS::memset (ordered_task_entries_, 0,
+ // sizeof (Task_Entry *) * task_count);
+ for (size_t j = 0; j != task_count; ++j)
+ ordered_task_entries_[j] = 0;
+
+ // allocate new unbounded set for pointers to
+ // task entries that delineate threads
+ ACE_NEW_RETURN (thread_delineators_, ACE_Unbounded_Set <Dispatch_Entry *>,
+ ST_VIRTUAL_MEMORY_EXHAUSTED);
+
+ // allocate new unbounded set for pointers to dispatch entries
+ ACE_NEW_RETURN (dispatch_entries_,
+ ACE_Unbounded_Set <Dispatch_Entry *>,
+ ST_VIRTUAL_MEMORY_EXHAUSTED);
+
+ // allocate new unbounded set for pointers to config info entries
+ ACE_NEW_RETURN (config_info_entries_,
+ ACE_Unbounded_Set <Config_Info *>,
+ ST_VIRTUAL_MEMORY_EXHAUSTED);
+
+
+ // set up links between rt_info_entries_, task_entries_,
+ // and ordered_task_entries_ tables
+ ACE_Unbounded_Set_Iterator <RT_Info *> iter (rt_info_entries_);
+ for (u_int i = 0; i < tasks (); ++i, iter.advance ())
+ {
+ RT_Info** info_entry;
+
+ // tie task entry to corresponding rt_info
+ if (! iter.next (info_entry))
+ {
+ return ST_BAD_INTERNAL_POINTER;
+ }
+ task_entries_ [i].rt_info (*info_entry);
+
+ // Tie rt_info to corresponding task entry: the double cast is
+ // needed to ensure that the size of the pointer and the size of the
+ // stored magic cookie are the same (see the definition of
+ // ptrdiff_t in ACE to grok how this works portably).
+ task_entries_ [i].rt_info ()->volatile_token =
+ static_cast<CORBA::ULongLong> (reinterpret_cast<ptrdiff_t> (&(task_entries_ [i])));
+
+ // tie ordered task entry pointer to corresponding task entry
+ ordered_task_entries_ [i] = &(task_entries_ [i]);
+ }
+
+ // set up bidirectional links between task entries
+ return relate_task_entries ();
+}
+
+ACE_DynScheduler::status_t
+ACE_DynScheduler::relate_task_entries (void)
+{
+ status_t status = SUCCEEDED;
+
+ // do DFS traversal of the entire RT_Info handle dependency DAG, replicating
+ // the handle dependency DAG as a calls DAG of pointers between task
+ // entries (and creating its transpose, the callers DAG). This is done
+ // to avoid the O(n) cost of handle lookups in the RT_Infos for further
+ // traversal of the graph during schedule sorting. One useful side effect
+ // of this traversal is that is produces a topological ordering of dependencies
+ // in the traversal finishing times, which can be used to detect call cycles.
+ long time = 0;
+
+ for (u_int i = 0; i < tasks (); ++i)
+ {
+ if ((status = relate_task_entries_recurse (time, task_entries_[i]))
+ != SUCCEEDED)
+ {
+ break;
+ }
+ }
+
+ return status;
+}
+
+ACE_DynScheduler::status_t
+ACE_DynScheduler::relate_task_entries_recurse (long &time, Task_Entry &entry)
+{
+
+ // may have entered at a non-root node previously, so this does
+ // not necessarily indicate a cycle in the dependency graph
+ if (entry.dfs_status () != Task_Entry::NOT_VISITED)
+ {
+ return SUCCEEDED;
+ }
+
+ // when a node is discovered, mark it as visited, increment "time" and
+ // store as the entry's discovery time. This is not currently used in
+ // the scheduling algorithms, but is left in for possible future use
+ // as it shows full parenthetization of entry discovery/finishing.
+ entry.dfs_status (Task_Entry::VISITED);
+ entry.discovered (++time);
+
+ u_int dependency_count = number_of_dependencies (*entry.rt_info ());
+ if (dependency_count > 0)
+ {
+ // traverse dependencies of underlying RT_Info
+ for (u_int i = 0; i < dependency_count; ++i)
+ {
+ // obtain a pointer to the corresponding Task_Entry for each dependency
+
+ RT_Info* dependency_info = 0;
+ lookup_rt_info(entry.rt_info ()->dependencies[i].rt_info, dependency_info);
+
+ if (! dependency_info)
+ {
+ return ST_BAD_INTERNAL_POINTER;
+ }
+
+ // Obtain a pointer to the Task_Entry from the dependency
+ // RT_Info: the double cast is needed to ensure that the size of
+ // the pointer and the size of the stored magic cookie are the
+ // same (see the definition of ptrdiff_t in ACE to grok how
+ // this works portably).
+ Task_Entry *dependency_entry_ptr =
+ ACE_LONGLONG_TO_PTR (Task_Entry *, dependency_info->volatile_token);
+
+ if (! dependency_entry_ptr)
+ {
+ return ST_BAD_INTERNAL_POINTER;
+ }
+
+ // relate the entries according to the direction of the dependency
+ Task_Entry_Link *link;
+ ACE_NEW_RETURN (link,
+ Task_Entry_Link (entry,
+ *dependency_entry_ptr,
+ entry.rt_info ()->dependencies[i].number_of_calls,
+ entry.rt_info ()->dependencies[i].dependency_type),
+ ST_VIRTUAL_MEMORY_EXHAUSTED);
+
+ dependency_entry_ptr->callers ().insert (link);
+ entry.calls ().insert (link);
+
+ // depth first recursion on the newly identified entry
+ relate_task_entries_recurse (time, *dependency_entry_ptr);
+ }
+ }
+
+ // when a node is finished, mark it as finished, increment "time" and
+ // store as the entry's finish time. This produces a topological ordering
+ // based on dependencies, which is used to check for call cycles.
+ entry.dfs_status (Task_Entry::FINISHED);
+ entry.finished (++time);
+
+ return SUCCEEDED;
+}
+
+ACE_DynScheduler::status_t
+ACE_DynScheduler::identify_threads (ACE_CString & unresolved_locals,
+ ACE_CString & unresolved_remotes)
+{
+ u_int i, j;
+ ACE_DynScheduler::status_t result = SUCCEEDED;
+ char string_buffer [BUFSIZ];
+
+ // walk array of task entries, picking out thread delineators
+ for (i = 0; i < tasks_; i++)
+ {
+ // if entry has exposed threads or no callers, it may be a thread
+ if ((task_entries_ [i].rt_info ()->threads > 0) ||
+ (task_entries_ [i].callers ().is_empty ()))
+ {
+ // if its period is valued, it's a thread delineator
+ if (task_entries_ [i].rt_info ()->period > 0)
+ {
+ task_entries_ [i].effective_period (task_entries_ [i].rt_info ()->period);
+ task_entries_ [i].is_thread_delineator (1);
+
+ // create a Dispatch_Entry for each thread of the delimiting Task_Entry
+ u_int thread_count = (task_entries_ [i].rt_info ()->threads > 0)
+ ? task_entries_ [i].rt_info ()->threads : 1;
+ // Just use low 32 bits of effective_period. This will
+ // have to change when TimeBase.idl is finalized.
+ const TimeBase::TimeT zero = 0;
+ for (j = 0; j < thread_count; j++)
+ {
+ Dispatch_Entry *dispatch_ptr;
+ const TimeBase::TimeT effective_period =
+ task_entries_ [i].effective_period ();
+ ACE_NEW_RETURN(dispatch_ptr,
+ Dispatch_Entry (zero,
+ effective_period,
+ task_entries_ [i].rt_info ()->preemption_priority,
+ task_entries_ [i].rt_info ()->priority,
+ task_entries_ [i]),
+ ST_VIRTUAL_MEMORY_EXHAUSTED);
+
+ if ((task_entries_ [i].dispatches ().insert (Dispatch_Entry_Link (*dispatch_ptr)) < 0) ||
+ (dispatch_entries_->insert (dispatch_ptr) < 0) ||
+ (thread_delineators_->insert (dispatch_ptr) < 0))
+ {
+ return ST_VIRTUAL_MEMORY_EXHAUSTED;
+ }
+
+ // increase the count of thread dispatches
+ ++ threads_;
+ }
+ }
+ else if (task_entries_ [i].rt_info ()->info_type == RtecScheduler::REMOTE_DEPENDANT)
+ {
+ // Warn about unresolved remote dependencies, mark the task entry
+
+ result = (result == SUCCEEDED)
+ ? ST_UNRESOLVED_REMOTE_DEPENDENCIES
+ : result;
+
+ task_entries_ [i].has_unresolved_remote_dependencies (1);
+
+ ACE_DEBUG (
+ (LM_DEBUG,
+ ACE_TEXT("Warning: an operation identified by ")
+ ACE_TEXT("\"%s\" has unresolved remote dependencies.\n"),
+ ACE_TEXT_CHAR_TO_TCHAR((const char*)task_entries_ [i].rt_info ()->entry_point)));
+
+ // Record entry point in list of unresolved remote dependencies
+ ACE_OS::sprintf (string_buffer, "// %s\n",
+ (const char*) task_entries_ [i].rt_info ()->
+ entry_point);
+ unresolved_remotes +=
+ ACE_CString (string_buffer);
+ }
+ else
+ {
+ // Local node that no one calls and has neither rate nor threads is suspect
+ ACE_DEBUG (
+ (LM_DEBUG,
+ ACE_TEXT("Error: operation \"%s\" does not specify a period or\n")
+ ACE_TEXT("visible threads, and is not called by any other operation.\n")
+ ACE_TEXT("Are there backwards dependencies.\n"),
+ ACE_TEXT_CHAR_TO_TCHAR((const char*)task_entries_ [i].rt_info ()->entry_point)));
+
+ result = ST_UNRESOLVED_LOCAL_DEPENDENCIES;
+
+ task_entries_ [i].has_unresolved_local_dependencies (1);
+
+ // Record entry point in list of unresolved local dependencies
+ ACE_OS::sprintf (string_buffer, "// %s\n",
+ (const char*) task_entries_ [i].rt_info ()->
+ entry_point);
+ unresolved_locals +=
+ ACE_CString (string_buffer);
+ }
+ }
+ }
+
+ return result;
+}
+
+ACE_DynScheduler::status_t
+ACE_DynScheduler::check_dependency_cycles (void)
+{
+ status_t return_status = SUCCEEDED;
+
+ // sort the pointers to entries in order of descending finish time
+ ACE_OS::qsort ((void *) ordered_task_entries_,
+ tasks (),
+ sizeof (Task_Entry *),
+ compare_entry_finish_times);
+
+ // set all the dfs_status indicators to NOT_VISITED
+ u_int i;
+ for (i = 0; i < tasks (); ++i)
+ {
+ ordered_task_entries_ [i]->dfs_status (Task_Entry::NOT_VISITED);
+ }
+
+ // recurse on each entry, saving most recent status if it is not SUCCEEDED
+ for (i = 0; i < tasks (); ++i)
+ {
+ status_t status =
+ check_dependency_cycles_recurse (*ordered_task_entries_ [i]);
+
+ if (status != SUCCEEDED)
+ {
+ return_status = status;
+ }
+ }
+
+ return return_status;
+}
+ // uses strongly connected components algorithm: consider entries
+ // in order of finishing time from dependency DAG traversal,
+ // but traverse transpose graph: any entry that has a dependant
+ // that was not previously visited in this traversal is part
+ // of a dependency cycle
+
+
+ACE_DynScheduler::status_t
+ACE_DynScheduler::check_dependency_cycles_recurse (Task_Entry &entry)
+{
+ status_t return_status = SUCCEEDED;
+
+ // halt DFS recursion on callers graph if entry has already been visited
+ if (entry.dfs_status () != Task_Entry::NOT_VISITED)
+ {
+ return return_status;
+ }
+
+ // mark the entry as visited
+ entry.dfs_status (Task_Entry::VISITED);
+
+ // check all the calling operations: if there is one that has not already been
+ // visited, mark the return status indicating there is a cycle, print
+ // an error message to that effect, and recurse on that dependant
+ Task_Entry_Link **calling_entry_link;
+ ACE_Unbounded_Set_Iterator <Task_Entry_Link *> i (entry.callers ());
+ while (i.next (calling_entry_link) != 0)
+ {
+ i.advance ();
+ if ((*calling_entry_link)->caller ().dfs_status () == Task_Entry::NOT_VISITED)
+ {
+ // indicate the two tasks are in (the same) dependency cycle
+ ACE_ERROR ((LM_ERROR,
+ ACE_TEXT("Tasks \"%s\" and \"%s\" are part of a call cycle.\n"),
+ ACE_TEXT_CHAR_TO_TCHAR((*calling_entry_link)->caller ().rt_info ()->entry_point.in ()),
+ ACE_TEXT_CHAR_TO_TCHAR(entry.rt_info ()->entry_point.in ())));
+
+ // set return status, ignore status returned by recursive call:
+ // we already know there are cycles in the dependencies
+ return_status = ST_CYCLE_IN_DEPENDENCIES;
+ check_dependency_cycles_recurse ((*calling_entry_link)->caller ());
+ }
+ }
+
+ // mark the entry as finished
+ entry.dfs_status (Task_Entry::FINISHED);
+
+ return return_status;
+}
+
+
+ACE_DynScheduler::status_t
+ACE_DynScheduler::schedule_threads (ACE_Unbounded_Set<RtecScheduler::Scheduling_Anomaly *> &anomaly_set)
+{
+ // make sure there are as many thread delineator
+ // entries in the set as the counter indicates
+ if (threads_ != thread_delineators_->size ())
+ {
+ return THREAD_COUNT_MISMATCH;
+ }
+
+ // allocate an array of pointers to the thread delineators
+ ACE_NEW_RETURN (ordered_thread_dispatch_entries_,
+ Dispatch_Entry * [threads_],
+ ST_VIRTUAL_MEMORY_EXHAUSTED);
+ ACE_OS::memset (ordered_thread_dispatch_entries_, 0,
+ sizeof (Dispatch_Entry *) * threads_);
+
+
+ // copy pointers to the thread delineators from the set to the array
+ ACE_Unbounded_Set_Iterator <Dispatch_Entry *> iter (*thread_delineators_);
+ for (u_int i = 0; i < threads_; ++i, iter.advance ())
+ {
+ Dispatch_Entry** dispatch_entry;
+
+ if (! iter.next (dispatch_entry))
+ {
+ return ST_BAD_INTERNAL_POINTER;
+ }
+
+ ordered_thread_dispatch_entries_ [i] = *dispatch_entry;
+ }
+
+ // sort the thread dispatch entries into priority order
+ status_t status = sort_dispatches (ordered_thread_dispatch_entries_, threads_);
+
+ if (status == SUCCEEDED)
+ {
+ // assign priorities to the thread dispatch entries
+ status = assign_priorities (ordered_thread_dispatch_entries_,
+ threads_, anomaly_set);
+ }
+
+ return status;
+}
+ // thread scheduling method: sets up array of pointers to task
+ // entries that are threads, calls internal thread scheduling method
+
+ACE_DynScheduler::status_t
+ACE_DynScheduler::schedule_dispatches (ACE_Unbounded_Set<RtecScheduler::Scheduling_Anomaly *> &anomaly_set)
+{
+ dispatch_entry_count_ = static_cast<u_int> (dispatch_entries_->size ());
+
+ ACE_NEW_RETURN (ordered_dispatch_entries_,
+ Dispatch_Entry * [dispatch_entry_count_],
+ ST_VIRTUAL_MEMORY_EXHAUSTED);
+ ACE_OS::memset (ordered_dispatch_entries_, 0,
+ sizeof (Dispatch_Entry *) * dispatch_entry_count_);
+
+ ACE_Unbounded_Set_Iterator <Dispatch_Entry *> iter (*dispatch_entries_);
+ for (u_int i = 0; i < dispatch_entry_count_; ++i, iter.advance ())
+ {
+ Dispatch_Entry** dispatch_entry;
+
+ if (! iter.next (dispatch_entry))
+ {
+ return ST_BAD_INTERNAL_POINTER;
+ }
+
+ ordered_dispatch_entries_ [i] = *dispatch_entry;
+ }
+
+ // sort the entries in order of priority and subpriority
+ sort_dispatches (ordered_dispatch_entries_, dispatch_entry_count_);
+
+ // assign dynamic and static subpriorities to the thread dispatch entries
+ return assign_subpriorities (ordered_dispatch_entries_,
+ dispatch_entry_count_, anomaly_set);
+}
+ // dispatch scheduling method: sets up an array of dispatch entries,
+ // calls internal dispatch scheduling method.
+
+ACE_DynScheduler::status_t
+ACE_DynScheduler::store_assigned_info (void)
+{
+ for (u_int i = 0; i < dispatch_entry_count_; ++i)
+ {
+ if ((! ordered_dispatch_entries_) || (! (ordered_dispatch_entries_[i])) ||
+ (! (ordered_dispatch_entries_[i]->task_entry ().rt_info ())))
+ {
+ ACE_ERROR_RETURN ((LM_ERROR,
+ ACE_TEXT("ACE_DynScheduler::store_assigned_info () could not store ")
+ ACE_TEXT("priority information (error in internal representation)")),
+ ST_BAD_INTERNAL_POINTER);
+ }
+
+ // set OS priority and Scheduler preemption priority and static
+ // preemption subpriority in underlying RT_Info
+ ordered_dispatch_entries_ [i]->task_entry ().rt_info ()->priority =
+ ordered_dispatch_entries_ [i]->OS_priority ();
+ ordered_dispatch_entries_ [i]->task_entry ().rt_info ()->preemption_priority =
+ ordered_dispatch_entries_ [i]->priority ();
+ ordered_dispatch_entries_ [i]->task_entry ().rt_info ()->preemption_subpriority =
+ ordered_dispatch_entries_ [i]->static_subpriority ();
+ }
+
+ return SUCCEEDED;
+}
+ // = store assigned information back into the RT_Infos
+
+
+ACE_DynScheduler::status_t
+ACE_DynScheduler::create_timeline ()
+{
+ // queue of previously scheduled entries that need to be rescheduled
+ ACE_Unbounded_Queue <Dispatch_Entry *> reschedule_queue;
+
+ status_t status = SUCCEEDED;
+
+ ACE_NEW_RETURN(timeline_, ACE_Ordered_MultiSet <TimeLine_Entry_Link>,
+ ST_VIRTUAL_MEMORY_EXHAUSTED);
+
+ ACE_NEW_RETURN(expanded_dispatches_, ACE_Unbounded_Set <Dispatch_Entry *>,
+ ST_VIRTUAL_MEMORY_EXHAUSTED);
+
+ // start with the id of the first entry in the array
+ min_dispatch_id_ = ordered_dispatch_entries_[0]->dispatch_id ();
+ max_dispatch_id_ = ordered_dispatch_entries_[0]->dispatch_id ();
+
+ for (u_long i = 0; i < dispatch_entry_count_; ++i)
+ {
+ // update the minimal and maximal id values for the schedule
+ if (ordered_dispatch_entries_[i]->dispatch_id () < min_dispatch_id_)
+ {
+ min_dispatch_id_ = ordered_dispatch_entries_[i]->dispatch_id ();
+ }
+ if (ordered_dispatch_entries_[i]->dispatch_id () > max_dispatch_id_)
+ {
+ max_dispatch_id_ = ordered_dispatch_entries_[i]->dispatch_id ();
+ }
+
+ // only put OPERATION and REMOTE_DEPENDANT dispatches into the timeline.
+ if ((ordered_dispatch_entries_[i]->task_entry().info_type () !=
+ RtecScheduler::OPERATION) &&
+ (ordered_dispatch_entries_[i]->task_entry().info_type () !=
+ RtecScheduler::REMOTE_DEPENDANT))
+ {
+ continue;
+ }
+
+ // schedule the current dispatch entry into the timeline
+ status = schedule_timeline_entry (*(ordered_dispatch_entries_[i]),
+ reschedule_queue);
+ if (status != SUCCEEDED)
+ {
+ break;
+ }
+
+ // iterate through the set of dispatch entries that need to be rescheduled
+ Dispatch_Entry *rescheduled_entry;
+ while (reschedule_queue.is_empty () == 0)
+ {
+
+ if (reschedule_queue.dequeue_head (rescheduled_entry) < 0)
+ {
+ status = ST_BAD_INTERNAL_POINTER;
+ break;
+ }
+
+ status = schedule_timeline_entry (*rescheduled_entry, reschedule_queue);
+ if (status != SUCCEEDED)
+ {
+ break;
+ }
+ }
+ if (status != SUCCEEDED)
+ {
+ break;
+ }
+
+ // Schedule additional dispatches of the entry
+ // over the total frame size into the timeline.
+ u_long current_frame_offset = 0;
+ u_long task_period =
+ ordered_dispatch_entries_[i]->task_entry ().effective_period ();
+ for (current_frame_offset = task_period;
+ current_frame_offset < frame_size_;
+ current_frame_offset += task_period)
+ {
+ Dispatch_Entry *new_dispatch_entry;
+
+ // create a new dispatch entry at the current sub-frame offset
+ // Just use low 32 bits of arrival and deadline. This will
+ // have to change when TimeBase.idl is finalized.
+ const TimeBase::TimeT arrival =
+ ordered_dispatch_entries_[i]->arrival () +
+ static_cast<ACE_UINT32> (current_frame_offset);
+ const TimeBase::TimeT deadline=
+ ordered_dispatch_entries_[i]->deadline () +
+ static_cast<ACE_UINT32> (current_frame_offset);
+
+ ACE_NEW_RETURN (
+ new_dispatch_entry,
+ Dispatch_Entry (arrival,
+ deadline,
+ ordered_dispatch_entries_[i]->priority (),
+ ordered_dispatch_entries_[i]->OS_priority (),
+ ordered_dispatch_entries_[i]->task_entry (),
+ ordered_dispatch_entries_[i]),
+ ST_VIRTUAL_MEMORY_EXHAUSTED);
+
+ // add the new dispatch entry to the set of expanded dispatches
+ expanded_dispatches_->insert (new_dispatch_entry);
+
+ // schedule the new dispatch entry into the timeline
+ status = schedule_timeline_entry (*new_dispatch_entry, reschedule_queue);
+ if (status != SUCCEEDED)
+ {
+ break;
+ }
+
+ while (reschedule_queue.is_empty () == 0)
+ {
+ if (reschedule_queue.dequeue_head (rescheduled_entry) < 0)
+ {
+ status = ST_BAD_INTERNAL_POINTER;
+ break;
+ }
+ status = schedule_timeline_entry (*rescheduled_entry, reschedule_queue);
+ if (status != SUCCEEDED)
+ {
+ break;
+ }
+ }
+ if (status != SUCCEEDED)
+ {
+ break;
+ }
+ }
+
+ if (status != SUCCEEDED)
+ {
+ break;
+ }
+ }
+
+ return status;
+}
+ // Create a timeline.
+
+
+
+ACE_DynScheduler::status_t
+ACE_DynScheduler::output_dispatch_priorities (const char *filename)
+{
+ status_t status = UNABLE_TO_OPEN_SCHEDULE_FILE;
+
+ // open the file
+ FILE *file = ACE_OS::fopen (ACE_TEXT_CHAR_TO_TCHAR(filename), ACE_TEXT("w"));
+ if (file)
+ {
+ status = output_dispatch_priorities (file);
+ fclose (file);
+ }
+ else
+ {
+ ACE_ERROR ((LM_ERROR,
+ ACE_TEXT("ACE_DynScheduler::output_dispatch_priorities: ")
+ ACE_TEXT("Could not open schedule file (\"%s\")"),
+ ACE_TEXT_CHAR_TO_TCHAR(filename)));
+ }
+
+ return status;
+}
+
+
+ACE_DynScheduler::status_t
+ACE_DynScheduler::output_dispatch_priorities (FILE *file)
+{
+
+ u_long dispatch_count = 0;
+ u_long i = 0;
+ for (i = 0; i < dispatch_entry_count_; ++i)
+ {
+ dispatch_count +=
+ frame_size_
+ / ordered_dispatch_entries_[i]->task_entry ().effective_period ();
+ }
+
+ if (ACE_OS::fprintf (
+ file, "\n\nSCHEDULING RESULTS:\n\n"
+ "Number of dispatches: %3lu\n"
+ "Number of threads: %3u\n"
+ "Number of tasks: %3u\n"
+ "Scheduler Status: [%d] %s\n"
+ "Total Frame Size: %lu nsec (%f Hz)\n"
+ "Critical Set Frame Size: %lu nsec (%f Hz)\n"
+ "Utilization: %f\n"
+ "Critical Set Utilization: %f\n"
+ "Minimum Priority Queue: %3d\n"
+ "Minimum Guaranteed Priority Queue: %3d\n"
+ "Minimum Critical Priority: %3d\n\n\n"
+
+ "DISPATCH PRIORITIES:\n\n"
+ " (critical \n"
+ " instant) \n"
+ " dispatch dynamic static \n"
+ "operation ID priority subpriority subpriority\n"
+ "--------- -------- -------- ----------- -----------\n",
+ dispatch_count, threads_, tasks_, status_,
+ status_message(status_), frame_size_,
+ (double) (10000000.0 / ((double) frame_size_)),
+ critical_set_frame_size_,
+ (double) (10000000.0 / ((double) critical_set_frame_size_)),
+ utilization_, critical_set_utilization_,
+ int(minimum_priority_queue_),
+ int(minimum_guaranteed_priority_queue_),
+ int(minimum_critical_priority ())) < 0)
+
+ {
+ ACE_ERROR_RETURN ((LM_ERROR,
+ ACE_TEXT("ACE_DynScheduler::output_dispatch_priorities: ")
+ ACE_TEXT("Could not write to schedule file\n")),
+ UNABLE_TO_WRITE_SCHEDULE_FILE);
+ }
+
+ for (i = 0; i < dispatch_entry_count_; ++i)
+ {
+ if (ACE_OS::fprintf (file, "%-11s %8lu %8u %11u %11u\n",
+ ordered_dispatch_entries_[i]->task_entry ().rt_info ()->
+ entry_point.in (),
+ ordered_dispatch_entries_[i]->dispatch_id (),
+ ordered_dispatch_entries_[i]->priority (),
+ ordered_dispatch_entries_[i]->dynamic_subpriority (),
+ ordered_dispatch_entries_[i]->static_subpriority ()) < 0)
+ {
+ ACE_ERROR_RETURN ((LM_ERROR,
+ ACE_TEXT("ACE_DynScheduler::output_dispatch_priorities: ")
+ ACE_TEXT("Could not write to schedule file\n")),
+ UNABLE_TO_WRITE_SCHEDULE_FILE);
+ }
+ }
+
+ return SUCCEEDED;
+}
+
+
+ACE_DynScheduler::status_t
+ACE_DynScheduler::output_dispatch_timeline (const char *filename)
+{
+ status_t status = UNABLE_TO_OPEN_SCHEDULE_FILE;
+
+ // open the file
+ FILE *file = ACE_OS::fopen (ACE_TEXT_CHAR_TO_TCHAR(filename), ACE_TEXT("w"));
+ if (file)
+ {
+ status = output_dispatch_timeline (file);
+ fclose (file);
+ }
+ else
+ {
+ ACE_ERROR ((LM_ERROR,
+ ACE_TEXT("ACE_DynScheduler::output_dispatch_timeline: ")
+ ACE_TEXT("Could not open schedule file (\"%s\")"),
+ filename));
+ }
+
+ return status;
+}
+
+ACE_DynScheduler::status_t
+ACE_DynScheduler::output_dispatch_timeline (FILE *file)
+{
+ if (ACE_OS::fprintf (
+ file, "\n\nDISPATCH TIMELINE:\n\n"
+ " dispatch arrival deadline start stop execution latency laxity\n"
+ "operation ID (nsec) (nsec) (nsec) (nsec) time (nsec) (nsec) (nsec)\n"
+ "--------- ----------- ------- -------- ----- ------ ----------- ------- ------\n") < 0)
+ {
+ ACE_ERROR_RETURN ((LM_ERROR,
+ ACE_TEXT("ACE_DynScheduler::output_dispatch_timeline: ")
+ ACE_TEXT("Could not write to schedule file")),
+ UNABLE_TO_WRITE_SCHEDULE_FILE);
+ }
+
+ // iterate through timeline, picking out entries whose prev_ pointer
+ // is null (i.e. those representing the start of a dispatch), find end
+ // of dispatch, output the operation, dispatch, priority, and time info
+ ACE_Ordered_MultiSet_Iterator <TimeLine_Entry_Link> iter (*timeline_);
+ for (iter.first (); iter.done () == 0; iter.advance ())
+ {
+ TimeLine_Entry_Link *link;
+ if ((iter.next (link) == 0) || (! link))
+ {
+ ACE_ERROR_RETURN ((LM_ERROR,
+ ACE_TEXT("ACE_DynScheduler::output_dispatch_timeline: ")
+ ACE_TEXT("Bad internal pointer\n")),
+ ST_BAD_INTERNAL_POINTER);
+ }
+
+ // for each timeline entry that starts a dispatch
+ if (link->entry ().prev () == 0)
+ {
+ // find the last time slice for the dispatch
+ TimeLine_Entry *last_entry = &(link->entry ());
+ while (last_entry->next ())
+ {
+ last_entry = last_entry->next ();
+ }
+
+ Time tmp = last_entry->stop () - link->entry ().arrival () -
+ link->entry ().dispatch_entry ().task_entry ().rt_info ()->
+ worst_case_execution_time;
+ if (link->entry ().dispatch_entry ().original_dispatch ())
+ {
+ if (ACE_OS::fprintf (
+ file,
+ "%-11s [%4lu] %4lu %7u %8u %8u "
+ "%10u %11u %10d %10d\n",
+ link->entry ().dispatch_entry ().task_entry ().rt_info ()->
+ entry_point.in (),
+ link->entry ().dispatch_entry ().original_dispatch ()->dispatch_id (),
+ link->entry ().dispatch_entry ().dispatch_id (),
+ ACE_U64_TO_U32 (link->entry ().arrival ()),
+ ACE_U64_TO_U32 (link->entry ().deadline ()),
+ ACE_U64_TO_U32 (link->entry ().start ()),
+ ACE_U64_TO_U32 (last_entry->stop ()),
+ ACE_U64_TO_U32 (link->entry ().dispatch_entry ().task_entry ().
+ rt_info ()->worst_case_execution_time),
+ ACE_U64_TO_U32 (tmp),
+ ACE_U64_TO_U32 (link->entry ().deadline () -
+ last_entry->stop ())) < 0)
+
+ {
+ ACE_ERROR_RETURN ((LM_ERROR,
+ ACE_TEXT("ACE_DynScheduler::output_dispatch_timeline: ")
+ ACE_TEXT("Unable to write to schedule file\n")),
+ UNABLE_TO_WRITE_SCHEDULE_FILE);
+ }
+ }
+ else
+ {
+ if (ACE_OS::fprintf (
+ file,
+ "%-11s %11lu %7u %8u %8u %10u %11u %10d %10d\n",
+ link->entry ().dispatch_entry ().task_entry ().rt_info ()->
+ entry_point.in (),
+ link->entry ().dispatch_entry ().dispatch_id (),
+ ACE_U64_TO_U32 (link->entry ().arrival ()),
+ ACE_U64_TO_U32 (link->entry ().deadline ()),
+ ACE_U64_TO_U32 (link->entry ().start ()),
+ ACE_U64_TO_U32 (last_entry->stop ()),
+ ACE_U64_TO_U32 (link->entry ().dispatch_entry ().task_entry ().
+ rt_info ()->worst_case_execution_time),
+ ACE_U64_TO_U32 (tmp),
+ ACE_U64_TO_U32 (link->entry ().deadline () -
+ last_entry->stop ())) < 0)
+
+ {
+ ACE_ERROR_RETURN ((LM_ERROR,
+ ACE_TEXT("ACE_DynScheduler::output_dispatch_timeline: ")
+ ACE_TEXT("Unable to write to schedule file\n")),
+ UNABLE_TO_WRITE_SCHEDULE_FILE);
+ }
+ }
+ }
+ }
+
+ return SUCCEEDED;
+}
+ // this prints the entire set of timeline outputs to the specified file
+
+ACE_DynScheduler::status_t
+ACE_DynScheduler::output_preemption_timeline (const char *filename)
+{
+ status_t status = UNABLE_TO_OPEN_SCHEDULE_FILE;
+
+ // open the file
+ FILE *file = ACE_OS::fopen (ACE_TEXT_CHAR_TO_TCHAR(filename), ACE_TEXT("w"));
+ if (file)
+ {
+ status = output_preemption_timeline (file);
+ fclose (file);
+ }
+ else
+ {
+ ACE_ERROR ((LM_ERROR,
+ ACE_TEXT("ACE_DynScheduler::output_preemption_timeline: ")
+ ACE_TEXT("Cannot open timeline file (\"%s\")\n"),
+ ACE_TEXT_CHAR_TO_TCHAR(filename)));
+ }
+
+ return status;
+}
+
+ACE_DynScheduler::status_t
+ACE_DynScheduler::output_preemption_timeline (FILE *file)
+{
+ if (ACE_OS::fprintf (
+ file, "\n\nPREEMPTION TIMELINE:\n\n"
+ " dispatch start stop \n"
+ "operation ID (nsec) (nsec)\n"
+ "--------- ----------- ------ ------\n") < 0)
+ {
+ ACE_ERROR_RETURN ((LM_ERROR,
+ ACE_TEXT("ACE_DynScheduler::output_preemption_timeline: ")
+ ACE_TEXT("Cannot write to timeline file\n")),
+ UNABLE_TO_WRITE_SCHEDULE_FILE);
+ }
+
+ ACE_Ordered_MultiSet_Iterator <TimeLine_Entry_Link> iter (*timeline_);
+
+ TimeLine_Entry_Link *link;
+ for (iter.first (); iter.done () == 0; iter.advance ())
+ {
+ if ((iter.next (link) == 0) || (! link))
+ {
+ ACE_ERROR_RETURN ((LM_ERROR,
+ ACE_TEXT("ACE_DynScheduler::output_preemption_timeline: ")
+ ACE_TEXT("Bad internal pointer\n")),
+ ST_BAD_INTERNAL_POINTER);
+ }
+
+ if (link->entry ().dispatch_entry ().original_dispatch ())
+ {
+ if (ACE_OS::fprintf (
+ file, "%-9s [%4lu] %4lu %8u %8u\n",
+ link->entry ().dispatch_entry ().task_entry ().rt_info ()->
+ entry_point.in (),
+ link->entry ().dispatch_entry ().original_dispatch ()->dispatch_id (),
+ link->entry ().dispatch_entry ().dispatch_id (),
+ ACE_U64_TO_U32 (link->entry ().start ()),
+ ACE_U64_TO_U32 (link->entry ().stop ())) < 0)
+ {
+ ACE_ERROR_RETURN ((LM_ERROR,
+ ACE_TEXT("ACE_DynScheduler::output_preemption_timeline: ")
+ ACE_TEXT("Cannot write to timeline file\n")),
+ UNABLE_TO_WRITE_SCHEDULE_FILE);
+ }
+ }
+ else
+ {
+ if (ACE_OS::fprintf (
+ file, "%-9s %11lu %8u %8u\n",
+ link->entry ().dispatch_entry ().task_entry ().rt_info ()->
+ entry_point.in (),
+ link->entry ().dispatch_entry ().dispatch_id (),
+ ACE_U64_TO_U32 (link->entry ().start ()),
+ ACE_U64_TO_U32 (link->entry ().stop ())) < 0)
+ {
+ ACE_ERROR_RETURN ((LM_ERROR,
+ ACE_TEXT("ACE_DynScheduler::output_preemption_timeline: ")
+ ACE_TEXT("Cannot write to timeline file\n")),
+ UNABLE_TO_WRITE_SCHEDULE_FILE);
+ }
+ }
+ }
+
+ return SUCCEEDED;
+}
+
+
+ACE_DynScheduler::status_t
+ACE_DynScheduler::output_viewer_timeline (const char *filename)
+{
+ status_t status = UNABLE_TO_OPEN_SCHEDULE_FILE;
+
+ // open the file
+ FILE *file = ACE_OS::fopen (ACE_TEXT_CHAR_TO_TCHAR(filename), ACE_TEXT("w"));
+ if (file)
+ {
+ status = output_dispatch_timeline (file);
+ fclose (file);
+ }
+
+ return status;
+}
+
+ACE_DynScheduler::status_t
+ACE_DynScheduler::output_viewer_timeline (FILE *file)
+{
+ if (ACE_OS::fprintf (
+ file, "\n\nVIEWER TIMELINE:\n\n"
+ " arrival deadline completion execution \n"
+ "operation utilization overhead (nsec) (nsec) time (nsec) time (nsec)\n"
+ "--------- ----------- -------- ------- -------- ----------- -----------\n") < 0)
+ {
+ return UNABLE_TO_WRITE_SCHEDULE_FILE;
+ }
+
+ // iterate through timeline, picking out dispatches in chronological
+ // order of operation completion time
+ int entries_remain = 1;
+ Time accumulated_execution = 0;
+ Time current_accumulated_execution = 0;
+ Time last_completion = 0;
+ Time current_completion = 0;
+ TimeLine_Entry *current_entry = 0;
+ TimeLine_Entry *current_last_entry = 0;
+
+ while (entries_remain)
+ {
+ last_completion = current_completion;
+
+ accumulated_execution = 0;
+ current_accumulated_execution = 0;
+ current_completion = 0;
+ current_entry = 0;
+ current_last_entry = 0;
+
+ ACE_Ordered_MultiSet_Iterator <TimeLine_Entry_Link> iter (*timeline_);
+ for (iter.first (); iter.done () == 0; iter.advance ())
+ {
+ TimeLine_Entry_Link *link;
+ if ((iter.next (link) == 0) || (! link))
+ {
+ return ST_BAD_INTERNAL_POINTER;
+ }
+
+ accumulated_execution += link->entry ().stop () -
+ link->entry ().start ();
+
+ // for each timeline entry that starts a dispatch
+ if (link->entry ().prev () == 0)
+ {
+ // find the last time slice for the dispatch
+ TimeLine_Entry *last_entry = &(link->entry ());
+ while (last_entry->next ())
+ {
+ last_entry = last_entry->next ();
+ }
+
+ if ((last_entry->stop () > last_completion) &&
+ ((last_entry->stop () < current_completion) ||
+ (current_completion == 0U)))
+ {
+ current_completion = last_entry->stop ();
+ current_entry = &(link->entry ());
+ current_last_entry = last_entry;
+ }
+ }
+
+ // save the accumulated execution if we're at
+ // the last entry for the current dispatch
+ if (current_last_entry == &(link->entry ()))
+ {
+ current_accumulated_execution = accumulated_execution;
+ }
+ }
+
+ // if we found another entry, print it (otherwise we're done)
+ if (current_entry)
+ {
+ if (ACE_OS::fprintf (
+ file, "%-11s %9f %9f %8u %8u %11u %11u\n",
+ current_entry->dispatch_entry ().task_entry ().rt_info ()->
+ entry_point.in (),
+ static_cast<double> (ACE_UINT64_DBLCAST_ADAPTER(current_accumulated_execution)) /
+ static_cast<double> (ACE_UINT64_DBLCAST_ADAPTER(current_completion)),
+ 0.0,
+ ACE_U64_TO_U32 (current_entry->arrival ()),
+ ACE_U64_TO_U32 (current_entry->deadline ()),
+ ACE_U64_TO_U32 (current_last_entry->stop ()),
+ ACE_U64_TO_U32 (current_entry->dispatch_entry ().task_entry ().
+ rt_info ()->worst_case_execution_time)) < 0)
+ {
+ return UNABLE_TO_WRITE_SCHEDULE_FILE;
+ }
+ }
+ else
+ {
+ entries_remain = 0;
+ }
+ }
+
+ return SUCCEEDED;
+}
+
+
+ACE_DynScheduler::status_t
+ACE_DynScheduler::output_timeline (const char *filename, const char *heading)
+{
+ status_t status = SUCCEEDED;
+ FILE *file = 0;
+
+ // bail out if we're not up to date or there is no timeline
+ if ((! up_to_date_) || (! timeline_))
+ {
+ status = NOT_SCHEDULED;
+ ACE_ERROR ((LM_ERROR,
+ ACE_TEXT("ACE_DynScheduler::output_timeline: ")
+ ACE_TEXT("Schedule not generated")));
+ }
+
+ if (status == SUCCEEDED)
+ {
+ // open the file
+ file = ACE_OS::fopen (ACE_TEXT_CHAR_TO_TCHAR(filename), ACE_TEXT("w"));
+ if (! file)
+ {
+ status = UNABLE_TO_OPEN_SCHEDULE_FILE;
+ ACE_ERROR ((LM_ERROR,
+ ACE_TEXT("ACE_DynScheduler::output_timeline: ")
+ ACE_TEXT("Could not open schedule file")));
+ }
+ }
+
+ if ((status == SUCCEEDED) && (heading))
+ {
+ if (ACE_OS::fprintf (file, "%s\n\n", heading) < 0)
+ {
+ status = UNABLE_TO_WRITE_SCHEDULE_FILE;
+ ACE_ERROR ((LM_ERROR,
+ ACE_TEXT("ACE_DynScheduler::output_timeline: ")
+ ACE_TEXT("Could not write to schedule file")));
+ }
+ }
+
+ if (status == SUCCEEDED)
+ {
+ status = output_dispatch_priorities (file);
+ }
+
+ if (status == SUCCEEDED)
+ {
+ status = output_dispatch_timeline (file);
+ }
+
+ if (status == SUCCEEDED)
+ {
+ status = output_preemption_timeline (file);
+ }
+
+ if (status == SUCCEEDED)
+ {
+ status = output_viewer_timeline (file);
+ }
+
+ if (file)
+ {
+ fclose (file);
+ }
+
+ return status;
+}
+ // this prints the entire set of timeline outputs to the specified file
+
+TAO_END_VERSIONED_NAMESPACE_DECL
diff --git a/TAO/orbsvcs/orbsvcs/Sched/DynSched.h b/TAO/orbsvcs/orbsvcs/Sched/DynSched.h
new file mode 100644
index 00000000000..bae77c581a2
--- /dev/null
+++ b/TAO/orbsvcs/orbsvcs/Sched/DynSched.h
@@ -0,0 +1,544 @@
+// -*- C++ -*-
+
+// $Id$
+//
+// ============================================================================
+//
+// = LIBRARY
+// sched
+//
+// = FILENAME
+// DynSched.h
+//
+// = CREATION DATE
+// 23 January 1997
+//
+// = AUTHOR
+// Chris Gill
+//
+// ============================================================================
+
+#ifndef DYNSCHED_H
+#define DYNSCHED_H
+#include /**/ "ace/pre.h"
+
+#include "ace/ACE.h"
+
+#if !defined (ACE_LACKS_PRAGMA_ONCE)
+# pragma once
+#endif /* ACE_LACKS_PRAGMA_ONCE */
+
+#include "ace/Map_Manager.h"
+#include "ace/Message_Block.h"
+#include "ace/SString.h"
+#include "orbsvcs/Sched/SchedEntry.h"
+#include "orbsvcs/Sched/sched_export.h"
+#include "ace/Recursive_Thread_Mutex.h"
+
+
+TAO_BEGIN_VERSIONED_NAMESPACE_DECL
+
+class TAO_RTSched_Export ACE_DynScheduler
+ // = TITLE
+ // Dispatch scheduling interface.
+ //
+ // = DESCRIPTION
+ // This abstract base class provides the majority of the
+ // implementation of either an off-line scheduler, or the
+ // necessary on-line component of the Scheduler.
+{
+public:
+
+ //////////////////////////////
+ // public type declarations //
+ //////////////////////////////
+
+ typedef RtecScheduler::handle_t handle_t;
+ typedef RtecScheduler::Dependency_Info Dependency_Info;
+ typedef RtecScheduler::Preemption_Priority_t Preemption_Priority;
+ typedef RtecScheduler::OS_Priority OS_Priority;
+ typedef RtecScheduler::Preemption_Subpriority_t Sub_Priority;
+ typedef RtecScheduler::RT_Info RT_Info;
+ typedef RtecScheduler::Config_Info Config_Info;
+ typedef RtecScheduler::Time Time;
+ typedef RtecScheduler::Period_t Period;
+ typedef RtecScheduler::Info_Type_t Info_Type;
+ typedef RtecScheduler::Dependency_Type_t Dependency_Type;
+ typedef RtecScheduler::Dispatching_Type_t Dispatching_Type;
+ typedef RtecScheduler::Scheduling_Anomaly Scheduling_Anomaly;
+ typedef RtecScheduler::Anomaly_Severity Anomaly_Severity;
+
+ typedef ACE_Map_Entry <ACE_CString, RT_Info *> Thread_Map_Entry;
+ typedef ACE_Map_Manager <ACE_CString, RT_Info *, ACE_Null_Mutex>
+ Thread_Map;
+ typedef ACE_Map_Iterator <ACE_CString, RT_Info *, ACE_Null_Mutex>
+ Thread_Map_Iterator;
+
+ typedef const char *Object_Name;
+ // Objects are named by unique strings.
+
+ enum status_t {
+ // The following are used both by the runtime Scheduler and during
+ // scheduling.
+ NOT_SCHEDULED = -1 // the schedule () method has not been called yet
+ , FAILED = -1
+ , SUCCEEDED
+ , ST_UNKNOWN_TASK
+ , ST_UNKNOWN_PRIORITY
+ , ST_TASK_ALREADY_REGISTERED
+ , ST_NO_TASKS_REGISTERED
+ , ST_BAD_DEPENDENCIES_ON_TASK
+ , ST_BAD_INTERNAL_POINTER
+ , ST_VIRTUAL_MEMORY_EXHAUSTED
+ , TWO_WAY_DISJUNCTION
+ , TWO_WAY_CONJUNCTION
+ , UNRECOGNIZED_INFO_TYPE
+
+ // The following are only used by the runtime Scheduler.
+ , TASK_COUNT_MISMATCH // only used by schedule ()
+ , THREAD_COUNT_MISMATCH // only used by schedule ()
+ , INVALID_PRIORITY // only used by schedule (): mismatch of
+ // (off-line, maybe) Scheduler output to
+ // the runtime Scheduler component.
+
+ // The following are only used during scheduling (in the case of
+ // off-line scheduling, they are only used prior to runtime).
+ , ST_UTILIZATION_BOUND_EXCEEDED
+ , ST_INSUFFICIENT_THREAD_PRIORITY_LEVELS
+ , ST_CYCLE_IN_DEPENDENCIES
+ , ST_UNRESOLVED_REMOTE_DEPENDENCIES
+ , ST_UNRESOLVED_LOCAL_DEPENDENCIES
+ , ST_INVALID_PRIORITY_ORDERING
+ , UNABLE_TO_OPEN_SCHEDULE_FILE
+ , UNABLE_TO_WRITE_SCHEDULE_FILE
+ };
+
+
+
+ /////////////////////////////
+ // public member functions //
+ /////////////////////////////
+
+ virtual ~ACE_DynScheduler ();
+ // public dtor
+
+ // = Utility function for outputting the textual
+ // representation of a status_t value.
+ static const char * status_message (status_t status);
+
+ // = Utility function for creating an entry for determining
+ // the severity of an anomaly detected during scheduling.
+ static Anomaly_Severity anomaly_severity (status_t status);
+
+ // = Utility function for creating an entry for the
+ // log of anomalies detected during scheduling.
+ static Scheduling_Anomaly * create_anomaly (status_t status);
+
+
+ // = Initialize the scheduler.
+ void init (const OS_Priority minimum_priority,
+ const OS_Priority maximum_priority,
+ const char *runtime_filename = 0,
+ const char *rt_info_filename = 0,
+ const char *timeline_filename = 0);
+ // The minimum and maximum priority are the OS-specific priorities that
+ // are used when creating the schedule (assigning priorities). The
+ // minimum_priority is the priority value of the lowest priority.
+ // It may be numerically higher than the maximum_priority, on OS's such
+ // as VxWorks that use lower values to indicate higher priorities.
+ //
+ // When Scheduler::schedule is called, the schedule is output to the
+ // file named by "runtime_filename" if it is non-zero.
+ // This file is compilable; it is linked into the runtime executable
+ // to provide priorities to the runtime scheduling component.
+ // If the "rt_info_filename" is non-zero, the RT_Info for
+ // every task is exported to it. It is not used at runtime.
+ // If the "timeline_filename" is non-zero, the timeline output
+ // file is created. It is not used at runtime.
+ //
+ // The runtime scheduling component ignores these filenames. It just
+ // uses the priorities that were linked in to the executable, after
+ // converting them to platform-specific values.
+
+ void reset ();
+ // Prepare for another schedule computation: once a reasonable schedule
+ // has been generated, a new schedule will not be computed unless an
+ // RT_Info is added, or this method is invoked to clear the previous
+ // schedule (allows fault correcting alteration of RT_Infos outside the
+ // scheduler implementation, followed by generation of a new schedule).
+
+ // = Registers a task.
+ status_t register_task (RT_Info *, handle_t &handle);
+ // If the Task registration succeeds, this function returns SUCCEEDED
+ // and sets "handle" to a unique identifier for the task.
+ // Otherwise, it returns either VIRTUAL_MEMORY_EXHAUSTED or
+ // TASK_ALREADY_REGISTERED sets the handle to 0. (A task may
+ // only be registered once.)
+
+ status_t get_rt_info (Object_Name name, RT_Info* &rtinfo);
+ // Tries to find the RT_Info corresponding to <name> in the RT_Info
+ // database. Returns SUCCEEDED if <name> was found and <rtinfo> was
+ // set. Returns UNKNOWN_TASK if <name> was not found, but <rtinfo>
+ // was set to a newly allocated RT_Info. In this UNKNOWN_TASK case,
+ // the task must call RT_Info::set to fill in execution properties.
+ // In the SUCCEEDED and UNKNOWN_TASK cases, this->register_task
+ // (rtinfo, 0, handle) is called. Returns FAILED if an error
+ // occurs.
+ //
+ // One motivation for allocating RT_Info's from within the Scheduler
+ // is to allow RT_Infos to persist after the tasks that use them.
+ // For instance, we may want to call this->schedule right before the
+ // application exits a configuration run. If the tasks have been
+ // deleted (deleting their RT_Infos with them), this->schedule will
+ // fail.
+
+ status_t lookup_rt_info (handle_t handle, RT_Info* &rtinfo);
+ // Obtains an RT_Info based on its "handle".
+
+ status_t lookup_config_info (Preemption_Priority priority,
+ Config_Info* &config_info);
+ // Obtains a Config_Info based on its priority.
+
+ status_t
+ schedule (ACE_Unbounded_Set<Scheduling_Anomaly *> &anomaly_set);
+ // This sets up the data structures, invokes the internal scheduling method.
+
+ status_t output_timeline (const char *filename, const char *heading);
+ // this prints the entire set of timeline outputs to the specified file
+
+
+ // = Access a thread priority.
+ virtual int priority (const handle_t handle,
+ OS_Priority &priority,
+ Sub_Priority &subpriority,
+ Preemption_Priority &preemption_prio);
+ // "priority" is the OS thread priority that was assigned to the Task that
+ // was assigned "handle". "subpriority" combines the dynamic and static
+ // subpriorities of the Task that was assigned handle. "preemption_prio"
+ // is a platform-independent priority queue number, ranging from a
+ // highest priority value of 0 to the lowest priority value, which is
+ // returned by "minimum_priority_queue ()". Returns 0 on success,
+ // or -1 if an invalid handle was supplied.
+
+ // = Access the platform-independent priority value of the lowest-priority
+ // thread.
+ Preemption_Priority minimum_priority_queue () const;
+
+ // = Access the number of tasks.
+ u_int tasks () const;
+
+ // = Access the number of threads.
+ u_int threads () const;
+
+ // = Access the current scheduler status.
+ status_t status () const;
+
+ // = Access the current output (debugging) level.
+ u_int output_level () const;
+ // Default is 0; set to 1 to print out schedule, by task. Set
+ // to higher than one for debugging info.
+
+ // = Set the scheduler output (debugging) level.
+ void output_level (const u_int level);
+ // the only supported levels are 0 (quiet), 1 (verbose) and 2 (debug)
+
+ int add_dependency(RT_Info* rt_info,
+ Dependency_Info& d);
+
+ static int number_of_dependencies(RT_Info* rt_info);
+ static int number_of_dependencies(RT_Info& rt_info);
+
+ static void export_to_file (RT_Info*, FILE* file);
+ static void export_to_file (RT_Info&, FILE* file);
+
+ // accessors for the minimal and maximal dispatch entry id in the schedule
+ u_long min_dispatch_id () const;
+ u_long max_dispatch_id () const;
+
+ virtual int dispatch_configuration (const Preemption_Priority &p_priority,
+ OS_Priority& priority,
+ Dispatching_Type & d_type);
+ // provide the thread priority and queue type for the given priority level
+
+protected:
+
+ ////////////////////////////////
+ // protected member functions //
+ ////////////////////////////////
+
+ ACE_DynScheduler ();
+
+ status_t schedule_threads (
+ ACE_Unbounded_Set<RtecScheduler::Scheduling_Anomaly *> &anomaly_set);
+ // thread scheduling method: sets up array of pointers to task
+ // entries that are threads, calls internal thread scheduling method
+
+ status_t schedule_dispatches (
+ ACE_Unbounded_Set<RtecScheduler::Scheduling_Anomaly *> &anomaly_set);
+ // dispatch scheduling method: sets up an array of dispatch entries,
+ // calls internal dispatch scheduling method.
+
+ virtual status_t store_assigned_info (void);
+ // = store assigned information back into the RT_Infos
+
+ // = Set the minimum priority value.
+ void minimum_priority_queue (const Preemption_Priority minimum_priority_queue_number);
+
+ // = Set the number of tasks.
+ void tasks (const u_int tasks);
+
+ // = Set the number of threads.
+ void threads (const u_int threads);
+
+ // = Set the current scheduler status.
+ void status (const status_t new_status);
+
+ /////////////////////////////////////////////
+ // protected pure virtual member functions //
+ /////////////////////////////////////////////
+
+ virtual Preemption_Priority minimum_critical_priority () = 0;
+ // = determine the minimum critical priority number
+
+ virtual status_t sort_dispatches (Dispatch_Entry **, u_int) = 0;
+ // internal sorting method: this orders the dispatches by
+ // static priority and dynamic and static subpriority.
+
+ virtual status_t assign_priorities (
+ Dispatch_Entry **dispatches,
+ u_int count,
+ ACE_Unbounded_Set<RtecScheduler::Scheduling_Anomaly *> &anomaly_set) = 0;
+ // = assign priorities to the sorted dispatches
+
+ virtual status_t assign_subpriorities (
+ Dispatch_Entry **dispatches,
+ u_int count,
+ ACE_Unbounded_Set<RtecScheduler::Scheduling_Anomaly *> &anomaly_set) = 0;
+ // = assign dynamic and static sub-priorities to the sorted dispatches
+
+ virtual status_t
+ schedule_timeline_entry (Dispatch_Entry &dispatch_entry,
+ ACE_Unbounded_Queue <Dispatch_Entry *>
+ &reschedule_queue) = 0;
+ // = schedule a dispatch entry into the timeline being created
+
+ ////////////////////////////
+ // protected data members //
+ ////////////////////////////
+
+ OS_Priority minimum_priority_;
+ // The minimum OS thread priority value that the application specified (in
+ // its call to init ()).
+
+ OS_Priority maximum_priority_;
+ // The maximum OS thread priority value that the application specified (in
+ // its call to init ()).
+
+ Task_Entry *task_entries_;
+ // Collection of known tasks.
+
+ Task_Entry **ordered_task_entries_;
+ // An array of pointers to task entries which wrap RT_Infos. It is
+ // sorted by the DFS finishing time and then the resulting topological
+ // over the call graph is used both to check for call chain cycles and
+ // to correctly propagate scheduling information away from the threads.
+
+ ACE_Unbounded_Set <Dispatch_Entry *> *thread_delineators_;
+ // identifies dispatch entries whose underlying
+ // Task Entries delineate threads
+
+ Dispatch_Entry **ordered_thread_dispatch_entries_;
+ // An array of pointers to task entries which initiate call chains.
+ // It is sorted by the schedule_threads method defined in the derived class.
+
+ ACE_Unbounded_Set <Dispatch_Entry *> *dispatch_entries_;
+ // the set of dispatch entries
+
+ ACE_Unbounded_Set <Config_Info *> *config_info_entries_;
+ // Collection of dispatch configuration entries.
+
+ ACE_Unbounded_Set <Dispatch_Entry *> *expanded_dispatches_;
+ // expanded set of dispatch entries (all dispatch entries produced by
+ // expanding sub-frames to the total frame size during timeline creation)
+
+ Dispatch_Entry **ordered_dispatch_entries_;
+ // An array of pointers to dispatch entries. It is
+ // sorted by the schedule_dispatches method.
+
+ u_int dispatch_entry_count_;
+ // the number of dispatch entries in the schedule
+
+ u_int threads_;
+ // the number of dispatch entries in the schedule
+
+ ACE_Ordered_MultiSet <TimeLine_Entry_Link> *timeline_;
+ // Ordered MultiSet of timeline entries.
+
+private:
+
+ ///////////////////////////////
+ // private type declarations //
+ ///////////////////////////////
+
+ typedef ACE_CString EXT;
+ typedef RT_Info *INT;
+
+#if defined (ACE_HAS_THREADS)
+ typedef TAO_SYNCH_MUTEX SYNCH;
+ typedef TAO_SYNCH_RECURSIVE_MUTEX LOCK;
+#else
+ typedef ACE_Null_Mutex SYNCH;
+ typedef ACE_Null_Mutex LOCK;
+#endif /* ACE_HAS_THREADS */
+
+ typedef ACE_Map_Manager<EXT, INT, TAO_SYNCH_MUTEX> Info_Collection;
+ typedef ACE_Map_Iterator<EXT, INT, TAO_SYNCH_MUTEX> Info_Collection_Iterator;
+ typedef ACE_Map_Entry<EXT, INT> Info_Collection_Entry;
+
+ //////////////////////////////
+ // private member functions //
+ //////////////////////////////
+
+ status_t create_timeline ();
+ // Create a timeline.
+
+ status_t output_dispatch_timeline (const char *filename);
+ status_t output_dispatch_timeline (FILE *file);
+ // this prints a dispatch timeline to the specified file
+
+ status_t output_preemption_timeline (const char *filename);
+ status_t output_preemption_timeline (FILE *file);
+ // this prints a preemption timeline to the specified file
+
+ status_t output_viewer_timeline (const char *filename);
+ status_t output_viewer_timeline (FILE *file);
+ // this prints a scheduling viewer timeline to the specified file
+
+ status_t output_dispatch_priorities (const char *filename);
+ status_t output_dispatch_priorities (FILE *file);
+ // this prints the scheduling parameters and assigned priorities to the specified file
+
+ // = Set up the task entry data structures
+ status_t setup_task_entries (void);
+
+ // = Relate the task entries according to the
+ // dependencies of the underlying RT_Infos
+ status_t relate_task_entries (void);
+
+ // recursively traverse dependency graph, relating
+ // task entries and performing DFS start/end marking
+ status_t relate_task_entries_recurse (long &time, Task_Entry &entry);
+
+ // identify thread delimiters
+ status_t
+ identify_threads (ACE_CString & unresolved_locals,
+ ACE_CString & unresolved_remotes);
+
+ // checks for cycles in the dependency graph
+ status_t check_dependency_cycles (void);
+
+ // recursion used to check for cycles in the dependency graph
+ status_t check_dependency_cycles_recurse (Task_Entry &entry);
+
+ // = Aggregate the scheduling parameters of the threads
+ status_t aggregate_thread_parameters (void);
+
+ // = recursion over oneway dependencies used to aggregate thread parameters
+ status_t aggregate_oneways_recurse (Task_Entry &entry);
+
+ // = recursion over twoway dependencies used to aggregate thread parameters
+ status_t aggregate_twoways_recurse (Task_Entry &entry);
+
+ // update the scheduling parameters for the previous priority level
+ void update_priority_level_params ();
+
+ status_t
+ propagate_dispatches (
+ ACE_Unbounded_Set<RtecScheduler::Scheduling_Anomaly *> &anomaly_set,
+ ACE_CString & unresolved_locals,
+ ACE_CString & unresolved_remotes);
+ // propagate the dispatch information from the
+ // threads throughout the call graph
+
+ status_t calculate_utilization_params ();
+ // calculate utilization, frame size, etc.
+
+ // the following functions are not implememented
+ ACE_DynScheduler (const ACE_DynScheduler &);
+ ACE_DynScheduler &operator= (const ACE_DynScheduler &);
+
+ //////////////////////////
+ // private data members //
+ //////////////////////////
+
+ LOCK lock_;
+ // This protects access to the scheduler during configuration runs.
+
+ ACE_Unbounded_Set <RT_Info *> rt_info_entries_;
+ // Collection of known tasks.
+
+ u_int handles_;
+ // The number of task handles dispensed so far.
+
+ const char *runtime_filename_;
+ // Destination file of Scheduler output from the configuration run.
+
+ const char *rt_info_filename_;
+ // Destination file of all rt_info data from the configuration run.
+
+ const char *timeline_filename_;
+ // The destination of the timeline.
+
+ Info_Collection info_collection_;
+ // A binding of name to rt_info. This is the mapping for every
+ // rt_info in the process.
+
+ u_int tasks_;
+
+ status_t status_;
+
+ u_int output_level_;
+
+ u_long frame_size_; /* 100 nanosec */
+ // minimum frame size for all tasks
+
+ u_long critical_set_frame_size_; /* 100 nanosec */
+ // minimum frame size for guaranteed schedulable tasks
+
+ double utilization_;
+ // total utilization for all tasks
+
+ double critical_set_utilization_;
+ // minimum frame size for guaranteed schedulable tasks
+
+ Preemption_Priority minimum_priority_queue_;
+ // The platform-independent priority value of the Event Channel's
+ // minimum priority dispatch queue. The value of the maximum priority
+ // dispatch queue is always 0.
+
+ Preemption_Priority minimum_guaranteed_priority_queue_;
+ // The platform-independent priority value of the minimum priority dispatch
+ // queue whose operations are guaranteed to be schedulable. The value of
+ // the maximum priority dispatch queue is always 0, -1 indicates none can
+ // be guaranteed.
+
+ u_int up_to_date_;
+ // indicates whether the a valid schedule has been generated since the last
+ // relevant change (addition, alteration or removal of an RT_Info, etc.)
+
+ u_long min_dispatch_id_;
+
+ u_long max_dispatch_id_;
+
+};
+
+TAO_END_VERSIONED_NAMESPACE_DECL
+
+#if defined (__ACE_INLINE__)
+#include "orbsvcs/Sched/DynSched.i"
+#endif /* __ACE_INLINE__ */
+
+#include /**/ "ace/post.h"
+#endif /* DYNSCHED_H */
+
+// EOF
diff --git a/TAO/orbsvcs/orbsvcs/Sched/DynSched.i b/TAO/orbsvcs/orbsvcs/Sched/DynSched.i
new file mode 100644
index 00000000000..8e27d24c28e
--- /dev/null
+++ b/TAO/orbsvcs/orbsvcs/Sched/DynSched.i
@@ -0,0 +1,113 @@
+// -*- C++ -*-
+
+// $Id$
+//
+// ============================================================================
+//
+// = LIBRARY
+// sched
+//
+// = FILENAME
+// DynSched.i
+//
+// = CREATION DATE
+// 23 January 1997
+//
+// = AUTHOR
+// Chris Gill
+//
+// ============================================================================
+
+TAO_BEGIN_VERSIONED_NAMESPACE_DECL
+
+////////////////////////////
+// Class ACE_DynScheduler //
+////////////////////////////
+
+ACE_INLINE ACE_DynScheduler::Preemption_Priority
+ACE_DynScheduler::minimum_priority_queue () const
+{
+ return minimum_priority_queue_;
+}
+ // This is intended for use by the Event Channel, so it can determine the
+ // number of priority dispatch queues to create.
+
+// = Access the number of tasks.
+ACE_INLINE u_int
+ACE_DynScheduler::tasks () const
+{
+ return tasks_;
+}
+
+ // = Access the number of threads.
+ACE_INLINE u_int
+ACE_DynScheduler::threads () const
+{
+ return threads_;
+}
+
+ // = Access the current scheduler status.
+ACE_INLINE ACE_DynScheduler::status_t
+ACE_DynScheduler::status () const
+{
+ return status_;
+}
+
+ // = Access the current output (debugging) level.
+ACE_INLINE u_int
+ACE_DynScheduler::output_level () const {
+ return output_level_;
+}
+ // Default is 0; set to 1 to print out schedule, by task. Set
+ // to higher than one for debugging info.
+
+ // = Set the scheduler output (debugging) level.
+ACE_INLINE void
+ACE_DynScheduler::output_level (const u_int level)
+{
+ output_level_ = level;
+}
+ // the only supported levels are 0 (quiet), 1 (verbose) and 2
+ // (debug)
+
+ACE_INLINE void
+ACE_DynScheduler::minimum_priority_queue (const Preemption_Priority minimum_priority_queue_number)
+{
+ minimum_priority_queue_ = minimum_priority_queue_number;
+}
+
+ // = Set the number of tasks.
+ACE_INLINE void
+ACE_DynScheduler::tasks (const u_int tasks)
+{
+ tasks_ = tasks;
+}
+
+ // = Set the number of threads.
+// TBD - remove this - allowing the application to modify this is *not* good
+ACE_INLINE void
+ACE_DynScheduler::threads (const u_int threads)
+{
+ threads_ = threads;
+}
+
+ // = Set the current scheduler status.
+ACE_INLINE void
+ACE_DynScheduler::status (const status_t new_status)
+{
+ status_ = new_status;
+}
+
+ACE_INLINE u_long
+ACE_DynScheduler::min_dispatch_id () const
+{
+ return min_dispatch_id_;
+}
+
+ACE_INLINE u_long
+ACE_DynScheduler::max_dispatch_id () const
+{
+ return max_dispatch_id_;
+}
+
+TAO_END_VERSIONED_NAMESPACE_DECL
diff --git a/TAO/orbsvcs/orbsvcs/Sched/Reconfig_Sched_Utils.cpp b/TAO/orbsvcs/orbsvcs/Sched/Reconfig_Sched_Utils.cpp
new file mode 100644
index 00000000000..f3669c611c5
--- /dev/null
+++ b/TAO/orbsvcs/orbsvcs/Sched/Reconfig_Sched_Utils.cpp
@@ -0,0 +1,1808 @@
+// ============================================================================
+//
+// $Id$
+//
+// ============================================================================
+//
+// = LIBRARY
+// orbsvcs
+//
+// = FILENAME
+// Reconfig_Sched_Utils.cpp
+//
+// = AUTHOR
+// Chris Gill <cdgill@cs.wustl.edu>
+//
+// ============================================================================
+
+#ifndef TAO_RECONFIG_SCHED_UTILS_C
+#define TAO_RECONFIG_SCHED_UTILS_C
+
+#include "orbsvcs/Sched/Reconfig_Sched_Utils_T.h"
+#include "orbsvcs/Sched/Reconfig_Sched_Utils.h"
+
+
+#include "orbsvcs/Time_Utilities.h"
+
+
+ACE_RCSID (Sched, Reconfig_Sched_Utils, "$Id$")
+
+TAO_BEGIN_VERSIONED_NAMESPACE_DECL
+
+///////////////////////////
+// struct TAO_RT_Info_Ex //
+///////////////////////////
+
+// Default Constructor.
+
+TAO_RT_Info_Ex::TAO_RT_Info_Ex ()
+{
+ // Note: the entry_point string takes care of itself.
+ handle = 0;
+ criticality = RtecScheduler::VERY_LOW_CRITICALITY;
+ worst_case_execution_time = 0;
+ typical_execution_time = 0;
+ cached_execution_time = 0;
+ period = 0;
+ importance = RtecScheduler::VERY_LOW_IMPORTANCE;
+ quantum = 0;
+ threads = 0;
+ info_type = RtecScheduler::OPERATION;
+ priority = 0;
+ preemption_subpriority = 0;
+ preemption_priority = 0;
+ enabled = RtecScheduler::RT_INFO_ENABLED;
+ volatile_token = 0;
+}
+
+
+// Constructor from an RT_Info
+// (Also serves as a copy constructor)
+
+TAO_RT_Info_Ex::TAO_RT_Info_Ex (const RtecScheduler::RT_Info &info)
+{
+ this->entry_point = info.entry_point;
+ this->handle = info.handle;
+ this->criticality = info.criticality;
+ this->worst_case_execution_time = info.worst_case_execution_time;
+ this->typical_execution_time = info.typical_execution_time;
+ this->cached_execution_time = info.cached_execution_time;
+ this->period = info.period;
+ this->importance = info.importance;
+ this->quantum = info.quantum;
+ this->threads = info.threads;
+ this->info_type = info.info_type;
+ this->priority = info.priority;
+ this->preemption_subpriority = info.preemption_subpriority;
+ this->preemption_priority = info.preemption_priority;
+ this->enabled = info.enabled; // TODO- rethink?
+ this->volatile_token = info.volatile_token;
+}
+
+
+// Destructor.
+TAO_RT_Info_Ex::~TAO_RT_Info_Ex ()
+{
+}
+
+
+// Assignment operator with an RT_Info on the RHS.
+
+void
+TAO_RT_Info_Ex::operator = (const RtecScheduler::RT_Info &info)
+{
+ // IMPORTANT: we don't copy the name or the handle or the output
+ // attributes or the volatile token (entry pointer) or the valid
+ // flag. These can only be copied in the copy ctor at
+ // initialization.
+
+ criticality = info.criticality;
+ worst_case_execution_time = info.worst_case_execution_time;
+ typical_execution_time = info.typical_execution_time;
+ cached_execution_time = info.cached_execution_time;
+ period = info.period;
+ importance = info.importance;
+ quantum = info.quantum;
+ threads = info.threads;
+ info_type = info.info_type;
+ enabled = info.enabled;
+}
+
+
+// Resets all data members to initial (invalid) values, and removes
+// tuples corresponding to the reset flags.
+
+void
+TAO_RT_Info_Ex::reset (u_long reset_flags)
+{
+ // IMPORTANT: among the input arguments, we only reset the period ...
+ // TBD - if execution times etc. can be selected as well, then reset those, e.g.,
+ //
+ // criticality = RtecScheduler::VERY_LOW_CRITICALITY;
+ // worst_case_execution_time = 0;
+ // typical_execution_time = 0;
+ // cached_execution_time = 0;
+ // importance = RtecScheduler::VERY_LOW_IMPORTANCE;
+ // quantum = 0;
+ // threads = 0;
+ // info_type = RtecScheduler::OPERATION;
+
+ period = 0;
+
+ // ... However, we do reset the output attributes ...
+
+ priority = 0;
+ preemption_subpriority = 0;
+ preemption_priority = 0;
+
+ // ... and the appropriate tuples associated with the entry.
+ TAO_Reconfig_Scheduler_Entry * entry_ptr =
+ ACE_LONGLONG_TO_PTR (TAO_Reconfig_Scheduler_Entry *,
+ volatile_token);
+
+ //ACE_DEBUG((LM_DEBUG, "Removing Entries for RT_Info: %d, entry_ptr: %x\n", handle, entry_ptr));
+ if (entry_ptr)
+ {
+ entry_ptr->remove_tuples (reset_flags);
+ }
+ else
+ {
+ ACE_ERROR ((LM_ERROR, "Pointer to associated entry is zero."));
+ }
+}
+
+void
+TAO_RT_Info_Ex::enabled_state (RtecScheduler::RT_Info_Enabled_Type_t enabled_in)
+{
+ TAO_Reconfig_Scheduler_Entry * entry_ptr =
+ ACE_LONGLONG_TO_PTR (TAO_Reconfig_Scheduler_Entry *,
+ volatile_token);
+ if (entry_ptr)
+ {
+ this->enabled = enabled_in;
+ entry_ptr->enabled_state (enabled_in);
+ }
+ else
+ {
+ ACE_ERROR ((LM_ERROR, "Pointer to associated entry is zero."));
+ }
+}
+
+RtecScheduler::RT_Info_Enabled_Type_t
+TAO_RT_Info_Ex::enabled_state ()
+{
+ return this->enabled;
+}
+
+
+
+//////////////////////////////
+// struct TAO_RT_Info_Tuple //
+//////////////////////////////
+
+// Default Constructor.
+TAO_RT_Info_Tuple::TAO_RT_Info_Tuple ()
+ : rate_index (0)
+{
+}
+
+
+// Constructor from an RT_Info.
+// (Also serves as a copy constructor)
+
+TAO_RT_Info_Tuple::TAO_RT_Info_Tuple (const RtecScheduler::RT_Info &info)
+ : TAO_RT_Info_Ex (info),
+ rate_index (0)
+{
+}
+
+// Destructor.
+
+TAO_RT_Info_Tuple::~TAO_RT_Info_Tuple ()
+{
+}
+
+
+// Assignment operator with an RT_Info on the RHS.
+
+void
+TAO_RT_Info_Tuple::operator = (const RtecScheduler::RT_Info &info)
+{
+ static_cast<TAO_RT_Info_Ex> (*this) = info;
+}
+
+
+// Less-than comparison operator: orders tuples by ascending rate (descending period).
+
+bool
+TAO_RT_Info_Tuple::operator < (const TAO_RT_Info_Tuple &t)
+{
+ return (this->period > t.period) ? true : false;
+}
+
+
+////////////////////////////////////////
+// class TAO_Reconfig_Scheduler_Entry //
+////////////////////////////////////////
+
+// Constructor.
+
+TAO_Reconfig_Scheduler_Entry::
+TAO_Reconfig_Scheduler_Entry (TAO_RT_Info_Ex &rt_info)
+ : actual_rt_info_ (&rt_info),
+ fwd_dfs_status_ (NOT_VISITED),
+ rev_dfs_status_ (NOT_VISITED),
+ fwd_discovered_ (-1),
+ rev_discovered_ (-1),
+ fwd_finished_ (-1),
+ rev_finished_ (-1),
+ is_thread_delineator_ (0),
+ has_unresolved_remote_dependencies_ (0),
+ has_unresolved_local_dependencies_ (0),
+ aggregate_exec_time_ (0),
+ orig_tuple_period_sum_ (0),
+ prop_tuple_period_sum_ (0),
+ orig_tuple_count_ (0),
+ prop_tuple_count_ (0),
+ current_admitted_tuple_ (0),
+ enabled_ (rt_info.enabled)
+ // effective_exec_multiplier_ (0), //WSOA merge commented out
+ // effective_period_ (0) //WSOA merge commented out
+{
+ // Store the RT_Info fields.
+ this->orig_rt_info_data (*actual_rt_info_);
+}
+
+// Constructor.
+
+TAO_Reconfig_Scheduler_Entry::
+~TAO_Reconfig_Scheduler_Entry ()
+{
+ this->remove_tuples (ORIGINAL | PROPAGATED);
+}
+
+
+// Removes all tuples from the entry.
+
+void
+TAO_Reconfig_Scheduler_Entry::
+remove_tuples (u_long tuple_flags)
+{
+ TAO_RT_Info_Tuple **tuple_ptr_ptr;
+
+ if (tuple_flags & ORIGINAL)
+ {
+ TUPLE_SET_ITERATOR orig_tuple_iter (this->orig_tuple_subset_);
+
+ while (orig_tuple_iter.done () == 0)
+ {
+ if (orig_tuple_iter.next (tuple_ptr_ptr) == 0
+ || tuple_ptr_ptr == 0 || *tuple_ptr_ptr == 0)
+ {
+ ACE_ERROR ((LM_ERROR,
+ "Failed to access tuple under iterator"));
+ return;
+ }
+
+ delete (*tuple_ptr_ptr);
+
+ orig_tuple_iter.advance ();
+ }
+
+ this->orig_tuple_subset_.reset ();
+ }
+
+ // If either the originals or the propagated tuple pointers are to
+ // be removed, we have to get rid of the propagated pointers lest
+ // they become handles to access violations after the original
+ // tuples are destroyed.
+ if (tuple_flags & PROPAGATED
+ || tuple_flags & ORIGINAL)
+ {
+ this->prop_tuple_subset_.reset ();
+ }
+}
+
+
+// Adds a new tuple to the entry and updates the
+// rate indices and mean rate for the tuples.
+
+int
+TAO_Reconfig_Scheduler_Entry::
+insert_tuple (TAO_RT_Info_Tuple &tuple,
+ Tuple_Type tuple_type,
+ int replace)
+{
+ // Choose the appropriate tuple subset.
+ TUPLE_SET *set_ptr = (tuple_type == ORIGINAL) ? & orig_tuple_subset_ : & prop_tuple_subset_;
+
+ // Recompute rate indices.
+
+ tuple.rate_index = 0;
+ TAO_RT_Info_Tuple **tuple_ptr_ptr;
+
+ TUPLE_SET_ITERATOR tuple_iter (*set_ptr);
+
+ while (tuple_iter.done () == 0)
+ {
+ // Get a pointer to the tuple under the iterator.
+ if (tuple_iter.next (tuple_ptr_ptr) == 0
+ || tuple_ptr_ptr == 0 || *tuple_ptr_ptr == 0)
+ {
+ ACE_ERROR_RETURN ((LM_ERROR, "Failed to access tuple under iterator"), -1);
+ }
+
+ // Update existing tuples
+ if ((*tuple_ptr_ptr)->period > tuple.period)
+ {
+ // Move the tuple's rate index higher than any in the set
+ // with lower rates.
+ ++tuple.rate_index;
+ }
+ else if (replace && (*tuple_ptr_ptr)->period == tuple.period)
+ {
+ // If the replace flag is set, and there is already a tuple
+ // with the same rate in the set, just update that tuple and
+ // return.
+ **tuple_ptr_ptr = tuple;
+ return 1;
+ }
+ else
+ {
+ // Otherwise, just update the rate index of the subsequent
+ // tuples, which have the same or higher rates.
+ ++(*tuple_ptr_ptr)->rate_index;
+ }
+
+ tuple_iter.advance ();
+ }
+
+ // Update aggregate rate data, insert the tuple
+ if (tuple_type == ORIGINAL)
+ {
+ this->orig_tuple_period_sum_ += tuple.period;
+ ++this->orig_tuple_count_;
+ return (this->orig_tuple_subset_.insert (&tuple) < 0) ? -1 : 0;
+ }
+ else
+ {
+ this->prop_tuple_period_sum_ += tuple.period;
+ ++this->prop_tuple_count_;
+ return (this->prop_tuple_subset_.insert (&tuple) < 0) ? -1 : 0;
+ }
+}
+
+
+// Updates a matching tuple.
+
+int
+TAO_Reconfig_Scheduler_Entry::
+update_tuple (TAO_RT_Info_Ex &info,
+ Tuple_Type tuple_type)
+{
+ // Choose the appropriate tuple subset.
+ TUPLE_SET *set_ptr = (tuple_type == ORIGINAL) ? & orig_tuple_subset_ : & prop_tuple_subset_;
+
+ // Find and update the first matching tuple, if any.
+
+ TAO_RT_Info_Tuple **tuple_ptr_ptr;
+ TUPLE_SET_ITERATOR tuple_iter (*set_ptr);
+
+ while (tuple_iter.done () == 0)
+ {
+ // Get a pointer to the tuple under the iterator.
+ if (tuple_iter.next (tuple_ptr_ptr) == 0
+ || tuple_ptr_ptr == 0 || *tuple_ptr_ptr == 0)
+ {
+ ACE_ERROR_RETURN ((LM_ERROR, "Failed to access tuple under iterator"), -1);
+ }
+ else if ((*tuple_ptr_ptr)->period < info.period)
+ {
+ // If we've hit a tuple with a shorter period (higher rate),
+ // then we're done.
+ break;
+ }
+ else if ((*tuple_ptr_ptr)->period == info.period)
+ {
+ // If the replace flag is set, and there is already a tuple
+ // with the same rate in the set, just update that tuple and
+ // return.
+ **tuple_ptr_ptr = info;
+ return 1;
+ }
+
+ tuple_iter.advance ();
+ }
+
+ return 0;
+}
+
+
+// Registers tuples into the passed tuple pointer array.
+int
+TAO_Reconfig_Scheduler_Entry::
+register_tuples (TAO_RT_Info_Tuple ** tuple_ptr_array,
+ long &tuple_count)
+{
+ // Iterate over the tuples, adding them to the pointer array.
+
+ TAO_RT_Info_Tuple **tuple_ptr_ptr;
+ TUPLE_SET_ITERATOR tuple_iter (orig_tuple_subset_);
+
+ while (tuple_iter.done () == 0)
+ {
+ // Get a pointer to the tuple under the iterator.
+ if (tuple_iter.next (tuple_ptr_ptr) == 0
+ || tuple_ptr_ptr == 0 || *tuple_ptr_ptr == 0)
+ {
+ ACE_ERROR_RETURN ((LM_ERROR, "Failed to access tuple under iterator"), -1);
+ }
+ else
+ {
+ tuple_ptr_array [tuple_count] = *tuple_ptr_ptr;
+ ++tuple_count;
+ }
+
+ tuple_iter.advance ();
+ }
+
+ return 0;
+}
+
+
+
+
+// Accessor for original RT_Info data.
+
+TAO_RT_Info_Ex &
+TAO_Reconfig_Scheduler_Entry::orig_rt_info_data ()
+{
+ return orig_rt_info_data_;
+}
+
+
+// Mutator for stored original RT_Info data.
+
+void
+TAO_Reconfig_Scheduler_Entry::orig_rt_info_data (TAO_RT_Info_Ex &data)
+{
+ // Only store the information that can be updated by the public interface at run-time.
+ this->orig_rt_info_data_.worst_case_execution_time = data.worst_case_execution_time;
+ this->orig_rt_info_data_.typical_execution_time = data.typical_execution_time;
+ this->orig_rt_info_data_.cached_execution_time = data.cached_execution_time;
+ this->orig_rt_info_data_.period = data.period;
+ this->orig_rt_info_data_.criticality = data.criticality;
+ this->orig_rt_info_data_.importance = data.importance;
+ this->orig_rt_info_data_.quantum = data.quantum;
+ this->orig_rt_info_data_.threads = data.threads;
+ this->orig_rt_info_data_.info_type = data.info_type;
+ this->orig_rt_info_data_.enabled = data.enabled;
+}
+
+// Accessor for actual RT_Info pointer.
+
+TAO_RT_Info_Ex *
+TAO_Reconfig_Scheduler_Entry::
+actual_rt_info ()
+{
+ return this->actual_rt_info_;
+}
+
+
+// Mutator for actual RT_Info pointer.
+
+void
+TAO_Reconfig_Scheduler_Entry::
+actual_rt_info (TAO_RT_Info_Ex *rt_info)
+{
+ this->actual_rt_info_ = rt_info;
+}
+
+
+// Accessor for when the node was discovered in forward DFS traversal.
+
+long
+TAO_Reconfig_Scheduler_Entry::
+fwd_discovered () const
+{
+ return this->fwd_discovered_;
+}
+
+
+// Mutator for when the node was discovered in forward DFS traversal.
+
+void
+TAO_Reconfig_Scheduler_Entry::
+fwd_discovered (long l)
+{
+ this->fwd_discovered_ = l;
+}
+
+
+// Accessor for when the node was discovered in reverse DFS traversal.
+
+long
+TAO_Reconfig_Scheduler_Entry::
+rev_discovered () const
+{
+ return this->rev_discovered_;
+}
+
+
+// Mutator for when the node was discovered in reverse DFS traversal.
+
+void
+TAO_Reconfig_Scheduler_Entry::
+rev_discovered (long l)
+{
+ this->rev_discovered_ = l;
+}
+
+
+// Accessor for when the node was finished in forward DFS traversal.
+
+long
+TAO_Reconfig_Scheduler_Entry::
+fwd_finished () const
+{
+ return this->fwd_finished_;
+}
+
+
+// Mutator for when the node was finished in forward DFS traversal.
+
+void
+TAO_Reconfig_Scheduler_Entry::
+fwd_finished (long l)
+{
+ this->fwd_finished_ = l;
+}
+
+
+// Accessor for when the node was finished in reverse DFS traversal.
+
+long
+TAO_Reconfig_Scheduler_Entry::
+rev_finished () const
+{
+ return this->rev_finished_;
+}
+
+
+// Mutator for when the node was finished in reverse DFS traversal.
+
+void
+TAO_Reconfig_Scheduler_Entry::
+rev_finished (long l)
+{
+ this->rev_finished_ = l;
+}
+
+
+// Accessor for forward DFS traversal status of the node.
+
+TAO_Reconfig_Scheduler_Entry::DFS_Status
+TAO_Reconfig_Scheduler_Entry::
+fwd_dfs_status () const
+{
+ return this->fwd_dfs_status_;
+}
+
+
+// Mutator for forward DFS traversal status of the node.
+
+void
+TAO_Reconfig_Scheduler_Entry::
+fwd_dfs_status (TAO_Reconfig_Scheduler_Entry::DFS_Status ds)
+{
+ this->fwd_dfs_status_ = ds;
+}
+
+
+
+// Accessor for DFS traversal status of the node.
+
+TAO_Reconfig_Scheduler_Entry::DFS_Status
+TAO_Reconfig_Scheduler_Entry::
+rev_dfs_status () const
+{
+ return this->rev_dfs_status_;
+}
+
+
+// Mutator for DFS traversal status of the node.
+
+void
+TAO_Reconfig_Scheduler_Entry::
+rev_dfs_status (TAO_Reconfig_Scheduler_Entry::DFS_Status ds)
+{
+ this->rev_dfs_status_ = ds;
+}
+
+
+// Accessor for flag indicating whether node is a thread
+// delineator.
+
+int
+TAO_Reconfig_Scheduler_Entry::
+is_thread_delineator () const
+{
+ return this->is_thread_delineator_;
+}
+
+
+// Mutator for flag indicating whether node is a thread
+// delineator.
+
+void
+TAO_Reconfig_Scheduler_Entry::
+is_thread_delineator (int i)
+{
+ this->is_thread_delineator_ = i;
+}
+
+
+// Accessor for flag indicating whether node has unresolved remote
+// dependencies.
+
+int
+TAO_Reconfig_Scheduler_Entry::
+has_unresolved_remote_dependencies () const
+{
+ return this->has_unresolved_remote_dependencies_;
+}
+
+
+// Mutator for flag indicating whether node has unresolved remote
+// dependencies.
+
+void
+TAO_Reconfig_Scheduler_Entry::
+has_unresolved_remote_dependencies (int i)
+{
+ this->has_unresolved_remote_dependencies_ = i;
+}
+
+
+// Accessor for flag indicating whether node has unresolved local
+// dependencies.
+
+int
+TAO_Reconfig_Scheduler_Entry::
+has_unresolved_local_dependencies () const
+{
+ return this->has_unresolved_local_dependencies_;
+}
+
+
+// Mutator for flag indicating whether node has unresolved local
+// dependencies.
+
+void
+TAO_Reconfig_Scheduler_Entry::
+has_unresolved_local_dependencies (int i)
+{
+ this->has_unresolved_local_dependencies_ = i;
+}
+
+/* WSOA merge - commented out
+// Accessor for effective period of corresponding RT_Info.
+
+RtecScheduler::Period_t
+TAO_Reconfig_Scheduler_Entry::
+effective_period ()
+{
+ return this->effective_period_;
+}
+
+
+// Mutator for effective period of corresponding RT_Info.
+
+void
+TAO_Reconfig_Scheduler_Entry::
+effective_period (RtecScheduler::Period_t p)
+{
+ this->effective_period_ = p;
+}
+
+
+// Accessor for effective execution time of corresponding RT_Info.
+
+CORBA::Long
+TAO_Reconfig_Scheduler_Entry::
+effective_exec_multiplier ()
+{
+ return this->effective_exec_multiplier_;
+}
+
+
+// Mutator for effective execution time of corresponding RT_Info.
+
+void
+TAO_Reconfig_Scheduler_Entry::
+effective_exec_multiplier (CORBA::Long l)
+{
+ this->effective_exec_multiplier_ = l;
+}
+*/
+
+///////////////////////////
+
+TAO_Reconfig_Sched_Entry_Visitor::~TAO_Reconfig_Sched_Entry_Visitor (void)
+{
+}
+
+///////////////////////////
+// TAO_RSE_Reset_Visitor //
+///////////////////////////
+
+// Constructor.
+
+TAO_RSE_Reset_Visitor::TAO_RSE_Reset_Visitor ()
+{
+}
+
+
+// Resets the fields in the entry to pre-DFS traversal states.
+// Returns 0 on success and -1 on error.
+
+int
+TAO_RSE_Reset_Visitor::visit (TAO_Reconfig_Scheduler_Entry &rse)
+{
+ // Note that this value differs from what is set in the
+ // constructor for the entry. This is because the reset
+ // visitor is applied prior to a DFS traversal, in which callers
+ // *unset* the thread delineator status of any of their called
+ // operations that do not specify a period or threads.
+
+ if (rse.actual_rt_info ()->enabled != RtecScheduler::RT_INFO_NON_VOLATILE)
+ {
+ rse.is_thread_delineator (1);
+
+ // Only reset the period for entries that are not root nodes. Added by BRM.
+ if (rse.actual_rt_info ()->threads == 0)
+ {
+ rse.actual_rt_info ()->period = 0;
+ }
+ }
+
+ // Remove the propagated tuples in the entry.
+ rse.remove_tuples (TAO_Reconfig_Scheduler_Entry::PROPAGATED);
+
+ rse.fwd_dfs_status (TAO_Reconfig_Scheduler_Entry::NOT_VISITED);
+ rse.rev_dfs_status (TAO_Reconfig_Scheduler_Entry::NOT_VISITED);
+ rse.fwd_discovered (-1);
+ rse.rev_discovered (-1);
+ rse.fwd_finished (-1);
+ rse.rev_finished (-1);
+ rse.has_unresolved_remote_dependencies (0);
+ rse.has_unresolved_local_dependencies (0);
+ rse.aggregate_exec_time (rse.actual_rt_info ()->worst_case_execution_time);
+ rse.current_admitted_tuple (0);
+
+ //WSOA merge - commented out
+ // These settings are used for a conservative but
+ // efficient approach to estimating utilization:
+ // for an exact algorithm using frame merging,
+ // other initial settings might be needed.
+ //rse.effective_exec_multiplier (0);
+ //rse.effective_period (0);
+
+ return 0;
+}
+
+
+// Accessor for effective execution time of corresponding RT_Info.
+
+RtecScheduler::Time
+TAO_Reconfig_Scheduler_Entry::
+aggregate_exec_time ()
+{
+ return this->aggregate_exec_time_;
+}
+
+
+// Mutator for effective execution time of corresponding RT_Info.
+
+void
+TAO_Reconfig_Scheduler_Entry::
+aggregate_exec_time (RtecScheduler::Time t)
+{
+ this->aggregate_exec_time_ = t;
+}
+
+// Accessor for the sum of periods for tuples directly associated
+// with the entry.
+RtecScheduler::Period_t
+TAO_Reconfig_Scheduler_Entry::
+orig_tuple_period_sum ()
+{
+ return orig_tuple_period_sum_;
+}
+
+
+// Mutator for the sum of periods for tuples directly associated
+// with the entry.
+void
+TAO_Reconfig_Scheduler_Entry::
+orig_tuple_period_sum (RtecScheduler::Period_t p)
+{
+ orig_tuple_period_sum_ = p;
+}
+
+
+// Accessor for the sum of periods for tuples propagated via
+// dependencies on other entries.
+RtecScheduler::Period_t
+TAO_Reconfig_Scheduler_Entry::
+prop_tuple_period_sum ()
+{
+ return prop_tuple_period_sum_;
+}
+
+
+// Mutator for the sum of periods for tuples propagated via
+// dependencies on other entries.
+void
+TAO_Reconfig_Scheduler_Entry::
+prop_tuple_period_sum (RtecScheduler::Period_t p)
+{
+ prop_tuple_period_sum_ = p;
+}
+
+
+// Accessor for the number of tuples directly associated with the
+// entry.
+u_int
+TAO_Reconfig_Scheduler_Entry::
+orig_tuple_count ()
+{
+ return orig_tuple_count_;
+}
+
+
+// Mutator for the number of tuples directly associated with the
+// entry.
+void
+TAO_Reconfig_Scheduler_Entry::
+orig_tuple_count (u_int c)
+{
+ orig_tuple_count_ = c;
+}
+
+
+// Accessor for the number of tuples propagated via dependencies on
+// other entries.
+u_int
+TAO_Reconfig_Scheduler_Entry::
+prop_tuple_count ()
+{
+ return prop_tuple_count_;
+}
+
+
+// Mutator for the number of tuples propagated via dependencies on
+// other entries.
+void
+TAO_Reconfig_Scheduler_Entry::
+prop_tuple_count (u_int c)
+{
+ prop_tuple_count_ = c;
+}
+
+
+// Accessor for the set of tuples directly associated with the
+// entry.
+TUPLE_SET &
+TAO_Reconfig_Scheduler_Entry::
+orig_tuple_subset ()
+{
+ return orig_tuple_subset_;
+}
+
+
+// Accessor for the set of tuples propagated via dependencies on
+// other entries.
+TUPLE_SET &
+TAO_Reconfig_Scheduler_Entry::
+prop_tuple_subset ()
+{
+ return prop_tuple_subset_;
+}
+
+
+TAO_RT_Info_Tuple *
+TAO_Reconfig_Scheduler_Entry::
+current_admitted_tuple ()
+{
+ return current_admitted_tuple_;
+}
+
+
+void
+TAO_Reconfig_Scheduler_Entry::
+current_admitted_tuple (TAO_RT_Info_Tuple * t)
+{
+ current_admitted_tuple_ = t;
+}
+
+// Accessor for flag indicating whether or not node is enabled.
+
+RtecScheduler::RT_Info_Enabled_Type_t
+TAO_Reconfig_Scheduler_Entry::
+enabled_state () const
+{
+ return this->enabled_;
+}
+
+
+// Mutator for flag indicating whether or not node is enabled.
+
+void
+TAO_Reconfig_Scheduler_Entry::
+enabled_state (RtecScheduler::RT_Info_Enabled_Type_t et)
+{
+ this->enabled_ = et;
+}
+
+
+////////////////////////////////////////////
+
+TAO_RT_Info_Tuple_Visitor::~TAO_RT_Info_Tuple_Visitor (void)
+{
+}
+
+////////////////////////////////////////////
+// class TAO_Reconfig_Sched_Strategy_Base //
+////////////////////////////////////////////
+
+
+// Ordering function to compare the DFS finish times of
+// two RT_Info_Tuples
+int
+TAO_Reconfig_Sched_Strategy_Base::comp_tuple_finish_times (const void *first, const void *second)
+{
+ // Convert the passed pointers: the double cast is needed to
+ // make Sun C++ 4.2 happy.
+ TAO_RT_Info_Tuple **first_tuple =
+ reinterpret_cast<TAO_RT_Info_Tuple **> (const_cast<void *> (first));
+
+ //volatile_token is a TAO_Reconfig_Scheduler_Entry*, but we need to treat it as a void*
+ void * first_entry = ACE_LONGLONG_TO_PTR (void *,
+ (*first_tuple)->volatile_token);
+
+ TAO_RT_Info_Tuple **second_tuple =
+ reinterpret_cast<TAO_RT_Info_Tuple **> (const_cast<void *> (second));
+
+ //volatile_token is a TAO_Reconfig_Scheduler_Entry*, but we need to treat it as a void*
+ void * second_entry = ACE_LONGLONG_TO_PTR (TAO_Reconfig_Scheduler_Entry *,
+ (*second_tuple)->volatile_token);
+
+ return TAO_Reconfig_Sched_Strategy_Base::comp_entry_finish_times(first_entry,second_entry);
+}
+
+// Ordering function to compare the DFS finish times of
+// two task entries, so qsort orders these in topological
+// order, with the higher times *first*
+int
+TAO_Reconfig_Sched_Strategy_Base::comp_entry_finish_times (const void *first, const void *second)
+{
+ const TAO_Reconfig_Scheduler_Entry *first_entry =
+ * reinterpret_cast<const TAO_Reconfig_Scheduler_Entry *const *> (first);
+
+ const TAO_Reconfig_Scheduler_Entry *second_entry =
+ * reinterpret_cast<const TAO_Reconfig_Scheduler_Entry *const *> (second);
+
+ // sort blank entries to the end
+ if (! first_entry)
+ {
+ return (second_entry) ? 1 : 0;
+ }
+ else if (! second_entry)
+ {
+ return -1;
+ }
+
+ // sort disabled entries to the end
+ if (first_entry->enabled_state () == RtecScheduler::RT_INFO_DISABLED)
+ {
+ return (second_entry->enabled_state () == RtecScheduler::RT_INFO_DISABLED) ? 0 : 1;
+ }
+ else if (second_entry->enabled_state () == RtecScheduler::RT_INFO_DISABLED)
+ {
+ return -1;
+ }
+
+ // Sort entries with higher forward DFS finishing times before those
+ // with lower forward DFS finishing times.
+ if (first_entry->fwd_finished () >
+ second_entry->fwd_finished ())
+ {
+ return -1;
+ }
+ else if (first_entry->fwd_finished () <
+ second_entry->fwd_finished ())
+ {
+ return 1;
+ }
+
+ return 0;
+}
+
+// Determines whether or not an entry is critical, based on operation characteristics.
+// returns 1 if critical, 0 if not
+
+int
+TAO_Reconfig_Sched_Strategy_Base::is_critical (TAO_Reconfig_Scheduler_Entry &rse)
+{
+ // Look at the underlying RT_Info's criticality field.
+ return (rse.actual_rt_info ()->criticality == RtecScheduler::HIGH_CRITICALITY ||
+ rse.actual_rt_info ()->criticality == RtecScheduler::VERY_HIGH_CRITICALITY)
+ ? 1 : 0;
+}
+
+// Determines whether or not a tuple is critical, based on operation
+// characteristics. returns 1 if critical, 0 if not
+
+int
+TAO_Reconfig_Sched_Strategy_Base::is_critical (TAO_RT_Info_Tuple &t)
+{
+ // Look at the underlying RT_Info's criticality field.
+ return (t.criticality == RtecScheduler::HIGH_CRITICALITY ||
+ t.criticality == RtecScheduler::VERY_HIGH_CRITICALITY)
+ ? 1 : 0;
+}
+
+
+// Compares two entries by subpriority alone. Returns -1 if the first
+// one is higher, 0 if they're the same, and 1 if the second one is
+// higher.
+
+int
+TAO_Reconfig_Sched_Strategy_Base::compare_subpriority (TAO_Reconfig_Scheduler_Entry &lhs,
+ TAO_Reconfig_Scheduler_Entry &rhs)
+{
+ // First, compare importance.
+
+ if (lhs.actual_rt_info ()->importance > rhs.actual_rt_info ()->importance)
+ {
+ return -1;
+ }
+ else if (lhs.actual_rt_info ()->importance < rhs.actual_rt_info ()->importance)
+ {
+ return 1;
+ }
+
+ // Same importance, so look at dfs finish time as a tiebreaker.
+
+ else if (lhs.fwd_finished () > rhs.fwd_finished ())
+ {
+ return -1;
+ }
+ else if (lhs.fwd_finished () < rhs.fwd_finished ())
+ {
+ return 1;
+ }
+
+ // Same dfs finish time, so look at handle as a tiebreaker.
+
+ else if (lhs.actual_rt_info ()->handle > rhs.actual_rt_info ()->handle)
+ {
+ return -1;
+ }
+ else if (lhs.actual_rt_info ()->handle < rhs.actual_rt_info ()->handle)
+ {
+ return 1;
+ }
+
+ // They're the same if we got here.
+ return 0;
+}
+
+
+////////////////////////////////////////////////
+// class TAO_MUF_FAIR_Reconfig_Sched_Strategy //
+////////////////////////////////////////////////
+
+// Ordering function used to qsort an array of TAO_RT_Info_Tuple
+// pointers into a total <priority, subpriority> ordering. Returns -1
+// if the first one is higher, 0 if they're the same, and 1 if the
+// second one is higher.
+
+int
+TAO_MUF_FAIR_Reconfig_Sched_Strategy::total_priority_comp (const void *s, const void *t)
+{
+ // Convert the passed pointers: the double cast is needed to
+ // make Sun C++ 4.2 happy.
+ TAO_Reconfig_Scheduler_Entry **first =
+ reinterpret_cast<TAO_Reconfig_Scheduler_Entry **> (const_cast<void *> (s));
+ TAO_Reconfig_Scheduler_Entry **second =
+ reinterpret_cast<TAO_Reconfig_Scheduler_Entry **> (const_cast<void *> (t));
+
+ // Check the converted pointers.
+ if (first == 0 || *first == 0)
+ {
+ return (second == 0 || *second == 0) ? 0 : 1;
+ }
+ else if (second == 0 || *second == 0)
+ {
+ return -1;
+ }
+
+ // sort disabled entries to the end
+ if ((*first)->enabled_state () == RtecScheduler::RT_INFO_DISABLED)
+ {
+ return ((*second)->enabled_state () == RtecScheduler::RT_INFO_DISABLED) ? 0 : 1;
+ }
+ else if ((*second)->enabled_state () == RtecScheduler::RT_INFO_DISABLED)
+ {
+ return -1;
+ }
+
+ int result =
+ TAO_MUF_FAIR_Reconfig_Sched_Strategy::compare_priority (**first,
+ **second);
+
+ // Check whether they were distinguished by priority.
+ if (result == 0)
+ {
+ return TAO_Reconfig_Sched_Strategy_Base::compare_subpriority (**first,
+ **second);
+ }
+ else
+ {
+ return result;
+ }
+}
+
+
+// Ordering function used to qsort an array of RT_Info_Tuple
+// pointers into a total ordering for admission control. Returns
+// -1 if the first one is higher, 0 if they're the same, and 1 if
+// the second one is higher.
+
+int
+TAO_MUF_FAIR_Reconfig_Sched_Strategy::total_admission_comp (const void *s,
+ const void *t)
+{
+ // Convert the passed pointers: the double cast is needed to
+ // make Sun C++ 4.2 happy.
+ TAO_RT_Info_Tuple **first =
+ reinterpret_cast<TAO_RT_Info_Tuple **> (const_cast<void *> (s));
+
+ TAO_Reconfig_Scheduler_Entry * first_entry =
+ ACE_LONGLONG_TO_PTR (TAO_Reconfig_Scheduler_Entry *,
+ (*first)->volatile_token);
+
+ TAO_RT_Info_Tuple **second =
+ reinterpret_cast<TAO_RT_Info_Tuple **> (const_cast<void *> (t));
+
+ TAO_Reconfig_Scheduler_Entry * second_entry =
+ ACE_LONGLONG_TO_PTR (TAO_Reconfig_Scheduler_Entry *,
+ (*second)->volatile_token);
+
+ // Check the converted pointers.
+ if (first == 0 || *first == 0)
+ {
+ return (second == 0 || *second == 0) ? 0 : 1;
+ }
+ else if (second == 0 || *second == 0)
+ {
+ return -1;
+ }
+
+ // sort disabled tuples to the end
+ if ((*first)->enabled_state () == RtecScheduler::RT_INFO_DISABLED)
+ {
+ return ((*second)->enabled_state () == RtecScheduler::RT_INFO_DISABLED) ? 0 : 1;
+ }
+ else if ((*second)->enabled_state () == RtecScheduler::RT_INFO_DISABLED)
+ {
+ return -1;
+ }
+
+ // First, compare according to rate index.
+
+ if ((*first)->rate_index < (*second)->rate_index)
+ {
+ return -1;
+ }
+ else if ((*second)->rate_index < (*first)->rate_index)
+ {
+ return 1;
+ }
+
+ // Then compare by priority.
+
+ int result =
+ TAO_MUF_FAIR_Reconfig_Sched_Strategy::compare_priority (**first, **second);
+ if (result != 0)
+ {
+ return result;
+ }
+
+ // Then compare by subpriority.
+
+ result = TAO_Reconfig_Sched_Strategy_Base::compare_subpriority (*first_entry,
+ *second_entry);
+ if (result != 0)
+ {
+ return result;
+ }
+
+ return 0;
+}
+
+
+
+// Compares two RT_Info entries by priority alone. Returns -1 if the
+// first one is higher, 0 if they're the same, and 1 if the second one is higher.
+
+int
+TAO_MUF_FAIR_Reconfig_Sched_Strategy::compare_priority (TAO_Reconfig_Scheduler_Entry &lhs,
+ TAO_Reconfig_Scheduler_Entry &rhs)
+{
+ // In MUF, priority is per criticality level: compare criticalities.
+ if (lhs.actual_rt_info ()->criticality >
+ rhs.actual_rt_info ()->criticality)
+ {
+ return -1;
+ }
+ else if (lhs.actual_rt_info ()->criticality <
+ rhs.actual_rt_info ()->criticality)
+ {
+ return 1;
+ }
+
+ // They're the same if we got here.
+ return 0;
+}
+
+
+// Compares two RT_Info tuples by priority alone. Returns -1 if the
+// first one is higher, 0 if they're the same, and 1 if the second one is higher.
+
+int
+TAO_MUF_FAIR_Reconfig_Sched_Strategy::compare_priority (TAO_RT_Info_Tuple &lhs,
+ TAO_RT_Info_Tuple &rhs)
+{
+ // In MUF, priority is per criticality level: compare criticalities.
+ if (lhs.criticality > rhs.criticality)
+ {
+ return -1;
+ }
+ else if (lhs.criticality < rhs.criticality)
+ {
+ return 1;
+ }
+
+ // They're the same if we got here.
+ return 0;
+}
+
+
+// Fills in a static dispatch configuration for a priority level, based
+// on the operation characteristics of a representative scheduling entry.
+
+int
+TAO_MUF_FAIR_Reconfig_Sched_Strategy::assign_config (RtecScheduler::Config_Info &info,
+ TAO_Reconfig_Scheduler_Entry &rse)
+{
+ // Global and thread priority of dispatching queue are simply
+ // those assigned the representative operation it will dispatch.
+ info.preemption_priority = rse.actual_rt_info ()->preemption_priority;
+ info.thread_priority = rse.actual_rt_info ()->priority;
+
+ // Dispatching queues are all laxity-based in this strategy.
+ info.dispatching_type = RtecScheduler::LAXITY_DISPATCHING;
+
+ return 0;
+}
+
+///////////////////////////////////////////////////
+// class TAO_RMS_FAIR_Reconfig_Sched_Strategy //
+///////////////////////////////////////////////////
+
+
+// Ordering function used to qsort an array of TAO_RT_Info_Tuple
+// pointers into a total <priority, subpriority> ordering. Returns -1
+// if the first one is higher, 0 if they're the same, and 1 if the
+// second one is higher.
+
+int
+TAO_RMS_FAIR_Reconfig_Sched_Strategy::total_priority_comp (const void *s, const void *t)
+{
+ // Convert the passed pointers: the double cast is needed to
+ // make Sun C++ 4.2 happy.
+ TAO_Reconfig_Scheduler_Entry **first =
+ reinterpret_cast<TAO_Reconfig_Scheduler_Entry **> (const_cast<void *> (s));
+ TAO_Reconfig_Scheduler_Entry **second =
+ reinterpret_cast<TAO_Reconfig_Scheduler_Entry **> (const_cast<void *> (t));
+
+ // Check the converted pointers.
+ if (first == 0 || *first == 0)
+ {
+ return (second == 0 || *second == 0) ? 0 : 1;
+ }
+ else if (second == 0 || *second == 0)
+ {
+ return -1;
+ }
+
+ // sort disabled entries to the end
+ if ((*first)->enabled_state () == RtecScheduler::RT_INFO_DISABLED)
+ {
+ return ((*second)->enabled_state () == RtecScheduler::RT_INFO_DISABLED) ? 0 : 1;
+ }
+ else if ((*second)->enabled_state () == RtecScheduler::RT_INFO_DISABLED)
+ {
+ return -1;
+ }
+
+
+ // Check whether they are distinguished by priority, and if not,
+ // then by subpriority.
+
+ int result =
+ TAO_RMS_FAIR_Reconfig_Sched_Strategy::compare_priority (**first,
+ **second);
+
+ if (result == 0)
+ {
+ return TAO_Reconfig_Sched_Strategy_Base::compare_subpriority (**first,
+ **second);
+ }
+ else
+ {
+ return result;
+ }
+}
+
+
+// Ordering function used to qsort an array of RT_Info_Tuple
+// pointers into a total ordering for admission control. Returns
+// -1 if the first one is higher, 0 if they're the same, and 1 if
+// the second one is higher.
+
+int
+TAO_RMS_FAIR_Reconfig_Sched_Strategy::total_admission_comp (const void *s,
+ const void *t)
+{
+ // Convert the passed pointers: the double cast is needed to
+ // make Sun C++ 4.2 happy.
+ TAO_RT_Info_Tuple **first =
+ reinterpret_cast<TAO_RT_Info_Tuple **> (const_cast<void *> (s));
+
+ TAO_Reconfig_Scheduler_Entry * first_entry =
+ ACE_LONGLONG_TO_PTR (TAO_Reconfig_Scheduler_Entry *,
+ (*first)->volatile_token);
+
+ TAO_RT_Info_Tuple **second =
+ reinterpret_cast<TAO_RT_Info_Tuple **> (const_cast<void *> (t));
+
+ TAO_Reconfig_Scheduler_Entry * second_entry =
+ ACE_LONGLONG_TO_PTR (TAO_Reconfig_Scheduler_Entry *,
+ (*second)->volatile_token);
+
+ // Check the converted pointers.
+ if (first == 0 || *first == 0)
+ {
+ return (second == 0 || *second == 0) ? 0 : 1;
+ }
+ else if (second == 0 || *second == 0)
+ {
+ return -1;
+ }
+
+ // sort disabled tuples to the end
+ if ((*first)->enabled_state () == RtecScheduler::RT_INFO_DISABLED)
+ {
+ return ((*second)->enabled_state () == RtecScheduler::RT_INFO_DISABLED) ? 0 : 1;
+ }
+ else if ((*second)->enabled_state () == RtecScheduler::RT_INFO_DISABLED)
+ {
+ return -1;
+ }
+
+ // First, compare by rate index.
+
+ if ((*first)->rate_index < (*second)->rate_index)
+ {
+ return -1;
+ }
+ else if ((*second)->rate_index < (*first)->rate_index)
+ {
+ return 1;
+ }
+
+ // Then compare by priority.
+
+ int result =
+ TAO_RMS_FAIR_Reconfig_Sched_Strategy::compare_criticality (**first,
+ **second);
+ if (result != 0)
+ {
+ return result;
+ }
+
+ // Then compare by subpriority.
+
+ result = TAO_Reconfig_Sched_Strategy_Base::compare_subpriority (*first_entry,
+ *second_entry);
+ if (result != 0)
+ {
+ return result;
+ }
+
+ return 0;
+}
+
+
+// Compares two RT_Info entries by criticality alone. Returns -1 if the
+// first one is higher, 0 if they're the same, and 1 if the second one is higher.
+
+int
+TAO_RMS_FAIR_Reconfig_Sched_Strategy::compare_criticality(TAO_Reconfig_Scheduler_Entry &lhs,
+ TAO_Reconfig_Scheduler_Entry &rhs)
+{
+ ACE_UNUSED_ARG (lhs);
+ ACE_UNUSED_ARG (rhs);
+ // In RMS_FAIR, no consideration of criticalities
+ return 0;
+}
+
+// Compares two RT_Info entries by criticality alone. Returns -1 if the
+// first one is higher, 0 if they're the same, and 1 if the second one is higher.
+int
+TAO_RMS_FAIR_Reconfig_Sched_Strategy::compare_criticality(TAO_RT_Info_Tuple &lhs,
+ TAO_RT_Info_Tuple &rhs)
+{
+ ACE_UNUSED_ARG (lhs);
+ ACE_UNUSED_ARG (rhs);
+ // In plain RMS, no consideration of criticalities
+ return 0;
+}
+
+// Compares two RT_Info entries by priority alone. Returns -1 if the
+// first one is higher, 0 if they're the same, and 1 if the second one is higher.
+
+int
+TAO_RMS_FAIR_Reconfig_Sched_Strategy::compare_priority (TAO_Reconfig_Scheduler_Entry &lhs,
+ TAO_Reconfig_Scheduler_Entry &rhs)
+{
+ //differentiate by rate.
+ if (lhs.actual_rt_info ()->period < rhs.actual_rt_info ()->period)
+ {
+ return -1;
+ }
+ else if (lhs.actual_rt_info ()->period > rhs.actual_rt_info ()->period)
+ {
+ return 1;
+ }
+
+ // They're the same if we got here.
+ return 0;
+}
+
+
+// Compares two RT_Info tuples by priority alone. Returns -1 if the
+// first one is higher, 0 if they're the same, and 1 if the second one is higher.
+
+int
+TAO_RMS_FAIR_Reconfig_Sched_Strategy::compare_priority (TAO_RT_Info_Tuple &lhs,
+ TAO_RT_Info_Tuple &rhs)
+{
+ // In RMS_FAIR, priority is partitioned based on rate:
+ if (lhs.period < rhs.period)
+ {
+ return -1;
+ }
+ else if (lhs.period > rhs.period)
+ {
+ return 1;
+ }
+
+ // They're the same if we got here.
+ return 0;
+}
+
+
+// Fills in a static dispatch configuration for a priority level, based
+// on the operation characteristics of a representative scheduling entry.
+
+int
+TAO_RMS_FAIR_Reconfig_Sched_Strategy::assign_config (RtecScheduler::Config_Info &info,
+ TAO_Reconfig_Scheduler_Entry &rse)
+{
+ // Global and thread priority of dispatching queue are simply
+ // those assigned the representative operation it will dispatch.
+ info.preemption_priority = rse.actual_rt_info ()->preemption_priority;
+ info.thread_priority = rse.actual_rt_info ()->priority;
+
+ // In RMS_FAIR, all queues are static
+ info.dispatching_type = RtecScheduler::STATIC_DISPATCHING;
+
+ return 0;
+}
+
+///////////////////////////////////////////////////
+// class TAO_RMS_MLF_Reconfig_Sched_Strategy //
+///////////////////////////////////////////////////
+
+
+// Ordering function used to qsort an array of TAO_RT_Info_Tuple
+// pointers into a total <priority, subpriority> ordering. Returns -1
+// if the first one is higher, 0 if they're the same, and 1 if the
+// second one is higher.
+
+int
+TAO_RMS_MLF_Reconfig_Sched_Strategy::total_priority_comp (const void *s, const void *t)
+{
+ // Convert the passed pointers: the double cast is needed to
+ // make Sun C++ 4.2 happy.
+ TAO_Reconfig_Scheduler_Entry **first =
+ reinterpret_cast<TAO_Reconfig_Scheduler_Entry **> (const_cast<void *> (s));
+ TAO_Reconfig_Scheduler_Entry **second =
+ reinterpret_cast<TAO_Reconfig_Scheduler_Entry **> (const_cast<void *> (t));
+
+ // Check the converted pointers.
+ if (first == 0 || *first == 0)
+ {
+ return (second == 0 || *second == 0) ? 0 : 1;
+ }
+ else if (second == 0 || *second == 0)
+ {
+ return -1;
+ }
+
+ // sort disabled entries to the end
+ if ((*first)->enabled_state () == RtecScheduler::RT_INFO_DISABLED)
+ {
+ return ((*second)->enabled_state () == RtecScheduler::RT_INFO_DISABLED) ? 0 : 1;
+ }
+ else if ((*second)->enabled_state () == RtecScheduler::RT_INFO_DISABLED)
+ {
+ return -1;
+ }
+
+
+ // Check whether they are distinguished by priority, and if not,
+ // then by subpriority.
+
+ int result =
+ TAO_RMS_MLF_Reconfig_Sched_Strategy::compare_priority (**first,
+ **second);
+
+ if (result == 0)
+ {
+ return TAO_Reconfig_Sched_Strategy_Base::compare_subpriority (**first,
+ **second);
+ }
+ else
+ {
+ return result;
+ }
+}
+
+
+// Ordering function used to qsort an array of RT_Info_Tuple
+// pointers into a total ordering for admission control. Returns
+// -1 if the first one is higher, 0 if they're the same, and 1 if
+// the second one is higher.
+
+int
+TAO_RMS_MLF_Reconfig_Sched_Strategy::total_admission_comp (const void *s,
+ const void *t)
+{
+ // Convert the passed pointers: the double cast is needed to
+ // make Sun C++ 4.2 happy.
+ TAO_RT_Info_Tuple **first =
+ reinterpret_cast<TAO_RT_Info_Tuple **> (const_cast<void *> (s));
+
+ TAO_Reconfig_Scheduler_Entry * first_entry =
+ ACE_LONGLONG_TO_PTR (TAO_Reconfig_Scheduler_Entry *,
+ (*first)->volatile_token);
+
+ TAO_RT_Info_Tuple **second =
+ reinterpret_cast<TAO_RT_Info_Tuple **> (const_cast<void *> (t));
+
+ TAO_Reconfig_Scheduler_Entry * second_entry =
+ ACE_LONGLONG_TO_PTR (TAO_Reconfig_Scheduler_Entry *,
+ (*second)->volatile_token);
+
+ // Check the converted pointers.
+ if (first == 0 || *first == 0)
+ {
+ return (second == 0 || *second == 0) ? 0 : 1;
+ }
+ else if (second == 0 || *second == 0)
+ {
+ return -1;
+ }
+
+ // sort disabled tuples to the end
+ if ((*first)->enabled_state () == RtecScheduler::RT_INFO_DISABLED)
+ {
+ return ((*second)->enabled_state () == RtecScheduler::RT_INFO_DISABLED) ? 0 : 1;
+ }
+ else if ((*second)->enabled_state () == RtecScheduler::RT_INFO_DISABLED)
+ {
+ return -1;
+ }
+
+ // First, compare by rate index.
+
+ if ((*first)->rate_index < (*second)->rate_index)
+ {
+ return -1;
+ }
+ else if ((*second)->rate_index < (*first)->rate_index)
+ {
+ return 1;
+ }
+
+ // Then compare by priority.
+
+ int result =
+ TAO_RMS_MLF_Reconfig_Sched_Strategy::compare_criticality (**first,
+ **second);
+ if (result != 0)
+ {
+ return result;
+ }
+
+ // Then compare by subpriority.
+
+ result = TAO_Reconfig_Sched_Strategy_Base::compare_subpriority (*first_entry,
+ *second_entry);
+ if (result != 0)
+ {
+ return result;
+ }
+
+ return 0;
+}
+
+
+// Compares two RT_Info entries by criticality alone. Returns -1 if the
+// first one is higher, 0 if they're the same, and 1 if the second one is higher.
+
+int
+TAO_RMS_MLF_Reconfig_Sched_Strategy::compare_criticality(TAO_Reconfig_Scheduler_Entry &lhs,
+ TAO_Reconfig_Scheduler_Entry &rhs)
+{
+ // In RMS+MLF, priority is per criticality level: compare criticalities.
+
+ if (lhs.actual_rt_info ()->criticality > rhs.actual_rt_info ()->criticality)
+ {
+ return -1;
+ }
+ else if (lhs.actual_rt_info ()->criticality < rhs.actual_rt_info ()->criticality)
+ {
+ return 1;
+ }
+ else
+ {
+ return 0;
+ }
+}
+
+// Compares two RT_Info entries by criticality alone. Returns -1 if the
+// first one is higher, 0 if they're the same, and 1 if the second one is higher.
+int
+TAO_RMS_MLF_Reconfig_Sched_Strategy::compare_criticality(TAO_RT_Info_Tuple &lhs,
+ TAO_RT_Info_Tuple &rhs)
+{
+ if (lhs.criticality > rhs.criticality)
+ {
+ return -1;
+ }
+ else if (lhs.criticality < rhs.criticality)
+ {
+ return 1;
+ }
+ else
+ {
+ return 0;
+ }
+}
+
+// Compares two RT_Info entries by priority alone. Returns -1 if the
+// first one is higher, 0 if they're the same, and 1 if the second one is higher.
+
+int
+TAO_RMS_MLF_Reconfig_Sched_Strategy::compare_priority (TAO_Reconfig_Scheduler_Entry &lhs,
+ TAO_Reconfig_Scheduler_Entry &rhs)
+{
+ // In RMS+MLF, priority is per criticality level: compare criticalities.
+ int result = TAO_RMS_MLF_Reconfig_Sched_Strategy::compare_criticality(lhs, rhs);
+
+ if (result != 0)
+ {
+ return result;
+ }
+
+ // Same criticality: if high criticality, differentiate by rate.
+ if (TAO_Reconfig_Sched_Strategy_Base::is_critical (rhs))
+ {
+ if (lhs.actual_rt_info ()->period < rhs.actual_rt_info ()->period)
+ {
+ return -1;
+ }
+ else if (lhs.actual_rt_info ()->period > rhs.actual_rt_info ()->period)
+ {
+ return 1;
+ }
+ }
+
+ // They're the same if we got here.
+ return 0;
+}
+
+
+// Compares two RT_Info tuples by priority alone. Returns -1 if the
+// first one is higher, 0 if they're the same, and 1 if the second one is higher.
+
+int
+TAO_RMS_MLF_Reconfig_Sched_Strategy::compare_priority (TAO_RT_Info_Tuple &lhs,
+ TAO_RT_Info_Tuple &rhs)
+{
+ // In RMS_Dyn, priority is first partitioned per criticality level:
+ // compare criticalities.
+
+ if (lhs.criticality > rhs.criticality)
+ {
+ return -1;
+ }
+ else if (lhs.criticality < rhs.criticality)
+ {
+ return 1;
+ }
+
+ // Same criticality: if high criticality, differentiate by rate.
+ else if (TAO_Reconfig_Sched_Strategy_Base::is_critical (rhs))
+ {
+ if (lhs.period < rhs.period)
+ {
+ return -1;
+ }
+ else if (lhs.period > rhs.period)
+ {
+ return 1;
+ }
+ }
+
+ // They're the same if we got here.
+ return 0;
+}
+
+// Fills in a static dispatch configuration for a priority level, based
+// on the operation characteristics of a representative scheduling entry.
+
+int
+TAO_RMS_MLF_Reconfig_Sched_Strategy::assign_config (RtecScheduler::Config_Info &info,
+ TAO_Reconfig_Scheduler_Entry &rse)
+{
+ // Global and thread priority of dispatching queue are simply
+ // those assigned the representative operation it will dispatch.
+ info.preemption_priority = rse.actual_rt_info ()->preemption_priority;
+ info.thread_priority = rse.actual_rt_info ()->priority;
+
+ // Critical queues are static, and non-critical ones are
+ // laxity-based in this strategy.
+ if (TAO_Reconfig_Sched_Strategy_Base::is_critical (rse))
+ {
+ info.dispatching_type = RtecScheduler::STATIC_DISPATCHING;
+ }
+ else
+ {
+ info.dispatching_type = RtecScheduler::LAXITY_DISPATCHING;
+ }
+
+ return 0;
+}
+
+
+#endif /* TAO_RECONFIG_SCHED_UTILS_C */
+
+TAO_END_VERSIONED_NAMESPACE_DECL
diff --git a/TAO/orbsvcs/orbsvcs/Sched/Reconfig_Sched_Utils.h b/TAO/orbsvcs/orbsvcs/Sched/Reconfig_Sched_Utils.h
new file mode 100644
index 00000000000..408d42bb56f
--- /dev/null
+++ b/TAO/orbsvcs/orbsvcs/Sched/Reconfig_Sched_Utils.h
@@ -0,0 +1,669 @@
+// -*- C++ -*-
+
+// $Id$
+
+// ============================================================================
+//
+// = LIBRARY
+// orbsvcs
+//
+// = FILENAME
+// Reconfig_Scheduler_Utils.h
+//
+// = AUTHOR
+// Chris Gill <cdgill@cs.wustl.edu>
+//
+// ============================================================================
+
+#ifndef TAO_RECONFIG_SCHED_UTILS_H
+#define TAO_RECONFIG_SCHED_UTILS_H
+#include /**/ "ace/pre.h"
+
+// Uncomment this to turn on some extra trace level debugging info,
+// comment it out to turn off that extra debugging info.
+//#define SCHEDULER_LOGGING
+
+#include "ace/config-all.h"
+
+#include "orbsvcs/Scheduler_Factory.h"
+#include "orbsvcs/RtecSchedulerS.h"
+#include "orbsvcs/Sched/sched_export.h"
+
+#if !defined (ACE_LACKS_PRAGMA_ONCE)
+# pragma once
+#endif /* ACE_LACKS_PRAGMA_ONCE */
+
+TAO_BEGIN_VERSIONED_NAMESPACE_DECL
+
+struct TAO_RTSched_Export TAO_RT_Info_Ex
+ : public RtecScheduler::RT_Info
+ // = TITLE
+ // A wrapper class for the IDL-generated RT_Info operation descriptors.
+ //
+ // = DESCRIPTION
+ // This class provides (re)initialization methods and a validity flag
+ // for the underlying IDL-generated RT_Info descriptor.
+{
+ TAO_RT_Info_Ex ();
+ // Default Constructor.
+
+ TAO_RT_Info_Ex (const RtecScheduler::RT_Info &);
+ // Constructor from an RT_Info
+ // (also serves as a copy constructor).
+
+ virtual ~TAO_RT_Info_Ex ();
+ // Destructor.
+
+ void operator = (const RtecScheduler::RT_Info &);
+ // Assignment operator with an RT_Info on the RHS.
+
+ virtual void reset (u_long reset_flags);
+ // Resets output data members to initial values, and removes tuples
+ // corresponding to the reset flags.
+
+ virtual void enabled_state (RtecScheduler::RT_Info_Enabled_Type_t);
+ // Sets the info and underlying entry's enable states.
+
+ virtual RtecScheduler::RT_Info_Enabled_Type_t enabled_state ();
+ // Returns the info's enable state.
+};
+
+
+struct TAO_RTSched_Export TAO_RT_Info_Tuple
+ : public TAO_RT_Info_Ex
+ // = TITLE
+ // An implementation class used to wrap available operation descriptors.
+ // Each operation may have one or more tuples describing different rates,
+ // etc., for the same operation.
+ //
+ // = DESCRIPTION
+ // This class enables admission control within the Reconfig Scheduler,
+ // which offers improved performance compared to admission control
+ // outside the scheduler.
+{
+ TAO_RT_Info_Tuple ();
+ // Default Constructor.
+
+ TAO_RT_Info_Tuple (const RtecScheduler::RT_Info &);
+ // Constructor from an RT_Info.
+ // (also serves as a copy constructor).
+
+ virtual ~TAO_RT_Info_Tuple ();
+ // Destructor.
+
+ void operator = (const RtecScheduler::RT_Info &);
+ // Assignment operator with an RT_Info on the RHS.
+
+ bool operator < (const TAO_RT_Info_Tuple &t);
+ // Less-than comparison operator: orders tuples by ascending rate (descending period).
+
+ u_long rate_index;
+ // Index of the tuple in the operation's ordered available rates
+};
+
+
+class TAO_RTSched_Export TAO_Reconfig_Scheduler_Entry
+ // = TITLE
+ // An implementation class used to decouple the available descriptors
+ // from the admitted descriptors, and to store interim scheduling results
+ // such as DFS finishing order, etc.
+ //
+ // = DESCRIPTION
+ // This class improves the performance of the Reconfig Scheduler
+ // by saving information from one computation for use in other
+ // computations, and simplifies the implementation logic.
+{
+public:
+
+ // Info for DFS traversal, topological sort of call graph.
+ enum DFS_Status {NOT_VISITED, VISITED, FINISHED};
+
+ enum Tuple_Type {ORIGINAL = 0x01UL, PROPAGATED = 0x02UL};
+
+ TAO_Reconfig_Scheduler_Entry (TAO_RT_Info_Ex &rt_info);
+ // Constructor.
+
+ ~TAO_Reconfig_Scheduler_Entry ();
+ // Destructor.
+
+ void remove_tuples (u_long tuple_flags = ORIGINAL | PROPAGATED);
+ // Removes all tuples from the entry.
+
+ int insert_tuple (TAO_RT_Info_Tuple &tuple,
+ Tuple_Type tuple_type = ORIGINAL,
+ int replace = 0);
+ // Inserts a tuple into the appropriate tuple multiset.
+
+ int update_tuple (TAO_RT_Info_Ex &info,
+ Tuple_Type tuple_type = ORIGINAL);
+ // Updates a matching tuple.
+
+ int register_tuples (TAO_RT_Info_Tuple ** tuple_ptr_array,
+ long &tuple_count);
+ // Registers tuples into the passed tuple pointer array.
+
+ TAO_RT_Info_Ex & orig_rt_info_data (void);
+ // Accessor for stored original RT_Info data.
+
+ void orig_rt_info_data (TAO_RT_Info_Ex &data);
+ // Mutator for stored original RT_Info data.
+
+ TAO_RT_Info_Ex * actual_rt_info ();
+ // Accessor for actual RT_Info.
+
+ void actual_rt_info (TAO_RT_Info_Ex *);
+ // Mutator for actual RT_Info.
+
+ long fwd_discovered () const;
+ // Accessor for when the node was discovered in forward DFS traversal.
+
+ void fwd_discovered (long l);
+ // Mutator for when the node was discovered in forward DFS traversal.
+
+ long rev_discovered () const;
+ // Accessor for when the node was discovered in reverse DFS traversal.
+
+ void rev_discovered (long l);
+ // Mutator for when the node was discovered in reverse DFS traversal.
+
+ long fwd_finished () const;
+ // Accessor for when the node was finished in forward DFS traversal.
+
+ void fwd_finished (long l);
+ // Mutator for when the node was finished in forward DFS traversal.
+
+ long rev_finished () const;
+ // Accessor for when the node was finished in reverse DFS traversal.
+
+ void rev_finished (long l);
+ // Mutator for when the node was finished in reverse DFS traversal.
+
+ DFS_Status fwd_dfs_status () const;
+ // Accessor for forward DFS traversal status of the node.
+
+ DFS_Status rev_dfs_status () const;
+ // Accessor for reverse DFS traversal status of the node.
+
+ void fwd_dfs_status (DFS_Status ds);
+ // Mutator for forward DFS traversal status of the node.
+
+ void rev_dfs_status (DFS_Status ds);
+ // Mutator for reverse DFS traversal status of the node.
+
+ int is_thread_delineator () const;
+ // Accessor for flag indicating whether node is a thread
+ // delineator.
+
+ void is_thread_delineator (int i);
+ // Mutator for flag indicating whether node is a thread
+ // delineator.
+
+ int has_unresolved_remote_dependencies () const;
+ // Accessor for flag indicating whether node has unresolved remote
+ // dependencies.
+
+ void has_unresolved_remote_dependencies (int i);
+ // Mutator for flag indicating whether node has unresolved remote
+ // dependencies.
+
+ int has_unresolved_local_dependencies () const;
+ // Accessor for flag indicating whether node has unresolved local
+ // dependencies.
+
+ void has_unresolved_local_dependencies (int i);
+ // Mutator for flag indicating whether node has unresolved local
+ // dependencies.
+
+ RtecScheduler::Time aggregate_exec_time ();
+ // Accessor for effective execution time of the corresponding
+ // RT_Info and all of its disjunctively (i.e., dispatching waveforms
+ // are additive) executed dependants.
+
+ void aggregate_exec_time (RtecScheduler::Time t);
+ // Mutator for effective execution time of the corresponding RT_Info
+ // and its disjunctively executed dependants.
+
+ RtecScheduler::Period_t orig_tuple_period_sum ();
+ // Accessor for the sum of periods for tuples directly associated
+ // with the entry. It can be used to compute the mean rate for the
+ // entry.
+
+ void orig_tuple_period_sum (RtecScheduler::Period_t p);
+ // Mutator for the sum of periods for tuples directly associated
+ // with the entry. It can be used to compute the mean rate for the
+ // entry.
+
+ RtecScheduler::Period_t prop_tuple_period_sum ();
+ // Accessor for the sum of periods for tuples propagated via
+ // dependencies on other entries. It can be used to compute the
+ // mean rate for the entry.
+
+ void prop_tuple_period_sum (RtecScheduler::Period_t p);
+ // Mutator for the sum of periods for tuples propagated via
+ // dependencies on other entries. It can be used to compute the
+ // mean rate for the entry.
+
+ u_int orig_tuple_count ();
+ // Accessor for the number of tuples directly associated with the
+ // entry.
+
+ void orig_tuple_count (u_int c);
+ // Mutator for the number of tuples directly associated with the
+ // entry.
+
+ u_int prop_tuple_count ();
+ // Accessor for the number of tuples propagated via dependencies on
+ // other entries.
+
+ void prop_tuple_count (u_int c);
+ // Mutator for the number of tuples propagated via dependencies on
+ // other entries.
+
+ TUPLE_SET& orig_tuple_subset ();
+ // Accessor for the set of tuples directly associated with the
+ // entry.
+
+ TUPLE_SET& prop_tuple_subset ();
+ // Accessor for the set of tuples propagated via dependencies on
+ // other entries.
+
+ TAO_RT_Info_Tuple * current_admitted_tuple ();
+ // Returns a pointer to the entry's most recently admitted tuple.
+ // The pointer is zero if no tuples have been admitted so far.
+
+ void current_admitted_tuple (TAO_RT_Info_Tuple *);
+ // Sets a pointer to the entry's most recently admitted tuple.
+ // The pointer is zero if no tuples have been admitted so far.
+
+ RtecScheduler::RT_Info_Enabled_Type_t enabled_state () const;
+ // Accessor for flag indicating whether or not node is enabled.
+
+ void enabled_state (RtecScheduler::RT_Info_Enabled_Type_t);
+ // Mutator for flag indicating whether or not node is enabled.
+
+/* WSOA merge - commented out
+ RtecScheduler::Period_t effective_period ();
+ // Accessor for effective period of corresponding RT_Info.
+
+ void effective_period (RtecScheduler::Period_t p);
+ // Mutator for effective period of corresponding RT_Info.
+
+ CORBA::Long effective_exec_multiplier ();
+ // Accessor for effective execution time multiplier of corresponding
+ // RT_Info.
+
+ void effective_exec_multiplier (CORBA::Long l);
+ // Mutator for effective execution time multiplier of corresponding
+ // RT_Info.
+*/
+
+private:
+
+ TAO_RT_Info_Ex orig_rt_info_data_;
+ // Stores the values of operation characteristics as they were specified
+ // in the most recent call to the Reconfig_Scheduler's set () method.
+ // That way, the scheduler propagation pass can overwrite RT_Info fields
+ // without losing the original values. This is useful when
+
+ TAO_RT_Info_Ex *actual_rt_info_;
+ // Points to the actual RT_Info to which the schedling entry corresponds.
+
+ DFS_Status fwd_dfs_status_;
+ // Forward depth-first-search status of the entry.
+
+ DFS_Status rev_dfs_status_;
+ // Reverse depth-first-search status of the entry.
+
+ long fwd_discovered_;
+ // Forward depth-first-search discovery order of the entry.
+
+ long rev_discovered_;
+ // Reverse depth-first-search discovery order of the entry.
+
+ long fwd_finished_;
+ // Forward depth-first-search completion order of the entry.
+
+ long rev_finished_;
+ // Reverse depth-first-search completion order of the entry.
+
+ int is_thread_delineator_;
+ // Flag identifying threads in the call graph.
+
+ int has_unresolved_remote_dependencies_;
+ // Flag indicating whether or not there are unresolved remote
+ // dependencies in the entry's dependency call chain.
+
+ int has_unresolved_local_dependencies_;
+ // Flag indicating whether or not there are unresolved local
+ // dependencies in the entry's dependency call chain.
+
+ RtecScheduler::Time aggregate_exec_time_;
+ // Effective execution time for corresponding RT_Info and its
+ // disjunctively executed dependants.
+
+ RtecScheduler::Period_t orig_tuple_period_sum_;
+ // Sum of periods for tuples directly associated with the entry. It
+ // can be used to compute the mean rate for the entry.
+
+ RtecScheduler::Period_t prop_tuple_period_sum_;
+ // The sum of periods for tuples propagated via dependencies on
+ // other entries. It can be used to compute the mean rate for the
+ // entry.
+
+ u_int orig_tuple_count_;
+ // The number of tuples directly associated with the entry.
+
+ u_int prop_tuple_count_;
+ // The number of tuples propagated via dependencies on other
+ // entries.
+
+ TUPLE_SET orig_tuple_subset_;
+ // The set of tuples directly associated with the entry.
+
+ TUPLE_SET prop_tuple_subset_;
+ // The set of tuples propagated via dependencies on other entries.
+
+ TAO_RT_Info_Tuple * current_admitted_tuple_;
+ // A pointer to the entry's most recently admitted tuple.
+
+ RtecScheduler::RT_Info_Enabled_Type_t enabled_;
+ // Flag indicating whether or not node is enabled.
+
+ /* - WSOA merge - commented out
+ CORBA::Long effective_exec_multiplier_;
+ // Effective execution time multiplier for corresponding RT_Info.
+
+ RtecScheduler::Period_t effective_period_;
+ // Effective period of corresponding RT_Info.
+ */
+};
+
+
+class TAO_RTSched_Export TAO_Reconfig_Sched_Entry_Visitor
+ // = TITLE
+ // An abstract base class for scheduler entry visitors.
+ //
+ // = DESCRIPTION
+ // This class simplifies the reconfig scheduler implementation
+ // by giving a common interface for distinct visitors over the
+ // scheduling entries.
+{
+public:
+
+ /// Destructor.
+ virtual ~TAO_Reconfig_Sched_Entry_Visitor (void);
+
+ virtual int visit (TAO_Reconfig_Scheduler_Entry &) = 0;
+ // Visit a Reconfig Scheduler Entry.
+
+};
+
+
+class TAO_RTSched_Export TAO_RSE_Reset_Visitor :
+ public TAO_Reconfig_Sched_Entry_Visitor
+ // = TITLE
+ // A scheduler entry visitor that resets nodes.
+ //
+ // = DESCRIPTION
+ // This class resets each node it visits to an initial state
+ // prior to the first DFS traversal for topological sorting.
+{
+public:
+
+ TAO_RSE_Reset_Visitor ();
+ // Constructor.
+
+ virtual ~TAO_RSE_Reset_Visitor () {}
+ // Destructor.
+
+ virtual int visit (TAO_Reconfig_Scheduler_Entry &rse);
+ // Resets the fields in the entry to pre-DFS traversal states.
+ // Returns 0 on success and -1 on error.
+};
+
+class TAO_RTSched_Export TAO_RT_Info_Tuple_Visitor
+ // = TITLE
+ // An abstract base class for RT_Info tuple visitors.
+ //
+ // = DESCRIPTION
+ // This class simplifies the reconfig scheduler implementation
+ // by giving a common interface for distinct visitors over the
+ // RT_Info tuples.
+{
+public:
+
+ /// Destructor.
+ virtual ~TAO_RT_Info_Tuple_Visitor (void);
+
+ virtual int visit (TAO_RT_Info_Tuple &) = 0;
+ // Visit a RT_Info tuple.
+
+};
+
+class TAO_RTSched_Export TAO_Reconfig_Sched_Strategy_Base
+ // = TITLE
+ // A base class for scheduling strategies
+ //
+ // = DESCRIPTION This class provides a DFS finish time comparison
+ // function, a static subpriority comparison function, and a
+ // criticality evaluation function for all scheduling strategies.
+{
+public:
+
+ static int comp_tuple_finish_times (const void *first, const void *second);
+ // Ordering function to compare the DFS finish times of
+ // two RT_Info_Tuples
+
+ static int comp_entry_finish_times (const void *first, const void *second);
+ // Ordering function to compare the DFS finish times of
+ // two task entries, so qsort orders these in topological
+ // order, with the higher times *first*.
+
+ static int is_critical (TAO_Reconfig_Scheduler_Entry &rse);
+ // Determines whether or not an entry is critical, based on
+ // operation characteristics. returns 1 if critical, 0 if not
+
+ static int is_critical (TAO_RT_Info_Tuple &t);
+ // Determines whether or not a tuple is critical, based on operation
+ // characteristics. returns 1 if critical, 0 if not
+
+ static int compare_subpriority (TAO_Reconfig_Scheduler_Entry &,
+ TAO_Reconfig_Scheduler_Entry &);
+ // Compares two entries by subpriority alone. Returns -1 if the
+ // first one is higher, 0 if they're the same, and 1 if the second one is higher.
+};
+
+class TAO_RTSched_Export TAO_MUF_FAIR_Reconfig_Sched_Strategy
+ : public TAO_Reconfig_Sched_Strategy_Base
+ // = TITLE
+ // A scheduling strategy that implements the Maximum Urgency First
+ // scheduling algorithm with Fair Admission of Indexed Rates
+ // (FAIR).
+ //
+ // = DESCRIPTION
+ // The strategy assigns static thread and global priority according
+ // to operation criticality, assigns static subpriority according to
+ // importance and then topological order, and assigns a dispatching
+ // configuration with a minimum laxity dispatching queue for each
+ // distinct criticality level. It admits operation tuples in order
+ // of ascending rate index, where the lowest rate for an operation
+ // has index 0, the next higher rate has index 1, etc.
+{
+public:
+
+ static int total_priority_comp (const void *, const void *);
+ // Ordering function used to qsort an array of RT_Info_Tuple
+ // pointers into a total <priority, subpriority> ordering. Returns
+ // -1 if the first one is higher, 0 if they're the same, and 1 if
+ // the second one is higher.
+
+ static int total_admission_comp (const void *, const void *);
+ // Ordering function used to qsort an array of RT_Info_Tuple
+ // pointers into a total ordering for admission control. Returns
+ // -1 if the first one is higher, 0 if they're the same, and 1 if
+ // the second one is higher.
+
+ static int compare_priority (TAO_Reconfig_Scheduler_Entry &,
+ TAO_Reconfig_Scheduler_Entry &);
+ // Compares two entries by priority alone. Returns -1 if the
+ // first one is higher, 0 if they're the same, and 1 if the second one is higher.
+
+ static int compare_priority (TAO_RT_Info_Tuple &,
+ TAO_RT_Info_Tuple &);
+ // Compares two tuples by priority alone. Returns -1 if the
+ // first one is higher, 0 if they're the same, and 1 if the second one is higher.
+
+ static int compare_admission_order (TAO_RT_Info_Tuple &,
+ TAO_RT_Info_Tuple &);
+ // Compares two tuples by the given admission ordering. Returns -1 if the
+ // first one is earlier, 0 if they're the same, and 1 if the second one is earlier.
+
+ static int assign_config (RtecScheduler::Config_Info &,
+ TAO_Reconfig_Scheduler_Entry &);
+ // Fills in a static dispatch configuration for a priority level, based
+ // on the operation characteristics of a representative scheduling entry.
+};
+
+class TAO_RTSched_Export TAO_RMS_FAIR_Reconfig_Sched_Strategy
+ : public TAO_Reconfig_Sched_Strategy_Base
+ // = TITLE
+ // A scheduling strategy that implements the Boeing RMS-Dynamic
+ // scheduling algorithm, and the Honeywell MNO admission control
+ // algorithm.
+ //
+ // = DESCRIPTION
+ // The strategy assigns static thread and global priority
+ // according to criticality and rate, assigns static subpriority
+ // according to importance and then topological order, and assigns
+ // a dispatching configuration with a static dispatching queue for
+ // each high criticality rate, and a single minimum laxity
+ // dispatching queue for all low criticality operations. It
+ // admits the lowest rate-index tuple for each operation, then
+ // admits operations at their highest admissible rates in priority
+ // order.
+{
+public:
+
+ static int total_priority_comp (const void *, const void *);
+ // Ordering function used to qsort an array of RT_Info_Tuple
+ // pointers into a total <priority, subpriority> ordering. Returns
+ // -1 if the first one is higher, 0 if they're the same, and 1 if
+ // the second one is higher.
+
+ static int total_admission_comp (const void *, const void *);
+ // Ordering function used to qsort an array of RT_Info_Tuple
+ // pointers into a total ordering for admission control. Returns
+ // -1 if the first one is higher, 0 if they're the same, and 1 if
+ // the second one is higher.
+
+ static int compare_criticality(TAO_Reconfig_Scheduler_Entry &lhs,
+ TAO_Reconfig_Scheduler_Entry &rhs);
+ // Compares two entries by criticality alone. Returns -1 if the
+ // first one is higher, 0 if they're the same, and 1 if the second one is higher.
+
+ static int compare_criticality(TAO_RT_Info_Tuple &lhs,
+ TAO_RT_Info_Tuple &rhs);
+ // Compares two entries by criticality alone. Returns -1 if the
+ // first one is higher, 0 if they're the same, and 1 if the second one is higher.
+
+ static int compare_priority (TAO_Reconfig_Scheduler_Entry &,
+ TAO_Reconfig_Scheduler_Entry &);
+ // Compares two entries by priority alone. Returns -1 if the
+ // first one is higher, 0 if they're the same, and 1 if the second one is higher.
+
+ static int compare_priority (TAO_RT_Info_Tuple &,
+ TAO_RT_Info_Tuple &);
+ // Compares two tuples by priority alone. Returns -1 if the
+ // first one is higher, 0 if they're the same, and 1 if the second one is higher.
+
+ static int compare_admission_order (TAO_RT_Info_Tuple &,
+ TAO_RT_Info_Tuple &);
+ // Compares two entries by admission ordering policy. Returns -1 if the
+ // first one is earlier, 0 if they're the same, and 1 if the second one is earlier.
+
+ static int compare_subpriority (TAO_Reconfig_Scheduler_Entry &,
+ TAO_Reconfig_Scheduler_Entry &);
+ // Compares two entries by subpriority alone. Returns -1 if the
+ // first one is higher, 0 if they're the same, and 1 if the second one is higher.
+
+ static int assign_config (RtecScheduler::Config_Info &,
+ TAO_Reconfig_Scheduler_Entry &);
+ // Fills in a static dispatch configuration for a priority level, based
+ // on the operation characteristics of a representative scheduling entry.
+};
+
+class TAO_RTSched_Export TAO_RMS_MLF_Reconfig_Sched_Strategy
+ : public TAO_Reconfig_Sched_Strategy_Base
+ // = TITLE
+ // A scheduling strategy that implements the Boeing RMS-Dynamic
+ // scheduling algorithm, and the Honeywell MNO admission control
+ // algorithm.
+ //
+ // = DESCRIPTION
+ // The strategy assigns static thread and global priority
+ // according to criticality and rate, assigns static subpriority
+ // according to importance and then topological order, and assigns
+ // a dispatching configuration with a static dispatching queue for
+ // each high criticality rate, and a single minimum laxity
+ // dispatching queue for all low criticality operations. It
+ // admits the lowest rate-index tuple for each operation, then
+ // admits operations at their highest admissible rates in priority
+ // order.
+{
+public:
+
+ static int total_priority_comp (const void *, const void *);
+ // Ordering function used to qsort an array of RT_Info_Tuple
+ // pointers into a total <priority, subpriority> ordering. Returns
+ // -1 if the first one is higher, 0 if they're the same, and 1 if
+ // the second one is higher.
+
+ static int total_admission_comp (const void *, const void *);
+ // Ordering function used to qsort an array of RT_Info_Tuple
+ // pointers into a total ordering for admission control. Returns
+ // -1 if the first one is higher, 0 if they're the same, and 1 if
+ // the second one is higher.
+
+ static int compare_criticality(TAO_Reconfig_Scheduler_Entry &lhs,
+ TAO_Reconfig_Scheduler_Entry &rhs);
+ // Compares two entries by criticality alone. Returns -1 if the
+ // first one is higher, 0 if they're the same, and 1 if the second one is higher.
+
+ static int compare_criticality(TAO_RT_Info_Tuple &lhs,
+ TAO_RT_Info_Tuple &rhs);
+ // Compares two entries by criticality alone. Returns -1 if the
+ // first one is higher, 0 if they're the same, and 1 if the second one is higher.
+
+ static int compare_priority (TAO_Reconfig_Scheduler_Entry &,
+ TAO_Reconfig_Scheduler_Entry &);
+ // Compares two entries by priority alone. Returns -1 if the
+ // first one is higher, 0 if they're the same, and 1 if the second one is higher.
+
+ static int compare_priority (TAO_RT_Info_Tuple &,
+ TAO_RT_Info_Tuple &);
+ // Compares two tuples by priority alone. Returns -1 if the
+ // first one is higher, 0 if they're the same, and 1 if the second one is higher.
+
+ static int compare_admission_order (TAO_RT_Info_Tuple &,
+ TAO_RT_Info_Tuple &);
+ // Compares two entries by admission ordering policy. Returns -1 if the
+ // first one is earlier, 0 if they're the same, and 1 if the second one is earlier.
+
+ static int compare_subpriority (TAO_Reconfig_Scheduler_Entry &,
+ TAO_Reconfig_Scheduler_Entry &);
+ // Compares two entries by subpriority alone. Returns -1 if the
+ // first one is higher, 0 if they're the same, and 1 if the second one is higher.
+
+ static int assign_config (RtecScheduler::Config_Info &,
+ TAO_Reconfig_Scheduler_Entry &);
+ // Fills in a static dispatch configuration for a priority level, based
+ // on the operation characteristics of a representative scheduling entry.
+};
+
+TAO_END_VERSIONED_NAMESPACE_DECL
+
+// Include the templates here.
+#include "orbsvcs/Sched/Reconfig_Sched_Utils_T.h"
+
+#include /**/ "ace/post.h"
+#endif /* TAO_RECONFIG_SCHED_UTILS_H */
diff --git a/TAO/orbsvcs/orbsvcs/Sched/Reconfig_Sched_Utils_T.cpp b/TAO/orbsvcs/orbsvcs/Sched/Reconfig_Sched_Utils_T.cpp
new file mode 100644
index 00000000000..cfc7cfd332a
--- /dev/null
+++ b/TAO/orbsvcs/orbsvcs/Sched/Reconfig_Sched_Utils_T.cpp
@@ -0,0 +1,1085 @@
+// ============================================================================
+//
+// $Id$
+//
+// ============================================================================
+//
+// = LIBRARY
+// orbsvcs
+//
+// = FILENAME
+// Reconfig_Sched_Utils_T.cpp
+//
+// = AUTHOR
+// Chris Gill <cdgill@cs.wustl.edu>
+//
+// ============================================================================
+
+#ifndef TAO_RECONFIG_SCHED_UTILS_T_CPP
+#define TAO_RECONFIG_SCHED_UTILS_T_CPP
+
+#include "orbsvcs/Sched/Reconfig_Sched_Utils_T.h"
+#include "ace/Sched_Params.h"
+#include "ace/ACE.h"
+
+#if !defined (ACE_LACKS_PRAGMA_ONCE)
+# pragma once
+#endif /* ACE_LACKS_PRAGMA_ONCE */
+
+TAO_BEGIN_VERSIONED_NAMESPACE_DECL
+
+////////////////////////////////
+// TAO_RSE_Dependency_Visitor //
+////////////////////////////////
+
+// Constructor.
+
+template <class RECONFIG_SCHED_STRATEGY, class ACE_LOCK>
+TAO_RSE_Dependency_Visitor<RECONFIG_SCHED_STRATEGY, ACE_LOCK>::
+TAO_RSE_Dependency_Visitor
+ (DEPENDENCY_SET_MAP & dependency_map, RT_INFO_MAP & rt_info_map)
+ : dependency_map_ (dependency_map),
+ rt_info_map_ (rt_info_map)
+{
+}
+
+
+// Visit a Reconfig Scheduler Entry. This method calls protected hook
+// methods that can be overridden by derived classes, according to the
+// Template Method design pattern.
+
+template <class RECONFIG_SCHED_STRATEGY, class ACE_LOCK> int
+TAO_RSE_Dependency_Visitor<RECONFIG_SCHED_STRATEGY, ACE_LOCK>::
+visit (TAO_Reconfig_Scheduler_Entry &rse)
+{
+ int result = 0;
+
+ /* WSOA merge - commented out
+ // Call unconditional action method, which performs any necessary
+ // modifications that are applied to each node unconditionally.
+ if (this->unconditional_action (rse) < 0)
+ {
+ ACE_ERROR_RETURN ((LM_ERROR,
+ "TAO_RSE_Dependency_Visitor::"
+ "visit: error from unconditional action.\n"), -1);
+ }
+ */
+
+ // Call precondition hook method, and only proceed if the
+ // precondition returns 0 for success.
+
+ result = this->precondition (rse);
+ if (result < 0)
+ {
+ ACE_ERROR_RETURN ((LM_ERROR,
+ "TAO_RSE_Dependency_Visitor::"
+ "visit: error from precondition evaluation.\n"), -1);
+ }
+
+ if (result == 0)
+ {
+ // Call prefix action method, which performs any necessary
+ // modifications on the node prior to visiting its successors.
+ if (this->prefix_action (rse) < 0)
+ {
+ ACE_ERROR_RETURN ((LM_ERROR,
+ "TAO_RSE_Dependency_Visitor::"
+ "visit: error from prefix action.\n"), -1);
+ }
+
+ // Get the dependency set for the current entry.
+ RtecScheduler::Dependency_Set *dependency_set = 0;
+ if (dependency_map_.find (rse.actual_rt_info ()->handle,
+ dependency_set) == 0)
+ {
+ // Iterate over the set of dependencies for the current entry.
+ TAO_Reconfig_Scheduler_Entry * next_rse = 0;
+ TAO_RT_Info_Ex *next_rt_info = 0;
+ for (u_int i = 0; i < dependency_set->length (); ++i)
+ {
+ // Skip over disabled dependencies
+ if ((*dependency_set) [i].enabled == RtecBase::DEPENDENCY_DISABLED)
+ {
+ continue;
+ }
+
+ // Take the handle from the dependency and use it
+ // to obtain an RT_Info pointer from the map.
+ if (rt_info_map_.find ((*dependency_set) [i].rt_info,
+ next_rt_info) != 0)
+ {
+ ACE_ERROR_RETURN ((LM_ERROR, "RT_Info (%i) not found.\n",
+ (*dependency_set) [i].rt_info), -1);
+ }
+
+ // Extract a pointer to the scheduling entry from the RT_Info.
+
+ if (next_rt_info == 0)
+ {
+ ACE_ERROR_RETURN ((LM_ERROR, "RT_Info in map was null.\n"),
+ -1);
+ }
+
+ // Reference the associated scheduling entry: the double cast is
+ // needed to ensure that the size of the pointer and the size of the
+ // stored magic cookie are the same
+ next_rse =
+ ACE_LONGLONG_TO_PTR (TAO_Reconfig_Scheduler_Entry *,
+ next_rt_info->volatile_token);
+ if (next_rse == 0)
+ {
+ ACE_ERROR_RETURN ((LM_ERROR,
+ "Entry pointer in RT_Info was null.\n"),
+ -1);
+ }
+
+ // Call pre-recursion action method, which performs any necessary
+ // modifications to a successor (or the entry) prior to recursing
+ // on the successor.
+ result = this->pre_recurse_action (rse, *next_rse,
+ (*dependency_set) [i]);
+ if (result < 0)
+ {
+ ACE_ERROR_RETURN ((LM_ERROR,
+ "TAO_RSE_Dependency_Visitor::visit: "
+ "error from pre-recursion action.\n"),
+ -1);
+ }
+
+ // If the pre-recursion action returned 0, visit the successor.
+ if (result == 0)
+ {
+ this->visit (*next_rse);
+ }
+ }
+
+ }
+
+ // Call postfix action method, which performs any necessary
+ // modifications on the node after visiting all its successors.
+ if (this->postfix_action (rse) < 0)
+ {
+ ACE_ERROR_RETURN ((LM_ERROR, "TAO_RSE_Dependency_Visitor::"
+ "visit: error from postfix action.\n"), -1);
+ }
+ }
+
+ return 0;
+}
+
+// WSOA merge - commented out
+// // Performs an unconditional action when the entry is first reached.
+// // Returns 0 for success, and -1 if an error occurred.
+
+// template <class RECONFIG_SCHED_STRATEGY, class ACE_LOCK> int
+// TAO_RSE_Dependency_Visitor<RECONFIG_SCHED_STRATEGY, ACE_LOCK>::
+// unconditional_action (TAO_Reconfig_Scheduler_Entry & /* rse */)
+// {
+// // Default behavior: just return success.
+// return 0;
+// }
+//
+
+// Tests whether or not any conditional actions should be taken for
+// the entry. Returns 0 if the actions should be applied, 1 if the
+// entry should be left alone, and -1 if an error occurred.
+
+template <class RECONFIG_SCHED_STRATEGY, class ACE_LOCK> int
+TAO_RSE_Dependency_Visitor<RECONFIG_SCHED_STRATEGY, ACE_LOCK>::
+precondition (TAO_Reconfig_Scheduler_Entry &rse)
+{
+ // Only signal to proceed (0) if the passed entry is enabled or non-volatile
+ return (rse.enabled_state () == RtecScheduler::RT_INFO_DISABLED)
+ ? 1
+ : 0;
+}
+
+
+// Performs an action on the entry prior to visiting any of
+// its successors. Returns 0 on success and -1 on error.
+
+template <class RECONFIG_SCHED_STRATEGY, class ACE_LOCK> int
+TAO_RSE_Dependency_Visitor<RECONFIG_SCHED_STRATEGY, ACE_LOCK>::
+prefix_action (TAO_Reconfig_Scheduler_Entry & /* rse */)
+{
+ // Default behavior: just return success.
+ return 0;
+}
+
+
+// Performs an action on a successor entry prior to visiting
+// it. Returns 0 on success and -1 on error.
+
+template <class RECONFIG_SCHED_STRATEGY, class ACE_LOCK> int
+TAO_RSE_Dependency_Visitor<RECONFIG_SCHED_STRATEGY, ACE_LOCK>::
+pre_recurse_action (TAO_Reconfig_Scheduler_Entry & /* entry */,
+ TAO_Reconfig_Scheduler_Entry & /* successor */,
+ const RtecScheduler::Dependency_Info & /* di */)
+{
+ // Default behavior: just return success.
+ return 0;
+}
+
+
+// Performs an action on the entry after visiting all of
+// its successors. Returns 0 on success and -1 on error.
+
+template <class RECONFIG_SCHED_STRATEGY, class ACE_LOCK> int
+TAO_RSE_Dependency_Visitor<RECONFIG_SCHED_STRATEGY, ACE_LOCK>::
+postfix_action (TAO_Reconfig_Scheduler_Entry & /* rse */)
+{
+ // Default behavior: just return success.
+ return 0;
+}
+
+
+
+/////////////////////////
+// TAO_RSE_DFS_Visitor //
+/////////////////////////
+
+// Constructor.
+
+template <class RECONFIG_SCHED_STRATEGY, class ACE_LOCK>
+TAO_RSE_DFS_Visitor<RECONFIG_SCHED_STRATEGY, ACE_LOCK>::
+TAO_RSE_DFS_Visitor
+ (ACE_TYPENAME TAO_RSE_Dependency_Visitor<RECONFIG_SCHED_STRATEGY, ACE_LOCK>::DEPENDENCY_SET_MAP & dependency_map,
+ ACE_TYPENAME TAO_RSE_Dependency_Visitor<RECONFIG_SCHED_STRATEGY, ACE_LOCK>::RT_INFO_MAP & rt_info_map)
+ : TAO_RSE_Dependency_Visitor<RECONFIG_SCHED_STRATEGY, ACE_LOCK>
+ (dependency_map, rt_info_map),
+ DFS_time_ (0)
+{
+}
+
+
+// Makes sure the entry has not previously been visited in forward DFS.
+// Returns 0 if the actions should be applied, 1 if the entry
+// should be left alone, and -1 if an error occurred.
+
+template <class RECONFIG_SCHED_STRATEGY, class ACE_LOCK> int
+TAO_RSE_DFS_Visitor<RECONFIG_SCHED_STRATEGY, ACE_LOCK>::
+precondition (TAO_Reconfig_Scheduler_Entry &rse)
+{
+ int result =
+ TAO_RSE_Dependency_Visitor<RECONFIG_SCHED_STRATEGY, ACE_LOCK>::
+ precondition (rse);
+
+ return (result == 0)
+ ? ((rse.fwd_dfs_status () == TAO_Reconfig_Scheduler_Entry::NOT_VISITED)
+ ? 0
+ : 1)
+ : result;
+}
+
+// Marks entry as forward visited and sets its forward DFS start
+// time, prior to visiting any of its successors. Returns 0 on
+// success and -1 on error.
+
+template <class RECONFIG_SCHED_STRATEGY, class ACE_LOCK> int
+TAO_RSE_DFS_Visitor<RECONFIG_SCHED_STRATEGY, ACE_LOCK>::
+prefix_action (TAO_Reconfig_Scheduler_Entry &rse)
+{
+ rse.fwd_dfs_status (TAO_Reconfig_Scheduler_Entry::VISITED);
+ rse.fwd_discovered (this->DFS_time_++);
+ return 0;
+}
+
+
+// Marks whether or not successor is a thread delineator prior to
+// visiting it. Returns 0 on success and -1 on error.
+
+template <class RECONFIG_SCHED_STRATEGY, class ACE_LOCK> int
+TAO_RSE_DFS_Visitor<RECONFIG_SCHED_STRATEGY, ACE_LOCK>::
+pre_recurse_action (TAO_Reconfig_Scheduler_Entry & /* entry */,
+ TAO_Reconfig_Scheduler_Entry & successor,
+ const RtecScheduler::Dependency_Info & /* di */)
+{
+ // Enabled operations we reached via a dependency and that do not
+ // specify a period are not thread delineators.
+ if (successor.enabled_state () != RtecScheduler::RT_INFO_DISABLED
+ && successor.actual_rt_info ()->period == 0
+ && successor.actual_rt_info ()->threads == 0)
+ {
+ successor.is_thread_delineator (0);
+ }
+
+ return 0;
+}
+
+
+// Marks entry as forward finished and sets its forward DFS finish
+// time, after all of its successors have been visited. Returns 0
+// on success and -1 on error.
+
+template <class RECONFIG_SCHED_STRATEGY, class ACE_LOCK> int
+TAO_RSE_DFS_Visitor<RECONFIG_SCHED_STRATEGY, ACE_LOCK>::
+postfix_action (TAO_Reconfig_Scheduler_Entry &rse)
+{
+ rse.fwd_dfs_status (TAO_Reconfig_Scheduler_Entry::FINISHED);
+ rse.fwd_finished (this->DFS_time_++);
+ return 0;
+}
+
+
+/////////////////////////
+// TAO_RSE_SCC_Visitor //
+/////////////////////////
+
+// Constructor.
+
+template <class RECONFIG_SCHED_STRATEGY, class ACE_LOCK>
+TAO_RSE_SCC_Visitor<RECONFIG_SCHED_STRATEGY, ACE_LOCK>::
+TAO_RSE_SCC_Visitor
+ (ACE_TYPENAME TAO_RSE_Dependency_Visitor<RECONFIG_SCHED_STRATEGY, ACE_LOCK>::DEPENDENCY_SET_MAP & dependency_map,
+ ACE_TYPENAME TAO_RSE_Dependency_Visitor<RECONFIG_SCHED_STRATEGY, ACE_LOCK>::RT_INFO_MAP & rt_info_map)
+ : TAO_RSE_Dependency_Visitor<RECONFIG_SCHED_STRATEGY, ACE_LOCK>
+ (dependency_map, rt_info_map),
+ DFS_time_ (0),
+ number_of_cycles_ (0),
+ in_a_cycle_ (0)
+{
+}
+
+// Accessor for number of cycles detected in traversal.
+
+template <class RECONFIG_SCHED_STRATEGY, class ACE_LOCK> int
+TAO_RSE_SCC_Visitor<RECONFIG_SCHED_STRATEGY, ACE_LOCK>::
+number_of_cycles (void)
+{
+ return this->number_of_cycles_;
+}
+
+
+// Accessor for whether or not the recursion is within a previously
+// detected cycle.
+
+template <class RECONFIG_SCHED_STRATEGY, class ACE_LOCK> int
+TAO_RSE_SCC_Visitor<RECONFIG_SCHED_STRATEGY, ACE_LOCK>::
+in_a_cycle (void)
+{
+ return this->in_a_cycle_;
+}
+
+
+// Mutator for whether or not the recursion is within a previously
+// detected cycle.
+
+template <class RECONFIG_SCHED_STRATEGY, class ACE_LOCK> void
+TAO_RSE_SCC_Visitor<RECONFIG_SCHED_STRATEGY, ACE_LOCK>::
+in_a_cycle (int i)
+{
+ this->in_a_cycle_ = i;
+}
+
+/* WSOA merge - commented out
+template <class RECONFIG_SCHED_STRATEGY, class ACE_LOCK> int
+TAO_RSE_SCC_Visitor<RECONFIG_SCHED_STRATEGY, ACE_LOCK>::
+unconditional_action (TAO_Reconfig_Scheduler_Entry &rse)
+{
+ if (rse.is_thread_delineator () &&
+ rse.effective_period () == 0)
+ {
+ rse.effective_period (rse.actual_rt_info ()->period);
+ long threads = rse.actual_rt_info ()->threads;
+ rse.effective_exec_multiplier (threads > 0 ? threads : 1);
+ }
+
+ return 0;
+}
+*/
+
+// Makes sure the entry has not previously been visited in the
+// reverse DFS (call graph transpose) direction. Returns 0 if
+// the actions should be applied, 1 if the entry should be left
+// alone, and -1 if an error occurred.
+
+template <class RECONFIG_SCHED_STRATEGY, class ACE_LOCK> int
+TAO_RSE_SCC_Visitor<RECONFIG_SCHED_STRATEGY, ACE_LOCK>::
+precondition (TAO_Reconfig_Scheduler_Entry &rse)
+{
+ int result =
+ TAO_RSE_Dependency_Visitor<RECONFIG_SCHED_STRATEGY, ACE_LOCK>::
+ precondition (rse);
+
+ return (result == 0)
+ ? ((rse.rev_dfs_status () == TAO_Reconfig_Scheduler_Entry::NOT_VISITED)
+ ? 0
+ : 1)
+ : 1;
+}
+
+
+// Marks reverse status as visited and sets reverse start time for
+// entry, prior to visiting any of its successors. Returns 0 on
+// success and -1 on error.
+
+template <class RECONFIG_SCHED_STRATEGY, class ACE_LOCK> int
+TAO_RSE_SCC_Visitor<RECONFIG_SCHED_STRATEGY, ACE_LOCK>::
+prefix_action (TAO_Reconfig_Scheduler_Entry &rse)
+{
+ rse.rev_dfs_status (TAO_Reconfig_Scheduler_Entry::VISITED);
+ rse.rev_discovered (this->DFS_time_++);
+ return 0;
+}
+
+
+// Checks reverse status of each successor. For any that have not
+// been previously visited, it complains about the entry and
+// successor being part of a cycle, stores the fact that a cycle was
+// detected, and maintains a count of the total number of cycles
+// (strongly connected components). Returns 0 on success and -1 on
+// an error (finding a cycle is not considered an error, at least as
+// far as this method is concerned).
+
+template <class RECONFIG_SCHED_STRATEGY, class ACE_LOCK> int
+TAO_RSE_SCC_Visitor<RECONFIG_SCHED_STRATEGY, ACE_LOCK>::
+pre_recurse_action (TAO_Reconfig_Scheduler_Entry &entry,
+ TAO_Reconfig_Scheduler_Entry &successor,
+ const RtecScheduler::Dependency_Info & /* di */)
+{
+ if (successor.enabled_state () !=
+ RtecScheduler::RT_INFO_DISABLED
+ && successor.rev_dfs_status () ==
+ TAO_Reconfig_Scheduler_Entry::NOT_VISITED)
+ {
+ if (this->in_a_cycle () == 0)
+ {
+ this->in_a_cycle (1);
+ ++this->number_of_cycles_;
+ }
+
+ ACE_DEBUG ((LM_ERROR,
+ "RT_Infos \"%s\" and \"%s\" are part of dependency cycle %d.\n",
+ entry.actual_rt_info ()->entry_point.in (),
+ successor.actual_rt_info ()->entry_point.in (),
+ this->number_of_cycles_));
+ }
+
+ return 0;
+}
+
+
+// Sets the entry's reverse finish time and marks it as finished in
+// the reverse DFS traversal, after visiting all of its successors.
+// Returns 0 on success and -1 on error.
+
+template <class RECONFIG_SCHED_STRATEGY, class ACE_LOCK> int
+TAO_RSE_SCC_Visitor<RECONFIG_SCHED_STRATEGY, ACE_LOCK>::
+postfix_action (TAO_Reconfig_Scheduler_Entry &rse)
+{
+ rse.rev_dfs_status (TAO_Reconfig_Scheduler_Entry::FINISHED);
+ rse.rev_finished (this->DFS_time_++);
+ return 0;
+}
+
+/////////////////////////////////////////
+// TAO_RSE_Reverse_Propagation_Visitor //
+/////////////////////////////////////////
+
+// Constructor.
+
+template <class RECONFIG_SCHED_STRATEGY, class ACE_LOCK>
+TAO_RSE_Reverse_Propagation_Visitor<RECONFIG_SCHED_STRATEGY, ACE_LOCK>::
+TAO_RSE_Reverse_Propagation_Visitor
+ (ACE_TYPENAME TAO_RSE_Dependency_Visitor<RECONFIG_SCHED_STRATEGY, ACE_LOCK>::DEPENDENCY_SET_MAP & dependency_map,
+ ACE_TYPENAME TAO_RSE_Dependency_Visitor<RECONFIG_SCHED_STRATEGY, ACE_LOCK>::RT_INFO_MAP & rt_info_map)
+ : TAO_RSE_Dependency_Visitor<RECONFIG_SCHED_STRATEGY, ACE_LOCK> (dependency_map, rt_info_map)
+{
+}
+
+
+template <class RECONFIG_SCHED_STRATEGY, class ACE_LOCK> int
+TAO_RSE_Reverse_Propagation_Visitor<RECONFIG_SCHED_STRATEGY, ACE_LOCK>::
+pre_recurse_action (TAO_Reconfig_Scheduler_Entry &entry,
+ TAO_Reconfig_Scheduler_Entry &successor,
+ const RtecScheduler::Dependency_Info & /* di */)
+{
+ // @TODO - check for conjunction nodes here and perform conjunctive
+ // function on existing rate tuples. Idea: treat conjunctive tuples
+ // as skolem functions over the possible rates of their incedent
+ // edges thread delineators!!! Then, can tentatively compute
+ // utilization for rate combinations. Question: can I find a case
+ // where this makes tuple rate admission non-monotonic??? I.e.,
+ // where a higher rate for an input results in a lower utilization?
+ // Might require a skew in the exec times and rates. What are the
+ // determining characteristics of this? What impact if any does
+ // phasing have on this?
+
+ // Check for conjunction nodes and don't propagate
+ // upward from them: they represent a cut point in the graph.
+ // Do not allow conjunction nodes for now.
+ if (entry.actual_rt_info ()->info_type == RtecScheduler::CONJUNCTION)
+ {
+ ACE_ERROR_RETURN ((LM_ERROR,
+ ACE_TEXT ("Conjunction Nodes are not supported currently.")),
+ -1);
+ }
+ else
+ {
+ // @TODO - replace the explicit WCET attribute propagation with
+ // a scheduling strategy functor that propagates arbitrary
+ // execution time attributes. BTW, for conjunctions BCET and WCET
+ // are probably needed relative the upper and lower bounds on
+ // arrival waveforms.
+
+ // Add the successor's aggregate time to the entry's aggregate time.
+ // Since we're visiting in topological order (called nodes before
+ // calling nodes), the successor's aggregate time is up to date.
+ if (successor.enabled_state () != RtecScheduler::RT_INFO_DISABLED)
+ {
+ entry.aggregate_exec_time (entry.aggregate_exec_time ()
+ + successor.aggregate_exec_time ());
+ }
+ }
+
+
+ // Do not recurse on the successor node, just continue to the next successor.
+ return 1;
+}
+
+
+/////////////////////////////////////////
+// TAO_RSE_Forward_Propagation_Visitor //
+/////////////////////////////////////////
+
+// Constructor.
+
+template <class RECONFIG_SCHED_STRATEGY, class ACE_LOCK>
+TAO_RSE_Forward_Propagation_Visitor<RECONFIG_SCHED_STRATEGY, ACE_LOCK>::
+TAO_RSE_Forward_Propagation_Visitor
+ (ACE_TYPENAME TAO_RSE_Dependency_Visitor<RECONFIG_SCHED_STRATEGY, ACE_LOCK>::DEPENDENCY_SET_MAP & dependency_map,
+ ACE_TYPENAME TAO_RSE_Dependency_Visitor<RECONFIG_SCHED_STRATEGY, ACE_LOCK>::RT_INFO_MAP & rt_info_map)
+ : TAO_RSE_Dependency_Visitor<RECONFIG_SCHED_STRATEGY, ACE_LOCK> (dependency_map, rt_info_map),
+ unresolved_locals_ (0),
+ unresolved_remotes_ (0),
+ thread_specification_errors_ (0)
+{
+}
+
+
+// Accessor for number of nodes with unresolved local dependencies.
+
+template <class RECONFIG_SCHED_STRATEGY, class ACE_LOCK> int
+TAO_RSE_Forward_Propagation_Visitor<RECONFIG_SCHED_STRATEGY, ACE_LOCK>::
+unresolved_locals (void)
+{
+ return this->unresolved_locals_;
+}
+
+
+// Mutator for number of nodes with unresolved local dependencies.
+
+template <class RECONFIG_SCHED_STRATEGY, class ACE_LOCK> void
+TAO_RSE_Forward_Propagation_Visitor<RECONFIG_SCHED_STRATEGY, ACE_LOCK>::
+unresolved_locals (int i)
+{
+ this->unresolved_locals_ = i;
+}
+
+
+// Accessor for number of nodes with unresolved remote dependencies.
+
+template <class RECONFIG_SCHED_STRATEGY, class ACE_LOCK> int
+TAO_RSE_Forward_Propagation_Visitor<RECONFIG_SCHED_STRATEGY, ACE_LOCK>::
+unresolved_remotes (void)
+{
+ return this->unresolved_remotes_;
+}
+
+
+// Mutator for number of nodes with unresolved remote dependencies.
+
+template <class RECONFIG_SCHED_STRATEGY, class ACE_LOCK> void
+TAO_RSE_Forward_Propagation_Visitor<RECONFIG_SCHED_STRATEGY, ACE_LOCK>::
+unresolved_remotes (int i)
+{
+ this->unresolved_remotes_ = i;
+}
+
+// Accessor for number of nodes with thread specification errors.
+
+template <class RECONFIG_SCHED_STRATEGY, class ACE_LOCK> int
+TAO_RSE_Forward_Propagation_Visitor<RECONFIG_SCHED_STRATEGY, ACE_LOCK>::
+thread_specification_errors (void)
+{
+ return this->thread_specification_errors_;
+}
+
+
+// Mutator for number of nodes with thread specification errors.
+
+template <class RECONFIG_SCHED_STRATEGY, class ACE_LOCK> void
+TAO_RSE_Forward_Propagation_Visitor<RECONFIG_SCHED_STRATEGY, ACE_LOCK>::
+thread_specification_errors (int i)
+{
+ this->thread_specification_errors_ = i;
+}
+
+
+// Tests the entry for possibly having unresolved remote or local
+// dependencies prior to visiting any of its successors, and also
+// checks for thread specification errors. Returns 0 on success and
+// -1 on error (having unresolved dependencies or thread specification
+// problems is not considered an error, at least for this method).
+
+template <class RECONFIG_SCHED_STRATEGY, class ACE_LOCK> int
+TAO_RSE_Forward_Propagation_Visitor<RECONFIG_SCHED_STRATEGY, ACE_LOCK>::
+prefix_action (TAO_Reconfig_Scheduler_Entry &rse)
+{
+ // Complain about anything that is still marked as a thread
+ // delineator but does not have a period: if it has threads, it is a
+ // specification error. Otherwise, if it's not a remote dependant
+ // (per RT_Info's info_type field) it has unresolved *local*
+ // dependencies.
+
+ if (rse.is_thread_delineator ())
+ {
+ if (rse.actual_rt_info ()->period == 0)
+ {
+ if (rse.actual_rt_info ()->threads == 0)
+ {
+ if (rse.actual_rt_info ()->info_type ==
+ RtecScheduler::REMOTE_DEPENDANT)
+ {
+ ++this->unresolved_remotes_;
+
+ ACE_DEBUG ((LM_ERROR,
+ "RT_Info \"%s\" has unresolved "
+ "remote dependencies.\n",
+ rse.actual_rt_info ()->entry_point.in ()));
+ }
+ else
+ {
+ ++this->unresolved_locals_;
+
+ ACE_DEBUG ((LM_ERROR,
+ "RT_Info \"%s\" has unresolved "
+ "local dependencies.\n",
+ rse.actual_rt_info ()->entry_point.in ()));
+ }
+ }
+ else
+ {
+ // Specification error: any RT_Info that specifies threads
+ // must also specify a period.
+ ++this->thread_specification_errors_;
+ ACE_DEBUG ((LM_ERROR,
+ "RT_Info \"%s\" specifies %1d "
+ "threads, but no period.\n",
+ rse.actual_rt_info ()->entry_point.in (),
+ rse.actual_rt_info ()->threads));
+ }
+ }
+ }
+
+ return 0;
+}
+
+
+// Propagates effective period from entry to successor prior to
+// visiting successor. Returns 0 on success and -1 on error.
+
+template <class RECONFIG_SCHED_STRATEGY, class ACE_LOCK> int
+TAO_RSE_Forward_Propagation_Visitor<RECONFIG_SCHED_STRATEGY, ACE_LOCK>::
+pre_recurse_action (TAO_Reconfig_Scheduler_Entry &entry,
+ TAO_Reconfig_Scheduler_Entry &successor,
+ const RtecScheduler::Dependency_Info & /* di */)
+{
+ if (successor.enabled_state () == RtecScheduler::RT_INFO_DISABLED)
+ {
+ return 1;
+ }
+
+ TAO_RT_Info_Tuple **tuple_ptr_ptr;
+
+ TUPLE_SET_ITERATOR orig_tuple_iter (entry.orig_tuple_subset ());
+
+ while (orig_tuple_iter.done () == 0)
+ {
+ if (orig_tuple_iter.next (tuple_ptr_ptr) == 0
+ || tuple_ptr_ptr == 0 || *tuple_ptr_ptr == 0)
+ {
+ ACE_ERROR ((LM_ERROR,
+ "Failed to access tuple under iterator"));
+ return -1;
+ }
+
+ // @TODO - check for conjunction nodes here and perform conjunctive
+ // function on existing rate tuples.
+
+#ifdef SCHEDULER_LOGGING
+ ACE_DEBUG((LM_DEBUG, "Inserting new propagated tuple for RT_Info: %d, entry_ptr: 0x%x, tuple_ptr: 0x%x\n",
+ successor.actual_rt_info ()->handle,
+ &successor,
+ (*tuple_ptr_ptr)));
+#endif
+ // Propagate tuples disjunctively.
+ successor.insert_tuple (**tuple_ptr_ptr,
+ TAO_Reconfig_Scheduler_Entry::PROPAGATED);
+
+ successor.actual_rt_info ()->period =
+ (successor.actual_rt_info ()->period == 0)
+ ? (*tuple_ptr_ptr)->period
+ : ACE::minimum_frame_size (successor.actual_rt_info ()->period,
+ (*tuple_ptr_ptr)->period);
+ orig_tuple_iter.advance ();
+ }
+
+ TUPLE_SET_ITERATOR prop_tuple_iter (entry.prop_tuple_subset ());
+
+ while (prop_tuple_iter.done () == 0)
+ {
+ if (prop_tuple_iter.next (tuple_ptr_ptr) == 0
+ || tuple_ptr_ptr == 0 || *tuple_ptr_ptr == 0)
+ {
+ ACE_ERROR ((LM_ERROR,
+ "Failed to access tuple under iterator"));
+ return -1;
+ }
+
+ // @TODO - check for conjunction nodes here and perform conjunctive
+ // function on existing rate tuples.
+
+#ifdef SCHEDULER_LOGGING
+ ACE_DEBUG((LM_DEBUG, "Inserting new propagated tuple for RT_Info: %d, entry_ptr: 0x%x, tuple_ptr: 0x%x\n",
+ successor.actual_rt_info ()->handle,
+ &successor,
+ (*tuple_ptr_ptr)));
+#endif
+
+ // Propagate tuples disjunctively.
+ successor.insert_tuple (**tuple_ptr_ptr,
+ TAO_Reconfig_Scheduler_Entry::PROPAGATED);
+
+ successor.actual_rt_info ()->period =
+ (successor.actual_rt_info ()->period == 0)
+ ? (*tuple_ptr_ptr)->period
+ : ACE::minimum_frame_size (successor.actual_rt_info ()->period,
+ (*tuple_ptr_ptr)->period);
+
+ prop_tuple_iter.advance ();
+ }
+
+ // Do not recurse on the successor node, just continue to the next successor.
+ return 1;
+}
+
+////////////////////////////////////
+// class TAO_RSE_Priority_Visitor //
+////////////////////////////////////
+
+// Constructor.
+
+template <class RECONFIG_SCHED_STRATEGY, class ACE_LOCK>
+TAO_RSE_Priority_Visitor<RECONFIG_SCHED_STRATEGY, ACE_LOCK>::
+TAO_RSE_Priority_Visitor (RtecScheduler::handle_t handles,
+ TAO_Reconfig_Scheduler_Entry ** entry_ptr_array)
+ : previous_entry_ (0),
+ first_subpriority_entry_ (0),
+ priority_ (0),
+ subpriority_ (0),
+ os_priority_ (ACE_Sched_Params::priority_max (ACE_SCHED_FIFO,
+ ACE_SCOPE_PROCESS)),
+ handles_ (handles),
+ entry_ptr_array_ (entry_ptr_array)
+{
+}
+
+
+// Visit a RT_Info tuple. This method assigns a priority and
+// subpriority value to each tuple. Priorities are assigned in
+// increasing numeric order, with lower numbers corresponding to
+// higher priorities.
+
+template <class RECONFIG_SCHED_STRATEGY, class ACE_LOCK> int
+TAO_RSE_Priority_Visitor<RECONFIG_SCHED_STRATEGY, ACE_LOCK>::visit (TAO_Reconfig_Scheduler_Entry &rse)
+{
+ int result = 0;
+#ifdef SCHEDULER_LOGGING
+ ACE_DEBUG ((LM_DEBUG,
+ "Priority_Visitor visiting %s[%d],crit=%d,period=%d\n",
+ rse.actual_rt_info ()->entry_point.in(),
+ rse.actual_rt_info ()->handle,
+ rse.actual_rt_info ()->criticality,
+ rse.actual_rt_info ()->period));
+#endif
+
+ if (previous_entry_ == 0)
+ {
+ // Indicate a new priority level was assigned.
+ result = 1;
+
+ // If we're on the first node, store the start of the array
+ // as the start of the priority level.
+ first_subpriority_entry_ = this->entry_ptr_array_;
+ rse.actual_rt_info ()->preemption_subpriority = subpriority_;
+ }
+ else
+ {
+#ifdef SCHEDULER_LOGGING
+ ACE_DEBUG ((LM_DEBUG,
+ "Previous entry %s[%d],crit=%d,period=%d\n",
+ previous_entry_->actual_rt_info ()->entry_point.in(),
+ previous_entry_->actual_rt_info ()->handle,
+ previous_entry_->actual_rt_info ()->criticality,
+ previous_entry_->actual_rt_info ()->period));
+#endif
+ // Don't change priority levels on a disabled node.
+ if (rse.enabled_state () == RtecScheduler::RT_INFO_DISABLED
+ || RECONFIG_SCHED_STRATEGY::compare_priority (*previous_entry_, rse) == 0)
+ {
+ // Subpriority is increased at each new node.
+ ++subpriority_;
+
+ // Store negative value of subpriority level: will be
+ // adjusted by adding back in the total number of
+ // subpriorities in the priority level, so the
+ // subpriorities are assigned in decreasing order.
+ rse.actual_rt_info ()->preemption_subpriority = - subpriority_;
+ }
+ else
+ {
+ // Indicate a new priority level was assigned.
+ result = 1;
+
+ // Iterate back through and adjust the subpriority levels.
+ for (int i = 0; i <= subpriority_; ++i, ++first_subpriority_entry_)
+ {
+ (*first_subpriority_entry_)->actual_rt_info ()->
+ preemption_subpriority += subpriority_;
+ }
+
+ subpriority_ = 0;
+ rse.actual_rt_info ()->preemption_subpriority = subpriority_;
+
+ ++priority_;
+#ifdef SCHEDULER_LOGGING
+ ACE_DEBUG ((LM_DEBUG, "New priority %d formed\n", priority_));
+#endif
+ os_priority_ = ACE_Sched_Params::previous_priority (ACE_SCHED_FIFO,
+ os_priority_,
+ ACE_SCOPE_PROCESS);
+ }
+ }
+
+ // Assign the entry's priority and subpriority values
+ rse.actual_rt_info ()->priority = os_priority_;
+ rse.actual_rt_info ()->preemption_priority = priority_;
+
+ // Remember the current entry for the next visit.
+ previous_entry_ = &rse;
+
+ return result;
+}
+
+
+// Finishes scheduler entry priority assignment by iterating over the
+// remaining entries in the last subpriority level, and adjusting
+// their subpriorities.
+template <class RECONFIG_SCHED_STRATEGY, class ACE_LOCK> int
+TAO_RSE_Priority_Visitor<RECONFIG_SCHED_STRATEGY, ACE_LOCK>::finish ()
+{
+ // Iterate back through and adjust the subpriority levels.
+ for (int i = 0; i <= subpriority_; ++i, ++first_subpriority_entry_)
+ {
+ (*first_subpriority_entry_)->actual_rt_info ()->
+ preemption_subpriority += subpriority_;
+ }
+
+ // Indicate no new priority level was identified.
+ return 0;
+}
+
+///////////////////////////////////////
+// class TAO_Tuple_Admission_Visitor //
+///////////////////////////////////////
+
+// Constructor.
+
+template <class RECONFIG_SCHED_STRATEGY>
+TAO_Tuple_Admission_Visitor<RECONFIG_SCHED_STRATEGY>::
+TAO_Tuple_Admission_Visitor (const CORBA::Double & critical_utilization_threshold,
+ const CORBA::Double & noncritical_utilization_threshold)
+ : critical_utilization_ (0.0),
+ noncritical_utilization_ (0.0),
+ total_critical_utilization_ (0.0),
+ total_noncritical_utilization_ (0.0),
+ critical_utilization_threshold_ (critical_utilization_threshold),
+ noncritical_utilization_threshold_ (noncritical_utilization_threshold)
+{
+}
+
+// Visit a Reconfig Scheduler Entry. This method
+// determines the utilization by the entry, and
+// adds it to the critical or non-critical utilization,
+// depending on whether or not the strategy says the
+// operation is critical.
+
+template <class RECONFIG_SCHED_STRATEGY> int
+TAO_Tuple_Admission_Visitor<RECONFIG_SCHED_STRATEGY>::visit (TAO_RT_Info_Tuple &t)
+{
+ TAO_Reconfig_Scheduler_Entry *entry =
+ ACE_LONGLONG_TO_PTR (TAO_Reconfig_Scheduler_Entry *,
+ t.volatile_token);
+
+ // Ignore disabled tuples and entries
+ if (t.enabled_state () == RtecScheduler::RT_INFO_DISABLED
+ || entry->enabled_state () == RtecScheduler::RT_INFO_DISABLED)
+ {
+ return 0;
+ }
+
+ // Compute the current tuple's utilization.
+ CORBA::Double delta_utilization =
+ (static_cast<CORBA::Double> (t.threads)
+ * static_cast<CORBA::Double> (ACE_UINT64_DBLCAST_ADAPTER (entry->
+ aggregate_exec_time ())))
+ / static_cast<CORBA::Double> (t.period);
+
+ // Subtract the previous tuple's utilization (if any) for the entry.
+ if (entry->current_admitted_tuple ())
+ {
+ delta_utilization -=
+ (static_cast<CORBA::Double> (entry->current_admitted_tuple ()->threads)
+ * static_cast<CORBA::Double> (ACE_UINT64_DBLCAST_ADAPTER (entry->
+ aggregate_exec_time ())))
+ / static_cast<CORBA::Double> (entry->current_admitted_tuple ()->period);
+ }
+
+ if (RECONFIG_SCHED_STRATEGY::is_critical (t))
+ {
+ this->total_critical_utilization_ += delta_utilization;
+
+ if (this->critical_utilization_ + this->noncritical_utilization_
+ +delta_utilization
+ < this->critical_utilization_threshold_)
+ {
+ this->critical_utilization_ += delta_utilization;
+ entry->current_admitted_tuple (&t);
+ entry->actual_rt_info ()->period = t.period;
+ }
+ }
+ else
+ {
+ this->total_noncritical_utilization_ += delta_utilization;
+ if (this->critical_utilization_ + this->noncritical_utilization_
+ +delta_utilization
+ < this->noncritical_utilization_threshold_)
+ {
+ this->noncritical_utilization_ += delta_utilization;
+ entry->current_admitted_tuple (&t);
+ entry->actual_rt_info ()->period = t.period;
+ }
+ }
+ return 0;
+}
+
+
+// Accessor for utilization by critical operations.
+
+template <class RECONFIG_SCHED_STRATEGY> CORBA::Double
+TAO_Tuple_Admission_Visitor<RECONFIG_SCHED_STRATEGY>::critical_utilization ()
+{
+ return this->critical_utilization_;
+}
+
+
+// Accessor for utilization by noncritical operations.
+
+template <class RECONFIG_SCHED_STRATEGY> CORBA::Double
+TAO_Tuple_Admission_Visitor<RECONFIG_SCHED_STRATEGY>::noncritical_utilization ()
+{
+ return this->noncritical_utilization_;
+}
+
+template <class RECONFIG_SCHED_STRATEGY> CORBA::Double
+TAO_Tuple_Admission_Visitor<RECONFIG_SCHED_STRATEGY>::total_critical_utilization ()
+{
+ return this->total_critical_utilization_;
+}
+
+
+// Accessor for utilization by noncritical operations.
+
+template <class RECONFIG_SCHED_STRATEGY> CORBA::Double
+TAO_Tuple_Admission_Visitor<RECONFIG_SCHED_STRATEGY>::total_noncritical_utilization ()
+{
+ return this->total_noncritical_utilization_;
+}
+
+// Accessor for utilization threshold for critical operations.
+
+template <class RECONFIG_SCHED_STRATEGY> CORBA::Double
+TAO_Tuple_Admission_Visitor<RECONFIG_SCHED_STRATEGY>::critical_utilization_threshold ()
+{
+ return this->critical_utilization_threshold_;
+}
+
+
+// Accessor for utilization by noncritical operations.
+
+template <class RECONFIG_SCHED_STRATEGY> CORBA::Double
+TAO_Tuple_Admission_Visitor<RECONFIG_SCHED_STRATEGY>::noncritical_utilization_threshold ()
+{
+ return this->noncritical_utilization_threshold_;
+}
+
+
+/////////////////////////////////////////
+// TAO_RSE_Criticality_Propagation_Visitor //
+/////////////////////////////////////////
+
+// Constructor.
+
+template <class RECONFIG_SCHED_STRATEGY, class ACE_LOCK>
+TAO_RSE_Criticality_Propagation_Visitor<RECONFIG_SCHED_STRATEGY, ACE_LOCK>::
+TAO_RSE_Criticality_Propagation_Visitor
+ (ACE_TYPENAME TAO_RSE_Dependency_Visitor<RECONFIG_SCHED_STRATEGY, ACE_LOCK>::DEPENDENCY_SET_MAP & dependency_map,
+ ACE_TYPENAME TAO_RSE_Dependency_Visitor<RECONFIG_SCHED_STRATEGY, ACE_LOCK>::RT_INFO_MAP & rt_info_map)
+ : TAO_RSE_Dependency_Visitor<RECONFIG_SCHED_STRATEGY, ACE_LOCK> (dependency_map, rt_info_map)
+{
+}
+
+
+template <class RECONFIG_SCHED_STRATEGY, class ACE_LOCK> int
+TAO_RSE_Criticality_Propagation_Visitor<RECONFIG_SCHED_STRATEGY, ACE_LOCK>::
+pre_recurse_action (TAO_Reconfig_Scheduler_Entry &entry,
+ TAO_Reconfig_Scheduler_Entry &successor,
+ const RtecScheduler::Dependency_Info & /* di */)
+{
+#ifdef SCHEDULER_LOGGING
+ ACE_DEBUG ((LM_DEBUG,
+ "Crit Prop_Visitor visiting %s[%d], successor is %s[%d]\n",
+ entry.actual_rt_info ()->entry_point.in(),
+ entry.actual_rt_info ()->handle,
+ successor.actual_rt_info ()->entry_point.in(),
+ successor.actual_rt_info ()->handle));
+#endif
+
+ if (successor.enabled_state () != RtecScheduler::RT_INFO_DISABLED)
+ {
+ RtecScheduler::Criticality_t entry_crit =
+ entry.actual_rt_info ()->criticality;
+ RtecScheduler::Criticality_t succ_crit =
+ successor.actual_rt_info ()->criticality;
+ RtecScheduler::Criticality_t max_crit = entry_crit;
+
+ if (max_crit < succ_crit)
+ max_crit = succ_crit;
+
+ successor.actual_rt_info ()->criticality = max_crit;
+
+#ifdef SCHEDULER_LOGGING
+ ACE_DEBUG ((LM_DEBUG,
+ "Successor's new criticality is %d\n",
+ successor.actual_rt_info ()->criticality));
+#endif
+ }
+
+ // Do not recurse on the successor node, just continue to the next successor.
+ return 1;
+}
+
+TAO_END_VERSIONED_NAMESPACE_DECL
+
+#endif /* TAO_RECONFIG_SCHED_UTILS_T_CPP */
diff --git a/TAO/orbsvcs/orbsvcs/Sched/Reconfig_Sched_Utils_T.h b/TAO/orbsvcs/orbsvcs/Sched/Reconfig_Sched_Utils_T.h
new file mode 100644
index 00000000000..b66b0f389bd
--- /dev/null
+++ b/TAO/orbsvcs/orbsvcs/Sched/Reconfig_Sched_Utils_T.h
@@ -0,0 +1,490 @@
+// -*- C++ -*-
+
+// $Id$
+
+// ============================================================================
+//
+// = LIBRARY
+// orbsvcs
+//
+// = FILENAME
+// Reconfig_Scheduler_Utils_T.h
+//
+// = AUTHOR
+// Chris Gill <cdgill@cs.wustl.edu>
+//
+// ============================================================================
+
+#ifndef TAO_RECONFIG_SCHED_UTILS_T_H
+#define TAO_RECONFIG_SCHED_UTILS_T_H
+#include /**/ "ace/pre.h"
+
+#include "ace/config-all.h"
+#include "orbsvcs/Sched/Reconfig_Sched_Utils.h"
+#include "ace/Hash_Map_Manager.h"
+
+#if !defined (ACE_LACKS_PRAGMA_ONCE)
+# pragma once
+#endif /* ACE_LACKS_PRAGMA_ONCE */
+
+TAO_BEGIN_VERSIONED_NAMESPACE_DECL
+
+//////////////////////////////////////////
+// Reconfig Sched Entry Visitor classes //
+//////////////////////////////////////////
+
+template <class RECONFIG_SCHED_STRATEGY, class ACE_LOCK>
+class TAO_RSE_Dependency_Visitor :
+ public TAO_Reconfig_Sched_Entry_Visitor
+ // = TITLE
+ // A base class for scheduler entry visitors that use a
+ // dependency map to traverse a dependency graph over entries.
+ //
+ // = DESCRIPTION
+ // This class hold the maps and a constructor that
+ // derived classes may call to pass them in.
+{
+public:
+
+ typedef ACE_Hash_Map_Manager_Ex<RtecScheduler::handle_t,
+ RtecScheduler::Dependency_Set*,
+ ACE_Hash<RtecScheduler::handle_t>,
+ ACE_Equal_To<RtecScheduler::handle_t>,
+ ACE_LOCK> DEPENDENCY_SET_MAP;
+ // Type of map used for O(1) lookup of RT_Info
+ // dependency sets by caller or called handle.
+
+ typedef ACE_Hash_Map_Manager_Ex<RtecScheduler::handle_t,
+ TAO_RT_Info_Ex*,
+ ACE_Hash<RtecScheduler::handle_t>,
+ ACE_Equal_To<RtecScheduler::handle_t>,
+ ACE_LOCK> RT_INFO_MAP;
+ // Type of map used for O(1) lookup of RT_Infos by their handles.
+
+ TAO_RSE_Dependency_Visitor
+ (DEPENDENCY_SET_MAP & dependency_map,
+ RT_INFO_MAP & rt_info_map);
+ // Constructor.
+
+ virtual int visit (TAO_Reconfig_Scheduler_Entry &);
+ // Visit a Reconfig Scheduler Entry. This method calls
+ // protected hook methods that can be overridden by
+ // derived classes, according to the Template Method
+ // design pattern.
+
+protected:
+ /* WSOA merge - commented out
+ virtual int unconditional_action (TAO_Reconfig_Scheduler_Entry &rse);
+ // Performs an unconditional action when the entry is first reached.
+ // Returns 0 for success, and -1 if an error occurred.
+ */
+ virtual int precondition (TAO_Reconfig_Scheduler_Entry &rse);
+ // Tests whether or not any conditional actions should be taken for
+ // the entry. Returns 0 if the actions should be applied, 1 if the
+ // entry should be left alone, and -1 if an error occurred.
+
+ virtual int prefix_action (TAO_Reconfig_Scheduler_Entry &rse);
+ // Performs an action on the entry prior to visiting any of
+ // its successors. Returns 0 on success and -1 on error.
+
+ virtual int pre_recurse_action (TAO_Reconfig_Scheduler_Entry &entry,
+ TAO_Reconfig_Scheduler_Entry &successor,
+ const RtecScheduler::Dependency_Info &di);
+ // Performs an action on a successor entry prior to visiting
+ // it. Returns 0 if the successor should be visited recursively,
+ // 1 if the successor should not be visited, and -1 on error.
+
+ virtual int postfix_action (TAO_Reconfig_Scheduler_Entry &rse);
+ // Performs an action on the entry after visiting all of
+ // its successors. Returns 0 on success and -1 on error.
+
+ DEPENDENCY_SET_MAP & dependency_map_;
+ // Map of dependencies between RT_Info handles.
+
+ RT_INFO_MAP & rt_info_map_;
+ // Map of handles into RT_Infos.
+
+};
+
+
+
+template <class RECONFIG_SCHED_STRATEGY, class ACE_LOCK>
+class TAO_RSE_DFS_Visitor :
+ public TAO_RSE_Dependency_Visitor<RECONFIG_SCHED_STRATEGY, ACE_LOCK>
+ // = TITLE
+ // A scheduler entry visitor that marks nodes with DFS start
+ // and finish times.
+ //
+ // = DESCRIPTION
+ // This class does DFS traversal marking of each node it visits,
+ // as appropriate according to DFS state markers.
+{
+public:
+
+ TAO_RSE_DFS_Visitor
+ (ACE_TYPENAME TAO_RSE_Dependency_Visitor<RECONFIG_SCHED_STRATEGY, ACE_LOCK>::DEPENDENCY_SET_MAP & dependency_map,
+ ACE_TYPENAME TAO_RSE_Dependency_Visitor<RECONFIG_SCHED_STRATEGY, ACE_LOCK>::RT_INFO_MAP & rt_info_map);
+ // Constructor.
+
+protected:
+ virtual int precondition (TAO_Reconfig_Scheduler_Entry &rse);
+ // Makes sure the entry has not previously been visited in forward DFS.
+ // Returns 0 if the actions should be applied, 1 if the entry
+ // should be left alone, and -1 if an error occurred.
+
+ virtual int prefix_action (TAO_Reconfig_Scheduler_Entry &rse);
+ // Marks entry as forward visited and sets its forward DFS start
+ // time, prior to visiting any of its successors. Returns 0 on
+ // success and -1 on error.
+
+ virtual int pre_recurse_action (TAO_Reconfig_Scheduler_Entry &entry,
+ TAO_Reconfig_Scheduler_Entry &successor,
+ const RtecScheduler::Dependency_Info &di);
+ // Marks whether or not successor is a thread delineator prior to
+ // visiting it. Returns 0 on success and -1 on error.
+
+ virtual int postfix_action (TAO_Reconfig_Scheduler_Entry &rse);
+ // Marks entry as forward finished and sets its forward DFS finish
+ // time, after all of its successors have been visited. Returns 0
+ // on success and -1 on error.
+
+private:
+ int DFS_time_;
+ // Keeps track of DFS start and finish times.
+
+};
+
+
+template <class RECONFIG_SCHED_STRATEGY, class ACE_LOCK>
+class TAO_RSE_SCC_Visitor :
+ public TAO_RSE_Dependency_Visitor<RECONFIG_SCHED_STRATEGY, ACE_LOCK>
+ // = TITLE
+ // A scheduler entry visitor that checks for cycles in the graph.
+ //
+ // = DESCRIPTION
+ // This class, when applied to nodes in the transpose of the DFS graph as
+ // ordered for the strongly connected components algorithm, will
+ // flag cycles in the graph.
+{
+public:
+
+ TAO_RSE_SCC_Visitor
+ (ACE_TYPENAME TAO_RSE_Dependency_Visitor<RECONFIG_SCHED_STRATEGY, ACE_LOCK>::DEPENDENCY_SET_MAP & dependency_map,
+ ACE_TYPENAME TAO_RSE_Dependency_Visitor<RECONFIG_SCHED_STRATEGY, ACE_LOCK>::RT_INFO_MAP & rt_info_map);
+ // Constructor.
+
+ int number_of_cycles (void);
+ // Accessor for number of cycles detected in traversal.
+
+ int in_a_cycle (void);
+ // Accessor for whether or not the recursion is within a previously
+ // detected cycle.
+
+ void in_a_cycle (int);
+ // Mutator for whether or not the recursion is within a previously
+ // detected cycle.
+
+protected:
+ /* WSOA merge - commented out
+ virtual int unconditional_action (TAO_Reconfig_Scheduler_Entry &rse);
+ // If the entry is a thread delineator, sets its effective period and
+ // execution multiplier from the values in its corresponding RT_Info.
+ // Returns 0 for success, and -1 if an error occurred.
+ */
+
+ virtual int precondition (TAO_Reconfig_Scheduler_Entry &rse);
+ // Makes sure the entry has not previously been visited in the
+ // reverse DFS (call graph transpose) direction. Returns 0 if
+ // the actions should be applied, 1 if the entry should be left
+ // alone, and -1 if an error occurred.
+
+ virtual int prefix_action (TAO_Reconfig_Scheduler_Entry &rse);
+ // Marks reverse status as visited and sets reverse start time for
+ // entry, prior to visiting any of its successors. Returns 0 on
+ // success and -1 on error.
+
+ virtual int pre_recurse_action (TAO_Reconfig_Scheduler_Entry &entry,
+ TAO_Reconfig_Scheduler_Entry &successor,
+ const RtecScheduler::Dependency_Info &di);
+ // Checks reverse status of each successor. For any that have not
+ // been previously visited, it complains about the entry and
+ // successor being part of a cycle, stores the fact that a cycle was
+ // detected, and maintains a count of the total number of cycles
+ // (strongly connected components). Returns 0 on success and -1 on
+ // an error (finding a cycle is not considered an error, at least as
+ // far as this method is concerned).
+
+ virtual int postfix_action (TAO_Reconfig_Scheduler_Entry &rse);
+ // Sets the entry's reverse finish time and marks it as finished in
+ // the reverse DFS traversal, after visiting all of its successors.
+ // Returns 0 on success and -1 on error.
+
+private:
+ int DFS_time_;
+ // Keeps track of DFS start and finish times.
+
+ int number_of_cycles_;
+ // Keeps track of DFS start and finish times.
+
+ int in_a_cycle_;
+ // Indicates whether or not the recursion is
+ // currently within a previously discovered cycle.
+};
+
+template <class RECONFIG_SCHED_STRATEGY, class ACE_LOCK>
+class TAO_RSE_Reverse_Propagation_Visitor :
+ public TAO_RSE_Dependency_Visitor<RECONFIG_SCHED_STRATEGY, ACE_LOCK>
+ // = TITLE
+ // A scheduler entry visitor that propagates aggregate execution
+ // times from called to calling nodes in a topologically ordered
+ // graph.
+ //
+ // = DESCRIPTION
+ // This class computes the aggregate execution time of each node
+ // and its dependants, according to its dependencies.
+{
+public:
+
+ TAO_RSE_Reverse_Propagation_Visitor
+ (ACE_TYPENAME TAO_RSE_Dependency_Visitor<RECONFIG_SCHED_STRATEGY, ACE_LOCK>::DEPENDENCY_SET_MAP & dependency_map,
+ ACE_TYPENAME TAO_RSE_Dependency_Visitor<RECONFIG_SCHED_STRATEGY, ACE_LOCK>::RT_INFO_MAP & rt_info_map);
+ // Constructor.
+
+protected:
+
+ virtual int pre_recurse_action (TAO_Reconfig_Scheduler_Entry &entry,
+ TAO_Reconfig_Scheduler_Entry &successor,
+ const RtecScheduler::Dependency_Info &di);
+ // Propagates aggregate execution time from successor to calling
+ // entry. Returns 1 on success (to prevent recursion on the
+ // successor), and -1 on error.
+
+};
+
+
+template <class RECONFIG_SCHED_STRATEGY, class ACE_LOCK>
+class TAO_RSE_Forward_Propagation_Visitor :
+ public TAO_RSE_Dependency_Visitor<RECONFIG_SCHED_STRATEGY, ACE_LOCK>
+ // = TITLE
+ // A scheduler entry visitor that propagates effective periods and
+ // execution time multipliers between nodes in a topologically
+ // ordered graph.
+ //
+ // = DESCRIPTION
+ // This class computes the effective period of each node, according to
+ // its dependencies, and the period and threads it specifies.
+{
+public:
+
+ TAO_RSE_Forward_Propagation_Visitor
+ (ACE_TYPENAME TAO_RSE_Dependency_Visitor<RECONFIG_SCHED_STRATEGY, ACE_LOCK>::DEPENDENCY_SET_MAP & dependency_map,
+ ACE_TYPENAME TAO_RSE_Dependency_Visitor<RECONFIG_SCHED_STRATEGY, ACE_LOCK>::RT_INFO_MAP & rt_info_map);
+ // Constructor.
+
+ int unresolved_locals (void);
+ // Accessor for number of nodes with unresolved local dependencies.
+
+ void unresolved_locals (int);
+ // Mutator for numberof nodes with unresolved local dependencies.
+
+ int unresolved_remotes (void);
+ // Accessor for number of nodes with unresolved remote dependencies.
+
+ void unresolved_remotes (int);
+ // Mutator for number of nodes with unresolved remote dependencies.
+
+ int thread_specification_errors (void);
+ // Accessor for number of nodes with thread specification errors.
+
+ void thread_specification_errors (int);
+ // Mutator for number of nodes with thread specification errors.
+
+protected:
+ virtual int prefix_action (TAO_Reconfig_Scheduler_Entry &rse);
+ // Tests the entry for possibly having unresolved remote or local
+ // dependencies prior to visiting any of its successors. Returns 0
+ // on success and -1 on error (having unresolved remote or local
+ // dependencies is not considered an error, at least for this
+ // method).
+
+ virtual int pre_recurse_action (TAO_Reconfig_Scheduler_Entry &entry,
+ TAO_Reconfig_Scheduler_Entry &successor,
+ const RtecScheduler::Dependency_Info &di);
+ // Propagates effective period and execution time multiplier from
+ // entry to successor prior to visiting successor. Returns 1 on
+ // success (to prevent recursion on the successor), and -1 on error.
+
+private:
+
+ int unresolved_locals_;
+ // Number of nodes with unresolved local dependencies.
+
+ int unresolved_remotes_;
+ // Number of nodes with unresolved remote dependencies.
+
+ int thread_specification_errors_;
+ // Number of nodes with thread specification errors.
+};
+
+template <class RECONFIG_SCHED_STRATEGY, class ACE_LOCK>
+class TAO_RSE_Priority_Visitor :
+ public TAO_Reconfig_Sched_Entry_Visitor
+ // = TITLE
+ // An entry visitor that assigns static priority and subpriority
+ // values to entries in an array already sorted in static
+ // <priority, subpriority> order.
+ //
+ // = DESCRIPTION
+ // The visitor uses the parameterized strategy type to determine
+ // priority and subpriority boundaries.
+{
+public:
+
+ TAO_RSE_Priority_Visitor (RtecScheduler::handle_t handles,
+ TAO_Reconfig_Scheduler_Entry ** entry_ptr_array);
+ // Constructor.
+
+ virtual int visit (TAO_Reconfig_Scheduler_Entry &);
+ // Visit a RT_Info tuple. This method assigns a priority and
+ // subpriority value to each tuple. Priorities are assigned in
+ // increasing value order, with lower numbers corresponding to
+ // higher priorities. Returns -1 on error, 1 if a new priority was
+ // assigned, or 0 otherwise.
+
+ int finish ();
+ // Finishes tuple priority assignment by iterating over the
+ // remaining tuples in the last subpriority level, and adjusting
+ // their subpriorities.
+
+private:
+
+ TAO_Reconfig_Scheduler_Entry *previous_entry_;
+ // Pointer to previous tuple in the iteration.
+
+ TAO_Reconfig_Scheduler_Entry **first_subpriority_entry_;
+ // Pointer to first subpriority tuple in the priority level.
+
+ RtecScheduler::Preemption_Priority_t priority_;
+ // Current priority value.
+
+ RtecScheduler::Preemption_Subpriority_t subpriority_;
+ // Current subpriority value.
+
+ RtecScheduler::OS_Priority os_priority_;
+ // Current OS (thread) priority value.
+
+ RtecScheduler::handle_t handles_;
+ // Number of handles in the entry pointer array.
+
+ TAO_Reconfig_Scheduler_Entry ** entry_ptr_array_;
+ // An array of pointers to entries we will be visiting.
+};
+
+template <class RECONFIG_SCHED_STRATEGY>
+class TAO_Tuple_Admission_Visitor :
+ public TAO_RT_Info_Tuple_Visitor
+ // = TITLE
+
+ // A tuple visitor that accumulates utilization separately for
+ // critical and non-critical operations. Operation tuples that
+ // fit within the threashold defined for their criticality level
+ // are admitted to the schedule, by updating the corresponding
+ // RT_Info with the tuple data.
+ //
+ // = DESCRIPTION
+ // The visitor uses the parameterized strategy type to determine
+ // whether or not a given operation is critical.
+{
+public:
+
+ TAO_Tuple_Admission_Visitor (const CORBA::Double & critical_utilization_threshold,
+ const CORBA::Double & noncritical_utilization_threshold);
+ // Constructor.
+
+ virtual int visit (TAO_RT_Info_Tuple &);
+ // Visit an RT_Info tuple. This method determines the utilization by
+ // the tuple, and if it's admissible, updates its RT_Info and either
+ // the critical or non-critical utilization, depending on whether or
+ // not the strategy says the operation is critical.
+
+ CORBA::Double critical_utilization ();
+ // Accessor for utilization by critical operations.
+
+ CORBA::Double noncritical_utilization ();
+ // Accessor for utilization by noncritical operations.
+
+ CORBA::Double critical_utilization_threshold ();
+ // Accessor for utilization by critical operations.
+
+ CORBA::Double noncritical_utilization_threshold ();
+ // Accessor for utilization by noncritical operations.
+
+ CORBA::Double total_critical_utilization ();
+ // Accessor for utilization by critical operations.
+
+ CORBA::Double total_noncritical_utilization ();
+ // Accessor for utilization by noncritical operations.
+
+private:
+
+ CORBA::Double critical_utilization_;
+ // Utilization by critical operations.
+
+ CORBA::Double noncritical_utilization_;
+ // Utilization by noncritical operations.
+
+ CORBA::Double total_critical_utilization_;
+ // Utilization by critical operations.
+
+ CORBA::Double total_noncritical_utilization_;
+ // Utilization by noncritical operations.
+
+ CORBA::Double critical_utilization_threshold_;
+ // Utilization by critical operations.
+
+ CORBA::Double noncritical_utilization_threshold_;
+ // Utilization by noncritical operations.
+};
+
+template <class RECONFIG_SCHED_STRATEGY, class ACE_LOCK>
+class TAO_RSE_Criticality_Propagation_Visitor :
+ public TAO_RSE_Dependency_Visitor<RECONFIG_SCHED_STRATEGY, ACE_LOCK>
+ // = TITLE
+ // A scheduler entry visitor that propagates criticality
+ // from called to calling nodes in a topologically ordered
+ // graph.
+ //
+ // = DESCRIPTION
+ // This class computes the criticality of each node
+ // and its dependants, according to its dependencies.
+{
+public:
+
+ TAO_RSE_Criticality_Propagation_Visitor
+ (ACE_TYPENAME TAO_RSE_Dependency_Visitor<RECONFIG_SCHED_STRATEGY, ACE_LOCK>::DEPENDENCY_SET_MAP & dependency_map,
+ ACE_TYPENAME TAO_RSE_Dependency_Visitor<RECONFIG_SCHED_STRATEGY, ACE_LOCK>::RT_INFO_MAP & rt_info_map);
+ // Constructor.
+
+protected:
+
+ virtual int pre_recurse_action (TAO_Reconfig_Scheduler_Entry &entry,
+ TAO_Reconfig_Scheduler_Entry &successor,
+ const RtecScheduler::Dependency_Info &di);
+ // Propagates criticality from successor to calling
+ // entry. Returns 1 on success (to prevent recursion on the
+ // successor), and -1 on error.
+
+};
+
+TAO_END_VERSIONED_NAMESPACE_DECL
+
+#if defined (ACE_TEMPLATES_REQUIRE_SOURCE)
+#include "orbsvcs/Sched/Reconfig_Sched_Utils_T.cpp"
+#endif /* ACE_TEMPLATES_REQUIRE_SOURCE */
+
+#if defined (ACE_TEMPLATES_REQUIRE_PRAGMA)
+#pragma implementation ("Reconfig_Sched_Utils_T.cpp")
+#endif /* ACE_TEMPLATES_REQUIRE_PRAGMA */
+
+#include /**/ "ace/post.h"
+#endif /* TAO_RECONFIG_SCHED_UTILS_T_H */
diff --git a/TAO/orbsvcs/orbsvcs/Sched/Reconfig_Scheduler.h b/TAO/orbsvcs/orbsvcs/Sched/Reconfig_Scheduler.h
new file mode 100644
index 00000000000..1734634a104
--- /dev/null
+++ b/TAO/orbsvcs/orbsvcs/Sched/Reconfig_Scheduler.h
@@ -0,0 +1,38 @@
+/* -*- C++ -*- */
+// $Id$
+
+// ============================================================================
+//
+// = LIBRARY
+// orbsvcs
+//
+// = FILENAME
+// Reconfig_Scheduler.h
+//
+// = AUTHOR
+// Chris Gill <cdgill@cs.wustl.edu>
+//
+// ============================================================================
+
+#ifndef TAO_RECONFIG_SCHEDULER_H
+#define TAO_RECONFIG_SCHEDULER_H
+#include /**/ "ace/pre.h"
+
+#include "ace/config-all.h"
+
+
+#include "ace/Hash_Map_Manager.h"
+#include "ace/RB_Tree.h"
+#include "orbsvcs/Scheduler_Factory.h"
+#include "orbsvcs/RtecSchedulerS.h"
+#include "orbsvcs/Sched/Reconfig_Sched_Utils.h"
+
+#if !defined (ACE_LACKS_PRAGMA_ONCE)
+# pragma once
+#endif /* ACE_LACKS_PRAGMA_ONCE */
+
+// Include the templates here.
+#include "orbsvcs/Sched/Reconfig_Scheduler_T.h"
+
+#include /**/ "ace/post.h"
+#endif /* TAO_RECONFIG_SCHEDULER_H */
diff --git a/TAO/orbsvcs/orbsvcs/Sched/Reconfig_Scheduler_T.cpp b/TAO/orbsvcs/orbsvcs/Sched/Reconfig_Scheduler_T.cpp
new file mode 100644
index 00000000000..76e925b5086
--- /dev/null
+++ b/TAO/orbsvcs/orbsvcs/Sched/Reconfig_Scheduler_T.cpp
@@ -0,0 +1,3218 @@
+// ============================================================================
+//
+// $Id$
+//
+// ============================================================================
+//
+// = LIBRARY
+// orbsvcs
+//
+// = FILENAME
+// Reconfig_Scheduler_T.cpp
+//
+// = AUTHOR
+// Chris Gill <cdgill@cs.wustl.edu>
+//
+// ============================================================================
+
+#ifndef TAO_RECONFIG_SCHEDULER_T_C
+#define TAO_RECONFIG_SCHEDULER_T_C
+
+#include "orbsvcs/Sched/Reconfig_Scheduler_T.h"
+#include "orbsvcs/Time_Utilities.h"
+#include "ace/Auto_Ptr.h"
+
+#if !defined (ACE_LACKS_PRAGMA_ONCE)
+# pragma once
+#endif /* ACE_LACKS_PRAGMA_ONCE */
+
+//#ifdef _DEBUG
+//#define SCHEDULER_LOGGING 1
+//#endif
+
+TAO_BEGIN_VERSIONED_NAMESPACE_DECL
+
+//////////////////////////////////////////////
+// Helper function type definition for sort //
+//////////////////////////////////////////////
+
+// This is awkward, but it makes MSVC++ happy.
+extern "C"
+{
+typedef int (*COMP_FUNC) (const void*, const void*);
+}
+
+
+// Default constructor.
+
+template <class RECONFIG_SCHED_STRATEGY, class ACE_LOCK>
+TAO_Reconfig_Scheduler<RECONFIG_SCHED_STRATEGY, ACE_LOCK>::
+TAO_Reconfig_Scheduler (int enforce_schedule_stability,
+ const CORBA::Double & critical_utilization_threshold,
+ const CORBA::Double & noncritical_utilization_threshold)
+ : config_info_count_ (0),
+ rt_info_count_ (0),
+ rt_info_tuple_count_ (0),
+ next_handle_ (1),
+ entry_ptr_array_ (0),
+ entry_ptr_array_size_ (0),
+ tuple_ptr_array_ (0),
+ tuple_ptr_array_size_ (0),
+ stability_flags_ (SCHED_NONE_STABLE),
+ enforce_schedule_stability_ (enforce_schedule_stability),
+ dependency_count_ (0),
+ last_scheduled_priority_ (0),
+ noncritical_utilization_ (0.0),
+ critical_utilization_ (0.0),
+ noncritical_utilization_threshold_ (noncritical_utilization_threshold),
+ critical_utilization_threshold_ (critical_utilization_threshold)
+{
+#if defined (SCHEDULER_LOGGING)
+ ACE_DEBUG ((LM_TRACE,
+ " TAO_Reconfig_Scheduler default ctor.\n"));
+#endif /* SCHEDULER_LOGGING */
+}
+
+// Constructor. Initialize the scheduler from the POD_Config_Info, POD_RT_Info,
+// and POD_Dependency arrays, plus stability flag.
+
+template <class RECONFIG_SCHED_STRATEGY, class ACE_LOCK>
+TAO_Reconfig_Scheduler<RECONFIG_SCHED_STRATEGY, ACE_LOCK>::
+TAO_Reconfig_Scheduler (int config_count,
+ ACE_Scheduler_Factory::POD_Config_Info config_infos[],
+ int rt_info_count,
+ ACE_Scheduler_Factory::POD_RT_Info rt_infos[],
+ int dependency_count,
+ ACE_Scheduler_Factory::POD_Dependency_Info dependency_infos[],
+ u_long stability_flags,
+ int enforce_schedule_stability,
+ const CORBA::Double & critical_utilization_threshold,
+ const CORBA::Double & noncritical_utilization_threshold)
+ : config_info_count_ (0),
+ rt_info_count_ (0),
+ rt_info_tuple_count_ (0),
+ next_handle_ (1),
+ stability_flags_ (SCHED_ALL_STABLE),
+ enforce_schedule_stability_ (enforce_schedule_stability),
+ dependency_count_ (0),
+ last_scheduled_priority_ (0),
+ noncritical_utilization_ (0.0),
+ critical_utilization_ (0.0),
+ noncritical_utilization_threshold_ (noncritical_utilization_threshold),
+ critical_utilization_threshold_ (critical_utilization_threshold)
+{
+#if defined (SCHEDULER_LOGGING)
+ ACE_DEBUG ((LM_TRACE,
+ " TAO_Reconfig_Scheduler alternative ctor.\n"));
+#endif /* SCHEDULER_LOGGING */
+
+ // @ TODO - think about what it means to emit all the tuples as
+ // well as the established RT_Infos. State is more complex now.
+
+ // The init method can throw an exception, which must be caught
+ // *inside* the constructor to be portable between compilers that
+ // differ in whether they support native C++ exceptions.
+ ACE_TRY_NEW_ENV
+ {
+ this->init (config_count, config_infos,
+ rt_info_count, rt_infos,
+ dependency_count, dependency_infos,
+ stability_flags ACE_ENV_ARG_PARAMETER);
+ ACE_TRY_CHECK;
+ }
+ ACE_CATCH (CORBA::SystemException, corba_sysex)
+ {
+ ACE_ERROR ((LM_ERROR, "TAO_Reconfig_Scheduler<RECONFIG_SCHED_STRATEGY, "
+ "ACE_LOCK>::TAO_Reconfig_Scheduler "
+ "system exception: cannot init scheduler.\n"));
+ }
+ ACE_ENDTRY;
+}
+
+
+// Destructor.
+
+template <class RECONFIG_SCHED_STRATEGY, class ACE_LOCK>
+TAO_Reconfig_Scheduler<RECONFIG_SCHED_STRATEGY, ACE_LOCK>::
+~TAO_Reconfig_Scheduler ()
+{
+#if defined (SCHEDULER_LOGGING)
+ ACE_DEBUG ((LM_TRACE,
+ " TAO_Reconfig_Scheduler dtor.\n"));
+#endif /* SCHEDULER_LOGGING */
+
+ ACE_TRY_NEW_ENV
+ {
+ this->close (ACE_ENV_SINGLE_ARG_PARAMETER);
+ ACE_TRY_CHECK;
+ }
+ ACE_CATCH (CORBA::SystemException, corba_sysex)
+ {
+ ACE_ERROR ((LM_ERROR, "TAO_Reconfig_Scheduler<RECONFIG_SCHED_STRATEGY, "
+ "ACE_LOCK>::~TAO_Reconfig_Scheduler "
+ "exception: cannot close scheduler.\n"));
+ }
+ ACE_ENDTRY;
+
+ // Delete the entry and tuple pointer arrays.
+ delete [] entry_ptr_array_;
+ delete [] tuple_ptr_array_;
+}
+
+// Additive initialization: can be called multiple times, with
+// new sets of operation, dependency, and config information.
+
+template <class RECONFIG_SCHED_STRATEGY, class ACE_LOCK> int
+TAO_Reconfig_Scheduler<RECONFIG_SCHED_STRATEGY, ACE_LOCK>::
+init (int config_count,
+ ACE_Scheduler_Factory::POD_Config_Info config_info[],
+ int rt_info_count,
+ ACE_Scheduler_Factory::POD_RT_Info rt_info[],
+ int dependency_count,
+ ACE_Scheduler_Factory::POD_Dependency_Info dependency_info[],
+ u_long stability_flags
+ ACE_ENV_ARG_DECL)
+ ACE_THROW_SPEC ((CORBA::SystemException,
+ RtecScheduler::DUPLICATE_NAME,
+ RtecScheduler::UNKNOWN_TASK,
+ RtecScheduler::SYNCHRONIZATION_FAILURE,
+ RtecScheduler::INTERNAL))
+{
+#if defined (SCHEDULER_LOGGING)
+ ACE_DEBUG ((LM_TRACE,
+ " TAO_Reconfig_Scheduler::init.\n"));
+#endif /* SCHEDULER_LOGGING */
+
+ ACE_GUARD_THROW_EX (ACE_LOCK, ace_mon, this->mutex_,
+ RtecScheduler::SYNCHRONIZATION_FAILURE ());
+ ACE_CHECK_RETURN (-1);
+
+ int result = 0;
+ int i = 0;
+
+/* WSOA merge - commented out
+ // Clear out the previous entries, if any.
+ this->close (ACE_ENV_SINGLE_ARG_PARAMETER);
+ ACE_CHECK_RETURN (-1);
+*/
+
+ // Re-map the RT_Info and dependency handle values if necessary.
+ // Assumes that dependencies only refer to handles within the
+ // current set: changing that assumption would require us to use
+ // operation names, and the equivalent of a symbol table and
+ // relocating linker for RT_Infos to do this correctly in the
+ // general case.
+ if (this->next_handle_ > 1)
+ {
+ for (i = 0; i < rt_info_count; ++i)
+ {
+ rt_info [i].handle += this->next_handle_ - 1;
+ }
+ for (i = 0; i < dependency_count; ++i)
+ {
+ dependency_info [i].info_that_depends += this->next_handle_ - 1;
+ dependency_info [i].info_depended_on += this->next_handle_ - 1;
+ }
+ }
+
+ // (Re)initialize using the new settings.
+
+ // Add the passed config infos to the scheduler
+ auto_ptr<RtecScheduler::Config_Info> new_config_info_ptr;
+ for (i = 0; i < config_count; ++i)
+ {
+ RtecScheduler::Config_Info* new_config_info;
+ ACE_NEW_THROW_EX (new_config_info,
+ RtecScheduler::Config_Info,
+ CORBA::NO_MEMORY ());
+ ACE_CHECK_RETURN (-1);
+
+ // Make sure the new config info is cleaned up if we exit abruptly.
+ ACE_AUTO_PTR_RESET (new_config_info_ptr, new_config_info, RtecScheduler::Config_Info);
+
+ result = config_info_map_.bind (config_info [i].preemption_priority,
+ new_config_info);
+ switch (result)
+ {
+ case -1:
+ // Something bad but unknown occurred while trying to bind in map.
+ ACE_THROW_RETURN (RtecScheduler::INTERNAL (), -1);
+
+ case 1:
+ // Tried to bind an operation that was already in the map.
+ ACE_THROW_RETURN (RtecScheduler::DUPLICATE_NAME (), -1);
+
+ default:
+ break;
+ }
+
+ new_config_info->preemption_priority =
+ config_info [i].preemption_priority;
+ new_config_info->thread_priority =
+ config_info [i].thread_priority;
+ new_config_info->dispatching_type =
+ config_info [i].dispatching_type;
+
+ if (new_config_info->preemption_priority >
+ last_scheduled_priority_)
+ {
+ this->last_scheduled_priority_ =
+ new_config_info->preemption_priority;
+ }
+
+ // Release the auto_ptr so it does not clean
+ // up the sucessfully bound config info.
+ new_config_info_ptr.release ();
+
+ // Increase the count of successfully bound config infos.
+ ++this->config_info_count_;
+ }
+
+ // Add RT_Infos to scheduler
+ TAO_RT_Info_Ex* new_rt_info;
+ for (int num_rt_infos = 0; num_rt_infos < rt_info_count; ++num_rt_infos)
+ {
+ new_rt_info = create_i (rt_info [num_rt_infos].entry_point,
+ rt_info [num_rt_infos].handle, 1
+ ACE_ENV_ARG_PARAMETER);
+ ACE_CHECK_RETURN (-1);
+
+ if (new_rt_info == 0)
+ {
+ ACE_THROW_RETURN (RtecScheduler::INTERNAL (), -1);
+ }
+
+ // Set the new info's enabled state
+ new_rt_info->enabled_state (rt_info [num_rt_infos].enabled);
+
+ // Fill in the portions to which the user has access.
+ this->set_i (new_rt_info,
+ RtecScheduler::Criticality_t (rt_info [num_rt_infos].criticality),
+ rt_info [num_rt_infos].worst_case_execution_time,
+ rt_info [num_rt_infos].typical_execution_time,
+ rt_info [num_rt_infos].cached_execution_time,
+ rt_info [num_rt_infos].period,
+ RtecScheduler::Importance_t (rt_info [num_rt_infos].importance),
+ rt_info [num_rt_infos].quantum,
+ rt_info [num_rt_infos].threads,
+ RtecScheduler::Info_Type_t (rt_info [num_rt_infos].info_type)
+ ACE_ENV_ARG_PARAMETER);
+ ACE_CHECK_RETURN (-1);
+
+ // Fill in the scheduler managed portions.
+ new_rt_info->priority =
+ rt_info [num_rt_infos].priority;
+ new_rt_info->preemption_subpriority =
+ rt_info [num_rt_infos].static_subpriority;
+ new_rt_info->preemption_priority =
+ rt_info [num_rt_infos].preemption_priority;
+ new_rt_info->volatile_token = 0;
+
+ // Add dependencies between RT_Infos to scheduler.
+ for (i = 0; i < dependency_count; ++i)
+ {
+ add_dependency_i (dependency_info [dependency_count_].info_that_depends,
+ dependency_info [dependency_count_].info_depended_on,
+ dependency_info [dependency_count_].number_of_calls,
+ dependency_info [dependency_count_].dependency_type,
+ dependency_info [dependency_count_].enabled
+ ACE_ENV_ARG_PARAMETER);
+ ACE_CHECK_RETURN (-1);
+
+ ++this->dependency_count_;
+ }
+
+ }
+
+ // Set stability flags after the operations are loaded, as the passed flags
+ // should be respected as being the stability state of the passed schedule.
+ this->stability_flags_ = stability_flags;
+
+ return result;
+}
+
+// Closes the scheduler, releasing all current resources.
+template <class RECONFIG_SCHED_STRATEGY, class ACE_LOCK> void
+TAO_Reconfig_Scheduler<RECONFIG_SCHED_STRATEGY, ACE_LOCK>::close (ACE_ENV_SINGLE_ARG_DECL)
+ ACE_THROW_SPEC ((CORBA::SystemException,
+ RtecScheduler::INTERNAL,
+ RtecScheduler::UNKNOWN_TASK,
+ RtecScheduler::SYNCHRONIZATION_FAILURE))
+{
+#if defined (SCHEDULER_LOGGING)
+ ACE_DEBUG ((LM_TRACE,
+ " TAO_Reconfig_Scheduler::close.\n"));
+#endif /* SCHEDULER_LOGGING */
+
+ ACE_GUARD_THROW_EX (ACE_LOCK, ace_mon, this->mutex_,
+ RtecScheduler::SYNCHRONIZATION_FAILURE ());
+ ACE_CHECK;
+
+ // Unbind and delete each RT_Info in the map: this also cleans up
+ // all the entries and tuples associated with each RT_Info.
+ TAO_RT_Info_Ex *rt_info = 0;
+ RtecScheduler::handle_t handle;
+ while (rt_info_map_.current_size () > 0)
+ {
+ handle = (*rt_info_map_.begin ()).ext_id_;
+ if (rt_info_map_.unbind (handle, rt_info) == 0)
+ {
+ if (rt_info_tree_.unbind (rt_info->entry_point) == 0)
+ {
+ // Delete the entry associated with the RT_Info, then
+ // the RT_Info itself.
+ delete ACE_LONGLONG_TO_PTR (TAO_Reconfig_Scheduler_Entry *,
+ rt_info->volatile_token);
+ delete rt_info;
+ }
+ else
+ {
+ ACE_THROW (RtecScheduler::INTERNAL ());
+ }
+ }
+ else
+ {
+ ACE_THROW (RtecScheduler::UNKNOWN_TASK ());
+ }
+ }
+
+ // Delete each Config_Info in the map.
+ RtecScheduler::Preemption_Priority_t config_priority;
+ RtecScheduler::Config_Info *config_info = 0;
+ while (config_info_map_.current_size () > 0)
+ {
+ config_priority = (*config_info_map_.begin ()).ext_id_;
+ if (config_info_map_.unbind (config_priority, config_info) == 0)
+ {
+ delete config_info;
+ }
+ else
+ {
+ ACE_THROW (RtecScheduler::INTERNAL ());
+ }
+ }
+
+ // Delete each dependency set in the caller map
+ RtecScheduler::Dependency_Set *dependency_set = 0;
+ while (calling_dependency_set_map_.current_size () > 0)
+ {
+ handle = (*calling_dependency_set_map_.begin ()).ext_id_;
+ if (calling_dependency_set_map_.unbind (handle, dependency_set) == 0)
+ {
+ delete dependency_set;
+ }
+ else
+ {
+ ACE_THROW (RtecScheduler::INTERNAL ());
+ }
+ }
+
+ // Delete each dependency set in the called map
+ while (called_dependency_set_map_.current_size () > 0)
+ {
+ handle = (*called_dependency_set_map_.begin ()).ext_id_;
+ if (called_dependency_set_map_.unbind (handle, dependency_set) == 0)
+ {
+ delete dependency_set;
+ }
+ else
+ {
+ ACE_THROW (RtecScheduler::INTERNAL ());
+ }
+ }
+
+ // Zero out the scheduling entry pointer array but do not deallocate it.
+ if (entry_ptr_array_size_ > 0)
+ {
+ ACE_OS::memset (this->entry_ptr_array_, 0,
+ sizeof (TAO_Reconfig_Scheduler_Entry *)
+ * this->entry_ptr_array_size_);
+ }
+
+ // Zero out the scheduling entry pointer array but do not deallocate it.
+ if (tuple_ptr_array_size_ > 0)
+ {
+ ACE_OS::memset (this->tuple_ptr_array_, 0,
+ sizeof (TAO_RT_Info_Tuple *)
+ * this->tuple_ptr_array_size_);
+ }
+
+ // Finally, reset the entry counts and start over with the lowest
+ // handle number.
+ this->config_info_count_ = 0;
+ this->rt_info_count_ = 0;
+ this->rt_info_tuple_count_ = 0;
+ this->next_handle_ = 1;
+}
+
+// Create an RT_Info. If it does not exist, a new RT_Info is
+// created and inserted into the schedule, and the handle of the new
+// RT_Info is returned. If the RT_Info already exists, an exception
+// is thrown.
+
+template <class RECONFIG_SCHED_STRATEGY, class ACE_LOCK>
+RtecScheduler::handle_t
+TAO_Reconfig_Scheduler<RECONFIG_SCHED_STRATEGY, ACE_LOCK>::
+create (const char *entry_point
+ ACE_ENV_ARG_DECL)
+ ACE_THROW_SPEC ((CORBA::SystemException,
+ RtecScheduler::DUPLICATE_NAME,
+ RtecScheduler::INTERNAL,
+ RtecScheduler::SYNCHRONIZATION_FAILURE))
+{
+#if defined (SCHEDULER_LOGGING)
+ ACE_DEBUG ((LM_TRACE,
+ " TAO_Reconfig_Scheduler::create.\n"));
+#endif /* SCHEDULER_LOGGING */
+
+ ACE_GUARD_THROW_EX (ACE_LOCK, ace_mon, this->mutex_,
+ RtecScheduler::SYNCHRONIZATION_FAILURE ());
+ ACE_CHECK_RETURN (0);
+
+ RtecScheduler::handle_t handle = next_handle_;
+ create_i (entry_point, handle, 0 ACE_ENV_ARG_PARAMETER);
+ ACE_CHECK_RETURN (handle);
+
+ // Set affected stability flags.
+ this->stability_flags_ |=
+ SCHED_UTILIZATION_NOT_STABLE |
+ SCHED_PRIORITY_NOT_STABLE;
+
+ return handle;
+}
+
+// Lookup a handle for an RT_Info, and return its handle, or an error
+// value if it's not present.
+
+template <class RECONFIG_SCHED_STRATEGY, class ACE_LOCK>
+RtecScheduler::handle_t
+TAO_Reconfig_Scheduler<RECONFIG_SCHED_STRATEGY, ACE_LOCK>::
+lookup (const char * entry_point
+ ACE_ENV_ARG_DECL)
+ ACE_THROW_SPEC ((CORBA::SystemException,
+ RtecScheduler::UNKNOWN_TASK,
+ RtecScheduler::SYNCHRONIZATION_FAILURE))
+{
+#if defined (SCHEDULER_LOGGING)
+ ACE_DEBUG ((LM_TRACE,
+ " TAO_Reconfig_Scheduler::lookup.\n"));
+#endif /* SCHEDULER_LOGGING */
+
+ ACE_GUARD_THROW_EX (ACE_LOCK, ace_mon, this->mutex_,
+ RtecScheduler::SYNCHRONIZATION_FAILURE ());
+ ACE_CHECK_RETURN (0);
+
+ RtecScheduler::handle_t handle;
+ handle = this->lookup_i (entry_point ACE_ENV_ARG_PARAMETER);
+ ACE_CHECK_RETURN (handle);
+
+ return handle;
+}
+
+
+// Return a pointer to the RT_Info corresponding to the passed handle.
+
+template <class RECONFIG_SCHED_STRATEGY, class ACE_LOCK>
+RtecScheduler::RT_Info *
+TAO_Reconfig_Scheduler<RECONFIG_SCHED_STRATEGY, ACE_LOCK>::
+get (RtecScheduler::handle_t handle
+ ACE_ENV_ARG_DECL)
+ ACE_THROW_SPEC((CORBA::SystemException,
+ RtecScheduler::UNKNOWN_TASK,
+ RtecScheduler::SYNCHRONIZATION_FAILURE))
+{
+#if defined (SCHEDULER_LOGGING)
+ ACE_DEBUG ((LM_TRACE,
+ " TAO_Reconfig_Scheduler::get.\n"));
+#endif /* SCHEDULER_LOGGING */
+
+ ACE_GUARD_THROW_EX (ACE_LOCK, ace_mon, this->mutex_,
+ RtecScheduler::SYNCHRONIZATION_FAILURE ());
+ ACE_CHECK_RETURN (0);
+
+ // Find the RT_Info in the hash map.
+ TAO_RT_Info_Ex *rt_info = 0;
+ if (rt_info_map_.find (handle, rt_info) != 0)
+ {
+ ACE_THROW_RETURN (RtecScheduler::UNKNOWN_TASK (), 0);
+ }
+
+ // Allocate a new RT_Info
+ RtecScheduler::RT_Info* new_info;
+ ACE_NEW_THROW_EX (new_info,
+ RtecScheduler::RT_Info,
+ CORBA::NO_MEMORY ());
+ ACE_CHECK_RETURN (0);
+
+ *new_info = *rt_info;
+
+ return new_info;
+}
+
+
+// Set characteristics of the RT_Info corresponding to the passed handle.
+
+template <class RECONFIG_SCHED_STRATEGY, class ACE_LOCK>
+void
+TAO_Reconfig_Scheduler<RECONFIG_SCHED_STRATEGY, ACE_LOCK>::
+set (::RtecScheduler::handle_t handle,
+ ::RtecScheduler::Criticality_t criticality,
+ ::RtecScheduler::Time time,
+ ::RtecScheduler::Time typical_time,
+ ::RtecScheduler::Time cached_time,
+ ::RtecScheduler::Period_t period,
+ ::RtecScheduler::Importance_t importance,
+ ::RtecScheduler::Quantum_t quantum,
+ ::RtecScheduler::Threads_t threads,
+ ::RtecScheduler::Info_Type_t info_type
+ ACE_ENV_ARG_DECL)
+ ACE_THROW_SPEC ((CORBA::SystemException,
+ RtecScheduler::UNKNOWN_TASK,
+ RtecScheduler::INTERNAL,
+ RtecScheduler::SYNCHRONIZATION_FAILURE))
+{
+#if defined (SCHEDULER_LOGGING)
+ ACE_DEBUG ((LM_TRACE,
+ " TAO_Reconfig_Scheduler::set.\n"));
+#endif /* SCHEDULER_LOGGING */
+
+ ACE_GUARD_THROW_EX (ACE_LOCK, ace_mon, this->mutex_,
+ RtecScheduler::SYNCHRONIZATION_FAILURE ());
+ ACE_CHECK;
+
+ // Look up the RT_Info by its handle, throw an exception if it's not there.
+ TAO_RT_Info_Ex *rt_info_ptr = 0;
+ if (rt_info_map_.find (handle, rt_info_ptr) != 0)
+ {
+ ACE_THROW (RtecScheduler::UNKNOWN_TASK ());
+ }
+
+ if (rt_info_ptr == 0)
+ {
+ ACE_THROW (RtecScheduler::INTERNAL ());
+ }
+
+ // Enable the RT_Info if it was disabled. Does not modify NON_VOLATILE ops.
+ if (rt_info_ptr->enabled_state () == RtecScheduler::RT_INFO_DISABLED)
+ {
+ rt_info_ptr->enabled_state (RtecScheduler::RT_INFO_ENABLED);
+ }
+
+ // Call the internal set method.
+ this->set_i (rt_info_ptr, criticality, time, typical_time,
+ cached_time, period, importance, quantum,
+ threads, info_type ACE_ENV_ARG_PARAMETER);
+ ACE_CHECK;
+
+
+ // Update stability flags. For now, just mark everything as unstable.
+ // @@ TODO - revisit this and see if we can efficiently detect when
+ // changes do not affect stability of various aspects.
+ this->stability_flags_ |= SCHED_UTILIZATION_NOT_STABLE;
+ this->stability_flags_ |= SCHED_PRIORITY_NOT_STABLE;
+ this->stability_flags_ |= SCHED_PROPAGATION_NOT_STABLE;
+
+ return;
+}
+
+template <class RECONFIG_SCHED_STRATEGY, class ACE_LOCK>
+void
+TAO_Reconfig_Scheduler<RECONFIG_SCHED_STRATEGY, ACE_LOCK>::
+reset (RtecScheduler::handle_t handle,
+ RtecScheduler::Criticality_t criticality,
+ RtecScheduler::Time time,
+ RtecScheduler::Time typical_time,
+ RtecScheduler::Time cached_time,
+ RtecScheduler::Period_t period,
+ RtecScheduler::Importance_t importance,
+ RtecScheduler::Quantum_t quantum,
+ CORBA::Long threads,
+ RtecScheduler::Info_Type_t info_type
+ ACE_ENV_ARG_DECL)
+ ACE_THROW_SPEC ((CORBA::SystemException,
+ RtecScheduler::UNKNOWN_TASK,
+ RtecScheduler::INTERNAL,
+ RtecScheduler::SYNCHRONIZATION_FAILURE))
+{
+#if defined (SCHEDULER_LOGGING)
+ ACE_DEBUG ((LM_TRACE,
+ " TAO_Reconfig_Scheduler::reset.\n"));
+#endif /* SCHEDULER_LOGGING */
+
+ ACE_GUARD_THROW_EX (ACE_LOCK, ace_mon, this->mutex_,
+ RtecScheduler::SYNCHRONIZATION_FAILURE ());
+ ACE_CHECK;
+
+ // Look up the RT_Info by its handle, throw an exception if it's not there.
+ TAO_RT_Info_Ex *rt_info_ptr = 0;
+ if (rt_info_map_.find (handle, rt_info_ptr) != 0)
+ {
+ ACE_THROW (RtecScheduler::UNKNOWN_TASK ());
+ }
+ if (rt_info_ptr == 0)
+ {
+ ACE_THROW (RtecScheduler::INTERNAL ());
+ }
+
+ // Enable the RT_Info if it was disabled. Does not modify NON_VOLATILE ops.
+ if (rt_info_ptr->enabled_state () == RtecScheduler::RT_INFO_NON_VOLATILE)
+ {
+ ACE_THROW (RtecScheduler::UNKNOWN_TASK ());
+ }
+ else
+ {
+ // Reset the RT_Info.
+ rt_info_ptr->reset (TAO_Reconfig_Scheduler_Entry::ORIGINAL
+ | TAO_Reconfig_Scheduler_Entry::PROPAGATED);
+
+ rt_info_ptr->enabled_state (RtecScheduler::RT_INFO_ENABLED);
+ }
+
+ // Refresh the internal tuple pointer array.
+ this->refresh_tuple_ptr_array_i (ACE_ENV_SINGLE_ARG_PARAMETER);
+ ACE_CHECK;
+
+ // Then call the internal set method.
+ this->set_i (rt_info_ptr, criticality, time, typical_time,
+ cached_time, period, importance, quantum,
+ threads, info_type ACE_ENV_ARG_PARAMETER);
+ ACE_CHECK;
+
+
+ // Update stability flags. For now, just mark everything as unstable.
+ // @@ TODO - revisit this and see if we can efficiently detect when
+ // changes do not affect stability of various aspects.
+ this->stability_flags_ |= SCHED_UTILIZATION_NOT_STABLE;
+ this->stability_flags_ |= SCHED_PRIORITY_NOT_STABLE;
+ this->stability_flags_ |= SCHED_PROPAGATION_NOT_STABLE;
+
+ return;
+}
+
+
+
+template <class RECONFIG_SCHED_STRATEGY, class ACE_LOCK>
+void
+TAO_Reconfig_Scheduler<RECONFIG_SCHED_STRATEGY, ACE_LOCK>::
+set_seq (const RtecScheduler::RT_Info_Set& infos
+ ACE_ENV_ARG_DECL)
+ ACE_THROW_SPEC ((CORBA::SystemException,
+ RtecScheduler::UNKNOWN_TASK,
+ RtecScheduler::INTERNAL,
+ RtecScheduler::SYNCHRONIZATION_FAILURE))
+{
+#if defined (SCHEDULER_LOGGING)
+ ACE_DEBUG ((LM_TRACE,
+ " TAO_Reconfig_Scheduler::set_seq.\n"));
+#endif /* SCHEDULER_LOGGING */
+
+ ACE_GUARD_THROW_EX (ACE_LOCK, ace_mon, this->mutex_,
+ RtecScheduler::SYNCHRONIZATION_FAILURE ());
+ ACE_CHECK;
+
+ for (u_int i = 0; i < infos.length (); ++i)
+ {
+ // Look up the RT_Info by its handle, throw an exception if it's not there.
+ TAO_RT_Info_Ex *rt_info_ptr = 0;
+ if (rt_info_map_.find (infos[i].handle, rt_info_ptr) != 0)
+ {
+ ACE_THROW (RtecScheduler::UNKNOWN_TASK ());
+ }
+
+ if (rt_info_ptr == 0)
+ {
+ ACE_THROW (RtecScheduler::INTERNAL ());
+ }
+
+ // Enable the RT_Info if it was disabled. Does not modify NON_VOLATILE ops.
+ if (rt_info_ptr->enabled_state () == RtecScheduler::RT_INFO_DISABLED)
+ {
+ rt_info_ptr->enabled_state (RtecScheduler::RT_INFO_ENABLED);
+ }
+
+#if defined (__BORLANDC__) && (__BORLANDC__ <= 0x582) && defined (NDEBUG)
+ // BCB2006 and BCB6 get an internal backend error when building this
+ // code in release mode, reported to Borland as QC27961
+ // Call the internal set method.
+ RtecScheduler::RT_Info info = infos[i];
+
+ this->set_i (rt_info_ptr,
+ info.criticality,
+ info.worst_case_execution_time,
+ info.typical_execution_time,
+ info.cached_execution_time,
+ info.period,
+ info.importance,
+ info.quantum,
+ info.threads,
+ info.info_type
+ ACE_ENV_ARG_PARAMETER);
+ ACE_CHECK;
+#else
+ this->set_i (rt_info_ptr,
+ infos[i].criticality,
+ infos[i].worst_case_execution_time,
+ infos[i].typical_execution_time,
+ infos[i].cached_execution_time,
+ infos[i].period,
+ infos[i].importance,
+ infos[i].quantum,
+ infos[i].threads,
+ infos[i].info_type
+ ACE_ENV_ARG_PARAMETER);
+#endif
+ }
+
+ // Update stability flags. For now, just mark everything as unstable.
+ // @@ TODO - revisit this and see if we can efficiently detect when
+ // changes do not affect stability of various aspects.
+ this->stability_flags_ |= SCHED_UTILIZATION_NOT_STABLE;
+ this->stability_flags_ |= SCHED_PRIORITY_NOT_STABLE;
+ this->stability_flags_ |= SCHED_PROPAGATION_NOT_STABLE;
+
+ return;
+}
+
+
+template <class RECONFIG_SCHED_STRATEGY, class ACE_LOCK>
+void
+TAO_Reconfig_Scheduler<RECONFIG_SCHED_STRATEGY, ACE_LOCK>::
+reset_seq (const RtecScheduler::RT_Info_Set& infos
+ ACE_ENV_ARG_DECL)
+ ACE_THROW_SPEC ((CORBA::SystemException,
+ RtecScheduler::UNKNOWN_TASK,
+ RtecScheduler::INTERNAL,
+ RtecScheduler::SYNCHRONIZATION_FAILURE))
+{
+#if defined (SCHEDULER_LOGGING)
+ ACE_DEBUG ((LM_TRACE,
+ " TAO_Reconfig_Scheduler::reset_seq.\n"));
+#endif /* SCHEDULER_LOGGING */
+
+ ACE_GUARD_THROW_EX (ACE_LOCK, ace_mon, this->mutex_,
+ RtecScheduler::SYNCHRONIZATION_FAILURE ());
+ ACE_CHECK;
+
+ TAO_RT_Info_Ex *rt_info_ptr = 0;
+ u_int i;
+
+ for (i = 0; i < infos.length (); ++i)
+ {
+ // Look up the RT_Info by its handle, throw an exception if it's not there.
+ if (rt_info_map_.find (infos[i].handle, rt_info_ptr) != 0)
+ {
+ ACE_THROW (RtecScheduler::UNKNOWN_TASK ());
+ }
+
+ // Enable the RT_Info. Does not modify NON_VOLATILE ops.
+ if (rt_info_ptr->enabled_state () == RtecScheduler::RT_INFO_NON_VOLATILE)
+ {
+ ACE_THROW (RtecScheduler::UNKNOWN_TASK ());
+ }
+ else
+ {
+ // Reset the RT_Info.
+ rt_info_ptr->reset (TAO_Reconfig_Scheduler_Entry::ORIGINAL
+ | TAO_Reconfig_Scheduler_Entry::PROPAGATED);
+
+ rt_info_ptr->enabled_state (RtecScheduler::RT_INFO_ENABLED);
+ }
+ }
+
+ // Refresh the internal tuple pointer array.
+ this->refresh_tuple_ptr_array_i (ACE_ENV_SINGLE_ARG_PARAMETER);
+ ACE_CHECK;
+
+ for (i = 0; i < infos.length (); ++i)
+ {
+ // Look up the RT_Info by its handle, throw an exception if it's not there.
+ if (rt_info_map_.find (infos[i].handle, rt_info_ptr) != 0)
+ {
+ ACE_THROW (RtecScheduler::UNKNOWN_TASK ());
+ }
+
+ if (rt_info_ptr == 0)
+ {
+ ACE_THROW (RtecScheduler::INTERNAL ());
+ }
+
+#if defined (__BORLANDC__) && (__BORLANDC__ <= 0x582) && defined (NDEBUG)
+ // BCB2006 and BCB6 get an internal backend error when building this
+ // code in release mode, reported to Borland as QC27961
+ // Call the internal set method.
+ RtecScheduler::RT_Info info = infos[i];
+
+ // Call the internal set method.
+ this->set_i (rt_info_ptr,
+ info.criticality,
+ info.worst_case_execution_time,
+ info.typical_execution_time,
+ info.cached_execution_time,
+ info.period,
+ info.importance,
+ info.quantum,
+ info.threads,
+ info.info_type
+ ACE_ENV_ARG_PARAMETER);
+ ACE_CHECK;
+#else
+ // Call the internal set method.
+ this->set_i (rt_info_ptr,
+ infos[i].criticality,
+ infos[i].worst_case_execution_time,
+ infos[i].typical_execution_time,
+ infos[i].cached_execution_time,
+ infos[i].period,
+ infos[i].importance,
+ infos[i].quantum,
+ infos[i].threads,
+ infos[i].info_type
+ ACE_ENV_ARG_PARAMETER);
+ ACE_CHECK;
+#endif
+ }
+
+ // Update stability flags. For now, just mark everything as unstable.
+ // @@ TODO - revisit this and see if we can efficiently detect when
+ // changes do not affect stability of various aspects.
+ this->stability_flags_ |= SCHED_UTILIZATION_NOT_STABLE;
+ this->stability_flags_ |= SCHED_PRIORITY_NOT_STABLE;
+ this->stability_flags_ |= SCHED_PROPAGATION_NOT_STABLE;
+
+ return;
+}
+
+template <class RECONFIG_SCHED_STRATEGY, class ACE_LOCK>
+void
+TAO_Reconfig_Scheduler<RECONFIG_SCHED_STRATEGY, ACE_LOCK>::
+replace_seq (const RtecScheduler::RT_Info_Set& infos
+ ACE_ENV_ARG_DECL)
+ ACE_THROW_SPEC ((CORBA::SystemException,
+ RtecScheduler::UNKNOWN_TASK,
+ RtecScheduler::INTERNAL,
+ RtecScheduler::SYNCHRONIZATION_FAILURE))
+{
+#if defined (SCHEDULER_LOGGING)
+ ACE_DEBUG ((LM_TRACE,
+ " TAO_Reconfig_Scheduler::replace_seq.\n"));
+#endif /* SCHEDULER_LOGGING */
+
+ ACE_GUARD_THROW_EX (ACE_LOCK, ace_mon, this->mutex_,
+ RtecScheduler::SYNCHRONIZATION_FAILURE ());
+ ACE_CHECK;
+
+ TAO_RT_Info_Ex *rt_info_ptr = 0;
+
+ for (ACE_TYPENAME RT_INFO_MAP::iterator info_iter (this->rt_info_map_);
+ info_iter.done () == 0;
+ ++info_iter)
+ {
+ // Get a pointer to each registered RT_Info.
+ rt_info_ptr = (*info_iter).int_id_;
+ if (! rt_info_ptr)
+ {
+ ACE_THROW (RtecScheduler::INTERNAL ());
+ }
+
+ switch (rt_info_ptr->enabled_state ())
+ {
+ case RtecScheduler::RT_INFO_ENABLED:
+
+ // Disable enabled RT_Infos.
+ rt_info_ptr->enabled_state (RtecScheduler::RT_INFO_DISABLED);
+
+ // Reset Enabled and Non-Volatile RT_Infos.
+ rt_info_ptr->reset (TAO_Reconfig_Scheduler_Entry::ORIGINAL
+ | TAO_Reconfig_Scheduler_Entry::PROPAGATED);
+ break;
+
+ // Intentional fall-through to ignore non-volatile RT_Infos
+ case RtecScheduler::RT_INFO_NON_VOLATILE:
+
+ default: // Ignore disabled RT_Infos.
+ break;
+ }
+ }
+
+ // Zero out the tuple pointer array, set count to zero
+ ACE_OS::memset (this->tuple_ptr_array_, 0,
+ sizeof (TAO_RT_Info_Tuple *)
+ * this->tuple_ptr_array_size_);
+ this->rt_info_tuple_count_ = 0;
+
+ for (u_int i = 0; i < infos.length (); ++i)
+ {
+ // Look up the RT_Info by its handle, throw an exception if it's not there.
+ if (rt_info_map_.find (infos[i].handle, rt_info_ptr) != 0)
+ {
+ ACE_THROW (RtecScheduler::UNKNOWN_TASK ());
+ }
+
+ if (rt_info_ptr == 0)
+ {
+ ACE_THROW (RtecScheduler::INTERNAL ());
+ }
+
+ // Enable the RT_Info if it was disabled. Does not modify NON_VOLATILE ops.
+ if (rt_info_ptr->enabled_state () == RtecScheduler::RT_INFO_DISABLED)
+ {
+ rt_info_ptr->enabled_state (RtecScheduler::RT_INFO_ENABLED);
+ }
+
+#if defined (__BORLANDC__) && (__BORLANDC__ <= 0x582) && defined (NDEBUG)
+ // BCB2006 and BCB6 get an internal backend error when building this
+ // code in release mode, reported to Borland as QC27961
+ // Call the internal set method.
+ RtecScheduler::RT_Info info = infos[i];
+
+ // Call the internal set method.
+ this->set_i (rt_info_ptr,
+ info.criticality,
+ info.worst_case_execution_time,
+ info.typical_execution_time,
+ info.cached_execution_time,
+ info.period,
+ info.importance,
+ info.quantum,
+ info.threads,
+ info.info_type
+ ACE_ENV_ARG_PARAMETER);
+ ACE_CHECK;
+#else
+ // Call the internal set method.
+ this->set_i (rt_info_ptr,
+ infos[i].criticality,
+ infos[i].worst_case_execution_time,
+ infos[i].typical_execution_time,
+ infos[i].cached_execution_time,
+ infos[i].period,
+ infos[i].importance,
+ infos[i].quantum,
+ infos[i].threads,
+ infos[i].info_type
+ ACE_ENV_ARG_PARAMETER);
+ ACE_CHECK;
+#endif
+ }
+
+ // Update stability flags. For now, just mark everything as unstable.
+ // @@ TODO - revisit this and see if we can efficiently detect when
+ // changes do not affect stability of various aspects.
+ this->stability_flags_ |= SCHED_UTILIZATION_NOT_STABLE;
+ this->stability_flags_ |= SCHED_PRIORITY_NOT_STABLE;
+ this->stability_flags_ |= SCHED_PROPAGATION_NOT_STABLE;
+
+ return;
+}
+
+
+// Returns the priority and subpriority values assigned to an RT_Info,
+// based on its handle.
+
+template <class RECONFIG_SCHED_STRATEGY, class ACE_LOCK>
+void
+TAO_Reconfig_Scheduler<RECONFIG_SCHED_STRATEGY, ACE_LOCK>::
+priority (RtecScheduler::handle_t handle,
+ RtecScheduler::OS_Priority& o_priority,
+ RtecScheduler::Preemption_Subpriority_t& subpriority,
+ RtecScheduler::Preemption_Priority_t& p_priority
+ ACE_ENV_ARG_DECL)
+ ACE_THROW_SPEC ((CORBA::SystemException,
+ RtecScheduler::UNKNOWN_TASK,
+ RtecScheduler::SYNCHRONIZATION_FAILURE,
+ RtecScheduler::NOT_SCHEDULED))
+{
+ ACE_GUARD_THROW_EX (ACE_LOCK, ace_mon, this->mutex_,
+ RtecScheduler::SYNCHRONIZATION_FAILURE ());
+ ACE_CHECK;
+
+ // Check stability flags.
+ if ((this->stability_flags_ & SCHED_PRIORITY_NOT_STABLE)
+ && this->enforce_schedule_stability_)
+ {
+ ACE_THROW (RtecScheduler::NOT_SCHEDULED ());
+ }
+
+ // CDG - TBD - address priority "generations" i.e., after an
+ // adaptive transition. For now, go ahead and return whatever
+ // priority is there, even if the RT_Info_Ex is disabled.
+
+ TAO_RT_Info_Ex *rt_info = 0;
+ if (rt_info_map_.find (handle, rt_info) != 0)
+ {
+ ACE_THROW (RtecScheduler::UNKNOWN_TASK ());
+ }
+
+ o_priority = rt_info->priority;
+ subpriority = rt_info->preemption_subpriority;
+ p_priority = rt_info->preemption_priority;
+}
+
+
+// Returns the priority and subpriority values assigned to an RT_Info,
+// based on its entry point name.
+
+template <class RECONFIG_SCHED_STRATEGY, class ACE_LOCK>
+void
+TAO_Reconfig_Scheduler<RECONFIG_SCHED_STRATEGY, ACE_LOCK>::
+entry_point_priority (const char * entry_point,
+ RtecScheduler::OS_Priority& priority,
+ RtecScheduler::Preemption_Subpriority_t& subpriority,
+ RtecScheduler::Preemption_Priority_t& p_priority
+ ACE_ENV_ARG_DECL)
+ ACE_THROW_SPEC ((CORBA::SystemException,
+ RtecScheduler::UNKNOWN_TASK,
+ RtecScheduler::SYNCHRONIZATION_FAILURE,
+ RtecScheduler::NOT_SCHEDULED))
+{
+#if defined (SCHEDULER_LOGGING)
+ ACE_DEBUG ((LM_TRACE,
+ " TAO_Reconfig_Scheduler::entry_point_priority.\n"));
+#endif /* SCHEDULER_LOGGING */
+
+ ACE_GUARD_THROW_EX (ACE_LOCK, ace_mon, this->mutex_,
+ RtecScheduler::SYNCHRONIZATION_FAILURE ());
+ ACE_CHECK;
+
+ RtecScheduler::handle_t handle =
+ this->lookup_i (entry_point ACE_ENV_ARG_PARAMETER);
+ ACE_CHECK;
+
+ this->priority_i (handle,
+ priority,
+ subpriority,
+ p_priority
+ ACE_ENV_ARG_PARAMETER);
+ ACE_CHECK;
+}
+
+
+// This method registers a dependency between two RT_Infos.
+
+template <class RECONFIG_SCHED_STRATEGY, class ACE_LOCK>
+void
+TAO_Reconfig_Scheduler<RECONFIG_SCHED_STRATEGY, ACE_LOCK>::
+add_dependency (RtecScheduler::handle_t handle /* RT_Info that has the dependency */,
+ RtecScheduler::handle_t dependency /* RT_Info on which it depends */,
+ CORBA::Long number_of_calls,
+ RtecScheduler::Dependency_Type_t dependency_type
+ ACE_ENV_ARG_DECL)
+ ACE_THROW_SPEC ((CORBA::SystemException,
+ RtecScheduler::SYNCHRONIZATION_FAILURE,
+ RtecScheduler::UNKNOWN_TASK))
+{
+#if defined (SCHEDULER_LOGGING)
+ ACE_DEBUG ((LM_TRACE,
+ " TAO_Reconfig_Scheduler::add_dependency.\n"));
+#endif /* SCHEDULER_LOGGING */
+
+ ACE_GUARD_THROW_EX (ACE_LOCK, ace_mon, this->mutex_,
+ RtecScheduler::SYNCHRONIZATION_FAILURE ());
+ ACE_CHECK;
+
+ // Delegate to the internal method.
+ add_dependency_i (handle, dependency, number_of_calls, dependency_type,
+ RtecBase::DEPENDENCY_ENABLED ACE_ENV_ARG_PARAMETER);
+ ACE_CHECK;
+
+ // Since the call graph topology has changed, set *all*
+ // stability flags before incrementing the dependency count.
+ this->stability_flags_ |= SCHED_UTILIZATION_NOT_STABLE;
+ ++dependency_count_;
+}
+
+
+// This method removes a dependency between two RT_Infos.
+
+template <class RECONFIG_SCHED_STRATEGY, class ACE_LOCK>
+void
+TAO_Reconfig_Scheduler<RECONFIG_SCHED_STRATEGY, ACE_LOCK>::
+remove_dependency (RtecScheduler::handle_t handle,
+ RtecScheduler::handle_t dependency,
+ CORBA::Long number_of_calls,
+ RtecScheduler::Dependency_Type_t dependency_type
+ ACE_ENV_ARG_DECL)
+ ACE_THROW_SPEC ((CORBA::SystemException,
+ RtecScheduler::SYNCHRONIZATION_FAILURE,
+ RtecScheduler::UNKNOWN_TASK))
+{
+#if defined (SCHEDULER_LOGGING)
+ ACE_DEBUG ((LM_TRACE,
+ " TAO_Reconfig_Scheduler::remove_dependency.\n"));
+#endif /* SCHEDULER_LOGGING */
+
+ ACE_GUARD_THROW_EX (ACE_LOCK, ace_mon, this->mutex_,
+ RtecScheduler::SYNCHRONIZATION_FAILURE ());
+ ACE_CHECK;
+
+ // Delegate to the internal method.
+ remove_dependency_i (handle, dependency, number_of_calls,
+ dependency_type ACE_ENV_ARG_PARAMETER);
+ ACE_CHECK;
+
+ // Since the call graph topology has changed, set *all*
+ // stability flags before incrementing the dependency count.
+ this->stability_flags_ |= SCHED_UTILIZATION_NOT_STABLE;
+ --dependency_count_;
+}
+
+// This method sets the enable state for a dependency between two RT_Infos.
+
+template <class RECONFIG_SCHED_STRATEGY, class ACE_LOCK>
+void
+TAO_Reconfig_Scheduler<RECONFIG_SCHED_STRATEGY, ACE_LOCK>::
+set_dependency_enable_state (RtecScheduler::handle_t handle,
+ RtecScheduler::handle_t dependency,
+ CORBA::Long number_of_calls,
+ RtecScheduler::Dependency_Type_t dependency_type,
+ RtecScheduler::Dependency_Enabled_Type_t enabled
+ ACE_ENV_ARG_DECL)
+ ACE_THROW_SPEC ((CORBA::SystemException,
+ RtecScheduler::SYNCHRONIZATION_FAILURE,
+ RtecScheduler::UNKNOWN_TASK))
+{
+#if defined (SCHEDULER_LOGGING)
+ ACE_DEBUG ((LM_TRACE,
+ " TAO_Reconfig_Scheduler::set_dependency_enable_state.\n"));
+#endif /* SCHEDULER_LOGGING */
+
+ ACE_GUARD_THROW_EX (ACE_LOCK, ace_mon, this->mutex_,
+ RtecScheduler::SYNCHRONIZATION_FAILURE ());
+ ACE_CHECK;
+
+ // Delegate to the internal method.
+ set_dependency_enable_state_i (handle, dependency, number_of_calls,
+ dependency_type, enabled ACE_ENV_ARG_PARAMETER);
+ ACE_CHECK;
+}
+
+
+// This method sets the enable state of a sequence of dependencies.
+
+template <class RECONFIG_SCHED_STRATEGY, class ACE_LOCK>
+void
+TAO_Reconfig_Scheduler<RECONFIG_SCHED_STRATEGY, ACE_LOCK>::
+set_dependency_enable_state_seq (const RtecScheduler::Dependency_Set & dependencies
+ ACE_ENV_ARG_DECL)
+ ACE_THROW_SPEC ((CORBA::SystemException,
+ RtecScheduler::SYNCHRONIZATION_FAILURE,
+ RtecScheduler::UNKNOWN_TASK))
+{
+#if defined (SCHEDULER_LOGGING)
+ ACE_DEBUG ((LM_TRACE,
+ " TAO_Reconfig_Scheduler::set_dependency_enable_state_seq.\n"));
+#endif /* SCHEDULER_LOGGING */
+
+ ACE_GUARD_THROW_EX (ACE_LOCK, ace_mon, this->mutex_,
+ RtecScheduler::SYNCHRONIZATION_FAILURE ());
+ ACE_CHECK;
+
+ // Delegate to the internal method for each dependency in the sequence.
+ for (u_int i = 0; i < dependencies.length (); ++i)
+ {
+ set_dependency_enable_state_i (dependencies[i].rt_info,
+ dependencies[i].rt_info_depended_on,
+ dependencies[i].number_of_calls,
+ dependencies[i].dependency_type,
+ dependencies[i].enabled
+ ACE_ENV_ARG_PARAMETER);
+ ACE_CHECK;
+ }
+}
+
+
+// This method enables or disables an RT_Info.
+
+template <class RECONFIG_SCHED_STRATEGY, class ACE_LOCK>
+void
+TAO_Reconfig_Scheduler<RECONFIG_SCHED_STRATEGY, ACE_LOCK>::
+set_rt_info_enable_state (RtecScheduler::handle_t handle,
+ RtecScheduler::RT_Info_Enabled_Type_t enabled
+ ACE_ENV_ARG_DECL)
+ ACE_THROW_SPEC ((CORBA::SystemException,
+ RtecScheduler::SYNCHRONIZATION_FAILURE,
+ RtecScheduler::INTERNAL,
+ RtecScheduler::UNKNOWN_TASK))
+{
+#if defined (SCHEDULER_LOGGING)
+ ACE_DEBUG ((LM_TRACE,
+ " TAO_Reconfig_Scheduler::set_rt_info_enable_state.\n"));
+#endif /* SCHEDULER_LOGGING */
+
+ ACE_GUARD_THROW_EX (ACE_LOCK, ace_mon, this->mutex_,
+ RtecScheduler::SYNCHRONIZATION_FAILURE ());
+ ACE_CHECK;
+
+ // Look up the RT_Info by its handle, throw an exception if it's not there.
+ TAO_RT_Info_Ex *rt_info_ptr = 0;
+ if (rt_info_map_.find (handle, rt_info_ptr) != 0)
+ {
+ ACE_THROW (RtecScheduler::UNKNOWN_TASK ());
+ }
+
+ if (rt_info_ptr == 0)
+ {
+ ACE_THROW (RtecScheduler::INTERNAL ());
+ }
+
+ // Enable the RT_Info.
+ rt_info_ptr->enabled_state (enabled);
+}
+
+
+// This method enables or disables a sequence of RT_Infos.
+
+template <class RECONFIG_SCHED_STRATEGY, class ACE_LOCK>
+void
+TAO_Reconfig_Scheduler<RECONFIG_SCHED_STRATEGY, ACE_LOCK>::
+set_rt_info_enable_state_seq (const RtecScheduler::RT_Info_Enable_State_Pair_Set & pair_set
+ ACE_ENV_ARG_DECL)
+ ACE_THROW_SPEC ((CORBA::SystemException,
+ RtecScheduler::SYNCHRONIZATION_FAILURE,
+ RtecScheduler::INTERNAL,
+ RtecScheduler::UNKNOWN_TASK))
+{
+#if defined (SCHEDULER_LOGGING)
+ ACE_DEBUG ((LM_TRACE,
+ " TAO_Reconfig_Scheduler::set_rt_info_enable_state_seq.\n"));
+#endif /* SCHEDULER_LOGGING */
+
+ ACE_GUARD_THROW_EX (ACE_LOCK, ace_mon, this->mutex_,
+ RtecScheduler::SYNCHRONIZATION_FAILURE ());
+ ACE_CHECK;
+
+ for (u_int i = 0; i < pair_set.length (); ++i)
+ {
+ // Look up the RT_Info by its handle, throw an exception if it's not there.
+ TAO_RT_Info_Ex *rt_info_ptr = 0;
+ if (rt_info_map_.find (pair_set[i].handle, rt_info_ptr) != 0)
+ {
+ ACE_THROW (RtecScheduler::UNKNOWN_TASK ());
+ }
+
+ if (rt_info_ptr == 0)
+ {
+ ACE_THROW (RtecScheduler::INTERNAL ());
+ }
+
+ // Enable the RT_Info.
+ rt_info_ptr->enabled_state (pair_set[i].enabled);
+ }
+}
+
+
+// If information has been added or changed since the last stable
+// schedule was computed, this method causes scheduling information
+// to be computed for all registered RT_Infos. If the schedule is
+// already stable, this is a no-op
+
+template <class RECONFIG_SCHED_STRATEGY, class ACE_LOCK>
+void
+TAO_Reconfig_Scheduler<RECONFIG_SCHED_STRATEGY, ACE_LOCK>::
+compute_scheduling (CORBA::Long minimum_priority,
+ CORBA::Long maximum_priority,
+ RtecScheduler::RT_Info_Set_out infos,
+ RtecScheduler::Dependency_Set_out dependencies,
+ RtecScheduler::Config_Info_Set_out configs,
+ RtecScheduler::Scheduling_Anomaly_Set_out anomalies
+ ACE_ENV_ARG_DECL)
+ ACE_THROW_SPEC ((CORBA::SystemException,
+ RtecScheduler::UTILIZATION_BOUND_EXCEEDED,
+ RtecScheduler::SYNCHRONIZATION_FAILURE,
+ RtecScheduler::INSUFFICIENT_THREAD_PRIORITY_LEVELS,
+ RtecScheduler::TASK_COUNT_MISMATCH,
+ RtecScheduler::INTERNAL,
+ RtecScheduler::DUPLICATE_NAME))
+{
+ // Delegates to recompute_scheduling and the respective accessors.
+ this->recompute_scheduling (minimum_priority, maximum_priority,
+ anomalies ACE_ENV_ARG_PARAMETER);
+ ACE_CHECK;
+
+ this->get_rt_info_set (infos ACE_ENV_ARG_PARAMETER);
+ ACE_CHECK;
+
+ this->get_dependency_set (dependencies ACE_ENV_ARG_PARAMETER);
+ ACE_CHECK;
+
+ this->get_config_info_set (configs ACE_ENV_ARG_PARAMETER);
+ ACE_CHECK;
+
+#if defined (SCHEDULER_DUMP)
+ ACE_DEBUG ((LM_TRACE, "Schedule prepared.\n"));
+ ACE_DEBUG ((LM_TRACE, "Dumping to stdout.\n"));
+ ACE_Scheduler_Factory::dump_schedule (*(infos.ptr()), *(dependencies.ptr()), *(configs.ptr()),
+ *(anomalies.ptr()), 0);
+ ACE_DEBUG ((LM_TRACE, "Dump done.\n"));
+#endif // SCHEDULER_DUMP
+
+ return;
+}
+
+// Recomputes the scheduling priorities, etc.
+
+template <class RECONFIG_SCHED_STRATEGY, class ACE_LOCK>
+void
+TAO_Reconfig_Scheduler<RECONFIG_SCHED_STRATEGY, ACE_LOCK>::
+recompute_scheduling (CORBA::Long /* minimum_priority */,
+ CORBA::Long /* maximum_priority */,
+ RtecScheduler::Scheduling_Anomaly_Set_out anomalies
+ ACE_ENV_ARG_DECL)
+ ACE_THROW_SPEC ((CORBA::SystemException,
+ RtecScheduler::UTILIZATION_BOUND_EXCEEDED,
+ RtecScheduler::SYNCHRONIZATION_FAILURE,
+ RtecScheduler::INSUFFICIENT_THREAD_PRIORITY_LEVELS,
+ RtecScheduler::TASK_COUNT_MISMATCH,
+ RtecScheduler::INTERNAL,
+ RtecScheduler::DUPLICATE_NAME))
+{
+#if defined (SCHEDULER_LOGGING)
+ ACE_DEBUG ((LM_TRACE,
+ " TAO_Reconfig_Scheduler::compute_scheduling.\n"));
+#endif /* SCHEDULER_LOGGING */
+
+ ACE_GUARD_THROW_EX (ACE_LOCK, ace_mon, this->mutex_,
+ RtecScheduler::SYNCHRONIZATION_FAILURE ());
+ ACE_CHECK;
+
+ // @@ TO DO - use these to establish the bounds of priority assignment.
+ // minimum_priority
+ // maximum_priority
+
+ // If everything is already up to date, we're done.
+ if (SCHED_ALL_STABLE == stability_flags_)
+ {
+
+ // Must always provide a value for an out parameter
+ ACE_NEW_THROW_EX (anomalies,
+ RtecScheduler::Scheduling_Anomaly_Set (0),
+ CORBA::NO_MEMORY ());
+ ACE_CHECK;
+ return;
+ }
+
+ // @@ TO DO - use try/catch blocks to catch exceptions and add anomalies
+ // to scheduling anomaly set, and then perhaps rethrow)
+
+ if ((this->stability_flags_ & SCHED_PROPAGATION_NOT_STABLE)
+ || (this->stability_flags_ & SCHED_UTILIZATION_NOT_STABLE))
+ {
+
+#if defined (SCHEDULER_LOGGING)
+ ACE_Scheduler_Factory::log_scheduling_entries(entry_ptr_array_,
+ this->rt_info_count_,
+ "1_pre_crit_traverse.txt");
+#endif
+
+ // Traverse criticality dependency graph, assigning a
+ // topological ordering and identifying threads.
+ crit_dfs_traverse_i (ACE_ENV_SINGLE_ARG_PARAMETER);
+ ACE_CHECK;
+
+#if defined (SCHEDULER_LOGGING)
+ ACE_Scheduler_Factory::log_scheduling_entries(entry_ptr_array_,
+ this->rt_info_count_,
+ "2_crit_dfs_traverse_i.txt");
+#endif
+
+ // Propagate criticalities.
+ propagate_criticalities_i (ACE_ENV_SINGLE_ARG_PARAMETER);
+ ACE_CHECK;
+
+#if defined (SCHEDULER_LOGGING)
+ ACE_Scheduler_Factory::log_scheduling_entries(entry_ptr_array_,
+ this->rt_info_count_,
+ "3_propagate_criticalities_i.txt");
+#endif
+
+#if defined (SCHEDULER_LOGGING)
+ ACE_Scheduler_Factory::log_scheduling_entries(entry_ptr_array_,
+ this->rt_info_count_,
+ "4_pre_traverse.txt");
+#endif
+
+ // Traverse dependency graph, assigning a topological ordering and identifying threads.
+ dfs_traverse_i (ACE_ENV_SINGLE_ARG_PARAMETER);
+ ACE_CHECK;
+
+#if defined (SCHEDULER_LOGGING)
+ ACE_Scheduler_Factory::log_scheduling_entries(entry_ptr_array_,
+ this->rt_info_count_,
+ "5_dfs_traverse_i.txt");
+#endif
+
+ // Sort an array of RT_info handles in topological order, check
+ // for loops using the strongly connected components algorithm.
+ detect_cycles_i (ACE_ENV_SINGLE_ARG_PARAMETER);
+ ACE_CHECK;
+
+#if defined (SCHEDULER_LOGGING)
+ ACE_Scheduler_Factory::log_scheduling_entries(entry_ptr_array_,
+ this->rt_info_count_,
+ "6_detect_cycles_i.txt");
+#endif
+
+ // Perform admission control for task delineator rate tuples.
+ perform_admission_i (ACE_ENV_SINGLE_ARG_PARAMETER);
+ ACE_CHECK;
+
+#if defined (SCHEDULER_LOGGING)
+ ACE_Scheduler_Factory::log_scheduling_entries(entry_ptr_array_,
+ this->rt_info_count_,
+ "7_perform_admission_i.txt");
+#endif
+
+ // Propagate effective execution time and period, set total frame size.
+ propagate_characteristics_i (ACE_ENV_SINGLE_ARG_PARAMETER);
+ ACE_CHECK;
+
+#if defined (SCHEDULER_LOGGING)
+ ACE_Scheduler_Factory::log_scheduling_entries(entry_ptr_array_,
+ this->rt_info_count_,
+ "8_propagate_characteristics_i.txt");
+#endif
+
+ }
+
+ if (this->stability_flags_ & SCHED_PRIORITY_NOT_STABLE)
+ {
+ // Sort operations by urgency, then assign priorities and
+ // subpriorities in one pass. Sets last scheduled priority and
+ // last feasible priority.
+ assign_priorities_i (ACE_ENV_SINGLE_ARG_PARAMETER);
+ ACE_CHECK;
+
+#if defined (SCHEDULER_LOGGING)
+ ACE_Scheduler_Factory::log_scheduling_entries(entry_ptr_array_,
+ this->rt_info_count_,
+ "9_assign_priorities_i.txt");
+#endif
+
+ }
+
+ // @@ TODO: record any scheduling anomalies in a set within the scheduler,
+ // storing the maximum severity level recorded so far.
+ if (anomalies.ptr () == 0)
+ {
+ ACE_NEW_THROW_EX (anomalies,
+ RtecScheduler::Scheduling_Anomaly_Set (0),
+ CORBA::NO_MEMORY ());
+ ACE_CHECK;
+ }
+
+ ACE_DEBUG ((LM_DEBUG,
+ "cutil = %f, ncutil = %f\n",
+ this->critical_utilization_,
+ this->noncritical_utilization_));
+
+ if (this->critical_utilization_ > critical_utilization_threshold_ ||
+ this->noncritical_utilization_ > noncritical_utilization_threshold_)
+ {
+ CORBA::ULong len = anomalies->length ();
+ anomalies->length (len + 1);
+ anomalies[len].description = CORBA::string_dup("Utilization Bound exceeded");
+ anomalies[len].severity = RtecScheduler::ANOMALY_ERROR;
+ }
+
+ // Set stability flags last.
+ this->stability_flags_ = SCHED_ALL_STABLE;
+ return;
+}
+
+
+// Returns the set of rt_infos, with their assigned priorities (as
+// of the last schedule re-computation).
+
+template <class RECONFIG_SCHED_STRATEGY, class ACE_LOCK>
+void
+TAO_Reconfig_Scheduler<RECONFIG_SCHED_STRATEGY, ACE_LOCK>::
+get_rt_info_set (RtecScheduler::RT_Info_Set_out infos
+ ACE_ENV_ARG_DECL)
+ ACE_THROW_SPEC ((CORBA::SystemException,
+ RtecScheduler::SYNCHRONIZATION_FAILURE,
+ RtecScheduler::INTERNAL))
+{
+ // return the set of scheduled RT_Infos
+
+ if (infos.ptr () == 0)
+ {
+ ACE_NEW_THROW_EX (infos,
+ RtecScheduler::RT_Info_Set (this->rt_info_count_),
+ CORBA::NO_MEMORY ());
+ ACE_CHECK;
+ }
+
+ infos->length (this->rt_info_count_);
+ TAO_RT_Info_Ex* rt_info = 0;
+ for (ACE_TYPENAME RT_INFO_MAP::iterator info_iter (this->rt_info_map_);
+ info_iter.done () == 0;
+ ++info_iter)
+ {
+ // TODO - rethink this: is it more useful to only return the *enabled* RT_Infos?
+ rt_info = (*info_iter).int_id_;
+ infos[static_cast<CORBA::ULong> (rt_info->handle - 1)] = *rt_info;
+ }
+
+ return;
+}
+
+
+// Returns the set of rt_infos, with their assigned priorities (as
+// of the last schedule re-computation).
+
+template <class RECONFIG_SCHED_STRATEGY, class ACE_LOCK>
+void
+TAO_Reconfig_Scheduler<RECONFIG_SCHED_STRATEGY, ACE_LOCK>::
+get_dependency_set (RtecScheduler::Dependency_Set_out dependencies
+ ACE_ENV_ARG_DECL_NOT_USED)
+ ACE_THROW_SPEC ((CORBA::SystemException,
+ RtecScheduler::SYNCHRONIZATION_FAILURE,
+ RtecScheduler::INTERNAL))
+{
+ // Return the set of dependencies: just need to iterate over one of the maps.
+
+ if (dependencies.ptr () == 0)
+ {
+ dependencies = new RtecScheduler::Dependency_Set (this->dependency_count_);
+ }
+ dependencies->length (this->dependency_count_);
+ RtecScheduler::Dependency_Set *dependency_set = 0;
+ int i = 0;
+ for (ACE_TYPENAME DEPENDENCY_SET_MAP::iterator
+ dependency_iter (this->called_dependency_set_map_);
+ dependency_iter.done () == 0 && i < this->dependency_count_;
+ ++dependency_iter)
+ {
+ dependency_set = (*dependency_iter).int_id_;
+ for (u_int j = 0;
+ j < dependency_set->length () && i < this->dependency_count_;
+ ++i, ++j)
+ {
+ (* dependencies) [i] = (*dependency_set) [j];
+ // For two-way calls, swap the handles (stored in reverse order in the called map)
+ if ((* dependencies) [i].dependency_type == RtecBase::TWO_WAY_CALL)
+ {
+ (* dependencies) [i].rt_info = (* dependency_set) [j].rt_info_depended_on;
+ (* dependencies) [i].rt_info_depended_on = (* dependency_set) [j].rt_info;
+ }
+ }
+ }
+
+ return;
+}
+
+
+// Returns the set of config_infos, describing the appropriate
+// number, types, and priority levels for the dispatching lanes.
+
+template <class RECONFIG_SCHED_STRATEGY, class ACE_LOCK>
+void
+TAO_Reconfig_Scheduler<RECONFIG_SCHED_STRATEGY, ACE_LOCK>::
+get_config_info_set (RtecScheduler::Config_Info_Set_out configs
+ ACE_ENV_ARG_DECL)
+ ACE_THROW_SPEC ((CORBA::SystemException,
+ RtecScheduler::SYNCHRONIZATION_FAILURE,
+ RtecScheduler::INTERNAL))
+{
+ // Return the set of scheduled Config_Infos.
+
+ if (configs.ptr () == 0)
+ {
+ ACE_NEW_THROW_EX (configs,
+ RtecScheduler::Config_Info_Set(this->
+ config_info_count_),
+ CORBA::NO_MEMORY ());
+ ACE_CHECK;
+ }
+
+ configs->length (this->config_info_count_);
+ RtecScheduler::Config_Info* config_info = 0;
+ for (ACE_TYPENAME CONFIG_INFO_MAP::iterator config_iter (this->config_info_map_);
+ config_iter.done () == 0;
+ ++config_iter)
+ {
+ config_info = (*config_iter).int_id_;
+ configs[static_cast<CORBA::ULong> (config_info->preemption_priority)] = *config_info;
+ }
+
+ return;
+}
+
+
+// Provides the thread priority and queue type for the given priority
+// level.
+
+template <class RECONFIG_SCHED_STRATEGY, class ACE_LOCK>
+void
+TAO_Reconfig_Scheduler<RECONFIG_SCHED_STRATEGY, ACE_LOCK>::
+dispatch_configuration (RtecScheduler::Preemption_Priority_t p_priority,
+ RtecScheduler::OS_Priority& t_priority,
+ RtecScheduler::Dispatching_Type_t & d_type
+ ACE_ENV_ARG_DECL)
+ ACE_THROW_SPEC ((CORBA::SystemException,
+ RtecScheduler::NOT_SCHEDULED,
+ RtecScheduler::SYNCHRONIZATION_FAILURE,
+ RtecScheduler::UNKNOWN_PRIORITY_LEVEL))
+{
+#if defined (SCHEDULER_LOGGING)
+ ACE_DEBUG ((LM_TRACE,
+ " TAO_Reconfig_Scheduler::dispatch_configuration.\n"));
+#endif /* SCHEDULER_LOGGING */
+
+ ACE_GUARD_THROW_EX (ACE_LOCK, ace_mon, this->mutex_,
+ RtecScheduler::SYNCHRONIZATION_FAILURE ());
+ ACE_CHECK;
+
+ // Check stability flags
+ if ((this->stability_flags_ & SCHED_PRIORITY_NOT_STABLE)
+ && this->enforce_schedule_stability_)
+ {
+ ACE_THROW (RtecScheduler::NOT_SCHEDULED ());
+ }
+
+ RtecScheduler::Config_Info *config_info = 0;
+ if (config_info_map_.find (p_priority, config_info) != 0)
+ {
+ ACE_THROW (RtecScheduler::UNKNOWN_PRIORITY_LEVEL());
+ }
+
+ t_priority = config_info->thread_priority;
+ d_type = config_info->dispatching_type;
+}
+
+
+// Returns the last priority number assigned to an operation in the
+// schedule. The number returned is one less than the total number
+// of scheduled priorities. All scheduled priorities range from 0
+// to the number returned, inclusive.
+
+template <class RECONFIG_SCHED_STRATEGY, class ACE_LOCK>
+RtecScheduler::Preemption_Priority_t
+TAO_Reconfig_Scheduler<RECONFIG_SCHED_STRATEGY, ACE_LOCK>::
+last_scheduled_priority (ACE_ENV_SINGLE_ARG_DECL)
+ ACE_THROW_SPEC ((CORBA::SystemException,
+ RtecScheduler::SYNCHRONIZATION_FAILURE,
+ RtecScheduler::NOT_SCHEDULED))
+{
+#if defined (SCHEDULER_LOGGING)
+ ACE_DEBUG ((LM_TRACE,
+ " TAO_Reconfig_Scheduler::last_scheduled_priority.\n"));
+#endif /* SCHEDULER_LOGGING */
+
+ ACE_GUARD_THROW_EX (ACE_LOCK, ace_mon, this->mutex_,
+ RtecScheduler::SYNCHRONIZATION_FAILURE ());
+ ACE_CHECK_RETURN (0);
+
+ // Check schedule stability flags.
+ if ((this->stability_flags_ & SCHED_PRIORITY_NOT_STABLE)
+ && this->enforce_schedule_stability_)
+ {
+ ACE_THROW_RETURN (RtecScheduler::NOT_SCHEDULED (),
+ (RtecScheduler::Preemption_Priority_t) -1);
+ }
+
+ return last_scheduled_priority_;
+}
+
+// Provides the set of Config_Infos associated with the current schedule.
+
+template <class RECONFIG_SCHED_STRATEGY, class ACE_LOCK>
+void
+TAO_Reconfig_Scheduler<RECONFIG_SCHED_STRATEGY, ACE_LOCK>::
+get_config_infos (RtecScheduler::Config_Info_Set_out configs
+ ACE_ENV_ARG_DECL)
+ ACE_THROW_SPEC ((CORBA::SystemException,
+ RtecScheduler::SYNCHRONIZATION_FAILURE,
+ RtecScheduler::NOT_SCHEDULED))
+{
+ ACE_GUARD_THROW_EX (ACE_LOCK, ace_mon, this->mutex_,
+ RtecScheduler::SYNCHRONIZATION_FAILURE ());
+ ACE_CHECK;
+
+ // Check schedule stability flags.
+ if ((this->stability_flags_ & SCHED_PRIORITY_NOT_STABLE)
+ && this->enforce_schedule_stability_)
+ {
+ ACE_THROW (RtecScheduler::NOT_SCHEDULED ());
+ }
+
+ // return the set of Config_Infos
+ if (configs.ptr () == 0)
+ {
+ ACE_NEW_THROW_EX (configs,
+ RtecScheduler::Config_Info_Set(this->
+ config_info_count_),
+ CORBA::NO_MEMORY ());
+ ACE_CHECK;
+ }
+ configs->length (this->config_info_count_);
+ RtecScheduler::Config_Info* config_info = 0;
+ for (ACE_TYPENAME CONFIG_INFO_MAP::iterator config_iter (this->config_info_map_);
+ config_iter.done () == 0;
+ ++config_iter)
+ {
+ config_info = (*config_iter).int_id_;
+ configs[static_cast<CORBA::ULong> (config_info->preemption_priority)] = *config_info;
+ }
+}
+
+
+// Internal method to create an RT_Info. If it does not exist, a new
+// RT_Info is created and inserted into the schedule, and the handle
+// of the new RT_Info is returned. If the RT_Info already exists,
+// then if the ignore_duplicates flag is set, the handle is simply
+// returned; otherwise, an exception is thrown.
+
+template <class RECONFIG_SCHED_STRATEGY, class ACE_LOCK>
+TAO_RT_Info_Ex *
+TAO_Reconfig_Scheduler<RECONFIG_SCHED_STRATEGY, ACE_LOCK>::
+create_i (const char *entry_point,
+ RtecScheduler::handle_t handle,
+ int ignore_duplicates
+ ACE_ENV_ARG_DECL)
+ ACE_THROW_SPEC ((CORBA::SystemException,
+ RtecScheduler::DUPLICATE_NAME,
+ RtecScheduler::INTERNAL))
+{
+#if defined (SCHEDULER_LOGGING)
+ ACE_DEBUG ((LM_TRACE,
+ " TAO_Reconfig_Scheduler::create_i.\n"));
+#endif /* SCHEDULER_LOGGING */
+
+ TAO_RT_Info_Ex* new_rt_info = 0;
+ TAO_Reconfig_Scheduler_Entry* new_sched_entry = 0;
+ int result = 0;
+
+ // If we're ignoring duplicates, check for and return the existing
+ // entry if there is one.
+ if (ignore_duplicates
+ && rt_info_map_.find (handle, new_rt_info) == 0)
+ {
+ return new_rt_info;
+ }
+
+ // Create a new scheduling entry for the RT_Info.
+ ACE_NEW_THROW_EX (new_rt_info,
+ TAO_RT_Info_Ex,
+ CORBA::NO_MEMORY ());
+ ACE_CHECK_RETURN (0);
+
+ // Make sure the new scheduling entry is cleaned up if we exit abruptly.
+ auto_ptr<TAO_RT_Info_Ex> new_rt_info_ptr (new_rt_info);
+
+ // Set some reasonable default values, and store the passed ones.
+ new_rt_info->entry_point = CORBA::string_dup (entry_point);
+ new_rt_info->handle = handle;
+
+ // Bind the new RT_Info to its handle, in the RT_Info map.
+ result = rt_info_map_.bind (handle, new_rt_info);
+ switch (result)
+ {
+ case -1:
+ // Something bad but unknown occurred while trying to bind in map.
+ ACE_THROW_RETURN (RtecScheduler::INTERNAL (), 0);
+
+ case 1:
+ // Tried to bind an operation that was already in the map.
+ if (ignore_duplicates)
+ {
+ // Should never get here unless something is badly awry.
+ ACE_THROW_RETURN (RtecScheduler::INTERNAL (), 0);
+ }
+ else
+ {
+ // Already bound, and we're not ignoring duplicates.
+ ACE_THROW_RETURN (RtecScheduler::DUPLICATE_NAME (), 0);
+ }
+
+ default:
+ break;
+ }
+
+ // Bind the new RT_Info to *its* entry point, in the tree.
+ result = rt_info_tree_.bind (new_rt_info->entry_point, new_rt_info);
+ switch (result)
+ {
+ case -1:
+ // Something bad but unknown occurred while trying to bind in tree.
+ rt_info_map_.unbind (handle);
+ ACE_THROW_RETURN (RtecScheduler::INTERNAL (), 0);
+
+ case 1:
+ // Tried to bind an operation that was already in the tree.
+ rt_info_map_.unbind (handle);
+ ACE_THROW_RETURN (RtecScheduler::DUPLICATE_NAME (), 0);
+
+ default:
+ break;
+ }
+
+ // Create a new scheduling entry for the RT_Info.
+ ACE_NEW_THROW_EX (new_sched_entry,
+ TAO_Reconfig_Scheduler_Entry (*new_rt_info),
+ CORBA::NO_MEMORY ());
+ ACE_CHECK_RETURN (0);
+
+ // Make sure the new scheduling entry is cleaned up if we exit abruptly.
+ auto_ptr<TAO_Reconfig_Scheduler_Entry> new_sched_entry_ptr (new_sched_entry);
+
+ // Maintain the size of the entry pointer array.
+ maintain_scheduling_array (entry_ptr_array_, entry_ptr_array_size_,
+ handle ACE_ENV_ARG_PARAMETER);
+ ACE_CHECK_RETURN (0);
+
+
+ // Store the new entry in the scheduling entry pointer array.
+ entry_ptr_array_ [handle - 1] = new_sched_entry;
+
+ // Release the auto pointers, so their destruction does not
+ // remove the new rt_info that is now in the map and tree,
+ // or the scheduling entry attached to the rt_info.
+ new_rt_info_ptr.release ();
+ new_sched_entry_ptr.release ();
+
+ // Connect the entry to the RT_Info.
+ new_rt_info->volatile_token =
+ static_cast<CORBA::ULongLong> (reinterpret_cast<ptrdiff_t> (new_sched_entry));
+
+ // With everything safely registered in the map and tree, just
+ // update the next handle and info counter and return the new info.
+ if (handle >= this->next_handle_)
+ {
+ this->next_handle_ = handle + 1;
+ }
+ if (handle > this->rt_info_count_)
+ {
+ this->rt_info_count_ = handle;
+ }
+
+ return new_rt_info;
+}
+
+// Internal method to set characteristics of the passed RT_Info.
+
+template <class RECONFIG_SCHED_STRATEGY, class ACE_LOCK> void
+TAO_Reconfig_Scheduler<RECONFIG_SCHED_STRATEGY, ACE_LOCK>::
+set_i (TAO_RT_Info_Ex *rt_info,
+ RtecScheduler::Criticality_t criticality,
+ RtecScheduler::Time time,
+ RtecScheduler::Time typical_time,
+ RtecScheduler::Time cached_time,
+ RtecScheduler::Period_t period,
+ RtecScheduler::Importance_t importance,
+ RtecScheduler::Quantum_t quantum,
+ CORBA::Long threads,
+ RtecScheduler::Info_Type_t info_type
+ ACE_ENV_ARG_DECL)
+ ACE_THROW_SPEC ((CORBA::SystemException,
+ RtecScheduler::INTERNAL))
+{
+#if defined (SCHEDULER_LOGGING)
+ ACE_DEBUG ((LM_TRACE,
+ " TAO_Reconfig_Scheduler::set_i.\n"));
+#endif /* SCHEDULER_LOGGING */
+
+ // Do not allow conjunction nodes for now.
+ if (info_type == RtecScheduler::CONJUNCTION)
+ {
+ ACE_ERROR ((LM_ERROR,
+ ACE_TEXT("Conjunction Nodes are not supported currently.")));
+ ACE_THROW (RtecScheduler::INTERNAL ());
+ }
+
+
+ // Set the base RT_Info to have the attributes of the latest values.
+ rt_info->criticality = criticality;
+ rt_info->worst_case_execution_time = time;
+ rt_info->typical_execution_time = typical_time;
+ rt_info->cached_execution_time = cached_time;
+ rt_info->period = period;
+ rt_info->importance = importance;
+ rt_info->quantum = quantum;
+ rt_info->threads = threads;
+ rt_info->info_type = info_type;
+
+ // If a rate is advertised, create a separate tuple for that rate.
+ if (period > 0)
+ {
+ TAO_Reconfig_Scheduler_Entry * rse_ptr =
+ ACE_LONGLONG_TO_PTR (TAO_Reconfig_Scheduler_Entry *,
+ rt_info->volatile_token);
+// ACE_DEBUG((LM_DEBUG, "Updating or inserting tuple for RT_Info: %d, entry_ptr: %x\n", rt_info->handle, rse_ptr));
+ if (rse_ptr == 0)
+ {
+ ACE_THROW (RtecScheduler::INTERNAL ());
+ }
+
+ int result = rse_ptr->update_tuple (*rt_info);
+ if (result < 0)
+ {
+ ACE_THROW (RtecScheduler::INTERNAL ());
+ }
+ else if (result == 0) // We did not find an existing tuple.
+ {
+ // Create a new RT_Info tuple from the passed RT_Info.
+ TAO_RT_Info_Tuple *tuple_ptr = 0;
+ ACE_NEW_THROW_EX (tuple_ptr,
+ TAO_RT_Info_Tuple (*rt_info),
+ CORBA::NO_MEMORY ());
+ ACE_CHECK;
+
+
+ // Make sure the new tuple is cleaned up if we exit abruptly.
+ auto_ptr<TAO_RT_Info_Tuple> tuple_auto_ptr (tuple_ptr);
+
+// ACE_DEBUG((LM_DEBUG, "Tuple not found. Inserting new tuple for RT_Info: %d, entry_ptr: 0x%x, tuple_ptr: 0x%x\n",
+// rt_info->handle,
+// rse_ptr,
+// tuple_ptr));
+ // Add the tuple to the entry's original tuple set
+ result = rse_ptr->insert_tuple (*tuple_ptr);
+ if (result < 0)
+ {
+ ACE_THROW (RtecScheduler::INTERNAL ());
+ }
+
+ // Maintain the size of the entry pointer array.
+ maintain_scheduling_array (tuple_ptr_array_,
+ tuple_ptr_array_size_,
+ rt_info_tuple_count_
+ ACE_ENV_ARG_PARAMETER);
+ ACE_CHECK;
+
+ // Store the new tuple in the tuple pointer array.
+ tuple_ptr_array_ [this->rt_info_tuple_count_] = tuple_ptr;
+
+ ++this->rt_info_tuple_count_;
+
+ // All is well: release the auto pointer's hold on the tuple.
+ tuple_auto_ptr.release ();
+ }
+ }
+}
+
+
+
+// Internal method to lookup a handle for an RT_Info, and return its
+// handle, or an error value if it's not present.
+
+template <class RECONFIG_SCHED_STRATEGY, class ACE_LOCK>
+RtecScheduler::handle_t
+TAO_Reconfig_Scheduler<RECONFIG_SCHED_STRATEGY, ACE_LOCK>::
+lookup_i (const char * entry_point
+ ACE_ENV_ARG_DECL)
+ ACE_THROW_SPEC ((CORBA::SystemException,
+ RtecScheduler::UNKNOWN_TASK))
+{
+#if defined (SCHEDULER_LOGGING)
+ ACE_DEBUG ((LM_TRACE,
+ " TAO_Reconfig_Scheduler::lookup_i.\n"));
+#endif /* SCHEDULER_LOGGING */
+
+ TAO_RT_Info_Ex *rt_info = 0;
+ if (rt_info_tree_.find (entry_point, rt_info) != 0)
+ {
+ ACE_THROW_RETURN (RtecScheduler::UNKNOWN_TASK (), 0);
+ }
+
+ return rt_info->handle;
+}
+
+// Internal method that returns the priority and subpriority values
+// assigned to an RT_Info, based on its handle.
+
+template <class RECONFIG_SCHED_STRATEGY, class ACE_LOCK>
+void
+TAO_Reconfig_Scheduler<RECONFIG_SCHED_STRATEGY, ACE_LOCK>::
+priority_i (RtecScheduler::handle_t handle,
+ RtecScheduler::OS_Priority& o_priority,
+ RtecScheduler::Preemption_Subpriority_t& subpriority,
+ RtecScheduler::Preemption_Priority_t& p_priority
+ ACE_ENV_ARG_DECL)
+ ACE_THROW_SPEC ((CORBA::SystemException,
+ RtecScheduler::UNKNOWN_TASK,
+ RtecScheduler::NOT_SCHEDULED))
+{
+ // Check stability flags.
+ if ((this->stability_flags_ & SCHED_PRIORITY_NOT_STABLE)
+ && this->enforce_schedule_stability_)
+ {
+ ACE_THROW (RtecScheduler::NOT_SCHEDULED ());
+ }
+
+ TAO_RT_Info_Ex *rt_info = 0;
+ if (rt_info_map_.find (handle, rt_info) != 0)
+ {
+ ACE_THROW (RtecScheduler::UNKNOWN_TASK ());
+ }
+
+ o_priority = rt_info->priority;
+ subpriority = rt_info->preemption_subpriority;
+ p_priority = rt_info->preemption_priority;
+}
+
+
+// This internal method registers a dependency between two RT_Infos.
+
+template <class RECONFIG_SCHED_STRATEGY, class ACE_LOCK> void
+TAO_Reconfig_Scheduler<RECONFIG_SCHED_STRATEGY, ACE_LOCK>::
+add_dependency_i (RtecScheduler::handle_t handle /* RT_Info that has the dependency */,
+ RtecScheduler::handle_t dependency /* RT_Info on which it depends */,
+ CORBA::Long number_of_calls,
+ RtecScheduler::Dependency_Type_t dependency_type,
+ RtecScheduler::Dependency_Enabled_Type_t enabled
+ ACE_ENV_ARG_DECL)
+ ACE_THROW_SPEC ((CORBA::SystemException,
+ RtecScheduler::INTERNAL,
+ RtecScheduler::UNKNOWN_TASK))
+{
+#if defined (SCHEDULER_LOGGING)
+ ACE_DEBUG ((LM_TRACE,
+ " TAO_Reconfig_Scheduler::add_dependency_i.\n"));
+#endif /* SCHEDULER_LOGGING */
+
+ // All dependencies are mapped by both the calling and called
+ // operation handles, so that a topological sort can be performed
+ // once over both one-way and two-way dependencies. The dependency
+ // specification is in absolute terms, however, so that the calling
+ // and called handles are reversed for one-way and two way
+ // dependencies.
+
+ switch (dependency_type)
+ {
+ // In a two-way call, the calling operation depends on the
+ // called operation.
+ case RtecBase::TWO_WAY_CALL:
+
+ // Add the calling dependency map entry
+ map_dependency_i (handle, // calling handle
+ dependency, // called handle
+ calling_dependency_set_map_, // calling map
+ number_of_calls,
+ dependency_type,
+ enabled
+ ACE_ENV_ARG_PARAMETER);
+ ACE_CHECK;
+
+ // Add the called dependency map entry
+ map_dependency_i (dependency, // called handle
+ handle, // calling handle
+ called_dependency_set_map_, // called map
+ number_of_calls,
+ dependency_type,
+ enabled
+ ACE_ENV_ARG_PARAMETER);
+ ACE_CHECK;
+
+ break;
+
+ // In a one-way call, the called operation depends on the
+ // calling operation.
+ case RtecBase::ONE_WAY_CALL:
+
+ // Add the calling dependency map entry
+ map_dependency_i (dependency, // calling handle
+ handle, // called handle
+ calling_dependency_set_map_, // calling map
+ number_of_calls,
+ dependency_type,
+ enabled
+ ACE_ENV_ARG_PARAMETER);
+ ACE_CHECK;
+
+ // Add the called dependency map entry
+ map_dependency_i (handle, // called handle
+ dependency, // calling handle
+ called_dependency_set_map_, // called map
+ number_of_calls,
+ dependency_type,
+ enabled
+ ACE_ENV_ARG_PARAMETER);
+ ACE_CHECK;
+ break;
+
+ default:
+
+ // There should not be any other kinds of dependencies.
+ ACE_THROW (RtecScheduler::INTERNAL ());
+ }
+
+ // Add the criticality dependency map entry.
+ // If A---TW--->B and C---OW--->D, the add_dependency_calls
+ // would look like this
+ // add_dependency (A, B, TW)
+ // add_dependency (D, C, OW)
+ // Neither of the other two maps capture these dependencies
+ // A depends on B and D depends on C.
+ // The calling dependency map captures
+ // A calls B and C calls D.
+ // The called dependency map captures
+ // B called by A and D called by C.
+
+ map_dependency_i (handle, // calling handle
+ dependency, // called handle
+ crit_dependency_set_map_,// crit dependency map
+ number_of_calls,
+ dependency_type,
+ enabled
+ ACE_ENV_ARG_PARAMETER);
+ ACE_CHECK;
+
+}
+
+
+// This internal method removes a dependency between two RT_Infos.
+
+template <class RECONFIG_SCHED_STRATEGY, class ACE_LOCK> void
+TAO_Reconfig_Scheduler<RECONFIG_SCHED_STRATEGY, ACE_LOCK>::
+remove_dependency_i (RtecScheduler::handle_t handle /* RT_Info that has the dependency */,
+ RtecScheduler::handle_t dependency /* RT_Info on which it depends */,
+ CORBA::Long number_of_calls,
+ RtecScheduler::Dependency_Type_t dependency_type
+ ACE_ENV_ARG_DECL)
+ ACE_THROW_SPEC ((CORBA::SystemException,
+ RtecScheduler::SYNCHRONIZATION_FAILURE,
+ RtecScheduler::INTERNAL,
+ RtecScheduler::UNKNOWN_TASK))
+{
+#if defined (SCHEDULER_LOGGING)
+ ACE_DEBUG ((LM_TRACE,
+ " TAO_Reconfig_Scheduler::remove_dependency_i.\n"));
+#endif /* SCHEDULER_LOGGING */
+
+ // All dependencies are mapped by both the calling and called
+ // operation handles, so that a topological sort can be performed
+ // once over both one-way and two-way dependencies. The dependency
+ // specification is in absolute terms, however, so that the calling
+ // and called handles are reversed for one-way and two way
+ // dependencies.
+
+ switch (dependency_type)
+ {
+ // In a two-way call, the calling operation depends on the
+ // called operation.
+ case RtecBase::TWO_WAY_CALL:
+
+ // Remove the calling dependency map entry
+ unmap_dependency_i (handle, // calling handle
+ dependency, // called handle
+ calling_dependency_set_map_, // calling map
+ number_of_calls,
+ dependency_type
+ ACE_ENV_ARG_PARAMETER);
+ ACE_CHECK;
+
+ // Remove the called dependency map entry
+ unmap_dependency_i (dependency, // called handle
+ handle, // calling handle
+ called_dependency_set_map_, // called map
+ number_of_calls,
+ dependency_type
+ ACE_ENV_ARG_PARAMETER);
+ ACE_CHECK;
+ break;
+
+ // In a one-way call, the called operation depends on the
+ // calling operation.
+ case RtecBase::ONE_WAY_CALL:
+
+ // Remove the calling dependency map entry
+ unmap_dependency_i (dependency, // calling handle
+ handle, // called handle
+ calling_dependency_set_map_, // calling map
+ number_of_calls,
+ dependency_type
+ ACE_ENV_ARG_PARAMETER);
+ ACE_CHECK;
+
+ // Remove the called dependency map entry
+ unmap_dependency_i (handle, // called handle
+ dependency, // calling handle
+ called_dependency_set_map_, // called map
+ number_of_calls,
+ dependency_type
+ ACE_ENV_ARG_PARAMETER);
+ ACE_CHECK;
+ break;
+
+ default:
+
+ // There should not be any other kinds of dependencies.
+ ACE_THROW (RtecScheduler::INTERNAL ());
+ }
+}
+
+
+// This method sets the enable state for a dependency between two RT_Infos.
+
+template <class RECONFIG_SCHED_STRATEGY, class ACE_LOCK>
+void
+TAO_Reconfig_Scheduler<RECONFIG_SCHED_STRATEGY, ACE_LOCK>::
+set_dependency_enable_state_i (RtecScheduler::handle_t handle,
+ RtecScheduler::handle_t dependency,
+ CORBA::Long number_of_calls,
+ RtecScheduler::Dependency_Type_t dependency_type,
+ RtecScheduler::Dependency_Enabled_Type_t enabled
+ ACE_ENV_ARG_DECL)
+ ACE_THROW_SPEC ((CORBA::SystemException,
+ RtecScheduler::SYNCHRONIZATION_FAILURE,
+ RtecScheduler::INTERNAL,
+ RtecScheduler::UNKNOWN_TASK))
+{
+#if defined (SCHEDULER_LOGGING)
+ ACE_DEBUG ((LM_TRACE,
+ " TAO_Reconfig_Scheduler::set_dependency_enable_state_i.\n"));
+#endif /* SCHEDULER_LOGGING */
+
+ // All dependencies are mapped by both the calling and called
+ // operation handles, so that a topological sort can be performed
+ // once over both one-way and two-way dependencies. The dependency
+ // specification is in absolute terms, however, so that the calling
+ // and called handles are reversed for one-way and two way
+ // dependencies.
+
+ switch (dependency_type)
+ {
+ // In a two-way call, the calling operation depends on the
+ // called operation.
+ case RtecBase::TWO_WAY_CALL:
+
+ // Update the calling dependency map entry
+ map_dependency_enable_state_i (handle, // calling handle
+ dependency, // called handle
+ calling_dependency_set_map_, // calling map
+ number_of_calls,
+ dependency_type,
+ enabled
+ ACE_ENV_ARG_PARAMETER);
+ ACE_CHECK;
+
+ // Update the called dependency map entry
+ map_dependency_enable_state_i (dependency, // called handle
+ handle, // calling handle
+ called_dependency_set_map_, // called map
+ number_of_calls,
+ dependency_type,
+ enabled
+ ACE_ENV_ARG_PARAMETER);
+ ACE_CHECK;
+ break;
+
+ // In a one-way call, the called operation depends on the
+ // calling operation.
+ case RtecBase::ONE_WAY_CALL:
+
+ // Update the calling dependency map entry
+ map_dependency_enable_state_i (dependency, // calling handle
+ handle, // called handle
+ calling_dependency_set_map_, // calling map
+ number_of_calls,
+ dependency_type,
+ enabled
+ ACE_ENV_ARG_PARAMETER);
+ ACE_CHECK;
+
+ // Update the called dependency map entry
+ map_dependency_enable_state_i (handle, // called handle
+ dependency, // calling handle
+ called_dependency_set_map_, // called map
+ number_of_calls,
+ dependency_type,
+ enabled
+ ACE_ENV_ARG_PARAMETER);
+ ACE_CHECK;
+ break;
+
+ default:
+
+ // There should not be any other kinds of dependencies.
+ ACE_THROW (RtecScheduler::INTERNAL ());
+ }
+}
+
+// This method installs a dependency in a dependency set map.
+
+template <class RECONFIG_SCHED_STRATEGY, class ACE_LOCK> void
+TAO_Reconfig_Scheduler<RECONFIG_SCHED_STRATEGY, ACE_LOCK>::
+map_dependency_i (RtecScheduler::handle_t key,
+ RtecScheduler::handle_t handle,
+ ACE_TYPENAME TAO_Reconfig_Scheduler<RECONFIG_SCHED_STRATEGY, ACE_LOCK>::DEPENDENCY_SET_MAP &dependency_map,
+ CORBA::Long number_of_calls,
+ RtecScheduler::Dependency_Type_t dependency_type,
+ RtecScheduler::Dependency_Enabled_Type_t enabled
+ ACE_ENV_ARG_DECL)
+ ACE_THROW_SPEC ((CORBA::SystemException,
+ RtecScheduler::INTERNAL,
+ RtecScheduler::UNKNOWN_TASK))
+{
+#if defined (SCHEDULER_LOGGING)
+ ACE_DEBUG ((LM_TRACE,
+ " TAO_Reconfig_Scheduler::map_dependency_i.\n"));
+#endif /* SCHEDULER_LOGGING */
+
+ RtecScheduler::Dependency_Set *dependency_set;
+
+ // Look up the dependency set in the passed map
+ if (dependency_map.find (key, dependency_set) != 0)
+ {
+ // Create a new one
+ ACE_NEW_THROW_EX (dependency_set,
+ RtecScheduler::Dependency_Set,
+ CORBA::NO_MEMORY ());
+ ACE_CHECK;
+
+ if (dependency_map.bind (key, dependency_set) != 0)
+ {
+ delete dependency_set;
+ ACE_THROW (RtecScheduler::INTERNAL ());
+ }
+ }
+
+ // Insert unconditionally: there can be multiple copies
+ // of the same dependency, if the user so chooses.
+ int prev_length = dependency_set->length ();
+ dependency_set->length (prev_length + 1);
+ (*dependency_set) [prev_length].rt_info = handle;
+ (*dependency_set) [prev_length].rt_info_depended_on = key; // may actually be the other way around
+ (*dependency_set) [prev_length].number_of_calls = number_of_calls;
+ (*dependency_set) [prev_length].dependency_type = dependency_type;
+ (*dependency_set) [prev_length].enabled = enabled;
+}
+
+
+// This method removes a dependency from a dependency set map.
+
+template <class RECONFIG_SCHED_STRATEGY, class ACE_LOCK> void
+TAO_Reconfig_Scheduler<RECONFIG_SCHED_STRATEGY, ACE_LOCK>::
+unmap_dependency_i (RtecScheduler::handle_t key,
+ RtecScheduler::handle_t handle,
+ ACE_TYPENAME TAO_Reconfig_Scheduler<RECONFIG_SCHED_STRATEGY, ACE_LOCK>::DEPENDENCY_SET_MAP &dependency_map,
+ CORBA::Long number_of_calls,
+ RtecScheduler::Dependency_Type_t dependency_type
+ ACE_ENV_ARG_DECL)
+ ACE_THROW_SPEC ((CORBA::SystemException,
+ RtecScheduler::INTERNAL,
+ RtecScheduler::UNKNOWN_TASK))
+{
+#if defined (SCHEDULER_LOGGING)
+ ACE_DEBUG ((LM_TRACE,
+ " TAO_Reconfig_Scheduler::unmap_dependency_i.\n"));
+#endif /* SCHEDULER_LOGGING */
+
+ RtecScheduler::Dependency_Set *dependency_set = 0;
+
+ // Try to unbind the matching dependency set from the passed map
+ // and if successful, destroy the
+ if (dependency_map.find (key, dependency_set) == 0)
+ {
+ if (dependency_set)
+ {
+ int prev_length = dependency_set->length ();
+ int found = 0;
+ for (int i = 0; i < prev_length; ++i)
+ {
+ if ((*dependency_set) [i].rt_info == handle
+ && (*dependency_set) [i].number_of_calls == number_of_calls
+ && (*dependency_set) [i].dependency_type == dependency_type)
+ {
+ // we found the dependency to delete: set our
+ // found flag to true and compact the array
+ found = 1;
+ for (int j = i+1; j < prev_length; ++j)
+ {
+ (*dependency_set) [j - 1].rt_info = (*dependency_set) [j].rt_info;
+ (*dependency_set) [j - 1].number_of_calls = (*dependency_set) [j].number_of_calls;
+ (*dependency_set) [j - 1].dependency_type = (*dependency_set) [j].dependency_type;
+ (*dependency_set) [j - 1].enabled = (*dependency_set) [j].enabled;
+ }
+ dependency_set->length (prev_length - 1);
+ break;
+ }
+ }
+
+ if (!found)
+ {
+ ACE_THROW (RtecScheduler::UNKNOWN_TASK ());
+ }
+ }
+ else
+ {
+ ACE_THROW (RtecScheduler::INTERNAL ());
+ }
+ }
+ else
+ {
+ ACE_THROW (RtecScheduler::UNKNOWN_TASK ());
+ }
+}
+
+// Internal method that enables or disables a dependency between two RT_Infos.
+// Assumes it is being called with all locks held, and does *not*
+// set any schedule stability flags.
+
+template <class RECONFIG_SCHED_STRATEGY, class ACE_LOCK> void
+TAO_Reconfig_Scheduler<RECONFIG_SCHED_STRATEGY, ACE_LOCK>::
+map_dependency_enable_state_i (RtecScheduler::handle_t key,
+ RtecScheduler::handle_t handle,
+ ACE_TYPENAME
+ TAO_Reconfig_Scheduler<RECONFIG_SCHED_STRATEGY, ACE_LOCK>::DEPENDENCY_SET_MAP &dependency_map,
+ CORBA::Long number_of_calls,
+ RtecScheduler::Dependency_Type_t dependency_type,
+ RtecScheduler::Dependency_Enabled_Type_t enabled
+ ACE_ENV_ARG_DECL)
+ ACE_THROW_SPEC ((CORBA::SystemException,
+ RtecScheduler::INTERNAL,
+ RtecScheduler::UNKNOWN_TASK))
+{
+#if defined (SCHEDULER_LOGGING)
+ ACE_DEBUG ((LM_TRACE,
+ " TAO_Reconfig_Scheduler::map_dependency_enable_state_i.\n"));
+#endif /* SCHEDULER_LOGGING */
+
+ RtecScheduler::Dependency_Set *dependency_set = 0;
+
+ // Try to unbind the matching dependency set from the passed map
+ // and if successful, destroy the
+ if (dependency_map.find (key, dependency_set) == 0)
+ {
+ if (dependency_set)
+ {
+ int set_length = dependency_set->length ();
+ int found = 0;
+ for (int i = 0; i < set_length; ++i)
+ {
+ if ((*dependency_set) [i].rt_info == handle
+ && (*dependency_set) [i].number_of_calls == number_of_calls
+ && (*dependency_set) [i].dependency_type == dependency_type)
+ {
+ // we found the dependency to update
+ found = 1;
+ (*dependency_set) [i].enabled = enabled;
+ break;
+ }
+ }
+
+ if (!found)
+ {
+ ACE_THROW (RtecScheduler::UNKNOWN_TASK ());
+ }
+ }
+ else
+ {
+ ACE_THROW (RtecScheduler::INTERNAL ());
+ }
+ }
+ else
+ {
+ ACE_THROW (RtecScheduler::UNKNOWN_TASK ());
+ }
+}
+
+
+// Traverses dependency graph, assigning a topological ordering.
+// Resets scheduling entries, do DFS traversal, constructs DFS map.
+// Fills in: dfs_status_, discovered_, finished_, is_thread_delineator_,
+// has_unresolved_remote_dependencies_, has_unresolved_local_dependencies_,
+template <class RECONFIG_SCHED_STRATEGY, class ACE_LOCK> void
+TAO_Reconfig_Scheduler<RECONFIG_SCHED_STRATEGY, ACE_LOCK>::
+dfs_traverse_i (ACE_ENV_SINGLE_ARG_DECL)
+ ACE_THROW_SPEC ((CORBA::SystemException,
+ RtecScheduler::INTERNAL))
+{
+#if defined (SCHEDULER_LOGGING)
+ ACE_DEBUG ((LM_TRACE,
+ " TAO_Reconfig_Scheduler::dfs_traverse_i.\n"));
+#endif /* SCHEDULER_LOGGING */
+
+ int i; // index into array of scheduling entry pointers
+
+ // Reset registered RT_Infos.
+ TAO_RSE_Reset_Visitor reset_visitor;
+ for (i = 0; i < this->rt_info_count_; ++i)
+ {
+ if (reset_visitor.visit (* (entry_ptr_array_ [i])) < 0)
+ {
+ ACE_THROW (RtecScheduler::INTERNAL ());
+ }
+ }
+
+ // Traverse registered RT_Infos, assigning DFS start, finish order.
+ TAO_RSE_DFS_Visitor<RECONFIG_SCHED_STRATEGY, ACE_LOCK>
+ dfs_visitor (this->calling_dependency_set_map_,
+ this->rt_info_map_);
+ for (i = 0; i < this->rt_info_count_; ++i)
+ {
+ if (dfs_visitor.visit (* (entry_ptr_array_ [i])) < 0)
+ {
+ ACE_THROW (RtecScheduler::INTERNAL ());
+ }
+ }
+}
+
+
+
+// Sorts an array of RT_info handles in topological order, then
+// checks for loops, marks unresolved remote dependencies.
+template <class RECONFIG_SCHED_STRATEGY, class ACE_LOCK> void
+TAO_Reconfig_Scheduler<RECONFIG_SCHED_STRATEGY, ACE_LOCK>::
+detect_cycles_i (ACE_ENV_SINGLE_ARG_DECL)
+ ACE_THROW_SPEC ((CORBA::SystemException,
+ RtecScheduler::INTERNAL,
+ RtecScheduler::CYCLIC_DEPENDENCIES))
+{
+#if defined (SCHEDULER_LOGGING)
+ ACE_DEBUG ((LM_TRACE,
+ " TAO_Reconfig_Scheduler::detect_cycles_i.\n"));
+#endif /* SCHEDULER_LOGGING */
+
+ // Sort the pointers to entries in order of descending forward
+ // finish times, which produces a reverse topological ordering,
+ // with callers ahead of called nodes.
+ ACE_OS::qsort (reinterpret_cast<void *> (entry_ptr_array_),
+ this->rt_info_count_,
+ sizeof (TAO_Reconfig_Scheduler_Entry *),
+ reinterpret_cast<COMP_FUNC> (RECONFIG_SCHED_STRATEGY::comp_entry_finish_times));
+
+ // Traverse entries in reverse topological order,
+ // looking for strongly connected components (cycles).
+ TAO_RSE_SCC_Visitor<RECONFIG_SCHED_STRATEGY, ACE_LOCK>
+ scc_visitor (this->called_dependency_set_map_,
+ this->rt_info_map_);
+ for (int i = 0; i < this->rt_info_count_; ++i)
+ {
+ // Each new top level entry marks a potential new cycle.
+ scc_visitor.in_a_cycle (0);
+
+ if (scc_visitor.visit (* (entry_ptr_array_ [i])) < 0)
+ {
+ ACE_THROW (RtecScheduler::INTERNAL ());
+ }
+ }
+
+ // Check whether any cycles were detected.
+ if (scc_visitor.number_of_cycles () > 0)
+ {
+ ACE_THROW (RtecScheduler::CYCLIC_DEPENDENCIES ());
+ }
+}
+
+
+// Propagates aggregate execution times, then performs admission over
+// rate tuples.
+
+template <class RECONFIG_SCHED_STRATEGY, class ACE_LOCK> void
+TAO_Reconfig_Scheduler<RECONFIG_SCHED_STRATEGY, ACE_LOCK>::
+perform_admission_i (ACE_ENV_SINGLE_ARG_DECL)
+ ACE_THROW_SPEC ((RtecScheduler::UTILIZATION_BOUND_EXCEEDED,
+ CORBA::SystemException,
+ RtecScheduler::INTERNAL))
+{
+#if defined (SCHEDULER_LOGGING)
+ ACE_DEBUG ((LM_TRACE,
+ " TAO_Reconfig_Scheduler::perform_admission_i.\n"));
+#endif /* SCHEDULER_LOGGING */
+
+ // Traverse entries in topological (ascending forward DFS
+ // finish time) order, propagating aggregate execution
+ // time from called nodes to calling node at each step.
+
+ TAO_RSE_Reverse_Propagation_Visitor<RECONFIG_SCHED_STRATEGY, ACE_LOCK>
+ prop_visitor (this->calling_dependency_set_map_,
+ this->rt_info_map_);
+ int i;
+ for (i = this->rt_info_count_ - 1; i >= 0; --i)
+ {
+ if (prop_visitor.visit (* (entry_ptr_array_ [i])) < 0)
+ {
+ ACE_THROW (RtecScheduler::INTERNAL ());
+ }
+ }
+
+ // Sort the pointers to original tuples in ascending admission
+ // order, according to the scheduling strategy's admission policy.
+ ACE_OS::qsort (reinterpret_cast<void *> (tuple_ptr_array_),
+ this->rt_info_tuple_count_,
+ sizeof (TAO_RT_Info_Tuple *),
+ reinterpret_cast<COMP_FUNC> (RECONFIG_SCHED_STRATEGY::total_admission_comp));
+
+ // Traverse tuples in admission order, updating the associate tuple
+ // for each thread delineator.
+#if defined (SCHEDULER_LOGGING)
+ ACE_Scheduler_Factory::log_scheduling_tuples(tuple_ptr_array_,
+ this->rt_info_tuple_count_,
+ "sorted_admit_tuples.txt");
+#endif
+
+ TAO_Tuple_Admission_Visitor<RECONFIG_SCHED_STRATEGY>
+ admit_visitor (critical_utilization_threshold_,
+ noncritical_utilization_threshold_);
+
+ for (i = 0; i < this->rt_info_tuple_count_; ++i)
+ {
+ if (admit_visitor.visit (* (tuple_ptr_array_ [i])) < 0)
+ {
+ ACE_THROW (RtecScheduler::INTERNAL ());
+ }
+ }
+
+
+ // Store the values accumulated by the visitor.
+ this->noncritical_utilization_ =
+ admit_visitor.total_noncritical_utilization ();
+ this->critical_utilization_ =
+ admit_visitor.total_critical_utilization ();
+}
+
+template <class RECONFIG_SCHED_STRATEGY, class ACE_LOCK> void
+TAO_Reconfig_Scheduler<RECONFIG_SCHED_STRATEGY, ACE_LOCK>::
+crit_dfs_traverse_i (ACE_ENV_SINGLE_ARG_DECL)
+ ACE_THROW_SPEC ((CORBA::SystemException,
+ RtecScheduler::INTERNAL))
+{
+#if defined (SCHEDULER_LOGGING)
+ ACE_DEBUG ((LM_TRACE,
+ " TAO_Reconfig_Scheduler::crit_dfs_traverse_i.\n"));
+#endif /* SCHEDULER_LOGGING */
+
+ int i; // index into array of scheduling entry pointers
+
+ // Reset registered RT_Infos.
+ TAO_RSE_Reset_Visitor reset_visitor;
+ for (i = 0; i < this->rt_info_count_; ++i)
+ {
+ if (reset_visitor.visit (* (entry_ptr_array_ [i])) < 0)
+ {
+ ACE_THROW (RtecScheduler::INTERNAL ());
+ }
+ }
+
+ // Traverse registered RT_Infos, assigning DFS start, finish order.
+ TAO_RSE_DFS_Visitor<RECONFIG_SCHED_STRATEGY, ACE_LOCK>
+ dfs_visitor (this->crit_dependency_set_map_,
+ this->rt_info_map_);
+ for (i = 0; i < this->rt_info_count_; ++i)
+ {
+ if (dfs_visitor.visit (* (entry_ptr_array_ [i])) < 0)
+ {
+ ACE_THROW (RtecScheduler::INTERNAL ());
+ }
+ }
+}
+
+template <class RECONFIG_SCHED_STRATEGY, class ACE_LOCK> void
+TAO_Reconfig_Scheduler<RECONFIG_SCHED_STRATEGY, ACE_LOCK>::
+propagate_criticalities_i (ACE_ENV_SINGLE_ARG_DECL)
+ ACE_THROW_SPEC ((CORBA::SystemException,
+ RtecScheduler::INTERNAL))
+{
+#if defined (SCHEDULER_LOGGING)
+ ACE_DEBUG ((LM_TRACE,
+ " TAO_Reconfig_Scheduler::propagate_criticalities_i.\n"));
+#endif /* SCHEDULER_LOGGING */
+
+ // Sort the pointers to original tuples in ascending admission
+ // order, according to the scheduling strategy's admission policy.
+
+ ACE_OS::qsort (reinterpret_cast<void *> (tuple_ptr_array_),
+ this->rt_info_tuple_count_,
+ sizeof (TAO_RT_Info_Tuple *),
+ reinterpret_cast<COMP_FUNC> (RECONFIG_SCHED_STRATEGY::comp_tuple_finish_times ));
+
+ // Traverse entries in topological (ascending forward DFS
+ // finish time) order, propagating aggregate execution
+ // time from called nodes to calling node at each step.
+
+ TAO_RSE_Criticality_Propagation_Visitor<RECONFIG_SCHED_STRATEGY, ACE_LOCK>
+ crit_prop_visitor (this->crit_dependency_set_map_,
+ this->rt_info_map_);
+ int i;
+ for (i = 0; i<this->rt_info_count_; ++i)
+ {
+ if (crit_prop_visitor.visit (* (entry_ptr_array_ [i])) < 0)
+ {
+ ACE_THROW (RtecScheduler::INTERNAL ());
+ }
+ }
+ for (i = this->rt_info_count_-1; i>=0; --i)
+ {
+ if (crit_prop_visitor.visit (* (entry_ptr_array_ [i])) < 0)
+ {
+ ACE_THROW (RtecScheduler::INTERNAL ());
+ }
+ }
+}
+
+// Propagates periods, sets total frame size.
+template <class RECONFIG_SCHED_STRATEGY, class ACE_LOCK> void
+TAO_Reconfig_Scheduler<RECONFIG_SCHED_STRATEGY, ACE_LOCK>::
+propagate_characteristics_i (ACE_ENV_SINGLE_ARG_DECL)
+ ACE_THROW_SPEC ((CORBA::SystemException,
+ RtecScheduler::INTERNAL,
+ RtecScheduler::UNRESOLVED_LOCAL_DEPENDENCIES,
+ RtecScheduler::THREAD_SPECIFICATION))
+{
+#if defined (SCHEDULER_LOGGING)
+ ACE_DEBUG ((LM_TRACE,
+ " TAO_Reconfig_Scheduler::propagate_characteristics_i.\n"));
+#endif /* SCHEDULER_LOGGING */
+
+ // Traverse entries in reverse topological (descending forward DFS
+ // finish time) order, propagating period and effective execution
+ // time from calling node to called node at each step.
+ TAO_RSE_Forward_Propagation_Visitor<RECONFIG_SCHED_STRATEGY, ACE_LOCK>
+ prop_visitor (this->calling_dependency_set_map_,
+ this->rt_info_map_);
+ for (int i = 0; i < this->rt_info_count_; ++i)
+ {
+ if (prop_visitor.visit (* (entry_ptr_array_ [i])) < 0)
+ {
+ ACE_THROW (RtecScheduler::INTERNAL ());
+ }
+ }
+
+ // Check whether any unresolved local dependencies were detected.
+ if (prop_visitor.unresolved_locals () > 0)
+ {
+ ACE_THROW (RtecScheduler::UNRESOLVED_LOCAL_DEPENDENCIES ());
+ }
+
+ // Check whether any thread specification errors were detected.
+ if (prop_visitor.thread_specification_errors () > 0)
+ {
+ ACE_THROW (RtecScheduler::THREAD_SPECIFICATION ());
+ }
+}
+
+// Sort operations by urgency (done by strategy), then
+// assign priorities and subpriorities in one pass.
+// Sets last scheduled priority.
+template <class RECONFIG_SCHED_STRATEGY, class ACE_LOCK> void
+TAO_Reconfig_Scheduler<RECONFIG_SCHED_STRATEGY, ACE_LOCK>::
+assign_priorities_i (ACE_ENV_SINGLE_ARG_DECL)
+ ACE_THROW_SPEC ((CORBA::SystemException,
+ RtecScheduler::INTERNAL,
+ RtecScheduler::DUPLICATE_NAME))
+{
+ int i;
+#if defined (SCHEDULER_LOGGING)
+ ACE_DEBUG ((LM_TRACE,
+ " TAO_Reconfig_Scheduler::assign_priorities_i.\n"));
+
+ ACE_DEBUG ((LM_DEBUG, "Scheduler::entry ptr array before sorting is\n"));
+ for (i = 0; i < this->rt_info_count_; ++i)
+ {
+ RtecScheduler::RT_Info* rt_info_ptr =
+ this->entry_ptr_array_[i]->actual_rt_info ();
+ ACE_DEBUG ((LM_DEBUG,
+ " %s [%d] crit=%d,prio=%d,preemption_prio=%d,subprio=%d\n ",
+ rt_info_ptr->entry_point.in (),
+ rt_info_ptr->handle,
+ rt_info_ptr->criticality,
+ rt_info_ptr->priority,
+ rt_info_ptr->preemption_priority,
+ rt_info_ptr->preemption_subpriority));
+ }
+#endif /* SCHEDULER_LOGGING */
+
+ // Sort the pointers to entries in descending order
+ // of static priority and static subpriority, according
+ // to our given scheduling strategy.
+ ACE_OS::qsort (reinterpret_cast<void *> (entry_ptr_array_),
+ this->rt_info_count_,
+ sizeof (TAO_Reconfig_Scheduler_Entry *),
+ reinterpret_cast<COMP_FUNC> (RECONFIG_SCHED_STRATEGY::total_priority_comp));
+
+#ifdef SCHEDULER_LOGGING
+ ACE_DEBUG ((LM_DEBUG, "Scheduler::qsorted array is\n"));
+ for (i = 0; i < this->rt_info_count_; ++i)
+ {
+ RtecScheduler::RT_Info* rt_info_ptr =
+ this->entry_ptr_array_[i]->actual_rt_info ();
+ ACE_DEBUG ((LM_DEBUG,
+ " %s [%d] crit=%d,prio=%d,preemption_prio=%d,subprio=%d\n ",
+ rt_info_ptr->entry_point.in (),
+ rt_info_ptr->handle,
+ rt_info_ptr->criticality,
+ rt_info_ptr->priority,
+ rt_info_ptr->preemption_priority,
+ rt_info_ptr->preemption_subpriority));
+ }
+#endif
+
+ // Empty out the previously stored configuration infos, if any.
+ RtecScheduler::Preemption_Priority_t config_priority;
+ RtecScheduler::Config_Info *config_info_temp = 0;
+ while (config_info_map_.current_size () > 0)
+ {
+ config_priority = (*config_info_map_.begin ()).ext_id_;
+ if (config_info_map_.unbind (config_priority, config_info_temp) == 0)
+ {
+ delete config_info_temp;
+ }
+ else
+ {
+ ACE_THROW (RtecScheduler::INTERNAL ());
+ }
+ }
+ this->config_info_count_ = 0;
+
+ // Traverse using a priority assignment visitor, which uses a
+ // strategy to decide when a new priority or subpriority is reached.
+ TAO_RSE_Priority_Visitor<RECONFIG_SCHED_STRATEGY, ACE_LOCK>
+ prio_visitor (this->rt_info_count_, this->entry_ptr_array_);
+ auto_ptr<RtecScheduler::Config_Info> new_config_info_ptr;
+ for (i = 0; i <= this->rt_info_count_; ++i)
+ {
+ int result;
+
+ if (i < this->rt_info_count_)
+ {
+ // Visit the next entry in the array.
+ result = prio_visitor.visit (* (this->entry_ptr_array_ [i]));
+ }
+ else
+ {
+ // Finish up after all enties in the array have been visited.
+ result = prio_visitor.finish ();
+ }
+
+ if (result < 0)
+ {
+ // Something bad happened with the internal data structures.
+ ACE_THROW (RtecScheduler::INTERNAL ());
+ }
+ else if (result == 1)
+ {
+ RtecScheduler::Config_Info* new_config_info;
+ ACE_NEW_THROW_EX (new_config_info,
+ RtecScheduler::Config_Info,
+ CORBA::NO_MEMORY ());
+ ACE_CHECK;
+
+ // Make sure the new config info is cleaned up if we exit abruptly.
+ ACE_AUTO_PTR_RESET (new_config_info_ptr, new_config_info, RtecScheduler::Config_Info);
+
+ // Have the strategy fill in the new config info for that
+ // priority level, using the representative scheduling entry.
+ if (RECONFIG_SCHED_STRATEGY::assign_config (*new_config_info,
+ *(entry_ptr_array_ [i])) < 0)
+ {
+ ACE_THROW (RtecScheduler::INTERNAL ());
+ }
+
+ if (new_config_info->preemption_priority >
+ this->last_scheduled_priority_)
+ {
+ this->last_scheduled_priority_ =
+ new_config_info->preemption_priority;
+ }
+
+ result = config_info_map_.bind (new_config_info->preemption_priority,
+ new_config_info);
+ switch (result)
+ {
+ case -1:
+ // Something bad but unknown occurred while trying to bind in map.
+ ACE_THROW (RtecScheduler::INTERNAL ());
+
+ case 1:
+ // Tried to bind an operation that was already in the map.
+ ACE_THROW (RtecScheduler::DUPLICATE_NAME ());
+
+ default:
+ ++this->config_info_count_;
+ break;
+ }
+
+ // Release the auto_ptr so it does not clean
+ // up the sucessfully bound config info.
+ new_config_info_ptr.release ();
+ }
+ }
+}
+
+
+// Refreshes the array of tuple pointers, tuple pointer count.
+
+template <class RECONFIG_SCHED_STRATEGY, class ACE_LOCK> void
+TAO_Reconfig_Scheduler<RECONFIG_SCHED_STRATEGY, ACE_LOCK>::
+refresh_tuple_ptr_array_i (ACE_ENV_SINGLE_ARG_DECL)
+ ACE_THROW_SPEC ((CORBA::SystemException,
+ RtecScheduler::INTERNAL))
+{
+#if defined (SCHEDULER_LOGGING)
+ ACE_DEBUG ((LM_TRACE,
+ " TAO_Reconfig_Scheduler::refresh_tuple_ptr_array_i.\n"));
+#endif /* SCHEDULER_LOGGING */
+
+ // Zero out the tuple pointer array, set count to zero
+ ACE_OS::memset (this->tuple_ptr_array_, 0,
+ sizeof (TAO_RT_Info_Tuple *)
+ * this->tuple_ptr_array_size_);
+ this->rt_info_tuple_count_ = 0;
+
+ for (int i = 0; i < this->rt_info_count_; ++i)
+ {
+ if (entry_ptr_array_ [i]->register_tuples (this->tuple_ptr_array_,
+ this->rt_info_tuple_count_) < 0)
+ {
+ ACE_THROW (RtecScheduler::INTERNAL ());
+ }
+ }
+}
+
+// Accesses scheduling strategy for the reconfig scheduler.
+
+template <class RECONFIG_SCHED_STRATEGY, class ACE_LOCK> RECONFIG_SCHED_STRATEGY &
+TAO_Reconfig_Scheduler<RECONFIG_SCHED_STRATEGY, ACE_LOCK>::sched_strategy ()
+{
+ return this->sched_strategy_;
+}
+
+
+// Accesses map for O(1) lookup of Config_Infos by priority level.
+
+template <class RECONFIG_SCHED_STRATEGY, class ACE_LOCK>
+ACE_TYPENAME TAO_Reconfig_Scheduler<RECONFIG_SCHED_STRATEGY, ACE_LOCK>::CONFIG_INFO_MAP &
+TAO_Reconfig_Scheduler<RECONFIG_SCHED_STRATEGY, ACE_LOCK>::config_info_map ()
+{
+ return this->config_info_map_;
+}
+
+
+// Returns the number of config infos, which is also the number of
+// assigned priority levels.
+
+template <class RECONFIG_SCHED_STRATEGY, class ACE_LOCK> long
+TAO_Reconfig_Scheduler<RECONFIG_SCHED_STRATEGY, ACE_LOCK>::config_info_count ()
+{
+ return this->config_info_count_;
+}
+
+
+// Accesses map for O(1) lookup of RT_Infos by handle.
+
+template <class RECONFIG_SCHED_STRATEGY, class ACE_LOCK>
+ACE_TYPENAME TAO_Reconfig_Scheduler<RECONFIG_SCHED_STRATEGY, ACE_LOCK>::RT_INFO_MAP &
+TAO_Reconfig_Scheduler<RECONFIG_SCHED_STRATEGY, ACE_LOCK>::rt_info_map ()
+{
+ return this->rt_info_map_;
+}
+
+
+// Returns the number of registered RT_Infos.
+
+template <class RECONFIG_SCHED_STRATEGY, class ACE_LOCK> long
+TAO_Reconfig_Scheduler<RECONFIG_SCHED_STRATEGY, ACE_LOCK>::rt_info_count ()
+{
+ return this->rt_info_count_;
+}
+
+// Returns the number of registered RT_Info tuples.
+
+template <class RECONFIG_SCHED_STRATEGY, class ACE_LOCK> long
+TAO_Reconfig_Scheduler<RECONFIG_SCHED_STRATEGY, ACE_LOCK>::rt_info_tuple_count ()
+{
+ return this->rt_info_tuple_count_;
+}
+
+
+// Accesses tree for O(log n) lookup of RT_Infos by name.
+
+template <class RECONFIG_SCHED_STRATEGY, class ACE_LOCK>
+ACE_TYPENAME TAO_Reconfig_Scheduler<RECONFIG_SCHED_STRATEGY, ACE_LOCK>::RT_INFO_TREE &
+TAO_Reconfig_Scheduler<RECONFIG_SCHED_STRATEGY, ACE_LOCK>::rt_info_tree ()
+{
+ return this->rt_info_tree_;
+}
+
+
+// Accesses map for O(1) lookup of RT_Info dependency
+// set by the caller operation's handle.
+
+template <class RECONFIG_SCHED_STRATEGY, class ACE_LOCK>
+ACE_TYPENAME TAO_Reconfig_Scheduler<RECONFIG_SCHED_STRATEGY, ACE_LOCK>::DEPENDENCY_SET_MAP &
+TAO_Reconfig_Scheduler<RECONFIG_SCHED_STRATEGY, ACE_LOCK>::calling_dependency_set_map ()
+{
+ return this->calling_dependency_set_map_;
+}
+
+
+// Accesses map for O(1) lookup of RT_Info dependency
+// set by the called operation's handle.
+
+template <class RECONFIG_SCHED_STRATEGY, class ACE_LOCK>
+ACE_TYPENAME TAO_Reconfig_Scheduler<RECONFIG_SCHED_STRATEGY, ACE_LOCK>::DEPENDENCY_SET_MAP &
+TAO_Reconfig_Scheduler<RECONFIG_SCHED_STRATEGY, ACE_LOCK>::called_dependency_set_map ()
+{
+ return this->called_dependency_set_map_;
+}
+
+
+// Returns the number of dependencies in the dependency lists of all RT_Infos.
+// This is used when traversing the dependency graph.
+
+template <class RECONFIG_SCHED_STRATEGY, class ACE_LOCK> int
+TAO_Reconfig_Scheduler<RECONFIG_SCHED_STRATEGY, ACE_LOCK>::dependency_count ()
+{
+ return this->dependency_count_;
+}
+
+// Accessor for utilization by noncritical tasks.
+template <class RECONFIG_SCHED_STRATEGY, class ACE_LOCK>
+CORBA::Double
+TAO_Reconfig_Scheduler<RECONFIG_SCHED_STRATEGY, ACE_LOCK>::
+noncritical_utilization ()
+{
+ return noncritical_utilization_;
+}
+
+// Accessor for utilization by critical tasks.
+template <class RECONFIG_SCHED_STRATEGY, class ACE_LOCK>
+CORBA::Double
+TAO_Reconfig_Scheduler<RECONFIG_SCHED_STRATEGY, ACE_LOCK>::
+critical_utilization ()
+{
+ return critical_utilization_;
+}
+
+// Accessor for noncritical task utilization threshold.
+template <class RECONFIG_SCHED_STRATEGY, class ACE_LOCK>
+CORBA::Double
+TAO_Reconfig_Scheduler<RECONFIG_SCHED_STRATEGY, ACE_LOCK>::
+noncritical_utilization_threshold ()
+{
+ return noncritical_utilization_threshold_;
+}
+
+// Mutator for noncritical task utilization threshold.
+template <class RECONFIG_SCHED_STRATEGY, class ACE_LOCK>
+void
+TAO_Reconfig_Scheduler<RECONFIG_SCHED_STRATEGY, ACE_LOCK>::
+noncritical_utilization_threshold (const CORBA::Double &d)
+{
+ noncritical_utilization_threshold_ = d;
+}
+
+// Accessor for critical task utilization threshold.
+template <class RECONFIG_SCHED_STRATEGY, class ACE_LOCK>
+CORBA::Double
+TAO_Reconfig_Scheduler<RECONFIG_SCHED_STRATEGY, ACE_LOCK>::
+critical_utilization_threshold ()
+{
+ return critical_utilization_threshold_;
+}
+
+// Mutator for critical task utilization threshold.
+template <class RECONFIG_SCHED_STRATEGY, class ACE_LOCK>
+void
+TAO_Reconfig_Scheduler<RECONFIG_SCHED_STRATEGY, ACE_LOCK>::
+critical_utilization_threshold (const CORBA::Double &d)
+{
+ critical_utilization_threshold_ = d;
+}
+
+
+// Helper function: makes sure there is room in the scheduling pointer
+// arrays. This function expands the array eagerly, to minimize
+// memory allocation overhead.
+
+template <class ARRAY_ELEMENT_TYPE> void
+maintain_scheduling_array (ARRAY_ELEMENT_TYPE ** & current_ptr_array,
+ long & current_ptr_array_size,
+ RtecScheduler::handle_t handle
+ ACE_ENV_ARG_DECL)
+ ACE_THROW_SPEC ((CORBA::SystemException))
+{
+ if (current_ptr_array_size <= handle)
+ {
+ long new_size = handle + 1;
+ ARRAY_ELEMENT_TYPE ** new_array;
+
+ if (current_ptr_array_size > 0)
+ {
+ // Store previous array size.
+ for (new_size = 2 * current_ptr_array_size;
+ new_size <= handle;
+ new_size *= 2);
+ }
+
+ // Allocate the new array of the proper size, zero it out.
+
+ ACE_NEW_THROW_EX (new_array,
+ ARRAY_ELEMENT_TYPE * [new_size],
+ CORBA::NO_MEMORY ());
+
+ ACE_OS::memset (new_array, 0,
+ sizeof (ARRAY_ELEMENT_TYPE *) *
+ new_size);
+
+ if (current_ptr_array_size > 0)
+ {
+ // Copy in the previous array.
+ ACE_OS::memcpy (new_array, current_ptr_array,
+ sizeof (ARRAY_ELEMENT_TYPE *) *
+ current_ptr_array_size);
+
+ // Free the old array and swap to point to the new one.
+ delete [] current_ptr_array;
+ }
+
+ current_ptr_array = new_array;
+ current_ptr_array_size = new_size;
+ }
+}
+
+/* WSOA merge - commented out
+// Compute utilization, set last feasible priority.
+template <class RECONFIG_SCHED_STRATEGY, class ACE_LOCK> void
+
+TAO_Reconfig_Scheduler<RECONFIG_SCHED_STRATEGY, ACE_LOCK>::
+compute_utilization_i (ACE_ENV_SINGLE_ARG_DECL)
+ ACE_THROW_SPEC ((CORBA::SystemException,
+ RtecScheduler::INTERNAL))
+{
+ TAO_RSE_Utilization_Visitor<RECONFIG_SCHED_STRATEGY> util_visitor;
+ for (int i = 0; i < this->rt_info_count_; ++i)
+ {
+ if (util_visitor.visit (* (entry_ptr_array_ [i])) < 0)
+ {
+ ACE_THROW (RtecScheduler::INTERNAL ());
+ }
+ }
+
+ // Store the values accumulated by the visitor.
+ this->noncritical_utilization_ =
+ util_visitor.noncritical_utilization ();
+ this->critical_utilization_ =
+ util_visitor.critical_utilization ();
+}
+
+
+// Static helper method to give an RT_Info some reasonable default values.
+
+template <class RECONFIG_SCHED_STRATEGY, class ACE_LOCK> void
+TAO_Reconfig_Scheduler<RECONFIG_SCHED_STRATEGY, ACE_LOCK>::init_rt_info (RtecScheduler::RT_Info &rt_info)
+ ACE_THROW_SPEC ((CORBA::SystemException))
+{
+ // Set some reasonable default values.
+ rt_info.criticality = RtecScheduler::VERY_LOW_CRITICALITY;
+ rt_info.worst_case_execution_time = 0;
+ rt_info.typical_execution_time = 0;
+ rt_info.cached_execution_time = 0;
+ rt_info.period = 1;
+ rt_info.importance = RtecScheduler::VERY_LOW_IMPORTANCE;
+ rt_info.quantum = 0;
+ rt_info.threads = 0;
+ rt_info.info_type = RtecScheduler::OPERATION;
+ rt_info.priority = 0;
+ rt_info.preemption_subpriority = 0;
+ rt_info.preemption_priority = 0;
+ rt_info.volatile_token = 0;
+}
+
+*/
+
+TAO_END_VERSIONED_NAMESPACE_DECL
+
+#endif /* TAO_RECONFIG_SCHEDULER_T_C */
diff --git a/TAO/orbsvcs/orbsvcs/Sched/Reconfig_Scheduler_T.h b/TAO/orbsvcs/orbsvcs/Sched/Reconfig_Scheduler_T.h
new file mode 100644
index 00000000000..ec7f53542bb
--- /dev/null
+++ b/TAO/orbsvcs/orbsvcs/Sched/Reconfig_Scheduler_T.h
@@ -0,0 +1,777 @@
+// -*- C++ -*-
+
+// $Id$
+// ============================================================================
+//
+// = LIBRARY
+// orbsvcs
+//
+// = FILENAME
+// Reconfig_Scheduler_T.h
+//
+// = AUTHOR
+// Chris Gill <cdgill@cs.wustl.edu>
+//
+// ============================================================================
+
+#ifndef TAO_RECONFIG_SCHEDULER_T_H
+#define TAO_RECONFIG_SCHEDULER_T_H
+#include /**/ "ace/pre.h"
+
+#include "ace/config-all.h"
+
+#include "orbsvcs/Sched/Reconfig_Scheduler.h"
+
+#if !defined (ACE_LACKS_PRAGMA_ONCE)
+# pragma once
+#endif /* ACE_LACKS_PRAGMA_ONCE */
+
+TAO_BEGIN_VERSIONED_NAMESPACE_DECL
+
+template <class RECONFIG_SCHED_STRATEGY, class ACE_LOCK>
+class TAO_Reconfig_Scheduler :
+ public POA_RtecScheduler::Scheduler
+ // = TITLE
+ // A servant for RtecScheduler::Scheduler that can be initialized
+ // and run solely with precomputed scheduling information, but is also
+ // designed to perform efficient recomputation of scheduling info
+ // in the face of run-time changes to RT_Infos in the schedule.
+ //
+ // = DESCRIPTION
+ // This class implements the TAO scheduling service. It has
+ // the ability to accept and use precomputed scheduling information
+ // with deterministic performance once the schedule is fully configured.
+ // It also provides efficient and flexible lookup and computation
+ // during schedule configuration, so that it can be used during
+ // both schedule configuration and run-time phases of operation.
+ //
+{
+public:
+
+ typedef ACE_Hash_Map_Manager_Ex<RtecScheduler::handle_t,
+ TAO_RT_Info_Ex *,
+ ACE_Hash<RtecScheduler::handle_t>,
+ ACE_Equal_To<RtecScheduler::handle_t>,
+ ACE_LOCK> RT_INFO_MAP;
+ // Type of map used for O(1) lookup of RT_Infos by their handles.
+
+ typedef ACE_RB_Tree<const char *,
+ TAO_RT_Info_Ex*,
+ ACE_Less_Than<const char *>,
+ ACE_LOCK> RT_INFO_TREE;
+ // Type of tree used for O(log n) lookup of RT_Infos by their names.
+
+ typedef ACE_Hash_Map_Manager_Ex<RtecScheduler::Preemption_Priority_t,
+ RtecScheduler::Config_Info*,
+ ACE_Hash<RtecScheduler::Preemption_Priority_t>,
+ ACE_Equal_To<RtecScheduler::Preemption_Priority_t>,
+ ACE_LOCK> CONFIG_INFO_MAP;
+ // Type of map used for O(1) lookup of Config_Infos by their priorities.
+
+ typedef ACE_Hash_Map_Manager_Ex<RtecScheduler::handle_t,
+ RtecScheduler::Dependency_Set*,
+ ACE_Hash<RtecScheduler::handle_t>,
+ ACE_Equal_To<RtecScheduler::handle_t>,
+ ACE_LOCK> DEPENDENCY_SET_MAP;
+ // Type of map used for O(1) lookup of RT_Info
+ // dependency sets by caller or called handle.
+
+ typedef typename DEPENDENCY_SET_MAP::ITERATOR DEPENDENCY_SET_MAP_ITERATOR;
+ // Type of iterator for traversal of RT_Info dependency sets by
+ // caller or called handle.
+
+ TAO_Reconfig_Scheduler (int enforce_schedule_stability = 0,
+ const CORBA::Double & critical_utilization_threshold = 1.0,
+ const CORBA::Double & noncritical_utilization_threshold = 1.1);
+ // Default constructor.
+
+ TAO_Reconfig_Scheduler (int config_count,
+ ACE_Scheduler_Factory::POD_Config_Info config_info[],
+ int entry_count,
+ ACE_Scheduler_Factory::POD_RT_Info rt_info[],
+ int dependency_count,
+ ACE_Scheduler_Factory::POD_Dependency_Info dependency_info[],
+ u_long stability_flags,
+ int enforce_schedule_stability = 0,
+ const CORBA::Double & critical_utilization_threshold = 1.0,
+ const CORBA::Double & noncritical_utilization_threshold = 1.1);
+ // Constructor. Initialize the scheduler from POD_Config_Info, POD_RT_Info,
+ // and POD_Dependency arrays, plus schedule stability flags.
+
+ ~TAO_Reconfig_Scheduler ();
+ // Destructor.
+
+ int init (int config_count,
+ ACE_Scheduler_Factory::POD_Config_Info config_info[],
+ int rt_info_count,
+ ACE_Scheduler_Factory::POD_RT_Info rt_info[],
+ int dependency_count,
+ ACE_Scheduler_Factory::POD_Dependency_Info dependency_info[],
+ u_long stability_flags
+ ACE_ENV_ARG_DECL)
+ ACE_THROW_SPEC ((CORBA::SystemException,
+ RtecScheduler::DUPLICATE_NAME,
+ RtecScheduler::UNKNOWN_TASK,
+ RtecScheduler::SYNCHRONIZATION_FAILURE,
+ RtecScheduler::INTERNAL));
+ // Initializes the scheduler with the passed information.
+
+ void close (ACE_ENV_SINGLE_ARG_DECL)
+ ACE_THROW_SPEC ((CORBA::SystemException,
+ RtecScheduler::INTERNAL,
+ RtecScheduler::UNKNOWN_TASK,
+ RtecScheduler::SYNCHRONIZATION_FAILURE));
+ // Closes the scheduler, releasing all current resources.
+
+ virtual RtecScheduler::handle_t create (const char * entry_point
+ ACE_ENV_ARG_DECL)
+ ACE_THROW_SPEC ((CORBA::SystemException,
+ RtecScheduler::DUPLICATE_NAME,
+ RtecScheduler::INTERNAL,
+ RtecScheduler::SYNCHRONIZATION_FAILURE));
+ // Create an RT_Info. If it does not exist, a new RT_Info is
+ // created and inserted into the schedule, and the handle of the new
+ // RT_Info is returned. If the RT_Info already exists, an exception
+ // is thrown.
+
+ virtual RtecScheduler::handle_t lookup (const char * entry_point
+ ACE_ENV_ARG_DECL)
+ ACE_THROW_SPEC((CORBA::SystemException,
+ RtecScheduler::UNKNOWN_TASK,
+ RtecScheduler::SYNCHRONIZATION_FAILURE));
+ // Lookup a handle for an RT_Info, and return its handle, or an error
+ // value if it's not present.
+
+ virtual RtecScheduler::RT_Info* get (RtecScheduler::handle_t handle
+ ACE_ENV_ARG_DECL)
+ ACE_THROW_SPEC ((CORBA::SystemException,
+ RtecScheduler::UNKNOWN_TASK,
+ RtecScheduler::SYNCHRONIZATION_FAILURE));
+ // Return a pointer to the RT_Info corresponding to the passed handle.
+
+ virtual void set (::RtecScheduler::handle_t handle,
+ ::RtecScheduler::Criticality_t criticality,
+ ::RtecScheduler::Time time,
+ ::RtecScheduler::Time typical_time,
+ ::RtecScheduler::Time cached_time,
+ ::RtecScheduler::Period_t period,
+ ::RtecScheduler::Importance_t importance,
+ ::RtecScheduler::Quantum_t quantum,
+ ::RtecScheduler::Threads_t threads,
+ ::RtecScheduler::Info_Type_t info_type
+ ACE_ENV_ARG_DECL)
+ ACE_THROW_SPEC ((CORBA::SystemException,
+ RtecScheduler::UNKNOWN_TASK,
+ RtecScheduler::INTERNAL,
+ RtecScheduler::SYNCHRONIZATION_FAILURE));
+ // Set characteristics of the RT_Info corresponding to the passed handle.
+
+ virtual void reset (RtecScheduler::handle_t handle,
+ RtecScheduler::Criticality_t criticality,
+ RtecScheduler::Time time,
+ RtecScheduler::Time typical_time,
+ RtecScheduler::Time cached_time,
+ RtecScheduler::Period_t period,
+ RtecScheduler::Importance_t importance,
+ RtecScheduler::Quantum_t quantum,
+ CORBA::Long threads,
+ RtecScheduler::Info_Type_t info_type
+ ACE_ENV_ARG_DECL)
+ ACE_THROW_SPEC ((CORBA::SystemException,
+ RtecScheduler::UNKNOWN_TASK,
+ RtecScheduler::INTERNAL,
+ RtecScheduler::SYNCHRONIZATION_FAILURE));
+ // Reset characteristics of the RT_Info corresponding to the passed handle.
+
+ virtual void set_seq (const RtecScheduler::RT_Info_Set& infos
+ ACE_ENV_ARG_DECL)
+ ACE_THROW_SPEC ((CORBA::SystemException,
+ RtecScheduler::UNKNOWN_TASK,
+ RtecScheduler::INTERNAL,
+ RtecScheduler::SYNCHRONIZATION_FAILURE));
+ // Set characteristics of the RT_Infos corresponding to the passed handles.
+ // Tuples are added in the case of existing and/or multiple definitions.
+
+ virtual void reset_seq (const RtecScheduler::RT_Info_Set& infos
+ ACE_ENV_ARG_DECL)
+ ACE_THROW_SPEC ((CORBA::SystemException,
+ RtecScheduler::UNKNOWN_TASK,
+ RtecScheduler::INTERNAL,
+ RtecScheduler::SYNCHRONIZATION_FAILURE));
+ // Reset characteristics of the RT_Infos corresponding to the passed handles.
+ // Tuples are replaced in the case of existing and/or multiple definitions.
+
+ virtual void replace_seq (const RtecScheduler::RT_Info_Set& infos
+ ACE_ENV_ARG_DECL)
+ ACE_THROW_SPEC ((CORBA::SystemException,
+ RtecScheduler::UNKNOWN_TASK,
+ RtecScheduler::INTERNAL,
+ RtecScheduler::SYNCHRONIZATION_FAILURE));
+ // Replace all RT_Infos, resetting characteristics of the RT_Infos
+ // corresponding to the passed handles. All other RT_Infos are
+ // reset to their uninitialized values, i.e., the same they have
+ // just after the create call.
+
+ virtual void priority (RtecScheduler::handle_t handle,
+ RtecScheduler::OS_Priority& o_priority,
+ RtecScheduler::Preemption_Subpriority_t& p_subpriority,
+ RtecScheduler::Preemption_Priority_t& p_priority
+ ACE_ENV_ARG_DECL)
+ ACE_THROW_SPEC ((CORBA::SystemException,
+ RtecScheduler::UNKNOWN_TASK,
+ RtecScheduler::SYNCHRONIZATION_FAILURE,
+ RtecScheduler::NOT_SCHEDULED));
+ // Returns the priority and subpriority values assigned to an RT_Info,
+ // based on its handle.
+
+ virtual void entry_point_priority (const char * entry_point,
+ RtecScheduler::OS_Priority& o_priority,
+ RtecScheduler::Preemption_Subpriority_t& p_subpriority,
+ RtecScheduler::Preemption_Priority_t& p_priority
+ ACE_ENV_ARG_DECL)
+ ACE_THROW_SPEC ((CORBA::SystemException,
+ RtecScheduler::UNKNOWN_TASK,
+ RtecScheduler::SYNCHRONIZATION_FAILURE,
+ RtecScheduler::NOT_SCHEDULED));
+ // Returns the priority and subpriority values assigned to an RT_Info,
+ // based on its entry point name.
+
+ virtual void add_dependency (RtecScheduler::handle_t handle,
+ RtecScheduler::handle_t dependency,
+ CORBA::Long number_of_calls,
+ RtecScheduler::Dependency_Type_t dependency_type
+ ACE_ENV_ARG_DECL)
+ ACE_THROW_SPEC ((CORBA::SystemException,
+ RtecScheduler::SYNCHRONIZATION_FAILURE,
+ RtecScheduler::UNKNOWN_TASK));
+ // This method registers a dependency between two RT_Infos.
+
+ virtual void remove_dependency (RtecScheduler::handle_t handle,
+ RtecScheduler::handle_t dependency,
+ CORBA::Long number_of_calls,
+ RtecScheduler::Dependency_Type_t dependency_type
+ ACE_ENV_ARG_DECL)
+ ACE_THROW_SPEC ((CORBA::SystemException,
+ RtecScheduler::SYNCHRONIZATION_FAILURE,
+ RtecScheduler::UNKNOWN_TASK));
+ // This method removes a dependency between two RT_Infos.
+
+ virtual void set_dependency_enable_state (RtecScheduler::handle_t handle,
+ RtecScheduler::handle_t dependency,
+ CORBA::Long number_of_calls,
+ RtecScheduler::Dependency_Type_t dependency_type,
+ RtecScheduler::Dependency_Enabled_Type_t enabled
+ ACE_ENV_ARG_DECL)
+ ACE_THROW_SPEC ((CORBA::SystemException,
+ RtecScheduler::SYNCHRONIZATION_FAILURE,
+ RtecScheduler::UNKNOWN_TASK));
+ // This method sets the enable state of a dependency between two RT_Infos.
+
+ virtual void set_dependency_enable_state_seq (const RtecScheduler::Dependency_Set & dependencies
+ ACE_ENV_ARG_DECL)
+ ACE_THROW_SPEC ((CORBA::SystemException,
+ RtecScheduler::SYNCHRONIZATION_FAILURE,
+ RtecScheduler::UNKNOWN_TASK));
+ // This method sets the enable state of a sequence of dependencies.
+
+ virtual void set_rt_info_enable_state (RtecScheduler::handle_t handle,
+ RtecScheduler::RT_Info_Enabled_Type_t enabled
+ ACE_ENV_ARG_DECL)
+ ACE_THROW_SPEC ((CORBA::SystemException,
+ RtecScheduler::SYNCHRONIZATION_FAILURE,
+ RtecScheduler::INTERNAL,
+ RtecScheduler::UNKNOWN_TASK));
+ // This method enables or disables an RT_Info.
+
+ virtual void set_rt_info_enable_state_seq (const RtecScheduler::RT_Info_Enable_State_Pair_Set & pair_set
+ ACE_ENV_ARG_DECL)
+ ACE_THROW_SPEC ((CORBA::SystemException,
+ RtecScheduler::SYNCHRONIZATION_FAILURE,
+ RtecScheduler::INTERNAL,
+ RtecScheduler::UNKNOWN_TASK));
+ // This method enables or disables a sequence of RT_Infos.
+
+ virtual void compute_scheduling (CORBA::Long minimum_priority,
+ CORBA::Long maximum_priority,
+ RtecScheduler::RT_Info_Set_out infos,
+ RtecScheduler::Dependency_Set_out dependencies,
+ RtecScheduler::Config_Info_Set_out configs,
+ RtecScheduler::Scheduling_Anomaly_Set_out anomalies
+ ACE_ENV_ARG_DECL)
+ ACE_THROW_SPEC ((CORBA::SystemException,
+ RtecScheduler::UTILIZATION_BOUND_EXCEEDED,
+ RtecScheduler::SYNCHRONIZATION_FAILURE,
+ RtecScheduler::INSUFFICIENT_THREAD_PRIORITY_LEVELS,
+ RtecScheduler::TASK_COUNT_MISMATCH,
+ RtecScheduler::INTERNAL,
+ RtecScheduler::DUPLICATE_NAME));
+ // If information has been added or changed since the last stable
+ // schedule was computed, this method causes scheduling information
+ // to be computed for all registered RT_Infos. If the schedule is
+ // already stable, this is a no-op.
+
+ virtual void recompute_scheduling (CORBA::Long minimum_priority,
+ CORBA::Long maximum_priority,
+ RtecScheduler::Scheduling_Anomaly_Set_out anomalies
+ ACE_ENV_ARG_DECL)
+ ACE_THROW_SPEC ((CORBA::SystemException,
+ RtecScheduler::UTILIZATION_BOUND_EXCEEDED,
+ RtecScheduler::SYNCHRONIZATION_FAILURE,
+ RtecScheduler::INSUFFICIENT_THREAD_PRIORITY_LEVELS,
+ RtecScheduler::TASK_COUNT_MISMATCH,
+ RtecScheduler::INTERNAL,
+ RtecScheduler::DUPLICATE_NAME));
+ // Recomputes the scheduling priorities, etc.
+
+ virtual void get_rt_info_set (RtecScheduler::RT_Info_Set_out infos
+ ACE_ENV_ARG_DECL)
+ ACE_THROW_SPEC ((CORBA::SystemException,
+ RtecScheduler::SYNCHRONIZATION_FAILURE,
+ RtecScheduler::INTERNAL));
+ // Returns the set of rt_infos, with their assigned priorities (as
+ // of the last schedule re-computation).
+
+ virtual void get_dependency_set (RtecScheduler::Dependency_Set_out dependencies
+ ACE_ENV_ARG_DECL)
+ ACE_THROW_SPEC ((CORBA::SystemException,
+ RtecScheduler::SYNCHRONIZATION_FAILURE,
+ RtecScheduler::INTERNAL));
+ // Returns the set of rt_infos, with their assigned priorities (as
+ // of the last schedule re-computation).
+
+ virtual void get_config_info_set (RtecScheduler::Config_Info_Set_out configs
+ ACE_ENV_ARG_DECL)
+ ACE_THROW_SPEC ((CORBA::SystemException,
+ RtecScheduler::SYNCHRONIZATION_FAILURE,
+ RtecScheduler::INTERNAL));
+ // Returns the set of config_infos, describing the appropriate
+ // number, types, and priority levels for the dispatching lanes.
+
+
+ virtual void dispatch_configuration (RtecScheduler::Preemption_Priority_t p_priority,
+ RtecScheduler::OS_Priority& o_priority,
+ RtecScheduler::Dispatching_Type_t & d_type
+ ACE_ENV_ARG_DECL)
+ ACE_THROW_SPEC ((CORBA::SystemException,
+ RtecScheduler::NOT_SCHEDULED,
+ RtecScheduler::SYNCHRONIZATION_FAILURE,
+ RtecScheduler::UNKNOWN_PRIORITY_LEVEL));
+ // Provides the thread priority and queue type for the given priority level.
+
+ virtual RtecScheduler::Preemption_Priority_t last_scheduled_priority (ACE_ENV_SINGLE_ARG_DECL)
+ ACE_THROW_SPEC ((CORBA::SystemException,
+ RtecScheduler::SYNCHRONIZATION_FAILURE,
+ RtecScheduler::NOT_SCHEDULED));
+ // Returns the last priority number assigned to an operation in the
+ // schedule. The number returned is one less than the total number
+ // of scheduled priorities. All scheduled priorities range from 0
+ // to the number returned, inclusive.
+
+ virtual void get_config_infos (RtecScheduler::Config_Info_Set_out configs
+ ACE_ENV_ARG_DECL)
+ ACE_THROW_SPEC ((CORBA::SystemException,
+ RtecScheduler::SYNCHRONIZATION_FAILURE,
+ RtecScheduler::NOT_SCHEDULED));
+ // Provides the set of Config_Infos associated with the current schedule.
+
+ // = Accessors that allow controlled relaxations of encapsulation.
+
+ RECONFIG_SCHED_STRATEGY & sched_strategy ();
+ // Accesses scheduling strategy for the reconfig scheduler.
+
+ CONFIG_INFO_MAP & config_info_map ();
+ // Accesses map for O(1) lookup of Config_Infos by priority level.
+
+ long config_info_count ();
+ // Returns the number of config infos, which is also the number of
+ // assigned priority levels.
+
+ RT_INFO_MAP & rt_info_map ();
+ // Accesses map for O(1) lookup of RT_Infos by handle.
+
+ long rt_info_count ();
+ // Returns the number of registered RT_Infos.
+
+ long rt_info_tuple_count ();
+ // Returns the number of registered RT_Info tuples.
+
+ RT_INFO_TREE & rt_info_tree ();
+ // Accesses tree for O(log n) lookup of RT_Infos by name.
+
+ DEPENDENCY_SET_MAP & calling_dependency_set_map ();
+ // Accesses map for O(1) lookup of RT_Info dependency
+ // set by the caller operation's handle.
+
+ DEPENDENCY_SET_MAP & called_dependency_set_map ();
+ // Accesses map for O(1) lookup of RT_Info dependency
+ // set by the called operation's handle.
+
+ int dependency_count ();
+ // Returns the number of dependencies in the dependency lists of all RT_Infos.
+ // This is used when traversing the dependency graph.
+
+ CORBA::Double noncritical_utilization ();
+ // Accessor for utilization by noncritical tasks.
+
+ CORBA::Double critical_utilization ();
+ // Accessor for utilization by critical tasks.
+
+ CORBA::Double noncritical_utilization_threshold ();
+ // Accessor for noncritical task utilization threshold.
+
+ void noncritical_utilization_threshold (const CORBA::Double &);
+ // Mutator for noncritical task utilization threshold.
+
+ CORBA::Double critical_utilization_threshold ();
+ // Accessor for critical task utilization threshold.
+
+ void critical_utilization_threshold (const CORBA::Double &);
+ // Mutator for critical task utilization threshold.
+
+protected:
+
+ // @@ TO DO: use a memento to save and restore scheduler state without
+ // breaking encapsulation, particularly of these flags.
+
+ // @@ TO DO: Recheck the applicability and fine-grain management of
+ // these flags. Do these still correctly reflect the phases
+ // of the computation?
+
+ enum Stability_Flags
+ {
+ // This should always be zero.
+ SCHED_ALL_STABLE = 0x00UL,
+
+ // Individual stability flags, each of
+ // which should have a distinct bit value.
+
+ // Utilization may need to be recomputed.
+ SCHED_UTILIZATION_NOT_STABLE = 0x01UL,
+
+ // Priorities may need to be recomputed.
+ SCHED_PRIORITY_NOT_STABLE = 0x02UL,
+
+ // Characteristics may need to be repropagated.
+ SCHED_PROPAGATION_NOT_STABLE = 0x04UL,
+
+ // This should be the disjunction of
+ // all the individual stability flags.
+ SCHED_NONE_STABLE =
+ SCHED_UTILIZATION_NOT_STABLE |
+ SCHED_PRIORITY_NOT_STABLE |
+ SCHED_PROPAGATION_NOT_STABLE
+ };
+ // Flags indicating stability conditions of schedule.
+
+ TAO_RT_Info_Ex * create_i (const char * entry_point,
+ RtecScheduler::handle_t handle,
+ int ignore_duplicates
+ ACE_ENV_ARG_DECL)
+ ACE_THROW_SPEC ((CORBA::SystemException,
+ RtecScheduler::DUPLICATE_NAME,
+ RtecScheduler::INTERNAL));
+ // Internal method to create an RT_Info. If it does not exist, a
+ // new RT_Info is created and inserted into the schedule, and the
+ // handle of the new RT_Info is returned. If the RT_Info already
+ // exists, then if the ignore_duplicates flag is set, the handle
+ // is simply returned; otherwise, an exception is thrown.
+
+ void set_i (TAO_RT_Info_Ex *rt_info,
+ RtecScheduler::Criticality_t criticality,
+ RtecScheduler::Time time,
+ RtecScheduler::Time typical_time,
+ RtecScheduler::Time cached_time,
+ RtecScheduler::Period_t period,
+ RtecScheduler::Importance_t importance,
+ RtecScheduler::Quantum_t quantum,
+ CORBA::Long threads,
+ RtecScheduler::Info_Type_t info_type
+ ACE_ENV_ARG_DECL)
+ ACE_THROW_SPEC ((CORBA::SystemException,
+ RtecScheduler::INTERNAL));
+ // Internal method to set characteristics of the passed RT_Info.
+
+ virtual RtecScheduler::handle_t lookup_i (const char * entry_point
+ ACE_ENV_ARG_DECL)
+ ACE_THROW_SPEC((CORBA::SystemException,
+ RtecScheduler::UNKNOWN_TASK));
+ // Internal method to look up a handle for an RT_Info, and return
+ // its handle, or an exception if it's not present.
+
+ virtual void priority_i (RtecScheduler::handle_t handle,
+ RtecScheduler::OS_Priority& o_priority,
+ RtecScheduler::Preemption_Subpriority_t& p_subpriority,
+ RtecScheduler::Preemption_Priority_t& p_priority
+ ACE_ENV_ARG_DECL)
+ ACE_THROW_SPEC ((CORBA::SystemException,
+ RtecScheduler::UNKNOWN_TASK,
+ RtecScheduler::NOT_SCHEDULED));
+ // Internal method to return the priority and subpriority
+ // values assigned to an RT_Info, based on its handle.
+
+ virtual void add_dependency_i (RtecScheduler::handle_t handle,
+ RtecScheduler::handle_t dependency,
+ CORBA::Long number_of_calls,
+ RtecScheduler::Dependency_Type_t dependency_type,
+ RtecScheduler::Dependency_Enabled_Type_t enabled
+ ACE_ENV_ARG_DECL)
+ ACE_THROW_SPEC ((CORBA::SystemException,
+ RtecScheduler::INTERNAL,
+ RtecScheduler::UNKNOWN_TASK));
+ // Internal method that registers a dependency between two RT_Infos.
+ // Assumes it is being called with all locks held, and does *not*
+ // set any schedule stability flags.
+
+ virtual void remove_dependency_i (RtecScheduler::handle_t handle,
+ RtecScheduler::handle_t dependency,
+ CORBA::Long number_of_calls,
+ RtecScheduler::Dependency_Type_t dependency_type
+ ACE_ENV_ARG_DECL)
+ ACE_THROW_SPEC ((CORBA::SystemException,
+ RtecScheduler::SYNCHRONIZATION_FAILURE,
+ RtecScheduler::INTERNAL,
+ RtecScheduler::UNKNOWN_TASK));
+ // Internal method that removes a dependency between two RT_Infos.
+ // Assumes it is being called with all locks held, and does *not*
+ // set any schedule stability flags.
+
+ virtual void set_dependency_enable_state_i (RtecScheduler::handle_t handle,
+ RtecScheduler::handle_t dependency,
+ CORBA::Long number_of_calls,
+ RtecScheduler::Dependency_Type_t dependency_type,
+ RtecScheduler::Dependency_Enabled_Type_t enabled
+ ACE_ENV_ARG_DECL)
+ ACE_THROW_SPEC ((CORBA::SystemException,
+ RtecScheduler::SYNCHRONIZATION_FAILURE,
+ RtecScheduler::INTERNAL,
+ RtecScheduler::UNKNOWN_TASK));
+ // Internal method that enables or disables a dependency between two RT_Infos.
+ // Assumes it is being called with all locks held, and does *not*
+ // set any schedule stability flags.
+
+
+ virtual void map_dependency_i
+ (RtecScheduler::handle_t key,
+ RtecScheduler::handle_t handle,
+ ACE_TYPENAME TAO_Reconfig_Scheduler<RECONFIG_SCHED_STRATEGY, ACE_LOCK>::DEPENDENCY_SET_MAP &dependency_map,
+ CORBA::Long number_of_calls,
+ RtecScheduler::Dependency_Type_t dependency_type,
+ RtecScheduler::Dependency_Enabled_Type_t enabled
+ ACE_ENV_ARG_DECL)
+ ACE_THROW_SPEC ((CORBA::SystemException,
+ RtecScheduler::INTERNAL,
+ RtecScheduler::UNKNOWN_TASK));
+ // This method installs a dependency in a dependency set map.
+
+ void unmap_dependency_i (RtecScheduler::handle_t key,
+ RtecScheduler::handle_t handle,
+ ACE_TYPENAME TAO_Reconfig_Scheduler<RECONFIG_SCHED_STRATEGY, ACE_LOCK>::DEPENDENCY_SET_MAP &dependency_map,
+ CORBA::Long number_of_calls,
+ RtecScheduler::Dependency_Type_t dependency_type
+ ACE_ENV_ARG_DECL)
+ ACE_THROW_SPEC ((CORBA::SystemException,
+ RtecScheduler::INTERNAL,
+ RtecScheduler::UNKNOWN_TASK));
+ // This method removes a dependency from a dependency set map.
+
+ void map_dependency_enable_state_i (RtecScheduler::handle_t key,
+ RtecScheduler::handle_t handle,
+ ACE_TYPENAME
+ TAO_Reconfig_Scheduler<RECONFIG_SCHED_STRATEGY, ACE_LOCK>::DEPENDENCY_SET_MAP &dependency_map,
+ CORBA::Long number_of_calls,
+ RtecScheduler::Dependency_Type_t dependency_type,
+ RtecScheduler::Dependency_Enabled_Type_t enabled
+ ACE_ENV_ARG_DECL)
+ ACE_THROW_SPEC ((CORBA::SystemException,
+ RtecScheduler::INTERNAL,
+ RtecScheduler::UNKNOWN_TASK));
+ // This method updates the enable state of a dependency in a dependency set map.
+
+ virtual void dfs_traverse_i (ACE_ENV_SINGLE_ARG_DECL)
+ ACE_THROW_SPEC ((CORBA::SystemException,
+ RtecScheduler::INTERNAL));
+ // Traverses dependency graph, assigning a topological ordering.
+ // Resets DFS map entries, do DFS traversal, constructs DFS map.
+
+ virtual void detect_cycles_i (ACE_ENV_SINGLE_ARG_DECL)
+ ACE_THROW_SPEC ((CORBA::SystemException,
+ RtecScheduler::INTERNAL,
+ RtecScheduler::CYCLIC_DEPENDENCIES));
+ // Sorts an array of RT_info handles in topological order, then
+ // checks for loops, marks unresolved remote dependencies.
+
+ void perform_admission_i (ACE_ENV_SINGLE_ARG_DECL)
+ ACE_THROW_SPEC ((RtecScheduler::UTILIZATION_BOUND_EXCEEDED,
+ CORBA::SystemException,
+ RtecScheduler::INTERNAL));
+ // Compute aggregate execution times, then performs admission over
+ // rate tuples.
+
+
+ void crit_dfs_traverse_i (ACE_ENV_SINGLE_ARG_DECL)
+ ACE_THROW_SPEC ((CORBA::SystemException,
+ RtecScheduler::INTERNAL));
+ // Traverses criticality dependency graph, assigning a topological
+ // ordering. Resets DFS map entries, do DFS traversal, constructs
+ // DFS map.
+
+
+ void propagate_criticalities_i (ACE_ENV_SINGLE_ARG_DECL)
+ ACE_THROW_SPEC ((CORBA::SystemException,
+ RtecScheduler::INTERNAL));
+ // Propagates criticalities.
+
+
+ void propagate_characteristics_i (ACE_ENV_SINGLE_ARG_DECL)
+ ACE_THROW_SPEC ((CORBA::SystemException,
+ RtecScheduler::INTERNAL,
+ RtecScheduler::UNRESOLVED_LOCAL_DEPENDENCIES,
+ RtecScheduler::THREAD_SPECIFICATION));
+ // Propagates effective execution time and period, sets total frame size.
+
+ virtual void assign_priorities_i (ACE_ENV_SINGLE_ARG_DECL)
+ ACE_THROW_SPEC ((CORBA::SystemException,
+ RtecScheduler::INTERNAL,
+ RtecScheduler::DUPLICATE_NAME));
+ // Sort operations by urgency (done by strategy), then assign
+ // priorities and subpriorities in one pass. (Re)computes utilization
+ // and sets last scheduled priority and last feasible priority.
+
+ void refresh_tuple_ptr_array_i (ACE_ENV_SINGLE_ARG_DECL)
+ ACE_THROW_SPEC ((CORBA::SystemException,
+ RtecScheduler::INTERNAL));
+ // Refreshes the array of tuple pointers, corrects the count.
+
+/* WSOA merge - commented out
+ virtual void compute_utilization_i (ACE_ENV_SINGLE_ARG_DECL)
+ ACE_THROW_SPEC ((CORBA::SystemException,
+ RtecScheduler::INTERNAL));
+ // Compute utilization, set last feasible priority.
+
+
+ static void init_rt_info (RtecScheduler::RT_Info &rt_info)
+ ACE_THROW_SPEC ((CORBA::SystemException));
+ // Helper method to give an RT_Info some reasonable default values
+*/
+ // = Protected class members.
+
+ RECONFIG_SCHED_STRATEGY sched_strategy_;
+ // Scheduling strategy for the reconfig scheduler.
+
+ CONFIG_INFO_MAP config_info_map_;
+ // Map for O(1) lookup of Config_Infos by priority level.
+
+ long config_info_count_;
+ // The number of config infos, which is also the number of priority
+ // levels.
+
+ RT_INFO_MAP rt_info_map_;
+ // Map for O(1) lookup of RT_Infos by handle.
+
+ long rt_info_count_;
+ // The number of registered RT_Infos.
+
+ long rt_info_tuple_count_;
+ // The number of registered RT_Info tuples.
+
+ RT_INFO_TREE rt_info_tree_;
+ // Tree for O(log n) lookup of RT_Infos by name.
+
+ DEPENDENCY_SET_MAP calling_dependency_set_map_;
+ // Map for O(1) lookup of RT_Info dependency
+ // set by the caller operation's handle.
+
+ DEPENDENCY_SET_MAP called_dependency_set_map_;
+ // Map for O(1) lookup of RT_Info dependency
+ // set by the called operation's handle.
+
+ DEPENDENCY_SET_MAP crit_dependency_set_map_;
+ // Map for O(1) lookup of RT_Info dependency set. The above two maps
+ // store the calling and called dependencies. This map stores the
+ // true dependencies based on criticality propagation direction. For
+ // two-ways, this is the same as the direction of invocation,
+ // whereas for one-ways, it is in the opposite direction.
+
+ RtecScheduler::handle_t next_handle_;
+ // Next RT_Info descriptor handle to allocate. The first handle is
+ // always 1.
+
+ TAO_Reconfig_Scheduler_Entry ** entry_ptr_array_;
+ // Array of pointers to scheduling entries. This
+ // array is maintained by the methods that create
+ // scheduling entries, and sorted in topological
+ // order and then priority order at various points
+ // during schedule computation.
+
+ long entry_ptr_array_size_;
+ // Size of the array of scheduling entry pointers.
+
+ TAO_RT_Info_Tuple ** tuple_ptr_array_;
+ // Array of pointers to scheduling entries. This
+ // array is maintained by the methods that create
+ // scheduling entries, and sorted in topological
+ // order and then priority order at various points
+ // during schedule computation.
+
+ long tuple_ptr_array_size_;
+ // Size of the array of scheduling entry pointers.
+
+ u_long stability_flags_;
+ // Flags indicating whether a stable schedule has been computed
+ // since the last addition or modification of information, and which
+ // parts of the schedule are unstable.
+
+ int enforce_schedule_stability_;
+ // Indicates whether the scheduler should enforce stability by
+ // throwing an exception: otherwise for operations where this
+ // matters, it will simply return a default value if nothing
+ // has been generated.
+
+ int dependency_count_;
+ // The number of dependencies in the dependency lists of all RT_Infos.
+ // This is used when traversing the dependency graph.
+
+ RtecScheduler::Preemption_Priority_t last_scheduled_priority_;
+ // Stores the last priority for which an operation can be scheduled
+
+ CORBA::Double noncritical_utilization_;
+ // Utilization by noncritical tasks.
+
+ CORBA::Double critical_utilization_;
+ // Utilization by critical tasks.
+
+ CORBA::Double noncritical_utilization_threshold_;
+ // Utilization by noncritical tasks.
+
+ CORBA::Double critical_utilization_threshold_;
+ // Utilization by critical tasks.
+
+ ACE_LOCK mutex_;
+ // Mutual exclusion lock for the scheduler itself. This is needed to
+ // synchronize updates and accesses to scheduling information.
+};
+
+
+template <class ARRAY_ELEMENT_TYPE> void
+maintain_scheduling_array (ARRAY_ELEMENT_TYPE ** & current_ptr_array,
+ long & current_ptr_array_size,
+ RtecScheduler::handle_t handle
+ ACE_ENV_ARG_DECL)
+ ACE_THROW_SPEC ((CORBA::SystemException));
+// Helper function: makes sure there is room in the scheduling pointer
+// arrays. This function expands the array eagerly, to minimize time
+// overhead for memory allocation (at a cost of some unused space).
+
+TAO_END_VERSIONED_NAMESPACE_DECL
+
+#if defined (ACE_TEMPLATES_REQUIRE_SOURCE)
+#include "orbsvcs/Sched/Reconfig_Scheduler_T.cpp"
+#endif /* ACE_TEMPLATES_REQUIRE_SOURCE */
+
+#if defined (ACE_TEMPLATES_REQUIRE_PRAGMA)
+#pragma implementation ("Reconfig_Scheduler_T.cpp")
+#endif /* ACE_TEMPLATES_REQUIRE_PRAGMA */
+
+
+#include /**/ "ace/post.h"
+#endif /* TAO_RECONFIG_SCHEDULER_T_H */
diff --git a/TAO/orbsvcs/orbsvcs/Sched/SchedEntry.cpp b/TAO/orbsvcs/orbsvcs/Sched/SchedEntry.cpp
new file mode 100644
index 00000000000..5dc53ae9ffb
--- /dev/null
+++ b/TAO/orbsvcs/orbsvcs/Sched/SchedEntry.cpp
@@ -0,0 +1,938 @@
+// $Id$
+
+// ============================================================================
+//
+// = LIBRARY
+// sched
+//
+// = FILENAME
+// SchedEntry.cpp
+//
+// = CREATION DATE
+// 7 February 1998
+//
+// = AUTHOR
+// Chris Gill
+//
+// ============================================================================
+
+#include "orbsvcs/Sched/SchedEntry.h"
+#include "ace/SString.h"
+#include "ace/OS_NS_stdio.h"
+
+#if ! defined (__ACE_INLINE__)
+#include "orbsvcs/Sched/SchedEntry.i"
+#endif /* __ACE_INLINE__ */
+
+ACE_RCSID(Sched, SchedEntry, "$Id$")
+
+TAO_BEGIN_VERSIONED_NAMESPACE_DECL
+
+Task_Entry::Task_Entry (void)
+ : rt_info_ (0),
+ effective_period_(0),
+ dfs_status_ (NOT_VISITED),
+ discovered_ (-1),
+ finished_ (-1),
+ is_thread_delineator_ (0),
+ has_unresolved_remote_dependencies_ (0),
+ has_unresolved_local_dependencies_ (0),
+ calls_ (),
+ callers_ ()
+{
+}
+
+Task_Entry::~Task_Entry (void)
+{
+ // Zero out the task entry ACT in the corresponding rt_info
+ rt_info_->volatile_token = 0;
+
+ ACE_Unbounded_Set_Iterator <Task_Entry_Link *> iter(calls_);
+ Task_Entry_Link **link = 0;
+
+ // Iterate through the "calls" set of Task Entry Links and free each one
+
+ for (iter.first ();
+ ! iter.done ();
+ iter.advance (), link = 0)
+ {
+ if (iter.next (link) != 0 && link != 0 && *link != 0)
+ {
+ // remove the link object pointer from the calling entry's
+ // "callers" set and destroy the link object
+ (*link)->called ().callers_.remove (*link);
+ delete (*link);
+ }
+ }
+}
+
+// Merge dispatches according to info type and type of call, update
+// relevant scheduling characteristics for this entry.
+
+Task_Entry::Propagation_Status
+Task_Entry::merge_dispatches (ACE_Unbounded_Set <Dispatch_Entry *> &dispatch_entries,
+ ACE_CString &unresolved_locals,
+ ACE_CString &unresolved_remotes)
+{
+ Task_Entry::Propagation_Status result = SUCCEEDED;
+ switch (info_type ())
+ {
+ case RtecScheduler::DISJUNCTION:
+
+ // Prohibit two-way dispatches of a disjunction group, and
+ // disjunctively merge its one-way dispatches. NOTE: one
+ // interpretation of disjunction for two-way calls is that the
+ // caller calls one OR the other, but this is problematic: how
+ // do we map the dispatches for this ?
+ if (prohibit_dispatches (RtecBase::TWO_WAY_CALL) < 0)
+ result = TWO_WAY_DISJUNCTION;
+
+ if (disjunctive_merge (RtecBase::ONE_WAY_CALL,
+ dispatch_entries,
+ unresolved_locals,
+ unresolved_remotes) < 0)
+ result = INTERNAL_ERROR;
+ break;
+
+ case RtecScheduler::CONJUNCTION:
+
+ // Prohibit two-way dispatches of a conjunction group,
+ // and conjunctively merge its one-way dispatches.
+ // NOTE: one interpretation of disjunction for two-way calls
+ // is that the caller calls BOTH, so that there is a
+ // disjunctive merge of each two-way, as for the OPERATION
+ // (prohibit for now, as the additional complexity of allowing
+ // conjunctions of two-ways, but not disjunctions does not
+ // buy us anything, anyway).
+ if (prohibit_dispatches (RtecBase::TWO_WAY_CALL) < 0)
+ result = TWO_WAY_CONJUNCTION;
+ if (conjunctive_merge (RtecBase::ONE_WAY_CALL,
+ dispatch_entries,
+ unresolved_locals,
+ unresolved_remotes) < 0)
+ result = INTERNAL_ERROR;
+ break;
+
+ case RtecScheduler::OPERATION:
+ case RtecScheduler::REMOTE_DEPENDANT:
+
+ // Disjunctively merge the operation's two-way dispatches, and
+ // conjunctively merge its one-way dispatches.
+ if (disjunctive_merge (RtecBase::TWO_WAY_CALL,
+ dispatch_entries,
+ unresolved_locals,
+ unresolved_remotes) < 0)
+ result = INTERNAL_ERROR;
+ if (conjunctive_merge (RtecBase::ONE_WAY_CALL,
+ dispatch_entries,
+ unresolved_locals,
+ unresolved_remotes) < 0)
+ result = INTERNAL_ERROR;
+ break;
+
+ default:
+
+ // There should not be any other kind of RT_Info, or if there
+ // is, the above switch logic is in need of repair.
+ result = UNRECOGNIZED_INFO_TYPE;
+ break;
+ }
+
+ return result;
+}
+
+// Prohibit calls of the given type: currently used to enforce the
+// notion that two-way calls to disjunctive or conjunctive RT_Infos do
+// not have any defined meaning, and thus should be considered
+// dependency specification errors: if these constraints are removed
+// in the future, this method should be removed as well Returns 0 if
+// all is well, or -1 if an error has occurred.
+
+int
+Task_Entry::prohibit_dispatches (Dependency_Type dt)
+{
+ // Iterate over the set of dependencies, ensuring none of them has
+ // the given dependency type.
+ for (ACE_Unbounded_Set_Iterator <Task_Entry_Link *> iter (callers_);
+ ! iter.done ();
+ iter.advance ())
+ {
+ Task_Entry_Link **link;
+
+ if (iter.next (link) == 0
+ || link == 0
+ || *link == 0
+ || (*link)->dependency_type () == dt)
+ return -1;
+ }
+
+ return 0;
+}
+
+// Perform disjunctive merge of arrival times of oneway calls: all
+// arrival times of all dependencies are duplicated by the multiplier
+// and repetition over the new frame size.
+
+int
+Task_Entry::disjunctive_merge (Dependency_Type dt,
+ ACE_Unbounded_Set <Dispatch_Entry *> &dispatch_entries,
+ ACE_CString &unresolved_locals,
+ ACE_CString &unresolved_remotes)
+{
+ char string_buffer[BUFSIZ];
+
+ // Iterate over the set of dependencies, merging dispatches of the
+ // callers over the enclosing frame size.
+ for (ACE_Unbounded_Set_Iterator <Task_Entry_Link *> iter (callers_);
+ ! iter.done ();
+ iter.advance ())
+ {
+ Task_Entry_Link **link;
+
+ if (iter.next (link) == 0
+ || link == 0
+ || *link == 0)
+ return -1;
+
+ // The link matches the dependency type given
+ if ((*link)->dependency_type () == dt)
+ {
+ // Check for and warn about unresolved remote dependencies
+ // in the ONE_WAY call graph.
+ if ((*link)->dependency_type () == RtecBase::ONE_WAY_CALL
+ && (*link)->caller ().has_unresolved_remote_dependencies ()
+ && ! this->has_unresolved_remote_dependencies ())
+ {
+ // Propagate the unresolved remote dependency flag, and
+ // issue a debug scheduler warning.
+ this->has_unresolved_remote_dependencies (1);
+ ACE_DEBUG ((LM_DEBUG,
+ "Warning: an operation identified by "
+ "\"%s\" has unresolved remote dependencies.\n",
+ (const char*) this->rt_info ()->entry_point));
+
+ // Record entry point in list of unresolved remote
+ // dependencies
+ ACE_OS::sprintf (string_buffer,
+ "// %s\n",
+ (const char*) this->rt_info ()->entry_point);
+ unresolved_remotes +=
+ ACE_CString (string_buffer);
+
+ }
+
+ // Check for and warn about unresolved local dependencies in
+ // the ONE_WAY call graph.
+ if ((*link)->dependency_type () == RtecBase::ONE_WAY_CALL
+ && (*link)->caller ().has_unresolved_local_dependencies ()
+ && ! this->has_unresolved_local_dependencies ())
+ {
+ // Propagate the unresolved local dependency flag, and
+ // issue a debug scheduler warning.
+ this->has_unresolved_local_dependencies (1);
+ ACE_DEBUG ((LM_DEBUG,
+ "Warning: an operation identified by "
+ "\"%s\" has unresolved local dependencies.\n",
+ (const char*) this->rt_info ()->entry_point));
+
+ // Record entry point in list of unresolved local
+ // dependencies
+ ACE_OS::sprintf (string_buffer,
+ "// %s\n",
+ (const char*) this->rt_info ()->entry_point);
+ unresolved_locals +=
+ ACE_CString (string_buffer);
+ }
+
+ // Merge the caller's dispatches into the current set.
+ if (merge_frames (dispatch_entries,
+ *this,
+ dispatches_,
+ (*link)->caller ().dispatches_, effective_period_,
+ (*link)->caller ().effective_period_,
+ (*link)->number_of_calls ()) < 0)
+ return -1;
+ }
+ }
+
+ return 0;
+}
+
+// Perform conjunctive merge of arrival times of calls: all arrival
+// times of all dependencies are duplicated by the multiplier and
+// repetition over the new frame size and then iteratively merged by
+// choosing the maximal arrival time at the current position in each
+// queue (iteration is in lockstep over all queues, and ends when any
+// queue ends).
+
+int
+Task_Entry::conjunctive_merge (Dependency_Type dt,
+ ACE_Unbounded_Set <Dispatch_Entry *> &dispatch_entries,
+ ACE_CString &unresolved_locals,
+ ACE_CString &unresolved_remotes)
+{
+ int result = 0;
+ char string_buffer [BUFSIZ];
+
+ // Iterate over the dependencies, and determine the total frame
+ // size.
+
+ u_long frame_size = 1;
+
+ ACE_Unbounded_Set_Iterator <Task_Entry_Link *> dep_iter (callers_);
+
+ for (dep_iter.first ();
+ dep_iter.done () == 0;
+ dep_iter.advance ())
+ {
+ Task_Entry_Link **link;
+
+ if (dep_iter.next (link) == 0
+ || link == 0
+ || *link == 0)
+ return -1;
+
+ // The link matches the dependency type given.
+ if ((*link)->dependency_type () == dt)
+ {
+ // Check for and warn about unresolved remote dependencies
+ // in the ONE_WAY call graph.
+ if ((*link)->dependency_type () == RtecBase::ONE_WAY_CALL
+ && (*link)->caller ().has_unresolved_remote_dependencies ()
+ && ! this->has_unresolved_remote_dependencies ())
+ {
+ // Propagate the unresolved remote dependency flag, and
+ // issue a debug scheduler warning.
+ this->has_unresolved_remote_dependencies (1);
+ ACE_DEBUG ((LM_DEBUG,
+ "Warning: an operation identified by "
+ "\"%s\" has unresolved remote dependencies.\n",
+ (const char*) this->rt_info ()->entry_point));
+
+ // Record entry point in list of unresolved remote
+ // dependencies
+ ACE_OS::sprintf (string_buffer,
+ "// %s\n",
+ (const char*) this->rt_info ()->entry_point);
+ unresolved_remotes +=
+ ACE_CString (string_buffer);
+ }
+
+ // Check for and warn about unresolved local dependencies in
+ // the ONE_WAY call graph.
+ if ((*link)->dependency_type () == RtecBase::ONE_WAY_CALL
+ && (*link)->caller ().has_unresolved_local_dependencies ()
+ && ! this->has_unresolved_local_dependencies ())
+ {
+ // Propagate the unresolved local dependency flag, and
+ // issue a debug scheduler warning.
+ this->has_unresolved_local_dependencies (1);
+ ACE_DEBUG ((LM_DEBUG,
+ "Warning: an operation identified by "
+ "\"%s\" has unresolved local dependencies.\n",
+ (const char*) this->rt_info ()->entry_point));
+
+ // Record entry point in list of unresolved local dependencies
+ ACE_OS::sprintf (string_buffer,
+ "// %s\n",
+ (const char*) this->rt_info ()->entry_point);
+ unresolved_locals +=
+ ACE_CString (string_buffer);
+ }
+
+ frame_size = ACE::minimum_frame_size (frame_size,
+ (*link)->caller ().effective_period_);
+ }
+ }
+
+ // Reframe dispatches in the set to the new frame size (expands the
+ // set's effective period to be the new enclosing frame).
+ if (reframe (dispatch_entries,
+ *this, dispatches_,
+ effective_period_,
+ frame_size) < 0)
+ return -1;
+
+ // A container and iterator for virtual dispatch sets over which the
+ // conjunction will operate
+ ACE_Ordered_MultiSet <Dispatch_Proxy_Iterator *> conj_set;
+ ACE_Ordered_MultiSet_Iterator <Dispatch_Proxy_Iterator *> conj_set_iter (conj_set);
+
+ // Iterate over the dependencies, and for each of the given call
+ // type, create a Dispatch_Proxy_Iterator for the caller's dispatch
+ // set, using the caller's period, the total frame size, and the
+ // number of calls: if any of the sets is empty, just return 0;
+ for (dep_iter.first ();
+ dep_iter.done () == 0;
+ dep_iter.advance ())
+ {
+ Task_Entry_Link **link;
+ if (dep_iter.next (link) == 0
+ || link == 0
+ || *link == 0)
+ return -1;
+
+ // The link matches the dependency type given.
+ if ((*link)->dependency_type () == dt)
+ {
+ Dispatch_Proxy_Iterator *proxy_ptr;
+ ACE_NEW_RETURN (proxy_ptr,
+ Dispatch_Proxy_Iterator ((*link)->caller ().dispatches_,
+ (*link)->caller ().effective_period_,
+ frame_size,
+ (*link)->number_of_calls ()),
+ -1);
+
+ // If there are no entries in the virtual set, we're done.
+ if (proxy_ptr->done ())
+ return 0;
+ else if (conj_set.insert (proxy_ptr, conj_set_iter) < 0)
+ return -1;
+ }
+ }
+
+ // loop, adding conjunctive dispatches, until one of the conjunctive
+ // dispatch sources runs out of entries over the total frame
+ conj_set_iter.first ();
+ int more_dispatches = (conj_set_iter.done ()) ? 0 : 1;
+ while (more_dispatches)
+ {
+ Time arrival = 0;
+ Time deadline = 0;
+ Preemption_Priority priority = 0;
+ OS_Priority OS_priority = 0;
+
+ for (conj_set_iter.first ();
+ conj_set_iter.done () == 0;
+ conj_set_iter.advance ())
+ {
+ // initialize to earliest arrival and deadline, and highest priority
+ arrival = 0;
+ deadline = 0;
+ priority = 0;
+ OS_priority = 0;
+
+ // Policy: conjunctively dispatched operations get the
+ // latest deadline of any of the dispatches in the
+ // conjunction at the time they were dispatched - when and
+ // if it is useful to change any of the merge policies, this
+ // should be one of the decisions factored out into the
+ // conjunctive merge strategy class.
+
+ // Policy: conjunctively dispatched operations get the
+ // lowest priority of any of the dispatches in the
+ // conjunction at the time they were dispatched - when and
+ // if it is useful to change any of the merge policies, this
+ // should be one of the decisions factored out into the
+ // conjunctive merge strategy class.
+
+ // Obtain a pointer to the current dispatch proxy iterator.
+ Dispatch_Proxy_Iterator **proxy_iter;
+ if (conj_set_iter.next (proxy_iter) == 0
+ || proxy_iter == 0
+ || *proxy_iter == 0)
+ return -1;
+
+ // Use latest arrival, latest deadline, lowest priority (0 is highest).
+ if (arrival <= (*proxy_iter)->arrival ())
+ arrival = (*proxy_iter)->arrival ();
+ if (deadline <= (*proxy_iter)->deadline ())
+ deadline = (*proxy_iter)->deadline ();
+ if (priority <= (*proxy_iter)->priority ())
+ {
+ priority = (*proxy_iter)->priority ();
+ OS_priority = (*proxy_iter)->OS_priority ();
+ }
+
+ (*proxy_iter)->advance ();
+
+ if ((*proxy_iter)->done ())
+ more_dispatches = 0;
+ }
+
+ Dispatch_Entry *entry_ptr;
+ ACE_NEW_RETURN (entry_ptr,
+ Dispatch_Entry (arrival,
+ deadline,
+ priority,
+ OS_priority,
+ *this),
+ -1);
+
+ // If even one new dispatch was inserted, result is "something
+ // happened".
+ result = 1;
+
+ // Add the new dispatch entry to the set of all dispatches, and
+ // a link to it to the dispatch links for this task entry.
+ if (dispatch_entries.insert (entry_ptr) < 0)
+ return -1;
+
+ // Use iterator for efficient insertion into the dispatch set.
+ ACE_Ordered_MultiSet_Iterator <Dispatch_Entry_Link> insert_iter (dispatches_);
+ if (dispatches_.insert (Dispatch_Entry_Link (*entry_ptr),
+ insert_iter) < 0)
+ return -1;
+
+ // TBD - Clients are not assigned priority, but rather obtain it
+ // from their call dependencies. We could complain here if
+ // there is a priority specified that doesn't match (or is lower
+ // QoS?)
+ }
+
+ return result;
+}
+
+// This static method is used to reframe an existing dispatch set to
+// the given new period multiplier, creating new instances of each
+// existing dispatch (with adjusted arrival and deadline) in each
+// successive sub-frame. Returns 1 if the set was reframed to a new
+// period, 0 if the set was not changed (the new period was not a
+// multiple of the old one), or -1 if an error occurred.
+
+int
+Task_Entry::reframe (ACE_Unbounded_Set <Dispatch_Entry *> &dispatch_entries,
+ Task_Entry &owner,
+ ACE_Ordered_MultiSet <Dispatch_Entry_Link> &set,
+ u_long &set_period, u_long new_period)
+{
+ int result = 0;
+
+ // if the set period is zero, treat it as uninitialized,
+ // and simply value the set period with the new period
+ if (set_period)
+ {
+ // make sure the new period is greater than the current
+ // set period, and that they are harmonically related
+ if (new_period <= set_period)
+ // return an error if they're not harmonically related,
+ // do nothing if set's frame is a multiple of the new frame
+ return (set_period % new_period) ? -1 : 0;
+ else if (new_period % set_period)
+ return -1;
+
+ // make a shallow copy of the set in a new ordered multiset
+ // using the Dispatch_Entry_Link smart pointers
+ ACE_Ordered_MultiSet <Dispatch_Entry_Link> new_set;
+ ACE_Ordered_MultiSet_Iterator <Dispatch_Entry_Link> new_iter (new_set);
+ ACE_Ordered_MultiSet_Iterator <Dispatch_Entry_Link> set_iter (set);
+
+ for (set_iter.first (); set_iter.done () == 0; set_iter.advance ())
+ {
+ Dispatch_Entry_Link *link;
+
+ if (set_iter.next (link) == 0)
+ return -1;
+ else if (new_set.insert (*link, new_iter) < 0)
+ return -1;
+ }
+
+ // Do a deep copy merge back into the set using the new period
+ // and starting after the 0th sub-frame: this puts all
+ // dispatches after the 0th sub-frame of the new period into the
+ // set, and leaves existing dispatches in the 0th sub-frame of
+ // the new period in the set as well.
+ result = merge_frames (dispatch_entries,
+ owner,
+ set,
+ new_set,
+ new_period,
+ set_period,
+ 1,
+ 1);
+ }
+
+ // update the set's period to be the new frame
+ set_period = new_period;
+
+ return result;
+}
+
+// This static method is used to merge an existing dispatch set,
+// multiplied by the given multipliers for the period and number of
+// instances in each period of each existing dispatch, into the given
+// "into" set, without affecting the "from set".
+
+int
+Task_Entry::merge_frames (ACE_Unbounded_Set <Dispatch_Entry *> &dispatch_entries,
+ Task_Entry &owner,
+ ACE_Ordered_MultiSet <Dispatch_Entry_Link> &dest,
+ ACE_Ordered_MultiSet <Dispatch_Entry_Link> &src,
+ u_long &dest_period,
+ u_long src_period,
+ u_long number_of_calls,
+ u_long starting_dest_sub_frame)
+{
+ int status = 0;
+
+ // reframe dispatches in the destination set to the new frame size
+ // (expands the destination set's period to be the new enclosing frame)
+ if (reframe (dispatch_entries,
+ owner,
+ dest,
+ dest_period,
+ ACE::minimum_frame_size (dest_period,
+ src_period)) < 0)
+ return -1;
+
+ // use iterator for efficient insertion into the destination set
+ ACE_Ordered_MultiSet_Iterator <Dispatch_Entry_Link> dest_iter (dest);
+
+ // do virtual iteration over the source set in the new frame, adding
+ // adjusted dispatch entries to the destination
+ Dispatch_Proxy_Iterator src_iter (src,
+ src_period,
+ dest_period,
+ number_of_calls,
+ starting_dest_sub_frame);
+
+ for (src_iter.first (starting_dest_sub_frame);
+ src_iter.done () == 0;
+ src_iter.advance ())
+ {
+ // Policy: disjunctively dispatched operations get their
+ // deadline and priority from the original dispatch - when and
+ // if it is useful to change any of the merge policies, this
+ // should be one of the decisions factored out into the
+ // disjunctive merge strategy class.
+
+ Dispatch_Entry *entry_ptr;
+ ACE_NEW_RETURN (entry_ptr,
+ Dispatch_Entry (src_iter.arrival (),
+ src_iter.deadline (),
+ src_iter.priority (),
+ src_iter.OS_priority (),
+ owner),
+ -1);
+
+ // if even one new dispatch was inserted, status is "something happened".
+ status = 1;
+
+ // add the new dispatch entry to the set of all dispatches, and
+ // a link to it to the dispatch links for this task entry
+ if (dispatch_entries.insert (entry_ptr) < 0)
+ return -1;
+
+ else if (dest.insert (Dispatch_Entry_Link (*entry_ptr), dest_iter) < 0)
+ return -1;
+
+ // TBD - Clients are not assigned priority, but rather obtain it
+ // from their call dependencies. We could complain here if
+ // there is a priority specified that doesn't match (or is lower
+ // QoS?)
+ }
+
+ return status;
+}
+
+Task_Entry_Link::Task_Entry_Link (Task_Entry &caller,
+ Task_Entry &called,
+ CORBA::Long number_of_calls,
+ RtecScheduler::Dependency_Type_t dependency_type)
+ : number_of_calls_ (number_of_calls),
+ caller_ (caller),
+ called_ (called),
+ dependency_type_ (dependency_type)
+{
+}
+
+Dispatch_Entry::Dispatch_Id Dispatch_Entry::next_id_ = 0;
+
+Dispatch_Entry::Dispatch_Entry (Time arrival,
+ Time deadline,
+ Preemption_Priority priority,
+ OS_Priority os_priority,
+ Task_Entry &task_entry,
+ Dispatch_Entry *original_dispatch)
+ : priority_ (priority),
+ OS_priority_ (os_priority),
+ dynamic_subpriority_ (0),
+ static_subpriority_ (0),
+ arrival_ (arrival),
+ deadline_ (deadline),
+ task_entry_ (task_entry),
+ original_dispatch_ (original_dispatch)
+{
+ // obtain, increment the next id
+ dispatch_id_ = next_id_++;
+}
+
+Dispatch_Entry::Dispatch_Entry (const Dispatch_Entry &d)
+ : priority_ (d.priority_),
+ OS_priority_ (d.OS_priority_),
+ dynamic_subpriority_ (d.dynamic_subpriority_),
+ static_subpriority_ (d.static_subpriority_),
+ arrival_ (d.arrival_),
+ deadline_ (d.deadline_),
+ task_entry_ (d.task_entry_),
+ original_dispatch_ (d.original_dispatch_)
+{
+ // obtain, increment the next id
+ dispatch_id_ = next_id_++;
+}
+
+bool
+Dispatch_Entry::operator < (const Dispatch_Entry &d) const
+{
+ // for positioning in the ordered dispatch multiset
+
+ // lowest arrival time first
+ if (this->arrival_ != d.arrival_)
+ return this->arrival_ < d.arrival_ ? true : false;
+
+ // highest priority second
+ if (this->priority_ != d.priority_)
+ return this->priority_ > d.priority_ ? true : false;
+
+ // lowest laxity (highest dynamic sub-priority) third Just use low
+ // 32 bits of worst_case_execution_time. This will have to change
+ // when TimeBase.idl is finalized.
+ //
+ // NOTE: Leave the -= code intact as it's a workaround of a BCB4
+ // internal compiler error.
+ Time this_laxity = deadline_;
+ this_laxity -= task_entry ().rt_info ()->worst_case_execution_time;
+
+ Time that_laxity = d.deadline_;
+ that_laxity -= d.task_entry ().rt_info ()->worst_case_execution_time;
+
+ if (this_laxity != that_laxity)
+ return (this_laxity < that_laxity) ? true : false;
+
+ // finally, by higher importance
+ return (task_entry ().rt_info ()->importance >
+ d.task_entry ().rt_info ()->importance) ? true : false;
+}
+
+// ctor
+
+Dispatch_Entry_Link::Dispatch_Entry_Link (Dispatch_Entry &d)
+ : dispatch_entry_ (d)
+{
+}
+
+// copy ctor
+
+Dispatch_Entry_Link::Dispatch_Entry_Link (const Dispatch_Entry_Link &d)
+ : dispatch_entry_ (d.dispatch_entry_)
+{
+}
+
+// ctor
+
+Dispatch_Proxy_Iterator::Dispatch_Proxy_Iterator
+ (ACE_Ordered_MultiSet <Dispatch_Entry_Link> &set,
+ u_long actual_frame_size,
+ u_long virtual_frame_size,
+ u_long number_of_calls,
+ u_long starting_sub_frame)
+ : number_of_calls_ (number_of_calls),
+ current_call_ (0),
+ actual_frame_size_ (actual_frame_size),
+ virtual_frame_size_ (virtual_frame_size),
+ current_frame_offset_ (actual_frame_size * starting_sub_frame),
+ iter_ (set)
+{
+ first (starting_sub_frame);
+}
+
+// positions the iterator at the first entry of the passed sub-frame,
+// returns 1 if it could position the iterator correctly, 0 if not,
+// and -1 if an error occurred.
+
+int
+Dispatch_Proxy_Iterator::first (u_int sub_frame)
+{
+ if (actual_frame_size_ * (sub_frame) >= virtual_frame_size_)
+ {
+ // can not position the virtual iterator
+ // in the given range: do nothing
+ return 0;
+ }
+
+ // restart the call counter
+ current_call_ = 0;
+
+ // use the given sub-frame offset if it's valid
+ current_frame_offset_ = actual_frame_size_ * sub_frame;
+
+ // restart the iterator
+ return iter_.first ();
+}
+
+// positions the iterator at the last entry of the total frame,
+// returns 1 if it could position the iterator correctly, 0 if not,
+// and -1 if an error occurred.
+
+int
+Dispatch_Proxy_Iterator::last (void)
+{
+ // use the last call
+ current_call_ = number_of_calls_ - 1;
+
+ // use the last sub-frame
+ current_frame_offset_ = virtual_frame_size_ - actual_frame_size_;
+
+ // position the iterator at the last dispatch
+ return iter_.first ();
+}
+
+// positions the iterator at the next entry of the total frame,
+// returns 1 if it could position the iterator correctly, 0 if not,
+// and -1 if an error occurred.
+
+int
+Dispatch_Proxy_Iterator::advance (void)
+{
+ int result = 1;
+
+ if (iter_.done ())
+ result = 0; // cannot retreat if we're out of bounds
+ else if (current_call_ < number_of_calls_ - 1)
+ // if we're still in the same set of calls, increment the call counter
+ ++current_call_;
+ else
+ {
+ // roll over the call counter
+ current_call_ = 0;
+
+ // advance the iterator in the current sub-frame
+ if (! iter_.advance ())
+ {
+ // if we're not already in the last sub_frame
+ if (current_frame_offset_ + actual_frame_size_ < virtual_frame_size_)
+ {
+ // increment the sub-frame offset
+ current_frame_offset_ += actual_frame_size_;
+
+ // restart the iterator at the front of the sub-frame
+ result = iter_.first ();
+ }
+ else
+ result = 0; // cannot advance if we're already at the end
+ }
+ }
+
+ return result;
+}
+
+// positions the iterator at the previous entry of the total frame,
+// returns 1 if it could position the iterator correctly, 0 if not,
+// and -1 if an error occurred.
+
+int
+Dispatch_Proxy_Iterator::retreat (void)
+{
+ int result = 1;
+
+ if (iter_.done ())
+ result = 0; // cannot retreat if we're out of bounds
+ else if (current_call_ > 0)
+ // if we're still in the same set of calls, decrement the call counter
+ --current_call_;
+ else
+ {
+ // roll over the call counter
+ current_call_ = number_of_calls_ - 1;
+
+ // back up the iterator in the current sub-frame
+ if (!iter_.retreat ())
+ {
+ // if we're not already in the 0th sub_frame
+ if (current_frame_offset_ > 0)
+ {
+ // decrement the sub-frame offset
+ current_frame_offset_ -= actual_frame_size_;
+
+ // restart the iterator at the tail of the sub-frame
+ result = iter_.last ();
+ }
+ else
+ result = 0; // cannot retreat if we're already at the start
+ }
+ }
+
+ return result;
+}
+
+// returns the adjusted arrival time of the virtual entry
+
+RtecScheduler::Time
+Dispatch_Proxy_Iterator::arrival (void) const
+{
+ Dispatch_Entry_Link *link;
+ if (iter_.done ()
+ || iter_.next(link) == 0
+ || link == 0)
+ return 0;
+
+ // Just use low 32 bits of arrival. This will have to change when
+ // TimeBase.idl is finalized.
+ return link->dispatch_entry ().arrival () +
+ RtecScheduler::Time (current_frame_offset_);
+}
+
+// returns the adjusted deadline time of the virtual entry
+
+RtecScheduler::Time
+Dispatch_Proxy_Iterator::deadline (void) const
+{
+ Dispatch_Entry_Link *link;
+ if (iter_.done ()
+ || iter_.next(link) == 0
+ || link == 0)
+ return 0;
+
+ // Just use low 32 bits of deadline. This will have to change when
+ // TimeBase.idl is finalized.
+ return link->dispatch_entry ().deadline () +
+ RtecScheduler::Time (current_frame_offset_);
+}
+
+// returns the scheduler priority of the virtual entry
+
+Dispatch_Proxy_Iterator::Preemption_Priority
+Dispatch_Proxy_Iterator::priority (void) const
+{
+ Dispatch_Entry_Link *link;
+
+ if (iter_.done ()
+ || iter_.next(link) == 0
+ || link == 0)
+ return 0;
+
+ return link->dispatch_entry ().priority ();
+}
+
+// returns the OS priority of the virtual entry
+
+Dispatch_Proxy_Iterator::OS_Priority
+Dispatch_Proxy_Iterator::OS_priority (void) const
+{
+ Dispatch_Entry_Link *link;
+ if (iter_.done ()
+ || iter_.next(link) == 0
+ || link == 0)
+ return 0;
+
+ return link->dispatch_entry ().OS_priority ();
+}
+
+// time slice constructor
+
+TimeLine_Entry::TimeLine_Entry (Dispatch_Entry &dispatch_entry,
+ Time start, Time stop,
+ Time arrival, Time deadline,
+ TimeLine_Entry *next,
+ TimeLine_Entry *prev)
+ : dispatch_entry_ (dispatch_entry),
+ start_ (start),
+ stop_ (stop),
+ arrival_ (arrival),
+ deadline_ (deadline),
+ next_ (next),
+ prev_ (prev)
+{
+}
+
+TAO_END_VERSIONED_NAMESPACE_DECL
diff --git a/TAO/orbsvcs/orbsvcs/Sched/SchedEntry.h b/TAO/orbsvcs/orbsvcs/Sched/SchedEntry.h
new file mode 100644
index 00000000000..e84ceb6cad3
--- /dev/null
+++ b/TAO/orbsvcs/orbsvcs/Sched/SchedEntry.h
@@ -0,0 +1,648 @@
+// -*- C++ -*-
+
+// $Id$
+//
+// ============================================================================
+//
+// = LIBRARY
+// sched
+//
+// = FILENAME
+// SchedEntry.h
+//
+// = CREATION DATE
+// 7 February 1998
+//
+// = AUTHOR
+// Chris Gill <cdgill@cs.wustl.edu>
+//
+// ============================================================================
+
+#ifndef SCHEDENTRY_H
+#define SCHEDENTRY_H
+#include /**/ "ace/pre.h"
+
+#include "orbsvcs/Sched/sched_export.h"
+#include "orbsvcs/RtecSchedulerC.h"
+#include "orbsvcs/Event_Service_Constants.h"
+#include "ace/Containers.h"
+
+TAO_BEGIN_VERSIONED_NAMESPACE_DECL
+
+//////////////////////
+// Helper Functions //
+//////////////////////
+
+
+// Forward declaration of classes.
+class Task_Entry;
+class Task_Entry_Link;
+class Dispatch_Entry;
+class Dispatch_Entry_Link;
+class Dispatch_Proxy_Iterator;
+
+
+class TAO_RTSched_Export Dispatch_Entry_Link
+// = TITLE
+// Dispatch Entry Link
+//
+// = DESCRIPTION
+// Light-weight sortable "smart pointer" to a dispatch entry.
+//
+{
+public:
+
+ typedef RtecScheduler::handle_t handle_t;
+ typedef RtecScheduler::Dependency_Info Dependency_Info;
+ typedef RtecScheduler::Preemption_Priority_t Preemption_Priority;
+ typedef RtecScheduler::OS_Priority OS_Priority;
+ typedef RtecScheduler::Preemption_Subpriority_t Sub_Priority;
+ typedef RtecScheduler::RT_Info RT_Info;
+ typedef RtecScheduler::Time Time;
+ typedef RtecScheduler::Period_t Period;
+ typedef RtecScheduler::Info_Type_t Info_Type;
+ typedef RtecScheduler::Dependency_Type_t Dependency_Type;
+
+ Dispatch_Entry_Link (Dispatch_Entry &d);
+ // Constructor.
+
+ Dispatch_Entry_Link (const Dispatch_Entry_Link &d);
+ // Copy constructor.
+
+ ~Dispatch_Entry_Link ();
+ // Destructor.
+
+ bool operator < (const Dispatch_Entry_Link &d) const;
+ // Less than comparison operator.
+
+ Dispatch_Entry &dispatch_entry () const;
+ // Accessor for reference to the dispatch entry.
+
+private:
+
+ Dispatch_Entry &dispatch_entry_;
+ // Dispatch entry to which the smart pointer refers.
+};
+
+
+
+class TAO_RTSched_Export Task_Entry
+// = TITLE
+// Task Entry.
+//
+// = DESCRIPTION
+// Wrapper for the RT_Info, which aggregates all its dispatches.
+//
+{
+public:
+
+ typedef RtecScheduler::handle_t handle_t;
+ typedef RtecScheduler::Dependency_Info Dependency_Info;
+ typedef RtecScheduler::Preemption_Priority_t Preemption_Priority;
+ typedef RtecScheduler::OS_Priority OS_Priority;
+ typedef RtecScheduler::Preemption_Subpriority_t Sub_Priority;
+ typedef RtecScheduler::RT_Info RT_Info;
+ typedef RtecScheduler::Time Time;
+ typedef RtecScheduler::Period_t Period;
+ typedef RtecScheduler::Info_Type_t Info_Type;
+ typedef RtecScheduler::Dependency_Type_t Dependency_Type;
+
+ // Info for DFS traversal, topological sort of call graph.
+ enum DFS_Status {NOT_VISITED, VISITED, FINISHED};
+
+ // Status of merging dispatches.
+ enum Propagation_Status {SUCCEEDED,
+ TWO_WAY_DISJUNCTION,
+ TWO_WAY_CONJUNCTION,
+ INTERNAL_ERROR,
+ UNRECOGNIZED_INFO_TYPE};
+
+ // Constructor.
+ Task_Entry ();
+
+ // Destructor.
+ ~Task_Entry ();
+
+ // Merges dispatches according to info type, update
+ // relevant scheduling characteristics for this entry.
+ // Returns 0 if all is well, or -1 if an error occurred.
+ Propagation_Status merge_dispatches (
+ ACE_Unbounded_Set <Dispatch_Entry *> &dispatch_entries,
+ ACE_CString & unresolved_locals,
+ ACE_CString & unresolved_remotes);
+
+ // Gets the pointer to the underlying RT_Info.
+ RT_Info *rt_info () const;
+
+ // Sets the pointer to the underlying RT_Info.
+ void rt_info (RT_Info *info);
+
+ // Gets the effective period for the task entry.
+ Period effective_period () const;
+
+ // Sets the effective period for the task entry.
+ void effective_period (Period p);
+
+ // Sets when the node was discovered in DFS traversal.
+ void discovered (long l);
+
+ // Gets when the node was discovered in DFS traversal.
+ long discovered () const;
+
+ // Sets when the node was finished in DFS traversal.
+ void finished (long l);
+
+ // Gets when the node was finished in DFS traversal.
+ long finished () const;
+
+ // Sets DFS traversal status of the node.
+ void dfs_status (DFS_Status ds);
+
+ // Gets DFS traversal status of the node.
+ DFS_Status dfs_status () const;
+
+ // Sets a flag indicating whether node is a thread delineator.
+ void is_thread_delineator (int i);
+
+ // Gets the flag indicating whether node is a thread delineator.
+ int is_thread_delineator () const;
+
+ // Sets a flag indicating whether node has unresolved remote dependencies.
+ void has_unresolved_remote_dependencies (int i);
+
+ // Gets the flag indicating whether node has unresolved remote dependencies.
+ int has_unresolved_remote_dependencies () const;
+
+ // Sets a flag indicating whether node has unresolved local dependencies.
+ void has_unresolved_local_dependencies (int i);
+
+ // Gets the flag indicating whether node has unresolved local dependencies.
+ int has_unresolved_local_dependencies () const;
+
+ // Gets the set of links to Task Entries which this entry calls.
+ ACE_Unbounded_Set <Task_Entry_Link *> & calls ();
+
+ // Gets the set of links to Task Entries which call this entry.
+ ACE_Unbounded_Set <Task_Entry_Link *> & callers ();
+
+ // Gets the set of arrivals in the effective period.
+ ACE_Ordered_MultiSet<Dispatch_Entry_Link> &dispatches ();
+
+ // Gets the type of RT_Info the entry wraps.
+ Info_Type info_type () const;
+
+ // Gets the effective execution time for the task entry.
+ u_long effective_execution_time () const;
+
+private:
+
+ // Prohibits calls of the given type: currently used to enforce
+ // the notion that two-way calls to disjunctive or conjunctive
+ // RT_Infos do not have any defined meaning, and thus should be
+ // considered dependency specification errors: if these constraints
+ // are removed in the future, this method should be removed as well.
+ // Returns 0 if all is well, or -1 if an error has occurred.
+ int prohibit_dispatches (Dependency_Type dt);
+
+ // Performs a disjunctive merge of arrival times of calls of the given
+ // type: all arrival times of all callers of that type are duplicated by
+ // the multiplier and repetition over the new frame size and merged.
+ // Returns 0 if all is well, or -1 if an error has occurred.
+ int disjunctive_merge (
+ Dependency_Type dt,
+ ACE_Unbounded_Set <Dispatch_Entry *> &dispatch_entries,
+ ACE_CString & unresolved_locals,
+ ACE_CString & unresolved_remotes);
+
+ // Performs a conjunctive merge of arrival times of calls of the given
+ // type: all arrival times of all callers of that type are duplicated
+ // by the multiplier and repetition over the new frame size and then
+ // iteratively merged by choosing the maximal arrival time at
+ // the current position in each queue (iteration is in lockstep
+ // over all queues, and ends when any queue ends). Returns 0 if
+ // all is well, or -1 if an error has occurred.
+ int conjunctive_merge (
+ Dependency_Type dt,
+ ACE_Unbounded_Set <Dispatch_Entry *> &dispatch_entries,
+ ACE_CString & unresolved_locals,
+ ACE_CString & unresolved_remotes);
+
+ // This static method is used to reframe an existing dispatch set
+ // to the given new period multiplier, creating new instances of
+ // each existing dispatch (with adjusted arrival and deadline)
+ // in each successive sub-frame. Returns 1 if the set was reframed
+ // to a new period, 0 if the set was not changed (the new period
+ // was not a multiple of the old one), or -1 if an error occurred.
+ static int reframe (ACE_Unbounded_Set <Dispatch_Entry *> &dispatch_entries,
+ Task_Entry &owner,
+ ACE_Ordered_MultiSet <Dispatch_Entry_Link> &set,
+ u_long &set_period, u_long new_period);
+
+ // This static method is used to merge an existing dispatch set,
+ // multiplied by the given multipliers for the period and number of
+ // instances in each period of each existing dispatch, into the
+ // given "into" set, without affecting the "from set". Returns 1 if
+ // the source set was correctly merged into the destination set,
+ // 0 if nothing happened, and -1 if an error occurred.
+ static int merge_frames (ACE_Unbounded_Set <Dispatch_Entry *> &dispatch_entries,
+ Task_Entry &owner,
+ ACE_Ordered_MultiSet <Dispatch_Entry_Link> &dest,
+ ACE_Ordered_MultiSet <Dispatch_Entry_Link> &src,
+ u_long &dest_period,
+ u_long src_period,
+ u_long number_of_calls = 1,
+ u_long starting_dest_sub_frame = 0);
+
+ // A pointer to the underlying RT_Info.
+ RT_Info *rt_info_;
+
+ // The effective period for the task entry.
+ u_long effective_period_;
+
+ // The set of arrivals in the entry's effective period.
+ ACE_Ordered_MultiSet<Dispatch_Entry_Link> dispatches_;
+
+ // Depth-first-search status of the entry.
+ DFS_Status dfs_status_;
+
+ // Depth-first-search discovery order of the entry.
+ long discovered_;
+
+ // Depth-first-search completion order of the entry.
+ long finished_;
+
+ // Flag identifying threads in the call graph.
+ int is_thread_delineator_;
+
+ // Flag indicating whether or not there are unresolved remote
+ // dependencies in the entry's dependency call chain.
+ int has_unresolved_remote_dependencies_;
+
+ // Flag indicating whether or not there are unresolved local
+ // dependencies in the entry's dependency call chain.
+ int has_unresolved_local_dependencies_;
+
+ // Set of links to Task Entries which this entry calls.
+ ACE_Unbounded_Set <Task_Entry_Link *> calls_;
+
+ // Set of links to Task Entries which call this entry.
+ ACE_Unbounded_Set <Task_Entry_Link *> callers_;
+
+};
+
+
+// Wrapper for dependencies between RT_Infos
+class TAO_RTSched_Export Task_Entry_Link
+{
+public:
+
+ typedef RtecScheduler::handle_t handle_t;
+ typedef RtecScheduler::Dependency_Info Dependency_Info;
+ typedef RtecScheduler::Preemption_Priority_t Preemption_Priority;
+ typedef RtecScheduler::OS_Priority OS_Priority;
+ typedef RtecScheduler::Preemption_Subpriority_t Sub_Priority;
+ typedef RtecScheduler::RT_Info RT_Info;
+ typedef RtecScheduler::Time Time;
+ typedef RtecScheduler::Period_t Period;
+ typedef RtecScheduler::Info_Type_t Info_Type;
+ typedef RtecScheduler::Dependency_Type_t Dependency_Type;
+
+ // ctor
+ Task_Entry_Link (Task_Entry &caller,
+ Task_Entry &called,
+ CORBA::Long number_of_calls,
+ Dependency_Type dependency_type);
+
+ // accessor: number of calls
+ CORBA::Long number_of_calls () const;
+
+ // accessor: dependency type
+ Dependency_Type dependency_type () const;
+
+ // accessor: calling task entry
+ Task_Entry &caller () const;
+
+ // accessor: called task entry
+ Task_Entry &called () const;
+
+private:
+
+ // the number of calls of the operation
+ CORBA::Long number_of_calls_;
+
+ // the calling operation
+ Task_Entry &caller_;
+
+ // the called operation
+ Task_Entry &called_;
+
+ // the type of call dependency
+ Dependency_Type dependency_type_;
+};
+
+
+class TAO_RTSched_Export Dispatch_Entry
+{
+// = TITLE
+// Dispatch Entry
+//
+// = DESCRIPTION
+// Descriptor object for a single dispatch of an operation.
+//
+public:
+
+ typedef RtecScheduler::handle_t handle_t;
+ typedef RtecScheduler::Dependency_Info Dependency_Info;
+ typedef RtecScheduler::Preemption_Priority_t Preemption_Priority;
+ typedef RtecScheduler::OS_Priority OS_Priority;
+ typedef RtecScheduler::Preemption_Subpriority_t Sub_Priority;
+ typedef RtecScheduler::RT_Info RT_Info;
+ typedef RtecScheduler::Time Time;
+ typedef RtecScheduler::Period_t Period;
+ typedef RtecScheduler::Info_Type_t Info_Type;
+ typedef RtecScheduler::Dependency_Type_t Dependency_Type;
+
+ typedef u_long Dispatch_Id;
+
+ // ctor
+ Dispatch_Entry (Time arrival,
+ Time deadline,
+ Preemption_Priority priority,
+ OS_Priority os_priority,
+ Task_Entry &task_entry,
+ Dispatch_Entry *original_dispatch = 0);
+
+ // copy ctor
+ Dispatch_Entry (const Dispatch_Entry &d);
+
+ // id accessor
+ Dispatch_Id dispatch_id () const;
+
+ // arrival accessor
+ Time arrival () const;
+
+ // deadline accessor
+ Time deadline () const;
+
+ // scheduler priority accessor and mutator
+ Preemption_Priority priority () const;
+ void priority (Preemption_Priority p);
+
+ // scheduler priority accessor and mutator
+ OS_Priority OS_priority () const;
+ void OS_priority (OS_Priority p);
+
+ // dynamic subpriority accessor and mutator
+ Sub_Priority dynamic_subpriority () const;
+ void dynamic_subpriority (Sub_Priority p);
+
+ // static subpriority accessor and mutator
+ Sub_Priority static_subpriority () const;
+ void static_subpriority (Sub_Priority p);
+
+ // task entry accessor
+ Task_Entry &task_entry () const;
+
+ // LT comparator
+ // TBD - make this a global comparison operator
+ // instead of a class member function
+ bool operator < (const Dispatch_Entry &d) const;
+
+ // accessor for pointer to original dispatch
+ Dispatch_Entry *original_dispatch ();
+
+private:
+ // TBD - add reference counting to Dispatch Entry class,
+ // make the link a friend, up/down count as links come and go,
+ // and call entry dtor when ref count drops to 0
+
+ // stores the next dispatch entry id to be used
+ static Dispatch_Id next_id_;
+
+ // the id of the current dispatch entry
+ Dispatch_Id dispatch_id_;
+
+ // scheduler priority of the current dispatch entry
+ Preemption_Priority priority_;
+
+ // OS priority of the current dispatch entry
+ OS_Priority OS_priority_;
+
+ // scheduler dynamic subpriority of the current dispatch entry
+ Sub_Priority dynamic_subpriority_;
+
+ // scheduler static subpriority of the current dispatch entry
+ Sub_Priority static_subpriority_;
+
+ // the arrival time of the current dispatch entry
+ Time arrival_;
+
+ // the deadline of the current dispatch entry
+ Time deadline_;
+
+ // stores the id of the related task entry
+ Task_Entry &task_entry_;
+
+ // stores a pointer to the original dispatch entry if this
+ // is a dispatch generated by expanding the original frame
+ Dispatch_Entry *original_dispatch_;
+
+};
+
+class TAO_RTSched_Export Dispatch_Proxy_Iterator
+// = TITLE
+// This class implements an iterator abstraction over a virtual
+// frame size and number of calls, using an actual ordered
+// multiset of dispatch entries over an actual frame size.
+// It also serves as a proxy for the virtual dispatch to which
+// it refers. Rhetorical question: is it possible to separate
+// the iterator and proxy abstractions here without defeating the
+// purpose of the design, which is to avoid constructing
+// superfluous dispatch entries (per the conjunctive merge use case) ?
+{
+public:
+
+ typedef RtecScheduler::handle_t handle_t;
+ typedef RtecScheduler::Dependency_Info Dependency_Info;
+ typedef RtecScheduler::Preemption_Priority_t Preemption_Priority;
+ typedef RtecScheduler::OS_Priority OS_Priority;
+ typedef RtecScheduler::Preemption_Subpriority_t Sub_Priority;
+ typedef RtecScheduler::RT_Info RT_Info;
+ typedef RtecScheduler::Time Time;
+ typedef RtecScheduler::Period_t Period;
+ typedef RtecScheduler::Info_Type_t Info_Type;
+ typedef RtecScheduler::Dependency_Type_t Dependency_Type;
+
+ Dispatch_Proxy_Iterator (ACE_Ordered_MultiSet <Dispatch_Entry_Link> &set,
+ u_long actual_frame_size,
+ u_long virtual_frame_size,
+ u_long number_of_calls_ = 1,
+ u_long starting_sub_frame = 0);
+ // ctor
+
+ ////////////////////////
+ // iterator interface //
+ ////////////////////////
+
+ int done () const;
+ // returns 0 if there are more entries to see, 1 if not
+
+ int first (u_int sub_frame = 0);
+ // positions the iterator at the first entry of the passed
+ // sub-frame, returns 1 if it could position the iterator
+ // correctly, 0 if not, and -1 if an error occurred.
+
+ int last ();
+ // positions the iterator at the last entry of the total
+ // frame, returns 1 if it could position the iterator
+ // correctly, 0 if not, and -1 if an error occurred.
+
+ int advance ();
+ // positions the iterator at the next entry of the total
+ // frame, returns 1 if it could position the iterator
+ // correctly, 0 if not, and -1 if an error occurred.
+
+ int retreat ();
+ // positions the iterator at the previous entry of the total
+ // frame, returns 1 if it could position the iterator
+ // correctly, 0 if not, and -1 if an error occurred.
+
+ /////////////////////
+ // proxy interface //
+ /////////////////////
+
+ Time arrival () const;
+ // returns the adjusted arrival time of the virtual entry
+
+ Time deadline () const;
+ // returns the adjusted deadline time of the virtual entry
+
+ Preemption_Priority priority () const;
+ // returns the scheduler priority of the virtual entry
+
+ OS_Priority OS_priority () const;
+ // returns the OS priority of the virtual entry
+
+
+private:
+
+ u_long number_of_calls_;
+ // the number of calls corresponding to each actual dispatch
+
+ u_long current_call_;
+ // the current call number for this dispatch (zero based)
+
+ u_long actual_frame_size_;
+ // the frame size of the actual dispatches
+
+ u_long virtual_frame_size_;
+ // the virtaul frame size over which to iterate
+
+ u_long current_frame_offset_;
+ // the current offset into the virtual frame
+ // (should be a multiple of the actual frame size)
+
+ ACE_Ordered_MultiSet_Iterator <Dispatch_Entry_Link> iter_;
+};
+
+
+
+class TAO_RTSched_Export TimeLine_Entry
+{
+public:
+
+ typedef RtecScheduler::handle_t handle_t;
+ typedef RtecScheduler::Dependency_Info Dependency_Info;
+ typedef RtecScheduler::Preemption_Priority_t Preemption_Priority;
+ typedef RtecScheduler::OS_Priority OS_Priority;
+ typedef RtecScheduler::Preemption_Subpriority_t Sub_Priority;
+ typedef RtecScheduler::RT_Info RT_Info;
+ typedef RtecScheduler::Time Time;
+ typedef RtecScheduler::Period_t Period;
+ typedef RtecScheduler::Info_Type_t Info_Type;
+ typedef RtecScheduler::Dependency_Type_t Dependency_Type;
+
+ // time slice constructor
+ TimeLine_Entry (Dispatch_Entry &dispatch_entry,
+ Time start,
+ Time stop,
+ Time arrival,
+ Time deadline,
+ TimeLine_Entry *next = 0,
+ TimeLine_Entry *prev = 0);
+
+ // dispatch entry accessor
+ Dispatch_Entry &dispatch_entry () const;
+
+ // accessors for time slice start and stop times (100 nanoseconds)
+ Time start () const;
+ Time stop () const;
+ Time arrival () const;
+ Time deadline () const;
+
+ // accessor and mutator for next and prev slices for this dispatch
+ TimeLine_Entry *next (void) const;
+ void next (TimeLine_Entry *);
+ TimeLine_Entry *prev (void) const;
+ void prev (TimeLine_Entry *);
+
+ bool operator < (const TimeLine_Entry&) const;
+
+private:
+
+ // the dispatch entry to which the time slice corresponds
+ Dispatch_Entry &dispatch_entry_;
+
+ // priority time slice times (100 nanoseconds)
+ Time start_;
+ Time stop_;
+ Time arrival_;
+ Time deadline_;
+
+ // next and previous priority time slices for this dispatch entry
+ TimeLine_Entry *next_;
+ TimeLine_Entry *prev_;
+
+};
+
+class TAO_RTSched_Export TimeLine_Entry_Link
+{
+public:
+
+ typedef RtecScheduler::handle_t handle_t;
+ typedef RtecScheduler::Dependency_Info Dependency_Info;
+ typedef RtecScheduler::Preemption_Priority_t Preemption_Priority;
+ typedef RtecScheduler::OS_Priority OS_Priority;
+ typedef RtecScheduler::Preemption_Subpriority_t Sub_Priority;
+ typedef RtecScheduler::RT_Info RT_Info;
+ typedef RtecScheduler::Time Time;
+ typedef RtecScheduler::Period_t Period;
+ typedef RtecScheduler::Info_Type_t Info_Type;
+ typedef RtecScheduler::Dependency_Type_t Dependency_Type;
+
+ TimeLine_Entry_Link (TimeLine_Entry &t);
+ // ctor
+
+ TimeLine_Entry &entry () const;
+ // accessor for the underlying entry
+
+ bool operator < (const TimeLine_Entry_Link&) const;
+ // comparison operator
+
+private:
+
+ TimeLine_Entry &entry_;
+ // the underlying entry
+
+};
+
+TAO_END_VERSIONED_NAMESPACE_DECL
+
+#if defined (__ACE_INLINE__)
+#include "orbsvcs/Sched/SchedEntry.i"
+#endif /* __ACE_INLINE__ */
+
+#include /**/ "ace/post.h"
+#endif /* SCHEDENTRY_H */
+
+// EOF
diff --git a/TAO/orbsvcs/orbsvcs/Sched/SchedEntry.i b/TAO/orbsvcs/orbsvcs/Sched/SchedEntry.i
new file mode 100644
index 00000000000..13f00111d67
--- /dev/null
+++ b/TAO/orbsvcs/orbsvcs/Sched/SchedEntry.i
@@ -0,0 +1,447 @@
+// -*- C++ -*-
+
+// $Id$
+//
+// ============================================================================
+//
+// = LIBRARY
+// sched
+//
+// = FILENAME
+// SchedEntry.i
+//
+// = CREATION DATE
+// 7 February 1998
+//
+// = AUTHOR
+// Chris Gill
+//
+// ============================================================================
+
+TAO_BEGIN_VERSIONED_NAMESPACE_DECL
+
+//////////////////////
+// Class Task_Entry //
+//////////////////////
+
+// return a pointer to the underlying RT_Info
+ACE_INLINE Task_Entry::RT_Info *
+Task_Entry::rt_info () const
+{
+ return rt_info_;
+}
+
+// set the underlying RT_Info pointer
+ACE_INLINE void
+Task_Entry::rt_info (Task_Entry::RT_Info *info)
+{
+ rt_info_ = info;
+}
+
+// get effective period for the task entry
+ACE_INLINE Task_Entry::Period
+Task_Entry::effective_period () const
+{
+ return effective_period_;
+}
+
+// set effective period for the task entry
+ACE_INLINE void
+Task_Entry::effective_period (Task_Entry::Period p)
+{
+ effective_period_ = p;
+}
+
+ACE_INLINE void
+Task_Entry::discovered (long l)
+{
+ discovered_ = l;
+ dfs_status_ = VISITED;
+}
+
+ACE_INLINE long
+Task_Entry::discovered () const
+{
+ return discovered_;
+}
+
+ACE_INLINE void
+Task_Entry::finished (long l)
+{
+ finished_ = l;
+ dfs_status_ = FINISHED;
+}
+
+ACE_INLINE long
+Task_Entry::finished () const
+{
+ return finished_;
+}
+
+ACE_INLINE Task_Entry::DFS_Status
+Task_Entry::dfs_status () const
+{
+ return dfs_status_;
+}
+
+ACE_INLINE void
+Task_Entry::dfs_status (Task_Entry::DFS_Status ds)
+{
+ dfs_status_ = ds;
+}
+
+// Sets a flag indicating whether node is a thread delineator.
+
+ACE_INLINE void
+Task_Entry::is_thread_delineator (int i)
+{
+ is_thread_delineator_ = i;
+}
+
+// Gets the flag indicating whether node is a thread delineator.
+
+ACE_INLINE int
+Task_Entry::is_thread_delineator () const
+{
+ return is_thread_delineator_;
+}
+
+// Sets a flag indicating whether node has unresolved remote dependencies.
+
+ACE_INLINE void
+Task_Entry::has_unresolved_remote_dependencies (int i)
+{
+ has_unresolved_remote_dependencies_ = i;
+}
+
+// Gets the flag indicating whether node has unresolved remote dependencies.
+
+ACE_INLINE int
+Task_Entry::has_unresolved_remote_dependencies () const
+{
+ return has_unresolved_remote_dependencies_;
+}
+
+
+// Sets a flag indicating whether node has unresolved local dependencies.
+
+ACE_INLINE void
+Task_Entry::has_unresolved_local_dependencies (int i)
+{
+ has_unresolved_local_dependencies_ = i;
+}
+
+// Gets the flag indicating whether node has unresolved local dependencies.
+
+ACE_INLINE int
+Task_Entry::has_unresolved_local_dependencies () const
+{
+ return has_unresolved_local_dependencies_;
+}
+
+// Gets the set of Task Entries on which this entry depends.
+
+ACE_INLINE ACE_Unbounded_Set <Task_Entry_Link *> &
+Task_Entry::calls ()
+{
+ return calls_;
+}
+
+// Gets the set of Task Entries which depend on this entry.
+
+ACE_INLINE ACE_Unbounded_Set <Task_Entry_Link *> &
+Task_Entry::callers ()
+{
+ return callers_;
+}
+
+// Gets set of arrivals in the entry's effective period.
+
+ACE_INLINE ACE_Ordered_MultiSet<Dispatch_Entry_Link> &
+Task_Entry::dispatches ()
+{
+ return dispatches_;
+}
+
+
+ACE_INLINE Task_Entry::Info_Type
+Task_Entry::info_type () const
+{
+ return rt_info_->info_type;
+}
+
+ACE_INLINE u_long
+Task_Entry::effective_execution_time () const
+{
+ // Just use low 32 bits. This will have to change when TimeBase.idl
+ // is finalized.
+ ACE_UINT32 worst_case_execution_time =
+ ACE_U64_TO_U32 (rt_info_->worst_case_execution_time);
+
+ return ((rt_info_->info_type == RtecScheduler::OPERATION) ||
+ (rt_info_->info_type == RtecScheduler::REMOTE_DEPENDANT))
+ ? static_cast<u_long> (worst_case_execution_time * dispatches_.size ())
+ : 0;
+}
+
+
+///////////////////////////
+// Class Task_Entry_Link //
+///////////////////////////
+
+
+// accessor: number of calls of dependency by dependant
+ACE_INLINE CORBA::Long
+Task_Entry_Link::number_of_calls () const
+{
+ return number_of_calls_;
+}
+
+ACE_INLINE Task_Entry_Link::Dependency_Type
+Task_Entry_Link::dependency_type () const
+{
+ return dependency_type_;
+}
+
+// accessor: dependant task entry
+ACE_INLINE Task_Entry &
+Task_Entry_Link::caller () const
+{
+ return caller_;
+}
+
+// accessor: dependency task entry
+ACE_INLINE Task_Entry &
+Task_Entry_Link::called () const
+{
+ return called_;
+}
+
+//////////////////////////
+// Class Dispatch Entry //
+//////////////////////////
+
+ACE_INLINE u_long
+Dispatch_Entry::dispatch_id () const
+{
+ return dispatch_id_;
+}
+
+ACE_INLINE Dispatch_Entry::Preemption_Priority
+Dispatch_Entry::priority () const
+{
+ return priority_;
+}
+
+ACE_INLINE void
+Dispatch_Entry::priority (Dispatch_Entry::Preemption_Priority p)
+{
+ priority_ = p;
+}
+
+ACE_INLINE Dispatch_Entry::OS_Priority
+Dispatch_Entry::OS_priority () const
+{
+ return OS_priority_;
+}
+
+ACE_INLINE void
+Dispatch_Entry::OS_priority (Dispatch_Entry::OS_Priority p)
+{
+ OS_priority_ = p;
+}
+
+ACE_INLINE Dispatch_Entry::Sub_Priority
+Dispatch_Entry::dynamic_subpriority () const
+{
+ return dynamic_subpriority_;
+}
+
+ACE_INLINE void
+Dispatch_Entry::dynamic_subpriority (Dispatch_Entry::Sub_Priority p)
+{
+ dynamic_subpriority_ = p;
+}
+
+ACE_INLINE Dispatch_Entry::Sub_Priority
+Dispatch_Entry::static_subpriority () const
+{
+ return static_subpriority_;
+}
+
+ACE_INLINE void
+Dispatch_Entry::static_subpriority (Dispatch_Entry::Sub_Priority p)
+{
+ static_subpriority_ = p;
+}
+
+
+ACE_INLINE Dispatch_Entry::Time
+Dispatch_Entry::arrival () const
+{
+ return arrival_;
+}
+
+ACE_INLINE Dispatch_Entry::Time
+Dispatch_Entry::deadline () const
+{
+ return deadline_;
+}
+
+ACE_INLINE Task_Entry &
+Dispatch_Entry::task_entry () const
+{
+ return task_entry_;
+}
+
+
+// accessor for pointer to original dispatch
+ACE_INLINE Dispatch_Entry *
+Dispatch_Entry::original_dispatch ()
+{
+ return original_dispatch_;
+}
+
+
+///////////////////////////////
+// Class Dispatch_Entry_Link //
+///////////////////////////////
+
+ACE_INLINE
+Dispatch_Entry_Link::~Dispatch_Entry_Link ()
+{
+}
+ // dtor
+
+ACE_INLINE bool
+Dispatch_Entry_Link::operator < (const Dispatch_Entry_Link &d) const
+{
+ return (this->dispatch_entry_ < d.dispatch_entry_);
+}
+ // GT comparator
+
+
+ACE_INLINE Dispatch_Entry &
+Dispatch_Entry_Link::dispatch_entry () const
+{
+ return dispatch_entry_;
+}
+ // accessor for reference to dispatch entry
+
+
+///////////////////////////////////
+// Class Dispatch_Proxy_Iterator //
+///////////////////////////////////
+
+ACE_INLINE int
+Dispatch_Proxy_Iterator::done () const
+{
+ return iter_.done ();
+}
+ // returns 0 if there are more entries to see, 1 if not
+
+
+//////////////////////////
+// Class TimeLine_Entry //
+//////////////////////////
+
+ // dispatch entry accessor
+ACE_INLINE Dispatch_Entry &
+TimeLine_Entry::dispatch_entry () const
+{
+ return dispatch_entry_;
+}
+
+
+// accessor for time slice start time (100 nanoseconds)
+ACE_INLINE RtecScheduler::Time
+TimeLine_Entry::start () const
+{
+ return start_;
+}
+
+// accessor for time slice stop time (100 nanoseconds)
+ACE_INLINE RtecScheduler::Time
+TimeLine_Entry::stop () const
+{
+ return stop_;
+}
+
+// accessor for time slice stop time (100 nanoseconds)
+ACE_INLINE RtecScheduler::Time
+TimeLine_Entry::arrival () const
+{
+ return arrival_;
+}
+
+// accessor for time slice stop time (100 nanoseconds)
+ACE_INLINE RtecScheduler::Time
+TimeLine_Entry::deadline () const
+{
+ return deadline_;
+}
+
+
+// accessor for next slice for this dispatch
+ACE_INLINE TimeLine_Entry *
+TimeLine_Entry::next (void) const
+{
+ return next_;
+}
+
+// mutator for next slice for this dispatch
+ACE_INLINE void
+TimeLine_Entry::next (TimeLine_Entry *t)
+{
+ next_ = t;
+}
+
+// accessor for previous slice for this dispatch
+ACE_INLINE TimeLine_Entry *
+TimeLine_Entry::prev (void) const
+{
+ return prev_;
+}
+
+// mutator for previous slice for this dispatch
+ACE_INLINE void
+TimeLine_Entry::prev (TimeLine_Entry *t)
+{
+ prev_ = t;
+}
+
+
+ACE_INLINE bool
+TimeLine_Entry::operator < (const TimeLine_Entry &t) const
+{
+ return (start_ < t.start_) ? true : false;
+}
+ // comparison operator
+
+
+///////////////////////////////
+// Class TimeLine_Entry_Link //
+///////////////////////////////
+
+
+ACE_INLINE TimeLine_Entry_Link::TimeLine_Entry_Link (TimeLine_Entry &t)
+ : entry_ (t)
+{
+}
+ // ctor
+
+ACE_INLINE TimeLine_Entry &
+TimeLine_Entry_Link::entry () const
+{
+ return entry_;
+}
+ // accessor for the underlying entry
+
+ACE_INLINE bool
+TimeLine_Entry_Link::operator < (const TimeLine_Entry_Link &l) const
+{
+ return (entry_ < l.entry_);
+}
+ // comparison operator
+
+TAO_END_VERSIONED_NAMESPACE_DECL
diff --git a/TAO/orbsvcs/orbsvcs/Sched/Scheduler.cpp b/TAO/orbsvcs/orbsvcs/Sched/Scheduler.cpp
new file mode 100644
index 00000000000..13ecbf74fc0
--- /dev/null
+++ b/TAO/orbsvcs/orbsvcs/Sched/Scheduler.cpp
@@ -0,0 +1,271 @@
+// $Id$
+//
+// ============================================================================
+//
+// = LIBRARY
+// sched
+//
+// = FILENAME
+// Scheduler.cpp
+//
+// = CREATION DATE
+// 23 January 1997
+//
+// = AUTHOR
+// David Levine
+//
+// ============================================================================
+
+#include "ace/Sched_Params.h"
+#include "orbsvcs/Time_Utilities.h"
+#include "orbsvcs/Sched/Scheduler.h"
+#include "ace/OS_NS_stdio.h"
+
+#include "ace/Lock_Adapter_T.h"
+
+ACE_RCSID(Sched, Scheduler, "$Id$")
+
+///////////////////////////////////////////////////////////////////////////////
+///////////////////////////////////////////////////////////////////////////////
+// class Scheduler static members
+///////////////////////////////////////////////////////////////////////////////
+///////////////////////////////////////////////////////////////////////////////
+
+const ACE_Scheduler::mode_t ACE_Scheduler::CURRENT_MODE = 0xFFFFFFFF;
+
+ACE_Scheduler *ACE_Scheduler::instance_ = 0;
+
+
+///////////////////////////////////////////////////////////////////////////////
+///////////////////////////////////////////////////////////////////////////////
+// class ACE_Scheduler static functions
+///////////////////////////////////////////////////////////////////////////////
+///////////////////////////////////////////////////////////////////////////////
+
+void
+ACE_Scheduler::output (FILE *file, const status_t status)
+{
+ switch (status)
+ {
+ case NOT_SCHEDULED :
+ ACE_OS::fprintf (file, "NOT_SCHEDULED");
+ break;
+ case SUCCEEDED :
+ ACE_OS::fprintf (file, "SUCCEEDED");
+ break;
+ case ST_TASK_ALREADY_REGISTERED :
+ ACE_OS::fprintf (file, "TASK_ALREADY_REGISTERED");
+ break;
+ case ST_VIRTUAL_MEMORY_EXHAUSTED :
+ ACE_OS::fprintf (file, "VIRTUAL_MEMORY_EXHAUSTED");
+ break;
+ case ST_UNKNOWN_TASK :
+ ACE_OS::fprintf (file, "UNKNOWN_TASK");
+ break;
+ case INVALID_MODE :
+ ACE_OS::fprintf (file, "INVALID_MODE");
+ break;
+ case MODE_COUNT_MISMATCH :
+ ACE_OS::fprintf (file, "MODE_COUNT_MISMATCH");
+ break;
+ case TASK_COUNT_MISMATCH :
+ ACE_OS::fprintf (file, "TASK_COUNT_MISMATCH");
+ break;
+ case INVALID_PRIORITY :
+ ACE_OS::fprintf (file, "INVALID_PRIORITY");
+ break;
+
+ // The following are only used during scheduling (in the case of
+ // off-line scheduling, they are only used prior to runtime).
+ // To save a little code space (280 bytes on g++ 2.7.2/Solaris 2.5.1),
+ // we could conditionally compile them so that they're not in the
+ // runtime version.
+ case ST_UTILIZATION_BOUND_EXCEEDED :
+ ACE_OS::fprintf (file, "UTILIZATION_BOUND_EXCEEDED");
+ break;
+ case ST_INSUFFICIENT_THREAD_PRIORITY_LEVELS :
+ ACE_OS::fprintf (file, "INSUFFICIENT_THREAD_PRIORITY_LEVELS");
+ break;
+ case ST_CYCLE_IN_DEPENDENCIES :
+ ACE_OS::fprintf (file, "CYCLE_IN_DEPENDENCIES");
+ break;
+ case UNABLE_TO_OPEN_SCHEDULE_FILE :
+ ACE_OS::fprintf (file, "UNABLE_TO_OPEN_SCHEDULE_FILE");
+ break;
+ case UNABLE_TO_WRITE_SCHEDULE_FILE :
+ ACE_OS::fprintf (file, "UNABLE_TO_WRITE_SCHEDULE_FILE");
+ break;
+ // End of config-only status values.
+
+ default:
+ ACE_OS::fprintf (file, "UNKNOWN STATUS: %d", status);
+ }
+}
+
+
+///////////////////////////////////////////////////////////////////////////////
+///////////////////////////////////////////////////////////////////////////////
+// class ACE_Scheduler member functions
+///////////////////////////////////////////////////////////////////////////////
+///////////////////////////////////////////////////////////////////////////////
+
+ACE_Scheduler::ACE_Scheduler () :
+ minimum_priority_queue_ (0), // Could initialize this to -1, but it's
+ // unsigned and we don't really need to
+ // distinguish between no queues and one
+ // queue.
+ modes_ (0),
+ tasks_ (0),
+ threads_ (0),
+ mode_ (0),
+ status_ (NOT_SCHEDULED),
+ output_level_ (0)
+{
+}
+
+
+ACE_Scheduler::~ACE_Scheduler ()
+{
+}
+
+
+// ************************************************************
+
+ACE_Scheduler::status_t
+ACE_Scheduler::get_rt_info (Object_Name name,
+ RT_Info* &rtinfo)
+{
+ handle_t handle;
+
+ // This makes a copy. We can optimize this with our own string
+ // class.
+ ACE_CString lookup (name);
+ // Search the map for the <name>. If found, return the RT_Info.
+ RT_Info **info_array = 0;
+ if (info_collection_.find (lookup, info_array) >= 0)
+ {
+ rtinfo = info_array[0];
+ // If we find it, return.
+ return SUCCEEDED;
+ }
+ else
+ // Otherwise, make one, bind it, and register it.
+ {
+ rtinfo = new RT_Info;
+ rtinfo->entry_point = name;
+ // Create and array (size one) of RT_Info*
+ info_array = new RT_Info*[1];
+ info_array[0] = rtinfo;
+ // Bind the rtinfo to the name.
+ if (info_collection_.bind (lookup, info_array) != 0)
+ {
+ delete rtinfo;
+ delete info_array;
+ rtinfo = 0;
+ return FAILED; // Error!
+ }
+ else
+ {
+ // Register the array.
+ status_t result = this->register_task (info_array, 1, handle);
+ if (result == SUCCEEDED)
+ {
+ rtinfo->handle = handle;
+ return ST_UNKNOWN_TASK; // Didn't find it, but made one!
+ }
+ else
+ {
+ rtinfo->handle = 0;
+ return FAILED;
+ }
+ }
+ }
+}
+
+int ACE_Scheduler::number_of_dependencies(RT_Info* rt_info)
+{
+ return rt_info->dependencies.length();
+}
+
+int ACE_Scheduler::number_of_dependencies(RT_Info& rt_info)
+{
+ return rt_info.dependencies.length();
+}
+
+int ACE_Scheduler::add_dependency(RT_Info* rt_info,
+ const Dependency_Info& d)
+{
+ // ACE_DEBUG ((LM_DEBUG, "Sched (%t) adding dependency to: %s\n",
+ // (const char*)rt_info->entry_point));
+ RtecScheduler::Dependency_Set& set = rt_info->dependencies;
+ int l = set.length();
+ set.length(l + 1);
+ set[l] = d;
+ return 0;
+}
+
+void ACE_Scheduler::export_to_file (RT_Info* info, FILE* file)
+{
+ ACE_Scheduler::export_to_file (*info, file);
+}
+
+void ACE_Scheduler::export_to_file (RT_Info& info, FILE* file)
+{
+ // The divide-by-1 is for ACE_U_LongLong support.
+ (void) ACE_OS::fprintf (file,
+ ACE_TEXT("%s\n%d\n")
+ ACE_UINT64_FORMAT_SPECIFIER ACE_TEXT("\n")
+ ACE_UINT64_FORMAT_SPECIFIER ACE_TEXT("\n")
+ ACE_UINT64_FORMAT_SPECIFIER ACE_TEXT("\n")
+ ACE_TEXT("%d\n%d\n")
+ ACE_UINT64_FORMAT_SPECIFIER ACE_TEXT("\n")
+ ACE_TEXT("%u\n# begin dependencies\n%d\n"),
+ (const char*)info.entry_point,
+ info.handle,
+ ORBSVCS_Time::to_hrtime (info.worst_case_execution_time) / 1,
+ ORBSVCS_Time::to_hrtime (info.typical_execution_time) / 1,
+ ORBSVCS_Time::to_hrtime (info.cached_execution_time) / 1,
+ info.period,
+ info.importance,
+ ORBSVCS_Time::to_hrtime (info.quantum) / 1,
+ info.threads,
+ number_of_dependencies(info));
+
+ for (int i = 0; i < number_of_dependencies(info); ++i)
+ {
+ RT_Info tmp;
+ // TODO: info.dependencies [i].rt_info >>= &tmp;
+ (void) ACE_OS::fprintf (file, "%s, %d\n",
+ (const char*)tmp.entry_point,
+ info.dependencies[i].number_of_calls);
+
+ }
+
+ (void) ACE_OS::fprintf (file, "# end dependencies\n%d\n%d\n\n",
+ info.priority,
+ info.preemption_subpriority);
+
+
+}
+
+int
+ACE_Scheduler::dispatch_configuration (const Preemption_Priority & p_priority,
+ OS_Thread_Priority & priority,
+ Dispatching_Type & d_type)
+{
+ // look up the stored configuration info for the given priority level
+ Config_Info *config_info;
+ if (lookup_config_info (p_priority, config_info) != SUCCEEDED)
+ {
+ ACE_ERROR_RETURN ((LM_ERROR,
+ "Config info for priority %lu could not be found\n",
+ p_priority),
+ -1);
+ }
+
+ priority = config_info->thread_priority;
+ d_type = config_info->dispatching_type;
+
+ return 0;
+}
+ // provide the thread priority and queue type for the given priority level
diff --git a/TAO/orbsvcs/orbsvcs/Sched/Scheduler.h b/TAO/orbsvcs/orbsvcs/Sched/Scheduler.h
new file mode 100644
index 00000000000..8cad8d40736
--- /dev/null
+++ b/TAO/orbsvcs/orbsvcs/Sched/Scheduler.h
@@ -0,0 +1,300 @@
+/* -*- C++ -*- */
+//
+// $Id$
+//
+// ============================================================================
+//
+// = LIBRARY
+// sched
+//
+// = FILENAME
+// Scheduler.h
+//
+// = CREATION DATE
+// 23 January 1997
+//
+// = AUTHOR
+// David Levine
+//
+// ============================================================================
+
+#ifndef SCHEDULER_H
+#define SCHEDULER_H
+#include /**/ "ace/pre.h"
+
+#include "ace/ACE.h"
+
+#if !defined (ACE_LACKS_PRAGMA_ONCE)
+# pragma once
+#endif /* ACE_LACKS_PRAGMA_ONCE */
+
+#include "ace/Map_Manager.h"
+#include "ace/Message_Block.h"
+#include "ace/SString.h"
+#include "ace/Unbounded_Set.h"
+
+#include "orbsvcs/RtecSchedulerC.h"
+#include "orbsvcs/Event_Service_Constants.h"
+#include "orbsvcs/Sched/sched_export.h"
+
+class TAO_RTSched_Export ACE_Scheduler
+ // = TITLE
+ // Thread scheduler interface.
+ //
+ // = DESCRIPTION
+ // This virtual base class is the interface to either an off-line
+ // scheduler, or to the necessary on-line component of the Scheduler.
+{
+public:
+ typedef u_int mode_t;
+
+ typedef RtecScheduler::handle_t handle_t;
+ typedef RtecScheduler::Dependency_Info Dependency_Info;
+ typedef RtecScheduler::Preemption_Priority_t Preemption_Priority;
+ typedef RtecScheduler::OS_Priority OS_Thread_Priority;
+ typedef RtecScheduler::Preemption_Subpriority_t Sub_Priority;
+ typedef RtecScheduler::RT_Info RT_Info;
+ typedef RtecScheduler::Config_Info Config_Info;
+ typedef RtecScheduler::Time Time;
+ typedef RtecScheduler::Dispatching_Type_t Dispatching_Type;
+ typedef RtecScheduler::Scheduling_Anomaly Scheduling_Anomaly;
+
+ // Map some types to simplify re-use.
+
+ typedef const char *Object_Name;
+ // Objects are named by unique strings.
+
+ static const mode_t CURRENT_MODE;
+
+ enum status_t {
+ // The following are used both by the runtime Scheduler and during
+ // scheduling.
+ NOT_SCHEDULED = -1 // the schedule () method has not been called yet
+ , FAILED = -1
+ , SUCCEEDED
+ , ST_UNKNOWN_TASK
+ , ST_UNKNOWN_PRIORITY
+ , ST_TASK_ALREADY_REGISTERED
+ , ST_VIRTUAL_MEMORY_EXHAUSTED
+ , ST_BAD_INTERNAL_POINTER
+
+ // The following are only used by the runtime Scheduler.
+ , INVALID_MODE
+ , MODE_COUNT_MISMATCH // only used by schedule ()
+ , TASK_COUNT_MISMATCH // only used by schedule ()
+ , THREAD_COUNT_MISMATCH // only used by schedule ()
+ , INVALID_PRIORITY // only used by schedule (): mismatch of
+ // (off-line, maybe) Scheduler output to
+ // the runtime Scheduler component.
+
+ // The following are only used during scheduling (in the case of
+ // off-line scheduling, they are only used prior to runtime).
+ , ST_UTILIZATION_BOUND_EXCEEDED
+ , ST_INSUFFICIENT_THREAD_PRIORITY_LEVELS
+ , ST_CYCLE_IN_DEPENDENCIES
+ , ST_UNRESOLVED_REMOTE_DEPENDENCIES
+ , UNABLE_TO_OPEN_SCHEDULE_FILE
+ , UNABLE_TO_WRITE_SCHEDULE_FILE
+ };
+
+ virtual ~ACE_Scheduler ();
+
+ // = Utility function for outputting the textual representation of a
+ // status_t value to a FILE.
+ static void output (FILE *, const status_t);
+
+ // = Initialize the scheduler.
+ virtual void init (const int minimum_priority,
+ const int maximum_priority,
+ const char *runtime_filename = 0,
+ const char *rt_info_filename = 0,
+ const char *timeline_filename = 0) = 0;
+ // The minimum and maximum priority are the OS-specific priorities that
+ // are used when creating the schedule (assigning priorities). The
+ // minimum_priority is the priority value of the lowest priority.
+ // It may be numerically higher than the maximum_priority, on OS's such
+ // as VxWorks that use lower values to indicate higher priorities.
+ //
+ // When Scheduler::schedule is called, the schedule is output to the
+ // file named by "runtime_filename" if it is non-zero.
+ // This file is compilable; it is linked into the runtime executable
+ // to provide priorities to the runtime scheduling component.
+ // If the "rt_info_filename" is non-zero, the RT_Info for
+ // every task is exported to it. It is not used at runtime.
+ // If the "timeline_filename" is non-zero, the timeline output
+ // file is created. It is not used at runtime.
+ //
+ // The runtime scheduling component ignores these filenames. It just
+ // uses the priorities that were linked in to the executable, after
+ // converting them to platform-specific values.
+
+ // = Registers a task.
+ virtual status_t register_task (RT_Info *[],
+ const u_int number_of_modes,
+ handle_t &handle) = 0;
+ // If the Task registration succeeds, this function returns SUCCEEDED
+ // and sets "handle" to a unique identifier for the task.
+ // Otherwise, it returns either VIRTUAL_MEMORY_EXHAUSTED or
+ // TASK_ALREADY_REGISTERED sets the handle to 0. (A task may
+ // only be registered once.)
+ // The RT_Info * array is indexed by mode; there must be one element for
+ // each mode, as specified by number_of_modes. If a task does not
+ // run in a mode, then its entry in the array for that mode must
+ // be 0.
+
+ virtual status_t get_rt_info (Object_Name name,
+ RT_Info* &rtinfo);
+ // Tries to find the RT_Info corresponding to <name> in the RT_Info
+ // database. Returns SUCCEEDED if <name> was found and <rtinfo> was
+ // set. Returns UNKNOWN_TASK if <name> was not found, but <rtinfo>
+ // was set to a newly allocated RT_Info. In this UNKNOWN_TASK case,
+ // the task must call RT_Info::set to fill in execution properties.
+ // In the SUCCEEDED and UNKNOWN_TASK cases, this->register_task
+ // (rtinfo, 0, handle) is called. Returns FAILED if an error
+ // occurs.
+ //
+ // One motivation for allocating RT_Info's from within the Scheduler
+ // is to allow RT_Infos to persist after the tasks that use them.
+ // For instance, we may want to call this->schedule right before the
+ // application exits a configuration run. If the tasks have been
+ // deleted (deleting their RT_Infos with them), this->schedule will
+ // fail.
+
+ virtual status_t lookup_rt_info (handle_t handle,
+ RT_Info* &rtinfo) = 0;
+ // Obtains an RT_Info based on its "handle".
+
+ virtual status_t lookup_config_info (Preemption_Priority priority,
+ Config_Info* &config_info) = 0;
+ // Obtains a Config_Info based on its priority.
+
+
+
+ // = Computes the schedule.
+ virtual status_t
+ schedule (ACE_Unbounded_Set<Scheduling_Anomaly *> &anomaly_set) = 0;
+ // This actually generates the files.
+
+ // = Access a thread priority.
+ virtual int priority (const handle_t handle,
+ OS_Thread_Priority &priority,
+ Sub_Priority &subpriority,
+ Preemption_Priority &preemption_prio,
+ const mode_t = CURRENT_MODE) const = 0;
+ // Defines "priority" as the priority that was assigned to the Task that
+ // was assigned "handle", for the specified mode. Defines "subpriority"
+ // as the relative ordering (due to dependencies) within the priority.
+ // Returns 0 on success, or -1 if an invalid mode or handle are supplied.
+ // Queue numbers are platform-independent priority values, ranging from
+ // a highest priority value of 0 to the lowest priority value, which is
+ // returned by "minimum_priority_queue ()". The current and deadline times
+ // are part of the scheduling service implementation interface, but may be
+ // ignored by some implementations and used by others.
+
+ // = Access the platform-independent priority value of the lowest-priority
+ // thread.
+ u_int minimum_priority_queue () const { return minimum_priority_queue_; }
+ // This is intended for use by the Event Channel, so it can determine the
+ // number of priority dispatch queues to create.
+
+ // = Access the number of modes.
+ u_int modes () const { return modes_; }
+
+ // = Access the number of tasks.
+ u_int tasks () const { return tasks_; }
+
+ // = Access the number of threads.
+ u_int threads () const { return threads_; }
+
+ // = Access the current mode.
+ mode_t mode () const { return mode_; }
+
+ // = Set the current mode.
+ void mode (const mode_t mode) { mode_ = mode; }
+
+ // = Access the current scheduler status.
+ status_t status () const { return status_; }
+
+ // = Access the current output (debugging) level.
+ u_int output_level () const { return output_level_; }
+ // Default is 0; set to 1 to print out schedule, by task. Set
+ // to higher than one for debugging info.
+
+ // = Set the scheduler output (debugging) level.
+ void output_level (const u_int level) { output_level_ = level; }
+ // the only supported levels are 0 (quiet), 1 (verbose) and 2
+ // (debug)
+
+ static int add_dependency(RT_Info* rt_info,
+ const Dependency_Info& d);
+
+ static int number_of_dependencies(RT_Info* rt_info);
+ static int number_of_dependencies(RT_Info& rt_info);
+
+ static void export_to_file (RT_Info*, FILE* file);
+ static void export_to_file (RT_Info&, FILE* file);
+
+ virtual int dispatch_configuration (const Preemption_Priority &p_priority,
+ OS_Thread_Priority& priority,
+ Dispatching_Type & d_type);
+ // provide the thread priority and queue type for the given priority level
+
+
+protected:
+ ACE_Scheduler ();
+
+ // = Set the minimum priority value.
+ void minimum_priority_queue (const u_int minimum_priority_queue_number)
+ { minimum_priority_queue_ = minimum_priority_queue_number; }
+
+ // = Set the number of modes.
+ void modes (const u_int modes) { modes_ = modes; }
+
+ // = Set the number of tasks.
+ void tasks (const u_int tasks) { tasks_ = tasks; }
+
+ // = Set the number of threads.
+ void threads (const u_int threads) { threads_ = threads; }
+
+ // = Set the current scheduler status.
+ void status (const status_t new_status) { status_ = new_status; }
+
+private:
+ typedef ACE_CString EXT;
+ typedef RT_Info **INT;
+
+ typedef ACE_Map_Manager<EXT, INT, TAO_SYNCH_MUTEX> Info_Collection;
+ typedef ACE_Map_Iterator<EXT, INT, TAO_SYNCH_MUTEX> Info_Collection_Iterator;
+ typedef ACE_Map_Entry<EXT, INT> Info_Collection_Entry;
+
+ Info_Collection info_collection_;
+ // A binding of name to rt_info. This is the mapping for every
+ // rt_info in the process.
+
+ static ACE_Scheduler *instance_;
+
+ u_int minimum_priority_queue_;
+ // The platform-independent priority value of the Event Channel's
+ // minimum priority dispatch queue. The value of the maximum priority
+ // dispatch queue is always 0.
+
+ u_int modes_;
+ u_int tasks_;
+ u_int threads_;
+
+ mode_t mode_;
+ status_t status_;
+ u_int output_level_;
+
+ // the following functions are not implememented
+ ACE_Scheduler (const ACE_Scheduler &);
+ ACE_Scheduler &operator= (const ACE_Scheduler &);
+};
+
+typedef ACE_Scheduler Scheduler;
+
+#include /**/ "ace/post.h"
+#endif /* SCHEDULER_H */
+
+
+// EOF
diff --git a/TAO/orbsvcs/orbsvcs/Sched/Scheduler_Generic.cpp b/TAO/orbsvcs/orbsvcs/Sched/Scheduler_Generic.cpp
new file mode 100644
index 00000000000..69448fa30b6
--- /dev/null
+++ b/TAO/orbsvcs/orbsvcs/Sched/Scheduler_Generic.cpp
@@ -0,0 +1,269 @@
+// $Id$
+//
+// ============================================================================
+//
+// = LIBRARY
+// sched
+//
+// = FILENAME
+// Scheduler_Generic.cpp
+//
+// = CREATION DATE
+// 19 November 1997
+//
+// = AUTHOR
+// David Levine
+//
+// ============================================================================
+
+#include "ace/Sched_Params.h"
+
+#include "orbsvcs/Sched/Scheduler_Generic.h"
+#include "ace/OS_NS_stdio.h"
+
+ACE_RCSID(Sched, Scheduler_Generic, "$Id$")
+
+TAO_BEGIN_VERSIONED_NAMESPACE_DECL
+
+///////////////////////////////////////////////////////////////////////////////
+///////////////////////////////////////////////////////////////////////////////
+// static functions
+///////////////////////////////////////////////////////////////////////////////
+///////////////////////////////////////////////////////////////////////////////
+
+// Structure for storing the RT_Info information for each task, per mode.
+struct Mode_Entry
+{
+ RtecScheduler::RT_Info *rt_info_;
+ u_long start_time_; // microseconds
+ u_long stop_time_; // microseconds
+
+ Mode_Entry() :
+ rt_info_ (0),
+ start_time_ (0),
+ stop_time_ (0)
+ {
+ }
+
+ Mode_Entry(RtecScheduler::RT_Info *const rt_info,
+ const u_long start_time = 0,
+ const u_long stop_time = 0) :
+ rt_info_ (rt_info),
+ start_time_ (start_time),
+ stop_time_ (stop_time)
+ {
+ }
+
+ ~Mode_Entry () {}
+
+ Mode_Entry &operator= (const Mode_Entry &entry)
+ {
+ if (this != &entry)
+ {
+ rt_info_ = entry.rt_info_;
+ start_time_ = entry.start_time_;
+ stop_time_ = entry.stop_time_;
+ }
+
+ return *this;
+ }
+};
+
+
+///////////////////////////////////////////////////////////////////////////////
+///////////////////////////////////////////////////////////////////////////////
+// class Scheduler_Generic member functions
+///////////////////////////////////////////////////////////////////////////////
+///////////////////////////////////////////////////////////////////////////////
+
+Scheduler_Generic::Scheduler_Generic () :
+ Scheduler (),
+ handles_ (0),
+ // Set the minimum priority to that for the current platform. This
+ // shouldn't be necessary, but UPSingleProcessorOrb::initialize_reactors
+ // creates threads before the Event Channel calls Scheduler::init ().
+ minimum_priority_ (ACE_Sched_Params::priority_min (ACE_SCHED_FIFO,
+ ACE_SCOPE_THREAD)),
+ increasing_priority_ (-1),
+ task_entries_ ()
+{
+ config_info_.preemption_priority = ACE_Scheduler_MAX_PREEMPTION_PRIORITY;
+ config_info_.thread_priority = minimum_priority_;
+ config_info_.dispatching_type = RtecScheduler::STATIC_DISPATCHING;
+}
+
+
+Scheduler_Generic::~Scheduler_Generic ()
+{
+ reset ();
+}
+
+
+void
+Scheduler_Generic::reset ()
+{
+}
+
+Scheduler::status_t
+Scheduler_Generic::lookup_rt_info (handle_t handle,
+ RT_Info*& rtinfo)
+{
+ if (handle < 0 || (size_t) handle > task_entries_.size ())
+ {
+ return ST_UNKNOWN_TASK;
+ }
+ RT_Info*** entry;
+ ACE_Unbounded_Set_Iterator <RT_Info **> i (task_entries_);
+ while (i.next (entry) != 0)
+ {
+ i.advance ();
+ RT_Info** array = *entry;
+ if (array[0]->handle == handle)
+ {
+ rtinfo = array[0];
+ return SUCCEEDED;
+ }
+ }
+
+ return ST_UNKNOWN_TASK;
+}
+
+Scheduler::status_t
+Scheduler_Generic::lookup_config_info (Preemption_Priority priority,
+ Config_Info* &config_info)
+{
+ if (priority == config_info_.preemption_priority)
+ {
+ config_info = &config_info_;
+ return SUCCEEDED;
+ }
+ else
+ {
+ return ST_UNKNOWN_PRIORITY;
+ }
+}
+ // Obtains a Config_Info based on its priority.
+
+
+Scheduler::status_t
+Scheduler_Generic::register_task (RT_Info *rt_info [],
+ const u_int number_of_modes,
+ handle_t &handle)
+{
+ status_t ret;
+
+ // try to store the new task's information . . .
+ switch (task_entries_.insert (rt_info))
+ {
+ case 0 : // successfully inserted
+ {
+ rt_info [0]->handle = (handle = ++handles_);
+
+ // assigned the same handle to the RT_Info for each of its modes
+ for (u_int i = 1; i < number_of_modes; ++i)
+ {
+ if (rt_info [i] != 0)
+ rt_info [i]->handle = handle;
+ }
+
+ if (number_of_modes > modes ())
+ {
+ modes (number_of_modes);
+ }
+
+ ret = SUCCEEDED;
+
+ if (output_level () >= 5)
+ {
+ ACE_OS::printf ("registered task \"%s\" with RT_Info starting "
+ "at %p\n",
+ (const char*)rt_info[0]->entry_point,
+ rt_info[0]);
+ }
+ }
+ break;
+
+ case 1 : // the entry had already been inserted
+ handle = 0;
+ ret = ST_TASK_ALREADY_REGISTERED;
+ break;
+
+ default :
+ // case -1 : insert failed, probably because virtual memory exhaused
+ handle = 0;
+ ret = ST_VIRTUAL_MEMORY_EXHAUSTED;
+ break;
+ }
+
+ return ret;
+}
+
+
+void
+Scheduler_Generic::init (const int minimum_priority,
+ const int maximum_priority,
+ const char *runtime_filename,
+ const char *rt_info_filename,
+ const char *timeline_filename)
+{
+ minimum_priority_ = minimum_priority;
+ maximum_priority_ = maximum_priority;
+ runtime_filename_ = runtime_filename;
+ rt_info_filename_ = rt_info_filename;
+ timeline_filename_ = timeline_filename;
+ config_info_.thread_priority = minimum_priority_;
+}
+
+
+Scheduler::status_t
+Scheduler_Generic::schedule (ACE_Unbounded_Set<Scheduling_Anomaly *> &
+ /* anomaly_set */)
+{
+ ACE_GUARD_RETURN (LOCK, ace_mon, lock_, ACE_Scheduler::FAILED);
+
+ // here goes . . .
+
+ increasing_priority_ = maximum_priority_ >= minimum_priority_;
+
+ status_t status = ACE_Scheduler::SUCCEEDED;
+
+ // store number of tasks, based on registrations
+ tasks (static_cast<u_int> (task_entries_.size ()));
+
+ if (output_level () > 0)
+ {
+ print_schedule ();
+ }
+
+ return status;
+}
+
+
+int
+Scheduler_Generic::priority (const handle_t /* handle */,
+ OS_Thread_Priority &priority,
+ Sub_Priority &subpriority,
+ Preemption_Priority &preemption_prio,
+ const mode_t /* requested_mode */) const
+{
+ priority = minimum_priority_;
+ subpriority = ACE_Scheduler_MIN_SUB_PRIORITY;
+ preemption_prio = ACE_Scheduler_MAX_PREEMPTION_PRIORITY;
+
+ if (output_level () >= 3)
+ {
+ ACE_OS::printf ("preemption_prio %d: min %d, pri %d, min_pri %d\n",
+ preemption_prio, minimum_priority_queue (),
+ priority, minimum_priority_);
+ }
+
+ return 0;
+}
+
+
+void
+Scheduler_Generic::print_schedule ()
+{
+}
+
+TAO_END_VERSIONED_NAMESPACE_DECL
diff --git a/TAO/orbsvcs/orbsvcs/Sched/Scheduler_Generic.h b/TAO/orbsvcs/orbsvcs/Sched/Scheduler_Generic.h
new file mode 100644
index 00000000000..1b73b4d1c4b
--- /dev/null
+++ b/TAO/orbsvcs/orbsvcs/Sched/Scheduler_Generic.h
@@ -0,0 +1,140 @@
+// -*- C++ -*-
+
+// $Id$
+//
+// ============================================================================
+//
+// = LIBRARY
+// sched
+//
+// = FILENAME
+// Scheduler_Generic.h
+//
+// = CREATION DATE
+// 19 November 1997
+//
+// = AUTHOR
+// David Levine
+//
+// ============================================================================
+
+#ifndef SCHEDULER_INTERNAL_H
+#define SCHEDULER_INTERNAL_H
+#include /**/ "ace/pre.h"
+
+#include "orbsvcs/Sched/Scheduler.h"
+#include "ace/Unbounded_Set.h"
+#include "ace/Synch_Traits.h"
+#include "ace/Recursive_Thread_Mutex.h"
+
+TAO_BEGIN_VERSIONED_NAMESPACE_DECL
+
+class TAO_RTSched_Export Scheduler_Generic : public ACE_Scheduler
+ // = TITLE
+ // Implementation of an off-line scheduler.
+ //
+ // = DESCRIPTION
+ // Schedules tasks, assigning the same priority to all of them.
+{
+public:
+ Scheduler_Generic ();
+ virtual ~Scheduler_Generic ();
+
+ // = Initialize the scheduler.
+ virtual void init (const int minimum_priority,
+ const int maximum_priority,
+ const char *runtime_filename = 0,
+ const char *rt_info_filename = 0,
+ const char *timeline_filename = 0);
+
+ // = Registers a task.
+ virtual status_t register_task (RT_Info *[],
+ const u_int number_of_modes,
+ handle_t &handle);
+
+ virtual status_t lookup_rt_info (handle_t handle,
+ RT_Info* &rtinfo);
+ // Obtains an RT_Info based on its "handle".
+
+ virtual status_t lookup_config_info (Preemption_Priority priority,
+ Config_Info* &config_info);
+ // Obtains a Config_Info based on its priority.
+
+ // = Computes the schedule.
+ virtual status_t
+ schedule (ACE_Unbounded_Set<Scheduling_Anomaly *> &anomaly_set);
+
+ // = Access a thread priority.
+ virtual int priority (const handle_t handle,
+ OS_Thread_Priority &priority,
+ Sub_Priority &subpriority,
+ Preemption_Priority &preemption_prio,
+ const mode_t = CURRENT_MODE) const;
+ // Defines "priority" as the priority that was assigned to the Task that
+ // was assigned "handle", for the specified mode. Defines "subpriority"
+ // as the relative ordering (due to dependencies) within the priority.
+ // Returns 0 on success, or 1 if an invalid mode or handle are supplied.
+
+private:
+ u_int handles_;
+ // The number of task handles dispensed so far.
+
+ int minimum_priority_;
+ // The minimum priority value that the application specified (in
+ // its call to init ()).
+
+ int maximum_priority_;
+ // The maximum priority value that the application specified (in
+ // its call to init ()).
+
+ const char *runtime_filename_;
+ // Destination file of Scheduler output from the configuration run.
+
+ const char *rt_info_filename_;
+ // Destination file of all rt_info data from the configuration run.
+
+ const char *timeline_filename_;
+ // The destination of the timeline.
+
+ int increasing_priority_;
+ // Set to 1 if priority values increase with increasing priority,
+ // such as on Solaris and Win32, or 0 if they decrease, such as on
+ // VxWorks.
+
+ ACE_Unbounded_Set <RT_Info **> task_entries_;
+ // Collection of known tasks.
+
+ Config_Info config_info_;
+ // dispatchin configuration info
+
+#if defined (ACE_HAS_THREADS)
+ typedef TAO_SYNCH_RECURSIVE_MUTEX LOCK;
+#else
+ typedef ACE_Null_Mutex LOCK;
+#endif /* ACE_HAS_THREADS */
+
+ LOCK lock_;
+ // This protects access to the scheduler during configuration runs.
+
+
+ ///////////////////////////////////////
+ // member functions for internal use //
+ ///////////////////////////////////////
+
+ void reset ();
+ // Prepare for another schedule computation, but do not
+ // disturb the "output" (priorities that have already been assigned).
+
+ void print_schedule ();
+ // Display the schedule, task-by-task.
+
+ Scheduler_Generic (const Scheduler_Generic &);
+ Scheduler_Generic &operator= (const Scheduler_Generic &);
+};
+
+TAO_END_VERSIONED_NAMESPACE_DECL
+
+#include /**/ "ace/post.h"
+#endif /* SCHEDULER_INTERNAL_H */
+
+// EOF
diff --git a/TAO/orbsvcs/orbsvcs/Sched/Strategy_Scheduler.cpp b/TAO/orbsvcs/orbsvcs/Sched/Strategy_Scheduler.cpp
new file mode 100644
index 00000000000..8b27fdbd690
--- /dev/null
+++ b/TAO/orbsvcs/orbsvcs/Sched/Strategy_Scheduler.cpp
@@ -0,0 +1,1394 @@
+// $Id$
+//
+// ============================================================================
+//
+// = LIBRARY
+// sched
+//
+// = FILENAME
+// Strategy_Scheduler.cpp
+//
+// = CREATION DATE
+// 22 December 1997
+//
+// = AUTHOR
+// Chris Gill
+//
+// ============================================================================
+
+#include "orbsvcs/Sched/Strategy_Scheduler.h"
+#include "ace/Sched_Params.h"
+
+ACE_RCSID (Sched,
+ Strategy_Scheduler,
+ "$Id$")
+
+//////////////////////////////////////////////
+// Helper function type definition for sort //
+//////////////////////////////////////////////
+
+#if defined (ACE_HAS_WINCE)
+typedef int (_cdecl* COMP_FUNC) (const void*, const void*);
+#else
+// This is awkward, but it makes MSVC++ happy.
+extern "C"
+{
+typedef int (*COMP_FUNC) (const void*, const void*);
+}
+#endif // ACE_HAS_WINCE
+
+///////////////////////////////////////////////////
+// class ACE_Strategy_Scheduler member functions //
+///////////////////////////////////////////////////
+
+// = Constructor.
+
+TAO_BEGIN_VERSIONED_NAMESPACE_DECL
+
+ACE_Strategy_Scheduler::ACE_Strategy_Scheduler (ACE_Scheduler_Strategy &strategy)
+ : ACE_DynScheduler (),
+ strategy_ (strategy)
+{
+}
+
+
+// = Virtual destructor.
+
+ACE_Strategy_Scheduler::~ACE_Strategy_Scheduler ()
+{
+}
+
+
+// = Sets up the schedule in the order generated
+// by the strategy's comparison operators.
+
+ACE_DynScheduler::status_t
+ACE_Strategy_Scheduler::sort_dispatches (Dispatch_Entry **dispatches,
+ u_int count)
+{
+ // Sort the entries in order of priority and subpriority.
+ strategy_.sort (dispatches, count);
+
+ return ACE_DynScheduler::SUCCEEDED;
+}
+
+// = Assigns priorities and sub-priorities to the sorted schedule,
+// according to the strategy's priority comparison operator.
+
+ACE_DynScheduler::status_t
+ACE_Strategy_Scheduler::assign_priorities (
+ Dispatch_Entry **dispatches,
+ u_int count,
+ ACE_Unbounded_Set<RtecScheduler::Scheduling_Anomaly *> &anomaly_set)
+{
+ // Start with happy status.
+ ACE_DynScheduler::status_t status = SUCCEEDED;
+
+ RtecScheduler::Scheduling_Anomaly * anomaly = 0;
+
+ // Start with the highest OS priority in the given range and work downward:
+ // if we run out of values to assign, return an error.
+ int current_OS_priority = maximum_priority_;
+
+ // Start scheduler priority at 0 (highest priority queue number)
+ // NOTE: 0 is highest for priority, lowest for dynamic and static subpriority.
+ Preemption_Priority current_scheduler_priority = 0;
+
+ // Value the OS and scheduler priorities in 0th dispatch entry.
+ dispatches[0]->OS_priority (current_OS_priority);
+ dispatches[0]->priority (current_scheduler_priority);
+
+ // Store the dispatch configuration for the highest priority level.
+ Config_Info *config_ptr;
+ ACE_NEW_RETURN (config_ptr, Config_Info, ST_VIRTUAL_MEMORY_EXHAUSTED);
+ config_ptr->preemption_priority = current_scheduler_priority;
+ config_ptr->thread_priority = current_OS_priority;
+ config_ptr->dispatching_type = strategy_.dispatch_type (*(dispatches[0]));
+ if (config_info_entries_->insert (config_ptr) < 0)
+ {
+ return ST_VIRTUAL_MEMORY_EXHAUSTED;
+ }
+
+ // Traverse ordered dispatch entry array, assigning priority
+ // (array is sorted from highest to lowest priority).
+ for (u_int i = 1; i < count; ++i)
+ {
+ switch (strategy_.priority_comp (*(dispatches[i-1]),
+ *(dispatches[i])))
+ {
+ case -1: // The current entry is at lower priority than the previous.
+ {
+ // Decrease priority by incrementing the current scheduling priority
+ // number: 0 is the highest priority number.
+ ++current_scheduler_priority;
+
+ // Check for OS priority level boundaries: because OS priority values
+ // can run in either increasing or decreasing order, there is no easy,
+ // portable way to check other than exact comparison to the bounds
+ // that were given in init () or that came from the platform itself.
+ if ((current_OS_priority == minimum_priority_) ||
+ (current_OS_priority == ACE_Sched_Params::previous_priority (
+ ACE_SCHED_FIFO,
+ current_OS_priority,
+ ACE_SCOPE_PROCESS)))
+ {
+ // If we have run out of priority levels to assign, indicate
+ // this in the return status, unless a more severe problem is
+ // already reflected there. Log an anomaly but keep right on
+ // assigning the minimum OS priority in the range to the remaining
+ // tasks.
+ status = (status == SUCCEEDED)
+ ? ST_INSUFFICIENT_THREAD_PRIORITY_LEVELS
+ : status;
+
+ // Log the anomaly.
+ anomaly =
+ create_anomaly (ST_INSUFFICIENT_THREAD_PRIORITY_LEVELS);
+ if (anomaly)
+ {
+ anomaly_set.insert (anomaly);
+ }
+ else
+ {
+ return ST_VIRTUAL_MEMORY_EXHAUSTED;
+ }
+ }
+ else
+ {
+ // We're still in range, so decrement the current OS priority level.
+ current_OS_priority =
+ ACE_Sched_Params::previous_priority (ACE_SCHED_FIFO,
+ current_OS_priority,
+ ACE_SCOPE_PROCESS);
+ }
+
+ // Store the dispatch configuration for the new priority level.
+ ACE_NEW_RETURN(config_ptr, Config_Info, ST_VIRTUAL_MEMORY_EXHAUSTED);
+ config_ptr->preemption_priority = current_scheduler_priority;
+ config_ptr->thread_priority = current_OS_priority;
+ config_ptr->dispatching_type = strategy_.dispatch_type (*(dispatches[i]));
+ if (config_info_entries_->insert (config_ptr) < 0)
+ {
+ return ST_VIRTUAL_MEMORY_EXHAUSTED;
+ }
+
+ break;
+ }
+ case 0: // Still at the same priority level.
+
+ break;
+
+ default: // Should never reach here: something *bad* has happened.
+
+ ACE_ERROR ((
+ LM_ERROR,
+ "Priority assignment failure: tasks"
+ " \"%s\" and \"%s\" are out of order.\n",
+ dispatches [i-1]->task_entry ().rt_info ()->entry_point.in (),
+ dispatches [i]->task_entry ().rt_info ()->entry_point.in ()));
+
+ status = ACE_DynScheduler::ST_INVALID_PRIORITY_ORDERING;
+
+ // Log the anomaly.
+ anomaly =
+ create_anomaly (ST_INVALID_PRIORITY_ORDERING);
+ if (anomaly)
+ {
+ anomaly_set.insert (anomaly);
+ }
+ else
+ {
+ return ST_VIRTUAL_MEMORY_EXHAUSTED;
+ }
+ }
+
+ // Set OS priority of the current dispatch entry.
+ dispatches[i]->OS_priority (current_OS_priority);
+
+ // Set scheduler priority of the current dispatch entry.
+ dispatches[i]->priority (current_scheduler_priority);
+ }
+
+ return status;
+}
+
+
+// = Assigns dynamic and static sub-priorities to the sorted dispatch
+// schedule, according to the strategy's subpriority comparisons.
+
+ACE_DynScheduler::status_t
+ACE_Strategy_Scheduler::assign_subpriorities (
+ Dispatch_Entry **dispatches,
+ u_int count,
+ ACE_Unbounded_Set<RtecScheduler::Scheduling_Anomaly *> &anomaly_set)
+{
+ ACE_DynScheduler::status_t status = ACE_DynScheduler::SUCCEEDED;
+ RtecScheduler::Scheduling_Anomaly * anomaly = 0;
+
+ // Start subpriority levels and element counts at 1, set level values in
+ // the first entry, increment the static subpriority level.
+ Sub_Priority dynamic_subpriority_level = 0;
+ Sub_Priority static_subpriority_level = 0;
+ u_int dynamic_subpriority_elements = 1;
+ u_int static_subpriority_elements = 1;
+ dispatches [0]->dynamic_subpriority (dynamic_subpriority_level);
+ dispatches [0]->static_subpriority (static_subpriority_level);
+
+ // Advance the static subpriority level.
+ static_subpriority_level++;
+
+ u_int i,j;
+ // Traverse ordered dispatch entry array, assigning priority
+ // (array is sorted from highest to lowest priority).
+ for (i = 1; i < count; ++i)
+ {
+ switch (strategy_.priority_comp (*(dispatches [i-1]),
+ *(dispatches [i])))
+ {
+ case -1: // The current entry is at lower priority than the previous.
+ {
+ // Fill in the high to low dynamic subpriority values by subtracting
+ // the previously assigned subpriority value of each of element in the
+ // current priority level from the value of last subpriority level.
+ for (j = 1; j <= dynamic_subpriority_elements; ++j)
+ {
+ dispatches [i - j]->
+ dynamic_subpriority (dynamic_subpriority_level -
+ dispatches [i - j]-> dynamic_subpriority ());
+ }
+ for (j = 1; j <= static_subpriority_elements; ++j)
+ {
+ dispatches [i - j]->
+ static_subpriority (static_subpriority_level -
+ dispatches [i - j]-> static_subpriority () - 1);
+ }
+
+ // Reset the subpriority counters, set these values in the
+ // current entry, and increment the static subpriority counter.
+ dynamic_subpriority_elements = 1;
+ static_subpriority_elements = 1;
+ dynamic_subpriority_level = 0;
+ static_subpriority_level = 0;
+ dispatches [i]->dynamic_subpriority (dynamic_subpriority_level);
+ dispatches [i]->static_subpriority (static_subpriority_level);
+
+ // Advance the static subpriority level.
+ static_subpriority_level++;
+
+ break;
+ }
+
+ case 0: // Still at the same priority level.
+
+ // Compare the dynamic subpriorities.
+ switch (strategy_.dynamic_subpriority_comp (*(dispatches[i-1]),
+ *(dispatches[i])))
+ {
+ case -1: // The current entry is at lower dynamic subpriority.
+
+ // Increment the dynamic subpriority level.
+ ++dynamic_subpriority_level;
+
+ // Update the static subpriority as well: this avoids problems
+ // with non-determinism if due to run-time conditions, two
+ // dispatches line up with identical dynamic subpriority that
+ // were considered different with respect to the critical instant.
+ dispatches [i]->static_subpriority (static_subpriority_level);
+ static_subpriority_level++;
+ static_subpriority_elements++;
+
+ break;
+
+ case 0: // Still at the same dynamic subpriority level.
+ {
+ switch (strategy_.static_subpriority_comp (*(dispatches[i-1]),
+ *(dispatches[i])))
+ {
+ case -1:
+ case 0:
+
+ // Assign and then increment the static subpriority: even if
+ // still at the same dynamic or static subpriority level as
+ // far as the scheduling strategy is concerned, assign a new
+ // one anyway, to give a completely deterministic schedule
+ // even if the dynamic subpriorities happen to align due to
+ // run-time variation.
+ dispatches [i]->static_subpriority (static_subpriority_level);
+ static_subpriority_level++;
+ static_subpriority_elements++;
+ break;
+
+ default: // We should never reach here: something *bad* has happened.
+
+ ACE_ERROR ((
+ LM_ERROR,
+ "Static subpriority assignment failure: tasks"
+ " \"%s\" and \"%s\" are out of order.\n",
+ dispatches [i-1]->task_entry ().rt_info ()->entry_point.in (),
+ dispatches [i]->task_entry ().rt_info ()->entry_point.in ()));
+
+ status = ST_INVALID_PRIORITY_ORDERING;
+
+ // Log the anomaly.
+ anomaly =
+ create_anomaly (ST_INVALID_PRIORITY_ORDERING);
+ if (anomaly)
+ {
+ anomaly_set.insert (anomaly);
+ }
+ else
+ {
+ return ST_VIRTUAL_MEMORY_EXHAUSTED;
+ }
+ }
+ break;
+ }
+
+ default: // We should never reach here: something *bad* has happened.
+
+ ACE_ERROR ((
+ LM_ERROR,
+ "Dynamic subpriority assignment failure: tasks"
+ " \"%s\" and \"%s\" are out of order.\n",
+ dispatches [i-1]->task_entry ().rt_info ()->entry_point.in (),
+ dispatches [i]->task_entry ().rt_info ()->entry_point.in ()));
+
+ status = ACE_DynScheduler::ST_INVALID_PRIORITY_ORDERING;
+
+ // Log the anomaly.
+ anomaly =
+ create_anomaly (ST_INVALID_PRIORITY_ORDERING);
+ if (anomaly)
+ {
+ anomaly_set.insert (anomaly);
+ }
+ else
+ {
+ return ST_VIRTUAL_MEMORY_EXHAUSTED;
+ }
+ }
+
+ dispatches [i]->dynamic_subpriority (dynamic_subpriority_level);
+ dynamic_subpriority_elements++;
+
+ break;
+
+ default: // We should never reach here: something *bad* has happened.
+
+ ACE_ERROR ((
+ LM_ERROR,
+ "Priority assignment failure: tasks"
+ " \"%s\" and \"%s\" are out of order.\n",
+ dispatches [i-1]->task_entry ().rt_info ()->entry_point.in (),
+ dispatches [i]->task_entry ().rt_info ()->entry_point.in ()));
+
+ status = ACE_DynScheduler::ST_INVALID_PRIORITY_ORDERING;
+
+ // Log the anomaly.
+ anomaly =
+ create_anomaly (ST_INVALID_PRIORITY_ORDERING);
+ if (anomaly)
+ {
+ anomaly_set.insert (anomaly);
+ }
+ else
+ {
+ return ST_VIRTUAL_MEMORY_EXHAUSTED;
+ }
+ }
+ }
+
+ // Fill in the high to low subpriority values for the last priority
+ // level by subtracting the previously assigned subpriorities from
+ // the total number of subpriorities.
+ for (j = 1; j <= dynamic_subpriority_elements; ++j)
+ {
+ dispatches [i - j]->
+ dynamic_subpriority (dynamic_subpriority_level -
+ dispatches [i - j]->dynamic_subpriority ());
+ }
+ for (j = 1; j <= static_subpriority_elements; ++j)
+ {
+ dispatches [i - j]->
+ static_subpriority (static_subpriority_level -
+ dispatches [i - j]->static_subpriority () - 1);
+ }
+
+ return status;
+}
+
+// = Determine the minimum critical priority number.
+
+ACE_DynScheduler::Preemption_Priority
+ACE_Strategy_Scheduler::minimum_critical_priority ()
+{
+ return strategy_.minimum_critical_priority ();
+}
+
+
+// = Schedules a dispatch entry into the timeline being created.
+
+ACE_DynScheduler::status_t
+ACE_Strategy_Scheduler::schedule_timeline_entry (
+ Dispatch_Entry &dispatch_entry,
+ ACE_Unbounded_Queue <Dispatch_Entry *> &reschedule_queue)
+{
+ status_t status = SUCCEEDED;
+
+ // Timeline entries cover the execution time of the dispatch.
+ Time remaining_time =
+ dispatch_entry.task_entry().rt_info ()->worst_case_execution_time;
+
+ // Initialize last stop time to arrival time of the dispatch.
+ Time last_stop = dispatch_entry.arrival ();
+
+ TimeLine_Entry *last_entry = 0;
+ TimeLine_Entry *current_entry = 0;
+ ACE_Ordered_MultiSet_Iterator <TimeLine_Entry_Link> iter (*timeline_);
+ for (iter.first (); (remaining_time > 0U) && (iter.done () == 0);
+ iter.advance ())
+ {
+ TimeLine_Entry_Link *link;
+ if ((iter.next (link) == 0) || (! link))
+ {
+ return ST_BAD_INTERNAL_POINTER;
+ }
+
+ // For each entry already in the timeline that is the first one for a
+ // dispatch, and has lower dynamic subpriority and does not have greater
+ // static priority, and starts in the period in which the new entry would
+ // execute, advance the iterator to the next timeline entry
+ // having a different dispatch entry (if there is such), add its dispatch
+ // entry to the reschedule set, remove all TimeLine_Entry_Links that
+ // correspond to that dispatch entry, and delete all its TimeLine_Entry
+ // objects as well. NOTE: 0 is highest priority, 1 next, etc.
+ while ((iter.done () == 0) &&
+ (link->entry ().start() < last_stop + remaining_time) &&
+ (link->entry ().start() >= last_stop) &&
+ (link->entry ().prev () == 0) &&
+ (link->entry ().dispatch_entry().priority () >=
+ dispatch_entry.priority ()) &&
+ (strategy_.dynamic_subpriority (dispatch_entry, link->entry ().start ()) >
+ strategy_.dynamic_subpriority (link->entry ().dispatch_entry (),
+ link->entry ().start ())))
+ {
+ // Point to the dispatch entry whose timeline entries will be removed and
+ // rescheduled, and to the timeline entry heading the bilinked list of
+ // timeline entries to be removed.
+ Dispatch_Entry *removed_dispatch_entry
+ = &(link->entry ().dispatch_entry());
+ TimeLine_Entry *remove_entry = & (link->entry ());
+
+ // Put the dispatch entry into the set of entries that will be
+ // rescheduled at the end of this method (tail recursively).
+ reschedule_queue.enqueue_tail (removed_dispatch_entry);
+
+ // Advance the iterator to the next timeline entry (if there is one)
+ // that is not for the dispatch entry being removed.
+ while (iter.done () == 0)
+ {
+ // Point to the current link.
+ if ((iter.next (link) == 0) || (! link))
+ {
+ return ST_BAD_INTERNAL_POINTER;
+ }
+
+ // Advance until a different dispatch entry is found,
+ // or we run off the end of the timeline.
+ if (&(link->entry ().dispatch_entry ()) ==
+ removed_dispatch_entry)
+ {
+ iter.advance ();
+ }
+ else
+ {
+ break;
+ }
+ }
+
+ // Remove entries corresponding to the rescheduled
+ // dispatch from the timeline and destroy them.
+ TimeLine_Entry *next_remove_entry = 0;
+ while (remove_entry)
+ {
+ next_remove_entry = remove_entry->next ();
+
+ timeline_->remove (TimeLine_Entry_Link (*remove_entry));
+ delete remove_entry;
+
+ remove_entry = next_remove_entry;
+ }
+ }
+
+ // Exit the outer loop if there are no more entries in the timeline.
+ if (iter.done () != 0)
+ {
+ break;
+ }
+
+ // If there's room, schedule a new timeline entry for the dispatch.
+ if (link->entry ().start() > last_stop)
+ {
+ ACE_NEW_RETURN (
+ current_entry,
+ TimeLine_Entry (
+ dispatch_entry,
+ last_stop,
+ (((remaining_time + last_stop) < link->entry ().start())
+ ? (remaining_time + last_stop) : link->entry ().start()),
+ dispatch_entry.arrival (),
+ dispatch_entry.deadline (),
+ (TimeLine_Entry *) 0, last_entry),
+ ST_VIRTUAL_MEMORY_EXHAUSTED);
+
+ // Patch up the pointers within the list of entries for this dispatch.
+ if (last_entry)
+ {
+ last_entry->next (current_entry);
+ }
+ last_entry = current_entry;
+
+ timeline_->insert(TimeLine_Entry_Link(*current_entry));
+
+ // Update the remaining time and last stop values.
+ remaining_time -= ((remaining_time < (link->entry ().start() - last_stop))
+ ? remaining_time : (link->entry ().start() - last_stop));
+ }
+
+ // Update the last stop time.
+ if (last_stop < link->entry ().stop ())
+ {
+ last_stop = link->entry ().stop ();
+ }
+ }
+
+ // If there is still dispatch time remaining, and we've
+ // reached the end of the list, insert what's left.
+ if (remaining_time > 0U)
+ {
+ ACE_NEW_RETURN (
+ current_entry,
+ TimeLine_Entry (
+ dispatch_entry,
+ last_stop,
+ remaining_time + last_stop,
+ dispatch_entry.arrival (),
+ dispatch_entry.deadline (),
+ 0, last_entry),
+ ST_VIRTUAL_MEMORY_EXHAUSTED);
+
+ // Patch up the pointers within the list of entries for this dispatch.
+ if (last_entry)
+ {
+ last_entry->next (current_entry);
+ }
+
+ timeline_->insert(TimeLine_Entry_Link(*current_entry));
+ }
+
+ return status;
+}
+
+
+
+////////////////////////////////////////////////////////////////////
+// class template ACE_Strategy_Scheduler_Factory member functions //
+////////////////////////////////////////////////////////////////////
+
+// = Constructs and returns a scheduler strategized with
+// an instance of the the parameterized strategy type.
+
+template <class STRATEGY> ACE_Strategy_Scheduler *
+ACE_Strategy_Scheduler_Factory<STRATEGY>::create (RtecScheduler::Preemption_Priority_t minimum_critical_priority)
+{
+ ACE_Strategy_Scheduler *the_scheduler = 0;
+ STRATEGY *the_strategy;
+
+ ACE_NEW_RETURN(the_strategy, STRATEGY(minimum_critical_priority), 0);
+
+ ACE_NEW_RETURN (the_scheduler, ACE_Strategy_Scheduler (*the_strategy), 0);
+
+ return the_scheduler;
+}
+
+
+
+/////////////////////////////////////////////////////////////////
+// abstract base class ACE_Scheduler_Strategy member functions //
+/////////////////////////////////////////////////////////////////
+
+// = Constructor.
+
+ACE_Scheduler_Strategy::ACE_Scheduler_Strategy (
+ ACE_DynScheduler::Preemption_Priority minimum_critical_priority)
+ : minimum_critical_priority_ (minimum_critical_priority)
+{
+}
+
+ACE_Scheduler_Strategy::~ACE_Scheduler_Strategy (void)
+{
+}
+
+// = Compares two dispatch entries using the specific priority, dynamic
+// subpriority, and static subpriority method definitions provided by
+// the derived strategy class to produce the strategy specific sort
+// ordering: returns -1 if the first Dispatch_Entry is greater in the order,
+// 0 if they are equivalent, or 1 if the second Dispatch_Entry is greater in
+// the order.
+
+int
+ACE_Scheduler_Strategy::sort_comp
+ (const Dispatch_Entry &first_entry,
+ const Dispatch_Entry &second_entry)
+{
+ // Order first by the priority ordering.
+ int result = priority_comp (first_entry, second_entry);
+
+ // Within same priority, order by dynamic subpriority.
+ if (result == 0)
+ {
+ result = dynamic_subpriority_comp (first_entry, second_entry);
+ }
+
+ // If same dynamic subpriority, order by static subpriority.
+ if (result == 0)
+ {
+ result = static_subpriority_comp (first_entry, second_entry);
+ }
+
+ return result;
+}
+
+// = Provides a lowest level ordering based first on importance (descending),
+// and then on the dependency topological sort finishing time (ascending).
+
+int
+ACE_Scheduler_Strategy::static_subpriority_comp (
+ const Dispatch_Entry &first_entry,
+ const Dispatch_Entry &second_entry)
+{
+ // Order first by importance assigned to underlying RT_Info (descending).
+ if (first_entry.task_entry ().rt_info ()->importance >
+ second_entry.task_entry ().rt_info ()->importance)
+ {
+ return -1;
+ }
+ else if (first_entry.task_entry ().rt_info ()->importance <
+ second_entry.task_entry ().rt_info ()->importance)
+ {
+ return 1;
+ }
+ else
+ {
+ // Order last by the topological sort finishing time (ascending).
+ if (first_entry.task_entry ().finished () <
+ second_entry.task_entry ().finished ())
+ {
+ return -1;
+ }
+ else if (first_entry.task_entry ().finished () >
+ second_entry.task_entry ().finished ())
+ {
+ return 1;
+ }
+ else
+ {
+ return 0;
+ }
+ }
+}
+
+
+// = Base class supplies default behavior: returns 0
+// for minimum critical priority number.
+
+ACE_DynScheduler::Preemption_Priority
+ACE_Scheduler_Strategy::minimum_critical_priority ()
+{
+ return 0;
+}
+
+
+
+/////////////////////////////////////////////////////////////////////////
+// class ACE_MUF_Scheduler_Strategy static data member initializations //
+/////////////////////////////////////////////////////////////////////////
+
+ACE_MUF_Scheduler_Strategy * ACE_MUF_Scheduler_Strategy::instance_ = 0;
+
+///////////////////////////////////////////////////////
+// class ACE_MUF_Scheduler_Strategy member functions //
+///////////////////////////////////////////////////////
+
+// = Returns an instance of the strategy.
+
+ACE_MUF_Scheduler_Strategy *
+ACE_MUF_Scheduler_Strategy::instance ()
+{
+ if (0 == ACE_MUF_Scheduler_Strategy::instance_)
+ {
+ ACE_NEW_RETURN (ACE_MUF_Scheduler_Strategy::instance_,
+ ACE_MUF_Scheduler_Strategy, 0);
+ }
+
+ return ACE_MUF_Scheduler_Strategy::instance_;
+}
+
+// = Compares two dispatch entries by maximum criticality: returns -1 if the
+// first Dispatch_Entry is greater in the order, 0 if they're equivalent, or
+// 1 if the second Dispatch_Entry is greater in the order.
+
+int
+ACE_MUF_Scheduler_Strategy::priority_comp (const Dispatch_Entry &first_entry,
+ const Dispatch_Entry &second_entry)
+{
+ // Order by criticality (descending).
+ if (first_entry.task_entry ().rt_info ()->criticality >
+ second_entry.task_entry ().rt_info ()->criticality)
+ {
+ return -1;
+ }
+ else if (first_entry.task_entry ().rt_info ()->criticality <
+ second_entry.task_entry ().rt_info ()->criticality)
+ {
+ return 1;
+ }
+ else
+ {
+ return 0; // Same priority level.
+ }
+}
+
+
+// = Sorts the dispatch entry pointer array in descending urgency order.
+
+void
+ACE_MUF_Scheduler_Strategy::sort (Dispatch_Entry **dispatch_entries, u_int size)
+{
+ ACE_OS::qsort ((void *) dispatch_entries,
+ size,
+ sizeof (Dispatch_Entry *),
+ (COMP_FUNC) ACE_MUF_Scheduler_Strategy::sort_function);
+}
+
+
+// = Default constructor.
+
+ACE_MUF_Scheduler_Strategy::ACE_MUF_Scheduler_Strategy (
+ ACE_DynScheduler::Preemption_Priority minimum_critical_priority)
+ :ACE_Scheduler_Strategy (minimum_critical_priority)
+{
+}
+
+
+// = Virtual destructor.
+
+ACE_MUF_Scheduler_Strategy::~ACE_MUF_Scheduler_Strategy ()
+{
+}
+
+
+// = Returns a dynamic subpriority value for the given entry and the
+// current time: if the operation has non-negative laxity, then the
+// value is positive, and a lower laxity gives a higher dynamic
+// subpriority; if the operation has negative laxity, the value
+// is the (negative) laxity value.
+
+long
+ACE_MUF_Scheduler_Strategy::dynamic_subpriority (Dispatch_Entry &entry,
+ RtecScheduler::Time current_time)
+{
+ long laxity =
+ ACE_U64_TO_U32 (entry.deadline () - current_time -
+ entry.task_entry ().rt_info ()->worst_case_execution_time);
+
+ return (laxity > 0) ? LONG_MAX - laxity : laxity;
+}
+
+
+// = Orders two dispatch entries by ascending laxity: returns -1 if the
+// first Dispatch_Entry is greater in the order, 0 if they're equivalent,
+// 1 if the second Dispatch_Entry is greater in the order.
+
+int
+ACE_MUF_Scheduler_Strategy::dynamic_subpriority_comp
+ (const Dispatch_Entry &first_entry,
+ const Dispatch_Entry &second_entry)
+{
+ // Order by descending dynamic priority according to ascending laxity.
+ u_long laxity1 =
+ ACE_U64_TO_U32 (first_entry.deadline () - first_entry.arrival () -
+ first_entry.task_entry ().rt_info ()->worst_case_execution_time);
+
+ u_long laxity2 =
+ ACE_U64_TO_U32 (second_entry.deadline () - first_entry.arrival () -
+ second_entry.task_entry ().rt_info ()->worst_case_execution_time);
+
+ if (laxity1 < laxity2)
+ {
+ return -1;
+ }
+ else if (laxity1 > laxity2)
+ {
+ return 1;
+ }
+ else
+ {
+ return 0;
+ }
+}
+
+
+// = Comparison function to pass to qsort.
+
+int
+ACE_MUF_Scheduler_Strategy::sort_function (void *arg1, void *arg2)
+{
+ return ACE_MUF_Scheduler_Strategy::instance ()->
+ sort_comp (** static_cast<Dispatch_Entry **> (arg1),
+ ** static_cast<Dispatch_Entry **> (arg2));
+}
+
+
+// = Returns the minimum critical priority number.
+
+ACE_DynScheduler::Preemption_Priority
+ACE_MUF_Scheduler_Strategy::minimum_critical_priority ()
+{
+ return minimum_critical_priority_;
+}
+
+
+// = Provides the dispatching queue type for the given dispatch entry.
+
+ACE_DynScheduler::Dispatching_Type
+ACE_MUF_Scheduler_Strategy::dispatch_type (const Dispatch_Entry & /* entry */)
+{
+ return RtecScheduler::LAXITY_DISPATCHING;
+}
+
+
+
+
+/////////////////////////////////////////////////////////////////////////
+// class ACE_RMS_Scheduler_Strategy static data member initializations //
+/////////////////////////////////////////////////////////////////////////
+
+ACE_RMS_Scheduler_Strategy * ACE_RMS_Scheduler_Strategy::instance_ = 0;
+
+///////////////////////////////////////////////////////
+// class ACE_RMS_Scheduler_Strategy member functions //
+///////////////////////////////////////////////////////
+
+// = Returns an instance of the strategy.
+
+ACE_RMS_Scheduler_Strategy *
+ACE_RMS_Scheduler_Strategy::instance ()
+{
+ if (0 == ACE_RMS_Scheduler_Strategy::instance_)
+ {
+ ACE_NEW_RETURN (ACE_RMS_Scheduler_Strategy::instance_,
+ ACE_RMS_Scheduler_Strategy, 0);
+ }
+
+ return ACE_RMS_Scheduler_Strategy::instance_;
+}
+
+// = Compares two dispatch entries by minimum period: returns -1 if the
+// first Dispatch_Entry is greater in the order, 0 if they're equivalent,
+// or 1 if the second Dispatch_Entry is greater in the order.
+
+int
+ACE_RMS_Scheduler_Strategy::priority_comp (const Dispatch_Entry &first_entry,
+ const Dispatch_Entry &second_entry)
+{
+ // compare by decreasing dispatch period
+ if ((first_entry.deadline () - first_entry.arrival ()) <
+ (second_entry.deadline () - second_entry.arrival ()))
+ {
+ return -1;
+ }
+ else if ((first_entry.deadline () - first_entry.arrival ()) >
+ (second_entry.deadline () - second_entry.arrival ()))
+ {
+ return 1;
+ }
+ else
+ {
+ return 0; // same priority level
+ }
+}
+
+
+// = Sorts the dispatch entry pointer array in descending RMS (rate) order.
+
+void
+ACE_RMS_Scheduler_Strategy::sort (
+ Dispatch_Entry **dispatch_entries_, u_int size)
+{
+ ACE_OS::qsort ((void *) dispatch_entries_,
+ size,
+ sizeof (Dispatch_Entry *),
+ (COMP_FUNC) ACE_RMS_Scheduler_Strategy::sort_function);
+}
+
+
+// = Default constructor.
+
+ACE_RMS_Scheduler_Strategy::ACE_RMS_Scheduler_Strategy (
+ ACE_DynScheduler::Preemption_Priority minimum_critical_priority)
+ :ACE_Scheduler_Strategy (minimum_critical_priority)
+{
+}
+
+
+// = Virtual destructor.
+
+ACE_RMS_Scheduler_Strategy::~ACE_RMS_Scheduler_Strategy ()
+{
+}
+
+
+// = All entries have the same dynamic subpriority value.
+
+long
+ACE_RMS_Scheduler_Strategy::dynamic_subpriority (
+ Dispatch_Entry & /* entry */,
+ RtecScheduler::Time /* current_time */)
+{
+ return 0;
+}
+
+
+// = All tasks in a given priority level have the same dynamic
+// subpriority under RMS.
+
+int
+ACE_RMS_Scheduler_Strategy::dynamic_subpriority_comp
+ (const Dispatch_Entry & /* first_entry */,
+ const Dispatch_Entry & /* second_entry */)
+{
+ return 0;
+}
+
+
+// Comparison function to pass to qsort.
+
+int
+ACE_RMS_Scheduler_Strategy::sort_function (void *arg1, void *arg2)
+{
+ return ACE_RMS_Scheduler_Strategy::instance ()->
+ sort_comp (** static_cast<Dispatch_Entry **> (arg1),
+ ** static_cast<Dispatch_Entry **> (arg2));
+}
+
+
+// = Returns minimum critical priority number.
+
+ACE_DynScheduler::Preemption_Priority
+ACE_RMS_Scheduler_Strategy::minimum_critical_priority ()
+{
+ return minimum_critical_priority_;
+}
+
+
+// = Provide the dispatching queue type for the given dispatch entry.
+
+ACE_DynScheduler::Dispatching_Type
+ACE_RMS_Scheduler_Strategy::dispatch_type (const Dispatch_Entry & /* entry */)
+{
+ return RtecScheduler::STATIC_DISPATCHING;
+}
+
+
+
+/////////////////////////////////////////////////////////////////////////
+// class ACE_MLF_Scheduler_Strategy static data member initializations //
+/////////////////////////////////////////////////////////////////////////
+
+ACE_MLF_Scheduler_Strategy * ACE_MLF_Scheduler_Strategy::instance_ = 0;
+
+///////////////////////////////////////////////////////
+// class ACE_MLF_Scheduler_Strategy member functions //
+///////////////////////////////////////////////////////
+
+// = Returns an instance of the strategy.
+
+ACE_MLF_Scheduler_Strategy *
+ACE_MLF_Scheduler_Strategy::instance ()
+{
+ if (0 == ACE_MLF_Scheduler_Strategy::instance_)
+ {
+ ACE_NEW_RETURN (ACE_MLF_Scheduler_Strategy::instance_,
+ ACE_MLF_Scheduler_Strategy, 0);
+ }
+
+ return ACE_MLF_Scheduler_Strategy::instance_;
+}
+
+
+// = Just returns 0, as all dispatch entries are of equivalent
+// static priority under MLF.
+
+int
+ACE_MLF_Scheduler_Strategy::priority_comp (const Dispatch_Entry & /* first_entry */,
+ const Dispatch_Entry & /* second_entry */)
+{
+ return 0;
+}
+
+
+// = Sorts the dispatch entry pointer array in ascending laxity order.
+
+void
+ACE_MLF_Scheduler_Strategy::sort (
+ Dispatch_Entry **dispatch_entries_, u_int size)
+{
+ ACE_OS::qsort ((void *) dispatch_entries_,
+ size,
+ sizeof (Dispatch_Entry *),
+ (COMP_FUNC) ACE_MLF_Scheduler_Strategy::sort_function);
+}
+
+
+// = Default constructor.
+
+ACE_MLF_Scheduler_Strategy::ACE_MLF_Scheduler_Strategy (
+ ACE_DynScheduler::Preemption_Priority /* minimum_critical_priority */)
+ :ACE_Scheduler_Strategy (0)
+{
+}
+
+
+// = Virtual destructor
+
+ACE_MLF_Scheduler_Strategy::~ACE_MLF_Scheduler_Strategy ()
+{
+}
+
+
+// = Returns a dynamic subpriority value for the given entry and the
+// current time relative to its arrival.
+
+long
+ACE_MLF_Scheduler_Strategy::dynamic_subpriority (Dispatch_Entry &entry,
+ RtecScheduler::Time current_time)
+{
+ long laxity =
+ ACE_U64_TO_U32 (entry.deadline () - current_time -
+ entry.task_entry ().rt_info ()->worst_case_execution_time);
+
+ return (laxity > 0) ? LONG_MAX - laxity : laxity;
+}
+
+
+// = Orders two dispatch entries by ascending laxity: returns -1 if the
+// first Dispatch_Entry is greater in the order, 0 if they're equivalent,
+// or 1 if the second Dispatch_Entry is greater in the order.
+
+int
+ACE_MLF_Scheduler_Strategy::dynamic_subpriority_comp
+ (const Dispatch_Entry &first_entry,
+ const Dispatch_Entry &second_entry)
+{
+ // Order by descending dynamic priority according to ascending laxity.
+ u_long laxity1 =
+ ACE_U64_TO_U32 (first_entry.deadline () - first_entry.arrival () -
+ first_entry.task_entry ().rt_info ()->worst_case_execution_time);
+
+ u_long laxity2 =
+ ACE_U64_TO_U32 (second_entry.deadline () - first_entry.arrival () -
+ second_entry.task_entry ().rt_info ()->worst_case_execution_time);
+
+ if (laxity1 < laxity2)
+ {
+ return -1;
+ }
+ else if (laxity1 > laxity2)
+ {
+ return 1;
+ }
+ else
+ {
+ return 0;
+ }
+}
+
+
+// = Comparison function to pass to qsort.
+
+int
+ACE_MLF_Scheduler_Strategy::sort_function (void *arg1, void *arg2)
+{
+ return ACE_MLF_Scheduler_Strategy::instance ()->
+ sort_comp (** static_cast<Dispatch_Entry **> (arg1),
+ ** static_cast<Dispatch_Entry **> (arg2));
+}
+
+
+// = Provides the dispatching queue type for the given dispatch entry.
+
+ACE_DynScheduler::Dispatching_Type
+ACE_MLF_Scheduler_Strategy::dispatch_type (const Dispatch_Entry & /* entry */)
+{
+ return RtecScheduler::LAXITY_DISPATCHING;
+}
+
+
+
+/////////////////////////////////////////////////////////////////////////
+// class ACE_EDF_Scheduler_Strategy static data member initializations //
+/////////////////////////////////////////////////////////////////////////
+
+ACE_EDF_Scheduler_Strategy * ACE_EDF_Scheduler_Strategy::instance_ = 0;
+
+///////////////////////////////////////////////////////
+// class ACE_EDF_Scheduler_Strategy member functions //
+///////////////////////////////////////////////////////
+
+// = Returns an instance of the strategy.
+
+ACE_EDF_Scheduler_Strategy *
+ACE_EDF_Scheduler_Strategy::instance ()
+{
+ if (0 == ACE_EDF_Scheduler_Strategy::instance_)
+ {
+ ACE_NEW_RETURN (ACE_EDF_Scheduler_Strategy::instance_,
+ ACE_EDF_Scheduler_Strategy, 0);
+ }
+
+ return ACE_EDF_Scheduler_Strategy::instance_;
+}
+
+// = Just returns 0, as all dispatch entries are of
+// equivalent static priority under EDF.
+
+int
+ACE_EDF_Scheduler_Strategy::priority_comp (const Dispatch_Entry & /* first_entry */,
+ const Dispatch_Entry & /* second_entry */)
+{
+ return 0;
+}
+
+
+// = Sort the dispatch entry pointer array in ascending deadline (period) order.
+
+void
+ACE_EDF_Scheduler_Strategy::sort (
+ Dispatch_Entry **dispatch_entries_, u_int size)
+{
+ ACE_OS::qsort ((void *) dispatch_entries_,
+ size,
+ sizeof (Dispatch_Entry *),
+ (COMP_FUNC) ACE_EDF_Scheduler_Strategy::sort_function);
+}
+
+
+// = Default constructor.
+
+ACE_EDF_Scheduler_Strategy::ACE_EDF_Scheduler_Strategy (
+ ACE_DynScheduler::Preemption_Priority /* minimum_critical_priority */)
+ :ACE_Scheduler_Strategy (0)
+{
+}
+
+
+// = Virtual destructor.
+
+ACE_EDF_Scheduler_Strategy::~ACE_EDF_Scheduler_Strategy ()
+{
+}
+
+// = Returns a dynamic subpriority value for the given entry and the
+// current time relative to its arrival.
+
+long
+ACE_EDF_Scheduler_Strategy::dynamic_subpriority (Dispatch_Entry &entry,
+ RtecScheduler::Time current_time)
+{
+ long time_to_deadline =
+ ACE_U64_TO_U32 (entry.deadline () - current_time);
+
+ return (time_to_deadline > 0)
+ ? LONG_MAX - time_to_deadline : time_to_deadline;
+}
+
+
+// = Orders two dispatch entries by ascending time to deadline: returns -1 if
+// the first Dispatch_Entry is greater in the order, 0 if they're equivalent,
+// or 1 if the second Dispatch_Entry is greater in the order.
+
+int
+ACE_EDF_Scheduler_Strategy::dynamic_subpriority_comp
+ (const Dispatch_Entry &first_entry,
+ const Dispatch_Entry &second_entry)
+{
+ // Order by dispatchable interval (ascending).
+ if (first_entry.deadline () - first_entry.arrival () <
+ second_entry.deadline () - first_entry.arrival ())
+ {
+ return -1;
+ }
+ else if (first_entry.deadline () - first_entry.arrival () >
+ second_entry.deadline () - first_entry.arrival ())
+ {
+ return 1;
+ }
+ else
+ {
+ return 0;
+ }
+}
+
+
+// = Comparison function to pass to qsort.
+
+int
+ACE_EDF_Scheduler_Strategy::sort_function (void *arg1, void *arg2)
+{
+ return ACE_EDF_Scheduler_Strategy::instance ()->
+ sort_comp (** static_cast<Dispatch_Entry **> (arg1),
+ ** static_cast<Dispatch_Entry **> (arg2));
+}
+
+// = Provides the dispatching queue type for the given dispatch entry.
+
+ACE_DynScheduler::Dispatching_Type
+ACE_EDF_Scheduler_Strategy::dispatch_type (const Dispatch_Entry & /* entry */)
+{
+ return RtecScheduler::DEADLINE_DISPATCHING;
+}
+
+
+//////////////////////////////////////////////
+// class ACE_Criticality_Scheduler_Strategy //
+// static data member initializations //
+//////////////////////////////////////////////
+
+ACE_Criticality_Scheduler_Strategy *
+ACE_Criticality_Scheduler_Strategy::instance_ = 0;
+
+///////////////////////////////////////////////////////////////
+// class ACE_Criticality_Scheduler_Strategy member functions //
+///////////////////////////////////////////////////////////////
+
+// = Returns an instance of the strategy.
+
+ACE_Criticality_Scheduler_Strategy *
+ACE_Criticality_Scheduler_Strategy::instance ()
+{
+ if (0 == ACE_Criticality_Scheduler_Strategy::instance_)
+ {
+ ACE_NEW_RETURN (ACE_Criticality_Scheduler_Strategy::instance_,
+ ACE_Criticality_Scheduler_Strategy, 0);
+ }
+
+ return ACE_Criticality_Scheduler_Strategy::instance_;
+}
+
+// = Compares two dispatch entries by minimum period: returns -1 if the
+// first Dispatch_Entry is greater in the order, 0 if they're equivalent,
+// or 1 if the second Dispatch_Entry is greater in the order.
+
+int
+ACE_Criticality_Scheduler_Strategy::priority_comp (
+ const Dispatch_Entry &first_entry,
+ const Dispatch_Entry &second_entry)
+{
+ // Order by criticality (descending).
+ if (first_entry.task_entry ().rt_info ()->criticality >
+ second_entry.task_entry ().rt_info ()->criticality)
+ {
+ return -1;
+ }
+ else if (first_entry.task_entry ().rt_info ()->criticality <
+ second_entry.task_entry ().rt_info ()->criticality)
+ {
+ return 1;
+ }
+ else
+ {
+ return 0; // Same priority level.
+ }
+}
+
+// = Sorts the dispatch entry pointer array in descending criticality order.
+
+void
+ACE_Criticality_Scheduler_Strategy::sort (
+ Dispatch_Entry **dispatch_entries_, u_int size)
+{
+ ACE_OS::qsort ((void *) dispatch_entries_,
+ size,
+ sizeof (Dispatch_Entry *),
+ (COMP_FUNC) ACE_Criticality_Scheduler_Strategy::sort_function);
+}
+
+
+// = Default constructor.
+
+ACE_Criticality_Scheduler_Strategy::ACE_Criticality_Scheduler_Strategy (
+ ACE_DynScheduler::Preemption_Priority minimum_critical_priority)
+ :ACE_Scheduler_Strategy (minimum_critical_priority)
+{
+}
+
+
+// = Virtual destructor.
+
+ACE_Criticality_Scheduler_Strategy::~ACE_Criticality_Scheduler_Strategy ()
+{
+}
+
+// = All entries have the same dynamic subpriority value.
+
+long
+ACE_Criticality_Scheduler_Strategy::dynamic_subpriority (
+ Dispatch_Entry & /* entry */,
+ RtecScheduler::Time /* current_time */)
+{
+ return 0;
+}
+
+
+// = All tasks in a given priority level have the same dynamic
+// subpriority under this strategy.
+
+int
+ACE_Criticality_Scheduler_Strategy::dynamic_subpriority_comp
+ (const Dispatch_Entry & /* first_entry */,
+ const Dispatch_Entry & /* second_entry */)
+{
+ return 0;
+}
+
+
+// = Comparison function to pass to qsort.
+
+int
+ACE_Criticality_Scheduler_Strategy::sort_function (void *arg1, void *arg2)
+{
+ return ACE_Criticality_Scheduler_Strategy::instance ()->
+ sort_comp (** static_cast<Dispatch_Entry **> (arg1),
+ ** static_cast<Dispatch_Entry **> (arg2));
+}
+
+
+// = Returns minimum critical priority number.
+
+ACE_DynScheduler::Preemption_Priority
+ACE_Criticality_Scheduler_Strategy::minimum_critical_priority ()
+{
+ return minimum_critical_priority_;
+}
+
+// = Provides the dispatching queue type for the given dispatch entry.
+
+ACE_DynScheduler::Dispatching_Type
+ACE_Criticality_Scheduler_Strategy::dispatch_type (
+ const Dispatch_Entry & /* entry */)
+{
+ return RtecScheduler::STATIC_DISPATCHING;
+}
+
+TAO_END_VERSIONED_NAMESPACE_DECL
diff --git a/TAO/orbsvcs/orbsvcs/Sched/Strategy_Scheduler.h b/TAO/orbsvcs/orbsvcs/Sched/Strategy_Scheduler.h
new file mode 100644
index 00000000000..e323855d33e
--- /dev/null
+++ b/TAO/orbsvcs/orbsvcs/Sched/Strategy_Scheduler.h
@@ -0,0 +1,505 @@
+// -*- C++ -*-
+
+// $Id$
+//
+// ============================================================================
+//
+// = LIBRARY
+// sched
+//
+// = FILENAME
+// Strategy_Scheduler.h
+//
+// = CREATION DATE
+// 22 December 1997
+//
+// = AUTHOR
+// Chris Gill
+//
+// ============================================================================
+
+#ifndef STRATEGY_SCHEDULER_H
+#define STRATEGY_SCHEDULER_H
+#include /**/ "ace/pre.h"
+
+#include "orbsvcs/Sched/DynSched.h"
+
+TAO_BEGIN_VERSIONED_NAMESPACE_DECL
+
+// forward declaration of the abstract base class for scheduler strategies
+class ACE_Scheduler_Strategy;
+
+/////////////////////////////////
+// Strategized scheduler class //
+/////////////////////////////////
+
+class TAO_RTSched_Export ACE_Strategy_Scheduler : public ACE_DynScheduler
+ // = TITLE
+ // ACE_Strategy_Scheduler
+ //
+ // = DESCRIPTION
+ // Strategized scheduler implementation. Provides an implementation
+ // of all strategy specific scheduling mechanisms, which relies on the
+ // methods of the associated strategy class.
+{
+// public interface
+public:
+
+ ACE_Strategy_Scheduler (ACE_Scheduler_Strategy &strategy);
+ // = Constructor.
+
+ virtual ~ACE_Strategy_Scheduler ();
+ // = Virtual destructor.
+
+ status_t assign_priorities (
+ Dispatch_Entry **dispatches, u_int count,
+ ACE_Unbounded_Set<RtecScheduler::Scheduling_Anomaly *> &anomaly_set);
+ // = Assigns priorities to the sorted dispatch schedule,
+ // according to the strategy's priority comparison operator.
+
+ status_t assign_subpriorities (
+ Dispatch_Entry **dispatches, u_int count,
+ ACE_Unbounded_Set<RtecScheduler::Scheduling_Anomaly *> &anomaly_set);
+ // = Assigns dynamic and static sub-priorities to the sorted dispatch
+ // schedule, according to the strategy's subpriority comparisons.
+
+ virtual Preemption_Priority minimum_critical_priority ();
+ // = Determine the minimum critical priority number.
+
+private:
+
+ virtual status_t schedule_timeline_entry (Dispatch_Entry &dispatch_entry,
+ ACE_Unbounded_Queue <Dispatch_Entry *>
+ &reschedule_queue);
+ // = Schedules a dispatch entry into the timeline being created.
+
+ virtual status_t sort_dispatches (Dispatch_Entry **dispatches, u_int count);
+ // = Sets up the schedule in the order generated by the strategy.
+
+ ACE_Scheduler_Strategy &strategy_;
+ // = Strategy for comparing and sorting dispatch entries.
+
+ ACE_Strategy_Scheduler (const ACE_Strategy_Scheduler &);
+ ACE_Strategy_Scheduler &operator= (const ACE_Strategy_Scheduler &);
+};
+
+
+
+////////////////////////////////////////
+// Factory for strategized schedulers //
+////////////////////////////////////////
+
+template <class STRATEGY>
+class ACE_Strategy_Scheduler_Factory
+ // = TITLE
+ // ACE_Strategy_Scheduler_Factory
+ //
+ // = DESCRIPTION
+ // Provides a type parameterized factory method that constructs
+ // and returns a scheduler that uses the given scheduling strategy
+{
+public:
+
+ static ACE_Strategy_Scheduler * create (RtecScheduler::Preemption_Priority_t minimum_critical_priority);
+ // = Constructs and returns a scheduler strategized with
+ // an instance of the the parameterized strategy type.
+};
+
+
+//////////////////////////
+// Scheduler Strategies //
+//////////////////////////
+
+class TAO_RTSched_Export ACE_Scheduler_Strategy
+ // = TITLE
+ // ACE_Scheduler_Strategy
+ //
+ // = DESCRIPTION
+ // Abstract Base Class for scheduling strategies: each derived class
+ // must define an ordering strategy for dispatch entries based on a
+ // specific scheduling algorithm.
+{
+public:
+
+ ACE_Scheduler_Strategy (ACE_DynScheduler::Preemption_Priority minimum_critical_priority = 0);
+ // = Constructor.
+
+ /// Destructor.
+ virtual ~ACE_Scheduler_Strategy (void);
+
+ virtual int priority_comp (const Dispatch_Entry &first_entry,
+ const Dispatch_Entry &second_entry) = 0;
+ // = Compares two dispatch entries in strategy specific high to low
+ // priority ordering: returns -1 if the first Dispatch_Entry is greater
+ // in the order, 0 if they are equivalent, or 1 if the second
+ // Dispatch_Entry is greater in the order.
+
+ virtual void sort (Dispatch_Entry **dispatch_entries,
+ u_int count) = 0;
+ // = Sorts the dispatch entry link pointer array according to
+ // the specific sort order defined by the strategy.
+
+ virtual ACE_DynScheduler::Preemption_Priority minimum_critical_priority ();
+ // = Determines the minimum critical priority number.
+
+ virtual int dynamic_subpriority_comp (const Dispatch_Entry &first_entry,
+ const Dispatch_Entry &second_entry) = 0;
+ // = Compares two dispatch entries in strategy specific high to low
+ // dynamic subpriority ordering: returns -1 if the first Dispatch_Entry
+ // is greater in the order, 0 if they are equivalent, or 1 if the
+ // second Dispatch_Entry is greater in the order.
+
+ virtual long dynamic_subpriority (Dispatch_Entry &entry,
+ RtecScheduler::Time current_time) = 0;
+ // = Returns a dynamic subpriority value
+ // for the given timeline entry at the current time.
+
+ virtual int static_subpriority_comp (const Dispatch_Entry &first_entry,
+ const Dispatch_Entry &second_entry);
+ // = Provides a lowest level ordering based first on importance
+ // (descending), and then on the dependency topological sort finishing
+ // time (ascending).
+
+ virtual ACE_DynScheduler::Dispatching_Type
+ dispatch_type (const Dispatch_Entry &entry) = 0;
+ // = Provide the dispatching queue type for the given dispatch entry.
+
+protected:
+
+ int sort_comp (const Dispatch_Entry &first_entry,
+ const Dispatch_Entry &second_entry);
+ // = Compares two dispatch entries using the specific priority, dynamic
+ // subpriority, and static subpriority method definitions provided by
+ // the derived strategy class to produce the strategy specific sort
+ // ordering: returns -1 if the first Dispatch_Entry is greater in the
+ // order, 0 if they are equivalent, or 1 if the second Dispatch_Entry is
+ // greater in the order. This is an example of the Template Method
+ // pattern (and also of Pree's Unification Metapattern), in which
+ // derived classes provide definitions of the methods on which the
+ // sort_comp Template Method relies.
+
+ ACE_DynScheduler::Preemption_Priority minimum_critical_priority_;
+ // = The minimum critical priority number for the strategy.
+};
+
+
+
+class TAO_RTSched_Export ACE_MUF_Scheduler_Strategy : public ACE_Scheduler_Strategy
+ // = TITLE
+ // ACE_MUF_Scheduler_Strategy
+ //
+ // = DESCRIPTION
+ // Defines "schedule" method using Maximum Urgency First
+ // scheduling algorithm.
+{
+public:
+
+ ACE_MUF_Scheduler_Strategy (ACE_DynScheduler::Preemption_Priority minimum_critical_priority = 0);
+ // = Constructor.
+
+ virtual ~ACE_MUF_Scheduler_Strategy ();
+ // = Virtual destructor.
+
+ static ACE_MUF_Scheduler_Strategy *instance ();
+ // = Returns an instance of the strategy.
+
+ virtual int priority_comp (const Dispatch_Entry &first_entry,
+ const Dispatch_Entry &second_entry);
+ // = Compares two dispatch entries by maximum criticality: returns -1 if
+ // the first Dispatch_Entry is greater in the order, 0 if they're
+ // equivalent, or 1 if the second Dispatch_Entry is greater in the order.
+
+ virtual void sort (Dispatch_Entry **dispatch_entries,
+ u_int count);
+ // = Sorts the dispatch entry link pointer array
+ // in descending urgency order.
+
+ virtual ACE_DynScheduler::Preemption_Priority minimum_critical_priority ();
+ // = Determines the minimum critical priority number.
+
+ virtual ACE_DynScheduler::Dispatching_Type
+ dispatch_type (const Dispatch_Entry &entry);
+ // = Provides the dispatching queue type for the given dispatch entry.
+
+protected:
+
+ virtual long dynamic_subpriority (Dispatch_Entry &entry,
+ RtecScheduler::Time current_time);
+ // = Returns a dynamic subpriority value at the current time for
+ // the given timeline entry: if the operation has
+ // non-negative laxity, then the value is positive, and a lower
+ // laxity gives a higher dynamic subpriority; if the operation
+ // has negative laxity, the value is the (negative) laxity value.
+
+ virtual int dynamic_subpriority_comp (
+ const Dispatch_Entry &first_entry,
+ const Dispatch_Entry &second_entry);
+ // = Orders two dispatch entries by ascending laxity: returns -1 if the
+ // first Dispatch_Entry is greater in the order, 0 if they're equivalent,
+ // 1 if the second Dispatch_Entry is greater in the order.
+
+private:
+
+ // = Comparison function to pass to qsort: calls instance ()->sort_comp ().
+#if defined (ACE_HAS_WINCE)
+ static int _cdecl sort_function (void *arg1, void *arg2);
+#else
+ static int sort_function (void *arg1, void *arg2);
+#endif // ACE_HAS_WINCE
+
+ static ACE_MUF_Scheduler_Strategy *instance_;
+ // Instance of the strategy.
+};
+
+
+class TAO_RTSched_Export ACE_RMS_Scheduler_Strategy : public ACE_Scheduler_Strategy
+ // = TITLE
+ // ACE_RMS_Scheduler_Strategy
+ //
+ // = DESCRIPTION
+ // Defines "schedule" method using Rate Monotonic
+ // Scheduling algorithm.
+{
+public:
+
+ ACE_RMS_Scheduler_Strategy (ACE_DynScheduler::Preemption_Priority minimum_critical_priority = 0);
+ // = Constructor.
+
+ virtual ~ACE_RMS_Scheduler_Strategy ();
+ // = Virtual destructor.
+
+ static ACE_RMS_Scheduler_Strategy *instance ();
+ // Returns an instance of the strategy.
+
+ virtual int priority_comp (const Dispatch_Entry &first_entry,
+ const Dispatch_Entry &second_entry);
+ // = Compares two dispatch entries by minimum period: returns -1 if the
+ // first Dispatch_Entry is greater in the order, 0 if they're equivalent,
+ // or 1 if the second Dispatch_Entry is greater in the order.
+
+ virtual void sort (Dispatch_Entry **dispatch_entries,
+ u_int count);
+ // = Sorts the dispatch entry link pointer array in
+ // descending RMS (rate) order.
+
+ virtual ACE_DynScheduler::Preemption_Priority minimum_critical_priority ();
+ // = Determine the minimum critical priority number.
+
+ virtual ACE_DynScheduler::Dispatching_Type
+ dispatch_type (const Dispatch_Entry &entry);
+ // = Provide the dispatching queue type for the given dispatch entry.
+
+protected:
+
+ virtual long dynamic_subpriority (Dispatch_Entry &entry,
+ RtecScheduler::Time current_time);
+ // = Just returns 0: all operations have
+ // the same dynamic subpriority value.
+
+ virtual int dynamic_subpriority_comp
+ (const Dispatch_Entry &first_entry,
+ const Dispatch_Entry &second_entry);
+ // = All dispatches in a given priority level have the same dynamic
+ // subpriority under RMS: just returns 0.
+
+private:
+
+ static int sort_function (void *arg1, void *arg2);
+ // = Comparison function to pass to qsort: calls instance ()->sort_comp ().
+
+ static ACE_RMS_Scheduler_Strategy *instance_;
+ // = Instance of the strategy.
+
+};
+
+
+
+class TAO_RTSched_Export ACE_MLF_Scheduler_Strategy : public ACE_Scheduler_Strategy
+ // = TITLE
+ // ACE_MLF_Scheduler_Strategy
+ //
+ // = DESCRIPTION
+ // Defines "schedule" method using Minimum Laxity First
+ // scheduling algorithm.
+{
+public:
+
+ ACE_MLF_Scheduler_Strategy (ACE_DynScheduler::Preemption_Priority minimum_critical_priority = 0);
+ // = Constructor.
+
+ virtual ~ACE_MLF_Scheduler_Strategy ();
+ // = Virtual destructor.
+
+ static ACE_MLF_Scheduler_Strategy *instance ();
+ // = Returns an instance of the strategy.
+
+ virtual int priority_comp (const Dispatch_Entry &first_entry,
+ const Dispatch_Entry &second_entry);
+ // = Just returns 0, as all dispatch entries are of equivalent
+ // static priority under MLF.
+
+ virtual void sort (Dispatch_Entry **dispatch_entries,
+ u_int count);
+ // = Sorts the dispatch entry link pointer array in ascending laxity order.
+
+ virtual ACE_DynScheduler::Dispatching_Type
+ dispatch_type (const Dispatch_Entry &entry);
+ // = Provide the dispatching queue type for the given dispatch entry.
+
+protected:
+
+ virtual long dynamic_subpriority (Dispatch_Entry &entry,
+ RtecScheduler::Time current_time);
+ // = Returns a dynamic subpriority value at the current time for
+ // the given timeline entry: if the operation has
+ // non-negative laxity, then the value is positive, and a lower
+ // laxity gives a higher dynamic subpriority; if the operation
+ // has negative laxity, the value is the (negative) laxity value.
+
+ virtual int dynamic_subpriority_comp
+ (const Dispatch_Entry &first_entry,
+ const Dispatch_Entry &second_entry);
+ // = Orders two dispatch entries by ascending laxity: returns -1 if the
+ // first Dispatch_Entry is greater in the order, 0 if they're equivalent,
+ // or 1 if the second Dispatch_Entry is greater in the order.
+
+private:
+
+ static int sort_function (void *arg1, void *arg2);
+ // = Comparison function to pass to qsort: calls instance ()->sort_comp ().
+
+ static ACE_MLF_Scheduler_Strategy *instance_;
+ // = Instance of the strategy
+
+};
+
+
+class TAO_RTSched_Export ACE_EDF_Scheduler_Strategy : public ACE_Scheduler_Strategy
+ // = TITLE
+ // ACE_EDF_Scheduler_Strategy
+ //
+ // = DESCRIPTION
+ // Defines "schedule" method using Earliest Deadline First
+ // scheduling algorithm.
+{
+public:
+
+ ACE_EDF_Scheduler_Strategy (ACE_DynScheduler::Preemption_Priority minimum_critical_priority = 0);
+ // = Default constructor.
+
+ virtual ~ACE_EDF_Scheduler_Strategy ();
+ // = Virtual destructor.
+
+ static ACE_EDF_Scheduler_Strategy *instance ();
+ // = Returns an instance of the strategy.
+
+ virtual int priority_comp (const Dispatch_Entry &first_entry,
+ const Dispatch_Entry &second_entry);
+ // = Returns 0, as all dispatch entries are of equivalent
+ // priority under EDF.
+
+ virtual void sort (Dispatch_Entry **dispatch_entries,
+ u_int count);
+ // = Sorts the dispatch entry link pointer array
+ // in ascending deadline (period) order.
+
+ virtual ACE_DynScheduler::Dispatching_Type
+ dispatch_type (const Dispatch_Entry &entry);
+ // = Provide the dispatching queue type for the given dispatch entry.
+
+protected:
+
+ virtual long dynamic_subpriority (Dispatch_Entry &entry,
+ RtecScheduler::Time current_time);
+ // = Returns a dynamic subpriority value at the current time for the
+ // given timeline entry: if the operation has non-negative
+ // time to deadline, then value is positive, and a shorter time to
+ // deadline gives a higher dynamic subpriority; if the operation has a
+ // negative time to deadline, the value is (negative) time to deadline.
+
+
+ virtual int dynamic_subpriority_comp
+ (const Dispatch_Entry &first_entry,
+ const Dispatch_Entry &second_entry);
+ // = Orders two dispatch entries by ascending time to deadline: returns -1
+ // if the first Dispatch_Entry is greater in the order, 0 if they're
+ // equivalent, or 1 if the second Dispatch_Entry is greater in the order.
+
+private:
+
+ static int sort_function (void *arg1, void *arg2);
+ // = Comparison function to pass to qsort: calls instance ()->sort_comp ().
+
+ static ACE_EDF_Scheduler_Strategy *instance_;
+ // = Instance of the strategy.
+
+};
+
+
+class TAO_RTSched_Export ACE_Criticality_Scheduler_Strategy : public ACE_Scheduler_Strategy
+ // = TITLE
+ // ACE_Criticality_Scheduler_Strategy
+ //
+ // = DESCRIPTION
+ // Defines "schedule" method using a simple mapping directly from
+ // operation criticality to static priority.
+{
+public:
+
+ ACE_Criticality_Scheduler_Strategy (ACE_DynScheduler::Preemption_Priority minimum_critical_priority = 0);
+ // = Constructor.
+
+ virtual ~ACE_Criticality_Scheduler_Strategy ();
+ // = Virtual destructor.
+
+ static ACE_Criticality_Scheduler_Strategy *instance ();
+ // = Returns an instance of the strategy.
+
+ virtual int priority_comp (const Dispatch_Entry &first_entry,
+ const Dispatch_Entry &second_entry);
+ // = Compares two dispatch entries by minimum period: returns -1 if the
+ // first Dispatch_Entry is greater in the order, 0 if they're equivalent,
+ // or 1 if the second Dispatch_Entry is greater in the order.
+
+ virtual void sort (Dispatch_Entry **dispatch_entries,
+ u_int count);
+ // = Sort the dispatch entry link pointer array in descending
+ // criticality order.
+
+ virtual ACE_DynScheduler::Preemption_Priority minimum_critical_priority ();
+ // = Determine the minimum critical priority number.
+
+ virtual ACE_DynScheduler::Dispatching_Type
+ dispatch_type (const Dispatch_Entry &entry);
+ // Provide the dispatching queue type for the given dispatch entry.
+
+protected:
+
+ virtual long dynamic_subpriority (Dispatch_Entry &entry,
+ RtecScheduler::Time current_time);
+ // = Just returns 0: all operations have
+ // the same dynamic subpriority value.
+
+ virtual int dynamic_subpriority_comp
+ (const Dispatch_Entry &first_entry,
+ const Dispatch_Entry &second_entry);
+ // = All dispatches in a given priority level have the same dynamic
+ // subpriority under this strategy: just returns 0.
+
+private:
+
+ static int sort_function (void *arg1, void *arg2);
+ // = Comparison function to pass to qsort: calls instance ()->sort_comp ().
+
+ static ACE_Criticality_Scheduler_Strategy *instance_;
+ // = Instance of the strategy.
+
+};
+
+
+TAO_END_VERSIONED_NAMESPACE_DECL
+
+#include /**/ "ace/post.h"
+#endif /* STRATEGY_SCHEDULER_H */
+
+// EOF
diff --git a/TAO/orbsvcs/orbsvcs/Sched/sched_export.h b/TAO/orbsvcs/orbsvcs/Sched/sched_export.h
new file mode 100644
index 00000000000..422a13eed9a
--- /dev/null
+++ b/TAO/orbsvcs/orbsvcs/Sched/sched_export.h
@@ -0,0 +1,40 @@
+
+// -*- C++ -*-
+// $Id$
+// Definition for Win32 Export directives.
+// This file is generated automatically by generate_export_file.pl
+// ------------------------------
+#ifndef TAO_RTSCHED_EXPORT_H
+#define TAO_RTSCHED_EXPORT_H
+
+#include "ace/config-all.h"
+
+#if defined (TAO_AS_STATIC_LIBS)
+# if !defined (TAO_RTSCHED_HAS_DLL)
+# define TAO_RTSCHED_HAS_DLL 0
+# endif /* ! TAO_RTSCHED_HAS_DLL */
+#else
+# if !defined (TAO_RTSCHED_HAS_DLL)
+# define TAO_RTSCHED_HAS_DLL 1
+# endif /* ! TAO_RTSCHED_HAS_DLL */
+#endif
+
+#if defined (TAO_RTSCHED_HAS_DLL) && (TAO_RTSCHED_HAS_DLL == 1)
+# if defined (TAO_RTSCHED_BUILD_DLL)
+# define TAO_RTSched_Export ACE_Proper_Export_Flag
+# define TAO_RTSCHED_SINGLETON_DECLARATION(T) ACE_EXPORT_SINGLETON_DECLARATION (T)
+# define TAO_RTSCHED_SINGLETON_DECLARE(SINGLETON_TYPE, CLASS, LOCK) ACE_EXPORT_SINGLETON_DECLARE(SINGLETON_TYPE, CLASS, LOCK)
+# else /* TAO_RTSCHED_BUILD_DLL */
+# define TAO_RTSched_Export ACE_Proper_Import_Flag
+# define TAO_RTSCHED_SINGLETON_DECLARATION(T) ACE_IMPORT_SINGLETON_DECLARATION (T)
+# define TAO_RTSCHED_SINGLETON_DECLARE(SINGLETON_TYPE, CLASS, LOCK) ACE_IMPORT_SINGLETON_DECLARE(SINGLETON_TYPE, CLASS, LOCK)
+# endif /* TAO_RTSCHED_BUILD_DLL */
+#else /* TAO_RTSCHED_HAS_DLL == 1 */
+# define TAO_RTSched_Export
+# define TAO_RTSCHED_SINGLETON_DECLARATION(T)
+# define TAO_RTSCHED_SINGLETON_DECLARE(SINGLETON_TYPE, CLASS, LOCK)
+#endif /* TAO_RTSCHED_HAS_DLL == 1 */
+
+#endif /* TAO_RTSCHED_EXPORT_H */
+
+// End of auto generated file.
diff --git a/TAO/orbsvcs/orbsvcs/Scheduler_Factory.cpp b/TAO/orbsvcs/orbsvcs/Scheduler_Factory.cpp
new file mode 100644
index 00000000000..44ebd3e82b3
--- /dev/null
+++ b/TAO/orbsvcs/orbsvcs/Scheduler_Factory.cpp
@@ -0,0 +1,795 @@
+// $Id$
+
+#include "ace/OS.h"
+#include "ace/Singleton.h"
+#include "ace/Null_Mutex.h"
+
+#include "orbsvcs/Runtime_Scheduler.h"
+#include "orbsvcs/Sched/Reconfig_Scheduler.h"
+#include "orbsvcs/Sched/Reconfig_Sched_Utils.h"
+#include "orbsvcs/Scheduler_Factory.h"
+
+#if ! defined (__ACE_INLINE__)
+#include "orbsvcs/Scheduler_Factory.i"
+#endif /* __ACE_INLINE__ */
+
+ACE_RCSID(orbsvcs,
+ Scheduler_Factory,
+ "$Id$")
+
+TAO_BEGIN_VERSIONED_NAMESPACE_DECL
+
+// Initialize static class members.
+RtecScheduler::Scheduler_ptr ACE_Scheduler_Factory::server_ = 0;
+ACE_Scheduler_Factory::Factory_Status ACE_Scheduler_Factory::status_ =
+ ACE_Scheduler_Factory::UNINITIALIZED;
+
+
+RtecScheduler::Period_t ACE_Scheduler_Factory::period_default_ = 0;
+RtecScheduler::Threads_t ACE_Scheduler_Factory::threads_default_ = 0;
+RtecScheduler::Importance_t ACE_Scheduler_Factory::importance_default_ = RtecScheduler::MEDIUM_IMPORTANCE;
+RtecScheduler::Criticality_t ACE_Scheduler_Factory::criticality_default_ = RtecScheduler::HIGH_CRITICALITY;
+RtecScheduler::RT_Info_Enabled_Type_t ACE_Scheduler_Factory::rt_info_enable_state_default_ = RtecScheduler::RT_INFO_NON_VOLATILE;
+
+RtecScheduler::Period_t ACE_Scheduler_Factory::period_default()
+{
+ return period_default_;
+}
+
+RtecScheduler::Threads_t ACE_Scheduler_Factory::threads_default()
+{
+ return threads_default_;
+}
+
+RtecScheduler::Importance_t ACE_Scheduler_Factory::importance_default()
+{
+ return importance_default_;
+}
+
+RtecScheduler::Criticality_t ACE_Scheduler_Factory::criticality_default()
+{
+ return criticality_default_;
+}
+
+void ACE_Scheduler_Factory::period_default(RtecScheduler::Period_t period_default)
+{
+ period_default_ = period_default;
+}
+
+void ACE_Scheduler_Factory::threads_default(RtecScheduler::Threads_t threads_default)
+{
+ threads_default_ = threads_default;
+}
+
+void ACE_Scheduler_Factory::importance_default(RtecScheduler::Importance_t importance_default)
+{
+ importance_default_ = importance_default;
+}
+
+void ACE_Scheduler_Factory::criticality_default(RtecScheduler::Criticality_t criticality_default)
+{
+ criticality_default_ = criticality_default;
+}
+
+RtecScheduler::RT_Info_Enabled_Type_t ACE_Scheduler_Factory::rt_info_enable_state_default()
+{
+ return rt_info_enable_state_default_;
+}
+
+void ACE_Scheduler_Factory::rt_info_enable_state_default(RtecScheduler::RT_Info_Enabled_Type_t rt_info_enable_state_default)
+{
+ rt_info_enable_state_default_ = rt_info_enable_state_default;
+}
+
+// This symbols are extern because the automatic template
+// instantiation mechanism in SunCC gets confused otherwise.
+int TAO_SF_config_count = -1;
+ACE_Scheduler_Factory::POD_Config_Info* TAO_SF_config_info = 0;
+int TAO_SF_entry_count = -1;
+ACE_Scheduler_Factory::POD_RT_Info* TAO_SF_rt_info = 0;
+int TAO_SF_dependency_count = -1;
+ACE_Scheduler_Factory::POD_Dependency_Info* TAO_SF_dep_info = 0;
+
+struct ACE_Scheduler_Factory_Data
+{
+ // = TITLE
+ // Helper struct, to encapsulate the singleton static server and
+ // ACE_TSS objects. We can't use ACE_Singleton directly, because
+ // construction of ACE_Runtime_Scheduler takes arguments.
+
+/* WSOA merge - commented out
+ ACE_Runtime_Scheduler scheduler_;
+ // The static runtime scheduler.
+*/
+
+ TAO_Reconfig_Scheduler<TAO_MUF_FAIR_Reconfig_Sched_Strategy, ACE_SYNCH_MUTEX> scheduler_;
+ // The scheduler.
+
+ ACE_TSS<ACE_TSS_Type_Adapter<RtecScheduler::Preemption_Priority_t> >
+ preemption_priority_;
+ // The dispatch queue number of the calling thread. For access by
+ // applications; must be set by either the application or Event
+ // Channel.
+
+ ACE_Scheduler_Factory_Data (void)
+ : scheduler_ (TAO_SF_config_count,
+ TAO_SF_config_info,
+ TAO_SF_entry_count,
+ TAO_SF_rt_info,
+ TAO_SF_dependency_count,
+ TAO_SF_dep_info,
+ 0),
+ preemption_priority_ ()
+ {
+ }
+};
+
+static ACE_Scheduler_Factory_Data *ace_scheduler_factory_data = 0;
+
+int ACE_Scheduler_Factory::use_runtime (int cc,
+ POD_Config_Info cfgi[],
+ int ec,
+ POD_RT_Info rti[])
+{
+ if (server_ != 0 || TAO_SF_entry_count != -1)
+ ACE_ERROR_RETURN ((LM_ERROR,
+ ACE_TEXT("ACE_Scheduler_Factory::use_runtime - ")
+ ACE_TEXT("server already configured\n")),
+ -1);
+ TAO_SF_config_count = cc;
+ TAO_SF_config_info = cfgi;
+ TAO_SF_entry_count = ec;
+ TAO_SF_rt_info = rti;
+ status_ = ACE_Scheduler_Factory::RUNTIME;
+
+ return 0;
+}
+
+static RtecScheduler::Scheduler_ptr
+static_server (void)
+{
+ RtecScheduler::Scheduler_ptr server_ = 0;
+
+ // This isn't thread safe, but the static instance that it replaces
+ // wasn't thread safe either. Hola, Sr. Sandiego :-) If it needs to
+ // be made thread safe, it should be protected using double-checked
+ // locking.
+ if (! ace_scheduler_factory_data &&
+ (ace_scheduler_factory_data =
+ ACE_Singleton<ACE_Scheduler_Factory_Data,
+ ACE_Null_Mutex>::instance ()) == 0)
+ return 0;
+
+ ACE_DECLARE_NEW_CORBA_ENV;
+ ACE_TRY
+ {
+ server_ = ace_scheduler_factory_data->scheduler_._this (ACE_ENV_SINGLE_ARG_PARAMETER);
+ ACE_TRY_CHECK;
+
+ ACE_DEBUG ((LM_DEBUG,
+ ACE_TEXT("ACE_Scheduler_Factory - configured static server\n")));
+ }
+ ACE_CATCHANY
+ {
+ ACE_PRINT_EXCEPTION (ACE_ANY_EXCEPTION,
+ ACE_TEXT("ACE_Scheduler_Factory::config_runtime - ")
+ ACE_TEXT("cannot allocate server\n"));
+ }
+ ACE_ENDTRY;
+
+ return server_;
+}
+
+int
+ACE_Scheduler_Factory::use_config (CosNaming::NamingContext_ptr naming)
+{
+ return ACE_Scheduler_Factory::use_config (naming,
+ "ScheduleService");
+}
+
+int
+ACE_Scheduler_Factory::use_config (CosNaming::NamingContext_ptr naming,
+ const char* name)
+{
+ if (server_ != 0 || TAO_SF_entry_count != -1)
+ // No errors, runtime execution simply takes precedence over
+ // config runs.
+ return 0;
+
+ ACE_DECLARE_NEW_CORBA_ENV;
+ ACE_TRY
+ {
+ CosNaming::Name schedule_name (1);
+ schedule_name.length (1);
+ schedule_name[0].id = CORBA::string_dup (name);
+ CORBA::Object_var objref =
+ naming->resolve (schedule_name
+ ACE_ENV_ARG_PARAMETER);
+ ACE_TRY_CHECK;
+
+ server_ =
+ RtecScheduler::Scheduler::_narrow(objref.in ()
+ ACE_ENV_ARG_PARAMETER);
+ ACE_TRY_CHECK;
+ }
+ ACE_CATCHANY
+ {
+ server_ = 0;
+ ACE_PRINT_EXCEPTION (ACE_ANY_EXCEPTION,
+ ACE_TEXT("ACE_Scheduler_Factory::use_config - ")
+ ACE_TEXT(" exception while resolving server\n"));
+ }
+ ACE_ENDTRY;
+
+ status_ = ACE_Scheduler_Factory::CONFIG;
+ return 0;
+}
+
+int
+ACE_Scheduler_Factory::server (RtecScheduler::Scheduler_ptr sptr)
+{
+ if (server_ != 0 || TAO_SF_entry_count != -1)
+ return -1;
+
+ server_ = RtecScheduler::Scheduler::_duplicate (sptr);
+ return 0;
+}
+
+RtecScheduler::Scheduler_ptr
+ACE_Scheduler_Factory::server (void)
+{
+ if (server_ == 0 && TAO_SF_entry_count != -1)
+ server_ = static_server ();
+
+ if (server_ == 0)
+ ACE_ERROR_RETURN ((LM_ERROR,
+ ACE_TEXT("ACE_Scheduler_Factor::server - ")
+ ACE_TEXT("no scheduling service configured\n")),
+ 0);
+ return server_;
+}
+
+static char header[] =
+"// $Id $\n\n"
+"// This file was automatically generated by the Scheduler_Factory.\n"
+"// Before editing the file please consider generating it again.\n"
+"\n"
+"#include \"orbsvcs/Scheduler_Factory.h\"\n"
+"\n";
+
+static char footer[] =
+"\n"
+"// This sets up Scheduler_Factory to use the runtime version.\n"
+"int scheduler_factory_setup = \n"
+" ACE_Scheduler_Factory::use_runtime (configs_size, configs, infos_size, infos);\n"
+"\n"
+"// EOF\n";
+
+static char start_anomalies_found[] =
+"\n// The following scheduling anomalies were detected:\n";
+
+static char start_anomalies_none[] =
+"\n// There were no scheduling anomalies.\n";
+
+static char start_infos[] =
+"\n\nstatic ACE_Scheduler_Factory::POD_RT_Info infos[] = {\n";
+
+static char end_infos[] =
+"};\n\n"
+"static int infos_size = sizeof(infos)/sizeof(infos[0]);\n\n";
+
+static char end_infos_empty[] =
+"};\n\n"
+"static int infos_size = 0;\n\n";
+
+static char start_dependencies[] =
+"\n\nstatic ACE_Scheduler_Factory::POD_Dependency_Info dependencies[] = {\n";
+
+static char end_dependencies[] =
+"};\n\n"
+"static int dependencies_size = sizeof(dependencies)/sizeof(dependencies[0]);\n\n";
+
+static char end_dependencies_empty[] =
+"};\n\n"
+"static int dependencies_size = 0;\n\n";
+
+static char start_configs[] =
+"\nstatic ACE_Scheduler_Factory::POD_Config_Info configs[] = {\n";
+
+static char end_configs[] =
+"};\n\n"
+"static int configs_size = sizeof(configs)/sizeof(configs[0]);\n\n";
+
+static char end_configs_empty[] =
+"};\n\n"
+"static int configs_size = 0;\n\n";
+
+int ACE_Scheduler_Factory::dump_schedule
+ (const RtecScheduler::RT_Info_Set& infos,
+ const RtecScheduler::Dependency_Set& dependencies,
+ const RtecScheduler::Config_Info_Set& configs,
+ const RtecScheduler::Scheduling_Anomaly_Set& anomalies,
+ const char* file_name,
+ const char* rt_info_format,
+ const char* dependency_format,
+ const char* config_info_format,
+ int dump_disabled_infos,
+ int dump_disabled_dependencies)
+{
+ u_int i;
+ char entry_point [BUFSIZ];
+
+ // Default format for printing RT_Info output.
+ if (rt_info_format == 0)
+ rt_info_format = "{%20s, /* entry_point */\n"
+ "%10d, /* handle */\n"
+ "%10d, /* worst_case_execution_time */,\n"
+ "%10d, /* typical_execution_time */,\n"
+ "%10d, /* cached_execution_time */,\n"
+ "%10d, /* period */\n"
+ "(RtecScheduler::Criticality_t) %d, /* [ VL_C = 0, L_C = 1, M_C = 2, H_C = 3, VH_C = 4] */\n"
+ "(RtecScheduler::Importance_t) %d, /* [ VL_I = 0, L_I = 1, M_I = 2, H_I = 3, VH_I = 4] */\n"
+ "%10d, /* quantum */\n"
+ "%10d, /* threads */\n"
+ "%10d, /* priority */\n"
+ "%10d, /* preemption_subpriority */\n"
+ "%10d, /* preemption_priority */\n"
+ "(RtecScheduler::Info_Type_t) %d, /* [OPERATION = 0, CONJUNCTION = 1, DISJUNCTION = 2, REMOTE_DEPENDANT = 3] */\n"
+ "(RtecScheduler::RT_Info_Enabled_Type_t) %d } /* [RT_INFO_DISABLED = 0, RT_INFO_ENABLED = 1, RT_INFO_NON_VOLATILE = 2] */\n";
+
+
+ // Default format for printing dependency output.
+ if (dependency_format == 0)
+ dependency_format = " { (RtecScheduler::Dependency_Type_t) %d, %10d, "
+ "%10d, %10d,"
+ "(RtecScheduler::Dependency_Enabled_Type_t) %d }";
+
+ // Default format for printing Config_Info output.
+ if (config_info_format == 0)
+ config_info_format = " { %10d, %10d, "
+ "(RtecScheduler::Dispatching_Type_t) %d }";
+
+ FILE* file = stdout;
+ if (file_name != 0)
+ {
+ file = ACE_OS::fopen (ACE_TEXT_CHAR_TO_TCHAR(file_name), ACE_TEXT("w"));
+ if (file == 0)
+ return -1;
+ }
+ ACE_OS::fprintf (file, header);
+
+ // Indicate anomalies encountered during scheduling.
+
+ ACE_OS::fprintf(file, (anomalies.length () > 0
+ ? start_anomalies_found
+ : start_anomalies_none));
+
+ for (i = 0; i < anomalies.length (); ++i)
+ {
+ const RtecScheduler::Scheduling_Anomaly& anomaly = anomalies[i];
+ switch (anomaly.severity)
+ {
+ case RtecScheduler::ANOMALY_FATAL:
+ ACE_OS::fprintf(file, "FATAL: ");
+ break;
+
+ case RtecScheduler::ANOMALY_ERROR:
+ ACE_OS::fprintf(file, "ERROR: ");
+ break;
+
+ case RtecScheduler::ANOMALY_WARNING:
+ ACE_OS::fprintf(file, "// WARNING: ");
+ break;
+
+ default:
+ ACE_OS::fprintf(file, "// UNKNOWN: ");
+ break;
+ }
+
+ ACE_OS::fprintf (file,
+ "%s\n",
+ (const char *) anomaly.description);
+ }
+
+ // Print out banner indicating which infos are dumped.
+ if (dump_disabled_infos)
+ {
+ ACE_OS::fprintf (file, "\n// Both enabled and disabled RT_Infos were dumped to this file.\n\n");
+ }
+ else
+ {
+ ACE_OS::fprintf (file, "\n// Only enabled RT_Infos were dumped to this file.\n\n");
+ }
+
+ // Print out operation QoS info.
+ ACE_OS::fprintf (file, start_infos);
+
+ for (i = 0;
+ i < infos.length ();
+ ++i)
+ {
+ const RtecScheduler::RT_Info& info = infos[i];
+
+ if (dump_disabled_infos
+ || info.enabled == RtecScheduler::RT_INFO_ENABLED
+ || info.enabled == RtecScheduler::RT_INFO_NON_VOLATILE)
+ {
+ if (i != 0)
+ // Finish previous line.
+ ACE_OS::fprintf(file, ",\n");
+
+ const RtecScheduler::RT_Info& info = infos[i];
+
+ // Put quotes around the entry point name, exactly as it is stored.
+ ACE_OS::sprintf (entry_point,
+ "\"%s\"",
+ (const char *) info.entry_point);
+
+ // @@ TODO Eventually the TimeT structure will be a 64-bit
+ // unsigned int, we will have to change this dump method then.
+ ACE_OS::fprintf (file,
+ rt_info_format,
+ entry_point,
+ info.handle,
+ ACE_CU64_TO_CU32 (info.worst_case_execution_time),
+ ACE_CU64_TO_CU32 (info.typical_execution_time),
+ ACE_CU64_TO_CU32 (info.cached_execution_time),
+ info.period,
+ info.criticality,
+ info.importance,
+ ACE_CU64_TO_CU32 (info.quantum),
+ info.threads,
+ info.priority,
+ info.preemption_subpriority,
+ info.preemption_priority,
+ info.info_type,
+ info.enabled);
+ }
+ }
+
+ // Finish last line.
+ ACE_OS::fprintf(file, "\n");
+
+ if (infos.length () > 0)
+ ACE_OS::fprintf (file, end_infos);
+ else
+ ACE_OS::fprintf (file, end_infos_empty);
+
+ // Print out banner indicating which dependencies are dumped.
+ if (dump_disabled_dependencies)
+ {
+ ACE_OS::fprintf (file, "\n// Both enabled and disabled dependencies were dumped to this file.\n\n");
+ }
+ else
+ {
+ ACE_OS::fprintf (file, "\n// Only enabled dependencies were dumped to this file.\n\n");
+ }
+
+ // Print out operation dependency info.
+ ACE_OS::fprintf (file, start_dependencies);
+
+ for (i = 0;
+ i < dependencies.length ();
+ ++i)
+ {
+ const RtecScheduler::Dependency_Info& dep = dependencies[i];
+
+ if (dump_disabled_infos
+ || dep.enabled == RtecBase::DEPENDENCY_ENABLED
+ || dep.enabled == RtecBase::DEPENDENCY_NON_VOLATILE)
+ {
+ // Finish previous line.
+ if (i != 0)
+ {
+ ACE_OS::fprintf (file, ",\n");
+ }
+
+ ACE_OS::fprintf (file,
+ dependency_format,
+ dep.dependency_type,
+ dep.number_of_calls,
+ dep.rt_info,
+ dep.rt_info_depended_on,
+ dep.enabled);
+ }
+ }
+
+ // Finish last line.
+ ACE_OS::fprintf (file, "\n");
+
+ if (dependencies.length () > 0)
+ ACE_OS::fprintf (file, end_dependencies);
+ else
+ ACE_OS::fprintf (file, end_dependencies_empty);
+
+
+ // Print out queue configuration info.
+ ACE_OS::fprintf (file, start_configs);
+
+ for (i = 0;
+ i < configs.length ();
+ ++i)
+ {
+ if (i != 0)
+ // Finish previous line.
+ ACE_OS::fprintf (file, ",\n");
+
+ const RtecScheduler::Config_Info& config = configs[i];
+ ACE_OS::fprintf (file,
+ config_info_format,
+ config.preemption_priority,
+ config.thread_priority,
+ config.dispatching_type);
+ }
+
+ // Finish last line.
+ ACE_OS::fprintf (file, "\n");
+
+ if (configs.length () > 0)
+ ACE_OS::fprintf (file, end_configs);
+ else
+ ACE_OS::fprintf (file, end_configs_empty);
+
+ ACE_OS::fprintf (file, footer);
+ ACE_OS::fclose (file);
+ return 0;
+}
+
+void ACE_Scheduler_Factory::log_scheduling_entry(TAO_Reconfig_Scheduler_Entry * entry, FILE* file)
+{
+
+ if( entry == 0 )
+ {
+ ACE_OS::fprintf (file, "Entry is NULL");
+ return;
+ }
+
+ // Print out the actual rt_info data
+ const char* rt_info_format = "{%20s, /* entry_point */\n"
+ "%10d, /* handle */\n"
+ "%10d, /* period */\n"
+ "%10d, /* criticality */\n"
+ "%10d, /* threads */\n"
+ "%10d, /* priority */\n"
+ "%10d, /* preemption_subpriority */\n"
+ "%10d, /* preemption_priority */\n"
+ "%10d /* enabled */\n";
+
+ TAO_RT_Info_Ex* actual_info = entry->actual_rt_info();
+
+ ACE_OS::fprintf (file,
+ rt_info_format,
+ actual_info->entry_point.in(),
+ actual_info->handle,
+ actual_info->period,
+ actual_info->criticality,
+ actual_info->threads,
+ actual_info->priority,
+ actual_info->preemption_subpriority,
+ actual_info->preemption_priority,
+ actual_info->enabled);
+
+
+ // Print out the current admitted tuple
+ const char* admitted_tuple_format = " {"
+ "%13d, /* handle */\n"
+ "%13d, /* rate_index */\n"
+ "%13d, /* period */\n"
+ "%13d, /* criticality */\n"
+ "%13d, /* priority */\n"
+ "%13d, /* preemption_subpriority */\n"
+ "%13d, /* preemption_priority */\n"
+ "%13d } /* enabled */\n";
+
+ TAO_RT_Info_Tuple* current_admitted_tuple = entry->current_admitted_tuple();
+
+ ACE_OS::fprintf(file, "\n Current admitted Tuple:\n");
+ if( current_admitted_tuple == 0 )
+ {
+ ACE_OS::fprintf (file, " =>NONE_ADMITTED\n");
+ }
+ else
+ {
+ ACE_OS::fprintf (file,
+ admitted_tuple_format,
+ current_admitted_tuple->handle,
+ current_admitted_tuple->rate_index,
+ current_admitted_tuple->period,
+ current_admitted_tuple->criticality,
+ current_admitted_tuple->priority,
+ current_admitted_tuple->preemption_subpriority,
+ current_admitted_tuple->preemption_priority,
+ current_admitted_tuple->enabled);
+ }
+
+ // Print out the orig_tuple_subset_
+ ACE_OS::fprintf(file, "\n Original Tuple Subset\n {\n");
+ log_tuple_subset(entry->orig_tuple_subset(), file);
+ ACE_OS::fprintf(file, "\n }");
+
+ // Print out the prop_tuple_subset_
+ ACE_OS::fprintf(file, "\n Propagated Tuple Subset\n {\n");
+ log_tuple_subset(entry->prop_tuple_subset(), file);
+ ACE_OS::fprintf(file, "\n }\n}");
+
+
+}
+
+void ACE_Scheduler_Factory::log_tuple_subset(TUPLE_SET & tuple_subset,
+ FILE* file)
+{
+ TAO_RT_Info_Tuple **tuple_ptr_ptr;
+ const char* subset_tuple_format = " {\n"
+ "%13d, /* handle */\n"
+ "%13d, /* rate_index */\n"
+ "%13d, /* period */\n"
+ "%13d, /* criticality */\n"
+ "%13d, /* threads */\n"
+ "%13d, /* priority */\n"
+ "%13d, /* preemption_subpriority */\n"
+ "%13d, /* preemption_priority */\n"
+ "%13d } /* enabled */\n";
+
+ TUPLE_SET_ITERATOR
+ tuple_iter (tuple_subset);
+
+
+ while (tuple_iter.done () == 0)
+ {
+ // Get a pointer to the tuple COPY under the iterator.
+ if (tuple_iter.next (tuple_ptr_ptr) == 0
+ || tuple_ptr_ptr == 0 || ((*tuple_ptr_ptr) == 0) )
+ {
+ ACE_OS::fprintf (file, "{ NULL TUPLE POINTER }\n");
+ }
+ else
+ {
+
+ ACE_OS::fprintf (file,
+ subset_tuple_format,
+ (*tuple_ptr_ptr)->handle,
+ (*tuple_ptr_ptr)->rate_index,
+ (*tuple_ptr_ptr)->period,
+ (*tuple_ptr_ptr)->criticality,
+ (*tuple_ptr_ptr)->threads,
+ (*tuple_ptr_ptr)->priority,
+ (*tuple_ptr_ptr)->preemption_subpriority,
+ (*tuple_ptr_ptr)->preemption_priority,
+ (*tuple_ptr_ptr)->enabled);
+ }
+
+ tuple_iter.advance ();
+ }
+}
+
+int
+ACE_Scheduler_Factory::log_scheduling_entries(TAO_Reconfig_Scheduler_Entry ** entry_ptr_array,
+ long entry_ptr_array_size,
+ const char* file_name)
+{
+ // Open the file
+ FILE* file = stdout;
+ if (file_name != 0)
+ {
+ file = ACE_OS::fopen (file_name, ACE_TEXT ("w"));
+ if (file == 0)
+ return -1;
+ }
+
+
+ // Iterate through the array. The index is the (handle - 1) of the rt_info in the array
+ for(int index = 0; index < entry_ptr_array_size; ++index)
+ {
+ ACE_OS::fprintf(file, "\n\nScheduler Entry Array contents\n");
+ TAO_Reconfig_Scheduler_Entry * entry = entry_ptr_array[index];
+
+ log_scheduling_entry(entry, file);
+
+
+ }
+
+
+ ACE_OS::fclose (file);
+ return 0;
+
+}
+
+void
+ACE_Scheduler_Factory::log_scheduling_tuples(
+ TAO_RT_Info_Tuple ** tuple_ptr_array,
+ long tuple_ptr_array_size,
+ const char* file_name)
+{
+ // Open the file
+ FILE* file = stdout;
+ if (file_name != 0)
+ {
+ file = ACE_OS::fopen (file_name, ACE_TEXT ("w"));
+ if (file == 0)
+ return;
+ }
+
+ static const char subset_tuple_format[] =
+ " {\n"
+ "%13d, /* handle */\n"
+ "%13lu, /* rate_index */\n"
+ "%13d, /* period */\n"
+ "%13d, /* criticality */\n"
+ "%13d, /* priority */\n"
+ "%13d, /* preemption_subpriority */\n"
+ "%13d, /* preemption_priority */\n"
+ "%13d } /* enabled */\n";
+
+ for (int ndx = 0; ndx < tuple_ptr_array_size; ndx++)
+ {
+ fprintf(file,
+ subset_tuple_format,
+ tuple_ptr_array[ndx]->handle,
+ tuple_ptr_array[ndx]->rate_index,
+ tuple_ptr_array[ndx]->period,
+ tuple_ptr_array[ndx]->criticality,
+ tuple_ptr_array[ndx]->priority,
+ tuple_ptr_array[ndx]->preemption_subpriority,
+ tuple_ptr_array[ndx]->preemption_priority,
+ tuple_ptr_array[ndx]->enabled);
+ }
+
+ ACE_OS::fclose (file);
+}
+#if defined (HPUX) && !defined (__GNUG__)
+ // aCC can't handle RtecScheduler::Preemption_Priority_t used as an operator
+ // name.
+ typedef CORBA::Long RtecScheduler_Preemption_Priority_t;
+#endif /* HPUX && !g++ */
+
+RtecScheduler::Preemption_Priority_t
+ACE_Scheduler_Factory::preemption_priority (void)
+{
+ // Return whatever we've got. The application or Event Channel is
+ // responsible for making sure that it was set.
+ if (ace_scheduler_factory_data->preemption_priority_.ts_object ())
+ {
+ ACE_TSS_Type_Adapter<RtecScheduler::Preemption_Priority_t> *tss =
+ ace_scheduler_factory_data->preemption_priority_;
+ // egcs 1.0.1 raises an internal compiler error if we implicitly
+ // call the type conversion operator. So, call it explicitly.
+#if defined (HPUX) && !defined (__GNUG__)
+ const RtecScheduler::Preemption_Priority_t preemption_priority =
+ static_cast<RtecScheduler::Preemption_Priority_t> (tss->operator RtecScheduler_Preemption_Priority_t ());
+#else
+ const RtecScheduler::Preemption_Priority_t preemption_priority =
+ static_cast<RtecScheduler::Preemption_Priority_t> (tss->operator RtecScheduler::Preemption_Priority_t ());
+#endif /* HPUX && !g++ */
+ return preemption_priority;
+ }
+ else
+ return static_cast<RtecScheduler::Preemption_Priority_t> (-1);
+}
+
+void
+ACE_Scheduler_Factory::set_preemption_priority
+ (const RtecScheduler::Preemption_Priority_t preemption_priority)
+{
+ // Probably don't need this, because it should be safe to assume
+ // that static_server () was called before this function. But just
+ // in case . . .
+ if (!ace_scheduler_factory_data
+ && (ace_scheduler_factory_data =
+ ACE_Singleton<ACE_Scheduler_Factory_Data,
+ ACE_Null_Mutex>::instance ()) == 0)
+ return;
+
+ ace_scheduler_factory_data->preemption_priority_->
+#if defined (HPUX) && !defined (__GNUG__)
+ // aCC can't handle the typedef.
+ operator RtecScheduler_Preemption_Priority_t & () = preemption_priority;
+#else
+ operator RtecScheduler::Preemption_Priority_t & () = preemption_priority;
+#endif /* HPUX && !g++ */
+}
+
+#if defined (ACE_HAS_EXPLICIT_STATIC_TEMPLATE_MEMBER_INSTANTIATION)
+template ACE_Singleton<ACE_Scheduler_Factory_Data, ACE_Null_Mutex> *ACE_Singleton<ACE_Scheduler_Factory_Data, ACE_Null_Mutex>::singleton_;
+#endif /* ACE_HAS_EXPLICIT_STATIC_TEMPLATE_MEMBER_INSTANTIATION */
+
+TAO_END_VERSIONED_NAMESPACE_DECL
diff --git a/TAO/orbsvcs/orbsvcs/Scheduler_Factory.h b/TAO/orbsvcs/orbsvcs/Scheduler_Factory.h
new file mode 100644
index 00000000000..f0b9fdf91ab
--- /dev/null
+++ b/TAO/orbsvcs/orbsvcs/Scheduler_Factory.h
@@ -0,0 +1,280 @@
+// -*- C++ -*-
+
+// $Id$
+
+// ============================================================================
+//
+// = LIBRARY
+// orbsvcs
+//
+// = FILENAME
+// Scheduler_Factory.h
+//
+// = AUTHOR
+// Chris Gill <cdgill@cs.wustl.edu>
+//
+// ============================================================================
+
+#ifndef ACE_SCHEDULER_FACTORY_H
+#define ACE_SCHEDULER_FACTORY_H
+#include /**/ "ace/pre.h"
+
+#include "ace/Containers_T.h"
+
+#if !defined (ACE_LACKS_PRAGMA_ONCE)
+# pragma once
+#endif /* ACE_LACKS_PRAGMA_ONCE */
+
+#include "orbsvcs/CosNamingC.h"
+#include "orbsvcs/RtecSchedulerC.h"
+#include "orbsvcs/Sched/sched_export.h"
+
+TAO_BEGIN_VERSIONED_NAMESPACE_DECL
+
+class TAO_Reconfig_Scheduler_Entry;
+struct TAO_RT_Info_Tuple;
+typedef ACE_Ordered_MultiSet<TAO_RT_Info_Tuple *> TUPLE_SET;
+typedef ACE_Ordered_MultiSet_Iterator<TAO_RT_Info_Tuple *> TUPLE_SET_ITERATOR;
+
+class TAO_RTSched_Export ACE_Scheduler_Factory
+{
+ // = TITLE
+ // Factory of scheduler services.
+ //
+ // = DESCRIPTION
+ // This class acts as a factory for scheduler servers. At config
+ // time it will return a remote server, which will actually
+ // compute the scheduling parameters. At run-time it returns a
+ // local server, which will use the results of the config runs to
+ // actually do the scheduling, without incurring in RPC overheads.
+public:
+ enum Factory_Status
+ {
+ // = TITLE
+ // Factory Status
+ //
+ // = DESCRIPTION
+ // This type enumerates the possible states of the factory:
+ // uninitialized, or in a configuration, runtime, or
+ // reconfigurable mode of operation.
+
+ UNINITIALIZED,
+ CONFIG,
+ RECONFIG,
+ RUNTIME
+ };
+
+ struct POD_RT_Info
+ {
+ // = TITLE
+ // Plain Old Data for RT_Infos.
+ //
+ // = DESCRIPTION
+ // This class provide us with a plain old data version of
+ // RT_Info, this is useful for implementing arrays of
+ // those.
+
+ const char *entry_point;
+ RtecScheduler::handle_t handle;
+ RtecScheduler::Time worst_case_execution_time;
+ RtecScheduler::Time typical_execution_time;
+ RtecScheduler::Time cached_execution_time;
+ RtecScheduler::Period_t period;
+ CORBA::Long criticality;
+ CORBA::Long importance;
+ RtecScheduler::Quantum_t quantum;
+ RtecScheduler::Threads_t threads;
+ RtecScheduler::OS_Priority priority;
+ RtecScheduler::Preemption_Subpriority_t static_subpriority;
+ RtecScheduler::Preemption_Priority_t preemption_priority;
+ CORBA::Long info_type;
+ RtecScheduler::RT_Info_Enabled_Type_t enabled;
+
+ };
+
+
+ struct POD_Dependency_Info
+ {
+ // = TITLE
+ // Plain Old Data for RT_Info Dependencies.
+ //
+ // = DESCRIPTION
+ // This class provide us with a plain old data version of
+ // dependencies between RT_Infos. This is useful for implementing
+ // arrays of those.
+
+ RtecScheduler::Dependency_Type_t dependency_type;
+ CORBA::Long number_of_calls;
+ RtecScheduler::handle_t info_that_depends;
+ RtecScheduler::handle_t info_depended_on;
+ RtecScheduler::Dependency_Enabled_Type_t enabled;
+ };
+
+ struct POD_Config_Info
+ {
+ // = TITLE
+ // Plain Old Data for dispatch queue configuration information.
+ //
+ // = DESCRIPTION
+ // This class provide us with a plain old data version of
+ // configuration info, which is useful for implementing static arrays
+ // NOTE: if used in an array, the run-time scheduler requires that the
+ // array index match the preemption priority stored in the config info
+ // at that index: this is used to detect uninitialized/corrupted schedules
+ RtecScheduler::Preemption_Priority_t preemption_priority;
+ RtecScheduler::OS_Priority thread_priority;
+ RtecScheduler::Dispatching_Type_t dispatching_type;
+ };
+
+ struct POD_Scheduling_Anomaly
+ {
+ // = TITLE
+ // Plain Old Data for scheduling anomaly information.
+ //
+ // = DESCRIPTION
+ // This class provide us with a plain old data version of
+ // scheduling anomalies, which is used to generate error
+ // and warning lines in the runtime scheduling header output.
+
+ const char* description;
+ RtecScheduler::Anomaly_Severity severity;
+ };
+
+ static int use_config (CosNaming::NamingContext_ptr naming);
+ // Setup the variables needed for a config run, using the
+ // NamingContext to locate a Scheduler.
+
+ static int use_config (CosNaming::NamingContext_ptr naming,
+ const char* name);
+ // Setup the variables needed for a config run, using the
+ // NamingContext to locate a Scheduler.
+
+ static int use_runtime (int cc,
+ POD_Config_Info cfgi[],
+ int ec,
+ POD_RT_Info rti[]);
+ // Disable config runs in the Factory and sets up the precomputed
+ // scheduling information.
+
+ static int server (RtecScheduler::Scheduler_ptr);
+ static RtecScheduler::Scheduler_ptr server (void);
+ // Return the Real-time Scheduling Service used for this run.
+ // Must have been configured either using use_context() or use_data().
+ //
+ // Normally use_data() is called at static elaboration time, so
+ // everything is automatic. On config runs use_context() is called
+ // from main, after resolve_initial_references.
+
+ static int dump_schedule (const RtecScheduler::RT_Info_Set& infos,
+ const RtecScheduler::Dependency_Set& dependencies,
+ const RtecScheduler::Config_Info_Set& configs,
+ const RtecScheduler::Scheduling_Anomaly_Set& anomalies,
+ const char* file_name = 0,
+ const char* rt_info_format = 0,
+ const char* dependency_format = 0,
+ const char* config_info_format = 0,
+ int dump_disabled_infos = 0,
+ int dump_disabled_dependencies = 0);
+ // This helper function will dump the schedule returned by a
+ // RtecScheduler::Scheduler into a file, the file can be compiled to
+ // create an efficient local implementation of the Scheduler.
+
+ // TODO: How to do cleanup()? Use the ACE_Object_Manager stuff?
+
+ static void log_scheduling_entry(TAO_Reconfig_Scheduler_Entry * entry,
+ FILE* file);
+ // This helper function prints out a single scheduling entry contents
+
+ static int log_scheduling_entries(TAO_Reconfig_Scheduler_Entry ** entry_ptr_array,
+ long entry_ptr_array_size,
+ const char* file_name);
+ // This helper function prints out the intermediate scheduling entries
+
+ static void log_scheduling_tuples(TAO_RT_Info_Tuple ** tuple_ptr_array,
+ long tuple_ptr_array_size,
+ const char* file_name);
+ // This helper function prints out the arry used to create scheduling entries
+ // sorted in topological order then priority order
+
+ static void log_tuple_subset(TUPLE_SET & tuple_subset,
+ FILE* file);
+
+ static Factory_Status status (void);
+ // This helper function allows the application to determine whether
+ // the factory is uninitialized, or in a config or runtime mode of
+ // operation.
+
+ // = Access the (OS independent) preemption priority of the calling thread.
+ static RtecScheduler::Preemption_Priority_t preemption_priority ();
+ // Returns (u_int) -1 if the preemption priority hadn't been set.
+
+ // = Set the (OS independent) preemption priority of the calling thread.
+ static void set_preemption_priority
+ (const RtecScheduler::Preemption_Priority_t);
+ // The application or Event Channel is responsible for making sure
+ // that the preemption priority is set before any access of the
+ // preemption priority.
+
+ // Accessor for obtaining the default period (Boeing Extension)
+ static RtecScheduler::Period_t period_default();
+ // Method for setting the default period (Boeing Extension)
+ static void period_default(RtecScheduler::Period_t period_default);
+
+ // Accessor for obtaining the default threads (Boeing Extension)
+ static RtecScheduler::Threads_t threads_default();
+ // Method for setting the default threads (Boeing Extension)
+ static void threads_default(RtecScheduler::Threads_t threads_default);
+
+ // Accessor for obtaining the default importance (VERY_LOW_IMPORTANCE to VERY_HIGH_IMPORTANCE). (Boeing Extension)
+ static RtecScheduler::Importance_t importance_default();
+ // Method for setting the default importance (VERY_LOW_IMPORTANCE to VERY_HIGH_IMPORTANCE). (Boeing Extension)
+ static void importance_default(RtecScheduler::Importance_t importance_default);
+
+ // Accessor for obtaining the default criticality (VERY_LOW_CRITICALITY to VERY_HIGH_CRITICALITY). (Boeing Extension)
+ static RtecScheduler::Criticality_t criticality_default();
+ // Method for setting the default criticality (VERY_LOW_CRITICALITY to VERY_HIGH_CRITICALITY). (Boeing Extension)
+ static void criticality_default(RtecScheduler::Criticality_t criticality_default);
+
+ // Accessor for obtaining the default rt_info enabled state. (RT_INFO_DISABLED, RT_INFO_ENABLED, or RT_INFO_NON_VOLATILE)
+ static RtecScheduler::RT_Info_Enabled_Type_t rt_info_enable_state_default();
+
+ // Method for setting the default rt_info enabled state. (RT_INFO_DISABLED, RT_INFO_ENABLED, or RT_INFO_NON_VOLATILE)
+ static void rt_info_enable_state_default(RtecScheduler::RT_Info_Enabled_Type_t rt_info_enable_state_default);
+
+protected:
+
+ static int no_config_run (void);
+ // By default this factory assumes we are runnning a config
+ // run. Calling this method disables that. Since the methods
+ // returns an int it can be used to initialize a static variable,
+ // hence calling it before main(); this technique can be used in the
+ // code emitted for the run-time scheduler, automagically disabling
+ // the config_run() when that code is linked in.
+
+private:
+ static RtecScheduler::Scheduler_ptr server_;
+
+ static Factory_Status status_;
+ // Default period configuration. (Boeing Extension)
+ static RtecScheduler::Period_t period_default_;
+ // Default threads configuration. (Boeing Extension)
+ static RtecScheduler::Threads_t threads_default_;
+
+ // Default importance configuration. (Boeing Extension)
+ static RtecScheduler::Importance_t importance_default_;
+ // Default criticality. (Boeing Extension)
+ static RtecScheduler::Criticality_t criticality_default_;
+
+ // Default rt_info enabled state. (Boeing Extension)
+ static RtecScheduler::RT_Info_Enabled_Type_t rt_info_enable_state_default_;
+
+};
+
+TAO_END_VERSIONED_NAMESPACE_DECL
+
+#if defined (__ACE_INLINE__)
+#include "orbsvcs/Scheduler_Factory.i"
+#endif /* __ACE_INLINE__ */
+
+#include /**/ "ace/post.h"
+#endif /* ACE_SCHEDULER_FACTORY_H */
diff --git a/TAO/orbsvcs/orbsvcs/Scheduler_Factory.i b/TAO/orbsvcs/orbsvcs/Scheduler_Factory.i
new file mode 100644
index 00000000000..2c01870582f
--- /dev/null
+++ b/TAO/orbsvcs/orbsvcs/Scheduler_Factory.i
@@ -0,0 +1,21 @@
+// -*- C++ -*-
+
+// ============================================================================
+//
+// $Id$
+//
+// ============================================================================
+
+TAO_BEGIN_VERSIONED_NAMESPACE_DECL
+
+// This helper function allows the application to determine whether
+// the factory is uninitialized, or in a config or runtime mode of
+// operation.
+
+ACE_INLINE ACE_Scheduler_Factory::Factory_Status
+ACE_Scheduler_Factory::status (void)
+{
+ return status_;
+}
+
+TAO_END_VERSIONED_NAMESPACE_DECL
diff --git a/TAO/orbsvcs/orbsvcs/Scheduler_Utilities.cpp b/TAO/orbsvcs/orbsvcs/Scheduler_Utilities.cpp
new file mode 100644
index 00000000000..b2454e5155f
--- /dev/null
+++ b/TAO/orbsvcs/orbsvcs/Scheduler_Utilities.cpp
@@ -0,0 +1,12 @@
+// $Id$
+
+#include "orbsvcs/Scheduler_Utilities.h"
+
+#if ! defined (__ACE_INLINE__)
+#include "orbsvcs/Scheduler_Utilities.i"
+#endif /* __ACE_INLINE__ */
+
+ACE_RCSID (orbsvcs,
+ Scheduler_Utilities,
+ "$Id$")
+
diff --git a/TAO/orbsvcs/orbsvcs/Scheduler_Utilities.h b/TAO/orbsvcs/orbsvcs/Scheduler_Utilities.h
new file mode 100644
index 00000000000..6c39123b4f9
--- /dev/null
+++ b/TAO/orbsvcs/orbsvcs/Scheduler_Utilities.h
@@ -0,0 +1,68 @@
+/* -*- C++ -*- */
+// $Id$
+
+// ============================================================================
+//
+// = LIBRARY
+// orbsvcs
+//
+// = FILENAME
+// Scheduler_Utilities.h
+//
+// = AUTHOR
+// Chris Gill <cdgill@cs.wustl.edu>
+//
+// ============================================================================
+
+#ifndef ACE_SCHEDULER_UTILITIES_H
+#define ACE_SCHEDULER_UTILITIES_H
+#include /**/ "ace/pre.h"
+
+#include "orbsvcs/RtecSchedulerC.h"
+
+#if !defined (ACE_LACKS_PRAGMA_ONCE)
+# pragma once
+#endif /* ACE_LACKS_PRAGMA_ONCE */
+
+#include "orbsvcs/Sched/sched_export.h"
+
+class TAO_RTSched_Export ACE_RT_Info : public RtecScheduler::RT_Info
+{
+ // = TITLE
+ // Offers a convenient C++ interface to the IDL RT_Info structure.
+ //
+ // = DESCRIPTION
+ // For performance reasons the RT_Info data is represented as an
+ // IDL structure, this permits sending complete RT_Info's from the
+ // client to the server. Unfortunately this precludes the usage
+ // of member functions and constructors, this class serves as a
+ // helper to implement those without loosing the performance on
+ // IDL.
+public:
+
+ /// Construct a helper class instance from values for
+ /// the fields of the IDL struct it wraps.
+ ACE_RT_Info (const char* entry_point,
+ RtecScheduler::Time worst_time,
+ RtecScheduler::Time typical_time,
+ RtecScheduler::Time cached_time,
+ RtecScheduler::Period_t period,
+ RtecScheduler::Importance_t importance,
+ RtecScheduler::Quantum_t quantum,
+ CORBA::Long threads);
+
+ /// Construct a helper class instance from the IDL struct it wraps.
+ ACE_RT_Info (const RtecScheduler::RT_Info& rt_info);
+
+ /// Add a dependency of one RT_Info upon another.
+ int add_dependency(RtecScheduler::handle_t dep,
+ int number_of_calls = 1);
+
+};
+
+#if defined (__ACE_INLINE__)
+#include "orbsvcs/Scheduler_Utilities.i"
+#endif /* __ACE_INLINE__ */
+
+#include /**/ "ace/post.h"
+#endif /* ACE_SCHEDULER_UTILITIES_H */
diff --git a/TAO/orbsvcs/orbsvcs/Scheduler_Utilities.i b/TAO/orbsvcs/orbsvcs/Scheduler_Utilities.i
new file mode 100644
index 00000000000..ede4dc7780d
--- /dev/null
+++ b/TAO/orbsvcs/orbsvcs/Scheduler_Utilities.i
@@ -0,0 +1,40 @@
+// ============================================================================
+//
+// $Id$
+//
+// ============================================================================
+
+
+// Construct a helper class instance from values for
+// the fields of the IDL struct it wraps.
+
+ACE_INLINE
+ACE_RT_Info::ACE_RT_Info (const char* entry_point_,
+ RtecScheduler::Time worst_time_,
+ RtecScheduler::Time typical_time_,
+ RtecScheduler::Time cached_time_,
+ RtecScheduler::Period_t period_,
+ RtecScheduler::Importance_t importance_,
+ RtecScheduler::Quantum_t quantum_,
+ CORBA::Long threads_)
+{
+ // Cannot use the initialization list, as these are members of the wrapped base
+ // class. This wrapper class must assign them in the constructor body.
+ this->entry_point = entry_point_;
+ this->worst_case_execution_time = worst_time_;
+ this->typical_execution_time = typical_time_;
+ this->cached_execution_time = cached_time_;
+ this->period = period_;
+ this->importance = importance_;
+ this->quantum = quantum_;
+ this->threads = threads_;
+}
+
+
+// Construct a helper class instance from the IDL struct it wraps.
+
+ACE_INLINE
+ACE_RT_Info::ACE_RT_Info (const RtecScheduler::RT_Info& rt_info)
+ : RtecScheduler::RT_Info (rt_info)
+{
+}
diff --git a/TAO/orbsvcs/orbsvcs/Security.idl b/TAO/orbsvcs/orbsvcs/Security.idl
new file mode 100644
index 00000000000..836462ec784
--- /dev/null
+++ b/TAO/orbsvcs/orbsvcs/Security.idl
@@ -0,0 +1,358 @@
+// -*- IDL -*-
+//
+// $Id$
+
+
+#ifndef _SECURITY_IDL_
+#define _SECURITY_IDL_
+
+#include "tao/TimeBase.pidl"
+#include <orb.idl>
+
+#pragma prefix "omg.org"
+
+module Security {
+
+#pragma version Security 1.8
+
+ typedef string SecurityName;
+ typedef sequence<octet> Opaque;
+
+ // Constant declarations for Security Service Options
+ const CORBA::ServiceOption SecurityLevel1 = 1;
+ const CORBA::ServiceOption SecurityLevel2 = 2;
+ const CORBA::ServiceOption NonRepudiation = 3;
+ const CORBA::ServiceOption SecurityORBServiceReady = 4;
+ const CORBA::ServiceOption SecurityServiceReady = 5;
+ const CORBA::ServiceOption ReplaceORBServices = 6;
+ const CORBA::ServiceOption ReplaceSecurityServices = 7;
+ const CORBA::ServiceOption StandardSecureInteroperability = 8;
+ const CORBA::ServiceOption DCESecureInteroperability = 9;
+
+ // Service options for Common Secure Interoperability
+ const CORBA::ServiceOption CommonInteroperabilityLevel0 = 10;
+ const CORBA::ServiceOption CommonInteroperabilityLevel1 = 11;
+ const CORBA::ServiceOption CommonInteroperabilityLevel2 = 12;
+
+ // Security mech types supported for secure association
+ const CORBA::ServiceDetailType SecurityMechanismType = 1;
+
+ // privilege types supported in standard access policy
+ const CORBA::ServiceDetailType SecurityAttribute = 2;
+
+ // extensible families for standard data types
+ struct ExtensibleFamily {
+ unsigned short family_definer;
+ unsigned short family;
+ };
+
+ typedef sequence<octet> OID;
+
+ typedef sequence<OID> OIDList;
+
+ // security attributes
+ typedef unsigned long SecurityAttributeType;
+
+ // other attributes; family = 0
+
+ const SecurityAttributeType AuditId = 1;
+ const SecurityAttributeType AccountingId = 2;
+ const SecurityAttributeType NonRepudiationId = 3;
+
+ // privilege attributes; family = 1
+
+ const SecurityAttributeType _Public = 1;
+ const SecurityAttributeType AccessId = 2;
+ const SecurityAttributeType PrimaryGroupId = 3;
+ const SecurityAttributeType GroupId = 4;
+ const SecurityAttributeType Role = 5;
+ const SecurityAttributeType AttributeSet = 6;
+ const SecurityAttributeType Clearance = 7;
+ const SecurityAttributeType Capability = 8;
+
+ struct AttributeType {
+ ExtensibleFamily attribute_family;
+ SecurityAttributeType attribute_type;
+ };
+
+ typedef sequence<AttributeType> AttributeTypeList;
+
+ struct SecAttribute {
+ AttributeType attribute_type;
+ OID defining_authority;
+ Opaque value;
+ // the value of this attribute can be
+ // decoded only with knowledge of defining authority
+ };
+
+ typedef sequence <SecAttribute> AttributeList;
+
+ // Authentication return status
+ enum AuthenticationStatus {
+ SecAuthSuccess,
+ SecAuthFailure,
+ SecAuthContinue,
+ SecAuthExpired
+ };
+
+ // Association return status
+ enum AssociationStatus {
+ SecAssocSuccess,
+ SecAssocFailure,
+ SecAssocContinue
+ };
+
+ // Authentication method
+ typedef unsigned long AuthenticationMethod;
+
+ typedef sequence<AuthenticationMethod> AuthenticationMethodList;
+
+ // Credential types
+
+ enum InvocationCredentialsType {
+ SecOwnCredentials,
+ SecReceivedCredentials,
+ SecTargetCredentials
+ };
+
+ // Declarations related to Rights
+
+ struct Right {
+ ExtensibleFamily rights_family;
+ string the_right;
+ };
+
+ typedef sequence <Right> RightsList;
+
+ enum RightsCombinator {
+ SecAllRights,
+ SecAnyRight
+ };
+
+ // Delegation related
+
+ enum DelegationState {
+ SecInitiator,
+ SecDelegate
+ };
+
+ enum DelegationDirective {
+ Delegate,
+ NoDelegate
+ };
+
+ // pick up from TimeBase
+
+ typedef TimeBase::UtcT UtcT;
+ typedef TimeBase::IntervalT IntervalT;
+ typedef TimeBase::TimeT TimeT;
+
+ // Security features available on credentials.
+
+ enum SecurityFeature {
+ SecNoDelegation,
+ SecSimpleDelegation,
+ SecCompositeDelegation,
+ SecNoProtection,
+ SecIntegrity,
+ SecConfidentiality,
+ SecIntegrityAndConfidentiality,
+ SecDetectReplay,
+ SecDetectMisordering,
+ SecEstablishTrustInTarget,
+ SecEstablishTrustInClient
+ };
+
+ // Quality of protection which can be specified
+ // for an object reference and used to protect messages
+ enum QOP {
+ SecQOPNoProtection,
+ SecQOPIntegrity,
+ SecQOPConfidentiality,
+ SecQOPIntegrityAndConfidentiality
+ };
+
+ // Type of SecurityContext
+ enum SecurityContextType {
+ SecClientSecurityContext,
+ SecServerSecurityContext
+ };
+
+ // Operational State of a Security Context
+ enum SecurityContextState {
+ SecContextInitialized,
+ SecContextContinued,
+ SecContextClientEstablished,
+ SecContextEstablished,
+ SecContextEstablishExpired,
+ SecContextExpired,
+ SecContextInvalid
+ };
+
+ struct ChannelBindings {
+ unsigned long initiator_addrtype;
+ CORBA::OctetSeq initiator_address;
+ unsigned long acceptor_addrtype;
+ CORBA::OctetSeq acceptor_address;
+ CORBA::OctetSeq application_data;
+ };
+
+ // For use with SecurityReplaceable
+ struct OpaqueBuffer {
+ Opaque buffer;
+ unsigned long startpos;
+ unsigned long endpos;
+ // startpos <= endpos
+ // OpaqueBuffer is said to be empty if startpos == endpos
+ };
+
+ // Association options which can be administered
+ // on secure invocation policy and used to
+ // initialize security context
+ typedef unsigned short AssociationOptions;
+
+ const AssociationOptions NoProtection = 1;
+ const AssociationOptions Integrity = 2;
+ const AssociationOptions Confidentiality = 4;
+ const AssociationOptions DetectReplay = 8;
+ const AssociationOptions DetectMisordering = 16;
+ const AssociationOptions EstablishTrustInTarget = 32;
+ const AssociationOptions EstablishTrustInClient = 64;
+ const AssociationOptions NoDelegation = 128;
+ const AssociationOptions SimpleDelegation = 256;
+ const AssociationOptions CompositeDelegation = 512;
+
+ // Flag to indicate whether association options being
+ // administered are the "required" or "supported" set
+ enum RequiresSupports {
+ SecRequires,
+ SecSupports
+ };
+
+ // Direction of communication for which
+ // secure invocation policy applies
+ enum CommunicationDirection {
+ SecDirectionBoth,
+ SecDirectionRequest,
+ SecDirectionReply
+ };
+
+ // security association mechanism type
+ typedef string MechanismType;
+ typedef sequence<MechanismType> MechanismTypeList;
+
+ // AssociationOptions-Direction pair
+ struct OptionsDirectionPair {
+ AssociationOptions options;
+ CommunicationDirection direction;
+ };
+
+ typedef sequence <OptionsDirectionPair> OptionsDirectionPairList;
+
+ // Delegation mode which can be administered
+ enum DelegationMode {
+ SecDelModeNoDelegation, // i.e. use own credentials
+ SecDelModeSimpleDelegation, // delegate received credentials
+ SecDelModeCompositeDelegation // delegate both
+ };
+
+ // Association options supported by a given mech type
+ struct MechandOptions {
+ MechanismType mechanism_type;
+ AssociationOptions options_supported;
+ };
+
+ typedef sequence <MechandOptions> MechandOptionsList;
+
+ // Attribute of the SecurityLevel2::EstablishTrustPolicy
+ struct EstablishTrust {
+ boolean trust_in_client;
+ boolean trust_in_target;
+ };
+
+ // Audit
+ typedef unsigned long AuditChannelId;
+ typedef unsigned short _EventType;
+
+ const _EventType AuditAll = 0;
+ const _EventType AuditPrincipalAuth = 1;
+ const _EventType AuditSessionAuth = 2;
+ const _EventType AuditAuthorization = 3;
+ const _EventType AuditInvocation = 4;
+ const _EventType AuditSecEnvChange = 5;
+ const _EventType AuditPolicyChange = 6;
+ const _EventType AuditObjectCreation = 7;
+ const _EventType AuditObjectDestruction = 8;
+ const _EventType AuditNonRepudiation = 9;
+
+ enum DayOfTheWeek {
+ Monday, Tuesday, Wednesday, Thursday, Friday, Saturday, Sunday
+ };
+
+ enum AuditCombinator {
+ SecAllSelectors,
+ SecAnySelector
+ };
+
+ struct AuditEventType {
+ ExtensibleFamily event_family;
+ _EventType event_type;
+ };
+
+ typedef sequence <AuditEventType> AuditEventTypeList;
+
+ typedef unsigned long SelectorType;
+
+ const SelectorType InterfaceName = 1;
+ const SelectorType ObjectRef = 2;
+ const SelectorType Operation = 3;
+ const SelectorType Initiator = 4;
+ const SelectorType SuccessFailure = 5;
+ const SelectorType Time = 6;
+ const SelectorType DayOfWeek = 7;
+
+ // values defined for audit_needed and audit_write are:
+ // InterfaceName: CORBA::RepositoryId
+ // ObjectRef: object reference
+ // Operation: op_name
+ // Initiator: Credentials
+ // SuccessFailure: boolean
+ // Time: utc time on audit_write; time picked up from
+ // environment in audit_needed if required
+ // DayOfWeek: DayOfTheWeek
+
+ struct SelectorValue {
+ SelectorType selector;
+ any value;
+ };
+
+ typedef sequence <SelectorValue> SelectorValueList;
+
+ // Constant declaration for valid Security Policy Types
+
+ // General administrative policies
+ const CORBA::PolicyType SecClientInvocationAccess = 1;
+ const CORBA::PolicyType SecTargetInvocationAccess = 2;
+ const CORBA::PolicyType SecApplicationAccess = 3;
+ const CORBA::PolicyType SecClientInvocationAudit = 4;
+ const CORBA::PolicyType SecTargetInvocationAudit = 5;
+ const CORBA::PolicyType SecApplicationAudit = 6;
+ const CORBA::PolicyType SecDelegation = 7;
+ const CORBA::PolicyType SecClientSecureInvocation = 8;
+ const CORBA::PolicyType SecTargetSecureInvocation = 9;
+ const CORBA::PolicyType SecNonRepudiation = 10;
+
+
+ // Policies used to control attributes of a binding to a target
+ const CORBA::PolicyType SecMechanismsPolicy = 12;
+ const CORBA::PolicyType SecInvocationCredentialsPolicy = 13;
+ const CORBA::PolicyType SecFeaturePolicy = 14; // obsolete
+ const CORBA::PolicyType SecQOPPolicy = 15;
+
+ const CORBA::PolicyType SecDelegationDirectivePolicy = 38;
+ const CORBA::PolicyType SecEstablishTrustPolicy = 39;
+};
+
+#pragma prefix ""
+
+#endif /* _SECURITY_IDL_ */
diff --git a/TAO/orbsvcs/orbsvcs/Security.mpc b/TAO/orbsvcs/orbsvcs/Security.mpc
new file mode 100644
index 00000000000..fb03dc6acc9
--- /dev/null
+++ b/TAO/orbsvcs/orbsvcs/Security.mpc
@@ -0,0 +1,42 @@
+// -*- MPC -*-
+// $Id$
+
+project(Security) : orbsvcslib, corba_messaging, core, portableserver, pi, interceptors, valuetype, tao_versioning_idl_defaults {
+ sharedname = TAO_Security
+ idlflags += -Wb,export_macro=TAO_Security_Export -Wb,export_include=orbsvcs/Security/security_export.h
+ dynamicflags = TAO_SECURITY_BUILD_DLL
+ tagchecks += Security
+
+ IDL_Files {
+ CSI.idl
+ CSIIOP.idl
+ GSSUP.idl
+ Security.idl
+ SecurityLevel1.idl
+ SecurityLevel2.idl
+ SecurityLevel3.idl
+ }
+
+ Source_Files(ORBSVCS_COMPONENTS) {
+ Security {
+ CSIC.cpp
+ CSIIOPC.cpp
+ GSSUPC.cpp
+ SecurityC.cpp
+ SecurityS.cpp
+ SecurityLevel1C.cpp
+ SecurityLevel1S.cpp
+ SecurityLevel2C.cpp
+ SecurityLevel2S.cpp
+ SecurityLevel3C.cpp
+ Security
+ }
+ }
+
+ Header_Files {
+ Security/security_export.h
+ }
+
+ Template_Files {
+ }
+}
diff --git a/TAO/orbsvcs/orbsvcs/Security.rc b/TAO/orbsvcs/orbsvcs/Security.rc
new file mode 100644
index 00000000000..9138ebe5f3b
--- /dev/null
+++ b/TAO/orbsvcs/orbsvcs/Security.rc
@@ -0,0 +1,30 @@
+#include "..\..\tao\Version.h"
+
+1 VERSIONINFO
+ FILEVERSION TAO_MAJOR_VERSION,TAO_MINOR_VERSION,TAO_BETA_VERSION,0
+ PRODUCTVERSION TAO_MAJOR_VERSION,TAO_MINOR_VERSION,TAO_BETA_VERSION,0
+ FILEFLAGSMASK 0x3fL
+ FILEFLAGS 0x0L
+ FILEOS 0x4L
+ FILETYPE 0x1L
+ FILESUBTYPE 0x0L
+BEGIN
+ BLOCK "StringFileInfo"
+ BEGIN
+ BLOCK "040904B0"
+ BEGIN
+ VALUE "FileDescription", "Security\0"
+ VALUE "FileVersion", TAO_VERSION "\0"
+ VALUE "InternalName", "TAO_SecurityDLL\0"
+ VALUE "LegalCopyright", "\0"
+ VALUE "LegalTrademarks", "\0"
+ VALUE "OriginalFilename", "TAO_Security.DLL\0"
+ VALUE "ProductName", "ORBSVCS\0"
+ VALUE "ProductVersion", TAO_VERSION "\0"
+ END
+ END
+ BLOCK "VarFileInfo"
+ BEGIN
+ VALUE "Translation", 0x409, 1200
+ END
+END
diff --git a/TAO/orbsvcs/orbsvcs/Security/CSI_Utils.cpp b/TAO/orbsvcs/orbsvcs/Security/CSI_Utils.cpp
new file mode 100644
index 00000000000..0e7c1a01478
--- /dev/null
+++ b/TAO/orbsvcs/orbsvcs/Security/CSI_Utils.cpp
@@ -0,0 +1,69 @@
+// $Id$
+
+#include "orbsvcs/Security/CSI_Utils.h"
+#include "orbsvcs/CSIC.h"
+
+#include "tao/CDR.h"
+
+#include "ace/OS_NS_string.h"
+
+
+ACE_RCSID (Security,
+ CSI_Utils,
+ "$Id$")
+
+TAO_BEGIN_VERSIONED_NAMESPACE_DECL
+
+void
+TAO::CSI_Utils::create_sas_service_context (
+ const CSI::SASContextBody & sas_context,
+ IOP::ServiceContext & sc)
+{
+ // Marshal CSI::SASContextBody union into an octet sequence suitable
+ // for placement in an IOP::ServiceContext.
+ // (TAO's compiled marshaling is used for performance reasons.)
+
+ TAO_OutputCDR cdr;
+ cdr << TAO_OutputCDR::from_boolean (TAO_ENCAP_BYTE_ORDER);
+
+ cdr << sas_context;
+
+ sc.context_id = IOP::SecurityAttributeService;
+
+ // TAO extension, replace the contents of the octet sequence with
+ // the CDR stream.
+ const CORBA::ULong len = cdr.total_length ();
+ sc.context_data.length (len);
+ CORBA::Octet * buf = sc.context_data.get_buffer ();
+ for (const ACE_Message_Block * i = cdr.begin ();
+ i != 0;
+ i = i->cont ())
+ {
+ ACE_OS::memcpy (buf, i->rd_ptr (), i->length ());
+ buf += i->length ();
+ }
+}
+
+bool
+TAO::CSI_Utils::extract_sas_service_context (
+ const IOP::ServiceContext & sc,
+ CSI::SASContextBody & sas_context)
+{
+ // Demarshal CSI::SASContextBody union from ServiceContext.
+ // (TAO's compiled marshaling is used for performance reasons.)
+
+ TAO_InputCDR cdr (reinterpret_cast<const char*> (
+ sc.context_data.get_buffer ()),
+ sc.context_data.length ());
+
+ ACE_CDR::Boolean byte_order;
+
+ if (!(cdr >> ACE_InputCDR::to_boolean (byte_order)))
+ return false;
+
+ cdr.reset_byte_order (static_cast<int> (byte_order));
+
+ return (cdr >> sas_context);
+}
+
+TAO_END_VERSIONED_NAMESPACE_DECL
diff --git a/TAO/orbsvcs/orbsvcs/Security/CSI_Utils.h b/TAO/orbsvcs/orbsvcs/Security/CSI_Utils.h
new file mode 100644
index 00000000000..8f233dbfd97
--- /dev/null
+++ b/TAO/orbsvcs/orbsvcs/Security/CSI_Utils.h
@@ -0,0 +1,56 @@
+// -*- C++ -*-
+
+//=============================================================================
+/**
+ * @file CSI_Utils.h
+ *
+ * $Id$
+ *
+ * @author Ossama Othman <ossama@dre.vanderbilt.edu>
+ */
+//=============================================================================
+
+
+#ifndef TAO_CSI_UTILS_H
+#define TAO_CSI_UTILS_H
+
+// No need to include "ace/pre.h" and "ace/post.h". This header and
+// the declared types/variables are not meant to be used outside TAO's
+// CSIv2 implementation.
+
+#include "tao/orbconf.h"
+#include "tao/Versioned_Namespace.h"
+
+TAO_BEGIN_VERSIONED_NAMESPACE_DECL
+
+// Forward declarations
+namespace IOP
+{
+ struct ServiceContext;
+}
+
+namespace CSI
+{
+ class SASContextBody;
+}
+
+namespace TAO
+{
+ namespace CSI_Utils
+ {
+ /// Populate given IOP::ServiceContext with given CSI::SASContextBody.
+ void create_sas_service_context (const CSI::SASContextBody & sas_context,
+ IOP::ServiceContext & sc);
+
+ /// Extract CSI::SASContextBody from given IOP::ServiceContext.
+ /**
+ * @return Success == true, Failure == false.
+ */
+ bool extract_sas_service_context (const IOP::ServiceContext & sc,
+ CSI::SASContextBody & sas_context);
+ }
+}
+
+TAO_END_VERSIONED_NAMESPACE_DECL
+
+#endif /* TAO_CSI_UTILS_H */
diff --git a/TAO/orbsvcs/orbsvcs/Security/SL2_EstablishTrustPolicy.cpp b/TAO/orbsvcs/orbsvcs/Security/SL2_EstablishTrustPolicy.cpp
new file mode 100644
index 00000000000..20216f4a905
--- /dev/null
+++ b/TAO/orbsvcs/orbsvcs/Security/SL2_EstablishTrustPolicy.cpp
@@ -0,0 +1,63 @@
+// -*- C++ -*-
+
+#include "orbsvcs/Security/SL2_EstablishTrustPolicy.h"
+
+#include "tao/ORB_Constants.h"
+
+
+ACE_RCSID (Security,
+ SL2_EstablishTrustPolicy,
+ "$Id$")
+
+
+TAO_BEGIN_VERSIONED_NAMESPACE_DECL
+
+TAO::Security::EstablishTrustPolicy::EstablishTrustPolicy (
+ const ::Security::EstablishTrust &trust)
+ : trust_ (trust)
+{
+}
+
+TAO::Security::EstablishTrustPolicy::~EstablishTrustPolicy (void)
+{
+}
+
+CORBA::PolicyType
+TAO::Security::EstablishTrustPolicy::policy_type (
+ ACE_ENV_SINGLE_ARG_DECL_NOT_USED)
+ ACE_THROW_SPEC ((CORBA::SystemException))
+{
+ return ::Security::SecEstablishTrustPolicy;
+}
+
+CORBA::Policy_ptr
+TAO::Security::EstablishTrustPolicy::copy (ACE_ENV_SINGLE_ARG_DECL)
+ ACE_THROW_SPEC ((CORBA::SystemException))
+{
+ TAO::Security::EstablishTrustPolicy *policy = 0;
+ ACE_NEW_THROW_EX (policy,
+ TAO::Security::EstablishTrustPolicy (this->trust_),
+ CORBA::NO_MEMORY (
+ CORBA::SystemException::_tao_minor_code (
+ TAO::VMCID,
+ ENOMEM),
+ CORBA::COMPLETED_NO));
+ ACE_CHECK_RETURN (CORBA::Policy::_nil ());
+
+ return policy;
+}
+
+void
+TAO::Security::EstablishTrustPolicy::destroy (ACE_ENV_SINGLE_ARG_DECL_NOT_USED)
+ ACE_THROW_SPEC ((CORBA::SystemException))
+{
+}
+
+::Security::EstablishTrust
+TAO::Security::EstablishTrustPolicy::trust (ACE_ENV_SINGLE_ARG_DECL_NOT_USED)
+ ACE_THROW_SPEC ((CORBA::SystemException))
+{
+ return this->trust_;
+}
+
+TAO_END_VERSIONED_NAMESPACE_DECL
diff --git a/TAO/orbsvcs/orbsvcs/Security/SL2_EstablishTrustPolicy.h b/TAO/orbsvcs/orbsvcs/Security/SL2_EstablishTrustPolicy.h
new file mode 100644
index 00000000000..b7910c316d9
--- /dev/null
+++ b/TAO/orbsvcs/orbsvcs/Security/SL2_EstablishTrustPolicy.h
@@ -0,0 +1,106 @@
+// -*- C++ -*-
+
+// ===================================================================
+/**
+ * @file SL2_EstablishTrustPolicy.h
+ *
+ * $Id$
+ *
+ * @author Ossama Othman <ossama@uci.edu>
+ */
+// ===================================================================
+
+
+#ifndef TAO_ESTABLISH_TRUST_POLICY_H
+#define TAO_ESTABLISH_TRUST_POLICY_H
+
+#include /**/ "ace/pre.h"
+
+#include "orbsvcs/Security/security_export.h"
+
+#if !defined (ACE_LACKS_PRAGMA_ONCE)
+# pragma once
+#endif /* ACE_LACKS_PRAGMA_ONCE */
+
+#include "orbsvcs/SecurityLevel2C.h"
+
+#include "tao/LocalObject.h"
+
+TAO_BEGIN_VERSIONED_NAMESPACE_DECL
+
+namespace TAO
+{
+ namespace Security
+ {
+
+ /**
+ * @class EstablishTrustPolicy
+ *
+ * @brief Implementation of the
+ * SecurityLevel2::EstablishTrustPolicy.
+ *
+ * This policy can be used to enable or disable establishment of
+ * trust in the client or the target or both on a per-object
+ * basis. For example, it can be set as a policy override using
+ * the standard CORBA::Object::_set_policy_overrides() method.
+ @par
+ * This policy can be created by using the
+ * CORBA::ORB::create_policy() method by passing it the
+ * Security::SecEstablishTrustPolicy policy type, and the
+ *
+ * appropriate Security::EstablishTrust structure (inserted into a
+ * CORBA::Any).
+ */
+ class EstablishTrustPolicy
+ : public virtual SecurityLevel2::EstablishTrustPolicy,
+ public virtual TAO_Local_RefCounted_Object
+ {
+ public:
+
+ /// Constructor
+ EstablishTrustPolicy (const ::Security::EstablishTrust &trust);
+
+ /**
+ * @name CORBA::Policy Methods
+ */
+ //@{
+ virtual CORBA::PolicyType policy_type (ACE_ENV_SINGLE_ARG_DECL)
+ ACE_THROW_SPEC ((CORBA::SystemException));
+
+ virtual CORBA::Policy_ptr copy (ACE_ENV_SINGLE_ARG_DECL)
+ ACE_THROW_SPEC ((CORBA::SystemException));
+
+ virtual void destroy (ACE_ENV_SINGLE_ARG_DECL)
+ ACE_THROW_SPEC ((CORBA::SystemException));
+ //@}
+
+ /// Return the "establish trust" value associated with this
+ /// policy.
+ virtual ::Security::EstablishTrust trust (ACE_ENV_SINGLE_ARG_DECL)
+ ACE_THROW_SPEC ((CORBA::SystemException));
+
+ protected:
+
+ /// Destructor
+ /**
+ * Protected destructor to enforce proper memory management
+ * through the reference counting mechanism.
+ */
+ ~EstablishTrustPolicy (void);
+
+ private:
+
+ /// Quality of protection which can be specified for an object
+ /// reference and used to protect messages.
+ ::Security::EstablishTrust const trust_;
+
+ };
+
+ } // End Security namespace
+} // End TAO namespace
+
+TAO_END_VERSIONED_NAMESPACE_DECL
+
+#include /**/ "ace/post.h"
+
+#endif /* TAO_ESTABLISH_TRUST_POLICY_H */
diff --git a/TAO/orbsvcs/orbsvcs/Security/SL2_QOPPolicy.cpp b/TAO/orbsvcs/orbsvcs/Security/SL2_QOPPolicy.cpp
new file mode 100644
index 00000000000..9175ac608b0
--- /dev/null
+++ b/TAO/orbsvcs/orbsvcs/Security/SL2_QOPPolicy.cpp
@@ -0,0 +1,61 @@
+// -*- C++ -*-
+
+#include "orbsvcs/Security/SL2_QOPPolicy.h"
+
+#include "tao/ORB_Constants.h"
+
+
+ACE_RCSID (Security,
+ SL2_QOPPolicy,
+ "$Id$")
+
+
+TAO_BEGIN_VERSIONED_NAMESPACE_DECL
+
+TAO::Security::QOPPolicy::QOPPolicy (::Security::QOP qop)
+ : qop_ (qop)
+{
+}
+
+TAO::Security::QOPPolicy::~QOPPolicy (void)
+{
+}
+
+CORBA::PolicyType
+TAO::Security::QOPPolicy::policy_type (ACE_ENV_SINGLE_ARG_DECL_NOT_USED)
+ ACE_THROW_SPEC ((CORBA::SystemException))
+{
+ return ::Security::SecQOPPolicy;
+}
+
+CORBA::Policy_ptr
+TAO::Security::QOPPolicy::copy (ACE_ENV_SINGLE_ARG_DECL)
+ ACE_THROW_SPEC ((CORBA::SystemException))
+{
+ TAO::Security::QOPPolicy * policy = 0;
+ ACE_NEW_THROW_EX (policy,
+ TAO::Security::QOPPolicy (this->qop_),
+ CORBA::NO_MEMORY (
+ CORBA::SystemException::_tao_minor_code (
+ TAO::VMCID,
+ ENOMEM),
+ CORBA::COMPLETED_NO));
+ ACE_CHECK_RETURN (CORBA::Policy::_nil ());
+
+ return policy;
+}
+
+void
+TAO::Security::QOPPolicy::destroy (ACE_ENV_SINGLE_ARG_DECL_NOT_USED)
+ ACE_THROW_SPEC ((CORBA::SystemException))
+{
+}
+
+Security::QOP
+TAO::Security::QOPPolicy::qop (ACE_ENV_SINGLE_ARG_DECL_NOT_USED)
+ ACE_THROW_SPEC ((CORBA::SystemException))
+{
+ return this->qop_;
+}
+
+TAO_END_VERSIONED_NAMESPACE_DECL
diff --git a/TAO/orbsvcs/orbsvcs/Security/SL2_QOPPolicy.h b/TAO/orbsvcs/orbsvcs/Security/SL2_QOPPolicy.h
new file mode 100644
index 00000000000..ff8b99e2309
--- /dev/null
+++ b/TAO/orbsvcs/orbsvcs/Security/SL2_QOPPolicy.h
@@ -0,0 +1,103 @@
+// -*- C++ -*-
+
+// ===================================================================
+/**
+ * @file SL2_QOPPolicy.h
+ *
+ * $Id$
+ *
+ * @author Ossama Othman <ossama@uci.edu>
+ */
+// ===================================================================
+
+
+#ifndef TAO_SL2_QOP_POLICY_H
+#define TAO_SL2_QOP_POLICY_H
+
+#include /**/ "ace/pre.h"
+
+#include "orbsvcs/Security/security_export.h"
+
+#if !defined (ACE_LACKS_PRAGMA_ONCE)
+# pragma once
+#endif /* ACE_LACKS_PRAGMA_ONCE */
+
+#include "orbsvcs/SecurityLevel2C.h"
+
+#include "tao/LocalObject.h"
+
+TAO_BEGIN_VERSIONED_NAMESPACE_DECL
+
+namespace TAO
+{
+ namespace Security
+ {
+ /**
+ * @class QOPPolicy
+ *
+ * @brief Implementation of the SecurityLevel2::QOPPolicy
+ * interface.
+ *
+ * This policy can be used to affect the quality of protection
+ * (QoP) for invocation on a per-object basis. For example, it
+ * can be set as a policy override using the standard
+ * CORBA::Object::_set_policy_overrides() method.
+ * @par
+ * This policy can be created by using the
+ * CORBA::ORB::create_policy() method by passing it the
+ * Security::SecQOPPolicy policy type, and the appropriate
+ * Security::QOP enumeration (inserted into a CORBA::Any).
+ */
+ class QOPPolicy
+ : public virtual SecurityLevel2::QOPPolicy,
+ public virtual TAO_Local_RefCounted_Object
+ {
+ public:
+
+ /// Constructor
+ QOPPolicy (::Security::QOP qop);
+
+ /**
+ * @name CORBA::Policy Methods
+ */
+ //@{
+ virtual CORBA::PolicyType policy_type (ACE_ENV_SINGLE_ARG_DECL)
+ ACE_THROW_SPEC ((CORBA::SystemException));
+
+ virtual CORBA::Policy_ptr copy (ACE_ENV_SINGLE_ARG_DECL)
+ ACE_THROW_SPEC ((CORBA::SystemException));
+
+ virtual void destroy (ACE_ENV_SINGLE_ARG_DECL)
+ ACE_THROW_SPEC ((CORBA::SystemException));
+ //@}
+
+ /// Return the Quality-of-Protection value associated with this
+ /// policy.
+ virtual ::Security::QOP qop (ACE_ENV_SINGLE_ARG_DECL)
+ ACE_THROW_SPEC ((CORBA::SystemException));
+
+ protected:
+
+ /// Destructor
+ /**
+ * Protected destructor to enforce proper memory management
+ * through the reference counting mechansim.
+ */
+ ~QOPPolicy (void);
+
+ private:
+
+ /// Quality of protection which can be specified for an object
+ /// reference and used to protect messages.
+ ::Security::QOP const qop_;
+
+ };
+
+ } // End Security namespace
+} // End TAO namespace
+
+TAO_END_VERSIONED_NAMESPACE_DECL
+
+#include /**/ "ace/post.h"
+
+#endif /* TAO_SL2_QOP_POLICY_H */
diff --git a/TAO/orbsvcs/orbsvcs/Security/SL3_ContextEstablishmentPolicy.cpp b/TAO/orbsvcs/orbsvcs/Security/SL3_ContextEstablishmentPolicy.cpp
new file mode 100644
index 00000000000..22b8d7ad961
--- /dev/null
+++ b/TAO/orbsvcs/orbsvcs/Security/SL3_ContextEstablishmentPolicy.cpp
@@ -0,0 +1,126 @@
+// $Id$
+
+#include "orbsvcs/Security/SL3_ContextEstablishmentPolicy.h"
+
+
+ACE_RCSID (Security,
+ SL3_ContextEstablishmentPolicy,
+ "$Id$")
+
+TAO_BEGIN_VERSIONED_NAMESPACE_DECL
+
+TAO::SL3::ContextEstablishmentPolicy::ContextEstablishmentPolicy (
+ SecurityLevel3::CredsDirective creds_directive,
+ const SecurityLevel3::OwnCredentialsList & creds_list,
+ SecurityLevel3::FeatureDirective use_client_auth,
+ SecurityLevel3::FeatureDirective use_target_auth,
+ SecurityLevel3::FeatureDirective use_confidentiality,
+ SecurityLevel3::FeatureDirective use_integrity)
+ : creds_directive_ (creds_directive),
+ creds_list_ (creds_list),
+ use_client_auth_ (use_client_auth),
+ use_target_auth_ (use_target_auth),
+ use_confidentiality_ (use_confidentiality),
+ use_integrity_ (use_integrity)
+{
+}
+
+TAO::SL3::ContextEstablishmentPolicy::~ContextEstablishmentPolicy (void)
+{
+}
+
+SecurityLevel3::CredsDirective
+TAO::SL3::ContextEstablishmentPolicy::creds_directive (
+ ACE_ENV_SINGLE_ARG_DECL_NOT_USED)
+ ACE_THROW_SPEC ((CORBA::SystemException))
+{
+ return this->creds_directive_;
+}
+
+SecurityLevel3::OwnCredentialsList *
+TAO::SL3::ContextEstablishmentPolicy::creds_list (ACE_ENV_SINGLE_ARG_DECL)
+ ACE_THROW_SPEC ((CORBA::SystemException))
+{
+ SecurityLevel3::OwnCredentialsList * creds = 0;
+
+ ACE_NEW_THROW_EX (creds,
+ SecurityLevel3::OwnCredentialsList (this->creds_list_),
+ CORBA::NO_MEMORY ());
+ ACE_CHECK_RETURN (creds);
+
+ return creds;
+}
+
+SecurityLevel3::FeatureDirective
+TAO::SL3::ContextEstablishmentPolicy::use_client_auth (
+ ACE_ENV_SINGLE_ARG_DECL_NOT_USED)
+ ACE_THROW_SPEC ((CORBA::SystemException))
+{
+ return this->use_client_auth_;
+}
+
+SecurityLevel3::FeatureDirective
+TAO::SL3::ContextEstablishmentPolicy::use_target_auth (
+ ACE_ENV_SINGLE_ARG_DECL_NOT_USED)
+ ACE_THROW_SPEC ((CORBA::SystemException))
+{
+ return this->use_target_auth_;
+}
+
+SecurityLevel3::FeatureDirective
+TAO::SL3::ContextEstablishmentPolicy::use_confidentiality (
+ ACE_ENV_SINGLE_ARG_DECL_NOT_USED)
+ ACE_THROW_SPEC ((CORBA::SystemException))
+{
+ return this->use_confidentiality_;
+}
+
+SecurityLevel3::FeatureDirective
+TAO::SL3::ContextEstablishmentPolicy::use_integrity (
+ ACE_ENV_SINGLE_ARG_DECL_NOT_USED)
+ ACE_THROW_SPEC ((CORBA::SystemException))
+{
+ return this->use_integrity_;
+}
+
+CORBA::PolicyType
+TAO::SL3::ContextEstablishmentPolicy::policy_type (
+ ACE_ENV_SINGLE_ARG_DECL_NOT_USED)
+ ACE_THROW_SPEC ((CORBA::SystemException))
+{
+ return SecurityLevel3::ContextEstablishmentPolicyType;
+}
+
+CORBA::Policy_ptr
+TAO::SL3::ContextEstablishmentPolicy::copy (ACE_ENV_SINGLE_ARG_DECL)
+ ACE_THROW_SPEC ((CORBA::SystemException))
+{
+ CORBA::Policy_ptr p = CORBA::Policy::_nil ();
+ ACE_NEW_THROW_EX (p,
+ TAO::SL3::ContextEstablishmentPolicy (
+ this->creds_directive_,
+ this->creds_list_,
+ this->use_client_auth_,
+ this->use_target_auth_,
+ this->use_confidentiality_,
+ this->use_integrity_),
+ CORBA::NO_MEMORY ());
+ ACE_CHECK_RETURN (p);
+
+ return p;
+}
+
+void
+TAO::SL3::ContextEstablishmentPolicy::destroy (
+ ACE_ENV_SINGLE_ARG_DECL_NOT_USED)
+ ACE_THROW_SPEC ((CORBA::SystemException))
+{
+ this->creds_directive_ = SecurityLevel3::CD_Default;
+ this->creds_list_.length (0);
+ this->use_client_auth_ = SecurityLevel3::FD_UseDefault;
+ this->use_target_auth_ = SecurityLevel3::FD_UseDefault;
+ this->use_confidentiality_ = SecurityLevel3::FD_UseDefault;
+ this->use_integrity_ = SecurityLevel3::FD_UseDefault;
+}
+
+TAO_END_VERSIONED_NAMESPACE_DECL
diff --git a/TAO/orbsvcs/orbsvcs/Security/SL3_ContextEstablishmentPolicy.h b/TAO/orbsvcs/orbsvcs/Security/SL3_ContextEstablishmentPolicy.h
new file mode 100644
index 00000000000..266c1dd31f6
--- /dev/null
+++ b/TAO/orbsvcs/orbsvcs/Security/SL3_ContextEstablishmentPolicy.h
@@ -0,0 +1,134 @@
+// -*- C++ -*-
+
+//=============================================================================
+/**
+ * @file SL3_ContextEstablishmentPolicy.h
+ *
+ * $Id$
+ *
+ * @author Ossama Othman <ossama@dre.vanderbilt.edu>
+ */
+//=============================================================================
+
+
+#ifndef TAO_SL3_CONTEXT_ESTABLISHMENT_POLICY_H
+#define TAO_SL3_CONTEXT_ESTABLISHMENT_POLICY_H
+
+#include /**/ "ace/pre.h"
+#include "orbsvcs/Security/security_export.h"
+
+#if !defined (ACE_LACKS_PRAGMA_ONCE)
+# pragma once
+#endif /* ACE_LACKS_PRAGMA_ONCE */
+
+#include "orbsvcs/SecurityLevel3C.h"
+
+#include "tao/LocalObject.h"
+
+#if defined(_MSC_VER)
+#pragma warning(push)
+#pragma warning(disable:4250)
+#endif /* _MSC_VER */
+
+TAO_BEGIN_VERSIONED_NAMESPACE_DECL
+
+namespace TAO
+{
+ namespace SL3
+ {
+ /**
+ * @class ContextEstablishmentPolicy
+ *
+ * @brief
+ *
+ *
+ */
+ class ContextEstablishmentPolicy
+ : public virtual SecurityLevel3::ContextEstablishmentPolicy,
+ public virtual TAO_Local_RefCounted_Object
+ {
+ public:
+
+ /// Constructor
+ ContextEstablishmentPolicy (
+ SecurityLevel3::CredsDirective creds_directive,
+ const SecurityLevel3::OwnCredentialsList & creds_list,
+ SecurityLevel3::FeatureDirective use_client_auth,
+ SecurityLevel3::FeatureDirective use_target_auth,
+ SecurityLevel3::FeatureDirective use_confidentiality,
+ SecurityLevel3::FeatureDirective use_integrity);
+
+ /**
+ * @name SecurityLevel3::ContextEstablishmentPolicy Methods
+ *
+ * Methods required by the
+ * SecurityLevel3::ContextEstablishmentPolicy interface.
+ */
+ //@{
+ virtual SecurityLevel3::CredsDirective creds_directive (
+ ACE_ENV_SINGLE_ARG_DECL)
+ ACE_THROW_SPEC ((CORBA::SystemException));
+
+ virtual SecurityLevel3::OwnCredentialsList * creds_list (
+ ACE_ENV_SINGLE_ARG_DECL)
+ ACE_THROW_SPEC ((CORBA::SystemException));
+
+ virtual SecurityLevel3::FeatureDirective use_client_auth (
+ ACE_ENV_SINGLE_ARG_DECL)
+ ACE_THROW_SPEC ((CORBA::SystemException));
+
+ virtual SecurityLevel3::FeatureDirective use_target_auth (
+ ACE_ENV_SINGLE_ARG_DECL)
+ ACE_THROW_SPEC ((CORBA::SystemException));
+
+ virtual SecurityLevel3::FeatureDirective use_confidentiality (
+ ACE_ENV_SINGLE_ARG_DECL)
+ ACE_THROW_SPEC ((CORBA::SystemException));
+
+ virtual SecurityLevel3::FeatureDirective use_integrity (
+ ACE_ENV_SINGLE_ARG_DECL)
+ ACE_THROW_SPEC ((CORBA::SystemException));
+
+ virtual CORBA::PolicyType policy_type (ACE_ENV_SINGLE_ARG_DECL)
+ ACE_THROW_SPEC ((CORBA::SystemException));
+
+ virtual CORBA::Policy_ptr copy (ACE_ENV_SINGLE_ARG_DECL)
+ ACE_THROW_SPEC ((CORBA::SystemException));
+
+ virtual void destroy (ACE_ENV_SINGLE_ARG_DECL)
+ ACE_THROW_SPEC ((CORBA::SystemException));
+ //@}
+
+ protected:
+
+ /// Destructor
+ /**
+ * Protected destructor to enforce proper memory management
+ * through the reference counting mechanism.
+ */
+ ~ContextEstablishmentPolicy (void);
+
+ private:
+
+ SecurityLevel3::CredsDirective creds_directive_;
+ SecurityLevel3::OwnCredentialsList creds_list_;
+ SecurityLevel3::FeatureDirective use_client_auth_;
+ SecurityLevel3::FeatureDirective use_target_auth_;
+ SecurityLevel3::FeatureDirective use_confidentiality_;
+ SecurityLevel3::FeatureDirective use_integrity_;
+
+ };
+
+ } // End SL3 namespace
+
+} // End TAO namespace
+
+TAO_END_VERSIONED_NAMESPACE_DECL
+
+#if defined(_MSC_VER)
+#pragma warning(pop)
+#endif /* _MSC_VER */
+
+#include /**/ "ace/post.h"
+
+#endif /* TAO_SL3_CONTEXT_ESTABLISHMENT_POLICY_H */
diff --git a/TAO/orbsvcs/orbsvcs/Security/SL3_CredentialsAcquirerFactory.cpp b/TAO/orbsvcs/orbsvcs/Security/SL3_CredentialsAcquirerFactory.cpp
new file mode 100644
index 00000000000..80a5304154e
--- /dev/null
+++ b/TAO/orbsvcs/orbsvcs/Security/SL3_CredentialsAcquirerFactory.cpp
@@ -0,0 +1,14 @@
+#include "orbsvcs/Security/SL3_CredentialsAcquirerFactory.h"
+
+
+ACE_RCSID (Security,
+ SL3_CredentialsAcquirerFactory,
+ "$Id$")
+
+TAO_BEGIN_VERSIONED_NAMESPACE_DECL
+
+TAO::SL3::CredentialsAcquirerFactory::~CredentialsAcquirerFactory (void)
+{
+}
+
+TAO_END_VERSIONED_NAMESPACE_DECL
diff --git a/TAO/orbsvcs/orbsvcs/Security/SL3_CredentialsAcquirerFactory.h b/TAO/orbsvcs/orbsvcs/Security/SL3_CredentialsAcquirerFactory.h
new file mode 100644
index 00000000000..6320a50b252
--- /dev/null
+++ b/TAO/orbsvcs/orbsvcs/Security/SL3_CredentialsAcquirerFactory.h
@@ -0,0 +1,68 @@
+// -*- C++ -*-
+
+//=============================================================================
+/**
+ * @file SL3_CredentialsAcquirerFactory.h
+ *
+ * $Id$
+ *
+ * @author Ossama Othman <ossama@dre.vanderbilt.edu>
+ */
+//=============================================================================
+
+
+#ifndef TAO_SL3_CREDENTIALS_ACQUIRER_FACTORY_H
+#define TAO_SL3_CREDENTIALS_ACQUIRER_FACTORY_H
+
+#include /**/ "ace/pre.h"
+
+#include "orbsvcs/Security/security_export.h"
+
+#if !defined (ACE_LACKS_PRAGMA_ONCE)
+# pragma once
+#endif /* ACE_LACKS_PRAGMA_ONCE */
+
+#include "orbsvcs/Security/SL3_CredentialsCurator.h"
+
+#include "orbsvcs/SecurityLevel3C.h"
+
+TAO_BEGIN_VERSIONED_NAMESPACE_DECL
+
+namespace TAO
+{
+ namespace SL3
+ {
+
+ /**
+ * @class CredentialsAcquirerFactory
+ *
+ * @brief Abstract base class for all concrete
+ * CredentialsAcquirerFactory implementations.
+ *
+ * All concrete CredentialsAcquirerFactory classes must implement
+ * this interface.
+ */
+ class TAO_Security_Export CredentialsAcquirerFactory
+ {
+ public:
+
+ /// Destructor.
+ virtual ~CredentialsAcquirerFactory (void);
+
+ /// Create a TAO::SL3::CredentialsAcquirerFactory.
+ virtual SecurityLevel3::CredentialsAcquirer_ptr make (
+ TAO::SL3::CredentialsCurator_ptr curator,
+ const CORBA::Any & acquisition_arguments
+ ACE_ENV_ARG_DECL) = 0;
+
+ };
+
+ } // End SL3 namespace
+} // End TAO namespace
+
+TAO_END_VERSIONED_NAMESPACE_DECL
+
+
+#include /**/ "ace/post.h"
+
+#endif /* TAO_SL3_CREDENTIALS_ACQUIRER_FACTORY_H */
diff --git a/TAO/orbsvcs/orbsvcs/Security/SL3_CredentialsCurator.cpp b/TAO/orbsvcs/orbsvcs/Security/SL3_CredentialsCurator.cpp
new file mode 100644
index 00000000000..6555f46469c
--- /dev/null
+++ b/TAO/orbsvcs/orbsvcs/Security/SL3_CredentialsCurator.cpp
@@ -0,0 +1,284 @@
+// $Id$
+
+#include "orbsvcs/Security/SL3_CredentialsCurator.h"
+#include "orbsvcs/Security/SL3_CredentialsAcquirerFactory.h"
+
+
+ACE_RCSID (Security,
+ SL3_CredentialsCurator,
+ "$Id$")
+
+TAO_BEGIN_VERSIONED_NAMESPACE_DECL
+
+namespace TAO
+{
+ namespace SL3
+ {
+ static const size_t CREDENTIALS_TABLE_SIZE = 128;
+ }
+}
+
+TAO::SL3::CredentialsCurator::CredentialsCurator (void)
+ : lock_ (),
+ acquirer_factories_ (),
+ credentials_table_ (TAO::SL3::CREDENTIALS_TABLE_SIZE)
+{
+}
+
+TAO::SL3::CredentialsCurator::~CredentialsCurator (void)
+{
+ const Factory_Iterator fend = this->acquirer_factories_.end ();
+ for (Factory_Iterator i = this->acquirer_factories_.begin ();
+ i != fend;
+ ++i)
+ {
+ // Deallocate the Acquistion Method.
+ CORBA::string_free (const_cast<char *> ((*i).ext_id_));
+
+ delete (*i).int_id_;
+ }
+
+ this->acquirer_factories_.close ();
+
+ const Credentials_Iterator end = this->credentials_table_.end ();
+ for (Credentials_Iterator j = this->credentials_table_.begin ();
+ j != end;
+ ++j)
+ {
+ // Deallocate the CredentialsId.
+ CORBA::string_free (const_cast<char *> ((*j).ext_id_));
+ }
+
+ this->credentials_table_.close ();
+}
+
+TAO::SL3::CredentialsCurator_ptr
+TAO::SL3::CredentialsCurator::_duplicate (TAO::SL3::CredentialsCurator_ptr obj)
+{
+ if (!CORBA::is_nil (obj))
+ obj->_add_ref ();
+
+ return obj;
+}
+
+TAO::SL3::CredentialsCurator_ptr
+TAO::SL3::CredentialsCurator::_narrow (CORBA::Object_ptr obj
+ ACE_ENV_ARG_DECL_NOT_USED)
+{
+ return TAO::SL3::CredentialsCurator::_duplicate (
+ dynamic_cast<TAO::SL3::CredentialsCurator *> (obj));
+}
+
+TAO::SL3::CredentialsCurator_ptr
+TAO::SL3::CredentialsCurator::_nil (void)
+{
+ return (CredentialsCurator *) 0;
+}
+
+SecurityLevel3::AcquisitionMethodList *
+TAO::SL3::CredentialsCurator::supported_methods (ACE_ENV_SINGLE_ARG_DECL)
+ ACE_THROW_SPEC ((CORBA::SystemException))
+{
+ SecurityLevel3::AcquisitionMethodList * list;
+ ACE_NEW_THROW_EX (list,
+ SecurityLevel3::AcquisitionMethodList,
+ CORBA::NO_MEMORY ());
+ SecurityLevel3::AcquisitionMethodList_var methods = list;
+
+ ACE_GUARD_RETURN (TAO_SYNCH_MUTEX,
+ guard,
+ this->lock_,
+ 0);
+
+ methods->length (this->acquirer_factories_.current_size ());
+
+ CORBA::ULong n = 0;
+
+ const Factory_Iterator end = this->acquirer_factories_.end ();
+ for (Factory_Iterator i = this->acquirer_factories_.begin ();
+ i != end;
+ ++i)
+ {
+ methods[n++] = CORBA::string_dup ((*i).ext_id_);
+ }
+
+ return methods._retn ();
+}
+
+SecurityLevel3::CredentialsAcquirer_ptr
+TAO::SL3::CredentialsCurator::acquire_credentials (
+ const char * acquisition_method,
+ const CORBA::Any & acquisition_arguments
+ ACE_ENV_ARG_DECL)
+ ACE_THROW_SPEC ((CORBA::SystemException))
+{
+ TAO::SL3::CredentialsAcquirerFactory * factory;
+
+ if (this->acquirer_factories_.find (acquisition_method,
+ factory) == 0)
+ {
+ return factory->make (this,
+ acquisition_arguments
+ ACE_ENV_ARG_PARAMETER);
+ }
+
+ ACE_THROW_RETURN (CORBA::BAD_PARAM (),
+ SecurityLevel3::CredentialsAcquirer::_nil ());
+
+}
+
+SecurityLevel3::OwnCredentialsList *
+TAO::SL3::CredentialsCurator::default_creds_list (ACE_ENV_SINGLE_ARG_DECL)
+ ACE_THROW_SPEC ((CORBA::SystemException))
+{
+ SecurityLevel3::OwnCredentialsList * list;
+ ACE_NEW_THROW_EX (list,
+ SecurityLevel3::OwnCredentialsList,
+ CORBA::NO_MEMORY ());
+ ACE_CHECK_RETURN (0);
+
+ SecurityLevel3::OwnCredentialsList_var creds_list = list;
+
+ ACE_GUARD_RETURN (TAO_SYNCH_MUTEX,
+ guard,
+ this->lock_,
+ 0);
+
+ creds_list->length (this->credentials_table_.current_size ());
+
+ CORBA::ULong n = 0;
+
+ const Credentials_Iterator end = this->credentials_table_.end ();
+ for (Credentials_Iterator i = this->credentials_table_.begin ();
+ i != end;
+ ++i)
+ {
+ creds_list[n++] =
+ SecurityLevel3::OwnCredentials::_duplicate ((*i).int_id_.in());
+ }
+
+ return creds_list._retn ();
+}
+
+SecurityLevel3::CredentialsIdList *
+TAO::SL3::CredentialsCurator::default_creds_ids (ACE_ENV_SINGLE_ARG_DECL)
+ ACE_THROW_SPEC ((CORBA::SystemException))
+{
+ SecurityLevel3::CredentialsIdList * list;
+ ACE_NEW_THROW_EX (list,
+ SecurityLevel3::CredentialsIdList,
+ CORBA::NO_MEMORY ());
+ SecurityLevel3::CredentialsIdList_var creds_ids = list;
+
+ ACE_GUARD_RETURN (TAO_SYNCH_MUTEX,
+ guard,
+ this->lock_,
+ 0);
+
+ creds_ids->length (this->credentials_table_.current_size ());
+
+ CORBA::ULong n = 0;
+
+ const Credentials_Iterator end = this->credentials_table_.end ();
+ for (Credentials_Iterator i = this->credentials_table_.begin ();
+ i != end;
+ ++i)
+ {
+ creds_ids[n++] = CORBA::string_dup ((*i).ext_id_);
+ }
+
+ return creds_ids._retn ();
+}
+
+SecurityLevel3::OwnCredentials_ptr
+TAO::SL3::CredentialsCurator::get_own_credentials (
+ const char * credentials_id
+ ACE_ENV_ARG_DECL_NOT_USED)
+ ACE_THROW_SPEC ((CORBA::SystemException))
+{
+ Credentials_Table::ENTRY * entry;
+
+ ACE_GUARD_RETURN (TAO_SYNCH_MUTEX,
+ guard,
+ this->lock_,
+ SecurityLevel3::OwnCredentials::_nil ());
+
+ if (this->credentials_table_.find (credentials_id, entry) != 0)
+ {
+ return SecurityLevel3::OwnCredentials::_nil ();
+ }
+
+ return
+ SecurityLevel3::OwnCredentials::_duplicate (entry->int_id_.in ());
+}
+
+void
+TAO::SL3::CredentialsCurator::release_own_credentials (
+ const char * credentials_id
+ ACE_ENV_ARG_DECL_NOT_USED)
+ ACE_THROW_SPEC ((CORBA::SystemException))
+{
+ Credentials_Table::ENTRY * entry;
+
+ ACE_GUARD (TAO_SYNCH_MUTEX, guard, this->lock_);
+
+ if (this->credentials_table_.find (credentials_id, entry) == 0)
+ {
+ // Deallocate the external ID (a const char *) before unbinding.
+ CORBA::string_free (const_cast<char *> (entry->ext_id_));
+
+ (void) this->credentials_table_.unbind (entry);
+ }
+}
+
+void
+TAO::SL3::CredentialsCurator:: register_acquirer_factory (
+ const char * acquisition_method,
+ TAO::SL3::CredentialsAcquirerFactory * factory
+ ACE_ENV_ARG_DECL)
+{
+ if (acquisition_method == 0 || factory == 0)
+ ACE_THROW (CORBA::BAD_PARAM ());
+
+ CORBA::String_var method = CORBA::string_dup (acquisition_method);
+
+ ACE_GUARD (TAO_SYNCH_MUTEX, guard, this->lock_);
+
+ const int result =
+ this->acquirer_factories_.bind (method.in (), factory);
+
+ if (result == 1) // Entry already exists in table.
+ ACE_THROW (CORBA::BAD_INV_ORDER ());
+ else if (result == -1) // Failure.
+ ACE_THROW (CORBA::INTERNAL ());
+
+
+ // CredentialsCurator now owns the acquisition method id.
+ (void) method._retn ();
+
+ // Otherwise success!
+}
+
+void
+TAO::SL3::CredentialsCurator::_tao_add_own_credentials (
+ SecurityLevel3::OwnCredentials_ptr credentials
+ ACE_ENV_ARG_DECL)
+{
+ CORBA::String_var credentials_id =
+ credentials->creds_id (ACE_ENV_SINGLE_ARG_PARAMETER);
+ ACE_CHECK;
+
+ SecurityLevel3::OwnCredentials_var creds =
+ SecurityLevel3::OwnCredentials::_duplicate (credentials);
+
+ if (this->credentials_table_.bind (credentials_id.in (),
+ creds) != 0)
+ {
+ ACE_THROW (CORBA::NO_RESOURCES ());
+ }
+
+ // CredentialsCurator nows owns the id.
+ (void) credentials_id._retn ();
+}
+
+TAO_END_VERSIONED_NAMESPACE_DECL
diff --git a/TAO/orbsvcs/orbsvcs/Security/SL3_CredentialsCurator.h b/TAO/orbsvcs/orbsvcs/Security/SL3_CredentialsCurator.h
new file mode 100644
index 00000000000..85edccb3963
--- /dev/null
+++ b/TAO/orbsvcs/orbsvcs/Security/SL3_CredentialsCurator.h
@@ -0,0 +1,176 @@
+// -*- C++ -*-
+
+//=============================================================================
+/**
+ * @file SL3_CredentialsCurator.h
+ *
+ * $Id$
+ *
+ * @author Ossama Othman <ossama@dre.vanderbilt.edu>
+ */
+//=============================================================================
+
+
+#ifndef TAO_SL3_CREDENTIALS_CURATOR_H
+#define TAO_SL3_CREDENTIALS_CURATOR_H
+
+#include /**/ "ace/pre.h"
+#include "orbsvcs/Security/security_export.h"
+
+#if !defined (ACE_LACKS_PRAGMA_ONCE)
+# pragma once
+#endif /* ACE_LACKS_PRAGMA_ONCE */
+
+#include "orbsvcs/SecurityLevel3C.h"
+
+#include "tao/LocalObject.h"
+
+#include "ace/Hash_Map_Manager_T.h"
+#include "ace/Map_Manager.h"
+
+
+#if defined(_MSC_VER)
+#pragma warning(push)
+#pragma warning(disable:4250)
+#endif /* _MSC_VER */
+
+
+TAO_BEGIN_VERSIONED_NAMESPACE_DECL
+
+namespace TAO
+{
+ namespace SL3
+ {
+ class CredentialsAcquirerFactory;
+
+ class CredentialsCurator;
+ typedef CredentialsCurator* CredentialsCurator_ptr;
+ typedef TAO_Pseudo_Var_T<CredentialsCurator> CredentialsCurator_var;
+ typedef TAO_Pseudo_Out_T<CredentialsCurator> CredentialsCurator_out;
+
+ /**
+ * @class CredentialsCurator
+ *
+ * @brief Implementation of the SecurityLevel3::CredentialsCurator
+ * object.
+ *
+ * This class provides a means for creating and managing
+ * OwnCredentials.
+ */
+ class TAO_Security_Export CredentialsCurator
+ : public virtual SecurityLevel3::CredentialsCurator,
+ public virtual TAO_Local_RefCounted_Object
+ {
+ public:
+ typedef CredentialsCurator_ptr _ptr_type;
+ typedef CredentialsCurator_var _var_type;
+ typedef CredentialsCurator_out _out_type;
+
+ /**
+ * The type of table that maps acquisition method to acquirer
+ * factory.
+ */
+ typedef ACE_Map_Manager<const char *,
+ TAO::SL3::CredentialsAcquirerFactory *,
+ ACE_Null_Mutex> Acquirer_Factory_Table;
+ typedef Acquirer_Factory_Table::iterator Factory_Iterator;
+
+ typedef ACE_Hash_Map_Manager_Ex <const char *,
+ SecurityLevel3::OwnCredentials_var,
+ ACE_Hash<const char *>,
+ ACE_Equal_To<const char *>,
+ ACE_Null_Mutex> Credentials_Table;
+ typedef Credentials_Table::iterator Credentials_Iterator;
+
+ /// Constructor
+ CredentialsCurator (void);
+
+ static CredentialsCurator_ptr _duplicate (CredentialsCurator_ptr obj);
+ static CredentialsCurator_ptr _nil (void);
+ static CredentialsCurator_ptr _narrow (CORBA::Object_ptr obj
+ ACE_ENV_ARG_DECL);
+
+ /**
+ * @name SecurityLevel3::CredentialsCurator Methods
+ *
+ * Methods required by the SecurityLevel3::CredentialsCurator
+ * interface.
+ */
+ //@{
+ virtual SecurityLevel3::AcquisitionMethodList * supported_methods (
+ ACE_ENV_SINGLE_ARG_DECL)
+ ACE_THROW_SPEC ((CORBA::SystemException));
+
+ virtual SecurityLevel3::CredentialsAcquirer_ptr acquire_credentials (
+ const char * acquisition_method,
+ const CORBA::Any & acquisition_arguments
+ ACE_ENV_ARG_DECL)
+ ACE_THROW_SPEC ((CORBA::SystemException));
+
+ virtual SecurityLevel3::OwnCredentialsList * default_creds_list (
+ ACE_ENV_SINGLE_ARG_DECL)
+ ACE_THROW_SPEC ((CORBA::SystemException));
+
+ virtual SecurityLevel3::CredentialsIdList * default_creds_ids (
+ ACE_ENV_SINGLE_ARG_DECL)
+ ACE_THROW_SPEC ((CORBA::SystemException));
+
+ virtual SecurityLevel3::OwnCredentials_ptr get_own_credentials (
+ const char * credentials_id
+ ACE_ENV_ARG_DECL)
+ ACE_THROW_SPEC ((CORBA::SystemException));
+
+ virtual void release_own_credentials (const char * credentials_id
+ ACE_ENV_ARG_DECL)
+ ACE_THROW_SPEC ((CORBA::SystemException));
+ //@}
+
+ /// Register CredentialsAcquirer factory.
+ /**
+ * @note The CredentialsCurator retains ownership of the
+ * factory.
+ */
+ void register_acquirer_factory (
+ const char * acquisition_method,
+ TAO::SL3::CredentialsAcquirerFactory * factory
+ ACE_ENV_ARG_DECL);
+
+ /// TAO-specific means of adding credentials to this
+ /// CredentialsCurator's "own credentials" list.
+ void _tao_add_own_credentials (
+ SecurityLevel3::OwnCredentials_ptr credentials
+ ACE_ENV_ARG_DECL);
+
+ protected:
+
+ /// Destructor
+ /**
+ * Protected destructor to enforce proper memory management
+ * through the reference counting mechanism.
+ */
+ ~CredentialsCurator (void);
+
+ private:
+
+ /// Lock used to synchronize access to underlying tables.
+ TAO_SYNCH_MUTEX lock_;
+
+ /// Table of CredentialsAcquirer factories.
+ Acquirer_Factory_Table acquirer_factories_;
+
+ /// Table of OwnCredentials.
+ Credentials_Table credentials_table_;
+ };
+ } // End SL3 namespace
+} // End TAO namespace
+
+
+TAO_END_VERSIONED_NAMESPACE_DECL
+
+#if defined(_MSC_VER)
+#pragma warning(pop)
+#endif /* _MSC_VER */
+
+#include /**/ "ace/post.h"
+
+#endif /* TAO_SL3_CREDENTIALS_CURATOR_H */
diff --git a/TAO/orbsvcs/orbsvcs/Security/SL3_ObjectCredentialsPolicy.cpp b/TAO/orbsvcs/orbsvcs/Security/SL3_ObjectCredentialsPolicy.cpp
new file mode 100644
index 00000000000..69cac1d1ae1
--- /dev/null
+++ b/TAO/orbsvcs/orbsvcs/Security/SL3_ObjectCredentialsPolicy.cpp
@@ -0,0 +1,65 @@
+// $Id$
+
+#include "orbsvcs/Security/SL3_ObjectCredentialsPolicy.h"
+
+
+ACE_RCSID (Security,
+ SL3_ObjectCredentialsPolicy,
+ "$Id$")
+
+
+TAO_BEGIN_VERSIONED_NAMESPACE_DECL
+
+TAO::SL3::ObjectCredentialsPolicy::ObjectCredentialsPolicy (
+ const SecurityLevel3::OwnCredentialsList & creds)
+ : creds_list_ (creds)
+{
+}
+
+TAO::SL3::ObjectCredentialsPolicy::~ObjectCredentialsPolicy (void)
+{
+}
+
+SecurityLevel3::OwnCredentialsList *
+TAO::SL3::ObjectCredentialsPolicy::creds_list (ACE_ENV_SINGLE_ARG_DECL)
+ ACE_THROW_SPEC ((CORBA::SystemException))
+{
+ SecurityLevel3::OwnCredentialsList * creds = 0;
+
+ ACE_NEW_THROW_EX (creds,
+ SecurityLevel3::OwnCredentialsList (this->creds_list_),
+ CORBA::NO_MEMORY ());
+ ACE_CHECK_RETURN (creds);
+
+ return creds;
+}
+
+CORBA::PolicyType
+TAO::SL3::ObjectCredentialsPolicy::policy_type (
+ ACE_ENV_SINGLE_ARG_DECL_NOT_USED)
+ ACE_THROW_SPEC ((CORBA::SystemException))
+{
+ return SecurityLevel3::ObjectCredentialsPolicyType;
+}
+
+CORBA::Policy_ptr
+TAO::SL3::ObjectCredentialsPolicy::copy (ACE_ENV_SINGLE_ARG_DECL)
+ ACE_THROW_SPEC ((CORBA::SystemException))
+{
+ CORBA::Policy_ptr p = CORBA::Policy::_nil ();
+ ACE_NEW_THROW_EX (p,
+ TAO::SL3::ObjectCredentialsPolicy (this->creds_list_),
+ CORBA::NO_MEMORY ());
+ ACE_CHECK_RETURN (p);
+
+ return p;
+}
+
+void
+TAO::SL3::ObjectCredentialsPolicy::destroy (ACE_ENV_SINGLE_ARG_DECL_NOT_USED)
+ ACE_THROW_SPEC ((CORBA::SystemException))
+{
+ this->creds_list_.length (0);
+}
+
+TAO_END_VERSIONED_NAMESPACE_DECL
diff --git a/TAO/orbsvcs/orbsvcs/Security/SL3_ObjectCredentialsPolicy.h b/TAO/orbsvcs/orbsvcs/Security/SL3_ObjectCredentialsPolicy.h
new file mode 100644
index 00000000000..c4479d9aa8e
--- /dev/null
+++ b/TAO/orbsvcs/orbsvcs/Security/SL3_ObjectCredentialsPolicy.h
@@ -0,0 +1,110 @@
+// -*- C++ -*-
+
+//=============================================================================
+/**
+ * @file SL3_ObjectCredentialsPolicy.h
+ *
+ * $Id$
+ *
+ * @author Ossama Othman <ossama@dre.vanderbilt.edu>
+ */
+//=============================================================================
+
+
+#ifndef TAO_SL3_OBJECT_CREDENTIALS_POLICY_H
+#define TAO_SL3_OBJECT_CREDENTIALS_POLICY_H
+
+#include /**/ "ace/pre.h"
+#include "orbsvcs/Security/security_export.h"
+
+#if !defined (ACE_LACKS_PRAGMA_ONCE)
+# pragma once
+#endif /* ACE_LACKS_PRAGMA_ONCE */
+
+#include "orbsvcs/SecurityLevel3C.h"
+
+#include "tao/LocalObject.h"
+
+#if defined(_MSC_VER)
+#pragma warning(push)
+#pragma warning(disable:4250)
+#endif /* _MSC_VER */
+
+
+TAO_BEGIN_VERSIONED_NAMESPACE_DECL
+
+namespace TAO
+{
+ namespace SL3
+ {
+ /**
+ * @class ObjectCredentialsPolicy
+ *
+ * @brief POA-specific Policy containing server's "own"
+ * credentials.
+ *
+ * This policy may be passed in the PolicyList argument of
+ * PortableServer::POA::create_POA() method. Targets under that
+ * POA will have the credentials contained within this Policy
+ * associated with them.
+ */
+ class ObjectCredentialsPolicy
+ : public virtual SecurityLevel3::ObjectCredentialsPolicy,
+ public virtual TAO_Local_RefCounted_Object
+ {
+ public:
+
+ /// Constructor
+ ObjectCredentialsPolicy (
+ const SecurityLevel3::OwnCredentialsList & creds);
+
+ /**
+ * @name SecurityLevel3::ObjectCredentialsPolicy Methods
+ *
+ * Methods required by the
+ * SecurityLevel3::ObjectCredentialsPolicy interface.
+ */
+ //@{
+ virtual SecurityLevel3::OwnCredentialsList * creds_list (
+ ACE_ENV_SINGLE_ARG_DECL)
+ ACE_THROW_SPEC ((CORBA::SystemException));
+
+ virtual CORBA::PolicyType policy_type (ACE_ENV_SINGLE_ARG_DECL)
+ ACE_THROW_SPEC ((CORBA::SystemException));
+
+ virtual CORBA::Policy_ptr copy (ACE_ENV_SINGLE_ARG_DECL)
+ ACE_THROW_SPEC ((CORBA::SystemException));
+
+ virtual void destroy (ACE_ENV_SINGLE_ARG_DECL)
+ ACE_THROW_SPEC ((CORBA::SystemException));
+ //@}
+
+ protected:
+
+ /// Destructor
+ /**
+ * Protected destructor to enforce proper memory management
+ * through the reference counting mechanism.
+ */
+ ~ObjectCredentialsPolicy (void);
+
+ private:
+
+ /// List of POA-specific OwnCredentials.
+ SecurityLevel3::OwnCredentialsList creds_list_;
+
+ };
+
+ } // End SL3 namespace
+
+} // End TAO namespace
+
+TAO_END_VERSIONED_NAMESPACE_DECL
+
+#if defined(_MSC_VER)
+#pragma warning(pop)
+#endif /* _MSC_VER */
+
+#include /**/ "ace/post.h"
+
+#endif /* TAO_SL3_OBJECT_CREDENTIALS_POLICY_H */
diff --git a/TAO/orbsvcs/orbsvcs/Security/SL3_PolicyFactory.cpp b/TAO/orbsvcs/orbsvcs/Security/SL3_PolicyFactory.cpp
new file mode 100644
index 00000000000..959a93e4885
--- /dev/null
+++ b/TAO/orbsvcs/orbsvcs/Security/SL3_PolicyFactory.cpp
@@ -0,0 +1,63 @@
+// $Id$
+
+#include "orbsvcs/Security/SL3_PolicyFactory.h"
+#include "orbsvcs/Security/SL3_ContextEstablishmentPolicy.h"
+#include "orbsvcs/Security/SL3_ObjectCredentialsPolicy.h"
+
+
+ACE_RCSID (Security,
+ SL3_PolicyFactory,
+ "$Id$")
+
+
+TAO_BEGIN_VERSIONED_NAMESPACE_DECL
+
+CORBA::Policy_ptr
+TAO::SL3::PolicyFactory::create_policy (CORBA::PolicyType type,
+ const CORBA::Any & value
+ ACE_ENV_ARG_DECL)
+ ACE_THROW_SPEC ((CORBA::SystemException,
+ CORBA::PolicyError))
+{
+ CORBA::Policy_ptr policy = CORBA::Policy::_nil ();
+
+ if (type == SecurityLevel3::ContextEstablishmentPolicyType)
+ {
+ SecurityLevel3::ContextEstablishmentPolicyArgument * arg = 0;
+ if (!(value >>= arg))
+ ACE_THROW_RETURN (CORBA::INTERNAL (),
+ policy);
+
+ ACE_NEW_THROW_EX (policy,
+ TAO::SL3::ContextEstablishmentPolicy (
+ arg->creds_directive,
+ arg->creds_list,
+ arg->use_client_auth,
+ arg->use_target_auth,
+ arg->use_confidentiality,
+ arg->use_integrity),
+ CORBA::NO_MEMORY ());
+ ACE_CHECK_RETURN (policy);
+ }
+ else if (type == SecurityLevel3::ObjectCredentialsPolicyType)
+ {
+ SecurityLevel3::ObjectCredentialsPolicyArgument * creds = 0;
+ if (!(value >>= creds))
+ ACE_THROW_RETURN (CORBA::INTERNAL (),
+ policy);
+
+ ACE_NEW_THROW_EX (policy,
+ TAO::SL3::ObjectCredentialsPolicy (*creds),
+ CORBA::NO_MEMORY ());
+ ACE_CHECK_RETURN (policy);
+ }
+ else
+ {
+ ACE_THROW_RETURN (CORBA::PolicyError (CORBA::BAD_POLICY_TYPE),
+ policy);
+ }
+
+ return policy;
+}
+
+TAO_END_VERSIONED_NAMESPACE_DECL
diff --git a/TAO/orbsvcs/orbsvcs/Security/SL3_PolicyFactory.h b/TAO/orbsvcs/orbsvcs/Security/SL3_PolicyFactory.h
new file mode 100644
index 00000000000..9c3a36b0913
--- /dev/null
+++ b/TAO/orbsvcs/orbsvcs/Security/SL3_PolicyFactory.h
@@ -0,0 +1,82 @@
+// -*- C++ -*-
+
+//=============================================================================
+/**
+ * @file SL3_PolicyFactory.h
+ *
+ * $Id$
+ *
+ * PolicyFactory implementation for the SecurityLevel3 policies.
+ *
+ * @author Ossama Othman <ossama@dre.vanderbilt.edu>
+ */
+//=============================================================================
+
+#ifndef TAO_SL3_POLICY_FACTORY_H
+#define TAO_SL3_POLICY_FACTORY_H
+
+#include "ace/config-all.h"
+
+#if !defined (ACE_LACKS_PRAGMA_ONCE)
+# pragma once
+#endif /* ACE_LACKS_PRAGMA_ONCE */
+
+#include "tao/PI/PI.h"
+#include "tao/LocalObject.h"
+
+#if defined(_MSC_VER)
+#pragma warning(push)
+#pragma warning(disable:4250)
+#endif /* _MSC_VER */
+
+TAO_BEGIN_VERSIONED_NAMESPACE_DECL
+
+namespace TAO
+{
+ namespace SL3
+ {
+
+ /**
+ * @class olicyFactory
+ *
+ * @brief SecurityLevel3 PolicyFactory
+ *
+ * PolicyFactory for all SecurityLevel3 policies.
+ */
+ class PolicyFactory
+ : public virtual PortableInterceptor::PolicyFactory,
+ public virtual TAO_Local_RefCounted_Object
+ {
+ public:
+
+ /**
+ * @name Methods Required by the PolicyFactory Interface
+ *
+ * These are methods that must be implemented since they are
+ * pure virtual in the abstract base class. They are the
+ * canonical methods required for all PolicyFactory
+ * sub-classes.
+ */
+ //@{
+
+ /// Construct a Test::Policy object as a test.
+ virtual CORBA::Policy_ptr create_policy (CORBA::PolicyType type,
+ const CORBA::Any & value
+ ACE_ENV_ARG_DECL)
+ ACE_THROW_SPEC ((CORBA::SystemException,
+ CORBA::PolicyError));
+
+ //@}
+
+ };
+
+ } // End SL3 namespace.
+} // End TAO namespace.
+
+TAO_END_VERSIONED_NAMESPACE_DECL
+
+#if defined(_MSC_VER)
+#pragma warning(pop)
+#endif /* _MSC_VER */
+
+#endif /* TAO_SL3_POLICY_FACTORY_H */
diff --git a/TAO/orbsvcs/orbsvcs/Security/SL3_SecurityCurrent.cpp b/TAO/orbsvcs/orbsvcs/Security/SL3_SecurityCurrent.cpp
new file mode 100644
index 00000000000..db6609f803b
--- /dev/null
+++ b/TAO/orbsvcs/orbsvcs/Security/SL3_SecurityCurrent.cpp
@@ -0,0 +1,60 @@
+// $Id$
+
+#include "orbsvcs/Security/SL3_SecurityCurrent.h"
+
+
+ACE_RCSID (Security,
+ SL3_SecurityCurrent,
+ "$Id$")
+
+
+#if !defined (__ACE_INLINE__)
+# include "orbsvcs/Security/SL3_SecurityCurrent.inl"
+#endif /* __ACE_INLINE__ */
+
+TAO_BEGIN_VERSIONED_NAMESPACE_DECL
+
+TAO::SL3::SecurityCurrent::SecurityCurrent (size_t tss_slot,
+ TAO_ORB_Core * oc)
+ : tss_slot_ (tss_slot),
+ orb_core_ (oc)
+{
+}
+
+
+TAO::SL3::SecurityCurrent::~SecurityCurrent (void)
+{
+}
+
+SecurityLevel3::ClientCredentials_ptr
+TAO::SL3::SecurityCurrent::client_credentials (ACE_ENV_SINGLE_ARG_DECL)
+ ACE_THROW_SPEC ((CORBA::SystemException))
+{
+ TAO::SL3::SecurityCurrent_Impl * impl = this->implementation ();
+
+ // If the implementation pointer returned from TSS is zero, then
+ // we're not in the middle of a request/upcall. Throw an exception
+ // to indicate that.
+ if (impl == 0)
+ ACE_THROW_RETURN (CORBA::BAD_INV_ORDER (),
+ SecurityLevel3::ClientCredentials::_nil ());
+
+ return impl->client_credentials (ACE_ENV_SINGLE_ARG_PARAMETER);
+}
+
+CORBA::Boolean
+TAO::SL3::SecurityCurrent::request_is_local (ACE_ENV_SINGLE_ARG_DECL)
+ ACE_THROW_SPEC ((CORBA::SystemException))
+{
+ TAO::SL3::SecurityCurrent_Impl * impl = this->implementation ();
+
+ // If the implementation pointer returned from TSS is zero, then
+ // we're not in the middle of a request/upcall. Throw an exception
+ // to indicate that.
+ if (impl == 0)
+ ACE_THROW_RETURN (CORBA::BAD_INV_ORDER (), false);
+
+ return impl->request_is_local (ACE_ENV_SINGLE_ARG_PARAMETER);
+}
+
+TAO_END_VERSIONED_NAMESPACE_DECL
diff --git a/TAO/orbsvcs/orbsvcs/Security/SL3_SecurityCurrent.h b/TAO/orbsvcs/orbsvcs/Security/SL3_SecurityCurrent.h
new file mode 100644
index 00000000000..b592530c19e
--- /dev/null
+++ b/TAO/orbsvcs/orbsvcs/Security/SL3_SecurityCurrent.h
@@ -0,0 +1,152 @@
+// -*- C++ -*-
+
+//=============================================================================
+/**
+ * @file SL3_SecurityCurrent.h
+ *
+ * $Id$
+ *
+ * @author Ossama Othman <ossama@dre.vanderbilt.edu>
+ */
+//=============================================================================
+
+
+#ifndef TAO_SL3_SECURITY_CURRENT_H
+#define TAO_SL3_SECURITY_CURRENT_H
+
+#include /**/ "ace/pre.h"
+
+#include "orbsvcs/Security/security_export.h"
+
+#if !defined (ACE_LACKS_PRAGMA_ONCE)
+# pragma once
+#endif /* ACE_LACKS_PRAGMA_ONCE */
+
+#include "orbsvcs/Security/SL3_SecurityCurrent_Impl.h"
+
+#include "orbsvcs/SecurityLevel3C.h"
+
+#include "tao/LocalObject.h"
+
+#if defined(_MSC_VER)
+#pragma warning(push)
+#pragma warning(disable:4250)
+#endif /* _MSC_VER */
+
+TAO_BEGIN_VERSIONED_NAMESPACE_DECL
+
+class TAO_ORB_Core;
+
+namespace TAO
+{
+ namespace SL3
+ {
+ /**
+ * @class SecurityCurrent
+ *
+ * @brief SecurityLevel3::SecurityCurrent implementation.
+ *
+ * Thread-specific information may be retrieved from the target
+ * security service through this object.
+ *
+ * @note This SecurityCurrent implementation basically a variant
+ * of the bridge design pattern. All operations are
+ * delegated on to concrete implementations.
+ */
+ class TAO_Security_Export SecurityCurrent
+ : public virtual SecurityLevel3::SecurityCurrent,
+ public virtual TAO_Local_RefCounted_Object
+ {
+ public:
+
+ /// Constructor
+ SecurityCurrent (size_t tss_slot, TAO_ORB_Core * oc);
+
+ /**
+ * @name SecurityLevel3::SecurityCurrent Methods
+ *
+ * Methods required by the SecurityLevel3::SecurityCurrent
+ * interface.
+ */
+ //@{
+ virtual SecurityLevel3::ClientCredentials_ptr client_credentials (
+ ACE_ENV_SINGLE_ARG_DECL)
+ ACE_THROW_SPEC ((CORBA::SystemException));
+
+ virtual CORBA::Boolean request_is_local (ACE_ENV_SINGLE_ARG_DECL)
+ ACE_THROW_SPEC ((CORBA::SystemException));
+ //@}
+
+ /// Return the TSS slot ID assigned to the "SecurityCurrent"
+ /// object.
+ /**
+ * The concrete thread-specific storage SecurityCurrent
+ * implementations will each use this slot ID.
+ */
+ size_t tss_slot (void) const;
+
+ protected:
+
+ /// Destructor
+ /**
+ * Protected destructor to enforce proper memory management
+ * through the reference counting mechanism.
+ */
+ ~SecurityCurrent (void);
+
+ private:
+
+ /// Set the thread-specific storage
+ /// SecurityLevel3::SecurityCurrent implementation.
+ /**
+ * The pointer is actually one to a concrete implementation provided
+ * by the underlying security mechanism. For example, SSLIOP
+ * implements its own SSLIOP-specific operations corresponding
+ * to the ones exposed by the SecurityCurrent interface.
+ * Similarly, SECIOP would do the same.
+ * @par
+ * There is no function that places the implementation pointer
+ * in TSS. The underlying security mechanism does that.
+ */
+ SecurityCurrent_Impl * implementation (void);
+
+ private:
+
+ /**
+ * @name Retricted Copying and Assignment
+ *
+ * Prevent copying through the copy constructor and the
+ * assignment operator.
+ */
+ //@{
+ SecurityCurrent (const SecurityCurrent &);
+ void operator= (const SecurityCurrent &);
+ //@}
+
+ private:
+
+ /// Thread-specific storage slot assigned to this object.
+ const size_t tss_slot_;
+
+ /// Pointer to the ORB Core corresponding to the ORB with which
+ /// this object is registered.
+ TAO_ORB_Core * const orb_core_;
+
+ };
+
+ } // End SL3 namespace
+} // End TAO namespace
+
+TAO_END_VERSIONED_NAMESPACE_DECL
+
+#if defined (__ACE_INLINE__)
+# include "orbsvcs/Security/SL3_SecurityCurrent.inl"
+#endif /* __ACE_INLINE__ */
+
+#if defined(_MSC_VER)
+#pragma warning(pop)
+#endif /* _MSC_VER */
+
+#include /**/ "ace/post.h"
+
+#endif /* TAO_SL3_SECURITY_CURRENT_H */
diff --git a/TAO/orbsvcs/orbsvcs/Security/SL3_SecurityCurrent.inl b/TAO/orbsvcs/orbsvcs/Security/SL3_SecurityCurrent.inl
new file mode 100644
index 00000000000..4194ffe1895
--- /dev/null
+++ b/TAO/orbsvcs/orbsvcs/Security/SL3_SecurityCurrent.inl
@@ -0,0 +1,26 @@
+// -*- C++ -*-
+//
+// $Id$
+
+#include "tao/ORB_Core.h"
+
+
+TAO_BEGIN_VERSIONED_NAMESPACE_DECL
+
+ACE_INLINE size_t
+TAO::SL3::SecurityCurrent::tss_slot (void) const
+{
+ return this->tss_slot_;
+}
+
+ACE_INLINE TAO::SL3::SecurityCurrent_Impl *
+TAO::SL3::SecurityCurrent::implementation (void)
+{
+ TAO::SL3::SecurityCurrent_Impl *impl =
+ static_cast<TAO::SL3::SecurityCurrent_Impl *> (
+ this->orb_core_->get_tss_resource (this->tss_slot_));
+
+ return impl;
+}
+
+TAO_END_VERSIONED_NAMESPACE_DECL
diff --git a/TAO/orbsvcs/orbsvcs/Security/SL3_SecurityCurrent_Impl.cpp b/TAO/orbsvcs/orbsvcs/Security/SL3_SecurityCurrent_Impl.cpp
new file mode 100644
index 00000000000..14b7a548c16
--- /dev/null
+++ b/TAO/orbsvcs/orbsvcs/Security/SL3_SecurityCurrent_Impl.cpp
@@ -0,0 +1,16 @@
+// -*- C++ -*-
+
+#include "orbsvcs/Security/SL3_SecurityCurrent_Impl.h"
+
+ACE_RCSID (Security,
+ SL3_Security_Current_Impl,
+ "$Id$")
+
+
+TAO_BEGIN_VERSIONED_NAMESPACE_DECL
+
+TAO::SL3::SecurityCurrent_Impl::~SecurityCurrent_Impl (void)
+{
+}
+
+TAO_END_VERSIONED_NAMESPACE_DECL
diff --git a/TAO/orbsvcs/orbsvcs/Security/SL3_SecurityCurrent_Impl.h b/TAO/orbsvcs/orbsvcs/Security/SL3_SecurityCurrent_Impl.h
new file mode 100644
index 00000000000..59501c69339
--- /dev/null
+++ b/TAO/orbsvcs/orbsvcs/Security/SL3_SecurityCurrent_Impl.h
@@ -0,0 +1,85 @@
+// -*- C++ -*-
+
+// ===================================================================
+/**
+ * @file SL3_SecurityCurrent_Impl.h
+ *
+ * $Id$
+ *
+ * @author Ossama Othman <ossama@dre.vanderbilt.edu>
+ */
+// ===================================================================
+
+#ifndef TAO_SL3_SECURITY_CURRENT_IMPL_H
+#define TAO_SL3_SECURITY_CURRENT_IMPL_H
+
+#include /**/ "ace/pre.h"
+
+#include "ace/config-all.h"
+
+#if !defined (ACE_LACKS_PRAGMA_ONCE)
+# pragma once
+#endif /* ACE_LACKS_PRAGMA_ONCE */
+
+#include "orbsvcs/Security/security_export.h"
+#include "orbsvcs/SecurityLevel3C.h"
+
+
+TAO_BEGIN_VERSIONED_NAMESPACE_DECL
+
+namespace TAO
+{
+ namespace SL3
+ {
+ /**
+ * @class SecurityCurrent_Impl
+ *
+ * @brief Base class for the TSS portion of any underlying
+ * security mechanism.
+ *
+ * This class provides the same interface as the
+ * SecurityLevel3::SecurityCurrent object. However, it is not
+ * derived from that interface since we need to explicitly avoid
+ * virtual inheritance so that it is safe to store subclasses in a
+ * "void * *" and later cast that pointer back to the subclass
+ * pointer type.
+ */
+ class TAO_Security_Export SecurityCurrent_Impl
+ {
+ public:
+
+ /// Destructor.
+ virtual ~SecurityCurrent_Impl (void);
+
+ /**
+ * @name SecurityLevel3::Current Methods
+ *
+ * These methods are founds in the SecurityLevel3::Current
+ * interface.
+ */
+ //@{
+ /// Return the Credentials received from the client associate with
+ /// the current request.
+ virtual SecurityLevel3::ClientCredentials_ptr client_credentials (
+ ACE_ENV_SINGLE_ARG_DECL)
+ ACE_THROW_SPEC ((CORBA::SystemException)) = 0;
+
+ /// Is the current request local?
+ virtual CORBA::Boolean request_is_local (
+ ACE_ENV_SINGLE_ARG_DECL)
+ ACE_THROW_SPEC ((CORBA::SystemException)) = 0;
+ //@}
+
+ /// Return the unique tag that identifies the concrete subclass.
+ virtual CORBA::ULong tag (void) const = 0;
+
+ };
+
+ } // End Security namespace.
+} // End TAO namespace.
+
+TAO_END_VERSIONED_NAMESPACE_DECL
+
+#include /**/ "ace/post.h"
+
+#endif /* TAO_SL3_SECURITY_CURRENT_IMPL_H */
diff --git a/TAO/orbsvcs/orbsvcs/Security/SL3_SecurityManager.cpp b/TAO/orbsvcs/orbsvcs/Security/SL3_SecurityManager.cpp
new file mode 100644
index 00000000000..1cf548a4f2e
--- /dev/null
+++ b/TAO/orbsvcs/orbsvcs/Security/SL3_SecurityManager.cpp
@@ -0,0 +1,84 @@
+// $Id$
+
+#include "orbsvcs/Security/SL3_SecurityManager.h"
+#include "orbsvcs/Security/SL3_ContextEstablishmentPolicy.h"
+#include "orbsvcs/Security/SL3_ObjectCredentialsPolicy.h"
+
+
+ACE_RCSID (Security,
+ SL3_SecurityManager,
+ "$Id$")
+
+
+TAO_BEGIN_VERSIONED_NAMESPACE_DECL
+
+TAO::SL3::SecurityManager::SecurityManager (
+ SecurityLevel3::CredentialsCurator_ptr cc)
+ : credentials_curator_ (SecurityLevel3::CredentialsCurator::_duplicate (cc))
+{
+}
+
+TAO::SL3::SecurityManager::~SecurityManager (void)
+{
+}
+
+SecurityLevel3::CredentialsCurator_ptr
+TAO::SL3::SecurityManager::credentials_curator (
+ ACE_ENV_SINGLE_ARG_DECL_NOT_USED)
+ ACE_THROW_SPEC ((CORBA::SystemException))
+{
+ return
+ SecurityLevel3::CredentialsCurator::_duplicate (
+ this->credentials_curator_.in ());
+}
+
+SecurityLevel3::TargetCredentials_ptr
+TAO::SL3::SecurityManager::get_target_credentials (CORBA::Object_ptr /* the_object */
+ ACE_ENV_ARG_DECL)
+ ACE_THROW_SPEC ((CORBA::SystemException))
+{
+ ACE_THROW_RETURN (CORBA::NO_IMPLEMENT (),
+ SecurityLevel3::TargetCredentials::_nil ());
+}
+
+SecurityLevel3::ContextEstablishmentPolicy_ptr
+TAO::SL3::SecurityManager::create_context_estab_policy (
+ SecurityLevel3::CredsDirective creds_directive,
+ const SecurityLevel3::OwnCredentialsList & creds_list,
+ SecurityLevel3::FeatureDirective use_client_auth,
+ SecurityLevel3::FeatureDirective use_target_auth,
+ SecurityLevel3::FeatureDirective use_confidentiality,
+ SecurityLevel3::FeatureDirective use_integrity
+ ACE_ENV_ARG_DECL)
+ ACE_THROW_SPEC ((CORBA::SystemException))
+{
+ SecurityLevel3::ContextEstablishmentPolicy_ptr policy;
+ ACE_NEW_THROW_EX (policy,
+ TAO::SL3::ContextEstablishmentPolicy (creds_directive,
+ creds_list,
+ use_client_auth,
+ use_target_auth,
+ use_confidentiality,
+ use_integrity),
+ CORBA::NO_MEMORY ());
+ ACE_CHECK_RETURN (policy);
+
+ return policy;
+}
+
+SecurityLevel3::ObjectCredentialsPolicy_ptr
+TAO::SL3::SecurityManager::create_object_creds_policy (
+ const SecurityLevel3::OwnCredentialsList & creds_list
+ ACE_ENV_ARG_DECL)
+ ACE_THROW_SPEC ((CORBA::SystemException))
+{
+ SecurityLevel3::ObjectCredentialsPolicy_ptr policy;
+ ACE_NEW_THROW_EX (policy,
+ TAO::SL3::ObjectCredentialsPolicy (creds_list),
+ CORBA::NO_MEMORY ());
+ ACE_CHECK_RETURN (policy);
+
+ return policy;
+}
+
+TAO_END_VERSIONED_NAMESPACE_DECL
diff --git a/TAO/orbsvcs/orbsvcs/Security/SL3_SecurityManager.h b/TAO/orbsvcs/orbsvcs/Security/SL3_SecurityManager.h
new file mode 100644
index 00000000000..3f1ac2054ae
--- /dev/null
+++ b/TAO/orbsvcs/orbsvcs/Security/SL3_SecurityManager.h
@@ -0,0 +1,119 @@
+// -*- C++ -*-
+
+//=============================================================================
+/**
+ * @file SL3_SecurityManager.h
+ *
+ * $Id$
+ *
+ * @author Ossama Othman <ossama@dre.vanderbilt.edu>
+ */
+//=============================================================================
+
+
+#ifndef TAO_SL3_SECURITY_MANAGER_H
+#define TAO_SL3_SECURITY_MANAGER_H
+
+#include /**/ "ace/pre.h"
+#include "orbsvcs/Security/security_export.h"
+
+#if !defined (ACE_LACKS_PRAGMA_ONCE)
+# pragma once
+#endif /* ACE_LACKS_PRAGMA_ONCE */
+
+#include "orbsvcs/SecurityLevel3C.h"
+
+#include "tao/LocalObject.h"
+
+#if defined(_MSC_VER)
+#pragma warning(push)
+#pragma warning(disable:4250)
+#endif /* _MSC_VER */
+
+
+TAO_BEGIN_VERSIONED_NAMESPACE_DECL
+
+namespace TAO
+{
+ namespace SL3
+ {
+ /**
+ * @class SecurityManager
+ *
+ * @brief
+ *
+ *
+ */
+ class SecurityManager
+ : public virtual SecurityLevel3::SecurityManager,
+ public virtual TAO_Local_RefCounted_Object
+ {
+ public:
+
+ /// Constructor
+ SecurityManager (SecurityLevel3::CredentialsCurator_ptr cc);
+
+ /**
+ * @name SecurityLevel3::SecurityManager Methods
+ *
+ * Methods required by the SecurityLevel3::SecurityManager
+ * interface.
+ */
+ //@{
+ virtual SecurityLevel3::CredentialsCurator_ptr credentials_curator (
+ ACE_ENV_SINGLE_ARG_DECL)
+ ACE_THROW_SPEC ((CORBA::SystemException));
+
+ virtual SecurityLevel3::TargetCredentials_ptr get_target_credentials (
+ CORBA::Object_ptr the_object
+ ACE_ENV_ARG_DECL)
+ ACE_THROW_SPEC ((CORBA::SystemException));
+
+ virtual SecurityLevel3::ContextEstablishmentPolicy_ptr
+ create_context_estab_policy (
+ SecurityLevel3::CredsDirective creds_directive,
+ const SecurityLevel3::OwnCredentialsList & creds_list,
+ SecurityLevel3::FeatureDirective use_client_auth,
+ SecurityLevel3::FeatureDirective use_target_auth,
+ SecurityLevel3::FeatureDirective use_confidentiality,
+ SecurityLevel3::FeatureDirective use_integrity
+ ACE_ENV_ARG_DECL)
+ ACE_THROW_SPEC ((CORBA::SystemException));
+
+ virtual SecurityLevel3::ObjectCredentialsPolicy_ptr
+ create_object_creds_policy (
+ const SecurityLevel3::OwnCredentialsList & cred_list
+ ACE_ENV_ARG_DECL)
+ ACE_THROW_SPEC ((CORBA::SystemException));
+ //@}
+
+ protected:
+
+ /// Destructor
+ /**
+ * Protected destructor to enforce proper memory management
+ * through the reference counting mechanism.
+ */
+ virtual ~SecurityManager (void);
+
+ private:
+
+ /// The ORB-specific SecurityLevel3::CredentialsCurator
+ /// reference.
+ SecurityLevel3::CredentialsCurator_var credentials_curator_;
+
+ };
+
+ } // End SL3 namespace
+} // End TAO namespace
+
+TAO_END_VERSIONED_NAMESPACE_DECL
+
+
+#if defined(_MSC_VER)
+#pragma warning(pop)
+#endif /* _MSC_VER */
+
+#include /**/ "ace/post.h"
+
+#endif /* TAO_SL3_SECURITY_MANAGER_H */
diff --git a/TAO/orbsvcs/orbsvcs/Security/Security_Current.cpp b/TAO/orbsvcs/orbsvcs/Security/Security_Current.cpp
new file mode 100644
index 00000000000..0470c54ab17
--- /dev/null
+++ b/TAO/orbsvcs/orbsvcs/Security/Security_Current.cpp
@@ -0,0 +1,97 @@
+// -*- C++ -*-
+
+#include "orbsvcs/Security/Security_Current.h"
+#include "tao/debug.h"
+
+ACE_RCSID (Security,
+ Security_Current,
+ "$Id$")
+
+#if !defined (__ACE_INLINE__)
+# include "orbsvcs/Security/Security_Current.inl"
+#endif /* __ACE_INLINE__ */
+
+TAO_BEGIN_VERSIONED_NAMESPACE_DECL
+
+TAO_Security_Current::TAO_Security_Current (size_t tss_slot,
+ const char *orb_id)
+ : tss_slot_ (tss_slot),
+ orb_id_ (orb_id),
+ orb_core_ (0)
+{
+}
+
+TAO_Security_Current::~TAO_Security_Current (void)
+{
+}
+
+Security::AttributeList *
+TAO_Security_Current::get_attributes (
+ const Security::AttributeTypeList &attributes
+ ACE_ENV_ARG_DECL)
+ ACE_THROW_SPEC ((CORBA::SystemException))
+{
+ TAO::Security::Current_Impl *impl = this->implementation ();
+
+ // If the implementation pointer returned from TSS is zero, then
+ // we're not in the middle of a request/upcall. Throw an exception
+ // to indicate that.
+ if (impl == 0)
+ ACE_THROW_RETURN (CORBA::BAD_INV_ORDER (), 0);
+
+ return impl->get_attributes (attributes ACE_ENV_ARG_PARAMETER);
+}
+
+SecurityLevel2::ReceivedCredentials_ptr
+TAO_Security_Current::received_credentials (
+ ACE_ENV_SINGLE_ARG_DECL)
+ ACE_THROW_SPEC ((CORBA::SystemException))
+{
+ TAO::Security::Current_Impl *impl = this->implementation ();
+
+ // If the implementation pointer returned from TSS is zero, then
+ // we're not in the middle of a request/upcall. Throw an exception
+ // to indicate that.
+ if (impl == 0)
+ ACE_THROW_RETURN (CORBA::BAD_INV_ORDER (), 0);
+
+ return impl->received_credentials (ACE_ENV_SINGLE_ARG_PARAMETER);
+}
+
+int
+TAO_Security_Current::init (void)
+{
+ int result = 0;
+
+ ACE_DECLARE_NEW_CORBA_ENV;
+ ACE_TRY
+ {
+ int argc = 0;
+ char **argv = 0;
+ CORBA::ORB_var orb = CORBA::ORB_init (argc,
+ argv,
+ this->orb_id_.in ()
+ ACE_ENV_ARG_PARAMETER);
+ ACE_TRY_CHECK;
+
+ this->orb_core_ = orb.in ()->orb_core ();
+
+ // No longer need the ORBid, so reclaim the memory it was
+ // occupying.
+ (void) this->orb_id_.out ();
+ }
+ ACE_CATCHANY
+ {
+ if (TAO_debug_level >= 1)
+ ACE_PRINT_EXCEPTION (ACE_ANY_EXCEPTION,
+ "Could not initialize SecurityCurrent:");
+
+ result = -1;
+ }
+ ACE_ENDTRY;
+ ACE_CHECK_RETURN (-1);
+
+ return result;
+}
+
+TAO_END_VERSIONED_NAMESPACE_DECL
diff --git a/TAO/orbsvcs/orbsvcs/Security/Security_Current.h b/TAO/orbsvcs/orbsvcs/Security/Security_Current.h
new file mode 100644
index 00000000000..118689ca9d4
--- /dev/null
+++ b/TAO/orbsvcs/orbsvcs/Security/Security_Current.h
@@ -0,0 +1,149 @@
+// -*- C++ -*-
+
+// ===================================================================
+/**
+ * @file Security_Current.h
+ *
+ * $Id$
+ *
+ * @author Ossama Othman <ossama@uci.edu>
+ */
+// ===================================================================
+
+#ifndef TAO_SECURITY_CURRENT_H
+#define TAO_SECURITY_CURRENT_H
+
+#include /**/ "ace/pre.h"
+
+#include "orbsvcs/Security/security_export.h"
+
+#if !defined (ACE_LACKS_PRAGMA_ONCE)
+# pragma once
+#endif /* ACE_LACKS_PRAGMA_ONCE */
+
+#include "orbsvcs/SecurityLevel2C.h"
+#include "tao/ORB_Core.h"
+#include "tao/LocalObject.h"
+
+#include "orbsvcs/Security/Security_Current_Impl.h"
+
+// This is to remove "inherits via dominance" warnings from MSVC.
+// MSVC is being a little too paranoid.
+#if defined(_MSC_VER)
+#pragma warning(push)
+#pragma warning(disable:4250)
+#endif /* _MSC_VER */
+
+TAO_BEGIN_VERSIONED_NAMESPACE_DECL
+
+/**
+ * @class TAO_Security_Current
+ *
+ * @brief Implementation of the SecurityLevel2::Current interface.
+ *
+ * This object can be used to obtain session related security
+ * information about the current execution context.
+ */
+class TAO_Security_Export TAO_Security_Current
+ : public SecurityLevel2::Current,
+ public TAO_Local_RefCounted_Object
+{
+public:
+
+ /// Constructor.
+ TAO_Security_Current (size_t tss_slot, const char *orb_id);
+
+ /**
+ * @name SecurityLevel1::Current Methods
+ *
+ * These methods are founds in the SecurityLevel1::Current
+ * interface.
+ */
+ //@{
+ /// Return the security attributes corresponding to the types in the
+ /// given attribute type list associated with the current request.
+ virtual Security::AttributeList * get_attributes (
+ const Security::AttributeTypeList & attributes
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS)
+ ACE_THROW_SPEC ((CORBA::SystemException));
+ //@}
+
+ /**
+ * @name SecurityLevel2::Current Methods
+ *
+ * These methods are founds in the SecurityLevel2::Current
+ * interface.
+ */
+ //@{
+ /// Return the Credentials received from the client associate with
+ /// the current request.
+ virtual SecurityLevel2::ReceivedCredentials_ptr received_credentials (
+ ACE_ENV_SINGLE_ARG_DECL_WITH_DEFAULTS)
+ ACE_THROW_SPEC ((CORBA::SystemException));
+ //@}
+
+ /// Return the TSS slot ID assigned to the "SecurityCurrent" object.
+ /**
+ * The concrete TSS SecurityCurrent implementations will each use
+ * this slot ID.
+ */
+ size_t tss_slot (void) const;
+
+protected:
+
+ /// Destructor
+ /// Protected to force allocation on the heap.
+ ~TAO_Security_Current (void);
+
+ /// Fully initialize this object. This method is used predominantly
+ /// to set the ORB core pointer.
+ int init (void);
+
+ /// Set the TSS Security::Current implementation.
+ /**
+ * The pointer is actually one to a concrete implementation provided
+ * by the underlying security mechanism. For example, SSLIOP
+ * implements the SecurityLevel2::Current interface. Similarly,
+ * SECIOP would do the same.
+ *
+ * There is no function that places the implementation pointer in
+ * TSS. The underlying security mechanism does that.
+ */
+ TAO::Security::Current_Impl *implementation (void);
+
+private:
+
+ /// Prevent copying through the copy constructor and the assignment
+ /// operator.
+ //@{
+ TAO_Security_Current (const TAO_Security_Current &);
+ void operator= (const TAO_Security_Current &);
+ //@}
+
+private:
+
+ /// TSS slot assigned to this object.
+ size_t const tss_slot_;
+
+ /// The ORBid of the ORB with which this object is registered.
+ CORBA::String_var orb_id_;
+
+ /// Pointer to the ORB Core corresponding to the ORB with which this
+ /// object is registered.
+ TAO_ORB_Core * orb_core_;
+
+};
+
+TAO_END_VERSIONED_NAMESPACE_DECL
+
+#if defined (__ACE_INLINE__)
+# include "orbsvcs/Security/Security_Current.inl"
+#endif /* __ACE_INLINE__ */
+
+#if defined(_MSC_VER)
+#pragma warning(pop)
+#endif /* _MSC_VER */
+
+#include /**/ "ace/post.h"
+
+#endif /* TAO_SECURITY_CURRENT_H */
diff --git a/TAO/orbsvcs/orbsvcs/Security/Security_Current.inl b/TAO/orbsvcs/orbsvcs/Security/Security_Current.inl
new file mode 100644
index 00000000000..eee8c6c11fe
--- /dev/null
+++ b/TAO/orbsvcs/orbsvcs/Security/Security_Current.inl
@@ -0,0 +1,26 @@
+// -*- C++ -*-
+//
+// $Id$
+
+TAO_BEGIN_VERSIONED_NAMESPACE_DECL
+
+ACE_INLINE size_t
+TAO_Security_Current::tss_slot (void) const
+{
+ return this->tss_slot_;
+}
+
+ACE_INLINE TAO::Security::Current_Impl *
+TAO_Security_Current::implementation (void)
+{
+ if (this->orb_core_ == 0 && this->init () != 0)
+ return 0;
+
+ TAO::Security::Current_Impl *impl =
+ static_cast<TAO::Security::Current_Impl *> (
+ this->orb_core_->get_tss_resource (this->tss_slot_));
+
+ return impl;
+}
+
+TAO_END_VERSIONED_NAMESPACE_DECL
diff --git a/TAO/orbsvcs/orbsvcs/Security/Security_Current_Impl.cpp b/TAO/orbsvcs/orbsvcs/Security/Security_Current_Impl.cpp
new file mode 100644
index 00000000000..a0239a9ca7d
--- /dev/null
+++ b/TAO/orbsvcs/orbsvcs/Security/Security_Current_Impl.cpp
@@ -0,0 +1,15 @@
+// -*- C++ -*-
+
+#include "orbsvcs/Security/Security_Current_Impl.h"
+
+ACE_RCSID (Security,
+ SL3_Security_Current_Impl,
+ "$Id$")
+
+TAO_BEGIN_VERSIONED_NAMESPACE_DECL
+
+TAO::Security::Current_Impl::~Current_Impl (void)
+{
+}
+
+TAO_END_VERSIONED_NAMESPACE_DECL
diff --git a/TAO/orbsvcs/orbsvcs/Security/Security_Current_Impl.h b/TAO/orbsvcs/orbsvcs/Security/Security_Current_Impl.h
new file mode 100644
index 00000000000..f92e121fddf
--- /dev/null
+++ b/TAO/orbsvcs/orbsvcs/Security/Security_Current_Impl.h
@@ -0,0 +1,95 @@
+// -*- C++ -*-
+
+// ===================================================================
+/**
+ * @file Security_Current_Impl.h
+ *
+ * $Id$
+ *
+ * @author Ossama Othman <ossama@uci.edu>
+ */
+// ===================================================================
+
+#ifndef TAO_SECURITY_CURRENT_IMPL_H
+#define TAO_SECURITY_CURRENT_IMPL_H
+
+#include /**/ "ace/pre.h"
+
+#include "ace/config-all.h"
+
+#if !defined (ACE_LACKS_PRAGMA_ONCE)
+# pragma once
+#endif /* ACE_LACKS_PRAGMA_ONCE */
+
+#include "orbsvcs/Security/security_export.h"
+#include "orbsvcs/SecurityLevel2C.h"
+
+TAO_BEGIN_VERSIONED_NAMESPACE_DECL
+
+namespace TAO
+{
+ namespace Security
+ {
+ /**
+ * @class Current_Impl
+ *
+ * @brief Base class for the TSS portion of any underlying
+ * security mechanism.
+ *
+ * This class provides the same interface as the
+ * SecurityLevel3::Current object. However, it is not derived
+ * from that interface since we need to explicitly avoid virtual
+ * inheritance so that it is safe to store subclasses in a "void
+ * *" and later cast that pointer back to the subclass pointer
+ * type.
+ */
+ class TAO_Security_Export Current_Impl
+ {
+ public:
+
+ /// Destructor.
+ virtual ~Current_Impl (void);
+
+ /**
+ * @name SecurityLevel1::Current Methods
+ *
+ * These methods are founds in the SecurityLevel1::Current
+ * interface.
+ */
+ //@{
+ /// Return the security attributes corresponding to the types in
+ /// the given attribute type list associated with the current
+ /// request.
+ virtual ::Security::AttributeList * get_attributes (
+ const ::Security::AttributeTypeList & attributes
+ ACE_ENV_ARG_DECL)
+ ACE_THROW_SPEC ((CORBA::SystemException)) = 0;
+ //@}
+
+ /**
+ * @name SecurityLevel2::Current Methods
+ *
+ * These methods are founds in the SecurityLevel2::Current
+ * interface.
+ */
+ //@{
+ /// Return the Credentials received from the client associate with
+ /// the current request.
+ virtual SecurityLevel2::ReceivedCredentials_ptr received_credentials (
+ ACE_ENV_SINGLE_ARG_DECL)
+ ACE_THROW_SPEC ((CORBA::SystemException)) = 0;
+ //@}
+
+ /// Return the unique tag that identifies the concrete subclass.
+ virtual CORBA::ULong tag (void) const = 0;
+
+ };
+
+ } // End Security namespace.
+} // End TAO namespace.
+
+TAO_END_VERSIONED_NAMESPACE_DECL
+
+#include /**/ "ace/post.h"
+
+#endif /* TAO_SECURITY_CURRENT_IMPL_H */
diff --git a/TAO/orbsvcs/orbsvcs/Security/Security_ORBInitializer.cpp b/TAO/orbsvcs/orbsvcs/Security/Security_ORBInitializer.cpp
new file mode 100644
index 00000000000..396f2116aa0
--- /dev/null
+++ b/TAO/orbsvcs/orbsvcs/Security/Security_ORBInitializer.cpp
@@ -0,0 +1,240 @@
+// -*- C++ -*-
+
+#include "orbsvcs/Security/Security_ORBInitializer.h"
+
+ACE_RCSID (Security,
+ Security_ORBInitializer,
+ "$Id$")
+
+
+// #include "Security_Current.h"
+#include "orbsvcs/Security/SL3_SecurityCurrent.h"
+#include "orbsvcs/Security/SL3_CredentialsCurator.h"
+#include "orbsvcs/Security/SL3_SecurityManager.h"
+
+#include "orbsvcs/SecurityC.h"
+
+#include "tao/PI/ORBInitInfo.h"
+#include "tao/ORB_Constants.h"
+#include "tao/debug.h"
+
+TAO_BEGIN_VERSIONED_NAMESPACE_DECL
+
+void
+TAO::Security::ORBInitializer::pre_init (
+ PortableInterceptor::ORBInitInfo_ptr info
+ ACE_ENV_ARG_DECL)
+ ACE_THROW_SPEC ((CORBA::SystemException))
+{
+ // Narrow to a TAO_ORBInitInfo object to get access to the
+ // allocate_tss_slot_id() TAO extension.
+ TAO_ORBInitInfo_var tao_info =
+ TAO_ORBInitInfo::_narrow (info
+ ACE_ENV_ARG_PARAMETER);
+ ACE_CHECK;
+
+ if (CORBA::is_nil (tao_info.in ()))
+ {
+ if (TAO_debug_level > 0)
+ ACE_ERROR ((LM_ERROR,
+ "(%P|%t) Security_ORBInitializer::pre_init:\n"
+ "(%P|%t) Unable to narrow "
+ "\"PortableInterceptor::ORBInitInfo_ptr\" to\n"
+ "(%P|%t) \"TAO_ORBInitInfo_ptr.\"\n"));
+
+ ACE_THROW (CORBA::INTERNAL ());
+ }
+
+// // Reserve a TSS slot in the ORB core internal TSS resources for the
+// // thread-specific portion of Security::Current.
+// size_t old_tss_slot = tao_info->allocate_tss_slot_id (0
+// ACE_ENV_ARG_PARAMETER);
+// ACE_CHECK;
+
+// CORBA::String_var orb_id = info->orb_id (ACE_ENV_SINGLE_ARG_PARAMETER);
+// ACE_CHECK;
+
+// // Create the SecurityLevel2::Current object.
+// SecurityLevel2::Current_ptr current = SecurityLevel2::Current::_nil ();
+// ACE_NEW_THROW_EX (current,
+// TAO_Security_Current (old_tss_slot, orb_id.in ()),
+// CORBA::NO_MEMORY (
+// CORBA::SystemException::_tao_minor_code (
+// TAO::VMCID,
+// ENOMEM),
+// CORBA::COMPLETED_NO));
+// ACE_CHECK;
+
+// SecurityLevel2::Current_var security_current = current;
+
+// // Register the SecurityLevel2::Current object reference with the
+// // ORB.
+// info->register_initial_reference ("SecurityCurrent",
+// security_current.in ()
+// ACE_ENV_ARG_PARAMETER);
+// ACE_CHECK;
+
+ // Reserve a TSS slot in the ORB core internal TSS resources for the
+ // thread-specific portion of SecurityLevel3::SecurityCurrent
+ // object.
+ size_t tss_slot = tao_info->allocate_tss_slot_id (0
+ ACE_ENV_ARG_PARAMETER);
+ ACE_CHECK;
+
+
+ // Create the SecurityLevel3::Current object.
+ SecurityLevel3::SecurityCurrent_ptr current3;
+ ACE_NEW_THROW_EX (current3,
+ TAO::SL3::SecurityCurrent (tss_slot,
+ tao_info->orb_core ()),
+ CORBA::NO_MEMORY (
+ CORBA::SystemException::_tao_minor_code (
+ TAO::VMCID,
+ ENOMEM),
+ CORBA::COMPLETED_NO));
+ ACE_CHECK;
+
+ SecurityLevel3::SecurityCurrent_var security_current3 = current3;
+
+ // Register the SecurityLevel2::Current object reference with the
+ // ORB.
+ info->register_initial_reference ("SecurityLevel3:SecurityCurrent",
+ security_current3.in ()
+ ACE_ENV_ARG_PARAMETER);
+ ACE_CHECK;
+
+ // Create the SecurityLevel3::CredentialsCurator object.
+ SecurityLevel3::CredentialsCurator_ptr curator;
+ ACE_NEW_THROW_EX (curator,
+ TAO::SL3::CredentialsCurator,
+ CORBA::NO_MEMORY (
+ CORBA::SystemException::_tao_minor_code (
+ TAO::VMCID,
+ ENOMEM),
+ CORBA::COMPLETED_NO));
+ ACE_CHECK;
+
+ SecurityLevel3::CredentialsCurator_var credentials_curator = curator;
+
+ // Register the SecurityLevel3::CredentialsCurator object reference
+ // with the ORB.
+ info->register_initial_reference ("SecurityLevel3:CredentialsCurator",
+ credentials_curator.in ()
+ ACE_ENV_ARG_PARAMETER);
+ ACE_CHECK;
+
+ // Create the SecurityLevel3::SecurityManager object.
+ SecurityLevel3::SecurityManager_ptr manager3;
+ ACE_NEW_THROW_EX (manager3,
+ TAO::SL3::SecurityManager (credentials_curator.in ()),
+ CORBA::NO_MEMORY (
+ CORBA::SystemException::_tao_minor_code (
+ TAO::VMCID,
+ ENOMEM),
+ CORBA::COMPLETED_NO));
+ ACE_CHECK;
+
+ SecurityLevel3::SecurityManager_var security_manager3 = manager3;
+
+ // Register the SecurityLevel3::SecurityManager object reference
+ // with the ORB.
+ info->register_initial_reference ("SecurityLevel3:SecurityManager",
+ security_manager3.in ()
+ ACE_ENV_ARG_PARAMETER);
+ ACE_CHECK;
+}
+
+void
+TAO::Security::ORBInitializer::post_init (
+ PortableInterceptor::ORBInitInfo_ptr info
+ ACE_ENV_ARG_DECL)
+ ACE_THROW_SPEC ((CORBA::SystemException))
+{
+ this->register_policy_factories (info
+ ACE_ENV_ARG_PARAMETER);
+ ACE_CHECK;
+}
+
+void
+TAO::Security::ORBInitializer::register_policy_factories (
+ PortableInterceptor::ORBInitInfo_ptr info
+ ACE_ENV_ARG_DECL)
+{
+ // Register the security policy factories.
+
+ if (CORBA::is_nil (this->policy_factory_.in ()))
+ {
+ PortableInterceptor::PolicyFactory_ptr policy_factory;
+ ACE_NEW_THROW_EX (policy_factory,
+ TAO::Security::PolicyFactory,
+ CORBA::NO_MEMORY (
+ CORBA::SystemException::_tao_minor_code (
+ TAO::VMCID,
+ ENOMEM),
+ CORBA::COMPLETED_NO));
+ ACE_CHECK;
+
+ this->policy_factory_ = policy_factory;
+ }
+
+ // Bind the same policy factory to all security related policy
+ // types since a single policy factory is used to create each of
+ // the different types of security policies.
+
+ CORBA::PolicyType type;
+
+ type = ::Security::SecQOPPolicy;
+ info->register_policy_factory (type,
+ this->policy_factory_.in ()
+ ACE_ENV_ARG_PARAMETER);
+ ACE_CHECK;
+
+ type = ::Security::SecMechanismsPolicy;
+ info->register_policy_factory (type,
+ this->policy_factory_.in ()
+ ACE_ENV_ARG_PARAMETER);
+ ACE_CHECK;
+
+ type = ::Security::SecInvocationCredentialsPolicy;
+ info->register_policy_factory (type,
+ this->policy_factory_.in ()
+ ACE_ENV_ARG_PARAMETER);
+ ACE_CHECK;
+
+ type = ::Security::SecFeaturePolicy; // Deprecated
+ info->register_policy_factory (type,
+ this->policy_factory_.in ()
+ ACE_ENV_ARG_PARAMETER);
+ ACE_CHECK;
+
+ type = ::Security::SecDelegationDirectivePolicy;
+ info->register_policy_factory (type,
+ this->policy_factory_.in ()
+ ACE_ENV_ARG_PARAMETER);
+ ACE_CHECK;
+
+ type = ::Security::SecEstablishTrustPolicy;
+ info->register_policy_factory (type,
+ this->policy_factory_.in ()
+ ACE_ENV_ARG_PARAMETER);
+ ACE_CHECK;
+
+
+ type = SecurityLevel3::ContextEstablishmentPolicyType;
+ info->register_policy_factory (type,
+ this->policy_factory_.in ()
+ ACE_ENV_ARG_PARAMETER);
+ ACE_CHECK;
+
+
+ type = SecurityLevel3::ObjectCredentialsPolicyType;
+ info->register_policy_factory (type,
+ this->policy_factory_.in ()
+ ACE_ENV_ARG_PARAMETER);
+ ACE_CHECK;
+
+
+ // ----------------------------------------------------------------
+}
+
+TAO_END_VERSIONED_NAMESPACE_DECL
diff --git a/TAO/orbsvcs/orbsvcs/Security/Security_ORBInitializer.h b/TAO/orbsvcs/orbsvcs/Security/Security_ORBInitializer.h
new file mode 100644
index 00000000000..c6a17685f4d
--- /dev/null
+++ b/TAO/orbsvcs/orbsvcs/Security/Security_ORBInitializer.h
@@ -0,0 +1,106 @@
+// -*- C++ -*-
+//
+// $Id$
+
+// ============================================================================
+//
+// = LIBRARY
+// TAO
+//
+// = FILENAME
+// Security_ORBInitializer.h
+//
+// = AUTHOR
+// Ossama Othman <ossama@uci.edu>
+//
+// ============================================================================
+
+#ifndef TAO_SECURITY_ORB_INITIALIZER_H
+#define TAO_SECURITY_ORB_INITIALIZER_H
+
+#include /**/ "ace/pre.h"
+
+#include "orbsvcs/Security/security_export.h"
+
+#if !defined (ACE_LACKS_PRAGMA_ONCE)
+# pragma once
+#endif /* ACE_LACKS_PRAGMA_ONCE */
+
+#include "tao/PI/PI.h"
+#include "tao/LocalObject.h"
+
+#include "orbsvcs/Security/Security_PolicyFactory.h"
+
+// This is to remove "inherits via dominance" warnings from MSVC.
+// MSVC is being a little too paranoid.
+#if defined(_MSC_VER)
+#pragma warning(push)
+#pragma warning(disable:4250)
+#endif /* _MSC_VER */
+
+TAO_BEGIN_VERSIONED_NAMESPACE_DECL
+
+/// Security ORB initializer.
+namespace TAO
+{
+ namespace Security
+ {
+
+ /**
+ * @class ORBInitializer
+ *
+ * @brief ORBInitializer that configures CORBA Security features
+ * into an ORB.
+ *
+ * This ORBInitializer configures CORBA Security features into an
+ * ORB, such as CSIv2, security objects, security policy
+ * factories, etc, into an ORB.
+ */
+ class TAO_Security_Export ORBInitializer
+ : public virtual PortableInterceptor::ORBInitializer,
+ public virtual TAO_Local_RefCounted_Object
+ {
+ public:
+
+ /**
+ * @name PortableInterceptor::ORBInitializer Methods.
+ *
+ * Methods required by the PortableInterceptor::ORBInitializer
+ * interface.
+ */
+ //@{
+ virtual void pre_init (PortableInterceptor::ORBInitInfo_ptr info
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS)
+ ACE_THROW_SPEC ((CORBA::SystemException));
+
+ virtual void post_init (PortableInterceptor::ORBInitInfo_ptr info
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS)
+ ACE_THROW_SPEC ((CORBA::SystemException));
+ //@}
+
+ private:
+
+ /// Register Security policy factories.
+ void register_policy_factories (PortableInterceptor::ORBInitInfo_ptr info
+ ACE_ENV_ARG_DECL);
+
+ private:
+
+ /// PolicyFactory that is used to create all security related
+ /// policies capable of being created via ORB::create_policy().
+ PortableInterceptor::PolicyFactory_var policy_factory_;
+
+ };
+
+ } // End Security namespace
+} // End TAO namespace
+
+TAO_END_VERSIONED_NAMESPACE_DECL
+
+#if defined(_MSC_VER)
+#pragma warning(pop)
+#endif /* _MSC_VER */
+
+#include /**/ "ace/post.h"
+
+#endif /* TAO_SECURITY_ORB_INITIALIZER_H */
diff --git a/TAO/orbsvcs/orbsvcs/Security/Security_PolicyFactory.cpp b/TAO/orbsvcs/orbsvcs/Security/Security_PolicyFactory.cpp
new file mode 100644
index 00000000000..96f0ddbb787
--- /dev/null
+++ b/TAO/orbsvcs/orbsvcs/Security/Security_PolicyFactory.cpp
@@ -0,0 +1,159 @@
+// -*- C++ -*-
+
+#include "orbsvcs/Security/Security_PolicyFactory.h"
+
+ACE_RCSID (Security,
+ Security_PolicyFactory,
+ "$Id$")
+
+#include "orbsvcs/Security/SL2_QOPPolicy.h"
+#include "orbsvcs/Security/SL2_EstablishTrustPolicy.h"
+
+#include "orbsvcs/Security/SL3_ContextEstablishmentPolicy.h"
+#include "orbsvcs/Security/SL3_ObjectCredentialsPolicy.h"
+
+#include "orbsvcs/SecurityLevel2C.h"
+#include "orbsvcs/SecurityLevel3C.h"
+
+#include "tao/ORB_Constants.h"
+
+TAO_BEGIN_VERSIONED_NAMESPACE_DECL
+
+CORBA::Policy_ptr
+TAO::Security::PolicyFactory::create_policy (
+ CORBA::PolicyType type,
+ const CORBA::Any &value
+ ACE_ENV_ARG_DECL)
+ ACE_THROW_SPEC ((CORBA::SystemException,
+ CORBA::PolicyError))
+{
+ // Not all security policies can be created using the
+ // ORB::create_policy() mechanism. Only those that can be created
+ // using that mechanism are supported by this factory.
+
+ if (type == ::Security::SecQOPPolicy)
+ {
+ ::Security::QOP qop;
+
+ // Extract the desired Quality-of-Protection value from the
+ // given Any.
+ if (!(value >>= qop))
+ ACE_THROW_RETURN (CORBA::BAD_PARAM (
+ CORBA::SystemException::_tao_minor_code (
+ TAO::VMCID,
+ EINVAL),
+ CORBA::COMPLETED_NO),
+ CORBA::Policy::_nil ());
+
+ TAO::Security::QOPPolicy * qop_policy = 0;
+ ACE_NEW_THROW_EX (qop_policy,
+ TAO::Security::QOPPolicy (qop),
+ CORBA::NO_MEMORY (
+ CORBA::SystemException::_tao_minor_code (
+ TAO::VMCID,
+ ENOMEM),
+ CORBA::COMPLETED_NO));
+ ACE_CHECK_RETURN (CORBA::Policy::_nil ());
+
+ return qop_policy;
+ }
+
+ else if (type == ::Security::SecEstablishTrustPolicy)
+ {
+ ::Security::EstablishTrust *trust = 0;
+
+ // Extract the desired establishing of trust value from the
+ // given Any.
+ if (!(value >>= trust))
+ ACE_THROW_RETURN (CORBA::BAD_PARAM (
+ CORBA::SystemException::_tao_minor_code (
+ TAO::VMCID,
+ EINVAL),
+ CORBA::COMPLETED_NO),
+ CORBA::Policy::_nil ());
+
+ TAO::Security::EstablishTrustPolicy * trust_policy = 0;
+ ACE_NEW_THROW_EX (trust_policy,
+ TAO::Security::EstablishTrustPolicy (*trust),
+ CORBA::NO_MEMORY (
+ CORBA::SystemException::_tao_minor_code (
+ TAO::VMCID,
+ ENOMEM),
+ CORBA::COMPLETED_NO));
+ ACE_CHECK_RETURN (CORBA::Policy::_nil ());
+
+ return trust_policy;
+ }
+
+ else if (type == SecurityLevel3::ContextEstablishmentPolicyType)
+ {
+ SecurityLevel3::ContextEstablishmentPolicyArgument * args = 0;
+
+ // Extract the desired establishing of trust value from the
+ // given Any.
+ if (!(value >>= args))
+ ACE_THROW_RETURN (CORBA::BAD_PARAM (
+ CORBA::SystemException::_tao_minor_code (
+ TAO::VMCID,
+ EINVAL),
+ CORBA::COMPLETED_NO),
+ CORBA::Policy::_nil ());
+
+ TAO::SL3::ContextEstablishmentPolicy * policy = 0;
+ ACE_NEW_THROW_EX (policy,
+ TAO::SL3::ContextEstablishmentPolicy (
+ args->creds_directive,
+ args->creds_list,
+ args->use_client_auth,
+ args->use_target_auth,
+ args->use_confidentiality,
+ args->use_integrity),
+ CORBA::NO_MEMORY (
+ CORBA::SystemException::_tao_minor_code (
+ TAO::VMCID,
+ ENOMEM),
+ CORBA::COMPLETED_NO));
+ ACE_CHECK_RETURN (CORBA::Policy::_nil ());
+
+ return policy;
+ }
+
+ else if (type == SecurityLevel3::ObjectCredentialsPolicyType)
+ {
+ SecurityLevel3::OwnCredentialsList * creds = 0;
+
+ // Extract the desired establishing of trust value from the
+ // given Any.
+ if (!(value >>= creds))
+ ACE_THROW_RETURN (CORBA::BAD_PARAM (
+ CORBA::SystemException::_tao_minor_code (
+ TAO::VMCID,
+ EINVAL),
+ CORBA::COMPLETED_NO),
+ CORBA::Policy::_nil ());
+
+ TAO::SL3::ObjectCredentialsPolicy * policy = 0;
+ ACE_NEW_THROW_EX (policy,
+ TAO::SL3::ObjectCredentialsPolicy (*creds),
+ CORBA::NO_MEMORY (
+ CORBA::SystemException::_tao_minor_code (
+ TAO::VMCID,
+ ENOMEM),
+ CORBA::COMPLETED_NO));
+ ACE_CHECK_RETURN (CORBA::Policy::_nil ());
+
+ return policy;
+ }
+
+ else if (type == ::Security::SecInvocationCredentialsPolicy
+ || type == ::Security::SecMechanismsPolicy
+ || type == ::Security::SecFeaturePolicy // Deprecated.
+ || type == ::Security::SecDelegationDirectivePolicy)
+ ACE_THROW_RETURN (CORBA::PolicyError (CORBA::UNSUPPORTED_POLICY),
+ CORBA::Policy::_nil ());
+ else
+ ACE_THROW_RETURN (CORBA::PolicyError (CORBA::BAD_POLICY_TYPE),
+ CORBA::Policy::_nil ());
+}
+
+TAO_END_VERSIONED_NAMESPACE_DECL
diff --git a/TAO/orbsvcs/orbsvcs/Security/Security_PolicyFactory.h b/TAO/orbsvcs/orbsvcs/Security/Security_PolicyFactory.h
new file mode 100644
index 00000000000..4596caadcb3
--- /dev/null
+++ b/TAO/orbsvcs/orbsvcs/Security/Security_PolicyFactory.h
@@ -0,0 +1,73 @@
+// -*- C++ -*-
+
+//=============================================================================
+/**
+ * @file Security_PolicyFactory.h
+ *
+ * $Id$
+ *
+ * @author Ossama Othman <ossama@uci.edu>
+ */
+//=============================================================================
+
+
+#ifndef TAO_SECURITY_POLICY_FACTORY_H
+#define TAO_SECURITY_POLICY_FACTORY_H
+
+#include /**/ "ace/pre.h"
+
+#include "orbsvcs/Security/security_export.h"
+
+#if !defined (ACE_LACKS_PRAGMA_ONCE)
+# pragma once
+#endif /* ACE_LACKS_PRAGMA_ONCE */
+
+#include "tao/PI/PI.h"
+#include "tao/LocalObject.h"
+
+// This is to remove "inherits via dominance" warnings from MSVC.
+// MSVC is being a little too paranoid.
+#if defined(_MSC_VER)
+#pragma warning(push)
+#pragma warning(disable:4250)
+#endif /* _MSC_VER */
+
+TAO_BEGIN_VERSIONED_NAMESPACE_DECL
+
+namespace TAO
+{
+ namespace Security
+ {
+
+ /**
+ * @class PolicyFactory
+ *
+ * @brief Policy factory for all security related policies.
+ *
+ * Policy factory for all security related policies.
+ */
+ class PolicyFactory
+ : public PortableInterceptor::PolicyFactory,
+ public TAO_Local_RefCounted_Object
+ {
+ public:
+
+ virtual CORBA::Policy_ptr create_policy (CORBA::PolicyType type,
+ const CORBA::Any & value
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS)
+ ACE_THROW_SPEC ((CORBA::SystemException,
+ CORBA::PolicyError));
+ };
+
+ } // End Security namespace
+} // End TAO namespace
+
+TAO_END_VERSIONED_NAMESPACE_DECL
+
+#if defined(_MSC_VER)
+#pragma warning(pop)
+#endif /* _MSC_VER */
+
+#include /**/ "ace/post.h"
+
+#endif /* TAO_SECURITY_POLICY_FACTORY_H */
diff --git a/TAO/orbsvcs/orbsvcs/Security/security_export.h b/TAO/orbsvcs/orbsvcs/Security/security_export.h
new file mode 100644
index 00000000000..af588c4850a
--- /dev/null
+++ b/TAO/orbsvcs/orbsvcs/Security/security_export.h
@@ -0,0 +1,40 @@
+
+// -*- C++ -*-
+// $Id$
+// Definition for Win32 Export directives.
+// This file is generated automatically by generate_export_file.pl
+// ------------------------------
+#ifndef TAO_SECURITY_EXPORT_H
+#define TAO_SECURITY_EXPORT_H
+
+#include "ace/config-all.h"
+
+#if defined (TAO_AS_STATIC_LIBS)
+# if !defined (TAO_SECURITY_HAS_DLL)
+# define TAO_SECURITY_HAS_DLL 0
+# endif /* ! TAO_SECURITY_HAS_DLL */
+#else
+# if !defined (TAO_SECURITY_HAS_DLL)
+# define TAO_SECURITY_HAS_DLL 1
+# endif /* ! TAO_SECURITY_HAS_DLL */
+#endif
+
+#if defined (TAO_SECURITY_HAS_DLL) && (TAO_SECURITY_HAS_DLL == 1)
+# if defined (TAO_SECURITY_BUILD_DLL)
+# define TAO_Security_Export ACE_Proper_Export_Flag
+# define TAO_SECURITY_SINGLETON_DECLARATION(T) ACE_EXPORT_SINGLETON_DECLARATION (T)
+# define TAO_SECURITY_SINGLETON_DECLARE(SINGLETON_TYPE, CLASS, LOCK) ACE_EXPORT_SINGLETON_DECLARE(SINGLETON_TYPE, CLASS, LOCK)
+# else /* TAO_SECURITY_BUILD_DLL */
+# define TAO_Security_Export ACE_Proper_Import_Flag
+# define TAO_SECURITY_SINGLETON_DECLARATION(T) ACE_IMPORT_SINGLETON_DECLARATION (T)
+# define TAO_SECURITY_SINGLETON_DECLARE(SINGLETON_TYPE, CLASS, LOCK) ACE_IMPORT_SINGLETON_DECLARE(SINGLETON_TYPE, CLASS, LOCK)
+# endif /* TAO_SECURITY_BUILD_DLL */
+#else /* TAO_SECURITY_HAS_DLL == 1 */
+# define TAO_Security_Export
+# define TAO_SECURITY_SINGLETON_DECLARATION(T)
+# define TAO_SECURITY_SINGLETON_DECLARE(SINGLETON_TYPE, CLASS, LOCK)
+#endif /* TAO_SECURITY_HAS_DLL == 1 */
+
+#endif /* TAO_SECURITY_EXPORT_H */
+
+// End of auto generated file.
diff --git a/TAO/orbsvcs/orbsvcs/SecurityAdmin.idl b/TAO/orbsvcs/orbsvcs/SecurityAdmin.idl
new file mode 100644
index 00000000000..f215aa6868b
--- /dev/null
+++ b/TAO/orbsvcs/orbsvcs/SecurityAdmin.idl
@@ -0,0 +1,143 @@
+// -*- C++ -*-
+//
+// $Id$
+
+
+#ifdef _SECURITY_ADMIN_IDL_
+#define _SECURITY_ADMIN_IDL_
+
+#include <SecurityLevel2.idl>
+
+#pragma prefix "omg.org"
+
+module SecurityAdmin {
+
+# pragma version SecurityAdmin 1.5
+
+ // interface AccessPolicy
+ interface AccessPolicy : CORBA::Policy {
+
+# pragma version AccessPolicy 1.5
+
+ Security::RightsList get_effective_rights (
+ in Security::AttributeList attrib_list,
+ in Security::ExtensibleFamily rights_family
+ );
+
+ Security::RightsList get_all_effective_rights(
+ in Security::AttributeList attrib_list
+ );
+ };
+
+ // interface DomainAccessPolicy
+ interface DomainAccessPolicy : AccessPolicy {
+
+# pragma version DomainAccessPolicy 1.5
+
+ void grant_rights(
+ in Security::SecAttribute priv_attr,
+ in Security::DelegationState del_state,
+ in Security::ExtensibleFamily rights_family,
+ in Security::RightsList rights
+ );
+
+ void revoke_rights(
+ in Security::SecAttribute priv_attr,
+ in Security::DelegationState del_state,
+ in Security::ExtensibleFamily rights_family,
+ in Security::RightsList rights
+ );
+
+ void replace_rights (
+ in Security::SecAttribute priv_attr,
+ in Security::DelegationState del_state,
+ in Security::ExtensibleFamily rights_family,
+ in Security::RightsList rights
+ );
+
+ Security::RightsList get_rights (
+ in Security::SecAttribute priv_attr,
+ in Security::DelegationState del_state,
+ in Security::ExtensibleFamily rights_family
+ );
+
+ Security::RightsList get_all_rights(
+ in Security::SecAttribute priv_attr,
+ in Security::DelegationState del_state
+ );
+ };
+
+ // interface AuditPolicy
+ interface AuditPolicy : CORBA::Policy {
+
+# pragma version AuditPolicy 1.5
+
+ void set_audit_selectors (
+ in CORBA::RepositoryId object_type,
+ in Security::AuditEventTypeList events,
+ in Security::SelectorValueList selectors,
+ in Security::AuditCombinator audit_combinator
+ );
+
+ void clear_audit_selectors (
+ in CORBA::RepositoryId object_type,
+ in Security::AuditEventTypeList events
+ );
+
+ void replace_audit_selectors (
+ in CORBA::RepositoryId object_type,
+ in Security::AuditEventTypeList events,
+ in Security::SelectorValueList selectors,
+ in Security::AuditCombinator audit_combinator
+ );
+
+ void get_audit_selectors (
+ in CORBA::RepositoryId object_type,
+ in Security::AuditEventTypeList events,
+ in Security::SelectorValueList selectors,
+ in Security::AuditCombinator audit_combinator
+ );
+
+ void set_audit_channel (
+ in Security::AuditChannelId audit_channel_id
+ );
+ };
+
+ // interface SecureInvocationPolicy
+ interface SecureInvocationPolicy : CORBA::Policy {
+
+# pragma version SecureInvocationPolicy 1.5
+
+ void set_association_options(
+ in CORBA::RepositoryId object_type,
+ in Security::RequiresSupports requires_supports,
+ in Security::CommunicationDirection direction,
+ in Security::AssociationOptions options
+ );
+
+ Security::AssociationOptions get_association_options(
+ in CORBA::RepositoryID object_type,
+ in Security::RequiresSupports requires_supports,
+ in Security::CommunicationDirection direction
+ );
+ };
+
+ // interface DelegationPolicy
+ interface DelegationPolicy : CORBA::Policy {
+
+# pragma version DelegationPolicy 1.5
+
+ void set_delegation_mode(
+ in CORBA::InterfaceDef object_type,
+ in Security::DelegationMode mode
+ );
+
+ Security::DelegationMode get_delegation_mode(
+ in CORBA::RepositoryId object_type
+ );
+ };
+};
+
+#pragma prefix ""
+
+#endif /* _SECURITY_ADMIN_IDL_ */
diff --git a/TAO/orbsvcs/orbsvcs/SecurityLevel1.idl b/TAO/orbsvcs/orbsvcs/SecurityLevel1.idl
new file mode 100644
index 00000000000..4f165fde1ed
--- /dev/null
+++ b/TAO/orbsvcs/orbsvcs/SecurityLevel1.idl
@@ -0,0 +1,31 @@
+// -*- IDL -*-
+//
+// $Id$
+
+
+#ifndef _SECURITY_LEVEL_1_IDL_
+#define _SECURITY_LEVEL_1_IDL_
+
+#include <orbsvcs/Security.idl>
+
+#pragma prefix "omg.org"
+
+module SecurityLevel1 {
+
+# pragma version SecurityLevel1 1.8
+
+ local interface Current : CORBA::Current { // Locality Constrained
+# pragma version Current 1.8
+
+ // thread specific operations
+
+ Security::AttributeList get_attributes (
+ in Security::AttributeTypeList attributes
+ );
+
+ };
+};
+
+#pragma prefix ""
+
+#endif /* _SECURITY_LEVEL_1_IDL_ */
diff --git a/TAO/orbsvcs/orbsvcs/SecurityLevel2.idl b/TAO/orbsvcs/orbsvcs/SecurityLevel2.idl
new file mode 100644
index 00000000000..4826c449ed4
--- /dev/null
+++ b/TAO/orbsvcs/orbsvcs/SecurityLevel2.idl
@@ -0,0 +1,274 @@
+// -*- IDL -*-
+//
+// $Id$
+
+
+#ifndef _SECURITY_LEVEL_2_IDL_
+#define _SECURITY_LEVEL_2_IDL_
+
+#include <orbsvcs/SecurityLevel1.idl>
+
+#pragma prefix "omg.org"
+
+module SecurityLevel2 {
+
+# pragma version SecurityLevel2 1.8
+
+ // Forward declaration of interfaces
+ local interface PrincipalAuthenticator;
+ local interface Credentials;
+ local interface Current;
+
+ // Interface PrincipalAuthenticator
+ local interface PrincipalAuthenticator {
+# pragma version PrincipalAuthenticator 1.8
+
+ Security::AuthenticationMethodList
+ get_supported_authen_methods(
+ in Security::MechanismType mechanism
+ );
+
+ Security::AuthenticationStatus authenticate (
+ in Security::AuthenticationMethod method,
+ in Security::MechanismType mechanism,
+ in Security::SecurityName security_name,
+ in any auth_data,
+ in Security::AttributeList privileges,
+ out Credentials creds,
+ out any continuation_data,
+ out any auth_specific_data
+ );
+
+ Security::AuthenticationStatus continue_authentication (
+ in any response_data,
+ in Credentials creds,
+ out any continuation_data,
+ out any auth_specific_data
+ );
+ };
+
+
+ // Interface Credentials
+ local interface Credentials {
+# pragma version Credentials 1.8
+
+ Credentials copy ();
+
+ void destroy();
+
+ readonly attribute Security::InvocationCredentialsType
+ credentials_type;
+
+ readonly attribute Security::AuthenticationStatus
+ authentication_state;
+
+ readonly attribute Security::MechanismType mechanism;
+
+ attribute Security::AssociationOptions
+ accepting_options_supported;
+
+ attribute Security::AssociationOptions
+ accepting_options_required;
+
+ attribute Security::AssociationOptions
+ invocation_options_supported;
+
+ attribute Security::AssociationOptions
+ invocation_options_required;
+
+ boolean get_security_feature (
+ in Security::CommunicationDirection direction,
+ in Security::SecurityFeature feature
+ );
+
+ boolean set_attributes (
+ in Security::AttributeList requested_attributes,
+ out Security::AttributeList actual_attributes
+ );
+
+ Security::AttributeList get_attributes (
+ in Security::AttributeTypeList attributes
+ );
+
+ boolean is_valid (out Security::UtcT expiry_time);
+
+ boolean refresh (in any refresh_data);
+
+ };
+
+ typedef sequence <Credentials> CredentialsList;
+
+ local interface ReceivedCredentials : Credentials {
+
+# pragma version ReceivedCredentials 1.8
+
+ readonly attribute Credentials accepting_credentials;
+
+ readonly attribute Security::AssociationOptions
+ association_options_used;
+
+ readonly attribute Security::DelegationState delegation_state;
+
+ readonly attribute Security::DelegationMode delegation_mode;
+
+ };
+
+ local interface TargetCredentials : Credentials {
+
+# pragma version TargetCredentials 1.8
+
+ readonly attribute Credentials initiating_credentials;
+
+ readonly attribute Security::AssociationOptions
+ association_options_used;
+
+ };
+
+ // RequiredRights Interface
+ interface RequiredRights {
+
+ void get_required_rights(
+ in Object obj,
+ in CORBA::Identifier operation_name,
+ in CORBA::RepositoryId interface_name,
+ out Security::RightsList rights,
+ out Security::RightsCombinator rights_combinator
+ );
+
+ void set_required_rights(
+ in CORBA::Identifier operation_name,
+ in CORBA::RepositoryId interface_name,
+ in Security::RightsList rights,
+ in Security::RightsCombinator rights_combinator
+ );
+ };
+
+
+ // interface audit channel
+ local interface AuditChannel {
+
+# pragma version AuditChannel 1.8
+
+ void audit_write (
+ in Security::AuditEventType event_type,
+ in CredentialsList creds,
+ in Security::UtcT time,
+ in Security::SelectorValueList descriptors,
+ in any event_specific_data
+ );
+
+ readonly attribute Security::AuditChannelId audit_channel_id;
+
+ };
+
+
+ // interface for Audit Decision
+ local interface AuditDecision {
+
+# pragma version AuditDecision 1.8
+
+ boolean audit_needed (
+ in Security::AuditEventType event_type,
+ in Security::SelectorValueList value_list
+ );
+
+ readonly attribute AuditChannel audit_channel;
+
+ };
+
+
+ local interface AccessDecision {
+
+# pragma version AccessDecision 1.8
+
+ boolean access_allowed (
+ in SecurityLevel2::CredentialsList cred_list,
+ in Object target,
+ in CORBA::Identifier operation_name,
+ in CORBA::Identifier target_interface_name
+ );
+ };
+
+
+ // Policy interfaces to control bindings
+
+ local interface QOPPolicy : CORBA::Policy {
+# pragma version QOPPolicy 1.8
+ readonly attribute Security::QOP qop;
+
+ };
+
+ local interface MechanismPolicy : CORBA::Policy {
+# pragma version MechanismPolicy 1.8
+ readonly attribute Security::MechanismTypeList mechanisms;
+ };
+
+ local interface InvocationCredentialsPolicy : CORBA::Policy {
+# pragma version InvocationCredentialsPolicy 1.8
+ readonly attribute CredentialsList creds;
+ };
+
+ local interface EstablishTrustPolicy : CORBA::Policy {
+# pragma version EstablishTrustPolicy 1.8
+ readonly attribute Security::EstablishTrust trust;
+ };
+
+ local interface DelegationDirectivePolicy : CORBA::Policy {
+# pragma version DelegationDirectivePolicy 1.8
+ readonly attribute Security::DelegationDirective delegation_directive;
+ };
+
+ local interface SecurityManager {
+
+# pragma version SecurityManager 1.8
+
+ // Process/Capsule/ORB Instance specific operations
+
+ readonly attribute Security::MechandOptionsList
+ supported_mechanisms;
+
+ readonly attribute CredentialsList own_credentials;
+
+ readonly attribute RequiredRights
+ required_rights_object;
+
+ readonly attribute PrincipalAuthenticator
+ principal_authenticator;
+
+ readonly attribute AccessDecision
+ access_decision;
+
+ readonly attribute AuditDecision
+ audit_decision;
+
+ TargetCredentials get_target_credentials (
+ in Object obj_ref
+ );
+
+ void remove_own_credentials(
+ in Credentials creds
+ );
+
+ CORBA::Policy get_security_policy (
+ in CORBA::PolicyType policy_type
+ );
+ };
+
+ // Interface Current derived from SecurityLevel1::Current providing
+ // additional operations on Current at this security level.
+ // This is implemented by the ORB
+ local interface Current : SecurityLevel1::Current {
+
+# pragma version Current 1.8
+
+ // Thread specific
+
+ readonly attribute ReceivedCredentials received_credentials;
+
+ };
+
+};
+
+#pragma prefix ""
+
+#endif /* _SECURITY_LEVEL_2_IDL_ */
diff --git a/TAO/orbsvcs/orbsvcs/SecurityLevel3.idl b/TAO/orbsvcs/orbsvcs/SecurityLevel3.idl
new file mode 100644
index 00000000000..58a1162f82e
--- /dev/null
+++ b/TAO/orbsvcs/orbsvcs/SecurityLevel3.idl
@@ -0,0 +1,2037 @@
+//tabstop=4
+//***********************************************************************
+// ORBAsec SL3
+// ----------------------------------------------------------------------
+// Copyright (C) 2001 Adiron, LLC.
+// All rights reserved.
+// ----------------------------------------------------------------------
+// $Id$
+//***********************************************************************
+
+//***********************************************************************
+/**
+ * @note Some interfaces in this IDL module have been altered from the
+ * original Adiron sources.
+ */
+//***********************************************************************
+
+
+#ifndef _SecurityLevel3_
+#define _SecurityLevel3_
+
+#include "tao/Policy.pidl"
+#include "tao/TimeBase.pidl"
+
+#pragma prefix "adiron.com"
+
+/**
+ * The Security Level 3 module contains the data definitions and
+ * the Application Programmers Interface for dealing with the
+ * ORBAsec SL3 Security, and the new CSIv2 Security Protocol, which has
+ * been adopted by the OMG.
+ * <p>
+ * The SecurityLevel3 interfaces and its security data structures
+ * are based on the Principal Calculus. This is a mathematical
+ * model of representing principals for the use of access control
+ * and auditing.
+ * <p>
+ * The SecurityLevel3 Security Service is represented by two objects
+ * that are returned by the ORB's resolve_initial_reference call.
+ * Those two objects are the SecurityManager and the SecurityCurrent.
+ * Other objects associated with the security service emanate from
+ * these two objects.
+ * <p>
+ * The SecurityLevel3 Security Service has a Credentials model. This
+ * model, which is heavily based on the Principal Calculus, yields
+ * an API for accessing principal information. The credentials
+ * represent a principal's credentials, as well as the establishment
+ * of security contexts between client and servers.
+ * <p>
+ * The SecurityLevel3 Security Service is currently CSIv2 Level 2
+ * compliant:
+ * <ul>
+ * <li>
+ * It works over TLS and plain TCPIP.
+ * <li>
+ * It handles the GSSUP (Username/Password) mechanism for
+ * CSI level Client Authentication.
+ * <li>
+ * It has the ability to "quote" an identity, i.e. CSIv2
+ * Identity Assertion.
+ * <li>
+ * It has the ability to "push" privileges, which it does
+ * ATLAS enabled servers.
+ * <li>
+ * It has the ability to install your own authorization
+ * token process that can allow for delegation.
+ * </ul>
+ * <p>
+ * The Security Level 3 ORB Security Service does supports retention
+ * of CSI state. Client Authentication information and Identity
+ * assertion information is transmitted on each request.
+ * <p>
+ * The Security Level 3 ORB Security Service does not automatically
+ * support endorsement at this time (CSIv2 Level 2 compliance), but
+ * does give you facility to do so.
+ */
+module SecurityLevel3 {
+
+ /**
+ * The Adiron VMCID, which is used in Minor Error Codes,
+ * Policy Tags, etc.
+ */
+ const unsigned long ADIRON_VMCID = 0xA11C000;
+
+ //-------------------------------------------------------------
+ // Security Level 3 Data Representations
+ //
+ //-------------------------------------------------------------
+
+ //
+ // A Principal Name
+ // A principal name always has a type, and a path of
+ // name components. They are ordered from least significant
+ // to most significant. For example, if a principal is represented
+ // by a single X.509 certificate, the first element in the path
+ // is the SubjectDN, and the second is the IssuerDN.
+ //
+ /**
+ * A NameType is used for typing a PrincipalName data structure.
+ * A NameType is a string that represents an ASN.1
+ * OBJECT IDENTIFIER. Its representation usually of the form
+ * "oid:1.2.3.4". Other forms may be possible. It is used
+ * for encoding name type identifiers, which are ASN.1 DER encoded
+ * OBJECT IDENTIFIERs, in the CSI protocol.
+ * @see NameComponent
+ * @see NamePath
+ * @see NameValue
+ * @see PrincipalName
+ */
+ typedef string NameType;
+
+ /**
+ * A NameComponent is an ordered component of a NamePath. The
+ * least significant component is always the first component.
+ * It is the type of a wstring to handle international character
+ * values.
+ * @see NameType
+ * @see NamePath
+ * @see NameValue
+ * @see PrincipalName
+ */
+ typedef wstring NameComponent;
+
+ /**
+ * A NamePath is an ordered collection of NameComponents, ordered
+ * from the least significant to most significant. For example,
+ * an identity that is defined by a certificate that has a
+ * SubjectDN of "C=US,CN=Joe,O=Adiron" and an IssuerDN of
+ * "C=US,CN=AdironCA,O=Adiron" will have the following
+ * name components:
+ * <pre>
+ * NameComponent[0] = "C=US,CN=Joe,O=Adiron"
+ * NameComponent[1] = "C=US,CN=AdironCA,O=Adiron"
+ * </pre>
+ * @see NameType
+ * @see NameComponent
+ * @see NameValue
+ * @see PrincipalName
+ */
+ typedef sequence<NameComponent> NamePath;
+
+ /**
+ * A NameValue is the value component of a PrincipalName,
+ * which is a "type-value" pair. It is defined as a NamePath.
+ * @see NameType
+ * @see NameComponent
+ * @see NamePath
+ * @see PrincipalName
+ */
+ typedef NamePath NameValue;
+
+ /**
+ * A PrincipalName is a "type-value" structure. The type directs
+ * what the encoding and format of the components in the the
+ * value component are. For example, a type of "X509DirectoryPath"
+ * means that the value contains the DNs of the subject and
+ * subsequent issuers.
+ * @see NameType
+ * @see NameComponent
+ * @see NamePath
+ * @see NameValue
+ */
+ struct PrincipalName {
+ NameType the_type;
+ NameValue the_name;
+ };
+
+ /**
+ * A list of PrincipalNames.
+ * @see PrincipalName
+ */
+ typedef sequence<PrincipalName> PrincipalNameList;
+
+
+ //
+ // Attributes for privileges and other things. They are type value pairs.
+ //
+
+ /**
+ * A PrinAttribute is a "type-value" pair, usually attributed to
+ * a Principal by some means, such as values stored in its certificate
+ * or environmental concerns, such as the channel the principal was
+ * authenticated over.
+ * <p>
+ * The type of a PrinAttribute is represented by a string.
+ * <p>
+ * Privilege Attribute Types, that might come from X.509 certificates
+ * might be represented by OIDs. OIDs are represented as:
+ * <pre>
+ * oid:n1.n2.n3.n4.n5.n6....
+ * for an OID where ni are non-negative integers.
+ * </pre>
+ * These OIDs are meant to be used to direct the "type-value" encoding
+ * of a GSS-API ExportName, which uses an OID as a type that directs
+ * the encoding of the value.
+ * <p>
+ * Example Environmental Attribute Types
+ * <p><pre>
+ * SL3:ChannelIdentifier
+ * SL3:LocalAddress
+ * SL3:LocalPort
+ * SL3:TransportMechanism
+ * SL3:TLSCipherSuite
+ * </pre>
+ * @see PrinAttribute
+ */
+ typedef string PrinAttributeType;
+
+ /**
+ * A PrinAttributeValue is a wide character string that encodes
+ * or decodes the value of an attribute. An attempt is always
+ * meant to represent an attribute's value in a human readable
+ * string form. If the value cannot be decoded this way, and its
+ * native form is binary, then it is represented in a Hex encoding
+ * of the binary form.
+ * @see PrinAttribute
+ */
+ typedef wstring PrinAttributeValue;
+
+ /**
+ * A PrinAttribute is a "type-value" pair, usually attributed to
+ * a Principal by some means, such as values stored in its certificate
+ * or environmental concerns, such as the channel the principal was
+ * authenticated over.
+ * @see PrinAttribute
+ */
+ struct PrinAttribute {
+ PrinAttributeType the_type;
+ PrinAttributeValue the_value;
+ };
+
+ /**
+ * A list of PrinAttributes.
+ * @see PrinAttribute
+ */
+ typedef sequence<PrinAttribute> PrinAttributeList;
+
+
+ /**
+ * This is just a sequence of strings that make
+ * up the components of a ResourceName.
+ * @see ResourceName
+ */
+ typedef sequence<string> ResourceNameComponents;
+
+ /**
+ * A ResourceName is the constructed name of a "resource". A
+ * ResourceName is closely modeled after CORBAmed's Resource
+ * Access Decision (RAD) facility's "Resource". It contains
+ * a sequence of strings.
+ */
+ struct ResourceName {
+ ResourceNameComponents components;
+ };
+
+ /**
+ * A List of Resource Names.
+ * @See ResourceName
+ */
+ typedef sequence<ResourceName> ResourceNameList;
+
+
+ //
+ // NameTypes used in SL3
+ //
+
+ /**
+ * An NT_KerberosName is a NameType that signifies that the
+ * value of a PrincipalName is a Kerberos formated name.
+ * A KerberosName is a single string encoded in the
+ * familiar "name@REALM" format.
+ * <p>
+ * From GSS-Kerboeros RFC 1964:
+ * <p>
+ * 2.1.1. Kerberos Principal Name Form
+ * <p>
+ * This name form shall be represented by the Object Identifier {iso(1)
+ * member-body(2) United States(840) mit(113554) infosys(1) gssapi(2)
+ * krb5(2) krb5_name(1)}.
+ */
+ const NameType NT_KerberosName = "oid:1.2.840.113554.1.2.2.1";
+
+ /**
+ * An NT_X509DirectoryNamePath is a NameType that signifies that
+ * the value of a PrincipalName is constructed from a chain
+ * of certificates, such that the end entity is the least
+ * significant position, with the subsequent issuers following
+ * in order of signature.
+ * <p>
+ * The coding of the names is the string encoding of
+ * complete X.500 DN's, such as "C=US, CN=Joe, O=Adiron".
+ * There is no indication whether the last DN in the path is a
+ * "root", i.e. it's issuer is the same.
+ */
+ const NameType NT_X509DirectoryNamePath = "SL3:X509DirectoryPathName";
+
+ /**
+ * The NT_Anonymous is a name type that specifies that the
+ * PrincipalName is representing the "anonymous" principal.
+ * Its value always as a single name component of "anonymous"
+ */
+ const NameType NT_Anonymous = "SL3:anonymous";
+
+ /**
+ * The NT_StringName is a NameType that specifies that the
+ * PrincipalName is represented by a single NameComponent
+ * of name in a "scoped" name space. The name and scope
+ * are separated by a single "@" character. The escape character
+ * is "\". This string name as we call it is the same form
+ * used for the GSSUP (GSS-UserPassword NameType). This
+ * oid is the OID defined by the OMG CSIv2 specification. It
+ * is the value defined by the CSI::GSS_NT_Scoped_Username_OID
+ * constant.
+ */
+ const NameType NT_StringName = "oid:2.23.130.1.2.1";
+
+ //
+ // Privileges
+ //
+
+ /**
+ * A ScopedPrivileges structure represents privileges that
+ * belong to a scope defined by a principal. This structure
+ * is used to represent a principal that is a privilege authority
+ * that issues privileges. Privileges are represented as
+ * PrinAttributes.
+ */
+ struct ScopedPrivileges {
+ PrincipalName privilege_authority;
+ PrinAttributeList privileges;
+ };
+
+ /**
+ * A list of ScopedPrivileges
+ * @see ScopedPrivileges
+ */
+ typedef sequence<ScopedPrivileges> ScopedPrivilegesList;
+
+ //
+ // Principals
+ //
+
+ /**
+ * A Principal comes in three forms, which correspond to the
+ * Principal Calculus. The forms are "Simple", "Quoting", and
+ * "Proxy". Simple is a principal that represents a single
+ * entity, usually "speaking for" itself. A "Quoting" principal
+ * is a "compound" principal that says that one principal is
+ * speaking on behalf of another, usually denoted by "(A|B)", i.e.
+ * "A is quoting B", which means that "A is speaking on behalf of B".
+ * A "Proxy" principal is almost the same as a "Quoting" principal.
+ * However, the security service has determined that enough evidence
+ * exists that proves that Principal A is authorized to speak in
+ * B's behalf. This principal is denoted in the calculus as "(A for B)"
+ * in contrast to the quoting principal "(A|B)".
+ */
+ typedef unsigned long PrincipalType;
+
+ /**
+ * The Simple Principal Type (A)
+ * @see PrincipalType
+ */
+ const PrincipalType PT_Simple = 0; // A, valuetype SimplePrincipal
+ /**
+ * The Quoting Principal Type (A|B)
+ * @see PrincipalType
+ */
+ const PrincipalType PT_Quoting = 1; // B | A, valuetype QuotingPrincipal
+ /**
+ * The Proxy Principal Type (A for B)
+ * @see PrincipalType
+ */
+ const PrincipalType PT_Proxy = 2; // B for A, valuetype ProxyPrincipal
+
+ /**
+ * A Principal is represented by a base value type, which is extended
+ * for the various principals, Simple, Quoting, and Proxy. This base
+ * type of a Principal may be sufficient for access control in
+ * most systems.
+ * @param the_type contains the corresponding identifier
+ * @param the_name contains the logical name of the most derived
+ * Principal. Such as if the Principal is a nested
+ * ProxyPrincipal (i.e. C for B for A) the name here
+ * is A.
+ * @param environmental_attributes
+ * The attributes name certain things that do are
+ * environmental, such as IP addresses.
+ * @param with_privileges
+ * These are the privileges associated with Principal A
+ * restricted_resources.
+ * This attribute contains a collection of resources on which
+ * the principal is authorized to perform actions.
+ */
+ valuetype Principal {
+ /** This field contains the type of the Principal. */
+ public PrincipalType the_type;
+ /** This field contains the name of the Principal */
+ public PrincipalName the_name;
+ /**
+ * This field contains the attributes of the principal
+ * that are considered environmental, such as authentication
+ * mechanism, authentication channel identifier, etc.
+ */
+ public PrinAttributeList environmental_attributes;
+ /**
+ * This field contains the list of scoped privileges the
+ * security service has determined belong to the particular
+ * principal.
+ */
+ public ScopedPrivilegesList with_privileges;
+ };
+
+ /**
+ * A list of Principals.
+ * @see Principal
+ */
+ typedef sequence<Principal> PrincipalList;
+
+ /**
+ * A Simple Principal represents a single entity. It is usually
+ * derived by credentials acquisition, authentication, trust rules concerning quoting,
+ * or trust rules and certificates concerning Proxying.
+ * It has one extra field over the base Principal, which is
+ * "alternate_names".
+ */
+ valuetype SimplePrincipal : /* truncatable */ Principal {
+ /**
+ * This field indicates whether the principal was derived or is
+ * going to be derived from an authentication mechanism.
+ * <p>
+ * If the <code>SimplePrincipal</code> is directly or indirectly
+ * (as part of a composite <code>Principal</code>) in the
+ * <code>ClientCredentials.client_principal<code> or
+ * <code>TargetCredentials.target_principal<code> field,
+ * the <code>authenticated</code> field indicates the authentication
+ * status of the <code>SimplePrincipal</code> in the client or target
+ * principal, respectively.
+ * <p>
+ * If the <code>SimplePricipal</code> is directly or indirectly in
+ * the <code>ClientCredentials.target_principal<code>
+ * (or <code>TargetCredentials.client_principal<code>) field,
+ * the <code>authenticated</code> field indicates the target's
+ * (or client's belief) about its authentication status to the other
+ * party.
+ * <p>
+ * If the <code>SimplePrincipal</code> is directly or indirectly in
+ * the <code>the_principal</code> field of the initiator or acceptor
+ * of <code>OwnCredentials</code>, the <code>authenticated</code>
+ * field indicates the expectation of being authenticated to the other
+ * side of the communication when the initiator or acceptor is used.
+ * <p>
+ * If the <code>SimplePrincipal</code> is directly or indirectly in
+ * the <code>the_principal</code> field of a
+ * <code>PrincipalIdentityStatement</code>,
+ * the <code>authenticated</code> field indicates only the
+ * "best effort" of knowing whether the principal has been possibly
+ * authenticated or not. In other word, if this field is
+ * <code>TRUE</code>, it is for sure that the principal has been
+ * authenticated (or is expecting to be authenticated).
+ * If this field is <code>FALSE</code>, the principal may or may not
+ * have been authenticated. The reason for this ambiguity is that
+ * a <code>PrincipalIdentityStatement</code> may be created before
+ * the authentication of the principal being performed. In general,
+ * the <code>authenticated</code> field of a
+ * <code>SimplePrincipal</code> inside the <code>the_principal</code>
+ * field of a <code>PrincipalIdentityStatement</code> should not be
+ * taken as a definite answer for the authentication status of the
+ * <code>SimplePrincipal</code>.
+ *
+ * @see ClientCredentials.client_authentication
+ * @see ClientCredentials.target_authentication
+ * @see TargetCredentials.client_authentication
+ * @see TargetCredentials.target_authentication
+ */
+ // For example, if a client uses the User/Password mechanism to
+ // communicate with a target, the client's OwnCredentials, created
+ // using a PasswordGenerator, will have the <code>authenticated</code>
+ // field in the principal in the initiator being true,
+ // although the client may not have been authenticated to the target.
+ //
+ public boolean authenticated;
+ /**
+ * This field contains the other name types, such as
+ * that appear in the X.509 alternate name fields.
+ */
+ public PrincipalNameList alternate_names;
+
+ };
+
+ /**
+ * A ProxyPrincipal represents a principal that speaks for another.
+ * The principal is proved that it is authorized to speak for another.
+ * The system believes this, either by trust rules of its own,
+ * or by delivered endorsement from the principal such as
+ * Principal (B for A) where the endorsement takes the form
+ * in the Principal Calculus as (T says B serves A)
+ * where T is some entity trusted by the security service
+ * to make those statements.
+ * <p>
+ * Important: This valuetype extends the Principal value type. The
+ * <code>the_name</code> filed of this object will contain the name of the
+ * <code>speaks_for</code> principal, as that is the name most access control
+ * systems would care about. Therefore, this value type can be
+ * truncated by access control systems that do not want to
+ * examine the principal in detail.
+ */
+ valuetype ProxyPrincipal : /* truncatable */ Principal {
+
+ /**
+ * In a Proxy Principal of (A for B) the <code>speaking</code> field
+ * represents the principal A.
+ */
+ public Principal speaking;
+
+ /**
+ * In a Proxy Principal of (A for B) the <code>speaks_for</code> field
+ * represents the principal B.
+ */
+ public Principal speaks_for;
+
+ };
+
+ /**
+ * A QuotingPrincipal represents a principal that speaks for another.
+ * The principal is not proved that it is authorized to speak for another.
+ * The system derives principals like this based on statements in the
+ * Pricipal Calculus, such as "A says B says r", which results in the
+ * quoting principal (A|B) says r, where "r" is a statement, such as
+ * a CORBA request. The security service derives principals like
+ * this from the CSI Identity Assertion mechanism.
+ * <p>
+ * Important: This valuetype extends the Principal value type. The
+ * <code>the_name</code> filed of this object will contain the name of the
+ * <code>quotes_for</code> principal, as that is the name most access control
+ * systems would care about. Therefore, this value type can be
+ * truncated by access control systems that do not want to
+ * examine the principal in detail.
+ */
+ valuetype QuotingPrincipal : /* truncatable */ Principal {
+
+ /**
+ * In a Quoting Principal of (A|B) the <code>speaking</code> field
+ * represents the principal A.
+ */
+ public Principal speaking;
+
+ /**
+ * In a Quoting Principal of (A|B) the <code>quotes_for</code> field
+ * represents the principal B.
+ */
+ public Principal quotes_for;
+
+ };
+
+ //
+ // Statements
+ //
+
+ /**
+ * A Statement is a value type that has extensions which
+ * represent the different relevant data directed by its StatementType.
+ * There are two basic Statement Types, an IdentityStatement and
+ * an EndorsementStatement. An identity statement is a statement that
+ * asserts an identity. It may represent a the components of
+ * an X.509 certificate during an authentication. An EndorsementStatement
+ * may represent the contents of an X.509 AttributeCertificate or
+ * some other notion of an endorsement, such as a certificate in
+ * BizTalk XML.
+ * <p>
+ * Statements are contained in the Credentials Objects. They
+ * represent pieces of evidence collected from which the security
+ * service deduces the Principal of the Credentials Objects.
+ */
+ typedef unsigned long StatementType;
+
+ /**
+ * The Identity Statement Type.
+ * <p>
+ * A statement of this type at least extends to the
+ * IdentityStatement valuetype, if not truncated
+ * @see IdentityStatement
+ */
+ const StatementType ST_IdentityStatement = 1; //valuetype IdentityStatement
+
+ /**
+ * The Endorsement Statement Type.
+ * <p>
+ * A statement of this type at least extends to the
+ * EndorsementStatement valuetype, if not truncated
+ * @see EndorsementStatement
+ */
+ const StatementType ST_EndorsementStatement = 2; //valuetype EndorsementStatement
+
+ /**
+ * An encoding is a sequence of bytes.
+ */
+ typedef sequence<octet> Encoding;
+
+ /**
+ * Statement encoding type.
+ * <p>
+ * Statements carry their original encoding information, if
+ * they came from an encoding, such as list of X.509 identity
+ * certificates (i.e. a chain). The encoding type may be derivable
+ * from the encoding itself. For example, it's easy to tell the
+ * difference between a PEM encoded certificate, and a DER encoded
+ * certificate. Therefore, the encoding type may default to "Unknown".
+ * Other types may exist than the ones provided as constants in
+ * this module.
+ */
+ typedef string EncodingType;
+
+ /**
+ * The ET_NoEncoding type signifies that the statement
+ * has been generated solely by the security service
+ * and has no encoding.
+ */
+ const EncodingType ET_NoEncoding = "NoEncoding";
+
+ /**
+ * The ET_Unknown encoding type may always be used if the encoding
+ * type can only be figured out from encoding itself.
+ */
+ const EncodingType ET_Unknown = "Unknown";
+
+ /**
+ * User Exception for a bad encoding.
+ */
+ exception BadEncoding {};
+
+ /**
+ * User Exception for a bad or unsupported encoding type.
+ */
+ exception BadEncodingType {};
+
+ /**
+ * The Statement Layer is the layer of the protocol or security
+ * service from which the statement emanated, derived, or was collected.
+ */
+ typedef unsigned long StatementLayer;
+
+ /**
+ * Default type for a Statement Layer
+ */
+ const StatementLayer SL_Unknown = 0;
+ /**
+ * The SL_Transport statement type signifies that the associated
+ * statement is derived from the transport layer, such as
+ * an X.509 Certificate from a TLS handshake.
+ */
+ const StatementLayer SL_Transport = 1;
+ /**
+ * The SL_CSIAuthorization statement type signifies that the associated
+ * statement is derived from the CSI Authorization Layer in the CSIv2
+ * protocol.
+ */
+ const StatementLayer SL_CSIAuthorization = 2;
+ /**
+ * The SL_CSIClientAuth statement type signifies that the associated
+ * statement is derived from the CSI Client Authentication Layer
+ * in the CSIv2 protocol.
+ */
+ const StatementLayer SL_CSIClientAuth = 3;
+ /**
+ * The SL_CSIIdentity statement type signifies that the associated
+ * statement is derived from the CSI Identity Assertion Layer
+ * in the CSIv2 protocol.
+ */
+ const StatementLayer SL_CSIIdentity = 4;
+
+ /**
+ * The SL_UserDefined statement layer signifies that the associate
+ * statement is derived or created by a user or some other
+ * entity than the security service.
+ */
+ const StatementLayer SL_UserDefined = 5;
+
+ /**
+ * The Statement base type contains the information common
+ * to all statements. A statement has an "external" encoding, such
+ * as an X509 Certificate. Some statements may not have an encoding,
+ * but its extension may carry the pertinent marshable information,
+ * such as a PrincipalIdentityStatement for anonymous, which is
+ * generated by the security service.
+ */
+ valuetype Statement {
+ /**
+ * This field contains an identifier of the
+ * service layer that generated the statement.
+ * The layer that generated or delivered
+ * the statement, i.e. Transport, CSIv2 Authentication,
+ * CSIv2 Authorization, or CSIv2 Identity Assertion.
+ */
+ public StatementLayer the_layer;
+ /**
+ * The type of statement, which indicates its extension
+ * such as an Identity Statement or an Endorsement
+ * Statement.
+ */
+ public StatementType the_type;
+ /**
+ * This field indicates the type of encoding.
+ * The encoding may be contrived, at the encoding
+ * may not exist, however, the extension of the
+ * statement type may contain data that can
+ * be marshaled across the wire. See the Principal
+ * Identity Statement.
+ */
+ private EncodingType encoding_type;
+ /**
+ * The bytes of the encoding, if it exists.
+ */
+ private Encoding the_encoding;
+
+ /**
+ * Returns the encoding type
+ */
+ EncodingType get_encoding_type();
+
+ /**
+ * Returns an encoding of this statement. Some implementations
+ * may be able to convert. Using and encoding_type of
+ * ET_Unknown, will always yield the default encoding,
+ * if it exists. If the encoding does not exist,
+ * a successful return containing an empty
+ * sequence will result.
+ */
+ Encoding get_encoding(
+ in EncodingType encoding_type
+ ) raises (
+ BadEncodingType
+ );
+
+ /**
+ * This factory method allows users to create their
+ * own Statements from an encoding. The statements created
+ * by this factory method may have a type which is a further
+ * extension of the valuetype Statement.
+ */
+ factory create(
+ in EncodingType encoding_type,
+ in Encoding the_encoding
+ );
+ };
+ typedef sequence<Statement> StatementList;
+
+ /**
+ * The Identity Statement further classifies the encoding
+ * as a statement that if verified asserts an identity.
+ */
+ valuetype IdentityStatement : Statement {
+ /**
+ * This field contains a possibly well known identifier that
+ * may aid in the interpretation of the identity statement's
+ * encoding. It may be an empty string, which signifies that
+ * there is no known interpretation aid for the encoding, or
+ * that there is no encoding.
+ */
+ public string interpretation_aid;
+ };
+
+ /**
+ * The Principal Identity Statement is the minimal version of an
+ * Identity statement that asserts a single identity that the
+ * security service can translate into a principal.
+ * <p>
+ * An example of an identity statement is an X.509 certificate in
+ * which its attributes are exposed into the principal, such as
+ * privileges. This valuetype may also be further extended by the
+ * security service depending on its encoding and the capabilities
+ * of the security service.
+ */
+ valuetype PrincipalIdentityStatement : IdentityStatement {
+ public Principal the_principal;
+ };
+
+ /**
+ * The Endorsement Statement is a statement that is used for
+ * authorization. An Endorsement statement endorses a
+ * principal with certain characteristics, such as privileges
+ * or the authority to act on behalf of another principal, sometimes
+ * called "delegation".
+ * <p>
+ * According to our research, an endorsement statement may be a
+ * complex entity containing matching rules for the endorsement.
+ * An endorsement may have the following general form:
+ * <pre>
+ * I says Principal A matching [(P1 with [p1,...,pn]) or ....]
+ * speaks_for
+ * Principal B matching [(T1 with [t1,...,tn]) or ... ]
+ * has [s1,...,sm]
+ * on Resources matching [R1, .... Rn]
+ * </pre>
+ * Actual semantic reduction of principals is directed by the
+ * the matching rules, and may depend on other statements as well,
+ * such as local trust rules in the security service configuration.
+ * Also, much of the capability of an endorsement statement is
+ * dependent on its encoding.
+ * <p>
+ * This approach to authorization is a largely unexplored research
+ * topic. There are not many or well known encodings of endorsement
+ * statements. Therefore, we are reluctant to produce interfaces
+ * just yet, that go beyond the encoding. However, we do expose the
+ * Endorsement statement type, which may further direct the interpretation
+ * of it's encoding.
+ */
+ valuetype EndorsementStatement : Statement {
+ /**
+ * This field contains a possibly well known identifier that
+ * may aid in the interpretation of the identity statement's
+ * encoding. It may be an empty string, which signifies that
+ * there is no known interpretation aid for the encoding, or
+ * that there is no encoding.
+ */
+ public string interpretation_aid;
+ };
+
+ /**
+ * An X509IdentityStatement is one that extends the Principal Identity
+ * Statement. If one does get an X509 IdentityStatement, it is
+ * currently supported with IAIK in both DER and PEM formats.
+ */
+ valuetype X509IdentityStatement : PrincipalIdentityStatement {
+ /**
+ * This factory method allows users to create their
+ * own X509Identity statements from an encoding.
+ */
+ factory create(
+ in EncodingType encoding_type,
+ in Encoding the_encoding
+ );
+ };
+ typedef sequence<X509IdentityStatement> X509IdentityStatementList;
+
+ //-------------------------------------------------------------
+ // Security Level 3 Application Users Interface
+ //
+ //-------------------------------------------------------------
+
+ //
+ // The Security Level 3 Credentials Model
+ //
+
+ /**
+ * Credentials come in three types. OwnCredentials, ClientCredentials,
+ * and TargetCredentials. OwnCredentials represent the ORB instance's
+ * credentials. Each Credentials has initiating and accepting capability.
+ * ClientCredentials represent an established security context with
+ * a client. TargetCredentials represent an established security context
+ * with a Target's Server.
+ */
+ typedef unsigned long CredentialsType;
+
+ /**
+ * The CT_OwnCredentials CredentialsType signifies that the
+ * Credentials can be extended to the OwnCredentials Type.
+ */
+ const CredentialsType CT_OwnCredentials = 0;
+ /**
+ * The CT_ClientCredentials CredentialsType signifies that the
+ * Credentials can be extended to the ClientCredentials Type.
+ */
+ const CredentialsType CT_ClientCredentials = 1;
+ /**
+ * The CT_TargetCredentials CredentialsType signifies that the
+ * Credentials can be extended to the ClientCredentials Type.
+ */
+ const CredentialsType CT_TargetCredentials = 2;
+
+ /**
+ * A Credentials object has a validity state. Some credentials
+ * may be time or use dependent.
+ */
+ typedef long CredentialsState;
+
+ /**
+ * The Credentials with a CredentialsState of CS_Invalid cannot be
+ * used in any the initiating or accepting establishment of any
+ * security contexts.
+ */
+ const CredentialsState CS_Invalid = -3;
+
+ /**
+ * Credentials with a CredentialsState of CS_Expired can no longer
+ * be used for initiating or accepting establishment of any
+ * security contexts.
+ */
+ const CredentialsState CS_Expired = -2;
+ /**
+ * Credentials with a CredentialsState of CS_PendingRelease can no longer
+ * be used for initiating or accepting establishment of any
+ * security contexts. It means that "release_credentials" has been
+ * called on the credentials.
+ */
+ const CredentialsState CS_PendingRelease = -1;
+ /**
+ * Credentials with a CredentialsState of CS_Initialized cannot
+ * be used for initiating or accepting establishment of any
+ * security contexts. It means that credentials are in an initial
+ * state. This value is for internal use, and there is no
+ * reason a SecurityLevel3 user should see credentials in this state.
+ */
+ const CredentialsState CS_Initialized = 0;
+ /**
+ * Credentials with a CredentialsState of CS_Valid can
+ * be used for initiating or accepting establishment of
+ * security contexts.
+ */
+ const CredentialsState CS_Valid = 1;
+
+ /**
+ * Credentials have system generated identifiers
+ * to which they can be referred and retrieved.
+ */
+ typedef string CredentialsId;
+ typedef sequence<CredentialsId> CredentialsIdList;
+
+ /**
+ * A Context Id is a system generated unique identifier for identifying
+ * a security context to the application.
+ * Security Contexts may be long lived and not established on
+ * every request. Therefore, an identifier is assigned.
+ * <p>
+ * Note that this Context Id is not directly related to the context
+ * defined in the CSIv2 specification.
+ */
+ typedef string ContextId;
+
+ /**
+ * Credentials Usage
+ * <p>
+ * Credentials Usage refers to the concept that Credentials may
+ * be used to initiate security context, accept security contexts,
+ * or do both. its values are used in the acquisition
+ * of credentials for the purpose of designating the abilities
+ * of the credentials acquired.
+ */
+ typedef unsigned long CredentialsUsage;
+ /**
+ * The CU_Indefinite CredentialsUsage type is a value that
+ * signifies the default. Depending on some other acquisition
+ * arguments, the credentials usage may be able to be implicitly
+ * determined.
+ */
+ const CredentialsUsage CU_Indefinite = 1;
+ /**
+ * The CU_None CredentialsUsage type is a value that states the
+ * credentials cannot be used to make or accept security
+ * contexts. ClientCredentials and TargetCredentials have
+ * this credentials usage.
+ */
+ const CredentialsUsage CU_None = 2;
+ /**
+ * The CU_AcceptOnly CredentialsUsage type is a value that signifies
+ * that the credentials can only be used to accept the establishment
+ * of security contexts.
+ */
+ const CredentialsUsage CU_AcceptOnly = 3;
+ /**
+ * The CU_InitiateOnly CredentialsUsage type is a value that signifies
+ * that the credentials can only be used to initiate the establishment
+ * of security contexts.
+ */
+ const CredentialsUsage CU_InitiateOnly = 4;
+ /**
+ * The CU_InitiateAndAccept CredentialsUsage type is a value that
+ * signifies that the credentials can be used to both initiate
+ * and accept the establishment of security contexts.
+ */
+ const CredentialsUsage CU_InitiateAndAccept = 5;
+
+ /**
+ * A CredsDirective is a directive on a invocation as to the
+ * effects of the initiated security context will have on the
+ * the accepting side. Please see ContextEstablishmentPolicy
+ * for is use in context with establishing security contexts.
+ * @see ContextEstablishmentPolicy
+ */
+ typedef unsigned long CredsDirective;
+ /**
+ * The CD_Default CredsDirective is a value that signifies to
+ * use the capabilities of the selected credentials.
+ */
+ const CredsDirective CD_Default = 0;
+ /**
+ * The CD_InvokeTarget CredsDirective is a value that signifies that
+ * the selected credentials should only be used in a simple
+ * invocation fashion. They shall not attempt to endorse or embody
+ * the target to act on its behalf.
+ */
+ const CredsDirective CD_InvokeTarget = 1;
+ /**
+ * The CD_EndorseTarget CredsDirective is a value that signifies that
+ * the selected credentials, if capable, should attempt to endorse
+ * the target. In other words, it gives the accepting side the ability
+ * to act on behalf of the initiating side.
+ */
+ const CredsDirective CD_EndorseTarget = 2;
+ /**
+ * The CD_EmbodyTarget CredsDirective is a value that signifies that
+ * the selected credentials, if capable, should attempt to embody
+ * the target. In other words, it gives the accepting side the ability
+ * to impersonate the initiating side.
+ */
+ const CredsDirective CD_EmbodyTarget = 3;
+
+ /**
+ * A Feature Directive is a general directive used in policy that
+ * stipulates the of a particular feature. Such examples include,
+ * confidentiality, integrity, client authentication, etc.
+ */
+ typedef long FeatureDirective;
+
+ /**
+ * The FD_DoNotUse FeatureDirective means definitely not to use
+ * the feature.
+ */
+ const FeatureDirective FD_DoNotUse = -2;
+ /**
+ * The FD_DoNotUseIfPossible FeatureDirective means not to use
+ * the feature if it is possible. Note, some mechanisms may always
+ * use confidentiality.
+ */
+ const FeatureDirective FD_DoNotUseIfPossible = -1;
+ /**
+ * The FD_UseDefault FeatureDirective means to use or not to use
+ * the feature depending on defaults.
+ */
+ const FeatureDirective FD_UseDefault = 0;
+ /**
+ * The FD_UseIfPossible FeatureDirective means to use the feature
+ * if it is possible.
+ */
+ const FeatureDirective FD_UseIfPossible = 1;
+ /**
+ * The FD_Use FeatureDirective means definitely to use the feature.
+ */
+ const FeatureDirective FD_Use = 2;
+
+
+ /**
+ * The Initiator Type of the Initiator Side of the Credentials states
+ * the kind of Initiator it is. There are three types that mirror
+ * the type of Principal, Simple, Quoting, and Proxy, that the
+ * initiator intends to represent to a server while trying to
+ * establish a security context with the server.
+ */
+ typedef unsigned long InitiatorType;
+ /**
+ * The IT_None InitiatorType is a value that is defined for
+ * completeness, and has no real use.
+ */
+ const InitiatorType IT_None = 0;
+ /**
+ * The IT_Simple InitiatorType is a value that states that the
+ * initiator is a "Simple" Principal.
+ */
+ const InitiatorType IT_Simple = 1;
+ /**
+ * The IT_Quoting InitiatorType is a value that states that the
+ * initiator will quote another principal to the server. This
+ * principal is denoted in the Principal Calculus as (A|B), i.e.
+ * A quoting B.
+ */
+ const InitiatorType IT_Quoting = 2;
+ /**
+ * The IT_Proxy InitiatorType is a value that states that the
+ * initiator will quote another principal to the server along with
+ * getting or providing proof to the server that it can act on
+ * behalf of the quoted principals. This
+ * principal is denoted in the Principal Calculus as (A for B).
+ */
+ const InitiatorType IT_Proxy = 3;
+
+ /**
+ * The CredsInitiator object is an object that is directly a
+ * member of a particular OwnCredentials object. It represents
+ * the "initiator" side of the credentials.
+ */
+ local interface CredsInitiator {
+
+ /**
+ * The principal attribute contains a local view of the
+ * Principal that the Credentials intend to represent.
+ * Note that during context establishment, the actual establish
+ * client principal may be represented differently, especially
+ * with respect to environmental attributes. Some environmental
+ * attributes are a direct result of context establishment.
+ */
+ readonly attribute Principal the_principal;
+ /**
+ * The supporting statements attribute contains a list of statements
+ * supporting the principal associated with this initiator.
+ */
+ readonly attribute StatementList supporting_statements;
+ /**
+ * The restricted_resources attribute contains a list of
+ * resource names, by which the credentials initiator
+ * believes his authorizations apply.
+ */
+ readonly attribute ResourceNameList restricted_resources;
+ /**
+ * The initiator_type attribute signifies the intent of the
+ * initiator as to the principal it presents for the
+ * security context establishment. It should correspond
+ * to the type of the Principal. However, it might be slightly
+ * different, because using CSIv2 Client Authentication
+ * technically creates a "QuotingPrincipal" however, the
+ * initiator type will still be simple as no CSIv2 Identity
+ * Assertion will be used in establishing the security
+ * context.
+ */
+ readonly attribute InitiatorType initiator_type;
+ /**
+ * The supports_embodiment attribute is <code>TRUE</code> if these credentials
+ * can be directed by use of the CredsDirective, to give the
+ * the accepting end of a context establishment the ability
+ * to impersonate this initiator principal.
+ */
+ readonly attribute boolean supports_embodiment;
+ /**
+ * The supports_endorsement attribute is <code>TRUE</code> if these credentials
+ * can be directed by use of the CredsDirective, to endorse
+ * the accepting end of a context establishment to act
+ * on behalf of this initiator principal.
+ */
+ readonly attribute boolean supports_endorsement;
+ /**
+ * The supports_quoting attribute is <code>TRUE</code> if these credentials
+ * can be directed by use of the CredsDirective, to simply
+ * quote another principal on top of these credentials.
+ */
+ readonly attribute boolean supports_quoting;
+ /**
+ * The expiry_time attribute denotes the time that these
+ * credentials expire.
+ */
+ readonly attribute TimeBase::UtcT expiry_time;
+ };
+
+ /**
+ * The CredsAcceptor object is an object that is directly a
+ * member of a particular OwnCredentials object. It represents
+ * the "acceptor" side of the credentials.
+ */
+ local interface CredsAcceptor {
+
+ /**
+ * The principal attribute contains a local view of the
+ * Principal that the Credentials intend to represent.
+ * Note that during context establishment, the actual establish
+ * target principal may be represented differently, especially
+ * with respect to environmental attributes. Some environmental
+ * attributes are a direct result of context establishment.
+ */
+ readonly attribute SecurityLevel3::Principal the_principal;
+ /**
+ * The supporting_statements attribute contains a list of statements
+ * supporting the principal associated with this acceptor.
+ */
+ readonly attribute SecurityLevel3::StatementList supporting_statements;
+ /**
+ * The restricted_resources attribute contains a list of
+ * resource names, by which the credentials initiator
+ * believes his authorizations apply.
+ */
+ readonly attribute ResourceNameList restricted_resources;
+ /**
+ * The accepts_endorsement attribute is <code>TRUE</code> if these credentials
+ * supports and accepts CSIv2 endorsement information.
+ */
+ readonly attribute boolean accepts_endorsement;
+ /**
+ * The accepts_quoting attribute is <code>TRUE</code> if these credentials
+ * supports and accepts CSIv2 Identity Assertion information.
+ */
+ readonly attribute boolean accepts_quoting;
+ /**
+ * The expiry_time attribute denotes the time that these
+ * credentials expire.
+ */
+ readonly attribute TimeBase::UtcT expiry_time;
+
+ };
+
+ /**
+ * This type is used to identify listeners for removal.
+ * A Listener identity will be assigned to a listener when
+ * it is assigned to a particular object.
+ */
+ typedef string ListenerId;
+
+ /**
+ * This local interface is used to notify the user when the credentials
+ * have been relinquished. When credentials are "released" they may
+ * stay around until their work is finished. At that point they
+ * will be relinquished. Also, if the underlying transport credentials
+ * are released, then the SecurityLevel3 Credentials get released
+ * as well. This listener will get informed of this event.
+ */
+ local interface RelinquishedCredentialsListener {
+ void relinquished_notify(
+ in CredentialsId creds_id
+ );
+ };
+
+ /**
+ * The Credentials base interface contains the common items for
+ * the different types of credentials.
+ * @see OwnCredentials
+ * @see ClientCredentials
+ * @see TargetCredentials
+ */
+ local interface Credentials {
+
+ /**
+ * The creds_id attribute contains a system generated
+ * identifier with which can uniquely reference the credentials
+ * object.
+ */
+ readonly attribute CredentialsId creds_id;
+
+ /**
+ * The creds_type stipulates the type of credentials, i.e.
+ * to which type of credentials it may be narrowed, e.g.,
+ * Own, Client, or Target.
+ */
+ readonly attribute CredentialsType creds_type;
+
+ /**
+ * The creds_usage attribute stipulates the intended usage of the
+ * credentials. For OwnCredentials, it will be one of
+ * CU_AcceptOnly, CU_Initiate, CU_InitiateAndAccept.
+ * For ClientCredentials and TargetCredentials it will be
+ * CU_None.
+ */
+ readonly attribute CredentialsUsage creds_usage;
+
+ /**
+ * The expiry_time attribute denotes the time that these
+ * credentials expire.
+ */
+ readonly attribute TimeBase::UtcT expiry_time;
+
+ /**
+ * The creds_state attribute contains the
+ * validity state of the credentials.
+ */
+ readonly attribute CredentialsState creds_state;
+
+ /**
+ * Add a listener that will get notified when the
+ * OwnCredentials are finally done with any pending
+ * work and are relinquished by the security service.
+ */
+ ListenerId add_relinquished_listener(
+ in RelinquishedCredentialsListener listener
+ );
+
+ /**
+ * Removes a listener. This function raises a BAD_PARAM
+ * exception if the listener is not registered.
+ */
+ void remove_relinquished_listener(
+ in ListenerId id
+ );
+ };
+ /**
+ * A list of credentials.
+ */
+ typedef sequence<Credentials> CredentialsList;
+
+ /**
+ * OwnCredentials are created as a result of Credentials acquisition
+ * from the CredentialsCurator's CredentialsAcquirers.
+ * The Credentials have an initiator and an acceptor based
+ * upon its intended usage and capability. Some OwnCredentials
+ * that were acquired solely for initiating contexts (i.e. client side)
+ * will not have an acceptor, and visa versa.
+ */
+ local interface OwnCredentials : Credentials {
+
+ /**
+ * The creds_initiator attribute contains a reference to the
+ * local credentials initiator associated with these credentials.
+ * It is null if the creds_usage is AcceptOnly.
+ */
+ readonly attribute CredsInitiator creds_initiator;
+
+ /**
+ * The creds_acceptor attribute contains a reference to the
+ * local credentials acceptor associated with these credentials.
+ * It is null if the creds_usage is InitiateOnly.
+ */
+ readonly attribute CredsAcceptor creds_acceptor;
+
+ /**
+ * The release_credentials operation disables the credentials
+ * from further initiating and/or accepting contexts.
+ * Formal destruction of the Credentials object is delayed until
+ * its pending work is done, at which time it becomes Invalid.
+ */
+ void release_credentials ();
+ };
+
+ /**
+ * A list of OwnCredentials
+ */
+ typedef sequence<OwnCredentials> OwnCredentialsList;
+
+ /**
+ * An object of this interface represents the security context for
+ * a CSIv2 based remote client. It is created as the result of accepting
+ * a security context for the remote client.
+ * This object is only available during the servicing of a CORBA request.
+ * It can be retrieved from the
+ * <code>SecurityLevel3::SecurityCurrent</code> object,
+ * as it is thread based.
+ * <p>
+ * This object contains only the information used from the
+ * <code>OwnCredentials</code> that was pertinent in establishing the
+ * context. There is a pointer back to that <code>OwnCredentials</code>
+ * object. Once this context is created, its attributes are guaranteed
+ * not to change.
+ */
+ local interface ClientCredentials : Credentials {
+
+ /**
+ * The context_id attribute contains a system generated unique identifier
+ * for the context,
+ */
+ readonly attribute ContextId context_id;
+
+ /**
+ * The client_principal attribute contains the principal that
+ * the security service can deduce is the client from the
+ * information and mechanisms used.
+ */
+ readonly attribute Principal client_principal;
+
+ /**
+ * The client_supporting_statements attribute contains the statements that
+ * delivered from CSIv2 protocol along with any from the associated
+ * OwnCredentials that are used to deduce the client principal.
+ */
+ readonly attribute StatementList client_supporting_statements;
+
+ /**
+ * The client_restricted_resources attribute contains the names of the
+ * resources that the security service deduces from the CSIv2
+ * information and information from the associated OwnCredentials.
+ */
+ readonly attribute ResourceNameList client_restricted_resources;
+
+ /**
+ * The target_principal attribute contains the exact principal that
+ * the security service believes is representative of the
+ * clients version of the target's principal.
+ */
+ readonly attribute Principal target_principal;
+
+ /**
+ * The target_supporting_statements attribute contains the statements that
+ * support the deduction of the target principal.
+ */
+ readonly attribute StatementList target_supporting_statements;
+
+ /**
+ * The target_restricted_resources attribute contains names of resources
+ * on which the target is restricted. This information may come
+ * from the OwnCredentials.
+ */
+ readonly attribute ResourceNameList target_restricted_resources;
+
+ /**
+ * This attribute refers to the OwnCredentials that were used in
+ * establishing the security context.
+ */
+ readonly attribute OwnCredentials parent_credentials;
+
+ /**
+ * This attribute is <code>TRUE</code> if the target has
+ * authenticated the client, either over the transport, or at
+ * the CSIv2 Client Authentication layer.
+ */
+ readonly attribute boolean client_authentication;
+
+ /**
+ * This attribute is <code>TRUE</code> if the target believes that
+ * the client has authenticated the target over the transport.
+ */
+ readonly attribute boolean target_authentication;
+
+ /**
+ * This attribute is <code>TRUE</code> if the context is providing
+ * confidentiality protection.
+ */
+ readonly attribute boolean confidentiality;
+
+ /**
+ * This attribute is <code>TRUE</code> if the context is providing
+ * integrity protection.
+ */
+ readonly attribute boolean integrity;
+ };
+
+ /**
+ * The TargetCredentials object is created as the result of accepting a
+ * security context for a target. It represents that context.
+ * It contains only the information used from the OwnCredentials
+ * that was pertinent in establishing the context.
+ * There is a pointer back to that OwnCredentials object.
+ * Once this context is created, its attributes are guaranteed
+ * not to change.
+ */
+ local interface TargetCredentials : Credentials {
+
+ /**
+ * The context_id attribute contains a system generated
+ * unique identifier for the context.
+ */
+ readonly attribute ContextId context_id;
+
+ /**
+ * The client_principal attribute contains the principal that
+ * the security service believe is the target's
+ * ClientCredentials client_principal attribute.
+ */
+ readonly attribute Principal client_principal;
+
+ /**
+ * The client_supporting_statements attribute contains the
+ * statements that support the deduction of the client principal.
+ */
+ readonly attribute StatementList client_supporting_statements;
+
+ /**
+ * The client_restricted_resources attribute contains names of
+ * resources on which the client believes the client is restricted.
+ * This information may be derived from newly acquired endorsement
+ * information.
+ */
+ readonly attribute ResourceNameList client_restricted_resources;
+
+ /**
+ * The target_principal attribute contains the exact principal that
+ * the security service deduces to be the target.
+ */
+ readonly attribute Principal target_principal;
+
+ /**
+ * The target_supporting_statements attribute contains the statements
+ * that support the deduction of the target principal.
+ */
+ readonly attribute StatementList target_supporting_statements;
+
+ /**
+ * The target_restricted_resources attribute contains names of
+ * resources on which the target is restricted. This information
+ * may not be available.
+ */
+ readonly attribute ResourceNameList target_restricted_resources;
+
+ /**
+ * The parent_credentials attribute refers to the OwnCredentials
+ * that were used in establishing the security context.
+ */
+ readonly attribute OwnCredentials parent_credentials;
+
+ /**
+ * The client_authentication attribute is <code>TRUE</code> if the client
+ * believes that the target has authenticated the client, either
+ * over the transport, or at the CSIv2 Client Authentication layer.
+ */
+ readonly attribute boolean client_authentication;
+
+ /**
+ * The target_authentication attribute is <code>TRUE</code> if the client has
+ * authenticated the target over the transport.
+ */
+ readonly attribute boolean target_authentication;
+
+ /**
+ * The confidentiality attribute is <code>TRUE</code> if the context is
+ * providing confidentiality protection.
+ */
+ readonly attribute boolean confidentiality;
+
+ /**
+ * The integrity attribute is <code>TRUE</code> if the context is providing
+ * integrity protection.
+ */
+ readonly attribute boolean integrity;
+
+ /**
+ * The target_embodied attribute is <code>TRUE</code> if the security service
+ * believes that the target is embodied to impersonate the client
+ * side principal.
+ */
+ readonly attribute boolean target_embodied;
+
+ /**
+ * The target_endorsed attribute is <code>TRUE</code> if the security service
+ * believes that the target is endorsed to act on behalf of the
+ * client side principal.
+ */
+ readonly attribute boolean target_endorsed;
+
+ /**
+ * The release operation indicates to the CSIv2 protocol, that if
+ * state is being retained for these credentials, they
+ * will be discarded with the pending next request that
+ * may have not yet gone out.
+ * <p>
+ * Any objects references that are binded to these
+ * credentials after you release them will become unusable.
+ *
+ * This operation is experimental.
+ */
+ void release();
+ };
+
+
+ //--------------------------------------------------------------------
+ // Security Invocation Policy
+ //
+ //--------------------------------------------------------------------
+
+ /**
+ * The ContextEstablishmentPolicy policy object directs the
+ * establishment of security contexts with a target.
+ * <p>
+ * The CredsDirective usage is the following:
+ * <dl>
+ * <dt>
+ * CD_Default
+ * <dd>
+ * This directive means to use the default set
+ * up by the thread, the ORB, the ORB configuration,
+ * available credentials, or other policies.
+ * <dt>
+ * CD_InvokeTarget
+ * <dd>
+ * This directive means to use the
+ * the specified OwnCredentials to create a
+ * secure association with the target
+ * before invocation. Do not endorse or embody the target.
+ * Credentials may be IT_Simple, IT_Quoting, or IT_Proxy.
+ * <dt>
+ * CD_EndorseTarget
+ * <dd>
+ * This directive means to use the
+ * the specified OwnCredentials to create a
+ * secure association with the target
+ * before invocation.
+ * The credentials must be
+ * IT_Simple, IT_Quoting, or IT_Proxy own credentials
+ * that supports endorsement.
+ * Note, a Initiator Credentials that is a IT_Proxy
+ * may have an endorsement statement that not only
+ * endorses this immediate client, but may very well
+ * apply to the next target.
+ * <dt>
+ * CD_EmbodyTarget
+ * <dd>
+ * If possible give the target the ability to
+ * impersonate the client, is performed using
+ * transports that can forward their credentials
+ * in the transport that give the ability to the
+ * target to work in their own behalf. Alternatively,
+ * the authenticator may be able to be passed on.
+ * IT_Simple credentials must have or have the
+ * ability to forward credentials. This is analogous
+ * to flipping the DELEGATE bit on GSS-Kerberos Forwardable
+ * credentials. IT_Quoting principals means
+ * that you can forward the transport credentials,
+ * authenticator plus the Quoting statement.
+ * IT_Proxy principals means that you can forward
+ * the transport credentials, authenticator,
+ * and associated proxy statements.
+ * </dl>
+ * <p>
+ * On using Own Credentials. The creds_ids name Own Credentials.
+ * Also, they restrict the invocation to use only certain credentials.
+ * If the cred_ids list is empty, then the own credentials for the
+ * invocation are selected from a default, which may be
+ * set on the thread or the ORB instance.
+ */
+ local interface ContextEstablishmentPolicy : CORBA::Policy {
+
+ readonly attribute CredsDirective creds_directive;
+ readonly attribute OwnCredentialsList creds_list;
+ readonly attribute FeatureDirective use_client_auth;
+ readonly attribute FeatureDirective use_target_auth;
+ readonly attribute FeatureDirective use_confidentiality;
+ readonly attribute FeatureDirective use_integrity;
+ };
+
+ /**
+ * Type to be passed to ContextEstablishmentPolicy PolicyFactory
+ * through an Any.
+ */
+ struct ContextEstablishmentPolicyArgument
+ {
+ CredsDirective creds_directive;
+ OwnCredentialsList creds_list;
+ FeatureDirective use_client_auth;
+ FeatureDirective use_target_auth;
+ FeatureDirective use_confidentiality;
+ FeatureDirective use_integrity;
+ };
+
+ /**
+ * The ContextEstablishmentPolicyType constant is
+ * holds value used to denote the ContextEstablishmentPolicy.
+ */
+ const CORBA::PolicyType ContextEstablishmentPolicyType = ADIRON_VMCID | 1001;
+
+
+ /**
+ * The ObjectCredentialsPolicy object is placed on the policy list
+ * of a POA to indicate the own credentials
+ * that govern the accepting contexts for objects underneath
+ * that POA. The credentials listed here, only if they have Accepting
+ * capability, are used to created security components in the
+ * IOR of the object's reference when created.
+ */
+ local interface ObjectCredentialsPolicy : CORBA::Policy {
+ readonly attribute OwnCredentialsList creds_list;
+ };
+
+ /**
+ * Type to be passed to ObjectCredentialsPolicy PolicyFactory
+ * through an Any.
+ */
+ typedef OwnCredentialsList ObjectCredentialsPolicyArgument;
+
+ /**
+ * The ObjectCredentialsPolicyType constant is
+ * holds value used to denote the ObjectCredentialsPolicy.
+ */
+ const CORBA::PolicyType ObjectCredentialsPolicyType = ADIRON_VMCID | 1002;
+
+
+ //--------------------------------------------------------------------
+ // Security Level 3 Credentials Acquisition Mechanism
+ //
+ //--------------------------------------------------------------------
+
+ /**
+ * Credentials are acquired by a Credentials Acquirer by some
+ * acquisition mechanism specified in the Credentials Curator.
+ * Acquisition methods are available on the curator. The
+ * specifics of arguments needed and the acquisition process
+ * are defined by the method itself.
+ */
+ typedef string AcquisitionMethod;
+ typedef sequence<AcquisitionMethod> AcquisitionMethodList;
+
+ /**
+ * An acquisition of credentials may quite possibly fail as well
+ * as be a multistep process. A status defines the current
+ * state of an acquisition.
+ */
+ typedef long AcquisitionStatus;
+ /** Acquisition has failed. */
+ const AcquisitionStatus AQST_Failed = -2;
+ /** Acquisition has expired. */
+ const AcquisitionStatus AQST_Expired = -1;
+ /** Acquisition is initialized. */
+ const AcquisitionStatus AQST_Initialized = 0;
+ /** Acquisition needs more processing. */
+ const AcquisitionStatus AQST_Continued = 1;
+ /** Acquisition has succeeded. */
+ const AcquisitionStatus AQST_Succeeded = 2;
+
+ /**
+ * The CredentialsAcquirer object is created by the Credentials
+ * Curator based on the selected method and initial acquisition
+ * arguments. When this acquisition is complete and successful,
+ * the created credentials can be retrieved using the get_credentials
+ * operation. Once get_credentials is called, this object is destroyed.
+ */
+ local interface CredentialsAcquirer {
+
+ /**
+ * This attribute contains the acquisition method
+ * identifier naming the method by which these credentials
+ * are being acquired.
+ */
+ readonly attribute AcquisitionMethod acquisition_method;
+
+ /**
+ * This attribute contains the current acquisition
+ * status of the acquisition process.
+ */
+ readonly attribute AcquisitionStatus current_status;
+
+ /**
+ * If the acquisition process is a multistep process through calls
+ * to this acquirer, then this attribute contains the current
+ * iteration.
+ */
+ readonly attribute unsigned long nth_iteration;
+
+ /**
+ * If the <code>current_status</code> attribute contains
+ * the <code>AQST_Continued</code> value,
+ * this operation returns, if necessary and supported
+ * by the acquisition method, any data that may direct the
+ * acquisition.
+ * <p>
+ * If this operation in invoked when the <code>current_status</code>
+ * attribute does not have the <code>AQST_Continued</code> value,
+ * a <code>BAD_INV_ORDER</code> exception will be raised.
+ */
+ any get_continuation_data();
+
+ /**
+ * This operation continues the acquisition. The argument
+ * data is dependent on the acquisition method.
+ */
+ AcquisitionStatus continue_acquisition(
+ in any acquisition_arguments
+ );
+
+ /**
+ * Once the <code>current_status</code> attribute has the
+ * <code>AQST_Succeeded</code> value, a call to this operation
+ * is used to retrieve the acquired <code>OwnCredentials</code>
+ * and, optionally, place the credentials on the curator's default own
+ * credentials list (for use with default ContextEstablishmentPolicy
+ * and ObjectCredentialsPolicy).
+ * <p>
+ * The <code>CredentialsAcquirer</code> object is destroyed after
+ * this call.
+ * Any operation called on a destroyed <code>CredentialsAcquirer</code>
+ * raises a <code>BAD_INV_ORDER</code> exception.
+ * <p>
+ * If this operation in invoked when the <code>current_status</code>
+ * attribute does not have the <code>AQST_Succeeded</code> value,
+ * a <code>BAD_INV_ORDER</code> exception will be raised.
+ *
+ * @param on_list <code>TRUE</code> if these credentials go on the
+ * default own credentials list of the
+ * <code>CredentialsCurator</code>.
+ */
+ OwnCredentials get_credentials(
+ in boolean on_list
+ );
+
+ /**
+ * This operation is used to destroy the
+ * <code>CredentialsAcquirer</code> object before
+ * <code>get_credentials</code> is called.
+ * Any operation called on a destroyed <code>CredentialsAcquirer</code>
+ * raises a <code>BAD_INV_ORDER</code> exception.
+ */
+ void destroy();
+ };
+
+ /**
+ * The <code>CredentialsCurator</code> object is a single object per an ORB
+ * instance's Security Service. It has the ability to create
+ * <code>CredentialsAcquirer</code>s and keeps a list of active default
+ * credentials. It is resolved by a call to
+ * <pre>
+ * ORB.resolve_initial_references("SecurityLevel3:CredentialsCurator");
+ * </pre>
+ * Or it may be retrieved from the <code>SecurityManager</code>'s
+ * <code>credentials_curator</code> attribute.
+ * <p>
+ * The following pseudo code describes the process of credentials
+ * acquisition using <code>CredentialsCurator</code>.
+ * <pre>
+ * // Resolve the Credentials Curator
+ * CredentialsCurator curator = ....
+ * resolve_initial_references("SecurityLevel3:CredentialsCurator");
+ *
+ * // Build up an acquisition argument (e.g., using SL3CSI::CSIArgBuilder)
+ * Any arg = ...
+ *
+ * // Acquire credentials and get a Credentials Acquirer
+ * CredentialsAcquirer acquirer =
+ * curator.acquire_credentials("SL3CSIAQArgs",arg);
+ *
+ * // Get credentials and destroy the Credentials Acquirer
+ * OwnCredentials own = acquirer.get_credentials(false);
+ * </pre>
+ */
+ local interface CredentialsCurator {
+
+ /**
+ * This attribute contains a list of
+ * acquisition methods that are supported. Method identifiers
+ * are defined in modules that signify their support.
+ *
+ * @see "SL3CSI"
+ * @see "SL3TLS"
+ * @see "SL3TCPIP"
+ * @see "SL3KRB5"
+ */
+ readonly attribute SecurityLevel3::AcquisitionMethodList
+ supported_methods;
+
+ /**
+ * This operation starts the process of credentials acquisition and
+ * create a <code>CredentialsAcquirer</code> for a particular
+ * acquisition method. It takes an initial set of arguments for
+ * the acquisition. The content of the arguments are based on the
+ * acquisiton method. Depending on the method, it is possible that
+ * the credentials may be immediately available from a call to
+ * <code>get_credentials</code> on the returned
+ * <code>CredentialsAcquirer</code>.
+ * <p>
+ * If the process of credentials acquisition is not completed upon
+ * the return of the <code>acquire_credentials</code> operation,
+ * the returned <code>CredentialsAcquirer</code> object shall have
+ * its <code>current_status</code> at <code>AQST_Continued</code>.
+ * In this case, the <code>get_continuation_data</code> and
+ * <code>continue_acquisition</code> operations shall be used to
+ * complete the credentials acquisition process.
+ * <p>
+ * If the process of credentials acquisition fails, it is up to the
+ * implementation to either throw a system exception or return a
+ * <code>CredentialsAcquirer</code> with the <code>AQST_Failed</code>
+ * status.
+ * <p>
+ * The <code>acquisition_arguments</code> parameter is a CORBA
+ * <code>any</code> that is constructed according to the acquisition
+ * method used. The <code>ArgumentFactory</code> from the
+ * <code>SL3AQArgs</code> module is a local object that helps
+ * immensely with the construction of this complex argument.
+ * Extensions of that object are defined in their own separate
+ * modules that pertain to the particular acquisition mechanism,
+ * such as the SL3CSI, SL3TLS, SL3TCPIP, SL3KRB5 modules.
+ *
+ * @param acquisition_method
+ * The identifier of the desired acquisition method.
+ * A CORBA <code>BAD_PARAM</code> exception will be raised
+ * if the named method is not supported.
+ * @param acquisition_arguments
+ * The argument of the desired acquisition method.
+ * This CORBA <code>any</code> type is constructed according
+ * to the particular acquisition method.
+ *
+ * @see "SL3AQArgs"
+ * @see "SL3CSI"
+ * @see "SL3TLS"
+ * @see "SL3TCPIP"
+ * @see "SL3KRB5"
+ */
+ CredentialsAcquirer acquire_credentials(
+ in SecurityLevel3::AcquisitionMethod acquisition_method,
+ in any acquisition_arguments
+ );
+
+ /**
+ * The Curator's Default Own Credentials list.
+ */
+ readonly attribute OwnCredentialsList default_creds_list;
+
+ /**
+ * The Curator's ids of the credentials on the default list.
+ */
+ readonly attribute CredentialsIdList default_creds_ids;
+
+ /**
+ * This operation retrieves Own Credentials by identifier.
+ * It is not required that the identifier name a credentials
+ * on the default_credentials_list. The Curator keeps track
+ * of all OwnCredentials it creates, until they are explicitly
+ * released.
+ */
+ OwnCredentials get_own_credentials(
+ in CredentialsId credentials_id
+ );
+
+ /**
+ * This operation releases credentials from the default_creds_list,
+ * if there, and also disables the credentials from further use,
+ * provided that all their pending work is done.
+ */
+ void release_own_credentials (
+ in CredentialsId credentials_id
+ );
+
+ };
+
+ //--------------------------------------------------------------------
+ // Security Service ORB Objects
+ // Retrieved from the ORB by "resolve_initial_references".
+ //
+ //--------------------------------------------------------------------
+
+ /**
+ * The <code>SecurityManager</code> object represents the Security Level 3
+ * Security Service. There is one object of this type per ORB
+ * instance. It is resolved by a call to
+ * <pre>
+ * ORB.resolve_initial_references("SecurityLevel3:SecurityManager");
+ * </pre>
+ */
+ local interface SecurityManager {
+
+ /**
+ * The credentials_curator attribute contains the reference
+ * to the SecurityLevel3 Credentials Curator. There is only
+ * one instance per ORB.
+ */
+ readonly attribute CredentialsCurator credentials_curator;
+
+ /**
+ * The get_target_credentials operation retrieves the
+ * TargetCredentials that represents a CSIv2 security association
+ * with a Target. This operation causes communication with
+ * the target in order to establish a security context.
+ */
+ TargetCredentials get_target_credentials(
+ in Object the_object
+ );
+
+ /**
+ * The create_context_estab_policy operation is a policy factory
+ * operation that creates the Security Level 3
+ * ContextEstablishmentPolicy object. This policy is placed on
+ * the policy override lists of object references to direct
+ * the security characteristics when communicating through
+ * that object reference.
+ * <p>
+ * If this policy is not put on an object reference, and the
+ * <a href="TransportSecurity.ObjectCredentialsPolicy.html">
+ * TransportSecurity::ObjectCredentialsPolicy</a>
+ * is also not on the object references policy list,
+ * then the default credentials lists from the
+ * <a href="SecurityLevel3.CredentialsCurator.html">
+ * SecurityLevel3::CredentialsCurator</a>
+ * and
+ * <a href="TransportSecurity.CredentialsCurator.html">
+ * TransportSecurity::CredentialsCurator</a>
+ * are used.
+ */
+ ContextEstablishmentPolicy create_context_estab_policy(
+ in CredsDirective creds_directive,
+ in OwnCredentialsList creds_list,
+ in FeatureDirective use_client_auth,
+ in FeatureDirective use_target_auth,
+ in FeatureDirective use_confidentiality,
+ in FeatureDirective use_integrity
+ );
+
+ /**
+ * The create_object_creds_policy is a policy factory operation
+ * that creates the ObjectCredentialsPolicy object. This policy
+ * is solely for use with policies place on POAs with "POA.create_POA".
+ * It restricts the POAs use of credentials. If this policy is
+ * not put on a POA, and the
+ * <a href="TransportSecurity.ObjectCredentialsPolicy.html">
+ * TransportSecurity::ObjectCredentialsPolicy</a>
+ * is also not on the POA policy list, then the default
+ * credentials lists from the
+ * <a href="SecurityLevel3.CredentialsCurator.html">
+ * SecurityLevel3::CredentialsCurator</a>
+ * and
+ * <a href="TransportSecurity.CredentialsCurator.html">
+ * TransportSecurity::CredentialsCurator</a>
+ * are used.
+ */
+ ObjectCredentialsPolicy create_object_creds_policy(
+ in OwnCredentialsList creds_list
+ );
+ };
+
+ /**
+ * The <code>SecurityCurrent</code> object references thread specific
+ * data pertaining to the security service. It is used to retrieve
+ * the client's credentials during an invocation on the server side.
+ * <p>
+ * There is only one instance of this object per ORB instance.
+ * It is resolved by a call to
+ * <pre>
+ * ORB.resolve_initial_references("SecurityLevel3:SecurityCurrent");
+ * </pre>
+ */
+ local interface SecurityCurrent {
+
+ /**
+ * From inside the execution of a target object implementation,
+ * this attribute contains the representation of the remote client's
+ * credentials. This attribute is null if the client is not CSIv2
+ * based, or the client is from a collocated call.
+ * <p>
+ * The value of this attribute, if not null, represents the
+ * security context with a remote CSIv2 client.
+ * If the <code>request_is_local<code> attribute is <code>FALSE</code>,
+ * the current thread of execution is directly servicing a remote
+ * request for the target object within the target's implemenation.
+ * If the <code>request_is_local</code> attribute is <code>TRUE</code>,
+ * the current thread of execution is servicing an ORB mediated call
+ * on a collocated object.
+ * <p>
+ * If the client is not CSIv2 based, there are no CSIv2 Client
+ * Credentials, and this attribute is null. In this case,
+ * the user should try the
+ * <a href="TransportSecurity.SecurityCurrent.html>
+ * TransportSecurity::SecurityCurrent</a>,
+ * as the request may have come over a secure or
+ * insecure transport, such as IIOP or TLS, without a CSIv2
+ * Service Context.
+ */
+ readonly attribute ClientCredentials client_credentials;
+
+ /**
+ * If this attribute is <code>TRUE</code>, the client_credentials attribute
+ * returns the credentials of the remote client no matter how
+ * deep the collocated call stack, unless of course, this request
+ * is not CSIv2 based, in which case it returns null.
+ * This attribute is <code>TRUE</code> if the current thread of
+ * execution is servicing a request on a collocated object.
+ * This attribute is <code>FALSE</code> if the current thread of
+ * execution is immediately servicing a remote request.
+ * <p>
+ * If this attribute is <code>TRUE</code>, there may or may not be
+ * a remote client. If there is a remote client and the client is
+ * CSIv2 based, the <code>client_credentials</code> attribute will
+ * return the credentials of the remote client.
+ * <p>
+ * If this attribute is <code>FALSE</code>, there will always be a
+ * remote client. In such case, the <code>client_credentials</code>
+ * attribute will return the credentials of the remote client,
+ * unless the client is not CSIv2 based.
+ */
+ readonly attribute boolean request_is_local;
+ };
+
+};
+#endif
diff --git a/TAO/orbsvcs/orbsvcs/SecurityReplaceable.idl b/TAO/orbsvcs/orbsvcs/SecurityReplaceable.idl
new file mode 100644
index 00000000000..c7beeefd060
--- /dev/null
+++ b/TAO/orbsvcs/orbsvcs/SecurityReplaceable.idl
@@ -0,0 +1,237 @@
+// -*- IDL -*-
+//
+// $Id$
+
+#ifndef _SECURITY_REPLACEABLE_IDL_
+#define _SECURITY_REPLACEABLE_IDL_
+
+#include "orbsvcs/SecurityLevel2.idl"
+#include "tao/IOP.pidl"
+
+#pragma prefix "omg.org"
+
+module SecurityReplaceable {
+
+# pragma version SecurityReplaceable 1.8
+
+ local interface SecurityContext;
+ local interface ClientSecurityContext;
+ local interface ServerSecurityContext;
+
+ local interface Vault {
+
+# pragma version Vault 1.8
+
+ Security::AuthenticationMethodList
+ get_supported_authen_methods(
+ in Security::MechanismType mechanism
+ );
+
+ readonly attribute Security::OIDList supported_mech_oids;
+
+ Security::AuthenticationStatus acquire_credentials (
+ in Security::AuthenticationMethod method,
+ in Security::MechanismType mechanism,
+ in Security::SecurityName security_name,
+ in any auth_data,
+ in Security::AttributeList privileges,
+ out SecurityLevel2::Credentials creds,
+ out any continuation_data,
+ out any auth_specific_data
+ );
+
+ Security::AuthenticationStatus continue_credentials_acquisition (
+ in any response_data,
+ in SecurityLevel2::Credentials creds,
+ out any continuation_data,
+ out any auth_specific_data
+ );
+
+ IOP::TaggedComponentList create_ior_components(
+ in SecurityLevel2::Credentials creds_list
+ );
+
+
+ Security::AssociationStatus init_security_context (
+ in SecurityLevel2::Credentials creds,
+ in Security::SecurityName target_security_name,
+ in Object target,
+ in Security::DelegationMode delegation_mode,
+ in Security::OptionsDirectionPairList association_options,
+ in Security::MechanismType mechanism,
+ in Security::Opaque comp_data, //from IOR
+ in Security::ChannelBindings chan_binding,
+ out Security::OpaqueBuffer security_token,
+ out ClientSecurityContext security_context
+ );
+
+ Security::AssociationStatus accept_security_context (
+ in SecurityLevel2::CredentialsList creds_list,
+ in Security::ChannelBindings chan_bindings,
+ in Security::Opaque in_token,
+ out Security::Opaque out_token
+ );
+
+ Security::MechandOptionsList get_supported_mechs ();
+
+ };
+
+
+ local interface SecurityContext {
+
+# pragma version SecurityContext 1.8
+
+ readonly attribute Security::SecurityContextType
+ context_type;
+
+ readonly attribute Security::SecurityContextState
+ context_state;
+
+ readonly attribute Security::MechanismType
+ mechanism;
+
+ readonly attribute Security::ChannelBindings chan_binding;
+
+ readonly attribute SecurityLevel2::ReceivedCredentials
+ received_credentials;
+
+ Security::AssociationStatus continue_security_context (
+ in Security::OpaqueBuffer in_token,
+ out Security::OpaqueBuffer out_token
+ );
+
+ void protect_message (
+ in Security::OpaqueBuffer message,
+ in Security::QOP qop,
+ out Security::OpaqueBuffer text_buffer,
+ out Security::OpaqueBuffer token
+ );
+
+ boolean reclaim_message (
+ in Security::Opaque text_buffer,
+ in Security::Opaque token,
+ out Security::QOP qop,
+ out Security::Opaque message
+ );
+
+ boolean is_valid (
+ out Security::UtcT expiry_time
+ );
+
+ boolean discard_security_context (
+ in Security::Opaque discard_data,
+ out Security::OpaqueBuffer out_token
+ );
+
+ boolean process_discard_token (
+ in Security::OpaqueBuffer discard_token
+ );
+
+ };
+
+ local interface ClientSecurityContext : SecurityContext {
+
+# pragma version ClientSecurityContext 1.8
+
+ readonly attribute Security::AssociationOptions
+ association_options_used;
+
+ readonly attribute Security::DelegationMode
+ delegation_mode;
+
+ readonly attribute Security::Opaque comp_data;
+
+ readonly attribute SecurityLevel2::Credentials
+ client_credentials;
+
+ readonly attribute Security::AssociationOptions
+ server_options_supported;
+
+ readonly attribute Security::AssociationOptions
+ server_options_required;
+
+ readonly attribute Security::Opaque server_security_name;
+
+ };
+
+ local interface ServerSecurityContext : SecurityContext {
+
+# pragma version ServerSecurityContext 1.8
+
+ readonly attribute Security::AssociationOptions
+ association_options_used;
+
+ readonly attribute Security::DelegationMode
+ delegation_mode;
+
+ readonly attribute SecurityLevel2::Credentials
+ server_credentials;
+
+ readonly attribute Security::AssociationOptions
+ server_options_supported;
+
+ readonly attribute Security::AssociationOptions
+ server_options_required;
+
+ readonly attribute Security::Opaque server_security_name;
+
+ };
+
+ interface RequiredRights {
+
+ void get_required_rights(
+ in CORBA::Identifier operation_name,
+ in CORBA::RepositoryId interface_name,
+ out Security::RightsList rights,
+ out Security::RightsCombinator rights_combinator
+ );
+
+ void set_required_rights(
+ in CORBA::Identifier operation_name,
+ in CORBA::RepositoryId interface_name,
+ in Security::RightsList rights,
+ in Security::RightsCombinator rights_combinator
+ );
+
+ };
+
+ local interface AuditChannel {
+
+ void audit_write (
+ in Security::AuditEventType event_type,
+ in SecurityLevel2::CredentialsList creds_list,
+ in Security::UtcT time,
+ in Security::SelectorValueList descriptors,
+ in Security::Opaque event_specific_data
+ );
+
+ readonly attribute Security::AuditChannelId audit_channel_id;
+
+ };
+
+ local interface AuditDecision {
+
+ boolean audit_needed (
+ in Security::AuditEventType event_type,
+ in Security::SelectorValueList value_list
+ );
+
+ readonly attribute AuditChannel audit_channel;
+
+ };
+
+ local interface AccessDecision {
+
+ boolean access_allowed (
+ in SecurityLevel2::CredentialsList cred_list,
+ in CORBA::Identifier operation_name,
+ in CORBA::Identifier target_interface_name
+ );
+
+ };
+
+};
+
+#pragma prefix ""
+
+#endif /* _SECURITY_REPLACEABLE_IDL_ */
diff --git a/TAO/orbsvcs/orbsvcs/Shutdown_Utilities.cpp b/TAO/orbsvcs/orbsvcs/Shutdown_Utilities.cpp
new file mode 100644
index 00000000000..e243dfa2530
--- /dev/null
+++ b/TAO/orbsvcs/orbsvcs/Shutdown_Utilities.cpp
@@ -0,0 +1,97 @@
+// $Id$
+
+#include "orbsvcs/Shutdown_Utilities.h"
+#include "ace/Log_Msg.h"
+
+ACE_RCSID(orbsvcs,
+ Shutdown_Utilities,
+ "$Id$")
+
+TAO_BEGIN_VERSIONED_NAMESPACE_DECL
+
+Service_Shutdown::Service_Shutdown (Shutdown_Functor& sf)
+ : functor_(sf)
+{
+ ACE_Sig_Set std_signals;
+#if !defined(ACE_LACKS_UNIX_SIGNALS)
+ std_signals.sig_add (SIGTERM);
+ std_signals.sig_add (SIGINT);
+#elif defined(ACE_WIN32)
+ std_signals.sig_add (SIGINT);
+#endif
+ this->set_signals (std_signals);
+}
+
+Service_Shutdown::Service_Shutdown (Shutdown_Functor& sf, ACE_Sig_Set& which_signals)
+ : functor_(sf)
+{
+ this->set_signals (which_signals);
+}
+
+// It would be nice if we could rely on a portable #define that
+// declared the largest signal held in sigset_t, but we can't.
+// So, for now, we'll make a possibly bold assumption that sigset_t
+// will be at least four bytes. If somebody wants to use a signal
+// greater than that, then they'll have to redefine ACE_NSIG.
+//
+// It would be even nicer if the register_handler() method just took
+// an ACE_Sig_Set as an argument and handled all this stuff itself.
+//
+void
+Service_Shutdown::set_signals (ACE_Sig_Set& which_signals)
+{
+ // iterate over all the signals in which_signals and register them...
+ bool did_register = false;
+ for (int i = 1; i < ACE_NSIG; ++i)
+ {
+ if (which_signals.is_member (i))
+ {
+ if (this->shutdown_.register_handler (i, this) == -1)
+ {
+#if defined(__TANDEM)
+// Tandem NSK platform has no signal 10 so do not emit a warning for it
+ if (i != 10)
+#endif
+ {
+ ACE_DEBUG ((LM_WARNING,
+ "WARNING: Failed to register signal handler "
+ "for signal %d: %p\n",
+ i, ACE_TEXT ("register_handler")));
+ }
+ }
+ else
+ {
+ // Store that we have registered for this signal
+ // we have to unregister later for just these signals
+ this->registered_signals_.sig_add (i);
+ did_register = true;
+ }
+ }
+ }
+ if (! did_register)
+ {
+ ACE_DEBUG ((LM_WARNING,
+ "WARNING: Service_Shutdown did not register any signals.\n"));
+ }
+}
+
+Service_Shutdown::~Service_Shutdown ()
+{
+ for (int i = 1; i < ACE_NSIG; ++i)
+ {
+ if (this->registered_signals_.is_member (i))
+ {
+ this->shutdown_.remove_handler(i);
+ }
+ }
+}
+
+int
+Service_Shutdown::handle_signal (int signum,
+ siginfo_t*, ucontext_t*)
+{
+ this->functor_(signum);
+ return 0;
+}
+
+TAO_END_VERSIONED_NAMESPACE_DECL
diff --git a/TAO/orbsvcs/orbsvcs/Shutdown_Utilities.h b/TAO/orbsvcs/orbsvcs/Shutdown_Utilities.h
new file mode 100644
index 00000000000..2663a13d407
--- /dev/null
+++ b/TAO/orbsvcs/orbsvcs/Shutdown_Utilities.h
@@ -0,0 +1,71 @@
+// -*- C++ -*-
+
+#ifndef _SHUTDOWN_UTILS_H
+#define _SHUTDOWN_UTILS_H
+#include /**/ "ace/pre.h"
+
+// $Id$
+
+#include "orbsvcs/svc_utils_export.h"
+
+#include "tao/Versioned_Namespace.h"
+
+#include "ace/Event_Handler.h"
+#include "ace/Signal.h"
+#include "ace/Sig_Handler.h"
+
+
+TAO_BEGIN_VERSIONED_NAMESPACE_DECL
+
+/**
+ * \brief Abstract definition for a Functor that shuts down a particular service.
+ *
+ * When subclassing, the developer should provide a constructor or
+ * other initialization method that somehow couples an instance of the
+ * functor to the service implementation. She should also provide an
+ * implementation of operator()(int which_signal) that actually performs
+ * the shutdown.
+ */
+class TAO_Svc_Utils_Export Shutdown_Functor
+{
+public:
+ virtual void operator() (int which_signal) = 0;
+
+protected:
+ Shutdown_Functor (void) {}
+ virtual ~Shutdown_Functor (void) {}
+};
+
+/**
+ * \brief Class that permits graceful shutdown of a service.
+ *
+ * Services require graceful shutdown. Sending a SIGTERM (which is
+ * what Ctrl-C does on Unix) should trigger a graceful shutdown, not
+ * simply a graceful termination of the process.
+ *
+ * This class can be used to capture signals and gracefully shut down
+ * the service.
+ */
+class TAO_Svc_Utils_Export Service_Shutdown : public ACE_Event_Handler
+{
+public:
+ Service_Shutdown (Shutdown_Functor& sf);
+ Service_Shutdown (Shutdown_Functor& sf, ACE_Sig_Set& which_signals);
+ ~Service_Shutdown ();
+
+ void set_signals (ACE_Sig_Set& which_signals);
+
+ virtual int handle_signal (int which_sig,
+ siginfo_t* siginfo,
+ ucontext_t* context);
+
+protected:
+ Shutdown_Functor& functor_;
+ ACE_Sig_Handler shutdown_;
+ ACE_Sig_Set registered_signals_;
+};
+
+TAO_END_VERSIONED_NAMESPACE_DECL
+
+#include /**/ "ace/post.h"
+#endif
diff --git a/TAO/orbsvcs/orbsvcs/Svc_Utils.mpc b/TAO/orbsvcs/orbsvcs/Svc_Utils.mpc
new file mode 100644
index 00000000000..6d3f2ea5626
--- /dev/null
+++ b/TAO/orbsvcs/orbsvcs/Svc_Utils.mpc
@@ -0,0 +1,34 @@
+// -*- MPC -*-
+// $Id$
+
+project(Svc_Utils) : orbsvcslib, core, portableserver, tao_versioning_idl_defaults {
+ sharedname = TAO_Svc_Utils
+ idlflags += -Wb,export_macro=TAO_Svc_Utils_Export -Wb,export_include=orbsvcs/svc_utils_export.h
+ dynamicflags = TAO_SVC_UTILS_BUILD_DLL
+
+ IDL_Files {
+ TimeBase.idl
+ RtecBase.idl
+ }
+
+ Source_Files {
+ TimeBaseC.cpp
+ TimeBaseS.cpp
+ RtecBaseC.cpp
+ RtecBaseS.cpp
+ Shutdown_Utilities.cpp
+ Time_Utilities.cpp
+ IOR_Multicast.cpp
+ }
+
+ Header_Files {
+ svc_utils_export.h
+ }
+
+ Template_Files {
+ }
+
+ Pkgconfig_Files {
+ TAO_Svc_Utils.pc.in
+ }
+}
diff --git a/TAO/orbsvcs/orbsvcs/Svc_Utils.rc b/TAO/orbsvcs/orbsvcs/Svc_Utils.rc
new file mode 100644
index 00000000000..b927f5f9703
--- /dev/null
+++ b/TAO/orbsvcs/orbsvcs/Svc_Utils.rc
@@ -0,0 +1,30 @@
+#include "..\..\tao\Version.h"
+
+1 VERSIONINFO
+ FILEVERSION TAO_MAJOR_VERSION,TAO_MINOR_VERSION,TAO_BETA_VERSION,0
+ PRODUCTVERSION TAO_MAJOR_VERSION,TAO_MINOR_VERSION,TAO_BETA_VERSION,0
+ FILEFLAGSMASK 0x3fL
+ FILEFLAGS 0x0L
+ FILEOS 0x4L
+ FILETYPE 0x1L
+ FILESUBTYPE 0x0L
+BEGIN
+ BLOCK "StringFileInfo"
+ BEGIN
+ BLOCK "040904B0"
+ BEGIN
+ VALUE "FileDescription", "Svc_Utils\0"
+ VALUE "FileVersion", TAO_VERSION "\0"
+ VALUE "InternalName", "TAO_Svc_UtilsDLL\0"
+ VALUE "LegalCopyright", "\0"
+ VALUE "LegalTrademarks", "\0"
+ VALUE "OriginalFilename", "TAO_Svc_Utils.DLL\0"
+ VALUE "ProductName", "ORBSVCS\0"
+ VALUE "ProductVersion", TAO_VERSION "\0"
+ END
+ END
+ BLOCK "VarFileInfo"
+ BEGIN
+ VALUE "Translation", 0x409, 1200
+ END
+END
diff --git a/TAO/orbsvcs/orbsvcs/TAO_CosConcurrency.pc.in b/TAO/orbsvcs/orbsvcs/TAO_CosConcurrency.pc.in
new file mode 100644
index 00000000000..d3f639711d0
--- /dev/null
+++ b/TAO/orbsvcs/orbsvcs/TAO_CosConcurrency.pc.in
@@ -0,0 +1,11 @@
+prefix=@prefix@
+exec_prefix=@exec_prefix@
+libdir=@libdir@
+includedir=@includedir@
+
+Name: TAO_CosConcurrency
+Description: TAO CosConcurrency Stub Library
+Requires: TAO_AnyTypeCode, TAO
+Version: @VERSION@
+Libs: -L${libdir} -lTAO_CosConcurrency
+Cflags: -I${includedir}
diff --git a/TAO/orbsvcs/orbsvcs/TAO_CosConcurrency_Serv.pc.in b/TAO/orbsvcs/orbsvcs/TAO_CosConcurrency_Serv.pc.in
new file mode 100644
index 00000000000..60156a705ca
--- /dev/null
+++ b/TAO/orbsvcs/orbsvcs/TAO_CosConcurrency_Serv.pc.in
@@ -0,0 +1,11 @@
+prefix=@prefix@
+exec_prefix=@exec_prefix@
+libdir=@libdir@
+includedir=@includedir@
+
+Name: TAO_CosConcurrency_Serv
+Description: TAO CosConcurrency Service Library
+Requires: TAO_CosConcurrency_Skel
+Version: @VERSION@
+Libs: -L${libdir} -lTAO_CosConcurrency_Serv
+Cflags: -I${includedir}
diff --git a/TAO/orbsvcs/orbsvcs/TAO_CosConcurrency_Skel.pc.in b/TAO/orbsvcs/orbsvcs/TAO_CosConcurrency_Skel.pc.in
new file mode 100644
index 00000000000..6a7095e3c5a
--- /dev/null
+++ b/TAO/orbsvcs/orbsvcs/TAO_CosConcurrency_Skel.pc.in
@@ -0,0 +1,11 @@
+prefix=@prefix@
+exec_prefix=@exec_prefix@
+libdir=@libdir@
+includedir=@includedir@
+
+Name: TAO_CosConcurrency_Skel
+Description: TAO CosConcurrency Skeleton Library
+Requires: TAO_CosConcurrency, TAO_PortableServer
+Version: @VERSION@
+Libs: -L${libdir} -lTAO_CosConcurrency_Skel
+Cflags: -I${includedir}
diff --git a/TAO/orbsvcs/orbsvcs/TAO_CosEvent.pc.in b/TAO/orbsvcs/orbsvcs/TAO_CosEvent.pc.in
new file mode 100644
index 00000000000..98cfefc9dbe
--- /dev/null
+++ b/TAO/orbsvcs/orbsvcs/TAO_CosEvent.pc.in
@@ -0,0 +1,11 @@
+prefix=@prefix@
+exec_prefix=@exec_prefix@
+libdir=@libdir@
+includedir=@includedir@
+
+Name: TAO_CosEvent
+Description: TAO CosEvent Stub Library
+Requires: TAO_AnyTypeCode, TAO
+Version: @VERSION@
+Libs: -L${libdir} -lTAO_CosEvent
+Cflags: -I${includedir}
diff --git a/TAO/orbsvcs/orbsvcs/TAO_CosEvent_Serv.pc.in b/TAO/orbsvcs/orbsvcs/TAO_CosEvent_Serv.pc.in
new file mode 100644
index 00000000000..5f96ef5e7d8
--- /dev/null
+++ b/TAO/orbsvcs/orbsvcs/TAO_CosEvent_Serv.pc.in
@@ -0,0 +1,11 @@
+prefix=@prefix@
+exec_prefix=@exec_prefix@
+libdir=@libdir@
+includedir=@includedir@
+
+Name: TAO_CosEvent_Serv
+Description: TAO CosEvent Service Library
+Requires: TAO_CosEvent_Skel, TAO_DynamicInterface, TAO_IFR_Client, TAO_Messaging, TAO_CosNaming, TAO_Svc_Utils
+Version: @VERSION@
+Libs: -L${libdir} -lTAO_CosEvent_Serv
+Cflags: -I${includedir}
diff --git a/TAO/orbsvcs/orbsvcs/TAO_CosEvent_Skel.pc.in b/TAO/orbsvcs/orbsvcs/TAO_CosEvent_Skel.pc.in
new file mode 100644
index 00000000000..b48e61678d6
--- /dev/null
+++ b/TAO/orbsvcs/orbsvcs/TAO_CosEvent_Skel.pc.in
@@ -0,0 +1,11 @@
+prefix=@prefix@
+exec_prefix=@exec_prefix@
+libdir=@libdir@
+includedir=@includedir@
+
+Name: TAO_CosEvent_Skel
+Description: TAO CosEvent Skeleton Library
+Requires: TAO_CosEvent, TAO_PortableServer
+Version: @VERSION@
+Libs: -L${libdir} -lTAO_CosEvent_Skel
+Cflags: -I${includedir}
diff --git a/TAO/orbsvcs/orbsvcs/TAO_CosLifeCycle.pc.in b/TAO/orbsvcs/orbsvcs/TAO_CosLifeCycle.pc.in
new file mode 100644
index 00000000000..9ff630be427
--- /dev/null
+++ b/TAO/orbsvcs/orbsvcs/TAO_CosLifeCycle.pc.in
@@ -0,0 +1,11 @@
+prefix=@prefix@
+exec_prefix=@exec_prefix@
+libdir=@libdir@
+includedir=@includedir@
+
+Name: TAO_CosLifeCycle
+Description: TAO CosLifeCycle Library
+Requires: TAO_CosNaming, TAO_PortableServer, TAO
+Version: @VERSION@
+Libs: -L${libdir} -lTAO_CosLifeCycle
+Cflags: -I${includedir}
diff --git a/TAO/orbsvcs/orbsvcs/TAO_CosLoadBalancing.pc.in b/TAO/orbsvcs/orbsvcs/TAO_CosLoadBalancing.pc.in
new file mode 100644
index 00000000000..ebb54ad54ee
--- /dev/null
+++ b/TAO/orbsvcs/orbsvcs/TAO_CosLoadBalancing.pc.in
@@ -0,0 +1,11 @@
+prefix=@prefix@
+exec_prefix=@exec_prefix@
+libdir=@libdir@
+includedir=@includedir@
+
+Name: TAO_CosLoadBalancing
+Description: TAO CosLoadBalancing Library
+Requires: TAO_CosNaming, TAO_IORManip, TAO_PortableGroup, TAO
+Version: @VERSION@
+Libs: -L${libdir} -lTAO_CosLoadBalancing
+Cflags: -I${includedir}
diff --git a/TAO/orbsvcs/orbsvcs/TAO_CosNaming.pc.in b/TAO/orbsvcs/orbsvcs/TAO_CosNaming.pc.in
new file mode 100644
index 00000000000..19899254747
--- /dev/null
+++ b/TAO/orbsvcs/orbsvcs/TAO_CosNaming.pc.in
@@ -0,0 +1,11 @@
+prefix=@prefix@
+exec_prefix=@exec_prefix@
+libdir=@libdir@
+includedir=@includedir@
+
+Name: TAO_CosNaming
+Description: TAO CosNaming Stub Library
+Requires: TAO_AnyTypeCode, TAO
+Version: @VERSION@
+Libs: -L${libdir} -lTAO_CosNaming
+Cflags: -I${includedir}
diff --git a/TAO/orbsvcs/orbsvcs/TAO_CosNaming_Serv.pc.in b/TAO/orbsvcs/orbsvcs/TAO_CosNaming_Serv.pc.in
new file mode 100644
index 00000000000..b67b573478c
--- /dev/null
+++ b/TAO/orbsvcs/orbsvcs/TAO_CosNaming_Serv.pc.in
@@ -0,0 +1,11 @@
+prefix=@prefix@
+exec_prefix=@exec_prefix@
+libdir=@libdir@
+includedir=@includedir@
+
+Name: TAO_CosNaming_Serv
+Description: TAO CosNaming Service Library
+Requires: TAO_CosNaming_Skel, TAO_Messaging, TAO_Svc_Utils, TAO_IORTable
+Version: @VERSION@
+Libs: -L${libdir} -lTAO_CosNaming_Serv
+Cflags: -I${includedir}
diff --git a/TAO/orbsvcs/orbsvcs/TAO_CosNaming_Skel.pc.in b/TAO/orbsvcs/orbsvcs/TAO_CosNaming_Skel.pc.in
new file mode 100644
index 00000000000..ba4fd0022c8
--- /dev/null
+++ b/TAO/orbsvcs/orbsvcs/TAO_CosNaming_Skel.pc.in
@@ -0,0 +1,11 @@
+prefix=@prefix@
+exec_prefix=@exec_prefix@
+libdir=@libdir@
+includedir=@includedir@
+
+Name: TAO_CosNaming_Skel
+Description: TAO CosNaming Skeleton Library
+Requires: TAO_CosNaming, TAO_PortableServer
+Version: @VERSION@
+Libs: -L${libdir} -lTAO_CosNaming_Skel
+Cflags: -I${includedir}
diff --git a/TAO/orbsvcs/orbsvcs/TAO_CosNotification.pc.in b/TAO/orbsvcs/orbsvcs/TAO_CosNotification.pc.in
new file mode 100644
index 00000000000..5fec272c552
--- /dev/null
+++ b/TAO/orbsvcs/orbsvcs/TAO_CosNotification.pc.in
@@ -0,0 +1,11 @@
+prefix=@prefix@
+exec_prefix=@exec_prefix@
+libdir=@libdir@
+includedir=@includedir@
+
+Name: TAO_CosNotification
+Description: TAO CosNotification Stub Library
+Requires: TAO_CosEvent, TAO
+Version: @VERSION@
+Libs: -L${libdir} -lTAO_CosNotification
+Cflags: -I${includedir}
diff --git a/TAO/orbsvcs/orbsvcs/TAO_CosNotification_Serv.pc.in b/TAO/orbsvcs/orbsvcs/TAO_CosNotification_Serv.pc.in
new file mode 100644
index 00000000000..79df7dfdc22
--- /dev/null
+++ b/TAO/orbsvcs/orbsvcs/TAO_CosNotification_Serv.pc.in
@@ -0,0 +1,11 @@
+prefix=@prefix@
+exec_prefix=@exec_prefix@
+libdir=@libdir@
+includedir=@includedir@
+
+Name: TAO_CosNotification_Serv
+Description: TAO CosNotification Service Library
+Requires: TAO_CosNotification_Skel, TAO_Svc_Utils, TAO_DynamicAny, TAO_ETCL
+Version: @VERSION@
+Libs: -L${libdir} -lTAO_CosNotification_Serv
+Cflags: -I${includedir}
diff --git a/TAO/orbsvcs/orbsvcs/TAO_CosNotification_Skel.pc.in b/TAO/orbsvcs/orbsvcs/TAO_CosNotification_Skel.pc.in
new file mode 100644
index 00000000000..292003b1293
--- /dev/null
+++ b/TAO/orbsvcs/orbsvcs/TAO_CosNotification_Skel.pc.in
@@ -0,0 +1,11 @@
+prefix=@prefix@
+exec_prefix=@exec_prefix@
+libdir=@libdir@
+includedir=@includedir@
+
+Name: TAO_CosNotification_Skel
+Description: TAO CosNotification Skeleton Library
+Requires: TAO_CosNotification, TAO_CosEvent_Skel, TAO_PortableServer
+Version: @VERSION@
+Libs: -L${libdir} -lTAO_CosNotification_Skel
+Cflags: -I${includedir}
diff --git a/TAO/orbsvcs/orbsvcs/TAO_CosProperty.pc.in b/TAO/orbsvcs/orbsvcs/TAO_CosProperty.pc.in
new file mode 100644
index 00000000000..67038f6d9e6
--- /dev/null
+++ b/TAO/orbsvcs/orbsvcs/TAO_CosProperty.pc.in
@@ -0,0 +1,11 @@
+prefix=@prefix@
+exec_prefix=@exec_prefix@
+libdir=@libdir@
+includedir=@includedir@
+
+Name: TAO_CosProperty
+Description: TAO CosProperty Stub Library
+Requires: TAO_AnyTypeCode, TAO
+Version: @VERSION@
+Libs: -L${libdir} -lTAO_CosProperty
+Cflags: -I${includedir}
diff --git a/TAO/orbsvcs/orbsvcs/TAO_CosProperty_Serv.pc.in b/TAO/orbsvcs/orbsvcs/TAO_CosProperty_Serv.pc.in
new file mode 100644
index 00000000000..ae944d6d818
--- /dev/null
+++ b/TAO/orbsvcs/orbsvcs/TAO_CosProperty_Serv.pc.in
@@ -0,0 +1,11 @@
+prefix=@prefix@
+exec_prefix=@exec_prefix@
+libdir=@libdir@
+includedir=@includedir@
+
+Name: TAO_CosProperty_Serv
+Description: TAO CosProperty Service Library
+Requires: TAO_PortableServer_Skel
+Version: @VERSION@
+Libs: -L${libdir} -lTAO_CosProperty_Serv
+Cflags: -I${includedir}
diff --git a/TAO/orbsvcs/orbsvcs/TAO_CosProperty_Skel.pc.in b/TAO/orbsvcs/orbsvcs/TAO_CosProperty_Skel.pc.in
new file mode 100644
index 00000000000..34cfa1f495f
--- /dev/null
+++ b/TAO/orbsvcs/orbsvcs/TAO_CosProperty_Skel.pc.in
@@ -0,0 +1,11 @@
+prefix=@prefix@
+exec_prefix=@exec_prefix@
+libdir=@libdir@
+includedir=@includedir@
+
+Name: TAO_CosProperty_Skel
+Description: TAO CosProperty Skeleton Library
+Requires: TAO_CosProperty, TAO_PortableServer
+Version: @VERSION@
+Libs: -L${libdir} -lTAO_CosProperty_Skel
+Cflags: -I${includedir}
diff --git a/TAO/orbsvcs/orbsvcs/TAO_CosTime.pc.in b/TAO/orbsvcs/orbsvcs/TAO_CosTime.pc.in
new file mode 100644
index 00000000000..2372d76fd70
--- /dev/null
+++ b/TAO/orbsvcs/orbsvcs/TAO_CosTime.pc.in
@@ -0,0 +1,11 @@
+prefix=@prefix@
+exec_prefix=@exec_prefix@
+libdir=@libdir@
+includedir=@includedir@
+
+Name: TAO_CosTime
+Description: TAO CosTime Library
+Requires: TAO_PortableServer, TAO
+Version: @VERSION@
+Libs: -L${libdir} -lTAO_CosTime
+Cflags: -I${includedir}
diff --git a/TAO/orbsvcs/orbsvcs/TAO_CosTrading.pc.in b/TAO/orbsvcs/orbsvcs/TAO_CosTrading.pc.in
new file mode 100644
index 00000000000..517f619d0a4
--- /dev/null
+++ b/TAO/orbsvcs/orbsvcs/TAO_CosTrading.pc.in
@@ -0,0 +1,11 @@
+prefix=@prefix@
+exec_prefix=@exec_prefix@
+libdir=@libdir@
+includedir=@includedir@
+
+Name: TAO_CosTrading
+Description: TAO CosTrading Stub Library
+Requires: TAO_AnyTypeCode, TAO
+Version: @VERSION@
+Libs: -L${libdir} -lTAO_CosTrading
+Cflags: -I${includedir}
diff --git a/TAO/orbsvcs/orbsvcs/TAO_CosTrading_Serv.pc.in b/TAO/orbsvcs/orbsvcs/TAO_CosTrading_Serv.pc.in
new file mode 100644
index 00000000000..311d34a75fd
--- /dev/null
+++ b/TAO/orbsvcs/orbsvcs/TAO_CosTrading_Serv.pc.in
@@ -0,0 +1,11 @@
+prefix=@prefix@
+exec_prefix=@exec_prefix@
+libdir=@libdir@
+includedir=@includedir@
+
+Name: TAO_CosTrading_Serv
+Description: TAO CosTrading Service Library
+Requires: TAO_CosTrading_Skel, TAO_Svc_Utils, TAO_DynamicAny
+Version: @VERSION@
+Libs: -L${libdir} -lTAO_CosTrading_Serv
+Cflags: -I${includedir}
diff --git a/TAO/orbsvcs/orbsvcs/TAO_CosTrading_Skel.pc.in b/TAO/orbsvcs/orbsvcs/TAO_CosTrading_Skel.pc.in
new file mode 100644
index 00000000000..3a0dfcada7b
--- /dev/null
+++ b/TAO/orbsvcs/orbsvcs/TAO_CosTrading_Skel.pc.in
@@ -0,0 +1,11 @@
+prefix=@prefix@
+exec_prefix=@exec_prefix@
+libdir=@libdir@
+includedir=@includedir@
+
+Name: TAO_CosTrading_Skel
+Description: TAO CosTrading Skeleton Library
+Requires: TAO_CosTrading, TAO_PortableServer
+Version: @VERSION@
+Libs: -L${libdir} -lTAO_CosTrading_Skel
+Cflags: -I${includedir}
diff --git a/TAO/orbsvcs/orbsvcs/TAO_DsEventLogAdmin.pc.in b/TAO/orbsvcs/orbsvcs/TAO_DsEventLogAdmin.pc.in
new file mode 100644
index 00000000000..5897aec83a9
--- /dev/null
+++ b/TAO/orbsvcs/orbsvcs/TAO_DsEventLogAdmin.pc.in
@@ -0,0 +1,11 @@
+prefix=@prefix@
+exec_prefix=@exec_prefix@
+libdir=@libdir@
+includedir=@includedir@
+
+Name: TAO_DsEventLogAdmin
+Description: TAO Event Logging Service Stub Library
+Requires: TAO, TAO_DsLogAdmin, TAO_CosEvent
+Version: @VERSION@
+Libs: -L${libdir} -lTAO_DsEventLogAdmin
+Cflags: -I${includedir}
diff --git a/TAO/orbsvcs/orbsvcs/TAO_DsEventLogAdmin_Serv.pc.in b/TAO/orbsvcs/orbsvcs/TAO_DsEventLogAdmin_Serv.pc.in
new file mode 100644
index 00000000000..ce352477a2d
--- /dev/null
+++ b/TAO/orbsvcs/orbsvcs/TAO_DsEventLogAdmin_Serv.pc.in
@@ -0,0 +1,11 @@
+prefix=@prefix@
+exec_prefix=@exec_prefix@
+libdir=@libdir@
+includedir=@includedir@
+
+Name: TAO_DsEventLogAdmin_Serv
+Description: TAO Event Logging Service Implementation Library
+Requires: TAO_DsEventLogAdmin_Skel, TAO_DsLogAdmin_Serv, TAO_CosEvent_Serv
+Version: @VERSION@
+Libs: -L${libdir} -lTAO_DsEventLogAdmin_Serv
+Cflags: -I${includedir}
diff --git a/TAO/orbsvcs/orbsvcs/TAO_DsEventLogAdmin_Skel.pc.in b/TAO/orbsvcs/orbsvcs/TAO_DsEventLogAdmin_Skel.pc.in
new file mode 100644
index 00000000000..9eb90123b04
--- /dev/null
+++ b/TAO/orbsvcs/orbsvcs/TAO_DsEventLogAdmin_Skel.pc.in
@@ -0,0 +1,11 @@
+prefix=@prefix@
+exec_prefix=@exec_prefix@
+libdir=@libdir@
+includedir=@includedir@
+
+Name: TAO_DsEventLogAdmin_Skel
+Description: TAO Event Logging Service Skeleton Library
+Requires: TAO_DsEventLogAdmin, TAO_DsLogAdmin_Skel, TAO_CosEvent_Skel, TAO_PortableServer
+Version: @VERSION@
+Libs: -L${libdir} -lTAO_DsEventLogAdmin_Skel
+Cflags: -I${includedir}
diff --git a/TAO/orbsvcs/orbsvcs/TAO_DsLogAdmin.pc.in b/TAO/orbsvcs/orbsvcs/TAO_DsLogAdmin.pc.in
new file mode 100644
index 00000000000..90bfd120c36
--- /dev/null
+++ b/TAO/orbsvcs/orbsvcs/TAO_DsLogAdmin.pc.in
@@ -0,0 +1,11 @@
+prefix=@prefix@
+exec_prefix=@exec_prefix@
+libdir=@libdir@
+includedir=@includedir@
+
+Name: TAO_DsLogAdmin
+Description: TAO Basic Logging Service Stub Library
+Requires: TAO_AnyTypeCode, TAO
+Version: @VERSION@
+Libs: -L${libdir} -lTAO_DsLogAdmin
+Cflags: -I${includedir}
diff --git a/TAO/orbsvcs/orbsvcs/TAO_DsLogAdmin_Serv.pc.in b/TAO/orbsvcs/orbsvcs/TAO_DsLogAdmin_Serv.pc.in
new file mode 100644
index 00000000000..e018cc07696
--- /dev/null
+++ b/TAO/orbsvcs/orbsvcs/TAO_DsLogAdmin_Serv.pc.in
@@ -0,0 +1,11 @@
+prefix=@prefix@
+exec_prefix=@exec_prefix@
+libdir=@libdir@
+includedir=@includedir@
+
+Name: TAO_DsLogAdmin_Serv
+Description: TAO Basic Logging Service Implementation Library
+Requires: TAO_DsLogAdmin_Skel, TAO_DynamicAny, TAO_ETCL, TAO_Svc_Utils
+Version: @VERSION@
+Libs: -L${libdir} -lTAO_DsLogAdmin_Serv
+Cflags: -I${includedir}
diff --git a/TAO/orbsvcs/orbsvcs/TAO_DsLogAdmin_Skel.pc.in b/TAO/orbsvcs/orbsvcs/TAO_DsLogAdmin_Skel.pc.in
new file mode 100644
index 00000000000..e55f7803fee
--- /dev/null
+++ b/TAO/orbsvcs/orbsvcs/TAO_DsLogAdmin_Skel.pc.in
@@ -0,0 +1,11 @@
+prefix=@prefix@
+exec_prefix=@exec_prefix@
+libdir=@libdir@
+includedir=@includedir@
+
+Name: TAO_DsLogAdmin_Skel
+Description: TAO Basic Logging Service Skeleton Library
+Requires: TAO_DsLogAdmin, TAO_PortableServer
+Version: @VERSION@
+Libs: -L${libdir} -lTAO_DsLogAdmin_Skel
+Cflags: -I${includedir}
diff --git a/TAO/orbsvcs/orbsvcs/TAO_DsNotifyLogAdmin.pc.in b/TAO/orbsvcs/orbsvcs/TAO_DsNotifyLogAdmin.pc.in
new file mode 100644
index 00000000000..2173eff7ec1
--- /dev/null
+++ b/TAO/orbsvcs/orbsvcs/TAO_DsNotifyLogAdmin.pc.in
@@ -0,0 +1,11 @@
+prefix=@prefix@
+exec_prefix=@exec_prefix@
+libdir=@libdir@
+includedir=@includedir@
+
+Name: TAO_DsNotifyLogAdmin
+Description: TAO Notify Logging Service Stub Library
+Requires: TAO_DsEventLogAdmin, TAO_DsLogAdmin, TAO_CosNotification, TAO_CosEvent, TAO
+Version: @VERSION@
+Libs: -L${libdir} -lTAO_DsNotifyLogAdmin
+Cflags: -I${includedir}
diff --git a/TAO/orbsvcs/orbsvcs/TAO_DsNotifyLogAdmin_Serv.pc.in b/TAO/orbsvcs/orbsvcs/TAO_DsNotifyLogAdmin_Serv.pc.in
new file mode 100644
index 00000000000..34743834b21
--- /dev/null
+++ b/TAO/orbsvcs/orbsvcs/TAO_DsNotifyLogAdmin_Serv.pc.in
@@ -0,0 +1,11 @@
+prefix=@prefix@
+exec_prefix=@exec_prefix@
+libdir=@libdir@
+includedir=@includedir@
+
+Name: TAO_DsNotifyLogAdmin_Serv
+Description: TAO Notify Logging Service Implementation Library
+Requires: TAO_DsNotifyLogAdmin_Skel, TAO_DsLogAdmin_Serv
+Version: @VERSION@
+Libs: -L${libdir} -lTAO_DsNotifyLogAdmin_Serv
+Cflags: -I${includedir}
diff --git a/TAO/orbsvcs/orbsvcs/TAO_DsNotifyLogAdmin_Skel.pc.in b/TAO/orbsvcs/orbsvcs/TAO_DsNotifyLogAdmin_Skel.pc.in
new file mode 100644
index 00000000000..4488d78c740
--- /dev/null
+++ b/TAO/orbsvcs/orbsvcs/TAO_DsNotifyLogAdmin_Skel.pc.in
@@ -0,0 +1,11 @@
+prefix=@prefix@
+exec_prefix=@exec_prefix@
+libdir=@libdir@
+includedir=@includedir@
+
+Name: TAO_DsNotifyLogAdmin_Skel
+Description: TAO Notify Logging Service Skeleton Library
+Requires: TAO_DsNotifyLogAdmin, TAO_DsEventLogAdmin_Skel, TAO_DsLogAdmin_Skel, TAO_CosNotification_Skel, TAO_CosEvent_Skel, TAO_PortableServer
+Version: @VERSION@
+Libs: -L${libdir} -lTAO_DsNotifyLogAdmin_Skel
+Cflags: -I${includedir}
diff --git a/TAO/orbsvcs/orbsvcs/TAO_ETCL.pc.in b/TAO/orbsvcs/orbsvcs/TAO_ETCL.pc.in
new file mode 100644
index 00000000000..98825681b5b
--- /dev/null
+++ b/TAO/orbsvcs/orbsvcs/TAO_ETCL.pc.in
@@ -0,0 +1,11 @@
+prefix=@prefix@
+exec_prefix=@exec_prefix@
+libdir=@libdir@
+includedir=@includedir@
+
+Name: TAO_ETCL
+Description: TAO Extended Trading Constraint Language Library
+Requires: TAO_AnyTypeCode, TAO
+Version: @VERSION@
+Libs: -L${libdir} -lTAO_ETCL
+Cflags: -I${includedir}
diff --git a/TAO/orbsvcs/orbsvcs/TAO_FTORB_Utils.pc.in b/TAO/orbsvcs/orbsvcs/TAO_FTORB_Utils.pc.in
new file mode 100644
index 00000000000..5165ed760b1
--- /dev/null
+++ b/TAO/orbsvcs/orbsvcs/TAO_FTORB_Utils.pc.in
@@ -0,0 +1,11 @@
+prefix=@prefix@
+exec_prefix=@exec_prefix@
+libdir=@libdir@
+includedir=@includedir@
+
+Name: TAO_FTORB_Utils
+Description: TAO Fault Tolerant ORB Utilities Library
+Requires: TAO_IORManip, TAO_PortableServer, TAO
+Version: @VERSION@
+Libs: -L${libdir} -lTAO_FTORB_Utils
+Cflags: -I${includedir}
diff --git a/TAO/orbsvcs/orbsvcs/TAO_FT_ClientORB.pc.in b/TAO/orbsvcs/orbsvcs/TAO_FT_ClientORB.pc.in
new file mode 100644
index 00000000000..5d4b8bba041
--- /dev/null
+++ b/TAO/orbsvcs/orbsvcs/TAO_FT_ClientORB.pc.in
@@ -0,0 +1,11 @@
+prefix=@prefix@
+exec_prefix=@exec_prefix@
+libdir=@libdir@
+includedir=@includedir@
+
+Name: TAO_FT_ClientORB
+Description: TAO Fault Tolerant Client ORB Library
+Requires: TAO_FTORB_Utils, TAO_Messaging, TAO_PortableGroup
+Version: @VERSION@
+Libs: -L${libdir} -lTAO_FT_ClientORB
+Cflags: -I${includedir}
diff --git a/TAO/orbsvcs/orbsvcs/TAO_FT_ServerORB.pc.in b/TAO/orbsvcs/orbsvcs/TAO_FT_ServerORB.pc.in
new file mode 100644
index 00000000000..5b0b51b87e6
--- /dev/null
+++ b/TAO/orbsvcs/orbsvcs/TAO_FT_ServerORB.pc.in
@@ -0,0 +1,11 @@
+prefix=@prefix@
+exec_prefix=@exec_prefix@
+libdir=@libdir@
+includedir=@includedir@
+
+Name: TAO_FT_ServerORB
+Description: TAO Fault Tolerant Server ORB Library
+Requires: TAO_FTORB_Utils, TAO_Messaging, TAO_PortableGroup
+Version: @VERSION@
+Libs: -L${libdir} -lTAO_FT_ServerORB
+Cflags: -I${includedir}
diff --git a/TAO/orbsvcs/orbsvcs/TAO_FaultTolerance.pc.in b/TAO/orbsvcs/orbsvcs/TAO_FaultTolerance.pc.in
new file mode 100644
index 00000000000..4150e1f29eb
--- /dev/null
+++ b/TAO/orbsvcs/orbsvcs/TAO_FaultTolerance.pc.in
@@ -0,0 +1,11 @@
+prefix=@prefix@
+exec_prefix=@exec_prefix@
+libdir=@libdir@
+includedir=@includedir@
+
+Name: TAO_FaultTolerance
+Description: TAO Fault Tolerant Client ORB Library
+Requires: TAO_FT_ServerORB, TAO_FT_ClientORB, TAO_CosNotification
+Version: @VERSION@
+Libs: -L${libdir} -lTAO_FaultTolerance
+Cflags: -I${includedir}
diff --git a/TAO/orbsvcs/orbsvcs/TAO_PortableGroup.pc.in b/TAO/orbsvcs/orbsvcs/TAO_PortableGroup.pc.in
new file mode 100644
index 00000000000..0e4e6c876b4
--- /dev/null
+++ b/TAO/orbsvcs/orbsvcs/TAO_PortableGroup.pc.in
@@ -0,0 +1,11 @@
+prefix=@prefix@
+exec_prefix=@exec_prefix@
+libdir=@libdir@
+includedir=@includedir@
+
+Name: TAO_PortableGroup
+Description: TAO PortableGroup Library
+Requires: TAO_CosNaming, TAO_IORManip, TAO_Messaging, TAO
+Version: @VERSION@
+Libs: -L${libdir} -lTAO_PortableGroup
+Cflags: -I${includedir}
diff --git a/TAO/orbsvcs/orbsvcs/TAO_RTEvent.pc.in b/TAO/orbsvcs/orbsvcs/TAO_RTEvent.pc.in
new file mode 100644
index 00000000000..b36d36acba5
--- /dev/null
+++ b/TAO/orbsvcs/orbsvcs/TAO_RTEvent.pc.in
@@ -0,0 +1,11 @@
+prefix=@prefix@
+exec_prefix=@exec_prefix@
+libdir=@libdir@
+includedir=@includedir@
+
+Name: TAO_RTEvent
+Description: TAO RTEvent Stub Library
+Requires: TAO_Svc_Utils, TAO_AnyTypeCode, TAO
+Version: @VERSION@
+Libs: -L${libdir} -lTAO_RTEvent
+Cflags: -I${includedir}
diff --git a/TAO/orbsvcs/orbsvcs/TAO_RTEventLogAdmin.pc.in b/TAO/orbsvcs/orbsvcs/TAO_RTEventLogAdmin.pc.in
new file mode 100644
index 00000000000..7c0ba70dab7
--- /dev/null
+++ b/TAO/orbsvcs/orbsvcs/TAO_RTEventLogAdmin.pc.in
@@ -0,0 +1,11 @@
+prefix=@prefix@
+exec_prefix=@exec_prefix@
+libdir=@libdir@
+includedir=@includedir@
+
+Name: TAO_RTEventLogAdmin
+Description: TAO RTEvent Logging Service Stub Library
+Requires: TAO, TAO_DsLogAdmin, TAO_RTEvent
+Version: @VERSION@
+Libs: -L${libdir} -lTAO_RTEventLogAdmin
+Cflags: -I${includedir}
diff --git a/TAO/orbsvcs/orbsvcs/TAO_RTEventLogAdmin_Serv.pc.in b/TAO/orbsvcs/orbsvcs/TAO_RTEventLogAdmin_Serv.pc.in
new file mode 100644
index 00000000000..8e63c1dd211
--- /dev/null
+++ b/TAO/orbsvcs/orbsvcs/TAO_RTEventLogAdmin_Serv.pc.in
@@ -0,0 +1,11 @@
+prefix=@prefix@
+exec_prefix=@exec_prefix@
+libdir=@libdir@
+includedir=@includedir@
+
+Name: TAO_RTEventLogAdmin_Serv
+Description: TAO RTEvent Logging Service Implementation Library
+Requires: TAO_RTEventLogAdmin_Skel, TAO_DsLogAdmin_Serv, TAO_RTEvent_Serv
+Version: @VERSION@
+Libs: -L${libdir} -lTAO_RTEventLogAdmin_Serv
+Cflags: -I${includedir}
diff --git a/TAO/orbsvcs/orbsvcs/TAO_RTEventLogAdmin_Skel.pc.in b/TAO/orbsvcs/orbsvcs/TAO_RTEventLogAdmin_Skel.pc.in
new file mode 100644
index 00000000000..210fe308b19
--- /dev/null
+++ b/TAO/orbsvcs/orbsvcs/TAO_RTEventLogAdmin_Skel.pc.in
@@ -0,0 +1,11 @@
+prefix=@prefix@
+exec_prefix=@exec_prefix@
+libdir=@libdir@
+includedir=@includedir@
+
+Name: TAO_RTEventLogAdmin_Skel
+Description: TAO RTEvent Logging Service Skeleton Library
+Requires: TAO_RTEventLogAdmin, TAO_DsLogAdmin_Skel, TAO_RTEvent_Skel, TAO_PortableServer
+Version: @VERSION@
+Libs: -L${libdir} -lTAO_RTEventLogAdmin_Skel
+Cflags: -I${includedir}
diff --git a/TAO/orbsvcs/orbsvcs/TAO_RTEvent_Serv.pc.in b/TAO/orbsvcs/orbsvcs/TAO_RTEvent_Serv.pc.in
new file mode 100644
index 00000000000..b37c07333ea
--- /dev/null
+++ b/TAO/orbsvcs/orbsvcs/TAO_RTEvent_Serv.pc.in
@@ -0,0 +1,11 @@
+prefix=@prefix@
+exec_prefix=@exec_prefix@
+libdir=@libdir@
+includedir=@includedir@
+
+Name: TAO_RTEvent_Serv
+Description: TAO RTEvent Service Library
+Requires: TAO_RTEvent_Skel, TAO_Svc_Utils, TAO_Messaging
+Version: @VERSION@
+Libs: -L${libdir} -lTAO_RTEvent_Serv
+Cflags: -I${includedir}
diff --git a/TAO/orbsvcs/orbsvcs/TAO_RTEvent_Skel.pc.in b/TAO/orbsvcs/orbsvcs/TAO_RTEvent_Skel.pc.in
new file mode 100644
index 00000000000..4d862cc270d
--- /dev/null
+++ b/TAO/orbsvcs/orbsvcs/TAO_RTEvent_Skel.pc.in
@@ -0,0 +1,11 @@
+prefix=@prefix@
+exec_prefix=@exec_prefix@
+libdir=@libdir@
+includedir=@includedir@
+
+Name: TAO_RTEvent_Skel
+Description: TAO RTEvent Skeleton Library
+Requires: TAO_RTEvent, TAO_PortableServer
+Version: @VERSION@
+Libs: -L${libdir} -lTAO_RTEvent_Skel
+Cflags: -I${includedir}
diff --git a/TAO/orbsvcs/orbsvcs/TAO_Svc_Utils.pc.in b/TAO/orbsvcs/orbsvcs/TAO_Svc_Utils.pc.in
new file mode 100644
index 00000000000..049fb2e53b5
--- /dev/null
+++ b/TAO/orbsvcs/orbsvcs/TAO_Svc_Utils.pc.in
@@ -0,0 +1,11 @@
+prefix=@prefix@
+exec_prefix=@exec_prefix@
+libdir=@libdir@
+includedir=@includedir@
+
+Name: TAO_Svc_Utils
+Description: TAO Service Utilities Library
+Requires: TAO_PortableServer
+Version: @VERSION@
+Libs: -L${libdir} -lTAO_Svc_Utils
+Cflags: -I${includedir}
diff --git a/TAO/orbsvcs/orbsvcs/Time/TAO_TIO.cpp b/TAO/orbsvcs/orbsvcs/Time/TAO_TIO.cpp
new file mode 100644
index 00000000000..55708a8dc13
--- /dev/null
+++ b/TAO/orbsvcs/orbsvcs/Time/TAO_TIO.cpp
@@ -0,0 +1,288 @@
+// $Id$
+
+#include "orbsvcs/Time/TAO_TIO.h"
+
+TAO_BEGIN_VERSIONED_NAMESPACE_DECL
+
+// Constructor.
+TAO_TIO::TAO_TIO (TimeBase::TimeT lower,
+ TimeBase::TimeT upper)
+{
+ this->attr_time_interval.lower_bound = lower;
+ this->attr_time_interval.upper_bound = upper;
+}
+
+// Destructor.
+TAO_TIO::~TAO_TIO (void)
+{
+}
+
+// This is the get method for the attribute time interval.
+
+TimeBase::IntervalT
+TAO_TIO::time_interval (ACE_ENV_SINGLE_ARG_DECL_NOT_USED)
+ ACE_THROW_SPEC ((CORBA::SystemException))
+{
+ return attr_time_interval;
+}
+
+// This operation returns a value of type OverlapType depending on how
+// the interval in the object and the time range represented by the
+// parameter UTO overlap. If OverlapType is not OTNoOverlap, then the
+// out parameter overlap contains the overlap interval, otherwise the
+// out parameter contains the gap between the two intervals.
+
+CosTime::OverlapType
+TAO_TIO::spans (CosTime::UTO_ptr uto,
+ CosTime::TIO_out overlap
+ ACE_ENV_ARG_DECL)
+ ACE_THROW_SPEC ((CORBA::SystemException))
+{
+ TAO_TIO *tio = 0;
+
+ ACE_TRY
+ {
+ TimeBase::TimeT lb1 =
+ this->time_interval ().lower_bound;
+
+ TimeBase::TimeT up1 =
+ this->time_interval ().upper_bound;
+
+ TimeBase::TimeT tmp1 = uto->time (ACE_ENV_SINGLE_ARG_PARAMETER);
+ ACE_TRY_CHECK;
+
+ TimeBase::TimeT tmp2 = uto->inaccuracy (ACE_ENV_SINGLE_ARG_PARAMETER);
+ ACE_TRY_CHECK;
+
+ TimeBase::TimeT lb2 = tmp1 - tmp2;
+
+
+ tmp1 = uto->time (ACE_ENV_SINGLE_ARG_PARAMETER);
+ ACE_TRY_CHECK;
+
+ tmp2 = uto->inaccuracy (ACE_ENV_SINGLE_ARG_PARAMETER);
+ ACE_TRY_CHECK;
+
+ TimeBase::TimeT up2 = tmp1 + tmp2;
+
+ if (lb1 == lb2 && up1 == up2)
+ {
+ ACE_NEW_RETURN (tio,
+ TAO_TIO (lb1, up1),
+ CosTime::OTNoOverlap);
+ overlap = tio->_this (ACE_ENV_SINGLE_ARG_PARAMETER);
+ ACE_CHECK_RETURN (CosTime::OTNoOverlap);
+
+ return CosTime::OTOverlap;
+ }
+ else if (lb1 > lb2 && up1 < up2)
+ {
+ ACE_NEW_RETURN (tio,
+ TAO_TIO (lb1, up1),
+ CosTime::OTNoOverlap);
+
+ overlap = tio->_this ();
+ ACE_CHECK_RETURN (CosTime::OTNoOverlap);
+
+ return CosTime::OTContained;
+ }
+ else if (lb1 < lb2 && up1 > up2)
+ {
+ ACE_NEW_RETURN (tio,
+ TAO_TIO (lb2, up2),
+ CosTime::OTNoOverlap);
+
+ overlap = tio->_this (ACE_ENV_SINGLE_ARG_PARAMETER);
+ ACE_CHECK_RETURN (CosTime::OTNoOverlap);
+
+ return CosTime::OTContained;
+ }
+ else if (lb1 < lb2)
+ {
+ if (up1 < lb2)
+ {
+ ACE_NEW_RETURN (tio,
+ TAO_TIO (0, 0),
+ CosTime::OTNoOverlap);
+
+ overlap = tio->_this (ACE_ENV_SINGLE_ARG_PARAMETER);
+ ACE_CHECK_RETURN (CosTime::OTNoOverlap);
+
+ return CosTime::OTNoOverlap;
+ }
+ else
+ {
+ ACE_NEW_RETURN (tio,
+ TAO_TIO (lb2, up1),
+ CosTime::OTNoOverlap);
+ overlap = tio->_this (ACE_ENV_SINGLE_ARG_PARAMETER);
+ ACE_CHECK_RETURN (CosTime::OTNoOverlap);
+
+ return CosTime::OTOverlap;
+ }
+ }
+ else if (up2 < lb1)
+ {
+
+ ACE_NEW_RETURN (tio,
+ TAO_TIO (0, 0),
+ CosTime::OTNoOverlap);
+
+ overlap = tio->_this (ACE_ENV_SINGLE_ARG_PARAMETER);
+ ACE_CHECK_RETURN (CosTime::OTNoOverlap);
+
+ return CosTime::OTNoOverlap;
+ }
+ else
+ {
+ ACE_NEW_RETURN (tio,
+ TAO_TIO (lb1, up2),
+ CosTime::OTNoOverlap);
+
+ overlap = tio->_this (ACE_ENV_SINGLE_ARG_PARAMETER);
+ ACE_CHECK_RETURN (CosTime::OTNoOverlap);
+ }
+ }
+ ACE_CATCHANY
+ {
+ ACE_PRINT_EXCEPTION (ACE_ANY_EXCEPTION, "Exception:");
+ }
+ ACE_ENDTRY;
+ ACE_CHECK_RETURN (CosTime::OTNoOverlap);
+
+ return CosTime::OTNoOverlap;
+}
+
+// This operation returns a value of type OverlapType depending on how
+// the interval in the object and interval in the parameter TIO
+// overlap. If OverlapType is not OTNoOverlap, then the out parameter
+// overlap contains the overlap interval, otherwise the out parameter
+// contains the gap between the two intervals.
+
+CosTime::OverlapType
+TAO_TIO::overlaps (CosTime::TIO_ptr tio,
+ CosTime::TIO_out overlap
+ ACE_ENV_ARG_DECL)
+ ACE_THROW_SPEC ((CORBA::SystemException))
+{
+ TAO_TIO *tio_i = 0;
+
+ TimeBase::TimeT lb1 =
+ this->time_interval ().lower_bound;
+
+ TimeBase::TimeT up1 =
+ this->time_interval ().upper_bound;
+
+ TimeBase::TimeT lb2 =
+ tio->time_interval ().lower_bound;
+
+ TimeBase::TimeT up2 =
+ tio->time_interval ().upper_bound;
+
+ if (lb1 == lb2 && up1 == up2)
+ {
+ ACE_NEW_THROW_EX (tio_i,
+ TAO_TIO (lb1, up1),
+ CORBA::NO_MEMORY ());
+
+ ACE_CHECK_RETURN (CosTime::OTNoOverlap);
+
+ overlap = tio_i->_this (ACE_ENV_SINGLE_ARG_PARAMETER);
+ ACE_CHECK_RETURN (CosTime::OTNoOverlap);
+
+ return CosTime::OTOverlap;
+ }
+ else if (lb1 > lb2 && up1 < up2)
+ {
+ ACE_NEW_THROW_EX (tio_i,
+ TAO_TIO (lb1, up1),
+ CORBA::NO_MEMORY ());
+ ACE_CHECK_RETURN (CosTime::OTNoOverlap);
+
+ overlap = tio_i->_this (ACE_ENV_SINGLE_ARG_PARAMETER);
+ ACE_CHECK_RETURN (CosTime::OTNoOverlap);
+
+ return CosTime::OTContained;
+ }
+ else if (lb1 < lb2 && up1 > up2)
+ {
+ ACE_NEW_THROW_EX (tio_i,
+ TAO_TIO (lb2, up2),
+ CORBA::NO_MEMORY ());
+ ACE_CHECK_RETURN (CosTime::OTNoOverlap);
+
+ overlap = tio_i->_this (ACE_ENV_SINGLE_ARG_PARAMETER);
+ ACE_CHECK_RETURN (CosTime::OTNoOverlap);
+
+ return CosTime::OTContained;
+ }
+ else if (lb1 < lb2)
+ {
+ if (up1 < lb2)
+ {
+ ACE_NEW_THROW_EX (tio_i,
+ TAO_TIO (0, 0),
+ CORBA::NO_MEMORY ());
+ ACE_CHECK_RETURN (CosTime::OTNoOverlap);
+ overlap = tio_i->_this (ACE_ENV_SINGLE_ARG_PARAMETER);
+ ACE_CHECK_RETURN (CosTime::OTNoOverlap);
+
+ return CosTime::OTNoOverlap;
+ }
+ else
+ {
+ ACE_NEW_THROW_EX (tio_i,
+ TAO_TIO (lb2, up1),
+ CORBA::NO_MEMORY ());
+ ACE_CHECK_RETURN (CosTime::OTNoOverlap);
+
+ overlap = tio_i->_this (ACE_ENV_SINGLE_ARG_PARAMETER);
+ ACE_CHECK_RETURN (CosTime::OTNoOverlap);
+
+ return CosTime::OTOverlap;
+ }
+ }
+ else if (up2 < lb1)
+ {
+ ACE_NEW_THROW_EX (tio_i,
+ TAO_TIO (0, 0),
+ CORBA::NO_MEMORY ());
+ ACE_CHECK_RETURN (CosTime::OTNoOverlap);
+
+ overlap = tio_i->_this (ACE_ENV_SINGLE_ARG_PARAMETER);
+ ACE_CHECK_RETURN (CosTime::OTNoOverlap);
+
+ return CosTime::OTNoOverlap;
+ }
+ else
+ {
+ ACE_NEW_THROW_EX (tio_i,
+ TAO_TIO (lb1, up2),
+ CORBA::NO_MEMORY ());
+ ACE_CHECK_RETURN (CosTime::OTNoOverlap);
+ overlap = tio_i->_this ();
+ }
+
+ return CosTime::OTNoOverlap;
+}
+
+CosTime::UTO_ptr
+TAO_TIO::time (ACE_ENV_SINGLE_ARG_DECL)
+ ACE_THROW_SPEC ((CORBA::SystemException))
+{
+ TAO_UTO *uto = 0;
+
+ ACE_NEW_THROW_EX (uto,
+ TAO_UTO ((this->time_interval ().upper_bound -
+ this->time_interval ().lower_bound) / 2,
+ this->time_interval ().upper_bound -
+ this->time_interval ().lower_bound,
+ 0),
+ CORBA::NO_MEMORY ());
+
+ ACE_CHECK_RETURN (CosTime::UTO::_nil ());
+
+ return uto->_this (ACE_ENV_SINGLE_ARG_PARAMETER);
+}
+
+TAO_END_VERSIONED_NAMESPACE_DECL
diff --git a/TAO/orbsvcs/orbsvcs/Time/TAO_TIO.h b/TAO/orbsvcs/orbsvcs/Time/TAO_TIO.h
new file mode 100644
index 00000000000..ff4f0e8ab36
--- /dev/null
+++ b/TAO/orbsvcs/orbsvcs/Time/TAO_TIO.h
@@ -0,0 +1,95 @@
+// -*- C++ -*-
+
+//=============================================================================
+/**
+ * @file TAO_TIO.h
+ *
+ * $Id$
+ *
+ * This class implements the CosTime::TIO IDL interface.
+ *
+ *
+ * @author Vishal Kachroo <vishal@cs.wustl.edu>
+ */
+//=============================================================================
+
+
+#ifndef TAO_TIO_H
+#define TAO_TIO_H
+#include /**/ "ace/pre.h"
+
+#include "orbsvcs/TimeServiceS.h"
+#include "orbsvcs/Time/TAO_UTO.h"
+#include "orbsvcs/Time/time_export.h"
+
+TAO_BEGIN_VERSIONED_NAMESPACE_DECL
+
+/**
+ * @class TAO_TIO
+ *
+ * @brief Time Interval Object Implementation.
+ *
+ * The TIO represents a time interval and has operations to
+ * compare itself with a UTO or another TIO. It also has an
+ * operation to create a UTO from the value of it's time
+ * interval.
+ */
+class TAO_Time_Export TAO_TIO : public POA_CosTime::TIO
+{
+public:
+ // = Initialization and termination methods.
+ /// Constructor.
+ TAO_TIO (TimeBase::TimeT lower,
+ TimeBase::TimeT upper);
+
+ /// Destructor.
+ ~TAO_TIO (void);
+
+ /// This is the get method for the attribute time interval.
+ virtual TimeBase::IntervalT time_interval (
+ ACE_ENV_SINGLE_ARG_DECL_WITH_DEFAULTS)
+ ACE_THROW_SPEC ((CORBA::SystemException));
+
+ /**
+ * This operation returns a value of type OverlapType depending on
+ * how the interval in the object and the time range represented by
+ * the parameter UTO overlap. If OverlapType is not OTNoOverlap,
+ * then the out parameter overlap contains the overlap interval,
+ * otherwise the out parameter contains the gap between the two
+ * intervals.
+ */
+ virtual CosTime::OverlapType spans (CosTime::UTO_ptr time,
+ CosTime::TIO_out overlap
+ ACE_ENV_ARG_DECL)
+ ACE_THROW_SPEC ((CORBA::SystemException));
+
+ /**
+ * This operation returns a value of type OverlapType depending on
+ * how the interval in the object and interval in the parameter TIO
+ * overlap. If OverlapType is not OTNoOverlap, then the out
+ * parameter overlap contains the overlap interval, otherwise the
+ * out parameter contains the gap between the two intervals.
+ */
+ virtual CosTime::OverlapType overlaps (CosTime::TIO_ptr interval,
+ CosTime::TIO_out overlap
+ ACE_ENV_ARG_DECL)
+ ACE_THROW_SPEC ((CORBA::SystemException));
+
+ /**
+ * Returns a UTO in which the inaccuracy interval is equal to the
+ * time interval in the TIO and time value is the midpoint of the
+ * interval.
+ */
+ virtual CosTime::UTO_ptr time (ACE_ENV_SINGLE_ARG_DECL)
+ ACE_THROW_SPEC ((CORBA::SystemException));
+
+private:
+ /// This attribute returns an IntervalT structure with the values of
+ /// its fields filled in with the corresponding values from the TIO.
+ TimeBase::IntervalT attr_time_interval;
+};
+
+TAO_END_VERSIONED_NAMESPACE_DECL
+
+#include /**/ "ace/post.h"
+#endif /* TAO_TIO_H */
diff --git a/TAO/orbsvcs/orbsvcs/Time/TAO_Time_Service_Clerk.cpp b/TAO/orbsvcs/orbsvcs/Time/TAO_Time_Service_Clerk.cpp
new file mode 100644
index 00000000000..710c8fad7ee
--- /dev/null
+++ b/TAO/orbsvcs/orbsvcs/Time/TAO_Time_Service_Clerk.cpp
@@ -0,0 +1,181 @@
+// -*- C++ -*-
+// $Id$
+
+#include "orbsvcs/Time/TAO_Time_Service_Clerk.h"
+#include "orbsvcs/Time/TAO_TIO.h"
+#include "orbsvcs/Time/TAO_UTO.h"
+
+#include "tao/ORB_Core.h"
+#include "ace/OS_NS_sys_time.h"
+
+TAO_BEGIN_VERSIONED_NAMESPACE_DECL
+
+// Constructor.
+TAO_Time_Service_Clerk::TAO_Time_Service_Clerk (int timer_value,
+ int timer_value_usecs,
+ const IORS& servers)
+ : server_ (servers),
+ helper_ (this)
+{
+ // Schedule the helper to be invoked by the reactor
+ // periodically.
+
+ if (TAO_ORB_Core_instance ()->reactor ()->schedule_timer
+ (&helper_,
+ 0,
+ ACE_Time_Value::zero,
+ ACE_Time_Value(timer_value,timer_value_usecs)) == -1)
+ ACE_ERROR ((LM_ERROR,
+ "%p\n",
+ "schedule_timer ()"));
+}
+
+// Destructor.
+
+TAO_Time_Service_Clerk::~TAO_Time_Service_Clerk (void)
+{
+}
+
+// This method returns the global time and an estimate of inaccuracy
+// in a UTO.
+
+CosTime::UTO_ptr
+TAO_Time_Service_Clerk::universal_time (ACE_ENV_SINGLE_ARG_DECL)
+ ACE_THROW_SPEC ((CORBA::SystemException,
+ CosTime::TimeUnavailable))
+{
+ TAO_UTO *uto = 0;
+
+ ACE_NEW_THROW_EX (uto,
+ TAO_UTO (this->get_time (),
+ this->inaccuracy (),
+ this->time_displacement_factor ()),
+ CORBA::NO_MEMORY ());
+ ACE_CHECK_RETURN (CosTime::UTO::_nil ());
+ // Return the global time as a UTO.
+
+ return uto->_this (ACE_ENV_SINGLE_ARG_PARAMETER);
+}
+
+// This method returns the global time in a UTO only if the time can
+// be guaranteed to have been obtained securely. This method is not
+// implemented currently.
+
+CosTime::UTO_ptr
+TAO_Time_Service_Clerk::secure_universal_time (ACE_ENV_SINGLE_ARG_DECL)
+ ACE_THROW_SPEC ((CORBA::SystemException,
+ CosTime::TimeUnavailable))
+{
+ ACE_THROW_RETURN (CORBA::NO_IMPLEMENT (),
+ CosTime::UTO::_nil ());
+}
+
+// This creates a new UTO based on the given parameters.
+
+CosTime::UTO_ptr
+TAO_Time_Service_Clerk::new_universal_time (TimeBase::TimeT time,
+ TimeBase::InaccuracyT inaccuracy,
+ TimeBase::TdfT tdf
+ ACE_ENV_ARG_DECL)
+ ACE_THROW_SPEC ((CORBA::SystemException))
+{
+ TAO_UTO *uto = 0;
+
+ ACE_NEW_THROW_EX (uto,
+ TAO_UTO (time,
+ inaccuracy,
+ tdf),
+ CORBA::NO_MEMORY ());
+ ACE_CHECK_RETURN (CosTime::UTO::_nil ());
+
+ return uto->_this (ACE_ENV_SINGLE_ARG_PARAMETER);
+}
+
+// This creates a new UTO given a time in the UtcT form.
+
+CosTime::UTO_ptr
+TAO_Time_Service_Clerk::uto_from_utc (const TimeBase::UtcT &utc
+ ACE_ENV_ARG_DECL)
+ ACE_THROW_SPEC ((CORBA::SystemException))
+{
+ TAO_UTO *uto = 0;
+
+ // Use the low and high values of inaccuracy
+ // to calculate the total inaccuracy.
+
+ TimeBase::InaccuracyT inaccuracy = utc.inacchi;
+ inaccuracy <<= 32;
+ inaccuracy |= utc.inacclo;
+
+ ACE_NEW_THROW_EX (uto,
+ TAO_UTO (utc.time,
+ inaccuracy,
+ utc.tdf),
+ CORBA::NO_MEMORY ());
+ ACE_CHECK_RETURN (CosTime::UTO::_nil ());
+ return uto->_this (ACE_ENV_SINGLE_ARG_PARAMETER);
+}
+
+// This creates a new TIO with the given parameters.
+
+CosTime::TIO_ptr
+TAO_Time_Service_Clerk::new_interval (TimeBase::TimeT lower,
+ TimeBase::TimeT upper
+ ACE_ENV_ARG_DECL)
+ ACE_THROW_SPEC ((CORBA::SystemException))
+{
+ TAO_TIO *tio = 0;
+
+ ACE_NEW_THROW_EX (tio,
+ TAO_TIO (lower,
+ upper),
+ CORBA::NO_MEMORY ());
+ ACE_CHECK_RETURN (CosTime::TIO::_nil ());
+ return tio->_this (ACE_ENV_SINGLE_ARG_PARAMETER);
+}
+
+CORBA::ULongLong
+TAO_Time_Service_Clerk::get_time (void)
+{
+ // Globally sync. time is the latest global time plus the time
+ // elapsed since last updation was done.
+
+ const ACE_Time_Value timeofday = ACE_OS::gettimeofday ();
+
+ return (CORBA::ULongLong) (static_cast<CORBA::ULongLong> (timeofday.sec ()) *
+ static_cast<ACE_UINT32> (10000000) +
+ static_cast<CORBA::ULongLong> (timeofday.usec () * 10))
+ - this->update_timestamp_
+ + this->time_;
+}
+
+// Returns the time displacement factor in minutes.
+// This is displacement from the GMT.
+CORBA::Short
+TAO_Time_Service_Clerk::time_displacement_factor (void)
+{
+ return time_displacement_factor_;
+}
+
+// Sets the TDF.
+void
+TAO_Time_Service_Clerk::time_displacement_factor (CORBA::Short tdf)
+{
+ this->time_displacement_factor_ = tdf;
+}
+
+// GET method for inaccuracy.
+TimeBase::InaccuracyT
+TAO_Time_Service_Clerk::inaccuracy (void)
+{
+ return this->inaccuracy_;
+}
+
+// SET method for inaccuracy.
+void
+TAO_Time_Service_Clerk::inaccuracy (TimeBase::InaccuracyT inaccuracy)
+{
+ this->inaccuracy_ = inaccuracy;
+}
+
+TAO_END_VERSIONED_NAMESPACE_DECL
diff --git a/TAO/orbsvcs/orbsvcs/Time/TAO_Time_Service_Clerk.h b/TAO/orbsvcs/orbsvcs/Time/TAO_Time_Service_Clerk.h
new file mode 100644
index 00000000000..ef8d5a9a3dd
--- /dev/null
+++ b/TAO/orbsvcs/orbsvcs/Time/TAO_Time_Service_Clerk.h
@@ -0,0 +1,141 @@
+// -*- C++ -*-
+
+//=============================================================================
+/**
+ * @file TAO_Time_Service_Clerk.h
+ *
+ * $Id$
+ *
+ * This class implements the CosTime::TimeService IDL interface.
+ *
+ *
+ * @author Vishal Kachroo <vishal@cs.wustl.edu>
+ */
+//=============================================================================
+
+
+#ifndef TAO_TIME_SERVICE_CLERK_H
+#define TAO_TIME_SERVICE_CLERK_H
+#include /**/ "ace/pre.h"
+
+#include "ace/Reactor.h"
+
+#include "orbsvcs/TimeServiceS.h"
+#include "orbsvcs/Time/Timer_Helper.h"
+#include "orbsvcs/Time/time_export.h"
+
+
+TAO_BEGIN_VERSIONED_NAMESPACE_DECL
+
+/**
+ * @class TAO_Time_Service_Clerk
+ *
+ * @brief TimeService Object Implementation.
+ *
+ * The Object implementation implements methods to retrieve
+ * GLOBAL time as well as secure GLOBAL time. The times are
+ * retrieved as UTOs. The object also allows creation of a TIO
+ * for a given time interval. In general, the TimeService clerk
+ * manages the UTOs and the TIOs. The notion of time returned
+ * here is the globally synchronized time.
+ */
+class TAO_Time_Export TAO_Time_Service_Clerk : public POA_CosTime::TimeService
+{
+public:
+
+ /// Helper class to help in the updation of time.
+ friend class Timer_Helper;
+
+ /// Unbounded set of IORs.
+ typedef ACE_Array_Base<CosTime::TimeService_var> IORS;
+
+ // = Initialization and termination methods.
+ /// Constructor.
+ TAO_Time_Service_Clerk (int timer_value,
+ int timer_value_usecs,
+ const IORS& server);
+
+ /// Destructor.
+ ~TAO_Time_Service_Clerk (void);
+
+ /// This operation returns the global time and an estimate of
+ /// inaccuracy in a UTO.
+ virtual CosTime::UTO_ptr universal_time (ACE_ENV_SINGLE_ARG_DECL)
+ ACE_THROW_SPEC ((CORBA::SystemException,
+ CosTime::TimeUnavailable));
+
+ /**
+ * This operation returns the global time in a UTO only if the time
+ * can be guaranteed to have been obtained securely. Currently this
+ * operation is not implemented and throws a CORBA::NO_IMPLEMENT
+ * exception, if called.
+ */
+ virtual CosTime::UTO_ptr secure_universal_time (ACE_ENV_SINGLE_ARG_DECL)
+ ACE_THROW_SPEC ((CORBA::SystemException,
+ CosTime::TimeUnavailable));
+
+ /// This creates a new UTO based on the given parameters.
+ virtual CosTime::UTO_ptr new_universal_time (TimeBase::TimeT time,
+ TimeBase::InaccuracyT inaccuracy,
+ TimeBase::TdfT tdf
+ ACE_ENV_ARG_DECL)
+ ACE_THROW_SPEC ((CORBA::SystemException));
+
+ /// This creates a new UTO given a time in the UtcT form.
+ virtual CosTime::UTO_ptr uto_from_utc (const TimeBase::UtcT &utc
+ ACE_ENV_ARG_DECL)
+ ACE_THROW_SPEC ((CORBA::SystemException));
+
+ /// This creates a new TIO with the given parameters.
+ virtual CosTime::TIO_ptr new_interval (TimeBase::TimeT lower,
+ TimeBase::TimeT upper
+ ACE_ENV_ARG_DECL)
+ ACE_THROW_SPEC ((CORBA::SystemException));
+
+ /// Return the globally synchronized time.
+ virtual CORBA::ULongLong get_time (void);
+
+ /// Returns the time displacement factor.
+ CORBA::Short time_displacement_factor (void);
+
+ /// Set the TDF.
+ void time_displacement_factor (CORBA::Short);
+
+ /// Get method for inaccuracy.
+ TimeBase::InaccuracyT inaccuracy (void);
+
+ /// Set method for inaccuracy.
+ void inaccuracy (TimeBase::InaccuracyT inaccuracy);
+
+ /// Clerk's notion of time.
+ CORBA::ULongLong time_;
+
+private:
+
+ /// Time displacement factor in minutes.
+ CORBA::Short time_displacement_factor_;
+
+ /// Inaccuracy in the time.
+ TimeBase::InaccuracyT inaccuracy_;
+
+ /// Set of server Time Server IORs.
+ IORS server_;
+
+ /// Time when last global synchronization was done.
+ CORBA::ULongLong update_timestamp_;
+
+ /**
+ * This is a friend class that inherits from the Event Handler
+ * class. The handle_timeout method of this class is scheduled for
+ * periodic invocation by the reactor. This method, in turn, updates
+ * the clerks notion of time. Using this class obviates the need for
+ * the clerk to multiple inherit from the servant base as well as
+ * the event handler.
+ */
+ Timer_Helper helper_;
+};
+
+TAO_END_VERSIONED_NAMESPACE_DECL
+
+#include /**/ "ace/post.h"
+#endif /* TIME_SERVICE_CLERK_H */
diff --git a/TAO/orbsvcs/orbsvcs/Time/TAO_Time_Service_Server.cpp b/TAO/orbsvcs/orbsvcs/Time/TAO_Time_Service_Server.cpp
new file mode 100644
index 00000000000..6fc4cf2b98e
--- /dev/null
+++ b/TAO/orbsvcs/orbsvcs/Time/TAO_Time_Service_Server.cpp
@@ -0,0 +1,127 @@
+#include "orbsvcs/Time/TAO_UTO.h"
+#include "orbsvcs/Time/TAO_TIO.h"
+#include "orbsvcs/Time/TAO_Time_Service_Server.h"
+#include "ace/OS_NS_sys_time.h"
+#include "orbsvcs/Time_Utilities.h"
+
+#include "tao/debug.h"
+
+
+ACE_RCSID (Time,
+ TAO_Time_Service_Server,
+ "$Id$")
+
+TAO_BEGIN_VERSIONED_NAMESPACE_DECL
+
+// Constructor.
+TAO_Time_Service_Server::TAO_Time_Service_Server (void)
+{
+}
+
+// Destructor.
+TAO_Time_Service_Server::~TAO_Time_Service_Server (void)
+{
+}
+
+// This method returns the current system time and an estimate of
+// inaccuracy in a UTO.
+
+CosTime::UTO_ptr
+TAO_Time_Service_Server::universal_time (ACE_ENV_SINGLE_ARG_DECL)
+ ACE_THROW_SPEC ((CORBA::SystemException,
+ CosTime::TimeUnavailable))
+{
+ TAO_UTO *uto = 0;
+
+ TimeBase::TimeT timestamp;
+ ORBSVCS_Time::Absolute_Time_Value_to_TimeT(timestamp, ACE_OS::gettimeofday());
+
+ // Return the local time of the system as a UTO.
+ ACE_NEW_THROW_EX (uto,
+ TAO_UTO (timestamp,
+ 0,
+ 0),
+ CORBA::NO_MEMORY ());
+
+ ACE_CHECK_RETURN (CosTime::UTO::_nil ());
+
+ if (TAO_debug_level > 0)
+ ACE_DEBUG ((LM_DEBUG,
+ "Returning a UTO\n"));
+
+ return uto->_this (ACE_ENV_SINGLE_ARG_PARAMETER);
+}
+
+// This method returns the current time in a UTO only if the time can
+// be guaranteed to have been obtained securely. This method is not
+// implemented currently.
+
+CosTime::UTO_ptr
+TAO_Time_Service_Server::secure_universal_time (ACE_ENV_SINGLE_ARG_DECL)
+ ACE_THROW_SPEC ((CORBA::SystemException,
+ CosTime::TimeUnavailable))
+{
+ ACE_THROW_RETURN (CORBA::NO_IMPLEMENT (),
+ CosTime::UTO::_nil ());
+}
+
+// This creates a new UTO based on the given parameters.
+
+CosTime::UTO_ptr
+TAO_Time_Service_Server::new_universal_time (TimeBase::TimeT time,
+ TimeBase::InaccuracyT inaccuracy,
+ TimeBase::TdfT tdf
+ ACE_ENV_ARG_DECL)
+ ACE_THROW_SPEC ((CORBA::SystemException))
+{
+ TAO_UTO *uto = 0;
+
+ ACE_NEW_THROW_EX (uto,
+ TAO_UTO (time,
+ inaccuracy,
+ tdf),
+ CORBA::NO_MEMORY ());
+ ACE_CHECK_RETURN (CosTime::UTO::_nil ());
+
+ return uto->_this (ACE_ENV_SINGLE_ARG_PARAMETER);
+}
+
+// This creates a new UTO given a time in the UtcT form.
+
+CosTime::UTO_ptr
+TAO_Time_Service_Server::uto_from_utc (const TimeBase::UtcT &utc
+ ACE_ENV_ARG_DECL)
+ ACE_THROW_SPEC ((CORBA::SystemException))
+{
+ TAO_UTO *uto = 0;
+
+ ACE_NEW_THROW_EX (uto,
+ TAO_UTO (utc.time,
+ utc.inacclo + utc.inacchi,
+ utc.tdf),
+ CORBA::NO_MEMORY ());
+ ACE_CHECK_RETURN (CosTime::UTO::_nil ());
+
+ return uto->_this (ACE_ENV_SINGLE_ARG_PARAMETER);
+}
+
+// This creates a new TIO with the given parameters.
+
+CosTime::TIO_ptr
+TAO_Time_Service_Server::new_interval (TimeBase::TimeT lower,
+ TimeBase::TimeT upper
+ ACE_ENV_ARG_DECL)
+ ACE_THROW_SPEC ((CORBA::SystemException))
+{
+ TAO_TIO *tio = 0;
+
+ ACE_NEW_THROW_EX (tio,
+ TAO_TIO (lower,
+ upper),
+ CORBA::NO_MEMORY ());
+ ACE_CHECK_RETURN (CosTime::TIO::_nil ());
+
+ return tio->_this (ACE_ENV_SINGLE_ARG_PARAMETER);
+}
+
+TAO_END_VERSIONED_NAMESPACE_DECL
diff --git a/TAO/orbsvcs/orbsvcs/Time/TAO_Time_Service_Server.h b/TAO/orbsvcs/orbsvcs/Time/TAO_Time_Service_Server.h
new file mode 100644
index 00000000000..c87d563935a
--- /dev/null
+++ b/TAO/orbsvcs/orbsvcs/Time/TAO_Time_Service_Server.h
@@ -0,0 +1,87 @@
+// -*- C++ -*-
+
+//=============================================================================
+/**
+ * @file TAO_Time_Service_Server.h
+ *
+ * $Id$
+ *
+ * This class implements the CosTime::TimeService IDL interface.
+ *
+ *
+ * @author Vishal Kachroo <vishal@cs.wustl.edu>
+ */
+//=============================================================================
+
+
+#ifndef TAO_TIME_SERVICE_SERVER_H
+#define TAO_TIME_SERVICE_SERVER_H
+#include /**/ "ace/pre.h"
+
+#include "orbsvcs/TimeServiceS.h"
+#include "orbsvcs/Time/time_export.h"
+
+TAO_BEGIN_VERSIONED_NAMESPACE_DECL
+
+/**
+ * @class TAO_Time_Service_Server
+ *
+ * @brief TimeService Object Implementation.
+ *
+ * The Object implementation implements methods to retrieve
+ * current time as well as secure current time. The times are
+ * retrieved as UTOs. The object also allows creation of a TIO
+ * for a given time interval. In general, the TimeService
+ * manages the UTOs and the TIOs. The notion of time returned
+ * here is the local time of the system.
+ */
+class TAO_Time_Export TAO_Time_Service_Server : public POA_CosTime::TimeService
+{
+
+public:
+ // = Initialization and termination methods.
+ /// Constructor.
+ TAO_Time_Service_Server (void);
+
+ /// Destructor.
+ ~TAO_Time_Service_Server (void);
+
+ /// This operation returns the current system time and an estimate of
+ /// inaccuracy in a UTO.
+ virtual CosTime::UTO_ptr universal_time (ACE_ENV_SINGLE_ARG_DECL)
+ ACE_THROW_SPEC ((CORBA::SystemException,
+ CosTime::TimeUnavailable));
+
+ /**
+ * This operation returns the current time in a UTO only if the time
+ * can be guaranteed to have been obtained securely. Currently this operation
+ * is not implemented and throws a CORBA::NO_IMPLEMENT exception, if called.
+ */
+ virtual CosTime::UTO_ptr secure_universal_time (ACE_ENV_SINGLE_ARG_DECL)
+ ACE_THROW_SPEC ((CORBA::SystemException,
+ CosTime::TimeUnavailable));
+
+ /// This creates a new UTO based on the given parameters.
+ virtual CosTime::UTO_ptr new_universal_time (TimeBase::TimeT time,
+ TimeBase::InaccuracyT inaccuracy,
+ TimeBase::TdfT tdf
+ ACE_ENV_ARG_DECL)
+ ACE_THROW_SPEC ((CORBA::SystemException));
+
+ /// This creates a new UTO given a time in the UtcT form.
+ virtual CosTime::UTO_ptr uto_from_utc (const TimeBase::UtcT &utc
+ ACE_ENV_ARG_DECL)
+ ACE_THROW_SPEC ((CORBA::SystemException));
+
+ /// This creates a new TIO with the given parameters.
+ virtual CosTime::TIO_ptr new_interval (TimeBase::TimeT lower,
+ TimeBase::TimeT upper
+ ACE_ENV_ARG_DECL)
+ ACE_THROW_SPEC ((CORBA::SystemException));
+
+};
+
+TAO_END_VERSIONED_NAMESPACE_DECL
+
+#include /**/ "ace/post.h"
+#endif /* TAO_TIME_SERVICE_SERVER_H */
diff --git a/TAO/orbsvcs/orbsvcs/Time/TAO_UTO.cpp b/TAO/orbsvcs/orbsvcs/Time/TAO_UTO.cpp
new file mode 100644
index 00000000000..c9ea818a549
--- /dev/null
+++ b/TAO/orbsvcs/orbsvcs/Time/TAO_UTO.cpp
@@ -0,0 +1,246 @@
+// -*- C++ -*-
+// $Id$
+
+#include "orbsvcs/Time/TAO_UTO.h"
+#include "orbsvcs/Time/TAO_TIO.h"
+#include "ace/OS.h"
+
+
+ACE_RCSID (Time,
+ TAO_UTO,
+ "$Id$")
+
+
+TAO_BEGIN_VERSIONED_NAMESPACE_DECL
+
+TAO_UTO::TAO_UTO (TimeBase::TimeT time,
+ TimeBase::InaccuracyT inaccuracy,
+ TimeBase::TdfT tdf)
+{
+
+ this->attr_utc_time_.time = time;
+
+ // Extract the lower 32 bits in the inacclo.
+ this->attr_utc_time_.inacclo = (CORBA::ULong) ACE_U64_TO_U32 (inaccuracy);
+
+ // Extract the lower 16 bits of the remaining bits. 'And'ing with 0xFFFF
+ // is only a sanity check.
+
+#if defined (ACE_LACKS_U_LONGLONG_T)
+ this->attr_utc_time_.inacchi = 0;
+#else
+ this->attr_utc_time_.inacchi =
+ static_cast<CORBA::UShort> ((inaccuracy >> 32U) & 0xFFFF);
+
+#endif /* ACE_LACKS_U_LONGLONG_T */
+
+ this->attr_utc_time_.tdf = tdf;
+
+}
+
+// Destructor.
+
+TAO_UTO::~TAO_UTO (void)
+{
+}
+
+// Get Method for the readonly attribute time.
+
+TimeBase::TimeT
+TAO_UTO::time (ACE_ENV_SINGLE_ARG_DECL_NOT_USED)
+ ACE_THROW_SPEC ((CORBA::SystemException))
+{
+ return attr_utc_time_.time;
+}
+
+// Get method for the readonly attribute inaccuracy.
+
+TimeBase::InaccuracyT
+TAO_UTO::inaccuracy (ACE_ENV_SINGLE_ARG_DECL_NOT_USED)
+ ACE_THROW_SPEC ((CORBA::SystemException))
+{
+ // Construct the Inaccuracy from the
+ // inacchi and inacclo.
+
+ TimeBase::InaccuracyT inaccuracy = attr_utc_time_.inacchi;
+ inaccuracy <<= 32;
+ inaccuracy |= attr_utc_time_.inacclo;
+ return inaccuracy;
+}
+
+// Get method for the readonly attribute tdf.
+
+TimeBase::TdfT
+TAO_UTO::tdf (ACE_ENV_SINGLE_ARG_DECL_NOT_USED)
+ ACE_THROW_SPEC ((CORBA::SystemException))
+{
+ return attr_utc_time_.tdf;
+}
+
+// Get method for the readonly attribute utc_time.
+
+TimeBase::UtcT
+TAO_UTO::utc_time (ACE_ENV_SINGLE_ARG_DECL_NOT_USED)
+ ACE_THROW_SPEC ((CORBA::SystemException))
+{
+ return attr_utc_time_;
+}
+
+// Absolute time = Relative time + Base time. ?? Find out more about
+// the Base Time, UTC and Distributed Time Sync. Algos. [3].
+
+CosTime::UTO_ptr
+TAO_UTO::absolute_time (ACE_ENV_SINGLE_ARG_DECL_NOT_USED)
+ ACE_THROW_SPEC ((CORBA::SystemException))
+{
+ return CosTime::UTO::_nil ();
+}
+
+// Compares the time contained in the object with the time in the
+// supplied uto according to the supplied comparison type.
+
+CosTime::TimeComparison
+TAO_UTO::compare_time (CosTime::ComparisonType comparison_type,
+ CosTime::UTO_ptr uto
+ ACE_ENV_ARG_DECL)
+ ACE_THROW_SPEC ((CORBA::SystemException))
+{
+ TimeBase::TimeT uto_time = uto->time (ACE_ENV_SINGLE_ARG_PARAMETER);
+ ACE_CHECK_RETURN (CosTime::TCIndeterminate);
+
+ TimeBase::InaccuracyT this_inaccuracy =
+ this->inaccuracy (ACE_ENV_SINGLE_ARG_PARAMETER);
+ ACE_CHECK_RETURN (CosTime::TCIndeterminate);
+
+ TimeBase::InaccuracyT uto_inaccuracy =
+ uto->inaccuracy (ACE_ENV_SINGLE_ARG_PARAMETER);
+ ACE_CHECK_RETURN (CosTime::TCIndeterminate);
+
+ if (comparison_type == CosTime::MidC)
+ {
+ if (this->time () == uto_time)
+ {
+ return CosTime::TCEqualTo;
+ }
+ else if (this->time () > uto_time)
+ {
+ return CosTime::TCGreaterThan;
+ }
+ else
+ return CosTime::TCLessThan;
+ }
+ else if (this->time () == uto_time)
+ {
+ if (this_inaccuracy == 0U
+ && uto_inaccuracy == 0U)
+ {
+ return CosTime::TCEqualTo;
+ }
+ }
+ else
+ {
+ if (this->time () > uto_time)
+ {
+ if (this->time () - this_inaccuracy
+ > uto_time - uto_inaccuracy)
+ {
+ return CosTime::TCGreaterThan;
+ }
+ }
+ else if (this->time () + this_inaccuracy
+ < uto_time - uto_inaccuracy)
+ {
+ return CosTime::TCLessThan;
+ }
+ }
+
+ return CosTime::TCIndeterminate;
+}
+
+// Returns a TIO representing the time interval between the time in
+// the object and the time in the UTO passed as a parameter. The
+// interval returned is the interval between the mid-points of the two
+// UTOs. Inaccuracies are ignored. Note the result of this operation
+// is meaningless if the base times of UTOs are different.
+
+CosTime::TIO_ptr
+TAO_UTO::time_to_interval (CosTime::UTO_ptr uto
+ ACE_ENV_ARG_DECL)
+ ACE_THROW_SPEC ((CORBA::SystemException))
+{
+ TAO_TIO *tio = 0;
+
+ ACE_TRY
+ {
+ TimeBase::TimeT uto_time = uto->time (ACE_ENV_SINGLE_ARG_PARAMETER);
+ ACE_TRY_CHECK;
+
+ if (this->time () > uto_time)
+ {
+ ACE_NEW_THROW_EX (tio,
+ TAO_TIO (uto_time,
+ this->time ()),
+ CORBA::NO_MEMORY ());
+
+ ACE_TRY_CHECK;
+ }
+ else
+ {
+ ACE_NEW_THROW_EX (tio,
+ TAO_TIO (this->time (),
+ uto_time),
+ CORBA::NO_MEMORY ());
+
+ ACE_TRY_CHECK;
+ }
+ }
+ ACE_CATCHANY
+ {
+ ACE_PRINT_EXCEPTION (ACE_ANY_EXCEPTION, "Exception:");
+ return CosTime::TIO::_nil ();
+ }
+ ACE_ENDTRY;
+ ACE_CHECK_RETURN (CosTime::TIO::_nil ());
+
+ return tio->_this (ACE_ENV_SINGLE_ARG_PARAMETER);
+}
+
+// Returns a TIO object representing the error interval around the
+// time value in the UTO.
+
+CosTime::TIO_ptr
+TAO_UTO::interval (ACE_ENV_SINGLE_ARG_DECL)
+ ACE_THROW_SPEC ((CORBA::SystemException))
+{
+ TAO_TIO *tio = 0;
+
+ ACE_TRY
+ {
+ TimeBase::TimeT this_inaccuracy =
+ this->inaccuracy (ACE_ENV_SINGLE_ARG_PARAMETER);
+ ACE_TRY_CHECK;
+
+ TimeBase::TimeT lower =
+ this->time () - this_inaccuracy;
+
+ TimeBase::TimeT upper =
+ this->time () + this_inaccuracy;
+
+ ACE_NEW_THROW_EX (tio,
+ TAO_TIO (lower,
+ upper),
+ CORBA::NO_MEMORY ());
+ ACE_TRY_CHECK;
+ }
+ ACE_CATCHANY
+ {
+ ACE_PRINT_EXCEPTION (ACE_ANY_EXCEPTION, "Exception:");
+ return CosTime::TIO::_nil ();
+ }
+ ACE_ENDTRY;
+ ACE_CHECK_RETURN (CosTime::TIO::_nil ());
+
+ return tio->_this (ACE_ENV_SINGLE_ARG_PARAMETER);
+}
+
+TAO_END_VERSIONED_NAMESPACE_DECL
diff --git a/TAO/orbsvcs/orbsvcs/Time/TAO_UTO.h b/TAO/orbsvcs/orbsvcs/Time/TAO_UTO.h
new file mode 100644
index 00000000000..b4e72e090da
--- /dev/null
+++ b/TAO/orbsvcs/orbsvcs/Time/TAO_UTO.h
@@ -0,0 +1,119 @@
+// -*- C++ -*-
+
+//=============================================================================
+/**
+ * @file TAO_UTO.h
+ *
+ * $Id$
+ *
+ * This class implements the CosTime::UTO IDL interface.
+ *
+ *
+ * @author Vishal Kachroo <vishal@cs.wustl.edu>
+ */
+//=============================================================================
+
+
+#ifndef TAO_UTO_H
+#define TAO_UTO_H
+#include /**/ "ace/pre.h"
+
+#include "orbsvcs/TimeServiceS.h"
+#include "orbsvcs/Time/time_export.h"
+
+TAO_BEGIN_VERSIONED_NAMESPACE_DECL
+
+/**
+ * @class TAO_UTO
+ *
+ * @brief Universal Time Object Implementation.
+ *
+ * This is an encapsulation of the time. It provides the following
+ * operations on basic time.
+ * - Construction of a UTO from piece parts, and extraction of the
+ * piece parts from a UTO. The piece parts are the readonly
+ * attributes :
+ * time
+ * inaccuracy
+ * time displacement factor
+ * structure with all the above.
+ * - Comparison of time.
+ * - Conversion from relative to absolute time, and conversion to
+ * an interval (TIO).
+ */
+class TAO_Time_Export TAO_UTO : public POA_CosTime::UTO
+{
+public:
+ // = Initialization and termination methods.
+ /// Constructor.
+ TAO_UTO (TimeBase::TimeT time,
+ TimeBase::InaccuracyT inaccuracy,
+ TimeBase::TdfT tdf);
+
+ /// Destructor.
+ ~TAO_UTO (void);
+
+ /// For the readonly attribute <time>.
+ virtual TimeBase::TimeT time (
+ ACE_ENV_SINGLE_ARG_DECL_WITH_DEFAULTS)
+ ACE_THROW_SPEC ((CORBA::SystemException));
+
+ /// For the readonly attribute <inaccuracy>.
+ virtual TimeBase::InaccuracyT inaccuracy (ACE_ENV_SINGLE_ARG_DECL)
+ ACE_THROW_SPEC ((CORBA::SystemException));
+
+ /// For the readonly attribute <tdf>, which is the "time displacement
+ /// factor".
+ virtual TimeBase::TdfT tdf (ACE_ENV_SINGLE_ARG_DECL)
+ ACE_THROW_SPEC ((CORBA::SystemException));
+
+ /// For the readonly attribute <utc_time>.
+ virtual TimeBase::UtcT utc_time (ACE_ENV_SINGLE_ARG_DECL)
+ ACE_THROW_SPEC ((CORBA::SystemException));
+
+ /**
+ * Absolute time = Relative time + Base time.
+ * ?? Find out more about the Base Time, UTC and
+ * Distributed Time Sync. Algos. [3
+ */
+ CosTime::UTO_ptr absolute_time (ACE_ENV_SINGLE_ARG_DECL)
+ ACE_THROW_SPEC ((CORBA::SystemException));
+
+ /// Compares the time contained in the object with the time in the
+ /// supplied uto according to the supplied comparison type.
+ CosTime::TimeComparison compare_time (CosTime::ComparisonType comparison_type,
+ CosTime::UTO_ptr uto
+ ACE_ENV_ARG_DECL)
+ ACE_THROW_SPEC ((CORBA::SystemException));
+
+ /**
+ * Returns a TIO representing the time interval between the time in
+ * the object and the time in the UTO passed as a parameter. The
+ * interval returned is the interval between the mid-points of the
+ * two UTOs. Inaccuracies are ignored. Note the result of this
+ * operation is meaningless if the base times of UTOs are different.
+ */
+ CosTime::TIO_ptr time_to_interval (CosTime::UTO_ptr
+ ACE_ENV_ARG_DECL)
+ ACE_THROW_SPEC ((CORBA::SystemException));
+
+ /// Returns a TIO object representing the error interval around the
+ /// time value in the UTO.
+ CosTime::TIO_ptr interval (ACE_ENV_SINGLE_ARG_DECL)
+ ACE_THROW_SPEC ((CORBA::SystemException));
+
+private:
+ /**
+ * The readonly attribute structure having the time, inaccuracy and
+ * displacement. The get methods for other readonly attributes
+ * (time, inaccuracy, tdf) defined in the IDL use the members of
+ * this structure and hence need not have separate member variables
+ * for them.
+ */
+ TimeBase::UtcT attr_utc_time_;
+};
+
+TAO_END_VERSIONED_NAMESPACE_DECL
+
+#include /**/ "ace/post.h"
+#endif /* TAO_UTO_H */
diff --git a/TAO/orbsvcs/orbsvcs/Time/Timer_Helper.cpp b/TAO/orbsvcs/orbsvcs/Time/Timer_Helper.cpp
new file mode 100644
index 00000000000..47923f8dba3
--- /dev/null
+++ b/TAO/orbsvcs/orbsvcs/Time/Timer_Helper.cpp
@@ -0,0 +1,156 @@
+#include "orbsvcs/Time/Timer_Helper.h"
+#include "orbsvcs/Time/TAO_Time_Service_Clerk.h"
+
+#include "tao/debug.h"
+
+#include "ace/OS_NS_time.h"
+#include "ace/OS_NS_sys_time.h"
+
+ACE_RCSID (Time,
+ Timer_Helper,
+ "$Id$")
+
+
+TAO_BEGIN_VERSIONED_NAMESPACE_DECL
+
+Timer_Helper::Timer_Helper (void)
+ : clerk_ (0)
+{
+}
+
+Timer_Helper::Timer_Helper (TAO_Time_Service_Clerk *clerk)
+ : clerk_ (clerk)
+{
+
+}
+
+Timer_Helper::~Timer_Helper (void)
+{
+}
+
+int
+Timer_Helper::handle_timeout (const ACE_Time_Value &,
+ const void *)
+{
+ int no_of_servers = 0;
+ CORBA::ULongLong sum = 0;
+
+ // The following are used to keep a track of the inaccuracy
+ // in synchronization.
+
+#if defined (ACE_LACKS_LONGLONG_T)
+ CORBA::ULongLong lowest_time (0xFFFFFFFF, 0xFFFFFFFF);
+#else
+ CORBA::ULongLong lowest_time = ACE_UINT64_LITERAL (0xFFFFFFFFFFFFFFFF);
+#endif
+
+ CORBA::ULongLong highest_time = 0;
+
+ ACE_DECLARE_NEW_CORBA_ENV;
+ ACE_TRY
+ {
+ IORS::TYPE* value;
+ for (IORS::ITERATOR server_iterator (this->clerk_->server_);
+ server_iterator.next (value) != 0;
+ server_iterator.advance ())
+ {
+ // This is a remote call.
+ CosTime::UTO_var UTO_server =
+ (*value)->universal_time (ACE_ENV_SINGLE_ARG_PARAMETER);
+ ACE_TRY_CHECK;
+
+#if defined (ACE_LACKS_LONGLONG_T)
+
+ if (TAO_debug_level > 0)
+ ACE_DEBUG ((LM_DEBUG,
+ "\nTime = %Q\nInaccuracy = %Q\nTimeDiff = %d\nstruct.time = %Q\n"
+ "struct.inacclo = %d\nstruct.inacchi = %d\nstruct.Tdf = %d\n",
+ ACE_U64_TO_U32 (UTO_server->time ()),
+ ACE_U64_TO_U32 (UTO_server->inaccuracy ()),
+ UTO_server->tdf (),
+ ACE_U64_TO_U32 ((UTO_server->utc_time ()).time),
+ (UTO_server->utc_time ()).inacclo,
+ (UTO_server->utc_time ()).inacchi,
+ (UTO_server->utc_time ()).tdf));
+
+#else
+
+ if (TAO_debug_level > 0)
+ ACE_DEBUG ((LM_DEBUG,
+ "\nTime = %Q\nInaccuracy = %Q\nTimeDiff = %d\nstruct.time = %Q\n"
+ "struct.inacclo = %d\nstruct.inacchi = %d\nstruct.Tdf = %d\n",
+ UTO_server->time (),
+ UTO_server->inaccuracy (),
+ UTO_server->tdf (),
+ (UTO_server->utc_time ()).time,
+ (UTO_server->utc_time ()).inacclo,
+ (UTO_server->utc_time ()).inacchi,
+ (UTO_server->utc_time ()).tdf));
+#endif
+
+ CORBA::ULongLong curr_server_time =
+ UTO_server->time (ACE_ENV_SINGLE_ARG_PARAMETER);
+ ACE_TRY_CHECK;
+
+ sum += curr_server_time;
+
+ ++no_of_servers;
+
+ // Set the highest time to the largest time seen so far.
+ if (curr_server_time > highest_time)
+ highest_time = curr_server_time;
+
+ // Set the lowest time to the smallest time seen so far.
+ if (curr_server_time < lowest_time)
+ lowest_time = curr_server_time;
+
+ }
+
+ if (TAO_debug_level > 0)
+ ACE_DEBUG ((LM_DEBUG,
+ "\nUpdated time from %d servers in the network",
+ no_of_servers));
+
+ // Return the average of the times retrieved from the various
+ // servers.
+ clerk_->time_ = sum / no_of_servers ;
+
+ // Set the Time Displacement Factor. The TZ environment variable is
+ // read to set the time zone. We convert the timezone value from seconds
+ // to minutes.
+
+ ACE_OS::tzset ();
+ long arg = ACE_OS::timezone () / 60;
+ CORBA::Short goodarg = static_cast<CORBA::Short> (arg);
+ clerk_->time_displacement_factor (goodarg);
+
+ // Set the inaccuracy.
+ if (highest_time > lowest_time)
+ clerk_->inaccuracy (highest_time - lowest_time);
+ else
+ clerk_->inaccuracy (0);
+
+ const ACE_Time_Value timeofday = ACE_OS::gettimeofday ();
+
+ // Record the current time in a timestamp to know when global
+ // updation of time was done.
+ clerk_->update_timestamp_ =
+ static_cast<CORBA::ULongLong> (timeofday.sec ()) *
+ static_cast<ACE_UINT32> (10000000) +
+ static_cast<CORBA::ULongLong> (timeofday.usec () * 10);
+ }
+ ACE_CATCHANY
+ {
+ if (TAO_debug_level > 0)
+ ACE_PRINT_EXCEPTION (ACE_ANY_EXCEPTION,
+ "Exception in handle_timeout()\n");
+
+ return -1;
+ }
+ ACE_ENDTRY;
+ ACE_CHECK_RETURN (-1);
+
+ return 0;
+}
+
+TAO_END_VERSIONED_NAMESPACE_DECL
diff --git a/TAO/orbsvcs/orbsvcs/Time/Timer_Helper.h b/TAO/orbsvcs/orbsvcs/Time/Timer_Helper.h
new file mode 100644
index 00000000000..9bfd7297661
--- /dev/null
+++ b/TAO/orbsvcs/orbsvcs/Time/Timer_Helper.h
@@ -0,0 +1,80 @@
+// -*- C++ -*-
+
+//=============================================================================
+/**
+ * @file Timer_Helper.h
+ *
+ * $Id$
+ *
+ * This class is registered with the Reactor and extends from the
+ * event handler.It is a friend of the TAO_Time_Service_Clerk and
+ * helps to update the clerk's notion of globally synchronized
+ * time. This class obviates the need for multiple inheritance in
+ * the clerk.
+ *
+ * @author Vishal Kachroo <vishal@cs.wustl.edu>
+ */
+//=============================================================================
+
+
+#ifndef TIMER_HELPER_H
+#define TIMER_HELPER_H
+
+#include /**/ "ace/pre.h"
+
+
+#include "ace/Event_Handler.h"
+#include "ace/Containers.h"
+#include "orbsvcs/Time/time_export.h"
+
+#include "orbsvcs/TimeServiceS.h"
+
+#if !defined (ACE_LACKS_PRAGMA_ONCE)
+# pragma once
+#endif /* ACE_LACKS_PRAGMA_ONCE */
+
+TAO_BEGIN_VERSIONED_NAMESPACE_DECL
+
+class TAO_Time_Service_Clerk;
+
+/**
+ * @class Timer_Helper
+ *
+ * @brief Timer Helper for the clerk.
+ *
+ * The handle timeout method of this class is called periodically
+ * by the reactor. This method updates the clerk's notion of
+ * globally synchronized time by contacting the various Time
+ * Servers.
+ */
+class TAO_Time_Export Timer_Helper : public ACE_Event_Handler
+{
+public:
+ // = Initialization and termination methods.
+ /// Constructor.
+ Timer_Helper (void);
+
+ /// Destructor.
+ ~Timer_Helper (void);
+
+ /// Constructor that sets the clerk.
+ Timer_Helper (TAO_Time_Service_Clerk *clerk);
+
+ /// This method is called periodically by the Reactor to update the
+ /// clerk's time.
+ int handle_timeout (const ACE_Time_Value &time,
+ const void *arg);
+
+protected:
+ /// Clerk's instance that this class helps to update time.
+ TAO_Time_Service_Clerk *clerk_;
+
+ /// The set of server IORs.
+ typedef ACE_Array_Base<CosTime::TimeService_var> IORS;
+};
+
+TAO_END_VERSIONED_NAMESPACE_DECL
+
+#include /**/ "ace/post.h"
+
+#endif /* TIMER_HELPER_H */
diff --git a/TAO/orbsvcs/orbsvcs/Time/time_export.h b/TAO/orbsvcs/orbsvcs/Time/time_export.h
new file mode 100644
index 00000000000..53e8ff6bf74
--- /dev/null
+++ b/TAO/orbsvcs/orbsvcs/Time/time_export.h
@@ -0,0 +1,40 @@
+
+// -*- C++ -*-
+// $Id$
+// Definition for Win32 Export directives.
+// This file is generated automatically by generate_export_file.pl
+// ------------------------------
+#ifndef TAO_TIME_EXPORT_H
+#define TAO_TIME_EXPORT_H
+
+#include "ace/config-all.h"
+
+#if defined (TAO_AS_STATIC_LIBS)
+# if !defined (TAO_TIME_HAS_DLL)
+# define TAO_TIME_HAS_DLL 0
+# endif /* ! TAO_TIME_HAS_DLL */
+#else
+# if !defined (TAO_TIME_HAS_DLL)
+# define TAO_TIME_HAS_DLL 1
+# endif /* ! TAO_TIME_HAS_DLL */
+#endif
+
+#if defined (TAO_TIME_HAS_DLL) && (TAO_TIME_HAS_DLL == 1)
+# if defined (TAO_TIME_BUILD_DLL)
+# define TAO_Time_Export ACE_Proper_Export_Flag
+# define TAO_TIME_SINGLETON_DECLARATION(T) ACE_EXPORT_SINGLETON_DECLARATION (T)
+# define TAO_TIME_SINGLETON_DECLARE(SINGLETON_TYPE, CLASS, LOCK) ACE_EXPORT_SINGLETON_DECLARE(SINGLETON_TYPE, CLASS, LOCK)
+# else /* TAO_TIME_BUILD_DLL */
+# define TAO_Time_Export ACE_Proper_Import_Flag
+# define TAO_TIME_SINGLETON_DECLARATION(T) ACE_IMPORT_SINGLETON_DECLARATION (T)
+# define TAO_TIME_SINGLETON_DECLARE(SINGLETON_TYPE, CLASS, LOCK) ACE_IMPORT_SINGLETON_DECLARE(SINGLETON_TYPE, CLASS, LOCK)
+# endif /* TAO_TIME_BUILD_DLL */
+#else /* TAO_TIME_HAS_DLL == 1 */
+# define TAO_Time_Export
+# define TAO_TIME_SINGLETON_DECLARATION(T)
+# define TAO_TIME_SINGLETON_DECLARE(SINGLETON_TYPE, CLASS, LOCK)
+#endif /* TAO_TIME_HAS_DLL == 1 */
+
+#endif /* TAO_TIME_EXPORT_H */
+
+// End of auto generated file.
diff --git a/TAO/orbsvcs/orbsvcs/TimeBase.idl b/TAO/orbsvcs/orbsvcs/TimeBase.idl
new file mode 100644
index 00000000000..40a51d7de8a
--- /dev/null
+++ b/TAO/orbsvcs/orbsvcs/TimeBase.idl
@@ -0,0 +1,16 @@
+//
+// $Id$
+//
+
+#ifndef _TIME_BASE_IDL_
+#define _TIME_BASE_IDL_
+
+// Force the IDL compiler to include this file [it does not include
+// empty files]
+#pragma prefix "omg.org"
+
+#include "tao/TimeBase.pidl"
+
+#pragma prefix ""
+
+#endif /* _TIME_BASE_IDL_ */
diff --git a/TAO/orbsvcs/orbsvcs/TimeService.idl b/TAO/orbsvcs/orbsvcs/TimeService.idl
new file mode 100644
index 00000000000..c146223f83f
--- /dev/null
+++ b/TAO/orbsvcs/orbsvcs/TimeService.idl
@@ -0,0 +1,179 @@
+// -*- C++ -*-
+// $Id$
+
+#ifndef TAO_TIME_IDL
+#define TAO_TIME_IDL
+
+#include "TimeBase.idl"
+
+#pragma prefix "omg.org"
+
+module CosTime
+{
+ // = TITLE
+ // CosTime Module
+ //
+ // = DESCRIPTION
+ // This module has all the interfaces, and associated enum
+ // and exception declarations for the time service.
+
+ enum TimeComparison
+ {
+ // = TITLE
+ // TimeComparison defines the possible values that can be
+ // returned as a result of comparing two UTOs.
+
+ TCEqualTo,
+ TCLessThan,
+ TCGreaterThan,
+ TCIndeterminate
+ };
+
+ enum ComparisonType
+ {
+ // = TITLE
+ // ComparisonType defines the possible ways in which the times can
+ // be compared.
+
+ IntervalC,
+ MidC
+ };
+
+ enum OverlapType
+ {
+ // = TITLE
+ // OverlapType specifies the type of overlap between two time
+ // intervals.
+
+ OTContainer,
+ OTContained,
+ OTOverlap,
+ OTNoOverlap
+ };
+
+ exception TimeUnavailable
+ {
+ // = TITLE
+ // TimeUnavailable exception is raised by the Timeservice when
+ // it cannot successfully return time.
+ };
+
+ interface TIO; // forward declaration.
+
+ interface UTO
+ {
+ // = TITLE
+ // The interface UTO is an encapsulation of time.
+ //
+ // = DESCRIPTION
+ // This interface provides the following
+ // operations on basic time :
+ // - Construction of a UTO from piece parts, and extraction of the
+ // piece parts from a UTO. The piece parts are the readonly
+ // attributes :
+ // time
+ // inaccuracy
+ // time displacement factor
+ // structure with all the above.
+ //
+ // - Comparison of time.
+ //
+ // - Conversion from relative to absolute time, and conversion to
+ // an interval (TIO)
+
+ readonly attribute TimeBase::TimeT time;
+ // absolute tine value.
+
+ readonly attribute TimeBase::InaccuracyT inaccuracy;
+ // inaccuracy in the time.
+
+ readonly attribute TimeBase::TdfT tdf;
+ // the time displacement factor.
+
+ readonly attribute TimeBase::UtcT utc_time;
+ // structure having the absolute time, the inaccuracy and the time
+ // displacement factor.
+
+ UTO absolute_time ();
+ // This returns the absolute time by adding the base time to the
+ // relative time in the object.
+
+ TimeComparison compare_time (in ComparisonType comparison_type,
+ in UTO otu);
+ // Compares the time contained in the object with the time in
+ // the supplied uto according to the supplied comparison type.
+
+ TIO time_to_interval (in UTO otu);
+ // Returns a TIO representing the time interval between the time
+ // in the object and the time in the UTO passed as a
+ // parameter. The interval returned is the interval between the
+ // mid-points of the two UTOs. Inaccuracies are ignored. Note
+ // the result of this operation is meaningless if the base times
+ // of UTOs are different.
+
+ TIO interval ();
+ // Returns a TIO object representing the error interval around
+ // the time value in the UTO.
+ };
+
+ interface TIO
+ {
+ // = TITLE
+ // The TIO represents a time interval.
+ //
+ // = DESCRIPTION
+ // This interface has operations to compare itself with a UTO or
+ // another TIO. It also has an operation to create a UTO from
+ // the value of it's time interval.
+
+ readonly attribute TimeBase::IntervalT time_interval;
+ // Consists of a lower and an upper bound for the time interval.
+
+ CosTime::OverlapType spans (in UTO time,
+ out TIO overlap);
+ // This operation compares the time in this interface with the time
+ // in the supplied UTO and returns the overlap type as well as the
+ // interval of overlap in the form of a TIO.
+
+ CosTime::OverlapType overlaps (in TIO interval,
+ out TIO overlap);
+ // This operation compares the time in this interface with the time
+ // in the supplied TIO and returns the overlap type as well as the
+ // interval of overlap in the form of a TIO.
+
+ UTO time ();
+ // Converts the time interval in this interface into a UTO object by
+ // taking the midpoint of the interval as the time and the interval
+ // as the error envelope around the time.
+
+ };
+
+ interface TimeService
+ {
+ // = TITLE
+ // The time service manages the UTOs and the TIOs. This is the first
+ // interface seen by the clients requesting time.
+
+ UTO universal_time () raises (TimeUnavailable);
+ // This operation returns the current time and an estimate of
+ // inaccuracy in a UTO.
+
+ UTO secure_universal_time () raises(TimeUnavailable);
+ // This operation returns the current time in a UTO only if the
+ // time can be guaranteed to have been obtained securely.
+
+ UTO new_universal_time (in TimeBase::TimeT time,
+ in TimeBase::InaccuracyT inaccuracy,
+ in TimeBase::TdfT tdf);
+ // This creates a new UTO based on the given parameters.
+
+ UTO uto_from_utc (in TimeBase::UtcT utc);
+ // This creates a new UTO given a time in the UtcT form.
+
+ TIO new_interval (in TimeBase::TimeT lower,
+ in TimeBase::TimeT upper );
+ // This creates a new TIO with the given parameters.
+ };
+};
+
+#endif /* TAO_TIME_IDL */
diff --git a/TAO/orbsvcs/orbsvcs/Time_Utilities.cpp b/TAO/orbsvcs/orbsvcs/Time_Utilities.cpp
new file mode 100644
index 00000000000..80152580eb5
--- /dev/null
+++ b/TAO/orbsvcs/orbsvcs/Time_Utilities.cpp
@@ -0,0 +1,22 @@
+// $Id$
+
+#include "orbsvcs/Time_Utilities.h"
+
+#if !defined (__ACE_INLINE__)
+# include "orbsvcs/Time_Utilities.i"
+#endif /* __ACE_INLINE__ */
+
+ACE_RCSID(orbsvcs, Time_Utilities, "$Id$")
+
+TAO_BEGIN_VERSIONED_NAMESPACE_DECL
+
+// Number of nanoseconds between CORBA and POSIX epochs.
+#ifdef ACE_LACKS_LONGLONG_T
+const ACE_UINT64
+ORBSVCS_Time::Time_Base_Offset(0x82B60000, 0x0A990E2D6);
+#else
+const ACE_UINT64
+ORBSVCS_Time::Time_Base_Offset(ACE_UINT64_LITERAL(12218515200000000000));
+#endif
+
+TAO_END_VERSIONED_NAMESPACE_DECL
diff --git a/TAO/orbsvcs/orbsvcs/Time_Utilities.h b/TAO/orbsvcs/orbsvcs/Time_Utilities.h
new file mode 100644
index 00000000000..8a471f31521
--- /dev/null
+++ b/TAO/orbsvcs/orbsvcs/Time_Utilities.h
@@ -0,0 +1,111 @@
+// -*- C++ -*-
+
+// $Id$
+
+// ============================================================================
+//
+// = LIBRARY
+// orbsvcs
+//
+// = FILENAME
+// Time_Utilities.h
+//
+// = AUTHOR
+// David Levine <levine@cs.wustl.edu>
+//
+// ============================================================================
+
+#ifndef ORBSVCS_TIME_UTILITIES_H
+#define ORBSVCS_TIME_UTILITIES_H
+#include /**/ "ace/pre.h"
+
+#include "orbsvcs/TimeBaseC.h"
+#include "orbsvcs/svc_utils_export.h"
+#include "ace/OS_NS_time.h"
+
+TAO_BEGIN_VERSIONED_NAMESPACE_DECL
+
+/**
+ * @class ORBSVCS_Time
+ *
+ * @brief Time conversion utilities.
+ *
+ * This class defines several static methods to convert between
+ * several ACE time structures and the CORBA TimeT structure.
+ *
+ * Recall that TimeBase::TimeT stores time in a 64-bit long long
+ * (or structure when that is not available) and uses hundreds of
+ * nanoseconds as time units (i.e. 1 second is 10^7 TimeT units).
+ *
+ * To convert between the CORBA and the UNIX epochs, we need to adjust
+ * absolute times by the difference between October 15th, 1582 (Julian
+ * Date 2299160.5) and January 1st, 1970 (Julian Date 2440578.5):
+ * 141418.0 days.
+ */
+class TAO_Svc_Utils_Export ORBSVCS_Time
+{
+public:
+ /// @brief A helper constant, IDL does not have constant for structures.
+ static TimeBase::TimeT zero ();
+
+ /**
+ * @name ACE_hrtime_t conversion routines
+ */
+ //@{
+ // We interpret an ACE_hrtime_t as nanoseconds.
+
+ /// @brief Convert relative high-resolution time to a <TimeBase::TimeT>.
+ static void hrtime_to_TimeT (TimeBase::TimeT &lhs,
+ ACE_hrtime_t rhs);
+
+ /// @brief Convert relative <TimeBase::TimeT> to a high-resolution time.
+ static void TimeT_to_hrtime (ACE_hrtime_t &lhs,
+ const TimeBase::TimeT &rhs);
+
+ /// @brief Convert relative <TimeBase::TimeT> to a high-resolution time.
+ static ACE_hrtime_t to_hrtime (const TimeBase::TimeT &t);
+ //@}
+
+
+ /**
+ * @name ACE_Time_Value conversion routines
+ */
+ //@{
+ // Recall that <ACE_Time_Value>s are <seconds, useconds> pairs.
+
+ /// @brief Convert relative <ACE_Time_Value> to a <TimeBase::TimeT>.
+ static void Time_Value_to_TimeT (TimeBase::TimeT& lhs,
+ const ACE_Time_Value& rhs);
+
+ /// @brief Convert relative <TimeBase::TimeT> to a <ACE_Time_Value>.
+ static void TimeT_to_Time_Value (ACE_Time_Value& lrs,
+ const TimeBase::TimeT& rhs);
+
+ /// @brief Convert relative <TimeBase::TimeT> to a <ACE_Time_Value>.
+ static ACE_Time_Value to_Time_Value (const TimeBase::TimeT &rhs);
+
+ /// @brief Convert absolute <ACE_Time_Value> to a <TimeBase::TimeT>
+ static void Absolute_Time_Value_to_TimeT (TimeBase::TimeT& lhs,
+ const ACE_Time_Value& rhs);
+
+ /// @brief Convert absolute <TimeBase::TimeT> to a <ACE_Time_Value>
+ static void Absolute_TimeT_to_Time_Value (ACE_Time_Value& lrs,
+ const TimeBase::TimeT& rhs);
+
+ /// @brief Convert absolute <TimeBase::TimeT> to a <ACE_Time_Value>.
+ static ACE_Time_Value to_Absolute_Time_Value (const TimeBase::TimeT &rhs);
+ //@}
+
+private:
+ /// @brief Number of nanoseconds between the CORBA and UNIX epochs.
+ static const ACE_UINT64 Time_Base_Offset;
+};
+
+TAO_END_VERSIONED_NAMESPACE_DECL
+
+#if defined (__ACE_INLINE__)
+#include "orbsvcs/Time_Utilities.i"
+#endif /* __ACE_INLINE__ */
+
+#include /**/ "ace/post.h"
+#endif /* ORBSVCS_TIME_UTILITIES_H */
diff --git a/TAO/orbsvcs/orbsvcs/Time_Utilities.i b/TAO/orbsvcs/orbsvcs/Time_Utilities.i
new file mode 100644
index 00000000000..f7531f657f3
--- /dev/null
+++ b/TAO/orbsvcs/orbsvcs/Time_Utilities.i
@@ -0,0 +1,103 @@
+// -*- C++ -*-
+//
+// $Id$
+
+#include "ace/Time_Value.h"
+
+TAO_BEGIN_VERSIONED_NAMESPACE_DECL
+
+ACE_INLINE TimeBase::TimeT
+ORBSVCS_Time::zero ()
+{
+ return 0;
+}
+
+ACE_INLINE void
+ORBSVCS_Time::TimeT_to_hrtime (ACE_hrtime_t &lhs,
+ const TimeBase::TimeT& rhs)
+{
+ lhs = rhs;
+ lhs *= 100;
+}
+
+ACE_INLINE void
+ORBSVCS_Time::hrtime_to_TimeT (TimeBase::TimeT& lhs,
+ ACE_hrtime_t rhs)
+{
+ ACE_UINT64 t = rhs / 100; // convert to 100ns
+ lhs = t;
+}
+
+ACE_INLINE ACE_hrtime_t
+ORBSVCS_Time::to_hrtime (const TimeBase::TimeT& t)
+{
+ ACE_hrtime_t r;
+ ORBSVCS_Time::TimeT_to_hrtime (r, t);
+ return r;
+}
+
+ACE_INLINE void
+ORBSVCS_Time::Time_Value_to_TimeT (TimeBase::TimeT& lhs,
+ const ACE_Time_Value& rhs)
+{
+ ACE_hrtime_t t =
+ static_cast<ACE_hrtime_t> (rhs.sec ()) * ACE_U_ONE_SECOND_IN_NSECS +
+ static_cast<ACE_hrtime_t> (rhs.usec ()) * 1000u;
+
+ ORBSVCS_Time::hrtime_to_TimeT (lhs, t);
+}
+
+ACE_INLINE void
+ORBSVCS_Time::TimeT_to_Time_Value (ACE_Time_Value& lhs,
+ const TimeBase::TimeT& rhs)
+{
+ ACE_hrtime_t t;
+
+ ORBSVCS_Time::TimeT_to_hrtime (t, rhs);
+
+ lhs.set (static_cast<ACE_UINT32> (t / ACE_U_ONE_SECOND_IN_NSECS),
+ static_cast<ACE_UINT32> ((t % ACE_U_ONE_SECOND_IN_NSECS) / 1000));
+}
+
+ACE_INLINE ACE_Time_Value
+ORBSVCS_Time::to_Time_Value (const TimeBase::TimeT& t)
+{
+ ACE_Time_Value r;
+ ORBSVCS_Time::TimeT_to_Time_Value (r, t);
+ return r;
+}
+
+ACE_INLINE void
+ORBSVCS_Time::Absolute_Time_Value_to_TimeT (TimeBase::TimeT& lhs,
+ const ACE_Time_Value& rhs)
+{
+ ACE_hrtime_t t =
+ static_cast<ACE_hrtime_t> (rhs.sec ()) * ACE_U_ONE_SECOND_IN_NSECS +
+ static_cast<ACE_hrtime_t> (rhs.usec ()) * 1000u;
+
+ t += Time_Base_Offset;
+ ORBSVCS_Time::hrtime_to_TimeT (lhs, t);
+}
+
+ACE_INLINE void
+ORBSVCS_Time::Absolute_TimeT_to_Time_Value (ACE_Time_Value& lhs,
+ const TimeBase::TimeT& rhs)
+{
+ ACE_hrtime_t t;
+
+ ORBSVCS_Time::TimeT_to_hrtime (t, rhs);
+ t -= Time_Base_Offset;
+
+ lhs.set(static_cast<ACE_UINT32> (t / ACE_U_ONE_SECOND_IN_NSECS),
+ static_cast<ACE_UINT32> ((t % ACE_U_ONE_SECOND_IN_NSECS) / 1000));
+}
+
+ACE_INLINE ACE_Time_Value
+ORBSVCS_Time::to_Absolute_Time_Value (const TimeBase::TimeT& t)
+{
+ ACE_Time_Value r;
+ ORBSVCS_Time::Absolute_TimeT_to_Time_Value (r, t);
+ return r;
+}
+
+TAO_END_VERSIONED_NAMESPACE_DECL
diff --git a/TAO/orbsvcs/orbsvcs/Trader/Constraint_Interpreter.cpp b/TAO/orbsvcs/orbsvcs/Trader/Constraint_Interpreter.cpp
new file mode 100644
index 00000000000..0db71ba50b0
--- /dev/null
+++ b/TAO/orbsvcs/orbsvcs/Trader/Constraint_Interpreter.cpp
@@ -0,0 +1,255 @@
+// $Id$
+
+#include "orbsvcs/Trader/Constraint_Interpreter.h"
+#include "orbsvcs/Trader/Trader_Constraint_Visitors.h"
+
+ACE_RCSID (Trader,
+ Constraint_Interpreter,
+ "$Id$")
+
+
+TAO_BEGIN_VERSIONED_NAMESPACE_DECL
+
+TAO_Constraint_Interpreter::TAO_Constraint_Interpreter (
+ const CosTradingRepos::ServiceTypeRepository::TypeStruct& ts,
+ const char* constraints
+ ACE_ENV_ARG_DECL
+ )
+ ACE_THROW_SPEC ((CosTrading::IllegalConstraint,
+ CORBA::NO_MEMORY))
+ : TAO_Interpreter ()
+{
+ // @@ Throwing Exception from constructor is very nasty situation to
+ // deal with.
+
+ TAO_Trader_Constraint_Validator type_checker (ts);
+
+ if (TAO_Interpreter::is_empty_string (constraints))
+ {
+ ACE_NEW_THROW_EX (this->root_,
+ TAO_Literal_Constraint ((CORBA::Boolean) 1),
+ CORBA::NO_MEMORY ());
+ ACE_CHECK;
+ }
+ else
+ {
+ if (this->build_tree (constraints) != 0)
+ ACE_THROW (CosTrading::IllegalConstraint (constraints));
+
+ if (type_checker.validate (this->root_) == -1)
+ ACE_THROW (CosTrading::IllegalConstraint (constraints));
+ }
+}
+
+TAO_Constraint_Interpreter::
+TAO_Constraint_Interpreter (TAO_Constraint_Validator& validator,
+ const char* constraints
+ ACE_ENV_ARG_DECL)
+ ACE_THROW_SPEC ((CosTrading::IllegalConstraint,
+ CORBA::NO_MEMORY))
+{
+ if (TAO_Interpreter::is_empty_string (constraints))
+ {
+ ACE_NEW_THROW_EX (this->root_,
+ TAO_Literal_Constraint ((CORBA::Boolean) 1),
+ CORBA::NO_MEMORY ());
+ ACE_CHECK;
+ }
+ else
+ {
+ if (this->build_tree (constraints) != 0)
+ ACE_THROW (CosTrading::IllegalConstraint (constraints));
+
+ if (validator.validate (this->root_) == -1)
+ ACE_THROW (CosTrading::IllegalConstraint (constraints));
+ }
+}
+
+TAO_Constraint_Interpreter::~TAO_Constraint_Interpreter (void)
+{
+}
+
+CORBA::Boolean
+TAO_Constraint_Interpreter::evaluate (CosTrading::Offer* offer)
+{
+ TAO_Trader_Constraint_Evaluator evaluator (offer);
+ return evaluator.evaluate_constraint (this->root_);
+}
+
+CORBA::Boolean
+TAO_Constraint_Interpreter::evaluate (TAO_Constraint_Evaluator& evaluator)
+{
+ return evaluator.evaluate_constraint (this->root_);
+}
+
+TAO_Preference_Interpreter::TAO_Preference_Interpreter (
+ const CosTradingRepos::ServiceTypeRepository::TypeStruct& ts,
+ const char* preference
+ ACE_ENV_ARG_DECL
+ )
+ ACE_THROW_SPEC ((CosTrading::Lookup::IllegalPreference,
+ CORBA::NO_MEMORY))
+ : TAO_Interpreter ()
+{
+ TAO_Trader_Constraint_Validator type_checker (ts);
+
+ if (TAO_Interpreter::is_empty_string (preference))
+ {
+ ACE_NEW_THROW_EX (this->root_,
+ TAO_Noop_Constraint (TAO_FIRST),
+ CORBA::NO_MEMORY ());
+ ACE_CHECK;
+ }
+ else
+ {
+ if (this->build_tree (preference) != 0)
+ ACE_THROW (CosTrading::Lookup::IllegalPreference (preference));
+
+ if (type_checker.validate (this->root_) == -1)
+ ACE_THROW (CosTrading::Lookup::IllegalPreference (preference));
+ }
+}
+
+TAO_Preference_Interpreter::
+TAO_Preference_Interpreter (TAO_Constraint_Validator& validator,
+ const char* preference
+ ACE_ENV_ARG_DECL)
+ ACE_THROW_SPEC ((CosTrading::Lookup::IllegalPreference,
+ CORBA::NO_MEMORY))
+ : TAO_Interpreter ()
+{
+ if (TAO_Interpreter::is_empty_string (preference))
+ {
+ ACE_NEW_THROW_EX (this->root_,
+ TAO_Noop_Constraint (TAO_FIRST),
+ CORBA::NO_MEMORY ());
+ ACE_CHECK;
+ }
+ else
+ {
+ if (this->build_tree (preference) != 0)
+ ACE_THROW (CosTrading::Lookup::IllegalPreference (preference));
+
+ if (validator.validate (this->root_) == -1)
+ ACE_THROW (CosTrading::Lookup::IllegalPreference (preference));
+ }
+}
+
+TAO_Preference_Interpreter::~TAO_Preference_Interpreter ()
+{
+}
+
+void
+TAO_Preference_Interpreter::
+order_offer (CosTrading::Offer* offer,
+ CosTrading::OfferId offer_id)
+{
+ TAO_Trader_Constraint_Evaluator evaluator (offer);
+ this->order_offer (evaluator, offer, offer_id);
+}
+
+void
+TAO_Preference_Interpreter::
+order_offer (TAO_Constraint_Evaluator& evaluator,
+ CosTrading::Offer* offer,
+ CosTrading::OfferId offer_id)
+{
+ if (this->root_ != 0)
+ {
+ Preference_Info pref_info;
+
+ pref_info.offer_ = offer;
+ pref_info.offer_id_ = offer_id;
+ pref_info.evaluated_ = 1;
+
+ if (evaluator.evaluate_preference (this->root_, pref_info.value_) == 0)
+ {
+ // If the evaluation succeeds, insert the node into the
+ // correct place in the queue.
+ TAO_Expression_Type expr_type = this->root_->expr_type ();
+
+ if (expr_type == TAO_FIRST
+ || (expr_type == TAO_WITH
+ && ! static_cast<CORBA::Boolean> (pref_info.value_)))
+ this->offers_.enqueue_tail (pref_info);
+ else
+ this->offers_.enqueue_head (pref_info);
+
+ if (expr_type == TAO_MIN || expr_type == TAO_MAX)
+ {
+ Ordered_Offers::ITERATOR offer_iter (this->offers_);
+
+ // Push the new item down the list until the min/max
+ // criterion is satisfied. Observe the evaluation failed
+ // / evaluation suceeded partion in the list.
+ offer_iter.advance ();
+
+ for (int i = 1;
+ offer_iter.done () == 0;
+ offer_iter.advance (), i++)
+ {
+ Preference_Info* current_offer;
+ offer_iter.next (current_offer);
+
+ // Maintain the sorted order in the first partition.
+ if (current_offer->evaluated_ == 1
+ && ((expr_type == TAO_MIN
+ && pref_info.value_ > current_offer->value_)
+ || (expr_type == TAO_MAX
+ && pref_info.value_ < current_offer->value_)))
+ {
+ // Swap the out of order pair
+ this->offers_.set (*current_offer,
+ i - 1);
+ this->offers_.set (pref_info, i);
+ }
+ else
+ break;
+ }
+ }
+ }
+ else
+ {
+ // If the evaluation fails, just tack the sucker onto the
+ // end of the queue.
+ pref_info.evaluated_ = 0;
+ this->offers_.enqueue_tail (pref_info);
+ }
+ }
+}
+
+int
+TAO_Preference_Interpreter::
+remove_offer (CosTrading::Offer*& offer,
+ CosTrading::OfferId& offer_id)
+{
+ int return_value = -1;
+ Preference_Info pref_info;
+
+ return_value = this->offers_.dequeue_head (pref_info);
+
+ if (return_value == 0)
+ {
+ offer = pref_info.offer_;
+ offer_id = pref_info.offer_id_;
+ }
+
+ return return_value;
+}
+
+int
+TAO_Preference_Interpreter::
+remove_offer (CosTrading::Offer*& offer)
+{
+ CosTrading::OfferId offer_id = 0;
+ return this->remove_offer (offer, offer_id);
+}
+
+
+size_t
+TAO_Preference_Interpreter::num_offers (void)
+{
+ return this->offers_.size ();
+}
+
+TAO_END_VERSIONED_NAMESPACE_DECL
diff --git a/TAO/orbsvcs/orbsvcs/Trader/Constraint_Interpreter.h b/TAO/orbsvcs/orbsvcs/Trader/Constraint_Interpreter.h
new file mode 100644
index 00000000000..586f82080e4
--- /dev/null
+++ b/TAO/orbsvcs/orbsvcs/Trader/Constraint_Interpreter.h
@@ -0,0 +1,166 @@
+/* -*- C++ -*- */
+
+//=============================================================================
+/**
+ * @file Constraint_Interpreter.h
+ *
+ * $Id$
+ *
+ * @author Seth Widoff <sbw1@cs.wustl.edu>
+ */
+//=============================================================================
+
+
+#ifndef TAO_CONSTRAINT_INTERPRETER_H
+#define TAO_CONSTRAINT_INTERPRETER_H
+#include /**/ "ace/pre.h"
+
+#include "orbsvcs/Trader/Constraint_Nodes.h"
+#include "orbsvcs/Trader/Constraint_Visitors.h"
+#include "orbsvcs/Trader/Interpreter.h"
+
+#include "orbsvcs/CosTradingS.h"
+#include "orbsvcs/CosTradingReposS.h"
+
+TAO_BEGIN_VERSIONED_NAMESPACE_DECL
+
+class TAO_Constraint_Evaluator;
+class TAO_Constraint_Validator;
+
+/**
+ * @class TAO_Constraint_Interpreter
+ *
+ * @brief TAO_Constraint_Interpreter will, given a constraint string whose
+ * syntax and semantics comply with the trader specification for the
+ * constraint language, determine if a CosTrading::Offer meets the
+ * constraints.
+ *
+ * TAO_Constraint_Interpreter will first build an expression tree
+ * representing the constraint expression using Lex and Yacc. Then,
+ * using a TAO_Constraint_Validator, it will validate the semantic
+ * correctness of the tree. When the evaluate method is invoked with
+ * an Offer, the TAO_Constraint_Interpreter will construct an
+ * EvaluationVisitor, which will evaluate the tree and decide
+ * whether the offer meets the constraints.
+ */
+class TAO_Trading_Serv_Export TAO_Constraint_Interpreter : public TAO_Interpreter
+{
+public:
+ // = Initialization and termination methods.
+ TAO_Constraint_Interpreter (const CosTradingRepos::ServiceTypeRepository::TypeStruct& ts,
+ const char* constraints
+ ACE_ENV_ARG_DECL)
+ ACE_THROW_SPEC ((CosTrading::IllegalConstraint,
+ CORBA::NO_MEMORY));
+
+ /**
+ * This constructor builds an expression tree representing the
+ * constraint specified in <constraints>, and throws an Illegal
+ * Constraint exception if the constraint given has syntax errors or
+ * semantic errors, such as mismatched types.
+ */
+ TAO_Constraint_Interpreter (TAO_Constraint_Validator& validator,
+ const char* constraints
+ ACE_ENV_ARG_DECL)
+ ACE_THROW_SPEC ((CosTrading::IllegalConstraint,
+ CORBA::NO_MEMORY));
+
+ /// Destructor
+ ~TAO_Constraint_Interpreter (void);
+
+ CORBA::Boolean evaluate (CosTrading::Offer* offer);
+
+ CORBA::Boolean evaluate (TAO_Constraint_Evaluator& evaluator);
+
+ // Determine whether an offer fits the constraints with which the
+ // tree was constructed. This method is thread safe (hopefully).
+};
+
+/**
+ * @class TAO_Preference_Interpreter
+ *
+ * @brief The TAO_Preference_Interpreter will, given a valid preference
+ * string and offers, will order the offers based on the offers'
+ * compliance with the preferences.
+ *
+ * Each time the order_offer method is invoked, the
+ * TAO_Preference_Interpreter stores the offer reference in the
+ * order dictated by its evaluation of the preference string. After
+ * the TAO_Preference_Interpreter client has finished ordering all
+ * the offers, it will extract the offers in order using the
+ * remove_offer method.
+ */
+class TAO_Trading_Serv_Export TAO_Preference_Interpreter : public TAO_Interpreter
+{
+public:
+ // = Initialization and termination methods.
+ TAO_Preference_Interpreter (const CosTradingRepos::ServiceTypeRepository::TypeStruct& ts,
+ const char* preference
+ ACE_ENV_ARG_DECL)
+ ACE_THROW_SPEC ((CosTrading::Lookup::IllegalPreference,
+ CORBA::NO_MEMORY));
+
+ /**
+ * Parse the preference string, determining first if it's
+ * valid. Throw an IllegalPreference exception if the preference
+ * doesn't conform to the BNF grammar for preferences.
+ */
+ TAO_Preference_Interpreter (TAO_Constraint_Validator& validator,
+ const char* preference
+ ACE_ENV_ARG_DECL)
+ ACE_THROW_SPEC ((CosTrading::Lookup::IllegalPreference,
+ CORBA::NO_MEMORY));
+
+ /// Destructor
+ ~TAO_Preference_Interpreter(void);
+
+ void order_offer (CosTrading::Offer* offer,
+ CosTrading::OfferId offer_id = 0);
+
+ /// Evaluate the offer, and order it internally based on the results
+ /// of the evaluation.
+ void order_offer (TAO_Constraint_Evaluator& evaluator,
+ CosTrading::Offer* offer,
+ CosTrading::OfferId offer_id = 0);
+
+ int remove_offer (CosTrading::Offer*& offer,
+ CosTrading::OfferId& offer_id);
+
+ /// Remove the next offer. The offer returned will be the next in the
+ /// ordering determined by the preference string.
+ int remove_offer (CosTrading::Offer*& offer);
+
+ /// Return the number of offers remaining in the ordering.
+ size_t num_offers (void);
+
+ struct Preference_Info
+ {
+ /// True if the preference evaluation didn't return an error for this offer.
+ CORBA::Boolean evaluated_;
+
+ /// The value of the preference evaluation.
+ TAO_Literal_Constraint value_;
+
+ /// The offer id of this offer.
+ CosTrading::OfferId offer_id_;
+
+ /// A pointer to the offer.
+ CosTrading::Offer* offer_;
+ };
+
+ typedef ACE_Unbounded_Queue<Preference_Info> Ordered_Offers;
+
+private:
+
+ /// Disallow copying.
+ TAO_Preference_Interpreter (const TAO_Preference_Interpreter&);
+ TAO_Preference_Interpreter& operator= (const TAO_Preference_Interpreter&);
+
+ /// The ordered list of offers.
+ Ordered_Offers offers_;
+};
+
+TAO_END_VERSIONED_NAMESPACE_DECL
+
+#include /**/ "ace/post.h"
+#endif /* TAO_CONSTRAINT_INTERPRETER_H */
diff --git a/TAO/orbsvcs/orbsvcs/Trader/Constraint_Nodes.cpp b/TAO/orbsvcs/orbsvcs/Trader/Constraint_Nodes.cpp
new file mode 100644
index 00000000000..dd5ddc1e92b
--- /dev/null
+++ b/TAO/orbsvcs/orbsvcs/Trader/Constraint_Nodes.cpp
@@ -0,0 +1,930 @@
+// $Id$
+
+#include "orbsvcs/Trader/Constraint_Nodes.h"
+#include "orbsvcs/Trader/Constraint_Visitors.h"
+
+#include "tao/AnyTypeCode/Any.h"
+#include "ace/OS_NS_string.h"
+
+ACE_RCSID (Trader,
+ Constraint_Nodes,
+ "$Id$")
+
+TAO_BEGIN_VERSIONED_NAMESPACE_DECL
+
+int
+TAO_Noop_Constraint::accept (TAO_Constraint_Visitor* visitor)
+{
+ int return_value = -1;
+ switch (this->type_)
+ {
+ case TAO_FIRST:
+ return_value = visitor->visit_first (this);
+ break;
+ case TAO_RANDOM:
+ return_value = visitor->visit_random (this);
+ }
+
+ return return_value;
+}
+
+TAO_Binary_Constraint::
+TAO_Binary_Constraint (TAO_Expression_Type op_type,
+ TAO_Constraint* left,
+ TAO_Constraint* right)
+ : op_ (op_type),
+ left_ (left),
+ right_ (right)
+{
+}
+
+TAO_Binary_Constraint::~TAO_Binary_Constraint (void)
+{
+ delete left_;
+ delete right_;
+}
+
+// Dispatch table for the accept method
+static int (*dispatch_table[]) (TAO_Constraint_Visitor*,
+ TAO_Binary_Constraint*)=
+{
+ TAO_Binary_Constraint::visit_greater_than,
+ TAO_Binary_Constraint::visit_greater_than_equal,
+ TAO_Binary_Constraint::visit_less_than,
+ TAO_Binary_Constraint::visit_less_than_equal,
+ TAO_Binary_Constraint::visit_equal,
+ TAO_Binary_Constraint::visit_not_equal,
+ 0,
+ TAO_Binary_Constraint::visit_and,
+ TAO_Binary_Constraint::visit_or,
+ 0,
+ TAO_Binary_Constraint::visit_in,
+ TAO_Binary_Constraint::visit_twiddle,
+ 0,
+ TAO_Binary_Constraint::visit_add,
+ TAO_Binary_Constraint::visit_sub,
+ TAO_Binary_Constraint::visit_mult,
+ TAO_Binary_Constraint::visit_div
+};
+
+// Simulate the fun of actual double dispatching.
+
+int
+TAO_Binary_Constraint::accept (TAO_Constraint_Visitor* visitor)
+{
+ int offset = this->op_ - TAO_GT,
+ return_value = -1;
+
+ if (dispatch_table[offset] != 0)
+ return_value = dispatch_table[offset] (visitor, this);
+
+ return return_value;
+}
+
+int
+TAO_Binary_Constraint::
+visit_or (TAO_Constraint_Visitor* visitor,
+ TAO_Binary_Constraint* expr)
+{
+ return visitor->visit_or (expr);
+}
+
+int
+TAO_Binary_Constraint::
+visit_and (TAO_Constraint_Visitor* visitor,
+ TAO_Binary_Constraint* expr)
+{
+ return visitor->visit_and (expr);
+}
+
+int
+TAO_Binary_Constraint::
+visit_less_than (TAO_Constraint_Visitor* visitor,
+ TAO_Binary_Constraint* expr)
+{
+ return visitor->visit_less_than (expr);
+}
+
+int
+TAO_Binary_Constraint::
+visit_less_than_equal (TAO_Constraint_Visitor* visitor,
+ TAO_Binary_Constraint* expr)
+{
+ return visitor->visit_less_than_equal (expr);
+}
+
+int
+TAO_Binary_Constraint::
+visit_greater_than (TAO_Constraint_Visitor* visitor,
+ TAO_Binary_Constraint* expr)
+{
+ return visitor->visit_greater_than (expr);
+}
+
+int
+TAO_Binary_Constraint::
+visit_greater_than_equal (TAO_Constraint_Visitor* visitor,
+ TAO_Binary_Constraint* expr)
+{
+ return visitor->visit_greater_than_equal (expr);
+}
+
+int
+TAO_Binary_Constraint::
+visit_equal (TAO_Constraint_Visitor* visitor,
+ TAO_Binary_Constraint* expr)
+{
+ return visitor->visit_equal (expr);
+}
+
+int
+TAO_Binary_Constraint::
+visit_not_equal (TAO_Constraint_Visitor* visitor,
+ TAO_Binary_Constraint* expr)
+{
+ return visitor->visit_not_equal (expr);
+}
+
+int
+TAO_Binary_Constraint::
+visit_add (TAO_Constraint_Visitor* visitor,
+ TAO_Binary_Constraint* expr)
+{
+ return visitor->visit_add (expr);
+}
+
+int
+TAO_Binary_Constraint::
+visit_sub (TAO_Constraint_Visitor* visitor,
+ TAO_Binary_Constraint* expr)
+{
+ return visitor->visit_sub (expr);
+}
+
+int
+TAO_Binary_Constraint::
+visit_mult (TAO_Constraint_Visitor* visitor,
+ TAO_Binary_Constraint* expr)
+{
+ return visitor->visit_mult (expr);
+}
+
+int
+TAO_Binary_Constraint::
+visit_div (TAO_Constraint_Visitor* visitor,
+ TAO_Binary_Constraint* expr)
+{
+ return visitor->visit_div (expr);
+}
+
+int
+TAO_Binary_Constraint::
+visit_twiddle (TAO_Constraint_Visitor* visitor,
+ TAO_Binary_Constraint* expr)
+{
+ return visitor->visit_twiddle (expr);
+}
+
+int
+TAO_Binary_Constraint::
+visit_in (TAO_Constraint_Visitor* visitor,
+ TAO_Binary_Constraint* expr)
+{
+ return visitor->visit_in (expr);
+}
+
+
+TAO_Constraint*
+TAO_Binary_Constraint::left_operand (void) const
+{
+ return this->left_;
+}
+
+TAO_Constraint*
+TAO_Binary_Constraint::right_operand (void) const
+{
+ return this->right_;
+}
+
+TAO_Unary_Constraint::
+TAO_Unary_Constraint (TAO_Expression_Type op_type,
+ TAO_Constraint* operand)
+ : op_ (op_type),
+ operand_ (operand)
+{
+}
+
+TAO_Unary_Constraint::~TAO_Unary_Constraint (void)
+{
+ delete operand_;
+}
+
+
+int
+TAO_Unary_Constraint::accept (TAO_Constraint_Visitor* visitor)
+{
+ // Since there are only three unary operators, there's no need for a
+ // dispatch table.
+ int return_value = -1;
+ switch (this->op_)
+ {
+ case TAO_CONSTRAINT:
+ return_value = visitor->visit_constraint (this);
+ break;
+ case TAO_WITH:
+ return_value = visitor->visit_with (this);
+ break;
+ case TAO_MIN:
+ return_value = visitor->visit_min (this);
+ break;
+ case TAO_MAX:
+ return_value = visitor->visit_max (this);
+ break;
+ case TAO_NOT:
+ return_value = visitor->visit_not (this);
+ break;
+ case TAO_UMINUS:
+ return_value = visitor->visit_unary_minus (this);
+ break;
+ case TAO_EXIST:
+ return_value = visitor->visit_exist (this);
+ break;
+ }
+
+ return return_value;
+}
+
+TAO_Constraint*
+TAO_Unary_Constraint::operand (void)
+{
+ return this->operand_;
+}
+
+TAO_Property_Constraint::
+TAO_Property_Constraint (const char* name)
+ : name_ (CORBA::string_dup (name))
+{
+}
+
+TAO_Property_Constraint::~TAO_Property_Constraint (void)
+{
+ CORBA::string_free (this->name_);
+}
+
+int
+TAO_Property_Constraint::accept (TAO_Constraint_Visitor* visitor)
+{
+ return visitor->visit_property (this);
+}
+
+const char*
+TAO_Property_Constraint::name (void) const
+{
+ return name_;
+}
+
+TAO_Literal_Constraint::
+TAO_Literal_Constraint (const TAO_Literal_Constraint& lit)
+ : TAO_Constraint (lit)
+{
+ this->copy (lit);
+}
+
+
+TAO_Literal_Constraint::
+TAO_Literal_Constraint (CORBA::Any* any)
+{
+ ACE_DECLARE_NEW_CORBA_ENV;
+ CORBA::Any& any_ref = *any;
+ CORBA::TypeCode_var type = any_ref.type ();
+ // @@ No where to throw exception back.
+ CORBA::TCKind corba_type = CORBA::tk_null;
+ ACE_TRY
+ {
+ corba_type = type->kind (ACE_ENV_SINGLE_ARG_PARAMETER);
+ ACE_TRY_CHECK;
+ }
+ ACE_CATCHANY
+ {
+ // @@ Seth: Don't know what else to do. Make sure we can tell
+ // when this constructor fails.
+ return;
+ }
+ ACE_ENDTRY;
+
+ this->type_ = TAO_Literal_Constraint::comparable_type (type.in ());
+ switch (this->type_)
+ {
+ case TAO_SIGNED:
+ this->op_.integer_ = 0;
+ if (corba_type == CORBA::tk_short)
+ {
+ CORBA::Short sh;
+ any_ref >>= sh;
+ this->op_.integer_ = (CORBA::Long) sh;
+ }
+ else
+ any_ref >>= this->op_.integer_;
+ break;
+ case TAO_UNSIGNED:
+ this->op_.uinteger_ = 0;
+ if (corba_type == CORBA::tk_ushort)
+ {
+ CORBA::UShort sh;
+ any_ref >>= sh;
+ this->op_.uinteger_ = (CORBA::ULong) sh;
+ }
+ else
+ any_ref >>= this->op_.uinteger_;
+ break;
+ case TAO_DOUBLE:
+ if (corba_type == CORBA::tk_float)
+ {
+ CORBA::Float fl;
+ (*any) >>= fl;
+ this->op_.double_ = (CORBA::Double) fl;
+ }
+ else
+ (*any) >>= this->op_.double_;
+ break;
+ case TAO_BOOLEAN:
+ {
+ CORBA::Any::to_boolean tmp (this->op_.bool_);
+ (*any) >>= tmp;
+ }
+ break;
+ case TAO_STRING:
+ {
+ const char* s;
+ any_ref >>= s;
+ this->op_.str_ = CORBA::string_dup (s);
+ }
+ break;
+ case TAO_SEQUENCE:
+ this->op_.any_ = any;
+ }
+}
+
+TAO_Literal_Constraint::TAO_Literal_Constraint (CORBA::ULong uinteger)
+ : type_ (TAO_UNSIGNED)
+{
+ this->op_.uinteger_ = uinteger;
+}
+
+TAO_Literal_Constraint::TAO_Literal_Constraint (CORBA::Long integer)
+ : type_ (TAO_SIGNED)
+{
+ this->op_.integer_ = integer;
+}
+
+TAO_Literal_Constraint::TAO_Literal_Constraint (CORBA::Boolean boolean)
+ : type_ (TAO_BOOLEAN)
+{
+ this->op_.bool_ = boolean;
+}
+
+TAO_Literal_Constraint::TAO_Literal_Constraint (CORBA::Double doub)
+ : type_ (TAO_DOUBLE)
+{
+ this->op_.double_ = doub;
+}
+
+TAO_Literal_Constraint::TAO_Literal_Constraint (const char* str)
+ : type_ (TAO_STRING)
+{
+ this->op_.str_ = CORBA::string_dup (str);
+}
+
+TAO_Literal_Constraint::~TAO_Literal_Constraint (void)
+{
+ if (this->type_ == TAO_STRING)
+ CORBA::string_free (this->op_.str_);
+}
+
+int
+TAO_Literal_Constraint::accept (TAO_Constraint_Visitor* visitor)
+{
+ return visitor->visit_literal (this);
+}
+
+void
+TAO_Literal_Constraint::operator= (const TAO_Literal_Constraint& co)
+{
+ this->copy (co);
+}
+
+TAO_Literal_Constraint::operator CORBA::Boolean (void) const
+{
+ return (this->type_ == TAO_BOOLEAN) ? this->op_.bool_ : 0;
+}
+
+TAO_Literal_Constraint::operator CORBA::ULong (void) const
+{
+ CORBA::ULong return_value = (CORBA::ULong)0;
+
+ if (this->type_ == TAO_UNSIGNED)
+ return_value = this->op_.uinteger_;
+ else if (this->type_ == TAO_SIGNED)
+ return_value =
+ (this->op_.integer_ > 0) ? (CORBA::ULong) this->op_.integer_ : 0;
+ else if (this->type_ == TAO_DOUBLE)
+ return_value =
+ (this->op_.double_ > 0) ?
+ ((this->op_.double_ > ACE_UINT32_MAX) ?
+ ACE_UINT32_MAX :
+ (CORBA::ULong) this->op_.double_)
+ : 0;
+
+ return return_value;
+}
+
+TAO_Literal_Constraint::operator CORBA::Long (void) const
+{
+ CORBA::Long return_value = (CORBA::Long)0;
+
+ if (this->type_ == TAO_SIGNED)
+ return_value = this->op_.integer_;
+ else if (this->type_ == TAO_UNSIGNED)
+ return_value =
+ (this->op_.uinteger_ > (CORBA::ULong) ACE_INT32_MAX) ?
+ ACE_INT32_MAX : (CORBA::Long) this->op_.uinteger_;
+ else if (this->type_ == TAO_DOUBLE)
+ return_value =
+ (this->op_.double_ > 0) ?
+ ((this->op_.double_ > ACE_INT32_MAX) ?
+ ACE_INT32_MAX :
+ (CORBA::Long) this->op_.double_) :
+ ((this->op_.double_ < ACE_INT32_MIN) ?
+ ACE_INT32_MIN :
+ (CORBA::Long) this->op_.double_);
+
+ return return_value;
+}
+
+TAO_Literal_Constraint::operator CORBA::Double (void) const
+{
+ CORBA::Double return_value = (CORBA::Double)0.0;
+
+ if (this->type_ == TAO_DOUBLE)
+ return_value = this->op_.double_;
+ else if (this->type_ == TAO_SIGNED)
+ return_value = (CORBA::Double) this->op_.integer_;
+ else if (this->type_ == TAO_UNSIGNED)
+ return_value = (CORBA::Double) this->op_.uinteger_;
+
+ return return_value;
+}
+
+TAO_Literal_Constraint::operator const char* (void) const
+{
+ return (this->type_ == TAO_STRING) ? this->op_.str_ : 0;
+}
+
+TAO_Literal_Constraint::operator const CORBA::Any* (void) const
+{
+ return (this->type_ == TAO_SEQUENCE) ? this->op_.any_ : 0;
+}
+
+TAO_Expression_Type
+TAO_Literal_Constraint::comparable_type (CORBA::TypeCode_ptr type)
+{
+ // Convert a CORBA::TCKind into a TAO_Literal_Type
+ ACE_DECLARE_NEW_CORBA_ENV;
+ TAO_Expression_Type return_value = TAO_UNKNOWN;
+ CORBA::TCKind kind = CORBA::tk_null;
+ ACE_TRY
+ {
+ kind = type->kind (ACE_ENV_SINGLE_ARG_PARAMETER);
+ ACE_TRY_CHECK;
+ }
+ ACE_CATCHANY
+ {
+ return return_value;
+ }
+ ACE_ENDTRY;
+ // Since this is a "top level try block, no need to check again.
+
+ switch (kind)
+ {
+ case CORBA::tk_ushort:
+ case CORBA::tk_ulong:
+ return_value = TAO_UNSIGNED;
+ break;
+ case CORBA::tk_long:
+ case CORBA::tk_short:
+ return_value = TAO_SIGNED;
+ break;
+ case CORBA::tk_boolean:
+ return_value = TAO_BOOLEAN;
+ break;
+ case CORBA::tk_float:
+ case CORBA::tk_double:
+ return_value = TAO_DOUBLE;
+ break;
+ case CORBA::tk_string:
+ return_value = TAO_STRING;
+ break;
+ case CORBA::tk_sequence:
+ return_value = TAO_SEQUENCE;
+ break;
+ case CORBA::tk_alias:
+ {
+ CORBA::TCKind kind = CORBA::tk_void;
+ ACE_TRY_EX (label2)
+ {
+ CORBA::TypeCode_var typecode = type->content_type (ACE_ENV_SINGLE_ARG_PARAMETER);
+ ACE_TRY_CHECK_EX (label2);
+ kind = typecode->kind (ACE_ENV_SINGLE_ARG_PARAMETER);
+ ACE_TRY_CHECK_EX (label2);;
+ }
+ ACE_CATCHANY
+ {
+ return return_value;
+ }
+ ACE_ENDTRY;
+ // Since this is a "top level try block, no need to check again.
+
+ if (kind == CORBA::tk_sequence)
+ return_value = TAO_SEQUENCE;
+ }
+ break;
+ default:
+ return_value = TAO_UNKNOWN;
+ }
+
+ return return_value;
+}
+
+bool
+operator== (const TAO_Literal_Constraint& left,
+ const TAO_Literal_Constraint& right)
+{
+ bool return_value = false;
+ TAO_Expression_Type widest_type =
+ TAO_Literal_Constraint::widest_type (left, right);
+
+ switch (widest_type)
+ {
+ case TAO_STRING:
+ return_value = (ACE_OS::strcmp ((const char*) left, (const char*) right) == 0);
+ break;
+ case TAO_DOUBLE:
+ return_value = (CORBA::Double) left == (CORBA::Double) right;
+ break;
+ case TAO_SIGNED:
+ return_value = (CORBA::Long) left == (CORBA::Long) right;
+ break;
+ case TAO_UNSIGNED:
+ return_value = (CORBA::ULong) left == (CORBA::ULong) right;
+ break;
+ case TAO_BOOLEAN:
+ return_value = (CORBA::Boolean) left == (CORBA::Boolean) right;
+ break;
+ }
+
+ return return_value;
+}
+
+
+bool
+operator!= (const TAO_Literal_Constraint& left,
+ const TAO_Literal_Constraint& right)
+{
+ bool return_value = false;
+ TAO_Expression_Type widest_type =
+ TAO_Literal_Constraint::widest_type (left, right);
+
+ switch (widest_type)
+ {
+ case TAO_STRING:
+ return_value = (ACE_OS::strcmp ((const char*) left, (const char*) right) != 0);
+ break;
+ case TAO_DOUBLE:
+ return_value = (CORBA::Double) left != (CORBA::Double) right;
+ break;
+ case TAO_SIGNED:
+ return_value = (CORBA::Long) left != (CORBA::Long) right;
+ break;
+ case TAO_UNSIGNED:
+ return_value = (CORBA::ULong) left != (CORBA::ULong) right;
+ break;
+ case TAO_BOOLEAN:
+ return_value = (CORBA::Boolean) left != (CORBA::Boolean) right;
+ break;
+ }
+
+ return return_value;
+}
+
+bool
+operator< (const TAO_Literal_Constraint& left,
+ const TAO_Literal_Constraint& right)
+{
+ bool return_value = false;
+ TAO_Expression_Type widest_type =
+ TAO_Literal_Constraint::widest_type (left, right);
+
+ switch (widest_type)
+ {
+ case TAO_STRING:
+ return_value = (ACE_OS::strcmp ((const char*) left, (const char*) right) < 0);
+ break;
+ case TAO_DOUBLE:
+ return_value = (CORBA::Double) left < (CORBA::Double) right;
+ break;
+ case TAO_SIGNED:
+ return_value = (CORBA::Long) left < (CORBA::Long) right;
+ break;
+ case TAO_UNSIGNED:
+ return_value = (CORBA::ULong) left < (CORBA::ULong) right;
+ break;
+ case TAO_BOOLEAN:
+ return_value = (CORBA::Boolean) left < (CORBA::Boolean) right;
+ break;
+ }
+
+ return return_value;
+}
+
+bool
+operator<= (const TAO_Literal_Constraint& left,
+ const TAO_Literal_Constraint& right)
+{
+ bool return_value = false;
+ TAO_Expression_Type widest_type =
+ TAO_Literal_Constraint::widest_type (left, right);
+
+ switch (widest_type)
+ {
+ case TAO_STRING:
+ return_value = (ACE_OS::strcmp ((const char*) left, (const char*) right) <= 0);
+ break;
+ case TAO_DOUBLE:
+ return_value = (CORBA::Double) left <= (CORBA::Double) right;
+ break;
+ case TAO_SIGNED:
+ return_value = (CORBA::Long) left <= (CORBA::Long) right;
+ break;
+ case TAO_UNSIGNED:
+ return_value = (CORBA::ULong) left <= (CORBA::ULong) right;
+ break;
+ }
+
+ return return_value;
+}
+
+bool
+operator> (const TAO_Literal_Constraint& left,
+ const TAO_Literal_Constraint& right)
+{
+ bool return_value = false;
+ TAO_Expression_Type widest_type =
+ TAO_Literal_Constraint::widest_type (left, right);
+
+ switch (widest_type)
+ {
+ case TAO_STRING:
+ return_value = (ACE_OS::strcmp ((const char*) left, (const char*) right) > 0);
+ break;
+ case TAO_DOUBLE:
+ return_value = (CORBA::Double) left > (CORBA::Double) right;
+ break;
+ case TAO_SIGNED:
+ return_value = (CORBA::Long) left > (CORBA::Long) right;
+ break;
+ case TAO_UNSIGNED:
+ return_value = (CORBA::ULong) left > (CORBA::ULong) right;
+ break;
+ }
+
+ return return_value;
+}
+
+bool
+operator>= (const TAO_Literal_Constraint& left,
+ const TAO_Literal_Constraint& right)
+{
+ bool return_value = false;
+ TAO_Expression_Type widest_type =
+ TAO_Literal_Constraint::widest_type (left, right);
+
+ switch (widest_type)
+ {
+ case TAO_STRING:
+ return_value = (ACE_OS::strcmp ((const char*) left, (const char*) right) >= 0);
+ break;
+ case TAO_DOUBLE:
+ return_value = (CORBA::Double) left >= (CORBA::Double) right;
+ break;
+ case TAO_SIGNED:
+ return_value = (CORBA::Long) left >= (CORBA::Long) right;
+ break;
+ case TAO_UNSIGNED:
+ return_value = (CORBA::ULong) left >= (CORBA::ULong) right;
+ break;
+ }
+
+ return return_value;
+}
+
+
+bool
+operator== (CORBA::Double left, const TAO_Literal_Constraint& right)
+{
+ return (left == (CORBA::Double) right);
+}
+
+bool
+operator== (const TAO::String_Manager& left,
+ const TAO_Literal_Constraint& right)
+{
+ bool result = false;
+
+ if ((const char*) right != 0)
+ result = ACE_OS::strcmp ((const char*) left,
+ (const char*) right) == 0;
+ return result;
+}
+
+
+TAO_Literal_Constraint
+operator+ (const TAO_Literal_Constraint& left,
+ const TAO_Literal_Constraint& right)
+{
+ TAO_Expression_Type widest_type =
+ TAO_Literal_Constraint::widest_type (left, right);
+
+ switch (widest_type)
+ {
+ case TAO_DOUBLE:
+ {
+ CORBA::Double result = (CORBA::Double) left + (CORBA::Double) right;
+ return TAO_Literal_Constraint ((CORBA::Double) result);
+ }
+ case TAO_SIGNED:
+ {
+ CORBA::Long result = (CORBA::Long) left + (CORBA::Long) right;
+ return TAO_Literal_Constraint ((CORBA::Long) result);
+ }
+ case TAO_UNSIGNED:
+ {
+ CORBA::ULong result = (CORBA::ULong) left + (CORBA::ULong) right;
+ return TAO_Literal_Constraint ((CORBA::ULong) result);
+ }
+ default:
+ return TAO_Literal_Constraint ((CORBA::Long)0);
+ }
+}
+
+TAO_Literal_Constraint
+operator- (const TAO_Literal_Constraint& left,
+ const TAO_Literal_Constraint& right)
+{
+ TAO_Expression_Type widest_type =
+ TAO_Literal_Constraint::widest_type (left, right);
+
+ switch (widest_type)
+ {
+ case TAO_DOUBLE:
+ {
+ CORBA::Double result = (CORBA::Double) left - (CORBA::Double) right;
+ return TAO_Literal_Constraint ((CORBA::Double) result);
+ }
+ case TAO_SIGNED:
+ {
+ CORBA::Long result = (CORBA::Long) left - (CORBA::Long) right;
+ return TAO_Literal_Constraint ((CORBA::Long) result);
+ }
+ case TAO_UNSIGNED:
+ {
+ CORBA::ULong result = (CORBA::ULong) left - (CORBA::ULong) right;
+ return TAO_Literal_Constraint ((CORBA::ULong) result);
+ }
+ default:
+ return TAO_Literal_Constraint ((CORBA::Long)0);
+ }
+}
+
+TAO_Literal_Constraint
+operator* (const TAO_Literal_Constraint& left,
+ const TAO_Literal_Constraint& right)
+{
+ TAO_Expression_Type widest_type =
+ TAO_Literal_Constraint::widest_type (left, right);
+
+ switch (widest_type)
+ {
+ case TAO_DOUBLE:
+ {
+ CORBA::Double result = (CORBA::Double) left * (CORBA::Double) right;
+ return TAO_Literal_Constraint ((CORBA::Double) result);
+ }
+ case TAO_SIGNED:
+ {
+ CORBA::Long result = (CORBA::Long) left * (CORBA::Long) right;
+ return TAO_Literal_Constraint ((CORBA::Long) result);
+ }
+ case TAO_UNSIGNED:
+ {
+ CORBA::ULong result = (CORBA::ULong) left * (CORBA::ULong) right;
+ return TAO_Literal_Constraint ((CORBA::ULong) result);
+ }
+ default:
+ return TAO_Literal_Constraint ((CORBA::Long)0);
+ }
+}
+
+TAO_Literal_Constraint
+operator/ (const TAO_Literal_Constraint& left,
+ const TAO_Literal_Constraint& right)
+{
+ TAO_Expression_Type widest_type =
+ TAO_Literal_Constraint::widest_type (left, right);
+
+ switch (widest_type)
+ {
+ case TAO_DOUBLE:
+ {
+ CORBA::Double result = (CORBA::Double) left / (CORBA::Double) right;
+ return TAO_Literal_Constraint ((CORBA::Double) result);
+ }
+ case TAO_SIGNED:
+ {
+ CORBA::Long result = (CORBA::Long) left / (CORBA::Long) right;
+ return TAO_Literal_Constraint ((CORBA::Long) result);
+ }
+ case TAO_UNSIGNED:
+ {
+ CORBA::ULong result = (CORBA::ULong) left / (CORBA::ULong) right;
+ return TAO_Literal_Constraint ((CORBA::ULong) result);
+ }
+ default:
+ return TAO_Literal_Constraint ((CORBA::Long)0);
+ }
+}
+
+TAO_Literal_Constraint
+operator- (const TAO_Literal_Constraint& operand)
+{
+ switch (operand.expr_type ())
+ {
+ case TAO_DOUBLE:
+ {
+ CORBA::Double result = - (CORBA::Double) operand;
+ return TAO_Literal_Constraint ((CORBA::Double) result);
+ }
+ case TAO_SIGNED:
+ {
+ CORBA::Long result = - (CORBA::Long) operand;
+ return TAO_Literal_Constraint ((CORBA::Long) result);
+ }
+ case TAO_UNSIGNED:
+ {
+ CORBA::Long result = - (CORBA::Long) ((CORBA::ULong) operand);
+ return TAO_Literal_Constraint ((CORBA::ULong) result);
+ }
+ default:
+ return TAO_Literal_Constraint ((CORBA::Long)0);
+ }
+}
+
+TAO_Expression_Type
+TAO_Literal_Constraint::widest_type (const TAO_Literal_Constraint& left,
+ const TAO_Literal_Constraint& right)
+{
+ TAO_Expression_Type left_type = left.expr_type (),
+ right_type = right.expr_type (),
+ return_value = right_type;
+
+ if (right_type != left_type)
+ {
+ if (right_type > left_type)
+ return_value = right_type;
+ else
+ return_value = left_type;
+ }
+
+ return return_value;
+}
+
+void
+TAO_Literal_Constraint::copy (const TAO_Literal_Constraint& lit)
+{
+ this->type_ = lit.type_;
+ if (this->type_ == TAO_STRING)
+ this->op_.str_ = CORBA::string_dup (lit.op_.str_);
+ else if (this->type_ == TAO_DOUBLE)
+ this->op_.double_ = lit.op_.double_;
+ else if (this->type_ == TAO_UNSIGNED)
+ this->op_.uinteger_ = lit.op_.uinteger_;
+ else if (this->type_ == TAO_SIGNED)
+ this->op_.integer_ = lit.op_.integer_;
+ else if (this->type_ == TAO_BOOLEAN)
+ this->op_.bool_ = lit.op_.bool_;
+ else if (this->type_ == TAO_SEQUENCE)
+ this->op_.any_ = lit.op_.any_;
+ else
+ type_ = TAO_UNKNOWN;
+}
+
+TAO_END_VERSIONED_NAMESPACE_DECL
diff --git a/TAO/orbsvcs/orbsvcs/Trader/Constraint_Nodes.h b/TAO/orbsvcs/orbsvcs/Trader/Constraint_Nodes.h
new file mode 100644
index 00000000000..6e9ccd203fd
--- /dev/null
+++ b/TAO/orbsvcs/orbsvcs/Trader/Constraint_Nodes.h
@@ -0,0 +1,358 @@
+// -*- C++ -*-
+
+//=============================================================================
+/**
+ * @file Constraint_Nodes.h
+ *
+ * $Id$
+ *
+ * @author Seth Widoff <sbw1@cs.wustl.edu>
+ */
+//=============================================================================
+
+
+#ifndef TAO_CONSTRAINT_NODES_H
+#define TAO_CONSTRAINT_NODES_H
+#include /**/ "ace/pre.h"
+
+#include "orbsvcs/Trader/Constraint_Tokens.h"
+
+#include "tao/Basic_Types.h"
+#include "tao/String_Manager_T.h"
+
+#include "orbsvcs/Trader/trading_serv_export.h"
+
+#if defined(_MSC_VER)
+#pragma warning(push)
+#pragma warning (disable:4250)
+#endif /* _MSC_VER */
+
+TAO_BEGIN_VERSIONED_NAMESPACE_DECL
+
+class TAO_Constraint_Visitor;
+typedef unsigned short TAO_Expression_Type;
+
+namespace CORBA
+{
+ class Any;
+ typedef Any *Any_ptr;
+
+ class TypeCode;
+ typedef TypeCode *TypeCode_ptr;
+}
+
+/**
+ * @class TAO_Constraint
+ *
+ * @brief TAO_Constraint is the base class of all nodes on the
+ * constraint expression tree.
+ *
+ * An TAO_Constraint knows what type of operation or entity
+ * it represents, and which method on TAO_Constraint_Visitor
+ * correlates to its type. When the accept method is invoked, a
+ * subclass dispatches the method on an TAO_Constraint_Visitor
+ * correlating to its type.
+ */
+class TAO_Trading_Serv_Export TAO_Constraint
+{
+public:
+
+ /**
+ * Implementing the pattern of double dispatching, each subclass of
+ * TAO_Constraint will call back on an InterpreterVisitor the
+ * method to handle a node of its ExpressionType.
+ */
+ virtual int accept (TAO_Constraint_Visitor* visitor) = 0;
+
+ /// Return the expression type represented by this node.
+ virtual TAO_Expression_Type expr_type (void) const = 0;
+
+ virtual ~TAO_Constraint (void) {}
+};
+
+/**
+ * @class TAO_Noop_Constraint
+ *
+ * @brief A node that represents an operation with no operands.
+ */
+class TAO_Trading_Serv_Export TAO_Noop_Constraint : public TAO_Constraint
+{
+public:
+
+ TAO_Noop_Constraint (TAO_Expression_Type type)
+ : type_ (type) {}
+
+ virtual int accept (TAO_Constraint_Visitor* visitor);
+
+ virtual TAO_Expression_Type expr_type (void) const
+ { return this->type_; }
+
+private:
+
+ TAO_Expression_Type type_;
+};
+
+/**
+ * @class TAO_Binary_Constraint
+ *
+ * @brief TAO_Binary_Constraint represents an operation with left
+ * and right operands.
+ */
+class TAO_Trading_Serv_Export TAO_Binary_Constraint : public TAO_Constraint
+{
+public:
+
+ TAO_Binary_Constraint (TAO_Expression_Type op_type,
+ TAO_Constraint* left,
+ TAO_Constraint* right);
+
+ virtual int accept (TAO_Constraint_Visitor* visitor);
+
+ virtual ~TAO_Binary_Constraint (void);
+
+ virtual TAO_Expression_Type expr_type (void) const
+ { return this->op_; }
+
+ /// Return the left operand of the binary expression
+ TAO_Constraint* left_operand (void) const;
+
+ /// Return the right operand of the binary expression
+ TAO_Constraint* right_operand (void) const;
+
+ // Allow double dispatching without creating an inundation of
+ // classes by using a dispatch table of static method pointers to
+ // invoke the correct visitor method as efficiently as a virtual
+ // method invocation.
+ static int visit_or (TAO_Constraint_Visitor*, TAO_Binary_Constraint*);
+ static int visit_and (TAO_Constraint_Visitor* , TAO_Binary_Constraint*);
+ static int visit_less_than (TAO_Constraint_Visitor* , TAO_Binary_Constraint*);
+ static int visit_less_than_equal (TAO_Constraint_Visitor* , TAO_Binary_Constraint*);
+ static int visit_greater_than (TAO_Constraint_Visitor* , TAO_Binary_Constraint*);
+ static int visit_greater_than_equal (TAO_Constraint_Visitor* , TAO_Binary_Constraint*);
+ static int visit_equal (TAO_Constraint_Visitor* , TAO_Binary_Constraint*);
+ static int visit_not_equal (TAO_Constraint_Visitor* , TAO_Binary_Constraint*);
+ static int visit_add (TAO_Constraint_Visitor* , TAO_Binary_Constraint*);
+ static int visit_sub (TAO_Constraint_Visitor* , TAO_Binary_Constraint*);
+ static int visit_mult (TAO_Constraint_Visitor* , TAO_Binary_Constraint*);
+ static int visit_div (TAO_Constraint_Visitor* , TAO_Binary_Constraint*);
+ static int visit_twiddle (TAO_Constraint_Visitor* , TAO_Binary_Constraint*);
+ static int visit_in (TAO_Constraint_Visitor* , TAO_Binary_Constraint*);
+
+private:
+
+ TAO_Binary_Constraint (const TAO_Binary_Constraint&);
+ TAO_Binary_Constraint& operator= (const TAO_Binary_Constraint&);
+
+ /// The operator type
+ TAO_Expression_Type op_;
+
+ /// The operands of the expression
+ TAO_Constraint* left_;
+ TAO_Constraint* right_;
+};
+
+/**
+ * @class TAO_Unary_Constraint
+ *
+ * @brief TAO_Unary_Constraint represents an operation with only
+ * one operand.
+ */
+class TAO_Trading_Serv_Export TAO_Unary_Constraint : public TAO_Constraint
+{
+public:
+
+ TAO_Unary_Constraint (TAO_Expression_Type op_type,
+ TAO_Constraint* operand);
+
+ virtual ~TAO_Unary_Constraint (void);
+
+ virtual int accept (TAO_Constraint_Visitor* visitor);
+
+ virtual TAO_Expression_Type expr_type (void) const
+ { return this->op_; }
+
+ TAO_Constraint* operand (void);
+
+private:
+
+ TAO_Unary_Constraint (const TAO_Unary_Constraint&);
+ TAO_Unary_Constraint& operator= (const TAO_Unary_Constraint&);
+
+ /// The operator type
+ TAO_Expression_Type op_;
+
+ /// The operand of the expression
+ TAO_Constraint* operand_;
+};
+
+/**
+ * @class TAO_Property_Constraint
+ *
+ * @brief TAO_Property_Constraint represents a property whose
+ * value is determined by the offer being evaluated.
+ */
+class TAO_Trading_Serv_Export TAO_Property_Constraint : public TAO_Constraint
+{
+public:
+
+ TAO_Property_Constraint (const char* name);
+
+ virtual ~TAO_Property_Constraint (void);
+
+ virtual int accept (TAO_Constraint_Visitor* visitor);
+
+ virtual TAO_Expression_Type expr_type (void) const
+ { return TAO_IDENT; }
+
+ /// Returns the name of the property.
+ const char* name (void) const;
+
+private:
+
+ TAO_Property_Constraint (const TAO_Property_Constraint&);
+ TAO_Property_Constraint& operator= (const TAO_Property_Constraint&);
+
+ /// The name of the property.
+ char* name_;
+};
+
+/**
+ * @class TAO_Literal_Constraint
+ *
+ * @brief TAO_Literal_Constraint represents a literal occuring in
+ * the constraint expression tree.
+ */
+class TAO_Trading_Serv_Export TAO_Literal_Constraint : public TAO_Constraint
+{
+ public:
+
+ TAO_Literal_Constraint (void)
+ : type_ (TAO_UNKNOWN) {}
+
+ // = Constructors for each of the various types of literals.
+
+ TAO_Literal_Constraint (CORBA::Any* any);
+ TAO_Literal_Constraint (CORBA::ULong uinteger);
+ TAO_Literal_Constraint (CORBA::Long integer);
+ TAO_Literal_Constraint (CORBA::Boolean boolean);
+ TAO_Literal_Constraint (CORBA::Double doub);
+ TAO_Literal_Constraint (const char* str);
+
+ /// Copy constructor
+ TAO_Literal_Constraint (const TAO_Literal_Constraint& lit);
+
+ /// Destructor.
+ ~TAO_Literal_Constraint(void);
+
+ /// Visitor accept methods.
+ virtual int accept (TAO_Constraint_Visitor* visitor);
+
+ virtual TAO_Expression_Type expr_type (void) const
+ { return type_; }
+
+ /// Assignment operator.
+ void operator= (const TAO_Literal_Constraint& co);
+
+ // Conversion routines.
+ operator CORBA::Boolean (void) const;
+ operator CORBA::ULong (void) const;
+ operator CORBA::Long (void) const;
+ operator CORBA::Double (void) const;
+ operator const char* (void) const;
+ operator const CORBA::Any* (void) const;
+
+ // Return the type represented by this MysteryOperand.
+
+ // = Comparison operators.
+
+ friend bool
+ operator< (const TAO_Literal_Constraint& left,
+ const TAO_Literal_Constraint& right);
+
+ friend bool
+ operator<= (const TAO_Literal_Constraint& left,
+ const TAO_Literal_Constraint& right);
+
+ friend bool
+ operator> (const TAO_Literal_Constraint& left,
+ const TAO_Literal_Constraint& right);
+
+ friend bool
+ operator>= (const TAO_Literal_Constraint& left,
+ const TAO_Literal_Constraint& right);
+
+ friend bool
+ operator== (const TAO_Literal_Constraint& left,
+ const TAO_Literal_Constraint& right);
+
+ friend bool
+ operator!= (const TAO_Literal_Constraint& left,
+ const TAO_Literal_Constraint& right);
+
+ friend bool
+ operator== (double left,
+ const TAO_Literal_Constraint& right);
+
+ friend bool
+ operator== (const TAO::String_Manager& left,
+ const TAO_Literal_Constraint& right);
+
+ // = Arithmetic operators.
+
+ friend TAO_Literal_Constraint
+ operator+ (const TAO_Literal_Constraint& left,
+ const TAO_Literal_Constraint& right);
+
+ friend TAO_Literal_Constraint
+ operator- (const TAO_Literal_Constraint& left,
+ const TAO_Literal_Constraint& right);
+
+ friend TAO_Literal_Constraint
+ operator* (const TAO_Literal_Constraint& left,
+ const TAO_Literal_Constraint& right);
+
+ friend TAO_Literal_Constraint
+ operator/ (const TAO_Literal_Constraint& left,
+ const TAO_Literal_Constraint& right);
+
+ friend TAO_Literal_Constraint
+ operator- (const TAO_Literal_Constraint& operand);
+
+ /// Ensure both operands are of the same simple numeric type.
+ static TAO_Expression_Type
+ widest_type (const TAO_Literal_Constraint& left,
+ const TAO_Literal_Constraint& right);
+
+ /// Determine the comparable Expression Type from the CORBA type
+ static TAO_Expression_Type
+ comparable_type (CORBA::TypeCode_ptr type);
+
+ private:
+
+ /// Private copy method.
+ void copy (const TAO_Literal_Constraint& co);
+
+ union
+ {
+ char* str_;
+ CORBA::Any_ptr any_;
+ CORBA::ULong uinteger_;
+ CORBA::Long integer_;
+ CORBA::Boolean bool_;
+ CORBA::Double double_;
+ } op_;
+ // Union of the possible literal types.
+
+ /// The actual types of the TAO_Literal_Constraint.
+ TAO_Expression_Type type_;
+
+};
+
+TAO_END_VERSIONED_NAMESPACE_DECL
+
+#if defined(_MSC_VER)
+#pragma warning(pop)
+#endif /* _MSC_VER */
+
+#include /**/ "ace/post.h"
+#endif /* TAO_CONSTRAINT_NODES_H */
diff --git a/TAO/orbsvcs/orbsvcs/Trader/Constraint_Tokens.h b/TAO/orbsvcs/orbsvcs/Trader/Constraint_Tokens.h
new file mode 100644
index 00000000000..864f8a512be
--- /dev/null
+++ b/TAO/orbsvcs/orbsvcs/Trader/Constraint_Tokens.h
@@ -0,0 +1,49 @@
+// $Id$
+
+#ifndef CONSTRAINT_TOKEN_H
+#define CONSTRAINT_TOKEN_H
+#include /**/ "ace/pre.h"
+
+# define TAO_GT 257
+# define TAO_GE 258
+# define TAO_LT 259
+# define TAO_LE 260
+# define TAO_EQ 261
+# define TAO_NE 262
+# define TAO_EXIST 263
+# define TAO_AND 264
+# define TAO_OR 265
+# define TAO_NOT 266
+# define TAO_IN 267
+# define TAO_TWIDDLE 268
+# define TAO_BOOLEAN 269
+# define TAO_PLUS 270
+# define TAO_MINUS 271
+# define TAO_MULT 272
+# define TAO_DIV 273
+# define TAO_UMINUS 274
+# define TAO_NUMBER 275
+# define TAO_RPAREN 276
+# define TAO_LPAREN 277
+# define TAO_IDENT 278
+# define TAO_STRING 279
+# define TAO_UNKNOWN 280
+# define TAO_UNSIGNED 281
+# define TAO_SIGNED 282
+# define TAO_DOUBLE 283
+# define TAO_CONSTRAINT 284
+# define TAO_SEQUENCE 285
+# define TAO_WITH 286
+# define TAO_MAX 287
+# define TAO_MIN 288
+# define TAO_FIRST 289
+# define TAO_RANDOM 290
+
+
+#include /**/ "ace/post.h"
+#endif //CONSTRAINT_TOKEN_H
+
+
+
+
+
diff --git a/TAO/orbsvcs/orbsvcs/Trader/Constraint_Visitors.cpp b/TAO/orbsvcs/orbsvcs/Trader/Constraint_Visitors.cpp
new file mode 100644
index 00000000000..74b6cb25967
--- /dev/null
+++ b/TAO/orbsvcs/orbsvcs/Trader/Constraint_Visitors.cpp
@@ -0,0 +1,1204 @@
+// $Id$
+
+#include "orbsvcs/Trader/Constraint_Visitors.h"
+#include "orbsvcs/Trader/Constraint_Nodes.h"
+#include "orbsvcs/Trader/Interpreter_Utils_T.h"
+
+#include "tao/DynamicAny/DynSequence_i.h"
+
+#include "ace/OS_NS_string.h"
+
+
+ACE_RCSID (Trader,
+ Constraint_Visitors,
+ "$Id$")
+
+
+TAO_BEGIN_VERSIONED_NAMESPACE_DECL
+
+TAO_Constraint_Evaluator::Operand_Queue::Operand_Queue (void)
+{
+}
+
+TAO_Literal_Constraint&
+TAO_Constraint_Evaluator::Operand_Queue::get_left_operand (void)
+{
+ TAO_Literal_Constraint* left_operand = 0;
+ this->get (left_operand, 1);
+ return *left_operand;
+}
+
+TAO_Literal_Constraint&
+TAO_Constraint_Evaluator::Operand_Queue::get_right_operand (void)
+{
+ TAO_Literal_Constraint* right_operand = 0;
+ this->get (right_operand);
+ return *right_operand;
+}
+
+TAO_Literal_Constraint&
+TAO_Constraint_Evaluator::Operand_Queue::get_operand (void)
+{
+ TAO_Literal_Constraint* operand = 0;
+ this->get (operand);
+ return *operand;
+}
+
+void
+TAO_Constraint_Evaluator::Operand_Queue::dequeue_operand (void)
+{
+ TAO_Literal_Constraint operand;
+ this->dequeue_head (operand);
+}
+
+TAO_Constraint_Evaluator::TAO_Constraint_Evaluator (void)
+{
+ // No-Op.
+}
+
+CORBA::Boolean
+TAO_Constraint_Evaluator::evaluate_constraint (TAO_Constraint* root)
+{
+ CORBA::Boolean result = 0;
+ this->queue_.reset ();
+
+ // Evaluate the offer according to the constraints in root_;
+ if (root != 0)
+ {
+ if ((root->accept (this) == 0) &&
+ (! this->queue_.is_empty ()))
+ {
+ result = (CORBA::Boolean) this->queue_.get_operand();
+ this->queue_.dequeue_operand ();
+ }
+ }
+
+ // If a property couldn't be evaluated we must return 0.
+ return result;
+}
+
+int
+TAO_Constraint_Evaluator::
+evaluate_preference (TAO_Constraint* root,
+ TAO_Literal_Constraint& result)
+{
+ int return_value = -1;
+ while (! this->queue_.is_empty ())
+ this->queue_.dequeue_operand ();
+
+ // Evaluate the offer according to the constraints in root_;
+ if (root != 0)
+ {
+ if ((root->accept (this) == 0) &&
+ (! this->queue_.is_empty ()))
+ {
+ result = this->queue_.get_operand ();
+ this->queue_.dequeue_operand ();
+ return_value = 0;
+ }
+ }
+
+ return return_value;
+}
+
+int
+TAO_Constraint_Evaluator::visit_constraint(TAO_Unary_Constraint* constraint)
+{
+ TAO_Constraint* operand = constraint->operand ();
+ return operand->accept (this);
+}
+
+int
+TAO_Constraint_Evaluator::visit_with (TAO_Unary_Constraint* unary_with)
+{
+ TAO_Constraint* operand = unary_with->operand ();
+ return operand->accept (this);
+}
+
+int
+TAO_Constraint_Evaluator::visit_min (TAO_Unary_Constraint* unary_min)
+{
+ TAO_Constraint* operand = unary_min->operand ();
+ return operand->accept (this);
+}
+
+int
+TAO_Constraint_Evaluator::visit_max (TAO_Unary_Constraint* unary_max)
+{
+ TAO_Constraint* operand = unary_max->operand ();
+ return operand->accept (this);
+}
+
+int
+TAO_Constraint_Evaluator::visit_random (TAO_Noop_Constraint *)
+{
+ TAO_Literal_Constraint random ((CORBA::Long) (ACE_OS::rand ()));
+ this->queue_.enqueue_head (random);
+ return 0;
+}
+
+int
+TAO_Constraint_Evaluator::visit_first (TAO_Noop_Constraint *)
+{
+ TAO_Literal_Constraint first ((CORBA::Long) 0);
+ this->queue_.enqueue_head (first);
+ return 0;
+}
+
+int
+TAO_Constraint_Evaluator::
+visit_and (TAO_Binary_Constraint* boolean_and)
+{
+ int return_value = -1;
+ CORBA::Boolean result = (CORBA::Boolean) 0;
+ TAO_Constraint* left = boolean_and->left_operand (),
+ *right = boolean_and->right_operand ();
+
+ // Short circuiting AND.
+
+ if (left->accept (this) == 0)
+ {
+ result = (CORBA::Boolean) this->queue_.get_operand ();
+ this->queue_.dequeue_operand ();
+
+ if (result)
+ {
+ if (right->accept(this) == 0)
+ {
+ result = (CORBA::Boolean) this->queue_.get_operand();
+ this->queue_.dequeue_operand ();
+
+ return_value = 0;
+ }
+ }
+ else
+ return_value = 0;
+ }
+
+ if (return_value != -1)
+ this->queue_.enqueue_head (TAO_Literal_Constraint (result));
+
+ return return_value;
+}
+
+int
+TAO_Constraint_Evaluator::
+visit_or (TAO_Binary_Constraint* boolean_or)
+{
+ int return_value = -1;
+ CORBA::Boolean result = (CORBA::Boolean) 0;
+ TAO_Constraint* left = boolean_or->left_operand (),
+ *right = boolean_or->right_operand ();
+
+ // Short-circuiting OR.
+
+ if (left->accept (this) == 0)
+ {
+ result = (CORBA::Boolean) this->queue_.get_operand ();
+ this->queue_.dequeue_operand ();
+
+ if (result == (CORBA::Boolean) 0)
+ {
+ if (right->accept (this) == 0)
+ {
+ result = (CORBA::Boolean) this->queue_.get_operand ();
+ this->queue_.dequeue_operand ();
+ return_value = 0;
+ }
+ }
+ else
+ return_value = 0;
+ }
+
+ if (return_value != -1)
+ this->queue_.enqueue_head (TAO_Literal_Constraint (result));
+
+ return return_value;
+}
+
+int
+TAO_Constraint_Evaluator::
+visit_not (TAO_Unary_Constraint* unary_not)
+{
+ int return_value = -1;
+ TAO_Constraint* operand = unary_not->operand ();
+
+ // Logical NOT.
+
+ if (operand->accept (this) == 0)
+ {
+ CORBA::Boolean result = ! (CORBA::Boolean)this->queue_.get_operand ();
+ this->queue_.dequeue_operand ();
+ this->queue_.enqueue_head (TAO_Literal_Constraint (result));
+
+ return_value = 0;
+ }
+
+ return return_value;
+}
+
+int
+TAO_Constraint_Evaluator::
+visit_exist (TAO_Unary_Constraint* unary_exist)
+{
+ TAO_Property_Constraint* operand =
+ (TAO_Property_Constraint*) unary_exist->operand ();
+ CORBA::String_var property_name ((const char*) operand->name ());
+
+ // Determine if a property is defined on this offer.
+
+ CORBA::Boolean result =
+ (CORBA::Boolean) (this->props_.find (property_name) == 0);
+
+ this->queue_.enqueue_head (TAO_Literal_Constraint (result));
+ return 0;
+}
+
+int
+TAO_Constraint_Evaluator::
+visit_unary_minus (TAO_Unary_Constraint* unary_minus)
+{
+ int return_value = -1;
+ TAO_Constraint* operand = unary_minus->operand ();
+
+ if (operand->accept (this) == 0)
+ {
+ TAO_Literal_Constraint result = - this->queue_.get_operand ();
+ this->queue_.dequeue_operand ();
+ this->queue_.enqueue_head (result);
+
+ return_value = 0;
+ }
+
+ return return_value;
+}
+
+void
+TAO_Constraint_Evaluator::do_the_op (int operation)
+{
+ TAO_Literal_Constraint& l_op = this->queue_.get_left_operand ();
+ TAO_Literal_Constraint& r_op = this->queue_.get_right_operand ();
+
+ // Perform the listed bindary operation on the first two elements on
+ // the stack.
+
+ TAO_Literal_Constraint result =
+ (operation <= TAO_NE)
+ ?
+ TAO_Literal_Constraint
+ ((CORBA::Boolean)
+ ((operation == TAO_GT) ? l_op > r_op :
+ (operation == TAO_GE) ? l_op >= r_op :
+ (operation == TAO_LT) ? l_op < r_op :
+ (operation == TAO_LE) ? l_op <= r_op :
+ (operation == TAO_NE) ? l_op != r_op :
+ (operation == TAO_EQ) ? l_op == r_op : 0))
+ :
+ ((operation == TAO_PLUS) ? l_op + r_op :
+ (operation == TAO_MINUS) ? l_op - r_op :
+ (operation == TAO_MULT) ? l_op * r_op :
+ (operation == TAO_DIV) ? l_op / r_op :
+ TAO_Literal_Constraint ());
+
+ this->queue_.dequeue_operand ();
+ this->queue_.dequeue_operand ();
+ this->queue_.enqueue_head (result);
+}
+
+int
+TAO_Constraint_Evaluator::visit_bin_op (TAO_Binary_Constraint* op,
+ int operation)
+{
+ int return_value = -1;
+ TAO_Constraint* left = op->left_operand ();
+ TAO_Constraint* right = op->right_operand ();
+
+ // Perform an operation on the results of evaluating the left and
+ // right branches of this subtree.
+ if (left->accept (this) == 0)
+ {
+ if (right->accept (this) == 0)
+ {
+ this->do_the_op (operation);
+ return_value = 0;
+ }
+ else
+ this->queue_.dequeue_operand ();
+ }
+
+ return return_value;
+}
+
+int
+TAO_Constraint_Evaluator::
+visit_add(TAO_Binary_Constraint* boolean_add)
+{
+ return this->visit_bin_op (boolean_add, TAO_PLUS);
+}
+
+int
+TAO_Constraint_Evaluator::
+visit_sub (TAO_Binary_Constraint* boolean_sub)
+{
+ return this->visit_bin_op (boolean_sub, TAO_MINUS);
+}
+
+int
+TAO_Constraint_Evaluator::
+visit_mult (TAO_Binary_Constraint* boolean_mult)
+{
+ return this->visit_bin_op (boolean_mult, TAO_MULT);
+}
+
+int
+TAO_Constraint_Evaluator::
+visit_div (TAO_Binary_Constraint* boolean_div)
+{
+ return this->visit_bin_op (boolean_div, TAO_DIV);
+}
+
+int
+TAO_Constraint_Evaluator::
+visit_twiddle (TAO_Binary_Constraint* binary_twiddle)
+{
+ int return_value = -1;
+ TAO_Constraint* left = binary_twiddle->left_operand (),
+ *right = binary_twiddle->right_operand ();
+
+ // Determine if the left operand is a substring of the right.
+
+ if (left->accept (this) == 0)
+ {
+ if (right->accept (this) == 0)
+ {
+ TAO_Literal_Constraint& left_operand = this->queue_.get_left_operand ();
+ TAO_Literal_Constraint& right_operand = this->queue_.get_right_operand ();
+
+ CORBA::Boolean result = (CORBA::Boolean)
+ (ACE_OS::strstr ((const char*)right_operand,
+ (const char*)left_operand) != 0);
+
+ this->queue_.dequeue_operand ();
+ this->queue_.dequeue_operand ();
+ this->queue_.enqueue_head (TAO_Literal_Constraint (result));
+ return_value = 0;
+ }
+ else
+ this->queue_.dequeue_operand ();
+ }
+
+ return return_value;
+}
+
+int
+TAO_Constraint_Evaluator::
+visit_in(TAO_Binary_Constraint* binary_in)
+{
+ int return_value = -1;
+ TAO_Constraint* left = binary_in->left_operand (),
+ *right = binary_in->right_operand ();
+
+ // Determine if the left operand is contained in the right.
+
+ if (left->accept (this) == 0)
+ {
+ if (this->visit_property ((TAO_Property_Constraint*) right) == 0)
+ {
+ TAO_Literal_Constraint& left_value = this->queue_.get_left_operand();
+ const CORBA::Any* any = (const CORBA::Any*) this->queue_.get_right_operand();
+
+ if (any != 0)
+ {
+ CORBA::Boolean result =
+ this->sequence_does_contain ((CORBA::Any*) any, left_value);
+
+ this->queue_.dequeue_operand ();
+ this->queue_.dequeue_operand ();
+ this->queue_.enqueue_head (TAO_Literal_Constraint (result));
+ return_value = 0;
+ }
+ else
+ this->queue_.dequeue_operand ();
+ }
+ }
+
+ return return_value;
+}
+
+int
+TAO_Constraint_Evaluator::
+visit_less_than (TAO_Binary_Constraint* boolean_lt)
+{
+ return this->visit_bin_op (boolean_lt, TAO_LT);
+}
+
+int
+TAO_Constraint_Evaluator::
+visit_less_than_equal (TAO_Binary_Constraint* boolean_lte)
+{
+ return this->visit_bin_op (boolean_lte, TAO_LE);
+}
+
+int
+TAO_Constraint_Evaluator::
+visit_greater_than (TAO_Binary_Constraint* boolean_gt)
+{
+ return this->visit_bin_op (boolean_gt, TAO_GT);
+}
+
+int
+TAO_Constraint_Evaluator::
+visit_greater_than_equal (TAO_Binary_Constraint* boolean_gte)
+{
+ return this->visit_bin_op (boolean_gte, TAO_GE);
+}
+
+int
+TAO_Constraint_Evaluator::
+visit_equal (TAO_Binary_Constraint* boolean_eq)
+{
+ return this->visit_bin_op (boolean_eq, TAO_EQ);
+}
+
+int
+TAO_Constraint_Evaluator::
+visit_not_equal (TAO_Binary_Constraint* boolean_neq)
+{
+ return this->visit_bin_op (boolean_neq, TAO_NE);
+}
+
+int
+TAO_Constraint_Evaluator::
+visit_literal (TAO_Literal_Constraint* literal)
+{
+ this->queue_.enqueue_head (*literal);
+ return 0;
+}
+
+int
+TAO_Constraint_Evaluator::
+visit_property (TAO_Property_Constraint* literal)
+{
+ ACE_UNUSED_ARG (literal);
+ return -1;
+ // A derived class decides how to do this.
+}
+
+/*@@ pradeep: where is this used?
+
+CORBA::Boolean
+TAO_find_string (CosTradingSequences::StringSeq& sequence,
+ const char* element)
+{
+ int length = sequence.length (),
+ return_value = 0;
+
+ for (int i = 0; i < length; i++)
+ {
+ if (ACE_OS::strcmp (sequence[i], element) == 0)
+ {
+ return_value = 1;
+ break;
+ }
+ }
+
+ return (CORBA::Boolean) return_value;
+}
+*/
+
+CORBA::Boolean
+TAO_Constraint_Evaluator::
+sequence_does_contain (CORBA::Any* sequence,
+ TAO_Literal_Constraint& element)
+{
+ // Helper method to cast the void* value returned from the sequence
+ // any into a sequence type locally compiled from idl. The sequence
+ // wrapper uses the [] operator to locate the target element in the
+ // sequence.
+
+ ACE_DECLARE_NEW_CORBA_ENV;
+ CORBA::Boolean return_value = 0;
+ CORBA::TypeCode_var type = sequence->type ();
+ CORBA::TCKind sequence_type = CORBA::tk_void;
+ ACE_TRY
+ {
+ sequence_type =
+ TAO_Sequence_Extracter_Base::sequence_type (type.in () ACE_ENV_ARG_PARAMETER);
+ ACE_TRY_CHECK;
+ }
+ ACE_CATCHANY
+ {
+ return return_value;
+ }
+ ACE_ENDTRY;
+ // ACE_CHECK_RETURN (return_value);
+
+ if (sequence_type == CORBA::tk_void)
+ return return_value;
+
+ switch (sequence_type)
+ {
+ case CORBA::tk_short:
+ {
+ CORBA::Long value = element;
+ return_value = ::TAO_find (*sequence, static_cast<CORBA::Short> (value));
+ }
+ break;
+ case CORBA::tk_ushort:
+ {
+ CORBA::ULong value = element;
+ return_value = ::TAO_find (*sequence, static_cast<CORBA::UShort> (value));
+ }
+ break;
+ case CORBA::tk_long:
+ {
+ CORBA::Long value = element;
+ return_value = ::TAO_find (*sequence, value);
+ }
+ break;
+ case CORBA::tk_ulong:
+ {
+ CORBA::ULong value = element;
+ return_value = ::TAO_find (*sequence, value);
+ }
+ break;
+ case CORBA::tk_float:
+ {
+ CORBA::Double value = element;
+ return_value = ::TAO_find (*sequence, static_cast<CORBA::Float> (value));
+ }
+ break;
+ case CORBA::tk_double:
+ {
+ CORBA::Double value = element;
+ return_value = ::TAO_find (*sequence, value);
+ }
+ break;
+ case CORBA::tk_boolean:
+ {
+ CORBA::Boolean value = element;
+ return_value = ::TAO_find (*sequence, value);
+ }
+ break;
+ case CORBA::tk_string:
+ {
+ const char* value = element;
+ return_value = ::TAO_find (*sequence, value);
+ }
+ break;
+ default:
+ break;
+ }
+
+ return return_value;
+}
+
+// Explicit template specializations
+
+int
+TAO_Element_Equal<CORBA::Short>::
+operator () (TAO_DynSequence_i& dyn_any,
+ CORBA::Short element) const
+{
+ int return_value = 0;
+ ACE_TRY_NEW_ENV
+ {
+ CORBA::Short value = dyn_any.get_short (ACE_ENV_SINGLE_ARG_PARAMETER);
+ ACE_TRY_CHECK;
+ return_value = (value == element);
+ }
+ ACE_CATCHANY
+ {
+ }
+ ACE_ENDTRY;
+ return return_value;
+}
+
+int
+TAO_Element_Equal<CORBA::UShort>::
+operator () (TAO_DynSequence_i& dyn_any,
+ CORBA::UShort element) const
+{
+ int return_value = 0;
+ ACE_TRY_NEW_ENV
+ {
+ CORBA::UShort value = dyn_any.get_ushort (ACE_ENV_SINGLE_ARG_PARAMETER);
+ ACE_TRY_CHECK;
+ return_value = (value == element);
+ }
+ ACE_CATCHANY
+ {
+ }
+ ACE_ENDTRY;
+ return return_value;
+}
+
+int
+TAO_Element_Equal<CORBA::Long>::
+operator () (TAO_DynSequence_i& dyn_any,
+ CORBA::Long element) const
+{
+ int return_value = 0;
+ ACE_TRY_NEW_ENV
+ {
+ CORBA::Long value = dyn_any.get_long (ACE_ENV_SINGLE_ARG_PARAMETER);
+ ACE_TRY_CHECK;
+ return_value = (value == element);
+ }
+ ACE_CATCHANY
+ {
+ }
+ ACE_ENDTRY;
+ return return_value;
+}
+
+int
+TAO_Element_Equal<CORBA::ULong>::
+operator () (TAO_DynSequence_i& dyn_any,
+ CORBA::ULong element) const
+{
+ int return_value = 0;
+ ACE_TRY_NEW_ENV
+ {
+ CORBA::ULong value = dyn_any.get_ulong (ACE_ENV_SINGLE_ARG_PARAMETER);
+ ACE_TRY_CHECK;
+ return_value = (value == element);
+ }
+ ACE_CATCHANY
+ {
+ }
+ ACE_ENDTRY;
+ return return_value;
+}
+
+int
+TAO_Element_Equal<CORBA::Float>::
+operator () (TAO_DynSequence_i& dyn_any,
+ CORBA::Float element) const
+{
+ int return_value = 0;
+ ACE_TRY_NEW_ENV
+ {
+ CORBA::Float value = dyn_any.get_float (ACE_ENV_SINGLE_ARG_PARAMETER);
+ ACE_TRY_CHECK;
+ return_value = (value == element);
+ }
+ ACE_CATCHANY {} ACE_ENDTRY;
+ return return_value;
+}
+
+int
+TAO_Element_Equal<CORBA::Double>::
+operator () (TAO_DynSequence_i& dyn_any,
+ CORBA::Double element) const
+{
+ int return_value = 0;
+ ACE_TRY_NEW_ENV
+ {
+ CORBA::Double value = dyn_any.get_short (ACE_ENV_SINGLE_ARG_PARAMETER);
+ ACE_TRY_CHECK;
+ return_value = (value == element);
+ }
+ ACE_CATCHANY {} ACE_ENDTRY;
+ return return_value;
+}
+
+int
+TAO_Element_Equal<CORBA::Boolean>::
+operator () (TAO_DynSequence_i& dyn_any,
+ CORBA::Boolean element) const
+{
+ int return_value = 0;
+ ACE_TRY_NEW_ENV
+ {
+ CORBA::Boolean value = (CORBA::Boolean) dyn_any.get_short (ACE_ENV_SINGLE_ARG_PARAMETER);
+ ACE_TRY_CHECK;
+ return_value = (value == element);
+ }
+ ACE_CATCHANY {} ACE_ENDTRY;
+ return return_value;
+}
+
+int
+TAO_Element_Equal<const char*>::
+operator () (TAO_DynSequence_i& dyn_any,
+ const char* element) const
+{
+ int return_value = 0;
+ ACE_TRY_NEW_ENV
+ {
+ const char* value = dyn_any.get_string (ACE_ENV_SINGLE_ARG_PARAMETER);
+ ACE_TRY_CHECK;
+ return_value = (ACE_OS::strcmp (value, element) == 0);
+ }
+ ACE_CATCHANY {} ACE_ENDTRY;
+ return return_value;
+}
+
+TAO_Constraint_Validator::
+TAO_Constraint_Validator (void)
+{
+ // No-Op.
+}
+
+TAO_Constraint_Validator::~TAO_Constraint_Validator (void)
+{
+ for (TAO_Typecode_Table::iterator type_iter (this->type_map_);
+ ! type_iter.done ();
+ type_iter++)
+ {
+ CORBA::TypeCode_ptr corba_type = (*type_iter).int_id_;
+ CORBA::release (corba_type);
+ }
+}
+
+int
+TAO_Constraint_Validator::validate (TAO_Constraint* root)
+{
+ return root->accept(this);
+}
+
+int
+TAO_Constraint_Validator::visit_constraint (TAO_Unary_Constraint* constraint)
+{
+ int return_value = -1;
+ TAO_Expression_Type type;
+ TAO_Constraint* operand = constraint->operand ();
+ this->extract_type (operand, type);
+
+ if (this->expr_returns_boolean (type))
+ return_value = operand->accept (this);
+
+ return return_value;
+}
+
+int
+TAO_Constraint_Validator::visit_first (TAO_Noop_Constraint *)
+{
+ return 0;
+}
+
+int
+TAO_Constraint_Validator::visit_random (TAO_Noop_Constraint *)
+{
+ return 0;
+}
+
+int
+TAO_Constraint_Validator::visit_with (TAO_Unary_Constraint* unary_with)
+{
+ return this->visit_constraint (unary_with);
+}
+
+int
+TAO_Constraint_Validator::visit_min (TAO_Unary_Constraint* unary_min)
+{
+ return this->visit_unary_minus (unary_min);
+}
+
+int
+TAO_Constraint_Validator::visit_max (TAO_Unary_Constraint* unary_max)
+{
+ return this->visit_unary_minus (unary_max);
+}
+
+int
+TAO_Constraint_Validator::
+visit_and (TAO_Binary_Constraint* boolean_and)
+{
+ int return_value = -1;
+ TAO_Constraint* left = boolean_and->left_operand (),
+ *right = boolean_and->right_operand ();
+ TAO_Expression_Type left_type, right_type;
+ this->extract_type (left, left_type);
+ this->extract_type (right, right_type);
+
+ // Can only "and" expressions that return a boolean value
+ if (this->expr_returns_boolean (left_type) &&
+ this->expr_returns_boolean (right_type))
+ {
+ if (left->accept (this) == 0 &&
+ right->accept (this) == 0)
+ return_value = 0;
+ }
+
+ return return_value;
+}
+
+int
+TAO_Constraint_Validator::
+visit_or(TAO_Binary_Constraint* boolean_or)
+{
+ // The types for or are the same as those for and.
+ return this->visit_and (boolean_or);
+}
+
+int
+TAO_Constraint_Validator::
+visit_not (TAO_Unary_Constraint* unary_not)
+{
+ int return_value = -1;
+ // Not can only negate an expression that returns a boolean.
+ TAO_Expression_Type type;
+ TAO_Constraint* operand = unary_not->operand ();
+ this->extract_type (operand, type);
+
+ if (this->expr_returns_boolean (type))
+ return_value = operand->accept (this);
+
+ return return_value;
+}
+
+int
+TAO_Constraint_Validator::
+visit_exist (TAO_Unary_Constraint* unary_exist)
+{
+ // Exist simply requires that its operand be a property name
+ // included in the service type.
+ int return_value = -1;
+ TAO_Constraint* operand = unary_exist->operand ();
+ TAO_Expression_Type type = operand->expr_type ();
+
+ if (type == TAO_IDENT)
+ return_value = operand->accept (this);
+
+ return return_value;
+}
+
+int
+TAO_Constraint_Validator::
+visit_unary_minus (TAO_Unary_Constraint* unary_minus)
+{
+ // Unary minus can only negate a numeric operand.
+ int return_value = -1;
+ TAO_Expression_Type type;
+ TAO_Constraint* operand = unary_minus->operand ();
+ this->extract_type (operand, type);
+
+ if (this->expr_returns_number (type))
+ return_value = operand->accept (this);
+
+ return return_value;
+}
+
+int
+TAO_Constraint_Validator::
+visit_add (TAO_Binary_Constraint* boolean_add)
+{
+ // All the mathematical operators require numeric operands.
+ int return_value = -1;
+ TAO_Constraint* left = boolean_add->left_operand (),
+ *right = boolean_add->right_operand ();
+ TAO_Expression_Type left_type, right_type;
+ this->extract_type (left, left_type);
+ this->extract_type (right, right_type);
+
+ if (this->expr_returns_number (left_type) &&
+ this->expr_returns_number (right_type))
+ {
+ if (left->accept (this) == 0 &&
+ right->accept (this) == 0)
+ return_value = 0;
+ }
+
+ return return_value;
+}
+
+int
+TAO_Constraint_Validator::
+visit_sub (TAO_Binary_Constraint* boolean_sub)
+{
+ return this->visit_add (boolean_sub);
+}
+
+int
+TAO_Constraint_Validator::
+visit_mult (TAO_Binary_Constraint* boolean_mult)
+{
+ return this->visit_add (boolean_mult);
+}
+
+int
+TAO_Constraint_Validator::
+visit_div (TAO_Binary_Constraint* boolean_div)
+{
+ // Div not only requires that both of its operands be numeric, but
+ // also the the demoninator not be zero. However, since the
+ // denominator can be an expression who's value can only be
+ // determined while evaulating the constraint expression, this
+ // method detects only when the demoniator is a literal whose value
+ // is zero.
+ int return_value = -1;
+ TAO_Constraint* left = boolean_div->left_operand (),
+ *right = boolean_div->right_operand ();
+ TAO_Expression_Type left_type, right_type;
+ this->extract_type (left, left_type);
+ this->extract_type (right, right_type);
+
+ if (this->expr_returns_number (left_type) &&
+ this->expr_returns_number (right_type))
+ {
+ // Prevent division by zero, a no no.
+ int right_isnt_zero = 1;
+ switch(right->expr_type ())
+ {
+ case TAO_UNSIGNED:
+ right_isnt_zero =
+ ((CORBA::ULong) (*((TAO_Literal_Constraint*) right)) != 0);
+ break;
+ case TAO_SIGNED:
+ right_isnt_zero =
+ ((CORBA::Long) (*((TAO_Literal_Constraint*) right)) != 0);
+ break;
+ case TAO_DOUBLE:
+ right_isnt_zero =
+ ((CORBA::Double) (*((TAO_Literal_Constraint*) right)) != 0.0);
+ break;
+ }
+
+ if (right_isnt_zero)
+ {
+ if (left->accept (this) == 0 &&
+ right->accept (this) == 0)
+ return_value = 0;
+ }
+ }
+
+ return return_value;
+}
+
+int
+TAO_Constraint_Validator::
+visit_twiddle (TAO_Binary_Constraint* binary_twiddle)
+{
+ // Twiddle requires that both of its operand be strings.
+ int return_value = -1;
+ TAO_Constraint* left = binary_twiddle->left_operand (),
+ *right = binary_twiddle->right_operand ();
+ TAO_Expression_Type left_type, right_type;
+ this->extract_type (left, left_type);
+ this->extract_type (right, right_type);
+
+ if (this->expr_returns_string (left_type) &&
+ this->expr_returns_string (right_type))
+ {
+ if (left->accept (this) == 0 &&
+ right->accept (this) == 0)
+ return_value = 0;
+ }
+
+ return return_value;
+}
+
+int
+TAO_Constraint_Validator::
+visit_in (TAO_Binary_Constraint* binary_in)
+{
+ // In requires that the right operand be a sequence of a simple type
+ // and that its left operand be an expression that evaluates to a
+ // value of the same simple type.
+ int return_value = -1;
+ TAO_Expression_Type left_type, right_type;
+ TAO_Constraint
+ *left = binary_in->left_operand (),
+ *right = binary_in->right_operand ();
+
+ CORBA::TypeCode* prop_type = this->extract_type (right, right_type);
+ this->extract_type (left, left_type);
+
+ if (right_type == TAO_SEQUENCE)
+ {
+ ACE_DECLARE_NEW_CORBA_ENV;
+ CORBA::Boolean types_match = 0;
+ CORBA::TCKind seq_type = CORBA::tk_void;
+ ACE_TRY
+ {
+ seq_type =
+ TAO_Sequence_Extracter_Base::sequence_type (prop_type ACE_ENV_ARG_PARAMETER);
+ ACE_TRY_CHECK;
+ }
+ ACE_CATCHANY
+ {
+ return return_value;
+ }
+ ACE_ENDTRY;
+
+ if (seq_type != CORBA::tk_void)
+ {
+ if (this->expr_returns_number (left_type))
+ {
+ types_match = (seq_type == CORBA::tk_short ||
+ seq_type == CORBA::tk_ushort ||
+ seq_type == CORBA::tk_long ||
+ seq_type == CORBA::tk_ulong ||
+ seq_type == CORBA::tk_float ||
+ seq_type == CORBA::tk_double);
+ }
+ else if (this->expr_returns_boolean (left_type))
+ types_match = (seq_type == CORBA::tk_boolean);
+ else if (this->expr_returns_string (left_type))
+ types_match = (seq_type == CORBA::tk_string);
+
+ if (types_match)
+ return_value = left->accept (this);
+ }
+ }
+
+ return return_value;
+}
+
+int
+TAO_Constraint_Validator::
+visit_less_than(TAO_Binary_Constraint* boolean_lt)
+{
+ // Comparison operations require that both operands be of the same
+ // simple type.
+ int return_value = -1;
+ TAO_Constraint* left = boolean_lt->left_operand (),
+ *right = boolean_lt->right_operand ();
+ TAO_Expression_Type left_type, right_type;
+ this->extract_type (left, left_type);
+ this->extract_type (right, right_type);
+
+ if ((this->expr_returns_number (left_type) &&
+ this->expr_returns_number (right_type)) ||
+ (this->expr_returns_string (left_type) &&
+ this->expr_returns_string (right_type)))
+ {
+ if (left->accept (this) == 0 &&
+ right->accept (this) == 0)
+ return_value = 0;
+ }
+
+ return return_value;
+}
+
+int
+TAO_Constraint_Validator::
+visit_less_than_equal (TAO_Binary_Constraint* boolean_lte)
+{
+ return this->visit_less_than (boolean_lte);
+}
+
+int
+TAO_Constraint_Validator::
+visit_greater_than (TAO_Binary_Constraint* boolean_gt)
+{
+ return this->visit_less_than (boolean_gt);
+}
+
+int
+TAO_Constraint_Validator::
+visit_greater_than_equal (TAO_Binary_Constraint* boolean_gte)
+{
+ return this->visit_less_than(boolean_gte);
+}
+
+int
+TAO_Constraint_Validator::
+visit_equal (TAO_Binary_Constraint* boolean_eq)
+{
+ int return_value = -1;
+ TAO_Constraint* left = boolean_eq->left_operand (),
+ *right = boolean_eq->right_operand ();
+ TAO_Expression_Type left_type, right_type;
+ this->extract_type (left, left_type);
+ this->extract_type (right, right_type);
+
+ if ((this->expr_returns_number (left_type) &&
+ this->expr_returns_number (right_type)) ||
+ (this->expr_returns_string (left_type) &&
+ this->expr_returns_string (right_type)) ||
+ (this->expr_returns_boolean (left_type) &&
+ this->expr_returns_boolean (right_type)))
+ {
+ if (left->accept (this) == 0 &&
+ right->accept (this) == 0)
+ return_value = 0;
+ }
+
+ return return_value;
+}
+
+int
+TAO_Constraint_Validator::
+visit_not_equal (TAO_Binary_Constraint* boolean_neq)
+{
+ return this->visit_equal (boolean_neq);
+}
+
+int
+TAO_Constraint_Validator::
+visit_literal (TAO_Literal_Constraint *)
+{
+ return 0;
+}
+
+int
+TAO_Constraint_Validator::
+visit_property (TAO_Property_Constraint *)
+{
+ return 0;
+}
+
+CORBA::TypeCode*
+TAO_Constraint_Validator::extract_type (TAO_Constraint* expr,
+ TAO_Expression_Type& type)
+{
+ CORBA::TypeCode* return_value = 0;
+
+ type = expr->expr_type ();
+ if (type == TAO_IDENT)
+ {
+ TAO_Property_Constraint* prop = (TAO_Property_Constraint*) expr;
+ CORBA::String_var prop_name (prop->name ());
+
+ if (this->type_map_.find (prop_name, return_value) == 0)
+ type = TAO_Literal_Constraint::comparable_type (return_value);
+ }
+
+ return return_value;
+}
+
+int
+TAO_Constraint_Validator::expr_returns_boolean (TAO_Expression_Type expr_type)
+{
+ // If the expression is a boolean operations, a boolean literal, or
+ // a boolean property, return 1.
+ int return_value = 0;
+
+ if (expr_type <= TAO_BOOLEAN)
+ return_value = 1;
+
+ return return_value;
+}
+
+
+int
+TAO_Constraint_Validator::expr_returns_number (TAO_Expression_Type expr_type)
+{
+ // If the expression is a number operation, a numeric literal, or a
+ // numeric property, return 1.
+ int return_value = 0;
+
+ if ((expr_type >= TAO_PLUS && expr_type <= TAO_NUMBER) ||
+ (expr_type >= TAO_UNSIGNED && expr_type <= TAO_DOUBLE))
+ return_value = 1;
+
+ return return_value;
+}
+
+int
+TAO_Constraint_Validator::expr_returns_string (TAO_Expression_Type expr_type)
+{
+ // If the expression is an operation with a string return value, a
+ // string literal, or a property whose type is string, return 1.
+ int return_value = 0;
+
+ if (expr_type == TAO_STRING)
+ return_value = 1;
+
+ return return_value;
+}
+
+TAO_END_VERSIONED_NAMESPACE_DECL
diff --git a/TAO/orbsvcs/orbsvcs/Trader/Constraint_Visitors.h b/TAO/orbsvcs/orbsvcs/Trader/Constraint_Visitors.h
new file mode 100644
index 00000000000..9bbba2e8755
--- /dev/null
+++ b/TAO/orbsvcs/orbsvcs/Trader/Constraint_Visitors.h
@@ -0,0 +1,449 @@
+/* -*- C++ -*- */
+
+//=============================================================================
+/**
+ * @file Constraint_Visitors.h
+ *
+ * $Id$
+ *
+ * @author Seth Widoff <sbw1@cs.wustl.edu>
+ */
+//=============================================================================
+
+
+#ifndef TAO_CONSTRAINT_VISITOR_H
+#define TAO_CONSTRAINT_VISITOR_H
+#include /**/ "ace/pre.h"
+
+#include "orbsvcs/Trader/Interpreter_Utils.h"
+#include "orbsvcs/Trader/trading_serv_export.h"
+#include "ace/Containers.h"
+
+TAO_BEGIN_VERSIONED_NAMESPACE_DECL
+
+class TAO_DynSequence_i;
+
+class TAO_Constraint;
+class TAO_Unary_Constraint;
+class TAO_Binary_Constraint;
+class TAO_Literal_Constraint;
+class TAO_Property_Constraint;
+class TAO_Noop_Constraint;
+
+/**
+ * @class TAO_Constraint_Visitor
+ *
+ * @brief This is the base class for all visitors who wish to preform
+ * some operation from the state of the expression tree. Using
+ * double dispatching, subclasses of Constraint expression call
+ * back to the InterpreterVisitor subclass from the accept
+ * method.
+ *
+ * Traversal of the expression tree uses the "Visitor"
+ * pattern. To "visit" a node, a client invokes the "accept"
+ * method on a subclass of ConstraintExpression, which, in turn,
+ * invokes the appropriate method on the visitor passed to it,
+ * based on its own type. So, the Constraint_Visitor has a
+ * method to deal with each possible type of node in an
+ * expression tree; one for each operator in the grammar.
+ */
+class TAO_Trading_Serv_Export TAO_Constraint_Visitor
+{
+public:
+
+ virtual ~TAO_Constraint_Visitor (void) {}
+
+ virtual int visit_constraint (TAO_Unary_Constraint* constraint) = 0;
+
+ virtual int visit_with (TAO_Unary_Constraint* unary_with) = 0;
+ virtual int visit_min (TAO_Unary_Constraint* unary_min) = 0;
+ virtual int visit_max (TAO_Unary_Constraint* unary_max) = 0;
+ virtual int visit_first (TAO_Noop_Constraint* noop_first) = 0;
+ virtual int visit_random (TAO_Noop_Constraint* noop_random) = 0;
+
+ virtual int visit_and (TAO_Binary_Constraint* boolean_and) = 0;
+ virtual int visit_or (TAO_Binary_Constraint* boolean_or) = 0;
+ virtual int visit_not (TAO_Unary_Constraint* unary_not) = 0;
+
+ virtual int visit_exist (TAO_Unary_Constraint* unary_exist) = 0;
+ virtual int visit_unary_minus (TAO_Unary_Constraint* unary_minus) = 0;
+
+ virtual int visit_add (TAO_Binary_Constraint* boolean_add) = 0;
+ virtual int visit_sub (TAO_Binary_Constraint* boolean_sub) = 0;
+ virtual int visit_mult (TAO_Binary_Constraint* boolean_mult) = 0;
+ virtual int visit_div (TAO_Binary_Constraint* boolean_div) = 0;
+
+ virtual int visit_twiddle (TAO_Binary_Constraint* binary_twiddle) = 0;
+ virtual int visit_in (TAO_Binary_Constraint* binary_in) = 0;
+
+ virtual int visit_less_than (TAO_Binary_Constraint* boolean_lt) = 0;
+ virtual int visit_less_than_equal (TAO_Binary_Constraint* boolean_lte) = 0;
+ virtual int visit_greater_than (TAO_Binary_Constraint* boolean_gt) = 0;
+ virtual int visit_greater_than_equal (TAO_Binary_Constraint* boolean_gte) = 0;
+ virtual int visit_equal (TAO_Binary_Constraint* boolean_eq) = 0;
+ virtual int visit_not_equal (TAO_Binary_Constraint* boolean_neq) = 0;
+
+ virtual int visit_literal (TAO_Literal_Constraint* literal) = 0;
+ virtual int visit_property (TAO_Property_Constraint* literal) = 0;
+};
+
+TAO_END_VERSIONED_NAMESPACE_DECL
+
+#include "orbsvcs/Trader/Constraint_Nodes.h"
+
+TAO_BEGIN_VERSIONED_NAMESPACE_DECL
+
+/**
+ * @class TAO_Constraint_Validator
+ *
+ * @brief TAO_Constraint_Validator ensures that in an expression tree
+ * passed to it, the operands of each operation match the
+ * correct types.
+ *
+ * TAO_Constraint_Validator uses the visitor pattern to
+ * traverse all the nodes in an expression tree, checking that
+ * for each operator node the operands are of the proper data
+ * type it they're literals, or that they exist in the service
+ * type definition _and_ have the proper type, if they're
+ * property names. The algorithm for type
+ * checking is as follows: ensure that operand expression(s)
+ * return the correct types using expr_returns* methods. If they
+ * (or it) return the correct types, call accept
+ * on each operand until all return true or one returns false,
+ * at which point we can back out of the traversal and indicate
+ * failure.
+ */
+class TAO_Trading_Serv_Export TAO_Constraint_Validator : public TAO_Constraint_Visitor
+{
+public:
+ /// Constructor.
+ TAO_Constraint_Validator (void);
+
+ /// Destructor.
+ virtual ~TAO_Constraint_Validator (void);
+
+ /**
+ * Validate returns 1 if the expression tree whose root is <root>
+ * makes semantic sense, in that the operands for each operation
+ * comply with each other and the types accepted by the operator.
+ */
+ int validate (TAO_Constraint* root);
+
+ // = Visitor Methods
+
+ virtual int visit_constraint (TAO_Unary_Constraint* constraint);
+
+ virtual int visit_with (TAO_Unary_Constraint* unary_with);
+ virtual int visit_min (TAO_Unary_Constraint* unary_min);
+ virtual int visit_max (TAO_Unary_Constraint* unary_max);
+ virtual int visit_first (TAO_Noop_Constraint* noop_first);
+ virtual int visit_random (TAO_Noop_Constraint* noop_random);
+
+ /// The two operands must return a boolean value.
+ virtual int visit_and (TAO_Binary_Constraint* boolean_and);
+ virtual int visit_or (TAO_Binary_Constraint* boolean_or);
+
+ /// The operand must return a boolean value.
+ virtual int visit_not (TAO_Unary_Constraint* unary_not);
+
+ /// The operand must return a valid (i.e., present in the service
+ /// type description) property name.
+ virtual int visit_exist (TAO_Unary_Constraint* unary_exist);
+
+ /// The operand must return a number to be negated.
+ virtual int visit_unary_minus (TAO_Unary_Constraint* unary_minus);
+
+ /// Both operands must return numeric results.
+ virtual int visit_add (TAO_Binary_Constraint* boolean_add);
+ virtual int visit_sub (TAO_Binary_Constraint* boolean_sub);
+ virtual int visit_mult (TAO_Binary_Constraint* boolean_mult);
+ virtual int visit_div (TAO_Binary_Constraint* boolean_div);
+
+ /// Both operands must return strings.
+ virtual int visit_twiddle (TAO_Binary_Constraint* binary_twiddle);
+
+ /// The right operand must be a sequence of the same simple type as
+ /// the left operand.
+ virtual int visit_in (TAO_Binary_Constraint* binary_in);
+
+ /// The left and right operands must both be of the same simple type.
+ virtual int visit_less_than (TAO_Binary_Constraint* boolean_lt);
+ virtual int visit_less_than_equal (TAO_Binary_Constraint* boolean_lte);
+ virtual int visit_greater_than (TAO_Binary_Constraint* boolean_gt);
+ virtual int visit_greater_than_equal (TAO_Binary_Constraint* boolean_gte);
+ virtual int visit_equal (TAO_Binary_Constraint* boolean_eq);
+ virtual int visit_not_equal (TAO_Binary_Constraint* boolean_neq);
+
+ /// The property must be defined in the service type description.
+ virtual int visit_literal (TAO_Literal_Constraint* literal);
+ virtual int visit_property (TAO_Property_Constraint* literal);
+
+protected:
+
+ /// A map gleaned from the ServiceTypeStruct, which correlates
+ /// property names with their types.
+ TAO_Typecode_Table type_map_;
+
+private:
+
+ CORBA::TypeCode* extract_type (TAO_Constraint* expr_type,
+ TAO_Expression_Type& type);
+
+ /// expr_returns_boolean returns 1 if <expr_type>, when evaluated, will
+ /// return a boolean.
+ int expr_returns_boolean (TAO_Expression_Type expr_type);
+
+ /// expr_returns_boolean returns 1 if <expr_type>, when evaluated, will
+ /// return a number.
+ int expr_returns_number (TAO_Expression_Type expr_type);
+
+ /// expr_returns_boolean returns 1 if <expr_type>, when evaluated, will
+ /// return a string.
+ int expr_returns_string (TAO_Expression_Type expr_type);
+
+ TAO_Constraint_Validator (const TAO_Constraint_Validator&);
+ TAO_Constraint_Validator& operator= (const TAO_Constraint_Validator&);
+};
+
+/**
+ * @class TAO_Constraint_Evaluator
+ *
+ * @brief TAO_Constraint_Evaluator traverse a constraint expression
+ * tree, and determines whether an offer fits the constraints
+ * represented by the tree
+ *
+ * Using the Visitor pattern, the TAO_Constraint_Evaluator has
+ * each node of the expression tree call back to it with the
+ * method designated for its type. In that method, the visitor
+ * will evaluate its operands and perform the operation
+ * designated by that node's type, and return the result. Note:
+ * the TAO_Constraint_Evaluator assumes the tree is semantically
+ * correct, that is, the validate method on
+ * TAO_Constraint_Validator return true. The only possible
+ * evaluation time errors are a divide by a property whose value
+ * is zero and undefined properties.
+ */
+class TAO_Trading_Serv_Export TAO_Constraint_Evaluator : public TAO_Constraint_Visitor
+{
+public:
+
+ /// Constructor.
+ TAO_Constraint_Evaluator (void);
+
+ /**
+ * Evaluate returns 1 if the offer satisfies the constraints
+ * represented by the the expression tree rooted at <root>, 0 if it
+ * doesn't. If an error occurs during process, the constraint
+ * automatically fails.
+ */
+ CORBA::Boolean evaluate_constraint (TAO_Constraint* root);
+
+ /// The result of the preference evaluation is stored in result. The
+ /// method returns 0 upon success, -1 upon failure.
+ int evaluate_preference (TAO_Constraint* root,
+ TAO_Literal_Constraint& result);
+
+ // = Visitor Methods
+
+ virtual int visit_constraint (TAO_Unary_Constraint* constraint);
+
+ virtual int visit_with (TAO_Unary_Constraint* unary_with);
+ virtual int visit_min (TAO_Unary_Constraint* unary_min);
+ virtual int visit_max (TAO_Unary_Constraint* unary_max);
+ virtual int visit_first (TAO_Noop_Constraint* noop_first);
+ virtual int visit_random (TAO_Noop_Constraint* noop_random);
+
+ /**
+ * Takes the logical and of the results of both operands. Note that
+ * in the case where the left operand returns zero, the result is
+ * immediately known.
+ */
+ virtual int visit_and (TAO_Binary_Constraint* boolean_and);
+
+ /**
+ * Takes the logical or of the results of both operands. Note that
+ * in the case where the left operand returns one, the result is
+ * immediately known.
+ */
+ virtual int visit_or (TAO_Binary_Constraint* boolean_or);
+
+ /// Logically negates the value of the operand.
+ virtual int visit_not (TAO_Unary_Constraint* unary_not);
+
+ /// The property exists if its name is bound to a value in the
+ /// <props_> map.
+ virtual int visit_exist (TAO_Unary_Constraint* unary_exist);
+
+ /// Mathematically negates the return value the operand.
+ virtual int visit_unary_minus (TAO_Unary_Constraint* unary_minus);
+
+ /// Add the results of evaluating the left and right operands.
+ virtual int visit_add (TAO_Binary_Constraint* boolean_add);
+
+ /// Subtract the results of evaluating the left and right operands.
+ virtual int visit_sub (TAO_Binary_Constraint* boolean_sub);
+
+ /// Multiply the results of evaluating the left and right operands.
+ virtual int visit_mult (TAO_Binary_Constraint* boolean_mult);
+
+ /// Divide the results of evaluating the left and right operands.
+ virtual int visit_div (TAO_Binary_Constraint* boolean_div);
+
+ /// Determines if the right operand is a substring of the left.
+ virtual int visit_twiddle (TAO_Binary_Constraint* binary_twiddle);
+
+ /// Determines if the sequence represented by the right operand
+ /// contains the left operand.
+ virtual int visit_in (TAO_Binary_Constraint* binary_in);
+
+ // = Compare the results of evaluating left and right operands.
+ virtual int visit_less_than (TAO_Binary_Constraint* boolean_lt);
+ virtual int visit_less_than_equal (TAO_Binary_Constraint* boolean_lte);
+ virtual int visit_greater_than (TAO_Binary_Constraint* boolean_gt);
+ virtual int visit_greater_than_equal (TAO_Binary_Constraint* boolean_gte);
+ virtual int visit_equal (TAO_Binary_Constraint* boolean_eq);
+ virtual int visit_not_equal (TAO_Binary_Constraint* boolean_neq);
+
+ /// Copy the value of the literal into the result container.
+ virtual int visit_literal (TAO_Literal_Constraint* literal);
+
+ /// Copy the value of the property into the result container.
+ virtual int visit_property (TAO_Property_Constraint* literal);
+
+private:
+
+ class TAO_Trading_Serv_Export Operand_Queue :
+ public ACE_Unbounded_Queue <TAO_Literal_Constraint>
+ // = TITLE
+ // A queue adapter with methods to setting and getting operands
+ // from the expression evaluation results.
+ {
+ public:
+
+ Operand_Queue (void);
+
+ /// In a binary operation, obtain the left operand.
+ TAO_Literal_Constraint& get_left_operand (void);
+
+ /// In a binary operation, obtain the right operand.
+ TAO_Literal_Constraint& get_right_operand (void);
+
+ /// In a unary operation, obtain the only operand.
+ TAO_Literal_Constraint& get_operand (void);
+
+ /// Remove an operand from the queue.
+ void dequeue_operand (void);
+ };
+
+ /// Method for performing a arithmetic or comparison operation.
+ void do_the_op (int operation);
+
+ /// Method for evaluating a binary operation.
+ int visit_bin_op (TAO_Binary_Constraint* op, int operation);
+
+ /// Determine if sequence contains <element>, a literal of the same
+ /// simple type as <sequence_type>. Return 1 in this eventuality.
+ CORBA::Boolean sequence_does_contain (CORBA::Any* sequence,
+ TAO_Literal_Constraint& element);
+
+ /// Disallow copying.
+ TAO_Constraint_Evaluator (const TAO_Constraint_Evaluator&);
+ TAO_Constraint_Evaluator& operator= (const TAO_Constraint_Evaluator&);
+
+protected:
+
+ /// The map of property names to their values for a property.
+ TAO_Lookup_Table props_;
+
+ /// The result of a non_boolean operation.
+ Operand_Queue queue_;
+};
+
+// Forward declaration
+template <class ELEMENT_TYPE> class TAO_Element_Equal;
+
+template<>
+class TAO_Element_Equal<CORBA::Short>
+{
+public:
+ /// Calls the correct method on dyn_seq to extract the element type,
+ /// then uses the appropriate form of equals comparison.
+ int operator () (TAO_DynSequence_i& dyn_any,
+ CORBA::Short element) const;
+};
+
+template<>
+class TAO_Element_Equal<CORBA::UShort>
+{
+public:
+ /// Calls the correct method on dyn_seq to extract the element type,
+ /// then uses the appropriate form of equals comparison.
+ int operator () (TAO_DynSequence_i& dyn_any,
+ CORBA::UShort element) const;
+};
+
+template<>
+class TAO_Element_Equal<CORBA::Long>
+{
+public:
+ /// Calls the correct method on dyn_seq to extract the element type,
+ /// then uses the appropriate form of equals comparison.
+ int operator () (TAO_DynSequence_i& dyn_any,
+ CORBA::Long element) const;
+};
+
+template<>
+class TAO_Element_Equal<CORBA::ULong>
+{
+public:
+ /// Calls the correct method on dyn_seq to extract the element type, then
+ /// uses the appropriate form of equals comparison.
+ int operator () (TAO_DynSequence_i& dyn_any,
+ CORBA::ULong element) const;
+
+};
+
+template<>
+class TAO_Element_Equal<CORBA::Float>
+{
+public:
+ /// Calls the correct method on dyn_seq to extract the element type,
+ /// then uses the appropriate form of equals comparison.
+ int operator () (TAO_DynSequence_i& dyn_any,
+ CORBA::Float element) const;
+};
+
+template<>
+class TAO_Element_Equal<CORBA::Double>
+{
+public:
+ /// Calls the correct method on dyn_seq to extract the element type,
+ /// then uses the appropriate form of equals comparison.
+ int operator () (TAO_DynSequence_i& dyn_any,
+ CORBA::Double element) const;
+};
+
+template<>
+class TAO_Element_Equal<CORBA::Boolean>
+{
+public:
+ /// Calls the correct method on dyn_seq to extract the element type,
+ /// then uses the appropriate form of equals comparison.
+ int operator () (TAO_DynSequence_i& dyn_any,
+ CORBA::Boolean element) const;
+};
+
+template<>
+class TAO_Element_Equal<const char*>
+{
+public:
+ /// Calls the correct method on dyn_seq to extract the element type,
+ /// then uses the appropriate form of equals comparison.
+ int operator () (TAO_DynSequence_i& dyn_any,
+ const char* element) const;
+};
+
+TAO_END_VERSIONED_NAMESPACE_DECL
+
+#include /**/ "ace/post.h"
+#endif /* CONSTRAINT_VISITORS_H */
diff --git a/TAO/orbsvcs/orbsvcs/Trader/Constraint_l.cpp b/TAO/orbsvcs/orbsvcs/Trader/Constraint_l.cpp
new file mode 100644
index 00000000000..a451f98e6a9
--- /dev/null
+++ b/TAO/orbsvcs/orbsvcs/Trader/Constraint_l.cpp
@@ -0,0 +1,1790 @@
+/* A lexical scanner generated by flex */
+
+/* Scanner skeleton version:
+ * $Header$
+ */
+
+#define FLEX_SCANNER
+#define YY_FLEX_MAJOR_VERSION 2
+#define YY_FLEX_MINOR_VERSION 5
+
+#include "tao/orbconf.h"
+#include "ace/OS.h"
+
+/* cfront 1.2 defines "c_plusplus" instead of "__cplusplus" */
+#ifdef c_plusplus
+#ifndef __cplusplus
+#define __cplusplus
+#endif
+#endif
+
+
+#ifdef __cplusplus
+
+/* Use prototypes in function declarations. */
+#define YY_USE_PROTOS
+
+/* The "const" storage-class-modifier is valid. */
+#define YY_USE_CONST
+
+#else /* ! __cplusplus */
+
+#if __STDC__
+
+#define YY_USE_PROTOS
+#define YY_USE_CONST
+
+#endif /* __STDC__ */
+#endif /* ! __cplusplus */
+
+#ifdef YY_USE_CONST
+#define yyconst const
+#else
+#define yyconst
+#endif
+
+
+#ifdef YY_USE_PROTOS
+#define YY_PROTO(proto) proto
+#else
+#define YY_PROTO(proto) ()
+#endif
+
+/* Returned upon end-of-file. */
+#define YY_NULL 0
+
+/* Promotes a possibly negative, possibly signed char to an unsigned
+ * integer for use as an array index. If the signed char is negative,
+ * we want to instead treat it as an 8-bit unsigned char, hence the
+ * double cast.
+ */
+#define YY_SC_TO_UI(c) ((unsigned int) (unsigned char) c)
+
+/* Enter a start condition. This macro really ought to take a parameter,
+ * but we do it the disgusting crufty way forced on us by the ()-less
+ * definition of BEGIN.
+ */
+#define BEGIN yy_start = 1 + 2 *
+
+/* Translate the current start state into a value that can be later handed
+ * to BEGIN to return to the state. The YYSTATE alias is for lex
+ * compatibility.
+ */
+#define YY_START ((yy_start - 1) / 2)
+#define YYSTATE YY_START
+
+/* Action number for EOF rule of a given start state. */
+#define YY_STATE_EOF(state) (YY_END_OF_BUFFER + state + 1)
+
+/* Special action meaning "start processing a new file". */
+#define YY_NEW_FILE yyrestart( yyin )
+
+#define YY_END_OF_BUFFER_CHAR 0
+
+/* Size of default input buffer. */
+#define YY_BUF_SIZE 16384
+
+TAO_BEGIN_VERSIONED_NAMESPACE_DECL
+
+typedef struct yy_buffer_state *YY_BUFFER_STATE;
+
+extern int yyleng;
+extern FILE *yyin, *yyout;
+
+#define EOB_ACT_CONTINUE_SCAN 0
+#define EOB_ACT_END_OF_FILE 1
+#define EOB_ACT_LAST_MATCH 2
+
+/* The funky do-while in the following #define is used to turn the definition
+ * int a single C statement (which needs a semi-colon terminator). This
+ * avoids problems with code like:
+ *
+ * if ( condition_holds )
+ * yyless( 5 );
+ * else
+ * do_something_else();
+ *
+ * Prior to using the do-while the compiler would get upset at the
+ * "else" because it interpreted the "if" statement as being all
+ * done when it reached the ';' after the yyless() call.
+ */
+
+/* Return all but the first 'n' matched characters back to the input stream. */
+
+#define yyless(n) \
+ do \
+ { \
+ /* Undo effects of setting up yytext. */ \
+ *yy_cp = yy_hold_char; \
+ YY_RESTORE_YY_MORE_OFFSET \
+ yy_c_buf_p = yy_cp = yy_bp + n - YY_MORE_ADJ; \
+ YY_DO_BEFORE_ACTION; /* set up yytext again */ \
+ } \
+ while ( 0 )
+
+#define unput(c) yyunput( c, yytext_ptr )
+
+/* The following is because we cannot portably get our hands on size_t
+ * (without autoconf's help, which isn't available because we want
+ * flex-generated scanners to compile on their own).
+ */
+typedef unsigned int yy_size_t;
+
+
+struct yy_buffer_state
+ {
+ FILE *yy_input_file;
+
+ char *yy_ch_buf; /* input buffer */
+ char *yy_buf_pos; /* current position in input buffer */
+
+ /* Size of input buffer in bytes, not including room for EOB
+ * characters.
+ */
+ yy_size_t yy_buf_size;
+
+ /* Number of characters read into yy_ch_buf, not including EOB
+ * characters.
+ */
+ int yy_n_chars;
+
+ /* Whether we "own" the buffer - i.e., we know we created it,
+ * and can realloc() it to grow it, and should free() it to
+ * delete it.
+ */
+ int yy_is_our_buffer;
+
+ /* Whether this is an "interactive" input source; if so, and
+ * if we're using stdio for input, then we want to use getc()
+ * instead of fread(), to make sure we stop fetching input after
+ * each newline.
+ */
+ int yy_is_interactive;
+
+ /* Whether we're considered to be at the beginning of a line.
+ * If so, '^' rules will be active on the next match, otherwise
+ * not.
+ */
+ int yy_at_bol;
+
+ /* Whether to try to fill the input buffer when we reach the
+ * end of it.
+ */
+ int yy_fill_buffer;
+
+ int yy_buffer_status;
+#define YY_BUFFER_NEW 0
+#define YY_BUFFER_NORMAL 1
+ /* When an EOF's been seen but there's still some text to process
+ * then we mark the buffer as YY_EOF_PENDING, to indicate that we
+ * shouldn't try reading from the input source any more. We might
+ * still have a bunch of tokens to match, though, because of
+ * possible backing-up.
+ *
+ * When we actually see the EOF, we change the status to "new"
+ * (via yyrestart()), so that the user can continue scanning by
+ * just pointing yyin at a new input file.
+ */
+#define YY_BUFFER_EOF_PENDING 2
+ };
+
+static YY_BUFFER_STATE yy_current_buffer = 0;
+
+/* We provide macros for accessing buffer states in case in the
+ * future we want to put the buffer states in a more general
+ * "scanner state".
+ */
+#define YY_CURRENT_BUFFER yy_current_buffer
+
+
+/* yy_hold_char holds the character lost when yytext is formed. */
+static char yy_hold_char;
+
+static int yy_n_chars; /* number of characters read into yy_ch_buf */
+
+
+int yyleng;
+
+/* Points to current character in buffer. */
+static char *yy_c_buf_p = (char *) 0;
+static int yy_init = 1; /* whether we need to initialize */
+static int yy_start = 0; /* start state number */
+
+/* Flag which is used to allow yywrap()'s to do buffer switches
+ * instead of setting up a fresh yyin. A bit of a hack ...
+ */
+static int yy_did_buffer_switch_on_eof;
+
+void yyrestart YY_PROTO(( FILE *input_file ));
+
+void yy_switch_to_buffer YY_PROTO(( YY_BUFFER_STATE new_buffer ));
+void yy_load_buffer_state YY_PROTO(( void ));
+YY_BUFFER_STATE yy_create_buffer YY_PROTO(( FILE *file, int size ));
+void yy_delete_buffer YY_PROTO(( YY_BUFFER_STATE b ));
+void yy_init_buffer YY_PROTO(( YY_BUFFER_STATE b, FILE *file ));
+void yy_flush_buffer YY_PROTO(( YY_BUFFER_STATE b ));
+#define YY_FLUSH_BUFFER yy_flush_buffer( yy_current_buffer )
+
+YY_BUFFER_STATE yy_scan_buffer YY_PROTO(( char *base, yy_size_t size ));
+YY_BUFFER_STATE yy_scan_string YY_PROTO(( yyconst char *yy_str ));
+YY_BUFFER_STATE yy_scan_bytes YY_PROTO(( yyconst char *bytes, int len ));
+
+static void *yy_flex_alloc YY_PROTO(( yy_size_t ));
+static void *yy_flex_realloc YY_PROTO(( void *, yy_size_t ));
+static void yy_flex_free YY_PROTO(( void * ));
+
+#define yy_new_buffer yy_create_buffer
+
+#define yy_set_interactive(is_interactive) \
+ { \
+ if ( ! yy_current_buffer ) \
+ yy_current_buffer = yy_create_buffer( yyin, YY_BUF_SIZE ); \
+ yy_current_buffer->yy_is_interactive = is_interactive; \
+ }
+
+#define yy_set_bol(at_bol) \
+ { \
+ if ( ! yy_current_buffer ) \
+ yy_current_buffer = yy_create_buffer( yyin, YY_BUF_SIZE ); \
+ yy_current_buffer->yy_at_bol = at_bol; \
+ }
+
+#define YY_AT_BOL() (yy_current_buffer->yy_at_bol)
+
+typedef unsigned char YY_CHAR;
+FILE *yyin = (FILE *) 0, *yyout = (FILE *) 0;
+typedef int yy_state_type;
+extern char *yytext;
+#define yytext_ptr yytext
+
+static yy_state_type yy_get_previous_state YY_PROTO(( void ));
+static yy_state_type yy_try_NUL_trans YY_PROTO(( yy_state_type current_state ));
+static int yy_get_next_buffer YY_PROTO(( void ));
+static void yy_fatal_error YY_PROTO(( yyconst char msg[] ));
+
+/* Done after the current pattern has been matched and before the
+ * corresponding action - sets up yytext.
+ */
+#define YY_DO_BEFORE_ACTION \
+ yytext_ptr = yy_bp; \
+ yyleng = (int) (yy_cp - yy_bp); \
+ yy_hold_char = *yy_cp; \
+ *yy_cp = '\0'; \
+ yy_c_buf_p = yy_cp;
+
+#define YY_NUM_RULES 31
+#define YY_END_OF_BUFFER 32
+static yyconst short int yy_accept[82] =
+ { 0,
+ 0, 0, 32, 30, 31, 30, 30, 22, 23, 14,
+ 12, 13, 30, 15, 26, 16, 30, 18, 29, 29,
+ 29, 29, 29, 29, 29, 29, 29, 29, 29, 29,
+ 11, 21, 0, 28, 0, 26, 27, 0, 26, 17,
+ 20, 19, 29, 29, 29, 29, 29, 29, 10, 29,
+ 29, 29, 9, 29, 29, 0, 0, 29, 29, 8,
+ 29, 29, 2, 1, 7, 29, 29, 0, 27, 29,
+ 24, 29, 29, 29, 5, 25, 6, 3, 29, 4,
+ 0
+ } ;
+
+static yyconst int yy_ec[256] =
+ { 0,
+ 1, 1, 1, 1, 1, 1, 1, 1, 2, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 2, 3, 1, 1, 1, 1, 1, 4, 5,
+ 6, 7, 8, 1, 9, 10, 11, 12, 12, 12,
+ 12, 12, 12, 12, 12, 12, 12, 1, 1, 13,
+ 14, 15, 1, 1, 16, 17, 17, 17, 18, 19,
+ 17, 17, 17, 17, 17, 20, 17, 17, 17, 17,
+ 17, 21, 22, 23, 24, 17, 17, 17, 17, 17,
+ 1, 25, 1, 1, 26, 1, 27, 17, 17, 28,
+
+ 29, 30, 17, 31, 32, 17, 17, 17, 33, 34,
+ 35, 17, 17, 36, 37, 38, 17, 17, 39, 40,
+ 17, 17, 1, 1, 1, 41, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+
+ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1
+ } ;
+
+static yyconst int yy_meta[42] =
+ { 0,
+ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 2, 1, 1, 1, 2, 2, 2, 2, 2,
+ 2, 2, 2, 2, 1, 2, 2, 2, 2, 2,
+ 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
+ 1
+ } ;
+
+static yyconst short int yy_base[84] =
+ { 0,
+ 0, 0, 107, 108, 108, 92, 38, 108, 108, 108,
+ 93, 92, 91, 108, 33, 88, 87, 86, 0, 83,
+ 77, 63, 56, 63, 60, 17, 58, 56, 64, 58,
+ 108, 108, 42, 108, 43, 77, 36, 76, 40, 108,
+ 108, 108, 0, 67, 62, 57, 52, 47, 0, 42,
+ 47, 42, 0, 45, 40, 47, 47, 55, 58, 0,
+ 38, 34, 0, 0, 0, 42, 38, 54, 52, 44,
+ 0, 23, 22, 23, 0, 0, 0, 0, 24, 0,
+ 108, 72, 51
+ } ;
+
+static yyconst short int yy_def[84] =
+ { 0,
+ 81, 1, 81, 81, 81, 81, 82, 81, 81, 81,
+ 81, 81, 81, 81, 81, 81, 81, 81, 83, 83,
+ 83, 83, 83, 83, 83, 83, 83, 83, 83, 83,
+ 81, 81, 82, 81, 81, 81, 81, 81, 81, 81,
+ 81, 81, 83, 83, 83, 83, 83, 83, 83, 83,
+ 83, 83, 83, 83, 83, 82, 81, 83, 83, 83,
+ 83, 83, 83, 83, 83, 83, 83, 81, 81, 83,
+ 83, 83, 83, 83, 83, 83, 83, 83, 83, 83,
+ 0, 81, 81
+ } ;
+
+static yyconst short int yy_nxt[150] =
+ { 0,
+ 4, 5, 6, 7, 8, 9, 10, 11, 12, 13,
+ 14, 15, 16, 17, 18, 19, 19, 19, 20, 19,
+ 19, 19, 21, 19, 4, 4, 22, 19, 23, 24,
+ 19, 25, 26, 27, 28, 29, 19, 19, 30, 19,
+ 31, 34, 38, 50, 39, 34, 56, 37, 51, 38,
+ 34, 39, 43, 57, 68, 68, 80, 79, 69, 78,
+ 77, 76, 35, 69, 57, 69, 35, 56, 75, 74,
+ 73, 35, 33, 33, 72, 71, 70, 67, 66, 65,
+ 64, 63, 62, 61, 60, 59, 58, 37, 36, 55,
+ 54, 53, 52, 49, 48, 47, 46, 45, 44, 42,
+
+ 41, 40, 37, 36, 36, 32, 81, 3, 81, 81,
+ 81, 81, 81, 81, 81, 81, 81, 81, 81, 81,
+ 81, 81, 81, 81, 81, 81, 81, 81, 81, 81,
+ 81, 81, 81, 81, 81, 81, 81, 81, 81, 81,
+ 81, 81, 81, 81, 81, 81, 81, 81, 81
+ } ;
+
+static yyconst short int yy_chk[150] =
+ { 0,
+ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 7, 15, 26, 15, 33, 35, 37, 26, 39,
+ 56, 39, 83, 37, 57, 57, 79, 74, 57, 73,
+ 72, 70, 7, 69, 37, 68, 33, 35, 67, 66,
+ 62, 56, 82, 82, 61, 59, 58, 55, 54, 52,
+ 51, 50, 48, 47, 46, 45, 44, 38, 36, 30,
+ 29, 28, 27, 25, 24, 23, 22, 21, 20, 18,
+
+ 17, 16, 13, 12, 11, 6, 3, 81, 81, 81,
+ 81, 81, 81, 81, 81, 81, 81, 81, 81, 81,
+ 81, 81, 81, 81, 81, 81, 81, 81, 81, 81,
+ 81, 81, 81, 81, 81, 81, 81, 81, 81, 81,
+ 81, 81, 81, 81, 81, 81, 81, 81, 81
+ } ;
+
+static yy_state_type yy_last_accepting_state;
+static char *yy_last_accepting_cpos;
+
+/* The intent behind this definition is that it'll catch
+ * any uses of REJECT which flex missed.
+ */
+#define REJECT reject_used_but_not_detected
+#define yymore() yymore_used_but_not_detected
+#define YY_MORE_ADJ 0
+#define YY_RESTORE_YY_MORE_OFFSET
+char *yytext;
+
+#define INITIAL 0
+
+TAO_END_VERSIONED_NAMESPACE_DECL
+
+// $Id$
+// ========================================================================
+//
+// = LIBRARY
+// orbsvcs
+//
+// = FILENAME
+// constraint.l
+//
+// = AUTHOR
+// Seth Widoff <sbw1@cs.wustl.edu>
+//
+// ========================================================================
+
+#include "orbsvcs/Trader/Constraint_Interpreter.h"
+#include "orbsvcs/Trader/Constraint_Nodes.h"
+#include "orbsvcs/Trader/Constraint_Tokens.h"
+
+TAO_BEGIN_VERSIONED_NAMESPACE_DECL
+
+static TAO_Literal_Constraint* extract_string(const char*);
+
+#define TAO_YY_LEX_DEBUG
+
+#ifdef TAO_CONSTRAINT_DEBUG
+#define TAO_YY_LEX_DEBUG ACE_OS::fprintf(stderr, "%s\n", yytext)
+#endif /* TAO_CONSTRAINT_DEBUG */
+
+
+
+
+/* Macros after this point can all be overridden by user definitions in
+ * section 1.
+ */
+
+#ifndef YY_SKIP_YYWRAP
+#ifdef __cplusplus
+extern "C" int yywrap YY_PROTO(( void ));
+#else
+extern int yywrap YY_PROTO(( void ));
+#endif
+#endif
+
+#if 0
+#ifndef YY_NO_UNPUT
+static void yyunput YY_PROTO(( int c, char *buf_ptr ));
+#endif
+#endif /* 0 */
+
+#ifndef yytext_ptr
+static void yy_flex_strncpy YY_PROTO(( char *, yyconst char *, int ));
+#endif
+
+#ifdef YY_NEED_STRLEN
+static int yy_flex_strlen YY_PROTO(( yyconst char * ));
+#endif
+
+#ifndef YY_NO_INPUT
+#ifdef __cplusplus
+static int yyinput YY_PROTO(( void ));
+#else
+static int input YY_PROTO(( void ));
+#endif
+#endif
+
+#if YY_STACK_USED
+static int yy_start_stack_ptr = 0;
+static int yy_start_stack_depth = 0;
+static int *yy_start_stack = 0;
+#ifndef YY_NO_PUSH_STATE
+static void yy_push_state YY_PROTO(( int new_state ));
+#endif
+#ifndef YY_NO_POP_STATE
+static void yy_pop_state YY_PROTO(( void ));
+#endif
+#ifndef YY_NO_TOP_STATE
+static int yy_top_state YY_PROTO(( void ));
+#endif
+
+#else
+#define YY_NO_PUSH_STATE 1
+#define YY_NO_POP_STATE 1
+#define YY_NO_TOP_STATE 1
+#endif
+
+TAO_END_VERSIONED_NAMESPACE_DECL
+
+#ifdef YY_MALLOC_DECL
+YY_MALLOC_DECL
+#else
+#if __STDC__
+#ifndef __cplusplus
+#include <stdlib.h>
+#endif
+#else
+/* Just try to get by without declaring the routines. This will fail
+ * miserably on non-ANSI systems for which sizeof(size_t) != sizeof(int)
+ * or sizeof(void*) != sizeof(int).
+ */
+#endif
+#endif
+
+/* Amount of stuff to slurp up with each read. */
+#ifndef YY_READ_BUF_SIZE
+#define YY_READ_BUF_SIZE 8192
+#endif
+
+/* Copy whatever the last rule matched to the standard output. */
+
+#ifndef TAO_TRADER_ECHO
+/* This used to be an fputs(), but since the string might contain NUL's,
+ * we now use fwrite().
+ */
+#define TAO_TRADER_ECHO (void) fwrite( yytext, yyleng, 1, yyout )
+#endif
+
+/* Gets input and stuffs it into "buf". number of characters read, or YY_NULL,
+ * is returned in "result".
+ */
+#ifndef YY_INPUT
+#define YY_INPUT(buf,result,max_size) \
+ if ( yy_current_buffer->yy_is_interactive ) \
+ { \
+ int c = '*', n; \
+ for ( n = 0; n < max_size && \
+ (c = getc( yyin )) != EOF && c != '\n'; ++n ) \
+ buf[n] = (char) c; \
+ if ( c == '\n' ) \
+ buf[n++] = (char) c; \
+ if ( c == EOF && ferror( yyin ) ) \
+ YY_FATAL_ERROR( "input in flex scanner failed" ); \
+ result = n; \
+ } \
+ else if ( ((result = fread( buf, 1, max_size, yyin )) == 0) \
+ && ferror( yyin ) ) \
+ YY_FATAL_ERROR( "input in flex scanner failed" );
+#endif
+
+/* No semi-colon after return; correct usage is to write "yyterminate();" -
+ * we don't want an extra ';' after the "return" because that will cause
+ * some compilers to complain about unreachable statements.
+ */
+#ifndef yyterminate
+#define yyterminate() return YY_NULL
+#endif
+
+/* Number of entries by which start-condition stack grows. */
+#ifndef YY_START_STACK_INCR
+#define YY_START_STACK_INCR 25
+#endif
+
+/* Report a fatal error. */
+#ifndef YY_FATAL_ERROR
+#define YY_FATAL_ERROR(msg) yy_fatal_error( msg )
+#endif
+
+/* Default declaration of generated scanner - a define so the user can
+ * easily add parameters.
+ */
+#ifndef YY_DECL
+#define YY_DECL int yylex YY_PROTO(( void ))
+#endif
+
+/* Code executed at the beginning of each rule, after yytext and yyleng
+ * have been set up.
+ */
+#ifndef YY_USER_ACTION
+#define YY_USER_ACTION
+#endif
+
+/* Code executed at the end of each rule. */
+#ifndef YY_BREAK
+#define YY_BREAK break;
+#endif
+
+#define YY_RULE_SETUP \
+ YY_USER_ACTION
+
+TAO_BEGIN_VERSIONED_NAMESPACE_DECL
+
+YY_DECL
+ {
+ register yy_state_type yy_current_state;
+ register char *yy_cp = 0, *yy_bp = 0;
+ register int yy_act;
+
+
+
+
+
+
+ if ( yy_init )
+ {
+ yy_init = 0;
+
+#ifdef YY_USER_INIT
+ YY_USER_INIT;
+#endif
+
+ if ( ! yy_start )
+ yy_start = 1; /* first start state */
+
+ if ( ! yyin )
+ yyin = stdin;
+
+ if ( ! yyout )
+ yyout = stdout;
+
+ if ( ! yy_current_buffer )
+ yy_current_buffer =
+ yy_create_buffer( yyin, YY_BUF_SIZE );
+
+ yy_load_buffer_state();
+ }
+
+ while ( 1 ) /* loops until end-of-file is reached */
+ {
+ yy_cp = yy_c_buf_p;
+
+ /* Support of yytext. */
+ *yy_cp = yy_hold_char;
+
+ /* yy_bp points to the position in yy_ch_buf of the start of
+ * the current run.
+ */
+ yy_bp = yy_cp;
+
+ yy_current_state = yy_start;
+yy_match:
+ do
+ {
+ register YY_CHAR yy_c = yy_ec[YY_SC_TO_UI(*yy_cp)];
+ if ( yy_accept[yy_current_state] )
+ {
+ yy_last_accepting_state = yy_current_state;
+ yy_last_accepting_cpos = yy_cp;
+ }
+ while ( yy_chk[yy_base[yy_current_state] + yy_c] != yy_current_state )
+ {
+ yy_current_state = (int) yy_def[yy_current_state];
+ if ( yy_current_state >= 82 )
+ yy_c = yy_meta[(unsigned int) yy_c];
+ }
+ yy_current_state = yy_nxt[yy_base[yy_current_state] + (unsigned int) yy_c];
+ ++yy_cp;
+ }
+ while ( yy_base[yy_current_state] != 108 );
+
+yy_find_action:
+ yy_act = yy_accept[yy_current_state];
+ if ( yy_act == 0 )
+ { /* have to back up */
+ yy_cp = yy_last_accepting_cpos;
+ yy_current_state = yy_last_accepting_state;
+ yy_act = yy_accept[yy_current_state];
+ }
+
+ YY_DO_BEFORE_ACTION;
+
+
+do_action: /* This label is used only to access EOF actions. */
+
+
+ switch ( yy_act )
+ { /* beginning of action switch */
+ case 0: /* must back up */
+ /* undo the effects of YY_DO_BEFORE_ACTION */
+ *yy_cp = yy_hold_char;
+ yy_cp = yy_last_accepting_cpos;
+ yy_current_state = yy_last_accepting_state;
+ goto yy_find_action;
+
+case 1:
+YY_RULE_SETUP
+
+{ TAO_YY_LEX_DEBUG; return TAO_MIN; }
+ ACE_NOTREACHED (YY_BREAK)
+case 2:
+YY_RULE_SETUP
+
+{ TAO_YY_LEX_DEBUG; return TAO_MAX; }
+ ACE_NOTREACHED (YY_BREAK)
+case 3:
+YY_RULE_SETUP
+
+{ TAO_YY_LEX_DEBUG; return TAO_FIRST; }
+ ACE_NOTREACHED (YY_BREAK)
+case 4:
+YY_RULE_SETUP
+
+{ TAO_YY_LEX_DEBUG; return TAO_RANDOM; }
+ ACE_NOTREACHED (YY_BREAK)
+case 5:
+YY_RULE_SETUP
+
+{ TAO_YY_LEX_DEBUG; return TAO_WITH; }
+ ACE_NOTREACHED (YY_BREAK)
+case 6:
+YY_RULE_SETUP
+
+{ TAO_YY_LEX_DEBUG; return TAO_EXIST; }
+ ACE_NOTREACHED (YY_BREAK)
+case 7:
+YY_RULE_SETUP
+
+{ TAO_YY_LEX_DEBUG; return TAO_NOT; }
+ ACE_NOTREACHED (YY_BREAK)
+case 8:
+YY_RULE_SETUP
+
+{ TAO_YY_LEX_DEBUG; return TAO_AND; }
+ ACE_NOTREACHED (YY_BREAK)
+case 9:
+YY_RULE_SETUP
+
+{ TAO_YY_LEX_DEBUG; return TAO_OR; }
+ ACE_NOTREACHED (YY_BREAK)
+case 10:
+YY_RULE_SETUP
+
+{ TAO_YY_LEX_DEBUG; return TAO_IN; }
+ ACE_NOTREACHED (YY_BREAK)
+case 11:
+YY_RULE_SETUP
+
+{ TAO_YY_LEX_DEBUG; return TAO_TWIDDLE; }
+ ACE_NOTREACHED (YY_BREAK)
+case 12:
+YY_RULE_SETUP
+
+{ TAO_YY_LEX_DEBUG; return TAO_PLUS; }
+ ACE_NOTREACHED (YY_BREAK)
+case 13:
+YY_RULE_SETUP
+
+{ TAO_YY_LEX_DEBUG; return TAO_MINUS; }
+ ACE_NOTREACHED (YY_BREAK)
+case 14:
+YY_RULE_SETUP
+
+{ TAO_YY_LEX_DEBUG; return TAO_MULT; }
+ ACE_NOTREACHED (YY_BREAK)
+case 15:
+YY_RULE_SETUP
+
+{ TAO_YY_LEX_DEBUG; return TAO_DIV; }
+ ACE_NOTREACHED (YY_BREAK)
+case 16:
+YY_RULE_SETUP
+
+{ TAO_YY_LEX_DEBUG; return TAO_LT; }
+ ACE_NOTREACHED (YY_BREAK)
+case 17:
+YY_RULE_SETUP
+
+{ TAO_YY_LEX_DEBUG; return TAO_LE; }
+ ACE_NOTREACHED (YY_BREAK)
+case 18:
+YY_RULE_SETUP
+
+{ TAO_YY_LEX_DEBUG; return TAO_GT; }
+ ACE_NOTREACHED (YY_BREAK)
+case 19:
+YY_RULE_SETUP
+
+{ TAO_YY_LEX_DEBUG; return TAO_GE; }
+ ACE_NOTREACHED (YY_BREAK)
+case 20:
+YY_RULE_SETUP
+
+{ TAO_YY_LEX_DEBUG; return TAO_EQ; }
+ ACE_NOTREACHED (YY_BREAK)
+case 21:
+YY_RULE_SETUP
+
+{ TAO_YY_LEX_DEBUG; return TAO_NE; }
+ ACE_NOTREACHED (YY_BREAK)
+case 22:
+YY_RULE_SETUP
+
+{ TAO_YY_LEX_DEBUG; return TAO_LPAREN; }
+ ACE_NOTREACHED (YY_BREAK)
+case 23:
+YY_RULE_SETUP
+
+{ TAO_YY_LEX_DEBUG; return TAO_RPAREN; }
+ ACE_NOTREACHED (YY_BREAK)
+case 24:
+YY_RULE_SETUP
+
+{
+ yylval.constraint_ =
+ new TAO_Literal_Constraint(true);
+ TAO_YY_LEX_DEBUG; return TAO_BOOLEAN;
+ }
+ ACE_NOTREACHED (YY_BREAK)
+case 25:
+YY_RULE_SETUP
+
+{
+ yylval.constraint_ =
+ new TAO_Literal_Constraint(false);
+ TAO_YY_LEX_DEBUG; return TAO_BOOLEAN;
+ }
+ ACE_NOTREACHED (YY_BREAK)
+case 26:
+YY_RULE_SETUP
+
+{
+ yylval.constraint_ =
+ new TAO_Literal_Constraint((yytext[0] == '-' ?
+ (CORBA::Long)atoi(yytext) : (CORBA::ULong)atoi(yytext)));
+ TAO_YY_LEX_DEBUG; return TAO_NUMBER;
+ }
+ ACE_NOTREACHED (YY_BREAK)
+case 27:
+YY_RULE_SETUP
+
+{
+ yylval.constraint_ =
+ new TAO_Literal_Constraint((CORBA::Double)atof(yytext));
+ TAO_YY_LEX_DEBUG; return TAO_NUMBER;
+ }
+ ACE_NOTREACHED (YY_BREAK)
+case 28:
+YY_RULE_SETUP
+
+{
+ yylval.constraint_ = extract_string(yytext);
+ TAO_YY_LEX_DEBUG; return TAO_STRING;
+ }
+ ACE_NOTREACHED (YY_BREAK)
+case 29:
+YY_RULE_SETUP
+
+{
+ yylval.constraint_ =
+ new TAO_Property_Constraint(yytext);
+ TAO_YY_LEX_DEBUG; return TAO_IDENT;
+ }
+ ACE_NOTREACHED (YY_BREAK)
+case 30:
+YY_RULE_SETUP
+
+{
+ TAO_YY_LEX_DEBUG; return TAO_UNKNOWN;
+ }
+ ACE_NOTREACHED (YY_BREAK)
+case 31:
+YY_RULE_SETUP
+
+TAO_TRADER_ECHO;
+ YY_BREAK
+
+case YY_STATE_EOF(INITIAL):
+ yyterminate();
+
+ case YY_END_OF_BUFFER:
+ {
+ /* Amount of text matched not including the EOB char. */
+ int yy_amount_of_matched_text = (int) (yy_cp - yytext_ptr) - 1;
+
+ /* Undo the effects of YY_DO_BEFORE_ACTION. */
+ *yy_cp = yy_hold_char;
+ YY_RESTORE_YY_MORE_OFFSET
+
+ if ( yy_current_buffer->yy_buffer_status == YY_BUFFER_NEW )
+ {
+ /* We're scanning a new file or input source. It's
+ * possible that this happened because the user
+ * just pointed yyin at a new source and called
+ * yylex(). If so, then we have to assure
+ * consistency between yy_current_buffer and our
+ * globals. Here is the right place to do so, because
+ * this is the first action (other than possibly a
+ * back-up) that will match for the new input source.
+ */
+ yy_n_chars = yy_current_buffer->yy_n_chars;
+ yy_current_buffer->yy_input_file = yyin;
+ yy_current_buffer->yy_buffer_status = YY_BUFFER_NORMAL;
+ }
+
+ /* Note that here we test for yy_c_buf_p "<=" to the position
+ * of the first EOB in the buffer, since yy_c_buf_p will
+ * already have been incremented past the NUL character
+ * (since all states make transitions on EOB to the
+ * end-of-buffer state). Contrast this with the test
+ * in input().
+ */
+ if ( yy_c_buf_p <= &yy_current_buffer->yy_ch_buf[yy_n_chars] )
+ { /* This was really a NUL. */
+ yy_state_type yy_next_state;
+
+ yy_c_buf_p = yytext_ptr + yy_amount_of_matched_text;
+
+ yy_current_state = yy_get_previous_state();
+
+ /* Okay, we're now positioned to make the NUL
+ * transition. We couldn't have
+ * yy_get_previous_state() go ahead and do it
+ * for us because it doesn't know how to deal
+ * with the possibility of jamming (and we don't
+ * want to build jamming into it because then it
+ * will run more slowly).
+ */
+
+ yy_next_state = yy_try_NUL_trans( yy_current_state );
+
+ yy_bp = yytext_ptr + YY_MORE_ADJ;
+
+ if ( yy_next_state )
+ {
+ /* Consume the NUL. */
+ yy_cp = ++yy_c_buf_p;
+ yy_current_state = yy_next_state;
+ goto yy_match;
+ }
+
+ else
+ {
+ yy_cp = yy_c_buf_p;
+ goto yy_find_action;
+ }
+ }
+
+ else switch ( yy_get_next_buffer() )
+ {
+ case EOB_ACT_END_OF_FILE:
+ {
+ yy_did_buffer_switch_on_eof = 0;
+
+ if ( yywrap() )
+ {
+ /* Note: because we've taken care in
+ * yy_get_next_buffer() to have set up
+ * yytext, we can now set up
+ * yy_c_buf_p so that if some total
+ * hoser (like flex itself) wants to
+ * call the scanner after we return the
+ * YY_NULL, it'll still work - another
+ * YY_NULL will get returned.
+ */
+ yy_c_buf_p = yytext_ptr + YY_MORE_ADJ;
+
+ yy_act = YY_STATE_EOF(YY_START);
+ goto do_action;
+ }
+
+ else
+ {
+ if ( ! yy_did_buffer_switch_on_eof )
+ YY_NEW_FILE;
+ }
+ break;
+ }
+
+ case EOB_ACT_CONTINUE_SCAN:
+ yy_c_buf_p =
+ yytext_ptr + yy_amount_of_matched_text;
+
+ yy_current_state = yy_get_previous_state();
+
+ yy_cp = yy_c_buf_p;
+ yy_bp = yytext_ptr + YY_MORE_ADJ;
+ goto yy_match;
+
+ case EOB_ACT_LAST_MATCH:
+ yy_c_buf_p =
+ &yy_current_buffer->yy_ch_buf[yy_n_chars];
+
+ yy_current_state = yy_get_previous_state();
+
+ yy_cp = yy_c_buf_p;
+ yy_bp = yytext_ptr + YY_MORE_ADJ;
+ goto yy_find_action;
+ }
+ break;
+ }
+
+ default:
+ YY_FATAL_ERROR(
+ "fatal flex scanner internal error--no action found" );
+ } /* end of action switch */
+ } /* end of scanning one token */
+ } /* end of yylex */
+
+
+/* yy_get_next_buffer - try to read in a new buffer
+ *
+ * Returns a code representing an action:
+ * EOB_ACT_LAST_MATCH -
+ * EOB_ACT_CONTINUE_SCAN - continue scanning from current position
+ * EOB_ACT_END_OF_FILE - end of file
+ */
+
+static int yy_get_next_buffer()
+ {
+ register char *dest = yy_current_buffer->yy_ch_buf;
+ register char *source = yytext_ptr;
+ register int number_to_move, i;
+ int ret_val;
+
+ if ( yy_c_buf_p > &yy_current_buffer->yy_ch_buf[yy_n_chars + 1] )
+ YY_FATAL_ERROR(
+ "fatal flex scanner internal error--end of buffer missed" );
+
+ if ( yy_current_buffer->yy_fill_buffer == 0 )
+ { /* Don't try to fill the buffer, so this is an EOF. */
+ if ( yy_c_buf_p - yytext_ptr - YY_MORE_ADJ == 1 )
+ {
+ /* We matched a single character, the EOB, so
+ * treat this as a final EOF.
+ */
+ return EOB_ACT_END_OF_FILE;
+ }
+
+ else
+ {
+ /* We matched some text prior to the EOB, first
+ * process it.
+ */
+ return EOB_ACT_LAST_MATCH;
+ }
+ }
+
+ /* Try to read more data. */
+
+ /* First move last chars to start of buffer. */
+ number_to_move = (int) (yy_c_buf_p - yytext_ptr) - 1;
+
+ for ( i = 0; i < number_to_move; ++i )
+ *(dest++) = *(source++);
+
+ if ( yy_current_buffer->yy_buffer_status == YY_BUFFER_EOF_PENDING )
+ /* don't do the read, it's not guaranteed to return an EOF,
+ * just force an EOF
+ */
+ yy_current_buffer->yy_n_chars = yy_n_chars = 0;
+
+ else
+ {
+ int num_to_read =
+ yy_current_buffer->yy_buf_size - number_to_move - 1;
+
+ while ( num_to_read <= 0 )
+ { /* Not enough room in the buffer - grow it. */
+#ifdef YY_USES_REJECT
+ YY_FATAL_ERROR(
+"input buffer overflow, can't enlarge buffer because scanner uses REJECT" );
+#else
+
+ /* just a shorter name for the current buffer */
+ YY_BUFFER_STATE b = yy_current_buffer;
+
+ int yy_c_buf_p_offset =
+ (int) (yy_c_buf_p - b->yy_ch_buf);
+
+ if ( b->yy_is_our_buffer )
+ {
+ int new_size = b->yy_buf_size * 2;
+
+ if ( new_size <= 0 )
+ b->yy_buf_size += b->yy_buf_size / 8;
+ else
+ b->yy_buf_size *= 2;
+
+ b->yy_ch_buf = (char *)
+ /* Include room in for 2 EOB chars. */
+ yy_flex_realloc( (void *) b->yy_ch_buf,
+ b->yy_buf_size + 2 );
+ }
+ else
+ /* Can't grow it, we don't own it. */
+ b->yy_ch_buf = 0;
+
+ if ( ! b->yy_ch_buf )
+ YY_FATAL_ERROR(
+ "fatal error - scanner input buffer overflow" );
+
+ yy_c_buf_p = &b->yy_ch_buf[yy_c_buf_p_offset];
+
+ num_to_read = yy_current_buffer->yy_buf_size -
+ number_to_move - 1;
+#endif
+ }
+
+ if ( num_to_read > YY_READ_BUF_SIZE )
+ num_to_read = YY_READ_BUF_SIZE;
+
+ /* Read in more data. */
+ YY_INPUT( (&yy_current_buffer->yy_ch_buf[number_to_move]),
+ yy_n_chars, num_to_read );
+
+ yy_current_buffer->yy_n_chars = yy_n_chars;
+ }
+
+ if ( yy_n_chars == 0 )
+ {
+ if ( number_to_move == YY_MORE_ADJ )
+ {
+ ret_val = EOB_ACT_END_OF_FILE;
+ yyrestart( yyin );
+ }
+
+ else
+ {
+ ret_val = EOB_ACT_LAST_MATCH;
+ yy_current_buffer->yy_buffer_status =
+ YY_BUFFER_EOF_PENDING;
+ }
+ }
+
+ else
+ ret_val = EOB_ACT_CONTINUE_SCAN;
+
+ yy_n_chars += number_to_move;
+ yy_current_buffer->yy_ch_buf[yy_n_chars] = YY_END_OF_BUFFER_CHAR;
+ yy_current_buffer->yy_ch_buf[yy_n_chars + 1] = YY_END_OF_BUFFER_CHAR;
+
+ yytext_ptr = &yy_current_buffer->yy_ch_buf[0];
+
+ return ret_val;
+ }
+
+
+/* yy_get_previous_state - get the state just before the EOB char was reached */
+
+static yy_state_type yy_get_previous_state()
+ {
+ register yy_state_type yy_current_state;
+ register char *yy_cp;
+
+ yy_current_state = yy_start;
+
+ for ( yy_cp = yytext_ptr + YY_MORE_ADJ; yy_cp < yy_c_buf_p; ++yy_cp )
+ {
+ register YY_CHAR yy_c = (*yy_cp ? yy_ec[YY_SC_TO_UI(*yy_cp)] : 1);
+ if ( yy_accept[yy_current_state] )
+ {
+ yy_last_accepting_state = yy_current_state;
+ yy_last_accepting_cpos = yy_cp;
+ }
+ while ( yy_chk[yy_base[yy_current_state] + yy_c] != yy_current_state )
+ {
+ yy_current_state = (int) yy_def[yy_current_state];
+ if ( yy_current_state >= 82 )
+ yy_c = yy_meta[(unsigned int) yy_c];
+ }
+ yy_current_state = yy_nxt[yy_base[yy_current_state] + (unsigned int) yy_c];
+ }
+
+ return yy_current_state;
+ }
+
+
+/* yy_try_NUL_trans - try to make a transition on the NUL character
+ *
+ * synopsis
+ * next_state = yy_try_NUL_trans( current_state );
+ */
+
+#ifdef YY_USE_PROTOS
+static yy_state_type yy_try_NUL_trans( yy_state_type yy_current_state )
+#else
+static yy_state_type yy_try_NUL_trans( yy_current_state )
+yy_state_type yy_current_state;
+#endif
+ {
+ register int yy_is_jam;
+ register char *yy_cp = yy_c_buf_p;
+
+ register YY_CHAR yy_c = 1;
+ if ( yy_accept[yy_current_state] )
+ {
+ yy_last_accepting_state = yy_current_state;
+ yy_last_accepting_cpos = yy_cp;
+ }
+ while ( yy_chk[yy_base[yy_current_state] + yy_c] != yy_current_state )
+ {
+ yy_current_state = (int) yy_def[yy_current_state];
+ if ( yy_current_state >= 82 )
+ yy_c = yy_meta[(unsigned int) yy_c];
+ }
+ yy_current_state = yy_nxt[yy_base[yy_current_state] + (unsigned int) yy_c];
+ yy_is_jam = (yy_current_state == 81);
+
+ return yy_is_jam ? 0 : yy_current_state;
+ }
+
+#if 0
+#ifndef YY_NO_UNPUT
+#ifdef YY_USE_PROTOS
+static void yyunput( int c, register char *yy_bp )
+#else
+static void yyunput( c, yy_bp )
+int c;
+register char *yy_bp;
+#endif
+ {
+ register char *yy_cp = yy_c_buf_p;
+
+ /* undo effects of setting up yytext */
+ *yy_cp = yy_hold_char;
+
+ if ( yy_cp < yy_current_buffer->yy_ch_buf + 2 )
+ { /* need to shift things up to make room */
+ /* +2 for EOB chars. */
+ register int number_to_move = yy_n_chars + 2;
+ register char *dest = &yy_current_buffer->yy_ch_buf[
+ yy_current_buffer->yy_buf_size + 2];
+ register char *source =
+ &yy_current_buffer->yy_ch_buf[number_to_move];
+
+ while ( source > yy_current_buffer->yy_ch_buf )
+ *--dest = *--source;
+
+ yy_cp += (int) (dest - source);
+ yy_bp += (int) (dest - source);
+ yy_current_buffer->yy_n_chars =
+ yy_n_chars = yy_current_buffer->yy_buf_size;
+
+ if ( yy_cp < yy_current_buffer->yy_ch_buf + 2 )
+ YY_FATAL_ERROR( "flex scanner push-back overflow" );
+ }
+
+ *--yy_cp = (char) c;
+
+
+ yytext_ptr = yy_bp;
+ yy_hold_char = *yy_cp;
+ yy_c_buf_p = yy_cp;
+ }
+#endif /* ifndef YY_NO_UNPUT */
+#endif /* 0 */
+
+#ifdef __cplusplus
+static int yyinput()
+#else
+static int input()
+#endif
+ {
+ int c;
+
+ *yy_c_buf_p = yy_hold_char;
+
+ if ( *yy_c_buf_p == YY_END_OF_BUFFER_CHAR )
+ {
+ /* yy_c_buf_p now points to the character we want to return.
+ * If this occurs *before* the EOB characters, then it's a
+ * valid NUL; if not, then we've hit the end of the buffer.
+ */
+ if ( yy_c_buf_p < &yy_current_buffer->yy_ch_buf[yy_n_chars] )
+ /* This was really a NUL. */
+ *yy_c_buf_p = '\0';
+
+ else
+ { /* need more input */
+ int offset = yy_c_buf_p - yytext_ptr;
+ ++yy_c_buf_p;
+
+ switch ( yy_get_next_buffer() )
+ {
+ case EOB_ACT_LAST_MATCH:
+ /* This happens because yy_g_n_b()
+ * sees that we've accumulated a
+ * token and flags that we need to
+ * try matching the token before
+ * proceeding. But for input(),
+ * there's no matching to consider.
+ * So convert the EOB_ACT_LAST_MATCH
+ * to EOB_ACT_END_OF_FILE.
+ */
+
+ /* Reset buffer status. */
+ yyrestart( yyin );
+
+ /* fall through */
+
+ case EOB_ACT_END_OF_FILE:
+ {
+ if ( yywrap() )
+ return EOF;
+
+ if ( ! yy_did_buffer_switch_on_eof )
+ YY_NEW_FILE;
+#ifdef __cplusplus
+ return yyinput();
+#else
+ return input();
+#endif
+ }
+
+ case EOB_ACT_CONTINUE_SCAN:
+ yy_c_buf_p = yytext_ptr + offset;
+ break;
+ }
+ }
+ }
+
+ c = *(unsigned char *) yy_c_buf_p; /* cast for 8-bit char's */
+ *yy_c_buf_p = '\0'; /* preserve yytext */
+ yy_hold_char = *++yy_c_buf_p;
+
+
+ return c;
+ }
+
+
+#ifdef YY_USE_PROTOS
+void yyrestart( FILE *input_file )
+#else
+void yyrestart( input_file )
+FILE *input_file;
+#endif
+ {
+ if ( ! yy_current_buffer )
+ yy_current_buffer = yy_create_buffer( yyin, YY_BUF_SIZE );
+
+ yy_init_buffer( yy_current_buffer, input_file );
+ yy_load_buffer_state();
+ }
+
+
+#ifdef YY_USE_PROTOS
+void yy_switch_to_buffer( YY_BUFFER_STATE new_buffer )
+#else
+void yy_switch_to_buffer( new_buffer )
+YY_BUFFER_STATE new_buffer;
+#endif
+ {
+ if ( yy_current_buffer == new_buffer )
+ return;
+
+ if ( yy_current_buffer )
+ {
+ /* Flush out information for old buffer. */
+ *yy_c_buf_p = yy_hold_char;
+ yy_current_buffer->yy_buf_pos = yy_c_buf_p;
+ yy_current_buffer->yy_n_chars = yy_n_chars;
+ }
+
+ yy_current_buffer = new_buffer;
+ yy_load_buffer_state();
+
+ /* We don't actually know whether we did this switch during
+ * EOF (yywrap()) processing, but the only time this flag
+ * is looked at is after yywrap() is called, so it's safe
+ * to go ahead and always set it.
+ */
+ yy_did_buffer_switch_on_eof = 1;
+ }
+
+
+#ifdef YY_USE_PROTOS
+void yy_load_buffer_state( void )
+#else
+void yy_load_buffer_state()
+#endif
+ {
+ yy_n_chars = yy_current_buffer->yy_n_chars;
+ yytext_ptr = yy_c_buf_p = yy_current_buffer->yy_buf_pos;
+ yyin = yy_current_buffer->yy_input_file;
+ yy_hold_char = *yy_c_buf_p;
+ }
+
+
+#ifdef YY_USE_PROTOS
+YY_BUFFER_STATE yy_create_buffer( FILE *file, int size )
+#else
+YY_BUFFER_STATE yy_create_buffer( file, size )
+FILE *file;
+int size;
+#endif
+ {
+ YY_BUFFER_STATE b;
+
+ b = (YY_BUFFER_STATE) yy_flex_alloc( sizeof( struct yy_buffer_state ) );
+ if ( ! b )
+ YY_FATAL_ERROR( "out of dynamic memory in yy_create_buffer()" );
+
+ b->yy_buf_size = size;
+
+ /* yy_ch_buf has to be 2 characters longer than the size given because
+ * we need to put in 2 end-of-buffer characters.
+ */
+ b->yy_ch_buf = (char *) yy_flex_alloc( b->yy_buf_size + 2 );
+ if ( ! b->yy_ch_buf )
+ YY_FATAL_ERROR( "out of dynamic memory in yy_create_buffer()" );
+
+ b->yy_is_our_buffer = 1;
+
+ yy_init_buffer( b, file );
+
+ return b;
+ }
+
+
+#ifdef YY_USE_PROTOS
+void yy_delete_buffer( YY_BUFFER_STATE b )
+#else
+void yy_delete_buffer( b )
+YY_BUFFER_STATE b;
+#endif
+ {
+ if ( ! b )
+ return;
+
+ if ( b == yy_current_buffer )
+ yy_current_buffer = (YY_BUFFER_STATE) 0;
+
+ if ( b->yy_is_our_buffer )
+ yy_flex_free( (void *) b->yy_ch_buf );
+
+ yy_flex_free( (void *) b );
+ }
+
+
+
+#ifdef YY_USE_PROTOS
+void yy_init_buffer( YY_BUFFER_STATE b, FILE *file )
+#else
+void yy_init_buffer( b, file )
+YY_BUFFER_STATE b;
+FILE *file;
+#endif
+
+
+ {
+ yy_flush_buffer( b );
+
+ b->yy_input_file = file;
+ b->yy_fill_buffer = 1;
+
+#if defined (ACE_HAS_WINCE)
+ // Mimic the behavior as WinCE does not have isatty().
+ if ((file != 0) && (file == fileno(file))) {
+ b->yy_is_interactive = 1;
+ }
+ else {
+ b->yy_is_interactive = 0;
+ }
+#else
+ b->yy_is_interactive = file ? (isatty( fileno(file) ) > 0) : 0;
+#endif // ACE_HAS_WINCE
+
+ }
+
+
+#ifdef YY_USE_PROTOS
+void yy_flush_buffer( YY_BUFFER_STATE b )
+#else
+void yy_flush_buffer( b )
+YY_BUFFER_STATE b;
+#endif
+
+ {
+ if ( ! b )
+ return;
+
+ b->yy_n_chars = 0;
+
+ /* We always need two end-of-buffer characters. The first causes
+ * a transition to the end-of-buffer state. The second causes
+ * a jam in that state.
+ */
+ b->yy_ch_buf[0] = YY_END_OF_BUFFER_CHAR;
+ b->yy_ch_buf[1] = YY_END_OF_BUFFER_CHAR;
+
+ b->yy_buf_pos = &b->yy_ch_buf[0];
+
+ b->yy_at_bol = 1;
+ b->yy_buffer_status = YY_BUFFER_NEW;
+
+ if ( b == yy_current_buffer )
+ yy_load_buffer_state();
+ }
+
+
+#ifndef YY_NO_SCAN_BUFFER
+#ifdef YY_USE_PROTOS
+YY_BUFFER_STATE yy_scan_buffer( char *base, yy_size_t size )
+#else
+YY_BUFFER_STATE yy_scan_buffer( base, size )
+char *base;
+yy_size_t size;
+#endif
+ {
+ YY_BUFFER_STATE b;
+
+ if ( size < 2 ||
+ base[size-2] != YY_END_OF_BUFFER_CHAR ||
+ base[size-1] != YY_END_OF_BUFFER_CHAR )
+ /* They forgot to leave room for the EOB's. */
+ return 0;
+
+ b = (YY_BUFFER_STATE) yy_flex_alloc( sizeof( struct yy_buffer_state ) );
+ if ( ! b )
+ YY_FATAL_ERROR( "out of dynamic memory in yy_scan_buffer()" );
+
+ b->yy_buf_size = size - 2; /* "- 2" to take care of EOB's */
+ b->yy_buf_pos = b->yy_ch_buf = base;
+ b->yy_is_our_buffer = 0;
+ b->yy_input_file = 0;
+ b->yy_n_chars = b->yy_buf_size;
+ b->yy_is_interactive = 0;
+ b->yy_at_bol = 1;
+ b->yy_fill_buffer = 0;
+ b->yy_buffer_status = YY_BUFFER_NEW;
+
+ yy_switch_to_buffer( b );
+
+ return b;
+ }
+#endif
+
+
+#ifndef YY_NO_SCAN_STRING
+#ifdef YY_USE_PROTOS
+YY_BUFFER_STATE yy_scan_string( yyconst char *yy_str )
+#else
+YY_BUFFER_STATE yy_scan_string( yy_str )
+yyconst char *yy_str;
+#endif
+ {
+ int len;
+ for ( len = 0; yy_str[len]; ++len )
+ ;
+
+ return yy_scan_bytes( yy_str, len );
+ }
+#endif
+
+
+#ifndef YY_NO_SCAN_BYTES
+#ifdef YY_USE_PROTOS
+YY_BUFFER_STATE yy_scan_bytes( yyconst char *bytes, int len )
+#else
+YY_BUFFER_STATE yy_scan_bytes( bytes, len )
+yyconst char *bytes;
+int len;
+#endif
+ {
+ YY_BUFFER_STATE b;
+ char *buf;
+ yy_size_t n;
+ int i;
+
+ /* Get memory for full buffer, including space for trailing EOB's. */
+ n = len + 2;
+ buf = (char *) yy_flex_alloc( n );
+ if ( ! buf )
+ YY_FATAL_ERROR( "out of dynamic memory in yy_scan_bytes()" );
+
+ for ( i = 0; i < len; ++i )
+ buf[i] = bytes[i];
+
+ buf[len] = buf[len+1] = YY_END_OF_BUFFER_CHAR;
+
+ b = yy_scan_buffer( buf, n );
+ if ( ! b )
+ YY_FATAL_ERROR( "bad buffer in yy_scan_bytes()" );
+
+ /* It's okay to grow etc. this buffer, and we should throw it
+ * away when we're done.
+ */
+ b->yy_is_our_buffer = 1;
+
+ return b;
+ }
+#endif
+
+
+#ifndef YY_NO_PUSH_STATE
+#ifdef YY_USE_PROTOS
+static void yy_push_state( int new_state )
+#else
+static void yy_push_state( new_state )
+int new_state;
+#endif
+ {
+ if ( yy_start_stack_ptr >= yy_start_stack_depth )
+ {
+ yy_size_t new_size;
+
+ yy_start_stack_depth += YY_START_STACK_INCR;
+ new_size = yy_start_stack_depth * sizeof( int );
+
+ if ( ! yy_start_stack )
+ yy_start_stack = (int *) yy_flex_alloc( new_size );
+
+ else
+ yy_start_stack = (int *) yy_flex_realloc(
+ (void *) yy_start_stack, new_size );
+
+ if ( ! yy_start_stack )
+ YY_FATAL_ERROR(
+ "out of memory expanding start-condition stack" );
+ }
+
+ yy_start_stack[yy_start_stack_ptr++] = YY_START;
+
+ BEGIN(new_state);
+ }
+#endif
+
+
+#ifndef YY_NO_POP_STATE
+static void yy_pop_state()
+ {
+ if ( --yy_start_stack_ptr < 0 )
+ YY_FATAL_ERROR( "start-condition stack underflow" );
+
+ BEGIN(yy_start_stack[yy_start_stack_ptr]);
+ }
+#endif
+
+
+#ifndef YY_NO_TOP_STATE
+static int yy_top_state()
+ {
+ return yy_start_stack[yy_start_stack_ptr - 1];
+ }
+#endif
+
+#ifndef YY_EXIT_FAILURE
+#define YY_EXIT_FAILURE 2
+#endif
+
+#ifdef YY_USE_PROTOS
+static void yy_fatal_error( yyconst char msg[] )
+#else
+static void yy_fatal_error( msg )
+char msg[];
+#endif
+ {
+ (void) fprintf( stderr, "%s\n", msg );
+ exit( YY_EXIT_FAILURE );
+ }
+
+
+
+/* Redefine yyless() so it works in section 3 code. */
+
+#undef yyless
+#define yyless(n) \
+ do \
+ { \
+ /* Undo effects of setting up yytext. */ \
+ yytext[yyleng] = yy_hold_char; \
+ yy_c_buf_p = yytext + n; \
+ yy_hold_char = *yy_c_buf_p; \
+ *yy_c_buf_p = '\0'; \
+ yyleng = n; \
+ } \
+ while ( 0 )
+
+
+/* Internal utility routines. */
+
+#ifndef yytext_ptr
+#ifdef YY_USE_PROTOS
+static void yy_flex_strncpy( char *s1, yyconst char *s2, int n )
+#else
+static void yy_flex_strncpy( s1, s2, n )
+char *s1;
+yyconst char *s2;
+int n;
+#endif
+ {
+ register int i;
+ for ( i = 0; i < n; ++i )
+ s1[i] = s2[i];
+ }
+#endif
+
+#ifdef YY_NEED_STRLEN
+#ifdef YY_USE_PROTOS
+static int yy_flex_strlen( yyconst char *s )
+#else
+static int yy_flex_strlen( s )
+yyconst char *s;
+#endif
+ {
+ register int n;
+ for ( n = 0; s[n]; ++n )
+ ;
+
+ return n;
+ }
+#endif
+
+
+#ifdef YY_USE_PROTOS
+static void *yy_flex_alloc( yy_size_t size )
+#else
+static void *yy_flex_alloc( size )
+yy_size_t size;
+#endif
+ {
+ return (void *) malloc( size );
+ }
+
+#ifdef YY_USE_PROTOS
+static void *yy_flex_realloc( void *ptr, yy_size_t size )
+#else
+static void *yy_flex_realloc( ptr, size )
+void *ptr;
+yy_size_t size;
+#endif
+ {
+ /* The cast to (char *) in the following accommodates both
+ * implementations that use char* generic pointers, and those
+ * that use void* generic pointers. It works with the latter
+ * because both ANSI C and C++ allow castless assignment from
+ * any pointer type to void*, and deal with argument conversions
+ * as though doing an assignment.
+ */
+ return (void *) realloc( (char *) ptr, size );
+ }
+
+#ifdef YY_USE_PROTOS
+static void yy_flex_free( void *ptr )
+#else
+static void yy_flex_free( ptr )
+void *ptr;
+#endif
+ {
+ free( ptr );
+ }
+
+#if YY_MAIN
+int main()
+ {
+ yylex();
+ return 0;
+ }
+#endif
+
+
+
+TAO_Literal_Constraint*
+extract_string(const char* total)
+{
+ int prev_slash = 0,
+ ctr = 0;
+ char str[BUFSIZ],
+ *tmp = (char*) total + 1;
+
+ while (*tmp != '\0')
+ {
+ if (*tmp == '\\')
+ {
+ if (prev_slash)
+ prev_slash = 0;
+ else
+ {
+ prev_slash = 1;
+ continue;
+ }
+ }
+ else if (*tmp == '\'')
+ prev_slash = 0;
+
+ str[ctr++] = *tmp;
+ tmp++;
+ }
+
+ str[ctr - 1] = '\0';
+ return new TAO_Literal_Constraint(str);
+}
+
+int
+yywrap (void)
+{
+ return 1;
+}
+
+TAO_END_VERSIONED_NAMESPACE_DECL
diff --git a/TAO/orbsvcs/orbsvcs/Trader/Constraint_y.cpp b/TAO/orbsvcs/orbsvcs/Trader/Constraint_y.cpp
new file mode 100644
index 00000000000..4376a5b05ba
--- /dev/null
+++ b/TAO/orbsvcs/orbsvcs/Trader/Constraint_y.cpp
@@ -0,0 +1,900 @@
+
+ // $Id$
+// ========================================================================
+//
+// = LIBRARY
+// orbsvcs
+//
+// = FILENAME
+// constraint.y
+//
+// = AUTHOR
+// Seth Widoff <sbw1@cs.wustl.edu>
+//
+// ========================================================================
+
+#include "ace/OS_NS_string.h"
+#include "orbsvcs/Trader/Constraint_Interpreter.h"
+#include "orbsvcs/Trader/Constraint_Nodes.h"
+
+TAO_BEGIN_VERSIONED_NAMESPACE_DECL
+
+//#define YYDEBUG 1
+# define TAO_GT 257
+# define TAO_GE 258
+# define TAO_LT 259
+# define TAO_LE 260
+# define TAO_EQ 261
+# define TAO_NE 262
+# define TAO_EXIST 263
+# define TAO_AND 264
+# define TAO_OR 265
+# define TAO_NOT 266
+# define TAO_IN 267
+# define TAO_TWIDDLE 268
+# define TAO_BOOLEAN 269
+# define TAO_PLUS 270
+# define TAO_MINUS 271
+# define TAO_MULT 272
+# define TAO_DIV 273
+# define TAO_UMINUS 274
+# define TAO_NUMBER 275
+# define TAO_RPAREN 276
+# define TAO_LPAREN 277
+# define TAO_IDENT 278
+# define TAO_STRING 279
+# define TAO_UNKNOWN 280
+# define TAO_UNSIGNED 281
+# define TAO_SIGNED 282
+# define TAO_DOUBLE 283
+# define TAO_CONSTRAINT 284
+# define TAO_SEQUENCE 285
+# define TAO_WITH 286
+# define TAO_MAX 287
+# define TAO_MIN 288
+# define TAO_FIRST 289
+# define TAO_RANDOM 290
+
+#ifdef __cplusplus
+
+#ifndef yyerror
+ void yyerror(const char *);
+#endif
+
+#ifndef yylex
+#ifdef __EXTERN_C__
+ extern "C" { int yylex(void); }
+#else
+ int yylex(void);
+#endif
+#endif
+ int yyparse(void);
+
+#endif
+#define yyclearin yychar = -1
+#define yyerrok yyerrflag = 0
+extern int yychar;
+extern int yyerrflag;
+YYSTYPE yylval;
+YYSTYPE yyval;
+typedef int yytabelem;
+#ifndef YYMAXDEPTH
+#define YYMAXDEPTH 150
+#endif
+#if YYMAXDEPTH > 0
+int yy_yys[YYMAXDEPTH], *yys = yy_yys;
+YYSTYPE yy_yyv[YYMAXDEPTH], *yyv = yy_yyv;
+#else /* user does initial allocation */
+int *yys;
+YYSTYPE *yyv;
+#endif
+static int yymaxdepth = YYMAXDEPTH;
+# define YYERRCODE 256
+
+
+
+
+//extern int yydebug = 1;
+yytabelem yyexca[] ={
+-1, 1,
+ 0, -1,
+ -2, 0,
+ };
+# define YYNPROD 38
+# define YYLAST 93
+yytabelem yyact[]={
+
+ 19, 54, 44, 16, 45, 19, 24, 37, 22, 38,
+ 39, 24, 21, 22, 18, 20, 23, 21, 25, 18,
+ 20, 23, 36, 7, 6, 5, 8, 9, 19, 60,
+ 26, 16, 40, 41, 24, 25, 22, 38, 39, 15,
+ 21, 11, 18, 20, 23, 32, 33, 34, 35, 30,
+ 31, 14, 10, 17, 13, 12, 4, 3, 1, 2,
+ 0, 0, 0, 0, 0, 27, 28, 29, 0, 0,
+ 42, 0, 48, 49, 50, 51, 52, 53, 43, 47,
+ 58, 59, 46, 0, 0, 0, 0, 0, 0, 0,
+ 56, 57, 55 };
+yytabelem yypact[]={
+
+ -263,-10000000, -230,-10000000, -234, -235, -235, -235,-10000000,-10000000,
+-10000000, -212, -245, -261, -240,-10000000, -258,-10000000, -235, -276,
+-10000000,-10000000, -271,-10000000,-10000000, -235, -235, -230, -230, -230,
+ -235, -235, -235, -235, -235, -235, -277, -235, -235, -235,
+ -235, -235,-10000000, -247,-10000000,-10000000, -234,-10000000,-10000000,-10000000,
+-10000000,-10000000,-10000000,-10000000,-10000000, -233, -240, -240,-10000000,-10000000,
+-10000000 };
+yytabelem yypgo[]={
+
+ 0, 58, 57, 59, 56, 52, 41, 55, 54, 51,
+ 39, 53 };
+yytabelem yyr1[]={
+
+ 0, 1, 1, 2, 2, 2, 2, 2, 3, 3,
+ 4, 4, 5, 5, 5, 5, 5, 5, 5, 6,
+ 6, 7, 7, 8, 8, 8, 9, 9, 9, 10,
+ 10, 11, 11, 11, 11, 11, 11, 11 };
+yytabelem yyr2[]={
+
+ 0, 3, 3, 5, 5, 5, 3, 3, 7, 3,
+ 7, 3, 7, 7, 7, 7, 7, 7, 3, 7,
+ 3, 7, 3, 7, 7, 3, 7, 7, 3, 5,
+ 3, 7, 5, 3, 3, 5, 3, 3 };
+yytabelem yychk[]={
+
+-10000000, -1, -3, -2, -4, 288, 287, 286, 289, 290,
+ -5, -6, -7, -8, -9, -10, 266, -11, 277, 263,
+ 278, 275, 271, 279, 269, 265, 264, -3, -3, -3,
+ 261, 262, 257, 258, 259, 260, 267, 268, 270, 271,
+ 272, 273, -11, -3, 278, 275, -4, -5, -6, -6,
+ -6, -6, -6, -6, 278, -8, -9, -9, -10, -10,
+ 276 };
+yytabelem yydef[]={
+
+ 0, -2, 1, 2, 9, 0, 0, 0, 6, 7,
+ 11, 18, 20, 22, 25, 28, 0, 30, 0, 0,
+ 33, 34, 0, 36, 37, 0, 0, 3, 4, 5,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 29, 0, 32, 35, 8, 10, 12, 13,
+ 14, 15, 16, 17, 19, 21, 23, 24, 26, 27,
+ 31 };
+typedef struct
+#ifdef __cplusplus
+ yytoktype
+#endif
+{ char *t_name; int t_val; } yytoktype;
+#ifndef YYDEBUG
+# define YYDEBUG 0 /* don't allow debugging */
+#endif
+
+#if YYDEBUG
+
+yytoktype yytoks[] =
+{
+ "TAO_GT", 257,
+ "TAO_GE", 258,
+ "TAO_LT", 259,
+ "TAO_LE", 260,
+ "TAO_EQ", 261,
+ "TAO_NE", 262,
+ "TAO_EXIST", 263,
+ "TAO_AND", 264,
+ "TAO_OR", 265,
+ "TAO_NOT", 266,
+ "TAO_IN", 267,
+ "TAO_TWIDDLE", 268,
+ "TAO_BOOLEAN", 269,
+ "TAO_PLUS", 270,
+ "TAO_MINUS", 271,
+ "TAO_MULT", 272,
+ "TAO_DIV", 273,
+ "TAO_UMINUS", 274,
+ "TAO_NUMBER", 275,
+ "TAO_RPAREN", 276,
+ "TAO_LPAREN", 277,
+ "TAO_IDENT", 278,
+ "TAO_STRING", 279,
+ "TAO_UNKNOWN", 280,
+ "TAO_UNSIGNED", 281,
+ "TAO_SIGNED", 282,
+ "TAO_DOUBLE", 283,
+ "TAO_CONSTRAINT", 284,
+ "TAO_SEQUENCE", 285,
+ "TAO_WITH", 286,
+ "TAO_MAX", 287,
+ "TAO_MIN", 288,
+ "TAO_FIRST", 289,
+ "TAO_RANDOM", 290,
+ "-unknown-", -1 /* ends search */
+};
+
+char * yyreds[] =
+{
+ "-no such reduction-",
+ "constraint : bool_or",
+ "constraint : preference",
+ "preference : TAO_MIN bool_or",
+ "preference : TAO_MAX bool_or",
+ "preference : TAO_WITH bool_or",
+ "preference : TAO_FIRST",
+ "preference : TAO_RANDOM",
+ "bool_or : bool_or TAO_OR bool_and",
+ "bool_or : bool_and",
+ "bool_and : bool_and TAO_AND bool_compare",
+ "bool_and : bool_compare",
+ "bool_compare : expr_in TAO_EQ expr_in",
+ "bool_compare : expr_in TAO_NE expr_in",
+ "bool_compare : expr_in TAO_GT expr_in",
+ "bool_compare : expr_in TAO_GE expr_in",
+ "bool_compare : expr_in TAO_LT expr_in",
+ "bool_compare : expr_in TAO_LE expr_in",
+ "bool_compare : expr_in",
+ "expr_in : expr_twiddle TAO_IN TAO_IDENT",
+ "expr_in : expr_twiddle",
+ "expr_twiddle : expr TAO_TWIDDLE expr",
+ "expr_twiddle : expr",
+ "expr : expr TAO_PLUS term",
+ "expr : expr TAO_MINUS term",
+ "expr : term",
+ "term : term TAO_MULT factor_not",
+ "term : term TAO_DIV factor_not",
+ "term : factor_not",
+ "factor_not : TAO_NOT factor",
+ "factor_not : factor",
+ "factor : TAO_LPAREN bool_or TAO_RPAREN",
+ "factor : TAO_EXIST TAO_IDENT",
+ "factor : TAO_IDENT",
+ "factor : TAO_NUMBER",
+ "factor : TAO_MINUS TAO_NUMBER",
+ "factor : TAO_STRING",
+ "factor : TAO_BOOLEAN",
+};
+#endif /* YYDEBUG */
+
+/*
+ * Copyright (c) 1993 by Sun Microsystems, Inc.
+ */
+
+//#pragma ident "@(#)yaccpar 6.12 93/06/07 SMI"
+
+/*
+** Skeleton parser driver for yacc output
+*/
+
+/*
+** yacc user known macros and defines
+*/
+#define YYERROR goto yyerrlab
+#define YYACCEPT return(0)
+#define YYABORT return(1)
+#define YYBACKUP( newtoken, newvalue )\
+{\
+ if ( yychar >= 0 || ( yyr2[ yytmp ] >> 1 ) != 1 )\
+ {\
+ yyerror( "syntax error - cannot backup" );\
+ goto yyerrlab;\
+ }\
+ yychar = newtoken;\
+ yystate = *yyps;\
+ yylval = newvalue;\
+ goto yynewstate;\
+}
+#define YYRECOVERING() (!!yyerrflag)
+#define YYNEW(type) malloc(sizeof(type) * yynewmax)
+#define YYCOPY(to, from, type) \
+ (type *) ACE_OS::memcpy(to, (char *) from, yynewmax * sizeof(type))
+#define YYENLARGE( from, type) \
+ (type *) realloc((char *) from, yynewmax * sizeof(type))
+#ifndef YYDEBUG
+# define YYDEBUG 1 /* make debugging available */
+#endif
+
+/*
+** user known globals
+*/
+int yydebug; /* set to 1 to get debugging */
+
+/*
+** driver internal defines
+*/
+#define YYFLAG (-10000000)
+
+/*
+** global variables used by the parser
+*/
+YYSTYPE *yypv; /* top of value stack */
+int *yyps; /* top of state stack */
+
+int yystate; /* current state */
+int yytmp; /* extra var (lasts between blocks) */
+
+int yynerrs; /* number of errors */
+int yyerrflag; /* error recovery flag */
+int yychar; /* current input token number */
+
+
+
+#ifdef YYNMBCHARS
+#define YYLEX() yycvtok(yylex())
+/*
+** yycvtok - return a token if i is a wchar_t value that exceeds 255.
+** If i<255, i itself is the token. If i>255 but the neither
+** of the 30th or 31st bit is on, i is already a token.
+*/
+#if defined(__STDC__) || defined(__cplusplus)
+int yycvtok(int i)
+#else
+int yycvtok(i) int i;
+#endif
+{
+ int first = 0;
+ int last = YYNMBCHARS - 1;
+ int mid;
+ wchar_t j;
+
+ if(i&0x60000000){/*Must convert to a token. */
+ if( yymbchars[last].character < i ){
+ return i;/*Giving up*/
+ }
+ while ((last>=first)&&(first>=0)) {/*Binary search loop*/
+ mid = (first+last)/2;
+ j = yymbchars[mid].character;
+ if( j==i ){/*Found*/
+ return yymbchars[mid].tvalue;
+ }else if( j<i ){
+ first = mid + 1;
+ }else{
+ last = mid -1;
+ }
+ }
+ /*No entry in the table.*/
+ return i;/* Giving up.*/
+ }else{/* i is already a token. */
+ return i;
+ }
+}
+#else/*!YYNMBCHARS*/
+#define YYLEX() yylex()
+#endif/*!YYNMBCHARS*/
+
+/*
+** yyparse - return 0 if worked, 1 if syntax error not recovered from
+*/
+#if defined(__STDC__) || defined(__cplusplus)
+int yyparse(void)
+#else
+int yyparse()
+#endif
+{
+ register YYSTYPE *yypvt = 0; /* top of value stack for $vars */
+
+#if defined(__cplusplus) || defined(lint)
+/*
+ hacks to please C++ and lint - goto's inside switch should never be
+ executed; yypvt is set to 0 to avoid "used before set" warning.
+*/
+ static int __yaccpar_lint_hack__ = 0;
+ switch (__yaccpar_lint_hack__)
+ {
+ case 1: goto yyerrlab;
+ case 2: goto yynewstate;
+ }
+ yypvt = 0;
+#endif
+
+ /*
+ ** Initialize externals - yyparse may be called more than once
+ */
+ yypv = &yyv[-1];
+ yyps = &yys[-1];
+ yystate = 0;
+ yytmp = 0;
+ yynerrs = 0;
+ yyerrflag = 0;
+ yychar = -1;
+
+#if YYMAXDEPTH <= 0
+ if (yymaxdepth <= 0)
+ {
+ if ((yymaxdepth = YYEXPAND(0)) <= 0)
+ {
+ yyerror("yacc initialization error");
+ YYABORT;
+ }
+ }
+#endif
+
+ {
+ register YYSTYPE *yy_pv; /* top of value stack */
+ register int *yy_ps; /* top of state stack */
+ register int yy_state; /* current state */
+ register int yy_n; /* internal state number info */
+ goto yystack; /* moved from 6 lines above to here to please C++ */
+
+ /*
+ ** get globals into registers.
+ ** branch to here only if YYBACKUP was called.
+ */
+ yynewstate:
+ yy_pv = yypv;
+ yy_ps = yyps;
+ yy_state = yystate;
+ goto yy_newstate;
+
+ /*
+ ** get globals into registers.
+ ** either we just started, or we just finished a reduction
+ */
+ yystack:
+ yy_pv = yypv;
+ yy_ps = yyps;
+ yy_state = yystate;
+
+ /*
+ ** top of for (;;) loop while no reductions done
+ */
+ yy_stack:
+ /*
+ ** put a state and value onto the stacks
+ */
+#if YYDEBUG
+ /*
+ ** if debugging, look up token value in list of value vs.
+ ** name pairs. 0 and negative (-1) are special values.
+ ** Note: linear search is used since time is not a real
+ ** consideration while debugging.
+ */
+ if ( yydebug )
+ {
+ register int yy_i;
+
+ printf( "State %d, token ", yy_state );
+ if ( yychar == 0 )
+ printf( "end-of-file\n" );
+ else if ( yychar < 0 )
+ printf( "-none-\n" );
+ else
+ {
+ for ( yy_i = 0; yytoks[yy_i].t_val >= 0;
+ yy_i++ )
+ {
+ if ( yytoks[yy_i].t_val == yychar )
+ break;
+ }
+ printf( "%s\n", yytoks[yy_i].t_name );
+ }
+ }
+#endif /* YYDEBUG */
+ if ( ++yy_ps >= &yys[ yymaxdepth ] ) /* room on stack? */
+ {
+ /*
+ ** reallocate and recover. Note that pointers
+ ** have to be reset, or bad things will happen
+ */
+ int yyps_index = (yy_ps - yys);
+ int yypv_index = (yy_pv - yyv);
+ int yypvt_index = (yypvt - yyv);
+ int yynewmax;
+#ifdef YYEXPAND
+ yynewmax = YYEXPAND(yymaxdepth);
+#else
+ yynewmax = 2 * yymaxdepth; /* double table size */
+ if (yymaxdepth == YYMAXDEPTH) /* first time growth */
+ {
+ char *newyys = (char *)YYNEW(int);
+ char *newyyv = (char *)YYNEW(YYSTYPE);
+ if (newyys != 0 && newyyv != 0)
+ {
+ yys = YYCOPY(newyys, yys, int);
+ yyv = YYCOPY(newyyv, yyv, YYSTYPE);
+ }
+ else
+ yynewmax = 0; /* failed */
+ }
+ else /* not first time */
+ {
+ yys = YYENLARGE(yys, int);
+ yyv = YYENLARGE(yyv, YYSTYPE);
+ if (yys == 0 || yyv == 0)
+ yynewmax = 0; /* failed */
+ }
+#endif
+ if (yynewmax <= yymaxdepth) /* tables not expanded */
+ {
+ yyerror( "yacc stack overflow" );
+ YYABORT;
+ }
+ yymaxdepth = yynewmax;
+
+ yy_ps = yys + yyps_index;
+ yy_pv = yyv + yypv_index;
+ yypvt = yyv + yypvt_index;
+ }
+ *yy_ps = yy_state;
+ *++yy_pv = yyval;
+
+ /*
+ ** we have a new state - find out what to do
+ */
+ yy_newstate:
+ if ( ( yy_n = yypact[ yy_state ] ) <= YYFLAG )
+ goto yydefault; /* simple state */
+#if YYDEBUG
+ /*
+ ** if debugging, need to mark whether new token grabbed
+ */
+ yytmp = yychar < 0;
+#endif
+ if ( ( yychar < 0 ) && ( ( yychar = YYLEX() ) < 0 ) )
+ yychar = 0; /* reached EOF */
+#if YYDEBUG
+ if ( yydebug && yytmp )
+ {
+ register int yy_i;
+
+ printf( "Received token " );
+ if ( yychar == 0 )
+ printf( "end-of-file\n" );
+ else if ( yychar < 0 )
+ printf( "-none-\n" );
+ else
+ {
+ for ( yy_i = 0; yytoks[yy_i].t_val >= 0;
+ yy_i++ )
+ {
+ if ( yytoks[yy_i].t_val == yychar )
+ break;
+ }
+ printf( "%s\n", yytoks[yy_i].t_name );
+ }
+ }
+#endif /* YYDEBUG */
+ if ( ( ( yy_n += yychar ) < 0 ) || ( yy_n >= YYLAST ) )
+ goto yydefault;
+ if ( yychk[ yy_n = yyact[ yy_n ] ] == yychar ) /*valid shift*/
+ {
+ yychar = -1;
+ yyval = yylval;
+ yy_state = yy_n;
+ if ( yyerrflag > 0 )
+ yyerrflag--;
+ goto yy_stack;
+ }
+
+ yydefault:
+ if ( ( yy_n = yydef[ yy_state ] ) == -2 )
+ {
+#if YYDEBUG
+ yytmp = yychar < 0;
+#endif
+ if ( ( yychar < 0 ) && ( ( yychar = YYLEX() ) < 0 ) )
+ yychar = 0; /* reached EOF */
+#if YYDEBUG
+ if ( yydebug && yytmp )
+ {
+ register int yy_i;
+
+ printf( "Received token " );
+ if ( yychar == 0 )
+ printf( "end-of-file\n" );
+ else if ( yychar < 0 )
+ printf( "-none-\n" );
+ else
+ {
+ for ( yy_i = 0;
+ yytoks[yy_i].t_val >= 0;
+ yy_i++ )
+ {
+ if ( yytoks[yy_i].t_val
+ == yychar )
+ {
+ break;
+ }
+ }
+ printf( "%s\n", yytoks[yy_i].t_name );
+ }
+ }
+#endif /* YYDEBUG */
+ /*
+ ** look through exception table
+ */
+ {
+ register int *yyxi = yyexca;
+
+ while ( ( *yyxi != -1 ) ||
+ ( yyxi[1] != yy_state ) )
+ {
+ yyxi += 2;
+ }
+ while ( ( *(yyxi += 2) >= 0 ) &&
+ ( *yyxi != yychar ) )
+ ;
+ if ( ( yy_n = yyxi[1] ) < 0 )
+ YYACCEPT;
+ }
+ }
+
+ /*
+ ** check for syntax error
+ */
+ if ( yy_n == 0 ) /* have an error */
+ {
+ /* no worry about speed here! */
+ switch ( yyerrflag )
+ {
+ case 0: /* new error */
+ yyerror( "syntax error" );
+ goto skip_init;
+ yyerrlab:
+ /*
+ ** get globals into registers.
+ ** we have a user generated syntax type error
+ */
+ yy_pv = yypv;
+ yy_ps = yyps;
+ yy_state = yystate;
+ skip_init:
+ yynerrs++;
+ /* FALLTHRU */
+ case 1:
+ case 2: /* incompletely recovered error */
+ /* try again... */
+ yyerrflag = 3;
+ /*
+ ** find state where "error" is a legal
+ ** shift action
+ */
+ while ( yy_ps >= yys )
+ {
+ yy_n = yypact[ *yy_ps ] + YYERRCODE;
+ if ( yy_n >= 0 && yy_n < YYLAST &&
+ yychk[yyact[yy_n]] == YYERRCODE) {
+ /*
+ ** simulate shift of "error"
+ */
+ yy_state = yyact[ yy_n ];
+ goto yy_stack;
+ }
+ /*
+ ** current state has no shift on
+ ** "error", pop stack
+ */
+#if YYDEBUG
+# define _POP_ "Error recovery pops state %d, uncovers state %d\n"
+ if ( yydebug )
+ printf( _POP_, *yy_ps,
+ yy_ps[-1] );
+# undef _POP_
+#endif
+ yy_ps--;
+ yy_pv--;
+ }
+ /*
+ ** there is no state on stack with "error" as
+ ** a valid shift. give up.
+ */
+ YYABORT;
+ case 3: /* no shift yet; eat a token */
+#if YYDEBUG
+ /*
+ ** if debugging, look up token in list of
+ ** pairs. 0 and negative shouldn't occur,
+ ** but since timing doesn't matter when
+ ** debugging, it doesn't hurt to leave the
+ ** tests here.
+ */
+ if ( yydebug )
+ {
+ register int yy_i;
+
+ printf( "Error recovery discards " );
+ if ( yychar == 0 )
+ printf( "token end-of-file\n" );
+ else if ( yychar < 0 )
+ printf( "token -none-\n" );
+ else
+ {
+ for ( yy_i = 0;
+ yytoks[yy_i].t_val >= 0;
+ yy_i++ )
+ {
+ if ( yytoks[yy_i].t_val
+ == yychar )
+ {
+ break;
+ }
+ }
+ printf( "token %s\n",
+ yytoks[yy_i].t_name );
+ }
+ }
+#endif /* YYDEBUG */
+ if ( yychar == 0 ) /* reached EOF. quit */
+ YYABORT;
+ yychar = -1;
+ goto yy_newstate;
+ }
+ }/* end if ( yy_n == 0 ) */
+ /*
+ ** reduction by production yy_n
+ ** put stack tops, etc. so things right after switch
+ */
+#if YYDEBUG
+ /*
+ ** if debugging, print the string that is the user's
+ ** specification of the reduction which is just about
+ ** to be done.
+ */
+ if ( yydebug )
+ printf( "Reduce by (%d) \"%s\"\n",
+ yy_n, yyreds[ yy_n ] );
+#endif
+ yytmp = yy_n; /* value to switch over */
+ yypvt = yy_pv; /* $vars top of value stack */
+ /*
+ ** Look in goto table for next state
+ ** Sorry about using yy_state here as temporary
+ ** register variable, but why not, if it works...
+ ** If yyr2[ yy_n ] doesn't have the low order bit
+ ** set, then there is no action to be done for
+ ** this reduction. So, no saving & unsaving of
+ ** registers done. The only difference between the
+ ** code just after the if and the body of the if is
+ ** the goto yy_stack in the body. This way the test
+ ** can be made before the choice of what to do is needed.
+ */
+ {
+ /* length of production doubled with extra bit */
+ register int yy_len = yyr2[ yy_n ];
+
+ if ( !( yy_len & 01 ) )
+ {
+ yy_len >>= 1;
+ yyval = ( yy_pv -= yy_len )[1]; /* $$ = $1 */
+ yy_state = yypgo[ yy_n = yyr1[ yy_n ] ] +
+ *( yy_ps -= yy_len ) + 1;
+ if ( yy_state >= YYLAST ||
+ yychk[ yy_state =
+ yyact[ yy_state ] ] != -yy_n )
+ {
+ yy_state = yyact[ yypgo[ yy_n ] ];
+ }
+ goto yy_stack;
+ }
+ yy_len >>= 1;
+ yyval = ( yy_pv -= yy_len )[1]; /* $$ = $1 */
+ yy_state = yypgo[ yy_n = yyr1[ yy_n ] ] +
+ *( yy_ps -= yy_len ) + 1;
+ if ( yy_state >= YYLAST ||
+ yychk[ yy_state = yyact[ yy_state ] ] != -yy_n )
+ {
+ yy_state = yyact[ yypgo[ yy_n ] ];
+ }
+ }
+ /* save until reenter driver code */
+ yystate = yy_state;
+ yyps = yy_ps;
+ yypv = yy_pv;
+ }
+ /*
+ ** code supplied by user is placed in this switch
+ */
+ switch( yytmp )
+ {
+
+case 1:
+
+{ yyval.constraint_ = new TAO_Unary_Constraint(TAO_CONSTRAINT, yypvt[-0].constraint_); } break;
+case 2:
+
+{ yyval.constraint_ = yypvt[-0].constraint_; } break;
+case 3:
+
+{ yyval.constraint_ = new TAO_Unary_Constraint(TAO_MIN, yypvt[-0].constraint_); } break;
+case 4:
+
+{ yyval.constraint_ = new TAO_Unary_Constraint(TAO_MAX, yypvt[-0].constraint_); } break;
+case 5:
+
+{ yyval.constraint_ = new TAO_Unary_Constraint(TAO_WITH, yypvt[-0].constraint_); } break;
+case 6:
+
+{ yyval.constraint_ = new TAO_Noop_Constraint(TAO_FIRST); } break;
+case 7:
+
+{ yyval.constraint_ = new TAO_Noop_Constraint(TAO_RANDOM); } break;
+case 8:
+
+{ yyval.constraint_ = new TAO_Binary_Constraint(TAO_OR, yypvt[-2].constraint_, yypvt[-0].constraint_); } break;
+case 9:
+
+{ yyval.constraint_ = yypvt[-0].constraint_; } break;
+case 10:
+
+{ yyval.constraint_ = new TAO_Binary_Constraint(TAO_AND, yypvt[-2].constraint_, yypvt[-0].constraint_); } break;
+case 11:
+
+{ yyval.constraint_ = yypvt[-0].constraint_; } break;
+case 12:
+
+{ yyval.constraint_ = new TAO_Binary_Constraint(TAO_EQ, yypvt[-2].constraint_, yypvt[-0].constraint_); } break;
+case 13:
+
+{ yyval.constraint_ = new TAO_Binary_Constraint(TAO_NE, yypvt[-2].constraint_, yypvt[-0].constraint_); } break;
+case 14:
+
+{ yyval.constraint_ = new TAO_Binary_Constraint(TAO_GT, yypvt[-2].constraint_, yypvt[-0].constraint_); } break;
+case 15:
+
+{ yyval.constraint_ = new TAO_Binary_Constraint(TAO_GE, yypvt[-2].constraint_, yypvt[-0].constraint_); } break;
+case 16:
+
+{ yyval.constraint_ = new TAO_Binary_Constraint(TAO_LT, yypvt[-2].constraint_, yypvt[-0].constraint_); } break;
+case 17:
+
+{ yyval.constraint_ = new TAO_Binary_Constraint(TAO_LE, yypvt[-2].constraint_, yypvt[-0].constraint_); } break;
+case 18:
+
+{ yyval.constraint_ = yypvt[-0].constraint_; } break;
+case 19:
+
+{ yyval.constraint_ = new TAO_Binary_Constraint(TAO_IN, yypvt[-2].constraint_, yypvt[-0].constraint_); } break;
+case 20:
+
+{ yyval.constraint_ = yypvt[-0].constraint_; } break;
+case 21:
+
+{ yyval.constraint_ = new TAO_Binary_Constraint(TAO_TWIDDLE, yypvt[-2].constraint_, yypvt[-0].constraint_); } break;
+case 22:
+
+{ yyval.constraint_ = yypvt[-0].constraint_; } break;
+case 23:
+
+{ yyval.constraint_ = new TAO_Binary_Constraint(TAO_PLUS, yypvt[-2].constraint_, yypvt[-0].constraint_); } break;
+case 24:
+
+{ yyval.constraint_ = new TAO_Binary_Constraint(TAO_MINUS, yypvt[-2].constraint_, yypvt[-0].constraint_); } break;
+case 25:
+
+{ yyval.constraint_ = yypvt[-0].constraint_; } break;
+case 26:
+
+{ yyval.constraint_ = new TAO_Binary_Constraint(TAO_MULT, yypvt[-2].constraint_, yypvt[-0].constraint_); } break;
+case 27:
+
+{ yyval.constraint_ = new TAO_Binary_Constraint(TAO_DIV, yypvt[-2].constraint_, yypvt[-0].constraint_); } break;
+case 28:
+
+{ yyval.constraint_ = yypvt[-0].constraint_; } break;
+case 29:
+
+{ yyval.constraint_ = new TAO_Unary_Constraint(TAO_NOT, yypvt[-0].constraint_); } break;
+case 30:
+
+{ yyval.constraint_ = yypvt[-0].constraint_; } break;
+case 31:
+
+{ yyval.constraint_ = yypvt[-1].constraint_; } break;
+case 32:
+
+{ yyval.constraint_ = new TAO_Unary_Constraint(TAO_EXIST, yypvt[-0].constraint_); } break;
+case 33:
+
+{ yyval.constraint_ = yypvt[-0].constraint_; } break;
+case 34:
+
+{ yyval.constraint_ = yypvt[-0].constraint_; } break;
+case 35:
+
+{ yyval.constraint_ = new TAO_Unary_Constraint(TAO_UMINUS, yypvt[-0].constraint_); } break;
+case 36:
+
+{ yyval.constraint_ = yypvt[-0].constraint_; } break;
+case 37:
+
+{ yyval.constraint_ = yypvt[-0].constraint_; } break;
+
+ }
+ goto yystack; /* reset registers in driver code */
+}
+
+TAO_END_VERSIONED_NAMESPACE_DECL
diff --git a/TAO/orbsvcs/orbsvcs/Trader/Interpreter.cpp b/TAO/orbsvcs/orbsvcs/Trader/Interpreter.cpp
new file mode 100644
index 00000000000..ff6f7b4a1e4
--- /dev/null
+++ b/TAO/orbsvcs/orbsvcs/Trader/Interpreter.cpp
@@ -0,0 +1,101 @@
+// $Id$
+
+#include "orbsvcs/Trader/Interpreter.h"
+#include "ace/OS_NS_string.h"
+
+TAO_BEGIN_VERSIONED_NAMESPACE_DECL
+
+TAO_SYNCH_MUTEX TAO_Interpreter::parserMutex__;
+
+TAO_Interpreter::TAO_Interpreter (void)
+ : root_ (0)
+{
+}
+
+TAO_Interpreter::~TAO_Interpreter (void)
+{
+ delete root_;
+}
+
+int
+TAO_Interpreter::build_tree (const char* constraints)
+{
+ ACE_GUARD_RETURN (TAO_SYNCH_MUTEX,
+ guard,
+ TAO_Interpreter::parserMutex__,
+ -1);
+
+ TAO_Lex_String_Input::reset ((char*)constraints);
+ int return_value = 0;
+
+ yyval.constraint_ = 0;
+ return_value = ::yyparse ();
+
+ if (return_value == 0 && yyval.constraint_ != 0)
+ this->root_ = yyval.constraint_;
+ else
+ {
+ while (yylex () > 0)
+ continue;
+ this->root_ = 0;
+ }
+
+ return return_value;
+}
+
+int
+TAO_Interpreter::is_empty_string (const char* str)
+{
+ int return_value = 0;
+
+ if (str != 0)
+ {
+ int i = 0;
+ while (str[i] != '\0')
+ {
+ if (str[i] != ' ')
+ break;
+
+ i++;
+ }
+
+ if (str[i] == '\0')
+ return_value = 1;
+ }
+
+ return return_value;
+}
+
+char* TAO_Lex_String_Input::string_ = 0;
+char* TAO_Lex_String_Input::current_ = 0;
+char* TAO_Lex_String_Input::end_ = 0;
+
+// Routine to have Lex read its input from the constraint string.
+
+int
+TAO_Lex_String_Input::copy_into (char* buf, int max_size)
+{
+ int chars_left = TAO_Lex_String_Input::end_ - TAO_Lex_String_Input::current_;
+ int n = max_size > chars_left ? chars_left : max_size;
+
+ if (n > 0)
+ {
+ ACE_OS:: memcpy (buf,
+ TAO_Lex_String_Input::current_,
+ n);
+ TAO_Lex_String_Input::current_ += n;
+ }
+
+ return n;
+}
+
+void
+TAO_Lex_String_Input::reset (char* input_string)
+{
+ TAO_Lex_String_Input::string_ = input_string;
+ TAO_Lex_String_Input::current_ = input_string;
+ TAO_Lex_String_Input::end_ = input_string +
+ ACE_OS::strlen (TAO_Lex_String_Input::string_);
+}
+
+TAO_END_VERSIONED_NAMESPACE_DECL
diff --git a/TAO/orbsvcs/orbsvcs/Trader/Interpreter.h b/TAO/orbsvcs/orbsvcs/Trader/Interpreter.h
new file mode 100644
index 00000000000..7971ed9e024
--- /dev/null
+++ b/TAO/orbsvcs/orbsvcs/Trader/Interpreter.h
@@ -0,0 +1,107 @@
+// -*- C++ -*-
+
+//=============================================================================
+/**
+ * @file Interpreter.h
+ *
+ * $Id$
+ *
+ * @author Seth Widoff <sbw1@cs.wustl.edu>
+ */
+//=============================================================================
+
+#ifndef TAO_TCL_INTERPRETER_H
+#define TAO_TCL_INTERPRETER_H
+#include /**/ "ace/pre.h"
+
+#include "orbsvcs/Trader/Constraint_Nodes.h"
+#include "orbsvcs/Trader/Constraint_Visitors.h"
+#include "orbsvcs/Trader/trading_serv_export.h"
+
+TAO_BEGIN_VERSIONED_NAMESPACE_DECL
+
+class TAO_Constraint_Evaluator;
+class TAO_Constraint_Validator;
+
+/**
+ * @class TAO_Interpreter
+ *
+ * @brief TAO_Interpreter is the superclass for all interpreters. Its
+ * build tree method invokes the yacc parser to parse a constraint
+ * or preference string.
+ */
+class TAO_Trading_Serv_Export TAO_Interpreter
+{
+protected:
+ // = Initialization and termination methods.
+ /// Constructor.
+ TAO_Interpreter (void);
+
+ /// Destructor.
+ ~TAO_Interpreter (void);
+
+ /// Using the Yacc generated parser, construct an expression tree
+ /// representing <constraints> from the tokens returned by it.
+ int build_tree (const char* preferences);
+
+ static int is_empty_string (const char* str);
+
+ /// The root of the expression tree, not equal to null if build_tree
+ /// successfully builds a tree from the constraints.
+ TAO_Constraint* root_;
+private:
+ /// This mutex protects the <build_tree> method from reentrance.
+ static TAO_SYNCH_MUTEX parserMutex__;
+};
+
+
+// Functions we need for parsing.
+extern int yyparse (void);
+extern void yyrestart (FILE*);
+extern int yylex (void);
+
+// Have yylex read from the constraint string, not from stdin.
+#undef YY_INPUT
+#define YY_INPUT(b, r, ms) (r = TAO_Lex_String_Input::copy_into(b, ms))
+
+#undef yyerror
+#define yyerror(x)
+
+/**
+ * @class TAO_Lex_String_Input
+ *
+ * @brief Have Lex read from a string and not from stdin. Essentially,
+ * the interpreter needs to call yylex() until EOF, and call
+ * TAO_Lex_String_Input::reset() with the new string, prior to
+ * calling yyparse.
+ */
+class TAO_Lex_String_Input
+{
+public:
+ /// Reset the lex input.
+ static void reset (char* input_string);
+
+ /// Method lex will call to read from the input string.
+ static int copy_into (char* buf, int max_size);
+
+private:
+
+ /// Pointers to keep track of the input string.
+ static char* string_;
+ static char* current_;
+ static char* end_;
+};
+
+// The union used by lex and yacc to build the Abstract Syntax Tree.
+typedef union
+{
+ TAO_Constraint* constraint_;
+} YYSTYPE;
+
+extern YYSTYPE yylval;
+extern YYSTYPE yyval;
+
+TAO_END_VERSIONED_NAMESPACE_DECL
+
+#include /**/ "ace/post.h"
+#endif /* TAO_TCL_INTERPRETER_H */
diff --git a/TAO/orbsvcs/orbsvcs/Trader/Interpreter_Utils.cpp b/TAO/orbsvcs/orbsvcs/Trader/Interpreter_Utils.cpp
new file mode 100644
index 00000000000..993d47ad0e0
--- /dev/null
+++ b/TAO/orbsvcs/orbsvcs/Trader/Interpreter_Utils.cpp
@@ -0,0 +1,56 @@
+// $Id$
+
+#include "orbsvcs/Trader/Interpreter_Utils.h"
+
+TAO_BEGIN_VERSIONED_NAMESPACE_DECL
+
+// TAO_Sequence_Extracter_Base
+
+CORBA::TCKind
+TAO_Sequence_Extracter_Base::
+sequence_type (CORBA::TypeCode* type_code
+ ACE_ENV_ARG_DECL)
+ ACE_THROW_SPEC ((CORBA::SystemException))
+{
+ // @@ Seth, why do you use a comma to separate the two statements?
+ CORBA::TCKind return_value = CORBA::tk_void,
+ type_kind = type_code->kind (ACE_ENV_SINGLE_ARG_PARAMETER);
+ ACE_CHECK_RETURN (return_value);
+
+ if (type_kind == CORBA::tk_alias
+ || type_kind == CORBA::tk_sequence)
+ {
+ CORBA::TypeCode_var base = CORBA::TypeCode::_duplicate (type_code);
+
+ for (;;)
+ {
+ CORBA::TCKind base_kind = base->kind (ACE_ENV_SINGLE_ARG_PARAMETER);
+ ACE_CHECK_RETURN (return_value);
+
+ if (base_kind == CORBA::tk_alias)
+ {
+ base = base->content_type (ACE_ENV_SINGLE_ARG_PARAMETER);
+ ACE_CHECK_RETURN (return_value);
+ }
+ else
+ break;
+ }
+
+ CORBA::TCKind base_kind = base->kind (ACE_ENV_SINGLE_ARG_PARAMETER);
+ ACE_CHECK_RETURN (return_value);
+
+ if (base_kind == CORBA::tk_sequence)
+ {
+ base = base->content_type (ACE_ENV_SINGLE_ARG_PARAMETER);
+ ACE_CHECK_RETURN (return_value);
+
+ base_kind = base->kind (ACE_ENV_SINGLE_ARG_PARAMETER);
+ ACE_CHECK_RETURN (return_value);
+ return_value = base_kind;
+ }
+ }
+
+ return return_value;
+}
+
+TAO_END_VERSIONED_NAMESPACE_DECL
diff --git a/TAO/orbsvcs/orbsvcs/Trader/Interpreter_Utils.h b/TAO/orbsvcs/orbsvcs/Trader/Interpreter_Utils.h
new file mode 100644
index 00000000000..b258b921ef1
--- /dev/null
+++ b/TAO/orbsvcs/orbsvcs/Trader/Interpreter_Utils.h
@@ -0,0 +1,100 @@
+// -*- C++ -*-
+
+//=============================================================================
+/**
+ * @file Interpreter_Utils.h
+ *
+ * $Id$
+ */
+//=============================================================================
+
+#ifndef TAO_INTERPRETER_UTILS_H
+#define TAO_INTERPRETER_UTILS_H
+
+#include /**/ "ace/pre.h"
+
+#include "ace/Hash_Map_Manager.h"
+#include "ace/Null_Mutex.h"
+#include "ace/Functor.h"
+#include "ace/ACE.h"
+#include "ace/OS_NS_string.h"
+
+#include "tao/AnyTypeCode/TypeCode.h"
+#include "tao/CORBA_String.h"
+#include "tao/SystemException.h"
+
+#include "orbsvcs/Trader/trading_serv_export.h"
+
+ACE_BEGIN_VERSIONED_NAMESPACE_DECL
+
+template<>
+class TAO_Trading_Serv_Export ACE_Hash<CORBA::String_var>
+{
+public:
+ unsigned long operator () (const CORBA::String_var& string) const
+ {
+ unsigned long ret = ACE::hash_pjw (string.in ());
+ return ret;
+ }
+};
+
+template<>
+class TAO_Trading_Serv_Export ACE_Less_Than<CORBA::String_var>
+{
+public:
+ int operator () (const CORBA::String_var &lhs,
+ const CORBA::String_var &rhs) const
+ {
+ return ACE_OS::strcmp (lhs.in (), rhs.in ()) < 0;
+ }
+};
+
+template<>
+class TAO_Trading_Serv_Export ACE_Equal_To<CORBA::String_var>
+{
+public:
+ int operator () (const CORBA::String_var &lhs,
+ const CORBA::String_var &rhs) const
+ {
+ return ACE_OS::strcmp (lhs.in (), rhs.in ()) == 0;
+ }
+};
+
+typedef ACE_Hash_Map_Manager_Ex<CORBA::String_var,
+ int,
+ ACE_Hash<CORBA::String_var>,
+ ACE_Equal_To<CORBA::String_var>,
+ ACE_Null_Mutex>
+ TAO_Lookup_Table;
+typedef ACE_Hash_Map_Manager_Ex<CORBA::String_var,
+ CORBA::TypeCode_ptr,
+ ACE_Hash<CORBA::String_var>,
+ ACE_Equal_To<CORBA::String_var>,
+ ACE_Null_Mutex>
+ TAO_Typecode_Table;
+
+ACE_END_VERSIONED_NAMESPACE_DECL
+TAO_BEGIN_VERSIONED_NAMESPACE_DECL
+
+// *************************************************************
+// TAO_Sequence_Extracter_Base
+// *************************************************************
+
+class TAO_Sequence_Extracter_Base
+// = TITLE
+// Static methods used by the TAO_Sequence_Extracter class.
+{
+public:
+
+ static CORBA::TCKind sequence_type (CORBA::TypeCode* code
+ ACE_ENV_ARG_DECL)
+ ACE_THROW_SPEC ((CORBA::SystemException));
+ // Return the sequence element type for the sequence whose typecode
+ // is <code>.
+};
+
+TAO_END_VERSIONED_NAMESPACE_DECL
+
+#include /**/ "ace/post.h"
+
+#endif /* TAO_INTERPRETER_UTILS_H */
diff --git a/TAO/orbsvcs/orbsvcs/Trader/Interpreter_Utils_T.cpp b/TAO/orbsvcs/orbsvcs/Trader/Interpreter_Utils_T.cpp
new file mode 100644
index 00000000000..5474d4fb694
--- /dev/null
+++ b/TAO/orbsvcs/orbsvcs/Trader/Interpreter_Utils_T.cpp
@@ -0,0 +1,52 @@
+// $Id$
+
+#ifndef TAO_INTERPRETER_UTILS_CPP
+#define TAO_INTERPRETER_UTILS_CPP
+
+#include "orbsvcs/Trader/Interpreter_Utils_T.h"
+#include "orbsvcs/Trader/Constraint_Visitors.h"
+#include "tao/DynamicAny/DynSequence_i.h"
+
+TAO_BEGIN_VERSIONED_NAMESPACE_DECL
+
+template <class OPERAND_TYPE> CORBA::Boolean
+TAO_find (const CORBA::Any& sequence, const OPERAND_TYPE& element)
+{
+ CORBA::Boolean return_value = 0;
+ TAO_Element_Equal<OPERAND_TYPE> functor;
+ TAO_DynSequence_i dyn_seq;
+
+ ACE_DECLARE_NEW_CORBA_ENV;
+ ACE_TRY
+ {
+ dyn_seq.init (sequence ACE_ENV_ARG_PARAMETER);
+ ACE_TRY_CHECK;
+
+ CORBA::ULong length =
+ dyn_seq.get_length ( ACE_ENV_SINGLE_ARG_PARAMETER );
+ ACE_TRY_CHECK;
+
+ dyn_seq.rewind( ACE_ENV_SINGLE_ARG_PARAMETER );
+ ACE_TRY_CHECK;
+
+ for (CORBA::ULong i = 0 ; i < length && ! return_value; i++)
+ {
+ if (functor (dyn_seq, element))
+ return_value = 1;
+
+ dyn_seq.next( ACE_ENV_SINGLE_ARG_PARAMETER );
+ ACE_TRY_CHECK;
+ }
+ }
+ ACE_CATCHANY
+ {
+ return 0;
+ }
+ ACE_ENDTRY;
+
+ return return_value;
+}
+
+TAO_END_VERSIONED_NAMESPACE_DECL
+
+#endif /* TAO_INTERPRETER_UTILS_CPP */
diff --git a/TAO/orbsvcs/orbsvcs/Trader/Interpreter_Utils_T.h b/TAO/orbsvcs/orbsvcs/Trader/Interpreter_Utils_T.h
new file mode 100644
index 00000000000..bbef8857006
--- /dev/null
+++ b/TAO/orbsvcs/orbsvcs/Trader/Interpreter_Utils_T.h
@@ -0,0 +1,23 @@
+// -*- C++ -*-
+
+// $Id$
+
+#ifndef TAO_INTERPRETER_UTILS_T_H
+#define TAO_INTERPRETER_UTILS_T_H
+#include /**/ "ace/pre.h"
+
+#include "tao/Basic_Types.h"
+
+TAO_BEGIN_VERSIONED_NAMESPACE_DECL
+
+template <class OPERAND_TYPE>
+CORBA::Boolean TAO_find (const CORBA::Any& sequence, const OPERAND_TYPE& operand);
+
+TAO_END_VERSIONED_NAMESPACE_DECL
+
+#if defined (ACE_TEMPLATES_REQUIRE_SOURCE)
+#include "orbsvcs/Trader/Interpreter_Utils_T.cpp"
+#endif /* ACE_TEMPLATES_REQUIRE_SOURCE */
+
+#include /**/ "ace/post.h"
+#endif /* TAO_INTERPRETER_UTILS_T_H */
diff --git a/TAO/orbsvcs/orbsvcs/Trader/Locking.h b/TAO/orbsvcs/orbsvcs/Trader/Locking.h
new file mode 100644
index 00000000000..e01ba419b43
--- /dev/null
+++ b/TAO/orbsvcs/orbsvcs/Trader/Locking.h
@@ -0,0 +1,46 @@
+// -*- C++ -*-
+
+//=============================================================================
+/**
+ * @file Locking.h
+ *
+ * $Id$
+ *
+ * @author Marina Spivak <marina@cs.wustl.edu>
+ * @author Seth Widoff <sbw1@cs.wustl.edu>
+ * @author Irfan Pyarali <irfan@cs.wustl.edu>
+ */
+//=============================================================================
+
+#ifndef TAO_LOCKING_H
+#define TAO_LOCKING_H
+
+#include /**/ "ace/pre.h"
+
+// Macros for obtaining read/write locks that are
+// automatically released at the end of scope.
+// In case of failure, CORBA::SystemException is thrown.
+
+#define TAO_WRITE_GUARD(MUTEX,OBJ,LOCK) \
+ACE_Write_Guard<MUTEX> OBJ (LOCK); \
+if (OBJ.locked () == 0) \
+ TAO_THROW (CORBA::UNKNOWN (TAO_DEFAULT_MINOR_CODE, CORBA::COMPLETED_NO));
+
+#define TAO_READ_GUARD(MUTEX,OBJ,LOCK) \
+ACE_Read_Guard<MUTEX> OBJ (LOCK); \
+if (OBJ.locked () == 0) \
+ TAO_THROW (CORBA::UNKNOWN (TAO_DEFAULT_MINOR_CODE, CORBA::COMPLETED_NO));
+
+#define TAO_WRITE_GUARD_RETURN(MUTEX,OBJ,LOCK,RETURN) \
+ACE_Write_Guard<MUTEX> OBJ (LOCK); \
+if (OBJ.locked () == 0) \
+ TAO_THROW_RETURN (CORBA::UNKNOWN (TAO_DEFAULT_MINOR_CODE, CORBA::COMPLETED_NO), RETURN);
+
+#define TAO_READ_GUARD_RETURN(MUTEX,OBJ,LOCK,RETURN) \
+ACE_Read_Guard<MUTEX> OBJ (LOCK); \
+if (OBJ.locked () == 0) \
+ TAO_THROW_RETURN (CORBA::UNKNOWN (TAO_DEFAULT_MINOR_CODE, CORBA::COMPLETED_NO), RETURN);
+
+#include /**/ "ace/post.h"
+
+#endif /* TAO_LOCKING_H */
diff --git a/TAO/orbsvcs/orbsvcs/Trader/Offer_Database.cpp b/TAO/orbsvcs/orbsvcs/Trader/Offer_Database.cpp
new file mode 100644
index 00000000000..9401c5366c0
--- /dev/null
+++ b/TAO/orbsvcs/orbsvcs/Trader/Offer_Database.cpp
@@ -0,0 +1,389 @@
+// $Id$
+
+#ifndef TAO_OFFER_DATABASE_CPP
+#define TAO_OFFER_DATABASE_CPP
+
+#include "orbsvcs/Trader/Offer_Database.h"
+#include "ace/OS_NS_stdio.h"
+#include "ace/OS_NS_string.h"
+
+TAO_BEGIN_VERSIONED_NAMESPACE_DECL
+
+template <class LOCK_TYPE>
+TAO_Offer_Database<LOCK_TYPE>::TAO_Offer_Database (void)
+{
+}
+
+template <class LOCK_TYPE>
+TAO_Offer_Database<LOCK_TYPE>::~TAO_Offer_Database (void)
+{
+ ACE_WRITE_GUARD (LOCK_TYPE, ace_mon, this->db_lock_);
+
+ for (ACE_TYPENAME Offer_Database::iterator type_iter (this->offer_db_);
+ ! type_iter.done ();
+ type_iter++)
+ {
+ Offer_Map_Entry* offer_map_entry = (*type_iter).int_id_;
+
+ {
+ // Artificial scope, so the guard will release the lock before
+ // we delete the lock along with the offer_map_entry.
+ ACE_WRITE_GUARD (LOCK_TYPE, ace_mon, offer_map_entry->lock_);
+
+ for (TAO_Offer_Map::iterator offer_iter (*offer_map_entry->offer_map_);
+ ! offer_iter.done ();
+ offer_iter++)
+ {
+ // Delete all the offers in the offer map.
+ CosTrading::Offer* offer = (*offer_iter).int_id_;
+ delete offer;
+ }
+
+ delete offer_map_entry->offer_map_;
+ }
+
+ delete offer_map_entry;
+ }
+}
+
+template <class LOCK_TYPE> CosTrading::OfferId
+TAO_Offer_Database<LOCK_TYPE>::
+insert_offer (const char* type, CosTrading::Offer* offer)
+{
+ CosTrading::OfferId return_value = 0;
+ ACE_TYPENAME Offer_Database::ENTRY* database_entry = 0;
+ CORBA::String_var service_type (type);
+
+ ACE_READ_GUARD_RETURN (LOCK_TYPE, ace_mon, this->db_lock_, 0);
+
+ if (this->offer_db_.find (service_type, database_entry) == -1)
+ {
+ // If there's no entry for the service type, create one.
+
+ Offer_Map_Entry* new_offer_map_entry = 0;
+ ACE_NEW_RETURN (new_offer_map_entry, Offer_Map_Entry, 0);
+ ACE_NEW_RETURN (new_offer_map_entry->offer_map_, TAO_Offer_Map, 0);
+ new_offer_map_entry->counter_ = 1;
+
+ if (this->db_lock_.release () == -1)
+ return 0;
+ else
+ {
+ // Add the new entry; upgrade lock.
+ ACE_WRITE_GUARD_RETURN (LOCK_TYPE, ace_mon, this->db_lock_, 0);
+ this->offer_db_.bind (service_type,
+ new_offer_map_entry,
+ database_entry);
+ }
+
+ if (this->db_lock_.acquire_read () == -1)
+ return 0;
+ }
+
+ Offer_Map_Entry* offer_map_entry =
+ database_entry->int_id_;
+ ACE_WRITE_GUARD_RETURN (LOCK_TYPE, ace_mon2, offer_map_entry->lock_, 0);
+
+ // Add the offer to the service offer table for this service type.
+ offer_map_entry->offer_map_->bind (offer_map_entry->counter_,
+ offer);
+ return_value = this->generate_offer_id (type,
+ offer_map_entry->counter_);
+ offer_map_entry->counter_++;
+
+ return return_value;
+}
+
+template <class LOCK_TYPE> int
+TAO_Offer_Database<LOCK_TYPE>::
+remove_offer (const char* type, CORBA::ULong id)
+{
+ ACE_READ_GUARD_RETURN (LOCK_TYPE, ace_mon, this->db_lock_, -1);
+
+ int return_value = -1;
+ ACE_TYPENAME Offer_Database::ENTRY* db_entry = 0;
+ CORBA::String_var service_type (type);
+
+ if (this->offer_db_.find (service_type, db_entry) == 0)
+ {
+ CosTrading::Offer* offer = 0;
+ Offer_Map_Entry* offer_map_entry = db_entry->int_id_;
+
+ if (offer_map_entry->lock_.acquire_write () == -1)
+ return -1;
+
+ return_value = offer_map_entry->offer_map_->unbind (id, offer);
+ delete offer;
+
+ // If the service type has no more offers, free the map, lest
+ // the memory forever persist.
+ if (offer_map_entry->offer_map_->current_size () == 0)
+ {
+ if (this->db_lock_.release () == -1)
+ return -1;
+ else
+ {
+ // Promote the database lock. Will be released by
+ // guard.
+ if (this->db_lock_.acquire_write () == -1)
+ return -1;
+
+ // Unbind the service type from the database.
+ this->offer_db_.unbind (service_type);
+
+ // Now that the type has been removed, we can release
+ // its lock.
+ if (offer_map_entry->lock_.release () == -1)
+ return -1;
+
+ // Delete the database resources for this type.
+ delete offer_map_entry->offer_map_;
+ delete offer_map_entry;
+ }
+ }
+ else if (offer_map_entry->lock_.release () == -1)
+ return -1;
+ }
+
+ return return_value;
+}
+
+template <class LOCK_TYPE> int
+TAO_Offer_Database<LOCK_TYPE>::
+remove_offer (const CosTrading::OfferId offer_id
+ ACE_ENV_ARG_DECL)
+ ACE_THROW_SPEC ((CosTrading::IllegalOfferId,
+ CosTrading::UnknownOfferId))
+{
+ char* stype = 0;
+ CORBA::ULong index;
+
+ this->parse_offer_id (offer_id,
+ stype,
+ index
+ ACE_ENV_ARG_PARAMETER);
+ ACE_CHECK_RETURN (-1);
+
+ if (this->remove_offer (stype,
+ index) == -1)
+ ACE_THROW_RETURN (CosTrading::UnknownOfferId (offer_id),
+ -1);
+
+ return 0;
+}
+
+template <class LOCK_TYPE> CosTrading::Offer*
+TAO_Offer_Database<LOCK_TYPE>::
+lookup_offer (const CosTrading::OfferId offer_id,
+ char*& type_name
+ ACE_ENV_ARG_DECL)
+ ACE_THROW_SPEC ((CosTrading::IllegalOfferId,
+ CosTrading::UnknownOfferId))
+{
+ CORBA::ULong index;
+ CosTrading::Offer* offer = 0;
+ this->parse_offer_id (offer_id, type_name, index ACE_ENV_ARG_PARAMETER);
+ ACE_CHECK_RETURN (offer);
+
+ if ((offer = this->lookup_offer (type_name, index)) == 0)
+ ACE_THROW_RETURN (CosTrading::UnknownOfferId (offer_id), offer);
+
+ return offer;
+}
+
+
+template <class LOCK_TYPE> CosTrading::Offer*
+TAO_Offer_Database<LOCK_TYPE>::
+lookup_offer (const CosTrading::OfferId offer_id
+ ACE_ENV_ARG_DECL)
+ ACE_THROW_SPEC ((CosTrading::IllegalOfferId,
+ CosTrading::UnknownOfferId))
+{
+ char* type_name;
+ CORBA::ULong index;
+ CosTrading::Offer* offer = 0;
+
+ this->parse_offer_id (offer_id, type_name, index ACE_ENV_ARG_PARAMETER);
+ ACE_CHECK_RETURN (offer);
+
+ if ((offer = this->lookup_offer (type_name, index)) == 0)
+ ACE_THROW_RETURN (CosTrading::UnknownOfferId (offer_id), offer);
+
+ return offer;
+}
+
+template <class LOCK_TYPE> CosTrading::Offer*
+TAO_Offer_Database<LOCK_TYPE>::
+lookup_offer (const char* type, CORBA::ULong id)
+{
+ ACE_READ_GUARD_RETURN (LOCK_TYPE, ace_mon, this->db_lock_, 0);
+
+ CosTrading::Offer* return_value = 0;
+ ACE_TYPENAME Offer_Database::ENTRY* db_entry = 0;
+ CORBA::String_var service_type (type);
+
+ if (this->offer_db_.find (service_type, db_entry) == 0)
+ {
+ Offer_Map_Entry* offer_map_entry = db_entry->int_id_;
+ ACE_READ_GUARD_RETURN (LOCK_TYPE, ace_mon, offer_map_entry->lock_, 0);
+
+ TAO_Offer_Map::ENTRY* offer_entry_ptr = 0;
+ if (offer_map_entry->offer_map_->find (id, offer_entry_ptr) == 0)
+ return_value = offer_entry_ptr->int_id_;
+ }
+
+ return return_value;
+}
+
+template <class LOCK_TYPE> TAO_Offer_Id_Iterator*
+TAO_Offer_Database<LOCK_TYPE>::retrieve_all_offer_ids (void)
+{
+ // Fill an TAO_Offer_Id_Iterator with the offer_ids of all offers
+ // exported to the TAO_Offer_Database. Iterates through the entire
+ // map, cramming offer_id strings into a newly constructed
+ // TAO_Offer_Id_Iterator.
+ TAO_Offer_Id_Iterator* id_iterator;
+ ACE_NEW_RETURN (id_iterator,
+ TAO_Offer_Id_Iterator (),
+ 0);
+ ACE_READ_GUARD_RETURN (LOCK_TYPE, ace_mon, this->db_lock_, 0);
+
+ for (ACE_TYPENAME Offer_Database::iterator type_iter (this->offer_db_);
+ ! type_iter.done ();
+ type_iter++)
+ {
+ const char* type_name = (*type_iter).ext_id_.in ();
+ Offer_Map_Entry* offer_map_entry = (*type_iter).int_id_;
+
+ ACE_READ_GUARD_RETURN (LOCK_TYPE, ace_mon, offer_map_entry->lock_, 0);
+
+ for (TAO_Offer_Map::iterator offer_iter (*offer_map_entry->offer_map_);
+ ! offer_iter.done ();
+ offer_iter++)
+ {
+ CORBA::ULong offer_index = (*offer_iter).ext_id_;
+ CosTrading::OfferId offer_id =
+ this->generate_offer_id (type_name, offer_index);
+
+ id_iterator->insert_id (offer_id);
+ }
+ }
+
+ return id_iterator;
+}
+
+template <class LOCK_TYPE> void
+TAO_Offer_Database<LOCK_TYPE>::
+parse_offer_id (const CosTrading::OfferId offer_id,
+ char*&service_type,
+ CORBA::ULong& id
+ ACE_ENV_ARG_DECL)
+ ACE_THROW_SPEC ((CosTrading::IllegalOfferId))
+{
+ // Get service type: it is everything from 17th character to the end.
+ service_type = (char *) offer_id + 16;
+
+ // Get id: temporarily put the end of string character where the service
+ // type starts, convert to number, replace the character back.
+ char* start_of_type = (char *) (offer_id + 16);
+ char temp = *start_of_type;
+ *start_of_type = '\0';
+ id = ACE_OS::atoi (offer_id);
+
+ *start_of_type = temp;
+
+ if (! TAO_Trader_Base::is_valid_identifier_name (service_type))
+ ACE_THROW (CosTrading::IllegalOfferId (offer_id));
+}
+
+template <class LOCK_TYPE> CosTrading::OfferId
+TAO_Offer_Database<LOCK_TYPE>::
+generate_offer_id (const char *service_type_name, CORBA::ULong id)
+{
+ // holds final id string.
+ size_t total_size = 16 + ACE_OS::strlen (service_type_name);
+
+ // hold portions of id string.
+ CosTrading::OfferId offer_id =
+ CORBA::string_alloc (static_cast<CORBA::ULong> (total_size));
+ char* return_value = 0;
+ ACE_OS::sprintf (offer_id, "%016u%s", id, service_type_name);
+
+ return_value = CORBA::string_dup (offer_id);
+ delete [] offer_id;
+
+ return return_value;
+}
+
+
+template <class LOCK_TYPE>
+TAO_Service_Offer_Iterator<LOCK_TYPE>::
+TAO_Service_Offer_Iterator (const char* type,
+ TAO_Offer_Database<LOCK_TYPE>& offer_database)
+ : stm_ (offer_database),
+ lock_ (0),
+ offer_iter_ (0),
+ type_ (type)
+{
+ CORBA::String_var service_type (type);
+
+ if (this->stm_.db_lock_.acquire_read () == -1)
+ return;
+
+ ACE_TYPENAME TAO_Offer_Database<LOCK_TYPE>::Offer_Map_Entry* entry = 0;
+ if (this->stm_.offer_db_.find (service_type, entry) == -1)
+ return;
+ else
+ {
+ this->lock_ = &entry->lock_;
+ if (this->lock_->acquire_read () == -1)
+ return;
+
+ ACE_NEW (offer_iter_,
+ TAO_Offer_Map::iterator (*entry->offer_map_));
+ }
+}
+
+template <class LOCK_TYPE>
+TAO_Service_Offer_Iterator<LOCK_TYPE>::~TAO_Service_Offer_Iterator (void)
+{
+ this->stm_.db_lock_.release ();
+
+ if (this->lock_ != 0)
+ {
+ this->lock_->release ();
+ delete this->offer_iter_;
+ }
+}
+
+template <class LOCK_TYPE> CosTrading::OfferId
+TAO_Service_Offer_Iterator<LOCK_TYPE>::get_id (void)
+{
+ return (this->offer_iter_ != 0)
+ ? TAO_Offer_Database<LOCK_TYPE>::generate_offer_id (this->type_, (**this->offer_iter_).ext_id_)
+ : 0;
+}
+
+template <class LOCK_TYPE> int
+TAO_Service_Offer_Iterator<LOCK_TYPE>::has_more_offers (void)
+{
+ return (this->offer_iter_ != 0) ? ! this->offer_iter_->done () : 0;
+}
+
+
+template <class LOCK_TYPE> CosTrading::Offer*
+TAO_Service_Offer_Iterator<LOCK_TYPE>::get_offer (void)
+{
+ return (this->offer_iter_ != 0) ? (**this->offer_iter_).int_id_ : 0;
+}
+
+template <class LOCK_TYPE> void
+TAO_Service_Offer_Iterator<LOCK_TYPE>::next_offer (void)
+{
+ if (this->offer_iter_ != 0)
+ this->offer_iter_->advance ();
+}
+
+TAO_END_VERSIONED_NAMESPACE_DECL
+
+#endif /* TAO_OFFER_DATABASE_CPP */
diff --git a/TAO/orbsvcs/orbsvcs/Trader/Offer_Database.h b/TAO/orbsvcs/orbsvcs/Trader/Offer_Database.h
new file mode 100644
index 00000000000..3087ea49d94
--- /dev/null
+++ b/TAO/orbsvcs/orbsvcs/Trader/Offer_Database.h
@@ -0,0 +1,211 @@
+// -*- C++ -*-
+
+//=============================================================================
+/**
+ * @file Offer_Database.h
+ *
+ * $Id$
+ *
+ * @author Seth Widoff <sbw1@cs.wustl.edu>
+ */
+//=============================================================================
+
+
+#ifndef TAO_OFFER_DATABASE_H
+#define TAO_OFFER_DATABASE_H
+#include /**/ "ace/pre.h"
+
+#include "orbsvcs/Trader/Trader.h"
+#include "orbsvcs/Trader/Offer_Iterators.h"
+#include "ace/Null_Mutex.h"
+
+TAO_BEGIN_VERSIONED_NAMESPACE_DECL
+
+template <class LOCK_TYPE> class TAO_Service_Offer_Iterator;
+
+/**
+ * @class TAO_Offer_Database
+ *
+ * The TAO_Offer_Database encapsulates the mapping of service
+ * types to those offers exported with that service types. The
+ * underlying structure is a map of maps. The first maps maps the
+ * service type name to a map of exported offers. The second map
+ * maps the identifying index for that offer within the service
+ * types. So a service type name and an index uniquely identifies an
+ * exported offer. In fact, when the register export interface
+ * returns a CosTrading::OfferId, it's returning no more than a
+ * simple string concatenation of these two values. In addition to
+ * all these wonderful things, the TAO_Offer_Database has built-in
+ * locking, one reader/writer-style lock for modifying the top-level
+ * map and a reader/writer-style for each of the offer
+ * maps. Needless to say the locks are acquired when the
+ * TAO_Offer_Database performs operations on the structures they
+ * guard.
+ * NOTE: TAO_Offer_Database needs to be parameterized by a
+ * READER/WRITER LOCK, a RECURSIVE MUTEX, or a NULL MUTEX, not a
+ * simple binary mutex! Mutexes will cause deadlock when you try to
+ * contruct an iterator (which acquires a read lock on the map under
+ * an existing read lock). Just don't do it, ok?
+ */
+template <class LOCK_TYPE>
+class TAO_Offer_Database
+{
+ friend class TAO_Service_Offer_Iterator<LOCK_TYPE>;
+public:
+
+ // Traits
+ typedef TAO_Service_Offer_Iterator<LOCK_TYPE> offer_iterator;
+
+ /// No arg constructor.
+ TAO_Offer_Database (void);
+
+ ~TAO_Offer_Database (void);
+
+ /// Add an offer of type <type> and generate a CosTrading::OfferId
+ /// for it. Returns 0 on failure.
+ CosTrading::OfferId insert_offer (const char* type,
+ CosTrading::Offer* offer);
+
+ int remove_offer (const CosTrading::OfferId offer_id
+ ACE_ENV_ARG_DECL)
+ ACE_THROW_SPEC ((CosTrading::IllegalOfferId,
+ CosTrading::UnknownOfferId));
+
+ /// Lookup an offer whose offer_id is <offer_id>, and return
+ /// it. Otherwise, throw the appropriate exception.
+ CosTrading::Offer* lookup_offer (const CosTrading::OfferId offer_id
+ ACE_ENV_ARG_DECL)
+ ACE_THROW_SPEC ((CosTrading::IllegalOfferId,
+ CosTrading::UnknownOfferId));
+
+ /**
+ * Lookup an offer whose OfferId is <offer_id> and return in
+ * <type_name> the type name of the object. Type name is just a
+ * pointer to a location in offer_id, so DON'T DELETE IT.
+ */
+ CosTrading::Offer* lookup_offer (const CosTrading::OfferId offer_id,
+ char*& type_name
+ ACE_ENV_ARG_DECL)
+ ACE_THROW_SPEC ((CosTrading::IllegalOfferId,
+ CosTrading::UnknownOfferId));
+
+ /// Return an iterator that will traverse and return all the offer
+ /// ids in the service type map.
+ TAO_Offer_Id_Iterator* retrieve_all_offer_ids (void);
+
+ struct Offer_Map_Entry
+ {
+ TAO_Offer_Map* offer_map_;
+ CORBA::ULong counter_;
+ LOCK_TYPE lock_;
+ };
+
+ typedef ACE_Hash_Map_Manager_Ex
+ <
+ CORBA::String_var,
+ Offer_Map_Entry*,
+ ACE_Hash<CORBA::String_var>,
+ ACE_Equal_To<CORBA::String_var>,
+ ACE_Null_Mutex
+ >
+ Offer_Database;
+
+private:
+
+ // The internal id is a pointer here, not only to avoid copying,
+ // since we would only copy on insertion, and we only insert once
+ // --- with an empty Offer_Map_Entry --- but also since most locks
+ // have unimplemented copy constructors.
+
+ /// Lookup an offer whose type is <type> and id, <id>. Return 0 on
+ /// failure.
+ CosTrading::Offer* lookup_offer (const char* type,
+ CORBA::ULong id);
+
+ /**
+ * Remove an offers whose id is <offer_id>. Returns 0 on success, -1
+ * on failure, and throws a CosTrading::IllegalOfferId if it can't
+ * parse the CosTrading::OfferId.
+ */
+ int remove_offer (const char* type, CORBA::ULong id);
+
+ /// Take in a service type name for the offer the current value of
+ /// of the counter and generate an offer id.
+ static CosTrading::OfferId generate_offer_id (const char *type_name,
+ CORBA::ULong id);
+
+ /// Take in a previously generated offer id and return the type
+ /// and id that were used to generate the offer id.
+ static void parse_offer_id (const CosTrading::OfferId offer_id,
+ char* &service_type,
+ CORBA::ULong& id
+ ACE_ENV_ARG_DECL)
+ ACE_THROW_SPEC ((CosTrading::IllegalOfferId));
+
+ // = Disallow these operations.
+ ACE_UNIMPLEMENTED_FUNC (void operator= (const TAO_Offer_Database<LOCK_TYPE> &))
+ ACE_UNIMPLEMENTED_FUNC (TAO_Offer_Database (const TAO_Offer_Database<LOCK_TYPE> &))
+
+ LOCK_TYPE db_lock_;
+
+ Offer_Database offer_db_;
+ // The protected data structure.
+};
+
+/**
+ * @class TAO_Service_Offer_Iterator
+ *
+ * @brief TAO_Service_Offer_Iterator iterates over the set of exported
+ * offers for a given type. Handily, it takes care of all the
+ * necessary locking, acquiring them in the constructor, and
+ * releasing them in the destructor.
+ */
+template <class LOCK_TYPE>
+class TAO_Service_Offer_Iterator
+{
+ public:
+
+ typedef TAO_Offer_Database<LOCK_TYPE> Offer_Database;
+
+ TAO_Service_Offer_Iterator (const char* type,
+ TAO_Offer_Database<LOCK_TYPE>& offer_database);
+
+ /// Release all the locks acquired.
+ ~TAO_Service_Offer_Iterator (void);
+
+ /// Returns 1 if there are more offers, 0 otherwise.
+ int has_more_offers (void);
+
+ /// Get the id for the current offer.
+ CosTrading::OfferId get_id (void);
+
+ /// Returns the next offer in the series.
+ CosTrading::Offer* get_offer (void);
+
+ /// Advances the iterator 1.
+ void next_offer (void);
+
+ private:
+ // Protected constructor.
+
+ /// Lock the top_level map.
+ TAO_Offer_Database<LOCK_TYPE>& stm_;
+
+ /// Lock for the internal map.
+ LOCK_TYPE* lock_;
+
+ /// Iterator over the actual offer map.
+ TAO_Offer_Map::iterator* offer_iter_;
+
+ /// The name of the type. Used for constructing offer ids.
+ const char* type_;
+};
+
+TAO_END_VERSIONED_NAMESPACE_DECL
+
+#if defined (ACE_TEMPLATES_REQUIRE_SOURCE)
+#include "orbsvcs/Trader/Offer_Database.cpp"
+#endif /* ACE_TEMPLATES_REQUIRE_SOURCE */
+
+#include /**/ "ace/post.h"
+#endif /* TAO_SERVICE_TYPE_MAP_H */
diff --git a/TAO/orbsvcs/orbsvcs/Trader/Offer_Iterators.cpp b/TAO/orbsvcs/orbsvcs/Trader/Offer_Iterators.cpp
new file mode 100644
index 00000000000..da8ad797031
--- /dev/null
+++ b/TAO/orbsvcs/orbsvcs/Trader/Offer_Iterators.cpp
@@ -0,0 +1,322 @@
+// $Id$
+
+#include "orbsvcs/Trader/Offer_Iterators.h"
+
+ACE_RCSID(Trader, Offer_Iterators, "$Id$")
+
+TAO_BEGIN_VERSIONED_NAMESPACE_DECL
+
+TAO_Offer_Iterator::TAO_Offer_Iterator (const TAO_Property_Filter& pfilter)
+ : pfilter_ (pfilter)
+{
+}
+
+TAO_Offer_Iterator::~TAO_Offer_Iterator (void)
+{
+}
+
+void
+TAO_Offer_Iterator::destroy (ACE_ENV_SINGLE_ARG_DECL)
+ ACE_THROW_SPEC ((CORBA::SystemException))
+{
+ // Remove self from POA
+
+ 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_Query_Only_Offer_Iterator::
+TAO_Query_Only_Offer_Iterator(const TAO_Property_Filter& pfilter)
+ : TAO_Offer_Iterator (pfilter)
+{
+}
+
+TAO_Query_Only_Offer_Iterator::~TAO_Query_Only_Offer_Iterator(void)
+{
+}
+
+void
+TAO_Query_Only_Offer_Iterator::add_offer (CosTrading::OfferId offer_id,
+ const CosTrading::Offer* offer)
+{
+ this->offers_.enqueue_tail ((CosTrading::Offer*) offer);
+ CORBA::string_free (offer_id);
+}
+
+CORBA::ULong
+TAO_Query_Only_Offer_Iterator::max_left (ACE_ENV_SINGLE_ARG_DECL_NOT_USED)
+ ACE_THROW_SPEC((CORBA::SystemException,
+ CosTrading::UnknownMaxLeft))
+{
+ return static_cast<CORBA::ULong> (this->offers_.size ());
+}
+
+CORBA::Boolean
+TAO_Query_Only_Offer_Iterator::next_n (CORBA::ULong n,
+ CosTrading::OfferSeq_out offers
+ ACE_ENV_ARG_DECL_NOT_USED)
+ ACE_THROW_SPEC ((CORBA::SystemException))
+{
+ offers = new CosTrading::OfferSeq;
+
+ CORBA::ULong sequence_size = static_cast<CORBA::ULong> (this->offers_.size ());
+ CORBA::ULong offers_in_sequence = (n < sequence_size) ? n : sequence_size;
+ offers->length (offers_in_sequence);
+
+ // populate the sequence.
+ for (CORBA::ULong i = 0; i < offers_in_sequence; i++)
+ {
+
+ CosTrading::Offer *source = 0;
+ this->offers_.dequeue_head (source);
+ this->pfilter_.filter_offer (source, offers[i]);
+ }
+
+ return offers_in_sequence != 0;
+}
+
+TAO_Offer_Iterator_Collection::TAO_Offer_Iterator_Collection (void)
+{
+}
+
+TAO_Offer_Iterator_Collection::~TAO_Offer_Iterator_Collection (void)
+{
+ while (! this->iters_.is_empty ())
+ {
+ CosTrading::OfferIterator* offer_iter = 0;
+ this->iters_.dequeue_head (offer_iter);
+
+ ACE_TRY_NEW_ENV
+ {
+ offer_iter->destroy (ACE_ENV_SINGLE_ARG_PARAMETER);
+ ACE_TRY_CHECK;
+
+ CORBA::release (offer_iter);
+ }
+ ACE_CATCHANY
+ {
+ // Don't let the exceptions propagate since we're in a
+ // destructor!
+ }
+ ACE_ENDTRY;
+ }
+}
+
+void
+TAO_Offer_Iterator_Collection::
+add_offer_iterator (CosTrading::OfferIterator_ptr offer_iter)
+{
+ if (! CORBA::is_nil (offer_iter))
+ this->iters_.enqueue_tail (offer_iter);
+}
+
+CORBA::Boolean
+TAO_Offer_Iterator_Collection::next_n (CORBA::ULong n,
+ CosTrading::OfferSeq_out offers
+ ACE_ENV_ARG_DECL)
+ ACE_THROW_SPEC ((CORBA::SystemException))
+{
+ CORBA::ULong offers_left = n;
+ CORBA::Boolean return_value = 1;
+ CosTrading::OfferSeq_var out_offers;
+
+ ACE_NEW_THROW_EX (offers,
+ CosTrading::OfferSeq,
+ CORBA::NO_MEMORY ());
+ ACE_CHECK_RETURN (return_value);
+
+ while (offers_left > 0 && ! this->iters_.is_empty ())
+ {
+ CORBA::ULong offset = 0;
+ CORBA::Boolean any_left = 0;
+ CosTrading::OfferIterator* iter = 0;
+ this->iters_.dequeue_head (iter);
+
+ // Determine how many offers we should retrieve from this
+ // iterator.
+
+ // Retrieve the set of offers.
+ any_left =
+ iter->next_n (offers_left,
+ CosTrading::OfferSeq_out (out_offers.out ())
+ ACE_ENV_ARG_PARAMETER);
+ ACE_CHECK_RETURN (return_value);
+
+ // If we've exhausted this iterator, destroy it.
+ if (any_left == 0)
+ {
+ iter->destroy (ACE_ENV_SINGLE_ARG_PARAMETER);
+ ACE_CHECK_RETURN (return_value);
+ CORBA::release (iter);
+ }
+ else
+ this->iters_.enqueue_head (iter);
+
+ // Merge it with the passed set.
+ offset = offers->length ();
+ offers->length (out_offers->length () + offset);
+ for (CORBA::ULong j = out_offers->length (); j > 0; j--)
+ offers[j + offset - 1] = out_offers[j - 1];
+
+ offers_left -= out_offers->length ();
+ }
+
+ // Determine if we have anything left to offer.
+ if (this->iters_.is_empty ())
+ return_value = 0;
+
+ return return_value;
+}
+
+void
+TAO_Offer_Iterator_Collection::destroy (ACE_ENV_SINGLE_ARG_DECL)
+ ACE_THROW_SPEC ((CORBA::SystemException))
+{
+ // Destroy all iterators in the collection.
+ for (Offer_Iters::ITERATOR iters_iter (this->iters_);
+ ! iters_iter.done ();
+ iters_iter.advance ())
+ {
+ CosTrading::OfferIterator** iter = 0;
+
+ iters_iter.next (iter);
+ (*iter)->destroy (ACE_ENV_SINGLE_ARG_PARAMETER);
+ ACE_CHECK;
+ }
+
+ // Remove self from POA
+
+ 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;
+}
+
+CORBA::ULong
+TAO_Offer_Iterator_Collection::max_left (ACE_ENV_SINGLE_ARG_DECL)
+ ACE_THROW_SPEC ((CORBA::SystemException,
+ CosTrading::UnknownMaxLeft))
+{
+ ACE_THROW_RETURN (CosTrading::UnknownMaxLeft(),
+ 0);
+}
+
+TAO_Offer_Id_Iterator::TAO_Offer_Id_Iterator (void)
+{
+}
+
+TAO_Offer_Id_Iterator::~TAO_Offer_Id_Iterator (void)
+{
+ int return_value = 0;
+
+ do
+ {
+ CosTrading::OfferId offer_id = 0;
+
+ return_value = this->ids_.dequeue_head (offer_id);
+ if (return_value == 0)
+ CORBA::string_free (offer_id);
+ }
+ while (return_value == 0);
+}
+
+CORBA::ULong
+TAO_Offer_Id_Iterator::max_left (ACE_ENV_SINGLE_ARG_DECL_NOT_USED)
+ ACE_THROW_SPEC ((CORBA::SystemException,
+ CosTrading::UnknownMaxLeft))
+{
+ return static_cast<CORBA::ULong> (this->ids_.size ());
+}
+
+void
+TAO_Offer_Id_Iterator::destroy (ACE_ENV_SINGLE_ARG_DECL)
+ ACE_THROW_SPEC ((CORBA::SystemException))
+{
+ // Remove self from POA
+
+ 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;
+}
+
+CORBA::Boolean
+TAO_Offer_Id_Iterator::next_n (CORBA::ULong n,
+ CosTrading::OfferIdSeq_out _ids
+ ACE_ENV_ARG_DECL_NOT_USED)
+ ACE_THROW_SPEC ((CORBA::SystemException))
+{
+ // Calculate the number of Ids to be returned in this.
+ CORBA::ULong items_left = static_cast<CORBA::ULong> (this->ids_.size());
+ int difference = items_left - n;
+ CORBA::ULong returnable_items = (difference >= 0) ? n : items_left;
+ CORBA::Boolean return_value = (CORBA::Boolean) (difference > 0);
+
+ if (returnable_items == 0)
+ ACE_NEW_RETURN (_ids,
+ CosTrading::OfferIdSeq,
+ return_value);
+ else
+ {
+ // Allocate space for the returned OfferIds.
+ CosTrading::OfferId* id_buf =
+ CosTrading::OfferIdSeq::allocbuf (returnable_items);
+
+ if (id_buf != 0)
+ {
+ // Copy in those ids!
+ for (CORBA::ULong i = 0; i < returnable_items; i++)
+ {
+ CosTrading::OfferId offer_id = 0;
+
+ this->ids_.dequeue_head (offer_id);
+ id_buf[i] = offer_id;
+ }
+
+ // Place them into an OfferIdSeq.
+ ACE_NEW_RETURN (_ids,
+ CosTrading::OfferIdSeq (returnable_items,
+ returnable_items,
+ id_buf,
+ 1),
+ return_value);
+ }
+ else
+ ACE_NEW_RETURN (_ids,
+ CosTrading::OfferIdSeq,
+ return_value);
+ }
+
+ // Return true only if there are items left to be returned in
+ // subsequent calls.
+ return return_value;
+}
+
+void
+TAO_Offer_Id_Iterator::insert_id (CosTrading::OfferId new_id)
+{
+ this->ids_.enqueue_tail (new_id);
+}
+
+TAO_END_VERSIONED_NAMESPACE_DECL
diff --git a/TAO/orbsvcs/orbsvcs/Trader/Offer_Iterators.h b/TAO/orbsvcs/orbsvcs/Trader/Offer_Iterators.h
new file mode 100644
index 00000000000..247664b6f77
--- /dev/null
+++ b/TAO/orbsvcs/orbsvcs/Trader/Offer_Iterators.h
@@ -0,0 +1,298 @@
+// -*- C++ -*-
+
+//=============================================================================
+/**
+ * @file Offer_Iterators.h
+ *
+ * $Id$
+ *
+ * @author Marina Spivak <marina@cs.wustl.edu>
+ * @author Seth Widoff <sbw1@cs.wustl.edu>
+ */
+//=============================================================================
+
+
+#ifndef TAO_OFFER_ITERATORS_H
+#define TAO_OFFER_ITERATORS_H
+#include /**/ "ace/pre.h"
+
+#include "orbsvcs/Trader/Trader_Utils.h"
+
+#if defined(_MSC_VER)
+#pragma warning(push)
+#pragma warning(disable:4250)
+#endif /* _MSC_VER */
+
+TAO_BEGIN_VERSIONED_NAMESPACE_DECL
+
+ // *************************************************************
+ // TAO_Offer_Iterator
+ // *************************************************************
+
+class TAO_Offer_Iterator
+ : public virtual POA_CosTrading::OfferIterator
+{
+ // = TITLE
+ // This class implements CosTrading::OfferIterator IDL
+ // interface.
+
+ // = DESCRIPTION
+ // This is an abstract base class to allow for different
+ // implementations of OfferIterator.
+ // BEGIN SPEC
+ // The OfferIterator interface is used to return a set of service
+ // offers from the query operation by enabling the service offers
+ // to be extracted by successive operations on the OfferIterator
+ // interface.
+ // END SPEC
+public:
+ // = Initialization and termination methods.
+
+ TAO_Offer_Iterator (const TAO_Property_Filter& property_filter);
+
+ virtual ~TAO_Offer_Iterator (void);
+
+ /**
+ * BEGIN SPEC
+ * The destroy operation destroys the iterator. No further
+ * operations can be invoked on an iterator after it has been
+ * destroyed.
+ * END SPEC
+ */
+ virtual void destroy (ACE_ENV_SINGLE_ARG_DECL)
+ ACE_THROW_SPEC ((CORBA::SystemException));
+
+ /// Add an offer to the collection of offers the iterator will
+ /// iterate over.
+ virtual void add_offer (CosTrading::OfferId offer_id,
+ const CosTrading::Offer* offer) = 0;
+
+ virtual CORBA::ULong max_left (ACE_ENV_SINGLE_ARG_DECL)
+ ACE_THROW_SPEC ((CORBA::SystemException,
+ CosTrading::UnknownMaxLeft)) = 0;
+
+ // BEGIN SPEC
+ // The max_left operation returns the number of service offers
+ // remaining in the iterator. The exception UnknownMaxLeft is raised
+ // if the iterator cannot determine the remaining number of service
+ // offers (e.g., if the iterator determines its set of service
+ // offers through lazy evaluation).
+ // END SPEC
+
+ /**
+ * BEGIN SPEC
+ * The next_n operation returns a set of service offers in the
+ * output parameter "offers." The operation returns n service offers
+ * if there are at least n service offers remaining in the
+ * iterator. If there are fewer than n service offers in the
+ * iterator, then all remaining service offers are returned. The
+ * actual number of service offers returned can be determined from
+ * the length of the "offers" sequence. The next_n operation returns
+ * TRUE if there are further service offers to be extracted from the
+ * iterator. It returns FALSE if there are no further service offers
+ * to be extracted.
+ * END SPEC
+ */
+ virtual CORBA::Boolean next_n (CORBA::ULong n,
+ CosTrading::OfferSeq_out offers
+ ACE_ENV_ARG_DECL)
+ ACE_THROW_SPEC ((CORBA::SystemException)) = 0;
+ protected:
+
+ TAO_Offer_Iterator& operator=(const TAO_Offer_Iterator&);
+
+ /// The filter through which each returned offer must pass. Used to
+ /// strip offers of undesirable properties.
+ TAO_Property_Filter pfilter_;
+};
+
+ // *************************************************************
+ // TAO_Query_Only_Offer_Iterator
+ // *************************************************************
+
+class TAO_Query_Only_Offer_Iterator
+ : public TAO_Offer_Iterator
+ // = TITLE
+ // An implementation of the CosTrading::OfferIterator IDL
+ // interface that takes advantage of the fact that the trader is
+ // Query Only, and therefore its service offers are not being
+ // changed or removed.
+ //
+ // = DESCRIPTION
+ // The iterator stores pointers to Offers to be iterated over,
+ // and later accesses the Offers directly through the pointers.
+ //
+{
+public:
+ // = Initialization and termination methods.
+
+ TAO_Query_Only_Offer_Iterator (const TAO_Property_Filter& pfilter);
+
+ virtual ~TAO_Query_Only_Offer_Iterator (void);
+
+ /// Deposit at maximum n offers into the return sequence and return 1,
+ /// or return 0 if the iterator is done and no offers are returned.
+ virtual CORBA::Boolean next_n (CORBA::ULong n,
+ CosTrading::OfferSeq_out offers
+ ACE_ENV_ARG_DECL)
+ ACE_THROW_SPEC ((CORBA::SystemException));
+
+ /// Return the number of items left in the iterator.
+ virtual CORBA::ULong max_left (ACE_ENV_SINGLE_ARG_DECL)
+ ACE_THROW_SPEC ((CORBA::SystemException,
+ CosTrading::UnknownMaxLeft));
+
+ /// Add an offer the iterator should iterate over.
+ void add_offer (CosTrading::OfferId offer_id,
+ const CosTrading::Offer* offer);
+
+private:
+
+ TAO_Query_Only_Offer_Iterator (const TAO_Query_Only_Offer_Iterator&);
+ TAO_Query_Only_Offer_Iterator& operator=(const TAO_Query_Only_Offer_Iterator&);
+
+ /// Structure that stores pointers to offers
+ /// to iterate over.
+ ACE_Unbounded_Queue <CosTrading::Offer *> offers_;
+};
+
+ // *************************************************************
+ // TAO_Offer_Iterator_Collection
+ // *************************************************************
+
+class TAO_Offer_Iterator_Collection :
+ public virtual POA_CosTrading::OfferIterator
+// = TITLE
+// A collection of offer iterator to query in turn.
+//
+// = DESCRIPTION
+// Since a query could conceivable query several other traders, it
+// needs a way to merge the results into a single set of results
+// suitable for being returned to the user. And since all the query
+// method can return to the user is a sequence and an iterator, and
+// the size of the sequence is constrained, there needs to be some
+// way to collect all the returned offer_iterators into a single
+// offer_iterator. This is that collection. The results of
+// collecting all the iterators in this way is a distributed tree of
+// iterators, which could conceivably become hugely inefficient if
+// the trader graph is deep enough.
+{
+public:
+
+ // = Constructors.
+
+ TAO_Offer_Iterator_Collection (void);
+
+ virtual ~TAO_Offer_Iterator_Collection (void);
+
+ /// Retrieve n offers from the set of iterators.
+ virtual CORBA::Boolean next_n (CORBA::ULong n,
+ CosTrading::OfferSeq_out offers
+ ACE_ENV_ARG_DECL)
+ ACE_THROW_SPEC ((CORBA::SystemException));
+
+ /// Destroy the collection of iterators.
+ virtual void destroy (ACE_ENV_SINGLE_ARG_DECL)
+ ACE_THROW_SPEC ((CORBA::SystemException));
+
+ /// Determine how many offers are left in the collection.
+ virtual CORBA::ULong max_left (ACE_ENV_SINGLE_ARG_DECL)
+ ACE_THROW_SPEC ((CORBA::SystemException,
+ CosTrading::UnknownMaxLeft));
+
+ /// Add an iterator to the collection.
+ void add_offer_iterator (CosTrading::OfferIterator_ptr offer_iter);
+
+private:
+
+ TAO_Offer_Iterator_Collection (const TAO_Offer_Iterator_Collection&);
+ TAO_Offer_Iterator_Collection& operator= (const TAO_Offer_Iterator_Collection&);
+
+ typedef ACE_Unbounded_Queue <CosTrading::OfferIterator*> Offer_Iters;
+
+ /// The iterator collection.
+ Offer_Iters iters_;
+};
+
+ // *************************************************************
+ // TAO_Offer_Id_Iterator
+ // *************************************************************
+
+class TAO_Offer_Id_Iterator :
+ public virtual POA_CosTrading::OfferIdIterator
+// = TITLE
+// Silly little iterator that contains the overflow of offer ids
+// from the Admin list_offers method.
+//
+// = DESCRIPTION
+//
+// BEGIN SPEC
+// The OfferIdIterator interface is used to return a set of offer
+// identifiers from the list_offers operation and the list_proxies
+// operation in the Admin interface by enabling the offer identifiers
+// to be extracted by successive operations on the OfferIdIterator
+// interface.
+// END SPEC
+{
+ public:
+
+ /// No op constructor
+ TAO_Offer_Id_Iterator(void);
+
+ ~TAO_Offer_Id_Iterator (void);
+
+ /**
+ * The max_left operation returns the number of offer identifiers
+ * remaining in the iterator. The exception UnknownMaxLeft is raised
+ * if the iterator cannot determine the remaining number of offer
+ * identifiers (e.g., if the iterator determines its set of offer
+ * identifiers through lazy evaluation).
+ */
+ virtual CORBA::ULong max_left(ACE_ENV_SINGLE_ARG_DECL)
+ ACE_THROW_SPEC ((CORBA::SystemException,
+ CosTrading::UnknownMaxLeft));
+
+ /**
+ * The destroy operation destroys the iterator. No further
+ * operations can be invoked on an iterator after it has been
+ * destroyed.
+ */
+ virtual void destroy(ACE_ENV_SINGLE_ARG_DECL)
+ ACE_THROW_SPEC ((CORBA::SystemException));
+
+ /**
+ * The next_n operation returns a set of offer identifiers in the
+ * output parameter "ids." The operation returns n offer identifiers
+ * if there are at least n offer identifiers remaining in the
+ * iterator. If there are fewer than n offer identifiers in the
+ * iterator, then all remaining offer identifiers are returned. The
+ * actual number of offer identifiers returned can be determined
+ * from the length of the "ids" sequence. The next_n operation
+ * returns TRUE if there are further offer identifiers to be
+ * extracted from the iterator. It returns FALSE if there are no
+ * further offer identifiers to be extracted.
+ */
+ virtual CORBA::Boolean next_n(CORBA::ULong _n,
+ CosTrading::OfferIdSeq_out _ids
+ ACE_ENV_ARG_DECL)
+ ACE_THROW_SPEC ((CORBA::SystemException));
+
+ /// Insert a <new_id> into the contents of the iterator.
+ void insert_id(CosTrading::OfferId new_id);
+
+ private:
+
+ TAO_Offer_Id_Iterator (const TAO_Offer_Id_Iterator&);
+ TAO_Offer_Id_Iterator& operator= (TAO_Offer_Id_Iterator&);
+
+ TAO_String_Queue ids_;
+};
+
+TAO_END_VERSIONED_NAMESPACE_DECL
+
+#if defined(_MSC_VER)
+#pragma warning(pop)
+#endif /* _MSC_VER */
+
+#include /**/ "ace/post.h"
+#endif /* TAO_OFFER_ITERATOR */
diff --git a/TAO/orbsvcs/orbsvcs/Trader/Offer_Iterators_T.cpp b/TAO/orbsvcs/orbsvcs/Trader/Offer_Iterators_T.cpp
new file mode 100644
index 00000000000..f8ad8bd3a6f
--- /dev/null
+++ b/TAO/orbsvcs/orbsvcs/Trader/Offer_Iterators_T.cpp
@@ -0,0 +1,97 @@
+// $Id$
+
+#ifndef TAO_OFFER_ITERATORS_T_CPP
+#define TAO_OFFER_ITERATORS_T_CPP
+
+#include "orbsvcs/Trader/Offer_Iterators_T.h"
+
+TAO_BEGIN_VERSIONED_NAMESPACE_DECL
+
+template <class MAP_LOCK_TYPE>
+TAO_Register_Offer_Iterator<MAP_LOCK_TYPE>::
+TAO_Register_Offer_Iterator (TAO_Offer_Database<MAP_LOCK_TYPE> &db,
+ const TAO_Property_Filter& pfilter)
+ : TAO_Offer_Iterator (pfilter),
+ db_ (db)
+{
+}
+
+template <class MAP_LOCK_TYPE>
+TAO_Register_Offer_Iterator<MAP_LOCK_TYPE>::
+~TAO_Register_Offer_Iterator (void)
+{
+ while (! this->offer_ids_.is_empty ())
+ {
+ CosTrading::OfferId offer_id = 0;
+ this->offer_ids_.dequeue_head (offer_id);
+
+ CORBA::string_free (offer_id);
+ }
+}
+
+template <class MAP_LOCK_TYPE> void
+TAO_Register_Offer_Iterator<MAP_LOCK_TYPE>::
+add_offer (CosTrading::OfferId id,
+ const CosTrading::Offer* /* offer */)
+{
+ this->offer_ids_.enqueue_tail (id);
+}
+
+template <class MAP_LOCK_TYPE> CORBA::ULong
+TAO_Register_Offer_Iterator<MAP_LOCK_TYPE>::
+max_left (ACE_ENV_SINGLE_ARG_DECL_NOT_USED)
+ ACE_THROW_SPEC ((CORBA::SystemException,
+ CosTrading::UnknownMaxLeft))
+{
+ return static_cast<CORBA::ULong> (this->offer_ids_.size ());
+}
+
+template <class MAP_LOCK_TYPE> CORBA::Boolean
+TAO_Register_Offer_Iterator<MAP_LOCK_TYPE>::
+next_n (CORBA::ULong n,
+ CosTrading::OfferSeq_out offers
+ ACE_ENV_ARG_DECL)
+ ACE_THROW_SPEC ((CORBA::SystemException))
+{
+ CORBA::ULong ret_offers = 0;
+
+ CORBA::ULong max_possible_offers_in_sequence =
+ (n < this->offer_ids_.size ()) ? n :
+ static_cast<CORBA::ULong> (this->offer_ids_.size ());
+
+ ACE_NEW_THROW_EX (offers,
+ CosTrading::OfferSeq,
+ CORBA::NO_MEMORY ());
+ ACE_CHECK_RETURN (0);
+
+ offers->length (max_possible_offers_in_sequence);
+
+ // While there are entries left and we haven't filled <offers>
+ // with requested number.
+ while (! this->offer_ids_.is_empty ()
+ && n > ret_offers)
+ {
+ // If offer is found, put it into the sequence.
+ // remove this id irrespective of whether the offer is found
+ // or not.
+ CosTrading::OfferId id = 0;
+ this->offer_ids_.dequeue_head (id);
+
+ CosTrading::OfferId_var offerid_var (id);
+ CosTrading::Offer* offer = this->db_.lookup_offer (id ACE_ENV_ARG_PARAMETER);
+ ACE_CHECK_RETURN (0);
+
+ if (offer != 0)
+ this->pfilter_.filter_offer (offer,
+ offers[ret_offers++]);
+ }
+
+ // Reset the length to the correct value
+ offers->length (ret_offers);
+
+ return static_cast<CORBA::Boolean> (ret_offers != 0);
+}
+
+TAO_END_VERSIONED_NAMESPACE_DECL
+
+#endif /* TAO_REGISTER_OFFER_ITERATOR_CPP */
diff --git a/TAO/orbsvcs/orbsvcs/Trader/Offer_Iterators_T.h b/TAO/orbsvcs/orbsvcs/Trader/Offer_Iterators_T.h
new file mode 100644
index 00000000000..8aa992e9add
--- /dev/null
+++ b/TAO/orbsvcs/orbsvcs/Trader/Offer_Iterators_T.h
@@ -0,0 +1,96 @@
+// -*- C++ -*-
+
+//=============================================================================
+/**
+ * @file Offer_Iterators_T.h
+ *
+ * $Id$
+ *
+ * @author Marina Spivak <marina@cs.wustl.edu>
+ * @author Seth Widoff <sbw1@cs.wustl.edu>
+ */
+//=============================================================================
+
+
+#ifndef TAO_REGISTER_OFFER_ITERATOR_H
+#define TAO_REGISTER_OFFER_ITERATOR_H
+#include /**/ "ace/pre.h"
+
+#include "orbsvcs/Trader/Offer_Iterators.h"
+#include "orbsvcs/Trader/Offer_Database.h"
+
+#if defined(_MSC_VER)
+#pragma warning(push)
+#pragma warning(disable:4250)
+#endif /* _MSC_VER */
+
+
+TAO_BEGIN_VERSIONED_NAMESPACE_DECL
+
+/**
+ * @class TAO_Register_Offer_Iterator
+ *
+ * @brief An implementation of CosTrading::OfferIterator IDL interface
+ * appropriate when trader has Register functionality.
+ *
+ * Stores ids of offers to be iterated over. Before returning
+ * an offer, checks if the offer is still there (since it may
+ * have been removed by the Register).
+ */
+template <class MAP_LOCK_TYPE>
+class TAO_Register_Offer_Iterator : public TAO_Offer_Iterator
+{
+public:
+
+ // = Initialization and termination methods.
+
+ /// Takes service type and trader reference in order to
+ /// later locate offers using their ids.
+ TAO_Register_Offer_Iterator (TAO_Offer_Database<MAP_LOCK_TYPE> &db,
+ const TAO_Property_Filter& pfilter);
+
+ /// Destructor.
+ virtual ~TAO_Register_Offer_Iterator (void);
+
+ /// Deposit at maximum n offers into the return sequence and return 1,
+ /// or return 0 if the iterator is done and no offers are returned.
+ virtual CORBA::Boolean next_n (CORBA::ULong n,
+ CosTrading::OfferSeq_out offers
+ ACE_ENV_ARG_DECL_NOT_USED)
+ ACE_THROW_SPEC ((CORBA::SystemException));
+
+ /**
+ * Throws CosTrading::UnknownMaxLeft since with the presence of
+ * "Register" functionality, the iterator cannot guarantee that
+ * the trader will have all the offers it has now when the time
+ * to return them comes.
+ */
+ virtual CORBA::ULong max_left (ACE_ENV_SINGLE_ARG_DECL_NOT_USED)
+ ACE_THROW_SPEC ((CORBA::SystemException,
+ CosTrading::UnknownMaxLeft));
+
+ /// Add an offer the iterator should iterate over.
+ void add_offer (CosTrading::OfferId id,
+ const CosTrading::Offer *);
+
+private:
+
+ /// A reference to the trader is needed for access to the map of offers.
+ TAO_Offer_Database<MAP_LOCK_TYPE> &db_;
+
+ /// Offer ids of offers to iterate over.
+ TAO_String_Queue offer_ids_;
+};
+
+TAO_END_VERSIONED_NAMESPACE_DECL
+
+#if defined (ACE_TEMPLATES_REQUIRE_SOURCE)
+#include "orbsvcs/Trader/Offer_Iterators_T.cpp"
+#endif /* ACE_TEMPLATES_REQUIRE_SOURCE */
+
+#if defined(_MSC_VER)
+#pragma warning(pop)
+#endif /* _MSC_VER */
+
+#include /**/ "ace/post.h"
+#endif /* TAO_REGISTER_OFFER_ITERATOR_H */
diff --git a/TAO/orbsvcs/orbsvcs/Trader/Service_Type_Repository.cpp b/TAO/orbsvcs/orbsvcs/Trader/Service_Type_Repository.cpp
new file mode 100644
index 00000000000..106cc5e3045
--- /dev/null
+++ b/TAO/orbsvcs/orbsvcs/Trader/Service_Type_Repository.cpp
@@ -0,0 +1,695 @@
+// $Id$
+
+#include "orbsvcs/Trader/Service_Type_Repository.h"
+
+#include "ace/Lock_Adapter_T.h"
+
+
+ACE_RCSID (Trader,
+ Service_Type_Repository,
+ "$Id$")
+
+
+TAO_BEGIN_VERSIONED_NAMESPACE_DECL
+
+TAO_Service_Type_Repository::
+TAO_Service_Type_Repository (ACE_Lock* lock)
+ : lock_ (lock)
+{
+ this->incarnation_.low = 0;
+ this->incarnation_.high = 0;
+
+ // If a lock wasn't provided, let's assume the user doesn't want any
+ // kind of lock at all.
+ if (this->lock_ == 0)
+ ACE_NEW (this->lock_,
+ ACE_Lock_Adapter<ACE_Null_Mutex>);
+}
+
+TAO_Service_Type_Repository::~TAO_Service_Type_Repository (void)
+{
+ {
+ // Make sure not to throw exceptions in destructors...
+ ACE_WRITE_GUARD (ACE_Lock, ace_mon, *this->lock_);
+
+ for (Service_Type_Map_Iterator service_map_iterator (this->type_map_);
+ service_map_iterator.done () == 0;
+ service_map_iterator++)
+ {
+ Type_Info *type_info = (*service_map_iterator).int_id_;
+ delete type_info;
+ }
+ }
+
+ delete this->lock_;
+}
+
+CosTradingRepos::ServiceTypeRepository::IncarnationNumber
+TAO_Service_Type_Repository::incarnation (ACE_ENV_SINGLE_ARG_DECL_NOT_USED)
+ ACE_THROW_SPEC ((CORBA::SystemException))
+{
+ CosTradingRepos::ServiceTypeRepository::IncarnationNumber inc_num;
+
+ if (this->lock_->acquire_read () == -1)
+ {
+ inc_num = this->incarnation_;
+ this->lock_->release ();
+ }
+ else
+ {
+ inc_num.high = 0;
+ inc_num.low = 0;
+ }
+
+ return inc_num;
+}
+
+
+CosTradingRepos::ServiceTypeRepository::IncarnationNumber
+TAO_Service_Type_Repository::
+add_type (const char *name,
+ const char *if_name,
+ const CosTradingRepos::ServiceTypeRepository::PropStructSeq &props,
+ const CosTradingRepos::ServiceTypeRepository::ServiceTypeNameSeq &super_types
+ ACE_ENV_ARG_DECL)
+ ACE_THROW_SPEC ((CORBA::SystemException,
+ CosTrading::IllegalServiceType,
+ CosTradingRepos::ServiceTypeRepository::ServiceTypeExists,
+ CosTradingRepos::ServiceTypeRepository::InterfaceTypeMismatch,
+ CosTrading::IllegalPropertyName,
+ CosTrading::DuplicatePropertyName,
+ CosTradingRepos::ServiceTypeRepository::ValueTypeRedefinition,
+ CosTrading::UnknownServiceType,
+ CosTradingRepos::ServiceTypeRepository::DuplicateServiceTypeName))
+{
+ Prop_Map prop_map;
+ Service_Type_Map super_map;
+ CosTradingRepos::ServiceTypeRepository::IncarnationNumber inc_num;
+
+ inc_num.low = 0;
+ inc_num.high = 0;
+
+ // With exceptions enabled, inc_num isn't used.
+ ACE_UNUSED_ARG (inc_num);
+
+ ACE_WRITE_GUARD_THROW_EX (ACE_Lock, ace_mon, *this->lock_, CORBA::INTERNAL ());
+ ACE_CHECK_RETURN (inc_num);
+
+ // Make sure Type name is valid.
+ if (TAO_Trader_Base::is_valid_identifier_name (name) == 0)
+ ACE_THROW_RETURN (CosTrading::IllegalServiceType (name),
+ this->incarnation_);
+
+ // Check if the service type already exists.
+ CORBA::String_var type_name (name);
+ if (this->type_map_.find (type_name) == 0)
+ ACE_THROW_RETURN (CosTradingRepos::ServiceTypeRepository::ServiceTypeExists (),
+ this->incarnation_);
+
+ // Make sure all property names are valid and appear only once.
+ this->validate_properties (prop_map,
+ props
+ ACE_ENV_ARG_PARAMETER);
+ ACE_CHECK_RETURN (this->incarnation_);
+
+ // Check that all super_types exist, and none are duplicated.
+ this->validate_supertypes (super_map,
+ super_types
+ ACE_ENV_ARG_PARAMETER);
+ ACE_CHECK_RETURN (this->incarnation_);
+
+ // NOTE: I don't really know a way to do this without an Interface
+ // Repository, since the Interface Repository IDs don't contain
+ // information about supertypes.
+ //
+ // make sure interface name is legal.
+ // this->validate_interface (if_name, super_types ACE_ENV_ARG_PARAMETER);
+ // ACE_CHECK_RETURN (this->incarnation);
+ //
+ // Instead, we do this:
+ //
+ if (if_name == 0)
+ ACE_THROW_RETURN (CosTradingRepos::ServiceTypeRepository::InterfaceTypeMismatch (),
+ this->incarnation_);
+
+ // Collect and make sure that properties of all supertypes and this
+ // type are compatible. We can use prop_map and super_types_map for
+ // the job.
+ this->validate_inheritance (prop_map,
+ super_types
+ ACE_ENV_ARG_PARAMETER);
+ ACE_CHECK_RETURN (this->incarnation_);
+
+ // We can now use prop_map to construct a sequence of all properties
+ // the this type.
+ this->update_type_map (name,
+ if_name,
+ props,
+ super_types,
+ prop_map,
+ super_map);
+
+ CosTradingRepos::ServiceTypeRepository::IncarnationNumber return_value =
+ this->incarnation_;
+
+ // Increment incarnation number.
+ this->incarnation_.low++;
+
+ // If we wrapped around in lows...
+ if (this->incarnation_.low == 0)
+ this->incarnation_.high++;
+
+ return return_value;
+}
+
+void
+TAO_Service_Type_Repository::remove_type (const char *name
+ ACE_ENV_ARG_DECL)
+ ACE_THROW_SPEC ((CORBA::SystemException,
+ CosTrading::IllegalServiceType,
+ CosTrading::UnknownServiceType,
+ CosTradingRepos::ServiceTypeRepository::HasSubTypes))
+{
+ if (TAO_Trader_Base::is_valid_identifier_name (name) == 0)
+ ACE_THROW (CosTrading::IllegalServiceType (name));
+
+ ACE_WRITE_GUARD_THROW_EX (ACE_Lock, ace_mon, *this->lock_, CORBA::INTERNAL ());
+ ACE_CHECK;
+
+ // Check if the type exists.
+ Service_Type_Map::ENTRY* type_entry = 0; ;
+ if (this->type_map_.find (name,
+ type_entry) == -1)
+ ACE_THROW (CosTrading::UnknownServiceType (name));
+
+ // Check if it has any subtypes.
+ Type_Info *type_info = type_entry->int_id_;
+ if (type_info->has_subtypes_)
+ ACE_THROW (CosTradingRepos::ServiceTypeRepository::HasSubTypes (name, ""));
+
+ // Remove the type from the map.
+ this->type_map_.unbind (type_entry);
+ delete type_info;
+}
+
+CosTradingRepos::ServiceTypeRepository::ServiceTypeNameSeq *
+TAO_Service_Type_Repository::
+list_types (const CosTradingRepos::ServiceTypeRepository::SpecifiedServiceTypes &which_types
+ ACE_ENV_ARG_DECL)
+ ACE_THROW_SPEC ((CORBA::SystemException))
+{
+ ACE_READ_GUARD_THROW_EX (ACE_Lock, ace_mon, *this->lock_, CORBA::INTERNAL ());
+ ACE_CHECK_RETURN (0);
+
+ CORBA::ULong i = 0;
+ CORBA::ULong length = static_cast<CORBA::ULong> (this->type_map_.current_size ());
+ CosTrading::ServiceTypeName *types =
+ CosTradingRepos::ServiceTypeRepository::ServiceTypeNameSeq::allocbuf (length);
+
+ if (types == 0)
+ return 0;
+
+ int all = which_types._d () == CosTradingRepos::ServiceTypeRepository::all;
+
+ CosTradingRepos::ServiceTypeRepository::IncarnationNumber num =
+ which_types.incarnation ();
+
+ for (Service_Type_Map_Iterator itr (this->type_map_);
+ itr.done () == 0;
+ itr++)
+ {
+ Type_Info* type_info = (*itr).int_id_;
+ const char* type_name = (*itr).ext_id_.in ();
+
+ if (all
+ || num < type_info->type_struct_.incarnation)
+ types[i++] = CORBA::string_dup (type_name);
+ }
+
+ CosTradingRepos::ServiceTypeRepository::ServiceTypeNameSeq *tmp = 0;
+
+ ACE_NEW_RETURN (tmp,
+ CosTradingRepos::ServiceTypeRepository::
+ ServiceTypeNameSeq (length,
+ i,
+ types,
+ 1),
+ 0);
+ return tmp;
+}
+
+CosTradingRepos::ServiceTypeRepository::TypeStruct *
+TAO_Service_Type_Repository::
+describe_type (const char * name
+ ACE_ENV_ARG_DECL)
+ ACE_THROW_SPEC ((CORBA::SystemException,
+ CosTrading::IllegalServiceType,
+ CosTrading::UnknownServiceType))
+{
+ if (TAO_Trader_Base::is_valid_identifier_name (name) == 0)
+ ACE_THROW_RETURN
+ (CosTrading::IllegalServiceType (name),
+ (CosTradingRepos::ServiceTypeRepository::TypeStruct *) 0);
+
+ ACE_READ_GUARD_THROW_EX
+ (ACE_Lock,
+ ace_mon,
+ *this->lock_,
+ CORBA::INTERNAL ());
+ ACE_CHECK_RETURN (0);
+
+ // Make sure the type exists.
+ CORBA::String_var type_name (name);
+ Service_Type_Map::ENTRY *type_entry = 0;
+ if (this->type_map_.find (type_name,
+ type_entry) == -1)
+ ACE_THROW_RETURN (CosTrading::UnknownServiceType (name),
+ (CosTradingRepos::ServiceTypeRepository::TypeStruct *) 0);
+
+ // Return appropriate information about the type.
+ CosTradingRepos::ServiceTypeRepository::TypeStruct *descr = 0;
+ ACE_NEW_RETURN (descr,
+ CosTradingRepos::ServiceTypeRepository::TypeStruct,
+ 0);
+ CosTradingRepos::ServiceTypeRepository::TypeStruct &s =
+ type_entry->int_id_->type_struct_;
+
+ descr->if_name = s.if_name;
+ descr->masked = s.masked;
+ descr->incarnation = s.incarnation;
+ descr->super_types = s.super_types;
+ descr->props = s.props;
+ /*
+ CORBA::ULong length = s.props.length ();
+ CosTradingRepos::ServiceTypeRepository::PropStruct* pstructs =
+ s.props.get_buffer (0);
+ descr->props.replace (length, length, pstructs, 0);
+ */
+ return descr;
+}
+
+CosTradingRepos::ServiceTypeRepository::TypeStruct *
+TAO_Service_Type_Repository::
+fully_describe_type (const char *name
+ ACE_ENV_ARG_DECL)
+ ACE_THROW_SPEC ((CORBA::SystemException,
+ CosTrading::IllegalServiceType,
+ CosTrading::UnknownServiceType))
+{
+ if (TAO_Trader_Base::is_valid_identifier_name (name) == 0)
+ ACE_THROW_RETURN (CosTrading::IllegalServiceType (name),
+ 0);
+
+ ACE_READ_GUARD_THROW_EX (ACE_Lock, ace_mon, *this->lock_, CORBA::INTERNAL ());
+ ACE_CHECK_RETURN (0);
+
+ // Make sure the type exists.
+ CORBA::String_var type_name (name);
+ Service_Type_Map::ENTRY *type_entry = 0;
+ if (this->type_map_.find (type_name,
+ type_entry) == -1)
+ ACE_THROW_RETURN (CosTrading::UnknownServiceType (name),
+ 0);
+
+ // Return appropriate information about the type.
+ CosTradingRepos::ServiceTypeRepository::TypeStruct *descr = 0;
+ ACE_NEW_RETURN (descr,
+ CosTradingRepos::ServiceTypeRepository::TypeStruct,
+ 0);
+ CosTradingRepos::ServiceTypeRepository::TypeStruct &s =
+ type_entry->int_id_->type_struct_;
+
+ // Aggregate the Properties of this type and all its supertypes.
+ // Compute the transitive closure of all supertypes.
+ this->fully_describe_type_i (s,
+ descr->props,
+ descr->super_types);
+
+ // We do the explicit copy, since otherwise we'd have excessive
+ // properties copying.
+ descr->if_name = s.if_name;
+ descr->masked = s.masked;
+ descr->incarnation = s.incarnation;
+
+ return descr;
+}
+
+void
+TAO_Service_Type_Repository::
+mask_type (const char *name
+ ACE_ENV_ARG_DECL)
+ ACE_THROW_SPEC ((CORBA::SystemException,
+ CosTrading::IllegalServiceType,
+ CosTrading::UnknownServiceType,
+ CosTradingRepos::ServiceTypeRepository::AlreadyMasked))
+{
+ if (TAO_Trader_Base::is_valid_identifier_name (name) == 0)
+ ACE_THROW (CosTrading::IllegalServiceType (name));
+
+ ACE_WRITE_GUARD_THROW_EX (ACE_Lock, ace_mon, *this->lock_, CORBA::INTERNAL ());
+
+ // Make sure the type exists.
+ CORBA::String_var type_name (name);
+ Service_Type_Map::ENTRY *type_entry = 0;
+ if (this->type_map_.find (type_name,
+ type_entry) != -1)
+ ACE_THROW (CosTrading::UnknownServiceType (name));
+
+ // Make sure the type is unmasked.
+ CORBA::Boolean &mask =
+ type_entry->int_id_->type_struct_.masked;
+
+ if (mask == 1)
+ ACE_THROW (CosTradingRepos::ServiceTypeRepository::AlreadyMasked (name));
+ else
+ mask = 1;
+}
+
+void
+TAO_Service_Type_Repository::
+unmask_type (const char *name
+ ACE_ENV_ARG_DECL)
+ ACE_THROW_SPEC ((CORBA::SystemException,
+ CosTrading::IllegalServiceType,
+ CosTrading::UnknownServiceType,
+ CosTradingRepos::ServiceTypeRepository::NotMasked))
+{
+ if (TAO_Trader_Base::is_valid_identifier_name (name) == 0)
+ ACE_THROW (CosTrading::IllegalServiceType (name));
+
+ ACE_WRITE_GUARD_THROW_EX (ACE_Lock, ace_mon, *this->lock_, CORBA::INTERNAL ());
+
+ // Make sure the type exists.
+ CORBA::String_var type_name (name);
+ Service_Type_Map::ENTRY *type_entry = 0;
+ if (this->type_map_.find (type_name,
+ type_entry) != -1)
+ ACE_THROW (CosTrading::UnknownServiceType (name));
+
+ // Make sure the type is masked.
+ CORBA::Boolean &mask = type_entry->int_id_->type_struct_.masked;
+
+ if (mask == 0)
+ ACE_THROW (CosTradingRepos::ServiceTypeRepository::NotMasked (name));
+ else
+ mask = 0;
+}
+
+void
+TAO_Service_Type_Repository::
+fully_describe_type_i (const CosTradingRepos::ServiceTypeRepository::TypeStruct &type_struct,
+ CosTradingRepos::ServiceTypeRepository::PropStructSeq &props,
+ CosTradingRepos::ServiceTypeRepository::ServiceTypeNameSeq &super_types)
+{
+ TAO_String_Queue service_type_queue;
+ this->collect_inheritance_hierarchy (type_struct,
+ service_type_queue);
+
+ // Count the total number of properties.
+ CORBA::ULong num_props = 0;
+ CORBA::ULong num_types = static_cast<CORBA::ULong> (service_type_queue.size ());
+
+ TAO_String_Queue::ITERATOR iterator (service_type_queue);
+
+ for (;
+ iterator.done () == 0;
+ iterator.advance ())
+ {
+ char **next_type_name = 0;
+ Service_Type_Map::ENTRY *type_entry = 0;
+
+ iterator.next (next_type_name);
+ CORBA::String_var hash_key (const_cast<const char *> (*next_type_name));
+ this->type_map_.find (hash_key,
+ type_entry);
+
+ CosTradingRepos::ServiceTypeRepository::TypeStruct &tstruct =
+ type_entry->int_id_->type_struct_;
+ num_props += tstruct.props.length ();
+ }
+
+ num_props += type_struct.props.length ();
+ props.length (num_props);
+ super_types.length (num_types);
+
+ // Copy in all properties.
+ int i = 0;
+ CORBA::ULong prop_index = 0;
+ CORBA::ULong type_index = 0;
+
+ for (i = type_struct.props.length () - 1;
+ i >= 0;
+ i--)
+ props[prop_index++] = type_struct.props[i];
+
+ for (iterator.first ();
+ iterator.done () == 0;
+ iterator.advance ())
+ {
+ char **next_type_name = 0;
+ Service_Type_Map::ENTRY *type_entry = 0;
+
+ iterator.next (next_type_name);
+ CORBA::String_var hash_key (const_cast<const char *> (*next_type_name));
+ this->type_map_.find (hash_key,
+ type_entry);
+
+ // Should never be zero.
+ if (type_entry != 0)
+ {
+ CosTradingRepos::ServiceTypeRepository::TypeStruct& tstruct =
+ type_entry->int_id_->type_struct_;
+
+ for (i = tstruct.props.length () - 1;
+ i >= 0;
+ i--)
+ props[prop_index++] = tstruct.props[i];
+
+ super_types[type_index++] = hash_key.in ();
+ }
+ }
+}
+
+void
+TAO_Service_Type_Repository::
+collect_inheritance_hierarchy (const CosTradingRepos::ServiceTypeRepository::TypeStruct &type_struct,
+ TAO_String_Queue &target)
+{
+ // Recurse for each super_type
+ for (int i = type_struct.super_types.length () - 1;
+ i >= 0;
+ i--)
+ {
+ Service_Type_Map::ENTRY *next_type_entry = 0;
+ CORBA::String_var next_type_name (type_struct.super_types[i]);
+
+ if (this->type_map_.find (next_type_name, next_type_entry) != -1)
+ {
+ CosTradingRepos::ServiceTypeRepository::TypeStruct &next_type_struct =
+ next_type_entry->int_id_->type_struct_;
+
+ const char *type_name =
+ type_struct.super_types[i];
+ target.enqueue_tail (const_cast<char *> (type_name));
+
+ this->collect_inheritance_hierarchy (next_type_struct,
+ target);
+ }
+ }
+}
+
+void
+TAO_Service_Type_Repository::
+validate_properties (Prop_Map &prop_map,
+ const CosTradingRepos::ServiceTypeRepository::PropStructSeq &props
+ ACE_ENV_ARG_DECL)
+ ACE_THROW_SPEC ((CosTrading::IllegalPropertyName,
+ CosTrading::DuplicatePropertyName))
+{
+ for (CORBA::ULong i = 0;
+ i < props.length ();
+ i++)
+ {
+ const char *n = props[i].name;
+ if (TAO_Trader_Base::is_valid_property_name (n) == 0)
+ ACE_THROW (CosTrading::IllegalPropertyName (n));
+ else
+ {
+ CORBA::String_var prop_name (n);
+ CosTradingRepos::ServiceTypeRepository::PropStruct *prop_val =
+ const_cast<CosTradingRepos::ServiceTypeRepository::PropStruct *> (&props[i]);
+
+ if (prop_map.bind (prop_name,
+ prop_val) == 1)
+ ACE_THROW (CosTrading::DuplicatePropertyName (n));
+ }
+ }
+}
+
+void
+TAO_Service_Type_Repository::
+validate_supertypes (Service_Type_Map &super_map,
+ const CosTradingRepos::ServiceTypeRepository::ServiceTypeNameSeq &super_types
+ ACE_ENV_ARG_DECL)
+ ACE_THROW_SPEC ((CosTrading::IllegalServiceType,
+ CosTrading::UnknownServiceType,
+ CosTradingRepos::ServiceTypeRepository::DuplicateServiceTypeName))
+{
+ for (CORBA::ULong i = 0;
+ i < super_types.length ();
+ i++)
+ {
+ const char *type =
+ super_types[i];
+
+ if (TAO_Trader_Base::is_valid_identifier_name (type) == 0)
+ ACE_THROW (CosTrading::IllegalServiceType (type));
+ else
+ {
+ CORBA::String_var hash_type (type);
+ Service_Type_Map::ENTRY *type_entry = 0;
+
+ if (this->type_map_.find (hash_type,
+ type_entry) == -1)
+ ACE_THROW (CosTrading::UnknownServiceType (type));
+ else
+ {
+ if (super_map.bind (hash_type,
+ type_entry->int_id_) == 1)
+ ACE_THROW (CosTradingRepos::ServiceTypeRepository::DuplicateServiceTypeName (type));
+ }
+ }
+ }
+}
+
+void
+TAO_Service_Type_Repository::
+validate_inheritance (Prop_Map &prop_map,
+ const CosTradingRepos::ServiceTypeRepository::ServiceTypeNameSeq &super_types
+ ACE_ENV_ARG_DECL)
+ ACE_THROW_SPEC ((CosTradingRepos::ServiceTypeRepository::ValueTypeRedefinition))
+{
+ CORBA::ULong num_super_types = super_types.length ();
+
+ for (CORBA::ULong i = 0;
+ i < num_super_types;
+ i++)
+ {
+ Service_Type_Map::ENTRY *super_type_entry = 0;
+ CORBA::String_var super_type (super_types[i]);
+ CosTradingRepos::ServiceTypeRepository::ServiceTypeNameSeq place_holder;
+ CosTradingRepos::ServiceTypeRepository::PropStructSeq super_props;
+
+ this->type_map_.find (super_type, super_type_entry);
+
+ // Super_type_entry should never be zero.
+ if (super_type_entry != 0)
+ this->fully_describe_type_i (super_type_entry->int_id_->type_struct_,
+ super_props,
+ place_holder);
+ else
+ continue;
+
+ CORBA::ULong num_props = super_props.length ();
+
+ for (CORBA::ULong j = 0;
+ j < num_props;
+ j++)
+ {
+ Prop_Map::ENTRY *existing_prop = 0;
+ CORBA::String_var prop_name (super_props[j].name);
+
+ if (prop_map.bind (prop_name,
+ &super_props[j],
+ existing_prop) == 1)
+ {
+ // If already there, check that it is compatible with
+ // properties of other types. Value Types have to be the
+ // same.
+ const CosTradingRepos::ServiceTypeRepository::PropStruct &property_in_map =
+ *existing_prop->int_id_;
+
+ CORBA::TypeCode_ptr prop_type = property_in_map.value_type.in ();
+ int compare = 0;
+ ACE_TRY
+ {
+ compare =
+ super_props[j].value_type->equal (prop_type
+ ACE_ENV_ARG_PARAMETER);
+ ACE_TRY_CHECK;
+ }
+ ACE_CATCHANY
+ {
+ ACE_TRY_THROW (CosTradingRepos::ServiceTypeRepository::ValueTypeRedefinition
+ (super_props[j].name,
+ super_props[j],
+ property_in_map.name,
+ property_in_map));
+ }
+ ACE_ENDTRY;
+ ACE_CHECK;
+
+ if (compare == 0
+ || super_props[j].mode > property_in_map.mode)
+ ACE_THROW (CosTradingRepos::ServiceTypeRepository::ValueTypeRedefinition
+ (super_props[j].name,
+ super_props[j],
+ property_in_map.name,
+ property_in_map));
+ }
+ }
+ }
+}
+
+void
+TAO_Service_Type_Repository::
+update_type_map (const char *name,
+ const char *if_name,
+ const CosTradingRepos::ServiceTypeRepository::PropStructSeq &props,
+ const CosTradingRepos::ServiceTypeRepository::ServiceTypeNameSeq &super_types,
+ Prop_Map &,
+ Service_Type_Map &super_map)
+{
+ // Update entries for all supertypes to include this type as a
+ // subtype. we can use the super_types_map we have constructed.
+
+ for (Service_Type_Map_Iterator super_map_iterator (super_map);
+ super_map_iterator.done () == 0;
+ super_map_iterator++)
+ {
+ Type_Info *super_type_info =
+ (*super_map_iterator).int_id_;
+ super_type_info->has_subtypes_ = 0;
+ }
+
+ // All parameters are valid, create an entry for this service type
+ // in the this->type_map_.
+ Type_Info *type = 0;
+ ACE_NEW (type,
+ Type_Info);
+
+ type->type_struct_.props = props;
+ type->type_struct_.if_name = if_name;
+ type->type_struct_.super_types = super_types;
+ type->type_struct_.incarnation = this->incarnation_;
+ type->type_struct_.masked = 0;
+ type->has_subtypes_ = 0;
+
+ // Move the prop struct sequences and super type names from the in
+ // params to the internal storage.
+ /*
+ CORBA::ULong pslength = props.length ();
+ CosTradingRepos::ServiceTypeRepository::PropStructSeq* pstructs =
+ const_cast<CosTradingRepos::ServiceTypeRepository::PropStructSeq*> (&props);
+ CosTradingRepos::ServiceTypeRepository::PropStruct* psbuf =
+ pstructs->get_buffer (1);
+ type->type_struct_.props.replace (pslength,
+ pslength,
+ psbuf,
+ 1);
+ */
+ CORBA::String_var type_name (name);
+ this->type_map_.bind (type_name, type);
+}
+
+TAO_END_VERSIONED_NAMESPACE_DECL
diff --git a/TAO/orbsvcs/orbsvcs/Trader/Service_Type_Repository.h b/TAO/orbsvcs/orbsvcs/Trader/Service_Type_Repository.h
new file mode 100644
index 00000000000..4f5b959b216
--- /dev/null
+++ b/TAO/orbsvcs/orbsvcs/Trader/Service_Type_Repository.h
@@ -0,0 +1,327 @@
+// -*- C++ -*-
+
+//=============================================================================
+/**
+ * @file Service_Type_Repository.h
+ *
+ * $Id$
+ *
+ * @author Marina Spivak <marina@cs.wustl.edu>
+ * @author Seth Widoff <sbw1@cs.wustl.edu>
+ */
+//=============================================================================
+
+
+#ifndef TAO_SERVICE_TYPE_REPOSITORY_H
+#define TAO_SERVICE_TYPE_REPOSITORY_H
+#include /**/ "ace/pre.h"
+
+#include "orbsvcs/Trader/Trader.h"
+#include "ace/Hash_Map_Manager.h"
+#include "ace/Null_Mutex.h"
+
+TAO_BEGIN_VERSIONED_NAMESPACE_DECL
+
+/**
+ * @class TAO_Service_Type_Repository
+ *
+ * @brief This class implements CosTradingRepos::ServiceTypeRepository
+ * IDL interface.
+ */
+class TAO_Trading_Serv_Export TAO_Service_Type_Repository
+ : public POA_CosTradingRepos::ServiceTypeRepository
+{
+public:
+ /**
+ * Parameterize the Service_Type_Repository with a lock to serialize
+ * access to the type repository map. A reader/writer lock is
+ * probably best. The Service_Type_Repository assumes control of the
+ * lock.
+ */
+ TAO_Service_Type_Repository (ACE_Lock *lock = 0);
+
+ ~TAO_Service_Type_Repository (void);
+
+ virtual CosTradingRepos::ServiceTypeRepository::IncarnationNumber
+ incarnation (ACE_ENV_SINGLE_ARG_DECL_NOT_USED)
+ ACE_THROW_SPEC ((CORBA::SystemException));
+
+ /**
+ * BEGIN SPEC
+ * The add_type operation enables the creation of new service types
+ * in the service type repository. The caller supplies the "name"
+ * for the new type, the identifier for the interface associated
+ * with instances of this service type, the properties definitions
+ * for this service type, and the service type names of the
+ * immediate super-types to this service type.
+ */
+ virtual CosTradingRepos::ServiceTypeRepository::IncarnationNumber
+ add_type (const char *name,
+ const char *if_name,
+ const CosTradingRepos::ServiceTypeRepository::PropStructSeq &props,
+ const CosTradingRepos::ServiceTypeRepository::ServiceTypeNameSeq &super_types
+ ACE_ENV_ARG_DECL_NOT_USED)
+ ACE_THROW_SPEC ((CORBA::SystemException,
+ CosTrading::IllegalServiceType,
+ CosTradingRepos::ServiceTypeRepository::ServiceTypeExists,
+ CosTradingRepos::ServiceTypeRepository::InterfaceTypeMismatch,
+ CosTrading::IllegalPropertyName,
+ CosTrading::DuplicatePropertyName,
+ CosTradingRepos::ServiceTypeRepository::ValueTypeRedefinition,
+ CosTrading::UnknownServiceType,
+ CosTradingRepos::ServiceTypeRepository::DuplicateServiceTypeName));
+
+ // If the type creation is successful, an incarnation number is
+ // returned as the value of the operation. Incarnation numbers are
+ // opaque values that are assigned to each modification to the
+ // repository's state. An incarnation number can be quoted when
+ // invoking the list_types operation to retrieve all changes to the
+ // service repository since a particular logical time. (Note:
+ // IncarnationNumber is currently declared as a struct consisting of
+ // two unsigned longs; what we really want here is an unsigned hyper
+ // [64-bit integer]. A future revision task force should modify this
+ // when CORBA systems support IDL 64-bit integers.)
+
+ // If the "name" parameter is malformed, then the
+ // CosTrading::IllegalServiceType exception is raised. If the type
+ // already exists, then the ServiceTypeExists exception is raised. °
+ // If the "if_name" parameter is not a sub-type of the interface
+ // associated with a service type from which this service type is
+ // derived, such that substitutability would be violated, then the
+ // InterfaceTypeMismatch exception is raised. If a property name
+ // supplied in the "props" parameter is malformed, the
+ // CosTrading::IllegalPropertyName exception is raised. If the
+ // same property name appears two or more times in the "props"
+ // parameter, the CosTrading::DuplicatePropertyName exception is
+ // raised. If a property value type associated with this service
+ // type illegally modifies the value type of a super-type's
+ // property, or if two super-types incompatibly declare value types
+ // for the same property name, then the ValueTypeRedefinition
+ // exception is raised. If one of the ServiceTypeNames in
+ // "super_types" is malformed, then the
+ // CosTrading::IllegalServiceType exception is raised. If one of the
+ // ServiceTypeNames in "super_types" does not exist, then the
+ // CosTrading::UnknownServiceType exception is raised. If the same
+ // service type name is included two or more times in this
+ // parameter, the DuplicateServiceTypeName exception is raised.
+ // END SPEC
+
+ /**
+ * BEGIN SPEC
+ * The remove_type operation removes the named type from the service
+ * type repository. If "name" is malformed, then the
+ * CosTrading::IllegalServiceType exception is raised. If
+ * "name" does not exist within the repository, then the
+ * CosTrading::UnknownServiceType exception is raised. If
+ * "name" has a service type which has been derived from it, then
+ * the HasSubTypes exception is raised. END SPEC
+ */
+ virtual void remove_type (const char *name
+ ACE_ENV_ARG_DECL_NOT_USED)
+ ACE_THROW_SPEC ((CORBA::SystemException,
+ CosTrading::IllegalServiceType,
+ CosTrading::UnknownServiceType,
+ CosTradingRepos::ServiceTypeRepository::HasSubTypes));
+
+ virtual CosTradingRepos::ServiceTypeRepository::ServiceTypeNameSeq *
+ list_types (const CosTradingRepos::ServiceTypeRepository::SpecifiedServiceTypes &which_types
+ ACE_ENV_ARG_DECL_NOT_USED)
+ ACE_THROW_SPEC ((CORBA::SystemException));
+
+ // BEGIN SPEC
+ // The list_types operation permits a client to obtain the names of
+ // service types which are in the repository. The "which_types"
+ // parameter permits the client to specify one of two possible
+ // values: all types known to the repository all types
+ // added/modified since a particular incarnation number The names of
+ // the requested types are returned by the operation for subsequent
+ // querying via the describe_type or the fully_describe_type
+ // operation.
+ // END SPEC
+
+ /**
+ * BEGIN SPEC
+ * The describe_type operation permits a client to obtain the
+ * details for a particular service type. If "name" is malformed,
+ * then the CosTrading::IllegalServiceType exception is raised. If
+ * "name" does not exist within the repository, then the
+ * CosTrading::UnknownServiceType exception is raised.
+ * END SPEC
+ */
+ virtual CosTradingRepos::ServiceTypeRepository::TypeStruct *
+ describe_type (const char *name
+ ACE_ENV_ARG_DECL_NOT_USED)
+ ACE_THROW_SPEC ((CORBA::SystemException,
+ CosTrading::IllegalServiceType,
+ CosTrading::UnknownServiceType));
+
+ /**
+ * BEGIN SPEC
+ * The fully_describe_type operation permits a client to obtain the
+ * details for a particular service type. The property sequence
+ * returned in the TypeStruct includes all properties inherited from
+ * the transitive closure of its super types; the sequence of super
+ * types in the TypeStruct contains the names of the types in the
+ * transitive closure of the super type relation. If "name" is
+ * malformed, then the CosTrading::IllegalServiceType exception is
+ * raised. If "name" does not exist within the repository, then
+ * the CosTrading::UnknownServiceType exception is raised.
+ * END SPEC
+ */
+ virtual CosTradingRepos::ServiceTypeRepository::TypeStruct *
+ fully_describe_type (const char *name
+ ACE_ENV_ARG_DECL_NOT_USED)
+ ACE_THROW_SPEC ((CORBA::SystemException,
+ CosTrading::IllegalServiceType,
+ CosTrading::UnknownServiceType));
+
+ /**
+ * BEGIN SPEC
+ * The mask_type operation permits the deprecation of a particular
+ * type (i.e., after being masked, exporters will no longer be able
+ * to advertise offers of that particular type). The type continues
+ * to exist in the service repository due to other service types
+ * being derived from it. If "name" is malformed, then the
+ * CosTrading::IllegalServiceType exception is raised. If "name"
+ * does not exist within the repository, then the
+ * CosTrading::UnknownServiceType exception is raised. If the type
+ * is currently in the masked state, then the AlreadyMasked
+ * exception is raised.
+ * END SPEC
+ */
+ virtual void mask_type (const char *name
+ ACE_ENV_ARG_DECL_NOT_USED)
+ ACE_THROW_SPEC ((CORBA::SystemException,
+ CosTrading::IllegalServiceType,
+ CosTrading::UnknownServiceType,
+ CosTradingRepos::ServiceTypeRepository::AlreadyMasked));
+
+ /**
+ * BEGIN SPEC
+ * The unmask_type undeprecates a type (i.e., after being unmasked,
+ * exporters will be able to resume advertisement of offers of that
+ * particular type). If "name" is malformed, then the
+ * CosTrading::IllegalServiceType exception is raised. If "name"
+ * does not exist within the repository, then the
+ * CosTrading::UnknownServiceType exception is raised. If the type
+ * is not currently in the masked state, then the NotMasked
+ * exception is raised.
+ * END SPEC
+ */
+ virtual void unmask_type (const char *name
+ ACE_ENV_ARG_DECL_NOT_USED)
+ ACE_THROW_SPEC ((CORBA::SystemException,
+ CosTrading::IllegalServiceType,
+ CosTrading::UnknownServiceType,
+ CosTradingRepos::ServiceTypeRepository::NotMasked));
+
+private:
+
+ /**
+ * @class Type_Info
+ *
+ * @brief Storage structure for information pertinent to the type.
+ */
+ class Type_Info
+ {
+ public:
+ /// Standard type info.
+ CosTradingRepos::ServiceTypeRepository::TypeStruct type_struct_;
+
+ /// Names of subtypes.
+ CORBA::Boolean has_subtypes_;
+ };
+
+ typedef ACE_Hash_Map_Manager_Ex <CORBA::String_var,
+ CosTradingRepos::ServiceTypeRepository::PropStruct *,
+ ACE_Hash<CORBA::String_var>,
+ ACE_Equal_To<CORBA::String_var>,
+ ACE_Null_Mutex>
+ Prop_Map;
+
+ typedef ACE_Hash_Map_Manager_Ex <CORBA::String_var,
+ Type_Info *,
+ ACE_Hash<CORBA::String_var>,
+ ACE_Equal_To<CORBA::String_var>,
+ ACE_Null_Mutex>
+ Service_Type_Map;
+
+ typedef ACE_Hash_Map_Iterator_Ex<CORBA::String_var,
+ Type_Info *,
+ ACE_Hash<CORBA::String_var>,
+ ACE_Equal_To<CORBA::String_var>,
+ ACE_Null_Mutex>
+ Service_Type_Map_Iterator;
+
+ /**
+ * Build a sequence aggregating the property names from all
+ * supertypes of the type, and a sequence representing the
+ * transitive closure of the super type relation.
+ */
+ void fully_describe_type_i (const CosTradingRepos::ServiceTypeRepository::TypeStruct &type_struct,
+ CosTradingRepos::ServiceTypeRepository::PropStructSeq &props,
+ CosTradingRepos::ServiceTypeRepository::ServiceTypeNameSeq &super_types);
+
+ void collect_inheritance_hierarchy (const CosTradingRepos::ServiceTypeRepository::TypeStruct &type_struct,
+ TAO_String_Queue &target);
+
+ /// Confirm that the properties in props have valid names, and aren't
+ /// duplicated. Cram those properties into the prop_map.
+ void validate_properties (Prop_Map &prop_map,
+ const CosTradingRepos::ServiceTypeRepository::PropStructSeq &props
+ ACE_ENV_ARG_DECL_NOT_USED)
+ ACE_THROW_SPEC ((CosTrading::IllegalPropertyName,
+ CosTrading::DuplicatePropertyName));
+
+ /// Confirm that the each super type exists, and cram them into super_map.
+ void validate_supertypes (Service_Type_Map &super_map,
+ const CosTradingRepos::ServiceTypeRepository::ServiceTypeNameSeq &super_types
+ ACE_ENV_ARG_DECL_NOT_USED)
+ ACE_THROW_SPEC ((CosTrading::IllegalServiceType,
+ CosTrading::UnknownServiceType,
+ CosTradingRepos::ServiceTypeRepository::DuplicateServiceTypeName));
+
+ /// Ensure that properties of a super_type aren't having their types
+ /// or retstrictions redefined.
+ void validate_inheritance (Prop_Map &prop_map,
+ const CosTradingRepos::ServiceTypeRepository::ServiceTypeNameSeq &super_types
+ ACE_ENV_ARG_DECL_NOT_USED)
+ ACE_THROW_SPEC ((CosTradingRepos::ServiceTypeRepository::ValueTypeRedefinition));
+
+ // void validate_interface (const char *if_name,
+ // Service_Type_Map &super_map,
+ // ACE_ENV_SINGLE_ARG_DECL)
+ // ACE_THROW_SPEC ((CosTradingRepos::ServiceTypeRepository::InterfaceTypeMismatch));
+ // Ensure that the interface type derives from its superclasses'.
+
+ /// Update the type map with the information contained in the
+ /// TypeStruct, prop_map, and super_map.
+ void update_type_map (const char *name,
+ const char *if_name,
+ const CosTradingRepos::ServiceTypeRepository::PropStructSeq &props,
+ const CosTradingRepos::ServiceTypeRepository::ServiceTypeNameSeq &super_types,
+ Prop_Map &prop_map,
+ Service_Type_Map &super_map);
+
+ TAO_Service_Type_Repository (const TAO_Service_Type_Repository &);
+ TAO_Service_Type_Repository &operator= (const TAO_Service_Type_Repository &);
+
+ /// Lock with which to serialize access to the service type map.
+ ACE_Lock *lock_;
+
+ /**
+ * Stores information for each service type in the repository. This
+ * is a mapping from service type name to a Type_Info struct which
+ * serves as a storage for various information for the given type.
+ */
+ Service_Type_Map type_map_;
+
+ /// Incarnation number to be used for the next modification to the
+ /// repository.
+ CosTradingRepos::ServiceTypeRepository::IncarnationNumber incarnation_;
+};
+
+TAO_END_VERSIONED_NAMESPACE_DECL
+
+#include /**/ "ace/post.h"
+#endif /* TAO_SERVICE_TYPE_REPOSITORY_H */
diff --git a/TAO/orbsvcs/orbsvcs/Trader/Trader.cpp b/TAO/orbsvcs/orbsvcs/Trader/Trader.cpp
new file mode 100644
index 00000000000..14d035ee0e5
--- /dev/null
+++ b/TAO/orbsvcs/orbsvcs/Trader/Trader.cpp
@@ -0,0 +1,866 @@
+// $Id$
+
+#include "orbsvcs/Trader/Trader.h"
+#include "orbsvcs/Trader/Offer_Iterators_T.h"
+#include "ace/Thread_Mutex.h"
+#include "ace/RW_Thread_Mutex.h"
+#include "ace/OS_NS_strings.h"
+#include "ace/OS_NS_string.h"
+#include "ace/OS_NS_ctype.h"
+
+// The following #include is needed only for the instantiation pragmas.
+#include "orbsvcs/Trader/Trader_Interfaces.h"
+
+ACE_RCSID (Trader,
+ Trader,
+ "$Id$")
+
+TAO_BEGIN_VERSIONED_NAMESPACE_DECL
+
+TAO_Trader_Base::TAO_Trader_Base (void)
+ : trading_components_ (*this),
+ import_attributes_ (*this),
+ support_attributes_ (*this),
+ link_attributes_ (*this)
+{
+}
+
+TAO_Trader_Base::~TAO_Trader_Base (void)
+{
+}
+
+TAO_Import_Attributes_i &
+TAO_Trader_Base::import_attributes (void)
+{
+ return this->import_attributes_;
+}
+
+const TAO_Import_Attributes_i &
+TAO_Trader_Base::import_attributes (void) const
+{
+ return this->import_attributes_;
+}
+
+TAO_Support_Attributes_i &
+TAO_Trader_Base::support_attributes (void)
+{
+ return this->support_attributes_;
+}
+
+const TAO_Support_Attributes_i &
+TAO_Trader_Base::support_attributes (void) const
+{
+ return this->support_attributes_;
+}
+
+TAO_Link_Attributes_i &
+TAO_Trader_Base::link_attributes (void)
+{
+ return this->link_attributes_;
+}
+
+const TAO_Link_Attributes_i &
+TAO_Trader_Base::link_attributes (void) const
+{
+ return this->link_attributes_;
+}
+
+TAO_Trading_Components_i &
+TAO_Trader_Base::trading_components (void)
+{
+ return this->trading_components_;
+}
+
+const TAO_Trading_Components_i &
+TAO_Trader_Base::trading_components (void) const
+{
+ return this->trading_components_;
+}
+
+CORBA::Boolean
+TAO_Trader_Base::is_valid_property_name (const char* ident)
+{
+ bool return_value = false;
+
+ if (ident == 0)
+ return return_value;
+
+ size_t length = ACE_OS::strlen (ident);
+ if (length >= 1 && ACE_OS::ace_isalpha (ident[0]))
+ {
+ return_value = true;
+ for (size_t i = 0; i < length; i++)
+ {
+ if (! (ACE_OS::ace_isalnum (ident[i]) || ident[i] == '_'))
+ {
+ return_value = false;
+ break;
+ }
+ }
+ }
+
+ return return_value;
+}
+
+CORBA::Boolean
+TAO_Trader_Base::is_valid_identifier_name (const char* ident)
+{
+ static char const * const double_colon = "::";
+
+ if (ident == 0)
+ return 0;
+
+ int return_value = 1;
+
+ // Allow scoped identifiers
+ CORBA::Boolean done = 0;
+ char const * pos =
+ ACE_OS::strstr (ident,
+ double_colon);
+
+ do
+ {
+ if ('_' == ident[0])
+ {
+ // Treat escaped identifiers the same way as IDL
+ ++ident;
+ }
+
+ size_t length =
+ pos ? pos - ident : ACE_OS::strlen (ident);
+
+ if (length >= 1 && ACE_OS::ace_isalpha (ident[0]))
+ {
+ // First character must be alpha
+ for (size_t i = 0; i < length; ++i)
+ {
+ if (! (ACE_OS::ace_isalnum (ident[i])
+ || ident[i] == '_'))
+ {
+ // Subsequent characters is not alpha, numeric, or '_'
+ return_value = 0;
+ break;
+ }
+ }
+ }
+ else
+ return_value = 0;
+
+ if (pos)
+ {
+ // More identifiers
+ ident = pos + 2;
+ pos = ACE_OS::strstr (ident, double_colon);
+ }
+ else
+ {
+ // Last or only identifier
+ done = 1;
+ }
+ }
+ while (!done);
+
+ return return_value;
+}
+
+TAO_Lockable::~TAO_Lockable (void)
+{
+}
+
+TAO_Support_Attributes_i::
+TAO_Support_Attributes_i (TAO_Lockable &locker)
+ : locker_ (locker),
+ supports_modifiable_properties_ (1),
+ supports_dynamic_properties_ (1),
+ supports_proxy_offers_ (0),
+ type_repos_ (CosTrading::TypeRepository::_nil ()),
+ service_type_repos_ (CosTradingRepos::ServiceTypeRepository::_nil ())
+{
+}
+
+TAO_Support_Attributes_i::~TAO_Support_Attributes_i (void)
+{
+}
+
+CORBA::Boolean
+TAO_Support_Attributes_i::supports_modifiable_properties (void) const
+{
+ ACE_READ_GUARD_RETURN (ACE_Lock, ace_mon, this->locker_.lock (),
+ 0);
+ return this->supports_modifiable_properties_;
+}
+
+void
+TAO_Support_Attributes_i::
+supports_modifiable_properties (CORBA::Boolean new_value)
+{
+ ACE_WRITE_GUARD (ACE_Lock, ace_mon, this->locker_.lock ());
+ this->supports_modifiable_properties_ = new_value;
+}
+
+CORBA::Boolean
+TAO_Support_Attributes_i::supports_dynamic_properties (void) const
+{
+ ACE_READ_GUARD_RETURN (ACE_Lock, ace_mon, this->locker_.lock (),
+ 0);
+
+ return this->supports_dynamic_properties_;
+}
+
+void
+TAO_Support_Attributes_i::
+supports_dynamic_properties (CORBA::Boolean new_value)
+{
+ ACE_WRITE_GUARD (ACE_Lock, ace_mon, this->locker_.lock ());
+ this->supports_dynamic_properties_ = new_value;
+}
+
+CORBA::Boolean
+TAO_Support_Attributes_i::supports_proxy_offers (void) const
+{
+ ACE_READ_GUARD_RETURN (ACE_Lock, ace_mon, this->locker_.lock (),
+ 0);
+
+ return this->supports_proxy_offers_;
+}
+
+void
+TAO_Support_Attributes_i::
+supports_proxy_offers (CORBA::Boolean new_value)
+{
+ ACE_WRITE_GUARD (ACE_Lock, ace_mon, this->locker_.lock ());
+ this->supports_proxy_offers_ = new_value;
+}
+
+CosTrading::TypeRepository_ptr
+TAO_Support_Attributes_i::type_repos (void) const
+{
+ ACE_READ_GUARD_RETURN (ACE_Lock, ace_mon, this->locker_.lock (),
+ CosTrading::TypeRepository::_nil ());
+ return this->type_repos_.ptr ();
+}
+
+void
+TAO_Support_Attributes_i::
+type_repos (CosTrading::TypeRepository_ptr new_value)
+{
+ // @@ Seth, There is no way to propagate the exception out.
+ ACE_WRITE_GUARD (ACE_Lock, ace_mon, this->locker_.lock ());
+
+ ACE_DECLARE_NEW_CORBA_ENV;
+ this->type_repos_ = new_value;
+ // @@ What can we do even if we catch this?
+ this->service_type_repos_ =
+ CosTradingRepos::ServiceTypeRepository::_narrow (new_value ACE_ENV_ARG_PARAMETER);
+}
+
+CosTradingRepos::ServiceTypeRepository_ptr
+TAO_Support_Attributes_i::service_type_repos (void) const
+{
+ return this->service_type_repos_.ptr ();
+}
+
+
+TAO_Import_Attributes_i::
+TAO_Import_Attributes_i (TAO_Lockable &locker)
+ : locker_ (locker),
+ def_search_card_ (200),
+ max_search_card_ (500),
+ def_match_card_ (200),
+ max_match_card_ (500),
+ def_return_card_ (200),
+ max_return_card_ (500),
+ max_list_ (0),
+ def_hop_count_ (5),
+ max_hop_count_ (10),
+ def_follow_policy_ (CosTrading::if_no_local),
+ max_follow_policy_ (CosTrading::always)
+{
+}
+
+
+TAO_Import_Attributes_i::~TAO_Import_Attributes_i (void)
+{
+}
+
+CORBA::ULong
+TAO_Import_Attributes_i::def_search_card (void) const
+{
+ ACE_READ_GUARD_RETURN (ACE_Lock, ace_mon, this->locker_.lock (), 10);
+ return this->def_search_card_;
+}
+
+void
+TAO_Import_Attributes_i::def_search_card (CORBA::ULong new_value)
+{
+ ACE_WRITE_GUARD (ACE_Lock, ace_mon, this->locker_.lock ());
+
+ if (new_value > this->max_search_card_)
+ this->def_search_card_ = this->max_search_card_;
+ else
+ this->def_search_card_ = new_value;
+}
+
+CORBA::ULong
+TAO_Import_Attributes_i::max_search_card (void) const
+{
+ ACE_READ_GUARD_RETURN (ACE_Lock, ace_mon, this->locker_.lock (), 10);
+ return this->max_search_card_;
+}
+
+void
+TAO_Import_Attributes_i::max_search_card (CORBA::ULong new_value)
+{
+ ACE_WRITE_GUARD (ACE_Lock, ace_mon, this->locker_.lock ());
+
+ this->max_search_card_ = new_value;
+
+ if (this->def_search_card_ > this->max_search_card_)
+ this->def_search_card_ = this->max_search_card_;
+}
+
+CORBA::ULong
+TAO_Import_Attributes_i::def_match_card (void) const
+{
+ ACE_READ_GUARD_RETURN (ACE_Lock, ace_mon, this->locker_.lock (), 10);
+ return this->def_match_card_;
+}
+
+void
+TAO_Import_Attributes_i::def_match_card (CORBA::ULong new_value)
+{
+ ACE_WRITE_GUARD (ACE_Lock, ace_mon, this->locker_.lock ());
+
+ if (new_value > this->max_match_card_)
+ this->def_match_card_ = this->max_match_card_;
+ else
+ this->def_match_card_ = new_value;
+}
+
+CORBA::ULong
+TAO_Import_Attributes_i::max_match_card (void) const
+{
+ ACE_READ_GUARD_RETURN (ACE_Lock, ace_mon, this->locker_.lock (), 10);
+ return this->max_match_card_;
+}
+
+void
+TAO_Import_Attributes_i::max_match_card (CORBA::ULong new_value)
+{
+ ACE_WRITE_GUARD (ACE_Lock, ace_mon, this->locker_.lock ());
+ this->max_match_card_ = new_value;
+
+ if (this->def_match_card_ > this->max_match_card_)
+ this->def_match_card_ = this->max_match_card_;
+}
+
+CORBA::ULong
+TAO_Import_Attributes_i::def_return_card (void) const
+{
+ ACE_READ_GUARD_RETURN (ACE_Lock, ace_mon, this->locker_.lock (), 10);
+ return this->def_return_card_;
+}
+
+void
+TAO_Import_Attributes_i::def_return_card (CORBA::ULong new_value)
+{
+ ACE_WRITE_GUARD (ACE_Lock, ace_mon, this->locker_.lock ());
+
+ if (new_value > this->max_return_card_)
+ this->def_return_card_ = this->max_return_card_;
+ else
+ this->def_return_card_ = new_value;
+}
+
+CORBA::ULong
+TAO_Import_Attributes_i::max_return_card (void) const
+{
+ ACE_READ_GUARD_RETURN (ACE_Lock, ace_mon, this->locker_.lock (), 10);
+ return this->max_return_card_;
+}
+
+void
+TAO_Import_Attributes_i::max_return_card (CORBA::ULong new_value)
+{
+ ACE_WRITE_GUARD (ACE_Lock, ace_mon, this->locker_.lock ());
+ this->max_return_card_ = new_value;
+
+ if (this->def_return_card_ > this->max_return_card_)
+ this->def_return_card_ = this->max_return_card_;
+}
+
+CORBA::ULong
+TAO_Import_Attributes_i::max_list (void) const
+{
+ ACE_READ_GUARD_RETURN (ACE_Lock, ace_mon, this->locker_.lock (), 0);
+ return this->max_list_;
+}
+
+void
+TAO_Import_Attributes_i::max_list (CORBA::ULong new_value)
+{
+ ACE_WRITE_GUARD (ACE_Lock, ace_mon, this->locker_.lock ());
+ this->max_list_ = new_value;
+}
+
+CORBA::ULong
+TAO_Import_Attributes_i::def_hop_count (void) const
+{
+ ACE_READ_GUARD_RETURN (ACE_Lock, ace_mon, this->locker_.lock (), 0);
+ return this->def_hop_count_;
+}
+
+void
+TAO_Import_Attributes_i::def_hop_count (CORBA::ULong new_value)
+{
+ ACE_WRITE_GUARD (ACE_Lock, ace_mon, this->locker_.lock ());
+
+ if (new_value > this->max_hop_count_)
+ this->def_hop_count_ = this->max_hop_count_;
+ else
+ this->def_hop_count_ = new_value;
+}
+
+CORBA::ULong
+TAO_Import_Attributes_i::max_hop_count (void) const
+{
+ ACE_READ_GUARD_RETURN (ACE_Lock, ace_mon, this->locker_.lock (), 0);
+ return this->max_hop_count_;
+}
+
+void
+TAO_Import_Attributes_i::max_hop_count (CORBA::ULong new_value)
+{
+ ACE_WRITE_GUARD (ACE_Lock, ace_mon, this->locker_.lock ());
+ this->max_hop_count_ = new_value;
+
+ if (this->def_hop_count_ > this->max_hop_count_)
+ this->def_hop_count_ = this->max_hop_count_;
+}
+
+CosTrading::FollowOption
+TAO_Import_Attributes_i::def_follow_policy (void) const
+{
+ ACE_READ_GUARD_RETURN (ACE_Lock, ace_mon, this->locker_.lock (), CosTrading::local_only);
+ return this->def_follow_policy_;
+}
+
+void
+TAO_Import_Attributes_i::def_follow_policy (CosTrading::FollowOption new_value)
+{
+ ACE_WRITE_GUARD (ACE_Lock, ace_mon, this->locker_.lock ());
+
+ if (new_value > this->max_follow_policy_)
+ this->def_follow_policy_ = this->max_follow_policy_;
+ else
+ this->def_follow_policy_ = new_value;
+}
+
+CosTrading::FollowOption
+TAO_Import_Attributes_i::max_follow_policy (void) const
+{
+ ACE_READ_GUARD_RETURN (ACE_Lock, ace_mon, this->locker_.lock (), CosTrading::local_only);
+ return this->max_follow_policy_;
+}
+
+void
+TAO_Import_Attributes_i::max_follow_policy (CosTrading::FollowOption new_value)
+{
+ ACE_WRITE_GUARD (ACE_Lock, ace_mon, this->locker_.lock ());
+ this->max_follow_policy_ = new_value;
+
+ if (this->def_follow_policy_ > this->max_follow_policy_)
+ this->def_follow_policy_ = this->max_follow_policy_;
+}
+
+
+TAO_Trading_Components_i::TAO_Trading_Components_i (TAO_Lockable &locker)
+ : locker_ (locker),
+ lookup_ (CosTrading::Lookup::_nil ()),
+ register_ (CosTrading::Register::_nil ()),
+ link_ (CosTrading::Link::_nil ()),
+ proxy_ (CosTrading::Proxy::_nil ()),
+ admin_ (CosTrading::Admin::_nil ())
+{
+}
+
+TAO_Trading_Components_i::~TAO_Trading_Components_i (void)
+{
+}
+
+CosTrading::Lookup_ptr
+TAO_Trading_Components_i::lookup_if (void) const
+{
+ ACE_READ_GUARD_RETURN (ACE_Lock, ace_mon, this->locker_.lock (),
+ CosTrading::Lookup::_nil ());
+ return this->lookup_.ptr ();
+}
+
+void
+TAO_Trading_Components_i::lookup_if (CosTrading::Lookup_ptr new_value)
+{
+ ACE_WRITE_GUARD (ACE_Lock, ace_mon, this->locker_.lock ());
+ this->lookup_ = new_value;
+}
+
+CosTrading::Register_ptr
+TAO_Trading_Components_i::register_if (void) const
+{
+ ACE_READ_GUARD_RETURN (ACE_Lock, ace_mon, this->locker_.lock (),
+ CosTrading::Register::_nil ());
+ return this->register_.ptr ();
+}
+
+void
+TAO_Trading_Components_i::register_if (CosTrading::Register_ptr new_value)
+{
+ ACE_WRITE_GUARD (ACE_Lock, ace_mon, this->locker_.lock ());
+ this->register_ = new_value;
+}
+
+CosTrading::Link_ptr
+TAO_Trading_Components_i::link_if (void) const
+{
+ ACE_READ_GUARD_RETURN (ACE_Lock, ace_mon, this->locker_.lock (),
+ CosTrading::Link::_nil ());
+ return this->link_.ptr ();
+}
+
+void
+TAO_Trading_Components_i::link_if (CosTrading::Link_ptr new_value)
+{
+ ACE_WRITE_GUARD (ACE_Lock, ace_mon, this->locker_.lock ());
+ this->link_ = new_value;
+}
+
+CosTrading::Proxy_ptr
+TAO_Trading_Components_i::proxy_if (void) const
+{
+ ACE_READ_GUARD_RETURN (ACE_Lock, ace_mon, this->locker_.lock (),
+ CosTrading::Proxy::_nil ());
+ return this->proxy_.ptr ();
+}
+
+void
+TAO_Trading_Components_i::proxy_if (CosTrading::Proxy_ptr new_value)
+{
+ ACE_WRITE_GUARD (ACE_Lock, ace_mon, this->locker_.lock ());
+ this->proxy_ = new_value;
+}
+
+CosTrading::Admin_ptr
+TAO_Trading_Components_i::admin_if (void) const
+{
+ ACE_READ_GUARD_RETURN (ACE_Lock, ace_mon, this->locker_.lock (),
+ CosTrading::Admin::_nil ());
+ return this->admin_.ptr ();
+}
+
+void
+TAO_Trading_Components_i::admin_if (CosTrading::Admin_ptr new_value)
+{
+ ACE_WRITE_GUARD (ACE_Lock, ace_mon, this->locker_.lock ());
+ this->admin_ = new_value;
+}
+
+
+TAO_Link_Attributes_i::TAO_Link_Attributes_i (TAO_Lockable &locker)
+ :locker_ (locker),
+ max_link_follow_policy_ (CosTrading::local_only)
+{
+}
+
+TAO_Link_Attributes_i::~TAO_Link_Attributes_i (void)
+{
+}
+
+CosTrading::FollowOption
+TAO_Link_Attributes_i::max_link_follow_policy (void) const
+{
+ ACE_READ_GUARD_RETURN (ACE_Lock, ace_mon, this->locker_.lock (),
+ CosTrading::local_only);
+ return this->max_link_follow_policy_;
+}
+
+void
+TAO_Link_Attributes_i::max_link_follow_policy (CosTrading::FollowOption new_value)
+{
+ ACE_WRITE_GUARD (ACE_Lock, ace_mon, this->locker_.lock ());
+ this->max_link_follow_policy_ = new_value;
+}
+
+bool
+operator< (const CosTradingRepos::ServiceTypeRepository::IncarnationNumber &l,
+ const CosTradingRepos::ServiceTypeRepository::IncarnationNumber &r)
+{
+ if (l.high < r.high)
+ return true;
+ else if (l.high == r.high)
+ return (l.low < r.low);
+ else
+ return false;
+}
+
+bool
+operator> (const CosTradingRepos::ServiceTypeRepository::IncarnationNumber &l,
+ const CosTradingRepos::ServiceTypeRepository::IncarnationNumber &r)
+{
+ return (r < l);
+}
+
+bool
+operator== (const CosTrading::Admin::OctetSeq& left,
+ const CosTrading::Admin::OctetSeq& right)
+{
+ bool return_value = false;
+
+ const CORBA::ULong left_length = left.length ();
+ const CORBA::ULong right_length = right.length ();
+
+ if (left_length == right_length)
+ {
+ return_value = true;
+
+ for (CORBA::ULong i = 0; i < left_length; ++i)
+ {
+ if (left[i] != right[i])
+ {
+ return_value = false;
+ break;
+ }
+ }
+ }
+
+ return return_value;
+}
+
+TAO_END_VERSIONED_NAMESPACE_DECL
+
+#include "ace/Arg_Shifter.h"
+#include "orbsvcs/Trader/Trader_T.h"
+
+TAO_BEGIN_VERSIONED_NAMESPACE_DECL
+
+TAO_Trader_Factory::TAO_TRADER*
+TAO_Trader_Factory::create_trader (int& argc, ACE_TCHAR** argv)
+{
+ TAO_Trader_Factory trader_factory (argc, argv);
+ return trader_factory.manufacture_trader ();
+}
+
+TAO_Trader_Factory::TAO_Trader_Factory (int& argc, ACE_TCHAR** argv)
+ : conformance_ (TAO_TRADER_LINKED),
+ threadsafe_ (0),
+ supports_dynamic_properties_ (1),
+ supports_modifiable_properties_ (1),
+ def_search_card_ (20),
+ max_search_card_ (50),
+ def_match_card_ (20),
+ max_match_card_ (50),
+ def_return_card_ (20),
+ max_return_card_ (50),
+ def_hop_count_ (5),
+ max_hop_count_ (10),
+ def_follow_policy_ (CosTrading::if_no_local),
+ max_follow_policy_ (CosTrading::always)
+{
+ this->parse_args (argc, argv);
+}
+
+TAO_Trader_Factory::TAO_TRADER *
+TAO_Trader_Factory::manufacture_trader (void)
+{
+ typedef TAO_Trader<ACE_Null_Mutex, ACE_Null_Mutex> TRADER;
+
+#if defined ACE_HAS_THREADS
+ typedef TAO_Trader<TAO_SYNCH_MUTEX, TAO_SYNCH_RW_MUTEX> MT_TRADER;
+#else
+ typedef TAO_Trader<ACE_Null_Mutex, ACE_Null_Mutex> MT_TRADER;
+#endif /* ACE_HAS_THREADS */
+
+ TAO_TRADER* return_value = 0;
+ int components = static_cast<int> (TAO_Trader_Base::LOOKUP);
+
+ if (this->conformance_ >= TAO_TRADER_SIMPLE)
+ components |= static_cast<int> (TAO_Trader_Base::REGISTER);
+
+ if (this->conformance_ >= TAO_TRADER_STANDALONE)
+ components |= static_cast<int> (TAO_Trader_Base::ADMIN);
+
+ if (this->conformance_ >= TAO_TRADER_LINKED)
+ components |= static_cast<int> (TAO_Trader_Base::LINK);
+
+ if (this->threadsafe_)
+ ACE_NEW_RETURN (return_value,
+ MT_TRADER (static_cast<TAO_Trader_Base::Trader_Components> (components)),
+ 0);
+ else
+ ACE_NEW_RETURN (return_value,
+ TRADER (static_cast<TAO_Trader_Base::Trader_Components> (components)),
+ 0);
+
+ TAO_Import_Attributes_i &import_attributes =
+ return_value->import_attributes ();
+ TAO_Support_Attributes_i &support_attributes =
+ return_value->support_attributes ();
+
+ import_attributes.def_search_card (this->def_search_card_);
+ import_attributes.max_search_card (this->max_search_card_);
+ import_attributes.def_match_card (this->def_match_card_);
+ import_attributes.max_match_card (this->max_match_card_);
+ import_attributes.def_return_card (this->def_return_card_);
+ import_attributes.max_return_card (this->max_return_card_);
+ import_attributes.def_hop_count (this->def_hop_count_);
+ import_attributes.max_hop_count (this->max_hop_count_);
+ import_attributes.def_follow_policy (this->def_follow_policy_);
+ import_attributes.max_follow_policy (this->max_follow_policy_);
+ support_attributes.supports_modifiable_properties (this->supports_modifiable_properties_);
+ support_attributes.supports_dynamic_properties (this->supports_dynamic_properties_);
+
+ return return_value;
+}
+
+void
+TAO_Trader_Factory::parse_args (int& argc, ACE_TCHAR** argv)
+{
+ ACE_Arg_Shifter arg_shifter (argc, argv);
+
+ while (arg_shifter.is_anything_left ())
+ {
+ const ACE_TCHAR* current_arg = arg_shifter.get_current ();
+
+ if (ACE_OS::strcmp (current_arg, ACE_TEXT("-TSthreadsafe")) == 0)
+ {
+ arg_shifter.consume_arg ();
+ this->threadsafe_ = 1;
+ }
+ else if (ACE_OS::strcmp (current_arg, ACE_TEXT("-TSconformance")) == 0)
+ {
+ arg_shifter.consume_arg ();
+ if (arg_shifter.is_parameter_next ())
+ {
+ const ACE_TCHAR* conformance_str = arg_shifter.get_current ();
+
+ if (ACE_OS::strcasecmp (conformance_str, ACE_TEXT("Linked")) == 0)
+ this->conformance_ = TAO_TRADER_LINKED;
+ else if (ACE_OS::strcasecmp (conformance_str, ACE_TEXT("Query")) == 0)
+ this->conformance_ = TAO_TRADER_QUERY;
+ else if (ACE_OS::strcasecmp (conformance_str, ACE_TEXT("Simple")) == 0)
+ this->conformance_ = TAO_TRADER_SIMPLE;
+ else if (ACE_OS::strcasecmp (conformance_str, ACE_TEXT("Standalone")) == 0)
+ this->conformance_ = TAO_TRADER_STANDALONE;
+
+ arg_shifter.consume_arg ();
+ }
+ }
+ else if (ACE_OS::strcmp (current_arg, ACE_TEXT("-TSsupports_dynamic_properties")) == 0)
+ {
+ arg_shifter.consume_arg ();
+ if (arg_shifter.is_parameter_next ())
+ {
+ const ACE_TCHAR* arg_str = arg_shifter.get_current ();
+
+ if (ACE_OS::strcasecmp (arg_str, ACE_TEXT("true")) == 0)
+ this->supports_dynamic_properties_ = 1;
+ else if (ACE_OS::strcasecmp (arg_str, ACE_TEXT("false")) == 0)
+ this->supports_dynamic_properties_ = 0;
+
+ arg_shifter.consume_arg ();
+ }
+
+ }
+ else if (ACE_OS::strcmp (current_arg, ACE_TEXT("-TSsupports_modifiable_properties")) == 0)
+ {
+ arg_shifter.consume_arg ();
+ if (arg_shifter.is_parameter_next ())
+ {
+ const ACE_TCHAR* arg_str = arg_shifter.get_current ();
+
+ if (ACE_OS::strcasecmp (arg_str, ACE_TEXT("true")) == 0)
+ this->supports_modifiable_properties_ = 1;
+ else if (ACE_OS::strcasecmp (arg_str, ACE_TEXT("false")) == 0)
+ this->supports_modifiable_properties_ = 0;
+
+ arg_shifter.consume_arg ();
+ }
+ }
+ else if (ACE_OS::strcmp (current_arg, ACE_TEXT("-TSdef_search_card")) == 0 ||
+ ACE_OS::strcmp (current_arg, ACE_TEXT("-TSmax_search_card")) == 0 ||
+ ACE_OS::strcmp (current_arg, ACE_TEXT("-TSdef_match_card")) == 0 ||
+ ACE_OS::strcmp (current_arg, ACE_TEXT("-TSmax_match_card")) == 0 ||
+ ACE_OS::strcmp (current_arg, ACE_TEXT("-TSdef_return_card")) == 0 ||
+ ACE_OS::strcmp (current_arg, ACE_TEXT("-TSmax_return_card")) == 0 ||
+ ACE_OS::strcmp (current_arg, ACE_TEXT("-TSdef_hop_count")) == 0 ||
+ ACE_OS::strcmp (current_arg, ACE_TEXT("-TSmax_hop_count")) == 0)
+ {
+ arg_shifter.consume_arg ();
+ if (arg_shifter.is_parameter_next ())
+ {
+ CORBA::ULong value =
+ static_cast<CORBA::ULong> (ACE_OS::atoi (arg_shifter.get_current ()));
+ arg_shifter.consume_arg ();
+
+ if (ACE_OS::strstr (current_arg, ACE_TEXT("card")))
+ {
+ if (ACE_OS::strstr (current_arg, ACE_TEXT("max")))
+ {
+ if (ACE_OS::strstr (current_arg, ACE_TEXT("search")))
+ this->max_search_card_ = value;
+ else if (ACE_OS::strstr (current_arg, ACE_TEXT("match")))
+ this->max_match_card_ = value;
+ else
+ this->max_return_card_ = value;
+ }
+ else
+ {
+ if (ACE_OS::strstr (current_arg, ACE_TEXT("search")))
+ this->def_search_card_ = value;
+ else if (ACE_OS::strstr (current_arg, ACE_TEXT("match")))
+ this->def_match_card_ = value;
+ else
+ this->def_return_card_ = value;
+ }
+ }
+ else
+ {
+ if (ACE_OS::strstr (current_arg, ACE_TEXT("max")))
+ this->max_hop_count_ = value;
+ else
+ this->def_hop_count_ = value;
+ }
+ }
+ }
+ else if (ACE_OS::strcmp (current_arg, ACE_TEXT("-TSdef_follow_policy")) == 0
+ || ACE_OS::strcmp (current_arg, ACE_TEXT("-TSmax_follow_policy")) == 0)
+ {
+ arg_shifter.consume_arg ();
+ if (arg_shifter.is_parameter_next ())
+ {
+ const ACE_TCHAR* arg_str = arg_shifter.get_current ();
+ CosTrading::FollowOption follow_option;
+
+ if (ACE_OS::strcasecmp (arg_str, ACE_TEXT("always")) == 0)
+ follow_option = CosTrading::always;
+ else if (ACE_OS::strcasecmp (arg_str, ACE_TEXT("if_no_local")) == 0)
+ follow_option = CosTrading::if_no_local;
+ else if (ACE_OS::strcasecmp (arg_str, ACE_TEXT("local_only")) == 0)
+ follow_option = CosTrading::local_only;
+ else if (ACE_OS::strstr (current_arg, ACE_TEXT("def")))
+ follow_option = this->def_follow_policy_;
+ else
+ follow_option = this->max_follow_policy_;
+
+ if (ACE_OS::strstr (current_arg, ACE_TEXT("def")))
+ this->def_follow_policy_ = follow_option;
+ else
+ this->max_follow_policy_ = follow_option;
+
+ arg_shifter.consume_arg ();
+ }
+ }
+ else
+ arg_shifter.ignore_arg ();
+ }
+}
+
+TAO_END_VERSIONED_NAMESPACE_DECL
diff --git a/TAO/orbsvcs/orbsvcs/Trader/Trader.h b/TAO/orbsvcs/orbsvcs/Trader/Trader.h
new file mode 100644
index 00000000000..61b18d38c72
--- /dev/null
+++ b/TAO/orbsvcs/orbsvcs/Trader/Trader.h
@@ -0,0 +1,525 @@
+// -*- C++ -*-
+
+//=============================================================================
+/**
+ * @file Trader.h
+ *
+ * $Id$
+ *
+ * @author Marina Spivak <marina@cs.wustl.edu>
+ * @author Seth Widoff <sbw1@cs.wustl.edu>
+ * @author Irfan Pyarali <irfan@cs.wustl.edu>
+ */
+//=============================================================================
+
+
+#ifndef TAO_TRADER_BASE_H
+#define TAO_TRADER_BASE_H
+#include /**/ "ace/pre.h"
+
+#include "orbsvcs/Trader/Interpreter_Utils.h"
+
+#if !defined (ACE_LACKS_PRAGMA_ONCE)
+# pragma once
+#endif /* ACE_LACKS_PRAGMA_ONCE */
+
+#include "ace/Containers.h"
+
+#include "orbsvcs/CosTradingS.h"
+#include "orbsvcs/CosTradingReposS.h"
+#include "orbsvcs/CosTradingDynamicS.h"
+#include "orbsvcs/Trader/trading_serv_export.h"
+
+#if defined(_MSC_VER)
+#pragma warning(push)
+#pragma warning (disable:4250)
+#endif /* _MSC_VER */
+
+TAO_BEGIN_VERSIONED_NAMESPACE_DECL
+
+// Forward Declaration.
+class TAO_Trader_Base;
+
+ // *************************************************************
+ // TAO_Trader_Factory
+ // *************************************************************
+
+/**
+ * @class TAO_Trader_Factory
+ *
+ * @brief Uses command line arguments to construct a trader instance with
+ * the correct interface support, locking, and policy settings.
+ */
+class TAO_Trading_Serv_Export TAO_Trader_Factory
+{
+public:
+
+ typedef TAO_Trader_Base TAO_TRADER;
+
+ /**
+ * Creates an instance of the trader according to parameters whose
+ * default values can be overrided with the following command line
+ * arguments:
+ *
+ * -TSthreadsafe, default is not thread-safe
+ * -TSconformance {query, simple, stand-alone, linked}, default is linked
+ * -TSsupports_dynamic_properties {true, false}, default is true
+ * -TSsupports_modifiable_propertise {true, false}, default is true
+ * -TSdef_search_card {integer}, default is 20
+ * -TSmax_search_card {integer}, default is 50
+ * -TSdef_match_card {integer}, default is 20
+ * -TSmax_match_card {integer}, default is 50
+ * -TSdef_return_card {integer}, default is 20
+ * -TSmax_return_card {integer}, default is 50
+ * -TSdef_hop_count {integer}, default is 5,
+ * -TSmax_hop_count {integer}, default is 10
+ * -TSdef_follow_policy {always,if_no_local,local_only}, default is if_no_local,
+ * -TSmax_follow_policy {always,if_no_local,local_only}, default is always
+ */
+ static TAO_TRADER* create_trader (int& argc, ACE_TCHAR** argv);
+
+protected:
+
+ TAO_Trader_Factory (int& argc, ACE_TCHAR** argv);
+
+private:
+
+ enum Conformance { TAO_TRADER_QUERY,
+ TAO_TRADER_SIMPLE,
+ TAO_TRADER_STANDALONE,
+ TAO_TRADER_LINKED };
+
+ TAO_TRADER* manufacture_trader (void);
+
+ void parse_args (int& argc, ACE_TCHAR** argv);
+
+ TAO_Trader_Factory& operator= (const TAO_Trader_Factory&);
+ TAO_Trader_Factory (const TAO_Trader_Factory&);
+
+ // = Command line configurable parameters.
+
+ Conformance conformance_;
+ CORBA::Boolean threadsafe_;
+ CORBA::Boolean supports_dynamic_properties_;
+ CORBA::Boolean supports_modifiable_properties_;
+ CORBA::ULong def_search_card_;
+ CORBA::ULong max_search_card_;
+ CORBA::ULong def_match_card_;
+ CORBA::ULong max_match_card_;
+ CORBA::ULong def_return_card_;
+ CORBA::ULong max_return_card_;
+ CORBA::ULong def_hop_count_;
+ CORBA::ULong max_hop_count_;
+ CosTrading::FollowOption def_follow_policy_;
+ CosTrading::FollowOption max_follow_policy_;
+};
+
+ // *************************************************************
+ // Attribute Classes
+ // *************************************************************
+
+/**
+ * @class TAO_Lockable
+ *
+ * Class used to remove the circular dependencies between the
+ * Attribute classes and the Trader class.
+ */
+#if defined (__BORLANDC__) && (__BORLANDC__ <= 0x582)
+// Work around Borland unresolved symbol errors concerning the
+// out-of-line virtual destructor. The virtual destructor should
+// not be inlined, nor should we have to export TAO_Lockable from the
+// DSO/DLL. *sigh*
+class TAO_Trading_Serv_Export TAO_Lockable
+#else
+class TAO_Lockable
+#endif /* __BORLANDC__ < 0x581 */
+{
+public:
+ virtual ~TAO_Lockable (void);
+
+ virtual ACE_Lock& lock (void) = 0;
+};
+
+
+/**
+ * @class TAO_Support_Attributes_i
+ *
+ * @brief This class stores, allows access to and modification of
+ * trader's support attributes.
+ *
+ * Contains a reference to the trader from which it is
+ * used so it can use trader's lock.
+ */
+class TAO_Trading_Serv_Export TAO_Support_Attributes_i
+{
+public:
+ // = Initialization and termination methods.
+ TAO_Support_Attributes_i (TAO_Lockable &locker);
+ ~TAO_Support_Attributes_i ();
+
+ // = Accessor methods.
+ CORBA::Boolean supports_modifiable_properties (void) const;
+ void supports_modifiable_properties (CORBA::Boolean);
+
+ CORBA::Boolean supports_dynamic_properties (void) const;
+ void supports_dynamic_properties (CORBA::Boolean);
+
+ CORBA::Boolean supports_proxy_offers (void) const;
+ void supports_proxy_offers (CORBA::Boolean);
+
+ CosTrading::TypeRepository_ptr type_repos (void) const;
+ void type_repos (CosTrading::TypeRepository_ptr);
+
+ CosTradingRepos::ServiceTypeRepository_ptr service_type_repos (void) const;
+
+private:
+
+ /// A reference to the trader (needed for obtaining the lock.)
+ TAO_Lockable &locker_;
+
+ /// Indicator of whether the trader supports property modification.
+ CORBA::Boolean supports_modifiable_properties_;
+
+ /// Indicator of whether the trader supports dynamic properties.
+ CORBA::Boolean supports_dynamic_properties_;
+
+ /// Indicator of whether the trader supports proxy offers.
+ CORBA::Boolean supports_proxy_offers_;
+
+ /// A reference to the TypeRepostitory used by the trader.
+ CORBA::Object_var type_repos_;
+
+ /// Already narrowed reference to the ServiceTypeRepository.
+ CosTradingRepos::ServiceTypeRepository_var service_type_repos_;
+};
+
+/**
+ * @class TAO_Link_Attributes_i
+ *
+ * @brief This class stores, allows access to and modification of
+ * trader's link attributes.
+ *
+ * Contains a reference to the trader from which it is
+ * used so it can use trader's lock.
+ */
+class TAO_Trading_Serv_Export TAO_Link_Attributes_i
+{
+public:
+ // = Initialization and termination methods.
+
+ TAO_Link_Attributes_i (TAO_Lockable &locker);
+ ~TAO_Link_Attributes_i ();
+
+ // = Accessor methods.
+
+ CosTrading::FollowOption max_link_follow_policy (void) const;
+ void max_link_follow_policy (CosTrading::FollowOption);
+
+private:
+
+ /// A reference to the trader (needed for obtaining the lock.)
+ TAO_Lockable &locker_;
+
+ ///
+ CosTrading::FollowOption max_link_follow_policy_;
+};
+
+/**
+ * @class TAO_Import_Attributes_i
+ *
+ * @brief This class stores, allows access to and modification of
+ * trader's import attributes.
+ *
+ * Contains a reference to the trader from which it is
+ * used so it can use trader's lock.
+ */
+class TAO_Trading_Serv_Export TAO_Import_Attributes_i
+{
+public:
+ // = Initialization and termination methods.
+
+ TAO_Import_Attributes_i (TAO_Lockable &locker);
+
+ ~TAO_Import_Attributes_i (void);
+
+ // = Accessor methods.
+
+ CORBA::ULong def_search_card (void) const;
+ void def_search_card (CORBA::ULong);
+
+ CORBA::ULong max_search_card (void) const;
+ void max_search_card (CORBA::ULong);
+
+ CORBA::ULong def_match_card (void) const;
+ void def_match_card (CORBA::ULong);
+
+ CORBA::ULong max_match_card (void) const;
+ void max_match_card (CORBA::ULong);
+
+ CORBA::ULong def_return_card (void) const;
+ void def_return_card (CORBA::ULong);
+
+ CORBA::ULong max_return_card (void) const;
+ void max_return_card (CORBA::ULong);
+
+ CORBA::ULong max_list (void) const;
+ void max_list (CORBA::ULong);
+
+ CORBA::ULong def_hop_count (void) const;
+ void def_hop_count (CORBA::ULong);
+
+ CORBA::ULong max_hop_count (void) const;
+ void max_hop_count (CORBA::ULong);
+
+ CosTrading::FollowOption def_follow_policy (void) const;
+ void def_follow_policy (CosTrading::FollowOption);
+
+ CosTrading::FollowOption max_follow_policy (void) const;
+ void max_follow_policy (CosTrading::FollowOption);
+
+private:
+
+ TAO_Lockable &locker_;
+
+ /// Upper bound of offers to be searched if <search_card>
+ /// is not specified.
+ CORBA::ULong def_search_card_;
+
+ /// Maximum upper bound of offers to be searched.
+ CORBA::ULong max_search_card_;
+
+ /// Upper bound of matched offers to be ordered if
+ /// <match_card> is not specified).
+ CORBA::ULong def_match_card_;
+
+ /// Maximum upper bound of matched offers to be ordered.
+ CORBA::ULong max_match_card_;
+
+ /// Upper bound of ordered offers to be returned if
+ /// <returned_card> is not specified.
+ CORBA::ULong def_return_card_;
+
+ /// Maximum upper bound of ordered offers to be returned.
+ CORBA::ULong max_return_card_;
+
+ /// Upper bound of depth
+ CORBA::ULong max_list_;
+
+ /// Upper bound of depth of links to be traversed if <hop_count> is
+ /// not specified.
+ CORBA::ULong def_hop_count_;
+
+ /// Maximum upper bound of depth of links to be traversed.
+ CORBA::ULong max_hop_count_;
+
+ /// Default link follow policy for a particular trader.
+ CosTrading::FollowOption def_follow_policy_;
+
+ /// Limiting link follow policy for all links of the trader -
+ /// overrides both link and importer policies.
+ CosTrading::FollowOption max_follow_policy_;
+};
+
+/**
+ * @class TAO_Trading_Components_i
+ *
+ * @brief Set/get methods for references to various
+ * interfaces of the trader.
+ *
+ * Note, this class is for use in local address space only and is NOT a
+ * direct implementation of IDL methods. (Implementation of
+ * IDL methods in CosTrading::Trader_Components would need
+ * add a _duplicate call for each get method).
+ */
+class TAO_Trading_Serv_Export TAO_Trading_Components_i
+{
+public:
+
+ // = Initialization and termination methods.
+ TAO_Trading_Components_i (TAO_Lockable &locker);
+ ~TAO_Trading_Components_i (void);
+
+ // = CosTrading::TraderComponents methods.
+
+ /// Returns an object reference to the Lookup interface of the trader.
+ /// Returns nil if the trader does not support Lookup interface.
+ CosTrading::Lookup_ptr lookup_if (void) const;
+
+ /// Set the reference to the Lookup interface.
+ void lookup_if (CosTrading::Lookup_ptr);
+
+ /// Returns object reference for the Register interface of the trader.
+ /// Returns nil if the trader does not support Register interface.
+ CosTrading::Register_ptr register_if (void) const;
+
+ /// Set the reference to the Register interface of the trader.
+ void register_if (CosTrading::Register_ptr);
+
+ /// Returns object reference for the Link interface of the trader.
+ /// Returns nil if the trader does not support Link interface.
+ CosTrading::Link_ptr link_if (void) const;
+
+ /// Set the reference to the Link interface of the trader.
+ void link_if (CosTrading::Link_ptr);
+
+ /// Returns object reference to the Proxy interface of the trader.
+ /// Returns nil if the trader does not support Proxy interface.
+ CosTrading::Proxy_ptr proxy_if (void) const;
+
+ /// Set the reference to the Proxy interface of the trader.
+ void proxy_if (CosTrading::Proxy_ptr);
+
+ /// Returns object reference for the Admin interface of the trader.
+ /// Returns nil if the trader does not support Admin interface.
+ CosTrading::Admin_ptr admin_if (void) const;
+
+ /// Set the reference to the Admin interface of the trader.
+ void admin_if (CosTrading::Admin_ptr);
+
+private:
+
+ TAO_Lockable &locker_;
+
+ CosTrading::Lookup_var lookup_;
+ CosTrading::Register_var register_;
+ CosTrading::Link_var link_;
+ CosTrading::Proxy_var proxy_;
+ CosTrading::Admin_var admin_;
+};
+
+ // *************************************************************
+ // TAO_Trader_Base
+ // *************************************************************
+
+/**
+ * @class TAO_Trader_Base
+ *
+ * @brief TAO_Trader inherits from this "helper" class.
+ * The sole purpose of this class is to factor some of TAO_Trader's
+ * data members out, so that they would not have to be templatized
+ * and be be aware of the type of lock they use.
+ *
+ * TAO_Trader is a template class. And while we want
+ * <import_attributes_>, <trader_components_>, and
+ * <support_attributes> use a lock contained in TAO_Trader, we do not
+ * want all these classes to be templatized. TAO_Trader_Base class solves
+ * this problem.
+ */
+class TAO_Trading_Serv_Export TAO_Trader_Base : public TAO_Lockable
+{
+public:
+
+ enum Trader_Components
+ {
+ LOOKUP = 0x001,
+ REGISTER = 0x002,
+ LINK = 0x004,
+ PROXY = 0x008,
+ ADMIN = 0x010
+ };
+
+ virtual ~TAO_Trader_Base (void);
+
+ // = Accessors for objects that manage trader's configuration.
+
+ TAO_Trading_Components_i &trading_components (void);
+
+ const TAO_Trading_Components_i &trading_components (void) const;
+
+ TAO_Import_Attributes_i &import_attributes (void);
+
+ const TAO_Import_Attributes_i &import_attributes (void) const;
+
+ TAO_Support_Attributes_i &support_attributes (void);
+
+ const TAO_Support_Attributes_i &support_attributes (void) const;
+
+ TAO_Link_Attributes_i &link_attributes (void);
+
+ const TAO_Link_Attributes_i &link_attributes (void) const;
+
+ // = Accessor for trader's lock.
+
+ /**
+ * Determine whether the identifier is a valid one (i.e., if the
+ * first character is a letter, and the subsequent ones letter,
+ * numbers, or underscores.)
+ *
+ * IDL identifier scoping and escaping rules apply.
+ */
+ static CORBA::Boolean is_valid_identifier_name (const char* ident);
+
+ /**
+ * Determine whether the identifier is a valid one (i.e., if the
+ * first character is a letter, and the subsequent ones letter,
+ * numbers, or underscores.)
+ */
+ static CORBA::Boolean is_valid_property_name (const char* ident);
+
+ /**
+ * Determine whether the link name is a valid one
+ * currently defined the same as property name.
+ */
+ static CORBA::Boolean is_valid_link_name (const char* ident)
+ {
+ return is_valid_property_name (ident);
+ }
+
+protected:
+ // = Objects determining current configuration of a trader.
+
+ /// Stores and allows lookup of trader's components.
+ TAO_Trading_Components_i trading_components_;
+
+ /// Stores and allows access/modification of trader's import attributes.
+ TAO_Import_Attributes_i import_attributes_;
+
+ /// Stores and allows access/modification of trader's support attributes.
+ TAO_Support_Attributes_i support_attributes_;
+
+ /// Stores and allows access/modification of trader's link attributes.
+ TAO_Link_Attributes_i link_attributes_;
+
+ protected:
+
+ /// Implemented.
+ TAO_Trader_Base (void);
+
+ private:
+
+ /// Unimplemented.
+ TAO_Trader_Base (const TAO_Trader_Base& TAO_Trader_Base);
+ TAO_Trader_Base& operator= (const TAO_Trader_Base&);
+};
+
+
+// Helpful typedefs
+// Should probably be private to TAO_Offer_Database, but g++ has a
+// hard time with it like that when compiling TAO_Service_Offer_Iterator.
+typedef ACE_Hash_Map_Manager_Ex<CORBA::ULong, CosTrading::Offer*, ACE_Hash<CORBA::ULong>, ACE_Equal_To<CORBA::ULong>, ACE_Null_Mutex> TAO_Offer_Map;
+
+typedef ACE_Unbounded_Set<CORBA::String_var> TAO_String_Set;
+typedef ACE_Unbounded_Queue<char*> TAO_String_Queue;
+
+// = Helpful operators.
+
+bool
+operator> (const CosTradingRepos::ServiceTypeRepository::IncarnationNumber &l,
+ const CosTradingRepos::ServiceTypeRepository::IncarnationNumber &r);
+
+bool
+operator< (const CosTradingRepos::ServiceTypeRepository::IncarnationNumber &l,
+ const CosTradingRepos::ServiceTypeRepository::IncarnationNumber &r);
+
+bool
+operator== (const CosTrading::Admin::OctetSeq& left,
+ const CosTrading::Admin::OctetSeq& right);
+
+TAO_END_VERSIONED_NAMESPACE_DECL
+
+#if defined(_MSC_VER)
+#pragma warning(pop)
+#endif /* _MSC_VER */
+
+#include /**/ "ace/post.h"
+#endif /* TAO_TRADER_BASE_H */
diff --git a/TAO/orbsvcs/orbsvcs/Trader/Trader_Constraint_Visitors.cpp b/TAO/orbsvcs/orbsvcs/Trader/Trader_Constraint_Visitors.cpp
new file mode 100644
index 00000000000..818934b10bb
--- /dev/null
+++ b/TAO/orbsvcs/orbsvcs/Trader/Trader_Constraint_Visitors.cpp
@@ -0,0 +1,84 @@
+// $Id$
+
+#include "orbsvcs/Trader/Trader_Constraint_Visitors.h"
+
+TAO_BEGIN_VERSIONED_NAMESPACE_DECL
+
+TAO_Trader_Constraint_Evaluator::
+TAO_Trader_Constraint_Evaluator (CosTrading::Offer* offer,
+ CORBA::Boolean supports_dp)
+ : prop_eval_ (*offer, supports_dp)
+{
+ this->props_.close ();
+ this->props_.open ();
+ int length = offer->properties.length ();
+
+ // Create a map of property names to their values.
+ for (int i = 0; i < length; i++)
+ {
+ CORBA::String_var name = (const char*) offer->properties[i].name;
+ this->props_.bind (name, i);
+ }
+}
+
+int
+TAO_Trader_Constraint_Evaluator::
+visit_property (TAO_Property_Constraint* literal)
+{
+ int return_value = -1, prop_index = 0;
+ // Handle case where property is not, in fact, mapped to a value
+ CORBA::String_var prop_name ((const char*) literal->name ());
+
+ if (this->props_.find (prop_name, prop_index) == 0)
+ {
+ ACE_DECLARE_NEW_CORBA_ENV;
+
+ CORBA::Any *value = 0;
+ // Retrieve the value of the property from the Property_Evaluator
+ ACE_TRY
+ {
+ value = this->prop_eval_.property_value (prop_index ACE_ENV_ARG_PARAMETER);
+ ACE_TRY_CHECK;
+ }
+ ACE_CATCHANY
+ {
+ return -1;
+ }
+ ACE_ENDTRY;
+ // ACE_CHECK_RETURN (-1);
+
+ if (value != 0)
+ {
+ this->queue_.enqueue_head (TAO_Literal_Constraint (value));
+ return_value = 0;
+ }
+ }
+
+ return return_value;
+}
+
+TAO_Trader_Constraint_Validator::
+TAO_Trader_Constraint_Validator
+(const CosTradingRepos::ServiceTypeRepository::TypeStruct& type_struct)
+{
+ const CosTradingRepos::ServiceTypeRepository::PropStructSeq& prop_seq =
+ type_struct.props;
+ int length = prop_seq.length ();
+
+ // Create a map of the service type properties to their types.
+ for (int i = 0; i < length; i++)
+ {
+ CORBA::TypeCode_ptr corba_type =
+ CORBA::TypeCode::_duplicate (prop_seq[i].value_type.in ());
+
+ CORBA::String_var prop_name_str = (const char*) prop_seq[i].name;
+ this->type_map_.bind (prop_name_str, corba_type);
+ }
+}
+
+TAO_Trader_Constraint_Validator::
+~TAO_Trader_Constraint_Validator ()
+{
+}
+
+TAO_END_VERSIONED_NAMESPACE_DECL
diff --git a/TAO/orbsvcs/orbsvcs/Trader/Trader_Constraint_Visitors.h b/TAO/orbsvcs/orbsvcs/Trader/Trader_Constraint_Visitors.h
new file mode 100644
index 00000000000..3b132230630
--- /dev/null
+++ b/TAO/orbsvcs/orbsvcs/Trader/Trader_Constraint_Visitors.h
@@ -0,0 +1,63 @@
+// -*- C++ -*-
+
+//=============================================================================
+/**
+ * @file Trader_Constraint_Visitors.h
+ *
+ * $Id$
+ *
+ * @author Seth Widoff <sbw1@cs.wustl.edu>
+ */
+//=============================================================================
+
+
+#ifndef TAO_TRADER_CONSTRAINT_VISITOR_H
+#define TAO_TRADER_CONSTRAINT_VISITOR_H
+#include /**/ "ace/pre.h"
+
+#include "orbsvcs/Trader/Constraint_Visitors.h"
+#include "orbsvcs/Trader/Trader.h"
+#include "orbsvcs/Trader/Trader_Utils.h"
+#include "orbsvcs/CosTradingC.h"
+
+TAO_BEGIN_VERSIONED_NAMESPACE_DECL
+
+class TAO_Trading_Serv_Export TAO_Trader_Constraint_Validator
+: public TAO_Constraint_Validator
+{
+ public:
+ /**
+ * The constructor creates a map of property names to their values
+ * from the Type Description retrieved from the
+ * ServiceTypeRepository. The ServiceTypeRepository throws
+ * exceptions when it's displeased with the type name provided to
+ * it. The map allows O(lg n) associative access, rather than the
+ * O(n) sequential lookup from the CORBA data structures.
+ */
+ TAO_Trader_Constraint_Validator (const CosTradingRepos::ServiceTypeRepository::TypeStruct&
+ type_struct);
+
+ /// Desctructor.
+ virtual ~TAO_Trader_Constraint_Validator (void);
+
+};
+
+class TAO_Trading_Serv_Export TAO_Trader_Constraint_Evaluator : public TAO_Constraint_Evaluator
+{
+ public:
+ /// Constructor.
+ TAO_Trader_Constraint_Evaluator (CosTrading::Offer* offer,
+ CORBA::Boolean supports_dynamic_properties = 1);
+
+ virtual int visit_property (TAO_Property_Constraint* literal);
+
+ private:
+ /// Utility with which to evaluate the properties of an offer, be
+ /// they dyanmic or static.
+ TAO_Property_Evaluator prop_eval_;
+};
+
+TAO_END_VERSIONED_NAMESPACE_DECL
+
+#include /**/ "ace/post.h"
+#endif /* TAO_TRADER_CONSTRAINT_VISITOR_H */
diff --git a/TAO/orbsvcs/orbsvcs/Trader/Trader_Interfaces.cpp b/TAO/orbsvcs/orbsvcs/Trader/Trader_Interfaces.cpp
new file mode 100644
index 00000000000..60513db6b78
--- /dev/null
+++ b/TAO/orbsvcs/orbsvcs/Trader/Trader_Interfaces.cpp
@@ -0,0 +1,1940 @@
+// $Id$
+
+#ifndef TAO_TRADER_INTERFACES_CPP
+#define TAO_TRADER_INTERFACES_CPP
+
+#include "orbsvcs/Trader/Trader_Interfaces.h"
+#include "orbsvcs/Trader/Trader_T.h"
+#include "ace/INET_Addr.h"
+#include "orbsvcs/Trader/Trader_Constraint_Visitors.h"
+#include "ace/OS_NS_time.h"
+#include "ace/OS_NS_unistd.h"
+
+TAO_BEGIN_VERSIONED_NAMESPACE_DECL
+
+template <class TRADER_LOCK_TYPE, class MAP_LOCK_TYPE>
+TAO_Lookup<TRADER_LOCK_TYPE,MAP_LOCK_TYPE>::
+TAO_Lookup (TAO_Trader<TRADER_LOCK_TYPE,MAP_LOCK_TYPE> &trader)
+ : TAO_Trader_Components<POA_CosTrading::Lookup> (trader.trading_components ()),
+ TAO_Support_Attributes<POA_CosTrading::Lookup> (trader.support_attributes ()),
+ TAO_Import_Attributes<POA_CosTrading::Lookup> (trader.import_attributes ()),
+ IDS_SAVED (100),
+ trader_ (trader)
+{
+}
+
+template <class TRADER_LOCK_TYPE, class MAP_LOCK_TYPE>
+TAO_Lookup<TRADER_LOCK_TYPE,MAP_LOCK_TYPE>::~TAO_Lookup (void)
+{
+ ACE_GUARD (TRADER_LOCK_TYPE, trader_mon, this->lock_);
+ for (Request_Ids::ITERATOR riter (this->request_ids_);
+ ! riter.done ();
+ riter.advance ())
+ {
+ CosTrading::Admin::OctetSeq** old_seq = 0;
+ riter.next (old_seq);
+ delete *old_seq;
+ }
+}
+
+template <class TRADER_LOCK_TYPE, class MAP_LOCK_TYPE> void
+TAO_Lookup<TRADER_LOCK_TYPE,MAP_LOCK_TYPE>::
+query (const char *type,
+ const char *constraint,
+ const char *preferences,
+ const CosTrading::PolicySeq &in_policies,
+ const CosTrading::Lookup::SpecifiedProps &desired_props,
+ CORBA::ULong how_many,
+ CosTrading::OfferSeq_out returned_offers,
+ CosTrading::OfferIterator_out returned_offer_iterator,
+ CosTrading::PolicyNameSeq_out returned_limits_applied
+ ACE_ENV_ARG_DECL)
+ ACE_THROW_SPEC ((CORBA::SystemException,
+ CosTrading::IllegalServiceType,
+ CosTrading::UnknownServiceType,
+ CosTrading::IllegalConstraint,
+ CosTrading::Lookup::IllegalPreference,
+ CosTrading::Lookup::IllegalPolicyName,
+ CosTrading::Lookup::PolicyTypeMismatch,
+ CosTrading::Lookup::InvalidPolicyValue,
+ CosTrading::IllegalPropertyName,
+ CosTrading::DuplicatePropertyName,
+ CosTrading::DuplicatePolicyName))
+{
+ // Instantiate a class to help interpret query policies.
+ TAO_Policies policies (this->trader_, in_policies ACE_ENV_ARG_PARAMETER);
+ ACE_CHECK;
+
+ // If a federated query returns to us, ignore it to prevent
+ // redundant results and infinite loops.
+ CosTrading::Admin::OctetSeq* request_id = 0;
+ int check = this->seen_request_id (policies, request_id ACE_ENV_ARG_PARAMETER);
+ ACE_CHECK;
+
+ if (check)
+ {
+ returned_offers = new CosTrading::OfferSeq;
+ returned_limits_applied = new CosTrading::PolicyNameSeq;
+ return;
+ }
+
+ // The presence of a link interface determines whether we should
+ // attempt to forward or propagate queries.
+ CosTrading::Link_ptr link_if =
+ this->trader_.trading_components ().link_if ();
+
+ // If the importer has specified a starting trader, foward the
+ // query.
+ CosTrading::TraderName* trader_name =
+ policies.starting_trader (ACE_ENV_SINGLE_ARG_PARAMETER);
+ ACE_CHECK;
+
+ if (! CORBA::is_nil (link_if) && trader_name != 0)
+ {
+ CosTrading::PolicySeq policies_to_forward;
+ policies.copy_to_forward (policies_to_forward, *trader_name);
+ const char* next_hop = (*trader_name)[0];
+ this->forward_query (next_hop,
+ type,
+ constraint,
+ preferences,
+ policies_to_forward,
+ desired_props,
+ how_many,
+ returned_offers,
+ returned_offer_iterator,
+ returned_limits_applied
+ ACE_ENV_ARG_PARAMETER);
+ ACE_CHECK;
+ return;
+ }
+
+ // Retrieve the type description struct from the Service Type Repos.
+ const TAO_Support_Attributes_i& support_attrs =
+ this->trader_.support_attributes ();
+ CosTradingRepos::ServiceTypeRepository_ptr rep =
+ support_attrs.service_type_repos ();
+ CosTradingRepos::ServiceTypeRepository::TypeStruct_var type_struct =
+ rep->fully_describe_type (type ACE_ENV_ARG_PARAMETER);
+ ACE_CHECK;
+
+ // @@ Should throw a NO_MEMORY exception here...
+ ACE_NEW (returned_offers,
+ CosTrading::OfferSeq);
+
+ // Obtain a reference to the offer database.
+ TAO_Offer_Database<MAP_LOCK_TYPE>& offer_database =
+ this->trader_.offer_database ();
+
+ // TAO_Offer_Filter -- ensures that we don't consider offers with
+ // modifiable or dynamic properties if the Trader doesn't support
+ // them, or the importer has turned them off using policies.
+ // TAO_Constraint_Validator -- validates the constraint with the
+ // property types in the supplied type. TAO_Constraint_Interpreter
+ // -- parses the constraint string, and determines whether an offer
+ // meets those constraints. TAO_Preference_Interpreter -- parses
+ // the preference string and orders offers according to those
+ // constraints.
+ TAO_Offer_Filter offer_filter (policies
+ ACE_ENV_ARG_PARAMETER);
+ ACE_CHECK;
+ TAO_Trader_Constraint_Validator validator (type_struct.in ());
+ TAO_Constraint_Interpreter constr_inter (validator,
+ constraint
+ ACE_ENV_ARG_PARAMETER);
+ ACE_CHECK;
+ TAO_Preference_Interpreter pref_inter (validator,
+ preferences
+ ACE_ENV_ARG_PARAMETER);
+ ACE_CHECK;
+
+ // Try to find the map of offers of desired service type.
+ offer_filter.configure_type (type_struct.ptr ());
+ this->lookup_one_type (type,
+ offer_database,
+ constr_inter,
+ pref_inter,
+ offer_filter);
+
+ CORBA::Boolean result = policies.exact_type_match (ACE_ENV_SINGLE_ARG_PARAMETER);
+ ACE_CHECK;
+
+ if (!result)
+ {
+ // If the importer hasn't demanded an exact match search, we
+ // search all the subtypes of the supplied type. NOTE: Only the
+ // properties belonging to the provided type are considered on
+ // subtypes. Additional properties on the subtype are generally
+ // ignored. This is as it should be, consistent with the notions
+ // of type inheritence.
+ this->lookup_all_subtypes (type,
+ type_struct->incarnation,
+ offer_database,
+ rep,
+ constr_inter,
+ pref_inter,
+ offer_filter
+ ACE_ENV_ARG_PARAMETER);
+ ACE_CHECK;
+ }
+
+ // Take note of the limits applied in this query.
+ returned_limits_applied = offer_filter.limits_applied ();
+
+ // Fill the return sequence and iterator with the bountiful results.
+ CORBA::ULong offers_returned =
+ this->fill_receptacles (type,
+ how_many,
+ desired_props,
+ policies,
+ pref_inter,
+ *returned_offers.ptr (),
+ returned_offer_iterator
+ ACE_ENV_ARG_PARAMETER);
+ ACE_CHECK;
+
+ // The following steps are only appropriate for a linked trader.
+ if (! CORBA::is_nil (link_if))
+ {
+ // Determine if we should perform a federated query, and if so
+ // construct a sequence of links to follow.
+ CosTrading::LinkNameSeq_var links;
+ CORBA::Boolean should_follow =
+ this->retrieve_links (policies,
+ offers_returned,
+ CosTrading::LinkNameSeq_out (links.out ())
+ ACE_ENV_ARG_PARAMETER);
+ ACE_CHECK;
+
+ if (should_follow && links->length () != 0)
+ {
+ // Query those links we've accumulated!
+ this->federated_query (links.in (),
+ policies,
+ *request_id,
+ pref_inter,
+ type,
+ constraint,
+ preferences,
+ desired_props,
+ how_many,
+ *returned_offers.ptr (),
+ returned_offer_iterator.ptr (),
+ *returned_limits_applied.ptr ()
+ ACE_ENV_ARG_PARAMETER);
+ ACE_CHECK;
+ }
+ }
+}
+
+template <class TRADER_LOCK_TYPE, class MAP_LOCK_TYPE>
+void
+TAO_Lookup<TRADER_LOCK_TYPE,MAP_LOCK_TYPE>::
+lookup_one_type (const char* type,
+ TAO_Offer_Database<MAP_LOCK_TYPE>& offer_database,
+ TAO_Constraint_Interpreter& constr_inter,
+ TAO_Preference_Interpreter& pref_inter,
+ TAO_Offer_Filter& offer_filter)
+{
+ // Retrieve an iterator over the offers for a given type.
+ // @@ Would have used Offer_Database::offer_iterator for less
+ // coupling between TAO_Lookup and Offer_Database, but g++ barfs on
+ // that.
+#if defined(_MSC_VER)
+ TAO_Offer_Database<MAP_LOCK_TYPE>::offer_iterator
+ offer_iter (type, offer_database);
+#else
+ // MSVC won't grok this for some reason, but it's necessary for the
+ // HP compiler, which seriously requires the typename keyword
+ // here. I apologize if this ifdef offends some ACE users'
+ // sensibilities --- it certainly offends mine.
+ ACE_TYPENAME TAO_Offer_Database<MAP_LOCK_TYPE>::offer_iterator
+ offer_iter (type, offer_database);
+#endif
+
+ while (offer_filter.ok_to_consider_more () &&
+ offer_iter.has_more_offers ())
+ {
+ // For each offer in the iterator, attempt to match it with
+ // the constraints passed to the Query method. If it matches
+ // the constraint, use the TAO_Preference_Interpreter to
+ // order the matched offers with respect to the preference
+ // string passed to the method. All the while the offer
+ // filter ensures we don't exceed the match cardinality
+ // constraints.
+ CosTrading::Offer* offer = offer_iter.get_offer ();
+
+ TAO_Trader_Constraint_Evaluator evaluator (offer);
+ if (offer_filter.ok_to_consider (offer) &&
+ constr_inter.evaluate (evaluator))
+ {
+ // Shove the offer and its id into the preference
+ // ordering object, pref_inter.
+ CosTrading::OfferId offer_id = offer_iter.get_id ();
+ pref_inter.order_offer (evaluator, offer, offer_id);
+ offer_filter.matched_offer ();
+ }
+
+ offer_iter.next_offer ();
+ }
+}
+
+template <class TRADER_LOCK_TYPE, class MAP_LOCK_TYPE>
+void
+TAO_Lookup<TRADER_LOCK_TYPE,MAP_LOCK_TYPE>::
+lookup_all_subtypes (const char* type,
+ CosTradingRepos::ServiceTypeRepository::IncarnationNumber& inc_num,
+ TAO_Offer_Database<MAP_LOCK_TYPE>& offer_database,
+ CosTradingRepos::ServiceTypeRepository_ptr rep,
+ TAO_Constraint_Interpreter& constr_inter,
+ TAO_Preference_Interpreter& pref_inter,
+ TAO_Offer_Filter& offer_filter
+ ACE_ENV_ARG_DECL)
+{
+ // BEGIN SPEC
+ // The trader may return a service offer of a subtype of the "type"
+ // requested. Sub-typing of service types is discussed in "Service
+ // Types" on page 16-4. A service subtype can be described by the
+ // properties of its supertypes. This ensures that a well-formed query
+ // for the "type" is also a well-formed query with respect to any
+ // subtypes. However, if the importer specifies the policy of
+ // exact_type_match = TRUE, then only offers with the exact (no
+ // subtype) service type requested are returned.
+ // END SPEC
+
+ CosTradingRepos::ServiceTypeRepository::SpecifiedServiceTypes sst;
+ CosTradingRepos::ServiceTypeRepository::ServiceTypeNameSeq_var all_types;
+
+ // Optimization: Since a subtype can't have a higher incarnation
+ // number than a supertype, we don't need to consider those
+ // types with lower incarnation numbers.
+ sst.incarnation (inc_num);
+
+ all_types = rep->list_types (sst ACE_ENV_ARG_PARAMETER);
+ ACE_CHECK;
+
+ // Scan all types inserted after the super types. If the transitive
+ // closure of a type's super type relation includes the super type
+ // being considered, then perform a search on that type.
+ CORBA::ULong num_types = all_types->length ();
+ CosTradingRepos::ServiceTypeRepository::TypeStruct_var type_struct;
+ for (CORBA::ULong i = 0;
+ i < num_types && offer_filter.ok_to_consider_more ();
+ i++)
+ {
+ // Obtain a description of the prospective type.
+ type_struct = rep->fully_describe_type (all_types[i]
+ ACE_ENV_ARG_PARAMETER);
+ ACE_CHECK;
+
+ CosTradingRepos::ServiceTypeRepository::ServiceTypeNameSeq&
+ super_types = type_struct->super_types;
+ CORBA::ULong num_super_types = super_types.length ();
+
+ for (CORBA::ULong j = 0; j < num_super_types; j++)
+ {
+ if (ACE_OS::strcmp (type_struct->super_types[j], type) == 0)
+ {
+ // Egads, a subtype! This type has the type passed
+ // to query in its list of super_types.
+ offer_filter.configure_type (type_struct.ptr ());
+ this->lookup_one_type (all_types[i],
+ offer_database,
+ constr_inter,
+ pref_inter,
+ offer_filter);
+ break;
+ }
+ }
+ }
+}
+
+template <class TRADER_LOCK_TYPE, class MAP_LOCK_TYPE>
+int
+TAO_Lookup<TRADER_LOCK_TYPE,MAP_LOCK_TYPE>::
+fill_receptacles (const char* /* type */,
+ CORBA::ULong how_many,
+ const CosTrading::Lookup::SpecifiedProps& desired_props,
+ TAO_Policies& policies,
+ TAO_Preference_Interpreter& pref_inter,
+ CosTrading::OfferSeq& offers,
+ CosTrading::OfferIterator_ptr& offer_itr
+ ACE_ENV_ARG_DECL)
+ ACE_THROW_SPEC ((CosTrading::IllegalPropertyName,
+ CosTrading::DuplicatePropertyName))
+{
+ // BEGIN SPEC
+ // The returned offers are passed back in one of two ways (or a
+ // combination of both). ?The "offers" return result conveys a list
+ // of offers and the "offer_itr" is a reference to an interface at
+ // which offers can be obtained. ?The "how_many" parameter states
+ // how many offers are to be returned via the "offers" result, any
+ // remaining offers are available via the iterator interface. If the
+ // "how_many" exceeds the number of offers to be returned, then the
+ // "offer_itr" will be nil.
+ // END SPEC
+
+ TAO_Property_Filter prop_filter (desired_props ACE_ENV_ARG_PARAMETER);
+ ACE_CHECK_RETURN (0);
+
+ // RETURNING: Calculate how many offers go into the sequence
+ // Calculate how many go into the iterator
+
+ CORBA::ULong return_card = policies.return_card (ACE_ENV_SINGLE_ARG_PARAMETER);
+ ACE_CHECK_RETURN (0);
+
+ CORBA::ULong i = 0;
+ CORBA::ULong size = static_cast<CORBA::ULong> (pref_inter.num_offers ());
+ CORBA::ULong offers_in_sequence = (how_many < size) ? how_many : size;
+ CORBA::ULong offers_in_iterator = size - offers_in_sequence;
+
+ // Ensure the total number of offers returned doesn't exceed return_card.
+ offers_in_sequence = offers_in_sequence > return_card
+ ? return_card
+ : offers_in_sequence;
+
+ return_card -= offers_in_sequence;
+
+ offers_in_iterator = offers_in_iterator > return_card
+ ? return_card
+ : offers_in_iterator;
+
+ CORBA::ULong total_offers = offers_in_sequence + offers_in_iterator;
+ offers.length (offers_in_sequence);
+
+ // Add to the sequence, filtering out the undesired properties.
+ for (i = 0; i < offers_in_sequence; i++)
+ {
+ CosTrading::Offer* offer = 0;
+ CosTrading::OfferId offer_id = 0;
+
+ // Pull the next ordered offer out of the preference
+ // interpreter.
+ pref_inter.remove_offer (offer, offer_id);
+
+ // Filter out the undesired properties.
+ prop_filter.filter_offer (offer, offers[i]);
+ CORBA::string_free (offer_id);
+ }
+
+ // Any remaining offers under the return_card go into iterator
+ if (offers_in_iterator > 0)
+ {
+ // Create an iterator implementation
+ TAO_Offer_Iterator *oi =
+ this->create_offer_iterator (prop_filter);
+
+ // Register it with the POA.
+ offer_itr = oi->_this (ACE_ENV_SINGLE_ARG_PARAMETER);
+ ACE_CHECK_RETURN (total_offers - offers_in_iterator);
+
+ oi->_remove_ref (ACE_ENV_SINGLE_ARG_PARAMETER);
+ ACE_CHECK_RETURN (total_offers - offers_in_iterator);
+
+ // Add to the iterator
+ for (i = 0; i < offers_in_iterator; i++)
+ {
+ CosTrading::Offer* offer = 0;
+ CosTrading::OfferId offer_id = 0;
+
+ // Pull the next ordered offer out of the preference
+ // intrerpreter and add it to the offer iterator.
+ pref_inter.remove_offer (offer, offer_id);
+ oi->add_offer (offer_id, offer);
+ }
+ }
+
+ // Clear the preference intrerpreter of superfluous items.
+ size_t num_offers = pref_inter.num_offers ();
+ for (size_t j = 0; j < num_offers; j++)
+ {
+ CosTrading::Offer* offer = 0;
+ CosTrading::OfferId offer_id = 0;
+
+ pref_inter.remove_offer (offer, offer_id);
+ CORBA::string_free (offer_id);
+ }
+
+ return total_offers;
+}
+
+template <class TRADER_LOCK_TYPE, class MAP_LOCK_TYPE>
+TAO_Offer_Iterator *
+TAO_Lookup<TRADER_LOCK_TYPE,MAP_LOCK_TYPE>::
+create_offer_iterator (const TAO_Property_Filter& pfilter)
+{
+ // This is the factory method that creates the appropriate type of
+ // offer iterator. If there's no Register interface, then we can
+ // just stick the offers directly into an iterator, since these
+ // offers will never be removed from the Trader. If there's a
+ // Register interface, then there's a chance that by the time the
+ // importer calls the next_n method on the iterator that the offer
+ // will have been withdrawn. So the Register_Offer_Iterator retains only
+ // the offer ids, and will recognize when an offer id no longer
+ // identifies an offer in the trader.
+
+ // We pass the property filter to the iterators, so when the iterators
+ // return the offers, they can remove the undesirable properties
+ // from those offers.
+ TAO_Offer_Iterator* iterator = 0;
+
+ if (CORBA::is_nil (this->trader_.trading_components ().register_if ()))
+ ACE_NEW_RETURN (iterator,
+ TAO_Query_Only_Offer_Iterator (pfilter),
+ 0);
+ else
+ ACE_NEW_RETURN (iterator,
+ TAO_Register_Offer_Iterator<MAP_LOCK_TYPE> (this->trader_.offer_database (),
+ pfilter),
+ 0);
+ return iterator;
+}
+
+template <class TRADER_LOCK_TYPE, class MAP_LOCK_TYPE>
+CORBA::Boolean
+TAO_Lookup<TRADER_LOCK_TYPE,MAP_LOCK_TYPE>::
+retrieve_links (TAO_Policies& policies,
+ CORBA::ULong offers_returned,
+ CosTrading::LinkNameSeq_out links
+ ACE_ENV_ARG_DECL)
+ ACE_THROW_SPEC ((CORBA::SystemException,
+ CosTrading::Lookup::PolicyTypeMismatch))
+{
+ CORBA::Boolean should_follow = 0;
+ CosTrading::FollowOption follow_rule = policies.link_follow_rule (ACE_ENV_SINGLE_ARG_PARAMETER);
+ ACE_CHECK_RETURN (should_follow);
+
+ // Determine whether or not a federated query is warranted. A query
+ // is waranted if the follow_rule governing this query is 'always'
+ // or if_no_local and the local query returned nothing.
+ if ((follow_rule == CosTrading::always ||
+ (follow_rule == CosTrading::if_no_local && offers_returned == 0)))
+ {
+ CORBA::ULong hc = policies.hop_count (ACE_ENV_SINGLE_ARG_PARAMETER);
+ ACE_CHECK_RETURN (0);
+
+ if (hc > 0)
+ should_follow = 1;
+ }
+
+ if (should_follow)
+ {
+ // Grab the names of all the links in the trader, and push
+ // the suitable ones onto <valid_links>.
+ CosTrading::Link_ptr link_if =
+ this->trader_.trading_components ().link_if ();
+
+ links = link_if->list_links (ACE_ENV_SINGLE_ARG_PARAMETER);
+ ACE_CHECK_RETURN (0);
+
+ // Determine which of the links registered with the Link
+ // interface are suitable to follow.
+ CORBA::ULong i = 0, j = 0,
+ length = links->length ();
+
+ for (i = 0; i < length; i++)
+ {
+ // Grab the link information.
+ CosTrading::Link::LinkInfo_var
+ link_info (link_if->describe_link (links[i] ACE_ENV_ARG_PARAMETER));
+ ACE_CHECK_RETURN (should_follow);
+
+ // Compute the link follow rule.
+ CosTrading::FollowOption link_rule =
+ policies.link_follow_rule (link_info.in () ACE_ENV_ARG_PARAMETER);
+ ACE_CHECK_RETURN (should_follow);
+
+ // Determine if the link follow rule applies.
+ if (link_rule == CosTrading::always
+ || (link_rule == CosTrading::if_no_local
+ && offers_returned == 0))
+ {
+ // Add the link to the list of links to follow.
+ if (i > j)
+ links[j] = links[i];
+
+ j++;
+ }
+ }
+
+ links->length (j);
+ }
+
+ return should_follow;
+}
+
+template <class TRADER_LOCK_TYPE, class MAP_LOCK_TYPE>
+void
+TAO_Lookup<TRADER_LOCK_TYPE,MAP_LOCK_TYPE>::
+federated_query (const CosTrading::LinkNameSeq& links,
+ const TAO_Policies& policies,
+ const CosTrading::Admin::OctetSeq& request_id,
+ TAO_Preference_Interpreter& pref_inter,
+ const char *type,
+ const char *constr,
+ const char *pref,
+ const CosTrading::Lookup::SpecifiedProps& desired_props,
+ CORBA::ULong how_many,
+ CosTrading::OfferSeq& offers,
+ CosTrading::OfferIterator_ptr& offer_iter,
+ CosTrading::PolicyNameSeq& limits
+ ACE_ENV_ARG_DECL)
+ ACE_THROW_SPEC ((CORBA::SystemException,
+ CosTrading::IllegalServiceType,
+ CosTrading::UnknownServiceType,
+ CosTrading::IllegalConstraint,
+ CosTrading::Lookup::IllegalPreference,
+ CosTrading::Lookup::IllegalPolicyName,
+ CosTrading::Lookup::PolicyTypeMismatch,
+ CosTrading::Lookup::InvalidPolicyValue,
+ CosTrading::IllegalPropertyName,
+ CosTrading::DuplicatePropertyName,
+ CosTrading::DuplicatePolicyName))
+{
+ // The general idea here is this: We've assembled a number of links
+ // to follow, and we'll query each of them in turn. On each query we
+ // adjust the policies for the new trader by reducing the hop_count,
+ // changing the link_follow_rule etc..., and merge the results from
+ // the new query with the results from the previous queries.
+
+ // We'll need the link and admin interfaces for this part of the
+ // federated query. It's ok to get the admin interface without
+ // checking if it's nil, becase the conformance criteria dictate
+ // that a trader can't implement the link interface without the
+ // admin interface.
+ CosTrading::Link_ptr link_interface
+ = this->trader_.trading_components ().link_if ();
+
+ // Begin collecting all the various offer_iterators into a
+ // collection. The end result is a distributed tree of offer
+ // iterators, which if traversed in its entirety is probably hugely
+ // inefficient, but oh well, I can't think of a better solution.
+ TAO_Offer_Iterator_Collection* offer_iter_collection = 0;
+ ACE_NEW (offer_iter_collection,
+ TAO_Offer_Iterator_Collection);
+ offer_iter_collection->add_offer_iterator (offer_iter);
+
+ CosTrading::PolicySeq policies_to_pass;
+ policies.copy_to_pass (policies_to_pass, request_id ACE_ENV_ARG_PARAMETER);
+ ACE_CHECK;
+
+ for (int i = links.length () - 1; i >= 0; i--)
+ {
+ CosTrading::OfferSeq *out_offers = 0;
+ CosTrading::OfferIterator *out_offer_iter = 0;
+ CosTrading::PolicyNameSeq *out_limits = 0;
+
+ ACE_TRY
+ {
+ // Obtain information about the link we're traversing.
+ CosTrading::Link::LinkInfo_var link_info =
+ link_interface->describe_link (links[i] ACE_ENV_ARG_PARAMETER);
+ ACE_TRY_CHECK;
+
+ // Set the link follow policy for the query over the link.
+ policies.copy_in_follow_option (policies_to_pass,
+ link_info.in ()
+ ACE_ENV_ARG_PARAMETER);
+ ACE_TRY_CHECK;
+
+ CosTrading::Lookup_var remote_lookup =
+ CosTrading::Lookup::_duplicate (link_info->target.in ());
+
+ // Perform the federated query.
+ remote_lookup->query (type,
+ constr,
+ pref,
+ policies_to_pass,
+ desired_props,
+ how_many - offers.length (),
+ CosTrading::OfferSeq_out (out_offers),
+ CosTrading::OfferIterator_out (out_offer_iter),
+ CosTrading::PolicyNameSeq_out (out_limits)
+ ACE_ENV_ARG_PARAMETER);
+ ACE_TRY_CHECK;
+
+ CORBA::ULong j = 0;
+ CosTrading::OfferSeq_var out_offers_var (out_offers);
+ CosTrading::PolicyNameSeq_var out_limits_var (out_limits);
+
+ // Add another iterator to the collection.
+ if (! CORBA::is_nil (out_offer_iter))
+ offer_iter_collection->add_offer_iterator (out_offer_iter);
+
+ // Concatenate the limits applied.
+ CORBA::ULong source_length = out_limits->length (),
+ target_length = limits.length (),
+ total_length = source_length + target_length;
+
+ limits.length (total_length);
+ for (j = 0; j < source_length; j++)
+ limits[j + target_length] = out_limits_var[j];
+
+ // Concatenate the sequence offers.
+ source_length = out_offers->length ();
+ target_length = offers.length ();
+ total_length = source_length + target_length;
+
+ offers.length (total_length);
+ for (j = 0; j < source_length; j++)
+ offers[j + target_length] = out_offers_var[j];
+ }
+ ACE_CATCHANY
+ {
+ // Ah, well, this query failed, move on to the next one.
+ }
+ ACE_ENDTRY;
+ // ACE_CHECK;
+ }
+
+ // Sort the sequence in preference order.
+ this->order_merged_sequence (pref_inter, offers);
+
+ // Return the collection of offer iterators.
+ offer_iter = offer_iter_collection->_this (ACE_ENV_SINGLE_ARG_PARAMETER);
+ ACE_CHECK;
+
+ offer_iter_collection->_remove_ref (ACE_ENV_SINGLE_ARG_PARAMETER);
+ ACE_CHECK;
+}
+
+template <class TRADER_LOCK_TYPE, class MAP_LOCK_TYPE>
+void
+TAO_Lookup<TRADER_LOCK_TYPE,MAP_LOCK_TYPE>::
+order_merged_sequence (TAO_Preference_Interpreter& pref_inter,
+ CosTrading::OfferSeq& offers)
+{
+ CORBA::ULong j = 0;
+ CORBA::ULong length = offers.length ();
+
+ // Grab ownership of the offers already in the target sequence.
+ CosTrading::Offer* target_buf = offers.get_buffer (1);
+
+ // Order the sequence.
+ for (j = 0; j < length; j++)
+ pref_inter.order_offer (&target_buf[j]);
+ //pref_inter.order_offer (&offers[j]);
+
+ // Reallocate the sequence.
+ offers.length (length);
+
+ // CosTrading::OfferSeq copy;
+ // copy.length (length);
+
+ // Copy in the ordered offers.
+ for (j = 0; j < length; j++)
+ {
+ CosTrading::Offer* offer = 0;
+ pref_inter.remove_offer (offer);
+ //copy[j] = *offer;
+ offers[j] = *offer;
+ }
+
+ // Release the orphaned memory.
+ CosTrading::OfferSeq::freebuf (target_buf);
+ // offers = copy
+}
+
+template <class TRADER_LOCK_TYPE, class MAP_LOCK_TYPE>
+void
+TAO_Lookup<TRADER_LOCK_TYPE,MAP_LOCK_TYPE>::
+forward_query (const char* next_hop,
+ const char *type,
+ const char *constr,
+ const char *pref,
+ const CosTrading::PolicySeq& policy_seq,
+ const CosTrading::Lookup::SpecifiedProps& desired_props,
+ CORBA::ULong how_many,
+ CosTrading::OfferSeq_out offers,
+ CosTrading::OfferIterator_out offer_itr,
+ CosTrading::PolicyNameSeq_out limits_applied
+ ACE_ENV_ARG_DECL)
+ ACE_THROW_SPEC ((CORBA::SystemException,
+ CosTrading::IllegalServiceType,
+ CosTrading::UnknownServiceType,
+ CosTrading::IllegalConstraint,
+ CosTrading::Lookup::IllegalPreference,
+ CosTrading::Lookup::IllegalPolicyName,
+ CosTrading::Lookup::PolicyTypeMismatch,
+ CosTrading::Lookup::InvalidPolicyValue,
+ CosTrading::IllegalPropertyName,
+ CosTrading::DuplicatePropertyName,
+ CosTrading::DuplicatePolicyName))
+{
+ // Forward this query to the next link in the starting_trader sequence.
+ CosTrading::Link_ptr link_interface
+ = this->trader_.trading_components ().link_if ();
+
+ ACE_TRY
+ {
+ CosTrading::Link::LinkInfo_var link_info =
+ link_interface->describe_link (next_hop ACE_ENV_ARG_PARAMETER);
+ ACE_TRY_CHECK;
+
+ CosTrading::Lookup_var remote_lookup =
+ CosTrading::Lookup::_duplicate (link_info->target.in ());
+
+ CORBA::Object_var us = this->_this (ACE_ENV_SINGLE_ARG_PARAMETER);
+ ACE_TRY_CHECK;
+
+ CORBA::Boolean self_loop =
+ remote_lookup->_is_equivalent (us.in () ACE_ENV_ARG_PARAMETER);
+ ACE_TRY_CHECK;
+
+ if (! self_loop)
+ {
+ // Perform forwarding query.
+ remote_lookup->query (type,
+ constr,
+ pref,
+ policy_seq,
+ desired_props,
+ how_many,
+ offers,
+ offer_itr,
+ limits_applied
+ ACE_ENV_ARG_PARAMETER);
+ ACE_TRY_CHECK;
+ }
+ else
+ {
+ this->query (type,
+ constr,
+ pref,
+ policy_seq,
+ desired_props,
+ how_many,
+ offers,
+ offer_itr,
+ limits_applied
+ ACE_ENV_ARG_PARAMETER);
+ ACE_TRY_CHECK;
+ }
+ }
+ ACE_CATCHANY
+ {
+ CosTrading::Policy policy;
+ policy.name = TAO_Policies::POLICY_NAMES[TAO_Policies::STARTING_TRADER];
+ policy.value <<= next_hop;
+ ACE_TRY_THROW (CosTrading::Lookup::InvalidPolicyValue (policy));
+ }
+ ACE_ENDTRY;
+ // ACE_CHECK;
+}
+
+template <class TRADER_LOCK_TYPE, class MAP_LOCK_TYPE>
+CORBA::Boolean
+TAO_Lookup<TRADER_LOCK_TYPE,MAP_LOCK_TYPE>::
+seen_request_id (TAO_Policies& policies,
+ CosTrading::Admin::OctetSeq*& seq
+ ACE_ENV_ARG_DECL)
+ ACE_THROW_SPEC ((CORBA::SystemException,
+ CosTrading::Lookup::PolicyTypeMismatch))
+{
+ CORBA::Boolean return_value = 0;
+
+ seq = policies.request_id (ACE_ENV_SINGLE_ARG_PARAMETER);
+ ACE_CHECK_RETURN (1);
+
+ if (seq == 0)
+ {
+ CosTrading::Admin_ptr admin_if =
+ this->trader_.trading_components ().admin_if ();
+ seq = admin_if->request_id_stem (ACE_ENV_SINGLE_ARG_PARAMETER);
+ ACE_CHECK_RETURN (1);
+ }
+ else
+ {
+ // Allocate memory so memory mangement is the same for both
+ // cases.
+ ACE_NEW_THROW_EX (seq,
+ CosTrading::Admin::OctetSeq (*seq),
+ CORBA::NO_MEMORY ());
+ ACE_CHECK_RETURN (1);
+ }
+
+ ACE_GUARD_RETURN (TRADER_LOCK_TYPE, trader_mon, this->lock_, 1);
+
+ for (Request_Ids::ITERATOR riter (this->request_ids_);
+ ! riter.done ();
+ riter.advance ())
+ {
+ CosTrading::Admin::OctetSeq** old_seq = 0;
+ riter.next (old_seq);
+
+ if (**old_seq == *seq)
+ {
+ return_value = 1;
+ break;
+ }
+ }
+
+ if (return_value == 0)
+ {
+ if (this->request_ids_.size () == IDS_SAVED)
+ {
+ CosTrading::Admin::OctetSeq* octet_seq = 0;
+ this->request_ids_.dequeue_head (octet_seq);
+ delete octet_seq;
+ }
+
+ this->request_ids_.enqueue_tail (seq);
+ }
+
+ return return_value;
+}
+
+template <class TRADER_LOCK_TYPE, class MAP_LOCK_TYPE>
+TAO_Register<TRADER_LOCK_TYPE,MAP_LOCK_TYPE>::TAO_Register (TAO_Trader<TRADER_LOCK_TYPE,MAP_LOCK_TYPE> &trader)
+ : TAO_Trader_Components<POA_CosTrading::Register> (trader.trading_components ()),
+ TAO_Support_Attributes<POA_CosTrading::Register> (trader.support_attributes ()),
+ trader_ (trader)
+{
+}
+
+template <class TRADER_LOCK_TYPE, class MAP_LOCK_TYPE>
+TAO_Register<TRADER_LOCK_TYPE,MAP_LOCK_TYPE>::~TAO_Register (void)
+{
+}
+
+template <class TRADER_LOCK_TYPE, class MAP_LOCK_TYPE>
+CosTrading::OfferId
+TAO_Register<TRADER_LOCK_TYPE,MAP_LOCK_TYPE>::
+_cxx_export (CORBA::Object_ptr reference,
+ const char *type,
+ const CosTrading::PropertySeq &properties
+ ACE_ENV_ARG_DECL)
+ ACE_THROW_SPEC ((CORBA::SystemException,
+ CosTrading::Register::InvalidObjectRef,
+ CosTrading::IllegalServiceType,
+ CosTrading::UnknownServiceType,
+ CosTrading::Register::InterfaceTypeMismatch,
+ CosTrading::IllegalPropertyName,
+ CosTrading::PropertyTypeMismatch,
+ CosTrading::ReadonlyDynamicProperty,
+ CosTrading::MissingMandatoryProperty,
+ CosTrading::DuplicatePropertyName))
+{
+ // For robustness purposes --
+ if (CORBA::is_nil (reference))
+ ACE_THROW_RETURN (CosTrading::Register::InvalidObjectRef (), 0);
+
+ // Get service type map
+ TAO_Offer_Database<MAP_LOCK_TYPE> &offer_database = this->trader_.offer_database ();
+
+ CosTrading::Offer* offer = 0;
+ TAO_Support_Attributes_i& support_attrs =
+ this->trader_.support_attributes ();
+ CosTradingRepos::ServiceTypeRepository_ptr rep =
+ support_attrs.service_type_repos ();
+
+ // Yank our friend, the type struct, and confirm that the given
+ // properties match the type definition.
+ CosTradingRepos::ServiceTypeRepository::TypeStruct_var type_struct =
+ rep->fully_describe_type (type ACE_ENV_ARG_PARAMETER);
+ ACE_CHECK_RETURN (0);
+
+ // Oops the type is masked, we shouldn't let exporters know the type
+ // exists.
+ if (type_struct->masked)
+ ACE_THROW_RETURN (CosTrading::UnknownServiceType (type), 0);
+
+ // TAO-specific way to determine if an object is derived from or is
+ // an interface type.
+ int check = (! reference->_is_a (type_struct->if_name ACE_ENV_ARG_PARAMETER));
+ ACE_CHECK_RETURN (0);
+ if (check)
+ ACE_THROW_RETURN (CosTrading::Register::
+ InterfaceTypeMismatch (type, reference), 0);
+
+ // Validate that the properties defined for this offer are correct
+ // to their types and strength.
+ this->validate_properties (type, type_struct.ptr (), properties ACE_ENV_ARG_PARAMETER);
+ ACE_CHECK_RETURN (0);
+
+ // CORBA::ULong plength = properties.length ();
+ ACE_NEW_THROW_EX (offer, CosTrading::Offer, CORBA::NO_MEMORY ());
+ ACE_CHECK_RETURN (0);
+
+ // No copying, no memory leaks. Violates the "in" parameter semantics
+ // when this object is colocated with the client, however.
+ // CosTrading::PropertySeq* hack_seq =
+ // const_cast<CosTrading::PropertySeq*> (&properties);
+ // CosTrading::Property* pbuf = hack_seq->get_buffer (1);
+
+ // CosTrading::PropertySeq* hack_seq =
+ // const_cast<CosTrading::PropertySeq*> (&properties);
+ // CosTrading::Property* pbuf = hack_seq->get_buffer (0);
+ // offer->properties.replace (plength, plength, pbuf, 0);
+ // offer->properties._allocate_buffer (plength);
+ offer->properties = properties;
+ offer->reference = reference->_duplicate (reference);
+
+ // Insert the offer into the underlying type map.
+ CosTrading::OfferId id = offer_database.insert_offer (type, offer);
+
+ return id;
+}
+
+template <class TRADER_LOCK_TYPE, class MAP_LOCK_TYPE>
+void
+TAO_Register<TRADER_LOCK_TYPE,MAP_LOCK_TYPE>::
+withdraw (const char *id
+ ACE_ENV_ARG_DECL)
+ ACE_THROW_SPEC ((CORBA::SystemException,
+ CosTrading::IllegalOfferId,
+ CosTrading::UnknownOfferId,
+ CosTrading::Register::ProxyOfferId))
+{
+ // Get service type map.
+ TAO_Offer_Database<MAP_LOCK_TYPE> &offer_database = this->trader_.offer_database ();
+ offer_database.remove_offer ((CosTrading::OfferId) id ACE_ENV_ARG_PARAMETER);
+}
+
+template <class TRADER_LOCK_TYPE, class MAP_LOCK_TYPE>
+CosTrading::Register::OfferInfo *
+TAO_Register<TRADER_LOCK_TYPE,MAP_LOCK_TYPE>::
+describe (const char *id
+ ACE_ENV_ARG_DECL)
+ ACE_THROW_SPEC ((CORBA::SystemException,
+ CosTrading::IllegalOfferId,
+ CosTrading::UnknownOfferId,
+ CosTrading::Register::ProxyOfferId))
+{
+ // Get service type map.
+ char* type = 0;
+ TAO_Offer_Database<MAP_LOCK_TYPE> &offer_database = this->trader_.offer_database ();
+
+ // Perform a lookup to find the offer.
+ CosTrading::Offer* offer =
+ offer_database.lookup_offer ((CosTrading::OfferId) id, type ACE_ENV_ARG_PARAMETER);
+ ACE_CHECK_RETURN (0);
+
+ CosTrading::Register::OfferInfo *offer_info = 0;
+ ACE_NEW_THROW_EX (offer_info, CosTrading::Register::OfferInfo, CORBA::NO_MEMORY ());
+ ACE_CHECK_RETURN (0);
+
+ offer_info->reference = CORBA::Object::_duplicate (offer->reference.in ());
+ offer_info->type = CORBA::string_dup (type);
+
+ // Let the offer_info prop_seq "borrow" the sequence of properties.
+ //CORBA::ULong length = offer->properties.length ();
+ // CosTrading::Property* prop_buf = offer->properties.get_buffer ();
+ offer_info->properties = offer->properties;
+
+ return offer_info;
+}
+
+template <class TRADER_LOCK_TYPE, class MAP_LOCK_TYPE>
+void
+TAO_Register<TRADER_LOCK_TYPE,MAP_LOCK_TYPE>::
+modify (const char *id,
+ const CosTrading::PropertyNameSeq& del_list,
+ const CosTrading::PropertySeq& modify_list
+ ACE_ENV_ARG_DECL)
+ ACE_THROW_SPEC ((CORBA::SystemException,
+ CosTrading::NotImplemented,
+ CosTrading::IllegalOfferId,
+ CosTrading::UnknownOfferId,
+ CosTrading::Register::ProxyOfferId,
+ CosTrading::IllegalPropertyName,
+ CosTrading::Register::UnknownPropertyName,
+ CosTrading::PropertyTypeMismatch,
+ CosTrading::ReadonlyDynamicProperty,
+ CosTrading::Register::MandatoryProperty,
+ CosTrading::Register::ReadonlyProperty,
+ CosTrading::DuplicatePropertyName))
+{
+ // Throw an exception if the trader is not configured
+ // to support properties modification.
+ int check = (! this->supports_modifiable_properties (ACE_ENV_SINGLE_ARG_PARAMETER));
+ ACE_CHECK;
+
+ if (check)
+ ACE_THROW (CosTrading::NotImplemented ());
+
+ char* type = 0;
+ TAO_Support_Attributes_i& support_attrs =
+ this->trader_.support_attributes ();
+ CosTradingRepos::ServiceTypeRepository_ptr rep =
+ support_attrs.service_type_repos ();
+ TAO_Offer_Database<MAP_LOCK_TYPE> &offer_database = this->trader_.offer_database ();
+
+ CosTrading::Offer* offer = offer_database.
+ lookup_offer (const_cast<CosTrading::OfferId> (id), type ACE_ENV_ARG_PARAMETER);
+ ACE_CHECK;
+
+ if (offer != 0)
+ {
+ // Yank our friend, the type struct.
+ CosTradingRepos::ServiceTypeRepository::TypeStruct_var type_struct =
+ rep->fully_describe_type (type ACE_ENV_ARG_PARAMETER);
+ ACE_CHECK;
+ TAO_Offer_Modifier offer_mod (type, type_struct.in (), offer);
+
+ // Delete, add, and change properties of the offer.
+ offer_mod.delete_properties (del_list ACE_ENV_ARG_PARAMETER);
+ ACE_CHECK;
+
+ offer_mod.merge_properties (modify_list ACE_ENV_ARG_PARAMETER);
+ ACE_CHECK;
+
+ // Alter our reference to the offer. We do this last, since the
+ // spec says: modify either suceeds completely or fails
+ // completely.
+ offer_mod.affect_change (modify_list);
+ }
+}
+
+template <class TRADER_LOCK_TYPE, class MAP_LOCK_TYPE>
+void
+TAO_Register<TRADER_LOCK_TYPE,MAP_LOCK_TYPE>::
+withdraw_using_constraint (const char *type,
+ const char *constr
+ ACE_ENV_ARG_DECL)
+ ACE_THROW_SPEC ((CORBA::SystemException,
+ CosTrading::IllegalServiceType,
+ CosTrading::UnknownServiceType,
+ CosTrading::IllegalConstraint,
+ CosTrading::Register::NoMatchingOffers))
+{
+ TAO_Support_Attributes_i&
+ support_attrs = this->trader_.support_attributes ();
+ CosTradingRepos::ServiceTypeRepository_ptr rep =
+ support_attrs.service_type_repos ();
+ TAO_Offer_Database<MAP_LOCK_TYPE> &offer_database = this->trader_.offer_database ();
+ CORBA::Boolean dp_support = support_attrs.supports_dynamic_properties ();
+ TAO_String_Queue ids;
+
+ // Retrieve the type struct
+ CosTradingRepos::ServiceTypeRepository::TypeStruct_var type_struct =
+ rep->fully_describe_type (type ACE_ENV_ARG_PARAMETER);
+ ACE_CHECK;
+
+ // Try to find the map of offers of desired service type.
+ // @@ Again, should be Offer_Database::offer_iterator
+ {
+#if defined (_MSC_VER)
+ TAO_Offer_Database<MAP_LOCK_TYPE>::offer_iterator
+ offer_iter (type, offer_database);
+#else
+ // MSVC won't grok this for some reason, but it's necessary for
+ // the HP compiler, which seriously requires the typename keyword
+ // here. I apologize if this ifdef offends some ACE users'
+ // sensibilities --- it certainly offends mine.
+ ACE_TYPENAME TAO_Offer_Database<MAP_LOCK_TYPE>::offer_iterator
+ offer_iter (type, offer_database);
+#endif /* _MSC_VER */
+
+ TAO_Trader_Constraint_Validator validator (type_struct.in ());
+ TAO_Constraint_Interpreter constr_inter (validator, constr ACE_ENV_ARG_PARAMETER);
+ ACE_CHECK;
+
+ while (offer_iter.has_more_offers ())
+ {
+ CosTrading::Offer* offer = offer_iter.get_offer ();
+ // Add offer if it matches the constraints
+
+ TAO_Trader_Constraint_Evaluator evaluator (offer, dp_support);
+ if (constr_inter.evaluate (evaluator))
+ ids.enqueue_tail (offer_iter.get_id ());
+
+ offer_iter.next_offer ();
+ }
+ }
+
+ if (ids.size () != 0)
+ {
+ while (! ids.is_empty ())
+ {
+ char* offer_id = 0;
+
+ ids.dequeue_head (offer_id);
+ offer_database.remove_offer (offer_id ACE_ENV_ARG_PARAMETER);
+ ACE_CHECK;
+ CORBA::string_free (offer_id);
+ }
+ }
+ else
+ ACE_THROW (CosTrading::Register::NoMatchingOffers (constr));
+}
+
+template <class TRADER_LOCK_TYPE, class MAP_LOCK_TYPE>
+CosTrading::Register_ptr
+TAO_Register<TRADER_LOCK_TYPE,MAP_LOCK_TYPE>::
+resolve (const CosTrading::TraderName &name
+ ACE_ENV_ARG_DECL)
+ ACE_THROW_SPEC ((CORBA::SystemException,
+ CosTrading::Register::IllegalTraderName,
+ CosTrading::Register::UnknownTraderName,
+ CosTrading::Register::RegisterNotSupported))
+{
+ // Determine if the first link is a legal link name.
+ if (! TAO_Trader_Base::is_valid_link_name (name[0]))
+ ACE_THROW_RETURN (CosTrading::Register::IllegalTraderName (name),
+ CosTrading::Register::_nil ());
+
+ // Grab a reference to the link interface, and get a link description.
+ CosTrading::Link_ptr link_if =
+ this->trader_.trading_components ().link_if ();
+
+ // Ensure that the link interface is supported.
+ if (! CORBA::is_nil (link_if))
+ return CosTrading::Register::_nil ();
+
+ CosTrading::Link::LinkInfo_var link_info;
+ CosTrading::Register_var remote_reg;
+
+ ACE_TRY
+ {
+ // Ensure that the link to the next trader exists.
+ link_info = link_if->describe_link (name[0] ACE_ENV_ARG_PARAMETER);
+ ACE_TRY_CHECK;
+
+ remote_reg =
+ CosTrading::Register::_narrow (link_info->target_reg.in () ACE_ENV_ARG_PARAMETER);
+ ACE_TRY_CHECK;
+ }
+ ACE_CATCHANY
+ {
+ ACE_TRY_THROW (CosTrading::Register::UnknownTraderName (name));
+ }
+ ACE_ENDTRY;
+ ACE_CHECK_RETURN (CosTrading::Register::_nil ());
+
+ // Ensure that the register pointer isn't nil.
+ if (! CORBA::is_nil (remote_reg.in ()))
+ ACE_THROW_RETURN (CosTrading::Register::RegisterNotSupported (name),
+ CosTrading::Register::_nil ());
+
+ CosTrading::Register_ptr return_value = remote_reg.in ();
+
+ if (name.length () > 1)
+ {
+ // Create a new Trader Name with the first link removed.
+ CosTrading::TraderName trader_name (name.length () - 1);
+ for (int i = trader_name.length () - 1; i >= 0; i--)
+ trader_name[i] = name[i + 1];
+
+ return_value = remote_reg->resolve (trader_name ACE_ENV_ARG_PARAMETER);
+ ACE_CHECK_RETURN (CosTrading::Register::_nil ());
+ }
+
+ return return_value;
+}
+
+template <class TRADER_LOCK_TYPE, class MAP_LOCK_TYPE>
+void
+TAO_Register<TRADER_LOCK_TYPE,MAP_LOCK_TYPE>::
+validate_properties (const char* type,
+ const CosTradingRepos::ServiceTypeRepository::TypeStruct* type_struct,
+ const CosTrading::PropertySeq& properties
+ ACE_ENV_ARG_DECL)
+ ACE_THROW_SPEC ((CosTrading::IllegalPropertyName,
+ CosTrading::PropertyTypeMismatch,
+ CosTrading::ReadonlyDynamicProperty,
+ CosTrading::MissingMandatoryProperty,
+ CosTrading::DuplicatePropertyName))
+{
+ CORBA::ULong length = properties.length ();
+ const CosTradingRepos::ServiceTypeRepository::PropStructSeq&
+ prop_types = type_struct->props;
+ TAO_Property_Evaluator_By_Name prop_eval (properties ACE_ENV_ARG_PARAMETER);
+ ACE_CHECK;
+
+ // Perform property validation
+ length = prop_types.length ();
+
+ for (CORBA::ULong i = 0; i < length; i++)
+ {
+ const CosTradingRepos::ServiceTypeRepository::PropStruct&
+ prop_struct = prop_types[i];
+ const char* prop_name = prop_struct.name;
+
+ // Obtain the type of the exported property.
+ CORBA::TypeCode_var prop_type = prop_eval.property_type (prop_name);
+
+ if (CORBA::is_nil (prop_type.in ()))
+ {
+ // Offer cannot have a missing mandatory property.
+ if (prop_types[i].mode ==
+ CosTradingRepos::ServiceTypeRepository::PROP_MANDATORY)
+ ACE_THROW (CosTrading::MissingMandatoryProperty (type, prop_name));
+ }
+ else
+ {
+ int check =
+ (! prop_type->equal (prop_struct.value_type.in ()
+ ACE_ENV_ARG_PARAMETER));
+ ACE_CHECK;
+ if (check)
+ {
+ // Offer cannot redefine the type of an property.
+ const CosTrading::Property* prop =
+ prop_eval.get_property (prop_name);
+ ACE_THROW (CosTrading::PropertyTypeMismatch (type, *prop));
+ }
+ else if (prop_struct.mode ==
+ CosTradingRepos::ServiceTypeRepository::PROP_READONLY &&
+ prop_eval.is_dynamic_property (prop_name))
+ ACE_THROW (CosTrading::ReadonlyDynamicProperty (type, prop_name));
+ }
+ }
+}
+
+template <class TRADER_LOCK_TYPE, class MAP_LOCK_TYPE>
+TAO_Admin<TRADER_LOCK_TYPE,MAP_LOCK_TYPE>::
+TAO_Admin (TAO_Trader<TRADER_LOCK_TYPE,MAP_LOCK_TYPE> &trader)
+ : TAO_Trader_Components <POA_CosTrading::Admin> (trader.trading_components ()),
+ TAO_Support_Attributes <POA_CosTrading::Admin> (trader.support_attributes ()),
+ TAO_Import_Attributes <POA_CosTrading::Admin> (trader.import_attributes ()),
+ TAO_Link_Attributes <POA_CosTrading::Admin> (trader.link_attributes ()),
+ trader_ (trader),
+ sequence_number_ (0)
+{
+ // A random 4-bytes will prefix the sequence number space for each
+ // trader, making it extremely unlikely that the sequence spaces for
+ // two traders will over lap. @@ TODO: This is a bad way to
+ // generate pseudo random numbers.
+
+ // Ok, then, Carlos, we'll do it a different way: ip addr + pid.
+ ACE_UINT32 ip_addr = 0;
+ ACE_TCHAR host_name[BUFSIZ];
+
+ if (ACE_OS::hostname (host_name,
+ BUFSIZ) != -1)
+ {
+ ACE_INET_Addr addr ((u_short) 0, host_name);
+ ip_addr = addr.get_ip_address ();
+ }
+ // The better way to do unique stem identifiers.
+ this->stem_id_.length (12);
+
+ if (ip_addr != 0)
+ {
+ pid_t pid = ACE_OS::getpid ();
+ this->stem_id_[0] = static_cast<CORBA::Octet> ((ip_addr >> 24) & 0xff);
+ this->stem_id_[1] = static_cast<CORBA::Octet> ((ip_addr >> 16) & 0xff);
+ this->stem_id_[2] = static_cast<CORBA::Octet> ((ip_addr >> 8) & 0xff);
+ this->stem_id_[3] = static_cast<CORBA::Octet> (ip_addr & 0xff);
+ this->stem_id_[4] = static_cast<CORBA::Octet> ((pid >> 24) & 0xff);
+ this->stem_id_[5] = static_cast<CORBA::Octet> ((pid >> 16) & 0xff);
+ this->stem_id_[6] = static_cast<CORBA::Octet> ((pid >> 8) & 0xff);
+ this->stem_id_[7] = static_cast<CORBA::Octet> (pid & 0xff);
+ }
+
+ // The default way -- eight random integers.
+ else
+ {
+ time_t time_value = ACE_OS::time ();
+ ACE_OS::srand (static_cast<u_int> (time_value));
+
+ this->stem_id_[0] = static_cast<CORBA::Octet> (ACE_OS::rand () % 256);
+ this->stem_id_[1] = static_cast<CORBA::Octet> (ACE_OS::rand () % 256);
+ this->stem_id_[2] = static_cast<CORBA::Octet> (ACE_OS::rand () % 256);
+ this->stem_id_[3] = static_cast<CORBA::Octet> (ACE_OS::rand () % 256);
+ this->stem_id_[4] = static_cast<CORBA::Octet> (ACE_OS::rand () % 256);
+ this->stem_id_[5] = static_cast<CORBA::Octet> (ACE_OS::rand () % 256);
+ this->stem_id_[6] = static_cast<CORBA::Octet> (ACE_OS::rand () % 256);
+ this->stem_id_[7] = static_cast<CORBA::Octet> (ACE_OS::rand () % 256);
+ }
+}
+
+template <class TRADER_LOCK_TYPE, class MAP_LOCK_TYPE>
+TAO_Admin<TRADER_LOCK_TYPE,MAP_LOCK_TYPE>::~TAO_Admin (void)
+{
+}
+
+template <class TRADER_LOCK_TYPE, class MAP_LOCK_TYPE>
+CosTrading::Admin::OctetSeq *
+TAO_Admin<TRADER_LOCK_TYPE,MAP_LOCK_TYPE>::request_id_stem (ACE_ENV_SINGLE_ARG_DECL_NOT_USED)
+ ACE_THROW_SPEC ((CORBA::SystemException))
+{
+ ACE_GUARD_RETURN (TRADER_LOCK_TYPE, trader_mon, this->lock_, 0);
+
+ // Add one to the sequence_number and concatenate it to the unique
+ // prefix. The sequence number is four octets long, the unique
+ // prefix, also 4 bytes long.
+
+ this->stem_id_[8] = static_cast<CORBA::Octet> (this->sequence_number_ & 0xff);
+ this->stem_id_[9] = static_cast<CORBA::Octet> ((this->sequence_number_ >> 8) & 0xff);
+ this->stem_id_[10] = static_cast<CORBA::Octet> ((this->sequence_number_ >> 16) & 0xff);
+ this->stem_id_[11] = static_cast<CORBA::Octet> ((this->sequence_number_ >> 24) & 0xff);
+
+ // Increment the sequence number and return a copy of the stem_id.
+ this->sequence_number_++;
+ return new CosTrading::Admin::OctetSeq (this->stem_id_);
+}
+
+template <class TRADER_LOCK_TYPE, class MAP_LOCK_TYPE>
+CORBA::ULong
+TAO_Admin<TRADER_LOCK_TYPE,MAP_LOCK_TYPE>::
+set_def_search_card (CORBA::ULong value
+ ACE_ENV_ARG_DECL_NOT_USED )
+ ACE_THROW_SPEC ((CORBA::SystemException))
+{
+ CORBA::ULong return_value =
+ this->trader_.import_attributes ().def_search_card ();
+
+ this->trader_.import_attributes ().def_search_card (value);
+ return return_value;
+}
+
+template <class TRADER_LOCK_TYPE, class MAP_LOCK_TYPE>
+CORBA::ULong
+TAO_Admin<TRADER_LOCK_TYPE,MAP_LOCK_TYPE>::
+set_max_search_card (CORBA::ULong value
+ ACE_ENV_ARG_DECL_NOT_USED )
+ ACE_THROW_SPEC ((CORBA::SystemException))
+{
+ CORBA::ULong return_value =
+ this->trader_.import_attributes ().max_search_card ();
+
+ this->trader_.import_attributes ().max_search_card (value);
+ return return_value;
+}
+
+template <class TRADER_LOCK_TYPE, class MAP_LOCK_TYPE>
+CORBA::ULong
+TAO_Admin<TRADER_LOCK_TYPE,MAP_LOCK_TYPE>::
+set_def_match_card (CORBA::ULong value
+ ACE_ENV_ARG_DECL_NOT_USED )
+ ACE_THROW_SPEC ((CORBA::SystemException))
+{
+ CORBA::ULong return_value =
+ this->trader_.import_attributes ().def_match_card ();
+
+ this->trader_.import_attributes ().def_match_card (value);
+ return return_value;
+}
+
+template <class TRADER_LOCK_TYPE, class MAP_LOCK_TYPE>
+CORBA::ULong
+TAO_Admin<TRADER_LOCK_TYPE,MAP_LOCK_TYPE>::
+set_max_match_card (CORBA::ULong value
+ ACE_ENV_ARG_DECL_NOT_USED )
+ ACE_THROW_SPEC ((CORBA::SystemException))
+{
+ CORBA::ULong return_value =
+ this->trader_.import_attributes ().max_match_card ();
+
+ this->trader_.import_attributes ().max_match_card (value);
+ return return_value;
+}
+
+template <class TRADER_LOCK_TYPE, class MAP_LOCK_TYPE>
+CORBA::ULong
+TAO_Admin<TRADER_LOCK_TYPE,MAP_LOCK_TYPE>::
+set_def_return_card (CORBA::ULong value
+ ACE_ENV_ARG_DECL_NOT_USED )
+ ACE_THROW_SPEC ((CORBA::SystemException))
+{
+ CORBA::ULong return_value =
+ this->trader_.import_attributes ().def_return_card ();
+
+ this->trader_.import_attributes ().def_return_card (value);
+ return return_value;
+}
+
+template <class TRADER_LOCK_TYPE, class MAP_LOCK_TYPE>
+CORBA::ULong
+TAO_Admin<TRADER_LOCK_TYPE,MAP_LOCK_TYPE>::
+set_max_return_card (CORBA::ULong value
+ ACE_ENV_ARG_DECL_NOT_USED )
+ ACE_THROW_SPEC ((CORBA::SystemException))
+{
+ CORBA::ULong return_value =
+ this->trader_.import_attributes ().max_return_card ();
+
+ this->trader_.import_attributes ().max_return_card (value);
+ return return_value;
+}
+
+template <class TRADER_LOCK_TYPE, class MAP_LOCK_TYPE>
+CORBA::ULong
+TAO_Admin<TRADER_LOCK_TYPE,MAP_LOCK_TYPE>::
+set_max_list (CORBA::ULong value
+ ACE_ENV_ARG_DECL_NOT_USED )
+ ACE_THROW_SPEC ((CORBA::SystemException))
+{
+ CORBA::ULong return_value =
+ this->trader_.import_attributes ().max_list ();
+
+ this->trader_.import_attributes ().max_list (value);
+ return return_value;
+}
+
+template <class TRADER_LOCK_TYPE, class MAP_LOCK_TYPE>
+CORBA::Boolean
+TAO_Admin<TRADER_LOCK_TYPE,MAP_LOCK_TYPE>::
+set_supports_modifiable_properties (CORBA::Boolean value
+ ACE_ENV_ARG_DECL_NOT_USED )
+ ACE_THROW_SPEC ((CORBA::SystemException))
+{
+ CORBA::Boolean return_value =
+ this->trader_.support_attributes ().supports_modifiable_properties ();
+
+ this->trader_.support_attributes ().supports_modifiable_properties (value);
+ return return_value;
+}
+
+template <class TRADER_LOCK_TYPE, class MAP_LOCK_TYPE>
+CORBA::Boolean
+TAO_Admin<TRADER_LOCK_TYPE,MAP_LOCK_TYPE>::
+set_supports_dynamic_properties (CORBA::Boolean value
+ ACE_ENV_ARG_DECL_NOT_USED )
+ ACE_THROW_SPEC ((CORBA::SystemException))
+{
+ CORBA::Boolean return_value =
+ this->trader_.support_attributes ().supports_dynamic_properties ();
+
+ this->trader_.support_attributes ().supports_dynamic_properties (value);
+ return return_value;
+}
+
+template <class TRADER_LOCK_TYPE, class MAP_LOCK_TYPE>
+CORBA::Boolean
+TAO_Admin<TRADER_LOCK_TYPE,MAP_LOCK_TYPE>::
+set_supports_proxy_offers (CORBA::Boolean value
+ ACE_ENV_ARG_DECL_NOT_USED )
+ ACE_THROW_SPEC ((CORBA::SystemException))
+{
+ CORBA::Boolean return_value =
+ this->trader_.support_attributes ().supports_proxy_offers ();
+
+ this->trader_.support_attributes ().supports_proxy_offers (value);
+ return return_value;
+}
+
+template <class TRADER_LOCK_TYPE, class MAP_LOCK_TYPE>
+CORBA::ULong
+TAO_Admin<TRADER_LOCK_TYPE,MAP_LOCK_TYPE>::
+set_def_hop_count (CORBA::ULong value
+ ACE_ENV_ARG_DECL_NOT_USED )
+ ACE_THROW_SPEC ((CORBA::SystemException))
+{
+ CORBA::ULong return_value =
+ this->trader_.import_attributes ().def_hop_count ();
+
+ this->trader_.import_attributes ().def_hop_count (value);
+ return return_value;
+}
+
+template <class TRADER_LOCK_TYPE, class MAP_LOCK_TYPE>
+CORBA::ULong
+TAO_Admin<TRADER_LOCK_TYPE,MAP_LOCK_TYPE>::
+set_max_hop_count (CORBA::ULong value
+ ACE_ENV_ARG_DECL_NOT_USED )
+ ACE_THROW_SPEC ((CORBA::SystemException))
+{
+ CORBA::ULong return_value =
+ this->trader_.import_attributes ().max_hop_count ();
+
+ this->trader_.import_attributes ().max_hop_count (value);
+ return return_value;
+}
+
+template <class TRADER_LOCK_TYPE, class MAP_LOCK_TYPE>
+CosTrading::FollowOption
+TAO_Admin<TRADER_LOCK_TYPE,MAP_LOCK_TYPE>::
+set_def_follow_policy (CosTrading::FollowOption policy
+ ACE_ENV_ARG_DECL_NOT_USED )
+ ACE_THROW_SPEC ((CORBA::SystemException))
+{
+ CosTrading::FollowOption return_value =
+ this->trader_.import_attributes ().def_follow_policy ();
+
+ this->trader_.import_attributes ().def_follow_policy (policy);
+ return return_value;
+}
+
+template <class TRADER_LOCK_TYPE, class MAP_LOCK_TYPE>
+CosTrading::FollowOption
+TAO_Admin<TRADER_LOCK_TYPE,MAP_LOCK_TYPE>::
+set_max_follow_policy (CosTrading::FollowOption policy
+ ACE_ENV_ARG_DECL_NOT_USED )
+ ACE_THROW_SPEC ((CORBA::SystemException))
+{
+ CosTrading::FollowOption return_value =
+ this->trader_.import_attributes ().max_follow_policy ();
+
+ this->trader_.import_attributes ().max_follow_policy (policy);
+ return return_value;
+}
+
+template <class TRADER_LOCK_TYPE, class MAP_LOCK_TYPE>
+CosTrading::FollowOption
+TAO_Admin<TRADER_LOCK_TYPE,MAP_LOCK_TYPE>::
+set_max_link_follow_policy (CosTrading::FollowOption policy
+ ACE_ENV_ARG_DECL_NOT_USED)
+ ACE_THROW_SPEC ((CORBA::SystemException))
+{
+ CosTrading::FollowOption return_value =
+ this->trader_.link_attributes ().max_link_follow_policy ();
+
+ this->trader_.link_attributes ().max_link_follow_policy (policy);
+ return return_value;
+}
+
+template <class TRADER_LOCK_TYPE, class MAP_LOCK_TYPE>
+CosTrading::TypeRepository_ptr
+TAO_Admin<TRADER_LOCK_TYPE,MAP_LOCK_TYPE>::
+set_type_repos (CosTrading::TypeRepository_ptr repository
+ ACE_ENV_ARG_DECL_NOT_USED)
+ ACE_THROW_SPEC ((CORBA::SystemException))
+{
+ CosTrading::TypeRepository_ptr return_value =
+ this->trader_.support_attributes ().type_repos ();
+
+ this->trader_.support_attributes ().type_repos (repository);
+ return return_value;
+}
+
+template <class TRADER_LOCK_TYPE, class MAP_LOCK_TYPE>
+CosTrading::Admin::OctetSeq*
+TAO_Admin<TRADER_LOCK_TYPE,MAP_LOCK_TYPE>::
+set_request_id_stem (const CosTrading::Admin::OctetSeq& stem
+ ACE_ENV_ARG_DECL_NOT_USED)
+ ACE_THROW_SPEC ((CORBA::SystemException))
+{
+ ACE_GUARD_RETURN (TRADER_LOCK_TYPE, trader_mon, this->lock_,
+ &this->stem_id_);
+ this->stem_id_ = stem;
+ return &this->stem_id_;
+}
+
+template <class TRADER_LOCK_TYPE, class MAP_LOCK_TYPE>
+void
+TAO_Admin<TRADER_LOCK_TYPE,MAP_LOCK_TYPE>::
+list_offers (CORBA::ULong how_many,
+ CosTrading::OfferIdSeq_out ids,
+ CosTrading::OfferIdIterator_out id_itr
+ ACE_ENV_ARG_DECL)
+ ACE_THROW_SPEC ((CORBA::SystemException, CosTrading::NotImplemented))
+{
+ // This method only applies when the register interface is implemented
+ if (CORBA::is_nil (this->trader_.trading_components().register_if()))
+ ACE_THROW (CosTrading::NotImplemented());
+
+ TAO_Offer_Database<MAP_LOCK_TYPE>& type_map = this->trader_.offer_database ();
+ TAO_Offer_Id_Iterator* offer_id_iter = type_map.retrieve_all_offer_ids ();
+
+ id_itr = CosTrading::OfferIdIterator::_nil ();
+ if (how_many > 0)
+ {
+ int check = offer_id_iter->next_n (how_many, ids ACE_ENV_ARG_PARAMETER);
+ ACE_CHECK;
+
+ if (check == 1)
+ {
+ id_itr = offer_id_iter->_this (ACE_ENV_SINGLE_ARG_PARAMETER);
+ ACE_CHECK;
+ offer_id_iter->_remove_ref (ACE_ENV_SINGLE_ARG_PARAMETER);
+ ACE_CHECK;
+ }
+ else
+ delete offer_id_iter;
+ }
+ else
+ ids = new CosTrading::OfferIdSeq (0);
+}
+
+template <class TRADER_LOCK_TYPE, class MAP_LOCK_TYPE>
+void
+TAO_Admin<TRADER_LOCK_TYPE,MAP_LOCK_TYPE>::
+list_proxies (CORBA::ULong,
+ CosTrading::OfferIdSeq_out,
+ CosTrading::OfferIdIterator_out
+ ACE_ENV_ARG_DECL)
+ ACE_THROW_SPEC ((CORBA::SystemException,
+ CosTrading::NotImplemented))
+{
+ ACE_THROW (CosTrading::NotImplemented ());
+}
+
+template <class TRADER_LOCK_TYPE, class MAP_LOCK_TYPE>
+TAO_Link<TRADER_LOCK_TYPE,MAP_LOCK_TYPE>::TAO_Link (TAO_Trader<TRADER_LOCK_TYPE,MAP_LOCK_TYPE> &trader)
+ : TAO_Trader_Components <POA_CosTrading::Link> (trader.trading_components ()),
+ TAO_Support_Attributes <POA_CosTrading::Link> (trader.support_attributes ()),
+ TAO_Link_Attributes <POA_CosTrading::Link> (trader.link_attributes ()),
+ trader_ (trader)
+{
+}
+
+template <class TRADER_LOCK_TYPE, class MAP_LOCK_TYPE>
+TAO_Link<TRADER_LOCK_TYPE,MAP_LOCK_TYPE>::~TAO_Link (void)
+{
+}
+
+template <class TRADER_LOCK_TYPE, class MAP_LOCK_TYPE>
+void
+TAO_Link<TRADER_LOCK_TYPE, MAP_LOCK_TYPE>::
+add_link (const char *name,
+ CosTrading::Lookup_ptr target,
+ CosTrading::FollowOption def_pass_on_follow_rule,
+ CosTrading::FollowOption limiting_follow_rule
+ ACE_ENV_ARG_DECL)
+ ACE_THROW_SPEC ((CORBA::SystemException,
+ CosTrading::Link::IllegalLinkName,
+ CosTrading::Link::DuplicateLinkName,
+ CosTrading::InvalidLookupRef,
+ CosTrading::Link::DefaultFollowTooPermissive,
+ CosTrading::Link::LimitingFollowTooPermissive))
+{
+ // Ensure the link name is valid.
+ if (! TAO_Trader_Base::is_valid_link_name (name))
+ ACE_THROW (CosTrading::Link::IllegalLinkName (name));
+
+ // Ensure this isn't a duplicate link name.
+ CORBA::String_var link_name (name);
+ if (this->links_.find (link_name) == 0)
+ ACE_THROW (CosTrading::Link::DuplicateLinkName (name));
+
+ // Ensure the lookup_ptr isn't nil.
+ if (CORBA::is_nil (target))
+ ACE_THROW (CosTrading::InvalidLookupRef (target));
+
+ // Ensure that the default link behavior isn't stronger than the
+ // limiting link behavior.
+ if (def_pass_on_follow_rule > limiting_follow_rule)
+ ACE_THROW (CosTrading::Link::DefaultFollowTooPermissive
+ (def_pass_on_follow_rule, limiting_follow_rule));
+
+ // Ensure that the limiting link behavior for this link doesn't
+ // exceed the maximum allowed for a link.
+ CosTrading::FollowOption follow_policy =
+ this->max_link_follow_policy (ACE_ENV_SINGLE_ARG_PARAMETER);
+ ACE_CHECK;
+ if (limiting_follow_rule < follow_policy)
+ ACE_THROW (CosTrading::Link::LimitingFollowTooPermissive
+ (limiting_follow_rule, follow_policy));
+
+ // Create a link info structure for this link of the federation.
+ CosTrading::Link::LinkInfo link_info;
+
+ link_info.target = CosTrading::Lookup::_duplicate (target);
+
+ link_info.def_pass_on_follow_rule = def_pass_on_follow_rule;
+ link_info.limiting_follow_rule = limiting_follow_rule;
+ ACE_CHECK;
+
+ // Insert this link into the collection of links.
+ this->links_.bind (link_name, link_info);
+}
+
+template <class TRADER_LOCK_TYPE, class MAP_LOCK_TYPE>
+void
+TAO_Link<TRADER_LOCK_TYPE,MAP_LOCK_TYPE>::
+remove_link (const char *name
+ ACE_ENV_ARG_DECL)
+ ACE_THROW_SPEC ((CORBA::SystemException,
+ CosTrading::Link::IllegalLinkName,
+ CosTrading::Link::UnknownLinkName))
+{
+ // Ensure the link name is valid.
+ if (! TAO_Trader_Base::is_valid_link_name (name))
+ ACE_THROW (CosTrading::Link::IllegalLinkName (name));
+
+ // Ensure this isn't a duplicate link name.
+ CORBA::String_var link_name (name);
+ if (this->links_.find (link_name) == -1)
+ ACE_THROW (CosTrading::Link::UnknownLinkName (name));
+
+ // Erase the link state from the map.
+ this->links_.unbind (link_name);
+}
+
+template <class TRADER_LOCK_TYPE, class MAP_LOCK_TYPE>
+CosTrading::Link::LinkInfo *
+TAO_Link<TRADER_LOCK_TYPE,MAP_LOCK_TYPE>::describe_link (const char *name
+ ACE_ENV_ARG_DECL)
+ ACE_THROW_SPEC ((CORBA::SystemException,
+ CosTrading::Link::IllegalLinkName,
+ CosTrading::Link::UnknownLinkName))
+{
+ // Ensure the link name is valid.
+ if (! TAO_Trader_Base::is_valid_link_name (name))
+ ACE_THROW_RETURN (CosTrading::Link::IllegalLinkName (name), 0);
+
+ // Ensure this isn't a duplicate link name.
+ ACE_TYPENAME Links::ENTRY* link_entry = 0;
+ CORBA::String_var link_name (name);
+ if (this->links_.find (link_name, link_entry) == -1)
+ ACE_THROW_RETURN (CosTrading::Link::UnknownLinkName (name),
+ 0);
+
+ // Build a new Link Info structure.
+ CosTrading::Link::LinkInfo* new_link_info = 0;
+ CosTrading::Link::LinkInfo& old_link_info = link_entry->int_id_;
+
+ ACE_NEW_THROW_EX (new_link_info,
+ CosTrading::Link::LinkInfo,
+ CORBA::NO_MEMORY ());
+ ACE_CHECK_RETURN (0);
+
+ new_link_info->def_pass_on_follow_rule = old_link_info.def_pass_on_follow_rule;
+ new_link_info->limiting_follow_rule = old_link_info.limiting_follow_rule;
+
+ new_link_info->target = old_link_info.target;
+
+ // Delayed retrieval of register interface.
+ // This avoids the nested upcall that would occur were we to invoke
+ // this method in the add_link method.
+
+ new_link_info->target_reg = old_link_info.target->register_if (ACE_ENV_SINGLE_ARG_PARAMETER);
+ ACE_CHECK_RETURN (new_link_info);
+
+ // return the link information for this link name.
+ return new_link_info;
+}
+
+template <class TRADER_LOCK_TYPE, class MAP_LOCK_TYPE>
+CosTrading::LinkNameSeq*
+TAO_Link<TRADER_LOCK_TYPE,MAP_LOCK_TYPE>::list_links (ACE_ENV_SINGLE_ARG_DECL_NOT_USED)
+ ACE_THROW_SPEC ((CORBA::SystemException))
+{
+ // Allocate space for the link names.
+ size_t size = this->links_.current_size ();
+ CORBA::ULong i = 0;
+ CosTrading::LinkName* link_seq =
+ CosTrading::LinkNameSeq::allocbuf (static_cast<CORBA::ULong> (size));
+
+ // Copy the link names into the buffer.
+ for (ACE_TYPENAME Links::iterator links_iter (this->links_);
+ ! links_iter.done ();
+ links_iter++)
+ link_seq[i++] = CORBA::string_dup ((*links_iter).ext_id_.in ());
+
+ // Return a sequence of the buf names.
+ return new CosTrading::LinkNameSeq (i, i, link_seq, 1);
+}
+
+template <class TRADER_LOCK_TYPE, class MAP_LOCK_TYPE>
+void
+TAO_Link<TRADER_LOCK_TYPE,MAP_LOCK_TYPE>::
+modify_link (const char *name,
+ CosTrading::FollowOption def_pass_on_follow_rule,
+ CosTrading::FollowOption limiting_follow_rule
+ ACE_ENV_ARG_DECL)
+ ACE_THROW_SPEC ((CosTrading::Link::IllegalLinkName,
+ CosTrading::Link::UnknownLinkName,
+ CosTrading::Link::DefaultFollowTooPermissive,
+ CosTrading::Link::LimitingFollowTooPermissive))
+{
+ // Ensure the link name is valid.
+ if (! TAO_Trader_Base::is_valid_link_name (name))
+ ACE_THROW (CosTrading::Link::IllegalLinkName (name));
+
+ // Ensure this isn't a duplicate link name.
+ ACE_TYPENAME Links::ENTRY* link_entry = 0;
+ CORBA::String_var link_name (name);
+ if (this->links_.find (link_name, link_entry) == -1)
+ ACE_THROW (CosTrading::Link::UnknownLinkName (name));
+
+ // Ensure that the default link behavior isn't stronger than the
+ // limiting link behavior.
+ if (def_pass_on_follow_rule > limiting_follow_rule)
+ ACE_THROW (CosTrading::Link::DefaultFollowTooPermissive
+ (def_pass_on_follow_rule, limiting_follow_rule));
+
+ // Ensure that the limiting link behavior for this link doesn't
+ // exceed the maximum allowed for a link.
+ CosTrading::FollowOption follow_policy =
+ this->max_link_follow_policy (ACE_ENV_SINGLE_ARG_PARAMETER);
+ ACE_CHECK;
+
+ if (limiting_follow_rule < follow_policy)
+ ACE_THROW (CosTrading::Link::LimitingFollowTooPermissive
+ (limiting_follow_rule, follow_policy));
+
+ // Adjust the link settings
+ CosTrading::Link::LinkInfo& link_info = link_entry->int_id_;
+ link_info.def_pass_on_follow_rule = def_pass_on_follow_rule;
+ link_info.limiting_follow_rule = limiting_follow_rule;
+}
+
+template <class TRADER_LOCK_TYPE, class MAP_LOCK_TYPE>
+TAO_Proxy<TRADER_LOCK_TYPE,MAP_LOCK_TYPE>::
+TAO_Proxy (TAO_Trader<TRADER_LOCK_TYPE,MAP_LOCK_TYPE> &trader)
+ : TAO_Trader_Components <POA_CosTrading::Proxy> (trader.trading_components ()),
+ TAO_Support_Attributes <POA_CosTrading::Proxy> (trader.support_attributes ()),
+ trader_ (trader)
+{
+}
+
+template <class TRADER_LOCK_TYPE, class MAP_LOCK_TYPE>
+TAO_Proxy<TRADER_LOCK_TYPE,MAP_LOCK_TYPE>::~TAO_Proxy (void)
+{
+}
+
+template <class TRADER_LOCK_TYPE, class MAP_LOCK_TYPE>
+CosTrading::OfferId
+TAO_Proxy<TRADER_LOCK_TYPE,MAP_LOCK_TYPE>::
+export_proxy (CosTrading::Lookup_ptr,
+ const char *,
+ const CosTrading::PropertySeq&,
+ CORBA::Boolean,
+ const char *,
+ const CosTrading::PolicySeq&
+ ACE_ENV_ARG_DECL)
+ ACE_THROW_SPEC ((CORBA::SystemException,
+ CosTrading::IllegalServiceType,
+ CosTrading::UnknownServiceType,
+ CosTrading::InvalidLookupRef,
+ CosTrading::IllegalPropertyName,
+ CosTrading::PropertyTypeMismatch,
+ CosTrading::ReadonlyDynamicProperty,
+ CosTrading::MissingMandatoryProperty,
+ CosTrading::Proxy::IllegalRecipe,
+ CosTrading::DuplicatePropertyName,
+ CosTrading::DuplicatePolicyName))
+{
+ ACE_THROW_RETURN (CORBA::UNKNOWN (), 0);
+
+ return 0;
+}
+
+template <class TRADER_LOCK_TYPE, class MAP_LOCK_TYPE>
+void
+TAO_Proxy<TRADER_LOCK_TYPE,MAP_LOCK_TYPE>::
+withdraw_proxy (const char *
+ ACE_ENV_ARG_DECL)
+ ACE_THROW_SPEC ((CORBA::SystemException,
+ CosTrading::IllegalOfferId,
+ CosTrading::UnknownOfferId,
+ CosTrading::Proxy::NotProxyOfferId))
+{
+ ACE_THROW (CORBA::UNKNOWN ());
+}
+
+template <class TRADER_LOCK_TYPE, class MAP_LOCK_TYPE>
+CosTrading::Proxy::ProxyInfo *
+TAO_Proxy<TRADER_LOCK_TYPE,MAP_LOCK_TYPE>::
+describe_proxy (const char *
+ ACE_ENV_ARG_DECL)
+ ACE_THROW_SPEC ((CORBA::SystemException,
+ CosTrading::IllegalOfferId,
+ CosTrading::UnknownOfferId,
+ CosTrading::Proxy::NotProxyOfferId))
+{
+ ACE_THROW_RETURN (CORBA::UNKNOWN (), 0);
+
+ return 0;
+}
+
+template <class TRADER_LOCK_TYPE, class MAP_LOCK_TYPE>
+void
+TAO_Proxy<TRADER_LOCK_TYPE,MAP_LOCK_TYPE>::
+list_proxies (CORBA::ULong,
+ CosTrading::OfferIdSeq*&,
+ CosTrading::OfferIdIterator_ptr&
+ ACE_ENV_ARG_DECL)
+ ACE_THROW_SPEC ((CORBA::SystemException,
+ CosTrading::NotImplemented))
+{
+ ACE_THROW (CORBA::UNKNOWN ());
+}
+
+TAO_END_VERSIONED_NAMESPACE_DECL
+
+#endif /* TAO_TRADER_INTERFACES_CPP */
diff --git a/TAO/orbsvcs/orbsvcs/Trader/Trader_Interfaces.h b/TAO/orbsvcs/orbsvcs/Trader/Trader_Interfaces.h
new file mode 100644
index 00000000000..2b1db71d3bc
--- /dev/null
+++ b/TAO/orbsvcs/orbsvcs/Trader/Trader_Interfaces.h
@@ -0,0 +1,1019 @@
+// -*- C++ -*-
+
+//=============================================================================
+/**
+ * @file Trader_Interfaces.h
+ *
+ * $Id$
+ *
+ * @author Marina Spivak <marina@cs.wustl.edu>
+ * @author Seth Widoff <sbw1@cs.wustl.edu>
+ * @author Irfan Pyarali <irfan@cs.wustl.edu>
+ */
+//=============================================================================
+
+
+#ifndef TAO_TRADER_INTERFACES_H
+#define TAO_TRADER_INTERFACES_H
+#include /**/ "ace/pre.h"
+
+#include "orbsvcs/Trader/Trader_Utils.h"
+#include "orbsvcs/Trader/Constraint_Interpreter.h"
+#include "orbsvcs/Trader/Offer_Iterators_T.h"
+
+#if defined(_MSC_VER)
+#pragma warning(push)
+#pragma warning(disable:4250)
+#endif /* _MSC_VER */
+
+TAO_BEGIN_VERSIONED_NAMESPACE_DECL
+
+// Hack because g++ forced this inane circular dependecy!
+
+class TAO_Constraint_Interpreter;
+class TAO_Constraint_Evaluator;
+class TAO_Constraint_Validator;
+class TAO_Preference_Interpreter;
+
+template <class TRADER_LOCK_TYPE, class MAP_LOCK_TYPE> class TAO_Lookup;
+template <class TRADER_LOCK_TYPE, class MAP_LOCK_TYPE> class TAO_Register;
+template <class TRADER_LOCK_TYPE, class MAP_LOCK_TYPE> class TAO_Admin;
+template <class TRADER_LOCK_TYPE, class MAP_LOCK_TYPE> class TAO_Proxy;
+template <class TRADER_LOCK_TYPE, class MAP_LOCK_TYPE> class TAO_Link;
+
+TAO_END_VERSIONED_NAMESPACE_DECL
+
+#include "orbsvcs/Trader/Trader_T.h"
+
+TAO_BEGIN_VERSIONED_NAMESPACE_DECL
+
+/**
+ * @class TAO_Lookup
+ *
+ * @brief This class implements CosTrading::Lookup IDL interface.
+ */
+template<class TRADER_LOCK_TYPE, class MAP_LOCK_TYPE>
+class TAO_Lookup :
+ public TAO_Trader_Components<POA_CosTrading::Lookup>,
+ public TAO_Support_Attributes<POA_CosTrading::Lookup>,
+ public TAO_Import_Attributes<POA_CosTrading::Lookup>
+{
+public:
+
+ TAO_Lookup (TAO_Trader<TRADER_LOCK_TYPE,MAP_LOCK_TYPE> &trader);
+
+ ~TAO_Lookup (void);
+
+ virtual void
+ query (const char *type,
+ const char *constr,
+ const char *pref,
+ const CosTrading::PolicySeq& policies,
+ const CosTrading::Lookup::SpecifiedProps& desired_props,
+ CORBA::ULong how_many,
+ CosTrading::OfferSeq_out offers,
+ CosTrading::OfferIterator_out offer_itr,
+ CosTrading::PolicyNameSeq_out limits_applied
+ ACE_ENV_ARG_DECL)
+ ACE_THROW_SPEC ((CORBA::SystemException,
+ CosTrading::IllegalServiceType,
+ CosTrading::UnknownServiceType,
+ CosTrading::IllegalConstraint,
+ CosTrading::Lookup::IllegalPreference,
+ CosTrading::Lookup::IllegalPolicyName,
+ CosTrading::Lookup::PolicyTypeMismatch,
+ CosTrading::Lookup::InvalidPolicyValue,
+ CosTrading::IllegalPropertyName,
+ CosTrading::DuplicatePropertyName,
+ CosTrading::DuplicatePolicyName));
+
+ // BEGIN SPEC
+ // The query operation is the means by which an object can obtain
+ // references to other objects that provide services meeting its
+ // requirements.
+
+ // The "type" parameter conveys the required service type. It is key
+ // to the central purpose of trading: to perform an introduction for
+ // future type safe interactions between importer and exporter. By
+ // stating a service type, the importer implies the desired interface
+ // type and a domain of discourse for talking about properties of the
+ // service.
+
+ // The trader may return a service offer of a subtype of the "type"
+ // requested. Sub-typing of service types is discussed in "Service
+ // Types" on page 16-4. A service subtype can be described by the
+ // properties of its supertypes. This ensures that a well-formed
+ // query for the "type" is also a well-formed query with respect to
+ // any subtypes. However, if the importer specifies the policy of
+ // exact_type_match = TRUE, then only offers with the exact (no
+ // subtype) service type requested are returned.
+
+ // The constraint "constr" is the means by which the importer states
+ // those requirements of a service that are not captured in the
+ // signature of the interface. These requirements deal with the
+ // computational behavior of the desired service, non-functional
+ // aspects, and non-computational aspects (such as the organization
+ // owning the objects that provide the service). An importer is
+ // always guaranteed that any returned offer satisfies the matching
+ // constraint at the time of import. If the "constr" does not obey
+ // the syntax rules for a legal constraint expression, then an
+ // IllegalConstraint exception is raised.
+
+ // The "pref" parameter is also used to order those offers that
+ // match the "constr" so that the offers returned by the trader are
+ // in the order of greatest interest to the importer. If "pref" does
+ // not obey the syntax rules for a legal preference expression, then
+ // an IllegalPreference exception is raised.
+
+ // The "policies" parameter allows the importer to specify how the
+ // search should be performed as opposed to what sort of services
+ // should be found in the course of the search. This can be viewed
+ // as parameterizing the algorithms within the trader
+ // implementation. The "policies" are a sequence of name-value
+ // pairs. The names available to an importer depend on the
+ // implementation of the trader. However, some names are
+ // standardized where they effect the interpretation of other
+ // parameters or where they may impact linking and federation of
+ // traders.
+
+ // The "desired_props" parameter defines the set of properties
+ // describing returned offers that are to be returned with the
+ // object reference. There are three possibilities, the importer
+ // wants one of the properties, all of the properties (but without
+ // having to name them), or some properties (the names of which are
+ // provided).
+
+ // The desired_props parameter does not affect whether or not a
+ // service offer is returned. To avoid "missing" desired properties,
+ // the importer should specify "exists prop_name" in the
+ // constraint.
+
+ // The returned offers are passed back in one of two ways (or a
+ // combination of both). °The "offers" return result conveys a list
+ // of offers and the "offer_itr" is a reference to an interface at
+ // which offers can be obtained. The "how_many" parameter states
+ // how many offers are to be returned via the "offers" result, any
+ // remaining offers are available via the iterator interface. If the
+ // "how_many" exceeds the number of offers to be returned, then the
+ // "offer_itr" will be nil.
+
+ // If any cardinality or other limits were applied by one or more
+ // traders in responding to a particular query, then the
+ // "limits_applied" parameter will contain the names of the policies
+ // which limited the query. The sequence of names returned in
+ // "limits_applied" from any federated or proxy queries must be
+ // concatenated onto the names of limits applied locally and
+ // returned.
+ // END SPEC
+
+private:
+
+ /// Factory method for creating an appropriate Offer Iterator based
+ /// on the presence of the Register Interface.
+ TAO_Offer_Iterator* create_offer_iterator (const TAO_Property_Filter&);
+
+ /// Traverse the type hierarchy to pull the matching offers from all
+ /// subtypes of the root type.
+ void lookup_all_subtypes (const char* type,
+ CosTradingRepos::ServiceTypeRepository::IncarnationNumber& inc_num,
+ TAO_Offer_Database<MAP_LOCK_TYPE>& offer_database,
+ CosTradingRepos::ServiceTypeRepository_ptr rep,
+ TAO_Constraint_Interpreter& constr_inter,
+ TAO_Preference_Interpreter& pref_inter,
+ TAO_Offer_Filter& offer_filter
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS);
+
+ /// Check if offers of a type fit the constraints and order them
+ /// according to the preferences submitted.
+ void lookup_one_type (const char* type,
+ TAO_Offer_Database<MAP_LOCK_TYPE>& offer_database,
+ TAO_Constraint_Interpreter& constr_inter,
+ TAO_Preference_Interpreter& pref_inter,
+ TAO_Offer_Filter& offer_filter);
+
+ /**
+ * This method takes the list of ordered offers and places a number
+ * of them in the sequence of returned offers and the rest into thr
+ * iterator. In addition, fill_receptacles uses the
+ * TAO_Property_Filter to ensure the returned offers contain the
+ * properties specified in the desired_props in parameter.
+ */
+ int fill_receptacles (const char *,
+ CORBA::ULong how_many,
+ const CosTrading::Lookup::SpecifiedProps& desired_props,
+ TAO_Policies& policies,
+ TAO_Preference_Interpreter& pref_inter,
+ CosTrading::OfferSeq& offers,
+ CosTrading::OfferIterator_ptr& offer_itr
+ ACE_ENV_ARG_DECL)
+ ACE_THROW_SPEC ((CosTrading::IllegalPropertyName,
+ CosTrading::DuplicatePropertyName));
+
+ /// If a starting_trader policy was specfied, foward the query to the
+ /// next link in the sequence.
+ void forward_query (const char* next_hop,
+ const char *type,
+ const char *constr,
+ const char *pref,
+ const CosTrading::PolicySeq& policy_seq,
+ const CosTrading::Lookup::SpecifiedProps& desired_props,
+ CORBA::ULong how_many,
+ CosTrading::OfferSeq_out offers,
+ CosTrading::OfferIterator_out offer_itr,
+ CosTrading::PolicyNameSeq_out limits_applied
+ ACE_ENV_ARG_DECL)
+ ACE_THROW_SPEC ((CORBA::SystemException,
+ CosTrading::IllegalServiceType,
+ CosTrading::UnknownServiceType,
+ CosTrading::IllegalConstraint,
+ CosTrading::Lookup::IllegalPreference,
+ CosTrading::Lookup::IllegalPolicyName,
+ CosTrading::Lookup::PolicyTypeMismatch,
+ CosTrading::Lookup::InvalidPolicyValue,
+ CosTrading::IllegalPropertyName,
+ CosTrading::DuplicatePropertyName,
+ CosTrading::DuplicatePolicyName));
+
+ /**
+ * Assemble a sequence of links that the federate_query method
+ * should follow. Use the starting_trader policy, if one's provided,
+ * otherwise use the Link interface to determine which of the
+ * registered links should be followed in this query.
+ */
+ CORBA::Boolean retrieve_links (TAO_Policies& policies,
+ CORBA::ULong offer_returned,
+ CosTrading::LinkNameSeq_out links
+ ACE_ENV_ARG_DECL)
+ ACE_THROW_SPEC ((CORBA::SystemException,
+ CosTrading::Lookup::PolicyTypeMismatch));
+
+ /**
+ * Perform and pass on a query over a set of links. Merge the
+ * results of the federated queries into a single set of results
+ * suitable for returning to the user.
+ */
+ void federated_query (const CosTrading::LinkNameSeq& links,
+ const TAO_Policies& policies,
+ const CosTrading::Admin::OctetSeq& request_id,
+ TAO_Preference_Interpreter& pref_inter,
+ const char *type,
+ const char *constr,
+ const char *pref,
+ const CosTrading::Lookup::SpecifiedProps& desired_props,
+ CORBA::ULong how_many,
+ CosTrading::OfferSeq& offers,
+ CosTrading::OfferIterator_ptr& offer_itr,
+ CosTrading::PolicyNameSeq& limits_applied
+ ACE_ENV_ARG_DECL)
+ ACE_THROW_SPEC ((CORBA::SystemException,
+ CosTrading::IllegalServiceType,
+ CosTrading::UnknownServiceType,
+ CosTrading::IllegalConstraint,
+ CosTrading::Lookup::IllegalPreference,
+ CosTrading::Lookup::IllegalPolicyName,
+ CosTrading::Lookup::PolicyTypeMismatch,
+ CosTrading::Lookup::InvalidPolicyValue,
+ CosTrading::IllegalPropertyName,
+ CosTrading::DuplicatePropertyName,
+ CosTrading::DuplicatePolicyName));
+
+ /// Merge the results from a federated query into the collected results.
+ void order_merged_sequence (TAO_Preference_Interpreter& pref_inter,
+ CosTrading::OfferSeq& offers);
+
+ CORBA::Boolean seen_request_id (TAO_Policies& policies,
+ CosTrading::Admin::OctetSeq*& seq
+ ACE_ENV_ARG_DECL)
+ ACE_THROW_SPEC ((CORBA::SystemException,
+ CosTrading::Lookup::PolicyTypeMismatch));
+
+ // = Disallow these operations.
+ ACE_UNIMPLEMENTED_FUNC (void operator= (const TAO_Lookup<TRADER_LOCK_TYPE,MAP_LOCK_TYPE> &))
+ ACE_UNIMPLEMENTED_FUNC (TAO_Lookup (const TAO_Lookup<TRADER_LOCK_TYPE,MAP_LOCK_TYPE> &))
+
+ const unsigned int IDS_SAVED;
+
+ /// A reference to the trader for obtaining offer maps.
+ TAO_Trader<TRADER_LOCK_TYPE,MAP_LOCK_TYPE> &trader_;
+
+ typedef ACE_Unbounded_Queue<CosTrading::Admin::OctetSeq*> Request_Ids;
+
+ /// A list of recent request_id_stems
+ Request_Ids request_ids_;
+
+ /// Lock to secure the set of request ids.
+ TRADER_LOCK_TYPE lock_;
+};
+
+/**
+ * @class TAO_Register
+ *
+ * @brief This class implements CosTrading::Register IDL interface.
+ */
+template <class TRADER_LOCK_TYPE, class MAP_LOCK_TYPE>
+class TAO_Register :
+ public TAO_Trader_Components<POA_CosTrading::Register>,
+ public TAO_Support_Attributes<POA_CosTrading::Register>
+{
+public:
+
+ TAO_Register (TAO_Trader<TRADER_LOCK_TYPE,MAP_LOCK_TYPE> &trader);
+
+ virtual ~TAO_Register (void);
+
+ virtual CosTrading::OfferId _cxx_export (CORBA::Object_ptr reference,
+ const char *type,
+ const CosTrading::PropertySeq& properties
+ ACE_ENV_ARG_DECL)
+ ACE_THROW_SPEC ((CORBA::SystemException,
+ CosTrading::Register::InvalidObjectRef,
+ CosTrading::IllegalServiceType,
+ CosTrading::UnknownServiceType,
+ CosTrading::Register::InterfaceTypeMismatch,
+ CosTrading::IllegalPropertyName,
+ CosTrading::PropertyTypeMismatch,
+ CosTrading::ReadonlyDynamicProperty,
+ CosTrading::MissingMandatoryProperty,
+ CosTrading::DuplicatePropertyName));
+
+ // BEGIN SPEC
+ // The export operation is the means by which a service is
+ // advertised, via a trader, to a community of potential
+ // importers. The OfferId returned is the handle with which the
+ // exporter can identify the exported offer when attempting to
+ // access it via other operations. The OfferId is only meaningful in
+ // the context of the trader that generated it.
+
+ // The "reference" parameter is the information that enables a client
+ // to interact with a remote server. If a trader implementation chooses
+ // to consider certain types of object references (e.g., a nil object
+ // reference) to be unexportable, then it may return the InvalidObjectRef
+ // exception in such cases.
+
+ // The "type" parameter
+ // identifies the service type, which contains the interface type of
+ // the "reference" and a set of named property types that may be
+ // used in further describing this offer (i.e., it restricts what is
+ // acceptable in the properties parameter). °
+
+ // If the string
+ // representation of the "type" does not obey the rules for
+ // identifiers, then an IllegalServiceType exception is raised. ° If
+ // the "type" is correct syntactically but a trader is able to
+ // unambiguously determine that it is not a recognized service type,
+ // then an UnknownServiceType exception is raised. °
+
+ // If the trader
+ // can determine that the interface type of the "reference"
+ // parameter is not a subtype of the interface type specified in
+ // "type," then an InterfaceTypeMismatch exception is raised. The
+ // "properties" parameter is a list of named values that conform to
+ // the property value types defined for those names. They describe
+ // the service being offered. This description typically covers
+ // behavioral, non-functional, and non-computational aspects of the
+ // service. °
+
+ // If any of the property names do not obey the syntax
+ // rules for PropertyNames, then an IllegalPropertyName exception is
+ // raised. °
+
+ // If the type of any of the property values is not the
+ // same as the declared type (declared in the service type), then a
+ // PropertyTypeMismatch exception is raised.
+
+ // ° If an attempt is made to assign a dynamic property value to a
+ // readonly property, then the ReadonlyDynamicProperty exception is
+ // raised. ° If the "properties" parameter omits any property
+ // declared in the service type with a mode of mandatory, then a
+ // MissingMandatoryProperty exception is raised. ° If two or more
+ // properties with the same property name are included in this
+ // parameter, the DuplicatePropertyName exception is raised.
+ // END SPEC
+
+ virtual void withdraw (const char *id ACE_ENV_ARG_DECL)
+ ACE_THROW_SPEC ((CORBA::SystemException,
+ CosTrading::IllegalOfferId,
+ CosTrading::UnknownOfferId,
+ CosTrading::Register::ProxyOfferId));
+
+ // BEGIN SPEC
+ // The withdraw operation removes the service offer from the trader
+ // (i.e., after withdraw the offer can no longer be returned as the
+ // result of a query). The offer is identified by the "id" parameter
+ // which was originally returned by export. ° If the string
+ // representation of "id" does not obey the rules for offer
+ // identifiers, then an IllegalOfferId exception is raised. ° If the
+ // "id" is legal but there is no offer within the trader with that
+ // "id," then an UnknownOfferId exception is raised. ° If the "id"
+ // identifies a proxy offer rather than an ordinary offer, then a
+ // ProxyOfferId exception is raised.
+ // END SPEC
+
+ virtual CosTrading::Register::OfferInfo*
+ describe (const char * id
+ ACE_ENV_ARG_DECL)
+ ACE_THROW_SPEC ((CORBA::SystemException,
+ CosTrading::IllegalOfferId,
+ CosTrading::UnknownOfferId,
+ CosTrading::Register::ProxyOfferId));
+
+ // BEGIN SPEC
+ // The describe operation returns the information about an offered
+ // service that is held by the trader. It comprises the "reference"
+ // of the offered service, the "type" of the service offer, and the
+ // "properties" that describe this offer of service. The offer is
+ // identified by the "id" parameter which was originally returned by
+ // export. ° If the string representation of "id" does not obey the
+ // rules for object identifiers, then an IllegalOfferId exception is
+ // raised. ° If the "id" is legal but there is no offer within the
+ // trader with that "id," then an UnknownOfferId exception is
+ // raised. ° If the "id" identifies a proxy offer rather than an
+ // ordinary offer, then a ProxyOfferId exception is raised.
+ // END SPEC
+
+ virtual void modify (const char * id,
+ const CosTrading::PropertyNameSeq& del_list,
+ const CosTrading::PropertySeq& modify_list
+ ACE_ENV_ARG_DECL)
+ ACE_THROW_SPEC ((CORBA::SystemException,
+ CosTrading::NotImplemented,
+ CosTrading::IllegalOfferId,
+ CosTrading::UnknownOfferId,
+ CosTrading::Register::ProxyOfferId,
+ CosTrading::IllegalPropertyName,
+ CosTrading::Register::UnknownPropertyName,
+ CosTrading::PropertyTypeMismatch,
+ CosTrading::ReadonlyDynamicProperty,
+ CosTrading::Register::MandatoryProperty,
+ CosTrading::Register::ReadonlyProperty,
+ CosTrading::DuplicatePropertyName));
+
+ // BEGIN SPEC
+ // The modify operation is used to change the description of a
+ // service as held within a service offer. The object reference and
+ // the service type associated with the offer cannot be
+ // changed. This operation may: ° add new (non-mandatory) properties
+ // to describe an offer, ° change the values of some existing (not
+ // readonly) properties, or ° delete existing (neither mandatory nor
+ // readonly) properties.
+
+ // The modify operation either succeeds completely or it fails
+ // completely. The offer is identified by the "id" parameter which
+ // was originally returned by export. ° If the string representation
+ // of "id" does not obey the rules for offer identifiers, then an
+ // IllegalOfferId exception is raised. ° If the "id" is legal but
+ // there is no offer within the trader with that "id," then an
+ // UnknownOfferId exception is raised. ° If the "id" identifies a
+ // proxy offer rather than an ordinary offer, then a ProxyOfferId
+ // exception is raised.
+
+ // The "del_list" parameter gives the names of the properties that
+ // are no longer to be recorded for the identified offer. Future
+ // query and describe operations will not see these properties. ° If
+ // any of the names within the "del_list" do not obey the rules for
+ // PropertyName's, then an IllegalPropertyName exception is
+ // raised. ° If a "name" is legal but there is no property for the
+ // offer with that "name," then an UnknownPropertyName exception is
+ // raised. ° If the list includes a property that has a mandatory
+ // mode, then the MandatoryProperty exception is raised. ° If the
+ // same property name is included two or more times in this
+ // parameter, the DuplicatePropertyName exception is raised.
+
+ // The "modify_list" parameter gives the names and values of
+ // properties to be changed. If the property is not in the offer,
+ // then the modify operation adds it. The modified (or added)
+ // property values are returned in future query and describe
+ // operations in place of the original values. ° If any of the names
+ // within the "modify_list" do not obey the rules for
+ // PropertyName's, then an IllegalPropertyName exception is
+ // raised. ° If the list includes a property that has a readonly
+ // mode, then the ReadonlyProperty exception is raised unless that
+ // readonly property is not currently recorded for the offer. The
+ // ReadonlyDynamicProperty exception is raised if an attempt is made
+ // to assign a dynamic property value to a readonly property. ° If
+ // the value of any modified property is of a type that is not the
+ // same as the type expected, then the PropertyTypeMismatch
+ // exception is raised. ° If two or more properties with the same
+ // property name are included in this argument, the
+ // DuplicatePropertyName exception is raised.
+
+ // The NotImplemented exception shall be raised if and only if the
+ // supports_modifiable_properties attribute yields FALSE.
+ // END SPEC
+
+ virtual void withdraw_using_constraint (const char *type,
+ const char *constr
+ ACE_ENV_ARG_DECL)
+ ACE_THROW_SPEC ((CORBA::SystemException,
+ CosTrading::IllegalServiceType,
+ CosTrading::UnknownServiceType,
+ CosTrading::IllegalConstraint,
+ CosTrading::Register::NoMatchingOffers));
+
+ // BEGIN SPEC
+ // The withdraw_using_constraint operation withdraws a set of offers
+ // from within a single trader. This set is identified in the same
+ // way that a query operation identifies a set of offers to be
+ // returned to an importer.
+
+ // The "type" parameter conveys the required service type. Each
+ // offer of the specified type will have the constraint expression
+ // applied to it. If it matches the constraint expression, then the
+ // offer will be withdrawn.° If "type" does not obey the rules for
+ // service types, then an IllegalServiceType exception is raised. °
+ // If the "type" is correct syntactically but is not recognized as a
+ // service type by the trader, then an UnknownServiceType exception
+ // is raised.
+
+ // The constraint "constr" is the means by which the client
+ // restricts the set of offers to those that are intended for
+ // withdrawal. ° If "constr" does not obey the syntax rules for a
+ // constraint then an IllegalConstraint exception is raised. ° If
+ // the constraint fails to match with any offer of the specified
+ // service type, then a NoMatchingOffers exception is raised.
+ // END SPEC
+
+ virtual CosTrading::Register_ptr
+ resolve (const CosTrading::TraderName &name
+ ACE_ENV_ARG_DECL)
+ ACE_THROW_SPEC ((CORBA::SystemException,
+ CosTrading::Register::IllegalTraderName,
+ CosTrading::Register::UnknownTraderName,
+ CosTrading::Register::RegisterNotSupported));
+
+ // BEGIN SPEC
+ // This operation is used to resolve a context relative name for
+ // another trader. In particular, it is used when exporting to a
+ // trader that is known by a name rather than by an object
+ // reference. The client provides the name, which will be a sequence
+ // of name components. ° If the content of the parameter cannot
+ // yield legal syntax for the first component, then the
+ // IllegalTraderName exception is raised. Otherwise, the first name
+ // component is compared against the name held in each link. ° If no
+ // match is found, or the trader does not support links, the
+ // UnknownTraderName exception is raised. Otherwise, the trader
+ // obtains the register_if held as part of the matched link. ° If
+ // the Register interface is not nil, then the trader binds to the
+ // Register interface and invokes resolve but passes the TraderName
+ // with the first component removed; if it is nil, then the
+ // RegisterNotSupported exception is raised. When a trader is able
+ // to match the first name component leaving no residual name, that
+ // trader returns the reference for the Register interface for that
+ // linked trader. In unwinding the recursion, intermediate traders
+ // return the Register interface reference to their client (another
+ // trader).
+ // END SPEC
+
+ protected:
+
+ void validate_properties (const char* type,
+ const CosTradingRepos::ServiceTypeRepository::TypeStruct* type_struct,
+ const CosTrading::PropertySeq& properties
+ ACE_ENV_ARG_DECL)
+ ACE_THROW_SPEC ((CosTrading::IllegalPropertyName,
+ CosTrading::PropertyTypeMismatch,
+ CosTrading::ReadonlyDynamicProperty,
+ CosTrading::MissingMandatoryProperty,
+ CosTrading::DuplicatePropertyName));
+
+ // = Disallow these operations.
+ ACE_UNIMPLEMENTED_FUNC (void operator= (const TAO_Register<TRADER_LOCK_TYPE,MAP_LOCK_TYPE> &))
+ ACE_UNIMPLEMENTED_FUNC (TAO_Register (const TAO_Register<TRADER_LOCK_TYPE,MAP_LOCK_TYPE> &))
+
+ private:
+
+ TAO_Trader<TRADER_LOCK_TYPE,MAP_LOCK_TYPE> &trader_;
+};
+
+/**
+ * @class TAO_Admin
+ *
+ * @brief This class implements CosTrading::Admin IDL interface.
+ *
+ * DESCRIPTION (FROM SPEC)
+ * The admin interface enables the values of the trader attributes to
+ * be read and written. All attributes are defined as readonly in
+ * either SupportAttributes, ImportAttributes, LinkAttributes, or
+ * Admin. To set the trader "attribute" to a new value,
+ * set_<attribute_name> operations are defined in Admin. Each of these
+ * set operations returns the previous value of the attribute as its
+ * function value. If the admin interface operation
+ * set_support_proxy_offers is invoked with a value set to FALSE in a
+ * trader which supports the proxy interface, the
+ * set_support_proxy_offer value does not affect the function of
+ * operations in the proxy interface. However, in this case, it does
+ * have the effect of making any proxy offers exported via the proxy
+ * interface for that trader unavailable to satisfy queries on that
+ * trader's lookup interface.
+ */
+template <class TRADER_LOCK_TYPE, class MAP_LOCK_TYPE>
+class TAO_Admin :
+ public TAO_Trader_Components <POA_CosTrading::Admin>,
+ public TAO_Support_Attributes <POA_CosTrading::Admin>,
+ public TAO_Import_Attributes <POA_CosTrading::Admin>,
+ public TAO_Link_Attributes <POA_CosTrading::Admin>
+{
+public:
+
+ TAO_Admin (TAO_Trader<TRADER_LOCK_TYPE,MAP_LOCK_TYPE> &trader);
+
+ ~TAO_Admin (void);
+
+ // = Importing Parameters (used by the Lookup Interface)
+
+ /// Search card is the cardinality of the offers searched for
+ /// constraint compliance.
+ virtual CORBA::ULong set_def_search_card (CORBA::ULong value
+ ACE_ENV_ARG_DECL_NOT_USED)
+ ACE_THROW_SPEC ((CORBA::SystemException));
+ virtual CORBA::ULong set_max_search_card (CORBA::ULong value
+ ACE_ENV_ARG_DECL_NOT_USED)
+ ACE_THROW_SPEC ((CORBA::SystemException));
+
+
+ /// Match card is the cardinality of offers found compliant with the
+ /// constraints.
+ virtual CORBA::ULong set_def_match_card (CORBA::ULong value
+ ACE_ENV_ARG_DECL_NOT_USED)
+ ACE_THROW_SPEC ((CORBA::SystemException));
+ virtual CORBA::ULong set_max_match_card (CORBA::ULong value
+ ACE_ENV_ARG_DECL_NOT_USED)
+ ACE_THROW_SPEC ((CORBA::SystemException));
+
+ /// Return card is the cardinality of the offers returned from
+ /// Lookup.
+ virtual CORBA::ULong set_def_return_card (CORBA::ULong value
+ ACE_ENV_ARG_DECL_NOT_USED)
+ ACE_THROW_SPEC ((CORBA::SystemException));
+ virtual CORBA::ULong set_max_return_card (CORBA::ULong value
+ ACE_ENV_ARG_DECL_NOT_USED)
+ ACE_THROW_SPEC ((CORBA::SystemException));
+
+ /// Types of offers available for consideration. Ween out those
+ /// offers with modifiable properties
+ virtual CORBA::ULong set_max_list (CORBA::ULong value
+ ACE_ENV_ARG_DECL_NOT_USED)
+ ACE_THROW_SPEC ((CORBA::SystemException));
+ virtual CORBA::Boolean
+ set_supports_modifiable_properties (CORBA::Boolean value
+ ACE_ENV_ARG_DECL_NOT_USED)
+ ACE_THROW_SPEC ((CORBA::SystemException));
+ virtual CORBA::Boolean
+ set_supports_dynamic_properties (CORBA::Boolean value
+ ACE_ENV_ARG_DECL_NOT_USED)
+ ACE_THROW_SPEC ((CORBA::SystemException));
+ virtual CORBA::Boolean
+ set_supports_proxy_offers (CORBA::Boolean value
+ ACE_ENV_ARG_DECL_NOT_USED)
+ ACE_THROW_SPEC ((CORBA::SystemException));
+
+ // = Link Interface parameters
+
+ virtual CORBA::ULong set_def_hop_count (CORBA::ULong value
+ ACE_ENV_ARG_DECL_NOT_USED)
+ ACE_THROW_SPEC ((CORBA::SystemException));
+ virtual CORBA::ULong set_max_hop_count (CORBA::ULong value
+ ACE_ENV_ARG_DECL_NOT_USED)
+ ACE_THROW_SPEC ((CORBA::SystemException));
+
+ virtual CosTrading::FollowOption
+ set_def_follow_policy (CosTrading::FollowOption policy
+ ACE_ENV_ARG_DECL_NOT_USED)
+ ACE_THROW_SPEC ((CORBA::SystemException));
+ virtual CosTrading::FollowOption
+ set_max_follow_policy (CosTrading::FollowOption policy
+ ACE_ENV_ARG_DECL_NOT_USED)
+ ACE_THROW_SPEC ((CORBA::SystemException));
+ virtual CosTrading::FollowOption
+ set_max_link_follow_policy (CosTrading::FollowOption policy
+ ACE_ENV_ARG_DECL_NOT_USED)
+ ACE_THROW_SPEC ((CORBA::SystemException));
+
+ // = Set Type Repository
+
+ virtual CosTrading::TypeRepository_ptr
+ set_type_repos (CosTrading::TypeRepository_ptr repository
+ ACE_ENV_ARG_DECL_NOT_USED)
+ ACE_THROW_SPEC ((CORBA::SystemException));
+
+ virtual CosTrading::Admin::OctetSeq*
+ request_id_stem (ACE_ENV_SINGLE_ARG_DECL_NOT_USED)
+ ACE_THROW_SPEC ((CORBA::SystemException));
+
+ virtual CosTrading::Admin::OctetSeq*
+ set_request_id_stem (const CosTrading::Admin::OctetSeq& stem
+ ACE_ENV_ARG_DECL_NOT_USED)
+ ACE_THROW_SPEC ((CORBA::SystemException));
+
+ virtual void list_offers (CORBA::ULong how_many,
+ CosTrading::OfferIdSeq_out ids,
+ CosTrading::OfferIdIterator_out id_itr
+ ACE_ENV_ARG_DECL)
+ ACE_THROW_SPEC ((CORBA::SystemException,
+ CosTrading::NotImplemented));
+
+
+ // BEGIN SPEC
+ // The list_offers operation allows the administrator of a trader to
+ // perform housekeeping by obtaining a handle on each of the offers
+ // within a trader (e.g., for garbage collection etc.). Only the
+ // identifiers of ordinary offers are returned, identifiers of proxy
+ // offers are not returned via this operation. If the trader does
+ // not support the Register interface, the NotImplemented exception
+ // is raised. The returned identifiers are passed back in one of two
+ // ways (or a combination of both). ° The "ids" return result
+ // conveys a list of offer identifiers and the "id_itr" is a
+ // reference to an interface at which additional offer identities
+ // can be obtained. ° The "how_many" parameter states how many
+ // identifiers are to be returned via the "ids" result; any
+ // remaining are available via the iterator interface. If the
+ // "how_many" exceeds the number of offers held in the trader, then
+ // the "id_itr" is nil.
+ // END SPEC
+
+ virtual void list_proxies (CORBA::ULong,
+ CosTrading::OfferIdSeq_out,
+ CosTrading::OfferIdIterator_out
+ ACE_ENV_ARG_DECL)
+ ACE_THROW_SPEC ((CORBA::SystemException,
+ CosTrading::NotImplemented));
+
+private:
+
+ // = Disallow these operations.
+ ACE_UNIMPLEMENTED_FUNC (void operator= (const TAO_Admin<TRADER_LOCK_TYPE,MAP_LOCK_TYPE> &))
+ ACE_UNIMPLEMENTED_FUNC (TAO_Admin (const TAO_Admin<TRADER_LOCK_TYPE,MAP_LOCK_TYPE> &))
+
+ TAO_Trader<TRADER_LOCK_TYPE,MAP_LOCK_TYPE> &trader_;
+
+ /// Unique prefix to create a sequence number space.
+ CosTrading::Admin::OctetSeq stem_id_;
+
+ /// Current sequence number.
+ CORBA::ULong sequence_number_;
+
+ TRADER_LOCK_TYPE lock_;
+};
+
+
+/**
+ * @class TAO_Link
+ */
+template <class TRADER_LOCK_TYPE, class MAP_LOCK_TYPE>
+class TAO_Link :
+ public TAO_Trader_Components <POA_CosTrading::Link>,
+ public TAO_Support_Attributes <POA_CosTrading::Link>,
+ public TAO_Link_Attributes <POA_CosTrading::Link>
+{
+public:
+
+ TAO_Link (TAO_Trader<TRADER_LOCK_TYPE,MAP_LOCK_TYPE> &trader);
+
+ ~TAO_Link (void);
+
+ /**
+ * BEGIN SPEC
+ * The add_link operation allows a trader subsequently to use the
+ * service of another trader in the performance of its own trading
+ * service operations.
+ */
+ virtual void add_link (const char *name,
+ CosTrading::Lookup_ptr target,
+ CosTrading::FollowOption def_pass_on_follow_rule,
+ CosTrading::FollowOption limiting_follow_rule
+ ACE_ENV_ARG_DECL)
+ ACE_THROW_SPEC ((CORBA::SystemException,
+ CosTrading::Link::IllegalLinkName,
+ CosTrading::Link::DuplicateLinkName,
+ CosTrading::InvalidLookupRef,
+ CosTrading::Link::DefaultFollowTooPermissive,
+ CosTrading::Link::LimitingFollowTooPermissive));
+
+ // The "name" parameter is used in subsequent link management
+ // operations to identify the intended link. If the parameter is not
+ // legally formed, then the IllegalLinkName exception is raised. An
+ // exception of DuplicateLinkName is raised if the link name already
+ // exists. The link name is also used as a component in a sequence
+ // of name components in naming a trader for resolving or forwarding
+ // operations. The sequence of context relative link names provides
+ // a path to a trader.
+
+ // The "target" parameter identifies the Lookup interface at which
+ // the trading service provided by the target trader can be
+ // accessed. Should the Lookup interface parameter be nil, then an
+ // exception of InvalidLookupRef is raised. The target interface is
+ // used to obtain the associated Register interface, which will be
+ // subsequently returned as part of a describe_link operation and
+ // invoked as part of a resolve operation.
+
+ // The "def_pass_on_follow_rule" parameter specifies the default
+ // link behavior for the link if no link behavior is specified on an
+ // importer's query request. If the "def_pass_on_follow_rule"
+ // exceeds the "limiting_follow_rule" specified in the next
+ // parameter, then a DefaultFollowTooPermissive exception is
+ // raised.
+
+ // The "limiting_follow_rule" parameter specifies the most
+ // permissive link follow behavior that the link is willing to
+ // tolerate. The exception LimitingFollowTooPermissive is raised if
+ // this parameter exceeds the trader's attribute of
+ // "max_link_follow_policy" at the time of the link's creation. Note
+ // it is possible for a link's "limiting_follow_rule" to exceed the
+ // trader's "max_link_follow_policy" later in the life of a link, as
+ // it is possible that the trader could set its
+ // "max_link_follow_policy" to a more restrictive value after the
+ // creation of the link.
+ // END SPEC
+
+ virtual void remove_link (const char *name
+ ACE_ENV_ARG_DECL)
+ ACE_THROW_SPEC ((CORBA::SystemException,
+ CosTrading::Link::IllegalLinkName,
+ CosTrading::Link::UnknownLinkName));
+
+ // BEGIN SPEC
+ // The remove_link operation removes all knowledge of the target
+ // trader. The target trader cannot be used subsequently to resolve,
+ // forward, or propagate trading operations from this trader.
+
+ // The "name" parameter identifies the link to be removed. The
+ // exception IllegalLinkName is raised if the link is formed poorly
+ // and the UnknownLinkName exception is raised if the named link is
+ // not in the trader.
+ // END SPEC
+
+ virtual CosTrading::Link::LinkInfo* describe_link (const char *name
+ ACE_ENV_ARG_DECL_NOT_USED)
+ ACE_THROW_SPEC ((CORBA::SystemException,
+ CosTrading::Link::IllegalLinkName,
+ CosTrading::Link::UnknownLinkName));
+
+ // BEGIN SPEC
+ // The describe_link operation returns information on a link held in
+ // the trader.
+
+ // The "name" parameter identifies the link whose description is
+ // required. For a malformed link name, the exception
+ // IllegalLinkName is raised. An UnknownLinkName exception is raised
+ // if the named link is not found in the trader.
+
+ // The operation returns a LinkInfo structure comprising: ° the
+ // Lookup interface of the target trading service, ° the Register
+ // interface of the target trading service, and ° the default, as
+ // well as the limiting follow behavior of the named link.
+
+ // If the target service does not support the Register interface,
+ // then that field of the LinkInfo structure is nil. Given the
+ // description of the Register::resolve() operation in "Resolve
+ // Operation" on page 16-45, most implementations will opt for
+ // determining the Register interface when add_link is called and
+ // storing that information statically with the rest of the link
+ // state.
+ // END SPEC
+
+ virtual CosTrading::LinkNameSeq* list_links (ACE_ENV_SINGLE_ARG_DECL_NOT_USED)
+ ACE_THROW_SPEC ((CORBA::SystemException));
+
+ // BEGIN SPEC
+ // The list_links operation returns a list of the names of all
+ // trading links within the trader. The names can be used
+ // subsequently for other management operations, such as
+ // describe_link or remove_link.
+ // END SPEC
+
+ virtual void modify_link (const char *name,
+ CosTrading::FollowOption def_pass_on_follow_rule,
+ CosTrading::FollowOption limiting_follow_rule
+ ACE_ENV_ARG_DECL)
+ ACE_THROW_SPEC ((CosTrading::Link::IllegalLinkName,
+ CosTrading::Link::UnknownLinkName,
+ CosTrading::Link::DefaultFollowTooPermissive,
+ CosTrading::Link::LimitingFollowTooPermissive));
+
+ // BEGIN SPEC
+ // The modify_link operation is used to change the existing link
+ // follow behaviors of an identified link. The Lookup interface
+ // reference of the target trader and the name of the link cannot be
+ // changed.
+
+ // The "name" parameter identifies the link whose follow behaviors
+ // are to be changed. A poorly formed "name" raises the
+ // IllegalLinkName exception. An UnknownLinkName exception is raised
+ // if the link name is not known to the trader.
+
+ // The "def_pass_on_follow_rule" parameter specifies the new default
+ // link behavior for this link. If the "def_pass_on_follow_rule"
+ // exceeds the "limiting_follow_rule" specified in the next
+ // parameter, then a DefaultFollowTooPermissive exception is
+ // raised.
+
+ // The "limiting_follow_rule" parameter specifies the new limit for
+ // the follow behavior of this link. The exception
+ // LimitingFollowTooPermissive is raised if the value exceeds the
+ // current "max_link_follow_policy" of the trader.
+ // END SPEC
+
+private:
+
+ // = Disallow these operations.
+ ACE_UNIMPLEMENTED_FUNC (void operator= (const TAO_Link<TRADER_LOCK_TYPE,MAP_LOCK_TYPE> &))
+ ACE_UNIMPLEMENTED_FUNC (TAO_Link (const TAO_Link<TRADER_LOCK_TYPE,MAP_LOCK_TYPE> &))
+
+ typedef ACE_Hash_Map_Manager_Ex
+ <
+ CORBA::String_var,
+ CosTrading::Link::LinkInfo,
+ ACE_Hash<CORBA::String_var>,
+ ACE_Equal_To<CORBA::String_var>,
+ MAP_LOCK_TYPE
+ >
+ Links;
+
+ /// The collection of link connecting this trader to others in the
+ /// federation.
+ Links links_;
+
+ TAO_Trader<TRADER_LOCK_TYPE,MAP_LOCK_TYPE> &trader_;
+};
+
+ // *************************************************************
+ // TAO_Proxy
+ // *************************************************************
+
+template <class TRADER_LOCK_TYPE, class MAP_LOCK_TYPE>
+class TAO_Proxy :
+ public TAO_Trader_Components <POA_CosTrading::Proxy>,
+ public TAO_Support_Attributes <POA_CosTrading::Proxy>
+{
+public:
+
+ TAO_Proxy (TAO_Trader<TRADER_LOCK_TYPE,MAP_LOCK_TYPE> &trader);
+
+ ~TAO_Proxy (void);
+
+ virtual CosTrading::OfferId
+ export_proxy (CosTrading::Lookup_ptr,
+ const char *,
+ const CosTrading::PropertySeq &,
+ CORBA::Boolean if_match_all,
+ const char *,
+ const CosTrading::PolicySeq &
+ ACE_ENV_ARG_DECL)
+ ACE_THROW_SPEC ((CORBA::SystemException,
+ CosTrading::IllegalServiceType,
+ CosTrading::UnknownServiceType,
+ CosTrading::InvalidLookupRef,
+ CosTrading::IllegalPropertyName,
+ CosTrading::PropertyTypeMismatch,
+ CosTrading::ReadonlyDynamicProperty,
+ CosTrading::MissingMandatoryProperty,
+ CosTrading::Proxy::IllegalRecipe,
+ CosTrading::DuplicatePropertyName,
+ CosTrading::DuplicatePolicyName));
+
+ virtual void withdraw_proxy (const char *
+ ACE_ENV_ARG_DECL)
+ ACE_THROW_SPEC ((CORBA::SystemException,
+ CosTrading::IllegalOfferId,
+ CosTrading::UnknownOfferId,
+ CosTrading::Proxy::NotProxyOfferId));
+
+ virtual CosTrading::Proxy::ProxyInfo *
+ describe_proxy (const char *
+ ACE_ENV_ARG_DECL)
+ ACE_THROW_SPEC ((CORBA::SystemException,
+ CosTrading::IllegalOfferId,
+ CosTrading::UnknownOfferId,
+ CosTrading::Proxy::NotProxyOfferId));
+
+ // = CosTrading::TraderComponents methods.
+
+ virtual void list_proxies (CORBA::ULong,
+ CosTrading::OfferIdSeq *&,
+ CosTrading::OfferIdIterator_ptr &
+ ACE_ENV_ARG_DECL)
+ ACE_THROW_SPEC ((CORBA::SystemException,
+ CosTrading::NotImplemented));
+
+private:
+
+ // = Disallow these operations.
+ ACE_UNIMPLEMENTED_FUNC (void operator= (const TAO_Proxy<TRADER_LOCK_TYPE,MAP_LOCK_TYPE> &))
+ ACE_UNIMPLEMENTED_FUNC (TAO_Proxy (const TAO_Proxy<TRADER_LOCK_TYPE,MAP_LOCK_TYPE> &))
+
+
+ TAO_Trader<TRADER_LOCK_TYPE,MAP_LOCK_TYPE>& trader_;
+};
+
+TAO_END_VERSIONED_NAMESPACE_DECL
+
+#if defined (ACE_TEMPLATES_REQUIRE_SOURCE)
+#include "orbsvcs/Trader/Trader_Interfaces.cpp"
+#endif /* ACE_TEMPLATES_REQUIRE_SOURCE */
+
+#if defined(_MSC_VER)
+#pragma warning(pop)
+#endif /* _MSC_VER */
+
+#include /**/ "ace/post.h"
+#endif /* TAO_TRADER_INTERFACES_H */
diff --git a/TAO/orbsvcs/orbsvcs/Trader/Trader_T.cpp b/TAO/orbsvcs/orbsvcs/Trader/Trader_T.cpp
new file mode 100644
index 00000000000..74c5a327976
--- /dev/null
+++ b/TAO/orbsvcs/orbsvcs/Trader/Trader_T.cpp
@@ -0,0 +1,325 @@
+// $Id$
+
+#ifndef TAO_TRADER_CPP
+#define TAO_TRADER_CPP
+
+#include "orbsvcs/Trader/Trader_T.h"
+#include "orbsvcs/Trader/Trader_Interfaces.h"
+
+TAO_BEGIN_VERSIONED_NAMESPACE_DECL
+
+template <class TRADER_LOCK_TYPE, class MAP_LOCK_TYPE>
+TAO_Trader<TRADER_LOCK_TYPE, MAP_LOCK_TYPE>::
+TAO_Trader (TAO_Trader_Base::Trader_Components components)
+{
+ ACE_DECLARE_NEW_CORBA_ENV;
+
+ // @@ Seth, we need a way to propagate the exception out. This will
+ // not work on platforms using environment variable.
+ for (int i = LOOKUP_IF; i <= LINK_IF; i++)
+ this->ifs_[i] = 0;
+
+ if (ACE_BIT_ENABLED (components, LOOKUP))
+ {
+ TAO_Lookup<TRADER_LOCK_TYPE, MAP_LOCK_TYPE>* lookup;
+
+ ACE_NEW (lookup,
+ (TAO_Lookup<TRADER_LOCK_TYPE, MAP_LOCK_TYPE>) (*this));
+
+ this->trading_components ().lookup_if (lookup->_this (ACE_ENV_SINGLE_ARG_PARAMETER));
+ ACE_CHECK;
+ lookup->_remove_ref (ACE_ENV_SINGLE_ARG_PARAMETER);
+ ACE_CHECK;
+
+ this->ifs_[LOOKUP_IF] = lookup;
+ }
+ if (ACE_BIT_ENABLED (components, REGISTER))
+ {
+ TAO_Register<TRADER_LOCK_TYPE, MAP_LOCK_TYPE>* reg;
+
+ ACE_NEW (reg,
+ (TAO_Register<TRADER_LOCK_TYPE, MAP_LOCK_TYPE>) (*this));
+
+ this->trading_components ().register_if (reg->_this (ACE_ENV_SINGLE_ARG_PARAMETER));
+ ACE_CHECK;
+ reg->_remove_ref (ACE_ENV_SINGLE_ARG_PARAMETER);
+ ACE_CHECK;
+
+ this->ifs_[REGISTER_IF] = reg;
+ }
+ if (ACE_BIT_ENABLED (components, ADMIN))
+ {
+ TAO_Admin<TRADER_LOCK_TYPE, MAP_LOCK_TYPE>* admin;
+
+ ACE_NEW (admin,
+ (TAO_Admin<TRADER_LOCK_TYPE, MAP_LOCK_TYPE>) (*this));
+
+ this->trading_components ().admin_if (admin->_this (ACE_ENV_SINGLE_ARG_PARAMETER));
+ ACE_CHECK;
+ admin->_remove_ref (ACE_ENV_SINGLE_ARG_PARAMETER);
+ ACE_CHECK;
+
+ this->ifs_[ADMIN_IF] = admin;
+ }
+ if (ACE_BIT_ENABLED (components, PROXY))
+ {
+ TAO_Proxy<TRADER_LOCK_TYPE, MAP_LOCK_TYPE>* proxy;
+
+ ACE_NEW (proxy,
+ (TAO_Proxy<TRADER_LOCK_TYPE, MAP_LOCK_TYPE>) (*this));
+
+ this->trading_components ().proxy_if (proxy->_this (ACE_ENV_SINGLE_ARG_PARAMETER));
+ ACE_CHECK;
+ proxy->_remove_ref (ACE_ENV_SINGLE_ARG_PARAMETER);
+ ACE_CHECK;
+
+ this->ifs_[PROXY_IF] = proxy;
+ }
+ if (ACE_BIT_ENABLED (components, LINK))
+ {
+ TAO_Link<TRADER_LOCK_TYPE, MAP_LOCK_TYPE>* link;
+
+ ACE_NEW (link,
+ (TAO_Link<TRADER_LOCK_TYPE, MAP_LOCK_TYPE>) (*this));
+
+ this->trading_components ().link_if (link->_this (ACE_ENV_SINGLE_ARG_PARAMETER));
+ ACE_CHECK;
+ link->_remove_ref (ACE_ENV_SINGLE_ARG_PARAMETER);
+ ACE_CHECK;
+
+ this->ifs_[LINK_IF] = link;
+ }
+}
+
+template <class TRADER_LOCK_TYPE, class MAP_LOCK_TYPE>
+TAO_Trader<TRADER_LOCK_TYPE, MAP_LOCK_TYPE>::~TAO_Trader (void)
+{
+ // Remove Trading Components from POA
+
+ ACE_DECLARE_NEW_CORBA_ENV;
+
+ for (int i = LOOKUP_IF; i <= LINK_IF; i++)
+ {
+ if (this->ifs_[i] != 0)
+ {
+ ACE_TRY
+ {
+ PortableServer::POA_var poa =
+ this->ifs_[i]->_default_POA (ACE_ENV_SINGLE_ARG_PARAMETER);
+ ACE_TRY_CHECK;
+
+ PortableServer::ObjectId_var id =
+ poa->servant_to_id (this->ifs_[i] ACE_ENV_ARG_PARAMETER);
+ ACE_TRY_CHECK;
+
+ poa->deactivate_object (id.in () ACE_ENV_ARG_PARAMETER);
+ ACE_TRY_CHECK;
+ }
+ ACE_CATCHANY
+ {
+ // Don't let exceptions propagate out of this call since
+ // it's the destructor!
+ }
+ ACE_ENDTRY;
+ }
+ }
+}
+
+template <class TRADER_LOCK_TYPE, class MAP_LOCK_TYPE>
+TAO_Offer_Database<MAP_LOCK_TYPE>&
+TAO_Trader<TRADER_LOCK_TYPE, MAP_LOCK_TYPE>::offer_database (void)
+{
+ return this->offer_database_;
+}
+
+template <class TRADER_LOCK_TYPE, class MAP_LOCK_TYPE> ACE_Lock &
+TAO_Trader<TRADER_LOCK_TYPE, MAP_LOCK_TYPE>::lock (void)
+{
+ return this->lock_;
+}
+
+template <class IF>
+TAO_Trader_Components<IF>::
+TAO_Trader_Components (const TAO_Trading_Components_i& comps)
+ : comps_ (comps)
+{
+}
+
+template <class IF> CosTrading::Lookup_ptr
+TAO_Trader_Components<IF>::lookup_if (ACE_ENV_SINGLE_ARG_DECL_NOT_USED)
+ ACE_THROW_SPEC ((CORBA::SystemException))
+{
+ return CosTrading::Lookup::_duplicate (this->comps_.lookup_if ());
+}
+
+template <class IF> CosTrading::Register_ptr
+TAO_Trader_Components<IF>::register_if (ACE_ENV_SINGLE_ARG_DECL_NOT_USED)
+ ACE_THROW_SPEC ((CORBA::SystemException))
+{
+ return CosTrading::Register::_duplicate (this->comps_.register_if ());
+}
+
+template <class IF> CosTrading::Admin_ptr
+TAO_Trader_Components<IF>::admin_if (ACE_ENV_SINGLE_ARG_DECL_NOT_USED)
+ ACE_THROW_SPEC ((CORBA::SystemException))
+{
+ return CosTrading::Admin::_duplicate (this->comps_.admin_if ());
+}
+
+template <class IF> CosTrading::Proxy_ptr
+TAO_Trader_Components<IF>::proxy_if (ACE_ENV_SINGLE_ARG_DECL_NOT_USED)
+ ACE_THROW_SPEC ((CORBA::SystemException))
+{
+ return CosTrading::Proxy::_duplicate (this->comps_.proxy_if ());
+}
+
+template <class IF> CosTrading::Link_ptr
+TAO_Trader_Components<IF>::link_if (ACE_ENV_SINGLE_ARG_DECL_NOT_USED)
+ ACE_THROW_SPEC ((CORBA::SystemException))
+{
+ return CosTrading::Link::_duplicate (this->comps_.link_if ());
+}
+template <class IF>
+TAO_Support_Attributes<IF>::
+TAO_Support_Attributes (const TAO_Support_Attributes_i& attrs)
+ : attrs_ (attrs)
+{
+}
+
+template <class IF> CORBA::Boolean
+TAO_Support_Attributes<IF>::supports_modifiable_properties (ACE_ENV_SINGLE_ARG_DECL_NOT_USED)
+ ACE_THROW_SPEC ((CORBA::SystemException))
+{
+ return this->attrs_.supports_modifiable_properties ();
+}
+
+template <class IF> CORBA::Boolean
+TAO_Support_Attributes<IF>::supports_dynamic_properties (ACE_ENV_SINGLE_ARG_DECL_NOT_USED)
+ ACE_THROW_SPEC ((CORBA::SystemException))
+{
+ return this->attrs_.supports_dynamic_properties ();
+}
+
+template <class IF> CORBA::Boolean
+TAO_Support_Attributes<IF>::supports_proxy_offers (ACE_ENV_SINGLE_ARG_DECL_NOT_USED)
+ ACE_THROW_SPEC ((CORBA::SystemException))
+{
+ return this->attrs_.supports_proxy_offers ();
+}
+
+template <class IF> CosTrading::TypeRepository_ptr
+TAO_Support_Attributes<IF>::type_repos (ACE_ENV_SINGLE_ARG_DECL_NOT_USED )
+ ACE_THROW_SPEC ((CORBA::SystemException))
+{
+ return CosTrading::TypeRepository::_duplicate (this->attrs_.type_repos ());
+}
+
+template <class IF>
+TAO_Import_Attributes<IF>::
+TAO_Import_Attributes (const TAO_Import_Attributes_i& attrs)
+ : attrs_ (attrs)
+{
+}
+
+template <class IF> CORBA::ULong
+TAO_Import_Attributes<IF>::def_search_card (ACE_ENV_SINGLE_ARG_DECL_NOT_USED)
+ ACE_THROW_SPEC ((CORBA::SystemException))
+{
+ return this->attrs_.def_search_card ();
+}
+
+template <class IF> CORBA::ULong
+TAO_Import_Attributes<IF>::max_search_card (ACE_ENV_SINGLE_ARG_DECL_NOT_USED)
+ ACE_THROW_SPEC ((CORBA::SystemException))
+{
+ return this->attrs_.max_search_card ();
+}
+
+template <class IF> CORBA::ULong
+TAO_Import_Attributes<IF>::def_match_card (ACE_ENV_SINGLE_ARG_DECL_NOT_USED)
+ ACE_THROW_SPEC ((CORBA::SystemException))
+{
+ return this->attrs_.def_match_card ();
+}
+
+template <class IF> CORBA::ULong
+TAO_Import_Attributes<IF>::max_match_card (ACE_ENV_SINGLE_ARG_DECL_NOT_USED)
+ ACE_THROW_SPEC ((CORBA::SystemException))
+{
+ return this->attrs_.max_match_card ();
+}
+
+template <class IF> CORBA::ULong
+TAO_Import_Attributes<IF>::def_return_card (ACE_ENV_SINGLE_ARG_DECL_NOT_USED)
+ ACE_THROW_SPEC ((CORBA::SystemException))
+{
+ return this->attrs_.def_return_card ();
+}
+
+template <class IF> CORBA::ULong
+TAO_Import_Attributes<IF>::max_return_card (ACE_ENV_SINGLE_ARG_DECL_NOT_USED)
+ ACE_THROW_SPEC ((CORBA::SystemException))
+{
+ return this->attrs_.max_return_card ();
+}
+
+template <class IF> CORBA::ULong
+TAO_Import_Attributes<IF>::max_list (ACE_ENV_SINGLE_ARG_DECL_NOT_USED)
+ ACE_THROW_SPEC ((CORBA::SystemException))
+{
+ return this->attrs_.max_list ();
+}
+
+template <class IF> CORBA::ULong
+TAO_Import_Attributes<IF>::def_hop_count (ACE_ENV_SINGLE_ARG_DECL_NOT_USED)
+ ACE_THROW_SPEC ((CORBA::SystemException))
+{
+ return this->attrs_.def_hop_count ();
+}
+
+template <class IF> CORBA::ULong
+TAO_Import_Attributes<IF>::max_hop_count (ACE_ENV_SINGLE_ARG_DECL_NOT_USED)
+ ACE_THROW_SPEC ((CORBA::SystemException))
+{
+ return this->attrs_.max_hop_count ();
+}
+
+template <class IF> CosTrading::FollowOption
+TAO_Import_Attributes<IF>::def_follow_policy (ACE_ENV_SINGLE_ARG_DECL_NOT_USED)
+ ACE_THROW_SPEC ((CORBA::SystemException))
+{
+ return this->attrs_.def_follow_policy ();
+}
+
+template <class IF> CosTrading::FollowOption
+TAO_Import_Attributes<IF>::max_follow_policy (ACE_ENV_SINGLE_ARG_DECL_NOT_USED)
+ ACE_THROW_SPEC ((CORBA::SystemException))
+{
+ return this->attrs_.max_follow_policy ();
+}
+
+template <class IF>
+TAO_Link_Attributes<IF>::
+TAO_Link_Attributes (const TAO_Link_Attributes_i& attrs)
+ : attrs_ (attrs)
+{
+}
+
+template <class IF> CosTrading::FollowOption
+TAO_Link_Attributes<IF>::max_link_follow_policy (ACE_ENV_SINGLE_ARG_DECL_NOT_USED)
+ ACE_THROW_SPEC ((CORBA::SystemException))
+{
+ return this->attrs_.max_link_follow_policy ();
+}
+
+template <class ELEMENT_TYPE> int
+TAO_Element_Equal<ELEMENT_TYPE>::
+operator () (TAO_DynSequence_i& dyn_any,
+ const ELEMENT_TYPE& element)
+{
+ return 1;
+}
+
+TAO_END_VERSIONED_NAMESPACE_DECL
+
+#endif /* TAO_TRADER_CPP */
diff --git a/TAO/orbsvcs/orbsvcs/Trader/Trader_T.h b/TAO/orbsvcs/orbsvcs/Trader/Trader_T.h
new file mode 100644
index 00000000000..cf892279bcc
--- /dev/null
+++ b/TAO/orbsvcs/orbsvcs/Trader/Trader_T.h
@@ -0,0 +1,278 @@
+// -*- C++ -*-
+
+//=============================================================================
+/**
+ * @file Trader_T.h
+ *
+ * $Id$
+ *
+ * @author Marina Spivak <marina@cs.wustl.edu>
+ * @author Seth Widoff <sbw1@cs.wustl.edu>
+ * @author Irfan Pyarali <irfan@cs.wustl.edu>
+ */
+//=============================================================================
+
+
+#ifndef TAO_TRADER_H
+#define TAO_TRADER_H
+#include /**/ "ace/pre.h"
+
+#include "orbsvcs/Trader/Trader.h"
+#include "orbsvcs/Trader/Offer_Database.h"
+#include "ace/Containers.h"
+#include "ace/Lock_Adapter_T.h"
+
+// *************************************************************
+// TAO_Trader
+// *************************************************************
+
+#if defined(_MSC_VER)
+#pragma warning(push)
+#pragma warning (disable:4250)
+#endif /* _MSC_VER */
+
+TAO_BEGIN_VERSIONED_NAMESPACE_DECL
+
+class TAO_DynSequence_i;
+
+/**
+ * @class TAO_Trader
+ *
+ * @brief This class packages together all the various pieces that
+ * provide functionality specified in COS Trading specification.
+ *
+ * TAO_Trader contains all the components that together represent
+ * a single trader. Based on its constructor arguments,
+ * TAO_Trader creates instances of appropriate interface
+ * implementations as well as instances of objects common to
+ * more than one interface (offers, attributes, etc.).
+ * TAO_Trader also enforces the proper order on all
+ * initializations. TAO_Trader acts like a "glue" class that
+ * creates appropriate components, holds everything together,
+ * and enforces order. TAO_Trader is parameterized by two types
+ * of locks: one for its service service offers, one for its
+ * state (configuration).
+ */
+template <class TRADER_LOCK_TYPE, class MAP_LOCK_TYPE>
+class TAO_Trader : public TAO_Trader_Base
+{
+public:
+
+ // The desired combination of interfaces to be passed to the
+ // TAO_Trader constructor.
+
+ /// Offer Database Trait.
+ typedef TAO_Offer_Database<MAP_LOCK_TYPE> Offer_Database;
+
+ /**
+ * Constructor which based on its arguments will create
+ * a particular type of trader (e.g. Query trader, Simple trader, etc.)
+ * The argument is a bitwise OR of desired Trader_Components as listed
+ * in enumerated type above.
+ */
+ TAO_Trader (Trader_Components components = LOOKUP);
+
+ /// Destructor.
+ virtual ~TAO_Trader (void);
+
+ /// Accessor for the structure with all the service offers.
+ Offer_Database& offer_database (void);
+
+ /// Returns the trader
+ ACE_Lock &lock (void);
+
+protected:
+
+ typedef TAO_Trader<TRADER_LOCK_TYPE, MAP_LOCK_TYPE> TRADER_SELF;
+
+ Offer_Database offer_database_;
+
+ /// Lock that guards the state of the trader (its configuration).
+ ACE_Lock_Adapter<TRADER_LOCK_TYPE> lock_;
+
+ enum { LOOKUP_IF, REGISTER_IF, ADMIN_IF, PROXY_IF, LINK_IF };
+
+ PortableServer::ServantBase* ifs_[5];
+
+private:
+
+ // = Disallow these operations.
+ ACE_UNIMPLEMENTED_FUNC (void operator= (const TAO_Trader<TRADER_LOCK_TYPE, MAP_LOCK_TYPE> &))
+};
+
+ // *************************************************************
+ // Template Attribute Classes
+ // *************************************************************
+
+template <class IF>
+class TAO_Trader_Components :
+ public virtual IF
+{
+public:
+
+ TAO_Trader_Components (const TAO_Trading_Components_i& comps);
+
+ // = CosTrading::TraderComponents methods.
+ /// Returns an object reference to the Lookup interface of the trader.
+ /// Returns nil if the trader does not support Lookup interface.
+ virtual CosTrading::Lookup_ptr lookup_if (ACE_ENV_SINGLE_ARG_DECL_NOT_USED)
+ ACE_THROW_SPEC ((CORBA::SystemException));
+
+ /// Returns object reference for the Register interface of the trader.
+ /// Returns nil if the trader does not support Register interface.
+ virtual CosTrading::Register_ptr register_if (ACE_ENV_SINGLE_ARG_DECL_NOT_USED)
+ ACE_THROW_SPEC ((CORBA::SystemException));
+
+ /// Returns object reference for the Link interface of the trader.
+ /// Returns nil if the trader does not support Link interface.
+ virtual CosTrading::Link_ptr link_if (ACE_ENV_SINGLE_ARG_DECL_NOT_USED)
+ ACE_THROW_SPEC ((CORBA::SystemException));
+
+ /// Returns object reference to the Proxy interface of the trader.
+ /// Returns nil if the trader does not support Proxy interface.
+ virtual CosTrading::Proxy_ptr proxy_if (ACE_ENV_SINGLE_ARG_DECL_NOT_USED)
+ ACE_THROW_SPEC ((CORBA::SystemException));
+
+ /// Returns object reference for the Admin interface of the trader.
+ /// Returns nil if the trader does not support Admin interface.
+ virtual CosTrading::Admin_ptr admin_if (ACE_ENV_SINGLE_ARG_DECL_NOT_USED)
+ ACE_THROW_SPEC ((CORBA::SystemException));
+
+private:
+
+ const TAO_Trading_Components_i& comps_;
+};
+
+template <class IF>
+class TAO_Support_Attributes : public virtual IF
+{
+public:
+
+ TAO_Support_Attributes (const TAO_Support_Attributes_i& attrs);
+
+ // = CosTrading::SupportAttributes methods.
+
+ virtual CORBA::Boolean supports_modifiable_properties (ACE_ENV_SINGLE_ARG_DECL_NOT_USED)
+ ACE_THROW_SPEC ((CORBA::SystemException));
+
+ virtual CORBA::Boolean supports_dynamic_properties (ACE_ENV_SINGLE_ARG_DECL_NOT_USED)
+ ACE_THROW_SPEC ((CORBA::SystemException));
+
+ virtual CORBA::Boolean supports_proxy_offers (ACE_ENV_SINGLE_ARG_DECL_NOT_USED)
+ ACE_THROW_SPEC ((CORBA::SystemException));
+
+ virtual CosTrading::TypeRepository_ptr type_repos (ACE_ENV_SINGLE_ARG_DECL_NOT_USED)
+ ACE_THROW_SPEC ((CORBA::SystemException));
+
+private:
+
+ const TAO_Support_Attributes_i& attrs_;
+};
+
+template <class IF>
+class TAO_Import_Attributes : public virtual IF
+{
+public:
+
+ TAO_Import_Attributes (const TAO_Import_Attributes_i& attrs);
+
+ // = CosTrading::ImportAttributes methods.
+
+ virtual CORBA::ULong def_search_card (ACE_ENV_SINGLE_ARG_DECL_NOT_USED)
+ ACE_THROW_SPEC ((CORBA::SystemException));
+
+ virtual CORBA::ULong max_search_card (ACE_ENV_SINGLE_ARG_DECL_NOT_USED)
+ ACE_THROW_SPEC ((CORBA::SystemException));
+
+ // Search cardinality determines the maximum number of offers searched
+ // before not considering other offers.
+
+ virtual CORBA::ULong def_match_card (ACE_ENV_SINGLE_ARG_DECL_NOT_USED)
+ ACE_THROW_SPEC ((CORBA::SystemException));
+
+ virtual CORBA::ULong max_match_card (ACE_ENV_SINGLE_ARG_DECL_NOT_USED)
+ ACE_THROW_SPEC ((CORBA::SystemException));
+
+ // Match cardinality determines the maximum number of offers
+ // matched to the constraints before not considering other offers..
+
+ virtual CORBA::ULong def_return_card (ACE_ENV_SINGLE_ARG_DECL_NOT_USED)
+ ACE_THROW_SPEC ((CORBA::SystemException));
+
+ virtual CORBA::ULong max_return_card (ACE_ENV_SINGLE_ARG_DECL_NOT_USED)
+ ACE_THROW_SPEC ((CORBA::SystemException));
+
+ // Return cardinality determines the maximum number of offers marked
+ // to return before not considering other offers.
+
+
+ virtual CORBA::ULong max_list (ACE_ENV_SINGLE_ARG_DECL_NOT_USED)
+ ACE_THROW_SPEC ((CORBA::SystemException));
+
+ virtual CORBA::ULong def_hop_count (ACE_ENV_SINGLE_ARG_DECL_NOT_USED)
+ ACE_THROW_SPEC ((CORBA::SystemException));
+
+ virtual CORBA::ULong max_hop_count (ACE_ENV_SINGLE_ARG_DECL_NOT_USED)
+ ACE_THROW_SPEC ((CORBA::SystemException));
+
+ virtual CosTrading::FollowOption def_follow_policy (ACE_ENV_SINGLE_ARG_DECL_NOT_USED)
+ ACE_THROW_SPEC ((CORBA::SystemException));
+
+ virtual CosTrading::FollowOption max_follow_policy (ACE_ENV_SINGLE_ARG_DECL_NOT_USED)
+ ACE_THROW_SPEC ((CORBA::SystemException));
+
+
+private:
+
+ const TAO_Import_Attributes_i& attrs_;
+};
+
+template <class IF>
+class TAO_Link_Attributes : public virtual IF
+{
+public:
+
+ TAO_Link_Attributes (const TAO_Link_Attributes_i& attrs);
+
+ // = CosTrading::LinkAttributes methods
+ virtual CosTrading::FollowOption max_link_follow_policy (ACE_ENV_SINGLE_ARG_DECL_NOT_USED)
+ ACE_THROW_SPEC ((CORBA::SystemException));
+
+private:
+
+ const TAO_Link_Attributes_i& attrs_;
+};
+
+ // *************************************************************
+ // TAO_Sequence_Extracter
+ // *************************************************************
+
+/**
+ * @class TAO_Element_Equal
+ *
+ * @brief Function object for determining if the sequence element at the
+ * current position of the dynamic sequence any parameter is equal to
+ * the element parameter.
+ */
+template <class ELEMENT_TYPE>
+class TAO_Element_Equal
+{
+public:
+ /// Calls the correct method on dyn_seq to extract the element type, then
+ /// uses the appropriate form of equals comparison.
+ int operator () (TAO_DynSequence_i& dyn_any,
+ const ELEMENT_TYPE& element);
+};
+
+TAO_END_VERSIONED_NAMESPACE_DECL
+
+#if defined (ACE_TEMPLATES_REQUIRE_SOURCE)
+#include "orbsvcs/Trader/Trader_T.cpp"
+#endif /* ACE_TEMPLATES_REQUIRE_SOURCE */
+
+#if defined(_MSC_VER)
+#pragma warning(pop)
+#endif /* _MSC_VER */
+
+#include /**/ "ace/post.h"
+#endif /* ACE_TRADER_H */
diff --git a/TAO/orbsvcs/orbsvcs/Trader/Trader_Utils.cpp b/TAO/orbsvcs/orbsvcs/Trader/Trader_Utils.cpp
new file mode 100644
index 00000000000..4de7d0c8638
--- /dev/null
+++ b/TAO/orbsvcs/orbsvcs/Trader/Trader_Utils.cpp
@@ -0,0 +1,1535 @@
+// $Id$
+
+#include "orbsvcs/Trader/Trader_Utils.h"
+#include "ace/OS_NS_string.h"
+
+ACE_RCSID(Trader, Trader_Utils, "$Id$")
+
+TAO_BEGIN_VERSIONED_NAMESPACE_DECL
+
+bool
+operator== (CORBA::String_var const & lhs,
+ CORBA::String_var const & rhs)
+{
+ return (ACE_OS::strcmp (lhs.in (), rhs.in ()) == 0);
+}
+
+TAO_Policy_Creator::TAO_Policy_Creator (int num_policies)
+ : policies_ (num_policies),
+ num_policies_ (0)
+{
+ for (int i = 0; i < TAO_Policies::REQUEST_ID + 1; i++)
+ this->poltable_[i] = -1;
+}
+
+void
+TAO_Policy_Creator::search_card (CORBA::ULong scard)
+{
+ CosTrading::Policy& policy =
+ this->fetch_next_policy (TAO_Policies::SEARCH_CARD);
+ policy.value <<= scard;
+}
+
+void
+TAO_Policy_Creator::match_card (CORBA::ULong mcard)
+{
+ CosTrading::Policy& policy =
+ this->fetch_next_policy (TAO_Policies::MATCH_CARD);
+ policy.value <<= mcard;
+}
+
+void
+TAO_Policy_Creator::return_card (CORBA::ULong rcard)
+{
+ CosTrading::Policy& policy =
+ this->fetch_next_policy (TAO_Policies::RETURN_CARD);
+ policy.value <<= rcard;
+}
+
+void
+TAO_Policy_Creator::use_modifiable_properties (CORBA::Boolean mod_props)
+{
+ CosTrading::Policy& policy =
+ this->fetch_next_policy (TAO_Policies::USE_MODIFIABLE_PROPERTIES);
+ policy.value <<= CORBA::Any::from_boolean (mod_props);
+}
+
+void
+TAO_Policy_Creator::use_dynamic_properties (CORBA::Boolean dyn_props)
+{
+ CosTrading::Policy& policy =
+ this->fetch_next_policy (TAO_Policies::USE_DYNAMIC_PROPERTIES);
+ policy.value <<= CORBA::Any::from_boolean (dyn_props);
+}
+
+void
+TAO_Policy_Creator::use_proxy_offers (CORBA::Boolean prox_offs)
+{
+ CosTrading::Policy& policy =
+ this->fetch_next_policy (TAO_Policies::USE_PROXY_OFFERS);
+ policy.value <<= CORBA::Any::from_boolean (prox_offs);
+}
+
+void
+TAO_Policy_Creator::starting_trader (const CosTrading::TraderName& name)
+{
+ CosTrading::Policy& policy =
+ this->fetch_next_policy (TAO_Policies::STARTING_TRADER);
+ policy.value <<= name;
+}
+
+void
+TAO_Policy_Creator::starting_trader (CosTrading::TraderName* name)
+{
+ CosTrading::Policy& policy =
+ this->fetch_next_policy (TAO_Policies::STARTING_TRADER);
+ policy.value <<= name;
+}
+
+void
+TAO_Policy_Creator::
+link_follow_rule (CosTrading::FollowOption follow_option)
+{
+ CosTrading::Policy& policy =
+ this->fetch_next_policy (TAO_Policies::LINK_FOLLOW_RULE);
+ policy.value <<= follow_option;
+}
+
+void
+TAO_Policy_Creator::hop_count (CORBA::ULong hop_count)
+{
+ CosTrading::Policy& policy =
+ this->fetch_next_policy (TAO_Policies::HOP_COUNT);
+ policy.value <<= hop_count;
+}
+
+void
+TAO_Policy_Creator::exact_type_match (CORBA::Boolean exact_type)
+{
+ CosTrading::Policy& policy =
+ this->fetch_next_policy (TAO_Policies::EXACT_TYPE_MATCH);
+ policy.value <<= CORBA::Any::from_boolean (exact_type);
+}
+
+void
+TAO_Policy_Creator::request_id (const CosTrading::Admin::OctetSeq& request_id)
+{
+ CosTrading::Policy& policy =
+ this->fetch_next_policy (TAO_Policies::REQUEST_ID);
+ policy.value <<= request_id;
+}
+
+TAO_Policy_Creator::operator const CosTrading::PolicySeq& (void) const
+{
+ return this->policies_;
+}
+
+const CosTrading::PolicySeq&
+TAO_Policy_Creator::policy_seq (void) const
+{
+ return this->policies_;
+}
+
+CosTrading::Policy&
+TAO_Policy_Creator::fetch_next_policy (TAO_Policies::POLICY_TYPE pol_type)
+{
+ CORBA::ULong index = 0;
+
+ if (this->poltable_[pol_type] == -1)
+ {
+ // Expand the policy sequence, and copy in the policy name into
+ // the new element.
+ CORBA::ULong length = this->policies_.length ();
+ this->num_policies_++;
+
+ if (length < this->num_policies_)
+ this->policies_.length (this->num_policies_);
+
+ index = this->num_policies_ - 1;
+
+ // Ensure the starting trader policy gets the first slot.
+ if (pol_type != TAO_Policies::STARTING_TRADER
+ || index == 0)
+ {
+ this->policies_[index].name = TAO_Policies::POLICY_NAMES[pol_type];
+ this->poltable_[pol_type] = index;
+ }
+ else
+ {
+ // Copy the element in the first slot to the newly
+ // allocated slot.
+ TAO_Policies::POLICY_TYPE occupying_policy =
+ TAO_Policies::STARTING_TRADER;
+ for (CORBA::ULong i = 0; i < this->num_policies_ - 1; i++)
+ {
+ if (this->poltable_[i] == 0)
+ {
+ occupying_policy =
+ static_cast<TAO_Policies::POLICY_TYPE> (i);
+ break;
+ }
+ }
+
+ this->poltable_[occupying_policy] = index;
+ this->poltable_[TAO_Policies::STARTING_TRADER] = 0;
+ this->policies_[index].name =
+ TAO_Policies::POLICY_NAMES[occupying_policy];
+ this->policies_[index].value = this->policies_[0].value;
+ this->policies_[0].name =
+ TAO_Policies::POLICY_NAMES[TAO_Policies::STARTING_TRADER];
+
+ index = 0;
+ }
+ }
+ else
+ index = this->poltable_[pol_type];
+
+ return this->policies_[index];
+}
+
+// Constructor
+
+TAO_Property_Evaluator::
+TAO_Property_Evaluator(const CosTrading::PropertySeq& props,
+ CORBA::Boolean supports_dp)
+ : props_ (props),
+ supports_dp_ (supports_dp),
+ dp_cache_ (new CORBA::Any*[props.length ()])
+{
+ if (this->dp_cache_ != 0)
+ {
+ for (CORBA::ULong i = 0; i < this->props_.length (); i++)
+ this->dp_cache_[i] = 0;
+ }
+}
+
+
+TAO_Property_Evaluator::
+TAO_Property_Evaluator(CosTrading::Offer& offer,
+ CORBA::Boolean supports_dp)
+ : props_ (offer.properties),
+ supports_dp_ (supports_dp),
+ dp_cache_ (new CORBA::Any*[offer.properties.length ()])
+{
+ if (this->dp_cache_ != 0)
+ for (CORBA::ULong i = 0; i < this->props_.length (); i++)
+ this->dp_cache_[i] = 0;
+}
+
+TAO_Property_Evaluator::~TAO_Property_Evaluator (void)
+{
+ // Clean up the results of any dynamic properties.
+ for (CORBA::ULong i = 0; i < this->props_.length (); i++)
+ if (this->dp_cache_[i] != 0)
+ delete this->dp_cache_[i];
+
+ delete [] this->dp_cache_;
+}
+
+int
+TAO_Property_Evaluator::is_dynamic_property (int index)
+{
+ int return_value = 0;
+ int num_properties = this->props_.length();
+
+ // Ensure index is in bounds.
+ if (index >= 0 && index < num_properties)
+ {
+ // Obtain the value of the property at index <index>.
+ const CORBA::Any& value = this->props_[index].value;
+ CORBA::TypeCode_var type = value.type ();
+
+ // @@ Seth, this will not work on platforms using environment variable.
+ ACE_DECLARE_NEW_CORBA_ENV;
+ CORBA::Boolean equal = type->equal (CosTradingDynamic::_tc_DynamicProp
+ ACE_ENV_ARG_PARAMETER);
+ ACE_CHECK_RETURN (0);
+
+ if (equal)
+ return_value = 1;
+ }
+
+ return return_value;
+}
+
+CORBA::Any*
+TAO_Property_Evaluator::property_value (int index
+ ACE_ENV_ARG_DECL)
+ ACE_THROW_SPEC ((CosTradingDynamic::DPEvalFailure))
+{
+ CORBA::Any* prop_val = 0;
+ CORBA::Boolean in_cache =
+ this->dp_cache_ != 0 && this->dp_cache_[index] != 0;
+
+ int dynamic = this->is_dynamic_property (index);
+
+ if (!dynamic)
+ prop_val = (CORBA::Any *) &(this->props_[index].value);
+ else if (this->supports_dp_ && in_cache)
+ prop_val = this->dp_cache_[index];
+ else if (this->supports_dp_)
+ {
+ // Property is defined at this point.
+ CosTradingDynamic::DynamicProp* dp_struct;
+ const CORBA::String_var name = this->props_[index].name.in ();
+ const CORBA::Any& value = this->props_[index].value;
+
+ // Extract the DP_Struct.
+ value >>= dp_struct;
+
+ CosTradingDynamic::DynamicPropEval_var dp_eval =
+ CosTradingDynamic::DynamicPropEval::_duplicate (dp_struct->eval_if.in ());
+
+ if (CORBA::is_nil (dp_eval.in ()))
+ {
+ ACE_THROW_RETURN (CosTradingDynamic::
+ DPEvalFailure (name,
+ CORBA::TypeCode::_nil (),
+ CORBA::Any ()),
+ prop_val);
+ }
+ else
+ {
+ CORBA::TypeCode* type = dp_struct->returned_type.in ();
+ CORBA::Any& info = dp_struct->extra_info;
+
+ ACE_TRY
+ {
+ // Retrieve the value of the dynamic property.
+ prop_val = dp_eval->evalDP(name, type, info ACE_ENV_ARG_PARAMETER);
+ ACE_TRY_CHECK;
+
+ if (this->dp_cache_ != 0)
+ this->dp_cache_[index] = prop_val;
+ }
+ ACE_CATCH (CORBA::SystemException, excp)
+ {
+ ACE_TRY_THROW
+ (CosTradingDynamic::DPEvalFailure (name, type, info));
+ }
+ ACE_ENDTRY;
+ ACE_CHECK_RETURN (prop_val);
+ }
+ }
+
+ return prop_val;
+}
+
+CORBA::TypeCode_ptr
+TAO_Property_Evaluator::property_type (int index)
+{
+ CORBA::TypeCode_ptr prop_type = CORBA::TypeCode::_nil();
+
+ // Determine if property is both defined and dynamic.
+ if (this->is_dynamic_property (index))
+ {
+ // Extract type information from the DP_Struct.
+ const CORBA::Any& value = this->props_[index].value;
+ CosTradingDynamic::DynamicProp* dp_struct = 0;
+ value >>= dp_struct;
+
+ // Grab a pointer to the returned_type description
+ prop_type = CORBA::TypeCode::_duplicate (dp_struct->returned_type.in ());
+ }
+ else
+ // TypeCode is self-evident at this point.
+ prop_type = this->props_[index].value.type ();
+
+ return prop_type;
+}
+
+TAO_Property_Evaluator_By_Name::
+TAO_Property_Evaluator_By_Name (const CosTrading::PropertySeq& properties
+ ACE_ENV_ARG_DECL,
+ CORBA::Boolean supports_dp)
+ ACE_THROW_SPEC ((CosTrading::DuplicatePropertyName,
+ CosTrading::IllegalPropertyName))
+ : TAO_Property_Evaluator (properties, supports_dp)
+{
+ int length = this->props_.length();
+
+ for (int i = 0; i < length; i++)
+ {
+ const CosTrading::Property& prop = this->props_[i];
+
+ if (! TAO_Trader_Base::is_valid_property_name (prop.name))
+ ACE_THROW (CosTrading::IllegalPropertyName (prop.name));
+
+ CORBA::String_var prop_name = prop.name.in ();
+ if (this->table_.bind (prop_name, i))
+ ACE_THROW (CosTrading::DuplicatePropertyName (prop.name));
+ }
+}
+
+TAO_Property_Evaluator_By_Name::
+TAO_Property_Evaluator_By_Name(CosTrading::Offer& offer,
+ CORBA::Boolean supports_dp)
+ : TAO_Property_Evaluator(offer, supports_dp)
+{
+ int length = this->props_.length();
+
+ for (int i = 0; i < length; i++)
+ {
+ CORBA::String_var prop_name = (const char*) this->props_[i].name;
+ this->table_.bind (prop_name, i);
+ }
+}
+
+int
+TAO_Property_Evaluator_By_Name::
+is_dynamic_property(const char* property_name)
+{
+ int predicate = 0;
+ int index = 0;
+ CORBA::String_var prop_name (property_name);
+
+ // 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)
+ predicate = this->TAO_Property_Evaluator::is_dynamic_property(index);
+
+ return predicate;
+}
+
+CORBA::Any*
+TAO_Property_Evaluator_By_Name::property_value (const char* property_name
+ ACE_ENV_ARG_DECL)
+ ACE_THROW_SPEC ((CosTradingDynamic::DPEvalFailure))
+{
+ int index = 0;
+ CORBA::Any* prop_value = 0;
+ CORBA::String_var prop_name (property_name);
+
+ // 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;
+ CORBA::String_var 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;
+ CORBA::String_var 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 ();
+
+ if (this->policies_[LINK_FOLLOW_RULE] != 0)
+ {
+ CosTrading::FollowOption max_follow_policy =
+ this->trader_.import_attributes ().max_follow_policy ();
+
+ CosTrading::Policy* policy = this->policies_[LINK_FOLLOW_RULE];
+ CosTrading::PolicyValue& value = policy->value;
+ CORBA::TypeCode_var type = value.type ();
+
+ // Extract the link follow rule
+ CORBA::Boolean type_equal =
+ type->equal (CosTrading::_tc_FollowOption ACE_ENV_ARG_PARAMETER);
+ ACE_CHECK_RETURN (return_value);
+
+ if (!type_equal)
+ ACE_THROW_RETURN (CosTrading::Lookup::PolicyTypeMismatch (*policy),
+ return_value);
+ else
+ value >>= return_value;
+
+ if (return_value > max_follow_policy)
+ return_value = max_follow_policy;
+ }
+
+ return return_value;
+}
+
+CosTrading::FollowOption
+TAO_Policies::link_follow_rule (const CosTrading::Link::LinkInfo& link_info
+ ACE_ENV_ARG_DECL) const
+ ACE_THROW_SPEC ((CosTrading::Lookup::PolicyTypeMismatch,
+ CosTrading::Lookup::InvalidPolicyValue,
+ CosTrading::Link::IllegalLinkName,
+ CosTrading::Link::UnknownLinkName))
+{
+ CosTrading::FollowOption return_value = CosTrading::local_only;
+ CosTrading::FollowOption trader_max_follow_policy =
+ this->trader_.import_attributes ().max_follow_policy ();
+ CosTrading::FollowOption link_limiting_follow_rule =
+ link_info.limiting_follow_rule;
+
+ // If not defined defaults to trader.def_link_follow_rule
+ CosTrading::FollowOption query_link_follow_rule =
+ this->link_follow_rule (ACE_ENV_SINGLE_ARG_PARAMETER);
+ ACE_CHECK_RETURN (return_value);
+
+ return_value = (query_link_follow_rule < trader_max_follow_policy)
+ ? query_link_follow_rule : trader_max_follow_policy;
+ return_value = (return_value < link_limiting_follow_rule)
+ ? return_value : link_limiting_follow_rule;
+
+ return return_value;
+}
+
+CORBA::ULong
+TAO_Policies::hop_count (ACE_ENV_SINGLE_ARG_DECL) const
+ ACE_THROW_SPEC ((CosTrading::Lookup::PolicyTypeMismatch))
+{
+ return this->ulong_prop (HOP_COUNT ACE_ENV_ARG_PARAMETER);
+}
+
+CosTrading::Admin::OctetSeq*
+TAO_Policies::request_id (ACE_ENV_SINGLE_ARG_DECL) const
+ ACE_THROW_SPEC ((CosTrading::Lookup::PolicyTypeMismatch))
+{
+ CosTrading::Admin::OctetSeq* request_id = 0;
+
+ if (this->policies_[REQUEST_ID] != 0)
+ {
+ CosTrading::Policy* policy = this->policies_[REQUEST_ID];
+ CosTrading::PolicyValue& value = policy->value;
+ CORBA::TypeCode_var type = value.type ();
+
+ CORBA::Boolean equal_octetseq =
+ type->equal (CosTrading::Admin::_tc_OctetSeq ACE_ENV_ARG_PARAMETER);
+ ACE_CHECK_RETURN (request_id);
+
+ if (!equal_octetseq)
+ ACE_THROW_RETURN (CosTrading::Lookup::PolicyTypeMismatch (*policy),
+ request_id);
+ else
+ value >>= request_id;
+ }
+
+ return request_id;
+}
+
+void
+TAO_Policies::
+copy_in_follow_option (CosTrading::PolicySeq& policy_seq,
+ const CosTrading::Link::LinkInfo& link_info
+ ACE_ENV_ARG_DECL) const
+ ACE_THROW_SPEC ((CosTrading::Lookup::PolicyTypeMismatch,
+ CosTrading::Lookup::InvalidPolicyValue))
+{
+ CosTrading::FollowOption follow_option = CosTrading::local_only;
+ CosTrading::FollowOption trader_max_follow_policy =
+ this->trader_.import_attributes ().max_follow_policy ();
+
+ if (this->policies_[LINK_FOLLOW_RULE] != 0)
+ {
+ CosTrading::FollowOption query_link_follow_rule =
+ this->link_follow_rule (ACE_ENV_SINGLE_ARG_PARAMETER);
+ ACE_CHECK;
+
+ follow_option = (CosTrading::FollowOption)
+ (link_info.limiting_follow_rule < trader_max_follow_policy
+ ? (link_info.limiting_follow_rule < query_link_follow_rule
+ ? link_info.limiting_follow_rule
+ : query_link_follow_rule)
+ : (trader_max_follow_policy < query_link_follow_rule
+ ? trader_max_follow_policy
+ : query_link_follow_rule));
+ }
+ else
+ follow_option = (CosTrading::FollowOption)
+ (link_info.def_pass_on_follow_rule < trader_max_follow_policy
+ ? link_info.def_pass_on_follow_rule
+ : trader_max_follow_policy);
+
+ CORBA::ULong i = 0;
+ for (i = 0; i < policy_seq.length (); i++)
+ if (ACE_OS::strcmp (policy_seq[i].name,
+ POLICY_NAMES[LINK_FOLLOW_RULE]) == 0)
+ {
+ policy_seq[i].value <<= follow_option;
+ break;
+ }
+
+ if (i == policy_seq.length ())
+ {
+ policy_seq.length (i + 1);
+ policy_seq[i].name = POLICY_NAMES[LINK_FOLLOW_RULE];
+ policy_seq[i].value <<= follow_option;
+ }
+}
+
+void
+TAO_Policies::
+copy_to_pass (CosTrading::PolicySeq& policy_seq,
+ const CosTrading::Admin::OctetSeq& request_id
+ ACE_ENV_ARG_DECL) const
+{
+ CORBA::ULong counter = 0;
+ CosTrading::Policy* policy_buffer =
+ CosTrading::PolicySeq::allocbuf (REQUEST_ID + 1);
+
+ if (policy_buffer == 0)
+ return;
+
+ for (int i = 0; i <= REQUEST_ID; i++)
+ {
+ CosTrading::Policy& new_policy = policy_buffer[counter];
+
+ if (i == REQUEST_ID)
+ {
+ // Set the new request id.
+ new_policy.name = POLICY_NAMES[REQUEST_ID];
+ new_policy.value <<= request_id;
+ counter++;
+ }
+ else if (this->policies_[i] != 0)
+ {
+ // Copy in the existing policies.
+ new_policy.name = POLICY_NAMES[i];
+ new_policy.value = this->policies_[i]->value;
+ counter++;
+ }
+
+ // We always require a hop count.
+ if (i == HOP_COUNT)
+ {
+ CORBA::ULong count = this->hop_count (ACE_ENV_SINGLE_ARG_PARAMETER);
+ ACE_CHECK;
+
+ new_policy.name = POLICY_NAMES[HOP_COUNT];
+ new_policy.value <<= count - 1;
+
+ // Don't count hop count twice.
+ if (this->policies_[i] == 0)
+ counter++;
+ }
+ }
+
+ policy_seq.replace (REQUEST_ID + 1,
+ counter,
+ policy_buffer,
+ 1);
+}
+
+void
+TAO_Policies::copy_to_forward (CosTrading::PolicySeq& policy_seq,
+ const CosTrading::TraderName& trader_name) const
+{
+ // Create a new policy sequence, shortening the starting trader
+ // policy by one link.
+
+ CORBA::ULong counter = 0;
+ CosTrading::Policy* policy_buffer =
+ CosTrading::PolicySeq::allocbuf (REQUEST_ID + 1);
+
+ if (policy_buffer == 0)
+ return;
+
+ for (int i = 0; i <= REQUEST_ID; i++)
+ {
+ CosTrading::Policy& new_policy = policy_buffer[counter];
+
+ if (this->policies_[i] != 0)
+ {
+ // Copy in the existing policies.
+ if (i == STARTING_TRADER && trader_name.length () > 1)
+ {
+ // Eliminate the first link of the trader name.
+ // Only pass on the property if the sequence
+ // contains more links after us.
+
+ // The any will sieze control of this memory.
+ // Allocating here avoids copying in the policy
+ // any.
+ CORBA::ULong length = trader_name.length ();
+ CosTrading::LinkName* buf =
+ CosTrading::TraderName::allocbuf (length - 1);
+
+ if (buf != 0)
+ {
+ for (CORBA::ULong j = 1; j < length; j++)
+ buf[j - 1] = CORBA::string_dup (trader_name[j]);
+
+ new_policy.name = this->policies_[i]->name;
+ CosTrading::TraderName new_name (length - 1,
+ length - 1,
+ buf,
+ 1);
+
+ new_policy.value <<= new_name;
+ counter++;
+ }
+ }
+ else if (i != STARTING_TRADER)
+ {
+ new_policy.name = this->policies_[i]->name;
+ new_policy.value = this->policies_[i]->value;
+ counter++;
+ }
+ }
+ }
+
+ // Create the new sequence
+ policy_seq.replace (REQUEST_ID + 1,
+ counter,
+ policy_buffer, 1);
+}
+
+TAO_Offer_Modifier::
+TAO_Offer_Modifier (const char* type_name,
+ const CosTradingRepos::ServiceTypeRepository::TypeStruct& type_struct,
+ CosTrading::Offer* offer)
+ : type_ (type_name),
+ offer_ (offer)
+{
+ const CosTradingRepos::ServiceTypeRepository::PropStructSeq&
+ pstructs = type_struct.props;
+ CosTrading::PropertySeq& prop_seq = this->offer_->properties;
+ CORBA::ULong pstructs_length = pstructs.length (),
+ props_length = prop_seq.length (),
+ i = 0;
+
+ // Create a mapping of property names to their types.
+ for (i = 0; i < pstructs_length; i++)
+ {
+ CORBA::String_var prop_name = pstructs[i].name.in ();
+ CORBA::TypeCode_ptr type_code =
+ CORBA::TypeCode::_duplicate (pstructs[i].value_type.in ());
+ this->prop_types_.bind (prop_name, type_code);
+ }
+
+ // Separate the type defined properties into mandatory and readonly
+ for (i = 0; i < pstructs_length; i++)
+ {
+ const char* pname = pstructs[i].name;
+
+ if (pstructs[i].mode ==
+ CosTradingRepos::ServiceTypeRepository::PROP_MANDATORY)
+ {
+ CORBA::String_var prop_name (pname);
+ this->mandatory_.insert (prop_name);
+ }
+ else if (pstructs[i].mode ==
+ CosTradingRepos::ServiceTypeRepository::PROP_READONLY)
+ {
+ CORBA::String_var prop_name (pname);
+ this->readonly_.insert (prop_name);
+ }
+ }
+
+ // Insert the indices of the offer properties into a map.
+ for (i = 0; i < props_length; i++)
+ {
+ CORBA::String_var prop_name =
+ static_cast<const char*> (prop_seq[i].name);
+ this->props_.bind (prop_name, &prop_seq[i]);
+ }
+}
+
+TAO_Offer_Modifier::~TAO_Offer_Modifier (void)
+{
+ for (TAO_Typecode_Table::iterator type_iter (this->prop_types_);
+ ! type_iter.done ();
+ type_iter++)
+ {
+ CORBA::TypeCode_ptr corba_type = (*type_iter).int_id_;
+ CORBA::release (corba_type);
+ }
+}
+
+void
+TAO_Offer_Modifier::
+delete_properties (const CosTrading::PropertyNameSeq& deletes
+ ACE_ENV_ARG_DECL)
+ ACE_THROW_SPEC ((CosTrading::Register::UnknownPropertyName,
+ CosTrading::Register::MandatoryProperty,
+ CosTrading::IllegalPropertyName,
+ CosTrading::DuplicatePropertyName))
+{
+ // Validate that the listed property names can be deleted
+ CORBA::ULong i = 0,
+ length = deletes.length ();
+ TAO_String_Set delete_me;
+
+ for (i = 0; i < length; i++)
+ {
+ const char* dname = static_cast<const char*> (deletes[i]);
+ if (! TAO_Trader_Base::is_valid_property_name (dname))
+ ACE_THROW (CosTrading::IllegalPropertyName (dname));
+ else
+ {
+ CORBA::String_var prop_name (dname);
+ if (this->mandatory_.find (prop_name) == 0)
+ ACE_THROW (CosTrading::Register::MandatoryProperty (this->type_, dname));
+ else if (delete_me.insert (prop_name) == 1)
+ ACE_THROW (CosTrading::DuplicatePropertyName (dname));
+ else if (this->props_.find (prop_name) == -1)
+ ACE_THROW (CosTrading::Register::UnknownPropertyName (dname));
+ }
+ }
+
+ // Delete those properties from the offer.
+ for (i = 0; i < length; i++)
+ {
+ CORBA::String_var prop_name =
+ static_cast<const char *> (deletes[i]);
+ this->props_.unbind (prop_name);
+ }
+}
+
+void
+TAO_Offer_Modifier::
+merge_properties (const CosTrading::PropertySeq& modifies
+ ACE_ENV_ARG_DECL)
+ ACE_THROW_SPEC ((CosTrading::IllegalPropertyName,
+ CosTrading::DuplicatePropertyName,
+ CosTrading::PropertyTypeMismatch,
+ CosTrading::ReadonlyDynamicProperty,
+ CosTrading::Register::ReadonlyProperty))
+{
+ int i = 0, length = 0;
+ TAO_String_Set modify_me;
+
+ // Ensure that the proposed changes aren't to readonly properties or
+ // otherwise invalid.
+ TAO_Property_Evaluator prop_eval (modifies);
+ for (i = 0, length = modifies.length (); i < length; i++)
+ {
+ const char* mname = modifies[i].name;
+ if (TAO_Trader_Base::is_valid_property_name (mname))
+ {
+ CORBA::String_var prop_name (mname);
+ if (this->readonly_.find (prop_name) == 0)
+ {
+ // Can't assign a dynamic property to a property with
+ // readonly mode, and can't reassign a readonly property.
+ if (prop_eval.is_dynamic_property (i))
+ ACE_THROW (CosTrading::ReadonlyDynamicProperty (this->type_, mname));
+ else if (this->props_.find (prop_name) == 0)
+ ACE_THROW (CosTrading::Register::ReadonlyProperty (this->type_, mname));
+ }
+
+ // Validate the property type if the property is defined in
+ // the service type description.
+ CORBA::TypeCode_ptr type_def = 0;
+ if (this->prop_types_.find (prop_name, type_def) == 0)
+ {
+ CORBA::TypeCode_var prop_type = prop_eval.property_type (i);
+
+ // @@ Frank: This code used to have this comment and line
+ // of code before I fixed the "ACE_TRY" fuzz warning here.
+ // @@ Seth, are we trying to ignore the exception here?
+ // CORBA::Environment ACE_TRY_ENV;
+ // @@ Frank: It seems clear that this is not going to work as
+ // expected. Is the purpose to ignore any exceptions from
+ // equal ()? For now, exceptions are returned since this
+ // seemed "safest".
+
+ CORBA::Boolean td_equal =
+ type_def->equal (prop_type.in () ACE_ENV_ARG_PARAMETER);
+ ACE_CHECK;
+
+ if (!td_equal)
+ ACE_THROW (CosTrading::PropertyTypeMismatch (mname, modifies[i]));
+ }
+
+ if (modify_me.insert (prop_name) == 1)
+ ACE_THROW (CosTrading::DuplicatePropertyName (mname));
+ }
+ else
+ ACE_THROW (CosTrading::IllegalPropertyName (mname));
+ }
+}
+
+void
+TAO_Offer_Modifier::affect_change (const CosTrading::PropertySeq& modifies)
+{
+ // Create a new property list reflecting the deletes, modifies, and
+ // add operations performed, and place this property list in the
+ // offer.
+
+ // Merge these properties with the original set.
+ CORBA::ULong i = 0,
+ merge_length = modifies.length ();
+
+ for (i = 0; i < merge_length; i++)
+ {
+ Property_Table::ENTRY* entry = 0;
+ CORBA::String_var prop_name = modifies[i].name.in ();
+
+ CosTrading::Property* prop =
+ const_cast<CosTrading::Property*> (&modifies[i]);
+ if (this->props_.bind (prop_name, prop, entry) == 1)
+ // We need to rebind here.
+ entry->int_id_ = prop;
+ }
+
+ CORBA::ULong num_modified = 0,
+ original_length = this->offer_->properties.length (),
+ total_length = static_cast<CORBA::ULong> (this->props_.current_size ());
+
+ // Scrap the existing property sequence and begin a new one
+ CosTrading::PropertySeq prop_seq (total_length);
+ // this->offer_->properties.length (total_length);
+
+ // Copy in the unaffected and modified props into the offer,
+ // excluding those that were deleted. Let's try and retain their
+ // relative ordering.
+ for (i = 0; i < original_length; i++)
+ {
+ CosTrading::Property* prop_value = 0;
+ const char* name = this->offer_->properties[i].name;
+ CORBA::String_var prop_name (name);
+ if (this->props_.unbind (prop_name, prop_value) == 0)
+ prop_seq[num_modified++] = *prop_value;
+ }
+
+ for (i = 0; i < merge_length; i++)
+ {
+ CosTrading::Property* prop_value = 0;
+ const char* name = modifies[i].name;
+ CORBA::String_var prop_name (name);
+ if (this->props_.unbind (prop_name, prop_value) == 0)
+ prop_seq[num_modified++] = *prop_value;
+ }
+
+ this->offer_->properties.length (total_length);
+ for (i = 0; i < total_length; i++)
+ this->offer_->properties[i] = prop_seq[i];
+ // Free the old, orphaned sequence.
+ // CosTrading::PropertySeq::freebuf (prop_buf);
+}
+
+TAO_Offer_Filter::TAO_Offer_Filter (TAO_Policies& policies
+ ACE_ENV_ARG_DECL)
+{
+ search_card_ = policies.search_card (ACE_ENV_SINGLE_ARG_PARAMETER);
+ ACE_CHECK;
+
+ match_card_ = policies.match_card (ACE_ENV_SINGLE_ARG_PARAMETER);
+ ACE_CHECK;
+
+ return_card_ = policies.return_card (ACE_ENV_SINGLE_ARG_PARAMETER);
+ ACE_CHECK;
+
+ dp_ = policies.use_dynamic_properties (ACE_ENV_SINGLE_ARG_PARAMETER);
+ ACE_CHECK;
+
+ mod_ = policies.use_modifiable_properties (ACE_ENV_SINGLE_ARG_PARAMETER);
+ ACE_CHECK;
+
+ CORBA::Boolean exact_type_match =
+ policies.exact_type_match (ACE_ENV_SINGLE_ARG_PARAMETER);
+ ACE_CHECK;
+
+ if (exact_type_match == 1)
+ {
+ CORBA::String_var exact_match
+ (TAO_Policies::POLICY_NAMES[TAO_Policies::EXACT_TYPE_MATCH]);
+ this->limits_.insert (exact_match);
+ }
+}
+
+void
+TAO_Offer_Filter::
+configure_type (CosTradingRepos::ServiceTypeRepository::TypeStruct* type_struct)
+{
+ CosTradingRepos::ServiceTypeRepository::PropStructSeq&
+ prop_seq = type_struct->props;
+
+ // Take note of non-modifiable properties in the type_struct
+ this->not_mod_props_.reset ();
+ for (int i = prop_seq.length () - 1; i >= 0; i--)
+ {
+ CosTradingRepos::ServiceTypeRepository::PropertyMode mode = prop_seq[i].mode;
+ if (mode == CosTradingRepos::ServiceTypeRepository::PROP_MANDATORY_READONLY ||
+ mode == CosTradingRepos::ServiceTypeRepository::PROP_READONLY)
+ {
+ CORBA::String_var prop_name ((const char*) prop_seq[i].name);
+ this->not_mod_props_.insert (prop_name);
+ }
+ }
+}
+
+CORBA::Boolean
+TAO_Offer_Filter::ok_to_consider (CosTrading::Offer* offer)
+{
+ CORBA::String_var use_mods =
+ TAO_Policies::POLICY_NAMES[TAO_Policies::USE_MODIFIABLE_PROPERTIES];
+ CORBA::String_var use_dyns =
+ TAO_Policies::POLICY_NAMES[TAO_Policies::USE_DYNAMIC_PROPERTIES];
+ CORBA::Boolean return_value = 1;
+ TAO_Property_Evaluator prop_eval (*offer);
+
+ // If we should screen offers, determine if this offer is unworthy
+ // for consideration.
+ if (! (this->mod_ && this->dp_))
+ {
+ for (int i = offer->properties.length () - 1;
+ i >= 0 && return_value;
+ i--)
+ {
+ // Winnow away the unwanted offers with modifiable or
+ // dynamic properties.
+ if (! this->mod_)
+ {
+ // Determine if this property name is found in the set
+ // of modifiable properties for the type being considered.
+ CORBA::String_var prop_name ((const char*) offer->properties[i].name);
+ if (this->not_mod_props_.find (prop_name) == -1)
+ {
+ this->limits_.insert (use_mods);
+ return_value = 0;
+ }
+ }
+
+ if (! this->dp_ && return_value)
+ {
+ // Determine if this property is dynamic.
+ if (prop_eval.is_dynamic_property (i))
+ {
+ this->limits_.insert (use_dyns);
+ return_value = 0;
+ }
+ }
+
+ if (return_value == 0)
+ break;
+ }
+ }
+
+ // If we're good to go, consider this offer considered and decrement
+ // the search cardinality counter.
+ if (return_value)
+ {
+ this->search_card_--;
+ if (this->search_card_ == 0)
+ {
+ CORBA::String_var search_card =
+ TAO_Policies::POLICY_NAMES[TAO_Policies::SEARCH_CARD];
+ this->limits_.insert (search_card);
+ }
+ }
+
+ return return_value;
+}
+
+CORBA::Boolean
+TAO_Offer_Filter::ok_to_consider_more (void)
+{
+ return this->search_card_ > 0 && this->match_card_ > 0;
+}
+
+void
+TAO_Offer_Filter::matched_offer (void)
+{
+ this->match_card_--;
+ this->return_card_--;
+
+ if (this->match_card_ == 0)
+ {
+ CORBA::String_var match_card =
+ TAO_Policies::POLICY_NAMES[TAO_Policies::MATCH_CARD];
+ this->limits_.insert (match_card);
+ }
+
+ if (this->return_card_ == 0)
+ {
+ CORBA::String_var return_card =
+ TAO_Policies::POLICY_NAMES[TAO_Policies::MATCH_CARD];
+ this->limits_.insert (return_card);
+ }
+}
+
+CORBA::ULong
+TAO_Offer_Filter::search_card_remaining (void) const
+{
+ return this->search_card_;
+}
+
+CORBA::ULong
+TAO_Offer_Filter::match_card_remaining (void) const
+{
+ return this->match_card_;
+}
+
+CosTrading::PolicyNameSeq*
+TAO_Offer_Filter::limits_applied (void)
+{
+ int i = 0;
+ CORBA::ULong size = static_cast<CORBA::ULong> (this->limits_.size ());
+ CosTrading::PolicyName* temp =
+ CosTrading::PolicyNameSeq::allocbuf (size);
+
+ for (TAO_String_Set::iterator p_iter (this->limits_.begin());
+ ! p_iter.done ();
+ p_iter.advance ())
+ {
+ CORBA::String_var* policy_name_ptr = 0;
+ p_iter.next (policy_name_ptr);
+ temp[i++] = CORBA::string_dup (policy_name_ptr->in ());
+ }
+
+ return new CosTrading::PolicyNameSeq (size, size, temp, 1);
+}
+
+TAO_Property_Filter::
+TAO_Property_Filter (const SPECIFIED_PROPS& desired_props
+ ACE_ENV_ARG_DECL)
+ ACE_THROW_SPEC ((CosTrading::IllegalPropertyName,
+ CosTrading::DuplicatePropertyName))
+ : policy_ (desired_props._d ())
+{
+ if (this->policy_ == CosTrading::Lookup::some)
+ {
+ const CosTrading::PropertyNameSeq&
+ prop_seq = desired_props.prop_names ();
+ int length = prop_seq.length ();
+
+ for (int i = 0; i < length; i++)
+ {
+ const char* pname = prop_seq[i];
+
+ // Check for errors or duplicates
+ if (TAO_Trader_Base::is_valid_property_name (pname))
+ {
+ CORBA::String_var prop_name (pname);
+ if (this->props_.insert (prop_name) == 1)
+ ACE_THROW (CosTrading::DuplicatePropertyName (pname));
+ }
+ else
+ ACE_THROW (CosTrading::IllegalPropertyName (pname));
+ }
+ }
+}
+
+TAO_Property_Filter::
+TAO_Property_Filter (const TAO_Property_Filter& prop_filter)
+ : props_ (prop_filter.props_),
+ policy_ (prop_filter.policy_)
+{
+}
+
+TAO_Property_Filter&
+TAO_Property_Filter::operator= (const TAO_Property_Filter& other)
+{
+ this->props_ = other.props_;
+ this->policy_ = other.policy_;
+
+ return *this;
+}
+
+void
+TAO_Property_Filter::filter_offer (CosTrading::Offer* source,
+ CosTrading::Offer& destination)
+{
+ Prop_Queue prop_queue;
+ CosTrading::PropertySeq& s_props = source->properties;
+ CosTrading::PropertySeq& d_props = destination.properties;
+ CORBA::ULong length = static_cast<CORBA::ULong> (s_props.length ()),
+ elem = 0;
+
+ destination.reference = CORBA::Object::_duplicate (source->reference.in ());
+ if (this->policy_ == CosTrading::Lookup::some)
+ {
+ for (CORBA::ULong i = 0; i < length; i++)
+ {
+ if (this->policy_ == CosTrading::Lookup::all)
+ prop_queue.enqueue_tail (&s_props[i]);
+ else
+ {
+ const char* p_name = s_props[i].name;
+ CORBA::String_var prop_name (p_name);
+
+ // Save those property that match.
+ if (this->props_.find (prop_name) == 0)
+ prop_queue.enqueue_tail (&s_props[i]);
+ }
+ }
+
+ // Shove the matched properties into the destination property
+ // sequence.
+ length = static_cast<CORBA::ULong> (prop_queue.size ());
+ d_props.length (length);
+ for (Prop_Queue::ITERATOR prop_iter (prop_queue);
+ ! prop_iter.done ();
+ prop_iter.advance (), elem++)
+ {
+ CosTrading::Property** prop_ptr = 0;
+
+ prop_iter.next (prop_ptr);
+ d_props[elem] = **prop_ptr;
+ }
+ }
+ else if (this->policy_ == CosTrading::Lookup::all)
+ // CosTrading::Property* props = s_props.get_buffer (0);
+ // d_props.replace (length, length, props, 0);
+ d_props = s_props;
+}
+
+TAO_END_VERSIONED_NAMESPACE_DECL
diff --git a/TAO/orbsvcs/orbsvcs/Trader/Trader_Utils.h b/TAO/orbsvcs/orbsvcs/Trader/Trader_Utils.h
new file mode 100644
index 00000000000..70b5717dde7
--- /dev/null
+++ b/TAO/orbsvcs/orbsvcs/Trader/Trader_Utils.h
@@ -0,0 +1,783 @@
+// -*- C++ -*-
+
+//=============================================================================
+/**
+ * @file Trader_Utils.h
+ *
+ * $Id$
+ *
+ * @author Seth Widoff <sbw1@cs.wustl.edu>
+ */
+//=============================================================================
+
+
+#ifndef TAO_TRADER_UTILS_H
+#define TAO_TRADER_UTILS_H
+
+#include /**/ "ace/pre.h"
+
+#include "orbsvcs/Trader/Trader.h"
+
+#if defined(_MSC_VER)
+#pragma warning(push)
+#pragma warning(disable:4250)
+#endif /* _MSC_VER */
+
+TAO_BEGIN_VERSIONED_NAMESPACE_DECL
+
+/**
+ * @class TAO_Property_Evaluator
+ *
+ * @brief This class abstracts away the details of obtaining property
+ * values and property types. Since the procedure for obtaining the
+ * value or type of a dynamic property is disparate from the method
+ * for a static property, TAO_Property_Evaluator provides methods
+ * that will unify the two approaches under a single
+ * interface. Since dynamic properties aren't necessarily supported
+ * by a trader, this class accounts for that contingency. The use of
+ * indexed lookups allows them to occur in constant time on the
+ * CORBA sequences, but requires that the client know the layout of
+ * properties ahead of time.
+ */
+class TAO_Trading_Serv_Export TAO_Property_Evaluator
+{
+public:
+
+ TAO_Property_Evaluator(const CosTrading::PropertySeq& properties,
+ CORBA::Boolean supports_dp = 1);
+
+ /**
+ * Construct an instance of TAO_Property_Evaluator that operates on
+ * an <offer> where the support for dynamic properties is dictated
+ * by <supports_dynamic_properties>.
+ */
+ TAO_Property_Evaluator(CosTrading::Offer& offer,
+ CORBA::Boolean supports_dp = 1);
+
+ /// Clean up dynamic properties.
+ virtual ~TAO_Property_Evaluator (void);
+
+ /// Returns 1 if the property at index <index> is dynamic. Returns a
+ /// 0 when the index is out of bounds.
+ int is_dynamic_property(int index);
+
+ /**
+ * Returns value of the property whose index is <index>. If the
+ * property at that index is dynamic and the trader supports dynamic
+ * properties, then the property_value method will obtain the value
+ * of the dynamic property using the evalDP method on the
+ * CosTradingDynamic::DynamicPropEval interface, passing on a
+ * CosTradingDynamic::DPEvalFailure exception on failure. If the
+ * property index is undefined, the method returns a null pointer.
+ */
+ CORBA::Any* property_value(int index ACE_ENV_ARG_DECL)
+ ACE_THROW_SPEC ((CosTradingDynamic::DPEvalFailure));
+
+
+ /**
+ * Returns the type of the property whose index is <index>. If the
+ * property is dynamic and the trader supports dynamic properties,
+ * then the method returns the <returned_type> field of the
+ * CosTradingDynamic::DynamicProp struct associated with the
+ * property name. If the index is out of bounds, the method returns
+ * a null pointer (that is, 0).
+ */
+ CORBA::TypeCode_ptr property_type (int index);
+
+protected:
+
+ typedef CosTradingDynamic::DynamicProp DP_Struct;
+ typedef CosTradingDynamic::DynamicPropEval DP_Eval;
+
+ /// The offer from which the TAO_Property_Evaluator extracts property
+ /// information.
+ const CosTrading::PropertySeq& props_;
+
+ int supports_dp_;
+
+ /**
+ * In order for the client to treat the results of property_value
+ * uniformly, we need to collect the dynamically allocated anys
+ * retrieved from dynamic properties and free them upon deletion. If
+ * we didn't do this, then the property_value method would leak or
+ * cause seg faults, since the client wouldn't be able to tell
+ * whether or not the return value should be freed.
+ */
+ CORBA::Any** dp_cache_;
+
+private:
+
+ TAO_Property_Evaluator (const TAO_Property_Evaluator&);
+ TAO_Property_Evaluator& operator= (const TAO_Property_Evaluator&);
+};
+
+/**
+ * @class TAO_Property_Evaluator_By_Name
+ *
+ * @brief This class extends the TAO_Property_Evaluator to allow lookups
+ * based on the property name of interest. Since the property
+ * information is contained within an integer indexed array,
+ * lookups may occur in O(n) time, where n is the length of the
+ * array. To make lookups by name more efficient,
+ * TAO_Property_Evaluator_By_Name creates a mapping of property
+ * names to integer indicies, upon which lookups are guaranteed to
+ * be O(lg n).
+ */
+class TAO_Trading_Serv_Export TAO_Property_Evaluator_By_Name : public TAO_Property_Evaluator
+{
+public:
+
+ TAO_Property_Evaluator_By_Name (const CosTrading::PropertySeq& properties
+ ACE_ENV_ARG_DECL ,
+ CORBA::Boolean supports_dp = 1)
+ ACE_THROW_SPEC ((CosTrading::DuplicatePropertyName,
+ CosTrading::IllegalPropertyName));
+
+ /**
+ * Construct an instance of TAO_Property_Evaluator that operates on
+ * an <offer> where the support for dynamic properties is dictated
+ * by <supports_dynamic_properties>.
+ */
+ TAO_Property_Evaluator_By_Name(CosTrading::Offer& offer,
+ CORBA::Boolean supports_dp = 1);
+
+ /**
+ * Returns 1 if the property whose name is <property_name> is
+ * defined and dynamic. If the property is undefined, this method
+ * will throw a Property_Undefined exception with impunity.
+ */
+ int is_dynamic_property(const char* property_name);
+
+ /**
+ * This method is identical to its counterpart in
+ * TAO_Property_Evaluator, except property_value first discovers the
+ * index through a string matching lookup.
+ */
+ CORBA::Any* property_value(const char* property_name
+ ACE_ENV_ARG_DECL)
+ ACE_THROW_SPEC ((CosTradingDynamic::DPEvalFailure));
+
+ /**
+ * This method is identical to its counterpart in
+ * TAO_Property_Evaluator, exception property_type first discovers
+ * the index through a string matching lookup.
+ */
+ CORBA::TypeCode_ptr property_type(const char* property_name);
+
+ const CosTrading::Property* get_property (const char* property_name);
+
+private:
+
+ TAO_Property_Evaluator_By_Name (const TAO_Property_Evaluator_By_Name&);
+ TAO_Property_Evaluator_By_Name& operator= (const TAO_Property_Evaluator_By_Name&);
+
+ /// The instance of the above mapping for the offer provided in the
+ /// constructor.
+ TAO_Lookup_Table table_;
+};
+
+/**
+ * @class TAO_Dynamic_Property
+ *
+ * @brief Little helper class that you can extend to have your dynamic
+ * property handler construct CosTradingDynamic::DynamicProp structs.
+ */
+class TAO_Trading_Serv_Export TAO_Dynamic_Property
+ : public virtual POA_CosTradingDynamic::DynamicPropEval
+{
+public:
+
+ TAO_Dynamic_Property (void) {}
+ virtual ~TAO_Dynamic_Property (void);
+
+ void destroy (void);
+
+ /// Dynamic property evaluation call-back method.
+ virtual CORBA::Any* evalDP(const char* name,
+ CORBA::TypeCode_ptr returned_type,
+ const CORBA::Any& extra_info
+ ACE_ENV_ARG_DECL)
+ ACE_THROW_SPEC ((CORBA::SystemException,
+ CosTradingDynamic::DPEvalFailure)) = 0;
+
+ /// Method to construct a dynamic property structure suitable for
+ /// exporting in a CosTrading::PropertyStruct to the Trading Service.
+ CosTradingDynamic::DynamicProp*
+ construct_dynamic_prop (const char* name,
+ CORBA::TypeCode_ptr returned_type,
+ const CORBA::Any& extra_info);
+
+private:
+
+ CosTradingDynamic::DynamicPropEval_var prop_;
+};
+
+/**
+ * @class TAO_Policies
+ *
+ * @brief This class ensures that policies submitted to Lookup make sense,
+ * have the correct value types, and don't exceed the maximums set
+ * through the Admin Interface.
+ *
+ * TAO_Policies does an admirable job of reconciling differences
+ * between the default parameter settings of the Trader and the import
+ * and other policies set by the client. Unbeknownst to its client
+ * TAO_Policies hides this arbitration, and records whether the user
+ * policy was chosen, or the default. This information gets returned
+ * to the invoker of the query method.
+ */
+class TAO_Policies
+{
+public:
+
+#define TAO_NUM_POLICIES 11
+
+ /**
+ * This enum represents the relative order that properties are
+ * passed from one trader to another. Hence, as recommended by the
+ * spec, the starting_trader policies will be the first element in
+ * the polcy sequence if it's set for a query.
+ */
+ enum POLICY_TYPE
+ {
+ 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
+ };
+
+ static const char * POLICY_NAMES[];
+
+ TAO_Policies (TAO_Trader_Base& trader,
+ const CosTrading::PolicySeq& policies
+ ACE_ENV_ARG_DECL)
+ ACE_THROW_SPEC ((CosTrading::Lookup::IllegalPolicyName,
+ CosTrading::DuplicatePolicyName));
+
+ // BEGIN SPEC
+ // The "policies" parameter allows the importer to specify how the
+ // search should be performed as opposed to what sort of services
+ // should be found in the course of the search. This can be viewed
+ // as parameterizing the algorithms within the trader
+ // implementation. The "policies" are a sequence of name-value
+ // pairs. The names available to an importer depend on the
+ // implementation of the trader. However, some names are
+ // standardized where they effect the interpretation of other
+ // parameters or where they may impact linking and federation of
+ // traders. ° If a policy name in this parameter does not obey the
+ // syntactic rules for legal PolicyName's, then an IllegalPolicyName
+ // exception is raised. ° If the type of the value associated with a
+ // policy differs from that specified in this specification, then a
+ // PolicyTypeMismatch exception is raised. ° If subsequent
+ // processing of a PolicyValue yields any errors (e.g., the
+ // starting_trader policy value is malformed), then an
+ // InvalidPolicyValue exception is raised. ° If the same policy name
+ // is included two or more times in this parameter, then the
+ // DuplicatePolicyName exception is raised.
+ // END SPEC
+
+ ~TAO_Policies (void);
+
+ CORBA::ULong search_card (ACE_ENV_SINGLE_ARG_DECL) const
+ ACE_THROW_SPEC ((CosTrading::Lookup::PolicyTypeMismatch));
+
+ // BEGIN SPEC
+ // The "search_card" policy indicates to the trader the maximum
+ // number of offers it should consider when looking for type
+ // conformance and constraint expression match. The lesser of this
+ // value and the trader's max_search_card attribute is used by the
+ // trader. If this policy is not specified, then the value of the
+ // trader's def_search_card attribute is used.
+ // END SPEC
+
+ CORBA::ULong match_card (ACE_ENV_SINGLE_ARG_DECL) const
+ ACE_THROW_SPEC ((CosTrading::Lookup::PolicyTypeMismatch));
+
+ // BEGIN SPEC
+ // The "match_card" policy indicates to the trader the maximum
+ // number of matching offers to which the preference specification
+ // should be applied. The lesser of this value and the trader's
+ // max_match_card attribute is used by the trader. If this policy is
+ // not specified, then the value of the trader's def_match_card
+ // attribute is used.
+ // END SPEC
+
+ CORBA::ULong return_card (ACE_ENV_SINGLE_ARG_DECL) const
+ ACE_THROW_SPEC ((CosTrading::Lookup::PolicyTypeMismatch));
+
+ // BEGIN SPEC
+ // The "return_card" policy indicates to the trader the maximum
+ // number of matching offers to return as a result of this
+ // query. The lesser of this value and the trader's max_return_card
+ // attribute is used by the trader. If this policy is not specified,
+ // then the value of the trader's def_return_card attribute is
+ // used.
+ // END SPEC
+
+ // = Offer consideration policies
+
+ CORBA::Boolean use_modifiable_properties (ACE_ENV_SINGLE_ARG_DECL) const
+ ACE_THROW_SPEC ((CosTrading::Lookup::PolicyTypeMismatch));
+
+ // BEGIN SPEC
+ // The "use_modifiable_properties" policy indicates whether the
+ // trader should consider offers which have modifiable properties
+ // when constructing the set of offers to which type conformance and
+ // constraint processing should be applied. If the value of this
+ // policy is TRUE, then such offers will be included; if FALSE, they
+ // will not. If this policy is not specified, such offers will be
+ // included.
+ // END SPEC
+
+ CORBA::Boolean use_dynamic_properties (ACE_ENV_SINGLE_ARG_DECL) const
+ ACE_THROW_SPEC ((CosTrading::Lookup::PolicyTypeMismatch));
+
+ // BEGIN SPEC
+ // The "use_dynamic_properties" policy indicates whether the trader
+ // should consider offers which have dynamic properties when
+ // constructing the set of offers to which type conformance and
+ // constraint processing should be applied. If the value of this
+ // policy is TRUE, then such offers will be included; if FALSE, they
+ // will not. If this policy is not specified, such offers will be
+ // included.
+ // END SPEC
+
+ CORBA::Boolean use_proxy_offers (ACE_ENV_SINGLE_ARG_DECL) const
+ ACE_THROW_SPEC ((CosTrading::Lookup::PolicyTypeMismatch));
+
+ // BEGIN SPEC
+ // The "use_proxy_offers" policy indicates whether the trader should
+ // consider proxy offers when constructing the set of offers to
+ // which type conformance and constraint processing should be
+ // applied. If the value of this policy is TRUE, then such offers
+ // will be included; if FALSE, they will not. If this policy is not
+ // specified, such offers will be included.
+ // END SPEC
+
+ CORBA::Boolean exact_type_match (ACE_ENV_SINGLE_ARG_DECL) const
+ ACE_THROW_SPEC ((CosTrading::Lookup::PolicyTypeMismatch));
+
+ // BEGIN SPEC
+ // The "exact_type_match" policy indicates to the trader whether the
+ // importer's service type must exactly match an offer's service
+ // type; if not (and by default), then any offer of a type
+ // conformant to the importer's service type is considered.
+ // END SPEC
+
+ // = Federated trader policies (not implemented yet)
+
+ /**
+ * BEGIN SPEC
+ * The "starting_trader" policy facilitates the distribution of the
+ * trading service itself. It allows an importer to scope a search
+ * by choosing to explicitly navigate the links of the trading
+ * graph. If the policy is used in a query invocation it is
+ * recommended that it be the first policy-value pair; this
+ * facilitates an optimal forwarding of the query operation. A
+ * "policies" parameter need not include a value for the
+ * "starting_trader" policy. Where this policy is present, the first
+ * name component is compared against the name held in each link. If
+ * no match is found, the InvalidPolicyValue exception is
+ * raised. Otherwise, the trader invokes query() on the Lookup
+ * interface held by the named link, but passing the
+ * "starting_trader" policy with the first component removed.
+ * END SPEC
+ */
+ CosTrading::TraderName* starting_trader (ACE_ENV_SINGLE_ARG_DECL) const
+ ACE_THROW_SPEC ((CosTrading::Lookup::PolicyTypeMismatch,
+ CosTrading::Lookup::InvalidPolicyValue));
+
+ /// Determine the link follow policy for this query overall.
+ CosTrading::FollowOption link_follow_rule (ACE_ENV_SINGLE_ARG_DECL) const
+ ACE_THROW_SPEC ((CosTrading::Lookup::PolicyTypeMismatch));
+
+ // BEGIN SPEC
+ //The "link_follow_rule" policy indicates how the client wishes
+ //links to be followed in the resolution of its query. See the
+ //discussion in "Link Follow Behavior" on page 16-16 for details.
+ // END SPEC
+
+
+ /**
+ * Determine the link follow policy for a given <link_name>.
+ * This method returns the link_follow_rule for a link whose name is
+ * <link_name> using the following formula:
+ * if the importer specified a link_follow_rule policy
+ * min(trader.max_follow_policy, link.limiting_follow_rule,
+ * query.link_follow_rule)
+ * else min(trader.max_follow_policy, link.limiting_follow_rule,
+ * trader.def_follow_policy)
+ */
+ CosTrading::FollowOption link_follow_rule (const CosTrading::Link::LinkInfo& link_info
+ ACE_ENV_ARG_DECL) const
+ ACE_THROW_SPEC ((CosTrading::Lookup::PolicyTypeMismatch,
+ CosTrading::Lookup::InvalidPolicyValue,
+ CosTrading::Link::IllegalLinkName,
+ CosTrading::Link::UnknownLinkName));
+
+ CORBA::ULong hop_count (ACE_ENV_SINGLE_ARG_DECL) const
+ ACE_THROW_SPEC ((CosTrading::Lookup::PolicyTypeMismatch));
+
+ // BEGIN SPEC
+ // The "hop_count" policy indicates to the trader the maximum number
+ // of hops across federation links that should be tolerated in the
+ // resolution of this query. The hop_count at the current trader is
+ // determined by taking the minimum of the trader's max_hop_count
+ // attribute and the importer's hop_count policy, if provided, or
+ // the trader's def_hop_count attribute if it is not. If the
+ // resulting value is zero, then no federated queries are
+ // permitted. If it is greater than zero, then it must be
+ // decremented before passing on to a federated trader.
+ // END SPEC
+
+ /// Return the request_id passed to the query method across a link to
+ /// another trader.
+ CosTrading::Admin::OctetSeq* request_id (ACE_ENV_SINGLE_ARG_DECL) const
+ ACE_THROW_SPEC ((CosTrading::Lookup::PolicyTypeMismatch));
+
+ /// Policies to forward to the next trader in a federated query.
+ void copy_to_pass (CosTrading::PolicySeq& policy_seq,
+ const CosTrading::Admin::OctetSeq& request_id
+ ACE_ENV_ARG_DECL) const;
+
+ /// Policies to forward to the next trader in a directed query.
+ void copy_to_forward (CosTrading::PolicySeq& policy_seq,
+ const CosTrading::TraderName& name) const;
+
+ /**
+ * Determine the link follow policy to pass down the link with <link_name>.
+ * This method returns the link_follow_rule for a link whose name is
+ * <link_name> using the following formula:
+ * If the importer specified a link_follow_rule, policy
+ * pass on min(query.link_follow_rule, link.limiting_follow_rule,
+ * trader.max_follow_policy)
+ * else pass on min(link.def_pass_on_follow_rule,
+ * trader.max_follow_policy)
+ */
+ void copy_in_follow_option (CosTrading::PolicySeq& policy_seq,
+ const CosTrading::Link::LinkInfo& link_info
+ ACE_ENV_ARG_DECL) const
+ ACE_THROW_SPEC ((CosTrading::Lookup::PolicyTypeMismatch,
+ CosTrading::Lookup::InvalidPolicyValue));
+
+private:
+
+ /// Reconclile a ULong property with its default.
+ CORBA::ULong ulong_prop (POLICY_TYPE pol
+ ACE_ENV_ARG_DECL) const
+ ACE_THROW_SPEC ((CosTrading::Lookup::PolicyTypeMismatch));
+
+ /// Reconcile a Boolean property with its debault.
+ CORBA::Boolean boolean_prop (POLICY_TYPE pol
+ ACE_ENV_ARG_DECL) const
+ ACE_THROW_SPEC ((CosTrading::Lookup::PolicyTypeMismatch));
+
+ TAO_Policies (const TAO_Policies&);
+ TAO_Policies& operator= (const TAO_Policies&);
+
+ /// The policies indexable from the enumerated type.
+ CosTrading::Policy* policies_[TAO_NUM_POLICIES];
+
+ /// For the validating identifier names.
+ TAO_Trader_Base& trader_;
+};
+
+/**
+ * @class TAO_Policy_Creator
+ *
+ * @brief This class is a utility for clients using the CosTrading::Lookup
+ * interface that helps them build a policy sequence without violating
+ * syntax rules and having to mess with typecodes.
+ */
+class TAO_Trading_Serv_Export TAO_Policy_Creator
+{
+public:
+
+ TAO_Policy_Creator (int num_policies = 0);
+
+ // = Routines to set policies.
+
+ /// Set the maximum number of offers searched for the query.
+ void search_card (CORBA::ULong scard);
+
+ /// Set the maximum number of offers searched for the query.
+ void match_card (CORBA::ULong mcard);
+
+ /// Set the maximum number of offers rerturned for the query.
+ void return_card (CORBA::ULong rcard);
+
+ // A note about cardinalities: The spec implies that these
+ // cardinalities apply to the global office space, that is, all
+ // offers on all linked traders. However, there's no mechanism for
+ // one trader to return to the calling trader the number of offers
+ // searched or matched. Thus, these cardinalities are applied on a
+ // per-trader basis.
+
+ /// Consider offers with modifiable properties.
+ void use_modifiable_properties (CORBA::Boolean mod_props);
+
+ /// Consider offers with dynamic properties.
+ void use_dynamic_properties (CORBA::Boolean dyn_props);
+
+ /// Consider proxy offers (NOT SUPPORTED).
+ void use_proxy_offers (CORBA::Boolean prox_offs);
+
+ /// Designate a trader at which to begin the query.
+ void starting_trader (const CosTrading::TraderName& name); // Copy
+ void starting_trader (CosTrading::TraderName* name); // Own
+
+ /// Specify under what conditions a federated query is appropriate.
+ void link_follow_rule (CosTrading::FollowOption follow_option);
+
+ /// Limit the breadth of a federated query.
+ void hop_count (CORBA::ULong hop_count);
+
+ /// Set the identifier for this query (clients shouldn't use this).
+ void request_id (const CosTrading::Admin::OctetSeq& request_id);
+
+ /// Search only the designated type --- not it's subtypes.
+ void exact_type_match (CORBA::Boolean exact_type);
+
+ /// Return the constructed policy sequence.
+ operator const CosTrading::PolicySeq& (void) const;
+
+ /// Return a PolicySeq suitable for passing to the query method of
+ /// the Lookup interface.
+ const CosTrading::PolicySeq& policy_seq (void) const;
+
+private:
+
+ TAO_Policy_Creator (const TAO_Policy_Creator&);
+ TAO_Policy_Creator& operator= (const TAO_Policy_Creator&);
+
+ /// Method to prepare the next slot in the policies_ sequence for
+ /// policy insertion.
+ CosTrading::Policy& fetch_next_policy (TAO_Policies::POLICY_TYPE pol_type);
+
+ /// Table mapping policy enum value to the index in the policies sequence.
+ int poltable_[TAO_Policies::REQUEST_ID + 1];
+
+ /// The sequence being prepared for submittal to the query method.
+ CosTrading::PolicySeq policies_;
+
+ /// The number of policies so far in the sequence.
+ CORBA::ULong num_policies_;
+};
+
+/**
+ * @class TAO_Offer_Modifier
+ *
+ * @brief This class deletes, modifies, and adds properties to a given
+ * offer according to the rules of the modify method on the Register
+ * interface.
+ */
+class TAO_Offer_Modifier
+{
+public:
+
+ /// Modify an <offer> of type <type>, whose properties are described
+ /// by <type_struct>
+ TAO_Offer_Modifier (const char* type,
+ const CosTradingRepos::ServiceTypeRepository::TypeStruct& type_struct,
+ CosTrading::Offer* offer);
+
+ ~TAO_Offer_Modifier (void);
+
+ /// Delete the properties whose names were given to the
+ /// constructor. Ensure we don't delete mandatory properties.
+ void delete_properties (const CosTrading::PropertyNameSeq& deletes
+ ACE_ENV_ARG_DECL)
+ ACE_THROW_SPEC ((CosTrading::Register::UnknownPropertyName,
+ CosTrading::Register::MandatoryProperty,
+ CosTrading::IllegalPropertyName,
+ CosTrading::DuplicatePropertyName));
+
+ /**
+ * Copy to the destination the union of the source and destination
+ * properties. In the case of duplicate properties, update the
+ * destination with the source's value. This class claims the memory
+ * in the modifies sequence.
+ */
+ void merge_properties (const CosTrading::PropertySeq& modifies
+ ACE_ENV_ARG_DECL)
+ ACE_THROW_SPEC ((CosTrading::IllegalPropertyName,
+ CosTrading::DuplicatePropertyName,
+ CosTrading::PropertyTypeMismatch,
+ CosTrading::ReadonlyDynamicProperty,
+ CosTrading::Register::ReadonlyProperty));
+
+ /// Return a reference to the Offer with the changes affected.
+ void affect_change (const CosTrading::PropertySeq& modifies);
+
+private:
+
+ TAO_Offer_Modifier (const TAO_Offer_Modifier&);
+ TAO_Offer_Modifier& operator= (const TAO_Offer_Modifier&);
+
+ typedef ACE_Hash_Map_Manager_Ex <CORBA::String_var,
+ CosTrading::Property *,
+ ACE_Hash<CORBA::String_var>,
+ ACE_Equal_To<CORBA::String_var>,
+ ACE_Null_Mutex>
+ Property_Table;
+
+ /// The type of the offer.
+ const char *type_;
+
+ /// The map of properties in the offer.
+ Property_Table props_;
+
+ /// Table of property types.
+ TAO_Typecode_Table prop_types_;
+
+ /// The set of readonly and mandatory property names in the offer's
+ /// type.
+ TAO_String_Set readonly_;
+ TAO_String_Set mandatory_;
+
+ /// A reference to the offer undergoing change.
+ CosTrading::Offer* offer_;
+};
+
+/**
+ * @class TAO_Offer_Filter
+ *
+ * @brief The purpose of this class is to ensure that offers that
+ * shouldn't be considered by the TAO_Constraint_Interpreter
+ * aren't.
+ *
+ * There two classes of reasons why an offer for a correct
+ * type shouldn't be considered: 1) The default parameters of the
+ * Trader or policies passed to the Lookup::query method deem it
+ * inappropriate to consider offers with modifiable (i.e., not
+ * readonly) or dynamic properties. 2) We've exceeded the
+ * default or provided cardinality constraints. TAO_Offer_Filter
+ * ensures that violation of policies doesn't occur. It's the
+ * enforcer.
+ */
+class TAO_Offer_Filter
+{
+public:
+
+ /// Glean from the TypeStruct and Policy setting the appropriate way
+ /// to screen unsuitable offers from consideration.
+ TAO_Offer_Filter (TAO_Policies& policies
+ ACE_ENV_ARG_DECL);
+
+ /// Set the offer filter to screen for offers containing properties
+ /// that aren't marked as readonly in this TypeStruct.
+ void configure_type (CosTradingRepos::ServiceTypeRepository::TypeStruct* type_struct);
+
+ /**
+ * Determine whether the poicies contained in the given policy
+ * object allow the Lookup interface to consider the offer. That is,
+ * if use_modifiable_properties is false, and the offer contains
+ * modifiable properties as designated in the type struct, return
+ * false. If use_dynamic_properties is false, and the offer contains
+ * dynamic properties, then return false. If the lookup interface is
+ * safe in considering this offer, return true and subtract from the
+ * search card value. When the search card value falls to zero,
+ * ok_to_consider always returns false.
+ */
+ CORBA::Boolean ok_to_consider (CosTrading::Offer* offer);
+
+ /// It's ok to consider more offers when lookup hasn't exceeded the
+ /// cardinality values for searching and matching offers.
+ CORBA::Boolean ok_to_consider_more (void);
+
+ /// Signal that the Lookup method has matched an offer; decrement the
+ /// match_card.
+ void matched_offer (void);
+
+ // = Return the limits applied.
+ /**
+ * BEGIN SPEC
+ * If any cardinality or other limits were applied by one or more
+ * traders in responding to a particular query, then the
+ * "limits_applied" parameter will contain the names of the policies
+ * which limited the query. The sequence of names returned in
+ * "limits_applied" from any federated or proxy queries must be
+ * concatenated onto the names of limits applied locally and
+ * returned.
+ * END SPEC
+ */
+ CosTrading::PolicyNameSeq* limits_applied (void);
+
+ /// Accessors to retrieve the adjusted cardinalities.
+ CORBA::ULong search_card_remaining (void) const;
+ CORBA::ULong match_card_remaining (void) const;
+
+private:
+
+ TAO_Offer_Filter (const TAO_Offer_Filter&);
+ TAO_Offer_Filter& operator= (const TAO_Offer_Filter&);
+
+ /// The set of the name of modifiable properties.
+ TAO_String_Set not_mod_props_;
+
+ /// Cardinality and property limitations applied.
+ TAO_String_Set limits_;
+
+ /// Keep track of the cardinalities.
+ CORBA::ULong search_card_, match_card_, return_card_;
+
+ /// Keep track of property limitations: modifiable or dynamic ones
+ /// may be bad.
+ CORBA::Boolean dp_;
+ CORBA::Boolean mod_;
+};
+
+/**
+ * @class TAO_Property_Filter
+ *
+ * @brief The Ace_Property_Filter copies those properties specified in a
+ * CosTrading::Lookup::SpecifiedProps from a source
+ * CosTrading::Offer to a destination CosTrading::Offer.
+ */
+class TAO_Property_Filter
+{
+public:
+
+ typedef CosTrading::Lookup::SpecifiedProps SPECIFIED_PROPS;
+
+ /// An accomplice to g++'s insane lust for copy constructors.
+ TAO_Property_Filter (void) : policy_ (CosTrading::Lookup::all) {}
+
+ /// Verify that the specified properties are correct.
+ TAO_Property_Filter (const SPECIFIED_PROPS& desired_props
+ ACE_ENV_ARG_DECL)
+ ACE_THROW_SPEC ((CosTrading::IllegalPropertyName,
+ CosTrading::DuplicatePropertyName));
+
+ TAO_Property_Filter (const TAO_Property_Filter& prop_filter);
+ TAO_Property_Filter& operator= (const TAO_Property_Filter& prop_filter);
+
+ /// Copy the desired properties from the source offer to the
+ /// destination offer.
+ void filter_offer (CosTrading::Offer* source,
+ CosTrading::Offer& destination);
+
+private:
+
+ typedef ACE_Unbounded_Queue< CosTrading::Property* > Prop_Queue;
+
+ TAO_String_Set props_;
+ CosTrading::Lookup::HowManyProps policy_;
+};
+
+TAO_END_VERSIONED_NAMESPACE_DECL
+
+#if defined(_MSC_VER)
+#pragma warning(pop)
+#endif /* _MSC_VER */
+
+#include /**/ "ace/post.h"
+
+#endif /* TAO_TRADER_UTILS_H */
diff --git a/TAO/orbsvcs/orbsvcs/Trader/Trading_Loader.cpp b/TAO/orbsvcs/orbsvcs/Trader/Trading_Loader.cpp
new file mode 100644
index 00000000000..a4f3bfd4e5d
--- /dev/null
+++ b/TAO/orbsvcs/orbsvcs/Trader/Trading_Loader.cpp
@@ -0,0 +1,512 @@
+// $Id$
+
+//===========================================================================
+
+// LIBRARY
+// libTAO_CosTrading.so
+//
+// DESCRIPTION
+// This class allows for dynamically loading
+// the Trading Service.
+//
+// AUTHORS
+// Priyanka Gontla <pgontla@ece.uci.edu>
+
+//===========================================================================
+
+#include "orbsvcs/Trader/Trading_Loader.h"
+
+#include "tao/ORB_Core.h"
+#include "tao/default_ports.h"
+#include "tao/IORTable/IORTable.h"
+
+#include "ace/Dynamic_Service.h"
+#include "ace/Arg_Shifter.h"
+#include "ace/Argv_Type_Converter.h"
+#include "ace/OS_NS_unistd.h"
+#include "ace/os_include/os_netdb.h"
+
+ACE_RCSID (Trader, Trading_Loader, "$Id$")
+
+TAO_Trading_Loader::TAO_Trading_Loader (void)
+ : federate_ (0),
+ ior_output_file_ (0),
+ bootstrapper_ (0)
+{
+ char *trader_name = CORBA::string_alloc (MAXHOSTNAMELEN + 10);
+
+ if (trader_name != 0)
+ {
+ // The trader name is the concatenation of the local host name
+ // and the server's process id.
+ char host_name[MAXHOSTNAMELEN + 1];
+ ACE_INET_Addr localhost ((u_short) 0);
+ if (localhost.get_host_name (host_name, sizeof (host_name)) != 0)
+ {
+ const char *tmp = localhost.get_host_addr ();
+ if (tmp == 0)
+ ACE_DEBUG ((LM_DEBUG,
+ ACE_TEXT ("\n\nTAO Trading Service (%P|%t) ")
+ ACE_TEXT ("TAO_Trading_Loader ")
+ ACE_TEXT ("- %p\n\n"),
+ ACE_TEXT ("cannot determine hostname")));
+ else
+ ACE_OS::strcpy (host_name, tmp);
+ }
+
+ ACE_OS::sprintf (trader_name,
+ "%s_%ld",
+ host_name,
+ static_cast<long> (ACE_OS::getpid ()));
+
+ for (char *dot = 0;
+ (dot = ACE_OS::strchr (trader_name, '.')) != 0;
+ *dot = '_')
+ continue;
+
+ ACE_DEBUG ((LM_DEBUG,
+ "*** Trading Service %s initializing.\n",
+ trader_name));
+
+ this->name_ = trader_name;
+ }
+}
+
+TAO_Trading_Loader::~TAO_Trading_Loader (void)
+{
+ // Destructor
+}
+
+int
+TAO_Trading_Loader::init (int argc, ACE_TCHAR *argv[])
+{
+ ACE_DECLARE_NEW_CORBA_ENV;
+ ACE_TRY
+ {
+ // Copy command line parameter.
+ ACE_Argv_Type_Converter command_line(argc, argv);
+
+ // Initialize the ORB Manager
+ this->orb_manager_.init (command_line.get_argc(),
+ command_line.get_ASCII_argv()
+ ACE_ENV_ARG_PARAMETER);
+ ACE_TRY_CHECK;
+
+ CORBA::ORB_var orb =
+ this->orb_manager_.orb ();
+
+ // Initializes and sets up the Trading Service
+ CORBA::Object_var object =
+ this->create_object (orb.in (), command_line.get_argc(), command_line.get_TCHAR_argv() ACE_ENV_ARG_PARAMETER);
+ ACE_TRY_CHECK;
+
+ }
+ ACE_CATCHANY
+ {
+ // @@ Should we log this???
+ return -1;
+ }
+ ACE_ENDTRY;
+ return 0;
+}
+
+int
+TAO_Trading_Loader::fini (void)
+{
+ ACE_TRY_NEW_ENV
+ {
+ if (this->trader_.get () != 0)
+ {
+ TAO_Trading_Components_i& trd_comp
+ = this->trader_->trading_components ();
+ CosTrading::Link_ptr our_link =
+ trd_comp.link_if ();
+
+ CosTrading::LinkNameSeq_var link_name_seq =
+ our_link->list_links (ACE_ENV_SINGLE_ARG_PARAMETER);
+ ACE_TRY_CHECK;
+
+ ACE_DEBUG ((LM_DEBUG,
+ "*** Unlinking from federated traders.\n"));
+
+ for (CORBA::ULong j = 0;
+ j != link_name_seq->length ();
+ ++j)
+ {
+ CORBA::ULong i =
+ link_name_seq->length () - j - 1;
+
+ ACE_DEBUG ((LM_DEBUG,
+ "*** Describing the next link.\n"));
+ CosTrading::Link::LinkInfo_var link_info =
+ our_link->describe_link (link_name_seq[i]
+ ACE_ENV_ARG_PARAMETER);
+ ACE_TRY_CHECK;
+
+ ACE_DEBUG ((LM_DEBUG,
+ "*** Removing link to %s.\n",
+ static_cast<const char *> (link_name_seq[i])));
+ our_link->remove_link (link_name_seq[i]
+ ACE_ENV_ARG_PARAMETER);
+ ACE_TRY_CHECK;
+
+ CosTrading::Lookup_ptr remote_lookup;
+ remote_lookup =
+ link_info->target.in ();
+
+ ACE_DEBUG ((LM_DEBUG,
+ "*** Retrieving its link interface.\n"));
+ CosTrading::Link_var remote_link =
+ remote_lookup->link_if (ACE_ENV_SINGLE_ARG_PARAMETER);
+ ACE_TRY_CHECK;
+
+ ACE_DEBUG ((LM_DEBUG,
+ "*** Removing its link to us.\n"));
+
+ if (this->bootstrapper_)
+ {
+ remote_link->remove_link ("Bootstrap"
+ ACE_ENV_ARG_PARAMETER);
+ ACE_TRY_CHECK;
+ }
+ else
+ {
+ remote_link->remove_link (this->name_.in ()
+ ACE_ENV_ARG_PARAMETER);
+ ACE_TRY_CHECK;
+ }
+ }
+ }
+ }
+ ACE_CATCHANY
+ {
+ ACE_PRINT_EXCEPTION (ACE_ANY_EXCEPTION, "Trading Service shutting down");
+ }
+ ACE_ENDTRY;
+
+ return 0;
+}
+
+int
+TAO_Trading_Loader::run (ACE_ENV_SINGLE_ARG_DECL)
+{
+ int return_value =
+ this->orb_manager_.run (ACE_ENV_SINGLE_ARG_PARAMETER);
+ ACE_CHECK_RETURN (-1);
+
+ return return_value;
+}
+
+CORBA::Object_ptr
+TAO_Trading_Loader::create_object (CORBA::ORB_ptr orb_ptr,
+ int argc,
+ ACE_TCHAR *argv[]
+ ACE_ENV_ARG_DECL)
+ ACE_THROW_SPEC ((CORBA::SystemException))
+{
+ // Duplicate the ORB
+ CORBA::ORB_var orb = CORBA::ORB::_duplicate (orb_ptr);
+
+ // Activating the poa manager
+ this->orb_manager_.activate_poa_manager (ACE_ENV_SINGLE_ARG_PARAMETER);
+ ACE_CHECK_RETURN (CORBA::Object::_nil ());
+
+ // Create a Trader Object and set its Service Type Repository.
+ auto_ptr<TAO_Trader_Factory::TAO_TRADER> auto_trader (TAO_Trader_Factory::create_trader (argc, argv));
+
+ this->trader_ = auto_trader;
+
+ TAO_Support_Attributes_i &sup_attr =
+ this->trader_->support_attributes ();
+
+ TAO_Trading_Components_i &trd_comp =
+ this->trader_->trading_components ();
+
+ sup_attr.type_repos (this->type_repos_._this (ACE_ENV_SINGLE_ARG_PARAMETER));
+ ACE_CHECK_RETURN (CORBA::Object::_nil ());
+
+ // The Spec says: return a reference to the Lookup interface from
+ // the resolve_initial_references method.
+ CosTrading::Lookup_ptr lookup =
+ trd_comp.lookup_if ();
+
+ this->ior_ =
+ orb->object_to_string (lookup
+ ACE_ENV_ARG_PARAMETER);
+ ACE_CHECK_RETURN (CORBA::Object::_nil ());
+
+ // Parse the args
+ if (this->parse_args (argc, argv) == -1)
+ return CORBA::Object::_nil ();
+
+ // Dump the ior to a file.
+ if (this->ior_output_file_ != 0)
+ {
+ ACE_OS::fprintf (this->ior_output_file_,
+ "%s",
+ this->ior_.in ());
+ ACE_OS::fclose (this->ior_output_file_);
+ }
+
+ CORBA::Object_var table_object =
+ orb->resolve_initial_references ("IORTable" ACE_ENV_ARG_PARAMETER);
+ ACE_CHECK_RETURN (CORBA::Object::_nil ());
+
+ IORTable::Table_var adapter =
+ IORTable::Table::_narrow (table_object.in () ACE_ENV_ARG_PARAMETER);
+ ACE_CHECK_RETURN (CORBA::Object::_nil ());
+
+ if (CORBA::is_nil (adapter.in ()))
+ {
+ ACE_ERROR ((LM_ERROR, "Nil IORTable\n"));
+ }
+ else
+ {
+ adapter->bind ("TradingService",
+ this->ior_.in () ACE_ENV_ARG_PARAMETER);
+ ACE_CHECK_RETURN (CORBA::Object::_nil ());
+ }
+
+ if (this->federate_)
+ {
+ // Only become a multicast server if we're the only trader
+ // on the multicast network.
+ // @@ Could do other things. For example, every timeout
+ // period try to federate again, but let's not hardcode that
+ // policy.
+ int rc = this->bootstrap_to_federation (ACE_ENV_SINGLE_ARG_PARAMETER);
+ ACE_CHECK_RETURN (CORBA::Object::_nil ());
+
+ if (rc == -1)
+ this->init_multicast_server ();
+ }
+ else
+ this->init_multicast_server ();
+
+ return CORBA::Object::_nil ();
+}
+
+int
+TAO_Trading_Loader::bootstrap_to_federation (ACE_ENV_SINGLE_ARG_DECL)
+{
+ // If all traders follow this strategy, it creates a complete graph
+ // of all known traders on a multicast network.
+ CORBA::ORB_var orb =
+ this->orb_manager_.orb ();
+
+ ACE_DEBUG ((LM_DEBUG,
+ "*** Bootstrapping to another Trading Service.\n"));
+ CORBA::Object_var trading_obj =
+ orb->resolve_initial_references ("TradingService" ACE_ENV_ARG_PARAMETER);
+ ACE_CHECK_RETURN (-1);
+
+ if (CORBA::is_nil (trading_obj.in ()))
+ ACE_ERROR_RETURN ((LM_ERROR,
+ "We're all alone. "
+ "Unable to link to other traders.\n"),
+ -1);
+
+ ACE_DEBUG ((LM_DEBUG,
+ "*** Narrowing the lookup interface.\n"));
+ CosTrading::Lookup_var lookup_if =
+ CosTrading::Lookup::_narrow (trading_obj.in ()
+ ACE_ENV_ARG_PARAMETER);
+ ACE_CHECK_RETURN (-1);
+
+ ACE_DEBUG ((LM_DEBUG,
+ "*** Obtaining the link interface.\n"));
+ CosTrading::Link_var link_if =
+ lookup_if->link_if (ACE_ENV_SINGLE_ARG_PARAMETER);
+ ACE_CHECK_RETURN (-1);
+
+ TAO_Trading_Components_i &trd_comp =
+ this->trader_->trading_components ();
+ CosTrading::Lookup_ptr our_lookup =
+ trd_comp.lookup_if ();
+ CosTrading::Link_ptr our_link =
+ trd_comp.link_if ();
+
+ ACE_DEBUG ((LM_DEBUG,
+ "*** Linking found trader to self.\n"));
+ link_if->add_link (this->name_.in (),
+ our_lookup,
+ CosTrading::always,
+ CosTrading::always
+ ACE_ENV_ARG_PARAMETER);
+ ACE_CHECK_RETURN (-1);
+
+ ACE_DEBUG ((LM_DEBUG,
+ "*** Linking self to found trader.\n"));
+ our_link->add_link ("Bootstrap",
+ lookup_if.in (),
+ CosTrading::always,
+ CosTrading::always
+ ACE_ENV_ARG_PARAMETER);
+ ACE_CHECK_RETURN (-1);
+
+ ACE_DEBUG ((LM_DEBUG,
+ "*** Retrieving list of known linked traders.\n"));
+ CosTrading::LinkNameSeq_var link_name_seq =
+ link_if->list_links (ACE_ENV_SINGLE_ARG_PARAMETER);
+ ACE_CHECK_RETURN (-1);
+
+ ACE_DEBUG ((LM_DEBUG,
+ "*** Linking self to all linked traders.\n"));
+ for (CORBA::ULong i = link_name_seq->length () - 1;
+ i > 0;
+ i--)
+ {
+ // Avoid linking to ourselves.
+ if (ACE_OS::strcmp (static_cast<const char *> (link_name_seq[i]),
+ this->name_.in ()) != 0)
+ {
+ ACE_DEBUG ((LM_DEBUG,
+ "*** Getting info for link %s.\n",
+ static_cast<const char *> (link_name_seq[i])));
+ CosTrading::Link::LinkInfo_var link_info =
+ link_if->describe_link (link_name_seq[i]
+ ACE_ENV_ARG_PARAMETER);
+ ACE_CHECK_RETURN (-1);
+
+ CosTrading::Lookup_ptr remote_lookup;
+ remote_lookup = link_info->target.in ();
+
+ ACE_DEBUG ((LM_DEBUG,
+ "*** Retrieving its link interface.\n"));
+ CosTrading::Link_var remote_link =
+ remote_lookup->link_if (ACE_ENV_SINGLE_ARG_PARAMETER);
+ ACE_CHECK_RETURN (-1);
+
+ ACE_DEBUG ((LM_DEBUG,
+ "*** Creating a link to me from it.\n"));
+ remote_link->add_link (this->name_.in (),
+ our_lookup,
+ CosTrading::always,
+ CosTrading::always
+ ACE_ENV_ARG_PARAMETER);
+ ACE_CHECK_RETURN (-1);
+
+ ACE_DEBUG ((LM_DEBUG,
+ "*** Creating a link to it from me.\n"));
+ our_link->add_link (link_name_seq[i],
+ remote_lookup,
+ CosTrading::always,
+ CosTrading::always
+ ACE_ENV_ARG_PARAMETER);
+ ACE_CHECK_RETURN (-1);
+ }
+ }
+
+ return 0;
+}
+
+int
+TAO_Trading_Loader::init_multicast_server (void)
+{
+#if defined (ACE_HAS_IP_MULTICAST)
+ // Get reactor instance from TAO.
+ ACE_Reactor *reactor = TAO_ORB_Core_instance ()->reactor ();
+
+ // See if the -ORBMulticastDiscoveryEndpoint option was specified.
+ ACE_CString mde (TAO_ORB_Core_instance ()->orb_params ()
+ ->mcast_discovery_endpoint ());
+
+ // First, see if the user has given us a multicast port number for
+ // the name service on the command-line;
+ u_short port =
+ TAO_ORB_Core_instance ()->orb_params ()->service_port (TAO::MCAST_TRADINGSERVICE);
+
+ if (port == 0)
+ {
+ const char *port_number =
+ ACE_OS::getenv ("TradingServicePort");
+
+ if (port_number != 0)
+ port = static_cast<u_short> (ACE_OS::atoi (port_number));
+ else
+ port = TAO_DEFAULT_TRADING_SERVER_REQUEST_PORT;
+ }
+
+ // Instantiate a server that will receive requests for an ior
+ if (mde.length () != 0)
+ {
+ if (this->ior_multicast_.init ((char *) this->ior_.in (),
+ mde.c_str (),
+ TAO_SERVICEID_TRADINGSERVICE) == -1)
+ return -1;
+ }
+ else
+ {
+ if (this->ior_multicast_.init ((char *) this->ior_.in (),
+ port,
+ ACE_DEFAULT_MULTICAST_ADDR,
+ TAO_SERVICEID_TRADINGSERVICE) == -1)
+ ACE_ERROR_RETURN ((LM_ERROR,
+ "Failed to init IOR multicast.\n"),
+ -1);
+ }
+
+ // Register event handler for the ior multicast.
+ if (reactor->register_handler (&this->ior_multicast_,
+ ACE_Event_Handler::READ_MASK) == -1)
+ ACE_DEBUG ((LM_DEBUG,
+ "cannot register Event handler\n"));
+ else
+ ACE_DEBUG ((LM_DEBUG,
+ "The multicast server setup is done.\n"));
+
+ // Other trader instances will bootstrap to us.
+ this->bootstrapper_ = 1;
+
+#endif /* ACE_HAS_IP_MULTICAST */
+ return 0;
+}
+
+
+int
+TAO_Trading_Loader::parse_args (int &argc, ACE_TCHAR *argv [])
+{
+ ACE_Arg_Shifter arg_shifter (argc, argv);
+
+ while (arg_shifter.is_anything_left ())
+ {
+ const ACE_TCHAR *current_arg = arg_shifter.get_current ();
+
+ if (ACE_OS::strcmp (current_arg,
+ ACE_TEXT("-TSfederate")) == 0)
+ {
+ arg_shifter.consume_arg ();
+ this->federate_ = 1;
+ }
+ if (ACE_OS::strcmp (current_arg,
+ ACE_TEXT("-TSdumpior")) == 0)
+ {
+ arg_shifter.consume_arg ();
+ if (arg_shifter.is_parameter_next ())
+ {
+ const ACE_TCHAR *file_name =
+ arg_shifter.get_current ();
+ this->ior_output_file_ =
+ ACE_OS::fopen (file_name, ACE_TEXT("w"));
+
+ if (this->ior_output_file_ == 0)
+ ACE_ERROR_RETURN ((LM_ERROR,
+ "Unable to open %s for writing: %p\n",
+ file_name), -1);
+ arg_shifter.consume_arg ();
+ }
+ else
+ this->ior_output_file_ =
+ ACE_OS::fdopen (ACE_STDOUT,
+ ACE_TEXT("w"));
+ }
+
+ else
+ arg_shifter.ignore_arg ();
+ }
+
+ return 0;
+}
+
+ACE_FACTORY_DEFINE (TAO_Trading_Serv, TAO_Trading_Loader)
+
diff --git a/TAO/orbsvcs/orbsvcs/Trader/Trading_Loader.h b/TAO/orbsvcs/orbsvcs/Trader/Trading_Loader.h
new file mode 100644
index 00000000000..3b344cd9333
--- /dev/null
+++ b/TAO/orbsvcs/orbsvcs/Trader/Trading_Loader.h
@@ -0,0 +1,116 @@
+// -*- C++ -*-
+
+// $Id$
+
+// ===========================================================================
+// FILENAME
+// Trading_Loader.h
+//
+// DESCRIPTION
+// This class loads the Trading Service dynamically
+// either from svc.conf file or <string_to_object> call.
+//
+// AUTHORS
+// Priyanka Gontla <pgontla@ece.uci.edu>
+//
+// ==========================================================================
+
+#ifndef TAO_TRADING_LOADER_H
+#define TAO_TRADING_LOADER_H
+
+#include "orbsvcs/Trader/Trader.h"
+
+#if !defined (ACE_LACKS_PRAGMA_ONCE)
+# pragma once
+#endif /* ACE_LACKS_PRAGMA_ONCE */
+
+#include "orbsvcs/IOR_Multicast.h"
+#include "orbsvcs/Trader/Service_Type_Repository.h"
+
+#include "tao/Object_Loader.h"
+#include "tao/Utils/ORB_Manager.h"
+#include "ace/Auto_Ptr.h"
+
+class TAO_Trading_Serv_Export TAO_Trading_Loader : public TAO_Object_Loader
+{
+public:
+
+ TAO_Trading_Loader (void);
+ // Constructor
+
+ ~TAO_Trading_Loader (void);
+ // Destructor
+
+ virtual int init (int argc, ACE_TCHAR *argv[]);
+ // Called by the Service Configurator framework to initialize the
+ // Event Service. Defined in <ace/Service_Config.h>
+
+ virtual int fini (void);
+ // Called by the Service Configurator framework to remove the
+ // Event Service. Defined in <ace/Service_Config.h>
+
+ int run (ACE_ENV_SINGLE_ARG_DECL);
+ // Run the Trading Service
+
+ CORBA::Object_ptr create_object (CORBA::ORB_ptr orb,
+ int argc,
+ ACE_TCHAR *argv[]
+ ACE_ENV_ARG_DECL)
+ ACE_THROW_SPEC ((CORBA::SystemException));
+ // This function call initializes the Trading Service given a reference to the
+ // ORB and the command line parameters.
+
+protected:
+
+ int init_multicast_server (void);
+ // Enable the Trading Service to answer multicast requests for its
+ // IOR.
+
+ int bootstrap_to_federation (ACE_ENV_SINGLE_ARG_DECL);
+ // Bootstrap to another trader, and attach to its trader network.
+
+ int parse_args (int &argc, ACE_TCHAR *argv []);
+ // Parses the command line arguments
+
+ TAO_ORB_Manager orb_manager_;
+ // The ORB manager.
+
+ auto_ptr<TAO_Trader_Factory::TAO_TRADER> trader_;
+ // Pointer to the linked trader.
+
+ TAO_Service_Type_Repository type_repos_;
+ // Service Type Repository used by the trading service.
+
+ CORBA::String_var ior_;
+ // IOR of the trader kept around for handiness purposes.
+
+ CORBA::Boolean federate_;
+ // Flag indicating whether this trader should join the federation.
+
+ FILE *ior_output_file_;
+ // File to output the Naming Service IOR.
+
+ CORBA::String_var name_;
+ // Name of this trading service: "hostname:pid".
+
+ TAO_IOR_Multicast ior_multicast_;
+ // Event handler that responds to resolve_initial_references
+ // requests.
+
+ CORBA::Boolean bootstrapper_;
+ // Flag inidicating whether we're the trader others are bootstrapping to.
+
+ CORBA::Boolean dumpior_;
+ // Flag indication whether to dump the ior to standard output
+
+private:
+
+ // Disallow copying and assignment.
+ TAO_Trading_Loader (const TAO_Trading_Loader &);
+ TAO_Trading_Loader &operator= (const TAO_Trading_Loader &);
+
+};
+
+ACE_FACTORY_DECLARE (TAO_Trading_Serv, TAO_Trading_Loader)
+
+#endif /* TAO_TRADING_LOADER_H */
diff --git a/TAO/orbsvcs/orbsvcs/Trader/constraint.l b/TAO/orbsvcs/orbsvcs/Trader/constraint.l
new file mode 100644
index 00000000000..9d1aef05376
--- /dev/null
+++ b/TAO/orbsvcs/orbsvcs/Trader/constraint.l
@@ -0,0 +1,136 @@
+%{
+// $Id$
+// ========================================================================
+//
+// = LIBRARY
+// orbsvcs
+//
+// = FILENAME
+// constraint.l
+//
+// = AUTHOR
+// Seth Widoff <sbw1@cs.wustl.edu>
+//
+// ========================================================================
+
+#include "ace/OS.h"
+#include "Constraint_Interpreter.h"
+#include "Constraint_Nodes.h"
+#include "Constraint_Tokens.h"
+
+TAO_BEGIN_VERSIONED_NAMESPACE_DECL
+
+static TAO_Literal_Constraint* extract_string(const char*);
+
+#define TAO_YY_LEX_DEBUG
+
+#ifdef TAO_CONSTRAINT_DEBUG
+#define TAO_YY_LEX_DEBUG ACE_OS::fprintf(stderr, "%s\n", yytext)
+#endif /* TAO_CONSTRAINT_DEBUG */
+
+
+%}
+
+white_space [ \t]
+letter [a-zA-Z]
+digit [0-9]
+alpha_num ({letter}|{digit})
+integer [-+]?{digit}+
+float ({digit}*\.{digit}+)([eE][-+]?{digit}+)?
+string '(([^'\\]*)|([^'\\]*\\')|([^'\\]*\\\\))*'
+ident {letter}({alpha_num}|[_])*
+newline \n
+unknown [^ \t]
+
+%%
+
+min { TAO_YY_LEX_DEBUG; return TAO_MIN; }
+max { TAO_YY_LEX_DEBUG; return TAO_MAX; }
+first { TAO_YY_LEX_DEBUG; return TAO_FIRST; }
+random { TAO_YY_LEX_DEBUG; return TAO_RANDOM; }
+with { TAO_YY_LEX_DEBUG; return TAO_WITH; }
+exist { TAO_YY_LEX_DEBUG; return TAO_EXIST; }
+not { TAO_YY_LEX_DEBUG; return TAO_NOT; }
+and { TAO_YY_LEX_DEBUG; return TAO_AND; }
+or { TAO_YY_LEX_DEBUG; return TAO_OR; }
+in { TAO_YY_LEX_DEBUG; return TAO_IN; }
+"~" { TAO_YY_LEX_DEBUG; return TAO_TWIDDLE; }
+"+" { TAO_YY_LEX_DEBUG; return TAO_PLUS; }
+"-" { TAO_YY_LEX_DEBUG; return TAO_MINUS; }
+"*" { TAO_YY_LEX_DEBUG; return TAO_MULT; }
+"/" { TAO_YY_LEX_DEBUG; return TAO_DIV; }
+"<" { TAO_YY_LEX_DEBUG; return TAO_LT; }
+"<=" { TAO_YY_LEX_DEBUG; return TAO_LE; }
+">" { TAO_YY_LEX_DEBUG; return TAO_GT; }
+">=" { TAO_YY_LEX_DEBUG; return TAO_GE; }
+"==" { TAO_YY_LEX_DEBUG; return TAO_EQ; }
+"!=" { TAO_YY_LEX_DEBUG; return TAO_NE; }
+"(" { TAO_YY_LEX_DEBUG; return TAO_LPAREN; }
+")" { TAO_YY_LEX_DEBUG; return TAO_RPAREN; }
+TRUE {
+ yylval.constraint_ =
+ new TAO_Literal_Constraint(true);
+ TAO_YY_LEX_DEBUG; return TAO_BOOLEAN;
+ }
+FALSE {
+ yylval.constraint_ =
+ new TAO_Literal_Constraint(false);
+ TAO_YY_LEX_DEBUG; return TAO_BOOLEAN;
+ }
+{integer} {
+ yylval.constraint_ =
+ new TAO_Literal_Constraint((yytext[0] == '-' ?
+ (CORBA::Long)atoi(yytext) : (CORBA::ULong)atoi(yytext)));
+ TAO_YY_LEX_DEBUG; return TAO_NUMBER;
+ }
+{float} {
+ yylval.constraint_ =
+ new TAO_Literal_Constraint((CORBA::Double)atof(yytext));
+ TAO_YY_LEX_DEBUG; return TAO_NUMBER;
+ }
+{string} {
+ yylval.constraint_ = extract_string(yytext);
+ TAO_YY_LEX_DEBUG; return TAO_STRING;
+ }
+{ident} {
+ yylval.constraint_ =
+ new TAO_Property_Constraint(yytext);
+ TAO_YY_LEX_DEBUG; return TAO_IDENT;
+ }
+{unknown} {
+ TAO_YY_LEX_DEBUG; return TAO_UNKNOWN;
+ }
+%%
+
+TAO_Literal_Constraint*
+extract_string(const char* total)
+{
+ int prev_slash = 0,
+ ctr = 0;
+ char str[BUFSIZ],
+ *tmp = (char*) total + 1;
+
+ while (*tmp != '\0')
+ {
+ if (*tmp == '\\')
+ {
+ if (prev_slash)
+ prev_slash = 0;
+ else
+ {
+ prev_slash = 1;
+ continue;
+ }
+ }
+ else if (*tmp == '\'')
+ prev_slash = 0;
+
+ str[ctr++] = *tmp;
+ tmp++;
+ }
+
+ str[ctr - 1] = '\0';
+ return new TAO_Literal_Constraint(str);
+}
+
+TAO_END_VERSIONED_NAMESPACE_DECL
diff --git a/TAO/orbsvcs/orbsvcs/Trader/constraint.y b/TAO/orbsvcs/orbsvcs/Trader/constraint.y
new file mode 100644
index 00000000000..7d32796775a
--- /dev/null
+++ b/TAO/orbsvcs/orbsvcs/Trader/constraint.y
@@ -0,0 +1,139 @@
+%{
+ // $Id$
+// ========================================================================
+//
+// = LIBRARY
+// orbsvcs
+//
+// = FILENAME
+// constraint.y
+//
+// = AUTHOR
+// Seth Widoff <sbw1@cs.wustl.edu>
+//
+// ========================================================================
+
+#include "ace/OS.h"
+#include "Constraint_Interpreter.h"
+#include "Constraint_Nodes.h"
+
+TAO_BEGIN_VERSIONED_NAMESPACE_DECL
+
+//#define YYDEBUG 1
+%}
+
+%token TAO_GT TAO_GE TAO_LT TAO_LE TAO_EQ TAO_NE TAO_EXIST
+%token TAO_AND TAO_OR TAO_NOT TAO_IN TAO_TWIDDLE TAO_BOOLEAN
+%token TAO_PLUS TAO_MINUS TAO_MULT TAO_DIV TAO_UMINUS TAO_NUMBER
+%token TAO_RPAREN TAO_LPAREN TAO_IDENT TAO_STRING TAO_UNKNOWN
+%token TAO_UNSIGNED TAO_SIGNED TAO_DOUBLE TAO_CONSTRAINT TAO_SEQUENCE
+%token TAO_WITH TAO_MAX TAO_MIN TAO_FIRST TAO_RANDOM
+
+%start constraint
+
+%type <constraint_> TAO_IDENT TAO_NUMBER TAO_STRING TAO_BOOLEAN
+%type <constraint_> constraint preference bool_or bool_and bool_compare
+%type <constraint_> expr_in expr_twiddle expr term factor_not factor
+
+%%
+
+constraint: bool_or
+ { $$ = new TAO_Unary_Constraint(TAO_CONSTRAINT, $1); }
+ | preference
+ { $$ = $1; }
+ ;
+
+preference: TAO_MIN bool_or
+{ $$ = new TAO_Unary_Constraint(TAO_MIN, $2); }
+ | TAO_MAX bool_or
+{ $$ = new TAO_Unary_Constraint(TAO_MAX, $2); }
+ | TAO_WITH bool_or
+{ $$ = new TAO_Unary_Constraint(TAO_WITH, $2); }
+ | TAO_FIRST
+{ $$ = new TAO_Noop_Constraint(TAO_FIRST); }
+ | TAO_RANDOM
+{ $$ = new TAO_Noop_Constraint(TAO_RANDOM); }
+ ;
+
+bool_or: bool_or TAO_OR bool_and
+ { $$ = new TAO_Binary_Constraint(TAO_OR, $1, $3); }
+ | bool_and
+ { $$ = $1; }
+ ;
+
+bool_and: bool_and TAO_AND bool_compare
+ { $$ = new TAO_Binary_Constraint(TAO_AND, $1, $3); }
+ | bool_compare
+ { $$ = $1; }
+ ;
+
+bool_compare: expr_in TAO_EQ expr_in
+ { $$ = new TAO_Binary_Constraint(TAO_EQ, $1, $3); }
+ | expr_in TAO_NE expr_in
+ { $$ = new TAO_Binary_Constraint(TAO_NE, $1, $3); }
+ | expr_in TAO_GT expr_in
+ { $$ = new TAO_Binary_Constraint(TAO_GT, $1, $3); }
+ | expr_in TAO_GE expr_in
+ { $$ = new TAO_Binary_Constraint(TAO_GE, $1, $3); }
+ | expr_in TAO_LT expr_in
+ { $$ = new TAO_Binary_Constraint(TAO_LT, $1, $3); }
+ | expr_in TAO_LE expr_in
+ { $$ = new TAO_Binary_Constraint(TAO_LE, $1, $3); }
+ | expr_in
+ { $$ = $1; }
+ ;
+
+expr_in: expr_twiddle TAO_IN TAO_IDENT
+ { $$ = new TAO_Binary_Constraint(TAO_IN, $1, $3); }
+ | expr_twiddle
+ { $$ = $1; }
+ ;
+
+expr_twiddle: expr TAO_TWIDDLE expr
+ { $$ = new TAO_Binary_Constraint(TAO_TWIDDLE, $1, $3); }
+ | expr
+ { $$ = $1; }
+ ;
+
+expr: expr TAO_PLUS term
+ { $$ = new TAO_Binary_Constraint(TAO_PLUS, $1, $3); }
+ | expr TAO_MINUS term
+ { $$ = new TAO_Binary_Constraint(TAO_MINUS, $1, $3); }
+ | term
+ { $$ = $1; }
+ ;
+
+term: term TAO_MULT factor_not
+ { $$ = new TAO_Binary_Constraint(TAO_MULT, $1, $3); }
+ | term TAO_DIV factor_not
+ { $$ = new TAO_Binary_Constraint(TAO_DIV, $1, $3); }
+ | factor_not
+ { $$ = $1; }
+ ;
+
+factor_not: TAO_NOT factor
+ { $$ = new TAO_Unary_Constraint(TAO_NOT, $2); }
+ | factor
+ { $$ = $1; }
+ ;
+
+factor: TAO_LPAREN bool_or TAO_RPAREN
+ { $$ = $2; }
+ | TAO_EXIST TAO_IDENT
+ { $$ = new TAO_Unary_Constraint(TAO_EXIST, $2); }
+ | TAO_IDENT
+ { $$ = $1; }
+ | TAO_NUMBER
+ { $$ = $1; }
+ | TAO_MINUS TAO_NUMBER
+ { $$ = new TAO_Unary_Constraint(TAO_UMINUS, $2); }
+ | TAO_STRING
+ { $$ = $1; }
+ | TAO_BOOLEAN
+ { $$ = $1; }
+ ;
+
+%%
+
+TAO_END_VERSIONED_NAMESPACE_DECL
+//extern int yydebug = 1;
diff --git a/TAO/orbsvcs/orbsvcs/Trader/trading_export.h b/TAO/orbsvcs/orbsvcs/Trader/trading_export.h
new file mode 100644
index 00000000000..079cf570be9
--- /dev/null
+++ b/TAO/orbsvcs/orbsvcs/Trader/trading_export.h
@@ -0,0 +1,40 @@
+
+// -*- C++ -*-
+// $Id$
+// Definition for Win32 Export directives.
+// This file is generated automatically by generate_export_file.pl
+// ------------------------------
+#ifndef TAO_TRADING_EXPORT_H
+#define TAO_TRADING_EXPORT_H
+
+#include "ace/config-all.h"
+
+#if defined (TAO_AS_STATIC_LIBS)
+# if !defined (TAO_TRADING_HAS_DLL)
+# define TAO_TRADING_HAS_DLL 0
+# endif /* ! TAO_TRADING_HAS_DLL */
+#else
+# if !defined (TAO_TRADING_HAS_DLL)
+# define TAO_TRADING_HAS_DLL 1
+# endif /* ! TAO_TRADING_HAS_DLL */
+#endif
+
+#if defined (TAO_TRADING_HAS_DLL) && (TAO_TRADING_HAS_DLL == 1)
+# if defined (TAO_TRADING_BUILD_DLL)
+# define TAO_Trading_Export ACE_Proper_Export_Flag
+# define TAO_TRADING_SINGLETON_DECLARATION(T) ACE_EXPORT_SINGLETON_DECLARATION (T)
+# define TAO_TRADING_SINGLETON_DECLARE(SINGLETON_TYPE, CLASS, LOCK) ACE_EXPORT_SINGLETON_DECLARE(SINGLETON_TYPE, CLASS, LOCK)
+# else /* TAO_TRADING_BUILD_DLL */
+# define TAO_Trading_Export ACE_Proper_Import_Flag
+# define TAO_TRADING_SINGLETON_DECLARATION(T) ACE_IMPORT_SINGLETON_DECLARATION (T)
+# define TAO_TRADING_SINGLETON_DECLARE(SINGLETON_TYPE, CLASS, LOCK) ACE_IMPORT_SINGLETON_DECLARE(SINGLETON_TYPE, CLASS, LOCK)
+# endif /* TAO_TRADING_BUILD_DLL */
+#else /* TAO_TRADING_HAS_DLL == 1 */
+# define TAO_Trading_Export
+# define TAO_TRADING_SINGLETON_DECLARATION(T)
+# define TAO_TRADING_SINGLETON_DECLARE(SINGLETON_TYPE, CLASS, LOCK)
+#endif /* TAO_TRADING_HAS_DLL == 1 */
+
+#endif /* TAO_TRADING_EXPORT_H */
+
+// End of auto generated file.
diff --git a/TAO/orbsvcs/orbsvcs/Trader/trading_serv_export.h b/TAO/orbsvcs/orbsvcs/Trader/trading_serv_export.h
new file mode 100644
index 00000000000..187f4ab03cd
--- /dev/null
+++ b/TAO/orbsvcs/orbsvcs/Trader/trading_serv_export.h
@@ -0,0 +1,40 @@
+
+// -*- C++ -*-
+// $Id$
+// Definition for Win32 Export directives.
+// This file is generated automatically by generate_export_file.pl
+// ------------------------------
+#ifndef TAO_TRADING_SERV_EXPORT_H
+#define TAO_TRADING_SERV_EXPORT_H
+
+#include "ace/config-all.h"
+
+#if defined (TAO_AS_STATIC_LIBS)
+# if !defined (TAO_TRADING_SERV_HAS_DLL)
+# define TAO_TRADING_SERV_HAS_DLL 0
+# endif /* ! TAO_TRADING_SERV_HAS_DLL */
+#else
+# if !defined (TAO_TRADING_SERV_HAS_DLL)
+# define TAO_TRADING_SERV_HAS_DLL 1
+# endif /* ! TAO_TRADING_SERV_HAS_DLL */
+#endif
+
+#if defined (TAO_TRADING_SERV_HAS_DLL) && (TAO_TRADING_SERV_HAS_DLL == 1)
+# if defined (TAO_TRADING_SERV_BUILD_DLL)
+# define TAO_Trading_Serv_Export ACE_Proper_Export_Flag
+# define TAO_TRADING_SERV_SINGLETON_DECLARATION(T) ACE_EXPORT_SINGLETON_DECLARATION (T)
+# define TAO_TRADING_SERV_SINGLETON_DECLARE(SINGLETON_TYPE, CLASS, LOCK) ACE_EXPORT_SINGLETON_DECLARE(SINGLETON_TYPE, CLASS, LOCK)
+# else /* TAO_TRADING_SERV_BUILD_DLL */
+# define TAO_Trading_Serv_Export ACE_Proper_Import_Flag
+# define TAO_TRADING_SERV_SINGLETON_DECLARATION(T) ACE_IMPORT_SINGLETON_DECLARATION (T)
+# define TAO_TRADING_SERV_SINGLETON_DECLARE(SINGLETON_TYPE, CLASS, LOCK) ACE_IMPORT_SINGLETON_DECLARE(SINGLETON_TYPE, CLASS, LOCK)
+# endif /* TAO_TRADING_SERV_BUILD_DLL */
+#else /* TAO_TRADING_SERV_HAS_DLL == 1 */
+# define TAO_Trading_Serv_Export
+# define TAO_TRADING_SERV_SINGLETON_DECLARATION(T)
+# define TAO_TRADING_SERV_SINGLETON_DECLARE(SINGLETON_TYPE, CLASS, LOCK)
+#endif /* TAO_TRADING_SERV_HAS_DLL == 1 */
+
+#endif /* TAO_TRADING_SERV_EXPORT_H */
+
+// End of auto generated file.
diff --git a/TAO/orbsvcs/orbsvcs/Trader/trading_skel_export.h b/TAO/orbsvcs/orbsvcs/Trader/trading_skel_export.h
new file mode 100644
index 00000000000..3b0f399cef9
--- /dev/null
+++ b/TAO/orbsvcs/orbsvcs/Trader/trading_skel_export.h
@@ -0,0 +1,40 @@
+
+// -*- C++ -*-
+// $Id$
+// Definition for Win32 Export directives.
+// This file is generated automatically by generate_export_file.pl
+// ------------------------------
+#ifndef TAO_TRADING_SKEL_EXPORT_H
+#define TAO_TRADING_SKEL_EXPORT_H
+
+#include "ace/config-all.h"
+
+#if defined (TAO_AS_STATIC_LIBS)
+# if !defined (TAO_TRADING_SKEL_HAS_DLL)
+# define TAO_TRADING_SKEL_HAS_DLL 0
+# endif /* ! TAO_TRADING_SKEL_HAS_DLL */
+#else
+# if !defined (TAO_TRADING_SKEL_HAS_DLL)
+# define TAO_TRADING_SKEL_HAS_DLL 1
+# endif /* ! TAO_TRADING_SKEL_HAS_DLL */
+#endif
+
+#if defined (TAO_TRADING_SKEL_HAS_DLL) && (TAO_TRADING_SKEL_HAS_DLL == 1)
+# if defined (TAO_TRADING_SKEL_BUILD_DLL)
+# define TAO_Trading_Skel_Export ACE_Proper_Export_Flag
+# define TAO_TRADING_SKEL_SINGLETON_DECLARATION(T) ACE_EXPORT_SINGLETON_DECLARATION (T)
+# define TAO_TRADING_SKEL_SINGLETON_DECLARE(SINGLETON_TYPE, CLASS, LOCK) ACE_EXPORT_SINGLETON_DECLARE(SINGLETON_TYPE, CLASS, LOCK)
+# else /* TAO_TRADING_SKEL_BUILD_DLL */
+# define TAO_Trading_Skel_Export ACE_Proper_Import_Flag
+# define TAO_TRADING_SKEL_SINGLETON_DECLARATION(T) ACE_IMPORT_SINGLETON_DECLARATION (T)
+# define TAO_TRADING_SKEL_SINGLETON_DECLARE(SINGLETON_TYPE, CLASS, LOCK) ACE_IMPORT_SINGLETON_DECLARE(SINGLETON_TYPE, CLASS, LOCK)
+# endif /* TAO_TRADING_SKEL_BUILD_DLL */
+#else /* TAO_TRADING_SKEL_HAS_DLL == 1 */
+# define TAO_Trading_Skel_Export
+# define TAO_TRADING_SKEL_SINGLETON_DECLARATION(T)
+# define TAO_TRADING_SKEL_SINGLETON_DECLARE(SINGLETON_TYPE, CLASS, LOCK)
+#endif /* TAO_TRADING_SKEL_HAS_DLL == 1 */
+
+#endif /* TAO_TRADING_SKEL_EXPORT_H */
+
+// End of auto generated file.
diff --git a/TAO/orbsvcs/orbsvcs/ec_typed_events.mpb b/TAO/orbsvcs/orbsvcs/ec_typed_events.mpb
new file mode 100644
index 00000000000..ffe3eef08e1
--- /dev/null
+++ b/TAO/orbsvcs/orbsvcs/ec_typed_events.mpb
@@ -0,0 +1,21 @@
+// -*- MPC -*-
+// $Id$
+
+feature(ec_typed_events) {
+ macros += TAO_HAS_TYPED_EVENT_CHANNEL
+
+ Source_Files {
+ CosTypedEventCommC.cpp
+ CosTypedEventChannelAdminC.cpp
+ }
+
+ Header_Files {
+ CosTypedEventCommC.h
+ CosTypedEventChannelAdminC.h
+ }
+
+ Inline_Files {
+ CosTypedEventCommC.inl
+ CosTypedEventChannelAdminC.inl
+ }
+}
diff --git a/TAO/orbsvcs/orbsvcs/ec_typed_events_idl.mpb b/TAO/orbsvcs/orbsvcs/ec_typed_events_idl.mpb
new file mode 100644
index 00000000000..a70334dd978
--- /dev/null
+++ b/TAO/orbsvcs/orbsvcs/ec_typed_events_idl.mpb
@@ -0,0 +1,16 @@
+// -*- MPC -*-
+// $Id$
+
+feature(ec_typed_events) {
+ macros += TAO_HAS_TYPED_EVENT_CHANNEL
+
+ idlflags += -Wb,stub_export_macro=TAO_Event_Export -Wb,stub_export_include=orbsvcs/CosEvent/event_export.h -Wb,skel_export_macro=TAO_Event_Skel_Export -Wb,skel_export_include=orbsvcs/CosEvent/event_skel_export.h
+
+ IDL_Files {
+ CosTypedEventComm.idl
+ CosTypedEventChannelAdmin.idl
+ }
+
+ idlflags -= -Wb,stub_export_macro=TAO_Event_Export -Wb,stub_export_include=orbsvcs/CosEvent/event_export.h -Wb,skel_export_macro=TAO_Event_Skel_Export -Wb,skel_export_include=orbsvcs/CosEvent/event_skel_export.h
+
+}
diff --git a/TAO/orbsvcs/orbsvcs/ec_typed_events_serv.mpb b/TAO/orbsvcs/orbsvcs/ec_typed_events_serv.mpb
new file mode 100644
index 00000000000..b57bcab5758
--- /dev/null
+++ b/TAO/orbsvcs/orbsvcs/ec_typed_events_serv.mpb
@@ -0,0 +1,15 @@
+// -*- MPC -*-
+// $Id$
+
+feature(ec_typed_events) : dynamicinterface, ifr_client {
+ macros += TAO_HAS_TYPED_EVENT_CHANNEL
+
+ Source_Files {
+ CosEvent/CEC_TypedEvent.cpp
+ CosEvent/CEC_TypedEventChannel.cpp
+ CosEvent/CEC_TypedProxyPushConsumer.cpp
+ CosEvent/CEC_TypedConsumerAdmin.cpp
+ CosEvent/CEC_TypedSupplierAdmin.cpp
+ CosEvent/CEC_DynamicImplementation.cpp
+ }
+}
diff --git a/TAO/orbsvcs/orbsvcs/ec_typed_events_skel.mpb b/TAO/orbsvcs/orbsvcs/ec_typed_events_skel.mpb
new file mode 100644
index 00000000000..1b0832a570b
--- /dev/null
+++ b/TAO/orbsvcs/orbsvcs/ec_typed_events_skel.mpb
@@ -0,0 +1,32 @@
+// -*- MPC -*-
+// $Id$
+
+feature(ec_typed_events) {
+ macros += TAO_HAS_TYPED_EVENT_CHANNEL
+
+ Source_Files {
+ CosTypedEventCommS.cpp
+ CosTypedEventChannelAdminS.cpp
+ }
+
+ Header_Files {
+ CosTypedEventCommS.h
+ CosTypedEventChannelAdminS.h
+
+ CosTypedEventCommS_T.h
+ CosTypedEventChannelAdminS_T.h
+ }
+
+ Inline_Files {
+ CosTypedEventCommS.inl
+ CosTypedEventChannelAdminS.inl
+
+ CosTypedEventCommS_T.inl
+ CosTypedEventChannelAdminS_T.inl
+ }
+
+ Template_Files {
+ CosTypedEventCommS_T.cpp
+ CosTypedEventChannelAdminS_T.cpp
+ }
+}
diff --git a/TAO/orbsvcs/orbsvcs/miop.idl b/TAO/orbsvcs/orbsvcs/miop.idl
new file mode 100644
index 00000000000..b539dd7154a
--- /dev/null
+++ b/TAO/orbsvcs/orbsvcs/miop.idl
@@ -0,0 +1,55 @@
+//
+// $Id$
+//
+// ================================================================
+//
+// = LIBRARY
+// TAO_PortableGroup
+//
+// = FILENAME
+// miop.pidl
+//
+// = DESCRIPTION
+//
+// This file contains MIOP packet and profile information from
+// the MIOP specification.
+//
+// ================================================================
+
+#ifndef MIOP_IDL
+#define MIOP_IDL
+
+#include "tao/IOP.pidl"
+#include "tao/GIOP.pidl"
+
+#pragma prefix "omg.org"
+
+module MIOP
+{
+ typedef sequence <octet, 252> UniqueId;
+
+ struct PacketHeader_1_0
+ {
+ char magic[4];
+ octet hdr_version;
+ octet flags;
+ unsigned short packet_length;
+ unsigned long packet_number;
+ unsigned long number_of_packets;
+ UniqueId Id;
+ };
+
+ typedef GIOP::Version Version;
+
+ typedef string Address;
+
+ struct UIPMC_ProfileBody
+ {
+ Version miop_version;
+ Address the_address;
+ short the_port;
+ sequence<IOP::TaggedComponent> components;
+ };
+};
+
+#endif
diff --git a/TAO/orbsvcs/orbsvcs/orbsvcs.mwc b/TAO/orbsvcs/orbsvcs/orbsvcs.mwc
new file mode 100644
index 00000000000..01faf104b82
--- /dev/null
+++ b/TAO/orbsvcs/orbsvcs/orbsvcs.mwc
@@ -0,0 +1,6 @@
+// -*- MPC -*-
+// $Id$
+
+workspace {
+}
+
diff --git a/TAO/orbsvcs/orbsvcs/sfp.idl b/TAO/orbsvcs/orbsvcs/sfp.idl
new file mode 100644
index 00000000000..0a8ab39b698
--- /dev/null
+++ b/TAO/orbsvcs/orbsvcs/sfp.idl
@@ -0,0 +1,124 @@
+/* -*- C++ -*- */
+// $Id$
+
+#ifndef TAO_SFP_IDL
+#define TAO_SFP_IDL
+
+#include <ULongSeq.pidl>
+#include <OctetSeq.pidl>
+
+module flowProtocol
+{
+ typedef CORBA::ULongSeq my_seq_ulong;
+ enum MsgType
+ {
+ // The MsgTypes Start and struct Start,StartReply and struct
+ // StartReply conflicts.
+ // Also there are case-only differences for enumerator Credit and struct credit.
+ // We suffix _Msg to all enumerators until the AVStreams RTF fixes these.
+ // Messages in the forward direction
+ // Start,
+ Start_Msg,
+ EndofStream_Msg,
+ SimpleFrame_Msg,
+ SequencedFrame_Msg,
+ Frame_Msg,
+ SpecialFrame_Msg,
+ // Messages in the reverse direction
+ // StartReply,
+ StartReply_Msg,
+ Credit_Msg,
+ // Addition of type for a fragment.
+ Fragment_Msg
+ };
+
+ struct frameHeader
+ {
+ char magic_number[4];
+ // my_seq_char magic_number;
+ // '=', 'S', 'F', 'P'
+ octet flags;
+ // bit 0 = byte order,
+ // 1 = fragments, 2-7 always 0
+ octet message_type;
+ unsigned long message_size;
+ // Size following this header
+ };
+
+ struct fragment
+ {
+ // my_seq_char magic_number;
+ char magic_number[4];
+ // 'F', 'R', 'A', 'G'
+ octet flags;
+ // bit 1 = more fragments, %%bit 0 = byteorder
+ unsigned long frag_number;
+ // 1,..,n
+ unsigned long sequence_num;
+ unsigned long frag_sz;
+ unsigned long source_id;
+ // Required for UDP multicast with multiple sources
+ };
+
+ struct Start
+ {
+ char magic_number[4];
+ // my_seq_char magic_number;
+ // '=', 'S', 'T', 'A'
+ octet major_version;
+ octet minor_version;
+ octet flags;
+ // bit 0 = byte order
+ };
+
+ // Acknowledge successful processing of
+ // Start
+
+ struct StartReply
+ {
+ // my_seq_char magic_number;
+ char magic_number[4];
+ // "=",'S','T','R'
+ octet flags;
+ // bit 0 = byte order, 1 = exception
+ };
+
+ // If the message_type in frameHeader is sequencedFrame
+ // the the frameHeader will be followed by this
+ // (See also RTP note)
+
+ struct sequencedFrame
+ {
+ unsigned long sequence_num;
+ };
+ // If the message_type is Frame then
+ // the frameHeader is followed by this
+ // See also RTP note
+
+ struct frame
+ {
+ unsigned long timestamp;
+ unsigned long synchSource;
+ my_seq_ulong source_ids;
+ unsigned long sequence_num;
+ };
+
+ // XXX:The spec hasn't defined frameID.
+ typedef unsigned long frameID;
+ struct specialFrame
+ {
+ frameID context_id;
+ CORBA::OctetSeq context_data;
+ };
+
+ struct credit
+ {
+ // my_seq_char magic_number;
+ char magic_number[4];
+ // "=",'C','R','E'
+ unsigned long cred_num;
+ };
+
+};
+
+#endif /* TAO_SFP_IDL */
diff --git a/TAO/orbsvcs/orbsvcs/svc_utils_export.h b/TAO/orbsvcs/orbsvcs/svc_utils_export.h
new file mode 100644
index 00000000000..3f004359ae4
--- /dev/null
+++ b/TAO/orbsvcs/orbsvcs/svc_utils_export.h
@@ -0,0 +1,40 @@
+
+// -*- C++ -*-
+// $Id$
+// Definition for Win32 Export directives.
+// This file is generated automatically by generate_export_file.pl
+// ------------------------------
+#ifndef TAO_SVC_UTILS_EXPORT_H
+#define TAO_SVC_UTILS_EXPORT_H
+
+#include "ace/config-all.h"
+
+#if defined (TAO_AS_STATIC_LIBS)
+# if !defined (TAO_SVC_UTILS_HAS_DLL)
+# define TAO_SVC_UTILS_HAS_DLL 0
+# endif /* ! TAO_SVC_UTILS_HAS_DLL */
+#else
+# if !defined (TAO_SVC_UTILS_HAS_DLL)
+# define TAO_SVC_UTILS_HAS_DLL 1
+# endif /* ! TAO_SVC_UTILS_HAS_DLL */
+#endif
+
+#if defined (TAO_SVC_UTILS_HAS_DLL) && (TAO_SVC_UTILS_HAS_DLL == 1)
+# if defined (TAO_SVC_UTILS_BUILD_DLL)
+# define TAO_Svc_Utils_Export ACE_Proper_Export_Flag
+# define TAO_SVC_UTILS_SINGLETON_DECLARATION(T) ACE_EXPORT_SINGLETON_DECLARATION (T)
+# define TAO_SVC_UTILS_SINGLETON_DECLARE(SINGLETON_TYPE, CLASS, LOCK) ACE_EXPORT_SINGLETON_DECLARE(SINGLETON_TYPE, CLASS, LOCK)
+# else /* TAO_SVC_UTILS_BUILD_DLL */
+# define TAO_Svc_Utils_Export ACE_Proper_Import_Flag
+# define TAO_SVC_UTILS_SINGLETON_DECLARATION(T) ACE_IMPORT_SINGLETON_DECLARATION (T)
+# define TAO_SVC_UTILS_SINGLETON_DECLARE(SINGLETON_TYPE, CLASS, LOCK) ACE_IMPORT_SINGLETON_DECLARE(SINGLETON_TYPE, CLASS, LOCK)
+# endif /* TAO_SVC_UTILS_BUILD_DLL */
+#else /* TAO_SVC_UTILS_HAS_DLL == 1 */
+# define TAO_Svc_Utils_Export
+# define TAO_SVC_UTILS_SINGLETON_DECLARATION(T)
+# define TAO_SVC_UTILS_SINGLETON_DECLARE(SINGLETON_TYPE, CLASS, LOCK)
+#endif /* TAO_SVC_UTILS_HAS_DLL == 1 */
+
+#endif /* TAO_SVC_UTILS_EXPORT_H */
+
+// End of auto generated file.